SmartCrawl SEO - Version 2.2.1

Version Description

  • Fix: post list pages performance issue.
Download this release

Release Info

Developer khaxan
Plugin Icon 128x128 SmartCrawl SEO
Version 2.2.1
Comparing to
See all releases

Version 2.2.1

Files changed (199) hide show
  1. changelog.txt +444 -0
  2. config.php +58 -0
  3. includes/admin/admin.php +441 -0
  4. includes/admin/index.php +0 -0
  5. includes/admin/metabox.php +478 -0
  6. includes/admin/settings.php +664 -0
  7. includes/admin/settings/autolinks.php +492 -0
  8. includes/admin/settings/checkup.php +175 -0
  9. includes/admin/settings/dashboard.php +604 -0
  10. includes/admin/settings/index.php +0 -0
  11. includes/admin/settings/onpage.php +660 -0
  12. includes/admin/settings/redirections.php +125 -0
  13. includes/admin/settings/seomoz.php +65 -0
  14. includes/admin/settings/settings.php +492 -0
  15. includes/admin/settings/sitemap.php +472 -0
  16. includes/admin/settings/social.php +203 -0
  17. includes/admin/shared-ui/font/WPMU DEV Dashboard.json +1396 -0
  18. includes/admin/shared-ui/font/WPMU-DEV-App-Icons.eot +0 -0
  19. includes/admin/shared-ui/font/WPMU-DEV-App-Icons.svg +70 -0
  20. includes/admin/shared-ui/font/WPMU-DEV-App-Icons.ttf +0 -0
  21. includes/admin/shared-ui/font/WPMU-DEV-App-Icons.woff +0 -0
  22. includes/admin/shared-ui/font/fontawesome-webfont.eot +0 -0
  23. includes/admin/shared-ui/font/fontawesome-webfont.svg +255 -0
  24. includes/admin/shared-ui/font/fontawesome-webfont.svgz +0 -0
  25. includes/admin/shared-ui/font/fontawesome-webfont.ttf +0 -0
  26. includes/admin/shared-ui/font/fontawesome-webfont.woff +0 -0
  27. includes/admin/shared-ui/img/spin-grey.gif +0 -0
  28. includes/admin/shared-ui/img/spin.gif +0 -0
  29. includes/admin/shared-ui/notice.css +189 -0
  30. includes/admin/shared-ui/notice.js +52 -0
  31. includes/admin/shared-ui/plugin-ui.php +267 -0
  32. includes/admin/shared-ui/wdev-ui.css +2499 -0
  33. includes/admin/shared-ui/wdev-ui.js +1203 -0
  34. includes/admin/taxonomy.php +137 -0
  35. includes/admin/templates/_forms/autolinks.php +10 -0
  36. includes/admin/templates/_forms/import-export.php +4 -0
  37. includes/admin/templates/_forms/redirections.php +2 -0
  38. includes/admin/templates/_forms/settings.php +4 -0
  39. includes/admin/templates/advanced-tools/advanced-section-automatic-linking-settings.php +79 -0
  40. includes/admin/templates/advanced-tools/advanced-section-automatic-linking.php +57 -0
  41. includes/admin/templates/advanced-tools/advanced-section-moz.php +62 -0
  42. includes/admin/templates/advanced-tools/advanced-section-redirects.php +106 -0
  43. includes/admin/templates/advanced-tools/advanced-tools-redirect-item.php +69 -0
  44. includes/admin/templates/advanced-tools/advanced-tools-settings.php +149 -0
  45. includes/admin/templates/advanced-tools/underscore-bulk-update-form.php +37 -0
  46. includes/admin/templates/advanced-tools/underscore-redirect-item.php +13 -0
  47. includes/admin/templates/checkup/checkup-checkup-results.php +82 -0
  48. includes/admin/templates/checkup/checkup-checkup-running.php +16 -0
  49. includes/admin/templates/checkup/checkup-checkup.php +13 -0
  50. includes/admin/templates/checkup/checkup-reporting.php +129 -0
  51. includes/admin/templates/checkup/checkup-settings.php +89 -0
  52. includes/admin/templates/checkup/checkup-top.php +96 -0
  53. includes/admin/templates/dashboard-dialog-has_dashboard-service_seo.php +231 -0
  54. includes/admin/templates/dashboard-dialog-has_dashboard-service_uptime.php +30 -0
  55. includes/admin/templates/dashboard-dialog-not_installed-service_seo.php +22 -0
  56. includes/admin/templates/dashboard-dialog-not_installed-service_uptime.php +11 -0
  57. includes/admin/templates/dashboard-dialog-not_logged_in-service_seo.php +28 -0
  58. includes/admin/templates/dashboard-dialog-seo_service-run.php +49 -0
  59. includes/admin/templates/dashboard-report-issue.php +114 -0
  60. includes/admin/templates/dashboard-settings.php +237 -0
  61. includes/admin/templates/dashboard/dashboard-box-title-url-crawl-stats.php +17 -0
  62. includes/admin/templates/dashboard/dashboard-checkup-progress.php +27 -0
  63. includes/admin/templates/dashboard/dashboard-content-analysis-readability-overview.php +89 -0
  64. includes/admin/templates/dashboard/dashboard-content-analysis-seo-overview.php +83 -0
  65. includes/admin/templates/dashboard/dashboard-mini-checkup-report.php +30 -0
  66. includes/admin/templates/dashboard/dashboard-top.php +85 -0
  67. includes/admin/templates/dashboard/dashboard-url-crawl-in-progress-small.php +2 -0
  68. includes/admin/templates/dashboard/dashboard-url-crawl-in-progress.php +11 -0
  69. includes/admin/templates/dashboard/dashboard-url-crawl-no-data-small.php +5 -0
  70. includes/admin/templates/dashboard/dashboard-url-crawl-stats.php +23 -0
  71. includes/admin/templates/dashboard/dashboard-widget-advanced-tools.php +106 -0
  72. includes/admin/templates/dashboard/dashboard-widget-content-analysis.php +79 -0
  73. includes/admin/templates/dashboard/dashboard-widget-onpage.php +54 -0
  74. includes/admin/templates/dashboard/dashboard-widget-seo-checkup.php +72 -0
  75. includes/admin/templates/dashboard/dashboard-widget-sitemap.php +105 -0
  76. includes/admin/templates/dashboard/dashboard-widget-social.php +105 -0
  77. includes/admin/templates/dashboard/dashboard.php +53 -0
  78. includes/admin/templates/dashboard/onboard-progress.php +7 -0
  79. includes/admin/templates/dashboard/onboarding.php +112 -0
  80. includes/admin/templates/disabled-component-inner.php +36 -0
  81. includes/admin/templates/disabled-component.php +23 -0
  82. includes/admin/templates/dismissable-notice.php +20 -0
  83. includes/admin/templates/index.php +0 -0
  84. includes/admin/templates/links-dropdown.php +17 -0
  85. includes/admin/templates/mascot-message.php +25 -0
  86. includes/admin/templates/media-url-field.php +14 -0
  87. includes/admin/templates/metabox.php +294 -0
  88. includes/admin/templates/metabox/analysis-readability.php +115 -0
  89. includes/admin/templates/metabox/analysis-seo_analysis.php +86 -0
  90. includes/admin/templates/metabox/analysis.php +5 -0
  91. includes/admin/templates/metabox/horizontal-tab-nav.php +16 -0
  92. includes/admin/templates/metabox/horizontal-tab.php +19 -0
  93. includes/admin/templates/metabox/metabox-main.php +88 -0
  94. includes/admin/templates/metabox/metabox-meta-edit-form.php +94 -0
  95. includes/admin/templates/metabox/metabox-preview.php +59 -0
  96. includes/admin/templates/metabox/metabox-seo-analysis-container.php +39 -0
  97. includes/admin/templates/metabox/metabox-social-meta-tags.php +93 -0
  98. includes/admin/templates/metabox/metabox-tab-advanced.php +136 -0
  99. includes/admin/templates/metabox/metabox-tab-readability.php +13 -0
  100. includes/admin/templates/metabox/metabox-tab-seo.php +25 -0
  101. includes/admin/templates/metabox/metabox-tab-social.php +99 -0
  102. includes/admin/templates/notice.php +7 -0
  103. includes/admin/templates/onpage/onpage-marketpress-tabs.php +83 -0
  104. includes/admin/templates/onpage/onpage-meta-robots.php +16 -0
  105. includes/admin/templates/onpage/onpage-og-disabled.php +14 -0
  106. includes/admin/templates/onpage/onpage-og-settings.php +38 -0
  107. includes/admin/templates/onpage/onpage-og-twitter.php +50 -0
  108. includes/admin/templates/onpage/onpage-preview.php +26 -0
  109. includes/admin/templates/onpage/onpage-section-404.php +25 -0
  110. includes/admin/templates/onpage/onpage-section-author-archive.php +40 -0
  111. includes/admin/templates/onpage/onpage-section-buddypress-groups.php +25 -0
  112. includes/admin/templates/onpage/onpage-section-buddypress-profile.php +25 -0
  113. includes/admin/templates/onpage/onpage-section-date-archive.php +40 -0
  114. includes/admin/templates/onpage/onpage-section-homepage.php +91 -0
  115. includes/admin/templates/onpage/onpage-section-post-type.php +41 -0
  116. includes/admin/templates/onpage/onpage-section-search.php +40 -0
  117. includes/admin/templates/onpage/onpage-section-settings.php +35 -0
  118. includes/admin/templates/onpage/onpage-section-taxonomy.php +41 -0
  119. includes/admin/templates/onpage/onpage-settings.php +257 -0
  120. includes/admin/templates/onpage/onpage-social-meta-tags.php +115 -0
  121. includes/admin/templates/onpage/onpage-twitter-disabled.php +14 -0
  122. includes/admin/templates/onpage/onpage-twitter-settings.php +39 -0
  123. includes/admin/templates/progress-bar.php +10 -0
  124. includes/admin/templates/progress-notice.php +26 -0
  125. includes/admin/templates/quick-edit-javascript.php +41 -0
  126. includes/admin/templates/quick-edit-robots.php +38 -0
  127. includes/admin/templates/quick-edit-title.php +12 -0
  128. includes/admin/templates/redirections-settings.php +123 -0
  129. includes/admin/templates/report-vertical-tab.php +81 -0
  130. includes/admin/templates/seomoz-dashboard-widget.php +71 -0
  131. includes/admin/templates/seomoz-settings.php +28 -0
  132. includes/admin/templates/settings-message-top.php +49 -0
  133. includes/admin/templates/settings/settings-custom-meta-tag.php +7 -0
  134. includes/admin/templates/settings/settings-section-general.php +203 -0
  135. includes/admin/templates/settings/settings-section-import-export.php +61 -0
  136. includes/admin/templates/settings/settings-section-user-roles.php +82 -0
  137. includes/admin/templates/settings/settings.php +81 -0
  138. includes/admin/templates/sitemap/sitemap-buddypress-settings.php +53 -0
  139. includes/admin/templates/sitemap/sitemap-crawl-content.php +14 -0
  140. includes/admin/templates/sitemap/sitemap-crawl-issue-generic.php +57 -0
  141. includes/admin/templates/sitemap/sitemap-crawl-issue-ignored.php +24 -0
  142. includes/admin/templates/sitemap/sitemap-crawl-issue-sitemap.php +33 -0
  143. includes/admin/templates/sitemap/sitemap-crawl-issues-3xx.php +18 -0
  144. includes/admin/templates/sitemap/sitemap-crawl-issues-4xx.php +18 -0
  145. includes/admin/templates/sitemap/sitemap-crawl-issues-5xx.php +18 -0
  146. includes/admin/templates/sitemap/sitemap-crawl-issues-generic-controls.php +5 -0
  147. includes/admin/templates/sitemap/sitemap-crawl-issues-group.php +95 -0
  148. includes/admin/templates/sitemap/sitemap-crawl-issues-inaccessible.php +18 -0
  149. includes/admin/templates/sitemap/sitemap-crawl-issues-sitemap-controls.php +8 -0
  150. includes/admin/templates/sitemap/sitemap-crawl-issues-sitemap.php +19 -0
  151. includes/admin/templates/sitemap/sitemap-crawl-results.php +60 -0
  152. includes/admin/templates/sitemap/sitemap-crawl-stats.php +31 -0
  153. includes/admin/templates/sitemap/sitemap-no-crawler-data.php +15 -0
  154. includes/admin/templates/sitemap/sitemap-occurrences-overlay.php +41 -0
  155. includes/admin/templates/sitemap/sitemap-part.php +32 -0
  156. includes/admin/templates/sitemap/sitemap-progress-bar.php +12 -0
  157. includes/admin/templates/sitemap/sitemap-redirect-overlay.php +61 -0
  158. includes/admin/templates/sitemap/sitemap-section-advanced.php +58 -0
  159. includes/admin/templates/sitemap/sitemap-section-reporting.php +100 -0
  160. includes/admin/templates/sitemap/sitemap-section-settings.php +139 -0
  161. includes/admin/templates/sitemap/sitemap-section-url-crawler.php +1 -0
  162. includes/admin/templates/sitemap/sitemap-settings.php +195 -0
  163. includes/admin/templates/sitemaps-dashboard-widget.php +59 -0
  164. includes/admin/templates/social/social-section-accounts.php +163 -0
  165. includes/admin/templates/social/social-section-open-graph.php +14 -0
  166. includes/admin/templates/social/social-section-pinterest-verification.php +40 -0
  167. includes/admin/templates/social/social-section-twitter-cards.php +67 -0
  168. includes/admin/templates/social/social-settings.php +81 -0
  169. includes/admin/templates/social/social-twitter-embed.php +23 -0
  170. includes/admin/templates/taxonomy-form-row.php +24 -0
  171. includes/admin/templates/term-additions-form.php +206 -0
  172. includes/admin/templates/toggle-group.php +65 -0
  173. includes/admin/templates/toggle-item.php +50 -0
  174. includes/admin/templates/underscore-keywords-custom.php +17 -0
  175. includes/admin/templates/underscore-keywords-form.php +31 -0
  176. includes/admin/templates/underscore-keywords-pairs.php +21 -0
  177. includes/admin/templates/underscore-macros-list.php +12 -0
  178. includes/admin/templates/underscore-postlist-exclusion-item.php +9 -0
  179. includes/admin/templates/underscore-postlist-exclusion.php +16 -0
  180. includes/admin/templates/underscore-postlist-selector-list-item.php +20 -0
  181. includes/admin/templates/underscore-postlist-selector-list.php +44 -0
  182. includes/admin/templates/underscore-postlist-selector.php +14 -0
  183. includes/admin/templates/upsell-modal.php +41 -0
  184. includes/admin/templates/url-crawl-master.php +81 -0
  185. includes/admin/templates/urlmetrics-metabox.php +27 -0
  186. includes/admin/templates/user-search.php +54 -0
  187. includes/admin/templates/vertical-tab-section.php +51 -0
  188. includes/admin/templates/vertical-tab.php +71 -0
  189. includes/admin/templates/xsl/index.php +0 -0
  190. includes/admin/templates/xsl/xml-news-sitemap.xsl +140 -0
  191. includes/admin/templates/xsl/xml-sitemap.xsl +218 -0
  192. includes/admin/templates/xsl/xml-video-sitemap.xsl +174 -0
  193. includes/core/checks/class_wds_check_abstract.php +218 -0
  194. includes/core/checks/class_wds_check_content_length.php +66 -0
  195. includes/core/checks/class_wds_check_focus.php +34 -0
  196. includes/core/checks/class_wds_check_focus_stopwords.php +46 -0
  197. includes/core/checks/class_wds_check_imgalts_keywords.php +64 -0
  198. includes/core/checks/class_wds_check_keyword_density.php +76 -0
  199. includes/core/checks/class_wds_check_keywords_used.php +43 -0
changelog.txt ADDED
@@ -0,0 +1,444 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Plugin Name: SmartCrawl SEO
2
+
3
+ Change Log:
4
+ ----------------------------------------------------------------------
5
+ ----------------------------------------------------------------------
6
+
7
+ 2.2.1 - 2018-03-31
8
+ ----------------------------------------------------------------------
9
+ - Fix: post list pages performance issue.
10
+
11
+ 2.2 - 2018-03-28
12
+ ----------------------------------------------------------------------
13
+ - New: Yoast & All-In-One SEO importers.
14
+ - New: 'Refresh' button for content & readability analysis modules.
15
+ - New: ability to set twitter cards details on post and type level.
16
+
17
+ - Fix: compatibility with New Blog Templates plugin.
18
+ - Fix: spelling and grammar issues.
19
+ - Fix: duplicate info text in "No Image Alts" section of seo analysis.
20
+ - Fix: support for Themify themes.
21
+ - Fix: readability analysis summary outputting html tags.
22
+ - Fix: saving draft or publishing posts closes the smartcrawl module.
23
+ - Fix: problems in "Add All to Sitemap" button.
24
+ - Fix: incorrect number of missing url's on main dashboard.
25
+
26
+ 2.1.1 - 2017-02-07
27
+ ----------------------------------------------------------------------
28
+ - New: make Analysis dash widget results numeric and items clickable.
29
+ - New: add OpenGraph and Twitter options for taxonomies.
30
+ - New: exclude full URLs from sitemap.
31
+ - New: grey out deactivated modules in site owner permissions.
32
+ - New: enable styled sitemap on fresh setups.
33
+
34
+ - Fix: increase recommended description length from 160 to 230 chars.
35
+ - Fix: redirection resolution on archive pages.
36
+ - Fix: spelling and grammar issues.
37
+ - Fix: UI and styling issues.
38
+ - Fix: checkup scan tracking auto-update.
39
+ - Fix: update option label copies.
40
+ - Fix: update info links.
41
+ - Fix: admin menu style issues in Firefox.
42
+ - Fix: background color style issues.
43
+ - Fix: conflict with Divi theme.
44
+ - Fix: configuring links destinations when sitewide mode is active.
45
+ - Fix: unifiy analysis status results.
46
+ - Fix: BBPress compatibility issue with generated URLs.
47
+ - Fix: update error strings on import/export issues.
48
+ - Fix: sitemap items listed twice in audit report.
49
+ - Fix: title tag on custom post type archives issue.
50
+ - Fix: conflict with Movedo theme.
51
+ - Fix: do not calculate disabled analysis results.
52
+ - Fix: empty ignore URLs list clears sitemaps.
53
+ - Fix: user name not shown for reporting.
54
+
55
+ 2.1.0.1 - 2017-12-18
56
+ ----------------------------------------------------------------------
57
+ - Fix: Jetpack compatibility issue
58
+
59
+ 2.1 - 2017-12-18
60
+ ----------------------------------------------------------------------
61
+ - Add: complete redesign
62
+ - Add: macros separator support
63
+ - Add: getting started wizard
64
+ - Add: improved OpenGraph controls
65
+ - Add: Twitter cards support
66
+ - Add: schema support
67
+ - Add: Pinterest verification support
68
+ - Add: custom meta elements support
69
+ - Add: linked social accounts support
70
+ - Add: WP Checkup service integration
71
+ - Add: scheduled crawl and checkup support
72
+ - Add: SEO analysis check per post
73
+ - Add: per post readability analysis
74
+ - Add: per post autolinks toggle
75
+ - Add: improved keywords handling with focus keywords
76
+ - Add: ability to import and export settings
77
+ - Add: allow sitemode switching in admin area on network setups
78
+ - Add: attachment page noindex/redirection
79
+
80
+ - Fix: improved previews
81
+ - Fix: OpenGraph compatibility issue with Jetpack
82
+ - Fix: sitemaps issue with alternate cron
83
+ - Fix: additional checks for sitemaps read/write
84
+ - Fix: HHVM compatibility
85
+ - Fix: improve site owner permissions on network setups
86
+
87
+ 2.0.1 - 2017-06-07
88
+ ----------------------------------------------------------------------
89
+ - Add: ability to ignore issues
90
+ - Add: ability to add custom sitemap URLs
91
+ - Add: option to skip strict description check
92
+ - Fix: homepage keywords saving issue
93
+ - Fix: MarketPress coupons conflict
94
+ - Fix: typos
95
+ - Fix: improve admin toolbar item and allow suppression
96
+ - Fix: front-end templating deprecated tags conflict
97
+ - Fix: WooCommerce shop page empty SEO details overrides
98
+
99
+ 2.0 - 2017-02-23
100
+ ----------------------------------------------------------------------
101
+ - New: whole new interface
102
+ - Add: OpenGraph support
103
+ - Add: SEO Audit service support
104
+
105
+ - Fix: deprecated constructors usage
106
+ - Fix: W3TC object cache conflict issue
107
+ - Fix: multiple anonymous post types rendering issue
108
+
109
+ 1.7.6 - 2015-08-25
110
+ ----------------------------------------------------------------------
111
+ - Add advanced robots options info on listing pages.
112
+ - Add redirections info on listing pages.
113
+ - Project name update.
114
+
115
+ 1.7.5 - 2015-08-15
116
+ ----------------------------------------------------------------------
117
+ - Add 301 redirection box permission level to the defaults list.
118
+ - Fix for titles processing in feeds output.
119
+ - Fix and cleanup for post type checks conditionals.
120
+ - Fix for duplicated static front page in sitemaps.
121
+
122
+ 1.7.4 - 2014-12-28
123
+ ----------------------------------------------------------------------
124
+ - Fix duplicates prevention stopping the post autolink expansion.
125
+ - Fix keyword tag detection in autolink expansion replacement.
126
+ - Fix extra whitespaces in autolink replacement expansion.
127
+ - Fix for `set_time_limits` limitations.
128
+
129
+ 1.7.3 - 2014-11-11
130
+ ----------------------------------------------------------------------
131
+ - Fix for some PHP notices.
132
+ - Fix for regex matching points in autolinks detection.
133
+ - Fix for link counts in autolinks matching to prevent clearing results.
134
+ - Fix for maximum single link replacement in post title matching.
135
+
136
+ 1.7.2 - 2014-10-21
137
+ ----------------------------------------------------------------------
138
+ - Fix for boundary matching in an unicode-safe way.
139
+ - Fix for sitemap stylesheet path with SSL enabled.
140
+ - Improved per-site settings mode.
141
+
142
+ 1.7.1 - 2014-07-08
143
+ ----------------------------------------------------------------------
144
+ - Fix for attachment metadata handling.
145
+ - Fix for showing network management level options.
146
+ - Allowing optional partial on-page optimization.
147
+
148
+ 1.7 - 2014-05-22
149
+ ----------------------------------------------------------------------
150
+ - Some typo fixes.
151
+ - Fix for posts with invalid modified dates by forcing timestamps.
152
+ - Added support for global marketplace pages.
153
+
154
+ 1.6.8.1 - 2014-05-10
155
+ ----------------------------------------------------------------------
156
+ - Improving data validation.
157
+ - Fix for BuddyPress pages recognition.
158
+
159
+ 1.6.8 - 2014-02-02
160
+ ----------------------------------------------------------------------
161
+ - Added verification code options.
162
+ - Added experimental features flag.
163
+ - Fix for the settings binding by pushing it up the queue.
164
+
165
+ 1.6.7 - 2013-12-20
166
+ ----------------------------------------------------------------------
167
+ - Exposed the meta description for filtering.
168
+ - Adding in the `nofollow` rel attribute option.
169
+ - Exposing the arguments building for filtering from central location.
170
+ - Exposing the post/term priority filters.
171
+ - Adding separate role settings for 301 redirection box selection.
172
+ - Fix for title length replacement.
173
+ - Fix for default BuddyPress canonicals.
174
+
175
+ 1.6.6 - 2013-08-11
176
+ ----------------------------------------------------------------------
177
+ - Fix for quickedit boxes.
178
+ - Strings update.
179
+
180
+ 1.6.5 - 2013-08-02
181
+ ----------------------------------------------------------------------
182
+ - Converting robots multiple selection box into checbox array.
183
+ - Time-limit skipping switch updated.
184
+
185
+ 1.6.4 - 2013-07-07
186
+ ----------------------------------------------------------------------
187
+ - Postponing the capability checks.
188
+ - Allowing for timeout prevention override.
189
+
190
+ 1.6.3 - 2013-07-06
191
+ ----------------------------------------------------------------------
192
+ - Exposing title for additional filtering.
193
+ - Added blog public sanity check.
194
+ - Counters update.
195
+
196
+ 1.6.2 - 2013-04-14
197
+ ----------------------------------------------------------------------
198
+ - Added subsequent pages robots meta rule.
199
+ - Added meta robots options to search results page.
200
+ - Event delegation update.
201
+ - Fix for SeoMOZ calls bit flags.
202
+
203
+ 1.6.1 - 2013-03-20
204
+ ----------------------------------------------------------------------
205
+ - Fix for metabox access privileges.
206
+ - Better date archives optimization.
207
+
208
+ 1.6 - 2013-02-02
209
+ ----------------------------------------------------------------------
210
+ - Added global meta robots settings for taxonomies.
211
+ - Added conditional unhooking possibility.
212
+ - Allowing per-post sitemap inclusion filtering.
213
+ - Better post types handling.
214
+ - Allowed linking to empty taxonomies.
215
+
216
+ 1.5.4 - 2013-01-13
217
+ ----------------------------------------------------------------------
218
+ - Added custom columns to custom post types list views.
219
+ - Allowing quick edit on custom post types lists.
220
+ - Fix for WooCommerce main shop on-page settings.
221
+
222
+ 1.5.3 - 2013-01-08
223
+ ----------------------------------------------------------------------
224
+ - Fix for BuddyPress installs outside the main site.
225
+ - News keywords support.
226
+
227
+ 1.5.2 - 2012-12-30
228
+ ----------------------------------------------------------------------
229
+ - Fix for autolinks being recognized in shortcodes.
230
+ - Updated the project link.
231
+
232
+ 1.5.1 - 2012-11-02
233
+ ----------------------------------------------------------------------
234
+ - Adding link target options for auto-generated links.
235
+ - Allowed define override for metabox role settings.
236
+ - Propagating autolink fixes by Daniel Speichert (thank you!).
237
+ - Fix for BuddyPress groups page titles.
238
+ - Fix for link in titles insertion issue and safer regex.
239
+
240
+
241
+ 1.5 - 2012-09-08
242
+ ----------------------------------------------------------------------
243
+ - Exposing more hooks.
244
+ - Making admin sitemap auto-update optional.
245
+ - URL differentiation for domain mapped sites.
246
+ - Disabling dashboard widgets for roles below contributor.
247
+
248
+ 1.4.4 - 2012-07-20
249
+ ----------------------------------------------------------------------
250
+ - Fix for special characters in titles.
251
+ - Fix for taxonomies autolinking.
252
+ - Fix for post self-linking.
253
+ - Added maximum autolinks number limit setting.
254
+ - Added quick edit fields.
255
+
256
+ 1.4.3 - 2012-07-08
257
+ ----------------------------------------------------------------------
258
+ - Improved paged output handling.
259
+ - More robust post error handling.
260
+ - Added boolean debug switches.
261
+
262
+ 1.4.2 - 05/26/2012
263
+ ----------------------------------------------------------------------
264
+ - Fix for sitemaps URL resolution on domain-mapped sites
265
+
266
+ 1.4.1 - 05/07/2012
267
+ ----------------------------------------------------------------------
268
+ - Fix for contextual help trigger.
269
+ - Fix for full word auto-linking.
270
+ - Added home page keywords settings.
271
+
272
+ 1.4 - 03/22/2012 Vladislav Bailovic
273
+ ----------------------------------------------------------------------
274
+ - Fix for sitemap path finding.
275
+ - Fix for BuddyPress Groups paging.
276
+ - Improved taxonomies admin output.
277
+ - Improved excerpt generation.
278
+ - Added title and meta rewriting for BuddyPress Groups.
279
+ - Added title and meta rewriting for BuddyPress Profiles.
280
+
281
+ 1.3.7 - 01/20/2012 Vladislav Bailovic
282
+ ----------------------------------------------------------------------
283
+ - Fix for issue with BuddyPress documents plugin.
284
+
285
+ 1.3.6 - 12/22/2011 Vladislav Bailovic
286
+ ----------------------------------------------------------------------
287
+ - Added options for duplicate link prevention.
288
+ - Applied better contextual help trigger.
289
+
290
+ 1.3.5 - 11/29/2011 Vladislav Bailovic
291
+ ----------------------------------------------------------------------
292
+ - Fix for robots meta output interaction with privacy settings.
293
+ - Additional BuddyPress items check.
294
+
295
+ 1.3.4 - 11/24/2011 Vladislav Bailovic
296
+ ----------------------------------------------------------------------
297
+ - Fix for BuddyPress groups support with no groups set up.
298
+ - Added WPML config file.
299
+
300
+ 1.3.3 - 11/17/2011 Vladislav Bailovic
301
+ ----------------------------------------------------------------------
302
+ - Fix for updated SEOMoz links.
303
+ - Fix for BuddyPress groups priority calculation.
304
+
305
+ 1.3.2 - 11/10/2011 Vladislav Bailovic
306
+ ----------------------------------------------------------------------
307
+ - Added BuddyPress groups and profiles in sitemaps.
308
+ - Fixed site validation META headers.
309
+ - Fixed sitemap path finding.
310
+
311
+ 1.3.1 - 11/05/2011 Vladislav Bailovic
312
+ ----------------------------------------------------------------------
313
+ - Fix for sitemap path options.
314
+ - Fix for autolinks issue with titles.
315
+
316
+ 1.3 - 10/25/2011 Vladislav Bailovic
317
+ ----------------------------------------------------------------------
318
+ - Sitemap module rewrite, new sitemap options and dashboard widget.
319
+ - Changed title limit to soft limit.
320
+ - Added priority options for posts.
321
+
322
+ 1.2.1 - 07/16/2011 Vladislav Bailovic
323
+ ----------------------------------------------------------------------
324
+ - Fixed autolink detection for strings that start with an
325
+ non-ascii letter.
326
+
327
+ 1.2 - 07/15/2011 Vladislav Bailovic
328
+ ----------------------------------------------------------------------
329
+ - Added "show tab" option to Network Admin while in sitewide, to apply
330
+ tab permissions once the plugin goes in per-blog mode
331
+ - Added "tags as keywords" checkbox.
332
+ - Keywords as tags working.
333
+ - Fixed issue with SEOmoz dashboard widget not getting the required info.
334
+ - Fixed SEOmoz results caching in transients.
335
+ - Changed sitemap path box to actual input box.
336
+
337
+ 1.1.2 - 06/15/2011 Vladislav Bailovic
338
+ ----------------------------------------------------------------------
339
+ - Fix for issue with apostrophe (and other html special chars)
340
+ in SEO metabox.
341
+
342
+ 1.1.1 - 06/14/2011 Vladislav Bailovic
343
+ ----------------------------------------------------------------------
344
+ - Add htmlemtities and wordpress texturizer alternations for custom
345
+ keywords in Autolinks.
346
+
347
+ 1.1 - 06/13/2011 Vladislav Bailovic
348
+ ----------------------------------------------------------------------
349
+ - Added SEOmoz dashboard widget.
350
+ - Added character couter and limits for SEO metabox.
351
+ - Added meta keywords field to SEO metabox.
352
+ - Fix for WPMU DEV SEO metabox using fixed width.
353
+ - Fix for WDS_SITEWIDE define to toggle per-blog settings availability.
354
+
355
+ 1.0.9.7 - 06/02/2011 Vladislav Bailovic
356
+ ----------------------------------------------------------------------
357
+ - Re-wrote some of the code.
358
+
359
+ 1.0.9.6 - 05/21/2011 Vladislav Bailovic
360
+ ----------------------------------------------------------------------
361
+ - Fixed the the SimplePress incompatibility issue.
362
+
363
+ 1.0.9.5 - 05/15/2011 Vladislav Bailovic
364
+ ----------------------------------------------------------------------
365
+ - Fixed the robots settings display on Page/Post list page.
366
+
367
+ 1.0.9.4 - 05/10/2011 Vladislav Bailovic
368
+ ----------------------------------------------------------------------
369
+ - Normalizing newlines for title rewriting in head buffer.
370
+ - Allowed matching title tags with arguments.
371
+ - Re-introduced `wp_title` filter.
372
+
373
+ 1.0.9.3 - 05/02/2011 Vladislav Bailovic
374
+ ----------------------------------------------------------------------
375
+ - Fixed header detection regular expression.
376
+ - Removed HTML comments.
377
+
378
+ 1.0.9.2 - 05/01/2011 Vladislav Bailovic
379
+ ----------------------------------------------------------------------
380
+ - Added Contributors to both metabox allowed lists.
381
+
382
+ 1.0.9.1 - 04/28/2011 Vladislav Bailovic
383
+ ----------------------------------------------------------------------
384
+ - Fixed title rewriting in feeds
385
+
386
+ 1.0.9 - 04/23/2011 Vladislav Bailovic
387
+ ----------------------------------------------------------------------
388
+ - Forced collapsed state on WDS metaboxes.
389
+ - Deprecated default metabox hiding.
390
+ - Fixed default permission level for showing metaboxes on singular installs.
391
+ - Added WPMU DEV SEO metabox title l10n for Network installs. Singular installs will still see the branding.
392
+
393
+
394
+ 1.0.8 - 04/22/2011 Vladislav Bailovic
395
+ ----------------------------------------------------------------------
396
+ - Fix for relative stylesheet URLs in sitemaps.
397
+ - Fix for generating AND outputing sitemaps, without rebuilding on refresh.
398
+ - Fix for auto-populating settings without admin having to visit the dashboard.
399
+ - Added SEO and SEOmoz metabox toggling options and user displaying permission.
400
+
401
+ 1.0.7 - 04/20/2011 Vladislav Bailovic
402
+ ----------------------------------------------------------------------
403
+ - Fix for title rewriting issues.
404
+
405
+ 1.0.6 - 04/16/2011 Vladislav Bailovic
406
+ ----------------------------------------------------------------------
407
+ - Fix for SEOMoz API data fetching bug (transient data being stuck).
408
+ - Fix for "Error: options page not found" message on multiple options step saves.
409
+ - Updated Title SEO tweak to work with BuddyPress as well.
410
+ - Fix for Sitemaps: using a regex match to determine if the sitemap was requested. Using a relative path to link the XSL stylesheet to it.
411
+ - Added some error checking with is_wp_error
412
+ - Some naming convention consistency fixes for option names.
413
+ - Some PHP fixes.
414
+
415
+ 1.0.5 - 03/25/2011 Aaron Edwards
416
+ ----------------------------------------------------------------------
417
+ - Fixes for PHP 4 incompatibilities
418
+ - Limited posts in sitemap to 1000 most recent to prevent memory errors.
419
+ - Added WDS_SITEMAP_POST_LIMIT define to be able to adjust limit in wp-config
420
+ - Bug fix: Was killing admin help content
421
+
422
+ 1.0.4 - 03/24/2011 Aaron Edwards
423
+ ----------------------------------------------------------------------
424
+ - Fixes to various php errors
425
+ - Increase the time-limit for sitemap creation to work with big blogs
426
+
427
+ 1.0.3 - 03/07/2011
428
+ ----------------------------------------------------------------------
429
+ - Enhancement: store sitemap in wp-content/uploads for main site on
430
+ multisite
431
+
432
+ 1.0.2 - 03/05/2011
433
+ ----------------------------------------------------------------------
434
+ - Bug fix: remove fields added to quick edit which where triggering a
435
+ fatal error
436
+
437
+ 1.0.1 - 03/02/2011
438
+ ----------------------------------------------------------------------
439
+ - Bug fix: sitemap not created on Multisite when blog upload dir doesn't
440
+ exist yet
441
+
442
+ 1.0 - 01/08/2010
443
+ ----------------------------------------------------------------------
444
+ - Initial Release.
config.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin configuration constants
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ // First up, try to inherit define flags named with legacy prefix.
9
+ if ( file_exists( dirname( __FILE__ ) . '/config-pro.php' ) ) {
10
+ require_once( dirname( __FILE__ ) . '/config-pro.php' );
11
+ }
12
+
13
+ /*
14
+ By this time, any legacy defines are re-defined with new prefix.
15
+ We can carry on as if the new defines have been used all along.
16
+ */
17
+
18
+ // you can override this in wp-config.php to enable blog-by-blog settings in multisite.
19
+ if ( ! defined( 'SMARTCRAWL_SITEWIDE' ) ) { define( 'SMARTCRAWL_SITEWIDE', get_site_option( 'wds_sitewide_mode', true ) ); }
20
+
21
+ // you can override this in wp-config.php to enable more posts in the sitemap, but you may need alot of memory.
22
+ if ( ! defined( 'SMARTCRAWL_SITEMAP_POST_LIMIT' ) ) { define( 'SMARTCRAWL_SITEMAP_POST_LIMIT', 1000 ); }
23
+
24
+ // you can override this in wp-config.php to enable more BuddyPress groups in the sitemap, but you may need alot of memory.
25
+ if ( ! defined( 'SMARTCRAWL_BP_GROUPS_LIMIT' ) ) { define( 'SMARTCRAWL_BP_GROUPS_LIMIT', 200 ); }
26
+
27
+ // you can override this in wp-config.php to enable more BuddyPress profiles in the sitemap, but you may need alot of memory.
28
+ if ( ! defined( 'SMARTCRAWL_BP_PROFILES_LIMIT' ) ) { define( 'SMARTCRAWL_BP_PROFILES_LIMIT', 200 ); }
29
+
30
+ // You can override this value in wp-config.php to allow more or less time for caching SEOmoz results.
31
+ if ( ! defined( 'SMARTCRAWL_EXPIRE_TRANSIENT_TIMEOUT' ) ) { define( 'SMARTCRAWL_EXPIRE_TRANSIENT_TIMEOUT', 3600 ); }
32
+
33
+ // You can override this value in wp-config.php to allow for longer or shorter minimum autolink requirement.
34
+ if ( ! defined( 'SMARTCRAWL_AUTOLINKS_DEFAULT_CHAR_LIMIT' ) ) { define( 'SMARTCRAWL_AUTOLINKS_DEFAULT_CHAR_LIMIT', 3 ); }
35
+
36
+ // Suppress redundant canonicals?
37
+ // if ( ! defined( 'SMARTCRAWL_SUPPRESS_REDUNDANT_CANONICAL' ) ) define( 'SMARTCRAWL_SUPPRESS_REDUNDANT_CANONICAL', false );
38
+ // Char counting defines.
39
+ if ( ! defined( 'SMARTCRAWL_TITLE_LENGTH_CHAR_COUNT_LIMIT' ) ) { define( 'SMARTCRAWL_TITLE_LENGTH_CHAR_COUNT_LIMIT', 70 ); }
40
+ if ( ! defined( 'SMARTCRAWL_METADESC_LENGTH_CHAR_COUNT_LIMIT' ) ) { define( 'SMARTCRAWL_METADESC_LENGTH_CHAR_COUNT_LIMIT', 230 ); }
41
+
42
+ // Debugging defines.
43
+ if ( ! defined( 'SMARTCRAWL_SITEMAP_SKIP_IMAGES' ) ) { define( 'SMARTCRAWL_SITEMAP_SKIP_IMAGES', false ); }
44
+ if ( ! defined( 'SMARTCRAWL_SITEMAP_SKIP_TAXONOMIES' ) ) { define( 'SMARTCRAWL_SITEMAP_SKIP_TAXONOMIES', false ); }
45
+ if ( ! defined( 'SMARTCRAWL_SITEMAP_SKIP_SE_NOTIFICATION' ) ) { define( 'SMARTCRAWL_SITEMAP_SKIP_SE_NOTIFICATION', false ); }
46
+ if ( ! defined( 'SMARTCRAWL_SITEMAP_SKIP_ADMIN_UPDATE' ) ) { define( 'SMARTCRAWL_SITEMAP_SKIP_ADMIN_UPDATE', false ); }
47
+
48
+ if ( ! defined( 'SMARTCRAWL_EXPERIMENTAL_FEATURES_ON' ) ) { define( 'SMARTCRAWL_EXPERIMENTAL_FEATURES_ON', false ); }
49
+ if ( ! defined( 'SMARTCRAWL_ENABLE_LOGGING' ) ) { define( 'SMARTCRAWL_ENABLE_LOGGING', false ); }
50
+
51
+ if ( ! defined( 'SMARTCRAWL_WHITELABEL_ON' ) ) { define( 'SMARTCRAWL_WHITELABEL_ON', false ); }
52
+ if ( ! defined( 'SMARTCRAWL_OMIT_PORT_MATCHES' ) ) { define( 'SMARTCRAWL_OMIT_PORT_MATCHES', false ); }
53
+
54
+ /**
55
+ * Setup plugin path and url.
56
+ */
57
+ define( 'SMARTCRAWL_PLUGIN_DIR', plugin_dir_path( __FILE__ ) . 'includes/' );
58
+ define( 'SMARTCRAWL_PLUGIN_URL', plugin_dir_url( __FILE__ ) . 'includes/' );
includes/admin/admin.php ADDED
@@ -0,0 +1,441 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin side handling
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ /**
9
+ * Admin handling root class
10
+ */
11
+ class Smartcrawl_Admin extends Smartcrawl_Renderable {
12
+
13
+ /**
14
+ * Admin page handlers
15
+ *
16
+ * @var array
17
+ */
18
+ private $_handlers = array();
19
+
20
+ /**
21
+ * Constructor
22
+ */
23
+ public function __construct() {
24
+ $this->init();
25
+ }
26
+
27
+ /**
28
+ * Initializing method
29
+ */
30
+ private function init() {
31
+ // Set up dash.
32
+ if ( file_exists( SMARTCRAWL_PLUGIN_DIR . 'external/dash/wpmudev-dash-notification.php' ) ) {
33
+ global $wpmudev_notices;
34
+ if ( ! is_array( $wpmudev_notices ) ) { $wpmudev_notices = array(); }
35
+ $wpmudev_notices[] = array(
36
+ 'id' => 167,
37
+ 'name' => 'SmartCrawl',
38
+ 'screens' => array(
39
+ 'toplevel_page_wds_wizard-network',
40
+ 'toplevel_page_wds_wizard',
41
+ 'smartcrawl_page_wds_onpage-network',
42
+ 'smartcrawl_page_wds_onpage',
43
+ 'smartcrawl_page_wds_sitemap-network',
44
+ 'smartcrawl_page_wds_sitemap',
45
+ 'smartcrawl_page_wds_settings-network',
46
+ 'smartcrawl_page_wds_settings',
47
+ 'smartcrawl_page_wds_autolinks-network',
48
+ 'smartcrawl_page_wds_autolinks',
49
+ 'smartcrawl_page_wds_social-network',
50
+ 'smartcrawl_page_wds_social',
51
+ ),
52
+ );
53
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'external/dash/wpmudev-dash-notification.php' );
54
+ }
55
+
56
+ add_action( 'admin_init', array( $this, 'register_setting' ) );
57
+ add_action( 'admin_init', array( $this, 'admin_master_reset' ) );
58
+ add_filter( 'whitelist_options', array( $this, 'save_options' ), 20 );
59
+
60
+ add_action( 'wp_ajax_wds_dismiss_message', array( $this, 'smartcrawl_dismiss_message' ) );
61
+ add_action( 'wp_ajax_wds-user-search', array( $this, 'json_user_search' ) );
62
+ add_action( 'wp_ajax_wds-user-search-add-user', array( $this, 'json_user_search_add_user' ) );
63
+
64
+ if ( Smartcrawl_Settings::get_setting( 'extras-admin_bar' ) ) {
65
+ add_action( 'admin_bar_menu', array( $this, 'add_toolbar_items' ), 99 );
66
+ }
67
+
68
+ add_filter( 'plugin_action_links_' . SMARTCRAWL_PLUGIN_BASENAME, array( $this, 'add_settings_link' ) );
69
+
70
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'admin/settings.php' );
71
+ require_once SMARTCRAWL_PLUGIN_DIR . 'core/class_wds_service.php';
72
+
73
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
74
+
75
+ // Sanity check first!
76
+ if ( ! get_option( 'blog_public' ) ) {
77
+ add_action( 'admin_notices', array( $this, 'blog_not_public_notice' ) );
78
+ }
79
+
80
+ if ( ! empty( $smartcrawl_options['access-id'] ) && ! empty( $smartcrawl_options['secret-key'] ) ) {
81
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'tools/seomoz/api.php' );
82
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'tools/seomoz/results.php' );
83
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'tools/seomoz/dashboard-widget.php' );
84
+ }
85
+
86
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'admin/settings/dashboard.php' );
87
+ $this->_handlers['dashboard'] = Smartcrawl_Settings_Dashboard::get_instance();
88
+
89
+ if ( Smartcrawl_Settings::get_setting( 'checkup' ) ) {
90
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'admin/settings/checkup.php' );
91
+ $this->_handlers['checkup'] = Smartcrawl_Checkup_Settings::get_instance();
92
+ }
93
+
94
+ if ( Smartcrawl_Settings::get_setting( 'onpage' ) ) {
95
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'admin/settings/onpage.php' );
96
+ $this->_handlers['onpage'] = Smartcrawl_Onpage_Settings::get_instance();
97
+ }
98
+
99
+ if ( Smartcrawl_Settings::get_setting( 'social' ) ) {
100
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'admin/settings/social.php' );
101
+ $this->_handlers['social'] = Smartcrawl_Social_Settings::get_instance();
102
+ }
103
+
104
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'tools/sitemaps.php' );
105
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'admin/settings/sitemap.php' );
106
+ $this->_handlers['sitemap'] = Smartcrawl_Sitemap_Settings::get_instance();
107
+ if ( Smartcrawl_Settings::get_setting( 'sitemap' ) ) {
108
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'tools/sitemaps-dashboard-widget.php' );
109
+ }
110
+
111
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'admin/settings/autolinks.php' );
112
+ $this->_handlers['autolinks'] = Smartcrawl_Autolinks_Settings::get_instance();
113
+
114
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'admin/settings/settings.php' );
115
+ $this->_handlers['settings'] = Smartcrawl_Settings_Settings::get_instance();
116
+
117
+ if (
118
+ ! class_exists( 'Smartcrawl_Controller_Onboard' ) &&
119
+ file_exists( SMARTCRAWL_PLUGIN_DIR . '/core/class_wds_controller_onboard.php' )
120
+ ) {
121
+ require_once( SMARTCRAWL_PLUGIN_DIR . '/core/class_wds_controller_onboard.php' );
122
+ Smartcrawl_Controller_Onboard::serve();
123
+ }
124
+
125
+ if (
126
+ ! class_exists( 'Smartcrawl_Controller_Analysis' ) &&
127
+ file_exists( SMARTCRAWL_PLUGIN_DIR . '/core/class_wds_controller_analysis.php' )
128
+ ) {
129
+ require_once( SMARTCRAWL_PLUGIN_DIR . '/core/class_wds_controller_analysis.php' );
130
+ Smartcrawl_Controller_Analysis::serve();
131
+ }
132
+
133
+ if ( Smartcrawl_Settings::get_setting( 'onpage' ) ) {
134
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'admin/metabox.php' );
135
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'admin/taxonomy.php' );
136
+ }
137
+ }
138
+
139
+ /**
140
+ * Adds settings plugin action link
141
+ *
142
+ * @param array $links Action links list.
143
+ *
144
+ * @return array Augmented action links
145
+ */
146
+ public function add_settings_link( $links ) {
147
+ if ( ! is_array( $links ) ) { return $links; }
148
+
149
+ $links[] = sprintf(
150
+ '<a href="%s">%s</a>',
151
+ esc_url( add_query_arg( 'page', Smartcrawl_Settings::TAB_DASHBOARD, admin_url( 'admin.php' ) ) ),
152
+ esc_html( __( 'Settings', 'wds' ) )
153
+ );
154
+
155
+ return $links;
156
+ }
157
+
158
+ /**
159
+ * Saves the submitted options
160
+ *
161
+ * @param mixed $whitelist_options Options.
162
+ *
163
+ * @return array
164
+ */
165
+ public function save_options( $whitelist_options ) {
166
+ global $action;
167
+
168
+ $smartcrawl_pages = array(
169
+ 'wds_settings_options',
170
+ 'wds_autolinks_options',
171
+ 'wds_onpage_options',
172
+ 'wds_sitemap_options',
173
+ 'wds_seomoz_options',
174
+ 'wds_social_options',
175
+ 'wds_redirections_options',
176
+ 'wds_checkup_options',
177
+ );
178
+ if ( is_multisite() && SMARTCRAWL_SITEWIDE == true && 'update' == $action && isset( $_POST['option_page'] ) && in_array( $_POST['option_page'], $smartcrawl_pages ) ) {
179
+ global $option_page;
180
+
181
+ check_admin_referer( $option_page . '-options' );
182
+
183
+ if ( ! isset( $whitelist_options[ $option_page ] ) ) {
184
+ wp_die( __( 'Error: options page not found.' , 'wds' ) );
185
+ }
186
+
187
+ $options = $whitelist_options[ $option_page ];
188
+
189
+ if ( $options && is_array( $options ) ) {
190
+ foreach ( $options as $option ) {
191
+ $option = trim( $option );
192
+ $value = null;
193
+ if ( isset( $_POST[ $option ] ) ) {
194
+ $value = $_POST[ $option ];
195
+ }
196
+ if ( ! is_array( $value ) ) {
197
+ $value = trim( $value );
198
+ }
199
+ $value = stripslashes_deep( $value );
200
+
201
+ // Sanitized/validated via sanitize_option_<option_page>.
202
+ // See each of the admin classes validate method.
203
+ update_site_option( $option, $value );
204
+ }
205
+ }
206
+
207
+ $errors = get_settings_errors();
208
+ set_transient( 'wds-settings-save-errors' , $errors, 30 );
209
+
210
+ $goback = add_query_arg( 'updated', 'true', wp_get_referer() );
211
+ wp_safe_redirect( $goback );
212
+ die;
213
+ }
214
+
215
+ return $whitelist_options;
216
+ }
217
+
218
+ /**
219
+ * Admin page handler getter
220
+ *
221
+ * @param string $hndl Handler to get.
222
+ *
223
+ * @return object Handler
224
+ */
225
+ public function get_handler( $hndl ) {
226
+ return isset( $this->_handlers[ $hndl ] )
227
+ ? $this->_handlers[ $hndl ]
228
+ : $this
229
+ ;
230
+ }
231
+
232
+ /**
233
+ * Admin reset options switch processing
234
+ *
235
+ * @return bool|void
236
+ */
237
+ public function admin_master_reset() {
238
+ if ( is_multisite() && ! current_user_can( 'manage_network_options' ) ) { return false; }
239
+ if ( ! is_multisite() && ! current_user_can( 'manage_options' ) ) { return false; }
240
+
241
+ if ( isset( $_GET['wds-reset'] ) ) { // Simple presence switch, no value needed.
242
+ require_once( SMARTCRAWL_PLUGIN_DIR . '/core/class_wds_reset.php' );
243
+ Smartcrawl_Reset::reset();
244
+ wp_safe_redirect( add_query_arg( 'wds-reset-reload', 'true', remove_query_arg( 'wds-reset' ) ) );
245
+ die;
246
+ }
247
+
248
+ if ( isset( $_GET['wds-reset-reload'] ) ) { // Simple presence switch, no value needed.
249
+ wp_safe_redirect( remove_query_arg( 'wds-reset-reload' ) );
250
+ die;
251
+ }
252
+
253
+ return false;
254
+ }
255
+
256
+ /**
257
+ * Brute-register all the settings.
258
+ *
259
+ * If we got this far, this is a sane thing to do.
260
+ * This overrides the `Smartcrawl_Core_Admin::register_setting()`.
261
+ *
262
+ * In response to "Unable to save options multiple times" bug.
263
+ */
264
+ public function register_setting() {
265
+ register_setting( 'wds_settings_options', 'wds_settings_options', array( $this->get_handler( 'settings' ), 'validate' ) );
266
+ register_setting( 'wds_sitemap_options', 'wds_sitemap_options', array( $this->get_handler( 'sitemap' ), 'validate' ) );
267
+ register_setting( 'wds_onpage_options', 'wds_onpage_options', array( $this->get_handler( 'onpage' ), 'validate' ) );
268
+ register_setting( 'wds_social_options', 'wds_social_options', array( $this->get_handler( 'social' ), 'validate' ) );
269
+ register_setting( 'wds_autolinks_options', 'wds_autolinks_options', array( $this->get_handler( 'autolinks' ), 'validate' ) );
270
+ register_setting( 'wds_redirections_options', 'wds_redirections_options', array( $this->get_handler( 'redirections' ), 'validate' ) );
271
+ register_setting( 'wds_checkup_options', 'wds_checkup_options', array( $this->get_handler( 'checkup' ), 'validate' ) );
272
+ }
273
+
274
+ /**
275
+ * Adds admin toolbar items
276
+ *
277
+ * @param object $bar Admin toolbar object.
278
+ */
279
+ public function add_toolbar_items( $bar ) {
280
+ if ( empty( $bar ) || ! function_exists( 'is_admin_bar_showing' ) ) { return false; }
281
+ if ( ! is_admin_bar_showing() ) { return false; }
282
+
283
+ if ( ! apply_filters( 'wds-admin-ui-show_bar', true ) ) { return false; }
284
+
285
+ // Do not show if sitewide and we're not super admin.
286
+ if ( defined( 'SMARTCRAWL_SITEWIDE' ) && SMARTCRAWL_SITEWIDE && ! is_super_admin() ) { return false; }
287
+
288
+ $root = array(
289
+ 'id' => 'wds-root',
290
+ 'title' => __( 'SmartCrawl', 'wds' ),
291
+ );
292
+ $bar->add_node( $root );
293
+ foreach ( $this->_handlers as $handler ) {
294
+ if ( empty( $handler ) || empty( $handler->slug ) ) { continue; }
295
+
296
+ if ( ! (defined( 'SMARTCRAWL_SITEWIDE' ) && SMARTCRAWL_SITEWIDE) && ! is_super_admin() ) {
297
+ if ( ! Smartcrawl_Settings_Admin::is_tab_allowed( $handler->slug ) ) { continue; }
298
+ }
299
+
300
+ $href = (
301
+ defined( 'SMARTCRAWL_SITEWIDE' ) && SMARTCRAWL_SITEWIDE ? network_admin_url( 'admin.php' ) : admin_url( 'admin.php' )
302
+ ) . '?page=' . $handler->slug;
303
+ $bar->add_node(array(
304
+ 'id' => $root['id'] . '.' . $handler->slug,
305
+ 'parent' => $root['id'],
306
+ 'title' => $handler->title,
307
+ 'href' => $href,
308
+ ));
309
+ }
310
+ }
311
+
312
+ /**
313
+ * Validate user data for some/all of your input fields
314
+ *
315
+ * @param mixed $input Raw input.
316
+ */
317
+ public function validate( $input ) {
318
+ return $input; // return validated input.
319
+ }
320
+
321
+ /**
322
+ * Shows blog not being public notice.
323
+ */
324
+ public function blog_not_public_notice() {
325
+ if ( ! current_user_can( 'manage_options' ) ) { return false; }
326
+
327
+ echo '<div class="notice-error notice is-dismissible"><p>' .
328
+ sprintf( __( 'This site discourages search engines from indexing the pages, which will affect your SEO efforts. <a href="%s">You can fix this here</a>', 'wds' ), admin_url( '/options-reading.php' ) ) .
329
+ '</p></div>';
330
+
331
+ }
332
+
333
+ /**
334
+ * Process message dismissal request
335
+ */
336
+ public function smartcrawl_dismiss_message() {
337
+ $message = sanitize_key( smartcrawl_get_array_value( $_POST, 'message' ) );
338
+ if ( null === $message ) {
339
+ wp_send_json_error();
340
+ return;
341
+ }
342
+
343
+ $dismissed_messages = get_user_meta( get_current_user_id(), 'wds_dismissed_messages', true );
344
+ $dismissed_messages = '' === $dismissed_messages ? array() : $dismissed_messages;
345
+ $dismissed_messages[ $message ] = true;
346
+ update_user_meta( get_current_user_id(), 'wds_dismissed_messages', $dismissed_messages );
347
+ }
348
+
349
+ /**
350
+ * Process user search requests
351
+ */
352
+ public function json_user_search() {
353
+ $result = array( 'success' => false );
354
+ if ( ! current_user_can( 'edit_users' ) ) {
355
+ wp_send_json( $result );
356
+ die;
357
+ }
358
+
359
+ $params = stripslashes_deep( $_GET );
360
+ $query = sanitize_text_field( smartcrawl_get_array_value( $params, 'query' ) );
361
+
362
+ if ( ! $query ) {
363
+ wp_send_json( $result );
364
+ die();
365
+ }
366
+
367
+ $users = get_users(array(
368
+ 'search' => '*' . $params['query'] . '*',
369
+ 'fields' => 'all_with_meta',
370
+ ));
371
+
372
+ $return_users = array();
373
+ foreach ( $users as $user ) {
374
+ $return_users[] = array(
375
+ 'id' => $user->get( 'ID' ),
376
+ 'text' => $user->get( 'display_name' ),
377
+ );
378
+ }
379
+ $result['items'] = $return_users;
380
+
381
+ wp_send_json( $result );
382
+ }
383
+
384
+ /**
385
+ * Handles user search requests
386
+ */
387
+ public function json_user_search_add_user() {
388
+ $result = array( 'success' => false );
389
+ if ( ! current_user_can( 'edit_users' ) ) {
390
+ wp_send_json( $result );
391
+ die;
392
+ }
393
+
394
+ $params = stripslashes_deep( $_POST );
395
+
396
+ $option_name = sanitize_key( smartcrawl_get_array_value( $params, 'option_name' ) );
397
+ $users_key = sanitize_key( smartcrawl_get_array_value( $params, 'users_key' ) );
398
+ $new_user_key = sanitize_key( smartcrawl_get_array_value( $params, 'new_user_key' ) );
399
+
400
+ $user_search_options = smartcrawl_get_array_value( $params, $option_name );
401
+ $email_recipients = smartcrawl_get_array_value( $user_search_options, $users_key );
402
+ $new_user = sanitize_text_field( smartcrawl_get_array_value( $user_search_options, $new_user_key ) );
403
+
404
+ if ( null === $new_user ) {
405
+ wp_send_json( $result );
406
+ return;
407
+ }
408
+
409
+ if ( ! is_array( $email_recipients ) ) {
410
+ $email_recipients = array();
411
+ } else {
412
+ $email_recipients = array_filter( array_map( 'sanitize_text_field', $email_recipients ) );
413
+ }
414
+
415
+ if ( ! in_array( $new_user, $email_recipients ) ) {
416
+ $email_recipients[] = $new_user;
417
+ }
418
+
419
+ $new_markup = $this->_load('user-search', array(
420
+ 'users' => $email_recipients,
421
+ 'option_name' => $option_name,
422
+ 'users_key' => $users_key,
423
+ 'new_user_key' => $new_user_key,
424
+ ));
425
+
426
+ $result['user_search'] = $new_markup;
427
+ $result['success'] = true;
428
+
429
+ wp_send_json( $result );
430
+ }
431
+
432
+ /**
433
+ * Gets inherited view defaults
434
+ */
435
+ protected function _get_view_defaults() {
436
+ return array();
437
+ }
438
+ }
439
+
440
+ $Smartcrawl_Admin = new Smartcrawl_Admin();
441
+
includes/admin/index.php ADDED
File without changes
includes/admin/metabox.php ADDED
@@ -0,0 +1,478 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Metabox main class
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ if ( ! class_exists( 'Smartcrawl_Renderable' ) ) { require_once( SMARTCRAWL_PLUGIN_DIR . '/core/class_wds_renderable.php' ); }
9
+
10
+ /**
11
+ * Metabox rendering / handling class
12
+ */
13
+ class Smartcrawl_Metabox extends Smartcrawl_Renderable {
14
+
15
+ /**
16
+ * Constructor
17
+ */
18
+ public function __construct() {
19
+ // WPSC integration.
20
+ add_action( 'wpsc_edit_product', array( $this, 'rebuild_sitemap' ) );
21
+ add_action( 'wpsc_rate_product', array( $this, 'rebuild_sitemap' ) );
22
+
23
+ add_action( 'admin_menu', array( $this, 'smartcrawl_create_meta_box' ) );
24
+
25
+ add_action( 'save_post', array( $this, 'smartcrawl_save_postdata' ) );
26
+ add_filter( 'attachment_fields_to_save', array( $this, 'smartcrawl_save_attachment_postdata' ) );
27
+
28
+ add_filter( 'manage_pages_columns', array( $this, 'smartcrawl_page_title_column_heading' ), 10, 1 );
29
+ add_filter( 'manage_posts_columns', array( $this, 'smartcrawl_page_title_column_heading' ), 10, 1 );
30
+
31
+ add_action( 'manage_pages_custom_column', array( $this, 'smartcrawl_page_title_column_content' ), 10, 2 );
32
+ add_action( 'manage_posts_custom_column', array( $this, 'smartcrawl_page_title_column_content' ), 10, 2 );
33
+
34
+ add_action( 'quick_edit_custom_box', array( $this, 'smartcrawl_quick_edit_dispatch' ), 10, 2 );
35
+ add_action( 'admin_footer-edit.php', array( $this, 'smartcrawl_quick_edit_javascript' ) );
36
+ add_action( 'wp_ajax_wds_get_meta_fields', array( $this, 'json_wds_postmeta' ) );
37
+ add_action( 'wp_ajax_wds_metabox_update', array( $this, 'smartcrawl_metabox_live_update' ) );
38
+
39
+ add_action( 'admin_print_scripts-post.php', array( $this, 'js_load_scripts' ) );
40
+ add_action( 'admin_print_scripts-post-new.php', array( $this, 'js_load_scripts' ) );
41
+ add_action( 'wp_ajax_wds-metabox-preview', array( $this, 'json_create_preview' ) );
42
+ }
43
+
44
+ /**
45
+ * Handles preview asking requests
46
+ */
47
+ public function json_create_preview() {
48
+ $data = stripslashes_deep( $_POST );
49
+ $title = sanitize_text_field( smartcrawl_get_array_value( $data, 'title' ) );
50
+ $description = sanitize_text_field( smartcrawl_get_array_value( $data, 'description' ) );
51
+ $post_id = (int) smartcrawl_get_array_value( $data, 'post_id' );
52
+ $result = array( 'success' => false );
53
+
54
+ if ( is_null( $title ) || is_null( $description ) || empty( $post_id ) ) {
55
+ wp_send_json( $result );
56
+ return;
57
+ }
58
+
59
+ $result['success'] = true;
60
+ $result['markup'] = $this->_load('metabox/metabox-preview', array(
61
+ 'post' => get_post( $post_id ),
62
+ 'title' => $title,
63
+ 'description' => $description,
64
+ ));
65
+
66
+ wp_send_json( $result );
67
+ }
68
+
69
+ /**
70
+ * Enqueues frontend dependencies
71
+ */
72
+ public function js_load_scripts() {
73
+ $options = Smartcrawl_Settings::get_options();
74
+ $version = Smartcrawl_Loader::get_version();
75
+
76
+ wp_enqueue_script( 'wds_metabox_counter', SMARTCRAWL_PLUGIN_URL . '/js/wds-metabox-counter.js', array(), $version );
77
+ wp_localize_script('wds_metabox_counter', 'l10nWdsCounters', array(
78
+ 'title_length' => __( '{TOTAL_LEFT} characters left', 'wds' ),
79
+ 'title_longer' => __( 'Over {MAX_COUNT} characters ({CURRENT_COUNT})', 'wds' ),
80
+ 'main_title_longer' => __( 'Over {MAX_COUNT} characters ({CURRENT_COUNT}) - make sure your SEO title is shorter', 'wds' ),
81
+
82
+ 'title_limit' => SMARTCRAWL_TITLE_LENGTH_CHAR_COUNT_LIMIT,
83
+ 'metad_limit' => SMARTCRAWL_METADESC_LENGTH_CHAR_COUNT_LIMIT,
84
+ 'main_title_warning' => ! (defined( 'SMARTCRAWL_MAIN_TITLE_LENGTH_WARNING_HIDE' ) && SMARTCRAWL_MAIN_TITLE_LENGTH_WARNING_HIDE),
85
+ 'lax_enforcement' => (isset( $options['metabox-lax_enforcement'] ) ? ! ! $options['metabox-lax_enforcement'] : false),
86
+ ));
87
+ Smartcrawl_Settings_Admin::register_global_admin_scripts();
88
+ wp_enqueue_script( 'wds_metabox_onpage', SMARTCRAWL_PLUGIN_URL . '/js/wds-metabox.js', array( 'wds-select2' ), $version );
89
+ wp_localize_script('wds_metabox_onpage', 'l10nWdsMetabox', array(
90
+ 'content_analysis_working' => __('Analyzing content, please wait a few moments', 'wds'),
91
+ ));
92
+
93
+ Smartcrawl_Settings_Admin::enqueue_shared_ui( false );
94
+
95
+ wp_enqueue_script( 'wds-admin-opengraph' );
96
+ wp_enqueue_style( 'wds-admin-opengraph' );
97
+ wp_enqueue_style( 'wds-select2' );
98
+ wp_enqueue_style( 'wds-app' );
99
+ }
100
+
101
+ /**
102
+ * Handles page body class
103
+ *
104
+ * @param string $string Body classes this far.
105
+ *
106
+ * @return string
107
+ */
108
+ public function admin_body_class( $string ) {
109
+ return str_replace( 'wpmud', '', $string );
110
+ }
111
+
112
+ /**
113
+ * Handles actual metabox rendering
114
+ */
115
+ public function smartcrawl_meta_boxes() {
116
+ global $post;
117
+
118
+ $robots_noindex_value = (int) smartcrawl_get_value( 'meta-robots-noindex' );
119
+ $robots_nofollow_value = (int) smartcrawl_get_value( 'meta-robots-nofollow' );
120
+ $advanced_value = explode( ',', smartcrawl_get_value( 'meta-robots-adv' ) );
121
+ $advanced_options = array(
122
+ 'noodp' => __( 'NO ODP (Block Open Directory Project description of the page)', 'wds' ),
123
+ 'noydir' => __( 'NO YDIR (Don\'t display the Yahoo! Directory titles and abstracts)', 'wds' ),
124
+ 'noarchive' => __( 'No Archive', 'wds' ),
125
+ 'nosnippet' => __( 'No Snippet', 'wds' ),
126
+ );
127
+ $sitemap_priority_options = array(
128
+ '' => __( 'Automatic prioritization', 'wds' ),
129
+ '1' => __( '1 - Highest priority', 'wds' ),
130
+ '0.9' => '0.9',
131
+ '0.8' => '0.8 - ' . __( 'High priority (root pages default)', 'wds' ),
132
+ '0.7' => '0.7',
133
+ '0.6' => '0.6 - ' . __( 'Secondary priority (subpages default)', 'wds' ),
134
+ '0.5' => '0.5 - ' . __( 'Medium priority', 'wds' ),
135
+ '0.4' => '0.4',
136
+ '0.3' => '0.3',
137
+ '0.2' => '0.2',
138
+ '0.1' => '0.1 - ' . __( 'Lowest priority', 'wds' ),
139
+ );
140
+
141
+ $this->_render('metabox/metabox-main', array(
142
+ 'post' => $post,
143
+ 'robots_noindex_value' => $robots_noindex_value,
144
+ 'robots_nofollow_value' => $robots_nofollow_value,
145
+ 'advanced_value' => $advanced_value,
146
+ 'advanced_options' => $advanced_options,
147
+ 'sitemap_priority_options' => $sitemap_priority_options,
148
+ ));
149
+ }
150
+
151
+ /**
152
+ * Adds the metabox to the queue
153
+ */
154
+ public function smartcrawl_create_meta_box() {
155
+ $show = user_can_see_seo_metabox();
156
+ if ( function_exists( 'add_meta_box' ) ) {
157
+ $metabox_title = is_multisite() ? __( 'SmartCrawl' , 'wds' ) : 'SmartCrawl'; // Show branding for singular installs.
158
+ foreach ( get_post_types() as $posttype ) {
159
+ if ( $show ) { add_meta_box( 'wds-wds-meta-box', $metabox_title, array( &$this, 'smartcrawl_meta_boxes' ), $posttype, 'normal', 'high' ); }
160
+ }
161
+ }
162
+ }
163
+
164
+ /**
165
+ * Handles attachment metadata saving
166
+ *
167
+ * @param array $data Data to save.
168
+ *
169
+ * @return array
170
+ */
171
+ public function smartcrawl_save_attachment_postdata( $data ) {
172
+ if ( empty( $_POST ) || empty( $data['post_ID'] ) || ! is_numeric( $data['post_ID'] ) ) { return $data; }
173
+ $this->smartcrawl_save_postdata( (int) $data['post_ID'] );
174
+ return $data;
175
+ }
176
+
177
+ /**
178
+ * Saves submitted metabox POST data
179
+ *
180
+ * @param int $post_id Post ID.
181
+ *
182
+ * @return bool
183
+ */
184
+ public function smartcrawl_save_postdata( $post_id ) {
185
+ if ( null == $post_id || empty( $_POST ) ) { return; }
186
+
187
+ global $post;
188
+ if ( empty( $post ) ) { $post = get_post( $post_id ); }
189
+
190
+ // Determine posted type.
191
+ $post_type_rq = ! empty( $_POST['post_type'] ) ? sanitize_key( $_POST['post_type'] ) : false;
192
+ if ( 'page' === $post_type_rq && ! current_user_can( 'edit_page', $post_id ) ) {
193
+ return $post_id;
194
+ } elseif ( ! current_user_can( 'edit_post', $post_id ) ) {
195
+ return $post_id;
196
+ }
197
+
198
+ $ptype = ! empty( $post_type_rq )
199
+ ? $post_type_rq
200
+ : ( ! empty( $post->post_type ) ? $post->post_type : false)
201
+ ;
202
+ // Do not process post stuff for non-public post types.
203
+ if ( ! in_array( $ptype, get_post_types( array( 'public' => true ) ) ) ) {
204
+ return $post_id;
205
+ }
206
+
207
+ if ( ! empty( $_POST['wds-opengraph'] ) ) {
208
+ $input = stripslashes_deep( $_POST['wds-opengraph'] );
209
+ $result = array();
210
+
211
+ $result['disabled'] = ! empty( $input['disabled'] );
212
+ if ( ! empty( $input['title'] ) ) { $result['title'] = sanitize_text_field( $input['title'] ); }
213
+ if ( ! empty( $input['description'] ) ) { $result['description'] = sanitize_text_field( $input['description'] ); }
214
+ if ( ! empty( $input['images'] ) && is_array( $input['images'] ) ) {
215
+ $result['images'] = array();
216
+ foreach ( $input['images'] as $img ) {
217
+ $img = esc_url_raw( $img );
218
+ $result['images'][] = $img;
219
+ }
220
+ }
221
+
222
+ if ( ! empty( $result ) ) {
223
+ update_post_meta( $post_id, '_wds_opengraph', $result );
224
+ }
225
+ }
226
+
227
+ if ( ! empty( $_POST['wds-twitter'] ) ) {
228
+ $input = stripslashes_deep( $_POST['wds-twitter'] );
229
+ $twitter = array();
230
+
231
+ $twitter['disabled'] = ! empty( $input['disabled'] );
232
+ if ( ! empty( $input['title'] ) ) { $twitter['title'] = sanitize_text_field( $input['title'] ); }
233
+ if ( ! empty( $input['description'] ) ) { $twitter['description'] = sanitize_text_field( $input['description'] ); }
234
+ if ( ! empty( $input['images'] ) && is_array( $input['images'] ) ) {
235
+ $twitter['images'] = array();
236
+ foreach ( $input['images'] as $img ) {
237
+ $img = esc_url_raw( $img );
238
+ $twitter['images'][] = $img;
239
+ }
240
+ }
241
+
242
+ if ( ! empty( $twitter ) ) {
243
+ update_post_meta( $post_id, '_wds_twitter', $twitter );
244
+ }
245
+ }
246
+
247
+ if ( isset( $_POST['wds_focus'] ) ) {
248
+ $focus = stripslashes_deep( $_POST['wds_focus'] );
249
+ update_post_meta( $post_id, '_wds_focus-keywords', sanitize_text_field( $focus ) );
250
+ }
251
+
252
+ foreach ( $_POST as $key => $value ) {
253
+ if ( in_array( $key, array( 'wds-opengraph', 'wds_focus', 'wds-twitter' ) ) ) { continue; } // We already handled those.
254
+ if ( ! preg_match( '/^wds_/', $key ) ) { continue; }
255
+
256
+ $id = "_{$key}";
257
+ $data = $value;
258
+ if ( is_array( $value ) ) { $data = join( ',', $value ); }
259
+
260
+ if ( $data ) {
261
+ $value = in_array( $key, array( 'wds_canonical', 'wds_redirect' ) )
262
+ ? esc_url_raw( $data )
263
+ : sanitize_text_field( $data );
264
+ update_post_meta( $post_id, $id, $value );
265
+ } else {
266
+ delete_post_meta( $post_id, $id );
267
+ }
268
+ }
269
+
270
+ /**
271
+ * If the user un-checks a checkbox and saves the post, the value for that checkbox will not be included inside $_POST array
272
+ * so we may have to delete the corresponding meta value manually.
273
+ */
274
+ $checkbox_meta_items = array(
275
+ 'wds_tags_to_keywords',
276
+ 'wds_meta-robots-noindex',
277
+ 'wds_meta-robots-nofollow',
278
+ 'wds_meta-robots-adv',
279
+ 'wds_autolinks-exclude',
280
+ );
281
+ foreach ( $checkbox_meta_items as $item ) {
282
+ if ( ! isset( $_POST[ $item ] ) ) {
283
+ delete_post_meta( $post_id, "_{$item}" );
284
+ }
285
+ }
286
+
287
+ do_action( 'wds_saved_postdata' );
288
+ }
289
+
290
+ /**
291
+ * Handles sitemap rebuilding
292
+ */
293
+ public function rebuild_sitemap() {
294
+ require_once SMARTCRAWL_PLUGIN_DIR . '/tools/sitemaps.php';
295
+
296
+ }
297
+
298
+ /**
299
+ * Adds title and robots columns to post listing page
300
+ *
301
+ * @param array $columns Post list columns.
302
+ *
303
+ * @return array
304
+ */
305
+ public function smartcrawl_page_title_column_heading( $columns ) {
306
+ return array_merge(
307
+ array_slice( $columns, 0, 2 ),
308
+ array( 'page-title' => __( 'Title Tag' , 'wds' ) ),
309
+ array_slice( $columns, 2, 6 ),
310
+ array( 'page-meta-robots' => __( 'Robots Meta' , 'wds' ) )
311
+ );
312
+ }
313
+
314
+ /**
315
+ * Puts out actual column bodies
316
+ *
317
+ * @param string $column_name Column ID.
318
+ * @param int $id Post ID.
319
+ *
320
+ * @return void
321
+ */
322
+ public function smartcrawl_page_title_column_content( $column_name, $id ) {
323
+ if ( 'page-title' == $column_name ) {
324
+ echo esc_html( $this->smartcrawl_page_title( $id ) );
325
+
326
+ // Show any 301 redirects.
327
+ $redirect = smartcrawl_get_value( 'redirect', $id );
328
+ if ( ! empty( $redirect ) ) {
329
+ $href = esc_url( $redirect );
330
+ $link = "<a href='{$href}' target='_blank'>{$href}</a>";
331
+ echo '<br /><em>' . sprintf( esc_html( __( 'Redirects to %s', 'wds' ) ), $href ) . '</em>';
332
+ }
333
+ }
334
+
335
+ if ( 'page-meta-robots' == $column_name ) {
336
+ $meta_robots_arr = array(
337
+ (smartcrawl_get_value( 'meta-robots-noindex', $id ) ? 'noindex' : 'index'),
338
+ (smartcrawl_get_value( 'meta-robots-nofollow', $id ) ? 'nofollow' : 'follow'),
339
+ );
340
+ $meta_robots = join( ',', $meta_robots_arr );
341
+ if ( empty( $meta_robots ) ) {
342
+ $meta_robots = 'index,follow'; }
343
+ echo esc_html( ucwords( str_replace( ',', ', ', $meta_robots ) ) );
344
+
345
+ // Show additional robots data.
346
+ $advanced = array_filter( array_map( 'trim', explode( ',', smartcrawl_get_value( 'meta-robots-adv', $id ) ) ) );
347
+ if ( ! empty( $advanced ) && 'none' !== $advanced ) {
348
+ $adv_map = array(
349
+ 'noodp' => __( 'No ODP', 'wds' ),
350
+ 'noydir' => __( 'No YDIR', 'wds' ),
351
+ 'noarchive' => __( 'No Archive', 'wds' ),
352
+ 'nosnippet' => __( 'No Snippet', 'wds' ),
353
+ );
354
+ $additional = array();
355
+ foreach ( $advanced as $key ) {
356
+ if ( ! empty( $adv_map[ $key ] ) ) { $additional[] = $adv_map[ $key ]; }
357
+ }
358
+ if ( ! empty( $additional ) ) { echo '<br /><small>' . esc_html( join( ', ', $additional ) ) . '</small>'; }
359
+ }
360
+ }
361
+ }
362
+
363
+ /**
364
+ * Gets SEO title (with expanded macro replacements)
365
+ *
366
+ * @param int $postid Post ID.
367
+ *
368
+ * @return string
369
+ */
370
+ public function smartcrawl_page_title( $postid ) {
371
+ $post = get_post( $postid );
372
+ $fixed_title = smartcrawl_get_value( 'title', $post->ID );
373
+ if ( $fixed_title ) {
374
+ return smartcrawl_replace_vars( $fixed_title, (array) $post );
375
+ } else {
376
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
377
+ if ( ! empty( $smartcrawl_options[ 'title-' . $post->post_type ] ) ) {
378
+ return smartcrawl_replace_vars( $smartcrawl_options[ 'title-' . $post->post_type ], (array) $post );
379
+ } else {
380
+ return '';
381
+ }
382
+ }
383
+ }
384
+
385
+ /**
386
+ * Dispatch quick edit areas
387
+ *
388
+ * @param string $column Column ID.
389
+ * @param string $type Passthrough.
390
+ */
391
+ public function smartcrawl_quick_edit_dispatch( $column, $type ) {
392
+ switch ( $column ) {
393
+ case 'page-title': return $this->_title_qe_box( $type );
394
+ case 'page-meta-robots': return $this->_robots_qe_box();
395
+ }
396
+ }
397
+
398
+ /**
399
+ * Inject the quick editing javascript
400
+ */
401
+ public function smartcrawl_quick_edit_javascript() {
402
+ $this->_render( 'quick-edit-javascript' );
403
+ }
404
+
405
+ /**
406
+ * Handle postmeta getting requests
407
+ */
408
+ public function json_wds_postmeta() {
409
+ $id = (int) $_POST['id'];
410
+ $post = get_post( $id );
411
+ die(json_encode(array(
412
+ 'title' => smartcrawl_replace_vars( smartcrawl_get_value( 'title', $id ), (array) $post ),
413
+ 'description' => smartcrawl_replace_vars( smartcrawl_get_value( 'metadesc', $id ), (array) $post ),
414
+ 'focus' => smartcrawl_get_value( 'focus-keywords', $id ),
415
+ 'keywords' => smartcrawl_get_value( 'keywords', $id ),
416
+ )));
417
+ }
418
+
419
+ /**
420
+ * Handle metabox live update requests
421
+ */
422
+ public function smartcrawl_metabox_live_update() {
423
+ $id = (int) $_POST['id'];
424
+ $post = get_post( $id );
425
+
426
+ $post_data = sanitize_post( $_POST['post'] );
427
+
428
+ $description = $title = '';
429
+
430
+ /* Merge live post data with currently saved post data */
431
+ $post->post_author = $post_data['post_author'];
432
+ $post->post_title = $post_data['post_title'];
433
+ $post->post_excerpt = $post_data['excerpt'];
434
+ $post->post_content = $post_data['content'];
435
+ $post->post_type = $post_data['post_type'];
436
+
437
+ $title = smartcrawl_get_seo_title( $post );
438
+ $description = smartcrawl_get_seo_desc( $post );
439
+
440
+ wp_send_json(array(
441
+ 'title' => $title,
442
+ 'description' => $description,
443
+ 'focus' => smartcrawl_get_value( 'focus-keywords', $id ),
444
+ 'keywords' => smartcrawl_get_value( 'keywords', $id ),
445
+ ));
446
+
447
+ die();
448
+ }
449
+
450
+ /**
451
+ * Renders title quick edit box
452
+ */
453
+ private function _title_qe_box() {
454
+ global $post;
455
+ $this->_render('quick-edit-title', array(
456
+ 'post' => $post,
457
+ ));
458
+ }
459
+
460
+ /**
461
+ * Renders robots quick edit box
462
+ */
463
+ private function _robots_qe_box() {
464
+ global $post;
465
+ $this->_render('quick-edit-robots', array(
466
+ 'post' => $post,
467
+ ));
468
+ }
469
+
470
+ /**
471
+ * Sattisfy interface
472
+ */
473
+ protected function _get_view_defaults() {
474
+ return array();
475
+ }
476
+ }
477
+
478
+ $smartcrawl_metabox = new Smartcrawl_Metabox();
includes/admin/settings.php ADDED
@@ -0,0 +1,664 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin area setup stuff
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ /**
9
+ * Admin area instance page abstraction
10
+ */
11
+ abstract class Smartcrawl_Settings_Admin extends Smartcrawl_Settings {
12
+
13
+ /**
14
+ * Sections
15
+ *
16
+ * @var array
17
+ */
18
+ public $sections = array();
19
+
20
+ /**
21
+ * Settings corresponding to this page
22
+ *
23
+ * @var array
24
+ */
25
+ public $options = array();
26
+
27
+ /**
28
+ * Capability required for this page
29
+ *
30
+ * @var string
31
+ */
32
+ public $capability = 'list_users';
33
+
34
+ /**
35
+ * Name of the options corresponding to this page
36
+ *
37
+ * @var string
38
+ */
39
+ public $option_name = '';
40
+
41
+ /**
42
+ * Page name
43
+ *
44
+ * @var string
45
+ */
46
+ public $name = '';
47
+
48
+ /**
49
+ * Page slug
50
+ *
51
+ * @var string
52
+ */
53
+ public $slug = '';
54
+
55
+ /**
56
+ * Action URL
57
+ *
58
+ * @var string
59
+ */
60
+ public $action_url = '';
61
+
62
+ /**
63
+ * Action message
64
+ *
65
+ * @var string
66
+ */
67
+ public $msg = '';
68
+
69
+ /**
70
+ * Current page hook
71
+ *
72
+ * @var string
73
+ */
74
+ public $smartcrawl_page_hook = '';
75
+
76
+ /**
77
+ * Blog tabs
78
+ *
79
+ * @var array
80
+ */
81
+ public $blog_tabs = array();
82
+
83
+ /**
84
+ * Validation abstraction
85
+ *
86
+ * @param array $input Raw input to validate.
87
+ *
88
+ * @return array
89
+ */
90
+ abstract public function validate ( $input );
91
+
92
+ /**
93
+ * Constructor
94
+ */
95
+ protected function __construct() {
96
+ if ( is_multisite() && SMARTCRAWL_SITEWIDE ) {
97
+ $this->capability = 'manage_network_options';
98
+ }
99
+
100
+ $this->init();
101
+
102
+ }
103
+
104
+ /**
105
+ * Initializes the interface and binds hooks
106
+ */
107
+ public function init() {
108
+ $this->options = self::get_specific_options( $this->option_name );
109
+ if ( is_multisite() && defined( 'SMARTCRAWL_SITEWIDE' ) && SMARTCRAWL_SITEWIDE ) {
110
+ $this->capability = 'manage_network_options';
111
+ }
112
+
113
+ add_action( 'init', array( $this, 'defaults' ), 999 );
114
+ add_action( 'admin_body_class', array( $this, 'add_body_class' ), 20 );
115
+
116
+ add_action( 'admin_init', array( $this, 'save_last_active_tab' ) );
117
+
118
+ if ( is_multisite() ) {
119
+ add_action( 'network_admin_menu', array( $this, 'add_page' ) );
120
+ }
121
+ if ( ! is_multisite() || ! (defined( 'SMARTCRAWL_SITEWIDE' ) && SMARTCRAWL_SITEWIDE) ) {
122
+ add_action( 'admin_menu', array( $this, 'add_page' ) );
123
+ }
124
+
125
+ }
126
+
127
+ /**
128
+ * Renders the whole page view by calling `_render`
129
+ *
130
+ * As a side-effect, also calls `WDEV_Plugin_Ui::output()`
131
+ *
132
+ * @param string $view View file to load.
133
+ * @param array $args Optional array of arguments to pass to view.
134
+ *
135
+ * @return bool
136
+ */
137
+ protected function _render_page( $view, $args = array() ) {
138
+ WDEV_Plugin_Ui::output();
139
+ $this->_render( $view, $args );
140
+ return true;
141
+ }
142
+
143
+ /**
144
+ * Check if a tab (settings page) is allowed for access
145
+ *
146
+ * It can be not allowed for access to site admins
147
+ *
148
+ * @param string $tab Tab to check.
149
+ *
150
+ * @return bool
151
+ */
152
+ public static function is_tab_allowed( $tab ) {
153
+ if ( empty( $tab ) ) { return false; }
154
+
155
+ if ( ! is_multisite() ) { return true; } // On single installs, everything is good
156
+ if ( is_network_admin() ) { return true; } // Always good in network
157
+ if ( smartcrawl_is_switch_active( 'SMARTCRAWL_SITEWIDE' ) ) { return smartcrawl_is_switch_active( 'DOING_AJAX' ) ? true : is_network_admin(); } // If we're sitewide, we're good *in network admin* pages
158
+
159
+ // We're network install, not sitewide now.
160
+ // Let's see what's up.
161
+ $allowed = Smartcrawl_Settings_Settings::get_blog_tabs();
162
+ if ( empty( $allowed ) ) { return false; }
163
+
164
+ return in_array( $tab, array_keys( $allowed ) ) && ! empty( $allowed[ $tab ] );
165
+ }
166
+
167
+ /**
168
+ * Check if the current tab (settings page) is allowed for access
169
+ *
170
+ * @return bool
171
+ */
172
+ protected function _is_current_tab_allowed() {
173
+ return ! empty( $this->slug )
174
+ ? self::is_tab_allowed( $this->slug )
175
+ : false
176
+ ;
177
+ }
178
+
179
+ /**
180
+ * Add sub page to the Settings Menu
181
+ */
182
+ public function add_page() {
183
+ $allowed = true;
184
+
185
+ if ( ! $this->_is_current_tab_allowed() ) { $allowed = false; }
186
+
187
+ // Only allow network settings page on multisite when sitewide mode is off.
188
+ if ( is_multisite() && ! smartcrawl_is_switch_active( 'SMARTCRAWL_SITEWIDE' ) && is_network_admin() ) {
189
+ $allowed = Smartcrawl_Settings::TAB_SETTINGS === $this->slug;
190
+ }
191
+
192
+ if ( ! $allowed ) { return false; }
193
+
194
+ $this->smartcrawl_page_hook = add_submenu_page(
195
+ 'wds_wizard',
196
+ $this->page_title,
197
+ $this->title,
198
+ $this->capability,
199
+ $this->slug,
200
+ array( $this, 'options_page' )
201
+ );
202
+
203
+ // For pages that can deal with run requests, let's make sure they actually do that early enough.
204
+ if ( is_callable( array( $this, 'process_run_action' ) ) ) {
205
+ add_action( 'load-' . $this->smartcrawl_page_hook, array( $this, 'process_run_action' ) );
206
+ }
207
+
208
+ add_action( 'admin_enqueue_scripts', array( $this, 'register_admin_scripts' ) );
209
+
210
+ add_action( "admin_print_styles-{$this->smartcrawl_page_hook}", array( $this, 'admin_styles' ) );
211
+ add_action( "admin_print_scripts-{$this->smartcrawl_page_hook}", array( $this, 'admin_scripts' ) );
212
+
213
+ }
214
+
215
+ /**
216
+ * Unified admin tab URL getter
217
+ *
218
+ * Also takes into account whether the tab is allowed or not
219
+ *
220
+ * @param string $tab Tab to check.
221
+ *
222
+ * @return string Unescaped admin URL, or tab anchor on failure
223
+ */
224
+ public static function admin_url( $tab ) {
225
+ $fallback = '#' . esc_attr( $tab );
226
+
227
+ if ( empty( $tab ) ) { return $fallback; }
228
+ if ( ! self::is_tab_allowed( $tab ) ) { return $fallback; }
229
+
230
+ $use_network_url = false;
231
+ if ( is_multisite() && smartcrawl_is_switch_active( 'SMARTCRAWL_SITEWIDE' ) ) {
232
+ $use_network_url = is_network_admin() || smartcrawl_is_switch_active( 'DOING_AJAX' );
233
+ }
234
+
235
+ return ! empty( $use_network_url )
236
+ ? add_query_arg( 'page', $tab, network_admin_url( 'admin.php' ) )
237
+ : add_query_arg( 'page', $tab, admin_url( 'admin.php' ) );
238
+ }
239
+
240
+ /**
241
+ * Registers the scripts with global admin functionality
242
+ */
243
+ public static function register_global_admin_scripts() {
244
+ $version = Smartcrawl_Loader::get_version();
245
+ if ( ! wp_script_is( 'wds-admin', 'registered' ) ) {
246
+ wp_register_script( 'wds-admin', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin.js', array( 'jquery' ), $version );
247
+ }
248
+
249
+ if ( ! wp_script_is( 'wds-admin-opengraph', 'registered' ) ) {
250
+ wp_register_script( 'wds-admin-opengraph', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-opengraph.js', array( 'underscore', 'jquery', 'wds-admin' ), $version );
251
+ }
252
+
253
+ if ( ! wp_script_is( 'wds-select2', 'registered' ) ) {
254
+ wp_register_script( 'wds-select2', SMARTCRAWL_PLUGIN_URL . 'js/external/select2.min.js', array( 'jquery' ), $version );
255
+ }
256
+
257
+ if ( ! wp_script_is( 'wds-qtip2-script', 'registered' ) ) {
258
+ wp_register_script( 'wds-qtip2-script', SMARTCRAWL_PLUGIN_URL . 'js/external/jquery.qtip.min.js', array( 'jquery' ), $version );
259
+ }
260
+
261
+ wp_register_style( 'wds-admin-opengraph', SMARTCRAWL_PLUGIN_URL . '/css/wds-opengraph.css', null, $version );
262
+
263
+ wp_register_style( 'wds-qtip2-style', SMARTCRAWL_PLUGIN_URL . '/css/external/jquery.qtip.min.css', null, $version );
264
+
265
+ wp_register_style( 'wds-select2', SMARTCRAWL_PLUGIN_URL . 'css/external/select2.min.css', null, $version );
266
+
267
+ wp_register_style( 'wds-app', SMARTCRAWL_PLUGIN_URL . 'css/app.css', array( 'wds-qtip2-style' ), $version );
268
+ }
269
+
270
+ /**
271
+ * Registers the known scripts on admin side.
272
+ */
273
+ public function register_admin_scripts() {
274
+ // Do the globals first.
275
+ self::register_global_admin_scripts();
276
+
277
+ $version = Smartcrawl_Loader::get_version();
278
+ if ( class_exists( 'Smartcrawl_Onpage_Settings' ) && ! wp_script_is( 'wds-admin-macros', 'registered' ) ) {
279
+ wp_register_script( 'wds-admin-macros', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-macros.js', array( 'underscore', 'jquery', 'wds-admin' ), $version );
280
+ wp_localize_script('wds-admin-macros', '_wds_macros', array(
281
+ 'macros' => Smartcrawl_Onpage_Settings::get_macros(),
282
+ 'templates' => array(
283
+ 'list' => $this->_load( 'underscore-macros-list' ),
284
+ ),
285
+ 'strings' => array(
286
+ 'Insert dynamic macro' => __( 'Insert dynamic macro', 'wds' ),
287
+ ),
288
+ ));
289
+ }
290
+
291
+ if ( ! wp_script_is( 'wds-admin-service', 'registered' ) ) {
292
+ wp_register_script( 'wds-admin-service', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-service.js', array( 'underscore', 'jquery', 'wds-admin' ), $version );
293
+ wp_localize_script('wds-admin-service', '_wds_service', array(
294
+ 'strings' => array(
295
+ 'Connecting' => __( 'Connecting...', 'wds' ),
296
+ 'Parsing results' => __( 'Parsing results...', 'wds' ),
297
+ 'Something went wrong' => __( 'It appears something went wrong with communicating with the service', 'wds' ),
298
+ 'Checking the site ...' => __( 'Checking the site ...', 'wds' ),
299
+ 'Still working ...' => __( 'Still working ...', 'wds' ),
300
+ 'Waiting for service response ...' => __( 'Waiting for service response ...', 'wds' ),
301
+ 'Request queued, waiting ...' => __( 'Request queued, waiting ...', 'wds' ),
302
+ ),
303
+ 'templates' => array(
304
+ 'run' => $this->_load( 'dashboard-dialog-seo_service-run' ),
305
+ ),
306
+ ));
307
+ }
308
+
309
+ if ( ! wp_script_is( 'wds-admin-keywords', 'registered' ) ) {
310
+ wp_register_script( 'wds-admin-keywords', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-keywords.js', array( 'underscore', 'jquery', 'wds-admin' ), $version );
311
+ wp_localize_script('wds-admin-keywords', '_wds_keywords', array(
312
+ 'templates' => array(
313
+ 'custom' => $this->_load( 'underscore-keywords-custom' ),
314
+ 'pairs' => $this->_load( 'underscore-keywords-pairs' ),
315
+ 'form' => $this->_load( 'underscore-keywords-form' ),
316
+ ),
317
+ 'strings' => array(
318
+ 'Keyword' => __( 'Keyword', 'wds' ),
319
+ 'Auto-Linked URL' => __( 'Auto-Linked URL', 'wds' ),
320
+ 'Add New' => __( 'Add New', 'wds' ),
321
+ 'Add Custom Keywords' => __( 'Add Custom Keywords', 'wds' ),
322
+ 'Update Custom Keywords' => __( 'Update Custom Keywords', 'wds' ),
323
+ 'Add' => __( 'Add', 'wds' ),
324
+ 'Update' => __( 'Update', 'wds' ),
325
+ 'Edit' => __( 'Edit', 'wds' ),
326
+ 'Remove' => __( 'Remove', 'wds' ),
327
+ 'E.g. Cats, Kittens, Felines' => __( 'E.g. Cats, Kittens, Felines', 'wds' ),
328
+ 'E.g. /cats' => __( 'E.g. /cats', 'wds' ),
329
+ 'Keyword group' => __( 'Keyword group', 'wds' ),
330
+ '- Usually related terms' => __( '- Usually related terms', 'wds' ),
331
+ 'Link URL' => __( 'Link URL', 'wds' ),
332
+ '- Both internal and external links are supported' => __( '- Both internal and external links are supported', 'wds' ),
333
+ 'Choose your keywords, and then specify the URL to auto-link to.' => __( 'Choose your keywords, and then specify the URL to auto-link to.', 'wds' ),
334
+ 'Formats include relative (E.g. <b>/cats</b>) or absolute URLs (E.g. <b>www.website.com/cats</b> or <b>https://website.com/cats</b>).' => __( 'Formats include relative (E.g. <b>/cats</b>) or absolute URLs (E.g. <b>www.website.com/cats</b> or <b>https://website.com/cats</b>).', 'wds' ),
335
+ 'Cancel' => __( 'Cancel', 'wds' ),
336
+ ),
337
+ ));
338
+ }
339
+
340
+ if ( class_exists( 'Smartcrawl_Autolinks_Settings' ) && ! wp_script_is( 'wds-admin-postlist', 'registered' ) ) {
341
+ wp_register_script( 'wds-admin-postlist', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-postlist.js', array( 'underscore', 'jquery', 'wds-admin' ), $version );
342
+ wp_localize_script('wds-admin-postlist', '_wds_postlist', array(
343
+ 'templates' => array(
344
+ 'exclude' => $this->_load( 'underscore-postlist-exclusion' ),
345
+ 'exclude-item' => $this->_load( 'underscore-postlist-exclusion-item' ),
346
+ 'selector' => $this->_load( 'underscore-postlist-selector' ),
347
+ 'selector-list' => $this->_load( 'underscore-postlist-selector-list' ),
348
+ 'selector-list-item' => $this->_load( 'underscore-postlist-selector-list-item' ),
349
+ ),
350
+ 'post_types' => Smartcrawl_Autolinks_Settings::get_post_types(),
351
+ 'strings' => array(
352
+ 'Add Posts' => __( 'Add Posts', 'wds' ),
353
+ 'Remove' => __( 'Remove', 'wds' ),
354
+ 'Post' => __( 'Post', 'wds' ),
355
+ 'Post Type' => __( 'Post Type', 'wds' ),
356
+ 'Loading post items, please hold on' => __( 'Loading post items, please hold on...', 'wds' ),
357
+ 'Jump to page' => __( 'Jump to page:', 'wds' ),
358
+ 'Total Pages' => __( 'Total Pages:', 'wds' ),
359
+ ),
360
+ ));
361
+ }
362
+
363
+ if ( class_exists( 'Smartcrawl_Autolinks_Settings' ) && ! wp_script_is( 'wds-admin-autolinks', 'registered' ) ) {
364
+ wp_register_script('wds-admin-autolinks', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-autolinks.js', array(
365
+ 'underscore',
366
+ 'jquery',
367
+ 'wds-admin',
368
+ 'wds-select2',
369
+ 'wds-select2-admin',
370
+ 'wds-admin-keywords',
371
+ 'wds-admin-postlist',
372
+ ), $version);
373
+ }
374
+
375
+ if ( 'Smartcrawl_Autolinks_Settings' == get_class( $this ) && ! wp_script_is( 'wds-admin-redirects', 'registered' ) ) {
376
+ wp_register_script('wds-admin-redirects', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-redirects.js', array(
377
+ 'underscore',
378
+ 'jquery',
379
+ 'wds-admin',
380
+ 'wds-select2',
381
+ 'wds-select2-admin',
382
+ ), $version);
383
+
384
+ wp_localize_script('wds-admin-redirects', '_wds_redirects', array(
385
+ 'templates' => array(
386
+ 'redirect-item' => $this->_load( 'advanced-tools/underscore-redirect-item' ),
387
+ 'update-form' => $this->_load( 'advanced-tools/underscore-bulk-update-form' ),
388
+ ),
389
+ 'strings' => array(
390
+ 'Permanent (301)' => __( 'Permanent (301)', 'wds' ),
391
+ 'Temporary (302)' => __( 'Temporary (302)', 'wds' ),
392
+ 'Options' => __( 'Options', 'wds' ),
393
+ 'Remove' => __( 'Remove', 'wds' ),
394
+ 'Cancel' => __( 'Cancel', 'wds' ),
395
+ 'Update' => __( 'Update', 'wds' ),
396
+ 'Redirect Type' => __( 'Redirect Type', 'wds' ),
397
+ 'New URL' => __( 'New URL', 'wds' ),
398
+ 'Bulk Update' => __( 'Bulk Update', 'wds' ),
399
+ 'Please select some items to edit them.' => __( 'Please select some items to edit them.', 'wds' ),
400
+ ),
401
+ ));
402
+ }
403
+
404
+ if ( class_exists( 'Smartcrawl_Onpage_Settings' ) && ! wp_script_is( 'wds-admin-onpage', 'registered' ) ) {
405
+ wp_register_script('wds-admin-onpage', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-onpage.js', array(
406
+ 'wds-admin-macros',
407
+ 'wds-admin-opengraph',
408
+ 'wds-qtip2-script',
409
+ 'jquery',
410
+ ), $version);
411
+ }
412
+
413
+ if ( class_exists( 'Smartcrawl_Sitemap_Settings' ) && ! wp_script_is( 'wds-admin-sitemaps', 'registered' ) ) {
414
+ wp_register_script('wds-admin-sitemaps', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-sitemaps.js', array(
415
+ 'wds-admin',
416
+ 'wds-qtip2-script',
417
+ 'jquery',
418
+ ), $version);
419
+ };
420
+
421
+ if ( class_exists( 'Smartcrawl_Settings_Dashboard' ) && ! wp_script_is( 'wds-admin-dashboard', 'registered' ) ) {
422
+ wp_register_script('wds-admin-dashboard', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-dashboard.js', array(
423
+ 'wds-admin',
424
+ 'wds-qtip2-script',
425
+ 'jquery',
426
+ ), $version);
427
+ };
428
+
429
+ if ( class_exists( 'Smartcrawl_Checkup_Settings' ) && ! wp_script_is( 'wds-admin-checkup', 'registered' ) ) {
430
+ wp_register_script('wds-admin-checkup', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-checkup.js', array(
431
+ 'wds-admin',
432
+ 'wds-qtip2-script',
433
+ 'jquery',
434
+ ), $version);
435
+ };
436
+
437
+ if ( class_exists( 'Smartcrawl_Social_Settings' ) && ! wp_script_is( 'wds-admin-social', 'registered' ) ) {
438
+ wp_register_script('wds-admin-social', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-social.js', array(
439
+ 'wds-admin',
440
+ 'wds-qtip2-script',
441
+ 'jquery',
442
+ ), $version);
443
+ };
444
+
445
+ if ( class_exists( 'Smartcrawl_Settings_Settings' ) && ! wp_script_is( 'wds-admin-settings', 'registered' ) ) {
446
+ wp_register_script('wds-admin-settings', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-settings.js', array(
447
+ 'wds-admin',
448
+ 'wds-qtip2-script',
449
+ 'jquery',
450
+ ), $version);
451
+
452
+ wp_localize_script('wds-admin-settings', '_wds_setting', array(
453
+ 'strings' => array(
454
+ 'importing' => esc_html__('Importing', 'wds'),
455
+ 'import' => esc_html__('Import', 'wds'),
456
+ )
457
+ ));
458
+ };
459
+ }
460
+
461
+ /**
462
+ * Enqueue styles
463
+ */
464
+ public function admin_styles() {
465
+ $version = Smartcrawl_Loader::get_version();
466
+
467
+ $this->enqueue_shared_ui();
468
+
469
+ wp_enqueue_style( 'wds-qtip2-style' );
470
+ wp_enqueue_style( 'wds-select2' );
471
+ wp_enqueue_style( 'wds-app' );
472
+
473
+ if ( file_exists( SMARTCRAWL_PLUGIN_DIR . 'css/' . $this->name . '.css' ) ) {
474
+ wp_enqueue_style( $this->slug, SMARTCRAWL_PLUGIN_URL . 'css/' . $this->name . '.css', array( 'wds' ), $version );
475
+ }
476
+ }
477
+
478
+ /**
479
+ * Enqueue scripts
480
+ */
481
+ public function admin_scripts() {
482
+ $version = Smartcrawl_Loader::get_version();
483
+
484
+ wp_enqueue_script( 'wds' );
485
+
486
+ wp_enqueue_script( 'wds-select2' );
487
+ wp_enqueue_script( 'wds-select2-admin', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-select2.js', array( 'wds-select2' ), $version );
488
+
489
+ if ( file_exists( SMARTCRAWL_PLUGIN_DIR . 'js/' . $this->name . '.js' ) ) {
490
+ wp_enqueue_script( $this->slug, SMARTCRAWL_PLUGIN_URL . 'js/' . $this->name . '.js', array( 'wds' ), $version );
491
+ }
492
+
493
+ }
494
+
495
+ /**
496
+ * Initiates a checkup run
497
+ */
498
+ public function run_checkup() {
499
+ if ( current_user_can( 'manage_options' ) ) {
500
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_CHECKUP );
501
+ $service->start();
502
+ }
503
+ wp_safe_redirect( esc_url( remove_query_arg( 'run-checkup' ) ) );
504
+ die;
505
+ }
506
+
507
+ /**
508
+ * Display the admin options page
509
+ */
510
+ public function options_page() {
511
+ $this->msg = '';
512
+ if ( ! empty( $_GET['updated'] ) || ! empty( $_GET['settings-updated'] ) ) {
513
+ $this->msg = __( 'Settings updated' , 'wds' );
514
+
515
+ if ( function_exists( 'w3tc_pgcache_flush' ) ) {
516
+ w3tc_pgcache_flush();
517
+ $this->msg .= __( ' &amp; W3 Total Cache Page Cache flushed' , 'wds' );
518
+ } elseif ( function_exists( 'wp_cache_clear_cache' ) ) {
519
+ wp_cache_clear_cache();
520
+ $this->msg .= __( ' &amp; WP Super Cache flushed' , 'wds' );
521
+ }
522
+ }
523
+
524
+ if (!empty($_GET['imported'])) {
525
+ $plugin = smartcrawl_get_array_value($_GET, 'plugin');
526
+ $plugin_label = $plugin == 'yoast' ? __('Yoast SEO', 'wds') : __('All In One SEO', 'wds');
527
+
528
+ $plugins_link = sprintf(
529
+ '<a href="%s">%s</a>',
530
+ admin_url('plugins.php'),
531
+ sprintf(
532
+ __('deactivate %s', 'wds'),
533
+ $plugin_label
534
+ )
535
+ );
536
+
537
+ $this->msg = sprintf(
538
+ __('Your %s configuration has been successfully imported! We recommend you %s to avoid any potential conflicts.', 'wds'),
539
+ $plugin_label,
540
+ $plugins_link
541
+ );
542
+ }
543
+ }
544
+
545
+ /**
546
+ * Sets up contextual help
547
+ *
548
+ * @param string $contextual_help Help.
549
+ *
550
+ * @return string
551
+ */
552
+ public function contextual_help( $contextual_help ) {
553
+ if ( ! empty( $_GET['page'] ) && $_GET['page'] === $this->slug && ! empty( $this->contextual_help ) ) {
554
+ $contextual_help = $this->contextual_help;
555
+ }
556
+
557
+ return $contextual_help;
558
+ }
559
+
560
+ /**
561
+ * Adds body class
562
+ *
563
+ * @TODO: Apparently a no-op?
564
+ *
565
+ * @param string $class Class that's being processed.
566
+ *
567
+ * @return string
568
+ */
569
+ public function add_body_class( $class ) {
570
+ global $current_screen;
571
+
572
+ if ( str_replace( '-network', '', $current_screen->id ) === $this->smartcrawl_page_hook ) {
573
+ return $class;
574
+ } else {
575
+ return $class;
576
+ }
577
+ }
578
+
579
+ /**
580
+ * Populates view defaults with view meta information
581
+ *
582
+ * @return array Defaults
583
+ */
584
+ protected function _get_view_defaults() {
585
+ $errors = get_transient( 'wds-settings-save-errors' );
586
+ $errors = ! empty( $errors ) ? $errors : array();
587
+ return array(
588
+ '_view' => array(
589
+ 'slug' => $this->slug,
590
+ 'name' => $this->name,
591
+ 'option_name' => $this->option_name,
592
+ 'options' => $this->options,
593
+ 'action_url' => $this->action_url,
594
+ 'msg' => $this->msg,
595
+ 'errors' => $errors,
596
+ ),
597
+ );
598
+ }
599
+
600
+ /**
601
+ * On form submission, this method saves the last active tab in a transient so that it can be opened when the page is refreshed.
602
+ */
603
+ public function save_last_active_tab() {
604
+ if ( isset( $_POST['wds-admin-active-tab'] ) ) {
605
+ set_transient( 'wds-admin-active-tab', sanitize_key( $_POST['wds-admin-active-tab'] ), 10 );
606
+ }
607
+ }
608
+
609
+ /**
610
+ * Checks if the last active tab is stored in the transient and returns its value. If nothing is available then it returns the default value.
611
+ *
612
+ * @param string $default Fallback value.
613
+ *
614
+ * @return string The last active tab.
615
+ */
616
+ protected function _get_last_active_tab( $default = '' ) {
617
+ $active_tab = get_transient( 'wds-admin-active-tab' );
618
+ delete_transient( 'wds-admin-active-tab' );
619
+
620
+ return $active_tab ? $active_tab : $default;
621
+ }
622
+
623
+ /**
624
+ * Sets up and enqueues shared UI library
625
+ *
626
+ * @param bool $add_class Whether to add admin body class to the current page.
627
+ */
628
+ public static function enqueue_shared_ui( $add_class = true ) {
629
+ $version = Smartcrawl_Loader::get_version();
630
+ if ( $add_class ) {
631
+ add_filter(
632
+ 'admin_body_class',
633
+ array( 'WDEV_Plugin_Ui', 'admin_body_class' )
634
+ );
635
+ }
636
+
637
+ /**
638
+ * Enqueue Dashboard UI Shared Lib.
639
+ * We are doing it this way instead of calling WDEV_Plugin_Ui::load because we want to clear out the cache
640
+ * by changing the version.
641
+ */
642
+ $shared_ui_url = SMARTCRAWL_PLUGIN_URL . 'admin/shared-ui';
643
+ wp_enqueue_style(
644
+ 'wdev-plugin-google_fonts',
645
+ 'https://fonts.googleapis.com/css?family=Roboto+Condensed:400,700|Roboto:400,500,300,300italic',
646
+ false,
647
+ $version
648
+ );
649
+
650
+ wp_enqueue_style(
651
+ 'wdev-plugin-ui',
652
+ $shared_ui_url . '/wdev-ui.css',
653
+ array( 'wdev-plugin-google_fonts' ),
654
+ $version
655
+ );
656
+
657
+ wp_enqueue_script(
658
+ 'wdev-plugin-ui',
659
+ $shared_ui_url . '/wdev-ui.js',
660
+ array( 'jquery' ),
661
+ $version
662
+ );
663
+ }
664
+ }
includes/admin/settings/autolinks.php ADDED
@@ -0,0 +1,492 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Autolinks module settings
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ /**
9
+ * Init WDS Autolinks Settings
10
+ */
11
+ class Smartcrawl_Autolinks_Settings extends Smartcrawl_Settings_Admin {
12
+
13
+ /**
14
+ * Holds singleton instance
15
+ *
16
+ * @var Smartcrawl_Autolinks_Settings
17
+ */
18
+ private static $_instance;
19
+
20
+ /**
21
+ * Singleton instance getter
22
+ *
23
+ * @return Smartcrawl_Autolinks_Settings instance
24
+ */
25
+ public static function get_instance() {
26
+ if ( empty( self::$_instance ) ) {
27
+ self::$_instance = new self;
28
+ }
29
+ return self::$_instance;
30
+ }
31
+
32
+ /**
33
+ * Static known public post types getter
34
+ *
35
+ * @return array A list of known post type *objects* keyed by name
36
+ */
37
+ public static function get_post_types() {
38
+ static $post_types;
39
+
40
+ if ( empty( $post_types ) ) {
41
+ $exclusions = array(
42
+ 'revision',
43
+ 'nav_menu_item',
44
+ 'attachment',
45
+ );
46
+ $raw = get_post_types(array(
47
+ 'public' => true,
48
+ ), 'objects');
49
+ foreach ( $raw as $pt => $pto ) {
50
+ if ( in_array( $pt, $exclusions ) ) { continue; }
51
+ $post_types[ $pt ] = $pto;
52
+ }
53
+ }
54
+
55
+ return is_array( $post_types )
56
+ ? $post_types
57
+ : array()
58
+ ;
59
+ }
60
+
61
+ /**
62
+ * Validate submitted options
63
+ *
64
+ * @param array $input Raw input.
65
+ *
66
+ * @return array Validated input
67
+ */
68
+ public function validate( $input ) {
69
+ $save_redirects = isset( $input['save_redirects'] ) && $input['save_redirects'];
70
+ if ( $save_redirects ) {
71
+ $this->save_redirects( $input );
72
+
73
+ $result = self::get_specific_options( $this->option_name );
74
+
75
+ if ( isset( $input['redirect-attachments'] ) ) {
76
+ $result['redirect-attachments'] = ! empty( $input['redirect-attachments'] );
77
+ }
78
+ if ( isset( $input['redirect-attachments-images_only'] ) ) {
79
+ $result['redirect-attachments-images_only'] = ! empty( $input['redirect-attachments-images_only'] );
80
+ }
81
+
82
+ if ( isset( $input['redirections-code'] ) ) {
83
+ $this->_validate_and_save_extra_options( $input );
84
+ }
85
+
86
+ return $result;
87
+ }
88
+
89
+ $service = $this->get_site_service();
90
+
91
+ $result = array();
92
+
93
+ if ( ! empty( $input['wds_autolinks-setup'] ) ) { $result['wds_autolinks-setup'] = true; }
94
+
95
+ if ( $service->is_member() ) {
96
+ // Booleans.
97
+ $booleans = array(
98
+ 'comment',
99
+ 'onlysingle',
100
+ 'allowfeed',
101
+ 'casesens',
102
+ 'customkey_preventduplicatelink',
103
+ 'target_blank',
104
+ 'rel_nofollow',
105
+ 'allow_empty_tax',
106
+ 'excludeheading',
107
+ );
108
+
109
+ foreach ( $booleans as $bool ) {
110
+ if ( ! empty( $input[ $bool ] ) ) { $result[ $bool ] = true; }
111
+ }
112
+
113
+ // Boolean Arrays.
114
+ $post_type_names = array_keys( self::get_post_types() );
115
+ foreach ( array_merge( $post_type_names, array( 'comment' ) ) as $post_type ) {
116
+ $result[ $post_type ] = in_array( $post_type, $input );
117
+ }
118
+ foreach ( $post_type_names as $post_type ) {
119
+ $result[ "l{$post_type}" ] = in_array( "l{$post_type}", $input );
120
+ }
121
+ foreach ( get_taxonomies() as $taxonomy ) {
122
+ $tax = get_taxonomy( $taxonomy );
123
+ $key = strtolower( $tax->labels->name );
124
+ $result[ "l{$key}" ] = in_array( "l{$key}", $input );
125
+ }
126
+
127
+ // Numerics.
128
+ $numeric = array(
129
+ 'cpt_char_limit',
130
+ 'tax_char_limit',
131
+ 'link_limit',
132
+ 'single_link_limit',
133
+ );
134
+ foreach ( $numeric as $num ) {
135
+ if ( isset( $input[ $num ] ) ) {
136
+ if ( is_numeric( $input[ $num ] ) ) {
137
+ $result[ $num ] = (int) $input[ $num ];
138
+ } elseif ( ! empty( $input[ $num ] ) ) {
139
+ add_settings_error( $num, $num, __( 'Limit values must be numeric' ) );
140
+ }
141
+ }
142
+ }
143
+
144
+ // Strings.
145
+ $strings = array(
146
+ 'ignore',
147
+ 'ignorepost',
148
+ );
149
+ foreach ( $strings as $str ) {
150
+ if ( isset( $input[ $str ] ) ) { $result[ $str ] = sanitize_text_field( $input[ $str ] ); }
151
+ }
152
+
153
+ // Custom keywords, they need newlines.
154
+ if ( isset( $input['customkey'] ) ) {
155
+ $str = wp_check_invalid_utf8( $input['customkey'] );
156
+ $str = wp_pre_kses_less_than( $str );
157
+ $str = wp_strip_all_tags( $str );
158
+ $result['customkey'] = $str;
159
+
160
+ $found = false;
161
+ while ( preg_match( '/%[a-f0-9]{2}/i', $str, $match ) ) {
162
+ $str = str_replace( $match[0], '', $str );
163
+ $found = true;
164
+ }
165
+ if ( $found ) { $str = trim( preg_replace( '/ +/', ' ', $str ) ); }
166
+ }
167
+ }
168
+
169
+ return $result;
170
+ }
171
+
172
+ /**
173
+ * Process extra options
174
+ *
175
+ * @param array $input Raw input.
176
+ */
177
+ private function _validate_and_save_extra_options( $input ) {
178
+ $settings = Smartcrawl_Settings::get_specific_options( 'wds_settings_options' );
179
+ $settings['redirections-code'] = (int) $input['redirections-code'];
180
+ Smartcrawl_Settings::update_specific_options( 'wds_settings_options', $settings );
181
+ }
182
+
183
+ /**
184
+ * Initializes the admin pane
185
+ */
186
+ public function init() {
187
+ $this->option_name = 'wds_autolinks_options';
188
+ $this->name = Smartcrawl_Settings::COMP_AUTOLINKS;
189
+ $this->slug = Smartcrawl_Settings::TAB_AUTOLINKS;
190
+ $this->action_url = admin_url( 'options.php' );
191
+ $this->title = __( 'Advanced Tools', 'wds' );
192
+ $this->page_title = __( 'SmartCrawl Wizard: Advanced Tools', 'wds' );
193
+
194
+ add_action( 'wp_ajax_wds-load_exclusion-post_data', array( $this, 'json_load_post' ) );
195
+ add_action( 'wp_ajax_wds-load_exclusion_posts-posts_data-specific', array( $this, 'json_load_posts_specific' ) );
196
+ add_action( 'wp_ajax_wds-load_exclusion_posts-posts_data-paged', array( $this, 'json_load_posts_paged' ) );
197
+ add_action( 'admin_init', array( $this, 'reset_moz_api_credentials' ) );
198
+
199
+ parent::init();
200
+ }
201
+
202
+ /**
203
+ * Resets Moz API creds
204
+ */
205
+ public function reset_moz_api_credentials() {
206
+ if ( isset( $_POST['reset-moz-credentials'] ) ) { // Just a presence flag.
207
+ $options = self::get_specific_options( 'wds_settings_options' );
208
+ unset( $options['access-id'] );
209
+ unset( $options['secret-key'] );
210
+ self::update_specific_options( 'wds_settings_options', $options );
211
+
212
+ $ref = wp_get_referer();
213
+ $ref = ! empty( $ref )
214
+ ? $ref
215
+ : Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_AUTOLINKS );
216
+ wp_safe_redirect( esc_url_raw( $ref ) );
217
+ die;
218
+ }
219
+ }
220
+
221
+ /**
222
+ * Loads Individual post data
223
+ *
224
+ * Outputs AJAX response
225
+ */
226
+ public function json_load_post() {
227
+ $result = array(
228
+ 'id' => 0,
229
+ 'title' => '',
230
+ 'type' => '',
231
+ );
232
+ if ( ! current_user_can( 'edit_others_posts' ) ) { wp_send_json( $result ); }
233
+
234
+ $post_id = ! empty( $_POST['id'] ) && is_numeric( $_POST['id'] )
235
+ ? (int) $_POST['id']
236
+ : false
237
+ ;
238
+ if ( empty( $post_id ) ) { wp_send_json( $result ); }
239
+
240
+ $post = get_post( $post_id );
241
+ if ( ! $post ) { wp_send_json( $result ); }
242
+
243
+ wp_send_json( $this->_post_to_response_data( $post ) );
244
+ }
245
+
246
+ /**
247
+ * Loads posts by specific IDs
248
+ *
249
+ * Outputs AJAX response
250
+ */
251
+ public function json_load_posts_specific() {
252
+ $result = array(
253
+ 'meta' => array(),
254
+ 'posts' => array(),
255
+ );
256
+ if ( ! current_user_can( 'edit_others_posts' ) ) { wp_send_json( $result ); }
257
+
258
+ $post_ids = ! empty( $_POST['posts'] ) && is_array( $_POST['posts'] )
259
+ ? array_values( array_filter( array_map( 'intval', $_POST['posts'] ) ) )
260
+ : array()
261
+ ;
262
+ if ( empty( $post_ids ) ) { wp_send_json( $result ); }
263
+
264
+ $args = array(
265
+ 'post_status' => 'publish',
266
+ 'posts_per_page' => -1,
267
+ 'post__in' => $post_ids,
268
+ 'ignore_sticky_posts' => true,
269
+ 'post_type' => 'any',
270
+ );
271
+
272
+ $query = new WP_Query( $args );
273
+
274
+ $result['meta'] = array(
275
+ 'total' => $query->max_num_pages,
276
+ 'page' => 1,
277
+ );
278
+
279
+ foreach ( $query->posts as $post ) {
280
+ $result['posts'][] = $this->_post_to_response_data( $post );
281
+ }
282
+
283
+ wp_send_json( $result );
284
+ }
285
+
286
+ /**
287
+ * Loads paged posts of certain type
288
+ *
289
+ * Outputs AJAX response
290
+ */
291
+ public function json_load_posts_paged() {
292
+ $result = array(
293
+ 'meta' => array(),
294
+ 'posts' => array(),
295
+ );
296
+ if ( ! current_user_can( 'edit_others_posts' ) ) { wp_send_json( $result ); }
297
+ $args = array(
298
+ 'post_status' => 'publish',
299
+ 'posts_per_page' => 10,
300
+ 'ignore_sticky_posts' => true,
301
+ );
302
+ $page = 1;
303
+ if ( ! empty( $_POST['type'] ) && in_array( $_POST['type'], array_keys( self::get_post_types() ) ) ) {
304
+ $args['post_type'] = sanitize_key( $_POST['type'] );
305
+ }
306
+ if ( ! empty( $_POST['page'] ) && is_numeric( $_POST['page'] ) ) {
307
+ $args['paged'] = (int) $_POST['page'];
308
+ $page = $args['paged'];
309
+ }
310
+
311
+ $query = new WP_Query( $args );
312
+
313
+ $result['meta'] = array(
314
+ 'total' => $query->max_num_pages,
315
+ 'page' => $page,
316
+ );
317
+
318
+ foreach ( $query->posts as $post ) {
319
+ $result['posts'][] = $this->_post_to_response_data( $post );
320
+ }
321
+
322
+ wp_send_json( $result );
323
+ }
324
+
325
+ /**
326
+ * Makes the post response format uniform
327
+ *
328
+ * @param object $post WP_Post instance.
329
+ *
330
+ * @return array Post response hash
331
+ */
332
+ private function _post_to_response_data( $post ) {
333
+ $result = array(
334
+ 'id' => 0,
335
+ 'title' => '',
336
+ 'type' => '',
337
+ 'date' => '',
338
+ );
339
+ if ( empty( $post ) || empty( $post->ID ) ) { return $result; }
340
+ static $date_format;
341
+
342
+ if ( empty( $date_format ) ) { $date_format = get_option( 'date_format' ); }
343
+
344
+ $post_id = $post->ID;
345
+ $result['id'] = $post_id;
346
+ $result['title'] = get_the_title( $post_id );
347
+ $result['type'] = get_post_type( $post_id );
348
+ $result['date'] = get_post_time( $date_format, false, $post_id );
349
+
350
+ return $result;
351
+ }
352
+
353
+ /**
354
+ * Add admin settings page
355
+ */
356
+ public function options_page() {
357
+ parent::options_page();
358
+
359
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
360
+ $arguments = array(
361
+ 'insert' => array(),
362
+ );
363
+
364
+ $post_types = array();
365
+ foreach ( self::get_post_types() as $post_type => $pt ) {
366
+ $key = strtolower( $pt->name );
367
+ $post_types[ "l{$key}" ] = $pt->labels->name;
368
+
369
+ $arguments['insert'][ "{$key}" ] = $pt->labels->name;
370
+ }
371
+
372
+ $taxonomies = array();
373
+ foreach ( get_taxonomies() as $taxonomy ) {
374
+ if ( ! in_array( $taxonomy, array( 'nav_menu', 'link_category', 'post_format' ) ) ) {
375
+ $tax = get_taxonomy( $taxonomy );
376
+ $key = strtolower( $tax->labels->name );
377
+
378
+ $taxonomies[ "l{$key}" ] = $tax->labels->name;
379
+ }
380
+ }
381
+ $redirection_model = new Smartcrawl_Model_Redirection;
382
+ $arguments['redirections'] = $redirection_model->get_all_redirections();
383
+ $arguments['redirection_types'] = $redirection_model->get_all_redirection_types();
384
+
385
+ $arguments['linkto'] = array_merge( $post_types, $taxonomies );
386
+ $arguments['insert']['comment'] = __( 'Comments' , 'wds' );
387
+
388
+ $arguments['active_tab'] = $this->_get_last_active_tab( 'tab_automatic_linking' );
389
+
390
+ wp_enqueue_script( 'wds-admin-autolinks' );
391
+ wp_enqueue_script( 'wds-admin-redirects' );
392
+ $this->_render_page( 'advanced-tools/advanced-tools-settings', $arguments );
393
+ }
394
+
395
+ /**
396
+ * Default settings
397
+ */
398
+ public function defaults() {
399
+
400
+ if ( is_multisite() && SMARTCRAWL_SITEWIDE ) {
401
+ $this->options = get_site_option( $this->option_name );
402
+ } else {
403
+ $this->options = get_option( $this->option_name );
404
+ }
405
+
406
+ if ( empty( $this->options['ignorepost'] ) ) {
407
+ $this->options['ignorepost'] = '';
408
+ }
409
+
410
+ if ( empty( $this->options['ignore'] ) ) {
411
+ $this->options['ignore'] = '';
412
+ }
413
+
414
+ if ( empty( $this->options['customkey'] ) ) {
415
+ $this->options['customkey'] = '';
416
+ }
417
+
418
+ if ( empty( $this->options['cpt_char_limit'] ) ) {
419
+ $this->options['cpt_char_limit'] = '';
420
+ }
421
+
422
+ if ( empty( $this->options['tax_char_limit'] ) ) {
423
+ $this->options['tax_char_limit'] = '';
424
+ }
425
+
426
+ if ( ! isset( $this->options['link_limit'] ) ) {
427
+ $this->options['link_limit'] = '';
428
+ }
429
+
430
+ if ( ! isset( $this->options['single_link_limit'] ) ) {
431
+ $this->options['single_link_limit'] = '';
432
+ }
433
+
434
+ if ( is_multisite() && SMARTCRAWL_SITEWIDE ) {
435
+ update_site_option( $this->option_name, $this->options );
436
+ } else {
437
+ update_option( $this->option_name, $this->options );
438
+ }
439
+ }
440
+
441
+ /**
442
+ * Saves redirects part of the input
443
+ *
444
+ * @param array $input Raw input.
445
+ */
446
+ public function save_redirects( $input ) {
447
+ $urls = ! empty( $input['urls'] ) && is_array( $input['urls'] )
448
+ ? $input['urls']
449
+ : array();
450
+ $redirection_model = new Smartcrawl_Model_Redirection;
451
+
452
+ $new_urls = array();
453
+ $new_types = array();
454
+ foreach ( $urls as $index => $url_details ) {
455
+ $source = smartcrawl_get_array_value( $url_details, 'source' );
456
+ $source = trim( esc_url( $source ) );
457
+
458
+ $destination = smartcrawl_get_array_value( $url_details, 'destination' );
459
+ $destination = trim( esc_url( $destination ) );
460
+
461
+ if ( ! trim( $source ) || ! trim( $destination ) ) {
462
+ continue;
463
+ }
464
+ if ( ! preg_match( '/^https?:\/\//', $source ) ) { $source = home_url( $source ); }
465
+ if ( ! preg_match( '/^https?:\/\//', $destination ) ) { $destination = home_url( $destination ); }
466
+
467
+ $new_urls[ $source ] = $destination;
468
+
469
+ $type = smartcrawl_get_array_value( $url_details, 'type' );
470
+ $status = $redirection_model->get_valid_redirection_status_type( $type );
471
+
472
+ $new_types[ $source ] = $status;
473
+ }
474
+ $redirection_model->set_all_redirections( $new_urls );
475
+ $redirection_model->set_all_redirection_types( $new_types );
476
+ }
477
+
478
+ /**
479
+ * Gets site service instance
480
+ *
481
+ * @return object
482
+ */
483
+ private function get_site_service() {
484
+ if ( ! class_exists( 'Smartcrawl_Service' ) ) {
485
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'core/class_wds_service.php' );
486
+ }
487
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SITE );
488
+ return $service;
489
+ }
490
+
491
+ }
492
+
includes/admin/settings/checkup.php ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Checkup service
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ /**
9
+ * Checkup service admin handler class
10
+ */
11
+ class Smartcrawl_Checkup_Settings extends Smartcrawl_Settings_Admin {
12
+
13
+ /**
14
+ * Singleton instance
15
+ *
16
+ * @var Smartcrawl_Checkup_Settings
17
+ */
18
+ private static $_instance;
19
+
20
+ /**
21
+ * Singleton instance getter
22
+ *
23
+ * @return Smartcrawl_Checkup_Settings instance
24
+ */
25
+ public static function get_instance() {
26
+ if ( empty( self::$_instance ) ) {
27
+ self::$_instance = new self;
28
+ }
29
+ return self::$_instance;
30
+ }
31
+
32
+ /**
33
+ * Validate submitted options
34
+ *
35
+ * @param array $input Raw input.
36
+ *
37
+ * @return array Validated input
38
+ */
39
+ public function validate( $input ) {
40
+ if ( empty( $input['checkup-cron-enable'] ) ) {
41
+ $result['checkup-cron-enable'] = false;
42
+ return $result;
43
+ } else { $result['checkup-cron-enable'] = true; }
44
+
45
+ $frequency = ! empty( $input['checkup-frequency'] )
46
+ ? Smartcrawl_Controller_Cron::get()->get_valid_frequency( $input['checkup-frequency'] )
47
+ : Smartcrawl_Controller_Cron::get()->get_default_frequency();
48
+ $result['checkup-frequency'] = $frequency;
49
+
50
+ $dow = isset( $input['checkup-dow'] ) && is_numeric( $input['checkup-dow'] )
51
+ ? (int) $input['checkup-dow']
52
+ : 0
53
+ ;
54
+ $result['checkup-dow'] = in_array( $dow, range( 0,6 ) ) ? $dow : 0;
55
+
56
+ $tod = isset( $input['checkup-tod'] ) && is_numeric( $input['checkup-tod'] )
57
+ ? (int) $input['checkup-tod']
58
+ : 0
59
+ ;
60
+ $result['checkup-tod'] = in_array( $tod, range( 0,23 ) ) ? $tod : 0;
61
+
62
+ if ( ! empty( $input['email-recipients'] ) && is_array( $input['email-recipients'] ) ) {
63
+ $result['email-recipients'] = array();
64
+ foreach ( $input['email-recipients'] as $user ) {
65
+ if ( ! is_numeric( $user ) ) {
66
+ $user_obj = get_user_by( 'login', $user );
67
+ $user = $user_obj->ID;
68
+ }
69
+
70
+ if ( is_numeric( $user ) ) { $result['email-recipients'][] = (int) $user; }
71
+ }
72
+ $result['email-recipients'] = array_values( array_filter( array_unique( $result['email-recipients'] ) ) );
73
+ }
74
+ if ( empty( $result['email-recipients'] ) ) {
75
+ $defaults = $this->get_default_options();
76
+ $result['email-recipients'] = $defaults['email-recipients'];
77
+ }
78
+
79
+ return $result;
80
+ }
81
+
82
+ /**
83
+ * Initialize admin pane
84
+ */
85
+ public function init() {
86
+ $this->option_name = 'wds_checkup_options';
87
+ $this->name = Smartcrawl_Settings::COMP_CHECKUP;
88
+ $this->slug = Smartcrawl_Settings::TAB_CHECKUP;
89
+ $this->action_url = admin_url( 'options.php' );
90
+ $this->title = __( 'SEO Checkup', 'wds' );
91
+ $this->page_title = __( 'SmartCrawl Wizard: SEO Checkup', 'wds' );
92
+
93
+ parent::init();
94
+
95
+ add_action( 'wp_ajax_wds-checkup-status', array( $this, 'ajax_checkup_status' ) );
96
+ }
97
+
98
+ /**
99
+ * Checks checkup service status and sends back percentage.
100
+ */
101
+ public function ajax_checkup_status() {
102
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_CHECKUP );
103
+ $percentage = $service->status();
104
+ return wp_send_json_success(array(
105
+ 'percentage' => $percentage,
106
+ ));
107
+ }
108
+
109
+ /**
110
+ * Process run action
111
+ */
112
+ public function process_run_action() {
113
+ if ( ! empty( $_GET['run-checkup'] ) ) { // Simple presence switch, no value.
114
+ return $this->run_checkup();
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Add admin settings page
120
+ */
121
+ public function options_page() {
122
+ parent::options_page();
123
+
124
+ $options = Smartcrawl_Settings::get_component_options( $this->name );
125
+ $options = wp_parse_args(
126
+ (is_array( $options ) ? $options : array()),
127
+ $this->get_default_options()
128
+ );
129
+
130
+ $arguments = array(
131
+ 'options' => $options,
132
+ 'active_tab' => $this->_get_last_active_tab( 'tab_checkup' ),
133
+ );
134
+
135
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_CHECKUP );
136
+ wp_enqueue_script( 'wds-admin-checkup' );
137
+
138
+ $this->_render_page( 'checkup/checkup-settings', $arguments );
139
+ }
140
+
141
+ /**
142
+ * Gets default options set and their initial values
143
+ *
144
+ * @return array
145
+ */
146
+ public function get_default_options() {
147
+ return array(
148
+ 'checkup-cron-enable' => false,
149
+ 'checkup-frequency' => 'weekly',
150
+ 'checkup-dow' => rand( 0, 6 ),
151
+ 'checkup-tod' => rand( 0, 23 ),
152
+ 'email-recipients' => array( get_current_user_id() ),
153
+ );
154
+ }
155
+
156
+ /**
157
+ * Default settings
158
+ */
159
+ public function defaults() {
160
+ $options = Smartcrawl_Settings::get_component_options( $this->name );
161
+ $options = is_array( $options ) ? $options : array();
162
+
163
+ foreach ( $this->get_default_options() as $opt => $default ) {
164
+ if ( ! isset( $options[ $opt ] ) ) { $options[ $opt ] = $default; }
165
+ }
166
+
167
+ if ( is_multisite() && SMARTCRAWL_SITEWIDE ) {
168
+ update_site_option( $this->option_name, $options );
169
+ } else {
170
+ update_option( $this->option_name, $options );
171
+ }
172
+ }
173
+
174
+ }
175
+
includes/admin/settings/dashboard.php ADDED
@@ -0,0 +1,604 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Smartcrawl_Settings_Dashboard extends Smartcrawl_Settings_Admin {
4
+
5
+ const CRAWL_TIMEOUT_CODE = 'crawl_timeout';
6
+ const BOX_SOCIAL = 'wds-social-dashboard-box';
7
+ const BOX_ADVANCED_TOOLS = 'wds-advanced-tools-dashboard-box';
8
+ const BOX_ONPAGE = 'wds-title-and-meta-dashboard-box';
9
+ const BOX_CONTENT_ANALYSIS = 'wds-content-analysis-box';
10
+ const BOX_SITEMAP = 'wds-sitemap-box';
11
+ const BOX_SEO_CHECKUP = 'wds-seo-checkup';
12
+ const BOX_TOP_STATS = 'wds-dashboard-stats';
13
+
14
+ protected $_seo_service;
15
+ protected $_uptime_service;
16
+
17
+ private static $_instance;
18
+
19
+ public static function get_instance() {
20
+ if ( empty( self::$_instance ) ) {
21
+ self::$_instance = new self;
22
+ }
23
+ return self::$_instance;
24
+ }
25
+
26
+ public function validate( $input ) {
27
+ return $inpt; }
28
+
29
+ public function init() {
30
+ $this->slug = Smartcrawl_Settings::TAB_DASHBOARD;
31
+ $this->title = __( 'SmartCrawl', 'wds' );
32
+ $this->sub_title = __( 'Dashboard', 'wds' );
33
+ $this->page_title = __( 'SmartCrawl Wizard: Dashboard', 'wds' );
34
+
35
+ add_action( 'wp_ajax_wds-service-start', array( $this, 'json_service_start' ) );
36
+ add_action( 'wp_ajax_wds-service-status', array( $this, 'json_service_status' ) );
37
+ add_action( 'wp_ajax_wds-service-result', array( $this, 'json_service_result' ) );
38
+
39
+ add_action( 'wp_ajax_wds-service-redirect', array( $this, 'json_service_redirect' ) );
40
+ add_action( 'wp_ajax_wds-service-ignore', array( $this, 'json_service_ignore' ) );
41
+ add_action( 'wp_ajax_wds-service-unignore', array( $this, 'json_service_unignore' ) );
42
+ add_action( 'wp_ajax_wds-service-ignores-purge', array( $this, 'json_service_ignores_purge' ) );
43
+
44
+ add_action( 'wp_ajax_wds-service-update_sitemap', array( $this, 'json_service_update_sitemap' ) );
45
+ add_action( 'wp_ajax_wds-activate-component', array( $this, 'json_activate_component' ) );
46
+ add_action( 'wp_ajax_wds-reload-box', array( $this, 'json_reload_component' ) );
47
+
48
+ parent::init();
49
+ }
50
+
51
+ /**
52
+ * Handles service ignores addition
53
+ */
54
+ public function json_service_ignore() {
55
+ $result = array( 'status' => 0 );
56
+ if ( ! current_user_can( 'manage_options' ) ) { return wp_send_json( $result ); }
57
+
58
+ if ( ! class_exists( 'Smartcrawl_Model_Ignores' ) ) { require_once( SMARTCRAWL_PLUGIN_DIR . 'core/class_wds_model_ignores.php' ); }
59
+ $ignores = new Smartcrawl_Model_Ignores;
60
+
61
+ $data = stripslashes_deep( $_POST );
62
+ if ( empty( $data['issue_id'] ) ) { return wp_send_json( $result ); }
63
+
64
+ $issue_id = $data['issue_id'];
65
+ $issue_ids = is_array( $issue_id )
66
+ ? array_map( 'sanitize_text_field', $issue_id )
67
+ : array( sanitize_text_field( $issue_id ) )
68
+ ;
69
+
70
+ foreach ( $issue_ids as $issue ) {
71
+ $ignores->set_ignore( $issue );
72
+ }
73
+
74
+ // Send updated list to Hub
75
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SEO );
76
+ if ( ! $service->sync_ignores() ) {
77
+ Smartcrawl_Logger::debug( 'We encountered an error syncing ignores with Hub' );
78
+ }
79
+
80
+ $result['status'] = 1;
81
+ return wp_send_json( $result );
82
+ }
83
+
84
+ /**
85
+ * Handles service un-ignores addition
86
+ */
87
+ public function json_service_unignore() {
88
+ $result = array( 'status' => 0 );
89
+ if ( ! current_user_can( 'manage_options' ) ) {
90
+ wp_send_json( $result );
91
+ return;
92
+ }
93
+
94
+ if ( ! class_exists( 'Smartcrawl_Model_Ignores' ) ) { require_once( SMARTCRAWL_PLUGIN_DIR . 'core/class_wds_model_ignores.php' ); }
95
+ $ignores = new Smartcrawl_Model_Ignores;
96
+
97
+ $data = stripslashes_deep( $_POST );
98
+ if ( empty( $data['issue_id'] ) ) {
99
+ wp_send_json( $result );
100
+ return;
101
+ }
102
+
103
+ $issue_id = $data['issue_id'];
104
+ $issue_ids = is_array( $issue_id )
105
+ ? array_map( 'sanitize_text_field', $issue_id )
106
+ : array( sanitize_text_field( $issue_id ) )
107
+ ;
108
+
109
+ foreach ( $issue_ids as $issue ) {
110
+ $ignores->unset_ignore( $issue );
111
+ }
112
+
113
+ // Send updated list to Hub
114
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SEO );
115
+ if ( ! $service->sync_ignores() ) {
116
+ Smartcrawl_Logger::debug( 'We encountered an error syncing ignores with Hub' );
117
+ }
118
+
119
+ $result['status'] = 1;
120
+ wp_send_json( $result );
121
+ }
122
+
123
+ /**
124
+ * Handles service ignores purging
125
+ */
126
+ public function json_service_ignores_purge() {
127
+ $result = array( 'status' => 0 );
128
+ if ( ! current_user_can( 'manage_options' ) ) { return wp_send_json( $result ); }
129
+
130
+ if ( ! class_exists( 'Smartcrawl_Model_Ignores' ) ) { require_once( SMARTCRAWL_PLUGIN_DIR . 'core/class_wds_model_ignores.php' ); }
131
+ $ignores = new Smartcrawl_Model_Ignores;
132
+
133
+ if ( $ignores->clear() ) {
134
+ // Send updated list to Hub
135
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SEO );
136
+ if ( ! $service->sync_ignores() ) {
137
+ Smartcrawl_Logger::debug( 'We encountered an error syncing ignores with Hub' );
138
+ }
139
+
140
+ $result['status'] = 1;
141
+ }
142
+
143
+ return wp_send_json( $result );
144
+ }
145
+
146
+ /**
147
+ * Handles sitemap updating requests
148
+ */
149
+ public function json_service_update_sitemap() {
150
+ $result = array();
151
+ $controller = Smartcrawl_Controller_Sitemap::get();
152
+
153
+ // First up, find out how much stuff we got in the sitemap
154
+ $data = $controller->get_sitemap_stats();
155
+ $previous_count = ! empty( $data['items'] ) && is_numeric( $data['items'] )
156
+ ? (int) $data['items']
157
+ : 0
158
+ ;
159
+
160
+ // Update sitemap
161
+ $controller->update_sitemap();
162
+
163
+ // Get fresh count
164
+ $data = $controller->get_sitemap_stats();
165
+ $current_count = ! empty( $data['items'] ) && is_numeric( $data['items'] )
166
+ ? (int) $data['items']
167
+ : 0
168
+ ;
169
+
170
+ $diff = (int) ($current_count - $previous_count);
171
+
172
+ // Let's clear up the sitemap service results
173
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SEO );
174
+ $cres = $service->get_result();
175
+ if ( isset( $cres['issues'] ) ) {
176
+ $cres['issues']['sitemap'] = ! empty( $cres['issues']['sitemap'] )
177
+ ? $cres['issues']['sitemap']
178
+ : 0
179
+ ;
180
+ $cres['issues']['sitemap'] = 0;
181
+ if ( isset( $cres['issues']['issues'] ) ) { $cres['issues']['issues']['sitemap'] = 0; // Fix data model deviation
182
+ } $cres['issues']['messages'] = ! empty( $cres['issues']['messages'] )
183
+ ? $cres['issues']['messages']
184
+ : array()
185
+ ;
186
+ // Start with a generic message
187
+ $msg = __( 'Sitemap updated. Please, re-crawl your site', 'wds' );
188
+ if ( $diff > 0 ) {
189
+ sprintf(
190
+ __( 'We just updated your sitemap adding %1$d new items, for a total of %2$d. Please, re-crawl your site', 'wds' ),
191
+ $diff,
192
+ $current_count
193
+ );
194
+ } elseif ( $diff < 0 ) {
195
+ sprintf(
196
+ __( 'No new items were added to your sitemap, but we did detect a change (for %1$d items total). Please, re-crawl your site.', 'wds' ),
197
+ $current_count
198
+ );
199
+ }
200
+
201
+ if ( ! in_array( $msg, $cres['issues']['messages'] ) ) { $cres['issues']['messages'][] = $msg; }
202
+ $service->set_result( $cres );
203
+ }
204
+
205
+ $result = array(
206
+ 'previous' => $previous_count,
207
+ 'current' => $current_count,
208
+ 'diff' => $diff,
209
+ );
210
+
211
+ wp_send_json( $result );
212
+ }
213
+
214
+ /**
215
+ * Handles service redirect requests
216
+ */
217
+ public function json_service_redirect() {
218
+ $data = stripslashes_deep( $_POST );
219
+ $result = array();
220
+
221
+ if (
222
+ empty( $data['source'] ) ||
223
+ empty( $data['redirect'] ) ||
224
+ empty( $data['wds-redirect'] )
225
+ ) { wp_send_json_error( $result ); }
226
+
227
+ if ( ! wp_verify_nonce( $_POST['wds-redirect'], 'wds-redirect' ) ) { wp_send_json_error( $result ); }
228
+
229
+ $is_sitewide = is_multisite() && defined( 'SMARTCRAWL_SITEWIDE' ) && SMARTCRAWL_SITEWIDE;
230
+
231
+ $permissions = $is_sitewide ? 'manage_network_options' : 'manage_options';
232
+ if ( ! current_user_can( $permissions ) ) { wp_send_json_error( $result ); }
233
+
234
+ $source = esc_url( $data['source'] );
235
+ $redirect = esc_url( $data['redirect'] );
236
+ $rmodel = new Smartcrawl_Model_Redirection;
237
+
238
+ $status_code = $rmodel->get_default_redirection_status_type();
239
+
240
+ // Set both redirection and default status code
241
+ $result['status'] = $rmodel->set_redirection( $source, $redirect ) && $rmodel->set_redirection_type( $source, $status_code );
242
+
243
+ wp_send_json( $result );
244
+ }
245
+
246
+ /**
247
+ * Handle service crawl start request
248
+ */
249
+ public function json_service_start() {
250
+ $service = $this->_get_seo_service();
251
+ $result = $service->start();
252
+
253
+ if ( true === $result ) {
254
+ $result = $service->status();
255
+ }
256
+
257
+ $result = ! empty( $result ) && is_array( $result )
258
+ ? $result
259
+ : array()
260
+ ;
261
+
262
+ $error = empty( $result ) || ! empty( $result['code'] );
263
+ if ( ! empty( $error ) ) {
264
+ if ( empty( $result ) ) {
265
+ $msgs = $service->get_errors();
266
+ if ( ! empty( $msgs ) ) { $result['message'] = join( ' ', $msgs ); }
267
+ }
268
+ $service->stop();
269
+ $result = array(
270
+ 'success' => false,
271
+ 'code' => ! empty( $result['code'] ) ? $result['code'] : false,
272
+ 'message' => ! empty( $result['message'] ) ? $result['message'] : false,
273
+ );
274
+ }
275
+
276
+ wp_send_json( $result );
277
+ }
278
+
279
+ /**
280
+ * Handle service crawl status request
281
+ */
282
+ public function json_service_status() {
283
+ $service = $this->_get_seo_service();
284
+ $result = $service->status();
285
+
286
+ $result = ! empty( $result ) && is_array( $result )
287
+ ? $result
288
+ : array()
289
+ ;
290
+ $error = empty( $result ) || ! empty( $result['code'] );
291
+ if ( ! empty( $error ) ) {
292
+ if ( empty( $result ) ) {
293
+ $msgs = $service->get_errors();
294
+ if ( ! empty( $msgs ) ) { $result['message'] = join( ' ', $msgs ); }
295
+ }
296
+ $code = ! empty( $result['code'] ) ? $result['code'] : false;
297
+ $msg = ! empty( $result['message'] ) ? $result['message'] : false;
298
+
299
+ // Crawl timed out, let's force the result now
300
+ if ( $code && self::CRAWL_TIMEOUT_CODE === $code ) {
301
+ $service->result();
302
+ }
303
+
304
+ $result = array(
305
+ 'success' => false,
306
+ 'code' => $code,
307
+ 'message' => $msg,
308
+ );
309
+ }
310
+
311
+ wp_send_json( $result );
312
+ }
313
+
314
+ /**
315
+ * Handle service crawl result request
316
+ */
317
+ public function json_service_result() {
318
+ $service = $this->_get_seo_service();
319
+ $result = $service->result();
320
+
321
+ $result = ! empty( $result ) && is_array( $result )
322
+ ? $result
323
+ : array()
324
+ ;
325
+ $error = empty( $result ) || ! empty( $result['code'] );
326
+ if ( ! empty( $error ) ) {
327
+ if ( empty( $result ) ) {
328
+ $msgs = $service->get_errors();
329
+ if ( ! empty( $msgs ) ) { $result['message'] = join( ' ', $msgs ); }
330
+ }
331
+ $result = array(
332
+ 'success' => false,
333
+ 'code' => ! empty( $result['code'] ) ? $result['code'] : false,
334
+ 'message' => ! empty( $result['message'] ) ? $result['message'] : false,
335
+ );
336
+ }
337
+
338
+ wp_send_json( $result );
339
+ }
340
+
341
+ public function json_activate_component() {
342
+ $result = array( 'success' => false );
343
+ $data = stripslashes_deep( $_POST );
344
+
345
+ $option_id = sanitize_key( smartcrawl_get_array_value( $data, 'option' ) );
346
+ $flag = sanitize_key( smartcrawl_get_array_value( $data, 'flag' ) );
347
+
348
+ if ( is_null( $option_id ) || is_null( $flag ) ) {
349
+ wp_send_json( $result );
350
+ return;
351
+ }
352
+
353
+ $options = self::get_specific_options( $option_id );
354
+ $options[ $flag ] = true;
355
+ self::update_specific_options( $option_id, $options );
356
+
357
+ $result['success'] = true;
358
+ wp_send_json( $result );
359
+ }
360
+
361
+ function json_reload_component() {
362
+ $result = array( 'success' => false );
363
+ $data = stripslashes_deep( $_POST );
364
+
365
+ $box_id = smartcrawl_get_array_value( $data, 'box_id' );
366
+
367
+ if ( is_null( $box_id ) ) {
368
+ wp_send_json( $result );
369
+ return;
370
+ }
371
+
372
+ if ( ! is_array( $box_id ) ) {
373
+ $box_id = array( $box_id );
374
+ }
375
+ $box_id = array_map( 'sanitize_key', $box_id );
376
+
377
+ $box_id = array_unique( $box_id );
378
+
379
+ foreach ( $box_id as $id ) {
380
+ $result[ $id ] = $this->load_box_markup( $id );
381
+ }
382
+
383
+ $result['success'] = true;
384
+ wp_send_json( $result );
385
+ }
386
+
387
+ function load_box_markup( $box_id ) {
388
+ switch ( $box_id ) {
389
+ case self::BOX_SOCIAL:
390
+ return $this->_load( 'dashboard/dashboard-widget-social' );
391
+
392
+ case self::BOX_ADVANCED_TOOLS:
393
+ return $this->_load( 'dashboard/dashboard-widget-advanced-tools' );
394
+
395
+ case self::BOX_ONPAGE:
396
+ return $this->_load( 'dashboard/dashboard-widget-onpage' );
397
+
398
+ case self::BOX_CONTENT_ANALYSIS:
399
+ return $this->_load( 'dashboard/dashboard-widget-content-analysis' );
400
+
401
+ case self::BOX_SITEMAP:
402
+ return $this->_load( 'dashboard/dashboard-widget-sitemap' );
403
+
404
+ case self::BOX_SEO_CHECKUP:
405
+ return $this->_load( 'dashboard/dashboard-widget-seo-checkup' );
406
+
407
+ case self::BOX_TOP_STATS:
408
+ return $this->_load( 'dashboard/dashboard-top' );
409
+ };
410
+
411
+ return null;
412
+ }
413
+
414
+ /**
415
+ * Process run action
416
+ *
417
+ * @return void
418
+ */
419
+ public function process_run_action() {
420
+ if ( ! empty( $_GET['run-checkup'] ) ) { // Simple presence switch, no value.
421
+ return $this->run_checkup();
422
+ }
423
+ }
424
+
425
+ /**
426
+ * Add admin settings page
427
+ */
428
+ public function options_page() {
429
+ wp_enqueue_script( 'wds-admin-dashboard' );
430
+
431
+ $uptime = $this->_get_uptime_service();
432
+
433
+ $this->_render_page('dashboard/dashboard', array(
434
+ 'current_admin_url' => menu_page_url( $this->smartcrawl_page_hook ),
435
+ 'seo_message_box' => $this->_get_seo_service_message(),
436
+ 'uptime_message_box' => $this->_get_uptime_service_message(),
437
+ ));
438
+ }
439
+
440
+ /**
441
+ * Gets the SEO service box part
442
+ *
443
+ * @return string
444
+ */
445
+ private function _get_seo_service_message() {
446
+ $service = $this->_get_seo_service();
447
+ $msg = '';
448
+
449
+ // First up, can we access this at all?
450
+ if ( $service->can_access() ) {
451
+
452
+ // Okay, we can
453
+ if ( $service->has_dashboard() ) {
454
+ $result = $service->get_result();
455
+ $status = false;
456
+
457
+ // If we don't have perma-cached result,
458
+ // we issued a re-crawl. So, let's check where we're at
459
+ if ( empty( $result ) ) {
460
+ $status = $service->status();
461
+ $result = ! empty( $status['end'] )
462
+ ? $service->result()
463
+ : array()
464
+ ;
465
+ } else { $status = $result; }
466
+
467
+ if ( ! class_exists( 'Smartcrawl_SeoReport' ) ) { require_once( SMARTCRAWL_PLUGIN_DIR . 'core/class_wds_seo_report.php' ); }
468
+ $report = Smartcrawl_SeoReport::build( $result );
469
+
470
+ $rmodel = new Smartcrawl_Model_Redirection;
471
+
472
+ // We have Dashboard ready to go, we're connected and all
473
+ $msg = $this->_load('dashboard-dialog-has_dashboard-service_seo', array(
474
+ 'status' => $status,
475
+ 'has_result' => ! empty( $result ),
476
+ 'report' => $report,
477
+ 'redirections' => $rmodel->get_all_redirections(),
478
+ 'errors' => $service->get_errors(),
479
+ ));
480
+ } elseif ( $service->is_dahsboard_active() ) {
481
+ // Dashboard is active, but we're not connected
482
+ $msg = $this->_load( 'dashboard-dialog-not_logged_in-service_seo' );
483
+ } else {
484
+ // Dashboard not installed
485
+ // Can we even install?
486
+ if ( $service->can_install() ) { $msg = $this->_load( 'dashboard-dialog-not_installed-service_seo' ); }
487
+ }
488
+ }
489
+
490
+ return $msg;
491
+ }
492
+
493
+ /**
494
+ * Gets the Uptime service box part
495
+ *
496
+ * Temporarily disabled
497
+ *
498
+ * @return string
499
+ */
500
+ private function _get_uptime_service_message() {
501
+ // As per Asana task, temporarily disable uptime report
502
+ // See: https://app.asana.com/0/345574004857/277849197601097/
503
+ return false;
504
+
505
+ $service = $this->_get_uptime_service();
506
+ $msg = '';
507
+
508
+ // First up, can we access this at all?
509
+ if ( $service->can_access() ) {
510
+
511
+ // Okay, we can
512
+ if ( $service->is_dahsboard_active() ) {
513
+ // We have Dashboard active, good enough
514
+ $response = $service->request( 'day' );
515
+ $msg = $this->_load('dashboard-dialog-has_dashboard-service_uptime', array(
516
+ 'data' => $response,
517
+ 'errors' => $service->get_errors(),
518
+ ));
519
+ } else {
520
+ // Dashboard not installed
521
+ // Can we even install?
522
+ if ( $service->can_install() ) { $msg = $this->_load( 'dashboard-dialog-not_installed-service_uptime' ); }
523
+ }
524
+ }
525
+
526
+ return $msg;
527
+ }
528
+
529
+ /**
530
+ * Add sub page to the Settings Menu
531
+ */
532
+ public function add_page() {
533
+ if ( ! $this->_is_current_tab_allowed() ) { return false; }
534
+
535
+ $svg = '<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg width="18px" height="18px" xmlns="http://www.w3.org/2000/svg"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="Artboard" fill-rule="nonzero" fill="#FFFFFF"><path d="M0.558,12.1008055 L17.445,12.1008055 C16.1402452,15.6456454 12.7704642,18 9.0015,18 C5.23253577,18 1.86275481,15.6456454 0.558,12.1008055 Z M17.442,5.89919449 L0.555,5.89919449 C1.85975481,2.35435463 5.22953577,4.81675263e-16 8.9985,7.11236625e-16 C12.7674642,9.40797988e-16 16.1372452,2.35435463 17.442,5.89919449 Z M0.042,8 L17.958,8 C17.985,8.32740214 18,8.66192171 18,9 C18,9.33807829 17.985,9.66903915 17.958,10 L0.042,10 C0.018,9.66903915 0,9.33807829 0,9 C0,8.66192171 0.018,8.32740214 0.042,8 Z" id="smartcrawl"></path></g></g></svg>';
536
+ $icon = 'data:image/svg+xml;base64,' . base64_encode( $svg );
537
+
538
+ $this->smartcrawl_page_hook = add_menu_page(
539
+ $this->page_title,
540
+ $this->title,
541
+ $this->capability,
542
+ $this->slug,
543
+ array( &$this, 'options_page' ),
544
+ $icon
545
+ );
546
+
547
+ $this->smartcrawl_page_hook = add_submenu_page(
548
+ $this->slug,
549
+ $this->page_title,
550
+ $this->sub_title,
551
+ $this->capability,
552
+ $this->slug,
553
+ array( &$this, 'options_page' )
554
+ );
555
+
556
+ // For pages that can deal with run requests, let's make sure they
557
+ // actually do that early enough
558
+ if ( is_callable( array( $this, 'process_run_action' ) ) ) {
559
+ add_action( 'load-' . $this->smartcrawl_page_hook, array( $this, 'process_run_action' ) );
560
+ }
561
+
562
+ add_action( "admin_print_styles-{$this->smartcrawl_page_hook}", array( &$this, 'admin_styles' ) );
563
+ add_action( "admin_print_scripts-{$this->smartcrawl_page_hook}", array( &$this, 'admin_scripts' ) );
564
+ }
565
+
566
+ /**
567
+ * Default settings
568
+ */
569
+ public function defaults() {
570
+ $this->options = Smartcrawl_Settings::get_options();
571
+ }
572
+
573
+ /**
574
+ * Always allow dashboard tab if there's more than one tab allowed
575
+ *
576
+ * Overrides Smartcrawl_Settings::_is_current_tab_allowed
577
+ *
578
+ * @return bool
579
+ */
580
+ protected function _is_current_tab_allowed() {
581
+ if ( parent::_is_current_tab_allowed() ) { return true; }
582
+ // Else we always add dashboard if there are other pages
583
+ $all_tabs = Smartcrawl_Settings_Settings::get_blog_tabs();
584
+
585
+ return ! empty( $all_tabs );
586
+ }
587
+
588
+ protected function _get_seo_service() {
589
+ if ( ! empty( $this->_seo_service ) ) { return $this->_seo_service; }
590
+
591
+ $this->_seo_service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SEO );
592
+
593
+ return $this->_seo_service;
594
+ }
595
+
596
+ protected function _get_uptime_service() {
597
+ if ( ! empty( $this->_uptime_service ) ) { return $this->_uptime_service; }
598
+
599
+ $this->_uptime_service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_UPTIME );
600
+
601
+ return $this->_uptime_service;
602
+ }
603
+
604
+ }
includes/admin/settings/index.php ADDED
File without changes
includes/admin/settings/onpage.php ADDED
@@ -0,0 +1,660 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Smartcrawl_Onpage_Settings extends Smartcrawl_Settings_Admin {
4
+
5
+ private static $_instance;
6
+
7
+ public static function get_instance() {
8
+ if ( empty( self::$_instance ) ) {
9
+ self::$_instance = new self;
10
+ }
11
+ return self::$_instance;
12
+ }
13
+
14
+ /**
15
+ * Validate submitted options
16
+ *
17
+ * @param array $input Raw input
18
+ *
19
+ * @return array Validated input
20
+ */
21
+ public function validate( $input ) {
22
+ $result = array();
23
+
24
+ // Setup
25
+ if ( ! empty( $input['wds_onpage-setup'] ) ) { $result['wds_onpage-setup'] = true; }
26
+
27
+ // Meta robots
28
+ if ( ! empty( $input['meta_robots-noindex-main_blog_archive'] ) ) { $result['meta_robots-noindex-main_blog_archive'] = true; }
29
+ if ( ! empty( $input['meta_robots-nofollow-main_blog_archive'] ) ) { $result['meta_robots-nofollow-main_blog_archive'] = true; }
30
+ if ( ! empty( $input['meta_robots-main_blog_archive-subsequent_pages'] ) ) { $result['meta_robots-main_blog_archive-subsequent_pages'] = true; }
31
+
32
+ if ( ! empty( $input['meta_robots-noindex-search'] ) ) { $result['meta_robots-noindex-search'] = true; }
33
+ if ( ! empty( $input['meta_robots-nofollow-search'] ) ) { $result['meta_robots-nofollow-search'] = true; }
34
+
35
+ $tax_options = $this->_get_tax_options( '' );
36
+ foreach ( $tax_options as $option => $_tax ) {
37
+ $rbts = $this->get_robots_options_for( $option );
38
+ if ( ! empty( $rbts ) && is_array( $rbts ) ) { foreach ( array_keys( $rbts ) as $item ) {
39
+ if ( ! empty( $input[ $item ] ) ) { $result[ $item ] = true; }
40
+ }
41
+ }
42
+ }
43
+ $other_options = $this->_get_other_types_options( '' );
44
+ foreach ( $other_options as $option => $_tax ) {
45
+ $rbts = $this->get_robots_options_for( $option );
46
+ if ( ! empty( $rbts ) && is_array( $rbts ) ) { foreach ( array_keys( $rbts ) as $item ) {
47
+ if ( ! empty( $input[ $item ] ) ) { $result[ $item ] = true; }
48
+ }
49
+ }
50
+ }
51
+
52
+ // String values
53
+ $strings = array(
54
+ 'home',
55
+ 'search',
56
+ '404',
57
+ 'bp_groups',
58
+ 'bp_profile',
59
+ 'mp_marketplace-base',
60
+ 'mp_marketplace-categories',
61
+ 'mp_marketplace-tags',
62
+ );
63
+ foreach ( get_post_types( array( 'public' => true ) ) as $pt ) {
64
+ $strings[] = $pt;
65
+ // Allow post types robots noindex/nofollow
66
+ if ( isset( $input[ "meta_robots-noindex-{$pt}" ] ) ) { $result[ "meta_robots-noindex-{$pt}" ] = true; }
67
+ if ( isset( $input[ "meta_robots-nofollow-{$pt}" ] ) ) { $result[ "meta_robots-nofollow-{$pt}" ] = true; }
68
+ }
69
+ $strings = array_merge( $strings, array_values( $tax_options ) );
70
+ $strings = array_merge( $strings, array_values( $other_options ) );
71
+
72
+ foreach ( $strings as $str ) {
73
+ if ( isset( $input[ "title-{$str}" ] ) ) { $result[ "title-{$str}" ] = $this->_sanitize_preserve_macros( $input[ "title-{$str}" ] ); }
74
+ if ( isset( $input[ "metadesc-{$str}" ] ) ) { $result[ "metadesc-{$str}" ] = $this->_sanitize_preserve_macros( $input[ "metadesc-{$str}" ] ); }
75
+ if ( isset( $input[ "metakeywords-{$str}" ] ) ) { $result[ "metakeywords-{$str}" ] = $this->_sanitize_preserve_macros( $input[ "metakeywords-{$str}" ] ); }
76
+
77
+ // OpenGraph
78
+ if ( isset( $input[ "og-active-{$str}" ] ) ) {
79
+ $result[ "og-active-{$str}" ] = (boolean) $input[ "og-active-{$str}" ];
80
+ }
81
+ if ( isset( $input[ "og-title-{$str}" ] ) ) {
82
+ $result[ "og-title-{$str}" ] = $this->_sanitize_preserve_macros( $input[ "og-title-{$str}" ] );
83
+ }
84
+ if ( isset( $input[ "og-description-{$str}" ] ) ) {
85
+ $result[ "og-description-{$str}" ] = $this->_sanitize_preserve_macros( $input[ "og-description-{$str}" ] );
86
+ }
87
+
88
+ $result[ "og-images-{$str}" ] = array();
89
+ if ( ! empty( $input[ "og-images-{$str}" ] ) && is_array( $input[ "og-images-{$str}" ] ) ) {
90
+ foreach ( $input[ "og-images-{$str}" ] as $img ) {
91
+ $result[ "og-images-{$str}" ][] = esc_url( $img );
92
+ }
93
+ }
94
+ $result[ "og-images-{$str}" ] = array_values( array_filter( array_unique( $result[ "og-images-{$str}" ] ) ) );
95
+
96
+ // Twitter cards
97
+ if (isset($input["twitter-active-{$str}"])) {
98
+ $result["twitter-active-{$str}"] = (boolean)$input["twitter-active-{$str}"];
99
+ }
100
+ if (isset($input["twitter-title-{$str}"])) {
101
+ $result["twitter-title-{$str}"] = $this->_sanitize_preserve_macros($input["twitter-title-{$str}"]);
102
+ }
103
+ if (isset($input["twitter-description-{$str}"])) {
104
+ $result["twitter-description-{$str}"] = $this->_sanitize_preserve_macros($input["twitter-description-{$str}"]);
105
+ }
106
+
107
+ $result["twitter-images-{$str}"] = array();
108
+ if (!empty($input["twitter-images-{$str}"]) && is_array($input["twitter-images-{$str}"])) {
109
+ foreach ($input["twitter-images-{$str}"] as $img) {
110
+ $result["twitter-images-{$str}"][] = esc_url($img);
111
+ }
112
+ }
113
+ $result["twitter-images-{$str}"] = array_values(array_filter(array_unique($result["twitter-images-{$str}"])));
114
+ }
115
+
116
+ // Special case handling for home page keywords
117
+ // because the legacy one doesn't follow the naming convention
118
+ if ( isset( $input['keywords-home'] ) ) {
119
+ $result['keywords-home'] = $this->_sanitize_preserve_macros( $input['keywords-home'] );
120
+ }
121
+
122
+ $result['enable-author-archive'] = isset( $input['enable-author-archive'] )
123
+ ? (boolean) $input['enable-author-archive']
124
+ : false
125
+ ;
126
+ $result['enable-date-archive'] = isset( $input['enable-date-archive'] )
127
+ ? (boolean) $input['enable-date-archive']
128
+ : false
129
+ ;
130
+
131
+ if ( isset( $input['preset-separator'] ) ) {
132
+ $result['preset-separator'] = sanitize_text_field( $input['preset-separator'] );
133
+ }
134
+
135
+ if ( isset( $input['separator'] ) ) {
136
+ $result['separator'] = sanitize_text_field( $input['separator'] );
137
+ }
138
+
139
+ return $result;
140
+ }
141
+
142
+ /**
143
+ * Preserve macros in sanitization
144
+ *
145
+ * @param string $str String to sanitize
146
+ *
147
+ * @return string Sanitized string
148
+ */
149
+ private function _sanitize_preserve_macros( $str ) {
150
+ if ( empty( $str ) ) { return $str; }
151
+
152
+ $rpl = '__SMARTCRAWL_MACRO_QUOTES_REPLACEMENT__';
153
+ $str = preg_replace( '/%%/', $rpl, $str );
154
+
155
+ $str = sanitize_text_field( $str );
156
+
157
+ $str = preg_replace( '/' . preg_quote( $rpl, '/' ) . '/', '%%', $str );
158
+
159
+ return $str;
160
+ }
161
+
162
+ public function init() {
163
+ $this->option_name = 'wds_onpage_options';
164
+ $this->name = Smartcrawl_Settings::COMP_ONPAGE;
165
+ $this->slug = Smartcrawl_Settings::TAB_ONPAGE;
166
+ $this->action_url = admin_url( 'options.php' );
167
+ $this->title = __( 'Title & Meta', 'wds' );
168
+ $this->page_title = __( 'SmartCrawl Wizard: Title & Meta', 'wds' );
169
+
170
+ add_action( 'wp_ajax_wds-onpage-preview', array( $this, 'json_create_preview' ) );
171
+
172
+ parent::init();
173
+
174
+ }
175
+
176
+ /**
177
+ * Preview building handler
178
+ */
179
+ public function json_create_preview() {
180
+ $data = stripslashes_deep( $_POST );
181
+
182
+ $src_type = ! empty( $data['type'] ) ? sanitize_text_field( $data['type'] ) : false;
183
+ $src_title = ! empty( $data['title'] ) ? $this->_sanitize_preserve_macros( $data['title'] ) : false;
184
+ $src_meta = ! empty( $data['description'] ) ? $this->_sanitize_preserve_macros( $data['description'] ) : false;
185
+
186
+ $updated = false;
187
+
188
+ $link = home_url();
189
+ $title = get_bloginfo( 'name' );
190
+ $description = get_bloginfo( 'description' );
191
+
192
+ $warnings = array();
193
+
194
+ switch ( $src_type ) {
195
+ case 'search-page':
196
+ set_query_var( 's', 'Example search phrase' );
197
+ case 'author-archive':
198
+ set_query_var( 'author', get_current_user_id() );
199
+ case 'date-archive':
200
+ case 'homepage':
201
+ case '404-page':
202
+ $title = smartcrawl_replace_vars( $src_title );
203
+ $description = smartcrawl_replace_vars( $src_meta );
204
+ $updated = true;
205
+
206
+ if ( strlen( $title ) > SMARTCRAWL_TITLE_LENGTH_CHAR_COUNT_LIMIT ) {
207
+ $warnings['title'] = __( 'Your title seems to be a bit on the long side, consider trimming it', 'wds' );
208
+ }
209
+ if ( strlen( $description ) > SMARTCRAWL_METADESC_LENGTH_CHAR_COUNT_LIMIT ) {
210
+ $warnings['description'] = __( 'Your description seems to be a bit on the long side, consider trimming it', 'wds' );
211
+ }
212
+ break;
213
+
214
+ case 'bp-group':
215
+ $group = $this->_get_random_bp_group();
216
+ if ( ! empty( $group ) ) {
217
+ $title = smartcrawl_replace_vars( $src_title, (array) $group );
218
+ $description = smartcrawl_replace_vars( $src_meta, (array) $group );
219
+ $link = bp_get_group_permalink( $group );
220
+ }
221
+ $updated = true;
222
+ break;
223
+
224
+ case 'bp-profile':
225
+ $bp_profile_args = array(
226
+ 'full_name' => bp_get_loggedin_user_fullname(),
227
+ 'username' => bp_get_loggedin_user_username(),
228
+ );
229
+
230
+ $title = smartcrawl_replace_vars( $src_title, $bp_profile_args );
231
+ $description = smartcrawl_replace_vars( $src_meta, $bp_profile_args );
232
+ $link = bp_loggedin_user_domain();
233
+ $updated = true;
234
+ break;
235
+ }
236
+
237
+ // Custom post type?
238
+ if ( ! $updated ) {
239
+ foreach ( get_post_types( array( 'public' => true ) ) as $type ) {
240
+ if ( $type !== $src_type ) {
241
+ continue;
242
+ }
243
+
244
+ $updated = true;
245
+ $post = $this->_get_random_post( $type );
246
+ if ( ! empty( $post ) ) {
247
+ $title = smartcrawl_replace_vars( $src_title, $post );
248
+ $description = smartcrawl_replace_vars( $src_meta, $post );
249
+ $link = get_permalink( $post['ID'] );
250
+ }
251
+ }
252
+ }
253
+
254
+ // Custom taxonomy?
255
+ if ( ! $updated ) {
256
+ foreach ( get_taxonomies() as $tax ) {
257
+ if ( $tax !== $src_type ) {
258
+ continue;
259
+ }
260
+
261
+ $updated = true;
262
+ $term = $this->_get_random_term( $tax );
263
+ if ( ! empty( $term ) ) {
264
+ $title = smartcrawl_replace_vars( $src_title, $term );
265
+ $description = smartcrawl_replace_vars( $src_meta, $term );
266
+ $link = get_term_link( $term['term_id'], $tax );
267
+ }
268
+ }
269
+ }
270
+
271
+ wp_send_json(array(
272
+ 'status' => $updated,
273
+ 'markup' => $this->_load('onpage/onpage-preview', array(
274
+ 'link' => $link,
275
+ 'title' => $title,
276
+ 'description' => $description,
277
+ )),
278
+ 'warnings' => $warnings,
279
+ ));
280
+ }
281
+
282
+ /**
283
+ * Randomly spawns a post of certain post type
284
+ *
285
+ * @param string $type Post type
286
+ *
287
+ * @return array
288
+ */
289
+ private function _get_random_post( $type = 'post' ) {
290
+ $args = array(
291
+ 'posts_per_page' => 1,
292
+ 'post_type' => $type,
293
+ 'orderby' => 'random',
294
+ );
295
+ if ( 'attachment' === $type ) {
296
+ $args['post_status'] = 'any';
297
+ }
298
+ $q = new WP_Query( $args );
299
+ return ! empty( $q->post )
300
+ ? (array) $q->post
301
+ : array()
302
+ ;
303
+ }
304
+
305
+ /**
306
+ * Spawn a random taxonomy term for a tax type
307
+ *
308
+ * @param string $type Taxonomy type
309
+ *
310
+ * @return array
311
+ */
312
+ private function _get_random_term( $type = 'category' ) {
313
+ $terms = get_terms(
314
+ array(
315
+ 'taxonomy' => $type,
316
+ 'hide_empty' => 0,
317
+ )
318
+ );
319
+ if ( empty( $terms ) ) {
320
+ return array();
321
+ }
322
+
323
+ shuffle( $terms );
324
+ return (array) $terms[0];
325
+ }
326
+
327
+ /**
328
+ * Returns a set of known macros, as macro => description pairs
329
+ *
330
+ * @return array List of known macros
331
+ */
332
+ public static function get_macros() {
333
+ $macros = array(
334
+ '%%sep%%' => __( 'Separator', 'wds' ),
335
+ '%%date%%' => __( 'Date of the post/page', 'wds' ),
336
+ '%%title%%' => __( 'Title of the post/page', 'wds' ),
337
+ '%%sitename%%' => __( 'Site\'s name', 'wds' ),
338
+ '%%sitedesc%%' => __( 'Site\'s tagline / description', 'wds' ),
339
+ '%%excerpt%%' => __( 'Post/page excerpt (or auto-generated if it does not exist)', 'wds' ),
340
+ '%%excerpt_only%%' => __( 'Post/page excerpt (without auto-generation)', 'wds' ),
341
+ '%%tag%%' => __( 'Current tag/tags', 'wds' ),
342
+ '%%category%%' => __( 'Post categories (comma separated)', 'wds' ),
343
+ '%%category_description%%' => __( 'Category description', 'wds' ),
344
+ '%%tag_description%%' => __( 'Tag description', 'wds' ),
345
+ '%%term_description%%' => __( 'Term description', 'wds' ),
346
+ '%%term_title%%' => __( 'Term name', 'wds' ),
347
+ '%%modified%%' => __( 'Post/page modified time', 'wds' ),
348
+ '%%id%%' => __( 'Post/page ID', 'wds' ),
349
+ '%%name%%' => __( 'Post/page author\'s \'nicename\'', 'wds' ),
350
+ '%%userid%%' => __( 'Post/page author\'s userid', 'wds' ),
351
+ '%%searchphrase%%' => __( 'Current search phrase', 'wds' ),
352
+ '%%currenttime%%' => __( 'Current time', 'wds' ),
353
+ '%%currentdate%%' => __( 'Current date', 'wds' ),
354
+ '%%currentmonth%%' => __( 'Current month', 'wds' ),
355
+ '%%currentyear%%' => __( 'Current year', 'wds' ),
356
+ '%%page%%' => __( 'Current page number (i.e. page 2 of 4)', 'wds' ),
357
+ '%%pagetotal%%' => __( 'Current page total', 'wds' ),
358
+ '%%pagenumber%%' => __( 'Current page number', 'wds' ),
359
+ '%%caption%%' => __( 'Attachment caption', 'wds' ),
360
+ '%%spell_pagenumber%%' => __( 'Current page number, spelled out as numeral in English', 'wds' ),
361
+ '%%spell_pagetotal%%' => __( 'Current page total, spelled out as numeral in English', 'wds' ),
362
+ '%%spell_page%%' => __( 'Current page number, spelled out as numeral in English', 'wds' ),
363
+ );
364
+
365
+ if ( defined( 'BP_VERSION' ) ) {
366
+ $macros['%%bp_group_name%%'] = __( 'BuddyPress group name', 'wds' );
367
+ $macros['%%bp_group_description%%'] = __( 'BuddyPress group description', 'wds' );
368
+ $macros['%%bp_user_username%%'] = __( 'BuddyPress username', 'wds' );
369
+ $macros['%%bp_user_full_name%%'] = __( "BuddyPress user's full name", 'wds' );
370
+ }
371
+
372
+ return $macros;
373
+ }
374
+
375
+ /**
376
+ * Spawns a set of robots options for a given type
377
+ *
378
+ * @param string $type Archives type to generate the robots options for
379
+ * @param bool $include_subsequent_pages_option Whether to include the subsequent pages option.
380
+ *
381
+ * @return array Generated meta robots option array
382
+ */
383
+ public static function get_robots_options_for( $type, $include_subsequent_pages_option = true ) {
384
+ $options = array(
385
+ "meta_robots-noindex-{$type}" => array(
386
+ 'label' => __( 'Noindex', 'wds' ),
387
+ 'description' => __( 'Disabling indexing means that this content will not be indexed and searchable in search engines.', 'wds' ),
388
+ ),
389
+ "meta_robots-nofollow-{$type}" => array(
390
+ 'label' => __( 'Nofollow', 'wds' ),
391
+ 'description' => __( 'Disabling following means search engines will not follow and crawl links it finds in this content.', 'wds' ),
392
+ ),
393
+ );
394
+
395
+ if ( $include_subsequent_pages_option ) {
396
+ $options[ "meta_robots-{$type}-subsequent_pages" ] = array(
397
+ 'label' => __( 'Apply to all pages except the first', 'wds' ),
398
+ 'description' => __( 'If you select this option, the first page will be left alone, but the indexing settings will be applied to subsequent pages.', 'wds' ),
399
+ );
400
+ }
401
+
402
+ return $options;
403
+ }
404
+
405
+ /**
406
+ * Spawn taxonomy options and names, indexed by taxonomy option names
407
+ *
408
+ * @param string $pfx Prefix options with this
409
+ *
410
+ * @return array
411
+ */
412
+ protected function _get_tax_options( $pfx = '' ) {
413
+ $pfx = ! empty( $pfx ) ? rtrim( $pfx, '_' ) . '_' : $pfx;
414
+ $opts = array();
415
+ foreach ( get_taxonomies( array( '_builtin' => false ), 'objects' ) as $taxonomy ) {
416
+ $name = $pfx . str_replace( '-', '_', $taxonomy->name );
417
+ $opts[ $name ] = $taxonomy->name;
418
+ }
419
+ return $opts;
420
+ }
421
+
422
+ /**
423
+ * Spawn taxonomy options and names, indexed by taxonomy option names
424
+ *
425
+ * @param string $pfx Prefix options with this
426
+ *
427
+ * @return array
428
+ */
429
+ protected function _get_other_types_options( $pfx = '' ) {
430
+ $pfx = ! empty( $pfx ) ? rtrim( $pfx, '_' ) . '_' : $pfx;
431
+ $opts = array();
432
+ $other_types = array(
433
+ 'category',
434
+ 'post_tag',
435
+ 'author',
436
+ 'date',
437
+ );
438
+ foreach ( $other_types as $value ) {
439
+ $name = $pfx . $value;
440
+ $opts[ $name ] = $value;
441
+ }
442
+ return $opts;
443
+ }
444
+
445
+ /**
446
+ * Add admin settings page
447
+ */
448
+ public function options_page() {
449
+ parent::options_page();
450
+
451
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
452
+
453
+ $arguments = array(
454
+ 'macros' => self::get_macros(),
455
+ 'meta_robots_main_blog_archive' => self::get_robots_options_for( 'main_blog_archive' ),
456
+ );
457
+
458
+ foreach ( $this->_get_tax_options( 'meta_robots_' ) as $option => $tax ) {
459
+ $tax = str_replace( '-', '_', $tax );
460
+ if ( empty( $arguments[ $option ] ) ) { $arguments[ $option ] = self::get_robots_options_for( $tax ); }
461
+ }
462
+
463
+ foreach ( $this->_get_other_types_options( 'meta_robots_' ) as $option => $value ) {
464
+ if ( empty( $arguments[ $option ] ) ) { $arguments[ $option ] = self::get_robots_options_for( $value ); }
465
+ }
466
+
467
+ $arguments['meta_robots_search'] = self::get_robots_options_for( 'search', false );
468
+
469
+ // Allow for post type options
470
+ $arguments['post_robots'] = array(
471
+ 'attachment' => self::get_robots_options_for( 'attachment', false ),
472
+ );
473
+
474
+ $arguments['radio_options'] = array(
475
+ __( 'No', 'wds' ),
476
+ __( 'Yes', 'wds' ),
477
+ );
478
+
479
+ $arguments['engines'] = array(
480
+ 'ping-google' => __( 'Google', 'wds' ),
481
+ 'ping-bing' => __( 'Bing', 'wds' ),
482
+ );
483
+
484
+ $arguments['separators'] = smartcrawl_get_separators();
485
+
486
+ $arguments['show_homepage_options'] = $this->_show_homepage_options();
487
+ $arguments['homepage_title'] = $this->_get_homepage_title( $smartcrawl_options );
488
+ $arguments['homepage_description'] = $this->_get_homepage_description( $smartcrawl_options );
489
+
490
+ $arguments['active_tab'] = $this->_get_last_active_tab( 'tab_homepage' );
491
+
492
+ wp_enqueue_script( 'wds-admin-onpage' );
493
+ $this->_render_page( 'onpage/onpage-settings', $arguments );
494
+ }
495
+
496
+ /**
497
+ * Default settings
498
+ */
499
+ public function defaults() {
500
+
501
+ if ( is_multisite() && SMARTCRAWL_SITEWIDE ) {
502
+ $this->options = get_site_option( $this->option_name );
503
+ } else {
504
+ $this->options = get_option( $this->option_name );
505
+ }
506
+
507
+ if ( empty( $this->options['title-home'] ) ) {
508
+ $this->options['title-home'] = '%%sitename%%';
509
+ }
510
+
511
+ if ( empty( $this->options['metadesc-home'] ) ) {
512
+ $this->options['metadesc-home'] = '%%sitedesc%%';
513
+ }
514
+
515
+ if ( empty( $this->options['keywords-home'] ) ) {
516
+ $this->options['keywords-home'] = '';
517
+ }
518
+
519
+ if ( empty( $this->options['onpage-stylesheet'] ) ) {
520
+ $this->options['onpage-stylesheet'] = 0;
521
+ }
522
+
523
+ if ( empty( $this->options['onpage-dashboard-widget'] ) ) {
524
+ $this->options['onpage-dashboard-widget'] = 1;
525
+ }
526
+
527
+ if ( empty( $this->options['onpage-disable-automatic-regeneration'] ) ) {
528
+ $this->options['onpage-disable-automatic-regeneration'] = 0;
529
+ }
530
+
531
+ foreach ( get_post_types( array( 'public' => true ) ) as $posttype ) {
532
+ if ( in_array( $posttype, array( 'revision', 'nav_menu_item' ) ) ) { continue; }
533
+ if ( preg_match( '/^upfront_/', $posttype ) ) { continue; }
534
+
535
+ $type_obj = get_post_type_object( $posttype );
536
+ if ( ! is_object( $type_obj ) ) { continue; }
537
+
538
+ if ( empty( $this->options[ 'title-' . $posttype ] ) ) {
539
+ $this->options[ 'title-' . $posttype ] = '%%title%% %%sep%% %%sitename%%';
540
+ }
541
+
542
+ if ( empty( $this->options[ 'metadesc-' . $posttype ] ) ) {
543
+ $this->options[ 'metadesc-' . $posttype ] = '%%excerpt%%';
544
+ }
545
+ }
546
+
547
+ foreach ( get_taxonomies( array( '_builtin' => false ), 'objects' ) as $taxonomy ) {
548
+ if ( empty( $this->options[ 'title-' . $taxonomy->name ] ) ) {
549
+ $this->options[ 'title-' . $taxonomy->name ] = '';
550
+ }
551
+
552
+ if ( empty( $this->options[ 'metadesc-' . $taxonomy->name ] ) ) {
553
+ $this->options[ 'metadesc-' . $taxonomy->name ] = '';
554
+ }
555
+ }
556
+
557
+ $other_types = array(
558
+ 'category' => array( 'title' => '%%category%% %%sep%% %%sitename%%', 'desc' => '%%category_description%%' ),
559
+ 'post_tag' => array( 'title' => '%%tag%% %%sep%% %%sitename%%', 'desc' => '%%tag_description%%' ),
560
+ 'author' => array( 'title' => '%%name%% %%sep%% %%sitename%%', 'desc' => '' ),
561
+ 'date' => array( 'title' => '%%currentdate%% %%sep%% %%sitename%%', 'desc' => '' ),
562
+ 'search' => array( 'title' => '%%searchphrase%% %%sep%% %%sitename%%', 'desc' => '' ),
563
+ '404' => array( 'title' => 'Page not found %%sep%% %%sitename%%', 'desc' => '' ),
564
+ 'bp_groups' => array( 'title' => '%%bp_group_name%% %%sep%% %%sitename%%', 'desc' => '%%bp_group_description%%' ),
565
+ 'bp_profile' => array( 'title' => '%%bp_user_username%% %%sep%% %%sitename%%', 'desc' => '%%bp_user_full_name%%' ),
566
+ 'mp_marketplace-base' => array( 'title' => '', 'desc' => '' ),
567
+ 'mp_marketplace-categories' => array( 'title' => '', 'desc' => '' ),
568
+ 'mp_marketplace-tags' => array( 'title' => '', 'desc' => '' ),
569
+ );
570
+
571
+ foreach ( $other_types as $key => $value ) {
572
+ if ( empty( $this->options[ 'title-' . $key ] ) ) {
573
+ $this->options[ 'title-' . $key ] = $value['title'];
574
+ }
575
+
576
+ if ( empty( $this->options[ 'metadesc-' . $key ] ) ) {
577
+ $this->options[ 'metadesc-' . $key ] = $value['desc'];
578
+ }
579
+ }
580
+
581
+ if ( ! isset( $this->options['preset-separator'] ) ) {
582
+ $this->options['preset-separator'] = 'pipe';
583
+ }
584
+
585
+ if ( ! isset( $this->options['separator'] ) ) {
586
+ $this->options['separator'] = '';
587
+ }
588
+
589
+ if ( ! isset( $this->options['enable-author-archive'] ) ) {
590
+ $this->options['enable-author-archive'] = true;
591
+ }
592
+
593
+ if ( ! isset( $this->options['enable-date-archive'] ) ) {
594
+ $this->options['enable-date-archive'] = true;
595
+ }
596
+
597
+ if ( is_multisite() && SMARTCRAWL_SITEWIDE ) {
598
+ update_site_option( $this->option_name, $this->options );
599
+ } else {
600
+ update_option( $this->option_name, $this->options );
601
+ }
602
+
603
+ }
604
+
605
+ private function _show_homepage_options() {
606
+ if ( is_multisite() ) {
607
+ $show_homepage_options = SMARTCRAWL_SITEWIDE || 'posts' == get_site_option( 'show_on_front' );
608
+ } else {
609
+ $show_homepage_options = 'posts' == get_option( 'show_on_front' );
610
+ }
611
+
612
+ return $show_homepage_options;
613
+ }
614
+
615
+ private function _get_homepage_title( $options ) {
616
+ $front_page_id = (int) get_option( 'page_on_front' );
617
+
618
+ if ( ! $this->_show_homepage_options() && $front_page_id ) {
619
+
620
+ $homepage_title = smartcrawl_get_value( 'title', $front_page_id );
621
+ if ( empty( $homepage_title ) ) {
622
+ $front_page = get_post( $front_page_id );
623
+ $homepage_title = $front_page->post_title;
624
+ }
625
+
626
+ return $homepage_title;
627
+ } else {
628
+ return $options['title-home'];
629
+ }
630
+ }
631
+
632
+ private function _get_homepage_description( $options ) {
633
+ $front_page_id = (int) get_option( 'page_on_front' );
634
+
635
+ if ( ! $this->_show_homepage_options() && $front_page_id ) {
636
+ $homepage_description = smartcrawl_get_value( 'metadesc', $front_page_id );
637
+ if ( empty( $homepage_description ) ) {
638
+ $front_page = get_post( $front_page_id );
639
+ $homepage_description = substr( strip_tags( $front_page->post_content ), 0, 130 );
640
+ }
641
+
642
+ return $homepage_description;
643
+ } else {
644
+ return $options['metadesc-home'];
645
+ }
646
+ }
647
+
648
+ private function _get_random_bp_group() {
649
+ $groups = groups_get_groups(array(
650
+ 'orderby' => 'random',
651
+ 'per_page' => 1,
652
+ ));
653
+
654
+ $total = isset( $groups['total'] ) ? $groups['total'] : 0;
655
+ $groups = isset( $groups['groups'] ) ? $groups['groups'] : array();
656
+
657
+ return $total > 0 ? $groups[0] : null;
658
+ }
659
+ }
660
+
includes/admin/settings/redirections.php ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Smartcrawl_Settings_Redirections extends Smartcrawl_Settings_Admin {
4
+
5
+
6
+ private static $_instance;
7
+
8
+ public static function get_instance() {
9
+ if ( empty( self::$_instance ) ) {
10
+ self::$_instance = new self;
11
+ }
12
+ return self::$_instance;
13
+ }
14
+
15
+ public function validate( $input ) {
16
+ $result = array();
17
+ $urls = ! empty( $input['urls'] ) && is_array( $input['urls'] )
18
+ ? $input['urls']
19
+ : array()
20
+ ;
21
+ $bulk_action = ! empty( $input['bulk_action'] ) && in_array( $input['bulk_action'], array( 'delete', 'redirect_301', 'redirect_302' ) )
22
+ ? $input['bulk_action']
23
+ : false
24
+ ;
25
+ $bulk = array();
26
+ if ( ! empty( $bulk_action ) ) {
27
+ $bulk = ! empty( $input['bulk'] ) && is_array( $input['bulk'] )
28
+ ? $input['bulk']
29
+ : array()
30
+ ;
31
+ }
32
+ $types = ! empty( $input['types'] ) && is_array( $input['types'] )
33
+ ? $input['types']
34
+ : array()
35
+ ;
36
+ $rmodel = new Smartcrawl_Model_Redirection;
37
+
38
+ $raw = $rmodel->get_all_redirections();
39
+ $rtypes = $rmodel->get_all_redirection_types();
40
+ foreach ( $urls as $source => $redir ) {
41
+ $source = esc_url( $source );
42
+ $redir = esc_url( $redir );
43
+ if ( 'delete' === $bulk_action ) {
44
+ if ( in_array( $source, $bulk ) ) {
45
+ if ( ! empty( $raw[ $source ] ) ) { unset( $raw[ $source ] ); }
46
+ if ( ! empty( $type[ $source ] ) ) { unset( $rtypes[ $source ] ); }
47
+ continue;
48
+ }
49
+ }
50
+ if ( ! preg_match( '/^https?:\/\//', $source ) ) { $source = home_url( $source ); }
51
+ if ( ! preg_match( '/^https?:\/\//', $redir ) ) { $redir = home_url( $redir ); }
52
+ $raw[ $source ] = $redir;
53
+ }
54
+ $rmodel->set_all_redirections( $raw );
55
+ if ( 'delete' === $bulk_action ) { $rmodel->set_all_redirection_types( $rtypes ); }
56
+
57
+ if ( in_array( $bulk_action, array( 'redirect_301', 'redirect_302' ) ) ) {
58
+ $new_status = 'redirect_301' === $bulk_action
59
+ ? Smartcrawl_Model_Redirection::TYPE_301
60
+ : Smartcrawl_Model_Redirection::TYPE_302
61
+ ;
62
+ $default_status = $rmodel->get_default_redirection_status_type();
63
+ $raw = $rmodel->get_all_redirection_types();
64
+ foreach ( $urls as $source => $redir ) {
65
+ $source = esc_url( $source );
66
+ $old_status = ! empty( $raw[ $source ] )
67
+ ? $raw[ $source ]
68
+ : $default_status
69
+ ;
70
+ $raw[ $source ] = in_array( $source, $bulk )
71
+ ? $new_status
72
+ : $rmodel->get_valid_redirection_status_type( $old_status );
73
+ }
74
+
75
+ $rmodel->set_all_redirection_types( $raw );
76
+ } else {
77
+ $new_types = array();
78
+ foreach ( $types as $source => $redir ) {
79
+ if ( ! empty( $bulk_action ) && ! empty( $bulk ) && in_array( $source, $bulk ) ) { continue; }
80
+ $status = $rmodel->get_valid_redirection_status_type( $redir );
81
+ if ( empty( $status ) ) { continue; }
82
+ $source = esc_url( $source );
83
+ $new_types[ $source ] = $status;
84
+ }
85
+ $rmodel->set_all_redirection_types( $new_types );
86
+ }
87
+
88
+ return $result;
89
+ }
90
+
91
+ public function init() {
92
+ $this->option_name = 'wds_redirections_options';
93
+ $this->name = 'redirections';
94
+ $this->slug = Smartcrawl_Settings::TAB_REDIRECTIONS;
95
+ $this->action_url = admin_url( 'options.php' );
96
+ $this->title = __( 'Redirections', 'wds' );
97
+ $this->page_title = __( 'SmartCrawl Wizard: Redirections', 'wds' );
98
+
99
+ parent::init();
100
+ }
101
+
102
+ public function options_page() {
103
+ $rmodel = new Smartcrawl_Model_Redirection;
104
+ $arguments = array(
105
+ 'redirections' => $rmodel->get_all_redirections(),
106
+ 'types' => $rmodel->get_all_redirection_types(),
107
+ );
108
+ wp_enqueue_script( 'wds-admin-redirections' );
109
+ $this->_render_page( 'redirections-settings', $arguments );
110
+ }
111
+
112
+ public function defaults() {
113
+ if ( ! is_array( $this->options ) ) { $this->options = array(); }
114
+ if ( empty( $this->options['redirections-code'] ) ) {
115
+ $this->options['redirections-code'] = 301;
116
+ }
117
+
118
+ if ( is_multisite() && SMARTCRAWL_SITEWIDE ) {
119
+ update_site_option( $this->option_name, $this->options );
120
+ } else {
121
+ update_option( $this->option_name, $this->options );
122
+ }
123
+ }
124
+
125
+ }
includes/admin/settings/seomoz.php ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Smartcrawl_Seomoz_Settings extends Smartcrawl_Settings_Admin {
4
+
5
+
6
+ private static $_instance;
7
+
8
+ public static function get_instance() {
9
+ if ( empty( self::$_instance ) ) {
10
+ self::$_instance = new self;
11
+ }
12
+ return self::$_instance;
13
+ }
14
+
15
+ public function validate( $input ) {
16
+ return $inpt; }
17
+
18
+ public function init() {
19
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'tools/seomoz/api.php' );
20
+
21
+ $this->option_name = 'wds_seomoz_options';
22
+ $this->name = Smartcrawl_Settings::COMP_SEOMOZ;
23
+ $this->slug = Smartcrawl_Settings::TAB_SEOMOZ;
24
+ $this->action_url = admin_url( 'options.php' );
25
+ $this->title = __( 'Moz', 'wds' );
26
+ $this->page_title = __( 'SmartCrawl Wizard: Moz', 'wds' );
27
+
28
+ parent::init();
29
+ }
30
+
31
+ /**
32
+ * Add admin settings page
33
+ */
34
+ public function options_page() {
35
+ parent::options_page();
36
+ $this->_render_page( 'seomoz-settings' );
37
+ }
38
+
39
+ /**
40
+ * Default settings
41
+ */
42
+ public function defaults() {
43
+ if ( is_multisite() && SMARTCRAWL_SITEWIDE ) {
44
+ $this->options = get_site_option( $this->option_name );
45
+ } else {
46
+ $this->options = get_option( $this->option_name );
47
+ }
48
+
49
+ if ( empty( $this->options['access-id'] ) ) {
50
+ $this->options['access-id'] = '';
51
+ }
52
+
53
+ if ( empty( $this->options['secret-key'] ) ) {
54
+ $this->options['secret-key'] = '';
55
+ }
56
+
57
+ if ( is_multisite() && SMARTCRAWL_SITEWIDE ) {
58
+ update_site_option( $this->option_name, $this->options );
59
+ } else {
60
+ update_option( $this->option_name, $this->options );
61
+ }
62
+ }
63
+
64
+ }
65
+
includes/admin/settings/settings.php ADDED
@@ -0,0 +1,492 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Smartcrawl_Settings_Settings extends Smartcrawl_Settings_Admin {
4
+
5
+
6
+ private static $_instance;
7
+
8
+ public static function get_instance() {
9
+ if ( empty( self::$_instance ) ) {
10
+ self::$_instance = new self;
11
+ }
12
+ return self::$_instance;
13
+ }
14
+
15
+ /**
16
+ * Validate submitted options
17
+ *
18
+ * @param array $input Raw input
19
+ *
20
+ * @return array Validated input
21
+ */
22
+ public function validate( $input ) {
23
+ $result = array();
24
+ $saving_user_roles = isset( $input['saving_user_roles'] ) && $input['saving_user_roles'];
25
+
26
+ // The options page is broken down into two parts. The following operation fills in option values from the missing part.
27
+ if ( $saving_user_roles ) {
28
+ $input = wp_parse_args(
29
+ $input,
30
+ self::get_specific_options( $this->option_name )
31
+ );
32
+ } else {
33
+ $input = wp_parse_args(
34
+ $input,
35
+ $this->get_old_user_role_options()
36
+ );
37
+ }
38
+
39
+ if ( ! empty( $input['wds_settings-setup'] ) ) { $result['wds_settings-setup'] = true; }
40
+
41
+ $booleans = array_keys( Smartcrawl_Settings::get_known_components() );
42
+ foreach ( $booleans as $bool ) {
43
+ if ( ! empty( $input[ $bool ] ) ) { $result[ $bool ] = true; }
44
+ }
45
+
46
+ // Analysis/readability
47
+ $result['analysis-seo'] = ! empty( $input['analysis-seo'] );
48
+ $result['analysis-readability'] = ! empty( $input['analysis-readability'] );
49
+ $result['extras-admin_bar'] = ! empty( $input['extras-admin_bar'] );
50
+
51
+ if ( ! empty( $input['redirections-code'] ) && is_numeric( $input['redirections-code'] ) ) {
52
+ $code = (int) $input['redirections-code'];
53
+ if ( in_array( $code, array( 301, 302 ) ) ) { $result['redirections-code'] = $code; }
54
+ }
55
+ if ( ! empty( $input['metabox-lax_enforcement'] ) ) {
56
+ $result['metabox-lax_enforcement'] = true;
57
+ } else {
58
+ $result['metabox-lax_enforcement'] = false;
59
+ }
60
+ if ( ! empty( $input['general-suppress-generator'] ) ) {
61
+ $result['general-suppress-generator'] = true;
62
+ } else {
63
+ $result['general-suppress-generator'] = false;
64
+ }
65
+ if ( ! empty( $input['general-suppress-redundant_canonical'] ) ) {
66
+ $result['general-suppress-redundant_canonical'] = true;
67
+ } else {
68
+ $result['general-suppress-redundant_canonical'] = false;
69
+ }
70
+
71
+ $strings = array(
72
+ 'access-id',
73
+ 'secret-key',
74
+ );
75
+ foreach ( $strings as $str ) {
76
+ if ( ! empty( $input[ $str ] ) ) { $result[ $str ] = sanitize_text_field( $input[ $str ] ); }
77
+ }
78
+
79
+ // Roles
80
+ foreach ( $this->_get_permission_contexts() as $ctx ) {
81
+ if ( empty( $input[ $ctx ] ) ) { continue; }
82
+ $roles = array_keys( $this->_get_filtered_roles( "wds-{$ctx}" ) );
83
+ $check_context = is_array( $input[ $ctx ] )
84
+ ? $input[ $ctx ]
85
+ : array( $input[ $ctx ] )
86
+ ;
87
+ $result[ $ctx ] = array();
88
+ foreach ( $check_context as $ctx_item ) {
89
+ if ( in_array( $ctx_item, $roles ) ) { $result[ $ctx ][] = $ctx_item; }
90
+ }
91
+ }
92
+
93
+ if ( isset( $input['verification-google-meta'] ) ) {
94
+ $this->_validate_and_save_extra_options( $input );
95
+ }
96
+
97
+ return $result;
98
+ }
99
+
100
+ /**
101
+ * Processes extra options passed on from the main form
102
+ *
103
+ * This is a side-effect method - the extra options don't update
104
+ * the tab option key, but go to an extternal location
105
+ *
106
+ * @param array $input Raw form input
107
+ */
108
+ private function _validate_and_save_extra_options( $input ) {
109
+ // Blog tabs
110
+ if ( is_multisite() && current_user_can( 'manage_network_options' ) ) {
111
+ if ( isset( $input['wds_blog_tabs'] ) || isset( $input['wds_sitewide_mode'] ) ) {
112
+ $raw = ! empty( $input['wds_blog_tabs'] ) && is_array( $input['wds_blog_tabs'] )
113
+ ? $input['wds_blog_tabs']
114
+ : array()
115
+ ;
116
+ $tabs = array();
117
+ foreach ( $raw as $key => $tab ) {
118
+ if ( ! empty( $tab ) ) { $tabs[ $key ] = true; }
119
+ }
120
+
121
+ update_site_option( 'wds_blog_tabs', $tabs );
122
+
123
+ update_site_option( 'wds_sitewide_mode', (int) ! empty( $input['wds_sitewide_mode'] ) );
124
+ }
125
+ }
126
+
127
+ // Sitemaps validation/save
128
+ $sitemaps = Smartcrawl_Settings::get_component_options( Smartcrawl_Settings::COMP_SITEMAP );
129
+ $sitemaps_updated = false;
130
+ if ( ! empty( $input['verification-google'] ) ) {
131
+ $sitemaps['verification-google'] = sanitize_text_field( $input['verification-google'] );
132
+ $sitemaps_updated = true;
133
+ }
134
+ if ( ! empty( $input['verification-bing'] ) ) {
135
+ $sitemaps['verification-bing'] = sanitize_text_field( $input['verification-bing'] );
136
+ $sitemaps_updated = true;
137
+ }
138
+ if ( ! empty( $input['verification-pages'] ) ) {
139
+ $pages = $input['verification-pages'];
140
+ if ( in_array( $pages, array( '', 'home' ) ) ) { $sitemaps['verification-pages'] = $pages; }
141
+ $sitemaps_updated = true;
142
+ }
143
+
144
+ // Meta tags
145
+ if ( ! empty( $input['verification-google-meta'] ) ) {
146
+ $sitemaps['verification-google-meta'] = $input['verification-google-meta'];
147
+ $sitemaps['verification-google'] = false;
148
+ $sitemaps_updated = true;
149
+ }
150
+ if ( ! empty( $input['verification-bing-meta'] ) ) {
151
+ $sitemaps['verification-bing-meta'] = $input['verification-bing-meta'];
152
+ $sitemaps['verification-bing'] = false;
153
+ $sitemaps_updated = true;
154
+ }
155
+
156
+ $custom_values_key = 'additional-metas';
157
+ if ( ! empty( $input[ $custom_values_key ] ) && is_array( $input[ $custom_values_key ] ) ) {
158
+ $custom_values = $input[ $custom_values_key ];
159
+ $sanitized_custom_values = array();
160
+ foreach ( $custom_values as $index => $custom_value ) {
161
+ if ( trim( $custom_value ) ) {
162
+ $sanitized = wp_kses($custom_value, array(
163
+ 'meta' => array(
164
+ 'charset' => array(),
165
+ 'content' => array(),
166
+ 'http-equiv' => array(),
167
+ 'name' => array(),
168
+ 'scheme' => array(),
169
+ ),
170
+ ));
171
+ if ( preg_match( '/<meta\b/', trim( $sanitized ) ) ) {
172
+ $sanitized_custom_values[] = $sanitized;
173
+ }
174
+ }
175
+ }
176
+ $sitemaps[ $custom_values_key ] = $sanitized_custom_values;
177
+ $sitemaps_updated = true;
178
+ }
179
+
180
+ if ( $sitemaps_updated ) {
181
+ Smartcrawl_Settings::update_component_options( Smartcrawl_Settings::COMP_SITEMAP, $sitemaps );
182
+ }
183
+ }
184
+
185
+ public function init() {
186
+ $this->option_name = 'wds_settings_options';
187
+ $this->name = 'settings';
188
+ $this->slug = Smartcrawl_Settings::TAB_SETTINGS;
189
+ $this->action_url = admin_url( 'options.php' );
190
+ $this->title = __( 'Settings', 'wds' );
191
+ $this->page_title = __( 'SmartCrawl Wizard: Settings', 'wds' );
192
+
193
+ add_action( 'admin_init', array( $this, 'activate_component' ) );
194
+ add_action( 'admin_init', array( $this, 'save_moz_api_credentials' ) );
195
+ add_action( 'network_admin_notices', array( $this, 'import_notice' ) );
196
+
197
+ if ($this->display_single_site_import_notice()) {
198
+ add_action('admin_notices', array($this, 'import_notice'));
199
+ }
200
+
201
+ if ( ! class_exists( 'Smartcrawl_Controller_IO' ) ) {
202
+ require_once( SMARTCRAWL_PLUGIN_DIR . '/core/class_wds_controller_io.php' );
203
+ }
204
+ Smartcrawl_Controller_IO::serve();
205
+
206
+ parent::init();
207
+ }
208
+
209
+ /**
210
+ * Updates the options to activate a component.
211
+ */
212
+ function activate_component() {
213
+ if ( isset( $_POST['wds-activate-component'] ) ) {
214
+
215
+ $component = sanitize_key( $_POST['wds-activate-component'] );
216
+ $options = self::get_specific_options( $this->option_name );
217
+ $options[ $component ] = 1;
218
+
219
+ self::update_specific_options( $this->option_name, $options );
220
+
221
+ wp_redirect( esc_url_raw( add_query_arg( array() ) ) );
222
+ }
223
+ }
224
+
225
+ function save_moz_api_credentials() {
226
+ if ( isset( $_POST['wds-moz-access-id'] ) || isset( $_POST['wds-moz-secret-key'] ) ) {
227
+ $options = self::get_specific_options( $this->option_name );
228
+ $options['access-id'] = sanitize_text_field( $_POST['wds-moz-access-id'] );
229
+ $options['secret-key'] = sanitize_text_field( $_POST['wds-moz-secret-key'] );
230
+
231
+ self::update_specific_options( $this->option_name, $options );
232
+
233
+ wp_redirect( esc_url_raw( add_query_arg( array() ) ) );
234
+ }
235
+ }
236
+
237
+ /**
238
+ * Get allowed blog tabs
239
+ *
240
+ * @return array
241
+ */
242
+ public static function get_blog_tabs() {
243
+ $blog_tabs = get_site_option( 'wds_blog_tabs' );
244
+ return is_array( $blog_tabs )
245
+ ? $blog_tabs
246
+ : array()
247
+ ;
248
+ }
249
+
250
+ /**
251
+ * Get (optionally filtered) default roles
252
+ *
253
+ * @param string $context_filter Optional filter to pass the roles through first
254
+ *
255
+ * @return array List of roles
256
+ */
257
+ protected function _get_filtered_roles( $context_filter = false ) {
258
+ $default_roles = array(
259
+ 'manage_network' => __( 'Super Admin' ),
260
+ 'list_users' => sprintf( __( '%s (and up)', 'wds' ), __( 'Site Admin' ) ),
261
+ 'moderate_comments' => sprintf( __( '%s (and up)', 'wds' ), __( 'Editor' ) ),
262
+ 'edit_published_posts' => sprintf( __( '%s (and up)', 'wds' ), __( 'Author' ) ),
263
+ 'edit_posts' => sprintf( __( '%s (and up)', 'wds' ), __( 'Contributor' ) ),
264
+ );
265
+ if ( ! is_multisite() ) { unset( $default_roles['manage_network'] ); }
266
+
267
+ return ! empty( $context_filter )
268
+ ? (array) apply_filters( $context_filter, $default_roles )
269
+ : $default_roles
270
+ ;
271
+ }
272
+
273
+ /**
274
+ * Get a list of permission contexts used for roles filtering
275
+ *
276
+ * @return array
277
+ */
278
+ protected function _get_permission_contexts() {
279
+ return array(
280
+ 'seo_metabox_permission_level',
281
+ 'seo_metabox_301_permission_level',
282
+ 'urlmetrics_metabox_permission_level',
283
+ );
284
+ }
285
+
286
+ /**
287
+ * Add admin settings page
288
+ */
289
+ public function options_page() {
290
+ parent::options_page();
291
+
292
+ $arguments['default_roles'] = $this->_get_filtered_roles();
293
+
294
+ $arguments['active_components'] = Smartcrawl_Settings::get_known_components();
295
+ if ( ! empty( $arguments['active_components'][ Smartcrawl_Settings::COMP_SEOMOZ ] ) ) { unset( $arguments['active_components'][ Smartcrawl_Settings::COMP_SEOMOZ ] ); }
296
+
297
+ $arguments['slugs'] = array(
298
+ Smartcrawl_Settings::TAB_ONPAGE => __( 'Title & Meta', 'wds' ),
299
+ Smartcrawl_Settings::TAB_CHECKUP => __( 'SEO Checkup', 'wds' ),
300
+ Smartcrawl_Settings::TAB_SITEMAP => __( 'Sitemaps', 'wds' ),
301
+ Smartcrawl_Settings::TAB_AUTOLINKS => __( 'Advanced Tools', 'wds' ),
302
+ Smartcrawl_Settings::TAB_SOCIAL => __( 'Social', 'wds' ),
303
+ Smartcrawl_Settings::TAB_SETTINGS => __( 'Settings', 'wds' ),
304
+ );
305
+
306
+ if ( is_multisite() ) {
307
+ $arguments['blog_tabs'] = self::get_blog_tabs();
308
+ } else {
309
+ $arguments['blog_tabs'] = array();
310
+ }
311
+
312
+ foreach ( $this->_get_permission_contexts() as $ctx ) {
313
+ $arguments[ $ctx ] = $this->_get_filtered_roles( "wds-{$ctx}" );
314
+ }
315
+
316
+ $arguments['wds_sitewide_mode'] = smartcrawl_is_switch_active( 'SMARTCRAWL_SITEWIDE' ) || (bool) get_site_option( 'wds_sitewide_mode' );
317
+
318
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
319
+ $sitemap_settings = Smartcrawl_Sitemap_Settings::get_instance();
320
+ $arguments['sitemap_option_name'] = $sitemap_settings->option_name;
321
+
322
+ $arguments['verification_pages'] = array(
323
+ '' => __( 'All pages', 'wds' ),
324
+ 'home' => __( 'Home page', 'wds' ),
325
+ );
326
+
327
+ $arguments['google_msg'] = ! empty( $smartcrawl_options['verification-google'] )
328
+ ? '<code>' . esc_html( '<meta name="google-site-verification" value="' ) . esc_attr( $smartcrawl_options['verification-google'] ) . esc_html( '" />' ) . '</code>'
329
+ : '<small>' . esc_html( __( 'No META tag will be added', 'wds' ) ) . '</small>';
330
+
331
+ $arguments['bing_msg'] = ! empty( $smartcrawl_options['verification-bing'] )
332
+ ? '<code>' . esc_html( '<meta name="msvalidate.01" content="' ) . esc_attr( $smartcrawl_options['verification-bing'] ) . esc_html( '" />' ) . '</code>'
333
+ : '<small>' . esc_html( __( 'No META tag will be added', 'wds' ) ) . '</small>';
334
+
335
+ $arguments['active_tab'] = $this->_get_last_active_tab( 'tab_general_settings' );
336
+
337
+ wp_enqueue_script( 'wds-admin-settings' );
338
+ $this->_render_page( 'settings/settings', $arguments );
339
+ }
340
+
341
+ /**
342
+ * Default settings
343
+ */
344
+ public function defaults() {
345
+ $this->options = self::get_specific_options( $this->option_name );
346
+
347
+ if ( empty( $this->options ) ) {
348
+ if ( empty( $this->options['onpage'] ) ) {
349
+ $this->options['onpage'] = 1;
350
+ }
351
+
352
+ if ( empty( $this->options['autolinks'] ) ) {
353
+ $this->options['autolinks'] = 0;
354
+ }
355
+
356
+ if ( empty( $this->options['seomoz'] ) ) {
357
+ $this->options['seomoz'] = 0;
358
+ }
359
+
360
+ if ( empty( $this->options['sitemap'] ) ) {
361
+ $this->options['sitemap'] = 0;
362
+ }
363
+
364
+ if ( empty( $this->options['social'] ) ) {
365
+ $this->options['social'] = 1;
366
+ }
367
+
368
+ if ( empty( $this->options['checkup'] ) ) {
369
+ $this->options['checkup'] = 0;
370
+ }
371
+ }
372
+
373
+ if ( empty( $this->options['seo_metabox_permission_level'] ) ) {
374
+ $this->options['seo_metabox_permission_level'] = ( is_multisite() ? 'manage_network' : 'list_users' );
375
+ }
376
+
377
+ if ( empty( $this->options['urlmetrics_metabox_permission_level'] ) ) {
378
+ $this->options['urlmetrics_metabox_permission_level'] = ( is_multisite() ? 'manage_network' : 'list_users' );
379
+ }
380
+
381
+ if ( empty( $this->options['seo_metabox_301_permission_level'] ) ) {
382
+ $this->options['seo_metabox_301_permission_level'] = ( is_multisite() ? 'manage_network' : 'list_users' );
383
+ }
384
+
385
+ if ( empty( $this->options['access-id'] ) ) {
386
+ $this->options['access-id'] = '';
387
+ }
388
+
389
+ if ( empty( $this->options['secret-key'] ) ) {
390
+ $this->options['secret-key'] = '';
391
+ }
392
+
393
+ if ( ! isset( $this->options['analysis-seo'] ) ) { $this->options['analysis-seo'] = false; }
394
+ if ( ! isset( $this->options['analysis-readability'] ) ) { $this->options['analysis-readability'] = false; }
395
+ if ( ! isset( $this->options['extras-admin_bar'] ) ) { $this->options['extras-admin_bar'] = true; }
396
+
397
+ apply_filters( 'wds_defaults', $this->options );
398
+
399
+ self::update_specific_options( $this->option_name, $this->options );
400
+ }
401
+
402
+ private function get_old_user_role_options() {
403
+ $option_keys = array(
404
+ 'seo_metabox_permission_level',
405
+ 'seo_metabox_301_permission_level',
406
+ 'urlmetrics_metabox_permission_level',
407
+ );
408
+
409
+ $old_options = self::get_specific_options( $this->option_name );
410
+
411
+ $user_role_options = array();
412
+ foreach ( $option_keys as $option_key ) {
413
+ if ( $option_value = smartcrawl_get_array_value( $old_options, $option_key ) ) {
414
+ $user_role_options[ $option_key ] = $option_value;
415
+ }
416
+ }
417
+
418
+ return $user_role_options;
419
+ }
420
+
421
+ private function get_yoast_importer()
422
+ {
423
+ if (!class_exists('SmartCrawl_Yoast_Importer')) {
424
+ require_once(SMARTCRAWL_PLUGIN_DIR . '/core/class_wds_yoast_importer.php');
425
+ }
426
+
427
+ return new SmartCrawl_Yoast_Importer();
428
+ }
429
+
430
+ private function get_aioseop_importer()
431
+ {
432
+ if (!class_exists('SmartCrawl_AIOSEOP_Importer')) {
433
+ require_once(SMARTCRAWL_PLUGIN_DIR . '/core/class_wds_aioseop_importer.php');
434
+ }
435
+
436
+ return new SmartCrawl_AIOSEOP_Importer();
437
+ }
438
+
439
+ function import_notice()
440
+ {
441
+ if (!current_user_can('manage_options')) {
442
+ return;
443
+ }
444
+
445
+ $this->show_import_notice(
446
+ $this->get_yoast_importer(),
447
+ esc_html__('Yoast SEO', 'wds'),
448
+ 'wordpress-seo/wp-seo.php'
449
+ );
450
+
451
+ $this->show_import_notice(
452
+ $this->get_aioseop_importer(),
453
+ esc_html__('All In One SEO', 'wds'),
454
+ 'all-in-one-seo-pack/all_in_one_seo_pack.php'
455
+ );
456
+ }
457
+
458
+ /**
459
+ * @param $importer SmartCrawl_Importer
460
+ * @param $plugin_name string
461
+ */
462
+ function show_import_notice($importer, $plugin_name, $plugin)
463
+ {
464
+ if (!$importer->data_exists() || !is_plugin_active($plugin)) {
465
+ return;
466
+ }
467
+
468
+ $auto_import_url = sprintf(
469
+ '<a href="%s">%s</a>',
470
+ Smartcrawl_Settings_Admin::admin_url(Smartcrawl_Settings::TAB_SETTINGS) . '#tab_import_export',
471
+ esc_html__('auto-import', 'wds')
472
+ );
473
+ $message = sprintf(
474
+ esc_html__("We've detected you have %s installed. Do you want to %s your configuration into SmartCrawl?"),
475
+ $plugin_name,
476
+ $auto_import_url
477
+ );
478
+
479
+ ?>
480
+ <div class="notice-warning notice is-dismissible"><p><?php echo $message; ?></p></div>
481
+ <?php
482
+ }
483
+
484
+ private function display_single_site_import_notice()
485
+ {
486
+ // Always display on non-multisite
487
+ return !is_multisite()
488
+ // or when site-wide flag is off and the current site is the main network site
489
+ || (is_main_site() && !smartcrawl_is_switch_active('SMARTCRAWL_SITEWIDE'));
490
+ }
491
+ }
492
+
includes/admin/settings/sitemap.php ADDED
@@ -0,0 +1,472 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Sitemap settings admin page
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ /**
9
+ * Sitemap settings admin page class
10
+ */
11
+ class Smartcrawl_Sitemap_Settings extends Smartcrawl_Settings_Admin {
12
+
13
+ /**
14
+ * Singleton instance
15
+ *
16
+ * @var Smartcrawl_Sitemap_Settings
17
+ */
18
+ private static $_instance;
19
+
20
+ /**
21
+ * Singleton instance getter
22
+ *
23
+ * @return Smartcrawl_Sitemap_Settings instance
24
+ */
25
+ public static function get_instance() {
26
+ if ( empty( self::$_instance ) ) {
27
+ self::$_instance = new self;
28
+ }
29
+ return self::$_instance;
30
+ }
31
+
32
+ /**
33
+ * Validate submitted options
34
+ *
35
+ * @param array $input Raw input.
36
+ *
37
+ * @return array Validated input
38
+ */
39
+ public function validate( $input ) {
40
+ $result = array();
41
+
42
+ if ( ! empty( $input['wds_sitemap-setup'] ) ) { $result['wds_sitemap-setup'] = true; }
43
+
44
+ $strings = array(
45
+ 'verification-google',
46
+ 'verification-bing',
47
+ 'verification-pages',
48
+ );
49
+ foreach ( $strings as $str ) {
50
+ if ( isset( $input[ $str ] ) ) { $result[ $str ] = sanitize_text_field( $input[ $str ] ); }
51
+ }
52
+
53
+ $booleans = array(
54
+ 'ping-google',
55
+ 'ping-bing',
56
+ 'sitemap-images',
57
+ 'sitemap-stylesheet',
58
+ 'sitemap-dashboard-widget',
59
+ 'sitemap-disable-automatic-regeneration',
60
+ 'sitemap-buddypress-groups',
61
+ 'sitemap-buddypress-profiles',
62
+ );
63
+ foreach ( $booleans as $bool ) {
64
+ if ( ! empty( $input[ $bool ] ) ) { $result[ $bool ] = true; }
65
+ }
66
+
67
+ // Array Booleans.
68
+ $input['exclude_post_types'] = ! empty( $input['exclude_post_types'] ) && is_array( $input['exclude_post_types'] ) ? $input['exclude_post_types'] : array();
69
+ foreach ( array_keys( $this->_get_post_types_options() ) as $post_type ) {
70
+ $result[ $post_type ] = in_array( $post_type, $input['exclude_post_types'] );
71
+ }
72
+ $input['exclude_taxonomies'] = ! empty( $input['exclude_taxonomies'] ) && is_array( $input['exclude_taxonomies'] ) ? $input['exclude_taxonomies'] : array();
73
+ foreach ( array_keys( $this->_get_taxonomies_options() ) as $tax ) {
74
+ $result[ $tax ] = in_array( $tax, $input['exclude_taxonomies'] );
75
+ }
76
+
77
+ // BuddyPress-specific.
78
+ $bpo = $this->_get_buddyress_template_values();
79
+ if ( ! empty( $bpo['exclude_groups'] ) && is_array( $bpo['exclude_groups'] ) ) {
80
+ $input['exclude_bp_groups'] = ! empty( $input['exclude_bp_groups'] ) && is_array( $input['exclude_bp_groups'] ) ? $input['exclude_bp_groups'] : array();
81
+ foreach ( $bpo['exclude_groups'] as $slug => $name ) {
82
+ $key = "sitemap-buddypress-{$slug}";
83
+ $result[ $key ] = in_array( $key, $input['exclude_bp_groups'] );
84
+ }
85
+ }
86
+
87
+ if ( ! empty( $bpo['exclude_roles'] ) && is_array( $bpo['exclude_roles'] ) ) {
88
+ $input['exclude_bp_roles'] = isset( $input['exclude_bp_roles'] ) && is_array( $input['exclude_bp_roles'] ) ? $input['exclude_bp_roles'] : array();
89
+ foreach ( $bpo['exclude_roles'] as $slug => $name ) {
90
+ $key = "sitemap-buddypress-roles-{$slug}";
91
+ $result[ $key ] = in_array( $key, $input['exclude_bp_roles'] );
92
+ }
93
+ }
94
+
95
+ // Meta tags.
96
+ if ( ! empty( $input['verification-google-meta'] ) ) {
97
+ $result['verification-google-meta'] = $input['verification-google-meta'];
98
+ $result['verification-google'] = false;
99
+ }
100
+ if ( ! empty( $input['verification-bing-meta'] ) ) {
101
+ $result['verification-bing-meta'] = $input['verification-bing-meta'];
102
+ $result['verification-bing'] = false;
103
+ }
104
+
105
+ $custom_values_key = 'additional-metas';
106
+ if ( ! empty( $input[ $custom_values_key ] ) && is_array( $input[ $custom_values_key ] ) ) {
107
+ $result[ $custom_values_key ] = $input[ $custom_values_key ];
108
+ }
109
+
110
+ $result = $this->_validate_crawler_settings( $input, $result );
111
+
112
+ if ( isset( $input['extra_sitemap_urls'] ) ) {
113
+ $extra_urls = explode( "\n", $input['extra_sitemap_urls'] );
114
+ $sanitized_extra_urls = array();
115
+ foreach ( $extra_urls as $extra_url ) {
116
+ if ( trim( $extra_url ) ) {
117
+ $sanitized_extra_urls[] = esc_url( $extra_url );
118
+ }
119
+ }
120
+ Smartcrawl_Xml_Sitemap::set_extra_urls( $sanitized_extra_urls );
121
+
122
+ unset( $input['extra_sitemap_urls'] );
123
+ }
124
+
125
+ if ( isset( $input['sitemap_ignore_urls'] ) ) {
126
+ $ignore_urls = explode( "\n", $input['sitemap_ignore_urls'] );
127
+ $sanitized_ignore_urls = array();
128
+ foreach ( $ignore_urls as $ignore_url ) {
129
+ if ( trim( $ignore_url ) ) {
130
+ $sanitized_ignore_urls[] = smartcrawl_sanitize_relative_url( $ignore_url );
131
+ }
132
+ }
133
+ Smartcrawl_Xml_Sitemap::set_ignore_urls( $sanitized_ignore_urls );
134
+
135
+ unset( $input['sitemap_ignore_urls'] );
136
+ }
137
+
138
+ if ( isset( $input['sitemap_ignore_post_ids'] ) ) {
139
+ $ignore_post_ids = explode( ',', $input['sitemap_ignore_post_ids'] );
140
+ $sanitized_ignore_post_ids = array();
141
+ foreach ( $ignore_post_ids as $pid ) {
142
+ if ( trim( $pid ) && (int) $pid ) {
143
+ $sanitized_ignore_post_ids[] = (int) $pid;
144
+ }
145
+ }
146
+ Smartcrawl_Xml_Sitemap::set_ignore_ids( $sanitized_ignore_post_ids );
147
+
148
+ unset( $input['sitemap_ignore_post_ids'] );
149
+ }
150
+
151
+ return $result;
152
+ }
153
+
154
+ /**
155
+ * Crawler settings validation
156
+ *
157
+ * @param array $input Raw input.
158
+ * @param array $result Result this far.
159
+ *
160
+ * @return array
161
+ */
162
+ private function _validate_crawler_settings( $input, $result ) {
163
+ if ( empty( $input['crawler-cron-enable'] ) ) {
164
+ $result['crawler-cron-enable'] = false;
165
+ return $result;
166
+ } else { $result['crawler-cron-enable'] = true; }
167
+
168
+ $frequency = ! empty( $input['crawler-frequency'] )
169
+ ? Smartcrawl_Controller_Cron::get()->get_valid_frequency( $input['crawler-frequency'] )
170
+ : Smartcrawl_Controller_Cron::get()->get_default_frequency();
171
+ $result['crawler-frequency'] = $frequency;
172
+
173
+ $dow = isset( $input['crawler-dow'] ) && is_numeric( $input['crawler-dow'] )
174
+ ? (int) $input['crawler-dow']
175
+ : 0
176
+ ;
177
+ $result['crawler-dow'] = in_array( $dow, range( 0,6 ) ) ? $dow : 0;
178
+
179
+ $tod = isset( $input['crawler-tod'] ) && is_numeric( $input['crawler-tod'] )
180
+ ? (int) $input['crawler-tod']
181
+ : 0
182
+ ;
183
+ $result['crawler-tod'] = in_array( $tod, range( 0,23 ) ) ? $tod : 0;
184
+
185
+ return $result;
186
+ }
187
+
188
+ /**
189
+ * Initialize the handler
190
+ */
191
+ public function init() {
192
+ $this->option_name = 'wds_sitemap_options';
193
+ $this->name = Smartcrawl_Settings::COMP_SITEMAP;
194
+ $this->slug = Smartcrawl_Settings::TAB_SITEMAP;
195
+ $this->action_url = admin_url( 'options.php' );
196
+ $this->title = __( 'Sitemap', 'wds' );
197
+ $this->page_title = __( 'SmartCrawl Wizard: Sitemap', 'wds' );
198
+
199
+ add_action( 'wp_ajax_wds-toggle-sitemap-status', array( $this, 'json_toggle_sitemap_status' ) );
200
+
201
+ parent::init();
202
+ }
203
+
204
+ /**
205
+ * Get a list of post type based options
206
+ *
207
+ * @return array
208
+ */
209
+ protected function _get_post_types_options() {
210
+ $options = array();
211
+
212
+ foreach ( get_post_types(array(
213
+ 'public' => true,
214
+ 'show_ui' => true,
215
+ )) as $post_type ) {
216
+ if ( in_array( $post_type, array( 'revision', 'nav_menu_item', 'attachment' ) ) ) { continue; }
217
+ $pt = get_post_type_object( $post_type );
218
+ $options[ 'post_types-' . $post_type . '-not_in_sitemap' ] = $pt;
219
+ }
220
+
221
+ return $options;
222
+ }
223
+
224
+ /**
225
+ * Get a list of taxonomy based options
226
+ *
227
+ * @return array
228
+ */
229
+ protected function _get_taxonomies_options() {
230
+ $options = array();
231
+
232
+ foreach ( get_taxonomies(array(
233
+ 'public' => true,
234
+ 'show_ui' => true,
235
+ )) as $taxonomy ) {
236
+ if ( in_array( $taxonomy, array( 'nav_menu', 'link_category', 'post_format' ) ) ) { continue; }
237
+ $tax = get_taxonomy( $taxonomy );
238
+ $options[ 'taxonomies-' . $taxonomy . '-not_in_sitemap' ] = $tax;
239
+ }
240
+
241
+ return $options;
242
+ }
243
+
244
+ /**
245
+ * Runs SEO Audit crawl
246
+ */
247
+ public function run_crawl() {
248
+ if ( current_user_can( 'manage_options' ) ) {
249
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SEO );
250
+ $service->start();
251
+ }
252
+ wp_safe_redirect( esc_url( remove_query_arg( 'run-crawl' ) ) );
253
+ die;
254
+ }
255
+
256
+ /**
257
+ * Process run action
258
+ *
259
+ * @return bool
260
+ */
261
+ public function process_run_action() {
262
+ if ( ! empty( $_GET['run-crawl'] ) ) { // Simple presence switch, no value needed.
263
+ return $this->run_crawl();
264
+ }
265
+ return false;
266
+ }
267
+
268
+ /**
269
+ * Add admin settings page
270
+ */
271
+ public function options_page() {
272
+ parent::options_page();
273
+
274
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
275
+ $arguments = array(
276
+ 'post_types' => array(),
277
+ 'taxonomies' => array(),
278
+ 'engines' => array(
279
+ 'ping-google' => __( 'Google', 'wds' ),
280
+ 'ping-bing' => __( 'Bing', 'wds' ),
281
+ ),
282
+ 'checkbox_options' => array(
283
+ 'yes' => __( 'Yes', 'wds' ),
284
+ ),
285
+ 'verification_pages' => array(
286
+ '' => __( 'All pages', 'wds' ),
287
+ 'home' => __( 'Home page', 'wds' ),
288
+ ),
289
+ );
290
+
291
+ foreach ( $this->_get_post_types_options() as $opt => $post_type ) {
292
+ $arguments['post_types'][ $opt ] = $post_type;
293
+ }
294
+ foreach ( $this->_get_taxonomies_options() as $opt => $taxonomy ) {
295
+ $arguments['taxonomies'][ $opt ] = $taxonomy;
296
+ }
297
+
298
+ $arguments['google_msg'] = ! empty( $smartcrawl_options['verification-google'] )
299
+ ? '<code>' . esc_html( '<meta name="google-site-verification" value="' ) . esc_attr( $smartcrawl_options['verification-google'] ) . esc_html( '" />' ) . '</code>'
300
+ : '<small>' . esc_html( __( 'No META tag will be added', 'wds' ) ) . '</small>'
301
+ ;
302
+ $arguments['bing_msg'] = ! empty( $smartcrawl_options['verification-bing'] )
303
+ ? '<code>' . esc_html( '<meta name="msvalidate.01" content="' ) . esc_attr( $smartcrawl_options['verification-bing'] ) . esc_html( '" />' ) . '</code>'
304
+ : '<small>' . esc_html( __( 'No META tag will be added', 'wds' ) ) . '</small>'
305
+ ;
306
+
307
+ $arguments['wds_buddypress'] = $this->_get_buddyress_template_values();
308
+
309
+ $arguments['active_tab'] = $this->_get_last_active_tab( 'tab_sitemap' );
310
+
311
+ $extra_urls = Smartcrawl_Xml_Sitemap::get_extra_urls();
312
+ if ( is_array( $extra_urls ) ) {
313
+ $arguments['extra_urls'] = ! empty( $extra_urls )
314
+ ? implode( "\n", $extra_urls )
315
+ : ''
316
+ ;
317
+ }
318
+
319
+ $ignore_urls = Smartcrawl_Xml_Sitemap::get_ignore_urls();
320
+ if ( is_array( $ignore_urls ) ) {
321
+ $arguments['ignore_urls'] = ! empty( $ignore_urls )
322
+ ? implode( "\n", $ignore_urls )
323
+ : ''
324
+ ;
325
+ }
326
+
327
+ $ignore_post_ids = Smartcrawl_Xml_Sitemap::get_ignore_ids();
328
+ if ( is_array( $ignore_post_ids ) ) {
329
+ $arguments['ignore_post_ids'] = ! empty( $ignore_post_ids )
330
+ ? implode( ',', $ignore_post_ids )
331
+ : ''
332
+ ;
333
+ }
334
+
335
+ wp_enqueue_script( 'wds-admin-sitemaps' );
336
+ $this->_render_page( 'sitemap/sitemap-settings', $arguments );
337
+ }
338
+
339
+ /**
340
+ * BuddyPress settings fields helper.
341
+ *
342
+ * @return array BuddyPress values for the template
343
+ */
344
+ private function _get_buddyress_template_values() {
345
+ $arguments = array();
346
+ if ( ! defined( 'BP_VERSION' ) ) { return $arguments; }
347
+
348
+ $arguments['checkbox_options'] = array(
349
+ 'yes' => __( 'Yes', 'wds' ),
350
+ );
351
+
352
+ if ( function_exists( 'groups_get_groups' ) ) { // We have BuddyPress groups, so let's get some settings.
353
+ $groups = groups_get_groups( array( 'per_page' => SMARTCRAWL_BP_GROUPS_LIMIT ) );
354
+ $arguments['groups'] = ! empty( $groups['groups'] ) ? $groups['groups'] : array();
355
+ $arguments['exclude_groups'] = array();
356
+ foreach ( $arguments['groups'] as $group ) {
357
+ $arguments['exclude_groups'][ "exclude-buddypress-group-{$group->slug}" ] = $group->name;
358
+ }
359
+ }
360
+
361
+ $wp_roles = new WP_Roles();
362
+ $wp_roles = $wp_roles->get_names();
363
+ $wp_roles = $wp_roles ? $wp_roles : array();
364
+ $arguments['exclude_roles'] = array();
365
+ foreach ( $wp_roles as $key => $label ) {
366
+ $arguments['exclude_roles'][ "exclude-profile-role-{$key}" ] = $label;
367
+ }
368
+
369
+ return $arguments;
370
+ }
371
+
372
+ /**
373
+ * Default settings
374
+ */
375
+ public function defaults() {
376
+ if ( is_multisite() && SMARTCRAWL_SITEWIDE ) {
377
+ $this->options = get_site_option( $this->option_name );
378
+ } else {
379
+ $this->options = get_option( $this->option_name );
380
+ }
381
+
382
+ $dir = wp_upload_dir();
383
+ $path = trailingslashit( $dir['basedir'] );
384
+
385
+ if ( empty( $this->options['wds_sitemap-setup'] ) ) {
386
+ if ( ! isset( $this->options['sitemap-stylesheet'] ) ) {
387
+ $this->options['sitemap-stylesheet'] = 1;
388
+ }
389
+ }
390
+
391
+ if ( empty( $this->options['sitemappath'] ) ) {
392
+ $this->options['sitemappath'] = $path . 'sitemap.xml';
393
+ }
394
+
395
+ if ( empty( $this->options['sitemapurl'] ) ) {
396
+ $this->options['sitemapurl'] = get_bloginfo( 'url' ) . '/sitemap.xml';
397
+ }
398
+
399
+ if ( empty( $this->options['sitemap-images'] ) ) {
400
+ $this->options['sitemap-images'] = 0;
401
+ }
402
+
403
+ if ( empty( $this->options['sitemap-stylesheet'] ) ) {
404
+ $this->options['sitemap-stylesheet'] = 0;
405
+ }
406
+
407
+ if ( empty( $this->options['sitemap-dashboard-widget'] ) ) {
408
+ $this->options['sitemap-dashboard-widget'] = 0;
409
+ }
410
+
411
+ if ( empty( $this->options['sitemap-disable-automatic-regeneration'] ) ) {
412
+ $this->options['sitemap-disable-automatic-regeneration'] = 0;
413
+ }
414
+
415
+ if ( empty( $this->options['verification-google'] ) ) {
416
+ $this->options['verification-google'] = '';
417
+ }
418
+
419
+ if ( empty( $this->options['verification-bing'] ) ) {
420
+ $this->options['verification-bing'] = '';
421
+ }
422
+
423
+ if ( empty( $this->options['verification-pages'] ) ) {
424
+ $this->options['verification-pages'] = '';
425
+ }
426
+
427
+ if ( empty( $this->options['sitemap-buddypress-groups'] ) ) {
428
+ $this->options['sitemap-buddypress-groups'] = 0;
429
+ }
430
+
431
+ if ( empty( $this->options['sitemap-buddypress-profiles'] ) ) {
432
+ $this->options['sitemap-buddypress-profiles'] = 0;
433
+ }
434
+
435
+ if ( empty( $this->options['verification-google-meta'] ) ) { $this->options['verification-google-meta'] = ''; }
436
+ if ( empty( $this->options['verification-bing-meta'] ) ) { $this->options['verification-bing-meta'] = ''; }
437
+ if ( empty( $this->options['additional-metas'] ) ) { $this->options['additiona-metas'] = array(); }
438
+
439
+ if ( ! isset( $this->options['crawler-cron-enable'] ) ) { $this->options['crawler-cron-enable'] = false; }
440
+ if ( ! isset( $this->options['crawler-frequency'] ) ) { $this->options['crawler-frequency'] = Smartcrawl_Controller_Cron::get()->get_default_frequency(); }
441
+ if ( ! isset( $this->options['crawler-dow'] ) ) { $this->options['crawler-dow'] = rand( 0, 6 ); }
442
+ if ( ! isset( $this->options['crawler-tod'] ) ) { $this->options['crawler-tod'] = rand( 0, 23 ); }
443
+
444
+ if ( is_multisite() && SMARTCRAWL_SITEWIDE ) {
445
+ update_site_option( $this->option_name, $this->options );
446
+ } else {
447
+ update_option( $this->option_name, $this->options );
448
+ }
449
+ }
450
+
451
+ /**
452
+ * Handles sitemap active toggle request
453
+ */
454
+ public function json_toggle_sitemap_status() {
455
+ $data = stripslashes_deep( $_POST );
456
+ $status = (bool) smartcrawl_get_array_value( $data, 'sitemap_active' );
457
+ $return = array( 'success' => false );
458
+
459
+ if ( null === $status ) {
460
+ wp_send_json( $return );
461
+ return;
462
+ }
463
+
464
+ $options = self::get_specific_options( 'wds_settings_options' );
465
+ $options['sitemap'] = $status;
466
+ self::update_specific_options( 'wds_settings_options', $options );
467
+
468
+ $return['success'] = true;
469
+ wp_send_json( $return );
470
+ }
471
+ }
472
+
includes/admin/settings/social.php ADDED
@@ -0,0 +1,203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Smartcrawl_Social_Settings extends Smartcrawl_Settings_Admin {
4
+
5
+
6
+ private static $_instance;
7
+
8
+ public static function get_instance() {
9
+ if ( empty( self::$_instance ) ) {
10
+ self::$_instance = new self;
11
+ }
12
+ return self::$_instance;
13
+ }
14
+
15
+ /**
16
+ * Validate submitted options
17
+ *
18
+ * @param array $input Raw input
19
+ *
20
+ * @return array Validated input
21
+ */
22
+ public function validate( $input ) {
23
+ $result = array();
24
+
25
+ if ( ! empty( $input['wds_social-setup'] ) ) { $result['wds_social-setup'] = true; }
26
+
27
+ $result['disable-schema'] = ! empty( $input['disable-schema'] );
28
+
29
+ $urls = array(
30
+ 'facebook_url',
31
+ 'instagram_url',
32
+ 'linkedin_url',
33
+ 'pinterest_url',
34
+ 'gplus_url',
35
+ 'youtube_url',
36
+ );
37
+ foreach ( $urls as $type ) {
38
+ if ( empty( $input[ $type ] ) ) { continue; }
39
+ if ( ! preg_match( '/^https?:\/\//', $input[ $type ] ) ) { continue; }
40
+ $result[ $type ] = $input[ $type ];
41
+ }
42
+
43
+ if ( ! empty( $input['sitename'] ) ) { $result['sitename'] = sanitize_text_field( $input['sitename'] ); }
44
+ if ( ! empty( $input['override_name'] ) ) { $result['override_name'] = sanitize_text_field( $input['override_name'] ); }
45
+ if ( ! empty( $input['organization_name'] ) ) { $result['organization_name'] = sanitize_text_field( $input['organization_name'] ); }
46
+ if ( ! empty( $input['organization_logo'] ) ) { $result['organization_logo'] = sanitize_text_field( $input['organization_logo'] ); }
47
+ if ( ! empty( $input['schema_type'] ) ) { $result['schema_type'] = sanitize_text_field( $input['schema_type'] ); }
48
+ if ( ! empty( $input['twitter_username'] ) ) { $result['twitter_username'] = sanitize_text_field( $input['twitter_username'] ); }
49
+ if ( ! empty( $input['twitter-card-type'] ) ) { $result['twitter-card-type'] = sanitize_text_field( $input['twitter-card-type'] ); }
50
+ if ( ! empty( $input['fb-app-id'] ) ) { $result['fb-app-id'] = sanitize_text_field( $input['fb-app-id'] ); }
51
+
52
+ $result['og-enable'] = ! empty( $input['og-enable'] );
53
+ $result['twitter-card-enable'] = ! empty( $input['twitter-card-enable'] );
54
+
55
+ $this->_toggle_og_globally(
56
+ $result['og-enable']
57
+ );
58
+
59
+ $this->_toggle_twitter_cards_globally(
60
+ $result['twitter-card-enable']
61
+ );
62
+
63
+ if ( ! empty( $input['pinterest-verify'] ) ) {
64
+ if ( ! class_exists( 'Smartcrawl_Pinterest_Printer' ) ) { require_once( SMARTCRAWL_PLUGIN_DIR . '/tools/class_wds_pinterest_printer.php' ); }
65
+ $pin = Smartcrawl_Pinterest_Printer::get();
66
+ $raw = trim( $input['pinterest-verify'] );
67
+ $tag = $pin->get_verified_tag( $raw );
68
+ $result['pinterest-verify'] = str_replace( ' ', '', $raw ) === str_replace( ' ', '', $tag ) ? $tag : false;
69
+ $result['pinterest-verification-status'] = str_replace( ' ', '', $raw ) === str_replace( ' ', '', $tag ) ? '' : 'fail';
70
+ } else { $result['pinterest-verification-status'] = false; }
71
+
72
+ return $result;
73
+ }
74
+
75
+ private function _toggle_og_globally( $new_value ) {
76
+ $this->toggle_setting_globally('og-active', $new_value);
77
+ }
78
+
79
+ private function _toggle_twitter_cards_globally( $new_value ) {
80
+ $this->toggle_setting_globally('twitter-active', $new_value);
81
+ }
82
+
83
+ private function toggle_setting_globally( $prefix, $new_value ) {
84
+ $existing_settings = Smartcrawl_Settings::get_specific_options( 'wds_onpage_options' );
85
+ $strings = array(
86
+ 'home',
87
+ 'author',
88
+ 'date',
89
+ 'search',
90
+ '404',
91
+ 'category',
92
+ 'post_tag',
93
+ 'bp_groups',
94
+ 'bp_profile',
95
+ 'mp_marketplace-base',
96
+ 'mp_marketplace-categories',
97
+ 'mp_marketplace-tags',
98
+ );
99
+
100
+ foreach ( get_taxonomies( array( '_builtin' => false ), 'objects' ) as $taxonomy ) {
101
+ $strings[] = $taxonomy->name;
102
+ }
103
+
104
+ foreach ( get_post_types( array( 'public' => true ) ) as $post_type ) {
105
+ $strings[] = $post_type;
106
+ }
107
+
108
+ foreach ($strings as $string) {
109
+ $existing_settings[ sprintf('%s-%s', $prefix, $string) ] = $new_value;
110
+ }
111
+
112
+ Smartcrawl_Settings::update_specific_options( 'wds_onpage_options', $existing_settings );
113
+ }
114
+
115
+ public function init() {
116
+ $this->option_name = 'wds_social_options';
117
+ $this->name = Smartcrawl_Settings::COMP_SOCIAL;
118
+ $this->slug = Smartcrawl_Settings::TAB_SOCIAL;
119
+ $this->action_url = admin_url( 'options.php' );
120
+ $this->title = __( 'Social', 'wds' );
121
+ $this->page_title = __( 'SmartCrawl Wizard: Social', 'wds' );
122
+
123
+ parent::init();
124
+ }
125
+
126
+ /**
127
+ * Add admin settings page
128
+ */
129
+ public function options_page() {
130
+ parent::options_page();
131
+
132
+ $options = Smartcrawl_Settings::get_component_options( $this->name );
133
+ $options = wp_parse_args(
134
+ (is_array( $options ) ? $options : array()),
135
+ $this->get_default_options()
136
+ );
137
+
138
+ $arguments = array(
139
+ 'options' => $options,
140
+ );
141
+ if ( ! class_exists( 'Smartcrawl_Schema_Printer' ) ) { require_once( SMARTCRAWL_PLUGIN_DIR . '/tools/class_wds_schema_printer.php' ); }
142
+ if ( ! class_exists( 'Smartcrawl_Twitter_Printer' ) ) { require_once( SMARTCRAWL_PLUGIN_DIR . '/tools/class_wds_twitter_printer.php' ); }
143
+
144
+ $arguments['active_tab'] = $this->_get_last_active_tab( 'tab_accounts' );
145
+ wp_enqueue_script( 'wds-admin-social' );
146
+ wp_enqueue_media();
147
+
148
+ $this->_render_page( 'social/social-settings', $arguments );
149
+ }
150
+
151
+ /**
152
+ * Gets default options set and their initial values
153
+ *
154
+ * @return array
155
+ */
156
+ public function get_default_options() {
157
+ return array(
158
+ // Accounts
159
+ 'sitename' => get_bloginfo( 'name' ),
160
+ 'disable-schema' => false,
161
+ 'schema_type' => '',
162
+ 'override_name' => '',
163
+ 'organization_name' => '',
164
+ 'organization_logo' => '',
165
+ 'twitter_username' => '',
166
+ 'facebook_url' => '',
167
+ 'instagram_url' => '',
168
+ 'linkedin_url' => '',
169
+ 'pinterest_url' => '',
170
+ 'gplus_url' => '',
171
+ 'youtube_url' => '',
172
+ // Twitter
173
+ 'twitter-card-enable' => false,
174
+ 'twitter-card-type' => '',
175
+ // Pinterest
176
+ 'pinterest-verify' => '',
177
+ // OpenGraph
178
+ 'og-enable' => true,
179
+ // Facebook-specific
180
+ 'fb-app-id' => '',
181
+ );
182
+ }
183
+
184
+ /**
185
+ * Default settings
186
+ */
187
+ public function defaults() {
188
+ $options = Smartcrawl_Settings::get_component_options( $this->name );
189
+ $options = is_array( $options ) ? $options : array();
190
+
191
+ foreach ( $this->get_default_options() as $opt => $default ) {
192
+ if ( ! isset( $options[ $opt ] ) ) { $options[ $opt ] = $default; }
193
+ }
194
+
195
+ if ( is_multisite() && SMARTCRAWL_SITEWIDE ) {
196
+ update_site_option( $this->option_name, $options );
197
+ } else {
198
+ update_option( $this->option_name, $options );
199
+ }
200
+ }
201
+
202
+ }
203
+
includes/admin/shared-ui/font/WPMU DEV Dashboard.json ADDED
@@ -0,0 +1,1396 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "metadata": {
3
+ "name": "WPMU DEV Dashboard",
4
+ "lastOpened": 1446220177291,
5
+ "created": 1446220144047
6
+ },
7
+ "iconSets": [
8
+ {
9
+ "selection": [
10
+ {
11
+ "order": 77,
12
+ "id": 70,
13
+ "name": "comment",
14
+ "prevSize": 32,
15
+ "code": 65,
16
+ "tempChar": ""
17
+ },
18
+ {
19
+ "order": 45,
20
+ "id": 8,
21
+ "prevSize": 32,
22
+ "code": 109,
23
+ "name": "speach",
24
+ "tempChar": ""
25
+ },
26
+ {
27
+ "id": 21,
28
+ "order": 40,
29
+ "prevSize": 32,
30
+ "code": 61,
31
+ "name": "speach_alt",
32
+ "tempChar": ""
33
+ },
34
+ {
35
+ "order": 81,
36
+ "id": 68,
37
+ "name": "download",
38
+ "prevSize": 32,
39
+ "code": 66,
40
+ "tempChar": ""
41
+ },
42
+ {
43
+ "id": 32,
44
+ "order": 10,
45
+ "prevSize": 32,
46
+ "code": 105,
47
+ "name": "download_alt",
48
+ "tempChar": ""
49
+ },
50
+ {
51
+ "order": 101,
52
+ "id": 50,
53
+ "name": "upload",
54
+ "prevSize": 32,
55
+ "code": 86,
56
+ "tempChar": ""
57
+ },
58
+ {
59
+ "order": 82,
60
+ "id": 67,
61
+ "name": "error",
62
+ "prevSize": 32,
63
+ "code": 69,
64
+ "tempChar": ""
65
+ },
66
+ {
67
+ "order": 90,
68
+ "id": 63,
69
+ "name": "archive",
70
+ "prevSize": 32,
71
+ "code": 79,
72
+ "tempChar": ""
73
+ },
74
+ {
75
+ "id": 19,
76
+ "order": 25,
77
+ "prevSize": 32,
78
+ "code": 57,
79
+ "name": "logo",
80
+ "tempChar": ""
81
+ },
82
+ {
83
+ "id": 20,
84
+ "order": 26,
85
+ "prevSize": 32,
86
+ "code": 48,
87
+ "name": "logo_alt",
88
+ "tempChar": ""
89
+ },
90
+ {
91
+ "order": 95,
92
+ "id": 48,
93
+ "name": "wordpress",
94
+ "prevSize": 32,
95
+ "code": 71,
96
+ "tempChar": ""
97
+ },
98
+ {
99
+ "order": 85,
100
+ "id": 66,
101
+ "name": "facebook",
102
+ "prevSize": 32,
103
+ "code": 70,
104
+ "tempChar": ""
105
+ },
106
+ {
107
+ "order": 88,
108
+ "id": 51,
109
+ "name": "twitter",
110
+ "prevSize": 32,
111
+ "code": 73,
112
+ "tempChar": ""
113
+ },
114
+ {
115
+ "order": 89,
116
+ "id": 64,
117
+ "name": "github",
118
+ "prevSize": 32,
119
+ "code": 74,
120
+ "tempChar": ""
121
+ },
122
+ {
123
+ "order": 83,
124
+ "id": 54,
125
+ "name": "stackoverflow",
126
+ "prevSize": 32,
127
+ "code": 75,
128
+ "tempChar": ""
129
+ },
130
+ {
131
+ "order": 94,
132
+ "id": 61,
133
+ "name": "linkedin",
134
+ "prevSize": 32,
135
+ "code": 76,
136
+ "tempChar": ""
137
+ },
138
+ {
139
+ "order": 97,
140
+ "id": 60,
141
+ "name": "medium",
142
+ "prevSize": 32,
143
+ "code": 77,
144
+ "tempChar": ""
145
+ },
146
+ {
147
+ "order": 100,
148
+ "id": 57,
149
+ "name": "quora",
150
+ "prevSize": 32,
151
+ "code": 81,
152
+ "tempChar": ""
153
+ },
154
+ {
155
+ "order": 104,
156
+ "id": 73,
157
+ "name": "seo",
158
+ "prevSize": 32,
159
+ "code": 83,
160
+ "tempChar": ""
161
+ },
162
+ {
163
+ "order": 98,
164
+ "id": 59,
165
+ "name": "minify",
166
+ "prevSize": 32,
167
+ "code": 78,
168
+ "tempChar": ""
169
+ },
170
+ {
171
+ "order": 92,
172
+ "id": 49,
173
+ "name": "uptime",
174
+ "prevSize": 32,
175
+ "code": 85,
176
+ "tempChar": ""
177
+ },
178
+ {
179
+ "order": 96,
180
+ "id": 47,
181
+ "name": "world",
182
+ "prevSize": 32,
183
+ "code": 87,
184
+ "tempChar": ""
185
+ },
186
+ {
187
+ "order": 50,
188
+ "id": 3,
189
+ "prevSize": 32,
190
+ "code": 89,
191
+ "name": "pos_footer",
192
+ "tempChar": ""
193
+ },
194
+ {
195
+ "order": 49,
196
+ "id": 4,
197
+ "prevSize": 32,
198
+ "code": 88,
199
+ "name": "pos_middle",
200
+ "tempChar": ""
201
+ },
202
+ {
203
+ "order": 48,
204
+ "id": 5,
205
+ "prevSize": 32,
206
+ "code": 67,
207
+ "name": "pos_header",
208
+ "tempChar": ""
209
+ },
210
+ {
211
+ "order": 43,
212
+ "id": 6,
213
+ "prevSize": 32,
214
+ "code": 98,
215
+ "name": "book",
216
+ "tempChar": ""
217
+ },
218
+ {
219
+ "order": 46,
220
+ "id": 9,
221
+ "prevSize": 32,
222
+ "code": 110,
223
+ "name": "support",
224
+ "tempChar": ""
225
+ },
226
+ {
227
+ "id": 33,
228
+ "order": 11,
229
+ "prevSize": 32,
230
+ "code": 106,
231
+ "name": "rocket",
232
+ "tempChar": ""
233
+ },
234
+ {
235
+ "order": 52,
236
+ "id": 7,
237
+ "prevSize": 32,
238
+ "code": 118,
239
+ "name": "rocket_alt",
240
+ "tempChar": ""
241
+ },
242
+ {
243
+ "id": 25,
244
+ "order": 3,
245
+ "prevSize": 32,
246
+ "code": 97,
247
+ "name": "lock",
248
+ "tempChar": ""
249
+ },
250
+ {
251
+ "id": 26,
252
+ "order": 4,
253
+ "prevSize": 32,
254
+ "code": 99,
255
+ "name": "unlock",
256
+ "tempChar": ""
257
+ },
258
+ {
259
+ "id": 27,
260
+ "order": 5,
261
+ "prevSize": 32,
262
+ "code": 100,
263
+ "name": "plugin",
264
+ "tempChar": ""
265
+ },
266
+ {
267
+ "id": 39,
268
+ "order": 17,
269
+ "prevSize": 32,
270
+ "code": 114,
271
+ "name": "caret_up",
272
+ "tempChar": ""
273
+ },
274
+ {
275
+ "order": 103,
276
+ "id": 71,
277
+ "name": "caret_right",
278
+ "prevSize": 32,
279
+ "code": 51,
280
+ "tempChar": ""
281
+ },
282
+ {
283
+ "id": 28,
284
+ "order": 6,
285
+ "prevSize": 32,
286
+ "code": 101,
287
+ "name": "caret_down",
288
+ "tempChar": ""
289
+ },
290
+ {
291
+ "order": 102,
292
+ "id": 72,
293
+ "name": "caret_left",
294
+ "prevSize": 32,
295
+ "code": 124,
296
+ "tempChar": ""
297
+ },
298
+ {
299
+ "id": 29,
300
+ "order": 7,
301
+ "prevSize": 32,
302
+ "code": 102,
303
+ "name": "power",
304
+ "tempChar": ""
305
+ },
306
+ {
307
+ "id": 31,
308
+ "order": 9,
309
+ "prevSize": 32,
310
+ "code": 104,
311
+ "name": "radio_default, radio",
312
+ "tempChar": ""
313
+ },
314
+ {
315
+ "id": 30,
316
+ "order": 8,
317
+ "prevSize": 32,
318
+ "code": 103,
319
+ "name": "radio_checked",
320
+ "tempChar": ""
321
+ },
322
+ {
323
+ "id": 45,
324
+ "order": 23,
325
+ "prevSize": 32,
326
+ "code": 121,
327
+ "name": "cross",
328
+ "tempChar": ""
329
+ },
330
+ {
331
+ "id": 46,
332
+ "order": 24,
333
+ "prevSize": 32,
334
+ "code": 122,
335
+ "name": "tick",
336
+ "tempChar": ""
337
+ },
338
+ {
339
+ "id": 34,
340
+ "order": 12,
341
+ "prevSize": 32,
342
+ "code": 107,
343
+ "name": "search",
344
+ "tempChar": ""
345
+ },
346
+ {
347
+ "id": 37,
348
+ "order": 15,
349
+ "prevSize": 32,
350
+ "code": 112,
351
+ "name": "info",
352
+ "tempChar": ""
353
+ },
354
+ {
355
+ "id": 10,
356
+ "order": 41,
357
+ "prevSize": 32,
358
+ "code": 49,
359
+ "name": "devman",
360
+ "tempChar": ""
361
+ },
362
+ {
363
+ "id": 16,
364
+ "order": 35,
365
+ "prevSize": 32,
366
+ "code": 55,
367
+ "name": "upfront",
368
+ "tempChar": ""
369
+ },
370
+ {
371
+ "order": 93,
372
+ "id": 62,
373
+ "name": "hummingbird",
374
+ "prevSize": 32,
375
+ "code": 72,
376
+ "tempChar": ""
377
+ },
378
+ {
379
+ "order": 80,
380
+ "id": 69,
381
+ "name": "defender",
382
+ "prevSize": 32,
383
+ "code": 68,
384
+ "tempChar": ""
385
+ },
386
+ {
387
+ "id": 35,
388
+ "order": 13,
389
+ "prevSize": 32,
390
+ "code": 108,
391
+ "name": "theme",
392
+ "tempChar": ""
393
+ },
394
+ {
395
+ "order": 99,
396
+ "id": 58,
397
+ "name": "pencil",
398
+ "prevSize": 32,
399
+ "code": 80,
400
+ "tempChar": ""
401
+ },
402
+ {
403
+ "order": 84,
404
+ "id": 53,
405
+ "name": "star",
406
+ "prevSize": 32,
407
+ "code": 90,
408
+ "tempChar": ""
409
+ },
410
+ {
411
+ "order": 87,
412
+ "id": 52,
413
+ "name": "trash",
414
+ "prevSize": 32,
415
+ "code": 84,
416
+ "tempChar": ""
417
+ },
418
+ {
419
+ "order": 78,
420
+ "id": 56,
421
+ "name": "recycle",
422
+ "prevSize": 32,
423
+ "code": 82,
424
+ "tempChar": ""
425
+ },
426
+ {
427
+ "order": 86,
428
+ "id": 65,
429
+ "name": "fix",
430
+ "prevSize": 32,
431
+ "code": 50,
432
+ "tempChar": ""
433
+ },
434
+ {
435
+ "id": 36,
436
+ "order": 14,
437
+ "prevSize": 32,
438
+ "code": 111,
439
+ "name": "edit",
440
+ "tempChar": ""
441
+ },
442
+ {
443
+ "id": 40,
444
+ "order": 18,
445
+ "prevSize": 32,
446
+ "code": 115,
447
+ "name": "options",
448
+ "tempChar": ""
449
+ },
450
+ {
451
+ "id": 41,
452
+ "order": 19,
453
+ "prevSize": 32,
454
+ "code": 116,
455
+ "name": "cog",
456
+ "tempChar": ""
457
+ },
458
+ {
459
+ "id": 38,
460
+ "order": 47,
461
+ "prevSize": 32,
462
+ "code": 113,
463
+ "name": "badge",
464
+ "tempChar": ""
465
+ },
466
+ {
467
+ "id": 42,
468
+ "order": 20,
469
+ "prevSize": 32,
470
+ "code": 117,
471
+ "name": "cylinder",
472
+ "tempChar": ""
473
+ },
474
+ {
475
+ "id": 44,
476
+ "order": 22,
477
+ "prevSize": 32,
478
+ "code": 120,
479
+ "name": "trophy",
480
+ "tempChar": ""
481
+ },
482
+ {
483
+ "id": 43,
484
+ "order": 21,
485
+ "prevSize": 32,
486
+ "code": 119,
487
+ "name": "bell",
488
+ "tempChar": ""
489
+ }
490
+ ],
491
+ "id": 3,
492
+ "metadata": {
493
+ "name": "WPMU DEV App Icons",
494
+ "importSize": {
495
+ "width": 32,
496
+ "height": 32
497
+ }
498
+ },
499
+ "height": 1024,
500
+ "prevSize": 32,
501
+ "icons": [
502
+ {
503
+ "id": 70,
504
+ "paths": [
505
+ "M0 190.573c0.213-105.296 85.621-190.573 190.947-190.573 0.066 0 0.132 0 0.198 0l666.058-0c0.056-0 0.122-0 0.188-0 105.325 0 190.734 85.277 190.947 190.552l0 492.364c0 105.354-85.406 190.76-190.76 190.76h-38.938l-60.279 149.762-146.018-149.762h-421.955c-105.17-0.107-190.385-85.388-190.385-190.572 0-0.066 0-0.132 0-0.198l-0-492.333z"
506
+ ],
507
+ "attrs": [],
508
+ "isMulticolor": false,
509
+ "width": 1048,
510
+ "grid": 0,
511
+ "tags": [
512
+ "comment"
513
+ ],
514
+ "colorPermutations": {}
515
+ },
516
+ {
517
+ "id": 8,
518
+ "paths": [
519
+ "M699.206 370.919h-345.743c-13.632 0-24.696 11.014-24.696 24.696 0 13.632 11.064 24.696 24.696 24.696h345.743c13.632 0 24.696-11.064 24.696-24.696 0-13.682-11.064-24.696-24.696-24.696z",
520
+ "M699.206 667.271h-345.743c-13.632 0-24.696 11.014-24.696 24.696 0 13.632 11.064 24.696 24.696 24.696h345.743c13.632 0 24.696-11.064 24.696-24.696 0-13.682-11.064-24.696-24.696-24.696z",
521
+ "M699.206 519.095h-345.743c-13.632 0-24.696 11.014-24.696 24.696 0 13.632 11.064 24.696 24.696 24.696h345.743c13.632 0 24.696-11.064 24.696-24.696 0-13.682-11.064-24.696-24.696-24.696z",
522
+ "M501.639 28.88c-272.742 0-493.919 221.226-493.919 493.919 0 109.897 35.908 211.447 96.611 293.437l-51.318 177.218 175.983-58.727c78.089 51.911 171.884 81.991 272.643 81.991 272.742 0 493.919-221.078 493.919-493.919 0-272.693-221.177-493.919-493.919-493.919v0zM501.639 917.935c-78.138 0-153.461-22.671-217.917-65.494-16.398-10.916-35.463-16.497-54.726-16.497-9.681 0-19.362 1.432-28.845 4.297 7.162-28.598 1.185-59.023-16.398-82.781-50.528-68.21-77.249-149.312-77.249-234.661 0-217.868 177.268-395.135 395.135-395.135s395.135 177.268 395.135 395.135c0 217.868-177.268 395.135-395.135 395.135v0z"
523
+ ],
524
+ "attrs": [],
525
+ "isMulticolor": false,
526
+ "grid": 0,
527
+ "tags": [
528
+ "speach"
529
+ ],
530
+ "colorPermutations": {}
531
+ },
532
+ {
533
+ "id": 21,
534
+ "paths": [
535
+ "M558 778c-42 14-86 22-134 22-26 0-50-2-76-8-22 20-74 52-150 58-2 2-2 2-4 2-6 0-14-4-4-8 22-14 62-40 62-80-120-52-202-156-202-276 0-174 168-314 374-314 156 0 290 80 346 194 22 2 42 8 60 14-52-148-214-258-406-258-234 0-424 164-424 364 0 120 70 232 186 298-6 6-14 10-22 14-28 16-32 42-28 60 6 20 24 42 58 42 2 0 6-2 8-2 74-6 128-32 160-54 20 2 42 4 62 4 70 0 134-16 192-40-22-8-42-18-58-32zM732 390c138 0 248 94 248 208 0 82-54 152-134 186 10 28 40 50 58 60 10 4 2 8-4 8-2 0-2 0-4-2-62-4-108-26-134-46-10 2-20 2-30 2-138 0-250-92-250-208 0-114 112-208 250-208zM732 340c-166 0-300 116-300 258s134 258 300 258c4 0 10 0 18 0 32 20 80 40 142 44 2 0 4 2 8 2 34 0 52-22 58-42 4-18 0-44-30-60-2-2-2-2-4-4 66-48 106-120 106-198 0-142-134-258-298-258z"
536
+ ],
537
+ "attrs": [],
538
+ "isMulticolor": false,
539
+ "tags": [
540
+ "speach_alt",
541
+ "comment"
542
+ ],
543
+ "defaultCode": 57345,
544
+ "grid": 0,
545
+ "colorPermutations": {}
546
+ },
547
+ {
548
+ "id": 68,
549
+ "paths": [
550
+ "M1050.836 1024h-749.992c-0.424 0.002-0.925 0.003-1.426 0.003-15.013 0-29.805-0.942-44.322-2.77-117.762-14.242-218.304-105.483-247.147-224.715-3.005-14.041-5.359-25.576-7.949-36.169v-69.208c-0.121 0.517 1.417-1.772 2.319-4.359 11.525-110.342 91.606-206.428 199.228-241.984 7.938-1.803 12.284-6.922 12.284-13.057 0-1.006-0.117-1.986-0.338-2.925 0.011-0.63 0.007-1.476 0.007-2.323 0-163.941 132.901-296.842 296.842-296.842 20.495 0 40.506 2.077 59.832 6.032-0.203 0.254 1.768 0.59 3.817 0.59 6.46 0 12.14-3.336 15.413-8.378 26.059-43.611 96.992-96.055 180.393-117.272-11.657 2.522 15.599-5.389 44.039-9.689 10.816-1.059 21.262-1.533 31.817-1.533 18.246 0 36.161 1.416 53.642 4.144 69.441 4.088 148.797 45.322 204.691 107.946 55.785 58.363 89.947 137.21 89.947 224.035 0 13.662-0.846 27.126-2.488 40.343-0.163-0.309-0.348 1.151-0.348 2.653 0 6.791 3.784 12.699 9.359 15.729 68.861 34.597 134.23 117.504 155.763 216.754-1.424-7.797 3.362 11.618 5.916 31.73 1.696 13.937 2.586 28.537 2.586 43.344s-0.889 29.407-2.618 43.748c-15.395 134.38-118.284 249.368-253.362 283.546-10.044 3.904-33.128 8.976-57.16 10.586zM780.359 317.793h-146.42c-12.397 1.14-22.314 11.010-23.532 23.433l-0.009 194.314c-0.974 12.508-10.94 22.506-23.448 23.534l-99.432 0.006c-14.36 0-48.493 0 0 48.728l195.149 196.326c6.226 6.256 14.843 10.128 24.364 10.128s18.139-3.872 24.363-10.127l195.15-194.914c49.199-49.199 11.535-48.728 0-48.728h-97.692c-13.001 0-23.54-10.539-23.54-23.54v-195.384c-0.63-13.496-11.616-24.24-25.165-24.482z"
551
+ ],
552
+ "attrs": [],
553
+ "isMulticolor": false,
554
+ "width": 1365,
555
+ "grid": 0,
556
+ "tags": [
557
+ "download"
558
+ ],
559
+ "colorPermutations": {}
560
+ },
561
+ {
562
+ "id": 32,
563
+ "paths": [
564
+ "M753.6 848c-174.4 0-318.4 0-492.8 0-16 0-27.2-1.6-28.8-1.6-80-11.2-145.6-70.4-163.2-150.4-1.6-8-3.2-14.4-4.8-22.4 0-14.4 0-30.4 0-44.8 0-1.6 1.6-1.6 1.6-3.2 12.8-78.4 57.6-131.2 132.8-160 6.4-1.6 6.4-4.8 6.4-9.6-1.6-123.2 112-217.6 233.6-193.6 6.4 1.6 9.6 0 14.4-4.8 32-38.4 72-64 120-76.8 9.6-1.6 19.2-4.8 28.8-6.4 25.6-3.2 52.8 1.6 54.4 1.6 54.4 8 99.2 30.4 136 70.4 44.8 49.6 64 105.6 57.6 172.8 0 6.4 1.6 9.6 6.4 12.8 54.4 33.6 88 81.6 102.4 144 1.6 8 3.2 12.8 3.2 20.8 3.2 28.8 0 54.4 0 56-12.8 91.2-78.4 164.8-168 188.8-12.8 3.2-27.2 6.4-40 6.4zM560 400c-32 0-73.6 0-96 0-8 0-16 8-16 16 0 43.2 0 84.8 0 128 0 9.6-8 16-16 16-27.2 0-38.4 0-64 0-9.6 0-32 0 0 32 44.8 44.8 84.8 84.8 128 128 8 8 22.4 9.6 32 0 43.2-43.2 84.8-84.8 128-128 32-32 8-32 0-32-16 0-48 0-64 0-9.6 0-16-8-16-16 0-48 0-80 0-128 0-9.6-8-16-16-16z"
565
+ ],
566
+ "attrs": [],
567
+ "isMulticolor": false,
568
+ "tags": [
569
+ "download"
570
+ ],
571
+ "defaultCode": 105,
572
+ "grid": 0,
573
+ "colorPermutations": {}
574
+ },
575
+ {
576
+ "id": 50,
577
+ "paths": [
578
+ "M1050.836 1024h-749.992c-0.424 0.002-0.925 0.003-1.426 0.003-15.013 0-29.805-0.942-44.322-2.77-117.762-14.242-218.304-105.483-247.147-224.715-3.005-14.041-5.359-25.576-7.949-36.169v-69.208c-0.121 0.517 1.417-1.772 2.319-4.359 11.525-110.342 91.606-206.428 199.228-241.984 7.938-1.803 12.284-6.922 12.284-13.057 0-1.006-0.117-1.986-0.338-2.925 0.011-0.63 0.007-1.476 0.007-2.323 0-163.941 132.901-296.842 296.842-296.842 20.495 0 40.506 2.077 59.832 6.032-0.203 0.254 1.768 0.59 3.817 0.59 6.46 0 12.14-3.336 15.413-8.378 26.059-43.611 96.992-96.055 180.393-117.272-11.657 2.522 15.599-5.389 44.039-9.689 10.816-1.059 21.262-1.533 31.817-1.533 18.246 0 36.161 1.416 53.642 4.144 69.441 4.088 148.797 45.322 204.691 107.946 55.785 58.363 89.947 137.21 89.947 224.035 0 13.662-0.846 27.126-2.488 40.343-0.163-0.309-0.348 1.151-0.348 2.653 0 6.791 3.784 12.699 9.359 15.729 68.861 34.597 134.23 117.504 155.763 216.754-1.424-7.797 3.362 11.618 5.916 31.73 1.696 13.937 2.586 28.537 2.586 43.344s-0.889 29.407-2.618 43.748c-15.395 134.38-118.284 249.368-253.362 283.546-10.044 3.904-33.128 8.976-57.16 10.586zM633.468 814.257h146.185c12.397-1.14 22.314-11.010 23.532-23.433l0.009-195.727c0.974-12.508 10.94-22.506 23.448-23.534l97.549-0.006c14.36 0 48.493 0 0-48.728l-195.149-194.913c-6.226-6.256-14.843-10.128-24.364-10.128s-18.139 3.872-24.363 10.127l-195.15 194.914c-49.199 49.199-11.535 48.728 0 48.728h97.457c13.001 0 23.54 10.539 23.54 23.54v194.913c0.741 13.575 11.929 24.302 25.623 24.302 0.592 0 1.18-0.020 1.763-0.060z"
579
+ ],
580
+ "attrs": [],
581
+ "isMulticolor": false,
582
+ "width": 1365,
583
+ "grid": 0,
584
+ "tags": [
585
+ "upload"
586
+ ],
587
+ "colorPermutations": {}
588
+ },
589
+ {
590
+ "id": 67,
591
+ "paths": [
592
+ "M1133.686 927.114l-507.668-894.818c-10.931-19.443-31.427-32.362-54.942-32.362s-44.011 12.919-54.779 32.047l-507.831 895.133c-5.349 9.287-8.504 20.423-8.504 32.295s3.155 23.008 8.673 32.615c10.799 19.015 31.273 31.902 54.762 31.976l1015.346 0c23.439-0.050 43.924-12.919 54.778-31.984 5.512-9.599 8.667-20.734 8.667-32.607s-3.155-23.008-8.673-32.615zM571.077 899.545c-47.431-2.299-85.016-41.314-85.016-89.108s37.585-86.808 84.811-89.1c47.636 2.291 85.221 41.306 85.221 89.1s-37.585 86.808-84.811 89.1zM640.985 606.523c-1.182 27.372-31.311 48.443-71.089 48.443s-67.545-21.071-68.726-48.443c-6.105-98.462-19.692-275.692-19.692-294.006 0-36.037 39.385-64.197 90.388-64.197s86.843 28.16 86.843 64.197c0.591 17.526-11.422 196.135-17.526 293.809z"
593
+ ],
594
+ "attrs": [],
595
+ "isMulticolor": false,
596
+ "width": 1142,
597
+ "grid": 0,
598
+ "tags": [
599
+ "error",
600
+ "warning"
601
+ ],
602
+ "colorPermutations": {}
603
+ },
604
+ {
605
+ "id": 63,
606
+ "paths": [
607
+ "M382.025 694.59h-238.592c-1.362 0.048-2.963 0.075-4.569 0.075-76.722 0-138.918-62.196-138.918-138.918 0-1.37 0.020-2.735 0.059-4.095q-0.005-206.441-0.005-412.734c0-76.722 62.196-138.918 138.918-138.918 161.666 0 324.026 0 486.213 0 0.971-0.025 2.113-0.040 3.26-0.040 56.17 0 104.23 34.726 123.881 83.881 14.209 31.287-1.593 54.73-34.412 54.73h-503.578c-1.857-0.176-4.014-0.277-6.195-0.277-38.361 0-69.459 31.098-69.459 69.459 0 2.237 0.106 4.45 0.313 6.633q-0.021 131.52-0.021 263.318c0 50.705 27.784 77.968 78.662 77.968h501.321c1.458-0.217 3.141-0.341 4.852-0.341 19.181 0 34.73 15.549 34.73 34.73 0 6.532-1.803 12.643-4.94 17.862-21.008 51.071-70.552 86.546-128.396 86.667l-243.122 0z",
608
+ "M451.484 746.685h208.377v121.553c25.7 0 15.802 0 40.634 0 2.535-0.441 5.797-2.794 7.78-6.017 12.82-17.355 33.139-28.447 56.049-28.447 38.361 0 69.459 31.098 69.459 69.459 0 2.169-0.099 4.314-0.294 6.432-2.734 30.281-26.005 55.449-56.157 61.132-4.598 1.004-9.383 1.54-14.293 1.54-22.154 0-41.758-10.918-53.726-27.666-2.948-4.367-7.652-7.070-12.987-7.070-0.611 0-1.215 0.036-1.807 0.105-22.676-0.007-10.694-0.007-33.268-0.007 0 29.867-28.826 86.824-105.578 86.824-1.14 0.046-2.478 0.072-3.822 0.072-50.887 0-93.019-37.48-100.298-86.34-24.726-0.555-14.828-0.555-39.833-0.555-2.535 0.441-5.797 2.794-7.78 6.017-12.746 18.188-33.546 29.892-57.081 29.892-38.361 0-69.459-31.098-69.459-69.459 0-2.741 0.159-5.444 0.468-8.102 2.724-30.229 25.995-55.398 56.147-61.080 4.598-1.004 9.383-1.54 14.293-1.54 22.154 0 41.758 10.918 53.726 27.666 2.935 4.459 7.69 7.232 13.094 7.232 0.574 0 1.14-0.031 1.698-0.092 22.679 0.006 10.697 0.006 34.661 0.006v-121.553z",
609
+ "M664.376 358.93l-217.58-80.746v-80.92l217.58 80.92v80.746z",
610
+ "M664.376 220.185l-217.58-80.92h217.58v80.92z",
611
+ "M664.376 497.674l-217.58-80.746v-80.746l217.58 80.746v80.746z",
612
+ "M446.795 555.672v-80.746l217.58 80.746h-217.58z"
613
+ ],
614
+ "attrs": [],
615
+ "isMulticolor": false,
616
+ "width": 833,
617
+ "grid": 0,
618
+ "tags": [
619
+ "gzip",
620
+ "archive"
621
+ ],
622
+ "colorPermutations": {}
623
+ },
624
+ {
625
+ "id": 19,
626
+ "paths": [
627
+ "M1004 670v-670l-108 84v586c0 34-24 62-54 62-32 0-56-28-56-62v-312c0-100-74-182-164-182s-162 82-162 182v312c0 34-26 62-56 62s-54-28-54-62v-312c0-100-74-182-164-182s-164 82-164 182v0 670l108-84v-586c0-34 26-62 56-62s56 28 56 62l-2 312c0 100 74 182 164 182s164-82 164-182v0-312c0-34 24-62 54-62 32 0 56 28 56 62v312c0 100 72 182 164 182 90 0 162-82 162-182z"
628
+ ],
629
+ "attrs": [],
630
+ "isMulticolor": false,
631
+ "tags": [
632
+ "wpmudev-logo"
633
+ ],
634
+ "defaultCode": 99,
635
+ "grid": 0,
636
+ "colorPermutations": {}
637
+ },
638
+ {
639
+ "id": 20,
640
+ "paths": [
641
+ "M514 0c-284 0-514 230-514 514s230 514 514 514c284 0 514-230 514-514s-230-514-514-514zM514 950c-242 0-436-196-436-436 0-242 194-436 436-436 240 0 436 194 436 436 0 240-196 436-436 436zM774 228l-60 48v322c0 20-14 34-30 34-18 0-32-14-32-34v-172c0-56-40-100-90-100s-90 44-90 100v172c0 20-14 34-30 34s-30-14-30-34v-172c0-56-40-100-90-100s-90 44-90 100v0 370l58-46v-324c0-18 14-34 32-34 16 0 30 16 30 34v172c0 56 40 102 90 102s90-46 90-102v0-172c0-18 14-34 30-34 18 0 32 16 32 34v172c0 56 40 102 90 102s90-46 90-102v0-370z"
642
+ ],
643
+ "attrs": [],
644
+ "isMulticolor": false,
645
+ "tags": [
646
+ "wpmudev-logo"
647
+ ],
648
+ "defaultCode": 100,
649
+ "grid": 0,
650
+ "colorPermutations": {}
651
+ },
652
+ {
653
+ "id": 48,
654
+ "paths": [
655
+ "M510.72 1024c-282.192-0.764-510.657-229.701-510.657-511.998 0-282.77 229.23-512 512-512s512 229.23 512 512c0 2.828-0.023 5.651-0.069 8.469-3.807 278.716-230.984 503.536-510.67 503.536-0.916 0-1.831-0.002-2.746-0.007zM801.829 186.331c-192-178.103-514.011-136.594-652.069 83.383 1.457 0.351 5.118 0.794 8.862 0.912l128.098-4.569c1.526-0.428 3.279-0.673 5.089-0.673 9.947 0 18.161 7.423 19.403 17.033 0.021 0.347 0.027 0.638 0.027 0.931 0 11.21-9.087 20.297-20.297 20.297-0.714 0-1.42-0.037-2.116-0.109-13.81 1.653-27.89 2.75-43.616 4.213l157.074 469.76c2.56-6.766 4.023-10.606 5.303-14.629 28.343-85.029 56.686-170.24 85.211-256 1.679-4.231 2.652-9.133 2.652-14.263s-0.973-10.032-2.745-14.532c-18.192-48.005-36.478-96.097-52.752-144.919-6.583-19.749-14.811-31.451-36.571-28.526-0.546 0.016-1.189 0.025-1.834 0.025-5.843 0-11.513-0.743-16.92-2.139-8.938-0.769-16.246-8.623-16.246-18.183 0-10.14 8.22-18.36 18.36-18.36 0.579 0 1.153 0.027 1.718 0.079 14.007-0.005 28.27 1.457 42.35 2.555 22.64 1.451 49.092 2.278 75.736 2.278 38.096 0 75.797-1.69 113.032-5-3.065-0.267-1.049-0.621 1.050-0.621 9.86 0 17.897 7.804 18.272 17.572 0.040 0.495 0.062 1.031 0.062 1.572 0 10.705-8.678 19.383-19.383 19.383-0.601 0-1.195-0.027-1.782-0.081-14.37 1.651-28.816 2.931-44.542 4.577l156.16 464.457c-2.265 4.5 0.24 0.213 1.921-4.467 22.399-75.076 45.439-149.864 66.833-224.836 5.267-17.232 8.3-37.039 8.3-57.555 0-37.519-10.143-72.669-27.837-102.857-7.891-14.4-17.765-28.845-25.994-44.571 3.982 11.641-12.885-20.218-22.608-55.057-1.764-7.159-2.529-13.298-2.529-19.616 0-39.446 29.81-71.93 68.131-76.153-2.341 0.849 2.341-0.302 6.655-2.147zM655.726 923.977l-134.766-367.177h-2.926l-128.914 374.674c36.697 11.121 78.871 17.524 122.541 17.524 51.481 0 100.884-8.898 146.754-25.239zM318.72 903.314l-206.629-566.857c-23.247 51.636-36.791 111.934-36.791 175.395 0 170.748 98.044 318.596 240.906 390.319zM899.291 310.857c0 6.217 0 9.143 0 12.069 0.474 7.029 0.745 15.236 0.745 23.506 0 43.384-7.439 85.030-21.111 123.733q-54.057 156.852-108.914 316.12l-34.743 100.571c197.303-111.726 272.823-371.383 164.571-575.817z"
656
+ ],
657
+ "attrs": [],
658
+ "isMulticolor": false,
659
+ "grid": 0,
660
+ "tags": [
661
+ "wordpress"
662
+ ],
663
+ "colorPermutations": {}
664
+ },
665
+ {
666
+ "id": 66,
667
+ "paths": [
668
+ "M109.909 1024v-512h-109.909v-176.469h109.739v-105.984c0.171-144.213 62.123-229.547 238.251-229.547h146.603v176.469h-91.648c-68.267 0-73.216 24.747-73.216 70.656v88.235h166.059l-19.627 176.64h-146.603v512h-219.648z"
669
+ ],
670
+ "attrs": [],
671
+ "isMulticolor": false,
672
+ "width": 495,
673
+ "grid": 0,
674
+ "tags": [
675
+ "facebook"
676
+ ],
677
+ "colorPermutations": {}
678
+ },
679
+ {
680
+ "id": 51,
681
+ "paths": [
682
+ "M1310.792 121.135c-14.89 10.709-81.418 32.19-151.988 40.433 39.699-16.967 91.224-72.488 115.047-140.977-5.215 8.61-82.434 44.54-166.562 61.314-53.177-49.795-122.171-81.005-198.455-81.005-0.51 0-1.019 0.001-1.529 0.004-1.417-0.031-3.181-0.048-4.948-0.048-143.894 0-260.897 115.137-263.907 258.31-0.005 0.394-0.005 0.528-0.005 0.663 0 20.801 2.555 41.005 7.367 60.315-213.432-6.91-416.518-110.697-554.535-271.859-23.725 35.825-37.265 80.55-37.265 128.437 0 0.162 0 0.324 0 0.486 0.318 89.914 47.503 169.25 118.519 214.509-40.056 0.282-83.88-11.67-122.242-32.426s1.463 2.758 1.463 3.888c1.807 126.237 93.452 231.003 213.999 253.1-19.642 6.049-44.035 9.384-69.208 9.384-17.872 0-35.351-1.681-52.289-4.894 39.032 104.987 137.304 178.977 252.959 179.717-91.27 69.137-206.805 110.743-332.057 110.743-0.661 0-1.321-0.001-1.981-0.003-21.669-0.002-43.945-1.315-65.843-3.869 119.49 73.177 261.363 116.418 413.335 116.418 0.546 0 1.091-0.001 1.636-0.002 494.626 0 765.147-393.916 765.147-735.4q0-16.724 0-33.448c-10.131 19.157 72.941-47.501 132.196-132.070z"
683
+ ],
684
+ "attrs": [],
685
+ "isMulticolor": false,
686
+ "width": 1311,
687
+ "grid": 0,
688
+ "tags": [
689
+ "twitter"
690
+ ],
691
+ "colorPermutations": {}
692
+ },
693
+ {
694
+ "id": 64,
695
+ "paths": [
696
+ "M692.495 744.47c63.126-15.876 116.235-46.872 145.341-107.73 18.195-36.716 28.841-79.951 28.841-125.673 0-26.693-3.629-52.539-10.419-77.070 1.36-8.143-14.763-42.914-38.675-70.812-2.053-2.82-3.417-6.692-3.417-10.883 0-1.408 0.154-2.78 0.446-4.1 4.58-15.767 7.227-34.023 7.227-52.897 0-24.881-4.601-48.687-12.998-70.614-0.751-4.264-5.676-8.414-11.569-8.414-0.625 0-1.24 0.047-1.84 0.137-22.795 0.222-48.918 7.221-71.926 19.338-17.97 8.815-36.87 20.344-55.77 30.361-3.497 1.961-7.675 3.117-12.123 3.117-1.324 0-2.625-0.102-3.894-0.3-37.228-9.592-80.127-15.108-124.315-15.108s-87.087 5.516-128.047 15.898c2.499-0.603 1.24-0.507-0.042-0.507-4.959 0-9.583-1.436-13.479-3.916-6.299-9.525-54.471-35.184-107.814-47.174l-8.319-1.338c-18.9-2.079-20.412-1.701-26.46 17.577-6.368 18.236-10.046 39.259-10.046 61.14 0 19.234 2.842 37.804 8.129 55.314-0.014-0.17 0.18 1.189 0.18 2.593 0 3.031-0.903 5.852-2.455 8.206-47.593 55.132-56.665 119.959-46.081 188.944-2.207 0.821 5.952 38.105 19.692 72.558 26.046 66.924 81.045 103.59 150.408 121.545 21.357 5.481 43.281 8.883 66.339 13.608-12.638 11.215-26.514 36.191-31.088 64.29-1.070 3.438-4.041 6.294-7.755 7.504-56.791 21.761-111.412 12.122-145.999-45.145-10.683-23.925-37.497-46.215-69.98-53.542-4.020-0.649-7.843-0.943-11.734-0.943-5.736 0-11.323 0.639-16.694 1.849-7.811 1.416-9.134 7.842-3.842 14.079-2.725-1.877 4.644 6.466 13.756 12.335 19.054 7.885 45.767 36.705 59.057 72.092 17.056 43.824 58.023 73.933 106.097 74.521 4.852 0.123 10.481 0.193 16.125 0.193 20.964 0 41.704-0.962 62.177-2.844-2.629 32.514-2.629 66.534-2.629 100.365 0 17.199-18.9 25.137-39.123 18.9 7.828 9.482-65.118-19.649-127.215-63.198-158.175-112.005-238.689-266.229-230.562-461.276 11.099-242.804 190.67-443.514 425.429-487.122 34.55-7.142 70.546-10.946 107.43-10.946 289.868 0 524.852 234.984 524.852 524.852 0 229.409-147.183 424.441-352.272 495.818-29.388 9.621-44.886-1.152-44.886-27.99q0-65.961 0-132.3c0.271-3.25 0.426-7.035 0.426-10.856 0-35.003-12.981-66.973-34.392-91.36 23.382-4.379 44.928-7.781 65.907-13.073z"
697
+ ],
698
+ "attrs": [],
699
+ "isMulticolor": false,
700
+ "width": 1058,
701
+ "grid": 0,
702
+ "tags": [
703
+ "github"
704
+ ],
705
+ "colorPermutations": {}
706
+ },
707
+ {
708
+ "id": 54,
709
+ "paths": [
710
+ "M750.421 379.904l-232.448-328.704 69.973-51.2c6.315 7.68 12.629 14.336 17.067 21.675 64.171 95.573 127.488 191.488 192.341 286.379 12.288 17.92 14.165 29.696-6.315 41.643 76.886-48.048 12.89-14.204-41.447 30.876zM734.72 397.824l-52.736 59.221-304.299-277.163 60.075-64.171zM270.677 345.088l34.133-63.317c9.899-17.067 21.333-6.656 31.403-0.853q140.459 80.555 280.576 161.621c59.051 34.133 59.904 41.813 11.776 97.792zM620.203 570.197c-2.56 10.581-3.072 13.312-3.925 16.213-17.067 60.587-5.461 54.784-64.683 38.059-106.667-30.208-213.333-61.269-320.341-90.112-25.088-6.827-29.525-17.067-20.992-40.448 25.429-70.656 11.947-59.221 74.923-39.765 103.253 31.744 205.995 65.365 308.736 99.157-5.62-4.303 11.983 4.578 26.432 17.021zM595.285 691.712c-1.877 49.323-2.731 51.2-48.469 46.421-117.077-11.264-233.984-23.381-351.061-34.133-21.333-2.048-27.136-9.899-23.211-31.915 10.923-63.659 9.728-62.635 75.264-53.589q158.891 22.016 318.293 40.277c25.259 2.56 35.328 11.435 29.355 32.939zM378.027 765.781c59.904 0 119.467 0 179.712 0 22.869 0 33.109 5.291 32.256 30.549-2.389 72.704 9.899 63.317-62.805 63.659-108.203 0-216.405 0-324.267 0-27.136 0.512-38.229-6.656-38.229-35.157 1.877-70.827-2.731-58.027 59.221-58.88 51.712-0.683 102.912-0.171 154.112-0.171zM91.136 930.475h576.512v-38.741c0-87.040 0-173.909 0-260.949 0-23.040 6.997-30.208 29.696-29.525 73.387 2.219 60.587-8.875 61.099 61.44 0 110.080 0 220.331 0 330.411 0 24.576-8.021 30.891-31.573 30.72q-347.819-1.024-695.808 0c-24.064 0-31.403-7.168-31.232-31.232 1.024-119.467 1.195-238.933 0-359.424 0-26.283 8.533-32.597 33.28-32.256 57.856 1.195 57.856 0 57.856 59.051v270.507z"
711
+ ],
712
+ "attrs": [],
713
+ "isMulticolor": false,
714
+ "width": 807,
715
+ "grid": 0,
716
+ "tags": [
717
+ "stackoverflow"
718
+ ],
719
+ "colorPermutations": {}
720
+ },
721
+ {
722
+ "id": 61,
723
+ "paths": [
724
+ "M378.839 1024h234.818v-380.6c-0.115-2.18-0.181-4.732-0.181-7.299 0-17.148 2.933-33.61 8.325-48.913 18.477-47.756 64.975-81.744 119.411-81.744 0.217 0 0.434 0.001 0.65 0.002 85.088-0 118.941 62.422 118.941 154.001v364.554h235.013v-391.363c0-209.379-115.843-306.633-270.431-306.633-3.397-0.176-7.375-0.276-11.377-0.276-85.454 0-160.246 45.646-201.324 113.886l0.974 1.058v-97.841h-234.818c3.131 63.596 0 681.166 0 681.166zM131.302 263.387c1.841 0.096 3.997 0.15 6.166 0.15 70.031 0 126.801-56.771 126.801-126.801 0-1.773-0.036-3.538-0.108-5.293-1.362-74.499-50.869-131.442-131.294-131.442-1.841-0.096-3.997-0.15-6.166-0.15-70.031 0-126.801 56.771-126.801 126.801 0 1.773 0.036 3.538 0.108 5.293-0.091 1.46-0.139 3.466-0.139 5.482 0 69.598 56.421 126.019 126.019 126.019 1.353 0 2.702-0.021 4.045-0.064l1.369 0.005zM248.711 1024v-681.166h-234.818v681.166h234.818z"
725
+ ],
726
+ "attrs": [],
727
+ "isMulticolor": false,
728
+ "width": 1096,
729
+ "grid": 0,
730
+ "tags": [
731
+ "linkedin"
732
+ ],
733
+ "colorPermutations": {}
734
+ },
735
+ {
736
+ "id": 60,
737
+ "paths": [
738
+ "M0 150.68v-151.349h484.806v1.783l17.832 65.087 109.667 407.906q15.603 58.177 31.206 116.354c0 2.452 2.006 3.566 4.235 2.675 0.899-0.591 1.747-1.849 2.001-3.312l111.454-414.179 48.146-176.313h483.469v151.572h-4.235c-14.934 0-29.646 0-44.58 0-4.902 0.022-10.177 1.17-14.975 3.221-4.709 0.532-16.911 9.762-25.001 21.956-5.298 7.041-8.399 15.65-8.399 24.983 0 0.233 0.002 0.465 0.006 0.697q-0 313.139-0 626.535c-0.011 0.319-0.017 0.695-0.017 1.071 0 8.082 2.868 15.495 7.641 21.275-7.498-8.847 0.66 2.521 10.991 11.442 8.277 7.432 19.135 11.92 31.042 11.92 0.409 0 0.817-0.005 1.224-0.016 13.983 0.001 28.025 0.001 41.845 0.001h4.458v3.566q0 73.111 0 146.445h-462.739c-0.034-0.533-0.053-1.156-0.053-1.783s0.019-1.25 0.057-1.868q-0.004-71.912-0.004-143.685c0-1.114 0-2.229 0-3.789h96.515v-668.698c-3.566-1.337-4.904 0-5.795 3.343q-29.2 103.871-57.285 207.296l-161.379 583.997c-2.229 8.47-4.458 16.717-6.687 25.188h-175.199s0-2.229-1.114-3.343l-60.852-222.899-160.488-588.677c-1.337-4.904-1.337-4.904-6.687-4.012v668.698h96.738v4.458q0 73.111 0 146.445h-387.845v-152.017h49.707c0.97 0.123 2.093 0.193 3.232 0.193s2.262-0.070 3.364-0.206c11.449-1.849 25.89-12 34.716-26.038 3.75-4.782 6.060-10.819 6.165-17.391q0-316.541 0-633.281c-0.021-3.62-0.924-7.669-2.528-11.342 0.243-2.833-7.367-14.032-17.619-21.991-8.527-7.722-19.721-12.387-32.005-12.387-0.551 0-1.099 0.009-1.645 0.028-14.409-0.002-28.675-0.002-43.163-0.002z"
739
+ ],
740
+ "attrs": [],
741
+ "isMulticolor": false,
742
+ "width": 1293,
743
+ "grid": 0,
744
+ "tags": [
745
+ "medium"
746
+ ],
747
+ "colorPermutations": {}
748
+ },
749
+ {
750
+ "id": 57,
751
+ "paths": [
752
+ "M695.79 853.981c3.596 15.101 23.817 39.586 50.242 54.246-40.601-22.728 2.827 5.557 50.912 24.625 9.205 2.488 13.998 8.286 13.998 15.204 0 0.382-0.015 0.761-0.043 1.136 0.003 17.605 0.003 35.261 0.003 52.916 0.257 1.013 0.404 2.177 0.404 3.375 0 7.898-6.403 14.301-14.301 14.301-0.266 0-0.531-0.007-0.794-0.022-59.108 9.182-115.605 5.828-166.805-29.129-7.085 0.7-40.335-30.641-61.431-69.534-3.148-6.217-8.387-9.67-14.433-9.67-1.336 0-2.632 0.169-3.869 0.486 2.529 0.954-45.655 7.205-94.816 9.766-3.969 0.12-5.873 0.132-7.78 0.132-94.629 0-182.061-30.815-252.809-82.957-85.845-51.128-164.078-162.048-186.131-292.088-5.712-28.702-8.77-58.662-8.77-89.337 0-116.169 43.862-222.094 115.928-302.117 45.578-64.244 143.675-127.546 256.753-147.171 27.893-5.565 56.97-8.538 86.741-8.538 104.131 0 199.769 36.366 274.906 97.090 75.283 48.643 146.935 154.036 168.449 276.688 5.832 29.094 8.949 59.458 8.949 90.549 0 103.708-34.672 199.318-93.057 275.871 16.652-8.453-41.705 60.467-114.896 108.714l-7.526 5.466zM629.407 714.505c1.236-1.766 4.237-5.473 7.062-9.534 33.173-48.522 52.973-108.474 52.973-173.049 0-0.735-0.003-1.469-0.008-2.203 0.319-11.927 0.501-26.1 0.501-40.317 0-51.28-2.361-102.009-6.982-152.083-3.832-61.431-43.719-131.186-103.212-176.534-33.71-26.441-75.921-42.117-121.793-42.117-51.63 0-98.622 19.858-133.754 52.353-59.034 54.74-96.017 132.976-96.090 219.851-1.412 44.858-0 89.878-0 134.722-0.011 0.992-0.017 2.164-0.017 3.337 0 42.177 8.042 82.475 22.677 119.446 31.895 82.723 109.754 169.41 226.985 158.817 10.417-0.883 20.657-3.708 33.368-6.003-26.659-40.96-57.732-69.385-103.283-79.095-4.557-1.173-8.784-5.253-10.387-10.481-0.912-24.477-0.030-49.017-0.030-73.382-0.027-0.266-0.043-0.574-0.043-0.886 0-5.070 4.11-9.181 9.181-9.181 0.64 0 1.265 0.065 1.868 0.19 4.087-0.251 8.936-0.389 13.818-0.389 42.722 0 82.986 10.523 118.342 29.118 29.503 15.928 57.751 37.291 89.001 57.771z"
753
+ ],
754
+ "attrs": [],
755
+ "isMulticolor": false,
756
+ "width": 911,
757
+ "grid": 0,
758
+ "tags": [
759
+ "quora"
760
+ ],
761
+ "colorPermutations": {}
762
+ },
763
+ {
764
+ "id": 73,
765
+ "paths": [
766
+ "M640 635.68h-151.52v-87.84h126.24c8.837 0 16-7.163 16-16v-66.080c0-8.837-7.163-16-16-16h-126.24v-73.6h150.72c8.837 0 16-7.163 16-16v-66.080c0-8.837-7.163-16-16-16h-249.6c-8.837 0-16 7.163-16 16v423.68c0 8.837 7.163 16 16 16h250.4c8.837 0 16-7.163 16-16v-66.080c0-8.837-7.163-16-16-16v0z",
767
+ "M295.040 510.88c-27.243-25.69-60.119-44.648-96-55.36-12.16-5.28-22.24-10.24-30.56-14.88-6.525-3.489-12.689-7.616-18.4-12.32-3.204-2.715-5.771-6.102-7.52-9.92-1.675-3.943-2.493-8.197-2.4-12.48-0.196-5.436 0.618-10.861 2.4-16 1.559-4.269 3.952-8.185 7.040-11.52 2.931-2.939 6.485-5.181 10.4-6.56 5.121-1.88 10.545-2.802 16-2.72 5.868-0.144 11.7 0.947 17.12 3.2 4.517 1.996 8.474 5.073 11.52 8.96 3.693 4.755 6.412 10.192 8 16 2.034 7.016 3.004 14.297 2.88 21.6 0 8.837 7.163 16 16 16h80c6.879 0.018 12.999-4.363 15.2-10.88v-1.76c0.51-1.55 0.78-3.169 0.8-4.8v-4c0.199-18.749-3.337-37.351-10.4-54.72-6.484-17.080-16.394-32.653-29.12-45.76-14.215-13.736-31.172-24.314-49.76-31.040-19.396-6.945-39.88-10.359-60.48-10.080-20.14-0.235-40.186 2.791-59.36 8.96-17.943 5.928-34.569 15.273-48.96 27.52-14.061 11.771-25.321 26.529-32.96 43.2-7.485 16.923-11.25 35.256-11.040 53.76-0.308 17.979 2.842 35.85 9.28 52.64 6.347 15.934 16.381 30.136 29.28 41.44 30.757 24.553 65.881 43.065 103.52 54.56 14.493 5.372 27.766 13.586 39.040 24.16 2.89 3.307 5.069 7.174 6.4 11.36 1.694 5.545 2.504 11.323 2.4 17.12 0.050 5.427-0.76 10.827-2.4 16-1.304 3.972-3.43 7.625-6.24 10.72l11.84 10.72-11.68-10.080c-2.624 2.855-5.926 5.001-9.6 6.24-5.624 1.846-11.523 2.712-17.44 2.56-8.13 0.199-16.237-0.936-24-3.36-5.492-1.716-10.487-4.736-14.56-8.8-4.135-4.554-7.1-10.045-8.64-16-2.43-9.347-3.561-18.984-3.36-28.64 0-8.837-7.163-16-16-16h-81.28c-6.879-0.018-12.999 4.363-15.2 10.88v1.76c-0.494 1.499-0.764 3.062-0.8 4.64v4.48c-0.349 21.369 3.794 42.573 12.16 62.24 8.179 18.8 20.875 35.288 36.96 48 32.617 25.906 73.234 39.653 114.88 38.88 20.378-0.054 40.622-3.293 60-9.6 17.592-5.53 33.909-14.504 48-26.4 13.909-11.625 24.873-26.373 32-43.040 7.182-17.558 10.72-36.393 10.4-55.36 0.036-17.877-2.994-35.628-8.96-52.48-5.571-16.093-14.579-30.78-26.4-43.040v0z",
768
+ "M996.96 375.36c-7.145-20.974-18.775-40.138-34.080-56.16-14.863-15.548-32.935-27.669-52.96-35.52-42.728-15.595-89.592-15.595-132.32 0-19.961 7.869-37.937 20.053-52.64 35.68-15.124 16.074-26.587 35.233-33.6 56.16-7.557 23.019-11.234 47.135-10.88 71.36v118.72c-0.368 24.279 3.309 48.449 10.88 71.52 7.046 20.853 18.568 39.912 33.76 55.84 14.748 15.457 32.721 27.475 52.64 35.2 42.865 15.442 89.775 15.442 132.64 0 19.957-7.741 37.978-19.756 52.8-35.2 15.254-15.909 26.832-34.97 33.92-55.84 7.595-23.065 11.272-47.24 10.88-71.52v-118.72c0.371-24.291-3.361-48.471-11.040-71.52v0zM794.4 445.92c-0.139-12.101 1.096-24.178 3.68-36 1.741-8.286 5.054-16.162 9.76-23.2 3.551-5.173 8.409-9.314 14.080-12 13.895-5.682 29.465-5.682 43.36 0 5.828 2.793 10.841 7.035 14.56 12.32 4.796 6.91 8.218 14.678 10.080 22.88 2.661 11.864 3.896 24.003 3.68 36.16v119.68c0.189 12.156-1.046 24.292-3.68 36.16-1.735 8.364-5.106 16.303-9.92 23.36-3.719 5.285-8.732 9.527-14.56 12.32-13.738 5.637-29.142 5.637-42.88 0-5.778-2.728-10.742-6.92-14.4-12.16-4.815-7.115-8.185-15.106-9.92-23.52-2.646-12.029-3.881-24.325-3.68-36.64v-119.36h-0.16z"
769
+ ],
770
+ "attrs": [],
771
+ "isMulticolor": false,
772
+ "grid": 0,
773
+ "tags": [
774
+ "seo"
775
+ ]
776
+ },
777
+ {
778
+ "id": 59,
779
+ "paths": [
780
+ "M244.524 887.172c3.553-5.798-0.865 3.084-6.972 10.526-35.223 35.201-68.945 69.452-103.726 103.703-14.1 13.997-33.525 22.647-54.969 22.647-11.348 0-22.131-2.422-31.859-6.778-27.618-12.237-46.878-39.882-46.878-72.026 0-22.325 9.291-42.48 24.217-56.81l101.544-101.366c-16.571 15.614-4.263 2.16 10.381-8.213-4.202-5.204-7.027-8.559-10.205-11.56l-89.335-89.512c-0.261 0.319-3.339-2.282-5.427-5.573-2.997-5.565-4.731-12.087-4.731-19.013 0-0.978 0.035-1.948 0.103-2.909 4.057-4.921 10.436-8.32 17.615-8.521 43.288-0.001 86.543-0.001 129.798-0.001h179.023c1.53-0.095 3.319-0.149 5.12-0.149s3.59 0.054 5.364 0.16c-0.168-0.013-0.077-0.014 0.013-0.014 9.751 0 17.655 7.904 17.655 17.655 0 1.061-0.094 2.1-0.273 3.11 0.016 29.907 0.016 59.921 0.016 89.758q0 112.11 0 224.221c0.66 1.778 1.041 3.831 1.041 5.974 0 7.121-4.216 13.258-10.289 16.050-2.023 0.657-4.224 1.009-6.508 1.009-7.33 0-13.812-3.632-17.744-9.194q-45.949-45.971-91.499-92.051c3.89 5.539-2.709-2.264-7.247-11.283z",
781
+ "M886.113 774.003c5.826 6.179 8.121 9.004 10.77 11.652 35.31 35.31 69.385 69.032 103.636 104.166 14.141 14.205 22.884 33.795 22.884 55.426 0 36.978-25.546 67.989-59.952 76.347-6.248 1.654-12.806 2.541-19.57 2.541-21.704 0-41.275-9.129-55.085-23.756l-104.023-103.849-7.945-7.768-9.357 8.828-89.159 89.335c0.312 0.541-3.553 4.67-8.341 7.347-4.333 2.131-9.274 3.337-14.497 3.337-1.911 0-3.784-0.161-5.606-0.471-4.663-3.855-7.749-9.78-7.749-16.426 0-0.050 0-0.1 0.001-0.15-0-73.261-0-146.53-0-219.799 0-32.662 0-65.324 0-97.986-0.459-1.497-0.723-3.218-0.723-5.001 0-9.751 7.904-17.655 17.655-17.655 1.833 0 3.6 0.279 5.262 0.797l317.668-0.034c0.522-0.060 1.127-0.093 1.74-0.093 8.971 0 16.243 7.272 16.243 16.243 0 4.019-1.46 7.697-3.878 10.533 4.384-5.383-1.42 3.319-8.937 10.174q-44.716 44.711-89.56 89.202c3.812-2.402-3.136 3.205-11.14 6.922z",
782
+ "M245.76 136.828l89.688-90.041c-6.447 6.153 4.178-6.713 17.378-16.229 5.098-3.007 10.891-4.67 17.072-4.67 1.423 0 2.826 0.088 4.203 0.259 8.486 1.396 8.31 10.4 8.31 17.638q0 157.837 0 315.498c0 18.538-4.943 23.128-24.011 23.128-104.342 0-208.861 0-313.203 0-6.749-0.104-13.125-3.133-17.643-7.932-1.432-2.499-2.269-5.477-2.269-8.651 0-5.661 2.665-10.7 6.808-13.931 15.399-15.743 31.112-31.279 46.649-46.816l57.026-57.909-9.181-9.71c-35.31-35.31-69.385-69.032-103.636-104.166-14.223-13.509-23.071-32.559-23.071-53.676 0-8.596 1.466-16.85 4.162-24.525 6.485-26.059 29.621-47.893 58.533-53.086 5.633-1.325 11.579-2.046 17.693-2.046 21.959 0 41.746 9.302 55.635 24.18l102.264 102.444c-11.027-12.493-0.547-2.233 7.359 9.861z",
783
+ "M775.062 137.534c39.901-40.077 76.623-77.33 114.052-114.052 14.357-14.968 34.522-24.269 56.859-24.269 43.488 0 78.742 35.254 78.742 78.742 0 22.645-9.559 43.057-24.861 57.421-33.94 34.29-68.191 68.188-102.266 102.263-2.825 2.825-5.65 6.003-9.534 10.24l62.323 61.263c13.418 13.418 27.189 26.483 40.077 40.43 3.281 2.891 7.111 9.74 8.444 17.445 1.443 10.097-5.443 15.394-17.625 15.57h-312.32c-23.658 0-27.719-4.061-27.719-27.895q0-154.306 0-308.789c-0.413-1.424-0.651-3.059-0.651-4.749 0-6.691 3.722-12.513 9.21-15.508 2.175-0.813 4.58-1.256 7.088-1.256 6.687 0 12.638 3.151 16.45 8.049q45.938 45.421 91.312 91.147c-15.147-17.038-0.765-3.060 10.102 13.439z"
784
+ ],
785
+ "attrs": [],
786
+ "isMulticolor": false,
787
+ "grid": 0,
788
+ "tags": [
789
+ "minify"
790
+ ],
791
+ "colorPermutations": {}
792
+ },
793
+ {
794
+ "id": 49,
795
+ "paths": [
796
+ "M57.234 569.417h217.051l164.571 418.011c8.581 21.457 29.195 36.339 53.284 36.339 28.233 0 51.692-20.443 56.381-47.334l119.455-695.199 89.966 250.149c8.129 22.356 29.192 38.034 53.918 38.034 0.009 0 0.018-0 0.026-0l264.593 0c31.711-0 57.417-25.707 57.417-57.417s-25.707-57.417-57.417-57.417h-223.817l-150.126-416.549c-8.447-21.735-29.2-36.861-53.486-36.861-27.832 0-51.024 19.866-56.17 46.191l-122.207 707.105-103.314-263.497c-8.551-21.544-29.217-36.526-53.389-36.571l-256.006-0c-31.711 0-57.417 25.707-57.417 57.417s25.707 57.417 57.417 57.417h0z"
797
+ ],
798
+ "attrs": [],
799
+ "isMulticolor": false,
800
+ "width": 1134,
801
+ "grid": 0,
802
+ "tags": [
803
+ "uptime"
804
+ ],
805
+ "colorPermutations": {}
806
+ },
807
+ {
808
+ "id": 47,
809
+ "paths": [
810
+ "M365.714 941.897c5.976 10.646 28.073 27.415 54.041 35.262 31.188 10.424 66.163 16.318 102.515 16.318 38.771 0 75.977-6.704 110.52-19.015-13.109 5.71 1.945 0.090 15.19-8.16-33.216-43.97-73.627-69.57-128.484-67.193s-103.131 25.783-153.783 42.789zM125.074 740.754c-3.508-4.984-5.606-11.179-5.606-17.865 0-9.726 4.44-18.414 11.404-24.149 7.002-8.637 15.414-15.952 21.631-24.912-4.73 9.278 15.3-15.941 28.060-45.071 11.803-37.763 8.328-48.369-17.82-67.203-1.097 0-2.011-1.829-3.109-2.56-14.538-5.499-40.503-33.064-54.492-66.844-3.657-7.945-7.497-14.527-10.423-21.659-15.909-34.194-29.989-68.206-21.577-108.434 8.298-9.68-1.302-0.041-8.378 11.33 20.448-38.773-2.988-0.547-18.783 41.421-10.326 34.045-15.799 70.328-15.799 107.889s5.474 73.844 15.667 108.095c-0.221 16.144 12.884 49.446 33.481 76.783 3.135 7.668 21.778 23.63 44.121 32.032zM454.217 98.743l1.28 2.194c8.042-10.711 0.704 0.748-8.764 10.044-18.299 15.19-36.584 30.184-54.87 45.361 59.907-40.798 9.274-11.484-33.074 26.82-1.783 2.523-3.062 6.094-3.062 9.964 0 1.683 0.242 3.309 0.693 4.846 2.261 3.854 6.823 6.973 12.148 7.552 0.898 0.057 1.861 0.085 2.832 0.085 6.38 0 12.471-1.238 18.045-3.486q91.104-35.176 180.521-71.382c2.854-1.477 5.345-4.779 6.024-8.702 0.122-0.926 0.186-1.91 0.186-2.909 0-12.725-10.315-23.040-23.040-23.040-1.615 0-3.192 0.166-4.713 0.482-0.754 0.189-1.792 0.313-2.859 0.313-6.948 0-12.673-5.237-13.443-11.979-2.099-5.094-3.315-10.939-3.315-17.068 0-0.45 0.007-0.898 0.020-1.345 0.23-0.933 0.363-2.080 0.363-3.259 0-7.25-5.023-13.327-11.779-14.94 8.614 5.016-0.37-1.021-10.353-5.127-9.261-4.806-26.68-9.694-45.095-10.962-78.148 2.53-171.621 39.469-246.413 98.904 37.597-34.161-25.949 13.059-74.639 72.857l13.606 28.078c4.925 1.539 10.588 2.426 16.458 2.426 9.768 0 18.962-2.455 27-6.781 6.459-3.32 14.452-5.354 22.919-5.354s16.46 2.034 23.515 5.639c-4.164-1.729 1.135 0.895 6.854 2.522 4.053 1.832 8.393 2.851 12.97 2.851 16.663 0 30.171-13.508 30.171-30.171 0-0.137-0.001-0.273-0.003-0.409 0.016 0.566 0.75-3.026 1.083-6.734 0.525-10.233 6.505-19.572 15.231-24.801-11.879 9.884-0.573-0.973 12.66-8.961q56.969-30.067 113.837-59.141c-6.309 2.273 3.829-2.272 14.694-4.98zM503.223 341.211c13.531-6.4 26.514-12.069 39.314-18.286 5.65-2.873 12.322-4.556 19.386-4.556 4.433 0 8.71 0.663 12.74 1.894-1.772-5.663 56.736 14.645 107.651 46.072-11.303-9.775 12.401 6.356 30.666 27.346 12.963 14.089 23.386 30.18 35.272 44.992-6.989-3.404 18.165 26.478 49.745 47.457 10.514 6.811 22.49 10.592 35.348 10.592 3.984 0 7.883-0.363 11.666-1.058 11.396-0.105 20.89-9.701 20.89-21.515 0-4.048-1.114-7.835-3.053-11.072-0.976-1.882-1.581-4.226-1.581-6.711 0-1.416 0.196-2.787 0.563-4.086 2.929-2.032 6.625-3.313 10.621-3.313 0.759 0 1.507 0.046 2.242 0.136 2.334 0.111 7.185 2.578 10.887 6.212 25.231 20.659 50.099 41.688 75.699 61.985 12.069 9.509 21.211 6.949 25.783-7.863 3.369-9.396 5.316-20.237 5.316-31.532 0-0.55-0.005-1.099-0.014-1.647-0.263-42.389-13.256-99.616-36.027-151.584 7.501 12.427-6.079-20.844-26.073-49.278 118.608 161.488 35.527 28.798-71.081-80.907 50.945 50.529 7.397 0.455-45.169-38.030-7.394-5.781-15.317-8.763-23.936-8.763-5.84 0-11.361 1.369-16.258 3.804-12.222 5.39-24.473 11.424-36.359 18.19-16.64 8.046-18.286 7.314-25.234-9.326-1.026-10.748-10.008-19.088-20.939-19.088-5.21 0-9.977 1.894-13.65 5.032-22.28 13.69-43.857 28.867-65.434 43.679-4.895 3.332-8.068 8.878-8.068 15.165 0 2.441 0.478 4.771 1.347 6.9q2.882 8.289 5.259 17.066c1.995 2.751 3.191 6.194 3.191 9.917 0 8.97-6.946 16.319-15.752 16.96-21.084 8.049-42.661 15.546-63.141 24.689 2.909-3.329-14.693 6.197-28.765 19.435-6.227 5.566-10.163 13.695-10.163 22.744 0 6.523 2.045 12.568 5.529 17.53zM593.554 397.166c-20.993-12.338-46.239-19.625-73.188-19.625-1.463 0-2.921 0.021-4.373 0.064-65.067 5.298-106.027 42.966-133.821 97.824-3.271 5.69-5.2 12.511-5.2 19.782 0 12.99 6.157 24.542 15.711 31.897-8.384-4.063 15.818 14.994 43.748 27.058-34.324-12.321 16.004 9.664 69.761 22.946 21.284 3.464 36.121 17.656 39.951 35.897-2.367-6.813 0.391 0.114 2.137 7.433 6.143 39.307 12.36 78.073 18.395 116.838-2.344-10.411 2.408 32.601 10.992 74.213 6.928 25.261 26.676 31.295 52.459 13.924-12.475 9.056 4.526-1.252 18.3-14.826-29.756 26.513 2.517 1.845 27.796-28.806 26.681-35.728 52.647-71.202 77.332-107.408 1.65-7.609 18.879-26.348 40.565-37.757 21.975-7.156 37.189-26.885 37.189-50.166 0-0.718-0.014-1.433-0.043-2.144-0.063-0.2-0.1-0.548-0.1-0.904s0.038-0.703 0.109-1.038c0.586-1.261 0.931-2.772 0.931-4.365 0-4.378-2.608-8.147-6.355-9.838 36.045 26.123 5.795 0.803-28.714-17.572-17.225-5.638-35.937-23.326-45.206-45.89 10.205 22.437 0.183-4.434-14.439-28.168 14.264 22.666 0.548-3.173-17.978-24.763-1.787-2.226-6.771-5.211-12.43-6.305-19.907-4.414-40.204-7.34-59.587-12.643 26.012 9.617-12.883-1.666-48.169-19.14-4.050-0.727-8.367-6.070-8.367-12.422 0-1.803 0.348-3.525 0.981-5.102zM539.977 1024h-55.954c2.685 0.476-3.199-1.009-9.304-1.788-65.31-1.008-144.474-24.437-212.994-64.186-120.342-57.945-225.505-193.667-253.256-355.816-4.080-22.553-5.909-42.484-8.469-62.233v-55.954c-0.579 3.095 0.961-2.979 1.785-9.279 1.727-81.753 33.964-174.177 87.408-250.693 62.601-105.24 193.094-195.584 345.686-217.516 18.059-2.695 33.601-4.341 49.144-6.17h55.954c-2.808-0.507 3.133 0.994 9.296 1.787 44.675 0.295 103.039 13.054 156.284 35.552 169.597 73.29 274.922 202.57 310.579 387.438 3.84 19.749 5.303 40.046 7.863 60.16v54.857c0.445-2.562-1.023 3.265-1.789 9.311-0.264 42.76-13.201 101.078-35.915 154.22-75.118 174.938-208.604 281.544-400.055 314.458-15.177 2.56-30.72 3.84-46.263 5.851z"
811
+ ],
812
+ "attrs": [],
813
+ "isMulticolor": false,
814
+ "grid": 0,
815
+ "tags": [
816
+ "world"
817
+ ],
818
+ "colorPermutations": {}
819
+ },
820
+ {
821
+ "id": 3,
822
+ "paths": [
823
+ "M0 575.81c0-35.241 28.456-63.81 64.056-63.81h895.888c35.377 0 64.056 28.994 64.056 63.81v384.38c0 35.241-28.456 63.81-64.056 63.81h-895.888c-35.377 0-64.056-28.994-64.056-63.81v-384.38zM0 288c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0 160c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0 32c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0 416c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32z"
824
+ ],
825
+ "attrs": [],
826
+ "isMulticolor": false,
827
+ "grid": 0,
828
+ "tags": [
829
+ "footer"
830
+ ],
831
+ "colorPermutations": {}
832
+ },
833
+ {
834
+ "id": 4,
835
+ "paths": [
836
+ "M0 704.19c0 35.241 28.456 63.81 64.056 63.81h895.888c35.377 0 64.056-28.994 64.056-63.81v-384.38c0-35.241-28.456-63.81-64.056-63.81h-895.888c-35.377 0-64.056 28.994-64.056 63.81v384.38zM0 160c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 864c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 992c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 32c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32z"
837
+ ],
838
+ "attrs": [],
839
+ "isMulticolor": false,
840
+ "grid": 0,
841
+ "tags": [
842
+ "middle",
843
+ "center"
844
+ ],
845
+ "colorPermutations": {}
846
+ },
847
+ {
848
+ "id": 5,
849
+ "paths": [
850
+ "M0 448.19c0 35.241 28.456 63.81 64.056 63.81h895.888c35.377 0 64.056-28.994 64.056-63.81v-384.38c0-35.241-28.456-63.81-64.056-63.81h-895.888c-35.377 0-64.056 28.994-64.056 63.81v384.38zM0 736c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 864c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 992c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 608c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32z"
851
+ ],
852
+ "attrs": [],
853
+ "isMulticolor": false,
854
+ "grid": 0,
855
+ "tags": [
856
+ "header"
857
+ ],
858
+ "colorPermutations": {}
859
+ },
860
+ {
861
+ "id": 6,
862
+ "paths": [
863
+ "M707.467 151.080c-2.704-9.436-9.638-16.489-18.143-19.762-0.335-0.134-0.671-0.263-1.011-0.385-0.338-0.116-0.678-0.224-1.020-0.328-3.334-1.063-6.841-1.586-10.376-1.438-0.732 0.032-1.507 0.048-2.322 0.048-4.964 0.008-11.389-0.645-18.57-2.063-12.594-2.459-27.479-7.227-42.21-13.683-11.060-4.833-22.069-10.603-32.15-16.917-7.561-4.732-14.603-9.77-20.762-14.877-4.621-3.827-8.744-7.693-12.233-11.443-5.247-5.621-9.006-11-11.161-15.356-1.087-2.179-1.496-4.090-1.911-5.683-0.417-1.597-0.265-2.865-0.265-3.929v-0.147c0-9.547-4.633-18.687-12.259-24.436-7.624-5.749-17.788-7.537-26.931-4.782l-474.675 143.044c-12.698 3.827-21.469 15.534-21.469 28.795v666.072c0 10.182 1.798 20.104 4.889 29.476 2.707 8.21 6.395 16.027 10.827 23.458 7.77 13.003 17.797 24.86 29.448 35.633 17.493 16.137 38.693 29.876 62.282 40.397 23.591 10.496 49.603 17.75 76.729 20.243 3.777 0.346 7.663-0.039 11.299-1.119 0.985-0.293 2.247-0.677 3.919-1.192 6.43-1.98 18.749-5.841 35.546-11.126 117.454-36.968 452.335-143.268 452.35-143.274 12.466-3.956 20.976-15.585 20.976-28.664v-653.767c0.633-4.15 0.433-8.495-0.798-12.795v0zM542.709 142.981c8.776 5.86 17.982 11.248 27.4 16.17-39.795 11.404-87.554 25.093-135.832 38.936-59.784 17.143-120.357 34.518-167.561 48.078-23.603 6.78-43.863 12.604-59.017 16.971-7.579 2.183-13.88 4.001-18.692 5.395-1.489 0.43-2.812 0.814-4.006 1.161-15.907-1.901-31.585-5.708-46.115-10.997-12.141-4.412-23.481-9.844-33.481-15.902-7.501-4.541-14.245-9.436-20.027-14.452-7.916-6.848-13.95-13.929-17.953-20.448l416.585-125.558c1.54 3.032 3.209 5.977 5.006 8.824 4.783 7.561 10.395 14.531 16.585 21.076 10.842 11.437 23.473 21.618 37.108 30.746v0zM105.647 913.493c-7.508-4.95-14.299-10.286-20.161-15.755-8.803-8.197-15.457-16.72-19.586-24.403-2.075-3.839-3.531-7.454-4.447-10.723-0.916-3.275-1.302-6.188-1.302-8.803v-568.871c14.659 10.516 31.171 19.49 48.965 26.74 14.961 6.078 30.833 10.922 47.275 14.275v610.805c-5.932-1.717-11.765-3.705-17.43-5.962-12.018-4.782-23.302-10.699-33.314-17.302v0zM256.541 919.698c-15.080 4.762-28.58 9.019-40 12.613v-609.125c15.947-4.6 40.601-11.481 69.172-19.743v267.943l83.133-83.765 55.211 27.922v-252.161c45.112-12.656 89.321-25.505 129.125-36.914 37.621-10.783 71.111-20.275 94.933-27.1v596.265c-42.103 13.361-141.164 44.792-237.658 75.363-56.069 17.762-111.271 35.236-153.917 48.702v0z"
864
+ ],
865
+ "attrs": [],
866
+ "isMulticolor": false,
867
+ "width": 727,
868
+ "grid": 0,
869
+ "tags": [
870
+ "book"
871
+ ],
872
+ "colorPermutations": {}
873
+ },
874
+ {
875
+ "id": 9,
876
+ "paths": [
877
+ "M504.231 955.882c22.087-9.699 42.18-20.276 60.268-31.085 39.815-23.797 69.925-48.698 90.442-68.056 1.536 0.142 3.092 0.214 4.664 0.214 27.658 0 50.078-22.421 50.078-50.078v-206.037c0-27.658-22.421-50.078-50.078-50.078s-50.078 22.421-50.078 50.078v200.346c-6.829 6.618-15.244 14.275-25.222 22.478-15.543 12.784-34.873 26.902-57.905 40.556-14.759 8.751-31.036 17.312-48.824 25.227-11.141-4.622-23.975-5.258-36.212-0.833-16.277 5.886-33.641 11.126-52.114 15.437-26.934 6.284-43.674 33.213-37.388 60.147 6.284 26.934 33.213 43.674 60.147 37.388 22.439-5.235 43.588-11.614 63.421-18.787 13.406-4.849 23.478-14.826 28.803-26.918zM101.589 702.427v-277.577c0.007-42.612 8.608-82.95 24.154-119.726 23.312-55.141 62.386-102.213 111.51-135.39 24.558-16.59 51.606-29.709 80.464-38.686 28.862-8.974 59.532-13.819 91.496-13.822 42.612 0.007 82.948 8.608 119.726 24.154 55.141 23.312 102.213 62.386 135.39 111.51 16.59 24.558 29.709 51.605 38.686 80.463 8.974 28.864 13.819 59.533 13.822 91.497v277.577c0 27.658 22.421 50.078 50.078 50.078s50.078-22.421 50.078-50.078v-277.577c0.007-56.165-11.411-109.929-32.066-158.743-30.991-73.243-82.631-135.406-147.685-179.366-32.532-21.979-68.44-39.405-106.787-51.33-38.341-11.929-79.124-18.344-121.243-18.342-56.165-0.007-109.929 11.411-158.743 32.066-73.243 30.991-135.406 82.629-179.366 147.685-21.977 32.532-39.405 68.44-51.33 106.787-11.929 38.34-18.344 79.124-18.342 121.243v277.577c0 27.658 22.421 50.078 50.078 50.078s50.078-22.421 50.078-50.078zM108.743 602.271v206.037c0 27.658 22.421 50.078 50.078 50.078s50.078-22.421 50.078-50.078v-206.037c0-27.658-22.421-50.078-50.078-50.078s-50.078 22.421-50.078 50.078z"
878
+ ],
879
+ "attrs": [],
880
+ "isMulticolor": false,
881
+ "width": 847,
882
+ "grid": 0,
883
+ "tags": [
884
+ "support"
885
+ ],
886
+ "colorPermutations": {}
887
+ },
888
+ {
889
+ "id": 33,
890
+ "paths": [
891
+ "M603.2 777.6c-36.8 36.8-148.8 36.8-184 0-19.2-19.2-35.2 0-35.2 19.2 0 33.6 0 78.4 0 112 0 19.2 17.6 36.8 36.8 19.2 11.2-11.2 24-24 36.8-36.8 11.2 27.2 25.6 64 36.8 92.8 9.6 24 27.2 24 36.8 0 9.6-25.6 27.2-70.4 36.8-92.8 9.6 9.6 17.6 17.6 36.8 36.8 17.6 17.6 36.8 0 36.8-19.2 0-32 0-78.4 0-112-1.6-19.2-19.2-38.4-38.4-19.2zM800 540.8c-19.2-19.2-80-60.8-80-80 0-168-51.2-307.2-144-400-52.8-52.8-76.8-51.2-128 0-92.8 92.8-144 232-144 400 0 17.6-62.4 62.4-80 80-36.8 36.8-32 76.8-32 96 0 56 25.6 140.8 32 160 11.2 36.8 60.8 35.2 80 16 36.8-36.8 83.2-83.2 96-96 56 56 168 56 224 0 12.8 12.8 59.2 59.2 96 96 19.2 19.2 70.4 20.8 80-16 4.8-19.2 32-104 32-160 0-19.2 4.8-59.2-32-96zM512 425.6c-52.8 0-96-43.2-96-96s43.2-96 96-96c51.2 0 96 44.8 96 96 0 49.6-43.2 96-96 96zM560 329.6c0 26.51-21.49 48-48 48s-48-21.49-48-48c0-26.51 21.49-48 48-48s48 21.49 48 48z"
892
+ ],
893
+ "attrs": [],
894
+ "isMulticolor": false,
895
+ "tags": [
896
+ "rocket"
897
+ ],
898
+ "defaultCode": 106,
899
+ "grid": 0,
900
+ "colorPermutations": {}
901
+ },
902
+ {
903
+ "id": 7,
904
+ "paths": [
905
+ "M797.496 32.018c0-3.36-0.111-5.277-0.139-5.804-0.472-8.415-4.721-16.135-11.581-21.023-6.86-4.916-15.552-6.443-23.662-4.138-5.388 1.416-162.048 47.823-387.305 306.712-98.062 16.358-160.549 52.878-197.291 97.062-38.908 46.657-47.712 98.701-47.656 135.36 0.028 31.021 6.026 52.044 6.526 53.794 3.166 10.942 12.719 18.857 24.050 19.912 11.359 1.083 22.217-4.916 27.383-15.080l0.361-0.667c2.138-4.138 14.136-26.078 30.549-45.879 2.138-2.611 4.499-4.943 6.776-7.415 0.417 0.305 0.639 0.833 1.083 1.139l91.314 63.931-14.775 56.682c-1.472 5.554 0.667 11.47 5.332 14.802 4.693 3.333 10.942 3.444 15.747 0.305l49.545-32.687 90.258 63.209c0.444 0.305 1.028 0.361 1.5 0.667-6.415 12.331-14.469 24.384-21.551 33.798-4.666 6.249-8.887 11.414-11.886 14.941l-3.471 3.971-0.861 0.972-0.167 0.194c-7.721 8.276-9.637 20.496-4.832 30.743 4.832 10.248 15.469 16.552 26.744 15.913 2.638-0.305 49.406-2.86 98.618-34.132 24.495-15.663 49.462-38.936 67.93-72.262 18.468-33.298 30.16-76.206 30.105-129.722 0-25.828-2.86-54.349-8.693-85.537 151.19-270.636 160.104-428.047 160.049-459.762v0zM636.142 135.69c43.796-32.521 78.455-52.489 102.617-64.625-10.664 80.372-58.487 276.579-265.998 579.486l-84.176-58.932 141.275-200.401c4.416-6.249 2.916-14.913-3.36-19.329s-14.941-2.944-19.357 3.333l-141.303 200.457-84.454-59.126c143.025-199.874 266.776-315.432 354.757-380.862v0zM189.877 501.583c4.666-19.94 13.636-41.213 30.299-61.181 18.774-22.467 48.323-44.379 94.841-60.709-20.94 26.244-42.296 54.155-64.097 84.065-15.774 3.583-29.466 11.164-41.186 19.968-7.248 5.499-13.719 11.609-19.857 17.857v0zM339.123 638.609l3.027-11.692 7.137 4.999-10.164 6.693zM590.596 577.317c-0.028 45.657-9.665 78.4-23.162 102.783-13.691 24.661-31.826 41.297-50.184 52.85 1.722-3.527 3.61-6.887 5.166-10.609 6.304-15.274 11.136-31.938 11.192-50.017 0-3.749-0.278-7.582-0.778-11.442 20.634-30.688 40.075-60.543 57.599-89.12 0.028 1.833 0.167 3.777 0.167 5.554zM213.4 843.065l63.681-90.953c8.804-12.581 5.749-29.882-6.804-38.686-12.581-8.804-29.882-5.749-38.686 6.832l-63.681 90.953c-8.804 12.581-5.749 29.882 6.832 38.686 12.553 8.804 29.882 5.749 38.658-6.832zM326.848 798.297l-127.417 181.989c-8.804 12.553-5.749 29.882 6.832 38.686 12.553 8.804 29.855 5.749 38.658-6.832l127.417-181.989c8.804-12.553 5.749-29.855-6.832-38.658-12.553-8.804-29.882-5.749-38.658 6.804zM171.104 680.406c-12.553-8.804-29.882-5.749-38.658 6.804l-127.417 181.989c-8.804 12.553-5.749 29.882 6.832 38.686 12.553 8.776 29.855 5.749 38.658-6.832l127.417-181.961c8.804-12.581 5.749-29.882-6.832-38.686zM543.218 346.394c7.609 5.304 16.302 7.859 24.911 7.859 13.691 0 27.161-6.443 35.631-18.524 13.775-19.69 9.026-46.768-10.664-60.543-7.582-5.332-16.274-7.887-24.884-7.887-13.719 0-27.189 6.471-35.659 18.552-13.719 19.662-8.998 46.768 10.664 60.543z"
906
+ ],
907
+ "attrs": [],
908
+ "isMulticolor": false,
909
+ "width": 800,
910
+ "grid": 0,
911
+ "tags": [
912
+ "rocket"
913
+ ],
914
+ "colorPermutations": {}
915
+ },
916
+ {
917
+ "id": 25,
918
+ "paths": [
919
+ "M568 848h-112l20.8-120c-28.8-12.8-48-41.6-48-75.2 0-46.4 36.8-83.2 83.2-83.2s83.2 36.8 83.2 83.2c0 33.6-19.2 62.4-48 75.2l20.8 120zM624 456h-224v-168c0-62.4 51.2-112 112-112s112 49.6 112 112v168zM736 456v-168c0-123.2-100.8-224-224-224s-224 100.8-224 224v168h-56c-30.4 0-56 25.6-56 56v392c0 30.4 25.6 56 56 56h560c30.4 0 56-25.6 56-56v-392c0-30.4-25.6-56-56-56h-56z"
920
+ ],
921
+ "attrs": [],
922
+ "isMulticolor": false,
923
+ "tags": [
924
+ "lock"
925
+ ],
926
+ "defaultCode": 97,
927
+ "grid": 0,
928
+ "colorPermutations": {}
929
+ },
930
+ {
931
+ "id": 26,
932
+ "paths": [
933
+ "M800 448h-64v-160c0-123.2-100.8-224-224-224s-224 100.8-224 224c0 0 0 40 0 48s8 16 16 16 72 0 80 0c8 0 16-8 16-16s0-48 0-48c0-62.4 51.2-112 112-112 62.4 0 112 49.6 112 112v160h-400c-30.4 0-48 17.6-48 48v408c0 30.4 25.6 56 56 56h560c30.4 0 56-25.6 56-56v-408c0-30.4-17.6-48-48-48zM547.2 728l20.8 120h-112l20.8-120c-28.8-12.8-48-41.6-48-75.2 0-46.4 36.8-83.2 83.2-83.2s83.2 36.8 83.2 83.2c0 32-19.2 60.8-48 75.2z"
934
+ ],
935
+ "attrs": [],
936
+ "isMulticolor": false,
937
+ "tags": [
938
+ "unlock"
939
+ ],
940
+ "defaultCode": 99,
941
+ "grid": 0,
942
+ "colorPermutations": {}
943
+ },
944
+ {
945
+ "id": 27,
946
+ "paths": [
947
+ "M272 224c16-16 544 512 528 528-65.6 65.6-160 112-272 112-75.2 0-164.8 0-224 0-12.8 0-24 4.8-32 12.8-20.8 17.6-38.4 38.4-59.2 57.6-35.2 33.6-86.4 33.6-120 0-35.2-33.6-35.2-84.8-1.6-121.6 17.6-19.2 38.4-36.8 56-57.6 8-9.6 12.8-22.4 12.8-35.2 0-67.2 0-139.2 0-224 0-112 48-208 112-272zM785.6 606.4c-16 16-128-96-112-112s139.2-137.6 176-174.4c33.6-33.6 144 80 112 110.4-59.2 59.2-116.8 116.8-176 176zM545.6 366.4c-16 16-128-96-112-112s139.2-137.6 176-174.4c33.6-33.6 144 80 112 110.4-59.2 59.2-116.8 116.8-176 176z"
948
+ ],
949
+ "attrs": [],
950
+ "isMulticolor": false,
951
+ "tags": [
952
+ "plugin"
953
+ ],
954
+ "defaultCode": 100,
955
+ "grid": 0,
956
+ "colorPermutations": {}
957
+ },
958
+ {
959
+ "id": 39,
960
+ "paths": [
961
+ "M779.2 667.2c-27.2 27.2-67.2 27.2-94.4 0l-172.8-172.8-172.8 172.8c-27.2 27.2-67.2 27.2-94.4 0s-27.2-67.2 0-94.4l204.8-204.8c14.4-14.4 32-32 62.4-32s49.6 17.6 62.4 32l204.8 204.8c27.2 27.2 27.2 67.2 0 94.4z"
962
+ ],
963
+ "attrs": [],
964
+ "isMulticolor": false,
965
+ "tags": [
966
+ "caret up"
967
+ ],
968
+ "defaultCode": 114,
969
+ "grid": 0,
970
+ "colorPermutations": {}
971
+ },
972
+ {
973
+ "id": 71,
974
+ "paths": [
975
+ "M451.2 779.2l204.8-204.8c14.4-14.4 32-32 32-62.4s-17.6-49.6-32-62.4l-204.8-204.8c-27.2-27.2-67.2-27.2-94.4 0s-27.2 67.2 0 94.4l172.8 172.8-172.8 172.8c-27.2 27.2-27.2 67.2 0 94.4s67.2 27.2 94.4 0z"
976
+ ],
977
+ "attrs": [],
978
+ "isMulticolor": false,
979
+ "tags": [
980
+ "caret right"
981
+ ],
982
+ "defaultCode": 101,
983
+ "grid": 0,
984
+ "colorPermutations": {}
985
+ },
986
+ {
987
+ "id": 28,
988
+ "paths": [
989
+ "M779.2 451.2l-204.8 204.8c-14.4 14.4-32 32-62.4 32s-49.6-17.6-62.4-32l-204.8-204.8c-27.2-27.2-27.2-67.2 0-94.4s67.2-27.2 94.4 0l172.8 172.8 172.8-172.8c27.2-27.2 67.2-27.2 94.4 0s27.2 67.2 0 94.4z"
990
+ ],
991
+ "attrs": [],
992
+ "isMulticolor": false,
993
+ "tags": [
994
+ "caret down"
995
+ ],
996
+ "defaultCode": 101,
997
+ "grid": 0,
998
+ "colorPermutations": {}
999
+ },
1000
+ {
1001
+ "id": 72,
1002
+ "paths": [
1003
+ "M572.8 779.2l-204.8-204.8c-14.4-14.4-32-32-32-62.4s17.6-49.6 32-62.4l204.8-204.8c27.2-27.2 67.2-27.2 94.4 0s27.2 67.2 0 94.4l-172.8 172.8 172.8 172.8c27.2 27.2 27.2 67.2 0 94.4s-67.2 27.2-94.4 0z"
1004
+ ],
1005
+ "attrs": [],
1006
+ "isMulticolor": false,
1007
+ "tags": [
1008
+ "caret left"
1009
+ ],
1010
+ "defaultCode": 101,
1011
+ "grid": 0,
1012
+ "colorPermutations": {}
1013
+ },
1014
+ {
1015
+ "id": 29,
1016
+ "paths": [
1017
+ "M848 233.6c-16-20.8-46.4-24-67.2-6.4-20.8 16-24 46.4-6.4 67.2v0c48 59.2 75.2 131.2 75.2 212.8 0 92.8-38.4 177.6-99.2 238.4s-145.6 99.2-238.4 99.2c-92.8 0-177.6-38.4-238.4-99.2s-99.2-145.6-99.2-238.4c0-80 27.2-153.6 75.2-212.8 16-20.8 12.8-49.6-6.4-67.2-20.8-16-49.6-12.8-67.2 6.4-60.8 75.2-96 169.6-96 272 0 118.4 48 227.2 126.4 305.6s185.6 126.4 305.6 126.4c118.4 0 227.2-48 305.6-126.4s126.4-187.2 126.4-307.2c0-102.4-35.2-196.8-96-270.4zM512 561.6c27.2 0 48-20.8 48-48v-384c0-27.2-20.8-48-48-48s-48 20.8-48 48v384c0 27.2 20.8 48 48 48z"
1018
+ ],
1019
+ "attrs": [],
1020
+ "isMulticolor": false,
1021
+ "tags": [
1022
+ "power"
1023
+ ],
1024
+ "defaultCode": 102,
1025
+ "grid": 0,
1026
+ "colorPermutations": {}
1027
+ },
1028
+ {
1029
+ "id": 31,
1030
+ "paths": [
1031
+ "M512 156.8c195.2 0 355.2 158.4 355.2 355.2s-160 355.2-355.2 355.2-355.2-160-355.2-355.2 160-355.2 355.2-355.2zM512 64c-248 0-448 200-448 448s200 448 448 448 448-200 448-448-200-448-448-448z"
1032
+ ],
1033
+ "attrs": [],
1034
+ "isMulticolor": false,
1035
+ "tags": [
1036
+ "radio_default"
1037
+ ],
1038
+ "defaultCode": 104,
1039
+ "grid": 0,
1040
+ "colorPermutations": {}
1041
+ },
1042
+ {
1043
+ "id": 30,
1044
+ "paths": [
1045
+ "M512 64c-248 0-448 200-448 448s200 448 448 448 448-200 448-448-200-448-448-448zM720 464l-176 176c-3.2 3.2-28.8 32-64 32s-60.8-28.8-64-32l-112-112c-16-16-16-48 0-64s48-14.4 64 1.6l112 110.4 176-176c16-16 48-16 64 0s16 48 0 64z"
1046
+ ],
1047
+ "attrs": [],
1048
+ "isMulticolor": false,
1049
+ "tags": [
1050
+ "radio_checked"
1051
+ ],
1052
+ "defaultCode": 103,
1053
+ "grid": 0,
1054
+ "colorPermutations": {}
1055
+ },
1056
+ {
1057
+ "id": 45,
1058
+ "paths": [
1059
+ "M608 512l208-208c28.8-28.8 28.8-67.2 0-96s-67.2-28.8-96 0l-208 208-208-208c-28.8-28.8-67.2-28.8-96 0s-28.8 67.2 0 96l208 208-208 208c-28.8 28.8-28.8 67.2 0 96s67.2 28.8 96 0l208-208 208 208c28.8 28.8 67.2 28.8 96 0s28.8-67.2 0-96l-208-208z"
1060
+ ],
1061
+ "attrs": [],
1062
+ "isMulticolor": false,
1063
+ "tags": [
1064
+ "cross"
1065
+ ],
1066
+ "defaultCode": 121,
1067
+ "grid": 0,
1068
+ "colorPermutations": {}
1069
+ },
1070
+ {
1071
+ "id": 46,
1072
+ "paths": [
1073
+ "M400 667.2l-256-256c-28.8-28.8-83.2-28.8-112 0s-28.8 83.2 0 112l304 304c14.4 14.4 32 32 64 32s49.6-17.6 64-32l528-528c28.8-28.8 28.8-83.2 0-112s-83.2-28.8-112 0l-480 480z"
1074
+ ],
1075
+ "attrs": [],
1076
+ "isMulticolor": false,
1077
+ "tags": [
1078
+ "tick"
1079
+ ],
1080
+ "defaultCode": 122,
1081
+ "grid": 0,
1082
+ "colorPermutations": {}
1083
+ },
1084
+ {
1085
+ "id": 34,
1086
+ "paths": [
1087
+ "M923.2 822.4l-228.8-230.4c33.6-52.8 52.8-112 52.8-179.2-1.6-184-150.4-332.8-334.4-332.8s-332.8 148.8-332.8 332.8 148.8 332.8 332.8 332.8c67.2 0 126.4-19.2 179.2-52.8l230.4 230.4c28.8 28.8 73.6 28.8 100.8 0s27.2-73.6 0-100.8zM174.4 412.8c0-131.2 105.6-238.4 238.4-238.4s238.4 105.6 238.4 238.4-107.2 236.8-238.4 236.8-238.4-105.6-238.4-236.8z"
1088
+ ],
1089
+ "attrs": [],
1090
+ "isMulticolor": false,
1091
+ "tags": [
1092
+ "search"
1093
+ ],
1094
+ "defaultCode": 107,
1095
+ "grid": 0,
1096
+ "colorPermutations": {}
1097
+ },
1098
+ {
1099
+ "id": 37,
1100
+ "paths": [
1101
+ "M512 160c195.2 0 352 156.8 352 352s-156.8 352-352 352-352-156.8-352-352 156.8-352 352-352zM512 64c-248 0-448 200-448 448s200 448 448 448 448-200 448-448-200-448-448-448zM523.2 563.2c0 11.2 6.4 19.2 6.4 30.4 0 14.4-11.2 28.8-27.2 28.8-27.2 0-41.6-41.6-41.6-64 0-92.8 121.6-102.4 121.6-174.4 0-33.6-24-62.4-76.8-62.4-36.8 0-65.6 14.4-88 36.8-6.4 4.8-12.8 8-20.8 8-16 0-30.4-14.4-30.4-32 0-6.4 1.6-14.4 6.4-19.2 32-38.4 84.8-59.2 139.2-59.2 88 0 142.4 51.2 142.4 116.8 1.6 110.4-131.2 120-131.2 190.4zM508.8 768c-24 0-44.8-20.8-44.8-46.4 0-24 19.2-46.4 44.8-46.4 24 0 44.8 22.4 44.8 46.4-1.6 25.6-22.4 46.4-44.8 46.4z"
1102
+ ],
1103
+ "attrs": [],
1104
+ "isMulticolor": false,
1105
+ "tags": [
1106
+ "info"
1107
+ ],
1108
+ "defaultCode": 112,
1109
+ "grid": 0,
1110
+ "colorPermutations": {}
1111
+ },
1112
+ {
1113
+ "id": 10,
1114
+ "paths": [
1115
+ "M798 468c18-10 32-30 32-52 0-32-26-58-58-58-34-120-62-230-62-230s-34-128-198-128c-164 0-198 128-198 128s-28 110-62 230c-32 0-58 26-58 58 0 22 14 42 32 52-32 118-62 224-62 224 0 10 22 22 56 28 10-40 22-98 36-146 22-76 58-120 120-142-36-12-54-58-62-110l124 66 78-74 14 198h-110c0 0 70 36 146 36 8-6 4-84 0-182l22 26 126-66c-8 48-26 94-64 106 64 26 104 70 122 142 10 48 26 106 36 146 34-6 56-18 56-28-4 0-34-106-66-224zM420 304l-90-74 150 16zM604 304l-62-58 150-16zM798 728c0 0-148 66-216 66-70 0-66-58-66-66h-8c-4 8 4 66-66 66-68 0-216-66-216-66l-44 182 330 114 332-114zM458 622h108v36h-108z"
1116
+ ],
1117
+ "attrs": [],
1118
+ "isMulticolor": false,
1119
+ "tags": [
1120
+ "wpmudev-devman"
1121
+ ],
1122
+ "defaultCode": 108,
1123
+ "grid": 0,
1124
+ "colorPermutations": {}
1125
+ },
1126
+ {
1127
+ "id": 16,
1128
+ "paths": [
1129
+ "M810 356l-18-234-122-82-112-12-180 166 228 24zM16 580l176 86 26-322-198 182zM1012 580l-496 244 210 104 302-148zM984 254l-192-132 42 546 178-88zM316 0l-274 254-22 272 538-498zM0 780l514 248 212-100-710-348z"
1130
+ ],
1131
+ "attrs": [],
1132
+ "isMulticolor": false,
1133
+ "tags": [
1134
+ "wpmudev-upfront"
1135
+ ],
1136
+ "defaultCode": 68,
1137
+ "grid": 0,
1138
+ "colorPermutations": {}
1139
+ },
1140
+ {
1141
+ "id": 62,
1142
+ "paths": [
1143
+ "M757.583 355.928c11.477-11.477 18.575-27.331 18.575-44.844 0-35.025-28.394-63.419-63.419-63.419-17.513 0-33.368 7.098-44.844 18.575-10.923 11.137-17.664 26.409-17.664 43.255 0 0.372 0.003 0.744 0.010 1.115-0.009 0.316-0.013 0.754-0.013 1.193 0 34.42 27.903 62.323 62.323 62.323 0.439 0 0.877-0.005 1.314-0.014-0.064 0.001-0.062 0.001-0.061 0.001 17.106 0 32.589-6.951 43.778-18.183zM623.051 400.772c-22.791-22.051-36.94-52.915-36.94-87.082 0-1.103 0.015-2.202 0.044-3.297-0.060-1.246-0.092-2.898-0.092-4.558 0-69.717 56.517-126.234 126.234-126.234s126.234 56.517 126.234 126.234c0 1.66-0.032 3.312-0.096 4.957 0.068 1.193 0.102 2.87 0.102 4.555 0 33.365-13.531 63.569-35.405 85.426-22.405 21.845-53.059 35.319-86.861 35.319-0.498 0-0.995-0.003-1.491-0.009-1.977 0.127-4.375 0.198-6.791 0.198-33.231 0-63.289-13.581-84.928-35.496zM784.772 776.828c0-0.098 0-0.214 0-0.33 0-28.728-2.182-56.946-6.39-84.498q-6.674-51.469 6.39-64.711c-104.163 104.549 12.74 3.697 101.875-118.677-55.039 80.477 21.701-15.244 74.999-124.498-5.498 21.297 27.966-51.503 46.666-130.027 10.199-43.067 15.641-88.167 15.687-134.53q0-74.712-23.834-97.664t-95.868-21.892c-46.070 0.004-91.085 5.603-134.153 16.159 28.939-12.216-54.196 10.331-129.672 46.343 77.853-41.806-31.522 6.241-125.255 74.477 118.509-87.564-12.674-5.057-119.168 102.027q-12.226 12.226-68.722 6.047t-80.154-6.003c-3.046-0.29-6.585-0.455-10.163-0.455-25.805 0-49.602 8.597-68.684 23.082q-27.084 23.276-41.384 37.224c27.28-35.625-31.619 25.214-72.705 97.5q-36.581 63.162-46.115 81.877c-4.572 7.318-7.283 16.205-7.283 25.726 0 13.972 5.838 26.58 15.208 35.519 10.411 14.901 29.204 26.422 50.759 28.422l107.274 0.021q54.731 0 72.386 0c0.62 55.862 25.696 107.667 65.339 143.745 34.953 38.736 86.445 64.019 143.857 65.113q1.077 17.658 0.194 72.389t0 106.99c0.871 20.401 11.99 40.168 28.77 52.832 8.854 9.49 21.208 15.327 34.926 15.327 9.675 0 18.672-2.904 26.166-7.888l78.745-45.441c-29.723 23.258 42.571-18.267 100.585-74.45q13.821-13.826 37.302-41.014c14.292-18.785 22.897-42.572 22.897-68.369 0-3.652-0.172-7.264-0.51-10.828zM378.703 814.257q-50.494 0-111.228-60.734t-60.734-111.228q0.883-27.012-17.655-28.072c-0.688-0.041-1.493-0.064-2.303-0.064-11.959 0-22.741 5.038-30.339 13.107l-105.951 105.952c-7.15 6.829-11.595 16.437-11.595 27.084 0 1.655 0.107 3.285 0.316 4.884q1.922 18.526 28.052 20.292h69.208q-10.593 26.659-24.541 58.968t-27.189 60.557c-3.134 4.806-4.999 10.688-4.999 17.006 0 6.87 2.204 13.225 5.945 18.397 4.631 3.246 10.481 5.244 16.797 5.244s12.166-1.998 16.951-5.397q24.274-11.062 61.526-26.951l59.851-25.247q0 13.065 0 27.542t0 41.49c-0.233 1.233-0.367 2.652-0.367 4.102 0 11.657 8.624 21.3 19.841 22.896 2.129 0.405 4.435 0.628 6.794 0.628 10.166 0 19.363-4.151 25.988-10.851l104.875-104.875c6.815-8.468 10.939-19.352 10.939-31.2 0-1.447-0.061-2.879-0.182-4.295q-1.4-19.060-29.471-19.060z"
1144
+ ],
1145
+ "attrs": [],
1146
+ "isMulticolor": false,
1147
+ "grid": 0,
1148
+ "tags": [
1149
+ "hummingbird"
1150
+ ],
1151
+ "colorPermutations": {}
1152
+ },
1153
+ {
1154
+ "id": 69,
1155
+ "paths": [
1156
+ "M836.149 346.571c7.483-36.21-2.216 28.877-18.984 91.063 12.733-9.516-27.719 112.534-90.884 219.586 21.638-1.365-83.817 143.882-221.683 248.702l-22.964 17.090c-4.412 2.891-9.818 4.611-15.625 4.611s-11.213-1.72-15.735-4.679l-2.538-0.815-19.421-14.654c-2.618 20.020-135.11-100.592-223.789-250.229-6.611-11.597-11.025-19.365-15.262-27.134 60.454 104.853 3.792 19.941-35.933-73.884-43.388-102.226-67.491-215.092-67.526-333.584-0-1.073-0-2.132-0-3.015 0-8.828 0-17.655 0-26.306-0.023-0.422-0.037-0.916-0.037-1.412s0.013-0.991 0.040-1.481c-0.066-0.646-0.102-1.476-0.102-2.315s0.036-1.67 0.106-2.49c0.831-7.653 6.206-15.435 13.802-19.771-1.342 0.6 1.387-0.991 4.392-1.97l0.16-0.045c8.651-3.884 17.655-7.768 25.953-11.299-68.26 26.429 17.317-13.015 109.005-37.494 71.809-19.158 147.446-29.39 225.473-29.39s153.664 10.232 225.643 29.427c-63.3-19.62 30.059 3.042 116.233 39.39q8.491 3.717 22.439 10.249c9.004 4.137 15.58 13.234 16.239 23.931l0.004 0.081c0 10.063 0 20.127 0 30.19 0 1.059 0 2.119 0 3.178 0.001 0.449 0.001 0.98 0.001 1.511 0 43.386-3.274 86.007-9.588 127.63zM732.866 444.734h-2.648l-5.297 0.883c14.98-20.528-234.445 43.985-461.092 149.267l12.474-5.2-3.178 1.412-6.532 3.001c-12.357 7.588-20.477 21.030-20.48 36.369-0.008 0.316-0.013 0.688-0.013 1.061 0 8.020 2.237 15.517 6.122 21.901l-0.105-0.187c-28.723-16.918 67.487 115.537 192.366 212.951l5.196 4.031c-2.892-1.681 0.951 0.982 5.257 2.746 3.281 1.292 6.831 1.996 10.545 1.996s7.264-0.704 10.524-1.985c-2.767 1.345 1.597-0.349 5.4-2.832l3.232-2.573c-2.954 22.686 121.104-90.887 204.65-231.368-27.53 56.203 30.813-39.564 67.65-145.403 1.709-7.759 3.121-9.701 3.827-11.82v0c0.086-0.873 0.135-1.887 0.135-2.913s-0.049-2.040-0.144-3.041c-0.085-15.408-12.554-28.001-28.034-28.297zM787.597 195.972c1.65 0.612-4.461-4.267-11.547-7.308 69.21 26.78-10.842-9.765-96.458-32.707-68.289-18.189-140.156-27.892-214.29-27.892s-146.001 9.703-214.401 27.908c65.558-19.796-21.197 1.107-101.41 34.56 6.226-3.164-1.027 0.568-6.877 5.828-2.485 1.051-8.402 8.523-11.519 17.32-1.364 3.399-2.395 8.149-2.562 13.118l-0.002 2.718c0.178 93.262 18.101 188.172 50.737 275.925l0.639 1.085c4.879 9.2 14.396 15.36 25.352 15.36 0.025 0 0.050-0 0.076-0 2.876-0.001 5.68-0.453 8.313-1.289l7.22-3.301 15.007-5.297c12.421-23.546 252.262-113.836 508.637-154.443l11.131-1.453 7.062-0.883c16.607-3.504 30.083-17.498 32.981-35.059l0.034-2.37c2.806-17.151 5.717-52.069 6.346-87.545l0.010-0.731v-3.531c-0.301-11.393-5.827-22.388-14.431-29.973zM928.839 155.012v0-3.884c-1.45-19.185-13.611-37.652-31.129-48.035l-8.595-3.871c-123.554-62.554-269.36-99.192-423.724-99.192s-300.171 36.639-429.198 101.694l-0.706 0.5c-17.981 9.809-31.053 29.183-32.476 51.721l-0.009 0.185c-2.295 22.422-3.001 45.55-3.001 68.502-0 0.347-0.001 0.758-0.001 1.168 0 132.824 27.602 259.201 77.382 373.708q15.309 34.37 35.789 72.859c0.214 48.775 134.179 221.365 308.837 337.68l13.546 8.714c8.615 4.561 18.832 7.239 29.674 7.239 0.057 0 0.115-0 0.172-0 0.27 0.004 0.6 0.007 0.93 0.007 10.76 0 20.893-2.681 29.769-7.412l9.545-6.19c170.176-91.26 341.8-313.48 402.374-578.038q10.227-46.955 15.7-88.974c4.833-36.003 7.592-77.623 7.592-119.887 0-0.245-0-0.491-0-0.736q-0.353-34.213-2.825-67.758z"
1157
+ ],
1158
+ "attrs": [],
1159
+ "isMulticolor": false,
1160
+ "width": 931,
1161
+ "grid": 0,
1162
+ "tags": [
1163
+ "defender"
1164
+ ],
1165
+ "colorPermutations": {}
1166
+ },
1167
+ {
1168
+ "id": 35,
1169
+ "paths": [
1170
+ "M336 256c113.6 113.6 224 224 336 336 16 16 16 33.6 0 48-24 24-57.6 57.6-80 80-16 16-32 16-48 0-17.6-17.6-62.4-62.4-80-80-30.4-28.8-51.2-12.8-64 0-16 16-80 128-160 208-81.6 81.6-152 104-208 48s-33.6-126.4 48-208c80-80 192-144 208-160s32-32 0-64c-19.2-19.2-60.8-60.8-80-80-16-16-16-32 0-48 24-24 56-56 80-80 16-16 32-17.6 48 0zM384 160c17.6-17.6 36.8-35.2 56-52.8 27.2-25.6 62.4-19.2 94.4-16 44.8 4.8 84.8 24 121.6 51.2 32 25.6 64 52.8 99.2 75.2 81.6 54.4 169.6 92.8 268.8 73.6-80 80-176 172.8-256 252.8-16 16-32 16-48 0-30.4-30.4-310.4-308.8-337.6-336-14.4-14.4-14.4-32 1.6-48z"
1171
+ ],
1172
+ "attrs": [],
1173
+ "isMulticolor": false,
1174
+ "tags": [
1175
+ "theme"
1176
+ ],
1177
+ "defaultCode": 108,
1178
+ "grid": 0,
1179
+ "colorPermutations": {}
1180
+ },
1181
+ {
1182
+ "id": 58,
1183
+ "paths": [
1184
+ "M1005.714 124.343l-105.874-106.057c-11.205-10.989-26.57-17.772-43.52-17.772s-32.315 6.783-43.53 17.782l-90.139 89.773c-5.001 4.942-8.098 11.801-8.098 19.383s3.097 14.441 8.095 19.38l155.066 154.883c4.933 4.946 11.755 8.006 19.291 8.006s14.358-3.060 19.291-8.005l89.418-90.332c11.28-10.805 18.29-25.989 18.29-42.81 0-0.25-0.002-0.499-0.005-0.748 0.003-0.173 0.005-0.423 0.005-0.672 0-16.821-7.010-32.005-18.269-42.79zM85.577 764.343l-6.4 4.754-1.646 4.754-75.703 219.429-1.829 5.669c-0.513 1.557-0.809 3.35-0.809 5.211s0.296 3.654 0.843 5.333c-0.303 0.398 1.78 4.222 4.722 7.195 1.212 2.436 4.596 5.222 8.667 6.372 1.411 0.533 2.92 0.826 4.497 0.826s3.085-0.294 4.474-0.829l4.669-3.263 219.429-74.24 6.4-3.291 4.754-4.754c3.012-4.003 4.823-9.059 4.823-14.537s-1.811-10.534-4.868-14.6l-146.241-146.223c-3.377-2.079-7.47-3.311-11.849-3.311-0.334 0-0.667 0.007-0.998 0.021-0.021-0.003-0.101-0.003-0.181-0.003-4.96 0-9.371 2.351-12.18 6zM141.897 727.771l154.697 154.88c4.341 4.569 10.461 7.411 17.245 7.411 0.753 0 1.497-0.035 2.232-0.103 8.182-0.993 15.802-6.995 19.227-15.186l508.222-505.218c4.805-1.237 8.299-5.531 8.299-10.641 0-0.83-0.092-1.638-0.267-2.415 0.044-0.358 0.062-0.86 0.062-1.367 0-6.796-3.142-12.858-8.052-16.813l-154.739-154.912c-4.933-4.946-11.755-8.006-19.291-8.006s-14.358 3.060-19.291 8.005l-507.612 505.783c-4.946 4.933-8.006 11.755-8.006 19.291s3.060 14.358 8.005 19.291z"
1185
+ ],
1186
+ "attrs": [],
1187
+ "isMulticolor": false,
1188
+ "grid": 0,
1189
+ "tags": [
1190
+ "pencil",
1191
+ "edit"
1192
+ ],
1193
+ "colorPermutations": {}
1194
+ },
1195
+ {
1196
+ "id": 53,
1197
+ "paths": [
1198
+ "M1061.82 351.266h-294.154c-0.215 0.002-0.468 0.003-0.722 0.003-32.971 0-61.217-20.227-73.008-48.949 2.219 5.396-0.573-0.484-2.378-6.781l-86.442-257.146-2.101-6.494c-8.374-19.126-27.135-32.245-48.96-32.245-23.194 0-42.927 14.817-50.25 35.502l-0.115 0.373-87.291 257.862c1.558-5.097-0.132 1.945-2.835 8.46-12.006 28.401-40.045 48.274-72.727 48.274-0.296 0-0.592-0.002-0.887-0.005l0.045 0h-294.727c-25.642 3.248-45.271 24.925-45.271 51.186 0 0.136 0.001 0.272 0.002 0.407 0.027 16.564 8.167 31.293 20.675 40.373l2.628 1.819 229.211 161.021c20.484 13.761 33.881 36.915 34 63.206 0 0.107 0.001 0.211 0.001 0.316 0 6.067-0.767 11.955-2.208 17.572 1.142-2.679-1.008 5.384-4.459 12.715l-86.355 256.883v1.91c-1.388 4.412-2.187 9.486-2.187 14.747 0 28.061 22.748 50.808 50.808 50.808 0.702 0 1.401-0.014 2.096-0.042-0.047 0.003 0.015 0.004 0.077 0.004 9.536 0 18.494-2.478 26.264-6.826l8.705-6.163 231.885-162.74c12.206-7.704 27.058-12.276 42.977-12.276s30.771 4.572 43.314 12.474c-7.243-4.386 0.917-0.236 7.788 5.423l-0.102-0.082 231.885 162.931c7.777 4.564 17.128 7.259 27.108 7.259 0.073 0 0.145-0 0.218-0 0.221 0.004 0.495 0.006 0.77 0.006 28.12 0 51.003-22.423 51.745-50.364-0.002-5.381-0.911-10.616-2.582-15.497l0.101-2.144-88.055-258.435c1.605 4.417-1.49-2.474-3.341-9.859-1.674-6.132-2.58-12.65-2.58-19.38 0-0.062 0-0.124 0-0.186 0.066-24.265 11.745-45.936 29.802-59.64l6.108-4.338 226.155-158.729 6.303-4.011c11.197-8.706 18.704-22.538 19.1-38.138-0.050-26.51-20.083-48.268-45.805-51.043z"
1199
+ ],
1200
+ "attrs": [],
1201
+ "isMulticolor": false,
1202
+ "width": 1108,
1203
+ "grid": 0,
1204
+ "tags": [
1205
+ "star"
1206
+ ],
1207
+ "colorPermutations": {}
1208
+ },
1209
+ {
1210
+ "id": 52,
1211
+ "paths": [
1212
+ "M57.026 56.85c-0 0-0 0-0 0 0 31.397 25.452 56.85 56.85 56.85 0.062 0 0.124-0 0.177-0h568.497c0 0 0 0 0 0 31.397 0 56.85-25.452 56.85-56.85s-25.452-56.85-56.85-56.85c-0 0-0 0-0 0l-568.506 0c-31.383 0.099-56.817 25.472-57.017 56.85zM739.585 341.274c31.286-0.099 56.641-25.392 56.84-56.673l-0-57.026c0-0 0-0.001 0-0.001 0-31.397-25.452-56.85-56.85-56.85-0.124 0-0.248 0-0.353 0.001l-681.833 0c-0.062-0-0.124-0-0.186-0-31.433 0-56.926 25.431-57.026 56.85l-0 56.85c0 31.397 25.452 56.85 56.85 56.85l0 625.523c-0 0-0 0-0 0 0 31.53 25.51 57.102 57.026 57.202l568.516-0c31.457-0.2 56.908-25.713 57.007-57.203v-625.523zM170.726 341.274h113.699v569.026h-113.699v-569.026zM341.451 341.274h113.699v569.026h-113.699v-569.026zM512.177 341.274h113.699v569.026h-113.876v-569.026z"
1213
+ ],
1214
+ "attrs": [],
1215
+ "isMulticolor": false,
1216
+ "width": 796,
1217
+ "grid": 0,
1218
+ "tags": [
1219
+ "trash"
1220
+ ],
1221
+ "colorPermutations": {}
1222
+ },
1223
+ {
1224
+ "id": 56,
1225
+ "paths": [
1226
+ "M0 719.978c3.708-17.655 6.532-35.31 11.299-51.377-7.126 8.74 11.71-43.949 40.441-89.805q27.355-46.14 55.426-93.985l5.12-9.357c-17.655-11.123-33.898-21.539-50.141-33.015 5.822 5.696-10.335-5.639-22.639-20.313-4.919-5.51-7.844-12.605-7.844-20.383 0-9.889 4.727-18.675 12.046-24.219-3.645 1.351 9.614-8.768 24.869-15.010 56.421-23.003 112.387-45.249 168.178-67.494-6.106 1.961 5.043-2.664 16.931-5.336 4.708-1.271 9.284-1.923 14.013-1.923 26.118 0 47.589 19.9 50.077 45.365 0.783 4.665 1.359 11.168 1.428 17.793 0.001 57.978 0.001 116.063 0.001 173.972-0.021 10.077-2.028 20.3-5.67 29.708-4.239 12.323-16.269 21.427-30.425 21.427-3.504 0-6.878-0.558-10.037-1.589 6.52 3.21-10.628-2.488-25.818-11.211-5.909-3.025-11.736-7.615-17.032-11.499l-19.068-12.359c8.284-9.307 1.068-2.312-4.432 5.926q-27.524 46.156-54.89 92.060c-6.004 6.006-17.172 30.182-21.757 56.615-1.298 6.087-1.965 11.997-1.965 18.063 0 36.533 24.174 67.419 57.399 77.535 13.393 5.084 32.907 9.050 53.262 9.677 47.947 1.243 95.616 0.007 143.991 0.007v127.47c-2.295 0-4.767 0-7.415 0-47.669 0-95.338 0-143.007 0-1.38 0.024-3.009 0.037-4.641 0.037-53.195 0-103.050-14.302-145.929-39.269-40.348-21.217-73.7-67.505-80.455-122.039 0.117-0.52-0.434-3.603-1.382-6.506l0.065-38.965z",
1227
+ "M529.655 0c8.121 1.766 16.066 3.354 24.011 5.473 41.158 5.964 94.925 41.852 129.257 92.078 26.639 37.158 48.531 76.529 72.365 114.664 5.473 8.651 10.417 17.655 16.066 27.189 17.655-11.652 34.251-23.305 51.553-33.721-3.028 0.505 11.386-7.634 27.317-12.175 3.654-1.177 6.994-1.751 10.469-1.751 13.188 0 24.446 8.262 28.88 19.893 3.479 7.925 5.842 18.24 6.072 29.080 0.001 59.408 0.001 118.729 0.001 178.051-0.015 8.262-1.436 16.972-4.052 25.147-9.543 30.29-39.733 43.179-73.808 30.467-39.548-14.83-78.742-30.543-118.113-45.903-19.597-7.592-39.018-15.183-58.439-23.128-15.99-3.526-29.254-17.061-32.616-34.149-0.057-0.657-0.064-1.101-0.064-1.547 0-17.183 9.899-32.055 24.305-39.223 13.319-9.295 26.737-17.77 40.332-26.774 0.441 0.988-0.304-1.449-1.462-3.635-22.196-36.972-43.382-74.754-67.040-110.948 8.017 6.546-12.692-21.384-39.313-42.065-14.667-12.194-33.179-19.41-53.376-19.41s-38.71 7.216-53.099 19.211c25.271-24.464-12.142 5.895-40.479 43.481 19.652-25.731-1.942-1.266-17.598 26.949l-100.686-59.592c35.31-60.381 75.211-113.699 141.241-141.241-34.894 12.533 6.236-4.964 49.994-15.797l38.282-0.622z",
1228
+ "M735.868 799.956c7.004 0.482 15.18 0.756 23.42 0.756 23.683 0 46.837-2.267 69.257-6.596 54.391-15.17 80.344-60.543 61.453-116.334 19.88 44.969-1.019-13.112-31.86-64.551-4.156-8.188-10.689-17.899-16.515-29.022l97.633-58.439c0.396-0.012 1.445 0.414 2.31 1.070 30.175 50.13 62.661 99.035 76.255 157.297 4.796 15.802 7.557 33.964 7.557 52.77 0 36.685-10.506 70.915-28.672 99.848-15.944 29.748-59.158 63.651-110.656 76.957-28.747 8.77-62.15 14.028-96.75 14.243-17.768 0.001-34.011 0.001-53.078 0.001 0 17.655 0 33.015 0 49.258-0.026 8.341-1.711 17.96-4.778 26.939-3.703 11.521-14.901 20.166-28.118 20.166-3.391 0-6.65-0.569-9.685-1.617 1.124 1.594-12.643-3.507-24.506-11.276q-79.804-51.514-159.605-103.774c-39.371-25.777-39.018-61.44 0-87.217l149.892-97.633c5.65-3.708 11.123-7.415 17.655-10.593 32.132-17.655 58.262-3.531 59.498 33.545-0.177 17.302-0.706 34.957-0.706 54.201z"
1229
+ ],
1230
+ "attrs": [],
1231
+ "isMulticolor": false,
1232
+ "grid": 0,
1233
+ "tags": [
1234
+ "recycle"
1235
+ ],
1236
+ "colorPermutations": {}
1237
+ },
1238
+ {
1239
+ "id": 65,
1240
+ "paths": [
1241
+ "M783.177 485.669c-0.348 0.003-0.76 0.004-1.172 0.004-24.883 0-48.442-5.667-69.457-15.781-34.513-16.040-53.896-11.103-78.582 19.617-112.823 141.166-226.926 281.6-348.526 415.086q-38.766 42.24-79.36 82.834c-20.826 22.637-50.592 36.771-83.659 36.771-16.787 0-32.724-3.643-47.062-10.181-43.521-16.596-74.586-58.691-74.992-108.094-0.292-3.121-0.458-6.69-0.458-10.298 0-32.327 13.337-61.54 34.809-82.435 53.603-52.871 106.083-106.997 162.22-157.099 107.703-95.817 217.417-189.257 325.486-283.429 27.794-24.137 33.097-44.617 18.286-79.36-9.86-21.246-15.611-46.116-15.611-72.329 0-16.558 2.295-32.579 6.584-47.764 2.76-24.535 23.467-58.079 53.097-80.421-50.767 31.77 36.317-36.676 136.106-82.067 11.91-5.812 25.84-9.77 40.592-10.707 18.593-0.016 25.908 14.796 15.485 30.887 5.996-7.73-0.822 2.75-9.657 11.122-21.063 21.792-42.091 43.186-63.303 65.129-20.488 20.262-33.176 48.375-33.176 79.451s12.688 59.189 33.166 79.441c12.262 12.993 24.696 25.793 36.582 38.227 19.129 19.681 45.853 31.893 75.429 31.893s56.3-12.212 75.405-31.868c22.515-22.333 44.458-45.373 66.584-68.048 4.73-7.707 13.111-12.77 22.674-12.77 2.874 0 5.642 0.457 8.234 1.303 6.31 4.942 10.457 12.717 10.457 21.461 0 4.495-1.096 8.735-3.035 12.465 4.698-9.518-4.469 21.077-18.839 48.518-20.039 35.263-41.616 73.298-64.29 109.32-26.735 41.843-72.942 69.187-125.535 69.187-1.574 0-3.143-0.024-4.705-0.073z"
1242
+ ],
1243
+ "attrs": [],
1244
+ "isMulticolor": false,
1245
+ "width": 999,
1246
+ "grid": 0,
1247
+ "tags": [
1248
+ "fix"
1249
+ ],
1250
+ "colorPermutations": {}
1251
+ },
1252
+ {
1253
+ "id": 36,
1254
+ "paths": [
1255
+ "M380.8 547.2l96 96c6.4 6.4 17.6 6.4 24-4.8l315.2-313.6c6.4-1.6 6.4-12.8 0-19.2l-96-96c-6.4-6.4-17.6-6.4-24 0l-315.2 313.6c-6.4 6.4-6.4 17.6 0 24zM345.6 569.6l-3.2 3.2-1.6 3.2-46.4 136-1.6 3.2c-1.6 4.8 0 8 3.2 11.2s8 4.8 11.2 3.2l3.2-1.6 136-46.4 3.2-1.6 3.2-3.2c4.8-4.8 4.8-12.8 0-17.6l-91.2-91.2c-3.2-3.2-11.2-3.2-16 1.6zM916.8 172.8l-65.6-65.6c-14.4-14.4-40-14.4-54.4 0l-56 56c-6.4 6.4-6.4 17.6 0 24l96 96c6.4 6.4 17.6 6.4 24 0l56-56c14.4-14.4 14.4-40 0-54.4zM832 432c-24 0-48 24-48 48v361.6l-592 6.4v-608h352c24 0 48-24 48-48s-24-48-48-48h-400c-24 0-48 24-48 48v704c0 24 24 48 48 48h688c25.6 0 48-22.4 48-48 0-4.8 0-416 0-416 0-24-24-48-48-48z"
1256
+ ],
1257
+ "attrs": [],
1258
+ "isMulticolor": false,
1259
+ "tags": [
1260
+ "edit"
1261
+ ],
1262
+ "defaultCode": 111,
1263
+ "grid": 0,
1264
+ "colorPermutations": {}
1265
+ },
1266
+ {
1267
+ "id": 40,
1268
+ "paths": [
1269
+ "M224 512c0 61.856-50.144 112-112 112s-112-50.144-112-112c0-61.856 50.144-112 112-112s112 50.144 112 112zM624 512c0 61.856-50.144 112-112 112s-112-50.144-112-112c0-61.856 50.144-112 112-112s112 50.144 112 112zM1024 512c0 61.856-50.144 112-112 112s-112-50.144-112-112c0-61.856 50.144-112 112-112s112 50.144 112 112z"
1270
+ ],
1271
+ "attrs": [],
1272
+ "isMulticolor": false,
1273
+ "tags": [
1274
+ "options"
1275
+ ],
1276
+ "defaultCode": 115,
1277
+ "grid": 0,
1278
+ "colorPermutations": {}
1279
+ },
1280
+ {
1281
+ "id": 41,
1282
+ "paths": [
1283
+ "M740.8 512v0c0 25.6-4.8 51.2-12.8 75.2-3.2 9.6-6.4 17.6-11.2 25.6-11.2 22.4-25.6 43.2-43.2 60.8s-38.4 32-60.8 44.8c-8 4.8-17.6 8-25.6 11.2-24 8-48 12.8-75.2 12.8v0c-25.6 0-51.2-4.8-73.6-12.8-9.6-3.2-17.6-6.4-27.2-11.2-22.4-11.2-43.2-25.6-60.8-43.2s-33.6-38.4-44.8-60.8c-4.8-8-8-17.6-11.2-27.2-8-24-12.8-48-12.8-73.6s4.8-51.2 12.8-75.2c3.2-9.6 6.4-17.6 11.2-27.2 11.2-22.4 25.6-43.2 44.8-60.8 17.6-17.6 38.4-32 60.8-43.2 8-4.8 17.6-8 27.2-11.2 24-8 48-12.8 73.6-12.8v0c25.6 0 51.2 4.8 75.2 12.8 9.6 3.2 17.6 6.4 25.6 11.2 22.4 11.2 43.2 25.6 60.8 44.8 17.6 17.6 32 38.4 43.2 60.8 4.8 8 8 17.6 11.2 25.6 8 22.4 12.8 48 12.8 73.6v0 0zM958.4 470.4v0c-1.6-17.6-16-32-33.6-33.6h-20.8c-22.4 0-41.6-12.8-49.6-30.4-1.6-4.8-3.2-9.6-4.8-14.4-4.8-11.2-9.6-22.4-14.4-33.6v0c-3.2-3.2-4.8-8-6.4-12.8v0c-1.6-6.4-3.2-12.8-3.2-19.2 0-16 6.4-28.8 16-40v0l11.2-11.2c12.8-14.4 14.4-35.2 1.6-49.6v0c-8-11.2-17.6-20.8-27.2-30.4s-20.8-19.2-30.4-28.8v0c-12.8-11.2-32-11.2-44.8-1.6l-8 8-8 9.6c-16 16-40 20.8-60.8 12.8-3.2-1.6-4.8-3.2-8-3.2-12.8-6.4-25.6-11.2-40-16-3.2 0-4.8-1.6-6.4-1.6v0c-6.4-3.2-12.8-6.4-19.2-12.8-9.6-9.6-14.4-20.8-16-32 0-4.8 0-9.6 0-14.4v-12.8c0-17.6-12.8-33.6-30.4-36.8-1.6 0-4.8 0-6.4 0v0c-11.2-1.6-24-1.6-36.8-1.6s-25.6 0-36.8 1.6v0c-1.6 0-4.8 0-6.4 0-17.6 3.2-30.4 17.6-30.4 36.8v16c0 24-14.4 44.8-36.8 52.8-1.6 0-3.2 1.6-4.8 1.6-14.4 4.8-28.8 11.2-43.2 17.6v0c-1.6 0-1.6 1.6-3.2 1.6-6.4 3.2-14.4 4.8-24 4.8-16 0-28.8-6.4-40-16v0l-11.2-11.2c-12.8-12.8-33.6-14.4-48-4.8-1.6 1.6-3.2 3.2-4.8 4.8v0c-9.6 8-19.2 16-27.2 25.6-9.6 8-17.6 17.6-25.6 27.2v0c-1.6 1.6-3.2 3.2-4.8 4.8-9.6 14.4-8 35.2 4.8 48l11.2 11.2c17.6 17.6 20.8 41.6 11.2 62.4 0 1.6-1.6 3.2-1.6 3.2-6.4 14.4-12.8 28.8-17.6 43.2 0 1.6-1.6 3.2-1.6 4.8v0c-3.2 6.4-6.4 14.4-12.8 19.2-11.2 11.2-25.6 16-40 16v0h-16c-17.6 0-33.6 12.8-36.8 30.4 0 1.6 0 4.8 0 6.4-1.6 14.4-1.6 27.2-1.6 40v0 0c0 12.8 0 24 1.6 36.8v0c0 1.6 0 4.8 0 6.4 3.2 17.6 17.6 30.4 36.8 30.4v0h16c24 0 44.8 14.4 52.8 35.2v0c0 1.6 1.6 3.2 1.6 4.8v0c4.8 14.4 11.2 28.8 17.6 43.2v0c0 1.6 1.6 1.6 1.6 3.2 3.2 6.4 4.8 14.4 4.8 24 0 16-6.4 28.8-16 40v0l-11.2 11.2c-12.8 12.8-14.4 32-4.8 46.4 1.6 1.6 3.2 3.2 4.8 6.4 8 9.6 16 19.2 25.6 27.2 8 8 17.6 17.6 27.2 25.6 1.6 1.6 3.2 3.2 6.4 4.8 12.8 8 30.4 8 43.2-1.6l16-16c17.6-17.6 41.6-20.8 62.4-11.2 1.6 0 1.6 1.6 3.2 1.6v0c14.4 6.4 28.8 12.8 43.2 17.6 1.6 0 3.2 1.6 3.2 1.6 8 3.2 14.4 6.4 20.8 12.8 11.2 11.2 16 25.6 16 40v0 16c0 19.2 14.4 35.2 33.6 36.8v0c14.4 4.8 27.2 4.8 41.6 4.8s27.2 0 41.6-1.6v0c19.2-1.6 33.6-17.6 33.6-36.8v-16c0-22.4 12.8-41.6 32-51.2 3.2-1.6 8-3.2 12.8-4.8 12.8-4.8 24-9.6 35.2-14.4 3.2-1.6 6.4-4.8 11.2-4.8 6.4-1.6 12.8-3.2 19.2-3.2 14.4 0 27.2 4.8 36.8 14.4 1.6 1.6 3.2 3.2 4.8 4.8l9.6 9.6c12.8 12.8 33.6 14.4 48 3.2v0c1.6-1.6 1.6-1.6 3.2-3.2 9.6-8 19.2-17.6 28.8-25.6 9.6-9.6 17.6-19.2 25.6-28.8 1.6-1.6 1.6-3.2 3.2-3.2 9.6-14.4 9.6-33.6-3.2-46.4v0l-3.2-3.2-9.6-12.8c-16-16-20.8-41.6-11.2-62.4 1.6-1.6 1.6-3.2 3.2-6.4 6.4-12.8 12.8-27.2 17.6-41.6 0-1.6 1.6-3.2 1.6-6.4 3.2-6.4 6.4-12.8 12.8-19.2 11.2-11.2 25.6-16 40-16v0h16c19.2 0 36.8-16 36.8-35.2v0c1.6-11.2 1.6-24 1.6-36.8 0-14.4 0-27.2-1.6-41.6z"
1284
+ ],
1285
+ "attrs": [],
1286
+ "isMulticolor": false,
1287
+ "tags": [
1288
+ "cog",
1289
+ "gear"
1290
+ ],
1291
+ "defaultCode": 116,
1292
+ "grid": 0,
1293
+ "colorPermutations": {}
1294
+ },
1295
+ {
1296
+ "id": 38,
1297
+ "paths": [
1298
+ "M683.2 683.2l-163.2-113.6-163.2 113.6 65.6-179.2-131.2-97.6h163.2l65.6-179.2 65.6 179.2h163.2l-131.2 97.6 65.6 179.2zM912 585.6c0-65.6-19.2-97.6-32-131.2-12.8-35.2-24-64-32-81.6-28.8-65.6 0-131.2 16-147.2s32-32 49.6-49.6c-19.2-20.8-62.4-59.2-81.6-81.6-33.6 16-81.6 32-147.2 32s-132.8-33.6-163.2-65.6c-33.6 35.2-116.8 67.2-180.8 67.2-67.2 0-99.2-14.4-131.2-32-17.6 17.6-54.4 54.4-81.6 81.6 12.8 12.8 30.4 30.4 49.6 49.6 16 16 44.8 97.6 16 147.2-9.6 16-32 51.2-49.6 81.6-16 32-32 65.6-32 131.2s32 168 97.6 212.8c49.6 32 131.2 32 179.2 49.6 49.6 16 113.6 81.6 131.2 113.6 16-32 83.2-97.6 131.2-113.6 49.6-17.6 131.2-16 179.2-49.6 70.4-49.6 81.6-148.8 81.6-214.4z"
1299
+ ],
1300
+ "attrs": [],
1301
+ "isMulticolor": false,
1302
+ "tags": [
1303
+ "badge"
1304
+ ],
1305
+ "defaultCode": 113,
1306
+ "grid": 0,
1307
+ "colorPermutations": {}
1308
+ },
1309
+ {
1310
+ "id": 42,
1311
+ "paths": [
1312
+ "M512 608c-212.8 0-390.4-78.4-416-160 0 20.8 0 108.8 0 108.8 0 92.8 185.6 163.2 416 163.2s416-70.4 416-163.2c0 0 0-91.2 0-108.8-25.6 81.6-203.2 160-416 160zM512 832c-212.8 0-390.4-78.4-416-160 0 27.2 0 105.6 0 105.6 0 92.8 185.6 166.4 416 166.4s416-73.6 416-166.4c0 0 0-94.4 0-105.6-25.6 81.6-203.2 160-416 160zM512 96c-230.4 0-416 73.6-416 160v80c0 91.2 185.6 160 416 160s416-68.8 416-160v-80c0-86.4-185.6-160-416-160z"
1313
+ ],
1314
+ "attrs": [],
1315
+ "isMulticolor": false,
1316
+ "tags": [
1317
+ "cylinder"
1318
+ ],
1319
+ "defaultCode": 117,
1320
+ "grid": 0,
1321
+ "colorPermutations": {}
1322
+ },
1323
+ {
1324
+ "id": 44,
1325
+ "paths": [
1326
+ "M716.8 564.8c112-75.2 259.2-168 259.2-388.8 0-32-27.2-48-48-48h-160c-25.6-48-105.6-96-256-96s-230.4 48-256 96h-160c-20.8 0-48 16-48 48 0 220.8 134.4 310.4 248 385.6 92.8 60.8 152 102.4 152 176v62.4c-81.6 8-160 54.4-160 96 0 51.2 100.8 96 224 96s224-44.8 224-96c0-41.6-81.6-86.4-160-96v-64c0-75.2 48-110.4 140.8-171.2zM784 208h112c-12.8 128-86.4 195.2-176 256 28.8-62.4 60.8-144 64-256zM128 208h112c3.2 112 35.2 193.6 64 256-89.6-60.8-163.2-128-176-256zM320 192c0-20.8 51.2-80 192-80s192 59.2 192 80-51.2 80-192 80-192-59.2-192-80z"
1327
+ ],
1328
+ "attrs": [],
1329
+ "isMulticolor": false,
1330
+ "tags": [
1331
+ "trophy"
1332
+ ],
1333
+ "defaultCode": 120,
1334
+ "grid": 0,
1335
+ "colorPermutations": {}
1336
+ },
1337
+ {
1338
+ "id": 43,
1339
+ "paths": [
1340
+ "M512 96c-307.2 0-179.2 387.2-336 544 0 0 587.2 0 672 0-148.8-148.8-30.4-544-336-544zM864 688h-704c-35.2 0-64 28.8-64 64s28.8 64 64 64h240c0 62.4 49.6 112 112 112s112-49.6 112-112h240c35.2 0 64-28.8 64-64s-28.8-64-64-64z"
1341
+ ],
1342
+ "attrs": [],
1343
+ "isMulticolor": false,
1344
+ "tags": [
1345
+ "bell"
1346
+ ],
1347
+ "defaultCode": 119,
1348
+ "grid": 0,
1349
+ "colorPermutations": {}
1350
+ }
1351
+ ],
1352
+ "invisible": false,
1353
+ "colorThemes": [],
1354
+ "colorThemeIdx": 0
1355
+ }
1356
+ ],
1357
+ "uid": -1,
1358
+ "preferences": {
1359
+ "showGlyphs": true,
1360
+ "showQuickUse": false,
1361
+ "showQuickUse2": true,
1362
+ "showSVGs": true,
1363
+ "fontPref": {
1364
+ "prefix": "dev-icon-",
1365
+ "metadata": {
1366
+ "fontFamily": "WPMU-DEV-App-Icons",
1367
+ "majorVersion": 2,
1368
+ "minorVersion": 0
1369
+ },
1370
+ "metrics": {
1371
+ "emSize": 1024,
1372
+ "baseline": 6.25,
1373
+ "whitespace": 50
1374
+ },
1375
+ "embed": false,
1376
+ "includeMetadata": false,
1377
+ "showSelector": false,
1378
+ "showMetrics": false,
1379
+ "showMetadata": false,
1380
+ "showVersion": true
1381
+ },
1382
+ "imagePref": {
1383
+ "prefix": "icon-",
1384
+ "png": true,
1385
+ "useClassSelector": true,
1386
+ "color": 4473924,
1387
+ "bgColor": 16777215,
1388
+ "classSelector": ".icon"
1389
+ },
1390
+ "historySize": 100,
1391
+ "showCodes": true,
1392
+ "gridSize": 16,
1393
+ "showGrid": false,
1394
+ "showLiga": false
1395
+ }
1396
+ }
includes/admin/shared-ui/font/WPMU-DEV-App-Icons.eot ADDED
Binary file
includes/admin/shared-ui/font/WPMU-DEV-App-Icons.svg ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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">
4
+ <metadata>Generated by IcoMoon</metadata>
5
+ <defs>
6
+ <font id="WPMU-DEV-App-Icons" horiz-adv-x="1024">
7
+ <font-face units-per-em="1024" ascent="960" descent="-64" />
8
+ <missing-glyph horiz-adv-x="1024" />
9
+ <glyph unicode="&#x20;" horiz-adv-x="512" d="" />
10
+ <glyph unicode="&#x30;" glyph-name="logo_alt" d="M514 960c-284 0-514-230-514-514s230-514 514-514c284 0 514 230 514 514s-230 514-514 514zM514 10c-242 0-436 196-436 436 0 242 194 436 436 436 240 0 436-194 436-436 0-240-196-436-436-436zM774 732l-60-48v-322c0-20-14-34-30-34-18 0-32 14-32 34v172c0 56-40 100-90 100s-90-44-90-100v-172c0-20-14-34-30-34s-30 14-30 34v172c0 56-40 100-90 100s-90-44-90-100v0-370l58 46v324c0 18 14 34 32 34 16 0 30-16 30-34v-172c0-56 40-102 90-102s90 46 90 102v0 172c0 18 14 34 30 34 18 0 32-16 32-34v-172c0-56 40-102 90-102s90 46 90 102v0 370z" />
11
+ <glyph unicode="&#x31;" glyph-name="devman" d="M798 492c18 10 32 30 32 52 0 32-26 58-58 58-34 120-62 230-62 230s-34 128-198 128c-164 0-198-128-198-128s-28-110-62-230c-32 0-58-26-58-58 0-22 14-42 32-52-32-118-62-224-62-224 0-10 22-22 56-28 10 40 22 98 36 146 22 76 58 120 120 142-36 12-54 58-62 110l124-66 78 74 14-198h-110c0 0 70-36 146-36 8 6 4 84 0 182l22-26 126 66c-8-48-26-94-64-106 64-26 104-70 122-142 10-48 26-106 36-146 34 6 56 18 56 28-4 0-34 106-66 224zM420 656l-90 74 150-16zM604 656l-62 58 150 16zM798 232c0 0-148-66-216-66-70 0-66 58-66 66h-8c-4-8 4-66-66-66-68 0-216 66-216 66l-44-182 330-114 332 114zM458 338h108v-36h-108z" />
12
+ <glyph unicode="&#x32;" glyph-name="fix" horiz-adv-x="999" d="M783.177 474.331c-0.348-0.003-0.76-0.004-1.172-0.004-24.883 0-48.442 5.667-69.457 15.781-34.513 16.040-53.896 11.103-78.582-19.617-112.823-141.166-226.926-281.6-348.526-415.086q-38.766-42.24-79.36-82.834c-20.826-22.637-50.592-36.771-83.659-36.771-16.787 0-32.724 3.643-47.062 10.181-43.521 16.596-74.586 58.691-74.992 108.094-0.292 3.121-0.458 6.69-0.458 10.298 0 32.327 13.337 61.54 34.809 82.435 53.603 52.871 106.083 106.997 162.22 157.099 107.703 95.817 217.417 189.257 325.486 283.429 27.794 24.137 33.097 44.617 18.286 79.36-9.86 21.246-15.611 46.116-15.611 72.329 0 16.558 2.295 32.579 6.584 47.764 2.76 24.535 23.467 58.079 53.097 80.421-50.767-31.77 36.317 36.676 136.106 82.067 11.91 5.812 25.84 9.77 40.592 10.707 18.593 0.016 25.908-14.796 15.485-30.887 5.996 7.73-0.822-2.75-9.657-11.122-21.063-21.792-42.091-43.186-63.303-65.129-20.488-20.262-33.176-48.375-33.176-79.451s12.688-59.189 33.166-79.441c12.262-12.993 24.696-25.793 36.582-38.227 19.129-19.681 45.853-31.893 75.429-31.893s56.3 12.212 75.405 31.868c22.515 22.333 44.458 45.373 66.584 68.048 4.73 7.707 13.111 12.77 22.674 12.77 2.874 0 5.642-0.457 8.234-1.303 6.31-4.942 10.457-12.717 10.457-21.461 0-4.495-1.096-8.735-3.035-12.465 4.698 9.518-4.469-21.077-18.839-48.518-20.039-35.263-41.616-73.298-64.29-109.32-26.735-41.843-72.942-69.187-125.535-69.187-1.574 0-3.143 0.024-4.705 0.073z" />
13
+ <glyph unicode="&#x33;" glyph-name="caret_right" d="M451.2 180.8l204.8 204.8c14.4 14.4 32 32 32 62.4s-17.6 49.6-32 62.4l-204.8 204.8c-27.2 27.2-67.2 27.2-94.4 0s-27.2-67.2 0-94.4l172.8-172.8-172.8-172.8c-27.2-27.2-27.2-67.2 0-94.4s67.2-27.2 94.4 0z" />
14
+ <glyph unicode="&#x37;" glyph-name="upfront" d="M810 604l-18 234-122 82-112 12-180-166 228-24zM16 380l176-86 26 322-198-182zM1012 380l-496-244 210-104 302 148zM984 706l-192 132 42-546 178 88zM316 960l-274-254-22-272 538 498zM0 180l514-248 212 100-710 348z" />
15
+ <glyph unicode="&#x39;" glyph-name="logo" d="M1004 290v670l-108-84v-586c0-34-24-62-54-62-32 0-56 28-56 62v312c0 100-74 182-164 182s-162-82-162-182v-312c0-34-26-62-56-62s-54 28-54 62v312c0 100-74 182-164 182s-164-82-164-182v0-670l108 84v586c0 34 26 62 56 62s56-28 56-62l-2-312c0-100 74-182 164-182s164 82 164 182v0 312c0 34 24 62 54 62 32 0 56-28 56-62v-312c0-100 72-182 164-182 90 0 162 82 162 182z" />
16
+ <glyph unicode="&#x3d;" glyph-name="speach_alt" d="M558 182c-42-14-86-22-134-22-26 0-50 2-76 8-22-20-74-52-150-58-2-2-2-2-4-2-6 0-14 4-4 8 22 14 62 40 62 80-120 52-202 156-202 276 0 174 168 314 374 314 156 0 290-80 346-194 22-2 42-8 60-14-52 148-214 258-406 258-234 0-424-164-424-364 0-120 70-232 186-298-6-6-14-10-22-14-28-16-32-42-28-60 6-20 24-42 58-42 2 0 6 2 8 2 74 6 128 32 160 54 20-2 42-4 62-4 70 0 134 16 192 40-22 8-42 18-58 32zM732 570c138 0 248-94 248-208 0-82-54-152-134-186 10-28 40-50 58-60 10-4 2-8-4-8-2 0-2 0-4 2-62 4-108 26-134 46-10-2-20-2-30-2-138 0-250 92-250 208 0 114 112 208 250 208zM732 620c-166 0-300-116-300-258s134-258 300-258c4 0 10 0 18 0 32-20 80-40 142-44 2 0 4-2 8-2 34 0 52 22 58 42 4 18 0 44-30 60-2 2-2 2-4 4 66 48 106 120 106 198 0 142-134 258-298 258z" />
17
+ <glyph unicode="&#x41;" glyph-name="comment" horiz-adv-x="1048" d="M0 769.427c0.213 105.296 85.621 190.573 190.947 190.573 0.066 0 0.132 0 0.198 0h666.058c0.056 0 0.122 0 0.188 0 105.325 0 190.734-85.277 190.947-190.552v-492.364c0-105.354-85.406-190.76-190.76-190.76h-38.938l-60.279-149.762-146.018 149.762h-421.955c-105.17 0.107-190.385 85.388-190.385 190.572 0 0.066 0 0.132 0 0.198v492.333z" />
18
+ <glyph unicode="&#x42;" glyph-name="download" horiz-adv-x="1365" d="M1050.836-64h-749.992c-0.424-0.002-0.925-0.003-1.426-0.003-15.013 0-29.805 0.942-44.322 2.77-117.762 14.242-218.304 105.483-247.147 224.715-3.005 14.041-5.359 25.576-7.949 36.169v69.208c-0.121-0.517 1.417 1.772 2.319 4.359 11.525 110.342 91.606 206.428 199.228 241.984 7.938 1.803 12.284 6.922 12.284 13.057 0 1.006-0.117 1.986-0.338 2.925 0.011 0.63 0.007 1.476 0.007 2.323 0 163.941 132.901 296.842 296.842 296.842 20.495 0 40.506-2.077 59.832-6.032-0.203-0.254 1.768-0.59 3.817-0.59 6.46 0 12.14 3.336 15.413 8.378 26.059 43.611 96.992 96.055 180.393 117.272-11.657-2.522 15.599 5.389 44.039 9.689 10.816 1.059 21.262 1.533 31.817 1.533 18.246 0 36.161-1.416 53.642-4.144 69.441-4.088 148.797-45.322 204.691-107.946 55.785-58.363 89.947-137.21 89.947-224.035 0-13.662-0.846-27.126-2.488-40.343-0.163 0.309-0.348-1.151-0.348-2.653 0-6.791 3.784-12.699 9.359-15.729 68.861-34.597 134.23-117.504 155.763-216.754-1.424 7.797 3.362-11.618 5.916-31.73 1.696-13.937 2.586-28.537 2.586-43.344s-0.889-29.407-2.618-43.748c-15.395-134.38-118.284-249.368-253.362-283.546-10.044-3.904-33.128-8.976-57.16-10.586zM780.359 642.207h-146.42c-12.397-1.14-22.314-11.010-23.532-23.433l-0.009-194.314c-0.974-12.508-10.94-22.506-23.448-23.534l-99.432-0.006c-14.36 0-48.493 0 0-48.728l195.149-196.326c6.226-6.256 14.843-10.128 24.364-10.128s18.139 3.872 24.363 10.127l195.15 194.914c49.199 49.199 11.535 48.728 0 48.728h-97.692c-13.001 0-23.54 10.539-23.54 23.54v195.384c-0.63 13.496-11.616 24.24-25.165 24.482z" />
19
+ <glyph unicode="&#x43;" glyph-name="pos_header" d="M0 511.81c0-35.241 28.456-63.81 64.056-63.81h895.888c35.377 0 64.056 28.994 64.056 63.81v384.38c0 35.241-28.456 63.81-64.056 63.81h-895.888c-35.377 0-64.056-28.994-64.056-63.81v-384.38zM0 224c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0 96c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0-32c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0 352c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32z" />
20
+ <glyph unicode="&#x44;" glyph-name="defender" horiz-adv-x="931" d="M836.149 613.429c7.483 36.21-2.216-28.877-18.984-91.063 12.733 9.516-27.719-112.534-90.884-219.586 21.638 1.365-83.817-143.882-221.683-248.702l-22.964-17.090c-4.412-2.891-9.818-4.611-15.625-4.611s-11.213 1.72-15.735 4.679l-2.538 0.815-19.421 14.654c-2.618-20.020-135.11 100.592-223.789 250.229-6.611 11.597-11.025 19.365-15.262 27.134 60.454-104.853 3.792-19.941-35.933 73.884-43.388 102.226-67.491 215.092-67.526 333.584 0 1.073 0 2.132 0 3.015 0 8.828 0 17.655 0 26.306-0.023 0.422-0.037 0.916-0.037 1.412s0.013 0.991 0.040 1.481c-0.066 0.646-0.102 1.476-0.102 2.315s0.036 1.67 0.106 2.49c0.831 7.653 6.206 15.435 13.802 19.771-1.342-0.6 1.387 0.991 4.392 1.97l0.16 0.045c8.651 3.884 17.655 7.768 25.953 11.299-68.26-26.429 17.317 13.015 109.005 37.494 71.809 19.158 147.446 29.39 225.473 29.39s153.664-10.232 225.643-29.427c-63.3 19.62 30.059-3.042 116.233-39.39q8.491-3.717 22.439-10.249c9.004-4.137 15.58-13.234 16.239-23.931l0.004-0.081c0-10.063 0-20.127 0-30.19 0-1.059 0-2.119 0-3.178 0.001-0.449 0.001-0.98 0.001-1.511 0-43.386-3.274-86.007-9.588-127.63zM732.866 515.266h-2.648l-5.297-0.883c14.98 20.528-234.445-43.985-461.092-149.267l12.474 5.2-3.178-1.412-6.532-3.001c-12.357-7.588-20.477-21.030-20.48-36.369-0.008-0.316-0.013-0.688-0.013-1.061 0-8.020 2.237-15.517 6.122-21.901l-0.105 0.187c-28.723 16.918 67.487-115.537 192.366-212.951l5.196-4.031c-2.892 1.681 0.951-0.982 5.257-2.746 3.281-1.292 6.831-1.996 10.545-1.996s7.264 0.704 10.524 1.985c-2.767-1.345 1.597 0.349 5.4 2.832l3.232 2.573c-2.954-22.686 121.104 90.887 204.65 231.368-27.53-56.203 30.813 39.564 67.65 145.403 1.709 7.759 3.121 9.701 3.827 11.82v0c0.086 0.873 0.135 1.887 0.135 2.913s-0.049 2.040-0.144 3.041c-0.085 15.408-12.554 28.001-28.034 28.297zM787.597 764.028c1.65-0.612-4.461 4.267-11.547 7.308 69.21-26.78-10.842 9.765-96.458 32.707-68.289 18.189-140.156 27.892-214.29 27.892s-146.001-9.703-214.401-27.908c65.558 19.796-21.197-1.107-101.41-34.56 6.226 3.164-1.027-0.568-6.877-5.828-2.485-1.051-8.402-8.523-11.519-17.32-1.364-3.399-2.395-8.149-2.562-13.118l-0.002-2.718c0.178-93.262 18.101-188.172 50.737-275.925l0.639-1.085c4.879-9.2 14.396-15.36 25.352-15.36 0.025 0 0.050 0 0.076 0 2.876 0.001 5.68 0.453 8.313 1.289l7.22 3.301 15.007 5.297c12.421 23.546 252.262 113.836 508.637 154.443l11.131 1.453 7.062 0.883c16.607 3.504 30.083 17.498 32.981 35.059l0.034 2.37c2.806 17.151 5.717 52.069 6.346 87.545l0.010 0.731v3.531c-0.301 11.393-5.827 22.388-14.431 29.973zM928.839 804.988v0 3.884c-1.45 19.185-13.611 37.652-31.129 48.035l-8.595 3.871c-123.554 62.554-269.36 99.192-423.724 99.192s-300.171-36.639-429.198-101.694l-0.706-0.5c-17.981-9.809-31.053-29.183-32.476-51.721l-0.009-0.185c-2.295-22.422-3.001-45.55-3.001-68.502 0-0.347-0.001-0.758-0.001-1.168 0-132.824 27.602-259.201 77.382-373.708q15.309-34.37 35.789-72.859c0.214-48.775 134.179-221.365 308.837-337.68l13.546-8.714c8.615-4.561 18.832-7.239 29.674-7.239 0.057 0 0.115 0 0.172 0 0.27-0.004 0.6-0.007 0.93-0.007 10.76 0 20.893 2.681 29.769 7.412l9.545 6.19c170.176 91.26 341.8 313.48 402.374 578.038q10.227 46.955 15.7 88.974c4.833 36.003 7.592 77.623 7.592 119.887 0 0.245 0 0.491 0 0.736q-0.353 34.213-2.825 67.758z" />
21
+ <glyph unicode="&#x45;" glyph-name="error" horiz-adv-x="1142" d="M1133.686 32.886l-507.668 894.818c-10.931 19.443-31.427 32.362-54.942 32.362s-44.011-12.919-54.779-32.047l-507.831-895.133c-5.349-9.287-8.504-20.423-8.504-32.295s3.155-23.008 8.673-32.615c10.799-19.015 31.273-31.902 54.762-31.976h1015.346c23.439 0.050 43.924 12.919 54.778 31.984 5.512 9.599 8.667 20.734 8.667 32.607s-3.155 23.008-8.673 32.615zM571.077 60.455c-47.431 2.299-85.016 41.314-85.016 89.108s37.585 86.808 84.811 89.1c47.636-2.291 85.221-41.306 85.221-89.1s-37.585-86.808-84.811-89.1zM640.985 353.477c-1.182-27.372-31.311-48.443-71.089-48.443s-67.545 21.071-68.726 48.443c-6.105 98.462-19.692 275.692-19.692 294.006 0 36.037 39.385 64.197 90.388 64.197s86.843-28.16 86.843-64.197c0.591-17.526-11.422-196.135-17.526-293.809z" />
22
+ <glyph unicode="&#x46;" glyph-name="facebook" horiz-adv-x="495" d="M109.909-64v512h-109.909v176.469h109.739v105.984c0.171 144.213 62.123 229.547 238.251 229.547h146.603v-176.469h-91.648c-68.267 0-73.216-24.747-73.216-70.656v-88.235h166.059l-19.627-176.64h-146.603v-512h-219.648z" />
23
+ <glyph unicode="&#x47;" glyph-name="wordpress" d="M510.72-64c-282.192 0.764-510.657 229.701-510.657 511.998 0 282.77 229.23 512 512 512s512-229.23 512-512c0-2.828-0.023-5.651-0.069-8.469-3.807-278.716-230.984-503.536-510.67-503.536-0.916 0-1.831 0.002-2.746 0.007zM801.829 773.669c-192 178.103-514.011 136.594-652.069-83.383 1.457-0.351 5.118-0.794 8.862-0.912l128.098 4.569c1.526 0.428 3.279 0.673 5.089 0.673 9.947 0 18.161-7.423 19.403-17.033 0.021-0.347 0.027-0.638 0.027-0.931 0-11.21-9.087-20.297-20.297-20.297-0.714 0-1.42 0.037-2.116 0.109-13.81-1.653-27.89-2.75-43.616-4.213l157.074-469.76c2.56 6.766 4.023 10.606 5.303 14.629 28.343 85.029 56.686 170.24 85.211 256 1.679 4.231 2.652 9.133 2.652 14.263s-0.973 10.032-2.745 14.532c-18.192 48.005-36.478 96.097-52.752 144.919-6.583 19.749-14.811 31.451-36.571 28.526-0.546-0.016-1.189-0.025-1.834-0.025-5.843 0-11.513 0.743-16.92 2.139-8.938 0.769-16.246 8.623-16.246 18.183 0 10.14 8.22 18.36 18.36 18.36 0.579 0 1.153-0.027 1.718-0.079 14.007 0.005 28.27-1.457 42.35-2.555 22.64-1.451 49.092-2.278 75.736-2.278 38.096 0 75.797 1.69 113.032 5-3.065 0.267-1.049 0.621 1.050 0.621 9.86 0 17.897-7.804 18.272-17.572 0.040-0.495 0.062-1.031 0.062-1.572 0-10.705-8.678-19.383-19.383-19.383-0.601 0-1.195 0.027-1.782 0.081-14.37-1.651-28.816-2.931-44.542-4.577l156.16-464.457c-2.265-4.5 0.24-0.213 1.921 4.467 22.399 75.076 45.439 149.864 66.833 224.836 5.267 17.232 8.3 37.039 8.3 57.555 0 37.519-10.143 72.669-27.837 102.857-7.891 14.4-17.765 28.845-25.994 44.571 3.982-11.641-12.885 20.218-22.608 55.057-1.764 7.159-2.529 13.298-2.529 19.616 0 39.446 29.81 71.93 68.131 76.153-2.341-0.849 2.341 0.302 6.655 2.147zM655.726 36.023l-134.766 367.177h-2.926l-128.914-374.674c36.697-11.121 78.871-17.524 122.541-17.524 51.481 0 100.884 8.898 146.754 25.239zM318.72 56.686l-206.629 566.857c-23.247-51.636-36.791-111.934-36.791-175.395 0-170.748 98.044-318.596 240.906-390.319zM899.291 649.143c0-6.217 0-9.143 0-12.069 0.474-7.029 0.745-15.236 0.745-23.506 0-43.384-7.439-85.030-21.111-123.733q-54.057-156.852-108.914-316.12l-34.743-100.571c197.303 111.726 272.823 371.383 164.571 575.817z" />
24
+ <glyph unicode="&#x48;" glyph-name="hummingbird" d="M757.583 604.072c11.477 11.477 18.575 27.331 18.575 44.844 0 35.025-28.394 63.419-63.419 63.419-17.513 0-33.368-7.098-44.844-18.575-10.923-11.137-17.664-26.409-17.664-43.255 0-0.372 0.003-0.744 0.010-1.115-0.009-0.316-0.013-0.754-0.013-1.193 0-34.42 27.903-62.323 62.323-62.323 0.439 0 0.877 0.005 1.314 0.014-0.064-0.001-0.062-0.001-0.061-0.001 17.106 0 32.589 6.951 43.778 18.183zM623.051 559.228c-22.791 22.051-36.94 52.915-36.94 87.082 0 1.103 0.015 2.202 0.044 3.297-0.060 1.246-0.092 2.898-0.092 4.558 0 69.717 56.517 126.234 126.234 126.234s126.234-56.517 126.234-126.234c0-1.66-0.032-3.312-0.096-4.957 0.068-1.193 0.102-2.87 0.102-4.555 0-33.365-13.531-63.569-35.405-85.426-22.405-21.845-53.059-35.319-86.861-35.319-0.498 0-0.995 0.003-1.491 0.009-1.977-0.127-4.375-0.198-6.791-0.198-33.231 0-63.289 13.581-84.928 35.496zM784.772 183.172c0 0.098 0 0.214 0 0.33 0 28.728-2.182 56.946-6.39 84.498q-6.674 51.469 6.39 64.711c-104.163-104.549 12.74-3.697 101.875 118.677-55.039-80.477 21.701 15.244 74.999 124.498-5.498-21.297 27.966 51.503 46.666 130.027 10.199 43.067 15.641 88.167 15.687 134.53q0 74.712-23.834 97.664t-95.868 21.892c-46.070-0.004-91.085-5.603-134.153-16.159 28.939 12.216-54.196-10.331-129.672-46.343 77.853 41.806-31.522-6.241-125.255-74.477 118.509 87.564-12.674 5.057-119.168-102.027q-12.226-12.226-68.722-6.047t-80.154 6.003c-3.046 0.29-6.585 0.455-10.163 0.455-25.805 0-49.602-8.597-68.684-23.082q-27.084-23.276-41.384-37.224c27.28 35.625-31.619-25.214-72.705-97.5q-36.581-63.162-46.115-81.877c-4.572-7.318-7.283-16.205-7.283-25.726 0-13.972 5.838-26.58 15.208-35.519 10.411-14.901 29.204-26.422 50.759-28.422l107.274-0.021q54.731 0 72.386 0c0.62-55.862 25.696-107.667 65.339-143.745 34.953-38.736 86.445-64.019 143.857-65.113q1.077-17.658 0.194-72.389t0-106.99c0.871-20.401 11.99-40.168 28.77-52.832 8.854-9.49 21.208-15.327 34.926-15.327 9.675 0 18.672 2.904 26.166 7.888l78.745 45.441c-29.723-23.258 42.571 18.267 100.585 74.45q13.821 13.826 37.302 41.014c14.292 18.785 22.897 42.572 22.897 68.369 0 3.652-0.172 7.264-0.51 10.828zM378.703 145.743q-50.494 0-111.228 60.734t-60.734 111.228q0.883 27.012-17.655 28.072c-0.688 0.041-1.493 0.064-2.303 0.064-11.959 0-22.741-5.038-30.339-13.107l-105.951-105.952c-7.15-6.829-11.595-16.437-11.595-27.084 0-1.655 0.107-3.285 0.316-4.884q1.922-18.526 28.052-20.292h69.208q-10.593-26.659-24.541-58.968t-27.189-60.557c-3.134-4.806-4.999-10.688-4.999-17.006 0-6.87 2.204-13.225 5.945-18.397 4.631-3.246 10.481-5.244 16.797-5.244s12.166 1.998 16.951 5.397q24.274 11.062 61.526 26.951l59.851 25.247q0-13.065 0-27.542t0-41.49c-0.233-1.233-0.367-2.652-0.367-4.102 0-11.657 8.624-21.3 19.841-22.896 2.129-0.405 4.435-0.628 6.794-0.628 10.166 0 19.363 4.151 25.988 10.851l104.875 104.875c6.815 8.468 10.939 19.352 10.939 31.2 0 1.447-0.061 2.879-0.182 4.295q-1.4 19.060-29.471 19.060z" />
25
+ <glyph unicode="&#x49;" glyph-name="twitter" horiz-adv-x="1311" d="M1310.792 838.865c-14.89-10.709-81.418-32.19-151.988-40.433 39.699 16.967 91.224 72.488 115.047 140.977-5.215-8.61-82.434-44.54-166.562-61.314-53.177 49.795-122.171 81.005-198.455 81.005-0.51 0-1.019-0.001-1.529-0.004-1.417 0.031-3.181 0.048-4.948 0.048-143.894 0-260.897-115.137-263.907-258.31-0.005-0.394-0.005-0.528-0.005-0.663 0-20.801 2.555-41.005 7.367-60.315-213.432 6.91-416.518 110.697-554.535 271.859-23.725-35.825-37.265-80.55-37.265-128.437 0-0.162 0-0.324 0-0.486 0.318-89.914 47.503-169.25 118.519-214.509-40.056-0.282-83.88 11.67-122.242 32.426s1.463-2.758 1.463-3.888c1.807-126.237 93.452-231.003 213.999-253.1-19.642-6.049-44.035-9.384-69.208-9.384-17.872 0-35.351 1.681-52.289 4.894 39.032-104.987 137.304-178.977 252.959-179.717-91.27-69.137-206.805-110.743-332.057-110.743-0.661 0-1.321 0.001-1.981 0.003-21.669 0.002-43.945 1.315-65.843 3.869 119.49-73.177 261.363-116.418 413.335-116.418 0.546 0 1.091 0.001 1.636 0.002 494.626 0 765.147 393.916 765.147 735.4q0 16.724 0 33.448c-10.131-19.157 72.941 47.501 132.196 132.070z" />
26
+ <glyph unicode="&#x4a;" glyph-name="github" horiz-adv-x="1058" d="M692.495 215.53c63.126 15.876 116.235 46.872 145.341 107.73 18.195 36.716 28.841 79.951 28.841 125.673 0 26.693-3.629 52.539-10.419 77.070 1.36 8.143-14.763 42.914-38.675 70.812-2.053 2.82-3.417 6.692-3.417 10.883 0 1.408 0.154 2.78 0.446 4.1 4.58 15.767 7.227 34.023 7.227 52.897 0 24.881-4.601 48.687-12.998 70.614-0.751 4.264-5.676 8.414-11.569 8.414-0.625 0-1.24-0.047-1.84-0.137-22.795-0.222-48.918-7.221-71.926-19.338-17.97-8.815-36.87-20.344-55.77-30.361-3.497-1.961-7.675-3.117-12.123-3.117-1.324 0-2.625 0.102-3.894 0.3-37.228 9.592-80.127 15.108-124.315 15.108s-87.087-5.516-128.047-15.898c2.499 0.603 1.24 0.507-0.042 0.507-4.959 0-9.583 1.436-13.479 3.916-6.299 9.525-54.471 35.184-107.814 47.174l-8.319 1.338c-18.9 2.079-20.412 1.701-26.46-17.577-6.368-18.236-10.046-39.259-10.046-61.14 0-19.234 2.842-37.804 8.129-55.314-0.014 0.17 0.18-1.189 0.18-2.593 0-3.031-0.903-5.852-2.455-8.206-47.593-55.132-56.665-119.959-46.081-188.944-2.207-0.821 5.952-38.105 19.692-72.558 26.046-66.924 81.045-103.59 150.408-121.545 21.357-5.481 43.281-8.883 66.339-13.608-12.638-11.215-26.514-36.191-31.088-64.29-1.070-3.438-4.041-6.294-7.755-7.504-56.791-21.761-111.412-12.122-145.999 45.145-10.683 23.925-37.497 46.215-69.98 53.542-4.020 0.649-7.843 0.943-11.734 0.943-5.736 0-11.323-0.639-16.694-1.849-7.811-1.416-9.134-7.842-3.842-14.079-2.725 1.877 4.644-6.466 13.756-12.335 19.054-7.885 45.767-36.705 59.057-72.092 17.056-43.824 58.023-73.933 106.097-74.521 4.852-0.123 10.481-0.193 16.125-0.193 20.964 0 41.704 0.962 62.177 2.844-2.629-32.514-2.629-66.534-2.629-100.365 0-17.199-18.9-25.137-39.123-18.9 7.828-9.482-65.118 19.649-127.215 63.198-158.175 112.005-238.689 266.229-230.562 461.276 11.099 242.804 190.67 443.514 425.429 487.122 34.55 7.142 70.546 10.946 107.43 10.946 289.868 0 524.852-234.984 524.852-524.852 0-229.409-147.183-424.441-352.272-495.818-29.388-9.621-44.886 1.152-44.886 27.99q0 65.961 0 132.3c0.271 3.25 0.426 7.035 0.426 10.856 0 35.003-12.981 66.973-34.392 91.36 23.382 4.379 44.928 7.781 65.907 13.073z" />
27
+ <glyph unicode="&#x4b;" glyph-name="stackoverflow" horiz-adv-x="807" d="M750.421 580.096l-232.448 328.704 69.973 51.2c6.315-7.68 12.629-14.336 17.067-21.675 64.171-95.573 127.488-191.488 192.341-286.379 12.288-17.92 14.165-29.696-6.315-41.643 76.886 48.048 12.89 14.204-41.447-30.876zM734.72 562.176l-52.736-59.221-304.299 277.163 60.075 64.171zM270.677 614.912l34.133 63.317c9.899 17.067 21.333 6.656 31.403 0.853q140.459-80.555 280.576-161.621c59.051-34.133 59.904-41.813 11.776-97.792zM620.203 389.803c-2.56-10.581-3.072-13.312-3.925-16.213-17.067-60.587-5.461-54.784-64.683-38.059-106.667 30.208-213.333 61.269-320.341 90.112-25.088 6.827-29.525 17.067-20.992 40.448 25.429 70.656 11.947 59.221 74.923 39.765 103.253-31.744 205.995-65.365 308.736-99.157-5.62 4.303 11.983-4.578 26.432-17.021zM595.285 268.288c-1.877-49.323-2.731-51.2-48.469-46.421-117.077 11.264-233.984 23.381-351.061 34.133-21.333 2.048-27.136 9.899-23.211 31.915 10.923 63.659 9.728 62.635 75.264 53.589q158.891-22.016 318.293-40.277c25.259-2.56 35.328-11.435 29.355-32.939zM378.027 194.219c59.904 0 119.467 0 179.712 0 22.869 0 33.109-5.291 32.256-30.549-2.389-72.704 9.899-63.317-62.805-63.659-108.203 0-216.405 0-324.267 0-27.136-0.512-38.229 6.656-38.229 35.157 1.877 70.827-2.731 58.027 59.221 58.88 51.712 0.683 102.912 0.171 154.112 0.171zM91.136 29.525h576.512v38.741c0 87.040 0 173.909 0 260.949 0 23.040 6.997 30.208 29.696 29.525 73.387-2.219 60.587 8.875 61.099-61.44 0-110.080 0-220.331 0-330.411 0-24.576-8.021-30.891-31.573-30.72q-347.819 1.024-695.808 0c-24.064 0-31.403 7.168-31.232 31.232 1.024 119.467 1.195 238.933 0 359.424 0 26.283 8.533 32.597 33.28 32.256 57.856-1.195 57.856 0 57.856-59.051v-270.507z" />
28
+ <glyph unicode="&#x4c;" glyph-name="linkedin" horiz-adv-x="1096" d="M378.839-64h234.818v380.6c-0.115 2.18-0.181 4.732-0.181 7.299 0 17.148 2.933 33.61 8.325 48.913 18.477 47.756 64.975 81.744 119.411 81.744 0.217 0 0.434-0.001 0.65-0.002 85.088 0 118.941-62.422 118.941-154.001v-364.554h235.013v391.363c0 209.379-115.843 306.633-270.431 306.633-3.397 0.176-7.375 0.276-11.377 0.276-85.454 0-160.246-45.646-201.324-113.886l0.974-1.058v97.841h-234.818c3.131-63.596 0-681.166 0-681.166zM131.302 696.613c1.841-0.096 3.997-0.15 6.166-0.15 70.031 0 126.801 56.771 126.801 126.801 0 1.773-0.036 3.538-0.108 5.293-1.362 74.499-50.869 131.442-131.294 131.442-1.841 0.096-3.997 0.15-6.166 0.15-70.031 0-126.801-56.771-126.801-126.801 0-1.773 0.036-3.538 0.108-5.293-0.091-1.46-0.139-3.466-0.139-5.482 0-69.598 56.421-126.019 126.019-126.019 1.353 0 2.702 0.021 4.045 0.064l1.369-0.005zM248.711-64v681.166h-234.818v-681.166h234.818z" />
29
+ <glyph unicode="&#x4d;" glyph-name="medium" horiz-adv-x="1293" d="M0 809.32v151.349h484.806v-1.783l17.832-65.087 109.667-407.906q15.603-58.177 31.206-116.354c0-2.452 2.006-3.566 4.235-2.675 0.899 0.591 1.747 1.849 2.001 3.312l111.454 414.179 48.146 176.313h483.469v-151.572h-4.235c-14.934 0-29.646 0-44.58 0-4.902-0.022-10.177-1.17-14.975-3.221-4.709-0.532-16.911-9.762-25.001-21.956-5.298-7.041-8.399-15.65-8.399-24.983 0-0.233 0.002-0.465 0.006-0.697q0-313.139 0-626.535c-0.011-0.319-0.017-0.695-0.017-1.071 0-8.082 2.868-15.495 7.641-21.275-7.498 8.847 0.66-2.521 10.991-11.442 8.277-7.432 19.135-11.92 31.042-11.92 0.409 0 0.817 0.005 1.224 0.016 13.983-0.001 28.025-0.001 41.845-0.001h4.458v-3.566q0-73.111 0-146.445h-462.739c-0.034 0.533-0.053 1.156-0.053 1.783s0.019 1.25 0.057 1.868q-0.004 71.912-0.004 143.685c0 1.114 0 2.229 0 3.789h96.515v668.698c-3.566 1.337-4.904 0-5.795-3.343q-29.2-103.871-57.285-207.296l-161.379-583.997c-2.229-8.47-4.458-16.717-6.687-25.188h-175.199s0 2.229-1.114 3.343l-60.852 222.899-160.488 588.677c-1.337 4.904-1.337 4.904-6.687 4.012v-668.698h96.738v-4.458q0-73.111 0-146.445h-387.845v152.017h49.707c0.97-0.123 2.093-0.193 3.232-0.193s2.262 0.070 3.364 0.206c11.449 1.849 25.89 12 34.716 26.038 3.75 4.782 6.060 10.819 6.165 17.391q0 316.541 0 633.281c-0.021 3.62-0.924 7.669-2.528 11.342 0.243 2.833-7.367 14.032-17.619 21.991-8.527 7.722-19.721 12.387-32.005 12.387-0.551 0-1.099-0.009-1.645-0.028-14.409 0.002-28.675 0.002-43.163 0.002z" />
30
+ <glyph unicode="&#x4e;" glyph-name="minify" d="M244.524 72.828c3.553 5.798-0.865-3.084-6.972-10.526-35.223-35.201-68.945-69.452-103.726-103.703-14.1-13.997-33.525-22.647-54.969-22.647-11.348 0-22.131 2.422-31.859 6.778-27.618 12.237-46.878 39.882-46.878 72.026 0 22.325 9.291 42.48 24.217 56.81l101.544 101.366c-16.571-15.614-4.263-2.16 10.381 8.213-4.202 5.204-7.027 8.559-10.205 11.56l-89.335 89.512c-0.261-0.319-3.339 2.282-5.427 5.573-2.997 5.565-4.731 12.087-4.731 19.013 0 0.978 0.035 1.948 0.103 2.909 4.057 4.921 10.436 8.32 17.615 8.521 43.288 0.001 86.543 0.001 129.798 0.001h179.023c1.53 0.095 3.319 0.149 5.12 0.149s3.59-0.054 5.364-0.16c-0.168 0.013-0.077 0.014 0.013 0.014 9.751 0 17.655-7.904 17.655-17.655 0-1.061-0.094-2.1-0.273-3.11 0.016-29.907 0.016-59.921 0.016-89.758q0-112.11 0-224.221c0.66-1.778 1.041-3.831 1.041-5.974 0-7.121-4.216-13.258-10.289-16.050-2.023-0.657-4.224-1.009-6.508-1.009-7.33 0-13.812 3.632-17.744 9.194q-45.949 45.971-91.499 92.051c3.89-5.539-2.709 2.264-7.247 11.283zM886.113 185.997c5.826-6.179 8.121-9.004 10.77-11.652 35.31-35.31 69.385-69.032 103.636-104.166 14.141-14.205 22.884-33.795 22.884-55.426 0-36.978-25.546-67.989-59.952-76.347-6.248-1.654-12.806-2.541-19.57-2.541-21.704 0-41.275 9.129-55.085 23.756l-104.023 103.849-7.945 7.768-9.357-8.828-89.159-89.335c0.312-0.541-3.553-4.67-8.341-7.347-4.333-2.131-9.274-3.337-14.497-3.337-1.911 0-3.784 0.161-5.606 0.471-4.663 3.855-7.749 9.78-7.749 16.426 0 0.050 0 0.1 0.001 0.15 0 73.261 0 146.53 0 219.799 0 32.662 0 65.324 0 97.986-0.459 1.497-0.723 3.218-0.723 5.001 0 9.751 7.904 17.655 17.655 17.655 1.833 0 3.6-0.279 5.262-0.797l317.668 0.034c0.522 0.060 1.127 0.093 1.74 0.093 8.971 0 16.243-7.272 16.243-16.243 0-4.019-1.46-7.697-3.878-10.533 4.384 5.383-1.42-3.319-8.937-10.174q-44.716-44.711-89.56-89.202c3.812 2.402-3.136-3.205-11.14-6.922zM245.76 823.172l89.688 90.041c-6.447-6.153 4.178 6.713 17.378 16.229 5.098 3.007 10.891 4.67 17.072 4.67 1.423 0 2.826-0.088 4.203-0.259 8.486-1.396 8.31-10.4 8.31-17.638q0-157.837 0-315.498c0-18.538-4.943-23.128-24.011-23.128-104.342 0-208.861 0-313.203 0-6.749 0.104-13.125 3.133-17.643 7.932-1.432 2.499-2.269 5.477-2.269 8.651 0 5.661 2.665 10.7 6.808 13.931 15.399 15.743 31.112 31.279 46.649 46.816l57.026 57.909-9.181 9.71c-35.31 35.31-69.385 69.032-103.636 104.166-14.223 13.509-23.071 32.559-23.071 53.676 0 8.596 1.466 16.85 4.162 24.525 6.485 26.059 29.621 47.893 58.533 53.086 5.633 1.325 11.579 2.046 17.693 2.046 21.959 0 41.746-9.302 55.635-24.18l102.264-102.444c-11.027 12.493-0.547 2.233 7.359-9.861zM775.062 822.466c39.901 40.077 76.623 77.33 114.052 114.052 14.357 14.968 34.522 24.269 56.859 24.269 43.488 0 78.742-35.254 78.742-78.742 0-22.645-9.559-43.057-24.861-57.421-33.94-34.29-68.191-68.188-102.266-102.263-2.825-2.825-5.65-6.003-9.534-10.24l62.323-61.263c13.418-13.418 27.189-26.483 40.077-40.43 3.281-2.891 7.111-9.74 8.444-17.445 1.443-10.097-5.443-15.394-17.625-15.57h-312.32c-23.658 0-27.719 4.061-27.719 27.895q0 154.306 0 308.789c-0.413 1.424-0.651 3.059-0.651 4.749 0 6.691 3.722 12.513 9.21 15.508 2.175 0.813 4.58 1.256 7.088 1.256 6.687 0 12.638-3.151 16.45-8.049q45.938-45.421 91.312-91.147c-15.147 17.038-0.765 3.060 10.102-13.439z" />
31
+ <glyph unicode="&#x4f;" glyph-name="archive" horiz-adv-x="833" d="M382.025 265.41h-238.592c-1.362-0.048-2.963-0.075-4.569-0.075-76.722 0-138.918 62.196-138.918 138.918 0 1.37 0.020 2.735 0.059 4.095q-0.005 206.441-0.005 412.734c0 76.722 62.196 138.918 138.918 138.918 161.666 0 324.026 0 486.213 0 0.971 0.025 2.113 0.040 3.26 0.040 56.17 0 104.23-34.726 123.881-83.881 14.209-31.287-1.593-54.73-34.412-54.73h-503.578c-1.857 0.176-4.014 0.277-6.195 0.277-38.361 0-69.459-31.098-69.459-69.459 0-2.237 0.106-4.45 0.313-6.633q-0.021-131.52-0.021-263.318c0-50.705 27.784-77.968 78.662-77.968h501.321c1.458 0.217 3.141 0.341 4.852 0.341 19.181 0 34.73-15.549 34.73-34.73 0-6.532-1.803-12.643-4.94-17.862-21.008-51.071-70.552-86.546-128.396-86.667h-243.122zM451.484 213.315h208.377v-121.553c25.7 0 15.802 0 40.634 0 2.535 0.441 5.797 2.794 7.78 6.017 12.82 17.355 33.139 28.447 56.049 28.447 38.361 0 69.459-31.098 69.459-69.459 0-2.169-0.099-4.314-0.294-6.432-2.734-30.281-26.005-55.449-56.157-61.132-4.598-1.004-9.383-1.54-14.293-1.54-22.154 0-41.758 10.918-53.726 27.666-2.948 4.367-7.652 7.070-12.987 7.070-0.611 0-1.215-0.036-1.807-0.105-22.676 0.007-10.694 0.007-33.268 0.007 0-29.867-28.826-86.824-105.578-86.824-1.14-0.046-2.478-0.072-3.822-0.072-50.887 0-93.019 37.48-100.298 86.34-24.726 0.555-14.828 0.555-39.833 0.555-2.535-0.441-5.797-2.794-7.78-6.017-12.746-18.188-33.546-29.892-57.081-29.892-38.361 0-69.459 31.098-69.459 69.459 0 2.741 0.159 5.444 0.468 8.102 2.724 30.229 25.995 55.398 56.147 61.080 4.598 1.004 9.383 1.54 14.293 1.54 22.154 0 41.758-10.918 53.726-27.666 2.935-4.459 7.69-7.232 13.094-7.232 0.574 0 1.14 0.031 1.698 0.092 22.679-0.006 10.697-0.006 34.661-0.006v121.553zM664.376 601.070l-217.58 80.746v80.92l217.58-80.92v-80.746zM664.376 739.815l-217.58 80.92h217.58v-80.92zM664.376 462.326l-217.58 80.746v80.746l217.58-80.746v-80.746zM446.795 404.328v80.746l217.58-80.746h-217.58z" />
32
+ <glyph unicode="&#x50;" glyph-name="pencil" d="M1005.714 835.657l-105.874 106.057c-11.205 10.989-26.57 17.772-43.52 17.772s-32.315-6.783-43.53-17.782l-90.139-89.773c-5.001-4.942-8.098-11.801-8.098-19.383s3.097-14.441 8.095-19.38l155.066-154.883c4.933-4.946 11.755-8.006 19.291-8.006s14.358 3.060 19.291 8.005l89.418 90.332c11.28 10.805 18.29 25.989 18.29 42.81 0 0.25-0.002 0.499-0.005 0.748 0.003 0.173 0.005 0.423 0.005 0.672 0 16.821-7.010 32.005-18.269 42.79zM85.577 195.657l-6.4-4.754-1.646-4.754-75.703-219.429-1.829-5.669c-0.513-1.557-0.809-3.35-0.809-5.211s0.296-3.654 0.843-5.333c-0.303-0.398 1.78-4.222 4.722-7.195 1.212-2.436 4.596-5.222 8.667-6.372 1.411-0.533 2.92-0.826 4.497-0.826s3.085 0.294 4.474 0.829l4.669 3.263 219.429 74.24 6.4 3.291 4.754 4.754c3.012 4.003 4.823 9.059 4.823 14.537s-1.811 10.534-4.868 14.6l-146.241 146.223c-3.377 2.079-7.47 3.311-11.849 3.311-0.334 0-0.667-0.007-0.998-0.021-0.021 0.003-0.101 0.003-0.181 0.003-4.96 0-9.371-2.351-12.18-6zM141.897 232.229l154.697-154.88c4.341-4.569 10.461-7.411 17.245-7.411 0.753 0 1.497 0.035 2.232 0.103 8.182 0.993 15.802 6.995 19.227 15.186l508.222 505.218c4.805 1.237 8.299 5.531 8.299 10.641 0 0.83-0.092 1.638-0.267 2.415 0.044 0.358 0.062 0.86 0.062 1.367 0 6.796-3.142 12.858-8.052 16.813l-154.739 154.912c-4.933 4.946-11.755 8.006-19.291 8.006s-14.358-3.060-19.291-8.005l-507.612-505.783c-4.946-4.933-8.006-11.755-8.006-19.291s3.060-14.358 8.005-19.291z" />
33
+ <glyph unicode="&#x51;" glyph-name="quora" horiz-adv-x="911" d="M695.79 106.019c3.596-15.101 23.817-39.586 50.242-54.246-40.601 22.728 2.827-5.557 50.912-24.625 9.205-2.488 13.998-8.286 13.998-15.204 0-0.382-0.015-0.761-0.043-1.136 0.003-17.605 0.003-35.261 0.003-52.916 0.257-1.013 0.404-2.177 0.404-3.375 0-7.898-6.403-14.301-14.301-14.301-0.266 0-0.531 0.007-0.794 0.022-59.108-9.182-115.605-5.828-166.805 29.129-7.085-0.7-40.335 30.641-61.431 69.534-3.148 6.217-8.387 9.67-14.433 9.67-1.336 0-2.632-0.169-3.869-0.486 2.529-0.954-45.655-7.205-94.816-9.766-3.969-0.12-5.873-0.132-7.78-0.132-94.629 0-182.061 30.815-252.809 82.957-85.845 51.128-164.078 162.048-186.131 292.088-5.712 28.702-8.77 58.662-8.77 89.337 0 116.169 43.862 222.094 115.928 302.117 45.578 64.244 143.675 127.546 256.753 147.171 27.893 5.565 56.97 8.538 86.741 8.538 104.131 0 199.769-36.366 274.906-97.090 75.283-48.643 146.935-154.036 168.449-276.688 5.832-29.094 8.949-59.458 8.949-90.549 0-103.708-34.672-199.318-93.057-275.871 16.652 8.453-41.705-60.467-114.896-108.714l-7.526-5.466zM629.407 245.495c1.236 1.766 4.237 5.473 7.062 9.534 33.173 48.522 52.973 108.474 52.973 173.049 0 0.735-0.003 1.469-0.008 2.203 0.319 11.927 0.501 26.1 0.501 40.317 0 51.28-2.361 102.009-6.982 152.083-3.832 61.431-43.719 131.186-103.212 176.534-33.71 26.441-75.921 42.117-121.793 42.117-51.63 0-98.622-19.858-133.754-52.353-59.034-54.74-96.017-132.976-96.090-219.851-1.412-44.858 0-89.878 0-134.722-0.011-0.992-0.017-2.164-0.017-3.337 0-42.177 8.042-82.475 22.677-119.446 31.895-82.723 109.754-169.41 226.985-158.817 10.417 0.883 20.657 3.708 33.368 6.003-26.659 40.96-57.732 69.385-103.283 79.095-4.557 1.173-8.784 5.253-10.387 10.481-0.912 24.477-0.030 49.017-0.030 73.382-0.027 0.266-0.043 0.574-0.043 0.886 0 5.070 4.11 9.181 9.181 9.181 0.64 0 1.265-0.065 1.868-0.19 4.087 0.251 8.936 0.389 13.818 0.389 42.722 0 82.986-10.523 118.342-29.118 29.503-15.928 57.751-37.291 89.001-57.771z" />
34
+ <glyph unicode="&#x52;" glyph-name="recycle" d="M0 240.022c3.708 17.655 6.532 35.31 11.299 51.377-7.126-8.74 11.71 43.949 40.441 89.805q27.355 46.14 55.426 93.985l5.12 9.357c-17.655 11.123-33.898 21.539-50.141 33.015 5.822-5.696-10.335 5.639-22.639 20.313-4.919 5.51-7.844 12.605-7.844 20.383 0 9.889 4.727 18.675 12.046 24.219-3.645-1.351 9.614 8.768 24.869 15.010 56.421 23.003 112.387 45.249 168.178 67.494-6.106-1.961 5.043 2.664 16.931 5.336 4.708 1.271 9.284 1.923 14.013 1.923 26.118 0 47.589-19.9 50.077-45.365 0.783-4.665 1.359-11.168 1.428-17.793 0.001-57.978 0.001-116.063 0.001-173.972-0.021-10.077-2.028-20.3-5.67-29.708-4.239-12.323-16.269-21.427-30.425-21.427-3.504 0-6.878 0.558-10.037 1.589 6.52-3.21-10.628 2.488-25.818 11.211-5.909 3.025-11.736 7.615-17.032 11.499l-19.068 12.359c8.284 9.307 1.068 2.312-4.432-5.926q-27.524-46.156-54.89-92.060c-6.004-6.006-17.172-30.182-21.757-56.615-1.298-6.087-1.965-11.997-1.965-18.063 0-36.533 24.174-67.419 57.399-77.535 13.393-5.084 32.907-9.050 53.262-9.677 47.947-1.243 95.616-0.007 143.991-0.007v-127.47c-2.295 0-4.767 0-7.415 0-47.669 0-95.338 0-143.007 0-1.38-0.024-3.009-0.037-4.641-0.037-53.195 0-103.050 14.302-145.929 39.269-40.348 21.217-73.7 67.505-80.455 122.039 0.117 0.52-0.434 3.603-1.382 6.506l0.065 38.965zM529.655 960c8.121-1.766 16.066-3.354 24.011-5.473 41.158-5.964 94.925-41.852 129.257-92.078 26.639-37.158 48.531-76.529 72.365-114.664 5.473-8.651 10.417-17.655 16.066-27.189 17.655 11.652 34.251 23.305 51.553 33.721-3.028-0.505 11.386 7.634 27.317 12.175 3.654 1.177 6.994 1.751 10.469 1.751 13.188 0 24.446-8.262 28.88-19.893 3.479-7.925 5.842-18.24 6.072-29.080 0.001-59.408 0.001-118.729 0.001-178.051-0.015-8.262-1.436-16.972-4.052-25.147-9.543-30.29-39.733-43.179-73.808-30.467-39.548 14.83-78.742 30.543-118.113 45.903-19.597 7.592-39.018 15.183-58.439 23.128-15.99 3.526-29.254 17.061-32.616 34.149-0.057 0.657-0.064 1.101-0.064 1.547 0 17.183 9.899 32.055 24.305 39.223 13.319 9.295 26.737 17.77 40.332 26.774 0.441-0.988-0.304 1.449-1.462 3.635-22.196 36.972-43.382 74.754-67.040 110.948 8.017-6.546-12.692 21.384-39.313 42.065-14.667 12.194-33.179 19.41-53.376 19.41s-38.71-7.216-53.099-19.211c25.271 24.464-12.142-5.895-40.479-43.481 19.652 25.731-1.942 1.266-17.598-26.949l-100.686 59.592c35.31 60.381 75.211 113.699 141.241 141.241-34.894-12.533 6.236 4.964 49.994 15.797l38.282 0.622zM735.868 160.044c7.004-0.482 15.18-0.756 23.42-0.756 23.683 0 46.837 2.267 69.257 6.596 54.391 15.17 80.344 60.543 61.453 116.334 19.88-44.969-1.019 13.112-31.86 64.551-4.156 8.188-10.689 17.899-16.515 29.022l97.633 58.439c0.396 0.012 1.445-0.414 2.31-1.070 30.175-50.13 62.661-99.035 76.255-157.297 4.796-15.802 7.557-33.964 7.557-52.77 0-36.685-10.506-70.915-28.672-99.848-15.944-29.748-59.158-63.651-110.656-76.957-28.747-8.77-62.15-14.028-96.75-14.243-17.768-0.001-34.011-0.001-53.078-0.001 0-17.655 0-33.015 0-49.258-0.026-8.341-1.711-17.96-4.778-26.939-3.703-11.521-14.901-20.166-28.118-20.166-3.391 0-6.65 0.569-9.685 1.617 1.124-1.594-12.643 3.507-24.506 11.276q-79.804 51.514-159.605 103.774c-39.371 25.777-39.018 61.44 0 87.217l149.892 97.633c5.65 3.708 11.123 7.415 17.655 10.593 32.132 17.655 58.262 3.531 59.498-33.545-0.177-17.302-0.706-34.957-0.706-54.201z" />
35
+ <glyph unicode="&#x53;" glyph-name="seo" d="M640 324.32h-151.52v87.84h126.24c8.837 0 16 7.163 16 16v66.080c0 8.837-7.163 16-16 16h-126.24v73.6h150.72c8.837 0 16 7.163 16 16v66.080c0 8.837-7.163 16-16 16h-249.6c-8.837 0-16-7.163-16-16v-423.68c0-8.837 7.163-16 16-16h250.4c8.837 0 16 7.163 16 16v66.080c0 8.837-7.163 16-16 16v0zM295.040 449.12c-27.243 25.69-60.119 44.648-96 55.36-12.16 5.28-22.24 10.24-30.56 14.88-6.525 3.489-12.689 7.616-18.4 12.32-3.204 2.715-5.771 6.102-7.52 9.92-1.675 3.943-2.493 8.197-2.4 12.48-0.196 5.436 0.618 10.861 2.4 16 1.559 4.269 3.952 8.185 7.040 11.52 2.931 2.939 6.485 5.181 10.4 6.56 5.121 1.88 10.545 2.802 16 2.72 5.868 0.144 11.7-0.947 17.12-3.2 4.517-1.996 8.474-5.073 11.52-8.96 3.693-4.755 6.412-10.192 8-16 2.034-7.016 3.004-14.297 2.88-21.6 0-8.837 7.163-16 16-16h80c6.879-0.018 12.999 4.363 15.2 10.88v1.76c0.51 1.55 0.78 3.169 0.8 4.8v4c0.199 18.749-3.337 37.351-10.4 54.72-6.484 17.080-16.394 32.653-29.12 45.76-14.215 13.736-31.172 24.314-49.76 31.040-19.396 6.945-39.88 10.359-60.48 10.080-20.14 0.235-40.186-2.791-59.36-8.96-17.943-5.928-34.569-15.273-48.96-27.52-14.061-11.771-25.321-26.529-32.96-43.2-7.485-16.923-11.25-35.256-11.040-53.76-0.308-17.979 2.842-35.85 9.28-52.64 6.347-15.934 16.381-30.136 29.28-41.44 30.757-24.553 65.881-43.065 103.52-54.56 14.493-5.372 27.766-13.586 39.040-24.16 2.89-3.307 5.069-7.174 6.4-11.36 1.694-5.545 2.504-11.323 2.4-17.12 0.050-5.427-0.76-10.827-2.4-16-1.304-3.972-3.43-7.625-6.24-10.72l11.84-10.72-11.68 10.080c-2.624-2.855-5.926-5.001-9.6-6.24-5.624-1.846-11.523-2.712-17.44-2.56-8.13-0.199-16.237 0.936-24 3.36-5.492 1.716-10.487 4.736-14.56 8.8-4.135 4.554-7.1 10.045-8.64 16-2.43 9.347-3.561 18.984-3.36 28.64 0 8.837-7.163 16-16 16h-81.28c-6.879 0.018-12.999-4.363-15.2-10.88v-1.76c-0.494-1.499-0.764-3.062-0.8-4.64v-4.48c-0.349-21.369 3.794-42.573 12.16-62.24 8.179-18.8 20.875-35.288 36.96-48 32.617-25.906 73.234-39.653 114.88-38.88 20.378 0.054 40.622 3.293 60 9.6 17.592 5.53 33.909 14.504 48 26.4 13.909 11.625 24.873 26.373 32 43.040 7.182 17.558 10.72 36.393 10.4 55.36 0.036 17.877-2.994 35.628-8.96 52.48-5.571 16.093-14.579 30.78-26.4 43.040v0zM996.96 584.64c-7.145 20.974-18.775 40.138-34.080 56.16-14.863 15.548-32.935 27.669-52.96 35.52-42.728 15.595-89.592 15.595-132.32 0-19.961-7.869-37.937-20.053-52.64-35.68-15.124-16.074-26.587-35.233-33.6-56.16-7.557-23.019-11.234-47.135-10.88-71.36v-118.72c-0.368-24.279 3.309-48.449 10.88-71.52 7.046-20.853 18.568-39.912 33.76-55.84 14.748-15.457 32.721-27.475 52.64-35.2 42.865-15.442 89.775-15.442 132.64 0 19.957 7.741 37.978 19.756 52.8 35.2 15.254 15.909 26.832 34.97 33.92 55.84 7.595 23.065 11.272 47.24 10.88 71.52v118.72c0.371 24.291-3.361 48.471-11.040 71.52v0zM794.4 514.080c-0.139 12.101 1.096 24.178 3.68 36 1.741 8.286 5.054 16.162 9.76 23.2 3.551 5.173 8.409 9.314 14.080 12 13.895 5.682 29.465 5.682 43.36 0 5.828-2.793 10.841-7.035 14.56-12.32 4.796-6.91 8.218-14.678 10.080-22.88 2.661-11.864 3.896-24.003 3.68-36.16v-119.68c0.189-12.156-1.046-24.292-3.68-36.16-1.735-8.364-5.106-16.303-9.92-23.36-3.719-5.285-8.732-9.527-14.56-12.32-13.738-5.637-29.142-5.637-42.88 0-5.778 2.728-10.742 6.92-14.4 12.16-4.815 7.115-8.185 15.106-9.92 23.52-2.646 12.029-3.881 24.325-3.68 36.64v119.36h-0.16z" />
36
+ <glyph unicode="&#x54;" glyph-name="trash" horiz-adv-x="796" d="M57.026 903.15c0 0 0 0 0 0 0-31.397 25.452-56.85 56.85-56.85 0.062 0 0.124 0 0.177 0h568.497c0 0 0 0 0 0 31.397 0 56.85 25.452 56.85 56.85s-25.452 56.85-56.85 56.85c0 0 0 0 0 0h-568.506c-31.383-0.099-56.817-25.472-57.017-56.85zM739.585 618.726c31.286 0.099 56.641 25.392 56.84 56.673v57.026c0 0 0 0.001 0 0.001 0 31.397-25.452 56.85-56.85 56.85-0.124 0-0.248 0-0.353-0.001h-681.833c-0.062 0-0.124 0-0.186 0-31.433 0-56.926-25.431-57.026-56.85v-56.85c0-31.397 25.452-56.85 56.85-56.85v-625.523c0 0 0 0 0 0 0-31.53 25.51-57.102 57.026-57.202h568.516c31.457 0.2 56.908 25.713 57.007 57.203v625.523zM170.726 618.726h113.699v-569.026h-113.699v569.026zM341.451 618.726h113.699v-569.026h-113.699v569.026zM512.177 618.726h113.699v-569.026h-113.876v569.026z" />
37
+ <glyph unicode="&#x55;" glyph-name="uptime" horiz-adv-x="1134" d="M57.234 390.583h217.051l164.571-418.011c8.581-21.457 29.195-36.339 53.284-36.339 28.233 0 51.692 20.443 56.381 47.334l119.455 695.199 89.966-250.149c8.129-22.356 29.192-38.034 53.918-38.034 0.009 0 0.018 0 0.026 0h264.593c31.711 0 57.417 25.707 57.417 57.417s-25.707 57.417-57.417 57.417h-223.817l-150.126 416.549c-8.447 21.735-29.2 36.861-53.486 36.861-27.832 0-51.024-19.866-56.17-46.191l-122.207-707.105-103.314 263.497c-8.551 21.544-29.217 36.526-53.389 36.571h-256.006c-31.711 0-57.417-25.707-57.417-57.417s25.707-57.417 57.417-57.417v0z" />
38
+ <glyph unicode="&#x56;" glyph-name="upload" horiz-adv-x="1365" d="M1050.836-64h-749.992c-0.424-0.002-0.925-0.003-1.426-0.003-15.013 0-29.805 0.942-44.322 2.77-117.762 14.242-218.304 105.483-247.147 224.715-3.005 14.041-5.359 25.576-7.949 36.169v69.208c-0.121-0.517 1.417 1.772 2.319 4.359 11.525 110.342 91.606 206.428 199.228 241.984 7.938 1.803 12.284 6.922 12.284 13.057 0 1.006-0.117 1.986-0.338 2.925 0.011 0.63 0.007 1.476 0.007 2.323 0 163.941 132.901 296.842 296.842 296.842 20.495 0 40.506-2.077 59.832-6.032-0.203-0.254 1.768-0.59 3.817-0.59 6.46 0 12.14 3.336 15.413 8.378 26.059 43.611 96.992 96.055 180.393 117.272-11.657-2.522 15.599 5.389 44.039 9.689 10.816 1.059 21.262 1.533 31.817 1.533 18.246 0 36.161-1.416 53.642-4.144 69.441-4.088 148.797-45.322 204.691-107.946 55.785-58.363 89.947-137.21 89.947-224.035 0-13.662-0.846-27.126-2.488-40.343-0.163 0.309-0.348-1.151-0.348-2.653 0-6.791 3.784-12.699 9.359-15.729 68.861-34.597 134.23-117.504 155.763-216.754-1.424 7.797 3.362-11.618 5.916-31.73 1.696-13.937 2.586-28.537 2.586-43.344s-0.889-29.407-2.618-43.748c-15.395-134.38-118.284-249.368-253.362-283.546-10.044-3.904-33.128-8.976-57.16-10.586zM633.468 145.743h146.185c12.397 1.14 22.314 11.010 23.532 23.433l0.009 195.727c0.974 12.508 10.94 22.506 23.448 23.534l97.549 0.006c14.36 0 48.493 0 0 48.728l-195.149 194.913c-6.226 6.256-14.843 10.128-24.364 10.128s-18.139-3.872-24.363-10.127l-195.15-194.914c-49.199-49.199-11.535-48.728 0-48.728h97.457c13.001 0 23.54-10.539 23.54-23.54v-194.913c0.741-13.575 11.929-24.302 25.623-24.302 0.592 0 1.18 0.020 1.763 0.060z" />
39
+ <glyph unicode="&#x57;" glyph-name="world" d="M365.714 18.103c5.976-10.646 28.073-27.415 54.041-35.262 31.188-10.424 66.163-16.318 102.515-16.318 38.771 0 75.977 6.704 110.52 19.015-13.109-5.71 1.945-0.090 15.19 8.16-33.216 43.97-73.627 69.57-128.484 67.193s-103.131-25.783-153.783-42.789zM125.074 219.246c-3.508 4.984-5.606 11.179-5.606 17.865 0 9.726 4.44 18.414 11.404 24.149 7.002 8.637 15.414 15.952 21.631 24.912-4.73-9.278 15.3 15.941 28.060 45.071 11.803 37.763 8.328 48.369-17.82 67.203-1.097 0-2.011 1.829-3.109 2.56-14.538 5.499-40.503 33.064-54.492 66.844-3.657 7.945-7.497 14.527-10.423 21.659-15.909 34.194-29.989 68.206-21.577 108.434 8.298 9.68-1.302 0.041-8.378-11.33 20.448 38.773-2.988 0.547-18.783-41.421-10.326-34.045-15.799-70.328-15.799-107.889s5.474-73.844 15.667-108.095c-0.221-16.144 12.884-49.446 33.481-76.783 3.135-7.668 21.778-23.63 44.121-32.032zM454.217 861.257l1.28-2.194c8.042 10.711 0.704-0.748-8.764-10.044-18.299-15.19-36.584-30.184-54.87-45.361 59.907 40.798 9.274 11.484-33.074-26.82-1.783-2.523-3.062-6.094-3.062-9.964 0-1.683 0.242-3.309 0.693-4.846 2.261-3.854 6.823-6.973 12.148-7.552 0.898-0.057 1.861-0.085 2.832-0.085 6.38 0 12.471 1.238 18.045 3.486q91.104 35.176 180.521 71.382c2.854 1.477 5.345 4.779 6.024 8.702 0.122 0.926 0.186 1.91 0.186 2.909 0 12.725-10.315 23.040-23.040 23.040-1.615 0-3.192-0.166-4.713-0.482-0.754-0.189-1.792-0.313-2.859-0.313-6.948 0-12.673 5.237-13.443 11.979-2.099 5.094-3.315 10.939-3.315 17.068 0 0.45 0.007 0.898 0.020 1.345 0.23 0.933 0.363 2.080 0.363 3.259 0 7.25-5.023 13.327-11.779 14.94 8.614-5.016-0.37 1.021-10.353 5.127-9.261 4.806-26.68 9.694-45.095 10.962-78.148-2.53-171.621-39.469-246.413-98.904 37.597 34.161-25.949-13.059-74.639-72.857l13.606-28.078c4.925-1.539 10.588-2.426 16.458-2.426 9.768 0 18.962 2.455 27 6.781 6.459 3.32 14.452 5.354 22.919 5.354s16.46-2.034 23.515-5.639c-4.164 1.729 1.135-0.895 6.854-2.522 4.053-1.832 8.393-2.851 12.97-2.851 16.663 0 30.171 13.508 30.171 30.171 0 0.137-0.001 0.273-0.003 0.409 0.016-0.566 0.75 3.026 1.083 6.734 0.525 10.233 6.505 19.572 15.231 24.801-11.879-9.884-0.573 0.973 12.66 8.961q56.969 30.067 113.837 59.141c-6.309-2.273 3.829 2.272 14.694 4.98zM503.223 618.789c13.531 6.4 26.514 12.069 39.314 18.286 5.65 2.873 12.322 4.556 19.386 4.556 4.433 0 8.71-0.663 12.74-1.894-1.772 5.663 56.736-14.645 107.651-46.072-11.303 9.775 12.401-6.356 30.666-27.346 12.963-14.089 23.386-30.18 35.272-44.992-6.989 3.404 18.165-26.478 49.745-47.457 10.514-6.811 22.49-10.592 35.348-10.592 3.984 0 7.883 0.363 11.666 1.058 11.396 0.105 20.89 9.701 20.89 21.515 0 4.048-1.114 7.835-3.053 11.072-0.976 1.882-1.581 4.226-1.581 6.711 0 1.416 0.196 2.787 0.563 4.086 2.929 2.032 6.625 3.313 10.621 3.313 0.759 0 1.507-0.046 2.242-0.136 2.334-0.111 7.185-2.578 10.887-6.212 25.231-20.659 50.099-41.688 75.699-61.985 12.069-9.509 21.211-6.949 25.783 7.863 3.369 9.396 5.316 20.237 5.316 31.532 0 0.55-0.005 1.099-0.014 1.647-0.263 42.389-13.256 99.616-36.027 151.584 7.501-12.427-6.079 20.844-26.073 49.278 118.608-161.488 35.527-28.798-71.081 80.907 50.945-50.529 7.397-0.455-45.169 38.030-7.394 5.781-15.317 8.763-23.936 8.763-5.84 0-11.361-1.369-16.258-3.804-12.222-5.39-24.473-11.424-36.359-18.19-16.64-8.046-18.286-7.314-25.234 9.326-1.026 10.748-10.008 19.088-20.939 19.088-5.21 0-9.977-1.894-13.65-5.032-22.28-13.69-43.857-28.867-65.434-43.679-4.895-3.332-8.068-8.878-8.068-15.165 0-2.441 0.478-4.771 1.347-6.9q2.882-8.289 5.259-17.066c1.995-2.751 3.191-6.194 3.191-9.917 0-8.97-6.946-16.319-15.752-16.96-21.084-8.049-42.661-15.546-63.141-24.689 2.909 3.329-14.693-6.197-28.765-19.435-6.227-5.566-10.163-13.695-10.163-22.744 0-6.523 2.045-12.568 5.529-17.53zM593.554 562.834c-20.993 12.338-46.239 19.625-73.188 19.625-1.463 0-2.921-0.021-4.373-0.064-65.067-5.298-106.027-42.966-133.821-97.824-3.271-5.69-5.2-12.511-5.2-19.782 0-12.99 6.157-24.542 15.711-31.897-8.384 4.063 15.818-14.994 43.748-27.058-34.324 12.321 16.004-9.664 69.761-22.946 21.284-3.464 36.121-17.656 39.951-35.897-2.367 6.813 0.391-0.114 2.137-7.433 6.143-39.307 12.36-78.073 18.395-116.838-2.344 10.411 2.408-32.601 10.992-74.213 6.928-25.261 26.676-31.295 52.459-13.924-12.475-9.056 4.526 1.252 18.3 14.826-29.756-26.513 2.517-1.845 27.796 28.806 26.681 35.728 52.647 71.202 77.332 107.408 1.65 7.609 18.879 26.348 40.565 37.757 21.975 7.156 37.189 26.885 37.189 50.166 0 0.718-0.014 1.433-0.043 2.144-0.063 0.2-0.1 0.548-0.1 0.904s0.038 0.703 0.109 1.038c0.586 1.261 0.931 2.772 0.931 4.365 0 4.378-2.608 8.147-6.355 9.838 36.045-26.123 5.795-0.803-28.714 17.572-17.225 5.638-35.937 23.326-45.206 45.89 10.205-22.437 0.183 4.434-14.439 28.168 14.264-22.666 0.548 3.173-17.978 24.763-1.787 2.226-6.771 5.211-12.43 6.305-19.907 4.414-40.204 7.34-59.587 12.643 26.012-9.617-12.883 1.666-48.169 19.14-4.050 0.727-8.367 6.070-8.367 12.422 0 1.803 0.348 3.525 0.981 5.102zM539.977-64h-55.954c2.685-0.476-3.199 1.009-9.304 1.788-65.31 1.008-144.474 24.437-212.994 64.186-120.342 57.945-225.505 193.667-253.256 355.816-4.080 22.553-5.909 42.484-8.469 62.233v55.954c-0.579-3.095 0.961 2.979 1.785 9.279 1.727 81.753 33.964 174.177 87.408 250.693 62.601 105.24 193.094 195.584 345.686 217.516 18.059 2.695 33.601 4.341 49.144 6.17h55.954c-2.808 0.507 3.133-0.994 9.296-1.787 44.675-0.295 103.039-13.054 156.284-35.552 169.597-73.29 274.922-202.57 310.579-387.438 3.84-19.749 5.303-40.046 7.863-60.16v-54.857c0.445 2.562-1.023-3.265-1.789-9.311-0.264-42.76-13.201-101.078-35.915-154.22-75.118-174.938-208.604-281.544-400.055-314.458-15.177-2.56-30.72-3.84-46.263-5.851z" />
40
+ <glyph unicode="&#x58;" glyph-name="pos_middle" d="M0 255.81c0-35.241 28.456-63.81 64.056-63.81h895.888c35.377 0 64.056 28.994 64.056 63.81v384.38c0 35.241-28.456 63.81-64.056 63.81h-895.888c-35.377 0-64.056-28.994-64.056-63.81v-384.38zM0 800c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0 96c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0-32c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32zM0 928c0-17.673 14.476-32 31.769-32h960.462c17.546 0 31.769 14.844 31.769 32 0 17.673-14.476 32-31.769 32h-960.462c-17.546 0-31.769-14.844-31.769-32z" />
41
+ <glyph unicode="&#x59;" glyph-name="pos_footer" d="M0 384.19c0 35.241 28.456 63.81 64.056 63.81h895.888c35.377 0 64.056-28.994 64.056-63.81v-384.38c0-35.241-28.456-63.81-64.056-63.81h-895.888c-35.377 0-64.056 28.994-64.056 63.81v384.38zM0 672c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 800c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 928c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32zM0 544c0 17.673 14.476 32 31.769 32h960.462c17.546 0 31.769-14.844 31.769-32 0-17.673-14.476-32-31.769-32h-960.462c-17.546 0-31.769 14.844-31.769 32z" />
42
+ <glyph unicode="&#x5a;" glyph-name="star" horiz-adv-x="1108" d="M1061.82 608.734h-294.154c-0.215-0.002-0.468-0.003-0.722-0.003-32.971 0-61.217 20.227-73.008 48.949 2.219-5.396-0.573 0.484-2.378 6.781l-86.442 257.146-2.101 6.494c-8.374 19.126-27.135 32.245-48.96 32.245-23.194 0-42.927-14.817-50.25-35.502l-0.115-0.373-87.291-257.862c1.558 5.097-0.132-1.945-2.835-8.46-12.006-28.401-40.045-48.274-72.727-48.274-0.296 0-0.592 0.002-0.887 0.005h-294.682c-25.642-3.248-45.271-24.925-45.271-51.186 0-0.136 0.001-0.272 0.002-0.407 0.027-16.564 8.167-31.293 20.675-40.373l2.628-1.819 229.211-161.021c20.484-13.761 33.881-36.915 34-63.206 0-0.107 0.001-0.211 0.001-0.316 0-6.067-0.767-11.955-2.208-17.572 1.142 2.679-1.008-5.384-4.459-12.715l-86.355-256.883v-1.91c-1.388-4.412-2.187-9.486-2.187-14.747 0-28.061 22.748-50.808 50.808-50.808 0.702 0 1.401 0.014 2.096 0.042-0.047-0.003 0.015-0.004 0.077-0.004 9.536 0 18.494 2.478 26.264 6.826l8.705 6.163 231.885 162.74c12.206 7.704 27.058 12.276 42.977 12.276s30.771-4.572 43.314-12.474c-7.243 4.386 0.917 0.236 7.788-5.423l-0.102 0.082 231.885-162.931c7.777-4.564 17.128-7.259 27.108-7.259 0.073 0 0.145 0 0.218 0 0.221-0.004 0.495-0.006 0.77-0.006 28.12 0 51.003 22.423 51.745 50.364-0.002 5.381-0.911 10.616-2.582 15.497l0.101 2.144-88.055 258.435c1.605-4.417-1.49 2.474-3.341 9.859-1.674 6.132-2.58 12.65-2.58 19.38 0 0.062 0 0.124 0 0.186 0.066 24.265 11.745 45.936 29.802 59.64l6.108 4.338 226.155 158.729 6.303 4.011c11.197 8.706 18.704 22.538 19.1 38.138-0.050 26.51-20.083 48.268-45.805 51.043z" />
43
+ <glyph unicode="&#x61;" glyph-name="lock" d="M568 112h-112l20.8 120c-28.8 12.8-48 41.6-48 75.2 0 46.4 36.8 83.2 83.2 83.2s83.2-36.8 83.2-83.2c0-33.6-19.2-62.4-48-75.2l20.8-120zM624 504h-224v168c0 62.4 51.2 112 112 112s112-49.6 112-112v-168zM736 504v168c0 123.2-100.8 224-224 224s-224-100.8-224-224v-168h-56c-30.4 0-56-25.6-56-56v-392c0-30.4 25.6-56 56-56h560c30.4 0 56 25.6 56 56v392c0 30.4-25.6 56-56 56h-56z" />
44
+ <glyph unicode="&#x62;" glyph-name="book" horiz-adv-x="727" d="M707.467 808.92c-2.704 9.436-9.638 16.489-18.143 19.762-0.335 0.134-0.671 0.263-1.011 0.385-0.338 0.116-0.678 0.224-1.020 0.328-3.334 1.063-6.841 1.586-10.376 1.438-0.732-0.032-1.507-0.048-2.322-0.048-4.964-0.008-11.389 0.645-18.57 2.063-12.594 2.459-27.479 7.227-42.21 13.683-11.060 4.833-22.069 10.603-32.15 16.917-7.561 4.732-14.603 9.77-20.762 14.877-4.621 3.827-8.744 7.693-12.233 11.443-5.247 5.621-9.006 11-11.161 15.356-1.087 2.179-1.496 4.090-1.911 5.683-0.417 1.597-0.265 2.865-0.265 3.929v0.147c0 9.547-4.633 18.687-12.259 24.436-7.624 5.749-17.788 7.537-26.931 4.782l-474.675-143.044c-12.698-3.827-21.469-15.534-21.469-28.795v-666.072c0-10.182 1.798-20.104 4.889-29.476 2.707-8.21 6.395-16.027 10.827-23.458 7.77-13.003 17.797-24.86 29.448-35.633 17.493-16.137 38.693-29.876 62.282-40.397 23.591-10.496 49.603-17.75 76.729-20.243 3.777-0.346 7.663 0.039 11.299 1.119 0.985 0.293 2.247 0.677 3.919 1.192 6.43 1.98 18.749 5.841 35.546 11.126 117.454 36.968 452.335 143.268 452.35 143.274 12.466 3.956 20.976 15.585 20.976 28.664v653.767c0.633 4.15 0.433 8.495-0.798 12.795v0zM542.709 817.019c8.776-5.86 17.982-11.248 27.4-16.17-39.795-11.404-87.554-25.093-135.832-38.936-59.784-17.143-120.357-34.518-167.561-48.078-23.603-6.78-43.863-12.604-59.017-16.971-7.579-2.183-13.88-4.001-18.692-5.395-1.489-0.43-2.812-0.814-4.006-1.161-15.907 1.901-31.585 5.708-46.115 10.997-12.141 4.412-23.481 9.844-33.481 15.902-7.501 4.541-14.245 9.436-20.027 14.452-7.916 6.848-13.95 13.929-17.953 20.448l416.585 125.558c1.54-3.032 3.209-5.977 5.006-8.824 4.783-7.561 10.395-14.531 16.585-21.076 10.842-11.437 23.473-21.618 37.108-30.746v0zM105.647 46.507c-7.508 4.95-14.299 10.286-20.161 15.755-8.803 8.197-15.457 16.72-19.586 24.403-2.075 3.839-3.531 7.454-4.447 10.723-0.916 3.275-1.302 6.188-1.302 8.803v568.871c14.659-10.516 31.171-19.49 48.965-26.74 14.961-6.078 30.833-10.922 47.275-14.275v-610.805c-5.932 1.717-11.765 3.705-17.43 5.962-12.018 4.782-23.302 10.699-33.314 17.302v0zM256.541 40.302c-15.080-4.762-28.58-9.019-40-12.613v609.125c15.947 4.6 40.601 11.481 69.172 19.743v-267.943l83.133 83.765 55.211-27.922v252.161c45.112 12.656 89.321 25.505 129.125 36.914 37.621 10.783 71.111 20.275 94.933 27.1v-596.265c-42.103-13.361-141.164-44.792-237.658-75.363-56.069-17.762-111.271-35.236-153.917-48.702v0z" />
45
+ <glyph unicode="&#x63;" glyph-name="unlock" d="M800 512h-64v160c0 123.2-100.8 224-224 224s-224-100.8-224-224c0 0 0-40 0-48s8-16 16-16 72 0 80 0c8 0 16 8 16 16s0 48 0 48c0 62.4 51.2 112 112 112 62.4 0 112-49.6 112-112v-160h-400c-30.4 0-48-17.6-48-48v-408c0-30.4 25.6-56 56-56h560c30.4 0 56 25.6 56 56v408c0 30.4-17.6 48-48 48zM547.2 232l20.8-120h-112l20.8 120c-28.8 12.8-48 41.6-48 75.2 0 46.4 36.8 83.2 83.2 83.2s83.2-36.8 83.2-83.2c0-32-19.2-60.8-48-75.2z" />
46
+ <glyph unicode="&#x64;" glyph-name="plugin" d="M272 736c16 16 544-512 528-528-65.6-65.6-160-112-272-112-75.2 0-164.8 0-224 0-12.8 0-24-4.8-32-12.8-20.8-17.6-38.4-38.4-59.2-57.6-35.2-33.6-86.4-33.6-120 0-35.2 33.6-35.2 84.8-1.6 121.6 17.6 19.2 38.4 36.8 56 57.6 8 9.6 12.8 22.4 12.8 35.2 0 67.2 0 139.2 0 224 0 112 48 208 112 272zM785.6 353.6c-16-16-128 96-112 112s139.2 137.6 176 174.4c33.6 33.6 144-80 112-110.4-59.2-59.2-116.8-116.8-176-176zM545.6 593.6c-16-16-128 96-112 112s139.2 137.6 176 174.4c33.6 33.6 144-80 112-110.4-59.2-59.2-116.8-116.8-176-176z" />
47
+ <glyph unicode="&#x65;" glyph-name="caret_down" d="M779.2 508.8l-204.8-204.8c-14.4-14.4-32-32-62.4-32s-49.6 17.6-62.4 32l-204.8 204.8c-27.2 27.2-27.2 67.2 0 94.4s67.2 27.2 94.4 0l172.8-172.8 172.8 172.8c27.2 27.2 67.2 27.2 94.4 0s27.2-67.2 0-94.4z" />
48
+ <glyph unicode="&#x66;" glyph-name="power" d="M848 726.4c-16 20.8-46.4 24-67.2 6.4-20.8-16-24-46.4-6.4-67.2v0c48-59.2 75.2-131.2 75.2-212.8 0-92.8-38.4-177.6-99.2-238.4s-145.6-99.2-238.4-99.2c-92.8 0-177.6 38.4-238.4 99.2s-99.2 145.6-99.2 238.4c0 80 27.2 153.6 75.2 212.8 16 20.8 12.8 49.6-6.4 67.2-20.8 16-49.6 12.8-67.2-6.4-60.8-75.2-96-169.6-96-272 0-118.4 48-227.2 126.4-305.6s185.6-126.4 305.6-126.4c118.4 0 227.2 48 305.6 126.4s126.4 187.2 126.4 307.2c0 102.4-35.2 196.8-96 270.4zM512 398.4c27.2 0 48 20.8 48 48v384c0 27.2-20.8 48-48 48s-48-20.8-48-48v-384c0-27.2 20.8-48 48-48z" />
49
+ <glyph unicode="&#x67;" glyph-name="radio_checked" d="M512 896c-248 0-448-200-448-448s200-448 448-448 448 200 448 448-200 448-448 448zM720 496l-176-176c-3.2-3.2-28.8-32-64-32s-60.8 28.8-64 32l-112 112c-16 16-16 48 0 64s48 14.4 64-1.6l112-110.4 176 176c16 16 48 16 64 0s16-48 0-64z" />
50
+ <glyph unicode="&#x68;" glyph-name="radio_default, radio" d="M512 803.2c195.2 0 355.2-158.4 355.2-355.2s-160-355.2-355.2-355.2-355.2 160-355.2 355.2 160 355.2 355.2 355.2zM512 896c-248 0-448-200-448-448s200-448 448-448 448 200 448 448-200 448-448 448z" />
51
+ <glyph unicode="&#x69;" glyph-name="download_alt" d="M753.6 112c-174.4 0-318.4 0-492.8 0-16 0-27.2 1.6-28.8 1.6-80 11.2-145.6 70.4-163.2 150.4-1.6 8-3.2 14.4-4.8 22.4 0 14.4 0 30.4 0 44.8 0 1.6 1.6 1.6 1.6 3.2 12.8 78.4 57.6 131.2 132.8 160 6.4 1.6 6.4 4.8 6.4 9.6-1.6 123.2 112 217.6 233.6 193.6 6.4-1.6 9.6 0 14.4 4.8 32 38.4 72 64 120 76.8 9.6 1.6 19.2 4.8 28.8 6.4 25.6 3.2 52.8-1.6 54.4-1.6 54.4-8 99.2-30.4 136-70.4 44.8-49.6 64-105.6 57.6-172.8 0-6.4 1.6-9.6 6.4-12.8 54.4-33.6 88-81.6 102.4-144 1.6-8 3.2-12.8 3.2-20.8 3.2-28.8 0-54.4 0-56-12.8-91.2-78.4-164.8-168-188.8-12.8-3.2-27.2-6.4-40-6.4zM560 560c-32 0-73.6 0-96 0-8 0-16-8-16-16 0-43.2 0-84.8 0-128 0-9.6-8-16-16-16-27.2 0-38.4 0-64 0-9.6 0-32 0 0-32 44.8-44.8 84.8-84.8 128-128 8-8 22.4-9.6 32 0 43.2 43.2 84.8 84.8 128 128 32 32 8 32 0 32-16 0-48 0-64 0-9.6 0-16 8-16 16 0 48 0 80 0 128 0 9.6-8 16-16 16z" />
52
+ <glyph unicode="&#x6a;" glyph-name="rocket" d="M603.2 182.4c-36.8-36.8-148.8-36.8-184 0-19.2 19.2-35.2 0-35.2-19.2 0-33.6 0-78.4 0-112 0-19.2 17.6-36.8 36.8-19.2 11.2 11.2 24 24 36.8 36.8 11.2-27.2 25.6-64 36.8-92.8 9.6-24 27.2-24 36.8 0 9.6 25.6 27.2 70.4 36.8 92.8 9.6-9.6 17.6-17.6 36.8-36.8 17.6-17.6 36.8 0 36.8 19.2 0 32 0 78.4 0 112-1.6 19.2-19.2 38.4-38.4 19.2zM800 419.2c-19.2 19.2-80 60.8-80 80 0 168-51.2 307.2-144 400-52.8 52.8-76.8 51.2-128 0-92.8-92.8-144-232-144-400 0-17.6-62.4-62.4-80-80-36.8-36.8-32-76.8-32-96 0-56 25.6-140.8 32-160 11.2-36.8 60.8-35.2 80-16 36.8 36.8 83.2 83.2 96 96 56-56 168-56 224 0 12.8-12.8 59.2-59.2 96-96 19.2-19.2 70.4-20.8 80 16 4.8 19.2 32 104 32 160 0 19.2 4.8 59.2-32 96zM512 534.4c-52.8 0-96 43.2-96 96s43.2 96 96 96c51.2 0 96-44.8 96-96 0-49.6-43.2-96-96-96zM560 630.4c0-26.51-21.49-48-48-48s-48 21.49-48 48c0 26.51 21.49 48 48 48s48-21.49 48-48z" />
53
+ <glyph unicode="&#x6b;" glyph-name="search" d="M923.2 137.6l-228.8 230.4c33.6 52.8 52.8 112 52.8 179.2-1.6 184-150.4 332.8-334.4 332.8s-332.8-148.8-332.8-332.8 148.8-332.8 332.8-332.8c67.2 0 126.4 19.2 179.2 52.8l230.4-230.4c28.8-28.8 73.6-28.8 100.8 0s27.2 73.6 0 100.8zM174.4 547.2c0 131.2 105.6 238.4 238.4 238.4s238.4-105.6 238.4-238.4-107.2-236.8-238.4-236.8-238.4 105.6-238.4 236.8z" />
54
+ <glyph unicode="&#x6c;" glyph-name="theme" d="M336 704c113.6-113.6 224-224 336-336 16-16 16-33.6 0-48-24-24-57.6-57.6-80-80-16-16-32-16-48 0-17.6 17.6-62.4 62.4-80 80-30.4 28.8-51.2 12.8-64 0-16-16-80-128-160-208-81.6-81.6-152-104-208-48s-33.6 126.4 48 208c80 80 192 144 208 160s32 32 0 64c-19.2 19.2-60.8 60.8-80 80-16 16-16 32 0 48 24 24 56 56 80 80 16 16 32 17.6 48 0zM384 800c17.6 17.6 36.8 35.2 56 52.8 27.2 25.6 62.4 19.2 94.4 16 44.8-4.8 84.8-24 121.6-51.2 32-25.6 64-52.8 99.2-75.2 81.6-54.4 169.6-92.8 268.8-73.6-80-80-176-172.8-256-252.8-16-16-32-16-48 0-30.4 30.4-310.4 308.8-337.6 336-14.4 14.4-14.4 32 1.6 48z" />
55
+ <glyph unicode="&#x6d;" glyph-name="speach" d="M699.206 589.081h-345.743c-13.632 0-24.696-11.014-24.696-24.696 0-13.632 11.064-24.696 24.696-24.696h345.743c13.632 0 24.696 11.064 24.696 24.696 0 13.682-11.064 24.696-24.696 24.696zM699.206 292.729h-345.743c-13.632 0-24.696-11.014-24.696-24.696 0-13.632 11.064-24.696 24.696-24.696h345.743c13.632 0 24.696 11.064 24.696 24.696 0 13.682-11.064 24.696-24.696 24.696zM699.206 440.905h-345.743c-13.632 0-24.696-11.014-24.696-24.696 0-13.632 11.064-24.696 24.696-24.696h345.743c13.632 0 24.696 11.064 24.696 24.696 0 13.682-11.064 24.696-24.696 24.696zM501.639 931.12c-272.742 0-493.919-221.226-493.919-493.919 0-109.897 35.908-211.447 96.611-293.437l-51.318-177.218 175.983 58.727c78.089-51.911 171.884-81.991 272.643-81.991 272.742 0 493.919 221.078 493.919 493.919 0 272.693-221.177 493.919-493.919 493.919v0zM501.639 42.065c-78.138 0-153.461 22.671-217.917 65.494-16.398 10.916-35.463 16.497-54.726 16.497-9.681 0-19.362-1.432-28.845-4.297 7.162 28.598 1.185 59.023-16.398 82.781-50.528 68.21-77.249 149.312-77.249 234.661 0 217.868 177.268 395.135 395.135 395.135s395.135-177.268 395.135-395.135c0-217.868-177.268-395.135-395.135-395.135v0z" />
56
+ <glyph unicode="&#x6e;" glyph-name="support" horiz-adv-x="847" d="M504.231 4.118c22.087 9.699 42.18 20.276 60.268 31.085 39.815 23.797 69.925 48.698 90.442 68.056 1.536-0.142 3.092-0.214 4.664-0.214 27.658 0 50.078 22.421 50.078 50.078v206.037c0 27.658-22.421 50.078-50.078 50.078s-50.078-22.421-50.078-50.078v-200.346c-6.829-6.618-15.244-14.275-25.222-22.478-15.543-12.784-34.873-26.902-57.905-40.556-14.759-8.751-31.036-17.312-48.824-25.227-11.141 4.622-23.975 5.258-36.212 0.833-16.277-5.886-33.641-11.126-52.114-15.437-26.934-6.284-43.674-33.213-37.388-60.147 6.284-26.934 33.213-43.674 60.147-37.388 22.439 5.235 43.588 11.614 63.421 18.787 13.406 4.849 23.478 14.826 28.803 26.918zM101.589 257.573v277.577c0.007 42.612 8.608 82.95 24.154 119.726 23.312 55.141 62.386 102.213 111.51 135.39 24.558 16.59 51.606 29.709 80.464 38.686 28.862 8.974 59.532 13.819 91.496 13.822 42.612-0.007 82.948-8.608 119.726-24.154 55.141-23.312 102.213-62.386 135.39-111.51 16.59-24.558 29.709-51.605 38.686-80.463 8.974-28.864 13.819-59.533 13.822-91.497v-277.577c0-27.658 22.421-50.078 50.078-50.078s50.078 22.421 50.078 50.078v277.577c0.007 56.165-11.411 109.929-32.066 158.743-30.991 73.243-82.631 135.406-147.685 179.366-32.532 21.979-68.44 39.405-106.787 51.33-38.341 11.929-79.124 18.344-121.243 18.342-56.165 0.007-109.929-11.411-158.743-32.066-73.243-30.991-135.406-82.629-179.366-147.685-21.977-32.532-39.405-68.44-51.33-106.787-11.929-38.34-18.344-79.124-18.342-121.243v-277.577c0-27.658 22.421-50.078 50.078-50.078s50.078 22.421 50.078 50.078zM108.743 357.729v-206.037c0-27.658 22.421-50.078 50.078-50.078s50.078 22.421 50.078 50.078v206.037c0 27.658-22.421 50.078-50.078 50.078s-50.078-22.421-50.078-50.078z" />
57
+ <glyph unicode="&#x6f;" glyph-name="edit" d="M380.8 412.8l96-96c6.4-6.4 17.6-6.4 24 4.8l315.2 313.6c6.4 1.6 6.4 12.8 0 19.2l-96 96c-6.4 6.4-17.6 6.4-24 0l-315.2-313.6c-6.4-6.4-6.4-17.6 0-24zM345.6 390.4l-3.2-3.2-1.6-3.2-46.4-136-1.6-3.2c-1.6-4.8 0-8 3.2-11.2s8-4.8 11.2-3.2l3.2 1.6 136 46.4 3.2 1.6 3.2 3.2c4.8 4.8 4.8 12.8 0 17.6l-91.2 91.2c-3.2 3.2-11.2 3.2-16-1.6zM916.8 787.2l-65.6 65.6c-14.4 14.4-40 14.4-54.4 0l-56-56c-6.4-6.4-6.4-17.6 0-24l96-96c6.4-6.4 17.6-6.4 24 0l56 56c14.4 14.4 14.4 40 0 54.4zM832 528c-24 0-48-24-48-48v-361.6l-592-6.4v608h352c24 0 48 24 48 48s-24 48-48 48h-400c-24 0-48-24-48-48v-704c0-24 24-48 48-48h688c25.6 0 48 22.4 48 48 0 4.8 0 416 0 416 0 24-24 48-48 48z" />
58
+ <glyph unicode="&#x70;" glyph-name="info" d="M512 800c195.2 0 352-156.8 352-352s-156.8-352-352-352-352 156.8-352 352 156.8 352 352 352zM512 896c-248 0-448-200-448-448s200-448 448-448 448 200 448 448-200 448-448 448zM523.2 396.8c0-11.2 6.4-19.2 6.4-30.4 0-14.4-11.2-28.8-27.2-28.8-27.2 0-41.6 41.6-41.6 64 0 92.8 121.6 102.4 121.6 174.4 0 33.6-24 62.4-76.8 62.4-36.8 0-65.6-14.4-88-36.8-6.4-4.8-12.8-8-20.8-8-16 0-30.4 14.4-30.4 32 0 6.4 1.6 14.4 6.4 19.2 32 38.4 84.8 59.2 139.2 59.2 88 0 142.4-51.2 142.4-116.8 1.6-110.4-131.2-120-131.2-190.4zM508.8 192c-24 0-44.8 20.8-44.8 46.4 0 24 19.2 46.4 44.8 46.4 24 0 44.8-22.4 44.8-46.4-1.6-25.6-22.4-46.4-44.8-46.4z" />
59
+ <glyph unicode="&#x71;" glyph-name="badge" d="M683.2 276.8l-163.2 113.6-163.2-113.6 65.6 179.2-131.2 97.6h163.2l65.6 179.2 65.6-179.2h163.2l-131.2-97.6 65.6-179.2zM912 374.4c0 65.6-19.2 97.6-32 131.2-12.8 35.2-24 64-32 81.6-28.8 65.6 0 131.2 16 147.2s32 32 49.6 49.6c-19.2 20.8-62.4 59.2-81.6 81.6-33.6-16-81.6-32-147.2-32s-132.8 33.6-163.2 65.6c-33.6-35.2-116.8-67.2-180.8-67.2-67.2 0-99.2 14.4-131.2 32-17.6-17.6-54.4-54.4-81.6-81.6 12.8-12.8 30.4-30.4 49.6-49.6 16-16 44.8-97.6 16-147.2-9.6-16-32-51.2-49.6-81.6-16-32-32-65.6-32-131.2s32-168 97.6-212.8c49.6-32 131.2-32 179.2-49.6 49.6-16 113.6-81.6 131.2-113.6 16 32 83.2 97.6 131.2 113.6 49.6 17.6 131.2 16 179.2 49.6 70.4 49.6 81.6 148.8 81.6 214.4z" />
60
+ <glyph unicode="&#x72;" glyph-name="caret_up" d="M779.2 292.8c-27.2-27.2-67.2-27.2-94.4 0l-172.8 172.8-172.8-172.8c-27.2-27.2-67.2-27.2-94.4 0s-27.2 67.2 0 94.4l204.8 204.8c14.4 14.4 32 32 62.4 32s49.6-17.6 62.4-32l204.8-204.8c27.2-27.2 27.2-67.2 0-94.4z" />
61
+ <glyph unicode="&#x73;" glyph-name="options" d="M224 448c0-61.856-50.144-112-112-112s-112 50.144-112 112c0 61.856 50.144 112 112 112s112-50.144 112-112zM624 448c0-61.856-50.144-112-112-112s-112 50.144-112 112c0 61.856 50.144 112 112 112s112-50.144 112-112zM1024 448c0-61.856-50.144-112-112-112s-112 50.144-112 112c0 61.856 50.144 112 112 112s112-50.144 112-112z" />
62
+ <glyph unicode="&#x74;" glyph-name="cog" d="M740.8 448v0c0-25.6-4.8-51.2-12.8-75.2-3.2-9.6-6.4-17.6-11.2-25.6-11.2-22.4-25.6-43.2-43.2-60.8s-38.4-32-60.8-44.8c-8-4.8-17.6-8-25.6-11.2-24-8-48-12.8-75.2-12.8v0c-25.6 0-51.2 4.8-73.6 12.8-9.6 3.2-17.6 6.4-27.2 11.2-22.4 11.2-43.2 25.6-60.8 43.2s-33.6 38.4-44.8 60.8c-4.8 8-8 17.6-11.2 27.2-8 24-12.8 48-12.8 73.6s4.8 51.2 12.8 75.2c3.2 9.6 6.4 17.6 11.2 27.2 11.2 22.4 25.6 43.2 44.8 60.8 17.6 17.6 38.4 32 60.8 43.2 8 4.8 17.6 8 27.2 11.2 24 8 48 12.8 73.6 12.8v0c25.6 0 51.2-4.8 75.2-12.8 9.6-3.2 17.6-6.4 25.6-11.2 22.4-11.2 43.2-25.6 60.8-44.8 17.6-17.6 32-38.4 43.2-60.8 4.8-8 8-17.6 11.2-25.6 8-22.4 12.8-48 12.8-73.6v0 0zM958.4 489.6v0c-1.6 17.6-16 32-33.6 33.6h-20.8c-22.4 0-41.6 12.8-49.6 30.4-1.6 4.8-3.2 9.6-4.8 14.4-4.8 11.2-9.6 22.4-14.4 33.6v0c-3.2 3.2-4.8 8-6.4 12.8v0c-1.6 6.4-3.2 12.8-3.2 19.2 0 16 6.4 28.8 16 40v0l11.2 11.2c12.8 14.4 14.4 35.2 1.6 49.6v0c-8 11.2-17.6 20.8-27.2 30.4s-20.8 19.2-30.4 28.8v0c-12.8 11.2-32 11.2-44.8 1.6l-8-8-8-9.6c-16-16-40-20.8-60.8-12.8-3.2 1.6-4.8 3.2-8 3.2-12.8 6.4-25.6 11.2-40 16-3.2 0-4.8 1.6-6.4 1.6v0c-6.4 3.2-12.8 6.4-19.2 12.8-9.6 9.6-14.4 20.8-16 32 0 4.8 0 9.6 0 14.4v12.8c0 17.6-12.8 33.6-30.4 36.8-1.6 0-4.8 0-6.4 0v0c-11.2 1.6-24 1.6-36.8 1.6s-25.6 0-36.8-1.6v0c-1.6 0-4.8 0-6.4 0-17.6-3.2-30.4-17.6-30.4-36.8v-16c0-24-14.4-44.8-36.8-52.8-1.6 0-3.2-1.6-4.8-1.6-14.4-4.8-28.8-11.2-43.2-17.6v0c-1.6 0-1.6-1.6-3.2-1.6-6.4-3.2-14.4-4.8-24-4.8-16 0-28.8 6.4-40 16v0l-11.2 11.2c-12.8 12.8-33.6 14.4-48 4.8-1.6-1.6-3.2-3.2-4.8-4.8v0c-9.6-8-19.2-16-27.2-25.6-9.6-8-17.6-17.6-25.6-27.2v0c-1.6-1.6-3.2-3.2-4.8-4.8-9.6-14.4-8-35.2 4.8-48l11.2-11.2c17.6-17.6 20.8-41.6 11.2-62.4 0-1.6-1.6-3.2-1.6-3.2-6.4-14.4-12.8-28.8-17.6-43.2 0-1.6-1.6-3.2-1.6-4.8v0c-3.2-6.4-6.4-14.4-12.8-19.2-11.2-11.2-25.6-16-40-16v0h-16c-17.6 0-33.6-12.8-36.8-30.4 0-1.6 0-4.8 0-6.4-1.6-14.4-1.6-27.2-1.6-40v0 0c0-12.8 0-24 1.6-36.8v0c0-1.6 0-4.8 0-6.4 3.2-17.6 17.6-30.4 36.8-30.4v0h16c24 0 44.8-14.4 52.8-35.2v0c0-1.6 1.6-3.2 1.6-4.8v0c4.8-14.4 11.2-28.8 17.6-43.2v0c0-1.6 1.6-1.6 1.6-3.2 3.2-6.4 4.8-14.4 4.8-24 0-16-6.4-28.8-16-40v0l-11.2-11.2c-12.8-12.8-14.4-32-4.8-46.4 1.6-1.6 3.2-3.2 4.8-6.4 8-9.6 16-19.2 25.6-27.2 8-8 17.6-17.6 27.2-25.6 1.6-1.6 3.2-3.2 6.4-4.8 12.8-8 30.4-8 43.2 1.6l16 16c17.6 17.6 41.6 20.8 62.4 11.2 1.6 0 1.6-1.6 3.2-1.6v0c14.4-6.4 28.8-12.8 43.2-17.6 1.6 0 3.2-1.6 3.2-1.6 8-3.2 14.4-6.4 20.8-12.8 11.2-11.2 16-25.6 16-40v0-16c0-19.2 14.4-35.2 33.6-36.8v0c14.4-4.8 27.2-4.8 41.6-4.8s27.2 0 41.6 1.6v0c19.2 1.6 33.6 17.6 33.6 36.8v16c0 22.4 12.8 41.6 32 51.2 3.2 1.6 8 3.2 12.8 4.8 12.8 4.8 24 9.6 35.2 14.4 3.2 1.6 6.4 4.8 11.2 4.8 6.4 1.6 12.8 3.2 19.2 3.2 14.4 0 27.2-4.8 36.8-14.4 1.6-1.6 3.2-3.2 4.8-4.8l9.6-9.6c12.8-12.8 33.6-14.4 48-3.2v0c1.6 1.6 1.6 1.6 3.2 3.2 9.6 8 19.2 17.6 28.8 25.6 9.6 9.6 17.6 19.2 25.6 28.8 1.6 1.6 1.6 3.2 3.2 3.2 9.6 14.4 9.6 33.6-3.2 46.4v0l-3.2 3.2-9.6 12.8c-16 16-20.8 41.6-11.2 62.4 1.6 1.6 1.6 3.2 3.2 6.4 6.4 12.8 12.8 27.2 17.6 41.6 0 1.6 1.6 3.2 1.6 6.4 3.2 6.4 6.4 12.8 12.8 19.2 11.2 11.2 25.6 16 40 16v0h16c19.2 0 36.8 16 36.8 35.2v0c1.6 11.2 1.6 24 1.6 36.8 0 14.4 0 27.2-1.6 41.6z" />
63
+ <glyph unicode="&#x75;" glyph-name="cylinder" d="M512 352c-212.8 0-390.4 78.4-416 160 0-20.8 0-108.8 0-108.8 0-92.8 185.6-163.2 416-163.2s416 70.4 416 163.2c0 0 0 91.2 0 108.8-25.6-81.6-203.2-160-416-160zM512 128c-212.8 0-390.4 78.4-416 160 0-27.2 0-105.6 0-105.6 0-92.8 185.6-166.4 416-166.4s416 73.6 416 166.4c0 0 0 94.4 0 105.6-25.6-81.6-203.2-160-416-160zM512 864c-230.4 0-416-73.6-416-160v-80c0-91.2 185.6-160 416-160s416 68.8 416 160v80c0 86.4-185.6 160-416 160z" />
64
+ <glyph unicode="&#x76;" glyph-name="rocket_alt" horiz-adv-x="800" d="M797.496 927.982c0 3.36-0.111 5.277-0.139 5.804-0.472 8.415-4.721 16.135-11.581 21.023-6.86 4.916-15.552 6.443-23.662 4.138-5.388-1.416-162.048-47.823-387.305-306.712-98.062-16.358-160.549-52.878-197.291-97.062-38.908-46.657-47.712-98.701-47.656-135.36 0.028-31.021 6.026-52.044 6.526-53.794 3.166-10.942 12.719-18.857 24.050-19.912 11.359-1.083 22.217 4.916 27.383 15.080l0.361 0.667c2.138 4.138 14.136 26.078 30.549 45.879 2.138 2.611 4.499 4.943 6.776 7.415 0.417-0.305 0.639-0.833 1.083-1.139l91.314-63.931-14.775-56.682c-1.472-5.554 0.667-11.47 5.332-14.802 4.693-3.333 10.942-3.444 15.747-0.305l49.545 32.687 90.258-63.209c0.444-0.305 1.028-0.361 1.5-0.667-6.415-12.331-14.469-24.384-21.551-33.798-4.666-6.249-8.887-11.414-11.886-14.941l-3.471-3.971-0.861-0.972-0.167-0.194c-7.721-8.276-9.637-20.496-4.832-30.743 4.832-10.248 15.469-16.552 26.744-15.913 2.638 0.305 49.406 2.86 98.618 34.132 24.495 15.663 49.462 38.936 67.93 72.262 18.468 33.298 30.16 76.206 30.105 129.722 0 25.828-2.86 54.349-8.693 85.537 151.19 270.636 160.104 428.047 160.049 459.762v0zM636.142 824.31c43.796 32.521 78.455 52.489 102.617 64.625-10.664-80.372-58.487-276.579-265.998-579.486l-84.176 58.932 141.275 200.401c4.416 6.249 2.916 14.913-3.36 19.329s-14.941 2.944-19.357-3.333l-141.303-200.457-84.454 59.126c143.025 199.874 266.776 315.432 354.757 380.862v0zM189.877 458.417c4.666 19.94 13.636 41.213 30.299 61.181 18.774 22.467 48.323 44.379 94.841 60.709-20.94-26.244-42.296-54.155-64.097-84.065-15.774-3.583-29.466-11.164-41.186-19.968-7.248-5.499-13.719-11.609-19.857-17.857v0zM339.123 321.391l3.027 11.692 7.137-4.999-10.164-6.693zM590.596 382.683c-0.028-45.657-9.665-78.4-23.162-102.783-13.691-24.661-31.826-41.297-50.184-52.85 1.722 3.527 3.61 6.887 5.166 10.609 6.304 15.274 11.136 31.938 11.192 50.017 0 3.749-0.278 7.582-0.778 11.442 20.634 30.688 40.075 60.543 57.599 89.12 0.028-1.833 0.167-3.777 0.167-5.554zM213.4 116.935l63.681 90.953c8.804 12.581 5.749 29.882-6.804 38.686-12.581 8.804-29.882 5.749-38.686-6.832l-63.681-90.953c-8.804-12.581-5.749-29.882 6.832-38.686 12.553-8.804 29.882-5.749 38.658 6.832zM326.848 161.703l-127.417-181.989c-8.804-12.553-5.749-29.882 6.832-38.686 12.553-8.804 29.855-5.749 38.658 6.832l127.417 181.989c8.804 12.553 5.749 29.855-6.832 38.658-12.553 8.804-29.882 5.749-38.658-6.804zM171.104 279.594c-12.553 8.804-29.882 5.749-38.658-6.804l-127.417-181.989c-8.804-12.553-5.749-29.882 6.832-38.686 12.553-8.776 29.855-5.749 38.658 6.832l127.417 181.961c8.804 12.581 5.749 29.882-6.832 38.686zM543.218 613.606c7.609-5.304 16.302-7.859 24.911-7.859 13.691 0 27.161 6.443 35.631 18.524 13.775 19.69 9.026 46.768-10.664 60.543-7.582 5.332-16.274 7.887-24.884 7.887-13.719 0-27.189-6.471-35.659-18.552-13.719-19.662-8.998-46.768 10.664-60.543z" />
65
+ <glyph unicode="&#x77;" glyph-name="bell" d="M512 864c-307.2 0-179.2-387.2-336-544 0 0 587.2 0 672 0-148.8 148.8-30.4 544-336 544zM864 272h-704c-35.2 0-64-28.8-64-64s28.8-64 64-64h240c0-62.4 49.6-112 112-112s112 49.6 112 112h240c35.2 0 64 28.8 64 64s-28.8 64-64 64z" />
66
+ <glyph unicode="&#x78;" glyph-name="trophy" d="M716.8 395.2c112 75.2 259.2 168 259.2 388.8 0 32-27.2 48-48 48h-160c-25.6 48-105.6 96-256 96s-230.4-48-256-96h-160c-20.8 0-48-16-48-48 0-220.8 134.4-310.4 248-385.6 92.8-60.8 152-102.4 152-176v-62.4c-81.6-8-160-54.4-160-96 0-51.2 100.8-96 224-96s224 44.8 224 96c0 41.6-81.6 86.4-160 96v64c0 75.2 48 110.4 140.8 171.2zM784 752h112c-12.8-128-86.4-195.2-176-256 28.8 62.4 60.8 144 64 256zM128 752h112c3.2-112 35.2-193.6 64-256-89.6 60.8-163.2 128-176 256zM320 768c0 20.8 51.2 80 192 80s192-59.2 192-80-51.2-80-192-80-192 59.2-192 80z" />
67
+ <glyph unicode="&#x79;" glyph-name="cross" d="M608 448l208 208c28.8 28.8 28.8 67.2 0 96s-67.2 28.8-96 0l-208-208-208 208c-28.8 28.8-67.2 28.8-96 0s-28.8-67.2 0-96l208-208-208-208c-28.8-28.8-28.8-67.2 0-96s67.2-28.8 96 0l208 208 208-208c28.8-28.8 67.2-28.8 96 0s28.8 67.2 0 96l-208 208z" />
68
+ <glyph unicode="&#x7a;" glyph-name="tick" d="M400 292.8l-256 256c-28.8 28.8-83.2 28.8-112 0s-28.8-83.2 0-112l304-304c14.4-14.4 32-32 64-32s49.6 17.6 64 32l528 528c28.8 28.8 28.8 83.2 0 112s-83.2 28.8-112 0l-480-480z" />
69
+ <glyph unicode="&#x7c;" glyph-name="caret_left" d="M572.8 180.8l-204.8 204.8c-14.4 14.4-32 32-32 62.4s17.6 49.6 32 62.4l204.8 204.8c27.2 27.2 67.2 27.2 94.4 0s27.2-67.2 0-94.4l-172.8-172.8 172.8-172.8c27.2-27.2 27.2-67.2 0-94.4s-67.2-27.2-94.4 0z" />
70
+ </font></defs></svg>
includes/admin/shared-ui/font/WPMU-DEV-App-Icons.ttf ADDED
Binary file
includes/admin/shared-ui/font/WPMU-DEV-App-Icons.woff ADDED
Binary file
includes/admin/shared-ui/font/fontawesome-webfont.eot ADDED
Binary file
includes/admin/shared-ui/font/fontawesome-webfont.svg ADDED
@@ -0,0 +1,255 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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">
4
+ <metadata></metadata>
5
+ <defs>
6
+ <font id="FontAwesomeRegular" horiz-adv-x="1843" >
7
+ <font-face units-per-em="2048" ascent="1536" descent="-512" />
8
+ <missing-glyph horiz-adv-x="512" />
9
+ <glyph horiz-adv-x="0" />
10
+ <glyph horiz-adv-x="0" />
11
+ <glyph unicode="&#xd;" horiz-adv-x="512" />
12
+ <glyph unicode=" " horiz-adv-x="512" />
13
+ <glyph unicode="&#x09;" horiz-adv-x="512" />
14
+ <glyph unicode="&#xa0;" horiz-adv-x="512" />
15
+ <glyph unicode="o" horiz-adv-x="1591" />
16
+ <glyph unicode="&#xa8;" horiz-adv-x="2048" />
17
+ <glyph unicode="&#xa9;" horiz-adv-x="2048" />
18
+ <glyph unicode="&#xae;" horiz-adv-x="2048" />
19
+ <glyph unicode="&#xb4;" horiz-adv-x="2048" />
20
+ <glyph unicode="&#xc6;" horiz-adv-x="2048" />
21
+ <glyph unicode="&#xcd;" horiz-adv-x="2048" />
22
+ <glyph unicode="&#x2000;" horiz-adv-x="784" />
23
+ <glyph unicode="&#x2001;" horiz-adv-x="1569" />
24
+ <glyph unicode="&#x2002;" horiz-adv-x="784" />
25
+ <glyph unicode="&#x2003;" horiz-adv-x="1569" />
26
+ <glyph unicode="&#x2004;" horiz-adv-x="523" />
27
+ <glyph unicode="&#x2005;" horiz-adv-x="392" />
28
+ <glyph unicode="&#x2006;" horiz-adv-x="261" />
29
+ <glyph unicode="&#x2007;" horiz-adv-x="261" />
30
+ <glyph unicode="&#x2008;" horiz-adv-x="196" />
31
+ <glyph unicode="&#x2009;" horiz-adv-x="313" />
32
+ <glyph unicode="&#x200a;" horiz-adv-x="87" />
33
+ <glyph unicode="&#x202f;" horiz-adv-x="313" />
34
+ <glyph unicode="&#x203a;" horiz-adv-x="2048" />
35
+ <glyph unicode="&#x205f;" horiz-adv-x="392" />
36
+ <glyph unicode="&#x2122;" horiz-adv-x="2048" />
37
+ <glyph unicode="&#x221e;" horiz-adv-x="2048" />
38
+ <glyph unicode="&#xe000;" horiz-adv-x="1024" d="M0 0z" />
39
+ <glyph unicode="&#xf000;" horiz-adv-x="1536" d="M6 1489q20 47 70 47h1382q51 0 72 -47q20 -47 -17 -84l-610 -610v-641h248q33 0 55.5 -22.5t22.5 -53.5q0 -33 -22.5 -55.5t-55.5 -22.5h-768q-31 0 -53.5 22.5t-22.5 55.5q0 31 22.5 53.5t53.5 22.5h250v641l-610 610q-37 37 -17 84z" />
40
+ <glyph unicode="&#xf001;" horiz-adv-x="1488" d="M0 213q0 57 27.5 103t72.5 77t98.5 47.5t106.5 16.5q25 0 50.5 -4t50.5 -11v779q0 27 16 48t43 29q23 6 99.5 29t178 52.5t215 62.5t211 60.5t164 46t74.5 18.5q35 0 58.5 -23.5t23.5 -58.5v-1028q0 -59 -27.5 -104.5t-73 -76t-99.5 -47t-105 -16.5t-105.5 16.5t-98.5 47 t-71.5 75.5t-27.5 105q0 57 27.5 103t71.5 77t98.5 47t105.5 16q27 0 52.5 -4t49.5 -10v537l-678 -195v-815q0 -59 -27.5 -104.5t-71.5 -76t-98.5 -47t-105.5 -16.5q-53 0 -106.5 16.5t-98.5 47t-72.5 76t-27.5 104.5z" />
41
+ <glyph unicode="&#xf002;" horiz-adv-x="1597" d="M0 901q0 137 52 258t143.5 212t212 143.5t258.5 52.5q137 0 257.5 -52.5t212 -143.5t143.5 -212t52 -258q0 -98 -28.5 -191.5t-81.5 -174.5l358 -359q18 -18 18 -47q0 -16 -18 -43t-45 -53.5t-53.5 -45t-42.5 -18.5q-29 0 -47 19l-359 358q-82 -53 -175 -81.5t-191 -28.5 q-137 0 -258 52t-212.5 143t-143.5 212t-52 258zM266 901q0 -84 32 -156.5t86 -126t127 -85t155 -31.5t154.5 31.5t126.5 85t86 126t32 156.5q0 82 -32 154.5t-86 127t-126.5 86t-154.5 31.5t-155 -31.5t-127 -86t-86 -127t-32 -154.5zM414 901q0 51 19.5 97t54 81t80 54.5 t98.5 19.5q20 0 34.5 -14.5t14.5 -36.5q0 -20 -14.5 -34.5t-34.5 -14.5q-63 0 -107.5 -44t-44.5 -108q0 -20 -14.5 -34.5t-34.5 -14.5q-23 0 -37 14.5t-14 34.5z" />
42
+ <glyph unicode="&#xf003;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 154h1536v852q-31 -31 -58 -50q-106 -80 -212.5 -159.5t-211.5 -163.5q-61 -49 -131.5 -94t-156.5 -45q-82 0 -153 45t-132 94 q-104 84 -211 164t-213 159q-27 18 -57 50v-852zM154 1317q0 -31 14 -65.5t35.5 -66.5t47 -59.5t50.5 -46.5q100 -76 199.5 -150.5t199.5 -152.5q20 -16 48 -37.5t58 -42t59.5 -35t54.5 -14.5h2h2q25 0 54.5 14.5t59 35t57 42t48.5 37.5q100 78 199.5 153t199.5 150 q25 18 50.5 46t47 60t36 66.5t14.5 65.5v65h-1536v-65z" />
43
+ <glyph unicode="&#xf004;" horiz-adv-x="1802" d="M0 1073q0 113 34 205t97.5 155.5t153.5 98.5t202 35q59 0 117 -18.5t110 -48.5t99 -68.5t88 -77.5q39 39 87 77.5t100.5 68.5t109 48.5t115.5 18.5q113 0 204 -35t154.5 -98.5t97 -155.5t33.5 -205q0 -66 -18.5 -130t-51 -124.5t-74.5 -115t-87 -99.5l-615 -612 q-23 -23 -55 -23q-31 0 -57 23l-615 614q-45 45 -87 99.5t-73.5 114t-50 124t-18.5 129.5z" />
44
+ <glyph unicode="&#xf005;" horiz-adv-x="1675" d="M1 959.5q9 27.5 54 33.5l506 74l227 459q20 41 49 41t50 -41l227 -459l506 -74q45 -6 54 -33.5t-23 -60.5l-367 -356l86 -504q8 -45 -15.5 -62.5t-64.5 5.5l-452 237l-453 -237q-41 -23 -64.5 -5.5t-15.5 62.5l86 504l-364 356q-35 33 -26 60.5z" />
45
+ <glyph unicode="&#xf006;" horiz-adv-x="1675" d="M0 948q0 23 18.5 32t36.5 13l506 74l227 459q6 14 20 27.5t30 13.5q18 0 30.5 -13.5t18.5 -27.5l227 -459l506 -74q18 -4 36.5 -13t18.5 -32q0 -14 -7 -26.5t-17 -22.5l-367 -356l86 -504q0 -4 1 -9t1 -12q0 -20 -9 -34.5t-32 -14.5t-41 13l-452 237l-453 -237 q-18 -12 -39 -13q-23 0 -33 14.5t-10 34.5q0 6 1 11.5t1 9.5l86 504l-364 356q-10 10 -18.5 22.5t-8.5 26.5zM289 866l274 -268l-65 -377l340 178l340 -178l-66 377l274 268l-378 56l-170 344l-170 -344z" />
46
+ <glyph unicode="&#xf007;" horiz-adv-x="1566" d="M0 57v387q0 37 18.5 82t48 86t65.5 74t71 43q18 6 66 13.5t102.5 14.5t104.5 13t77 10q-92 59 -144.5 153.5t-52.5 205.5q0 88 34 165.5t91.5 136t135 92.5t165.5 34t166 -34t136.5 -92.5t92 -136t33.5 -165.5q0 -109 -52 -204.5t-144 -154.5q27 -4 77 -10t104 -13 t101 -14.5t68 -13.5q35 -10 70.5 -42t65.5 -74t48.5 -87t18.5 -82v-387q-10 -4 -22.5 -14t-27 -19.5t-27.5 -16.5t-22 -7h-1370q-35 0 -53 21.5t-45 35.5z" />
47
+ <glyph unicode="&#xf008;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM115 154q0 -16 11 -27.5t28 -11.5h153q16 0 27.5 11t11.5 28v153q0 16 -11 27.5t-28 11.5h-153q-16 0 -27.5 -11t-11.5 -28v-153zM115 512 q0 -16 11 -27.5t28 -11.5h153q16 0 27.5 11.5t11.5 27.5v154q0 16 -11 27.5t-28 11.5h-153q-16 0 -27.5 -11.5t-11.5 -27.5v-154zM115 870q0 -16 11 -27.5t28 -11.5h153q16 0 27.5 11.5t11.5 27.5v154q0 16 -11 27.5t-28 11.5h-153q-16 0 -27.5 -11.5t-11.5 -27.5v-154z M115 1229q0 -16 11 -27.5t28 -11.5h153q16 0 27.5 11t11.5 28v153q0 16 -11 27.5t-28 11.5h-153q-16 0 -27.5 -11t-11.5 -28v-153zM461 154q0 -16 11 -27.5t28 -11.5h843q16 0 27.5 11t11.5 28v512q0 16 -11 27.5t-28 11.5h-843q-16 0 -27.5 -11.5t-11.5 -27.5v-512z M461 870q0 -16 11 -27.5t28 -11.5h843q16 0 27.5 11.5t11.5 27.5v512q0 16 -11 27.5t-28 11.5h-843q-16 0 -27.5 -11t-11.5 -28v-512zM1497 154q0 -16 11.5 -27.5t27.5 -11.5h154q16 0 27.5 11t11.5 28v153q0 16 -11.5 27.5t-27.5 11.5h-154q-16 0 -27.5 -11t-11.5 -28v-153 zM1497 512q0 -16 11.5 -27.5t27.5 -11.5h154q16 0 27.5 11.5t11.5 27.5v154q0 16 -11.5 27.5t-27.5 11.5h-154q-16 0 -27.5 -11.5t-11.5 -27.5v-154zM1497 870q0 -16 11.5 -27.5t27.5 -11.5h154q16 0 27.5 11.5t11.5 27.5v154q0 16 -11.5 27.5t-27.5 11.5h-154 q-16 0 -27.5 -11.5t-11.5 -27.5v-154zM1497 1229q0 -16 11.5 -27.5t27.5 -11.5h154q16 0 27.5 11t11.5 28v153q0 16 -11.5 27.5t-27.5 11.5h-154q-16 0 -27.5 -11t-11.5 -28v-153z" />
48
+ <glyph unicode="&#xf009;" d="M0 78v536q0 33 22.5 55.5t55.5 22.5h690q33 0 55.5 -22.5t22.5 -55.5v-536q0 -33 -22.5 -55.5t-55.5 -22.5h-690q-33 0 -55.5 22.5t-22.5 55.5zM0 922v538q0 31 22.5 53.5t55.5 22.5h690q33 0 55.5 -22.5t22.5 -53.5v-538q0 -33 -22.5 -54.5t-55.5 -21.5h-690 q-33 0 -55.5 21.5t-22.5 54.5zM999 78v536q0 33 21.5 55.5t54.5 22.5h692q31 0 53.5 -22.5t22.5 -55.5v-536q0 -33 -22.5 -55.5t-53.5 -22.5h-692q-33 0 -54.5 22.5t-21.5 55.5zM999 922v538q0 31 21.5 53.5t54.5 22.5h692q31 0 53.5 -22.5t22.5 -53.5v-538 q0 -33 -22.5 -54.5t-53.5 -21.5h-692q-33 0 -54.5 21.5t-21.5 54.5z" />
49
+ <glyph unicode="&#xf00a;" d="M0 78v270q0 33 22.5 54.5t55.5 21.5h358q31 0 53.5 -21.5t22.5 -54.5v-270q0 -33 -22.5 -55.5t-53.5 -22.5h-358q-33 0 -55.5 22.5t-22.5 55.5zM0 655v226q0 33 22.5 54t55.5 21h358q31 0 53.5 -21.5t22.5 -53.5v-226q0 -33 -22.5 -55t-53.5 -22h-358q-33 0 -55.5 22.5 t-22.5 54.5zM0 1188v272q0 31 22.5 53.5t55.5 22.5h358q31 0 53.5 -22.5t22.5 -53.5v-272q0 -33 -22.5 -55.5t-53.5 -22.5h-358q-33 0 -55.5 22.5t-22.5 55.5zM666 78v270q0 33 22.5 54.5t54.5 21.5h359q31 0 53.5 -21.5t22.5 -54.5v-270q0 -33 -22.5 -55.5t-53.5 -22.5 h-359q-33 0 -55 22.5t-22 55.5zM666 655v226q0 33 22.5 54t54.5 21h359q31 0 53.5 -21.5t22.5 -53.5v-226q0 -33 -22.5 -55t-53.5 -22h-359q-33 0 -55 22.5t-22 54.5zM666 1188v272q0 31 22.5 53.5t54.5 22.5h359q31 0 53.5 -22.5t22.5 -53.5v-272q0 -33 -22.5 -55.5 t-53.5 -22.5h-359q-33 0 -55 22.5t-22 55.5zM1331 78v270q0 33 22.5 54.5t55.5 21.5h358q31 0 53.5 -21.5t22.5 -54.5v-270q0 -33 -22.5 -55.5t-53.5 -22.5h-358q-33 0 -55.5 22.5t-22.5 55.5zM1331 655v226q0 33 22.5 54t55.5 21h358q31 0 53.5 -21.5t22.5 -53.5v-226 q0 -33 -22.5 -55t-53.5 -22h-358q-33 0 -55.5 22.5t-22.5 54.5zM1331 1188v272q0 31 22.5 53.5t55.5 22.5h358q31 0 53.5 -22.5t22.5 -53.5v-272q0 -33 -22.5 -55.5t-53.5 -22.5h-358q-33 0 -55.5 22.5t-22.5 55.5z" />
50
+ <glyph unicode="&#xf00b;" d="M0 78v270q0 33 22.5 54.5t55.5 21.5h297q31 0 53.5 -21.5t22.5 -54.5v-270q0 -33 -22.5 -55.5t-53.5 -22.5h-297q-33 0 -55.5 22.5t-22.5 55.5zM0 655v226q0 33 22.5 54t55.5 21h297q31 0 53.5 -21.5t22.5 -53.5v-226q0 -33 -22.5 -55t-53.5 -22h-297q-33 0 -55.5 22.5 t-22.5 54.5zM0 1188v272q0 31 22.5 53.5t55.5 22.5h297q31 0 53.5 -22.5t22.5 -53.5v-272q0 -33 -22.5 -55.5t-53.5 -22.5h-297q-33 0 -55.5 22.5t-22.5 55.5zM604 78v270q0 33 22.5 54.5t55.5 21.5h1085q31 0 53.5 -21.5t22.5 -54.5v-270q0 -33 -22.5 -55.5t-53.5 -22.5 h-1085q-33 0 -55.5 22.5t-22.5 55.5zM604 655v226q0 33 22.5 54t55.5 21h1085q31 0 53.5 -21.5t22.5 -53.5v-226q0 -33 -22.5 -55t-53.5 -22h-1085q-33 0 -55.5 22.5t-22.5 54.5zM604 1188v272q0 31 22.5 53.5t55.5 22.5h1085q31 0 53.5 -22.5t22.5 -53.5v-272 q0 -33 -22.5 -55.5t-53.5 -22.5h-1085q-33 0 -55.5 22.5t-22.5 55.5z" />
51
+ <glyph unicode="&#xf00c;" d="M0 732.5q0 33.5 23 55.5l174 175q23 23 56.5 22.5t55.5 -22.5l365 -365q23 -23 56.5 -23t55.5 23l746 745q23 23 56.5 23t56.5 -23l174 -174q23 -23 22.5 -56.5t-22.5 -55.5l-910 -910q-23 -23 -62.5 -39t-72.5 -16h-88q-35 0 -75 16.5t-62 38.5l-526 529 q-23 23 -23 56.5z" />
52
+ <glyph unicode="&#xf00d;" horiz-adv-x="1536" d="M0 192.5q0 38.5 29 67.5l508 510l-508 500q-29 29 -29 67.5t29 67.5l100 100q29 29 68 29t67 -29l504 -504l504 504q29 29 67.5 29t67.5 -29l100 -100q29 -29 29 -68t-29 -67l-508 -510l508 -500q29 -29 29 -66.5t-29 -66.5l-100 -102q-29 -29 -68 -29t-67 29l-504 505 l-506 -505q-29 -29 -66.5 -29t-66.5 29l-100 100q-29 29 -29 67.5z" />
53
+ <glyph unicode="&#xf00e;" horiz-adv-x="1597" d="M0 901q0 137 52 258t143.5 212t212 143.5t258.5 52.5q137 0 259 -52.5t212 -143.5t142 -212t52 -258q0 -102 -28.5 -195.5t-81.5 -170.5l358 -359q18 -18 18 -46t-18 -48l-94 -94q-20 -18 -48 -18.5t-46 18.5l-359 358q-78 -53 -171 -81.5t-195 -28.5q-137 0 -258 52 t-212.5 142t-143.5 211t-52 260zM266 901q0 -84 32 -156.5t86 -126t127 -85t155 -31.5t155.5 31.5t126.5 85t85 126t32 156.5q0 82 -32 154.5t-85 127t-126.5 86t-155.5 31.5t-155 -31.5t-127 -86t-86 -127t-32 -154.5zM399 868v66q0 33 33 33h168v168q0 33 33 32h65 q14 0 24.5 -9t10.5 -23v-168h166q33 0 33 -33v-66q0 -14 -9.5 -24t-23.5 -10h-166v-166q0 -14 -10 -23.5t-25 -9.5h-65q-33 0 -33 33v166h-168q-14 0 -23.5 10t-9.5 24z" />
54
+ <glyph unicode="&#xf010;" horiz-adv-x="1597" d="M0 901q0 137 52 258t143.5 212t212 143.5t258.5 52.5q137 0 259 -52.5t212 -143.5t142 -212t52 -258q0 -102 -28.5 -195.5t-81.5 -170.5l358 -359q18 -18 18 -46t-18 -48l-94 -94q-20 -18 -48 -18.5t-46 18.5l-359 358q-78 -53 -171 -81.5t-195 -28.5q-137 0 -258 52 t-212.5 142t-143.5 211t-52 260zM266 901q0 -84 32 -156.5t86 -126t127 -85t155 -31.5t155.5 31.5t126.5 85t85 126t32 156.5q0 82 -32 154.5t-85 127t-126.5 86t-155.5 31.5t-155 -31.5t-127 -86t-86 -127t-32 -154.5zM399 868v66q0 33 33 33h467q33 0 33 -33v-66 q0 -14 -9.5 -24t-23.5 -10h-467q-14 0 -23.5 10t-9.5 24z" />
55
+ <glyph unicode="&#xf011;" horiz-adv-x="1488" d="M0 713q0 186 86 349t240 267q12 10 28 6q18 -4 25 -16l90 -131q10 -12 6 -27.5t-16 -25.5q-106 -72 -164.5 -182.5t-58.5 -239.5q0 -104 39.5 -197.5t108.5 -162t162 -108.5t197 -40t197.5 40t163.5 108.5t109.5 161.5t39.5 198q0 129 -59 239.5t-164 182.5 q-14 10 -16 24q-4 16 6 29l88 131q10 12 25.5 15t29.5 -5q154 -104 240 -267t86 -349q0 -154 -58.5 -289t-160 -236.5t-237.5 -160t-290 -58.5t-289 58.5t-236 160t-159.5 236.5t-58.5 289zM627 793v704q0 16 11 27.5t28 11.5h157q16 0 27.5 -11.5t11.5 -27.5v-704 q0 -16 -11 -27.5t-28 -11.5h-157q-16 0 -27.5 11t-11.5 28z" />
56
+ <glyph unicode="&#xf012;" d="M0 39v260q0 16 11.5 27.5t27.5 11.5h192q16 0 26.5 -11.5t10.5 -27.5v-260q0 -16 -10 -27.5t-27 -11.5h-192q-39 0 -39 39zM393 39v434q0 16 11.5 27.5t27.5 11.5h193q16 0 26.5 -11.5t10.5 -27.5v-434q0 -16 -10.5 -27.5t-26.5 -11.5h-193q-16 0 -27.5 11.5t-11.5 27.5z M786 39v676q0 16 11.5 27.5t27.5 11.5h193q16 0 27.5 -11.5t11.5 -27.5v-676q0 -16 -11.5 -27.5t-27.5 -11.5h-193q-16 0 -27.5 11.5t-11.5 27.5zM1182 39v995q0 16 10 27.5t27 11.5h192q16 0 27.5 -11t11.5 -28v-995q0 -16 -11.5 -27.5t-27.5 -11.5h-192q-16 0 -26.5 11.5 t-10.5 27.5zM1575 39v1458q0 39 39 39h190q39 0 39 -39v-1458q0 -39 -39 -39h-190q-39 0 -39 39z" />
57
+ <glyph unicode="&#xf013;" horiz-adv-x="1593" d="M0 651v236q0 12 30.5 21.5t68.5 15.5t74 9t48 5q18 61 49 117q-55 82 -120 157l-7 15q0 8 28 38.5t62.5 65.5t66.5 62.5t40 27.5q2 0 26.5 -18.5t54.5 -41t56.5 -43t32.5 -24.5q29 16 58.5 26.5t60.5 20.5q0 12 3 49t9 75t15.5 69t21.5 31h237q14 0 19 -15 q12 -49 17 -103t14 -106q31 -8 59.5 -19t56.5 -28q8 6 34 26.5t55.5 43t53 40t29.5 17.5t37 -27.5t65 -62.5t61.5 -65.5t27.5 -38.5q0 -4 -17.5 -28.5t-39 -53.5t-42 -55.5t-24.5 -32.5q33 -55 51 -123q49 -10 103.5 -13t101.5 -20q16 -4 16 -18v-236q0 -12 -29.5 -21.5 t-68.5 -15.5t-76 -9t-49 -5q-14 -57 -47 -117q55 -82 121 -157l6 -15q0 -8 -27.5 -38.5t-62.5 -65.5t-66.5 -62.5t-40.5 -27.5q-2 0 -26.5 18.5t-54 41t-56 43t-33.5 24.5q-29 -16 -58.5 -27.5t-59.5 -19.5q-2 -12 -5.5 -49.5t-9.5 -76t-14 -69.5t-21 -31h-237q-14 0 -19 17 q-14 49 -19 103t-11 103q-61 18 -117 50q-41 -31 -81 -60.5t-79 -62.5l-12 -4q-6 0 -37 27.5t-64.5 62.5t-61 65.5t-27.5 38.5q0 2 16 26.5t37.5 53.5t42 55.5t26.5 34.5q-33 55 -51 123q-51 10 -104.5 13t-100.5 20q-16 4 -16 18zM557 768q0 -49 18.5 -93t51 -77t77 -52.5 t93.5 -19.5t93 19.5t75.5 52.5t51 77t19.5 93t-19.5 92t-51 76t-75.5 51.5t-93 18.5t-93.5 -18.5t-77 -51.5t-51 -76t-18.5 -92z" />
58
+ <glyph unicode="&#xf014;" horiz-adv-x="1304" d="M0 1175.5v34.5v36t2 36q25 14 71 23.5t98 15.5t102.5 9t78.5 5q-8 82 11.5 128t59.5 68.5t98.5 29t131.5 6.5q55 0 109.5 -3t97.5 -20.5t68.5 -54.5t25.5 -105v-24t-2 -25q29 -2 79 -5t102.5 -9t99.5 -15.5t72 -23.5v-72v-69q-37 -20 -123 -32.5t-185.5 -19t-193.5 -7.5 t-150 -1q-55 0 -150 1t-194.5 7.5t-184.5 18.5t-122 33q-2 16 -2 34.5zM133 154v837q123 -16 244 -21t244 -5h32q129 2 258 6t258 20v-837q0 -63 -44 -108.5t-107 -45.5h-731q-63 0 -108.5 45t-45.5 109zM303 199q0 -16 10.5 -26.5t26.5 -10.5h39q16 0 27.5 10t11.5 27v614 q0 16 -11.5 27.5t-27.5 11.5h-39q-16 0 -26.5 -11.5t-10.5 -27.5v-614zM504 1384q0 -10 1 -22t3 -23q144 2 291 0q0 12 2 23.5t0 21.5v15q-35 10 -74 11t-74 1q-37 0 -75.5 -1t-73.5 -11v-15zM596 199q0 -16 10 -26.5t27 -10.5h39q16 0 27.5 10t11.5 27v614q0 16 -11.5 27.5 t-27.5 11.5h-39q-16 0 -26.5 -11.5t-10.5 -27.5v-614zM887 199q0 -16 11 -26.5t28 -10.5h39q16 0 27.5 10t11.5 27v614q0 16 -11.5 27.5t-27.5 11.5h-39q-16 0 -27.5 -11.5t-11.5 -27.5v-614z" />
59
+ <glyph unicode="&#xf015;" horiz-adv-x="1880" d="M0 809.5q2 15.5 14 26.5l867 710q27 20 59 21q33 0 59 -21l240 -196v102q0 16 11.5 27.5t27.5 11.5h223q16 0 26.5 -11.5t10.5 -27.5v-348l328 -268q12 -10 14 -25.5t-8 -28.5l-45 -53q-10 -14 -29 -14h-65q-16 0 -25 8l-743 608q-25 20 -50 0l-743 -608q-8 -8 -25 -8 h-65q-18 0 -29 14l-45 53q-10 12 -8 27.5zM266 76v622l674 553l674 -553v-622q0 -33 -21.5 -54.5t-54.5 -21.5h-422v498h-352v-498h-422q-33 0 -54.5 21.5t-21.5 54.5z" />
60
+ <glyph unicode="&#xf016;" horiz-adv-x="1228" d="M0 78v1382q0 31 22.5 53.5t55.5 22.5h614q33 0 71 -16.5t60 -38.5l351 -351q23 -23 39 -60.5t16 -70.5v-921q0 -33 -22.5 -55.5t-53.5 -22.5h-1075q-33 0 -55.5 22.5t-22.5 55.5zM154 154h921v692h-459q-31 0 -53 22.5t-22 55.5v458h-387v-1228zM268 326v116h693v-116 h-693zM268 596v115h693v-115h-693zM694 999h381q0 4 -4 13.5t-6 11.5l-350 348q-2 4 -9.5 6t-11.5 4v-383z" />
61
+ <glyph unicode="&#xf017;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177.5 120t-217.5 44q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM635 608v465q0 33 23.5 56.5t56.5 23.5h80q35 0 57 -23.5t22 -56.5v-305h201q33 0 56.5 -23.5t23.5 -56.5v-80q0 -33 -23.5 -56.5t-56.5 -23.5h-360q-33 0 -56.5 23.5 t-23.5 56.5z" />
62
+ <glyph unicode="&#xf018;" d="M2 35l594 1466q6 14 21.5 24.5t31.5 10.5h195l-8 -170h172l-9 170h195q16 0 31.5 -10t21.5 -25l594 -1466q6 -14 -1 -24.5t-23 -10.5h-740l-26 512h-258l-27 -512h-739q-16 0 -23.5 10t-1.5 25zM807 797h229l-20 413h-189z" />
63
+ <glyph unicode="&#xf019;" d="M0 39v614q0 16 11.5 27.5t27.5 11.5h229q16 0 27.5 -11t11.5 -28v-346h1229v346q0 16 11.5 27.5t27.5 11.5h229q16 0 27.5 -11t11.5 -28v-614q0 -39 -39 -39h-1765q-39 0 -39 39zM345.5 944.5q6.5 16.5 39.5 16.5h307v499q0 31 21.5 53.5t54.5 22.5h307q33 0 55.5 -22.5 t22.5 -53.5v-499h307q31 0 37 -16.5t-16 -39.5l-504 -506q-23 -23 -55.5 -22.5t-55.5 22.5l-504 506q-23 23 -16.5 39.5z" />
64
+ <glyph unicode="&#xf01a;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177.5 120t-217.5 44q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM414 743q10 25 37 25h208v358q0 16 11.5 28.5t27.5 12.5h201q16 0 27.5 -12t11.5 -29v-358h209q27 0 37 -25t-10 -43l-347 -346q-14 -10 -28 -10t-29 10l-346 346 q-20 18 -10 43z" />
65
+ <glyph unicode="&#xf01b;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177 120t-218 44t-218.5 -44t-177 -120t-119.5 -177t-44 -218zM414 793q-10 25 10 43l346 346q14 10 29 10q14 0 28 -10l347 -346q20 -18 10 -43t-37 -25h-209v-360q0 -16 -11.5 -27.5t-27.5 -11.5h-201q-16 0 -27.5 11t-11.5 28v360h-208 q-27 0 -37 25z" />
66
+ <glyph unicode="&#xf01c;" d="M0 78v577q0 33 9 76t22 72l284 663q12 29 44 49.5t63 20.5h999q31 0 63 -20.5t44 -49.5l284 -663q12 -29 21.5 -72t9.5 -76v-577q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM238 694h387l114 -231h383l117 231h367q-2 4 -2 9.5t-2 9.5l-256 594 h-848l-256 -596q-2 -2 -2 -7.5t-2 -9.5z" />
67
+ <glyph unicode="&#xf01d;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177.5 120t-217.5 44q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM582 453v628q0 18 16 29q20 8 31 0l545 -315q16 -6 16 -27q0 -20 -16 -27l-545 -315q-8 -4 -15 -4q-8 0 -16 4q-16 10 -16 27z" />
68
+ <glyph unicode="&#xf01e;" horiz-adv-x="1591" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5q141 0 271 -48.5t239 -140.5l161 162q35 35 58.5 24.5t23.5 -57.5v-463q0 -33 -22 -55q-10 -10 -23.5 -16t-29.5 -6h-463q-47 0 -58.5 23.5t23.5 58.5l160 159q-72 57 -159 88t-181 31q-117 0 -218.5 -44t-177 -120 t-119.5 -177t-44 -218t44 -218t119.5 -177t177 -120t218.5 -44q104 0 198.5 37t169 101.5t123.5 153.5t64 191q0 16 14 27q14 10 31 8l157 -20q16 -4 26.5 -16.5t8.5 -28.5q-20 -147 -89.5 -274.5t-176 -220.5t-242 -145.5t-284.5 -52.5q-166 0 -311.5 62.5t-254 171 t-171 254t-62.5 311.5z" />
69
+ <glyph unicode="&#xf021;" horiz-adv-x="1916" d="M6 311l150 437q10 33 39 45t59 4l438 -150q45 -16 46 -40.5t-42 -47.5l-202 -100q53 -78 123.5 -134.5t160.5 -86.5q111 -37 221.5 -28t207 56t170 129t110.5 193q6 16 20.5 22t30.5 2l152 -51q16 -6 23 -20.5t1 -30.5q-53 -158 -159.5 -274.5t-243.5 -184t-296 -81 t-315 39.5q-135 47 -241.5 134t-179.5 208l-205 -100q-43 -23 -63.5 -5.5t-4.5 64.5zM203 1024q53 156 159.5 273.5t243.5 185t295 81t316 -39.5q133 -47 240.5 -134t180.5 -208l205 100q43 23 63.5 5.5t4.5 -62.5l-150 -439q-10 -33 -39 -45t-59 -4l-438 150 q-45 16 -46 40.5t40 47.5l202 100q-51 78 -122.5 134.5t-159.5 86.5q-111 37 -221.5 28t-207 -56t-170 -129t-110.5 -193q-6 -16 -20.5 -22t-30.5 -2l-152 51q-16 6 -23 20.5t-1 30.5z" />
70
+ <glyph unicode="&#xf022;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 154h1536v1075h-1536v-1075zM307 346v76q0 39 39 39h154q16 0 27.5 -11.5t11.5 -27.5v-76q0 -16 -11.5 -27.5t-27.5 -11.5h-154q-39 0 -39 39 zM307 653v76q0 39 39 39h154q16 0 27.5 -11.5t11.5 -27.5v-76q0 -16 -11.5 -27.5t-27.5 -11.5h-154q-39 0 -39 39zM307 961v75q0 39 39 39h154q16 0 27.5 -11t11.5 -28v-75q0 -16 -11.5 -27.5t-27.5 -11.5h-154q-39 0 -39 39zM692 346v76q0 16 10.5 27.5t26.5 11.5h768 q39 0 39 -39v-76q0 -39 -39 -39h-768q-16 0 -26.5 11.5t-10.5 27.5zM692 653v76q0 16 10.5 27.5t26.5 11.5h768q39 0 39 -39v-76q0 -39 -39 -39h-768q-16 0 -26.5 11.5t-10.5 27.5zM692 961v75q0 16 10.5 27.5t26.5 11.5h768q39 0 39 -39v-75q0 -39 -39 -39h-768 q-16 0 -26.5 11t-10.5 28z" />
71
+ <glyph unicode="&#xf023;" horiz-adv-x="1253" d="M0 117v626q0 39 21.5 69t56.5 42v164q0 113 43 213t117.5 175t175 118t213.5 43t213 -43t175 -118t118 -175.5t43 -212.5v-164q35 -12 56 -42t21 -69v-626q0 -47 -34.5 -82t-81.5 -35h-1020q-47 0 -82 35t-35 82zM313 862h627v156q0 66 -24.5 123t-67.5 99t-100.5 66.5 t-120.5 24.5q-66 0 -122 -24.5t-99.5 -66.5t-68 -99.5t-24.5 -122.5v-156zM494 164h266l-66 285q29 18 47.5 48.5t18.5 65.5q0 55 -39 95t-94 40t-94 -40t-39 -95q0 -35 18 -65.5t47 -46.5z" />
72
+ <glyph unicode="&#xf024;" d="M0 1382q0 63 45 108.5t109 45.5q63 0 108 -45.5t45 -108.5q0 -41 -20.5 -74.5t-55.5 -56.5v-1212q0 -16 -11 -27.5t-27 -11.5h-78q-16 0 -26.5 11.5t-10.5 27.5v1212q-35 23 -56.5 56.5t-21.5 74.5zM307 416v745q0 33 19.5 66t48.5 49q104 55 188 86t144 45q70 16 124 18 q68 0 124.5 -11t107.5 -29.5t99 -43t100 -51.5q63 -29 145 -33q70 -4 164 15.5t207 87.5q29 16 47 6t18 -43v-748q0 -31 -18.5 -64.5t-46.5 -49.5q-113 -68 -207 -87.5t-164 -15.5q-82 4 -145 33q-51 27 -99.5 51.5t-99.5 43t-107.5 29.5t-124.5 11q-55 -2 -124 -18 q-59 -14 -143.5 -45t-188.5 -88q-29 -16 -48.5 -4t-19.5 45z" />
73
+ <glyph unicode="&#xf025;" horiz-adv-x="1916" d="M0 729q0 172 85 324.5t221 266.5t307 180.5t345 66.5t345.5 -66.5t307.5 -180.5t221 -266.5t85 -326.5q0 -182 -78 -350l-27 -60l-174 -26q-27 -104 -110.5 -173t-196.5 -69v-41q0 -16 -12 -27.5t-29 -11.5h-80q-16 0 -27.5 11.5t-11.5 27.5v719q0 16 11.5 28.5 t27.5 12.5h80q16 0 28.5 -12.5t12.5 -28.5v-39q88 0 161 -44t114 -116l39 7q33 90 32 192q0 125 -65.5 233.5t-170 190.5t-232.5 129t-251 47t-250.5 -47t-232 -128t-170 -190.5t-65.5 -232.5q0 -104 32 -194l39 -7q41 72 114 116t161 44v39q0 16 12 28.5t29 12.5h80 q16 0 27 -12.5t11 -28.5v-719q0 -16 -11 -27.5t-27 -11.5h-80q-16 0 -28.5 11.5t-12.5 27.5v41q-55 0 -106.5 18.5t-91.5 50.5t-68.5 76t-40.5 97l-175 26l-26 60q-78 168 -78 352z" />
74
+ <glyph unicode="&#xf026;" horiz-adv-x="905" d="M0 578v380q0 16 11.5 27.5t27.5 11.5h420l325 326q49 51 84 37t35 -86v-1012q0 -72 -34.5 -86t-84.5 37l-325 326h-420q-16 0 -27.5 11t-11.5 28z" />
75
+ <glyph unicode="&#xf027;" horiz-adv-x="1277" d="M0 578v380q0 16 11.5 27.5t27.5 11.5h420l325 326q49 51 84 37t35 -86v-1012q0 -72 -34.5 -86t-84.5 37l-325 326h-420q-16 0 -27.5 11t-11.5 28zM1027 406q-9 32 7 61q84 145 84 301t-84 301q-16 29 -7 61t38 48t60.5 8t48.5 -37q104 -182 104 -381q0 -201 -104 -381 q-23 -41 -70 -41q-20 0 -39 12q-29 16 -38 48z" />
76
+ <glyph unicode="&#xf028;" horiz-adv-x="1916" d="M0 578v380q0 16 11.5 27.5t27.5 11.5h420l325 326q49 51 84 37t35 -86v-1012q0 -72 -34.5 -86t-84.5 37l-325 326h-420q-16 0 -27.5 11t-11.5 28zM1027 406q-9 32 7 61q84 145 84 301t-84 301q-16 29 -7 61t38 48t60.5 8t48.5 -37q104 -182 104 -381q0 -201 -104 -381 q-23 -41 -70 -41q-20 0 -39 12q-29 16 -38 48zM1285 219q-7 33 11 62q141 225 142 487q0 262 -142 487q-18 29 -11 62t36 49q29 18 61 11t50 -36q82 -131 123.5 -275t41.5 -298q0 -309 -167 -573q-10 -18 -29 -27.5t-37 -9.5q-25 0 -43 12q-29 16 -36 49zM1540 33 q-6 33 12 59q100 154 152.5 325t52.5 351t-52 351t-153 323q-18 29 -12 61.5t35 50.5q29 16 61 10.5t50 -32.5q115 -174 173 -366.5t58 -397.5t-58.5 -397.5t-172.5 -364.5q-10 -18 -29 -27.5t-37 -9.5q-25 0 -45 13q-29 18 -35 51z" />
77
+ <glyph unicode="&#xf029;" horiz-adv-x="1536" d="M0 0v698h698v-698h-698zM0 838v698h698v-698h-698zM139 139h420v420h-420v-420zM139 977h420v420h-420v-420zM279 279v141h141v-141h-141zM279 1116v139h141v-139h-141zM838 0v698h417v-139h142v139h139v-419h-420v139h-139v-418h-139zM838 838v698h698v-698h-698z M977 977h420v420h-420v-420zM1116 0v139h139v-139h-139zM1116 1116v139h139v-139h-139zM1397 0v139h139v-139h-139z" />
78
+ <glyph unicode="&#xf02a;" d="M0 0v1536h154v-1536h-154zM227 0v1536h37v-1536h-37zM356 0v1536h117v-1536h-117zM545 0v1536h78v-1536h-78zM715 0v1536h76v-1536h-76zM903 0v1536h37v-1536h-37zM1014 0v1536h153v-1536h-153zM1221 0v1536h77v-1536h-77zM1409 0v1536h39v-1536h-39zM1579 0v1536h37 v-1536h-37zM1690 0v1536h153v-1536h-153z" />
79
+ <glyph unicode="&#xf02b;" horiz-adv-x="1488" d="M0 961v454q0 49 35 85t86 36h454q51 0 113 -24.5t94 -61.5l672 -748q33 -39 34 -88t-34 -84l-526 -526q-35 -35 -86 -36t-86 36l-670 750q-35 37 -60.5 96t-25.5 111zM197 1223q0 -49 33.5 -83t82.5 -34t83 34t34 83t-34 82.5t-83 33.5t-82.5 -33.5t-33.5 -82.5z" />
80
+ <glyph unicode="&#xf02c;" horiz-adv-x="1875" d="M0 961v454q0 49 35 85t86 36h454q25 0 53.5 -6t57.5 -18.5t54.5 -28t41.5 -33.5l670 -748q33 -37 34 -86t-34 -84l-526 -524q-35 -35 -86.5 -37t-83.5 37l-670 746q-35 39 -60.5 98t-25.5 109zM195 1223q0 -47 34.5 -82t83.5 -35q47 0 82 35t35 82q0 49 -35 83.5 t-82 34.5q-49 0 -83.5 -34.5t-34.5 -83.5zM791 1534h174q51 0 112.5 -24.5t93.5 -61.5l670 -748q35 -37 35 -87t-35 -85l-524 -524q-35 -35 -86 -36t-86 36l-12 14l514 514q35 35 34.5 84.5t-34.5 85.5l-670 748q-31 35 -84 56.5t-102 27.5z" />
81
+ <glyph unicode="&#xf02d;" horiz-adv-x="1710" d="M10 311q2 16 4 31.5t4 34.5q0 10 -4 20.5t-2 20.5q2 16 15.5 31.5t25.5 35.5q23 37 45.5 90.5t32.5 92.5q4 16 -1 30.5t-1 26.5q4 16 16.5 27.5t20.5 23.5q10 18 21.5 42t21.5 49.5t16 50t8 40.5t-2 33t0 29q6 16 20.5 26.5t24.5 24.5q10 12 21.5 34.5t23 49.5t19.5 52.5 t10 45.5q2 12 -4 24.5t-2 27.5q4 14 18.5 29.5t26.5 31.5q16 25 28.5 58.5t30 61t46 43t77.5 1.5l-2 -4q31 10 54 10h780q78 0 119 -57q41 -53 18 -129l-283 -906q-18 -63 -77.5 -107t-126.5 -44h-893q-10 0 -20.5 -2t-18.5 -12q-12 -20 0 -56q16 -43 60 -75.5t87 -32.5h946 q29 0 57.5 21.5t37.5 47.5l309 987q4 16 5 29.5t-1 28.5q41 -14 61 -43q41 -53 19 -129l-283 -905q-18 -66 -77.5 -109t-127.5 -43h-946q-41 0 -79.5 14.5t-73.5 39t-61.5 58t-41.5 72.5q-25 68 -2 127zM500 961q-10 -39 26 -39h615q16 0 30.5 11t18.5 28l24 75 q4 16 -3 27.5t-23 11.5h-615q-16 0 -31.5 -11t-19.5 -28zM569 1190q-4 -16 3.5 -26.5t23.5 -10.5h614q16 0 30.5 10.5t21.5 26.5l22 78q4 16 -3 27.5t-24 11.5h-614q-16 0 -30.5 -11.5t-20.5 -27.5z" />
82
+ <glyph unicode="&#xf02e;" horiz-adv-x="1253" d="M0 84v1337q0 47 34 81t81 34h1024q47 0 80.5 -34t33.5 -81v-1337q0 -47 -33.5 -81t-80.5 -34t-80 33l-432 432l-432 -432q-33 -33 -80 -33t-81 34t-34 81z" />
83
+ <glyph unicode="&#xf02f;" d="M0 39v346q0 47 18.5 89t50 73t73.5 49t89 18h1383q47 0 89 -18t72.5 -49t49 -73t18.5 -89v-346q0 -39 -39 -39h-1765q-39 0 -39 39zM268 193q0 -16 11.5 -26.5t27.5 -10.5h1229q16 0 27.5 10t11.5 27v38q0 16 -11.5 27.5t-27.5 11.5h-1229q-16 0 -27.5 -11t-11.5 -28v-38 zM307 729v731q0 31 22.5 53.5t55.5 22.5h651v-383q0 -49 34 -83t81 -34h385v-307h-1229zM1151 1153v383l385 -383h-385z" />
84
+ <glyph unicode="&#xf030;" d="M0 115v1075q0 47 34 82t81 35h366l58 125q18 43 66 73.5t95 30.5h443q47 0 95 -30.5t67 -73.5l57 -125h367q47 0 80.5 -35t33.5 -82v-1075q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM442 653q0 -100 38 -187t102.5 -152.5t153 -103.5t186.5 -38t186 38 t152.5 103.5t102.5 152.5t38 187q0 98 -38 186.5t-102.5 153t-152.5 102.5t-186 38t-186.5 -38t-153 -102.5t-102.5 -152.5t-38 -187zM596 653q0 68 25.5 127.5t69.5 103.5t103.5 69.5t127.5 25.5t127 -25.5t103 -69.5t69.5 -103.5t25.5 -127.5t-25.5 -127t-69.5 -104 t-103.5 -70.5t-126.5 -25.5q-68 0 -127.5 25.5t-103.5 70.5t-69.5 104.5t-25.5 126.5z" />
85
+ <glyph unicode="&#xf031;" horiz-adv-x="1644" d="M0 0l2 80q10 4 29.5 8t48.5 8q92 18 108 33q16 10 50 68l233 614l277 725h73h53l11 -20l202 -482q33 -78 64 -151.5t59 -145.5q29 -72 52.5 -130t42.5 -103q12 -29 28.5 -70t36.5 -94q23 -66 64 -150q25 -49 34 -57q20 -18 68 -24q25 -2 49.5 -9.5t52.5 -17.5 q6 -37 7 -55v-10.5t-3 -16.5q-43 0 -90 2t-98 6q-53 4 -99 6t-87 2h-80t-53 -2l-199 -10l-57 -2q0 20 1 39.5t3 38.5l129 26q57 14 67 25q12 8 13 27q0 14 -7 30l-47 115l-90 227l-446 2q-12 -29 -37 -96t-66 -178q-23 -63 -22 -84q0 -27 16 -43q14 -10 40 -17.5t63 -13.5 q14 -4 84 -12v-59q0 -16 -2 -27q-35 0 -121 5t-224 16l-49 -9q-43 -8 -83 -11t-81 -3h-20zM549 655q135 -2 216 -4t105 0l29 2q-18 51 -40.5 111.5t-51.5 130.5t-51.5 122t-38.5 87z" />
86
+ <glyph unicode="&#xf032;" horiz-adv-x="1419" d="M0 0l2 94q27 6 68 12q39 6 69.5 13.5t55.5 17.5q8 14 13 26.5t7 24.5q6 33 8 81t2 112l-2 498q-2 39 -3 139t-5 266q-4 88 -12 109q-4 8 -13 10q-20 14 -69 16q-23 0 -115 13l-4 84l262 6l383 12h45q8 2 15.5 2h13.5t21.5 -1t39.5 -1h76q92 0 193 -27q18 -4 42.5 -13 t53.5 -26q63 -31 104 -75q45 -47 66 -105q10 -29 15 -58.5t5 -62.5q0 -72 -32 -129q-31 -57 -95 -104q-16 -12 -54 -30.5t-97 -47.5q178 -41 268 -145q92 -104 92 -236q0 -72 -28 -162q-23 -66 -72 -116q-66 -72 -141 -109q-78 -35 -205 -59q-70 -12 -199 -11l-199 5 q-63 2 -138 -2.5t-163 -10.5q-25 -2 -93 -4t-181 -6zM537 1419q0 -12 1 -31.5t3 -44.5q2 -51 4 -119.5t0 -158.5v-98v-78q25 -4 52.5 -6t57.5 -2q176 0 267 65q90 66 90 225q0 113 -86 187q-84 76 -258 76q-53 0 -131 -15zM545 457l4 -271q0 -16 10 -43q74 -33 141 -32 q131 0 220 41q82 39 122 112q18 37 28.5 82t10.5 100q0 113 -43 181q-59 94 -141 125q-80 33 -250 32q-37 0 -61.5 -3t-40.5 -7v-143v-174z" />
87
+ <glyph unicode="&#xf033;" horiz-adv-x="1054" d="M0 0l18 84q12 4 32 9t46 11q41 10 71 19.5t50 19.5q29 39 41 103l29 137l57 268l12 64q23 119 41.5 178t18.5 63l30 156l17 64l22 135l9 49v39q-45 23 -148 28q-14 0 -23.5 1.5t-17.5 1.5l21 104l325 -14q31 -2 49.5 -2h26.5q35 0 89 2t132 6q41 4 68.5 6t38.5 2 q-2 -10 -3 -19.5t-3 -19.5q-4 -10 -7.5 -22.5t-7.5 -28.5q-49 -16 -110 -31q-66 -16 -105 -31q-12 -33 -24 -88q-6 -25 -9.5 -45t-5.5 -37q-23 -100 -40 -175.5t-27 -129.5l-64 -311l-39 -158l-43 -235l-14 -45v-10.5t2 -16.5q35 -8 64.5 -13t58.5 -9q4 0 21.5 -2.5 l45.5 -6.5q-2 -18 -3 -32.5t-3 -26.5q-2 -6 -4 -16.5t-6 -22.5q-8 0 -14 -1t-10 -1q-18 -2 -28.5 -2h-14.5h-11.5t-17.5 4q-8 0 -45 4t-105 12l-202 2q-61 0 -181 -12q-39 -4 -63.5 -6t-36.5 -2z" />
88
+ <glyph unicode="&#xf034;" d="M0 1151q14 37 34.5 110.5t45.5 184.5q8 33 13 54.5t9 31.5h58q4 -6 6 -10t4 -9q29 -57 41 -71q16 -4 129 -4q35 0 66.5 1t60.5 1l20 2l113 2l213 -2h289l55 10q10 8 27 53q2 6 4 12.5t6 16.5l43 2h10.5t16.5 -2q2 -39 1 -97.5t1 -138.5v-100v-57q0 -14 -1 -27.5t-3 -23.5 q-20 -8 -37 -11.5t-31 -7.5q-27 51 -53 129q-29 82 -37 92q-12 14 -27 21q-10 4 -60 4h-138h-31t-35 -4q-6 -43 -6 -72l2 -151v-334l2 -359v-147q0 -72 10 -117q8 -4 21.5 -8t34.5 -8q4 0 21 -4t50 -13q27 -10 49 -18q4 -20 4 -33.5v-17.5v-11.5t-2 -17.5h-34q-47 0 -88 2 t-76 6t-95.5 6t-148.5 2q-16 0 -57 -4t-109 -10q-29 -2 -45 -3t-24 -1q0 10 -1.5 16.5t-1.5 10.5l-2 24v10q18 31 80 50q94 27 135 49q4 10 6.5 25.5t4.5 31.5q4 68 6 176.5t0 255.5l-4 428q-2 90 -2 142.5t-4 72.5q0 8 -7 15q-4 6 -12 6q-16 4 -63 4h-127q-90 0 -119 -21 q-41 -29 -121 -153q-23 -35 -35 -35q-23 12 -36 23.5t-19 19.5zM1383 1305.5q-5 13.5 14 33.5l184 185q14 12 33 12q14 0 31 -12l184 -185q18 -20 13 -33.5t-34 -13.5h-118v-1048h118q29 0 34 -13.5t-13 -31.5l-184 -187q-16 -12 -33 -12q-16 0 -31 12l-184 187 q-18 18 -13 31.5t31 13.5h121v1048h-121q-27 0 -32 13.5z" />
89
+ <glyph unicode="&#xf035;" horiz-adv-x="1536" d="M0 233q0 18 12 31l187 185q18 20 31.5 14t13.5 -33v-121h1048v121q0 27 13.5 33t33.5 -14l185 -185q12 -12 12 -31q0 -18 -12 -30l-185 -187q-20 -18 -33.5 -13t-13.5 34v119h-1048v-119q0 -29 -13.5 -34t-31.5 13l-187 187q-12 12 -12 30zM0 1233q14 29 33.5 87 t44.5 146q6 27 11 43.5t9 26.5h56q8 -12 10 -14q27 -47 37 -58q2 0 35.5 -1t77.5 -1h90.5h74.5h123l19 2h108h203h416l53 6q12 10 24 46l4.5 9l6.5 13h39h28v-188v-80v-45q0 -12 -1 -21.5t-3 -19.5q-33 -10 -63 -15q-25 37 -52 103q-27 59 -34 74q-12 10 -27 14q-6 2 -42 3 t-85 1h-103.5h-97.5h-28.5t-34.5 -2q-2 -18 -3 -32.5t-1 -24.5l4 -445l-2 -119q0 -61 12 -92q12 -6 53 -12q4 0 20.5 -4t45.5 -10q14 -4 26.5 -7.5t22.5 -7.5q2 -16 3 -25.5t1 -13.5t-1 -10t-1 -14h-33q-94 0 -157 6q-66 6 -236 6q-14 0 -53 -3t-105 -7q-27 -2 -43 -3 t-24 -1q0 16 -2 20v21v8q20 27 73 39q90 20 132 41q4 8 6 19t4 26q0 18 1 70.5t1 120t-1 142t-2 139t-2 107.5t-1 47q0 8 -6 13q-2 2 -13 6q-14 2 -59 2h-123q-20 0 -62 -1t-85 -2t-78 -4t-41 -7q-41 -25 -117 -123q-20 -29 -33 -29q-23 10 -35 19.5t-18 15.5z" />
90
+ <glyph unicode="&#xf036;" d="M0 78v115q0 31 22.5 53t55.5 22h1689q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM0 500v114q0 33 22.5 55.5t55.5 22.5h1075q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1075 q-33 0 -55.5 22.5t-22.5 55.5zM0 922v114q0 33 22.5 55.5t55.5 22.5h1536q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1536q-33 0 -55.5 21.5t-22.5 54.5zM0 1343v117q0 31 22.5 53.5t55.5 22.5h921q31 0 53.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53 t-53.5 -22h-921q-33 0 -55.5 22.5t-22.5 52.5z" />
91
+ <glyph unicode="&#xf037;" d="M0 78v115q0 31 22.5 53t55.5 22h1689q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM78 922v114q0 33 21.5 55.5t54.5 22.5h1536q33 0 55 -22.5t22 -55.5v-114q0 -33 -22.5 -54.5t-54.5 -21.5h-1536 q-33 0 -54.5 21.5t-21.5 54.5zM307 500v114q0 33 22.5 55.5t55.5 22.5h1075q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1075q-33 0 -55.5 22.5t-22.5 55.5zM385 1343v117q0 31 21.5 53.5t54.5 22.5h921q33 0 55.5 -22.5t22.5 -53.5v-117 q0 -31 -22.5 -53t-55.5 -22h-921q-33 0 -54.5 22.5t-21.5 52.5z" />
92
+ <glyph unicode="&#xf038;" d="M0 78v115q0 31 22.5 53t55.5 22h1689q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM154 922v114q0 33 22.5 55.5t54.5 22.5h1536q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1536 q-33 0 -55 21.5t-22 54.5zM614 500v114q0 33 22.5 55.5t55.5 22.5h1075q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1075q-33 0 -55.5 22.5t-22.5 55.5zM768 1343v117q0 31 22.5 53.5t55.5 22.5h921q31 0 53.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53 t-53.5 -22h-921q-33 0 -55.5 22.5t-22.5 52.5z" />
93
+ <glyph unicode="&#xf039;" d="M0 78v115q0 31 22.5 53t55.5 22h1689q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM0 500v114q0 33 22.5 55.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1689 q-33 0 -55.5 22.5t-22.5 55.5zM0 922v114q0 33 22.5 55.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1689q-33 0 -55.5 21.5t-22.5 54.5zM0 1343v117q0 31 22.5 53.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -53.5v-117 q0 -31 -22.5 -53t-53.5 -22h-1689q-33 0 -55.5 22.5t-22.5 52.5z" />
94
+ <glyph unicode="&#xf03a;" d="M0 78v115q0 31 22.5 53t55.5 22h153q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-153q-33 0 -55.5 22.5t-22.5 55.5zM0 500v114q0 33 22.5 55.5t55.5 22.5h153q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-153 q-33 0 -55.5 22.5t-22.5 55.5zM0 922v114q0 33 22.5 55.5t55.5 22.5h153q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-153q-33 0 -55.5 21.5t-22.5 54.5zM0 1343v117q0 31 22.5 53.5t55.5 22.5h153q31 0 53.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53 t-53.5 -22h-153q-33 0 -55.5 22.5t-22.5 52.5zM461 78v115q0 31 22.5 53t55.5 22h1228q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-1228q-33 0 -55.5 22.5t-22.5 55.5zM461 500v114q0 33 22.5 55.5t55.5 22.5h1228q31 0 53.5 -22.5t22.5 -55.5v-114 q0 -33 -22.5 -55.5t-53.5 -22.5h-1228q-33 0 -55.5 22.5t-22.5 55.5zM461 922v114q0 33 22.5 55.5t55.5 22.5h1228q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1228q-33 0 -55.5 21.5t-22.5 54.5zM461 1343v117q0 31 22.5 53.5t55.5 22.5h1228 q31 0 53.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53t-53.5 -22h-1228q-33 0 -55.5 22.5t-22.5 52.5z" />
95
+ <glyph unicode="&#xf03b;" d="M0 756v75q0 39 39 39h213v154q0 31 16.5 37t38.5 -17l215 -215q16 -16 17 -36q0 -18 -17 -35l-215 -215q-23 -23 -39 -17t-16 39v152h-213q-39 0 -39 39zM614 39v1458q0 39 39 39h76q39 0 39 -39v-1458q0 -39 -39 -39h-76q-39 0 -39 39zM922 78v115q0 31 22.5 53t54.5 22 h768q31 0 53.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-53.5 -22.5h-768q-33 0 -55 22.5t-22 55.5zM922 500v114q0 33 22.5 55.5t54.5 22.5h615q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-615q-33 0 -55 22.5t-22 55.5zM922 922v114 q0 33 22.5 55.5t54.5 22.5h691q33 0 55 -22.5t22 -55.5v-114q0 -33 -22.5 -54.5t-54.5 -21.5h-691q-33 0 -55 21.5t-22 54.5zM922 1343v117q0 31 22.5 53.5t54.5 22.5h537q33 0 55.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53t-55.5 -22h-537q-33 0 -55 22.5t-22 52.5z" />
96
+ <glyph unicode="&#xf03c;" d="M0 78v115q0 31 22.5 53t53.5 22h768q33 0 55.5 -22.5t22.5 -52.5v-115q0 -33 -22.5 -55.5t-55.5 -22.5h-768q-31 0 -53.5 22.5t-22.5 55.5zM0 500v114q0 33 22.5 55.5t53.5 22.5h614q33 0 55.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-55.5 -22.5h-614 q-31 0 -53.5 22.5t-22.5 55.5zM0 922v114q0 33 22.5 55.5t53.5 22.5h692q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-692q-31 0 -53.5 21.5t-22.5 54.5zM0 1343v117q0 31 22.5 53.5t53.5 22.5h538q31 0 53.5 -22.5t22.5 -53.5v-117q0 -31 -22.5 -53 t-53.5 -22h-538q-31 0 -53.5 22.5t-22.5 52.5zM1075 39v1458q0 39 39 39h76q16 0 27.5 -11.5t11.5 -27.5v-1458q0 -16 -11.5 -27.5t-27.5 -11.5h-76q-39 0 -39 39zM1305 743q0 16 14 35l217 215q23 23 38 17t15 -39v-152h215q16 0 27.5 -11t11.5 -28v-75q0 -16 -11 -27.5 t-28 -11.5h-215v-154q0 -31 -15 -38t-38 15l-217 218q-14 18 -14 36z" />
97
+ <glyph unicode="&#xf03d;" d="M0 324v768q0 47 18.5 89t50 72.5t73.5 49t89 18.5h768q47 0 89 -18.5t73 -49t49.5 -72.5t18.5 -89v-240l483 471q23 23 55 23q13 -1 29 -7q47 -20 47 -69v-1127q0 -49 -47 -69q-16 -6 -29 -6q-33 0 -55 22l-483 471v-237q0 -47 -18.5 -89t-49.5 -74t-72.5 -50.5 t-89.5 -18.5h-768q-47 0 -89 18.5t-73.5 50.5t-50 73.5t-18.5 89.5z" />
98
+ <glyph unicode="&#xf03e;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 154h1536v1228h-1536v-1228zM307 307v105l277 360l188 -156l354 537l410 -424v-422h-1229zM307 1073q0 66 45 111t111 45q63 0 108 -45 t45 -111q0 -63 -45 -108t-108 -45q-66 0 -111 45t-45 108z" />
99
+ <glyph unicode="&#xf040;" horiz-adv-x="1536" d="M0 0l137 418l867 866l280 -280l-866 -867zM287 407.5q0 -12.5 10 -22.5q8 -8 22 -8q12 0 21 8l690 690q20 20 0 43q-10 10 -22.5 10t-20.5 -10l-690 -688q-10 -10 -10 -22.5zM1102 1382l119 119q35 35 84 35t84 -35l57 -55l55 -57q35 -35 35 -84.5t-35 -83.5l-119 -119z " />
100
+ <glyph unicode="&#xf041;" horiz-adv-x="1128" d="M0 1001q0 117 44 220.5t121 180.5t180.5 121t219.5 44q117 0 219.5 -44t179 -121t120.5 -180.5t44 -220.5q0 -84 -24.5 -159.5t-65.5 -143.5l-379 -661q-41 -68 -95 -68t-93 68l-381 663q-41 68 -65.5 143t-24.5 158zM285 1001q0 -57 21.5 -108t60.5 -89t89 -59.5 t109 -21.5q57 0 108.5 21.5t89.5 59.5t59.5 89t21.5 108t-21.5 108.5t-59.5 90.5t-89 60.5t-109 21.5q-59 0 -109 -21.5t-89 -60.5t-60.5 -90t-21.5 -109z" />
101
+ <glyph unicode="&#xf042;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44v1118q-117 0 -218.5 -44 t-177 -120t-119.5 -177t-44 -218z" />
102
+ <glyph unicode="&#xf043;" horiz-adv-x="1130" d="M0 535q0 86 23.5 161.5t66.5 141.5q20 33 69.5 99.5t108 154.5t113.5 193.5t90 217.5q10 35 37 51.5t57 12.5q31 4 57.5 -12.5t36.5 -51.5q33 -113 89.5 -218t115 -193t107.5 -154.5t69 -99.5q43 -66 66.5 -141.5t23.5 -161.5q0 -117 -44 -220.5t-120.5 -180.5t-180 -121 t-220.5 -44t-220 44t-180 121t-121 180.5t-44 220.5zM248 410q0 -59 41 -100.5t100 -41.5t100 41t41 101q0 43 -22 75q-6 8 -18.5 24.5t-26.5 39t-28.5 48.5t-22.5 54q-4 20 -23 17q-18 4 -24 -17q-8 -29 -21.5 -54.5t-28 -48t-27 -38.5t-18.5 -25q-23 -33 -22 -75z" />
103
+ <glyph unicode="&#xf044;" d="M0 307v922q0 63 24.5 119.5t65.5 97.5t97.5 65.5t119.5 24.5h1075q4 0 10.5 -1t10.5 -1l-191 -191h-905q-47 0 -80.5 -33.5t-33.5 -80.5v-922q0 -47 33.5 -80.5t80.5 -33.5h1075q47 0 81 33.5t34 80.5v445l193 192v-637q0 -63 -25 -118.5t-67 -97.5t-97 -66.5t-119 -24.5 h-1075q-63 0 -119.5 24.5t-97.5 66.5t-65.5 97.5t-24.5 118.5zM631 324l108 329l652 652l221 -222l-651 -651zM866 629q6 -8 17 -8q10 0 16 8l512 510q18 18 0 35q-18 16 -35 0l-510 -510q-18 -18 0 -35zM1501 1415l92 94q29 29 68 29t65 -29l46 -45l45 -45 q27 -29 27.5 -66.5t-27.5 -66.5l-95 -92z" />
104
+ <glyph unicode="&#xf045;" d="M0 307v922q0 63 24.5 119.5t65.5 97.5t97.5 65.5t119.5 24.5h836q-6 -31 -6 -63v-52q-164 -20 -310 -78h-520q-47 0 -80.5 -33.5t-33.5 -80.5v-922q0 -47 33.5 -80.5t80.5 -33.5h1075q47 0 81 33.5t34 80.5v111q16 10 31.5 21.5t32.5 27.5l129 127v-287q0 -63 -25 -118.5 t-67 -97.5t-97 -66.5t-119 -24.5h-1075q-63 0 -119.5 24.5t-97.5 66.5t-65.5 97.5t-24.5 118.5zM385 388.5v37.5q0 166 56.5 312.5t173 256t293.5 173t419 65.5v231q0 57 28.5 69.5t69.5 -28.5l392 -391q27 -25 26 -65q0 -39 -26 -64l-392 -391q-41 -41 -69.5 -28.5 t-28.5 69.5v260q-207 0 -364.5 -43t-266 -116.5t-170 -174t-77.5 -215.5q-4 -27 -31 -27q-25 0 -29 27q-4 23 -4 42.5z" />
105
+ <glyph unicode="&#xf046;" d="M0 307v922q0 63 24.5 119.5t65.5 97.5t97.5 65.5t119.5 24.5h1075q27 0 52 -6l-187 -187h-940q-47 0 -80.5 -33.5t-33.5 -80.5v-922q0 -47 33.5 -80.5t80.5 -33.5h1075q47 0 81 33.5t34 80.5v326l193 192v-518q0 -63 -25 -118.5t-67 -97.5t-97 -66.5t-119 -24.5h-1075 q-63 0 -119.5 24.5t-97.5 66.5t-65.5 97.5t-24.5 118.5zM385 966.5q0 32.5 23 55.5l98 98q23 23 55.5 23t54.5 -23l340 -340l654 656q23 23 56.5 22.5t55.5 -22.5l99 -99q23 -23 22.5 -55.5t-22.5 -54.5l-711 -711l-98 -98q-23 -23 -55.5 -23t-55.5 23l-100 98l-393 395 q-23 23 -23 55.5z" />
106
+ <glyph unicode="&#xf047;" horiz-adv-x="1597" d="M0 768q0 25 18 43l256 256q27 27 45.5 19.5t18.5 -46.5v-170h360v359h-172q-37 0 -45 18.5t19 44.5l256 256q18 18 43 19q25 0 43 -19l256 -256q27 -27 19.5 -45t-46.5 -18h-172v-359h361v170q0 39 18 46.5t45 -19.5l256 -256q18 -18 18 -43t-18 -43l-256 -256 q-27 -27 -45 -19.5t-18 46.5v176h-361v-365h172q39 0 47 -18.5t-20 -44.5l-256 -256q-18 -18 -43 -19q-25 0 -43 19l-256 256q-27 27 -20 45t46 18h172v365h-360v-176q0 -39 -18.5 -46.5t-45.5 19.5l-256 256q-18 18 -18 43z" />
107
+ <glyph unicode="&#xf048;" horiz-adv-x="1075" d="M0 76q0 -31 22.5 -53.5t53.5 -22.5h153q33 0 55.5 22.5t22.5 53.5v1382q0 33 -22.5 55.5t-55.5 22.5h-153q-31 0 -53.5 -22.5t-22.5 -55.5v-1382zM307.5 768q-0.5 27 16.5 43l653 707q14 18 41 18q6 0 22 -4q35 -18 35 -59v-1412q0 -41 -35 -57q-39 -14 -63 14l-653 705 q-16 18 -16.5 45z" />
108
+ <glyph unicode="&#xf049;" d="M0 76q0 -31 22.5 -53.5t53.5 -22.5h153q33 0 55.5 22.5t22.5 53.5v1382q0 33 -22.5 55.5t-55.5 22.5h-153q-31 0 -53.5 -22.5t-22.5 -55.5v-1382zM307.5 768q-0.5 27 16.5 43l653 707q14 18 41 18q6 0 22 -4q35 -18 35 -59v-1412q0 -41 -35 -57q-39 -14 -63 14l-653 705 q-16 18 -16.5 45zM1075.5 768q-0.5 27 16.5 43l653 707q14 18 41 18q6 0 22 -4q35 -18 35 -59v-1412q0 -41 -35 -57q-39 -14 -63 14l-653 705q-16 18 -16.5 45z" />
109
+ <glyph unicode="&#xf04a;" horiz-adv-x="1536" d="M0 767q0 26 16 44l654 707q14 18 41 18q10 0 22 -6q35 -14 35 -57v-1412q0 -41 -35 -57q-37 -16 -63 14l-654 705q-16 18 -16 44zM768 767q0 26 16 44l654 707q14 18 41 18q10 0 22 -6q35 -14 35 -57v-1412q0 -41 -35 -57q-37 -16 -63 14l-654 705q-16 18 -16 44z" />
110
+ <glyph unicode="&#xf04b;" horiz-adv-x="1349" d="M0 70v1396q0 39 35 60q37 23 69 0l1211 -697q35 -25 35 -61q0 -37 -35 -61l-1211 -697q-16 -10 -34 -10t-35 10q-35 20 -35 60z" />
111
+ <glyph unicode="&#xf04c;" horiz-adv-x="1536" d="M0 70v1396q0 29 20.5 49.5t49.5 20.5h489q29 0 49.5 -20.5t20.5 -49.5v-1396q0 -29 -20.5 -49.5t-49.5 -20.5h-489q-29 0 -49.5 20.5t-20.5 49.5zM907 70v1396q0 29 20.5 49.5t49.5 20.5h489q29 0 49.5 -20.5t20.5 -49.5v-1396q0 -29 -20.5 -49.5t-49.5 -20.5h-489 q-29 0 -49.5 20.5t-20.5 49.5z" />
112
+ <glyph unicode="&#xf04d;" horiz-adv-x="1536" d="M0 70v1396q0 29 20.5 49.5t49.5 20.5h1396q29 0 49.5 -20.5t20.5 -49.5v-1396q0 -29 -20.5 -49.5t-49.5 -20.5h-1396q-29 0 -49.5 20.5t-20.5 49.5z" />
113
+ <glyph unicode="&#xf04e;" horiz-adv-x="1536" d="M0 61v1414q0 39 35 57q39 14 63 -14l654 -705q16 -18 16 -45t-16 -45l-654 -705q-16 -18 -41 -18q-6 0 -22 4q-35 16 -35 57zM768 61v1414q0 39 35 57q39 14 63 -14l654 -705q16 -18 16 -45t-16 -45l-654 -705q-16 -18 -41 -18q-6 0 -22 4q-35 16 -35 57z" />
114
+ <glyph unicode="&#xf050;" d="M0 61v1414q0 39 35 57q39 14 63 -14l654 -705q16 -18 16 -45t-16 -45l-654 -705q-16 -18 -41 -18q-6 0 -22 4q-35 16 -35 57zM768 61v1414q0 39 35 57q39 14 63 -14l654 -705q16 -18 16 -45t-16 -45l-654 -705q-16 -18 -41 -18q-6 0 -22 4q-35 16 -35 57zM1536 76 q0 -31 22.5 -53.5t53.5 -22.5h153q33 0 55.5 22.5t22.5 53.5v1382q0 33 -22.5 55.5t-55.5 22.5h-153q-31 0 -53.5 -22.5t-22.5 -55.5v-1382z" />
115
+ <glyph unicode="&#xf051;" horiz-adv-x="1075" d="M0 61v1414q0 39 35 57q39 14 63 -14l654 -705q16 -18 16 -45t-16 -45l-654 -705q-16 -18 -41 -18q-6 0 -22 4q-35 16 -35 57zM768 76q0 -31 22.5 -53.5t53.5 -22.5h153q33 0 55.5 22.5t22.5 53.5v1382q0 33 -22.5 55.5t-55.5 22.5h-153q-31 0 -53.5 -22.5t-22.5 -55.5 v-1382z" />
116
+ <glyph unicode="&#xf052;" horiz-adv-x="1536" d="M0 70v198q0 29 20.5 49.5t49.5 20.5h1396q29 0 49.5 -20.5t20.5 -49.5v-198q0 -29 -20.5 -49.5t-49.5 -20.5h-1396q-29 0 -49.5 20.5t-20.5 49.5zM6 594q-18 43 14 76l699 698q20 20 49 20.5t49 -20.5l699 -698q33 -33 14 -76q-16 -43 -64 -43h-1396q-47 0 -64 43z" />
117
+ <glyph unicode="&#xf053;" horiz-adv-x="964" d="M0 765q0 38 29 66l671 674q29 29 68 29t68 -29l100 -100q29 -29 29 -68t-29 -67l-508 -510l508 -500q29 -29 29 -66.5t-29 -66.5l-100 -102q-29 -29 -68 -29t-68 29l-671 673q-29 29 -29 67z" />
118
+ <glyph unicode="&#xf054;" horiz-adv-x="964" d="M0 194.5q0 38.5 29 67.5l508 508l-508 502q-29 29 -29 66.5t29 66.5l100 102q29 29 68 29t67 -29l672 -673q29 -29 29 -68t-29 -68l-672 -671q-29 -29 -67.5 -29t-67.5 29l-100 100q-29 29 -29 67.5z" />
119
+ <glyph unicode="&#xf055;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM338 688q0 -33 33 -33h313v-344q0 -33 33 -32h164q33 0 32 32v344h314 q12 0 22.5 9.5t10.5 23.5v158q0 14 -10.5 23.5t-22.5 9.5h-314v346q0 33 -32 32h-164q-33 0 -33 -32v-346h-313q-33 0 -33 -33v-158z" />
120
+ <glyph unicode="&#xf056;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM338 688q0 -33 33 -33h856q12 0 22.5 9.5t10.5 23.5v158q0 14 -10.5 23.5 t-22.5 9.5h-856q-33 0 -33 -33v-158z" />
121
+ <glyph unicode="&#xf057;" horiz-adv-x="1597" d="M0 770q0 154 58.5 301.5t174.5 263.5q117 117 264.5 175.5t301 58.5t301 -58.5t264.5 -175.5t175 -264t58 -301t-58 -301t-175 -264t-264.5 -175.5t-301 -58.5t-301 58.5t-264.5 175.5t-175 264t-58 301zM385 505q0 -13 10 -24l115 -116q10 -10 23.5 -10.5t23.5 10.5 l244 243l219 -221q10 -10 23.5 -10t23.5 10l113 113q23 23 0 47l-222 219l246 246q23 23 0 47l-117 115q-25 25 -47 0l-243 -244l-222 221q-10 10 -23 10t-24 -10l-110 -113q-25 -23 0 -47l219 -219l-242 -244q-10 -10 -10 -23z" />
122
+ <glyph unicode="&#xf058;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 718q0 -20 14 -34l319 -319q14 -14 38 -24.5t44 -10.5h56q20 0 43.5 10 t38.5 25l550 550q14 14 14.5 34t-14.5 34l-104 107q-16 14 -35.5 14t-34.5 -14l-452 -453q-14 -14 -33.5 -14t-34.5 14l-221 221q-14 14 -33.5 14t-36.5 -14l-104 -106q-14 -14 -14 -34z" />
123
+ <glyph unicode="&#xf059;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM532 1100l95 -115q4 -8 20 -12q12 0 23 6l10 8t27.5 17.5t39 16.5t46.5 7 q41 0 69.5 -22.5t28.5 -57.5q0 -37 -24.5 -64.5t-61.5 -60.5q-23 -18 -46.5 -40.5t-43 -51.5t-31.5 -63.5t-12 -79.5v-64q0 -12 9 -21t21 -9h164q12 0 20.5 9t8.5 21v51q0 39 25.5 66.5t62.5 60.5q25 20 49.5 46t46 57t34.5 69.5t13 90.5q0 68 -27.5 121t-73.5 87.5 t-103.5 53t-114.5 18.5q-63 0 -113.5 -16.5t-85.5 -35.5t-53 -35.5t-20 -18.5q-16 -16 -3 -39zM672 252q0 -12 9 -21.5t21 -9.5h164q12 0 20.5 9.5t8.5 21.5v156q0 12 -8 21t-21 9h-164q-12 0 -21 -9t-9 -21v-156z" />
124
+ <glyph unicode="&#xf05a;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM573 858q0 -29 29 -29h86v-409h-78q-12 0 -21 -8.5t-9 -20.5v-139q0 -12 9 -21.5 t21 -9.5h402q12 0 20 9.5t8 21.5v139q0 29 -28 29h-78v577q0 12 -8 21.5t-21 9.5h-303q-12 0 -20.5 -9t-8.5 -22v-139zM686 1151q0 -12 9.5 -21.5t21.5 -9.5h188q12 0 20.5 9.5t8.5 21.5v166q0 29 -29 29h-188q-12 0 -21.5 -8.5t-9.5 -20.5v-166z" />
125
+ <glyph unicode="&#xf05b;" horiz-adv-x="1536" d="M0 692v154q0 16 11.5 26.5t27.5 10.5h164q18 84 59 158.5t99.5 133t133 99.5t158.5 59v164q0 39 39 39h154q16 0 26.5 -11.5t10.5 -27.5v-164q84 -18 158.5 -59t133 -99.5t99.5 -133t59 -158.5h164q16 0 27.5 -10.5t11.5 -26.5v-154q0 -39 -39 -39h-164 q-18 -84 -59 -158.5t-99.5 -133t-133 -99.5t-158.5 -59v-164q0 -16 -10.5 -27.5t-26.5 -11.5h-154q-39 0 -39 39v164q-84 18 -158.5 59t-133 99.5t-99.5 133t-59 158.5h-164q-39 0 -39 39zM365 653q29 -106 105.5 -183t182.5 -105v174q0 16 11.5 26t27.5 10h154 q16 0 26.5 -10t10.5 -26v-174q106 29 183 105.5t105 182.5h-172q-39 0 -38 39v154q0 16 11 26.5t27 10.5h172q-29 106 -105.5 183t-182.5 105v-172q0 -16 -10.5 -27t-26.5 -11h-154q-39 0 -39 38v172q-106 -29 -183 -105.5t-105 -182.5h174q16 0 26 -10.5t10 -26.5v-154 q0 -16 -10 -27.5t-26 -11.5h-174z" />
126
+ <glyph unicode="&#xf05c;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177.5 120t-217.5 44q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM451 573.5q0 16.5 12 28.5l166 166l-166 166q-12 12 -12 28.5t12 28.5l112 113q29 29 58 0l166 -166l166 166q29 29 57 0l113 -113q29 -29 0 -57l-166 -166l166 -166 q29 -29 0 -57l-113 -113q-12 -12 -28.5 -12t-28.5 12l-166 166l-166 -166q-12 -12 -28.5 -12t-29.5 12l-112 113q-12 12 -12 28.5z" />
127
+ <glyph unicode="&#xf05d;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -117 44 -218t119.5 -177t177 -120t218.5 -44t218 44t177 120t120 177 t44 218t-44 218t-120 177t-177.5 120t-217.5 44q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM332 717.5q0 17.5 10 27.5l115 115q10 10 27.5 10t27.5 -10l178 -180q29 -25 58 0l337 340q10 10 27.5 10t28.5 -10l114 -115q10 -10 10.5 -27.5t-10.5 -27.5l-409 -410 q-12 -12 -32.5 -20t-37.5 -8h-114q-16 0 -37 8t-33 20l-250 250q-10 10 -10 27.5z" />
128
+ <glyph unicode="&#xf05e;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -84 23.5 -160t66.5 -141l770 770q-66 43 -141.5 66.5t-159.5 23.5 q-117 0 -218.5 -44t-177 -120t-119.5 -177t-44 -218zM498 297q66 -41 141.5 -64.5t159.5 -23.5q117 0 218 44t177 120t120 177t44 218q0 84 -23.5 160t-64.5 141z" />
129
+ <glyph unicode="&#xf060;" horiz-adv-x="1536" d="M0 768q0 39 29 68l671 673q29 29 68 29t68 -29l100 -100q29 -29 29 -67.5t-29 -67.5l-338 -338h842q41 0 68.5 -27.5t27.5 -68.5v-144q0 -39 -27.5 -66.5t-66.5 -27.5h-844l338 -338q29 -29 29 -67.5t-29 -67.5l-100 -100q-29 -29 -68 -29t-68 29l-671 671q-29 29 -29 68 z" />
130
+ <glyph unicode="&#xf061;" horiz-adv-x="1536" d="M0 698v144q0 39 27.5 66.5t66.5 27.5h844l-338 338q-29 29 -29 67.5t29 67.5l100 100q29 29 68 29t68 -29l671 -673q29 -29 29 -67t-29 -67l-671 -673q-29 -29 -68 -29t-68 29l-100 100q-29 29 -29 68t29 67l338 338h-844q-39 0 -66.5 27.5t-27.5 68.5z" />
131
+ <glyph unicode="&#xf062;" horiz-adv-x="1536" d="M-1 768q-1 39 28 68l673 671q29 29 68 29t68 -29l671 -671q29 -29 29 -68t-29 -68l-100 -100q-29 -29 -66.5 -29t-66.5 29l-340 338v-844q0 -39 -27.5 -66.5t-66.5 -27.5h-144q-41 0 -67.5 27.5t-26.5 66.5v844l-338 -338q-29 -29 -67.5 -29t-67.5 29l-100 100 q-29 29 -30 68z" />
132
+ <glyph unicode="&#xf063;" horiz-adv-x="1536" d="M0 766q0 39 29 68l100 100q29 29 68 29t67 -29l338 -338v844q0 39 27.5 66.5t66.5 27.5h144q41 0 67.5 -27.5t26.5 -66.5v-844l340 338q29 29 66.5 29t66.5 -29l102 -100q29 -29 29 -68t-29 -68l-673 -671q-29 -29 -68 -29t-68 29l-671 671q-29 29 -29 68z" />
133
+ <glyph unicode="&#xf064;" d="M0 135q0 209 71.5 393.5t218 322.5t371 219t531.5 83v293q0 72 36 87t89 -36l491 -493q35 -33 35 -82q0 -47 -35 -82l-491 -494q-51 -51 -88 -35.5t-37 86.5v330q-262 -2 -461 -56.5t-336 -147.5t-215 -219t-98 -271q-4 -33 -37 -33h-2q-33 0 -37 33q-6 51 -6 102z" />
134
+ <glyph unicode="&#xf065;" horiz-adv-x="1536" d="M0 86v522q0 53 26.5 64.5t65.5 -25.5l166 -166l274 275q12 12 31 12t33 -12l160 -160q12 -14 12 -32.5t-12 -31.5l-275 -274l166 -166q39 -39 27 -65.5t-66 -26.5h-520q-37 0 -61 25q-27 27 -27 61zM768 972.5q0 18.5 12 31.5l275 274l-166 166q-39 39 -27 65.5t66 26.5 h520q37 0 61 -25q27 -27 27 -61v-522q0 -53 -26.5 -64.5t-65.5 25.5l-166 166l-274 -273q-12 -14 -31 -14t-33 14l-160 158q-12 14 -12 32.5z" />
135
+ <glyph unicode="&#xf066;" horiz-adv-x="1536" d="M0 202.5q0 18.5 12 33.5l275 272l-166 166q-39 39 -27 65.5t66 26.5h520q38 0 61 -25q27 -27 27 -61v-522q0 -53 -26.5 -64.5t-65.5 27.5l-166 166l-274 -275q-12 -14 -31 -14t-33 14l-160 160q-12 12 -12 30.5zM768 854v522q0 53 26.5 64.5t65.5 -27.5l166 -166l274 275 q12 14 31 14t33 -14l160 -160q12 -12 12 -30.5t-12 -33.5l-275 -272l166 -166q39 -39 27 -65.5t-66 -26.5h-520q-41 0 -61 25q-27 27 -27 61z" />
136
+ <glyph unicode="&#xf067;" horiz-adv-x="1536" d="M0 696v144q0 39 27.5 66.5t66.5 27.5h508v506q0 41 26.5 68.5t67.5 27.5h144q39 0 66.5 -27.5t27.5 -66.5v-508h508q39 0 66.5 -27.5t27.5 -66.5v-144q0 -39 -27.5 -66.5t-66.5 -27.5h-508v-506q0 -41 -27.5 -68.5t-66.5 -27.5h-144q-39 0 -66.5 27.5t-27.5 66.5v508 h-506q-41 0 -68.5 26.5t-27.5 67.5z" />
137
+ <glyph unicode="&#xf068;" horiz-adv-x="1536" d="M0 696v144q0 39 27.5 66.5t66.5 27.5h1348q39 0 66.5 -27.5t27.5 -66.5v-144q0 -39 -27.5 -66.5t-66.5 -27.5h-1346q-41 0 -68.5 26.5t-27.5 67.5z" />
138
+ <glyph unicode="&#xf069;" horiz-adv-x="1427" d="M2 1018q-10 37 10 72l72 124q20 35 58 44.5t73 -9.5l332 -192v383q0 41 27.5 68.5t68.5 27.5h141q41 0 69 -27.5t28 -66.5v-385l331 192q35 18 73 9t58 -44l70 -124q20 -35 11 -72t-44 -57l-333 -193l333 -193q35 -20 44.5 -57t-9.5 -72l-72 -124q-20 -35 -58 -44.5 t-73 9.5l-331 192v-383q0 -41 -28 -68.5t-69 -27.5h-141q-41 0 -68.5 27.5t-27.5 66.5v385l-332 -192q-35 -20 -73 -10t-58 45l-72 124q-18 35 -9 72t44 57l334 193l-334 193q-35 20 -45 57z" />
139
+ <glyph unicode="&#xf06a;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM672 1274l14 -739q4 -29 31 -29h162q12 0 21 8t9 21l17 739q0 10 -8 22q-8 8 -23 9 h-193q-14 0 -22 -9q-8 -12 -8 -22zM680 236q0 -12 8 -21.5t21 -9.5h180q12 0 21.5 9t9.5 22v174q0 12 -9.5 21t-21.5 9h-180q-12 0 -20.5 -9t-8.5 -21v-174z" />
140
+ <glyph unicode="&#xf06b;" horiz-adv-x="1880" d="M0 588v391q0 16 11.5 27.5t27.5 11.5h539q-57 0 -107.5 21.5t-87.5 58.5t-58.5 87t-21.5 107t21.5 107.5t58.5 87.5t87 58.5t108 21.5q61 0 115.5 -24.5t88.5 -69.5l158 -203l158 203q35 45 89 69.5t116 24.5q57 0 107 -21.5t87 -58.5t58.5 -87t21.5 -108 q0 -57 -21.5 -107t-58.5 -87t-87 -58.5t-107 -21.5h538q16 0 27.5 -11.5t11.5 -27.5v-391q0 -16 -11 -27.5t-28 -11.5h-117v-432q0 -47 -34.5 -82t-83.5 -35h-1332q-49 0 -82.5 35t-33.5 82v432h-119q-16 0 -27.5 11t-11.5 28zM461 1292q0 -49 33.5 -82.5t83.5 -33.5h237 l-151 196q-10 10 -32 24.5t-54 14.5q-49 0 -83 -35t-34 -84zM743 221q0 -33 24 -56.5t56 -23.5h234q33 0 56.5 23.5t23.5 56.5v797h-394v-797zM1065 1176h238q49 0 82.5 33.5t33.5 82.5t-33.5 84t-82.5 35q-33 0 -54.5 -14.5t-31.5 -24.5z" />
141
+ <glyph unicode="&#xf06c;" horiz-adv-x="1916" d="M6 135q20 53 56 89t71 65q29 23 50.5 43t27.5 43q2 6 0 12t-10 25q-6 12 -11.5 27.5t-9.5 35.5q-25 160 13 295t120 242.5t195 185.5t235 121q82 29 179.5 34t203.5 7q61 0 127 2t127.5 11t113.5 28.5t85 54.5q20 20 38.5 41t38 36t43 24.5t58.5 9.5q23 0 42.5 -11.5 t29.5 -31.5q66 -133 83 -281.5t-18 -322.5q-90 -487 -579 -740q-231 -123 -467 -123q-154 0 -307 54q-23 8 -45.5 20t-44.5 25q-29 16 -57.5 30.5t-49.5 14.5q-10 -2 -23.5 -17.5t-27.5 -35t-26.5 -41t-20.5 -33.5q-14 -23 -26.5 -41.5t-22.5 -32.5q-25 -31 -64 -31h-4 q-29 2 -49.5 12.5t-33.5 24.5t-20.5 28.5t-9.5 22.5q-27 37 -10 78zM401 507.5q2 -32.5 29 -54.5q20 -18 51 -19q37 0 62 27q90 102 181 175t191.5 117t212 62t242.5 14q33 -4 57.5 19.5t26.5 56.5q2 35 -20.5 58.5t-57.5 25.5q-147 6 -277 -16.5t-247 -73.5t-223.5 -133 t-206.5 -199q-23 -27 -21 -59.5z" />
142
+ <glyph unicode="&#xf06d;" horiz-adv-x="1445" d="M0 442q0 123 63.5 254t174.5 238q10 16 33.5 13t31.5 -21q4 -16 0 -29q-8 -35 -14 -84t-4 -101.5t13 -101.5t38 -84q31 -37 78 -49q-49 154 -40 293t49 259t101.5 217t118.5 167t98 106.5t43 39.5q25 18 47 0q10 -8 13.5 -21.5t-0.5 -24.5q0 -2 -15.5 -42.5t-21.5 -102 t7 -134.5t71 -136q37 -43 67.5 -85t52 -93.5t34 -120t12.5 -162.5q0 -33 -31 -39q-12 -2 -24.5 4t-16.5 19q-14 31 -42 49t-63 18q-47 0 -79.5 -33.5t-32.5 -81.5q0 -121 156 -120q98 0 153 63q37 43 53.5 101.5t20.5 114.5t2 102.5t-4 62.5q-6 12 0 29q8 18 31.5 21 t35.5 -13q111 -106 173.5 -237.5t62.5 -254.5q0 -109 -51.5 -195.5t-145.5 -148t-228 -95.5t-298 -34t-298 34t-228.5 95.5t-145.5 148.5t-51 195z" />
143
+ <glyph unicode="&#xf06e;" d="M0 722q0 44 25 83q78 125 178 224t216 168t242.5 104.5t260.5 35.5q135 0 262 -35.5t241.5 -103.5t215 -167t180.5 -226q23 -39 22.5 -83t-22.5 -81q-80 -127 -180.5 -226.5t-215 -167t-241.5 -103t-262 -35.5q-133 0 -260 35.5t-243 104t-216.5 168t-177.5 224.5 q-25 37 -25 81zM154 723q66 -104 149.5 -190.5t182 -145.5t208 -92t228.5 -33t228.5 33t207.5 92t182 145t150 191q-80 129 -187.5 226.5t-236.5 156.5q51 -59 79.5 -133t28.5 -160q0 -96 -35.5 -179t-99 -146.5t-147.5 -99.5t-179 -36q-96 0 -179 36t-146.5 99.5t-99 146.5 t-35.5 179q0 78 25.5 148.5t68.5 128.5q-117 -59 -217.5 -152.5t-175.5 -214.5zM614 813q0 -23 16.5 -40t41.5 -17t41 17.5t16 39.5q0 78 53.5 131t130.5 53q25 0 41.5 17.5t16.5 40.5q0 25 -16.5 41t-41.5 16q-61 0 -116.5 -23.5t-95 -63.5t-63.5 -95.5t-24 -116.5z" />
144
+ <glyph unicode="&#xf070;" d="M0 767q0 44 25 83q78 125 178 224.5t216 168t242.5 104t260.5 35.5q53 0 105 -7t103 -17l89 158q8 14 24 18q12 6 29 -2l133 -76q14 -8 19.5 -23.5t-3.5 -29.5l-774 -1383q-6 -14 -22 -18q-4 -2 -11 -2q-6 0 -18 4l-135 76q-14 8 -18.5 23.5t3.5 29.5l66 115 q-145 68 -269 178.5t-218 259.5q-25 37 -25 81zM154 768q82 -131 191.5 -229.5t240.5 -157.5l57 104q-86 63 -138 159.5t-52 213.5q0 78 25.5 148.5t68.5 130.5q-117 -61 -217.5 -153.5t-175.5 -215.5zM614 858q0 -23 16.5 -40t41.5 -17t41 17.5t16 39.5q0 78 53.5 131 t130.5 53q25 0 41.5 17.5t16.5 40.5q0 25 -16.5 41t-41.5 16q-61 0 -116.5 -23.5t-95 -63.5t-63.5 -95.5t-24 -116.5zM928 154l88 159q209 25 382 145t292 310q-109 170 -263 283l76 137q92 -66 172 -150t146 -188q23 -39 22.5 -83t-22.5 -81q-160 -254 -392.5 -392 t-500.5 -140zM1081 430l285 510q4 -20 6 -39.5t2 -42.5q0 -74 -21.5 -140.5t-60.5 -121.5t-93 -98t-118 -68z" />
145
+ <glyph unicode="&#xf071;" horiz-adv-x="1775" d="M0 92q0 20 6 39t17 35l768 1331q16 27 39.5 48.5t56.5 21.5t56.5 -21.5t39.5 -48.5l770 -1331q10 -16 16.5 -34.5t6.5 -39.5q0 -49 -38 -70.5t-81 -21.5h-1538q-43 0 -81 21.5t-38 70.5zM770 1114l12 -633q0 -14 10.5 -24.5t24.5 -10.5h139q14 0 24.5 10.5t10.5 24.5 l15 633q0 14 -10.5 24.5t-24.5 10.5h-166q-16 0 -25.5 -10.5t-9.5 -24.5zM776 168q0 -16 10.5 -25.5t24.5 -9.5h154q35 0 34 35v147q0 16 -9 26.5t-25 10.5h-154q-14 0 -24.5 -10t-10.5 -27v-147z" />
146
+ <glyph unicode="&#xf072;" horiz-adv-x="1597" d="M0 541v4q0 31 23 57l30 29q20 25 56 24q8 0 10 -2l280 -32q39 63 93.5 134.5t125.5 151.5l-583 457q-31 25 -31 59v4q0 31 23 58l57 57q27 23 57 23h13.5t13.5 -4l803 -293l151 149q70 70 161 110t167 40q72 0 109 -37q20 -18 28 -46t8 -63q0 -76 -38.5 -167t-110.5 -160 l-150 -152l293 -803q6 -12 6 -26q0 -33 -24 -58l-58 -57q-23 -25 -57 -25h-4q-35 4 -59 31l-455 586q-82 -72 -153.5 -126t-135.5 -93l35 -281v-10q0 -33 -22 -55l-31 -31q-23 -23 -58 -23h-4q-39 4 -59 31l-205 272l-274 207q-29 25 -31 60z" />
147
+ <glyph unicode="&#xf073;" horiz-adv-x="1566" d="M0 117v1147q0 47 35 81.5t82 34.5h39v13q0 31 10 62.5t32.5 56t59.5 40t90 15.5t90 -15.5t59.5 -40t33 -56.5t10.5 -62v-13h49v13q0 31 10 62.5t32.5 56t59.5 40t90 15.5t90 -15.5t60.5 -40t34 -56.5t10.5 -62v-13h49v13q0 31 10.5 62.5t33 56t59 40t90.5 15.5 q53 0 90 -15.5t59.5 -40t32.5 -56.5t10 -62v-13h39q47 0 82 -34.5t35 -81.5v-1147q0 -47 -35 -82t-82 -35h-1333q-47 0 -82 35t-35 82zM158 158h282v250h-282v-250zM158 446h282v252h-282v-252zM158 737h282v252h-282v-252zM272 1165q0 -57 76 -57t76 57v228q0 57 -76 57 t-76 -57v-228zM479 158h285v250h-285v-250zM479 446h285v252h-285v-252zM479 737h285v252h-285v-252zM709 1165q0 -31 16 -44t57 -13t58.5 13.5t17.5 43.5v228q0 29 -17.5 43t-58.5 14t-57 -14.5t-16 -42.5v-228zM803 158h284v250h-284v-250zM803 446h284v252h-284v-252z M803 737h284v252h-284v-252zM1126 158h283v250h-283v-250zM1126 446h283v252h-283v-252zM1126 737h283v252h-283v-252zM1143 1165q0 -57 76 -57t75 57v228q0 57 -75 57q-76 0 -76 -57v-228z" />
148
+ <glyph unicode="&#xf074;" d="M0 252v154q0 16 11.5 27t27.5 11h219q51 0 99.5 31t93.5 83t90 119.5t90 139.5q55 88 114.5 175t127 156t147.5 110.5t180 41.5h203v185q0 41 24.5 49t59.5 -21l334 -278q23 -18 22 -45q0 -29 -22 -47l-334 -277q-35 -29 -59.5 -20.5t-24.5 49.5v174h-203 q-53 0 -100 -31.5t-93 -84t-91.5 -120t-90.5 -139.5q-55 -88 -113.5 -174t-126 -154.5t-148.5 -110.5t-179 -42h-219q-16 0 -27.5 11.5t-11.5 27.5zM0 1108v154q0 39 39 38h219q68 0 127 -20t111.5 -56t97.5 -84t88 -104q-61 -90 -117 -178q-4 -8 -9 -14t-9 -15 q-70 102 -139.5 172t-149.5 70h-219q-16 0 -27.5 10.5t-11.5 26.5zM778 481q29 41 56.5 85t56.5 87q4 10 10 17.5t10 17.5q70 -102 139.5 -170.5t149.5 -68.5h203v190q0 41 24.5 49t59.5 -20l334 -277q23 -18 22 -47q0 -27 -22 -45l-334 -279q-35 -29 -59.5 -20.5 t-24.5 49.5v168h-203q-68 0 -127 20.5t-110.5 56.5t-97.5 84t-87 103z" />
149
+ <glyph unicode="&#xf075;" horiz-adv-x="1916" d="M0 866q0 145 76 272.5t206 222.5t303.5 150.5t372.5 55.5t373 -55.5t304 -150.5t206 -222t76 -273q0 -145 -76 -272t-206 -222.5t-304 -150.5t-373 -55q-92 0 -180 12q-176 -139 -411 -192q-25 -4 -50.5 -8.5t-54.5 -8.5q-16 -2 -27.5 6.5t-15.5 24.5t5 26.5t20 20.5 q23 23 43 44.5t36.5 51t30 69.5t23.5 97q-174 98 -275.5 241.5t-101.5 315.5z" />
150
+ <glyph unicode="&#xf076;" horiz-adv-x="1566" d="M0 621v288q0 16 11.5 27.5t27.5 11.5h391q16 0 28.5 -11t12.5 -28v-288q0 -29 22.5 -60t63.5 -58.5t98.5 -45t128.5 -17.5q70 0 128.5 17.5t99.5 45t63.5 58.5t22.5 60v288q0 39 39 39h391q16 0 27.5 -11t11.5 -28v-288q0 -135 -61.5 -254t-168 -207t-249 -139.5 t-304.5 -51.5q-164 0 -306 51.5t-248.5 139.5t-168 206.5t-61.5 254.5zM0 1106v391q0 16 11.5 27.5t27.5 11.5h391q16 0 28.5 -11.5t12.5 -27.5v-391q0 -16 -12.5 -27.5t-28.5 -11.5h-391q-16 0 -27.5 11.5t-11.5 27.5zM1098 1106v391q0 16 11 27.5t28 11.5h391 q16 0 27.5 -11.5t11.5 -27.5v-391q0 -16 -11.5 -27.5t-27.5 -11.5h-391q-39 0 -39 39z" />
151
+ <glyph unicode="&#xf077;" horiz-adv-x="1536" d="M-1 355.5q-1 37.5 28 66.5l673 674q29 29 68 28.5t68 -28.5l671 -674q29 -29 29 -67t-29 -66l-100 -103q-29 -29 -68 -28.5t-67 28.5l-508 510l-500 -510q-29 -29 -67.5 -28.5t-67.5 28.5l-100 103q-29 29 -30 66.5z" />
152
+ <glyph unicode="&#xf078;" horiz-adv-x="1536" d="M0 918.5q0 37.5 29 66.5l100 102q29 29 68 29t67 -29l508 -509l500 509q29 29 67.5 29t67.5 -29l100 -102q29 -29 30 -66.5t-28 -66.5l-673 -674q-29 -29 -68 -28.5t-68 28.5l-671 674q-29 29 -29 66.5z" />
153
+ <glyph unicode="&#xf079;" horiz-adv-x="1916" d="M2.5 1038.5q-12.5 30.5 28.5 75.5l385 424q25 29 63 29q39 0 64 -29l385 -424q41 -45 28.5 -75.5t-67.5 -30.5h-250v-680h174q6 -10 12 -19.5t17 -19.5l252 -281h-695q-33 0 -56.5 23.5t-23.5 56.5v920h-249q-55 0 -67.5 30.5zM823 1526h695q33 0 56 -22.5t23 -57.5v-918 h250q55 0 67.5 -30.5t-28.5 -75.5l-385 -424q-25 -29 -63 -29q-39 0 -64 29l-385 424q-41 45 -28.5 75.5t67.5 30.5h250v678h-174q-6 10 -12.5 20.5t-14.5 20.5z" />
154
+ <glyph unicode="&#xf07a;" d="M0 1421v76q0 39 39 39h231q16 0 38 -4t36 -8q6 -4 14.5 -14.5t15.5 -23.5t12 -26.5t7 -21.5l27 -125h1347q35 0 58 -27t16 -59l-108 -578q-6 -25 -26.5 -42t-49.5 -17h-1084l35 -168q4 -16 17.5 -26.5t29.5 -10.5h856q16 0 27.5 -11.5t11.5 -27.5v-78q0 -16 -11 -26.5 t-28 -10.5h-163h-652h-104q-16 0 -36.5 3.5t-35.5 9.5q-6 2 -14 13t-15.5 24.5t-12.5 27t-7 21.5l-215 1016q-4 16 -17.5 26t-29.5 10h-170q-39 0 -39 39zM582 115q0 47 33.5 81.5t80.5 34.5q49 0 83 -34.5t34 -81.5t-34 -81t-83 -34q-47 0 -80.5 34t-33.5 81zM1233 115 q0 47 33.5 81.5t81.5 34.5q47 0 80.5 -34.5t33.5 -81.5t-33.5 -81t-80.5 -34t-81 34t-34 81z" />
155
+ <glyph unicode="&#xf07b;" d="M0 115v1306q0 47 34 81t81 34h692q47 0 81 -34t34 -81t33.5 -80.5t80.5 -33.5h693q47 0 80.5 -35t33.5 -82v-1075q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81z" />
156
+ <glyph unicode="&#xf07c;" d="M0 379v1042q0 47 34 81t81 34h692q47 0 81 -34t34 -81t33.5 -80.5t80.5 -33.5h443q47 0 80.5 -35t33.5 -82v-221h-1228q-37 0 -72 -12.5t-65.5 -34t-53 -51t-35.5 -64.5zM43 0l246 760q6 23 30.5 39t47.5 16h1476l-260 -758q-6 -23 -30.5 -40t-47.5 -17h-1462z" />
157
+ <glyph unicode="&#xf07d;" horiz-adv-x="798" d="M2 368.5q10 22.5 57 22.5h203v754h-203q-47 0 -57 22.5t25 57.5l319 319q23 23 53 23q31 0 54 -23l321 -319q33 -35 22.5 -57.5t-57.5 -22.5h-202v-754h202q47 0 57.5 -22.5t-24.5 -57.5l-319 -319q-23 -23 -54 -23t-53 23l-321 319q-33 35 -23 57.5z" />
158
+ <glyph unicode="&#xf07e;" horiz-adv-x="1597" d="M0 729q0 31 23 53l319 322q35 33 57.5 23.5t22.5 -56.5v-205h754v203q0 47 22.5 57.5t56.5 -22.5l320 -322q23 -23 22 -53q0 -31 -22 -53l-320 -322q-35 -33 -57 -22.5t-22 57.5v203h-754v-203q0 -47 -22.5 -57t-57.5 24l-319 320q-23 23 -23 53z" />
159
+ <glyph unicode="&#xf080;" d="M0 115v1306q0 47 35 81t82 34h1612q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1612q-47 0 -82 34t-35 81zM154 154h1536v1228h-1536v-1228zM307 264v363h203v-363h-203zM649 264v776h201v-776h-201zM993 264v592h203v-592h-203zM1333 264v922h203v-922 h-203z" />
160
+ <glyph unicode="&#xf081;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t73 15.5h1153q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-1153q-39 0 -73.5 15.5t-60 41t-41 60.5t-15.5 76zM201 559q80 -111 198.5 -169t259.5 -58q96 0 184.5 26.5t160 73.5 t124 112.5t76.5 143.5q82 6 129 57q14 14 4 33q-8 18 -30 15h-4q23 23 30 45q8 20 -8 32q-14 14 -33 2q-8 -4 -29.5 -10t-45.5 -6q-4 0 -7.5 1t-7.5 1q0 2 -1 4t-1 4q-16 61 -57 110.5t-94 72.5q4 4 6 8t6 8q6 16 0 33q-2 6 -12.5 16t-34.5 8q-2 4 -6 8q-12 12 -25 9 q-25 -4 -49 -13l-2 2q-14 8 -31 -2q-59 -37 -98 -100t-68 -135q-35 31 -57 41q-61 35 -129 63.5t-154 61.5q-14 4 -24 -4q-10 -6 -15 -21q-2 -27 8.5 -58.5t38.5 -62.5q-25 -6 -20 -32q12 -68 68 -101l-13 -12q-14 -14 -4 -33q4 -12 26.5 -37.5t65.5 -38.5q-6 -12 -6 -22 t2 -14q6 -33 39 -50q-37 -25 -79 -34t-85 -5.5t-83 20.5t-70 46q-8 8 -19.5 8t-19.5 -8q-23 -18 -4 -39z" />
161
+ <glyph unicode="&#xf082;" horiz-adv-x="1536" d="M2 193v1150q0 39 15.5 75t41 61.5t60.5 41t74 15.5h1153q80 0 136 -56.5t56 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-74 -15.5h-486v643h172q12 0 21.5 8t9.5 21l12 168q0 14 -8 24q-10 10 -23 10h-184v74q0 41 10.5 54.5t53.5 13.5q25 0 55.5 -4t58.5 -11 q6 0 13.5 1.5t11.5 5.5q10 6 14 22l23 162q4 29 -25 35q-90 25 -188 24q-301 0 -301 -293v-84h-103q-33 0 -32 -32v-168q0 -12 9 -21.5t23 -9.5h103v-643h-393q-39 0 -74 15.5t-60.5 41t-41 60.5t-15.5 76z" />
162
+ <glyph unicode="&#xf083;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 160h1536v114h-1536v-114zM154 1145h1536v231h-957l-14 -92h-565v-139zM266 1341h316v93h-316v-93zM557 709q0 -76 28.5 -142.5t78 -116 t116 -78t142.5 -28.5t142 28.5t115.5 78t78 116t28.5 142.5t-28.5 142.5t-78 115.5t-116 77.5t-141.5 28.5q-76 0 -142.5 -28.5t-116 -77.5t-78 -115.5t-28.5 -142.5zM672 709q0 51 19.5 97t53 80t79.5 53t98 19q51 0 97 -19t80 -53t53 -80t19 -97t-19 -97.5t-53 -80 t-80 -53t-97 -19.5t-97.5 19.5t-80 53t-53 79.5t-19.5 98zM743 709q0 -16 12.5 -28.5t28.5 -12.5q18 0 30.5 12.5t12.5 28.5q0 41 28 67.5t67 26.5v2q18 0 30.5 12t12.5 29q0 18 -12.5 30.5t-30.5 12.5q-74 0 -126.5 -53.5t-52.5 -126.5z" />
163
+ <glyph unicode="&#xf084;" horiz-adv-x="1916" d="M0 803.5q-6 111.5 30 230.5t113 228q78 109 179.5 180t209 102t213 17.5t191.5 -74.5q76 -53 121 -134t59 -176.5t-4 -199t-68 -203.5l414 -297l101 139l-105 74q-14 10 -17 27.5t7 32.5l51 69q10 14 26.5 17.5t32.5 -7.5l344 -247q16 -10 18.5 -27.5t-7.5 -32.5l-49 -69 q-10 -14 -27.5 -17.5t-32.5 6.5l-102 76l-101 -139l248 -178q43 -31 52.5 -83t-21.5 -95q-33 -43 -84 -51.5t-94 22.5l-803 573q-78 -80 -170 -130t-186.5 -68.5t-185.5 -2t-167 71.5q-86 61 -133 157.5t-53 208zM230.5 766q7.5 -41 30 -78t58.5 -63q37 -27 79 -36t83 -2 t78 29.5t64 59.5q39 53 41 114.5t-27 114.5q59 -10 116.5 11.5t96.5 74.5q27 37 36 79t2 84t-29.5 79t-59.5 63q-37 27 -79 36t-84 2t-79 -29.5t-63 -59.5q-37 -53 -39 -114.5t26 -114.5q-59 10 -116.5 -12.5t-96.5 -75.5q-27 -37 -36 -79t-1.5 -83z" />
164
+ <glyph unicode="&#xf085;" horiz-adv-x="1916" d="M0 801v180q0 8 22.5 15.5t52 11.5t56.5 7t37 3q12 49 37 88q-23 31 -45.5 61.5t-46.5 59.5l-4 10q0 6 20.5 29.5t47 50t50 47t29.5 20.5q2 0 20.5 -13t41 -30.5t43 -34t24.5 -20.5q43 25 90 37q0 8 3 37t7 57.5t10.5 52t16.5 23.5h178q8 0 15.5 -23.5t11.5 -52t7 -57.5 t5 -37q45 -12 86 -35q31 23 62.5 45.5t60.5 46.5l8 4q4 0 27.5 -21.5t49.5 -47t47.5 -49t21.5 -29.5q0 -4 -13.5 -22.5t-30 -40t-32 -41t-19.5 -25.5q23 -39 39 -92q10 -2 37 -5t55.5 -8.5t51 -11.5t22.5 -14v-178q0 -10 -22.5 -16.5t-51 -11.5t-56.5 -7t-36 -4 q-14 -43 -37 -88q23 -31 44.5 -60.5t48.5 -58.5l2 -10q0 -6 -20.5 -30t-47.5 -50.5t-50.5 -47t-29.5 -20.5q-2 0 -20.5 13.5t-41 31t-42 32.5t-25.5 20q-45 -23 -88 -37q0 -10 -3 -37t-8 -56.5t-12.5 -52t-15.5 -22.5h-178q-8 0 -15.5 22.5t-11.5 52t-7 56t-3 37.5 q-45 12 -88 37q-31 -23 -61.5 -46.5t-59.5 -48.5l-10 -2q-4 0 -27.5 20.5t-49 47t-46 50.5t-20.5 30q0 2 13 20.5t29.5 40t31 41t18.5 25.5q-23 43 -39 94q-10 2 -37 5t-55.5 7t-51 10.5t-22.5 14.5zM420 889q0 -37 14.5 -70t39 -57.5t58 -38.5t70.5 -14t70 14t57.5 38.5 t38.5 57.5t14 70t-14 70.5t-38.5 58t-57.5 39t-70 14.5q-76 0 -129 -53t-53 -129zM1114 373q0 6 13.5 13t31 14.5t33.5 12.5t22 7q4 23 9.5 39t15.5 37q-4 4 -13 17t-18.5 27.5t-16.5 28t-7 17.5t18.5 23.5t43 41t47 40t28.5 24.5l8 4q4 0 16.5 -8.5t25.5 -19.5t25.5 -21.5 t16.5 -14.5q35 12 76 19q2 6 9 21.5t16.5 30.5t17.5 27.5t14 12.5q4 0 34 -7t63.5 -18.5t60.5 -23.5t27 -23q0 -23 -5.5 -47t-9.5 -47q16 -12 28.5 -26.5t22.5 -30.5q25 2 49.5 3t47.5 1q8 0 18 -26.5t17.5 -60.5t12.5 -64.5t5 -39.5q0 -6 -13.5 -13t-29.5 -13t-32.5 -12.5 t-22.5 -8.5q-9 -38 -23 -71q2 -6 11.5 -18.5t18.5 -27t16 -27.5t7 -18q0 -4 -18.5 -23.5t-43 -41t-47 -40.5t-28.5 -26l-8 -4q-4 0 -16.5 8.5t-25.5 19.5t-25.5 21.5t-16.5 14.5q-37 -12 -78 -19q-2 -6 -9 -21.5t-15.5 -30.5t-16.5 -27.5t-14 -12.5t-35 7.5t-62.5 18.5 t-60 23.5t-26.5 22.5q0 23 5 47.5t9 46.5q-16 12 -28.5 26.5t-22.5 30.5q-23 -2 -45.5 -3t-44.5 -1h-14.5t-8.5 11q-2 8 -8 35.5t-13.5 58t-12.5 55.5t-5 29zM1192 1264q0 6 12.5 12t29.5 10t33.5 6t22.5 4q10 33 31 64q-2 4 -8 17.5t-12.5 27.5t-11.5 25.5t-5 15.5 q0 6 21.5 22.5t49 35t51.5 32.5t28 14t13 -9t20.5 -21.5t20.5 -23.5t13 -15q14 4 28.5 6t29.5 0h14q2 4 11 16.5t18.5 25.5t17.5 23.5t12 10.5t30 -11.5t55.5 -26t53 -28.5t23.5 -20q0 -4 -4 -15.5t-8 -26t-8.5 -27.5t-6.5 -17q20 -25 39 -60q51 -4 74 -7t29 -18.5t5 -52 t3 -106.5q0 -6 -12.5 -12.5t-28.5 -10.5t-32.5 -6t-22.5 -4q-13 -36 -31 -63q2 -4 8 -16.5t13.5 -27t12.5 -26.5t5 -14q0 -6 -22.5 -23.5t-50 -36t-51.5 -33t-26 -14.5q-4 0 -14 9.5t-21.5 21.5t-20.5 23.5t-13 15.5q-14 -4 -28.5 -6t-29.5 0h-14q-4 -4 -12 -16.5t-17.5 -26 t-18.5 -23.5t-13 -10t-30 11t-54.5 25.5t-52 29t-23.5 20.5q0 2 3 14.5t8 26.5t9 27.5t6 17.5q-23 23 -38 59q-53 2 -75 5t-29 18.5t-5 52.5t-4 109zM1397 367q0 -49 34.5 -85t84.5 -36q49 0 84.5 34.5t35.5 86.5q0 49 -34.5 83.5t-85.5 34.5q-49 0 -84 -34.5t-35 -83.5z M1446 1206q0 -47 31.5 -78.5t76.5 -31.5q47 0 79 31.5t32 76.5q0 47 -31.5 79t-77.5 32q-47 0 -78.5 -32t-31.5 -77z" />
165
+ <glyph unicode="&#xf086;" horiz-adv-x="1916" d="M0 997q0 119 61.5 222.5t167 180.5t246.5 122t303 45t303.5 -45t247 -122t166.5 -180.5t61 -222.5q0 -117 -61 -221t-166.5 -181t-247 -122t-303.5 -45q-37 0 -73.5 3t-71.5 7q-147 -113 -336 -155q-20 -4 -40.5 -7.5t-43.5 -7.5q-12 -2 -21.5 6.5t-13.5 18.5v2 q-4 12 3 19.5t18 17.5q18 18 34.5 36.5t29.5 42t24.5 55.5t19.5 79q-141 78 -224 195.5t-83 256.5zM649 258q6 4 13.5 8t13.5 8q51 -6 102 -6q197 0 369 56.5t298 155t198.5 231.5t72.5 286q0 41 -6 84q96 -78 151.5 -175t55.5 -208q0 -139 -83 -256.5t-224 -195.5 q8 -47 19 -79t25.5 -55.5t30 -42t33.5 -36.5q10 -10 17.5 -18.5t3.5 -18.5v-2q-2 -12 -12.5 -19.5t-22.5 -5.5q-23 4 -43.5 7.5t-40.5 7.5q-96 20 -180 60t-156 95q-35 -4 -71.5 -7t-73.5 -3q-141 0 -265 35t-225 94z" />
166
+ <glyph unicode="&#xf087;" horiz-adv-x="1597" d="M0 193v643q0 49 35 83.5t84 34.5h348q27 14 43 30.5t35 39.5q16 20 32.5 38.5t34.5 37.5q33 35 76 68.5t66 74.5q16 29 23 64.5t12.5 71.5t12.5 70t23.5 60.5t47 42t81.5 15.5q61 0 111.5 -25.5t85.5 -68.5t54.5 -98.5t19.5 -112.5q0 -59 -17.5 -112.5t-42.5 -107.5 q35 2 70 4.5t70 2.5q55 0 107 -10.5t93 -35t66.5 -67.5t25.5 -109q0 -29 -5 -57t-15 -57q18 -43 18 -90q0 -78 -41 -142q10 -59 -7 -118.5t-58 -104.5q-4 -84 -45 -139.5t-102.5 -89t-135 -47t-143.5 -13.5q-72 0 -144.5 10.5t-142.5 28.5q-70 20 -139.5 43t-142.5 23h-375 q-49 0 -84 34.5t-35 84.5zM236 276q0 -35 22 -57t57 -22q33 0 56.5 22.5t23.5 56.5q0 33 -23.5 56.5t-56.5 23.5q-35 0 -57 -23.5t-22 -56.5zM492 193q70 0 136 -16.5t133.5 -35t141.5 -35t160 -16.5q45 0 98 6t99.5 26.5t78 56.5t31.5 95q0 10 -1 18.5t-3 18.5 q35 16 53.5 53t18.5 74q0 39 -21 68q60 49 60 123q0 23 -12.5 43t-26.5 35q16 29 28.5 57.5t12.5 62.5q0 35 -17.5 55.5t-43 31t-56.5 12.5t-57 2q-45 0 -90.5 -3t-90.5 -3q-31 0 -61.5 3t-58.5 15q0 41 16 78t35.5 74.5t35 78.5t15.5 91q0 33 -10.5 65.5t-29.5 59t-47 44 t-65 17.5h-11t-11 -2q-8 -4 -9 -8t-3 -13q-12 -59 -22.5 -123.5t-39.5 -117.5q-29 -51 -74 -88t-86 -78q-29 -31 -49 -56.5t-41.5 -48t-48.5 -42t-65 -35.5h-2v-643z" />
167
+ <glyph unicode="&#xf088;" horiz-adv-x="1597" d="M0 309q0 29 5 57.5t15 57.5q-18 43 -18 90q0 78 41 141q-10 59 7.5 119t58.5 105q4 84 45 139t102 89t135 47t144 13q72 0 144.5 -10t141.5 -29q70 -20 139.5 -42.5t143.5 -22.5h375q49 0 83.5 -35t34.5 -84v-643q0 -49 -34.5 -84t-83.5 -35h-349q-27 -14 -43 -30.5 t-34 -38.5q-16 -20 -32.5 -39t-35.5 -37q-33 -35 -76 -69t-65 -74q-25 -43 -31 -99.5t-18.5 -106.5t-44 -84t-107.5 -34q-61 0 -111.5 25.5t-85 68.5t-54 98.5t-19.5 112.5q0 59 17.5 112.5t41.5 106.5q-35 -2 -69.5 -4t-69.5 -2q-55 0 -107.5 10.5t-93.5 35t-66.5 67.5 t-25.5 108zM119 309q0 -35 17.5 -55.5t43 -30.5t56 -12t57.5 -2q47 0 91 3t89 3q31 0 61.5 -3t59.5 -15q0 -41 -16.5 -78t-36 -75t-34.5 -79t-15 -90q0 -33 10 -65.5t29.5 -59t47 -43t64.5 -16.5q4 0 11.5 -1t11.5 1q8 4 9 8l3 12q12 59 22.5 124t38.5 118q29 51 74 88 t86 78q29 31 49.5 56.5t42 48t47 42t66.5 35.5h2v643q-72 0 -137.5 16.5t-133 36t-141 36t-159.5 16.5q-45 0 -98.5 -7.5t-99.5 -27t-78 -56t-32 -96.5q0 -10 1 -18t3 -19q-35 -16 -53 -53t-18 -74q0 -39 20 -67q-59 -49 -59 -123q0 -23 12 -43.5t27 -34.5 q-16 -29 -28.5 -57.5t-12.5 -63.5zM1202 860q0 -33 23.5 -56.5t56.5 -23.5q35 0 57.5 23.5t22.5 56.5q0 35 -22.5 57.5t-57.5 22.5q-33 0 -56.5 -22.5t-23.5 -57.5z" />
168
+ <glyph unicode="&#xf089;" horiz-adv-x="837" d="M1 959.5q9 27.5 54 33.5l506 74l227 459q23 41 50 41v-1348l-453 -237q-41 -23 -64.5 -6.5t-15.5 63.5l86 504l-364 356q-35 33 -26 60.5z" />
169
+ <glyph unicode="&#xf08a;" horiz-adv-x="1802" d="M0 1073q0 137 43 231.5t112.5 153t156.5 84t177 25.5q63 0 125 -21.5t115 -53.5t97 -70t75 -68q31 31 76 68.5t98 69.5t113.5 53.5t126.5 21.5q88 0 175 -25.5t156.5 -84t112.5 -153t43 -231.5q0 -94 -34.5 -177t-76.5 -146.5t-79 -102.5t-39 -43l-615 -612 q-26 -23 -57 -23q-33 0 -55 23l-617 614q-4 2 -39.5 41t-77.5 102.5t-77 146.5t-35 177zM160 1073q0 -68 27.5 -131t61.5 -112.5t63 -79.5l28 -29l561 -559l561 559l29 29q29 30 62.5 79.5t61 113t27.5 130.5q0 104 -29.5 169t-77.5 101.5t-106.5 50t-113.5 13.5 q-53 0 -107.5 -25.5t-102.5 -61.5t-86 -74t-56 -60q-25 -31 -62 -31t-61 31q-18 23 -56.5 60.5t-86.5 73.5t-102.5 61.5t-105.5 25.5q-57 0 -115.5 -13.5t-106.5 -50t-77.5 -101t-29.5 -169.5z" />
170
+ <glyph unicode="&#xf08b;" horiz-adv-x="1689" d="M0 307v922q0 63 24.5 118.5t66.5 97.5t97.5 66.5t118.5 24.5h461v-193h-461q-47 0 -80.5 -33.5t-33.5 -80.5v-922q0 -47 33.5 -80.5t80.5 -33.5h461v-193h-461q-63 0 -118.5 24.5t-97.5 66.5t-66.5 97.5t-24.5 118.5zM508 584v368q0 33 22.5 54.5t55.5 21.5h428v293 q0 41 39 57q39 14 65 -14l553 -553q18 -18 18.5 -44t-18.5 -42l-553 -553q-18 -18 -43 -18q-10 0 -22 4q-39 16 -39 57v291h-428q-33 0 -55.5 22.5t-22.5 55.5z" />
171
+ <glyph unicode="&#xf08c;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-1150q-80 0 -136.5 56.5t-56.5 136.5zM207 1192q0 -57 40 -97t95 -40q57 0 97 40t40 97q0 55 -40 95t-97 40q-55 0 -95 -40 t-40 -95zM213 240q0 -10 9 -19.5t20 -9.5h200q12 0 20.5 9t8.5 20v706q0 29 -29 29h-200q-10 0 -19.5 -8.5t-9.5 -20.5v-706zM580 240q0 -10 9 -19.5t19 -9.5h201q12 0 20.5 9t8.5 20v383q0 68 26.5 113.5t102.5 45.5q59 0 79.5 -28.5t20.5 -81.5v-432q0 -10 8 -19.5 t21 -9.5h204q10 0 19.5 9t9.5 20v477q0 141 -81 208.5t-216 67.5q-55 0 -107.5 -15t-93.5 -56q0 16 -3 34.5t-25 18.5h-195q-10 0 -19 -8.5t-9 -20.5v-706z" />
172
+ <glyph unicode="&#xf08d;" horiz-adv-x="1916" d="M2 950q8 82 45 172t100 176t139 147.5t152 92.5t145.5 30t121.5 -40q53 -41 73.5 -107.5t12.5 -148.5l301 -225q111 63 215 73t180 -47q55 -41 80.5 -108.5t23.5 -150.5t-30.5 -177t-83.5 -188l428 -410q25 -25 4 -53q-12 -16 -33 -17q-10 0 -18 6l-517 293 q-74 -80 -155.5 -135t-161.5 -80.5t-151.5 -19.5t-127.5 47q-76 55 -95 158.5t9 228.5l-303 223q-76 -33 -145.5 -32t-122.5 40q-51 39 -72.5 104.5t-13.5 147.5zM171 858.5q3 -16.5 15 -27.5q21 -14 50 -14q31 0 65.5 17.5t71.5 46t72.5 66.5t66.5 79q10 14 7 30.5 t-15 26.5q-14 10 -30.5 8.5t-27.5 -16.5q-78 -104 -138 -143t-72 -35q-14 10 -31 7t-27 -15q-10 -14 -7 -30.5zM465 754l364 -271q8 -8 23 -8q20 0 33 17q10 14 8 29.5t-16 25.5l-347 258q-16 -14 -32.5 -27.5t-32.5 -23.5zM829.5 239.5q1.5 -16.5 16.5 -26.5q29 -23 69 -23 q41 0 88.5 21.5t95.5 57.5t94 84.5t87 101.5q10 12 8 28.5t-16 26.5q-12 10 -28.5 8t-26.5 -16q-51 -68 -102.5 -116t-95.5 -75.5t-78 -36t-48 4.5q-14 10 -29.5 7t-25.5 -18q-10 -12 -8.5 -28.5z" />
173
+ <glyph unicode="&#xf08e;" d="M0 307v922q0 63 24.5 119.5t65.5 97.5t97.5 65.5t119.5 24.5h582q-2 -14 -4 -27.5t-2 -29.5v-88q0 -23 6 -48h-582q-47 0 -80.5 -33.5t-33.5 -80.5v-922q0 -47 33.5 -80.5t80.5 -33.5h1075q47 0 81 33.5t34 80.5v340q41 -31 90 -49t103 -20v-271q0 -63 -25 -118.5 t-67 -97.5t-97 -66.5t-119 -24.5h-1075q-63 0 -119.5 24.5t-97.5 66.5t-65.5 97.5t-24.5 118.5zM692.5 522q-0.5 25 16.5 41l770 772h-269q-25 0 -41 16.5t-16 41.5v86q-2 23 15.5 40t41.5 17h576q23 0 40 -17.5t17 -39.5v-86v-490q0 -25 -17.5 -42t-39.5 -15h-86 q-25 0 -41.5 16.5t-16.5 40.5v268l-772 -770q-16 -16 -40.5 -16t-41.5 16l-79 80q-16 16 -16.5 41z" />
174
+ <glyph unicode="&#xf090;" horiz-adv-x="1689" d="M0 584v368q0 33 22.5 54.5t55.5 21.5h428v293q0 41 37 57q39 14 67 -14l553 -553q16 -18 16.5 -44t-16.5 -42l-553 -553q-18 -18 -43 -18q-8 0 -24 4q-37 16 -37 57v291h-428q-33 0 -55.5 22.5t-22.5 55.5zM922 0v193h460q47 0 81 33.5t34 80.5v922q0 47 -33.5 80.5 t-81.5 33.5h-460v193h460q63 0 118.5 -24.5t97.5 -65.5t67 -97.5t25 -119.5v-922q0 -63 -25 -118.5t-67 -97.5t-97 -66.5t-119 -24.5h-460z" />
175
+ <glyph unicode="&#xf091;" horiz-adv-x="1689" d="M0 1042v187q0 33 22.5 54.5t55.5 21.5h323q-2 12 -2 25v24v4q0 53 4.5 88t15.5 54.5t31.5 27.5t55.5 8h678q33 0 54.5 -8t32.5 -27.5t15 -54.5t4 -88v-25.5t-2 -27.5h324q33 0 55.5 -21.5t22.5 -54.5v-187q0 -63 -45.5 -130.5t-122 -128t-180 -106.5t-222.5 -65 q-51 -10 -91 -41.5t-40 -70.5q0 -35 17.5 -51.5t39 -31t40 -31.5t22.5 -52q4 -23 -2 -47q-4 -14 23.5 -23.5t67.5 -18.5t82 -22.5t64 -34.5q12 -10 19.5 -39.5t9.5 -64.5q2 -33 -6 -58.5t-29 -25.5h-985q-20 0 -28.5 25.5t-6.5 58.5q2 35 9.5 64.5t19.5 39.5q23 20 64 34 t80.5 23t68.5 18t25 24q-4 14 -4 25.5v21.5q2 35 21.5 52t42 31.5t39.5 31t17 51.5q0 39 -39.5 70.5t-93.5 41.5q-117 20 -220 66.5t-180 106t-122 127t-45 130.5zM154 1042q0 -20 23.5 -54t67.5 -70.5t106.5 -71.5t140.5 -60q-25 80 -44.5 175.5t-33.5 189.5h-260v-109z M1198 786q78 25 140.5 60t106.5 71.5t67.5 70.5t23.5 54v109h-262q-12 -94 -31.5 -189.5t-44.5 -175.5z" />
176
+ <glyph unicode="&#xf092;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-337v25q0 39 2 97t-3.5 115.5t-24.5 104.5t-65 66q188 20 290 110t102 287q0 66 -22.5 128t-67.5 114q6 23 8 45t2 45 q0 41 -9.5 91t-31.5 85h-12q-43 2 -79 -8.5t-68 -27.5t-62.5 -37.5t-65.5 -39.5q-33 4 -65.5 6t-65.5 2t-65.5 -2t-65.5 -6q-35 18 -65.5 39t-62.5 38t-67.5 27.5t-79.5 8.5h-12q-23 -35 -32 -85t-9 -91q0 -23 2 -45.5t8 -44.5q-45 -51 -66.5 -114t-21.5 -128 q0 -193 95.5 -283t281.5 -112q-39 -16 -59.5 -50t-32.5 -75q-27 -8 -49.5 -15.5t-50.5 -7.5q-55 0 -88 28.5t-59.5 62.5t-56.5 62.5t-79 28.5q-4 0 -20.5 -2t-16.5 -12q0 -23 19.5 -32t31.5 -19q39 -31 56.5 -71t39 -76.5t62.5 -62.5t127 -26q35 0 80 11q0 -10 -1 -18.5 t-1 -16.5q0 -29 2 -59.5t-2 -59.5h-317q-80 0 -136.5 56.5t-56.5 136.5z" />
177
+ <glyph unicode="&#xf093;" d="M0 39v614q0 16 11.5 27.5t27.5 11.5h229q16 0 27.5 -11t11.5 -28v-346h1229v346q0 16 11.5 27.5t27.5 11.5h229q16 0 27.5 -11t11.5 -28v-614q0 -39 -39 -39h-1765q-39 0 -39 39zM346 969.5q-6 15.5 16 38.5l504 505q23 23 55.5 23t55.5 -23l506 -505q23 -23 15.5 -38.5 t-38.5 -15.5h-307v-499q0 -33 -22.5 -55.5t-55.5 -22.5h-307q-33 0 -54.5 22.5t-21.5 55.5v499h-307q-33 0 -39 15.5z" />
178
+ <glyph unicode="&#xf094;" horiz-adv-x="1609" d="M2 514q-2 35 1 68.5t7 74.5q4 35 7 72t10 66q14 66 30.5 128t44.5 117q20 41 45 81t54 79q10 14 21 24.5t24 20.5q23 23 45 45.5t49 42.5t57.5 36.5t65.5 33.5q33 16 67.5 29.5t71.5 27.5q70 29 156 51l2 2q45 12 85 17.5t79 5.5q59 0 112.5 -9t106.5 -20q41 -8 85 -15 t93 -7h2q29 0 62.5 5t66.5 5q25 0 45.5 -6t32.5 -25q23 -31 26 -71.5t-2 -75.5q-4 -35 -8 -71t2 -72q4 -23 11.5 -39.5t15.5 -36.5q8 -18 11 -40t7 -42q18 -104 15.5 -195.5t-23 -170.5t-56.5 -148.5t-81 -132.5q-37 -49 -79 -97.5t-92 -91.5t-110.5 -77.5t-134.5 -59.5 q-76 -27 -158.5 -34t-158.5 -11h-31q-104 0 -194.5 16.5t-192.5 16.5h-4q-35 0 -77 -10.5t-83 -12.5h-2q-37 0 -65.5 17.5t-42.5 42.5q-20 35 -17.5 72.5t12.5 68.5t10.5 66.5t-5 75.5t-12.5 81t-9 82z" />
179
+ <glyph unicode="&#xf095;" horiz-adv-x="1597" d="M0 1169q0 55 14.5 114.5t43 114t68.5 98.5t93 69q12 -2 26.5 0t26.5 2q10 0 30 -1l40 -2t38.5 -4.5t27.5 -7.5q8 -6 15 -18t12 -26.5t9.5 -30t8.5 -25.5q6 -18 23.5 -65.5t35.5 -97.5t32.5 -93t14.5 -53q0 -37 -24.5 -68t-54 -57.5t-54.5 -50t-25 -45.5q0 -20 16.5 -49 t26.5 -46q84 -145 188.5 -248.5t252.5 -187.5q18 -10 45.5 -27.5t50.5 -17.5t52.5 32t60 70.5t62 70.5t58.5 32q10 0 51.5 -22.5t89.5 -50t93 -55.5t61 -36q16 -10 46 -25.5t40 -35.5q2 -6 2 -23q0 -16 -3 -36.5t-8 -43t-12 -43t-13 -35.5q-18 -39 -59.5 -71.5t-92.5 -55 t-104.5 -36t-92.5 -13.5q-80 0 -153.5 25.5t-145.5 54.5q-123 45 -232.5 118t-203.5 164t-175 196.5t-144 215.5q-25 41 -52.5 95.5t-51 112t-39 113.5t-15.5 105z" />
180
+ <glyph unicode="&#xf096;" d="M0 307v922q0 63 24.5 118.5t66.5 97.5t97.5 66.5t118.5 24.5h1075q63 0 118.5 -24.5t97.5 -66.5t67 -97.5t25 -118.5v-922q0 -63 -25 -118.5t-67 -97.5t-97 -66.5t-119 -24.5h-1075q-63 0 -118.5 24.5t-97.5 66.5t-66.5 97.5t-24.5 118.5zM193 307q0 -47 33.5 -80.5 t80.5 -33.5h1075q47 0 81 33.5t34 80.5v922q0 47 -34 80.5t-81 33.5h-1075q-47 0 -80.5 -33.5t-33.5 -80.5v-922z" />
181
+ <glyph unicode="&#xf097;" horiz-adv-x="1253" d="M0 84v1337q0 47 34 81t81 34h1024q47 0 80.5 -34t33.5 -81v-1337q0 -47 -33.5 -81t-80.5 -34t-80 33l-432 432l-432 -432q-33 -33 -80 -33t-81 34t-34 81zM158 186l469 471l469 -471v1194h-938v-1194z" />
182
+ <glyph unicode="&#xf098;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-1150q-80 0 -136.5 56.5t-56.5 136.5zM193 1040q2 -35 15 -76.5t30 -78.5q16 -37 33.5 -72t33.5 -63q74 -129 176.5 -241 t225.5 -190q31 -18 67.5 -36.5t75.5 -32.5q41 -16 83 -31.5t81 -21.5q63 -10 112.5 2t90.5 34q27 12 57.5 33.5t44.5 52.5q4 8 9 27t9 38t6.5 37.5t-2.5 29.5q-4 12 -24.5 22t-36.5 21q-43 25 -71.5 41t-67.5 38q-16 10 -36 23.5t-38 13.5q-23 0 -46.5 -27.5t-37.5 -43.5 q-12 -14 -36.5 -43t-47.5 -31q-14 -2 -32.5 10t-37.5 23q-106 59 -182 136t-135 177q-10 16 -21.5 37.5t-7.5 38.5q2 18 24.5 33.5t35.5 29.5q14 16 31.5 37t19.5 43q4 16 -5 38t-16 42q-16 43 -28.5 76t-26.5 76q-6 16 -12 40.5t-21 30.5q-8 4 -26.5 7t-39 4.5t-37.5 0 t-24 -1.5h-8q-33 -16 -62.5 -45.5t-51 -69.5t-34 -88t-9.5 -100z" />
183
+ <glyph unicode="&#xf099;" d="M0 399q0 20 13.5 33.5t33.5 13.5q14 0 31 -12q123 -109 287 -108q59 0 117.5 15t107.5 48q-29 16 -47.5 42t-18.5 58q0 23 8 39q-18 6 -44.5 20.5t-51 34t-41 43t-16.5 46.5q0 16 10 28.5t25 22.5q-41 25 -76 74t-35 98q0 33 33 43q-35 35 -55.5 81t-20.5 95 q0 23 9.5 41.5t37.5 18.5q18 0 84 -27t142.5 -60.5t146.5 -67.5t98 -48q25 -14 47.5 -31.5t44.5 -36.5q20 51 47 106.5t60 106.5t73 96t89 74q8 6 24 6q18 0 27 -8q16 6 41.5 13.5t42.5 7.5q29 0 43 -27q31 0 56.5 -15.5t25.5 -50.5q0 -31 -27 -53q96 -43 159.5 -125 t90.5 -182q6 -2 23 -2q47 0 88 16.5t57 16.5q18 0 31.5 -14.5t13.5 -32.5q0 -23 -19.5 -48.5t-33.5 -39.5q23 4 42 -7.5t19 -38.5q0 -29 -26.5 -50t-61.5 -37.5t-72.5 -25.5t-58.5 -11q-43 -139 -133 -246t-210 -178.5t-258 -109.5t-275 -38q-219 0 -415 93.5t-325 273.5 q-8 16 -8 26z" />
184
+ <glyph unicode="&#xf09a;" horiz-adv-x="790" d="M0 862v203q0 16 11.5 28.5t27.5 12.5h125v102q0 358 366 359q123 0 232 -31q33 -10 29 -43l-27 -199q-4 -16 -16 -26q-16 -10 -31 -6q-35 8 -72.5 12t-66.5 4q-53 0 -65.5 -16.5t-12.5 -67.5v-88h223q14 0 29 -14q10 -10 10 -29l-17 -205q0 -16 -11 -25.5t-27 -9.5h-207 v-784q0 -16 -11.5 -27.5t-27.5 -11.5h-258q-16 0 -27.5 11.5t-11.5 27.5v784h-125q-16 0 -27.5 11.5t-11.5 27.5z" />
185
+ <glyph unicode="&#xf09b;" horiz-adv-x="1847" d="M0 743q0 115 37 222.5t113 193.5l-3 4l3 2q-16 39 -21.5 81t-5.5 85q0 25 2 56.5t8 65.5t15.5 63.5t23.5 50.5h8q61 0 110.5 -12.5t94.5 -35t87 -52t91 -60.5q86 25 178.5 33t182.5 8t182 -8t180 -33q47 31 90 60.5t87 52t93.5 35t110.5 12.5h10q12 -20 21.5 -50 t15.5 -64t9 -65.5t3 -56.5q0 -43 -6 -85t-20 -81v-2l-2 -4q76 -86 112.5 -193.5t36.5 -222.5q0 -233 -66.5 -383.5t-188.5 -236.5t-292 -120t-376 -34q-207 0 -378 34t-292 120t-187.5 236.5t-66.5 383.5zM250 483q0 -145 64.5 -224t165 -116t219 -43t227.5 -6q74 0 152.5 2 t153.5 12.5t142.5 34t117.5 67.5t80 111.5t30 165.5q0 84 -27 147.5t-75 106.5t-114.5 64.5t-146.5 21.5q-78 0 -156.5 -7t-156.5 -7t-157 7t-157 7q-162 0 -262 -87t-100 -257zM494 524q0 66 26.5 113t65.5 47t66.5 -47t27.5 -113t-27.5 -112.5t-66.5 -46.5t-65.5 46.5 t-26.5 112.5zM795 258q-6 16 12 25q16 6 24 -13q27 -76 93 -75q31 0 56.5 20.5t35.5 54.5q8 20 26 13q16 -6 13 -25q-16 -47 -51 -75.5t-80 -28.5q-43 0 -78 28.5t-51 75.5zM864 369q0 -12 17.5 -21.5t42.5 -9.5t42 9.5t17 21.5t-17.5 21t-41.5 9q-25 0 -42.5 -9t-17.5 -21z M1167 524q0 -66 28 -112.5t67 -46.5t65.5 46.5t26.5 112.5t-27 113t-65 47q-39 0 -67 -47t-28 -113z" />
186
+ <glyph unicode="&#xf09c;" horiz-adv-x="1880" d="M0 117v626q0 49 35 84t82 35h665v156q0 113 43 213t118 175t175 118t213 43t213.5 -43t175 -118t117.5 -175.5t43 -212.5v-152q0 -33 -22.5 -55.5t-55.5 -22.5h-80q-33 0 -55 23t-22 55v152q0 66 -25 123t-67 99t-99 66.5t-123 24.5t-122 -24.5t-99 -66.5t-67.5 -99.5 t-24.5 -122.5v-156h119q47 0 81.5 -34.5t34.5 -84.5v-626q0 -47 -34.5 -82t-81.5 -35h-1020q-47 0 -82 35t-35 82zM494 164h266l-66 285q29 18 47.5 48.5t18.5 65.5q0 55 -39 95t-94 40t-94 -40t-39 -95q0 -35 18 -65.5t47 -46.5z" />
187
+ <glyph unicode="&#xf09d;" d="M0 154v1228q0 63 45 108.5t109 45.5h1536q63 0 108 -45t45 -109v-1228q0 -63 -45 -108.5t-108 -45.5h-1536q-63 0 -108.5 45t-45.5 109zM154 154h1536v575h-1536v-575zM154 1114h1536v268h-1536v-268zM260 250v115h307v-115h-307zM676 250v115h446v-115h-446z" />
188
+ <glyph unicode="&#xf09e;" horiz-adv-x="1566" d="M0 236q0 49 18.5 91t50 74.5t75 51t92.5 18.5t91 -18.5t74.5 -51t51 -74.5t18.5 -91t-18.5 -92.5t-51 -75t-74.5 -50t-91 -18.5t-92.5 18.5t-75 50t-50 74.5t-18.5 93zM0 819v158q0 35 25 57q23 23 53 23q2 0 3 -1t3 -1q193 -14 362.5 -95t301 -212.5t212 -301.5 t95.5 -362q4 -35 -21 -59q-23 -25 -57 -25h-158q-29 0 -51.5 20.5t-26.5 51.5q-12 133 -68.5 249.5t-145.5 205.5t-205.5 145.5t-249.5 68.5q-31 4 -51.5 27t-20.5 51zM0 1331v158q0 33 25 55q23 23 53 23h4q301 -16 565 -137t463 -320t319.5 -463t137.5 -565q4 -31 -23 -57 q-23 -25 -55 -25h-158q-31 0 -53.5 21.5t-24.5 52.5q-14 238 -110 446.5t-255 367.5t-368 255t-446 110q-31 2 -52.5 24.5t-21.5 53.5z" />
189
+ <glyph unicode="&#xf0a0;" d="M0 193v382q0 23 6 45.5t12 45.5l238 727q20 63 75.5 103t121.5 40h938q66 0 121 -40t75 -103l238 -727q6 -23 12 -45.5t6 -45.5v-382q0 -41 -15.5 -76t-41 -60.5t-61 -41t-74.5 -15.5h-1458q-80 0 -136.5 56.5t-56.5 136.5zM154 193q0 -16 11 -27.5t28 -11.5h1458 q16 0 27.5 11t11.5 28v382q0 16 -11.5 27.5t-27.5 11.5h-1458q-16 0 -27.5 -11t-11.5 -28v-382zM213 768h1417l-188 578q-4 16 -19.5 26t-31.5 10h-938q-16 0 -31.5 -10t-20.5 -26zM1057 385q0 39 27.5 66.5t68.5 27.5q39 0 66.5 -27.5t27.5 -66.5q0 -41 -27.5 -68.5 t-66.5 -27.5q-41 0 -68.5 27.5t-27.5 68.5zM1364 385q0 39 27.5 66.5t68.5 27.5q39 0 66.5 -27.5t27.5 -66.5q0 -41 -27.5 -68.5t-66.5 -27.5q-41 0 -68.5 27.5t-27.5 68.5z" />
190
+ <glyph unicode="&#xf0a1;" d="M0 754v229q0 63 45 108.5t109 45.5h499q115 0 245 33.5t255 90t235.5 128t186.5 147.5q63 0 108.5 -45t45.5 -109v-368q49 -12 81.5 -52.5t32.5 -93.5t-32.5 -93t-81.5 -52v-369q0 -63 -45.5 -108t-108.5 -45q-68 68 -164 132t-206.5 117.5t-227.5 91.5t-227 50 q-43 -12 -70 -40t-37 -62.5t-2 -70.5t37 -65q-25 -41 -23 -75.5t20.5 -66.5t49.5 -61.5t66 -58.5q-20 -43 -69.5 -65.5t-106 -25.5t-110.5 10.5t-85 43.5q-18 61 -40 125t-36 130.5t-14 138t24 151.5h-200q-63 0 -108.5 45t-45.5 109zM807 741q102 -16 206.5 -49t205 -78 t191.5 -99t165 -112v930q-76 -59 -166 -113.5t-190.5 -98.5t-205 -77.5t-206.5 -48.5v-254z" />
191
+ <glyph unicode="&#xf0a2;" horiz-adv-x="1759" d="M0 317q104 78 172 172.5t109 201t60 224t28 240.5q6 84 56 159t126 131t163 89t167 33q74 0 163 -33t165.5 -88t129 -129t52.5 -158q6 -121 27.5 -239.5t63.5 -227t109.5 -204t167.5 -171.5q-4 -70 -56 -114.5t-120 -44.5h-469q-18 -82 -82.5 -135.5t-150.5 -53.5 t-151.5 53.5t-84.5 135.5h-469q-68 0 -120 45t-56 114zM238 317h1284q-78 86 -129.5 183.5t-84 202t-50 214t-25.5 222.5q-4 55 -41 104t-89 86t-111.5 57.5t-110.5 20.5q-47 0 -107.5 -21.5t-114 -56.5t-91.5 -83t-40 -99q-6 -111 -23.5 -222.5t-51 -218t-87 -205 t-128.5 -184.5zM713 209q0 -70 49 -119t119 -49q18 0 18 20t-18 21q-53 0 -91 37t-38 90q0 20 -19 20q-20 0 -20 -20z" />
192
+ <glyph unicode="&#xf0a3;" horiz-adv-x="1597" d="M0 573q0 33 23 56l143 139l-143 139q-23 23 -23 56q0 25 16.5 45t40.5 26l195 49q-6 18 -15.5 48t-18.5 61t-16 59.5t-7 46.5q0 31 21.5 52.5t51.5 21.5q18 0 47 -7t60 -16.5t60.5 -18.5t47.5 -15l49 194q6 25 27 41.5t45 16.5q35 0 53 -23l142 -143l139 143q23 23 53 23 q27 0 47.5 -15.5t26.5 -42.5l49 -194q18 6 48 15t60.5 18.5t59.5 16.5t47 7q29 0 51.5 -21.5t22.5 -52.5q0 -18 -7 -46.5t-16.5 -59.5t-18.5 -60.5t-15 -48.5l194 -49q25 -6 41 -26.5t16 -44.5q0 -33 -22 -56l-145 -139l145 -139q23 -23 22 -56q0 -25 -16 -45t-41 -26 l-194 -49q6 -18 15 -48t18.5 -61t16.5 -59.5t7 -46.5q0 -29 -21.5 -51.5t-52.5 -22.5q-18 0 -47 7t-59.5 16.5t-60 18.5t-48.5 15l-49 -194q-6 -25 -26.5 -41.5t-45.5 -16.5q-33 0 -55 23l-139 143l-142 -143q-18 -23 -53 -23q-25 0 -45 16.5t-27 41.5l-49 194 q-18 -6 -47.5 -15t-60.5 -18.5t-59.5 -16.5t-47.5 -7q-31 0 -52 22.5t-21 51.5q0 18 7 46.5t16 59.5t18.5 60.5t15.5 48.5l-195 49q-25 6 -41 26.5t-16 44.5z" />
193
+ <glyph unicode="&#xf0a4;" horiz-adv-x="1916" d="M0 193v643q0 49 35 83.5t84 34.5h348q27 14 42 30.5t34 39.5q16 20 33.5 38.5t33.5 37.5q35 35 77 68.5t65 74.5q25 43 29.5 99.5t17 106.5t44 84t109.5 34q61 0 111.5 -25.5t85.5 -68.5t54.5 -98.5t19.5 -112.5q0 -53 -15.5 -104.5t-38.5 -98.5h134l376 -2 q49 0 93.5 -17.5t76 -49.5t50 -75t18.5 -94q0 -49 -18.5 -92t-50 -74.5t-75.5 -49t-94 -17.5h-200q-10 -59 -39 -107q10 -59 -7.5 -117.5t-56.5 -103.5q0 -76 -28.5 -131t-75.5 -90t-109.5 -52.5t-132.5 -17.5q-78 0 -148.5 16.5t-136 36t-128 36t-123.5 16.5h-375 q-49 0 -84 34.5t-35 84.5zM233 276q0 -35 22.5 -57t57.5 -22q33 0 56.5 22.5t23.5 56.5q0 33 -23.5 56.5t-56.5 23.5q-35 0 -57.5 -23.5t-22.5 -56.5zM489 193q70 0 136.5 -16.5t133 -35t133 -35t138.5 -16.5q43 0 84 8t72 27.5t50 52.5t19 82q0 14 -1 26.5t-3 24.5 q35 16 53.5 53t18.5 74q0 39 -20 68q59 49 59 123q0 23 -12.5 43.5t-26.5 34.5q90 0 178 1t178 1q51 0 84 30.5t33 81.5q0 53 -32.5 85t-84.5 32q-172 0 -340 1t-338 1q0 41 16.5 78t35 74.5t34 78.5t15.5 91q0 33 -10.5 65.5t-29 59t-46 44t-64.5 17.5h-11t-11 -2 q-8 -4 -9 -8t-3 -13q-12 -59 -22.5 -123.5t-39.5 -117.5q-29 -51 -73 -88t-85 -78q-29 -31 -49 -56.5t-41.5 -48t-48.5 -42t-65 -35.5h-5v-643z" />
194
+ <glyph unicode="&#xf0a5;" horiz-adv-x="1916" d="M0 821q0 51 18.5 94t50 75t75.5 49.5t94 17.5l376 2h134q-23 47 -38.5 98t-15.5 105q0 57 19.5 112.5t54.5 98.5t85 68.5t112 25.5q78 0 109.5 -34t43.5 -84t17.5 -106.5t29.5 -99.5q23 -41 65 -74.5t77 -68.5q16 -18 33.5 -37t33.5 -39q18 -23 33.5 -39t42.5 -31h348 q49 0 84 -34.5t35 -83.5v-643q0 -49 -35 -84t-84 -35h-375q-61 0 -123.5 -16.5t-128 -36t-136 -36t-148.5 -16.5q-70 0 -132.5 17.5t-109.5 52.5t-75.5 90t-28.5 131q-39 45 -56.5 103.5t-7.5 117.5q-29 47 -39 107h-200q-49 0 -93.5 17.5t-76 49t-50 74.5t-18.5 92z M121 821q0 -51 32.5 -81.5t84.5 -30.5q90 0 178 -1t178 -1q-14 -14 -26.5 -35t-12.5 -43q0 -74 59 -123q-20 -29 -20 -68q0 -37 18.5 -73.5t53.5 -53.5q-2 -12 -3 -24.5t-1 -26.5q0 -49 19 -82t50 -52.5t72 -27.5t84 -8q70 0 137.5 16.5t134 35t133 35t135.5 16.5v643h-4 q-41 16 -66.5 35.5t-47 42t-42 48t-48.5 56.5q-41 41 -85 78t-73 88q-29 53 -39 117.5t-23 123.5q-2 8 -3 12.5t-9 8.5q-4 2 -11 2h-11q-37 0 -65 -17.5t-46 -44t-28.5 -59.5t-10.5 -65q0 -49 15.5 -90.5t34 -79t34.5 -74.5t16 -78q-170 0 -337.5 -1t-339.5 -1 q-51 0 -84 -32t-33 -85zM1524 276q0 -35 23.5 -57t56.5 -22q35 0 57 22.5t22 56.5q0 33 -22.5 56.5t-56.5 23.5q-33 0 -56.5 -23.5t-23.5 -56.5z" />
195
+ <glyph unicode="&#xf0a6;" horiz-adv-x="1597" d="M0 602q0 61 25.5 111.5t68.5 85.5t98.5 54t112.5 19q53 0 104.5 -15t98.5 -38v133l2 377q0 49 17.5 93t49 76t74.5 50.5t94 18.5q49 0 92.5 -18.5t75 -50.5t49 -76t17.5 -93v-201q59 -10 106 -38q59 10 118 -7.5t104 -56.5q76 0 131 -28.5t90 -76t52 -109.5t17 -132 q0 -78 -16 -148.5t-35.5 -136t-36 -128t-16.5 -124.5v-374q0 -49 -35 -84t-84 -35h-643q-49 0 -84 34.5t-35 84.5v348q-14 27 -30.5 42t-38.5 34q-20 16 -39 33.5t-37 33.5q-35 35 -68.5 77t-74.5 64q-43 25 -99.5 30t-106.5 17.5t-84 44t-34 109.5zM120 591q-1 -7 1 -11 q4 -8 8 -9.5t12 -3.5q59 -12 124 -22t118 -39q51 -29 88 -73t78 -85q31 -29 56.5 -49t48 -41.5t42 -48.5t35.5 -66v-4h643q0 70 16.5 136.5t35 133t35 133t16.5 138.5q0 43 -8.5 84t-28 71.5t-52 50t-81.5 19.5q-14 0 -26.5 -1t-25.5 -3q-16 35 -53 53.5t-74 18.5 q-39 0 -67 -21q-49 59 -123 60q-23 0 -43.5 -12.5t-34.5 -26.5q0 90 -1 178t-1 178q0 51 -30.5 84t-82.5 33q-53 0 -84.5 -33t-31.5 -84q0 -172 -1 -340t-1 -338q-41 0 -78 16.5t-75 35t-79 34t-90 15.5q-33 0 -65.5 -10.5t-59 -29t-43 -46t-16.5 -64.5q0 -4 -1 -11z M1210 -37q0 -35 23.5 -57.5t56.5 -22.5q35 0 57.5 22.5t22.5 57.5q0 33 -22.5 56.5t-57.5 23.5q-33 0 -56.5 -23.5t-23.5 -56.5z" />
196
+ <glyph unicode="&#xf0a7;" horiz-adv-x="1597" d="M0 584q0 78 34 109.5t84 44t106.5 17.5t99.5 29q41 23 74.5 65t68.5 77q18 16 36.5 33.5t39.5 33.5q23 18 39 33.5t30 42.5v348q0 49 35 84t84 35h643q49 0 84 -35t35 -84v-375q0 -61 16.5 -123.5t36 -128t35.5 -136t16 -148.5q0 -70 -17 -132.5t-52 -109.5t-90.5 -75.5 t-130.5 -28.5q-45 -39 -103.5 -56.5t-118.5 -7.5q-47 -29 -106 -39v-200q0 -49 -17.5 -93.5t-49 -76t-74.5 -50t-93 -18.5q-51 0 -94 18.5t-74.5 50t-49 75.5t-17.5 94l-2 376v134q-47 -23 -98.5 -38.5t-104.5 -15.5q-57 0 -112.5 19.5t-98.5 54.5t-68.5 85t-25.5 112z M120 595q1 -7 1 -11q0 -37 16.5 -64.5t43 -46t59 -29t65.5 -10.5q49 0 90 15.5t79 34t75 35t78 16.5q0 -170 1 -338t1 -340q0 -51 31.5 -84t84.5 -33q51 0 82 32.5t31 84.5q0 90 1 178t1 178q14 -14 34.5 -26.5t43.5 -12.5q74 0 123 59q29 -20 67 -20q37 0 74 18.5t53 53.5 q12 -2 24.5 -3t27.5 -1q49 0 81.5 19t52 50t28 72t8.5 84q0 70 -16.5 137.5t-35 134t-35 133t-16.5 136.5h-643v-5q-16 -41 -35.5 -66.5t-42 -47t-48 -42t-56.5 -48.5q-41 -41 -78 -85t-88 -73q-53 -29 -117.5 -39t-124.5 -23l-12 -3t-8 -9q-2 -4 -1 -11zM1210 1223 q0 -33 23.5 -56.5t56.5 -23.5q35 0 57.5 23.5t22.5 56.5q0 35 -22.5 57.5t-57.5 22.5q-33 0 -56.5 -23t-23.5 -57z" />
197
+ <glyph unicode="&#xf0a8;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -29 20 -49l490 -490q20 -20 48.5 -20t49.5 20l74 74q20 20 20 48 t-20 50l-246 246h612q29 0 49.5 19.5t20.5 48.5v104q0 29 -20.5 49.5t-49.5 20.5h-612l246 246q20 20 20 48.5t-20 49.5l-74 74q-20 20 -48 20t-50 -20l-490 -490q-20 -20 -20 -49z" />
198
+ <glyph unicode="&#xf0a9;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 717q0 -29 20.5 -49.5t48.5 -20.5h613l-246 -246q-20 -20 -20.5 -48.5 t20.5 -49.5l74 -74q20 -20 47.5 -20t50.5 20l489 490q20 20 20.5 49t-20.5 49l-489 490q-20 20 -49 20t-49 -20l-74 -74q-20 -20 -20.5 -48t20.5 -50l246 -246h-613q-29 0 -49 -19.5t-20 -48.5v-104z" />
199
+ <glyph unicode="&#xf0aa;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 768q0 -29 20 -49l74 -74q20 -20 48 -20t50 20l246 246v-612q0 -29 19.5 -49.5 t47.5 -20.5h105q29 0 49.5 20.5t20.5 49.5v612l245 -246q20 -20 49 -20t50 20l73 74q20 20 20.5 48t-20.5 50l-489 490q-20 20 -49 20t-49 -20l-490 -490q-20 -20 -20 -49z" />
200
+ <glyph unicode="&#xf0ab;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5t-311.5 62.5t-254 171t-171 254t-62.5 311.5zM240 769q0 -28 20 -50l490 -490q20 -20 48.5 -20t49.5 20l489 490q20 20 20.5 49 t-20.5 49l-73 74q-20 20 -48 20t-51 -20l-245 -246v612q0 29 -19.5 49.5t-48.5 20.5h-104q-29 0 -49.5 -20.5t-20.5 -49.5v-612l-246 246q-20 20 -49 20t-49 -20l-74 -74q-20 -20 -20 -48z" />
201
+ <glyph unicode="&#xf0ac;" horiz-adv-x="1597" d="M0 768q0 162 63.5 307.5t173 255t254 173t308.5 63.5q162 0 307 -63.5t254.5 -173t173 -255t63.5 -307.5q0 -164 -63.5 -308.5t-173 -254t-254.5 -173t-307 -63.5q-164 0 -308.5 63.5t-254 173t-173 254t-63.5 308.5zM186 1141h4q4 0 12.5 3t8.5 -9q0 -4 -3 -10.5 t11 -6.5q4 0 5 6t3 0l4 -16v-2q0 -4 -5 -6t-3 -6q4 -4 9.5 -4h9.5l4 2l2 2q0 -6 6 -8.5t10 -2.5h2q0 -2 -4 -4t0 -6l23 -4v-2l14 -29q0 -4 -3 -10t-7 -6t-3 3t1 7t-2 7t-15 3q-2 0 -5 -1t-1 -5l12 -26l3 -2l2 -2q-10 0 -13.5 -24t-3.5 -34l4 -18l2 -6v-4l-4 -19l29 -43h6 q2 -4 -2 -8t-2 -8l8 -8q0 -10 4 -14.5t13 -12.5q-2 -12 20.5 -22.5t28.5 -14.5q8 -23 20 -45.5t29 -38.5l2 -14q0 -2 -5 -4t-1 -6l16 -7q4 4 10.5 -8t10.5 -16l-2 -6l12 -17l6 -2l4 8q-4 10 -14 26.5t-20.5 32t-17.5 28t-7 14.5t-2 16t-4 17q6 -4 15 -7.5t15 -7.5 q4 -25 19.5 -40t27.5 -34q-4 -4 0 -5t7 -1q4 -4 4 -14q14 -16 36.5 -44t22.5 -44v-2l-4 -14q6 -16 20.5 -25.5t28.5 -15.5h4q20 -10 41 -21.5t43 -19.5l23 14q8 -2 17 -10t20.5 -18.5t27 -19.5t35.5 -11q14 10 14 -5v-4l25 -30l4 -15q10 -6 20.5 -15t16.5 -20h4 q10 0 16.5 -9t16.5 -9q6 0 6 6q0 14 2 18.5t5 5.5t6 1t3 4l-4 6q-4 0 -6 -5t-6 -1l-14 -8l-17 4l-24 41l8 57q2 4 -7.5 9t-5.5 10q-14 8 -34 8q-4 0 -20.5 -3t-16.5 3t3 16t7 21.5t6 19.5t2 10l13 27l-3 4l-16 4q-4 0 -13 -6t-17.5 -14.5t-14.5 -16.5t-6 -14l-45 -10 q-14 0 -23 12q-4 16 -17 35.5t-13 34.5q0 23 8 43t-6 43q2 0 5 2t1 6l12 14l2 2l2 -2q14 10 37 7t29 14l16 -13q4 -2 9 4.5t5 10.5l-8 4l39 10l2 -6l19 2l22 -14q4 0 8 5t9 1l20 -21q-4 -8 -1 -12t3 -8q0 -6 10.5 -27.5t18.5 -21.5q10 0 9 13t-1 17q0 20 -8 39t-15 39v6 q0 10 12.5 17.5t12.5 9.5q10 8 22.5 16t18.5 19l8 16v10h6t4 6q0 2 -3 3.5t-7 5.5q-4 2 -8 6l6 4q4 6 6 15t-2 16l15 8q-2 -6 4 -8t10 0l10 16q-4 10 -5 7t5 7q10 4 19.5 9.5t19.5 5.5q2 -2 4 -2q6 0 6 2q0 10 -4 12l12 25q14 0 21 12l18 2q6 2 6 8v2l35 10l4 11l-10 14 q2 0 2 4t-4 6t-7 4t-7 4l-4 -2l4 2h6h13t9 9q0 12 -14 12q-18 0 -41.5 -8.5t-32.5 -28.5l-14 -8l18 18l3 6q0 4 -9.5 5.5t-5.5 1.5q18 0 27.5 4t15.5 9t12.5 10t18.5 9q23 -4 44 -2t44 2q6 4 12 8.5t8 10.5l23 4q4 -4 12 2t8 10q0 10 -11 13t-11 14q0 2 1 6t-3 4 q-6 0 -19.5 -6t-19.5 -10q-4 -2 -5 1t-1 7l2 -2l8 4l23 8l4 4q0 6 -7.5 8t-11.5 2t-12 -3t-8 3l2 4q-12 10 -21.5 22.5t-9.5 16.5t1 8.5t-5 4.5q-4 0 -7 -1t-3 5q0 4 -5 17t-14 13l-8 -8q0 -6 -6 -9t-6 -7h-4l-21 -12q-2 4 -5 2t-7 -2h-2l-2 -2q8 0 7 9t-7 9l-16 -4 q-4 0 -4.5 1t2 4t4.5 7t0 8t-6.5 1t-4.5 1h6l5 5q2 2 -1.5 7t-5.5 7l-22 4l-14 12q-2 -2 -7.5 3t-9.5 7l-16 -6l-39 9q-4 0 -8 -2.5t-4 -6.5t4 -6t4 -6t3 -21.5t-5 -13.5l-10 -14q2 -4 7 -7t10 -7.5t9 -10.5t2 -18l-45 -31v-4q0 -8 4 -15t8 -18q10 -4 9.5 -7t-7 -6t-12.5 -6 t-6 -5t-4 -2h-8h-4q0 2 2 3t2 5l-19 12v-2l-8 16q4 10 1 14.5t-3 10.5q0 16 -14.5 16t-30.5 -4q4 2 -1 6.5t-7 4.5q-16 0 -38 14t-36 14q-6 0 -14 -2t-15 -4q4 2 5 10l-13 23l-2 2q-6 0 -14 -5t-8 9q0 2 2 4t0 4q-2 12 5 20.5t11 18.5q4 4 4 8t4 4q8 0 15.5 4.5t17.5 6.5 l2 6q0 4 -21.5 7t-21.5 7l2 2q20 -6 30.5 -7t17.5 2t16.5 8t29.5 14q0 4 -21.5 8t-27.5 8h12q4 0 10.5 -2t10.5 -4q0 -4 6 -5t10 -1l15 10v6l-4 6l22 4q-2 2 1 4t5 2q6 0 12.5 -6t8.5 -6l20 8q-2 2 5.5 3t4.5 6l-14 16q-2 0 -3 3t1 3q10 0 6 10q-8 4 -17 9.5t-20 5.5 q-4 0 -9 -2t-5 -7q0 -4 5 -4t7 -4q4 -4 -2 -4t-6 -2q-8 0 -15 -12t-18 -17q-4 0 -3 2.5t-1 4.5q-2 4 -7 5t-5 5t5 13t-13 9q-8 0 -11.5 -6t-7.5 -12l-22 25l-17 2q0 8 3.5 14t-9.5 16q-6 4 -11 7.5t-11 3.5q-2 0 -9.5 -4.5t-13.5 -8.5t-6 -8t10 -4h-2q-6 0 -6 -8 q0 -2 9.5 -5t13.5 -3q4 2 6 -1.5t6 -3.5l8 3v-5q-2 -2 -2 -4l2 -8l-20 -10q-2 -2 -4 -2t-5 -2q0 -6 5.5 -12.5t-11.5 -6.5l-6 4q0 8 -16.5 13.5t-40 7.5t-47 3t-35.5 1l-33 -10l8 -19q-4 0 -5 -3t3 -5q-4 4 -15 14.5t-15 10.5l-17 4q-35 -2 -78 -33t-84 -72t-75.5 -84 t-53.5 -71zM471 674h2h-2zM487 1413q14 2 25.5 8t24.5 6l6 -4q6 -2 11 -2t9 -4q8 2 17 -2l6 4v8l-2 5l6 -2q6 0 12 10l-2 4q-4 2 -10 4t-10 2t-16.5 -5t-28 -11.5t-29.5 -12.5t-19 -8zM918 86q0 -4 3 -9t3 -9q0 -5 -2 -7q115 20 217 74.5t182 140.5h-2q-8 -4 -14 0l-5 -4 l-12 4h-4l-4 -8l2 8q-6 8 -14 15l-4 2q-4 0 -4 -8q2 16 -8.5 27.5t-26.5 11.5q0 -2 -2 -2h-4l-5 4h7l4 12l-11 8l-2 -2q-14 2 -20 16l-4 2l-2 -2l-4 -2q-12 -4 -21 -8q-12 4 -18 10l-27 -2q0 6 -4 12.5t-12 6.5q-10 0 -20.5 -2t-14.5 -13q0 -4 2 -8t4 -6v-8l-2 -6l-4 -2h-2 l-6 16l6 10q-2 4 -2 10.5t-2 10.5l-2 4h-6l-15 -10h-8l-4 -4q-2 -2 -2 -4t-2 -3l-2 3h-8q-8 -8 -9 -19l3 -4l-9 -6l-2 -4l-6 -4q0 -2 -1 -2t-1 -2v-2v-9l-2 -2v4l-2 2q-2 12 -23 21h-6v-4q2 -6 8.5 -10.5t10.5 -8.5q-2 2 -5 1t-3 -3v-4l14 -20v-39l4 -10q-4 -16 -16 -27v2 l-4 -2l-3 -2l-2 -10l2 -2v-2l-4 4l-2 -13l-12 -4q-6 -4 -5 -11t-5 -11l2 -4l-6 -6q0 -4 -1 -6.5t-1 -6.5l2 -14l6 -4l4 4l2 6l2 -12q0 -4 -4 -8q-6 -4 -12 -9.5t-6 -15.5z" />
202
+ <glyph unicode="&#xf0ad;" horiz-adv-x="1593" d="M8 242q0 33 12.5 62.5t34.5 51.5l609 609q-16 66 -17 122q0 98 38 186.5t102.5 153t151.5 102.5t185 38q94 0 181.5 -36t154.5 -101l-442 -162l-43 -236l184 -153l443 159q-10 -92 -50.5 -171t-104 -137t-145 -91t-174.5 -33q-61 0 -127 17l-606 -607q-47 -47 -112 -47 q-68 0 -115 47q-23 23 -50.5 47.5t-52 52t-41 58.5t-16.5 68zM203 242q0 -33 22.5 -56.5t57.5 -23.5q33 0 56 23.5t23 56.5q0 35 -23.5 57.5t-55.5 22.5q-35 0 -57.5 -23t-22.5 -57z" />
203
+ <glyph unicode="&#xf0ae;" d="M0 76v217q0 31 22.5 53.5t53.5 22.5h1689q33 0 55.5 -22.5t22.5 -53.5v-217q0 -31 -22.5 -53.5t-55.5 -22.5h-1689q-31 0 -53.5 22.5t-22.5 53.5zM0 662v215q0 31 22.5 53t53.5 22h1689q33 0 55.5 -22.5t22.5 -52.5v-215q0 -33 -22.5 -55.5t-55.5 -22.5h-1689 q-31 0 -53.5 22.5t-22.5 55.5zM0 1243v217q0 31 22.5 53.5t53.5 22.5h1689q33 0 55.5 -22.5t22.5 -53.5v-217q0 -31 -22.5 -53.5t-55.5 -22.5h-1689q-31 0 -53.5 22.5t-22.5 53.5zM752 692h999v154h-999v-154zM1059 109h692v153h-692v-153zM1366 1274h385v153h-385v-153z " />
204
+ <glyph unicode="&#xf0b0;" horiz-adv-x="1566" d="M0 1458q0 33 22.5 55.5t55.5 22.5h1411q33 0 55.5 -22.5t22.5 -55.5t-23 -55l-565 -565v-791q0 -33 -22.5 -55.5t-55.5 -22.5t-55 23l-236 235q-23 23 -22 56v555l-565 565q-23 23 -23 55z" />
205
+ <glyph unicode="&#xf0b1;" d="M0 115v512h713q-2 -6 -2 -19v-153q0 -55 38.5 -95.5t96.5 -40.5h153q55 0 94.5 40t39.5 96v153q0 12 -3 19h713v-512q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM0 743v371q0 47 34 81t81 34h424v231q0 31 21.5 53.5t53.5 22.5h615q33 0 55.5 -22.5 t22.5 -53.5v-231h422q47 0 80.5 -34t33.5 -81v-371h-1843zM692 1229h461v153h-461v-153zM825 455v153q0 18 21 19h153q18 0 19 -19v-153q0 -18 -19 -19h-153q-20 0 -21 19z" />
206
+ <glyph unicode="&#xf0b2;" horiz-adv-x="1536" d="M0 80v477q0 51 24.5 61.5t59.5 -24.5l162 -162l340 338l-338 338l-164 -164q-35 -35 -59.5 -25.5t-24.5 60.5v477q0 31 23 57q27 23 57 23h477q51 0 61.5 -24.5t-24.5 -59.5l-160 -158l338 -338l332 334l-162 162q-35 35 -24.5 59.5t61.5 24.5h477q33 0 55 -23 q25 -25 25 -57v-477q0 -51 -24.5 -61.5t-59.5 24.5l-162 162l-334 -334l338 -336l158 160q35 35 59.5 24.5t24.5 -61.5v-477q0 -35 -25 -55q-23 -25 -55 -25h-477q-51 0 -61.5 24.5t24.5 59.5l166 166l-336 336l-340 -340l162 -162q35 -35 24.5 -59.5t-61.5 -24.5h-477 q-31 0 -55 25q-25 20 -25 55z" />
207
+ <glyph unicode="&#xf0c0;" horiz-adv-x="1880" d="M0 852v152q0 18 1 47.5t10 56.5t29.5 46.5t57.5 19.5q-45 29 -71.5 75.5t-26.5 104.5q0 43 16.5 82t46 68.5t68.5 46t82 16.5q45 0 84 -16.5t67.5 -46t46 -68.5t17.5 -82q0 -57 -27.5 -104t-72.5 -76q37 0 57.5 -19.5t29.5 -46.5t11 -56.5t2 -47.5v-152 q-14 -8 -23.5 -18.5t-27.5 -10.5h-328q-16 0 -26.5 10.5t-22.5 18.5zM158 57v387q0 78 45 138.5t98 109.5q10 10 25.5 21.5t33.5 15.5q18 6 41 7t45 5q61 10 130 19.5t135 19.5q-90 57 -144.5 151.5t-54.5 207.5q0 88 34 166.5t92 136t136 91.5t166 34t166 -34t136 -91.5 t92 -136t34 -166.5q0 -113 -54 -207t-145 -152q66 -10 134.5 -19t130.5 -20q23 -4 45 -5t41 -7q18 -4 33.5 -15.5t27.5 -21.5q66 -59 103.5 -116.5t37.5 -131.5v-387q-12 -6 -20 -13t-18.5 -14t-23.5 -14.5t-36 -15.5h-1368q-35 0 -54.5 22.5t-43.5 34.5zM1452 852v152 q0 18 2 47.5t11.5 56.5t30 46.5t56.5 19.5q-45 29 -72.5 75.5t-27.5 104.5q0 43 16.5 82t46 68.5t68.5 46t84 16.5q43 0 82 -16.5t68.5 -46t46 -68.5t16.5 -82q0 -57 -26.5 -104t-71.5 -76q37 0 56.5 -19.5t28.5 -46.5t11 -56.5t2 -47.5v-152q-12 -8 -22.5 -18.5 t-26.5 -10.5h-328q-18 0 -27.5 10.5t-23.5 18.5z" />
208
+ <glyph unicode="&#xf0c1;" horiz-adv-x="1597" d="M0 1137q0 88 34 166.5t92 137t136 92.5t168 34q86 0 166 -33t139 -92q8 -8 21.5 -20.5t26 -25t21.5 -25.5t9 -25q0 -18 -12 -31q-6 -8 -25 -12q-47 -10 -88 -22.5t-86 -31.5q-4 -4 -16 -4t-25.5 10.5t-31 21.5t-42 21.5t-57.5 10.5q-35 0 -66.5 -13.5t-54 -37t-36 -54 t-13.5 -67.5q0 -41 17.5 -75t43 -63.5t56.5 -56.5t57 -53l180 -178q23 -25 54.5 -37t66.5 -12q43 0 73 16t46 16q12 0 39 -21.5t55.5 -49t50 -55t21.5 -42.5q0 -29 -36 -51t-83 -38.5t-94 -26t-72 -9.5q-86 0 -164.5 33t-140.5 92l-303 305q-61 59 -94 139.5t-33 166.5z M578 1010q0 29 35.5 51t82.5 38.5t94 26t72 9.5q86 0 166 -33t139 -92l303 -305q61 -59 94 -139.5t33 -166.5q0 -90 -33.5 -167.5t-92 -136t-137.5 -92.5t-167 -34q-86 0 -165.5 34t-139.5 93q-8 8 -21.5 19.5t-25.5 25t-21.5 26.5t-9.5 26q0 18 13 28q6 8 24 12 q47 10 88 22.5t86 33.5q12 4 17 4q12 0 25.5 -10.5t30.5 -21.5t41 -21.5t58 -10.5q72 0 121 49.5t49 120.5q0 41 -17 76t-44 63.5t-56.5 55.5t-56.5 53l-178 180q-53 49 -123 50q-43 0 -72.5 -17.5t-46.5 -17.5q-12 0 -38.5 21.5t-55 49t-50 56t-21.5 41.5z" />
209
+ <glyph unicode="&#xf0c2;" horiz-adv-x="1880" d="M0 391q0 70 23.5 132.5t64.5 113.5t96.5 86t120.5 51q-33 41 -51 90t-18 105q0 66 24.5 123t66.5 99t99 66.5t123 24.5q113 0 196 -72q18 76 61.5 141.5t103 113.5t133 75t157.5 27q96 0 182 -37t149.5 -100.5t100.5 -149.5t37 -182q0 -57 -13 -109.5t-36 -99.5 q117 -59 188.5 -170t71.5 -248q0 -98 -37 -183t-101.5 -149.5t-149.5 -101.5t-183 -37h-1018q-80 0 -151.5 30.5t-125 84t-84 125t-30.5 151.5z" />
210
+ <glyph unicode="&#xf0c3;" horiz-adv-x="1536" d="M16 72q-39 72 7 141l516 803v366h-78q-33 0 -54.5 22.5t-21.5 55.5q0 31 21.5 53.5t54.5 22.5h614q33 0 55.5 -22.5t22.5 -53.5q0 -33 -22.5 -55.5t-55.5 -22.5h-76v-368l514 -801q45 -70 7 -141q-18 -35 -51 -53.5t-70 -18.5h-1262q-37 0 -69.5 18.5t-51.5 53.5z M377 479h782l-313 490v413h-154v-411z" />
211
+ <glyph unicode="&#xf0c4;" horiz-adv-x="1916" d="M0 180q0 86 44 168t113.5 146.5t154.5 103.5t169 39h13q18 25 57 60.5t63 58.5v12v12q-12 12 -28.5 27.5t-35 32t-33.5 32t-23 27.5q-84 -6 -172.5 33t-160 105.5t-116.5 150.5t-45 168q0 98 62.5 154.5t160.5 56.5q82 0 168 -39t155.5 -103.5t114 -146.5t44.5 -168 q0 -10 -1.5 -21.5t-3.5 -21.5l86 -76l34 17q34 18 90.5 46.5t129 65.5t148.5 76t150.5 77t135 69.5t102.5 52t52 26.5q16 8 37 9q14 0 39 -4.5t52.5 -9.5t53 -11t41.5 -8q29 -4 47.5 -26.5t18.5 -51.5q0 -43 -35 -66l-700 -485l700 -485q35 -23 35 -66q0 -29 -18.5 -51.5 t-47.5 -26.5q-16 -4 -41.5 -9t-53 -10t-52.5 -9.5t-39 -4.5q-10 0 -18.5 2.5t-18.5 6.5l-842 430l-86 -76q2 -10 3.5 -21.5t1.5 -21.5q0 -86 -44.5 -168t-114 -146.5t-155.5 -103.5t-168 -39q-98 0 -160.5 56.5t-62.5 154.5zM197 1358q0 -23 11 -49.5t27.5 -51t35 -45 t34.5 -34.5q35 -29 82 -54.5t94 -25.5q10 0 27 4v6q0 23 -11.5 48.5t-27.5 50t-34.5 46t-35.5 35.5q-35 29 -82 54.5t-94 25.5q-14 0 -26 -4v-6zM199 180q0 -6 2 -10q6 0 11 -1t11 -1q41 0 90 24.5t92.5 61.5t72 83t28.5 89q0 4 -1 5t-1 5q-8 2 -23 2q-41 0 -90 -24.5 t-92 -61.5t-71.5 -83t-28.5 -89zM586 616q53 -25 82 -69l108 96l45 -27l1016 703l-172 31l-975 -498l6 -127zM586 920l35 -35q12 29 36.5 41t53.5 26l-43 37q-29 -45 -82 -69zM741 768q0 35 23.5 57.5t58.5 22.5q33 0 55.5 -22.5t22.5 -57.5q0 -33 -22.5 -56.5t-57.5 -23.5 q-33 0 -56.5 23.5t-23.5 56.5zM903 575l762 -389l172 31l-727 502z" />
212
+ <glyph unicode="&#xf0c5;" horiz-adv-x="1597" d="M0 385v707q0 33 16.5 70.5t38.5 60.5l258 258q23 23 61 39t70 16h463q31 0 53.5 -22.5t22.5 -53.5v-250q16 8 35.5 13.5t40.5 5.5h463q31 0 53 -22.5t22 -53.5v-1075q0 -33 -22.5 -55.5t-52.5 -22.5h-830q-33 0 -55.5 22.5t-22.5 55.5v229h-536q-33 0 -55.5 22.5 t-22.5 55.5zM154 461h460v293q0 45 10.5 87t45.5 74l159 162v305h-278v-321q0 -31 -22.5 -53.5t-53.5 -22.5h-321v-524zM186 1139h211v211zM768 154h676v921h-279v-321q0 -31 -22.5 -53.5t-52.5 -22.5h-322v-524zM801 831h211v211z" />
213
+ <glyph unicode="&#xf0c6;" horiz-adv-x="1470" d="M0 1128q0 90 35 170t94 139.5t139 94.5t170 35q88 0 169 -34t143 -95l655 -656q12 -12 12 -28q0 -10 -11 -26.5t-26.5 -32t-32 -27t-26.5 -11.5q-16 0 -29 13l-655 655q-41 41 -92 61.5t-107 20.5q-57 0 -108 -21.5t-89 -59.5t-59.5 -89t-21.5 -109q0 -55 20.5 -106 t61.5 -92l745 -746q55 -55 133 -55q39 0 74 15.5t60.5 41t41 60.5t15.5 73q0 78 -56 134l-563 563q-29 29 -69 28q-41 0 -71 -29.5t-30 -70.5t29 -70l475 -475q12 -12 12 -28q0 -10 -11 -26.5t-26.5 -32t-32 -27t-26.5 -11.5q-16 0 -29 13l-475 473q-35 37 -55.5 85 t-20.5 99q0 53 20.5 100.5t55.5 83t83.5 56t101.5 20.5q51 0 99 -20.5t85 -55.5l561 -563q102 -102 102 -246q0 -74 -27.5 -137t-74.5 -110t-110.5 -75t-137.5 -28q-143 0 -246 103l-745 745q-61 61 -95 142t-34 169z" />
214
+ <glyph unicode="&#xf0c7;" horiz-adv-x="1536" d="M0 154v1228q0 63 45 108.5t109 45.5h1075q63 0 108 -45l154 -154q45 -45 45 -108v-1075q0 -63 -45 -108.5t-109 -45.5h-1228q-63 0 -108.5 45t-45.5 109zM154 846h1075v536h-1075v-536zM846 922v385h190v-385h-190z" />
215
+ <glyph unicode="&#xf0c8;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-1150q-80 0 -136.5 56.5t-56.5 136.5z" />
216
+ <glyph unicode="&#xf0c9;" d="M0 78v215q0 31 22.5 53.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -53.5v-215q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM0 659v218q0 31 22.5 53t55.5 22h1689q31 0 53.5 -22.5t22.5 -52.5v-218q0 -31 -22.5 -53t-53.5 -22h-1689 q-33 0 -55.5 22.5t-22.5 52.5zM0 1243v217q0 31 22.5 53.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -53.5v-217q0 -31 -22.5 -53.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 53.5z" />
217
+ <glyph unicode="&#xf0ca;" d="M0 211q0 39 15.5 75t41 61.5t60.5 40.5t76 15q39 0 73.5 -15t61 -40.5t42 -61.5t15.5 -75q0 -41 -15.5 -76t-42 -60.5t-61.5 -41t-73 -15.5q-80 0 -136.5 56.5t-56.5 136.5zM0 768q0 39 15.5 75t41 61.5t60.5 41t76 15.5q39 0 73.5 -15.5t61 -41t42 -61.5t15.5 -75 q0 -41 -15.5 -76t-42 -60.5t-61.5 -41t-73 -15.5q-41 0 -76 15.5t-60.5 41t-41 60.5t-15.5 76zM0 1325q0 39 15.5 75t41 61.5t60.5 41t76 15.5q39 0 73.5 -15.5t61 -41t42 -61.5t15.5 -75q0 -41 -15.5 -76t-42 -60.5t-61.5 -40.5t-73 -15q-41 0 -76 15t-60.5 40.5t-41 60.5 t-15.5 76zM522 154v114q0 33 22.5 55.5t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1167q-33 0 -55.5 21.5t-22.5 54.5zM522 711v114q0 33 22.5 55.5t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5 h-1167q-33 0 -55.5 22.5t-22.5 55.5zM522 1268v114q0 33 22.5 55.5t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1167q-33 0 -55.5 22.5t-22.5 55.5z" />
218
+ <glyph unicode="&#xf0cb;" d="M0 594q0 55 30.5 90t68.5 61.5t69 50t31 56.5q0 29 -17.5 44t-46.5 15q-25 0 -44 -15t-34 -36l-53 37q23 39 58.5 60.5t78.5 21.5q55 0 96.5 -32t41.5 -91q0 -49 -30 -80t-67 -55.5t-67.5 -47t-30.5 -55.5h143v54h66v-115h-289q-2 10 -3 18.5t-1 18.5zM4 55l37 54 q6 -4 12 -10.5t15 -10.5q12 -8 29.5 -14t37.5 -6q35 0 55.5 18t20.5 47q0 31 -23.5 48.5t-58.5 17.5h-23l-16 37l90 108l6 6t7 6l4 6h-9q-4 -2 -14 -2h-92v-49h-66v111h263v-53l-97 -115q41 -6 74 -35t33 -82t-38 -95t-110 -42q-35 0 -60.5 9t-41.5 20q-25 14 -35 26z M14 1434l105 102h67v-360h93v-62h-259v62h93v258v8h-2q-10 -16 -22.5 -28.5t-29.5 -27.5zM522 154v114q0 33 22.5 55.5t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -54.5t-53.5 -21.5h-1167q-33 0 -55.5 21.5t-22.5 54.5zM522 711v114q0 33 22.5 55.5 t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1167q-33 0 -55.5 22.5t-22.5 55.5zM522 1268v114q0 33 22.5 55.5t55.5 22.5h1167q31 0 53.5 -22.5t22.5 -55.5v-114q0 -33 -22.5 -55.5t-53.5 -22.5h-1167q-33 0 -55.5 22.5t-22.5 55.5z " />
219
+ <glyph unicode="&#xf0cc;" horiz-adv-x="1536" d="M0 692v152h1536v-152h-1536zM268 1114q0 117 44 202t118 141t170 83t203 27q88 0 176 -20.5t172 -49.5q20 -72 27.5 -156t7.5 -157q0 -10 -1 -22.5t-3 -24.5l-13 -2q-23 2 -50 2t-50 6q-18 59 -44 114.5t-62.5 98.5t-88 68.5t-122.5 25.5q-49 0 -94.5 -13.5t-80 -40 t-56 -66.5t-21.5 -93q0 -59 28.5 -102t75.5 -75t105.5 -54.5t118 -42t113.5 -39t93 -41.5h-696q-33 53 -51.5 110.5t-18.5 120.5zM285 310v63v45l110 2q31 -72 64 -134.5t76 -108.5t104 -71.5t152 -25.5q55 0 110 16.5t100.5 48t74 78.5t28.5 109q0 76 -49 128t-119 88 t-146.5 59.5t-132.5 45.5h617q8 -16 15 -38.5t10.5 -48t5.5 -50t2 -43.5q0 -131 -47.5 -226t-127 -156.5t-186 -91.5t-225.5 -30q-53 0 -93 4t-78 12.5t-78 20.5t-93 29q-12 4 -38 12t-36 16q-8 6 -12 50.5t-6 96.5t-2 100z" />
220
+ <glyph unicode="&#xf0cd;" horiz-adv-x="1536" d="M0 0v154h1536v-154h-1536zM0 1532q10 2 19.5 2h19.5q72 0 140.5 -5t137.5 -5q100 0 200.5 2t199.5 6q-4 -16 -1 -36.5t3 -37.5v-8q-66 -10 -108 -7t-65.5 -5t-32.5 -39t-9 -109q0 -137 4 -272t10 -273q8 -147 88 -237t238 -90q125 0 207 29.5t131 88t69.5 146.5t20.5 203 q0 20 -2 65t-5 102.5t-8.5 119t-11.5 113.5t-13 89t-15 45q-33 33 -78 33q-6 0 -23.5 -1t-36 -1t-34 1t-21.5 3l2 82q82 4 163 -3t165 -7q39 0 77.5 5t79.5 5q4 0 9.5 -1t9.5 -1q2 -12 4 -24.5t2 -24.5t-4 -29q-23 -6 -52.5 -8t-58 -7t-48 -16.5t-19.5 -38.5q0 -14 1 -27 t3 -28q2 -6 5 -38.5t5 -79t4 -101.5t4 -103t3 -85t1 -50q0 -37 -2 -80.5t-8 -89t-17.5 -87.5t-29.5 -74q-41 -68 -104.5 -114t-137 -72.5t-153.5 -38t-154 -11.5q-72 0 -144.5 9.5t-140.5 35.5q-96 35 -151 88.5t-84 121t-36 148.5t-7 173v321v42t-1 62.5t-5 60.5t-10 38 q-12 16 -37 23.5t-53.5 10.5t-56.5 3t-44 4z" />
221
+ <glyph unicode="&#xf0ce;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 154h460v335h-460v-335zM154 565h460v332h-460v-332zM154 975h460v332h-460v-332zM692 154h461v335h-461v-335zM692 565h461v332h-461v-332z M692 975h461v332h-461v-332zM1229 154h461v335h-461v-335zM1229 565h461v332h-461v-332zM1229 975h461v332h-461v-332z" />
222
+ <glyph unicode="&#xf0d0;" d="M0 197q0 39 29 61l1579 1247q20 17 47 17q35 0 59 -29q10 -12 29.5 -33.5t38 -44t32 -47.5t13.5 -43q0 -39 -29 -61l-1579 -1248q-20 -16 -47 -16q-37 0 -59 29q-10 12 -30 33.5t-38 44t-31.5 47t-13.5 43.5zM256 922l117 36l37 117l34 -117l119 -36l-119 -37l-34 -117 l-37 117zM373 1229l235 71l72 236l72 -236l235 -71l-235 -72l-72 -235l-72 235zM942 1382l117 37l37 117l37 -117l116 -37l-116 -36l-37 -117l-37 117zM1286 1153l94 -121l369 291l-94 121zM1536 885l117 35l37 118l36 -118l117 -35l-117 -37l-36 -117l-37 117z" />
223
+ <glyph unicode="&#xf0d1;" d="M0 358v404q0 25 6 51.5t17.5 53t27 51t31.5 40.5l223 222q16 16 41 31.5t51.5 26.5t53 17.5t51.5 6.5h80v198q0 31 22.5 53.5t52.5 22.5h1108q33 0 55.5 -22.5t22.5 -53.5v-1102q0 -31 -22.5 -53t-55.5 -22h-75v-7q0 -63 -25 -119.5t-65.5 -97.5t-97 -65.5t-120.5 -24.5 q-63 0 -119.5 24.5t-97.5 65.5t-65.5 97.5t-24.5 119.5v7h-307v-7q0 -63 -24.5 -119.5t-65.5 -97.5t-97.5 -65.5t-119.5 -24.5t-119.5 24.5t-97.5 65.5t-65.5 97.5t-24.5 119.5v7h-78q-31 0 -53.5 22.5t-22.5 52.5zM193 700h387v369h-78q-10 0 -31.5 -8t-30.5 -17l-223 -221 q-8 -8 -16 -29.5t-8 -31.5v-62zM346 276q0 -47 34 -80.5t81 -33.5t80.5 33.5t33.5 80.5t-33.5 81t-80.5 34t-81 -33.5t-34 -81.5zM1268 276q0 -47 33.5 -80.5t80.5 -33.5t81 33.5t34 80.5t-33.5 81t-81.5 34q-47 0 -80.5 -33.5t-33.5 -81.5z" />
224
+ <glyph unicode="&#xf0d2;" horiz-adv-x="1597" d="M0 768q0 166 62.5 311.5t171 254t254 171t311.5 62.5t311 -62.5t254 -171t171 -254t62 -311.5t-62 -311.5t-171 -254t-254 -171t-311 -62.5q-59 0 -115.5 8.5t-112.5 24.5q23 35 46.5 80t35.5 92l11 41q6 23 16 66t29 112q23 -41 76 -70.5t118 -29.5q96 0 176 41 t136.5 114.5t88 174t31.5 217.5q0 88 -35.5 171t-102.5 147.5t-160 102t-208 37.5q-141 0 -248.5 -46t-179 -118.5t-107.5 -160.5t-36 -174q0 -104 40 -187.5t124 -117.5q31 -10 41 20q2 10 7 31.5t9 32.5q4 16 1 23t-13 22q-53 59 -53 155q0 76 27.5 145.5t78.5 122t124 84 t163 31.5q80 0 142.5 -23.5t105.5 -64.5t64.5 -96t21.5 -121q0 -86 -18.5 -164t-52.5 -136t-80 -92t-103 -34q-31 0 -57.5 12.5t-45 34t-25.5 49t1 60.5q18 76 44.5 151.5t26.5 130.5q0 49 -26.5 84t-81.5 35q-66 0 -110 -58.5t-44 -146.5q-2 -23 2 -45q2 -18 7.5 -40.5 t15.5 -41.5q-33 -141 -53.5 -225t-30.5 -131q-12 -55 -18 -80q-10 -45 -13.5 -93t-1.5 -89q-104 45 -192 119.5t-151.5 169t-98.5 207t-35 235.5z" />
225
+ <glyph unicode="&#xf0d3;" horiz-adv-x="1536" d="M0 193v1150q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5t-61.5 -41t-75 -15.5h-829q27 39 59.5 95.5t49.5 117.5l10 41q6 25 17.5 68t29.5 112q20 -41 75.5 -70.5t121.5 -29.5q96 0 176 42t137 115.5 t89 175t32 220.5q0 90 -37 173t-103.5 147.5t-161 102.5t-208.5 38q-143 0 -251 -46.5t-180.5 -120t-108.5 -162.5t-36 -175q0 -104 40 -188.5t124 -118.5q14 -6 25.5 -1t15.5 21q4 10 8 31.5t8 34.5q8 23 -12 43q-23 29 -37 67.5t-14 91.5q0 76 27.5 145.5t79 123t124 85 t164.5 31.5q82 0 144.5 -23.5t105.5 -64.5t64.5 -97t21.5 -124q0 -86 -18.5 -164t-52 -136t-81 -93t-104.5 -35q-31 0 -57.5 12.5t-45 34t-25.5 49t1 60.5q18 78 45 154.5t27 131.5q0 49 -26.5 85t-82.5 36q-66 0 -110.5 -59t-44.5 -150q-2 -23 2 -45q4 -43 22 -84 q-35 -141 -54.5 -226t-29.5 -132q-12 -55 -18 -80q-16 -70 -14 -142.5t6 -117.5h-260q-80 0 -136.5 56.5t-56.5 136.5z" />
226
+ <glyph unicode="&#xf0d4;" horiz-adv-x="1536" d="M0 342v438q55 -68 120.5 -96.5t153.5 -28.5h36t34 4q-8 -23 -14 -42t-6 -42q0 -41 18 -77.5t43 -67.5q-104 -4 -198.5 -22.5t-186.5 -65.5zM0 1214v129q0 39 15.5 75t41 61.5t60.5 41t76 15.5h1150q80 0 136.5 -56.5t56.5 -136.5v-1150q0 -41 -15.5 -76t-41 -60.5 t-61.5 -41t-75 -15.5h-583q23 39 36 81t13 89q0 70 -21.5 121t-54.5 90t-70.5 69.5t-70.5 57.5t-54.5 53.5t-21.5 59.5q0 49 34 81.5t76 72.5t75.5 99.5t33.5 163.5q0 78 -39 157t-106 122h131l133 76h-428q-129 0 -237.5 -36t-188.5 -143zM2 170q14 57 55 96t96.5 61.5 t115 33t110.5 10.5h31.5t31.5 -2q37 -27 78 -54.5t75 -61.5t55.5 -75t21.5 -92q0 -47 -19 -86h-460q-72 0 -126.5 49t-64.5 121zM102 1094q0 43 11.5 85t35 73.5t59.5 51t85 19.5q68 0 118 -41t81.5 -100.5t47 -128t15.5 -123.5q0 -45 -9 -84t-30.5 -68.5t-56.5 -47 t-84 -17.5q-66 0 -116 39t-85 96t-53.5 123.5t-18.5 122.5zM854 1051h223v-224h109v224h223v108h-223v225h-109v-225h-223v-108z" />
227
+ <glyph unicode="&#xf0d5;" horiz-adv-x="1536" d="M0 262q0 100 56.5 166t139.5 105.5t179 56t174 18.5q-23 29 -41.5 64t-18.5 76q0 23 6.5 41t14.5 40q-16 -4 -33.5 -4h-34.5q-68 0 -130 23.5t-108 66.5t-74 101.5t-28 130.5q0 68 25 128t67 109.5t98 84t120 49.5q88 18 176 18h411l-127 -74h-127q72 -43 107 -120.5 t35 -157.5q0 -94 -33 -149.5t-73 -94.5t-72.5 -70.5t-32.5 -78.5q0 -45 44 -82t97 -82t97 -107.5t44 -161.5q0 -102 -50 -175.5t-126.5 -121t-170 -70t-181.5 -22.5q-66 0 -141.5 15.5t-140 50.5t-106.5 90t-42 137zM174 307q0 -68 35 -116t87 -78.5t114.5 -44t117.5 -13.5 q51 0 104.5 11.5t96.5 38t69.5 68.5t26.5 103q0 49 -21.5 89.5t-53 72t-70.5 59t-76 52.5q-14 2 -29.5 3t-29.5 1q-57 0 -123 -12.5t-121 -41t-91 -75.5t-36 -117zM276 1247q0 -53 17.5 -117.5t51.5 -120t82.5 -92t111.5 -36.5q96 0 134 61.5t38 147.5q0 53 -14.5 118.5 t-45 124t-78 97t-112.5 38.5q-47 0 -82 -18t-57.5 -49t-34 -71t-11.5 -83zM999 1206h215v-215h107v215h215v105h-215v217h-107v-217h-215v-105z" />
228
+ <glyph unicode="&#xf0d6;" d="M0 78v1382q0 31 22.5 53.5t55.5 22.5h1689q31 0 53.5 -22.5t22.5 -53.5v-1382q0 -33 -22.5 -55.5t-53.5 -22.5h-1689q-33 0 -55.5 22.5t-22.5 55.5zM154 461q63 0 119.5 -24.5t97.5 -65.5t65.5 -97.5t24.5 -119.5h921q0 63 25 119.5t65.5 97.5t97 65.5t120.5 24.5v614 q-63 0 -120 24.5t-97.5 65.5t-65.5 97.5t-25 119.5h-921q0 -63 -24.5 -119.5t-65.5 -97.5t-97.5 -65.5t-119.5 -24.5v-614zM539 768q0 104 29.5 195.5t81.5 159t122 106.5t150 39t149.5 -39t121.5 -106.5t83 -159t31 -195.5t-31 -195.5t-83 -159t-122 -106.5t-149 -39 q-80 0 -150 39t-122 106.5t-81.5 159t-29.5 195.5zM692 969l94 -99l39 35q8 6 11.5 13.5t7.5 11.5q4 2 8 10h2v-16q0 -8 -1 -16.5t-1 -18.5v-283h-139v-129h438v129h-141v529h-140z" />
229
+ <glyph unicode="&#xf0d7;" horiz-adv-x="1228" d="M6 967q20 47 72 47h1075q50 0 70 -47t-17 -84l-536 -537q-27 -23 -56 -22q-29 0 -55 22l-536 537q-37 37 -17 84z" />
230
+ <glyph unicode="&#xf0d8;" horiz-adv-x="1228" d="M6 371q-20 47 17 84l536 536q23 23 55 23q31 0 54 -23l538 -536q37 -37 17 -84t-70 -47h-1077q-50 0 -70 47z" />
231
+ <glyph unicode="&#xf0d9;" horiz-adv-x="692" d="M0 768q0 33 23 55l538 537q16 16 38 21t44 -5q23 -8 36 -27.5t13 -41.5v-1076q0 -25 -13 -43t-36 -28t-44 -5t-38 21l-538 539q-23 23 -23 53z" />
232
+ <glyph unicode="&#xf0da;" horiz-adv-x="692" d="M0 231v1076q0 49 47 69t84 -16l539 -537q23 -23 22 -55q0 -31 -22 -53l-539 -539q-37 -37 -84 -16q-47 20 -47 71z" />
233
+ <glyph unicode="&#xf0db;" d="M0 115v1306q0 47 34 81t81 34h1614q47 0 80.5 -34t33.5 -81v-1306q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34t-34 81zM154 154h692v1153h-692v-1153zM999 154h691v1153h-691v-1153z" />
234
+ <glyph unicode="&#xf0dc;" horiz-adv-x="1228" d="M0 584q0 31 22.5 54.5t53.5 23.5h1075q33 0 55.5 -23t22.5 -55q0 -33 -23 -56l-536 -536q-23 -23 -56 -23t-55 23l-536 536q-23 23 -23 56zM0 952q0 33 23 56l536 536q23 23 55 23q33 0 56 -23l536 -536q23 -23 23 -56q0 -31 -22.5 -54.5t-55.5 -23.5h-1075 q-31 0 -53.5 23t-22.5 55z" />
235
+ <glyph unicode="&#xf0dd;" horiz-adv-x="1228" d="M0 584q0 31 22.5 54.5t53.5 23.5h1077q31 0 53.5 -23t22.5 -55q0 -33 -23 -56l-536 -536q-23 -23 -56 -23q-35 0 -53 23l-538 536q-23 23 -23 56z" />
236
+ <glyph unicode="&#xf0de;" horiz-adv-x="1228" d="M0 952q0 33 23 56l536 536q23 23 55 23q33 0 56 -23l536 -536q23 -23 23 -56q0 -31 -22.5 -54.5t-53.5 -23.5h-1077q-31 0 -53.5 23t-22.5 55z" />
237
+ <glyph unicode="&#xf0e0;" d="M0 115v905q10 -10 20.5 -17.5t20.5 -15.5q129 -96 256 -191.5t252 -195.5q39 -31 82 -62.5t89 -57t96.5 -41t103.5 -15.5q55 0 105 15.5t96 40t89 56t84 64.5q125 100 252 195.5t256 191.5q10 8 20.5 15.5t20.5 17.5v-905q0 -47 -33.5 -81t-80.5 -34h-1614q-47 0 -81 34 t-34 81zM2 1434q0 41 36 71.5t77 30.5h1614q41 0 76.5 -30.5t35.5 -71.5q0 -31 -18.5 -69t-45 -75t-57 -67.5t-53.5 -48.5q-123 -92 -241.5 -182.5t-239.5 -182.5q-25 -18 -57.5 -45t-67.5 -51.5t-71 -42t-66 -17.5h-2h-2q-31 0 -67 17.5t-70.5 42t-67.5 51.5t-58 45 q-121 92 -239.5 182t-241.5 183q-23 18 -53.5 48.5t-57 67.5t-45 75t-18.5 69z" />
238
+ <glyph unicode="&#xf0e1;" horiz-adv-x="1576" d="M0 1376q0 39 15.5 74t41 60.5t60 41t73.5 15.5t74 -15.5t61.5 -41t41 -60.5t14.5 -74t-14.5 -73.5t-41 -60t-61.5 -41t-74 -15.5t-73.5 15.5t-60 41t-41 60t-15.5 73.5zM10 41v991q0 16 12.5 28.5t28.5 12.5h281q16 0 28.5 -12t12.5 -29v-991q0 -16 -12.5 -28.5 t-28.5 -12.5h-281q-16 0 -28.5 12.5t-12.5 28.5zM524 41v991q0 16 12.5 28.5t28.5 12.5h273q33 0 37 -25.5t4 -48.5q57 53 129.5 76t150.5 23q190 0 304 -95.5t114 -293.5v-668q0 -16 -12.5 -28.5t-28.5 -12.5h-289q-16 0 -27.5 12.5t-11.5 28.5v604q0 76 -27.5 116 t-111.5 40q-53 0 -89 -17.5t-56.5 -47t-28.5 -70.5t-8 -88v-537q0 -16 -12.5 -28.5t-28.5 -12.5h-281q-16 0 -28.5 12.5t-12.5 28.5z" />
239
+ <glyph unicode="&#xf0e2;" horiz-adv-x="1591" d="M0 662q-4 39 35 45l158 20q12 2 30 -8q12 -8 15 -27q14 -102 63 -191t123 -153.5t169 -101.5t200 -37q115 0 217 44t178 120t120 177t44 218t-44 218t-120 177t-178.5 120t-216.5 44q-94 0 -181.5 -30.5t-158.5 -88.5l159 -159q35 -35 24 -58.5t-58 -23.5h-463 q-16 0 -29.5 6t-24.5 16q-25 25 -24 55v463q0 47 24.5 57.5t59.5 -24.5l162 -162q109 92 238.5 140.5t271.5 48.5q166 0 311 -62.5t253.5 -171t171 -254t62.5 -311.5t-62.5 -311.5t-171 -254t-254 -171t-310.5 -62.5q-150 0 -285 52.5t-241.5 145.5t-176.5 220t-90 275z" />
240
+ <glyph unicode="&#xf0e3;" horiz-adv-x="1916" d="M0 651q0 49 37 91t88 42q35 0 68 -22q-20 14 -21 37q0 8 8 24l334 502q14 20 37 21q16 0 24 -9q-25 18 -40 43t-15 56q0 49 38 90t87 41q33 0 62 -19l514 -342q23 -16 36 -40.5t13 -53.5q0 -25 -10.5 -48.5t-26.5 -41.5t-40 -29.5t-48 -11.5q-33 0 -68 23q20 -14 21 -37 q0 -14 -8 -25l-105 -158l227 -151q14 4 28 6t28 2q53 0 94 -29l475 -315q37 -27 58.5 -65.5t21.5 -84.5q0 -74 -52.5 -126t-125.5 -52q-55 0 -99 31l-475 315q-70 47 -75 131l-228 152l-106 -158q-14 -20 -37 -20q-14 0 -25 8q55 -39 56 -100q0 -25 -10.5 -47.5t-28 -41 t-40 -29.5t-46.5 -11q-35 0 -62 18l-514 342q-49 33 -49 92z" />
241
+ <glyph unicode="&#xf0e4;" horiz-adv-x="1880" d="M0 627q0 195 73.5 365.5t201.5 298.5t299 202t366 74t366 -74t299 -202t201.5 -299t73.5 -365q0 -78 -14.5 -159t-42 -159t-68.5 -149.5t-92 -130.5q-23 -29 -59 -29h-1328q-37 0 -59 29q-53 59 -93 130.5t-67.5 149.5t-42 159t-14.5 159zM158 627q0 -49 33.5 -83 t82.5 -34t83 34t34 83t-34.5 82.5t-82.5 33.5q-49 0 -82.5 -33.5t-33.5 -82.5zM352 1098q0 -49 35 -84t82 -35q49 0 84 35t35 84t-35 82.5t-84 33.5q-47 0 -82 -33.5t-35 -82.5zM743 313q0 -82 57.5 -139t139.5 -57t139.5 57t57.5 139q0 49 -26 91t-67 71q4 14 15.5 55 t27 95.5t33 114t30.5 110.5t22.5 88t9.5 43q0 23 -17.5 40t-40.5 17q-20 0 -35.5 -12t-21.5 -31l-135 -487q-39 -2 -74 -17.5t-60.5 -42t-40 -61.5t-14.5 -74zM823 1292q0 -49 34 -82.5t83 -33.5t83 33.5t34 82.5t-34 83t-83 34t-83 -34t-34 -83zM1292 1098q0 -49 35 -83 t84 -34t83 34t34 83t-34 82.5t-83 33.5t-84 -33.5t-35 -82.5zM1489 627q0 -49 34 -83t83 -34t82.5 34t33.5 83t-33.5 82.5t-82.5 33.5t-83 -33.5t-34 -82.5z" />
242
+ <glyph unicode="&#xf0e5;" horiz-adv-x="1916" d="M0 866q0 123 49 225.5t130 183.5t184.5 139.5t209.5 92.5q94 31 190.5 45.5t194.5 14.5t194.5 -14.5t190.5 -45.5q106 -35 210 -93t185 -139t130 -183.5t49 -225.5t-49 -225t-130 -183t-184.5 -140.5t-210.5 -92.5q-94 -31 -190 -45t-195 -14q-92 0 -180 12 q-92 -72 -195.5 -119t-215.5 -73q-27 -4 -55.5 -10.5t-53.5 -6.5q-16 0 -27.5 11.5t-11.5 27.5q0 12 8.5 21.5t16.5 17.5q31 33 53 60.5t37.5 57.5t25 64.5t17.5 79.5q-78 43 -145.5 100.5t-120 128t-82 153.5t-29.5 175zM160 866q0 -72 24.5 -133t65.5 -113.5t94 -95.5 t111 -75q27 -14 51 -27.5t49 -28.5q-10 -47 -17.5 -94t-19.5 -94q59 29 111.5 64.5t105.5 76.5q55 -8 110.5 -14t112.5 -6q156 0 308 43q84 25 171 68.5t158.5 107t116.5 143.5t45 178t-45 178t-116.5 143.5t-158.5 107.5t-171 69q-152 43 -308 43q-158 0 -307 -43 q-84 -25 -171 -69t-158.5 -107.5t-116.5 -143t-45 -178.5z" />
243
+ <glyph unicode="&#xf0e6;" horiz-adv-x="1916" d="M0 997q0 98 40 182.5t106.5 151t150.5 113.5t170 76q76 25 154.5 36t156.5 11q80 0 159 -11.5t155 -35.5q86 -29 170 -76t149.5 -113.5t105 -150.5t39.5 -183q0 -98 -39.5 -182t-105 -149.5t-149.5 -113.5t-170 -77q-154 -47 -314 -47q-37 0 -72.5 3t-72.5 7 q-150 -115 -336 -155q-20 -4 -43 -9.5t-45 -5.5q-12 0 -21.5 9.5t-9.5 23.5q0 10 7.5 17.5l13.5 13.5q51 51 72.5 96t35.5 117q-63 35 -118.5 82t-97.5 104t-66.5 124t-24.5 142zM160 997q0 -72 30.5 -127t77.5 -99t104.5 -78t112.5 -64l-20 -111q33 18 63.5 42t59.5 46 q47 -6 95 -12t95 -6q135 0 264 41q61 18 124 52t114 81t84 105.5t33 129.5q0 72 -33 131.5t-84 105.5t-113.5 80t-124.5 52q-63 23 -129.5 32t-134.5 9q-66 0 -132 -9t-132 -32q-59 -18 -122.5 -52t-115 -80t-84 -105.5t-32.5 -131.5zM649 258l27 16q51 -6 102 -6 q197 0 381 62q111 37 211 99.5t177 147.5t123 190t46 230q0 41 -6 84q90 -72 148.5 -169t58.5 -214q0 -76 -24.5 -142.5t-66.5 -123.5t-97.5 -104t-118.5 -82q14 -72 35.5 -117t72.5 -96q6 -6 13.5 -14.5t7.5 -18.5q0 -16 -10.5 -23.5t-24.5 -7.5q-20 0 -43 5.5t-41 9.5 q-186 41 -336 155q-37 -4 -72.5 -7t-72.5 -3q-129 0 -254 32t-236 97z" />
244
+ <glyph unicode="&#xf0e7;" horiz-adv-x="933" d="M0 557q0 8 2 10l209 932q4 16 16.5 26.5t28.5 10.5h344q18 0 31.5 -13.5t13.5 -33.5q0 -6 -1 -10t-3 -11l-180 -524q12 4 47 13.5t81 21.5t95 26.5t93 25.5t75 18.5t37 7.5q18 0 31.5 -13.5t13.5 -33.5q0 -12 -2 -19l-565 -1306q-10 -29 -43 -29q-18 0 -33 13.5t-15 33.5 q0 6 3 10l204 914q-12 -4 -48 -14.5t-82 -22.5t-97 -26.5t-95 -27t-76 -19.5t-38 -7q-20 0 -33.5 14.5t-13.5 32.5z" />
245
+ <glyph unicode="&#xf0e8;" d="M0 78v383q0 33 22.5 55.5t55.5 22.5h133v153q0 55 40 94t95 39h518v174h-135q-31 0 -53.5 21.5t-22.5 54.5v385q0 31 22.5 53.5t53.5 22.5h385q31 0 53.5 -22.5t22.5 -53.5v-385q0 -33 -22.5 -54.5t-53.5 -21.5h-135v-174h518q55 0 95 -38.5t40 -94.5v-153h135 q31 0 53.5 -22.5t22.5 -55.5v-383q0 -33 -22.5 -55.5t-53.5 -22.5h-385q-33 0 -54 22.5t-21 55.5v383q0 33 21.5 55.5t53.5 22.5h136v153q0 18 -21 19h-518v-172h135q31 0 53.5 -22.5t22.5 -55.5v-383q0 -33 -22.5 -55.5t-53.5 -22.5h-385q-31 0 -53.5 22.5t-22.5 55.5v383 q0 33 22.5 55.5t53.5 22.5h135v172h-518q-20 0 -20 -19v-153h135q33 0 55.5 -22.5t22.5 -55.5v-383q0 -33 -22.5 -55.5t-55.5 -22.5h-383q-33 0 -55.5 22.5t-22.5 55.5z" />
246
+ <glyph unicode="&#xf0e9;" horiz-adv-x="1884" d="M0 770q31 137 109.5 253t193.5 204t257 141t302 66v53q0 35 23.5 57.5t56.5 22.5q35 0 57.5 -22.5t22.5 -57.5v-53q160 -12 303 -65.5t258 -141.5t192.5 -204t108.5 -253q6 -29 -20 -43q-10 -6 -19 -6q-20 0 -28 12q-98 102 -218 103q-86 0 -163.5 -54.5t-130.5 -152.5 q-10 -23 -35 -23t-35 23q-82 150 -213 194v-526q0 -68 -23.5 -127t-63.5 -104.5t-93.5 -71t-114.5 -25.5t-115.5 25.5t-94.5 71t-63.5 104.5t-23.5 127q0 35 23.5 57.5t56.5 22.5q35 0 57.5 -22.5t22.5 -57.5q0 -70 40 -119t97 -49q55 0 95 49t40 119v526 q-131 -45 -213 -194q-10 -23 -35 -23t-34 23q-53 98 -130 152.5t-163 54.5q-121 0 -217 -103q-12 -12 -31 -12q-10 0 -19 6q-25 14 -20 43z" />
247
+ <glyph unicode="&#xf0ea;" horiz-adv-x="1597" d="M0 385v1075q0 31 22.5 53.5t55.5 22.5h921q31 0 53.5 -22.5t22.5 -53.5v-231h33h61q25 0 55.5 -13.5t49.5 -29.5l280 -281q18 -18 30.5 -49t12.5 -55v-62v-678q0 -27 -17 -44t-44 -17h-860q-27 0 -44.5 17.5t-17.5 43.5v246h-536q-33 0 -55.5 22.5t-22.5 55.5zM276 1321 q0 -12 9.5 -21.5t21.5 -9.5h461q12 0 21.5 9.5t9.5 21.5v61q0 12 -9.5 21.5t-21.5 9.5h-461q-12 0 -21.5 -9t-9.5 -22v-61zM737 123h738v555h-367q-27 0 -44 17.5t-17 43.5v367h-310v-983zM1169 801h306q0 2 -3.5 8t-5.5 10l-280 279q0 4 -6 4q-2 0 -2 1t-2 1t-3.5 1t-3.5 1 v-305z" />
248
+ <glyph unicode="&#xf105;" horiz-adv-x="2048" />
249
+ <glyph unicode="&#xf200;" horiz-adv-x="1536" d="M0 57v379q0 39 20.5 87t54.5 90t74.5 73t81.5 35q-35 -59 -34 -129q0 -59 16 -124t59 -106q-18 -37 -18 -75q0 -72 50 -122t122 -50q37 0 68.5 13t55 36.5t37 55.5t13.5 67t-13.5 66.5t-37 55t-55 38t-68.5 14.5q-18 0 -36.5 -5t-35.5 -14q-12 12 -20 31t-13.5 40.5 t-7.5 41.5t-2 37q0 47 28 86t62 67l142 21q-92 57 -142.5 150.5t-50.5 201.5q0 86 33 162t90 133t133 90t162 33t162 -33t133 -90t90 -133t33 -162q0 -109 -50.5 -202t-142.5 -150l158 -23q18 -16 34.5 -36.5t16.5 -47.5q0 -45 -18 -77q-59 33 -121 32q-45 0 -87 -17 t-77 -46q-6 2 -11 3t-11 1q-47 0 -82 -34t-35 -81t34.5 -80.5t82.5 -33.5q47 0 80.5 33.5t33.5 80.5q0 8 -2 15.5t-4 13.5q16 12 35.5 20.5t42.5 8.5q55 0 95 -39t40 -94q0 -23 -8 -41.5t-19 -34.5q-25 10 -45 10q-47 0 -81.5 -34t-34.5 -81t34.5 -80.5t81.5 -33.5t81 33.5 t34 80.5l-2 4q74 74 74 177q0 74 -41 137q45 70 45 157q0 31 -12 62q41 -4 83 -34t74.5 -72t53 -90t20.5 -89v-379q-10 -6 -22.5 -15t-25.5 -18.5t-26.5 -16.5t-21.5 -7h-1344q-35 0 -52 20.5t-44 36.5zM369 287q0 25 17 41t40 16q25 0 41 -16t16 -41q0 -23 -16 -40.5 t-41 -17.5q-23 0 -40 17.5t-17 40.5z" />
250
+ <glyph unicode="&#xf201;" horiz-adv-x="1597" />
251
+ <glyph unicode="&#xf202;" horiz-adv-x="1597" />
252
+ <glyph unicode="&#xf203;" horiz-adv-x="1597" />
253
+ <glyph unicode="&#xf204;" horiz-adv-x="1597" />
254
+ </font>
255
+ </defs></svg>
includes/admin/shared-ui/font/fontawesome-webfont.svgz ADDED
Binary file
includes/admin/shared-ui/font/fontawesome-webfont.ttf ADDED
Binary file
includes/admin/shared-ui/font/fontawesome-webfont.woff ADDED
Binary file
includes/admin/shared-ui/img/spin-grey.gif ADDED
Binary file
includes/admin/shared-ui/img/spin.gif ADDED
Binary file
includes/admin/shared-ui/notice.css ADDED
@@ -0,0 +1,189 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* ****************************************************************************
2
+ * NOTIFICATION STYLES
3
+ *
4
+ * Those styles are identical with the free-dashboard-notification submodule.
5
+ * Any changes made in this section should also be made to the other module!
6
+ */
7
+
8
+ .wrap .frash-notice.notice {
9
+ padding: 0;
10
+ margin: 5px 0 10px;
11
+ border: 1px solid #E5E5E5;
12
+ background: #FFF;
13
+ overflow: hidden;
14
+ -webkit-border-radius: 6px;
15
+ border-radius: 6px;
16
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.05);
17
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.05);
18
+ position: relative;
19
+ z-index: 1;
20
+ min-height: 80px;
21
+ display: table; /* The magic ingredient! */
22
+ font: 13px "Open Sans", sans-serif;
23
+ }
24
+ .wrap .frash-notice.notice.loading:before {
25
+ content: attr(data-message);
26
+ position: absolute;
27
+ left: 0;
28
+ right: 0;
29
+ top: 0;
30
+ bottom: 0;
31
+ background-color: rgba(255, 255, 255, 0.7);
32
+ z-index: 5;
33
+ text-align: center;
34
+ line-height: 80px;
35
+ font-size: 22px;
36
+ font-weight: bold;
37
+ }
38
+ .frash-notice > div {
39
+ display: table-cell; /* The magic ingredient! */
40
+ vertical-align: middle;
41
+ cursor: default;
42
+ }
43
+ .frash-notice.notice.loading > div {
44
+ -webkit-filter: blur(2px);
45
+ -moz-filter: blur(2px);
46
+ -o-filter: blur(2px);
47
+ -ms-filter: blur(2px);
48
+ filter: blur(2px);
49
+ }
50
+ .frash-notice-logo {
51
+ background-color: #0B2F3F;
52
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgODAgODAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+DQoJPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjgwIiBmaWxsPSJub25lIj48L3JlY3Q+DQoJPGVsbGlwc2UgZmlsbD0iIzJEQThERSIgY3g9IjQwIiBjeT0iNDAuMDAxOTgyOCIgcng9IjI4IiByeT0iMjguMDAxOTgyOCI+PC9lbGxpcHNlPg0KCTxwYXRoIGQ9Ik0zNC45MDc1LDM3LjYzMDU2NDkgTDM0LjkwNzUsMzUuMTgwMzkxNCBDMzQuOTA3NSwzMi4wMzg5MTg5IDMyLjY0MTI1LDI5LjQ5MjQ4ODYgMjkuODQxMjUsMjkuNDkyNDg4NiBDMjcuMDQxMjUsMjkuNDkyNDg4NiAyNC43NzUsMzIuMDM4OTE4OSAyNC43NzUsMzUuMTgwMzkxNCBMMjQuNzc1LDM1LjE4MDM5MTQgTDI0Ljc3NSw1MC41MDI3MjYzIEwyOC4xMTc1LDQ3Ljg3NzU0MDQgTDI4LjExNzUsMzUuMTgwMzkxNCBDMjguMTMzMzk1NSwzNC4xODk3Mzg1IDI4Ljg4MjkwOTksMzMuMzY1MjE0MiAyOS44Njc1LDMzLjI1NTI1NTEgQzMxLjU3Mzc1LDMzLjAwMTQ4NzEgMzQuMzgyNSwzNC44MDQxMTQ3IDM0LjkwNzUsMzcuNjMwNTY0OSBMMzQuOTA3NSwzNy42MzA1NjQ5IFoiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4NCgk8cGF0aCBkPSJNNDMuMzg2MjUsMzMuMjU1MjU1MSBDNDUuMTM2MjUsMzMuMDEwMjM3NyA0Ny45Mjc1LDM0LjgwNDExNDcgNDguNDUyNSwzNy42MzA1NjQ5IEw0OC40NTI1LDM1LjE4MDM5MTQgQzQ4LjQ1MjUsMzIuMDM4OTE4OSA0Ni4xODYyNSwyOS40OTI0ODg2IDQzLjM4NjI1LDI5LjQ5MjQ4ODYgQzQwLjk2MjUsMjkuNDkyNDg4NiAzOC4zMiwzMS41OTI2MzczIDM4LjMyLDM1LjE5Nzg5MjYgTDM4LjMyLDQzLjc2NDc0OTIgQzM4LjMyLDQ1LjAzMzU4OTEgMzcuNTg1LDQ2LjA2NjE2MjIgMzYuNjY2MjUsNDUuOTUyNDA0MSBDMzkuMzg3NSw0Ni4yOTM2NzgzIDQxLjc3NjI1LDQyLjI0MjE0MTQgNDEuNjYyNSwzOC43NTkzOTQ4IEw0MS42NjI1LDM1LjE5Nzg5MjYgQzQxLjYwNzYxMDcsMzQuMTg3MzMxMSA0Mi4zNzY0MDI0LDMzLjMyMDkxNTYgNDMuMzg2MjUsMzMuMjU1MjU1MSBMNDMuMzg2MjUsMzMuMjU1MjU1MSBaIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+DQoJPHBhdGggZD0iTTUxLjg2NSwzMi4xMjY0MjUxIEw1MS44NjUsNDMuNzU1OTk4NiBDNTEuODY1LDQ1LjAyNDgzODQgNTEuMTIxMjUsNDYuMDU3NDExNiA1MC4yMiw0NS45NDM2NTM1IEM1Mi45NDEyNSw0Ni4yODQ5Mjc3IDU1LjMzLDQyLjIzMzM5MDggNTUuMjE2MjUsMzguNzUwNjQ0MiBMNTUuMjE2MjUsMjkuNTAxMjM5MiBMNTEuODY1LDMyLjEyNjQyNTEgWiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPg0KCTxwYXRoIGQ9Ik01MC4xNTg3NSw0Ni43Mzk5NTk5IEM1MS45MDg3NSw0Ni45NDk5NzQ4IDU0LjcsNDUuMTkxMTAwMiA1NS4yMjUsNDIuMzY0NjUwMSBMNTUuMjI1LDQ0LjgxNDgyMzYgQzU1LjIyNSw0Ny45NTYyOTYgNTIuOTU4NzUsNTAuNTAyNzI2MyA1MC4xNTg3NSw1MC41MDI3MjYzIEM0Ny44NjYyNSw1MC41MDI3MjYzIDQ1LjA5MjUsNDguNjM4ODQ0MyA0NS4wOTI1LDQ0LjgxNDgyMzYgTDQ1LjA5MjUsMzYuMjQ3OTY3IEM0NS4wOTI1LDM0Ljk3OTEyNzEgNDQuMzQ4NzUsMzMuOTQ2NTU0IDQzLjQzODc1LDM0LjA2MDMxMjEgQzQ2LjE2LDMzLjcxOTAzNzkgNDguNTQ4NzUsMzcuNzcwNTc0OCA0OC40MzUsNDEuMjUzMzIxNCBMNDguNDM1LDQ0LjgxNDgyMzYgQzQ4LjQ0NTM5NTksNDUuNzk4MDk0MSA0OS4xODI2NTY0LDQ2LjYyMTQ4OSA1MC4xNTg3NSw0Ni43Mzk5NTk5IEw1MC4xNTg3NSw0Ni43Mzk5NTk5IFoiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4NCgk8cGF0aCBkPSJNMzYuNjEzNzUsNDYuNzQ4NzEwNSBDMzguMzYzNzUsNDYuOTg0OTc3MiA0MS4xNTUsNDUuMTk5ODUwOCA0MS42OCw0Mi4zNzM0MDA3IEw0MS42OCw0NC44MjM1NzQyIEM0MS42OCw0Ny45NjUwNDY2IDM5LjQxMzc1LDUwLjUxMTQ3NjkgMzYuNjEzNzUsNTAuNTExNDc2OSBDMzQuMTksNTAuNTExNDc2OSAzMS41NDc1LDQ4LjQxMTMyODIgMzEuNTQ3NSw0NC44MDYwNzMgTDMxLjU0NzUsMzYuMjM5MjE2MyBDMzEuNTQ3NSwzNC45NzAzNzY1IDMwLjgwMzc1LDMzLjkzNzgwMzQgMjkuOTAyNSwzNC4wNTE1NjE0IEMzMi42MjM3NSwzMy43MTAyODczIDM1LjAxMjUsMzcuNzYxODI0MiAzNC44OTg3NSw0MS4yNDQ1NzA4IEwzNC44OTg3NSw0NC44MDYwNzMgQzM0Ljg0MzcxMTgsNDUuODEzNDQ3MyAzNS42MDczOTA5LDQ2LjY3ODQ5MiAzNi42MTM3NSw0Ni43NDg3MTA1IEwzNi42MTM3NSw0Ni43NDg3MTA1IFoiIGZpbGw9IiNGRkZGRkYiID48L3BhdGg+DQo8L3N2Zz4=);
53
+ background-repeat: no-repeat;
54
+ background-position: 50% 50%;
55
+ }
56
+ .frash-notice-logo span {
57
+ display: block;
58
+ width: 80px;
59
+ }
60
+ .frash-notice-message {
61
+ width: 100%;
62
+ padding: 10px 20px;
63
+ color: #444;
64
+ }
65
+ .frash-notice-message strong {
66
+ color: #000;
67
+ }
68
+ .frash-notice-cta {
69
+ border-left: 1px solid #E5E5E5;
70
+ background: #F8F8F8;
71
+ padding: 0 30px;
72
+ position: relative;
73
+ white-space: nowrap;
74
+ }
75
+ .wp-core-ui .frash-notice-cta button,
76
+ .wp-core-ui .frash-notice-cta .button-primary:active {
77
+ vertical-align: middle;
78
+ }
79
+ .wp-core-ui .frash-notice-cta input[type="email"] {
80
+ vertical-align: middle;
81
+ line-height: 20px;
82
+ margin: 0;
83
+ min-width: 50px;
84
+ max-width: 320px;
85
+ text-align: center;
86
+ padding-left: 0;
87
+ padding-right: 0;
88
+ }
89
+ .frash-notice-dismiss {
90
+ background: transparent;
91
+ border: 0;
92
+ cursor: pointer;
93
+ color: #BBB;
94
+ }
95
+ .frash-notice-dismiss:hover {
96
+ color: #666;
97
+ }
98
+
99
+ .frash-notice .frash-notice-logo {
100
+ position: relative;
101
+ }
102
+ .frash-notice .frash-notice-logo:before,
103
+ .frash-notice .frash-notice-logo:after {
104
+ content: '';
105
+ position: absolute;
106
+ z-index: 0;
107
+ background: inherit;
108
+ left: 0;
109
+ top: 0;
110
+ width: 80px;
111
+ bottom: 0;
112
+ }
113
+ .frash-notice .frash-notice-logo:before {
114
+ background-image: none;
115
+ z-index: 1;
116
+ }
117
+ .frash-notice .frash-notice-logo:after {
118
+ animation: spin 30s linear infinite;
119
+ background-color: rgba(0, 0, 0, 0);
120
+ z-index: 2;
121
+ }
122
+
123
+ @media only all and (max-width: 1200px) {
124
+ .frash-notice-dismiss {
125
+ display: block;
126
+ margin: 0 auto;
127
+ line-height: 18px;
128
+ padding-top: 8px;
129
+ padding-bottom: 2px;
130
+ }
131
+ }
132
+
133
+ @media only all and (max-width: 1000px) {
134
+ .wrap .frash-notice.notice {
135
+ display: block;
136
+ font-size: 13px;
137
+ }
138
+ .frash-notice > .frash-notice-logo {
139
+ float: left;
140
+ display: inline-block;
141
+ height: 80px;
142
+ margin: 10px;
143
+ border-radius: 4px;
144
+ }
145
+ .frash-notice > .frash-notice-message {
146
+ width: auto;
147
+ display: block;
148
+ padding: 10px;
149
+ min-height: 80px;
150
+ }
151
+ .frash-notice > .frash-notice-cta {
152
+ display: block;
153
+ border-top: 1px solid #E5E5E5;
154
+ border-left: 0;
155
+ text-align: center;
156
+ white-space: normal;
157
+ line-height: 30px;
158
+ padding: 10px 20px;
159
+ }
160
+ .wp-core-ui .frash-notice > .frash-notice-cta > input[type="email"],
161
+ .frash-notice > .frash-notice-cta > button {
162
+ font-size: 14px;
163
+ }
164
+ .frash-notice > .frash-notice-cta > .frash-notice-dismiss {
165
+ display: inline-block;
166
+ float: none;
167
+ line-height: 26px;
168
+ padding-top: 0;
169
+ padding-bottom: 0;
170
+ font-size: 13px;
171
+ }
172
+ }
173
+
174
+ @media only all and (max-width: 500px) {
175
+ .wp-core-ui .frash-notice > .frash-notice-cta > input[type="email"],
176
+ .frash-notice > .frash-notice-cta > button {
177
+ display: block;
178
+ width: 100% !important;
179
+ max-width: none;
180
+ margin-bottom: 4px;
181
+ font-size: 16px;
182
+ height: 34px;
183
+ }
184
+ .frash-notice > .frash-notice-cta > .frash-notice-dismiss {
185
+ margin-top: 5px;
186
+ font-size: 14px;
187
+ height: 23px;
188
+ }
189
+ }
includes/admin/shared-ui/notice.js ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(function() {
2
+ var el_notice, msg_id = el_notice, btn_dismiss;
3
+
4
+ // Display the notice after the page was loaded.
5
+ function initialize() {
6
+ if (! jQuery(".frash-notice:visible").length) {
7
+ el_notice = jQuery(".frash-notice");
8
+ msg_id = el_notice.find("input[name=msg_id]").val();
9
+ btn_dismiss = el_notice.find(".frash-notice-dismiss");
10
+
11
+ // Dismiss the notice without any action.
12
+ btn_dismiss.click(function(ev) {
13
+ ev.preventDefault();
14
+ notify_wordpress("wdev_notice_dismiss", btn_dismiss.data("msg"));
15
+ });
16
+
17
+ // Display the notification.
18
+ el_notice.fadeIn(500);
19
+ }
20
+ }
21
+
22
+ // Hide the notice after a CTA button was clicked
23
+ function remove_notice() {
24
+ el_notice.fadeTo(100 , 0, function() {
25
+ el_notice.slideUp(100, function() {
26
+ el_notice.remove();
27
+ });
28
+ });
29
+ }
30
+
31
+ // Notify WordPress about the users choice and close the message.
32
+ function notify_wordpress(action, message) {
33
+ var ajax_data = {};
34
+
35
+ if ('0' !== msg_id) {
36
+ el_notice.attr("data-message", message);
37
+ el_notice.addClass("loading");
38
+
39
+ ajax_data.msg_id = msg_id;
40
+ ajax_data.action = action;
41
+ jQuery.post(
42
+ window.ajaxurl,
43
+ ajax_data,
44
+ remove_notice
45
+ );
46
+ } else {
47
+ remove_notice();
48
+ }
49
+ }
50
+
51
+ window.setTimeout(initialize, 550);
52
+ });
includes/admin/shared-ui/plugin-ui.php ADDED
@@ -0,0 +1,267 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Provides PHP support for simple use of the WPMUDEV plugin UI.
4
+ *
5
+ * @package WPMUDEV_UI
6
+ */
7
+
8
+ if ( ! class_exists( 'WDEV_Plugin_Ui' ) ) {
9
+
10
+ /**
11
+ * UI class that encapsulates all module functions.
12
+ */
13
+ class WDEV_Plugin_Ui {
14
+
15
+ /**
16
+ * Current module version.
17
+ */
18
+ const VERSION = '1.0';
19
+
20
+ /**
21
+ * Internal translation container.
22
+ *
23
+ * @var array
24
+ */
25
+ static protected $i10n = array();
26
+
27
+ /**
28
+ * Internal storage that holds additional classes for body tag.
29
+ *
30
+ * @var array
31
+ */
32
+ static protected $body_class = '';
33
+
34
+ /**
35
+ * URL to this module (directory). Used to enqueue the css/js files.
36
+ *
37
+ * @var string
38
+ */
39
+ static protected $module_url = '';
40
+
41
+ /**
42
+ * Initializes all UI components.
43
+ *
44
+ * @since 1.0.0
45
+ * @internal
46
+ */
47
+ static public function reset() {
48
+ self::$i10n = array(
49
+ 'empty_search' => __( 'Nothing found', 'wpmudev' ),
50
+ 'default_msg_ok' => __( 'Okay, we saved your changes!', 'wpmudev' ),
51
+ 'default_msg_err' => __( 'Oops, we could not do this...', 'wpmudev' ),
52
+ );
53
+ }
54
+
55
+ /**
56
+ * Enqueues the CSS and JS files needed for plugin UI
57
+ *
58
+ * @since 1.0.0
59
+ * @api Call this function before/in `admin_head`.
60
+ * @param string $module_url URL to this module (directory).
61
+ * @param string $body_class List of additional classes for the body tag.
62
+ */
63
+ static public function load( $module_url, $body_class = '' ) {
64
+ self::$module_url = trailingslashit( $module_url );
65
+ self::$body_class = trim( $body_class );
66
+ add_filter(
67
+ 'admin_body_class',
68
+ array( __CLASS__, 'admin_body_class' )
69
+ );
70
+
71
+ if ( ! did_action( 'admin_enqueue_scripts' ) ) {
72
+ add_action(
73
+ 'admin_enqueue_scripts',
74
+ array( __CLASS__, 'enqueue' )
75
+ );
76
+ } else {
77
+ self::enqueue();
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Enqueues the CSS and JS files.
83
+ *
84
+ * @since 1.0.0
85
+ * @internal Do not call this method manually. It's called by `load()`!
86
+ */
87
+ static public function enqueue() {
88
+ wp_enqueue_style(
89
+ 'wdev-plugin-google_fonts',
90
+ 'https://fonts.googleapis.com/css?family=Roboto+Condensed:400,700|Roboto:400,500,300,300italic',
91
+ false,
92
+ self::VERSION
93
+ );
94
+
95
+ wp_enqueue_style(
96
+ 'wdev-plugin-ui',
97
+ self::$module_url . 'wdev-ui.css',
98
+ array( 'wdev-plugin-google_fonts' ),
99
+ self::VERSION
100
+ );
101
+
102
+ wp_enqueue_script(
103
+ 'wdev-plugin-ui',
104
+ self::$module_url . 'wdev-ui.js',
105
+ array( 'jquery' ),
106
+ self::VERSION
107
+ );
108
+ }
109
+
110
+ /**
111
+ * Adds the page-specific class to the admin page body tag.
112
+ *
113
+ * @since 1.0.0
114
+ * @internal Action hook
115
+ * @param string $classes List of CSS classes of the body tag.
116
+ * @return string Updated list of CSS classes.
117
+ */
118
+ static public function admin_body_class( $classes ) {
119
+ $classes .= ' wpmud';
120
+ if ( self::$body_class ) {
121
+ $classes .= ' ' . self::$body_class;
122
+ }
123
+ $classes .= ' ';
124
+
125
+ return $classes;
126
+ }
127
+
128
+ /**
129
+ * Sets a translation from javascript.
130
+ *
131
+ * @since 1.0.0
132
+ * @api Use this before calling `output_header()`.
133
+ * @param string $key The translation key (used in javascript).
134
+ * @param string $value Human readable text.
135
+ */
136
+ static public function translate( $key, $value ) {
137
+ self::$i10n[ $key ] = (string) $value;
138
+ }
139
+
140
+ /**
141
+ * Outputs code in the page header.
142
+ *
143
+ * This function must be called by the plugin!
144
+ * It's not important if it's in the header or in the footer of the page,
145
+ * but in top/header is recommended.
146
+ *
147
+ * @since 1.0.0
148
+ * @api Call this function somewhere after output started.
149
+ * @param array $commands Optinal list of additional JS commands that
150
+ * are executed when page loaded.
151
+ */
152
+ static public function output( $commands = array() ) {
153
+ $data = array();
154
+ $data[] = 'window.WDP = window.WDP || {}';
155
+ $data[] = 'WDP.data = WDP.data || {}';
156
+ $data[] = 'WDP.data.site_url = ' . json_encode( get_site_url() );
157
+ $data[] = 'WDP.lang = ' . json_encode( self::$i10n );
158
+
159
+ // Add custom JS commands to the init-code.
160
+ if ( is_array( $commands ) ) {
161
+ $data = array_merge( $data, $commands );
162
+ }
163
+
164
+ /**
165
+ * Display a custom success message on the WPMU Dashboard pages.
166
+ *
167
+ * @var string|array The message to display.
168
+ * Array options:
169
+ * 'type' => [ok|err] (default: 'ok')
170
+ * 'delay' => 3000 (default: 3000ms)
171
+ * 'message' => '...' (required!)
172
+ */
173
+ $notice = apply_filters( 'wpmudev-admin-notice', false );
174
+ if ( $notice ) {
175
+ $command = 'WDP';
176
+ if ( is_array( $notice ) && ! empty( $notice['type'] ) ) {
177
+ $command .= sprintf( '.showMessage("type", "%s")', esc_attr( $notice['type'] ) );
178
+ }
179
+ if ( is_array( $notice ) && ! empty( $notice['delay'] ) ) {
180
+ $command .= sprintf( '.showMessage("delay", %s)', intval( $notice['delay'] ) );
181
+ }
182
+ if ( is_array( $notice ) && ! empty( $notice['message'] ) ) {
183
+ $command .= sprintf( '.showMessage("message", "%s")', esc_html( $notice['message'] ) );
184
+ } elseif ( is_string( $notice ) ) {
185
+ $command .= sprintf( '.showMessage("message", "%s")', esc_html( $notice ) );
186
+ }
187
+ $command .= '.showMessage("show")';
188
+ $data[] = $command;
189
+ }
190
+
191
+ foreach ( $data as $item ) {
192
+ printf(
193
+ "<script>;jQuery(function(){%s;});</script>\n",
194
+ // @codingStandardsIgnoreStart: This is javascript code, no escaping!
195
+ $item
196
+ // @codingStandardsIgnoreEnd
197
+ );
198
+ }
199
+ }
200
+
201
+ /**
202
+ * Output the HTML code to display the notification.
203
+ *
204
+ * @since 1.0.0
205
+ * @param string $module_url URL to this module (directory).
206
+ * @param array $msg The message details.
207
+ * id .. Required, can be any valid class-name.
208
+ * content .. Required, can contain HTML.
209
+ * dismissed .. Optional. If true then no message is output.
210
+ * can_dismiss .. Optional. If true a Dismiss button is added.
211
+ * cta .. Optional. Can be HTML code of a button/link.
212
+ */
213
+ static public function render_dev_notification( $module_url, $msg ) {
214
+ if ( ! is_array( $msg ) ) { return; }
215
+ if ( ! isset( $msg['id'] ) ) { return; }
216
+ if ( empty( $msg['content'] ) ) { return; }
217
+ if ( $msg['dismissed'] ) { return; }
218
+
219
+ $css_url = $module_url . 'notice.css';
220
+ $js_url = $module_url . 'notice.js';
221
+
222
+ if ( empty( $msg['id'] ) ) {
223
+ $msg_dismiss = '';
224
+ } else {
225
+ $msg_dismiss = __( 'Saving', 'wpmudev' );
226
+ }
227
+
228
+ $show_actions = $msg['can_dismiss'] || $msg['cta'];
229
+
230
+ $allowed = array(
231
+ 'a' => array( 'href' => array(), 'title' => array(), 'target' => array(), 'class' => array() ),
232
+ 'br' => array(),
233
+ 'hr' => array(),
234
+ 'em' => array(),
235
+ 'i' => array(),
236
+ 'strong' => array(),
237
+ 'b' => array(),
238
+ );
239
+
240
+ ?>
241
+ <link rel="stylesheet" type="text/css" href="<?php echo esc_url( $css_url ); ?>" />
242
+ <div class="notice frash-notice" style="display:none">
243
+ <input type="hidden" name="msg_id" value="<?php echo esc_attr( $msg['id'] ); ?>" />
244
+
245
+ <div class="frash-notice-logo"><span></span></div>
246
+ <div class="frash-notice-message">
247
+ <?php echo wp_kses( $msg['content'], $allowed ); ?>
248
+ </div>
249
+ <?php if ( $show_actions ) : ?>
250
+ <div class="frash-notice-cta">
251
+ <?php echo wp_kses( $msg['cta'], $allowed ); ?>
252
+ <?php if ( $msg['can_dismiss'] ) : ?>
253
+ <button class="frash-notice-dismiss" data-msg="<?php echo esc_attr( $msg_dismiss ); ?>">
254
+ <?php esc_html_e( 'Dismiss', 'wpmudev' ); ?>
255
+ </button>
256
+ <?php endif; ?>
257
+ </div>
258
+ <?php endif; ?>
259
+ </div>
260
+ <script src="<?php echo esc_url( $js_url ); ?>"></script>
261
+ <?php
262
+ }
263
+ };
264
+
265
+ // Initialize the UI.
266
+ WDEV_Plugin_Ui::reset();
267
+ }
includes/admin/shared-ui/wdev-ui.css ADDED
@@ -0,0 +1,2499 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * CSS Styles used by WPMUDEV plugins.
3
+ *
4
+ * To apply these styles add these classes to the mentioned tags:
5
+ * <html> .. add class "wpmud-html"
6
+ * <body> .. add class "wpmud"
7
+ *
8
+ * -----------------------------------------------------------------------------
9
+ *
10
+ * 1. GLOBAL STYLES, TYPOGRAPHY
11
+ * 2. ELEMENT STATES
12
+ * 3. ELEMENT: BOX
13
+ * 4. ELEMENT: LIST
14
+ * 5. ELEMENT: LIST-TABLE
15
+ * 6. ELEMENT: GRID
16
+ * 7. ELEMENT: HORIZONTAL TABS
17
+ * 8. ELEMENT: VERTICAL TABS
18
+ * 9. ELEMENT: TOOLTIPS
19
+ * 10. ELEMENT: OVERLAYS
20
+ * 11. ELEMENT: DASHBOARD NOTIFICATONS (enhancements)
21
+ * 12. ELEMENT: BUTTONS
22
+ * 13. ELEMENT: FORMS
23
+ * 14. ELEMENT: INPUT (general styles)
24
+ * 15. ELEMENT: TOGGLE (styled checkbox)
25
+ * 16. ELEMENT: RADIO GROUP (styled radio)
26
+ * 17. ELEMENT: SELECT
27
+ * 18. ELEMENT: LISTINGS
28
+ * 19. ELEMENT: USER NOTIFICATIONS
29
+ * 20. ELEMENT: SEARCH BOX
30
+ * 21. ELEMENT: COUNT-BADGE
31
+ * 22. ELEMENT: PAGE HEADER
32
+ * 23. FONTAWESOME
33
+ * 24. WPMUDEV ICONFONT
34
+ * 25. CUSTOM ANIMATIONS
35
+ *
36
+ * -----------------------------------------------------------------------------
37
+ */
38
+
39
+ /* ****************************************************************************
40
+ * 1. GLOBAL STYLES, TYPOGRAPHY
41
+ */
42
+ .wpmud-html {
43
+ background-color: #F4F4F4;
44
+ }
45
+ .wpmud #wpbody {
46
+ background: #F4F4F4;
47
+ -webkit-font-smoothing: antialiased !important;
48
+ }
49
+ .wpmud #wpbody * {
50
+ box-sizing: border-box;
51
+ -moz-box-sizing: border-box;
52
+ }
53
+ .wpmud #container {
54
+ margin-top: 30px;
55
+ font-family: 'Roboto', sans-serif;
56
+ font-weight: 400;
57
+ font-size: 15px;
58
+ line-height: 1.5em;
59
+ color: #777771;
60
+ letter-spacing: -0.015em;
61
+ }
62
+ .wpmud h1,
63
+ .wpmud h2,
64
+ .wpmud h3,
65
+ .wpmud h4,
66
+ .wpmud h5,
67
+ .wpmud h6 {
68
+ display: block;
69
+ margin: 0.5em auto;
70
+ padding: 0;
71
+ line-height: 1em;
72
+ text-align: center;
73
+ color: #777771;
74
+ }
75
+ .wpmud h1,
76
+ .wpmud h2,
77
+ .wpmud h3 {
78
+ font-family: 'Roboto Condensed', 'Roboto', sans-serif;
79
+ font-weight: 400;
80
+ max-width: 900px;
81
+ text-transform: uppercase;
82
+ }
83
+ .wpmud h4,
84
+ .wpmud h5,
85
+ .wpmud h6 {
86
+ font-family: 'Roboto', sans-serif;
87
+ font-weight: 500;
88
+ }
89
+ .wpmud h1 {
90
+ font-size: 60px;
91
+ font-weight: 700;
92
+ }
93
+ .wpmud h2 {
94
+ font-size: 50px;
95
+ text-transform: none;
96
+ }
97
+ .wpmud h3 {
98
+ font-size: 50px;
99
+ }
100
+ .wpmud h4 {
101
+ font-size: 36px;
102
+ text-transform: uppercase;
103
+ }
104
+ .wpmud h5 {
105
+ font-size: 36px;
106
+ }
107
+ .wpmud h6 {
108
+ font-size: 28px;
109
+ font-weight: 400;
110
+ }
111
+ .wpmud p {
112
+ display: block;
113
+ margin: 0.5em 0;
114
+ padding: 0;
115
+ font-family: 'Roboto', sans-serif;
116
+ font-weight: 400;
117
+ font-size: 15px;
118
+ line-height: 21px;
119
+ color: #777771;
120
+ }
121
+ .wpmud p small {
122
+ font-size: 12.5px;
123
+ line-height: 17px;
124
+ display: inline-block;
125
+ color: #555550;
126
+ }
127
+ .wpmud p big {
128
+ font-size: 18px;
129
+ line-height: 24px;
130
+ display: inline-block;
131
+ font-weight: 400;
132
+ color: #888882;
133
+ }
134
+ .wpmud p:first-child {
135
+ margin-top: 0;
136
+ }
137
+ .wpmud p:last-child {
138
+ margin-bottom: 0;
139
+ }
140
+ .wpmud .notice p {
141
+ margin:5px 0;
142
+ }
143
+ .wpmud dfn {
144
+ font-style: normal;
145
+ font-weight: normal;
146
+ border-bottom: 1px dotted #999;
147
+ }
148
+ .wpmud code,
149
+ .wpmud pre {
150
+ font: 400 13px/15px Consolas, Monaco, monospace;
151
+ border-left: 2px solid rgba(0,0,0,0.2);
152
+ padding: 5px 10px 5px 10px;
153
+ background: rgba(0,0,0,0.05);
154
+ border-radius: 3px;
155
+ color: #555;
156
+ margin: 1em 0;
157
+ overflow: auto;
158
+ vertical-align: middle;
159
+ }
160
+ .wpmud code {
161
+ display: inline-block;
162
+ margin: 0;
163
+ }
164
+ #wpfooter {
165
+ display: none;
166
+ }
167
+ .wpmud a {
168
+ text-decoration: none;
169
+ color: #19B4CF;
170
+ }
171
+ .wpmud a:active,
172
+ .wpmud a:focus,
173
+ .wpmud a:hover {
174
+ color: #477B92;
175
+ }
176
+ .wpmud a.disabled,
177
+ .wpmud a.disabled:active,
178
+ .wpmud a.disabled:hover,
179
+ .wpmud a.disabled:focus {
180
+ color: 788084;
181
+ cursor: default;
182
+ }
183
+
184
+ /* ****************************************************************************
185
+ * 2. ELEMENT STATES
186
+ */
187
+ .wpmud .block {
188
+ display: block;
189
+ width: 100%;
190
+ float: none;
191
+ }
192
+ .wpmud .button.block,
193
+ .wpmud button.block,
194
+ .wpmud input.block {
195
+ text-align: center;
196
+ }
197
+ .wpmud .space-t {
198
+ margin-top: 20px;
199
+ }
200
+ .wpmud .space-b {
201
+ margin-bottom: 20px;
202
+ }
203
+ .wpmud .tl {
204
+ text-align: left;
205
+ }
206
+ .wpmud .tc {
207
+ text-align: center;
208
+ }
209
+ .wpmud .tr {
210
+ text-align: right;
211
+ }
212
+ .wpmud .group {
213
+ clear: both;
214
+ margin: 0 0 30px;
215
+ }
216
+ .wpmud .group:after {
217
+ content: '';
218
+ display: table;
219
+ clear: both;
220
+ }
221
+ .wpmud .input-group {
222
+ display: inline-block;
223
+ white-space: nowrap;
224
+ }
225
+ .wpmud .float-r {
226
+ float: right;
227
+ }
228
+ .wpmud .float-l {
229
+ float: left;
230
+ }
231
+ .wpmud .pointer {
232
+ cursor: pointer;
233
+ }
234
+ .wpmud .dev-label {
235
+ background: #ECECEC;
236
+ border: 1px solid #E5E5E5;
237
+ color: #BABABA;
238
+ line-height: 30px;
239
+ padding: 0 10px;
240
+ border-radius: 3px;
241
+ display: inline-block;
242
+ vertical-align: middle;
243
+ margin: 0 5px;
244
+ cursor: default;
245
+ }
246
+ .wpmud .can-close .box-title .close,
247
+ .wpmud .can-close .close-icon {
248
+ cursor: pointer;
249
+ position: relative;
250
+ display: inline-block;
251
+ width: 22px;
252
+ height: 22px;
253
+ line-height: 22px;
254
+ float: right;
255
+ }
256
+ .wpmud .can-close .box-title .close {
257
+ float: right;
258
+ margin: 20px -10px 0 0;
259
+ }
260
+ .wpmud .can-close .box-title .close:after,
261
+ .wpmud .can-close .close-icon:after {
262
+ content: "\79";
263
+ font-family: 'WPMU-DEV-App-Icons';
264
+ speak: none;
265
+ font-style: normal;
266
+ font-weight: normal;
267
+ font-variant: normal;
268
+ text-transform: none;
269
+ line-height: 22px;
270
+ text-align: center;
271
+ font-size: 14px;
272
+ -webkit-font-smoothing: antialiased;
273
+ -moz-osx-font-smoothing: grayscale;
274
+ position: absolute;
275
+ left: 0;
276
+ right: 0;
277
+ top: 0;
278
+ bottom: 0;
279
+ background: #FFF;
280
+ color: #777771;
281
+ transition: color 0.3s;
282
+ }
283
+ .wpmud .can-close .box-title .close:hover:after,
284
+ .wpmud .can-close .close-icon:hover:after {
285
+ color: #333;
286
+ }
287
+ /* http://loading.io/loader/?use=eyJzaXplIjo2MCwic3BlZWQiOjEsImNiayI6IiM5OTk5OTkiLCJjMSI6IiMwMDAiLCJjMiI6IjciLCJjMyI6IjEwIiwiYzQiOiJ5LWF4aXMiLCJ0eXBlIjoic3BpbiJ9 */
288
+ .wpmud .loading.disabled:before,
289
+ .wpmud .loading:before {
290
+ content: '';
291
+ background: transparent url(img/spin.gif) center center no-repeat;
292
+ background-size: contain;
293
+ display: inline-block;
294
+ width: 18px;
295
+ height: 18px;
296
+ vertical-align: top;
297
+ position: static;
298
+ border: none;
299
+ margin: 0;
300
+ z-index: 1;
301
+ opacity: 1;
302
+ }
303
+ .wpmud .has-hover .show-on-hover {
304
+ opacity: 0;
305
+ transition-property: opacity;
306
+ transition-duration: 0.3s;
307
+ }
308
+ .wpmud .has-hover:hover .show-on-hover,
309
+ .wpmud .has-hover .show-on-hover.loading {
310
+ opacity: 1;
311
+ }
312
+
313
+ /* ****************************************************************************
314
+ * 3. ELEMENT: BOX
315
+ */
316
+ .wpmud .dev-box {
317
+ border-radius: 5px;
318
+ background-color: #FFF;
319
+ box-shadow: 0 2px 0 #EAEAEA;
320
+ padding: 30px;
321
+ margin: 0 0 30px;
322
+ }
323
+ .wpmud .dev-box .box-title {
324
+ height: 60px;
325
+ padding: 0 30px;
326
+ border-bottom: 1px solid #EAEAEA;
327
+ margin: -30px -30px 30px -30px;
328
+ }
329
+ .wpmud .dev-box .box-title .buttons {
330
+ float: right;
331
+ margin: 15px -5px 0 0;
332
+ }
333
+ .wpmud .dev-box .box-title .button {
334
+ font-weight: 700;
335
+ }
336
+ .wpmud .dev-box .box-title h3 {
337
+ font-family: 'Roboto Condensed', 'Roboto', sans-serif;
338
+ font-size: 18px;
339
+ font-weight: 700;
340
+ color: #777771;
341
+ line-height: 60px;
342
+ margin: 0;
343
+ text-align: left;
344
+ white-space: nowrap;
345
+ overflow: hidden;
346
+ text-overflow: ellipsis;
347
+ }
348
+ .wpmud .dev-box .box-title .buttons .dev-icon {
349
+ font-size: 18px;
350
+ }
351
+ .wpmud .box-footer {
352
+ text-align: center;
353
+ margin-top: 32px;
354
+ font-size: 16px;
355
+ }
356
+
357
+ /* ****************************************************************************
358
+ * 4. ELEMENT: LIST
359
+ */
360
+ .wpmud .dev-list {
361
+ list-style: none;
362
+ margin: -20px 0 20px;
363
+ padding: 0;
364
+ }
365
+ .wpmud .dev-list.inline {
366
+ margin-top: 20px;
367
+ margin-bottom: 0;
368
+ }
369
+ .wpmud .dev-list.standalone {
370
+ margin-bottom: -20px;
371
+ }
372
+ .wpmud .dev-list > li {
373
+ position: relative;
374
+ display: table;
375
+ width: 100%;
376
+ padding: 6px 0;
377
+ margin: 0;
378
+ border-collapse: collapse;
379
+ border-spacing: 0;
380
+ }
381
+ .wpmud .dev-list > li > div {
382
+ display: table-row; /* give each list item the full width */
383
+ }
384
+ .wpmud .dev-list > li.list-header {
385
+ text-transform: uppercase;
386
+ font-weight: bold;
387
+ font-family: 'Roboto Condensed';
388
+ padding-top: 0;
389
+ }
390
+ .wpmud .dev-list > li .list-label {
391
+ padding: 10px 10px 10px 0;
392
+ }
393
+ .wpmud .dev-list > li .list-label.list-header {
394
+ font-family: 'Roboto Condensed';
395
+ color: #777771;
396
+ width: 200px;
397
+ }
398
+ .wpmud .dev-list > li .list-label,
399
+ .wpmud .dev-list > li .list-detail {
400
+ display: table-cell;
401
+ vertical-align: middle;
402
+ cursor: default;
403
+ border-bottom: 1px solid #EEEEEE;
404
+ }
405
+ .wpmud .dev-list > li:last-child .list-label,
406
+ .wpmud .dev-list > li:last-child .list-detail {
407
+ border-bottom: 1px solid transparent;
408
+ }
409
+ .wpmud .dev-list > li .list-detail {
410
+ text-align: right;
411
+ padding: 10px 0;
412
+ }
413
+ .wpmud .dev-list.top > li .list-label,
414
+ .wpmud .dev-list.top > li .list-detail {
415
+ vertical-align: top;
416
+ }
417
+ .wpmud .dev-list.left > li .list-label,
418
+ .wpmud .dev-list.left > li .list-detail {
419
+ text-align: left;
420
+ }
421
+ .wpmud .dev-list.top > li strong {
422
+ font-family: 'Roboto Condensed';
423
+ }
424
+ .wpmud .dev-list.nowrap > li .list-label,
425
+ .wpmud .dev-list.nowrap > li .list-detail {
426
+ overflow: hidden;
427
+ text-overflow: ellipsis;
428
+ white-space: nowrap;
429
+ }
430
+ .wpmud .dev-list.nowrap > li .list-label {
431
+ position: absolute;
432
+ top: 0;
433
+ left: 0;
434
+ right: 50px;
435
+ border-bottom: 0;
436
+ }
437
+ .wpmud .dev-list.hover-effect > li.list-header:hover {
438
+ background: transparent;
439
+ }
440
+ .wpmud .dev-list.hover-effect > li.list-header:hover:before,
441
+ .wpmud .dev-list.hover-effect > li.list-header:hover:after {
442
+ display: none;
443
+ }
444
+ .wpmud .dev-list.hover-effect > li:hover {
445
+ background: #FBFBFB;
446
+ }
447
+ .wpmud .dev-list.hover-effect > li:hover .list-label,
448
+ .wpmud .dev-list.hover-effect > li:hover .list-detail {
449
+ border-bottom: 1px solid #EEE;
450
+ }
451
+ .wpmud .dev-list.hover-effect > li:hover:before,
452
+ .wpmud .dev-list.hover-effect > li:hover:after {
453
+ content: '';
454
+ position: absolute;
455
+ left: -30px;
456
+ width: 30px;
457
+ bottom: 0;
458
+ top: -1px;
459
+ background: #FBFBFB;
460
+ border-top: 1px solid #EEE;
461
+ border-bottom: 1px solid #EEE;
462
+ }
463
+ .wpmud .dev-list.hover-effect > li:hover:after {
464
+ right: -30px;
465
+ left: auto;
466
+ }
467
+
468
+ /* ****************************************************************************
469
+ * 5. ELEMENT: LIST-TABLE
470
+ */
471
+ .wpmud .list-table {
472
+ border: 0;
473
+ width: 100%;
474
+ border-spacing: 0;
475
+ border-collapse: collapse;
476
+ }
477
+ .wpmud .list-table > thead > tr > th {
478
+ font-weight: bold;
479
+ text-transform: uppercase;
480
+ text-align: left;
481
+ padding: 8px 10px;
482
+ cursor: default;
483
+ }
484
+ .wpmud .list-table > thead > tr > th:first-child {
485
+ padding-left: 0;
486
+ }
487
+ .wpmud .list-table > thead > tr > th:last-child {
488
+ padding-right: 0;
489
+ }
490
+ .wpmud .list-table > tbody > tr > td {
491
+ padding: 8px 10px;
492
+ border-top: 1px solid #EEE;
493
+ cursor: default;
494
+ position: relative;
495
+ z-index: 1;
496
+ }
497
+ .wpmud .list-table > tbody > tr:last-child > td {
498
+ border-bottom: 1px solid transparent;
499
+ }
500
+ .wpmud .list-table > tbody > tr > td:first-child {
501
+ padding-left: 0;
502
+ }
503
+ .wpmud .list-table > tbody > tr > td:last-child {
504
+ padding-right: 0;
505
+ }
506
+ .wpmud .list-table.hover-effect > tbody > tr:hover > td:first-child:after,
507
+ .wpmud .list-table.hover-effect > tbody > tr:hover > td:last-child:after {
508
+ content: '';
509
+ position: absolute;
510
+ left: -30px;
511
+ top: -1px;
512
+ bottom: -1px;
513
+ width: 30px;
514
+ border-top: 1px solid #EEE;
515
+ border-bottom: 1px solid #EEE;
516
+ background: #FBFBFB;
517
+ }
518
+ .wpmud .list-table.hover-effect > tbody > tr:hover > td:last-child:after {
519
+ right: -30px;
520
+ left: auto;
521
+ }
522
+ .wpmud .list-table.hover-effect > tbody > tr:hover {
523
+ background: #FBFBFB;
524
+ }
525
+ .wpmud .list-table.hover-effect > tbody > tr:hover > td {
526
+ border-top: 1px solid #EEE;
527
+ border-bottom: 1px solid #EEE;
528
+ z-index: 2;
529
+ }
530
+
531
+ /* ****************************************************************************
532
+ * 6. ELEMENT: GRID
533
+ */
534
+ .wpmud .row,
535
+ .wpmud .row-sep {
536
+ clear: both;
537
+ margin: 0 0 0 0;
538
+ position: relative;
539
+ display: table;
540
+ width: 100%;
541
+ table-layout: fixed;
542
+ }
543
+ .wpmud .row:after,
544
+ .wpmud .row-sep:after {
545
+ content: '';
546
+ display: table;
547
+ clear: both;
548
+ }
549
+ .wpmud .row-sep {
550
+ height: 1px;
551
+ margin-bottom: 30px;
552
+ width: auto;
553
+ display: block;
554
+ }
555
+ .wpmud .row-sep:before {
556
+ content: '';
557
+ display: block;
558
+ position: absolute;
559
+ left: 0;
560
+ right: 0;
561
+ bottom: 0;
562
+ border-bottom: 1px solid #E5E5E5;
563
+ }
564
+ .wpmud .row-sep .button {
565
+ margin: 20px auto 0;
566
+ display: block;
567
+ width: 480px;
568
+ text-align: center;
569
+ position: relative;
570
+ top: -20px;
571
+ position: relative;
572
+ z-index: 1;
573
+ background: #FFF;
574
+ }
575
+ .wpmud .row-sep .button.button-small {
576
+ top: -14px;
577
+ }
578
+ .wpmud .row-sep .button:before,
579
+ .wpmud .row-sep .button:after {
580
+ content: '';
581
+ position: absolute;
582
+ z-index: 0;
583
+ left: -30px;
584
+ width: 30px;
585
+ top: 0;
586
+ bottom: 0;
587
+ background: #FFF;
588
+ }
589
+ .wpmud .row-sep .button:after {
590
+ right: -30px;
591
+ left: auto;
592
+ }
593
+ .wpmud .row-space {
594
+ margin-bottom: 30px;
595
+ }
596
+ .wpmud .row .col-third,
597
+ .wpmud .row .col-two-third,
598
+ .wpmud .row .col-half {
599
+ display: table-cell;
600
+ padding: 0 15px 0 15px;
601
+ position: relative;
602
+ vertical-align: top;
603
+ }
604
+ .wpmud .row .col-third {
605
+ width: 33.3333%;
606
+ }
607
+ .wpmud .row .col-two-third {
608
+ width: 66.6666%;
609
+ }
610
+ .wpmud .row .col-half {
611
+ width: 50%;
612
+ }
613
+ .wpmud .row .col-third:first-child,
614
+ .wpmud .row .col-two-third:first-child,
615
+ .wpmud .row .col-half:first-child {
616
+ padding-left: 0;
617
+ }
618
+ .wpmud .row .col-third:last-child,
619
+ .wpmud .row .col-two-third:last-child,
620
+ .wpmud .row .col-half:last-child {
621
+ padding-right: 0;
622
+ }
623
+
624
+ /* ****************************************************************************
625
+ * 7. ELEMENT: HORIZONTAL TABS
626
+ */
627
+ .wpmud .tabs {
628
+ float: none;
629
+ position: relative;
630
+ padding: 0;
631
+ margin: 0 0 30px;
632
+ background-color: #FFF;
633
+ border-top-left-radius: 5px;
634
+ border-top-right-radius: 5px;
635
+ }
636
+ .wpmud .tabs:before,
637
+ .wpmud .tabs:after {
638
+ content: '';
639
+ display: table;
640
+ clear: both;
641
+ }
642
+ .wpmud .tabs .tab {
643
+ float: left;
644
+ }
645
+ .wpmud .tabs .tab:first-child label {
646
+ border-top-left-radius: 5px;
647
+ }
648
+ .wpmud .tabs .tab label {
649
+ display: block;
650
+ padding: 10px 30px;
651
+ line-height: 40px;
652
+ margin: 0;
653
+ top: 0;
654
+ height: 60px;
655
+ cursor: pointer;
656
+ position: relative;
657
+ background-color: #FEFEFE;
658
+ color: #BFBABA;
659
+ border-right: 1px solid #EAEAEA;
660
+ text-transform: uppercase;
661
+ }
662
+ .wpmud .tabs .tab input[type=radio] {
663
+ display: none;
664
+ }
665
+ .wpmud .tabs .tab input[type=radio]:checked + label {
666
+ background-color: #FFF;
667
+ color: #777771;
668
+ height: 61px;
669
+ z-index: 3;
670
+ }
671
+ .wpmud .tabs .tab .content {
672
+ z-index: 2;
673
+ display: none;
674
+ text-align: left;
675
+ left: 0;
676
+ right: 0;
677
+ width: auto;
678
+ padding: 30px;
679
+ position: absolute;
680
+ top: 60px;
681
+ min-height: 150px;
682
+ border-top: 1px solid #EAEAEA;
683
+ background-color: #FFF;
684
+ overflow: auto;
685
+ border-bottom-left-radius: 5px;
686
+ border-bottom-right-radius: 5px;
687
+ box-shadow: 0 2px 0 #EAEAEA;
688
+ }
689
+ .wpmud .tabs .tab input[type=radio]:checked ~ .content {
690
+ display: block;
691
+ }
692
+ .wpmud .dev-box .tabs {
693
+ border: 1px solid #EAEAEA;
694
+ }
695
+ .wpmud .dev-box .tabs .tab .content {
696
+ border: 1px solid #EAEAEA;
697
+ left: -1px;
698
+ right: -1px;
699
+ box-shadow: none;
700
+ }
701
+
702
+ /* ****************************************************************************
703
+ * 8. ELEMENT: VERTICAL TABS
704
+ */
705
+ .wpmud .vertical-tabs {
706
+ display: block;
707
+ position: relative;
708
+ margin-bottom: 30px;
709
+ }
710
+ .wpmud .vertical-tabs > .tab > input[type="radio"] {
711
+ /* NO `top: -9999px` - else page scrolls to top when tab is clicked! */
712
+ left: -9999px;
713
+ position: absolute;
714
+ z-index: -10;
715
+ opacity: 0;
716
+ }
717
+ .wpmud .vertical-tabs > .tab {
718
+ display: block;
719
+ }
720
+ .wpmud .vertical-tabs > .tab > label {
721
+ cursor: pointer;
722
+ display: block;
723
+ padding: 15px 20px;
724
+ text-transform: uppercase;
725
+ font-size: 13px;
726
+ line-height: 28px;
727
+ position: relative;
728
+ width: 200px;
729
+ color: #AAA;
730
+ margin: 0;
731
+ border-radius: 5px 0 0 5px;
732
+ z-index: 10;
733
+ transition: color 0.3s, background 0.3s;
734
+ }
735
+ .wpmud .vertical-tabs > .tab > label * {
736
+ line-height: 28px;
737
+ }
738
+ .wpmud .vertical-tabs > .tab > label:hover {
739
+ color: #777771;
740
+ }
741
+ .wpmud .vertical-tabs > .tab > label:after {
742
+ content: '';
743
+ position: absolute;
744
+ left: 20px;
745
+ right: 20px;
746
+ bottom: -1px;
747
+ height: 1px;
748
+ border-bottom: 1px solid #E5E5E5;
749
+ }
750
+ .wpmud .vertical-tabs > .tab:last-child > label:after {
751
+ display: none;
752
+ }
753
+ .wpmud .vertical-tabs > .tab > .content {
754
+ display: none;
755
+ left: 200px;
756
+ right: 0;
757
+ min-width: 300px;
758
+ padding: 20px;
759
+ position: absolute;
760
+ top: 0;
761
+ background: #FFF;
762
+ box-shadow: 0 2px 0 #EAEAEA;
763
+ }
764
+ .wpmud .vertical-tabs > .tab > input[type="radio"]:checked + label {
765
+ background: #FFF;
766
+ color: #333;
767
+ box-shadow: 0 2px 0 #EAEAEA;
768
+ }
769
+ .wpmud .vertical-tabs > .tab > input[type="radio"]:checked + label:after {
770
+ display: none;
771
+ }
772
+ .wpmud .vertical-tabs > .tab > input[type="radio"]:checked ~ .content {
773
+ display: block;
774
+ }
775
+ .wpmud .vertical-tabs .tab-title {
776
+ border-bottom: 1px solid #EAEAEA;
777
+ margin: -20px -20px 20px -20px;
778
+ line-height: 28px;
779
+ padding: 15px 20px;
780
+ text-align: left;
781
+ font-size: 16px;
782
+ text-transform: uppercase;
783
+ font-weight: bold;
784
+ }
785
+
786
+ /* ****************************************************************************
787
+ * 9. ELEMENT: TOOLTIPS
788
+ */
789
+ .wpmud .dev-tip {
790
+ width: 420px;
791
+ margin: 0 auto 10px;
792
+ padding: 20px;
793
+ background-color: #0B2F3F;
794
+ border-radius: 5px;
795
+ position: relative;
796
+ }
797
+ .wpmud .dev-tip:after {
798
+ content: '';
799
+ position: absolute;
800
+ bottom: -14px;
801
+ left: 50%;
802
+ margin-left: -7px;
803
+ border: 7px solid transparent;
804
+ border-top-color: #0B2F3F;
805
+ }
806
+ .wpmud .dev-tip,
807
+ .wpmud .dev-tip p {
808
+ font-size: 15px;
809
+ line-height: 18px;
810
+ color: #EEE;
811
+ }
812
+ .wpmud [tooltip] {
813
+ position: relative;
814
+ overflow: visible;
815
+ }
816
+ .wpmud [tooltip]:before {
817
+ content: '';
818
+ position: absolute;
819
+ border: 5px solid transparent;
820
+ border-top-color: #0B2F3F;
821
+ bottom: 100%;
822
+ left: 50%;
823
+ margin-left: -5px;
824
+ margin-bottom: -5px;
825
+ opacity: 0;
826
+ z-index: -1;
827
+ transition: margin .2s, opacity .2s, z-index .2s linear .2s;
828
+ pointer-events: none;
829
+ }
830
+ .wpmud [tooltip]:after {
831
+ content: attr(tooltip);
832
+ position: absolute;
833
+ background: #0B2F3F;
834
+ color: #FFF;
835
+ bottom: 100%;
836
+ left: 50%;
837
+ width: 200px;
838
+ margin-left: -100px;
839
+ margin-bottom: 5px;
840
+ text-align: center;
841
+ padding: 5px;
842
+ border-radius: 4px;
843
+ text-transform: uppercase;
844
+ font: 600 13px/20px 'Roboto Condensed';
845
+ opacity: 0;
846
+ z-index: -1;
847
+ transition: margin .2s, opacity .2s, z-index .2s linear .2s;
848
+ white-space: pre-wrap;
849
+ pointer-events: none;
850
+ }
851
+ .wpmud [tooltip].tooltip-s:after {
852
+ width: 150px;
853
+ margin-left: -75px;
854
+ }
855
+ .wpmud [tooltip].tooltip-l:after {
856
+ width: 280px;
857
+ margin-left: -140px;
858
+ }
859
+ .wpmud [tooltip].tooltip-right:after {
860
+ margin-left: -180px;
861
+ }
862
+ .wpmud [tooltip].tooltip-s.tooltip-right:after {
863
+ margin-left: -130px;
864
+ }
865
+ .wpmud [tooltip].tooltip-l.tooltip-right:after {
866
+ margin-left: -260px;
867
+ }
868
+ .wpmud [tooltip].tooltip-bottom:before {
869
+ border-color: transparent;
870
+ border-bottom-color: #0B2F3F;
871
+ top: 100%;
872
+ bottom: auto;
873
+ margin-top: -5px;
874
+ margin-bottom: 0;
875
+ }
876
+ .wpmud [tooltip].tooltip-bottom:after {
877
+ bottom: auto;
878
+ top: 100%;
879
+ margin-top: 5px;
880
+ margin-bottom: 0;
881
+ }
882
+ .wpmud [tooltip]:hover:before {
883
+ opacity: 1;
884
+ z-index: 1;
885
+ margin-bottom: 0;
886
+ transition: margin .2s, opacity .2s;
887
+ }
888
+ .wpmud [tooltip]:hover:after {
889
+ opacity: 1;
890
+ z-index: 1;
891
+ margin-bottom: 10px;
892
+ transition: margin .2s, opacity .2s;
893
+ }
894
+ .wpmud .disabled[tooltip]:before,
895
+ .wpmud .disabled[tooltip]:after {
896
+ display: none;
897
+ }
898
+
899
+ /* ****************************************************************************
900
+ * 10. ELEMENT: OVERLAYS
901
+ */
902
+ .wpmud dialog {
903
+ display: none;
904
+ }
905
+ .wpmud .dev-overlay {
906
+ position: fixed;
907
+ left: 160px;
908
+ top: 32px;
909
+ right: 0;
910
+ bottom: 0;
911
+ z-index: 1000; /* fixed position is always on top */
912
+ display: none; /* hidden by default */
913
+ overflow: visible;
914
+ }
915
+ .wpmud.folded .dev-overlay {
916
+ left: 36px;
917
+ }
918
+ .wpmud .dev-overlay .back {
919
+ position: absolute;
920
+ top: 0;
921
+ left: 0;
922
+ right: 0;
923
+ bottom: 0;
924
+ background: rgba(20, 72, 95, .85);
925
+ z-index: 0;
926
+ }
927
+ .wpmud .dev-overlay .box-scroll {
928
+ position: absolute;
929
+ left: 0;
930
+ top: 0;
931
+ right: 0;
932
+ bottom: 0;
933
+ z-index: 1;
934
+ overflow: auto;
935
+ }
936
+ .wpmud .dev-overlay .box {
937
+ position: absolute;
938
+ top: 0;
939
+ min-height: 120px;
940
+ left: 50%;
941
+ margin: 20px 0 20px -420px;
942
+ width: 840px;
943
+ background: #FFF;
944
+ border-radius: 5px;
945
+ padding: 40px;
946
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
947
+ box-sizing: border-box;
948
+ z-index: 2;
949
+ overflow: hidden;
950
+ }
951
+ .wpmud .dev-overlay.small .box {
952
+ width: 600px;
953
+ margin-left: -300px;
954
+ }
955
+ .wpmud .dev-overlay .box.loading:before {
956
+ position: absolute;
957
+ left: 0;
958
+ top: 0;
959
+ right: 0;
960
+ bottom: 0;
961
+ background-color: rgba(255,255,255,0.75);
962
+ z-index: 1;
963
+ width: auto;
964
+ height: auto;
965
+ background-size: 18px;
966
+ }
967
+ .wpmud .dev-overlay.no-margin .content {
968
+ margin: -40px;
969
+ }
970
+ .wpmud .dev-overlay.no-margin .fullsize {
971
+ display: block;
972
+ width: 100%;
973
+ }
974
+ .wpmud .dev-overlay .box .title {
975
+ min-height: 60px;
976
+ padding: 0 60px 0 40px;
977
+ border-bottom: 1px solid #EAEAEA;
978
+ margin: -40px -40px 40px -40px;
979
+ }
980
+ .wpmud .dev-overlay .title .close {
981
+ position: absolute;
982
+ right: 0;
983
+ top: 0;
984
+ padding: 0 24px;
985
+ line-height: 60px;
986
+ font-size: 24px;
987
+ font-weight: 400;
988
+ color: #BABABA;
989
+ cursor: pointer;
990
+ }
991
+ .wpmud .dev-overlay .title .close:hover {
992
+ color: #777771;
993
+ }
994
+ .wpmud .dev-overlay .title h3 {
995
+ font-family: 'Roboto Condensed', 'Roboto', sans-serif;
996
+ font-size: 18px;
997
+ font-weight: 700;
998
+ color: #777771;
999
+ line-height: 30px;
1000
+ margin: 0;
1001
+ padding: 15px 0;
1002
+ text-align: left;
1003
+ }
1004
+ .wpmud .dev-overlay .title .title-action {
1005
+ position: absolute;
1006
+ right: 60px;
1007
+ top: 0;
1008
+ height: 60px;
1009
+ vertical-align: middle;
1010
+ box-sizing: border-box;
1011
+ padding: 10px 0;
1012
+ }
1013
+ .wpmud .dev-overlay .title .title-action .button-small {
1014
+ margin: 5px 0;
1015
+ }
1016
+ .wpmud-html.has-overlay {
1017
+ overflow: hidden;
1018
+ }
1019
+ .wpmud-html.has-overlay ul#adminmenu a.wp-has-current-submenu:after,
1020
+ .wpmud-html.has-overlay ul#adminmenu > li.current > a.current:after {
1021
+ border-right-color: #356175;
1022
+ }
1023
+
1024
+ /* ****************************************************************************
1025
+ * 11. ELEMENT: DASHBOARD NOTIFICATONS (enhancements)
1026
+ */
1027
+ .wpmud .wrap .frash-notice.notice {
1028
+ box-shadow: 0 0 0 2px #E8E8E5;
1029
+ }
1030
+ .wpmud .frash-notice .frash-notice-message {
1031
+ font-family: 'Roboto', sans-serif;
1032
+ font-weight: 400;
1033
+ font-size: 15px;
1034
+ line-height: 1.65em;
1035
+ color: #777771;
1036
+ }
1037
+ .wpmud .frash-notice .frash-notice-message b.block {
1038
+ display: block;
1039
+ font-size: 16.5px;
1040
+ }
1041
+
1042
+ /* ****************************************************************************
1043
+ * 12. ELEMENT: BUTTONS
1044
+ */
1045
+ .wpmud button:focus,
1046
+ .wpmud .button:focus {
1047
+ outline-color: transparent;
1048
+ outline-style: none;
1049
+ border: 0;
1050
+ box-shadow: none;
1051
+ }
1052
+ .wpmud button,
1053
+ .wpmud .button {
1054
+ font: 500 15px/20px 'Roboto';
1055
+ background: #00ACCA;
1056
+ color: #FFF;
1057
+ text-transform: uppercase;
1058
+ padding: 11px 20px 9px;
1059
+ height: auto;
1060
+ display: inline-block;
1061
+ margin: 0;
1062
+ border: 0;
1063
+ border-radius: 5px;
1064
+ -moz-border-radius: 5px;
1065
+ cursor: pointer;
1066
+ box-shadow: none;
1067
+ -moz-transition: color 0.3s, opacity 0.3s;
1068
+ transition: color 0.3s, opacity 0.3s;
1069
+ text-shadow: none;
1070
+ }
1071
+ .wpmud button + button,
1072
+ .wpmud .button + button,
1073
+ .wpmud button + .button,
1074
+ .wpmud .button + .button,
1075
+ .wpmud a + button,
1076
+ .wpmud a + .button {
1077
+ margin-left: 10px;
1078
+ }
1079
+ .wpmud button:hover:not(:focus):not(:active),
1080
+ .wpmud .button:hover:not(:focus):not(:active) {
1081
+ background-color: #0093B1;
1082
+ color: #FFF;
1083
+ box-shadow: none;
1084
+ }
1085
+ /* http://www.colorzilla.com/gradient-editor/#0082a1+0,008fae+100 */
1086
+ .wpmud button:active,
1087
+ .wpmud button:focus,
1088
+ .wpmud .button:active,
1089
+ .wpmud .button:focus {
1090
+ color: #FFF;
1091
+ box-shadow: none;
1092
+ background: #0082a1;
1093
+ background: -moz-linear-gradient(top, #0082a1 0%, #008fae 100%);
1094
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#0082a1), color-stop(100%,#008fae));
1095
+ background: -webkit-linear-gradient(top, #0082a1 0%,#008fae 100%);
1096
+ background: -o-linear-gradient(top, #0082a1 0%,#008fae 100%);
1097
+ background: -ms-linear-gradient(top, #0082a1 0%,#008fae 100%);
1098
+ background: linear-gradient(to bottom, #0082a1 0%,#008fae 100%);
1099
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#0082a1', endColorstr='#008fae',GradientType=0 );
1100
+ }
1101
+ /* Variation: Green button */
1102
+ .wpmud .button-green {
1103
+ background: #1ABC9C;
1104
+ }
1105
+ .wpmud .button-green:hover:not(:focus):not(:active) {
1106
+ background: #148F77;
1107
+ }
1108
+ /* http://www.colorzilla.com/gradient-editor/#0a6550+0,0e9272+100 */
1109
+ .wpmud .button-green:active,
1110
+ .wpmud .button-green:focus {
1111
+ color: #FFF;
1112
+ background: #0a6550;
1113
+ background: -moz-linear-gradient(top, #0a6550 0%, #0e9272 100%);
1114
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#0a6550), color-stop(100%,#0e9272));
1115
+ background: -webkit-linear-gradient(top, #0a6550 0%,#0e9272 100%);
1116
+ background: -o-linear-gradient(top, #0a6550 0%,#0e9272 100%);
1117
+ background: -ms-linear-gradient(top, #0a6550 0%,#0e9272 100%);
1118
+ background: linear-gradient(to bottom, #0a6550 0%,#0e9272 100%);
1119
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#0a6550', endColorstr='#0e9272',GradientType=0 );
1120
+ }
1121
+ /* Variation: Secondary Button */
1122
+ .wpmud .button-secondary {
1123
+ background: transparent;
1124
+ color: #00ACCA;
1125
+ box-shadow: 0 0 0 2px #00ACCA inset;
1126
+ }
1127
+ /* Variation: Red Button */
1128
+ .wpmud .button-red {
1129
+ background: transparent;
1130
+ color: #fd6e70;
1131
+ box-shadow: 0 0 0 2px #fd6e70 inset;
1132
+ }
1133
+ .wpmud .button-red:hover:not(:focus):not(:active) {
1134
+ background: #fd6e70;
1135
+ }
1136
+ /* http://www.colorzilla.com/gradient-editor/#E24A4C+0,fd6e70+100 */
1137
+ .wpmud .button-red:active,
1138
+ .wpmud .button-red:focus {
1139
+ color: #FFFFFF;
1140
+ box-shadow: 0 0 0 1px #e24a4c inset;
1141
+ background: #e24a4c;
1142
+ background: -moz-linear-gradient(top, #e24a4c 0%, #fd6e70 100%);
1143
+ background: -webkit-linear-gradient(top, #e24a4c 0%,#fd6e70 100%);
1144
+ background: linear-gradient(to bottom, #e24a4c 0%,#fd6e70 100%);
1145
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e24a4c', endColorstr='#fd6e70',GradientType=0 );
1146
+ }
1147
+ /* Variation: Grey */
1148
+ .wpmud .button-grey {
1149
+ background: #AEAEAE;
1150
+ }
1151
+ .wpmud .button-grey:hover:not(:focus):not(:active) {
1152
+ background: #9E9E9E;
1153
+ }
1154
+ /* http://www.colorzilla.com/gradient-editor/#8e8e8e+0,9e9e9e+100 */
1155
+ .wpmud .button-grey:active,
1156
+ .wpmud .button-grey:focus {
1157
+ color: #FFFFFF;
1158
+ box-shadow: 0 0 0 1px #D8D8D8 inset;
1159
+ background: #8e8e8e;
1160
+ background: -moz-linear-gradient(top, #8e8e8e 0%, #9e9e9e 100%);
1161
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#8e8e8e), color-stop(100%,#9e9e9e));
1162
+ background: -webkit-linear-gradient(top, #8e8e8e 0%,#9e9e9e 100%);
1163
+ background: -o-linear-gradient(top, #8e8e8e 0%,#9e9e9e 100%);
1164
+ background: -ms-linear-gradient(top, #8e8e8e 0%,#9e9e9e 100%);
1165
+ background: linear-gradient(to bottom, #8e8e8e 0%,#9e9e9e 100%);
1166
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#8e8e8e', endColorstr='#9e9e9e',GradientType=0 );
1167
+ }
1168
+ /* Variation: Yellow */
1169
+ .wpmud .button-yellow {
1170
+ background: #FDCE43;
1171
+ }
1172
+ .wpmud .button-yellow:hover:not(:focus):not(:active) {
1173
+ background: #E6BB3B;
1174
+ }
1175
+ /* http://www.colorzilla.com/gradient-editor/#E6BB3B+0,FDCE43+100 */
1176
+ .wpmud .button-yellow:active,
1177
+ .wpmud .button-yellow:focus {
1178
+ color: #FFFFFF;
1179
+ box-shadow: 0 0 0 1px #d6a719 inset;
1180
+ background: #d6a719;
1181
+ background: -moz-linear-gradient(top, #d6a719 0%, #e6bb3b 100%);
1182
+ background: -webkit-linear-gradient(top, #d6a719 0%,#e6bb3b 100%);
1183
+ background: linear-gradient(to bottom, #d6a719 0%,#e6bb3b 100%);
1184
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#d6a719', endColorstr='#e6bb3b',GradientType=0 );
1185
+ }
1186
+ /* Variation: Light */
1187
+ .wpmud .button-light {
1188
+ background: transparent;
1189
+ color: #777771;
1190
+ box-shadow: 0 0 0 1px #E3E3E3 inset;
1191
+ }
1192
+ /* http://www.colorzilla.com/gradient-editor/#f4f4f4+0,e8e8e8+100 */
1193
+ .wpmud .button-light:hover:not(:focus):not(:active) {
1194
+ color: #555;
1195
+ box-shadow: 0 0 0 1px #D8D8D8 inset;
1196
+ background: #f1f1f1;
1197
+ }
1198
+ /* http://www.colorzilla.com/gradient-editor/#d0d0d0+0,f4f4f4+100 */
1199
+ .wpmud .button-light:active,
1200
+ .wpmud .button-light:focus {
1201
+ color: #444;
1202
+ box-shadow: 0 0 0 1px #D0D0D0 inset;
1203
+ background: #d8d8d8;
1204
+ background: -moz-linear-gradient(top, #d8d8d8 0%, #f4f4f4 100%);
1205
+ background: -webkit-linear-gradient(top, #d8d8d8 0%,#f4f4f4 100%);
1206
+ background: linear-gradient(to bottom, #d8d8d8 0%,#f4f4f4 100%);
1207
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#d8d8d8', endColorstr='#f4f4f4',GradientType=0 );
1208
+ }
1209
+ /* Variation: Light */
1210
+ .wpmud .button-deactivated,
1211
+ .wpmud .button-deactivated:hover:not(:focus):not(:active),
1212
+ .wpmud .button-deactivated:active,
1213
+ .wpmud .button-deactivated:focus {
1214
+ color: #AAA;
1215
+ box-shadow: 0 0 0 1px #F3F3F3 inset;
1216
+ background: #F8F8F8;
1217
+ }
1218
+ /* Variation: Text button */
1219
+ .wpmud .button-text {
1220
+ background: transparent;
1221
+ color: #777771;
1222
+ box-shadow: none;
1223
+ border: none;
1224
+ padding-left: 0;
1225
+ padding-right: 0;
1226
+ }
1227
+ .wpmud .button-text:hover:not(:focus):not(:active) {
1228
+ color: #0093B1;
1229
+ box-shadow: none;
1230
+ background: transparent;
1231
+ }
1232
+ /* http://www.colorzilla.com/gradient-editor/#e8e8e8+0,f4f4f4+100 */
1233
+ .wpmud .button-text:active,
1234
+ .wpmud .button-text:focus {
1235
+ color: #0093B1;
1236
+ background: transparent;
1237
+ box-shadow: none;
1238
+ }
1239
+ .wpmud .button.button-text.button-small,
1240
+ .wpmud .button.button-text.button-big {
1241
+ padding-left: 0;
1242
+ padding-right: 0;
1243
+ }
1244
+ .wpmud .button-text.disabled,
1245
+ .wpmud .button-text:disabled {
1246
+ background: transparent !important;
1247
+ }
1248
+ /* Variation: Small button */
1249
+ .wpmud .button.button-small {
1250
+ font: 500 14px/20px 'Roboto Condensed';
1251
+ padding: 6px 12px 4px;
1252
+ height: auto;
1253
+ }
1254
+ /* Variation: Big button */
1255
+ .wpmud .button.button-big {
1256
+ padding: 18px 24px 17px;
1257
+ height: auto;
1258
+ }
1259
+ /* Variation: CTA (normal) */
1260
+ .wpmud .button.button-cta {
1261
+ box-shadow: 0px 3px 0px 0px #0093B1;
1262
+ }
1263
+ .wpmud .button.button-cta:hover:not(:focus):not(:active),
1264
+ .wpmud .button.button-cta:active,
1265
+ .wpmud .button.button-cta:focus {
1266
+ box-shadow: 0px 3px 0px 0px #007391;
1267
+ }
1268
+ /* Variation: CTA (green) */
1269
+ .wpmud .button.button-green.button-cta {
1270
+ box-shadow: 0px 3px 0px 0px #1F947B;
1271
+ }
1272
+ .wpmud .button.button-green.button-cta:hover:not(:focus):not(:active),
1273
+ .wpmud .button.button-green.button-cta:active,
1274
+ .wpmud .button.button-green.button-cta:focus {
1275
+ box-shadow: 0px 3px 0px 0px #00745B;
1276
+ }
1277
+ /* Restore the default WP dismiss button */
1278
+ .wpmud .notice-dismiss,
1279
+ .wpmud .notice-dismiss:hover:not(:focus):not(:active),
1280
+ .wpmud .notice-dismiss:hover,
1281
+ .wpmud .notice-dismiss:focus,
1282
+ .wpmud .notice-dismiss:active {
1283
+ border: none;
1284
+ margin: 0;
1285
+ padding: 9px;
1286
+ background: none;
1287
+ color: #b4b9be;
1288
+ cursor: pointer;
1289
+ }
1290
+
1291
+ /* ****************************************************************************
1292
+ * 13. ELEMENT: FORMS
1293
+ */
1294
+ .wpmud label {
1295
+ display: block;
1296
+ padding: 7px 10px;
1297
+ font-weight: 500;
1298
+ font-family: 'Roboto', sans-serif;
1299
+ font-size: 16px;
1300
+ margin: 0 0 4px;
1301
+ color: #777771;
1302
+ }
1303
+ .wpmud label.inline-label {
1304
+ display: inline-block;
1305
+ margin: 0;
1306
+ padding: 0;
1307
+ font-weight: inherit;
1308
+ font-size: inherit;
1309
+ }
1310
+ .wpmud form > div {
1311
+ padding-top: 5px;
1312
+ }
1313
+ .wpmud form > div:first-child,
1314
+ .wpmud form > div.buttons {
1315
+ padding-top: 0;
1316
+ }
1317
+
1318
+ /* ****************************************************************************
1319
+ * 14. ELEMENT: INPUT (general styles)
1320
+ */
1321
+ .wpmud :focus,
1322
+ .wpmud textarea:focus,
1323
+ .wpmud select:focus,
1324
+ .wpmud input:focus {
1325
+ outline-color: transparent;
1326
+ outline-style: none;
1327
+ box-shadow: none;
1328
+ }
1329
+ .wpmud .input,
1330
+ .wpmud input[type="text"],
1331
+ .wpmud input[type="email"],
1332
+ .wpmud input[type="search"],
1333
+ .wpmud input[type="password"],
1334
+ .wpmud select,
1335
+ .wpmud textarea {
1336
+ color: #999;
1337
+ display: block;
1338
+ font: 500 15px/25px 'Roboto';
1339
+ width: 100%;
1340
+ max-width: 100%;
1341
+ padding: 7px 15px 6px;
1342
+ margin: 0px 0px 15px 0px;
1343
+ border: 1px solid #DDD;
1344
+ background: #FFF;
1345
+ border-radius: 4px;
1346
+ box-shadow: none;
1347
+ transition-property: background, color, border-color;
1348
+ transition-duration: 0.3s;
1349
+ }
1350
+ .wpmud .input:hover,
1351
+ .wpmud .input:focus,
1352
+ .wpmud input[type="text"]:hover,
1353
+ .wpmud input[type="text"]:focus,
1354
+ .wpmud input[type="email"]:hover,
1355
+ .wpmud input[type="email"]:focus,
1356
+ .wpmud input[type="search"]:hover,
1357
+ .wpmud input[type="search"]:focus,
1358
+ .wpmud input[type="password"]:hover,
1359
+ .wpmud input[type="password"]:focus,
1360
+ .wpmud select:hover,
1361
+ .wpmud select:focus,
1362
+ .wpmud textarea:hover,
1363
+ .wpmud textarea:focus {
1364
+ border-color: #BBB;
1365
+ color: #3D464D;
1366
+ }
1367
+ .wpmud .input:hover:not(:focus),
1368
+ .wpmud input[type="text"]:hover:not(:focus),
1369
+ .wpmud input[type="email"]:hover:not(:focus),
1370
+ .wpmud input[type="search"]:hover:not(:focus),
1371
+ .wpmud input[type="password"]:hover:not(:focus),
1372
+ .wpmud select:hover:not(:focus),
1373
+ .wpmud textarea:hover:not(:focus) {
1374
+ color: #3D464D;
1375
+ }
1376
+ .wpmud .input:disabled,
1377
+ .wpmud .input.disabled,
1378
+ .wpmud input[type="text"]:disabled,
1379
+ .wpmud input[type="text"].disabled,
1380
+ .wpmud input[type="email"]:disabled,
1381
+ .wpmud input[type="email"].disabled,
1382
+ .wpmud input[type="search"]:disabled,
1383
+ .wpmud input[type="search"].disabled,
1384
+ .wpmud input[type="password"]:disabled,
1385
+ .wpmud input[type="password"].disabled,
1386
+ .wpmud select:disabled,
1387
+ .wpmud select.disabled,
1388
+ .wpmud textarea:disabled,
1389
+ .wpmud textarea.disabled {
1390
+ background: #F6F6F6 !important;
1391
+ color: #AAA !important;
1392
+ border-color: #DDD !important;
1393
+ cursor: default;
1394
+ }
1395
+ .wpmud input[type="text"]::-webkit-input-placeholder,
1396
+ .wpmud input[type="email"]::-webkit-input-placeholder,
1397
+ .wpmud input[type="search"]::-webkit-input-placeholder,
1398
+ .wpmud input[type="password"]::-webkit-input-placeholder,
1399
+ .wpmud textarea::-webkit-input-placeholder {
1400
+ position: relative;
1401
+ top: 0;
1402
+ }
1403
+ .wpmud input[type="text"]:focus::-webkit-input-placeholder,
1404
+ .wpmud input[type="email"]:focus::-webkit-input-placeholder,
1405
+ .wpmud input[type="search"]:focus::-webkit-input-placeholder,
1406
+ .wpmud input[type="password"]:focus::-webkit-input-placeholder,
1407
+ .wpmud textarea:focus::-webkit-input-placeholder {
1408
+ transition: opacity 0.3s 0.4s ease;
1409
+ opacity: 0.25;
1410
+ }
1411
+
1412
+ /* ****************************************************************************
1413
+ * 15. ELEMENT: TOGGLE (styled checkbox)
1414
+ */
1415
+ .wpmud .toggle {
1416
+ position: relative;
1417
+ display: inline-block;
1418
+ vertical-align: middle;
1419
+ white-space: nowrap;
1420
+ }
1421
+ .wpmud .toggle .toggle-checkbox {
1422
+ display: none;
1423
+ }
1424
+ .wpmud .toggle .toggle-label {
1425
+ background: #1ABC9C;
1426
+ display: inline-block;
1427
+ position: relative;
1428
+ height: 21px;
1429
+ width: 34px;
1430
+ padding: 0;
1431
+ margin: 0;
1432
+ border-radius: 11px;
1433
+ transition: background .2s;
1434
+ }
1435
+ .wpmud .toggle .toggle-label:before {
1436
+ content: '';
1437
+ position: absolute;
1438
+ transition: all .2s;
1439
+ border-radius: 11px;
1440
+ background: #DDD;
1441
+ }
1442
+ .wpmud .toggle .toggle-label:after {
1443
+ content: '';
1444
+ background: #FCFCFC;
1445
+ display: inline-block;
1446
+ position: relative;
1447
+ width: 19px;
1448
+ height: 19px;
1449
+ transition: margin .2s;
1450
+ border-radius: 11px;
1451
+ margin: 1px;
1452
+ box-shadow: 0 0 0 1px rgba(0,0,0,0.1);
1453
+ }
1454
+ .wpmud .toggle .toggle-checkbox:hover + .toggle-label:after,
1455
+ .wpmud .toggle .toggle-label:hover:after {
1456
+ background: #FFF;
1457
+ box-shadow: 0 0 15px 0px rgba(0,0,0,0.03), 0 5px 2px 0px rgba(0,0,0,0.05), 0 0 0 1px rgba(0,0,0,0.2);
1458
+ }
1459
+ .wpmud .toggle .toggle-checkbox + .toggle-label {
1460
+ background: transparent;
1461
+ }
1462
+ .wpmud .toggle .toggle-checkbox + .toggle-label:before {
1463
+ top: 0;
1464
+ left: 0;
1465
+ right: 0;
1466
+ bottom: 0;
1467
+ }
1468
+ .wpmud .toggle .toggle-checkbox + .toggle-label:after {
1469
+ margin-left: 1px;
1470
+ }
1471
+ .wpmud .toggle .toggle-checkbox:checked + .toggle-label {
1472
+ background: #1ABC9C;
1473
+ }
1474
+ .wpmud .toggle .toggle-checkbox:checked + .toggle-label:before {
1475
+ top: 1px;
1476
+ left: 14px;
1477
+ right: 1px;
1478
+ bottom: 1px;
1479
+ }
1480
+ .wpmud .toggle .toggle-checkbox:checked + .toggle-label:after {
1481
+ margin-left: 14px;
1482
+ }
1483
+ .wpmud .toggle.disabled label,
1484
+ .wpmud .toggle.loading label {
1485
+ opacity: 0.6;
1486
+ cursor: default;
1487
+ }
1488
+ .wpmud .toggle.disabled .toggle-checkbox:hover + .toggle-label:after,
1489
+ .wpmud .toggle.loading .toggle-checkbox:hover + .toggle-label:after,
1490
+ .wpmud .toggle.disabled .toggle-label:hover:after,
1491
+ .wpmud .toggle.loading .toggle-label:hover:after {
1492
+ background: #FCFCFC;
1493
+ box-shadow: 0 0 0 1px rgba(0,0,0,0.1);
1494
+ }
1495
+ .wpmud .toggle.disabled:before,
1496
+ .wpmud .toggle.loading:before {
1497
+ vertical-align: middle;
1498
+ margin-right: 6px;
1499
+ }
1500
+
1501
+ /* ****************************************************************************
1502
+ * 16. ELEMENT: RADIO GROUP (styled radio)
1503
+ */
1504
+ .wpmud .radio-group {
1505
+ border: 1px solid #DDD;
1506
+ border-radius: 5px;
1507
+ display: inline-block;
1508
+ border-spacing: 0;
1509
+ border-collapse: separate;
1510
+ position: relative;
1511
+ }
1512
+ .wpmud .radio-group input[type="radio"] {
1513
+ display: none;
1514
+ }
1515
+ .wpmud .radio-group input[type="radio"] + label {
1516
+ background: rgba(255,255,255,0.35);
1517
+ color: #C6C6C6;
1518
+ display: table-cell;
1519
+ border-right: 1px solid #DDD;
1520
+ position: relative;
1521
+ padding: 8px 10px;
1522
+
1523
+ transition-property: background, color;
1524
+ transition-duration: 0.3s;
1525
+ }
1526
+ .wpmud .radio-group input[type="radio"] + label > [tooltip] {
1527
+ position: absolute;
1528
+ left: 0;
1529
+ top: 0;
1530
+ bottom: 0;
1531
+ right: 0;
1532
+ z-index: 9;
1533
+ }
1534
+ .wpmud .radio-group input[type="radio"]:first-child + label {
1535
+ border-radius: 4px 0 0 4px;
1536
+ }
1537
+ .wpmud .radio-group input[type="radio"] + label:last-child {
1538
+ border-radius: 0 4px 4px 0;
1539
+ border-right: 0;
1540
+ }
1541
+ .wpmud .radio-group input[type="radio"] + label:hover {
1542
+ box-shadow: 0 0 0 1px rgba(0,0,0,0.05) inset;
1543
+ color: #777771;
1544
+ }
1545
+ .wpmud .radio-group input[type="radio"]:checked + label {
1546
+ box-shadow: 0 0 0 1px rgba(0,0,0,0.2) inset;
1547
+ background: #F9F9F9;
1548
+ color: #555;
1549
+ }
1550
+ .wpmud .radio-group.with-icon input[type="radio"] + label {
1551
+ padding-right: 36px;
1552
+ }
1553
+ .wpmud .radio-group.with-icon input[type="radio"] + label:after {
1554
+ content: '\68';
1555
+
1556
+ font-size: 22px;
1557
+ vertical-align: middle;
1558
+ position: absolute;
1559
+ right: 8px;
1560
+ top: 50%;
1561
+ width: 22px;
1562
+ height: 22px;
1563
+ margin-top: -11px;
1564
+ opacity: 0.8;
1565
+ font-family: 'WPMU-DEV-App-Icons';
1566
+ speak: none;
1567
+ font-style: normal;
1568
+ font-weight: normal;
1569
+ font-variant: normal;
1570
+ text-transform: none;
1571
+ line-height: 22px;
1572
+ -webkit-font-smoothing: antialiased;
1573
+ -moz-osx-font-smoothing: grayscale;
1574
+ transition-property: color, opacity;
1575
+ transition-duration: 0.2s;
1576
+ }
1577
+ .wpmud .radio-group.with-icon input[type="radio"] + label:hover:after {
1578
+ color: #1ABC9C;
1579
+ }
1580
+ .wpmud .radio-group.with-icon input[type="radio"]:checked + label {
1581
+ box-shadow: none;
1582
+ }
1583
+ .wpmud .radio-group.with-icon input[type="radio"]:checked + label:after {
1584
+ content: '\67';
1585
+ color: #1ABC9C;
1586
+ box-shadow: none;
1587
+ opacity: 1;
1588
+ }
1589
+
1590
+ /* ****************************************************************************
1591
+ * 17. ELEMENT: SELECT
1592
+ */
1593
+ .wpmud .select-container {
1594
+ position: relative;
1595
+ z-index: 1;
1596
+ display: block;
1597
+ border: 1px solid #ddd;
1598
+ background: #FFF;
1599
+ cursor: pointer;
1600
+ border-radius: 4px;
1601
+ transition-property: background, border-color;
1602
+ transition-duration: 0.3s;
1603
+ z-index: 1;
1604
+ text-align: left;
1605
+ }
1606
+ .wpmud .select-container .dropdown-handle {
1607
+ transition: border-color 0.3s;
1608
+ display: inline-block;
1609
+ position: absolute;
1610
+ width: 45px;
1611
+ height: 41px;
1612
+ top: -1px;
1613
+ right: -1px;
1614
+ z-index: 1011;
1615
+ border-radius: 0 4px 4px 0;
1616
+ border: 1px solid #DDD;
1617
+ border-bottom: 0;
1618
+ border-left-color: transparent;
1619
+ background: #FFF;
1620
+ padding: 0;
1621
+ text-align: center;
1622
+ line-height: 40px;
1623
+ color: #DDD;
1624
+ transition-property: color, border-color;
1625
+ transition-duration: 0.3s;
1626
+ }
1627
+ .wpmud .select-list-container {
1628
+ position: relative;
1629
+ display: block;
1630
+ vertical-align: middle;
1631
+ padding-right: 45px;
1632
+ zoom: 1;
1633
+ }
1634
+ .wpmud .select-list-container .list-value {
1635
+ position: relative;
1636
+ display: block;
1637
+ overflow: hidden;
1638
+ text-overflow: ellipsis;
1639
+ background-clip: padding-box;
1640
+ text-decoration: none;
1641
+ white-space: nowrap;
1642
+ line-height: 24px;
1643
+ height: auto;
1644
+ width: 100%;
1645
+ padding: 8px 8px 8px 15px;
1646
+ border: 0;
1647
+ color: #999;
1648
+ font: 500 15px/25px 'Roboto';
1649
+ transition-property: color;
1650
+ transition-duration: 0.3s;
1651
+ }
1652
+ .wpmud .select-list-container .list-results {
1653
+ position: absolute;
1654
+ top: 41px;
1655
+ left: -9999px;
1656
+ right: -9999px;
1657
+ z-index: 1010;
1658
+ width: 0;
1659
+ border-top: 0;
1660
+ background: #FFF;
1661
+ border: 1px solid #ddd;
1662
+ margin-left: -1px;
1663
+ margin-right: -1px;
1664
+ margin-top: -2px;
1665
+ opacity: 0;
1666
+ border-radius: 0 0 4px 4px;
1667
+ font: 500 15px/25px 'Roboto';
1668
+ transition-property: opacity, border-color;
1669
+ transition-duration: 0.3s;
1670
+ }
1671
+ .wpmud .select-list-container .list-results li {
1672
+ padding: 10px 15px;
1673
+ background: none;
1674
+ color: #777;
1675
+ cursor: pointer;
1676
+ list-style: none;
1677
+ line-height: 15px;
1678
+ word-wrap: break-word;
1679
+ margin: 0;
1680
+ opacity: 0.8;
1681
+ transition-property: opacity;
1682
+ transition-duration: 0.3s;
1683
+ }
1684
+ .wpmud .select-list-container .list-results li:last-child {
1685
+ border-radius: 0 0 3px 3px;
1686
+ }
1687
+ .wpmud .select-list-container .list-results li:hover {
1688
+ background: #b5e6f8;
1689
+ color: #3d464d;
1690
+ }
1691
+ .wpmud .select-list-container .list-results .current {
1692
+ background: #FFF;
1693
+ color: #19b4cf;
1694
+ }
1695
+ .wpmud .select-container:hover {
1696
+ border-color: #BBB;
1697
+ }
1698
+ .wpmud .select-container:hover .list-value {
1699
+ color: #3D464D;
1700
+ }
1701
+ .wpmud .select-container:hover .list-results {
1702
+ border-left-color: #BBB;
1703
+ border-right-color: #BBB;
1704
+ border-bottom-color: #BBB;
1705
+ }
1706
+ .wpmud .select-container:hover .dropdown-handle {
1707
+ border-top-color: #BBB;
1708
+ border-right-color: #BBB;
1709
+ }
1710
+ .wpmud .select-container.active {
1711
+ z-index: 99999;
1712
+ }
1713
+ .wpmud .select-container.active .list-value {
1714
+ background: #FCFCFC;
1715
+ border-radius: 3px 0 0 0;
1716
+ color: #999;
1717
+ }
1718
+ .wpmud .select-container.active .dropdown-handle {
1719
+ border-color: #DDD;
1720
+ border-bottom-right-radius: 0;
1721
+ }
1722
+ .wpmud .select-container.active .list-results {
1723
+ left: 0;
1724
+ right: 0;
1725
+ width: auto;
1726
+ opacity: 1;
1727
+ transition-duration: 0;
1728
+ }
1729
+ .wpmud .select-container.active:hover {
1730
+ border-color: #DDD;
1731
+ }
1732
+ .wpmud .select-container.active:hover .list-value {
1733
+ color: #999;
1734
+ }
1735
+ .wpmud .select-container.active:hover .list-results {
1736
+ border-color: #BBB;
1737
+ }
1738
+ .wpmud .select-container.active:hover .list-results li {
1739
+ opacity: 1;
1740
+ }
1741
+ .wpmud .select-container.active:hover .dropdown-handle {
1742
+ border-color: #BBB;
1743
+ color: #BBB;
1744
+ }
1745
+ .wpmud .list-table > thead > .select-open th,
1746
+ .wpmud .list-table > tfoot > .select-open th,
1747
+ .wpmud .list-table > tbody > .select-open td {
1748
+ z-index: 9;
1749
+ }
1750
+
1751
+ /* ****************************************************************************
1752
+ * 18. ELEMENT: LISTINGS
1753
+ */
1754
+ .wpmud .listing li {
1755
+ color: #777771;
1756
+ line-height: 26px;
1757
+ padding: 2px 0 2px 34px;
1758
+ position: relative;
1759
+ }
1760
+ .wpmud .listing.bold li {
1761
+ font-weight: bold;
1762
+ }
1763
+ .wpmud .listing li:before {
1764
+ content: "\67";
1765
+ color: #0093B1;
1766
+ font-size: 22px;
1767
+ vertical-align: middle;
1768
+ position: absolute;
1769
+ left: 0;
1770
+ top: 3px;
1771
+ width: 22px;
1772
+ height: 22px;
1773
+ opacity: 0.8;
1774
+
1775
+ font-family: 'WPMU-DEV-App-Icons';
1776
+ speak: none;
1777
+ font-style: normal;
1778
+ font-weight: normal;
1779
+ font-variant: normal;
1780
+ text-transform: none;
1781
+ line-height: 1;
1782
+ -webkit-font-smoothing: antialiased;
1783
+ -moz-osx-font-smoothing: grayscale;
1784
+ }
1785
+ .wpmud .listing li.circle:before {
1786
+ content: "\68";
1787
+ }
1788
+ .wpmud .listing li.help:before {
1789
+ content: "\70";
1790
+ }
1791
+ .wpmud .listing li.up:before {
1792
+ content: "\72";
1793
+ }
1794
+ .wpmud .listing li.down:before {
1795
+ content: "\65";
1796
+ }
1797
+ .wpmud .listing li.logo:before {
1798
+ content: "\30";
1799
+ }
1800
+ .wpmud .listing li.cross:before {
1801
+ content: "\79";
1802
+ }
1803
+ .wpmud .listing li.tick:before {
1804
+ content: "\7a";
1805
+ }
1806
+ .wpmud .listing li.lock:before {
1807
+ content: "\61";
1808
+ }
1809
+ .wpmud .listing li.unlock:before {
1810
+ content: "\63";
1811
+ }
1812
+ .wpmud .listing li.black:before {
1813
+ color: #777771;
1814
+ }
1815
+ .wpmud .listing li.red:before {
1816
+ color: #fd6e70;
1817
+ }
1818
+ .wpmud .listing li.green:before {
1819
+ color: #1ABC9C;
1820
+ }
1821
+ .wpmud .listing li.yellow:before {
1822
+ color: #FDCE43;
1823
+ }
1824
+
1825
+ /* ****************************************************************************
1826
+ * 19. ELEMENT: USER NOTIFICATIONS
1827
+ */
1828
+ .wpmud .update-notice,
1829
+ .wpmud .wpmud-loading-info {
1830
+ position: fixed;
1831
+ z-index: 999998;
1832
+ top: 32px;
1833
+ left: 160px;
1834
+ right: 0;
1835
+ margin: 0;
1836
+ padding: 6px 50px;
1837
+ text-align: center;
1838
+ border-radius: 0;
1839
+ text-shadow: 0 1px 1px rgba(0,0,0,0.3);
1840
+ box-shadow: 0 4px 7px -3px rgba(0,0,0,0.3);
1841
+ }
1842
+ .wpmud .update-notice.ok {
1843
+ background: #1ABC9C;
1844
+ }
1845
+ .wpmud .update-notice.err {
1846
+ background: #d54e21;
1847
+ }
1848
+ .wpmud .update-notice p {
1849
+ color: #FFF;
1850
+ font-weight: 400;
1851
+ }
1852
+ .wpmud .update-notice .check-animation {
1853
+ border-color: #FFF;
1854
+ }
1855
+ .wpmud .update-notice .wdv-icon {
1856
+ position: absolute;
1857
+ left: 15px;
1858
+ top: 14px;
1859
+ color: #FFF;
1860
+ font-size: 32px;
1861
+ opacity: 0.75;
1862
+ }
1863
+ .wpmud .update-notice .close {
1864
+ position: absolute;
1865
+ right: 0;
1866
+ top: 0;
1867
+ width: 48px;
1868
+ height: 48px;
1869
+ text-align: center;
1870
+ line-height: 48px;
1871
+ padding: 0;
1872
+ margin: 0;
1873
+ color: #FFF;
1874
+ cursor: pointer;
1875
+ opacity: 0.35;
1876
+ transition: opacity 0.3s;
1877
+ font-weight: 100;
1878
+ font-size: 20px;
1879
+ }
1880
+ .wpmud .update-notice .close:hover {
1881
+ opacity: 1;
1882
+ }
1883
+ .wpmud .update-notice .extra-text {
1884
+ display: block;
1885
+ max-height: 100px;
1886
+ overflow: auto;
1887
+ }
1888
+ .wpmud .wpmud-loading-info {
1889
+ z-index: 999999;
1890
+ padding: 20px 50px;
1891
+ background: rgba(255, 255, 255, 0.9);
1892
+ }
1893
+ .wpmud .wpmud-loading-info p {
1894
+ color: #000;
1895
+ text-shadow: 0 -1px 1px #FFFFFF;
1896
+ }
1897
+ .wpmud.folded .update-notice,
1898
+ .wpmud.folded .wpmud-loading-info {
1899
+ left: 36px;
1900
+ }
1901
+
1902
+ /* ****************************************************************************
1903
+ * 20. ELEMENT: SEARCH BOX
1904
+ */
1905
+ .wpmud .search-box {
1906
+ position: relative;
1907
+ text-align: left;
1908
+ z-index: 999;
1909
+ background: transparent;
1910
+ }
1911
+ .wpmud .search-box .input-box {
1912
+ position: relative;
1913
+ width: 360px;
1914
+ }
1915
+ .wpmud .search-box .input-box input {
1916
+ padding: 6px 40px 7px 15px;
1917
+ margin: 0;
1918
+ }
1919
+ .wpmud .search-box .input-box .search-icon {
1920
+ position: absolute;
1921
+ right: 0;
1922
+ top: 0;
1923
+ height: 40px;
1924
+ width: 40px;
1925
+ text-align: center;
1926
+ line-height: 40px;
1927
+ color: #DDD;
1928
+ cursor: pointer;
1929
+ background: transparent url(img/spin.gif) 500px 500px no-repeat;
1930
+ background-size: 16px;
1931
+ transition-property: color;
1932
+ transition-duration: 0.3s;
1933
+ }
1934
+ .wpmud .search-box .input-box:hover .search-icon {
1935
+ color: #BBB;
1936
+ }
1937
+ .wpmud .search-box .input-box .search-icon:hover {
1938
+ color: #666;
1939
+ }
1940
+ .wpmud .search-box.progress .search-icon {
1941
+ background-position: center;
1942
+ cursor: default;
1943
+ }
1944
+ .wpmud .search-box.progress .search-icon:before {
1945
+ display: none;
1946
+ }
1947
+ .wpmud .tr > .search-box .input-box {
1948
+ margin: 0 0 0 auto;
1949
+ }
1950
+ .wpmud .search-box .current-item {
1951
+ display: none;
1952
+ margin: 0 0;
1953
+ padding: 8px 44px 8px 44px;
1954
+ position: relative;
1955
+ height: 40px;
1956
+ overflow: hidden;
1957
+ white-space: nowrap;
1958
+ text-overflow: ellipsis;
1959
+ cursor: pointer;
1960
+ font: 500 15px/25px 'Roboto';
1961
+ margin: 0;
1962
+ border: 1px solid #DDD;
1963
+ background: #FFF;
1964
+ border-radius: 4px;
1965
+ box-shadow: none;
1966
+ transition-property: border;
1967
+ transition-duration: 0.3s;
1968
+ }
1969
+ .wpmud .search-box .current-item:after {
1970
+ content: "\f153";
1971
+ position: absolute;
1972
+ right: 6px;
1973
+ top: 50%;
1974
+ margin: -14px 0 0;
1975
+ height: 28px;
1976
+ width: 28px;
1977
+ text-align: center;
1978
+ cursor: pointer;
1979
+ color: #EEE;
1980
+ font: 400 16px/28px 'dashicons';
1981
+ transition-property: color;
1982
+ transition-duration: 0.3s;
1983
+ }
1984
+ .wpmud .search-box .search-results {
1985
+ display: block;
1986
+ position: absolute;
1987
+ z-index: 9999;
1988
+ margin: 6px 0 30px;
1989
+ padding: 0;
1990
+ width: 100%;
1991
+ box-sizing: content-box;
1992
+ background: #fff;
1993
+ border: 1px solid rgba(0,0,0,0.12);
1994
+ background-clip: padding-box;
1995
+ box-shadow: 0 3px 7px rgba(0,0,0,0.12);
1996
+ border-radius: 5px;
1997
+ max-height: 460px;
1998
+ overflow: auto;
1999
+ }
2000
+ .wpmud .search-box .no-results {
2001
+ display: none;
2002
+ position: absolute;
2003
+ z-index: 9999;
2004
+ margin: 6px 0 30px;
2005
+ width: 100%;
2006
+ background: #fcfcfc;
2007
+ border: 1px solid rgba(0,0,0,0.08);
2008
+ background-clip: padding-box;
2009
+ box-shadow: 0 3px 7px rgba(0,0,0,0.08);
2010
+ border-radius: 5px;
2011
+ max-height: 460px;
2012
+ overflow: auto;
2013
+ text-align: center;
2014
+ padding: 7px;
2015
+ font-style: italic;
2016
+ cursor: default;
2017
+ color: #999;
2018
+ }
2019
+ .wpmud .search-box .search-results > ul {
2020
+ margin: 0;
2021
+ padding: 0;
2022
+ list-style: none;
2023
+ }
2024
+ .wpmud .search-box .search-results > ul > li {
2025
+ margin: 0 0;
2026
+ padding: 8px 8px 8px 44px;
2027
+ position: relative;
2028
+ min-height: 40px;
2029
+ cursor: pointer;
2030
+ border-bottom: 1px solid #eee;
2031
+ color: #777771;
2032
+ font-size: 13px;
2033
+ transition-property: background, color;
2034
+ transition-duration: 0.3s;
2035
+ }
2036
+ .wpmud .search-box .search-results > ul > li:first-child {
2037
+ border-top-left-radius: 4px;
2038
+ border-top-right-radius: 4px;
2039
+ }
2040
+ .wpmud .search-box .search-results > ul > li:last-child {
2041
+ border-bottom: 0;
2042
+ border-bottom-left-radius: 4px;
2043
+ border-bottom-right-radius: 4px;
2044
+ }
2045
+ .wpmud .search-box .search-results > ul > li:hover {
2046
+ background-color: #F4F4F4;
2047
+ color: #333331;
2048
+ }
2049
+ .wpmud .search-box .current-item .title,
2050
+ .wpmud .search-box .search-results .title {
2051
+ color: #0089d7;
2052
+ font-size: 15px;
2053
+ display: block;
2054
+ overflow: hidden;
2055
+ text-overflow: ellipsis;
2056
+ white-space: nowrap;
2057
+ transition-property: color;
2058
+ transition-duration: 0.3s;
2059
+ }
2060
+ .wpmud .search-box .current-item .title {
2061
+ color: #999;
2062
+ }
2063
+ .wpmud .search-box .current-item:hover {
2064
+ border-color: #BBB;
2065
+ }
2066
+ .wpmud .search-box .current-item:hover:after {
2067
+ color: #BBB;
2068
+ }
2069
+ .wpmud .search-box .current-item:hover .title {
2070
+ color: #19B4CF;
2071
+ }
2072
+ .wpmud .search-box .current-item .thumb,
2073
+ .wpmud .search-box .search-results .thumb {
2074
+ position: absolute;
2075
+ left: 8px;
2076
+ top: 50%;
2077
+ margin: -14px 0 0;
2078
+ width: 28px;
2079
+ height: 28px;
2080
+ background-size: cover;
2081
+ background-position: center;
2082
+ }
2083
+
2084
+ /* ****************************************************************************
2085
+ * 21. ELEMENT: COUNT-BADGE
2086
+ */
2087
+ .wpmud .count {
2088
+ display: inline-block;
2089
+ text-align: center;
2090
+ padding: 2px 10px;
2091
+ min-width: 35px;
2092
+ position: relative;
2093
+ border-radius: 5px;
2094
+ border: 2px solid #DDDDDD;
2095
+ vertical-align: middle;
2096
+ height: 30px;
2097
+ line-height: 24px;
2098
+ color: #b6b6b6;
2099
+ cursor: default;
2100
+ font-weight: normal;
2101
+ }
2102
+ .wpmud .count.reply:before {
2103
+ content: '';
2104
+ position: absolute;
2105
+ bottom: -8px;
2106
+ right: 4px;
2107
+ border-width: 8px 0px 0px 12px;
2108
+ border-style: solid;
2109
+ border-color: #DDDDDD transparent;
2110
+ display: block;
2111
+ width: 0;
2112
+ }
2113
+ .wpmud .count.reply:after {
2114
+ content: '';
2115
+ position: absolute;
2116
+ bottom: -4px;
2117
+ right: 6px;
2118
+ border-width: 4px 0px 0px 6px;
2119
+ border-style: solid;
2120
+ border-color: #fff transparent;
2121
+ display: block;
2122
+ width: 0;
2123
+ }
2124
+ .wpmud .count.reply.mirror:before {
2125
+ left: 4px;
2126
+ border-width: 8px 12px 0px 0px;
2127
+ }
2128
+ .wpmud .count.reply.mirror:after {
2129
+ left: 6px;
2130
+ border-width: 4px 6px 0px 0px;
2131
+ }
2132
+ .wpmud .count.notification {
2133
+ background: #fecf2f;
2134
+ border-color: #fecf2f;
2135
+ color: #fff;
2136
+ }
2137
+ .wpmud .count.notification:before,
2138
+ .wpmud .count.notification:after {
2139
+ border-color: #fecf2f transparent;
2140
+ }
2141
+
2142
+ /* ****************************************************************************
2143
+ * 22. ELEMENT: PAGE HEADER
2144
+ */
2145
+ .wpmud #header {
2146
+ margin-bottom: 40px;
2147
+ }
2148
+ .wpmud #header h1 {
2149
+ text-align: left;
2150
+ text-transform: uppercase;
2151
+ font-size: 32px;
2152
+ font-weight: bold;
2153
+ max-width: none;
2154
+ white-space: nowrap;
2155
+ overflow: hidden;
2156
+ text-overflow: ellipsis;
2157
+ line-height: 40px;
2158
+ }
2159
+ .wpmud #header .actions {
2160
+ float: right;
2161
+ }
2162
+ .wpmud #header .actions .button + .button {
2163
+ margin-left: 2px;
2164
+ }
2165
+ .wpmud #header .actions .flag {
2166
+ position: absolute;
2167
+ top: 0;
2168
+ background: #CAA;
2169
+ color: #fff;
2170
+ border-radius: 0;
2171
+ margin-left: -41px;
2172
+ line-height: 30px;
2173
+ height: 40px;
2174
+ width: 26px;
2175
+ text-align: center;
2176
+ font-size: 18px;
2177
+ z-index: 1000;
2178
+ }
2179
+ .wpmud #header .actions .flag:before {
2180
+ content: '';
2181
+ position: absolute;
2182
+ bottom: 0;
2183
+ left: 0;
2184
+ border: 13px solid transparent;
2185
+ border-width: 8px 13px;
2186
+ border-bottom-color: #F4F4F4;
2187
+ }
2188
+ .wpmud #header .actions .flag [tooltip] {
2189
+ position: absolute;
2190
+ left: 0;
2191
+ right: 0;
2192
+ top: 0;
2193
+ bottom: 5px;
2194
+ }
2195
+ .wpmud #subheader {
2196
+ min-height: 60px;
2197
+ margin-top: -34px;
2198
+ margin-bottom: 20px;
2199
+ }
2200
+
2201
+ /* ****************************************************************************
2202
+ * 23. FONTAWESOME
2203
+ */
2204
+ @font-face {
2205
+ font-family: 'FontAwesomeWdv';
2206
+ src: url('font/fontawesome-webfont.eot');
2207
+ src: url('font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'),
2208
+ url('font/fontawesome-webfont.woff') format('woff'),
2209
+ url('font/fontawesome-webfont.ttf') format('truetype'),
2210
+ url('font/fontawesome-webfont.svgz#FontAwesomeRegular') format('svg'),
2211
+ url('font/fontawesome-webfont.svg#FontAwesomeRegular') format('svg');
2212
+ font-weight: normal;
2213
+ font-style: normal;
2214
+ }
2215
+ .wdv-icon:before{font-family:FontAwesomeWdv;font-weight:normal;font-style:normal;display:inline-block;text-decoration:inherit}a .wdv-icon{display:inline-block;text-decoration:inherit}.wdv-icon-large:before{vertical-align:top;font-size:1.3333333333333333em}.btn .wdv-icon{line-height:.9em}li .wdv-icon, .action_links .wdv-icon, .wdv-icon.wdv-icon-fw{display:inline-block;width:1.25em;text-align:center}li .wdv-icon-large.wdv-icon,li .wdv-icon-large.wdv-icon{width:1.875em}li.wdv-icon{margin-left:0;list-style-type:none}li.wdv-icon:before{text-indent:-2em;text-align:center}li.wdv-icon.wdv-icon-large:before{text-indent:-1.3333333333333333em}.wdv-icon-glass:before{content:"\f000"}.wdv-icon-music:before{content:"\f001"}.wdv-icon-search:before{content:"\f002"}.wdv-icon-envelope:before{content:"\f003"}.wdv-icon-heart:before{content:"\f004"}.wdv-icon-star:before{content:"\f005"}.wdv-icon-star-empty:before{content:"\f006"}.wdv-icon-user:before{content:"\f007"}.wdv-icon-film:before{content:"\f008"}.wdv-icon-th-large:before{content:"\f009"}.wdv-icon-th:before{content:"\f00a"}.wdv-icon-th-list:before{content:"\f00b"}.wdv-icon-ok:before{content:"\f00c"}.wdv-icon-remove:before{content:"\f00d"}.wdv-icon-zoom-in:before{content:"\f00e"}.wdv-icon-zoom-out:before{content:"\f010"}.wdv-icon-off:before{content:"\f011"}.wdv-icon-signal:before{content:"\f012"}.wdv-icon-cog:before{content:"\f013"}.wdv-icon-trash:before{content:"\f014"}.wdv-icon-home:before{content:"\f015"}.wdv-icon-file:before{content:"\f016"}.wdv-icon-time:before{content:"\f017"}.wdv-icon-road:before{content:"\f018"}.wdv-icon-download-alt:before{content:"\f019"}.wdv-icon-download:before{content:"\f01a"}.wdv-icon-upload:before{content:"\f01b"}.wdv-icon-inbox:before{content:"\f01c"}.wdv-icon-play-circle:before{content:"\f01d"}.wdv-icon-repeat:before{content:"\f01e"}.wdv-icon-refresh:before{content:"\f021"}.wdv-icon-list-alt:before{content:"\f022"}.wdv-icon-lock:before{content:"\f023"}.wdv-icon-flag:before{content:"\f024"}.wdv-icon-headphones:before{content:"\f025"}.wdv-icon-volume-off:before{content:"\f026"}.wdv-icon-volume-down:before{content:"\f027"}.wdv-icon-volume-up:before{content:"\f028"}.wdv-icon-qrcode:before{content:"\f029"}.wdv-icon-barcode:before{content:"\f02a"}.wdv-icon-tag:before{content:"\f02b"}.wdv-icon-tags:before{content:"\f02c"}.wdv-icon-book:before{content:"\f02d"}.wdv-icon-bookmark:before{content:"\f02e"}.wdv-icon-print:before{content:"\f02f"}.wdv-icon-camera:before{content:"\f030"}.wdv-icon-font:before{content:"\f031"}.wdv-icon-bold:before{content:"\f032"}.wdv-icon-italic:before{content:"\f033"}.wdv-icon-text-height:before{content:"\f034"}.wdv-icon-text-width:before{content:"\f035"}.wdv-icon-align-left:before{content:"\f036"}.wdv-icon-align-center:before{content:"\f037"}.wdv-icon-align-right:before{content:"\f038"}.wdv-icon-align-justify:before{content:"\f039"}.wdv-icon-list:before{content:"\f03a"}.wdv-icon-indent-left:before{content:"\f03b"}.wdv-icon-indent-right:before{content:"\f03c"}.wdv-icon-facetime-video:before{content:"\f03d"}.wdv-icon-picture:before{content:"\f03e"}.wdv-icon-pencil:before{content:"\f040"}.wdv-icon-map-marker:before{content:"\f041"}.wdv-icon-adjust:before{content:"\f042"}.wdv-icon-tint:before{content:"\f043"}.wdv-icon-edit:before{content:"\f044"}.wdv-icon-share:before{content:"\f045"}.wdv-icon-check:before{content:"\f046"}.wdv-icon-move:before{content:"\f047"}.wdv-icon-step-backward:before{content:"\f048"}.wdv-icon-fast-backward:before{content:"\f049"}.wdv-icon-backward:before{content:"\f04a"}.wdv-icon-play:before{content:"\f04b"}.wdv-icon-pause:before{content:"\f04c"}.wdv-icon-stop:before{content:"\f04d"}.wdv-icon-forward:before{content:"\f04e"}.wdv-icon-fast-forward:before{content:"\f050"}.wdv-icon-step-forward:before{content:"\f051"}.wdv-icon-eject:before{content:"\f052"}.wdv-icon-chevron-left:before{content:"\f053"}.wdv-icon-chevron-right:before{content:"\f054"}.wdv-icon-plus-sign:before{content:"\f055"}.wdv-icon-minus-sign:before{content:"\f056"}.wdv-icon-remove-sign:before{content:"\f057"}.wdv-icon-ok-sign:before{content:"\f058"}.wdv-icon-question-sign:before{content:"\f059"}.wdv-icon-info-sign:before{content:"\f05a"}.wdv-icon-screenshot:before{content:"\f05b"}.wdv-icon-remove-circle:before{content:"\f05c"}.wdv-icon-ok-circle:before{content:"\f05d"}.wdv-icon-ban-circle:before{content:"\f05e"}.wdv-icon-arrow-left:before{content:"\f060"}.wdv-icon-arrow-right:before{content:"\f061"}.wdv-icon-arrow-up:before{content:"\f062"}.wdv-icon-arrow-down:before{content:"\f063"}.wdv-icon-share-alt:before{content:"\f064"}.wdv-icon-resize-full:before{content:"\f065"}.wdv-icon-resize-small:before{content:"\f066"}.wdv-icon-plus:before{content:"\f067"}.wdv-icon-minus:before{content:"\f068"}.wdv-icon-asterisk:before{content:"\f069"}.wdv-icon-exclamation-sign:before{content:"\f06a"}.wdv-icon-gift:before{content:"\f06b"}.wdv-icon-leaf:before{content:"\f06c"}.wdv-icon-fire:before{content:"\f06d"}.wdv-icon-eye-open:before{content:"\f06e"}.wdv-icon-eye-close:before{content:"\f070"}.wdv-icon-warning-sign:before{content:"\f071"}.wdv-icon-plane:before{content:"\f072"}.wdv-icon-calendar:before{content:"\f073"}.wdv-icon-random:before{content:"\f074"}.wdv-icon-comment:before{content:"\f075"}.wdv-icon-magnet:before{content:"\f076"}.wdv-icon-chevron-up:before{content:"\f077"}.wdv-icon-chevron-down:before{content:"\f078"}.wdv-icon-retweet:before{content:"\f079"}.wdv-icon-shopping-cart:before{content:"\f07a"}.wdv-icon-folder-close:before{content:"\f07b"}.wdv-icon-folder-open:before{content:"\f07c"}.wdv-icon-resize-vertical:before{content:"\f07d"}.wdv-icon-resize-horizontal:before{content:"\f07e"}.wdv-icon-bar-chart:before{content:"\f080"}.wdv-icon-twitter-sign:before{content:"\f081"}.wdv-icon-facebook-sign:before{content:"\f082"}.wdv-icon-camera-retro:before{content:"\f083"}.wdv-icon-key:before{content:"\f084"}.wdv-icon-cogs:before{content:"\f085"}.wdv-icon-comments:before{content:"\f086"}.wdv-icon-thumbs-up:before{content:"\f087"}.wdv-icon-thumbs-down:before{content:"\f088"}.wdv-icon-star-half:before{content:"\f089"}.wdv-icon-heart-empty:before{content:"\f08a"}.wdv-icon-signout:before{content:"\f08b"}.wdv-icon-linkedin-sign:before{content:"\f08c"}.wdv-icon-pushpin:before{content:"\f08d"}.wdv-icon-external-link:before{content:"\f08e"}.wdv-icon-signin:before{content:"\f090"}.wdv-icon-trophy:before{content:"\f091"}.wdv-icon-github-sign:before{content:"\f092"}.wdv-icon-upload-alt:before{content:"\f093"}.wdv-icon-lemon:before{content:"\f094"}.wdv-icon-phone:before{content:"\f095"}.wdv-icon-check-empty:before{content:"\f096"}.wdv-icon-bookmark-empty:before{content:"\f097"}.wdv-icon-phone-sign:before{content:"\f098"}.wdv-icon-twitter:before{content:"\f099"}.wdv-icon-facebook:before{content:"\f09a"}.wdv-icon-github:before{content:"\f09b"}.wdv-icon-unlock:before{content:"\f09c"}.wdv-icon-credit-card:before{content:"\f09d"}.wdv-icon-rss:before{content:"\f09e"}.wdv-icon-hdd:before{content:"\f0a0"}.wdv-icon-bullhorn:before{content:"\f0a1"}.wdv-icon-bell:before{content:"\f0a2"}.wdv-icon-certificate:before{content:"\f0a3"}.wdv-icon-hand-right:before{content:"\f0a4"}.wdv-icon-hand-left:before{content:"\f0a5"}.wdv-icon-hand-up:before{content:"\f0a6"}.wdv-icon-hand-down:before{content:"\f0a7"}.wdv-icon-circle-arrow-left:before{content:"\f0a8"}.wdv-icon-circle-arrow-right:before{content:"\f0a9"}.wdv-icon-circle-arrow-up:before{content:"\f0aa"}.wdv-icon-circle-arrow-down:before{content:"\f0ab"}.wdv-icon-globe:before{content:"\f0ac"}.wdv-icon-wrench:before{content:"\f0ad"}.wdv-icon-tasks:before{content:"\f0ae"}.wdv-icon-filter:before{content:"\f0b0"}.wdv-icon-briefcase:before{content:"\f0b1"}.wdv-icon-fullscreen:before{content:"\f0b2"}.wdv-icon-group:before{content:"\f0c0"}.wdv-icon-link:before{content:"\f0c1"}.wdv-icon-cloud:before{content:"\f0c2"}.wdv-icon-beaker:before{content:"\f0c3"}.wdv-icon-cut:before{content:"\f0c4"}.wdv-icon-copy:before{content:"\f0c5"}.wdv-icon-paper-clip:before{content:"\f0c6"}.wdv-icon-save:before{content:"\f0c7"}.wdv-icon-sign-blank:before{content:"\f0c8"}.wdv-icon-reorder:before{content:"\f0c9"}.wdv-icon-list-ul:before{content:"\f0ca"}.wdv-icon-list-ol:before{content:"\f0cb"}.wdv-icon-strikethrough:before{content:"\f0cc"}.wdv-icon-underline:before{content:"\f0cd"}.wdv-icon-table:before{content:"\f0ce"}.wdv-icon-magic:before{content:"\f0d0"}.wdv-icon-truck:before{content:"\f0d1"}.wdv-icon-pinterest:before{content:"\f0d2"}.wdv-icon-pinterest-sign:before{content:"\f0d3"}.wdv-icon-google-plus-sign:before{content:"\f0d4"}.wdv-icon-google-plus:before{content:"\f0d5"}.wdv-icon-money:before{content:"\f0d6"}.wdv-icon-caret-down:before{content:"\f0d7"}.wdv-icon-caret-up:before{content:"\f0d8"}.wdv-icon-caret-left:before{content:"\f0d9"}.wdv-icon-caret-right:before{content:"\f0da"}.wdv-icon-columns:before{content:"\f0db"}.wdv-icon-sort:before{content:"\f0dc"}.wdv-icon-sort-down:before{content:"\f0dd"}.wdv-icon-sort-up:before{content:"\f0de"}.wdv-icon-envelope-alt:before{content:"\f0e0"}.wdv-icon-linkedin:before{content:"\f0e1"}.wdv-icon-undo:before{content:"\f0e2"}.wdv-icon-legal:before{content:"\f0e3"}.wdv-icon-dashboard:before{content:"\f0e4"}.wdv-icon-comment-alt:before{content:"\f0e5"}.wdv-icon-comments-alt:before{content:"\f0e6"}.wdv-icon-bolt:before{content:"\f0e7"}.wdv-icon-sitemap:before{content:"\f0e8"}.wdv-icon-umbrella:before{content:"\f0e9"}.wdv-icon-paste:before{content:"\f0ea"}.wdv-icon-user-md:before{content:"\f200"}
2216
+
2217
+ /* ****************************************************************************
2218
+ * 24. WPMUDEV ICONFONT
2219
+ */
2220
+ @font-face {
2221
+ font-family: 'WPMU-DEV-App-Icons';
2222
+ src:url('font/WPMU-DEV-App-Icons.eot?yhrhds');
2223
+ src:url('font/WPMU-DEV-App-Icons.eot?#iefixyhrhds') format('embedded-opentype'),
2224
+ url('font/WPMU-DEV-App-Icons.ttf?yhrhds') format('truetype'),
2225
+ url('font/WPMU-DEV-App-Icons.woff?yhrhds') format('woff'),
2226
+ url('font/WPMU-DEV-App-Icons.svg?yhrhds#WPMU-DEV-App-Icons') format('svg');
2227
+ font-weight: normal;
2228
+ font-style: normal;
2229
+ }
2230
+ .dev-icon {
2231
+ font-family: 'WPMU-DEV-App-Icons';
2232
+ speak: none;
2233
+ font-style: normal;
2234
+ font-weight: normal;
2235
+ font-variant: normal;
2236
+ text-transform: none;
2237
+ line-height: 1;
2238
+ font-size: 14px;
2239
+ -webkit-font-smoothing: antialiased;
2240
+ -moz-osx-font-smoothing: grayscale;
2241
+ }
2242
+ .dev-icon-comment:before {
2243
+ content: "\41";
2244
+ }
2245
+ .dev-icon-speach:before {
2246
+ content: "\6d";
2247
+ }
2248
+ .dev-icon-speach_alt:before {
2249
+ content: "\3d";
2250
+ }
2251
+ .dev-icon-download:before {
2252
+ content: "\42";
2253
+ }
2254
+ .dev-icon-download_alt:before {
2255
+ content: "\69";
2256
+ }
2257
+ .dev-icon-upload:before {
2258
+ content: "\56";
2259
+ }
2260
+ .dev-icon-error:before {
2261
+ content: "\45";
2262
+ }
2263
+ .dev-icon-archive:before {
2264
+ content: "\4f";
2265
+ }
2266
+ .dev-icon-logo:before {
2267
+ content: "\39";
2268
+ }
2269
+ .dev-icon-logo_alt:before {
2270
+ content: "\30";
2271
+ }
2272
+ .dev-icon-wordpress:before {
2273
+ content: "\47";
2274
+ }
2275
+ .dev-icon-facebook:before {
2276
+ content: "\46";
2277
+ }
2278
+ .dev-icon-twitter:before {
2279
+ content: "\49";
2280
+ }
2281
+ .dev-icon-github:before {
2282
+ content: "\4a";
2283
+ }
2284
+ .dev-icon-stackoverflow:before {
2285
+ content: "\4b";
2286
+ }
2287
+ .dev-icon-linkedin:before {
2288
+ content: "\4c";
2289
+ }
2290
+ .dev-icon-medium:before {
2291
+ content: "\4d";
2292
+ }
2293
+ .dev-icon-quora:before {
2294
+ content: "\51";
2295
+ }
2296
+ .dev-icon-seo:before {
2297
+ content: "\53";
2298
+ }
2299
+ .dev-icon-minify:before {
2300
+ content: "\4e";
2301
+ }
2302
+ .dev-icon-uptime:before {
2303
+ content: "\55";
2304
+ }
2305
+ .dev-icon-world:before {
2306
+ content: "\57";
2307
+ }
2308
+ .dev-icon-pos_footer:before {
2309
+ content: "\59";
2310
+ }
2311
+ .dev-icon-pos_middle:before {
2312
+ content: "\58";
2313
+ }
2314
+ .dev-icon-pos_header:before {
2315
+ content: "\43";
2316
+ }
2317
+ .dev-icon-book:before {
2318
+ content: "\62";
2319
+ }
2320
+ .dev-icon-support:before {
2321
+ content: "\6e";
2322
+ }
2323
+ .dev-icon-rocket:before {
2324
+ content: "\6a";
2325
+ }
2326
+ .dev-icon-rocket_alt:before {
2327
+ content: "\76";
2328
+ }
2329
+ .dev-icon-lock:before {
2330
+ content: "\61";
2331
+ }
2332
+ .dev-icon-unlock:before {
2333
+ content: "\63";
2334
+ }
2335
+ .dev-icon-plugin:before {
2336
+ content: "\64";
2337
+ }
2338
+ .dev-icon-caret_up:before {
2339
+ content: "\72";
2340
+ }
2341
+ .dev-icon-caret_right:before {
2342
+ content: "\33";
2343
+ }
2344
+ .dev-icon-caret_down:before {
2345
+ content: "\65";
2346
+ }
2347
+ .dev-icon-caret_left:before {
2348
+ content: "\7c";
2349
+ }
2350
+ .dev-icon-power:before {
2351
+ content: "\66";
2352
+ }
2353
+ .dev-icon-radio_default:before {
2354
+ content: "\68";
2355
+ }
2356
+ .dev-icon-radio:before {
2357
+ content: "\68";
2358
+ }
2359
+ .dev-icon-radio_checked:before {
2360
+ content: "\67";
2361
+ }
2362
+ .dev-icon-cross:before {
2363
+ content: "\79";
2364
+ }
2365
+ .dev-icon-tick:before {
2366
+ content: "\7a";
2367
+ }
2368
+ .dev-icon-search:before {
2369
+ content: "\6b";
2370
+ }
2371
+ .dev-icon-info:before {
2372
+ content: "\70";
2373
+ }
2374
+ .dev-icon-devman:before {
2375
+ content: "\31";
2376
+ }
2377
+ .dev-icon-upfront:before {
2378
+ content: "\37";
2379
+ }
2380
+ .dev-icon-hummingbird:before {
2381
+ content: "\48";
2382
+ }
2383
+ .dev-icon-defender:before {
2384
+ content: "\44";
2385
+ }
2386
+ .dev-icon-theme:before {
2387
+ content: "\6c";
2388
+ }
2389
+ .dev-icon-pencil:before {
2390
+ content: "\50";
2391
+ }
2392
+ .dev-icon-star:before {
2393
+ content: "\5a";
2394
+ }
2395
+ .dev-icon-trash:before {
2396
+ content: "\54";
2397
+ }
2398
+ .dev-icon-recycle:before {
2399
+ content: "\52";
2400
+ }
2401
+ .dev-icon-fix:before {
2402
+ content: "\32";
2403
+ }
2404
+ .dev-icon-edit:before {
2405
+ content: "\6f";
2406
+ }
2407
+ .dev-icon-options:before {
2408
+ content: "\73";
2409
+ }
2410
+ .dev-icon-cog:before {
2411
+ content: "\74";
2412
+ }
2413
+ .dev-icon-badge:before {
2414
+ content: "\71";
2415
+ }
2416
+ .dev-icon-cylinder:before {
2417
+ content: "\75";
2418
+ }
2419
+ .dev-icon-trophy:before {
2420
+ content: "\78";
2421
+ }
2422
+ .dev-icon-bell:before {
2423
+ content: "\77";
2424
+ }
2425
+
2426
+ /* ****************************************************************************
2427
+ * 25. CUSTOM ANIMATIONS
2428
+ */
2429
+ @keyframes fade-in {
2430
+ 0% { opacity: 0; }
2431
+ 90% { opacity: 1; }
2432
+ 100% { opacity: 1; }
2433
+ }
2434
+ @keyframes bounce-in {
2435
+ 0% { transform: translateY(-200%) scale(1.5); opacity:0; }
2436
+ 30% { opacity:1; }
2437
+ 58% { transform: translateY(0) rotate(1deg) scale(1); opacity: 1 }
2438
+ 72% { transform: translateY(-30px) rotate(-1deg); }
2439
+ 80% { transform: translateY(0) rotate(0.5deg); }
2440
+ 100% { transform: translateY(0) rotate(0deg); }
2441
+ }
2442
+ @keyframes bounce-out {
2443
+ 0% { transform: translateY(0); }
2444
+ 10% { transform: translateY(-10px) rotate(-0.5deg); }
2445
+ 30% { transform: translateY(20px) rotate(8deg); }
2446
+ 70% { opacity: 1; }
2447
+ 90% { transform: translateY(300%) translateX(40px) rotate(35deg); opacity: 0; }
2448
+ 100% { display: none; }
2449
+ }
2450
+ @keyframes check {
2451
+ 0% { height: 0; width: 0; opacity: 0; }
2452
+ 24.9% { opacity: 0; }
2453
+ 25% { height: 0; width: 0; opacity: 1; }
2454
+ 35% { height: 0; width: 10px; }
2455
+ 50% { height: 20px; width: 10px; }
2456
+ }
2457
+ @keyframes spin {
2458
+ 100% { transform:rotate(360deg); }
2459
+ }
2460
+ @keyframes collapse {
2461
+ 0% { opacity: 1; transform: scale(1); }
2462
+ 40% { opacity: 1; transform: translateY(0); }
2463
+ 90% { opacity: 0; height: 0; }
2464
+ 100% { transform: scale(1); transform: translateY(-30px) scale(0.9); }
2465
+ }
2466
+ .wpmud .check-animation {
2467
+ transform: scaleX(-1) rotate(135deg);
2468
+ transform-origin: left top;
2469
+ border-right: 4px solid #cee;
2470
+ border-top: 4px solid #cee;
2471
+ display: block;
2472
+ height: 20px;
2473
+ left: 14px;
2474
+ position: absolute;
2475
+ top: 26px;
2476
+ width: 10px;
2477
+ animation: check 3s;
2478
+ border-color: #6aa;
2479
+ }
2480
+ .wpmud .fade-in {
2481
+ animation: fade-in 0.5s ease-in;
2482
+ }
2483
+ .wpmud .fade-out {
2484
+ transition: opacity 0.5s ease-in-out;
2485
+ opacity: 0;
2486
+ }
2487
+ .wpmud .bounce-in {
2488
+ animation: bounce-in 0.8s ease-in;
2489
+ }
2490
+ .wpmud .bounce-out {
2491
+ animation: bounce-out 0.6s ease-out;
2492
+ }
2493
+ .wpmud .spin {
2494
+ animation: spin 1s linear infinite;
2495
+ }
2496
+ .wpmud .animated.collapse {
2497
+ overflow: hidden;
2498
+ animation: collapse 0.5s linear;
2499
+ }
includes/admin/shared-ui/wdev-ui.js ADDED
@@ -0,0 +1,1203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * JS used for UI of WPMUDEV plugins.
3
+ */
4
+
5
+ /*
6
+ * Initialize the Dashboard once the page is fully loaded.
7
+ */
8
+ jQuery(function() {
9
+ // Small layout fix (changes the global background color).
10
+ jQuery("html").addClass("wpmud-html");
11
+
12
+ // Add event handlers to show overlay dialogs.
13
+ jQuery(".wpmud").on("click", "a[rel=dialog]", showDialog);
14
+
15
+ // Open any auto-show overlays.
16
+ jQuery("dialog.auto-show").first().each(showDialog);
17
+
18
+ // Select code content on click.
19
+ jQuery(".wpmud").on("click", "code, pre, .sel-all", selectOnClick);
20
+
21
+ // Disable the one-time-click buttons on first click.
22
+ jQuery(".wpmud").on("click", ".one-click", disableOnClick);
23
+
24
+ // Start animation when clicking on spinner-icons.
25
+ jQuery(".wpmud").on("click", ".has-spinner", spinOnClick);
26
+
27
+ // Make Ajax-submit buttons behave as Ajax-submit buttons.
28
+ jQuery(".wpmud").on("click", ".as-ajax", ajaxSubmitLink);
29
+
30
+ // Handle close buttons inside boxes.
31
+ jQuery(".wpmud").on("click", ".can-close .close", closeElement);
32
+
33
+ // Initialize all tab-areas.
34
+ jQuery(".wpmud .tabs").each(function(){
35
+ WDP.wpmuTabs(this);
36
+ });
37
+
38
+ // Initialize all vertical tab-areas.
39
+ jQuery(".wpmud .vertical-tabs").each(function(){
40
+ WDP.wpmuVerticalTabs(this);
41
+ });
42
+
43
+ // Convert all select lists to fancy WPMU Select lists.
44
+ jQuery(".wpmud select").each(function(){
45
+ WDP.wpmuSelect(this);
46
+ });
47
+
48
+ // Convert all all search-fields to WPMU search areas.
49
+ jQuery(".wpmud input[type=search]").each(function(){
50
+ WDP.wpmuSearchfield(this);
51
+ });
52
+
53
+ // Check the page URL for special actions
54
+ checkLocalRoutes();
55
+
56
+ // Add new jQuery function jQuery().loading(true|false)
57
+ jQuery.fn.extend({
58
+ loading: function(state, message) {
59
+ if (undefined === state) { state = true; }
60
+ this.each(function() {
61
+ if (state) {
62
+ jQuery(this).addClass("loading");
63
+ } else {
64
+ jQuery(this).removeClass("loading");
65
+ }
66
+ });
67
+ if (state && message) {
68
+ jQuery(".wpmud-loading-info").remove();
69
+ message = "<p><span class='loading'></span> " + message + "</p>";
70
+ jQuery("<div></div>")
71
+ .addClass("wpmud-loading-info")
72
+ .appendTo("body")
73
+ .html(message);
74
+ } else if (!state) {
75
+ jQuery(".wpmud-loading-info").remove();
76
+ }
77
+ return this;
78
+ }
79
+ });
80
+
81
+ // When a rel=dialog element was clicked we find and open the target dialog.
82
+ function showDialog(ev) {
83
+ var el = jQuery(this);
84
+ var args = {};
85
+
86
+ if (el.data("width")) { args.width = el.data("width"); }
87
+ if (el.data("height")) { args.height = el.data("height"); }
88
+ if (el.data("class")) { args.class = el.data("class"); }
89
+ if (el.data("title")) { args.title = el.data("title"); }
90
+
91
+ if (el.is("dialog")) {
92
+ WDP.showOverlay("#" + el.attr("id"), args);
93
+ } else if (el.attr("href")) {
94
+ WDP.showOverlay(el.attr("href"), args);
95
+ }
96
+ return false;
97
+ }
98
+
99
+ // Select all text inside the element.
100
+ function selectOnClick(ev) {
101
+ WDP.selectText(this);
102
+ }
103
+
104
+ // Disable the element on click.
105
+ function disableOnClick(ev) {
106
+ var form, el = jQuery(this);
107
+
108
+ window.setTimeout(function() {
109
+ el.prop("disabled", true).addClass("disabled").loading(true);
110
+
111
+ if (el.hasClass("button")) {
112
+ form = el.closest("form");
113
+ if ( form.length ) {
114
+ form.find(":input").prop("disabled", true).addClass("disabled");
115
+ form.prop("disabled", true).addClass("disabled");
116
+ }
117
+ }
118
+ }, 20);
119
+ }
120
+
121
+ // Start animating the element on click.
122
+ function spinOnClick(ev) {
123
+ var icon, el = jQuery(this);
124
+ if (el.hasClass("spin-on-click")) { icon = el; }
125
+ else { icon = el.find(".spin-on-click"); }
126
+ icon.addClass("spin");
127
+ }
128
+
129
+ // Submit a link as ajax request instead of refreshing the window.
130
+ function ajaxSubmitLink(ev) {
131
+ var el = jQuery(this),
132
+ url = el.attr("href");
133
+
134
+ if (! url) { return false; }
135
+
136
+ el.addClass("loading disabled").prop("disabled", true);
137
+ jQuery.post(url)
138
+ .always(function() {
139
+ el.removeClass("loading disabled").prop("disabled", false);
140
+ }).fail(function() {
141
+ WDP.showError({"message": false});
142
+ });
143
+
144
+ return false;
145
+ }
146
+
147
+ // Parses the hash-tag in the current address bar.
148
+ function checkLocalRoutes() {
149
+ var route = window.location.hash.substr(1)
150
+ parts = route.split("=");
151
+
152
+ WDP.localRoutes = {
153
+ "action": false,
154
+ "param": false
155
+ };
156
+ if (! route.length ) { return; }
157
+
158
+ WDP.localRoutes.action = parts[0];
159
+ if (parts.length > 1) {
160
+ WDP.localRoutes.param = parts[1];
161
+ }
162
+ }
163
+
164
+ // Closes an element (i.e. hides and removes it)
165
+ function closeElement() {
166
+ var box = jQuery(this).closest(".can-close");
167
+
168
+ box.css({height: box.outerHeight() });
169
+ box.addClass("animated collapse");
170
+
171
+ function removeElementBox() {
172
+ box.remove();
173
+ }
174
+
175
+ window.setTimeout(removeElementBox, 450);
176
+ }
177
+ });
178
+
179
+ /*
180
+ * Define Dashboard namespace with all the functions.
181
+ * WDP = WPMUDEV Dashboard Plugin
182
+ */
183
+ window.WDP = window.WDP || {};
184
+
185
+ /**
186
+ * Display a modal overlay on the screen.
187
+ * Only one overlay can be displayed at once.
188
+ *
189
+ * The dialog source must be (or contain) an <dialog> element.
190
+ * Only the <dialog> element is parsed and displayed in the overlay.
191
+ *
192
+ * @since 4.0.0
193
+ * @param string dialogSource Either CSS class/ID, URL or HTML string.
194
+ * - ID must start with a hash '#'.
195
+ * - Class must start with a dot '.'.
196
+ * - URL contains '://' (absolute URL).
197
+ * - URL starts with slash '/' (relative URL).
198
+ * - Everything else is considered HTML string.
199
+ * @param array args Optional arguments, like callbacks
200
+ * @var callback onShow
201
+ * @var int width (only for iframes)
202
+ * @var int height (only for iframes)
203
+ * @var string class
204
+ * @var string title
205
+ */
206
+ WDP.showOverlay = function(dialogSource, args) {
207
+ var retry = false;
208
+
209
+ if ('object' !== typeof args) { args = {}; }
210
+ args.onShow = args.onShow || false;
211
+
212
+ // 1.) fetch the dialog code from the appropriate source.
213
+ if ('#' === dialogSource[0] || '.' === dialogSource[0]) {
214
+ /*
215
+ * Type 1: CSS selector
216
+ * The page contains a <dialog> element that is instantly displayed.
217
+ */
218
+ var dialog = jQuery('dialog' + dialogSource);
219
+ showTheDialog(dialog);
220
+ } else if (-1 !== dialogSource.indexOf('://') || '/' === dialogSource[0]) {
221
+ var type;
222
+ if ('/' === dialogSource[0]) { type = 'ajax'; }
223
+ else if (0 === dialogSource.indexOf(WDP.data.site_url)) { type = 'ajax'; }
224
+ else { type = 'iframe'; }
225
+
226
+ if ('ajax' === type) {
227
+ /*
228
+ * Type 2a: AJAX handler
229
+ * The URL is relative or starts with the WordPress site_url. The
230
+ * URL is called as ajax handler. Result can be either HTML code or
231
+ * a JSON object with attributes `obj.success` and `obj.data.html`
232
+ * In either case, the returned HTML needs to contain a <dialog> tag
233
+ */
234
+ jQuery.get(
235
+ dialogSource,
236
+ '',
237
+ function(resp) {
238
+ var el;
239
+ if ('{' === resp[0]) { resp = jQuery.parseJSON(resp); }
240
+ if ('object' === typeof resp) {
241
+ if (resp && resp.success && resp.data.html) {
242
+ el = jQuery(resp.data.html);
243
+ }
244
+ } else {
245
+ el = jQuery(resp);
246
+ }
247
+
248
+ if (!el || !el.length) { return; }
249
+ if (el.is('dialog')) { showTheDialog(el); }
250
+ else { showTheDialog(el.find('dialog')); }
251
+ }
252
+ );
253
+ } else if ('iframe' === type) {
254
+ /*
255
+ * Type 2b: iframe container
256
+ * An external URL is loaded inside an iframe which is displayed
257
+ * inside the dialog. The external URL may return any content.
258
+ */
259
+ var iframe = jQuery('<div><iframe class="fullsize"></iframe></div>');
260
+ iframe.find('iframe').attr('src', dialogSource);
261
+ if (args.width) { iframe.find('iframe').attr('width', args.width); }
262
+ if (args.height) { iframe.find('iframe').attr('height', args.height); }
263
+ showTheDialog(iframe);
264
+ }
265
+ } else {
266
+ /*
267
+ * Type 3: Plain HTML code
268
+ * The dialog source is plain HTML code that is parsed and displayed;
269
+ * the code needs to contain an <dialog> element.
270
+ */
271
+ var el = jQuery(dialogSource);
272
+ if (el.is('dialog')) { showTheDialog(el); }
273
+ else { showTheDialog(el.find('dialog')); }
274
+ }
275
+
276
+ // 2.) Render the dialog.
277
+ function showTheDialog(dialog) {
278
+ if ( ! dialog.length ) { return; }
279
+ if ( ! WDP.prepareOverlay() ) {
280
+ if ( ! retry ) {
281
+ retry = true;
282
+ WDP.closeOverlay();
283
+ window.setTimeout(function() { showTheDialog(dialog); }, 610);
284
+ }
285
+ return;
286
+ }
287
+
288
+ if (! args.title) {
289
+ args.title = dialog.attr('title');
290
+ }
291
+ if (args.class) {
292
+ dialog.addClass(args.class);
293
+ }
294
+
295
+ WDP.overlay.box_title.find('h3').html(args.title);
296
+ WDP.overlay.box_content.html(dialog.html());
297
+
298
+ WDP.overlay.wrapper.addClass(dialog.attr('class'));
299
+ if (dialog.hasClass('no-close')) {
300
+ WDP.overlay.wrapper.addClass('no-close');
301
+ WDP.overlay.close.remove();
302
+ }
303
+ if (dialog.find('.title-action').length) {
304
+ WDP.overlay.box_content.find('.title-action').appendTo(WDP.overlay.box_title);
305
+ }
306
+
307
+ WDP.overlay.box_content.on('click', '.close', WDP.closeOverlay);
308
+ jQuery(window).on('resize', WDP.positionOverlay);
309
+
310
+ WDP.overlay.container.addClass('has-overlay');
311
+ WDP.overlay.wrapper.show();
312
+ WDP.overlay.box.addClass('bounce-in');
313
+ WDP.overlay.back.addClass('fade-in');
314
+ WDP.overlay.visible = true;
315
+
316
+ WDP.positionOverlay();
317
+
318
+ window.setTimeout(function(){
319
+ WDP.overlay.box.removeClass('bounce-in');
320
+ WDP.overlay.back.removeClass('fade-in');
321
+ }, 1000);
322
+
323
+ if ('function' === typeof args.onShow) { args.onShow(); }
324
+ }
325
+
326
+ return WDP;
327
+ };
328
+
329
+ /**
330
+ * Closes the current modal overlay again.
331
+ *
332
+ * @since 4.0.0
333
+ */
334
+ WDP.closeOverlay = function() {
335
+ if ( WDP.prepareOverlay() ) { return WDP; }
336
+
337
+ WDP.overlay.container.removeClass('has-overlay');
338
+ WDP.overlay.box.addClass('bounce-out');
339
+ WDP.overlay.back.addClass('fade-out');
340
+ jQuery(window).off('resize', WDP.positionOverlay);
341
+
342
+ window.setTimeout(function() {
343
+ WDP.overlay.wrapper.hide()
344
+ }, 550);
345
+ window.setTimeout(function() {
346
+ WDP.overlay.wrapper.remove();
347
+ WDP.overlay.wrapper = null;
348
+ WDP.overlay.visible = false;
349
+ }, 600);
350
+
351
+ return WDP;
352
+ };
353
+
354
+ /**
355
+ * Updates the position of the overlay to keep it vertically centered on the
356
+ * screen.
357
+ *
358
+ * @since 4.0.0
359
+ */
360
+ WDP.positionOverlay = function() {
361
+ var availHeight, needHeight, newOffset;
362
+
363
+ if ( WDP.prepareOverlay() ) { return WDP; }
364
+
365
+ availHeight = WDP.overlay.scroll.height();
366
+ needHeight = WDP.overlay.box.outerHeight();
367
+ newOffset = (availHeight - needHeight) / 2;
368
+
369
+ if ( newOffset < 20 ) { newOffset = 20; }
370
+ WDP.overlay.box.css({ marginTop: newOffset });
371
+
372
+ return WDP;
373
+ };
374
+
375
+ /**
376
+ * Creates all the DOM elements needed to display the overlay element.
377
+ *
378
+ * @since 4.0.0
379
+ * @return bool True if the modal is ready to be displayed.
380
+ */
381
+ WDP.prepareOverlay = function() {
382
+ var offset = jQuery('#wpcontent').offset();
383
+
384
+ WDP.overlay = WDP.overlay || {};
385
+
386
+ if ( WDP.overlay.visible ) { return false; }
387
+
388
+ if ( ! WDP.overlay.wrapper ) {
389
+ WDP.overlay.container = jQuery('.wpmud-html');
390
+ WDP.overlay.wrapper = jQuery('<div class="dev-overlay"></div>');
391
+ WDP.overlay.back = jQuery('<div class="back"></div>');
392
+ WDP.overlay.scroll = jQuery('<div class="box-scroll"></div>');
393
+ WDP.overlay.box = jQuery('<div class="box"></div>');
394
+ WDP.overlay.box_title = jQuery('<div class="title"><h3></h3></div>');
395
+ WDP.overlay.box_content = jQuery('<div class="content"></div>');
396
+ WDP.overlay.close = jQuery('<div class="close">&times;</div>');
397
+
398
+ WDP.overlay.back.appendTo(WDP.overlay.wrapper);
399
+ WDP.overlay.scroll.appendTo(WDP.overlay.wrapper);
400
+ WDP.overlay.box.appendTo(WDP.overlay.scroll);
401
+ WDP.overlay.box_title.appendTo(WDP.overlay.box);
402
+ WDP.overlay.box_content.appendTo(WDP.overlay.box);
403
+ WDP.overlay.close.appendTo(WDP.overlay.box_title);
404
+ WDP.overlay.wrapper.appendTo('body');
405
+
406
+ WDP.overlay.close.click(WDP.closeOverlay);
407
+ }
408
+
409
+ return true;
410
+ };
411
+
412
+ /**
413
+ * Select all text inside the HTML element. This can be a div/code/input/etc.
414
+ *
415
+ * @since 4.0.0
416
+ * @param object el The HTML element.
417
+ */
418
+ WDP.selectText = function(el) {
419
+ var range, jq;
420
+ jq = jQuery( el );
421
+ el = jq[0];
422
+
423
+ if ( jq.is(':input') ) {
424
+ jq.focus().select();
425
+ } else if ( document.selection ) {
426
+ range = document.body.createTextRange();
427
+ range.moveToElementText(el);
428
+ range.select();
429
+ } else if ( window.getSelection ) {
430
+ range = document.createRange();
431
+ range.selectNode(el);
432
+ window.getSelection().addRange(range);
433
+ }
434
+
435
+ return WDP;
436
+ };
437
+
438
+ /**
439
+ * Initialize the functions of a tab-area
440
+ *
441
+ * @since 4.0.0
442
+ * @param object el The tab-area container element.
443
+ */
444
+ WDP.wpmuTabs = function(el) {
445
+ var jq = jQuery(el).closest('.tabs');
446
+
447
+ if (! jq.length) { return; }
448
+
449
+ // Resize the tab-area after short delay.
450
+ function resizeArea() {
451
+ window.setTimeout(resizeAreaHandler, 20);
452
+ }
453
+
454
+ // Resize the tab area to match the current tab.
455
+ function resizeAreaHandler() {
456
+ var current = jq.find('.tab > input:checked').parent(),
457
+ content = current.find('.content');
458
+
459
+ jq.height(content.outerHeight() + current.outerHeight() - 6);
460
+ }
461
+
462
+ // Updates the URL hash to keep tab open during page refresh
463
+ function updateHash() {
464
+ var current = jq.find('.tab > input:checked');
465
+
466
+ if (current.attr('id').length) {
467
+ WDP.updateHash(current.attr('id'));
468
+ }
469
+ resizeArea();
470
+ }
471
+
472
+ // Open the tab that is specified in window URL hash
473
+ function switchTab() {
474
+ var curTab,
475
+ route = window.location.hash.replace( /[^\w-_]/g, '' );
476
+
477
+ if (route) {
478
+ curTab = jq.find('input#' + route);
479
+
480
+ if (curTab.length && ! curTab.prop('checked')) {
481
+ curTab.prop('checked', true);
482
+ scrollWindow();
483
+ }
484
+ }
485
+ }
486
+
487
+ // Scroll the window to top of the tab list.
488
+ function scrollWindow() {
489
+ resizeArea();
490
+ jQuery('html, body').scrollTop(
491
+ jq.offset().top
492
+ - parseInt( jQuery('html').css('paddingTop') )
493
+ - 20
494
+ );
495
+ }
496
+
497
+ // Constructor.
498
+ function init() {
499
+ jq.on('click', '.tab > input[type=radio]', updateHash);
500
+ jQuery(window).on('hashchange', switchTab);
501
+
502
+ resizeArea();
503
+ switchTab();
504
+ }
505
+
506
+ init();
507
+
508
+ return WDP;
509
+ };
510
+
511
+ /**
512
+ * Initialize the functions of a vertical tab-area
513
+ *
514
+ * @since 4.0.0
515
+ * @param object el The tab-area container element.
516
+ */
517
+ WDP.wpmuVerticalTabs = function(el) {
518
+ var jq = jQuery(el).closest('.vertical-tabs'),
519
+ minHeight = 0;
520
+
521
+ if (! jq.length) { return; }
522
+
523
+ // Resize the tab-area after short delay.
524
+ function resizeArea() {
525
+ window.setTimeout(resizeAreaHandler, 20);
526
+ }
527
+
528
+ // Resize the tab area to match the current tab.
529
+ function resizeAreaHandler() {
530
+ var current = jq.find('.tab > input:checked').parent(),
531
+ content = current.find('.content'),
532
+ newHeight = content.outerHeight();
533
+
534
+ if (newHeight < minHeight) { newHeight = minHeight; }
535
+ content.css({'min-height': minHeight});
536
+ jq.height(newHeight);
537
+ }
538
+
539
+ // Find the height of the tab labels
540
+ function calcMinHeight() {
541
+ minHeight = 0;
542
+ jq.find('.tab > label:visible').each(function() {
543
+ minHeight += jQuery(this).outerHeight();
544
+ });
545
+ }
546
+
547
+ // Updates the URL hash to keep tab open during page refresh
548
+ function updateHash() {
549
+ var current = jq.find('.tab > input:checked');
550
+
551
+ if (current.attr('id').length) {
552
+ WDP.updateHash(current.attr('id'));
553
+ }
554
+ resizeArea();
555
+ }
556
+
557
+ // Open the tab that is specified in window URL hash
558
+ function switchTab() {
559
+ var curTab,
560
+ route = window.location.hash.replace( /[^\w-_]/g, '' );
561
+
562
+ if (route) {
563
+ curTab = jq.find('input#' + route);
564
+
565
+ if (curTab.length && ! curTab.prop('checked')) {
566
+ curTab.prop('checked', true);
567
+ scrollWindow();
568
+ }
569
+ }
570
+ }
571
+
572
+ // Scroll the window to top of the tab list.
573
+ function scrollWindow() {
574
+ resizeArea();
575
+ jQuery('html, body').scrollTop(
576
+ jq.offset().top
577
+ - parseInt( jQuery('html').css('paddingTop') )
578
+ - 20
579
+ );
580
+ }
581
+
582
+ // Constructor.
583
+ function init() {
584
+ jq.on('click', '.tab > input[type=radio]', updateHash);
585
+ jQuery(window).on('resize', calcMinHeight);
586
+ jQuery(window).on('hashchange', switchTab);
587
+
588
+ calcMinHeight();
589
+ resizeArea();
590
+ switchTab();
591
+ }
592
+
593
+ init();
594
+
595
+ return WDP;
596
+ };
597
+
598
+ /**
599
+ * Update a normal select list to a fancy WPMU DEV select list!
600
+ *
601
+ * @since 4.0.0
602
+ * @param object el The select element.
603
+ */
604
+ WDP.wpmuSelect = function(el) {
605
+ var jq = jQuery(el),
606
+ wrap, handle, list, value, items;
607
+
608
+ if (! jq.is("select")) { return; }
609
+ if (jq.closest(".select-container").length) { return; }
610
+
611
+ // Add the DOM elements to style the select list.
612
+ function setupElement() {
613
+ jq.wrap("<div class='select-container'>");
614
+ jq.hide();
615
+
616
+ wrap = jq.parent();
617
+ handle = jQuery("<span class='dropdown-handle'><i class='wdv-icon wdv-icon-reorder'></i></span>").prependTo(wrap);
618
+ list = jQuery("<div class='select-list-container'></div>").appendTo(wrap);
619
+ value = jQuery("<div class='list-value'>&nbsp;</div>").appendTo(list);
620
+ items = jQuery("<ul class='list-results'></ul>").appendTo(list);
621
+
622
+ wrap.addClass(jq.attr("class"));
623
+ }
624
+
625
+ // Add all the options to the new DOM elements.
626
+ function populateList() {
627
+ items.empty();
628
+ jq.find("option").each(function onPopulateLoop() {
629
+ var opt = jQuery(this),
630
+ item;
631
+ item = jQuery("<li></li>").appendTo(items);
632
+ item.text(opt.text());
633
+ item.data("value", opt.val());
634
+
635
+ if (opt.val() == jq.val()) {
636
+ selectItem(item);
637
+ }
638
+ });
639
+ }
640
+
641
+ // Toggle the dropdown state between open/closed.
642
+ function stateToggle() {
643
+ if (! wrap.hasClass("active")) {
644
+ stateOpen();
645
+ } else {
646
+ stateClose();
647
+ }
648
+ }
649
+
650
+ // Close the dropdown list.
651
+ function stateClose(item) {
652
+ if (!item) { item = wrap; }
653
+ item.removeClass("active");
654
+ item.closest("tr").removeClass("select-open");
655
+ }
656
+
657
+ // Open the dropdown list.
658
+ function stateOpen() {
659
+ jQuery(".select-container.active").each(function() {
660
+ stateClose(jQuery(this));
661
+ });
662
+ wrap.addClass("active");
663
+ wrap.closest("tr").addClass("select-open");
664
+ }
665
+
666
+ // Visually mark the specified option as "selected".
667
+ function selectItem(opt) {
668
+ value.text(opt.text());
669
+
670
+ jQuery(".current", items).removeClass("current");
671
+ opt.addClass("current");
672
+ stateClose();
673
+
674
+ // Also update the select list value.
675
+ jq.val(opt.data("value"));
676
+ jq.trigger("change");
677
+ }
678
+
679
+ // Element constructor.
680
+ function init() {
681
+ var sel_id;
682
+
683
+ setupElement();
684
+ populateList();
685
+ items.on("click", function onItemClick(ev) {
686
+ var opt = jQuery(ev.target);
687
+ selectItem(opt);
688
+ });
689
+
690
+ handle.on("click", stateToggle);
691
+ value.on("click", stateToggle);
692
+ jq.on("focus", stateOpen);
693
+
694
+ jQuery(document).click(function onOutsideClick(ev) {
695
+ var jq = jQuery(ev.target),
696
+ sel_id;
697
+
698
+ if (jq.closest(".select-container").length) { return; }
699
+ if (jq.is("label") && jq.attr("for")) {
700
+ sel_id = jq.attr("for");
701
+ if (jQuery("select#" + sel_id).length) { return; }
702
+ }
703
+
704
+ stateClose();
705
+ });
706
+
707
+ sel_id = jq.attr("id");
708
+ if (sel_id) {
709
+ jQuery("label[for=" + sel_id + "]").on("click", stateOpen);
710
+ }
711
+ }
712
+
713
+ init();
714
+
715
+ return WDP;
716
+ };
717
+
718
+ /**
719
+ * Initialize the search-areas.
720
+ *
721
+ * @since 4.0.0
722
+ * @param object el The search input element.
723
+ */
724
+ WDP.wpmuSearchfield = function(el) {
725
+ var jq = jQuery(el),
726
+ tmrDelay = 0,
727
+ lastVal = '',
728
+ tmrHide = false,
729
+ hasResults = false,
730
+ search, wrap, inpbox, emptyMsg, emptybox, resbox, reslist, curitem;
731
+
732
+ if (! jq.is('input[type="search"]')) { return; }
733
+
734
+ // Add the DOM elements to style the select list.
735
+ function setupElement() {
736
+ var classes = jq.attr('class');
737
+
738
+ jq.prop('autocomplete', 'off');
739
+ jq.wrap('<div class="search-box">');
740
+ wrap = jq.parent();
741
+
742
+ if ( classes ) {
743
+ wrap.addClass(classes);
744
+ }
745
+
746
+ jq.wrap('<div class="input-box">');
747
+ inpbox = jq.parent();
748
+ inpbox.append('<i class="search-icon dev-icon dev-icon-search"></i>');
749
+
750
+ curitem = jQuery('<div class="current-item"></div>');
751
+ curitem.appendTo(inpbox);
752
+
753
+ resbox = jQuery('<div class="search-results"></div>');
754
+ reslist = jQuery('<ul></ul>');
755
+ reslist.appendTo(resbox);
756
+ resbox.appendTo(wrap);
757
+
758
+ emptybox = jQuery('<div class="no-results"></div>');
759
+ emptybox.appendTo(wrap);
760
+ emptybox.hide();
761
+ }
762
+
763
+ // Start a timer on each keystroke. When the timer runs out a 'search' event
764
+ // is triggered.
765
+ function startDelay() {
766
+ clearDelay();
767
+
768
+ // Ignore if value did not change (i.e. cursor keys, shift, return, ...)
769
+ if (lastVal === jq.val()) { return; }
770
+ lastVal = jq.val();
771
+
772
+ tmrDelay = window.setTimeout(function() { jq.trigger('search'); }, 400);
773
+ }
774
+
775
+ // On key-DOWN we clear the timer.
776
+ function clearDelay() {
777
+ if (tmrDelay) {
778
+ window.clearTimeout(tmrDelay);
779
+ tmrDelay = 0;
780
+ }
781
+ }
782
+
783
+ // Toggle the progress state of the search box.
784
+ function doingProgress(state) {
785
+ if (state) {
786
+ wrap.addClass('progress');
787
+ } else {
788
+ wrap.removeClass('progress');
789
+ }
790
+ }
791
+
792
+ // Clear/Hide the search-results list.
793
+ function clearResults(clearFilter) {
794
+ reslist.empty();
795
+ curitem.hide();
796
+ jq.show();
797
+ hasResults = false;
798
+ resultsVisible(false);
799
+
800
+ if (clearFilter) {
801
+ if (search) {
802
+ jq.val(search);
803
+ } else {
804
+ jq.val('');
805
+ }
806
+ }
807
+ }
808
+
809
+ // Populate/Show the search-results list.
810
+ function showResults(items) {
811
+ clearResults(false);
812
+
813
+ if (! items || ! items.length) {
814
+ resultsVisible(true);
815
+ return;
816
+ }
817
+
818
+ for (var i = 0; i < items.length; i += 1) {
819
+ var li = jQuery('<li></li>'),
820
+ item = items[i];
821
+
822
+ if (! item.label) { continue; }
823
+ li.html('<span class="item-label">' + item.label + '</span>');
824
+
825
+ if (item.thumb) {
826
+ li.prepend('<span class="thumb" style="background-image:url(' + item.thumb + ')">');
827
+ }
828
+ if (item.id) {
829
+ li.attr('data-id', item.id);
830
+ li.addClass('item item-' + item.id);
831
+ }
832
+
833
+ reslist.append(li);
834
+ hasResults = true;
835
+ }
836
+ resultsVisible(true);
837
+ }
838
+
839
+ // Toggle visibility of the results.
840
+ function resultsVisible(state) {
841
+ emptybox.hide();
842
+
843
+ if (! hasResults) {
844
+ resbox.hide();
845
+
846
+ if (jq.val() && state) {
847
+ if (jq.data('no-empty-msg') || wrap.hasClass('progress')) {
848
+ emptybox.hide();
849
+ } else {
850
+ if (!emptyMsg || !emptyMsg.length) {
851
+ if (jq.data('empty-msg')) {
852
+ emptyMsg = jq.data('empty-msg');
853
+ } else {
854
+ emptyMsg = WDP.lang.empty_search;
855
+ }
856
+ emptybox.text(emptyMsg);
857
+ }
858
+ emptybox.show();
859
+ }
860
+ }
861
+ return;
862
+ }
863
+
864
+ if (state) {
865
+ if (tmrHide) {
866
+ window.clearTimeout(tmrHide);
867
+ tmrHide = false;
868
+ }
869
+
870
+ resbox.show();
871
+ } else {
872
+ tmrHide = window.setTimeout(function() {
873
+ resbox.hide();
874
+ tmrHide = false;
875
+ }, 300 );
876
+ }
877
+ }
878
+
879
+ // Visually select a single search item
880
+ function selectItem(item) {
881
+ var item_label, title;
882
+
883
+ if (item) {
884
+ title = '';
885
+ item_label = '';
886
+
887
+ if (item.find('.thumb').length) {
888
+ title += item.find('.thumb')[0].outerHTML;
889
+ }
890
+ if (item.find('.title').length) {
891
+ item_label = item.find('.title').text();
892
+ title += item.find('.title')[0].outerHTML;
893
+ } else {
894
+ item_label = item.find('.item-label').text();
895
+ title += item.find('.item-label').html();
896
+ }
897
+
898
+ curitem.html(title);
899
+ search = jq.val();
900
+ jq.hide();
901
+ curitem.show();
902
+ resbox.hide();
903
+
904
+ if (item.data('id')) {
905
+ jq.val(item.data('id'));
906
+ } else {
907
+ jq.val(item_label);
908
+ }
909
+ jq.trigger('item:select');
910
+ } else {
911
+ jq.val(search);
912
+ curitem.hide();
913
+ jq.show();
914
+ window.setTimeout(function(){jq.focus();}, 20);
915
+ jq.trigger('item:clear');
916
+ }
917
+ }
918
+
919
+ // Constructor.
920
+ function init() {
921
+ setupElement();
922
+ clearResults(true);
923
+
924
+ jq.on('keydown', clearDelay);
925
+ jq.on('keyup', startDelay);
926
+
927
+ jq.on('focus', function() { resultsVisible(true) } );
928
+ jq.on('blur', function() { resultsVisible(false) } );
929
+
930
+ jq.on('progress:start', function() { doingProgress(true); });
931
+ jq.on('progress:stop', function() { doingProgress(false); });
932
+
933
+ jq.on('results:clear', function() { clearResults(true); });
934
+ jq.on('results:show', function(ev, data) { showResults(data); });
935
+
936
+ wrap.on('click', '.search-results .item', function() { selectItem(jQuery(this)); });
937
+ curitem.on('click', function() { selectItem(false); });
938
+
939
+ wrap.on('click', '.search-icon', function() { jq.trigger('search'); jq.focus(); });
940
+ }
941
+
942
+ init();
943
+
944
+ return WDP;
945
+ };
946
+
947
+ /**
948
+ * Displays a message in the top of the window.
949
+ *
950
+ * @since 4.0.0
951
+ */
952
+ WDP.showMessage = function(action) {
953
+ var me = this;
954
+ initDom();
955
+
956
+ // Options can also be passed in as object now :)
957
+ if (action instanceof Object) {
958
+ for (var key in action) {
959
+ if (!action.hasOwnProperty(key)) {continue;}
960
+ WDP.showMessage(key, action[key]);
961
+ }
962
+ return;
963
+ }
964
+
965
+ if (WDP.data._msg) {
966
+ me.msg = WDP.data._msg;
967
+ }
968
+
969
+ switch (action) {
970
+ case "type":
971
+ switch ( arguments[1] ) {
972
+ case "success":
973
+ case "ok":
974
+ case "green":
975
+ WDP.data._msg = me.msgSuccess;
976
+ break;
977
+
978
+ case "error":
979
+ case "err":
980
+ case "red":
981
+ WDP.data._msg = me.msgError;
982
+ break;
983
+ }
984
+ break;
985
+
986
+ case "message":
987
+ var text = arguments[1];
988
+ if (!text || !text.length) {
989
+ me.msg.find(".extra-text").html("").hide();
990
+ me.msg.find(".default-text").show();
991
+ } else {
992
+ me.msg.find(".extra-text").html(text).show();
993
+ me.msg.find(".default-text").hide();
994
+ }
995
+ break;
996
+
997
+ case "delay":
998
+ var new_delay = parseInt( arguments[1] );
999
+ if (!new_delay) {
1000
+ me.delay = 0;
1001
+ } else if (isNaN(new_delay) || new_delay < 2000) {
1002
+ me.delay = 3000;
1003
+ } else {
1004
+ me.delay = new_delay;
1005
+ }
1006
+ break;
1007
+
1008
+ case "icon":
1009
+ if (false === arguments[1] || 0 === arguments[1]) {
1010
+ me.msg.find(".the-msg-icon").hide();
1011
+ } else {
1012
+ me.msg.find(".the-msg-icon").show();
1013
+ }
1014
+ break;
1015
+
1016
+ case "hide":
1017
+ if (false === arguments[1] || 0 === arguments[1]) { break; }
1018
+ hideMessage();
1019
+ break;
1020
+
1021
+ case "show":
1022
+ default:
1023
+ if (false === arguments[1] || 0 === arguments[1]) { break; }
1024
+ showMessage();
1025
+ break;
1026
+ }
1027
+
1028
+ // Dreate the DOM elements.
1029
+ function initDom() {
1030
+ if (WDP.data._message_dom_done) { return; }
1031
+ WDP.data._message_dom_done = true;
1032
+
1033
+ if (! WDP.lang.default_msg_ok) {
1034
+ WDP.lang.default_msg_ok = "Okay, we saved your changes!";
1035
+ }
1036
+ if (! WDP.lang.default_msg_err) {
1037
+ WDP.lang.default_msg_err = "Oops, we could not do this...";
1038
+ }
1039
+
1040
+ jQuery("body").append(
1041
+ '<div class="update-notice ok" id="wdp-success" style="display:none">' +
1042
+ '<span class="the-msg-icon check-animation"></span>' +
1043
+ '<p><span class="default-text">' + WDP.lang.default_msg_ok + '</span>' +
1044
+ '<span class="extra-text" style="display:none"></span></p>' +
1045
+ '<span class="close">&times;</span>' +
1046
+ '</div>'
1047
+ )
1048
+
1049
+ jQuery("body").append(
1050
+ '<div class="update-notice err" id="wdp-error" style="display:none">' +
1051
+ '<i class="the-msg-icon wdv-icon wdv-icon-warning-sign"></i>' +
1052
+ '<p><span class="default-text">' + WDP.lang.default_msg_err + '</span>' +
1053
+ '<span class="extra-text" style="display:none"></span></p>' +
1054
+ '<span class="close">&times;</span>' +
1055
+ '</div>'
1056
+ );
1057
+
1058
+ me.msgSuccess = jQuery("#wdp-success");
1059
+ me.msgError = jQuery("#wdp-error");
1060
+ me.msg = me.msgSuccess;
1061
+ me.delay = 3000;
1062
+ }
1063
+
1064
+ // Show current message.
1065
+ function showMessage() {
1066
+ var tmr = me.msg.data("tmr");
1067
+
1068
+ hideMessage();
1069
+ if (tmr) {
1070
+ window.setTimeout(WDP.showMessage, 20);
1071
+ return;
1072
+ }
1073
+
1074
+ me.msg.show();
1075
+ me.msg.one("click", ".close", hideMessage);
1076
+
1077
+ // Hide the update notice box after a short time.
1078
+ if (me.delay) {
1079
+ tmr = window.setTimeout(function() {
1080
+ me.msg.fadeOut();
1081
+ me.msg.data("tmr", false);
1082
+ }, me.delay);
1083
+ me.msg.data("tmr", tmr);
1084
+ me.msg.find(".close").hide();
1085
+ } else {
1086
+ me.msg.find(".close").show();
1087
+ tmr = false;
1088
+ me.msg.data("tmr", false);
1089
+ }
1090
+ }
1091
+
1092
+ // Hide all messages.
1093
+ function hideMessage() {
1094
+ var tmr;
1095
+
1096
+ // Success message.
1097
+ tmr = me.msgSuccess.data("tmr");
1098
+ if (tmr) {
1099
+ window.clearTimeout(tmr);
1100
+ me.msgSuccess.data("tmr", false);
1101
+ }
1102
+ me.msgSuccess.hide();
1103
+
1104
+ // Error message.
1105
+ tmr = me.msgError.data("tmr");
1106
+ if (tmr) {
1107
+ window.clearTimeout(tmr);
1108
+ me.msgError.data("tmr", false);
1109
+ }
1110
+ me.msgError.hide();
1111
+ }
1112
+
1113
+ return WDP;
1114
+ }
1115
+
1116
+ /**
1117
+ * Displays the "Changes saved" message in the top of the window.
1118
+ *
1119
+ * @since 4.0.0
1120
+ */
1121
+ WDP.showSuccess = function(message) {
1122
+ var args = {
1123
+ "type": "success",
1124
+ "delay": 3000,
1125
+ "icon": true,
1126
+ "message": false,
1127
+ "show": false
1128
+ };
1129
+
1130
+ if (message instanceof Object) {
1131
+ WDP.showMessage(args);
1132
+ message.show = true;
1133
+ WDP.showMessage(message);
1134
+ } else if ("string" === typeof message) {
1135
+ args.message = message;
1136
+ WDP.showMessage(args);
1137
+ }
1138
+
1139
+ return WDP;
1140
+ };
1141
+
1142
+ /**
1143
+ * Displays the "Did not work" message in the top of the window.
1144
+ *
1145
+ * @since 4.0.0
1146
+ */
1147
+ WDP.showError = function(message) {
1148
+ var args = {
1149
+ "type": "error",
1150
+ "delay": false,
1151
+ "icon": true,
1152
+ "message": false,
1153
+ "show": true
1154
+ };
1155
+
1156
+ if (message instanceof Object) {
1157
+ WDP.showMessage(args);
1158
+ message.show = true;
1159
+ WDP.showMessage(message);
1160
+ } else if ("string" === typeof message) {
1161
+ args.message = message;
1162
+ WDP.showMessage(args);
1163
+ }
1164
+
1165
+ return WDP;
1166
+ };
1167
+
1168
+ /**
1169
+ * Updates the hash-value in the current windows URL without scrolling to the
1170
+ * element.
1171
+ *
1172
+ * @since 4.0.3
1173
+ */
1174
+ WDP.updateHash = function(newHash) {
1175
+ newHash = newHash.replace( /^#/, '' );
1176
+
1177
+ var fx,
1178
+ node = jQuery( '#' + newHash );
1179
+
1180
+ if (node.length) {
1181
+ // Remove the ID value from the actual element.
1182
+ node.attr('id', '');
1183
+
1184
+ // Create a dummy element at current position with the specific ID.
1185
+ fx = jQuery('<div></div>')
1186
+ .css({
1187
+ position: 'absolute',
1188
+ visibility: 'hidden',
1189
+ top: jQuery(document).scrollTop() + 'px'
1190
+ })
1191
+ .attr('id', newHash)
1192
+ .appendTo(document.body);
1193
+ }
1194
+
1195
+ // Change hash value in the URL. Browser will scroll to _current position_.
1196
+ document.location.hash = newHash;
1197
+
1198
+ // Undo the changes from first part.
1199
+ if (node.length) {
1200
+ fx.remove();
1201
+ node.attr('id', newHash);
1202
+ }
1203
+ }
includes/admin/taxonomy.php ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Smartcrawl_Taxonomy extends Smartcrawl_Renderable {
4
+ protected function _get_view_defaults() {
5
+ return array(); }
6
+
7
+ public function __construct() {
8
+ if ( is_admin() && ! empty( $_GET['taxonomy'] ) ) {
9
+ add_action( sanitize_key( $_GET['taxonomy'] ) . '_edit_form', array( &$this, 'term_additions_form' ), 10, 2 );
10
+ }
11
+
12
+ add_action( 'edit_term', array( &$this, 'update_term' ), 10, 3 );
13
+
14
+ }
15
+
16
+ public function form_row( $id, $label, $desc, $tax_meta, $type = 'text' ) {
17
+ $val = ! empty( $tax_meta[ $id ] ) ? stripslashes( $tax_meta[ $id ] ) : '';
18
+
19
+ include SMARTCRAWL_PLUGIN_DIR . 'admin/templates/taxonomy-form-row.php';
20
+
21
+ }
22
+
23
+ public function term_additions_form( $term, $taxonomy ) {
24
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
25
+ $tax_meta = get_option( 'wds_taxonomy_meta' );
26
+
27
+ if ( isset( $tax_meta[ $taxonomy ][ $term->term_id ] ) ) {
28
+ $tax_meta = $tax_meta[ $taxonomy ][ $term->term_id ];
29
+ }
30
+
31
+ $taxonomy_object = get_taxonomy( $taxonomy );
32
+ $taxonomy_labels = $taxonomy_object->labels;
33
+
34
+ $global_noindex = ! empty( $smartcrawl_options[ 'meta_robots-noindex-' . $term->taxonomy ] )
35
+ ? $smartcrawl_options[ 'meta_robots-noindex-' . $term->taxonomy ]
36
+ : false
37
+ ;
38
+ $global_nofollow = ! empty( $smartcrawl_options[ 'meta_robots-nofollow-' . $term->taxonomy ] )
39
+ ? $smartcrawl_options[ 'meta_robots-nofollow-' . $term->taxonomy ]
40
+ : false
41
+ ;
42
+
43
+ $version = Smartcrawl_Loader::get_version();
44
+ Smartcrawl_Settings_Admin::enqueue_shared_ui( false );
45
+
46
+ wp_enqueue_style( 'wds-admin-opengraph', SMARTCRAWL_PLUGIN_URL . '/css/wds-opengraph.css', null, $version );
47
+ wp_enqueue_style( 'wds-qtip2-style', SMARTCRAWL_PLUGIN_URL . '/css/external/jquery.qtip.min.css', null, $version );
48
+ wp_enqueue_style( 'wds-app', SMARTCRAWL_PLUGIN_URL . 'css/app.css', array( 'wds-qtip2-style' ), $version );
49
+
50
+ wp_enqueue_media();
51
+
52
+ wp_enqueue_script( 'wds-admin', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin.js', array( 'jquery' ), $version );
53
+ wp_enqueue_script( 'wds-admin-opengraph', SMARTCRAWL_PLUGIN_URL . 'js/wds-admin-opengraph.js', array( 'underscore', 'jquery', 'wds-admin' ), $version );
54
+
55
+ include SMARTCRAWL_PLUGIN_DIR . 'admin/templates/term-additions-form.php';
56
+
57
+ }
58
+
59
+ public function update_term( $term_id, $tt_id, $taxonomy ) {
60
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
61
+
62
+ $tax_meta = get_option( 'wds_taxonomy_meta' );
63
+
64
+ foreach ( array( 'title', 'desc', 'bctitle', 'canonical' ) as $key ) {
65
+ $value = isset( $_POST[ "wds_{$key}" ] )
66
+ ? $_POST[ "wds_{$key}" ]
67
+ : ''
68
+ ;
69
+ if ( 'canonical' === $key ) {
70
+ $value = esc_url_raw( $value );
71
+ } else {
72
+ $value = sanitize_text_field( $value );
73
+ }
74
+ $tax_meta[ $taxonomy ][ $term_id ][ "wds_{$key}" ] = $value;
75
+ }
76
+
77
+ foreach ( array( 'noindex', 'nofollow' ) as $key ) {
78
+ $global = ! empty( $smartcrawl_options[ "meta_robots-{$key}-{$taxonomy}" ] ) ? (bool) $smartcrawl_options[ "meta_robots-{$key}-{$taxonomy}" ] : false;
79
+
80
+ if ( ! $global ) {
81
+ $tax_meta[ $taxonomy ][ $term_id ][ 'wds_' . $key ] = isset( $_POST[ "wds_{$key}" ] )
82
+ ? (bool) $_POST[ "wds_{$key}" ]
83
+ : false
84
+ ;
85
+ } else {
86
+ $tax_meta[ $taxonomy ][ $term_id ][ "wds_override_{$key}" ] = isset( $_POST[ "wds_override_{$key}" ] )
87
+ ? (bool) $_POST[ "wds_override_{$key}" ]
88
+ : false
89
+ ;
90
+ }
91
+ }
92
+
93
+ if ( ! empty( $_POST['wds-opengraph'] ) ) {
94
+ $data = is_array( $_POST['wds-opengraph'] ) ? stripslashes_deep( $_POST['wds-opengraph'] ) : array();
95
+ $tax_meta[ $taxonomy ][ $term_id ]['opengraph'] = array();
96
+ if ( ! empty( $data['title'] ) ) { $tax_meta[ $taxonomy ][ $term_id ]['opengraph']['title'] = sanitize_text_field( $data['title'] ); }
97
+ if ( ! empty( $data['description'] ) ) { $tax_meta[ $taxonomy ][ $term_id ]['opengraph']['description'] = sanitize_text_field( $data['description'] ); }
98
+ if ( ! empty( $data['images'] ) && is_array( $data['images'] ) ) {
99
+ $tax_meta[ $taxonomy ][ $term_id ]['opengraph']['images'] = array();
100
+ foreach ( $data['images'] as $img ) {
101
+ $img = esc_url_raw( $img );
102
+ $tax_meta[ $taxonomy ][ $term_id ]['opengraph']['images'][] = $img;
103
+ }
104
+ }
105
+ }
106
+
107
+ if ( ! empty( $_POST['wds-twitter'] ) ) {
108
+ $data = is_array( $_POST['wds-twitter'] ) ? stripslashes_deep( $_POST['wds-twitter'] ) : array();
109
+ $tax_meta[ $taxonomy ][ $term_id ]['twitter'] = array();
110
+ if ( ! empty( $data['title'] ) ) { $tax_meta[ $taxonomy ][ $term_id ]['twitter']['title'] = sanitize_text_field( $data['title'] ); }
111
+ if ( ! empty( $data['description'] ) ) { $tax_meta[ $taxonomy ][ $term_id ]['twitter']['description'] = sanitize_text_field( $data['description'] ); }
112
+ if (!empty($data['images']) && is_array($data['images'])) {
113
+ $tax_meta[$taxonomy][$term_id]['twitter']['images'] = array();
114
+ foreach ($data['images'] as $img) {
115
+ $img = esc_url_raw($img);
116
+ $tax_meta[$taxonomy][$term_id]['twitter']['images'][] = $img;
117
+ }
118
+ }
119
+ }
120
+
121
+ update_option( 'wds_taxonomy_meta', $tax_meta );
122
+
123
+ if ( function_exists( 'w3tc_flush_all' ) ) {
124
+ // Use W3TC API v0.9.5+
125
+ w3tc_flush_all();
126
+ } elseif ( defined( 'W3TC_DIR' ) && is_readable( W3TC_DIR . '/lib/W3/ObjectCache.php' ) ) {
127
+ // Old (very old) API
128
+ require_once W3TC_DIR . '/lib/W3/ObjectCache.php';
129
+ $w3_objectcache = & W3_ObjectCache::instance();
130
+
131
+ $w3_objectcache->flush();
132
+ }
133
+
134
+ }
135
+ }
136
+
137
+ $smartcrawl_taxonomy = new Smartcrawl_Taxonomy();
includes/admin/templates/_forms/autolinks.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $autolinks_enabled = $autolinks_network_enabled && $autolinks_locally_enabled;
3
+ $form_action = $autolinks_enabled ? $_view['action_url'] : '';
4
+ ?>
5
+ <form action='<?php echo esc_attr( $form_action ); ?>' method='post' class="wds-form">
6
+ <?php if ( $autolinks_enabled ) : ?>
7
+ <?php settings_fields( $_view['option_name'] ); ?>
8
+
9
+ <input type="hidden" name='<?php echo esc_attr( $_view['option_name'] ); ?>[<?php echo esc_attr( $_view['slug'] ); ?>-setup]' value="1">
10
+ <?php endif; ?>
includes/admin/templates/_forms/import-export.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <form method='post' enctype="multipart/form-data" class="wds-form">
2
+ <?php settings_fields( $_view['option_name'] ); ?>
3
+
4
+ <input type="hidden" name='<?php echo esc_attr( $_view['option_name'] ); ?>[<?php echo esc_attr( $_view['slug'] ); ?>-setup]' value="1"/>
includes/admin/templates/_forms/redirections.php ADDED
@@ -0,0 +1,2 @@
 
 
1
+ <form action='<?php echo esc_attr( $_view['action_url'] ); ?>' method='post' class="wds-form">
2
+ <?php settings_fields( $_view['option_name'] ); ?>
includes/admin/templates/_forms/settings.php ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <form action='<?php echo esc_attr( $_view['action_url'] ); ?>' method='post' class="wds-form">
2
+ <?php settings_fields( $_view['option_name'] ); ?>
3
+
4
+ <input type="hidden" name='<?php echo esc_attr( $_view['option_name'] ); ?>[<?php echo esc_attr( $_view['slug'] ); ?>-setup]' value="1"/>
includes/admin/templates/advanced-tools/advanced-section-automatic-linking-settings.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Automatic links settings template
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ $additional_settings = empty( $additional_settings ) ? array() : $additional_settings;
9
+ $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name'];
10
+ ?>
11
+
12
+ <div class="wds-table-fields wds-separator-top">
13
+ <div class="label">
14
+ <label class="wds-label"><?php _e( 'Min lengths', 'wds' ); ?></label>
15
+ <p class="wds-label-description"><?php _e( 'Define the shortest title and taxonomy length to autolink. Smaller titles will be ignored.', 'wds' ); ?></p>
16
+ </div>
17
+
18
+ <div class="fields">
19
+ <div class="row">
20
+ <div class="wds-table-fields wds-table-fields-stacked col-half">
21
+ <div class="label">
22
+ <label for="cpt_char_limit" class="wds-label"><?php esc_html_e( 'Posts & pages' , 'wds' ); ?></label>
23
+ </div>
24
+ <div class="fields wds-allow-macros">
25
+ <input id='cpt_char_limit' name='<?php echo esc_attr( $option_name ); ?>[cpt_char_limit]' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['cpt_char_limit'] ); ?>'>
26
+ </div>
27
+ </div>
28
+
29
+ <div class="wds-table-fields wds-table-fields-stacked col-half">
30
+ <div class="label">
31
+ <label for="tax_char_limit" class="wds-label"><?php esc_html_e( 'Archives & taxonomies' , 'wds' ); ?></label>
32
+ </div>
33
+ <div class="fields wds-allow-macros">
34
+ <input id='tax_char_limit' name='<?php echo esc_attr( $option_name ); ?>[tax_char_limit]' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['tax_char_limit'] ); ?>'>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ <p class="wds-label-description"><?php _e( 'We recommend a minimum of 10 chars for each type.', 'wds' ); ?></p>
39
+ </div>
40
+ </div>
41
+
42
+ <div class="wds-table-fields wds-separator-top">
43
+ <div class="label">
44
+ <label class="wds-label"><?php _e( 'Max limits', 'wds' ); ?></label>
45
+ <p class="wds-label-description"><?php _e( 'Set the max amount of links you want to appear per post.', 'wds' ); ?></p>
46
+ </div>
47
+
48
+ <div class="fields">
49
+ <div class="row">
50
+ <div class="wds-table-fields wds-table-fields-stacked col-half">
51
+ <div class="label">
52
+ <label for="link_limit" class="wds-label"><?php esc_html_e( 'Per post total' , 'wds' ); ?></label>
53
+ </div>
54
+ <div class="fields wds-allow-macros">
55
+ <input id='link_limit' name='<?php echo esc_attr( $option_name ); ?>[link_limit]' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['link_limit'] ); ?>'>
56
+ </div>
57
+ </div>
58
+
59
+ <div class="wds-table-fields wds-table-fields-stacked col-half">
60
+ <div class="label">
61
+ <label for="single_link_limit" class="wds-label"><?php esc_html_e( 'Per keyword group' , 'wds' ); ?></label>
62
+ </div>
63
+ <div class="fields wds-allow-macros">
64
+ <input id='single_link_limit' name='<?php echo esc_attr( $option_name ); ?>[single_link_limit]' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['single_link_limit'] ); ?>'>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ <p class="wds-label-description"><?php _e( 'Use 0 to allow unlimited automatic links.', 'wds' ); ?></p>
69
+ </div>
70
+ </div>
71
+
72
+ <?php
73
+ $this->_render('toggle-group', array(
74
+ 'label' => __( 'Optional Settings', 'wds' ),
75
+ 'description' => __( 'Configure extra settings for absolute control over autolinking.', 'wds' ),
76
+ 'items' => $additional_settings,
77
+ 'separator' => true,
78
+ ));
79
+ ?>
includes/admin/templates/advanced-tools/advanced-section-automatic-linking.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $insert = empty( $insert ) ? array() : $insert;
3
+ $linkto = empty( $linkto ) ? array() : $linkto;
4
+ ?>
5
+
6
+ <div class="wds-automatic-linking">
7
+ <div class="cf">
8
+ <div class="wds-automatic-linking-insert-links">
9
+ <?php
10
+ $this->_render('toggle-group', array(
11
+ 'label' => __( 'Insert Links', 'wds' ),
12
+ 'description' => __( 'Specify what post types to insert links into.', 'wds' ),
13
+ 'items' => $insert,
14
+ ));
15
+ ?>
16
+ </div>
17
+
18
+ <div class="wds-automatic-linking-link-to">
19
+ <?php
20
+ $this->_render('toggle-group', array(
21
+ 'label' => __( 'Link to', 'wds' ),
22
+ 'description' => __( 'Choose content you want to convert to links.', 'wds' ),
23
+ 'items' => $linkto,
24
+ ));
25
+ ?>
26
+ </div>
27
+ </div>
28
+
29
+ <div class="wds-table-fields wds-separator-top">
30
+ <label class="wds-label"><?php _e( 'Custom keywords', 'wds' ); ?></label>
31
+ <p class="wds-label-description"><?php _e( 'Choose additional keywords you want to auto-link and tell SmartCrawl where to link to. Add as many as you like.', 'wds' ); ?></p>
32
+ </div>
33
+
34
+ <div class="box-autolinks-custom-keywords-settings">
35
+ <div class="wds-replaceable">
36
+ <div class="group wds-group wds-group-field">
37
+ <label for="customkey" class="wds-label"><?php esc_html_e( 'Custom Keywords' , 'wds' ); ?></label>
38
+ <textarea id='customkey' name='<?php echo esc_attr( $_view['option_name'] ); ?>[customkey]' class='wds-textarea'><?php
39
+ echo esc_textarea( $_view['options']['customkey'] );
40
+ ?></textarea>
41
+ </div>
42
+ </div>
43
+ </div>
44
+
45
+ <div class="wds-table-fields wds-separator-top">
46
+ <label for="ignore" class="wds-label"><?php esc_html_e( 'Exclusions' , 'wds' ); ?></label>
47
+ <p class="wds-label-description"><?php esc_html_e( 'Provide a comma-separated list of keywords that you would like to exclude. You can also select individual posts for exclusion.' , 'wds' ); ?></p>
48
+ <input id='ignore' name='<?php echo esc_attr( $_view['option_name'] ); ?>[ignore]' size='' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['ignore'] ); ?>'>
49
+ </div>
50
+ <div class="group wds-group wds-group-field">
51
+ <div class="wds-replaceable">
52
+ <label for="ignorepost" class="wds-label"><?php esc_html_e( 'Exclude Posts, Pages & CPTs' , 'wds' ); ?></label>
53
+ <input id='ignorepost' name='<?php echo esc_attr( $_view['option_name'] ); ?>[ignorepost]' size='' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['ignorepost'] ); ?>'>
54
+ <span class="wds-field-legend"><?php esc_html_e( 'Paste in the IDs, slugs or titles for the post/pages you wish to exclude and separate them by commas' , 'wds' ); ?></span>
55
+ </div>
56
+ </div>
57
+ </div>
includes/admin/templates/advanced-tools/advanced-section-moz.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
3
+ $access_id = empty( $smartcrawl_options['access-id'] ) ? '' : $smartcrawl_options['access-id'];
4
+ $secret_key = empty( $smartcrawl_options['secret-key'] ) ? '' : $smartcrawl_options['secret-key'];
5
+ ?>
6
+
7
+ <?php if ( empty( $access_id ) || empty( $secret_key ) ) : ?>
8
+ <div class="wds-disabled-component">
9
+ <p>
10
+ <img src="<?php echo SMARTCRAWL_PLUGIN_URL; ?>/images/<?php echo esc_attr( 'moz-disabled.png' ); ?>" alt="<?php esc_html_e( '', 'wds' ); ?>" class="wds-disabled-image"/>
11
+ </p>
12
+ <p><?php _e( 'Moz provides reports that tell you how your site stacks up against the competition with all of the important SEO measurement tools - ranking, links, and much more.', 'wds' ); ?></p>
13
+ </div>
14
+ <div class="wds-moz-api-credentials">
15
+ <p>
16
+ <?php
17
+ printf(
18
+ __( 'Connect your Moz account. You can get the API credentials %s.', 'wds' ),
19
+ sprintf( '<a href="https://moz.com/products/api">%s</a>', __( 'here', 'wds' ) )
20
+ );
21
+ ?>
22
+ </p>
23
+ <form method="POST" class="wds-form">
24
+ <div class="row">
25
+ <div class="col-half wds-table-fields wds-table-fields-stacked">
26
+ <div class="label">
27
+ <label class="wds-label" for="wds-moz-access-id"><?php _e( 'Access ID', 'wds' ); ?></label>
28
+ </div>
29
+ <div class="fields">
30
+ <input
31
+ type="text"
32
+ id="wds-moz-access-id"
33
+ name="wds-moz-access-id"
34
+ placeholder="<?php _e( 'Enter your Moz Access ID', 'wds' ); ?>"
35
+ value="<?php echo esc_attr( $access_id ); ?>" />
36
+ </div>
37
+ </div>
38
+
39
+ <div class="col-half wds-table-fields wds-table-fields-stacked">
40
+ <div class="label">
41
+ <label class="wds-label" for="wds-moz-secret-key"><?php _e( 'Secret Key', 'wds' ); ?></label>
42
+ </div>
43
+ <div class="fields">
44
+ <input
45
+ type="text"
46
+ id="wds-moz-secret-key"
47
+ name="wds-moz-secret-key"
48
+ placeholder="<?php _e( 'Enter your Moz Secret Key', 'wds' ); ?>"
49
+ value="<?php echo esc_attr( $secret_key ); ?>" />
50
+ </div>
51
+ </div>
52
+ </div>
53
+ <input name='submit' type='submit' class='button' value='<?php _e( 'Connect', 'wds' ); ?>'/>
54
+ </form>
55
+ </div>
56
+ <?php else : ?>
57
+ <p class="wds-content-tabs-description">
58
+ <?php _e( 'Here’s how your site stacks up against the competition as defined by Moz. You can also see individual stats per post in the post editor under the Moz module.', 'wds' ); ?>
59
+ </p>
60
+ <button type="submit" class="button button-small button-dark button-dark-o" name="reset-moz-credentials" value="1"><?php esc_html_e( 'Reset API Credentials', 'wds' ); ?></button>
61
+ <?php Smartcrawl_Seomoz_Dashboard_Widget::widget(); ?>
62
+ <?php endif; ?>
includes/admin/templates/advanced-tools/advanced-section-redirects.php ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $redirections = empty( $redirections ) ? array() : $redirections;
3
+ $types = empty( $types ) ? array() : $types;
4
+ $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name'];
5
+ $plugin_settings = Smartcrawl_Settings::get_specific_options( 'wds_settings_options' );
6
+ ?>
7
+
8
+ <div class="wds-redirect-attachments wds-separator-top">
9
+ <?php
10
+ $this->_render('toggle-group', array(
11
+ 'label' => __( 'Redirect attachments', 'wds' ),
12
+ 'description' => __( 'Redirect attachments to their parent post, preventing them from appearing in SERPs.', 'wds' ),
13
+ 'items' => array(
14
+ 'redirect-attachments' => __( 'Redirect attachments', 'wds' ),
15
+ 'redirect-attachments-images_only' => __( '... but only if the attachment is image', 'wds' ),
16
+ ),
17
+ ));
18
+ ?>
19
+ </div>
20
+
21
+ <div class="wds-table-fields wds-separator-top">
22
+ <div class="label">
23
+ <label class="wds-label" for="wds-default-redirection-type">
24
+ <?php esc_html_e( 'Default Redirection Type', 'wds' ); ?>
25
+ </label>
26
+ <p class="wds-label-description">
27
+ <?php esc_html_e( 'Select the redirection type that you would like to be used as default.', 'wds' ); ?>
28
+ </p>
29
+ </div>
30
+ <div class="fields">
31
+ <select id="wds-default-redirection-type"
32
+ name="<?php echo esc_attr( $option_name ); ?>[redirections-code]"
33
+ autocomplete="off"
34
+ class="select-container"
35
+ style="width: 100%">
36
+ <?php foreach ( array( 301 => __( 'Permanent (301)', 'wds' ), 302 => __( 'Temporary (302)', 'wds' ) ) as $redirection_type => $redirection_type_label ) : ?>
37
+ <?php
38
+ $current_redirection_code = smartcrawl_get_array_value( $plugin_settings, 'redirections-code' );
39
+ $selected = selected( $redirection_type, $current_redirection_code, false );
40
+ ?>
41
+
42
+ <option value="<?php echo esc_attr( $redirection_type ); ?>" <?php echo $selected; ?>>
43
+ <?php echo esc_html( $redirection_type_label ); ?>
44
+ </option>
45
+ <?php endforeach; ?>
46
+ </select>
47
+ </div>
48
+ </div>
49
+
50
+ <input type="hidden" value="1" name="<?php echo esc_attr( $option_name ); ?>[save_redirects]" />
51
+ <div class="wds-redirects wds-separator-top">
52
+ <label class="wds-label"><?php esc_html_e( 'Redirects', 'wds' ); ?></label>
53
+ <p class="wds-small-text">
54
+ <?php esc_html_e( 'Adding entries here will set up a redirect from one URL to another.', 'wds' ); ?>
55
+ </p>
56
+ <p class="wds-small-text">
57
+ <?php esc_html_e( 'Formats include relative (E.g. /cats) or absolute URLs (E.g. www.website.com/cats or https://website.com/cats).', 'wds' ); ?>
58
+ </p>
59
+ <div class="wds-redirects-buttons-top">
60
+ <button class="wds-bulk-update button button-small button-dark"><?php esc_html_e( 'Bulk Update', 'wds' ); ?></button>
61
+ <button class="wds-bulk-remove button button-small button-dark-o"><?php esc_html_e( 'Remove Redirects', 'wds' ); ?></button>
62
+ </div>
63
+ <div class="wds-notice wds-notice-warning wds-redirects-unsaved-notice">
64
+ <p><?php esc_html_e( "You've made changes to your Sitemap structure. You need to save the changes to make them live.", 'wds' ); ?></p>
65
+ </div>
66
+ <table class="wds-redirects-table wds-list-table">
67
+ <thead>
68
+ <tr>
69
+ <th class="selector"><input type="checkbox" class="wds-checkbox" autocomplete="off" title=""/></th>
70
+ <th class="source"><?php esc_html_e( 'Old URL', 'wds' ); ?></th>
71
+ <th class="destination"><?php esc_html_e( 'New URL', 'wds' ); ?></th>
72
+ <th class="type" colspan="2"><?php esc_html_e( 'Redirect Type', 'wds' ); ?></th>
73
+ </tr>
74
+ </thead>
75
+ <tbody>
76
+ <?php
77
+ $redirection_index = 0;
78
+ ?>
79
+ <?php foreach ( $redirections as $source => $destination ) : ?>
80
+ <?php
81
+ $type = ! empty( $types[ $source ] ) ? $types[ $source ] : '';
82
+
83
+ $this->_render('advanced-tools/advanced-tools-redirect-item', array(
84
+ 'source' => esc_attr( $source ),
85
+ 'destination' => esc_attr( $destination ),
86
+ 'index' => esc_attr( $redirection_index ),
87
+ 'string_permanent' => esc_html__( 'Permanent (301)', 'wds' ),
88
+ 'string_temporary' => esc_html__( 'Temporary (302)', 'wds' ),
89
+ 'string_options' => esc_html__( 'Options', 'wds' ),
90
+ 'string_remove' => esc_html__( 'Remove', 'wds' ),
91
+ 'maybe_permanent_selected' => selected( $type, 301, false ),
92
+ 'maybe_temporary_selected' => selected( $type, 302, false ),
93
+ ));
94
+ ?>
95
+ <?php $redirection_index++; ?>
96
+ <?php endforeach; ?>
97
+ </tbody>
98
+ <tfoot>
99
+ <tr class="wds-redirects-buttons-bottom">
100
+ <td colspan="5">
101
+ <button class="wds-add-redirect button button-dark"><?php esc_html_e( 'Add New', 'wds' ); ?></button>
102
+ </td>
103
+ </tr>
104
+ </tfoot>
105
+ </table>
106
+ </div>
includes/admin/templates/advanced-tools/advanced-tools-redirect-item.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $source = empty( $source ) ? '' : $source;
3
+ $destination = empty( $destination ) ? '' : $destination;
4
+ $index = empty( $index ) ? 0 : $index;
5
+ $maybe_permanent_selected = empty( $maybe_permanent_selected ) ? '' : $maybe_permanent_selected;
6
+ $maybe_temporary_selected = empty( $maybe_temporary_selected ) ? '' : $maybe_temporary_selected;
7
+
8
+ $string_permanent = empty( $string_permanent ) ? '' : $string_permanent;
9
+ $string_temporary = empty( $string_temporary ) ? '' : $string_temporary;
10
+ $string_options = empty( $string_options ) ? '' : $string_options;
11
+ $string_remove = empty( $string_remove ) ? '' : $string_remove;
12
+
13
+ $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name'];
14
+ ?>
15
+
16
+ <tr data-index="<?php echo $index; ?>">
17
+ <td>
18
+ <input type="checkbox"
19
+ autocomplete="off"
20
+ class="wds-checkbox"
21
+ name="<?php echo $option_name; ?>[bulk][]"
22
+ value="<?php echo $index; ?>" title=""/>
23
+ </td>
24
+
25
+ <td>
26
+ <div class="wds-redirection_item-source">
27
+ <input type="text"
28
+ class="wds-field"
29
+ placeholder="<?php esc_html_e( 'E.g. /cats', 'wds' ); ?>"
30
+ value="<?php echo $source; ?>"
31
+ name="<?php echo $option_name; ?>[urls][<?php echo $index; ?>][source]"
32
+ title=""/>
33
+ </div>
34
+ </td>
35
+
36
+ <td>
37
+ <div class="wds-redirection_item-destination">
38
+ <input id="<?php echo $option_name; ?>"
39
+ name="<?php echo $option_name; ?>[urls][<?php echo $index; ?>][destination]"
40
+ type="text"
41
+ placeholder="<?php esc_html_e( 'E.g. /cats-new', 'wds' ); ?>"
42
+ class="wds-field"
43
+ value="<?php echo $destination; ?>"
44
+ title=""/>
45
+ </div>
46
+ </td>
47
+
48
+ <td>
49
+ <div class="wds-redirection_item-type select-container select-container-no-style">
50
+ <select title=""
51
+ style="width: 100%;"
52
+ name="<?php echo $option_name; ?>[urls][<?php echo $index; ?>][type]">
53
+ <option <?php echo $maybe_permanent_selected; ?> value="301"><?php echo $string_permanent; ?></option>
54
+ <option <?php echo $maybe_temporary_selected; ?> value="302"><?php echo $string_temporary; ?></option>
55
+ </select>
56
+ </div>
57
+ </td>
58
+
59
+ <td>
60
+ <?php
61
+ $this->_render('links-dropdown', array(
62
+ 'label' => $string_options,
63
+ 'links' => array(
64
+ '#remove' => $string_remove,
65
+ ),
66
+ ));
67
+ ?>
68
+ </td>
69
+ </tr>
includes/admin/templates/advanced-tools/advanced-tools-settings.php ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="container" class="wrap wrap-wds wds-page wds-page-autolinks">
2
+
3
+ <section id="header">
4
+ <?php $this->_render( 'settings-message-top' ); ?>
5
+ <h1><?php esc_html_e( 'Advanced Tools' , 'wds' ); ?></h1>
6
+ </section><!-- end header -->
7
+
8
+ <div>
9
+ <div class="cf"></div>
10
+ <div class="vertical-tabs">
11
+ <?php
12
+ $autolinks_disabled_section = array(
13
+ array(
14
+ 'section_template' => 'disabled-component-inner',
15
+ 'section_args' => array(
16
+ 'content' => sprintf(
17
+ '%s<br/>%s<br/>%s',
18
+ __( 'Configure SmartCrawl to automatically link certain key words to a page on your blog or even', 'wds' ),
19
+ __( 'a whole new site all together. Internal linking can help boost SEO but giving search engines', 'wds' ),
20
+ __( 'ample ways to index your site.', 'wds' )
21
+ ),
22
+ 'image' => 'autolinking-disabled.png',
23
+ 'component' => 'autolinks',
24
+ 'premium_feature' => true,
25
+ 'button_text' => __( 'Activate Keyword Linking', 'wds' ),
26
+ ),
27
+ ),
28
+ );
29
+
30
+ $autolinks_sections = array(
31
+ array(
32
+ 'section_title' => __( 'Automatic Links', 'wds' ),
33
+ 'section_description' => __( 'SmartCrawl will look for keywords that match posts/pages around your website and automatically link them. Specify what post types you want to include in this tool, and what post types you want those to automatically link to.', 'wds' ),
34
+ 'section_template' => 'advanced-tools/advanced-section-automatic-linking',
35
+ 'section_args' => array(
36
+ 'insert' => $insert,
37
+ 'linkto' => $linkto,
38
+ ),
39
+ ),
40
+ array(
41
+ 'section_title' => __( 'Settings', 'wds' ),
42
+ 'section_description' => __( 'Control the overall linking engine to work how you want it to.', 'wds' ),
43
+ 'section_template' => 'advanced-tools/advanced-section-automatic-linking-settings',
44
+ 'section_args' => array(
45
+ 'additional_settings' => array(
46
+ 'allow_empty_tax' => array(
47
+ 'label' => __( 'Allow autolinks to empty taxonomies', 'wds' ),
48
+ 'description' => __( 'Allows autolinking to taxonomies that have no posts assigned to them.', 'wds' ),
49
+ ),
50
+ 'excludeheading' => array(
51
+ 'label' => __( 'Prevent linking in heading tags', 'wds' ),
52
+ 'description' => __( 'Excludes headings from autolinking.', 'wds' ),
53
+ ),
54
+ 'onlysingle' => array(
55
+ 'label' => __( 'Process only single posts and pages', 'wds' ),
56
+ 'description' => __( 'Process only single posts and pages', 'wds' ),
57
+ ),
58
+ 'allowfeed' => array(
59
+ 'label' => __( 'Process RSS feeds', 'wds' ),
60
+ 'description' => __( 'Autolinking will also occur in RSS feeds.', 'wds' ),
61
+ ),
62
+ 'casesens' => array(
63
+ 'label' => __( 'Case sensitive matching', 'wds' ),
64
+ 'description' => __( 'Only autolink the exact string match.', 'wds' ),
65
+ ),
66
+ 'customkey_preventduplicatelink' => array(
67
+ 'label' => __( 'Prevent duplicate links', 'wds' ),
68
+ 'description' => __( 'TBC', 'wds' ),
69
+ ),
70
+ 'target_blank' => array(
71
+ 'label' => __( 'Open links in new tab', 'wds' ),
72
+ 'description' => __( 'Adds the target=“_blank” tag to links to open a new tab when clicked.', 'wds' ),
73
+ ),
74
+ 'rel_nofollow' => array(
75
+ 'label' => __( 'Nofollow autolinks', 'wds' ),
76
+ 'description' => __( 'Adds the nofollow meta tag to autolinks to prevent search engines following those URLs when crawling your website.', 'wds' ),
77
+ ),
78
+ ),
79
+ ),
80
+ ),
81
+ );
82
+
83
+ $autolinks_network_enabled = smartcrawl_is_allowed_tab( $_view['slug'] );
84
+ $autolinks_locally_enabled = 'settings' === $_view['name'] || Smartcrawl_Settings::get_setting( $_view['name'] );
85
+ $is_member = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SITE )->is_member();
86
+
87
+ if ( $autolinks_network_enabled ) {
88
+
89
+ $autolinks_tab = array(
90
+ 'tab_id' => 'tab_automatic_linking',
91
+ 'tab_name' => __( 'Automatic Linking', 'wds' ),
92
+ 'is_active' => $active_tab == 'tab_automatic_linking',
93
+ 'tab_sections' => $autolinks_locally_enabled && $is_member ? $autolinks_sections : $autolinks_disabled_section,
94
+ 'before_output' => $this->_load('_forms/autolinks', array(
95
+ 'autolinks_network_enabled' => $autolinks_network_enabled,
96
+ 'autolinks_locally_enabled' => $autolinks_locally_enabled,
97
+ )),
98
+ 'after_output' => '</form>',
99
+ );
100
+
101
+ if ( ! $autolinks_locally_enabled || ! $is_member ) {
102
+ $autolinks_tab['button_text'] = false;
103
+ }
104
+
105
+ $this->_render( 'vertical-tab', $autolinks_tab );
106
+ }
107
+ ?>
108
+
109
+ <?php
110
+ $this->_render('vertical-tab', array(
111
+ 'tab_id' => 'tab_url_redirection',
112
+ 'tab_name' => __( 'URL Redirection', 'wds' ),
113
+ 'is_active' => $active_tab == 'tab_url_redirection',
114
+ 'tab_sections' => array(
115
+ array(
116
+ 'section_description' => __( 'Automatically redirect traffic from one URL to another. Use this tool if you have changed a page’s URL and wish to keep traffic flowing to the new page.', 'wds' ),
117
+ 'section_template' => 'advanced-tools/advanced-section-redirects',
118
+ 'section_args' => array(
119
+ 'redirections' => $redirections,
120
+ 'types' => $redirection_types,
121
+ ),
122
+ ),
123
+ ),
124
+ 'before_output' => $this->_load( '_forms/redirections' ),
125
+ 'after_output' => '</form>',
126
+ ));
127
+ ?>
128
+
129
+ <?php
130
+ $this->_render('vertical-tab', array(
131
+ 'tab_id' => 'tab_moz',
132
+ 'tab_name' => __( 'Moz', 'wds' ),
133
+ 'is_active' => $active_tab == 'tab_moz',
134
+ 'button_text' => false,
135
+ 'tab_sections' => array(
136
+ array(
137
+ 'section_template' => 'advanced-tools/advanced-section-moz',
138
+ 'section_args' => array(),
139
+ ),
140
+ ),
141
+ 'before_output' => '<form method="post" class="wds-form">',
142
+ 'after_output' => '</form>',
143
+ ));
144
+ ?>
145
+ </div>
146
+ </div>
147
+ <?php $this->_render( 'upsell-modal' ); ?>
148
+
149
+ </div><!-- end wds-page-autolinks -->
includes/admin/templates/advanced-tools/underscore-bulk-update-form.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <dialog class="dev-overlay wds-modal wds-bulk-update-redirects-modal" id="wds-bulk-update-redirects" title="{{- Wds.l10n('redirects', 'Bulk Update') }}">
2
+ <form class="wds-form">
3
+
4
+ {{ if(indices) { }}
5
+ <div class="wds-table-fields">
6
+ <div class="label">
7
+ <label class="wds-label">{{- Wds.l10n('redirects', 'New URL') }}</label>
8
+ </div>
9
+ <div class="fields">
10
+ <input class="wds-field" title="" type="text"/>
11
+ </div>
12
+ </div>
13
+
14
+ <div class="wds-table-fields">
15
+ <div class="label">
16
+ <label class="wds-label">{{- Wds.l10n('redirects', 'Redirect Type') }}</label>
17
+ </div>
18
+ <div class="fields">
19
+ <select title="">
20
+ <option value="301">{{- Wds.l10n('redirects', 'Permanent (301)') }}</option>
21
+ <option value="302">{{- Wds.l10n('redirects', 'Temporary (302)') }}</option>
22
+ </select>
23
+ </div>
24
+ </div>
25
+ {{ } else { }}
26
+ <p>{{- Wds.l10n('redirects', 'Please select some items to edit them.') }}</p>
27
+ {{ } }}
28
+
29
+ <input type="hidden" value="{{- indices }}"/>
30
+ <div class="wds-box-footer">
31
+ <button type="button" class="wds-cancel-button button button-dark-o"><?php esc_html_e( 'Cancel', 'wds' ); ?></button>
32
+ {{ if(indices) { }}
33
+ <button type="button" class="wds-action-button button"><?php esc_html_e( 'Update', 'wds' ); ?></button>
34
+ {{ } }}
35
+ </div>
36
+ </form>
37
+ </dialog>
includes/admin/templates/advanced-tools/underscore-redirect-item.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ $this->_render('advanced-tools/advanced-tools-redirect-item', array(
4
+ 'source' => '{{- source }}',
5
+ 'destination' => '{{- destination }}',
6
+ 'index' => '{{- index }}',
7
+ 'string_permanent' => "{{- Wds.l10n('redirects', 'Permanent (301)') }}",
8
+ 'string_temporary' => "{{- Wds.l10n('redirects', 'Temporary (302)') }}",
9
+ 'string_options' => "{{- Wds.l10n('redirects', 'Options') }}",
10
+ 'string_remove' => "{{- Wds.l10n('redirects', 'Remove') }}",
11
+ 'maybe_permanent_selected' => "{{- selected_type == 301 ? 'selected=\"selected\"' : '' }}",
12
+ 'maybe_temporary_selected' => "{{- selected_type == 302 ? 'selected=\"selected\"' : '' }}",
13
+ ));
includes/admin/templates/checkup/checkup-checkup-results.php ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_CHECKUP );
3
+ $results = $service->result();
4
+ $show_upsell_message = isset( $show_upsell_message ) ? $show_upsell_message : true;
5
+ ?>
6
+
7
+ <?php if ( ! empty( $results['error'] ) ) : ?>
8
+ <!--
9
+ We have encountered an error. So let's show that.
10
+ -->
11
+ <div class="wds-notice wds-notice-error">
12
+ <p><?php echo esc_html( $results['error'] ); ?></p>
13
+ </div>
14
+ <?php endif; ?>
15
+
16
+ <?php if ( ! empty( $results['items'] ) ) { ?>
17
+ <p><?php esc_html_e( 'Here are your outstanding SEO issues. We recommend actioning as many as possible to ensure your site is as search engine and social media friendly as possible.', 'wds' ); ?></p>
18
+ <!--
19
+ This is where we store the actual result items.
20
+ Let's iterate through them.
21
+ -->
22
+ <div class="wds-accordion">
23
+ <?php foreach ( $results['items'] as $idx => $item ) : ?>
24
+ <?php
25
+ $item_id = "wds-checkup-item-{$idx}";
26
+ $type_class = ! empty( $item['type'] )
27
+ ? sanitize_html_class( $item['type'] )
28
+ : '';
29
+ $custom_class = ! empty( $item['class'] )
30
+ ? sanitize_html_class( $item['class'] )
31
+ : '';
32
+ $style_class_map = array(
33
+ 'ok' => 'wds-check-success',
34
+ 'info' => 'wds-check-invalid',
35
+ 'warning' => 'wds-check-warning',
36
+ 'critical' => 'wds-check-error',
37
+ );
38
+ $style_class = isset( $style_class_map[ $item['type'] ] ) ? $style_class_map[ $item['type'] ] : '';
39
+ $details = ! empty( $item['tooltip'] ) ? $item['tooltip'] : '';
40
+ $title = ! empty( $item['title'] ) ? $item['title'] : '';
41
+ $body = ! empty( $item['body'] ) ? $item['body'] : '';
42
+ $fix = ! empty( $item['fix'] ) ? $item['fix'] : '';
43
+ ?>
44
+ <div class="wds-accordion-section wds-check-item <?php echo esc_attr( $type_class ); ?> <?php echo esc_attr( $custom_class ); ?> <?php echo esc_attr( $style_class ); ?>"
45
+ id="<?php echo esc_attr( $item_id ); ?>">
46
+ <div class="wds-accordion-handle">
47
+ <?php echo esc_html( $title ); ?>
48
+ </div>
49
+ <div class="wds-accordion-content">
50
+ <?php if ( $body || $fix ) : ?>
51
+ <div class="wds-recommendation">
52
+ <strong><?php esc_html_e( 'Recommendation', 'wds' ); ?></strong>
53
+
54
+ <?php echo wp_kses( $body, 'post' ); ?>
55
+ <?php echo wp_kses( $fix, 'post' ); ?>
56
+ </div>
57
+ <?php endif; ?>
58
+
59
+ <?php if ( $details ) : ?>
60
+ <div class="wds-more-info">
61
+ <strong><?php esc_html_e( 'More Info', 'wds' ); ?></strong>
62
+ <p><?php echo esc_attr( $details ); ?></p>
63
+ </div>
64
+ <?php endif; ?>
65
+ </div>
66
+ </div>
67
+ <?php endforeach; ?>
68
+ </div>
69
+ <?php if ( ! $service->is_member() && $show_upsell_message ) { ?>
70
+ <?php
71
+ $this->_render('mascot-message', array(
72
+ 'key' => 'seo-checkup-upsell',
73
+ 'dismissible' => false,
74
+ 'message' => sprintf(
75
+ '%s <a href="#upgrade-to-pro">%s</a>',
76
+ esc_html__( 'Grab the Pro version of SmartCrawl to unlock unlimited SEO Checkups plus automated scheduled reports to always stay on top of any issues.. These features are included in a WPMU DEV membership along with 100+ plugins &amp; themes, 24/7 support and lots of handy site management tools.', 'wds' ),
77
+ esc_html__( '- Try it all FREE today', 'wds' )
78
+ ),
79
+ ));
80
+ ?>
81
+ <?php } ?>
82
+ <?php } ?>
includes/admin/templates/checkup/checkup-checkup-running.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_CHECKUP );
4
+ $percentage = $service->status();
5
+ $progress = (int) $percentage;
6
+
7
+ if ( $progress > 100 ) { $progress = 100; }
8
+
9
+ $this->_render('progress-bar', array(
10
+ 'progress' => $progress,
11
+ ));
12
+ ?>
13
+
14
+ <div class="wds-checkup-progress-notice">
15
+ <?php $this->_render( 'progress-notice' ); ?>
16
+ </div>
includes/admin/templates/checkup/checkup-checkup.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_CHECKUP );
3
+ ?>
4
+
5
+ <div class="wds-report">
6
+ <?php
7
+ if ( $service->in_progress() ) {
8
+ $this->_render( 'checkup/checkup-checkup-running' );
9
+ } else {
10
+ $this->_render( 'checkup/checkup-checkup-results' );
11
+ }
12
+ ?>
13
+ </div>
includes/admin/templates/checkup/checkup-reporting.php ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $cron = Smartcrawl_Controller_Cron::get();
3
+
4
+ // This does the actual rescheduling
5
+ $cron->set_up_schedule();
6
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_CHECKUP );
7
+
8
+ $disabled = ! $service->is_member() ? 'disabled' : '';
9
+ $option_name = $_view['option_name'];
10
+ $toggle_field_name = $option_name . '[checkup-cron-enable]';
11
+ $checkup_cron_enabled = $_view['options']['checkup-cron-enable'];
12
+ ?>
13
+
14
+ <?php if ( ! $service->is_member() ) : ?>
15
+ <div class="wds-obfuscate-section"></div>
16
+ <?php endif; ?>
17
+
18
+ <div class="wds-table-fields wds-toggleable">
19
+ <div class="label">
20
+ <label class="wds-label"
21
+ for="<?php echo esc_attr( $toggle_field_name ); ?>">
22
+
23
+ <?php esc_html_e( 'Schedule automatic checkups', 'wds' ); ?>
24
+ </label>
25
+ <p class="wds-label-description">
26
+ <?php esc_html_e( 'Configure SmartCrawl to automatically email you a comprehensive SEO report for this website.', 'wds' ); ?>
27
+ </p>
28
+ </div>
29
+ <div class="fields wds-toggleable <?php echo $checkup_cron_enabled ? '' : 'inactive'; ?>">
30
+ <?php
31
+ $this->_render('toggle-item', array(
32
+ 'field_name' => $toggle_field_name,
33
+ 'field_id' => $toggle_field_name,
34
+ 'checked' => checked( $checkup_cron_enabled, true, false ),
35
+ 'item_label' => esc_html__( 'Enable regular checkups', 'wds' ),
36
+ ));
37
+ ?>
38
+ <div class="wds-toggleable-inside wds-toggleable-inside-box">
39
+ <div class="wds-table-fields wds-table-fields-stacked">
40
+ <div class="label">
41
+ <label for="wds-checkup-frequency" class="wds-label"><?php esc_html_e( 'Frequency', 'wds' ); ?></label>
42
+ </div>
43
+ <div class="fields">
44
+ <select <?php echo $disabled; ?>
45
+ style="width: 100%"
46
+ class="select-container wds-conditional-parent"
47
+ id="wds-checkup-frequency"
48
+ name="<?php echo esc_attr( $_view['option_name'] ); ?>[checkup-frequency]">
49
+
50
+ <?php $checkup_freq = isset( $_view['options']['checkup-frequency'] ) ? $_view['options']['checkup-frequency'] : false; ?>
51
+
52
+ <?php foreach ( $cron->get_frequencies() as $key => $label ) : ?>
53
+ <option value="<?php echo esc_attr( $key ); ?>" <?php selected( $key, $checkup_freq ); ?>>
54
+ <?php echo esc_html( $label ); ?>
55
+ </option>
56
+ <?php endforeach; ?>
57
+ </select>
58
+ </div>
59
+ </div>
60
+
61
+ <div class="wds-table-fields wds-table-fields-stacked wds-conditional-child"
62
+ data-parent="wds-checkup-frequency"
63
+ data-parent-val="weekly,monthly">
64
+
65
+ <div class="label">
66
+ <label for="wds-checkup-dow" class="wds-label"><?php esc_html_e( 'Day of the week', 'wds' ); ?></label>
67
+ </div>
68
+ <div class="fields">
69
+ <select <?php echo $disabled; ?>
70
+ style="width: 100%"
71
+ class="select-container"
72
+ id="wds-checkup-dow"
73
+ name="<?php echo esc_attr( $_view['option_name'] ); ?>[checkup-dow]">
74
+
75
+ <?php $monday = strtotime( 'this Monday' ); ?>
76
+ <?php $checkup_dow = isset( $_view['options']['checkup-dow'] ) ? $_view['options']['checkup-dow'] : false; ?>
77
+ <?php foreach ( range( 0, 6 ) as $dow ) : ?>
78
+ <option value="<?php echo esc_attr( $dow ); ?>" <?php selected( $dow, $checkup_dow ); ?>>
79
+ <?php echo esc_html( date_i18n( 'l', $monday + ($dow * DAY_IN_SECONDS) ) ); ?>
80
+ </option>
81
+ <?php endforeach; ?>
82
+ </select>
83
+ </div>
84
+ </div>
85
+
86
+ <div class="wds-table-fields wds-table-fields-stacked">
87
+ <div class="label">
88
+ <label for="wds-checkup-tod" class="wds-label"><?php esc_html_e( 'Time of day', 'wds' ); ?></label>
89
+ </div>
90
+ <div class="fields">
91
+
92
+ <select <?php echo $disabled; ?>
93
+ style="width: 100%"
94
+ class="select-container"
95
+ id="wds-checkup-tod"
96
+ name="<?php echo esc_attr( $_view['option_name'] ); ?>[checkup-tod]">
97
+
98
+ <?php $midnight = strtotime( 'today' ); ?>
99
+ <?php $checkup_tod = isset( $_view['options']['checkup-tod'] ) ? $_view['options']['checkup-tod'] : false; ?>
100
+ <?php foreach ( range( 0, 23 ) as $tod ) : ?>
101
+ <option value="<?php echo esc_attr( $tod ); ?>" <?php selected( $tod, $checkup_tod ); ?>>
102
+ <?php echo esc_html( date_i18n( get_option( 'time_format' ), $midnight + ($tod * HOUR_IN_SECONDS) ) ); ?>
103
+ </option>
104
+ <?php endforeach; ?>
105
+ </select>
106
+ </div>
107
+ </div>
108
+ </div>
109
+ </div>
110
+ </div>
111
+
112
+ <div class="wds-table-fields wds-separator-top">
113
+ <div class="label">
114
+ <label class="wds-label"><?php esc_html_e( 'Email recipients', 'wds' ); ?></label>
115
+ <p class="wds-label-description">
116
+ <?php esc_html_e( 'Choose which of your website’s users will receive the SEO report.', 'wds' ); ?>
117
+ </p>
118
+ </div>
119
+ <div class="fields">
120
+ <?php
121
+ $this->_render('user-search', array(
122
+ 'users' => (isset( $_view['options']['email-recipients'] ) ? $_view['options']['email-recipients'] : array()),
123
+ 'option_name' => $option_name,
124
+ 'users_key' => 'email-recipients',
125
+ 'new_user_key' => 'new-user',
126
+ ));
127
+ ?>
128
+ </div>
129
+ </div>
includes/admin/templates/checkup/checkup-settings.php ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_CHECKUP );
3
+ ?>
4
+ <div id="container" class="wrap wrap-wds wds-page wds-checkup-settings <?php echo $service->is_member() ? 'wds-is-member' : 'wds-is-not-member'; ?>">
5
+
6
+ <section id="header">
7
+ <?php $this->_render( 'settings-message-top' ); ?>
8
+ <div class="actions">
9
+ <?php
10
+ printf(
11
+ __( 'Last checked: %s', 'wds' ),
12
+ $service->get_last_checked( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ) )
13
+ );
14
+ ?>
15
+ <a href="<?php echo esc_url( add_query_arg( 'run-checkup', 'yes' ) ); ?>" class="button button-small">
16
+ <?php esc_html_e( 'Run checkup', 'wds' ); ?>
17
+ </a>
18
+ </div>
19
+ <h1><?php esc_html_e( 'SEO Checkup' , 'wds' ); ?></h1>
20
+ </section><!-- end header -->
21
+
22
+ <div class="wds-seo-checkup-stats-container">
23
+ <?php $this->_render( 'checkup/checkup-top' ); ?>
24
+ </div>
25
+
26
+ <?php
27
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
28
+ if ( ! smartcrawl_is_allowed_tab( $_view['slug'] ) ) {
29
+ printf( __( "Your network admin prevented access to '%s', please move onto next step.", 'wds' ), __( 'SEO Checkup' , 'wds' ) );
30
+ } elseif ( 'settings' === $_view['name'] || ( ! empty( $smartcrawl_options[ $_view['name'] ] ) ) ) {
31
+
32
+ ?>
33
+ <form action='<?php echo esc_attr( $_view['action_url'] ); ?>' method='post' class="wds-form">
34
+ <?php settings_fields( $_view['option_name'] ); ?>
35
+
36
+ <input type="hidden" name='<?php echo esc_attr( $_view['option_name'] ); ?>[<?php echo esc_attr( $_view['slug'] ); ?>-setup]' value="1">
37
+
38
+ <div class="vertical-tabs" id="checkup-settings-tabs">
39
+ <?php
40
+ $this->_render('report-vertical-tab', array(
41
+ 'tab_id' => 'tab_checkup',
42
+ 'tab_name' => __( 'Checkup', 'wds' ),
43
+ 'is_active' => $active_tab == 'tab_checkup',
44
+ 'tab_sections' => array(
45
+ array(
46
+ 'section_template' => 'checkup/checkup-checkup',
47
+ ),
48
+ ),
49
+ ));
50
+ ?>
51
+ <?php
52
+ $is_member = $service->is_member();
53
+ $this->_render(
54
+ $is_member ? 'vertical-tab' : 'report-vertical-tab',
55
+ array(
56
+ 'tab_id' => 'tab_settings',
57
+ 'tab_name' => __( 'Reporting', 'wds' ),
58
+ 'is_active' => $active_tab == 'tab_settings',
59
+ 'title_button' => 'upgrade',
60
+ 'tab_sections' => array(
61
+ array(
62
+ 'section_description' => esc_html__( 'Set up SmartCrawl to automatically run a comprehensive checkup daily, weekly or monthly and receive an email report.', 'wds' ),
63
+ 'section_template' => 'checkup/checkup-reporting',
64
+ ),
65
+ ),
66
+ )
67
+ );
68
+ ?>
69
+
70
+ </div>
71
+ </form>
72
+
73
+ <?php
74
+ } else {
75
+ $this->_render('disabled-component', array(
76
+ 'content' => sprintf(
77
+ '%s<br/>%s',
78
+ __( 'Automatically generate a full sitemap, regularly send updates to search engines and set up', 'wds' ),
79
+ __( 'SmartCrawl to automatically check URLs are discoverable by search engines.', 'wds' )
80
+ ),
81
+ 'image' => 'sitemap-disabled.png',
82
+ 'component' => 'sitemap',
83
+ 'button_text' => __( 'Activate Sitemap', 'wds' ),
84
+ ));
85
+ }
86
+ ?>
87
+ <?php $this->_render( 'upsell-modal' ); ?>
88
+ </div>
89
+
includes/admin/templates/checkup/checkup-top.php ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_CHECKUP );
3
+ if ( $service->in_progress() ) {
4
+ return;
5
+ }
6
+
7
+ $results = $service->result();
8
+ $counts = smartcrawl_get_array_value( $results, 'counts' );
9
+ $score = smartcrawl_get_array_value( $results, 'score' );
10
+
11
+ if ( $counts === null || $score === null || false === $score ) {
12
+ return;
13
+ }
14
+
15
+ $issue_count = intval( smartcrawl_get_array_value( $counts, 'warning' ) ) + intval( smartcrawl_get_array_value( $counts, 'critical' ) );
16
+ $score_class = $issue_count > 0 ? 'wds-score-warning' : 'wds-score-success';
17
+ $opts = Smartcrawl_Settings::get_component_options( Smartcrawl_Settings::COMP_CHECKUP );
18
+ $reporting_enabled = ! empty( $opts['checkup-cron-enable'] );
19
+ ?>
20
+ <div class="wds-seo-checkup-stats wds-report-stats" data-issue-count="<?php echo esc_attr( $issue_count ); ?>">
21
+ <div class="wds-report-score">
22
+ <div class="wds-score <?php echo esc_attr( $score_class ); ?>">
23
+ <?php echo esc_html( $score ); ?><span class="wds-total"><?php esc_html_e( '/100', 'wds' ); ?></span>
24
+ </div>
25
+ <div class="wds-small-text"><?php esc_html_e( 'Current SEO Score', 'wds' ); ?></div>
26
+ </div>
27
+
28
+ <div>
29
+ <div class="wds-stacked-stats">
30
+ <div>
31
+ <div class="wds-stat-name"><?php esc_html_e( 'Last checked:', 'wds' ); ?></div>
32
+ <div class="wds-stat-value"><?php echo esc_html( $service->get_last_checked( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ) ) ); ?></div>
33
+ </div>
34
+
35
+ <div>
36
+ <div class="wds-stat-name"><?php esc_html_e( 'SEO Issues', 'wds' ); ?></div>
37
+ <div class="wds-stat-value">
38
+ <span class="wds-issues <?php echo $issue_count > 0 ? esc_attr( 'wds-issues-warning' ) : ''; ?>">
39
+ <span><?php echo esc_html( $issue_count ); ?></span>
40
+ </span>
41
+ </div>
42
+ </div>
43
+
44
+ <div>
45
+ <div class="wds-stat-name"><?php esc_html_e( 'Scheduled reports', 'wds' ); ?></div>
46
+ <div class="wds-stat-value" style="line-height: 1">
47
+ <?php if ( $service->is_member() ) : ?>
48
+ <?php if ( $reporting_enabled ) : ?>
49
+
50
+ <?php
51
+ $monday = strtotime( 'this Monday' );
52
+ $midnight = strtotime( 'today' );
53
+ $checkup_frequency = smartcrawl_get_array_value( $opts, 'checkup-frequency' );
54
+ $checkup_dow = smartcrawl_get_array_value( $opts, 'checkup-dow' );
55
+ $checkup_tod = smartcrawl_get_array_value( $opts, 'checkup-tod' );
56
+ ?>
57
+
58
+ <span class="wds-checkup-frequency"><?php echo esc_html( $checkup_frequency ); ?></span><br/>
59
+ <span class="wds-checkup-frequency-details">
60
+ <?php
61
+ if ( $checkup_frequency == 'daily' ) {
62
+ printf(
63
+ __( 'at %s' ),
64
+ esc_html( date_i18n( get_option( 'time_format' ), $midnight + ($checkup_tod * HOUR_IN_SECONDS) ) )
65
+ );
66
+ } else {
67
+ printf(
68
+ __( 'Every %1$s at %1$s' ),
69
+ esc_html( date_i18n( 'l', $monday + ($checkup_dow * DAY_IN_SECONDS) ) ),
70
+ esc_html( date_i18n( get_option( 'time_format' ), $midnight + ($checkup_tod * HOUR_IN_SECONDS) ) )
71
+ );
72
+ }
73
+ ?>
74
+ </span>
75
+
76
+ <?php else : ?>
77
+ <button class="button button-small wds-enable-reporting">
78
+ <?php esc_html_e( 'Enable', 'wds' ); ?>
79
+ </button>
80
+ <button class="button button-small wds-disable-reporting"
81
+ style="display: none;">
82
+ <?php esc_html_e( 'Disable', 'wds' ); ?>
83
+ </button>
84
+ <?php endif; ?>
85
+ <?php else : /* Not a member, this is a pro feature */ ?>
86
+ <button class="wds-upgrade-button button-pro wds-has-tooltip"
87
+ data-content="<?php _e( 'Get SmartCrawl Pro today Free', 'wds' ); ?>"
88
+ type="button">
89
+ <?php esc_html_e( 'Pro feature', 'wds' ); ?>
90
+ </button>
91
+ <?php endif; ?>
92
+ </div>
93
+ </div>
94
+ </div>
95
+ </div>
96
+ </div>
includes/admin/templates/dashboard-dialog-has_dashboard-service_seo.php ADDED
@@ -0,0 +1,231 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php do_action( 'wds-template-seo_service-box-full-before' ); ?>
2
+
3
+ <?php
4
+ // We have Dashboard installed and set up, we're ready to go
5
+ ?>
6
+ <?php if ( empty( $status['start'] ) /*&& empty($status['end'])*/ ) { ?>
7
+ <section class="box-dashboard-run-seo-anaysis dev-box">
8
+ <div class="box-title">
9
+ <h3><span class="dashicons dashicons-dashboard wds-dashicons wds-dashicons-box-title"></span><?php esc_html_e( 'Run SEO analysis of your site', 'wds' ); ?></h3>
10
+ </div>
11
+ <?php if ( ! empty( $errors ) ) { ?>
12
+ <div class="box-content">
13
+ <?php foreach ( $errors as $error ) { ?>
14
+ <div class="wds-notice wds-notice-error">
15
+ <p><?php echo $error; ?></p>
16
+ </div>
17
+ <?php } ?>
18
+ </div>
19
+ <?php } ?>
20
+
21
+ <div class="box-content wds-seo_service-results-parent">
22
+ <?php do_action( 'wds-template-seo_service-box-full-before_body' ); ?>
23
+ <p><?php esc_html_e( 'Let our servers run a comprehensive scan of your entire website & compile a list of suggestions on how you can improve the SEO of your website.', 'wds' ); ?></p>
24
+ </div>
25
+ <div class="box-footer buttons">
26
+ <a href="#run-seo-analysis-modal" rel="dialog" class="button button-cta-alt"><?php esc_html_e( 'Run SEO analysis', 'wds' ); ?></a>
27
+ </div>
28
+
29
+ </section><!-- end box-dashboard-run-seo-anaysis -->
30
+ <?php } ?>
31
+
32
+
33
+ <?php
34
+ // SEO Report Test still on progress
35
+ ?>
36
+ <?php if ( ! empty( $status['start'] ) ) { ?>
37
+ <section class="box-dashboard-run-seo-anaysis dev-box">
38
+ <div class="box-title">
39
+ <h3><span class="dashicons dashicons-dashboard wds-dashicons wds-dashicons-box-title"></span><?php esc_html_e( 'Run SEO analysis of your site', 'wds' ); ?></h3>
40
+ </div>
41
+
42
+ <div class="box-content">
43
+ <?php if ( ! empty( $errors ) ) { foreach ( $errors as $error ) { ?>
44
+ <div class="wds-notice wds-notice-error">
45
+ <p><?php echo $error; ?></p>
46
+ </div>
47
+ <?php }
48
+ } ?>
49
+
50
+ <?php if ( $report->has_state_messages() ) { ?>
51
+ <div class="result state-messages">
52
+ <?php foreach ( $report->get_state_messages() as $message ) { ?>
53
+ <div class="wds-notice wds-notice-error">
54
+ <p><?php echo esc_html( $message ); ?></p>
55
+ </div>
56
+ <?php } ?>
57
+ </div>
58
+ </div>
59
+ <?php } ?>
60
+
61
+ <?php if ( empty( $status['end'] ) ) { ?>
62
+ <?php $this->_render( 'dashboard-dialog-seo_service-run', array( 'status' => $status ) ); ?>
63
+ <?php } elseif ( ! empty( $has_result ) ) { ?>
64
+ <?php
65
+ // --- SEO check is done, let's go for results ---
66
+ ?>
67
+ <div class="box-content no-padding wds-seo_service-results-parent">
68
+ <?php do_action( 'wds-template-seo_service-box-full-before_body' ); ?>
69
+ <div class="wds-seo_service-results">
70
+
71
+ <div class="wds-overview">
72
+ <?php if ( $report->has_meta( 'total' ) ) { ?>
73
+ <div class="wds-overview-item">
74
+ <strong><?php echo (int) $report->get_meta( 'total' ); ?></strong>
75
+ <span><?php esc_html_e( 'Total Discovered URLs', 'wds' ); ?></span>
76
+ </div>
77
+ <?php } ?>
78
+ <?php if ( $report->has_meta( 'discovered' ) ) { ?>
79
+ <div class="wds-overview-item">
80
+ <strong><?php echo (int) $report->get_meta( 'discovered' ); ?></strong>
81
+ <span><?php esc_html_e( 'Newly Discovered URLs', 'wds' ); ?></span>
82
+ </div>
83
+ <?php } ?>
84
+ <?php if ( $report->has_issues( 'inaccessible' ) ) { ?>
85
+ <div class="wds-overview-item">
86
+ <strong><?php echo (int) $report->get_issues_count( 'inaccessible' ); ?></strong>
87
+ <span><?php esc_html_e( 'Invisible URLs', 'wds' ); ?></span>
88
+ </div>
89
+ <?php } ?>
90
+ <?php if ( $report->has_meta( 'sitemap_total' ) ) { ?>
91
+ <div class="wds-overview-item">
92
+ <strong><?php echo (int) $report->get_meta( 'sitemap_total' ); ?></strong>
93
+ <span><?php esc_html_e( 'URLs in the Sitemap', 'wds' ); ?></span>
94
+ </div>
95
+ <?php } ?>
96
+ </div>
97
+
98
+ <?php /* "Not processed" notice, displayed as warning, outside the main report */ ?>
99
+ <?php if ( $report->get_issues_count( 'not_processed' ) ) { ?>
100
+ <div class="result not-processed">
101
+ <div class="wds-notice wds-notice-warning">
102
+ <p><?php esc_html_e( 'Some parts of your site were too slow to respond and were not included in our crawl.', 'wds' ); ?></p>
103
+ </div>
104
+ </div>
105
+ <?php } ?>
106
+
107
+ <?php if ( $report->has_issues() ) { ?>
108
+ <div class="wds-breakdown">
109
+ <h4><?php echo esc_html_e( 'We have found a few issues with URLs:', 'wds' ); ?></h4>
110
+ <?php
111
+ if ( $report->has_issues( '5xx' ) ) {
112
+ $this->_render('dashboard-report-issue', array(
113
+ 'type' => '5xx',
114
+ 'msg' => __( 'URLs that result in server error (500 etc)', 'wds' ),
115
+ 'report' => $report,
116
+ 'issues' => $report->get_issues_by_type( '5xx' ),
117
+ 'redirections' => $redirections,
118
+ ));
119
+ }
120
+ if ( $report->has_issues( '4xx' ) ) {
121
+ $this->_render('dashboard-report-issue', array(
122
+ 'type' => '4xx',
123
+ 'msg' => __( 'URLs that result in soft error (404 etc)', 'wds' ),
124
+ 'report' => $report,
125
+ 'issues' => $report->get_issues_by_type( '4xx' ),
126
+ 'redirections' => $redirections,
127
+ ));
128
+ }
129
+ if ( $report->has_issues( '3xx' ) ) {
130
+ $this->_render('dashboard-report-issue', array(
131
+ 'type' => '3xx',
132
+ 'msg' => __( 'URLs that have multiple re-directs', 'wds' ),
133
+ 'report' => $report,
134
+ 'issues' => $report->get_issues_by_type( '3xx' ),
135
+ 'redirections' => $redirections,
136
+ ));
137
+ }
138
+ ?>
139
+ </div>
140
+ <?php } else { // if issues count ?>
141
+ <div class="wds-breakdown">
142
+ <div class="wds-service-no_issue">
143
+ <?php if ( ! $report->has_state_messages() ) { ?>
144
+ <div class="wds-crawl-result wds-crawl-success">
145
+ <p><?php esc_html_e( 'Your latest crawl revealed no SEO issues, well done!', 'wds' ); ?></p>
146
+ <?php if ( $report->has_ignored_issues() ) { ?>
147
+ <p>
148
+ <em><small><?php esc_html_e( 'Well, that\'s not entirely true, but you opted to ignore a couple of them ;)', 'wds' ); ?></small></em>
149
+ <a href="#purge-ignores"><?php esc_html_e( 'Purge ignored list', 'wds' ); ?></a>
150
+ </p>
151
+ <?php } ?>
152
+ </div>
153
+ <?php } else { ?>
154
+ <p><?php
155
+ esc_html_e( 'Please, have a look into the displayed messages and re-crawl your site.', 'wds' );
156
+ ?></p>
157
+ <?php } ?>
158
+ </div>
159
+ </div>
160
+ <?php } // if issues count ?>
161
+
162
+ <?php if ( $report->get_sitemap_misses() ) { ?>
163
+ <div class="wds-sitemap">
164
+ <div class="wds-seo_service-warning wds-seo_service-warning-sitemap">
165
+ <p>
166
+ <?php printf( __( '%d URLs are not in the Sitemap', 'wds' ), ($report->get_sitemap_misses()) ); ?>
167
+ <button
168
+ class="wds-update-sitemap button button-yellow-alt"
169
+ data-working="<?php esc_attr_e( 'Updating...', 'wds' ); ?>"
170
+ data-static="<?php esc_attr_e( 'Update Sitemap', 'wds' ); ?>"
171
+ data-done="<?php esc_attr_e( 'Sitemap updated, please hold on...', 'wds' ); ?>"
172
+ type="button" >
173
+ <?php esc_html_e( 'Update Sitemap', 'wds' ); ?>
174
+ </button>
175
+ <span class="info">
176
+ <small><i>
177
+ <?php esc_html_e( 'This number might not be indicative of an actual issue on your site. These URLs could also be things that don\'t make sense to be found in the sitemap, such as date archives.', 'wds' ); ?>
178
+ <?php if ( $report->has_issues( 'sitemap' ) ) { ?>
179
+ <a href="#toggle-sitemap-urls"><?php esc_html_e( 'Show', 'wds' ); ?></a>
180
+ <?php } ?>
181
+ </i></small>
182
+ </span>
183
+ </p>
184
+ <?php if ( $report->has_issues( 'sitemap' ) ) { ?>
185
+ <div class="wds-sitemap-issues_list" style="display:none">
186
+ <ul>
187
+ <?php foreach ( $report->get_issues_by_type( 'sitemap' ) as $key ) { ?>
188
+ <?php $info = $report->get_issue( $key ); ?>
189
+ <?php if ( empty( $info['path'] ) ) { continue; } ?>
190
+ <li
191
+ data-issue_id="<?php echo esc_attr( $key ); ?>"
192
+ data-path="<?php echo esc_attr( $info['path'] ); ?>"
193
+ >
194
+ <a href="<?php echo esc_url( $info['path'] ); ?>">
195
+ <?php echo esc_html( $info['path'] ); ?>
196
+ </a>
197
+ <a class="wds-sitemap-action wds-sitemap-ignore" href="#ignore"><?php esc_html_e( 'Ignore', 'wds' ); ?></a>
198
+ <a class="wds-sitemap-action wds-sitemap-add" href="#add"><?php esc_html_e( 'Add to sitemap', 'wds' ); ?></a>
199
+ </li>
200
+ <?php } ?>
201
+ </ul>
202
+ </div>
203
+ <?php } ?>
204
+ </div>
205
+ </div>
206
+ <?php } ?>
207
+
208
+ <?php if ( $report->has_ignored_issues() ) { ?>
209
+ <p class="wds-crawl-result wds-action-purge_ignored">
210
+ <a href="#purge-ignores">
211
+ <?php echo esc_html(sprintf(
212
+ _n( 'Purge %d ignored issue', 'Purge %d ignored issues', $report->get_ignored_issues_count(), 'wds' ),
213
+ $report->get_ignored_issues_count()
214
+ )); ?>
215
+ </a>
216
+ </p>
217
+ <?php } ?>
218
+
219
+ </div>
220
+ </div><!-- end box-content -->
221
+
222
+ <div class="box-footer buttons bordered-top">
223
+ <a href="#run-seo-analysis-modal" rel="dialog" class="button button-cta-alt"><?php esc_html_e( 'Run SEO analysis', 'wds' ); ?></a>
224
+ </div>
225
+
226
+ <?php } ?>
227
+
228
+ </section><!-- end box-dashboard-run-seo-anaysis -->
229
+ <?php } ?>
230
+
231
+ <?php do_action( 'wds-template-seo_service-box-full-after' ); ?>
includes/admin/templates/dashboard-dialog-has_dashboard-service_uptime.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <section class="box-dashboard-performance-info dev-box">
2
+ <div class="box-content">
3
+ <p class="uptime-message">
4
+ <span class="dashicons dashicons-chart-line wds-dashicons wds-dashicons-box-title"></span>
5
+ <?php if ( ! empty( $data['availability'] ) ) { ?>
6
+ <span class="uptime">
7
+ <span class="uptime-result"><?php echo esc_html( $data['availability'] ); ?></span>
8
+ <span class="uptime-label"><?php esc_html_e( 'Uptime', 'wds' ); ?></span>
9
+ </span>
10
+ <?php } ?>
11
+ <?php if ( ! class_exists( 'WP_Hummingbird' ) ) { ?>
12
+ <span class="content">
13
+ <?php printf( __( 'Install %s for more info.' , 'wds' ), sprintf( '<a href="https://premium.wpmudev.org/project/wp-hummingbird/">%s</a>', __( 'Hummingbird', 'wds' ) ) ); ?>
14
+ </span>
15
+ <?php } ?>
16
+ </p>
17
+
18
+ <?php
19
+ if ( ! empty( $errors ) ) { foreach ( $errors as $error ) {
20
+ ?>
21
+ <div class="wds-notice wds-notice-error">
22
+ <p><?php echo esc_html( $error ); ?></p>
23
+ </div>
24
+ <?php
25
+ }
26
+ }
27
+ ?>
28
+
29
+ </div>
30
+ </section><!-- end box-dashboard-performance-info -->
includes/admin/templates/dashboard-dialog-not_installed-service_seo.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // We don't have Dashboard installed
3
+ $dashboardLoginLink = admin_url( 'admin.php?page=wpmudev' );
4
+ $dashboardDownloadLink = 'https://premium.wpmudev.org/api/dashboard/v1/download-dashboard';
5
+ $dashboardHubLink = 'https://premium.wpmudev.org/membership/#profile-menu-tabs';
6
+ ?>
7
+ <section class="box-dashboard-install-dashboard-plugin dev-box">
8
+ <div class="box-title">
9
+ <h3><?php esc_html_e( 'Install WPMU DEV Dashboard', 'wds' ); ?></h3>
10
+ </div>
11
+ <div class="box-content">
12
+ <p>
13
+ <?php echo sprintf(
14
+ esc_html( '%s, WPMU DEV Dashboard Plugin is required in order to make advantage of SEO Analysus & Reporting. Once you Install, Activate & Login, you will be able to preform SEO Analysis sancs of your entire website, receive tips about improving your SEO Rankings.', 'wds' ),
15
+ Smartcrawl_Model_User::current()->get_first_name()
16
+ ); ?>
17
+ </p>
18
+ </div>
19
+ <div class="box-footer buttons">
20
+ <a href="<?php echo esc_url( $dashboardDownloadLink ); ?>" class="button block button-cta-alt large"><?php esc_html_e( 'Download WPMU DEV Dashboard', 'wds' ); ?></a>
21
+ </div>
22
+ </section><!-- end box-dashboard-install-dashboard-plugin -->
includes/admin/templates/dashboard-dialog-not_installed-service_uptime.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <section class="box-dashboard-performance-info dev-box">
2
+ <div class="box-title">
3
+ <h3><span class="dashicons dashicons-chart-line wds-dashicons wds-dashicons-box-title"></span><?php esc_html_e( 'Quickly check your site performance', 'wds' ); ?></h3>
4
+ </div>
5
+ <div class="box-content">
6
+ <p><?php esc_html_e( 'This service requires an active WPMU DEV Membership, get one today!', 'wds' ); ?></p>
7
+ </div>
8
+ <div class="box-footer buttons">
9
+ <a href="https://premium.wpmudev.org/membership/#profile-menu-tabs" target="_blank" class="button button-cta"><?php esc_html_e( 'Update Membership', 'wds' ); ?></a>
10
+ </div>
11
+ </section><!-- end box-dashboard-performance-info -->
includes/admin/templates/dashboard-dialog-not_logged_in-service_seo.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // We have Dashboard installed, but the user didn't log in yet
3
+ $dashboardLoginLink = admin_url( 'admin.php?page=wpmudev' );
4
+ $dashboardDownloadLink = 'https://premium.wpmudev.org/api/dashboard/v1/download-dashboard';
5
+ $dashboardHubLink = 'https://premium.wpmudev.org/membership/#profile-menu-tabs';
6
+ ?>
7
+ <section class="box-dashboard-upgrade-membership dev-box">
8
+ <div class="box-title">
9
+ <h3><?php esc_html_e( 'Upgrade Membership', 'wds' ); ?></h3>
10
+ </div>
11
+ <div class="box-content">
12
+ <p>
13
+ <?php echo sprintf(
14
+ esc_html( '%s SEO Analysis & Reporting is a feature available to people with active WPMU DEV memberships. Get access to all of our Premium Plugins and Themes as well as 24/7 Support today. It´s easy to join and only takes a few minutes!', 'wds' ),
15
+ Smartcrawl_Model_User::current()->get_first_name()
16
+ ); ?>
17
+ </p>
18
+ <ul class="listing bold wds-listing">
19
+ <li class="cta-alt"><?php _e( 'Access to 140+ plugins & Upfront themes', 'wds' ); ?></li>
20
+ <li class="cta-alt"><?php _e( 'Access to security, backups, SEO and performance services', 'wds' ); ?></li>
21
+ <li class="cta-alt"><?php _e( '24/7 expert WordPress support', 'wds' ); ?></li>
22
+ </ul>
23
+ </div>
24
+ <div class="box-footer buttons">
25
+ <a href="<?php echo $dashboardHubLink; ?>" class="button block button-cta-alt large"><?php esc_html_e( 'Upgrade Membership', 'wds' ); ?></a>
26
+ <p class="wds-footer-text"><?php echo sprintf( __( 'Already a member? You need to <a href="%1$s">download</a> the WPMU DEV Plugin & <a href="%1$s">login</a>!', 'wds' ), $dashboardDownloadLink, $dashboardLoginLink ); ?></p>
27
+ </div>
28
+ </section><!-- end box-dashboard-upgrade-membership -->
includes/admin/templates/dashboard-dialog-seo_service-run.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $progress = isset( $status ) && ! empty( $status['percentage'] ) && is_numeric( $status['percentage'] )
3
+ ? (int) $status['percentage']
4
+ : 0
5
+ ;
6
+ if ( $progress > 100 ) { $progress = 100; }
7
+ ?>
8
+ <div class="box-content wds-seo_service-run">
9
+ <div class="wds-block-test wds-block-test-standalone">
10
+ <h4 class="wds-block-test-sub-title"><?php _e( 'SEO analysis in progress', 'wds' ); ?></h4>
11
+ <div class="wds-progress">
12
+ <div class="wds-progress-bar wds-progress-bar-with-percent wds-progress-bar-animated" role="progressbar" aria-valuenow="<?php echo (int) $progress; ?>" aria-valuemin="0" aria-valuemax="100" style="width:<?php echo (int) $progress; ?>%;">
13
+ <span class="wds-progress-bar-current-percent"><?php echo (int) $progress; ?>%</span>
14
+ </div>
15
+ </div><!-- end wds-progress -->
16
+ <div class="wds-progress-state">
17
+ <span class="wds-progress-state-text"><?php _e( 'Checking the site ...', 'wds' ); ?></span>
18
+ </div><!-- end wds-progress-state -->
19
+ <div class="wds-progress-note">
20
+ <?php
21
+ $admin_email = false;
22
+ $dash_email = false;
23
+ if ( class_exists( 'WPMUDEV_Dashboard' ) && ! empty( WPMUDEV_Dashboard::$site ) ) {
24
+ if ( is_callable( array( WPMUDEV_Dashboard::$site, 'get_option' ) ) ) {
25
+ $dash_email = WPMUDEV_Dashboard::$site->get_option( 'auth_user' );
26
+ if ( false !== strpos( $dash_email, '@' ) ) { $admin_email = $dash_email; }
27
+ }
28
+ }
29
+ $scan_msg = __( "A full scan can take quite a while, especially if you have a large site!<br>Feel free to close this page; we'll send an e-mail to %s once the results are in.", 'wds' );
30
+ ?>
31
+ <p>
32
+ <?php if ( ! empty( $dash_email ) && ! empty( $admin_email ) ) { ?>
33
+ <?php $admin_email = sprintf( '<a href="mailto: %1$s">%1$s</a>', $admin_email ); ?>
34
+ <?php } else { ?>
35
+ <?php $admin_email = __( 'your DEV account email', 'wds' ); ?>
36
+ <?php } ?>
37
+ <?php
38
+ printf(
39
+ $scan_msg,
40
+ $admin_email
41
+ );
42
+ ?>
43
+ <br>
44
+ <?php esc_html_e( 'You can change that e-mail address if you want, on your DEV account page', 'wds' ); ?>
45
+ <a href="https://premium.wpmudev.org/hub/account" target="_blank"><?php esc_html_e( 'here', 'wds' ); ?></a>
46
+ </p>
47
+ </div>
48
+ </div><!-- end wds-block-test -->
49
+ </div>
includes/admin/templates/dashboard-report-issue.php ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="wds-service-issue wds-seo_service-issue wds-seo_service-issue-<?php echo esc_attr( $type ); ?>">
2
+ <p>
3
+ <strong><?php echo (int) count( $issues ); ?></strong>
4
+ <?php echo esc_html( $msg ); ?>
5
+ <button type="button" class="wds-fix button button-white"><?php esc_html_e( 'Fix', 'wds' ); ?></button>
6
+ </p>
7
+
8
+ <?php if ( ! empty( $issues ) ) { ?>
9
+ <div class="wds-issue-items">
10
+ <header>
11
+ <div class="wds-issue-item-part wds-issue-occurences">
12
+ Occurences
13
+ </div>
14
+ <div class="wds-issue-item-part wds-issue-path">
15
+ URL
16
+ </div>
17
+ </header>
18
+ <?php foreach ( $issues as $issue_id ) { ?>
19
+ <?php $issue = $report->get_issue( $issue_id ); ?>
20
+ <div class="wds-issue-item" data-issue_id="<?php echo esc_attr( $issue_id ); ?>" >
21
+
22
+ <!-- Occurences list modal for this URL -->
23
+ <dialog class="dev-overlay wds-modal wds-occurences" id="wds-issue-occurences-<?php echo esc_attr( $issue_id ); ?>" title="<?php echo esc_attr( $issue['path'] ); ?>">
24
+ <div class="box-content">
25
+ <div class="wds-issue-occurences-list">
26
+ <ul class="wds-listing wds-path-occurences">
27
+ <li class="wds-listing-label"><?php esc_html_e( 'Link Location', 'wds' ); ?></li>
28
+ <?php if ( ! empty( $issue['origin'] ) ) { foreach ( $issue['origin'] as $origin ) { ?>
29
+ <li>
30
+ <?php
31
+ $origin = is_array( $origin ) && ! empty( $origin[0] ) ? $origin[0] : $origin;
32
+ ?>
33
+ <a href="<?php echo is_string( $origin ) ? esc_url( $origin ) : esc_url( $origin[0] ); ?>">
34
+ <?php echo is_string( $origin ) ? esc_html( $origin ) : esc_html( $origin[0] ); ?>
35
+ </a>
36
+ </li>
37
+ <?php }
38
+ } ?>
39
+ </ul>
40
+ </div>
41
+ </div>
42
+ </dialog>
43
+
44
+ <!-- Redirection modal for this URL -->
45
+ <dialog class="dev-overlay wds-modal wds-redirect" id="wds-issue-redirect-<?php echo esc_attr( $issue_id ); ?>" title="<?php echo esc_attr( $issue['path'] ); ?>">
46
+ <div class="box-content modal">
47
+ <p class="group wds-group">
48
+ <label for="" class="wds-label"><?php esc_html_e( 'Enter re-direct URL', 'wds' ); ?></label>
49
+ <input type="url" name="redirect" value="<?php echo (
50
+ ! empty( $redirections[ $issue['path'] ] )
51
+ ? esc_url( $redirections[ $issue['path'] ] )
52
+ : ''
53
+ ); ?>" class="wds-field">
54
+ </p>
55
+ </div>
56
+
57
+ <div class="box-footer buttons modal">
58
+ <input type="hidden" name="source" value="<?php echo esc_url( $issue['path'] ); ?>" />
59
+ <?php wp_nonce_field( 'wds-redirect', 'wds-redirect' ); ?>
60
+ <button type="button" class="button button-cta-alt wds-submit-redirect"><?php echo esc_html_e( 'Save', 'wds' ); ?></button>
61
+ </div>
62
+ </dialog>
63
+
64
+ <!-- Occurences count part -->
65
+ <div class="wds-issue-item-part wds-issue-occurences">
66
+ <span><?php echo count( $issue['origin'] ); ?></span>
67
+ </div>
68
+
69
+ <!-- Issue URL part -->
70
+ <div class="wds-issue-item-part wds-issue-path">
71
+ <a href="<?php echo esc_url( $issue['path'] ); ?>">
72
+ <?php echo esc_html( $issue['path'] ); ?>
73
+ <?php if ( in_array( $issue['path'], array_keys( $redirections ) ) ) { ?>
74
+ [redirected]
75
+ <?php } ?>
76
+ </a>
77
+ </div>
78
+
79
+ <!-- Actions list dropdown -->
80
+ <div class="wds-issue-item-part wds-issue-actions">
81
+ <a href="#actions">
82
+ &hellip;
83
+ </a>
84
+ <div class="wds-issue-actions-options">
85
+ <ul>
86
+ <li class="heading">Options <i class="wdv-icon wdv-icon-fw wdv-icon-remove"></i></li>
87
+ <li>
88
+ <a href="#list">
89
+ <i class="wds-icon wds-icon-inline wds-icon-inline-left wds-icon-list"></i>
90
+ <?php esc_html_e( 'List occurences', 'wds' ); ?>
91
+ </a>
92
+ </li>
93
+ <li>
94
+ <a href="#redirect">
95
+ <i class="wds-icon wds-icon-inline wds-icon-inline-left wds-icon-redirect"></i>
96
+ <?php esc_html_e( 'Re-direct', 'wds' ); ?>
97
+ </a>
98
+ </li>
99
+ <li>
100
+ <a href="#ignore" data-issue_id="<?php echo esc_attr( $issue_id ); ?>">
101
+ <i class="wds-icon wds-icon-inline wds-icon-inline-left wds-icon-ignore"></i>
102
+ <?php esc_html_e( 'Ignore', 'wds' ); ?>
103
+ </a>
104
+ </li>
105
+ </ul>
106
+ </div>
107
+ </div>
108
+
109
+ </div> <!-- .wds-issue-item -->
110
+ <?php } ?>
111
+ </div> <!-- .wds-issue-items -->
112
+ <?php } ?>
113
+
114
+ </div>
includes/admin/templates/dashboard-settings.php ADDED
@@ -0,0 +1,237 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
3
+ ?>
4
+ <div id="container" class="wrap wrap-wds wds-page wds-page-dashboard">
5
+ <!--
6
+ <div class="wds-notice wds-notice-success">
7
+ <p><?php esc_html_e( 'Settings Updated', 'wds' ); ?></p>
8
+ </div>
9
+
10
+ <div class="wds-notice wds-notice-error can-close">
11
+ <span class="close"></span>
12
+ <p><?php esc_html_e( 'Settings Updated', 'wds' ); ?></p>
13
+ </div>
14
+
15
+ <div class="wds-notice wds-notice-warning">
16
+ <p><?php esc_html_e( 'Settings Updated', 'wds' ); ?></p>
17
+ </div>
18
+
19
+ <div class="wds-notice wds-notice-success wds-notice-box">
20
+ <p><?php esc_html_e( 'Settings Updated', 'wds' ); ?></p>
21
+ </div>
22
+
23
+ <div class="wds-notice wds-notice-error wds-notice-box can-close">
24
+ <span class="close"></span>
25
+ <p><?php esc_html_e( 'Settings Updated', 'wds' ); ?></p>
26
+ </div>
27
+ -->
28
+ <section id="page-header">
29
+ <h1 class="wds-title-alt"><?php esc_html_e( 'Welcome to SmartCrawl' , 'wds' ); ?></h1>
30
+ <p class="wds-page-desc">
31
+ <?php esc_html_e( 'Ahoy Cap\'n! Welcome to SmartCrawl. This plugin will help you improve the SEO of your website and get better', 'wds' ); ?>
32
+ <br>
33
+ <?php esc_html_e( 'Search Results Rankings across various search engines.', 'wds' ); ?>
34
+ </p>
35
+ </section><!-- end page-header -->
36
+
37
+ <?php
38
+ $dashboardLoginLink = admin_url( 'admin.php?page=wpmudev' );
39
+ $dashboardDownloadLink = 'https://premium.wpmudev.org/api/dashboard/v1/download-dashboard';
40
+ $dashboardHubLink = 'https://premium.wpmudev.org/membership/#profile-menu-tabs';
41
+ ?>
42
+
43
+ <div class="row">
44
+
45
+ <div class="col-half col-half-dashboard col-half-dashboard-left">
46
+
47
+
48
+
49
+
50
+
51
+ <?php
52
+ /**
53
+ * Pre-built Uptime service dashboard box
54
+ */
55
+ if ( ! empty( $uptime_message_box ) ) { echo $uptime_message_box; }
56
+ ?>
57
+
58
+
59
+ <?php
60
+ /**
61
+ * Pre-built SEO service dashboard box
62
+ */
63
+ if ( ! empty( $seo_message_box ) ) { echo $seo_message_box; }
64
+ ?>
65
+
66
+ <?php if ( ! empty( $smartcrawl_options['sitemap'] ) && ! empty( $smartcrawl_options['wds_sitemap-setup'] ) ) { ?>
67
+ <section class="box-dashboard-sitemap-settings dev-box">
68
+ <div class="box-title">
69
+ <div class="buttons buttons-icon">
70
+ <a href="<?php echo $current_admin_url; ?>?page=wds_sitemap" class="edit"><span class="dashicons dashicons-admin-generic wds-dashicons wds-dashicons-link"></span></a>
71
+ </div>
72
+ <h3><span class="dashicons dashicons-networking wds-dashicons wds-dashicons-box-title"></span><?php esc_html_e( 'Sitemaps', 'wds' ); ?></h3>
73
+ </div>
74
+ <div class="box-content">
75
+ <?php if ( ! empty( $smartcrawl_options['sitemappath'] ) ) { ?>
76
+ <p><?php esc_html_e( 'Path to the XML Sitemap', 'wds' ); ?></p>
77
+ <div class="wds-block-content wds-block-content-grey">
78
+ <pre><?php echo esc_html( $smartcrawl_options['sitemappath'] ); ?></pre>
79
+ </div>
80
+ <?php } ?>
81
+ <?php if ( function_exists( 'wds_get_sitemap_url' ) ) { ?>
82
+ <p><?php esc_html_e( 'URL to the XML Sitemap', 'wds' ); ?>: <a target="_blank" href="<?php echo smartcrawl_get_sitemap_url(); ?>"><?php echo smartcrawl_get_sitemap_url(); ?></a></p>
83
+ <?php } ?>
84
+ </div>
85
+ </section><!-- end box-dashboard-sitemap-settings -->
86
+ <?php } ?>
87
+
88
+ </div><!-- end col-half-dashboard-left -->
89
+
90
+ <div class="col-half col-half-dashboard col-half-dashboard-right">
91
+
92
+ <?php if ( ! empty( $smartcrawl_options['onpage'] ) && (is_network_admin() || Smartcrawl_Settings_Admin::is_tab_allowed( Smartcrawl_Settings::TAB_ONPAGE )) ) { ?>
93
+ <?php if ( empty( $smartcrawl_options['wds_onpage-setup'] ) ) { ?>
94
+
95
+ <section class="box-dashboard-improve-seo dev-box">
96
+ <div class="box-title">
97
+ <h3><span class="dashicons dashicons-admin-settings wds-dashicons wds-dashicons-box-title"></span><?php esc_html_e( 'Manually improve SEO', 'wds' ); ?></h3>
98
+ </div>
99
+ <div class="box-content">
100
+ <p>
101
+ <?php esc_html_e( 'Manually improve your site\'s SEO by configuring various settings.', 'wds' ); ?>
102
+ <br />
103
+ <?php esc_html_e( 'We recommend by starting with Title & Meta as it is generally considered the most valuable area and most likely to be indexed.', 'wds' ); ?></p>
104
+ </div>
105
+ <div class="box-footer buttons">
106
+ <a href="<?php echo esc_url( Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_ONPAGE ) ); ?>" class="button button-cta-dark button-configure-seo"><?php esc_html_e( 'Configure SEO', 'wds' ); ?></a>
107
+ </div>
108
+ </section><!-- end box-dashboard-performance-info -->
109
+
110
+ <?php } else { ?>
111
+
112
+ <section class="box-dashboard-titles-and-meta dev-box">
113
+ <div class="box-title">
114
+ <div class="buttons buttons-icon">
115
+ <a href="<?php echo esc_url( Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_ONPAGE ) ); ?>" class="edit"><span class="dashicons dashicons-admin-generic wds-dashicons wds-dashicons-link"></span></a>
116
+ </div>
117
+ <h3><span class="dashicons dashicons-edit wds-dashicons wds-dashicons-box-title"></span><?php esc_html_e( 'Titles & Meta', 'wds' ); ?></h3>
118
+ </div>
119
+ <div class="box-content">
120
+ <div class="wds-links-list-group">
121
+ <ul class="wds-links-list">
122
+ <li class="wds-links-list-item">
123
+ <a class="wds-links-list-item-link" href="<?php echo $current_admin_url; ?>?page=wds_onpage#tab_homepage">
124
+ <span class="wds-links-list-item-label"><?php esc_html_e( 'Homepage', 'wds' ) ?></span>
125
+ <span class="wds-links-list-item-edit"><?php esc_html_e( 'Edit', 'wds' ) ?></span>
126
+ </a>
127
+ </li><!-- end wds-links-list-item -->
128
+
129
+ <?php
130
+ foreach ( get_post_types( array( 'public' => true ) ) as $posttype ) {
131
+ if ( in_array( $posttype, array( 'revision', 'nav_menu_item' ) ) ) { continue; }
132
+
133
+ $type_obj = get_post_type_object( $posttype );
134
+ if ( ! is_object( $type_obj ) ) { continue; }
135
+
136
+ ?>
137
+
138
+ <li class="wds-links-list-item">
139
+ <a class="wds-links-list-item-link" href="<?php echo esc_attr( $current_admin_url ); ?>?page=wds_onpage#tab_<?php echo esc_attr( $posttype ); ?>">
140
+ <span class="wds-links-list-item-label"><?php echo esc_html( $type_obj->labels->name ); ?></span>
141
+ <span class="wds-links-list-item-edit"><?php esc_html_e( 'Edit', 'wds' ) ?></span>
142
+ </a>
143
+ </li><!-- end wds-links-list-item -->
144
+
145
+ <?php
146
+ }
147
+ ?>
148
+ <li class="wds-links-list-item">
149
+ <a class="wds-links-list-item-link" href="<?php echo esc_attr( $current_admin_url ); ?>?page=wds_onpage#tab_post-categories">
150
+ <span class="wds-links-list-item-label"><?php esc_html_e( 'Post Categories', 'wds' ) ?></span>
151
+ <span class="wds-links-list-item-edit"><?php esc_html_e( 'Edit', 'wds' ) ?></span>
152
+ </a>
153
+ </li>
154
+
155
+ </ul><!-- end wds-links-list -->
156
+
157
+ <ul class="wds-links-list">
158
+ <?php
159
+ foreach ( get_taxonomies( array( '_builtin' => false ), 'objects' ) as $taxonomy ) {
160
+ ?>
161
+
162
+ <li class="wds-links-list-item">
163
+ <a class="wds-links-list-item-link" href="<?php echo esc_attr( $current_admin_url ); ?>?page=wds_onpage#tab_<<?php echo esc_attr( $taxonomy->name ); ?>">
164
+ <span class="wds-links-list-item-label"><?php echo esc_html( ucfirst( $taxonomy->label ) ); ?></span>
165
+ <span class="wds-links-list-item-edit"><?php esc_html_e( 'Edit', 'wds' ) ?></span>
166
+ </a>
167
+ </li><!-- end wds-links-list-item -->
168
+
169
+ <?php
170
+ }
171
+ ?>
172
+
173
+ <li class="wds-links-list-item">
174
+ <a class="wds-links-list-item-link" href="<?php echo esc_attr( $current_admin_url ); ?>?page=wds_onpage#tab_post-tags">
175
+ <span class="wds-links-list-item-label"><?php esc_html_e( 'Post Tags', 'wds' ) ?></span>
176
+ <span class="wds-links-list-item-edit"><?php esc_html_e( 'Edit', 'wds' ) ?></span>
177
+ </a>
178
+ </li>
179
+
180
+ <li class="wds-links-list-item">
181
+ <a class="wds-links-list-item-link" href="<?php echo esc_attr( $current_admin_url ); ?>?page=wds_onpage#tab_author-archive">
182
+ <span class="wds-links-list-item-label"><?php esc_html_e( 'Author Archive', 'wds' ) ?></span>
183
+ <span class="wds-links-list-item-edit"><?php esc_html_e( 'Edit', 'wds' ) ?></span>
184
+ </a>
185
+ </li>
186
+
187
+ <li class="wds-links-list-item">
188
+ <a class="wds-links-list-item-link" href="<?php echo esc_attr( $current_admin_url ); ?>?page=wds_onpage#tab_date-archive">
189
+ <span class="wds-links-list-item-label"><?php esc_html_e( 'Date Archive', 'wds' ) ?></span>
190
+ <span class="wds-links-list-item-edit"><?php esc_html_e( 'Edit', 'wds' ) ?></span>
191
+ </a>
192
+ </li>
193
+
194
+ <li class="wds-links-list-item">
195
+ <a class="wds-links-list-item-link" href="<?php echo esc_attr( $current_admin_url ); ?>?page=wds_onpage#tab_search-page">
196
+ <span class="wds-links-list-item-label"><?php esc_html_e( 'Search Page', 'wds' ) ?></span>
197
+ <span class="wds-links-list-item-edit"><?php esc_html_e( 'Edit', 'wds' ) ?></span>
198
+ </a>
199
+ </li>
200
+
201
+ <li class="wds-links-list-item">
202
+ <a class="wds-links-list-item-link" href="<?php echo esc_attr( $current_admin_url ); ?>?page=wds_onpage#tab_404-page">
203
+ <span class="wds-links-list-item-label"><?php esc_html_e( '404 Page', 'wds' ) ?></span>
204
+ <span class="wds-links-list-item-edit"><?php esc_html_e( 'Edit', 'wds' ) ?></span>
205
+ </a>
206
+ </li>
207
+
208
+ </ul><!-- end wds-links-list -->
209
+
210
+ </div>
211
+ </div>
212
+ </section><!-- end box-dashboard-titles-and-meta -->
213
+
214
+ <?php } ?>
215
+
216
+ <?php } // end if tab is allowed ?>
217
+
218
+ <?php if ( ! empty( $smartcrawl_options['access-id'] ) && ! empty( $smartcrawl_options['secret-key'] ) ) { ?>
219
+ <section class="box-dashboard-seo-moz-stats dev-box">
220
+ <div class="box-title">
221
+ <div class="buttons buttons-icon">
222
+ <a href="<?php echo esc_attr( $current_admin_url ); ?>?page=wds_settings" class="edit"><span class="dashicons dashicons-admin-generic wds-dashicons wds-dashicons-link"></span></a>
223
+ </div>
224
+ <h3><span class="dashicons dashicons-chart-area wds-dashicons wds-dashicons-box-title"></span><?php esc_html_e( 'SEO Moz Stats', 'wds' ); ?></h3>
225
+ </div>
226
+ <div class="box-content"><?php Smartcrawl_Seomoz_Dashboard_Widget::widget(); ?></div>
227
+ </section><!-- end box-dashboard-seo-moz-stats -->
228
+
229
+ <?php } ?>
230
+
231
+ </div>
232
+
233
+ </div>
234
+
235
+ </div><!-- end container -->
236
+
237
+ <?php do_action( 'wds-dshboard-after_settings' ); ?>
includes/admin/templates/dashboard/dashboard-box-title-url-crawl-stats.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $report = empty( $report ) ? null : $report;
3
+
4
+ if ( is_null( $report ) ) {
5
+ return;
6
+ }
7
+
8
+ $active_issues = $report->get_issues_count();
9
+ ?>
10
+
11
+ <?php if ( $active_issues > 0 ) : ?>
12
+ <span class="wds-issues wds-issues-warning wds-has-tooltip"
13
+ data-content="<?php printf( __( 'You have %s sitemap issues', 'wds' ), $active_issues ); ?>">
14
+
15
+ <?php echo $active_issues; ?>
16
+ </span>
17
+ <?php endif; ?>
includes/admin/templates/dashboard/dashboard-checkup-progress.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_CHECKUP );
3
+ $percentage = $service->status();
4
+ $progress = (int) $percentage;
5
+ if ( $progress > 100 ) { $progress = 100; }
6
+ ?>
7
+ <p><?php esc_html_e( 'SmartCrawl is performing a full SEO checkup which will take a few moments. You can close this page if you need to, we’ll let you know when it’s complete.', 'wds' ); ?></p>
8
+ <div class="wds-box-refresh-required"></div>
9
+ <?php
10
+ $this->_render('progress-bar', array(
11
+ 'progress' => $progress,
12
+ ));
13
+ ?>
14
+
15
+ <?php
16
+ if ( ! Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SITE )->is_member() ) {
17
+ $this->_render('mascot-message', array(
18
+ 'key' => 'dash-seo-checkup-upsell',
19
+ 'dismissible' => false,
20
+ 'message' => sprintf(
21
+ '%s <a href="#upgrade-to-pro">%s</a>',
22
+ esc_html__( 'Did you know with SmartCrawl Pro you can schedule automated SEO checkups and send whitelabel email reports direct to yours and your clients inboxes?', 'wds' ),
23
+ esc_html__( '- Try it all FREE today', 'wds' )
24
+ ),
25
+ ));
26
+ }
27
+ ?>
includes/admin/templates/dashboard/dashboard-content-analysis-readability-overview.php ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Readability analysis dashboard widget template
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ $analysis_model = new Smartcrawl_Model_Analysis();
9
+ $overview = $analysis_model->get_overall_readability_analysis();
10
+
11
+ if ( ! $overview ) {
12
+ return;
13
+ }
14
+
15
+ $total = smartcrawl_get_array_value( $overview, 'total' );
16
+ $passed = smartcrawl_get_array_value( $overview, 'passed' );
17
+ $type_breakdown = smartcrawl_get_array_value( $overview, 'post-types' );
18
+
19
+ if ( is_null( $total ) || is_null( $passed ) || is_null( $type_breakdown ) ) {
20
+ return;
21
+ }
22
+
23
+ $percentage = ! empty( $total )
24
+ ? intval( ceil( ($passed / $total) * 100 ) )
25
+ : 0
26
+ ;
27
+
28
+ if ( 0 === $passed && 0 === $total ) {
29
+ $class = 'wds-check-invalid';
30
+ $indicator = esc_html__( 'No data yet', 'wds' );
31
+ } elseif ( $percentage > 79 ) {
32
+ $class = 'wds-check-success';
33
+ $indicator = esc_html__( 'Easy', 'wds' );
34
+ } elseif ( $percentage > 59 ) {
35
+ $class = 'wds-check-warning';
36
+ $indicator = esc_html__( 'Difficult', 'wds' );
37
+ } else {
38
+ $class = 'wds-check-error';
39
+ $indicator = esc_html__( 'Difficult', 'wds' );
40
+ }
41
+ ?>
42
+ <div class="wds-accordion">
43
+ <div class="wds-accordion-section wds-check-item <?php echo esc_attr( $class ); ?>">
44
+
45
+ <div class="wds-accordion-handle">
46
+ <div class="wds-accordion-handle-part"><?php esc_html_e( 'Overall Readability Analysis', 'wds' ); ?></div>
47
+ <div class="wds-accordion-handle-part">
48
+ <span class="wds-check-item-indicator"><?php echo $indicator; ?></span>
49
+ </div>
50
+ </div>
51
+
52
+ <div class="wds-accordion-content">
53
+ <p class="wds-small-text">
54
+ <?php esc_html_e( "Here's a breakdown of where you can make improvements.", 'wds' ); ?>
55
+ </p>
56
+
57
+ <table class="wds-list-table">
58
+ <tr>
59
+ <th><?php esc_html_e( 'Post Type', 'wds' ); ?></th>
60
+ <th><?php esc_html_e( 'Difficult', 'wds' ); ?></th>
61
+ <th><?php esc_html_e( 'Okay', 'wds' ); ?></th>
62
+ <th><?php esc_html_e( 'Easy', 'wds' ); ?></th>
63
+ </tr>
64
+ <?php foreach ( $type_breakdown as $post_type => $type_overview ) : ?>
65
+ <?php
66
+ $difficult = intval( smartcrawl_get_array_value( $type_overview, 'error' ) );
67
+ $okay = intval( smartcrawl_get_array_value( $type_overview, 'warning' ) );;
68
+ $easy = intval( smartcrawl_get_array_value( $type_overview, 'success' ) );
69
+
70
+ $edit_url = admin_url( 'edit.php?wds_readability_threshold=' );
71
+ ?>
72
+ <tr>
73
+ <td><?php echo esc_html( $post_type ); ?></td>
74
+ <td>
75
+ <?php $difficult > 0 ? printf( '<span class="wds-issues wds-issues-error"><a href="%s">%s</a></span>', esc_url( add_query_arg( 'post_type', $post_type, "{$edit_url}0" ) ), $difficult ) : print(0); ?>
76
+ </td>
77
+ <td>
78
+ <?php $okay > 0 ? printf( '<span class="wds-issues wds-issues-warning"><a href="%s">%s</a></span>', esc_url( add_query_arg( 'post_type', $post_type, "{$edit_url}1" ) ), $okay ) : print(0); ?>
79
+ </td>
80
+ <td>
81
+ <?php $easy > 0 ? printf( '<span class="wds-issues wds-issues-success-bg">%s</span>', $easy ) : print(0); ?>
82
+ </td>
83
+ </tr>
84
+ <?php endforeach; ?>
85
+ </table>
86
+ </div>
87
+
88
+ </div>
89
+ </div>
includes/admin/templates/dashboard/dashboard-content-analysis-seo-overview.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * SEO analyis dashboard widget template
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ $analysis_model = new Smartcrawl_Model_Analysis();
9
+ $overview = $analysis_model->get_overall_seo_analysis();
10
+
11
+ if ( ! $overview ) {
12
+ return;
13
+ }
14
+
15
+ $total = smartcrawl_get_array_value( $overview, 'total' );
16
+ $passed = smartcrawl_get_array_value( $overview, 'passed' );
17
+ $type_breakdown = smartcrawl_get_array_value( $overview, 'post-types' );
18
+
19
+ if ( is_null( $total ) || is_null( $passed ) || is_null( $type_breakdown ) ) {
20
+ return;
21
+ }
22
+
23
+ $percentage = ! empty( $total )
24
+ ? intval( ceil( ($passed / $total) * 100 ) )
25
+ : 0
26
+ ;
27
+
28
+ if ( 0 === $passed && 0 === $total ) {
29
+ $class = 'wds-check-invalid';
30
+ $indicator = esc_html__( 'No data yet', 'wds' );
31
+ } elseif ( $percentage > 60 ) {
32
+ $class = 'wds-check-success';
33
+ $indicator = esc_html__( 'Good', 'wds' );
34
+ } else {
35
+ $class = 'wds-check-warning';
36
+ $indicator = esc_html__( 'Poor', 'wds' );
37
+ }
38
+ ?>
39
+ <div class="wds-accordion">
40
+ <div class="wds-accordion-section wds-check-item <?php echo esc_attr( $class ); ?>">
41
+
42
+ <div class="wds-accordion-handle">
43
+ <div class="wds-accordion-handle-part"><?php esc_html_e( 'Overall SEO Analysis', 'wds' ); ?></div>
44
+ <div class="wds-accordion-handle-part">
45
+ <span class="wds-check-item-indicator"><?php echo $indicator; ?></span>
46
+ </div>
47
+ </div>
48
+
49
+ <div class="wds-accordion-content">
50
+ <p class="wds-small-text">
51
+ <?php esc_html_e( "Here's a breakdown of where you can make improvements.", 'wds' ); ?>
52
+ </p>
53
+
54
+ <table class="wds-list-table">
55
+ <tr>
56
+ <th><?php esc_html_e( 'Post Type', 'wds' ); ?></th>
57
+ <th><?php esc_html_e( 'Poor', 'wds' ); ?></th>
58
+ <th><?php esc_html_e( 'Good', 'wds' ); ?></th>
59
+ </tr>
60
+ <?php foreach ( $type_breakdown as $post_type => $type_overview ) : ?>
61
+ <?php
62
+ $total_for_type = intval( smartcrawl_get_array_value( $type_overview, 'total' ) );
63
+ $passed_for_type = intval( smartcrawl_get_array_value( $type_overview, 'passed' ) );
64
+ $failed_for_type = $total_for_type - $passed_for_type;
65
+
66
+ $fail_url = esc_url( admin_url( "edit.php?post_type={$post_type}&wds_analysis_threshold=99" ) );
67
+ $success_url = esc_url( admin_url( "edit.php?post_type={$post_type}&wds_analysis_threshold=100" ) );
68
+ ?>
69
+ <tr>
70
+ <td><?php echo esc_html( $post_type ); ?></td>
71
+ <td>
72
+ <?php $failed_for_type > 0 ? printf( '<span class="wds-issues wds-issues-warning"><a href="%s">%s</a></span>', $fail_url, $failed_for_type ) : print(0); ?>
73
+ </td>
74
+ <td>
75
+ <?php $passed_for_type > 0 ? printf( '<span class="wds-issues wds-issues-success-bg"><a href="%s">%s</a></span>', $success_url, $passed_for_type ) : print(0); ?>
76
+ </td>
77
+ </tr>
78
+ <?php endforeach; ?>
79
+ </table>
80
+ </div>
81
+
82
+ </div>
83
+ </div>
includes/admin/templates/dashboard/dashboard-mini-checkup-report.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $results = empty( $results ) ? null : $results;
3
+ $issue_count = empty( $issue_count ) ? 0 : $issue_count;
4
+ $page_url = ! empty( $page_url ) ? $page_url : Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_CHECKUP );
5
+ ?>
6
+
7
+ <?php if ( $issue_count > 0 || ! empty( $results['error'] ) ) : ?>
8
+ <div class="wds-report">
9
+ <?php $this->_render( 'checkup/checkup-checkup-results', array( 'show_upsell_message' => false ) ); ?>
10
+ </div>
11
+ <?php else : ?>
12
+ <p><?php esc_html_e( 'A comprehensive report on how optimized your website is for search engines and social media.', 'wds' ); ?></p>
13
+ <?php
14
+ $this->_render('notice', array(
15
+ 'message' => esc_html__( 'You have no outstanding SEO issues. Awesome work!', 'wds' ),
16
+ 'class' => 'wds-notice-success',
17
+ ));
18
+ ?>
19
+ <?php endif; ?>
20
+
21
+ <div class="wds-box-report-details wds-box-footer">
22
+ <a href="<?php echo esc_attr( $page_url ); ?>#tab_checkup"
23
+ class="button button-small button-dark button-dark-o wds-dash-view-report-button">
24
+
25
+ <?php esc_html_e( 'View Report', 'wds' ); ?>
26
+ </a>
27
+ <?php if ( ! empty( $reporting_enabled ) ) : ?>
28
+ <span class="wds-box-stat-value wds-box-stat-value-success"><?php esc_html_e( 'Automatic checkups are enabled', 'wds' ); ?></span>
29
+ <?php endif; ?>
30
+ </div>
includes/admin/templates/dashboard/dashboard-top.php ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_CHECKUP );
3
+ $last_checked = (boolean) $service->get_last_checked_timestamp();
4
+ $in_progress = $last_checked ? false : $service->in_progress();
5
+ $dashboard_url = Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_DASHBOARD );
6
+ $options = $_view['options'];
7
+ $option_name = Smartcrawl_Settings::TAB_SETTINGS . '_options';
8
+ $sitemap_enabled = smartcrawl_get_array_value( $options, 'sitemap' );
9
+ $results = $last_checked ? $service->result() : array();
10
+ $counts = smartcrawl_get_array_value( $results, 'counts' );
11
+ $score = smartcrawl_get_array_value( $results, 'score' );
12
+
13
+ $issue_count = 0;
14
+ if ( $score === null || false === $score ) {
15
+ $score_class = 'wds-score-invalid';
16
+ } else {
17
+ $issue_count = intval( smartcrawl_get_array_value( $counts, 'warning' ) ) + intval( smartcrawl_get_array_value( $counts, 'critical' ) );
18
+ $score_class = $issue_count > 0 ? 'wds-score-warning' : 'wds-score-success';
19
+ }
20
+ ?>
21
+
22
+ <section id="<?php echo Smartcrawl_Settings_Dashboard::BOX_TOP_STATS; ?>"
23
+ class="wds-seo-checkup-stats wds-report-stats wds-dash-stats dev-box"
24
+ data-issue-count="<?php echo $issue_count; ?>" data-dependent="<?php echo Smartcrawl_Settings_Dashboard::BOX_SITEMAP; ?>">
25
+
26
+ <div class="wds-report-score">
27
+ <?php if ( ! $last_checked && ! $in_progress ) : ?>
28
+ <div class="wds-last-checkup-never">
29
+ <span class="wds-strong-text"><?php esc_html_e( 'Welcome!', 'wds' ); ?></span>
30
+ <p class="wds-small-text">
31
+ <?php esc_html_e( 'Run your first SEO checkup to see what needs improving!', 'wds' ); ?>
32
+ </p>
33
+ <a href="<?php echo esc_url( add_query_arg( 'run-checkup', 'yes', $dashboard_url ) ); ?>"
34
+ class="button button-small">
35
+
36
+ <?php esc_html_e( 'Run checkup', 'wds' ); ?>
37
+ </a>
38
+ </div>
39
+ <?php else : ?>
40
+ <div class="wds-score <?php echo esc_attr( $score_class ); ?>">
41
+ <?php echo esc_html( intval( $score ) ); ?>
42
+ <span class="wds-total"><?php esc_html_e( '/100', 'wds' ); ?></span>
43
+ </div>
44
+ <div class="wds-small-text"><?php esc_html_e( 'Current SEO Score', 'wds' ); ?></div>
45
+ <?php endif; ?>
46
+ </div>
47
+
48
+ <div>
49
+ <div class="wds-stacked-stats">
50
+ <div>
51
+ <div class="wds-stat-name"><?php esc_html_e( 'Last checkup:', 'wds' ); ?></div>
52
+ <div class="wds-stat-value"><?php echo $in_progress ? __( 'In Progress', 'wds' ) : $service->get_last_checked( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ) ); ?></div>
53
+ </div>
54
+
55
+ <div>
56
+ <div class="wds-stat-name"><?php esc_html_e( 'Sitemap:', 'wds' ); ?></div>
57
+ <div class="wds-stat-value">
58
+ <?php if ( $sitemap_enabled ) : ?>
59
+
60
+ <?php
61
+ $this->_render('url-crawl-master', array(
62
+ 'ready_template' => 'dashboard/dashboard-url-crawl-stats',
63
+ 'progress_template' => 'dashboard/dashboard-url-crawl-in-progress-small',
64
+ 'no_data_template' => 'dashboard/dashboard-url-crawl-no-data-small',
65
+ ));
66
+ ?>
67
+
68
+ <?php else : ?>
69
+
70
+ <button type="button"
71
+ data-option-id="<?php echo esc_attr( $option_name ); ?>"
72
+ data-flag="<?php echo 'sitemap'; ?>"
73
+ class="wds-activate-component button button-small wds-button-with-loader wds-button-with-left-loader wds-disabled-during-request">
74
+
75
+ <?php esc_html_e( 'Activate Sitemap', 'wds' ); ?>
76
+ </button>
77
+
78
+ <?php endif; ?>
79
+ </div>
80
+ </div>
81
+ </div>
82
+ </div>
83
+
84
+
85
+ </section>
includes/admin/templates/dashboard/dashboard-url-crawl-in-progress-small.php ADDED
@@ -0,0 +1,2 @@
 
 
1
+ <div class="wds-box-refresh-required"></div>
2
+ <span class="wds-crawl-in-progress"><?php esc_html_e( 'Crawl in progress ...', 'wds' ); ?></span>
includes/admin/templates/dashboard/dashboard-url-crawl-in-progress.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $progress = empty( $progress ) ? 0 : $progress;
3
+ ?>
4
+ <div class="wds-box-refresh-required"></div>
5
+ <p class="wds-small-text"><?php esc_html_e( 'SmartCrawl is performing a URL crawl, please wait…', 'wds' ); ?></p>
6
+
7
+ <?php
8
+ $this->_render('progress-bar', array(
9
+ 'progress' => $progress,
10
+ ));
11
+ ?>
includes/admin/templates/dashboard/dashboard-url-crawl-no-data-small.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <div class="wds-box-crawl-stats">
2
+ <span class="wds-issues wds-issues-invalid">
3
+ <?php esc_html_e( 'No Data Available', 'wds' ) ?>
4
+ </span>
5
+ </div>
includes/admin/templates/dashboard/dashboard-url-crawl-stats.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $report = empty( $report ) ? null : $report;
3
+
4
+ if ( is_null( $report ) ) {
5
+ return;
6
+ }
7
+
8
+ $active_issues = $report->get_issues_count();
9
+ $missing_urls = $report->get_issues_count( 'sitemap' );
10
+ ?>
11
+
12
+ <?php if ( $active_issues > 0 ) : ?>
13
+ <div class="wds-box-crawl-stats">
14
+ <span class="wds-issues wds-issues-warning wds-has-tooltip"
15
+ data-content="<?php printf( __( 'You have %s sitemap issues', 'wds' ), $active_issues ); ?>">
16
+
17
+ <?php echo $active_issues; ?><?php esc_html_e( ' issues', 'wds' ); ?>
18
+ </span>
19
+ <span class="wds-issues wds-issues-invalid"><?php echo $missing_urls; ?><?php esc_html_e( ' missing URLs', 'wds' ); ?></span>
20
+ </div>
21
+ <?php else : ?>
22
+ <span class="wds-box-stat-value wds-box-stat-value-success"><?php esc_html_e( 'No issues', 'wds' ); ?></span>
23
+ <?php endif; ?>
includes/admin/templates/dashboard/dashboard-widget-advanced-tools.php ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $page_url = Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_AUTOLINKS );
3
+
4
+ $redirection_model = new Smartcrawl_Model_Redirection;
5
+ $redirection_count = count( $redirection_model->get_all_redirections() );
6
+
7
+ $option_name = Smartcrawl_Settings::TAB_SETTINGS . '_options';
8
+ $options = $_view['options'];
9
+ $autolinking_enabled = smartcrawl_get_array_value( $options, 'autolinks' );
10
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_CHECKUP );
11
+ $is_member = $service->is_member();
12
+ $moz_connected = ! empty( $options['access-id'] ) && ! empty( $options['secret-key'] );
13
+ ?>
14
+
15
+ <section id="<?php echo Smartcrawl_Settings_Dashboard::BOX_ADVANCED_TOOLS; ?>" class="dev-box">
16
+ <div class="box-title">
17
+ <div class="buttons buttons-icon">
18
+ <a href="<?php echo esc_attr( $page_url ); ?>" class="wds-settings-link">
19
+ <i class="wds-icon-arrow-right-carats"></i>
20
+ </a>
21
+ </div>
22
+ <h3>
23
+ <i class="wds-icon-wand-magic"></i> <?php esc_html_e( 'Advanced Tools', 'wds' ); ?>
24
+ </h3>
25
+ </div>
26
+
27
+ <div class="box-content">
28
+ <p><?php esc_html_e( 'Advanced tools focus on the finer details of SEO including internal linking, redirections and Moz analysis.', 'wds' ); ?></p>
29
+
30
+ <div class="wds-separator-top">
31
+ <span class="wds-small-text"><strong><?php esc_html_e( 'URL Redirects', 'wds' ); ?></strong></span>
32
+ <span class="wds-box-stat-value"><?php echo esc_html( $redirection_count ); ?>
33
+ </div>
34
+
35
+ <div class="wds-separator-top cf">
36
+ <span class="wds-small-text"><strong><?php esc_html_e( 'Moz Integration', 'wds' ); ?></strong></span>
37
+
38
+ <?php if ( $moz_connected ) : ?>
39
+ <span class="wds-box-stat-value">
40
+ <a href="<?php echo esc_attr( $page_url ); ?>#tab_moz"
41
+ class="button button-small button-dark button-dark-o">
42
+
43
+ <?php esc_html_e( 'View Report', 'wds' ); ?>
44
+ </a>
45
+ </span>
46
+ <?php else : ?>
47
+ <p class="wds-small-text">
48
+ <?php esc_html_e( 'Moz provides reports that tell you how your site stacks up against the competition with all of the important SEO measurement tools.', 'wds' ); ?>
49
+ </p>
50
+ <a href="<?php echo esc_attr( $page_url ); ?>#tab_moz"
51
+ class="button button-small">
52
+
53
+ <?php esc_html_e( 'Connect', 'wds' ); ?>
54
+ </a>
55
+ <?php endif; ?>
56
+ </div>
57
+
58
+ <div class="wds-separator-top wds-autolinking-section <?php echo ! $is_member ? 'wds-box-blocked-area' : ''; ?>">
59
+ <span class="wds-small-text"><strong><?php esc_html_e( 'Automatic Linking', 'wds' ); ?></strong></span>
60
+ <?php if ( $autolinking_enabled && $is_member ) : ?>
61
+ <span class="wds-box-stat-value wds-box-stat-value-success"><?php esc_html_e( 'Active', 'wds' ); ?></span>
62
+ <?php else : ?>
63
+ <p class="wds-small-text">
64
+ <?php esc_html_e( 'Configure SmartCrawl to automatically link certain key words to a page on your blog or even a whole new site all together.', 'wds' ); ?>
65
+ </p>
66
+ <button type="button"
67
+ data-option-id="<?php echo esc_attr( $option_name ); ?>"
68
+ data-flag="<?php echo 'autolinks'; ?>"
69
+ class="wds-activate-component button button-small wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request">
70
+
71
+ <?php esc_html_e( 'Activate', 'wds' ); ?>
72
+ </button>
73
+ <?php if ( ! $is_member ) : ?>
74
+ <button class="wds-upgrade-button button-pro wds-has-tooltip"
75
+ data-content="<?php _e( 'Get SmartCrawl Pro today Free', 'wds' ); ?>"
76
+ type="button">
77
+ <?php esc_html_e( 'Pro feature', 'wds' ); ?>
78
+ </button>
79
+ <?php endif; ?>
80
+ <?php endif; ?>
81
+ </div>
82
+
83
+ <div class="wds-box-footer" style="margin-top: 0;">
84
+ <a href="<?php echo esc_attr( $page_url ); ?>"
85
+ class="button button-small button-dark button-dark-o wds-dash-configure-button">
86
+
87
+ <?php esc_html_e( 'Configure', 'wds' ); ?>
88
+ </a>
89
+
90
+ <?php
91
+ if ( ! $is_member ) {
92
+
93
+ $this->_render('mascot-message', array(
94
+ 'key' => 'seo-checkup-upsell',
95
+ 'dismissible' => false,
96
+ 'message' => sprintf(
97
+ '%s <a href="#upgrade-to-pro">%s</a>',
98
+ esc_html__( 'Upgrade to Pro and automatically link your articles both internally and externally with automatic linking - a favourite among SEO pros.', 'wds' ),
99
+ esc_html__( '- Try SmartCrawl Pro FREE today!', 'wds' )
100
+ ),
101
+ ));
102
+ }
103
+ ?>
104
+ </div>
105
+ </div>
106
+ </section>
includes/admin/templates/dashboard/dashboard-widget-content-analysis.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $options = $_view['options'];
3
+ $seo_analysis_enabled = smartcrawl_get_array_value( $options, 'analysis-seo' );
4
+ $readability_analysis_enabled = smartcrawl_get_array_value( $options, 'analysis-readability' );
5
+ $option_name = Smartcrawl_Settings::TAB_SETTINGS . '_options';
6
+ $is_ajax_request = defined( 'DOING_AJAX' ) && DOING_AJAX;
7
+ $refresh_required = ! $is_ajax_request && ($seo_analysis_enabled || $readability_analysis_enabled);
8
+
9
+ $classes = array();
10
+ if ( $refresh_required ) {
11
+ $classes[] = 'wds-box-refresh-required';
12
+ }
13
+ if ( $seo_analysis_enabled ) {
14
+ $classes[] = 'wds-seo-analysis-enabled';
15
+ }
16
+ if ( $readability_analysis_enabled ) {
17
+ $classes[] = 'wds-readability-analysis-enabled';
18
+ }
19
+ ?>
20
+
21
+ <section id="<?php echo Smartcrawl_Settings_Dashboard::BOX_CONTENT_ANALYSIS; ?>"
22
+ class="dev-box <?php echo implode( ' ', $classes ); ?>">
23
+
24
+ <div class="box-title">
25
+ <h3>
26
+ <i class="wds-icon-magnifying-glass-search"></i> <?php esc_html_e( 'Content Analysis', 'wds' ); ?>
27
+ </h3>
28
+ </div>
29
+
30
+ <div class="box-content">
31
+ <p><?php esc_html_e( 'SEO and Readability Analysis recommend improvements to your content to give it the best chance of ranking highly, as well as being easy for average person to read.', 'wds' ); ?></p>
32
+
33
+ <div class="wds-report">
34
+ <?php if ( $seo_analysis_enabled ) : ?>
35
+ <?php if ( $is_ajax_request ) { $this->_render( 'dashboard/dashboard-content-analysis-seo-overview' ); } ?>
36
+ <?php else : ?>
37
+ <div class="wds-separator-top">
38
+ <span class="wds-small-text"><strong><?php esc_html_e( 'SEO Analysis', 'wds' ); ?></strong></span>
39
+ <p class="wds-small-text">
40
+ <?php esc_html_e( 'Analyses your content against recommend SEO practice and gives recommendations for improvement to make sure content is as optimized as possible.', 'wds' ); ?>
41
+ </p>
42
+ <button type="button"
43
+ data-option-id="<?php echo esc_attr( $option_name ); ?>"
44
+ data-flag="analysis-seo"
45
+ class="wds-activate-component button button-small wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request">
46
+
47
+ <?php esc_html_e( 'Activate', 'wds' ); ?>
48
+ </button>
49
+ </div>
50
+ <?php endif; ?>
51
+
52
+ <?php if ( $readability_analysis_enabled ) : ?>
53
+ <?php if ( $is_ajax_request ) { $this->_render( 'dashboard/dashboard-content-analysis-readability-overview' ); } ?>
54
+ <?php else : ?>
55
+ <div class="wds-separator-top">
56
+ <span class="wds-small-text"><strong><?php esc_html_e( 'Readability Analysis', 'wds' ); ?></strong></span>
57
+ <p class="wds-small-text">
58
+ <?php esc_html_e( 'Benchmarks the readability of your content for the average visitor and gives recommendations for improvement.', 'wds' ); ?>
59
+ </p>
60
+ <button type="button"
61
+ data-option-id="<?php echo esc_attr( $option_name ); ?>"
62
+ data-flag="analysis-readability"
63
+ class="wds-activate-component button button-small wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request">
64
+
65
+ <?php esc_html_e( 'Activate', 'wds' ); ?>
66
+ </button>
67
+ </div>
68
+ <?php endif; ?>
69
+ </div>
70
+
71
+ <div class="wds-box-footer">
72
+ <a href="<?php echo esc_attr( admin_url( 'edit.php' ) ); ?>"
73
+ class="button button-small button-dark button-dark-o wds-dash-edit-posts-button">
74
+
75
+ <?php esc_html_e( 'Edit Posts', 'wds' ); ?>
76
+ </a>
77
+ </div>
78
+ </div>
79
+ </section>
includes/admin/templates/dashboard/dashboard-widget-onpage.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $page_url = Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_ONPAGE );
3
+ $public_post_types = get_post_types( array( 'public' => true ) );
4
+ $show_on_front = get_option( 'show_on_front' );
5
+ $options = $_view['options'];
6
+ $option_name = Smartcrawl_Settings::TAB_SETTINGS . '_options';
7
+ $onpage_enabled = smartcrawl_get_array_value( $options, 'onpage' );
8
+ ?>
9
+ <section id="<?php echo Smartcrawl_Settings_Dashboard::BOX_ONPAGE; ?>" class="dev-box">
10
+ <div class="box-title">
11
+ <?php if ( $onpage_enabled ) : ?>
12
+ <div class="buttons buttons-icon">
13
+ <a href="<?php echo esc_attr( $page_url ); ?>">
14
+ <i class="wds-icon-arrow-right-carats"></i>
15
+ </a>
16
+ </div>
17
+ <?php endif; ?>
18
+ <h3>
19
+ <i class="wds-icon-pencil"></i> <?php esc_html_e( 'Titles & Meta', 'wds' ); ?>
20
+ </h3>
21
+ </div>
22
+
23
+ <div class="box-content">
24
+ <p><?php esc_html_e( 'Control how your website’s pages, posts and custom post types appear in search engines like Google and Bing.', 'wds' ); ?></p>
25
+
26
+ <?php if ( $onpage_enabled ) : ?>
27
+ <div class="wds-separator-top">
28
+ <span class="wds-small-text"><strong><?php esc_html_e( 'Homepage', 'wds' ); ?></strong></span>
29
+ <span class="wds-box-stat-value"><?php $show_on_front == 'page' ? esc_html_e( 'A Static Page', 'wds' ) : esc_html_e( 'Latest Posts', 'wds' ); ?></span>
30
+ </div>
31
+
32
+ <div class="wds-separator-top">
33
+ <span class="wds-small-text"><strong><?php esc_html_e( 'Public post types', 'wds' ); ?></strong></span>
34
+ <span class="wds-box-stat-value"><?php echo esc_html( count( $public_post_types ) ); ?></span>
35
+ </div>
36
+
37
+ <div class="wds-box-footer">
38
+ <a href="<?php echo esc_attr( $page_url ); ?>"
39
+ class="button button-small button-dark button-dark-o wds-dash-configure-button">
40
+
41
+ <?php esc_html_e( 'Configure', 'wds' ); ?>
42
+ </a>
43
+ </div>
44
+ <?php else : ?>
45
+ <button type="button"
46
+ data-option-id="<?php echo esc_attr( $option_name ); ?>"
47
+ data-flag="<?php echo esc_attr( 'onpage' ); ?>"
48
+ class="wds-activate-component button button-small wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request">
49
+
50
+ <?php esc_html_e( 'Activate', 'wds' ); ?>
51
+ </button>
52
+ <?php endif; ?>
53
+ </div>
54
+ </section>
includes/admin/templates/dashboard/dashboard-widget-seo-checkup.php ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $page_url = Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_CHECKUP );
3
+ $dashboard_url = Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_DASHBOARD );
4
+ /**
5
+ * @var $service Smartcrawl_Checkup_Service
6
+ */
7
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_CHECKUP );
8
+ $options = $_view['options'];
9
+ $reporting_enabled = smartcrawl_get_array_value( $options, 'checkup-cron-enable' );
10
+ $last_checked = (boolean) $service->get_last_checked_timestamp();
11
+ $in_progress = $last_checked ? false : $service->in_progress();
12
+ $option_name = Smartcrawl_Settings::TAB_SETTINGS . '_options';
13
+ $checkup_enabled = smartcrawl_get_array_value( $options, 'checkup' );
14
+ $checkup_text = esc_html__( 'Get a comprehensive report on how optimized your website is for search engines and social media. We recommend running this checkup first to see what needs improving.', 'wds' );
15
+ $results = $in_progress ? array() : $service->result();
16
+ $counts = smartcrawl_get_array_value( $results, 'counts' );
17
+ $issue_count = intval( smartcrawl_get_array_value( $counts, 'warning' ) ) + intval( smartcrawl_get_array_value( $counts, 'critical' ) );
18
+ ?>
19
+ <section id="<?php echo Smartcrawl_Settings_Dashboard::BOX_SEO_CHECKUP; ?>" class="dev-box">
20
+ <div class="box-title">
21
+ <?php if ( $checkup_enabled ) : ?>
22
+ <div class="buttons buttons-icon">
23
+ <a href="<?php echo esc_attr( $page_url ); ?>">
24
+ <i class="wds-icon-arrow-right-carats"></i>
25
+ </a>
26
+ </div>
27
+ <?php endif; ?>
28
+ <h3>
29
+ <i class="wds-icon-icon-smart-crawl"></i> <?php esc_html_e( 'SEO Checkup', 'wds' ); ?>
30
+ <?php if ( $issue_count > 0 ) : ?>
31
+ <span class="wds-issues wds-issues-warning wds-has-tooltip"
32
+ data-content="<?php printf( __( 'You have %s outstanding SEO issues to fix up', 'wds' ), $issue_count ); ?>">
33
+ <?php echo $issue_count; ?>
34
+ </span>
35
+ <?php endif; ?>
36
+ </h3>
37
+ </div>
38
+ <div class="box-content">
39
+ <?php if ( $checkup_enabled ) : ?>
40
+ <?php
41
+ if ( ! $last_checked && ! $in_progress ) {
42
+ ?>
43
+ <p><?php echo $checkup_text; ?></p>
44
+
45
+ <div class="wds-box-footer">
46
+ <a href="<?php echo esc_url( add_query_arg( 'run-checkup', 'yes', $dashboard_url ) ); ?>"
47
+ class="button button-small">
48
+ <?php esc_html_e( 'Run checkup', 'wds' ); ?>
49
+ </a>
50
+ </div>
51
+ <?php
52
+ } elseif ( $service->in_progress() ) {
53
+ $this->_render( 'dashboard/dashboard-checkup-progress' );
54
+ } else {
55
+ $this->_render('dashboard/dashboard-mini-checkup-report', array(
56
+ 'results' => $results,
57
+ 'issue_count' => $issue_count,
58
+ ));
59
+ }
60
+ ?>
61
+ <?php else : ?>
62
+ <p><?php echo $checkup_text; ?></p>
63
+ <button type="button"
64
+ data-option-id="<?php echo esc_attr( $option_name ); ?>"
65
+ data-flag="<?php echo esc_attr( 'checkup' ); ?>"
66
+ class="wds-activate-component button button-small wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request">
67
+
68
+ <?php esc_html_e( 'Activate', 'wds' ); ?>
69
+ </button>
70
+ <?php endif; ?>
71
+ </div>
72
+ </section>
includes/admin/templates/dashboard/dashboard-widget-sitemap.php ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $page_url = Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_SITEMAP );
3
+ $options = $_view['options'];
4
+ $sitemap_enabled = smartcrawl_get_array_value( $options, 'sitemap' );
5
+ $option_name = Smartcrawl_Settings::TAB_SETTINGS . '_options';
6
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_CHECKUP );
7
+ $is_member = $service->is_member();
8
+ ?>
9
+ <section id="<?php echo Smartcrawl_Settings_Dashboard::BOX_SITEMAP; ?>"
10
+ class="dev-box"
11
+ data-dependent="<?php echo Smartcrawl_Settings_Dashboard::BOX_TOP_STATS; ?>">
12
+
13
+ <div class="box-title">
14
+ <div class="buttons buttons-icon">
15
+ <a href="<?php echo esc_attr( $page_url ); ?>">
16
+ <i class="wds-icon-arrow-right-carats"></i>
17
+ </a>
18
+ </div>
19
+ <h3>
20
+ <i class="wds-icon-web-globe-world"></i> <?php esc_html_e( 'Sitemap', 'wds' ); ?>
21
+ <?php
22
+ $this->_render('url-crawl-master', array(
23
+ 'ready_template' => 'dashboard/dashboard-box-title-url-crawl-stats',
24
+ ));
25
+ ?>
26
+ </h3>
27
+ </div>
28
+ <div class="box-content">
29
+ <p><?php esc_html_e( 'Automatically generate detailed sitemaps to tell search engines what content you want them to crawl and index.', 'wds' ); ?></p>
30
+
31
+ <div class="wds-separator-top">
32
+ <span class="wds-small-text"><strong><?php esc_html_e( 'XML Sitemap', 'wds' ); ?></strong></span>
33
+ <?php if ( $sitemap_enabled ) : ?>
34
+
35
+ <?php
36
+ $this->_render('notice', array(
37
+ 'class' => 'wds-notice-success',
38
+ 'message' => sprintf(
39
+ __( 'Your sitemap is available at %s', 'wds' ),
40
+ sprintf( '<a href="%s">/sitemap.xml</a>', esc_attr( smartcrawl_get_sitemap_url() ) )
41
+ ),
42
+ ));
43
+ ?>
44
+
45
+ <?php else : ?>
46
+ <p class="wds-small-text">
47
+ <?php esc_html_e( 'Enables an XML page that search engines will use to crawl and index your website pages.', 'wds' ); ?>
48
+ </p>
49
+
50
+ <?php
51
+ $this->_render('dismissable-notice', array(
52
+ 'key' => 'dashboard-sitemap-disabled-warning',
53
+ 'message' => __( 'Your sitemap is currently disabled. We highly recommend you enable this feature if you don’t already have a sitemap.', 'wds' ),
54
+ 'class' => 'wds-notice-warning',
55
+ ));
56
+ ?>
57
+ <button type="button"
58
+ data-option-id="<?php echo esc_attr( $option_name ); ?>"
59
+ data-flag="<?php echo 'sitemap'; ?>"
60
+ class="wds-activate-component button button-small wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request">
61
+
62
+ <?php esc_html_e( 'Activate', 'wds' ); ?>
63
+ </button>
64
+ <?php endif; ?>
65
+ </div>
66
+
67
+ <div class="wds-separator-top <?php echo $is_member ? '' : 'wds-box-blocked-area'; ?>">
68
+ <span class="wds-small-text"><strong><?php esc_html_e( 'URL Crawler', 'wds' ); ?></strong></span>
69
+ <?php if ( $sitemap_enabled ) : ?>
70
+ <?php
71
+ $this->_render('url-crawl-master', array(
72
+ 'ready_template' => 'dashboard/dashboard-url-crawl-stats',
73
+ 'progress_template' => 'dashboard/dashboard-url-crawl-in-progress',
74
+ 'no_data_template' => 'dashboard/dashboard-url-crawl-no-data-small',
75
+ ));
76
+ ?>
77
+ <?php else : ?>
78
+ <?php if ( $is_member ) : ?>
79
+ <div class="wds-box-crawl-stats">
80
+ <span class="wds-issues wds-issues-invalid">
81
+ <?php esc_html_e( 'Sitemaps must be activated', 'wds' ) ?>
82
+ </span>
83
+ </div>
84
+ <?php else : ?>
85
+ <p class="wds-small-text">
86
+ <?php esc_html_e( 'Automatically schedule SmartCrawl to run check for URLs that are missing from your Sitemap.', 'wds' ) ?>
87
+ </p>
88
+ <button class="wds-upgrade-button button-pro wds-has-tooltip"
89
+ data-content="<?php _e( 'Get SmartCrawl Pro today Free', 'wds' ); ?>"
90
+ type="button">
91
+ <?php esc_html_e( 'Pro feature', 'wds' ); ?>
92
+ </button>
93
+ <?php endif; ?>
94
+ <?php endif; ?>
95
+ </div>
96
+
97
+ <div class="wds-box-footer" style="<?php echo $is_member ? '' : 'margin-top:0;'; ?>">
98
+ <a href="<?php echo esc_attr( $page_url ); ?>"
99
+ class="button button-small button-dark button-dark-o wds-dash-configure-button">
100
+
101
+ <?php esc_html_e( 'Configure', 'wds' ); ?>
102
+ </a>
103
+ </div>
104
+ </div>
105
+ </section>
includes/admin/templates/dashboard/dashboard-widget-social.php ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( ! class_exists( 'Smartcrawl_Twitter_Printer' ) ) { require_once( SMARTCRAWL_PLUGIN_DIR . '/tools/class_wds_twitter_printer.php' ); }
3
+
4
+ $options = $_view['options'];
5
+ $og_enabled = smartcrawl_get_array_value( $options, 'og-enable' );
6
+ $twitter_card_enabled = smartcrawl_get_array_value( $options, 'twitter-card-enable' );
7
+ $twitter_card_type = smartcrawl_get_array_value( $options, 'twitter-card-type' );
8
+ $twitter_card_status_text = $twitter_card_type == Smartcrawl_Twitter_Printer::CARD_IMAGE ? esc_html__( 'Summary Card with Large Image', 'wds' ) : esc_html__( 'Summary Card', 'wds' );
9
+ $pinterest_verification_status = smartcrawl_get_array_value( $options, 'pinterest-verification-status' );
10
+ $pinterest_tag = smartcrawl_get_array_value( $options, 'pinterest-verify' );
11
+
12
+ $social_page_url = Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_SOCIAL );
13
+ $social_option_name = Smartcrawl_Settings::TAB_SOCIAL . '_options';
14
+ $settings_option_name = Smartcrawl_Settings::TAB_SETTINGS . '_options';
15
+ $social_enabled = smartcrawl_get_array_value( $options, 'social' );
16
+ ?>
17
+ <section id="<?php echo Smartcrawl_Settings_Dashboard::BOX_SOCIAL; ?>" class="dev-box">
18
+ <div class="box-title">
19
+ <?php if ( $social_enabled ) : ?>
20
+ <div class="buttons buttons-icon">
21
+ <a href="<?php echo esc_attr( $social_page_url ); ?>" class="wds-settings-link">
22
+ <i class="wds-icon-arrow-right-carats"></i>
23
+ </a>
24
+ </div>
25
+ <?php endif; ?>
26
+ <h3>
27
+ <i class="wds-icon-social-twitter"></i> <?php esc_html_e( 'Social', 'wds' ); ?>
28
+ </h3>
29
+ </div>
30
+
31
+ <div class="box-content">
32
+ <p><?php esc_html_e( 'Control and optimize how your website appears when shared on social platforms like Facebook and Twitter.', 'wds' ); ?></p>
33
+
34
+ <?php if ( $social_enabled ) : ?>
35
+ <div class="wds-separator-top">
36
+ <span class="wds-small-text"><strong><?php esc_html_e( 'OpenGraph', 'wds' ); ?></strong></span>
37
+ <?php if ( ! $og_enabled ) : ?>
38
+ <p class="wds-small-text">
39
+ <?php esc_html_e( 'Add meta data to your pages to make them look great when shared platforms such as Facebook and other popular social networks.', 'wds' ); ?>
40
+ </p>
41
+ <button
42
+ type="button"
43
+ data-option-id="<?php echo esc_attr( $social_option_name ); ?>"
44
+ data-flag="<?php echo 'og-enable'; ?>"
45
+ class="wds-activate-component button button-small wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request">
46
+
47
+ <?php esc_html_e( 'Activate', 'wds' ); ?>
48
+ </button>
49
+ <?php else : ?>
50
+ <span class="wds-box-stat-value wds-box-stat-value-success"><?php esc_html_e( 'Active', 'wds' ); ?></span>
51
+ <?php endif; ?>
52
+ </div>
53
+
54
+ <div class="wds-separator-top">
55
+ <span class="wds-small-text"><strong><?php esc_html_e( 'Twitter Cards', 'wds' ); ?></strong></span>
56
+ <?php if ( ! $twitter_card_enabled ) : ?>
57
+ <p class="wds-small-text">
58
+ <?php esc_attr_e( 'With Twitter Cards, you can attach rich photos, videos and media experiences to Tweets, helping to drive traffic to your website.', 'wds' ); ?>
59
+ </p>
60
+ <button type="button"
61
+ data-option-id="<?php echo esc_attr( $social_option_name ); ?>"
62
+ data-flag="<?php echo 'twitter-card-enable'; ?>"
63
+ class="wds-activate-component button button-small wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request">
64
+
65
+ <?php esc_html_e( 'Activate', 'wds' ); ?>
66
+ </button>
67
+ <?php else : ?>
68
+ <span class="wds-box-stat-value wds-box-stat-value-success"><?php echo $twitter_card_status_text; ?></span>
69
+ <?php endif; ?>
70
+ </div>
71
+
72
+ <div class="wds-separator-top">
73
+ <span class="wds-small-text"><strong><?php esc_html_e( 'Pinterest Verification', 'wds' ); ?></strong></span>
74
+ <?php if ( ! $pinterest_tag || $pinterest_verification_status === 'fail' ) : ?>
75
+ <p class="wds-small-text">
76
+ <?php esc_html_e( 'Verify your website with Pinterest to attribute your website when your website content is pinned to the platform.', 'wds' ); ?>
77
+ </p>
78
+ <a href="<?php echo esc_attr( $social_page_url ); ?>#tab_pinterest_verification"
79
+ class="button button-small">
80
+
81
+ <?php esc_html_e( 'Connect', 'wds' ); ?>
82
+ </a>
83
+ <?php else : ?>
84
+ <span class="wds-box-stat-value wds-box-stat-value-success"><?php esc_html_e( 'Verification tag added' ); ?></span>
85
+ <?php endif; ?>
86
+ </div>
87
+
88
+ <div class="wds-box-footer">
89
+ <a href="<?php echo esc_attr( $social_page_url ); ?>"
90
+ class="button button-small button-dark button-dark-o wds-dash-configure-button">
91
+
92
+ <?php esc_html_e( 'Configure', 'wds' ); ?>
93
+ </a>
94
+ </div>
95
+ <?php else : ?>
96
+ <button type="button"
97
+ data-option-id="<?php echo esc_attr( $settings_option_name ); ?>"
98
+ data-flag="<?php echo esc_attr( 'social' ); ?>"
99
+ class="wds-activate-component button button-small wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request">
100
+
101
+ <?php esc_html_e( 'Activate', 'wds' ); ?>
102
+ </button>
103
+ <?php endif; ?>
104
+ </div>
105
+ </section>
includes/admin/templates/dashboard/dashboard.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Dashboard root template
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+ ?>
8
+ <div id="container" class="wrap wrap-wds wds-page wds-dashboard">
9
+ <section id="header">
10
+ <h1><?php esc_html_e( 'Dashboard', 'wds' ); ?></h1>
11
+ </section>
12
+
13
+ <div class="row">
14
+ <?php $this->_render( 'dashboard/dashboard-top' ); ?>
15
+ </div>
16
+
17
+ <div class="row">
18
+ <div class="col-half col-half-dashboard col-half-dashboard-left">
19
+ <?php
20
+ if ( smartcrawl_can_show_dash_widget_for( Smartcrawl_Settings_Settings::TAB_CHECKUP ) ) {
21
+ $this->_render( 'dashboard/dashboard-widget-seo-checkup' );
22
+ }
23
+ ?>
24
+ <?php $this->_render( 'dashboard/dashboard-widget-content-analysis' ); ?>
25
+ <?php
26
+ if ( smartcrawl_can_show_dash_widget_for( Smartcrawl_Settings_Settings::TAB_SOCIAL ) ) {
27
+ $this->_render( 'dashboard/dashboard-widget-social' );
28
+ }
29
+ ?>
30
+ </div>
31
+
32
+ <div class="col-half col-half-dashboard col-half-dashboard-right">
33
+ <?php
34
+ if ( smartcrawl_can_show_dash_widget_for( Smartcrawl_Settings_Settings::TAB_ONPAGE ) ) {
35
+ $this->_render( 'dashboard/dashboard-widget-onpage' );
36
+ }
37
+ ?>
38
+ <?php
39
+ if ( smartcrawl_can_show_dash_widget_for( Smartcrawl_Settings_Settings::TAB_SITEMAP ) ) {
40
+ $this->_render( 'dashboard/dashboard-widget-sitemap' );
41
+ }
42
+ ?>
43
+ <?php
44
+ if ( smartcrawl_can_show_dash_widget_for( Smartcrawl_Settings_Settings::TAB_AUTOLINKS ) ) {
45
+ $this->_render( 'dashboard/dashboard-widget-advanced-tools' );
46
+ }
47
+ ?>
48
+ </div>
49
+ </div>
50
+
51
+ <?php $this->_render( 'upsell-modal' ); ?>
52
+ </div>
53
+ <?php do_action( 'wds-dshboard-after_settings' ); ?>
includes/admin/templates/dashboard/onboard-progress.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <p><?php esc_html_e( 'Please wait a few moments while we activate those services', 'wds' ); ?></p>
2
+ <?php
3
+ $this->_render('progress-bar', array(
4
+ 'progress' => 0,
5
+ ));
6
+ ?>
7
+ <div class="processing-item-desc"></div>
includes/admin/templates/dashboard/onboarding.php ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <dialog class="auto-show wds-modal wds-onboard-dialog" id="wds-onboarding" data-title="<?php esc_attr_e( 'Quick setup', 'wds' ); ?>">
2
+ <div class="intro">
3
+ <p>
4
+ <?php esc_html_e( "Welcome to SmartCrawl, the hottest SEO plugin for WordPress! Let's quickly set up the basics for you, then you can fine tweak each setting as you go - our recommendations are on by default.", 'wds' ); ?>
5
+ </p>
6
+ </div>
7
+
8
+ <?php $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SITE ); ?>
9
+
10
+ <div class="wds-separator-top wds-onboarding-item">
11
+ <?php if ( $service->is_member() ) : ?>
12
+ <?php
13
+ $this->_render('toggle-item', array(
14
+ 'field_name' => 'checkup-enable',
15
+ 'item_label' => esc_html__( 'Automatic SEO Checkups & Reporting', 'wds' ),
16
+ 'item_description' => esc_html__( 'Schedule daily, weekly or monthly comprehensive checkups of your homepage SEO and have the results emailed to your inbox', 'wds' ),
17
+ 'attributes' => array(
18
+ 'data-processing' => esc_attr__( 'Activating Automatic SEO Checkups & Reporting', 'wds' ),
19
+ 'checked' => true,
20
+ ),
21
+ ));
22
+ ?>
23
+ <?php else : ?>
24
+ <?php
25
+ $this->_render('toggle-item', array(
26
+ 'field_name' => 'checkup-run',
27
+ 'item_label' => esc_html__( 'Run a full SEO Checkup', 'wds' ),
28
+ 'item_description' => esc_html__( 'Get a comprehensive checkup of your homepage and have the results emailed to your inbox.', 'wds' ),
29
+ 'attributes' => array(
30
+ 'data-processing' => esc_attr__( 'Running a full SEO Checkup', 'wds' ),
31
+ 'checked' => true,
32
+ ),
33
+ ));
34
+ ?>
35
+ <?php endif; ?>
36
+ </div>
37
+
38
+ <div class="wds-separator-top wds-onboarding-item">
39
+ <?php
40
+ $this->_render('toggle-item', array(
41
+ 'field_name' => 'analysis-enable',
42
+ 'item_label' => esc_html__( 'SEO & Readability Analysis', 'wds' ),
43
+ 'item_description' => esc_html__( 'Have your pages and posts analyzed for SEO and readability improvements to improve your search ranking', 'wds' ),
44
+ 'attributes' => array(
45
+ 'data-processing' => esc_attr__( 'Activating SEO & Readability Analysis', 'wds' ),
46
+ 'checked' => true,
47
+ ),
48
+ ));
49
+ ?>
50
+ </div>
51
+
52
+ <div class="wds-separator-top wds-onboarding-item">
53
+ <?php
54
+ $this->_render('toggle-item', array(
55
+ 'field_name' => 'opengraph-enable',
56
+ 'item_label' => esc_html__( 'OpenGraph', 'wds' ),
57
+ 'item_description' => esc_html__( 'OpenGraph support enhances how your content appears when shared on social networks such as Facebook', 'wds' ),
58
+ 'attributes' => array(
59
+ 'data-processing' => esc_attr__( 'Activating OpenGraph', 'wds' ),
60
+ 'checked' => true,
61
+ ),
62
+ ));
63
+ ?>
64
+ </div>
65
+
66
+ <div class="wds-separator-top wds-onboarding-item">
67
+ <?php
68
+ $this->_render('toggle-item', array(
69
+ 'field_name' => 'sitemaps-enable',
70
+ 'item_label' => esc_html__( 'Sitemaps', 'wds' ),
71
+ 'item_description' => esc_html__( 'Sitemaps expose your site content to search engines and allow them to discover it more easily.', 'wds' ),
72
+ 'attributes' => array(
73
+ 'data-processing' => esc_attr__( 'Activating Sitemaps', 'wds' ),
74
+ 'checked' => true,
75
+ ),
76
+ ));
77
+ ?>
78
+ </div>
79
+
80
+ <div class="wds-separator-top wds-onboarding-item">
81
+ <?php
82
+ $this->_render('toggle-item', array(
83
+ 'field_name' => 'twitter-enable',
84
+ 'item_label' => esc_html__( 'Twitter Cards', 'wds' ),
85
+ 'item_description' => esc_html__( 'With Twitter Cards, you can attach rich photos, videos and media experiences to Tweets, helping drive traffic to your site.', 'wds' ),
86
+ 'attributes' => array(
87
+ 'data-processing' => esc_attr__( 'Activating Twitter Cards', 'wds' ),
88
+ 'checked' => true,
89
+ ),
90
+ ));
91
+ ?>
92
+ </div>
93
+
94
+ <div class="wds-separator-top">
95
+ <div class="wds-notice wds-notice-info">
96
+ <p class="wds-small-text">
97
+ <?php esc_html_e( 'These services will be configured with recommended settings.', 'wds' ); ?>
98
+ <?php esc_html_e( 'You can change these at any time.', 'wds' ); ?>
99
+ </p>
100
+ </div>
101
+ </div>
102
+
103
+ <div class="action wds-box-footer">
104
+ <button class="button button-dark button-dark-o onboard-skip" type="button">
105
+ <?php esc_html_e( 'Skip', 'wds' ); ?>
106
+ </button>
107
+
108
+ <button type="button" class="button wds-onboarding-setup">
109
+ <?php esc_html_e( 'Get started', 'wds' ); ?>
110
+ </button>
111
+ </div>
112
+ </dialog>
includes/admin/templates/disabled-component-inner.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $content = empty( $content ) ? '' : $content;
3
+ $image = empty( $image ) ? '' : $image;
4
+ $component = empty( $component ) ? '' : $component;
5
+ $button_text = empty( $button_text ) ? '' : $button_text;
6
+ $is_member = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SITE )->is_member();
7
+ $premium_feature = empty( $premium_feature ) ? false : $premium_feature;
8
+ $notice = empty( $notice ) ? '' : $notice;
9
+ $button_url = empty( $button_url ) ? '' : $button_url;
10
+ ?>
11
+ <div class="wds-disabled-component">
12
+ <p>
13
+ <img src="<?php echo SMARTCRAWL_PLUGIN_URL; ?>/images/<?php echo esc_attr( $image ); ?>" alt="<?php esc_html_e( '', 'wds' ); ?>" class="wds-disabled-image"/>
14
+ </p>
15
+ <p><?php echo $content; ?></p>
16
+
17
+ <?php if ( $notice ) : ?>
18
+ <div class="wds-notice wds-notice-warning">
19
+ <p><?php echo esc_html( $notice ); ?></p>
20
+ </div>
21
+ <?php endif; ?>
22
+
23
+ <?php if ( $component ) : ?>
24
+ <input type="hidden" name="wds-activate-component" value="<?php echo esc_attr( $component ); ?>"/>
25
+ <?php endif; ?>
26
+
27
+ <?php if ( $premium_feature && ! $is_member ) : ?>
28
+ <button class="wds-upgrade-button button-green"><?php esc_html_e( 'Upgrade to Pro', 'wds' ); ?></button>
29
+ <?php else : ?>
30
+ <?php if ( $button_url ) : ?>
31
+ <a class="button" href="<?php echo $button_url; ?>"><?php esc_html_e( $button_text ); ?></a>
32
+ <?php else : ?>
33
+ <input name="submit" class="button" value="<?php esc_attr_e( $button_text ); ?>" type="submit"/>
34
+ <?php endif; ?>
35
+ <?php endif; ?>
36
+ </div>
includes/admin/templates/disabled-component.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $content = empty( $content ) ? '' : $content;
3
+ $image = empty( $image ) ? '' : $image;
4
+ $component = empty( $component ) ? '' : $component;
5
+ $button_text = empty( $button_text ) ? '' : $button_text;
6
+ ?>
7
+ <form method='post'>
8
+ <section class="dev-box">
9
+ <div class="box-title">
10
+ <h3><?php _e( 'Get Started', 'wds' ); ?></h3>
11
+ </div>
12
+ <div class="box-content">
13
+ <?php
14
+ $this->_render('disabled-component-inner', array(
15
+ 'content' => $content,
16
+ 'image' => $image,
17
+ 'component' => $component,
18
+ 'button_text' => $button_text,
19
+ ));
20
+ ?>
21
+ </div>
22
+ </section>
23
+ </form>
includes/admin/templates/dismissable-notice.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $message = empty( $message ) ? '' : $message;
3
+ $class = empty( $class ) ? 'wds-notice-warning' : $class;
4
+ $key = empty( $key ) ? '' : $key;
5
+
6
+ if ( ! $key ) {
7
+ return;
8
+ }
9
+
10
+ $dismissed_messages = get_user_meta( get_current_user_id(), 'wds_dismissed_messages', true );
11
+ $is_message_dismissed = smartcrawl_get_array_value( $dismissed_messages, $key ) === true;
12
+ ?>
13
+ <?php if ( ! $is_message_dismissed ) : ?>
14
+ <div class="wds-notice <?php echo esc_attr( $class ); ?>">
15
+ <p>
16
+ <?php echo wp_kses( $message, 'post' ); ?>
17
+ <a href="#" class="wds-notice-dismiss"><?php esc_html_e( 'Dismiss', 'wds' ) ?></a>
18
+ </p>
19
+ </div>
20
+ <?php endif; ?>
includes/admin/templates/index.php ADDED
File without changes
includes/admin/templates/links-dropdown.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $label = empty( $label ) ? '' : $label;
3
+ $links = empty( $links ) ? array() : $links;
4
+ ?>
5
+
6
+ <div class="wds-links-dropdown">
7
+ <a class="wds-links-dropdown-anchor" href="#">&hellip;</a>
8
+ <ul>
9
+ <?php if ( $label ) : ?>
10
+ <li class="wds-links-dropdown-label"><?php echo $label; ?></li>
11
+ <?php endif; ?>
12
+
13
+ <?php foreach ( $links as $href => $text ) : ?>
14
+ <li><a href="<?php echo esc_attr( $href ); ?>"><?php echo $text; ?></a></li>
15
+ <?php endforeach; ?>
16
+ </ul>
17
+ </div>
includes/admin/templates/mascot-message.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $key = empty( $key ) ? '' : $key;
3
+ $message = empty( $message ) ? '' : $message;
4
+ $dismissible = isset( $dismissible ) ? $dismissible : true;
5
+
6
+ if ( $key === '' || $message === '' ) {
7
+ return;
8
+ }
9
+
10
+ $dismissed_messages = get_user_meta( get_current_user_id(), 'wds_dismissed_messages', true );
11
+ $is_message_dismissed = smartcrawl_get_array_value( $dismissed_messages, $key ) === true;
12
+ ?>
13
+ <?php if ( ! $is_message_dismissed ) : ?>
14
+ <div class="wds-mascot-message <?php echo esc_attr( $key ); ?>">
15
+ <div class="wds-mascot"></div>
16
+ <div class="wds-mascot-bubble-container">
17
+ <div class="wds-mascot-bubble">
18
+ <?php if ( $dismissible ) : ?>
19
+ <span class="wds-mascot-bubble-dismiss"><i class="wds-icon-close"></i></span>
20
+ <?php endif; ?>
21
+ <p class="wds-small-text"><?php echo $message; ?></p>
22
+ </div>
23
+ </div>
24
+ </div>
25
+ <?php endif; ?>
includes/admin/templates/media-url-field.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $options = empty( $options ) ? $_view['options'] : $options;
3
+ $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name'];
4
+ $item = empty( $item ) ? '' : $item;
5
+ $value = isset( $options[ $item ] ) ? $options[ $item ] : '';
6
+ ?>
7
+ <div class="wds-media-url" data-name="<?php echo esc_attr( $item ); ?>">
8
+ <input class="wds-media-url-field" id="<?php echo esc_attr( $item ); ?>" type="text"
9
+ name="<?php echo esc_attr( $option_name ); ?>[<?php echo esc_attr( $item ); ?>]"
10
+ value="<?php echo esc_attr( $value ); ?>"/>
11
+ <button type="button" class="wds-media-url-button button button-dark-o">
12
+ <?php _e( 'Select', 'wds' ); ?>
13
+ </button>
14
+ </div>
includes/admin/templates/metabox.php ADDED
@@ -0,0 +1,294 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ $date = '';
4
+ if ( $post->post_type == 'post' ) {
5
+ if ( isset( $post->post_date ) ) {
6
+ $date = date( 'M j, Y', strtotime( $post->post_date ) ); } else { $date = date( 'M j, Y' ); }
7
+ }
8
+
9
+ ?>
10
+
11
+ <table class="widefat">
12
+
13
+ <?php
14
+
15
+ $title = smartcrawl_get_value( 'title' );
16
+ if ( empty( $title ) ) {
17
+ $title = $post->post_title; }
18
+ if ( empty( $title ) ) {
19
+ $title = __( 'temp title', 'wds' ); }
20
+
21
+ $desc = smartcrawl_get_value( 'metadesc' );
22
+ if ( empty( $desc ) ) {
23
+ $desc = substr( strip_tags( $post->post_content ), 0, 130 ); }
24
+ if ( empty( $desc ) ) {
25
+ $desc = __( 'temp description', 'wds' ); }
26
+
27
+ $slug = $post->post_name;
28
+ if ( empty( $slug ) ) {
29
+ $slug = sanitize_title( $title ); }
30
+
31
+ ?>
32
+
33
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-preview_area', true ) ) { ?>
34
+ <tr>
35
+ <th><label><?php esc_html_e( 'Preview:', 'wds' ); ?></label></th>
36
+ <td>
37
+ <?php
38
+ $video = smartcrawl_get_value( 'video_meta',$post->ID );
39
+ if ( $video && $video != 'none' ) {
40
+ ?>
41
+ <div id="snippet" class="video">
42
+ <h4 style="margin:0;font-weight:normal;"><a class="title" href="#"><?php echo esc_html( $title ); ?></a></h4>
43
+ <div style="margin:5px 10px 10px 0;width:82px;height:62px;float:left;">
44
+ <img style="border: 1px solid blue;padding: 1px;width:80px;height:60px;" src="<?php echo esc_url( $video['thumbnail_loc'] ); ?>"/>
45
+ <div style="margin-top:-23px;margin-right:4px;text-align:right"><img src="http://www.google.com/images/icons/sectionized_ui/play_c.gif" alt="" border="0" height="20" style="-moz-opacity:.88;filter:alpha(opacity=88);opacity:.88" width="20"></div>
46
+ </div>
47
+ <div style="float:left;width:440px;">
48
+ <p style="color:#767676;font-size:13px;line-height:15px;"><?php echo esc_html( number_format( $video['duration'] / 60 ) ); ?> <?php esc_html_e( 'mins', 'wds' ); ?> - <?php echo esc_html( $date ); ?></p>
49
+ <p style="color:#000;font-size:13px;line-height:15px;" class="desc"><span><?php echo esc_html( $desc ); ?></span></p>
50
+ <a href="#" class="url"><?php echo esc_html( str_replace( 'http://','',get_bloginfo( 'url' ) ) ); ?>/<?php echo esc_html( $slug ); ?>/</a> - <a href="#" class="util"><?php esc_html_e( 'More videos &raquo;', 'wds' ); ?></a>
51
+ </div>
52
+ </div>
53
+
54
+ <?php
55
+ } else {
56
+
57
+ if ( ! empty( $date ) ) {
58
+ $date .= ' ... ';
59
+ }
60
+
61
+ ?>
62
+ <div id="snippet">
63
+ <p><a style="color:#2200C1;font-weight:medium;font-size:16px;text-decoration:underline;" href="#"><?php echo esc_html( $title ); ?></a></p>
64
+ <p style="font-size: 12px; color: #000; line-height: 15px;"><?php echo esc_html( $date ); ?><span><?php echo esc_html( $desc ); ?></span></p>
65
+ <p>
66
+ <a href="#" style="font-size: 13px; color: #282; line-height: 15px;" class="url"><?php echo esc_html( str_replace( 'http://','',get_bloginfo( 'url' ) ) ); ?>/<?php echo esc_html( $slug ); ?>/</a> - <a href="#" class="util"><?php esc_html_e( 'Cached', 'wds' ); ?></a> - <a href="#" class="util"><?php esc_html_e( 'Similar', 'wds' ); ?></a>
67
+ <?php if ( is_multisite() && (is_admin() || is_network_admin()) && class_exists( 'domain_map' ) ) { ?>
68
+ <small style="opacity:.5"><i><?php esc_html_e( __( 'The URL preview may be thwarted by domain mapping', 'wds' ) ); ?></i></small>
69
+ <?php } ?>
70
+ </p>
71
+ </div>
72
+ <?php
73
+ }
74
+ ?>
75
+
76
+ </td>
77
+ </tr>
78
+ <?php } ?>
79
+
80
+ <?php
81
+ $title_placeholder = smartcrawl_get_seo_title();
82
+ if ( ! $title_placeholder ) { $title_placeholder = ''; }
83
+
84
+ $desc_placeholder = smartcrawl_get_seo_desc();
85
+ if ( ! $desc_placeholder ) { $desc_placeholder = ''; }
86
+ ?>
87
+
88
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-focus_area', true ) ) { ?>
89
+ <tr>
90
+ <th valign='top'><label for='wds_focus'><?php esc_html_e( 'Focus keywords' , 'wds' ); ?></label></th>
91
+ <td valign='top'>
92
+ <input type='text' class='widefat' id='wds_focus' name='wds_focus' value='<?php echo esc_html( smartcrawl_get_value( 'focus-keywords' ) ); ?>' class='wds' /><br />
93
+ </td>
94
+ </tr>
95
+ <?php } ?>
96
+
97
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-title_area', true ) ) { ?>
98
+ <tr>
99
+ <th valign='top'><label for='wds_title'><?php esc_html_e( 'Title Tag' , 'wds' ); ?></label></th>
100
+ <td valign='top'>
101
+ <input type='text' class='widefat' id='wds_title' placeholder='<?php echo esc_html( $title_placeholder ); ?>' name='wds_title' value='<?php echo esc_html( smartcrawl_get_value( 'title' ) ); ?>' class='wds' />
102
+ <p>
103
+ <?php printf( esc_html( __( 'Up to %d characters recommended' , 'wds' ) ), SMARTCRAWL_TITLE_LENGTH_CHAR_COUNT_LIMIT ); ?>
104
+ </p>
105
+ </td>
106
+ </tr>
107
+ <?php } ?>
108
+
109
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-description_area', true ) ) { ?>
110
+ <tr>
111
+ <th valign='top'><label for='wds_metadesc'><?php esc_html_e( 'Meta Description' , 'wds' ); ?></label></th>
112
+ <td valign='top'>
113
+ <textarea rows='2' class='widefat' name='wds_metadesc' placeholder='<?php echo esc_html( $desc_placeholder ); ?>' id='wds_metadesc' class='wds'><?php echo esc_html( smartcrawl_get_value( 'metadesc' ) ); ?></textarea>
114
+ <p>
115
+ <?php printf( esc_html( __( '%d characters maximum' , 'wds' ) ), SMARTCRAWL_METADESC_LENGTH_CHAR_COUNT_LIMIT ); ?>
116
+ </p>
117
+ </td>
118
+ </tr>
119
+ <?php } ?>
120
+
121
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-keywords_area', true ) ) { ?>
122
+ <tr>
123
+ <th valign='top'><label for='wds_keywords'><?php esc_html_e( 'Meta keywords' , 'wds' ); ?></label></th>
124
+ <td valign='top'>
125
+ <input type='text' class='widefat' id='wds_keywords' name='wds_keywords' value='<?php echo esc_html( smartcrawl_get_value( 'keywords' ) ); ?>' class='wds' /><br />
126
+ <label for="wds_tags_to_keywords"><?php esc_html_e( 'I want to use post tags in addition to my keywords', 'wds' ); ?></label>
127
+ <input type='checkbox' name='wds_tags_to_keywords' id='wds_tags_to_keywords' value='1' <?php echo esc_attr( smartcrawl_get_value( 'tags_to_keywords' ) ) ? 'checked="checked"' : ''; ?> />
128
+ <div>
129
+ <b><?php esc_html_e( 'News Keywords', 'wds' ); ?></b> <a href="http://support.google.com/news/publisher/bin/answer.py?hl=en&answer=68297" target="_blank">(?)</a>
130
+ </div>
131
+ <input type='text' class='widefat' id='wds_news_keywords' name='wds_news_keywords' value='<?php echo esc_attr( smartcrawl_get_value( 'news_keywords' ) ); ?>' class='wds' />
132
+ <p>
133
+ <?php esc_html_e( 'Separate keywords with commas' , 'wds' ); ?><br />
134
+ <?php esc_html_e( 'If you enable using tags, post tags will be merged in with any other keywords you enter in the text box.', 'wds' ); ?>
135
+ </p>
136
+ </td>
137
+ </tr>
138
+ <?php } ?>
139
+
140
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-robots_area', true ) ) { ?>
141
+ <tr>
142
+ <th valign='top'><label for='wds_robots_follow'><?php esc_html_e( 'Meta Robots' , 'wds' ); ?></label></th>
143
+ <td>
144
+ <table class='wds_subtable' broder='0'>
145
+ <tr>
146
+ <th valign='top'><label for='wds_robots_follow'><?php esc_html_e( 'Index' , 'wds' ); ?></label></th>
147
+ <td valign='top'>
148
+ <input type="radio" name="wds_meta-robots-noindex" id="wds_meta-robots-noindex-index" <?php echo ( ! $ri_value ? 'checked="checked"' : ''); ?> value="0" />
149
+ <label for="wds_meta-robots-noindex-index"><?php esc_html_e( 'Index' , 'wds' ); ?></label><br />
150
+ <input type="radio" name="wds_meta-robots-noindex" id="wds_meta-robots-noindex-noindex" <?php echo ($ri_value ? 'checked="checked"' : ''); ?> value="1" />
151
+ <label for="wds_meta-robots-noindex-noindex"><?php esc_html_e( 'Noindex' , 'wds' ); ?></label>
152
+ </td>
153
+ </tr>
154
+ <tr>
155
+ <th valign='top'><label for='wds_robots_follow'><?php esc_html_e( 'Follow' , 'wds' ); ?></label></th>
156
+ <td valign='top'>
157
+ <input type="radio" name="wds_meta-robots-nofollow" id="wds_meta-robots-nofollow-follow" <?php echo ( ! $rf_value ? 'checked="checked"' : ''); ?> value="0" />
158
+ <label for="wds_meta-robots-nofollow-follow"><?php esc_html_e( 'Follow' , 'wds' ); ?></label><br />
159
+ <input type="radio" name="wds_meta-robots-nofollow" id="wds_meta-robots-nofollow-nofollow" <?php echo ($rf_value ? 'checked="checked"' : ''); ?> value="1" />
160
+ <label for="wds_meta-robots-nofollow-nofollow"><?php esc_html_e( 'Nofollow' , 'wds' ); ?></label>
161
+ </td>
162
+ </tr>
163
+ <tr>
164
+ <th valign='top'><label for='wds_meta-robots-adv'><?php esc_html_e( 'Advanced' , 'wds' ); ?></label></th>
165
+ <td valign='top'>
166
+ <?php
167
+
168
+ foreach ( $advanced as $rkey => $rlbl ) {
169
+ $checked = in_array( $rkey, $adv_value ) ? 'checked="checked"' : '';
170
+ ?>
171
+ <input type='hidden' name='wds_meta-robots-adv[<?php echo esc_attr( $rkey ); ?>]' value='' />
172
+ <input type='checkbox' name='wds_meta-robots-adv[<?php echo esc_attr( $rkey ); ?>]' value='<?php echo esc_attr( $rkey ); ?>' id='wds_meta-robots-adv-<?php echo esc_attr( $rkey ); ?>' <?php echo $checked; ?> />&nbsp;
173
+ <label for="wds_meta-robots-adv-<?php echo esc_attr( $rkey ); ?>"><?php echo esc_html( $rlbl ); ?></label><br />
174
+ <?php
175
+ }
176
+
177
+ ?>
178
+ </td>
179
+ </tr>
180
+ </table>
181
+ <p>
182
+ <?php _e( '<code>meta</code> robots settings for this page.', 'wds' ); ?>
183
+ </p>
184
+ </td>
185
+ </tr>
186
+ <?php } ?>
187
+
188
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-canonical_area', true ) ) { ?>
189
+ <tr>
190
+ <th valign='top'><label for='wds_canonical'><?php esc_html_e( 'Canonical URL' , 'wds' ); ?></label></th>
191
+ <td valign='top'>
192
+ <input type='text' id='wds_canonical' name='wds_canonical' value='<?php echo esc_attr( smartcrawl_get_value( 'canonical' ) ); ?>' class='wds' />
193
+ </td>
194
+ </tr>
195
+ <?php } ?>
196
+
197
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-redirect_area', true ) ) { ?>
198
+ <?php
199
+
200
+ if ( user_can_see_seo_metabox_301_redirect() ) {
201
+ ?>
202
+
203
+ <tr>
204
+ <th valign='top'><label for='wds_redirect'><?php esc_html_e( '301 Redirect' , 'wds' ); ?></label></th>
205
+ <td valign='top'>
206
+ <input type='text' id='wds_redirect' name='wds_redirect' value='<?php echo esc_attr( smartcrawl_get_value( 'redirect' ) ); ?>' class='wds' />
207
+ </td>
208
+ </tr>
209
+
210
+ <?php
211
+ }
212
+
213
+ ?>
214
+ <?php } ?>
215
+
216
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-sitemap_priority_area', true ) ) { ?>
217
+ <tr>
218
+ <th valign='top'><label for='wds_sitemap-priority'><?php esc_html_e( 'Sitemap Priority' , 'wds' ); ?></label></th>
219
+ <td valign='top'>
220
+ <select name='wds_sitemap-priority' id='wds_sitemap-priority'>
221
+
222
+ <?php
223
+ $value = smartcrawl_get_value( 'sitemap-priority' );
224
+
225
+ foreach ( $options as $key => $label ) {
226
+ ?>
227
+
228
+ <option value='<?php echo esc_attr( $key ); ?>' <?php echo (($key == $value) ? 'selected="selected"' : ''); ?>><?php echo esc_html( $label ); ?></option>
229
+
230
+ <?php
231
+
232
+ }
233
+ ?>
234
+
235
+ </select>
236
+ <p>
237
+ <?php esc_html_e( 'The priority given to this page in the XML sitemap.', 'wds' ); ?>
238
+ </p>
239
+ </td>
240
+ </tr>
241
+ <?php } ?>
242
+
243
+ <?php
244
+ $og = smartcrawl_get_value( 'opengraph' );
245
+ if ( ! is_array( $og ) ) { $og = array(); }
246
+
247
+ $og = wp_parse_args($og, array(
248
+ 'title' => false,
249
+ 'description' => false,
250
+ 'images' => false,
251
+ ));
252
+ ?>
253
+ <tr>
254
+ <th>
255
+ <label for="og-title"><?php esc_html_e( 'OpenGraph Title', 'wds' ); ?></label>
256
+ </th>
257
+ <td>
258
+ <input type="text" class="widefat"
259
+ id="og-title" name="wds-opengraph[title]"
260
+ value="<?php echo esc_attr( $og['title'] ); ?>" />
261
+ </td>
262
+ </tr>
263
+ <tr>
264
+ <th>
265
+ <label for="og-description"><?php esc_html_e( 'OpenGraph Description', 'wds' ); ?></label>
266
+ </th>
267
+ <td>
268
+ <textarea class="widefat" name="wds-opengraph[description]"
269
+ id="og-description"><?php echo esc_textarea( $og['description'] ); ?></textarea>
270
+ </td>
271
+ </tr>
272
+ <tr>
273
+ <th>
274
+ <label for="og-images"><?php esc_html_e( 'OpenGraph Images', 'wds' ); ?></label>
275
+ </th>
276
+ <td
277
+ class="fields og-images"
278
+ data-name='wds-opengraph[og-images]'
279
+ >
280
+ <div class="add-action-wrapper item">
281
+ <a href="#add" title="<?php esc_attr_e( 'Add image', 'wds' ); ?>">+</a>
282
+ </div>
283
+ <?php if ( ! empty( $og['images'] ) && is_array( $og['images'] ) ) { foreach ( $og['images'] as $img ) { ?>
284
+ <input type="text" class="widefat"
285
+ name="wds-opengraph[images][]"
286
+ value="<?php echo esc_attr( $img ); ?>" />
287
+ <?php }
288
+ } ?>
289
+ </td>
290
+ </tr>
291
+
292
+ </table>
293
+
294
+ <?php do_action( 'wds-editor-metabox-after', $post ); ?>
includes/admin/templates/metabox/analysis-readability.php ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( ! Smartcrawl_Settings::get_setting( 'analysis-seo' ) ) { return false; }
3
+
4
+ /**
5
+ * @var $model \Smartcrawl_Model_Analysis
6
+ */
7
+ $model = empty( $model ) ? null : $model;
8
+ $readability_data = empty( $readability_data ) ? array() : $readability_data;
9
+ $readability_ignored = empty( $readability_ignored ) ? false : $readability_ignored;
10
+ $readability_score = smartcrawl_get_array_value( $readability_data, 'score' );
11
+
12
+ if ( $model === null || $readability_score === null ) {
13
+ return;
14
+ }
15
+
16
+ $readability_score = intval( ceil( $readability_score ) );
17
+ $readability_level = $model->get_readability_level();
18
+ $readability_levels_map = $model->get_readability_levels_map();
19
+ $readability_strategy = Smartcrawl_String::get_readability_strategy();
20
+
21
+ if ( $readability_ignored ) {
22
+ $classes_array[] = 'disabled';
23
+ }
24
+
25
+ $total_possible_score = $readability_strategy == Smartcrawl_String::READABILITY_KINCAID ? '100' : '';
26
+ $readability_level_description = $model->get_readability_level_description( $readability_level );
27
+ $readability_state = $model->get_kincaid_readability_state( $readability_score, $readability_ignored );
28
+ $classes_array[] = sprintf(
29
+ 'wds-check-%s',
30
+ $readability_state
31
+ );
32
+ $score_class = sprintf(
33
+ 'wds-score-%s',
34
+ $readability_state
35
+ );
36
+ $classes = implode( ' ', $classes_array );
37
+ ?>
38
+
39
+ <div class="wds-readability-report wds-report"
40
+ data-readability-state="<?php echo esc_attr( $readability_state ); ?>">
41
+
42
+ <div class="wds-readability-stats wds-report-stats">
43
+ <div class="wds-report-score">
44
+ <span class="wds-score <?php echo esc_attr( $score_class ); ?>">
45
+ <?php echo esc_html( $readability_score ); ?><?php if ( $total_possible_score ) : ?><span class="wds-total">/<?php echo esc_html( $total_possible_score ); ?></span><?php endif; ?>
46
+ </span>
47
+ <span class="wds-small-text"><?php esc_html_e( 'Readability score', 'wds' ); ?></span>
48
+ </div>
49
+
50
+ <div class="wds-readability-level-description wds-small-text">
51
+ <?php echo wp_kses( $readability_level_description, array( 'strong' => array() ) ); ?>
52
+
53
+ <br />
54
+ <button class="button button-small button-dark button-dark-o wds-refresh-analysis wds-analysis-readability" <?php if ('auto-draft' === get_post_status()) { echo 'disabled'; } ?> type="button">
55
+ <span><?php esc_html_e( 'Refresh', 'wds' ); ?></span>
56
+ </button>
57
+ </div>
58
+ </div>
59
+
60
+ <div class="wds-accordion">
61
+ <div class="wds-check-item wds-accordion-section <?php echo esc_attr( $classes ); ?>">
62
+ <div class="wds-accordion-handle">
63
+ <div class="wds-accordion-handle-part">
64
+ <?php esc_html_e( 'Flesch-Kincaid Test', 'wds' ); ?>
65
+ </div>
66
+
67
+ <?php if ( $readability_ignored ) : ?>
68
+ <div class="wds-unignore-container wds-accordion-handle-part">
69
+ <button type="button" class="wds-unignore wds-button-with-loader wds-button-with-left-loader wds-disabled-during-request button button-small button-dark-o" data-check_id="readability">
70
+ <?php esc_html_e( 'Restore', 'wds' ); ?>
71
+ </button>
72
+ </div>
73
+ <?php else : ?>
74
+ <div class="wds-readability-level wds-accordion-handle-part">
75
+ <span class="wds-check-item-indicator"><?php echo esc_html( $readability_level ); ?></span>
76
+ </div>
77
+ <?php endif; ?>
78
+ </div>
79
+ <div class="wds-accordion-content">
80
+ <div class="wds-small-text"><strong><?php esc_html_e( 'Overview', 'wds' ) ?></strong></div>
81
+ <p class="wds-small-text"><?php esc_html_e( 'The Flesch-Kincaid readability tests are readability tests designed to indicate how difficult a passage in English is to understand. Here are the benchmarks.', 'wds' ); ?></p>
82
+ <table class="wds-list-table">
83
+ <tbody>
84
+ <tr>
85
+ <th><?php esc_html_e( 'Score', 'wds' ); ?></th>
86
+ <th><?php esc_html_e( 'Description', 'wds' ); ?></th>
87
+ </tr>
88
+
89
+ <?php foreach ( $readability_levels_map as $label => $level ) : ?>
90
+ <tr>
91
+ <?php
92
+ if ( ! is_array( $level ) || ! isset( $level['max'] ) || ! isset( $level['min'] ) ) {
93
+ continue;
94
+ }
95
+ ?>
96
+ <td><?php echo esc_html( (int) ceil( $level['min'] ) ); ?>
97
+ - <?php echo esc_html( (int) ceil( $level['max'] ) ); ?></td>
98
+ <td><?php echo esc_html( $label ); ?></td>
99
+ </tr>
100
+ <?php endforeach; ?>
101
+ </tbody>
102
+ </table>
103
+
104
+ <div class="wds-small-text"><strong><?php esc_html_e( 'How to fix', 'wds' ) ?></strong></div>
105
+ <p class="wds-small-text"><?php esc_html_e( 'Try to use shorter sentences, with less difficult words to improve readability.', 'wds' ); ?></p>
106
+
107
+ <div class="wds-ignore-container">
108
+ <button type="button" class="wds-ignore wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request button button-small button-dark button-dark-o" data-check_id="readability">
109
+ <?php esc_html_e( 'Ignore', 'wds' ); ?>
110
+ </button>
111
+ </div>
112
+ </div>
113
+ </div>
114
+ </div>
115
+ </div>
includes/admin/templates/metabox/analysis-seo_analysis.php ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ if ( ! Smartcrawl_Settings::get_setting( 'analysis-seo' ) ) { return false; }
3
+
4
+ $checks = empty( $checks ) ? array() : $checks;
5
+ $error_count = empty( $error_count ) ? 0 : $error_count;
6
+ $focus_keywords_available = empty( $focus_keywords_available ) ? false : $focus_keywords_available;
7
+ ?>
8
+
9
+ <?php if ( ! $focus_keywords_available ) : ?>
10
+ <div class="wds-seo-analysis wds-no-focus-keywords">
11
+ <div class="wds-notice wds-notice-warning">
12
+ <p><?php esc_html_e( 'You need to add focus keywords to see recommendations for this article.', 'wds' ); ?></p>
13
+ </div>
14
+ </div>
15
+ <?php return; ?>
16
+ <?php endif; ?>
17
+
18
+ <div class="wds-seo-analysis wds-report" data-errors="<?php echo esc_attr( $error_count ); ?>">
19
+
20
+ <div class="wds-notice <?php echo $error_count > 0 ? 'wds-notice-warning' : 'wds-notice-success'; ?>">
21
+ <p>
22
+ <?php if ( $error_count > 0 ) : ?>
23
+ <?php esc_html_e( sprintf( 'You have %d SEO recommendations. We recommend you satisfy as many improvements as possible to ensure your content gets found.', $error_count ), 'wds' ); ?>
24
+ <?php else : ?>
25
+ <?php esc_html_e( 'You have optimized your SEO to the max. Bravo!', 'wds' ); ?>
26
+ <?php endif; ?>
27
+ </p>
28
+ </div>
29
+ <div class="wds-accordion">
30
+ <?php foreach ( $checks as $check_id => $result ) : ?>
31
+ <?php
32
+ /**
33
+ * @var $current_check Smartcrawl_Check_Abstract
34
+ */
35
+ $current_check = $result['check'];
36
+ $passed = $result['status'];
37
+ $ignored = $result['ignored'];
38
+ $recommendation = $current_check->get_recommendation();
39
+ $more_info = $current_check->get_more_info();
40
+
41
+ $classes_array = array();
42
+ $classes_array[] = $passed ? 'wds-check-success' : 'wds-check-warning';
43
+ $classes_array[] = $ignored ? 'wds-check-invalid disabled' : '';
44
+ $classes = implode( ' ', $classes_array );
45
+ ?>
46
+ <div class="wds-check-item wds-accordion-section <?php echo esc_attr( $classes ); ?>">
47
+ <div class="wds-accordion-handle">
48
+ <div class="wds-accordion-handle-part">
49
+ <?php echo wp_kses( $current_check->get_status_msg(), 'post' ); ?>
50
+ </div>
51
+ <?php if ( $ignored ) : ?>
52
+ <div class="wds-unignore-container wds-accordion-handle-part">
53
+ <button type="button" class="wds-unignore wds-button-with-loader wds-button-with-left-loader wds-disabled-during-request button button-small button-dark-o" data-check_id="<?php echo esc_attr( $check_id ); ?>">
54
+ <?php esc_html_e( 'Restore', 'wds' ); ?>
55
+ </button>
56
+ </div>
57
+ <?php endif; ?>
58
+ </div>
59
+ <div class="wds-accordion-content">
60
+ <?php if ( $recommendation ) : ?>
61
+ <div class="wds-recommendation">
62
+ <div class="wds-small-text"><strong><?php esc_html_e( 'Recommendation', 'wds' ); ?></strong></div>
63
+ <p class="wds-small-text"><?php echo wp_kses( $recommendation, 'post' ); ?></p>
64
+ </div>
65
+ <?php endif; ?>
66
+
67
+ <?php if ( $more_info ) : ?>
68
+ <div class="wds-more-info">
69
+ <div class="wds-small-text"><strong><?php esc_html_e( 'More Info', 'wds' ); ?></strong></div>
70
+ <p class="wds-small-text"><?php echo wp_kses( $more_info, 'post' ); ?></p>
71
+ </div>
72
+ <?php endif; ?>
73
+
74
+ <?php if ( ! $ignored ) : ?>
75
+ <div class="wds-ignore-container">
76
+ <button type="button" class="wds-ignore wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request button button-small button-dark-o" data-check_id="<?php echo esc_attr( $check_id ); ?>">
77
+ <?php esc_html_e( 'Ignore', 'wds' ); ?>
78
+ </button>
79
+ </div>
80
+ <?php endif; ?>
81
+ </div>
82
+ </div>
83
+ <?php endforeach; ?>
84
+ <div class="cf"></div>
85
+ </div>
86
+ </div>
includes/admin/templates/metabox/analysis.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <div class="wds-report">
2
+ <p><a href="#reload"><?php esc_html_e( 'Reload', 'wds' ); ?></a></p>
3
+ <?php include SMARTCRAWL_PLUGIN_DIR . 'admin/templates/metabox/analysis-seo_analysis.php'; ?>
4
+ <?php include SMARTCRAWL_PLUGIN_DIR . 'admin/templates/metabox/analysis-readability.php'; ?>
5
+ </div>
includes/admin/templates/metabox/horizontal-tab-nav.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $tabs = empty( $tabs ) ? array() : $tabs;
3
+ $first_tab = true;
4
+ ?>
5
+ <div class="wds-horizontal-tab-nav">
6
+ <?php foreach ( $tabs as $tab_id => $tab_name ) : ?>
7
+
8
+ <div class="wds-nav-item <?php echo $first_tab ? 'active' : ''; ?>">
9
+ <label for="<?php echo esc_attr( $tab_id ); ?>">
10
+ <?php echo wp_kses( $tab_name, 'post' ); ?>
11
+ </label>
12
+ </div>
13
+
14
+ <?php $first_tab = false; ?>
15
+ <?php endforeach; ?>
16
+ </div>
includes/admin/templates/metabox/horizontal-tab.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <section class="wds-horizontal-tab">
2
+ <?php
3
+ $tab_id = empty( $tab_id ) ? '' : $tab_id;
4
+ $is_active = empty( $is_active ) ? false : $is_active;
5
+ $content_template = empty( $content_template ) ? '' : $content_template;
6
+ $content_args = empty( $content_args ) ? array() : $content_args;
7
+ ?>
8
+ <input
9
+ type="radio"
10
+ name="wds-horizontal-tab"
11
+ autocomplete="off"
12
+ id="<?php echo esc_attr( $tab_id ); ?>"
13
+ value="<?php echo esc_attr( $tab_id ); ?>"
14
+ <?php checked( $is_active ); ?> />
15
+
16
+ <div class="wds-horizontal-tab-content <?php echo esc_attr( $tab_id ); ?>">
17
+ <?php $this->_render( $content_template, $content_args ); ?>
18
+ </div>
19
+ </section>
includes/admin/templates/metabox/metabox-main.php ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Metabox entry point template
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ $post = empty( $post ) ? null : $post;
9
+ $robots_noindex_value = empty( $robots_noindex_value ) ? false : $robots_noindex_value;
10
+ $robots_nofollow_value = empty( $robots_nofollow_value ) ? false : $robots_nofollow_value;
11
+ $advanced_value = empty( $advanced_value ) ? array() : $advanced_value;
12
+ $advanced_options = empty( $advanced_options ) ? array() : $advanced_options;
13
+ $sitemap_priority_options = empty( $sitemap_priority_options ) ? array() : $sitemap_priority_options;
14
+ $all_options = Smartcrawl_Settings::get_options();
15
+ $og_setting_enabled = (bool) smartcrawl_get_array_value( $all_options, 'og-enable' );
16
+ $og_post_type_enabled = (bool) smartcrawl_get_array_value( $all_options, 'og-active-' . get_post_type( $post ) );
17
+ $twitter_post_type_enabled = (bool) smartcrawl_get_array_value( $all_options, 'twitter-active-' . get_post_type( $post ) );
18
+ $twitter_setting_enabled = (bool) smartcrawl_get_array_value( $all_options, 'twitter-card-enable' );
19
+ $show_social_tab = ($og_setting_enabled && $og_post_type_enabled) || ($twitter_setting_enabled && $twitter_post_type_enabled);
20
+
21
+ $tabs['wds_seo'] = esc_html__( 'SEO', 'wds' ) . '<span class="wds-issues"><span></span></span>';
22
+ $tabs['wds_readability'] = esc_html__( 'Readability', 'wds' ) . '<span class="wds-issues"><span></span></span>';
23
+ if ( $show_social_tab ) {
24
+ $tabs['wds_social'] = esc_html__( 'Social', 'wds' );
25
+ }
26
+ $tabs['wds_advanced'] = esc_html__( 'Advanced', 'wds' );
27
+
28
+ if ( ! Smartcrawl_Settings::get_setting( 'analysis-readability' ) ) { unset( $tabs['wds_readability'] ); }
29
+ ?>
30
+ <div class="wpmud wds-metabox">
31
+ <div id="container" class="wds-horizontal-tabs">
32
+ <?php
33
+ $this->_render( 'metabox/horizontal-tab-nav', array( 'tabs' => $tabs ) );
34
+ ?>
35
+ <?php
36
+ $this->_render('metabox/horizontal-tab', array(
37
+ 'tab_id' => 'wds_seo',
38
+ 'is_active' => true,
39
+ 'content_template' => 'metabox/metabox-tab-seo',
40
+ 'content_args' => array(
41
+ 'post' => $post,
42
+ ),
43
+ ));
44
+ ?>
45
+
46
+ <?php
47
+ if ( Smartcrawl_Settings::get_setting( 'analysis-readability' ) ) {
48
+ $this->_render('metabox/horizontal-tab', array(
49
+ 'tab_id' => 'wds_readability',
50
+ 'content_template' => 'metabox/metabox-tab-readability',
51
+ 'content_args' => array(
52
+ 'post' => $post,
53
+ ),
54
+ ));
55
+ }
56
+ ?>
57
+
58
+ <?php
59
+ if ( $show_social_tab ) {
60
+ $this->_render('metabox/horizontal-tab', array(
61
+ 'tab_id' => 'wds_social',
62
+ 'content_template' => 'metabox/metabox-tab-social',
63
+ 'content_args' => array(
64
+ 'post' => $post,
65
+ 'og_setting_enabled' => $og_setting_enabled,
66
+ 'og_post_type_enabled' => $og_post_type_enabled,
67
+ 'twitter_setting_enabled' => $twitter_setting_enabled,
68
+ 'twitter_post_type_enabled' => $twitter_post_type_enabled
69
+ ),
70
+ ));
71
+ }
72
+ ?>
73
+
74
+ <?php
75
+ $this->_render('metabox/horizontal-tab', array(
76
+ 'tab_id' => 'wds_advanced',
77
+ 'content_template' => 'metabox/metabox-tab-advanced',
78
+ 'content_args' => array(
79
+ 'robots_noindex_value' => $robots_noindex_value,
80
+ 'robots_nofollow_value' => $robots_nofollow_value,
81
+ 'advanced_value' => $advanced_value,
82
+ 'advanced_options' => $advanced_options,
83
+ 'sitemap_priority_options' => $sitemap_priority_options,
84
+ ),
85
+ ));
86
+ ?>
87
+ </div>
88
+ </div>
includes/admin/templates/metabox/metabox-meta-edit-form.php ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="wds-toggleable inactive wds-edit-meta-toggleable">
2
+ <label>
3
+ <a class="button button-dark button-small"><?php esc_html_e( 'Edit Meta', 'wds' ); ?></a>
4
+ <input type="checkbox" class="toggle-checkbox"/>
5
+ </label>
6
+
7
+ <div class="wds-toggleable-inside wds-toggleable-inside-box">
8
+ <div class="wds-table-fields wds-table-fields-stacked">
9
+ <?php
10
+ $title_placeholder = smartcrawl_get_seo_title();
11
+ if ( ! $title_placeholder ) { $title_placeholder = ''; }
12
+
13
+ $desc_placeholder = smartcrawl_get_seo_desc();
14
+ if ( ! $desc_placeholder ) { $desc_placeholder = ''; }
15
+ ?>
16
+
17
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-title_area', true ) ) : ?>
18
+ <div class="label">
19
+ <label class="wds-label" for="wds_title">
20
+ <?php esc_html_e( 'SEO Title', 'wds' ); ?>
21
+ <span><?php echo esc_html( sprintf( __( '- Include your focus keywords. 50-%d characters recommended.', 'wds' ), SMARTCRAWL_TITLE_LENGTH_CHAR_COUNT_LIMIT ) ); ?></span>
22
+ </label>
23
+ </div>
24
+ <div class="fields">
25
+ <input type='text'
26
+ id='wds_title'
27
+ placeholder='<?php echo esc_html( $title_placeholder ); ?>'
28
+ name='wds_title'
29
+ value='<?php echo esc_html( smartcrawl_get_value( 'title' ) ); ?>'
30
+ class='wds wds-meta-field'/>
31
+ </div>
32
+ <?php endif; ?>
33
+
34
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-description_area', true ) ) : ?>
35
+ <div class="label">
36
+ <label class="wds-label" for="wds_metadesc">
37
+ <?php esc_html_e( 'Description', 'wds' ); ?>
38
+ <span><?php echo esc_html( sprintf( __( '- Recommended minimum of 135 characters, maximum %d.', 'wds' ), SMARTCRAWL_METADESC_LENGTH_CHAR_COUNT_LIMIT ) ); ?></span>
39
+ </label>
40
+ </div>
41
+ <div class="fields">
42
+ <textarea rows='2'
43
+ name='wds_metadesc'
44
+ placeholder='<?php echo esc_html( $desc_placeholder ); ?>'
45
+ id='wds_metadesc'
46
+ class='wds wds-meta-field'><?php echo esc_html( smartcrawl_get_value( 'metadesc' ) ); ?></textarea>
47
+ </div>
48
+ <?php endif; ?>
49
+
50
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-keywords_area', true ) ) : ?>
51
+ <div class="label">
52
+ <label class="wds-label" for="wds_keywords">
53
+ <?php esc_html_e( 'Keywords', 'wds' ); ?>
54
+ <span><?php esc_html_e( '- Try to avoid stop words like ‘and’ and ‘the’ which search engines ignore.', 'wds' ); ?></span>
55
+ </label>
56
+ </div>
57
+ <div class="fields">
58
+ <input type='text'
59
+ id='wds_keywords'
60
+ name='wds_keywords'
61
+ value='<?php echo esc_html( smartcrawl_get_value( 'keywords' ) ); ?>'
62
+ class='wds'/>
63
+ </div>
64
+
65
+ <div class="wds-extra-keyword-options">
66
+ <div class="label">
67
+ <label class="wds-label" for="wds_news_keywords">
68
+ <?php esc_html_e( 'News Keywords', 'wds' ); ?>
69
+ <span><?php esc_html_e( '- Try to avoid stop words like ‘and’ and ‘the’ which search engines ignore.', 'wds' ); ?></span>
70
+ </label>
71
+ </div>
72
+ <div class="fields">
73
+ <input type='text'
74
+ id='wds_news_keywords'
75
+ name='wds_news_keywords'
76
+ value='<?php echo esc_attr( smartcrawl_get_value( 'news_keywords' ) ); ?>'
77
+ class='wds' />
78
+ </div>
79
+
80
+ <div class="wds-tags-as-keyword">
81
+ <?php
82
+ $this->_render('toggle-item', array(
83
+ 'field_name' => 'wds_tags_to_keywords',
84
+ 'checked' => smartcrawl_get_value( 'tags_to_keywords' ) ? 'checked="checked"' : '',
85
+ 'item_label' => esc_html__( 'Tags As Keywords' ),
86
+ 'item_description' => esc_html__( 'If you enable using tags, post tags will be merged in with any other keywords you enter in the text box.' ),
87
+ ));
88
+ ?>
89
+ </div>
90
+ </div>
91
+ <?php endif; ?>
92
+ </div>
93
+ </div>
94
+ </div>
includes/admin/templates/metabox/metabox-preview.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Metabox preview template
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ $post = empty( $post ) ? null : $post;
9
+
10
+ // Date.
11
+ $date = $post ? date( 'M j, Y', strtotime( $post->post_date ) ) : date( 'M j, Y' );
12
+ // Title.
13
+ $title = empty( $title ) ? smartcrawl_get_value( 'title' ) : $title;
14
+ if ( empty( $title ) && $post ) {
15
+ $title = $post->post_title;
16
+ }
17
+ if ( empty( $title ) ) {
18
+ $title = esc_html__( 'Dummy Title', 'wds' );
19
+ }
20
+ if ( is_object( $post ) ) { $title = smartcrawl_replace_vars( $title, (array) $post ); }
21
+
22
+ // Description.
23
+ $description = empty( $description ) ? smartcrawl_get_value( 'metadesc' ) : $description;
24
+ if ( empty( $description ) && $post ) {
25
+ $description = $post->post_excerpt;
26
+ }
27
+ if ( empty( $description ) && $post ) {
28
+ $description = substr( strip_tags( $post->post_content ), 0, 130 );
29
+ }
30
+ if ( empty( $description ) ) {
31
+ $description = __( 'Dummy description', 'wds' );
32
+ }
33
+ if ( is_object( $post ) ) { $description = smartcrawl_replace_vars( $description, (array) $post ); }
34
+
35
+ // Slug.
36
+ $slug = $post ? $post->post_name : sanitize_title( $title );
37
+ ?>
38
+ <div class="wds-metabox-preview">
39
+ <label class="wds-label"><?php esc_html_e( 'Google Preview' ); ?></label>
40
+
41
+ <?php
42
+ if ( apply_filters( 'wds-metabox-visible_parts-preview_area', true ) ) {
43
+ $link = sprintf(
44
+ '%s/%s/',
45
+ str_replace( 'http://', '', get_bloginfo( 'url' ) ),
46
+ $slug
47
+ );
48
+ if ( ! empty( $post ) && is_object( $post ) && ! empty( $post->ID ) && 'publish' === get_post_status( $post->ID ) ) {
49
+ $link = get_permalink( $post->ID );
50
+ }
51
+
52
+ $this->_render('onpage/onpage-preview', array(
53
+ 'link' => esc_url( $link ),
54
+ 'title' => esc_html( $title ),
55
+ 'description' => esc_html( $description ),
56
+ ));
57
+ }
58
+ ?>
59
+ </div>
includes/admin/templates/metabox/metabox-seo-analysis-container.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $post = empty( $post ) ? null : $post; ?>
2
+
3
+ <div class="wds-seo-analysis-container">
4
+ <div class="cf wds-seo-analysis-label">
5
+ <label class="wds-label"><?php esc_html_e( 'SEO Analysis', 'wds' ); ?></label>
6
+
7
+ <button class="button button-small button-dark button-dark-o wds-refresh-analysis wds-analysis-seo" <?php if ('auto-draft' === get_post_status()) { echo 'disabled'; } ?> type="button">
8
+ <span><?php esc_html_e('Refresh', 'wds'); ?></span>
9
+ </button>
10
+ </div>
11
+
12
+ <?php
13
+ $this->_render('mascot-message', array(
14
+ 'key' => 'metabox-seo-analysis',
15
+ 'message' => esc_html__( 'This tool helps you optimize your content to give it the best chance of being found in search engines when people are looking for it. Start by choosing a few focus keywords that best describe your article, then SmartCrawl will give you recommendations to make sure your content is highly optimized.', 'wds' ),
16
+ ));
17
+ ?>
18
+
19
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-focus_area', true ) ) : ?>
20
+ <div class="wds-focus-keyword wds-table-fields wds-table-fields-stacked">
21
+ <div class="label">
22
+ <label class="wds-label" for='wds_focus'>
23
+ <?php esc_html_e( 'Focus keyword' , 'wds' ); ?>
24
+ <span><?php esc_html_e( '- Choose a single word, phrase or part of a sentence that people will likely search for.', 'wds' ); ?></span>
25
+ </label>
26
+ </div>
27
+ <div class="fields">
28
+ <input type='text'
29
+ id='wds_focus'
30
+ name='wds_focus'
31
+ value='<?php echo esc_html( smartcrawl_get_value( 'focus-keywords' ) ); ?>'
32
+ class='wds wds-disabled-during-request' placeholder="<?php esc_html_e( 'E.g. broken iphone screen', 'wds' ); ?>"/>
33
+ </div>
34
+ </div>
35
+ <?php endif; ?>
36
+
37
+ <a href="#reload"><?php esc_html_e( 'Reload', 'wds' ); ?></a>
38
+ <?php do_action( 'wds-editor-metabox-seo-analysis', $post ); ?>
39
+ </div>
includes/admin/templates/metabox/metabox-social-meta-tags.php ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $post = empty($post) ? null : $post;
3
+ $main_title = empty($main_title) ? '' : $main_title;
4
+ $main_description = empty($main_description) ? '' : $main_description;
5
+ $field_name = empty($field_name) ? '' : $field_name;
6
+ $disabled = empty($disabled) ? false : true;
7
+ $current_title = empty($current_title) ? '' : $current_title;
8
+ $title_placeholder = empty($title_placeholder) ? '' : $title_placeholder;
9
+ $current_description = empty($current_description) ? '' : $current_description;
10
+ $description_placeholder = empty($description_placeholder) ? '' : $description_placeholder;
11
+ $images = empty($images) ? array() : $images;
12
+ $images_available = !empty($images) && is_array($images);
13
+ $single_image = empty($single_image) ? false : true;
14
+ ?>
15
+ <div class="wds-table-fields-group wds-separator-top">
16
+ <div class="wds-table-fields">
17
+ <div class="label">
18
+ <label class="wds-label"><?php echo esc_html($main_title); ?></label>
19
+ <p class="wds-label-description"><?php echo esc_html($main_description); ?></p>
20
+ </div>
21
+ <div class="fields">
22
+ <div class="wds-toggleable inverted <?php echo $disabled ? 'inactive' : ''; ?>">
23
+ <?php
24
+ $this->_render('toggle-item', array(
25
+ 'inverted' => true,
26
+ 'field_name' => $field_name . '[disabled]',
27
+ 'checked' => checked($disabled, true, false),
28
+ 'item_label' => esc_html__('Enable for this post', 'wds'),
29
+ ));
30
+ ?>
31
+ <div class="wds-toggleable-inside wds-toggleable-inside-box wds-table-fields-group <?php echo esc_attr($field_name); ?>-meta">
32
+ <div class="wds-table-fields wds-table-fields-stacked">
33
+ <div class="label">
34
+ <label for="<?php echo esc_attr($field_name); ?>-title" class="wds-label"><?php esc_html_e('Title', 'wds'); ?></label>
35
+ </div>
36
+ <div class="fields">
37
+ <input type="text"
38
+ id="<?php echo esc_attr($field_name); ?>-title"
39
+ name="<?php echo esc_attr($field_name); ?>[title]"
40
+ placeholder="<?php echo esc_attr(smartcrawl_replace_vars($title_placeholder, $post)); ?>"
41
+ value="<?php echo esc_attr($current_title); ?>"/>
42
+ </div>
43
+ </div>
44
+
45
+ <div class="wds-table-fields wds-table-fields-stacked">
46
+ <div class="label">
47
+ <label for="<?php echo esc_attr($field_name); ?>-description" class="wds-label">
48
+ <?php esc_html_e('Description', 'wds'); ?>
49
+ </label>
50
+ </div>
51
+ <div class="fields">
52
+ <textarea name="<?php echo esc_attr($field_name); ?>[description]"
53
+ placeholder="<?php echo esc_attr(smartcrawl_replace_vars($description_placeholder, $post)); ?>"
54
+ id="<?php echo esc_attr($field_name); ?>-description"><?php echo esc_textarea($current_description); ?></textarea>
55
+ </div>
56
+ </div>
57
+
58
+ <div class="wds-table-fields wds-table-fields-stacked">
59
+ <div class="label">
60
+ <label for="<?php echo esc_attr($field_name); ?>-images" class="wds-label">
61
+ <?php echo $single_image ? esc_html__('Featured Image', 'wds') : esc_html__('Featured Images', 'wds'); ?>
62
+ </label>
63
+ </div>
64
+ <div class="fields og-images"
65
+ data-singular="<?php echo $single_image ? 'true' : 'false'; ?>"
66
+ data-name="<?php echo esc_attr($field_name); ?>[images]">
67
+ <div class="add-action-wrapper item" style="<?php echo $single_image && $images_available ? 'display:none;' : ''; ?>">
68
+ <a href="#add" title="<?php esc_attr_e('Add image', 'wds'); ?>">
69
+ <i class="wds-icon-plus"></i>
70
+ </a>
71
+ </div>
72
+ <?php if ($images_available) : ?>
73
+ <?php foreach ($images as $img) : ?>
74
+ <input type="text" class="widefat"
75
+ name="<?php echo esc_attr($field_name); ?>[images][]"
76
+ value="<?php echo esc_attr($img); ?>"/>
77
+ <?php endforeach; ?>
78
+ <?php endif; ?>
79
+ </div>
80
+ </div>
81
+
82
+ <p class="wds-label-description">
83
+ <?php if($single_image): ?>
84
+ <?php esc_html_e('This image will be used as the featured image when the post is shared.', 'wds'); ?>
85
+ <?php else: ?>
86
+ <?php esc_html_e('Each of these images will be available to use as the featured image when the post is shared.', 'wds'); ?>
87
+ <?php endif; ?>
88
+ </p>
89
+ </div>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ </div>
includes/admin/templates/metabox/metabox-tab-advanced.php ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $robots_noindex_value = empty( $robots_noindex_value ) ? false : $robots_noindex_value;
3
+ $robots_nofollow_value = empty( $robots_nofollow_value ) ? false : $robots_nofollow_value;
4
+ $advanced_value = empty( $advanced_value ) ? array() : $advanced_value;
5
+ $advanced_options = empty( $advanced_options ) ? array() : $advanced_options;
6
+ $sitemap_priority_options = empty( $sitemap_priority_options ) ? array() : $sitemap_priority_options;
7
+ ?>
8
+
9
+ <div class="wds-metabox-section wds-advanced-metabox-section wds-form">
10
+ <div class="wds-table-fields-group">
11
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-robots_area', true ) ) : ?>
12
+ <div class="wds-table-fields">
13
+ <div class="label">
14
+ <label class="wds-label"><?php esc_html_e( 'Indexing', 'wds' ); ?></label>
15
+ <p class="wds-label-description">
16
+ <?php esc_html_e( 'Choose how search engines will index this particular page.', 'wds' ); ?>
17
+ </p>
18
+ </div>
19
+ <div class="fields">
20
+ <?php
21
+ $this->_render('toggle-item', array(
22
+ 'inverted' => true,
23
+ 'field_name' => 'wds_meta-robots-noindex',
24
+ 'field_id' => 'wds_meta-robots-noindex',
25
+ 'checked' => $robots_noindex_value ? 'checked="checked"' : '',
26
+ 'item_label' => esc_html__( 'Index', 'wds' ),
27
+ 'item_description' => esc_html__( 'Instruct search engines whether or not you want this post to appear in search results.', 'wds' ),
28
+ ));
29
+
30
+ $this->_render('toggle-item', array(
31
+ 'inverted' => true,
32
+ 'field_name' => 'wds_meta-robots-nofollow',
33
+ 'field_id' => 'wds_meta-robots-nofollow',
34
+ 'checked' => $robots_nofollow_value ? 'checked="checked"' : '',
35
+ 'item_label' => esc_html__( 'Follow', 'wds' ),
36
+ 'item_description' => esc_html__( 'Tells search engines whether or not to follow the links on your page and crawl them too.', 'wds' ),
37
+ ));
38
+
39
+ $this->_render('toggle-item', array(
40
+ 'inverted' => true,
41
+ 'item_value' => 'noarchive',
42
+ 'field_name' => 'wds_meta-robots-adv[noarchive]',
43
+ 'field_id' => 'wds_meta-robots-adv[noarchive]',
44
+ 'checked' => in_array( 'noarchive', $advanced_value ) ? 'checked="checked"' : '',
45
+ 'item_label' => esc_html__( 'Archive', 'wds' ),
46
+ 'item_description' => esc_html__( 'Instructs search engines to store a cached version of this page.', 'wds' ),
47
+ ));
48
+
49
+ $this->_render('toggle-item', array(
50
+ 'inverted' => true,
51
+ 'item_value' => 'nosnippet',
52
+ 'field_name' => 'wds_meta-robots-adv[nosnippet]',
53
+ 'field_id' => 'wds_meta-robots-adv[nosnippet]',
54
+ 'checked' => in_array( 'nosnippet', $advanced_value ) ? 'checked="checked"' : '',
55
+ 'item_label' => esc_html__( 'Snippet', 'wds' ),
56
+ 'item_description' => esc_html__( 'Allows search engines to show a snippet of this page in the search results and prevents them from caching the page.', 'wds' ),
57
+ ));
58
+ ?>
59
+ </div>
60
+ </div>
61
+ <?php endif; ?>
62
+
63
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-canonical_area', true ) ) : ?>
64
+ <div class="wds-table-fields wds-separator-top">
65
+ <div class="label">
66
+ <label for="wds_canonical" class="wds-label"><?php esc_html_e( 'Canonical', 'wds' ); ?></label>
67
+ <p class="wds-label-description">
68
+ <?php esc_html_e( 'If you have several similar versions of this page you can point search engines to the canonical or "genuine" version to avoid duplicate content issues.', 'wds' ); ?>
69
+ </p>
70
+ </div>
71
+ <div class="fields">
72
+ <input type='text' id='wds_canonical' name='wds_canonical' value='<?php echo esc_attr( smartcrawl_get_value( 'canonical' ) ); ?>' class='wds' />
73
+ <span class="wds-field-legend"><?php esc_html_e( 'Enter the full canonical URL including http:// or https://', 'wds' ); ?></span>
74
+ </div>
75
+ </div>
76
+ <?php endif; ?>
77
+
78
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-redirect_area', true ) && user_can_see_seo_metabox_301_redirect() ) : ?>
79
+ <div class="wds-table-fields wds-separator-top">
80
+ <div class="label">
81
+ <label for="wds_redirect" class="wds-label"><?php esc_html_e( '301 Redirect', 'wds' ); ?></label>
82
+ <p class="wds-label-description">
83
+ <?php esc_html_e( 'Send visitors to this URL to another page.', 'wds' ); ?>
84
+ </p>
85
+ </div>
86
+ <div class="fields">
87
+ <input type='text' id='wds_redirect' name='wds_redirect' value='<?php echo esc_attr( smartcrawl_get_value( 'redirect' ) ); ?>' class='wds' />
88
+ <span class="wds-field-legend"><?php esc_html_e( 'Enter the URL to send traffic to including http:// or https://', 'wds' ); ?></span>
89
+ </div>
90
+ </div>
91
+ <?php endif; ?>
92
+
93
+ <?php if ( apply_filters( 'wds-metabox-visible_parts-sitemap_priority_area', true ) ) : ?>
94
+ <div class="wds-table-fields wds-separator-top">
95
+ <div class="label">
96
+ <label for='wds_sitemap-priority' class="wds-label"><?php esc_html_e( 'Sitemap Priority' , 'wds' ); ?></label>
97
+ </div>
98
+ <div class="fields">
99
+ <select name='wds_sitemap-priority'
100
+ id='wds_sitemap-priority'
101
+ class="select-container"
102
+ style="width: 100%">
103
+
104
+ <?php $priority_value = smartcrawl_get_value( 'sitemap-priority' ); ?>
105
+
106
+ <?php foreach ( $sitemap_priority_options as $key => $label ) : ?>
107
+ <option value='<?php echo esc_attr( $key ); ?>' <?php selected( $key, $priority_value ); ?>>
108
+ <?php echo esc_html( $label ); ?>
109
+ </option>
110
+ <?php endforeach; ?>
111
+ </select>
112
+ </div>
113
+ </div>
114
+ <?php endif; ?>
115
+
116
+ <div class="wds-table-fields wds-separator-top">
117
+ <div class="label">
118
+ <label class="wds-label" for="wds_autolinks-exclude">
119
+ <?php esc_html_e( 'Automatic Linking', 'wds' ); ?>
120
+ </label>
121
+ <p class="wds-label-description">
122
+ <?php esc_html_e( 'You can prevent this particular post from being auto-linked', 'wds' ); ?>
123
+ </p>
124
+ </div>
125
+ <div class="fields">
126
+ <?php
127
+ $this->_render('toggle-item', array(
128
+ 'field_name' => 'wds_autolinks-exclude',
129
+ 'checked' => smartcrawl_get_value( 'autolinks-exclude' ) ? 'checked="checked"' : '',
130
+ 'item_label' => esc_html__( 'Enable automatic linking for this post', 'wds' ),
131
+ ));
132
+ ?>
133
+ </div>
134
+ </div>
135
+ </div>
136
+ </div>
includes/admin/templates/metabox/metabox-tab-readability.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if ( ! Smartcrawl_Settings::get_setting( 'analysis-readability' ) ) { return false; } ?>
2
+ <div class="wds-metabox-section">
3
+ <p><?php esc_html_e( 'We’ve analyzed your content to see how readable it is for the average person. Suggestions are based on best practice, but only you can decide what works for you and your readers.', 'wds' ); ?></p>
4
+ <a href="#reload"><?php esc_html_e( 'Reload', 'wds' ); ?></a>
5
+
6
+ <p class="wds-readability-legend wds-small-text">
7
+ <span><strong><?php esc_html_e( 'Difficult', 'wds' ); ?></strong> <?php esc_html_e( '= Less than 60', 'wds' ); ?></span>
8
+ <span><strong><?php esc_html_e( 'OK', 'wds' ); ?></strong> <?php esc_html_e( '= 60 to 70', 'wds' ); ?></span>
9
+ <span><strong><?php esc_html_e( 'Easy', 'wds' ); ?></strong> <?php esc_html_e( '= 70+', 'wds' ); ?></span>
10
+ </p>
11
+
12
+ <?php do_action( 'wds-editor-metabox-readability-analysis', $post ); ?>
13
+ </div>
includes/admin/templates/metabox/metabox-tab-seo.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $post = empty( $post ) ? null : $post;
3
+ ?>
4
+
5
+ <div class="wds-form">
6
+ <div class="wds-metabox-section">
7
+ <?php
8
+ $this->_render('metabox/metabox-preview', array(
9
+ 'post' => $post,
10
+ ));
11
+ ?>
12
+
13
+ <?php $this->_render( 'metabox/metabox-meta-edit-form' ); ?>
14
+ </div>
15
+
16
+ <?php if ( Smartcrawl_Settings::get_setting( 'analysis-seo' ) ) { ?>
17
+ <div class="wds-metabox-section">
18
+ <?php
19
+ $this->_render('metabox/metabox-seo-analysis-container', array(
20
+ 'post' => $post,
21
+ ));
22
+ ?>
23
+ </div>
24
+ <?php } ?>
25
+ </div>
includes/admin/templates/metabox/metabox-tab-social.php ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $post = empty( $post ) ? null : $post;
3
+ $og_setting_enabled = empty( $og_setting_enabled ) ? false : $og_setting_enabled;
4
+ $og_post_type_enabled = empty( $og_post_type_enabled ) ? false : $og_post_type_enabled;
5
+ $twitter_setting_enabled = empty( $twitter_setting_enabled ) ? false : $twitter_setting_enabled;
6
+ $twitter_post_type_enabled = empty( $twitter_post_type_enabled ) ? false : $twitter_post_type_enabled;
7
+
8
+ if ( ! is_a( $post, 'WP_Post' ) ) {
9
+ return;
10
+ }
11
+
12
+ $og = smartcrawl_get_value( 'opengraph' );
13
+ if ( ! is_array( $og ) ) {
14
+ $og = array();
15
+ }
16
+
17
+ $og = wp_parse_args($og, array(
18
+ 'title' => false,
19
+ 'description' => false,
20
+ 'images' => false,
21
+ 'disabled' => false,
22
+ ));
23
+
24
+ if ( ! class_exists( 'Smartcrawl_OpenGraph_Printer' ) ) { require_once( SMARTCRAWL_PLUGIN_DIR . 'tools/class_wds_opengraph_printer.php' ); }
25
+ $og_printer = Smartcrawl_OpenGraph_Printer::get();
26
+ $og_meta_disabled = (bool) smartcrawl_get_array_value( $og, 'disabled' );
27
+
28
+ $twitter = smartcrawl_get_value( 'twitter' );
29
+ if ( ! is_array( $twitter ) ) {
30
+ $twitter = array();
31
+ }
32
+
33
+ $twitter = wp_parse_args($twitter, array(
34
+ 'title' => false,
35
+ 'description' => false,
36
+ 'images' => false,
37
+ 'disabled' => false,
38
+ ));
39
+
40
+ if ( ! class_exists( 'Smartcrawl_Twitter_Printer' ) ) { require_once( SMARTCRAWL_PLUGIN_DIR . '/tools/class_wds_twitter_printer.php' ); }
41
+ $twitter_printer = Smartcrawl_Twitter_Printer::get();
42
+ $twitter_meta_disabled = smartcrawl_get_array_value( $twitter, 'disabled' );
43
+
44
+ $resolver = Smartcrawl_Endpoint_Resolver::resolve();
45
+ $resolver->simulate_post( $post->ID );
46
+ ?>
47
+ <div class="wds-metabox-section wds-social-settings-metabox-section wds-form">
48
+ <p>
49
+ <?php
50
+ printf(
51
+ esc_html__( "Customize this posts title, description and featured images for social shares. You can also configure the default settings for this post type in SmartCrawl's %s area.", 'wds' ),
52
+ sprintf(
53
+ '<a href="%s">%s</a>',
54
+ Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_ONPAGE ),
55
+ esc_html__( 'Titles & Meta', 'wds' )
56
+ )
57
+ );
58
+ ?>
59
+ </p>
60
+ <?php if ( $og_setting_enabled && $og_post_type_enabled ) : ?>
61
+ <?php
62
+ $this->_render('metabox/metabox-social-meta-tags', array(
63
+ 'post' => $post,
64
+ 'main_title' => __('OpenGraph', 'wds'),
65
+ 'main_description' => __('OpenGraph is used on many social networks such as Facebook.', 'wds'),
66
+ 'field_name' => 'wds-opengraph',
67
+ 'disabled' => $og_meta_disabled,
68
+ 'current_title' => $og['title'],
69
+ 'title_placeholder' => $og_printer->get_tag_value('title'),
70
+ 'current_description' => $og['description'],
71
+ 'description_placeholder' => $og_printer->get_tag_value('description'),
72
+ 'images' => $og['images'],
73
+ 'single_image' => false
74
+ ));
75
+ ?>
76
+ <?php endif; ?>
77
+
78
+ <?php if ( $twitter_setting_enabled && $twitter_post_type_enabled ) : ?>
79
+ <?php
80
+ $this->_render('metabox/metabox-social-meta-tags', array(
81
+ 'post' => $post,
82
+ 'main_title' => __('Twitter', 'wds'),
83
+ 'main_description' => __('These details will be used in Twitter cards.', 'wds'),
84
+ 'field_name' => 'wds-twitter',
85
+ 'disabled' => $twitter_meta_disabled,
86
+ 'current_title' => $twitter['title'],
87
+ 'title_placeholder' => $twitter_printer->get_title_content(),
88
+ 'current_description' => $twitter['description'],
89
+ 'description_placeholder' => $twitter_printer->get_description_content(),
90
+ 'images' => $twitter['images'],
91
+ 'single_image' => true
92
+ ));
93
+ ?>
94
+ <?php endif; ?>
95
+
96
+ <?php
97
+ $resolver->stop_simulation();
98
+ ?>
99
+ </div>
includes/admin/templates/notice.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+ $message = empty( $message ) ? '' : $message;
3
+ $class = empty( $class ) ? 'wds-notice-warning' : $class;
4
+ ?>
5
+ <div class="wds-notice <?php echo esc_attr( $class ); ?>">
6
+ <p><?php echo wp_kses( $message, 'post' ); ?></p>
7
+ </div>
includes/admin/templates/onpage/onpage-marketpress-tabs.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if ( class_exists( 'MarketPress_MS' ) && ( is_network_admin() || is_main_site() ) ) { ?>
2
+ <section class="tab">
3
+ <input type="radio" name="wds-admin-active-tab" id="tab-marketpress" value="tab-marketpress" <?php checked( $active_tab, 'tab-marketpress' ); ?>>
4
+ <label for="tab-marketpress"><?php esc_html_e( 'MarketPress', 'wds' ); ?></label>
5
+ <div class="content wds-content-tabs">
6
+ <h2 class="tab-title"><?php esc_html_e( 'MarketPress', 'wds' ); ?></h2>
7
+
8
+ <div class="wds-content-tabs-inner">
9
+
10
+ <div class="wds-table-fields-group">
11
+ <div class="wds-table-fields">
12
+ <div class="label">
13
+ <label for="title-mp_marketplace-base" class="wds-label"><?php esc_html_e( 'Marketplace Base Title' , 'wds' ); ?></label>
14
+ </div>
15
+ <div class="fields wds-allow-macros">
16
+ <input id='title-mp_marketplace-base' name='<?php echo esc_attr( $_view['option_name'] ); ?>[title-mp_marketplace-base]' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['title-mp_marketplace-base'] ); ?>'>
17
+ </div>
18
+ </div>
19
+ </div>
20
+
21
+ <div class="wds-table-fields-group">
22
+ <div class="wds-table-fields">
23
+ <div class="label label-long">
24
+ <label for="metadesc-mp_marketplace-base" class="wds-label"><?php _e( 'Marketplace Base<br> Meta Description' , 'wds' ); ?></label>
25
+ </div>
26
+ <div class="fields wds-allow-macros">
27
+ <textarea id='metadesc-mp_marketplace-base' name='<?php echo esc_attr( $_view['option_name'] ); ?>[metadesc-mp_marketplace-base]' type='text' class='wds-field'><?php echo esc_textarea( $_view['options']['metadesc-mp_marketplace-base'] ); ?></textarea>
28
+ </div>
29
+ </div>
30
+ </div>
31
+
32
+ <div class="wds-table-fields-group">
33
+ <div class="wds-table-fields">
34
+ <div class="label label-long">
35
+ <label for="title-mp_marketplace-categories" class="wds-label"><?php _e( 'Marketplace Categories<br> Title' , 'wds' ); ?></label>
36
+ </div>
37
+ <div class="fields wds-allow-macros">
38
+ <input id='title-mp_marketplace-categories' name='<?php echo esc_attr( $_view['option_name'] ); ?>[title-mp_marketplace-categories]' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['title-mp_marketplace-categories'] ); ?>'>
39
+ </div>
40
+ </div>
41
+ </div>
42
+
43
+ <div class="wds-table-fields-group">
44
+ <div class="wds-table-fields">
45
+ <div class="label">
46
+ <label for="metadesc-mp_marketplace-categories" class="wds-label"><?php _e( 'Marketplace Categories<br> Meta Description' , 'wds' ); ?></label>
47
+ </div>
48
+ <div class="fields wds-allow-macros">
49
+ <textarea id='metadesc-mp_marketplace-categories' name='<?php echo esc_attr( $_view['option_name'] ); ?>[metadesc-mp_marketplace-categories]' type='text' class='wds-field'><?php echo esc_textarea( $_view['options']['metadesc-mp_marketplace-categories'] ); ?></textarea>
50
+ </div>
51
+ </div>
52
+ </div>
53
+
54
+ <div class="wds-table-fields-group">
55
+ <div class="wds-table-fields">
56
+ <div class="label label-long">
57
+ <label for="title-mp_marketplace-tags" class="wds-label"><?php _e( 'Marketplace Tags<br> Title' , 'wds' ); ?></label>
58
+ </div>
59
+ <div class="fields wds-allow-macros">
60
+ <input id='title-mp_marketplace-tags' name='<?php echo esc_attr( $_view['option_name'] ); ?>[title-mp_marketplace-tags]' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['title-mp_marketplace-tags'] ); ?>'>
61
+ </div>
62
+ </div>
63
+ </div>
64
+
65
+ <div class="wds-table-fields-group">
66
+ <div class="wds-table-fields">
67
+ <div class="label">
68
+ <label for="metadesc-mp_marketplace-tags" class="wds-label"><?php _e( 'Marketplace Tags<br> Meta Description' , 'wds' ); ?></label>
69
+ </div>
70
+ <div class="fields wds-allow-macros">
71
+ <textarea id='metadesc-mp_marketplace-tags' name='<?php echo esc_attr( $_view['option_name'] ); ?>[metadesc-mp_marketplace-tags]' type='text' class='wds-field'><?php echo esc_textarea( $_view['options']['metadesc-mp_marketplace-tags'] ); ?></textarea>
72
+ </div>
73
+ </div>
74
+ </div>
75
+
76
+ </div><!-- end wds-content-tabs-inner -->
77
+ <div class="wds-seamless-footer">
78
+ <input name='submit' type='submit' class='button' value='<?php echo esc_attr( __( 'Save Settings' , 'wds' ) ); ?>'>
79
+ </div>
80
+
81
+ </div>
82
+ </section>
83
+ <?php } ?>
includes/admin/templates/onpage/onpage-meta-robots.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $items = empty( $items ) ? array() : $items;
3
+
4
+ if ( ! $items ) {
5
+ return;
6
+ }
7
+ ?>
8
+
9
+ <?php
10
+ $this->_render('toggle-group', array(
11
+ 'label' => __( 'Indexing', 'wds' ),
12
+ 'description' => __( 'Choose whether you want your website to appear in search results.', 'wds' ),
13
+ 'separator' => true,
14
+ 'items' => $items,
15
+ ));
16
+
includes/admin/templates/onpage/onpage-og-disabled.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $message = sprintf(
3
+ esc_html__('OpenGraph is globally disabled. You can enable it %s.', 'wds'),
4
+ sprintf(
5
+ '<a href="%s">%s</a>',
6
+ Smartcrawl_Settings_Admin::admin_url(Smartcrawl_Settings::TAB_SOCIAL),
7
+ esc_html__('here', 'wds')
8
+ )
9
+ );
10
+
11
+ $this->_render('notice', array(
12
+ 'class' => 'wds-notice-info',
13
+ 'message' => $message,
14
+ ));
includes/admin/templates/onpage/onpage-og-settings.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @var string $for_type
4
+ */
5
+ $section_enabled_field_id = 'og-active-' . $for_type;
6
+ $section_enabled = !empty($_view['options'][$section_enabled_field_id]) ? $_view['options'][$section_enabled_field_id] : false;
7
+ $section_title = __('Enable OpenGraph', 'wds');
8
+ $section_description = __('OpenGraph support enhances how your content appears when shared on social networks such as Facebook.', 'wds');
9
+ $option_name = empty($_view['option_name']) ? '' : $_view['option_name'];
10
+ $title_field_id = 'og-title-' . $for_type;
11
+ $current_title = !empty($_view['options']["og-title-{$for_type}"])
12
+ ? $_view['options']["og-title-{$for_type}"]
13
+ : '';
14
+
15
+ $description_field_id = 'og-description-' . $for_type;
16
+ $current_description = !empty($_view['options']["og-description-{$for_type}"])
17
+ ? $_view['options']["og-description-{$for_type}"]
18
+ : '';
19
+
20
+ $images_field_id = 'og-images-' . $for_type;
21
+ $current_images = !empty($_view['options']["og-images-{$for_type}"]) && is_array($_view['options']["og-images-{$for_type}"])
22
+ ? $_view['options']["og-images-{$for_type}"]
23
+ : array();
24
+
25
+ $this->_render('onpage/onpage-social-meta-tags', array(
26
+ 'for_type' => $for_type,
27
+ 'section_enabled_field_id' => $section_enabled_field_id,
28
+ 'section_enabled' => $section_enabled,
29
+ 'section_title' => $section_title,
30
+ 'section_description' => $section_description,
31
+ 'option_name' => $option_name,
32
+ 'title_field_id' => $title_field_id,
33
+ 'current_title' => $current_title,
34
+ 'description_field_id' => $description_field_id,
35
+ 'current_description' => $current_description,
36
+ 'images_field_id' => $images_field_id,
37
+ 'current_images' => $current_images,
38
+ ));
includes/admin/templates/onpage/onpage-og-twitter.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @var string $for_type
4
+ */
5
+ $social_options = Smartcrawl_Settings::get_component_options(Smartcrawl_Settings::COMP_SOCIAL);
6
+ $onpage_options = !empty($_view['options']) ? $_view['options'] : array();
7
+
8
+ $og_enabled_field_id = 'og-active-' . esc_attr($for_type);
9
+ $og_enabled_globally = smartcrawl_get_array_value($social_options, 'og-enable');
10
+ $og_enabled_locally = !empty($onpage_options[$og_enabled_field_id]) ? $onpage_options[$og_enabled_field_id] : false;
11
+
12
+ $twitter_enabled_field_id = 'twitter-active-' . esc_attr($for_type);
13
+ $twitter_enabled_globally = smartcrawl_get_array_value($social_options, 'twitter-card-enable');
14
+ $twitter_enabled_locally = !empty($onpage_options[$twitter_enabled_field_id]) ? $onpage_options[$twitter_enabled_field_id] : false;
15
+ ?>
16
+ <fieldset class="wds-table-fields-group wds-separator-top">
17
+ <div class="wds-table-fields">
18
+ <div class="label">
19
+ <label class="wds-label">
20
+ <?php esc_html_e('Options', 'wds'); ?>
21
+ </label>
22
+ </div>
23
+ <div class="fields">
24
+ <div class="wds-toggleable <?php echo $og_enabled_locally ? '' : 'inactive'; ?>">
25
+ <?php
26
+ if (!$og_enabled_globally) {
27
+ $this->_render('onpage/onpage-og-disabled');
28
+ } else {
29
+ $this->_render('onpage/onpage-og-settings', array(
30
+ 'for_type' => $for_type,
31
+ ));
32
+ }
33
+ ?>
34
+ </div>
35
+ <p></p>
36
+
37
+ <div class="wds-toggleable <?php echo $twitter_enabled_locally ? '' : 'inactive'; ?>">
38
+ <?php
39
+ if (!$twitter_enabled_globally) {
40
+ $this->_render('onpage/onpage-twitter-disabled');
41
+ } else {
42
+ $this->_render('onpage/onpage-twitter-settings', array(
43
+ 'for_type' => $for_type,
44
+ ));
45
+ }
46
+ ?>
47
+ </div>
48
+ </div>
49
+ </div>
50
+ </fieldset>
includes/admin/templates/onpage/onpage-preview.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
3
+ $link = ! isset( $link ) ? home_url() : $link;
4
+ $title = ! isset( $title ) ? smartcrawl_replace_vars( $smartcrawl_options['title-home'] ) : $title;
5
+ $description = ! isset( $description ) ? smartcrawl_replace_vars( $smartcrawl_options['metadesc-home'] ) : $description;
6
+ ?>
7
+ <div class="wds-preview-container">
8
+ <div class="wds-preview">
9
+ <div class="wds-preview-title">
10
+ <h3>
11
+ <a href="<?php echo esc_url( $link ); ?>">
12
+ <?php echo esc_html( $title ); ?>
13
+ </a>
14
+ </h3>
15
+ </div>
16
+ <div class="wds-preview-url">
17
+ <a href="<?php echo esc_url( $link ); ?>">
18
+ <?php echo esc_url( $link ); ?>
19
+ </a>
20
+ </div>
21
+ <div class="wds-preview-meta">
22
+ <?php echo esc_html( $description ); ?>
23
+ </div>
24
+ </div>
25
+ <p class="wds-preview-description"><?php _e( 'A preview of how your title and meta will appear in Google Search.', 'wds' ); ?></p>
26
+ </div>
includes/admin/templates/onpage/onpage-section-404.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name']; ?>
2
+
3
+ <?php $this->_render( 'onpage/onpage-preview' ); ?>
4
+
5
+ <div class="wds-table-fields-group">
6
+ <div class="wds-table-fields">
7
+ <div class="label">
8
+ <label for="title-404" class="wds-label"><?php esc_html_e( '404 Page Title' , 'wds' ); ?></label>
9
+ </div>
10
+ <div class="fields wds-allow-macros">
11
+ <input id='title-404' name='<?php echo esc_attr( $option_name ); ?>[title-404]' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['title-404'] ); ?>'>
12
+ </div>
13
+ </div>
14
+ </div>
15
+
16
+ <div class="wds-table-fields-group">
17
+ <div class="wds-table-fields">
18
+ <div class="label">
19
+ <label for="metadesc-404" class="wds-label"><?php esc_html_e( '404 Page Description' , 'wds' ); ?></label>
20
+ </div>
21
+ <div class="fields wds-allow-macros">
22
+ <textarea id='metadesc-404' name='<?php echo esc_attr( $option_name ); ?>[metadesc-404]' type='text' class='wds-field'><?php echo esc_textarea( $_view['options']['metadesc-404'] ); ?></textarea>
23
+ </div>
24
+ </div>
25
+ </div>
includes/admin/templates/onpage/onpage-section-author-archive.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $option_name = empty( $option_name ) ? '' : $option_name;
3
+ $meta_robots_author = empty( $meta_robots_author ) ? '' : $meta_robots_author;
4
+ ?>
5
+
6
+ <?php $this->_render( 'onpage/onpage-preview' ); ?>
7
+
8
+ <div class="wds-table-fields-group">
9
+ <div class="wds-table-fields">
10
+ <div class="label">
11
+ <label for="title-author" class="wds-label"><?php esc_html_e( 'Author Archive Title' , 'wds' ); ?></label>
12
+ </div>
13
+ <div class="fields wds-allow-macros">
14
+ <input id='title-author' name='<?php echo esc_attr( $option_name ); ?>[title-author]' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['title-author'] ); ?>'>
15
+ </div>
16
+ </div>
17
+ </div>
18
+
19
+ <div class="wds-table-fields-group">
20
+ <div class="wds-table-fields">
21
+ <div class="label">
22
+ <label for="metadesc-author" class="wds-label"><?php _e( 'Author Archive Meta Description' , 'wds' ); ?></label>
23
+ </div>
24
+ <div class="fields wds-allow-macros">
25
+ <textarea id='metadesc-author' name='<?php echo esc_attr( $option_name ); ?>[metadesc-author]' type='text' class='wds-field'><?php echo esc_textarea( $_view['options']['metadesc-author'] ); ?></textarea>
26
+ </div>
27
+ </div>
28
+ </div>
29
+
30
+ <?php
31
+ $this->_render('onpage/onpage-og-twitter', array(
32
+ 'for_type' => 'author',
33
+ ));
34
+ ?>
35
+
36
+ <?php
37
+ $this->_render('onpage/onpage-meta-robots', array(
38
+ 'items' => $meta_robots_author,
39
+ ));
40
+ ?>
includes/admin/templates/onpage/onpage-section-buddypress-groups.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name']; ?>
2
+
3
+ <?php $this->_render( 'onpage/onpage-preview' ); ?>
4
+
5
+ <div class="wds-table-fields-group">
6
+ <div class="wds-table-fields">
7
+ <div class="label">
8
+ <label for="title-bp_groups" class="wds-label"><?php esc_html_e( 'BuddyPress Group Title' , 'wds' ); ?></label>
9
+ </div>
10
+ <div class="fields wds-allow-macros">
11
+ <input id='title-bp_groups' name='<?php echo esc_attr( $option_name ); ?>[title-bp_groups]' size='' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['title-bp_groups'] ); ?>'>
12
+ </div>
13
+ </div>
14
+ </div>
15
+
16
+ <div class="wds-table-fields-group">
17
+ <div class="wds-table-fields">
18
+ <div class="label">
19
+ <label for="metadesc-bp_groups" class="wds-label"><?php esc_html_e( 'BuddyPress Group Meta Description' , 'wds' ); ?></label>
20
+ </div>
21
+ <div class="fields wds-allow-macros">
22
+ <textarea id='metadesc-bp_groups' name='<?php echo esc_attr( $option_name ); ?>[metadesc-bp_groups]' type='text' class='wds-field'><?php echo esc_textarea( $_view['options']['metadesc-bp_groups'] ); ?></textarea>
23
+ </div>
24
+ </div>
25
+ </div>
includes/admin/templates/onpage/onpage-section-buddypress-profile.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name']; ?>
2
+
3
+ <?php $this->_render( 'onpage/onpage-preview' ); ?>
4
+
5
+ <div class="wds-table-fields-group">
6
+ <div class="wds-table-fields">
7
+ <div class="label">
8
+ <label for="title-bp_profile" class="wds-label"><?php esc_html_e( 'BuddyPress Profile Title' , 'wds' ); ?></label>
9
+ </div>
10
+ <div class="fields wds-allow-macros">
11
+ <input id='title-bp_profile' name='<?php echo esc_attr( $option_name ); ?>[title-bp_profile]' size='' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['title-bp_profile'] ); ?>'>
12
+ </div>
13
+ </div>
14
+ </div>
15
+
16
+ <div class="wds-table-fields-group">
17
+ <div class="wds-table-fields">
18
+ <div class="label">
19
+ <label for="metadesc-bp_profile" class="wds-label"><?php _e( 'BuddyPress Profile<br> Meta Description' , 'wds' ); ?></label>
20
+ </div>
21
+ <div class="fields wds-allow-macros">
22
+ <textarea id='metadesc-bp_profile' name='<?php echo esc_attr( $option_name ); ?>[metadesc-bp_profile]' type='text' class='wds-field'><?php echo esc_textarea( $_view['options']['metadesc-bp_profile'] ); ?></textarea>
23
+ </div>
24
+ </div>
25
+ </div>
includes/admin/templates/onpage/onpage-section-date-archive.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name'];
3
+ $meta_robots_date = empty( $meta_robots_date ) ? array() : $meta_robots_date;
4
+ ?>
5
+
6
+ <?php $this->_render( 'onpage/onpage-preview' ); ?>
7
+
8
+ <div class="wds-table-fields-group">
9
+ <div class="wds-table-fields">
10
+ <div class="label">
11
+ <label for="title-date" class="wds-label"><?php esc_html_e( 'Date Archives Title' , 'wds' ); ?></label>
12
+ </div>
13
+ <div class="fields wds-allow-macros">
14
+ <input id='title-date' name='<?php echo esc_attr( $option_name ); ?>[title-date]' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['title-date'] ); ?>'>
15
+ </div>
16
+ </div>
17
+ </div>
18
+
19
+ <div class="wds-table-fields-group">
20
+ <div class="wds-table-fields">
21
+ <div class="label">
22
+ <label for="metadesc-date" class="wds-label"><?php _e( 'Date Archives Meta Description' , 'wds' ); ?></label>
23
+ </div>
24
+ <div class="fields wds-allow-macros">
25
+ <textarea id='metadesc-date' name='<?php echo esc_attr( $option_name ); ?>[metadesc-date]' type='text' class='wds-field'><?php echo esc_textarea( $_view['options']['metadesc-date'] ); ?></textarea>
26
+ </div>
27
+ </div>
28
+ </div>
29
+
30
+ <?php
31
+ $this->_render('onpage/onpage-og-twitter', array(
32
+ 'for_type' => 'date',
33
+ ));
34
+ ?>
35
+
36
+ <?php
37
+ $this->_render('onpage/onpage-meta-robots', array(
38
+ 'items' => $meta_robots_date,
39
+ ));
40
+ ?>
includes/admin/templates/onpage/onpage-section-homepage.php ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $homepage_title = empty( $homepage_title ) ? '' : $homepage_title;
3
+ $homepage_description = empty( $homepage_description ) ? '' : $homepage_description;
4
+ $show_homepage_options = empty( $show_homepage_options ) ? '' : $show_homepage_options;
5
+ $meta_robots_main_blog_archive = empty( $meta_robots_main_blog_archive ) ? '' : $meta_robots_main_blog_archive;
6
+ $option_name = empty( $_view['option_name'] ) ? '' : '';
7
+ ?>
8
+
9
+ <?php
10
+ $this->_render(
11
+ 'onpage/onpage-preview',
12
+ array(
13
+ 'link' => home_url(),
14
+ 'title' => smartcrawl_replace_vars( $homepage_title, array() ),
15
+ 'description' => smartcrawl_replace_vars( $homepage_description, array() ),
16
+ )
17
+ );
18
+ ?>
19
+
20
+ <?php if ( $show_homepage_options ) : ?>
21
+
22
+ <div class="wds-table-fields-group">
23
+ <div class="wds-table-fields">
24
+ <div class="label">
25
+ <label for="title-homepage" class="wds-label"><?php esc_html_e( 'Page Title' , 'wds' ); ?></label>
26
+ </div>
27
+ <div class="fields wds-allow-macros">
28
+ <input id='title-homepage' name='<?php echo esc_attr( $_view['option_name'] ); ?>[title-home]' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['title-home'] ); ?>'>
29
+ </div>
30
+ </div>
31
+ </div>
32
+
33
+ <div class="wds-table-fields-group">
34
+ <div class="wds-table-fields">
35
+ <div class="label">
36
+ <label for="metadesc-homepage" class="wds-label"><?php esc_html_e( 'Page Description' , 'wds' ); ?></label>
37
+ </div>
38
+ <div class="fields wds-allow-macros">
39
+ <textarea id='metadesc-homepage' name='<?php echo esc_attr( $_view['option_name'] ); ?>[metadesc-home]' type='text' class='wds-field'><?php echo esc_textarea( $_view['options']['metadesc-home'] ); ?></textarea>
40
+ </div>
41
+ </div>
42
+ </div>
43
+
44
+ <div class="wds-table-fields-group">
45
+ <div class="wds-table-fields">
46
+ <div class="label">
47
+ <label for="metakeywords-homepage" class="wds-label"><?php esc_html_e( 'Page Keywords' , 'wds' ); ?></label>
48
+ </div>
49
+ <div class="fields fields-with-legend">
50
+ <input id='metakeywords-homepage' name='<?php echo esc_attr( $_view['option_name'] ); ?>[keywords-home]' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['keywords-home'] ); ?>'>
51
+ <span class="wds-field-legend"><?php echo sprintf( '%s <pre class="wds-pre wds-pre-inline">%s</pre>' , __( 'Comma-separated keywords, e.g.', 'wds' ), __( 'word1, word2', 'wds' ) ); ?></span>
52
+ </div>
53
+ </div>
54
+ </div>
55
+
56
+ <?php
57
+ $this->_render('onpage/onpage-og-twitter', array(
58
+ 'for_type' => 'home',
59
+ ));
60
+ ?>
61
+
62
+ <?php
63
+ $this->_render('onpage/onpage-meta-robots', array(
64
+ 'items' => $meta_robots_main_blog_archive,
65
+ ));
66
+ ?>
67
+
68
+ <?php else : ?>
69
+
70
+ <?php
71
+ $front_page = (int) get_option( 'page_on_front' );
72
+ $edit_link = sprintf(
73
+ '<a href="' . get_edit_post_link( $front_page ) . '">%s</a>',
74
+ __( 'here', 'wds' )
75
+ );
76
+ ?>
77
+ <div class="wds-notice wds-notice-info">
78
+ <p>
79
+ <?php
80
+ if ( $front_page ) {
81
+ printf(
82
+ __( 'Your homepage is set to a static page. Configure your homepage SEO via the page itself %s.', 'wds' ),
83
+ $edit_link
84
+ );
85
+ } else {
86
+ esc_html_e( 'Your homepage is set to a static page. Configure your homepage SEO via the page itself.', 'wds' );
87
+ }
88
+ ?>
89
+ </p>
90
+ </div>
91
+ <?php endif; ?>
includes/admin/templates/onpage/onpage-section-post-type.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $post_type = empty( $post_type ) ? '' : $post_type;
3
+ $post_type_object = empty( $post_type_object ) ? '' : $post_type_object;
4
+ $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name'];
5
+ ?>
6
+
7
+ <?php $this->_render( 'onpage/onpage-preview' ); ?>
8
+
9
+ <div class="wds-table-fields-group">
10
+ <div class="wds-table-fields">
11
+ <div class="label">
12
+ <label for="title-<?php echo $post_type; ?>" class="wds-label"><?php printf( esc_html( __( '%s Title' , 'wds' ) ), esc_html( $post_type_object->labels->singular_name ) ); ?></label>
13
+ </div>
14
+ <div class="fields wds-allow-macros">
15
+ <input id='title-<?php echo $post_type; ?>' name='<?php echo esc_attr( $option_name ); ?>[title-<?php echo $post_type; ?>]' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options'][ 'title-' . $post_type ] ); ?>'>
16
+ </div>
17
+ </div>
18
+ </div>
19
+
20
+ <div class="wds-table-fields-group">
21
+ <div class="wds-table-fields">
22
+ <div class="label">
23
+ <label for="metadesc-<?php echo $post_type; ?>" class="wds-label"><?php printf( esc_html( __( '%s Meta Description' , 'wds' ) ), esc_html( $post_type_object->labels->singular_name ) ); ?></label>
24
+ </div>
25
+ <div class="fields wds-allow-macros">
26
+ <textarea id='metadesc-<?php echo $post_type; ?>' name='<?php echo esc_attr( $option_name ); ?>[metadesc-<?php echo $post_type; ?>]' type='text' class='wds-field'><?php echo esc_textarea( $_view['options'][ 'metadesc-' . $post_type ] ); ?></textarea>
27
+ </div>
28
+ </div>
29
+
30
+ <?php
31
+ $this->_render('onpage/onpage-meta-robots', array(
32
+ 'items' => $post_type_robots,
33
+ ));
34
+ ?>
35
+
36
+ <?php
37
+ $this->_render('onpage/onpage-og-twitter', array(
38
+ 'for_type' => $post_type,
39
+ ));
40
+ ?>
41
+ </div>
includes/admin/templates/onpage/onpage-section-search.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name'];
3
+ $meta_robots_search = empty( $meta_robots_search ) ? array() : $meta_robots_search;
4
+ ?>
5
+
6
+ <?php $this->_render( 'onpage/onpage-preview' ); ?>
7
+
8
+ <div class="wds-table-fields-group">
9
+ <div class="wds-table-fields">
10
+ <div class="label">
11
+ <label for="title-search" class="wds-label"><?php esc_html_e( 'Search Page Title' , 'wds' ); ?></label>
12
+ </div>
13
+ <div class="fields wds-allow-macros">
14
+ <input id='title-search' name='<?php echo esc_attr( $option_name ); ?>[title-search]' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options']['title-search'] ); ?>'>
15
+ </div>
16
+ </div>
17
+ </div>
18
+
19
+ <div class="wds-table-fields-group">
20
+ <div class="wds-table-fields">
21
+ <div class="label">
22
+ <label for="metadesc-search" class="wds-label"><?php esc_html_e( 'Search Page Meta Description' , 'wds' ); ?></label>
23
+ </div>
24
+ <div class="fields wds-allow-macros">
25
+ <textarea id='metadesc-search' name='<?php echo esc_attr( $option_name ); ?>[metadesc-search]' type='text' class='wds-field'><?php echo esc_textarea( $_view['options']['metadesc-search'] ); ?></textarea>
26
+ </div>
27
+ </div>
28
+ </div>
29
+
30
+ <?php
31
+ $this->_render('onpage/onpage-og-twitter', array(
32
+ 'for_type' => 'search',
33
+ ));
34
+ ?>
35
+
36
+ <?php
37
+ $this->_render('onpage/onpage-meta-robots', array(
38
+ 'items' => $meta_robots_search,
39
+ ));
40
+ ?>
includes/admin/templates/onpage/onpage-section-settings.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $separators = empty( $separators ) ? array() : $separators; ?>
2
+ <div class="wds-table-fields-group">
3
+ <div class="wds-table-fields">
4
+ <div class="label">
5
+ <label for="separator" class="wds-label"><?php esc_html_e( 'Separator' , 'wds' ); ?></label>
6
+ <p class="wds-label-description">
7
+ <?php _e( 'The separator refers to the break between variables which you can use by referencing the %1$%sep%1$% tag. You can choose a preset one or bake your own.', 'wds' ); ?>
8
+ </p>
9
+ </div>
10
+ <div class="fields">
11
+ <div class="wds-preset-separators">
12
+ <?php foreach ( $separators as $key => $separator ) : ?>
13
+ <input
14
+ type="radio"
15
+ name="<?php echo esc_attr( $_view['option_name'] ); ?>[preset-separator]"
16
+ id="separator-<?php echo esc_attr( $key ); ?>"
17
+ value="<?php echo esc_attr( $key ); ?>"
18
+ autocomplete="off"
19
+ <?php echo $_view['options']['preset-separator'] == $key ? 'checked="checked"' : ''; ?> />
20
+ <label class="separator-selector" for="separator-<?php echo esc_attr( $key ); ?>">
21
+ <?php echo esc_html( $separator ); ?>
22
+ </label>
23
+ <?php endforeach; ?>
24
+ </div>
25
+ <p class="wds-custom-separator-message"><?php _e( 'Or, choose your own custom separator.', 'wds' ) ?></p>
26
+ <input
27
+ id='separator'
28
+ placeholder="<?php _e( 'Enter custom separator', 'wds' ); ?>"
29
+ name='<?php echo esc_attr( $_view['option_name'] ); ?>[separator]'
30
+ type='text'
31
+ class='wds-field'
32
+ value='<?php echo esc_attr( $_view['options']['separator'] ); ?>' />
33
+ </div>
34
+ </div>
35
+ </div>
includes/admin/templates/onpage/onpage-section-taxonomy.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $taxonomy = empty( $taxonomy ) ? new stdClass() : $taxonomy;
3
+ $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name'];
4
+ $meta_robots = empty( $meta_robots ) ? array() : $meta_robots;
5
+ ?>
6
+
7
+ <?php $this->_render( 'onpage/onpage-preview' ); ?>
8
+
9
+ <div class="wds-table-fields-group">
10
+ <div class="wds-table-fields">
11
+ <div class="label">
12
+ <label for="title-<?php echo $taxonomy->name; ?>" class="wds-label"><?php printf( esc_html( __( '%s Title' , 'wds' ) ), esc_html( ucfirst( $taxonomy->label ) ) ); ?></label>
13
+ </div>
14
+ <div class="fields wds-allow-macros">
15
+ <input id='title-<?php echo $taxonomy->name; ?>' name='<?php echo esc_attr( $option_name ); ?>[title-<?php echo $taxonomy->name; ?>]' type='text' class='wds-field' value='<?php echo esc_attr( $_view['options'][ 'title-' . $taxonomy->name ] ); ?>'>
16
+ </div>
17
+ </div>
18
+ </div>
19
+
20
+ <div class="wds-table-fields-group">
21
+ <div class="wds-table-fields">
22
+ <div class="label">
23
+ <label for="metadesc-<?php echo $taxonomy->name; ?>" class="wds-label"><?php printf( esc_html( __( '%s Meta Description' , 'wds' ) ), esc_html( ucfirst( $taxonomy->label ) ) ); ?></label>
24
+ </div>
25
+ <div class="fields wds-allow-macros">
26
+ <textarea id='metadesc-<?php echo $taxonomy->name; ?>' name='<?php echo esc_attr( $option_name ); ?>[metadesc-<?php echo $taxonomy->name; ?>]' type='text' class='wds-field'><?php echo esc_textarea( $_view['options'][ 'metadesc-' . $taxonomy->name ] ); ?></textarea>
27
+ </div>
28
+ </div>
29
+ </div>
30
+
31
+ <?php
32
+ $this->_render('onpage/onpage-og-twitter', array(
33
+ 'for_type' => $taxonomy->name,
34
+ ));
35
+ ?>
36
+
37
+ <?php
38
+ $this->_render('onpage/onpage-meta-robots', array(
39
+ 'items' => $meta_robots,
40
+ ));
41
+ ?>
includes/admin/templates/onpage/onpage-settings.php ADDED
@@ -0,0 +1,257 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="container" class="wrap wrap-wds wds-page wds-page-autolinks">
2
+ <section id="header">
3
+ <?php $this->_render( 'settings-message-top' ); ?>
4
+ <div class="actions">
5
+ <a href="#show-supported-macros-modal" rel="dialog" class="button button-small button-light actions-button"><?php esc_html_e( 'Browse Macros', 'wds' ); ?></a>
6
+ </div>
7
+ <h1><?php esc_html_e( 'Title & Meta' , 'wds' ); ?></h1>
8
+ </section><!-- end header -->
9
+
10
+ <dialog class="wds-modal" id="show-supported-macros-modal" title="<?php esc_html_e( 'Supported Macros', 'wds' ); ?>">
11
+ <div id="wds-show-supported-macros">
12
+ <table class="wds-data-table wds-data-table-inverse-large">
13
+ <thead>
14
+ <tr>
15
+ <th class="label"><?php esc_html_e( 'Title' , 'wds' ); ?></th>
16
+ <th class="result"><?php esc_html_e( 'Gets Replaced By' , 'wds' ); ?></th>
17
+ </tr>
18
+ </thead>
19
+ <tfoot>
20
+ <tr>
21
+ <th class="label"><?php esc_html_e( 'Title' , 'wds' ); ?></th>
22
+ <th class="result"><?php esc_html_e( 'Gets Replaced By' , 'wds' ); ?></th>
23
+ </tr>
24
+ </tfoot>
25
+ <tbody>
26
+
27
+ <?php foreach ( $macros as $macro => $label ) { ?>
28
+ <tr>
29
+ <td class="data data-small"><?php echo esc_html( $macro ); ?></td>
30
+ <td class="data data-small"><?php echo esc_html( $label ); ?></td>
31
+ </tr>
32
+ <?php } ?>
33
+
34
+ </tbody>
35
+ </table>
36
+ </div>
37
+ </dialog><!-- end run-seo-analysis-modal -->
38
+
39
+ <?php
40
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
41
+ if ( ! smartcrawl_is_allowed_tab( $_view['slug'] ) ) {
42
+ printf( __( "Your network admin prevented access to '%s', please move onto next step.", 'wds' ), __( 'Title & Meta' , 'wds' ) );
43
+ } elseif ( 'settings' === $_view['name'] || ( ! empty( $smartcrawl_options[ $_view['name'] ] ) ) ) {
44
+
45
+ ?>
46
+ <form action='<?php echo esc_attr( $_view['action_url'] ); ?>' method='post' class="wds-form">
47
+ <?php settings_fields( $_view['option_name'] ); ?>
48
+
49
+ <input type="hidden" name='<?php echo esc_attr( $_view['option_name'] ); ?>[<?php echo esc_attr( $_view['slug'] ); ?>-setup]' value="1">
50
+
51
+ <div class="vertical-tabs" id="page-title-meta-tabs">
52
+ <?php
53
+ /*
54
+ * Homepage tab
55
+ */
56
+ $this->_render('vertical-tab', array(
57
+ 'tab_id' => 'tab_homepage',
58
+ 'tab_name' => __( 'Homepage', 'wds' ),
59
+ 'is_active' => $active_tab == 'tab_homepage',
60
+ 'tab_sections' => array(
61
+ array(
62
+ 'section_description' => __( 'Customize your homepage title, description and meta.', 'wds' ),
63
+ 'section_type' => 'homepage',
64
+ 'section_template' => 'onpage/onpage-section-homepage',
65
+ 'section_args' => array(
66
+ 'homepage_title' => $homepage_title,
67
+ 'homepage_description' => $homepage_description,
68
+ 'show_homepage_options' => $show_homepage_options,
69
+ 'meta_robots_main_blog_archive' => $meta_robots_main_blog_archive,
70
+ ),
71
+ ),
72
+ ),
73
+ ));
74
+
75
+ /*
76
+ * Post types tab
77
+ */
78
+ $post_type_sections = array();
79
+ foreach ( get_post_types( array( 'public' => true ) ) as $post_type ) {
80
+ if ( in_array( $post_type, array( 'revision', 'nav_menu_item' ) ) ) {
81
+ continue;
82
+ }
83
+
84
+ $post_type_object = get_post_type_object( $post_type );
85
+
86
+ $post_type_sections[] = array(
87
+ 'section_title' => $post_type_object->labels->name,
88
+ 'section_description' => __( sprintf( 'Customize your %s title, description and meta.', $post_type_object->labels->singular_name ), 'wds' ),
89
+ 'section_type' => $post_type,
90
+ 'section_template' => 'onpage/onpage-section-post-type',
91
+ 'section_args' => array(
92
+ 'post_type' => $post_type,
93
+ 'post_type_object' => $post_type_object,
94
+ 'post_type_robots' => ( ! empty( $post_robots[ $post_type ] ) ? $post_robots[ $post_type ] : array()),
95
+ ),
96
+ );
97
+ }
98
+
99
+ $this->_render('vertical-tab', array(
100
+ 'tab_id' => 'tab_post_types',
101
+ 'tab_name' => __( 'Post Types', 'wds' ),
102
+ 'is_active' => $active_tab == 'tab_post_types',
103
+ 'tab_sections' => $post_type_sections,
104
+ ));
105
+
106
+ /*
107
+ * Other taxonomies
108
+ */
109
+ $taxonomy_sections = array();
110
+ $taxonomies = array_merge(
111
+ array( 'post_tag', 'category' ),
112
+ get_taxonomies( array( '_builtin' => false ) )
113
+ );
114
+ foreach ( $taxonomies as $taxonomy_name ) {
115
+ $taxonomy = get_taxonomy( $taxonomy_name );
116
+ $meta_robots_taxonomy_name = 'meta_robots_' . str_replace( '-', '_', $taxonomy->name );
117
+ $taxonomy_sections[] = array(
118
+ 'section_title' => $taxonomy->label,
119
+ 'section_description' => sprintf( __( 'Customize the title, description and meta of %s.', 'wds' ), $taxonomy->label ),
120
+ 'section_type' => $taxonomy->name,
121
+ 'section_template' => 'onpage/onpage-section-taxonomy',
122
+ 'section_args' => array(
123
+ 'taxonomy' => $taxonomy,
124
+ 'meta_robots' => $$meta_robots_taxonomy_name,
125
+ ),
126
+ );
127
+ }
128
+
129
+ $this->_render('vertical-tab', array(
130
+ 'tab_id' => 'tab_taxonomies',
131
+ 'tab_name' => __( 'Taxonomies', 'wds' ),
132
+ 'is_active' => $active_tab == 'tab_taxonomies',
133
+ 'tab_sections' => $taxonomy_sections,
134
+ ));
135
+
136
+ /*
137
+ * Archives
138
+ */
139
+ $this->_render('vertical-tab', array(
140
+ 'tab_id' => 'tab_archives',
141
+ 'tab_name' => __( 'Archives', 'wds' ),
142
+ 'is_active' => $active_tab == 'tab_archives',
143
+ 'tab_sections' => array(
144
+ // Author archive
145
+ array(
146
+ 'section_title' => __( 'Author Archive', 'wds' ),
147
+ 'section_description' => __( 'If you are the only author of your website content Google may see your author archives as duplicate content to your Blog Homepage. If this is the case we recommend disabling author archives.', 'wds' ),
148
+ 'section_type' => 'author-archive',
149
+ 'section_template' => 'onpage/onpage-section-author-archive',
150
+ 'section_enabled_option' => 'enable-author-archive',
151
+ 'section_args' => array(
152
+ 'meta_robots_author' => $meta_robots_author,
153
+ ),
154
+ ),
155
+ // Date archive
156
+ array(
157
+ 'section_title' => __( 'Date Archive', 'wds' ),
158
+ 'section_description' => __( 'Google may see your date archives as duplicate content to your Blog Homepage. For this reason we recommend disabling date archives.', 'wds' ),
159
+ 'section_type' => 'date-archive',
160
+ 'section_template' => 'onpage/onpage-section-date-archive',
161
+ 'section_enabled_option' => 'enable-date-archive',
162
+ 'section_args' => array(
163
+ 'meta_robots_date' => $meta_robots_date,
164
+ ),
165
+ ),
166
+ // Search page
167
+ array(
168
+ 'section_title' => __( 'Search Page', 'wds' ),
169
+ 'section_description' => __( 'Customize your search page title, description and meta.', 'wds' ),
170
+ 'section_type' => 'search-page',
171
+ 'section_template' => 'onpage/onpage-section-search',
172
+ 'section_args' => array(
173
+ 'meta_robots_search' => $meta_robots_search,
174
+ ),
175
+ ),
176
+ // 404 page
177
+ array(
178
+ 'section_title' => __( '404 Page', 'wds' ),
179
+ 'section_description' => __( 'Customize your 404 page title, description and meta.', 'wds' ),
180
+ 'section_type' => '404-page',
181
+ 'section_template' => 'onpage/onpage-section-404',
182
+ 'section_args' => array(),
183
+ ),
184
+ ),
185
+ ));
186
+
187
+ $buddypress_sections = array();
188
+
189
+ if ( function_exists( 'groups_get_groups' ) && (is_network_admin() || is_main_site()) ) {
190
+ $buddypress_sections[] = array(
191
+ 'section_title' => __( 'BuddyPress Groups', 'wds' ),
192
+ 'section_description' => __( 'Customize your BuddyPress group title, description and meta options.', 'wds' ),
193
+ 'section_type' => 'bp-group',
194
+ 'section_template' => 'onpage/onpage-section-buddypress-groups',
195
+ 'section_args' => array(),
196
+ );
197
+ }
198
+
199
+ if ( defined( 'BP_VERSION' ) && (is_network_admin() || is_main_site()) ) {
200
+ $buddypress_sections[] = array(
201
+ 'section_title' => __( 'BuddyPress Profile', 'wds' ),
202
+ 'section_description' => __( 'Customize your BuddyPress profile title, description and meta options.', 'wds' ),
203
+ 'section_type' => 'bp-profile',
204
+ 'section_template' => 'onpage/onpage-section-buddypress-profile',
205
+ 'section_args' => array(),
206
+ );
207
+ }
208
+
209
+ if ( $buddypress_sections ) {
210
+ $this->_render('vertical-tab', array(
211
+ 'tab_id' => 'tab_buddypress',
212
+ 'tab_name' => __( 'BuddyPress', 'wds' ),
213
+ 'is_active' => $active_tab == 'tab_buddypress',
214
+ 'tab_sections' => $buddypress_sections,
215
+ ));
216
+ }
217
+ ?>
218
+
219
+ <?php
220
+ $this->_render('onpage/onpage-marketpress-tabs', array(
221
+ 'active_tab' => $active_tab,
222
+ 'wds_options' => $smartcrawl_options,
223
+ ));
224
+ ?>
225
+
226
+ <?php
227
+ $this->_render('vertical-tab', array(
228
+ 'tab_id' => 'tab_settings',
229
+ 'tab_name' => __( 'Settings', 'wds' ),
230
+ 'is_active' => $active_tab == 'tab_settings',
231
+ 'tab_sections' => array(
232
+ array(
233
+ 'section_type' => '',
234
+ 'section_template' => 'onpage/onpage-section-settings',
235
+ 'section_args' => array(
236
+ 'separators' => $separators,
237
+ ),
238
+ ),
239
+ ),
240
+ ));
241
+ ?>
242
+
243
+ </div><!-- end page-title-meta-tabs -->
244
+
245
+ </form>
246
+
247
+ <?php // echo $additional; ?>
248
+
249
+ <?php
250
+
251
+ } else {
252
+ printf( __( "You've chosen not to set up '%s', please move onto next step.", 'wds' ), __( 'Title & Meta' , 'wds' ) );
253
+ }
254
+
255
+ ?>
256
+
257
+ </div><!-- end wds-page-onpage -->
includes/admin/templates/onpage/onpage-social-meta-tags.php ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @var string $for_type
4
+ */
5
+ $section_enabled_field_id = empty($section_enabled_field_id) ? '' : $section_enabled_field_id;
6
+ $section_enabled = empty($section_enabled) ? '' : $section_enabled;
7
+ $section_title = empty($section_title) ? '' : $section_title;
8
+ $section_description = empty($section_description) ? '' : $section_description;
9
+ $option_name = empty($option_name) ? '' : $option_name;
10
+ $title_field_id = empty($title_field_id) ? '' : $title_field_id;
11
+ $current_title = empty($current_title) ? '' : $current_title;
12
+
13
+ $description_field_id = empty($description_field_id) ? '' : $description_field_id;
14
+ $current_description = empty($current_description) ? '' : $current_description;
15
+
16
+ $images_field_id = empty($images_field_id) ? '' : $images_field_id;
17
+ $current_images = empty($current_images) ? array() : $current_images;
18
+ $images_available = !empty($current_images) && is_array($current_images);
19
+ $single_image = empty($single_image) ? false : true;
20
+
21
+ $title_placeholder = (!empty($_view['options']["title-{$for_type}"]) ? $_view['options']["title-{$for_type}"] : '');
22
+ $description_placeholder = (!empty($_view['options']["metadesc-{$for_type}"]) ? $_view['options']["metadesc-{$for_type}"] : '');
23
+ ?>
24
+ <div class="wds-toggle-table">
25
+ <span class="toggle wds-toggle">
26
+ <input
27
+ class="toggle-checkbox"
28
+ value='1' <?php checked($section_enabled, true); ?> id='<?php echo esc_attr($section_enabled_field_id); ?>'
29
+ name='<?php echo esc_attr($option_name); ?>[<?php echo esc_attr($section_enabled_field_id); ?>]'
30
+ type='checkbox' autocomplete="off"/>
31
+ <label class="toggle-label" for="<?php echo esc_attr($section_enabled_field_id); ?>"></label>
32
+ </span>
33
+
34
+ <div class="wds-toggle-description">
35
+ <label class="wds-label" for="<?php echo esc_attr($section_enabled_field_id); ?>">
36
+ <?php echo esc_attr($section_title); ?>
37
+ </label>
38
+ <p class="wds-label-description">
39
+ <?php echo esc_attr($section_description); ?>
40
+ </p>
41
+
42
+ <div class="wds-table-fields-group wds-toggleable-inside-box">
43
+
44
+ <div class="wds-table-fields wds-table-fields-stacked">
45
+ <div class="label">
46
+ <label for="<?php echo esc_attr( $title_field_id ); ?>" class="wds-label">
47
+ <?php esc_html_e( 'Title' , 'wds' ); ?>
48
+ </label>
49
+ </div>
50
+ <div class="fields wds-allow-macros">
51
+ <input
52
+ id='<?php echo esc_attr( $title_field_id ); ?>'
53
+ name='<?php echo esc_attr( $option_name ); ?>[<?php echo esc_attr( $title_field_id ); ?>]'
54
+ size='' type='text' class='wds-field'
55
+ placeholder="<?php echo esc_html($title_placeholder); ?>"
56
+ value='<?php echo esc_attr( $current_title ); ?>' />
57
+ </div>
58
+ </div>
59
+
60
+ <div class="wds-table-fields wds-table-fields-stacked">
61
+ <div class="label">
62
+ <label for="<?php echo esc_attr( $description_field_id ); ?>" class="wds-label">
63
+ <?php esc_html_e( 'Description' , 'wds' ); ?>
64
+ </label>
65
+ </div>
66
+ <div class="fields wds-allow-macros">
67
+ <textarea
68
+ id='<?php echo esc_attr( $description_field_id ); ?>'
69
+ name='<?php echo esc_attr( $option_name ); ?>[<?php echo esc_attr( $description_field_id ); ?>]'
70
+ placeholder="<?php echo esc_html($description_placeholder); ?>"
71
+ type='text' class='wds-field'><?php echo esc_textarea( $current_description ); ?></textarea>
72
+ </div>
73
+ </div>
74
+
75
+ <div class="wds-table-fields wds-table-fields-stacked">
76
+ <div class="label">
77
+ <label for="<?php echo esc_attr( $images_field_id ); ?>" class="wds-label">
78
+ <?php if ($single_image): ?>
79
+ <?php esc_html_e('Default Featured Image', 'wds'); ?>
80
+ <?php else: ?>
81
+ <?php esc_html_e('Default Featured Images', 'wds'); ?>
82
+ <?php endif; ?>
83
+ </label>
84
+ </div>
85
+ <div
86
+ class="fields og-images <?php echo esc_attr( $images_field_id ); ?>"
87
+ data-singular="<?php echo $single_image ? 'true' : 'false'; ?>"
88
+ data-name='<?php echo esc_attr( $option_name ); ?>[<?php echo esc_attr( $images_field_id ); ?>]'>
89
+
90
+ <div class="wds-has-tooltip add-action-wrapper item"
91
+ data-content="<?php _e( 'Add featured image', 'wds' ); ?>"
92
+ style="<?php echo $single_image && $images_available ? 'display:none;' : ''; ?>">
93
+ <a href="#add" title="<?php esc_attr_e( 'Add image', 'wds' ); ?>"><i class="wds-icon-plus"></i></a>
94
+ </div>
95
+ <?php foreach ( $current_images as $image ): ?>
96
+ <input
97
+ name='<?php echo esc_attr( $option_name ); ?>[<?php echo esc_attr( $images_field_id ); ?>][]'
98
+ type='text'
99
+ value='<?php echo esc_attr( $image ); ?>' />
100
+ <?php endforeach; ?>
101
+ </div>
102
+ </div>
103
+ <p class="wds-label-description">
104
+ <?php if($single_image): ?>
105
+ <?php esc_html_e( "This image will be available to use if the post or page being shared doesn't contain an image.", 'wds' ); ?>
106
+ <?php else: ?>
107
+ <?php esc_html_e( "These images will be available to use if the post or page being shared doesn't contain any images.", 'wds' ); ?>
108
+ <?php endif; ?>
109
+ </p>
110
+
111
+ <?php wp_enqueue_media(); ?>
112
+ <?php wp_enqueue_style( 'wds-admin-opengraph' ); ?>
113
+ </div>
114
+ </div>
115
+ </div>
includes/admin/templates/onpage/onpage-twitter-disabled.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $message = sprintf(
3
+ esc_html__('Twitter Cards are globally disabled. You can enable them %s.', 'wds'),
4
+ sprintf(
5
+ '<a href="%s">%s</a>',
6
+ Smartcrawl_Settings_Admin::admin_url(Smartcrawl_Settings::TAB_SOCIAL),
7
+ esc_html__('here', 'wds')
8
+ )
9
+ );
10
+
11
+ $this->_render('notice', array(
12
+ 'class' => 'wds-notice-info',
13
+ 'message' => $message,
14
+ ));
includes/admin/templates/onpage/onpage-twitter-settings.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @var string $for_type
4
+ */
5
+ $section_enabled_field_id = 'twitter-active-' . $for_type;
6
+ $section_enabled = !empty($_view['options'][$section_enabled_field_id]) ? $_view['options'][$section_enabled_field_id] : false;
7
+ $section_title = __('Enable Twitter Cards', 'wds');
8
+ $section_description = __('Twitter Cards support enhances how your content appears when shared on Twitter.', 'wds');
9
+ $option_name = empty($_view['option_name']) ? '' : $_view['option_name'];
10
+ $title_field_id = 'twitter-title-' . $for_type;
11
+ $current_title = !empty($_view['options']["twitter-title-{$for_type}"])
12
+ ? $_view['options']["twitter-title-{$for_type}"]
13
+ : '';
14
+
15
+ $description_field_id = 'twitter-description-' . $for_type;
16
+ $current_description = !empty($_view['options']["twitter-description-{$for_type}"])
17
+ ? $_view['options']["twitter-description-{$for_type}"]
18
+ : '';
19
+
20
+ $images_field_id = 'twitter-images-' . $for_type;
21
+ $current_images = !empty($_view['options']["twitter-images-{$for_type}"]) && is_array($_view['options']["twitter-images-{$for_type}"])
22
+ ? $_view['options']["twitter-images-{$for_type}"]
23
+ : array();
24
+
25
+ $this->_render('onpage/onpage-social-meta-tags', array(
26
+ 'for_type' => $for_type,
27
+ 'section_enabled_field_id' => $section_enabled_field_id,
28
+ 'section_enabled' => $section_enabled,
29
+ 'section_title' => $section_title,
30
+ 'section_description' => $section_description,
31
+ 'option_name' => $option_name,
32
+ 'title_field_id' => $title_field_id,
33
+ 'current_title' => $current_title,
34
+ 'description_field_id' => $description_field_id,
35
+ 'current_description' => $current_description,
36
+ 'images_field_id' => $images_field_id,
37
+ 'current_images' => $current_images,
38
+ 'single_image' => true,
39
+ ));
includes/admin/templates/progress-bar.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $progress = empty( $progress ) ? 0 : $progress;
3
+ ?>
4
+
5
+ <div class="wds-progress">
6
+ <span class="wds-progress-bar-current-percent"><?php echo (int) $progress; ?>%</span>
7
+ <div class="wds-progress-bar">
8
+ <div class="wds-progress-bar-inside" style="width:<?php echo (int) $progress; ?>%;"></div>
9
+ </div>
10
+ </div>
includes/admin/templates/progress-notice.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $admin_email = false;
3
+ $dash_email = false;
4
+ if ( class_exists( 'WPMUDEV_Dashboard' ) && ! empty( WPMUDEV_Dashboard::$site ) ) {
5
+ if ( is_callable( array( WPMUDEV_Dashboard::$site, 'get_option' ) ) ) {
6
+ $dash_email = WPMUDEV_Dashboard::$site->get_option( 'auth_user' );
7
+ if ( false !== strpos( $dash_email, '@' ) ) { $admin_email = $dash_email; }
8
+ }
9
+ }
10
+ $scan_msg = __( "A full scan can take quite a while, especially if you have a large site! Feel free to close this page; we'll send an e-mail to %s once the results are in.", 'wds' );
11
+ ?>
12
+ <p class="wds-small-text">
13
+ <?php if ( ! empty( $dash_email ) && ! empty( $admin_email ) ) { ?>
14
+ <?php $admin_email = sprintf( '<a href="mailto: %1$s">%1$s</a>', $admin_email ); ?>
15
+ <?php } else { ?>
16
+ <?php $admin_email = __( 'your DEV account email', 'wds' ); ?>
17
+ <?php } ?>
18
+ <?php
19
+ printf(
20
+ $scan_msg,
21
+ $admin_email
22
+ );
23
+ ?>
24
+ <?php esc_html_e( 'You can change that e-mail address if you want, on your DEV account page', 'wds' ); ?>
25
+ <a href="https://premium.wpmudev.org/hub/account" target="_blank"><?php esc_html_e( 'here', 'wds' ); ?></a>
26
+ </p>
includes/admin/templates/quick-edit-javascript.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/javascript">
2
+ (function ($) {
3
+
4
+ $("td.column-title").on('click', 'a.editinline', function () {
5
+ var id = inlineEditPost.getId(this),
6
+ loading = "<?php echo esc_js( 'Loading, please hold on...', 'wds' ); ?>"
7
+ ;
8
+ setTimeout(function () {
9
+ $(".smartcrawl_title:visible").attr("placeholder", loading);
10
+ $(".smartcrawl_metadesc:visible").attr("placeholder", loading);
11
+ $(".smartcrawl_focus:visible").attr("placeholder", loading);
12
+ $(".smartcrawl_keywords:visible").attr("placeholder", loading);
13
+ }); // Just move off stack
14
+ $.post(ajaxurl, {"action": "wds_get_meta_fields", "id": id}, function (data) {
15
+ $(".smartcrawl_title:visible, .smartcrawl_metadesc:visible, .smartcrawl_focus:visible, .smartcrawl_keywords:visible").attr("placeholder", "");
16
+ if (!data) return false;
17
+ if ("title" in data && data.title) {
18
+ $(".smartcrawl_title:visible")
19
+ .val(data.title)
20
+ ;
21
+ }
22
+ if ("description" in data && data.description) {
23
+ $(".smartcrawl_metadesc:visible")
24
+ .val(data.description)
25
+ ;
26
+ }
27
+ if ("keywords" in data && data.keywords) {
28
+ $(".smartcrawl_keywords:visible")
29
+ .val(data.keywords)
30
+ ;
31
+ }
32
+ if ("focus" in data && data.focus) {
33
+ $(".smartcrawl_focus:visible")
34
+ .val(data.focus)
35
+ ;
36
+ }
37
+ }, "json");
38
+ });
39
+
40
+ })(jQuery);
41
+ </script>
includes/admin/templates/quick-edit-robots.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <fieldset class="inline-edit-col-left">
3
+ <div class="inline-edit-col">
4
+ <label>
5
+ <span class="title metadesc"><?php _e( 'Meta Description', 'wds' ); ?></span>
6
+ <textarea class="ptitle smartcrawl_metadesc" name="wds_metadesc"></textarea>
7
+ </label>
8
+ </div>
9
+ <div class="inline-edit-col long-label">
10
+ <label>
11
+ <span class="title"><?php _e( 'Focus keywords', 'wds' ); ?></span>
12
+ <span class="input-text-wrap">
13
+ <input class="ptitle smartcrawl_focus" type="text" value="" name="wds_focus" />
14
+ </span>
15
+ </label>
16
+ </div>
17
+ <div class="inline-edit-col long-label">
18
+ <label>
19
+ <span class="title"><?php _e( 'Other Keywords', 'wds' ); ?></span>
20
+ <span class="input-text-wrap">
21
+ <input class="ptitle smartcrawl_keywords" type="text" value="" name="wds_keywords" />
22
+ </span>
23
+ </label>
24
+ </div>
25
+ </fieldset>
26
+ <style>
27
+ .inline-edit-col .title.metadesc {
28
+ display: block;
29
+ margin-top: 20px;
30
+ width: 100%;
31
+ }
32
+ .inline-edit-col.long-label .title {
33
+ width: 10em;
34
+ }
35
+ .inline-edit-col.long-label .input-text-wrap {
36
+ margin-left: 10em;
37
+ }
38
+ </style>
includes/admin/templates/quick-edit-title.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <fieldset class="inline-edit-col-left" style="clear:left">
3
+ <div class="inline-edit-col">
4
+ <h4><?php _e( 'SmartCrawl', 'wds' ); ?></h4>
5
+ <label>
6
+ <span class="title"><?php _e( 'Title Tag', 'wds' ); ?></span>
7
+ <span class="input-text-wrap">
8
+ <input class="ptitle smartcrawl_title" type="text" value="" name="wds_title" />
9
+ </span>
10
+ </label>
11
+ </div>
12
+ </fieldset>
includes/admin/templates/redirections-settings.php ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="container" class="wrap wrap-wds wds-page wds-redirections-settings">
2
+
3
+ <dialog class="dev-overlay wds-modal wds-redirect" id="wds-new-redirect" title="<?php echo esc_attr( __( 'Add new redirection', 'wds' ) ); ?>">
4
+ <div class="box-content modal">
5
+ <p class="group wds-group">
6
+ <label for="" class="wds-label"><?php esc_html_e( 'Enter old URL', 'wds' ); ?></label>
7
+ <input type="url" name="source" value="" class="wds-field">
8
+ </p>
9
+ <p class="group wds-group">
10
+ <label for="" class="wds-label"><?php esc_html_e( 'Enter re-direct URL', 'wds' ); ?></label>
11
+ <input type="url" name="redirect" value="" class="wds-field">
12
+ </p>
13
+ </div>
14
+
15
+ <div class="box-footer buttons modal">
16
+ <?php wp_nonce_field( 'wds-redirect', 'wds-redirect' ); ?>
17
+ <button type="button" class="button button-cta-alt wds-submit-redirect"><?php echo esc_html_e( 'Save', 'wds' ); ?></button>
18
+ </div>
19
+
20
+ </dialog>
21
+
22
+ <section id="header">
23
+ <?php $this->_render( 'settings-message-top' ); ?>
24
+ <h1><?php esc_html_e( 'Redirections' , 'wds' ); ?></h1>
25
+ </section><!-- end header -->
26
+
27
+ <div class="row sub-header">
28
+ <div class="wds-block-section">
29
+ <p class="wds-page-desc"><?php esc_html_e( 'Here you will find a list of active redirections on your site.' , 'wds' ); ?></p>
30
+ </div>
31
+ </div><!-- end sub-header -->
32
+
33
+ <form action='<?php echo esc_url( $_view['action_url'] ); ?>' method='post' class="wds-form">
34
+ <?php settings_fields( $_view['option_name'] ); ?>
35
+
36
+ <input type="hidden" name='<?php echo esc_attr( $_view['option_name'] ); ?>[<?php echo esc_attr( $_view['slug'] ); ?>-setup]' value="1">
37
+
38
+ <div class="row">
39
+
40
+ <div class="wds-redirections-list">
41
+ <section class="box-settings-redirections-list dev-box">
42
+ <div class="box-title">
43
+ <h3><?php esc_html_e( 'Active Redirections', 'wds' ); ?></h3>
44
+ <div class="buttons left">
45
+ <button type="button" class="button button-light wds-add_new">
46
+ <?php esc_html_e( 'Add new', 'wds' ); ?>
47
+ </button>
48
+ </div>
49
+ </div>
50
+ <div class="box-content no-padding">
51
+ <?php if ( $redirections ) { ?>
52
+ <div class="wds-redirections">
53
+ <table class="wds-table wds-redirections-table">
54
+ <thead>
55
+ <tr>
56
+ <th class="selector"><input type="checkbox" class="wds-checkbox"></th>
57
+ <th class="source"><?php esc_html_e( 'Old URL', 'wds' ); ?></th>
58
+ <th class="destination"><?php esc_html_e( 'Redirect URL', 'wds' ); ?></th>
59
+ <th class="type"><?php esc_html_e( 'Type', 'wds' ); ?></th>
60
+ </tr>
61
+ </thead>
62
+ <tbody>
63
+ <?php foreach ( $redirections as $source => $redirection ) { ?>
64
+ <tr>
65
+ <td>
66
+ <input type="checkbox" class="wds-checkbox" name="<?php echo esc_attr( $_view['option_name'] ); ?>[bulk][]" value="<?php echo esc_attr( $source ); ?>">
67
+ </td>
68
+
69
+ <td>
70
+ <div class="wds-redirection_item-source">
71
+ <a href="<?php echo esc_url( $source ); ?>" class="wds-label link"><?php echo esc_html( $source ); ?></a>
72
+ </div>
73
+ <div class="wds-redirection_item-separator"><i class="wdv-icon wdv-icon-fw wdv-icon-arrow-right"></i></div>
74
+ </td>
75
+
76
+ <td>
77
+ <div class="wds-redirection_item-destination">
78
+ <input id="<?php echo esc_attr( $_view['option_name'] ); ?>" name="<?php echo esc_attr( $_view['option_name'] ); ?>[urls][<?php echo esc_attr( $source ); ?>]" type="text" class="wds-field" value="<?php echo esc_attr( $redirection ); ?>">
79
+ </div>
80
+ </td>
81
+
82
+ <td>
83
+ <div class="wds-redirection_item-type">
84
+ <select name="<?php echo esc_attr( $_view['option_name'] ); ?>[types][<?php echo esc_attr( $source ); ?>]">
85
+ <option <?php if ( ! empty( $types[ $source ] ) && 301 == $types[ $source ] ) { echo 'selected'; } ?> value="301"><?php esc_html_e( 'Permanent (301)', 'wds' ); ?></option>
86
+ <option <?php if ( ! empty( $types[ $source ] ) && 302 == $types[ $source ] ) { echo 'selected'; } ?> value="302"><?php esc_html_e( 'Temporary (302)', 'wds' ); ?></option>
87
+ </select>
88
+ </div>
89
+ </td>
90
+ </tr>
91
+ <?php } ?>
92
+ </tbody>
93
+ </table>
94
+ </div>
95
+ <?php } else { ?>
96
+ <p><?php esc_html_e( 'No active redirections', 'wds' ); ?></p>
97
+ <?php } ?>
98
+ <div class="box-footer buttons">
99
+ <div class="select-wrapper">
100
+ <label><?php esc_html_e( 'Action:', 'wds' ); ?></label>
101
+ <div class="wds-redirections-actions">
102
+ <select name="<?php echo esc_attr( $_view['option_name'] ); ?>[bulk_action]">
103
+ <option><?php esc_html_e( 'No action selected', 'wds' ); ?></option>
104
+ <option value="delete"><?php esc_html_e( 'Delete', 'wds' ); ?></option>
105
+ <option value="redirect_301"><?php esc_html_e( 'Change to 301', 'wds' ); ?></option>
106
+ <option value="redirect_302"><?php esc_html_e( 'Change to 302', 'wds' ); ?></option>
107
+ </select>
108
+ </div>
109
+ </div>
110
+ <input name='submit' type='submit' class='button button-cta-alt' value='<?php echo esc_attr( __( 'Apply Action' , 'wds' ) ); ?>'>
111
+ </div>
112
+ </div>
113
+ </section><!-- end box-sitemaps-xml-sitemap-settings -->
114
+ </div>
115
+ </div>
116
+
117
+ <div class="block-section-footer buttons">
118
+ <input name='submit' type='submit' class='button button-cta-alt' value='<?php echo esc_attr( __( 'Save Settings' , 'wds' ) ); ?>'>
119
+ </div>
120
+
121
+ </form>
122
+
123
+ </div><!-- end wds-sitemap-settings -->
includes/admin/templates/report-vertical-tab.php ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <section class="tab wds-report-vertical-tab">
2
+ <?php
3
+ // Required
4
+ $tab_id = empty( $tab_id ) ? '' : $tab_id;
5
+ $tab_name = empty( $tab_name ) ? '' : $tab_name;
6
+ $is_active = empty( $is_active ) ? false : $is_active;
7
+ $tab_sections = ! empty( $tab_sections ) && is_array( $tab_sections ) ? $tab_sections : array();
8
+ $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name'];
9
+
10
+ // Optional
11
+ $button_text = isset( $button_text ) ? $button_text : __( 'Save Settings', 'wds' );
12
+ $before_output = isset( $before_output ) ? $before_output : null;
13
+ $after_output = isset( $after_output ) ? $after_output : null;
14
+ $title_button = isset( $title_button ) ? $title_button : 'ignore';
15
+
16
+ // Variables
17
+ $is_singular = count( $tab_sections ) == 1;
18
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
19
+ ?>
20
+ <input
21
+ type="radio"
22
+ name="wds-admin-active-tab"
23
+ id="<?php echo esc_attr( $tab_id ); ?>"
24
+ value="<?php echo esc_attr( $tab_id ); ?>"
25
+ <?php checked( $is_active ); ?> />
26
+
27
+ <label for="<?php echo esc_attr( $tab_id ); ?>">
28
+ <?php echo esc_html( $tab_name ); ?>
29
+ <span class="wds-issues wds-issues-warning"><span></span></span>
30
+ </label>
31
+
32
+ <div class="content wds-content-tabs <?php echo $tab_id; ?> <?php echo $is_singular ? '' : 'wds-accordion'; ?>">
33
+ <h2 class="tab-title">
34
+ <span class="wds-tab-title-part">
35
+ <?php echo esc_html( $tab_name ); ?>
36
+ </span>
37
+ <span class="wds-tab-title-part">
38
+ <span class="wds-issues wds-issues-warning"><span></span></span>
39
+ </span>
40
+ <span class="wds-tab-title-part">
41
+ <?php if ( $title_button == 'ignore' ) : ?>
42
+ <button class="wds-ignore-all wds-button-with-loader wds-button-with-left-loader wds-disabled-during-request button button-small button-dark button-dark-o"><?php esc_html_e( 'Ignore All', 'wds' ); ?></button>
43
+ <?php endif; ?>
44
+
45
+ <?php if ( $title_button == 'upgrade' ) : ?>
46
+ <button class="wds-upgrade-button button-green"><?php esc_html_e( 'Upgrade to Pro', 'wds' ); ?></button>
47
+ <?php endif; ?>
48
+ </span>
49
+ </h2>
50
+
51
+ <?php if ( $before_output ) : ?>
52
+ <?php echo($before_output); ?>
53
+ <input
54
+ type="hidden"
55
+ name="wds-admin-active-tab"
56
+ id="<?php echo esc_attr( $tab_id ); ?>"
57
+ value="<?php echo esc_attr( $tab_id ); ?>"/>
58
+ <?php endif; ?>
59
+
60
+ <?php foreach ( $tab_sections as $section ) : ?>
61
+ <?php
62
+ $this->_render('vertical-tab-section', array_merge(
63
+ $section,
64
+ array(
65
+ 'show_accordion' => ! $is_singular,
66
+ )
67
+ ));
68
+ ?>
69
+ <?php endforeach; ?>
70
+
71
+ <?php if ( $button_text ) : ?>
72
+ <div class="wds-seamless-footer"></div>
73
+ <?php endif; ?>
74
+
75
+ <?php
76
+ if ( $after_output ) {
77
+ echo($after_output);
78
+ }
79
+ ?>
80
+ </div>
81
+ </section>
includes/admin/templates/seomoz-dashboard-widget.php ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <table class="wds-list-table wds-moz-table">
2
+ <thead>
3
+ <tr>
4
+ <th class="label"><?php _e( 'Metric' , 'wds' ); ?></th>
5
+ <th class="result"><?php _e( 'Value' , 'wds' ); ?></th>
6
+ </tr>
7
+ </thead>
8
+ <tbody>
9
+ <tr>
10
+ <td>
11
+ <strong><?php _e( 'Domain mozRank' , 'wds' ); ?></strong><br>
12
+ <?php printf( __( 'Measure of the mozRank %s of the domain in the Linkscape index' , 'wds' ), '<a href="https://moz.com/learn/seo/mozrank" target="_blank">(?)</a>' ); ?>
13
+ </td>
14
+ <td>
15
+ <?php _e( '10-point score:' , 'wds' ); ?>&nbsp;
16
+ <a href="<?php echo esc_attr( $attribution ); ?>" target="_blank"><?php echo ( ! empty( $urlmetrics->fmrp ) ? esc_html( $urlmetrics->fmrp ) : ''); ?></a>
17
+ <br>
18
+ <?php _e( 'Raw score:' , 'wds' ); ?>&nbsp;
19
+ <a href="<?php echo esc_attr( $attribution ); ?>" target="_blank"><?php echo ( ! empty( $urlmetrics->fmrr ) ? esc_html( $urlmetrics->fmrr ) : ''); ?></a>
20
+ </td>
21
+ </tr>
22
+ <tr>
23
+ <td>
24
+ <strong><?php _e( 'Domain Authority' , 'wds' ); ?></strong>
25
+ <a href="https://moz.com/learn/seo/domain-authority" target="_blank">(?)</a>
26
+ </td>
27
+ <td><a href="<?php echo esc_attr( $attribution ); ?>" target="_blank"><?php echo ( ! empty( $urlmetrics->pda ) ? esc_html( $urlmetrics->pda ) : ''); ?></a></td>
28
+ </tr>
29
+ <tr>
30
+ <td>
31
+ <strong><?php _e( 'External Links to Homepage' , 'wds' ); ?></strong><br>
32
+ <?php printf( __( 'The number of external (from other subdomains), juice passing links %s to the target URL in the Linkscape index' , 'wds' ), '<a href="https://moz.com/learn/seo/external-link" target="_blank">(?)</a>' ); ?>
33
+ </td>
34
+ <td><a href="<?php echo esc_attr( $attribution ); ?>" target="_blank"><?php echo ( ! empty( $urlmetrics->ueid ) ? esc_html( $urlmetrics->ueid ) : ''); ?></a></td>
35
+ </tr>
36
+ <tr>
37
+ <td>
38
+ <strong><?php _e( 'Links to Homepage' , 'wds' ); ?></strong><br>
39
+ <?php printf( __( 'The number of internal and external, juice and non-juice passing links %s to the target URL in the Linkscape index' , 'wds' ), '<a href="https://moz.com/learn/seo/internal-link" target="_blank">(?)</a>' ); ?>
40
+ </td>
41
+ <td><a href="<?php echo esc_attr( $attribution ); ?>" target="_blank"><?php echo ( ! empty( $urlmetrics->uid ) ? esc_html( $urlmetrics->uid ) : ''); ?></a></td>
42
+ </tr>
43
+ <tr>
44
+ <td>
45
+ <strong><?php _e( 'Homepage mozRank' , 'wds' ); ?></strong><br>
46
+ <?php printf( __( 'Measure of the mozRank %s of the homepage URL in the Linkscape index' , 'wds' ), '<a href="https://moz.com/learn/seo/mozrank" target="_blank">(?)</a>' ); ?>
47
+ </td>
48
+ <td>
49
+ <?php _e( '10-point score:' , 'wds' ); ?>&nbsp;
50
+ <a href="<?php echo esc_attr( $attribution ); ?>" target="_blank"><?php echo ( ! empty( $urlmetrics->umrp ) ? esc_html( $urlmetrics->umrp ) : ''); ?></a>
51
+ <br>
52
+ <?php _e( 'Raw score:' , 'wds' ); ?>&nbsp;
53
+ <a href="<?php echo esc_attr( $attribution ); ?>" target="_blank"><?php echo ( ! empty( $urlmetrics->umrr ) ? esc_html( $urlmetrics->umrr ) : ''); ?></a>
54
+ </td>
55
+ </tr>
56
+ <tr>
57
+ <td>
58
+ <strong><?php _e( 'Homepage Authority' , 'wds' ); ?></strong>
59
+ <a href="https://moz.com/learn/seo/page-authority" target="_blank">(?)</a>
60
+ </td>
61
+ <td><a href="<?php echo esc_attr( $attribution ); ?>" target="_blank"><?php echo ( ! empty( $urlmetrics->upa ) ? esc_html( $urlmetrics->upa ) : ''); ?></a></td>
62
+ </tr>
63
+ </tbody>
64
+ <tfoot>
65
+ <tr>
66
+ <th class="label"><?php _e( 'Metric' , 'wds' ); ?></th>
67
+ <th class="result"><?php _e( 'Value' , 'wds' ); ?></th>
68
+ </tr>
69
+ </tfoot>
70
+ </table>
71
+ <p class="copy-moz"><?php _e( 'For posts / pages specific metrics refer to the Moz URL metrics module on the Edit Post / Page screen' , 'wds' ); ?> <a class="linkscape" href="http://moz.com/" target="_blank"><img class="linkscape-image" src="<?php echo SMARTCRAWL_PLUGIN_URL; ?>images/linkscape-logo.png" title="Moz Linkscape API" /></a></p>
includes/admin/templates/seomoz-settings.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Moz settings template
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ ?>
9
+ <div class='wrap'>
10
+
11
+ <?php $this->_render( 'settings-message-top' ); ?>
12
+
13
+ <h1><?php esc_html_e( 'SmartCrawl Wizard: Moz' , 'wds' ); ?></h1>
14
+
15
+ <?php
16
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
17
+ if ( ! smartcrawl_is_allowed_tab( $_view['slug'] ) ) {
18
+ printf( __( "Your network admin prevented access to '%s', please move onto next step.", 'wds' ), __( 'Moz' , 'wds' ) );
19
+ } elseif ( 'settings' === $_view['name'] || ( ! empty( $smartcrawl_options[ $_view['name'] ] ) ) ) {
20
+
21
+ echo $additional;
22
+
23
+ } else {
24
+ printf( __( "You've chosen not to set up '%s', please move onto next step.", 'wds' ), __( 'Moz' , 'wds' ) );
25
+ }
26
+
27
+ ?>
28
+ </div>
includes/admin/templates/settings-message-top.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Messages handling template for settings pages
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ $errors = ! empty( $_view['errors'] ) && is_array( $_view['errors'] )
9
+ ? $_view['errors']
10
+ : array()
11
+ ;
12
+ $type = ! empty( $errors )
13
+ ? 'warning'
14
+ : 'success'
15
+ ;
16
+ ?>
17
+ <?php if ( ! empty( $_view['msg'] ) ) { ?>
18
+ <div class="wds-notice-floating wds-notice wds-notice-<?php echo esc_attr( $type ); ?>">
19
+ <p><?php echo $_view['msg']; ?></p>
20
+ </div>
21
+ <?php } ?>
22
+
23
+ <?php if ( ! empty( $errors ) ) { foreach ( $errors as $error ) { ?>
24
+ <?php
25
+ $msg = ! empty( $error['message'] ) ? $error['message'] : false;
26
+ if ( empty( $msg ) ) { continue; }
27
+ ?>
28
+ <div class="wds-notice-floating wds-notice wds-notice-error can-close">
29
+ <p><?php echo $msg; ?></p>
30
+ </div>
31
+ <?php }
32
+ } ?>
33
+
34
+ <?php
35
+ /**
36
+ * Import/Export error messages display
37
+ */
38
+ ?>
39
+ <?php $io_errors = Smartcrawl_Controller_IO::get()->get_errors(); ?>
40
+ <?php if ( ! empty( $io_errors ) ) { foreach ( $io_errors as $io_type => $io_error ) { ?>
41
+ <div class="wds-notice-floating wds-notice wds-notice-error <?php esc_attr( $io_type ); ?>">
42
+ <p><?php echo wp_kses( $io_error, array( 'br' => array() ) ); ?></p>
43
+ </div>
44
+ <?php }
45
+ } elseif ( ! empty( $_GET['import'] ) && 'success' === $_GET['import'] ) { ?>
46
+ <div class="wds-notice-floating wds-notice wds-notice-success">
47
+ <p><?php esc_html_e( 'Settings successfully imported', 'wds' ); ?></p>
48
+ </div>
49
+ <?php } ?>
includes/admin/templates/settings/settings-custom-meta-tag.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php $value = empty( $value ) ? '' : $value; ?>
2
+ <div class="wds-custom-meta-tag">
3
+ <input type="text"
4
+ value="<?php echo esc_attr( $value ); ?>"
5
+ placeholder="<?php esc_html_e( 'Paste your meta tag here', 'wds' ); ?>"
6
+ name="<?php echo esc_attr( $_view['option_name'] ); ?>[additional-metas][]"/>
7
+ </div>
includes/admin/templates/settings/settings-section-general.php ADDED
@@ -0,0 +1,203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Settings general section template
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ $sitemap_option_name = empty( $sitemap_option_name ) ? '' : $sitemap_option_name;
9
+ $verification_pages = empty( $verification_pages ) ? array() : $verification_pages;
10
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
11
+ ?>
12
+
13
+ <?php
14
+ $this->_render('toggle-group', array(
15
+ 'label' => __( 'Plugin Modules', 'wds' ),
16
+ 'description' => __( 'Choose which modules you would like to activate.', 'wds' ),
17
+ 'items' => array(
18
+ 'autolinks' => __( 'Autolinks', 'wds' ),
19
+ 'onpage' => __( 'Title & Meta Optimization', 'wds' ),
20
+ 'social' => __( 'Social', 'wds' ),
21
+ 'sitemap' => __( 'XML Sitemap', 'wds' ),
22
+ 'checkup' => __( 'SEO Checkup', 'wds' ),
23
+ ),
24
+ ));
25
+
26
+ $this->_render('toggle-group', array(
27
+ 'label' => esc_html__( 'Builtin modules', 'wds' ),
28
+ 'description' => esc_html__( 'Choose which modules you would like to activate.', 'wds' ),
29
+ 'separator' => true,
30
+ 'items' => array(
31
+ 'analysis-seo' => array(
32
+ 'label' => esc_html__( 'Page Analysis', 'wds' ),
33
+ 'description' => esc_html__( 'Analyses your content against recommend SEO practice and gives recommendations for improvement to make sure content is as optimized as possible.', 'wds' ),
34
+ ),
35
+ 'analysis-readability' => array(
36
+ 'label' => esc_html__( 'Readability analysis', 'wds' ),
37
+ 'description' => esc_html__( 'Benchmarks the readability of your content for the average visitor and gives recommendations for improvement.', 'wds' ),
38
+ ),
39
+ 'extras-admin_bar' => array(
40
+ 'label' => esc_html__( 'Admin Bar', 'wds' ),
41
+ 'description' => esc_html__( 'Adds a shortcut to SmartCrawl in the WP Admin bar at the top of your screen.', 'wds' ),
42
+ ),
43
+ ),
44
+ ));
45
+ ?>
46
+
47
+ <?php if ( is_multisite() && is_network_admin() ) : ?>
48
+ <div class="wds-table-fields wds-separator-top">
49
+ <div class="label">
50
+ <label class="wds-label"><?php esc_html_e( 'Site Owner Permissions', 'wds' ); ?></label>
51
+ <p class="wds-label-description">
52
+ <?php esc_html_e( 'Use this section to choose what sections of this plugin will be accessible to Site Admins on your Network.', 'wds' ); ?>
53
+ </p>
54
+ </div>
55
+
56
+ <div class="fields">
57
+ <div class="wds-toggle-table">
58
+ <span class="toggle wds-toggle">
59
+ <input type="checkbox"
60
+ class="toggle-checkbox"
61
+ value="yes"
62
+ name="<?php echo esc_attr( $_view['option_name'] ); ?>[wds_sitewide_mode]"
63
+ id="wds_sitewide_mode"
64
+ <?php isset( $wds_sitewide_mode )
65
+ ? checked( $wds_sitewide_mode, true )
66
+ : ''; ?>
67
+ />
68
+ <label class="toggle-label" for="wds_sitewide_mode"></label>
69
+ </span>
70
+
71
+ <div class="wds-toggle-description">
72
+ <label
73
+ class="wds-label"
74
+ for="wds_sitewide_mode"><?php esc_html_e( 'Sitewide mode (network level changes only)', 'wds' ); ?>
75
+ </label>
76
+ </div>
77
+ </div>
78
+ <?php
79
+ foreach ( $slugs as $item => $label ) {
80
+ $checked = ( ! empty( $blog_tabs[ $item ] )) ? "checked='checked' " : '';
81
+ $presence_slug = preg_replace( '/^wds_/', '', $item );
82
+ $disabled = 'settings' !== $presence_slug && empty( $_view['options'][ $presence_slug ] )
83
+ ? 'disabled="disabled"'
84
+ : '';
85
+ ?>
86
+ <div class="wds-toggle-table <?php if ( ! empty( $disabled ) ) { echo sanitize_html_class( 'disabled' ); } ?>">
87
+ <span class="toggle wds-toggle">
88
+ <input type="checkbox"
89
+ class="toggle-checkbox"
90
+ value="yes"
91
+ name="<?php echo esc_attr( $_view['option_name'] ); ?>[wds_blog_tabs][<?php echo esc_attr( $item ); ?>]"
92
+ id="wds_blog_tabs-<?php echo esc_attr( $item ); ?>"
93
+ <?php echo $checked; ?>
94
+ <?php echo $disabled; ?>
95
+ />
96
+ <label class="toggle-label" for="wds_blog_tabs-<?php echo esc_attr( $item ); ?>"></label>
97
+ </span>
98
+ <div class="wds-toggle-description">
99
+ <label class="wds-label" for="wds_blog_tabs-<?php echo esc_attr( $item ); ?>"><?php echo esc_html( $label ); ?></label>
100
+ </div>
101
+ </div>
102
+ <?php
103
+ }
104
+ ?>
105
+ </div>
106
+ </div>
107
+ <?php endif; ?>
108
+
109
+ <?php
110
+ $this->_render('toggle-group', array(
111
+ 'label' => __( 'Meta Tags', 'wds' ),
112
+ 'description' => __( 'Choose what SmartCrawl modules you want available to use.', 'wds' ),
113
+ 'separator' => true,
114
+ 'items' => array(
115
+ 'general-suppress-generator' => array(
116
+ 'label' => __( 'Hide generator meta tag', 'wds' ),
117
+ 'description' => __( 'It can be considered a security risk to have your WordPress version visible to the public, so we recommend you hide it.', 'wds' ),
118
+ ),
119
+ 'general-suppress-redundant_canonical' => array(
120
+ 'label' => __( 'Hide redundant canonical link tags', 'wds' ),
121
+ 'description' => __( 'WordPress automatically generates a canonical tag for your website, but in many cases this isn’t needed so you can turn it off to avoid any potential SEO ‘duplicate content’ backlash from search engines.', 'wds' ),
122
+ ),
123
+ 'metabox-lax_enforcement' => array(
124
+ 'label' => __( 'Enforce meta tag character limits', 'wds' ),
125
+ 'description' => __( 'Each meta tag type has recommended maximum characters lengths to follow. Turning this off will remove the enforcement preventing you from adding too many characters.', 'wds' ),
126
+ ),
127
+ ),
128
+ ));
129
+ ?>
130
+
131
+ <div class="wds-table-fields wds-separator-top">
132
+ <div class="label">
133
+ <label class="wds-label"><?php esc_html_e( 'Search engines', 'wds' ); ?></label>
134
+ <p class="wds-label-description"><?php esc_html_e( 'This tool will add the meta tags required by search engines to verify your site with their SEO management tools to your websites <head> tag.', 'wds' ); ?></p>
135
+ </div>
136
+ <div class="fields">
137
+ <?php
138
+ // Normalize legacy content value vs new full meta format.
139
+ $value = ! empty( $smartcrawl_options['verification-google'] )
140
+ ? '<meta name="google-site-verification" content="' . esc_attr( $smartcrawl_options['verification-google'] ) . '" />'
141
+ : (isset( $smartcrawl_options['verification-google-meta'] ) ? $smartcrawl_options['verification-google-meta'] : '');
142
+ ?>
143
+ <label for="verification-google" class="wds-label"><?php esc_html_e( 'Google Verification', 'wds' ); ?></label>
144
+ <p class="wds-label-description"><?php esc_html_e( 'Paste the full meta tag from Google.', 'wds' ); ?></p>
145
+ <input
146
+ id='verification-google'
147
+ name='<?php echo esc_attr( $_view['option_name'] ); ?>[verification-google-meta]'
148
+ type='text'
149
+ class='wds-field'
150
+ value='<?php echo esc_attr( $value ); ?>'>
151
+
152
+ <?php
153
+ // Normalize legacy content value vs new full meta format.
154
+ $value = ! empty( $smartcrawl_options['verification-bing'] )
155
+ ? '<meta name="msvalidate.01" content="' . esc_attr( $smartcrawl_options['verification-bing'] ) . '" />'
156
+ : (isset( $smartcrawl_options['verification-bing-meta'] ) ? $smartcrawl_options['verification-bing-meta'] : '');
157
+ ?>
158
+ <label for="verification-bing" class="wds-label"><?php esc_html_e( 'Bing Verification', 'wds' ); ?></label>
159
+ <p class="wds-label-description"><?php esc_html_e( 'Paste the full meta tag from Bing.', 'wds' ); ?></p>
160
+ <input
161
+ id='verification-bing'
162
+ name='<?php echo esc_attr( $_view['option_name'] ); ?>[verification-bing-meta]'
163
+ type='text'
164
+ class='wds-field'
165
+ value='<?php echo esc_attr( $value ); ?>'>
166
+
167
+ <label for="verification-pages" class="wds-label"><?php esc_html_e( 'Add verification code to', 'wds' ); ?></label>
168
+ <select id="verification-pages"
169
+ name="<?php echo esc_attr( $_view['option_name'] ); ?>[verification-pages]"
170
+ class="select-container"
171
+ style="width: 100%;">
172
+ <?php foreach ( $verification_pages as $item => $label ) : ?>
173
+ <?php
174
+ $selected = isset( $smartcrawl_options['verification-pages'] ) && $smartcrawl_options['verification-pages'] == $item ? " selected='selected'" : '';
175
+ ?>
176
+ <option
177
+ value="<?php echo esc_attr( $item ); ?>"
178
+ <?php echo $selected; ?>>
179
+ <?php echo esc_html( $label ); ?>
180
+ </option>
181
+ <?php endforeach; ?>
182
+ </select>
183
+
184
+ <div class="wds-custom-meta-tags">
185
+ <label for="verification-google" class="wds-label"><?php esc_html_e( 'Custom meta tags', 'wds' ); ?></label>
186
+ <p class="wds-label-description"><?php esc_html_e( 'Have more meta tags you want to add? Add as many as you like.', 'wds' ); ?></p>
187
+
188
+ <?php if ( ! empty( $smartcrawl_options['additional-metas'] ) && is_array( $smartcrawl_options['additional-metas'] ) ) : ?>
189
+ <?php
190
+ foreach ( $smartcrawl_options['additional-metas'] as $custom_value ) {
191
+ $this->_render('settings/settings-custom-meta-tag', array(
192
+ 'value' => $custom_value,
193
+ ));
194
+ }
195
+ ?>
196
+ <?php endif; ?>
197
+
198
+ <?php $this->_render( 'settings/settings-custom-meta-tag' ); ?>
199
+
200
+ <button type="button" class="button button-dark button-dark-o"><?php esc_html_e( 'Add Another', 'wds' ); ?></button>
201
+ </div>
202
+ </div>
203
+ </div>
includes/admin/templates/settings/settings-section-import-export.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="wds-io">
2
+ <div class="wds-table-fields">
3
+ <div class="label">
4
+ <label class="wds-label"><?php esc_html_e( 'Export', 'wds' ); ?></label>
5
+ <p class="wds-label-description"><?php esc_html_e( 'Export your full SmartCrawl configuration to use on another site.', 'wds' ); ?></p>
6
+ </div>
7
+ <div class="fields wds-io wds-export">
8
+ <?php wp_nonce_field( 'wds-export', 'wds-settings-action-export' ); ?>
9
+ <button name="io-action" value="export" class="button button-dark-o"><?php esc_html_e( 'Export', 'wds' ); ?></button>
10
+ </div>
11
+ </div>
12
+
13
+ <div class="wds-table-fields wds-separator-top">
14
+ <div class="label">
15
+ <label class="wds-label"><?php esc_html_e( 'Import', 'wds' ); ?></label>
16
+ <p class="wds-label-description"><?php esc_html_e( 'Use this tool to import your SmartCrawl settings from another site.', 'wds' ); ?></p>
17
+ </div>
18
+ <div class="fields wds-io wds-import">
19
+ <div>
20
+ <label class="wds-label"><?php esc_html_e('SmartCrawl', 'wds') ?></label>
21
+ <p class="wds-label-description">
22
+ <?php esc_html_e('Import your exported SmartCrawl XML settings file.', 'wds'); ?>
23
+ </p>
24
+
25
+ <?php wp_nonce_field('wds-import', 'wds-settings-action-import'); ?>
26
+ <div class="wds-styleable-file-input">
27
+ <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo wp_max_upload_size(); ?>"/>
28
+ <input id="wds_import_json" type="file" name="wds_import_json"/>
29
+ <input type="text" readonly/>
30
+ <label for="wds_import_json" class="button button-dark-o"><?php esc_html_e('Select File', 'wds'); ?></label>
31
+ </div>
32
+ <button name="io-action" value="import" class="button button-dark"><?php esc_html_e('Import', 'wds'); ?></button>
33
+ </div>
34
+ <?php if(is_main_site()): ?>
35
+ <div class="wds-separator-top">
36
+ <label class="wds-label"><?php esc_html_e('Third Party', 'wds') ?></label>
37
+ <p class="wds-label-description">
38
+ <?php esc_html_e('Automatically import your SEO configuration from other SEO plugins.', 'wds'); ?>
39
+ </p>
40
+ <div class="wds-third-party-plugins">
41
+ <div class="wds-yoast wds-third-party-plugin">
42
+ <div class="wds-third-party-plugin-name"><?php esc_html_e('Yoast SEO', 'wds'); ?></div>
43
+ <div class="wds-third-party-plugin-button">
44
+ <button class="button button-dark button-small"><?php esc_html_e('Import', 'wds'); ?></button>
45
+ </div>
46
+ </div>
47
+ <div class="wds-aioseop wds-third-party-plugin">
48
+ <div class="wds-third-party-plugin-name"><?php esc_html_e('All In One SEO', 'wds'); ?></div>
49
+ <div class="wds-third-party-plugin-button">
50
+ <button class="button button-dark button-small"><?php esc_html_e('Import', 'wds'); ?></button>
51
+ </div>
52
+ </div>
53
+ </div>
54
+ <p class="wds-label-description">
55
+ <?php esc_html_e('Automatically import your SEO configuration from other SEO plugins. Note: This will override all of your current settings. We recommend exporting your current settings first, just in case.', 'wds'); ?>
56
+ </p>
57
+ </div>
58
+ <?php endif; ?>
59
+ </div>
60
+ </div>
61
+ </div>
includes/admin/templates/settings/settings-section-user-roles.php ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $seo_metabox_permission_level = empty( $seo_metabox_permission_level ) ? array() : $seo_metabox_permission_level;
3
+ $seo_metabox_301_permission_level = empty( $seo_metabox_301_permission_level ) ? array() : $seo_metabox_301_permission_level;
4
+ $urlmetrics_metabox_permission_level = empty( $urlmetrics_metabox_permission_level ) ? array() : $urlmetrics_metabox_permission_level;
5
+ $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name'];
6
+ ?>
7
+ <input type="hidden" name="<?php echo esc_attr( $option_name ); ?>[saving_user_roles]" value="1" />
8
+ <div class="wds-table-fields">
9
+ <div class="label">
10
+ <label class="wds-label"><?php esc_html_e( 'Access', 'wds' ); ?></label>
11
+ </div>
12
+ <div class="fields">
13
+ <div>
14
+ <label for="seo_metabox_permission_level" class="wds-label"><?php esc_html_e( 'In page SEO meta box', 'wds' ); ?></label>
15
+ <p class="wds-label-description"><?php esc_html_e( 'Choose what user level you want to be able to edit individual post and page meta tags.', 'wds' ); ?></p>
16
+
17
+ <select id="seo_metabox_permission_level"
18
+ name="<?php echo esc_attr( $option_name ); ?>[seo_metabox_permission_level][]"
19
+ class="select-container"
20
+ style="width: 100%;">
21
+ <?php foreach ( $seo_metabox_permission_level as $item => $label ) : ?>
22
+ <?php
23
+ $selected = ! empty( $_view['options']['seo_metabox_permission_level'] ) && is_array( $_view['options']['seo_metabox_permission_level'] )
24
+ ? (in_array( $item, $_view['options']['seo_metabox_permission_level'] ) ? " selected='selected'" : '') // New
25
+ : ($_view['options']['seo_metabox_permission_level'] === $item ? " selected='selected'" : '');
26
+ ?>
27
+ <option
28
+ <?php echo $selected; ?>
29
+ value="<?php echo esc_attr( $item ); ?>">
30
+ <?php echo esc_html( $label ); ?>
31
+ </option>
32
+ <?php endforeach; ?>
33
+ </select>
34
+ </div>
35
+
36
+ <div class="wds-separator-top">
37
+ <label for="seo_metabox_301_permission_level" class="wds-label"><?php esc_html_e( '301 Redirections', 'wds' ); ?></label>
38
+ <p class="wds-label-description"><?php esc_html_e( 'Choose what user level has the ability to add 301 redirects to individual posts and pages.', 'wds' ); ?></p>
39
+
40
+ <select id="seo_metabox_301_permission_level"
41
+ name="<?php echo esc_attr( $option_name ); ?>[seo_metabox_301_permission_level][]"
42
+ class="select-container"
43
+ style="width: 100%;">
44
+ <?php foreach ( $seo_metabox_301_permission_level as $item => $label ) { ?>
45
+ <?php
46
+ $selected = ! empty( $_view['options']['seo_metabox_301_permission_level'] ) && is_array( $_view['options']['seo_metabox_301_permission_level'] )
47
+ ? (in_array( $item, $_view['options']['seo_metabox_301_permission_level'] ) ? " selected='selected'" : '') // New
48
+ : ($_view['options']['seo_metabox_301_permission_level'] === $item ? " selected='selected'" : '');
49
+ ?>
50
+ <option
51
+ <?php echo $selected; ?>
52
+ value="<?php echo esc_attr( $item ); ?>">
53
+ <?php echo esc_html( $label ); ?>
54
+ </option>
55
+ <?php } ?>
56
+ </select>
57
+ </div>
58
+
59
+ <div class="wds-separator-top">
60
+ <label for="urlmetrics_metabox_permission_level" class="wds-label"><?php esc_html_e( 'Show Moz data to roles', 'wds' ); ?></label>
61
+ <p class="wds-label-description"><?php esc_html_e( 'Choose what user level gets to view the Moz data.', 'wds' ); ?></p>
62
+
63
+ <select id="urlmetrics_metabox_permission_level"
64
+ name="<?php echo esc_attr( $option_name ); ?>[urlmetrics_metabox_permission_level][]"
65
+ class="select-container"
66
+ style="width: 100%;">
67
+ <?php foreach ( $urlmetrics_metabox_permission_level as $item => $label ) : ?>
68
+ <?php
69
+ $selected = ! empty( $_view['options']['urlmetrics_metabox_permission_level'] ) && is_array( $_view['options']['urlmetrics_metabox_permission_level'] )
70
+ ? (in_array( $item, $_view['options']['urlmetrics_metabox_permission_level'] ) ? " selected='selected'" : '') // New
71
+ : ($_view['options']['urlmetrics_metabox_permission_level'] === $item ? " selected='selected'" : '');
72
+ ?>
73
+ <option
74
+ <?php echo $selected; ?>
75
+ value="<?php echo esc_attr( $item ); ?>">
76
+ <?php echo esc_html( $label ); ?>
77
+ </option>
78
+ <?php endforeach; ?>
79
+ </select>
80
+ </div>
81
+ </div>
82
+ </div>
includes/admin/templates/settings/settings.php ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="container" class="wrap wrap-wds wds-page wds-page-settings">
2
+
3
+ <section id="header">
4
+ <?php $this->_render( 'settings-message-top' ); ?>
5
+ <h1><?php esc_html_e( 'SmartCrawl Settings' , 'wds' ); ?></h1>
6
+ </section><!-- end header -->
7
+
8
+ <?php
9
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
10
+ if ( ! is_network_admin() && ! smartcrawl_is_allowed_tab( $_view['slug'] ) ) {
11
+ printf( __( "Your network admin prevented access to '%s', please move onto next step.", 'wds' ), __( 'Settings' , 'wds' ) );
12
+ } elseif ( 'settings' === $_view['name'] || ( ! empty( $smartcrawl_options[ $_view['name'] ] ) ) ) {
13
+ ?>
14
+
15
+ <div class="vertical-tabs">
16
+ <?php
17
+ $this->_render('vertical-tab', array(
18
+ 'tab_id' => 'tab_general_settings',
19
+ 'tab_name' => __( 'General Settings', 'wds' ),
20
+ 'is_active' => $active_tab == 'tab_general_settings',
21
+ 'before_output' => $this->_load( '_forms/settings' ),
22
+ 'after_output' => '</form>',
23
+ 'tab_sections' => array(
24
+ array(
25
+ 'section_template' => 'settings/settings-section-general',
26
+ 'section_args' => array(
27
+ 'verification_pages' => $verification_pages,
28
+ 'sitemap_option_name' => $sitemap_option_name,
29
+ 'slugs' => $slugs,
30
+ 'wds_sitewide_mode' => $wds_sitewide_mode,
31
+ 'blog_tabs' => $blog_tabs,
32
+ ),
33
+ ),
34
+ ),
35
+ ));
36
+ ?>
37
+
38
+ <?php
39
+ $this->_render('vertical-tab', array(
40
+ 'tab_id' => 'tab_user_roles',
41
+ 'tab_name' => __( 'User Roles', 'wds' ),
42
+ 'is_active' => $active_tab == 'tab_user_roles',
43
+ 'before_output' => $this->_load( '_forms/settings' ),
44
+ 'after_output' => '</form>',
45
+ 'tab_sections' => array(
46
+ array(
47
+ 'section_template' => 'settings/settings-section-user-roles',
48
+ 'section_args' => array(
49
+ 'seo_metabox_permission_level' => $seo_metabox_permission_level,
50
+ 'seo_metabox_301_permission_level' => $seo_metabox_301_permission_level,
51
+ 'urlmetrics_metabox_permission_level' => $urlmetrics_metabox_permission_level,
52
+ ),
53
+ ),
54
+ ),
55
+ ));
56
+ ?>
57
+
58
+ <?php
59
+ $this->_render('vertical-tab', array(
60
+ 'tab_id' => 'tab_import_export',
61
+ 'tab_name' => __( 'Import / Export', 'wds' ),
62
+ 'is_active' => $active_tab == 'tab_import_export',
63
+ 'button_text' => false,
64
+ 'before_output' => $this->_load( '_forms/import-export' ),
65
+ 'after_output' => '</form>',
66
+ 'tab_sections' => array(
67
+ array(
68
+ 'section_template' => 'settings/settings-section-import-export',
69
+ ),
70
+ ),
71
+ ));
72
+ ?>
73
+ </div>
74
+
75
+ <?php
76
+
77
+ } else {
78
+ printf( __( "You've chosen not to set up '%s', please move onto next step.", 'wds' ), __( 'Settings' , 'wds' ) );
79
+ }
80
+
81
+ ?>
includes/admin/templates/sitemap/sitemap-buddypress-settings.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $groups_enabled = ! empty( $_view['options']['sitemap-buddypress-groups'] ); ?>
2
+ <div class="wds-sitemap-section wds-toggleable <?php echo $groups_enabled ? '' : 'inactive'; ?>">
3
+ <?php
4
+ $this->_render('sitemap/sitemap-part', array(
5
+ 'item' => 'sitemap-buddypress-groups',
6
+ 'item_name' => '',
7
+ 'item_label' => __( 'BuddyPress Groups', 'wds' ),
8
+ 'option_name' => $_view['option_name'] . '[sitemap-buddypress-groups]',
9
+ ));
10
+ ?>
11
+
12
+ <div class="wds-sitemap-sub-section wds-toggleable-inside-box">
13
+ <?php if ( ! empty( $exclude_groups ) ) : ?>
14
+ <?php foreach ( $exclude_groups as $exclude_bp_role => $exclude_bp_role_label ) : ?>
15
+ <?php
16
+ $this->_render('sitemap/sitemap-part', array(
17
+ 'item' => 'sitemap-buddypress-' . $exclude_bp_role,
18
+ 'item_name' => '',
19
+ 'item_label' => $exclude_bp_role_label,
20
+ 'option_name' => $_view['option_name'] . '[exclude_bp_groups][]',
21
+ ));
22
+ ?>
23
+ <?php endforeach; ?>
24
+ <?php endif; ?>
25
+ </div>
26
+ </div>
27
+
28
+ <?php $profiles_enabled = ! empty( $_view['options']['sitemap-buddypress-profiles'] ); ?>
29
+ <div class="wds-sitemap-section wds-toggleable <?php echo $profiles_enabled ? '' : 'inactive'; ?>">
30
+ <?php
31
+ $this->_render('sitemap/sitemap-part', array(
32
+ 'item' => 'sitemap-buddypress-profiles',
33
+ 'item_name' => '',
34
+ 'item_label' => __( 'BuddyPress Profiles', 'wds' ),
35
+ 'option_name' => $_view['option_name'] . '[sitemap-buddypress-profiles]',
36
+ ));
37
+ ?>
38
+
39
+ <div class="wds-sitemap-sub-section wds-toggleable-inside-box">
40
+ <?php if ( ! empty( $exclude_roles ) ) : ?>
41
+ <?php foreach ( $exclude_roles as $exclude_bp_role => $exclude_bp_role_label ) : ?>
42
+ <?php
43
+ $this->_render('sitemap/sitemap-part', array(
44
+ 'item' => 'sitemap-buddypress-roles-' . $exclude_bp_role,
45
+ 'item_name' => '',
46
+ 'item_label' => $exclude_bp_role_label,
47
+ 'option_name' => $_view['option_name'] . '[exclude_bp_roles][]',
48
+ ));
49
+ ?>
50
+ <?php endforeach; ?>
51
+ <?php endif; ?>
52
+ </div>
53
+ </div>
includes/admin/templates/sitemap/sitemap-crawl-content.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @var Smartcrawl_Seo_Service $service
4
+ */
5
+ $open_type = empty( $open_type ) ? null : $open_type;
6
+ $this->_render('url-crawl-master', array(
7
+ 'ready_template' => 'sitemap/sitemap-crawl-results',
8
+ 'ready_args' => array(
9
+ 'open_type' => $open_type,
10
+ ),
11
+ 'no_data_template' => 'sitemap/sitemap-no-crawler-data',
12
+ 'no_data_args' => array(),
13
+ 'progress_template' => 'sitemap/sitemap-progress-bar',
14
+ ));
includes/admin/templates/sitemap/sitemap-crawl-issue-generic.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = empty( $type ) ? '' : $type;
3
+ $report = empty( $report ) ? null : $report;
4
+ $issue_id = empty( $issue_id ) ? null : $issue_id;
5
+
6
+ if ( ! $report || ! $type || ! $issue_id ) {
7
+ return;
8
+ }
9
+
10
+ $issue = $report->get_issue( $issue_id );
11
+ $url = ! empty( $issue['path'] ) ? $issue['path'] : '';
12
+ $path = preg_replace( '/' . preg_quote( home_url(), '/' ) . '/', '', $url );
13
+ ?>
14
+
15
+ <tr data-issue-id="<?php echo esc_attr( $issue_id ); ?>">
16
+ <td>
17
+ <a href="<?php echo esc_attr( $url ); ?>">
18
+ <?php echo esc_html( $path ); ?>
19
+ </a>
20
+ </td>
21
+ <td>
22
+ <?php
23
+ if ( isset( $issue['response'] ) && $issue['response'] ) {
24
+ echo $issue['response'];
25
+ }
26
+ ?>
27
+ </td>
28
+ <td>
29
+ <span class="wds-issues wds-issues-warning">
30
+ <span><?php echo count( $issue['origin'] ); ?></span>
31
+ </span>
32
+ </td>
33
+ <td>
34
+ <?php
35
+ $this->_render('links-dropdown', array(
36
+ 'label' => esc_html__( 'Options', 'wds' ),
37
+ 'links' => array(
38
+ '#ignore' => esc_html__( 'Ignore', 'wds' ),
39
+ '#occurences' => esc_html__( 'List Occurrences', 'wds' ),
40
+ '#redirect' => esc_html__( 'Redirect', 'wds' ),
41
+ ),
42
+ ));
43
+ ?>
44
+ <?php
45
+ $this->_render('sitemap/sitemap-occurrences-overlay', array(
46
+ 'issue_id' => $issue_id,
47
+ 'issue' => $issue,
48
+ ));
49
+ ?>
50
+ <?php
51
+ $this->_render('sitemap/sitemap-redirect-overlay', array(
52
+ 'issue_id' => $issue_id,
53
+ 'issue' => $issue,
54
+ ));
55
+ ?>
56
+ </td>
57
+ </tr>
includes/admin/templates/sitemap/sitemap-crawl-issue-ignored.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = empty( $type ) ? '' : $type;
3
+ $report = empty( $report ) ? null : $report;
4
+ $issue_id = empty( $issue_id ) ? null : $issue_id;
5
+
6
+ if ( ! $report || ! $type || ! $issue_id ) {
7
+ return;
8
+ }
9
+
10
+ $issue = $report->get_issue( $issue_id );
11
+ $url = ! empty( $issue['path'] ) ? $issue['path'] : '';
12
+ $path = preg_replace( '/' . preg_quote( home_url(), '/' ) . '/', '', $url );
13
+ ?>
14
+
15
+ <tr data-issue-id="<?php echo esc_attr( $issue_id ); ?>">
16
+ <td>
17
+ <a href="<?php echo esc_attr( $url ); ?>">
18
+ <?php echo esc_html( $path ); ?>
19
+ </a>
20
+ </td>
21
+ <td>
22
+ <button class="wds-unignore wds-button-with-loader wds-button-with-left-loader wds-disabled-during-request button button-small button-dark button-dark-o"><?php esc_html_e( 'Restore', 'wds' ); ?></button>
23
+ </td>
24
+ </tr>
includes/admin/templates/sitemap/sitemap-crawl-issue-sitemap.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ $type = empty( $type ) ? '' : $type;
4
+ $report = empty( $report ) ? null : $report;
5
+ $issue_id = empty( $issue_id ) ? null : $issue_id;
6
+
7
+ if ( ! $report || ! $type || ! $issue_id ) {
8
+ return;
9
+ }
10
+
11
+ $issue = $report->get_issue( $issue_id );
12
+ $url = ! empty( $issue['path'] ) ? $issue['path'] : '';
13
+ $path = preg_replace( '/' . preg_quote( home_url(), '/' ) . '/', '', $url );
14
+ ?>
15
+
16
+ <tr data-issue-id="<?php echo esc_attr( $issue_id ); ?>" data-path="<?php echo esc_url( $url ); ?>">
17
+ <td>
18
+ <a href="<?php echo esc_attr( $url ); ?>">
19
+ <?php echo esc_html( $path ); ?>
20
+ </a>
21
+ </td>
22
+ <td>
23
+ <?php
24
+ $this->_render('links-dropdown', array(
25
+ 'label' => esc_html__( 'Options', 'wds' ),
26
+ 'links' => array(
27
+ '#add-to-sitemap' => esc_html__( 'Add to Sitemap', 'wds' ),
28
+ '#ignore' => esc_html__( 'Ignore', 'wds' ),
29
+ ),
30
+ ));
31
+ ?>
32
+ </td>
33
+ </tr>
includes/admin/templates/sitemap/sitemap-crawl-issues-3xx.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = empty( $type ) ? '' : $type;
3
+ $report = empty( $report ) ? null : $report;
4
+ $open = empty( $open ) ? false : $open;
5
+
6
+ $this->_render('sitemap/sitemap-crawl-issues-group', array(
7
+ 'type' => $type,
8
+ 'report' => $report,
9
+ 'open' => $open,
10
+ 'title' => esc_html__( '%s URLs have multiple redirections', 'wds' ),
11
+ 'description' => esc_html__( 'Some of your URLs have multiple redirections. In the options menu you can List occurrences to see where these links can be found, and also set up and 301 redirects to a newer version of these pages.', 'wds' ),
12
+ 'header_items' => array(
13
+ sprintf( '<th>%s</th>', esc_html__( 'URLs resulting in errors', 'wds' ) ),
14
+ sprintf( '<th>%s</th>', esc_html__( 'Error Code', 'wds' ) ),
15
+ sprintf( '<th colspan="2">%s</th>', esc_html__( 'Occurrences', 'wds' ) ),
16
+ ),
17
+ ));
18
+
includes/admin/templates/sitemap/sitemap-crawl-issues-4xx.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = empty( $type ) ? '' : $type;
3
+ $report = empty( $report ) ? null : $report;
4
+ $open = empty( $open ) ? false : $open;
5
+
6
+ $this->_render('sitemap/sitemap-crawl-issues-group', array(
7
+ 'type' => $type,
8
+ 'report' => $report,
9
+ 'open' => $open,
10
+ 'title' => esc_html__( '%s URLs are resulting in 4xx errors', 'wds' ),
11
+ 'description' => esc_html__( 'Some of your URLs are resulting in 4xx errors. Either the page no longer exists or the URL has changed. In the options menu you can List occurrences to see where these links can be found, and also set up and 301 redirects to a newer version of these pages.', 'wds' ),
12
+ 'header_items' => array(
13
+ sprintf( '<th>%s</th>', esc_html__( 'URLs resulting in errors', 'wds' ) ),
14
+ sprintf( '<th>%s</th>', esc_html__( 'Error Code', 'wds' ) ),
15
+ sprintf( '<th colspan="2">%s</th>', esc_html__( 'Occurrences', 'wds' ) ),
16
+ ),
17
+ ));
18
+
includes/admin/templates/sitemap/sitemap-crawl-issues-5xx.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = empty( $type ) ? '' : $type;
3
+ $report = empty( $report ) ? null : $report;
4
+ $open = empty( $open ) ? false : $open;
5
+
6
+ $this->_render('sitemap/sitemap-crawl-issues-group', array(
7
+ 'type' => $type,
8
+ 'report' => $report,
9
+ 'open' => $open,
10
+ 'title' => esc_html__( '%s URLs are resulting in 5xx server errors', 'wds' ),
11
+ 'description' => esc_html__( 'Some of your URLs are resulting in 5xx server errors. These errors are indicative of errors in your server-side code. In the options menu you can List occurrences to see where these links can be found, and also set up and 301 redirects to a newer version of these pages.', 'wds' ),
12
+ 'header_items' => array(
13
+ sprintf( '<th>%s</th>', esc_html__( 'URLs resulting in errors', 'wds' ) ),
14
+ sprintf( '<th>%s</th>', esc_html__( 'Error Code', 'wds' ) ),
15
+ sprintf( '<th colspan="2">%s</th>', esc_html__( 'Occurrences', 'wds' ) ),
16
+ ),
17
+ ));
18
+
includes/admin/templates/sitemap/sitemap-crawl-issues-generic-controls.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <tr class="wds-controls-row">
2
+ <td colspan="4">
3
+ <button class="wds-ignore-all wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request button button-small button-dark button-dark-o"><?php esc_html_e( 'Ignore All', 'wds' ); ?></button>
4
+ </td>
5
+ </tr>
includes/admin/templates/sitemap/sitemap-crawl-issues-group.php ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Required
3
+ $type = empty( $type ) ? '' : $type;
4
+ /**
5
+ * @var $report Smartcrawl_SeoReport
6
+ */
7
+ $report = empty( $report ) ? null : $report;
8
+ // Optional
9
+ $title = empty( $title ) ? '' : $title;
10
+ $description = empty( $description ) ? '' : $description;
11
+ $header_items = empty( $header_items ) ? array() : $header_items;
12
+ $controls_template = empty( $controls_template ) ? 'sitemap/sitemap-crawl-issues-generic-controls' : $controls_template;
13
+ $issue_template = empty( $issue_template ) ? 'sitemap/sitemap-crawl-issue-generic' : $issue_template;
14
+ $success_class = empty( $success_class ) ? 'wds-check-success' : $success_class;
15
+ $warning_class = empty( $warning_class ) ? 'wds-check-warning' : $warning_class;
16
+ $open = empty( $open ) ? false : $open;
17
+
18
+ if ( ! $report || ! $type ) {
19
+ return;
20
+ }
21
+ $all_issues = $report->get_issues_by_type( $type, true );
22
+ $ignored_issues = array();
23
+ $active_issues = array();
24
+
25
+ foreach ( $all_issues as $issue_id ) {
26
+ if ( $report->is_ignored_issue( $issue_id ) ) {
27
+ $ignored_issues[] = $issue_id;
28
+ } else {
29
+ $active_issues[] = $issue_id;
30
+ }
31
+ }
32
+
33
+ $issue_count = count( $active_issues );
34
+ $class = $issue_count > 0 ? $warning_class : $success_class;
35
+ ?>
36
+ <div class="wds-issues-type-<?php echo esc_attr( $type ); ?> wds-accordion-section <?php echo esc_attr( $class ); ?> <?php echo $open ? 'open' : ''; ?> <?php echo $all_issues ? '' : 'disabled'; ?>"
37
+ data-type="<?php echo esc_attr( $type ); ?>">
38
+
39
+ <div class="wds-accordion-handle">
40
+ <?php printf( $title, $issue_count > 0 ? $issue_count : esc_html__( 'No', 'wds' ) ); ?>
41
+ </div>
42
+ <?php if ( $all_issues ) : ?>
43
+ <div class="wds-accordion-content">
44
+ <div class="wds-small-text"><strong><?php esc_html_e( 'Overview', 'wds' ); ?></strong></div>
45
+ <p>
46
+ <?php echo esc_html( $description ); ?>
47
+ </p>
48
+ <?php if ( $active_issues ) : ?>
49
+ <table class="wds-list-table wds-crawl-issues-table">
50
+ <thead>
51
+ <tr>
52
+ <?php foreach ( $header_items as $header_item ) : ?>
53
+ <?php echo $header_item; ?>
54
+ <?php endforeach; ?>
55
+ </tr>
56
+ </thead>
57
+ <tbody>
58
+ <?php
59
+ foreach ( $active_issues as $active_issue_id ) {
60
+ $this->_render($issue_template, array(
61
+ 'type' => $type,
62
+ 'report' => $report,
63
+ 'issue_id' => $active_issue_id,
64
+ ));
65
+ }
66
+
67
+ $this->_render( $controls_template );
68
+ ?>
69
+ </tbody>
70
+ </table>
71
+ <?php endif; ?>
72
+
73
+ <?php if ( $ignored_issues ) : ?>
74
+ <table class="wds-list-table wds-ignored-items-table">
75
+ <thead>
76
+ <tr>
77
+ <th colspan="2"><?php esc_html_e( 'Ignored', 'wds' ); ?></th>
78
+ </tr>
79
+ </thead>
80
+ <tbody>
81
+ <?php
82
+ foreach ( $ignored_issues as $ignored_issue_id ) {
83
+ $this->_render('sitemap/sitemap-crawl-issue-ignored', array(
84
+ 'type' => $type,
85
+ 'report' => $report,
86
+ 'issue_id' => $ignored_issue_id,
87
+ ));
88
+ }
89
+ ?>
90
+ </tbody>
91
+ </table>
92
+ <?php endif; ?>
93
+ </div>
94
+ <?php endif; ?>
95
+ </div>
includes/admin/templates/sitemap/sitemap-crawl-issues-inaccessible.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = empty( $type ) ? '' : $type;
3
+ $report = empty( $report ) ? null : $report;
4
+ $open = empty( $open ) ? false : $open;
5
+
6
+ $this->_render('sitemap/sitemap-crawl-issues-group', array(
7
+ 'type' => $type,
8
+ 'report' => $report,
9
+ 'open' => $open,
10
+ 'title' => esc_html__( '%s URLs could not be processed', 'wds' ),
11
+ 'description' => esc_html__( 'Some of your URLs could not be processed by our crawlers. In the options menu you can List occurrences to see where these links can be found, and also set up and 301 redirects to a newer version of these pages.', 'wds' ),
12
+ 'header_items' => array(
13
+ sprintf( '<th>%s</th>', esc_html__( "URLs that couldn't be processed", 'wds' ) ),
14
+ sprintf( '<th>%s</th>', esc_html__( 'Error Code', 'wds' ) ),
15
+ sprintf( '<th colspan="2">%s</th>', esc_html__( 'Occurrences', 'wds' ) ),
16
+ ),
17
+ ));
18
+
includes/admin/templates/sitemap/sitemap-crawl-issues-sitemap-controls.php ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <tr class="wds-controls-row">
2
+ <td>
3
+ <button class="wds-ignore-all wds-button-with-loader wds-button-with-right-loader wds-disabled-during-request button button-small button-dark button-dark-o"><?php esc_html_e( 'Ignore All', 'wds' ); ?></button>
4
+ </td>
5
+ <td>
6
+ <button class="wds-add-all-to-sitemap button wds-button-with-loader wds-button-with-left-loader wds-disabled-during-request button-small"><?php esc_html_e( 'Add All to Sitemap', 'wds' ); ?></button>
7
+ </td>
8
+ </tr>
includes/admin/templates/sitemap/sitemap-crawl-issues-sitemap.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $type = empty( $type ) ? '' : $type;
3
+ $report = empty( $report ) ? null : $report;
4
+ $open = empty( $open ) ? false : $open;
5
+
6
+ $this->_render('sitemap/sitemap-crawl-issues-group', array(
7
+ 'type' => $type,
8
+ 'report' => $report,
9
+ 'open' => $open,
10
+ 'title' => esc_html__( '%s URLs are missing from the sitemap', 'wds' ),
11
+ 'description' => esc_html__( 'SmartCrawl couldn’t find these URLs in your Sitemap. You can choose to add them to your Sitemap, or ignore the warning if you don’t want them included.', 'wds' ),
12
+ 'header_items' => array(
13
+ sprintf( '<th colspan="2">%s</th>', esc_html__( 'Missing URLs', 'wds' ) ),
14
+ ),
15
+ 'issue_template' => 'sitemap/sitemap-crawl-issue-sitemap',
16
+ 'controls_template' => 'sitemap/sitemap-crawl-issues-sitemap-controls',
17
+ 'warning_class' => 'wds-check-invalid',
18
+ ));
19
+
includes/admin/templates/sitemap/sitemap-crawl-results.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * SEO Audit crawl results dispatching template
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ $report = empty( $report ) ? null : $report;
9
+
10
+ if ( null == $report ) {
11
+ return;
12
+ }
13
+
14
+ $active_issues = $report->get_issues_count();
15
+ $ignored_issues = $report->get_ignored_issues_count();
16
+ $open_type = empty( $open_type ) ? null : $open_type;
17
+ $default_issue_types = array( '3xx', '4xx', '5xx', 'inaccessible', 'sitemap' );
18
+ ?>
19
+ <div class="wds-crawl-results-report wds-report"
20
+ data-active-issues="<?php echo esc_attr( $active_issues ); ?>"
21
+ data-ignored-issues="<?php echo esc_attr( $ignored_issues ); ?>">
22
+
23
+ <?php
24
+ if ( $report->has_state_messages() ) {
25
+ foreach ( $report->get_state_messages() as $state_message ) {
26
+ $this->_render('notice', array(
27
+ 'message' => $state_message,
28
+ 'class' => 'wds-notice-error',
29
+ ));
30
+ }
31
+ }
32
+ ?>
33
+
34
+ <?php
35
+ $this->_render('sitemap/sitemap-crawl-stats', array(
36
+ 'active_issues' => $active_issues,
37
+ 'report' => $report,
38
+ ));
39
+ ?>
40
+
41
+ <p><?php esc_html_e( 'Here are potential issues SmartCrawl has picked up. We recommend fixing them up to ensure you aren’t penalized by search engines - you can however ignore any of these warnings.', 'wds' ); ?></p>
42
+
43
+ <?php if ( ! Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SITE )->is_member() ) { ?>
44
+ <div class="wds-obfuscate-section"></div>
45
+ <?php } ?>
46
+
47
+ <div class="wds-accordion">
48
+ <?php
49
+ $issue_types = array_unique( array_replace_recursive( $default_issue_types, $report->get_issue_types() ) );
50
+
51
+ foreach ( $issue_types as $type ) {
52
+ $this->_render('sitemap/sitemap-crawl-issues-' . $type, array(
53
+ 'type' => $type,
54
+ 'report' => $report,
55
+ 'open' => $open_type == $type,
56
+ ));
57
+ }
58
+ ?>
59
+ </div>
60
+ </div>
includes/admin/templates/sitemap/sitemap-crawl-stats.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $active_issues = empty( $active_issues ) ? 0 : $active_issues;
3
+ $report = empty( $report ) ? null : $report;
4
+
5
+ if ( ! $report ) {
6
+ return;
7
+ }
8
+ ?>
9
+
10
+ <div class="wds-url-crawler-stats wds-report-stats">
11
+ <div class="wds-report-score">
12
+ <span class="wds-score <?php echo $active_issues > 0 ? 'wds-score-warning' : 'wds-score-success'; ?>">
13
+ <?php echo $active_issues; ?>
14
+ <span class="wds-total"></span>
15
+ </span>
16
+ <span class="wds-small-text"><?php esc_html_e( 'Sitemap Issues', 'wds' ); ?></span>
17
+ </div>
18
+
19
+ <div>
20
+ <div class="wds-stacked-stats">
21
+ <div>
22
+ <div class="wds-stat-name"><?php esc_html_e( 'Total URLs Discovered', 'wds' ); ?></div>
23
+ <div class="wds-stat-value"><?php echo $report->get_meta( 'total' ); ?></div>
24
+ </div>
25
+ <div>
26
+ <div class="wds-stat-name"><?php esc_html_e( 'Invisible URLs', 'wds' ); ?></div>
27
+ <div class="wds-stat-value"><?php echo $report->get_issues_count( 'sitemap' ); ?></div>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ </div>
includes/admin/templates/sitemap/sitemap-no-crawler-data.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $action_url = esc_url( add_query_arg( 'run-checkup', 'yes' ) ) . '#tab_url_crawler';
3
+
4
+ $this->_render('disabled-component-inner', array(
5
+ 'content' => sprintf(
6
+ '%s<br/>%s',
7
+ __( 'Have SmartCrawl check for broken URLs, 404s, multiple redirections and other harmful', 'wds' ),
8
+ __( 'issues that can reduce your ability to rank in search engines.', 'wds' )
9
+ ),
10
+ 'image' => 'url-crawler-disabled.png',
11
+ 'button_text' => __( 'Begin Crawl', 'wds' ),
12
+ 'button_url' => $action_url,
13
+ 'premium_feature' => true,
14
+ ));
15
+
includes/admin/templates/sitemap/sitemap-occurrences-overlay.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $issue_id = empty( $issue_id ) ? null : $issue_id;
3
+ $issue = empty( $issue ) ? null : $issue;
4
+
5
+ if ( ! $issue_id || ! $issue ) {
6
+ return;
7
+ }
8
+ ?>
9
+ <dialog class="dev-overlay wds-modal wds-occurences"
10
+ id="wds-issue-occurences-<?php echo esc_attr( $issue_id ); ?>"
11
+ title="<?php esc_attr_e( 'List Occurrences', 'wds' ); ?>">
12
+
13
+ <div class="box-content">
14
+ <div class="wds-issue-occurences-list">
15
+ <p>
16
+ <?php
17
+ printf(
18
+ esc_html__( 'We found links to %s in these locations, you might want to remove these links or direct them somewhere else.', 'wds' ),
19
+ '<strong>' . $issue['path'] . '</strong>'
20
+ );
21
+ ?>
22
+ </p>
23
+ <ul class="wds-listing wds-path-occurrences">
24
+ <?php if ( ! empty( $issue['origin'] ) ) : ?>
25
+ <?php foreach ( $issue['origin'] as $origin ) : ?>
26
+ <li>
27
+ <?php $origin = is_array( $origin ) && ! empty( $origin[0] ) ? $origin[0] : $origin; ?>
28
+
29
+ <a href="<?php echo is_string( $origin ) ? esc_url( $origin ) : esc_url( $origin[0] ); ?>">
30
+ <?php echo is_string( $origin ) ? esc_html( $origin ) : esc_html( $origin[0] ); ?>
31
+ </a>
32
+ </li>
33
+ <?php endforeach; ?>
34
+ <?php endif; ?>
35
+ </ul>
36
+ </div>
37
+ <div class="wds-box-footer">
38
+ <button type="button" class="wds-cancel-button button button-dark-o"><?php esc_attr_e( 'Cancel', 'wds' ); ?></button>
39
+ </div>
40
+ </div>
41
+ </dialog>
includes/admin/templates/sitemap/sitemap-part.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $part_excluded = ! empty( $_view['options'][ $item ] );
3
+ $part_checked = $part_excluded ? 'checked="checked"' : '';
4
+ $inverted = empty( $inverted ) ? false : $inverted;
5
+ ?>
6
+ <div class="wds-sitemap-part">
7
+ <span class="wds-sitemap-part-label">
8
+ <label
9
+ class="wds-label wds-label-inline"
10
+ for="<?php echo esc_attr( $item ); ?>">
11
+ <?php echo $item_label; ?>
12
+ </label>
13
+ </span>
14
+ <?php if ( ! empty( $item_name ) ) : ?>
15
+ <span class="wds-sitemap-part-name">
16
+ <?php echo $item_name; ?>
17
+ </span>
18
+ <?php endif; ?>
19
+ <span class="wds-sitemap-part-toggle">
20
+ <span class="toggle wds-toggle <?php echo $inverted ? 'wds-inverted-toggle' : ''; ?>">
21
+ <input
22
+ class="toggle-checkbox"
23
+ value='<?php echo esc_attr( $item ); ?>'
24
+ <?php echo $part_checked; ?>
25
+ id='<?php echo esc_attr( $item ); ?>'
26
+ name="<?php echo esc_attr( $option_name ); ?>"
27
+ type='checkbox'/>
28
+
29
+ <label class="toggle-label" for="<?php echo $item; ?>"></label>
30
+ </span>
31
+ </span>
32
+ </div>
includes/admin/templates/sitemap/sitemap-progress-bar.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $progress = empty( $progress ) ? 0 : $progress; ?>
2
+
3
+ <div class="wds-crawl-results-report wds-report">
4
+ <div class="wds-url-crawler-progress">
5
+ <?php
6
+ $this->_render('progress-bar', array(
7
+ 'progress' => $progress,
8
+ ));
9
+ ?>
10
+ <?php $this->_render( 'progress-notice' ); ?>
11
+ </div>
12
+ </div>
includes/admin/templates/sitemap/sitemap-redirect-overlay.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $issue_id = empty( $issue_id ) ? null : $issue_id;
3
+ $issue = empty( $issue ) ? null : $issue;
4
+ $issue_path = smartcrawl_get_array_value( $issue, 'path' );
5
+
6
+ if ( ! $issue_id || ! $issue || ! $issue_path ) {
7
+ return;
8
+ }
9
+
10
+ $rmodel = new Smartcrawl_Model_Redirection;
11
+ $redirections = $rmodel->get_all_redirections();
12
+ $redirection_target = ! empty( $redirections[ $issue_path ] ) ? esc_url( $redirections[ $issue_path ] ) : '';
13
+ ?>
14
+ <dialog class="dev-overlay wds-modal wds-redirect wds-report"
15
+ id="wds-issue-redirect-<?php echo esc_attr( $issue_id ); ?>"
16
+ title="<?php esc_attr_e( 'Redirect URL', 'wds' ); ?>">
17
+
18
+ <div class="box-content modal wds-form"
19
+ data-issue-id="<?php echo esc_attr( $issue_id ); ?>">
20
+
21
+ <p>
22
+ <?php
23
+ printf(
24
+ esc_html__( 'Choose where to redirect %s', 'wds' ),
25
+ '<strong>' . $issue_path . '</strong>'
26
+ );
27
+ ?>
28
+ </p>
29
+ <div class="wds-table-fields wds-table-fields-stacked">
30
+ <div class="label">
31
+ <label for="wds-redirect-target-<?php echo $issue_id; ?>" class="wds-label"><?php esc_html_e( 'New URL', 'wds' ); ?></label>
32
+ </div>
33
+ <div class="fields">
34
+ <input id="wds-redirect-target-<?php echo $issue_id; ?>"
35
+ type="url"
36
+ name="redirect"
37
+ value="<?php echo esc_attr( $redirection_target ); ?>"
38
+ class="wds-field"
39
+ placeholder="<?php esc_attr_e( 'Enter new URL', 'wds' ); ?>"/>
40
+ <p class="wds-field-legend">
41
+ <?php
42
+ $advanced_url = Smartcrawl_Settings_Admin::admin_url( Smartcrawl_Settings::TAB_AUTOLINKS );
43
+ printf(
44
+ esc_html__( 'Formats include relative (E.g. %1$s) or absolute URLs (E.g. %1$s or %1$s). This will set up a 301 (permanent) redirect from one URL to another, you can view all your redirections under %1$s.', 'wds' ),
45
+ sprintf( '<strong>%s</strong>', esc_html__( '/cats', 'wds' ) ),
46
+ sprintf( '<strong>%s</strong>', esc_html__( 'www.website.com/cats', 'wds' ) ),
47
+ sprintf( '<strong>%s</strong>', esc_html__( 'https://website.com/cats', 'wds' ) ),
48
+ sprintf( '<strong><a href="%s">%s</a></strong>', $advanced_url, esc_html__( 'Advanced Tools', 'wds' ) )
49
+ );
50
+ ?>
51
+ </p>
52
+ </div>
53
+ </div>
54
+ <div class="wds-box-footer">
55
+ <input type="hidden" name="source" value="<?php echo esc_url( $issue_path ); ?>"/>
56
+ <?php wp_nonce_field( 'wds-redirect', 'wds-redirect' ); ?>
57
+ <button type="button" class="button button-dark-o wds-cancel-button wds-disabled-during-request"><?php esc_html_e( 'Cancel', 'wds' ); ?></button>
58
+ <button type="button" class="button wds-action-button wds-submit-redirect wds-button-with-loader wds-button-with-left-loader wds-disabled-during-request"><?php esc_html_e( 'Add Redirect', 'wds' ); ?></button>
59
+ </div>
60
+ </div>
61
+ </dialog>
includes/admin/templates/sitemap/sitemap-section-advanced.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $engines = empty( $engines ) ? array() : $engines;
3
+ ?>
4
+
5
+ <?php
6
+ $this->_render('toggle-group', array(
7
+ 'label' => __( 'Include images', 'wds' ),
8
+ 'description' => __( 'If your posts contain imagery you would like others to be able to search, this setting will help Google Images index them correctly.', 'wds' ),
9
+ 'items' => array(
10
+ 'sitemap-images' => array(
11
+ 'label' => __( 'Include image items with the sitemap', 'wds' ),
12
+ 'description' => __( 'Note: When uploading attachments to posts, be sure to add titles and captions that clearly describe your images.', 'wds' ),
13
+ 'value' => '1',
14
+ ),
15
+ ),
16
+ ));
17
+
18
+ $this->_render('toggle-group', array(
19
+ 'label' => __( 'Auto-notify search engines', 'wds' ),
20
+ 'description' => __( 'Instead of waiting for search engines to crawl your website you can automatically submit your sitemap whenever it changes.', 'wds' ),
21
+ 'separator' => true,
22
+ 'items' => $engines,
23
+ ));
24
+
25
+ $this->_render('toggle-group', array(
26
+ 'label' => __( 'Style sitemap', 'wds' ),
27
+ 'description' => __( 'Adds some nice styling to your sitemap.', 'wds' ),
28
+ 'separator' => true,
29
+ 'items' => array(
30
+ 'sitemap-stylesheet' => array(
31
+ 'label' => __( 'Include stylesheet with sitemap', 'wds' ),
32
+ 'description' => __( 'Note: This doesn’t affect your SEO and is purely visual.', 'wds' ),
33
+ 'value' => '1',
34
+ ),
35
+ ),
36
+ ));
37
+ ?>
38
+
39
+ <?php $automatic_updates_disabled = ! empty( $_view['options']['sitemap-disable-automatic-regeneration'] ); ?>
40
+ <div class="wds-toggleable wds-disable-updates <?php echo $automatic_updates_disabled ? '' : 'inactive'; ?>">
41
+ <?php
42
+ $this->_render('toggle-group', array(
43
+ 'label' => __( 'Automatic sitemap updates', 'wds' ),
44
+ 'description' => __( 'Choose whether or not you want SmartCrawl to update your Sitemap automatically when you publish new pages, posts, post types or taxonomies.', 'wds' ),
45
+ 'separator' => true,
46
+ 'items' => array(
47
+ 'sitemap-disable-automatic-regeneration' => array(
48
+ 'label' => __( 'Automatically update my sitemap', 'wds' ),
49
+ 'inverted' => true,
50
+ 'html_description' => sprintf(
51
+ '<div class="wds-toggleable-inside wds-notice wds-notice-warning"><p>%s</p></div>',
52
+ __( 'Your sitemap isn’t being updated automatically. Click Save Settings below to regenerate your sitemap.', 'wds' )
53
+ ),
54
+ ),
55
+ ),
56
+ ));
57
+ ?>
58
+ </div>
includes/admin/templates/sitemap/sitemap-section-reporting.php ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SEO );
3
+ $cron = Smartcrawl_Controller_Cron::get();
4
+ $option_name = $_view['option_name'];
5
+
6
+ // This does the actual rescheduling
7
+ $cron->set_up_schedule();
8
+ $crawler_cron_enabled = $_view['options']['crawler-cron-enable'];
9
+ $toggle_field_name = $option_name . '[crawler-cron-enable]';
10
+ ?>
11
+
12
+ <?php if ( ! $service->is_member() ) : ?>
13
+ <div class="wds-obfuscate-section"></div>
14
+ <?php endif; ?>
15
+
16
+ <div class="wds-table-fields wds-toggleable">
17
+ <div class="label">
18
+ <label class="wds-label"
19
+ for="<?php echo esc_attr( $toggle_field_name ); ?>">
20
+
21
+ <?php esc_html_e( 'Schedule Crawl', 'wds' ); ?>
22
+ </label>
23
+ </div>
24
+ <div class="fields wds-toggleable <?php echo $crawler_cron_enabled ? '' : 'inactive'; ?>">
25
+ <?php
26
+ $this->_render('toggle-item', array(
27
+ 'field_name' => $toggle_field_name,
28
+ 'field_id' => $toggle_field_name,
29
+ 'checked' => checked( $crawler_cron_enabled, true, false ),
30
+ 'item_label' => esc_html__( 'Run regular URL crawls', 'wds' ),
31
+ ));
32
+ ?>
33
+ <div class="wds-toggleable-inside wds-toggleable-inside-box">
34
+ <div class="wds-table-fields wds-table-fields-stacked">
35
+ <div class="label">
36
+ <label for="wds-crawler-frequency" class="wds-label"><?php esc_html_e( 'Frequency', 'wds' ); ?></label>
37
+ </div>
38
+ <div class="fields">
39
+ <select class="select-container wds-conditional-parent"
40
+ id="wds-crawler-frequency"
41
+ name="<?php echo esc_attr( $_view['option_name'] ); ?>[crawler-frequency]"
42
+ style="width: 100%">
43
+
44
+ <?php foreach ( $cron->get_frequencies() as $key => $label ) : ?>
45
+ <option value="<?php echo esc_attr( $key ); ?>" <?php selected( $key, $_view['options']['crawler-frequency'] ); ?>>
46
+ <?php echo esc_html( $label ); ?>
47
+ </option>
48
+ <?php endforeach; ?>
49
+ </select>
50
+ </div>
51
+ </div>
52
+
53
+ <div class="wds-table-fields wds-table-fields-stacked wds-conditional-child"
54
+ data-parent="wds-crawler-frequency"
55
+ data-parent-val="weekly,monthly">
56
+
57
+ <div class="label">
58
+ <label for="wds-crawler-dow" class="wds-label"><?php esc_html_e( 'Day of the week', 'wds' ); ?></label>
59
+ </div>
60
+ <div class="fields">
61
+ <select class="select-container"
62
+ id="wds-crawler-dow"
63
+ name="<?php echo esc_attr( $_view['option_name'] ); ?>[crawler-dow]"
64
+ style="width: 100%">
65
+
66
+ <?php $monday = strtotime( 'this Monday' ); ?>
67
+ <?php foreach ( range( 0, 6 ) as $dow ) : ?>
68
+ <option value="<?php echo esc_attr( $dow ); ?>"
69
+ <?php selected( $dow, $_view['options']['crawler-dow'] ); ?>>
70
+ <?php echo esc_html( date_i18n( 'l', $monday + ($dow * DAY_IN_SECONDS) ) ); ?>
71
+ </option>
72
+ <?php endforeach; ?>
73
+ </select>
74
+ </div>
75
+ </div>
76
+
77
+ <div class="wds-table-fields wds-table-fields-stacked">
78
+ <div class="label">
79
+ <label for="wds-crawler-tod" class="wds-label"><?php esc_html_e( 'Time of day', 'wds' ); ?></label>
80
+ </div>
81
+ <div class="fields">
82
+ <select class="select-container"
83
+ id="wds-crawler-tod"
84
+ name="<?php echo esc_attr( $_view['option_name'] ); ?>[crawler-tod]"
85
+ style="width: 100%">
86
+
87
+ <?php $midnight = strtotime( 'today' ); ?>
88
+ <?php foreach ( range( 0, 23 ) as $tod ) : ?>
89
+ <option value="<?php echo esc_attr( $tod ); ?>"
90
+ <?php selected( $tod, $_view['options']['crawler-tod'] ); ?>>
91
+ <?php echo esc_html( date_i18n( get_option( 'time_format' ), $midnight + ($tod * HOUR_IN_SECONDS) ) ); ?>
92
+ </option>
93
+ <?php endforeach; ?>
94
+ </select>
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </div>
99
+
100
+ </div>
includes/admin/templates/sitemap/sitemap-section-settings.php ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Sitemaps admin page, Sitemap vertical tab
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ $post_types = empty( $post_types ) ? array() : $post_types;
9
+ $taxonomies = empty( $taxonomies ) ? array() : $taxonomies;
10
+ $smartcrawl_buddypress = empty( $smartcrawl_buddypress ) ? array() : $smartcrawl_buddypress;
11
+ $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name'];
12
+ $extra_urls = empty( $extra_urls ) ? '' : $extra_urls;
13
+ $ignore_urls = empty( $ignore_urls ) ? '' : $ignore_urls;
14
+ $ignore_post_ids = empty( $ignore_post_ids ) ? '' : $ignore_post_ids;
15
+ ?>
16
+
17
+ <?php if ( Smartcrawl_Xml_Sitemap::is_sitemap_path_writable() ) { ?>
18
+ <div class="wds-notice wds-notice-success">
19
+ <p>
20
+ <?php
21
+ printf(
22
+ __( 'Your sitemap is available at %s', 'wds' ),
23
+ sprintf( '<a target="_blank" href="%s">/sitemap.xml</a>', esc_attr( smartcrawl_get_sitemap_url() ) )
24
+ );
25
+ ?>
26
+ </p>
27
+ </div>
28
+ <?php } else { ?>
29
+ <div class="wds-notice wds-notice-error">
30
+ <p>
31
+ <?php
32
+ printf(
33
+ __( 'Unable to write to sitemap file: <code>%s</code>', 'wds' ),
34
+ esc_html( smartcrawl_get_sitemap_path() )
35
+ );
36
+ ?>
37
+ </p>
38
+ </div>
39
+ <?php } ?>
40
+
41
+ <div class="wds-table-fields-group">
42
+ <div class="wds-table-fields wds-separator-top">
43
+ <div class="label">
44
+ <label class="wds-label"><?php _e( 'Include' , 'wds' ); ?></label>
45
+ <span class="wds-label-description">
46
+ <?php _e( 'Choose which post types, archives and taxonomies you wish to include in your sitemap.', 'wds' ); ?>
47
+ </span>
48
+ </div>
49
+ <div class="fields">
50
+ <div class="wds-sitemap-parts">
51
+ <?php foreach ( $post_types as $item => $post_type ) : ?>
52
+ <?php
53
+ $this->_render('sitemap/sitemap-part', array(
54
+ 'item' => $item,
55
+ 'item_name' => $post_type->name,
56
+ 'item_label' => $post_type->label,
57
+ 'inverted' => true,
58
+ 'option_name' => $option_name . '[exclude_post_types][]',
59
+ ));
60
+ ?>
61
+ <?php endforeach; ?>
62
+
63
+ <?php foreach ( $taxonomies as $item => $taxonomy ) : ?>
64
+ <?php
65
+ $this->_render('sitemap/sitemap-part', array(
66
+ 'item' => $item,
67
+ 'item_name' => $taxonomy->name,
68
+ 'item_label' => $taxonomy->label,
69
+ 'inverted' => true,
70
+ 'option_name' => $option_name . '[exclude_taxonomies][]',
71
+ ));
72
+ ?>
73
+ <?php endforeach; ?>
74
+
75
+ <?php
76
+ if ( $smartcrawl_buddypress ) {
77
+ $this->_render( 'sitemap/sitemap-buddypress-settings', $smartcrawl_buddypress );
78
+ }
79
+ ?>
80
+
81
+ </div>
82
+ </div>
83
+ </div>
84
+
85
+ <div class="wds-table-fields wds-separator-top">
86
+ <div class="label">
87
+ <label for="<?php echo $option_name; ?>[extra_sitemap_urls]" class="wds-label"><?php _e( 'Extra URLs', 'wds' ); ?></label>
88
+ <span class="wds-label-description">
89
+ <?php esc_html_e( "Enter any additional URLs that aren't part of your default pages, posts or custom post types.", 'wds' ); ?>
90
+ </span>
91
+ </div>
92
+
93
+ <div class="fields">
94
+ <textarea id="<?php echo $option_name; ?>[extra_sitemap_urls]"
95
+ name="<?php echo $option_name; ?>[extra_sitemap_urls]"><?php echo esc_textarea( $extra_urls ); ?></textarea>
96
+ <span class="wds-field-legend">
97
+ <?php esc_html_e( 'Enter one URL per line', 'wds' ); ?>
98
+ </span>
99
+ </div>
100
+ </div>
101
+
102
+ <div class="wds-table-fields wds-separator-top">
103
+ <div class="label">
104
+ <label for="<?php echo $option_name; ?>[sitemap_ignore_urls]" class="wds-label"><?php _e( 'Exclusions', 'wds' ); ?></label>
105
+ <span class="wds-label-description">
106
+ <?php esc_html_e( 'If you have custom URLs you want explicitly excluded from your Sitemap you can do this here.', 'wds' ); ?>
107
+ </span>
108
+ </div>
109
+
110
+ <div class="fields">
111
+ <div>
112
+ <label for="<?php echo $option_name; ?>[sitemap_ignore_post_ids]" class="wds-label"><?php _e( 'Posts', 'wds' ); ?></label>
113
+ <span class="wds-field-legend">
114
+ <?php esc_html_e( 'Enter any particular post IDs you wish to exclude from your sitemap. Note, you can also exclude posts and pages from the post editor page.', 'wds' ); ?>
115
+ </span>
116
+ <input type="text" id="<?php echo $option_name; ?>[sitemap_ignore_post_ids]"
117
+ placeholder="<?php echo esc_attr( __( 'e.g. 1,5,6,99', 'wds' ) ); ?>"
118
+ name="<?php echo $option_name; ?>[sitemap_ignore_post_ids]" value="<?php echo esc_attr( $ignore_post_ids ); ?>" />
119
+ <span class="wds-field-legend">
120
+ <?php esc_html_e( 'Enter post IDs separated by commas.', 'wds' ); ?>
121
+ </span>
122
+ </div>
123
+
124
+ <div class="wds-separator-top">
125
+ <label for="<?php echo $option_name; ?>[sitemap_ignore_urls]" class="wds-label"><?php _e( 'Custom URLs', 'wds' ); ?></label>
126
+ <span class="wds-field-legend">
127
+ <?php esc_html_e( 'Enter any custom URLs you want excluded permanently from the sitemap.', 'wds' ); ?>
128
+ </span>
129
+ <textarea id="<?php echo $option_name; ?>[sitemap_ignore_urls]"
130
+ placeholder="<?php echo esc_attr( __( 'e.g. /excluded-url', 'wds' ) ); ?>"
131
+ name="<?php echo $option_name; ?>[sitemap_ignore_urls]"><?php echo esc_textarea( $ignore_urls ); ?></textarea>
132
+ <span class="wds-field-legend">
133
+ <?php esc_html_e( 'Enter one URL per line', 'wds' ); ?>
134
+ </span>
135
+ </div>
136
+ </div>
137
+ </div>
138
+
139
+ </div>
includes/admin/templates/sitemap/sitemap-section-url-crawler.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php $this->_render( 'sitemap/sitemap-crawl-content' );
includes/admin/templates/sitemap/sitemap-settings.php ADDED
@@ -0,0 +1,195 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $sitemap_tab_id = 'tab_sitemap';
3
+ $sitemap_tab_name = __( 'Sitemap', 'wds' );
4
+ $url_crawler_tab_id = 'tab_url_crawler';
5
+ $url_crawler_tab_name = __( 'URL Crawler', 'wds' );
6
+ ?>
7
+
8
+ <div id="container" class="wrap wrap-wds wds-page wds-sitemap-settings">
9
+
10
+ <section id="header">
11
+ <?php $this->_render( 'settings-message-top' ); ?>
12
+ <?php if ( Smartcrawl_Settings::get_setting( 'sitemap' ) ) { ?>
13
+ <div class="actions">
14
+ <?php
15
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SEO );
16
+ $end = $service->get_last_run_timestamp();
17
+ $end = ! empty( $end ) && is_numeric( $end )
18
+ ? date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $end )
19
+ : __( 'Never', 'wds' );
20
+
21
+ printf(
22
+ __( 'Last crawl: %s', 'wds' ),
23
+ $end
24
+ );
25
+ ?>
26
+ <?php if ( ! $service->in_progress() ) { ?>
27
+ <a href="<?php echo esc_url( add_query_arg( 'run-crawl', 'yes' ) ); ?>" class="button button-small">
28
+ <?php esc_html_e( 'New crawl', 'wds' ); ?>
29
+ </a>
30
+ <?php } ?>
31
+ </div>
32
+ <?php } ?>
33
+ <h1>
34
+ <?php esc_html_e( 'Sitemaps', 'wds' ); ?>
35
+ <span class="toggle wds-toggle wds-has-tooltip"
36
+ data-content="<?php echo Smartcrawl_Settings::get_setting( 'sitemap' ) ? __( 'Turn off automated sitemap' ) : __( 'Turn on automated sitemap' ); ?>"
37
+ data-position='{"my":"left center","at":"right center"}'>
38
+ <input class="toggle-checkbox sitemap-status-toggle"
39
+ value="1"
40
+ id="sitemap-status-toggle"
41
+ autocomplete="off"
42
+ type="checkbox" <?php checked( Smartcrawl_Settings::get_setting( 'sitemap' ) ); ?>>
43
+ <label class="toggle-label" for="sitemap-status-toggle"></label>
44
+ </span>
45
+ </h1>
46
+ </section><!-- end header -->
47
+
48
+ <div class="wds-url-crawler-stats-container"></div>
49
+
50
+ <?php
51
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
52
+ if ( ! smartcrawl_is_allowed_tab( $_view['slug'] ) ) {
53
+ printf( __( "Your network admin prevented access to '%s', please move onto next step.", 'wds' ), __( 'Sitemaps' , 'wds' ) );
54
+ } elseif ( 'settings' === $_view['name'] || ( ! empty( $smartcrawl_options[ $_view['name'] ] ) ) ) {
55
+
56
+ ?>
57
+ <form action='<?php echo esc_attr( $_view['action_url'] ); ?>' method='post' class="wds-form">
58
+ <?php settings_fields( $_view['option_name'] ); ?>
59
+
60
+ <input type="hidden" name='<?php echo esc_attr( $_view['option_name'] ); ?>[<?php echo esc_attr( $_view['slug'] ); ?>-setup]' value="1">
61
+
62
+ <div class="vertical-tabs" id="sitemap-settings-tabs">
63
+ <?php
64
+ $this->_render('vertical-tab', array(
65
+ 'tab_id' => $sitemap_tab_id,
66
+ 'tab_name' => $sitemap_tab_name,
67
+ 'is_active' => $active_tab == $sitemap_tab_id,
68
+ 'tab_sections' => array(
69
+ array(
70
+ 'section_description' => __( 'Automatically generate a sitemap and regularly send updates to Google.', 'wds' ),
71
+ 'section_template' => 'sitemap/sitemap-section-settings',
72
+ 'section_args' => array(
73
+ 'post_types' => $post_types,
74
+ 'taxonomies' => $taxonomies,
75
+ 'wds_buddypress' => $wds_buddypress,
76
+ 'extra_urls' => ! empty( $extra_urls ) ? $extra_urls : '',
77
+ 'ignore_urls' => ! empty( $ignore_urls ) ? $ignore_urls : '',
78
+ 'ignore_post_ids' => ! empty( $ignore_post_ids ) ? $ignore_post_ids : '',
79
+ ),
80
+ ),
81
+ ),
82
+ ));
83
+ ?>
84
+
85
+ <?php
86
+
87
+ $is_member = $service->is_member();
88
+ ?>
89
+
90
+ <?php
91
+ $this->_render(
92
+ $is_member ? 'vertical-tab' : 'report-vertical-tab',
93
+ array(
94
+ 'tab_id' => $url_crawler_tab_id,
95
+ 'tab_name' => $url_crawler_tab_name,
96
+ 'is_active' => $active_tab == $url_crawler_tab_id,
97
+ 'title_button' => 'upgrade',
98
+ 'tab_sections' => array(
99
+ array(
100
+ 'section_template' => 'sitemap/sitemap-section-url-crawler',
101
+ ),
102
+ ),
103
+ ));
104
+ ?>
105
+
106
+ <?php
107
+ $this->_render(
108
+ $is_member ? 'vertical-tab' : 'report-vertical-tab',
109
+ array(
110
+ 'tab_id' => 'tab_url_crawler_reporting',
111
+ 'tab_name' => __( 'Reporting', 'wds' ),
112
+ 'is_active' => $active_tab == 'tab_url_crawler_reporting',
113
+ 'title_button' => 'upgrade',
114
+ 'tab_sections' => array(
115
+ array(
116
+ 'section_description' => esc_html__( 'Set up SmartCrawl to automatically crawl your URLs daily, weekly or monthly and send an email report to as many recipients as you like.', 'wds' ),
117
+ 'section_template' => 'sitemap/sitemap-section-reporting',
118
+ ),
119
+ ),
120
+ )
121
+ );
122
+ ?>
123
+
124
+ <?php
125
+ $this->_render('vertical-tab', array(
126
+ 'tab_id' => 'tab_advanced',
127
+ 'tab_name' => __( 'Advanced', 'wds' ),
128
+ 'is_active' => $active_tab == 'tab_advanced',
129
+ 'tab_sections' => array(
130
+ array(
131
+ 'section_template' => 'sitemap/sitemap-section-advanced',
132
+ 'section_args' => array(
133
+ 'engines' => $engines,
134
+ ),
135
+ ),
136
+ ),
137
+ ));
138
+ ?>
139
+ </div>
140
+ </form>
141
+ <?php } else { ?>
142
+ <form method="post" class="wds-form">
143
+ <div class="vertical-tabs" id="sitemap-settings-tabs">
144
+ <?php
145
+ $this->_render('vertical-tab', array(
146
+ 'tab_id' => $sitemap_tab_id,
147
+ 'tab_name' => $sitemap_tab_name,
148
+ 'is_active' => $active_tab == $sitemap_tab_id,
149
+ 'button_text' => false,
150
+ 'tab_sections' => array(
151
+ array(
152
+ 'section_template' => 'disabled-component-inner',
153
+ 'section_args' => array(
154
+ 'content' => sprintf(
155
+ '%s<br/>%s',
156
+ __( 'Automatically generate a full sitemap, regularly send updates to search engines and set up', 'wds' ),
157
+ __( 'SmartCrawl to automatically check URLs are discoverable by search engines.', 'wds' )
158
+ ),
159
+ 'image' => 'sitemap-disabled.png',
160
+ 'component' => 'sitemap',
161
+ 'button_text' => __( 'Activate Sitemap', 'wds' ),
162
+ ),
163
+ ),
164
+ ),
165
+ ));
166
+
167
+ $this->_render('vertical-tab', array(
168
+ 'tab_id' => $url_crawler_tab_id,
169
+ 'tab_name' => $url_crawler_tab_name,
170
+ 'is_active' => $active_tab == $url_crawler_tab_id,
171
+ 'button_text' => false,
172
+ 'tab_sections' => array(
173
+ array(
174
+ 'section_template' => 'disabled-component-inner',
175
+ 'section_args' => array(
176
+ 'content' => sprintf(
177
+ '%s<br/>%s',
178
+ __( 'Have SmartCrawl check for broken URLs, 404s, multiple redirections and other harmful', 'wds' ),
179
+ __( 'issues that can reduce your ability to rank in search engines.', 'wds' )
180
+ ),
181
+ 'image' => 'url-crawler-disabled.png',
182
+ 'component' => 'sitemap',
183
+ 'button_text' => __( 'Activate Sitemap', 'wds' ),
184
+ 'notice' => esc_html__( 'You must activate the Sitemap feature to use the URL crawler.', 'wds' ),
185
+ ),
186
+ ),
187
+ ),
188
+ ));
189
+ ?>
190
+ </div>
191
+ </form>
192
+ <?php } ?>
193
+ <?php $this->_render( 'upsell-modal' ); ?>
194
+
195
+ </div><!-- end wds-sitemap-settings -->
includes/admin/templates/sitemaps-dashboard-widget.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <div style='width:45%;float:left'>
3
+ <div><?php printf( __( 'Your sitemap contains <a href="%1$s" target="_blank"><b>%2$d</b> items</a>.', 'wds' ), $sitemap_url, (int) @$opts['items'] ); ?></div>
4
+ <br /><?php echo esc_html( $datetime ); ?>
5
+ <p><a href='#update_sitemap' id='wds_update_now'><?php echo esc_html( $update_sitemap ); ?></a></p>
6
+ </div>
7
+
8
+ <div style='width:45%;float:right'>
9
+ <?php if ( $engines ) { ?>
10
+ <ul>
11
+ <?php
12
+ foreach ( $engines as $key => $engine ) {
13
+ $service = ucfirst( $key );
14
+ $edate = @$engine['time'] ? date( get_option( 'date_format' ), $engine['time'] ) : false;
15
+ $etime = @$engine['time'] ? date( get_option( 'time_format' ), $engine['time'] ) : false;
16
+ $edatetime = ($edate && $etime) ? sprintf( __( 'Last notified on %1$s, at %1$s.', 'wds' ), $date, $time ) : __( 'Not notified', 'wds' );
17
+ ?>
18
+ <li><b><?php echo esc_html( $service ); ?>:</b> <?php echo esc_html( $edatetime ); ?></li>
19
+ <?php } ?>
20
+
21
+ </ul>
22
+
23
+ <?php } else { ?>
24
+ <?php _e( "<div>Search engines haven't been recently updated</div>", 'wds' ); ?>
25
+ <?php } ?>
26
+
27
+ <p><a href='#update_search_engines' id='wds_update_engines'><?php echo esc_html( $update_engines ); ?></a></p>
28
+ </div>
29
+ <div style='clear:both'></div>
30
+
31
+ <script type="text/javascript">
32
+ ;(function ($) {
33
+ $(function () {
34
+ $( "#smartcrawl_update_now" ).click(function () {
35
+ var me = $( this );
36
+ me.html( "<?php echo esc_js( $working ); ?>" );
37
+
38
+ $.post(ajaxurl, { "action": "wds_update_sitemap" }, function () {
39
+ me.html( "<?php echo esc_js( $done_msg ); ?>" );
40
+ window.location.reload();
41
+ });
42
+
43
+ return false;
44
+ });
45
+
46
+ $("#smartcrawl_update_engines").click(function () {
47
+ var me = $( this );
48
+ me.html( "<?php echo esc_js( $working ); ?>" );
49
+
50
+ $.post( ajaxurl, { "action": "wds_update_engines" }, function () {
51
+ me.html( "<?php echo esc_js( $done_msg ); ?>" );
52
+ window.location.reload();
53
+ } );
54
+
55
+ return false;
56
+ });
57
+ });
58
+ })(jQuery);
59
+ </script>
includes/admin/templates/social/social-section-accounts.php ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $options = empty( $options ) ? $_view['options'] : $options;
3
+ ?>
4
+
5
+ <div class="wds-table-fields wds-separator-top">
6
+ <div class="label">
7
+ <label class="wds-label" for="website_name"><?php esc_html_e( 'Website name', 'wds' ); ?></label>
8
+ </div>
9
+ <div class="fields">
10
+ <input type="text" id="website_name" name="<?php echo esc_attr( $_view['option_name'] ); ?>[sitename]"
11
+ value="<?php echo esc_attr( $options['sitename'] ); ?>"/>
12
+ </div>
13
+ </div>
14
+
15
+ <div class="wds-table-fields">
16
+ <div class="label">
17
+ <label class="wds-label" for="schema_type"><?php esc_html_e( 'Type', 'wds' ); ?></label>
18
+ </div>
19
+ <div class="fields">
20
+ <div class="wds-conditional">
21
+ <select id="schema_type"
22
+ name="<?php echo esc_attr( $_view['option_name'] ); ?>[schema_type]"
23
+ class="select-container" style="width: 100%">
24
+ <option
25
+ <?php selected( $options['schema_type'], Smartcrawl_Schema_Printer::PERSON ); ?>
26
+ value="<?php echo esc_attr( Smartcrawl_Schema_Printer::PERSON ); ?>">
27
+ <?php esc_html_e( 'Person', 'wds' ); ?>
28
+ </option>
29
+
30
+ <option
31
+ <?php selected( $options['schema_type'], Smartcrawl_Schema_Printer::ORGANIZATION ); ?>
32
+ value="<?php echo esc_attr( Smartcrawl_Schema_Printer::ORGANIZATION ); ?>">
33
+ <?php esc_html_e( 'Organization', 'wds' ); ?>
34
+ </option>
35
+ </select>
36
+
37
+ <div
38
+ data-conditional-val="<?php echo esc_attr( Smartcrawl_Schema_Printer::PERSON ); ?>"
39
+ class="wds-table-fields wds-table-fields-stacked wds-conditional-inside wds-conditional-inside-box">
40
+
41
+ <div class="label">
42
+ <label for="override_name" class="wds-label"><?php esc_html_e( 'Your name', 'wds' ); ?></label>
43
+ </div>
44
+ <div class="fields">
45
+ <input id="override_name" type="text" name="<?php echo esc_attr( $_view['option_name'] ); ?>[override_name]"
46
+ value="<?php echo esc_attr( $options['override_name'] ); ?>"/>
47
+ </div>
48
+ </div>
49
+
50
+ <div
51
+ data-conditional-val="<?php echo esc_attr( Smartcrawl_Schema_Printer::ORGANIZATION ); ?>"
52
+ class="wds-table-fields wds-table-fields-stacked wds-conditional-inside wds-conditional-inside-box">
53
+
54
+ <div class="label">
55
+ <label for="organization_name" class="wds-label"><?php esc_html_e( 'Organization Name', 'wds' ); ?></label>
56
+ </div>
57
+ <div class="fields">
58
+ <input id="organization_name" type="text" name="<?php echo esc_attr( $_view['option_name'] ); ?>[organization_name]"
59
+ value="<?php echo esc_attr( $options['organization_name'] ); ?>"/>
60
+ </div>
61
+
62
+ <div class="label">
63
+ <label for="organization_logo" class="wds-label"><?php esc_html_e( 'Organization Logo', 'wds' ); ?></label>
64
+ </div>
65
+ <div class="fields">
66
+ <?php
67
+ $this->_render('media-url-field', array(
68
+ 'item' => 'organization_logo',
69
+ ));
70
+ ?>
71
+ </div>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+
77
+ <?php
78
+ $this->_render('toggle-group', array(
79
+ 'label' => __( 'Schema markup', 'wds' ),
80
+ 'items' => array(
81
+ 'disable-schema' => array(
82
+ 'label' => __( 'Enable schema markup output', 'wds' ),
83
+ 'inverted' => true,
84
+ 'description' => __( 'By default, the plugin will render appropriate schema markup to all your pages. You can disable this kind of output here.', 'wds' ),
85
+ ),
86
+ ),
87
+ 'separator' => true,
88
+ ));
89
+ ?>
90
+
91
+ <div class="wds-table-fields wds-separator-top">
92
+ <div class="label">
93
+ <label for="twitter_username" class="wds-label"><?php esc_html_e( 'Twitter Username', 'wds' ); ?></label>
94
+ </div>
95
+ <div class="fields wds-twitter-username">
96
+ <input type="text" id="twitter_username" name="<?php echo esc_attr( $_view['option_name'] ); ?>[twitter_username]"
97
+ value="<?php echo esc_attr( $options['twitter_username'] ); ?>"
98
+ placeholder="<?php _e( 'username', 'wds' ); ?>"/>
99
+ </div>
100
+
101
+ <div class="label">
102
+ <label for="fb-app-id" class="wds-label"><?php esc_html_e( 'Facebook App ID', 'wds' ); ?></label>
103
+ </div>
104
+ <div class="fields wds-fb-app-id">
105
+ <input type="text" id="fb-app-id" name="<?php echo esc_attr( $_view['option_name'] ); ?>[fb-app-id]"
106
+ value="<?php echo esc_attr( $options['fb-app-id'] ); ?>"
107
+ placeholder="<?php _e( 'App ID', 'wds' ); ?>"/>
108
+ </div>
109
+
110
+ <div class="label">
111
+ <label for="facebook_url" class="wds-label"><?php esc_html_e( 'Facebook Page Url', 'wds' ); ?></label>
112
+ </div>
113
+ <div class="fields">
114
+ <input type="text" id="facebook_url" name="<?php echo esc_attr( $_view['option_name'] ); ?>[facebook_url]"
115
+ value="<?php echo esc_attr( $options['facebook_url'] ); ?>"
116
+ placeholder="<?php _e( 'https://facebook.com/pagename', 'wds' ); ?>"/>
117
+ </div>
118
+
119
+ <div class="label">
120
+ <label for="instagram_url" class="wds-label"><?php esc_html_e( 'Instagram URL', 'wds' ); ?></label>
121
+ </div>
122
+ <div class="fields">
123
+ <input type="text" id="instagram_url" name="<?php echo esc_attr( $_view['option_name'] ); ?>[instagram_url]"
124
+ value="<?php echo esc_attr( $options['instagram_url'] ); ?>"
125
+ placeholder="<?php _e( 'https://instagram.com/username', 'wds' ); ?>"/>
126
+ </div>
127
+
128
+ <div class="label">
129
+ <label for="linkedin_url" class="wds-label"><?php esc_html_e( 'Linkedin URL', 'wds' ); ?></label>
130
+ </div>
131
+ <div class="fields">
132
+ <input type="text" id="linkedin_url" name="<?php echo esc_attr( $_view['option_name'] ); ?>[linkedin_url]"
133
+ value="<?php echo esc_attr( $options['linkedin_url'] ); ?>"
134
+ placeholder="<?php _e( 'https://linkedin.com/username', 'wds' ); ?>"/>
135
+ </div>
136
+
137
+ <div class="label">
138
+ <label for="pinterest_url" class="wds-label"><?php esc_html_e( 'Pinterest URL', 'wds' ); ?></label>
139
+ </div>
140
+ <div class="fields">
141
+ <input type="text" id="pinterest_url" name="<?php echo esc_attr( $_view['option_name'] ); ?>[pinterest_url]"
142
+ value="<?php echo esc_attr( $options['pinterest_url'] ); ?>"
143
+ placeholder="<?php _e( 'https://pinterest.com/username', 'wds' ); ?>"/>
144
+ </div>
145
+
146
+ <div class="label">
147
+ <label for="gplus_url" class="wds-label"><?php esc_html_e( 'Google+ URL', 'wds' ); ?></label>
148
+ </div>
149
+ <div class="fields">
150
+ <input type="text" id="gplus_url" name="<?php echo esc_attr( $_view['option_name'] ); ?>[gplus_url]"
151
+ value="<?php echo esc_attr( $options['gplus_url'] ); ?>"
152
+ placeholder="<?php _e( 'https://plus.google.com/u/1/123456789123456789123', 'wds' ); ?>"/>
153
+ </div>
154
+
155
+ <div class="label">
156
+ <label for="youtube_url" class="wds-label"><?php esc_html_e( 'Youtube URL', 'wds' ); ?></label>
157
+ </div>
158
+ <div class="fields">
159
+ <input type="text" id="youtube_url" name="<?php echo esc_attr( $_view['option_name'] ); ?>[youtube_url]"
160
+ value="<?php echo esc_attr( $options['youtube_url'] ); ?>"
161
+ placeholder="<?php _e( 'https://www.youtube.com/user/username', 'wds' ); ?>"/>
162
+ </div>
163
+ </div>
includes/admin/templates/social/social-section-open-graph.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="wds-separator-top">
2
+ <?php
3
+ $this->_render('toggle-group', array(
4
+ 'label' => __( 'OpenGraph Support', 'wds' ),
5
+ 'description' => __( 'This will add a few extra meta tags to the head section of your pages.', 'wds' ),
6
+ 'items' => array(
7
+ 'og-enable' => array(
8
+ 'label' => __( 'Enable OpenGraph', 'wds' ),
9
+ 'description' => __( 'By default OpenGraph will use your default titles, descriptions and feature images. You can override the default on a per post basis inside the post editor, as we as under Titles & Meta for specific post types.', 'wds' ),
10
+ ),
11
+ ),
12
+ ));
13
+ ?>
14
+ </div>
includes/admin/templates/social/social-section-pinterest-verification.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $options = empty( $options ) ? $_view['options'] : $options;
3
+ ?>
4
+
5
+ <div class="wds-table-fields">
6
+ <?php if ( isset( $options['pinterest-verification-status'] ) ) : ?>
7
+ <?php if ( $options['pinterest-verification-status'] === 'fail' ) : ?>
8
+ <div class="wds-notice wds-notice-error">
9
+ <p><?php esc_html_e( 'Verification failed', 'wds' ); ?></p>
10
+ </div>
11
+ <?php elseif ( $options['pinterest-verification-status'] === '' ) : ?>
12
+ <div class="wds-notice wds-notice-success">
13
+ <p><?php esc_html_e( 'Your domain verification tag has been added to the <head> of your website.', 'wds' ); ?></p>
14
+ </div>
15
+ <?php endif; ?>
16
+ <?php endif; ?>
17
+ <div class="label">
18
+ <label for="pinterest-verify" class="wds-label"><?php esc_html_e( 'Pinterest Meta Tag', 'wds' ); ?></label>
19
+ <p class="wds-label-description"><?php _e( 'This setting will add the meta tag to verify your website with Pinterest.', 'wds' ); ?></p>
20
+ </div>
21
+
22
+ <div class="fields">
23
+ <textarea
24
+ id="pinterest-verify"
25
+ name="<?php echo esc_attr( $_view['option_name'] ); ?>[pinterest-verify]"
26
+ placeholder="<?php _e( 'Enter your Pinterest meta tag here', 'wds' ); ?>"><?php echo esc_textarea( $options['pinterest-verify'] ); ?></textarea>
27
+ <div class="wds-field-legend">
28
+ <?php if ( empty( $options['pinterest-verify'] ) ) : ?>
29
+ <?php _e( 'Instructions:', 'wds' ); ?>
30
+ <ul>
31
+ <li><?php _e( '1. Go to your Account Settings area.', 'wds' ); ?></li>
32
+ <li><?php _e( '2. Scroll to the Website field, add your website and click Confirm website.', 'wds' ); ?></li>
33
+ <li><?php _e( '3. Copy the meta tag', 'wds' ); ?></li>
34
+ </ul>
35
+ <?php else : ?>
36
+ <?php _e( 'To remove verification simply remove this meta tag.', 'wds' ); ?>
37
+ <?php endif; ?>
38
+ </div>
39
+ </div>
40
+ </div>
includes/admin/templates/social/social-section-twitter-cards.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $options = empty( $options ) ? $_view['options'] : $options;
3
+ ?>
4
+
5
+ <div class="wds-table-fields wds-separator-top">
6
+ <div class="label">
7
+ <label class="wds-label"><?php _e( 'Twitter Cards', 'wds' ); ?></label>
8
+ <p class="wds-label-description"><?php _e( 'With Twitter Cards, you can attach rich photos, videos and media experiences to Tweets, helping to drive traffic to your website.', 'wds' ); ?></p>
9
+ </div>
10
+
11
+ <?php $twitter_card_enabled = $options['twitter-card-enable']; ?>
12
+ <div class="fields wds-toggleable <?php echo $twitter_card_enabled ? '' : 'inactive'; ?>">
13
+ <div class="wds-toggle-table">
14
+ <span class="toggle wds-toggle">
15
+ <input
16
+ class="toggle-checkbox"
17
+ value="1"
18
+ id="twitter-card-enable"
19
+ name="<?php echo esc_attr( $_view['option_name'] ); ?>[twitter-card-enable]"
20
+ autocomplete="off"
21
+ type="checkbox"
22
+ <?php checked( $twitter_card_enabled ); ?>/>
23
+ <label class="toggle-label" for="twitter-card-enable"></label>
24
+ </span>
25
+
26
+ <div class="wds-toggle-description">
27
+ <label for="twitter-card-enable" class="wds-label"><?php esc_html_e( 'Enable Twitter Cards', 'wds' ); ?></label>
28
+ </div>
29
+ </div>
30
+
31
+ <div class="wds-toggleable-inside wds-conditional">
32
+ <p></p>
33
+ <select name="<?php echo esc_attr( $_view['option_name'] ); ?>[twitter-card-type]"
34
+ class="select-container" style="width: 100%">
35
+ <option
36
+ <?php selected( $options['twitter-card-type'], Smartcrawl_Twitter_Printer::CARD_SUMMARY ); ?>
37
+ value="<?php echo esc_attr( Smartcrawl_Twitter_Printer::CARD_SUMMARY ); ?>">
38
+ <?php esc_html_e( 'Summary Card', 'wds' ); ?>
39
+ </option>
40
+
41
+ <option
42
+ <?php selected( $options['twitter-card-type'], Smartcrawl_Twitter_Printer::CARD_IMAGE ); ?>
43
+ value="<?php echo esc_attr( Smartcrawl_Twitter_Printer::CARD_IMAGE ); ?>">
44
+ <?php esc_html_e( 'Summary Card with Large Image', 'wds' ); ?>
45
+ </option>
46
+ </select>
47
+
48
+ <div class="wds-conditional-inside" data-conditional-val="<?php echo esc_attr( Smartcrawl_Twitter_Printer::CARD_SUMMARY ); ?>">
49
+ <?php
50
+ $this->_render('social/social-twitter-embed', array(
51
+ 'tweet_url' => 'https://twitter.com/_HassanAkhtar/status/875530001294270464',
52
+ ));
53
+ ?>
54
+ </div>
55
+ <div class="wds-conditional-inside" data-conditional-val="<?php echo esc_attr( Smartcrawl_Twitter_Printer::CARD_IMAGE ); ?>">
56
+ <?php
57
+ $this->_render('social/social-twitter-embed', array(
58
+ 'tweet_url' => 'https://twitter.com/Twitter/status/593828669740584960',
59
+ 'large' => true,
60
+ ));
61
+ ?>
62
+ </div>
63
+ <p class="wds-field-legend"><?php esc_html_e( 'A preview of how your Homepage will appear as a Twitter Card.', 'wds' ); ?></p>
64
+ </div>
65
+
66
+ </div>
67
+ </div>
includes/admin/templates/social/social-settings.php ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="container" class="wrap wrap-wds wds-page wds-page-autolinks">
2
+
3
+ <section id="header">
4
+ <?php $this->_render( 'settings-message-top' ); ?>
5
+ <h1><?php esc_html_e( 'Social' , 'wds' ); ?></h1>
6
+ </section><!-- end header -->
7
+
8
+ <form action='<?php echo esc_attr( $_view['action_url'] ); ?>' method='post' class="wds-form">
9
+ <?php settings_fields( $_view['option_name'] ); ?>
10
+
11
+ <div class="vertical-tabs">
12
+ <?php
13
+ $this->_render('vertical-tab', array(
14
+ 'tab_id' => 'tab_accounts',
15
+ 'tab_name' => __( 'Accounts', 'wds' ),
16
+ 'is_active' => $active_tab == 'tab_accounts',
17
+ 'tab_sections' => array(
18
+ array(
19
+ 'section_description' => __( 'Let search engines know whether you’re an organization or a person, then add all your social profiles so search engines know which social profiles to attribute your web content to.', 'wds' ),
20
+ 'section_template' => 'social/social-section-accounts',
21
+ 'section_args' => array(
22
+ 'options' => $options,
23
+ ),
24
+ ),
25
+ ),
26
+ ));
27
+ ?>
28
+
29
+ <?php
30
+ $this->_render('vertical-tab', array(
31
+ 'tab_id' => 'tab_open_graph',
32
+ 'tab_name' => __( 'OpenGraph', 'wds' ),
33
+ 'is_active' => $active_tab == 'tab_open_graph',
34
+ 'tab_sections' => array(
35
+ array(
36
+ 'section_description' => __( 'Add meta data to your pages to make them look great when shared platforms such as Facebook and other popular social networks.', 'wds' ),
37
+ 'section_template' => 'social/social-section-open-graph',
38
+ 'section_args' => array(
39
+ 'options' => $options,
40
+ ),
41
+ ),
42
+ ),
43
+ ));
44
+ ?>
45
+
46
+ <?php
47
+ $this->_render('vertical-tab', array(
48
+ 'tab_id' => 'tab_twitter_cards',
49
+ 'tab_name' => __( 'Twitter Cards', 'wds' ),
50
+ 'is_active' => $active_tab == 'tab_twitter_cards',
51
+ 'tab_sections' => array(
52
+ array(
53
+ 'section_description' => __( 'Add meta data to your pages to make them look great when shared on Twitter.', 'wds' ),
54
+ 'section_template' => 'social/social-section-twitter-cards',
55
+ 'section_args' => array(
56
+ 'options' => $options,
57
+ ),
58
+ ),
59
+ ),
60
+ ));
61
+ ?>
62
+
63
+ <?php
64
+ $this->_render('vertical-tab', array(
65
+ 'tab_id' => 'tab_pinterest_verification',
66
+ 'tab_name' => __( 'Pinterest Verification', 'wds' ),
67
+ 'is_active' => $active_tab == 'tab_pinterest_verification',
68
+ 'tab_sections' => array(
69
+ array(
70
+ 'section_description' => __( 'Verify your website with Pinterest to attribute your website when your website content is pinned to the platform.', 'wds' ),
71
+ 'section_template' => 'social/social-section-pinterest-verification',
72
+ 'section_args' => array(
73
+ 'options' => $options,
74
+ ),
75
+ ),
76
+ ),
77
+ ));
78
+ ?>
79
+ </div>
80
+ </form>
81
+ </div>
includes/admin/templates/social/social-twitter-embed.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $tweet_url = empty( $tweet_url ) ? '' : $tweet_url;
3
+ $embed_query = new WP_Query( array( 'posts_per_page' => 1, 'post_status' => 'any' ) );
4
+ $large = empty( $large ) ? false : $large;
5
+
6
+ if ( ! $tweet_url ) {
7
+ return;
8
+ }
9
+ ?>
10
+ <?php if ( $embed_query->have_posts() ) : ?>
11
+ <div class="wds-twitter-embed <?php echo $large ? 'wds-twitter-embed-large' : ''; ?>">
12
+ <?php while ( $embed_query->have_posts() ) : $embed_query->the_post(); ?>
13
+ <?php
14
+ global $wp_embed;
15
+ /**
16
+ * @var WP_Embed $wp_embed
17
+ */
18
+ echo $wp_embed->autoembed( $tweet_url );
19
+ ?>
20
+ <?php endwhile; ?>
21
+ <?php wp_reset_postdata(); ?>
22
+ </div>
23
+ <?php endif; ?>
includes/admin/templates/taxonomy-form-row.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <tr class="form-field">
3
+ <th scope="row" valign="top"><label for="<?php echo $id; ?>"><?php echo $label; ?>:</label></th>
4
+ <td>
5
+ <?php
6
+
7
+ if ( $type === 'text' ) {
8
+
9
+ ?>
10
+ <input name="<?php echo $id; ?>" id="<?php echo $id; ?>" type="text" value="<?php if ( isset( $val ) ) { echo $val; } ?>" size="40"/>
11
+ <p class="description"><?php echo $desc; ?></p>
12
+ <?php
13
+
14
+ } elseif ( $type === 'checkbox' ) {
15
+
16
+ ?>
17
+ <input name="<?php echo $id; ?>" id="<?php echo $id; ?>" type="checkbox" <?php checked( $val ); ?> style="width:5%;" />
18
+ <?php
19
+
20
+ }
21
+
22
+ ?>
23
+ </td>
24
+ </tr>
includes/admin/templates/term-additions-form.php ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <h2><?php _e( 'SmartCrawl Settings ' , 'wds' ); ?></h2>
3
+ <table class="form-table">
4
+
5
+ <?php
6
+
7
+ $this->form_row( 'wds_title', __( 'SEO Title' , 'wds' ), __( 'The SEO title is used on the archive page for this term.' , 'wds' ), $tax_meta );
8
+ $this->form_row( 'wds_desc', __( 'SEO Description' , 'wds' ), __( 'The SEO description is used for the meta description on the archive page for this term.' , 'wds' ), $tax_meta );
9
+ $this->form_row( 'wds_canonical', __( 'Canonical' , 'wds' ), __( 'The canonical link is shown on the archive page for this term.' , 'wds' ), $tax_meta );
10
+
11
+ if ( $global_noindex ) { $this->form_row( 'wds_override_noindex', sprintf( __( 'Index this %s' , 'wds' ), strtolower( $taxonomy_labels->singular_name ) ), '', $tax_meta, 'checkbox' ); } else { $this->form_row( 'wds_noindex', sprintf( __( 'Noindex this %s' , 'wds' ), strtolower( $taxonomy_labels->singular_name ) ), '', $tax_meta, 'checkbox' ); }
12
+
13
+ if ( $global_nofollow ) { $this->form_row( 'wds_override_nofollow', sprintf( __( 'Follow this %s' , 'wds' ), strtolower( $taxonomy_labels->singular_name ) ), '', $tax_meta, 'checkbox' ); } else { $this->form_row( 'wds_nofollow', sprintf( __( 'Nofollow this %s' , 'wds' ), strtolower( $taxonomy_labels->singular_name ) ), '', $tax_meta, 'checkbox' ); }
14
+
15
+ ?>
16
+
17
+ <?php
18
+ $options = Smartcrawl_Settings::get_options();
19
+ ?>
20
+
21
+ <?php if ( ! empty( $options['og-enable'] ) ) { ?>
22
+ <tr class="form-field">
23
+ <th scope="row" valign="top"><label for=""><?php esc_html_e( 'OpenGraph', 'wds' ); ?></label></th>
24
+ <td>
25
+ <div class="wpmud">
26
+ <?php
27
+ $og = ! empty( $tax_meta['opengraph'] ) ? $tax_meta['opengraph'] : false;
28
+ if ( ! is_array( $og ) ) {
29
+ $og = array();
30
+ }
31
+
32
+ $og = wp_parse_args($og, array(
33
+ 'title' => false,
34
+ 'description' => false,
35
+ 'images' => false,
36
+ 'disabled' => false,
37
+ ));
38
+
39
+ if ( ! class_exists( 'Smartcrawl_OpenGraph_Printer' ) ) { require_once( SMARTCRAWL_PLUGIN_DIR . '/tools/class_wds_opengraph_printer.php' ); }
40
+ $ogp = Smartcrawl_OpenGraph_Printer::Get();
41
+
42
+ $default_title = $ogp->get_generic_og_tag_value( 'og-title', $taxonomy );
43
+ $default_title = ! empty( $default_title ) ? $default_title : $term->name;
44
+
45
+ $default_metadesc = $ogp->get_generic_og_tag_value( 'og-description', $taxonomy );
46
+ $default_metadesc = ! empty( $default_metadesc ) ? $default_metadesc : $term->name;
47
+
48
+ $og_meta_disabled = (bool) smartcrawl_get_array_value( $og, 'disabled' );
49
+ ?>
50
+ <div class="wds-table-fields">
51
+ <div class="fields">
52
+ <div class="wds-toggleable inverted <?php echo $og_meta_disabled ? 'inactive' : ''; ?>">
53
+ <?php
54
+ $this->_render('toggle-item', array(
55
+ 'inverted' => true,
56
+ 'field_name' => 'wds-opengraph[disabled]',
57
+ 'checked' => checked( $og_meta_disabled, true, false ),
58
+ 'item_label' => esc_html__( 'Enable OpenGraph for this term', 'wds' ),
59
+ ));
60
+ ?>
61
+ <div class="wds-toggleable-inside wds-toggleable-inside-box wds-table-fields-group wds-opengraph-meta">
62
+
63
+ <div class="wds-table-fields wds-table-fields-stacked">
64
+ <div class="label">
65
+ <label for="og-title" class="wds-label"><?php esc_html_e( 'Title', 'wds' ); ?></label>
66
+ </div>
67
+ <div class="fields">
68
+ <input type="text"
69
+ id="og-title"
70
+ name="wds-opengraph[title]"
71
+ placeholder="<?php echo $og['title'] ? '' : esc_attr( smartcrawl_replace_vars( $default_title, (array) $term ) ); ?>"
72
+ value="<?php echo esc_attr( $og['title'] ); ?>"/>
73
+ </div>
74
+ </div>
75
+
76
+ <div class="wds-table-fields wds-table-fields-stacked">
77
+ <div class="label">
78
+ <label for="og-description" class="wds-label"><?php esc_html_e( 'Description', 'wds' ); ?></label>
79
+ </div>
80
+ <div class="fields">
81
+ <textarea name="wds-opengraph[description]"
82
+ placeholder="<?php echo $og['description'] ? '' : esc_attr( smartcrawl_replace_vars( $default_metadesc, (array) $term ) ); ?>"
83
+ id="og-description"><?php echo esc_textarea( $og['description'] ); ?></textarea>
84
+ </div>
85
+ </div>
86
+
87
+ <div class="wds-table-fields wds-table-fields-stacked">
88
+ <div class="label">
89
+ <label for="og-images" class="wds-label"><?php esc_html_e( 'Featured Images', 'wds' ); ?></label>
90
+ </div>
91
+ <div class="fields og-images"
92
+ data-name="wds-opengraph[images]">
93
+ <div class="add-action-wrapper item">
94
+ <a href="#add" title="<?php esc_attr_e( 'Add image', 'wds' ); ?>">
95
+ <i class="wds-icon-plus"></i>
96
+ </a>
97
+ </div>
98
+ <?php if ( ! empty( $og['images'] ) && is_array( $og['images'] ) ) : ?>
99
+ <?php foreach ( $og['images'] as $img ) : ?>
100
+ <input type="text" class="widefat"
101
+ name="wds-opengraph[images][]"
102
+ value="<?php echo esc_attr( $img ); ?>" />
103
+ <?php endforeach; ?>
104
+ <?php endif; ?>
105
+ </div>
106
+ </div>
107
+
108
+ <p class="wds-label-description"><?php esc_html_e( 'Each of these images will be available to use as the featured image when the term page is shared.', 'wds' ); ?></p>
109
+ </div>
110
+ </div>
111
+ </div>
112
+ </div>
113
+ </div>
114
+ </div>
115
+ </td>
116
+ <tr>
117
+ <?php } ?>
118
+
119
+
120
+ <?php if ( ! empty( $options['twitter-card-enable'] ) ) { ?>
121
+ <tr class="form-field">
122
+ <th scope="row" valign="top"><label for=""><?php esc_html_e( 'Twitter', 'wds' ); ?></label></th>
123
+ <td>
124
+ <div class="wpmud">
125
+ <?php
126
+ $twitter = ! empty( $tax_meta['twitter'] ) ? $tax_meta['twitter'] : false;
127
+ if ( ! is_array( $twitter ) ) {
128
+ $twitter = array();
129
+ }
130
+
131
+ $twitter = wp_parse_args($twitter, array(
132
+ 'title' => false,
133
+ 'description' => false,
134
+ 'disabled' => false,
135
+ ));
136
+
137
+ $twitter_meta_disabled = (bool) smartcrawl_get_array_value( $twitter, 'disabled' );
138
+ ?>
139
+ <div class="wds-table-fields">
140
+ <div class="fields">
141
+ <div class="wds-toggleable inverted <?php echo $twitter_meta_disabled ? 'inactive' : ''; ?>">
142
+ <?php
143
+ $this->_render('toggle-item', array(
144
+ 'inverted' => true,
145
+ 'field_name' => 'wds-twitter[disabled]',
146
+ 'checked' => checked( $twitter_meta_disabled, true, false ),
147
+ 'item_label' => esc_html__( 'Enable Twitter Cards for this term', 'wds' ),
148
+ ));
149
+ ?>
150
+ <div class="wds-toggleable-inside wds-toggleable-inside-box wds-table-fields-group wds-twitter-meta">
151
+ <div class="wds-table-fields wds-table-fields-stacked">
152
+ <div class="label">
153
+ <label for="twitter-title" class="wds-label"><?php esc_html_e( 'Title', 'wds' ); ?></label>
154
+ </div>
155
+ <div class="fields">
156
+ <input type="text"
157
+ id="twitter-title"
158
+ name="wds-twitter[title]"
159
+ placeholder="<?php echo $twitter['title'] ? '' : esc_attr( smartcrawl_replace_vars( $term->name ) ); ?>"
160
+ value="<?php echo esc_attr( $twitter['title'] ); ?>"/>
161
+ </div>
162
+ </div>
163
+
164
+ <div class="wds-table-fields wds-table-fields-stacked">
165
+ <div class="label">
166
+ <label for="twitter-description" class="wds-label"><?php esc_html_e( 'Description', 'wds' ); ?></label>
167
+ </div>
168
+ <div class="fields">
169
+ <textarea name="wds-twitter[description]"
170
+ placeholder="<?php echo $twitter['description'] ? '' : esc_attr( smartcrawl_replace_vars( $term->name ) ); ?>"
171
+ id="twitter-description"><?php echo esc_textarea( $twitter['description'] ); ?></textarea>
172
+ </div>
173
+ </div>
174
+
175
+ <div class="wds-table-fields wds-table-fields-stacked">
176
+ <div class="label">
177
+ <label for="twitter-images" class="wds-label"><?php esc_html_e( 'Featured Image', 'wds' ); ?></label>
178
+ </div>
179
+ <div class="fields og-images"
180
+ data-singular="true"
181
+ data-name="wds-twitter[images]">
182
+ <div class="add-action-wrapper item">
183
+ <a href="#add" title="<?php esc_attr_e( 'Add image', 'wds' ); ?>">
184
+ <i class="wds-icon-plus"></i>
185
+ </a>
186
+ </div>
187
+ <?php if (!empty($twitter['images']) && is_array($twitter['images'])) : ?>
188
+ <?php foreach ($twitter['images'] as $twitter_image) : ?>
189
+ <input type="text" class="widefat"
190
+ name="wds-twitter[images][]"
191
+ value="<?php echo esc_attr($twitter_image); ?>"/>
192
+ <?php endforeach; ?>
193
+ <?php endif; ?>
194
+ </div>
195
+ </div>
196
+
197
+ <p class="wds-label-description"><?php esc_html_e( 'This image will be available to use as the featured image when the term page is shared.', 'wds' ); ?></p>
198
+ </div>
199
+ </div> <!-- fields -->
200
+ </div> <!-- wds-table-fields -->
201
+ </div>
202
+ </td>
203
+ </tr>
204
+ <?php } ?>
205
+
206
+ </table>
includes/admin/templates/toggle-group.php ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $label = empty( $label ) ? '' : $label;
3
+ $description = empty( $description ) ? '' : $description;
4
+ $items = empty( $items ) ? array() : $items;
5
+ $view_option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name'];
6
+ ?>
7
+
8
+ <div class="wds-table-fields <?php echo isset( $separator ) && $separator ? 'wds-separator-top' : ''; ?>">
9
+ <div class="label">
10
+ <label class="wds-label"><?php esc_attr_e( $label ); ?></label>
11
+ <p class="wds-label-description">
12
+ <?php esc_html_e( $description ); ?>
13
+ </p>
14
+ </div>
15
+
16
+ <div class="fields">
17
+ <?php foreach ( $items as $item => $details ) : ?>
18
+ <?php
19
+ $option_name = $view_option_name;
20
+ $field_id = $option_name . '-' . $item;
21
+ $field_name = $option_name . "[$item]";
22
+ $checked = ( ! empty( $_view['options'][ $item ] )) ? "checked='checked' " : '';
23
+
24
+ if ( is_array( $details ) ) {
25
+ $details = wp_parse_args(
26
+ $details,
27
+ array(
28
+ 'value' => '',
29
+ 'label' => '',
30
+ 'description' => '',
31
+ 'html_description' => '',
32
+ 'inverted' => false,
33
+ )
34
+ );
35
+
36
+ $item_label = $details['label'];
37
+ $item_description = $details['description'];
38
+ $item_value = $details['value'] ? $details['value'] : $item;
39
+ $inverted = $details['inverted'];
40
+ $html_description = $details['html_description'];
41
+ } else {
42
+ $item_label = $details;
43
+ $item_description = '';
44
+ $item_value = $item;
45
+ $inverted = false;
46
+ $html_description = '';
47
+ }
48
+ ?>
49
+
50
+ <?php
51
+ $this->_render('toggle-item', array(
52
+ 'inverted' => $inverted,
53
+ 'item_value' => $item_value,
54
+ 'field_name' => $field_name,
55
+ 'field_id' => $field_id,
56
+ 'checked' => $checked,
57
+ 'item_label' => $item_label,
58
+ 'item_description' => $item_description,
59
+ 'html_description' => $html_description,
60
+ ));
61
+ ?>
62
+
63
+ <?php endforeach; ?>
64
+ </div>
65
+ </div>
includes/admin/templates/toggle-item.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $inverted = empty( $inverted ) ? false : $inverted;
3
+ $field_name = empty( $field_name ) ? '' : $field_name;
4
+ $field_id = empty( $field_id ) ? $field_name : $field_id;
5
+ $checked = empty( $checked ) ? '' : $checked;
6
+ $item_label = empty( $item_label ) ? '' : $item_label;
7
+ $item_value = empty( $item_value ) ? '1' : $item_value;
8
+ $item_description = empty( $item_description ) ? '' : $item_description;
9
+ $html_description = empty( $html_description ) ? '' : $html_description;
10
+ $attributes = empty( $attributes ) ? array() : $attributes;
11
+
12
+ $attr_string = '';
13
+ foreach ( $attributes as $attribute => $attribute_value ) {
14
+ $attr_string .= sprintf( '%s="%s" ', $attribute, esc_attr( $attribute_value ) );
15
+ }
16
+ ?>
17
+ <div class="wds-toggle-table">
18
+ <span class="toggle wds-toggle <?php echo $inverted ? esc_attr( 'wds-inverted-toggle' ) : ''; ?>">
19
+ <input
20
+ type="checkbox"
21
+ class="toggle-checkbox"
22
+ value='<?php esc_attr_e( $item_value ); ?>'
23
+ name="<?php esc_attr_e( $field_name ); ?>"
24
+ id="<?php esc_attr_e( $field_id ); ?>"
25
+ <?php echo esc_html( $checked ); ?>
26
+ <?php echo $attr_string; // Built escaped. ?>>
27
+ <label
28
+ class="toggle-label"
29
+ for="<?php esc_attr_e( $field_id ); ?>">
30
+ </label>
31
+ </span>
32
+
33
+ <div class="wds-toggle-description">
34
+ <label
35
+ for="<?php esc_attr_e( $field_id ); ?>"
36
+ class="wds-label">
37
+ <?php esc_html_e( $item_label ); ?>
38
+ </label>
39
+
40
+ <?php if ( $item_description ) : ?>
41
+ <p class="wds-label-description">
42
+ <?php esc_html_e( $item_description ); ?>
43
+ </p>
44
+ <?php endif; ?>
45
+
46
+ <?php if ( $html_description ) : ?>
47
+ <?php echo wp_kses( $html_description, 'post' ); ?>
48
+ <?php endif; ?>
49
+ </div>
50
+ </div>
includes/admin/templates/underscore-keywords-custom.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="wds-keyword-pairs">
2
+
3
+ {{ if (pairs) { }}
4
+ <table class="wds-keyword-pairs-existing wds-list-table">
5
+ <tr>
6
+ <th>{{- Wds.l10n('keywords', 'Keyword') }}</th>
7
+ <th colspan="3">{{- Wds.l10n('keywords', 'Auto-Linked URL') }}</th>
8
+ </tr>
9
+ {{= pairs }}
10
+ </table>
11
+ {{ } }}
12
+
13
+ <div class="wds-keyword-pair-new">
14
+ <button type="button" class="button button-dark">{{- Wds.l10n('keywords', 'Add New') }}</button>
15
+ </div><!-- end wds-keyword-pair-new -->
16
+
17
+ </div>
includes/admin/templates/underscore-keywords-form.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <dialog class="dev-overlay wds-modal wds-custom-keywords-modal" id="wds-custom-keywords" title="{{- idx == 0 ? Wds.l10n('keywords', 'Add Custom Keywords') : Wds.l10n('keywords', 'Update Custom Keywords') }}">
2
+ <form class="wds-form">
3
+ <input type="hidden" class="wds-custom-idx" value="{{- idx }}"/>
4
+ <label class="wds-label">{{- Wds.l10n('keywords', 'Keyword group') }}</label>
5
+ <p class="wds-label-description">{{- Wds.l10n('keywords', 'Choose your keywords, and then specify the URL to auto-link to.') }}</p>
6
+
7
+ <div class="wds-table-fields wds-table-fields-stacked">
8
+ <div class="label">
9
+ <label class="wds-label">{{- Wds.l10n('keywords', 'Keyword group') }} <span>{{- Wds.l10n('keywords', '- Usually related terms') }}</span></label>
10
+ </div>
11
+ <div class="fields">
12
+ <input type="text" class="wds-field wds-custom-keywords" value="{{- keywords }}" placeholder="{{- Wds.l10n('keywords', 'E.g. Cats, Kittens, Felines') }}"/>
13
+ </div>
14
+ </div>
15
+
16
+ <div class="wds-table-fields wds-table-fields-stacked">
17
+ <div class="label">
18
+ <label class="wds-label">{{- Wds.l10n('keywords', 'Link URL') }} <span>{{- Wds.l10n('keywords', '- Both internal and external links are supported') }}</span></label>
19
+ </div>
20
+ <div class="fields">
21
+ <input type="text" class="wds-custom-url" value="{{- url }}" placeholder="{{- Wds.l10n('keywords', 'E.g. /cats') }}"/>
22
+ <p class="wds-field-legend">{{= Wds.l10n('keywords', 'Formats include relative (E.g. <b>/cats</b>) or absolute URLs (E.g. <b>www.website.com/cats</b> or <b>https://website.com/cats</b>).') }}</p>
23
+ </div>
24
+ </div>
25
+
26
+ <div class="wds-box-footer">
27
+ <button type="button" class="wds-cancel-button button button-dark-o">{{- Wds.l10n('keywords', 'Cancel') }}</button>
28
+ <button type="button" class="wds-action-button button">{{- idx == 0 ? Wds.l10n('keywords', 'Add') : Wds.l10n('keywords', 'Update') }}</button>
29
+ </div>
30
+ </form>
31
+ </dialog>
includes/admin/templates/underscore-keywords-pairs.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <tr class="wds-keyword-pair" data-idx="{{- idx }}">
2
+ <td class="wds-pair-keyword">{{- keywords }}</td>
3
+ <td class="wds-pair-url">{{- url }}</td>
4
+ <td class="wds-pair-actions">
5
+ {{ if (idx) { }}
6
+ <?php
7
+ $this->_render('links-dropdown', array(
8
+ 'label' => "{{- Wds.l10n('keywords', 'Options') }}",
9
+ 'links' => array(
10
+ '#edit' => "{{- Wds.l10n('keywords', 'Edit') }}",
11
+ '#remove' => "{{- Wds.l10n('keywords', 'Remove') }}",
12
+ ),
13
+ ));
14
+ ?>
15
+ {{ } }}
16
+ </td>
17
+ <td class="wds-pair-hidden-fields">
18
+ <input type="hidden" class="wds-pair-keyword-field" value="{{- keywords }}" />
19
+ <input type="hidden" class="wds-pair-url-field" value="{{- url }}" />
20
+ </td>
21
+ </tr>
includes/admin/templates/underscore-macros-list.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="insert-macro">
2
+ <button class="button-fields-trigger" data-content="{{- Wds.l10n('macros', 'Insert dynamic macro') }}" id="toogle-macro-list-"><i class="wds-icon-plus"></i></button>
3
+ <div class="macro-list" style="display: none">
4
+ <ul>
5
+ {{ _.each(macros, function (desc, macro) { }}
6
+ <li data-macro="{{- macro }}">
7
+ {{- desc }}
8
+ </li>
9
+ {{ }); }}
10
+ </ul>
11
+ </div>
12
+ </div>
includes/admin/templates/underscore-postlist-exclusion-item.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <tr data-id="{{- id }}">
2
+ {{ if (is_loaded) { }}
3
+ <td class="wds-postlist-item-title">{{= title }}</td>
4
+ <td class="wds-postlist-item-type">{{= type }}</td>
5
+ <td class="wds-postlist-item-remove"><a href="#remove" class="wds-postlist-list-item-remove button button-dark-o button-small">{{= Wds.l10n('postlist', 'Remove') }}</a></td>
6
+ {{ } else { }}
7
+ <td colspan="3">Loading post {{= id }}...</td>
8
+ {{ } }}
9
+ </tr>
includes/admin/templates/underscore-postlist-exclusion.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="wds-postlist-list wds-postlist-list-exclude">
2
+ {{ if (loaded) { }}
3
+ <table class="wds-postlist wds-list-table {{= (!!posts ? '' : 'wds-postlist-empty_list') }}">
4
+ <tr>
5
+ <th>{{= Wds.l10n('postlist', 'Post') }}</th>
6
+ <th colspan="2">{{= Wds.l10n('postlist', 'Post Type') }}</th>
7
+ </tr>
8
+ {{= posts }}
9
+ </table>
10
+ {{ } else { }}
11
+ <p><i>Loading posts, please hold on</i></p>
12
+ {{ } }}
13
+ <div class="wds-postlist-add-post">
14
+ <a href="#wds-postlist-selector" rel="dialog" class="button button-dark">{{= Wds.l10n('postlist', 'Add Posts') }}</a>
15
+ </div>
16
+ </div>
includes/admin/templates/underscore-postlist-selector-list-item.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <li class="wds-postlist-list-item">
2
+ <p class="group">
3
+ <input
4
+ id="{{- type }}-{{- id }}"
5
+ class="wds-checkbox wds-checkbox-with-label wds-postlist-selector-list-item"
6
+ value='{{- id }}'
7
+ data-id="{{- id }}"
8
+ data-title="{{- title }}"
9
+ data-type="{{- type }}"
10
+ data-date="{{- date }}"
11
+ type='checkbox'
12
+ {{ if (existing) { }}
13
+ checked
14
+ readonly
15
+ disabled
16
+ {{ } }}
17
+ />
18
+ <label for="{{- type }}-{{- id }}" class="wds-label wds-label-radio wds-label-inline wds-label-inline-right">{{= title }} ({{= date }})</label>
19
+ </p>
20
+ </li>
includes/admin/templates/underscore-postlist-selector-list.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <section class="tab wds-postlist-list">
2
+
3
+ <input type="radio" name="tab_postlist_group" id="tab_{{- tab }}" {{= checked }} value="{{-tab }}">
4
+ <label for="tab_{{- tab }}">{{- tab_label }}</label>
5
+
6
+ <div class="content wds-content-tabs">
7
+
8
+ <h2 class="tab-title">{{= tab }}</h2>
9
+
10
+ <div class="wds-content-tabs-inner">
11
+ {{ if (is_loading) { }}
12
+ <p>{{= Wds.l10n('postlist', 'Loading post items, please hold on') }}</p>
13
+ {{ } else { }}
14
+ <ul class="wds-postlist-list-items">
15
+ {{= posts }}
16
+ </ul>
17
+ {{ } }}
18
+
19
+ {{ if (meta.total > 1) { }}
20
+ <div class="wds-postslist-list-pagination">
21
+ <p class="group wds-group wds-group-field">
22
+ <label for="wds-postslist-list-pagination-select" class="wds-label">{{= Wds.l10n('postlist', 'Jump to page') }}</label>
23
+ <select id='wds-postslist-list-pagination-select' class="wds-select">
24
+ {{ _.each(_.range(1, meta.total+1), function (idx) { }}
25
+ <option
26
+ value="{{- idx }}"
27
+ {{ if (meta.page === idx) { }}
28
+ selected="selected"
29
+ {{ } }}
30
+ >
31
+ {{= idx }}
32
+ </option>
33
+ {{ }) }}
34
+ </select>
35
+ <span class="wds-field-legend">{{= Wds.l10n('postlist', 'Total Pages') }} {{= meta.total }}</span>
36
+ </p>
37
+ </div>
38
+ {{ } }}
39
+
40
+ </div><!-- end wds-content-tabs-inner -->
41
+
42
+ </div><!-- end wds-content-tabs -->
43
+
44
+ </section><!-- end wds-postlist-list -->
includes/admin/templates/underscore-postlist-selector.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <dialog class="dev-overlay wds-modal wds-postlist-selector-modal" id="wds-postlist-selector" title="<?php esc_html_e( 'Choose Posts, Pages & Custom Post Types to exclude', 'wds' ); ?>">
2
+ <div class="box-content wds-postlist-selector">
3
+
4
+ <div class="vertical-tabs" id="content-type-excludes">
5
+ {{= lists }}
6
+ </div>
7
+
8
+ </div>
9
+
10
+ <div class="box-footer buttons">
11
+ <button type="button" class="button button-cta-dark">Add to Excludes</button>
12
+ </div>
13
+
14
+ </dialog>
includes/admin/templates/upsell-modal.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <dialog id="wds-upsell-modal"
2
+ class="dev-overlay wds-modal wds-upsell-modal"
3
+ title="<?php esc_attr_e( 'Upgrade To Pro', 'wds' ); ?>">
4
+
5
+ <div class="box-content modal">
6
+ <p><?php esc_html_e( 'Here’s what you’ll get by uprading to SmartCrawl Pro', 'wds' ); ?></p>
7
+
8
+ <ul class="wds-upgrade-benefits-list">
9
+ <li>
10
+ <span class="wds-strong-text"><?php esc_attr_e( 'Automatic SEO Checkups & Reporting', 'wds' ); ?></span>
11
+ <p class="wds-small-text"><?php esc_attr_e( 'Schedule daily, weekly or monthly comprehensive checkups of your homepage SEO and have the results emailed to your inbox.', 'wds' ); ?></p>
12
+ </li>
13
+ <li>
14
+ <span class="wds-strong-text"><?php esc_attr_e( 'Schedule Sitemap Crawls', 'wds' ); ?></span>
15
+ <p class="wds-small-text"><?php esc_attr_e( 'Set SmartCrawl to automatically check your website for broken URLs daily, weekly or monthly and send you an email with any issues she encounters.', 'wds' ); ?></p>
16
+ </li>
17
+ <li>
18
+ <span class="wds-strong-text"><?php esc_attr_e( 'Automatic Linking', 'wds' ); ?></span>
19
+ <p class="wds-small-text"><?php esc_attr_e( 'Configure SmartCrawl to automatically link certain key words to a page on your blog or even a whole new site all together.', 'wds' ); ?></p>
20
+ </li>
21
+ <li>
22
+ <span class="wds-strong-text"><?php esc_attr_e( 'Smush Pro', 'wds' ); ?></span>
23
+ <p class="wds-small-text"><?php esc_attr_e( 'A membership for Hummingbird Pro also gets you the award winning Smush Pro with unlimited advanced lossy compression that’ll give image heavy websites a speed boost.', 'wds' ); ?></p>
24
+ </li>
25
+ </ul>
26
+
27
+ <p style="text-align: center">
28
+ <?php esc_html_e( 'Get all of this, plus heaps more as a part of a WPMU DEV membership.', 'wds' ); ?>
29
+ </p>
30
+
31
+ <p style="text-align: center">
32
+ <button class="wds-navigate-to-pro button-green"
33
+ data-target="<?php echo esc_url( 'https://premium.wpmudev.org/project/smartcrawl-wordpress-seo/?campaign=wds_modal_upgrade&source=smartcrawl&medium=plugin' ); ?>">
34
+
35
+ <?php esc_html_e( 'Upgrate to Pro', 'wds' ); ?>
36
+ </button>
37
+ </p>
38
+
39
+ </div>
40
+
41
+ </dialog>
includes/admin/templates/url-crawl-master.php ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $ready_template = empty( $ready_template ) ? '' : $ready_template;
3
+ $ready_args = empty( $ready_args ) ? array() : $ready_args;
4
+
5
+ $no_data_template = empty( $no_data_template ) ? '' : $no_data_template;
6
+ $no_data_args = empty( $no_data_args ) ? array() : $no_data_args;
7
+
8
+ $progress_template = empty( $progress_template ) ? '' : $progress_template;
9
+ $progress_args = empty( $progress_args ) ? array() : $progress_args;
10
+
11
+ /**
12
+ * @var Smartcrawl_Seo_Service $service
13
+ */
14
+ $service = Smartcrawl_Service::get( Smartcrawl_Service::SERVICE_SEO );
15
+ $crawl_status = '';
16
+ $percentage = -1;
17
+
18
+ // Check the local DB for results first
19
+ $result = $service->get_result();
20
+
21
+ // Results are available in the DB so we can show the report
22
+ if ( ! empty( $result ) ) {
23
+
24
+ $crawl_status = 'report-ready';
25
+
26
+ } else {
27
+
28
+ // Results are not available in the DB. Check status of the remote crawl.
29
+ $status = $service->status();
30
+
31
+ if ( ! empty( $status['end'] ) ) {
32
+
33
+ // The crawl has ended but the data is not cached in the DB yet. Get it from remote.
34
+ $result = $service->result();
35
+ $crawl_status = 'report-ready';
36
+
37
+ } elseif ( $status && empty( $status['end'] ) ) {
38
+
39
+ // The URL crawl was started and is in progress at the moment.
40
+ $crawl_status = 'in-progress';
41
+ $percentage = empty( $status['percentage'] ) ? 0 : $status['percentage'];
42
+
43
+ } elseif ( empty( $status['start'] ) ) {
44
+
45
+ // The URL crawl was never started so there is nothing to do.
46
+ $crawl_status = 'no-data';
47
+
48
+ }
49
+ }
50
+
51
+ switch ( $crawl_status ) {
52
+ case 'report-ready':
53
+ if ( ! class_exists( 'Smartcrawl_SeoReport' ) ) {
54
+ require_once( SMARTCRAWL_PLUGIN_DIR . 'core/class_wds_seo_report.php' );
55
+ }
56
+
57
+ $report = Smartcrawl_SeoReport::build( $result );
58
+
59
+ if ( $ready_template ) {
60
+ $this->_render($ready_template, array_merge(
61
+ array( 'report' => $report ),
62
+ $ready_args
63
+ ));
64
+ }
65
+ break;
66
+
67
+ case 'no-data':
68
+ if ( $no_data_template ) {
69
+ $this->_render( $no_data_template, $no_data_args );
70
+ }
71
+ break;
72
+
73
+ case 'in-progress':
74
+ if ( $progress_template ) {
75
+ $this->_render($progress_template, array_merge(
76
+ array( 'progress' => $percentage ),
77
+ $progress_args
78
+ ));
79
+ }
80
+ break;
81
+ }
includes/admin/templates/urlmetrics-metabox.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <table class="widefat">
3
+ <tbody>
4
+ <tr class="alt">
5
+ <th width="30%"><?php esc_html_e( 'Metric' , 'wds' ); ?></th>
6
+ <th>Value</th>
7
+ </tr>
8
+ <tr>
9
+ <th><?php esc_html_e( 'External Links' , 'wds' ); ?></th>
10
+ <td><p><a href="http://www.opensiteexplorer.org/links?site=<?php echo $page; ?>" target="_blank"><?php echo ( ! empty( $urlmetrics->ueid ) ? $urlmetrics->ueid : '' ); ?></a></p></td>
11
+ </tr>
12
+ <tr>
13
+ <th><?php esc_html_e( 'Links' , 'wds' ); ?></th>
14
+ <td><p><a href="http://www.opensiteexplorer.org/links?site=<?php echo $page; ?>" target="_blank"><?php echo ( ! empty( $urlmetrics->uid ) ? $urlmetrics->uid : '' ); ?></a></p></td>
15
+ </tr>
16
+ <tr>
17
+ <th><?php esc_html_e( 'mozRank' , 'wds' ); ?></th>
18
+ <td><p><?php echo '<b>' . __( '10-point score:' , 'wds' ) . '</b> <a href="http://www.opensiteexplorer.org/links?site=' . $page . '" target="_blank">' . ( ! empty( $urlmetrics->umrp ) ? $urlmetrics->umrp : '' ) . '</a><br /><br /><b>' . __( 'Raw score:' , 'wds' ) . '</b> <a href="http://www.opensiteexplorer.org/links?site=' . $page . '" target="_blank">' . ( ! empty( $urlmetrics->umrr ) ? $urlmetrics->umrr : '' ); ?></a></p></td>
19
+ </tr>
20
+ <tr>
21
+ <th><?php esc_html_e( 'Page Authority' , 'wds' ); ?></th>
22
+ <td><p><a href="http://www.opensiteexplorer.org/links?site=<?php echo $page; ?>" target="_blank"><?php echo ( ! empty( $urlmetrics->upa ) ? $urlmetrics->upa : '' ); ?></a></p></td>
23
+ </tr>
24
+ </tbody>
25
+ </table>
26
+ <p><a href="http://moz.com/" target="_blank"><img src="<?php echo SMARTCRAWL_PLUGIN_URL; ?>images/linkscape-logo.png" title="<?php esc_html_e( 'Moz Linkscape API' , 'wds' ); ?>" /></a></p>
27
+
includes/admin/templates/user-search.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * User search template
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ $users = empty( $users ) ? array() : $users;
9
+ $users_key = empty( $users_key ) ? '' : $users_key;
10
+ $new_user_key = empty( $new_user_key ) ? '' : $new_user_key;
11
+ $option_name = empty( $option_name ) ? '' : $option_name;
12
+
13
+ $field_name = sprintf( '%s[%s][]', $option_name, $users_key );
14
+ $select_field_name = sprintf( '%s[%s]', $option_name, $new_user_key );
15
+ ?>
16
+
17
+ <?php if ( $users ) { ?>
18
+ <div class="wds-user-search"
19
+ data-option-name="<?php echo esc_attr( $option_name ); ?>"
20
+ data-users-key="<?php echo esc_attr( $users_key ); ?>"
21
+ data-new-user-key="<?php echo esc_attr( $new_user_key ); ?>">
22
+
23
+ <ul>
24
+ <?php foreach ( $users as $user_id ) { ?>
25
+ <li>
26
+ <span class="wds-user-search-avatar"><?php echo get_avatar( $user_id ); ?></span>
27
+
28
+ <span class="wds-user-search-user"><?php echo esc_html( Smartcrawl_Model_User::get( $user_id )->get_display_name() ); ?></span>
29
+
30
+ <?php if ( get_current_user_id() == $user_id ) { ?>
31
+ <span class="wds-user-search-you"><?php esc_html_e( 'You', 'wds' ); ?></span>
32
+ <?php } ?>
33
+
34
+ <span class="wds-user-search-remove"><a href="#remove-user"><?php esc_html_e( 'Remove', 'wds' ); ?></a></span>
35
+
36
+ <input type="hidden"
37
+ name="<?php echo esc_attr( $field_name ); ?>"
38
+ value="<?php echo esc_attr( $user_id ); ?>"/>
39
+ </li>
40
+ <?php } ?>
41
+ </ul>
42
+
43
+ <div class="wds-user-search-field select-container select-container-no-style">
44
+ <div>
45
+ <select name="<?php echo esc_attr( $select_field_name ); ?>"
46
+ style="width: 100%;">
47
+ </select>
48
+ </div>
49
+ <div>
50
+ <input type="button" value="<?php esc_html_e( 'Add', 'wds' ); ?>" class="button button-dark"/>
51
+ </div>
52
+ </div>
53
+ </div>
54
+ <?php } ?>
includes/admin/templates/vertical-tab-section.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $smartcrawl_options = empty( $_view['options'] ) ? array() : $_view['options'];
3
+ $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name'];
4
+ $section_title = empty( $section_title ) ? '' : $section_title;
5
+ $section_description = empty( $section_description ) ? '' : $section_description;
6
+ $section_template = empty( $section_template ) ? '' : $section_template;
7
+ $section_args = empty( $section_args ) ? array() : $section_args;
8
+ $section_type = empty( $section_type ) ? '' : $section_type;
9
+
10
+ $section_enabled_option = empty( $section_enabled_option ) ? '' : $section_enabled_option;
11
+ $section_enabled = ! empty( $smartcrawl_options[ $section_enabled_option ] );
12
+ $section_enabled_option_name = $option_name . '[' . $section_enabled_option . ']';
13
+ $show_accordion = empty( $show_accordion ) ? false : $show_accordion;
14
+ $accordion_section_open = empty( $accordion_section_open ) ? false : $accordion_section_open;
15
+ ?>
16
+
17
+ <?php if ( $show_accordion ) : ?>
18
+ <div class="wds-accordion-section <?php echo $accordion_section_open ? esc_attr( 'open' ) : ''; ?>">
19
+ <?php endif; ?>
20
+
21
+ <?php if ( $section_title ) : ?>
22
+ <h2 class="tab-sub-title <?php echo $show_accordion ? esc_attr( 'wds-accordion-handle' ) : ''; ?>">
23
+ <?php echo esc_html( $section_title ); ?>
24
+
25
+ <?php if ( $section_enabled_option ) : ?>
26
+ <span class="toggle">
27
+ <input
28
+ type="checkbox"
29
+ class="toggle-checkbox"
30
+ value='yes'
31
+ name="<?php echo esc_attr( $section_enabled_option_name ); ?>"
32
+ id="<?php echo esc_attr( $section_enabled_option_name ); ?>"
33
+ <?php checked( $section_enabled ); ?> />
34
+ <label class="toggle-label" for="<?php echo esc_attr( $section_enabled_option_name ); ?>"></label>
35
+ </span>
36
+ <span class="wds-archive-disabled-label"><?php _e( 'Disabled', 'wds' ); ?></span>
37
+ <?php endif; ?>
38
+ </h2>
39
+ <?php endif; ?>
40
+
41
+ <div class="wds-content-tabs-inner <?php echo $show_accordion ? esc_attr( 'wds-accordion-content' ) : ''; ?>" data-type="<?php echo esc_attr( $section_type ); ?>">
42
+ <?php if ( $section_description ) : ?>
43
+ <p class="wds-content-tabs-description"><?php echo esc_html( $section_description ); ?></p>
44
+ <?php endif; ?>
45
+
46
+ <?php $this->_render( $section_template, $section_args ); ?>
47
+ </div>
48
+
49
+ <?php if ( $show_accordion ) : ?>
50
+ </div>
51
+ <?php endif; ?>
includes/admin/templates/vertical-tab.php ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <section class="tab">
2
+ <?php
3
+ // Required
4
+ $tab_id = empty( $tab_id ) ? '' : $tab_id;
5
+ $tab_name = empty( $tab_name ) ? '' : $tab_name;
6
+ $is_active = empty( $is_active ) ? false : $is_active;
7
+ $tab_sections = ! empty( $tab_sections ) && is_array( $tab_sections ) ? $tab_sections : array();
8
+ $option_name = empty( $_view['option_name'] ) ? '' : $_view['option_name'];
9
+
10
+ // Optional
11
+ $button_text = isset( $button_text ) ? $button_text : __( 'Save Settings', 'wds' );
12
+ $before_output = isset( $before_output ) ? $before_output : null;
13
+ $after_output = isset( $after_output ) ? $after_output : null;
14
+
15
+ // Variables
16
+ $is_singular = count( $tab_sections ) == 1;
17
+ $smartcrawl_options = Smartcrawl_Settings::get_options();
18
+ $first_section = true;
19
+ ?>
20
+ <input
21
+ type="radio"
22
+ name="wds-admin-active-tab"
23
+ id="<?php echo esc_attr( $tab_id ); ?>"
24
+ value="<?php echo esc_attr( $tab_id ); ?>"
25
+ <?php checked( $is_active ); ?> />
26
+
27
+ <label for="<?php echo esc_attr( $tab_id ); ?>">
28
+ <?php echo esc_html( $tab_name ); ?>
29
+ </label>
30
+
31
+ <div class="content wds-content-tabs <?php echo $tab_id; ?> <?php echo $is_singular ? '' : 'wds-accordion'; ?>">
32
+ <h2 class="tab-title">
33
+ <?php echo esc_html( $tab_name ); ?>
34
+ </h2>
35
+
36
+ <?php if ( $before_output ) : ?>
37
+ <?php echo($before_output); ?>
38
+ <input
39
+ type="hidden"
40
+ name="wds-admin-active-tab"
41
+ id="<?php echo esc_attr( $tab_id ); ?>"
42
+ value="<?php echo esc_attr( $tab_id ); ?>"/>
43
+ <?php endif; ?>
44
+
45
+ <?php foreach ( $tab_sections as $section ) : ?>
46
+ <?php
47
+ $this->_render('vertical-tab-section', array_merge(
48
+ $section,
49
+ array(
50
+ 'show_accordion' => ! $is_singular,
51
+ 'accordion_section_open' => $first_section,
52
+ )
53
+ ));
54
+
55
+ $first_section = false;
56
+ ?>
57
+ <?php endforeach; ?>
58
+
59
+ <?php if ( $button_text ) : ?>
60
+ <div class="wds-seamless-footer">
61
+ <input name='submit' type='submit' class='button' value='<?php echo esc_attr( $button_text ); ?>'/>
62
+ </div>
63
+ <?php endif; ?>
64
+
65
+ <?php
66
+ if ( $after_output ) {
67
+ echo($after_output);
68
+ }
69
+ ?>
70
+ </div>
71
+ </section>
includes/admin/templates/xsl/index.php ADDED
File without changes
includes/admin/templates/xsl/xml-news-sitemap.xsl ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Original code inspired by WordPress SEO by Joost de Valk (http://yoast.com/wordpress/seo/) -->
3
+ <xsl:stylesheet version="2.0"
4
+ xmlns:html="http://www.w3.org/TR/REC-html40"
5
+ xmlns:s="http://www.sitemaps.org/schemas/sitemap/0.9"
6
+ xmlns:n="http://www.google.com/schemas/sitemap-news/0.9"
7
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
8
+ <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
9
+ <xsl:template match="/">
10
+ <html xmlns="http://www.w3.org/1999/xhtml">
11
+ <head>
12
+ <title>News Sitemap</title>
13
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
14
+ <style type="text/css">
15
+ body {
16
+ font-family: Helvetica, Arial, sans-serif;
17
+ font-size: 13px;
18
+ color: #666;
19
+ }
20
+ h1 {
21
+ color: #e0e0e0;
22
+ }
23
+ table {
24
+ border: 1px solid #e0e0e0;
25
+ border-collapse: collapse;
26
+ margin-bottom: 1em;
27
+ }
28
+ caption {
29
+ text-align: right;
30
+ }
31
+ #sitemap tr.odd {
32
+ background-color: #eee;
33
+ }
34
+ #sitemap tbody tr:hover {
35
+ background-color: #ccc;
36
+ }
37
+ #sitemap tbody tr:hover td, #sitemap tbody tr:hover td a {
38
+ color: #000;
39
+ }
40
+ #content {
41
+ width: 90%;
42
+ margin: 0 auto;
43
+ }
44
+ p {
45
+ text-align: center;
46
+ color: #333;
47
+ font-size: 11px;
48
+ }
49
+ p a {
50
+ color: #6655aa;
51
+ font-weight: bold;
52
+ }
53
+ a {
54
+ color: #000;
55
+ text-decoration: none;
56
+ }
57
+ a:visited {
58
+ color: #939;
59
+ }
60
+ a:hover {
61
+ text-decoration: underline;
62
+ }
63
+ td, th {
64
+ text-align: left;
65
+ font-size: 11px;
66
+ padding: 5px;
67
+ }
68
+ th {
69
+ background-color: #eeF;
70
+ border-right: 1px solid #e0e0e0;
71
+ }
72
+ thead th {
73
+ border-bottom: 2px solid #ddd;
74
+ }
75
+ tfoot th {
76
+ border-top: 2px solid #ddd;
77
+ }
78
+ </style>
79
+ </head>
80
+ <body>
81
+ <div id="content">
82
+ <h1>News Sitemap</h1>
83
+ <table id="sitemap" cellpadding="3">
84
+ <caption>This sitemap contains <strong><xsl:value-of select="count(s:urlset/s:url)"/></strong> URLs.</caption>
85
+ <thead>
86
+ <tr>
87
+ <th width="50%" valign="bottom">Title</th>
88
+ <th width="25%" valign="bottom">Keyword(s)</th>
89
+ <th width="10%" valign="bottom">Genre(s)</th>
90
+ <th width="15%" valign="bottom">Publication Date</th>
91
+ </tr>
92
+ </thead>
93
+ <tfoot>
94
+ <tr>
95
+ <th width="50%" valign="top">Title</th>
96
+ <th width="25%" valign="top">Keyword(s)</th>
97
+ <th width="10%" valign="top">Genre(s)</th>
98
+ <th width="15%" valign="top">Publication Date</th>
99
+ </tr>
100
+ </tfoot>
101
+ <tbody>
102
+ <xsl:for-each select="s:urlset/s:url">
103
+ <xsl:variable name="css-class">
104
+ <xsl:choose>
105
+ <xsl:when test="position() mod 2 = 0">even</xsl:when>
106
+ <xsl:otherwise>odd</xsl:otherwise>
107
+ </xsl:choose>
108
+ </xsl:variable>
109
+ <tr class="{$css-class}">
110
+ <td>
111
+ <xsl:variable name="itemURL">
112
+ <xsl:value-of select="s:loc"/>
113
+ </xsl:variable>
114
+ <a href="{$itemURL}">
115
+ <xsl:value-of select="n:news/n:title"/>
116
+ </a>
117
+ </td>
118
+ <td>
119
+ <xsl:value-of select="n:news/n:keywords"/>
120
+ </td>
121
+ <td>
122
+ <xsl:value-of select="n:news/n:genres"/>
123
+ </td>
124
+ <td>
125
+ <xsl:value-of select="concat(substring(n:news/n:publication_date,0,11),concat(' ', substring(n:news/n:publication_date,12,5)))"/>
126
+ </td>
127
+ </tr>
128
+ </xsl:for-each>
129
+ </tbody>
130
+ </table>
131
+ <p>
132
+ <em>
133
+ This is a News Sitemap, meant for consumption by Google News (visit <a href="http://www.google.com/support/webmasters/bin/answer.py?hl=en&amp;answer=74288">this Google Help article</a> for more info).
134
+ </em>
135
+ </p>
136
+ </div>
137
+ </body>
138
+ </html>
139
+ </xsl:template>
140
+ </xsl:stylesheet>
includes/admin/templates/xsl/xml-sitemap.xsl ADDED
@@ -0,0 +1,218 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Original code inspired by WordPress SEO by Joost de Valk (http://yoast.com/wordpress/seo/) -->
3
+ <xsl:stylesheet version="2.0"
4
+ xmlns:html="http://www.w3.org/TR/REC-html40"
5
+ xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
6
+ xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"
7
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
8
+ <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
9
+ <xsl:template match="/">
10
+ <html xmlns="http://www.w3.org/1999/xhtml">
11
+ <head>
12
+ <title>Sitemap</title>
13
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
14
+ <style type="text/css">
15
+ * {
16
+ margin: 0;
17
+ padding: 0;
18
+ border: 0;
19
+ font-size: 100%;
20
+ vertical-align: baseline;
21
+ box-sizing: border-box;
22
+ }
23
+
24
+ body {
25
+ font-family: Arial, sans-serif;
26
+ font-size: 12px;
27
+ color: #333333;
28
+ line-height: 20px;
29
+ }
30
+
31
+ table {
32
+ border-collapse: collapse;
33
+ margin-bottom: 1em;
34
+ width: 100%;
35
+ clear: both;
36
+ position: relative;
37
+ z-index: 2;
38
+ line-height: 20px;
39
+ }
40
+
41
+ caption {
42
+ text-align: left;
43
+ margin-bottom: 30px;
44
+ margin-top: 10px;
45
+ }
46
+
47
+ #content {
48
+ width: 90%;
49
+ margin: 0 auto;
50
+ position: relative;
51
+ }
52
+
53
+ p {
54
+ text-align: center;
55
+ color: #333;
56
+ font-size: 11px;
57
+ }
58
+
59
+ p a {
60
+ color: #6655aa;
61
+ font-weight: bold;
62
+ }
63
+
64
+ a {
65
+ color: #17A8E3;
66
+ text-decoration: none;
67
+ }
68
+
69
+ a:hover {
70
+ text-decoration: underline;
71
+ }
72
+
73
+ td, th {
74
+ text-align: left;
75
+ font-size: 12px;
76
+ padding: 10px 20px;
77
+ white-space: nowrap;
78
+ }
79
+
80
+ td:first-child {
81
+ white-space: inherit;
82
+ }
83
+
84
+ th {
85
+ background-color: #F2F2F2;
86
+ font-weight: bold;
87
+ }
88
+
89
+ tr.even td {
90
+ background-color: #F8F8F8;
91
+ }
92
+
93
+ tr.even td:first-of-type,
94
+ th:first-of-type {
95
+ border-radius: 5px 0 0 5px;
96
+ }
97
+
98
+ tr.even td:last-of-type,
99
+ th:last-of-type {
100
+ border-radius: 0 5px 5px 0;
101
+ }
102
+
103
+ h1 {
104
+ display: table;
105
+ float: left;
106
+ font-size: 16px;
107
+ font-weight: bold;
108
+ margin-top: 30px;
109
+ }
110
+
111
+ tbody tr {
112
+ color: #666666;
113
+ }
114
+
115
+ .header {
116
+ background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAACgCAYAAADdNUgeAAAAAXNSR0IArs4c6QAAK+9JREFUeAHtfQeYXMWVbt2e7p6cpQnSKA4IJJLJRhipBQIRjNdgC4NIsk0yPCUElte7C9pd/GBBiOiAn/H6g+ewyDxYMMFCQiMQ0SBAWASlCZqc80xPh/v+c7ur5/bt2zf3TItvS9+o61Y4VbdOnVOnTp06l7H/CUwURYH+li9fnkF/FD9Sh+WI7bjVAV++/KZCr9u/JsPjPt+b6VngdnsK3G53hoAghymGw2IQIRAM9oeCY/XBYGh3KBR6KRj0v7hly5aQvGw6xeNeIp065nRfrr5u5U8y3Z6bsnNyZ7tcLsvvDaSKY/6xvr7e7s6unq6QGAy9kSFm/HLbG9s+crrPVuBZfjErjU1GnWuuue7B3Nz8W72ZmVlOtT825mdffv4ZseooSCHMBPa4IMzaUFPzu1Gn2rEC5yuL0Kuuuv6K3Lyc32RnZ+dbGRitOs3NjayzvT2xiMA+Bfe+cvv27Z8lZk5MylcOoTfddJNnxB/aWlhQsFi5Ljo1pJ/v/ZQFAoFk4EYEl2t1Tc3rv0lWIJXpXymEXn311QuycwreAlUWpWrQBgcH2KED+3XBC0x4Mjs367ZXXnnFr1vYwQIuB2FNKqgVK669vKCw9JNUIpNesLe3x9B7ikz84cjwyC6f7+IKQxUcKvSVQOiKFdf/qLikZAu2H26HxiUpmIG+/qR5ygzITKcxcWSbz3fpFGVeqp6PeIRCiv1fxSXFP3e5MlL+LiMjw1g7x0zhApLwcUwceO2SSy4pNlXRYuGUD4LFfhmqtmLFymsLCosftbOvNNRQtNDAwICZ4rGyoNSvDQ4OPevzbUw5BzliEXrFihVLiooKfpeRkTFhgt2QRYRKmBXZElHc+WAMyymKZKQIbkrBXnnllTOKCkve83i8npQ2pADe1HRYpkxQZBp7PHPOnOqDdXW1e4wVN1/qiKNQUpzn5hS+74Xqx/zrWq8xOjrCwiEHVLhi+HGf76Iq6z3RrnnEIfT66294Licvd0K3AjSEw8ND2iNpMBcTspCFR1OmdDiiEIrtydUFhQXfMjh2jhYbHXFORYs96jKfz3e1ox2MAjtiEPrtb68tyi/I/22q1Hl6gzuKLYuTQQyze3H2mu0kTIJ1xCC0sHjgZS+C0wNgFB6toQ6HGZ3tneschnlkIPS6677/D/l5BV93+uWNwiNhCAfcRosbLgfWe6fPtzzPcAUDBY8ICs3Lz/+vyWK1NIb+MXPaIQPjLhWBwqFIFDtvNFreSLm0R+iNN9+2PSPDPaFbFOXAjflTeGAiiuuc1CClNULXrFlTnuX1LlEO8EQ/a5x9OtGVGYKw8xInABGMtEao3x96hSmMt5x6cTNwYCpmprjpsmJYXGm6UpIKaYvQlSvXFkGz97Uk/Z7Q5MBYihEqskucOmJLW4RmZgaeYyDPCcVcksZ6e7qS5DiW7BHCg44oTNIWoR6vd5Fjw2UDUGdHO7YsQRsQjFUNC+I3jZXULpWWCP3BD29+EEvnpPdtEMdlH777NstIvSEErEDZ+dAc2VacTPqgqc23rKzMW9TSJzJtZHiYvftmDU5YwhPSLPakeR0dPWfYbSztEHrzzbdeiH2n4zpOMwPV093F3ti2lQ0PDTFXxsQdGQtiaKGZfqqVTblJhFqjWmkic9Gp/qQIQ6TiO7DvS7b/870MVx6kbgrWb01ovaZqHqj0q4XQdes2nBAMBearvm0KE8OhIKuvq2UHv/gi4dxzQmeWACtBmyGtKNQf8G/OsHGRyOxYkPRau38fO7T/S+ZPot7DgbRZsJbLo63pS5cuLdy2bVufVSBpg9C1a+84KxQOL7X6ImbrtbU0s092f8BGIfxohcyJtXRhYkBcgP68o9Unrby0EYpwHXOTVkedyiOK27vnY/berjd0kXnqaaezex9MuaFe3KuFBPGYuASTD2lBoavX3XGFGArbFgj03p1OTT7AvrKzvU2zqMfjYStvuJF96/LLpHKQuiEkpV65EO1UlWbndDInHaGrHn00UzxQf59OP21n9/Z0s7+9vYvR/lIrlFdUsH+8625WffRRsWIlJcWso6Mj9pzSSFg8shHqOlh/Z5iJc1I5SA21h9iejz7UNcM87Ywz2Pqf/IThQD2uO9OrqiYMofD2MC2ucZMPk7qGrlmzYWZYFP9R3ueBAeOXgeT11OLhcJjt+fAD9vEH7+si87Lly9ld99yTgEyCO71quhr4VKXZugo5qSxXZIHNGJUcPjI9PT2ssaGWHXf8SbY1NH7/KHt/15uMtD5agS6s3bZ2DVu67MKkxaqqZiTNczoD90oL7MCcNISuXn3nxaIY+g7vfH9/v4RM2vaFwiFbCB3Cpdz6ukNsCKo7rYC7pNJ6efJpp2oVY3OrqxkuRDGi+FQHSOG2EDopLHfjxo05TAj9nA8OnFAMNgABfA9v57iKjrsOHdwvWelNqazAiar6KxYWFmJLspnpIZP6mJOTzWbNmsm7m9JfnDLZOnFRf9uUdpmxnp7+u4C82dQMXmCorvagSz77rZxwUP2G+jrW3NQYmxhej5dl5SQ6PymdMoXdt/mhOElW75WPmU/7/dQHUKgtnNiqbOX1Vt1++8kiE9bzukODg4/jmkFsHaV0OXJ5Oa1fcjNDSnXamsjD0NAgGxlK3Kbcdc+/s6qZ5tbFBQsmRsVs9xx4QhEKVusWQsJvMQv52v3moQP72uVIoLiIewJGwwDW3v1ffsGUlu3+kRHW2dqiCua/fv8H1XStxJmzZrOJUQOKtgyYJhSh3b39G4BMbvgV8rg9q7AH/YZyIGFRrkxSfW5ra2W1hw7Ejrp4oYH+Ptba1MRgTcdys7zsNxuuYndcdT7PZm+/+Sb71WOPxZ6NRDJw43/m7FlGitoqgze3dediwhBKR2NMFO7ibwvW8sTmzf/xCdLO5mn8VxC0D5WD8BFE+thGrJk8EJseHhxkLY0NrKutTaLybK+b/WLdd5nvlPnslm+fw65ZdiYvzl564QX2s41347gskSXHCikis2amXjDCtsV4hxT9o0ftkVOpYCXpiSee8LS1d7wM6ozu0IWevFzv5dmu7KoQC/1ECXPKlKkMRmLKZOl5EIqHt3fWsLbmJjbQ18v6e/HX18d6uzoZbVdCUYOu4twstvnWS9mi046PwVl00tFsbx2ouqVTSms8fJht37qVFRQVspmQYuF4I1ZWHhnDVYjXt77GXnz+eebCvjWVAXaOB+rq6/7TahsTcn67as36fwfJ/DPvJKwAVj/68IOP+XznroTXy4TOzz/ueIbr9rx47NcbHGb//dKrLKBx18SFETl7QRW75ZtnsDNPPinB9mEsEGS3bv4Tq9m9LwaXIrSNWXjOOWzescewadOrJMGsubGJfbrnE/b+O+9IlAx/DmzG3Oq4eo4/COy5nTtrLrcKN7XTDb2KnnPG1HtgtXtKivJ/SR0GxZ6j7Dht4NWQSSrBH52awxaXLWa7Pmtk+5t7WEffMJQQYZad6WFTC3LY/Bml7LSjK1lZYQ4rLipgVCc3L09SCvB2vB43+/WdV7MH//Qae+K/d/Fk1gcqf+Uvf5H+YomKCJmlhGBFn+FOpWsHwdYpQEoRumrjxoJQ98DvMS4SLwMywxmujBsh7QZprAQmLoIQEBfUnGaSsVZ97UHWd/wJrKI4j3337GPj6qg9kELhwMGDDH73WF5uHiiwAH9FzAs/G2QUceeKC9jS0+eze5/+K9v9ZYMaCNU0uueSSoRCqNE+21Pt1Xii+qIxnm8r9vUTT30SdLgoBkRgjz3y8CakMbZs2bLKYCD0s1heNFJQUMgKwP54oDXx0MGIJDsGqXVBeS7P0vz1gGrLyyskKiUkwDRUQqzcP1VlaSFbvuQUtvCEapaT5cG1wRDrG4JzDLTDA1H/0VVlzHfyPPaDby5kR8+sZHsbbBERB63+63L9X3hJ2a2eqZ+aMgpds+bO68Ji6GreBUhvB70e4af82e8Pnsfj8t/s3DgdA2uC5od773pvfzu74pRpLGzg8hC2RKy0tASsF5MD6yqx8mThtGNnMvrjoX9olAXByrPAnnOw7ZGHtz8/LH9MQdxVZwdoShC6av36BWIw/AtZx0Jgc9du2rRpXFsuhlQRmps7ToHEapXany/aR9i8Eu1uE1udVhk5VrRiV1sACTlZOGpaSbIsR9JdrnCtHUDJp61FqKR4FwJsCwSeccwIwr0PP7wpZviEPDjtFy5QNkFXDrKysmPJbW2Jmp5n3qvVpDYyFznqqKOYG9SVilBWmMsKcjJTAZr02v7S0tI6O8AdR2h3T/8T0PSMa7IFoeacs8/cKO/kkiUX4Lwq8WSe1k8eRkdHGan1lKFveIz1BZJ0G6x17hxS0SWnMCU8K8+polIcWHxp9wMFSUbGymsytnr1+jXo1DXjtYXWLK/rqiuuuCI0noZYOPAPcc/RBzlCuzqTCx4vftSoVp1VVJSrWhyoFraReHRlatguhO+9NrolVXUModhv+rAPiZliQmPhz3AJlz/wwAOt8k4SuwVvuUqeRnESWuBUSkomKVO5dsrLf1TfxcLueGGF1s2K8vJYsfCQnw2//QULHI5YLAy/+Tnrf+YtNlabcBYQq2M0cvS01HhKDTP2kdE+JCvnyEJzxx13zBkbCz8DYT8GT3QJP5Svm7wD55577iIgtZo/89+ioiLgOTK/+vt7ExTuvBz//evf29hFx44PbEVFJQs29bCxQ23MD8UDIVMcxcGFO4NlnzaXjby7X6ra9+d3WdYpc1n26VhnpxQwV14WEzwZUOSHWRjsPNw9wIL4y114LMtAvlqYW5EaCnUz1wdq7ZlJiyHATCV52Q0bNhSOjAZeAjKn8nRs5n/66MObSKGQEHACcktCIhJKoL/lobszomvlz2q/r+9tZhcfX8HEoJ+RSq64uBhnNEOs70+7WKhzYLwK/AtxZPLE0d2HGP2pBe+cMla6/ltJkUl1Kory1KraTRO9Od4P7QKxhVBItO7unoFnsW7GTn+x49sMZN6r1rHzzjtvXjAQvgICUVx2DrYqOTkRoZjumJCjfiPhL5+2sUvmF0nIlPaZpfms+DofG3juU+atnoVrBUEW7MKhN4Ql77RKJpD1AiRpAVQrkPF0Nyj6IJB7sJ7BZoXlnHUMK7ntIiZ4MzSb93pcrDgvm/UM2jrpimsDXdyLDw4kSoFxpfQfLCOU1sLVa9c/CdyM7ycF9uijj2xan6zZUCD8b0BmwrpdXl4Zq9KtY6UXK4hIzWdN7MLjy1lBwThrzCgvYp4ZlSwLinlXJtZZjBS+ecVE7GlDkJpDXT1stO4wC9Q3Ss8SPEgjhVd9gxVcNn68Jm9HLV5WlOMoQnGMuFOtHbNplhG6du36zUDmdbxBnKDcjxOUDfxZ+Xvu4nMvDYnh7ynTiTrzowghYagHx2BmwtNv17EH5s+LVfFML2FD733ABt+IbXtjeWoRDxT6xbcsY5lQ6psJhRrKBzNweFkIkW/wuJ3fBGoxAmz16tv/BWO/lsqSwt0luNZoIfP888+fBmQ+oQa7vGLcUJxsaM1a/O1t7GZ/hgDEg4BD7YLL9SnNXVnMSm5dxiruv840MqmtbDdQ4FwQs3KzdjgBzjSFEjKxAoJ1StysF9xqBaTZV5J1hlyIdrR3voD8BBIgyTY/eu0ALJx16FwiStbG0zs+Zd+YP4PNLIsoJoh1uiuK2OBre1iwtYeJ/gBzQSfrnl7KSOjJOr2aZR6V0J1k4BPS23HPJeS3ZVgQBxOrwodYP5NvvONKaz+YQujqtXf8G8T7fyGQmJ/vZri8Vz/00H3q4iLK0Dq7xLfkKeAKmqH4QEJM5fQZscQ+fOCGrPeshAAk2fv/3zvskRuXQeKNUA4JOPTnZCAzl/r6enyMp5d5HPyqCDbmSQnCbP+1xbkotGeeeSajYtqMXwJDt2M20be97i4pzr/hvvvu0bxnsHPnm/cAqarbFLIK4JeCiDoP19dKxtFmX4CX7+wfZrgnw06uruBJjv6SFf7BAwdi1vgH2odYbZczVOpyu35cW1vb5ESHdSn0xz/+cf6uXe8+g7XyAuh4/ugSPD99+OH76vQaX7z43B+Bmv9JrRyp+Epl+86eri6YYVqjTjn8P76xl31tTjk7xQY7lcOjOE221tZW1goLQwiB4wEz26FwGF8z/BvG1xFwmgi9/fYNJ434g78ES9gtsIwFjz5y/5dGWl2yZMl3wiHxcbWyHpyCzJg5K5ZFbKw1if1srJDBCA3+z57ZxX512yVsKsxQ7AayCGyob2AjKt6sD7b02AUv1QcanwUy5VPFFtykCCVLvc8/P5CBk5JzEpTrGk36fEt9YjgELVHifpNm4YxZc+I8c5Eg5KS3y75hP9v4hxr20A0XMlIAWAk0yVqaW1h7J/S+iqEehoD1i5d3swO9IWy3IkKYlTZ4nQwh4xked+LXGTqP9mTpoqUnBIXQm6AU1TetnDadTS0rj/Wbrsjv+/KzOJOPWKbNyKLjZrK7rlpkGgpdaWxqbla1LKxt62WbnnuftfcOsamVlTBAyzcNP66CwPbDwm98Ex2Xae3BkFBkBDSU7tOx16wBMseVsrKKRUXFknmkLIk1NNQxvwNrpxwmj9d3wFYXpiRnHjOdJ2n+HoAVIbHrrOAg9piJRbd/Us8eBDL7wQEoFGDL5YYvBjsBwuXDsB9yRKHA+6HSdZ5l/PfSSy/N6e8bxF6TG1LH183JyQGrHV83KbcPlKB2gB1f097TC+/B9hYsc9Wlp5MCRBVYe98Q+89tn7BtH9dKAtCp0zJZWf740VwAvv6e3PoxI4TKg5qpqTxfPy6E3W7XU/rlzJVwBKH9/YO/w8idotY0eRSZNacaAzq+npElX2PTYbXijqe98P4+1gqkbfjOQlYoMx0hm94/QSp++cMDjPaxPHQNjOE4JfLUOziK/e17sAGGgl8W6F1se+gUxJfgYKpBBtaRqG2ELl68ZB2m9nK13pD962wgk5AqD3QFgZA6UeH9L5vY9Q89z84/aS6bDeX93+vb2Y5P61lQxdNm5xAQinCwtZfd/+y7rHtgJKGbXlL62wwYm5/bBKFaXZ0PqRZNTPT5zscXbAPvYLegOjHoCl5RcUlcRbJEoIu56RqOLc9jJ5R52SMv/o2NBcYpV97fQsgDxVNVRQV5MY24sK9m5+vHOrld4Y2pIoJnav1GdLQdTydDJkmzSmSSaq+xcWJYrVbftfI+r29lf32rGUwnealMhe1w8pLqOTiZeiAVyKTWLCO0vb1zIwSOY9W6nAuFe0XULpbn0wA11NXpupfh5Sfjtw+nPaS10gokXMlNTbXKJslryc7OfDpJnu3kcUnFBCif74JjMYXXqVVxw2J9Flgtvbg8tLbAzsehTzbK4ToV7wUi9ZBJbWXjnoyWFb5ef7BV2YyTFft6ziQNWaNQcewhwIuXdKINzJw9B1Ye8Vl0s6uj3b61XZJ3sJ1Md0x7DVpK5EUtE600Cn+BYn9vv+NbFXlfTFMoFAgLwT4vlAPh8SlTy1geru/JA2mDGhvq5ElpFafPSHbDFY6RQLfOuO2TkfLKMr3d3UJfZ/dSZbqTz6YRCpcz/6rWAbJWr5w2bn1AZUgnWld7SNckUw3eRKV1meAchbAstBrIjcAgOJXAyEgudcEUQnGKchyoU3WGkfs0ufKAutx4uCHBO0nqXsU8ZD+uW2jdBpdDpGUk3wa77cFNADoNgmnAxfOmzZsih+1k3BRCQXC3qjVO19lJspUH8uilZf0uLztZ8SETjiKLy6YmTFij/R6GvyT4Y5KKA6meMTb8A6N1zZYzjFCfb2UWpti1ygZImq2YVhWXTA6fWpob49LS7YG+ADGochlKrZ85kAtyId1aCdSOnK3jbBm7PXEVbshlWoGnV8cwQgWhfhmAxZMhEkpKp8Q5ZKLb0vW1pOjWa3py8/u6u6U1Xq8X5K1ziuzIT6+8Mr8TLna4mpMmPz7QR0WqgsOjktWksrzdZ8MIxRWG7yobo61mmeyCECGRnDA6eWCtbNOJ5zEc2fVhq6IXCAFlldMtewalfS2xWx74HMeXL5AkbqyeNm0hz3Pq1xBCwffpgu7FykYLoNOUHyO1QHmg59JUCWOin0ny7pBMXvjwqveAkDkVUrsXvhmshH4cD5LmKS5gxpNgRHdx0HpWSGSvzpo+/ay4MjYfDCEU3xI5ATMqXsuOhqeA3fLQD3dsnSa2ALzexP7C9rcV1giByIlKsrYlZMIA3Oqek0xSu5Pcb6UJRcGN+zVAaj6siV45atos1aPHZP3TSjeE0GBQXKwE4oWnL26CQetmOisPeN87YLmn5p2T59OvhEyYl+TkjXsUkOdrxYn6SEnRo/HBARKSKOC2Ac5UgVSY6wTFwKtzq6qO1oJtNM8QQl1MTGAL8pOUxsM4W5QdEhttfCLLdcAUc6hf+1ZbZM0EZVqQaInqG+BLqR2TJgAvLYRctUCp5LGbAnw2YX3G6OIqZigkvgrJ186ZnATTEELhMfN4qbTsP+5LiG6LpdqURNas6Shd5G3HV5T09pykFCnDmpmNy1NmArFQ+g7Mof37Y58QIY9jfhwVEudSC5TP0e3GtcaIsl+cGxgeed7udkYXoT7fRjeuuh0j7xiZX9D6QlTZAj9C6Rpo4NrgZpW8dGoFiTIJmdE7qlpleV4YVNaNm3L03TRCKExXeVbslyhxDJSbQK3AJt/KUGHaGklIFcWFweGRX8UAWIi49eoIws5qyGZxNhf5UQU8fT+MBi0dA30VogP9C+LSr1YgP0blMC/NzMrSKiblkWPm4UHcEocX0AHoZY04aiYKJqRmkjNK2udFA6WTK3bu2YyQSkiG78KVs6dPf6+uqckSYnUR6gq7ZoZZPNJyYI9KetCuLkcuTPF3dOx3EBJ3VzvpTiMSZTLAZIZZNn06DLLj5musOLFMmhjkHZu7O9eDGassixCFBoAspW1VEJ/f8gge+COMIJo4n3Q5WRQfgeT7/oHm+t0yMIaiuggNi+FKJSQyy6TFP90CDRyp2QiheoH88VYAmUpHjMRx2rG16e/rV2WjenCT5RP7zQhDCFK4qAtISIWbgCj1ElJDgaAXzgT+eOKJJ56yZ8+eoWQw1dJ111Cw2ziEUsMulxtX6uJNG9WAT2QaUVJzQ308MjHxaQBpI0+slfSoFLLwvZZKnA4pkTkM3w61WBPJZlhtTbT7PnSZmVgtF4gkeJiE0iXnqFRMPST2i33/vP6OrgfNtqlLoQAYdz+PNsR9QGa0fbPtpaQ8IYA8WnPhg/zDw9RD2uvJGxSR5oXruSlQV3KKiOTT/rFDEm7oSmKqAridtJ4SfIkwMMnc2LpQIKTGLPGBVZJ+waZvnjtt2p8PNTdvkwoZ+E+fQoX4TzdRo+lyLEaHxuRjPnbWSAOB223k74827spAqsqp+PqgHJkkrbbCTlhS1isrpPCZJh8JQbS9obWUJpLcHYE0IYFwqAd/fVZV1bgDRJ0+Jb51YoW4cyOSM5J93jixaupS6OiLWKx/ZFRqhFgr6ZXVEAkMsiJ8fCcf91HkgSZEA06GeiG1+kkdmELqlLerjBMiycSVvHNzpQOVoaUCq8Sc1pCoes9WCYeedRGK07s4EVA+i9QApjqNKKqjpYV1Qiij9YgCsSdadyIrZHwPaO2cAkfISu0PPv7D6g7uZ2RTlA6BKDRASMXenrzBUKD3IW0SLlrfecws3MM0EHQRCmhxJnyTeTRG24fmhgbp6w/0bsQ6aSvA93LK9yVJtgx6Wa/iO9qExIa6g3EsTll3Mp4JqbRnJRbMuQVNSKDX6w8E/7eRPukjFEKhEUCpLtOPE4xWaKWITVIgJBIy5euhvA+kwpsC/38uUK88jEjIrE1bg2/iOkQ0tG/FDiNCpaTvFcXvGTmV0UUoZofhBVk+cE7FSXigfSFJoVyKJfZKbFYtEIILS+CaHD4clMiWTErr0heZ/H1oWaP1NByMLCnEdullgmJQdy3VRSgTxElDKL1YC1js8EBEF0sIklgsBCC1QEJEKdbL3PxxV3G8HGl9yJoiXVWVvJ/8lzgRCUhcTiArB1DsZUfNnLmAl1H7VR8ZeUmRjZ9iy9NTHA/4xyRkct9FdDXRQ4IPkKoWvNDFTsV9GuV6SWVpUJpg7M3ZtVr9dEujPavEfklXDi4lma0QlQZCq7T6qotQwCjTApCKvDFofWh/iasDEnhiOdL1iiTIzMf3WEiSJQFCLbTCAnEUAtWRFkgtSMgMglIxk6H1kiwGr8ERWyILir6cJkJ9vm8XYd2yZlRjcfSIIlsON8ZYjRtIopN9tcBZrHJ/KS9LR1x0d+VIDJJTZqJUuphMVBpRluSFhka/l+x9NBHK2NDsZBVTkR5ZMw+j71FhAIhMRnWkjyUWq3XsRbpZOtw+kgM/NyUhibRHtOCEBfHKZO+kiVAhHJybrGIq0lvgR0+OTEm6UzYE1lMAKbYEtrLJkE1VaL1sgkovXYOqRkuls4RIku5jygYSCEXRV11drboUaiIUUpUjhksq/UxIam2E3wVaKxAkNhtVWssLkqKAqDJPRYqVl6N4SxPgRddgZd5kPxOVKY/RtPpE2jFpogOx0bNTV9jvv0CtjiZCQd8JtkRqQOym0RrHhRZCphrl5eP+DCkKlIfEkbZFWPMNMtpnUiAnyvwuSSQ/vf6n90si36l2NBR17gE/UDFdNQzfz1MrrL47j5UUyB439pSKSBhUREoDCjRrlcgkBBbC/ldtO4JpKyFuCAfatL+smDFDsqRoh4VfOgc6DeJKEiP9pC0MUagYxhoKx8u0dUP9xWp1k1KoD5eTUElzE6sG0Gxae9SKnToZ7/tHYHmgSrW9Je3PyCqhDapAsk4nYSoTVhSkzm4G6+brsNm+TER52k/SR2vNUCj1S1pLaT1FPLr+zlHbviSl0Azx8OnYBcUp5p1+4WBwjI0OR/aH8tMSWiuLQJX0Kw90l5PMMekjd8CaPAtWCDmsC0bOfhXPmXEFJ/mBqJMCt54w2h3iQKTuJEsKaR3FRgDfmTkR9XfJYSRFaEgMOX6RRt4wxbvaO6UkUrQThdIf7SnzpI8KRDRCRI2jcHNKWxC+RirhSJ69AIMQms6BKIsLQ/SuZgKxaPqj4zUxWjcshKoBwxhCMYdgLR9PBWY6YKTsaNQrCs1a2lcWlpTG2C5RGplMUhl6Ea3gwYWiVnxkXa+cFoyJyFMKdIRUM30mKhWg/kQlqbtYVquU/U5KoZgPKaXQkSiiiH3QV5XoQ7DkmZPWRqJIo0p0ejU6GB5BnXQOtHYqqZJoVHuqxr8RbetwzhRLBPslSfdnsQRExnNlqZEvIIVs37OQgYxGBdJhSYLYcH/kBMWFRzpwJuGG2KvZQFLyENyopnOg9TJmACbrqOSTQoy3eZZlJ0SJmukQnIQqChCREm4Eqkq5OIdbmgDNZgJmZwiNfR+sXLrLx09RcPMUe8ghS8ikLo2NBSzXtflKhquTpaSaEMQNrA0DQkFSMvAAtEY23jwBv6oIxSRQ1ULI6lmIiq/teGPHU6gobRI5SyWq5Boi00DRUclcw3TFiatAQhCXbJWtqiFZWUb5LCnqeaLIEizKExDqw+UkrJ/n8jpO/WLswcnPK4W//ARtOUludABNyCHkQguSICwgRfpHm2yaDNI1BWxjzAgVTr2LGTgRo2n1GpYoFO/PA0YqQaxXWUN3fR0V8nklB389uAN5KbSRQCjWAfpgTuS4U2qCECPCCJVCSHGXRkpU+S+dFQjUXTpc0FLCR85OVF5MJ4kmNcHF8VoCQhMoFIYs5O0kNUEMnwdnDRKFejz2j1nTmjohuKgJQnEDS8JNVMCJS9d5oGWK/oBQGUlEKiUgFBR0sQ481WwSelQzZImgvzPx2EhJEeWBLPMrFvXA8xjQpRuMlFECoSWJlh0oGLzKvDiELlu2DBeTxJOVhQw8k7D6A7zB55plRaEaYpgkFJGZJdeaaNbRyIwYOWoUmKQsSRCCMGQkWBkDkibo5AUCRI6yjbhWx0bGLkIBU5Mmsh0RVpIEC6Q+q2wg/hlf5haE2D11O77zCC5gxYNPgyfqE1Gn8WD+Hcg0RdIWCUKCRWYcQsMCu8R4R6SSAVDJVdHtCD6DLDyvVx92QLG9U/GUMltUGr0nq9fkhOaTAt3MRONKAjOd5NolTIXkCL3ppps8wPr5RgFjIo7CaOk7O3e+voXXWbx48UeI9/BntV8s5tDRkcYoEug6vNVAmhYzg2e1HaP1CDnSBSOjFVDOCkJj4LVY7r59h85GQUPbFfS7F7Z4F7y+8/UXY8AR2bhxIyyZhDflacq4EBKC8r1oJpTyxaXWtYyqdkfKRifoWenJ20izZPhlOWiz3PCFRgCDIprwGflztu/croo45P9NB84oxLN6eZnCkmKWK/swujxPL06H4uZXIT2o5vOJMq0IOFJLoBCLIeEbc+PTQwzr7j+BrL3eTM9ZNTVb/56sA0JY3J0sT0p3szZcr6hVlpkKQ+nsvFxlsu4zDYUVytAFbLJAsrs2RsBYZruimOBiW0Koz3dxBRQ1J2k2LrDXsnOyFm7duvWwVjnRlfmZRr4YCpU0Q5A6pFamHJ4vQam05vN1X61YQhpRRzJ9aULhFCRQ+3bWcqt1sQ9VP20RxVEShpLSPWbQ/xEE38X4PEW/3nj4fF9vIIFJrRzS62tqtuDcTDiglo80sbyi8hYoze5FPCY4JSkbl0z3XsxtF+Kq23qwO5msIhRCbD4+iJQh73yU5Yo+eeJ4XAhj0b5zx84dN9XUbExQM42XG4+RYATyUqdiUfiESrpc4r7xGjwmkE3bDWjr1/Uth/8JitDv4jRCdWLwGvJfySoObCbprJQXdjAurZ3W10CpJ1r6Xp2uCm+99VYc25UQikFYrKyIPg4i87Kamtc3KfN0n0VBHaEuoYbqYhC+UMCgU+8bsZ/9LU+vb2x8bkwQ54FoVdkz6XHJ2m8MpzTkeMKPkxc6rTHFq3ljNn6dkLItUyj67QoE4hF60UUXTcXgVCve6TCOdr6BAX5BkW7oERv+NrWC2K68Run4zGIffmJIx3byR3Jk8rrNzc2H61taqoGlxzDpYq40SfUV8x5Cx21A7qQEzHrLkq2sw3YQinV0igwUc42Ojp4hT8D69r7gyjljx44dEnuMzzP8FDHniysu7APMvTwJ7FSShoml19TUPMHT1X7rW5tXg5fKtkPODKRaW2bSrB5/qbVhle1CDRi3iXfjDPJrvAEM8rNTy6dcu2XLloixLM8w/5twfw/2bU/JwWByvw4D0wNGWXpYFPIBQwJB6yT555NOHECd9I9O/2kp49oj8llLR0ypDNKlXJx6KK39rbQpUakFRgMD7HiEAhA+roMBcbke2bFj+zo8WwCb8AoRC7BoMgY6iI+oxiE0KyfriZdffnnMKLtBt/Kj+Iw1RgJJsjBRbHgM63YmbVuSdcRgumS9YGX+CUIcQl3A3jx0ZiMoZa1DyKRXiJNOQTt/VO5f6Qt9ZtrDnMszODbSmjpRCEVjuj7sjfRbsgA0UlBZRnHDnrTbf655o+ZfleXsPEOhGzsiAxzR5XbdZwce1cWkSDj7SwYz1axW2S61Z9dYzYa2qFzeH9fUqaUPyBOcjgMRT23fvl1Le2SwSeOuAWhtm+jA13Or7dLSY3T5UbRRJn92QwDSNR2RVzASF6AjACdCEPozPK4NRurolhGZ1+hCxb+8oAvTZgHpJhnWT5JQLSIjrgdEpaHIwMWlaz6IYjxCNQtbzMRHe2DrQoKWcDeoU3VPaho0jhqN1KG10wmpLllbknkJDrElNzPJCllNx8QwqfGku0BV8uYIguMBQLPBQN7y+RY96gRwn89H5qaGBMlUrZ90mpKJ641Z+E6q5D/eiRdTwKBtl9kAI4NiTOJYzZQgFA1gc5Z5jXTgbbaHKuUP7907G8mxTqsUiSU5vX4SJWZ6M+EKwMu8+JXusabI9sWscoHYPDiGMKOsLKbpSwlCvVnex2tqXq2LjbLNSNjjmWsUhFPrJw0WfT2KEElI9MCxMqURSyfHiqkIZi3puR5ZzMg4hvdHxXKeZ1n/xZ5zyHrtxJpwLT4fdyQSMxQpTq2f5LiDey4jZPItRWR7AhnSrOCi6GfSRzqnMhG4YgWsaw6vlhKEcuCO/YbE+UZg2V0/iadLXrHBZon9SfdSooyetiX0l8pgZrmQS9ZgszN5v44MhNIxmoHJa/kWG0aDqJB8OkCYk05QJGRGR4n813LHT3zgnP41y8o5dVI/cGc0Zjp5RCAUHA7novqBLsNaCS5cKvKCtZLcRQPFB4sGmb7MlNqNUKTHdJhgJsiP7UChsb3oEYFQSCNleuuWxK4sIFRCJnwhUSAnkTFBA+uZ5A3TCGswgwmVsvRlQzPLhZzdEriwIJRysCmRcjlwJ35nzZo1H8jUvVsQdxHWYMM0y71RZBKL5ciUhB+iGAsTxGDTsWLwSdhLPojMBM5BeB0s80U8nvYIdYVC3+ed1fo1I1AQHEImCUAUSKLlLIzcsJFpizXmLYEz9h8mCz4tEsalo98bqzBeKuH8VXYSlfYIxQDrXm+kNc4My6L9JL/uJ21LoooCEqomwuEj9ZVMaGBt8CSEsa3jqNKPEXVGBe9YYbxP7I5L2q+hOG6fl/AGsVeJRKTbWIq0pI9AJlk7EFIjyIzM6YnYllCfqB1JABKEfnTgn7H+5cDzR9LuKjNUdciye6JpjdBZVbMuxqf69NdPExtykmYnBZlgsaRh4lsr9OGe1ra2dkJYeUkJGc0lXGtQIpP6TUKcSojhMb1ZbiiwTqXzCUlG188IRUILREdeWEMpTARl0vbHH/3KQ7Tzh0rLyx+JxokB7eFxrV+lMMTLoj48HUQU9OmNUCaczTut9Wtk/SRWRScmNChcqCDpMtXaH4JPPpnkDj6wbt69d+/ecT4rRAzQtd6R8rgUrlJOqCotlZQLaYvQ2ZWVuA2n/80YuSMmlReVkohVcZUen+WkhOD+3JPVs5VOLBb7S1ov5RIzqOnvN69a9Qc5bFDXx/JntTi9A/0lDZ5s6Vz0/wNWrF+4qBeoMAAAAABJRU5ErkJggg==") no-repeat right center;
117
+ background-size: 60px 80px;
118
+ display: table;
119
+ float: right;
120
+ height: 80px;
121
+ position: absolute;
122
+ right: 15px;
123
+ top: 30px;
124
+ width: 190px;
125
+ z-index: 3;
126
+ }
127
+
128
+ .header span {
129
+ display: table-cell;
130
+ padding-bottom: 10px;
131
+ vertical-align: bottom;
132
+ color: #888888;
133
+ font-size: 10px;
134
+ }
135
+
136
+ .header span a {
137
+ color: #333333;
138
+ }
139
+
140
+ .footer,
141
+ .footer a,
142
+ .footer a:hover,
143
+ .footer a:active,
144
+ .footer a:focus {
145
+ color: #888888;
146
+ font-size: 10px;
147
+ margin-top: 30px;
148
+ }
149
+
150
+ .footer a {
151
+ font-weight: bold;
152
+ }
153
+
154
+ @media all and (max-width: 700px){
155
+ td, th {
156
+ padding: 10px;
157
+ }
158
+ }
159
+ </style>
160
+ </head>
161
+ <body>
162
+ <div id="content">
163
+ <div class="header">
164
+ <span>Powered by <a target="_blank" href="https://premium.wpmudev.org/project/smartcrawl-wordpress-seo/">SmartCrawl</a></span>
165
+ </div>
166
+ <h1>Sitemap</h1>
167
+ <table id="sitemap">
168
+ <caption>This XML sitemap index file contains <strong><xsl:value-of select="count(sitemap:urlset/sitemap:url)"/></strong> URLs.</caption>
169
+ <thead>
170
+ <tr>
171
+ <th width="75%" valign="bottom">URL</th>
172
+ <th width="5%" valign="bottom">Priority</th>
173
+ <th width="5%" valign="bottom">Frequency</th>
174
+ <th width="5%" valign="bottom">Images</th>
175
+ <th width="10%" valign="bottom">Last Modified</th>
176
+ </tr>
177
+ </thead>
178
+ <tbody>
179
+ <xsl:for-each select="sitemap:urlset/sitemap:url">
180
+ <xsl:variable name="css-class">
181
+ <xsl:choose>
182
+ <xsl:when test="position() mod 2 = 0">even</xsl:when>
183
+ <xsl:otherwise>odd</xsl:otherwise>
184
+ </xsl:choose>
185
+ </xsl:variable>
186
+ <tr class="{$css-class}">
187
+ <td>
188
+ <xsl:variable name="item_url">
189
+ <xsl:value-of select="sitemap:loc"/>
190
+ </xsl:variable>
191
+ <a href="{$item_url}">
192
+ <xsl:value-of select="sitemap:loc"/>
193
+ </a>
194
+ </td>
195
+ <td>
196
+ <xsl:value-of select="concat(sitemap:priority*100,'%')"/>
197
+ </td>
198
+ <td>
199
+ <xsl:value-of select="sitemap:changefreq"/>
200
+ </td>
201
+ <td>
202
+ <xsl:value-of select="count(image:image)"/>
203
+ </td>
204
+ <td>
205
+ <xsl:value-of select="concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)))"/>
206
+ </td>
207
+ </tr>
208
+ </xsl:for-each>
209
+ </tbody>
210
+ </table>
211
+ <p class="footer">
212
+ This is an XML Sitemap, meant for consumption by search engines. For more info visit <a href="http://sitemaps.org">sitemaps.org</a>.
213
+ </p>
214
+ </div>
215
+ </body>
216
+ </html>
217
+ </xsl:template>
218
+ </xsl:stylesheet>
includes/admin/templates/xsl/xml-video-sitemap.xsl ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Original code inspired by WordPress SEO by Joost de Valk (http://yoast.com/wordpress/seo/) -->
3
+ <xsl:stylesheet version="2.0"
4
+ xmlns:html="http://www.w3.org/TR/REC-html40"
5
+ xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"
6
+ xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"
7
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
8
+ <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
9
+
10
+ <xsl:template match="/">
11
+ <html xmlns="http://www.w3.org/1999/xhtml">
12
+ <head>
13
+ <title>Video Sitemap</title>
14
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
15
+ <style type="text/css">
16
+ body {
17
+ font-family: Helvetica, Arial, sans-serif;
18
+ font-size: 13px;
19
+ color: #666;
20
+ }
21
+ h1 {
22
+ color: #e0e0e0;
23
+ }
24
+ table {
25
+ border: 1px solid #e0e0e0;
26
+ border-collapse: collapse;
27
+ margin-bottom: 1em;
28
+ }
29
+ caption {
30
+ text-align: right;
31
+ }
32
+ #sitemap tr.odd {
33
+ background-color: #eee;
34
+ }
35
+ #sitemap tbody tr:hover {
36
+ background-color: #ccc;
37
+ }
38
+ #sitemap tbody tr:hover td, #sitemap tbody tr:hover td a {
39
+ color: #000;
40
+ }
41
+ #content {
42
+ width: 90%;
43
+ margin: 0 auto;
44
+ }
45
+ p {
46
+ text-align: center;
47
+ color: #333;
48
+ font-size: 11px;
49
+ }
50
+ p a {
51
+ color: #6655aa;
52
+ font-weight: bold;
53
+ }
54
+ a {
55
+ color: #000;
56
+ text-decoration: none;
57
+ }
58
+ a:visited {
59
+ color: #939;
60
+ }
61
+ a:hover {
62
+ text-decoration: underline;
63
+ }
64
+ td, th {
65
+ text-align: left;
66
+ font-size: 11px;
67
+ padding: 5px;
68
+ }
69
+ th {
70
+ background-color: #eeF;
71
+ border-right: 1px solid #e0e0e0;
72
+ }
73
+ thead th {
74
+ border-bottom: 2px solid #ddd;
75
+ }
76
+ tfoot th {
77
+ border-top: 2px solid #ddd;
78
+ }
79
+ </style>
80
+ </head>
81
+ <body>
82
+ <div id="content">
83
+ <h1>Video Sitemap</h1>
84
+ <table id="sitemap">
85
+ <caption>This sitemap contains <strong><xsl:value-of select="count(sitemap:urlset/sitemap:url)"/></strong> URLs.</caption>
86
+ <thead>
87
+ <tr>
88
+ <th width="10%" valign="bottom">Video</th>
89
+ <th width="25%" valign="bottom">Post / Page</th>
90
+ <th width="30%" valign="bottom">Description</th>
91
+ <th width="20%" valign="bottom">Tags</th>
92
+ <th width="15%" valign="bottom">Pub Date</th>
93
+ </tr>
94
+ </thead>
95
+ <tfoot>
96
+ <tr>
97
+ <th width="10%" valign="top">Video</th>
98
+ <th width="25%" valign="top">Post / Page</th>
99
+ <th width="30%" valign="top">Description</th>
100
+ <th width="20%" valign="top">Tags</th>
101
+ <th width="15%" valign="top">Pub Date</th>
102
+ </tr>
103
+ </tfoot>
104
+ <tbody>
105
+ <xsl:for-each select="sitemap:urlset/sitemap:url">
106
+ <xsl:variable name="css-class">
107
+ <xsl:choose>
108
+ <xsl:when test="position() mod 2 = 0">even</xsl:when>
109
+ <xsl:otherwise>odd</xsl:otherwise>
110
+ </xsl:choose>
111
+ </xsl:variable>
112
+ <tr class="{$css-class}">
113
+ <xsl:if test="position() mod 2 = 1">
114
+ <xsl:attribute name="class">odd</xsl:attribute>
115
+ </xsl:if>
116
+
117
+ <td>
118
+ <xsl:variable name="thumbURL">
119
+ <xsl:value-of select="video:video/video:thumbnail_loc"/>
120
+ </xsl:variable>
121
+
122
+ <xsl:variable name="flvURL">
123
+ <xsl:value-of select="video:video/video:player_loc"/>
124
+ </xsl:variable>
125
+
126
+ <a href="{$flvURL}"><img src="{$thumbURL}" width="80" height="60" /></a>
127
+ </td>
128
+
129
+ <td>
130
+ <xsl:variable name="itemURL">
131
+ <xsl:value-of select="sitemap:loc"/>
132
+ </xsl:variable>
133
+ <a href="{$itemURL}">
134
+ <strong><xsl:value-of select="video:video/video:title"/></strong>
135
+ </a>
136
+ </td>
137
+
138
+ <td>
139
+ <xsl:variable name="desc">
140
+ <xsl:value-of select="video:video/video:description"/>
141
+ </xsl:variable>
142
+ <xsl:choose>
143
+ <xsl:when test="string-length($desc) &lt; 200">
144
+ <xsl:value-of select="$desc"/>
145
+ </xsl:when>
146
+ <xsl:otherwise>
147
+ <xsl:value-of select="concat(substring($desc,1,200),' ...')"/>
148
+ </xsl:otherwise>
149
+ </xsl:choose>
150
+ </td>
151
+
152
+ <td>
153
+ <xsl:for-each select="video:video/video:tag">
154
+ <xsl:value-of select="."/>,
155
+ </xsl:for-each>
156
+ </td>
157
+
158
+ <td>
159
+ <xsl:value-of select="concat(substring(video:video/video:publication_date,0,11),concat(' ', substring(video:video/video:publication_date,12,5)))"/>
160
+ </td>
161
+ </tr>
162
+ </xsl:for-each>
163
+ </tbody>
164
+ </table>
165
+ <p>
166
+ <em>This is an XML Sitemap, meant for consumption by search engines (visit
167
+ <a href="http://sitemaps.org">sitemaps.org</a> for more info).</em>
168
+ </p>
169
+ </div>
170
+ </body>
171
+ </html>
172
+ </xsl:template>
173
+
174
+ </xsl:stylesheet>
includes/core/checks/class_wds_check_abstract.php ADDED
@@ -0,0 +1,218 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Abstractions related to checks
4
+ *
5
+ * @package wpmu-dev-seo
6
+ */
7
+
8
+ /**
9
+ * Check abstraction class
10
+ */
11
+ abstract class Smartcrawl_Check_Abstract {
12
+
13
+ /**
14
+ * Applies the check
15
+ *
16
+ * @return bool
17
+ */
18
+ abstract public function apply ();
19
+
20
+ /**
21
+ * Gets status message
22
+ *
23
+ * @return string
24
+ */
25
+ abstract public function get_status_msg ();
26
+
27
+ /**
28
+ * Recommendation getter
29
+ *
30
+ * To be overridden in concrete implementations
31
+ *
32
+ * @return string
33
+ */
34
+ public function get_recommendation() {
35
+ return '';
36
+ }
37
+
38
+ /**
39
+ * More info getter
40
+ *
41
+ * To be overridden in concrete implementations
42
+ *
43
+ * @return string
44
+ */
45
+ public function get_more_info() {
46
+ return '';
47
+ }
48
+
49
+ /**
50
+ * Holds subject reference
51
+ *
52
+ * @var string|WP_Post
53
+ */
54
+ private $_subject = '';
55
+
56
+ /**
57
+ * Holds a list of expected keywords (as strings)
58
+ *
59
+ * This is an internal normalized focus keywords representation,
60
+ * where the key phrases are also normalized to words.
61
+ *
62
+ * @var array
63
+ */
64
+ private $_focus = array();
65
+
66
+ /**
67
+ * Holds a list of raw keywords
68
+ *
69
+ * As opposed to $_focus, this one holds raw,
70
+ * denormalized version of focus key words|phrases.
71
+ *
72
+ * @var array
73
+ */
74
+ private $_raw_focus_keywords = array();
75
+
76
+ /**
77
+ * Constructor
78
+ *
79
+ * Accepts optional current working markup parameter
80
+ *
81
+ * @param string $markup Current working markup (optional).
82
+ */
83
+ public function __construct( $markup = '' ) {
84
+ $this->set_subject( $markup );
85
+ }
86
+
87
+ /**
88
+ * Sets working markup
89
+ *
90
+ * @param string|WP_Post $subject Markup to work with.
91
+ *
92
+ * @return bool
93
+ */
94
+ public function set_subject( $subject = '' ) {
95
+ return is_string( $subject ) || (is_object( $subject ) && $subject instanceof WP_Post)
96
+ ? ! ! $this->_subject = $subject
97
+ : false
98
+ ;
99
+ }
100
+
101
+ /**
102
+ * Gets current working markup
103
+ *
104
+ * @return string Working markup
105
+ */
106
+ public function get_markup() {
107
+ return $this->_subject;
108
+ }
109
+
110
+ /**
111
+ * Sets expected keywords
112
+ *
113
+ * Converts keywords collection to internal representation,
114
+ * abstracting away key phrases and normalizing everything
115
+ * to a list of words which can be checked.
116
+ *
117
+ * @param array $keywords List of expected keywords.
118
+ *
119
+ * @return bool
120
+ */
121
+ public function set_focus( $keywords = array() ) {
122
+ $kwds = array();
123
+ foreach ( $keywords as $k ) {
124
+ $kwds = array_merge( $kwds, Smartcrawl_String::keywords( $k ) );
125
+ }
126
+ $this->_raw_focus_keywords = $keywords;
127
+ return ! ! $this->_focus = array_unique( array_keys( $kwds ) );
128
+ }
129
+
130
+ /**
131
+ * Returns list of expected keywords
132
+ *
133
+ * @return array
134
+ */
135
+ public function get_focus() {
136
+ return (array) $this->_focus;
137
+ }
138
+
139
+ /**
140
+ * Returns raw, non-internal focus keywords
141
+ *
142
+ * @return array
143
+ */
144
+ public function get_raw_focus() {
145
+ return (array) $this->_raw_focus_keywords;
146
+ }
147
+
148
+ /**
149
+ * Checks if subject string length is within constraints
150
+ *
151
+ * @param string $str Subject string.
152
+ * @param int $min Optional minimum length.
153
+ * @param int $max Optional maximum length.
154
+ *
155
+ * @return bool|int (bool)true if within constraints
156
+ * negative integer if shorter than $min
157
+ * positive integer if longer than $max
158
+ */
159
+ public function is_within_char_length( $str, $min, $max ) {
160
+ $str = '' . $str;
161
+ $min = (int) $min;
162
+ $max = (int) $max;
163
+
164
+ if ( $min && Smartcrawl_String::len( $str ) < $min ) { return -1; }
165
+ if ( $max && Smartcrawl_String::len( $str ) > $max ) { return 1; }
166
+
167
+ return true;
168
+ }
169
+
170
+ /**
171
+ * Checks whether we have some keywords in place
172
+ *
173
+ * @param string $str Subject string.
174
+ *
175
+ * @return bool
176
+ */
177
+ public function has_focus( $str ) {
178
+ $kws = Smartcrawl_String::keywords( $str );
179
+ $expected = $this->get_focus();
180
+
181
+ if ( empty( $expected ) ) { return true; } // We don't seem to have any focus keywords, so... yeah.
182
+ $diff = array_diff( $expected, array_keys( $kws ) );
183
+
184
+ return count( $expected ) !== count( $diff );
185
+ }
186
+
187
+ }
188
+
189
+
190
+ /**
191
+ * Post-specific check abstraction class
192
+ */
193
+ abstract class Smartcrawl_Check_Post_Abstract extends Smartcrawl_Check_Abstract {
194
+
195
+ /**
196
+ * Gets post content markup
197
+ *
198
+ * @return string Decorated markup
199
+ */
200
+ public function get_markup() {
201
+ $subject = parent::get_markup();
202
+
203
+ if ( is_object( $subject ) ) {
204
+ if ( ! class_exists( 'Smartcrawl_Html' ) ) { require_once( SMARTCRAWL_PLUGIN_DIR . '/core/class_wds_html.php' ); }
205
+ return Smartcrawl_Html::decorate( $subject->post_content );
206
+ }
207
+
208
+ return $subject;
209
+ }
210
+
211
+ /**
212
+ * Gets subject directly
213
+ */
214
+ public function get_subject() {
215
+ $subject = parent::get_markup();
216
+ return $subject;
217
+ }
218
+ }
includes/core/checks/class_wds_check_content_length.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! class_exists( 'Smartcrawl_Check_Abstract' ) ) { require_once( dirname( __FILE__ ) . '/class_wds_check_abstract.php' ); }
4
+
5
+ class Smartcrawl_Check_Content_Length extends Smartcrawl_Check_Abstract {
6
+
7
+ /**
8
+ * Holds check state
9
+ *
10
+ * @var int
11
+ */
12
+ private $_state;
13
+
14
+ private $_wordcount = null;
15
+
16
+ public function get_status_msg() {
17
+ if ( -1 === $this->_state ) { return __( 'There is no content', 'wds' ); }
18
+ return $this->_state === false
19
+ ? sprintf( __( 'Content is shorter than %d words', 'wds' ), $this->get_min() )
20
+ : sprintf( __( 'Content is greater than %d words', 'wds' ), $this->get_min() );
21
+ }
22
+
23
+ public function apply() {
24
+ $markup = $this->get_markup();
25
+ if ( empty( $markup ) ) {
26
+ $this->_state = -1;
27
+ return false;
28
+ }
29
+
30
+ $words = Smartcrawl_String::words( Smartcrawl_Html::plaintext( $markup ) );
31
+
32
+ $count = count( $words );
33
+ $this->_wordcount = $count;
34
+ return ! ! $this->_state = $count > $this->get_min();
35
+ }
36
+
37
+ public function get_min() {
38
+ return 300;
39
+ }
40
+
41
+ public function get_recommendation() {
42
+ $word_count = $this->_wordcount ? $this->_wordcount : 0;
43
+
44
+ if ( $word_count === 0 ) {
45
+ $message = __( 'Unless your website is a photography blog it\'s generally a good idea to include content for your visitors to read, and also Google to help with indexing. Something, anything, is better than nothing.', 'wds' );
46
+ } elseif ( $this->_state ) {
47
+ $message = __( 'Your content is longer than the recommend minimum of %1$d words, excellent!', 'wds' );
48
+ } else {
49
+ $message = __( 'The best practice minimum content length for the web is %1$d words so we recommend you aim for at least this amount - the more the merrier.', 'wds' );
50
+ }
51
+
52
+ return sprintf(
53
+ $message,
54
+ $this->get_min(),
55
+ $word_count
56
+ );
57
+ }
58
+
59
+ public function get_more_info() {
60
+ $message = __( 'Content is ultimately the bread and butter of your SEO. Without words, your pages and posts will have a hard time ranking for the keywords you want them to. As a base for any article best practice suggests a minimum of %1$d words, with 1000 being a good benchmark and 1600 being the optimal. Numerous studies have uncovered that longer content tends to perform better than shorter content, with pages having 1000 words or more performing best. Whilst optimizing your content for search engines is what we\'re going for here, a proven bi-product is that high quality long form articles also tend to get shared more on social platforms. With the increasing power of social media as a tool for traffic it\'s a nice flow on effect of writing those juicy high quality articles your readers are waiting for.', 'wds' );
61
+ return sprintf(
62
+ $message,
63
+ $this->get_min()
64
+ );
65
+ }
66
+ }
includes/core/checks/class_wds_check_focus.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! class_exists( 'Smartcrawl_Check_Abstract' ) ) { require_once( dirname( __FILE__ ) . '/class_wds_check_abstract.php' ); }
4
+
5
+ class Smartcrawl_Check_Focus extends Smartcrawl_Check_Post_Abstract {
6
+
7
+ /**
8
+ * Holds check state
9
+ *
10
+ * @var int
11
+ */
12
+ private $_state;
13
+
14
+ public function get_status_msg() {
15
+ return $this->_state === false
16
+ ? __( 'There are no focus keywords', 'wds' )
17
+ : __( 'There are some focus keywords', 'wds' );
18
+ }
19
+
20
+ public function apply() {
21
+ $focus = $this->get_focus();
22
+ return ! ! $this->_state = ! empty( $focus );
23
+ }
24
+
25
+ public function get_recommendation() {
26
+ return false === $this->_state
27
+ ? __( 'In order to give your content the best possible chance to be discovered, it is best to select some focus keywords or key phrases, to give it some context.', 'wds' )
28
+ : __( 'Nice work, now that we know what your article is about we can be more specific in analysis.', 'wds' );
29
+ }
30
+
31
+ public function get_more_info() {
32
+ return __( 'Selecting focus keywords helps describe what your content is about.', 'wds' );
33
+ }
34
+ }
includes/core/checks/class_wds_check_focus_stopwords.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! class_exists( 'Smartcrawl_Check_Abstract' ) ) { require_once( dirname( __FILE__ ) . '/class_wds_check_abstract.php' ); }
4
+
5
+ class Smartcrawl_Check_Focus_Stopwords extends Smartcrawl_Check_Post_Abstract {
6
+
7
+ private $_state;
8
+
9
+ public function get_status_msg() {
10
+ return $this->_state === false
11
+ ? __( 'There are stop words in focus keywords', 'wds' )
12
+ : __( 'Focus to the point', 'wds' );
13
+ }
14
+
15
+ public function apply() {
16
+ $focus = $this->get_raw_focus();
17
+ $state = true;
18
+ foreach ( $focus as $phrase ) {
19
+ if ( ! Smartcrawl_String::has_stopwords( $phrase ) ) { continue; }
20
+ $state = false;
21
+ break;
22
+ }
23
+ return ! ! ($this->_state = $state);
24
+ }
25
+
26
+ public function get_recommendation() {
27
+ $focus = $this->get_raw_focus();
28
+ $keyphrase = __( 'keywords', 'wds' );
29
+ if ( count( $focus ) > 1 ) {
30
+ $keyphrase = __( 'keywords or key phrases', 'wds' );
31
+ } else {
32
+ $subj = end( $focus );
33
+ $keyphrase = false === strpos( $subj, ' ' )
34
+ ? __( 'keywords', 'wds' )
35
+ : __( 'key phrase', 'wds' );
36
+ }
37
+ $message = $this->_state
38
+ ? __( 'You kept the focus %s of your article to the point, way to go!', 'wds' )
39
+ : __( 'Your focus %s contains some words that might be considered insignificant in a search query.', 'wds' );
40
+ return sprintf( $message, $keyphrase );
41
+ }
42
+
43
+ public function get_more_info() {
44
+ return __( 'Stop words are words which can be considered insignificant in a search query, either because they are way too common, or because they do not convey much information. Such words are often filtered out from a search query. Ideally, you will want such words to not be a part of your article focus.', 'wds' );
45
+ }
46
+ }
includes/core/checks/class_wds_check_imgalts_keywords.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! class_exists( 'Smartcrawl_Check_Abstract' ) ) { require_once( dirname( __FILE__ ) . '/class_wds_check_abstract.php' ); }
4
+
5
+ class Smartcrawl_Check_Imgalts_Keywords extends Smartcrawl_Check_Abstract {
6
+
7
+ private $_state;
8
+
9
+ private $_image_count = null;
10
+
11
+ public function get_status_msg() {
12
+ $image_count = $this->_image_count ? $this->_image_count : 0;
13
+
14
+ if ( $image_count === 0 ) {
15
+ return __( 'No images found', 'wds' );
16
+ } else {
17
+ return $this->_state === false
18
+ ? __( 'Image alts have no keywords', 'wds' )
19
+ : __( 'Image alt tags contain keywords', 'wds' );
20
+ }
21
+
22
+ }
23
+
24
+ public function apply() {
25
+ $subjects = Smartcrawl_Html::find_attributes( 'img', 'alt', $this->get_markup() );
26
+ $this->_image_count = count( $subjects );
27
+ if ( empty( $subjects ) ) { return false; }
28
+
29
+ $status = true;
30
+ foreach ( $subjects as $subject ) {
31
+ if (empty($subject)) {
32
+ $status = false;
33
+ break;
34
+ }
35
+ $status = $this->has_focus( $subject );
36
+ if ( !$status ) { break; }
37
+ }
38
+
39
+ return ! ! $this->_state = $status;
40
+ }
41
+
42
+ public function get_recommendation() {
43
+ $image_count = $this->_image_count ? $this->_image_count : 0;
44
+
45
+ if ( $image_count === 0 ) {
46
+ $message = __( 'Images are a great addition to any piece of content. Consider adding imagery to enhance the reading experience of your article.', 'wds' );
47
+ } elseif ( $this->_state ) {
48
+ $message = __( "You've added alternative text attributes to all your images which helps search engines correctly index images and aid visually impaired readers, awesome!", 'wds' );
49
+ } else {
50
+ $message = __( "Alternative attribute text for images help search engines correctly index images and aid visually impaired readers. The text is also used in place of the image if it's unable to load. You should add alternative text for all images in your content.", 'wds' );
51
+ }
52
+
53
+ return $message;
54
+ }
55
+
56
+ public function get_more_info() {
57
+ if (empty($this->_image_count)) return false;
58
+
59
+ return $this->_state === false
60
+ ? ''
61
+ : __( "Image alternative text attributes help search engines correctly index images, aid visually impaired readers and the text is used in place of the image if it's unable to load. You should add alternative text for all images in your content.", 'wds' )
62
+ ;
63
+ }
64
+ }
includes/core/checks/class_wds_check_keyword_density.php ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! class_exists( 'Smartcrawl_Check_Abstract' ) ) { require_once( dirname( __FILE__ ) . '/class_wds_check_abstract.php' ); }
4
+
5
+ class Smartcrawl_Check_Keyword_Density extends Smartcrawl_Check_Abstract {
6
+
7
+ /**
8
+ * Holds check state
9
+ *
10
+ * @var int
11
+ */
12
+ private $_state;
13
+
14
+ private $_density = null;
15
+
16
+ public function get_status_msg() {
17
+ return $this->_state === false
18
+ ? sprintf( __( 'Keyword density is less than %1$d%%', 'wds' ), $this->get_min() )
19
+ : sprintf( __( 'Keyword density is more than %1$d%%', 'wds' ), $this->get_min() );
20
+ }
21
+
22
+ public function apply() {
23
+ $markup = $this->get_markup();
24
+ if ( empty( $markup ) ) { return ! ! $this->_state = false; }
25
+
26
+ $kws = $this->get_focus();
27
+ if ( empty( $kws ) ) { return ! ! $this->_state = true; // Can't determine kw density
28
+ }
29
+ $words = Smartcrawl_String::words( Smartcrawl_Html::plaintext( $markup ) );
30
+ $freq = array_count_values( $words );
31
+ $densities = array();
32
+ if (!empty($words)) {
33
+ foreach ( $kws as $kw ) {
34
+ $dns = isset( $freq[ $kw ] ) ? $freq[ $kw ] : 0;
35
+ $densities[ $kw ] = ($dns / count( $words )) * 100;
36
+ }
37
+ }
38
+ $density = ! empty( $densities )
39
+ ? array_sum( array_values( $densities ) ) / count( $densities )
40
+ : 0
41
+ ;
42
+ $this->_density = $density;
43
+
44
+ return ! ! $this->_state = $density >= $this->get_min();
45
+ }
46
+
47
+ public function get_min() {
48
+ return 2;
49
+ }
50
+
51
+ public function get_recommendation() {
52
+ $keyword_density = $this->_density ? round( $this->_density, 2 ) : 0;
53
+
54
+ if ( $keyword_density === 0 ) {
55
+ $message = __( 'Currently you haven\'t used any keywords in your content. The minimum recommended density is %1$s%%. A low keyword density means your content has less chance of ranking highly for your chosen focus keywords.', 'wds' );
56
+ } elseif ( $this->_state ) {
57
+ $message = __( 'Your keyword density is %2$s%1$% which is greater than the minimum value of %1$s%1$%, nice work! This means your content has a better chance of ranking highly for your chosen focus keywords, without appearing as spam.', 'wds' );
58
+ } else {
59
+ $message = __( 'Currently your keyword density is %2$s%1$% which is below the recommended %1$s%1$%. A low keyword density means your content has less chance of ranking highly for your chosen focus keywords.', 'wds' );
60
+ }
61
+
62
+ return sprintf(
63
+ $message,
64
+ $this->get_min(),
65
+ $keyword_density
66
+ );
67
+ }
68
+
69
+ public function get_more_info() {
70
+ $message = __( 'Keyword density is all about making sure your content has enough keywords in it that it has a higher chance of appearing in the first few search results for your focus keywords. One way of making sure people will be able to find our content is using particular focus keywords, and using them as much as naturally possible in our content. In doing this we are trying to match up the keywords that people are likely to use when searching for this article or page, so try to get into your visitors mind and picture them typing a search into Google. While we recommend aiming for %1$s%% density, remember content is king and you don\'t your article ending up sounding like a robot. Get creative and utilize the page title, image caption and subheadings.', 'wds' );
71
+ return sprintf(
72
+ $message,
73
+ $this->get_min()
74
+ );
75
+ }
76
+ }
includes/core/checks/class_wds_check_keywords_used.php ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! class_exists( 'Smartcrawl_Check_Abstract' ) ) { require_once( dirname( __FILE__ ) . '/class_wds_check_abstract.php' ); }
4
+
5
+ class Smartcrawl_Check_Keywords_Used extends Smartcrawl_Check_Post_Abstract {
6
+
7
+ /**
8
+ * Holds post IDs where the focus keywords have been used before
9
+ *
10
+ * @var array
11
+ */
12
+ private $_pids = array();
13
+
14
+ /**
15
+ * Holds check state
16
+ *
17
+ * @var int
18
+ */
19
+ private $_state;
20
+
21
+ public function get_status_msg() {
22
+ return $this->_state === false
23
+ ? __( 'Keywords have been previously used before', 'wds' )
24
+ : __( 'Keywords have not been used before', 'wds' );
25
+ }
26
+
27
+ public function apply() {
28
+ $queries = array( 'relation' => 'OR' );
29
+ $kws = $this->get_focus();
30
+ if ( empty( $kws ) ) { return true; }
31
+
32
+ foreach ( $kws as $kw ) {
33
+ $queries[] = array(
34
+ 'key' => '_wds_focus-keywords',
35
+ 'value' => $kw,
36
+ 'compare' => 'LIKE',
37
+ );
38
+ }
39
+
40
+ $post_id = $this->get_post_id();
41
+ $post_ids[] = $post_id;
42
+ if ( wp_is_post_revision( $post_id ) ) {
43
+ $post_ids[] = wp_is_post_revisio