W3 Total Cache - Version 0.9.0

Version Description

  • Added preview feature so all cache settings can be reviewed prior to deployment
  • Added minify configuration wizard (help button on minify tab)
  • Added "never cache the following pages" to database and object cache
  • Added minify option to JavaScript embed after <body>
  • Added minify error notifications
  • Added drag and drop dependency resolution for minify CSS / JavaScript groups
  • Added object caching
  • Added option to automatically page cache prime (preload) with or without XML sitemap
  • Added support for multiple CNAMEs to CDN
  • Added support for minifcation of any respective theme installed a single site
  • Added support for page caching of multiple themes for various user agent groups
  • Added support for theme switching / redirection based on groups of user agents
  • Added compatibility with WP Super Cache fragment caching method (disk basic mode only)
  • Added HTTP compression and headers for AWS S3
  • Added ignored comment stems field, with Google AdSense default value to HTML minify
  • Added support for varnish purging
  • Added Rackspace CloudFiles support
  • Added native NetDNA / MaxCDN integration
  • Added option to cache 404 pages
  • Added changed files auto-upload to CDN
  • Added option to handle 404 errors for static objects directly with the web server
  • Added support for gravity forms to database cache default settings
  • Added changed file auto-upload to CDN
  • Database connection errors now return internal server (500) error response and are thus not cached
  • Incomplete plugin installation / removal no longer generates public errors
  • Unterminated string errors no longer display publicly
  • Support tab improvements
  • Install tab improvements
  • Resolved conflicts with disk enhanced .htaccess directives insertion
  • Improved compatibility with all mobile plugins
  • Improved AWS reliability
  • Improved browser caching support and management
  • Improved directory management for disk caching methods for increased performance
  • Improved handling of missing minify files
  • Improved Media Library import
  • Improved Multi Site support
  • Improved SSL interoperability
Download this release

Release Info

Developer fredericktownes
Plugin Icon 128x128 W3 Total Cache
Version 0.9.0
Comparing to
See all releases

Code changes from version 0.8.5.2 to 0.9.0

Files changed (90) hide show
  1. inc/css/lightbox.css +5 -7
  2. inc/css/options.css +193 -6
  3. inc/define.php +1145 -537
  4. inc/email/minify_error_notification.html +7 -0
  5. inc/{options/support_email.phtml → email/support_request.phtml} +13 -3
  6. inc/images/logo.png +0 -0
  7. inc/images/logo_small.png +0 -0
  8. inc/js/lightbox.js +184 -30
  9. inc/js/options.js +681 -342
  10. inc/js/popup.js +26 -22
  11. inc/lightbox/minify_recommendations.phtml +130 -0
  12. inc/lightbox/self_test.phtml +343 -0
  13. inc/lightbox/support_us.phtml +1 -1
  14. inc/lightbox/tweet.phtml +3 -3
  15. inc/mime/all.php +624 -0
  16. inc/mime/cssjs.php +9 -0
  17. inc/mime/html.php +14 -0
  18. inc/{mime.php → mime/other.php} +31 -36
  19. inc/options/about.phtml +6 -7
  20. inc/options/browsercache.phtml +270 -0
  21. inc/options/cdn.phtml +59 -26
  22. inc/options/cdn/cf.phtml +33 -30
  23. inc/options/cdn/common/cnames.phtml +43 -0
  24. inc/options/cdn/ftp.phtml +45 -43
  25. inc/options/cdn/mirror.phtml +12 -7
  26. inc/options/cdn/netdna.phtml +24 -0
  27. inc/options/cdn/rscf.phtml +32 -0
  28. inc/options/cdn/s3.phtml +37 -33
  29. inc/options/common/header.phtml +28 -21
  30. inc/options/common/help.phtml +15 -0
  31. inc/options/dbcache.phtml +30 -20
  32. inc/options/faq.phtml +16 -569
  33. inc/options/faq.xml +701 -0
  34. inc/options/general.phtml +197 -69
  35. inc/options/install.phtml +275 -134
  36. inc/options/minify.phtml +184 -83
  37. inc/options/mobile.phtml +86 -0
  38. inc/options/objectcache.phtml +94 -0
  39. inc/options/pgcache.phtml +102 -44
  40. inc/options/support.phtml +26 -95
  41. inc/options/support/bug_report.phtml +80 -0
  42. inc/options/support/email_support.phtml +80 -0
  43. inc/options/support/linux_config.phtml +68 -0
  44. inc/options/support/new_feature.phtml +45 -0
  45. inc/options/support/phone_support.phtml +80 -0
  46. inc/options/support/plugin_config.phtml +76 -0
  47. inc/options/support/theme_config.phtml +76 -0
  48. inc/options/support_payment.phtml +33 -0
  49. inc/options/support_select.phtml +34 -0
  50. inc/popup/cdn_export_file.phtml +1 -1
  51. inc/popup/cdn_export_library.phtml +1 -1
  52. inc/popup/cdn_import_library.phtml +3 -3
  53. inc/popup/cdn_queue.phtml +4 -4
  54. inc/popup/cdn_rename_domain.phtml +1 -1
  55. inc/popup/common/header.phtml +3 -3
  56. ini/_htaccess +0 -126
  57. ini/apc.ini +2 -2
  58. ini/eaccelerator.ini +2 -1
  59. ini/xcache.ini +1 -1
  60. lib/CF/cacert.pem +3113 -0
  61. lib/CF/cloudfiles.php +2137 -0
  62. lib/CF/cloudfiles_exceptions.php +41 -0
  63. lib/CF/cloudfiles_http.php +1338 -0
  64. lib/Minify/HTTP/ConditionalGet.php +235 -185
  65. lib/Minify/HTTP/Encoder.php +2 -6
  66. lib/Minify/Minify.php +6 -7
  67. lib/Minify/Minify/CSS/Compressor.php +26 -2
  68. lib/Minify/Minify/CSS/UriRewriter.php +2 -2
  69. lib/Minify/Minify/Cache/File.php +10 -3
  70. lib/Minify/Minify/CombineOnly.php +1 -1
  71. lib/Minify/Minify/Controller/MinApp.php +1 -1
  72. lib/Minify/Minify/HTML.php +83 -55
  73. lib/S3.php +2 -5
  74. lib/W3/Cache/Apc.php +3 -3
  75. lib/W3/Cache/Base.php +3 -3
  76. lib/W3/Cache/Eaccelerator.php +3 -3
  77. lib/W3/Cache/File.php +44 -9
  78. lib/W3/Cache/File/Manager.php +6 -4
  79. lib/W3/Cache/File/PgCache.php +43 -6
  80. lib/W3/Cache/Memcached.php +3 -3
  81. lib/W3/Cache/Xcache.php +3 -3
  82. lib/W3/Cdn.php +30 -12
  83. lib/W3/Cdn/Base.php +315 -16
  84. lib/W3/Cdn/Cf.php +57 -21
  85. lib/W3/Cdn/Ftp.php +44 -34
  86. lib/W3/Cdn/Mirror.php +11 -21
  87. lib/W3/Cdn/Netdna.php +138 -0
  88. lib/W3/Cdn/Rscf.php +304 -0
  89. lib/W3/Cdn/S3.php +169 -54
  90. lib/W3/Config.php +313 -138
inc/css/lightbox.css CHANGED
@@ -3,7 +3,8 @@
3
  }
4
 
5
  .lightbox {
6
- background: #f9f9f9;
 
7
  padding: 10px 20px;
8
  border: 1px solid #bbb;
9
  border-radius: 11px;
@@ -12,10 +13,11 @@
12
  }
13
 
14
  .lightbox-close {
15
- cursor: hand;
16
  cursor: pointer;
 
17
  text-decoration: underline;
18
- float: right;
 
19
  }
20
 
21
  .lightbox-loader {
@@ -23,7 +25,3 @@
23
  background-position: center center;
24
  background-repeat: no-repeat;
25
  }
26
-
27
- .lightbox th {
28
- width: 80px;
29
- }
3
  }
4
 
5
  .lightbox {
6
+ position: absolute;
7
+ background: #fdfdfd;
8
  padding: 10px 20px;
9
  border: 1px solid #bbb;
10
  border-radius: 11px;
13
  }
14
 
15
  .lightbox-close {
 
16
  cursor: pointer;
17
+ position: absolute;
18
  text-decoration: underline;
19
+ top: 25px;
20
+ right: 20px;
21
  }
22
 
23
  .lightbox-loader {
25
  background-position: center center;
26
  background-repeat: no-repeat;
27
  }
 
 
 
 
inc/css/options.css CHANGED
@@ -5,10 +5,6 @@
5
  width: 36px
6
  }
7
 
8
- .w3tc-options-menu-selected {
9
- font-weight: 700
10
- }
11
-
12
  .w3tc-enabled {
13
  color: #090;
14
  font-weight: 700
@@ -36,6 +32,59 @@
36
  padding: 5px
37
  }
38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  #w3tc acronym {
40
  border-bottom: 1px dotted #666
41
  }
@@ -53,6 +102,20 @@
53
  font-style: 400
54
  }
55
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  #w3tc h5 {
57
  margin: 0
58
  }
@@ -110,6 +173,7 @@
110
 
111
  #w3tc fieldset {
112
  margin: 1em 0;
 
113
  padding: 0 1em 1em 1em;
114
  border: 1px solid #bbb;
115
  border-radius: 11px;
@@ -122,12 +186,135 @@
122
  padding: 0;
123
  }
124
 
125
- #w3tc legend {
126
  color: #999;
127
  padding: 0 5px;
128
  font-weight: bold;
129
  }
130
 
131
- #cdn-general th {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
  width: 400px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  }
5
  width: 36px
6
  }
7
 
 
 
 
 
8
  .w3tc-enabled {
9
  color: #090;
10
  font-weight: 700
32
  padding: 5px
33
  }
34
 
35
+ .w3tc-test-ok,.w3tc-test-warn,.w3tc-test-error {
36
+ font-weight: bold;
37
+ }
38
+
39
+ .w3tc-test-ok {
40
+ color: #090;
41
+ }
42
+
43
+ .w3tc-test-warn {
44
+ color: #f90;
45
+ }
46
+
47
+ .w3tc-test-error {
48
+ color: #f00;
49
+ }
50
+
51
+ #w3tc-help ul {
52
+ float: left;
53
+ width: 29%;
54
+ list-style-type: disc;
55
+ margin: 1em 2% 1em 2%;
56
+ }
57
+
58
+ #w3tc-help li {
59
+ margin: 0;
60
+ }
61
+
62
+ #w3tc-help a {
63
+ text-decoration: none;
64
+ }
65
+
66
+ #w3tc-help a:hover {
67
+ text-decoration: underline;
68
+ }
69
+
70
+ #w3tc-nav select {
71
+ background: #f9f9f9 !important;
72
+ border: 0;
73
+ color: #333;
74
+ font-size: 1em;
75
+ font-weight: bold;
76
+ }
77
+
78
+ #w3tc-nav optgroup {
79
+ background: #fff;
80
+ font-style: normal;
81
+ padding: 3px;
82
+ }
83
+
84
+ #w3tc-nav option {
85
+ background: #fff;
86
+ }
87
+
88
  #w3tc acronym {
89
  border-bottom: 1px dotted #666
90
  }
102
  font-style: 400
103
  }
104
 
105
+ #w3tc optgroup {
106
+ font-style: normal;
107
+ }
108
+
109
+ #w3tc optgroup option {
110
+ text-indent: 20px;
111
+ }
112
+
113
+ #w3tc h2 span {
114
+ font-size: 0.6em;
115
+ font-style: normal;
116
+ text-shadow: none;
117
+ }
118
+
119
  #w3tc h5 {
120
  margin: 0
121
  }
173
 
174
  #w3tc fieldset {
175
  margin: 1em 0;
176
+ background: #fdfdfd;
177
  padding: 0 1em 1em 1em;
178
  border: 1px solid #bbb;
179
  border-radius: 11px;
186
  padding: 0;
187
  }
188
 
189
+ #w3tc fieldset legend {
190
  color: #999;
191
  padding: 0 5px;
192
  font-weight: bold;
193
  }
194
 
195
+ #w3tc fieldset legend a:hover {
196
+ text-decoration: none;
197
+ }
198
+
199
+ #w3tc pre.code {
200
+ color: #000;
201
+ margin: 1em 0;
202
+ overflow: auto;
203
+ background: #eee;
204
+ padding: 12px 15px;
205
+ border: 1px solid #ccc;
206
+ }
207
+
208
+ #w3tc pre.console {
209
+ color: #ccc;
210
+ margin: 1em 0;
211
+ overflow: auto;
212
+ background: #000;
213
+ padding: 12px 15px;
214
+ border: 1px solid #ccc;
215
+ }
216
+
217
+ #w3tc-cdn-general th {
218
  width: 400px;
219
+ }
220
+
221
+ #cdn_cnames li {
222
+ padding: 5px;
223
+ cursor: ns-resize;
224
+ }
225
+
226
+ #cdn_cnames li:hover {
227
+ background: #f9f9f9;
228
+ }
229
+
230
+ #cdn_cnames li span {
231
+ color: #999;
232
+ }
233
+
234
+ #mobile_groups li {
235
+ cursor: ns-resize;
236
+ list-style: none;
237
+ background: #f9f9f9;
238
+ margin-bottom: 1em;
239
+ border-radius: 8px;
240
+ -webkit-border-radius: 8px;
241
+ -moz-border-radius: 8px;
242
+ }
243
+
244
+ #mobile_groups li:hover {
245
+ background: #f3f3f3;
246
+ }
247
+
248
+ #mobile_groups li table {
249
+ margin: 0;
250
+ }
251
+
252
+ .mobile_group {
253
+ font-weight: bold;
254
+ }
255
+
256
+ #recom_container,#self_test_container {
257
+ overflow: auto;
258
+ }
259
+
260
+ #self_test_container fieldset {
261
+ width: 70%;
262
+ }
263
+
264
+ .monospace {
265
+ font-family: monospace;
266
+ }
267
+
268
+ .w3tc-rules {
269
+ display: none;
270
+ margin: 1em 0;
271
+ padding: 0;
272
+ background: none;
273
+ }
274
+
275
+ .minify-files li {
276
+ padding: 2px;
277
+ cursor: ns-resize;
278
+ list-style: none;
279
+ }
280
+
281
+ .minify-files li:hover {
282
+ background: #f9f9f9;
283
+ }
284
+
285
+ .minify-files th,.minify-files td {
286
+ line-height: normal;
287
+ border: 0;
288
+ padding: 0;
289
+ margin: 0;
290
+ }
291
+
292
+ .minify-files th {
293
+ width: auto;
294
+ color: #aaa !important;
295
+ font-size: 10px;
296
+ font-weight: normal;
297
+ text-align: left;
298
+ }
299
+
300
+ .minify-files td {
301
+ font-size: 13px;
302
+ }
303
+
304
+ th.minify-files-add,td.minify-files-add {
305
+ width: 40px;
306
+ text-align: center;
307
+ }
308
+
309
+ .minify-files-exists input,.minify-files-exists select {
310
+ color: red;
311
+ }
312
+
313
+ #support_loading {
314
+ height: 32px;
315
+ background: url(../images/loader.gif) left center no-repeat;
316
+ padding-left: 38px;
317
+ line-height: 32px;
318
+ margin: 1em 0;
319
+ font-weight: bold;
320
  }
inc/define.php CHANGED
@@ -1,13 +1,15 @@
1
  <?php
2
 
3
- define('W3TC_VERSION', '0.8.5.2');
4
  define('W3TC_POWERED_BY', 'W3 Total Cache/' . W3TC_VERSION);
5
  define('W3TC_EMAIL', 'w3tc@w3-edge.com');
 
 
6
  define('W3TC_LINK_URL', 'http://www.w3-edge.com/wordpress-plugins/');
7
  define('W3TC_LINK_NAME', 'WordPress Plugins');
8
  define('W3TC_FEED_URL', 'http://feeds.feedburner.com/W3TOTALCACHE');
9
  define('W3TC_README_URL', 'http://plugins.trac.wordpress.org/browser/w3-total-cache/trunk/readme.txt?format=txt');
10
- define('W3TC_TWITTER_STATUS', 'I just optimized my #wordpress blog\'s #performance using the W3 Total Cache #plugin by @w3edge. Check it out! http://j.mp/A69xX');
11
  define('W3TC_SUPPORT_US_TIMEOUT', 2592000);
12
 
13
  define('W3TC_PHP5', PHP_VERSION >= 5);
@@ -18,56 +20,54 @@ define('W3TC_FILE', 'w3-total-cache/w3-total-cache.php');
18
  define('W3TC_LIB_DIR', W3TC_DIR . '/lib');
19
  define('W3TC_LIB_W3_DIR', W3TC_LIB_DIR . '/W3');
20
  define('W3TC_LIB_MINIFY_DIR', W3TC_LIB_DIR . '/Minify');
 
21
  define('W3TC_PLUGINS_DIR', W3TC_DIR . '/plugins');
22
  define('W3TC_INSTALL_DIR', W3TC_DIR . '/wp-content');
23
  define('W3TC_INSTALL_MINIFY_DIR', W3TC_INSTALL_DIR . '/w3tc/min');
24
 
25
- $GLOBALS['w3_reserved_blognames'] = array(
26
- 'page',
27
- 'comments',
28
- 'blog',
29
- 'wp-admin',
30
- 'wp-includes',
31
- 'wp-content',
32
- 'files',
33
- 'feed'
34
- );
35
-
36
  define('W3TC_BLOGNAME', w3_get_blogname());
37
- define('W3TC_PREFIX', (W3TC_BLOGNAME != '' ? '-' . W3TC_BLOGNAME : ''));
38
 
39
  defined('WP_CONTENT_DIR') || define('WP_CONTENT_DIR', realpath(W3TC_DIR . '/../..'));
 
40
  define('WP_CONTENT_DIR_NAME', basename(WP_CONTENT_DIR));
41
- define('W3TC_CONTENT_DIR_NAME', WP_CONTENT_DIR_NAME . '/w3tc' . W3TC_PREFIX);
42
- define('W3TC_CONTENT_DIR', ABSPATH . W3TC_CONTENT_DIR_NAME);
43
  define('W3TC_CONTENT_MINIFY_DIR_NAME', W3TC_CONTENT_DIR_NAME . '/min');
44
- define('W3TC_CONTENT_MINIFY_DIR', ABSPATH . W3TC_CONTENT_DIR_NAME . '/min');
45
  define('W3TC_CACHE_FILE_DBCACHE_DIR', W3TC_CONTENT_DIR . '/dbcache');
 
46
  define('W3TC_CACHE_FILE_PGCACHE_DIR', W3TC_CONTENT_DIR . '/pgcache');
47
  define('W3TC_CACHE_FILE_MINIFY_DIR', W3TC_CONTENT_DIR . '/min');
48
  define('W3TC_LOG_DIR', W3TC_CONTENT_DIR . '/log');
49
  define('W3TC_TMP_DIR', W3TC_CONTENT_DIR . '/tmp');
50
- define('W3TC_CONFIG_PATH', WP_CONTENT_DIR . '/w3-total-cache-config' . W3TC_PREFIX . '.php');
 
51
  define('W3TC_CONFIG_MASTER_PATH', WP_CONTENT_DIR . '/w3-total-cache-config.php');
52
  define('W3TC_MINIFY_LOG_FILE', W3TC_LOG_DIR . '/minify.log');
53
  define('W3TC_CDN_COMMAND_UPLOAD', 1);
54
  define('W3TC_CDN_COMMAND_DELETE', 2);
55
  define('W3TC_CDN_TABLE_QUEUE', 'w3tc_cdn_queue');
56
 
57
- ini_set('pcre.backtrack_limit', 4194304);
58
- ini_set('pcre.recursion_limit', 4194304);
 
 
59
 
60
  /**
61
  * W3 activate error
62
- *
63
  * @param string $error
64
  * @return void
65
  */
66
-
67
  function w3_activate_error($error)
68
  {
69
  $active_plugins = (array) get_option('active_plugins');
70
 
 
 
 
71
  $key = array_search(W3TC_FILE, $active_plugins);
72
 
73
  if ($key !== false) {
@@ -79,6 +79,7 @@ function w3_activate_error($error)
79
  do_action('deactivated_plugin', W3TC_FILE);
80
 
81
  update_option('active_plugins', $active_plugins);
 
82
  } else {
83
  do_action('deactivate_' . W3TC_FILE);
84
  }
@@ -112,64 +113,26 @@ function w3_writable_error($path)
112
  }
113
 
114
  /**
115
- * Returns current microtime
116
- *
117
- * @return float
118
- */
119
- function w3_microtime()
120
- {
121
- list ($usec, $sec) = explode(" ", microtime());
122
- return ((float) $usec + (float) $sec);
123
- }
124
-
125
- /**
126
- * Check if URL is valid
127
- *
128
- * @param string $url
129
- * @return boolean
130
  */
131
- function w3_is_url($url)
132
  {
133
- return preg_match('~^https?://~', $url);
 
 
134
  }
135
 
136
  /**
137
- * Decodes gzip-encoded string
138
  *
139
- * @param string $data
140
- * @return string
141
  */
142
- function w3_gzdecode($data)
143
  {
144
- $flags = ord(substr($data, 3, 1));
145
- $headerlen = 10;
146
- $extralen = 0;
147
-
148
- if ($flags & 4) {
149
- $extralen = unpack('v', substr($data, 10, 2));
150
- $extralen = $extralen[1];
151
- $headerlen += 2 + $extralen;
152
- }
153
-
154
- if ($flags & 8) {
155
- $headerlen = strpos($data, chr(0), $headerlen) + 1;
156
- }
157
-
158
- if ($flags & 16) {
159
- $headerlen = strpos($data, chr(0), $headerlen) + 1;
160
- }
161
-
162
- if ($flags & 2) {
163
- $headerlen += 2;
164
- }
165
-
166
- $unpacked = gzinflate(substr($data, $headerlen));
167
-
168
- if ($unpacked === FALSE) {
169
- $unpacked = $data;
170
- }
171
-
172
- return $unpacked;
173
  }
174
 
175
  /**
@@ -187,13 +150,13 @@ function w3_mkdir($path, $mask = 0755, $curr_path = '')
187
  $dirs = explode('/', $path);
188
 
189
  foreach ($dirs as $dir) {
190
- if (empty($dir)) {
191
  return false;
192
  }
193
 
194
  $curr_path .= ($curr_path == '' ? '' : '/') . $dir;
195
 
196
- if (! is_dir($curr_path)) {
197
  if (@mkdir($curr_path, $mask)) {
198
  @chmod($curr_path, $mask);
199
  } else {
@@ -207,7 +170,7 @@ function w3_mkdir($path, $mask = 0755, $curr_path = '')
207
 
208
  /**
209
  * Recursive remove dir
210
- *
211
  * @param string $path
212
  * @param array $exclude
213
  * @return void
@@ -217,11 +180,11 @@ function w3_rmdir($path, $exclude = array(), $remove = true)
217
  $dir = @opendir($path);
218
 
219
  if ($dir) {
220
- while (($entry = @readdir($dir))) {
221
  $full_path = $path . '/' . $entry;
222
 
223
- if ($entry != '.' && $entry != '..' && ! in_array($full_path, $exclude)) {
224
- if (is_dir($full_path)) {
225
  w3_rmdir($full_path, $exclude);
226
  } else {
227
  @unlink($full_path);
@@ -239,7 +202,7 @@ function w3_rmdir($path, $exclude = array(), $remove = true)
239
 
240
  /**
241
  * Recursive empty dir
242
- *
243
  * @param string $path
244
  * @param array $exclude
245
  * @return void
@@ -255,13 +218,14 @@ function w3_emptydir($path, $exclude = array())
255
  * @param string $content
256
  * @return boolean
257
  */
258
- function w3_is_xml($content)
259
  {
260
  return (stristr($content, '<?xml') !== false || stristr($content, '<html') !== false);
261
  }
262
 
263
  /**
264
  * Returns true if it's WPMU
 
265
  * @return boolean
266
  */
267
  function w3_is_wpmu()
@@ -275,191 +239,148 @@ function w3_is_wpmu()
275
  return $wpmu;
276
  }
277
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
278
  /**
279
  * Returns true if WPMU uses vhosts
 
280
  * @return boolean
281
  */
282
  function w3_is_vhost()
283
  {
284
- return (defined('VHOST') && VHOST == 'yes');
285
  }
286
 
287
  /**
288
- * Detect WPMU blogname
289
  *
290
- * @return string
 
291
  */
292
- function w3_get_blogname()
293
  {
294
- static $blogname = null;
295
-
296
- if ($blogname === null) {
297
- if (w3_is_wpmu()) {
298
- $domain = w3_get_domain($_SERVER['HTTP_HOST']);
299
-
300
- if (w3_is_vhost()) {
301
- $blogname = $domain;
302
- } else {
303
- $uri = $_SERVER['REQUEST_URI'];
304
- $site_path = w3_get_site_path();
305
-
306
- if ($site_path != '' && strpos($uri, $site_path) === 0) {
307
- $uri = substr_replace($uri, '/', 0, strlen($site_path));
308
- }
309
-
310
- $blogname = w3_get_blogname_from_uri($uri);
311
-
312
- if ($blogname != '') {
313
- $blogname = $blogname . '.' . $domain;
314
- } else {
315
- $blogname = $domain;
316
- }
317
- }
318
- } else {
319
- $blogname = '';
320
- }
321
- }
322
-
323
- return $blogname;
324
  }
325
 
326
  /**
327
- * Returns blogname from URI
328
- *
329
- * @param string $uri
330
- * @param string
331
  */
332
- function w3_get_blogname_from_uri($uri)
333
  {
334
- global $w3_reserved_blognames;
335
-
336
- $blogname = '';
337
- $matches = null;
338
- $uri = strtolower($uri);
339
-
340
- if (preg_match('~^/([a-z0-9-]+)/~', $uri, $matches)) {
341
- $blogname = $matches[1];
342
-
343
- if (in_array($blogname, $w3_reserved_blognames) || file_exists($blogname)) {
344
- $blogname = '';
345
- }
346
  }
347
 
348
- return $blogname;
349
  }
350
 
351
  /**
352
- * Returns site url
353
- *
354
- * @return string
355
  */
356
- function w3_get_site_url()
357
  {
358
- static $site_url = null;
359
-
360
- if ($site_url === null) {
361
- if (function_exists('get_option')) {
362
- $site_url = get_option('siteurl');
363
- } else {
364
- $site_url = sprintf('http://%s%s', $_SERVER['HTTP_HOST'], w3_get_site_path());
365
- }
366
-
367
- $site_url = rtrim($site_url, '/');
368
- }
369
 
370
- return $site_url;
371
  }
372
 
373
  /**
374
- * Returns SSL site url
375
- *
376
- * @return string
 
377
  */
378
- function w3_get_site_url_ssl()
379
  {
380
- $site_url = w3_get_site_url();
381
-
382
- if (w3_is_https()) {
383
- $site_url = str_replace('http:', 'https:', $site_url);
384
- }
385
-
386
- return $site_url;
387
  }
388
 
389
  /**
390
- * Returns site url regexp
391
- *
392
- * @return string
393
  */
394
- function w3_get_site_url_regexp()
395
  {
396
- $site_url = w3_get_site_url();
397
- $domain = preg_replace('~https?://~i', '', $site_url);
398
- $regexp = 'https?://' . w3_preg_quote($domain);
399
- return $regexp;
400
  }
401
 
402
  /**
403
- * Returns blog path
404
- *
405
- * @return string
406
  */
407
- function w3_get_site_path()
408
  {
409
- $document_root = w3_get_document_root();
410
- $path = str_replace($document_root, '', w3_path(ABSPATH));
411
- $path = '/' . ltrim($path, '/');
412
-
413
- if (substr($path, - 1) != '/') {
414
- $path .= '/';
415
- }
416
-
417
- return $path;
418
  }
419
 
420
  /**
421
- * Returns blog path
422
  *
423
- * @return string
 
424
  */
425
- function w3_get_blog_path()
426
  {
427
- $domain_url = w3_get_domain_url();
428
- $site_url = w3_get_site_url();
429
 
430
- $path = str_replace($domain_url, '', $site_url);
431
- $path = '/' . ltrim($path, '/');
432
 
433
- if (substr($path, - 1) != '/') {
434
- $path .= '/';
 
 
 
 
 
 
435
  }
436
 
437
- return $path;
438
  }
439
 
440
  /**
441
- * Returns document root
442
- * @return string
 
 
443
  */
444
- function w3_get_document_root()
445
  {
446
- static $document_root = null;
447
-
448
- if ($document_root === null) {
449
- if (isset($_SERVER['DOCUMENT_ROOT'])) {
450
- $document_root = $_SERVER['DOCUMENT_ROOT'];
451
- } elseif (isset($_SERVER['SCRIPT_FILENAME'])) {
452
- $document_root = substr($_SERVER['SCRIPT_FILENAME'], 0, - strlen($_SERVER['PHP_SELF']));
453
- } elseif (isset($_SERVER['PATH_TRANSLATED'])) {
454
- $document_root = substr($_SERVER['PATH_TRANSLATED'], 0, - strlen($_SERVER['PHP_SELF']));
455
- } else {
456
- $document_root = ABSPATH;
457
- }
458
-
459
- $document_root = w3_path($document_root);
460
- }
461
 
462
- return $document_root;
463
  }
464
 
465
  /**
@@ -486,205 +407,651 @@ function w3_get_domain($host)
486
  }
487
 
488
  /**
489
- * Get domain URL
490
- *
491
- * @return string
492
  */
493
- function w3_get_domain_url()
494
  {
495
- $site_url = w3_get_site_url();
496
- $parse_url = @parse_url($site_url);
497
 
498
- if ($parse_url && isset($parse_url['scheme']) && isset($parse_url['host'])) {
499
- $scheme = $parse_url['scheme'];
500
- $host = $parse_url['host'];
501
- $port = (isset($parse_url['port']) && $parse_url['port'] != 80 ? ':' . (int) $parse_url['port'] : '');
502
- $domain_url = sprintf('%s://%s%s', $scheme, $host, $port);
 
 
503
 
504
- return $domain_url;
 
 
 
 
 
 
505
  }
506
 
507
- return false;
508
  }
509
 
510
  /**
511
- * Returns domain url regexp
512
- *
513
- * @return string
514
  */
515
- function w3_get_domain_url_regexp()
516
  {
517
- $domain_url = w3_get_domain_url();
518
- $domain = preg_replace('~https?://~i', '', $domain_url);
519
- $regexp = 'https?://' . w3_preg_quote($domain);
520
- return $regexp;
521
  }
522
 
523
  /**
524
- * Returns upload info
525
- *
526
- * @return array
 
527
  */
528
- function w3_upload_info()
529
  {
530
- static $upload_info = null;
 
 
531
 
532
- if ($upload_info === null) {
533
- $upload_info = @wp_upload_dir();
534
-
535
- if (empty($upload_info['error'])) {
536
- $site_url = w3_get_site_url();
537
- $upload_info['upload_url'] = trim(str_replace($site_url, '', $upload_info['baseurl']), '/');
538
- $upload_info['upload_dir'] = trim(str_replace(ABSPATH, '', $upload_info['basedir']), '/');
539
- } else {
540
- $upload_info = false;
541
- }
542
  }
543
 
544
- return $upload_info;
 
 
545
  }
546
 
547
  /**
548
- * Redirects to URL
549
- *
550
- * @param string $url
551
- * @param string $params
552
  * @return string
553
  */
554
- function w3_redirect($url = '', $params = array())
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
555
  {
556
- $fragment = '';
 
557
 
558
- if ($url != '' && ($parse_url = @parse_url($url))) {
559
- $url = '';
560
-
561
- if (! empty($parse_url['scheme'])) {
562
- $url .= $parse_url['scheme'] . '://';
563
- }
564
-
565
- if (! empty($parse_url['user'])) {
566
- $url .= $parse_url['user'];
567
-
568
- if (! empty($parse_url['pass'])) {
569
- $url .= ':' . $parse_url['pass'];
570
- }
571
- }
572
-
573
- if (! empty($parse_url['host'])) {
574
- $url .= $parse_url['host'];
575
- }
576
-
577
- if (! empty($parse_url['port']) && $parse_url['port'] != 80) {
578
- $url .= ':' . (int) $parse_url['port'];
579
- }
580
-
581
- $url .= (! empty($parse_url['path']) ? $parse_url['path'] : '/');
582
-
583
- if (! empty($parse_url['query'])) {
584
- $old_params = array();
585
- parse_str($parse_url['query'], $old_params);
586
-
587
- $params = array_merge($old_params, $params);
588
  }
589
-
590
- if (! empty($parse_url['fragment'])) {
591
- $fragment = '#' . $parse_url['fragment'];
 
592
  }
593
- } else {
594
- $parse_url = array();
595
  }
596
 
597
- if (($count = count($params))) {
598
- $query = '';
599
-
600
- foreach ($params as $param => $value) {
601
- $count--;
602
- $query .= urlencode($param) . (! empty($value) ? '=' . urlencode($value) : '') . ($count ? '&' : '');
603
- }
604
-
605
- $url .= (strpos($url, '?') === false ? '?' : '&') . $query;
606
- }
 
 
607
 
608
- if ($fragment != '') {
609
- $url .= $fragment;
610
  }
611
 
612
- @header('Location: ' . $url);
613
- exit();
614
  }
615
 
616
  /**
617
- * Returns caching engine name
618
  *
619
- * @param $engine
620
- * @return string
621
  */
622
- function w3_get_engine_name($engine)
623
  {
624
- switch ($engine) {
625
- case 'memcached':
626
- $engine_name = 'memcached';
627
- break;
628
-
629
- case 'apc':
630
- $engine_name = 'apc';
631
- break;
632
-
633
- case 'eaccelerator':
634
- $engine_name = 'eaccelerator';
635
- break;
636
-
637
- case 'xcache':
638
- $engine_name = 'xcache';
639
- break;
640
-
641
- case 'file':
642
- $engine_name = 'disk';
643
- break;
644
-
645
- case 'file_pgcache':
646
- $engine_name = 'disk (enhanced)';
647
- break;
648
-
649
- default:
650
- $engine_name = 'N/A';
651
- break;
652
  }
653
 
654
- return $engine_name;
655
  }
656
 
657
  /**
658
- * Converts value to boolean
659
  *
660
- * @param mixed $value
661
  * @return boolean
662
  */
663
- function w3_to_boolean($value)
664
  {
665
- if (is_string($value)) {
666
- switch (strtolower($value)) {
667
- case '+':
668
- case '1':
669
- case 'y':
670
- case 'on':
671
- case 'yes':
672
- case 'true':
673
- case 'enabled':
674
- return true;
675
-
676
- case '-':
677
- case '0':
678
- case 'n':
679
- case 'no':
680
- case 'off':
681
- case 'false':
682
- case 'disabled':
683
- return false;
684
  }
685
  }
686
 
687
- return (boolean) $value;
688
  }
689
 
690
  /**
@@ -694,28 +1061,38 @@ function w3_to_boolean($value)
694
  * @param string $url
695
  * @param string $data
696
  * @param string $auth
 
697
  * @return string
698
  */
699
- function w3_url_request($method, $url, $data = '', $auth = '')
700
  {
701
  $status = 0;
702
  $method = strtoupper($method);
703
 
704
- if (! function_exists('curl_init')) {
705
  $ch = curl_init();
706
 
707
  curl_setopt($ch, CURLOPT_URL, $url);
708
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
709
  curl_setopt($ch, CURLOPT_USERAGENT, W3TC_POWERED_BY);
710
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
 
711
  curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
 
 
712
 
713
- if ($method == 'POST') {
714
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
715
- curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 
 
 
 
 
 
716
  }
717
 
718
- if (! empty($auth)) {
719
  curl_setopt($ch, CURLOPT_USERPWD, $auth);
720
  }
721
 
@@ -730,7 +1107,7 @@ function w3_url_request($method, $url, $data = '', $auth = '')
730
  if ($parse_url && isset($parse_url['host'])) {
731
  $host = $parse_url['host'];
732
  $port = (isset($parse_url['port']) ? (int) $parse_url['port'] : 80);
733
- $path = (! empty($parse_url['path']) ? $parse_url['path'] : '/');
734
  $query = (isset($parse_url['query']) ? $parse_url['query'] : '');
735
  $request_uri = $path . ($query != '' ? '?' . $query : '');
736
 
@@ -741,33 +1118,35 @@ function w3_url_request($method, $url, $data = '', $auth = '')
741
  'Connection: close'
742
  );
743
 
744
- if (! empty($data)) {
745
  $request_headers_array[] = sprintf('Content-Length: %d', strlen($data));
746
  }
747
 
748
- if (! empty($auth)) {
749
  $request_headers_array[] = sprintf('Authorization: Basic %s', base64_encode($auth));
750
  }
751
 
752
  $request_headers = implode("\r\n", $request_headers_array);
753
  $request = $request_headers . "\r\n\r\n" . $data;
 
 
754
 
755
- $fp = @fsockopen($host, $port);
756
 
757
- if (! $fp) {
758
  return false;
759
  }
760
 
761
  $response = '';
762
  @fputs($fp, $request);
763
 
764
- while (! @feof($fp)) {
765
  $response .= @fgets($fp, 4096);
766
  }
767
 
768
  @fclose($fp);
769
 
770
- list ($response_headers, $contents) = explode("\r\n\r\n", $response, 2);
771
 
772
  $matches = null;
773
 
@@ -777,7 +1156,7 @@ function w3_url_request($method, $url, $data = '', $auth = '')
777
  }
778
  }
779
 
780
- if ($status == 200) {
781
  return $contents;
782
  }
783
 
@@ -787,12 +1166,14 @@ function w3_url_request($method, $url, $data = '', $auth = '')
787
  /**
788
  * Download url via GET
789
  *
790
- * @param $url
 
 
791
  * @return string
792
  */
793
- function w3_url_get($url)
794
  {
795
- return w3_url_request('GET', $url);
796
  }
797
 
798
  /**
@@ -801,23 +1182,46 @@ function w3_url_get($url)
801
  * @param string $url
802
  * @param string $data
803
  * @param string $auth
 
 
 
 
 
 
 
 
 
 
 
 
 
804
  * @return string
805
  */
806
- function w3_url_post($url, $data = '', $auth = '')
807
  {
808
- return w3_url_request('POST', $url, $data, $auth);
 
 
 
 
 
 
 
 
 
 
809
  }
810
 
811
  /**
812
  * Downloads data to a file
813
- *
814
  * @param string $url
815
  * @param string $file
816
  * @return boolean
817
  */
818
  function w3_download($url, $file)
819
  {
820
- $data = w3_url_get($url);
821
 
822
  if ($data !== false) {
823
  return @file_put_contents($file, $data);
@@ -827,121 +1231,221 @@ function w3_download($url, $file)
827
  }
828
 
829
  /**
830
- * Loads plugins
831
  *
832
- * @return void
833
  */
834
- function w3_load_plugins()
835
  {
836
- $dir = @opendir(W3TC_PLUGINS_DIR);
837
 
838
- if ($dir) {
839
- while (($entry = @readdir($dir))) {
840
- if (strrchr($entry, '.') === '.php') {
841
- require_once W3TC_PLUGINS_DIR . '/' . $entry;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
842
  }
843
  }
844
- @closedir($dir);
845
- }
846
- }
847
-
848
- /**
849
- * Returns true if current connection is secure
850
- *
851
- * @return boolean
852
- */
853
- function w3_is_https()
854
- {
855
- switch (true) {
856
- case (isset($_SERVER['HTTPS']) && w3_to_boolean($_SERVER['HTTPS'])):
857
- case (isset($_SERVER['SERVER_PORT']) && (int) $_SERVER['SERVER_PORT'] == 443):
858
- return true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
859
  }
860
 
861
- return false;
862
- }
863
-
864
- /**
865
- * Converts win path to unix
866
- * @param string $path
867
- * @return string
868
- */
869
- function w3_path($path)
870
- {
871
- $path = preg_replace('~[/\\\]+~', '/', $path);
872
- $path = rtrim($path, '/');
873
 
874
- return $path;
 
875
  }
876
 
877
  /**
878
- * Returns realpath of given path
879
  *
880
- * @param string $path
 
881
  */
882
- function w3_realpath($path)
883
  {
884
- $path = w3_path($path);
885
- $parts = explode('/', $path);
886
- $absolutes = array();
887
-
888
- foreach ($parts as $part) {
889
- if ('.' == $part) {
890
- continue;
891
- }
892
- if ('..' == $part) {
893
- array_pop($absolutes);
894
- } else {
895
- $absolutes[] = $part;
896
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
897
  }
898
 
899
- return implode('/', $absolutes);
900
  }
901
 
902
  /**
903
- * Returns open basedirs
904
  *
905
- * @return array
 
906
  */
907
- function w3_get_open_basedirs()
908
  {
909
- $open_basedir_ini = ini_get('open_basedir');
910
- $open_basedirs = (W3TC_WIN ? preg_split('~[;,]~', $open_basedir_ini) : explode(':', $open_basedir_ini));
911
- $result = array();
912
-
913
- foreach ($open_basedirs as $open_basedir) {
914
- $open_basedir = trim($open_basedir);
915
- if ($open_basedir != '') {
916
- $result[] = w3_realpath($open_basedir);
 
 
 
 
 
 
 
 
 
 
 
917
  }
918
  }
919
 
920
- return $result;
921
  }
922
 
923
  /**
924
- * Checks if path is restricted by open_basedir
925
  *
926
- * @param string $path
927
- * @return boolean
928
  */
929
- function w3_check_open_basedir($path)
930
  {
931
- $path = w3_realpath($path);
932
- $open_basedirs = w3_get_open_basedirs();
933
-
934
- if (! count($open_basedirs)) {
935
- return true;
936
- }
937
 
938
- foreach ($open_basedirs as $open_basedir) {
939
- if (strstr($path, $open_basedir) !== false) {
940
- return true;
 
 
941
  }
 
942
  }
943
-
944
- return false;
945
  }
946
 
947
  /**
@@ -952,23 +1456,70 @@ function w3_check_open_basedir($path)
952
  */
953
  function w3_get_mime_type($file)
954
  {
955
- $mime_types = include W3TC_DIR . '/inc/mime.php';
956
 
957
- $file_ext = strrchr($file, '.');
958
-
959
- if ($file_ext) {
960
- $file_ext = ltrim($file_ext, '.');
961
- foreach ($mime_types as $extension => $mime_type) {
962
- $exts = explode('|', $extension);
963
- foreach ($exts as $ext) {
964
- if ($file_ext == $ext) {
965
- return $mime_type;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
966
  }
 
 
967
  }
968
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
969
  }
970
 
971
- return false;
972
  }
973
 
974
  /**
@@ -985,7 +1536,7 @@ function w3_twitter_status_update($username, $password, $status, &$error)
985
  $data = sprintf('status=%s', urlencode($status));
986
  $auth = sprintf('%s:%s', $username, $password);
987
 
988
- $xml = w3_url_post('http://twitter.com/statuses/update.xml', $data, $auth);
989
 
990
  if ($xml) {
991
  $matches = null;
@@ -1006,7 +1557,7 @@ function w3_twitter_status_update($username, $password, $status, &$error)
1006
 
1007
  /**
1008
  * Quotes regular expression string
1009
- *
1010
  * @param string $regexp
1011
  * @return string
1012
  */
@@ -1020,56 +1571,9 @@ function w3_preg_quote($string, $delimiter = null)
1020
  return $string;
1021
  }
1022
 
1023
- /**
1024
- * Converts file path to relative
1025
- *
1026
- * @param string $file
1027
- * @return string
1028
- */
1029
- function w3_normalize_file($file)
1030
- {
1031
- if (w3_is_url($file)) {
1032
- if (strstr($file, '?') === false) {
1033
- $domain_url_regexp = '~' . w3_get_domain_url_regexp() . '~i';
1034
- $file = preg_replace($domain_url_regexp, '', $file);
1035
- }
1036
- } else {
1037
- $abspath = w3_path(ABSPATH);
1038
- $file = w3_path($file);
1039
- $file = str_replace($abspath, '', $file);
1040
- }
1041
-
1042
- $file = ltrim($file, '/');
1043
-
1044
- return $file;
1045
- }
1046
-
1047
- /**
1048
- * Translates URL to local path
1049
- * @param string $url
1050
- * @return string
1051
- */
1052
- function w3_translate_file($url)
1053
- {
1054
- if (! w3_is_url($url)) {
1055
- $url = w3_get_domain_url() . '/' . ltrim($url, '/\\');
1056
- }
1057
-
1058
- $site_url_regexp = '~' . w3_get_site_url_regexp() . '~i';
1059
-
1060
- if (preg_match($site_url_regexp, $url) && strstr($url, '?') === false) {
1061
- $url = preg_replace($site_url_regexp, '', $url);
1062
- $url = w3_get_site_path() . ltrim($url, '/\\');
1063
- }
1064
-
1065
- $url = ltrim($url, '/');
1066
-
1067
- return $url;
1068
- }
1069
-
1070
  /**
1071
  * Returns true if zlib output compression is enabled otherwise false
1072
- *
1073
  * @return boolean
1074
  */
1075
  function w3_zlib_output_compression()
@@ -1079,7 +1583,7 @@ function w3_zlib_output_compression()
1079
 
1080
  /**
1081
  * Recursive strips slahes from the var
1082
- *
1083
  * @param mixed $var
1084
  * @return mixed
1085
  */
@@ -1094,14 +1598,14 @@ function w3_stripslashes($var)
1094
  return $var;
1095
  }
1096
 
1097
- if (! function_exists('file_put_contents')) {
1098
- if (! defined('FILE_APPEND')) {
1099
  define('FILE_APPEND', 8);
1100
  }
1101
 
1102
  /**
1103
  * Puts contents to the file
1104
- *
1105
  * @param string $filename
1106
  * @param string $data
1107
  * @param integer $flags
@@ -1124,6 +1628,7 @@ if (! function_exists('file_put_contents')) {
1124
 
1125
  /**
1126
  * Cleanup .htaccess rules
 
1127
  * @param string $rules
1128
  * @return string
1129
  */
@@ -1137,24 +1642,127 @@ function w3_clean_rules($rules)
1137
  }
1138
 
1139
  /**
1140
- * Send powered by header
 
 
 
 
 
1141
  */
1142
- function w3_send_x_powered_by()
1143
  {
1144
- switch (true) {
1145
- case defined('DOING_AJAX'):
1146
- case defined('DOING_CRON'):
1147
- case defined('APP_REQUEST'):
1148
- case defined('XMLRPC_REQUEST'):
1149
- case defined('WP_ADMIN'):
1150
- return;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1151
  }
1152
 
1153
- @header('X-Powered-By: ' . W3TC_POWERED_BY);
1154
  }
1155
 
1156
- if (w3_is_wpmu()) {
1157
- unset($_GET['sitewide']);
 
 
 
 
 
 
 
 
 
 
1158
  }
1159
 
1160
- w3_send_x_powered_by();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
 
3
+ define('W3TC_VERSION', '0.9b');
4
  define('W3TC_POWERED_BY', 'W3 Total Cache/' . W3TC_VERSION);
5
  define('W3TC_EMAIL', 'w3tc@w3-edge.com');
6
+ define('W3TC_PAYPAL_URL', 'https://www.paypal.com/cgi-bin/webscr');
7
+ define('W3TC_PAYPAL_BUSINESS', 'w3tc@w3-edge.com');
8
  define('W3TC_LINK_URL', 'http://www.w3-edge.com/wordpress-plugins/');
9
  define('W3TC_LINK_NAME', 'WordPress Plugins');
10
  define('W3TC_FEED_URL', 'http://feeds.feedburner.com/W3TOTALCACHE');
11
  define('W3TC_README_URL', 'http://plugins.trac.wordpress.org/browser/w3-total-cache/trunk/readme.txt?format=txt');
12
+ define('W3TC_TWITTER_STATUS', 'YES! I optimized my #wordpress site\'s #performance using the W3 Total Cache #plugin by @w3edge. Check it out! http://j.mp/A69xX');
13
  define('W3TC_SUPPORT_US_TIMEOUT', 2592000);
14
 
15
  define('W3TC_PHP5', PHP_VERSION >= 5);
20
  define('W3TC_LIB_DIR', W3TC_DIR . '/lib');
21
  define('W3TC_LIB_W3_DIR', W3TC_LIB_DIR . '/W3');
22
  define('W3TC_LIB_MINIFY_DIR', W3TC_LIB_DIR . '/Minify');
23
+ define('W3TC_LIB_CF_DIR', W3TC_LIB_DIR . '/CF');
24
  define('W3TC_PLUGINS_DIR', W3TC_DIR . '/plugins');
25
  define('W3TC_INSTALL_DIR', W3TC_DIR . '/wp-content');
26
  define('W3TC_INSTALL_MINIFY_DIR', W3TC_INSTALL_DIR . '/w3tc/min');
27
 
28
+ define('W3TC_BLOGNAMES_PATH', WP_CONTENT_DIR . '/w3-total-cache-blognames.php');
 
 
 
 
 
 
 
 
 
 
29
  define('W3TC_BLOGNAME', w3_get_blogname());
30
+ define('W3TC_SUFFIX', (W3TC_BLOGNAME != '' ? '-' . W3TC_BLOGNAME : ''));
31
 
32
  defined('WP_CONTENT_DIR') || define('WP_CONTENT_DIR', realpath(W3TC_DIR . '/../..'));
33
+ define('WP_CONTENT_DIR_PATH', dirname(WP_CONTENT_DIR));
34
  define('WP_CONTENT_DIR_NAME', basename(WP_CONTENT_DIR));
35
+ define('W3TC_CONTENT_DIR_NAME', WP_CONTENT_DIR_NAME . '/w3tc' . W3TC_SUFFIX);
36
+ define('W3TC_CONTENT_DIR', WP_CONTENT_DIR_PATH . '/' . W3TC_CONTENT_DIR_NAME);
37
  define('W3TC_CONTENT_MINIFY_DIR_NAME', W3TC_CONTENT_DIR_NAME . '/min');
38
+ define('W3TC_CONTENT_MINIFY_DIR', WP_CONTENT_DIR_PATH . '/' . W3TC_CONTENT_DIR_NAME . '/min');
39
  define('W3TC_CACHE_FILE_DBCACHE_DIR', W3TC_CONTENT_DIR . '/dbcache');
40
+ define('W3TC_CACHE_FILE_OBJECTCACHE_DIR', W3TC_CONTENT_DIR . '/objectcache');
41
  define('W3TC_CACHE_FILE_PGCACHE_DIR', W3TC_CONTENT_DIR . '/pgcache');
42
  define('W3TC_CACHE_FILE_MINIFY_DIR', W3TC_CONTENT_DIR . '/min');
43
  define('W3TC_LOG_DIR', W3TC_CONTENT_DIR . '/log');
44
  define('W3TC_TMP_DIR', W3TC_CONTENT_DIR . '/tmp');
45
+ define('W3TC_CONFIG_PATH', WP_CONTENT_DIR . '/w3-total-cache-config' . W3TC_SUFFIX . '.php');
46
+ define('W3TC_CONFIG_PREVIEW_PATH', WP_CONTENT_DIR . '/w3-total-cache-config' . W3TC_SUFFIX . '-preview.php');
47
  define('W3TC_CONFIG_MASTER_PATH', WP_CONTENT_DIR . '/w3-total-cache-config.php');
48
  define('W3TC_MINIFY_LOG_FILE', W3TC_LOG_DIR . '/minify.log');
49
  define('W3TC_CDN_COMMAND_UPLOAD', 1);
50
  define('W3TC_CDN_COMMAND_DELETE', 2);
51
  define('W3TC_CDN_TABLE_QUEUE', 'w3tc_cdn_queue');
52
 
53
+ @ini_set('pcre.backtrack_limit', 4194304);
54
+ @ini_set('pcre.recursion_limit', 4194304);
55
+
56
+ $_w3tc_actions = array();
57
 
58
  /**
59
  * W3 activate error
60
+ *
61
  * @param string $error
62
  * @return void
63
  */
 
64
  function w3_activate_error($error)
65
  {
66
  $active_plugins = (array) get_option('active_plugins');
67
 
68
+ // workaround for WPMU deactivation bug
69
+ remove_action('deactivate_' . W3TC_FILE, 'deactivate_sitewide_plugin');
70
+
71
  $key = array_search(W3TC_FILE, $active_plugins);
72
 
73
  if ($key !== false) {
79
  do_action('deactivated_plugin', W3TC_FILE);
80
 
81
  update_option('active_plugins', $active_plugins);
82
+
83
  } else {
84
  do_action('deactivate_' . W3TC_FILE);
85
  }
113
  }
114
 
115
  /**
116
+ * W3 Network activation error
117
+ *
118
+ * @return void
 
 
 
 
 
 
 
 
 
 
 
 
119
  */
120
+ function w3_network_activate_error()
121
  {
122
+ echo '<p><strong>W3 Total Cache Error:</strong> plugin cannot be activated network-wide.</p>';
123
+ echo '<p><a href="javascript:history.back(-1);">Back</a>';
124
+ exit();
125
  }
126
 
127
  /**
128
+ * Returns current microtime
129
  *
130
+ * @return float
 
131
  */
132
+ function w3_microtime()
133
  {
134
+ list($usec, $sec) = explode(" ", microtime());
135
+ return ((float) $usec + (float) $sec);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
  }
137
 
138
  /**
150
  $dirs = explode('/', $path);
151
 
152
  foreach ($dirs as $dir) {
153
+ if ($dir == '') {
154
  return false;
155
  }
156
 
157
  $curr_path .= ($curr_path == '' ? '' : '/') . $dir;
158
 
159
+ if (!@is_dir($curr_path)) {
160
  if (@mkdir($curr_path, $mask)) {
161
  @chmod($curr_path, $mask);
162
  } else {
170
 
171
  /**
172
  * Recursive remove dir
173
+ *
174
  * @param string $path
175
  * @param array $exclude
176
  * @return void
180
  $dir = @opendir($path);
181
 
182
  if ($dir) {
183
+ while (($entry = @readdir($dir)) !== false) {
184
  $full_path = $path . '/' . $entry;
185
 
186
+ if ($entry != '.' && $entry != '..' && !in_array($full_path, $exclude)) {
187
+ if (@is_dir($full_path)) {
188
  w3_rmdir($full_path, $exclude);
189
  } else {
190
  @unlink($full_path);
202
 
203
  /**
204
  * Recursive empty dir
205
+ *
206
  * @param string $path
207
  * @param array $exclude
208
  * @return void
218
  * @param string $content
219
  * @return boolean
220
  */
221
+ function w3_is_xml(&$content)
222
  {
223
  return (stristr($content, '<?xml') !== false || stristr($content, '<html') !== false);
224
  }
225
 
226
  /**
227
  * Returns true if it's WPMU
228
+ *
229
  * @return boolean
230
  */
231
  function w3_is_wpmu()
239
  return $wpmu;
240
  }
241
 
242
+ /**
243
+ * Returns true if it's WP with enabled Network mode
244
+ *
245
+ * @return boolean
246
+ */
247
+ function w3_is_network_mode()
248
+ {
249
+ static $network_mode = null;
250
+
251
+ if ($network_mode === null) {
252
+ $network_mode = (defined('MULTISITE') && MULTISITE);
253
+ }
254
+
255
+ return $network_mode;
256
+ }
257
+
258
+ /**
259
+ * Returns if there is multisite mode
260
+ *
261
+ * @return boolean
262
+ */
263
+ function w3_is_multisite()
264
+ {
265
+ return (w3_is_wpmu() || w3_is_network_mode());
266
+ }
267
+
268
  /**
269
  * Returns true if WPMU uses vhosts
270
+ *
271
  * @return boolean
272
  */
273
  function w3_is_vhost()
274
  {
275
+ return ((defined('SUBDOMAIN_INSTALL') && SUBDOMAIN_INSTALL) || (defined('VHOST') && VHOST == 'yes'));
276
  }
277
 
278
  /**
279
+ * Check if URL is valid
280
  *
281
+ * @param string $url
282
+ * @return boolean
283
  */
284
+ function w3_is_url($url)
285
  {
286
+ return preg_match('~^https?://~', $url);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
287
  }
288
 
289
  /**
290
+ * Returns true if current connection is secure
291
+ *
292
+ * @return boolean
 
293
  */
294
+ function w3_is_https()
295
  {
296
+ switch (true) {
297
+ case (isset($_SERVER['HTTPS']) && w3_to_boolean($_SERVER['HTTPS'])):
298
+ case (isset($_SERVER['SERVER_PORT']) && (int) $_SERVER['SERVER_PORT'] == 443):
299
+ return true;
 
 
 
 
 
 
 
 
300
  }
301
 
302
+ return false;
303
  }
304
 
305
  /**
306
+ * Check if WP permalink directives exists
307
+ *
308
+ * @return boolean
309
  */
310
+ function w3_is_permalink_rules()
311
  {
312
+ $path = w3_get_home_root() . '/.htaccess';
 
 
 
 
 
 
 
 
 
 
313
 
314
+ return (($data = @file_get_contents($path)) && (strstr($data, 'add a trailing slash to') !== false || strstr($data, 'BEGIN WordPress') !== false));
315
  }
316
 
317
  /**
318
+ * Check if there was database error
319
+ *
320
+ * @param string $content
321
+ * @return boolean
322
  */
323
+ function w3_is_database_error(&$content)
324
  {
325
+ return (stristr($content, '<title>Database Error</title>') !== false);
 
 
 
 
 
 
326
  }
327
 
328
  /**
329
+ * Returns true if preview config exists
330
+ *
331
+ * @return boolean
332
  */
333
+ function w3_is_preview_config()
334
  {
335
+ return file_exists(W3TC_CONFIG_PREVIEW_PATH);
 
 
 
336
  }
337
 
338
  /**
339
+ * Retuns true if preview settings active
340
+ *
341
+ * @return boolean
342
  */
343
+ function w3_is_preview_mode()
344
  {
345
+ return (w3_is_preview_config() && (defined('WP_ADMIN') || isset($_REQUEST['w3tc_preview']) || strstr($_SERVER['HTTP_REFERER'], 'w3tc_preview') !== false));
 
 
 
 
 
 
 
 
346
  }
347
 
348
  /**
349
+ * Check if file is write-able
350
  *
351
+ * @param string $path
352
+ * @return boolean
353
  */
354
+ function w3_is_writable($file)
355
  {
356
+ $exists = file_exists($file);
 
357
 
358
+ $fp = @fopen($file, 'a');
 
359
 
360
+ if ($fp) {
361
+ fclose($fp);
362
+
363
+ if (!$exists) {
364
+ @unlink($file);
365
+ }
366
+
367
+ return true;
368
  }
369
 
370
+ return false;
371
  }
372
 
373
  /**
374
+ * Cehck if dir is write-able
375
+ *
376
+ * @param string $dir
377
+ * @return boolean
378
  */
379
+ function w3_is_writable_dir($dir)
380
  {
381
+ $file = $dir . '/' . uniqid(mt_rand()) . '.tmp';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
382
 
383
+ return w3_is_writable($file);
384
  }
385
 
386
  /**
407
  }
408
 
409
  /**
410
+ * Returns array of all available blognames
411
+ *
412
+ * @return array
413
  */
414
+ function w3_get_blognames()
415
  {
416
+ global $wpdb;
 
417
 
418
+ $blognames = array();
419
+
420
+ $sql = sprintf('SELECT domain, path FROM %s', $wpdb->blogs);
421
+ $blogs = $wpdb->get_results($sql);
422
+
423
+ if ($blogs) {
424
+ $base_path = w3_get_base_path();
425
 
426
+ foreach ($blogs as $blog) {
427
+ $blogname = trim(str_replace($base_path, '', $blog->path), '/');
428
+
429
+ if ($blogname) {
430
+ $blognames[] = $blogname;
431
+ }
432
+ }
433
  }
434
 
435
+ return $blognames;
436
  }
437
 
438
  /**
439
+ * Load blognames from file
440
+ *
441
+ * @return array
442
  */
443
+ function w3_load_blognames()
444
  {
445
+ $blognames = include W3TC_BLOGNAMES_PATH;
446
+
447
+ return $blognames;
 
448
  }
449
 
450
  /**
451
+ * Save blognames into file
452
+ *
453
+ * @param string $blognames
454
+ * @return boolean
455
  */
456
+ function w3_save_blognames($blognames = null)
457
  {
458
+ if (!$blognames) {
459
+ $blognames = w3_get_blognames();
460
+ }
461
 
462
+ $strings = array();
463
+
464
+ foreach ($blognames as $blogname) {
465
+ $strings[] = sprintf("'%s'", addslashes($blogname));
 
 
 
 
 
 
466
  }
467
 
468
+ $data = sprintf('<?php return array(%s);', implode(', ', $strings));
469
+
470
+ return @file_put_contents(W3TC_BLOGNAMES_PATH, $data);
471
  }
472
 
473
  /**
474
+ * Detect WPMU blogname
475
+ *
 
 
476
  * @return string
477
  */
478
+ function w3_get_blogname()
479
+ {
480
+ static $blogname = null;
481
+
482
+ if ($blogname === null) {
483
+ if (w3_is_multisite()) {
484
+ $host = w3_get_host();
485
+ $domain = w3_get_domain($host);
486
+
487
+ if (w3_is_vhost()) {
488
+ $blogname = $domain;
489
+ } else {
490
+ $uri = $_SERVER['REQUEST_URI'];
491
+ $base_path = w3_get_base_path();
492
+
493
+ if ($base_path != '' && strpos($uri, $base_path) === 0) {
494
+ $uri = substr_replace($uri, '/', 0, strlen($base_path));
495
+ }
496
+
497
+ $blogname = w3_get_blogname_from_uri($uri);
498
+
499
+ if ($blogname != '') {
500
+ $blogname = $blogname . '.' . $domain;
501
+ } else {
502
+ $blogname = $domain;
503
+ }
504
+ }
505
+ } else {
506
+ $blogname = '';
507
+ }
508
+ }
509
+
510
+ return $blogname;
511
+ }
512
+
513
+ /**
514
+ * Returns blogname from URI
515
+ *
516
+ * @param string $uri
517
+ * @param string
518
+ */
519
+ function w3_get_blogname_from_uri($uri)
520
+ {
521
+ $blogname = '';
522
+ $matches = null;
523
+ $uri = strtolower($uri);
524
+
525
+ if (preg_match('~^/([a-z0-9-]+)/~', $uri, $matches)) {
526
+ if (file_exists(W3TC_BLOGNAMES_PATH)) {
527
+ // Get blognames from cache
528
+ $blognames = w3_load_blognames();
529
+ } elseif (isset($GLOBALS['wpdb'])) {
530
+ // Get blognames from DB
531
+ $blognames = w3_get_blognames();
532
+ } else {
533
+ $blognames = array();
534
+ }
535
+
536
+ if (is_array($blognames) && in_array($matches[1], $blognames)) {
537
+ $blogname = $matches[1];
538
+ }
539
+ }
540
+
541
+ return $blogname;
542
+ }
543
+
544
+ /**
545
+ * Returns URL regexp from URL
546
+ *
547
+ * @param string $url
548
+ * @return string
549
+ */
550
+ function w3_get_url_regexp($url)
551
+ {
552
+ $url = preg_replace('~https?://~i', '', $url);
553
+ $url = preg_replace('~^www\.~i', '', $url);
554
+
555
+ $regexp = 'https?://(www\.)?' . w3_preg_quote($url);
556
+
557
+ return $regexp;
558
+ }
559
+
560
+ /**
561
+ * Returns SSL URL if current connection is https
562
+ * @param string $url
563
+ * @return string
564
+ */
565
+ function w3_get_url_ssl($url)
566
+ {
567
+ if (w3_is_https()) {
568
+ $url = str_replace('http://', 'https://', $url);
569
+ }
570
+
571
+ return $url;
572
+ }
573
+
574
+ /**
575
+ * Get domain URL
576
+ *
577
+ * @return string
578
+ */
579
+
580
+ function w3_get_domain_url()
581
+ {
582
+ $site_url = w3_get_site_url();
583
+ $parse_url = @parse_url($site_url);
584
+
585
+ if ($parse_url && isset($parse_url['scheme']) && isset($parse_url['host'])) {
586
+ $scheme = $parse_url['scheme'];
587
+ $host = $parse_url['host'];
588
+ $port = (isset($parse_url['port']) && $parse_url['port'] != 80 ? ':' . (int) $parse_url['port'] : '');
589
+ $domain_url = sprintf('%s://%s%s', $scheme, $host, $port);
590
+
591
+ return $domain_url;
592
+ }
593
+
594
+ return false;
595
+ }
596
+
597
+ /**
598
+ * Returns domain url regexp
599
+ *
600
+ * @return string
601
+ */
602
+ function w3_get_domain_url_regexp()
603
+ {
604
+ $domain_url = w3_get_domain_url();
605
+ $regexp = w3_get_url_regexp($domain_url);
606
+
607
+ return $regexp;
608
+ }
609
+
610
+ /**
611
+ * Returns home URL
612
+ *
613
+ * No trailing slash!
614
+ *
615
+ * @return string
616
+ */
617
+ function w3_get_home_url()
618
+ {
619
+ static $home_url = null;
620
+
621
+ if ($home_url === null) {
622
+ if (function_exists('get_option')) {
623
+ $home_url = get_option('home');
624
+ } else {
625
+ $home_url = w3_get_site_url();
626
+ }
627
+
628
+ $home_url = rtrim($home_url, '/');
629
+ }
630
+
631
+ return $home_url;
632
+ }
633
+
634
+ /**
635
+ * Returns SSL home url
636
+ *
637
+ * @return string
638
+ */
639
+ function w3_get_home_url_ssl()
640
+ {
641
+ $home_url = w3_get_home_url();
642
+ $ssl = w3_get_url_ssl($home_url);
643
+
644
+ return $ssl;
645
+ }
646
+
647
+ /**
648
+ * Returns site URL
649
+ *
650
+ * No trailing slash!
651
+ *
652
+ * @return string
653
+ */
654
+ function w3_get_site_url()
655
+ {
656
+ static $site_url = null;
657
+
658
+ if ($site_url === null) {
659
+ if (function_exists('get_option')) {
660
+ $site_url = get_option('siteurl');
661
+ } else {
662
+ $site_url = sprintf('http://%s%s', w3_get_host(), w3_get_base_path());
663
+ }
664
+
665
+ $site_url = rtrim($site_url, '/');
666
+ }
667
+
668
+ return $site_url;
669
+ }
670
+
671
+ /**
672
+ * Returns SSL site url
673
+ *
674
+ * @return string
675
+ */
676
+ function w3_get_site_url_ssl()
677
+ {
678
+ $site_url = w3_get_site_url();
679
+ $ssl = w3_get_url_ssl($site_url);
680
+
681
+ return $ssl;
682
+ }
683
+
684
+ /**
685
+ * Returns site url regexp
686
+ *
687
+ * @return string
688
+ */
689
+ function w3_get_site_url_regexp()
690
+ {
691
+ $site_url = w3_get_site_url();
692
+ $regexp = w3_get_url_regexp($site_url);
693
+
694
+ return $regexp;
695
+ }
696
+
697
+ /**
698
+ * Returns absolute path to document root
699
+ *
700
+ * No trailing slash!
701
+ *
702
+ * @return string
703
+ */
704
+ function w3_get_document_root()
705
+ {
706
+ static $document_root = null;
707
+
708
+ if ($document_root === null) {
709
+ if (isset($_SERVER['DOCUMENT_ROOT'])) {
710
+ $document_root = $_SERVER['DOCUMENT_ROOT'];
711
+ } elseif (isset($_SERVER['SCRIPT_FILENAME'])) {
712
+ $document_root = substr($_SERVER['SCRIPT_FILENAME'], 0, -strlen($_SERVER['PHP_SELF']));
713
+ } elseif (isset($_SERVER['PATH_TRANSLATED'])) {
714
+ $document_root = substr($_SERVER['PATH_TRANSLATED'], 0, -strlen($_SERVER['PHP_SELF']));
715
+ } else {
716
+ $document_root = w3_get_site_root();
717
+ }
718
+
719
+ $document_root = realpath($document_root);
720
+ $document_root = w3_path($document_root);
721
+ }
722
+
723
+ return $document_root;
724
+ }
725
+
726
+ /**
727
+ * Returns absolute path to home directory
728
+ *
729
+ * Example:
730
+ *
731
+ * DOCUMENT_ROOT=/var/www/vhosts/domain.com
732
+ * Install dir=/var/www/vhosts/domain.com/site/blog
733
+ * home=http://domain.com/site
734
+ * siteurl=http://domain.com/site/blog
735
+ * return /var/www/vhosts/domain.com/site
736
+ *
737
+ * No trailing slash!
738
+ *
739
+ * @return string
740
+ */
741
+ function w3_get_home_root()
742
+ {
743
+ $home_url = w3_get_home_url();
744
+ $site_url = w3_get_site_url();
745
+
746
+ if (w3_is_multisite()) {
747
+ $path = w3_get_base_path();
748
+ } else {
749
+ $path = w3_get_home_path();
750
+ }
751
+
752
+ $home_root = w3_get_document_root() . $path;
753
+ $home_root = realpath($home_root);
754
+ $home_root = w3_path($home_root);
755
+
756
+ return $home_root;
757
+ }
758
+
759
+ /**
760
+ * Returns absolute path to blog install dir
761
+ *
762
+ * Example:
763
+ *
764
+ * DOCUMENT_ROOT=/var/www/vhosts/domain.com
765
+ * install dir=/var/www/vhosts/domain.com/site/blog
766
+ * return /var/www/vhosts/domain.com/site/blog
767
+ *
768
+ * No trailing slash!
769
+ *
770
+ * @return string
771
+ */
772
+ function w3_get_site_root()
773
+ {
774
+ $site_root = ABSPATH;
775
+ $site_root = realpath($site_root);
776
+ $site_root = w3_path($site_root);
777
+
778
+ return $site_root;
779
+ }
780
+
781
+ /**
782
+ * Returns blog path
783
+ *
784
+ * Example:
785
+ *
786
+ * siteurl=http://domain.com/site/blog
787
+ * return /site/blog/
788
+ *
789
+ * With trailing slash!
790
+ *
791
+ * @return string
792
+ */
793
+ function w3_get_site_path()
794
+ {
795
+ $site_url = w3_get_site_url();
796
+ $parse_url = @parse_url($site_url);
797
+
798
+ if ($parse_url && isset($parse_url['path'])) {
799
+ $site_path = '/' . ltrim($parse_url['path'], '/');
800
+ } else {
801
+ $site_path = '/';
802
+ }
803
+
804
+ if (substr($site_path, -1) != '/') {
805
+ $site_path .= '/';
806
+ }
807
+
808
+ return $site_path;
809
+ }
810
+
811
+ /**
812
+ * Returns home path
813
+ *
814
+ * Example:
815
+ *
816
+ * home=http://domain.com/site/
817
+ * siteurl=http://domain.com/site/blog
818
+ * return /site/
819
+ *
820
+ * With trailing slash!
821
+ *
822
+ * @return string
823
+ */
824
+ function w3_get_home_path()
825
+ {
826
+ $home_url = w3_get_home_url();
827
+ $parse_url = @parse_url($home_url);
828
+
829
+ if ($parse_url && isset($parse_url['path'])) {
830
+ $home_path = '/' . ltrim($parse_url['path'], '/');
831
+ } else {
832
+ $home_path = '/';
833
+ }
834
+
835
+ if (substr($home_path, -1) != '/') {
836
+ $home_path .= '/';
837
+ }
838
+
839
+ return $home_path;
840
+ }
841
+
842
+ /**
843
+ * Returns path to WP directory relative to document root
844
+ *
845
+ * Example:
846
+ *
847
+ * DOCUMENT_ROOT=/var/www/vhosts/domain.com/
848
+ * Install dir=/var/www/vhosts/domain.com/site/blog/
849
+ * return /site/blog/
850
+ *
851
+ * With trailing slash!
852
+ *
853
+ * @return string
854
+ */
855
+ function w3_get_base_path()
856
+ {
857
+ $document_root = w3_get_document_root();
858
+ $site_root = w3_get_site_root();
859
+
860
+ $base_path = str_replace($document_root, '', $site_root);
861
+ $base_path = '/' . ltrim($base_path, '/');
862
+
863
+ if (substr($base_path, -1) != '/') {
864
+ $base_path .= '/';
865
+ }
866
+
867
+ return $base_path;
868
+ }
869
+
870
+ /**
871
+ * Returns server hostname
872
+ *
873
+ * @return string
874
+ */
875
+ function w3_get_host()
876
+ {
877
+ static $host = null;
878
+
879
+ if ($host === null) {
880
+ $host = (isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : $_SERVER['HTTP_HOST']);
881
+ }
882
+
883
+ return $host;
884
+ }
885
+
886
+ /**
887
+ * Normalizes file name
888
+ *
889
+ * Relative to site root!
890
+ *
891
+ * @param string $file
892
+ * @return string
893
+ */
894
+ function w3_normalize_file($file)
895
+ {
896
+ if (w3_is_url($file)) {
897
+ if (strstr($file, '?') === false) {
898
+ $site_url_regexp = '~' . w3_get_site_url_regexp() . '~i';
899
+ $file = preg_replace($site_url_regexp, '', $file);
900
+ }
901
+ }
902
+
903
+ if (!w3_is_url($file)) {
904
+ $file = w3_path($file);
905
+ $file = str_replace(w3_get_site_root(), '', $file);
906
+ $file = ltrim($file, '/');
907
+ }
908
+
909
+ return $file;
910
+ }
911
+
912
+ /**
913
+ * Normalizes file name for minify
914
+ *
915
+ * Relative to document root!
916
+ *
917
+ * @param string $file
918
+ * @return string
919
+ */
920
+ function w3_normalize_file_minify($file)
921
+ {
922
+ if (w3_is_url($file)) {
923
+ if (strstr($file, '?') === false) {
924
+ $domain_url_regexp = '~' . w3_get_domain_url_regexp() . '~i';
925
+ $file = preg_replace($domain_url_regexp, '', $file);
926
+ }
927
+ }
928
+
929
+ if (!w3_is_url($file)) {
930
+ $file = w3_path($file);
931
+ $file = str_replace(w3_get_document_root(), '', $file);
932
+ $file = ltrim($file, '/');
933
+ }
934
+
935
+ return $file;
936
+ }
937
+
938
+ /**
939
+ * Translates remote file to local file
940
+ *
941
+ * @param string $file
942
+ * @return string
943
+ */
944
+ function w3_translate_file($file)
945
+ {
946
+ if (!w3_is_url($file)) {
947
+ $file = '/' . ltrim($file, '/');
948
+ $regexp = '~^' . w3_preg_quote(w3_get_site_path()) . '~';
949
+ $file = preg_replace($regexp, w3_get_base_path(), $file);
950
+ $file = ltrim($file, '/');
951
+ }
952
+
953
+ return $file;
954
+ }
955
+
956
+ /**
957
+ * Converts win path to unix
958
+ *
959
+ * @param string $path
960
+ * @return string
961
+ */
962
+ function w3_path($path)
963
  {
964
+ $path = preg_replace('~[/\\\]+~', '/', $path);
965
+ $path = rtrim($path, '/');
966
 
967
+ return $path;
968
+ }
969
+
970
+ /**
971
+ * Returns realpath of given path
972
+ *
973
+ * @param string $path
974
+ */
975
+ function w3_realpath($path)
976
+ {
977
+ $path = w3_path($path);
978
+ $parts = explode('/', $path);
979
+ $absolutes = array();
980
+
981
+ foreach ($parts as $part) {
982
+ if ('.' == $part) {
983
+ continue;
 
 
 
 
 
 
 
 
 
 
 
 
 
984
  }
985
+ if ('..' == $part) {
986
+ array_pop($absolutes);
987
+ } else {
988
+ $absolutes[] = $part;
989
  }
 
 
990
  }
991
 
992
+ return implode('/', $absolutes);
993
+ }
994
+
995
+ /**
996
+ * Returns dirname of path
997
+ *
998
+ * @param string $path
999
+ * @return string
1000
+ */
1001
+ function w3_dirname($path)
1002
+ {
1003
+ $dirname = dirname($path);
1004
 
1005
+ if ($dirname == '.' || $dirname == '/' || $dirname == '\\') {
1006
+ $dirname = '';
1007
  }
1008
 
1009
+ return $dirname;
 
1010
  }
1011
 
1012
  /**
1013
+ * Returns open basedirs
1014
  *
1015
+ * @return array
 
1016
  */
1017
+ function w3_get_open_basedirs()
1018
  {
1019
+ $open_basedir_ini = ini_get('open_basedir');
1020
+ $open_basedirs = (W3TC_WIN ? preg_split('~[;,]~', $open_basedir_ini) : explode(':', $open_basedir_ini));
1021
+ $result = array();
1022
+
1023
+ foreach ($open_basedirs as $open_basedir) {
1024
+ $open_basedir = trim($open_basedir);
1025
+ if ($open_basedir != '') {
1026
+ $result[] = w3_realpath($open_basedir);
1027
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1028
  }
1029
 
1030
+ return $result;
1031
  }
1032
 
1033
  /**
1034
+ * Checks if path is restricted by open_basedir
1035
  *
1036
+ * @param string $path
1037
  * @return boolean
1038
  */
1039
+ function w3_check_open_basedir($path)
1040
  {
1041
+ $path = w3_realpath($path);
1042
+ $open_basedirs = w3_get_open_basedirs();
1043
+
1044
+ if (!count($open_basedirs)) {
1045
+ return true;
1046
+ }
1047
+
1048
+ foreach ($open_basedirs as $open_basedir) {
1049
+ if (strstr($path, $open_basedir) !== false) {
1050
+ return true;
 
 
 
 
 
 
 
 
 
1051
  }
1052
  }
1053
 
1054
+ return false;
1055
  }
1056
 
1057
  /**
1061
  * @param string $url
1062
  * @param string $data
1063
  * @param string $auth
1064
+ * @param boolean $check_status
1065
  * @return string
1066
  */
1067
+ function w3_http_request($method, $url, $data = '', $auth = '', $check_status = true)
1068
  {
1069
  $status = 0;
1070
  $method = strtoupper($method);
1071
 
1072
+ if (function_exists('curl_init')) {
1073
  $ch = curl_init();
1074
 
1075
  curl_setopt($ch, CURLOPT_URL, $url);
1076
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
1077
  curl_setopt($ch, CURLOPT_USERAGENT, W3TC_POWERED_BY);
1078
+ @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
1079
+ curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
1080
  curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
1081
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
1082
+ curl_setopt($ch, CURLOPT_TIMEOUT, 180);
1083
 
1084
+ switch ($method) {
1085
+ case 'POST':
1086
+ curl_setopt($ch, CURLOPT_POST, true);
1087
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
1088
+ break;
1089
+
1090
+ case 'PURGE':
1091
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PURGE');
1092
+ break;
1093
  }
1094
 
1095
+ if ($auth) {
1096
  curl_setopt($ch, CURLOPT_USERPWD, $auth);
1097
  }
1098
 
1107
  if ($parse_url && isset($parse_url['host'])) {
1108
  $host = $parse_url['host'];
1109
  $port = (isset($parse_url['port']) ? (int) $parse_url['port'] : 80);
1110
+ $path = (!empty($parse_url['path']) ? $parse_url['path'] : '/');
1111
  $query = (isset($parse_url['query']) ? $parse_url['query'] : '');
1112
  $request_uri = $path . ($query != '' ? '?' . $query : '');
1113
 
1118
  'Connection: close'
1119
  );
1120
 
1121
+ if (!empty($data)) {
1122
  $request_headers_array[] = sprintf('Content-Length: %d', strlen($data));
1123
  }
1124
 
1125
+ if (!empty($auth)) {
1126
  $request_headers_array[] = sprintf('Authorization: Basic %s', base64_encode($auth));
1127
  }
1128
 
1129
  $request_headers = implode("\r\n", $request_headers_array);
1130
  $request = $request_headers . "\r\n\r\n" . $data;
1131
+ $errno = null;
1132
+ $errstr = null;
1133
 
1134
+ $fp = @fsockopen($host, $port, $errno, $errstr, 10);
1135
 
1136
+ if (!$fp) {
1137
  return false;
1138
  }
1139
 
1140
  $response = '';
1141
  @fputs($fp, $request);
1142
 
1143
+ while (!@feof($fp)) {
1144
  $response .= @fgets($fp, 4096);
1145
  }
1146
 
1147
  @fclose($fp);
1148
 
1149
+ list($response_headers, $contents) = explode("\r\n\r\n", $response, 2);
1150
 
1151
  $matches = null;
1152
 
1156
  }
1157
  }
1158
 
1159
+ if (!$check_status || $status == 200) {
1160
  return $contents;
1161
  }
1162
 
1166
  /**
1167
  * Download url via GET
1168
  *
1169
+ * @param string $url
1170
+ * @param string $auth
1171
+ * $param boolean $check_status
1172
  * @return string
1173
  */
1174
+ function w3_http_get($url, $auth = '', $check_status = true)
1175
  {
1176
+ return w3_http_request('GET', $url, null, $auth, $check_status);
1177
  }
1178
 
1179
  /**
1182
  * @param string $url
1183
  * @param string $data
1184
  * @param string $auth
1185
+ * @param boolean $check_status
1186
+ * @return string
1187
+ */
1188
+ function w3_http_post($url, $data = '', $auth = '', $check_status = true)
1189
+ {
1190
+ return w3_http_request('POST', $url, $data, $auth, $check_status);
1191
+ }
1192
+
1193
+ /**
1194
+ * Send PURGE request to Varnish server
1195
+ * @param string $url
1196
+ * @param string $auth
1197
+ * $param boolean $check_status
1198
  * @return string
1199
  */
1200
+ function w3_http_purge($url, $auth = '', $check_status = true)
1201
  {
1202
+ return w3_http_request('PURGE', $url, null, $auth, $check_status);
1203
+ }
1204
+
1205
+ /**
1206
+ * Returns GMT date
1207
+ * @param integer $time
1208
+ * @return string
1209
+ */
1210
+ function w3_http_date($time)
1211
+ {
1212
+ return gmdate('D, d M Y H:i:s \G\M\T', $time);
1213
  }
1214
 
1215
  /**
1216
  * Downloads data to a file
1217
+ *
1218
  * @param string $url
1219
  * @param string $file
1220
  * @return boolean
1221
  */
1222
  function w3_download($url, $file)
1223
  {
1224
+ $data = w3_http_get($url);
1225
 
1226
  if ($data !== false) {
1227
  return @file_put_contents($file, $data);
1231
  }
1232
 
1233
  /**
1234
+ * Returns upload info
1235
  *
1236
+ * @return array
1237
  */
1238
+ function w3_upload_info()
1239
  {
1240
+ static $upload_info = null;
1241
 
1242
+ if ($upload_info === null) {
1243
+ $upload_info = @wp_upload_dir();
1244
+
1245
+ if (empty($upload_info['error'])) {
1246
+ $site_url = w3_get_site_url();
1247
+
1248
+ $parse_url = @parse_url($upload_info['baseurl']);
1249
+
1250
+ if ($parse_url) {
1251
+ $baseurlpath = (!empty($parse_url['path']) ? trim($parse_url['path'], '/') : '');
1252
+ } else {
1253
+ $baseurlpath = 'wp-content/uploads';
1254
+ }
1255
+
1256
+ $upload_info['baseurlpath'] = '/' . $baseurlpath . '/';
1257
+ } else {
1258
+ $upload_info = false;
1259
+ }
1260
+ }
1261
+
1262
+ return $upload_info;
1263
+ }
1264
+
1265
+ /**
1266
+ * Redirects to URL
1267
+ *
1268
+ * @param string $url
1269
+ * @param string $params
1270
+ * @return string
1271
+ */
1272
+ function w3_redirect($url = '', $params = array())
1273
+ {
1274
+ $fragment = '';
1275
+
1276
+ if ($url != '' && ($parse_url = @parse_url($url))) {
1277
+ $url = '';
1278
+
1279
+ if (!empty($parse_url['scheme'])) {
1280
+ $url .= $parse_url['scheme'] . '://';
1281
+ }
1282
+
1283
+ if (!empty($parse_url['user'])) {
1284
+ $url .= $parse_url['user'];
1285
+
1286
+ if (!empty($parse_url['pass'])) {
1287
+ $url .= ':' . $parse_url['pass'];
1288
  }
1289
  }
1290
+
1291
+ if (!empty($parse_url['host'])) {
1292
+ $url .= $parse_url['host'];
1293
+ }
1294
+
1295
+ if (!empty($parse_url['port']) && $parse_url['port'] != 80) {
1296
+ $url .= ':' . (int) $parse_url['port'];
1297
+ }
1298
+
1299
+ $url .= (!empty($parse_url['path']) ? $parse_url['path'] : '/');
1300
+
1301
+ if (!empty($parse_url['query'])) {
1302
+ $old_params = array();
1303
+ parse_str($parse_url['query'], $old_params);
1304
+
1305
+ $params = array_merge($old_params, $params);
1306
+ }
1307
+
1308
+ if (!empty($parse_url['fragment'])) {
1309
+ $fragment = '#' . $parse_url['fragment'];
1310
+ }
1311
+ } else {
1312
+ $parse_url = array();
1313
+ }
1314
+
1315
+ if (($count = count($params))) {
1316
+ $query = '';
1317
+
1318
+ foreach ($params as $param => $value) {
1319
+ $count--;
1320
+ $query .= urlencode($param) . (!empty($value) ? '=' . urlencode($value) : '') . ($count ? '&' : '');
1321
+ }
1322
+
1323
+ $url .= (strpos($url, '?') === false ? '?' : '&') . $query;
1324
  }
1325
 
1326
+ if ($fragment != '') {
1327
+ $url .= $fragment;
1328
+ }
 
 
 
 
 
 
 
 
 
1329
 
1330
+ @header('Location: ' . $url);
1331
+ exit();
1332
  }
1333
 
1334
  /**
1335
+ * Returns caching engine name
1336
  *
1337
+ * @param $engine
1338
+ * @return string
1339
  */
1340
+ function w3_get_engine_name($engine)
1341
  {
1342
+ switch ($engine) {
1343
+ case 'memcached':
1344
+ $engine_name = 'memcached';
1345
+ break;
1346
+
1347
+ case 'apc':
1348
+ $engine_name = 'apc';
1349
+ break;
1350
+
1351
+ case 'eaccelerator':
1352
+ $engine_name = 'eaccelerator';
1353
+ break;
1354
+
1355
+ case 'xcache':
1356
+ $engine_name = 'xcache';
1357
+ break;
1358
+
1359
+ case 'file':
1360
+ $engine_name = 'disk';
1361
+ break;
1362
+
1363
+ case 'file_pgcache':
1364
+ $engine_name = 'disk (enhanced)';
1365
+ break;
1366
+
1367
+ case 'mirror':
1368
+ $engine_name = 'mirror';
1369
+ break;
1370
+
1371
+ case 'netdna':
1372
+ $engine_name = 'mirror: netdna / maxcdn';
1373
+ break;
1374
+
1375
+ case 'ftp':
1376
+ $engine_name = 'self-hosted / file transfer protocol upload';
1377
+ break;
1378
+
1379
+ case 's3':
1380
+ $engine_name = 'amazon simple storage service (s3)';
1381
+ break;
1382
+
1383
+ case 'cf':
1384
+ $engine_name = 'amazon cloudfront';
1385
+ break;
1386
+
1387
+ case 'rscf':
1388
+ $engine_name = 'rackspace cloud files';
1389
+ break;
1390
+
1391
+ default:
1392
+ $engine_name = 'n/a';
1393
+ break;
1394
  }
1395
 
1396
+ return $engine_name;
1397
  }
1398
 
1399
  /**
1400
+ * Converts value to boolean
1401
  *
1402
+ * @param mixed $value
1403
+ * @return boolean
1404
  */
1405
+ function w3_to_boolean($value)
1406
  {
1407
+ if (is_string($value)) {
1408
+ switch (strtolower($value)) {
1409
+ case '+':
1410
+ case '1':
1411
+ case 'y':
1412
+ case 'on':
1413
+ case 'yes':
1414
+ case 'true':
1415
+ case 'enabled':
1416
+ return true;
1417
+
1418
+ case '-':
1419
+ case '0':
1420
+ case 'n':
1421
+ case 'no':
1422
+ case 'off':
1423
+ case 'false':
1424
+ case 'disabled':
1425
+ return false;
1426
  }
1427
  }
1428
 
1429
+ return (boolean) $value;
1430
  }
1431
 
1432
  /**
1433
+ * Loads plugins
1434
  *
1435
+ * @return void
 
1436
  */
1437
+ function w3_load_plugins()
1438
  {
1439
+ $dir = @opendir(W3TC_PLUGINS_DIR);
 
 
 
 
 
1440
 
1441
+ if ($dir) {
1442
+ while (($entry = @readdir($dir)) !== false) {
1443
+ if (strrchr($entry, '.') === '.php') {
1444
+ require_once W3TC_PLUGINS_DIR . '/' . $entry;
1445
+ }
1446
  }
1447
+ @closedir($dir);
1448
  }
 
 
1449
  }
1450
 
1451
  /**
1456
  */
1457
  function w3_get_mime_type($file)
1458
  {
1459
+ static $cache = array();
1460
 
1461
+ if (!isset($cache[$file])) {
1462
+ $mime_type = false;
1463
+
1464
+ /**
1465
+ * Try to detect by extension (fast)
1466
+ */
1467
+ $mime_types = include W3TC_DIR . '/inc/mime/all.php';
1468
+
1469
+ foreach ($mime_types as $extension => $type) {
1470
+ if (preg_match('~\.(' . $extension . ')$~i', $file)) {
1471
+ $mime_type = $type;
1472
+ break;
1473
+ }
1474
+ }
1475
+
1476
+ /**
1477
+ * Try to detect using file info function
1478
+ */
1479
+ if (!$mime_type && function_exists('finfo_open')) {
1480
+ $finfo = @finfo_open(FILEINFO_MIME);
1481
+
1482
+ if (!$finfo) {
1483
+ $finfo = @finfo_open(FILEINFO_MIME);
1484
+ }
1485
+
1486
+ if ($finfo) {
1487
+ $mime_type = @finfo_file($finfo, $file);
1488
+
1489
+ if ($mime_type) {
1490
+ $extra_mime_type_info = strpos($mime_type, "; ");
1491
+
1492
+ if ($extra_mime_type_info) {
1493
+ $mime_type = substr($mime_type, 0, $extra_mime_type_info);
1494
+ }
1495
+
1496
+ if ($mime_type == 'application/octet-stream') {
1497
+ $mime_type = false;
1498
+ }
1499
  }
1500
+
1501
+ @finfo_close($finfo);
1502
  }
1503
  }
1504
+
1505
+ /**
1506
+ * Try to detect using mime type function
1507
+ */
1508
+ if (!$mime_type && function_exists('mime_content_type')) {
1509
+ $mime_type = @mime_content_type($file);
1510
+ }
1511
+
1512
+ /**
1513
+ * If detection failed use default mime type
1514
+ */
1515
+ if (!$mime_type) {
1516
+ $mime_type = 'application/octet-stream';
1517
+ }
1518
+
1519
+ $cache[$file] = $mime_type;
1520
  }
1521
 
1522
+ return $cache[$file];
1523
  }
1524
 
1525
  /**
1536
  $data = sprintf('status=%s', urlencode($status));
1537
  $auth = sprintf('%s:%s', $username, $password);
1538
 
1539
+ $xml = w3_http_post('http://twitter.com/statuses/update.xml', $data, $auth);
1540
 
1541
  if ($xml) {
1542
  $matches = null;
1557
 
1558
  /**
1559
  * Quotes regular expression string
1560
+ *
1561
  * @param string $regexp
1562
  * @return string
1563
  */
1571
  return $string;
1572
  }
1573
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1574
  /**
1575
  * Returns true if zlib output compression is enabled otherwise false
1576
+ *
1577
  * @return boolean
1578
  */
1579
  function w3_zlib_output_compression()
1583
 
1584
  /**
1585
  * Recursive strips slahes from the var
1586
+ *
1587
  * @param mixed $var
1588
  * @return mixed
1589
  */
1598
  return $var;
1599
  }
1600
 
1601
+ if (!function_exists('file_put_contents')) {
1602
+ if (!defined('FILE_APPEND')) {
1603
  define('FILE_APPEND', 8);
1604
  }
1605
 
1606
  /**
1607
  * Puts contents to the file
1608
+ *
1609
  * @param string $filename
1610
  * @param string $data
1611
  * @param integer $flags
1628
 
1629
  /**
1630
  * Cleanup .htaccess rules
1631
+ *
1632
  * @param string $rules
1633
  * @return string
1634
  */
1642
  }
1643
 
1644
  /**
1645
+ * Erases text from start to end
1646
+ *
1647
+ * @param string $text
1648
+ * @param string $start
1649
+ * @param string $end
1650
+ * @return string
1651
  */
1652
+ function w3_erase_text($text, $start, $end)
1653
  {
1654
+ $text = preg_replace('~' . w3_preg_quote($start) . '.*' . w3_preg_quote($end) . '~Us', '', $text);
1655
+ $text = trim($text);
1656
+
1657
+ return $text;
1658
+ }
1659
+
1660
+ /**
1661
+ * Return deafult htaccess rules for current WP version
1662
+ *
1663
+ * @return string
1664
+ */
1665
+ function w3_get_permalink_rules()
1666
+ {
1667
+ $rules = '';
1668
+ $base_path = w3_get_base_path();
1669
+
1670
+ if (w3_is_wpmu()) {
1671
+ $rules .= "RewriteEngine On\n";
1672
+ $rules .= "RewriteBase " . $base_path . "\n\n";
1673
+
1674
+ $rules .= "#uploaded files\n";
1675
+ $rules .= "RewriteRule ^(.*/)?files/$ index.php [L]\n";
1676
+ $rules .= "RewriteCond %{REQUEST_URI} !.*wp-content/plugins.*\n";
1677
+ $rules .= "RewriteRule ^(.*/)?files/(.*) wp-content/blogs.php?file=$2 [L]\n\n";
1678
+
1679
+ $rules .= "# add a trailing slash to /wp-admin\n";
1680
+ $rules .= "RewriteCond %{REQUEST_URI} ^.*/wp-admin$\n";
1681
+ $rules .= "RewriteRule ^(.+)$ $1/ [R=301,L]\n\n";
1682
+
1683
+ $rules .= "RewriteCond %{REQUEST_FILENAME} -f [OR]\n";
1684
+ $rules .= "RewriteCond %{REQUEST_FILENAME} -d\n";
1685
+ $rules .= "RewriteRule . - [L]\n";
1686
+ $rules .= "RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-.*) $2 [L]\n";
1687
+ $rules .= "RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\\.php)$ $2 [L]\n";
1688
+ $rules .= "RewriteRule . index.php [L]\n\n";
1689
+
1690
+ $rules .= "<IfModule mod_security.c>\n";
1691
+ $rules .= "<Files async-upload.php>\n";
1692
+ $rules .= "SecFilterEngine Off\n";
1693
+ $rules .= "SecFilterScanPOST Off\n";
1694
+ $rules .= "</Files>\n";
1695
+ $rules .= "</IfModule>\n";
1696
+ } elseif (w3_is_network_mode()) {
1697
+ $rules .= "# BEGIN WordPress\n";
1698
+ $rules .= "<IfModule mod_rewrite.c>\n";
1699
+ $rules .= " RewriteEngine On\n";
1700
+ $rules .= " RewriteBase " . $base_path . "\n";
1701
+ $rules .= " RewriteRule ^index\\.php$ - [L]\n\n";
1702
+
1703
+ $rules .= " # uploaded files\n";
1704
+ $rules .= " RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file= [L]\n\n";
1705
+
1706
+ $rules .= " # add a trailing slash to /wp-admin\n";
1707
+ $rules .= " RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ wp-admin/ [R=301,L]\n\n";
1708
+
1709
+ $rules .= " RewriteCond %{REQUEST_FILENAME} -f [OR]\n";
1710
+ $rules .= " RewriteCond %{REQUEST_FILENAME} -d\n";
1711
+ $rules .= " RewriteRule ^ - [L]\n";
1712
+ $rules .= " RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) [L]\n";
1713
+ $rules .= " RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\\.php)$ [L]\n";
1714
+ $rules .= " RewriteRule . index.php [L]\n";
1715
+ $rules .= "</IfModule>\n";
1716
+ $rules .= "# END WordPress\n";
1717
+ } else {
1718
+ $home_path = w3_get_home_path();
1719
+
1720
+ $rules .= "# BEGIN WordPress\n";
1721
+ $rules .= "<IfModule mod_rewrite.c>\n";
1722
+ $rules .= " RewriteEngine On\n";
1723
+ $rules .= " RewriteBase " . $home_path . "\n";
1724
+ $rules .= " RewriteCond %{REQUEST_FILENAME} !-f\n";
1725
+ $rules .= " RewriteCond %{REQUEST_FILENAME} !-d\n";
1726
+ $rules .= " RewriteRule . " . $base_path . "index.php [L]\n";
1727
+ $rules .= "</IfModule>\n";
1728
+ $rules .= "# END WordPress\n";
1729
  }
1730
 
1731
+ return $rules;
1732
  }
1733
 
1734
+ /**
1735
+ * Add W3TC action callback
1736
+ *
1737
+ * @param string $action
1738
+ * @param mixed $callback
1739
+ * @return void
1740
+ */
1741
+ function w3tc_add_action($action, $callback)
1742
+ {
1743
+ global $_w3tc_actions;
1744
+
1745
+ $_w3tc_actions[$action][] = $callback;
1746
  }
1747
 
1748
+ /**
1749
+ * Do W3TC action
1750
+ *
1751
+ * @param string $action
1752
+ * @param mixed $value
1753
+ * @return mixed
1754
+ */
1755
+ function w3tc_do_action($action, $value = null)
1756
+ {
1757
+ global $_w3tc_actions;
1758
+
1759
+ if (isset($_w3tc_actions[$action])) {
1760
+ foreach ((array) $_w3tc_actions[$action] as $callback) {
1761
+ if (is_callable($callback)) {
1762
+ $value = call_user_func($callback, $value);
1763
+ }
1764
+ }
1765
+ }
1766
+
1767
+ return $value;
1768
+ }
inc/email/minify_error_notification.html ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <html>
2
+ <head></head>
3
+ <body>
4
+ <p>Unfortunately an error occurred while creating the minify cache. Please check your settings to ensure your site is working as intended.</p>
5
+ <p>Thanks for using W3 Total Cache.</p>
6
+ </body>
7
+ </html>
inc/{options/support_email.phtml → email/support_request.phtml} RENAMED
@@ -3,19 +3,29 @@
3
  <body>
4
  <p>
5
  Date: <?php echo date('m/d/Y H:i:s'); ?><br />
6
- Request type: <?php echo htmlspecialchars($request_type); ?><br />
7
  URL: <a href="<?php echo htmlspecialchars($url); ?>"><?php echo htmlspecialchars($url); ?></a><br />
 
 
 
 
 
 
8
  <?php if ($request_data_url): ?>
9
- Request data: <a href="<?php echo htmlspecialchars($request_data_url); ?>"><?php echo htmlspecialchars($request_data_url); ?></a>
10
  <?php endif; ?>
 
11
  </p>
 
12
  <p>
13
  <?php echo nl2br(htmlspecialchars($description)); ?>
14
  </p>
 
15
  <hr />
 
16
  <font size="-1" color="#ccc">
17
  E-mail sent from IP: <?php echo htmlspecialchars($_SERVER['REMOTE_ADDR']); ?><br />
18
  User Agent: <?php echo htmlspecialchars($_SERVER['HTTP_USER_AGENT']); ?>
19
  </font>
20
  </body>
21
- </html>
3
  <body>
4
  <p>
5
  Date: <?php echo date('m/d/Y H:i:s'); ?><br />
6
+ Request type: <?php echo htmlspecialchars($request_type_text); ?><br />
7
  URL: <a href="<?php echo htmlspecialchars($url); ?>"><?php echo htmlspecialchars($url); ?></a><br />
8
+ Name: <?php echo htmlspecialchars($name); ?><br />
9
+ E-Mail: <a href="mailto:<?php echo htmlspecialchars($email); ?>"><?php echo htmlspecialchars($email); ?></a><br />
10
+ Phone: <?php echo htmlspecialchars($phone); ?><br />
11
+ <?php if ($forum_url): ?>
12
+ Forum Topic URL: <a href="<?php echo htmlspecialchars($forum_url); ?>"><?php echo htmlspecialchars($forum_url); ?></a><br />
13
+ <?php endif; ?>
14
  <?php if ($request_data_url): ?>
15
+ Request data: <a href="<?php echo htmlspecialchars($request_data_url); ?>"><?php echo htmlspecialchars($request_data_url); ?></a><br />
16
  <?php endif; ?>
17
+ Subject: <?php echo htmlspecialchars($subject); ?>
18
  </p>
19
+
20
  <p>
21
  <?php echo nl2br(htmlspecialchars($description)); ?>
22
  </p>
23
+
24
  <hr />
25
+
26
  <font size="-1" color="#ccc">
27
  E-mail sent from IP: <?php echo htmlspecialchars($_SERVER['REMOTE_ADDR']); ?><br />
28
  User Agent: <?php echo htmlspecialchars($_SERVER['HTTP_USER_AGENT']); ?>
29
  </font>
30
  </body>
31
+ </html>
inc/images/logo.png CHANGED
Binary file
inc/images/logo_small.png ADDED
Binary file
inc/js/lightbox.js CHANGED
@@ -1,4 +1,4 @@
1
- var Lightbox = {
2
  window: jQuery(window),
3
  container: null,
4
  options: null,
@@ -43,9 +43,7 @@ var Lightbox = {
43
  callback: null
44
  }, options);
45
 
46
- if (!this.container) {
47
- this.create();
48
- }
49
 
50
  this.container.css( {
51
  width: this.options.width,
@@ -58,17 +56,15 @@ var Lightbox = {
58
  this.load(this.options.url, this.options.callback);
59
  }
60
 
61
- Overlay.show(this);
62
 
63
  this.resize();
64
  this.container.show();
65
- currentLightbox = this;
66
  },
67
 
68
  close: function() {
69
- this.container.hide();
70
- Overlay.hide();
71
- currentLightbox = null;
72
  },
73
 
74
  resize: function() {
@@ -76,6 +72,11 @@ var Lightbox = {
76
  top: this.window.scrollTop() + this.options.offsetTop,
77
  left: this.window.scrollLeft() + this.window.width() / 2 - this.container.width() / 2
78
  });
 
 
 
 
 
79
  },
80
 
81
  load: function(url, callback) {
@@ -99,10 +100,8 @@ var Lightbox = {
99
  if (width === undefined) {
100
  return this.container.width();
101
  } else {
102
- return this.container.css( {
103
- width: width,
104
- left: this.window.scrollLeft() + this.window.width() / 2 - width / 2
105
- });
106
  }
107
  },
108
 
@@ -110,10 +109,8 @@ var Lightbox = {
110
  if (height === undefined) {
111
  return this.container.height();
112
  } else {
113
- return this.container.css( {
114
- height: height,
115
- top: this.window.scrollTop() + this.options.offsetTop
116
- });
117
  }
118
  },
119
 
@@ -122,7 +119,7 @@ var Lightbox = {
122
  }
123
  };
124
 
125
- var Overlay = {
126
  window: jQuery(window),
127
  container: null,
128
 
@@ -152,16 +149,13 @@ var Overlay = {
152
  },
153
 
154
  show: function() {
155
- if (!this.container) {
156
- this.create();
157
- }
158
-
159
  this.resize();
160
  this.container.show();
161
  },
162
 
163
  hide: function() {
164
- this.container.hide();
165
  },
166
 
167
  resize: function() {
@@ -175,10 +169,10 @@ var Overlay = {
175
  };
176
 
177
  function w3tc_lightbox_support_us() {
178
- Lightbox.open( {
179
  width: 590,
180
  height: 200,
181
- url: 'options-general.php?page=w3-total-cache/w3-total-cache.php&w3tc_action=support_us',
182
  callback: function(lightbox) {
183
  jQuery('.button-tweet', lightbox.container).click(function(event) {
184
  lightbox.close();
@@ -202,10 +196,10 @@ function w3tc_lightbox_support_us() {
202
  }
203
 
204
  function w3tc_lightbox_tweet() {
205
- Lightbox.open( {
206
  width: 550,
207
  height: 340,
208
- url: 'options-general.php?page=w3-total-cache/w3-total-cache.php&w3tc_action=tweet',
209
  callback: function(lightbox) {
210
  jQuery('form', lightbox.container).submit(function() {
211
  var me = this, username = jQuery('#tweet_username').val(), password = jQuery('#tweet_password').val();
@@ -222,7 +216,7 @@ function w3tc_lightbox_tweet() {
222
 
223
  jQuery('input', this).attr('disabled', 'disabled');
224
 
225
- jQuery.post('options-general.php?page=w3-total-cache/w3-total-cache.php', {
226
  w3tc_action: 'twitter_status_update',
227
  username: username,
228
  password: password
@@ -243,9 +237,169 @@ function w3tc_lightbox_tweet() {
243
  });
244
  }
245
 
246
- jQuery(function($) {
247
- $('.button-tweet').click(function() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
248
  w3tc_lightbox_tweet();
249
  return false;
250
  });
 
 
 
 
 
 
 
 
 
 
251
  });
1
+ var W3tc_Lightbox = {
2
  window: jQuery(window),
3
  container: null,
4
  options: null,
43
  callback: null
44
  }, options);
45
 
46
+ this.create();
 
 
47
 
48
  this.container.css( {
49
  width: this.options.width,
56
  this.load(this.options.url, this.options.callback);
57
  }
58
 
59
+ W3tc_Overlay.show(this);
60
 
61
  this.resize();
62
  this.container.show();
 
63
  },
64
 
65
  close: function() {
66
+ this.container.remove();
67
+ W3tc_Overlay.hide();
 
68
  },
69
 
70
  resize: function() {
72
  top: this.window.scrollTop() + this.options.offsetTop,
73
  left: this.window.scrollLeft() + this.window.width() / 2 - this.container.width() / 2
74
  });
75
+
76
+ jQuery('.lightbox-content', this.container).css( {
77
+ width: this.width(),
78
+ height: this.height()
79
+ });
80
  },
81
 
82
  load: function(url, callback) {
100
  if (width === undefined) {
101
  return this.container.width();
102
  } else {
103
+ this.container.css('width', width);
104
+ return this.resize();
 
 
105
  }
106
  },
107
 
109
  if (height === undefined) {
110
  return this.container.height();
111
  } else {
112
+ this.container.css('height', height);
113
+ return this.resize();
 
 
114
  }
115
  },
116
 
119
  }
120
  };
121
 
122
+ var W3tc_Overlay = {
123
  window: jQuery(window),
124
  container: null,
125
 
149
  },
150
 
151
  show: function() {
152
+ this.create();
 
 
 
153
  this.resize();
154
  this.container.show();
155
  },
156
 
157
  hide: function() {
158
+ this.container.remove();
159
  },
160
 
161
  resize: function() {
169
  };
170
 
171
  function w3tc_lightbox_support_us() {
172
+ W3tc_Lightbox.open( {
173
  width: 590,
174
  height: 200,
175
+ url: 'admin.php?page=w3tc_general&w3tc_action=support_us',
176
  callback: function(lightbox) {
177
  jQuery('.button-tweet', lightbox.container).click(function(event) {
178
  lightbox.close();
196
  }
197
 
198
  function w3tc_lightbox_tweet() {
199
+ W3tc_Lightbox.open( {
200
  width: 550,
201
  height: 340,
202
+ url: 'admin.php?page=w3tc_general&w3tc_action=tweet',
203
  callback: function(lightbox) {
204
  jQuery('form', lightbox.container).submit(function() {
205
  var me = this, username = jQuery('#tweet_username').val(), password = jQuery('#tweet_password').val();
216
 
217
  jQuery('input', this).attr('disabled', 'disabled');
218
 
219
+ jQuery.post('admin.php?page=w3tc_general', {
220
  w3tc_action: 'twitter_status_update',
221
  username: username,
222
  password: password
237
  });
238
  }
239
 
240
+ var w3tc_minify_recommendations_checked = {};
241
+
242
+ function w3tc_lightbox_minify_recommendations() {
243
+ var min_height = 200;
244
+ var max_height = 1200;
245
+
246
+ var height = jQuery(window).height() - 220;
247
+
248
+ if (height < min_height) {
249
+ height = min_height;
250
+ } else if (height > max_height) {
251
+ height = max_height;
252
+ }
253
+
254
+ W3tc_Lightbox.open( {
255
+ width: 1000,
256
+ height: height,
257
+ url: 'admin.php?page=w3tc_minify&w3tc_action=minify_recommendations',
258
+ callback: function(lightbox) {
259
+ jQuery('#recom_container').css('height', height - 50);
260
+
261
+ var theme = jQuery('#recom_theme').val();
262
+
263
+ if (jQuery.ui && jQuery.ui.sortable) {
264
+ jQuery("#recom_js_files,#recom_css_files").sortable( {
265
+ axis: 'y',
266
+ stop: function() {
267
+ jQuery(this).find('li').each(function(index) {
268
+ jQuery(this).find('td:eq(1)').html((index + 1) + '.');
269
+ });
270
+ }
271
+ });
272
+ }
273
+
274
+ if (w3tc_minify_recommendations_checked[theme] !== undefined) {
275
+ jQuery('#recom_js_files :text,#recom_css_files :text').each(function() {
276
+ var hash = jQuery(this).parents('li').find('[name=recom_js_template]').val() + ':' + jQuery(this).val();
277
+
278
+ if (w3tc_minify_recommendations_checked[theme][hash] !== undefined) {
279
+ var checkbox = jQuery(this).parents('li').find(':checkbox');
280
+
281
+ if (w3tc_minify_recommendations_checked[theme][hash]) {
282
+ checkbox.attr('checked', 'checked');
283
+ } else {
284
+ checkbox.removeAttr('checked');
285
+ }
286
+ }
287
+ });
288
+ }
289
+
290
+ jQuery('#recom_theme').change(function() {
291
+ jQuery('#recom_js_files :checkbox,#recom_css_files :checkbox').each(function() {
292
+ var li = jQuery(this).parents('li');
293
+ var hash = li.find('[name=recom_js_template]').val() + ':' + li.find(':text').val();
294
+
295
+ if (w3tc_minify_recommendations_checked[theme] === undefined) {
296
+ w3tc_minify_recommendations_checked[theme] = {};
297
+ }
298
+
299
+ w3tc_minify_recommendations_checked[theme][hash] = jQuery(this).is(':checked');
300
+ });
301
+
302
+ lightbox.load('admin.php?page=w3tc_minify&w3tc_action=minify_recommendations&theme_key=' + jQuery(this).val(), lightbox.options.callback);
303
+ });
304
+
305
+ jQuery('#recom_js_check').click(function() {
306
+ if (jQuery('#recom_js_files :checkbox:checked').size()) {
307
+ jQuery('#recom_js_files :checkbox').removeAttr('checked');
308
+ } else {
309
+ jQuery('#recom_js_files :checkbox').attr('checked', 'checked');
310
+ }
311
+
312
+ return false;
313
+ });
314
+
315
+ jQuery('#recom_css_check').click(function() {
316
+ if (jQuery('#recom_css_files :checkbox:checked').size()) {
317
+ jQuery('#recom_css_files :checkbox').removeAttr('checked');
318
+ } else {
319
+ jQuery('#recom_css_files :checkbox').attr('checked', 'checked');
320
+ }
321
+
322
+ return false;
323
+ });
324
+
325
+ jQuery('.recom_apply', lightbox.container).click(function() {
326
+ var theme = jQuery('#recom_theme').val();
327
+
328
+ jQuery('#js_files li').each(function() {
329
+ if (jQuery(this).find(':text').attr('name').indexOf('js_files[' + theme + ']') != -1) {
330
+ jQuery(this).remove();
331
+ }
332
+ });
333
+
334
+ jQuery('#css_files li').each(function() {
335
+ if (jQuery(this).find(':text').attr('name').indexOf('css_files[' + theme + ']') != -1) {
336
+ jQuery(this).remove();
337
+ }
338
+ });
339
+
340
+ jQuery('#recom_js_files li').each(function() {
341
+ if (jQuery(this).find(':checkbox:checked').size()) {
342
+ w3tc_minify_js_file_add(theme, jQuery(this).find('[name=recom_js_template]').val(), jQuery(this).find('[name=recom_js_location]').val(), jQuery(this).find('[name=recom_js_file]').val());
343
+ }
344
+ });
345
+
346
+ jQuery('#recom_css_files li').each(function() {
347
+ if (jQuery(this).find(':checkbox:checked').size()) {
348
+ w3tc_minify_css_file_add(theme, jQuery(this).find('[name=recom_css_template]').val(), jQuery(this).find('[name=recom_css_file]').val());
349
+ }
350
+ });
351
+
352
+ w3tc_minify_js_theme(theme);
353
+ w3tc_minify_css_theme(theme);
354
+
355
+ w3tc_input_enable('.js_enabled', jQuery('#js_enabled:checked').size());
356
+ w3tc_input_enable('.css_enabled', jQuery('#css_enabled:checked').size());
357
+
358
+ lightbox.close();
359
+ });
360
+ }
361
+ });
362
+ }
363
+
364
+ function w3tc_lightbox_self_test() {
365
+ var min_height = 200;
366
+ var max_height = 800;
367
+
368
+ var height = jQuery(window).height() - 220;
369
+
370
+ if (height < min_height) {
371
+ height = min_height;
372
+ } else if (height > max_height) {
373
+ height = max_height;
374
+ }
375
+
376
+ W3tc_Lightbox.open( {
377
+ width: 800,
378
+ height: height,
379
+ url: 'admin.php?page=w3tc_general&w3tc_action=self_test',
380
+ callback: function(lightbox) {
381
+ jQuery('#self_test_container').css('height', height - 50);
382
+
383
+ jQuery('.button-primary', lightbox.container).click(function() {
384
+ lightbox.close();
385
+ });
386
+ }
387
+ });
388
+ }
389
+
390
+ jQuery(function() {
391
+ jQuery('.button-tweet').click(function() {
392
  w3tc_lightbox_tweet();
393
  return false;
394
  });
395
+
396
+ jQuery('.button-minify-recommendations').click(function() {
397
+ w3tc_lightbox_minify_recommendations();
398
+ return false;
399
+ });
400
+
401
+ jQuery('.button-self-test').click(function() {
402
+ w3tc_lightbox_self_test();
403
+ return false;
404
+ });
405
  });
inc/js/options.js CHANGED
@@ -9,14 +9,20 @@ function w3tc_popup(url, name, width, height) {
9
  return window.open(url, name, 'width=' + width + ',height=' + height + ',status=no,toolbar=no,menubar=no,scrollbars=yes');
10
  }
11
 
12
- function input_enable(input, enabled) {
13
  jQuery(input).each(function() {
14
- this.disabled = !enabled;
15
  if (enabled) {
16
- jQuery(this).next('[type=hidden]').remove();
17
  } else {
18
- var me = jQuery(this), t = me.attr('type');
19
- if ((t != 'radio' && t != 'checkbox') || this.checked) {
 
 
 
 
 
 
20
  me.after(jQuery('<input />').attr( {
21
  type: 'hidden',
22
  name: me.attr('name')
@@ -26,486 +32,819 @@ function input_enable(input, enabled) {
26
  });
27
  }
28
 
29
- function js_file_location_change() {
30
- jQuery('.js_file_location').change(function() {
31
- jQuery(this).parent().find(':text').attr('name', 'js_files[' + jQuery('#js_groups').val() + '][' + jQuery(this).val() + '][]');
32
- });
 
 
33
  }
34
 
35
- function file_verify() {
36
- jQuery('.js_file_verify,.css_file_verify').click(function() {
37
- var file = jQuery(this).parent().find(':text').val();
38
- if (file == '') {
39
- alert('Empty file');
40
- } else {
41
- var url = '';
42
- if (/^https?:\/\//.test(file)) {
43
- url = file;
44
- } else {
45
- url = '/' + file;
46
- }
47
- w3tc_popup(url, 'file_verify');
48
- }
49
- });
50
  }
51
 
52
- function file_validate() {
53
- var js = [], css = [], invalid_js = [], invalid_css = [], duplicate = false, query_js = [], query_css = [];
54
-
55
- jQuery('#js_files :text').each(function() {
56
- var v = jQuery(this).val(), n = jQuery(this).attr('name'), c = v + n;
57
- if (v != '') {
58
- for ( var i = 0; i < js.length; i++) {
59
- if (js[i] == c) {
60
- duplicate = true;
61
- break;
62
- }
63
- }
64
 
65
- js.push(c);
 
 
 
 
 
 
 
 
 
 
 
66
 
67
- var qindex = v.indexOf('?');
68
- if (qindex != -1) {
69
- if (!/^https?:\/\//.test(v)) {
70
- query_js.push(v);
71
- }
72
- v = v.substr(0, qindex);
73
- }
 
 
 
 
74
 
75
- if (!/\.js$/.test(v)) {
76
- invalid_js.push(v);
77
- }
 
 
 
 
 
78
  }
79
  });
 
 
80
 
 
 
81
  jQuery('#css_files :text').each(function() {
82
- var v = jQuery(this).val(), n = jQuery(this).attr('name'), c = v + n;
83
- if (v != '') {
84
- for ( var i = 0; i < css.length; i++) {
85
- if (css[i] == c) {
86
- duplicate = true;
87
- break;
88
- }
89
- }
90
-
91
- css.push(c);
92
-
93
- var qindex = v.indexOf('?');
94
- if (qindex != -1) {
95
- if (!/^https?:\/\//.test(v)) {
96
- query_css.push(v);
97
- }
98
- v = v.substr(0, qindex);
99
- }
100
-
101
- if (!/\.css$/.test(v)) {
102
- invalid_css.push(v);
103
- }
104
  }
105
  });
 
 
106
 
107
- if (jQuery('#js_enabled:checked').size()) {
108
- if (invalid_js.length && !confirm('The following files have invalid JS file extension:\r\n\r\n' + invalid_js.join('\r\n') + '\r\n\r\nAre you confident these files contain valid JS code?')) {
109
- return false;
110
- }
111
 
112
- if (query_js.length) {
113
- alert('We recommend using the entire URI for files with query string (GET) variables. You entered:\r\n\r\n' + query_js.join('\r\n'));
114
- return false;
115
- }
116
- }
117
 
118
- if (jQuery('#css_enabled:checked').size()) {
119
- if (invalid_css.length && !confirm('The following files have invalid CSS file extension:\r\n\r\n' + invalid_css.join('\r\n') + '\r\n\r\nAre you confident these files contain valid CSS code?')) {
120
- return false;
121
- }
122
 
123
- if (query_css.length) {
124
- alert('We recommend using the entire URI for files with query string (GET) variables. You entered:\r\n\r\n' + query_css.join('\r\n'));
125
- return false;
126
- }
127
- }
 
 
128
 
129
- if (duplicate) {
130
- alert('Duplicate files have been found in your minify settings, please check your settings and re-save.');
131
- return false;
132
- }
133
 
134
- return true;
135
  }
136
 
137
- function js_file_clear() {
138
- if (!jQuery('#js_files :visible').length) {
139
- jQuery('#js_files_empty').show();
140
- } else {
141
- jQuery('#js_files_empty').hide();
142
- }
143
- }
144
 
145
- function css_file_clear() {
146
- if (!jQuery('#css_files :visible').length) {
147
- jQuery('#css_files_empty').show();
148
  } else {
149
- jQuery('#css_files_empty').hide();
150
  }
151
- }
152
 
153
- function js_enabled() {
154
- jQuery('#js_enabled').click(function() {
155
- input_enable('.js_enabled', this.checked);
156
- });
157
- }
158
 
159
- function css_enabled() {
160
- jQuery('#css_enabled').click(function() {
161
- input_enable('.css_enabled', this.checked);
162
- });
163
- }
164
 
165
- function js_file_delete() {
166
- jQuery('.js_file_delete').click(function() {
167
- if (confirm('Are you sure you want to delete JS file?')) {
168
- jQuery(this).parent().remove();
169
- if (!jQuery('#js_files li').size()) {
170
- js_file_clear();
171
- }
172
- }
173
 
174
- return false;
175
- });
176
- };
177
 
178
- function css_file_delete() {
179
- jQuery('.css_file_delete').click(function() {
180
- if (confirm('Are you sure you want to delete CSS file?')) {
181
- jQuery(this).parent().remove();
182
- if (!jQuery('#css_files li').size()) {
183
- css_file_clear();
184
  }
185
  }
186
 
187
- return false;
188
  });
189
  }
190
 
191
- function js_file_add(group, location, file) {
192
- jQuery('#js_files').append('<li><input class="js_enabled" type="text" name="js_files[' + group + '][' + location + '][]" value="' + file + '" size="100" \/>&nbsp;<select class="js_file_location js_enabled"><option value="include"' + (location == 'include' ? ' selected="selected"' : '') + '>Embed in: Header</option><option value="include-nb"' + (location == 'include-nb' ? ' selected="selected"' : '') + '>Embed in: Header (non-blocking)</option><option value="include-footer"' + (location == 'include-footer' ? ' selected="selected"' : '') + '>Embed in: Footer</option><option value="include-footer-nb"' + (location == 'include-footer-nb' ? ' selected="selected"' : '') + '>Embed in: Footer (non-blocking)</option></select>&nbsp;<input class="js_file_delete js_enabled button" type="button" value="Delete" />&nbsp;<input class="js_file_verify js_enabled button" type="button" value="Verify URI" /><\/li>');
193
- js_file_clear();
194
- js_file_delete();
195
- file_verify();
196
- js_enabled();
197
- js_file_location_change();
198
- }
199
-
200
- function css_file_add(group, file) {
201
- jQuery('#css_files').append('<li><input class="css_enabled" type="text" name="css_files[' + group + '][include][]" value="' + file + '" size="100" \/>&nbsp;<input class="css_file_delete css_enabled button" type="button" value="Delete" />&nbsp;<input class="css_file_verify css_enabled button" type="button" value="Verify URI" /><\/li>');
202
- css_file_clear();
203
- css_file_delete();
204
- file_verify();
205
- css_enabled();
206
- }
207
-
208
- function js_group(group) {
209
- jQuery('#js_groups').val(group);
210
- jQuery('#js_files :text').each(function() {
211
- var input = jQuery(this);
212
- if (input.attr('name').indexOf('js_files[' + group) != 0) {
213
- input.parent().hide();
214
- } else {
215
- input.parent().show();
216
- }
217
- });
218
- js_file_clear();
219
- }
220
 
221
- function css_group(group) {
222
- jQuery('#css_groups').val(group);
223
- jQuery('#css_files :text').each(function() {
224
- var input = jQuery(this);
225
- if (input.attr('name').indexOf('css_files[' + group) != 0) {
226
- input.parent().hide();
227
- } else {
228
- input.parent().show();
229
- }
230
- });
231
- css_file_clear();
232
- }
233
-
234
- jQuery(function($) {
235
- // general page
236
- $('.enabled').click(function() {
237
- var checked = false;
238
- $('.enabled').each(function() {
239
- if (this.checked) {
240
- checked = true;
241
  }
242
  });
243
- $('#enabled').each(function() {
244
- this.checked = checked;
 
 
 
 
245
  });
246
  });
247
 
248
- $('#enabled').click(function() {
249
- var checked = this.checked;
250
- $('.enabled').each(function() {
251
- this.checked = checked;
 
 
 
 
252
  });
253
  });
 
 
 
 
 
254
 
255
  jQuery('.button-rating').click(function() {
256
  window.open('http://wordpress.org/extend/plugins/w3-total-cache/', '_blank');
257
  });
258
 
259
- // minify page
260
- input_enable('.html_enabled', $('#html_enabled:checked').size());
261
- input_enable('.js_enabled', $('#js_enabled:checked').size());
262
- input_enable('.css_enabled', $('#css_enabled:checked').size());
 
 
263
 
264
- $('#html_enabled').click(function() {
265
- input_enable('.html_enabled', this.checked);
266
- });
 
267
 
268
- file_verify();
269
- js_file_location_change();
270
 
271
- js_enabled();
272
- css_enabled();
 
273
 
274
- js_file_delete();
275
- css_file_delete();
 
276
 
277
- js_group($('#js_groups').val());
278
- css_group($('#css_groups').val());
 
279
 
280
- $('#js_file_add').click(function() {
281
- js_file_add($('#js_groups').val(), 'include', '');
 
 
 
 
 
 
 
 
 
 
 
282
  });
283
 
284
- $('#css_file_add').click(function() {
285
- css_file_add($('#css_groups').val(), '');
286
  });
287
 
288
- $('#js_groups').change(function() {
289
- js_group($(this).val());
290
  });
291
 
292
- $('#css_groups').change(function() {
293
- css_group($(this).val());
294
  });
295
 
296
- $('#minify_form').submit(file_validate);
 
 
 
 
 
297
 
298
- // CDN
299
- $('.w3tc-tab').click(function() {
300
- $('.w3tc-tab-content').hide();
301
- $(this.rel).show();
302
  });
303
 
304
- $('#cdn_export_library').click(function() {
305
- w3tc_popup('options-general.php?page=w3-total-cache/w3-total-cache.php&w3tc_action=cdn_export_library', 'cdn_export_library');
306
- });
 
 
 
307
 
308
- $('#cdn_import_library').click(function() {
309
- w3tc_popup('options-general.php?page=w3-total-cache/w3-total-cache.php&w3tc_action=cdn_import_library', 'cdn_import_library');
310
  });
311
 
312
- $('#cdn_queue').click(function() {
313
- w3tc_popup('options-general.php?page=w3-total-cache/w3-total-cache.php&w3tc_action=cdn_queue', 'cdn_queue');
314
  });
315
 
316
- $('#cdn_rename_domain').click(function() {
317
- w3tc_popup('options-general.php?page=w3-total-cache/w3-total-cache.php&w3tc_action=cdn_rename_domain', 'cdn_rename_domain');
318
  });
319
 
320
- $('.cdn_export').click(function() {
321
- w3tc_popup('options-general.php?page=w3-total-cache/w3-total-cache.php&w3tc_action=cdn_export&cdn_export_type=' + this.name, 'cdn_export_' + this.name);
322
  });
323
 
324
- $('#test_ftp').click(function() {
325
- var status = $('#test_ftp_status');
326
- status.removeClass('w3tc-error');
327
- status.removeClass('w3tc-success');
328
- status.addClass('w3tc-process');
329
- status.html('Testing...');
330
- $.post('options-general.php?page=w3-total-cache/w3-total-cache.php', {
331
- w3tc_action: 'cdn_test_ftp',
332
- host: $('#cdn_ftp_host').val(),
333
- user: $('#cdn_ftp_user').val(),
334
- path: $('#cdn_ftp_path').val(),
335
- pass: $('#cdn_ftp_pass').val()
336
- }, function(data) {
337
- status.addClass(data.result ? 'w3tc-success' : 'w3tc-error');
338
- status.html(data.error);
339
- }, 'json');
340
  });
341
 
342
- $('#test_s3').click(function() {
343
- var status = $('#test_s3_status');
344
- status.removeClass('w3tc-error');
345
- status.removeClass('w3tc-success');
346
- status.addClass('w3tc-process');
347
- status.html('Testing...');
348
- $.post('options-general.php?page=w3-total-cache/w3-total-cache.php', {
349
- w3tc_action: 'cdn_test_s3',
350
- key: $('#cdn_s3_key').val(),
351
- secret: $('#cdn_s3_secret').val(),
352
- bucket: $('#cdn_s3_bucket').val()
353
- }, function(data) {
354
- status.addClass(data.result ? 'w3tc-success' : 'w3tc-error');
355
- status.html(data.error);
356
- }, 'json');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
357
  });
358
 
359
- $('#test_cf').click(function() {
360
- var status = $('#test_cf_status');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
361
  status.removeClass('w3tc-error');
362
  status.removeClass('w3tc-success');
363
  status.addClass('w3tc-process');
364
  status.html('Testing...');
365
- $.post('options-general.php?page=w3-total-cache/w3-total-cache.php', {
366
- w3tc_action: 'cdn_test_cf',
367
- key: $('#cdn_cf_key').val(),
368
- secret: $('#cdn_cf_secret').val(),
369
- bucket: $('#cdn_cf_bucket').val(),
370
- id: $('#cdn_cf_id').val(),
371
- cname: $('#cdn_cf_cname').val()
372
- }, function(data) {
373
- status.addClass(data.result ? 'w3tc-success' : 'w3tc-error');
374
- status.html(data.error);
375
- }, 'json');
376
- });
377
 
378
- $('#create_bucket_s3').click(function() {
379
- var status = $('#create_bucket_s3_status');
380
- status.removeClass('w3tc-error');
381
- status.removeClass('w3tc-success');
382
- status.addClass('w3tc-process');
383
- status.html('Creating bucket...');
384
- $.post('options-general.php?page=w3-total-cache/w3-total-cache.php', {
385
- w3tc_action: 'cdn_create_bucket',
386
- type: 's3',
387
- key: $('#cdn_s3_key').val(),
388
- secret: $('#cdn_s3_secret').val(),
389
- bucket: $('#cdn_s3_bucket').val()
390
- }, function(data) {
391
  status.addClass(data.result ? 'w3tc-success' : 'w3tc-error');
392
  status.html(data.error);
393
  }, 'json');
394
  });
395
 
396
- $('#create_bucket_cf').click(function() {
397
- var status = $('#create_bucket_cf_status');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
398
  status.removeClass('w3tc-error');
399
  status.removeClass('w3tc-success');
400
  status.addClass('w3tc-process');
401
- status.html('Creating bucket...');
402
- $.post('options-general.php?page=w3-total-cache/w3-total-cache.php', {
403
- w3tc_action: 'cdn_create_bucket',
404
- type: 'cf',
405
- key: $('#cdn_cf_key').val(),
406
- secret: $('#cdn_cf_secret').val(),
407
- bucket: $('#cdn_cf_bucket').val()
408
- }, function(data) {
409
  status.addClass(data.result ? 'w3tc-success' : 'w3tc-error');
410
  status.html(data.error);
 
 
 
 
411
  }, 'json');
412
  });
413
 
414
- $('#test_memcached').click(function() {
415
- var status = $('#test_memcached_status');
416
  status.removeClass('w3tc-error');
417
  status.removeClass('w3tc-success');
418
  status.addClass('w3tc-process');
419
  status.html('Testing...');
420
- $.post('options-general.php?page=w3-total-cache/w3-total-cache.php', {
421
  w3tc_action: 'test_memcached',
422
- servers: $('#memcached_servers').val()
423
  }, function(data) {
424
  status.addClass(data.result ? 'w3tc-success' : 'w3tc-error');
425
  status.html(data.error);
426
  }, 'json');
427
  });
428
 
429
- $('#support_more_files').click(function() {
430
- $(this).before('<input type="file" name="files[]" /><br />');
 
 
431
  });
432
 
433
- $('#support_form').submit(function() {
434
- var url = $('#support_url');
435
- var name = $('#support_name');
436
- var email = $('#support_email');
437
- var request_type = $('#support_request_type');
438
- var description = $('#support_description');
439
- var wp_login = $('#support_wp_login');
440
- var wp_password = $('#support_wp_password');
441
- var ftp_host = $('#support_ftp_host');
442
- var ftp_login = $('#support_ftp_login');
443
- var ftp_password = $('#support_ftp_password');
 
 
 
444
 
445
- if (url.val() == '') {
446
- alert('Please enter the address of your blog in the Blog URL field.');
 
 
 
 
 
 
 
 
 
 
 
 
 
447
  url.focus();
448
  return false;
449
  }
450
 
451
- if (name.val() == '') {
452
  alert('Please enter your name in the Name field.');
453
  name.focus();
454
  return false;
455
  }
456
 
457
- if (!/^[a-z0-9_\-\.]+@[a-z0-9-\.]+\.[a-z]{2,5}$/.test(email.val().toLowerCase())) {
458
  alert('Please enter valid email address in the E-Mail field.');
459
  email.focus();
460
  return false;
461
  }
462
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
463
  if (request_type.val() == '') {
464
  alert('Please select request type.');
465
  request_type.focus();
 
466
  return false;
467
  }
468
 
469
- if (description.val() == '') {
470
- alert('Please describe the issue in the issue description field.');
471
- description.focus();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
472
  return false;
473
  }
474
 
475
- if (wp_login.val() != '' || wp_password.val() != '') {
476
- if (wp_login.val() == '') {
477
- alert('Please enter an administrator login. Remember you can create a temporary one just for this support case.');
478
- wp_login.focus();
479
- return false;
480
- }
481
 
482
- if (wp_password.val() == '') {
483
- alert('Please enter WP Admin password, be sure it\'s spelled correctly.');
484
- wp_password.focus();
485
- return false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
486
  }
 
 
 
 
487
  }
 
488
 
489
- if (ftp_host.val() != '' || ftp_login.val() != '' || ftp_password.val() != '') {
490
- if (ftp_host.val() == '') {
491
- alert('Please enter SSH or FTP host for your site.');
492
- ftp_host.focus();
493
- return false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
494
  }
 
 
495
 
496
- if (ftp_login.val() == '') {
497
- alert('Please enter SSH or FTP login for your server. Remember you can create a temporary one just for this support case.');
498
- ftp_login.focus();
499
- return false;
 
 
 
 
 
 
 
 
 
 
 
 
 
500
  }
 
501
 
502
- if (ftp_password.val() == '') {
503
- alert('Please enter SSH or FTP password for your FTP account.');
504
- ftp_password.focus();
505
- return false;
 
 
 
 
 
 
 
506
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
507
  }
 
508
 
509
- return true;
 
 
510
  });
511
  });
9
  return window.open(url, name, 'width=' + width + ',height=' + height + ',status=no,toolbar=no,menubar=no,scrollbars=yes');
10
  }
11
 
12
+ function w3tc_input_enable(input, enabled) {
13
  jQuery(input).each(function() {
14
+ var me = jQuery(this);
15
  if (enabled) {
16
+ me.removeAttr('disabled');
17
  } else {
18
+ me.attr('disabled', 'disabled');
19
+ }
20
+
21
+ if (enabled) {
22
+ me.next('[type=hidden]').remove();
23
+ } else {
24
+ var t = me.attr('type');
25
+ if ((t != 'radio' && t != 'checkbox') || me.is(':checked')) {
26
  me.after(jQuery('<input />').attr( {
27
  type: 'hidden',
28
  name: me.attr('name')
32
  });
33
  }
34
 
35
+ function w3tc_minify_js_file_clear() {
36
+ if (!jQuery('#js_files :visible').size()) {
37
+ jQuery('#js_files_empty').show();
38
+ } else {
39
+ jQuery('#js_files_empty').hide();
40
+ }
41
  }
42
 
43
+ function w3tc_minify_css_file_clear() {
44
+ if (!jQuery('#css_files :visible').size()) {
45
+ jQuery('#css_files_empty').show();
46
+ } else {
47
+ jQuery('#css_files_empty').hide();
48
+ }
 
 
 
 
 
 
 
 
 
49
  }
50
 
51
+ function w3tc_mobile_groups_clear() {
52
+ if (!jQuery('#mobile_groups li').size()) {
53
+ jQuery('#mobile_groups_empty').show();
54
+ } else {
55
+ jQuery('#mobile_groups_empty').hide();
56
+ }
57
+ }
 
 
 
 
 
58
 
59
+ function w3tc_minify_js_file_add(theme, template, location, file) {
60
+ var append = jQuery('<li><table><tr><th>&nbsp;</th><th>File URI:</th><th>Template:</th><th colspan="3">Embed Location:</th></tr><tr><td>' + (jQuery('#js_files li').size() + 1) + '.</td><td><input class="js_enabled" type="text" name="js_files[' + theme + '][' + template + '][' + location + '][]" value="" size="70" \/></td><td><select class="js_file_template js_enabled"></select></td><td><select class="js_file_location js_enabled"><optgroup label="Blocking:"><option value="include">Embed in &lt;head&gt;</option><option value="include-body">Embed after &lt;body&gt;</option><option value="include-footer">Embed before &lt;/body&gt;</option></optgroup><optgroup label="Non-Blocking:"><option value="include-nb">Embed in &lt;head&gt;</option><option value="include-body-nb">Embed after &lt;body&gt;</option><option value="include-footer-nb">Embed before &lt;/body&gt;</option></optgroup></select></td><td><input class="js_file_delete js_enabled button" type="button" value="Delete" /> <input class="js_file_verify js_enabled button" type="button" value="Verify URI" /></td></tr></table><\/li>');
61
+ append.find('input:text').val(file);
62
+ var select = append.find('.js_file_template');
63
+ for ( var i in minify_templates[theme]) {
64
+ select.append(jQuery('<option />').val(i).html(minify_templates[theme][i]));
65
+ }
66
+ select.val(template);
67
+ jQuery(append).find('.js_file_location').val(location);
68
+ jQuery('#js_files').append(append);
69
+ w3tc_minify_js_file_clear();
70
+ }
71
 
72
+ function w3tc_minify_css_file_add(theme, template, file) {
73
+ var append = jQuery('<li><table><tr><th>&nbsp;</th><th>File URI:</th><th colspan="2">Template:</th></tr><tr><td>' + (jQuery('#css_files li').size() + 1) + '.</td><td><input class="css_enabled" type="text" name="css_files[' + theme + '][' + template + '][include][]" value="" size="70" \/></td><td><select class="css_file_template css_enabled"></select></td><td><input class="css_file_delete css_enabled button" type="button" value="Delete" /></td><td><input class="css_file_verify css_enabled button" type="button" value="Verify URI" /></td></tr></table><\/li>');
74
+ append.find('input:text').val(file);
75
+ var select = append.find('.css_file_template');
76
+ for ( var i in minify_templates[theme]) {
77
+ select.append(jQuery('<option />').val(i).html(minify_templates[theme][i]));
78
+ }
79
+ select.val(template);
80
+ jQuery('#css_files').append(append);
81
+ w3tc_minify_css_file_clear();
82
+ }
83
 
84
+ function w3tc_minify_js_theme(theme) {
85
+ jQuery('#js_themes').val(theme);
86
+ jQuery('#js_files :text').each(function() {
87
+ var input = jQuery(this);
88
+ if (input.attr('name').indexOf('js_files[' + theme + ']') != 0) {
89
+ input.parents('li').hide();
90
+ } else {
91
+ input.parents('li').show();
92
  }
93
  });
94
+ w3tc_minify_js_file_clear();
95
+ }
96
 
97
+ function w3tc_minify_css_theme(theme) {
98
+ jQuery('#css_themes').val(theme);
99
  jQuery('#css_files :text').each(function() {
100
+ var input = jQuery(this);
101
+ if (input.attr('name').indexOf('css_files[' + theme + ']') != 0) {
102
+ input.parents('li').hide();
103
+ } else {
104
+ input.parents('li').show();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
  }
106
  });
107
+ w3tc_minify_css_file_clear();
108
+ }
109
 
110
+ function w3tc_cdn_get_cnames() {
111
+ var cnames = [];
 
 
112
 
113
+ jQuery('#cdn_cnames input[type=text]').each(function() {
114
+ var cname = jQuery(this).val();
 
 
 
115
 
116
+ if (cname) {
117
+ var match = /^\*\.(.*)$/.exec(cname);
 
 
118
 
119
+ if (match) {
120
+ cnames = [];
121
+ for ( var i = 1; i <= 10; i++) {
122
+ cnames.push('cdn' + i + '.' + match[1]);
123
+ }
124
+ return false;
125
+ }
126
 
127
+ cnames.push(cname);
128
+ }
129
+ });
 
130
 
131
+ return cnames;
132
  }
133
 
134
+ function w3tc_cdn_cnames_assign() {
135
+ var li = jQuery('#cdn_cnames li'), size = li.size();
 
 
 
 
 
136
 
137
+ if (size > 1) {
138
+ li.eq(0).find('.cdn_cname_delete').show();
 
139
  } else {
140
+ li.eq(0).find('.cdn_cname_delete').hide();
141
  }
 
142
 
143
+ jQuery(li).each(function(index) {
144
+ var label = '';
 
 
 
145
 
146
+ if (size > 1) {
147
+ switch (index) {
148
+ case 0:
149
+ label = '(reserved for CSS)';
150
+ break;
151
 
152
+ case 1:
153
+ label = '(reserved for JS in <head>)';
154
+ break;
 
 
 
 
 
155
 
156
+ case 2:
157
+ label = '(reserved for JS after <body>)';
158
+ break;
159
 
160
+ case 3:
161
+ label = '(reserved for JS before </body>)';
162
+ break;
 
 
 
163
  }
164
  }
165
 
166
+ jQuery(this).find('span').text(label);
167
  });
168
  }
169
 
170
+ function w3tc_toggle(name) {
171
+ var id = '#' + name, cls = '.' + name;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
172
 
173
+ jQuery(cls).click(function() {
174
+ var checked = true;
175
+ jQuery(cls).each(function() {
176
+ if (!jQuery(this).is(':checked')) {
177
+ checked = false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
  }
179
  });
180
+ jQuery(id).each(function() {
181
+ if (checked) {
182
+ jQuery(this).attr('checked', 'checked');
183
+ } else {
184
+ jQuery(this).removeAttr('checked');
185
+ }
186
  });
187
  });
188
 
189
+ jQuery(id).click(function() {
190
+ var checked = jQuery(this).is(':checked');
191
+ jQuery(cls).each(function() {
192
+ if (checked) {
193
+ jQuery(this).attr('checked', 'checked');
194
+ } else {
195
+ jQuery(this).removeAttr('checked');
196
+ }
197
  });
198
  });
199
+ }
200
+
201
+ jQuery(function() {
202
+ // general page
203
+ w3tc_toggle('enabled');
204
 
205
  jQuery('.button-rating').click(function() {
206
  window.open('http://wordpress.org/extend/plugins/w3-total-cache/', '_blank');
207
  });
208
 
209
+ // browsercache page
210
+ w3tc_toggle('browsercache_expires');
211
+ w3tc_toggle('browsercache_cache_control');
212
+ w3tc_toggle('browsercache_etag');
213
+ w3tc_toggle('browsercache_w3tc');
214
+ w3tc_toggle('browsercache_compression');
215
 
216
+ // minify page
217
+ w3tc_input_enable('.html_enabled', jQuery('#html_enabled:checked').size());
218
+ w3tc_input_enable('.js_enabled', jQuery('#js_enabled:checked').size());
219
+ w3tc_input_enable('.css_enabled', jQuery('#css_enabled:checked').size());
220
 
221
+ w3tc_minify_js_theme(jQuery('#js_themes').val());
222
+ w3tc_minify_css_theme(jQuery('#css_themes').val());
223
 
224
+ jQuery('#html_enabled').click(function() {
225
+ w3tc_input_enable('.html_enabled', this.checked);
226
+ });
227
 
228
+ jQuery('#js_enabled').click(function() {
229
+ w3tc_input_enable('.js_enabled', jQuery(this).is(':checked'));
230
+ });
231
 
232
+ jQuery('#css_enabled').click(function() {
233
+ w3tc_input_enable('.css_enabled', jQuery(this).is(':checked'));
234
+ });
235
 
236
+ jQuery('.js_file_verify,.css_file_verify').live('click', function() {
237
+ var file = jQuery(this).parents('li').find(':text').val();
238
+ if (file == '') {
239
+ alert('Empty URI');
240
+ } else {
241
+ var url = '';
242
+ if (/^https?:\/\//.test(file)) {
243
+ url = file;
244
+ } else {
245
+ url = '/' + file;
246
+ }
247
+ w3tc_popup(url, 'file_verify');
248
+ }
249
  });
250
 
251
+ jQuery('.js_file_template').live('change', function() {
252
+ jQuery(this).parents('li').find(':text').attr('name', 'js_files[' + jQuery('#js_themes').val() + '][' + jQuery(this).val() + '][' + jQuery(this).parents('li').find('.js_file_location').val() + '][]');
253
  });
254
 
255
+ jQuery('.css_file_template').live('change', function() {
256
+ jQuery(this).parents('li').find(':text').attr('name', 'css_files[' + jQuery('#css_themes').val() + '][' + jQuery(this).val() + '][include][]');
257
  });
258
 
259
+ jQuery('.js_file_location').live('change', function() {
260
+ jQuery(this).parents('li').find(':text').attr('name', 'js_files[' + jQuery('#js_themes').val() + '][' + jQuery(this).parents('li').find('.js_file_template').val() + '][' + jQuery(this).val() + '][]');
261
  });
262
 
263
+ jQuery('.js_file_delete').live('click', function() {
264
+ var parent = jQuery(this).parents('li');
265
+ if (parent.find('input[type=text]').val() == '' || confirm('Are you sure you want to delete JS file?')) {
266
+ parent.remove();
267
+ w3tc_minify_js_file_clear();
268
+ }
269
 
270
+ return false;
 
 
 
271
  });
272
 
273
+ jQuery('.css_file_delete').live('click', function() {
274
+ var parent = jQuery(this).parents('li');
275
+ if (parent.find('input[type=text]').val() == '' || confirm('Are you sure you want to delete CSS file?')) {
276
+ parent.remove();
277
+ w3tc_minify_css_file_clear();
278
+ }
279
 
280
+ return false;
 
281
  });
282
 
283
+ jQuery('#js_file_add').click(function() {
284
+ w3tc_minify_js_file_add(jQuery('#js_themes').val(), 'default', 'include', '');
285
  });
286
 
287
+ jQuery('#css_file_add').click(function() {
288
+ w3tc_minify_css_file_add(jQuery('#css_themes').val(), 'default', '');
289
  });
290
 
291
+ jQuery('#js_themes').change(function() {
292
+ w3tc_minify_js_theme(jQuery(this).val());
293
  });
294
 
295
+ jQuery('#css_themes').change(function() {
296
+ w3tc_minify_css_theme(jQuery(this).val());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
297
  });
298
 
299
+ jQuery('#minify_form').submit(function() {
300
+ var js = [], css = [], invalid_js = [], invalid_css = [], duplicate = false, query_js = [], query_css = [];
301
+
302
+ jQuery('#js_files :text').each(function() {
303
+ var v = jQuery(this).val(), n = jQuery(this).attr('name'), c = v + n, g = '';
304
+ var match = /js_files\[([a-z0-9_\/]+)\]/.exec(n);
305
+ if (match) {
306
+ g = '[' + jQuery('#js_themes option[value=' + match[1] + ']').text() + '] ' + v;
307
+ }
308
+ if (v != '') {
309
+ for ( var i = 0; i < js.length; i++) {
310
+ if (js[i] == c) {
311
+ duplicate = true;
312
+ break;
313
+ }
314
+ }
315
+
316
+ js.push(c);
317
+
318
+ var qindex = v.indexOf('?');
319
+ if (qindex != -1) {
320
+ if (!/^https?:\/\//.test(v)) {
321
+ query_js.push(g);
322
+ }
323
+ v = v.substr(0, qindex);
324
+ } else if (!/\.js$/.test(v)) {
325
+ invalid_js.push(g);
326
+ }
327
+ }
328
+ });
329
+
330
+ jQuery('#css_files :text').each(function() {
331
+ var v = jQuery(this).val(), n = jQuery(this).attr('name'), c = v + n, g = '';
332
+ var match = /css_files\[([a-z0-9_\/]+)\]/.exec(n);
333
+ if (match) {
334
+ g = '[' + jQuery('#css_themes option[value=' + match[1] + ']').text() + '] ' + v;
335
+ }
336
+ if (v != '') {
337
+ for ( var i = 0; i < css.length; i++) {
338
+ if (css[i] == c) {
339
+ duplicate = true;
340
+ break;
341
+ }
342
+ }
343
+
344
+ css.push(c);
345
+
346
+ var qindex = v.indexOf('?');
347
+ if (qindex != -1) {
348
+ if (!/^https?:\/\//.test(v)) {
349
+ query_css.push(g);
350
+ }
351
+ v = v.substr(0, qindex);
352
+ } else if (!/\.css$/.test(v)) {
353
+ invalid_css.push(g);
354
+ }
355
+ }
356
+ });
357
+
358
+ if (jQuery('#js_enabled:checked').size()) {
359
+ if (invalid_js.length && !confirm('The following files have invalid JS file extension:\r\n\r\n' + invalid_js.join('\r\n') + '\r\n\r\nAre you confident these files contain valid JS code?')) {
360
+ return false;
361
+ }
362
+
363
+ if (query_js.length) {
364
+ alert('We recommend using the entire URI for files with query string (GET) variables. You entered:\r\n\r\n' + query_js.join('\r\n'));
365
+ return false;
366
+ }
367
+ }
368
+
369
+ if (jQuery('#css_enabled:checked').size()) {
370
+ if (invalid_css.length && !confirm('The following files have invalid CSS file extension:\r\n\r\n' + invalid_css.join('\r\n') + '\r\n\r\nAre you confident these files contain valid CSS code?')) {
371
+ return false;
372
+ }
373
+
374
+ if (query_css.length) {
375
+ alert('We recommend using the entire URI for files with query string (GET) variables. You entered:\r\n\r\n' + query_css.join('\r\n'));
376
+ return false;
377
+ }
378
+ }
379
+
380
+ if (duplicate) {
381
+ alert('Duplicate files have been found in your minify settings, please check your settings and re-save.');
382
+ return false;
383
+ }
384
+
385
+ return true;
386
  });
387
 
388
+ // CDN
389
+ jQuery('.w3tc-tab').click(function() {
390
+ jQuery('.w3tc-tab-content').hide();
391
+ jQuery(this.rel).show();
392
+ });
393
+
394
+ jQuery('#cdn_export_library').click(function() {
395
+ w3tc_popup('admin.php?page=w3tc_cdn&w3tc_action=cdn_export_library', 'cdn_export_library');
396
+ });
397
+
398
+ jQuery('#cdn_import_library').click(function() {
399
+ w3tc_popup('admin.php?page=w3tc_cdn&w3tc_action=cdn_import_library', 'cdn_import_library');
400
+ });
401
+
402
+ jQuery('#cdn_queue').click(function() {
403
+ w3tc_popup('admin.php?page=w3tc_cdn&w3tc_action=cdn_queue', 'cdn_queue');
404
+ });
405
+
406
+ jQuery('#cdn_rename_domain').click(function() {
407
+ w3tc_popup('admin.php?page=w3tc_cdn&w3tc_action=cdn_rename_domain', 'cdn_rename_domain');
408
+ });
409
+
410
+ jQuery('.cdn_export').click(function() {
411
+ w3tc_popup('admin.php?page=w3tc_cdn&w3tc_action=cdn_export&cdn_export_type=' + this.name, 'cdn_export_' + this.name);
412
+ });
413
+
414
+ jQuery('#cdn_test').click(function() {
415
+ var me = jQuery(this);
416
+ var cnames = w3tc_cdn_get_cnames();
417
+ var params = {
418
+ w3tc_action: 'cdn_test'
419
+ };
420
+
421
+ switch (true) {
422
+ case me.hasClass('cdn_mirror'):
423
+ jQuery.extend(params, {
424
+ engine: 'mirror',
425
+ 'config[domain][]': cnames
426
+ });
427
+ break;
428
+
429
+ case me.hasClass('cdn_netdna'):
430
+ jQuery.extend(params, {
431
+ engine: 'netdna',
432
+ 'config[domain][]': cnames
433
+ });
434
+ break;
435
+
436
+ case me.hasClass('cdn_ftp'):
437
+ jQuery.extend(params, {
438
+ engine: 'ftp',
439
+ 'config[host]': jQuery('#cdn_ftp_host').val(),
440
+ 'config[user]': jQuery('#cdn_ftp_user').val(),
441
+ 'config[path]': jQuery('#cdn_ftp_path').val(),
442
+ 'config[pass]': jQuery('#cdn_ftp_pass').val(),
443
+ 'config[pasv]': jQuery('#cdn_ftp_pasv:checked').size(),
444
+ 'config[domain][]': cnames
445
+ });
446
+ break;
447
+
448
+ case me.hasClass('cdn_s3'):
449
+ jQuery.extend(params, {
450
+ engine: 's3',
451
+ 'config[key]': jQuery('#cdn_s3_key').val(),
452
+ 'config[secret]': jQuery('#cdn_s3_secret').val(),
453
+ 'config[bucket]': jQuery('#cdn_s3_bucket').val(),
454
+ 'config[cname][]': cnames
455
+ });
456
+ break;
457
+
458
+ case me.hasClass('cdn_cf'):
459
+ jQuery.extend(params, {
460
+ engine: 'cf',
461
+ 'config[key]': jQuery('#cdn_cf_key').val(),
462
+ 'config[secret]': jQuery('#cdn_cf_secret').val(),
463
+ 'config[bucket]': jQuery('#cdn_cf_bucket').val(),
464
+ 'config[id]': jQuery('#cdn_cf_id').val(),
465
+ 'config[cname][]': cnames
466
+ });
467
+ break;
468
+
469
+ case me.hasClass('cdn_rscf'):
470
+ jQuery.extend(params, {
471
+ engine: 'rscf',
472
+ 'config[user]': jQuery('#cdn_rscf_user').val(),
473
+ 'config[key]': jQuery('#cdn_rscf_key').val(),
474
+ 'config[container]': jQuery('#cdn_rscf_container').val(),
475
+ 'config[id]': jQuery('#cdn_rscf_id').val(),
476
+ 'config[cname][]': cnames
477
+ });
478
+ break;
479
+ }
480
+
481
+ var status = jQuery('#cdn_test_status');
482
  status.removeClass('w3tc-error');
483
  status.removeClass('w3tc-success');
484
  status.addClass('w3tc-process');
485
  status.html('Testing...');
 
 
 
 
 
 
 
 
 
 
 
 
486
 
487
+ jQuery.post('admin.php?page=w3tc_general', params, function(data) {
 
 
 
 
 
 
 
 
 
 
 
 
488
  status.addClass(data.result ? 'w3tc-success' : 'w3tc-error');
489
  status.html(data.error);
490
  }, 'json');
491
  });
492
 
493
+ jQuery('#cdn_create_container').click(function() {
494
+ var me = jQuery(this);
495
+ var cnames = w3tc_cdn_get_cnames();
496
+ var container_id = null;
497
+ var params = {
498
+ w3tc_action: 'cdn_create_container'
499
+ };
500
+
501
+ switch (true) {
502
+ case me.hasClass('cdn_s3'):
503
+ jQuery.extend(params, {
504
+ engine: 's3',
505
+ 'config[key]': jQuery('#cdn_s3_key').val(),
506
+ 'config[secret]': jQuery('#cdn_s3_secret').val(),
507
+ 'config[bucket]': jQuery('#cdn_s3_bucket').val(),
508
+ 'config[cname][]': cnames
509
+ });
510
+ break;
511
+
512
+ case me.hasClass('cdn_cf'):
513
+ container_id = jQuery('#cdn_cf_id');
514
+
515
+ jQuery.extend(params, {
516
+ engine: 'cf',
517
+ 'config[key]': jQuery('#cdn_cf_key').val(),
518
+ 'config[secret]': jQuery('#cdn_cf_secret').val(),
519
+ 'config[bucket]': jQuery('#cdn_cf_bucket').val(),
520
+ 'config[cname][]': cnames
521
+ });
522
+ break;
523
+
524
+ case me.hasClass('cdn_rscf'):
525
+ container_id = jQuery('#cdn_rscf_id');
526
+
527
+ jQuery.extend(params, {
528
+ engine: 'rscf',
529
+ 'config[user]': jQuery('#cdn_rscf_user').val(),
530
+ 'config[key]': jQuery('#cdn_rscf_key').val(),
531
+ 'config[container]': jQuery('#cdn_rscf_container').val(),
532
+ 'config[cname][]': cnames
533
+ });
534
+ break;
535
+ }
536
+
537
+ var status = jQuery('#cdn_create_container_status');
538
  status.removeClass('w3tc-error');
539
  status.removeClass('w3tc-success');
540
  status.addClass('w3tc-process');
541
+ status.html('Creating...');
542
+
543
+ jQuery.post('admin.php?page=w3tc_general', params, function(data) {
 
 
 
 
 
544
  status.addClass(data.result ? 'w3tc-success' : 'w3tc-error');
545
  status.html(data.error);
546
+
547
+ if (container_id && container_id.size() && data.container_id) {
548
+ container_id.val(data.container_id);
549
+ }
550
  }, 'json');
551
  });
552
 
553
+ jQuery('#memcached_test').click(function() {
554
+ var status = jQuery('#memcached_test_status');
555
  status.removeClass('w3tc-error');
556
  status.removeClass('w3tc-success');
557
  status.addClass('w3tc-process');
558
  status.html('Testing...');
559
+ jQuery.post('admin.php?page=w3tc_general', {
560
  w3tc_action: 'test_memcached',
561
+ servers: jQuery('#memcached_servers').val()
562
  }, function(data) {
563
  status.addClass(data.result ? 'w3tc-success' : 'w3tc-error');
564
  status.html(data.error);
565
  }, 'json');
566
  });
567
 
568
+ // CDN cnames
569
+ jQuery('#cdn_cname_add').click(function() {
570
+ jQuery('#cdn_cnames').append('<li><input type="text" name="cdn_cnames[]" value="" size="30" /> <input class="button cdn_cname_delete" type="button" value="Delete" /> <span></span></li>');
571
+ w3tc_cdn_cnames_assign();
572
  });
573
 
574
+ jQuery('.cdn_cname_delete').live('click', function() {
575
+ var p = jQuery(this).parent();
576
+ if (p.find('input[type=text]').val() == '' || confirm('Are you sure you want to delete JS file?')) {
577
+ p.remove();
578
+ w3tc_cdn_cnames_assign();
579
+ }
580
+ });
581
+
582
+ // support tabs
583
+ jQuery('#support_more_files').live('click', function() {
584
+ jQuery(this).before('<input type="file" name="files[]" /><br />');
585
+
586
+ return false;
587
+ });
588
 
589
+ jQuery('#support_form').live('submit', function() {
590
+ var url = jQuery('.required #support_url');
591
+ var name = jQuery('.required #support_name');
592
+ var email = jQuery('.required #support_email');
593
+ var phone = jQuery('.required #support_phone');
594
+ var subject = jQuery('.required #support_subject');
595
+ var description = jQuery('.required #support_description');
596
+ var wp_login = jQuery('.required #support_wp_login');
597
+ var wp_password = jQuery('.required #support_wp_password');
598
+ var ftp_host = jQuery('.required #support_ftp_host');
599
+ var ftp_login = jQuery('.required #support_ftp_login');
600
+ var ftp_password = jQuery('.required #support_ftp_password');
601
+
602
+ if (url.size() && url.val() == '') {
603
+ alert('Please enter the address of your site in the Site URL field.');
604
  url.focus();
605
  return false;
606
  }
607
 
608
+ if (name.size() && name.val() == '') {
609
  alert('Please enter your name in the Name field.');
610
  name.focus();
611
  return false;
612
  }
613
 
614
+ if (email.size() && !/^[a-z0-9_\-\.]+@[a-z0-9-\.]+\.[a-z]{2,5}$/.test(email.val().toLowerCase())) {
615
  alert('Please enter valid email address in the E-Mail field.');
616
  email.focus();
617
  return false;
618
  }
619
 
620
+ if (phone.size() && !/^[0-9\-\.\ \(\)\+]+$/.test(phone.val())) {
621
+ alert('Please enter your phone in the phone field.');
622
+ phone.focus();
623
+ return false;
624
+ }
625
+
626
+ if (subject.size() && subject.val() == '') {
627
+ alert('Please enter subject in the subject field.');
628
+ subject.focus();
629
+ return false;
630
+ }
631
+
632
+ if (description.size() && description.val() == '') {
633
+ alert('Please describe the issue in the issue description field.');
634
+ description.focus();
635
+ return false;
636
+ }
637
+
638
+ if (wp_login.size() && wp_login.val() == '') {
639
+ alert('Please enter an administrator login. Remember you can create a temporary one just for this support case.');
640
+ wp_login.focus();
641
+ return false;
642
+ }
643
+
644
+ if (wp_password.size() && wp_password.val() == '') {
645
+ alert('Please enter WP Admin password, be sure it\'s spelled correctly.');
646
+ wp_password.focus();
647
+ return false;
648
+ }
649
+
650
+ if (ftp_host.size() && ftp_host.val() == '') {
651
+ alert('Please enter SSH or FTP host for your site.');
652
+ ftp_host.focus();
653
+ return false;
654
+ }
655
+
656
+ if (ftp_login.size() && ftp_login.val() == '') {
657
+ alert('Please enter SSH or FTP login for your server. Remember you can create a temporary one just for this support case.');
658
+ ftp_login.focus();
659
+ return false;
660
+ }
661
+
662
+ if (ftp_password.size() && ftp_password.val() == '') {
663
+ alert('Please enter SSH or FTP password for your FTP account.');
664
+ ftp_password.focus();
665
+ return false;
666
+ }
667
+
668
+ return true;
669
+ });
670
+
671
+ jQuery('#support_request_type').live('change', function() {
672
+ var request_type = jQuery(this);
673
+
674
  if (request_type.val() == '') {
675
  alert('Please select request type.');
676
  request_type.focus();
677
+
678
  return false;
679
  }
680
 
681
+ var action = '';
682
+
683
+ switch (request_type.val()) {
684
+ case 'bug_report':
685
+ case 'new_feature':
686
+ action = 'options_support';
687
+ break;
688
+
689
+ case 'email_support':
690
+ case 'phone_support':
691
+ case 'plugin_config':
692
+ case 'theme_config':
693
+ case 'linux_config':
694
+ action = 'options_support_payment';
695
+ break;
696
+ }
697
+
698
+ if (action) {
699
+ jQuery('#support_container').html('<div id="support_loading">Loading...</div>').load('admin.php?page=w3tc_support&w3tc_action=' + action + '&request_type=' + request_type.val() + '&ajax=1');
700
+
701
  return false;
702
  }
703
 
704
+ return true;
705
+ });
 
 
 
 
706
 
707
+ jQuery('#support_cancel').live('click', function() {
708
+ jQuery('#support_container').html('<div id="support_loading">Loading...</div>').load('admin.php?page=w3tc_support&w3tc_action=options_support_select&ajax=1');
709
+ });
710
+
711
+ // mobile tab
712
+ jQuery('#mobile_form').submit(function() {
713
+ var error = false;
714
+
715
+ jQuery('#mobile_groups li').each(function() {
716
+ if (jQuery(this).find(':checked').size()) {
717
+ var group = jQuery(this).find('.mobile_group').text();
718
+ var theme = jQuery(this).find(':selected').val();
719
+ var redirect = jQuery(this).find('input[type=text]').val();
720
+ var agents = jQuery.trim(jQuery(this).find('textarea').val()).split("\n");
721
+
722
+ jQuery('#mobile_groups li').each(function() {
723
+ if (jQuery(this).find(':checked').size()) {
724
+ var compare_group = jQuery(this).find('.mobile_group').text();
725
+ if (compare_group != group) {
726
+ var compare_theme = jQuery(this).find(':selected').val();
727
+ var compare_redirect = jQuery(this).find('input[type=text]').val();
728
+ var compare_agents = jQuery.trim(jQuery(this).find('textarea').val()).split("\n");
729
+
730
+ if (compare_redirect == '' && redirect == '' && compare_theme != '' && compare_theme == theme) {
731
+ alert('Duplicate theme "' + compare_theme + '" found in the group "' + group + '".');
732
+ error = true;
733
+ return false;
734
+ }
735
+
736
+ if (compare_redirect != '' && compare_redirect == redirect) {
737
+ alert('Duplicate redirect "' + compare_redirect + '" found in the group "' + group + '".');
738
+ error = true;
739
+ return false;
740
+ }
741
+
742
+ jQuery.each(compare_agents, function(index, value) {
743
+ if (jQuery.inArray(value, agents) != -1) {
744
+ alert('Duplicate stem "' + value + '" found in the group "' + compare_group + '".');
745
+ error = true;
746
+ return false;
747
+ }
748
+ });
749
+ }
750
+ }
751
+ });
752
+
753
+ if (error) {
754
+ return false;
755
+ }
756
  }
757
+ });
758
+
759
+ if (error) {
760
+ return false;
761
  }
762
+ });
763
 
764
+ jQuery('#mobile_add').click(function() {
765
+ var group = prompt('Enter group name (only "0-9", "a-z", "_" symbols are allowed).');
766
+
767
+ if (group !== null) {
768
+ group = group.toLowerCase();
769
+ group = group.replace(/[^0-9a-z_]+/g, '_');
770
+ group = group.replace(/^_+/, '');
771
+ group = group.replace(/_+$/, '');
772
+
773
+ if (group) {
774
+ jQuery('.mobile_group').each(function() {
775
+ if (jQuery(this).html() == group) {
776
+ alert('Group already exists!');
777
+ return false;
778
+ }
779
+ });
780
+
781
+ var li = jQuery('<li id="mobile_group_' + group + '"><table class="form-table"><tr><th valign="top">Group name:</th><td><span class="mobile_group_number">' + (jQuery('#mobile_groups li').size() + 1) + '.</span> <span class="mobile_group">' + group + '</span> <input type="button" class="button mobile_delete" value="Delete group" /></td></tr><tr><th><label for="mobile_groups_' + group + '_enabled">Enabled:</label></th><td><input type="hidden" name="mobile_groups[' + group + '][enabled]" value="0" /><input id="mobile_groups_' + group + '_enabled" type="checkbox" name="mobile_groups[' + group + '][enabled]" value="1" checked="checked" /></td></tr><tr><th valign="top"><label for="mobile_groups_' + group + '_theme">Theme:</label></th><td><select id="mobile_groups_' + group + '_theme" name="mobile_groups[' + group + '][theme]"><option value="">-- Pass-through --</option></select><br /><span class="description">Assign this group of user agents to a specific them. Leaving this option "Active Theme" allows any plugins you have (e.g. mobile plugins) to properly handle requests for these user agents. If the "redirect users to" field is not empty, this setting is ignored.</span></td></tr><tr><th valign="top"><label for="mobile_groups_' + group + '_redirect">Redirect users to:</label></th><td><input id="mobile_groups_' + group + '_redirect" type="text" name="mobile_groups[' + group + '][redirect]" value="" size="60" /><br /><span class="description">A 302 redirect is used to send this group of users to another hostname (domain); recommended if a 3rd party service provides a mobile version of your site.</span></td></tr><tr><th valign="top"><label for="mobile_groups_' + group + '_agents">User agents:</label></th><td><textarea id="mobile_groups_' + group + '_agents" name="mobile_groups[' + group + '][agents]" rows="10" cols="50"></textarea><br /><span class="description">Specify the user agents for this group.</span></td></tr></table></li>');
782
+ var select = li.find('select');
783
+
784
+ jQuery.each(mobile_themes, function(index, value) {
785
+ select.append(jQuery('<option />').val(index).html(value));
786
+ });
787
+
788
+ jQuery('#mobile_groups').append(li);
789
+ w3tc_mobile_groups_clear();
790
+
791
+ window.location.hash = '#mobile_group_' + group;
792
+ } else {
793
+ alert('Empty group name!');
794
  }
795
+ }
796
+ });
797
 
798
+ jQuery('.mobile_delete').live('click', function() {
799
+ if (confirm('Are you sure want to delete this group?')) {
800
+ jQuery(this).parents('#mobile_groups li').remove();
801
+ w3tc_mobile_groups_clear();
802
+ }
803
+ });
804
+
805
+ w3tc_mobile_groups_clear();
806
+
807
+ // add sortable
808
+ if (jQuery.ui && jQuery.ui.sortable) {
809
+ jQuery('#js_files,#css_files').sortable( {
810
+ axis: 'y',
811
+ stop: function() {
812
+ jQuery(this).find('li').each(function(index) {
813
+ jQuery(this).find('td:eq(0)').html((index + 1) + '.');
814
+ });
815
  }
816
+ });
817
 
818
+ jQuery('#cdn_cnames').sortable( {
819
+ axis: 'y',
820
+ stop: w3tc_cdn_cnames_assign
821
+ });
822
+
823
+ jQuery('#mobile_groups').sortable( {
824
+ axis: 'y',
825
+ stop: function() {
826
+ jQuery('#mobile_groups .mobile_group_number').each(function(index) {
827
+ jQuery(this).html((index + 1) + '.');
828
+ });
829
  }
830
+ });
831
+ }
832
+
833
+ // show hide rules
834
+ jQuery('.w3tc-show-rules').click(function() {
835
+ var btn = jQuery(this), rules = btn.parent().find('.w3tc-rules');
836
+
837
+ if (rules.is(':visible')) {
838
+ rules.css('display', 'none');
839
+ btn.val('view code');
840
+ } else {
841
+ rules.css('display', 'block');
842
+ btn.val('hide code');
843
  }
844
+ });
845
 
846
+ // nav
847
+ jQuery('#w3tc-nav select').change(function() {
848
+ document.location.href = 'admin.php?page=' + jQuery(this).val();
849
  });
850
  });
inc/js/popup.js CHANGED
@@ -1,4 +1,4 @@
1
- function seconds_to_string(seconds) {
2
  var string = '', days = 0, hours = 0, minutes = 0;
3
  days = Math.floor(seconds / 86400);
4
  if (days) {
@@ -23,7 +23,7 @@ function seconds_to_string(seconds) {
23
  return string;
24
  }
25
 
26
- var Cdn_Export_File = {
27
  paused: 0,
28
  limit: 25,
29
  offset: 0,
@@ -82,7 +82,7 @@ var Cdn_Export_File = {
82
  if (this.upload_files.length) {
83
  jQuery.ajax( {
84
  type: 'POST',
85
- url: 'options-general.php?page=w3-total-cache/w3-total-cache.php',
86
  data: {
87
  w3tc_action: 'cdn_export_process',
88
  'files[]': this.upload_files
@@ -149,7 +149,7 @@ var Cdn_Export_File = {
149
 
150
  timer_callback: function() {
151
  this.seconds_elapsed++;
152
- this.set_elapsed(seconds_to_string(this.seconds_elapsed));
153
  },
154
 
155
  init: function(files, cdn_url) {
@@ -171,6 +171,7 @@ var Cdn_Export_File = {
171
  me.offset = 0;
172
  me.seconds_elapsed = 0;
173
  me.clear_log();
 
174
  me.set_elapsed('-');
175
  }
176
  me.paused = 0;
@@ -186,7 +187,7 @@ var Cdn_Export_File = {
186
  }
187
  };
188
 
189
- var Cdn_Export_Library = {
190
  paused: 0,
191
  limit: 25,
192
  offset: 0,
@@ -240,7 +241,7 @@ var Cdn_Export_Library = {
240
  var me = this;
241
  jQuery.ajax( {
242
  type: 'POST',
243
- url: 'options-general.php?page=w3-total-cache/w3-total-cache.php',
244
  data: {
245
  w3tc_action: 'cdn_export_library_process',
246
  limit: this.limit,
@@ -309,7 +310,7 @@ var Cdn_Export_Library = {
309
 
310
  timer_callback: function() {
311
  this.seconds_elapsed++;
312
- this.set_elapsed(seconds_to_string(this.seconds_elapsed));
313
  },
314
 
315
  init: function() {
@@ -325,6 +326,7 @@ var Cdn_Export_Library = {
325
  me.offset = 0;
326
  me.seconds_elapsed = 0;
327
  me.clear_log();
 
328
  me.set_elapsed('-');
329
  }
330
  me.paused = 0;
@@ -340,7 +342,7 @@ var Cdn_Export_Library = {
340
  }
341
  };
342
 
343
- var Cdn_Import_Library = {
344
  paused: 0,
345
  limit: 5,
346
  offset: 0,
@@ -426,7 +428,7 @@ var Cdn_Import_Library = {
426
  var me = this;
427
  jQuery.ajax( {
428
  type: 'POST',
429
- url: 'options-general.php?page=w3-total-cache/w3-total-cache.php',
430
  data: {
431
  w3tc_action: 'cdn_import_library_process',
432
  limit: this.limit,
@@ -497,7 +499,7 @@ var Cdn_Import_Library = {
497
 
498
  timer_callback: function() {
499
  this.seconds_elapsed++;
500
- this.set_elapsed(seconds_to_string(this.seconds_elapsed));
501
  },
502
 
503
  init: function(cdn_host) {
@@ -514,6 +516,7 @@ var Cdn_Import_Library = {
514
  me.offset = 0;
515
  me.seconds_elapsed = 0;
516
  me.clear_log();
 
517
  me.clear_rules();
518
  me.set_elapsed('-');
519
  }
@@ -530,7 +533,7 @@ var Cdn_Import_Library = {
530
  }
531
  };
532
 
533
- var Cdn_Rename_Domain = {
534
  paused: 0,
535
  limit: 25,
536
  offset: 0,
@@ -588,7 +591,7 @@ var Cdn_Rename_Domain = {
588
  var me = this;
589
  jQuery.ajax( {
590
  type: 'POST',
591
- url: 'options-general.php?page=w3-total-cache/w3-total-cache.php',
592
  data: {
593
  w3tc_action: 'cdn_rename_domain_process',
594
  names: this.get_domain_names(),
@@ -658,7 +661,7 @@ var Cdn_Rename_Domain = {
658
 
659
  timer_callback: function() {
660
  this.seconds_elapsed++;
661
- this.set_elapsed(seconds_to_string(this.seconds_elapsed));
662
  },
663
 
664
  init: function(cdn_host) {
@@ -679,6 +682,7 @@ var Cdn_Rename_Domain = {
679
  me.offset = 0;
680
  me.seconds_elapsed = 0;
681
  me.clear_log();
 
682
  me.set_elapsed('-');
683
  }
684
  me.paused = 0;
@@ -694,19 +698,19 @@ var Cdn_Rename_Domain = {
694
  }
695
  };
696
 
697
- jQuery(function($) {
698
- $('.tab').click(function() {
699
- $('.tab').removeClass('tab-selected');
700
- $('.tab-content').hide();
701
- $(this).addClass('tab-selected');
702
- $(this.rel).show();
703
  });
704
 
705
- $('.cdn_queue_delete').click(function() {
706
  return confirm('Are you sure you want to remove this file from the queue?');
707
  });
708
 
709
- $('.cdn_queue_empty').click(function() {
710
  return confirm('Are you sure you want to empty the queue?');
711
  });
712
- });
1
+ function w3tc_seconds_to_string(seconds) {
2
  var string = '', days = 0, hours = 0, minutes = 0;
3
  days = Math.floor(seconds / 86400);
4
  if (days) {
23
  return string;
24
  }
25
 
26
+ var W3tc_Popup_Cdn_Export_File = {
27
  paused: 0,
28
  limit: 25,
29
  offset: 0,
82
  if (this.upload_files.length) {
83
  jQuery.ajax( {
84
  type: 'POST',
85
+ url: 'admin.php?page=w3tc_cdn',
86
  data: {
87
  w3tc_action: 'cdn_export_process',
88
  'files[]': this.upload_files
149
 
150
  timer_callback: function() {
151
  this.seconds_elapsed++;
152
+ this.set_elapsed(w3tc_seconds_to_string(this.seconds_elapsed));
153
  },
154
 
155
  init: function(files, cdn_url) {
171
  me.offset = 0;
172
  me.seconds_elapsed = 0;
173
  me.clear_log();
174
+ me.set_progress(0);
175
  me.set_elapsed('-');
176
  }
177
  me.paused = 0;
187
  }
188
  };
189
 
190
+ var W3tc_Popup_Cdn_Export_Library = {
191
  paused: 0,
192
  limit: 25,
193
  offset: 0,
241
  var me = this;
242
  jQuery.ajax( {
243
  type: 'POST',
244
+ url: 'admin.php?page=w3tc_cdn',
245
  data: {
246
  w3tc_action: 'cdn_export_library_process',
247
  limit: this.limit,
310
 
311
  timer_callback: function() {
312
  this.seconds_elapsed++;
313
+ this.set_elapsed(w3tc_seconds_to_string(this.seconds_elapsed));
314
  },
315
 
316
  init: function() {
326
  me.offset = 0;
327
  me.seconds_elapsed = 0;
328
  me.clear_log();
329
+ me.set_progress(0);
330
  me.set_elapsed('-');
331
  }
332
  me.paused = 0;
342
  }
343
  };
344
 
345
+ var W3tc_Popup_Cdn_Import_Library = {
346
  paused: 0,
347
  limit: 5,
348
  offset: 0,
428
  var me = this;
429
  jQuery.ajax( {
430
  type: 'POST',
431
+ url: 'admin.php?page=w3tc_cdn',
432
  data: {
433
  w3tc_action: 'cdn_import_library_process',
434
  limit: this.limit,
499
 
500
  timer_callback: function() {
501
  this.seconds_elapsed++;
502
+ this.set_elapsed(w3tc_seconds_to_string(this.seconds_elapsed));
503
  },
504
 
505
  init: function(cdn_host) {
516
  me.offset = 0;
517
  me.seconds_elapsed = 0;
518
  me.clear_log();
519
+ me.set_progress(0);
520
  me.clear_rules();
521
  me.set_elapsed('-');
522
  }
533
  }
534
  };
535
 
536
+ var W3tc_Popup_Cdn_Rename_Domain = {
537
  paused: 0,
538
  limit: 25,
539
  offset: 0,
591
  var me = this;
592
  jQuery.ajax( {
593
  type: 'POST',
594
+ url: 'admin.php?page=w3tc_cdn',
595
  data: {
596
  w3tc_action: 'cdn_rename_domain_process',
597
  names: this.get_domain_names(),
661
 
662
  timer_callback: function() {
663
  this.seconds_elapsed++;
664
+ this.set_elapsed(w3tc_seconds_to_string(this.seconds_elapsed));
665
  },
666
 
667
  init: function(cdn_host) {
682
  me.offset = 0;
683
  me.seconds_elapsed = 0;
684
  me.clear_log();
685
+ me.set_progress(0);
686
  me.set_elapsed('-');
687
  }
688
  me.paused = 0;
698
  }
699
  };
700
 
701
+ jQuery(function() {
702
+ jQuery('.tab').click(function() {
703
+ jQuery('.tab').removeClass('tab-selected');
704
+ jQuery('.tab-content').hide();
705
+ jQuery(this).addClass('tab-selected');
706
+ jQuery(this.rel).show();
707
  });
708
 
709
+ jQuery('.cdn_queue_delete').click(function() {
710
  return confirm('Are you sure you want to remove this file from the queue?');
711
  });
712
 
713
+ jQuery('.cdn_queue_empty').click(function() {
714
  return confirm('Are you sure you want to empty the queue?');
715
  });
716
+ });
inc/lightbox/minify_recommendations.phtml ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <h3>Minify Help Wizard</h3>
2
+
3
+ <div id="recom_container">
4
+ <p>
5
+ To get started with minify, we've identified the following external CSS and JS objects in the
6
+ <select id="recom_theme">
7
+ <?php foreach ($themes as $_theme_key => $_theme_name): ?>
8
+ <option value="<?php echo htmlspecialchars($_theme_key); ?>"<?php selected($_theme_key, $theme_key); ?>><?php echo htmlspecialchars($_theme_name); ?><?php if ($_theme_key == $theme_key): ?> (active)<?php endif; ?></option>
9
+ <?php endforeach; ?>
10
+ </select>
11
+ theme. Select "add" the files you wish to minify, then click "apply &amp; close" to save the settings.
12
+ </p>
13
+
14
+ <h4>JavaScript:</h4>
15
+
16
+ <?php if (count($js_groups)) :?>
17
+ <ul id="recom_js_files" class="minify-files">
18
+ <?php $index = 0; foreach ($js_groups as $js_group => $js_files): ?>
19
+ <?php foreach ($js_files as $js_file): $index++; ?>
20
+ <li>
21
+ <table>
22
+ <tr>
23
+ <th class="minify-files-add">Add:</th>
24
+ <th>&nbsp;</th>
25
+ <th>File URI:</th>
26
+ <th>Template:</th>
27
+ <th colspan="2">Embed Location:</th>
28
+ </tr>
29
+ <tr<?php if (isset($checked_js[$js_group][$js_file])): ?> class="minify-files-exists"<?php endif; ?>>
30
+ <td class="minify-files-add">
31
+ <input type="checkbox" name="recom_js_useit" value="1"<?php checked(isset($checked_js[$js_group][$js_file]), true); ?> />
32
+ </td>
33
+ <td><?php echo $index; ?>.</td>
34
+ <td>
35
+ <input type="text" name="recom_js_file" value="<?php echo htmlspecialchars($js_file); ?>" size="70" />
36
+ </td>
37
+ <td>
38
+ <select name="recom_js_template">
39
+ <?php foreach ($templates as $template_key => $template_name): ?>
40
+ <option value="<?php echo htmlspecialchars($template_key); ?>"<?php selected($template_key, $js_group); ?>><?php echo htmlspecialchars($template_name); ?></option>
41
+ <?php endforeach; ?>
42
+ </select>
43
+ </td>
44
+ <td>
45
+ <?php $selected = (isset($locations_js[$js_group][$js_file]) ? $locations_js[$js_group][$js_file] : ''); ?>
46
+ <select name="recom_js_location">
47
+ <optgroup label="Blocking:">
48
+ <option value="include"<?php selected($selected, 'include'); ?>>Embed in &lt;head&gt;</option>
49
+ <option value="include-body"<?php selected($selected, 'include-body'); ?>>Embed after &lt;body&gt;</option>
50
+ <option value="include-footer"<?php selected($selected, 'include-footer'); ?>>Embed before &lt;/body&gt;</option>
51
+ </optgroup>
52
+ <optgroup label="Non-Blocking:">
53
+ <option value="include-nb"<?php selected($selected, 'include-nb'); ?>>Embed in &lt;head&gt;</option>
54
+ <option value="include-body-nb"<?php selected($selected, 'include-body-nb'); ?>>Embed after &lt;body&gt;</option>
55
+ <option value="include-footer-nb"<?php selected($selected, 'include-footer-nb'); ?>>Embed before &lt;/body&gt;</option>
56
+ </optgroup>
57
+ </select>
58
+ </td>
59
+ <td>
60
+ <input class="js_file_verify button" type="button" value="Verify URI" />
61
+ </td>
62
+ </tr>
63
+ </table>
64
+ </li>
65
+ <?php endforeach; ?>
66
+ <?php endforeach; ?>
67
+ </ul>
68
+ <p>
69
+ <a href="#" id="recom_js_check">Check / Uncheck All</a>
70
+ </p>
71
+ <?php else:?>
72
+ <p>No files found.</p>
73
+ <?php endif;?>
74
+
75
+ <h4>Cascading Style Sheets:</h4>
76
+
77
+ <?php if (count($css_groups)) :?>
78
+ <ul id="recom_css_files" class="minify-files">
79
+ <?php $index = 0; foreach ($css_groups as $css_group => $css_files): ?>
80
+ <?php foreach ($css_files as $css_file): $index++; ?>
81
+ <li>
82
+ <table>
83
+ <tr>
84
+ <th class="minify-files-add">Add:</th>
85
+ <th>&nbsp;</th>
86
+ <th>File URI:</th>
87
+ <th colspan="2">Template:</th>
88
+ </tr>
89
+ <tr<?php if (isset($checked_css[$css_group][$css_file])): ?> class="minify-files-exists"<?php endif; ?>>
90
+ <td class="minify-files-add">
91
+ <input type="checkbox" name="recom_css_useit" value="1"<?php checked(isset($checked_css[$css_group][$css_file]), true); ?> />
92
+ </td>
93
+ <td><?php echo $index; ?>.</td>
94
+ <td>
95
+ <input type="text" name="recom_css_file" value="<?php echo htmlspecialchars($css_file); ?>" size="70" />
96
+ </td>
97
+ <td>
98
+ <select name="recom_css_template">
99
+ <?php foreach ($templates as $template_key => $template_name): ?>
100
+ <option value="<?php echo htmlspecialchars($template_key); ?>"<?php selected($template_key, $css_group); ?>><?php echo htmlspecialchars($template_name); ?></option>
101
+ <?php endforeach; ?>
102
+ </select>
103
+ </td>
104
+ <td>
105
+ <input class="css_file_verify button" type="button" value="Verify URI" />
106
+ </td>
107
+ </tr>
108
+ </table>
109
+ </li>
110
+ <?php endforeach; ?>
111
+ <?php endforeach; ?>
112
+ </ul>
113
+ <p>
114
+ <a href="#" id="recom_css_check">Check / Uncheck All</a>
115
+ </p>
116
+ <?php else:?>
117
+ <p>No files found.</p>
118
+ <?php endif;?>
119
+
120
+ <p>
121
+ <input class="recom_apply button-primary" type="button" value="Apply &amp; close" />
122
+ </p>
123
+
124
+ <h4>Notes:</h4>
125
+
126
+ <ul>
127
+ <li>Typically minification of advertiser code, analytics/statistics or any other types of tracking code is not recommended.</li>
128
+ <li>Scripts that were not already detected above may require <a href="admin.php?page=w3tc_support&amp;request_type=plugin_config">professional consultation</a> to implement.</li>
129
+ </ul>
130
+ </div>
inc/lightbox/self_test.phtml ADDED
@@ -0,0 +1,343 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <h3>Compatibility Test</h3>
2
+
3
+ <div id="self_test_container">
4
+ <h4>Server Modules &amp; Resources:</h4>
5
+
6
+ <div class="monospace">
7
+ PHP Version:
8
+ <?php if (PHP_VERSION >= 5): ?>
9
+ <span class="w3tc-test-ok"><?php echo PHP_VERSION; ?></span>
10
+ <?php else: ?>
11
+ <span class="w3tc-test-warn"><?php echo PHP_VERSION; ?> (Minify disabled)</span>;
12
+ <?php endif; ?>
13
+ <br />
14
+
15
+ PHP Timezone:
16
+ <?php if (ini_get('date.timezone')): ?>
17
+ <span class="w3tc-test-ok">OK</span>
18
+ <?php else: ?>
19
+ <span class="w3tc-test-error">Not set</span>
20
+ <?php endif; ?>
21
+ <br />
22
+
23
+ Web Server:
24
+ <?php if (stristr($_SERVER['SERVER_SOFTWARE'], 'apache') !== false): ?>
25
+ <span class="w3tc-test-ok">Apache</span>
26
+ <?php elseif (stristr($_SERVER['SERVER_SOFTWARE'], 'LiteSpeed') !== false): ?>
27
+ <span class="w3tc-test-warn">Lite Speed</span>
28
+ <?php elseif (stristr($_SERVER['SERVER_SOFTWARE'], 'nginx') !== false): ?>
29
+ <span class="w3tc-test-warn">nginx</span>
30
+ <?php elseif (stristr($_SERVER['SERVER_SOFTWARE'], 'lighttpd') !== false): ?>
31
+ <span class="w3tc-test-warn">lighttpd</span>
32
+ <?php elseif (stristr($_SERVER['SERVER_SOFTWARE'], 'iis') !== false): ?>
33
+ <span class="w3tc-test-warn">Microsoft IIS</span>
34
+ <?php else: ?>
35
+ <span class="w3tc-test-error">Not detected</span>
36
+ <?php endif; ?>
37
+ <br />
38
+
39
+ FTP functions:
40
+ <?php if (function_exists('ftp_connect')): ?>
41
+ <span class="w3tc-test-ok">OK</span>
42
+ <?php else: ?>
43
+ <span class="w3tc-test-error">Not installed</span>
44
+ <?php endif; ?>
45
+ (required for Self-hosted (FTP) CDN support)
46
+ <br />
47
+
48
+ Multibyte String support:
49
+ <?php if (function_exists('mb_substr')): ?>
50
+ <span class="w3tc-test-ok">OK</span>
51
+ <?php else: ?>
52
+ <span class="w3tc-test-error">Not installed</span>
53
+ <?php endif; ?>
54
+ (required for Rackspace Cloud Files support)
55
+ <br />
56
+
57
+ cURL extension:
58
+ <?php if (function_exists('curl_init')): ?>
59
+ <span class="w3tc-test-ok">OK</span>
60
+ <?php else: ?>
61
+ <span class="w3tc-test-error">Not installed</span>
62
+ <?php endif; ?>
63
+ (required for Amazon S3 support)
64
+ <br />
65
+
66
+ zlib extension:
67
+ <?php if (function_exists('gzencode')): ?>
68
+ <span class="w3tc-test-ok">OK</span>
69
+ <?php else: ?>
70
+ <span class="w3tc-test-error">Not installed</span>
71
+ <?php endif; ?>
72
+ (required for compression support)
73
+ <br />
74
+
75
+ Opcode cache:
76
+ <?php if (function_exists('apc_store')): ?>
77
+ <span class="w3tc-test-ok">APC</span>
78
+ <?php elseif (function_exists('eaccelerator_put')): ?>
79
+ <span class="w3tc-test-ok">eAccelerator</span>
80
+ <?php elseif (function_exists('xcache_set')): ?>
81
+ <span class="w3tc-test-ok">XCache</span>
82
+ <?php elseif (PHP_VERSION >= 6): ?>
83
+ <span class="w3tc-test-ok">PHP6</span>
84
+ <?php else: ?>
85
+ <span class="w3tc-test-error">Not installed</span>
86
+ <?php endif; ?>
87
+ <br />
88
+
89
+ Memcache extension:
90
+ <?php if (class_exists('Memcache')): ?>
91
+ <span class="w3tc-test-ok">OK</span>
92
+ <?php else: ?>
93
+ <span class="w3tc-test-error">Not installed</span>
94
+ <?php endif; ?>
95
+ <br />
96
+
97
+ Mime type detection:
98
+ <?php if (function_exists('finfo_open')): ?>
99
+ <span class="w3tc-test-ok">Fileinfo</span>
100
+ <?php elseif (function_exists('mime_content_type')): ?>
101
+ <span class="w3tc-test-warn">Mimetype</span>
102
+ <?php else: ?>
103
+ <span class="w3tc-test-error">Not installed</span>
104
+ <?php endif; ?>
105
+ <br />
106
+
107
+ Hash function:
108
+ <?php if (function_exists('hash')): ?>
109
+ <span class="w3tc-test-ok">hash</span>
110
+ <?php elseif (function_exists('mhash')): ?>
111
+ <span class="w3tc-test-warn">mhash</span>
112
+ <?php else: ?>
113
+ <span class="w3tc-test-error">Not installed</span>
114
+ <?php endif; ?>
115
+ (required for NetDNA purge support)
116
+ <br />
117
+
118
+ Safe mode:
119
+ <?php if (w3_to_boolean(ini_get('safe_mode'))): ?>
120
+ <span class="w3tc-test-warn">On</span>
121
+ <?php else: ?>
122
+ <span class="w3tc-test-ok">Off</span>
123
+ <?php endif; ?>
124
+ <br />
125
+
126
+ Open basedir:
127
+ <?php $open_basedir = ini_get('open_basedir'); if ($open_basedir): ?>
128
+ <span class="w3tc-test-warn">On: <?php echo htmlspecialchars($open_basedir); ?></span>
129
+ <?php else: ?>
130
+ <span class="w3tc-test-ok">Off</span>
131
+ <?php endif; ?>
132
+ <br />
133
+
134
+ zlib output compression:
135
+ <?php if (w3_to_boolean(ini_get('zlib.output_compression'))): ?>
136
+ <span class="w3tc-test-error">On</span>
137
+ <?php else: ?>
138
+ <span class="w3tc-test-ok">Off</span>
139
+ <?php endif; ?>
140
+ <br />
141
+
142
+ <?php
143
+ if (function_exists('apache_get_modules')):
144
+ $apache_modules = apache_get_modules();
145
+ else:
146
+ $apache_modules = false;
147
+ endif;
148
+ ?>
149
+ mod_mime:
150
+ <?php if ($apache_modules): ?>
151
+ <?php if (in_array('mod_mime', $apache_modules)): ?>
152
+ <span class="w3tc-test-ok">OK</span>
153
+ <?php else: ?>
154
+ <span class="w3tc-test-error">Not installed</span>
155
+ <?php endif; ?>
156
+ <?php else: ?>
157
+ <span class="w3tc-test-warn">Not detected</span>
158
+ <?php endif; ?>
159
+ <br />
160
+
161
+ mod_expires:
162
+ <?php if ($apache_modules): ?>
163
+ <?php if (in_array('mod_expires', $apache_modules)): ?>
164
+ <span class="w3tc-test-ok">OK</span>
165
+ <?php else: ?>
166
+ <span class="w3tc-test-error">Not installed</span>
167
+ <?php endif; ?>
168
+ <?php else: ?>
169
+ <span class="w3tc-test-warn">Not detected</span>
170
+ <?php endif; ?>
171
+ <br />
172
+
173
+ mod_deflate / mod_gzip:
174
+ <?php if ($apache_modules): ?>
175
+ <?php if (in_array('mod_deflate', $apache_modules)): ?>
176
+ <span class="w3tc-test-ok">OK</span>
177
+ <?php else: ?>
178
+ <span class="w3tc-test-error">Not installed</span>
179
+ <?php endif; ?>
180
+ <?php else: ?>
181
+ <span class="w3tc-test-warn">Not detected</span>
182
+ <?php endif; ?>
183
+ <br />
184
+
185
+ mod_headers:
186
+ <?php if ($apache_modules): ?>
187
+ <?php if (in_array('mod_headers', $apache_modules)): ?>
188
+ <span class="w3tc-test-ok">OK</span>
189
+ <?php else: ?>
190
+ <span class="w3tc-test-error">Not installed</span>
191
+ <?php endif; ?>
192
+ <?php else: ?>
193
+ <span class="w3tc-test-warn">Not detected</span>
194
+ <?php endif; ?>
195
+ <br />
196
+
197
+ mod_env:
198
+ <?php if ($apache_modules): ?>
199
+ <?php if (in_array('mod_env', $apache_modules)): ?>
200
+ <span class="w3tc-test-ok">OK</span>
201
+ <?php else: ?>
202
+ <span class="w3tc-test-error">Not installed</span>
203
+ <?php endif; ?>
204
+ <?php else: ?>
205
+ <span class="w3tc-test-warn">Not detected</span>
206
+ <?php endif; ?>
207
+ <br />
208
+
209
+ mod_setenvif:
210
+ <?php if ($apache_modules): ?>
211
+ <?php if (in_array('mod_setenvif', $apache_modules)): ?>
212
+ <span class="w3tc-test-ok">OK</span>
213
+ <?php else: ?>
214
+ <span class="w3tc-test-error">Not installed</span>
215
+ <?php endif; ?>
216
+ <?php else: ?>
217
+ <span class="w3tc-test-warn">Not detected</span>
218
+ <?php endif; ?>
219
+ <br />
220
+
221
+ mod_rewrite:
222
+ <?php if ($apache_modules): ?>
223
+ <?php if (in_array('mod_rewrite', $apache_modules)): ?>
224
+ <span class="w3tc-test-ok">OK</span>
225
+ <?php else: ?>
226
+ <span class="w3tc-test-error">Not installed</span>
227
+ <?php endif; ?>
228
+ <?php else: ?>
229
+ <span class="w3tc-test-warn">Not detected</span>
230
+ <?php endif; ?>
231
+ </div>
232
+
233
+ <h4>WordPress Resources</h4>
234
+
235
+ <div class="monospace">
236
+ <?php echo w3_path(WP_CONTENT_DIR); ?>:
237
+ <?php if (w3_is_writable_dir(WP_CONTENT_DIR)): ?>
238
+ <span class="w3tc-test-ok">Write-able</span>
239
+ <?php else: ?>
240
+ <span class="w3tc-test-error">Not write-able</span>
241
+ <?php endif; ?>
242
+ <br />
243
+
244
+ <?php
245
+ $home_root = w3_get_home_root();
246
+ $htaccess_home_path = $home_root . '/.htaccess';
247
+
248
+ if (file_exists($htaccess_home_path)): ?>
249
+ <?php echo htmlspecialchars($htaccess_home_path); ?>
250
+ <?php if (w3_is_writable($htaccess_home_path)): ?>
251
+ <span class="w3tc-test-ok">Write-able</span>
252
+ <?php else: ?>
253
+ <span class="w3tc-test-error">Not write-able</span>
254
+ <?php endif; ?>
255
+ <?php else: ?>
256
+ <?php echo htmlspecialchars($home_root); ?>
257
+ <?php if (w3_is_writable_dir($home_root)): ?>
258
+ <span class="w3tc-test-ok">Write-able</span>
259
+ <?php else: ?>
260
+ <span class="w3tc-test-error">Not write-able</span>
261
+ <?php endif; ?>
262
+ <?php endif; ?>
263
+ <br />
264
+
265
+ <?php
266
+ $document_root = w3_get_document_root();
267
+ $htaccess_docroot_path = $document_root . '/.htaccess';
268
+
269
+ if ($document_root != $home_root): if (file_exists($htaccess_docroot_path)): ?>
270
+ <?php echo htmlspecialchars($htaccess_docroot_path); ?>
271
+ <?php if (w3_is_writable($htaccess_docroot_path)): ?>
272
+ <span class="w3tc-test-ok">Write-able</span>
273
+ <?php else: ?>
274
+ <span class="w3tc-test-error">Not write-able</span>
275
+ <?php endif; ?>
276
+ <?php else: ?>
277
+ <?php echo htmlspecialchars($document_root); ?>
278
+ <?php if (w3_is_writable_dir($document_root)): ?>
279
+ <span class="w3tc-test-ok">Write-able</span>
280
+ <?php else: ?>
281
+ <span class="w3tc-test-error">Not write-able</span>
282
+ <?php endif; ?>
283
+ <?php endif; endif; ?>
284
+ <br />
285
+
286
+ Uploads directory:
287
+ <?php $uploads_dir = @wp_upload_dir(); if (!empty($uploads_dir['error'])): ?>
288
+ <span class="w3tc-test-error">Error: <?php echo htmlspecialchars($uploads_dir['error']); ?></span>
289
+ <?php elseif (!w3_is_writable_dir($uploads_dir['path'])): ?>
290
+ <span class="w3tc-test-error">Not write-able</span>
291
+ <?php else: ?>
292
+ <span class="w3tc-test-ok">Write-able</span>
293
+ <?php endif; ?>
294
+ <br />
295
+
296
+ WP_CACHE define:
297
+ <?php if (defined('WP_CACHE') && WP_CACHE): ?>
298
+ <span class="w3tc-test-ok">OK</span>
299
+ <?php else: ?>
300
+ <span class="w3tc-test-error">Not defined</span>
301
+ <?php endif; ?>
302
+ <br />
303
+
304
+ Fancy permalinks:
305
+ <?php if (get_option('permalink_structure')): ?>
306
+ <span class="w3tc-test-ok">OK</span>
307
+ <?php else: ?>
308
+ <span class="w3tc-test-warn">Disabled</span>
309
+ <?php endif; ?>
310
+ <br />
311
+
312
+ Network mode:
313
+ <?php if (w3_is_multisite()): ?>
314
+ <span class="w3tc-test-ok">On</span>
315
+ <?php else: ?>
316
+ <span class="w3tc-test-ok">Off</span>
317
+ <?php endif; ?>
318
+ <br />
319
+
320
+ <?php if (w3_is_multisite()): ?>
321
+ VHOST mode:
322
+ <?php if (w3_is_vhost()): ?>
323
+ <span class="w3tc-test-ok">On</span>
324
+ <?php else: ?>
325
+ <span class="w3tc-test-ok">Off</span>
326
+ <?php endif; ?>
327
+ <?php endif; ?>
328
+ </div>
329
+
330
+ <fieldset>
331
+ <legend>Legend</legend>
332
+
333
+ <p>
334
+ <span class="w3tc-test-ok">Green</span> - Good<br />
335
+ <span class="w3tc-test-warn">Orange</span> - OK<br />
336
+ <span class="w3tc-test-error">Red</span> - Bad<br />
337
+ </p>
338
+ </fieldset>
339
+
340
+ <p>
341
+ <input class="button-primary" type="button" value="Close" />
342
+ </p>
343
+ </div>
inc/lightbox/support_us.phtml CHANGED
@@ -2,7 +2,7 @@
2
 
3
  <p>We noticed you've been using W3 Total cache for at least 30 days, would you like to help us improve WordPress?</p>
4
 
5
- <form action="options-general.php?page=<?php echo W3TC_FILE; ?>&amp;tab=<?php echo $this->_tab; ?>&amp;save_support_us" method="post">
6
  <p>
7
  <label>
8
  Link to us:
2
 
3
  <p>We noticed you've been using W3 Total cache for at least 30 days, would you like to help us improve WordPress?</p>
4
 
5
+ <form action="admin.php?page=<?php echo $this->_page; ?>&amp;save_support_us" method="post">
6
  <p>
7
  <label>
8
  Link to us:
inc/lightbox/tweet.phtml CHANGED
@@ -4,7 +4,7 @@
4
 
5
  <p>This is the message that will be tweeted:</p>
6
 
7
- <blockquote>I just optimized my #wordpress blog's performance using the W3 Total Cache #plugin by @<a href="http://twitter.com/w3edge" target="_blank">w3edge</a>. Check it out! <a href="http://j.mp/A69xX" target="_blank">http://j.mp/A69xX</a></blockquote>
8
 
9
  <form action="">
10
  <table class="form-table">
@@ -17,9 +17,9 @@
17
  <td><input id="tweet_password" type="password" size="30" /></td>
18
  </tr>
19
  </table>
20
-
21
  <p class="submit">
22
- <input type="submit" name="Submit" class="button-primary" value="Tweet!" />
23
  </p>
24
  </form>
25
 
4
 
5
  <p>This is the message that will be tweeted:</p>
6
 
7
+ <blockquote>YES! I optimized my #wordpress site's performance using the W3 Total Cache #plugin by @<a href="http://twitter.com/w3edge" target="_blank">w3edge</a>. Check it out! <a href="http://j.mp/A69xX" target="_blank">http://j.mp/A69xX</a></blockquote>
8
 
9
  <form action="">
10
  <table class="form-table">
17
  <td><input id="tweet_password" type="password" size="30" /></td>
18
  </tr>
19
  </table>
20
+
21
  <p class="submit">
22
+ <input type="submit" class="button-primary" value="Tweet!" />
23
  </p>
24
  </form>
25
 
inc/mime/all.php ADDED
@@ -0,0 +1,624 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * All possible mime types
5
+ */
6
+ return array(
7
+ '3dml' => 'text/vnd.in3d.3dml',
8
+ '3g2' => 'video/3gpp2',
9
+ '3gp' => 'video/3gpp',
10
+ 'aab|x32|u32|vox' => 'application/x-authorware-bin',
11
+ 'aac' => 'audio/x-aac',
12
+ 'aam' => 'application/x-authorware-map',
13
+ 'aas' => 'application/x-authorware-seg',
14
+ 'abw' => 'application/x-abiword',
15
+ 'acc' => 'application/vnd.americandynamics.acc',
16
+ 'ace' => 'application/x-ace-compressed',
17
+ 'acu' => 'application/vnd.acucobol',
18
+ 'adp' => 'audio/adpcm',
19
+ 'aep' => 'application/vnd.audiograph',
20
+ 'afp|listafp|list3820' => 'application/vnd.ibm.modcap',
21
+ 'aif|aiff|aifc' => 'audio/x-aiff',
22
+ 'air' => 'application/vnd.adobe.air-application-installer-package+zip',
23
+ 'ai|eps|ps' => 'application/postscript',
24
+ 'ami' => 'application/vnd.amiga.ami',
25
+ 'apk' => 'application/vnd.android.package-archive',
26
+ 'application' => 'application/x-ms-application',
27
+ 'apr' => 'application/vnd.lotus-approach',
28
+ 'asc|sig' => 'application/pgp-signature',
29
+ 'asf|asx' => 'video/x-ms-asf',
30
+ 'aso' => 'application/vnd.accpac.simply.aso',
31
+ 'atc|acutc' => 'application/vnd.acucorp',
32
+ 'atom' => 'application/atom+xml',
33
+ 'atomcat' => 'application/atomcat+xml',
34
+ 'atomsvc' => 'application/atomsvc+xml',
35
+ 'atx' => 'application/vnd.antix.game-component',
36
+ 'au|snd' => 'audio/basic',
37
+ 'avi' => 'video/x-msvideo',
38
+ 'aw' => 'application/applixware',
39
+ 'azf' => 'application/vnd.airzip.filesecure.azf',
40
+ 'azs' => 'application/vnd.airzip.filesecure.azs',
41
+ 'azw' => 'application/vnd.amazon.ebook',
42
+ 'bcpio' => 'application/x-bcpio',
43
+ 'bdf' => 'application/x-font-bdf',
44
+ 'bdm' => 'application/vnd.syncml.dm+wbxml',
45
+ 'bh2' => 'application/vnd.fujitsu.oasysprs',
46
+ 'bin|dms|lha|lrf|lzh|so|iso|dmg|dist|distz|pkg|bpk|dump|elc|deploy' => 'application/octet-stream',
47
+ 'bmi' => 'application/vnd.bmi',
48
+ 'bmp' => 'image/bmp',
49
+ 'box' => 'application/vnd.previewsystems.box',
50
+ 'btif' => 'image/prs.btif',
51
+ 'bz' => 'application/x-bzip',
52
+ 'bz2|boz' => 'application/x-bzip2',
53
+ 'c4g|c4d|c4f|c4p|c4u' => 'application/vnd.clonk.c4group',
54
+ 'cab' => 'application/vnd.ms-cab-compressed',
55
+ 'car' => 'application/vnd.curl.car',
56
+ 'cat' => 'application/vnd.ms-pki.seccat',
57
+ 'ccxml' => 'application/ccxml+xml',
58
+ 'cdbcmsg' => 'application/vnd.contact.cmsg',
59
+ 'cdkey' => 'application/vnd.mediastation.cdkey',
60
+ 'cdx' => 'chemical/x-cdx',
61
+ 'cdxml' => 'application/vnd.chemdraw+xml',
62
+ 'cdy' => 'application/vnd.cinderella',
63
+ 'cer' => 'application/pkix-cert',
64
+ 'cgm' => 'image/cgm',
65
+ 'chat' => 'application/x-chat',
66
+ 'chm' => 'application/vnd.ms-htmlhelp',
67
+ 'chrt' => 'application/vnd.kde.kchart',
68
+ 'cif' => 'chemical/x-cif',
69
+ 'cii' => 'application/vnd.anser-web-certificate-issue-initiation',
70
+ 'cil' => 'application/vnd.ms-artgalry',
71
+ 'cla' => 'application/vnd.claymore',
72
+ 'class' => 'application/java-vm',
73
+ 'clkk' => 'application/vnd.crick.clicker.keyboard',
74
+ 'clkp' => 'application/vnd.crick.clicker.palette',
75
+ 'clkt' => 'application/vnd.crick.clicker.template',
76
+ 'clkw' => 'application/vnd.crick.clicker.wordbank',
77
+ 'clkx' => 'application/vnd.crick.clicker',
78
+ 'clp' => 'application/x-msclip',
79
+ 'cmc' => 'application/vnd.cosmocaller',
80
+ 'cmdf' => 'chemical/x-cmdf',
81
+ 'cml' => 'chemical/x-cml',
82
+ 'cmp' => 'application/vnd.yellowriver-custom-menu',
83
+ 'cmx' => 'image/x-cmx',
84
+ 'cod' => 'application/vnd.rim.cod',
85
+ 'cpio' => 'application/x-cpio',
86
+ 'cpt' => 'application/mac-compactpro',
87
+ 'crd' => 'application/x-mscardfile',
88
+ 'crl' => 'application/pkix-crl',
89
+ 'csh' => 'application/x-csh',
90
+ 'csml' => 'chemical/x-csml',
91
+ 'csp' => 'application/vnd.commonspace',
92
+ 'css' => 'text/css',
93
+ 'csv' => 'text/csv',
94
+ 'cu' => 'application/cu-seeme',
95
+ 'curl' => 'text/vnd.curl',
96
+ 'cww' => 'application/prs.cww',
97
+ 'c|cc|cxx|cpp|h|hh|dic' => 'text/x-c',
98
+ 'daf' => 'application/vnd.mobius.daf',
99
+ 'davmount' => 'application/davmount+xml',
100
+ 'dcurl' => 'text/vnd.curl.dcurl',
101
+ 'dd2' => 'application/vnd.oma.dd2+xml',
102
+ 'ddd' => 'application/vnd.fujixerox.ddd',
103
+ 'deb|udeb' => 'application/x-debian-package',
104
+ 'der|crt' => 'application/x-x509-ca-cert',
105
+ 'df' => 'application/x-deflate',
106
+ 'dfac' => 'application/vnd.dreamfactory',
107
+ 'dir|dcr|dxr|cst|cct|cxt|w3d|fgd|swa' => 'application/x-director',
108
+ 'dis' => 'application/vnd.mobius.dis',
109
+ 'djvu|djv' => 'image/vnd.djvu',
110
+ 'dna' => 'application/vnd.dna',
111
+ 'docm' => 'application/vnd.ms-word.document.macroenabled.12',
112
+ 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
113
+ 'doc|dot' => 'application/msword',
114
+ 'dotm' => 'application/vnd.ms-word.template.macroenabled.12',
115
+ 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
116
+ 'dp' => 'application/vnd.osgi.dp',
117
+ 'dpg' => 'application/vnd.dpgraph',
118
+ 'dsc' => 'text/prs.lines.tag',
119
+ 'dtb' => 'application/x-dtbook+xml',
120
+ 'dtd' => 'application/xml-dtd',
121
+ 'dts' => 'audio/vnd.dts',
122
+ 'dtshd' => 'audio/vnd.dts.hd',
123
+ 'dvi' => 'application/x-dvi',
124
+ 'dwf' => 'model/vnd.dwf',
125
+ 'dwg' => 'image/vnd.dwg',
126
+ 'dxf' => 'image/vnd.dxf',
127
+ 'dxp' => 'application/vnd.spotfire.dxp',
128
+ 'ecelp4800' => 'audio/vnd.nuera.ecelp4800',
129
+ 'ecelp7470' => 'audio/vnd.nuera.ecelp7470',
130
+ 'ecelp9600' => 'audio/vnd.nuera.ecelp9600',
131
+ 'ecma' => 'application/ecmascript',
132
+ 'edm' => 'application/vnd.novadigm.edm',
133
+ 'edx' => 'application/vnd.novadigm.edx',
134
+ 'efif' => 'application/vnd.picsel',
135
+ 'ei6' => 'application/vnd.pg.osasli',
136
+ 'eml|all' => 'message/rfc822',
137
+ 'emma' => 'application/emma+xml',
138
+ 'eol' => 'audio/vnd.digital-winds',
139
+ 'eot' => 'application/vnd.ms-fontobject',
140
+ 'epub' => 'application/epub+zip',
141
+ 'es3|et3' => 'application/vnd.eszigno3+xml',
142
+ 'esf' => 'application/vnd.epson.esf',
143
+ 'etx' => 'text/x-setext',
144
+ 'exe|dll|com|bat|msi' => 'application/x-msdownload',
145
+ 'ext' => 'application/vnd.novadigm.ext',
146
+ 'ez' => 'application/andrew-inset',
147
+ 'ez2' => 'application/vnd.ezpix-album',
148
+ 'ez3' => 'application/vnd.ezpix-package',
149
+ 'f4v' => 'video/x-f4v',
150
+ 'fbs' => 'image/vnd.fastbidsheet',
151
+ 'fdf' => 'application/vnd.fdf',
152
+ 'fe_launch' => 'application/vnd.denovo.fcselayout-link',
153
+ 'fg5' => 'application/vnd.fujitsu.oasysgp',
154
+ 'fh|fhc|fh4|fh5|fh7' => 'image/x-freehand',
155
+ 'fig' => 'application/x-xfig',
156
+ 'fli' => 'video/x-fli',
157
+ 'flo' => 'application/vnd.micrografx.flo',
158
+ 'flv' => 'video/x-flv',
159
+ 'flw' => 'application/vnd.kde.kivio',
160
+ 'flx' => 'text/vnd.fmi.flexstor',
161
+ 'fly' => 'text/vnd.fly',
162
+ 'fm|frame|maker|book' => 'application/vnd.framemaker',
163
+ 'fnc' => 'application/vnd.frogans.fnc',
164
+ 'fpx' => 'image/vnd.fpx',
165
+ 'fsc' => 'application/vnd.fsc.weblaunch',
166
+ 'fst' => 'image/vnd.fst',
167
+ 'ftc' => 'application/vnd.fluxtime.clip',
168
+ 'fti' => 'application/vnd.anser-web-funds-transfer-initiation',
169
+ 'fvt' => 'video/vnd.fvt',
170
+ 'fzs' => 'application/vnd.fuzzysheet',
171
+ 'f|for|f77|f90' => 'text/x-fortran',
172
+ 'g3' => 'image/g3fax',
173
+ 'gac' => 'application/vnd.groove-account',
174
+ 'gdl' => 'model/vnd.gdl',
175
+ 'geo' => 'application/vnd.dynageo',
176
+ 'gex|gre' => 'application/vnd.geometry-explorer',
177
+ 'ggb' => 'application/vnd.geogebra.file',
178
+ 'ggt' => 'application/vnd.geogebra.tool',
179
+ 'ghf' => 'application/vnd.groove-help',
180
+ 'gif' => 'image/gif',
181
+ 'gim' => 'application/vnd.groove-identity-message',
182
+ 'gmx' => 'application/vnd.gmx',
183
+ 'gnumeric' => 'application/x-gnumeric',
184
+ 'gph' => 'application/vnd.flographit',
185
+ 'gqf|gqs' => 'application/vnd.grafeq',
186
+ 'gram' => 'application/srgs',
187
+ 'grv' => 'application/vnd.groove-injector',
188
+ 'grxml' => 'application/srgs+xml',
189
+ 'gsf' => 'application/x-font-ghostscript',
190
+ 'gtar' => 'application/x-gtar',
191
+ 'gtm' => 'application/vnd.groove-tool-message',
192
+ 'gtw' => 'model/vnd.gtw',
193
+ 'gv' => 'text/vnd.graphviz',
194
+ 'gz' => 'application/x-gzip',
195
+ 'h261' => 'video/h261',
196
+ 'h263' => 'video/h263',
197
+ 'h264' => 'video/h264',
198
+ 'hbci' => 'application/vnd.hbci',
199
+ 'hdf' => 'application/x-hdf',
200
+ 'hlp' => 'application/winhlp',
201
+ 'hpgl' => 'application/vnd.hp-hpgl',
202
+ 'hpid' => 'application/vnd.hp-hpid',
203
+ 'hps' => 'application/vnd.hp-hps',
204
+ 'hqx' => 'application/mac-binhex40',
205
+ 'htke' => 'application/vnd.kenameaapp',
206
+ 'html|htm' => 'text/html',
207
+ 'hvd' => 'application/vnd.yamaha.hv-dic',
208
+ 'hvp' => 'application/vnd.yamaha.hv-voice',
209
+ 'hvs' => 'application/vnd.yamaha.hv-script',
210
+ 'icc|icm' => 'application/vnd.iccprofile',
211
+ 'ice' => 'x-conference/x-cooltalk',
212
+ 'ico' => 'image/x-icon',
213
+ 'ics|ifb' => 'text/calendar',
214
+ 'ief' => 'image/ief',
215
+ 'ifm' => 'application/vnd.shana.informed.formdata',
216
+ 'igl' => 'application/vnd.igloader',
217
+ 'igs|iges' => 'model/iges',
218
+ 'igx' => 'application/vnd.micrografx.igx',
219
+ 'iif' => 'application/vnd.shana.informed.interchange',
220
+ 'imp' => 'application/vnd.accpac.simply.imp',
221
+ 'ims' => 'application/vnd.ms-ims',
222
+ 'ipk' => 'application/vnd.shana.informed.package',
223
+ 'irm' => 'application/vnd.ibm.rights-management',
224
+ 'irp' => 'application/vnd.irepository.package+xml',
225
+ 'itp' => 'application/vnd.shana.informed.formtemplate',
226
+ 'ivp' => 'application/vnd.immervision-ivp',
227
+ 'ivu' => 'application/vnd.immervision-ivu',
228
+ 'jad' => 'text/vnd.sun.j2me.app-descriptor',
229
+ 'jam' => 'application/vnd.jam',
230
+ 'jar' => 'application/java-archive',
231
+ 'java' => 'text/x-java-source',
232
+ 'jisp' => 'application/vnd.jisp',
233
+ 'jlt' => 'application/vnd.hp-jlyt',
234
+ 'jnlp' => 'application/x-java-jnlp-file',
235
+ 'joda' => 'application/vnd.joost.joda-archive',
236
+ 'jpeg|jpg|jpe' => 'image/jpeg',
237
+ 'jpgv' => 'video/jpeg',
238
+ 'jpm|jpgm' => 'video/jpm',
239
+ 'js' => 'application/javascript',
240
+ 'json' => 'application/json',
241
+ 'karbon' => 'application/vnd.kde.karbon',
242
+ 'kfo' => 'application/vnd.kde.kformula',
243
+ 'kia' => 'application/vnd.kidspiration',
244
+ 'kml' => 'application/vnd.google-earth.kml+xml',
245
+ 'kmz' => 'application/vnd.google-earth.kmz',
246
+ 'kne|knp' => 'application/vnd.kinar',
247
+ 'kon' => 'application/vnd.kde.kontour',
248
+ 'kpr|kpt' => 'application/vnd.kde.kpresenter',
249
+ 'ksp' => 'application/vnd.kde.kspread',
250
+ 'ktz|ktr' => 'application/vnd.kahootz',
251
+ 'kwd|kwt' => 'application/vnd.kde.kword',
252
+ 'latex' => 'application/x-latex',
253
+ 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop',
254
+ 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml',
255
+ 'les' => 'application/vnd.hhe.lesson-player',
256
+ 'link66' => 'application/vnd.route66.link66+xml',
257
+ 'lostxml' => 'application/lost+xml',
258
+ 'lrm' => 'application/vnd.ms-lrm',
259
+ 'ltf' => 'application/vnd.frogans.ltf',
260
+ 'lvp' => 'audio/vnd.lucent.voice',
261
+ 'lwp' => 'application/vnd.lotus-wordpro',
262
+ 'm3u' => 'audio/x-mpegurl',
263
+ 'm4v' => 'video/x-m4v',
264
+ 'mag' => 'application/vnd.ecowin.chart',
265
+ 'mathml' => 'application/mathml+xml',
266
+ 'ma|nb|mb' => 'application/mathematica',
267
+ 'mbk' => 'application/vnd.mobius.mbk',
268
+ 'mbox' => 'application/mbox',
269
+ 'mc1' => 'application/vnd.medcalcdata',
270
+ 'mcd' => 'application/vnd.mcd',
271
+ 'mcurl' => 'text/vnd.curl.mcurl',
272
+ 'mdb' => 'application/x-msaccess',
273
+ 'mdi' => 'image/vnd.ms-modi',
274
+ 'mfm' => 'application/vnd.mfmp',
275
+ 'mgz' => 'application/vnd.proteus.magazine',
276
+ 'mid|midi|kar|rmi' => 'audio/midi',
277
+ 'mif' => 'application/vnd.mif',
278
+ 'mj2|mjp2' => 'video/mj2',
279
+ 'mlp' => 'application/vnd.dolby.mlp',
280
+ 'mmd' => 'application/vnd.chipnuts.karaoke-mmd',
281
+ 'mmf' => 'application/vnd.smaf',
282
+ 'mmr' => 'image/vnd.fujixerox.edmics-mmr',
283
+ 'mny' => 'application/x-msmoney',
284
+ 'movie' => 'video/x-sgi-movie',
285
+ 'mp4a' => 'audio/mp4',
286
+ 'mp4s' => 'application/mp4',
287
+ 'mp4|mp4v|mpg4' => 'video/mp4',
288
+ 'mpc' => 'application/vnd.mophun.certificate',
289
+ 'mpeg|mpg|mpe|m1v|m2v' => 'video/mpeg',
290
+ 'mpga|mp2|mp2a|mp3|m2a|m3a' => 'audio/mpeg',
291
+ 'mpkg' => 'application/vnd.apple.installer+xml',
292
+ 'mpm' => 'application/vnd.blueice.multipass',
293
+ 'mpn' => 'application/vnd.mophun.application',
294
+ 'mpp|mpt' => 'application/vnd.ms-project',
295
+ 'mpy' => 'application/vnd.ibm.minipay',
296
+ 'mqy' => 'application/vnd.mobius.mqy',
297
+ 'mrc' => 'application/marc',
298
+ 'mscml' => 'application/mediaservercontrol+xml',
299
+ 'mseed' => 'application/vnd.fdsn.mseed',
300
+ 'mseq' => 'application/vnd.mseq',
301
+ 'msf' => 'application/vnd.epson.msf',
302
+ 'msh|mesh|silo' => 'model/mesh',
303
+ 'msl' => 'application/vnd.mobius.msl',
304
+ 'msty' => 'application/vnd.muvee.style',
305
+ 'mts' => 'model/vnd.mts',
306
+ 'mus' => 'application/vnd.musician',
307
+ 'musicxml' => 'application/vnd.recordare.musicxml+xml',
308
+ 'mvb|m13|m14' => 'application/x-msmediaview',
309
+ 'mwf' => 'application/vnd.mfer',
310
+ 'mxf' => 'application/mxf',
311
+ 'mxl' => 'application/vnd.recordare.musicxml',
312
+ 'mxml|xhvml|xvml|xvm' => 'application/xv+xml',
313
+ 'mxs' => 'application/vnd.triscape.mxs',
314
+ 'mxu|m4u' => 'video/vnd.mpegurl',
315
+ 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install',
316
+ 'ncx' => 'application/x-dtbncx+xml',
317
+ 'nc|cdf' => 'application/x-netcdf',
318
+ 'ngdat' => 'application/vnd.nokia.n-gage.data',
319
+ 'nlu' => 'application/vnd.neurolanguage.nlu',
320
+ 'nml' => 'application/vnd.enliven',
321
+ 'nnd' => 'application/vnd.noblenet-directory',
322
+ 'nns' => 'application/vnd.noblenet-sealer',
323
+ 'nnw' => 'application/vnd.noblenet-web',
324
+ 'npx' => 'image/vnd.net-fpx',
325
+ 'nsf' => 'application/vnd.lotus-notes',
326
+ 'oa2' => 'application/vnd.fujitsu.oasys2',
327
+ 'oa3' => 'application/vnd.fujitsu.oasys3',
328
+ 'oas' => 'application/vnd.fujitsu.oasys',
329
+ 'obd' => 'application/x-msbinder',
330
+ 'oda' => 'application/oda',
331
+ 'odb' => 'application/vnd.oasis.opendocument.database',
332
+ 'odc' => 'application/vnd.oasis.opendocument.chart',
333
+ 'odf' => 'application/vnd.oasis.opendocument.formula',
334
+ 'odft' => 'application/vnd.oasis.opendocument.formula-template',
335
+ 'odg' => 'application/vnd.oasis.opendocument.graphics',
336
+ 'odi' => 'application/vnd.oasis.opendocument.image',
337
+ 'odp' => 'application/vnd.oasis.opendocument.presentation',
338
+ 'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
339
+ 'odt' => 'application/vnd.oasis.opendocument.text',
340
+ 'oga|ogg|spx' => 'audio/ogg',
341
+ 'ogv' => 'video/ogg',
342
+ 'ogx' => 'application/ogg',
343
+ 'onetoc|onetoc2|onetmp|onepkg' => 'application/onenote',
344
+ 'opf' => 'application/oebps-package+xml',
345
+ 'org' => 'application/vnd.lotus-organizer',
346
+ 'osf' => 'application/vnd.yamaha.openscoreformat',
347
+ 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml',
348
+ 'otc' => 'application/vnd.oasis.opendocument.chart-template',
349
+ 'otf' => 'application/x-font-otf',
350
+ 'otg' => 'application/vnd.oasis.opendocument.graphics-template',
351
+ 'oth' => 'application/vnd.oasis.opendocument.text-web',
352
+ 'oti' => 'application/vnd.oasis.opendocument.image-template',
353
+ 'otm' => 'application/vnd.oasis.opendocument.text-master',
354
+ 'otp' => 'application/vnd.oasis.opendocument.presentation-template',
355
+ 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
356
+ 'ott' => 'application/vnd.oasis.opendocument.text-template',
357
+ 'oxt' => 'application/vnd.openofficeorg.extension',
358
+ 'p10' => 'application/pkcs10',
359
+ 'p12|pfx' => 'application/x-pkcs12',
360
+ 'p7b|spc' => 'application/x-pkcs7-certificates',
361
+ 'p7m|p7c' => 'application/pkcs7-all',
362
+ 'p7r' => 'application/x-pkcs7-certreqresp',
363
+ 'p7s' => 'application/pkcs7-signature',
364
+ 'pbd' => 'application/vnd.powerbuilder6',
365
+ 'pbm' => 'image/x-portable-bitmap',
366
+ 'pcf' => 'application/x-font-pcf',
367
+ 'pcl' => 'application/vnd.hp-pcl',
368
+ 'pclxl' => 'application/vnd.hp-pclxl',
369
+ 'pcurl' => 'application/vnd.curl.pcurl',
370
+ 'pcx' => 'image/x-pcx',
371
+ 'pdb|pqa|oprc' => 'application/vnd.palm',
372
+ 'pdf' => 'application/pdf',
373
+ 'pfa|pfb|pfm|afm' => 'application/x-font-type1',
374
+ 'pfr' => 'application/font-tdpfr',
375
+ 'pgm' => 'image/x-portable-graymap',
376
+ 'pgn' => 'application/x-chess-pgn',
377
+ 'pgp' => 'application/pgp-encrypted',
378
+ 'pic|pct' => 'image/x-pict',
379
+ 'pki' => 'application/pkixcmp',
380
+ 'pkipath' => 'application/pkix-pkipath',
381
+ 'plb' => 'application/vnd.3gpp.pic-bw-large',
382
+ 'plc' => 'application/vnd.mobius.plc',
383
+ 'plf' => 'application/vnd.pocketlearn',
384
+ 'pls' => 'application/pls+xml',
385
+ 'pml' => 'application/vnd.ctc-posml',
386
+ 'png' => 'image/png',
387
+ 'pnm' => 'image/x-portable-anymap',
388
+ 'portpkg' => 'application/vnd.macports.portpkg',
389
+ 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12',
390
+ 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
391
+ 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12',
392
+ 'ppd' => 'application/vnd.cups-ppd',
393
+ 'ppm' => 'image/x-portable-pixmap',
394
+ 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12',
395
+ 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
396
+ 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12',
397
+ 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
398
+ 'ppt|pps|pot' => 'application/vnd.ms-powerpoint',
399
+ 'prc|mobi' => 'application/x-mobipocket-ebook',
400
+ 'pre' => 'application/vnd.lotus-freelance',
401
+ 'prf' => 'application/pics-rules',
402
+ 'psb' => 'application/vnd.3gpp.pic-bw-small',
403
+ 'psd' => 'image/vnd.adobe.photoshop',
404
+ 'psf' => 'application/x-font-linux-psf',
405
+ 'ptid' => 'application/vnd.pvi.ptid1',
406
+ 'pub' => 'application/x-mspublisher',
407
+ 'pvb' => 'application/vnd.3gpp.pic-bw-var',
408
+ 'pwn' => 'application/vnd.3m.post-it-notes',
409
+ 'pya' => 'audio/vnd.ms-playready.media.pya',
410
+ 'pyv' => 'video/vnd.ms-playready.media.pyv',
411
+ 'p|pas' => 'text/x-pascal',
412
+ 'qam' => 'application/vnd.epson.quickanime',
413
+ 'qbo' => 'application/vnd.intu.qbo',
414
+ 'qfx' => 'application/vnd.intu.qfx',
415
+ 'qps' => 'application/vnd.publishare-delta-tree',
416
+ 'qt|mov' => 'video/quicktime',
417
+ 'qxd|qxt|qwd|qwt|qxl|qxb' => 'application/vnd.quark.quarkxpress',
418
+ 'ram|ra' => 'audio/x-pn-realaudio',
419
+ 'rar' => 'application/x-rar-compressed',
420
+ 'ras' => 'image/x-cmu-raster',
421
+ 'rcprofile' => 'application/vnd.ipunplugged.rcprofile',
422
+ 'rdf' => 'application/rdf+xml',
423
+ 'rdz' => 'application/vnd.data-vision.rdz',
424
+ 'rep' => 'application/vnd.businessobjects',
425
+ 'res' => 'application/x-dtbresource+xml',
426
+ 'rgb' => 'image/x-rgb',
427
+ 'rif' => 'application/reginfo+xml',
428
+ 'rl' => 'application/resource-lists+xml',
429
+ 'rlc' => 'image/vnd.fujixerox.edmics-rlc',
430
+ 'rld' => 'application/resource-lists-diff+xml',
431
+ 'rm' => 'application/vnd.rn-realmedia',
432
+ 'rmp' => 'audio/x-pn-realaudio-plugin',
433
+ 'rms' => 'application/vnd.jcp.javame.midlet-rms',
434
+ 'rnc' => 'application/relax-ng-compact-syntax',
435
+ 'rpss' => 'application/vnd.nokia.radio-presets',
436
+ 'rpst' => 'application/vnd.nokia.radio-preset',
437
+ 'rq' => 'application/sparql-query',
438
+ 'rs' => 'application/rls-services+xml',
439
+ 'rsd' => 'application/rsd+xml',
440
+ 'rss' => 'application/rss+xml',
441
+ 'rtf' => 'application/rtf',
442
+ 'rtx' => 'text/richtext',
443
+ 'saf' => 'application/vnd.yamaha.smaf-audio',
444
+ 'sbml' => 'application/sbml+xml',
445
+ 'sc' => 'application/vnd.ibm.secure-container',
446
+ 'scd' => 'application/x-msschedule',
447
+ 'scm' => 'application/vnd.lotus-screencam',
448
+ 'scq' => 'application/scvp-cv-request',
449
+ 'scs' => 'application/scvp-cv-response',
450
+ 'scurl' => 'text/vnd.curl.scurl',
451
+ 'sda' => 'application/vnd.stardivision.draw',
452
+ 'sdc' => 'application/vnd.stardivision.calc',
453
+ 'sdd' => 'application/vnd.stardivision.impress',
454
+ 'sdkm|sdkd' => 'application/vnd.solent.sdkm+xml',
455
+ 'sdp' => 'application/sdp',
456
+ 'sdw' => 'application/vnd.stardivision.writer',
457
+ 'see' => 'application/vnd.seemail',
458
+ 'seed|dataless' => 'application/vnd.fdsn.seed',
459
+ 'sema' => 'application/vnd.sema',
460
+ 'semd' => 'application/vnd.semd',
461
+ 'semf' => 'application/vnd.semf',
462
+ 'ser' => 'application/java-serialized-object',
463
+ 'setpay' => 'application/set-payment-initiation',
464
+ 'setreg' => 'application/set-registration-initiation',
465
+ 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data',
466
+ 'sfs' => 'application/vnd.spotfire.sfs',
467
+ 'sgl' => 'application/vnd.stardivision.writer-global',
468
+ 'sgml|sgm' => 'text/sgml',
469
+ 'sh' => 'application/x-sh',
470
+ 'shar' => 'application/x-shar',
471
+ 'shf' => 'application/shf+xml',
472
+ 'sis|sisx' => 'application/vnd.symbian.install',
473
+ 'sit' => 'application/x-stuffit',
474
+ 'sitx' => 'application/x-stuffitx',
475
+ 'skp|skd|skt|skm' => 'application/vnd.koan',
476
+ 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12',
477
+ 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
478
+ 'slt' => 'application/vnd.epson.salt',
479
+ 'smf' => 'application/vnd.stardivision.math',
480
+ 'smi|smil' => 'application/smil+xml',
481
+ 'snf' => 'application/x-font-snf',
482
+ 'spf' => 'application/vnd.yamaha.smaf-phrase',
483
+ 'spl' => 'application/x-futuresplash',
484
+ 'spot' => 'text/vnd.in3d.spot',
485
+ 'spp' => 'application/scvp-vp-response',
486
+ 'spq' => 'application/scvp-vp-request',
487
+ 'src' => 'application/x-wais-source',
488
+ 'srx' => 'application/sparql-results+xml',
489
+ 'sse' => 'application/vnd.kodak-descriptor',
490
+ 'ssf' => 'application/vnd.epson.ssf',
491
+ 'ssml' => 'application/ssml+xml',
492
+ 'stc' => 'application/vnd.sun.xml.calc.template',
493
+ 'std' => 'application/vnd.sun.xml.draw.template',
494
+ 'stf' => 'application/vnd.wt.stf',
495
+ 'sti' => 'application/vnd.sun.xml.impress.template',
496
+ 'stk' => 'application/hyperstudio',
497
+ 'stl' => 'application/vnd.ms-pki.stl',
498
+ 'str' => 'application/vnd.pg.format',
499
+ 'stw' => 'application/vnd.sun.xml.writer.template',
500
+ 'sus|susp' => 'application/vnd.sus-calendar',
501
+ 'sv4cpio' => 'application/x-sv4cpio',
502
+ 'sv4crc' => 'application/x-sv4crc',
503
+ 'svd' => 'application/vnd.svd',
504
+ 'svg|svgz' => 'image/svg+xml',
505
+ 'swf' => 'application/x-shockwave-flash',
506
+ 'swi' => 'application/vnd.arastra.swi',
507
+ 'sxc' => 'application/vnd.sun.xml.calc',
508
+ 'sxd' => 'application/vnd.sun.xml.draw',
509
+ 'sxg' => 'application/vnd.sun.xml.writer.global',
510
+ 'sxi' => 'application/vnd.sun.xml.impress',
511
+ 'sxm' => 'application/vnd.sun.xml.math',
512
+ 'sxw' => 'application/vnd.sun.xml.writer',
513
+ 's|asm' => 'text/x-asm',
514
+ 'tao' => 'application/vnd.tao.intent-module-archive',
515
+ 'tar' => 'application/x-tar',
516
+ 'tcap' => 'application/vnd.3gpp2.tcap',
517
+ 'tcl' => 'application/x-tcl',
518
+ 'teacher' => 'application/vnd.smart.teacher',
519
+ 'tex' => 'application/x-tex',
520
+ 'texinfo|texi' => 'application/x-texinfo',
521
+ 'tfm' => 'application/x-tex-tfm',
522
+ 'tiff|tif' => 'image/tiff',
523
+ 'tmo' => 'application/vnd.tmobile-livetv',
524
+ 'torrent' => 'application/x-bittorrent',
525
+ 'tpl' => 'application/vnd.groove-tool-template',
526
+ 'tpt' => 'application/vnd.trid.tpt',
527
+ 'tra' => 'application/vnd.trueapp',
528
+ 'trm' => 'application/x-msterminal',
529
+ 'tsv' => 'text/tab-separated-values',
530
+ 'ttf|ttc' => 'application/x-font-ttf',
531
+ 'twd|twds' => 'application/vnd.simtech-mindmapper',
532
+ 'txd' => 'application/vnd.genomatix.tuxedo',
533
+ 'txf' => 'application/vnd.mobius.txf',
534
+ 'txt|text|conf|def|list|log|in' => 'text/plain',
535
+ 't|tr|roff|man|me|ms' => 'text/troff',
536
+ 'ufd|ufdl' => 'application/vnd.ufdl',
537
+ 'umj' => 'application/vnd.umajin',
538
+ 'unityweb' => 'application/vnd.unity',
539
+ 'uoml' => 'application/vnd.uoml+xml',
540
+ 'uri|uris|urls' => 'text/uri-list',
541
+ 'ustar' => 'application/x-ustar',
542
+ 'utz' => 'application/vnd.uiq.theme',
543
+ 'uu' => 'text/x-uuencode',
544
+ 'vcd' => 'application/x-cdlink',
545
+ 'vcf' => 'text/x-vcard',
546
+ 'vcg' => 'application/vnd.groove-vcard',
547
+ 'vcs' => 'text/x-vcalendar',
548
+ 'vcx' => 'application/vnd.vcx',
549
+ 'vis' => 'application/vnd.visionary',
550
+ 'viv' => 'video/vnd.vivo',
551
+ 'vor' => 'application/vnd.stardivision.writer',
552
+ 'vsd|vst|vss|vsw' => 'application/vnd.visio',
553
+ 'vsf' => 'application/vnd.vsf',
554
+ 'vtu' => 'model/vnd.vtu',
555
+ 'vxml' => 'application/voicexml+xml',
556
+ 'wad' => 'application/x-doom',
557
+ 'wav' => 'audio/x-wav',
558
+ 'wax' => 'audio/x-ms-wax',
559
+ 'wbmp' => 'image/vnd.wap.wbmp',
560
+ 'wbs' => 'application/vnd.criticaltools.wbs+xml',
561
+ 'wbxml' => 'application/vnd.wap.wbxml',
562
+ 'wm' => 'video/x-ms-wm',
563
+ 'wma' => 'audio/x-ms-wma',
564
+ 'wmd' => 'application/x-ms-wmd',
565
+ 'wmf' => 'application/x-msmetafile',
566
+ 'wml' => 'text/vnd.wap.wml',
567
+ 'wmlc' => 'application/vnd.wap.wmlc',
568
+ 'wmls' => 'text/vnd.wap.wmlscript',
569
+ 'wmlsc' => 'application/vnd.wap.wmlscriptc',
570
+ 'wmv' => 'video/x-ms-wmv',
571
+ 'wmx' => 'video/x-ms-wmx',
572
+ 'wmz' => 'application/x-ms-wmz',
573
+ 'wpd' => 'application/vnd.wordperfect',
574
+ 'wpl' => 'application/vnd.ms-wpl',
575
+ 'wps|wks|wcm|wdb' => 'application/vnd.ms-works',
576
+ 'wqd' => 'application/vnd.wqd',
577
+ 'wri' => 'application/x-mswrite',
578
+ 'wrl|vrml' => 'model/vrml',
579
+ 'wsdl' => 'application/wsdl+xml',
580
+ 'wspolicy' => 'application/wspolicy+xml',
581
+ 'wtb' => 'application/vnd.webturbo',
582
+ 'wvx' => 'video/x-ms-wvx',
583
+ 'x3d' => 'application/vnd.hzn-3d-crossword',
584
+ 'xap' => 'application/x-silverlight-app',
585
+ 'xar' => 'application/vnd.xara',
586
+ 'xbap' => 'application/x-ms-xbap',
587
+ 'xbd' => 'application/vnd.fujixerox.docuworks.binder',
588
+ 'xbm' => 'image/x-xbitmap',
589
+ 'xdm' => 'application/vnd.syncml.dm+xml',
590
+ 'xdp' => 'application/vnd.adobe.xdp+xml',
591
+ 'xdw' => 'application/vnd.fujixerox.docuworks',
592
+ 'xenc' => 'application/xenc+xml',
593
+ 'xer' => 'application/patch-ops-error+xml',
594
+ 'xfdf' => 'application/vnd.adobe.xfdf',
595
+ 'xfdl' => 'application/vnd.xfdl',
596
+ 'xhtml|xht' => 'application/xhtml+xml',
597
+ 'xif' => 'image/vnd.xiff',
598
+ 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12',
599
+ 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12',
600
+ 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12',
601
+ 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
602
+ 'xls|xlm|xla|xlc|xlt|xlw' => 'application/vnd.ms-excel',
603
+ 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12',
604
+ 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
605
+ 'xml|xsl' => 'application/xml',
606
+ 'xo' => 'application/vnd.olpc-sugar',
607
+ 'xop' => 'application/xop+xml',
608
+ 'xpi' => 'application/x-xpinstall',
609
+ 'xpm' => 'image/x-xpixmap',
610
+ 'xpr' => 'application/vnd.is-xpr',
611
+ 'xps' => 'application/vnd.ms-xpsdocument',
612
+ 'xpw|xpx' => 'application/vnd.intercon.formnet',
613
+ 'xslt' => 'application/xslt+xml',
614
+ 'xsm' => 'application/vnd.syncml+xml',
615
+ 'xspf' => 'application/xspf+xml',
616
+ 'xul' => 'application/vnd.mozilla.xul+xml',
617
+ 'xwd' => 'image/x-xwindowdump',
618
+ 'xyz' => 'chemical/x-xyz',
619
+ 'zaz' => 'application/vnd.zzazz.deck+xml',
620
+ 'zip' => 'application/zip',
621
+ 'zir|zirz' => 'application/vnd.zul',
622
+ 'zmm' => 'application/vnd.handheld-entertainment+xml',
623
+ '123' => 'application/vnd.lotus-1-2-3'
624
+ );
inc/mime/cssjs.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * CSS and JS mime types
5
+ */
6
+ return array(
7
+ 'css' => 'text/css',
8
+ 'js' => 'application/x-javascript'
9
+ );
inc/mime/html.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * HTML mime types
5
+ */
6
+ return array(
7
+ 'html|htm' => 'text/html',
8
+ 'rtf|rtx' => 'text/richtext',
9
+ 'svg|svgz' => 'image/svg+xml',
10
+ 'txt' => 'text/plain',
11
+ 'xsd' => 'text/xsd',
12
+ 'xsl' => 'text/xsl',
13
+ 'xml' => 'text/xml'
14
+ );
inc/{mime.php → mime/other.php} RENAMED
@@ -1,50 +1,45 @@
1
  <?php
2
 
 
 
 
3
  return array(
4
- 'jpg|jpeg|jpe' => 'image/jpeg',
5
- 'gif' => 'image/gif',
6
- 'png' => 'image/png',
7
- 'bmp' => 'image/bmp',
8
- 'tif|tiff' => 'image/tiff',
9
- 'ico' => 'image/x-icon',
10
  'asf|asx|wax|wmv|wmx' => 'video/asf',
11
  'avi' => 'video/avi',
 
 
12
  'divx' => 'video/divx',
 
 
 
 
 
 
 
 
13
  'mov|qt' => 'video/quicktime',
14
- 'mpeg|mpg|mpe' => 'video/mpeg',
15
- 'txt|c|cc|h' => 'text/plain',
16
- 'svg' => 'image/svg+xml',
17
- 'rtx' => 'text/richtext',
18
- 'css' => 'text/css',
19
- 'xsl|xsd|xml' => 'text/xml',
20
- 'htm|html' => 'text/html',
21
  'mp3|m4a' => 'audio/mpeg',
22
  'mp4|m4v' => 'video/mp4',
23
- 'ra|ram' => 'audio/x-realaudio',
24
- 'wav' => 'audio/wav',
 
 
 
 
 
 
 
25
  'ogg' => 'audio/ogg',
26
- 'mid|midi' => 'audio/midi',
27
- 'wma' => 'audio/wma',
28
- 'rtf' => 'application/rtf',
29
- 'js' => 'application/x-javascript',
30
  'pdf' => 'application/pdf',
31
- 'doc|docx' => 'application/msword',
32
  'pot|pps|ppt|pptx' => 'application/vnd.ms-powerpoint',
33
- 'wri' => 'application/vnd.ms-write',
34
- 'xla|xls|xlsx|xlt|xlw' => 'application/vnd.ms-excel',
35
- 'mdb' => 'application/vnd.ms-access',
36
- 'mpp' => 'application/vnd.ms-project',
37
  'swf' => 'application/x-shockwave-flash',
38
- 'class' => 'application/java',
39
  'tar' => 'application/x-tar',
40
- 'zip' => 'application/zip',
41
- 'gz|gzip' => 'application/x-gzip',
42
- 'exe' => 'application/x-msdownload',
43
- 'odt' => 'application/vnd.oasis.opendocument.text',
44
- 'odp' => 'application/vnd.oasis.opendocument.presentation',
45
- 'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
46
- 'odg' => 'application/vnd.oasis.opendocument.graphics',
47
- 'odc' => 'application/vnd.oasis.opendocument.chart',
48
- 'odb' => 'application/vnd.oasis.opendocument.database',
49
- 'odf' => 'application/vnd.oasis.opendocument.formula'
50
- );
1
  <?php
2
 
3
+ /**
4
+ * Other mime types
5
+ */
6
  return array(
 
 
 
 
 
 
7
  'asf|asx|wax|wmv|wmx' => 'video/asf',
8
  'avi' => 'video/avi',
9
+ 'bmp' => 'image/bmp',
10
+ 'class' => 'application/java',
11
  'divx' => 'video/divx',
12
+ 'doc|docx' => 'application/msword',
13
+ 'exe' => 'application/x-msdownload',
14
+ 'gif' => 'image/gif',
15
+ 'gz|gzip' => 'application/x-gzip',
16
+ 'ico' => 'image/x-icon',
17
+ 'jpg|jpeg|jpe' => 'image/jpeg',
18
+ 'mdb' => 'application/vnd.ms-access',
19
+ 'mid|midi' => 'audio/midi',
20
  'mov|qt' => 'video/quicktime',
 
 
 
 
 
 
 
21
  'mp3|m4a' => 'audio/mpeg',
22
  'mp4|m4v' => 'video/mp4',
23
+ 'mpeg|mpg|mpe' => 'video/mpeg',
24
+ 'mpp' => 'application/vnd.ms-project',
25
+ 'odb' => 'application/vnd.oasis.opendocument.database',
26
+ 'odc' => 'application/vnd.oasis.opendocument.chart',
27
+ 'odf' => 'application/vnd.oasis.opendocument.formula',
28
+ 'odg' => 'application/vnd.oasis.opendocument.graphics',
29
+ 'odp' => 'application/vnd.oasis.opendocument.presentation',
30
+ 'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
31
+ 'odt' => 'application/vnd.oasis.opendocument.text',
32
  'ogg' => 'audio/ogg',
 
 
 
 
33
  'pdf' => 'application/pdf',
34
+ 'png' => 'image/png',
35
  'pot|pps|ppt|pptx' => 'application/vnd.ms-powerpoint',
36
+ 'ra|ram' => 'audio/x-realaudio',
 
 
 
37
  'swf' => 'application/x-shockwave-flash',
 
38
  'tar' => 'application/x-tar',
39
+ 'tif|tiff' => 'image/tiff',
40
+ 'wav' => 'audio/wav',
41
+ 'wma' => 'audio/wma',
42
+ 'wri' => 'application/vnd.ms-write',
43
+ 'xla|xls|xlsx|xlt|xlw' => 'application/vnd.ms-excel',
44
+ 'zip' => 'application/zip'
45
+ );
 
 
 
 
inc/options/about.phtml CHANGED
@@ -1,22 +1,21 @@
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
3
  <div id="about">
4
- <h3>About</h3>
5
-
6
  <p>User experience is an important aspect of every web site and all web sites can benefit from effective caching and file size reduction. We have applied web site optimization methods typically used with high traffic sites and simplified their implementation. Coupling these methods either <a href="http://www.danga.com/memcached/" target="_blank">memcached</a> and/or opcode caching and the <acronym title="Content Delivery Network">CDN</acronym> of your choosing to provide the following features and benefits:</p>
7
 
8
  <ul>
9
  <li>Improved Google search engine ranking</li>
10
  <li>Increased visitor time on site</li>
11
- <li>Optimized progressive render (pages appear to render immediately)</li>
12
  <li>Reduced <acronym title="Hypertext Transfer Protocol">HTTP</acronym> Transactions, <acronym title="Domain Name System">DNS</acronym> lookups and reduced document load time</li>
13
  <li>Bandwidth savings via Minify and <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression of <acronym title="Hypertext Markup Language">HTML</acronym>, <acronym title="Cascading Style Sheet">CSS</acronym>, JavaScript and feeds</li>
14
  <li>Increased web server concurrency and increased scale (easily sustain high traffic spikes)</li>
15
  <li>Transparent content delivery network (<acronym title="Content Delivery Network">CDN</acronym>) integration with Media Library, theme files and WordPress core</li>
16
- <li>Caching of pages / posts in memory or on disk</li>
17
  <li>Caching of (minified) <acronym title="Cascading Style Sheet">CSS</acronym> and JavaScript in memory, on disk or on <acronym title="Content Delivery Network">CDN</acronym></li>
18
- <li>Caching of database objects in memory or disk</li>
19
- <li>Caching of feeds (site, categories, tags, comments) in memory or on disk</li>
 
20
  <li>Caching of search results pages (i.e. <acronym title="Uniform Resource Identifier">URI</acronym>s with query string variables) in memory or on disk</li>
21
  <li>Minification of posts / pages and feeds</li>
22
  <li>Minification (concatenation and white space removal) of inline, external or 3rd party JavaScript / <acronym title="Cascading Style Sheet">CSS</acronym> with automated updates</li>
@@ -25,7 +24,7 @@
25
  <li>Import post attachments directly into the Media Library (and <acronym title="Content Delivery Network">CDN</acronym>)</li>
26
  </ul>
27
 
28
- <p>Your users have less data to download, you can now server more visitors at once without upgrading your hardware and you don't have to change how you do anything; just set it and forget it.</p>
29
 
30
  <h4>Who do I thank for all of this?</h4>
31
 
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
3
  <div id="about">
 
 
4
  <p>User experience is an important aspect of every web site and all web sites can benefit from effective caching and file size reduction. We have applied web site optimization methods typically used with high traffic sites and simplified their implementation. Coupling these methods either <a href="http://www.danga.com/memcached/" target="_blank">memcached</a> and/or opcode caching and the <acronym title="Content Delivery Network">CDN</acronym> of your choosing to provide the following features and benefits:</p>
5
 
6
  <ul>
7
  <li>Improved Google search engine ranking</li>
8
  <li>Increased visitor time on site</li>
9
+ <li>Optimized progressive render (pages start rendering immediately)</li>
10
  <li>Reduced <acronym title="Hypertext Transfer Protocol">HTTP</acronym> Transactions, <acronym title="Domain Name System">DNS</acronym> lookups and reduced document load time</li>
11
  <li>Bandwidth savings via Minify and <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression of <acronym title="Hypertext Markup Language">HTML</acronym>, <acronym title="Cascading Style Sheet">CSS</acronym>, JavaScript and feeds</li>
12
  <li>Increased web server concurrency and increased scale (easily sustain high traffic spikes)</li>
13
  <li>Transparent content delivery network (<acronym title="Content Delivery Network">CDN</acronym>) integration with Media Library, theme files and WordPress core</li>
14
+ <li>Caching of pages / posts in memory or on disk or on CDN (mirror only)</li>
15
  <li>Caching of (minified) <acronym title="Cascading Style Sheet">CSS</acronym> and JavaScript in memory, on disk or on <acronym title="Content Delivery Network">CDN</acronym></li>
16
+ <li>Caching of database objects in memory or on disk</li>
17
+ <li>Caching of objects in memory or on disk</li>
18
+ <li>Caching of feeds (site, categories, tags, comments, search results) in memory or on disk</li>
19
  <li>Caching of search results pages (i.e. <acronym title="Uniform Resource Identifier">URI</acronym>s with query string variables) in memory or on disk</li>
20
  <li>Minification of posts / pages and feeds</li>
21
  <li>Minification (concatenation and white space removal) of inline, external or 3rd party JavaScript / <acronym title="Cascading Style Sheet">CSS</acronym> with automated updates</li>
24
  <li>Import post attachments directly into the Media Library (and <acronym title="Content Delivery Network">CDN</acronym>)</li>
25
  </ul>
26
 
27
+ <p>Your users have less data to download, you can now serve more visitors at once without upgrading your hardware and you don't have to change how you do anything; just set it and forget it.</p>
28
 
29
  <h4>Who do I thank for all of this?</h4>
30
 
inc/options/browsercache.phtml ADDED
@@ -0,0 +1,270 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
+
3
+ <p>
4
+ Browser caching is currently <span class="w3tc-<?php if ($browsercache_enabled): ?>enabled">enabled<?php else: ?>disabled">disabled<?php endif; ?></span>.
5
+ </p>
6
+
7
+ <form action="admin.php?page=<?php echo $this->_page; ?>" method="post">
8
+ <fieldset>
9
+ <legend>General</legend>
10
+
11
+ <p>Specify global browser cache policy.</p>
12
+
13
+ <table class="form-table">
14
+ <tr>
15
+ <th>
16
+ <label><input id="browsercache_expires" type="checkbox" name="expires" value="1"<?php checked($browsercache_expires, true); ?> /> Set expires header</label>
17
+ <br /><span class="description">Set the expires header to encourage browser caching of files.</span>
18
+ </th>
19
+ </tr>
20
+ <tr>
21
+ <th>
22
+ <label><input id="browsercache_cache_control" type="checkbox" name="cache_control" value="1"<?php checked($browsercache_cache_control, true); ?> /> Set cache control header</label>
23
+ <br /><span class="description">Set pragma and cache-control headers to encourage browser caching of files.</span>
24
+ </th>
25
+ </tr>
26
+ <tr>
27
+ <th>
28
+ <label><input id="browsercache_etag" type="checkbox" name="etag" value="1"<?php checked($browsercache_etag, true); ?> /> Set entity tag (eTag)</label>
29
+ <br /><span class="description">Set the Etag header to encourage browser caching of files.</span>
30
+ </th>
31
+ </tr>
32
+ <tr>
33
+ <th>
34
+ <label><input id="browsercache_w3tc" type="checkbox" name="w3tc" value="1"<?php checked($browsercache_w3tc, true); ?> /> Set W3 Total Cache header</label>
35
+ <br /><span class="description">Set this header to assist in identifying optimized files.</span>
36
+ </th>
37
+ </tr>
38
+ <tr>
39
+ <th>
40
+ <label><input id="browsercache_compression" type="checkbox" name="compression"<?php checked($browsercache_compression, true); ?> value="1" /> Enable <acronym title="Hypertext Transfer Protocol">HTTP</acronym> (gzip) compression</label>
41
+ <br /><span class="description">Reduce the download time for text-based files.</span>
42
+ </th>
43
+ </tr>
44
+ <tr>
45
+ <th>
46
+ <input type="hidden" name="browsercache.no404wp" value="0" />
47
+ <label><input type="checkbox" name="browsercache.no404wp" value="1"<?php checked($this->_config->get_boolean('browsercache.no404wp'), true); ?> /> Do not process 404 errors for static objects with WordPress</label>
48
+ <br /><span class="description">Reduce server load by allowing the web server to handle 404 errors for static files, like images etc.</span>
49
+ </th>
50
+ </tr>
51
+ </table>
52
+
53
+ <p class="submit">
54
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
55
+ </p>
56
+ </fieldset>
57
+
58
+ <fieldset>
59
+ <legend>Cascading Style Sheets &amp; JavaScript</legend>
60
+
61
+ <p>Specify browser cache policy for cascading style sheets and JavaScript files.</p>
62
+
63
+ <table class="form-table">
64
+ <tr>
65
+ <th colspan="2">
66
+ <input type="hidden" name="browsercache.cssjs.expires" value="0" />
67
+ <label><input class="browsercache_expires" type="checkbox" name="browsercache.cssjs.expires" value="1"<?php checked($this->_config->get_boolean('browsercache.cssjs.expires'), true); ?> /> Set expires header</label>
68
+ <br /><span class="description">Set the expires header to encourage browser caching of files.</span>
69
+ </th>
70
+ </tr>
71
+ <tr>
72
+ <th valign="top">
73
+ <label for="browsercache_cssjs_lifetime">Expires header lifetime:</label>
74
+ </th>
75
+ <td>
76
+ <input id="browsercache_cssjs_lifetime" type="text" name="browsercache.cssjs.lifetime" value="<?php echo $this->_config->get_integer('browsercache.cssjs.lifetime'); ?>" size="8" /> seconds
77
+ </td>
78
+ </tr>
79
+ <tr>
80
+ <th colspan="2">
81
+ <input type="hidden" name="browsercache.cssjs.cache.control" value="0" />
82
+ <label><input class="browsercache_cache_control" type="checkbox" name="browsercache.cssjs.cache.control" value="1"<?php checked($this->_config->get_boolean('browsercache.cssjs.cache.control'), true); ?> /> Set cache control header</label>
83
+ <br /><span class="description">Set pragma and cache-control headers to encourage browser caching of files.</span>
84
+ </th>
85
+ </tr>
86
+ <tr>
87
+ <th valign="top">
88
+ <label for="browsercache_cssjs_cache_policy">Cache Control policy:</label>
89
+ </th>
90
+ <td>
91
+ <select id="browsercache_cssjs_cache_policy" name="browsercache.cssjs.cache.policy">
92
+ <?php $value = $this->_config->get_string('browsercache.cssjs.cache.policy'); ?>
93
+ <option value="cache"<?php selected($value, 'cache'); ?>>cache ("public")</option>
94
+ <option value="cache_validation"<?php selected($value, 'cache_validation'); ?>>cache with validation ("public, must-revalidate, proxy-revalidate")</option>
95
+ <option value="cache_noproxy"<?php selected($value, 'cache_noproxy'); ?>>cache without proxy ("private, must-revalidate")</option>
96
+ <option value="cache_maxage"<?php selected($value, 'cache_maxage'); ?>>cache with max-age ("max-age=EXPIRES_SECONDS, public, must-revalidate, proxy-revalidate")</option>
97
+ <option value="no_cache"<?php selected($value, 'no_cache'); ?>>no-cache ("max-age=0, private, no-store, no-cache, must-revalidate")</option>
98
+ </select>
99
+ </td>
100
+ </tr>
101
+ <tr>
102
+ <th colspan="2">
103
+ <input type="hidden" name="browsercache.cssjs.etag" value="0" />
104
+ <label><input class="browsercache_etag" type="checkbox" name="browsercache.cssjs.etag" value="1"<?php checked($this->_config->get_boolean('browsercache.cssjs.etag'), true); ?> /> Set entity tag (eTag)</label>
105
+ <br /><span class="description">Set the Etag header to encourage browser caching of files.</span>
106
+ </th>
107
+ </tr>
108
+ <tr>
109
+ <th colspan="2">
110
+ <input type="hidden" name="browsercache.cssjs.w3tc" value="0" />
111
+ <label><input class="browsercache_w3tc" type="checkbox" name="browsercache.cssjs.w3tc" value="1"<?php checked($this->_config->get_boolean('browsercache.cssjs.w3tc'), true); ?> /> Set W3 Total Cache header</label>
112
+ <br /><span class="description">Set this header to assist in identifying optimized files.</span>
113
+ </th>
114
+ </tr>
115
+ <tr>
116
+ <th colspan="2">
117
+ <input type="hidden" name="browsercache.cssjs.compression" value="0" />
118
+ <label><input class="browsercache_compression" type="checkbox" name="browsercache.cssjs.compression" value="1"<?php checked($this->_config->get_boolean('browsercache.cssjs.compression'), true); ?> /> Enable <acronym title="Hypertext Transfer Protocol">HTTP</acronym> (gzip) compression</label>
119
+ <br /><span class="description">Reduce the download time for text-based files.</span>
120
+ </th>
121
+ </tr>
122
+ </table>
123
+
124
+ <p class="submit">
125
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
126
+ </p>
127
+ </fieldset>
128
+
129
+ <fieldset>
130
+ <legend><acronym title="Hypertext Markup Language">HTML</acronym></legend>
131
+
132
+ <p>Specify browser cache policy for posts, pages, feeds and text-based files.</p>
133
+
134
+ <table class="form-table">
135
+ <tr>
136
+ <th colspan="2">
137
+ <input type="hidden" name="browsercache.html.expires" value="0" />
138
+ <label><input class="browsercache_expires" type="checkbox" name="browsercache.html.expires" value="1"<?php checked($this->_config->get_boolean('browsercache.html.expires'), true); ?> /> Set expires header</label>
139
+ <br /><span class="description">Set the expires header to encourage browser caching of files.</span>
140
+ </th>
141
+ </tr>
142
+ <tr>
143
+ <th valign="top" style="width: 250px;">
144
+ <label for="browsercache_html_lifetime">Expires header lifetime:</label>
145
+ </th>
146
+ <td>
147
+ <input id="browsercache_html_lifetime" type="text" name="browsercache.html.lifetime" value="<?php echo $this->_config->get_integer('browsercache.html.lifetime'); ?>" size="8" /> seconds
148
+ </td>
149
+ </tr>
150
+ <tr>
151
+ <th colspan="2">
152
+ <input type="hidden" name="browsercache.html.cache.control" value="0" />
153
+ <label><input class="browsercache_cache_control" type="checkbox" name="browsercache.html.cache.control" value="1"<?php checked($this->_config->get_boolean('browsercache.html.cache.control'), true); ?> /> Set cache control header</label>
154
+ <br /><span class="description">Set pragma and cache-control headers to encourage browser caching of files.</span>
155
+ </th>
156
+ </tr>
157
+ <tr>
158
+ <th valign="top">
159
+ <label for="browsercache_html_cache_policy">Cache Control policy:</label>
160
+ </th>
161
+ <td>
162
+ <select id="browsercache_html_cache_policy" name="browsercache.html.cache.policy">
163
+ <?php $value = $this->_config->get_string('browsercache.html.cache.policy'); ?>
164
+ <option value="cache"<?php selected($value, 'cache'); ?>>cache ("public")</option>
165
+ <option value="cache_validation"<?php selected($value, 'cache_validation'); ?>>cache with validation ("public, must-revalidate, proxy-revalidate")</option>
166
+ <option value="cache_noproxy"<?php selected($value, 'cache_noproxy'); ?>>cache without proxy ("private, must-revalidate")</option>
167
+ <option value="cache_maxage"<?php selected($value, 'cache_maxage'); ?>>cache with max-age ("max-age=EXPIRES_SECONDS, public, must-revalidate, proxy-revalidate")</option>
168
+ <option value="no_cache"<?php selected($value, 'no_cache'); ?>>no-cache ("max-age=0, private, no-store, no-cache, must-revalidate")</option>
169
+ </select>
170
+ </td>
171
+ </tr>
172
+ <tr>
173
+ <th colspan="2">
174
+ <input type="hidden" name="browsercache.html.etag" value="0" />
175
+ <label><input class="browsercache_etag" type="checkbox" name="browsercache.html.etag" value="1"<?php checked($this->_config->get_boolean('browsercache.html.etag'), true); ?> /> Set entity tag (eTag)</label>
176
+ <br /><span class="description">Set the Etag header to encourage browser caching of files.</span>
177
+ </th>
178
+ </tr>
179
+ <tr>
180
+ <th colspan="2">
181
+ <input type="hidden" name="browsercache.html.w3tc" value="0" />
182
+ <label><input class="browsercache_w3tc" type="checkbox" name="browsercache.html.w3tc" value="1"<?php checked($this->_config->get_boolean('browsercache.html.w3tc'), true); ?> /> Set W3 Total Cache header</label>
183
+ <br /><span class="description">Set this header to assist in identifying optimized files.</span>
184
+ </th>
185
+ </tr>
186
+ <tr>
187
+ <th colspan="2">
188
+ <input type="hidden" name="browsercache.html.compression" value="0" />
189
+ <label><input class="browsercache_compression" type="checkbox" name="browsercache.html.compression" value="1"<?php checked($this->_config->get_boolean('browsercache.html.compression'), true); ?> /> Enable <acronym title="Hypertext Transfer Protocol">HTTP</acronym> (gzip) compression</label>
190
+ <br /><span class="description">Reduce the download time for text-based files.</span>
191
+ </th>
192
+ </tr>
193
+ </table>
194
+
195
+ <p class="submit">
196
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
197
+ </p>
198
+ </fieldset>
199
+
200
+ <fieldset>
201
+ <legend>Media &amp; Other Files</legend>
202
+
203
+ <table class="form-table">
204
+ <tr>
205
+ <th colspan="2">
206
+ <input type="hidden" name="browsercache.other.expires" value="0" />
207
+ <label><input class="browsercache_expires" type="checkbox" name="browsercache.other.expires" value="1"<?php checked($this->_config->get_boolean('browsercache.other.expires'), true); ?> /> Set expires header</label>
208
+ <br /><span class="description">Set the expires header to encourage browser caching of files.</span>
209
+ </th>
210
+ </tr>
211
+ <tr>
212
+ <th valign="top" style="width: 250px;">
213
+ <label for="browsercache_other_lifetime">Expires header lifetime:</label>
214
+ </th>
215
+ <td>
216
+ <input id="browsercache_other_lifetime" type="text" name="browsercache.other.lifetime" value="<?php echo $this->_config->get_integer('browsercache.other.lifetime'); ?>" size="8" /> seconds
217
+ </td>
218
+ </tr>
219
+ <tr>
220
+ <th colspan="2">
221
+ <input type="hidden" name="browsercache.other.cache.control" value="0" />
222
+ <label><input class="browsercache_cache_control" type="checkbox" name="browsercache.other.cache.control" value="1"<?php checked($this->_config->get_boolean('browsercache.other.cache.control'), true); ?> /> Set cache control header</label>
223
+ <br /><span class="description">Set pragma and cache-control headers to encourage browser caching of files.</span>
224
+ </th>
225
+ </tr>
226
+ <tr>
227
+ <th valign="top">
228
+ <label for="browsercache_other_cache_policy">Cache Control policy:</label>
229
+ </th>
230
+ <td>
231
+ <select id="browsercache_other_cache_policy" name="browsercache.other.cache.policy">
232
+ <?php $value = $this->_config->get_string('browsercache.other.cache.policy'); ?>
233
+ <option value="cache"<?php selected($value, 'cache'); ?>>cache ("public")</option>
234
+ <option value="cache_validation"<?php selected($value, 'cache_validation'); ?>>cache with validation ("public, must-revalidate, proxy-revalidate")</option>
235
+ <option value="cache_noproxy"<?php selected($value, 'cache_noproxy'); ?>>cache without proxy ("private, must-revalidate")</option>
236
+ <option value="cache_maxage"<?php selected($value, 'cache_maxage'); ?>>cache with max-age ("max-age=EXPIRES_SECONDS, public, must-revalidate, proxy-revalidate")</option>
237
+ <option value="no_cache"<?php selected($value, 'no_cache'); ?>>no-cache ("max-age=0, private, no-store, no-cache, must-revalidate")</option>
238
+ </select>
239
+ </td>
240
+ </tr>
241
+ <tr>
242
+ <th colspan="2">
243
+ <input type="hidden" name="browsercache.other.etag" value="0" />
244
+ <label><input class="browsercache_etag" type="checkbox" name="browsercache.other.etag" value="1"<?php checked($this->_config->get_boolean('browsercache.other.etag'), true); ?> /> Set entity tag (eTag)</label>
245
+ <br /><span class="description">Set the Etag header to encourage browser caching of files.</span>
246
+ </th>
247
+ </tr>
248
+ <tr>
249
+ <th colspan="2">
250
+ <input type="hidden" name="browsercache.other.w3tc" value="0" />
251
+ <label><input class="browsercache_w3tc" type="checkbox" name="browsercache.other.w3tc" value="1"<?php checked($this->_config->get_boolean('browsercache.other.w3tc'), true); ?> /> Set W3 Total Cache header</label>
252
+ <br /><span class="description">Set this header to assist in identifying optimized files.</span>
253
+ </th>
254
+ </tr>
255
+ <tr>
256
+ <th colspan="2">
257
+ <input type="hidden" name="browsercache.other.compression" value="0" />
258
+ <label><input class="browsercache_compression" type="checkbox" name="browsercache.other.compression" value="1"<?php checked($this->_config->get_boolean('browsercache.other.compression'), true); ?> /> Enable <acronym title="Hypertext Transfer Protocol">HTTP</acronym> (gzip) compression</label>
259
+ <br /><span class="description">Reduce the download time for text-based files.</span>
260
+ </th>
261
+ </tr>
262
+ </table>
263
+
264
+ <p class="submit">
265
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
266
+ </p>
267
+ </fieldset>
268
+ </form>
269
+
270
+ <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
inc/options/cdn.phtml CHANGED
@@ -1,25 +1,28 @@
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
3
- <h3><acronym title="Content Delivery Network">CDN</acronym> Settings</h3>
4
-
5
- <p><acronym title="Content Delivery Network">CDN</acronym> support is currently <span class="w3tc-<?php if ($cdn_enabled): ?>enabled">enabled<?php else: ?>disabled">disabled<?php endif; ?></span>.</p>
 
 
6
 
7
  <?php if ($cdn_mirror): ?>
8
  <p>
9
- You can <input id="cdn_rename_domain" class="button" type="button" value="modify attachment URLs" />,
10
- <input id="cdn_import_library" class="button" type="button" value="import attachments into the Media Library" /> now.
11
  </p>
12
  <?php else: ?>
13
  <p>
14
- You can <input id="cdn_export_library" class="button" type="button" value="export media library to CDN" />,
15
- <input id="cdn_import_library" class="button" type="button" value="import attachments into the Media Library" />,
16
- <input id="cdn_queue" class="button" type="button" value="view unsuccessful file transfers" /> or
17
- <input id="cdn_rename_domain" class="button" type="button" value="modify attachment URLs" /> now.
 
18
  </p>
19
  <?php endif; ?>
20
 
21
- <form action="options-general.php?page=<?php echo urldecode(W3TC_FILE); ?>&amp;tab=<?php echo $this->_tab; ?>" method="post">
22
- <fieldset id="cdn-general">
23
  <legend>General</legend>
24
 
25
  <table class="form-table">
@@ -38,8 +41,8 @@
38
  <tr>
39
  <th<?php if ($cdn_mirror): ?> colspan="2"<?php endif; ?>>
40
  <input type="hidden" name="cdn.theme.enable" value="0" />
41
- <label><input type="checkbox" name="cdn.theme.enable" value="1"<?php checked($this->_config->get_boolean('cdn.theme.enable'), true); ?> /> Host active theme files</label><br />
42
- <span class="description">If checked, all active theme file types specified in the "theme file types to upload" field below will be hosted with the <acronym title="Content Delivery Network">CDN</acronym>.</span>
43
  </th>
44
  <?php if (! $cdn_mirror): ?>
45
  <td>
@@ -49,13 +52,13 @@
49
  </tr>
50
  <tr>
51
  <th<?php if ($cdn_mirror): ?> colspan="2"<?php endif; ?>>
52
- <input type="hidden" name="cdn.minify.enable" value="0"<?php if (! W3TC_PHP5 || ! $minify_enabled): ?> disabled="disabled"<?php endif; ?> />
53
- <label><input type="checkbox" name="cdn.minify.enable" value="1"<?php checked($this->_config->get_boolean('cdn.minify.enable'), true); ?><?php if (! W3TC_PHP5 || ! $minify_enabled): ?> disabled="disabled"<?php endif; ?> /> Host minified <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> files</label><br />
54
  <span class="description">If checked, minified <acronym>CSS</acronym> and <acronym>JS</acronym> files will be hosted with the <acronym title="Content Delivery Network">CDN</acronym>.</span>
55
  </th>
56
  <?php if (! $cdn_mirror): ?>
57
  <td>
58
- <input class="button cdn_export" type="button" name="minify" value="Upload minify files"<?php if (! W3TC_PHP5 || ! $minify_enabled): ?> disabled="disabled"<?php endif; ?> />
59
  </td>
60
  <?php endif; ?>
61
  </tr>
@@ -88,38 +91,53 @@
88
  </tr>
89
  <?php endif; ?>
90
  </table>
91
-
92
  <p class="submit">
93
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
94
  </p>
95
  </fieldset>
96
-
97
  <fieldset>
98
  <legend>Configuration</legend>
99
 
100
  <table class="form-table">
101
- <?php
102
  switch ($cdn_engine) {
103
  case 'mirror':
 
104
  case 'ftp':
105
  case 's3':
106
  case 'cf':
 
107
  include W3TC_DIR . '/inc/options/cdn/' . $cdn_engine . '.phtml';
108
  break;
109
- }
110
  ?>
111
  </table>
112
-
113
  <p class="submit">
114
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
115
  </p>
116
  </fieldset>
117
-
118
  <fieldset>
119
  <legend>Advanced</legend>
120
 
121
  <table class="form-table">
122
  <?php if (! $cdn_mirror): ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
123
  <tr>
124
  <th><label for="cdn_limit_queue">Re-transfer cycle limit:</label></th>
125
  <td>
@@ -171,11 +189,26 @@
171
  </td>
172
  </tr>
173
  </table>
174
-
175
  <p class="submit">
176
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
177
  </p>
178
  </fieldset>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
179
  </form>
180
 
181
  <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
3
+ <p>
4
+ Content Delivery Network support via
5
+ <strong><?php echo w3_get_engine_name($this->_config->get_string('cdn.engine')); ?></strong>
6
+ is currently <span class="w3tc-<?php if ($cdn_enabled): ?>enabled">enabled<?php else: ?>disabled">disabled<?php endif; ?></span>.
7
+ </p>
8
 
9
  <?php if ($cdn_mirror): ?>
10
  <p>
11
+ Maximize <acronym title="Content Delivery Network">CDN</acronym> usage by <input id="cdn_rename_domain" class="button" type="button" value="modify attachment URLs" /> or
12
+ <input id="cdn_import_library" class="button" type="button" value="importing attachments into the Media Library" />.
13
  </p>
14
  <?php else: ?>
15
  <p>
16
+ Prepare the <acronym title="Content Delivery Network">CDN</acronym> by:
17
+ <input id="cdn_import_library" class="button" type="button" value="importing attachments into the Media Library" /> then
18
+ <input id="cdn_export_library" class="button" type="button" value="exporting media library to CDN" />.
19
+ Check <input id="cdn_queue" class="button" type="button" value="unsuccessful file transfers" /> if some objects appear to be missing.
20
+ <input id="cdn_rename_domain" class="button" type="button" value="Modify attachment URLs" /> if the domain name of your site has ever changed.
21
  </p>
22
  <?php endif; ?>
23
 
24
+ <form action="admin.php?page=<?php echo $this->_page; ?>" method="post">
25
+ <fieldset id="w3tc-cdn-general">
26
  <legend>General</legend>
27
 
28
  <table class="form-table">
41
  <tr>
42
  <th<?php if ($cdn_mirror): ?> colspan="2"<?php endif; ?>>
43
  <input type="hidden" name="cdn.theme.enable" value="0" />
44
+ <label><input type="checkbox" name="cdn.theme.enable" value="1"<?php checked($this->_config->get_boolean('cdn.theme.enable'), true); ?> /> Host theme files</label><br />
45
+ <span class="description">If checked, all theme file types specified in the "theme file types to upload" field below will be hosted with the <acronym title="Content Delivery Network">CDN</acronym>.</span>
46
  </th>
47
  <?php if (! $cdn_mirror): ?>
48
  <td>
52
  </tr>
53
  <tr>
54
  <th<?php if ($cdn_mirror): ?> colspan="2"<?php endif; ?>>
55
+ <input type="hidden" name="cdn.minify.enable" value="0"<?php if (! W3TC_PHP5 || ! $minify_enabled || ! $this->_config->get_boolean('minify.rewrite')): ?> disabled="disabled"<?php endif; ?> />
56
+ <label><input type="checkbox" name="cdn.minify.enable" value="1"<?php checked($this->_config->get_boolean('cdn.minify.enable'), true); ?><?php if (! W3TC_PHP5 || ! $minify_enabled || ! $this->_config->get_boolean('minify.rewrite')): ?> disabled="disabled"<?php endif; ?> /> Host minified <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> files</label><br />
57
  <span class="description">If checked, minified <acronym>CSS</acronym> and <acronym>JS</acronym> files will be hosted with the <acronym title="Content Delivery Network">CDN</acronym>.</span>
58
  </th>
59
  <?php if (! $cdn_mirror): ?>
60
  <td>
61
+ <input class="button cdn_export" type="button" name="minify" value="Upload minify files"<?php if (! W3TC_PHP5 || ! $minify_enabled || ! $this->_config->get_boolean('minify.rewrite')): ?> disabled="disabled"<?php endif; ?> />
62
  </td>
63
  <?php endif; ?>
64
  </tr>
91
  </tr>
92
  <?php endif; ?>
93
  </table>
94
+
95
  <p class="submit">
96
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
97
  </p>
98
  </fieldset>
99
+
100
  <fieldset>
101
  <legend>Configuration</legend>
102
 
103
  <table class="form-table">
104
+ <?php
105
  switch ($cdn_engine) {
106
  case 'mirror':
107
+ case 'netdna':
108
  case 'ftp':
109
  case 's3':
110
  case 'cf':
111
+ case 'rscf':
112
  include W3TC_DIR . '/inc/options/cdn/' . $cdn_engine . '.phtml';
113
  break;
114
+ }
115
  ?>
116
  </table>
117
+
118
  <p class="submit">
119
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
120
  </p>
121
  </fieldset>
122
+
123
  <fieldset>
124
  <legend>Advanced</legend>
125
 
126
  <table class="form-table">
127
  <?php if (! $cdn_mirror): ?>
128
+ <tr>
129
+ <th valign="top">
130
+ <input type="hidden" name="cdn.autoupload.enabled" value="0" />
131
+ <label><input type="checkbox" name="cdn.autoupload.enabled" value="1"<?php checked($this->_config->get_boolean('cdn.autoupload.enabled'), true); ?> /> Enable changed files auto-upload</label>
132
+ </th>
133
+ <td>
134
+ <label style="font-size:13px;">
135
+ Auto upload interval:
136
+ <input id="cdn_autoupload_interval" type="text" name="cdn.autoupload.interval" value="<?php echo $this->_config->get_integer('cdn.autoupload.interval'); ?>" size="8" /> seconds
137
+ </label><br />
138
+ <span class="description">Automatically attempt to find and upload changed files.</span>
139
+ </td>
140
+ </tr>
141
  <tr>
142
  <th><label for="cdn_limit_queue">Re-transfer cycle limit:</label></th>
143
  <td>
189
  </td>
190
  </tr>
191
  </table>
192
+
193
  <p class="submit">
194
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
195
  </p>
196
  </fieldset>
197
+
198
+ <fieldset>
199
+ <legend>Note(s):</legend>
200
+
201
+ <table class="form-table">
202
+ <tr>
203
+ <th valign="top" colspan="2">
204
+ <ul>
205
+ <li>If using Amazon Web Services or Self-Hosted <acronym title="Content Delivery Network">CDN</acronym> types, enable <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression in the "Media &amp; Other Files" section on <a href="admin.php?page=w3tc_browsercache">Browser Cache</a> Settings tab.</li>
206
+ </ul>
207
+ </th>
208
+ </tr>
209
+ </table>
210
+
211
+ </fieldset>
212
  </form>
213
 
214
  <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
inc/options/cdn/cf.phtml CHANGED
@@ -1,30 +1,33 @@
1
- <tr>
2
- <th style="width:300px;"><label for="cdn_cf_key">Access key:</label></th>
3
- <td>
4
- <input id="cdn_cf_key" type="text" name="cdn.cf.key" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.cf.key')); ?>" size="30" />
5
- </td>
6
- </tr>
7
- <tr>
8
- <th><label for="cdn_cf_secret">Secret key:</label></th>
9
- <td>
10
- <input id="cdn_cf_secret" type="text" name="cdn.cf.secret" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.cf.secret')); ?>" size="60" />
11
- </td>
12
- </tr>
13
- <tr>
14
- <th><label for="cdn_cf_bucket">Bucket:</label></th>
15
- <td>
16
- <input id="cdn_cf_bucket" type="text" name="cdn.cf.bucket" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.cf.bucket')); ?>" size="30" />
17
- <input id="create_bucket_cf" class="button" type="button" value="Create bucket" />
18
- <span id="create_bucket_cf_status" class="w3tc-status w3tc-process"></span>
19
- </td>
20
- </tr>
21
- <tr>
22
- <th><label for="cdn_cf_id">Replace site's hostname with:</label></th>
23
- <td>
24
- <input id="cdn_cf_id" type="text" name="cdn.cf.id" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.cf.id')); ?>" size="18" style="text-align:right;" />.cloudfront.net or <label for="cdn_cf_cname">CNAME:</label> <input id="cdn_cf_cname" type="text" name="cdn.cf.cname" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.cf.cname')); ?>" size="30" /><br />
25
- <span class="description">If you have already added a <a href="http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/index.html?CNAMEs.html" target="_blank">CNAME</a> to your <acronym title="Domain Name System">DNS</acronym> Zone, enter it here.</span>
26
- </td>
27
- </tr>
28
- <tr>
29
- <th colspan="2"><input id="test_cf" class="button" type="button" value="Test CloudFront upload" /> <span id="test_cf_status" class="w3tc-status w3tc-process"></span></th>
30
- </tr>
 
 
 
1
+ <tr>
2
+ <th style="width:300px;"><label for="cdn_cf_key">Access key ID:</label></th>
3
+ <td>
4
+ <input id="cdn_cf_key" type="text" name="cdn.cf.key" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.cf.key')); ?>" size="30" />
5
+ </td>
6
+ </tr>
7
+ <tr>
8
+ <th><label for="cdn_cf_secret">Secret key:</label></th>
9
+ <td>
10
+ <input id="cdn_cf_secret" type="password" name="cdn.cf.secret" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.cf.secret')); ?>" size="60" />
11
+ </td>
12
+ </tr>
13
+ <tr>
14
+ <th><label for="cdn_cf_bucket">Bucket:</label></th>
15
+ <td>
16
+ <input id="cdn_cf_bucket" type="text" name="cdn.cf.bucket" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.cf.bucket')); ?>" size="30" />
17
+ <input id="cdn_create_container" class="button cdn_cf" type="button" value="Create bucket" />
18
+ <span id="cdn_create_container_status" class="w3tc-status w3tc-process"></span>
19
+ </td>
20
+ </tr>
21
+ <tr>
22
+ <th><label for="cdn_cf_id">Replace site's hostname with:</label></th>
23
+ <td>
24
+ <input id="cdn_cf_id" type="text" name="cdn.cf.id" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.cf.id')); ?>" size="18" style="text-align:right;" />.cloudfront.net or CNAME:
25
+ <?php $cnames = $this->_config->get_array('cdn.cf.cname'); include W3TC_DIR . '/inc/options/cdn/common/cnames.phtml'; ?>
26
+ <br /><span class="description">If you have already added a <a href="http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/index.html?CNAMEs.html" target="_blank">CNAME</a> to your <acronym title="Domain Name System">DNS</acronym> Zone, enter it here.</span>
27
+ </td>
28
+ </tr>
29
+ <tr>
30
+ <th colspan="2">
31
+ <input id="cdn_test" class="button cdn_cf" type="button" value="Test CloudFront upload" /> <span id="cdn_test_status" class="w3tc-status w3tc-process"></span>
32
+ </th>
33
+ </tr>
inc/options/cdn/common/cnames.phtml ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <ol id="cdn_cnames">
2
+ <?php
3
+ if (! count($cnames)) {
4
+ $cnames = array('');
5
+ }
6
+
7
+ $count = count($cnames);
8
+
9
+ foreach ($cnames as $index => $cname):
10
+ $label = '';
11
+
12
+ if ($count > 1):
13
+ switch ($index):
14
+ case 0:
15
+ $label = '(reserved for CSS)';
16
+ break;
17
+
18
+ case 1:
19
+ $label = '(reserved for JS in <head>)';
20
+ break;
21
+
22
+ case 2:
23
+ $label = '(reserved for JS after <body>)';
24
+ break;
25
+
26
+ case 3:
27
+ $label = '(reserved for JS before </body>)';
28
+ break;
29
+
30
+ default:
31
+ $label = '';
32
+ break;
33
+ endswitch;
34
+ endif;
35
+ ?>
36
+ <li>
37
+ <input type="text" name="cdn_cnames[]" value="<?php echo htmlspecialchars($cname); ?>" size="30" />
38
+ <input class="button cdn_cname_delete" type="button" value="Delete"<?php if (!$index): ?> style="display: none;"<?php endif; ?> />
39
+ <span><?php echo htmlspecialchars($label); ?></span>
40
+ </li>
41
+ <?php endforeach; ?>
42
+ </ol>
43
+ <input id="cdn_cname_add" class="button" type="button" value="Add CNAME" />
inc/options/cdn/ftp.phtml CHANGED
@@ -1,43 +1,45 @@
1
- <tr>
2
- <th colspan="2">
3
- <input type="hidden" name="cdn.ftp.pasv" value="0" />
4
- <label><input id="cdn_ftp_pasv" type="checkbox" name="cdn.ftp.pasv" value="1"<?php checked($this->_config->get_boolean('cdn.ftp.pasv'), true); ?> /> Use passive <acronym title="File Transfer Protocol">FTP</acronym> mode</label><br />
5
- <span class="description">Enable this option only if there are connectivity issues, otherwise it's not recommended.</span>
6
- </th>
7
- </tr>
8
- <tr>
9
- <th style="width:300px;"><label for="cdn_ftp_host"><acronym title="File Transfer Protocol">FTP</acronym> hostname:</label></th>
10
- <td>
11
- <input id="cdn_ftp_host" type="text" name="cdn.ftp.host" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.ftp.host')); ?>" size="30" /><br />
12
- <span class="description">Specify the server's address, e.g.: "ftp.domain.com". Use "127.0.0.1" if using a sub-domain on the same server as your site.</span>
13
- </td>
14
- </tr>
15
- <tr>
16
- <th><label for="cdn_ftp_user"><acronym title="File Transfer Protocol">FTP</acronym> username:</label></th>
17
- <td>
18
- <input id="cdn_ftp_user" type="text" name="cdn.ftp.user" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.ftp.user')); ?>" size="30" />
19
- </td>
20
- </tr>
21
- <tr>
22
- <th><label for="cdn_ftp_pass"><acronym title="File Transfer Protocol">FTP</acronym> password:</label></th>
23
- <td>
24
- <input id="cdn_ftp_pass" type="text" name="cdn.ftp.pass" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.ftp.pass')); ?>" size="30" />
25
- </td>
26
- </tr>
27
- <tr>
28
- <th><label for="cdn_ftp_path"><acronym title="File Transfer Protocol">FTP</acronym> path:</label></th>
29
- <td>
30
- <input id="cdn_ftp_path" type="text" name="cdn.ftp.path" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.ftp.path')); ?>" size="30" /><br />
31
- <span class="description">Specify the directory where files must be uploaded to be accessible in a web browser.</span>
32
- </td>
33
- </tr>
34
- <tr>
35
- <th><label for="cdn_ftp_domain">Replace site's hostname with:</label></th>
36
- <td>
37
- <input id="cdn_ftp_domain" type="text" name="cdn.ftp.domain" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.ftp.domain')); ?>" size="30" /><br />
38
- <span class="description">Enter the hostname of your FTP server configured above, this value will replace your blog's hostname in the <acronym title="Hypertext Markup Language">HTML</acronym>.</span>
39
- </td>
40
- </tr>
41
- <tr>
42
- <th colspan="2"><input id="test_ftp" class="button" type="button" value="Test FTP server" /> <span id="test_ftp_status" class="w3tc-status w3tc-process"></span></th>
43
- </tr>
 
 
1
+ <tr>
2
+ <th colspan="2">
3
+ <input type="hidden" name="cdn.ftp.pasv" value="0" />
4
+ <label><input id="cdn_ftp_pasv" type="checkbox" name="cdn.ftp.pasv" value="1"<?php checked($this->_config->get_boolean('cdn.ftp.pasv'), true); ?> /> Use passive <acronym title="File Transfer Protocol">FTP</acronym> mode</label><br />
5
+ <span class="description">Enable this option only if there are connectivity issues, otherwise it's not recommended.</span>
6
+ </th>
7
+ </tr>
8
+ <tr>
9
+ <th style="width:300px;"><label for="cdn_ftp_host"><acronym title="File Transfer Protocol">FTP</acronym> hostname:</label></th>
10
+ <td>
11
+ <input id="cdn_ftp_host" type="text" name="cdn.ftp.host" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.ftp.host')); ?>" size="30" /><br />
12
+ <span class="description">Specify the server's address, e.g.: "ftp.domain.com". Try "127.0.0.1" if using a sub-domain on the same server as your site.</span>
13
+ </td>
14
+ </tr>
15
+ <tr>
16
+ <th><label for="cdn_ftp_user"><acronym title="File Transfer Protocol">FTP</acronym> username:</label></th>
17
+ <td>
18
+ <input id="cdn_ftp_user" type="text" name="cdn.ftp.user" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.ftp.user')); ?>" size="30" />
19
+ </td>
20
+ </tr>
21
+ <tr>
22
+ <th><label for="cdn_ftp_pass"><acronym title="File Transfer Protocol">FTP</acronym> password:</label></th>
23
+ <td>
24
+ <input id="cdn_ftp_pass" type="password" name="cdn.ftp.pass" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.ftp.pass')); ?>" size="30" />
25
+ </td>
26
+ </tr>
27
+ <tr>
28
+ <th><label for="cdn_ftp_path"><acronym title="File Transfer Protocol">FTP</acronym> path:</label></th>
29
+ <td>
30
+ <input id="cdn_ftp_path" type="text" name="cdn.ftp.path" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.ftp.path')); ?>" size="30" /><br />
31
+ <span class="description">Specify the directory where files must be uploaded to be accessible in a web browser (the document root).</span>
32
+ </td>
33
+ </tr>
34
+ <tr>
35
+ <th><label for="cdn_cnames">Replace site's hostname with:</label></th>
36
+ <td>
37
+ <?php $cnames = $this->_config->get_array('cdn.ftp.domain'); include W3TC_DIR . '/inc/options/cdn/common/cnames.phtml'; ?>
38
+ <br /><span class="description">Enter the hostname or CNAME(s) of your FTP server configured above, these values will replace your site's hostname in the <acronym title="Hypertext Markup Language">HTML</acronym>.</span>
39
+ </td>
40
+ </tr>
41
+ <tr>
42
+ <th colspan="2">
43
+ <input id="cdn_test" class="button cdn_ftp" type="button" value="Test FTP server" /> <span id="cdn_test_status" class="w3tc-status w3tc-process"></span>
44
+ </th>
45
+ </tr>
inc/options/cdn/mirror.phtml CHANGED
@@ -1,7 +1,12 @@
1
- <tr>
2
- <th style="width:300px;"><label for="cdn_mirror_domain">Replace site's hostname with:</label></th>
3
- <td>
4
- <input id="cdn_mirror_domain" type="text" name="cdn.mirror.domain" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.mirror.domain')); ?>" size="30" /><br />
5
- <span class="description">Enter the hostname provided by your <acronym>CDN</acronym> provider, this value will replace your site's hostname in the <acronym title="Hypertext Markup Language">HTML</acronym>.</span>
6
- </td>
7
- </tr>
 
 
 
 
 
1
+ <tr>
2
+ <th style="width:300px;"><label for="cdn_cnames">Replace site's hostname with:</label></th>
3
+ <td>
4
+ <?php $cnames = $this->_config->get_array('cdn.mirror.domain'); include W3TC_DIR . '/inc/options/cdn/common/cnames.phtml'; ?>
5
+ <br /><span class="description">Enter the hostname provided by your <acronym>CDN</acronym> provider, this value will replace your site's hostname in the <acronym title="Hypertext Markup Language">HTML</acronym>.</span>
6
+ </td>
7
+ </tr>
8
+ <tr>
9
+ <th colspan="2">
10
+ <input id="cdn_test" class="button cdn_mirror" type="button" value="Test Mirror" /> <span id="cdn_test_status" class="w3tc-status w3tc-process"></span>
11
+ </th>
12
+ </tr>
inc/options/cdn/netdna.phtml ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <tr>
2
+ <th style="width:300px;"><label for="cdn_netdna_apiid">API ID:</label></th>
3
+ <td>
4
+ <input id="cdn_netdna_apiid" type="text" name="cdn.netdna.apiid" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.netdna.apiid')); ?>" size="60" />
5
+ </td>
6
+ </tr>
7
+ <tr>
8
+ <th><label for="cdn_netdna_apikey">API key:</label></th>
9
+ <td>
10
+ <input id="cdn_netdna_apikey" type="text" name="cdn.netdna.apikey" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.netdna.apikey')); ?>" size="60" />
11
+ </td>
12
+ </tr>
13
+ <tr>
14
+ <th><label for="cdn_cnames">Replace site's hostname with:</label></th>
15
+ <td>
16
+ <?php $cnames = $this->_config->get_array('cdn.netdna.domain'); include W3TC_DIR . '/inc/options/cdn/common/cnames.phtml'; ?>
17
+ <br /><span class="description">Enter the hostname provided by your <acronym>CDN</acronym> provider, this value will replace your site's hostname in the <acronym title="Hypertext Markup Language">HTML</acronym>.</span>
18
+ </td>
19
+ </tr>
20
+ <tr>
21
+ <th colspan="2">
22
+ <input id="cdn_test" class="button cdn_netdna" type="button" value="Test NetDNA" /> <span id="cdn_test_status" class="w3tc-status w3tc-process"></span>
23
+ </th>
24
+ </tr>
inc/options/cdn/rscf.phtml ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <tr>
2
+ <th style="width:300px;"><label for="cdn_rscf_user">Username:</label></th>
3
+ <td>
4
+ <input id="cdn_rscf_user" type="text" name="cdn.rscf.user" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.rscf.user')); ?>" size="30" />
5
+ </td>
6
+ </tr>
7
+ <tr>
8
+ <th><label for="cdn_rscf_key"><acronym title="Application Programming Interface">API</acronym> key:</label></th>
9
+ <td>
10
+ <input id="cdn_rscf_key" type="password" name="cdn.rscf.key" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.rscf.key')); ?>" size="60" />
11
+ </td>
12
+ </tr>
13
+ <tr>
14
+ <th><label for="cdn_rscf_container">Container:</label></th>
15
+ <td>
16
+ <input id="cdn_rscf_container" type="text" name="cdn.rscf.container" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.rscf.container')); ?>" size="30" />
17
+ <input id="cdn_create_container" class="button cdn_rscf" type="button" value="Create container" />
18
+ <span id="cdn_create_container_status" class="w3tc-status w3tc-process"></span>
19
+ </td>
20
+ </tr>
21
+ <tr>
22
+ <th><label for="cdn_rscf_id">Replace site's hostname with:</label></th>
23
+ <td>
24
+ <input id="cdn_rscf_id" type="text" name="cdn.rscf.id" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.rscf.id')); ?>" size="18" style="text-align:right;" />.cdn.cloudfiles.rackspacecloud.com or CNAME:
25
+ <?php $cnames = $this->_config->get_array('cdn.rscf.cname'); include W3TC_DIR . '/inc/options/cdn/common/cnames.phtml'; ?>
26
+ </td>
27
+ </tr>
28
+ <tr>
29
+ <th colspan="2">
30
+ <input id="cdn_test" class="button cdn_rscf" type="button" value="Test Cloud Files upload" /> <span id="cdn_test_status" class="w3tc-status w3tc-process"></span>
31
+ </th>
32
+ </tr>
inc/options/cdn/s3.phtml CHANGED
@@ -1,33 +1,37 @@
1
- <tr>
2
- <th style="width:300px;"><label for="cdn_s3_key">Access key:</label></th>
3
- <td>
4
- <input id="cdn_s3_key" type="text" name="cdn.s3.key" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.s3.key')); ?>" size="30" />
5
- </td>
6
- </tr>
7
- <tr>
8
- <th><label for="cdn_s3_secret">Secret key:</label></th>
9
- <td>
10
- <input id="cdn_s3_secret" type="text" name="cdn.s3.secret" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.s3.secret')); ?>" size="60" />
11
- </td>
12
- </tr>
13
- <tr>
14
- <th><label for="cdn_s3_bucket">Bucket:</label></th>
15
- <td>
16
- <input id="cdn_s3_bucket" type="text" name="cdn.s3.bucket" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.s3.bucket')); ?>" size="30" />
17
- <input id="create_bucket_s3" class="button" type="button" value="Create bucket" />
18
- <span id="create_bucket_s3_status" class="w3tc-status w3tc-process"></span>
19
- </td>
20
- </tr>
21
- <tr>
22
- <th>Replace site's hostname with:</th>
23
- <td>
24
- <?php if (($cdn_s3_bucket = $this->_config->get_string('cdn.s3.bucket')) != ''): ?>
25
- <?php echo htmlspecialchars($cdn_s3_bucket); ?>.s3.amazonaws.com
26
- <?php else: ?>
27
- &lt;bucket&gt;.s3.amazonaws.com
28
- <?php endif; ?>
29
- </td>
30
- </tr>
31
- <tr>
32
- <th><input id="test_s3" class="button" type="button" value="Test S3 upload" /> <span id="test_s3_status" class="w3tc-status w3tc-process"></span></th>
33
- </tr>
 
 
 
 
1
+ <tr>
2
+ <th style="width:300px;"><label for="cdn_s3_key">Access key ID:</label></th>
3
+ <td>
4
+ <input id="cdn_s3_key" type="text" name="cdn.s3.key" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.s3.key')); ?>" size="30" />
5
+ </td>
6
+ </tr>
7
+ <tr>
8
+ <th><label for="cdn_s3_secret">Secret key:</label></th>
9
+ <td>
10
+ <input id="cdn_s3_secret" type="password" name="cdn.s3.secret" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.s3.secret')); ?>" size="60" />
11
+ </td>
12
+ </tr>
13
+ <tr>
14
+ <th><label for="cdn_s3_bucket">Bucket:</label></th>
15
+ <td>
16
+ <input id="cdn_s3_bucket" type="text" name="cdn.s3.bucket" value="<?php echo htmlspecialchars($this->_config->get_string('cdn.s3.bucket')); ?>" size="30" />
17
+ <input id="cdn_create_container" class="button cdn_s3" type="button" value="Create bucket" />
18
+ <span id="cdn_create_container_status" class="w3tc-status w3tc-process"></span>
19
+ </td>
20
+ </tr>
21
+ <tr>
22
+ <th><label for="cdn_cnames">Replace site's hostname with:</label></th>
23
+ <td>
24
+ <?php if (($cdn_s3_bucket = $this->_config->get_string('cdn.s3.bucket')) != ''): ?>
25
+ <?php echo htmlspecialchars($cdn_s3_bucket); ?>.s3.amazonaws.com
26
+ <?php else: ?>
27
+ &lt;bucket&gt;.s3.amazonaws.com
28
+ <?php endif; ?> or CNAME:
29
+ <?php $cnames = $this->_config->get_array('cdn.s3.cname'); include W3TC_DIR . '/inc/options/cdn/common/cnames.phtml'; ?>
30
+ <br /><span class="description">If you have already added a <a href="http://docs.amazonwebservices.com/AmazonS3/latest/DeveloperGuide/VirtualHosting.html#VirtualHostingCustomURLs" target="_blank">CNAME</a> to your <acronym title="Domain Name System">DNS</acronym> Zone, enter it here.</span>
31
+ </td>
32
+ </tr>
33
+ <tr>
34
+ <th colspan="2">
35
+ <input id="cdn_test" class="button cdn_s3" type="button" value="Test S3 upload" /> <span id="cdn_test_status" class="w3tc-status w3tc-process"></span>
36
+ </th>
37
+ </tr>
inc/options/common/header.phtml CHANGED
@@ -1,5 +1,3 @@
1
- <script type="text/javascript" src="<?php echo WP_PLUGIN_URL; ?>/w3-total-cache/inc/js/options.js"></script>
2
- <script type="text/javascript" src="<?php echo WP_PLUGIN_URL; ?>/w3-total-cache/inc/js/lightbox.js"></script>
3
  <?php if ($this->_support_reminder): ?>
4
  <script type="text/javascript">
5
  /*<![CDATA[*/
@@ -12,33 +10,42 @@ jQuery(function($) {
12
 
13
  <div class="wrap" id="w3tc">
14
  <?php screen_icon('w3tc-logo'); ?>
15
-
16
- <h2>W3 Total Cache</h2>
17
-
18
  <?php foreach ($this->_errors as $error): ?>
19
  <div class="error">
20
  <p><?php echo $error; ?></p>
21
  </div>
22
  <?php endforeach; ?>
23
-
24
  <?php foreach ($this->_notes as $note): ?>
25
  <div class="updated fade">
26
  <p><?php echo $note; ?></p>
27
  </div>
28
  <?php endforeach; ?>
29
 
30
- <p id="w3tc-options-menu">
31
- <a href="?page=<?php echo W3TC_FILE; ?>&amp;tab=general"<?php if ($this->_tab == 'general'): ?> class="w3tc-options-menu-selected"<?php endif; ?>>General Settings</a> |
32
- <a href="?page=<?php echo W3TC_FILE; ?>&amp;tab=pgcache"<?php if ($this->_tab == 'pgcache'): ?> class="w3tc-options-menu-selected"<?php endif; ?>>Page Cache Settings</a> |
33
- <?php if (W3TC_PHP5): ?>
34
- <a href="?page=<?php echo W3TC_FILE; ?>&amp;tab=minify"<?php if ($this->_tab == 'minify'): ?> class="w3tc-options-menu-selected"<?php endif; ?>>Minify Settings</a> |
35
- <?php else: ?>
36
- Minify Settings |
37
- <?php endif; ?>
38
- <a href="?page=<?php echo W3TC_FILE; ?>&amp;tab=dbcache"<?php if ($this->_tab == 'dbcache'): ?> class="w3tc-options-menu-selected"<?php endif; ?>>Database Cache Settings</a> |
39
- <a href="?page=<?php echo W3TC_FILE; ?>&amp;tab=cdn"<?php if ($this->_tab == 'cdn'): ?> class="w3tc-options-menu-selected"<?php endif; ?>><acronym title="Content Delivery Network">CDN</acronym> Settings</a> |
40
- <a href="?page=<?php echo W3TC_FILE; ?>&amp;tab=faq"<?php if ($this->_tab == 'faq'): ?> class="w3tc-options-menu-selected"<?php endif; ?>><acronym title="Frequently Asked Questions">FAQ</acronym></a> |
41
- <a href="?page=<?php echo W3TC_FILE; ?>&amp;tab=support"<?php if ($this->_tab == 'support'): ?> class="w3tc-options-menu-selected"<?php endif; ?>>Support</a> |
42
- <a href="?page=<?php echo W3TC_FILE; ?>&amp;tab=install"<?php if ($this->_tab == 'install'): ?> class="w3tc-options-menu-selected"<?php endif; ?>>Installation</a> |
43
- <a href="?page=<?php echo W3TC_FILE; ?>&amp;tab=about"<?php if ($this->_tab == 'about'): ?> class="w3tc-options-menu-selected"<?php endif; ?>>About</a>
44
- </p>
 
 
 
 
 
 
 
 
 
 
 
1
  <?php if ($this->_support_reminder): ?>
2
  <script type="text/javascript">
3
  /*<![CDATA[*/
10
 
11
  <div class="wrap" id="w3tc">
12
  <?php screen_icon('w3tc-logo'); ?>
13
+
14
+ <h2>W3 Total Cache <span>by W3 EDGE <sup>&reg;</sup></span></h2>
15
+
16
  <?php foreach ($this->_errors as $error): ?>
17
  <div class="error">
18
  <p><?php echo $error; ?></p>
19
  </div>
20
  <?php endforeach; ?>
21
+
22
  <?php foreach ($this->_notes as $note): ?>
23
  <div class="updated fade">
24
  <p><?php echo $note; ?></p>
25
  </div>
26
  <?php endforeach; ?>
27
 
28
+ <h3 id="w3tc-nav">
29
+ <label>
30
+ Viewing:
31
+ <select>
32
+ <optgroup label="Control Panels:">
33
+ <option value="w3tc_general"<?php selected($this->_page, 'w3tc_general'); ?>>General Settings</option>
34
+ <option value="w3tc_pgcache"<?php selected($this->_page, 'w3tc_pgcache'); ?>>Page Cache Settings</option>
35
+ <option value="w3tc_minify"<?php selected($this->_page, 'w3tc_minify'); ?>>Minify Settings</option>
36
+ <option value="w3tc_dbcache"<?php selected($this->_page, 'w3tc_dbcache'); ?>>Database Cache Settings</option>
37
+ <option value="w3tc_objectcache"<?php selected($this->_page, 'w3tc_objectcache'); ?>>Object Cache Settings</option>
38
+ <option value="w3tc_browsercache"<?php selected($this->_page, 'w3tc_browsercache'); ?>>Browser Cache Settings</option>
39
+ <option value="w3tc_mobile"<?php selected($this->_page, 'w3tc_mobile'); ?>>User Agent Groups Settings</option>
40
+ <option value="w3tc_cdn"<?php selected($this->_page, 'w3tc_cdn'); ?>>Content Delivery Network Settings&nbsp;</option>
41
+ </optgroup>
42
+ <optgroup label="Help:">
43
+ <option value="w3tc_faq"<?php selected($this->_page, 'w3tc_faq'); ?>>Frequently Asked Questions</option>
44
+ <option style="color: red;" value="w3tc_support"<?php selected($this->_page, 'w3tc_support'); ?>>Support</option>
45
+ <option value="w3tc_install"<?php selected($this->_page, 'w3tc_install'); ?>>Install</option>
46
+ <option value="w3tc_about"<?php selected($this->_page, 'w3tc_about'); ?>>About</option>
47
+ </optgroup>
48
+ </select>
49
+ </label>
50
+ </h3>
51
+
inc/options/common/help.phtml ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="w3tc-help">
2
+ <p>Request professional <a href="admin.php?page=w3tc_support" style="color: red;"><strong>support</strong></a> or troubleshoot issues using the common questions below:</p>
3
+
4
+ <?php foreach ($columns as $questions): ?>
5
+ <ul>
6
+ <?php foreach ($questions as $question): ?>
7
+ <li>
8
+ <a href="admin.php?page=w3tc_faq#q<?php echo ++$q; ?>"><?php echo $question; ?></a>
9
+ </li>
10
+ <?php endforeach; ?>
11
+ </ul>
12
+ <?php endforeach; ?>
13
+
14
+ <div style="clear: left;"></div>
15
+ </div>
inc/options/dbcache.phtml CHANGED
@@ -1,35 +1,38 @@
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
3
- <h3>Database Caching Settings</h3>
4
-
5
- <form action="options-general.php">
 
 
 
6
  <p>
7
- Database caching is currently <span class="w3tc-<?php if ($dbcache_enabled): ?>enabled">enabled<?php else: ?>disabled">disabled<?php endif; ?></span>.
8
- <input type="submit" name="flush_dbcache" value="Empty cache"<?php if (! $dbcache_enabled): ?> disabled="disabled"<?php endif; ?> class="button" />
9
- <input type="hidden" name="page" value="<?php echo W3TC_FILE; ?>" />
10
- <input type="hidden" name="tab" value="<?php echo $this->_tab; ?>" />
11
  </p>
12
  </form>
13
-
14
- <form action="options-general.php?page=<?php echo urldecode(W3TC_FILE); ?>&amp;tab=<?php echo $this->_tab; ?>" method="post">
15
  <fieldset>
16
  <legend>General</legend>
17
 
18
  <table class="form-table">
19
  <tr>
20
- <th colspan="2">
21
  <input type="hidden" name="dbcache.reject.logged" value="0" />
22
- <label><input type="checkbox" name="dbcache.reject.logged" value="1"<?php checked($this->_config->get_boolean('dbcache.reject.logged'), true); ?> /> Don't cache queries for logged in users</label>
23
- <br /><span class="description">Enabling this option is recommended to allow default WordPress behavior.</span>
24
  </th>
25
  </tr>
26
  </table>
27
-
28
  <p class="submit">
29
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
30
  </p>
31
  </fieldset>
32
-
33
  <fieldset>
34
  <legend>Advanced</legend>
35
 
@@ -39,8 +42,8 @@
39
  <th><label for="memcached_servers">Memcached hostname:port / <acronym title="Internet Protocol">IP</acronym>:port:</label></th>
40
  <td>
41
  <input id="memcached_servers" type="text" name="dbcache.memcached.servers" value="<?php echo htmlspecialchars(implode(',', $this->_config->get_array('dbcache.memcached.servers'))); ?>" size="100" />
42
- <input id="test_memcached" class="button" type="button" value="Test" />
43
- <span id="test_memcached_status" class="w3tc-status w3tc-process"></span>
44
  <br /><span class="description">Multiple servers may be used and seperated by a comma; e.g. 192.168.1.100:11211, domain.com:22122</span>
45
  </td>
46
  </tr>
@@ -57,17 +60,24 @@
57
  <br /><span class="description">If caching to disk, specify how frequently expired cache data is removed. For busy sites, a lower value is best.</span>
58
  </td>
59
  </tr>
 
 
 
 
 
 
 
60
  <tr>
61
  <th valign="top"><label for="dbcache_reject_sql">Ignored query stems:</label></th>
62
  <td>
63
  <textarea id="dbcache_reject_sql" name="dbcache.reject.sql" cols="40" rows="5"><?php echo htmlspecialchars(implode("\r\n", $this->_config->get_array('dbcache.reject.sql'))); ?></textarea><br />
64
- <span class="description">Do not cache queries that contain these terms. Any entered prefix (set in wp-config.php) will be replaced with current database prefix (default: wp_).</span>
65
  </td>
66
  </tr>
67
  </table>
68
-
69
  <p class="submit">
70
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
71
  </p>
72
  </fieldset>
73
  </form>
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
3
+ <form action="admin.php">
4
+ <p>
5
+ Database caching via
6
+ <strong><?php echo w3_get_engine_name($this->_config->get_string('dbcache.engine')); ?></strong>
7
+ is currently <span class="w3tc-<?php if ($dbcache_enabled): ?>enabled">enabled<?php else: ?>disabled">disabled<?php endif; ?></span>.
8
+ </p>
9
  <p>
10
+ To rebuild the database cache use the
11
+ <input type="submit" name="flush_dbcache" value="empty cache"<?php if (! $dbcache_enabled): ?> disabled="disabled"<?php endif; ?> class="button" />
12
+ operation.
13
+ <input type="hidden" name="page" value="<?php echo $this->_page; ?>" />
14
  </p>
15
  </form>
16
+
17
+ <form action="admin.php?page=<?php echo $this->_page; ?>" method="post">
18
  <fieldset>
19
  <legend>General</legend>
20
 
21
  <table class="form-table">
22
  <tr>
23
+ <th>
24
  <input type="hidden" name="dbcache.reject.logged" value="0" />
25
+ <label><input type="checkbox" name="dbcache.reject.logged" value="1"<?php checked($this->_config->get_boolean('dbcache.reject.logged'), true); ?> /> Don't cache queries for logged in users</label>
26
+ <br /><span class="description">Enabling this option is recommended to maintain default WordPress behavior.</span>
27
  </th>
28
  </tr>
29
  </table>
30
+
31
  <p class="submit">
32
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
33
  </p>
34
  </fieldset>
35
+
36
  <fieldset>
37
  <legend>Advanced</legend>
38
 
42
  <th><label for="memcached_servers">Memcached hostname:port / <acronym title="Internet Protocol">IP</acronym>:port:</label></th>
43
  <td>
44
  <input id="memcached_servers" type="text" name="dbcache.memcached.servers" value="<?php echo htmlspecialchars(implode(',', $this->_config->get_array('dbcache.memcached.servers'))); ?>" size="100" />
45
+ <input id="memcached_test" class="button" type="button" value="Test" />
46
+ <span id="memcached_test_status" class="w3tc-status w3tc-process"></span>
47
  <br /><span class="description">Multiple servers may be used and seperated by a comma; e.g. 192.168.1.100:11211, domain.com:22122</span>
48
  </td>
49
  </tr>
60
  <br /><span class="description">If caching to disk, specify how frequently expired cache data is removed. For busy sites, a lower value is best.</span>
61
  </td>
62
  </tr>
63
+ <tr>
64
+ <th valign="top"><label for="dbcache_reject_uri">Never cache the following pages:</label></th>
65
+ <td>
66
+ <textarea id="dbcache_reject_uri" name="dbcache.reject.uri" cols="40" rows="5"><?php echo htmlspecialchars(implode("\r\n", $this->_config->get_array('dbcache.reject.uri'))); ?></textarea><br />
67
+ <span class="description">Always ignore the specified pages / directories.</span>
68
+ </td>
69
+ </tr>
70
  <tr>
71
  <th valign="top"><label for="dbcache_reject_sql">Ignored query stems:</label></th>
72
  <td>
73
  <textarea id="dbcache_reject_sql" name="dbcache.reject.sql" cols="40" rows="5"><?php echo htmlspecialchars(implode("\r\n", $this->_config->get_array('dbcache.reject.sql'))); ?></textarea><br />
74
+ <span class="description">Do not cache queries that contain these terms. Any entered prefix (set in wp-config.php) will be replaced with current database prefix (default: wp_). Query stems can be identified using debug mode.</span>
75
  </td>
76
  </tr>
77
  </table>
78
+
79
  <p class="submit">
80
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
81
  </p>
82
  </fieldset>
83
  </form>
inc/options/faq.phtml CHANGED
@@ -1,581 +1,28 @@
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
3
- <h3><acronym title="Frequently Asked Questions">FAQ</acronym></h3>
4
-
5
  <h4>Table of Contents</h4>
6
 
7
  <div id="toc">
8
- <ul>
9
- <li class="col">
10
- <h5>GENERAL:</h5>
11
- <ul>
12
- <li><a href="#q1">Who is this plugin for?</a></li>
13
- <li><a href="#q2">Umm, why?</a></li>
14
- <li><a href="#q3">So give me the skinny, what are the highlights?</a></li>
15
- <li><a href="#q4">I've never heard of any of this stuff; my blog is fine, no one complains about the speed. Why should I install this?</a></li>
16
- <li><a href="#q5">But even Matt Mullenweg doesn't agree that additional caching is so important, why bother?</a></li>
17
- <li><a href="#q6">And how many years of university do I need to use this thing?</a></li>
18
- <li><a href="#q7">Ok, so the benefits are clear. What exactly is so special about *how* this plugin works?</a></li>
19
- <li><a href="#q8">Why would I want to cache my feeds?</a></li>
20
- <li><a href="#q9">Why would I want to put my <acronym title="JavaScript">JS</acronym> at the bottom of the page?</a></li>
21
- <li><a href="#q10">What's an Etag and why do I need one?</a></li>
22
- <li><a href="#q11">So let me get this straight; you're telling me this plugin is designed to improve performance of any WordPress blog?</a></li>
23
- <li><a href="#q12">This is too good to be true, how can I test the results?</a></li>
24
- <li><a href="#q13">Does this plugin work with WordPress <acronym title="Multi-User">MU</acronym>?</a></li>
25
- <li><a href="#q14">Does this plugin work with BuddyPress (bbPress)?</a></li>
26
- <li><a href="#q15">Which WordPress versions are supported?</a></li>
27
- <li><a href="#q16">I understand the database caching and the page caching, but what's minify all about?</a></li>
28
- <li><a href="#q17">What do you use to minify?</a></li>
29
- <li><a href="#q18">What's the point of downloading and caching 3rd party files (e.g. <acronym title="JavaScript">JS</acronym>)?</a></li>
30
- <!--<li><a href="#q19">Will you support other memory or opcode caches</a>?</li>-->
31
- <li><a href="#q20">Will this plugin break my theme by changing the order of conditional statements or the like?</a></li>
32
- <li><a href="#q21">Will this speed up <acronym title="WordPress">WP</acronym> Admin?</a></li>
33
- <li><a href="#q22">Does this plugin modify how the WordPress core works?</a></li>
34
- <li><a href="#q23">Does it really matter if I remove the line breaks from my code?</a></li>
35
- <li><a href="#q24">What's the benefit of removing <acronym title="Hypertext Markup Language">HTML</acronym> comments from my code?</a></li>
36
- <li><a href="#q25">Why is &lt;link&gt; used to embed <acronym title="Cascading Style Sheet">CSS</acronym> instead of &lt;style&gt;?</a></li>
37
- <li><a href="#q26">Why do I care of <acronym title="JavaScript">JS</acronym> or <acronym title="Cascading Style Sheet">CSS</acronym> is "blocking" or not?</a></li>
38
- <li><a href="#q27">What does this plugin do to inline <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym>?</a></li>
39
- <li><a href="#q28">Ok I get it, this all sounds nice and everything, but is this perfect?</a></li>
40
- <li><a href="#q29">Seriously, tell me what the downside is, there must be something?</a></li>
41
- <li><a href="#q30">If this plugin does everything you claim, why would you give it away free? Cui Bono?</a></li>
42
- <li><a href="#q31">Who in the world uses memcached or opcode caching etc anyway?</a></li>
43
- <li><a href="#q32">I don't understand what a <acronym title="Content Delivery Network">CDN</acronym> has to do with caching, that's completely different, no?</a></li>
44
- <li><a href="#q33">We run many blogs on many servers here at my company, is this plugin still for me?</a></li>
45
- <li><a href="#q34">So you appear to know what you're talking about, will there be any negative effect on my SEO rankings?</a></li>
46
- <li><a href="#q35">Will the plugin interfere with other plugins or widgets?</a></li>
47
- <li><a href="#q36">What about my robots.txt, sitemap.xml and all my site verification files etc, what happens with those?</a></li>
48
- <li><a href="#q37">Do you have any tricks for "post-loading", "lazy-loading" and other render optimizations in this plugin?</a></li>
49
- <li><a href="#q38">I want to obfuscate my <acronym title="JavaScript">JS</acronym>, does the plugin do that? Will it ever?</a></li>
50
- <li><a href="#q39">Can I use packed or obfuscated <acronym title="JavaScript">JS</acronym> with this plugin?</a></li>
51
- <li><a href="#q40">I have some ideas for more features, can I write my own add-ons for your plugin?</a></li>
52
- <li><a href="#q41">Who do I thank for all of this?</a></li>
53
- </ul>
54
- </li>
55
- <li class="col">
56
- <h5>USAGE:</h5>
57
- <ul>
58
- <li><a href="#q42">How do I find the <acronym title="JavaScript">JS</acronym> and <acronym title="Cascading Style Sheet">CSS</acronym> to optimize (minify) them with this plugin?</a></li>
59
- <li><a href="#q43">I've used the plugin to optimize all my theme's <acronym title="JavaScript">JS</acronym> and plugins <acronym title="JavaScript">JS</acronym>, but there are some function calls, where do those go?</a></li>
60
- <li><a href="#q44">Can I use scripts that generate <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> with this plugin?</a></li>
61
- <li><a href="#q93">How do I configure Amazon Simple Storage Service (Amazon <acronym title="Simple Storage Service">S3</acronym>) or Amazon CloudFront as my <acronym title="Content Delivery Network">CDN</acronym>?</a></li>
62
- <li><a href="#q94">How do I use an Origin Pull (Mirror) <acronym title="Content Delivery Network">CDN</acronym>?</a></li>
63
- <li><a href="#q45">In the past, I always had to modify my theme to run dynamic code. Don't I need to do that again for this plugin?</a></li>
64
- <li><a href="#q46">How fast will the cache be updated?</a></li>
65
- <li><a href="#q47">How do I make some specific pages stay dynamic?</a></li>
66
- <li><a href="#q48">What about comments? Does the plugin slow down the rate at which comments appear?</a></li>
67
- <li><a href="#q49">What if I accidentally specify an incorrect path to a <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> file?</a></li>
68
- <li><a href="#q50">Does the plugin automatically remove duplicate <acronym title="JavaScript">JS</acronym>?</a></li>
69
- <li><a href="#q51">I've been using the plugin for some time, I updated one of my other plugins and now it doesn't work anymore. What's up?</a></li>
70
- <!--<li><a href="#q52">I have some <acronym title="Cascading Style Sheet">CSS</acronym> classes with declarations being overwritten or <acronym title="JavaScript">JS</acronym> with dependencies, do I really have to copy and paste all my <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> file settings around?</a></li>-->
71
- <li><a href="#q53">Why does your plugin change the order of my &lt;script&gt; and &lt;link&gt; tags (in the &lt;head&gt;)?</a></li>
72
- <li><a href="#q54">I can't read this minified <acronym title="Hypertext Markup Language">HTML</acronym>; can you give me a break please?</a></li>
73
- <li><a href="#q55">When are you going to translate this plugin into more languages?</a></li>
74
- <li><a href="#q56">I'm not a hardcore developer, can you explain to me how this // and / stuff works and how I should specify the paths for <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> files?</a></li>
75
- <li><a href="#q57">What about Etags?</a></li>
76
- <li><a href="#q58">Which encodings do you support?</a></li>
77
- <li><a href="#q59">What's this thing doing? Where are the statistics?</a></li>
78
- <li><a href="#q60">How can I tell if it's working? Aren't there any statistics at all?</a></li>
79
- <li><a href="#q61">I'm an advanced theme developer and I want to have different combinations of <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> files on different types of pages in my theme; how is this done?</a></li>
80
- <li><a href="#q62">Which features can I use if I haven't yet installed an opcode cache or memcached?</a></li>
81
- <li><a href="#q63">How can I host my favicon with my <acronym title="Content Delivery Network">CDN</acronym>?</a></li>
82
- <li><a href="#q64">Why do you set the value of the media attribute of &lt;link&gt; to all?</a></li>
83
- <li><a href="#q65">Why can't I specify other &lt;script&gt; types or encoding?</a></li>
84
- <li><a href="#q66">My theme doesn't call wp_footer(), how do I set this plugin up?</a></li>
85
- <li><a href="#q67">Is this plugin compatible with other popular caching plugins?</a></li>
86
- <li><a href="#q68">Some WordPress caching plugins fail when markup is not well-formed, is this plugin similar?</a></li>
87
- <li><a href="#q69">Won't various 3rd parties who's <acronym title="JavaScript">JS</acronym> I download and cache be concerned?</a></li>
88
- <li><a href="#q70">Google already minified and <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compressed jQuery (and other libraries ) for me, why can't I just use their bandwidth and embed other code after it?</a></li>
89
- <li><a href="#q71">I wanted to use a different version jQuery with my theme, how do I replace WordPress' jQuery with Google's minified version using your plugin?</a></li>
90
- <li><a href="#q72">What about the files, can those be served from the <acronym title="Content Delivery Network">CDN</acronym>?</a></li>
91
- <li><a href="#q73">What if I don't want to work with a <acronym title="Content Delivery Network">CDN</acronym> right now, is there any other use for this feature?</a></li>
92
- <li><a href="#q74">Are minified files uploaded to my <acronym title="Content Delivery Network">CDN</acronym> provider?</a></li>
93
- <li><a href="#q75">Who do you recommend as a <acronym title="Content Delivery Network">CDN</acronym> provider?</a></li>
94
- <li><a href="#q76">Hang on, don't I need to modify my <acronym title="Cascading Style Sheet">CSS</acronym> files so they'll work on the <acronym title="Content Delivery Network">CDN</acronym>?</a></li>
95
- <li><a href="#q77">I don't have time to deal with this, but I know I need it. Will you help me?</a></li>
96
- <li><a href="#q92">What about query string variables on <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym>, do they matter?</a></li>
97
- <li><a href="#q95">Is this plugin comptatible with GD Star Rating?</a></li>
98
- <li><a href="#q96">How do I cache only the home page?</a></li>
99
- <li><a href="#q97">I see garbage characters instead of the normal web site, what's going on here?</a></li>
100
- <li><a href="#q98">What is the purpose of the "Media Library Import" tool and how do I use it?</a></li>
101
- <li><a href="#q99">I'm getting blank pages or 500 error codes when trying to upgrade on WordPress MU</a></li>
102
- <li><a href="#q100">How can I embed the minified CSS file at the location I choose?</a></li>
103
- <li><a href="#q101">Is this plugin comptatible with TDO Mini Forms?</a></li>
104
- <li><a href="#q102">My YSlow score is low because doesn't recognize my <acronym title="Content Delivery Network">CDN</acronym>, what can I do?</a></li>
105
- <li><a href="#q103">What is the purpose of the "modify attachment <acronym title="Uniform Resource Indicator">URL</acronym>s" button?</a></li>
106
- </ul>
107
- </li>
108
  <li class="col">
109
- <h5>WEB HOSTING &amp; REQUIREMENTS:</h5>
110
- <ul>
111
- <li><a href="#q78">Which web servers do you support?</a></li>
112
- <li><a href="#q79">Do I need to enable mod_gzip, mod_rewrite or install any <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression software on my server?</a></li>
113
- <li><a href="#q80">Is this plugin compatible with varnish or squid?</a></li>
114
- <li><a href="#q81">My server is state of the art with 15,000 <acronym title="Rotations per Minute">RPM</acronym> <acronym title="Redundant Array of Independent Disks">RAID</acronym>, why do I need to cache anything in memory?</a></li>
115
- <li><a href="#q82">Why would I choose an opcode cache over memcached or vice versa?</a></li>
116
- <li><a href="#q83">I already use <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression on my server, why does it matter if I minify my code?</a></li>
117
- <li><a href="#q84">How much memory (<acronym title="Random Access Memory">RAM</acronym>) do I need to delegate to caching?</a></li>
118
- <li><a href="#q85">What version of <acronym title="Hypertext Preprocessor">PHP</acronym> do I need for this thing?</a></li>
119
- <li><a href="#q86">What version of mySQL is needed?</a></li>
120
- <li><a href="#q87">And I need mod_rewrite (or equivalent for my web server) installed too, no?</a></li>
121
- <li><a href="#q88">How much hardware do I have to throw at something like this before I see a benefit?</a></li>
122
- <li><a href="#q89">Is this plugin server cluster and load balancer friendly?</a></li>
123
- <li><a href="#q90">I'm a web hosting provider and I heard about this plugin from my clients, is this plugin safe for a shared hosting environment?</a></li>
124
- <li><a href="#q91">What is the intended impact of this plugin on the web hosting landscape?</a></li>
125
- </ul>
126
  </li>
127
- </ul>
 
128
  </div>
129
  <div id="qa">
130
- <hr />
131
- <p id="q1"><strong>Who is this plugin for?</strong><br />
132
- Anyone that wants to provide an optimal user experience to their readers.</p>
133
- <p align="right"><a href="#toc">back to top</a></p>
134
- <p id="q2"><strong>Umm, why?</strong><br />
135
- We needed an elegant remedy to common performance issues we spent countless hours addressing on various blogs we work with. They all suffered from similar issues and we found that same remedies would sort all of them. Issues like <acronym title="Hypertext Transfer Protocol">HTTP</acronym> transaction reduction, object size reduction and blocking objects are performance killers and have been remedied with this plugin. Rather than release our various plugins individually (and support them independently) we saw an opportunity to demonstrate how all of this functionality is intertwined and combines to realize far more than the sum of its parts.</p>
136
- <p>One of the WordPress community's strengths is also its weakness; we found that numerous plugins are very handy and save some development time in a pinch, but the maintenance and performance penalties blogs suffer from as a result contribute to a poor user experience, which is never acceptable.</p>
137
- <p>Experience has shown that fast loading web sites have (at least) the following characteristics:</p>
138
- <ul>
139
- <li>Reduced <a href="http://en.wikipedia.org/wiki/Customer_attrition" target="_blank">attrition</a></li>
140
- <li>Higher conversion rates for e-commerce / affiliate etc sites</li>
141
- <li>Increased time on site / more page views per visitor</li>
142
- </ul>
143
- <p><em>In fact, if wordpress.com (for example) applied some of the techniques used in this plugin, we imagine they'd realize ~10% performance improvement on the <acronym title="Cascading Style Sheet">CSS</acronym>, <acronym title="JavaScript">JS</acronym> and <acronym title="Hypertext Markup Language">HTML</acronym> (respectively) on the millions of blogs they host.</em></p>
144
- <p>As a practical matter, Akamai and JupiterResearch did a study on <a href="http://www.akamai.com/html/about/press/releases/2006/press_110606.html" target="_blank">acceptable wait time for retail web sites</a> to load back in late 2006 concluding that users may leave after 4 seconds of waiting. That was several years ago now, even before 3G was available for mobile devices, what do you think web users expect today? <a href="http://blogs.zdnet.com/BTL/?p=3925" target="_blank">According to Marissa Mayer</a> of Google, as she stated the same year as Akamai, improving the speed of sites/applications reduces the learning curve for applications and contributes to higher use. It's time to bring the performance major corporations enjoy to the blogosphere.</p>
145
- <p>As an aside, don't you think your site's <acronym title="Key Performance Indicators">KPI</acronym> would be more meaningful if you could be confident that all users were having the exact same performance experience with your site? It's too early to say for sure, but we feel that the statistics and metrics we all use to track our progress and results will be more realistic when W3 Total Cache is actively removing bottlenecks from our blogs.</p>
146
- <p><a href="mailto:wordpressexperts@w3-edge.com">Please let us know</a> what kind of mileage you have.</p>
147
- <p align="right"><a href="#toc">back to top</a></p>
148
- <p id="q3"><strong>So give me the skinny, what are the highlights?</strong><br />
149
- W3 Total Cache is a suite of functionality designed to optimize the performance of all WordPress blogs. Features and benefits include:</p>
150
- <ul>
151
- <li>Improved progressive render (non-blocking <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> embedding)</li>
152
- <li>Reduced <acronym title="Hypertext Transfer Protocol">HTTP</acronym> Transactions, <acronym title="Domain Name System">DNS</acronym> lookups, reduced document load time</li>
153
- <li>Transparent content delivery network (<acronym title="Content Delivery Network">CDN</acronym>) support with automated media library import</li>
154
- <li>Bandwidth savings via <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression (<acronym title="GNU zip">gzip</acronym> / deflate) for <acronym title="Hypertext Markup Language">HTML</acronym>, <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym></li>
155
- <li>Minification (concatenation, white space removal) of inline, external or 3rd party <acronym title="JavaScript">JS</acronym> and <acronym title="Cascading Style Sheet">CSS</acronym> with scheduled updates</li>
156
- <li>Optional embedding of <acronym title="JavaScript">JS</acronym> just above &lt;/body&gt;</li>
157
- <li>Support for caching pages, posts, feeds, database objects, <acronym title="Cascading Style Sheet">CSS</acronym>, <acronym title="JavaScript">JS</acronym> in memory with an opcode cache or memcached or both</li>
158
- <li>Caching of feeds (comments, page and site), <acronym title="Uniform Resource Indicator">URL</acronym>s with query string variables (like search result pages), Database queries, Pages, Posts, <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym></li>
159
- <li>Complete header management including Etags</li>
160
- <li>Increased web server concurrency and reduced resource consumption, increased scale</li>
161
- </ul>
162
- <p>In essence, anything that can be automated to squeeze out every bit of server performance and minimize bandwidth utilization has been done, leaving your readers with an optimized user experience.</p>
163
- <p align="right"><a href="#toc">back to top</a></p>
164
- <p id="q4"><strong>I've never heard of any of this stuff; my blog is fine, no one complains about the speed. Why should I install this?<br />
165
- </strong>Rarely do readers take the time to complain. They typically just stop browsing earlier than you'd prefer and may not return altogether. It's in every web site owner's best interest is to make sure that the performance of your blog is not hindering its success.</p>
166
- <p align="right"><a href="#toc">back to top</a></p>
167
- <p id="q5"><strong>But even Matt Mullenweg doesn't agree that additional caching is so important, why bother?</strong><br />
168
- You're right, <a href="http://ma.tt/2008/03/wordpress-is-open-source/#comment-439787" target="_blank">Matt did say that</a>. However, this plugin provides more than just "caching". Because he is correct, the web is dynamic and must remain so. But as we explain throughout this FAQ, our goal is to improve the performance of any blog. Furthermore, some techniques we use are well documented from past <a href="http://www.slideshare.net/bazza/high-performance-wordpress" target="_blank">WordCamp presentations</a>; we combined them in a way that we have found stands up to the highest traffic spikes.</p>
169
- <p align="right"><a href="#toc">back to top</a></p>
170
- <p id="q6"><strong>And how many years of university do I need to use this thing?</strong><br />
171
- -4 &mdash; That's right; a youngster in junior high school can get started with this plugin. Seriously, if you did your own WordPress install or have ever installed a plugin before you're in good shape. If you need help, <a href="mailto:wordpressexperts@w3-edge.com">let us know</a> or perhaps we'll make some videos or the like.</p>
172
- <p align="right"><a href="#toc">back to top</a></p>
173
- <p id="q7"><strong>Ok, so the benefits are clear. What exactly is so special about *how* this plugin works?</strong><br />
174
- Thanks for asking. We just decided not try to use the typical WordPress hooks and methodologies to implement our features, instead we take the normal output and perform optimizations to it before we send it to the user agent using a method they support and then cache the result afterwards. This concept is applied to objects you decide to cache.</p>
175
- <p align="right"><a href="#toc">back to top</a></p>
176
- <p id="q8"><strong>Why would I want to cache my feeds?</strong><br />
177
- We feel that caching objects after the first request and checking for updates before responding subsequent requests (which is kind of how web browsers work too) creates more opportunities for interesting applications and mashups where the blogosphere doesn't require institutional investment to be able to handle developers making hundreds of requests every day the same way we use Google, Twitter and Facebook (for example) APIs today. Think about it, even when major search engines crawl your site, they have to be "gentle" so they don't bring it down, let's turn the paradigm around so that every blog can deliver content in real-time in various formats.</p>
178
- <p align="right"><a href="#toc">back to top</a></p>
179
- <p id="q9"><strong>Why would I want to put my <acronym title="JavaScript">JS</acronym> at the bottom of the page?</strong><br />
180
- First let me point out that in many cases we suggest putting all the <acronym title="JavaScript">JS</acronym> that's not required for interactivity with your site at the bottom of the document. Anything <acronym title="JavaScript">JS</acronym> that makes the site work as intended we suggested embedding in the &lt;head&gt;. Depending on your specific situation, having the majority of your <acronym title="JavaScript">JS</acronym> at the bottom of the document will mean that your visitors won't have to download things they don't want to begin interacting with your site or reading it's content. Quite often the additional <acronym title="Hypertext Transfer Protocol">HTTP</acronym> transaction is worthwhile.</p>
181
- <p align="right"><a href="#toc">back to top</a></p>
182
- <p id="q10"><strong>What's an Etag and why do I need one?</strong><br />
183
- Entity tags were created to add more reliability to client side caching my providing a simple method for a browser to verify that a file had not changed since last it was downloaded. Using them helps enables your server return 304 or "not modified" responses instead of a 200 "ok" response which are much much slower (because the file is sent). The result is a visitor viewing multiple pages of your site would have that "instant loading" experience that we all definitely enjoy. Don't worry we don't use inodes to create our Etags so this solution is reliable for multi server hosting solutions.</p>
184
- <p align="right"><a href="#toc">back to top</a></p>
185
- <p id="q11"><strong>So let me get this straight; you're telling me this plugin is designed to improve performance of any WordPress blog?</strong><br />
186
- Precisely, that is unless you don't write any posts in your blog nor have any readers. If you're someone that's always into the latest web development technique or plugin, now you can "have it all" without making your readers suffer.</p>
187
- <p align="right"><a href="#toc">back to top</a></p>
188
- <p id="q12"><strong>This is too good to be true, how can I test the results?</strong><br />
189
- You will be able to see it instantly on each page load, but for tangible metrics, consider the following tools:</p>
190
- <ul>
191
- <li><a href="http://www.mozilla.com/firefox/" target="_blank">Mozilla Firefox</a> + <a href="http://getfirebug.com/" target="_blank">Firebug</a> + <a href="http://developer.yahoo.com/yslow/" target="_blank">Yahoo! YSlow</a></li>
192
- <li><a href="http://www.mozilla.com/firefox/" target="_blank">Mozilla Firefox</a> + <a href="http://getfirebug.com/" target="_blank">Firebug</a> + <a href="http://code.google.com/speed/page-speed/" target="_blank">Google Page Speed</a></li>
193
- <li><a href="http://www.mozilla.com/firefox/" target="_blank">Mozilla Firefox</a> + <a href="http://getfirebug.com/" target="_blank">Firebug</a> + <a href="http://stevesouders.com/hammerhead/" target="_blank">Hammerhead</a></li>
194
- <li><a href="http://www.google.com/chrome" target="_blank">Google Chrome</a> + <a href="http://code.google.com/webtoolkit/speedtracer/" target="_blank">Google Speed Tracer</a></li>
195
- </ul>
196
- <ul>
197
- <li><a href="http://tools.pingdom.com/" target="_blank">Pingdom</a></li>
198
- <li><a href="http://www.webpagetest.org/test" target="_blank">WebPagetest</a></li>
199
- <li><a href="http://www.gomez.com/instant-test-pro/" target="_blank">Gomez Instant Test Pro</a></li>
200
- </ul>
201
- <ul>
202
- <li><a href="http://redbot.org/" target="_blank">Resource Expert Droid</a></li>
203
- <li><a href="http://www.procata.com/cachetest/" target="_blank">Web Caching Tests</a></li>
204
- <li><a href="http://www.port80software.com/tools/compresscheck.asp" target="_blank">Port80 Compression Check</a> (minify requires <acronym title="Microsoft Internet Explorer">MSIE</acronym>6 support to be enabled)</li>
205
- <li><a href="http://www.gidnetwork.com/tools/gzip-test.php" target="_blank">A simple online web page compression / deflate / <acronym title="GNU zip">gzip</acronym> test tool</a></li>
206
- </ul>
207
- <p align="right"><a href="#toc">back to top</a></p>
208
- <p id="q13"><strong>Does this plugin work with WordPress <acronym title="Multi-User">MU</acronym>?</strong><br />
209
- Indeed it does.</p>
210
- <p align="right"><a href="#toc">back to top</a></p>
211
- <p id="q14"><strong>Does this plugin work with BuddyPress (bbPress)?</strong><br />
212
- Yes.</p>
213
- <p align="right"><a href="#toc">back to top</a></p>
214
- <p id="q15"><strong>Which WordPress versions are supported?</strong><br />
215
- To use all features in the suite, a minimum version of 2.6 is required. Earlier versions will benefit from our Media Library Importer to get them back on the upgrade path and into a <acronym title="Content Delivery Network">CDN</acronym> of their choosing.</p>
216
- <p align="right"><a href="#toc">back to top</a></p>
217
- <p id="q16"><strong>I understand the database caching and the page caching, but what's minify all about?</strong><br />
218
- We'll just quote the fine folks at yahoo on this one:</p>
219
- <blockquote>
220
- <p>"Minification is the practice of removing unnecessary characters from code to reduce its size thereby improving load times. When code is minified all comments are removed, as well as unneeded white space characters (space, newline, and tab). In the case of JavaScript, this improves response time performance because the size of the downloaded file is reduced. Two popular tools for minifying JavaScript code are <a href="http://www.crockford.com/javascript/jsmin.html" target="_blank"><acronym title="JavaScript">JS</acronym>Min</a> and <a href="http://developer.yahoo.com/yui/compressor/" target="_blank"><acronym title="Yahoo! User Interface">YUI</acronym> Compressor</a>. The <acronym title="Yahoo! User Interface">YUI</acronym> compressor can also minify <acronym title="Cascading Style Sheet">CSS</acronym>.</p>
221
- <p>Obfuscation is an alternative optimization that can be applied to source code. It's more complex than minification and thus more likely to generate bugs as a result of the obfuscation step itself. In a survey of ten top U.S. web sites, minification achieved a 21% size reduction versus 25% for obfuscation. Although obfuscation has a higher size reduction, minifying JavaScript is less risky.</p>
222
- <p>In addition to minifying external scripts and styles, inline &lt;script&gt; and &lt;style&gt; blocks can and should also be minified. Even if you <acronym title="GNU zip">gzip</acronym> your scripts and styles, minifying them will still reduce the size by 5% or more. As the use and size of JavaScript and <acronym title="Cascading Style Sheet">CSS</acronym> increases so will the savings gained by minifying your code."</p>
223
- <cite><a href="http://developer.yahoo.com/performance/rules.html#minify" target="_blank">developer.yahoo.com</a></cite> </blockquote>
224
- <p align="right"><a href="#toc">back to top</a></p>
225
- <p id="q17"><strong>What do you use to minify?</strong><br />
226
- We use: <a href="http://code.google.com/p/minify/" target="_blank">minify</a> but may support various engines in the future. Based on <a href="http://ejohn.org/" target="_blank">John Resig's</a> suggestion we're currently looking at <a href="http://yuilibrary.com/projects/yuicompressor/wiki" target="_blank"><acronym title="Yahoo! User Interface">YUI</acronym> Compressor</a> and <a href="http://code.google.com/closure/compiler/" target="_blank">Google Closure Compiler</a> (for JavaScript) also.</p>
227
- <p align="right"><a href="#toc">back to top</a></p>
228
- <p id="q18"><strong>What's the point of downloading and caching 3rd party files (e.g. <acronym title="JavaScript">JS</acronym>)?</strong><br />
229
- With the various hosted 3rd party applications available (from web site statistics to social media sharing widgets), the problems we've noticed are: additional <acronym title="Hypertext Transfer Protocol">HTTP</acronym> transactions, <acronym title="Domain Name System">DNS</acronym> lookups and latencies from busy servers that we can't control and often un-minified files with no <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression all add up to a very slow page load and poor user experience. With your own copy of external files, updated as frequently as you wish, none of these problems exist.</p>
230
- <p align="right"><a href="#toc">back to top</a></p>
231
- <!--
232
- <p id="q19"><strong>Will you support other memory or </strong><a href="http://en.wikipedia.org/wiki/PHP_accelerator" target="_blank"><strong>opcode caches</strong></a><strong>?</strong><br />
233
- Possibly, we just <a href="mailto:wordpressexperts@w3-edge.com">need to know which</a> others are popular in the WordPress community and we will address them.</p>
234
- <p align="right"><a href="#toc">back to top</a></p>
235
- -->
236
- <p id="q20"><strong>Will this plugin break my theme by changing the order of conditional statements or the like?</strong><br />
237
- No, the plugin looks for conditional statements in your markup used for <acronym title="Cascading Style Sheet">CSS</acronym> (and sometimes <acronym title="JavaScript">JS</acronym>) and makes sure that the minified files precede it, so keep that in mind.</p>
238
- <p align="right"><a href="#toc">back to top</a></p>
239
- <p id="q21"><strong>Will this speed up <acronym title="WordPress">WP</acronym> Admin?</strong><br />
240
- Yes, indirectly &mdash; if you have a lot of bloggers working with you, you will find that it feels like you have a server dedicated only to <acronym title="WordPress">WP</acronym> Admin once this plugin is enabled; the result, increased productivity.</p>
241
- <p align="right"><a href="#toc">back to top</a></p>
242
- <p id="q22"><strong>Does this plugin modify how the WordPress core works?</strong><br />
243
- No. No theme changes, special files, WordPress core file modifications or special permissions need to be set.</p>
244
- <p align="right"><a href="#toc">back to top</a></p>
245
- <p id="q23"><strong>Does it really matter if I remove the line breaks from my code?</strong><br />
246
- Definitely. Removing white space from your files make <acronym title="GNU zip">gzip</acronym> and deflate (<acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression) more effective.</p>
247
- <p align="right"><a href="#toc">back to top</a></p>
248
- <p id="q24"><strong>What's the benefit of removing <acronym title="Hypertext Markup Language">HTML</acronym> comments from my code?</strong><br />
249
- Many developers like to have comments in the code for various reasons, however these comments add no value from the blog readers (or search engine for that matter) point of view and only contribute to increased load time and wasted bandwidth as a result. Now only you can use them and view them in your site (as a logged in administrator viewing the page source), which is really what (we assume) you intended.</p>
250
- <p align="right"><a href="#toc">back to top</a></p>
251
- <p id="q25"><strong>Why is &lt;link&gt; used to embed <acronym title="Cascading Style Sheet">CSS</acronym> instead of &lt;style&gt;?</strong><br />
252
- &lt;link&gt; is a non-blocking method to embed <acronym title="Cascading Style Sheet">CSS</acronym> into a document. We recommend this approach for optimal performance.</p>
253
- <p align="right"><a href="#toc">back to top</a></p>
254
- <p id="q26"><strong>Why do I care of <acronym title="JavaScript">JS</acronym> or <acronym title="Cascading Style Sheet">CSS</acronym> is "blocking" or not?</strong><br />
255
- In the case of objects (files) you don't host yourself, this could add several seconds to your page's load time as the <acronym title="Domain Name System">DNS</acronym> lookups, <acronym title="Hypertext Transfer Protocol">HTTP</acronym> transaction roundtrip times and wait times add up. Even when all the scripts are hosted locally, the same adversities exist. Since all objects in the &lt;head&gt; of a document have to be ready before the page can be rendered, having them load in a parallel fashion as opposed to linear (or near linear) gives night and day results.</p>
256
- <p align="right"><a href="#toc">back to top</a></p>
257
- <p id="q27"><strong>What does this plugin do to inline <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym>?</strong><br />
258
- Nothing yet. We're evaluating use cases to deal with common issues (like inline <acronym title="Cascading Style Sheet">CSS</acronym> for tag clouds for example).</p>
259
- <p align="right"><a href="#toc">back to top</a></p>
260
- <p id="q28"><strong>Ok I get it, this all sounds nice and everything, but is this perfect?</strong><br />
261
- Pretty much. If you monetize your blog with ads you will want to spend some time making sure that the ad code works well with your optimization settings. There are also the occasional pieces of code that conflict with the others and have to be in a specific order to work well, but that's not a problem that this plugin introduces.</p>
262
- <p align="right"><a href="#toc">back to top</a></p>
263
- <p id="q29"><strong>Seriously, tell me what the downside is, there must be something?</strong><br />
264
- Well, no there isn't. Installing the server side software might be challenging for some, but <a href="mailto:wordpressexperts@w3-edge.com">we can assist</a> with that if you ask. Other than that, unless you enjoy frequently upgrading your server plan or buying more servers and paying for bandwidth overages or wincing every time you add another "must have" plugin to your blog, we cannot find any reason to deter you from the use of this one.</p>
265
- <p align="right"><a href="#toc">back to top</a></p>
266
- <p id="q30"><strong>If this plugin does everything you claim, why would you give it away free? Cui Bono?</strong><br />
267
- Who benefits? Everyone. Of the numerous, here are the three the most important reasons we share with the WordPress community:</p>
268
- <ul>
269
- <li>WordPress is free and high quality, plugins should be too.</li>
270
- <li>There's no reason your blog shouldn't be able to perform as well as well as any major corporation's web site/application.</li>
271
- <li><a href="http://code.google.com/speed/articles/" target="_blank">Google</a> and <a href="http://developer.yahoo.com/yui/" target="_blank">Yahoo</a> offer quite a bit, but they did not offer a WordPress solution yet. This is our contribution to speeding up the web (starting with the blogosphere).</li>
272
- </ul>
273
- <p align="right"><a href="#toc">back to top</a></p>
274
- <p id="q31"><strong>Who in the world uses memcached or an opcode cache etc anyway?</strong><br />
275
- Great question! Basically anyone that needs to make their application scale. For example, <a href="http://www.wordpress.com/" target="_blank">WordPress.com</a>, <a href="http://twitter.com" target="_blank">Twitter</a>, <a href="http://www.facebook.com/" target="_blank">Facebook</a>, LiveJournal (the inventors of the software) and so on all use some sort of memory cache to increase application performance.</p>
276
- <p align="right"><a href="#toc">back to top</a></p>
277
- <p id="q32"><strong>I don't understand what a <acronym title="Content Delivery Network">CDN</acronym> has to do with caching, that's completely different, no?</strong><br />
278
- Technically no, a <acronym title="Content Delivery Network">CDN</acronym> is a high performance cache that stores static assets (your theme files, media library etc) in various locations throughout the world in order to provide low latency access to them by readers in those regions. So indeed a <acronym title="Content Delivery Network">CDN</acronym> is a high performance cache, many of which actually store your frequently requested assets in memory for fastest possible response.</p>
279
- <p align="right"><a href="#toc">back to top</a></p>
280
- <p id="q33"><strong>We run many blogs on many servers here at my company, is this plugin still for me?</strong><br />
281
- Yes, especially if you have a cluster and many WordPress installations or a WordPress <acronym title="Multi-User">MU</acronym> installation, then plugin is for you. It will allow you to move easily from multiple installations to WordPress <acronym title="Multi-User">MU</acronym> and continue to use multiple <acronym title="Hypertext Transfer Protocol">HTTP</acronym>, Database, Network Attached Storage etc servers in any configuration you wish. You can also specify as many memcached servers as you wish, although you cannot yet delegate a memcached server to a specific type of caching, i.e. there's no pool management yet.</p>
282
- <p align="right"><a href="#toc">back to top</a></p>
283
- <p id="q34"><strong>So you appear to know what you're talking about, will there be any negative effect on my SEO rankings?</strong><br />
284
- To answer, first we must assume that you're using all of the options we offer: <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression, minify etc. Having said that, we are only sending compressed data to user agents that support it; even <a href="http://www.google.com/search?q=search+engine+crawler+http+compression" target="_blank">most search engine crawlers do</a>. As for minified <acronym title="Hypertext Markup Language">HTML</acronym>, this is essentially how crawlers see your page anyway when they download it. So no, there's no penalty or compromise.</p>
285
- <p>Fact of the matter, there was a time when the semantics and size of your <acronym title="Hypertext Markup Language">HTML</acronym> file (code-to-content ratio), was a factor in a more favorable ranking. <a href="http://microformats.org/wiki/posh" target="_blank"><acronym title="Plain Old Semantic HTML">POSH</acronym></a> <acronym title="Hypertext Markup Language">HTML</acronym> has always been preferred by search engines. In some markets this may still be true, so give the search engines what they want.</p>
286
- <p align="right"><a href="#toc">back to top</a></p>
287
- <p id="q35"><strong>Will the plugin interfere with other plugins or widgets?</strong><br />
288
- No, on the contrary if you use the minify settings you will improve their performance by several times.</p>
289
- <p align="right"><a href="#toc">back to top</a></p>
290
- <p id="q36"><strong>What about my robots.txt, sitemap.xml and all my site verification files etc, what happens with those?</strong><br />
291
- If you're concerned about what happens with these when the <acronym title="Content Delivery Network">CDN</acronym> functionality is active, nothing does. You do not want or need these files moved from their original locations and <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression (or minification for that matter) is of no consequence in most cases.</p>
292
- <p align="right"><a href="#toc">back to top</a></p>
293
- <p id="q37"><strong>Do you have any tricks for "post-loading", "lazy-loading" and other render optimizations in this plugin?</strong><br />
294
- Yes we do, we're currently evaluating if they are best introduced into this plugin or as standalones. Feel free to <a href="mailto:wordpressexperts@w3-edge.com">chime in</a>.</p>
295
- <p align="right"><a href="#toc">back to top</a></p>
296
- <p id="q38"><strong>I want to obfuscate my <acronym title="JavaScript">JS</acronym>, does the plugin do that? Will it ever?</strong><br />
297
- No the plugin will not do that and it's unlikely that we'll support that.</p>
298
- <p align="right"><a href="#toc">back to top</a></p>
299
- <p id="q39"><strong>Can I use packed or obfuscated <acronym title="JavaScript">JS</acronym> with this plugin?</strong><br />
300
- Yes and no. In general, packed <acronym title="JavaScript">JS</acronym> cannot be minified reliably. Obfuscated <acronym title="JavaScript">JS</acronym> also is hit or miss. A minified and <acronym title="GNU zip">gzip</acronym>ped <acronym title="JavaScript">JS</acronym> file will be smaller than a packed file in any case, so using the (uncompressed, unpacked or un obfuscated) developer versions of your plugins is no longer a concern when using this plugin. Alternatively, you can use the non-blocking embed option to continue to use your packed or obfuscated file without minification.</p>
301
- <p align="right"><a href="#toc">back to top</a></p>
302
- <p id="q40"><strong>I have some ideas for more features, can I write my own add-ons for your plugin?</strong><br />
303
- Not yet, we are considering support for add-ons. Meanwhile, please <a href="mailto:wordpressexperts@w3-edge.com">reach out to us</a> and let us know what you think would benefit the community.</p>
304
- <p align="right"><a href="#toc">back to top</a></p>
305
- <p id="q41"><strong>Who do I thank for all of this?</strong><br />
306
- It's quite difficult to recall all of the innovators that have shared their thoughts, code and experiences in the blogosphere over the years, but here are some names to get you started:</p>
307
- <ul>
308
- <li><a href="http://stevesouders.com/" target="_blank">Steve Souders</a></li>
309
- <li><a href="http://mrclay.org/" target="_blank">Steve Clay</a></li>
310
- <li><a href="http://wonko.com/" target="_blank">Ryan Grove</a></li>
311
- <li><a href="http://www.nczonline.net/blog/2009/06/23/loading-javascript-without-blocking/" target="_blank">Nicholas Zakas</a> </li>
312
- <li><a href="http://rtdean.livejournal.com/" target="_blank">Ryan Dean</a></li>
313
- <li><a href="http://gravitonic.com/" target="_blank">Andrei Zmievski</a></li>
314
- <li>George Schlossnagle</li>
315
- <li>Daniel Cowgill</li>
316
- <li><a href="http://toys.lerdorf.com/" target="_blank">Rasmus Lerdorf</a></li>
317
- <li><a href="http://t3.dotgnu.info/" target="_blank">Gopal Vijayaraghavan</a></li>
318
- <li><a href="http://eaccelerator.net/" target="_blank">Bart Vanbraban</a></li>
319
- <li><a href="http://xcache.lighttpd.net/" target="_blank">mOo</a></li>
320
- </ul>
321
- <p>Please reach out to all of these people and support their projects if you're so inclined.</p>
322
- <p align="right"><a href="#toc">back to top</a></p>
323
- <p id="q42"><strong>How do I find the <acronym title="JavaScript">JS</acronym> and <acronym title="Cascading Style Sheet">CSS</acronym> to optimize (minify) them with this plugin?</strong><br />
324
- View your page source in your browser and search for any &lt;style&gt;, &lt;link&gt; or &lt;script&gt; tags that contain external <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> files and one by one add them to the minify settings page. Do not include any <acronym title="Cascading Style Sheet">CSS</acronym> in conditional statements (unless you know what you are doing) like:</p>
325
- <p>&lt;!--[if lte IE 8]&gt;&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/wp-content/themes/default/lte.css&quot; media=&quot;screen,projection&quot; /&gt;&lt;![endif]--&gt;</p>
326
- <p>The plugin will combine, minify, <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compress and check for updates to these files automatically from now on. If you have any <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> that are inline consider making them external files so that you can use them with minify.</p>
327
- <p align="right"><a href="#toc">back to top</a></p>
328
- <p id="q43"><strong>I've used the plugin to optimize all my theme's <acronym title="JavaScript">JS</acronym> and plugins <acronym title="JavaScript">JS</acronym>, but there are some function calls, where do those go?</strong><br />
329
- Just place them above &lt;/head&gt; if that's where your embed is done or above &lt;/body&gt; if that's where you need them. Wherever they need to be to be called after the <acronym title="JavaScript">JS</acronym> that needs them, it'll be fine.</p>
330
- <p align="right"><a href="#toc">back to top</a></p>
331
- <p id="q44"><strong>Can I use scripts that generate <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> with this plugin?</strong><br />
332
- Yes you can, but since there are numerous ways to do so, so be sure to test your results carefully. Having said that we do encourage it as it will mean that less processing has to be done to deliver your pages.</p>
333
- <p align="right"><a href="#toc">back to top</a></p>
334
- <p id="q93"><strong>How do I configure Amazon Simple Storage Service (Amazon <acronym title="Simple Storage Service">S3</acronym>) or Amazon CloudFront as my <acronym title="Content Delivery Network">CDN</acronym>?</strong><br />
335
- First <a href="http://aws.amazon.com/" target="_blank">create an <acronym title="Simple Storage Service">S3</acronym> account</a>. Next, you need to obtain your "Access key" and "Secret key" from the "Access Credentials" section of the "<a href="http://aws-portal.amazon.com/gp/aws/developer/account/index.html?action=access-key" target="_blank">Security Credentials</a>" page of "My Account." Make sure the status is "active." Next, make sure that "Amazon Simple Storage Service (Amazon <acronym title="Simple Storage Service">S3</acronym>)" is the selected type of <acronym title="Content Delivery Network">CDN</acronym> on the General Settings tab (if not change the setting and save the changes). Now on the <acronym title="Content Delivery Network">CDN</acronym> Settings tab enter your "Access key," "Secret key" and create a bucket. Click the "Test <acronym title="Simple Storage Service">S3</acronym> Upload" button and make sure that the test is successful, if not check your settings and try again. </p>
336
- <p>Save your settings. Make sure that you export your media library, upload your wp-includes (WordPress core files) theme files, and custom files if you wish to host each of those with <acronym title="Amazon Web Services">AWS</acronym>. Unless you wish to use CloudFront, you're almost done, skip to the next paragraph if you're using CloudFront. Just go to the General Settings tab and click the checkbox and save the settings to enable <acronym title="Content Delivery Network">CDN</acronym> functionality and empty the cache for the changes to take effect.</p>
337
- <p>To use CloudFront, perform all of the steps above, except select the "Amazon CloudFront" <acronym title="Content Delivery Network">CDN</acronym> type in the <acronym title="Content Delivery Network">CDN</acronym> section of the General Settings tab. Proceed to the <a href="https://console.aws.amazon.com/cloudfront/" target="_blank"><acronym title="Amazon Web Services">AWS</acronym> Management Console</a> and create a new distribution: select the <acronym title="Simple Storage Service">S3</acronym> Bucket you created earlier as the "Origin," enter a <a href="http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/index.html?CNAMEs.html" target="_blank">CNAME</a> if you wish to add one to your <acronym title="Domain Name System">DNS</acronym> Zone. Make sure that "Distribution Status" is enabled and "State" is deployed. Now on <acronym title="Content Delivery Network">CDN</acronym> Settings tab of the plugin, copy the subdomain found in the <acronym title="Amazon Web Services">AWS</acronym> Management Console and enter the CNAME used for the distribution in the "CNAME" field.</p>
338
- <p>Now go to the General Settings tab and click the checkbox and save the settings to enable <acronym title="Content Delivery Network">CDN</acronym> functionality and empty the cache for the changes to take effect.</p>
339
- <p align="right"><a href="#toc">back to top</a></p>
340
- <p id="q94"><strong>How do I use an Origin Pull (Mirror) <acronym title="Content Delivery Network">CDN</acronym>?</strong><br />
341
- Login to your <acronym title="Content Delivery Network">CDN</acronym> providers control panel or account management area. Following any set up steps they provide, create a new "pull zone" or "bucket" for your site's domain name. If there's a set up wizard or any troubleshooting tips your provider offers, be sure to review them. In the <acronym title="Content Delivery Network">CDN</acronym> Settings tab of the plugin, enter the hostname your <acronym title="Content Delivery Network">CDN</acronym> provider provided in the "replace site's hostname with" field. You should always do a quick check by opening a test file from the <acronym title="Content Delivery Network">CDN</acronym> hostname, e.g. http://cdn.domain.com/favicon.ico. Troubleshoot with yoru <acronym title="Content Delivery Network">CDN</acronym> provider until this test is successful.</p>
342
- <p>Now go to the General Settings tab and click the checkbox and save the settings to enable <acronym title="Content Delivery Network">CDN</acronym> functionality and empty the cache for the changes to take effect.</p>
343
- <p align="right"><a href="#toc">back to top</a></p>
344
- <p id="q45"><strong>In the past, I always had to modify my theme to run dynamic code. Don't I need to do that again for this plugin?</strong><br />
345
- For now no; there are some special cases that we will address with an upcoming release for highly dynamic sites.</p>
346
- <p align="right"><a href="#toc">back to top</a></p>
347
- <p id="q46"><strong>How fast will the cache be updated?</strong><br />
348
- Items expire from the cache at a rate that you specify. As far as how fast changes appear to your visitors, they appear instantly in most cases and if you're an administrator who's logged in they will always be immediately visible.</p>
349
- <p align="right"><a href="#toc">back to top</a></p>
350
- <p id="q47"><strong>How do I make some specific pages stay dynamic?</strong><br />
351
- They never stop being dynamic, we just don't create pages that have not been changed. If you have a page that updated frequently in your blog before, it will still remain up-to-date at all times.</p>
352
- <p align="right"><a href="#toc">back to top</a></p>
353
- <p id="q48"><strong>What about comments? Does the plugin slow down the rate at which comments appear?</strong><br />
354
- On the contrary, as with any other action a user can perform on a site, faster performance will encourage more of it. The cache is so quickly rebuilt in memory that it's no trouble to show visitors the most current version of a post that's experiencing Digg, Slashdot, Drudge Report, Yahoo Buzz or Twitter effect.</p>
355
- <p align="right"><a href="#toc">back to top</a></p>
356
- <p id="q49"><strong>What if I accidentally specify an incorrect path to a <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> file?</strong><br />
357
- Unfortunately a 400 bad request error may be generated. So use the "Check <acronym title="Uniform Resource Indicator">URI</acronym>" button to make sure that you have entered the correct <acronym title="Uniform Resource Indicator">URL</acronym> or path to the file.</p>
358
- <p align="right"><a href="#toc">back to top</a></p>
359
- <p id="q50"><strong>Does the plugin automatically remove duplicate <acronym title="JavaScript">JS</acronym>?</strong><br />
360
- No. If you include a script in the minfy settings twice or it already exists in your theme we do not automatically remove the extra code. That's tricky business and it's better for us to just let you make the decisions conscientiously.</p>
361
- <p align="right"><a href="#toc">back to top</a></p>
362
- <p id="q51"><strong>I've been using the plugin for some time, I updated one of my other plugins and now it doesn't work anymore. What's up?</strong><br />
363
- It's likely the plugin author modified their <acronym title="JavaScript">JS</acronym> or <acronym title="Cascading Style Sheet">CSS</acronym> in the new release and any old <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> you optimized with our plugin has introduced duplicate code as a result (creating a conflict). Simply check out the source code, identify any new <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> and update your <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> optimizations our plugin and you're good to go.</p>
364
- <!--
365
- <p id="q52" align="right"><a href="#toc">back to top</a></p>
366
- <p><strong>I have some <acronym title="Cascading Style Sheet">CSS</acronym> classes with declarations being overwritten or <acronym title="JavaScript">JS</acronym> with dependencies, do I really have to copy and paste all my <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> file settings around?</strong><br />
367
- No, you can drag and drop them into the desired order on the minify settings page.</p>-->
368
- <p align="right"><a href="#toc">back to top</a></p>
369
- <p id="q53"><strong>Why does your plugin change the order of my &lt;script&gt; and &lt;link&gt; tags (in the &lt;head&gt;)?</strong><br />
370
- Steve Souders <a href="http://www.youtube.com/watch?v=oaxZtKAlLRk" target="_blank">identified</a> that placing inline scripts between <acronym title="JavaScript">JS</acronym> and <acronym title="Cascading Style Sheet">CSS</acronym> embeds creates a blocking situation, so we're try to help you avoid that. If you'd like to experiment with various scenarios related specifically to your blog, we recommend Steve's tool, <a href="http://stevesouders.com/cuzillion/" target="_blank">Cuzillion</a>. Have some beneficial input on other common cases for WordPress users? <a href="mailto:wordpressexperts@w3-edge.com">Reach out to us</a>.</p>
371
- <p align="right"><a href="#toc">back to top</a></p>
372
- <p id="q54"><strong>I can't read this minified <acronym title="Hypertext Markup Language">HTML</acronym>; can you give me a break please?</strong><br />
373
- Happy to! Login as an administrator, go to the Minify Settings page and check off "Show un-minified pages to administrators" and save the changes. Now stay logged in as an administrator in the same browser you used to change the settings and now when you view the source of a given page in the site, the source will not be minified.</p>
374
- <p align="right"><a href="#toc">back to top</a></p>
375
- <p id="q55"><strong>When are you going to translate this plugin into more languages?</strong><br />
376
- When you help us! :-) Localization is tricky and we're happy to work with those willing to support the WordPress community. We will most likely follow the <a href="http://en.wordpress.com/stats/" target="_blank">trends of WordPress</a> itself to determine which languages are addressed first.</p>
377
- <p align="right"><a href="#toc">back to top</a></p>
378
- <p id="q56"><strong>I'm not a hardcore developer, can you explain to me how this // and / stuff works and how I should specify the paths for <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> files?</strong><br />
379
- You mean on the minify settings page right? Ok, it's simple:<br />
380
- // tells the plugin to search for the file with the provided path from the document root, e.g.: ///JS/jquery/jquery.<acronym title="JavaScript">JS</acronym><br />
381
- / tells the plugin to search for the file with the provided path from the server root, e.g. //JS/jquery/jquery.<acronym title="JavaScript">JS</acronym></p>
382
- <p>In most cases providing an absolute path is sufficient and most reliable. You can of course use relative paths, but we discourage it unless you really know what you are doing.</p>
383
- <p align="right"><a href="#toc">back to top</a></p>
384
- <p id="q57"><strong>What about Etags?</strong><br />
385
- Yes, we have Etags covered. Even if you have a clustered hosting environment, your <a href="http://en.wikipedia.org/wiki/HTTP_ETag" target="_blank">Etags</a> will be consistent (across multiple servers in your cluster) so you don't have to worry about using special session cookies when you introduce our plugin. If you would like to specify headers for various reasons, you can do that as well.</p>
386
- <p align="right"><a href="#toc">back to top</a></p>
387
- <p id="q58"><strong>Which encodings do you support?</strong><br />
388
- We recommend UTF-8, but we do not modify the encoding in any files, instead we simply return the code as it is provided.</p>
389
- <p align="right"><a href="#toc">back to top</a></p>
390
- <p id="q59"><strong>What's this thing doing? Where are the statistics?</strong><br />
391
- Right now we do not show the statistics in <acronym title="WordPress">WP</acronym> Admin, but soon we will provide graphs of: Page Cache Memory Use, Page Cache Hits/Misses, <acronym title="Database">DB</acronym> Cache Memory Use, <acronym title="Database">DB</acronym> Hits/Misses, Average Page Compression Savings, Average <acronym title="Cascading Style Sheet">CSS</acronym> Compression Savings, Average <acronym title="JavaScript">JS</acronym> Compression Savings, Average Requests per Second, and Average Page Execution Time.</p>
392
- <p align="right"><a href="#toc">back to top</a></p>
393
- <p id="q60"><strong>How can I tell if it's working? Aren't there any statistics at all?</strong><br />
394
- Well yes actually there are, simply enable debug mode on the general settings tab to have details appended to the bottom of your <acronym title="Hypertext Markup Language">HTML</acronym> source. Remember that when enabled all visitors to your blog can see these statistics if they view source. Using debug mode does slow the performance of your site so use sparingly.</p>
395
- <p id="q61"><strong>I'm an advanced theme developer and I want to have different combinations of <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> files on different types of pages in my theme; how is this done?</strong><br />
396
- On the minify settings tab, use the drop-down selection menu to define the <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> files that appear on all pages using the "Default" group first. Then specify unie files for the other pages.</p>
397
- <p align="right"><a href="#toc">back to top</a></p>
398
- <p id="q62"><strong>Which features can I use if I haven't yet installed an opcode cache or memcached?</strong><br />
399
- Memory caching will not be possible. However you will be able to use both the page cache and minify in "disk" mode, as well <acronym title="Content Delivery Network">CDN</acronym> functionality without issue.</p>
400
- <p align="right"><a href="#toc">back to top</a></p>
401
- <p id="q63"><strong>How can I host my favicon with my <acronym title="Content Delivery Network">CDN</acronym>?</strong><br />
402
- If the file exists in your document root (i.e. http://domain.com/favicon.ico), the plugin can take care of that for you using custom upload options. If the file is in your theme directory you can also have the plugin uploaded from there.</p>
403
- <p align="right"><a href="#toc">back to top</a></p>
404
- <p id="q64"><strong>Why do you set the value of the media attribute of &lt;link&gt; to all?</strong><br />
405
- In case you were using @media declarations in your document, we'd have you covered. We will likely allow you to modify this attribute as subsequent features are finalized.</p>
406
- <p align="right"><a href="#toc">back to top</a></p>
407
- <p id="q65"><strong>Why can't I specify other &lt;script&gt; types or encoding?</strong><br />
408
- We have not found a use case where this appears to be of any consequence. If you're aware of one <a href="mailto:wordpressexperts@w3-edge.com">please let us know</a>.</p>
409
- <p align="right"><a href="#toc">back to top</a></p>
410
- <p id="q66"><strong>My theme doesn't call wp_footer() or wp_head(), how do I set this plugin up?</strong><br />
411
- You'll need to manually update your theme to include your <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> minify groups. The calls you'll want to make for the various cases are:</p>
412
- <ul>
413
- <li>&lt;?php if (function_exists('w3tc_styles')): w3tc_styles('include'); endif; ?&gt;<br />
414
- Inserts the &lt;head&gt; <acronym title="Cascading Style Sheet">CSS</acronym> group at the location you choose. Multiple occurrences are allowed.</li>
415
- <li>&lt;?php if (function_exists('w3tc_scripts')): w3tc_scripts('include'); endif; ?&gt;<br />
416
- Inserts the &lt;head&gt; blocking <acronym title="JavaScript">JS</acronym> group at the location you choose.</li>
417
- <li>&lt;?php if (function_exists('w3tc_scripts')): w3tc_scripts('include-nb'); endif; ?&gt;<br />
418
- Inserts the &lt;head&gt; non-blocking <acronym title="JavaScript">JS</acronym> groups at the location you choose.</li>
419
- <li>&lt;?php if (function_exists('w3tc_scripts')): w3tc_scripts('include');w3tc_scripts('include-nb'); endif; ?&gt;<br />
420
- Inserts both the blocking and non-blocking &lt;head&gt; <acronym title="JavaScript">JS</acronym> group at the location you choose.</li>
421
- <li>&lt;?php if (function_exists('w3tc_scripts')): w3tc_scripts('include-footer'); endif; ?&gt;<br />
422
- Inserts the footer <acronym title="JavaScript">JS</acronym> group at the location you choose.</li>
423
- <li>&lt;?php if (function_exists('w3tc_scripts')): w3tc_scripts('include-footer-nb'); endif; ?&gt;<br />
424
- Inserts the footer non-blocking <acronym title="JavaScript">JS</acronym> group at the location you choose.</li>
425
- <li>&lt;?php if (function_exists('w3tc_scripts')): w3tc_scripts('include-footer');w3tc_scripts('include-footer-nb'); endif; ?&gt;<br />
426
- Inserts both the blocking and non-blocking <acronym title="JavaScript">JS</acronym> groups at the location you choose.</li>
427
- </ul>
428
- <p align="right"><a href="#toc">back to top</a></p>
429
- <p id="q67"><strong>Is this plugin compatible with other popular caching plugins?</strong><br />
430
- No. Any disk based page caching plugin you're currently using would need to be completely uninstalled (not just disabled) in order to use this plugin. So if you have a development environment where you can try this out or testing during low traffic periods to get your preferences set, that is recommended. You can always backup your full WordPress installation before testing pretty quickly if you skip the /uploads/ (media library) directory.</p>
431
- <p align="right"><a href="#toc">back to top</a></p>
432
- <p id="q68"><strong>Some WordPress caching plugins fail when markup is not well-formed, is this plugin similar?</strong><br />
433
- No, this plugin is not similar. While valid <acronym title="Hypertext Markup Language">HTML</acronym> and <acronym title="World Wide Web Consortium">W3C</acronym> standards ensure consistent behavior across user agents and promote accessibility, any invalidity that exist in the code is not going to bring your site to its knees.</p>
434
- <p align="right"><a href="#toc">back to top</a></p>
435
- <p id="q69"><strong>Won't various 3rd parties who's <acronym title="JavaScript">JS</acronym> I download and cache be concerned?</strong><br />
436
- Unlikely, you're saving them bandwidth and using their applications, so they will probably appreciate it as long as their application still works as intended and you're using their software in an authorized manner. Look at it this way, even before this plugin, you and thousands of other people were still downloading it, now you're just downloading it first.</p>
437
- <p align="right"><a href="#toc">back to top</a></p>
438
- <p id="q70"><strong>Google already minified and <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compressed jQuery (and other libraries ) for me, why can't I just use their bandwidth and embed other code after it?</strong><br />
439
- You can! Just add Google's script to your minify settings use non-blocking mode and your visitors will download jQuery directly from them as you wish. And the same is obviously true for any other library you wish. Remember you are creating additional <acronym title="Domain Name System">DNS</acronym> Lookups and <acronym title="Hypertext Transfer Protocol">HTTP</acronym> transactions when you do this.</p>
440
- <p align="right"><a href="#toc">back to top</a></p>
441
- <p id="q71"><strong>I wanted to use a different version jQuery with my theme, how do I replace WordPress' jQuery with Google's minified version using your plugin?</strong><br />
442
- Currently you cannot, replacement is not yet supported.</p>
443
- <p align="right"><a href="#toc">back to top</a></p>
444
- <p id="q72"><strong>What about the wp-includes files, can those be served from the <acronym title="Content Delivery Network">CDN</acronym>?</strong><br />
445
- Yes, you can specify which file types you would like served by <acronym title="Content Delivery Network">CDN</acronym> and they will be uploaded and always downloaded from that location. This includes the smilies, JavaScript files et al. By default we take care of them all.</p>
446
- <p align="right"><a href="#toc">back to top</a></p>
447
- <p id="q73"><strong>What if I don't want to work with a <acronym title="Content Delivery Network">CDN</acronym> right now, is there any other use for this feature?</strong><br />
448
- Yes! You can take advantage of the <a href="http://www.mozilla.org/projects/netlib/http/pipelining-faq.html">pipelining</a> support in some browsers by creating a sub-domain for the static content for your site. So you could select the "Origin Push / Self-hosted" method of the General Settings tab. Create static.domain.com on your server (and update your <acronym title="Domain Name System">DNS</acronym> zone) and then specify the <acronym title="File Transfer Protocol">FTP</acronym> details for it in the plugin configuration panel and you're done. If you disable the scripting options on your server you'll find that your server will actually respond slightly faster from that sub-domain because it's just sending files and not processing them.</p>
449
- <p align="right"><a href="#toc">back to top</a></p>
450
- <p id="q74"><strong>Are minified files uploaded to my <acronym title="Content Delivery Network">CDN</acronym> provider?</strong><br />
451
- Yes, any <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> you manage with the plugin are minified before being uploaded to your <acronym title="Content Delivery Network">CDN</acronym>. You don't have to make any special changes to your theme. We encourage you to make sure that your provider supports <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression as the benefit of having your static assets available from more than one <acronym title="Point of Presence">POP</acronym> alone is not enough.</p>
452
- <p align="right"><a href="#toc">back to top</a></p>
453
- <p id="q75"><strong>Who do you recommend as a <acronym title="Content Delivery Network">CDN</acronym> provider?</strong><br />
454
- That depends on how you use your blog and where most of your readers read your blog (regionally). Here's a short list:</p>
455
- <ul>
456
- <li><a href="http://bit.ly/acaXXt" target="_blank">MaxCDN</a></li>
457
- <li><a href="http://bit.ly/9hpX8T" target="_blank">Rackspace Cloud Files</a></li>
458
- <li><a href="http://bit.ly/bnVs0a" target="_blank">Cotendo</a></li>
459
- <li><a href="http://bit.ly/d5hfFt" target="_blank">VPS NET</a></li>
460
- <li><a href="http://bit.ly/ao1sGt" target="_blank">Cloudfront</a></li>
461
- <li><a href="http://bit.ly/bIjSWC" target="_blank">EdgeCast</a></li>
462
- <li><a href="http://bit.ly/a5GBLV" target="_blank">Akamai</a></li>
463
- <li><a href="http://bit.ly/aCW04j" target="_blank">Limelight Networks</a></li>
464
- <li><a href="http://bit.ly/93EAKK" target="_blank">Simple<acronym title="Content Delivery Network">CDN</acronym></a></li>
465
- </ul>
466
- <p align="right"><a href="#toc">back to top</a></p>
467
- <p id="q76"><strong>Hang on, don't I need to modify my <acronym title="Cascading Style Sheet">CSS</acronym> files so they'll work on the <acronym title="Content Delivery Network">CDN</acronym>?</strong><br />
468
- No, that is taken care of for you. Your <acronym title="Cascading Style Sheet">CSS</acronym> files will originate from your <acronym title="Content Delivery Network">CDN</acronym> provider and all paths to any images in your <acronym title="Cascading Style Sheet">CSS</acronym> will be changed from relative to absolute, making sure that they load just fine. Do nothing differently, yet reap all the benefits.</p>
469
- <p align="right"><a href="#toc">back to top</a></p>
470
- <p id="q77"><strong>I don't have time to deal with this, but I know I need it. Will you help me?</strong><br />
471
- Yes! Please <a href="mailto:wordpressexperts@w3-edge.com">reach out to us</a> and we'll get you acclimated so you can "set it and forget it."</p>
472
- <p align="right"><a href="#toc">back to top</a></p>
473
- <p id="q92"><strong>What about query string variables on <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym>, do they matter?</strong><br />
474
- This is definitely a special case. Files like "http://domain.com/wp-content/themes/default/js/script.js?ver=20090102" etc need to be specified with the full <acronym title="Uniform Resource Locator">URL</acronym>. This is an exception to the general rule of specifying a local path to file like: "wp-content/themes/default/js/script.js", which should also work fine. Be sure to click the "Verify <acronym title="Uniform Resource Indicator">URL</acronym>" button to be sure that everything is ok before saving changes.</p>
475
- <p align="right"><a href="#toc">back to top</a></p>
476
- <p id="q95"><strong>Is this plugin comptatible with GD Star Rating?</strong><br />
477
- Yes. Follow these steps:</p>
478
- <ol>
479
- <li>Enable dynamic loading of ratings by checking GD Star Rating -> Settings -> Features "Cache support option"</li>
480
- <li>If Database cache enabled in W3 Total Cache add "wp_gdsr" to "Ignored query stems" field in the Database Cache settings tab, otherwise ratings will not updated after voting</li>
481
- <li>Empty all caches</li>
482
- </ol>
483
- <p align="right"><a href="#toc">back to top</a></p>
484
- <p id="q96"><strong>How do I cache only the home page?</strong><br />
485
- Add "/.+" (without the quotes) to page cache "Never cache the following pages" option on the page cache settings tab.</p>
486
- <p align="right"><a href="#toc">back to top</a></p>
487
- <p id="q97"><strong>I see garbage characters instead of the normal web site, what's going on here?</strong><br />
488
- If a theme or it's files use the call php_flush() or function flush() that will interfere with the plugins normal operation; making the plugin send cached files before essential operations have finished. The flush() call is no longer necessary and should be removed.</p>
489
- <p align="right"><a href="#toc">back to top</a></p>
490
- <p id="q98"><strong>What is the purpose of the "Media Library Import" tool and how do I use it?</strong><br />
491
- The media library import tool is for old or "messy" WordPress installations that have attachments (images etc in posts or pages) scattered about the web server or "hot linked" to 3rd party sites instead of properly using the media library.</p>
492
- <p>The tool will scan your posts and pages for the cases above and copy them to your media library, update your posts to use the link addresses and produce a .htaccess file containing the list of of permanent redirects, so search engines can find the files in their new location.</p>
493
- <p>You should backup your database before performing this operation.</p>
494
- <p align="right"><a href="#toc">back to top</a></p>
495
- <p id="q99"><strong>I'm getting blank pages or 500 error codes when trying to upgrade on WordPress MU</strong><br />
496
- First, make sure the plugin is not active (disabled) site-wide. Then make sure it's deactivated site-wide. Now you should be able to successful upgrade without breaking your site.</p>
497
- <p align="right"><a href="#toc">back to top</a></p>
498
- <p id="q100"><strong>How can I embed the minified CSS file at the location I choose?</strong></p>
499
- <ul>
500
- <li>&lt;?php if (function_exists('w3tc_styles')){w3tc_styles('include');} ?&gt;<br />
501
- Inserts the minified CSS files at the location you specify in your theme. More than one instance per template is ok; e.g. embedding in multiple conditional statements.</li>
502
- </ul>
503
- <p align="right"><a href="#toc">back to top</a></p>
504
- <p id="q101"><strong>Is this plugin comptatible with TDO Mini Forms?</strong><br />
505
- Captcha and recaptcha will work fine, however you will need to prevent any pages with forms from being cached. Add the page's URI to the "Never cache the following pages" box on the Page Cache Settings tab.</p>
506
- <p align="right"><a href="#toc">back to top</a></p>
507
- <p id="q102"><strong>My YSlow score is low because it doesn't recognize my <acronym title="Content Delivery Network">CDN</acronym>, what can I do?</strong><br />
508
- Rule 2 says to use a content delivery network (<acronym title="Content Delivery Network">CDN</acronym>). The score for this rule is computed by checking the hostname of each component against the list of known <acronym title="Content Delivery Network">CDN</acronym>s. Unfortunately, the list of "known <acronym title="Content Delivery Network">CDN</acronym>s" are the ones used by Yahoo!. Most likely these are not relevant to your web site, except for potentially yui.yahooapis.com. If you want an accurate score for your web site, you can add your <acronym title="Content Delivery Network">CDN</acronym> hostnames to YSlow using Firefox's preferences. Here are the steps to follow:</p>
509
- <ul>
510
- <li>Go to about:config in Firefox. You'll see the current list of preferences.</li>
511
- <li>Right-click in the window and choose New and String to create a new string preference.</li>
512
- <li>Enter extensions.yslow.cdnHostnames for the preference name.</li>
513
- <li>For the string value, enter the hostname of your <acronym title="Content Delivery Network">CDN</acronym>, for example, mycdn.com. Do not use quotes. If you have multiple <acronym title="Content Delivery Network">CDN</acronym> hostnames, separate them with commas.</li>
514
- </ul>
515
- <p>If you specify <acronym title="Content Delivery Network">CDN</acronym> hostnames in your preferences, they'll be shown under the details for Rule 2 in the Performance view.</p>
516
- <p align="right"><a href="#toc">back to top</a></p>
517
- <p id="q103"><strong>What is the purpose of the "modify attachment <acronym title="Uniform Resource Indicator">URL</acronym>s" button?</strong><br />
518
- If the domain name of your site has changed, this tool is useful in updating your posts and pages to use the current addresses. For example, if your site used to be www.domain.com, and you decided to change it to domain.com, the result would either be many "broken" images or many unncessary redirects (which slow down the visitor's browsing experience). You can use this tool to correct this and similar cases. Correcting the <acronym title="Uniform Resource Indicator">URL</acronym>s of your images also allows the plugin to do a better job of determining which images are actually hosted with the <acronym title="Content Delivery Network">CDN</acronym></p>
519
- <p>As always, it never hurts to back up your database first.</p>
520
- <p align="right"><a href="#toc">back to top</a></p>
521
- <p id="q78"><strong>Which web servers do you support?</strong><br />
522
- We are aware of no incompatibilities with <a href="http://httpd.apache.org/" target="_blank">apache</a> 1.3+, <a href="http://www.iis.net/" target="_blank">IIS</a> 5+ or <a href="http://litespeedtech.com/products/webserver/overview/" target="_blank">litespeed</a> 4.0.2+. If there's a web server you feel we should be actively testing (e.g. <a href="http://www.lighttpd.net/" target="_blank">lighttpd</a>), we're <a href="mailto:wordpressexperts@w3-edge.com">interested in hearing</a>.</p>
523
- <p align="right"><a href="#toc">back to top</a></p>
524
- <p id="q79"><strong>Do I need to enable mod_gzip, mod_rewrite or install any <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression software on my server?</strong><br />
525
- No, but we do find that it does help some rich internet applications to compress their AJAX responses, so you might look at it just for that case.</p>
526
- <p>If you're larger organization or a web hosting company, consider looking into solutions that exist like <a href="http://www.gear6.com/">Gear6</a> which could be useful now that you have a plugin that makes management memcached pain free.</p>
527
- <p align="right"><a href="#toc">back to top</a></p>
528
- <p id="q80"><strong>Is this plugin compatible with varnish or squid?</strong><br />
529
- Yes, it is compatible with <a href="http://varnish.projects.linpro.no/" target="_blank">varnish</a>.</p>
530
- <p align="right"><a href="#toc">back to top</a></p>
531
- <p id="q81"><strong>My server is state of the art with 15,000 RPM RAID, why do I need to cache anything in memory?</strong><br />
532
- Even if your server was using an array of solid state disks (SSD), your server's <acronym title="Random Access Memory">RAM</acronym> is still going to be faster and introduce less overhead to access than even the fastest solid state drives on a PCIe bus. If you didn't invest in solid state disks for your server, then even worse off - at least an order of magnitude speed difference in read operations in <acronym title="Random Access Memory">RAM</acronym> versus HDD. For write operations delta the latency differences is even more pronounced. <acronym title="Random Access Memory">RAM</acronym> is the winner hands down. We won't even discuss the blocking and arbitration issues that happen with disk arrays under certain circumstances.</p>
533
- <p align="right"><a href="#toc">back to top</a></p>
534
- <p id="q82"><strong>Why would I choose opcode caching over memcached or vice versa?</strong><br />
535
- There's no straight answer for this one. Since WordPress is a PHP-based application, we encourage everyone to install an opcode cache and realize a minimum of 10x performance gain. It will obviously make our plugin faster as well, so again please check out the installation instructions if you do not already use an opcode cache. Once installed, you can select an opcode cache as the method and get back to blogging.</p>
536
- <p>Opcode caching does have a couple weaknesses:</p>
537
- <ul>
538
- <li>If you frequently restart your web server (e.g. apache) especially during high traffic periods, you will lose your cache and your site will slow down as it rebuilds the cache (which happens very quickly). However if you use memcached you would not lose your cache if your web server is restarted.</li>
539
- <li>More importantly, opcode caching is best suited for single server environments because the cache is only accessible to the local server, it cannot be shared with other servers in a multi-server (cluster) environment.</li>
540
- </ul>
541
- <p>It would appear that using <acronym title="Alternative PHP Cache">APC</acronym> database caching, but your mileage may vary. So depending on what software you install and how you manage your server, you can choose the options to fit your needs. If you need help with the install on your dedicated or virtual dedicated linux-based server ask us!</p>
542
- <p align="right"><a href="#toc">back to top</a></p>
543
- <p id="q83"><strong>I already use <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression on my server, why does it matter if I minify my code?</strong><br />
544
- Let's say you had a file of 10240 bytes, which becomes 2048 bytes when compressed, savings of ~80% (typical for <acronym title="Cascading Style Sheet">CSS</acronym> files). That same file will now have an <strong>additional</strong> ~3x-10x transfer speed improvement when minified. That's a big return from a small operation. The larger your files, the more significant the proportional performance gains.</p>
545
- <p align="right"><a href="#toc">back to top</a></p>
546
- <p id="q84"><strong>How much memory (<acronym title="Random Access Memory">RAM</acronym>) do I need to delegate to caching?</strong><br />
547
- Probably the hardest question of all. At the time of this writing the default WordPress install and theme will consume about 50MB of memory in an opcode cache while running our plugin. Keep in mind that the following factors will determine the minimum size of your cache beyond this noted 50MB:</p>
548
- <ul>
549
- <li>Number of typically requested pages per day (if your blog is popular this number is quite large)</li>
550
- <li>Size of minified <acronym title="Cascading Style Sheet">CSS</acronym>, <acronym title="JavaScript">JS</acronym> and <acronym title="Hypertext Markup Language">HTML</acronym> pages (smaller is better)</li>
551
- <li>Number and complexity of plugins active on your blog (fewer is better)</li>
552
- <li>Expiry time of the cache (larger expiry time, larger cache)</li>
553
- </ul>
554
- <p>So we recommend an absolute minimum of 128MB for a typical blog; this figure is greater than some defaults, so keep that in mind. With statistics you'll be able to react accordingly and make adjustments.</p>
555
- <p>For those that don't want or have time to learn anything new to get started, sample configuration files are included with the plugin containing inline comments for you.</p>
556
- <p align="right"><a href="#toc">back to top</a></p>
557
- <p id="q85"><strong>What version of <acronym title="Hypertext Preprocessor">PHP</acronym> do I need for this thing?</strong><br />
558
- Version 4.3 is supported for some modules, however version 5 preferred (it's much much faster especially with an opcode cache). It is likely version 3.0 of WordPress will no longer support <acronym title="Hypertext Preprocessor">PHP</acronym> 4.3.</p>
559
- <p align="right"><a href="#toc">back to top</a></p>
560
- <p id="q86"><strong>What version of mySQL is needed?</strong><br />
561
- If your WordPress installation is works, you're all set.</p>
562
- <p align="right"><a href="#toc">back to top</a></p>
563
- <p id="q87"><strong>And I need mod_rewrite (or equivalent for my web server) installed too, no?</strong><br />
564
- That's correct; everything you need for WordPress (i.e. fancy <acronym title="Uniform Resource Locator">URL</acronym>s) will get you started with this plugin also.</p>
565
- <p align="right"><a href="#toc">back to top</a></p>
566
- <p id="q88"><strong>How much hardware do I have to throw at something like this before I see a benefit?</strong><br />
567
- This plugin was actually designed with virtual dedicated servers in mind. As long as your server has at least 256M of <acronym title="Random Access Memory">RAM</acronym>, you can get started.</p>
568
- <p align="right"><a href="#toc">back to top</a></p>
569
- <p id="q89"><strong>Is this plugin server cluster and load balancer friendly?</strong><br />
570
- Yes, built from the ground up with scale and current hosting paradigms in mind.</p>
571
- <p align="right"><a href="#toc">back to top</a></p>
572
- <p id="q90"><strong>I'm a web hosting provider and I heard about this plugin from my clients, is this plugin safe for a shared hosting environment?<br />
573
- </strong>Yes.</p>
574
- <p align="right"><a href="#toc">back to top</a></p>
575
- <p id="q91"><strong>What is the intended impact of this plugin on the web hosting landscape?</strong><br />
576
- We feel that shared or virtual hosting providers will begin offering secure containers (similar to what <a href="http://mediatemple.net/" target="_blank">mediatemple.net</a> does for mySQL and Ruby etc) for opcode caching and memcached. Whoever brings this offering to market first will lower the bar for more web sites/applications (and startups) to build better performing applications with greater ease. The same hosting provider would also possess a new value added service, thereby realizing a competitive advantage in a highly competitive marketplace. Not to mention be able to increase the density of domains per server (or cluster) without shortchanging customers.</p>
577
- <p>One day hopefully this plugin will contribute to making web servers greener and reduce the ecological footprint of the web by reducing the computational effort required to deliver high performance rich user experiences.</p>
578
- <p align="right"><a href="#toc">back to top</a></p>
579
  </div>
580
 
581
  <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
 
 
3
  <h4>Table of Contents</h4>
4
 
5
  <div id="toc">
6
+ <ul>
7
+ <?php $q = 1; foreach ($xpath->query('//faqs/section') as $section): ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  <li class="col">
9
+ <h5><?php echo strtoupper($section->attributes->getNamedItem('name')->nodeValue); ?>:</h5>
10
+ <ul>
11
+ <?php foreach ($xpath->query('./entry/question', $section) as $entry): ?>
12
+ <li><a href="#q<?php echo $q; ?>"><?php echo $entry->nodeValue; ?></a></li>
13
+ <?php $q++; endforeach; ?>
14
+ </ul>
 
 
 
 
 
 
 
 
 
 
 
15
  </li>
16
+ <?php endforeach; ?>
17
+ </ul>
18
  </div>
19
  <div id="qa">
20
+ <hr />
21
+ <?php $q = 1; foreach ($xpath->query('//faqs/section/entry') as $entry): ?>
22
+ <p id="q<?php echo $q; ?>"><strong><?php echo $xpath->query('question', $entry)->item(0)->nodeValue; ?></strong></p>
23
+ <?php echo $xpath->query('answer', $entry)->item(0)->nodeValue; ?>
24
+ <p align="right"><a href="#toc">back to top</a></p>
25
+ <?php $q++; endforeach; ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  </div>
27
 
28
  <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
inc/options/faq.xml ADDED
@@ -0,0 +1,701 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <faqs>
3
+ <section name="General">
4
+ <entry>
5
+ <question><![CDATA[ Who is this plugin for? ]]></question>
6
+ <answer><![CDATA[ <p>Anyone that wants to provide an optimal user experience to their readers.</p> ]]></answer>
7
+ </entry>
8
+ <entry>
9
+ <question><![CDATA[ Umm, why? ]]></question>
10
+ <answer><![CDATA[
11
+ <p>We needed an elegant remedy to common performance issues we spent countless hours addressing on various blogs we work with. They all suffered from similar issues and we found that same remedies would sort all of them. Issues like <acronym title="Hypertext Transfer Protocol">HTTP</acronym> transaction reduction, object size reduction and blocking objects are performance killers and have been remedied with this plugin. Rather than release our various plugins individually (and support them independently) we saw an opportunity to demonstrate how all of this functionality is intertwined and combines to realize far more than the sum of its parts.</p>
12
+ <p>One of the WordPress community's strengths is also its weakness; we found that numerous plugins are very handy and save some development time in a pinch, but the maintenance and performance penalties blogs suffer from as a result contribute to a poor user experience, which is never acceptable.</p>
13
+ <p>Experience has shown that fast loading web sites have (at least) the following characteristics:</p>
14
+ <ul>
15
+ <li>Reduced <a href="http://en.wikipedia.org/wiki/Customer_attrition" target="_blank">attrition</a></li>
16
+ <li>Higher conversion rates for e-commerce / affiliate etc sites</li>
17
+ <li>Increased time on site / more page views per visitor</li>
18
+ </ul>
19
+ <p><em>In fact, if wordpress.com (for example) applied some of the techniques used in this plugin, we imagine they'd realize ~10% performance improvement on the <acronym title="Cascading Style Sheet">CSS</acronym>, <acronym title="JavaScript">JS</acronym> and <acronym title="Hypertext Markup Language">HTML</acronym> (respectively) on the millions of blogs they host.</em></p>
20
+ <p>As a practical matter, Akamai and JupiterResearch did a study on <a href="http://www.akamai.com/html/about/press/releases/2006/press_110606.html" target="_blank">acceptable wait time for retail web sites</a> to load back in late 2006 concluding that users may leave after 4 seconds of waiting. That was several years ago now, even before 3G was available for mobile devices, what do you think web users expect today? <a href="http://blogs.zdnet.com/BTL/?p=3925" target="_blank">According to Marissa Mayer</a> of Google, as she stated the same year as Akamai, improving the speed of sites/applications reduces the learning curve for applications and contributes to higher use. It's time to bring the performance major corporations enjoy to the blogosphere.</p>
21
+ <p>As an aside, don't you think your site's <acronym title="Key Performance Indicators">KPI</acronym> would be more meaningful if you could be confident that all users were having the exact same performance experience with your site? It's too early to say for sure, but we feel that the statistics and metrics we all use to track our progress and results will be more realistic when W3 Total Cache is actively removing bottlenecks from our blogs.</p>
22
+ <p><a href="mailto:wordpressexperts@w3-edge.com">Please let us know</a> what kind of mileage you have.</p>
23
+ ]]></answer>
24
+ </entry>
25
+ <entry>
26
+ <question><![CDATA[ So give me the skinny, what are the highlights? ]]></question>
27
+ <answer><![CDATA[
28
+ <p>W3 Total Cache is a suite of functionality designed to optimize the performance of all WordPress blogs. Features and benefits include:</p>
29
+ <ul>
30
+ <li>Improved progressive render (non-blocking <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> embedding)</li>
31
+ <li>Reduced <acronym title="Hypertext Transfer Protocol">HTTP</acronym> Transactions, <acronym title="Domain Name System">DNS</acronym> lookups, reduced document load time</li>
32
+ <li>Transparent content delivery network (<acronym title="Content Delivery Network">CDN</acronym>) support with automated media library import</li>
33
+ <li>Bandwidth savings via <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression (<acronym title="GNU zip">gzip</acronym>) for <acronym title="Hypertext Markup Language">HTML</acronym>, <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym></li>
34
+ <li>Minification (concatenation, white space removal) of inline, external or 3rd party <acronym title="JavaScript">JS</acronym> and <acronym title="Cascading Style Sheet">CSS</acronym> with scheduled updates</li>
35
+ <li>Optional embedding of <acronym title="JavaScript">JS</acronym> just above &lt;/body&gt;</li>
36
+ <li>Support for caching pages, posts, feeds, database objects, <acronym title="Cascading Style Sheet">CSS</acronym>, <acronym title="JavaScript">JS</acronym> in memory with an opcode cache or memcached or both</li>
37
+ <li>Caching of feeds (comments, page and site), <acronym title="Uniform Resource Indicator">URL</acronym>s with query string variables (like search result pages), Database queries, Pages, Posts, <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym></li>
38
+ <li>Complete header management including Etags</li>
39
+ <li>Increased web server concurrency and reduced resource consumption, increased scale</li>
40
+ </ul>
41
+ <p>In essence, anything that can be automated to squeeze out every bit of server performance and minimize bandwidth utilization has been done, leaving your readers with an optimized user experience.</p> ]]></answer>
42
+ </entry>
43
+ <entry>
44
+ <question><![CDATA[ I've never heard of any of this stuff; my blog is fine, no one complains about the speed. Why should I install this? ]]></question>
45
+ <answer><![CDATA[ <p>Rarely do readers take the time to complain. They typically just stop browsing earlier than you'd prefer and may not return altogether. It's in every web site owner's best interest is to make sure that the performance of your blog is not hindering its success.</p> ]]></answer>
46
+ </entry>
47
+ <entry>
48
+ <question><![CDATA[ But even Matt Mullenweg doesn't agree that additional caching is so important, why bother? ]]></question>
49
+ <answer><![CDATA[ <p>You're right, <a href="http://ma.tt/2008/03/wordpress-is-open-source/#comment-439787" target="_blank">Matt did say that</a>. However, this plugin provides more than just "caching". Because he is correct, the web is dynamic and must remain so. But as we explain throughout this FAQ, our goal is to improve the performance of any blog. Furthermore, some techniques we use are well documented from past <a href="http://www.slideshare.net/bazza/high-performance-wordpress" target="_blank">WordCamp presentations</a>; we combined them in a way that we have found stands up to the highest traffic spikes.</p> ]]></answer>
50
+ </entry>
51
+ <entry>
52
+ <question><![CDATA[ And how many years of university do I need to use this thing? ]]></question>
53
+ <answer><![CDATA[ <p>-4 &mdash; That's right; a youngster in junior high school can get started with this plugin. Seriously, if you did your own WordPress install or have ever installed a plugin before you're in good shape. If you need help, <a href="mailto:wordpressexperts@w3-edge.com">let us know</a> or perhaps we'll make some videos or the like.</p> ]]></answer>
54
+ </entry>
55
+ <entry>
56
+ <question><![CDATA[ Ok, so the benefits are clear. What exactly is so special about *how* this plugin works? ]]></question>
57
+ <answer><![CDATA[ <p>Thanks for asking. We just decided not try to use the typical WordPress hooks and methodologies to implement our features, instead we take the normal output and perform optimizations to it before we send it to the user agent using a method they support and then cache the result afterwards. This concept is applied to objects you decide to cache.</p> ]]></answer>
58
+ </entry>
59
+ <entry>
60
+ <question><![CDATA[ Why would I want to cache my feeds? ]]></question>
61
+ <answer><![CDATA[ <p>We feel that caching objects after the first request and checking for updates before responding subsequent requests (which is kind of how web browsers work too) creates more opportunities for interesting applications and mashups where the blogosphere doesn't require institutional investment to be able to handle developers making hundreds of requests every day the same way we use Google, Twitter and Facebook (for example) <acronym title="Application Programming Interface">API</acronym>s today. Think about it, even when major search engines crawl your site, they have to be "gentle" so they don't bring it down, let's turn the paradigm around so that every blog can deliver content in real-time in various formats.</p> ]]></answer>
62
+ </entry>
63
+ <entry>
64
+ <question><![CDATA[ Why would I want to put my <acronym title="JavaScript">JS</acronym> at the bottom of the page? ]]></question>
65
+ <answer><![CDATA[ <p>First let me point out that in many cases we suggest putting all the <acronym title="JavaScript">JS</acronym> that's not required for interactivity with your site at the bottom of the document. Anything <acronym title="JavaScript">JS</acronym> that makes the site work as intended we suggested embedding in the &lt;head&gt;. Depending on your specific situation, having the majority of your <acronym title="JavaScript">JS</acronym> at the bottom of the document will mean that your visitors won't have to download things they don't want to begin interacting with your site or reading it's content. Quite often the additional <acronym title="Hypertext Transfer Protocol">HTTP</acronym> transaction is worthwhile.</p> ]]></answer>
66
+ </entry>
67
+ <entry>
68
+ <question><![CDATA[ What's an Etag and why do I need one? ]]></question>
69
+ <answer><![CDATA[ <p>Entity tags were created to add more reliability to client side caching my providing a simple method for a browser to verify that a file had not changed since last it was downloaded. Using them helps enables your server return 304 or "not modified" responses instead of a 200 "ok" response which are much much slower (because the file is sent). The result is a visitor viewing multiple pages of your site would have that "instant loading" experience that we all definitely enjoy. Don't worry we don't use inodes to create our Etags so this solution is reliable for multi server hosting solutions.</p> ]]></answer>
70
+ </entry>
71
+ <entry>
72
+ <question><![CDATA[ So let me get this straight; you're telling me this plugin is designed to improve performance of any WordPress blog? ]]></question>
73
+ <answer><![CDATA[ <p>Precisely, that is unless you don't write any posts in your blog nor have any readers. If you're someone that's always into the latest web development technique or plugin, now you can "have it all" without making your readers suffer.</p> ]]></answer>
74
+ </entry>
75
+ <entry>
76
+ <question><![CDATA[ This is too good to be true, how can I test the results? ]]></question>
77
+ <answer><![CDATA[
78
+ <p>You will be able to see it instantly on each page load, but for tangible metrics, consider the following tools:</p>
79
+ <ul>
80
+ <li><a href="http://www.mozilla.com/firefox/" target="_blank">Mozilla Firefox</a> + <a href="http://getfirebug.com/" target="_blank">Firebug</a> + <a href="http://developer.yahoo.com/yslow/" target="_blank">Yahoo! YSlow</a></li>
81
+ <li><a href="http://www.mozilla.com/firefox/" target="_blank">Mozilla Firefox</a> + <a href="http://getfirebug.com/" target="_blank">Firebug</a> + <a href="http://code.google.com/speed/page-speed/" target="_blank">Google Page Speed</a></li>
82
+ <li><a href="http://www.mozilla.com/firefox/" target="_blank">Mozilla Firefox</a> + <a href="http://getfirebug.com/" target="_blank">Firebug</a> + <a href="http://stevesouders.com/hammerhead/" target="_blank">Hammerhead</a></li>
83
+ <li><a href="http://www.google.com/chrome" target="_blank">Google Chrome</a> + <a href="http://code.google.com/webtoolkit/speedtracer/" target="_blank">Google Speed Tracer</a></li>
84
+ </ul>
85
+ <ul>
86
+ <li><a href="http://tools.pingdom.com/" target="_blank">Pingdom</a></li>
87
+ <li><a href="http://www.webpagetest.org/test" target="_blank">WebPagetest</a></li>
88
+ <li><a href="http://www.gomez.com/instant-test-pro/" target="_blank">Gomez Instant Test Pro</a></li>
89
+ </ul>
90
+ <ul>
91
+ <li><a href="http://redbot.org/" target="_blank">Resource Expert Droid</a></li>
92
+ <li><a href="http://www.procata.com/cachetest/" target="_blank">Web Caching Tests</a></li>
93
+ <li><a href="http://www.port80software.com/tools/compresscheck.asp" target="_blank">Port80 Compression Check</a> (minify requires <acronym title="Microsoft Internet Explorer">MSIE</acronym>6 support to be enabled)</li>
94
+ <li><a href="http://www.gidnetwork.com/tools/gzip-test.php" target="_blank">A simple online web page compression / deflate / <acronym title="GNU zip">gzip</acronym> test tool</a></li>
95
+ </ul>
96
+ ]]></answer>
97
+ </entry>
98
+ <entry>
99
+ <question><![CDATA[ Does this plugin work with WordPress <acronym title="Multi-User">MU</acronym>? ]]></question>
100
+ <answer><![CDATA[ <p>Indeed it does.</p> ]]></answer>
101
+ </entry>
102
+ <entry>
103
+ <question><![CDATA[ Does this plugin work with BuddyPress (bbPress)? ]]></question>
104
+ <answer><![CDATA[ <p>Yes.</p> ]]></answer>
105
+ </entry>
106
+ <entry>
107
+ <question><![CDATA[ Which WordPress versions are supported? ]]></question>
108
+ <answer><![CDATA[ <p>To use all features in the suite, a minimum version of 2.6 is required. Earlier versions will benefit from our Media Library Importer to get them back on the upgrade path and into a <acronym title="Content Delivery Network">CDN</acronym> of their choosing.</p> ]]></answer>
109
+ </entry>
110
+ <entry>
111
+ <question><![CDATA[ I understand the database caching and the page caching, but what's minify all about? ]]></question>
112
+ <answer><![CDATA[
113
+ <p>We'll just quote the fine folks at yahoo on this one:</p>
114
+ <blockquote>
115
+ <p>"Minification is the practice of removing unnecessary characters from code to reduce its size thereby improving load times. When code is minified all comments are removed, as well as unneeded white space characters (space, newline, and tab). In the case of JavaScript, this improves response time performance because the size of the downloaded file is reduced. Two popular tools for minifying JavaScript code are <a href="http://www.crockford.com/javascript/jsmin.html" target="_blank"><acronym title="JavaScript">JS</acronym>Min</a> and <a href="http://developer.yahoo.com/yui/compressor/" target="_blank"><acronym title="Yahoo! User Interface">YUI</acronym> Compressor</a>. The <acronym title="Yahoo! User Interface">YUI</acronym> compressor can also minify <acronym title="Cascading Style Sheet">CSS</acronym>.</p>
116
+ <p>Obfuscation is an alternative optimization that can be applied to source code. It's more complex than minification and thus more likely to generate bugs as a result of the obfuscation step itself. In a survey of ten top U.S. web sites, minification achieved a 21% size reduction versus 25% for obfuscation. Although obfuscation has a higher size reduction, minifying JavaScript is less risky.</p>
117
+ <p>In addition to minifying external scripts and styles, inline &lt;script&gt; and &lt;style&gt; blocks can and should also be minified. Even if you <acronym title="GNU zip">gzip</acronym> your scripts and styles, minifying them will still reduce the size by 5% or more. As the use and size of JavaScript and <acronym title="Cascading Style Sheet">CSS</acronym> increases so will the savings gained by minifying your code."</p>
118
+ <cite><a href="http://developer.yahoo.com/performance/rules.html#minify" target="_blank">developer.yahoo.com</a></cite>
119
+ </blockquote>
120
+ ]]></answer>
121
+ </entry>
122
+ <entry>
123
+ <question><![CDATA[ What do you use to minify? ]]></question>
124
+ <answer><![CDATA[ <p> We use: <a href="http://code.google.com/p/minify/" target="_blank">minify</a> but may support various engines in the future. Based on <a href="http://ejohn.org/" target="_blank">John Resig's</a> suggestion we're currently looking at <a href="http://yuilibrary.com/projects/yuicompressor/wiki" target="_blank"><acronym title="Yahoo! User Interface">YUI</acronym> Compressor</a> and <a href="http://code.google.com/closure/compiler/" target="_blank">Google Closure Compiler</a> (for JavaScript) also.</p> ]]></answer>
125
+ </entry>
126
+ <entry>
127
+ <question><![CDATA[ What's the point of downloading and caching 3rd party files (e.g. <acronym title="JavaScript">JS</acronym>)? ]]></question>
128
+ <answer><![CDATA[ <p>With the various hosted 3rd party applications available (from web site statistics to social media sharing widgets), the problems we've noticed are: additional <acronym title="Hypertext Transfer Protocol">HTTP</acronym> transactions, <acronym title="Domain Name System">DNS</acronym> lookups and latencies from busy servers that we can't control and often un-minified files with no <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression all add up to a very slow page load and poor user experience. With your own copy of external files, updated as frequently as you wish, none of these problems exist.</p> ]]></answer>
129
+ </entry>
130
+ <!-- entry>
131
+ <question><![CDATA[ Will you support other memory or <a href="http://en.wikipedia.org/wiki/PHP_accelerator" target="_blank">opcode caches</a>? ]]></question>
132
+ <answer><![CDATA[ <p>Possibly, we just <a href="mailto:wordpressexperts@w3-edge.com">need to know which</a> others are popular in the WordPress community and we will address them.</p> ]]></answer>
133
+ </entry -->
134
+ <entry>
135
+ <question><![CDATA[ Will this plugin break my theme by changing the order of conditional statements or the like? ]]></question>
136
+ <answer><![CDATA[ <p>No, the plugin looks for conditional statements in your markup used for <acronym title="Cascading Style Sheet">CSS</acronym> (and sometimes <acronym title="JavaScript">JS</acronym>) and makes sure that the minified files precede it, so keep that in mind.</p> ]]></answer>
137
+ </entry>
138
+ <entry>
139
+ <question><![CDATA[ Will this speed up <acronym title="WordPress">WP</acronym> Admin? ]]></question>
140
+ <answer><![CDATA[ <p>Yes, indirectly &mdash; if you have a lot of bloggers working with you, you will find that it feels like you have a server dedicated only to <acronym title="WordPress">WP</acronym> Admin once this plugin is enabled; the result, increased productivity.</p> ]]></answer>
141
+ </entry>
142
+ <entry>
143
+ <question><![CDATA[ Does this plugin modify how the WordPress core works? ]]></question>
144
+ <answer><![CDATA[ <p>No. No theme changes, special files, WordPress core file modifications or special permissions need to be set.</p> ]]></answer>
145
+ </entry>
146
+ <entry>
147
+ <question><![CDATA[ Does it really matter if I remove the line breaks from my code? ]]></question>
148
+ <answer><![CDATA[ <p>Definitely. Removing white space from your files make <acronym title="GNU zip">gzip</acronym> (<acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression) more effective.</p> ]]></answer>
149
+ </entry>
150
+ <entry>
151
+ <question><![CDATA[ What's the benefit of removing <acronym title="Hypertext Markup Language">HTML</acronym> comments from my code? ]]></question>
152
+ <answer><![CDATA[ <p>Many developers like to have comments in the code for various reasons, however these comments add no value from the blog readers (or search engine for that matter) point of view and only contribute to increased load time and wasted bandwidth as a result. Now only you can use them and view them in your site (as a logged in administrator viewing the page source), which is really what (we assume) you intended.</p> ]]></answer>
153
+ </entry>
154
+ <entry>
155
+ <question><![CDATA[ Why is &lt;link&gt; used to embed <acronym title="Cascading Style Sheet">CSS</acronym> instead of &lt;style&gt;? ]]></question>
156
+ <answer><![CDATA[ <p>&lt;link&gt; is a non-blocking method to embed <acronym title="Cascading Style Sheet">CSS</acronym> into a document. We recommend this approach for optimal performance.</p> ]]></answer>
157
+ </entry>
158
+ <entry>
159
+ <question><![CDATA[ Why do I care of <acronym title="JavaScript">JS</acronym> or <acronym title="Cascading Style Sheet">CSS</acronym> is "blocking" or not? ]]></question>
160
+ <answer><![CDATA[ <p>In the case of objects (files) you don't host yourself, this could add several seconds to your page's load time as the <acronym title="Domain Name System">DNS</acronym> lookups, <acronym title="Hypertext Transfer Protocol">HTTP</acronym> transaction roundtrip times and wait times add up. Even when all the scripts are hosted locally, the same adversities exist. Since all objects in the &lt;head&gt; of a document have to be ready before the page can be rendered, having them load in a parallel fashion as opposed to linear (or near linear) gives night and day results.</p> ]]></answer>
161
+ </entry>
162
+ <entry>
163
+ <question><![CDATA[ What does this plugin do to inline <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym>? ]]></question>
164
+ <answer><![CDATA[ <p>Nothing yet. We're evaluating use cases to deal with common issues (like inline <acronym title="Cascading Style Sheet">CSS</acronym> for tag clouds for example).</p> ]]></answer>
165
+ </entry>
166
+ <entry>
167
+ <question><![CDATA[ Ok I get it, this all sounds nice and everything, but is this perfect? ]]></question>
168
+ <answer><![CDATA[ <p>Pretty much. If you monetize your blog with ads you will want to spend some time making sure that the ad code works well with your optimization settings. There are also the occasional pieces of code that conflict with the others and have to be in a specific order to work well, but that's not a problem that this plugin introduces.</p> ]]></answer>
169
+ </entry>
170
+ <entry>
171
+ <question><![CDATA[ Seriously, tell me what the downside is, there must be something? ]]></question>
172
+ <answer><![CDATA[ <p>Well, no there isn't. Installing the server side software might be challenging for some, but <a href="mailto:wordpressexperts@w3-edge.com">we can assist</a> with that if you ask. Other than that, unless you enjoy frequently upgrading your server plan or buying more servers and paying for bandwidth overages or wincing every time you add another "must have" plugin to your blog, we cannot find any reason to deter you from the use of this one.</p> ]]></answer>
173
+ </entry>
174
+ <entry>
175
+ <question><![CDATA[ If this plugin does everything you claim, why would you give it away free? Cui Bono? ]]></question>
176
+ <answer><![CDATA[
177
+ <p>Who benefits? Everyone. Of the numerous, here are the three the most important reasons we share with the WordPress community:</p>
178
+ <ul>
179
+ <li>WordPress is free and high quality, plugins should be too.</li>
180
+ <li>There's no reason your blog shouldn't be able to perform as well as well as any major corporation's web site/application.</li>
181
+ <li><a href="http://code.google.com/speed/articles/" target="_blank">Google</a> and <a href="http://developer.yahoo.com/yui/" target="_blank">Yahoo</a> offer quite a bit, but they did not offer a WordPress solution yet. This is our contribution to speeding up the web (starting with the blogosphere).</li>
182
+ </ul>
183
+ ]]></answer>
184
+ </entry>
185
+ <entry>
186
+ <question><![CDATA[ Who in the world uses memcached or an opcode cache etc anyway? ]]></question>
187
+ <answer><![CDATA[ <p>Great question! Basically anyone that needs to make their application scale. For example, <a href="http://www.wordpress.com/" target="_blank">WordPress.com</a>, <a href="http://twitter.com" target="_blank">Twitter</a>, <a href="http://www.facebook.com/" target="_blank">Facebook</a>, LiveJournal (the inventors of the software) and so on all use some sort of memory cache to increase application performance.</p> ]]></answer>
188
+ </entry>
189
+ <entry>
190
+ <question><![CDATA[ I don't understand what a <acronym title="Content Delivery Network">CDN</acronym> has to do with caching, that's completely different, no? ]]></question>
191
+ <answer><![CDATA[ <p>Technically no, a <acronym title="Content Delivery Network">CDN</acronym> is a high performance cache that stores static assets (your theme files, media library etc) in various locations throughout the world in order to provide low latency access to them by readers in those regions.</p> ]]></answer>
192
+ </entry>
193
+ <entry>
194
+ <question><![CDATA[ We run many blogs on many servers here at my company, is this plugin still for me? ]]></question>
195
+ <answer><![CDATA[ <p> Yes, especially if you have a cluster and many WordPress installations or a WordPress <acronym title="Multi-User">MU</acronym> installation, then plugin is for you. It will allow you to move easily from multiple installations to WordPress <acronym title="Multi-User">MU</acronym> and continue to use multiple <acronym title="Hypertext Transfer Protocol">HTTP</acronym>, Database, Network Attached Storage etc servers in any configuration you wish. You can also specify as many memcached servers as you wish, although you cannot yet delegate a memcached server to a specific type of caching, i.e. there's no pool management yet.</p> ]]></answer>
196
+ </entry>
197
+ <entry>
198
+ <question><![CDATA[ So you appear to know what you're talking about, will there be any negative effect on my SEO rankings? ]]></question>
199
+ <answer><![CDATA[
200
+ <p>To answer, first we must assume that you're using all of the options we offer: <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression, minify etc. Having said that, we are only sending compressed data to user agents that support it; even <a href="http://www.google.com/search?q=search+engine+crawler+http+compression" target="_blank">most search engine crawlers do</a>. As for minified <acronym title="Hypertext Markup Language">HTML</acronym>, this is essentially how crawlers see your page anyway when they download it. So no, there's no penalty or compromise.</p>
201
+ <p>Fact of the matter, there was a time when the semantics and size of your <acronym title="Hypertext Markup Language">HTML</acronym> file (code-to-content ratio), was a factor in a more favorable ranking. <a href="http://microformats.org/wiki/posh" target="_blank"><acronym title="Plain Old Semantic HTML">POSH</acronym></a> <acronym title="Hypertext Markup Language">HTML</acronym> has always been preferred by search engines. In some markets this may still be true, so give the search engines what they want.</p>
202
+ ]]></answer>
203
+ </entry>
204
+ <entry>
205
+ <question><![CDATA[ Will the plugin interfere with other plugins or widgets? ]]></question>
206
+ <answer><![CDATA[ <p>No, on the contrary if you use the minify settings you will improve their performance by several times.</p> ]]></answer>
207
+ </entry>
208
+ <entry>
209
+ <question><![CDATA[ What about my robots.txt, sitemap.xml and all my site verification files etc, what happens with those? ]]></question>
210
+ <answer><![CDATA[ <p>If you're concerned about what happens with these when the <acronym title="Content Delivery Network">CDN</acronym> functionality is active, nothing does. You do not want or need these files moved from their original locations and <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression (or minification for that matter) is of no consequence in most cases.</p> ]]></answer>
211
+ </entry>
212
+ <entry>
213
+ <question><![CDATA[ Do you have any tricks for "post-loading", "lazy-loading" and other render optimizations in this plugin? ]]></question>
214
+ <answer><![CDATA[ <p>Yes we do, we're currently evaluating if they are best introduced into this plugin or as standalones. Feel free to <a href="mailto:wordpressexperts@w3-edge.com">chime in</a>.</p> ]]></answer>
215
+ </entry>
216
+ <entry>
217
+ <question><![CDATA[ I want to obfuscate my <acronym title="JavaScript">JS</acronym>, does the plugin do that? Will it ever? ]]></question>
218
+ <answer><![CDATA[ <p>No the plugin will not do that and it's unlikely that we'll support that.</p> ]]></answer>
219
+ </entry>
220
+ <entry>
221
+ <question><![CDATA[ Can I use packed or obfuscated <acronym title="JavaScript">JS</acronym> with this plugin? ]]></question>
222
+ <answer><![CDATA[ <p> Yes and no. In general, packed <acronym title="JavaScript">JS</acronym> cannot be minified reliably. Obfuscated <acronym title="JavaScript">JS</acronym> also is hit or miss. A minified and <acronym title="GNU zip">gzip</acronym>ped <acronym title="JavaScript">JS</acronym> file will be smaller than a packed file in any case, so using the (uncompressed, unpacked or un obfuscated) developer versions of your plugins is no longer a concern when using this plugin. Alternatively, you can use the non-blocking embed option to continue to use your packed or obfuscated file without minification.</p> ]]></answer>
223
+ </entry>
224
+ <entry>
225
+ <question><![CDATA[ I have some ideas for more features, can I write my own add-ons for your plugin? ]]></question>
226
+ <answer><![CDATA[ <p>Not yet, we are considering support for add-ons. Meanwhile, please <a href="mailto:wordpressexperts@w3-edge.com">reach out to us</a> and let us know what you think would benefit the community.</p> ]]></answer>
227
+ </entry>
228
+ <entry>
229
+ <question><![CDATA[ Who do I thank for all of this? ]]></question>
230
+ <answer><![CDATA[
231
+ <p>It's quite difficult to recall all of the innovators that have shared their thoughts, code and experiences in the blogosphere over the years, but here are some names to get you started:</p>
232
+ <ul>
233
+ <li><a href="http://stevesouders.com/" target="_blank">Steve Souders</a></li>
234
+ <li><a href="http://mrclay.org/" target="_blank">Steve Clay</a></li>
235
+ <li><a href="http://wonko.com/" target="_blank">Ryan Grove</a></li>
236
+ <li><a href="http://www.nczonline.net/blog/2009/06/23/loading-javascript-without-blocking/" target="_blank">Nicholas Zakas</a> </li>
237
+ <li><a href="http://rtdean.livejournal.com/" target="_blank">Ryan Dean</a></li>
238
+ <li><a href="http://gravitonic.com/" target="_blank">Andrei Zmievski</a></li>
239
+ <li>George Schlossnagle</li>
240
+ <li>Daniel Cowgill</li>
241
+ <li><a href="http://toys.lerdorf.com/" target="_blank">Rasmus Lerdorf</a></li>
242
+ <li><a href="http://t3.dotgnu.info/" target="_blank">Gopal Vijayaraghavan</a></li>
243
+ <li><a href="http://eaccelerator.net/" target="_blank">Bart Vanbraban</a></li>
244
+ <li><a href="http://xcache.lighttpd.net/" target="_blank">mOo</a></li>
245
+ </ul>
246
+ <p>Please reach out to all of these people and support their projects if you're so inclined.</p> ]]></answer>
247
+ </entry>
248
+ </section>
249
+ <section name="Usage">
250
+ <entry>
251
+ <question><![CDATA[ How do I find the <acronym title="JavaScript">JS</acronym> and <acronym title="Cascading Style Sheet">CSS</acronym> to optimize (minify) them with this plugin? ]]></question>
252
+ <answer><![CDATA[
253
+ <p>View your page source in your browser and search for any &lt;style&gt;, &lt;link&gt; or &lt;script&gt; tags that contain external <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> files and one by one add them to the minify settings page. Do not include any <acronym title="Cascading Style Sheet">CSS</acronym> in conditional statements (unless you know what you are doing) like:</p>
254
+ <p>&lt;!--[if lte IE 8]&gt;&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/wp-content/themes/default/lte.css&quot; media=&quot;screen,projection&quot; /&gt;&lt;![endif]--&gt; Or simply use the "Help" tool available on the minify settings page which will identify <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> files used in the templates of your theme and properly assign them to the same. Simply tick the checkbox for files you wish to minify, click "Apply &amp; close", then save your settings.</p>
255
+ <p>The plugin will combine, minify, <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compress and check for updates to these files automatically from now on. If you have any <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> that are inline consider making them external files so that you can use them with minify.</p>
256
+ ]]></answer>
257
+ </entry>
258
+ <entry>
259
+ <question><![CDATA[ I've used the plugin to optimize all my theme's <acronym title="JavaScript">JS</acronym> and plugins <acronym title="JavaScript">JS</acronym>, but there are some function calls, where do those go? ]]></question>
260
+ <answer><![CDATA[ <p>Just place them above &lt;/head&gt; if that's where your embed is done or above &lt;/body&gt; if that's where you need them. Wherever they need to be to be called after the <acronym title="JavaScript">JS</acronym> that needs them, it'll be fine.</p> ]]></answer>
261
+ </entry>
262
+ <entry>
263
+ <question><![CDATA[ Can I use scripts that generate <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> with this plugin?]]></question>
264
+ <answer><![CDATA[ <p>Yes you can, but since there are numerous ways to do so, so be sure to test your results carefully. Having said that we do encourage it as it will mean that less processing has to be done to deliver your pages.</p> ]]></answer>
265
+ </entry>
266
+ <entry>
267
+ <question><![CDATA[ How do I configure Amazon Simple Storage Service (Amazon <acronym title="Simple Storage Service">S3</acronym>) or Amazon CloudFront as my <acronym title="Content Delivery Network">CDN</acronym>? ]]></question>
268
+ <answer><![CDATA[
269
+ <p>First <a href="http://aws.amazon.com/" target="_blank">create an S3 account</a>; it may take several hours for your account credentials to be functional. Next, you need to obtain your "Access key ID" and "Secret key" from the "Access Credentials" section of the "<a href="http://aws-portal.amazon.com/gp/aws/developer/account/index.html?action=access-key" target="_blank">Security Credentials</a>" page of "My Account." Make sure the status is "active." Next, make sure that "Amazon Simple Storage Service (Amazon S3)" is the selected "<acronym title="Content Delivery Network">CDN</acronym> type" on the "General Settings" tab, then save the changes. Now on the "Content Delivery Network Settings" tab enter your "Access key," "Secret key" and enter a name (avoid special characters and spaces) for your bucket in the "Create a bucket" field by clicking the button of the same name. If using an existing bucket simply specify the bucket name in the "Bucket" field. Click the "Test <acronym title="Simple Storage Service">S3</acronym> Upload" button and make sure that the test is successful, if not check your settings and try again. Save your settings.</p>
270
+ <p>Unless you wish to use CloudFront, you're almost done, skip to the next paragraph if you're using CloudFront. Go to the "General Settings" tab and click the "Enable" checkbox and save the settings to enable <acronym title="Content Delivery Network">CDN</acronym> functionality. Empty the cache for the changes to take effect. If preview mode is active you will need to "deploy" your changes for them to take effect.</p>
271
+ <p>To use CloudFront, perform all of the steps above, except select the "Amazon CloudFront" "<acronym title="Content Delivery Network">CDN</acronym> type" in the "Content Delivery Network" section of the "General Settings" tab. When creating a new bucket, the distribution ID will automatically be populated. Otherwise, proceed to the <a href="https://console.aws.amazon.com/cloudfront/" target="_blank"><acronym title="Amazon Web Services">AWS</acronym> Management Console</a> and create a new distribution: select the S3 Bucket you created earlier as the "Origin," enter a <a href="http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/index.html?CNAMEs.html" target="_blank"><acronym title="Canonical Name">CNAME</acronym></a> if you wish to add one or more to your DNS Zone. Make sure that "Distribution Status" is enabled and "State" is deployed. Now on "Content Delivery Network" tab of the plugin, copy the subdomain found in the <acronym title="Amazon Web Services">AWS</acronym> Management Console and enter the <acronym title="Canonical Name">CNAME</acronym> used for the distribution in the "<acronym title="Canonical Name">CNAME</acronym>" field.</p>
272
+ <p>You may optionally, specify up to 10 hostnames to use rather than the default hostname, doing so will improve the render performance of your site's pages. Additional hostnames should also be specified in the settings for the distribution you're using in the <acronym title="Amazon Web Services">AWS</acronym> Management Console.</p>
273
+ <p>Now go to the General tab and click the "Enable" checkbox and save the settings to enable <acronym title="Content Delivery Network">CDN</acronym> functionality and empty the cache for the changes to take effect. If preview mode is active you will need to "deploy" your changes for them to take effect.</p>
274
+ ]]></answer>
275
+ </entry>
276
+ <entry>
277
+ <question><![CDATA[ How do I configure Rackspace Cloud Files as my <acronym title="Content Delivery Network">CDN</acronym>? ]]></question>
278
+ <answer><![CDATA[
279
+ <p>First <a href="http://www.rackspacecloud.com/cloud_hosting_products/files" target="_blank">create an account</a>. Next, in the "Content Delivery Network" section of the "General Settings" tab, select Rackspace Cloud Files as the "<acronym title="Content Delivery Network">CDN</acronym> Type." Now, in the "Configuration" section of the "Content Delivery Network" tab, enter the "Username" and "<acronym title="Application Programming Interface">API</acronym> key" associated with your account (found in the <acronym title="Application Programming Interface">API</acronym> Access section of the <a href="https://manage.rackspacecloud.com/APIAccess.do" target="_blank">rackspace cloud control panel</a>) in the respective fields. Next enter a name for the container to use (avoid special characters and spaces). If the operation is successful, the container's ID will automatically appear in the "Replace site's hostname with" field. You may optionally, specify the container name and container ID of an <a href="https://manage.rackspacecloud.com/CloudFiles.do" target="_blank">existing container</a> if you wish. Click the "Test Cloud Files Upload" button and make sure that the test is successful, if not check your settings and try again. Save your settings. You're now ready to export your media library, theme and any other files to the CDN.</p>
280
+ <p>You may optionally, specify up to 10 hostnames to use rather than the default hostname, doing so will improve the render performance of your site's pages.</p>
281
+ <p>Now go to the General tab and click the "Enable" checkbox and save the settings to enable <acronym title="Content Delivery Network">CDN</acronym> functionality and empty the cache for the changes to take effect. If preview mode is active you will need to "deploy" your changes for them to take effect.</p>
282
+ ]]></answer>
283
+ </entry>
284
+ <entry>
285
+ <question><![CDATA[ How do I use an Origin Pull (Mirror) <acronym title="Content Delivery Network">CDN</acronym>? ]]></question>
286
+ <answer><![CDATA[
287
+ <p>Login to your <acronym title="Content Delivery Network">CDN</acronym> providers control panel or account management area. Following any set up steps they provide, create a new "pull zone" or "bucket" for your site's domain name. If there's a set up wizard or any troubleshooting tips your provider offers, be sure to review them. In the "Content Delivery Network" tab of the plugin, enter the hostname your <acronym title="Content Delivery Network">CDN</acronym> provider provided in the "replace site's hostname with" field. You should always do a quick check by opening a test file from the <acronym title="Content Delivery Network">CDN</acronym> hostname, e.g. http://cdn.domain.com/favicon.ico. Troubleshoot with yoru <acronym title="Content Delivery Network">CDN</acronym> provider until this test is successful.</p>
288
+ <p>Now go to the "General" tab and click the checkbox and save the settings to enable <acronym title="Content Delivery Network">CDN</acronym> functionality and empty the cache for the changes to take effect.</p> ]]>
289
+ </answer>
290
+ </entry>
291
+ <entry>
292
+ <question><![CDATA[ In the past, I always had to modify my theme to run dynamic code. Don't I need to do that again for this plugin? ]]></question>
293
+ <answer><![CDATA[ <p>For now no; there are some special cases that we will address with an upcoming release for highly dynamic sites.</p> ]]></answer>
294
+ </entry>
295
+ <entry>
296
+ <question><![CDATA[ How fast will the cache be updated? ]]></question>
297
+ <answer><![CDATA[ <p>Items expire from the cache at a rate that you specify. As far as how fast changes appear to your visitors, they appear instantly in most cases and if you're an administrator who's logged in they will always be immediately visible.</p> ]]></answer>
298
+ </entry>
299
+ <entry>
300
+ <question><![CDATA[ How do I make some specific pages stay dynamic? ]]></question>
301
+ <answer><![CDATA[ <p>They never stop being dynamic, we just don't create pages that have not been changed. If you have a page that updated frequently in your blog before, it will still remain up-to-date at all times.</p> ]]></answer>
302
+ </entry>
303
+ <entry>
304
+ <question><![CDATA[ What about comments? Does the plugin slow down the rate at which comments appear? ]]></question>
305
+ <answer><![CDATA[ <p>On the contrary, as with any other action a user can perform on a site, faster performance will encourage more of it. The cache is so quickly rebuilt in memory that it's no trouble to show visitors the most current version of a post that's experiencing Digg, Slashdot, Drudge Report, Yahoo Buzz or Twitter effect.</p> ]]></answer>
306
+ </entry>
307
+ <entry>
308
+ <question><![CDATA[ What if I accidentally specify an incorrect path to a <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> file? ]]></question>
309
+ <answer><![CDATA[ <p>Unfortunately a 400 bad request error may be generated. So use the "Check <acronym title="Uniform Resource Indicator">URI</acronym>" button to make sure that you have entered the correct <acronym title="Uniform Resource Indicator">URL</acronym> or path to the file.</p> ]]></answer>
310
+ </entry>
311
+ <entry>
312
+ <question><![CDATA[ Does the plugin automatically remove duplicate <acronym title="JavaScript">JS</acronym>? ]]></question>
313
+ <answer><![CDATA[ <p>No. If you include a script in the minfy settings twice or it already exists in your theme we do not automatically remove the extra code. That's tricky business and it's better for us to just let you make the decisions conscientiously.</p> ]]></answer>
314
+ </entry>
315
+ <entry>
316
+ <question><![CDATA[ I've been using the plugin for some time, I updated one of my other plugins and now it doesn't work anymore. What's up? ]]></question>
317
+ <answer><![CDATA[ <p>It's likely the plugin author modified their <acronym title="JavaScript">JS</acronym> or <acronym title="Cascading Style Sheet">CSS</acronym> in the new release and any old <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> you optimized with our plugin has introduced duplicate code as a result (creating a conflict). Simply check out the source code, identify any new <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> and update your <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> optimizations our plugin and you're good to go.</p> ]]></answer>
318
+ </entry>
319
+ <!-- entry>
320
+ <question><![CDATA[ I have some <acronym title="Cascading Style Sheet">CSS</acronym> classes with declarations being overwritten or <acronym title="JavaScript">JS</acronym> with dependencies, do I really have to copy and paste all my <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> file settings around?</strong> ]]></question>
321
+ <answer><![CDATA[ <p>No, you can drag and drop them into the desired order on the minify settings page.</p> ]]></answer>
322
+ </entry -->
323
+ <entry>
324
+ <question><![CDATA[ Why does your plugin change the order of my &lt;script&gt; and &lt;link&gt; tags (in the &lt;head&gt;)? ]]></question>
325
+ <answer><![CDATA[ <p>Steve Souders <a href="http://www.youtube.com/watch?v=oaxZtKAlLRk" target="_blank">identified</a> that placing inline scripts between <acronym title="JavaScript">JS</acronym> and <acronym title="Cascading Style Sheet">CSS</acronym> embeds creates a blocking situation, so we're try to help you avoid that. If you'd like to experiment with various scenarios related specifically to your blog, we recommend Steve's tool, <a href="http://stevesouders.com/cuzillion/" target="_blank">Cuzillion</a>. Have some beneficial input on other common cases for WordPress users? <a href="mailto:wordpressexperts@w3-edge.com">Reach out to us</a>.</p> ]]></answer>
326
+ </entry>
327
+ <entry>
328
+ <question><![CDATA[ I can't read this minified <acronym title="Hypertext Markup Language">HTML</acronym>; can you give me a break please? ]]></question>
329
+ <answer><![CDATA[ <p>Happy to! Login as an administrator, go to the Minify Settings page and check off "Show un-minified pages to administrators" and save the changes. Now stay logged in as an administrator in the same browser you used to change the settings and now when you view the source of a given page in the site, the source will not be minified.</p> ]]></answer>
330
+ </entry>
331
+ <entry>
332
+ <question><![CDATA[ When are you going to translate this plugin into more languages? ]]></question>
333
+ <answer><![CDATA[ <p>When you help us! :-) Localization is tricky and we're happy to work with those willing to support the WordPress community. We will most likely follow the <a href="http://en.wordpress.com/stats/" target="_blank">trends of WordPress</a> itself to determine which languages are addressed first.</p> ]]></answer>
334
+ </entry>
335
+ <entry>
336
+ <question><![CDATA[ I'm not a hardcore developer, can you explain to me how this // and / stuff works and how I should specify the paths for <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> files? ]]></question>
337
+ <answer><![CDATA[
338
+ <p>You mean on the minify settings page right? Ok, it's simple:<br />
339
+ // tells the plugin to search for the file with the provided path from the document root, e.g.: ///JS/jquery/jquery.<acronym title="JavaScript">JS</acronym><br />
340
+ / tells the plugin to search for the file with the provided path from the server root, e.g. //JS/jquery/jquery.<acronym title="JavaScript">JS</acronym></p>
341
+ <p>In most cases providing an absolute path is sufficient and most reliable. You can of course use relative paths, but we discourage it unless you really know what you are doing.</p>
342
+ ]]></answer>
343
+ </entry>
344
+ <entry>
345
+ <question><![CDATA[ What about Etags? ]]></question>
346
+ <answer><![CDATA[ <p>Yes, we have Etags covered. Even if you have a clustered hosting environment, your <a href="http://en.wikipedia.org/wiki/HTTP_ETag" target="_blank">Etags</a> will be consistent (across multiple servers in your cluster) so you don't have to worry about using special session cookies when you introduce our plugin. If you would like to specify headers for various reasons, you can do that as well.</p> ]]></answer>
347
+ </entry>
348
+ <entry>
349
+ <question><![CDATA[ Which encodings do you support? ]]></question>
350
+ <answer><![CDATA[ <p>We recommend UTF-8, but we do not modify the encoding in any files, instead we simply return the code as it is provided.</p> ]]></answer>
351
+ </entry>
352
+ <entry>
353
+ <question><![CDATA[ What's this thing doing? Where are the statistics?
354
+ ]]></question>
355
+ <answer><![CDATA[ <p>Right now we do not show the statistics in <acronym title="WordPress">WP</acronym> Admin, but soon we will provide graphs of: Page Cache Memory Use, Page Cache Hits/Misses, <acronym title="Database">DB</acronym> Cache Memory Use, <acronym title="Database">DB</acronym> Hits/Misses, Average Page Compression Savings, Average <acronym title="Cascading Style Sheet">CSS</acronym> Compression Savings, Average <acronym title="JavaScript">JS</acronym> Compression Savings, Average Requests per Second, and Average Page Execution Time.</p> ]]></answer>
356
+ </entry>
357
+ <entry>
358
+ <question><![CDATA[ How can I tell if it's working? Aren't there any statistics at all? ]]></question>
359
+ <answer><![CDATA[ <p>Well yes actually there are, simply enable debug mode on the "General" tab to have details appended to the bottom of your <acronym title="Hypertext Markup Language">HTML</acronym> source. Remember that when enabled all visitors to your blog can see these statistics if they view source. Using debug mode does slow the performance of your site so use sparingly.</p> ]]></answer>
360
+ </entry>
361
+ <entry>
362
+ <question><![CDATA[ I'm an advanced theme developer and I want to have different combinations of <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> files on different types of pages in my theme; how is this done? ]]></question>
363
+ <answer><![CDATA[ <p>On the minify settings tab, use the drop-down selection menu to define the <acronym title="Cascading Style Sheet">CSS</acronym> or <acronym title="JavaScript">JS</acronym> files that appear on all pages using the "Default" group first. Then specify unie files for the other pages.</p> ]]></answer>
364
+ </entry>
365
+ <entry>
366
+ <question><![CDATA[ Which features can I use if I haven't yet installed an opcode cache or memcached? ]]></question>
367
+ <answer><![CDATA[ <p>Memory caching will not be possible. However you will be able to use both the page cache and minify in "disk" mode, as well <acronym title="Content Delivery Network">CDN</acronym> functionality without issue.</p> ]]></answer>
368
+ </entry>
369
+ <entry>
370
+ <question><![CDATA[ How can I host my favicon with my <acronym title="Content Delivery Network">CDN</acronym>? ]]></question>
371
+ <answer><![CDATA[ <p>If the file exists in your document root (i.e. http://domain.com/favicon.ico), the plugin can take care of that for you using custom upload options. If the file is in your theme directory you can also have the plugin uploaded from there.</p> ]]></answer>
372
+ </entry>
373
+ <entry>
374
+ <question><![CDATA[ Why do you set the value of the media attribute of &lt;link&gt; to all? ]]></question>
375
+ <answer><![CDATA[ <p>In case you were using @media declarations in your document, we'd have you covered. We will likely allow you to modify this attribute as subsequent features are finalized.</p> ]]></answer>
376
+ </entry>
377
+ <entry>
378
+ <question><![CDATA[ Why can't I specify other &lt;script&gt; types or encoding? ]]></question>
379
+ <answer><![CDATA[ <p>We have not found a use case where this appears to be of any consequence. If you're aware of one <a href="mailto:wordpressexperts@w3-edge.com">please let us know</a>.</p> ]]></answer>
380
+ </entry>
381
+ <entry>
382
+ <question><![CDATA[ My theme doesn't call wp_footer() or wp_head(), how do I set this plugin up? ]]></question>
383
+ <answer><![CDATA[
384
+ <p>You'll need to manually update your theme to include your <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> minify groups. The calls you'll want to make for the various cases are:</p>
385
+ <ul>
386
+ <li>&lt;?php if (function_exists('w3tc_styles')): w3tc_styles('include'); endif; ?&gt;<br />Inserts the &lt;head&gt; <acronym title="Cascading Style Sheet">CSS</acronym> group at the location you choose. Multiple occurrences are allowed.</li>
387
+ <li>&lt;?php if (function_exists('w3tc_scripts')): w3tc_scripts('include'); endif; ?&gt;<br />Inserts the &lt;head&gt; blocking <acronym title="JavaScript">JS</acronym> group at the location you choose.</li>
388
+ <li>&lt;?php if (function_exists('w3tc_scripts')): w3tc_scripts('include-nb'); endif; ?&gt;<br />Inserts the &lt;head&gt; non-blocking <acronym title="JavaScript">JS</acronym> groups at the location you choose.</li>
389
+ <li>&lt;?php if (function_exists('w3tc_scripts')): w3tc_scripts('include-body'); endif; ?&gt;<br />Inserts the &lt;body&gt; blocking <acronym title="JavaScript">JS</acronym> group at the location you choose.</li>
390
+ <li>&lt;?php if (function_exists('w3tc_scripts')): w3tc_scripts('include-body-nb'); endif; ?&gt;<br />Inserts the &lt;body&gt; non-blocking <acronym title="JavaScript">JS</acronym> groups at the location you choose.</li>
391
+ <li>&lt;?php if (function_exists('w3tc_scripts')): w3tc_scripts('include-footer'); endif; ?&gt;<br />Inserts the footer <acronym title="JavaScript">JS</acronym> group at the location you choose.</li>
392
+ <li>&lt;?php if (function_exists('w3tc_scripts')): w3tc_scripts('include-footer-nb'); endif; ?&gt;<br />Inserts the footer non-blocking <acronym title="JavaScript">JS</acronym> group at the location you choose.</li>
393
+ </ul>
394
+ ]]></answer>
395
+ </entry>
396
+ <entry>
397
+ <question><![CDATA[ Is this plugin compatible with other popular caching plugins? ]]></question>
398
+ <answer><![CDATA[ <p>No. Any disk based page caching plugin you're currently using would need to be completely uninstalled (not just disabled) in order to use this plugin. So if you have a development environment where you can try this out or testing during low traffic periods to get your preferences set, that is recommended. You can always backup your full WordPress installation before testing pretty quickly if you skip the /uploads/ (media library) directory.</p> ]]></answer>
399
+ </entry>
400
+ <entry>
401
+ <question><![CDATA[ Some WordPress caching plugins fail when markup is not well-formed, is this plugin similar? ]]></question>
402
+ <answer><![CDATA[ <p>No, this plugin is not similar. While valid <acronym title="Hypertext Markup Language">HTML</acronym> and <acronym title="World Wide Web Consortium">W3C</acronym> standards ensure consistent behavior across user agents and promote accessibility, any invalidity that exist in the code is not going to bring your site to its knees.</p> ]]></answer>
403
+ </entry>
404
+ <entry>
405
+ <question><![CDATA[ Won't various 3rd parties who's <acronym title="JavaScript">JS</acronym> I download and cache be concerned? ]]></question>
406
+ <answer><![CDATA[ <p>Unlikely, you're saving them bandwidth and using their applications, so they will probably appreciate it as long as their application still works as intended and you're using their software in an authorized manner. Look at it this way, even before this plugin, you and thousands of other people were still downloading it, now you're just downloading it first.</p> ]]></answer>
407
+ </entry>
408
+ <entry>
409
+ <question><![CDATA[
410
+ Google already minified and
411
+ <acronym title="Hypertext Transfer Protocol">HTTP</acronym>
412
+ compressed jQuery (and other libraries ) for me, why can't I just
413
+ use their bandwidth and embed other code after it?
414
+ ]]></question>
415
+ <answer><![CDATA[ <p>You can! Just add Google's script to your minify settings use non-blocking mode and your visitors will download jQuery directly from them as you wish. And the same is obviously true for any other library you wish. Remember you are creating additional <acronym title="Domain Name System">DNS</acronym> Lookups and <acronym title="Hypertext Transfer Protocol">HTTP</acronym> transactions when you do this.</p> ]]></answer>
416
+ </entry>
417
+ <entry>
418
+ <question><![CDATA[ I wanted to use a different version jQuery with my theme,
419
+ how do I replace WordPress' jQuery with Google's minified version
420
+ using your plugin? ]]></question>
421
+ <answer><![CDATA[ <p>Currently you cannot, replacement is not yet supported.</p> ]]></answer>
422
+ </entry>
423
+ <entry>
424
+ <question><![CDATA[ What about the wp-includes files, can those be served from the <acronym title="Content Delivery Network">CDN</acronym>? ]]></question>
425
+ <answer><![CDATA[ <p>Yes, you can specify which file types you would like served by <acronym title="Content Delivery Network">CDN</acronym> and they will be uploaded and always downloaded from that location. This includes the smilies, JavaScript files et al. By default we take care of them all.</p> ]]></answer>
426
+ </entry>
427
+ <entry>
428
+ <question><![CDATA[ What if I don't want to work with a <acronym title="Content Delivery Network">CDN</acronym> right now, is there any other use for this feature? ]]></question>
429
+ <answer><![CDATA[ <p>Yes! You can take advantage of the <a href="http://www.mozilla.org/projects/netlib/http/pipelining-faq.html">pipelining</a> support in some browsers by creating a sub-domain for the static content for your site. So you could select the "Origin Push / Self-hosted" method of the General Settings tab. Create static.domain.com on your server (and update your <acronym title="Domain Name System">DNS</acronym> zone) and then specify the <acronym title="File Transfer Protocol">FTP</acronym> details for it in the plugin configuration panel and you're done. If you disable the scripting options on your server you'll find that your server will actually respond slightly faster from that sub-domain because it's just sending files and not processing them.</p> ]]></answer>
430
+ </entry>
431
+ <entry>
432
+ <question><![CDATA[ Are minified files uploaded to my <acronym title="Content Delivery Network">CDN</acronym> provider? ]]></question>
433
+ <answer><![CDATA[ <p>Yes, any <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> you manage with the plugin are minified before being uploaded to your <acronym title="Content Delivery Network">CDN</acronym>. You don't have to make any special changes to your theme. We encourage you to make sure that your provider supports <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression as the benefit of having your static assets available from more than one <acronym title="Point of Presence">POP</acronym> alone is not enough.</p> ]]></answer>
434
+ </entry>
435
+ <entry>
436
+ <question><![CDATA[ Who do you recommend as a <acronym title="Content Delivery Network">CDN</acronym> provider? ]]></question>
437
+ <answer><![CDATA[
438
+ <p>That depends on how you use your blog and where most of your readers read your blog (regionally). Here's a short list:</p>
439
+ <ul>
440
+ <li><a href="http://bit.ly/acaXXt" target="_blank">MaxCDN</a></li>
441
+ <li><a href="http://bit.ly/9hpX8T" target="_blank">Rackspace Cloud Files</a></li>
442
+ <li><a href="http://bit.ly/bnVs0a" target="_blank">Cotendo</a></li>
443
+ <li><a href="http://bit.ly/d5hfFt" target="_blank">VPS NET</a></li>
444
+ <li><a href="http://bit.ly/ao1sGt" target="_blank">Cloudfront</a></li>
445
+ <li><a href="http://bit.ly/bIjSWC" target="_blank">EdgeCast</a></li>
446
+ <li><a href="http://bit.ly/a5GBLV" target="_blank">Akamai</a></li>
447
+ <li><a href="http://bit.ly/aCW04j" target="_blank">Limelight Networks</a></li>
448
+ <li><a href="http://bit.ly/93EAKK" target="_blank">Simple<acronym title="Content Delivery Network">CDN</acronym></a></li>
449
+ </ul>
450
+ ]]></answer>
451
+ </entry>
452
+ <entry>
453
+ <question><![CDATA[ Hang on, don't I need to modify my <acronym title="Cascading Style Sheet">CSS</acronym> files so they'll work on the <acronym title="Content Delivery Network">CDN</acronym>? ]]></question>
454
+ <answer><![CDATA[ <p>No, that is taken care of for you. Your <acronym title="Cascading Style Sheet">CSS</acronym> files will originate from your <acronym title="Content Delivery Network">CDN</acronym> provider and all paths to any images in your <acronym title="Cascading Style Sheet">CSS</acronym> will be changed from relative to absolute, making sure that they load just fine. Do nothing differently, yet reap all the benefits.</p> ]]></answer>
455
+ </entry>
456
+ <entry>
457
+ <question><![CDATA[ I don't have time to deal with this, but I know I need it. Will you help me? ]]></question>
458
+ <answer><![CDATA[ <p>Yes! Please <a href="mailto:wordpressexperts@w3-edge.com">reach out to us</a> and we'll get you acclimated so you can "set it and forget it."</p> ]]></answer>
459
+ </entry>
460
+ <entry>
461
+ <question><![CDATA[ What about query string variables on <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym>, do they matter? ]]></question>
462
+ <answer><![CDATA[ <p>This is definitely a special case. Files like "http://domain.com/wp-content/themes/default/js/script.js?ver=20090102" etc need to be specified with the full <acronym title="Uniform Resource Locator">URL</acronym>. This is an exception to the general rule of specifying a local path to file like: "wp-content/themes/default/js/script.js", which should also work fine. Be sure to click the "Verify <acronym title="Uniform Resource Indicator">URL</acronym>" button to be sure that everything is ok before saving changes.</p> ]]></answer>
463
+ </entry>
464
+ <entry>
465
+ <question><![CDATA[ Is this plugin comptatible with GD Star Rating? ]]></question>
466
+ <answer><![CDATA[
467
+ <p>Yes. Follow these steps:</p>
468
+ <ol>
469
+ <li>Enable dynamic loading of ratings by checking GD Star Rating -> Settings -> Features "Cache support option"</li>
470
+ <li>If Database cache enabled in W3 Total Cache add "wp_gdsr" to "Ignored query stems" field in the Database Cache settings tab, otherwise ratings will not updated after voting</li>
471
+ <li>Empty all caches</li>
472
+ </ol>
473
+ ]]></answer>
474
+ </entry>
475
+ <entry>
476
+ <question><![CDATA[ How do I cache only the home page? ]]></question>
477
+ <answer><![CDATA[ <p>Add "/.+" (without the quotes) to page cache "Never cache the following pages" option on the page cache settings tab.</p> ]]></answer>
478
+ </entry>
479
+ <entry>
480
+ <question><![CDATA[ I see garbage characters instead of the normal web site, what's going on here? ]]></question>
481
+ <answer><![CDATA[ <p>If a theme or it's files use the call php_flush() or function flush() that will interfere with the plugins normal operation; making the plugin send cached files before essential operations have finished. The flush() call is no longer necessary and should be removed.</p> ]]></answer>
482
+ </entry>
483
+ <entry>
484
+ <question><![CDATA[ What is the purpose of the "Media Library Import" tool and how do I use it? ]]></question>
485
+ <answer><![CDATA[
486
+ <p>The media library import tool is for old or "messy" WordPress installations that have attachments (images etc in posts or pages) scattered about the web server or "hot linked" to 3rd party sites instead of properly using the media library.</p>
487
+ <p>The tool will scan your posts and pages for the cases above and copy them to your media library, update your posts to use the link addresses and produce a .htaccess file containing the list of of permanent redirects, so search engines can find the files in their new location.</p>
488
+ <p>You should backup your database before performing this operation.</p>
489
+ ]]></answer>
490
+ </entry>
491
+ <entry>
492
+ <question><![CDATA[ I'm getting blank pages or 500 error codes when trying to upgrade on WordPress MU ]]></question>
493
+ <answer><![CDATA[ <p>First, make sure the plugin is not active (disabled) network-wide. Then make sure it's deactivated network-wide. Now you should be able to successful upgrade without breaking your site.</p> ]]></answer>
494
+ </entry>
495
+ <entry>
496
+ <question><![CDATA[ How can I embed the minified CSS file at the location I choose? ]]></question>
497
+ <answer><![CDATA[
498
+ <ul>
499
+ <li>&lt;?php if (function_exists('w3tc_styles')){w3tc_styles('include');} ?&gt;<br />Inserts the minified CSS files at the location you specify in your theme. More than one instance per template is ok; e.g. embedding in multiple conditional statements.</li>
500
+ </ul>
501
+ ]]></answer>
502
+ </entry>
503
+ <entry>
504
+ <question><![CDATA[ Is this plugin comptatible with TDO Mini Forms? ]]></question>
505
+ <answer><![CDATA[ <p>Captcha and recaptcha will work fine, however you will need to prevent any pages with forms from being cached. Add the page's URI to the "Never cache the following pages" box on the Page Cache Settings tab.</p> ]]></answer>
506
+ </entry>
507
+ <entry>
508
+ <question><![CDATA[ My YSlow score is low because it doesn't recognize my <acronym title="Content Delivery Network">CDN</acronym>, what can I do? ]]></question>
509
+ <answer><![CDATA[
510
+ <p>Rule 2 says to use a content delivery network (<acronym title="Content Delivery Network">CDN</acronym>). The score for this rule is computed by checking the hostname of each component against the list of known <acronym title="Content Delivery Network">CDN</acronym>s. Unfortunately, the list of "known <acronym title="Content Delivery Network">CDN</acronym>s" are the ones used by Yahoo!. Most likely these are not relevant to your web site, except for potentially yui.yahooapis.com. If you want an accurate score for your web site, you can add your <acronym title="Content Delivery Network">CDN</acronym> hostnames to YSlow using Firefox's preferences. Here are the steps to follow:</p>
511
+ <ul>
512
+ <li>Go to about:config in Firefox. You'll see the current list of preferences.</li>
513
+ <li>Right-click in the window and choose New and String to create a new string preference.</li>
514
+ <li>Enter extensions.yslow.cdnHostnames for the preference name.</li>
515
+ <li>For the string value, enter the hostname of your <acronym title="Content Delivery Network">CDN</acronym>, for example, mycdn.com. Do not use quotes. If you have multiple <acronym title="Content Delivery Network">CDN</acronym> hostnames, separate them with commas.</li>
516
+ </ul>
517
+ <p>If you specify <acronym title="Content Delivery Network">CDN</acronym> hostnames in your preferences, they'll be shown under the details for Rule 2 in the Performance view.</p>
518
+ ]]></answer>
519
+ </entry>
520
+ <entry>
521
+ <question><![CDATA[ What is the purpose of the "modify attachment <acronym title="Uniform Resource Indicator">URL</acronym>s" button? ]]></question>
522
+ <answer><![CDATA[
523
+ <p>If the domain name of your site has changed, this tool is useful in updating your posts and pages to use the current addresses. For example, if your site used to be www.domain.com, and you decided to change it to domain.com, the result would either be many "broken" images or many unncessary redirects (which slow down the visitor's browsing experience). You can use this tool to correct this and similar cases. Correcting the <acronym title="Uniform Resource Indicator">URL</acronym>s of your images also allows the plugin to do a better job of determining which images are actually hosted with the <acronym title="Content Delivery Network">CDN</acronym></p>
524
+ <p>As always, it never hurts to back up your database first.</p>
525
+ ]]></answer>
526
+ </entry>
527
+ <entry>
528
+ <question><![CDATA[ How do I implement fragment caching? ]]></question>
529
+ <answer><![CDATA[
530
+ <p>Edit your templates to with the following syntax to ensure that dynamic features remain so:</p>
531
+ <ul>
532
+ <li>Example 1:<br />&lt;!-- mfunc any PHP code --&gt;&lt;!-- /mfunc --&gt;</li>
533
+ <li>Example 2:<br />&lt;!-- mfunc --&gt;any PHP code&lt;!-- /mfunc --&gt;</li>
534
+ <li>Example 3:<br />&lt;!--MFUNC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo rand();<br />&lt;!--/mfunc --&gt;</li>
535
+ <li>Example 4:<br />&lt;!-- mclude path/to/file.php --&gt;&lt;!-- /mclude --&gt;</li>
536
+ <li>Example 5:<br />&lt;!-- mclude --&gt;path/to/file.php&lt;!-- /mclude --&gt;</li>
537
+ </ul>
538
+ ]]></answer>
539
+ </entry>
540
+ <entry>
541
+ <question><![CDATA[ How can I prevent caching directly in my templates etc? ]]></question>
542
+ <answer><![CDATA[
543
+ <p>Several constants are available for these purposes:</p>
544
+ <ul>
545
+ <li>define('DONOTCACHEPAGE', true);<br />Disables page caching for a given page.</li>
546
+ <li>define('DONOTCACHEDB', true);<br />Disables database caching for given page.</li>
547
+ <li>define('DONOTMINIFY', true);<br />Disables minify for a given page.</li>
548
+ <li>define('DONOTCDN', true);<br />Disables content delivery network for a given page.</li>
549
+ <li>define('DONOTCACHCEOBJECT', true);<br />Disables object cache for a given page.</li>
550
+ </ul>
551
+ ]]></answer>
552
+ </entry>
553
+ <entry>
554
+ <question><![CDATA[ How can I flush the cache without using the WP Admin interface? ]]></question>
555
+ <answer><![CDATA[
556
+ <p>It's possible to empty the entire cache or simply purge the cache of a single post / page:</p>
557
+ <ul>
558
+ <li>Purge the entire page cache:<br />
559
+ if (function_exists('w3tc_pgcache_flush')) {<br />
560
+ w3tc_pgcache_flush();<br />
561
+ }
562
+ </li>
563
+ <li>Purge a single post / page by passing it's ID:<br />
564
+ if (function_exists('w3tc_pgcache_flush_post')) {<br />
565
+ w3tc_pgcache_flush_post($post_id);<br />
566
+ }
567
+ </li>
568
+ </ul>
569
+ ]]></answer>
570
+ </entry>
571
+ <entry>
572
+ <question><![CDATA[ How do I programmatically modify user agent groups? ]]></question>
573
+ <answer><![CDATA[
574
+ <p>The following are commented examples of filters that can be used to manipulate user agent groups:</p>
575
+ <p>function my_cached_mobile_groups($groups) {<br />
576
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// any operations on array<br />
577
+ <br />
578
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// specify two groups example<br />
579
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$groups = array_merge($groups, array(<br />
580
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'favorite_browsers' =&gt; array('opera', 'chrome'),<br />
581
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'default_browsers' =&gt; array('msie', 'firefox')<br />
582
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;));<br />
583
+ <br />
584
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $groups;<br />
585
+ }<br />
586
+
587
+ add_filter('cached_mobile_groups', 'my_cached_mobile_groups');<br />
588
+ </p>
589
+ <p>function my_w3tc_mobile_groups($w3tc_groups) {<br />
590
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// any operations <br />
591
+ <br />
592
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// clear all groups example<br />
593
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$w3tc_groups = array();<br />
594
+ <br />
595
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// delete all groups and add new example<br />
596
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$w3tc_groups = array(....);<br />
597
+ <br />
598
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// merge groups example:<br />
599
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$w3tc_groups = array_merge($w3tc_groups, array(<br />
600
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'good_browsers' =&gt; array(<br />
601
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'theme' =&gt; 'good_theme/good_theme',<br />
602
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'enabled' =&gt; true,<br />
603
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'redirect' =&gt; '',<br />
604
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'agents' =&gt; array('firefox', 'chrome')<br />
605
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br />
606
+ <br />
607
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'bad_browsers' =&gt; array(<br />
608
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'theme' =&gt; 'bad_theme/bad_theme',<br />
609
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'enabled' =&gt; true,<br />
610
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'redirect' =&gt; '',<br />
611
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'agents' =&gt; array('msie', 'opera')<br />
612
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
613
+ ));<br />
614
+ <br />
615
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $w3tc_groups;<br />
616
+ }<br />
617
+ add_filter('w3tc_mobile_groups', 'my_w3tc_mobile_groups');
618
+ </p>
619
+ ]]></answer>
620
+ </entry>
621
+ </section>
622
+ <section name="Requirements">
623
+ <entry>
624
+ <question><![CDATA[ Which web servers do you support? ]]></question>
625
+ <answer><![CDATA[ <p>We are aware of no incompatibilities with <a href="http://httpd.apache.org/" target="_blank">apache</a> 1.3+, <a href="http://www.iis.net/" target="_blank">IIS</a> 5+ or <a href="http://litespeedtech.com/products/webserver/overview/" target="_blank">litespeed</a> 4.0.2+. If there's a web server you feel we should be actively testing (e.g. <a href="http://www.lighttpd.net/" target="_blank">lighttpd</a>), we're <a href="mailto:wordpressexperts@w3-edge.com">interested in hearing</a>.</p> ]]></answer>
626
+ </entry>
627
+ <entry>
628
+ <question><![CDATA[ Do I need to enable mod_gzip, mod_rewrite or install any <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression software on my server? ]]></question>
629
+ <answer><![CDATA[
630
+ <p>No, but we do find that it does help some rich internet applications to compress their AJAX responses, so you might look at it just for that case.</p>
631
+ <p>If you're larger organization or a web hosting company, consider looking into solutions that exist like <a href="http://www.gear6.com/">Gear6</a> which could be useful now that you have a plugin that makes management memcached pain free.</p>
632
+ ]]></answer>
633
+ </entry>
634
+ <entry>
635
+ <question><![CDATA[ Is this plugin compatible with varnish or squid? ]]></question>
636
+ <answer><![CDATA[ <p>Yes, it is compatible with <a href="http://varnish.projects.linpro.no/" target="_blank">varnish</a>.</p> ]]></answer>
637
+ </entry>
638
+ <entry>
639
+ <question><![CDATA[ My server is state of the art with 15,000 RPM RAID, why do I need to cache anything in memory? ]]></question>
640
+ <answer><![CDATA[ <p>Even if your server was using an array of solid state disks (SSD), your server's <acronym title="Random Access Memory">RAM</acronym> is still going to be faster and introduce less overhead to access than even the fastest solid state drives on a PCIe bus. If you didn't invest in solid state disks for your server, then even worse off - at least an order of magnitude speed difference in read operations in <acronym title="Random Access Memory">RAM</acronym> versus HDD. For write operations delta the latency differences is even more pronounced. <acronym title="Random Access Memory">RAM</acronym> is the winner hands down. We won't even discuss the blocking and arbitration issues that happen with disk arrays under certain circumstances.</p> ]]></answer>
641
+ </entry>
642
+ <entry>
643
+ <question><![CDATA[ Why would I choose opcode caching over memcached or vice versa? ]]></question>
644
+ <answer><![CDATA[
645
+ <p>There's no straight answer for this one. Since WordPress is a PHP-based application, we encourage everyone to install an opcode cache and realize a minimum of 10x performance gain. It will obviously make our plugin faster as well, so again please check out the installation instructions if you do not already use an opcode cache. Once installed, you can select an opcode cache as the method and get back to blogging.</p>
646
+ <p>Opcode caching does have a couple weaknesses:</p>
647
+ <ul>
648
+ <li>If you frequently restart your web server (e.g. apache) especially during high traffic periods, you will lose your cache and your site will slow down as it rebuilds the cache (which happens very quickly). However if you use memcached you would not lose your cache if your web server is restarted.</li>
649
+ <li>More importantly, opcode caching is best suited for single server environments because the cache is only accessible to the local server, it cannot be shared with other servers in a multi-server (cluster) environment.</li>
650
+ </ul>
651
+ <p>It would appear that using <acronym title="Alternative PHP Cache">APC</acronym> database caching, but your mileage may vary. So depending on what software you install and how you manage your server, you can choose the options to fit your needs. If you need help with the install on your dedicated or virtual dedicated linux-based server ask us!</p>
652
+ ]]></answer>
653
+ </entry>
654
+ <entry>
655
+ <question><![CDATA[ I already use <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression on my server, why does it matter if I minify my code? ]]></question>
656
+ <answer><![CDATA[ <p>Let's say you had a file of 10240 bytes, which becomes 2048 bytes when compressed, savings of ~80% (typical for <acronym title="Cascading Style Sheet">CSS</acronym> files). That same file will now have an <strong>additional</strong> ~3x-10x transfer speed improvement when minified. That's a big return from a small operation. The larger your files, the more significant the proportional performance gains.</p> ]]></answer>
657
+ </entry>
658
+ <entry>
659
+ <question><![CDATA[ How much memory (<acronym title="Random Access Memory">RAM</acronym>) do I need to delegate to caching? ]]></question>
660
+ <answer><![CDATA[
661
+ <p>Probably the hardest question of all. At the time of this writing the default WordPress install and theme will consume about 50MB of memory in an opcode cache while running our plugin. Keep in mind that the following factors will determine the minimum size of your cache beyond this noted 50MB:</p>
662
+ <ul>
663
+ <li>Number of typically requested pages per day (if your blog is popular this number is quite large)</li>
664
+ <li>Size of minified <acronym title="Cascading Style Sheet">CSS</acronym>, <acronym title="JavaScript">JS</acronym> and <acronym title="Hypertext Markup Language">HTML</acronym> pages (smaller is better)</li>
665
+ <li>Number and complexity of plugins active on your blog (fewer is better)</li>
666
+ <li>Expiry time of the cache (larger expiry time, larger cache)</li>
667
+ </ul>
668
+ <p>So we recommend an absolute minimum of 128MB for a typical blog; this figure is greater than some defaults, so keep that in mind. With statistics you'll be able to react accordingly and make adjustments.</p>
669
+ <p>For those that don't want or have time to learn anything new to get started, sample configuration files are included with the plugin containing inline comments for you.</p>
670
+ ]]></answer>
671
+ </entry>
672
+ <entry>
673
+ <question><![CDATA[ What version of <acronym title="Hypertext Preprocessor">PHP</acronym> do I need for this thing? ]]></question>
674
+ <answer><![CDATA[ <p> Version 4.3 is supported for some modules, however version 5 preferred (it's much much faster especially with an opcode cache). It is likely version 3.0 of WordPress will no longer support <acronym title="Hypertext Preprocessor">PHP</acronym> 4.3.</p> ]]></answer>
675
+ </entry>
676
+ <entry>
677
+ <question><![CDATA[ What version of mySQL is needed? ]]></question>
678
+ <answer><![CDATA[ <p>If your WordPress installation is works, you're all set.</p> ]]></answer>
679
+ </entry>
680
+ <entry>
681
+ <question><![CDATA[ And I need mod_rewrite (or equivalent for my web server) installed too, no? ]]></question>
682
+ <answer><![CDATA[ <p>That's correct; everything you need for WordPress (i.e. fancy <acronym title="Uniform Resource Locator">URL</acronym>s) will get you started with this plugin also.</p> ]]></answer>
683
+ </entry>
684
+ <entry>
685
+ <question><![CDATA[ How much hardware do I have to throw at something like this before I see a benefit? ]]></question>
686
+ <answer><![CDATA[ <p>This plugin was actually designed with virtual dedicated servers in mind. As long as your server has at least 256M of <acronym title="Random Access Memory">RAM</acronym>, you can get started.</p> ]]></answer>
687
+ </entry>
688
+ <entry>
689
+ <question><![CDATA[ Is this plugin server cluster and load balancer friendly? ]]></question>
690
+ <answer><![CDATA[ <p>Yes, built from the ground up with scale and current hosting paradigms in mind.</p> ]]></answer>
691
+ </entry>
692
+ <entry>
693
+ <question><![CDATA[ I'm a web hosting provider and I heard about this plugin from my clients, is this plugin safe for a shared hosting environment? ]]></question>
694
+ <answer><![CDATA[ <p>Yes.</p> ]]></answer>
695
+ </entry>
696
+ <entry>
697
+ <question><![CDATA[ What is the intended impact of this plugin on the web hosting landscape? ]]></question>
698
+ <answer><![CDATA[ <p>We feel that shared or virtual hosting providers will begin offering secure containers (similar to what <a href="http://mediatemple.net/" target="_blank">mediatemple.net</a> does for mySQL and Ruby etc) for opcode caching and memcached. Whoever brings this offering to market first will lower the bar for more web sites/applications (and startups) to build better performing applications with greater ease. The same hosting provider would also possess a new value added service, thereby realizing a competitive advantage in a highly competitive marketplace. Not to mention be able to increase the density of domains per server (or cluster) without shortchanging customers.</p> <p>One day hopefully this plugin will contribute to making web servers greener and reduce the ecological footprint of the web by reducing the computational effort required to deliver high performance rich user experiences.</p> ]]></answer>
699
+ </entry>
700
+ </section>
701
+ </faqs>
inc/options/general.phtml CHANGED
@@ -1,52 +1,72 @@
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
3
- <h3>General Settings</h3>
 
 
4
 
5
- <p>The plugin is currently <span class="w3tc-<?php if ($enabled): ?>enabled">enabled<?php else: ?>disabled">disabled<?php endif; ?></span>. If an option is disabled it means that either your current installation is not compatible or installation is required.</p>
6
-
7
- <form action="options-general.php">
8
- <p>You can
9
- <input type="hidden" name="page" value="<?php echo W3TC_FILE; ?>" />
10
- <input type="hidden" name="tab" value="<?php echo $this->_tab; ?>" />
11
- <input class="button" type="submit" name="flush_all" value="empty all caches" /> at once or
12
  <input class="button" type="submit" name="flush_memcached" value="empty only the memcached cache(s)"<?php if (! $can_empty_memcache): ?> disabled="disabled"<?php endif; ?> /> or
13
- <input class="button" type="submit" name="flush_opcode" value="empty only the opcode cache"<?php if (! $can_empty_opcode): ?> disabled="disabled"<?php endif; ?> /> or
14
  <input class="button" type="submit" name="flush_file" value="empty only the disk cache(s)"<?php if (! $can_empty_file): ?> disabled="disabled"<?php endif; ?> />.
15
  </p>
16
  </form>
17
 
18
- <form action="options-general.php?page=<?php echo urldecode(W3TC_FILE); ?>&amp;tab=<?php echo $this->_tab; ?>" method="post">
19
  <fieldset>
20
  <legend>General</legend>
21
 
22
- <p>
23
- <label>
24
- <input id="enabled" type="checkbox" name="enabled" value="1"<?php checked($enabled, true); ?> />
25
- Deselect this option to disable all caching functionality.
26
- </label>
27
- </p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
 
29
  <p class="submit">
30
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
31
  </p>
32
  </fieldset>
33
 
34
  <fieldset>
35
- <legend>Page Caching</legend>
36
-
37
  <p>Enable page caching to decrease the response time of your blog.</p>
38
-
39
  <table class="form-table">
40
  <tr>
41
- <th valign="top">Page Caching:</th>
42
  <td>
43
  <input type="hidden" name="pgcache.enabled" value="0" />
44
- <label><input class="enabled" type="checkbox" name="pgcache.enabled" value="1"<?php checked($pgcache_enabled, true); ?> />&nbsp;<strong>Enable</strong></label><br />
45
- <span class="description">Caching pages will reduce the response time of your site and increase the concurrency (scale) of your web server.</span>
46
  </td>
47
  </tr>
48
  <tr>
49
- <th valign="top">Page Caching Method:</th>
50
  <td>
51
  <select name="pgcache.engine">
52
  <optgroup label="Shared Server (disk enhanced is best):">
@@ -58,7 +78,7 @@
58
  <option value="eaccelerator"<?php selected($this->_config->get_string('pgcache.engine'), 'eaccelerator'); ?><?php if (! $check_eaccelerator): ?> disabled="disabled"<?php endif; ?>>Opcode: eAccelerator</option>
59
  <option value="xcache"<?php selected($this->_config->get_string('pgcache.engine'), 'xcache'); ?><?php if (! $check_xcache): ?> disabled="disabled"<?php endif; ?>>Opcode: XCache</option>
60
  </optgroup>
61
- <optgroup label="Multiple Servers:">
62
  <option value="memcached"<?php selected($this->_config->get_string('pgcache.engine'), 'memcached'); ?><?php if (! $check_memcached): ?> disabled="disabled"<?php endif; ?>>Memcached</option>
63
  </optgroup>
64
  </select>
@@ -67,26 +87,32 @@
67
  </table>
68
 
69
  <p class="submit">
70
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
71
  </p>
72
  </fieldset>
73
-
74
  <fieldset>
75
- <legend>Minify</legend>
 
 
 
 
 
 
76
 
77
  <p>Reduce load time by decreasing the size and number of <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> files. Automatically remove unncessary data from <acronym title="Cascading Style Sheet">CSS</acronym>, <acronym title="JavaScript">JS</acronym>, feed, page and post <acronym title="Hypertext Markup Language">HTML</acronym>.</p>
78
-
79
  <table class="form-table">
80
  <tr>
81
  <th valign="top">Minify:</th>
82
  <td>
83
  <input type="hidden" name="minify.enabled" value="0"<?php if (! W3TC_PHP5): ?> disabled="disabled"<?php endif; ?> />
84
- <label><input class="enabled" type="checkbox" name="minify.enabled" value="1"<?php checked($minify_enabled, true); ?><?php if (! W3TC_PHP5): ?> disabled="disabled"<?php endif; ?> />&nbsp;<strong>Enable</strong></label><br />
85
- <span class="description">Minification can decrease file size of <acronym title="Hypertext Markup Language">HTML</acronym>, <acronym title="Cascading Style Sheet">CSS</acronym>, <acronym title="JavaScript">JS</acronym> and feeds respectively by ~10% on average.</span>
86
  </td>
87
  </tr>
88
  <tr>
89
- <th valign="top">Minify Caching Method:</th>
90
  <td>
91
  <select name="minify.engine"<?php if (! W3TC_PHP5): ?> disabled="disabled"<?php endif; ?>>
92
  <optgroup label="Shared Server (disk is best):">
@@ -106,26 +132,26 @@
106
  </table>
107
 
108
  <p class="submit">
109
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
110
  </p>
111
  </fieldset>
112
-
113
  <fieldset>
114
- <legend>Database Caching</legend>
115
-
116
  <p>Enable database caching to reduce post, page and feed creation time.</p>
117
-
118
  <table class="form-table">
119
  <tr>
120
- <th valign="top">Database Caching:</th>
121
  <td>
122
  <input type="hidden" name="dbcache.enabled" value="0" />
123
- <label><input class="enabled" type="checkbox" name="dbcache.enabled" value="1"<?php checked($dbcache_enabled, true); ?> />&nbsp;<strong>Enable</strong></label><br />
124
- <span class="description">Caching database objects may decrease the response time of your blog by up to 100x.</span>
125
  </td>
126
  </tr>
127
  <tr>
128
- <th valign="top">Database Caching Method:</th>
129
  <td>
130
  <select name="dbcache.engine">
131
  <optgroup label="Shared Server:">
@@ -145,22 +171,62 @@
145
  </table>
146
 
147
  <p class="submit">
148
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
149
  </p>
150
  </fieldset>
151
-
 
152
  <fieldset>
153
- <legend>Content Delivery Network</legend>
154
-
155
- <p>Host static files with your <acronym title="Content Delivery Network">CDN</acronym> provider to reduce load time.</p>
156
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
  <table class="form-table">
158
  <tr>
159
  <th><acronym title="Content Delivery Network">CDN</acronym>:</th>
160
  <td>
161
  <input type="hidden" name="cdn.enabled" value="0" />
162
- <label><input class="enabled" type="checkbox" name="cdn.enabled" value="1"<?php checked($cdn_enabled, true); ?> />&nbsp;<strong>Enable</strong></label><br />
163
- <span class="description">Theme files, media library attachments, <acronym title="Cascading Style Sheet">CSS</acronym>, <acronym title="JavaScript">JS</acronym> files etc will appear to load instantly for siite visitors.</span>
164
  </td>
165
  </tr>
166
  <tr>
@@ -169,11 +235,13 @@
169
  <select name="cdn.engine">
170
  <optgroup label="Origin Pull (mirror is best):">
171
  <option value="mirror"<?php selected($this->_config->get_string('cdn.engine'), 'mirror'); ?>>Mirror</option>
 
172
  </optgroup>
173
  <optgroup label="Origin Push:">
 
174
  <option value="cf"<?php selected($this->_config->get_string('cdn.engine'), 'cf'); ?><?php if (! W3TC_PHP5 || ! $check_curl): ?> disabled="disabled"<?php endif; ?>>Amazon CloudFront</option>
175
  <option value="s3"<?php selected($this->_config->get_string('cdn.engine'), 's3'); ?><?php if (! W3TC_PHP5 || ! $check_curl): ?> disabled="disabled"<?php endif; ?>>Amazon Simple Storage Service (S3)</option>
176
- <option value="ftp"<?php selected($this->_config->get_string('cdn.engine'), 'ftp'); ?>>Self-hosted / File Transfer Protocol Upload</option>
177
  </optgroup>
178
  </select><br />
179
  <span class="description">Select the <acronym title="Content Delivery Network">CDN</acronym> type you wish to use.</span>
@@ -182,39 +250,60 @@
182
  </table>
183
 
184
  <p class="submit">
185
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
186
  </p>
187
  </fieldset>
188
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
189
  <fieldset>
190
  <legend>Support Us</legend>
191
-
192
  <p>We're working to make WordPress better. Please support us, here's how:</p>
193
-
194
  <p>
195
- <label>Link to us:
196
  <select name="common.support">
197
  <option value="">select one</option>
198
  <?php foreach ($supports as $support_id => $support_name): ?>
199
  <option value="<?php echo $support_id; ?>"<?php selected($support, $support_id); ?>><?php echo htmlspecialchars($support_name); ?></option>
200
  <?php endforeach; ?>
201
  </select>
202
- </label>, tell your friends with a <input type="button" class="button button-tweet" value="tweet" /> and give us a great <input type="button" class="button button-rating" value="rating" />.
203
  </p>
204
-
205
  <p>If you want to manually place a link, here is the code:</p>
206
- <p><textarea cols="80" rows="4">Performance Optimization &lt;a href=&quot;http://www.w3-edge.com/wordpress-plugins/&quot; rel=&quot;external&quot;&gt;WordPress Plugins&lt;/a&gt; by W3 EDGE</textarea></p>
207
-
208
  <p class="submit">
209
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
210
  </p>
211
  </fieldset>
212
-
213
  <fieldset>
214
  <legend>Debug</legend>
215
-
216
  <p>Detailed information about each cache will be appended in (publicly available) <acronym title="Hypertext Markup Language">HTML</acronym> comments in the page's source code. Performance in this mode will not be optimal, use sparingly and disable when not in use.</p>
217
-
218
  <table class="form-table">
219
  <tr>
220
  <th valign="top">Debug Mode:</th>
@@ -222,29 +311,68 @@
222
  <label><input type="checkbox" name="debug[]" value="pgcache"<?php checked($this->_config->get_boolean('pgcache.debug'), true); ?> /> Page Cache</label><br />
223
  <label><input type="checkbox" name="debug[]" value="minify"<?php checked($this->_config->get_boolean('minify.debug'), true); ?> /> Minify</label><br />
224
  <label><input type="checkbox" name="debug[]" value="dbcache"<?php checked($this->_config->get_boolean('dbcache.debug'), true); ?> /> Database Cache</label><br />
 
225
  <label><input type="checkbox" name="debug[]" value="cdn"<?php checked($this->_config->get_boolean('cdn.debug'), true); ?> /> Content Delivery Network</label><br />
226
  <span class="description">If selected, detailed caching information will be appear at the end of each page in a <acronym title="Hypertext Markup Language">HTML</acronym> comment. View a page's source code to review.</span>
227
  </td>
228
  </tr>
229
- </table>
230
-
231
  <p class="submit">
232
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
233
  </p>
234
  </fieldset>
235
 
236
  <fieldset>
237
  <legend>Miscellaneous</legend>
238
 
239
- <p>
240
  <input type="hidden" name="widget.latest.enabled" value="0" />
241
- <label><input type="checkbox" name="widget.latest.enabled" value="1"<?php checked($this->_config->get_boolean('widget.latest.enabled'), true); ?> /> Enable dashboard news widget</label><br />
 
242
  </p>
243
-
 
 
 
 
 
 
244
  <p class="submit">
245
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
246
  </p>
247
  </fieldset>
248
  </form>
249
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
250
  <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
3
+ <p>
4
+ The plugin is currently <span class="w3tc-<?php if ($enabled): ?>enabled">enabled<?php else: ?>disabled">disabled<?php endif; ?></span>. If an option is disabled it means that either your current installation is not compatible or software installation is required.
5
+ </p>
6
 
7
+ <form action="admin.php">
8
+ <p>
9
+ Perform a
10
+ <input type="hidden" name="page" value="<?php echo $this->_page; ?>" />
11
+ <input type="button" class="button button-self-test" value="compatibility check" />,
12
+ <input class="button" type="submit" name="flush_all" value="empty all caches"<?php if (! $can_empty_memcache && ! $can_empty_opcode && ! $can_empty_file): ?> disabled="disabled"<?php endif; ?> /> at once or
 
13
  <input class="button" type="submit" name="flush_memcached" value="empty only the memcached cache(s)"<?php if (! $can_empty_memcache): ?> disabled="disabled"<?php endif; ?> /> or
14
+ <input class="button" type="submit" name="flush_opcode" value="empty only the opcode cache"<?php if (! $can_empty_opcode): ?> disabled="disabled"<?php endif; ?> /> or
15
  <input class="button" type="submit" name="flush_file" value="empty only the disk cache(s)"<?php if (! $can_empty_file): ?> disabled="disabled"<?php endif; ?> />.
16
  </p>
17
  </form>
18
 
19
+ <form action="admin.php?page=<?php echo $this->_page; ?>" method="post">
20
  <fieldset>
21
  <legend>General</legend>
22
 
23
+ <table class="form-table">
24
+ <tr>
25
+ <th colspan="2">
26
+ <label>
27
+ <input id="enabled" type="checkbox" name="enabled" value="1"<?php checked($enabled, true); ?> />
28
+ Deselect this option to disable all caching functionality.
29
+ </label>
30
+ </th>
31
+ </tr>
32
+ <tr>
33
+ <th valign="top">Preview Mode:</th>
34
+ <td>
35
+ <?php if ($preview): ?>
36
+ <input type="hidden" name="preview" value="0" />
37
+ <input type="submit" name="preview_save" class="button-primary" value="Disable" />
38
+ <?php echo $this->button_link('Preview', w3_get_site_url() . '/?w3tc_preview=1', true); ?>
39
+ <?php echo $this->button_link('Deploy', sprintf('admin.php?page=%s&preview_deploy', $this->_page)); ?>
40
+ <?php else: ?>
41
+ <input type="hidden" name="preview" value="1" />
42
+ <input type="submit" name="preview_save" class="button-primary" value="Enable" />
43
+ <?php endif; ?>
44
+ <br /><span class="description">Use preview mode to test configuration scenarios prior to releasing them (deploy) on the actual site.</span>
45
+ </td>
46
+ </tr>
47
+ </table>
48
 
49
  <p class="submit">
50
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
51
  </p>
52
  </fieldset>
53
 
54
  <fieldset>
55
+ <legend><a href="admin.php?page=w3tc_pgcache">Page Cache</a></legend>
56
+
57
  <p>Enable page caching to decrease the response time of your blog.</p>
58
+
59
  <table class="form-table">
60
  <tr>
61
+ <th valign="top">Page Cache:</th>
62
  <td>
63
  <input type="hidden" name="pgcache.enabled" value="0" />
64
+ <label><input class="enabled" type="checkbox" name="pgcache.enabled" value="1"<?php checked($pgcache_enabled, true); ?> />&nbsp;<strong>Enable</strong></label>
65
+ <br /><span class="description">Caching pages will reduce the response time of your site and increase the scale of your web server.</span>
66
  </td>
67
  </tr>
68
  <tr>
69
+ <th valign="top">Page Cache Method:</th>
70
  <td>
71
  <select name="pgcache.engine">
72
  <optgroup label="Shared Server (disk enhanced is best):">
78
  <option value="eaccelerator"<?php selected($this->_config->get_string('pgcache.engine'), 'eaccelerator'); ?><?php if (! $check_eaccelerator): ?> disabled="disabled"<?php endif; ?>>Opcode: eAccelerator</option>
79
  <option value="xcache"<?php selected($this->_config->get_string('pgcache.engine'), 'xcache'); ?><?php if (! $check_xcache): ?> disabled="disabled"<?php endif; ?>>Opcode: XCache</option>
80
  </optgroup>
81
+ <optgroup label="Multiple Servers:">
82
  <option value="memcached"<?php selected($this->_config->get_string('pgcache.engine'), 'memcached'); ?><?php if (! $check_memcached): ?> disabled="disabled"<?php endif; ?>>Memcached</option>
83
  </optgroup>
84
  </select>
87
  </table>
88
 
89
  <p class="submit">
90
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
91
  </p>
92
  </fieldset>
93
+
94
  <fieldset>
95
+ <legend>
96
+ <?php if (W3TC_PHP5): ?>
97
+ <a href="admin.php?page=w3tc_minify">Minify</a>
98
+ <?php else: ?>
99
+ Minify
100
+ <?php endif; ?>
101
+ </legend>
102
 
103
  <p>Reduce load time by decreasing the size and number of <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> files. Automatically remove unncessary data from <acronym title="Cascading Style Sheet">CSS</acronym>, <acronym title="JavaScript">JS</acronym>, feed, page and post <acronym title="Hypertext Markup Language">HTML</acronym>.</p>
104
+
105
  <table class="form-table">
106
  <tr>
107
  <th valign="top">Minify:</th>
108
  <td>
109
  <input type="hidden" name="minify.enabled" value="0"<?php if (! W3TC_PHP5): ?> disabled="disabled"<?php endif; ?> />
110
+ <label><input class="enabled" type="checkbox" name="minify.enabled" value="1"<?php checked($minify_enabled, true); ?><?php if (! W3TC_PHP5): ?> disabled="disabled"<?php endif; ?> />&nbsp;<strong>Enable</strong></label>
111
+ <br /><span class="description">Minification can decrease file size of <acronym title="Hypertext Markup Language">HTML</acronym>, <acronym title="Cascading Style Sheet">CSS</acronym>, <acronym title="JavaScript">JS</acronym> and feeds respectively by ~10% on average.</span>
112
  </td>
113
  </tr>
114
  <tr>
115
+ <th valign="top">Minify Cache Method:</th>
116
  <td>
117
  <select name="minify.engine"<?php if (! W3TC_PHP5): ?> disabled="disabled"<?php endif; ?>>
118
  <optgroup label="Shared Server (disk is best):">
132
  </table>
133
 
134
  <p class="submit">
135
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
136
  </p>
137
  </fieldset>
138
+
139
  <fieldset>
140
+ <legend><a href="admin.php?page=w3tc_dbcache">Database Cache</a></legend>
141
+
142
  <p>Enable database caching to reduce post, page and feed creation time.</p>
143
+
144
  <table class="form-table">
145
  <tr>
146
+ <th valign="top">Database Cache:</th>
147
  <td>
148
  <input type="hidden" name="dbcache.enabled" value="0" />
149
+ <label><input class="enabled" type="checkbox" name="dbcache.enabled" value="1"<?php checked($dbcache_enabled, true); ?> />&nbsp;<strong>Enable</strong></label>
150
+ <br /><span class="description">Caching database objects may decrease the response time of your blog by up to 100x.</span>
151
  </td>
152
  </tr>
153
  <tr>
154
+ <th valign="top">Database Cache Method:</th>
155
  <td>
156
  <select name="dbcache.engine">
157
  <optgroup label="Shared Server:">
171
  </table>
172
 
173
  <p class="submit">
174
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
175
  </p>
176
  </fieldset>
177
+
178
+
179
  <fieldset>
180
+ <legend><a href="admin.php?page=w3tc_objectcache">Object Cache</a></legend>
181
+
182
+ <p>Enable object caching to further reduce execution time for common operations.</p>
183
+
184
+ <table class="form-table">
185
+ <tr>
186
+ <th valign="top">Object Cache:</th>
187
+ <td>
188
+ <input type="hidden" name="objectcache.enabled" value="0" />
189
+ <label><input class="enabled" type="checkbox" name="objectcache.enabled" value="1"<?php checked($objectcache_enabled, true); ?> />&nbsp;<strong>Enable</strong></label>
190
+ <br /><span class="description">Object caching greatly increases performance for highly dynamic sites (that use the Object Cache API).</span>
191
+ </td>
192
+ </tr>
193
+ <tr>
194
+ <th valign="top">Object Cache Method:</th>
195
+ <td>
196
+ <select name="objectcache.engine">
197
+ <optgroup label="Shared Server:">
198
+ <option value="file"<?php selected($this->_config->get_string('objectcache.engine'), 'file'); ?>>Disk</option>
199
+ </optgroup>
200
+ <optgroup label="Dedicated / Virtual Server:">
201
+ <option value="apc"<?php selected($this->_config->get_string('objectcache.engine'), 'apc'); ?><?php if (! $check_apc): ?> disabled="disabled"<?php endif; ?>>Opcode: Alternative PHP Cache (APC)</option>
202
+ <option value="eaccelerator"<?php selected($this->_config->get_string('objectcache.engine'), 'eaccelerator'); ?><?php if (! $check_eaccelerator): ?> disabled="disabled"<?php endif; ?>>Opcode: eAccelerator</option>
203
+ <option value="xcache"<?php selected($this->_config->get_string('objectcache.engine'), 'xcache'); ?><?php if (! $check_xcache): ?> disabled="disabled"<?php endif; ?>>Opcode: XCache</option>
204
+ </optgroup>
205
+ <optgroup label="Multiple Servers:">
206
+ <option value="memcached"<?php selected($this->_config->get_string('objectcache.engine'), 'memcached'); ?><?php if (! $check_memcached): ?> disabled="disabled"<?php endif; ?>>Memcached</option>
207
+ </optgroup>
208
+ </select>
209
+ </td>
210
+ </tr>
211
+ </table>
212
+
213
+ <p class="submit">
214
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
215
+ </p>
216
+ </fieldset>
217
+
218
+ <fieldset>
219
+ <legend><a href="admin.php?page=w3tc_cdn">Content Delivery Network</a></legend>
220
+
221
+ <p>Host static files with your content delivery network provider to reduce load time.</p>
222
+
223
  <table class="form-table">
224
  <tr>
225
  <th><acronym title="Content Delivery Network">CDN</acronym>:</th>
226
  <td>
227
  <input type="hidden" name="cdn.enabled" value="0" />
228
+ <label><input class="enabled" type="checkbox" name="cdn.enabled" value="1"<?php checked($cdn_enabled, true); ?> />&nbsp;<strong>Enable</strong></label>
229
+ <br /><span class="description">Theme files, media library attachments, <acronym title="Cascading Style Sheet">CSS</acronym>, <acronym title="JavaScript">JS</acronym> files etc will appear to load instantly for site visitors.</span>
230
  </td>
231
  </tr>
232
  <tr>
235
  <select name="cdn.engine">
236
  <optgroup label="Origin Pull (mirror is best):">
237
  <option value="mirror"<?php selected($this->_config->get_string('cdn.engine'), 'mirror'); ?>>Mirror</option>
238
+ <option value="netdna"<?php selected($this->_config->get_string('cdn.engine'), 'netdna'); ?>>Mirror: NetDNA / MaxCDN</option>
239
  </optgroup>
240
  <optgroup label="Origin Push:">
241
+ <option value="rscf"<?php selected($this->_config->get_string('cdn.engine'), 'rscf'); ?><?php if (! W3TC_PHP5 || ! $check_curl): ?> disabled="disabled"<?php endif; ?>>Rackspace Cloud Files</option>
242
  <option value="cf"<?php selected($this->_config->get_string('cdn.engine'), 'cf'); ?><?php if (! W3TC_PHP5 || ! $check_curl): ?> disabled="disabled"<?php endif; ?>>Amazon CloudFront</option>
243
  <option value="s3"<?php selected($this->_config->get_string('cdn.engine'), 's3'); ?><?php if (! W3TC_PHP5 || ! $check_curl): ?> disabled="disabled"<?php endif; ?>>Amazon Simple Storage Service (S3)</option>
244
+ <option value="ftp"<?php selected($this->_config->get_string('cdn.engine'), 'ftp'); ?><?php if (! $check_ftp): ?> disabled="disabled"<?php endif; ?>>Self-hosted / File Transfer Protocol Upload</option>
245
  </optgroup>
246
  </select><br />
247
  <span class="description">Select the <acronym title="Content Delivery Network">CDN</acronym> type you wish to use.</span>
250
  </table>
251
 
252
  <p class="submit">
253
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
254
  </p>
255
  </fieldset>
256
 
257
+ <fieldset>
258
+ <legend><a href="admin.php?page=w3tc_browsercache">Browser Cache</a></legend>
259
+
260
+ <p>Reduce server load and decrease response time by using the cache available in site visitor's web browser.</p>
261
+
262
+ <table class="form-table">
263
+ <tr>
264
+ <th valign="top">Browser Cache:</th>
265
+ <td>
266
+ <input type="hidden" name="browsercache.enabled" value="0" />
267
+ <label><input class="enabled" type="checkbox" name="browsercache.enabled" value="1"<?php checked($browsercache_enabled, true); ?> />&nbsp;<strong>Enable</strong></label>
268
+ <br /><span class="description">Enable <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression and add headers to reduce server load and decrease file load time.</span>
269
+ </td>
270
+ </tr>
271
+ </table>
272
+
273
+ <p class="submit">
274
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
275
+ </p>
276
+ </fieldset>
277
+
278
  <fieldset>
279
  <legend>Support Us</legend>
280
+
281
  <p>We're working to make WordPress better. Please support us, here's how:</p>
282
+
283
  <p>
284
+ <label>Link to us in your
285
  <select name="common.support">
286
  <option value="">select one</option>
287
  <?php foreach ($supports as $support_id => $support_name): ?>
288
  <option value="<?php echo $support_id; ?>"<?php selected($support, $support_id); ?>><?php echo htmlspecialchars($support_name); ?></option>
289
  <?php endforeach; ?>
290
  </select>
291
+ </label>, tell your friends with a <input type="button" class="button button-tweet" value="tweet" /> and give us a perfect <input type="button" class="button button-rating" value="rating" />.
292
  </p>
293
+
294
  <p>If you want to manually place a link, here is the code:</p>
295
+ <p><textarea cols="80" rows="4">Performance Optimization &lt;a href=&quot;http://www.w3-edge.com/wordpress-plugins/&quot; rel=&quot;external&quot;&gt;WordPress Plugins&lt;/a&gt; by W3 EDGE</textarea></p>
296
+
297
  <p class="submit">
298
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
299
  </p>
300
  </fieldset>
301
+
302
  <fieldset>
303
  <legend>Debug</legend>
304
+
305
  <p>Detailed information about each cache will be appended in (publicly available) <acronym title="Hypertext Markup Language">HTML</acronym> comments in the page's source code. Performance in this mode will not be optimal, use sparingly and disable when not in use.</p>
306
+
307
  <table class="form-table">
308
  <tr>
309
  <th valign="top">Debug Mode:</th>
311
  <label><input type="checkbox" name="debug[]" value="pgcache"<?php checked($this->_config->get_boolean('pgcache.debug'), true); ?> /> Page Cache</label><br />
312
  <label><input type="checkbox" name="debug[]" value="minify"<?php checked($this->_config->get_boolean('minify.debug'), true); ?> /> Minify</label><br />
313
  <label><input type="checkbox" name="debug[]" value="dbcache"<?php checked($this->_config->get_boolean('dbcache.debug'), true); ?> /> Database Cache</label><br />
314
+ <label><input type="checkbox" name="debug[]" value="objectcache"<?php checked($this->_config->get_boolean('objectcache.debug'), true); ?> /> Object Cache</label><br />
315
  <label><input type="checkbox" name="debug[]" value="cdn"<?php checked($this->_config->get_boolean('cdn.debug'), true); ?> /> Content Delivery Network</label><br />
316
  <span class="description">If selected, detailed caching information will be appear at the end of each page in a <acronym title="Hypertext Markup Language">HTML</acronym> comment. View a page's source code to review.</span>
317
  </td>
318
  </tr>
319
+ </table>
320
+
321
  <p class="submit">
322
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
323
  </p>
324
  </fieldset>
325
 
326
  <fieldset>
327
  <legend>Miscellaneous</legend>
328
 
329
+ <p>
330
  <input type="hidden" name="widget.latest.enabled" value="0" />
331
+ <label><input type="checkbox" name="widget.latest.enabled" value="1"<?php checked($this->_config->get_boolean('widget.latest.enabled'), true); ?> /> Enable dashboard news widget</label>
332
+ <br /><span class="description">Display latest tweets and support tips on the WordPress Dashboard.</span>
333
  </p>
334
+
335
+ <p>
336
+ <input type="hidden" name="file_locking" value="0"<?php if (! $can_empty_file): ?> disabled="disabled"<?php endif; ?> />
337
+ <label><input type="checkbox" name="file_locking" value="1"<?php checked($file_locking, true); ?><?php if (! $can_empty_file): ?> disabled="disabled"<?php endif; ?> /> Enable file locking</label>
338
+ <br /><span class="description">Not recommended for network-based file systems.</span>
339
+ </p>
340
+
341
  <p class="submit">
342
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
343
  </p>
344
  </fieldset>
345
  </form>
346
 
347
+ <form action="admin.php?page=<?php echo $this->_page; ?>" method="post" enctype="multipart/form-data">
348
+ <fieldset>
349
+ <legend>Import / Export Settings</legend>
350
+
351
+ <table class="form-table">
352
+ <tr>
353
+ <th>Import configuration:</th>
354
+ <td>
355
+ <input type="file" name="config_file" />
356
+ <input type="submit" name="config_import" class="button" value="Upload" />
357
+ <br /><span class="description">Upload and replace the settings file on the server.</span>
358
+ </td>
359
+ </tr>
360
+ <tr>
361
+ <th>Export configuration:</th>
362
+ <td>
363
+ <input type="submit" name="config_export" class="button" value="Download" />
364
+ <br /><span class="description">Download the settings file from the server.</span>
365
+ </td>
366
+ </tr>
367
+ <tr>
368
+ <th>Reset configuration:</th>
369
+ <td>
370
+ <input type="submit" name="config_reset" class="button" value="Restore Default Settings" />
371
+ <br /><span class="description">Revert all settings to the defaults. Any settings staged in preview mode will not be modified.</span>
372
+ </td>
373
+ </tr>
374
+ </table>
375
+ </fieldset>
376
+ </form>
377
+
378
  <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
inc/options/install.phtml CHANGED
@@ -1,166 +1,307 @@
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
3
  <div id="install">
4
- <h3>Plugin Installation</h3>
5
-
6
  <ol>
7
- <li>Set the permissions of wp-content back to 755, e.g.: # chmod 755 /var/www/vhosts/domain.com/httpdocs/wp-content/</li>
8
- <li>On the "<a href="options-general.php?page=w3-total-cache/w3-total-cache.php&amp;tab=general">General Settings</a>" tab and select your caching methods for page, database and minify. In most cases, "disk enhanced" mode for page cache, "disk" mode for minify and "disk" mode for database caching are "good" settings.</li>
9
- <li><em>Optional:</em> If you already have a content delivery network (<acronym title="Content Delivery Network">CDN</acronym>) provider, proceed to the "<a href="options-general.php?page=w3-total-cache/w3-total-cache.php&amp;tab=cdn"><acronym title="Content Delivery Network">CDN</acronym> Settings</a>" tab and populate the fields and set your preferences. If you do not use the Media Library, you will need to import your images etc into the default locations. Use the Media Library Import Tool on the <acronym title="Content Delivery Network">CDN</acronym> Setting tab to perform this task. If you do not have a <acronym title="Content Delivery Network">CDN</acronym> provider, you can still improve your site's performance using the "Self-hosted" method. On your own server, create a subdomain and matching <acronym title="Domain Name System">DNS</acronym> Zone record; e.g. static.domain.com and configure <acronym title="File Transfer Protocol">FTP</acronym> options on the <acronym title="Content Delivery Network">CDN</acronym> tab accordingly. Be sure to <acronym title="File Transfer Protocol">FTP</acronym> upload the appropriate files, using the available upload buttons.</li>
10
- <li><em>Optional:</em> On the "<a href="options-general.php?page=w3-total-cache/w3-total-cache.php&amp;tab=minify">Minify Settings</a>" tab all of the recommended settings are preset. View your site's <acronym title="Hypertext Markup Language">HTML</acronym> source and search for .css and .js files and then specify any <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> files in the respective section. In the case of <acronym title="JavaScript">JS</acronym> files you can (optionally) specify the type and location of the embedding using the drop down menu. See the plugin's <a href="options-general.php?page=w3-total-cache/w3-total-cache.php&amp;tab=faq">FAQ</a> for more information on usage.</li>
11
- <li><em>Optional:</em> On the "<a href="options-general.php?page=w3-total-cache/w3-total-cache.php&amp;tab=dbcache">Database Cache Settings</a>" tab the recommended settings are preset. If you're using a shared hosting account use the "disk" method with caution; in either of these cases the response time of the disk may not be fast enough, so this option is disabled by default.</li>
12
- <li>You're done! Get back to blogging!</li>
 
 
 
 
 
13
  </ol>
14
- Check out the <acronym title="Frequently Asked Questions">FAQ</acronym> for more details on <a href="options-general.php?page=w3-total-cache/w3-total-cache.php&amp;tab=faq">usage</a>.
15
- <hr />
16
- <h3>(Optional) Software Installation for Dedicated / Virtual Dedicated / Multiple Servers</h3>
17
 
18
- <p><strong>Server Preparation:</strong><br />
19
- <em>Time required: ~1 minute</em></p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  <ol>
21
- <li><a href="http://www.google.com/search?q=installing%20yum&amp;output=search&amp;tbs=qdr:y&amp;tbo=1" target="_blank">Install yum</a> if you don't already have it. Then, if you like, you can update all of your installed software, but do so only if you have the experience and time to double check configurations afterwards:<br />
22
- # yum update</li>
23
- <li>Install <acronym title="PHP Extension Community Library">PECL</acronym>:<br />
24
- # yum install php-pear</li>
25
- <li>Install the <acronym title="Hypertext Preprocessor">PHP</acronym> Development package:<br />
26
- # yum install php-devel</li>
27
- <li>Install apxs with the following command:<br />
28
- # yum install httpd-devel</li>
29
- <li>Make sure GCC is up-to-date:<br />
30
- # yum install gcc make</li>
31
- <li>Make sure ZLIB is fully installed:<br />
32
- # yum install zlib-devel</li>
 
 
 
 
 
 
 
 
 
 
 
 
33
  </ol>
34
- <hr />
35
- <p id="memcached"><strong>Memcached (Daemon) Installation:</strong><br />
36
- <em>Time required: 2 minutes</em></p>
 
 
37
  <ol>
38
- <li>Try to install with yum:<br />
39
- # yum install libevent libevent-devel<br />
40
- <br />
41
- If this succeeds skip to #5. If this fails, then let's compile. Download and extract the <a href="http://www.monkey.org/~provos/libevent/" target="_blank">latest stable version</a>:<br />
42
- # cd /usr/local/src &amp;&amp; wget <a href="http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz" target="_blank">http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz</a> &amp;&amp; tar -xzf libevent-1.4.13-stable.tar.gz &amp;&amp; cd libevent-1.4.13-stable</li>
43
- <li>Let's compile:<br />
44
- # ./configure &amp;&amp; make &amp;&amp; make install</li>
45
- <li>In the output you should see:<br />
46
- <br />
47
- Libraries have been installed in:<br />
48
- /usr/local/lib<br />
49
- <br />
50
- If so you can:<br />
51
- # echo "/usr/local/lib/" &gt; /etc/ld.so.conf.d/libevent.conf</li>
52
- <li>Configure your server for the new install:<br />
53
- # ldconfig -v</li>
54
- <li>Now find the <a href="http://www.danga.com/memcached/download.bml" target="_blank">latest stable memcached</a>, download and extract:<br />
55
- # cd /usr/local/src &amp;&amp; wget <a href="http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz" target="_blank">http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz</a> &amp;&amp; tar -xzf memcached-1.4.4.tar.gz &amp;&amp; cd memcached-1.4.4</li>
56
- <li>Let's compile:<br />
57
- # ./configure &amp;&amp; make &amp;&amp; make install</li>
58
- <li>Make sure memcached is starts automatically on server boot:<br />
59
- # touch /etc/init.d/memcached<br />
60
- # echo '#!/bin/sh -e' &gt;&gt; /etc/init.d/memcached<br />
61
- # echo '/usr/local/bin/memcached -d -m 128 -p 11211 -u nobody -l localhost' &gt;&gt; /etc/init.d/memcached<br />
62
- # chmod u+x /etc/init.d/memcached<br />
63
- # echo '/etc/init.d/memcached' &gt;&gt; /etc/rc.local</li>
64
- <li>And finally, let's start memcached:<br />
65
- # /etc/init.d/memcached</li>
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  </ol>
 
67
  <hr />
68
- <p id="memcache"><strong><acronym title="PHP Extension Community Library">PECL</acronym> Memcache Module Installation:</strong><br />
69
- <em>Time required: 1 minute</em></p>
 
70
  <ol>
71
- <li>Either use <acronym title="PHP Extension Community Library">PECL</acronym> (and skip to #4 if successful):<br />
72
- # pecl install memcache</li>
73
- <li>Or via compilation. Download the <a href="http://pecl.php.net/package/memcache" target="_blank">latest stable version</a> and extract:<br />
74
- # cd /usr/local/src/ &amp;&amp; wget <a href="http://pecl.php.net/get/memcache-2.2.5.tgz" target="_blank">http://pecl.php.net/get/memcache-2.2.5.tgz</a> &amp;&amp; tar -xzf memcache-2.2.5.tgz &amp;&amp; cd memcache-2.2.5</li>
75
- <li>Now we start to compile:<br />
76
- # phpize &amp;&amp; ./configure &amp;&amp; make &amp;&amp; make install</li>
77
- <li>You can also use the memcache.ini file we prepared for you:<br />
78
- # cp /var/www/vhosts/domain.com/httpdocs/wp-content/plugins/w3-total-cache/ini/memcache.ini /etc/php.d/</li>
79
- <li>Finally restart apache:<br />
80
- # /etc/init.d/httpd restart</li>
81
- <li>You're done! Memcache should now be available. If the following command retuns anything, you're all set:<br />
82
- # php -r 'phpinfo();' | grep 'memcache'</li>
83
- </ol>
84
- <p>For windows users we recommend checking the following site(s) for more installation tips:</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  <ul>
86
  <li><a href="http://pureform.wordpress.com/2008/01/10/installing-memcache-on-windows-for-php/" target="_blank">Installing memcache on Windows for <acronym title="Hypertext Preprocessor">PHP</acronym></a></li>
87
- </ul>
 
88
  <hr />
89
- <p id="APC"><strong><acronym title="PHP Extension Community Library">PECL</acronym> Alternative PHP Cache (<acronym title="Alternative PHP Cache">APC</acronym>) Installation (Recommended):</strong><br />
90
- <em>Time required: 1 minute</em></p>
 
91
  <ol>
92
- <li>Install <acronym title="Alternative PHP Cache">APC</acronym> using the <acronym title="PHP Extension Community Library">PECL</acronym> command (and skip to #5 if successful):<br />
93
- # pecl install apc</li>
94
- <li>Or via compilation. Download the <a href="http://pecl.php.net/package/APC" target="_blank">latest stable version</a> and extract:<br />
95
- # cd /usr/local/src &amp;&amp; wget <a href="http://pecl.php.net/get/APC-3.0.19.tgz" target="_blank">http://pecl.php.net/get/APC-3.0.19.tgz</a> &amp;&amp; tar -xzf APC-3.0.19.tgz &amp;&amp; cd APC-3.0.19</li>
96
- <li>Note the path returned for the following command:<br />
97
- # whereis php-config</li>
98
- <li>Use the output from #2 to modify the --with-apxs and --with-php-config flags in the following compile command:<br />
99
- # phpize &amp;&amp; ./configure --enable-apc --enable-apc-mmap --with-apxs=/usr/bin/phpize --with-php-config=/usr/bin/php-config &amp;&amp; make &amp;&amp; make install<br />
100
- <br />The result should be similar to:<br />
101
- Installing shared extensions: /usr/lib/php/modules/</li>
102
- <li>You can also use the apc.ini file we prepared for you:<br />
103
- # cp /var/www/vhosts/domain.com/httpdocs/wp-content/plugins/w3-total-cache/ini/apc.ini /etc/php.d/</li>
104
- <li>Restart apache when ready:<br />
105
- # /etc/init.d/httpd restart</li>
106
- <li>You're done! <acronym title="Alternative PHP Cache">APC</acronym> should now be available. If the following command retuns anything, you're all set:<br />
107
- # php -r 'phpinfo();' | grep 'apc'</li>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  </ol>
 
109
  <p>For windows users we recommend checking the following site(s) for more installation tips:</p>
 
110
  <ul>
111
  <li><a href="http://www.sitebuddy.com/PHP/Accelerators/apc_windows_binaries_builds" target="_blank"><acronym title="Alternative PHP Cache">APC</acronym> binaries for <acronym title="Hypertext Preprocessor">PHP</acronym> 5.x (windows builds)</a></li>
112
  </ul>
 
113
  <hr />
114
- <p id="eAccelerator"><strong>eAccelerator Installation:</strong><br />
115
- <em>Time required: 1 minute</em></p>
 
116
  <ol>
117
- <li>If using <acronym title="Hypertext Preprocessor">PHP</acronym> v5.2+, download the <a href="http://eaccelerator.net/" target="_blank">latest compatible version</a> and extract:<br />
118
- # cd /usr/local/src &amp;&amp; wget <a href="http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2" target="_blank">http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2</a> &amp;&amp; tar -xjf eaccelerator-0.9.6.tar.bz2 &amp;&amp; cd eaccelerator-0.9.6</li>
119
- <li>Note the path returned for the following command:<br />
120
- # whereis php-config</li>
121
- <li>Use the output from #2 to modify the --with-php-config flag in the following compile command:<br />
122
- # phpize &amp;&amp; ./configure --enable-eaccelerator=shared --with-php-config=/usr/bin/php-config &amp;&amp; make &amp;&amp; make install<br />
123
- <br />The result should be similar to:<br />
124
- Installing shared extensions: /usr/lib/php/modules/</li>
125
- <li>You can also use the eaccelerator.ini file we prepared for you:<br />
126
- # cp /var/www/vhosts/domain.com/httpdocs/wp-content/plugins/w3-total-cache/ini/eaccelerator.ini /etc/php.d/</li>
127
- <li>Restart apache when ready:<br />
128
- # /etc/init.d/httpd restart</li>
129
- <li>You're done! eAccelerator should now be available. If the following command retuns anything, you're all set:<br />
130
- # php -r 'phpinfo();' | grep 'eaccelerator'</li>
 
 
 
 
 
 
 
 
 
 
 
 
131
  </ol>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
  <p>For windows users we recommend checking the following site(s) for more installation tips:</p>
 
133
  <ul>
134
  <li><a href="http://www.sitebuddy.com/PHP/Accelerators/eAccelerator_windows_binaries_builds" target="_blank">eAccelerator binaries for <acronym title="Hypertext Preprocessor">PHP</acronym> 5.x (windows builds)</a></li>
135
  </ul>
136
- <hr />
137
- <p id="XCache"><strong>XCache Installation:</strong><br />
138
- <em>Time required: 1 minute</em></p>
139
- <ol>
140
- <li>Download the <a href="http://xcache.lighttpd.net/wiki/ReleaseArchive" target="_blank">latest compatible version</a> and extract:<br />
141
- # cd /usr/local/src &amp;&amp; wget <a href="http://xcache.lighttpd.net/pub/Releases/1.3.0/xcache-1.3.0.tar.gz" target="_blank">http://xcache.lighttpd.net/pub/Releases/1.3.0/xcache-1.3.0.tar.gz</a> &amp;&amp; tar -xzf xcache-1.3.0.tar.gz &amp;&amp; cd xcache-1.3.0</li>
142
- <li>Note the path returned for the following command:<br />
143
- # whereis php-config</li>
144
- <li>Use the output from #2 to modify the --with-php-config flag in the following compile command:<br />
145
- # phpize &amp;&amp; ./configure --with-php-config=/usr/bin/php-config --enable-xcache --enable-xcache-optimizer --enable-xcache-coverager &amp;&amp; make &amp;&amp; make install<br />
146
- <br />The result should be similar to:<br />
147
- Installing shared extensions: /usr/lib/php/modules/</li>
148
- <li>You can also use the eaccelerator.ini file we prepared for you:<br />
149
- # cp /var/www/vhosts/domain.com/httpdocs/wp-content/plugins/w3-total-cache/ini/xcache.ini /etc/php.d/</li>
150
- <li>Restart apache when ready:<br />
151
- # /etc/init.d/httpd restart</li>
152
- <li>You're done! XCache should now be available. If the following command retuns anything, you're all set:<br />
153
- # php -r 'phpinfo();' | grep 'xcache'</li>
154
- </ol>
155
  <hr />
156
- <p><strong>Note(s):</strong></p>
157
- <ul>
158
- <li>The provided instructions are for 32-bit CentOS, however we can provide others based on <a href="mailto:wordpressexperts@w3-edge.com">your requests</a>.</li>
159
- <li>In the case where Apache is not used, the .htaccess file located in the root directory of the WordPress installation, wp-content/w3tc/pgcache/.htaccess and wp-content/w3tc/min/.htaccess contain directives that must be re-created for your web server software.</li>
160
- <li>Restarting the web server will empty the opcode cache, which means it will have to be rebuilt over time and your site's performance will suffer during this period. Still, an opcode cache should be installed in any case to maximize WordPress performance.</li>
161
- <li>Consider using memcached for objects that must persist across web server restarts or that you wish to share amongst your pool of servers (or cluster), e.g.: database objects or page cache.</li>
162
- <li>Some yum or mirrors may not have the necessary packages, in such cases you may have to do a manual installation.</li>
163
- </ul>
 
 
 
 
 
 
 
 
 
 
 
164
  </div>
165
 
166
  <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
3
  <div id="install">
 
 
4
  <ol>
5
+ <li>
6
+ Set the permissions of wp-content/ back to 755, e.g.:
7
+ <pre class="console"># chmod 755 /var/www/vhosts/domain.com/httpdocs/wp-content/</pre>
8
+ </li>
9
+ <li>On the "<a href="admin.php?page=w3tc_general">General</a>" tab and select your caching methods for page, database and minify. In most cases, "disk enhanced" mode for page cache, "disk" mode for minify and "disk" mode for database caching are "good" settings.</li>
10
+ <li><em>Recommended:</em> On the "<a href="admin.php?page=w3tc_minify">Minify</a>" tab all of the recommended settings are preset. Use the help button to simplify discovery of your <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> files and groups. Pay close attention to the method and location of your <acronym title="JavaScript">JS</acronym> group embeddings. See the plugin's <a href="admin.php?page=w3tc_faq">FAQ</a> for more information on usage.</li>
11
+ <li><em>Recommended:</em> If you already have a content delivery network (<acronym title="Content Delivery Network">CDN</acronym>) provider, proceed to the "<a href="admin.php?page=w3tc_cdn">Content Delivery Network</a>" tab and populate the fields and set your preferences. If you do not use the Media Library, you will need to import your images etc into the default locations. Use the Media Library Import Tool on the "Content Delivery Network" tab to perform this task. If you do not have a <acronym title="Content Delivery Network">CDN</acronym> provider, you can still improve your site's performance using the "Self-hosted" method. On your own server, create a subdomain and matching <acronym title="Domain Name System">DNS</acronym> Zone record; e.g. static.domain.com and configure <acronym title="File Transfer Protocol">FTP</acronym> options on the "Content Delivery Network" tab accordingly. Be sure to <acronym title="File Transfer Protocol">FTP</acronym> upload the appropriate files, using the available upload buttons.</li>
12
+ <li><em>Recommended:</em> On the "<a href="admin.php?page=w3tc_browsercache">Browser Cache</a>" tab, HTTP compression is enabled by default. Make sure to enable other options to suit your goals.</li>
13
+ <li><em>Optional:</em> On the "<a href="admin.php?page=w3tc_dbcache">Database Cache</a>" tab the recommended settings are preset. If using a shared hosting account use the "disk" method with caution; in either of these cases the response time of the disk may not be fast enough, so this option is disabled by default.</li>
14
+ <li><em>Optional:</em> On the "<a href="admin.php?page=w3tc_objectcache">Object Cache</a>" tab the recommended settings are preset. If using a shared hosting account use the "disk" method with caution, the response time of the disk may not be fast enough, so this option is disabled by default. Test this option with and without database cache to ensure that it provides a performance increase.</li>
15
+ <li><em>Optional:</em> On the "<a href="admin.php?page=w3tc_mobile">User Agent Groups</a>" tab, specify any user agents, like mobile phones if a mobile theme is used.</li>
16
  </ol>
 
 
 
17
 
18
+ <p>
19
+ Check out the <acronym title="Frequently Asked Questions">FAQ</acronym> for more details on <a href="admin.php?page=w3tc_faq">usage</a>.
20
+ </p>
21
+
22
+ <hr />
23
+
24
+ <?php if ($document_root_rules || $home_root_rules || $pgcache_rules || $minify_rules || $cdn_rules): ?>
25
+ <h3>Rewrite rules</h3>
26
+ <?php if ($document_root_rules): ?>
27
+ <p><strong><?php echo htmlspecialchars($document_root_htaccess); ?>:</strong></p>
28
+ <pre class="code"><?php echo htmlspecialchars($document_root_rules); ?></pre>
29
+ <?php endif; ?>
30
+
31
+ <?php if ($home_root_rules): ?>
32
+ <p><strong><?php echo htmlspecialchars($home_root_htaccess); ?>:</strong></p>
33
+ <pre class="code"><?php echo htmlspecialchars($home_root_rules); ?></pre>
34
+ <?php endif; ?>
35
+
36
+ <?php if ($pgcache_rules): ?>
37
+ <p><strong><?php echo htmlspecialchars($pgcache_htaccess); ?>:</strong></p>
38
+ <pre class="code"><?php echo htmlspecialchars($pgcache_rules); ?></pre>
39
+ <?php endif; ?>
40
+
41
+ <?php if ($minify_rules): ?>
42
+ <p><strong><?php echo htmlspecialchars($minify_htaccess); ?>:</strong></p>
43
+ <pre class="code"><?php echo htmlspecialchars($minify_rules); ?></pre>
44
+ <?php endif; ?>
45
+
46
+ <?php if ($cdn_rules): ?>
47
+ <p><strong><?php echo htmlspecialchars($cdn_htaccess); ?>:</strong></p>
48
+ <pre class="code"><?php echo htmlspecialchars($cdn_rules); ?></pre>
49
+ <?php endif; ?>
50
+ <hr />
51
+ <?php endif; ?>
52
+
53
+ <h3>Software Installation for Dedicated / Virtual Dedicated / Multiple Servers (Optional)</h3>
54
+
55
+ <p><strong>Server Preparation:</strong><br /><em>Time required: ~1 minute</em></p>
56
+
57
  <ol>
58
+ <li>
59
+ <a href="http://www.google.com/search?q=installing%20yum&amp;output=search&amp;tbs=qdr:y&amp;tbo=1" target="_blank">Install yum</a> if you don't already have it. Then, if you like, you can update all of your installed software, but do so only if you have the experience and time to double check configurations afterwards:
60
+ <pre class="console"># yum update</pre>
61
+ </li>
62
+ <li>
63
+ Install <acronym title="PHP Extension Community Library">PECL</acronym>:
64
+ <pre class="console"># yum install php-pear</pre>
65
+ </li>
66
+ <li>
67
+ Install the <acronym title="Hypertext Preprocessor">PHP</acronym> Development package:
68
+ <pre class="console"># yum install php-devel</pre>
69
+ </li>
70
+ <li>
71
+ Install apxs with the following command:
72
+ <pre class="console"># yum install httpd-devel</pre>
73
+ </li>
74
+ <li>
75
+ Make sure GCC is up-to-date:
76
+ <pre class="console"># yum install gcc make</pre>
77
+ </li>
78
+ <li>
79
+ Make sure ZLIB is fully installed:
80
+ <pre class="console"># yum install zlib-devel</pre>
81
+ </li>
82
  </ol>
83
+
84
+ <hr />
85
+
86
+ <p id="memcached"><strong>Memcached (Daemon) Installation:</strong><br /><em>Time required: 2 minutes</em></p>
87
+
88
  <ol>
89
+ <li>
90
+ Try to install with yum:
91
+ <pre class="console"># yum install libevent libevent-devel</pre>
92
+
93
+ If this succeeds skip to #5. If this fails, then let's compile. Download and extract the <a href="http://www.monkey.org/~provos/libevent/" target="_blank">latest stable version</a>:
94
+ <pre class="console"># cd /usr/local/src &amp;&amp; wget <a href="http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz" target="_blank">http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz</a> &amp;&amp; tar -xzf libevent-1.4.13-stable.tar.gz &amp;&amp; cd libevent-1.4.13-stable</pre>
95
+ </li>
96
+ <li>
97
+ Let's compile:
98
+ <pre class="console"># ./configure &amp;&amp; make &amp;&amp; make install</pre>
99
+ </li>
100
+ <li>
101
+ In the output you should see:
102
+ <pre class="console">Libraries have been installed in: /usr/local/lib</pre>
103
+ If so you can:
104
+ <pre class="console"># echo "/usr/local/lib/" &gt; /etc/ld.so.conf.d/libevent.conf</pre>
105
+ </li>
106
+ <li>
107
+ Configure your server for the new install:
108
+ <pre class="console"># ldconfig -v</pre>
109
+ </li>
110
+ <li>
111
+ Now find the <a href="http://www.danga.com/memcached/download.bml" target="_blank">latest stable memcached</a>, download and extract:
112
+ <pre class="console"># cd /usr/local/src &amp;&amp; wget <a href="http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz" target="_blank">http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz</a> &amp;&amp; tar -xzf memcached-1.4.4.tar.gz &amp;&amp; cd memcached-1.4.4</pre>
113
+ </li>
114
+ <li>
115
+ Let's compile:
116
+ <pre class="console"># ./configure &amp;&amp; make &amp;&amp; make install</pre>
117
+ </li>
118
+ <li>
119
+ Make sure memcached is starts automatically on server boot:
120
+ <pre class="console"># touch /etc/init.d/memcached
121
+ # echo '#!/bin/sh -e' &gt;&gt; /etc/init.d/memcached
122
+ # echo '/usr/local/bin/memcached -d -m 128 -p 11211 -u nobody -l localhost' &gt;&gt; /etc/init.d/memcached
123
+ # chmod u+x /etc/init.d/memcached
124
+ # echo '/etc/init.d/memcached' &gt;&gt; /etc/rc.local</pre>
125
+ </li>
126
+ <li>
127
+ And finally, let's start memcached:
128
+ <pre class="console"># /etc/init.d/memcached</pre>
129
+ </li>
130
  </ol>
131
+
132
  <hr />
133
+
134
+ <p id="memcache"><strong><acronym title="PHP Extension Community Library">PECL</acronym> Memcache Module Installation:</strong><br /><em>Time required: 1 minute</em></p>
135
+
136
  <ol>
137
+ <li>
138
+ Either use <acronym title="PHP Extension Community Library">PECL</acronym> (and skip to #4 if successful):
139
+ <pre class="console"># pecl install memcache</pre>
140
+ </li>
141
+ <li>
142
+ Or via compilation. Download the <a href="http://pecl.php.net/package/memcache" target="_blank">latest stable version</a> and extract:
143
+ <pre class="console"># cd /usr/local/src/ &amp;&amp; wget <a href="http://pecl.php.net/get/memcache-2.2.5.tgz" target="_blank">http://pecl.php.net/get/memcache-2.2.5.tgz</a> &amp;&amp; tar -xzf memcache-2.2.5.tgz &amp;&amp; cd memcache-2.2.5</pre>
144
+ </li>
145
+ <li>
146
+ Now we start to compile:
147
+ <pre class="console"># phpize &amp;&amp; ./configure &amp;&amp; make &amp;&amp; make install</pre>
148
+ </li>
149
+ <li>
150
+ You can also use the memcache.ini file we prepared for you:
151
+ <pre class="console"># cp /var/www/vhosts/domain.com/httpdocs/wp-content/plugins/w3-total-cache/ini/memcache.ini /etc/php.d/</pre>
152
+ </li>
153
+ <li>
154
+ Finally restart apache:
155
+ <pre class="console"># /etc/init.d/httpd restart</pre>
156
+ </li>
157
+ <li>
158
+ You're done! Memcache should now be available. If the following command retuns anything, you're all set:
159
+ <pre class="console"># php -r 'phpinfo();' | grep 'memcache'</pre>
160
+ </li>
161
+ </ol>
162
+
163
+ <p>For windows users we recommend checking the following site(s) for more installation tips:</p>
164
+
165
  <ul>
166
  <li><a href="http://pureform.wordpress.com/2008/01/10/installing-memcache-on-windows-for-php/" target="_blank">Installing memcache on Windows for <acronym title="Hypertext Preprocessor">PHP</acronym></a></li>
167
+ </ul>
168
+
169
  <hr />
170
+
171
+ <p id="APC"><strong><acronym title="PHP Extension Community Library">PECL</acronym> Alternative PHP Cache (<acronym title="Alternative PHP Cache">APC</acronym>) Installation (Recommended):</strong><br /><em>Time required: 1 minute</em></p>
172
+
173
  <ol>
174
+ <li>
175
+ Install <acronym title="Alternative PHP Cache">APC</acronym> using the <acronym title="PHP Extension Community Library">PECL</acronym> command (and skip to #5 if successful):
176
+ <pre class="console"># pecl install apc</pre>
177
+ </li>
178
+ <li>
179
+ Or via compilation. Download the <a href="http://pecl.php.net/package/APC" target="_blank">latest stable version</a> and extract:
180
+ <pre class="console"># cd /usr/local/src &amp;&amp; wget <a href="http://pecl.php.net/get/APC-3.0.19.tgz" target="_blank">http://pecl.php.net/get/APC-3.0.19.tgz</a> &amp;&amp; tar -xzf APC-3.0.19.tgz &amp;&amp; cd APC-3.0.19</pre>
181
+ </li>
182
+ <li>
183
+ Note the paths returned for the following commands:
184
+ <pre class="console"># whereis php-config
185
+ # whereis apxs</pre>
186
+ </li>
187
+ <li>
188
+ Use the output from #2 to modify the --with-apxs and --with-php-config flags in the following compile command:
189
+ <pre class="console"># phpize &amp;&amp; ./configure --enable-apc --enable-apc-mmap --with-apxs=/usr/sbin/apxs --with-php-config=/usr/bin/php-config &amp;&amp; make &amp;&amp; make install</pre>
190
+ The result should be similar to:
191
+ <pre class="console">Installing shared extensions: /usr/lib/php/modules/</pre>
192
+ </li>
193
+ <li>
194
+ You can also use the apc.ini file we prepared for you:
195
+ <pre class="console"># cp /var/www/vhosts/domain.com/httpdocs/wp-content/plugins/w3-total-cache/ini/apc.ini /etc/php.d/</pre>
196
+ </li>
197
+ <li>
198
+ Restart apache when ready:
199
+ <pre class="console"># /etc/init.d/httpd restart</pre>
200
+ </li>
201
+ <li>
202
+ You're done! <acronym title="Alternative PHP Cache">APC</acronym> should now be available. If the following command retuns anything, you're all set:
203
+ <pre class="console"># php -r 'phpinfo();' | grep 'apc'</pre>
204
+ </li>
205
  </ol>
206
+
207
  <p>For windows users we recommend checking the following site(s) for more installation tips:</p>
208
+
209
  <ul>
210
  <li><a href="http://www.sitebuddy.com/PHP/Accelerators/apc_windows_binaries_builds" target="_blank"><acronym title="Alternative PHP Cache">APC</acronym> binaries for <acronym title="Hypertext Preprocessor">PHP</acronym> 5.x (windows builds)</a></li>
211
  </ul>
212
+
213
  <hr />
214
+
215
+ <p id="XCache"><strong>XCache Installation:</strong><br /><em>Time required: 1 minute</em></p>
216
+
217
  <ol>
218
+ <li>
219
+ Download the <a href="http://xcache.lighttpd.net/wiki/ReleaseArchive" target="_blank">latest compatible version</a> and extract:
220
+ <pre class="console"># cd /usr/local/src &amp;&amp; wget <a href="http://xcache.lighttpd.net/pub/Releases/1.3.0/xcache-1.3.0.tar.gz" target="_blank">http://xcache.lighttpd.net/pub/Releases/1.3.0/xcache-1.3.0.tar.gz</a> &amp;&amp; tar -xzf xcache-1.3.0.tar.gz &amp;&amp; cd xcache-1.3.0</pre>
221
+ </li>
222
+ <li>
223
+ Note the path returned for the following command:
224
+ <pre class="console"># whereis php-config</pre>
225
+ </li>
226
+ <li>
227
+ Use the output from #2 to modify the --with-php-config flag in the following compile command:
228
+ <pre class="console"># phpize &amp;&amp; ./configure --with-php-config=/usr/bin/php-config --enable-xcache --enable-xcache-optimizer --enable-xcache-coverager &amp;&amp; make &amp;&amp; make install</pre>
229
+ The result should be similar to:
230
+ <pre class="console">Installing shared extensions: /usr/lib/php/modules/</pre>
231
+ </li>
232
+ <li>
233
+ You can also use the eaccelerator.ini file we prepared for you:
234
+ <pre class="console"># cp /var/www/vhosts/domain.com/httpdocs/wp-content/plugins/w3-total-cache/ini/xcache.ini /etc/php.d/</pre>
235
+ </li>
236
+ <li>
237
+ Restart apache when ready:
238
+ <pre class="console"># /etc/init.d/httpd restart</pre>
239
+ </li>
240
+ <li>
241
+ You're done! XCache should now be available. If the following command retuns anything, you're all set:
242
+ <pre class="console"># php -r 'phpinfo();' | grep 'xcache'</pre>
243
+ </li>
244
  </ol>
245
+
246
+ <hr />
247
+
248
+ <p id="eAccelerator"><strong>eAccelerator Installation:</strong><br /><em>Time required: 1 minute</em></p>
249
+
250
+ <ol>
251
+ <li>
252
+ If using <acronym title="Hypertext Preprocessor">PHP</acronym> v5+, download the <a href="http://eaccelerator.net/" target="_blank">lastest compatible version</a> and extract. Remember v0.9.5.3 is the last version that supports user objects, later versions only support opcode caching.
253
+ <pre class="console"># cd /usr/local/src &amp;&amp; wget <a href="http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2" target="_blank">http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2</a> &amp;&amp; tar -xjf eaccelerator-0.9.5.3.tar.bz2 &amp;&amp; cd eaccelerator-0.9.5.3</pre>
254
+ </li>
255
+ <li>
256
+ Note the path returned for the following command:
257
+ <pre class="console"># whereis php-config</pre>
258
+ </li>
259
+ <li>
260
+ Use the output from #2 to modify the --with-php-config flag in the following compile command:
261
+ <pre class="console"># phpize &amp;&amp; ./configure --with-eaccelerator-shared-memory --with-php-config=/usr/bin/php-config &amp;&amp; make &amp;&amp; make install</pre>
262
+ The result should be similar to:
263
+ <pre class="console">Installing shared extensions: /usr/lib/php/modules/</pre>
264
+ </li>
265
+ <li>
266
+ You can also use the eaccelerator.ini file we prepared for you:
267
+ <pre class="console"># cp /var/www/vhosts/domain.com/httpdocs/wp-content/plugins/w3-total-cache/ini/eaccelerator.ini /etc/php.d/</pre>
268
+ </li>
269
+ <li>
270
+ Restart apache when ready:
271
+ <pre class="console"># /etc/init.d/httpd restart</pre>
272
+ </li>
273
+ <li>
274
+ You're done! eAccelerator should now be available. If the following command retuns anything, you're all set:
275
+ <pre class="console"># php -r 'phpinfo();' | grep 'eaccelerator'</pre>
276
+ </li>
277
+ </ol>
278
+
279
  <p>For windows users we recommend checking the following site(s) for more installation tips:</p>
280
+
281
  <ul>
282
  <li><a href="http://www.sitebuddy.com/PHP/Accelerators/eAccelerator_windows_binaries_builds" target="_blank">eAccelerator binaries for <acronym title="Hypertext Preprocessor">PHP</acronym> 5.x (windows builds)</a></li>
283
  </ul>
284
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
285
  <hr />
286
+
287
+ <fieldset>
288
+ <legend>Note(s):</legend>
289
+
290
+ <table class="form-table">
291
+ <tr>
292
+ <th valign="top" colspan="2">
293
+ <ul>
294
+ <li>The provided instructions are for 32-bit CentOS, however we can provide others based on <a href="mailto:wordpressexperts@w3-edge.com">your requests</a>.</li>
295
+ <li>In the case where Apache is not used, the .htaccess file located in the root directory of the WordPress installation, wp-content/w3tc/pgcache/.htaccess and wp-content/w3tc/min/.htaccess contain directives that must be re-created for your web server software.</li>
296
+ <li>Restarting the web server will empty the opcode cache, which means it will have to be rebuilt over time and your site's performance will suffer during this period. Still, an opcode cache should be installed in any case to maximize WordPress performance.</li>
297
+ <li>Consider using memcached for objects that must persist across web server restarts or that you wish to share amongst your pool of servers (or cluster), e.g.: database objects or page cache.</li>
298
+ <li>Some yum or mirrors may not have the necessary packages, in such cases you may have to do a manual installation.</li>
299
+ </ul>
300
+ </th>
301
+ </tr>
302
+ </table>
303
+ </fieldset>
304
+
305
  </div>
306
 
307
  <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
inc/options/minify.phtml CHANGED
@@ -1,54 +1,73 @@
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
3
- <h3>Minify Settings</h3>
 
 
 
 
 
 
 
 
4
 
5
- <form action="options-general.php">
6
  <p>
7
- Minify is currently <span class="w3tc-<?php if ($minify_enabled): ?>enabled">enabled<?php else: ?>disabled">disabled<?php endif; ?></span>.
8
- <input type="submit" name="flush_minify" value="Empty cache"<?php if (! $minify_enabled): ?> disabled="disabled"<?php endif; ?> class="button" />
9
- <input type="hidden" name="page" value="<?php echo W3TC_FILE; ?>" />
10
- <input type="hidden" name="tab" value="<?php echo $this->_tab; ?>" />
 
 
 
 
 
 
 
 
11
  </p>
12
  </form>
13
 
14
- <form id="minify_form" action="options-general.php?page=<?php echo urldecode(W3TC_FILE); ?>&amp;tab=<?php echo $this->_tab; ?>" method="post">
15
  <fieldset>
16
  <legend>General</legend>
17
 
18
  <table class="form-table">
19
  <tr>
20
  <th colspan="2">
21
- <input type="hidden" name="minify.rewrite" value="0" />
22
  <label><input type="checkbox" name="minify.rewrite" value="1"<?php checked($this->_config->get_boolean('minify.rewrite'), true); ?> /> Rewrite <acronym title="Uniform Resource Locator">URL</acronym> structure</label><br />
23
- <span class="description">If disabled, <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> embeddings will use GET variables instead of "fancy links."</span>
24
  </th>
25
  </tr>
26
  <tr>
27
  <th colspan="2">
28
- <input type="hidden" name="minify.upload" value="0" />
29
  <label><input type="checkbox" name="minify.upload" value="1"<?php checked($this->_config->get_boolean('minify.upload'), true); ?> /> Automatically upload modified files</label><br />
30
  <span class="description">If <acronym title="Content Delivery Network">CDN</acronym> is enabled (and not using the origin pull method), your minified files will be automatically uploaded.</span>
31
  </th>
32
  </tr>
33
  <tr>
34
- <th><label for="minify_compression"><acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression:</label></th>
 
 
35
  <td>
36
- <select id="minify_compression" name="minify.compression">
37
- <option value="">None (not recommended)</option>
38
- <option value="gzip"<?php selected($this->_config->get_string('minify.compression'), 'gzip'); ?><?php if (! $minify_gzip): ?> disabled="disabled"<?php endif; ?>>gzip (good)</option>
39
- <option value="deflate"<?php selected($this->_config->get_string('minify.compression'), 'deflate'); ?><?php if (! $minify_deflate): ?> disabled="disabled"<?php endif; ?>>deflate (not recommended)</option>
40
- <option value="gzip,deflate"<?php selected($this->_config->get_string('minify.compression'), 'gzip,deflate'); ?><?php if (! $minify_gzip || ! $minify_deflate): ?> disabled="disabled"<?php endif; ?>>gzip and deflate (best)</option>
41
- </select><br />
42
- <span class="description">Use <acronym>HTTP</acronym> compression to automatically reduce the load time of HTML documents in browsers that support it.</span>
 
43
  </td>
44
  </tr>
45
  </table>
46
-
47
  <p class="submit">
48
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
49
  </p>
50
  </fieldset>
51
-
52
  <fieldset>
53
  <legend><acronym title="Hypertext Markup Language">HTML</acronym></legend>
54
 
@@ -57,26 +76,31 @@
57
  <th valign="top"><acronym title="Hypertext Markup Language">HTML</acronym> minify settings:</th>
58
  <td>
59
  <input type="hidden" name="minify.html.enable" value="0" />
60
- <input type="hidden" name="minify.html.reject.admin" value="0" />
61
  <input type="hidden" name="minify.html.reject.feed" value="0" />
62
  <input type="hidden" name="minify.html.inline.css" value="0" />
63
  <input type="hidden" name="minify.html.inline.js" value="0" />
64
  <input type="hidden" name="minify.html.strip.crlf" value="0" />
65
  <label><input id="html_enabled" type="checkbox" name="minify.html.enable" value="1"<?php checked($this->_config->get_boolean('minify.html.enable'), true); ?> /> Enable</label><br />
66
- <label><input class="html_enabled" type="checkbox" name="minify.html.reject.admin" value="1"<?php checked($this->_config->get_boolean('minify.html.reject.admin'), true); ?> /> Don't minify <acronym title="Hypertext Markup Language">HTML</acronym> for logged in administrators</label><br />
67
  <label><input class="html_enabled" type="checkbox" name="minify.html.reject.feed" value="1"<?php checked($this->_config->get_boolean('minify.html.reject.feed'), true); ?> /> Don't minify feeds</label><br />
68
  <label><input class="html_enabled" type="checkbox" name="minify.html.inline.css" value="1"<?php checked($this->_config->get_boolean('minify.html.inline.css'), true); ?> /> Inline <acronym title="Cascading Style Sheet">CSS</acronym> minification</label><br />
69
  <label><input class="html_enabled" type="checkbox" name="minify.html.inline.js" value="1"<?php checked($this->_config->get_boolean('minify.html.inline.js'), true); ?> /> Inline <acronym title="JavaScript">JS</acronym> minification</label><br />
70
  <label><input class="html_enabled" type="checkbox" name="minify.html.strip.crlf" value="1"<?php checked($this->_config->get_boolean('minify.html.strip.crlf'), true); ?> /> Line break removal</label><br />
71
  </td>
72
  </tr>
 
 
 
 
 
 
 
73
  </table>
74
-
75
  <p class="submit">
76
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
77
  </p>
78
  </fieldset>
79
-
80
  <fieldset>
81
  <legend>JavaScript</legend>
82
 
@@ -86,12 +110,14 @@
86
  <td>
87
  <input type="hidden" name="minify.js.enable" value="0" />
88
  <input type="hidden" name="minify.js.combine.header" value="0" />
 
89
  <input type="hidden" name="minify.js.combine.footer" value="0" />
90
  <input type="hidden" name="minify.js.strip.comments" value="0" />
91
  <input type="hidden" name="minify.js.strip.crlf" value="0" />
92
  <label><input id="js_enabled" type="checkbox" name="minify.js.enable" value="1"<?php checked($this->_config->get_boolean('minify.js.enable'), true); ?> /> Enable</label><br />
93
- <label><input class="js_enabled" type="checkbox" name="minify.js.combine.header" value="1"<?php checked($this->_config->get_boolean('minify.js.combine.header'), true); ?> /> Only combine (Head)</label><br />
94
- <label><input class="js_enabled" type="checkbox" name="minify.js.combine.footer" value="1"<?php checked($this->_config->get_boolean('minify.js.combine.footer'), true); ?> /> Only combine (Footer)</label><br />
 
95
  <label><input class="js_enabled" type="checkbox" name="minify.js.strip.comments" value="1"<?php checked($this->_config->get_boolean('minify.js.strip.comments'), true); ?> /> Comment removal</label><br />
96
  <label><input class="js_enabled" type="checkbox" name="minify.js.strip.crlf" value="1"<?php checked($this->_config->get_boolean('minify.js.strip.crlf'), true); ?> /> Line break removal</label><br />
97
  </td>
@@ -101,37 +127,77 @@
101
  <td>
102
  <p>
103
  <label>
104
- <select id="js_groups" class="js_enabled" name="js_group">
105
- <?php foreach ($groups as $group_key => $group_text): ?>
106
- <option value="<?php echo $group_key; ?>"<?php selected($group_key, $js_group); ?>><?php echo htmlspecialchars($group_text); ?></option>
107
- <?php endforeach; ?>
108
- </select>
109
- Group:
110
- </label><br />
111
- <span class="description">Add scripts used in all templates to the default group. Use the menu above to manage scripts unique to a specific template.</span>
112
  </p>
113
- <ol id="js_files">
114
- <?php foreach ($js_groups as $js_group => $js_locations): ?>
115
- <?php foreach ((array) $js_locations as $js_location => $js_config): ?>
116
- <?php if (! empty($js_config['files'])): foreach ((array) $js_config['files'] as $js_file): ?>
117
- <li>
118
- <input class="js_enabled" type="text" name="js_files[<?php echo htmlspecialchars($js_group); ?>][<?php echo htmlspecialchars($js_location); ?>][]" value="<?php echo htmlspecialchars($js_file); ?>" size="100" />&nbsp;<select class="js_file_location js_enabled"><option value="include"<?php if ($js_location == 'include'): ?> selected="selected"<?php endif; ?>>Embed in: Header</option><option value="include-nb"<?php if ($js_location == 'include-nb'): ?> selected="selected"<?php endif; ?>>Embed in: Header (non-blocking)</option><option value="include-footer"<?php if ($js_location == 'include-footer'): ?> selected="selected"<?php endif; ?>>Embed in: Footer</option><option value="include-footer-nb"<?php if ($js_location == 'include-footer-nb'): ?> selected="selected"<?php endif; ?>>Embed in: Footer (non-blocking)</option></select>&nbsp;<input class="js_file_delete js_enabled button" type="button" value="Delete" />&nbsp;<input class="js_file_verify js_enabled button" type="button" value="Verify URI" />
119
- </li>
120
- <?php endforeach; endif; ?>
121
- <?php endforeach; ?>
122
- <?php endforeach; ?>
123
- </ol>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  <div id="js_files_empty" class="w3tc-empty" style="display: none;">No <acronym title="JavaScript">JS</acronym> files added</div>
125
  <input id="js_file_add" class="js_enabled button" type="button" value="Add a script" />
126
  </td>
127
  </tr>
128
  </table>
129
-
130
  <p class="submit">
131
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
132
  </p>
133
  </fieldset>
134
-
135
  <fieldset>
136
  <legend>Cascading Style Sheets</legend>
137
 
@@ -154,37 +220,62 @@
154
  <td>
155
  <p>
156
  <label>
157
- <select id="css_groups" class="css_enabled" name="css_group">
158
- <?php foreach ($groups as $group_key => $group_text): ?>
159
- <option value="<?php echo $group_key; ?>"<?php selected($group_key, $css_group); ?>><?php echo htmlspecialchars($group_text); ?></option>
160
- <?php endforeach; ?>
161
- </select>
162
- Group:
163
- </label><br />
164
- <span class="description">Add style sheets used in all templates to the default group. Use the menu above to manage style sheets unique to a specific template.</span>
165
  </p>
166
- <ol id="css_files">
167
- <?php foreach ($css_groups as $css_group => $css_locations): ?>
168
- <?php foreach ((array) $css_locations as $css_location => $css_config): ?>
169
- <?php if (! empty($css_config['files'])): foreach ((array) $css_config['files'] as $css_file): ?>
170
- <li>
171
- <input class="css_enabled" type="text" name="css_files[<?php echo htmlspecialchars($css_group); ?>][<?php echo htmlspecialchars($css_location); ?>][]" value="<?php echo htmlspecialchars($css_file); ?>" size="100" />&nbsp;<input class="css_file_delete css_enabled button" type="button" value="Delete" />&nbsp;<input class="css_file_verify css_enabled button" type="button" value="Verify URI" />
172
- </li>
173
- <?php endforeach; endif; ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
174
  <?php endforeach; ?>
175
- <?php endforeach; ?>
176
- </ol>
177
  <div id="css_files_empty" class="w3tc-empty" style="display: none;">No <acronym title="Cascading Style Sheet">CSS</acronym> files added</div>
178
- <input id="css_file_add" class="css_enabled button" type="button" value="Add a style sheet" />
179
  </td>
180
  </tr>
181
  </table>
182
-
183
  <p class="submit">
184
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
185
  </p>
186
  </fieldset>
187
-
188
  <fieldset>
189
  <legend>Advanced</legend>
190
 
@@ -194,19 +285,13 @@
194
  <th><label for="memcached_servers">Memcached hostname:port / <acronym title="Internet Protocol">IP</acronym>:port:</label></th>
195
  <td>
196
  <input id="memcached_servers" type="text" name="minify.memcached.servers" value="<?php echo htmlspecialchars(implode(',', $this->_config->get_array('minify.memcached.servers'))); ?>" size="100" />
197
- <input id="test_memcached" class="button" type="button" value="Test" />
198
- <span id="test_memcached_status" class="w3tc-status w3tc-process"></span>
199
  <br /><span class="description">Multiple servers may be used and seperated by a comma; e.g. 192.168.1.100:11211, domain.com:22122</span>
200
  </td>
201
  </tr>
202
  <?php endif; ?>
203
- <tr>
204
- <th style="width: 250px;"><label for="minify_maxage">Maximum lifetime of cache objects:</label></th>
205
- <td><input id="minify_maxage" type="text" name="minify.maxage" value="<?php echo $this->_config->get_integer('minify.maxage'); ?>" size="8" /> seconds
206
- <br /><span class="description">Determines the natural expiration time of unchanged cache items. The higher the value, the larger the cache.</span>
207
- </td>
208
- </tr>
209
- <tr>
210
  <th><label for="minify_lifetime">Update external files every:</label></th>
211
  <td><input id="minify_lifetime" type="text" name="minify.lifetime" value="<?php echo $this->_config->get_integer('minify.lifetime'); ?>" size="8" /> seconds<br />
212
  <span class="description">Specify the interval between download and update of external files in the minify cache. Hint: 6 hours is 21600 seconds. 12 hours is 43200 seconds. 24 hours is 86400 seconds.</span></td>
@@ -225,11 +310,27 @@
225
  </td>
226
  </tr>
227
  </table>
228
-
229
  <p class="submit">
230
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
231
  </p>
232
  </fieldset>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
233
  </form>
234
 
235
  <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
3
+ <script type="text/javascript">/*<![CDATA[*/
4
+ var minify_templates = {};
5
+ <?php foreach ($templates as $theme_key => $theme_templates): ?>
6
+ minify_templates['<?php echo addslashes($theme_key); ?>'] = {};
7
+ <?php foreach ($theme_templates as $theme_template_key => $theme_template_name): ?>
8
+ minify_templates['<?php echo addslashes($theme_key); ?>']['<?php echo addslashes($theme_template_key); ?>'] = '<?php echo addslashes($theme_template_name); ?>';
9
+ <?php endforeach; ?>
10
+ <?php endforeach; ?>
11
+ /*]]>*/</script>
12
 
13
+ <form action="admin.php">
14
  <p>
15
+ Minify via
16
+ <strong><?php echo w3_get_engine_name($this->_config->get_string('minify.engine')); ?></strong>
17
+ is currently <span class="w3tc-<?php if ($minify_enabled): ?>enabled">enabled<?php else: ?>disabled">disabled<?php endif; ?></span>.
18
+ </p>
19
+ <p>
20
+ To rebuild the minify cache use the
21
+ <input type="submit" name="flush_minify" value="empty cache"<?php if (! $minify_enabled): ?> disabled="disabled"<?php endif; ?> class="button" />
22
+ operation.
23
+ Get minify hints using the
24
+ <input type="button" class="button button-minify-recommendations" value="help" />
25
+ wizard.
26
+ <input type="hidden" name="page" value="<?php echo $this->_page; ?>" />
27
  </p>
28
  </form>
29
 
30
+ <form id="minify_form" action="admin.php?page=<?php echo $this->_page; ?>" method="post">
31
  <fieldset>
32
  <legend>General</legend>
33
 
34
  <table class="form-table">
35
  <tr>
36
  <th colspan="2">
37
+ <input type="hidden" name="minify.rewrite" value="0" />
38
  <label><input type="checkbox" name="minify.rewrite" value="1"<?php checked($this->_config->get_boolean('minify.rewrite'), true); ?> /> Rewrite <acronym title="Uniform Resource Locator">URL</acronym> structure</label><br />
39
+ <span class="description">If disabled, <acronym title="Cascading Style Sheet">CSS</acronym> and <acronym title="JavaScript">JS</acronym> embeddings will use GET variables instead of "fancy" links.</span>
40
  </th>
41
  </tr>
42
  <tr>
43
  <th colspan="2">
44
+ <input type="hidden" name="minify.upload" value="0" />
45
  <label><input type="checkbox" name="minify.upload" value="1"<?php checked($this->_config->get_boolean('minify.upload'), true); ?> /> Automatically upload modified files</label><br />
46
  <span class="description">If <acronym title="Content Delivery Network">CDN</acronym> is enabled (and not using the origin pull method), your minified files will be automatically uploaded.</span>
47
  </th>
48
  </tr>
49
  <tr>
50
+ <th valign="top">
51
+ <label for="minify_error_notification">Minify error notification:</label>
52
+ </th>
53
  <td>
54
+ <select id="minify_error_notification" name="minify.error.notification">
55
+ <?php $value = $this->_config->get_string('minify.error.notification'); ?>
56
+ <option value=""<?php selected($value, ''); ?>>Disabled</option>
57
+ <option value="admin"<?php selected($value, 'admin'); ?>>Admin Notification</option>
58
+ <option value="email"<?php selected($value, 'email'); ?>>Email Notification</option>
59
+ <option value="admin,email"<?php selected($value, 'admin,email'); ?>>Both Admin &amp; Email Notification</option>
60
+ </select>
61
+ <br /><span class="description">Notify when minify cache creation errors occur.</span>
62
  </td>
63
  </tr>
64
  </table>
65
+
66
  <p class="submit">
67
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
68
  </p>
69
  </fieldset>
70
+
71
  <fieldset>
72
  <legend><acronym title="Hypertext Markup Language">HTML</acronym></legend>
73
 
76
  <th valign="top"><acronym title="Hypertext Markup Language">HTML</acronym> minify settings:</th>
77
  <td>
78
  <input type="hidden" name="minify.html.enable" value="0" />
 
79
  <input type="hidden" name="minify.html.reject.feed" value="0" />
80
  <input type="hidden" name="minify.html.inline.css" value="0" />
81
  <input type="hidden" name="minify.html.inline.js" value="0" />
82
  <input type="hidden" name="minify.html.strip.crlf" value="0" />
83
  <label><input id="html_enabled" type="checkbox" name="minify.html.enable" value="1"<?php checked($this->_config->get_boolean('minify.html.enable'), true); ?> /> Enable</label><br />
 
84
  <label><input class="html_enabled" type="checkbox" name="minify.html.reject.feed" value="1"<?php checked($this->_config->get_boolean('minify.html.reject.feed'), true); ?> /> Don't minify feeds</label><br />
85
  <label><input class="html_enabled" type="checkbox" name="minify.html.inline.css" value="1"<?php checked($this->_config->get_boolean('minify.html.inline.css'), true); ?> /> Inline <acronym title="Cascading Style Sheet">CSS</acronym> minification</label><br />
86
  <label><input class="html_enabled" type="checkbox" name="minify.html.inline.js" value="1"<?php checked($this->_config->get_boolean('minify.html.inline.js'), true); ?> /> Inline <acronym title="JavaScript">JS</acronym> minification</label><br />
87
  <label><input class="html_enabled" type="checkbox" name="minify.html.strip.crlf" value="1"<?php checked($this->_config->get_boolean('minify.html.strip.crlf'), true); ?> /> Line break removal</label><br />
88
  </td>
89
  </tr>
90
+ <tr>
91
+ <th valign="top"><label for="minify_html_comments_ignore">Ignored comment stems:</label></th>
92
+ <td>
93
+ <textarea id="minify_html_comments_ignore" name="minify.html.comments.ignore" cols="40" rows="5"><?php echo htmlspecialchars(implode("\r\n", $this->_config->get_array('minify.html.comments.ignore'))); ?></textarea><br />
94
+ <span class="description">Do not remove comments that contain these terms.</span>
95
+ </td>
96
+ </tr>
97
  </table>
98
+
99
  <p class="submit">
100
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
101
  </p>
102
  </fieldset>
103
+
104
  <fieldset>
105
  <legend>JavaScript</legend>
106
 
110
  <td>
111
  <input type="hidden" name="minify.js.enable" value="0" />
112
  <input type="hidden" name="minify.js.combine.header" value="0" />
113
+ <input type="hidden" name="minify.js.combine.body" value="0" />
114
  <input type="hidden" name="minify.js.combine.footer" value="0" />
115
  <input type="hidden" name="minify.js.strip.comments" value="0" />
116
  <input type="hidden" name="minify.js.strip.crlf" value="0" />
117
  <label><input id="js_enabled" type="checkbox" name="minify.js.enable" value="1"<?php checked($this->_config->get_boolean('minify.js.enable'), true); ?> /> Enable</label><br />
118
+ <label><input class="js_enabled" type="checkbox" name="minify.js.combine.header" value="1"<?php checked($this->_config->get_boolean('minify.js.combine.header'), true); ?> /> Combine only after &lt;head&gt;</label><br />
119
+ <label><input class="js_enabled" type="checkbox" name="minify.js.combine.body" value="1"<?php checked($this->_config->get_boolean('minify.js.combine.body'), true); ?> /> Combine only after &lt;body&gt;</label><br />
120
+ <label><input class="js_enabled" type="checkbox" name="minify.js.combine.footer" value="1"<?php checked($this->_config->get_boolean('minify.js.combine.footer'), true); ?> /> Combine only before &lt;/body&gt;</label><br />
121
  <label><input class="js_enabled" type="checkbox" name="minify.js.strip.comments" value="1"<?php checked($this->_config->get_boolean('minify.js.strip.comments'), true); ?> /> Comment removal</label><br />
122
  <label><input class="js_enabled" type="checkbox" name="minify.js.strip.crlf" value="1"<?php checked($this->_config->get_boolean('minify.js.strip.crlf'), true); ?> /> Line break removal</label><br />
123
  </td>
127
  <td>
128
  <p>
129
  <label>
130
+ Theme:
131
+ <select id="js_themes" class="js_enabled" name="js_theme">
132
+ <?php foreach ($themes as $theme_key => $theme_name): ?>
133
+ <option value="<?php echo htmlspecialchars($theme_key); ?>"<?php selected($theme_key, $js_theme); ?>><?php echo htmlspecialchars($theme_name); ?><?php if ($theme_key == $js_theme): ?> (active)<?php endif; ?></option>
134
+ <?php endforeach; ?>
135
+ </select>
136
+ </label>
137
+ <br /><span class="description">Files are minified by template. First select the theme to manage, then add scripts used in all templates to the "All Templates" group. Use the menu above to manage scripts unique to a specific template. If necessary drag &amp; drop to resolve dependency issues (due to incorrect order).</span>
138
  </p>
139
+ <ul id="js_files" class="minify-files">
140
+ <?php $index = 0; foreach ($js_groups as $js_theme => $js_templates): if (isset($templates[$js_theme])): ?>
141
+ <?php foreach ($js_templates as $js_template => $js_locations): ?>
142
+ <?php foreach ((array) $js_locations as $js_location => $js_config): ?>
143
+ <?php if (! empty($js_config['files'])): foreach ((array) $js_config['files'] as $js_file): $index++; ?>
144
+ <li>
145
+ <table>
146
+ <tr>
147
+ <th>&nbsp;</th>
148
+ <th>File URI:</th>
149
+ <th>Template:</th>
150
+ <th colspan="3">Embed Location:</th>
151
+ </tr>
152
+ <tr>
153
+ <td><?php echo $index; ?>.</td>
154
+ <td>
155
+ <input class="js_enabled" type="text" name="js_files[<?php echo htmlspecialchars($js_theme); ?>][<?php echo htmlspecialchars($js_template); ?>][<?php echo htmlspecialchars($js_location); ?>][]" value="<?php echo htmlspecialchars($js_file); ?>" size="70" />
156
+ </td>
157
+ <td>
158
+ <select class="js_file_template js_enabled">
159
+ <?php foreach ($templates[$js_theme] as $theme_template_key => $theme_template_name): ?>
160
+ <option value="<?php echo htmlspecialchars($theme_template_key); ?>"<?php selected($theme_template_key, $js_template); ?>><?php echo htmlspecialchars($theme_template_name); ?></option>
161
+ <?php endforeach; ?>
162
+ </select>
163
+ </td>
164
+ <td>
165
+ <select class="js_file_location js_enabled">
166
+ <optgroup label="Blocking:">
167
+ <option value="include"<?php if ($js_location == 'include'): ?> selected="selected"<?php endif; ?>>Embed in &lt;head&gt;</option>
168
+ <option value="include-body"<?php if ($js_location == 'include-body'): ?> selected="selected"<?php endif; ?>>Embed after &lt;body&gt;</option>
169
+ <option value="include-footer"<?php if ($js_location == 'include-footer'): ?> selected="selected"<?php endif; ?>>Embed before &lt;/body&gt;</option>
170
+ </optgroup>
171
+ <optgroup label="Non-Blocking:">
172
+ <option value="include-nb"<?php if ($js_location == 'include-nb'): ?> selected="selected"<?php endif; ?>>Embed in &lt;head&gt;</option>
173
+ <option value="include-body-nb"<?php if ($js_location == 'include-body-nb'): ?> selected="selected"<?php endif; ?>>Embed after &lt;body&gt;</option>
174
+ <option value="include-footer-nb"<?php if ($js_location == 'include-footer-nb'): ?> selected="selected"<?php endif; ?>>Embed before &lt;/body&gt;</option>
175
+ </optgroup>
176
+ </select>
177
+ </td>
178
+ <td>
179
+ <input class="js_file_delete js_enabled button" type="button" value="Delete" />
180
+ <input class="js_file_verify js_enabled button" type="button" value="Verify URI" />
181
+ </td>
182
+ </tr>
183
+ </table>
184
+ </li>
185
+ <?php endforeach; endif; ?>
186
+ <?php endforeach; ?>
187
+ <?php endforeach; ?>
188
+ <?php endif; endforeach; ?>
189
+ </ul>
190
  <div id="js_files_empty" class="w3tc-empty" style="display: none;">No <acronym title="JavaScript">JS</acronym> files added</div>
191
  <input id="js_file_add" class="js_enabled button" type="button" value="Add a script" />
192
  </td>
193
  </tr>
194
  </table>
195
+
196
  <p class="submit">
197
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
198
  </p>
199
  </fieldset>
200
+
201
  <fieldset>
202
  <legend>Cascading Style Sheets</legend>
203
 
220
  <td>
221
  <p>
222
  <label>
223
+ Theme:
224
+ <select id="css_themes" class="css_enabled" name="css_theme">
225
+ <?php foreach ($themes as $theme_key => $theme_name): ?>
226
+ <option value="<?php echo htmlspecialchars($theme_key); ?>"<?php selected($theme_key, $css_theme); ?>><?php echo htmlspecialchars($theme_name); ?><?php if ($theme_key == $css_theme): ?> (active)<?php endif; ?></option>
227
+ <?php endforeach; ?>
228
+ </select>
229
+ </label>
230
+ <br /><span class="description">Files are minified by template. First select the theme to manage, then add style sheets used in all templates to the "All Templates" group. Use the menu above to manage style sheets unique to a specific template. If necessary drag &amp; drop to resolve dependency issues (due to incorrect order).</span>
231
  </p>
232
+ <ul id="css_files" class="minify-files">
233
+ <?php $index = 0; foreach ($css_groups as $css_theme => $css_templates): if (isset($templates[$css_theme])): ?>
234
+ <?php foreach ($css_templates as $css_template => $css_locations): ?>
235
+ <?php foreach ((array) $css_locations as $css_location => $css_config): ?>
236
+ <?php if (! empty($css_config['files'])): foreach ((array) $css_config['files'] as $css_file): $index++; ?>
237
+ <li>
238
+ <table>
239
+ <tr>
240
+ <th>&nbsp;</th>
241
+ <th>File URI:</th>
242
+ <th colspan="2">Template:</th>
243
+ </tr>
244
+ <tr>
245
+ <td><?php echo $index; ?>.</td>
246
+ <td>
247
+ <input class="css_enabled" type="text" name="css_files[<?php echo htmlspecialchars($css_theme); ?>][<?php echo htmlspecialchars($css_template); ?>][<?php echo htmlspecialchars($css_location); ?>][]" value="<?php echo htmlspecialchars($css_file); ?>" size="70" /><br />
248
+ </td>
249
+ <td>
250
+ <select class="css_file_template css_enabled">
251
+ <?php foreach ($templates[$css_theme] as $theme_template_key => $theme_template_name): ?>
252
+ <option value="<?php echo htmlspecialchars($theme_template_key); ?>"<?php selected($theme_template_key, $css_template); ?>><?php echo htmlspecialchars($theme_template_name); ?></option>
253
+ <?php endforeach; ?>
254
+ </select>
255
+ </td>
256
+ <td>
257
+ <input class="css_file_delete css_enabled button" type="button" value="Delete" />
258
+ <input class="css_file_verify css_enabled button" type="button" value="Verify URI" />
259
+ </td>
260
+ </tr>
261
+ </table>
262
+ </li>
263
+ <?php endforeach; endif; ?>
264
+ <?php endforeach; ?>
265
  <?php endforeach; ?>
266
+ <?php endif; endforeach; ?>
267
+ </ul>
268
  <div id="css_files_empty" class="w3tc-empty" style="display: none;">No <acronym title="Cascading Style Sheet">CSS</acronym> files added</div>
269
+ <input id="css_file_add" class="css_enabled button" type="button" value="Add a style sheet" />
270
  </td>
271
  </tr>
272
  </table>
273
+
274
  <p class="submit">
275
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
276
  </p>
277
  </fieldset>
278
+
279
  <fieldset>
280
  <legend>Advanced</legend>
281
 
285
  <th><label for="memcached_servers">Memcached hostname:port / <acronym title="Internet Protocol">IP</acronym>:port:</label></th>
286
  <td>
287
  <input id="memcached_servers" type="text" name="minify.memcached.servers" value="<?php echo htmlspecialchars(implode(',', $this->_config->get_array('minify.memcached.servers'))); ?>" size="100" />
288
+ <input id="memcached_test" class="button" type="button" value="Test" />
289
+ <span id="memcached_test_status" class="w3tc-status w3tc-process"></span>
290
  <br /><span class="description">Multiple servers may be used and seperated by a comma; e.g. 192.168.1.100:11211, domain.com:22122</span>
291
  </td>
292
  </tr>
293
  <?php endif; ?>
294
+ <tr>
 
 
 
 
 
 
295
  <th><label for="minify_lifetime">Update external files every:</label></th>
296
  <td><input id="minify_lifetime" type="text" name="minify.lifetime" value="<?php echo $this->_config->get_integer('minify.lifetime'); ?>" size="8" /> seconds<br />
297
  <span class="description">Specify the interval between download and update of external files in the minify cache. Hint: 6 hours is 21600 seconds. 12 hours is 43200 seconds. 24 hours is 86400 seconds.</span></td>
310
  </td>
311
  </tr>
312
  </table>
313
+
314
  <p class="submit">
315
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
316
  </p>
317
  </fieldset>
318
+
319
+ <fieldset>
320
+ <legend>Note(s):</legend>
321
+
322
+ <table class="form-table">
323
+ <tr>
324
+ <th valign="top" colspan="2">
325
+ <ul>
326
+ <li>Enable <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression in the "Cascading Style Sheets &amp; JavaScript" section on <a href="admin.php?page=w3tc_browsercache">Browser Cache</a> Settings tab.</li>
327
+ <li>The <acronym title="Time to Live">TTL</acronym> of page cache files is set via the "Expires header lifetime" field in the "Cascading Style Sheets &amp; JavaScript" section on <a href="admin.php?page=w3tc_browsercache">Browser Cache</a> Settings tab.</li>
328
+ </ul>
329
+ </th>
330
+ </tr>
331
+ </table>
332
+ </fieldset>
333
+
334
  </form>
335
 
336
  <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
inc/options/mobile.phtml ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
+
3
+ <script type="text/javascript">/*<![CDATA[*/
4
+ var mobile_themes = {};
5
+ <?php foreach ($themes as $theme_key => $theme_name): ?>
6
+ mobile_themes['<?php echo addslashes($theme_key); ?>'] = '<?php echo addslashes($theme_name); ?>';
7
+ <?php endforeach; ?>
8
+ /*]]>*/</script>
9
+
10
+ <p>
11
+ User agent group support is always <span class="w3tc-enabled">enabled</span>.
12
+ </p>
13
+
14
+ <form id="mobile_form" action="admin.php?page=<?php echo $this->_page; ?>" method="post">
15
+ <fieldset>
16
+ <legend>Manage User Agent Groups</legend>
17
+ <p>
18
+ <input id="mobile_add" type="button" class="button" value="Create a group" /> of user agents by specifying names in the user agents field. Assign a set of user agents to use a specific theme, redirect them to another domain or if an existing mobile plugin is active, create user agent groups to ensure that a unique cache is created for each user agent group. Drag and drop groups into order (if needed) to determine their priority (top -&gt; down).
19
+ </p>
20
+
21
+ <ul id="mobile_groups">
22
+ <?php $index = 0; foreach ($groups as $group => $group_config): $index++; ?>
23
+ <li id="mobile_group_<?php echo htmlspecialchars($group); ?>">
24
+ <table class="form-table">
25
+ <tr>
26
+ <th valign="top">
27
+ Group name:
28
+ </th>
29
+ <td>
30
+ <span class="mobile_group_number"><?php echo $index; ?>.</span> <span class="mobile_group"><?php echo htmlspecialchars($group); ?></span> <input type="button" class="button mobile_delete" value="Delete group" />
31
+ </td>
32
+ </tr>
33
+ <tr>
34
+ <th>
35
+ <label for="mobile_groups_<?php echo htmlspecialchars($group); ?>_enabled">Enabled:</label>
36
+ </th>
37
+ <td>
38
+ <input type="hidden" name="mobile_groups[<?php echo htmlspecialchars($group); ?>][enabled]" value="0" />
39
+ <input id="mobile_groups_<?php echo htmlspecialchars($group); ?>_enabled" type="checkbox" name="mobile_groups[<?php echo htmlspecialchars($group); ?>][enabled]" value="1"<?php checked($group_config['enabled'], true); ?> />
40
+ </td>
41
+ </tr>
42
+ <tr>
43
+ <th valign="top">
44
+ <label for="mobile_groups_<?php echo htmlspecialchars($group); ?>_theme">Theme:</label>
45
+ </th>
46
+ <td>
47
+ <select id="mobile_groups_<?php echo htmlspecialchars($group); ?>_theme" name="mobile_groups[<?php echo htmlspecialchars($group); ?>][theme]">
48
+ <option value="">-- Pass-through --</option>
49
+ <?php foreach ($themes as $theme_key => $theme_name): ?>
50
+ <option value="<?php echo htmlspecialchars($theme_key); ?>"<?php selected($theme_key, $group_config['theme']); ?>><?php echo htmlspecialchars($theme_name); ?></option>
51
+ <?php endforeach; ?>
52
+ </select>
53
+ <br /><span class="description">Assign this group of user agents to a specific them. Selecting "Pass-through" allows any plugin(s) (e.g. mobile plugins) to properly handle requests for these user agents. If the "redirect users to" field is not empty, this setting is ignored.</span>
54
+ </td>
55
+ </tr>
56
+ <tr>
57
+ <th valign="top">
58
+ <label for="mobile_groups_<?php echo htmlspecialchars($group); ?>_redirect">Redirect users to:</label>
59
+ </th>
60
+ <td>
61
+ <input id="mobile_groups_<?php echo htmlspecialchars($group); ?>_redirect" type="text" name="mobile_groups[<?php echo htmlspecialchars($group); ?>][redirect]" value="<?php echo htmlspecialchars($group_config['redirect']); ?>" size="60" />
62
+ <br /><span class="description">A 302 redirect is used to send this group of users to another hostname (domain); recommended if a 3rd party service provides a mobile version of your site.</span>
63
+ </td>
64
+ </tr>
65
+ <tr>
66
+ <th valign="top">
67
+ <label for="mobile_groups_<?php echo htmlspecialchars($group); ?>_agents">User agents:</label>
68
+ </th>
69
+ <td>
70
+ <textarea id="mobile_groups_<?php echo htmlspecialchars($group); ?>_agents" name="mobile_groups[<?php echo htmlspecialchars($group); ?>][agents]" rows="10" cols="50"><?php echo htmlspecialchars(implode("\r\n", (array) $group_config['agents'])); ?></textarea>
71
+ <br /><span class="description">Specify the user agents for this group. Remember to escape special characters like spaces, dots or dashes with a backslash. Regular expressions are also supported.</span>
72
+ </td>
73
+ </tr>
74
+ </table>
75
+ </li>
76
+ <?php endforeach; ?>
77
+ </ul>
78
+ <div id="mobile_groups_empty" style="display: none;">No groups added. All user agents recieve the same page and minify cache results.</div>
79
+
80
+ <p class="submit">
81
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
82
+ </p>
83
+ </fieldset>
84
+ </form>
85
+
86
+ <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
inc/options/objectcache.phtml ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
+
3
+ <form action="admin.php">
4
+ <p>
5
+ Object caching via
6
+ <strong><?php echo w3_get_engine_name($this->_config->get_string('objectcache.engine')); ?></strong>
7
+ is currently <span class="w3tc-<?php if ($objectcache_enabled): ?>enabled">enabled<?php else: ?>disabled">disabled<?php endif; ?></span>.
8
+ </p>
9
+ <p>
10
+ To rebuild the object cache use the
11
+ <input type="submit" name="flush_objectcache" value="empty cache"<?php if (! $objectcache_enabled): ?> disabled="disabled"<?php endif; ?> class="button" />
12
+ operation.
13
+ <input type="hidden" name="page" value="<?php echo $this->_page; ?>" />
14
+ </p>
15
+ </form>
16
+
17
+ <form action="admin.php?page=<?php echo $this->_page; ?>" method="post">
18
+ <fieldset>
19
+ <legend>General</legend>
20
+
21
+ <table class="form-table">
22
+ <tr>
23
+ <th>
24
+ <input type="hidden" name="objectcache.reject.admin" value="0" />
25
+ <label><input type="checkbox" name="objectcache.reject.admin" value="1"<?php checked($this->_config->get_boolean('objectcache.reject.admin'), true); ?> /> Don't cache WordPress Admin</label>
26
+ <br /><span class="description">Leave this option checked to maintain default WordPress Admin behavior.</span>
27
+ </th>
28
+ </tr>
29
+ </table>
30
+
31
+ <p class="submit">
32
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
33
+ </p>
34
+ </fieldset>
35
+
36
+ <fieldset>
37
+ <legend>Advanced</legend>
38
+
39
+ <table class="form-table">
40
+ <?php if ($this->_config->get_string('objectcache.engine') == 'memcached'): ?>
41
+ <tr>
42
+ <th><label for="memcached_servers">Memcached hostname:port / <acronym title="Internet Protocol">IP</acronym>:port:</label></th>
43
+ <td>
44
+ <input id="memcached_servers" type="text" name="objectcache.memcached.servers" value="<?php echo htmlspecialchars(implode(',', $this->_config->get_array('objectcache.memcached.servers'))); ?>" size="100" />
45
+ <input id="memcached_test" class="button" type="button" value="Test" />
46
+ <span id="memcached_test_status" class="w3tc-status w3tc-process"></span>
47
+ <br /><span class="description">Multiple servers may be used and seperated by a comma; e.g. 192.168.1.100:11211, domain.com:22122</span>
48
+ </td>
49
+ </tr>
50
+ <?php endif; ?>
51
+ <tr>
52
+ <th style="width: 250px;"><label for="objectcache_lifetime">Default lifetime of cache objects:</label></th>
53
+ <td>
54
+ <input id="objectcache_lifetime" type="text" name="objectcache.lifetime" value="<?php echo $this->_config->get_integer('objectcache.lifetime'); ?>" size="8" /> seconds
55
+ <br /><span class="description">Determines the natural expiration time of unchanged cache items. The higher the value, the larger the cache.</span>
56
+ </td>
57
+ </tr>
58
+ <tr>
59
+ <th><label for="objectcache_file_gc">Garbage collection interval:</label></th>
60
+ <td>
61
+ <input id="objectcache_file_gc" type="text" name="objectcache.file.gc" value="<?php echo $this->_config->get_integer('objectcache.file.gc'); ?>" size="8" /> seconds
62
+ <br /><span class="description">If caching to disk, specify how frequently expired cache data is removed. For busy sites, a lower value is best.</span>
63
+ </td>
64
+ </tr>
65
+ <tr>
66
+ <th valign="top"><label for="objectcache_reject_uri">Never cache the following pages:</label></th>
67
+ <td>
68
+ <textarea id="objectcache_reject_uri" name="objectcache.reject.uri" cols="40" rows="5"><?php echo htmlspecialchars(implode("\r\n", $this->_config->get_array('objectcache.reject.uri'))); ?></textarea>
69
+ <br /><span class="description">Always ignore the specified pages / directories.</span>
70
+ </td>
71
+ </tr>
72
+ <tr>
73
+ <th valign="top"><label for="objectcache_groups_global">Global groups:</label></th>
74
+ <td>
75
+ <textarea id="objectcache_groups_global" name="objectcache.groups.global" cols="40" rows="5"><?php echo htmlspecialchars(implode("\r\n", $this->_config->get_array('objectcache.groups.global'))); ?></textarea>
76
+ <br /><span class="description">Groups shared amongst sites in network mode.</span>
77
+ </td>
78
+ </tr>
79
+ <tr>
80
+ <th valign="top"><label for="objectcache_groups_nonpersistent">Non-persistent groups:</label></th>
81
+ <td>
82
+ <textarea id="objectcache_groups_nonpersistent" name="objectcache.groups.nonpersistent" cols="40" rows="5"><?php echo htmlspecialchars(implode("\r\n", $this->_config->get_array('objectcache.groups.nonpersistent'))); ?></textarea>
83
+ <br /><span class="description">Groups that should not be cached.</span>
84
+ </td>
85
+ </tr>
86
+ </table>
87
+
88
+ <p class="submit">
89
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
90
+ </p>
91
+ </fieldset>
92
+ </form>
93
+
94
+ <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
inc/options/pgcache.phtml CHANGED
@@ -1,65 +1,63 @@
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
3
- <h3>Page Cache Settings</h3>
4
-
5
- <form action="options-general.php">
 
 
 
6
  <p>
7
- Page Caching is currently <span class="w3tc-<?php if ($pgcache_enabled): ?>enabled">enabled<?php else: ?>disabled">disabled<?php endif; ?></span>.
8
- <input type="submit" name="flush_pgcache" value="Empty cache"<?php if (! $pgcache_enabled): ?> disabled="disabled"<?php endif; ?> class="button" />
9
- <input type="hidden" name="page" value="<?php echo W3TC_FILE; ?>" />
10
- <input type="hidden" name="tab" value="<?php echo $this->_tab; ?>" />
11
  </p>
12
  </form>
13
 
14
- <form action="options-general.php?page=<?php echo urldecode(W3TC_FILE); ?>&amp;tab=<?php echo $this->_tab; ?>" method="post">
15
  <fieldset>
16
  <legend>General</legend>
17
 
18
  <table class="form-table">
19
  <tr>
20
- <th colspan="2">
21
  <input type="hidden" name="pgcache.reject.logged" value="0" />
22
  <label><input type="checkbox" name="pgcache.reject.logged" value="1"<?php checked($this->_config->get_boolean('pgcache.reject.logged'), true); ?> /> Don't cache pages for logged in users</label><br />
23
  <span class="description">Users that have signed in to WordPress (e.g. administrators) will never view cached pages if enabled.</span>
24
  </th>
25
  </tr>
26
  <tr>
27
- <th colspan="2">
28
  <input type="hidden" name="pgcache.cache.home" value="0" />
29
  <label><input type="checkbox" name="pgcache.cache.home" value="1"<?php checked($this->_config->get_boolean('pgcache.cache.home'), true); ?> /> Cache the home page</label><br />
30
  <span class="description">For many blogs this is your most visited page, it is recommended that you cache it.</span>
31
  </th>
32
  </tr>
33
  <tr>
34
- <th colspan="2">
35
  <input type="hidden" name="pgcache.cache.feed" value="0" />
36
- <label><input type="checkbox" name="pgcache.cache.feed" value="1"<?php checked($this->_config->get_boolean('pgcache.cache.feed'), true); ?> /> Cache <acronym title="Really Simple Syndication">RSS</acronym> / Atom feeds (site, categories, tags, comments)</label><br />
37
  <span class="description">Even if using a feed proxy service (like <a href="http://en.wikipedia.org/wiki/FeedBurner" target="_blank">FeedBurner</a>), enabling this option is still recommended.</span>
38
  </th>
39
  </tr>
40
  <tr>
41
- <th colspan="2">
42
  <input type="hidden" name="pgcache.cache.query" value="0"<?php if ($this->_config->get_string('pgcache.engine') == 'file_pgcache'): ?> disabled="disabled"<?php endif; ?> />
43
  <label><input type="checkbox" name="pgcache.cache.query" value="1"<?php checked($this->_config->get_boolean('pgcache.cache.query'), true); ?><?php if ($this->_config->get_string('pgcache.engine') == 'file_pgcache'): ?> disabled="disabled"<?php endif; ?> /> Cache <acronym title="Uniform Resource Identifier">URI</acronym>s with query string variables</label><br />
44
  <span class="description">Search result (and similar) pages will be cached if enabled.</span>
45
  </th>
46
  </tr>
47
  <tr>
48
- <th><label for="pgcache_compression"><acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression:</label></th>
49
- <td>
50
- <select id="pgcache_compression" name="pgcache.compression">
51
- <option value="">None (not recommended)</option>
52
- <option value="gzip"<?php selected($this->_config->get_string('pgcache.compression'), 'gzip'); ?><?php if (! $pgcache_gzip): ?> disabled="disabled"<?php endif; ?>>gzip (good)</option>
53
- <option value="deflate"<?php selected($this->_config->get_string('pgcache.compression'), 'deflate'); ?><?php if (! $pgcache_deflate): ?> disabled="disabled"<?php endif; ?>>deflate (not recommended)</option>
54
- <option value="gzip,deflate"<?php selected($this->_config->get_string('pgcache.compression'), 'gzip,deflate'); ?><?php if (! $pgcache_gzip || ! $pgcache_deflate): ?> disabled="disabled"<?php endif; ?>>gzip and deflate (best)</option>
55
- </select><br />
56
- <span class="description">Use <acronym>HTTP</acronym> compression to automatically reduce the load time of HTML documents in browsers that support it.</span>
57
- </td>
58
  </tr>
59
  </table>
60
-
61
  <p class="submit">
62
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
63
  </p>
64
  </fieldset>
65
 
@@ -72,21 +70,16 @@
72
  <th><label for="memcached_servers">Memcached hostname:port / <acronym title="Internet Protocol">IP</acronym>:port:</label></th>
73
  <td>
74
  <input id="memcached_servers" type="text" name="pgcache.memcached.servers" value="<?php echo htmlspecialchars(implode(',', $this->_config->get_array('pgcache.memcached.servers'))); ?>" size="100" />
75
- <input id="test_memcached" class="button" type="button" value="Test" />
76
- <span id="test_memcached_status" class="w3tc-status w3tc-process"></span>
77
  <br /><span class="description">Multiple servers may be used and seperated by a comma; e.g. 192.168.1.100:11211, domain.com:22122</span>
78
  </td>
79
  </tr>
80
  <?php endif; ?>
81
- <tr>
82
- <th style="width: 250px;"><label for="pgcache_lifetime">Maximum lifetime of cache objects:</label></th>
83
- <td><input id="pgcache_lifetime" type="text" name="pgcache.lifetime" value="<?php echo $this->_config->get_integer('pgcache.lifetime'); ?>" size="8" /> seconds
84
- <br /><span class="description">Determines the natural expiration time of unchanged cache items. The higher the value, the larger the cache.</span>
85
- </td>
86
- </tr>
87
  <tr>
88
  <th><label for="pgcache_file_gc">Garbage collection interval:</label></th>
89
- <td><input id="pgcache_file_gc" type="text" name="pgcache.file.gc" value="<?php echo $this->_config->get_integer('pgcache.file.gc'); ?>" size="8"<?php if ($this->_config->get_string('pgcache.engine') != 'file' && $this->_config->get_string('pgcache.engine') != 'file_pgcache'): ?> disabled="disabled"<?php endif; ?> /> seconds
 
90
  <br /><span class="description">If caching to disk, specify how frequently expired cache data is removed. For busy sites, a lower value is best.</span>
91
  </td>
92
  </tr>
@@ -112,7 +105,7 @@
112
  </td>
113
  </tr>
114
  <tr>
115
- <th valign="top"><label for="pgcache_accept_files">Caching exception list:</label></th>
116
  <td>
117
  <textarea id="pgcache_accept_files" name="pgcache.accept.files" cols="40" rows="5"><?php echo htmlspecialchars(implode("\r\n", $this->_config->get_array('pgcache.accept.files'))); ?></textarea><br />
118
  <span class="description">Cache the specified pages / directories even if listed in the "never cache the following pages" field.</span>
@@ -125,26 +118,91 @@
125
  <span class="description">Specify additional page headers to cache.</span>
126
  </td>
127
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
  <tr>
129
- <th valign="top"><label for="pgcache_mobile_agents">Mobile user agents:</label></th>
130
  <td>
131
- <textarea id="pgcache_mobile_agents" name="pgcache.mobile.agents" cols="40" rows="5"><?php echo htmlspecialchars(implode("\r\n", $this->_config->get_array('pgcache.mobile.agents'))); ?></textarea><br />
132
- <span class="description">Specify which mobile devices to detect for redirection to the domain name specified below.</span>
133
- </td>
134
  </tr>
135
  <tr>
136
- <th><label for="pgcache_mobile_redirect">Redirect mobile users to:</label></th>
137
  <td>
138
- <input id="pgcache_mobile_redirect" type="text" name="pgcache.mobile.redirect" value="<?php echo htmlspecialchars($this->_config->get_string('pgcache.mobile.redirect')); ?>" size="100" />
139
- <br /><span class="description">If you have a mobile version of your site hosted on another domain, enter the domain name above. The user agents specified in the "Mobile user agents" box will be directed to this domain.</span>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  </td>
141
  </tr>
142
  </table>
143
-
144
  <p class="submit">
145
- <input type="submit" name="Submit" class="button-primary" value="Save changes" />
146
  </p>
147
  </fieldset>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
  </form>
149
 
150
  <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
1
  <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
 
3
+ <form action="admin.php">
4
+ <p>
5
+ Page caching via
6
+ <strong><?php echo w3_get_engine_name($this->_config->get_string('pgcache.engine')); ?></strong>
7
+ is currently <span class="w3tc-<?php if ($pgcache_enabled): ?>enabled">enabled<?php else: ?>disabled">disabled<?php endif; ?></span>.
8
+ </p>
9
  <p>
10
+ To rebuild the page cache use the
11
+ <input type="submit" name="flush_pgcache" value="empty cache"<?php if (! $pgcache_enabled): ?> disabled="disabled"<?php endif; ?> class="button" />
12
+ operation.
13
+ <input type="hidden" name="page" value="<?php echo $this->_page; ?>" />
14
  </p>
15
  </form>
16
 
17
+ <form action="admin.php?page=<?php echo $this->_page; ?>" method="post">
18
  <fieldset>
19
  <legend>General</legend>
20
 
21
  <table class="form-table">
22
  <tr>
23
+ <th>
24
  <input type="hidden" name="pgcache.reject.logged" value="0" />
25
  <label><input type="checkbox" name="pgcache.reject.logged" value="1"<?php checked($this->_config->get_boolean('pgcache.reject.logged'), true); ?> /> Don't cache pages for logged in users</label><br />
26
  <span class="description">Users that have signed in to WordPress (e.g. administrators) will never view cached pages if enabled.</span>
27
  </th>
28
  </tr>
29
  <tr>
30
+ <th>
31
  <input type="hidden" name="pgcache.cache.home" value="0" />
32
  <label><input type="checkbox" name="pgcache.cache.home" value="1"<?php checked($this->_config->get_boolean('pgcache.cache.home'), true); ?> /> Cache the home page</label><br />
33
  <span class="description">For many blogs this is your most visited page, it is recommended that you cache it.</span>
34
  </th>
35
  </tr>
36
  <tr>
37
+ <th>
38
  <input type="hidden" name="pgcache.cache.feed" value="0" />
39
+ <label><input type="checkbox" name="pgcache.cache.feed" value="1"<?php checked($this->_config->get_boolean('pgcache.cache.feed'), true); ?> /> Cache site, categories, tags, comments and feeds</label><br />
40
  <span class="description">Even if using a feed proxy service (like <a href="http://en.wikipedia.org/wiki/FeedBurner" target="_blank">FeedBurner</a>), enabling this option is still recommended.</span>
41
  </th>
42
  </tr>
43
  <tr>
44
+ <th>
45
  <input type="hidden" name="pgcache.cache.query" value="0"<?php if ($this->_config->get_string('pgcache.engine') == 'file_pgcache'): ?> disabled="disabled"<?php endif; ?> />
46
  <label><input type="checkbox" name="pgcache.cache.query" value="1"<?php checked($this->_config->get_boolean('pgcache.cache.query'), true); ?><?php if ($this->_config->get_string('pgcache.engine') == 'file_pgcache'): ?> disabled="disabled"<?php endif; ?> /> Cache <acronym title="Uniform Resource Identifier">URI</acronym>s with query string variables</label><br />
47
  <span class="description">Search result (and similar) pages will be cached if enabled.</span>
48
  </th>
49
  </tr>
50
  <tr>
51
+ <th>
52
+ <input type="hidden" name="pgcache.cache.404" value="0" />
53
+ <label><input type="checkbox" name="pgcache.cache.404" value="1"<?php checked($this->_config->get_boolean('pgcache.cache.404'), true); ?> /> Cache 404 (not found) pages</label><br />
54
+ <span class="description">Reduce server load by caching 404 pages. The "Do not process 404 errors for static objects with WordPress" Browser Cache option is recommended.</span>
55
+ </th>
 
 
 
 
 
56
  </tr>
57
  </table>
58
+
59
  <p class="submit">
60
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
61
  </p>
62
  </fieldset>
63
 
70
  <th><label for="memcached_servers">Memcached hostname:port / <acronym title="Internet Protocol">IP</acronym>:port:</label></th>
71
  <td>
72
  <input id="memcached_servers" type="text" name="pgcache.memcached.servers" value="<?php echo htmlspecialchars(implode(',', $this->_config->get_array('pgcache.memcached.servers'))); ?>" size="100" />
73
+ <input id="memcached_test" class="button" type="button" value="Test" />
74
+ <span id="memcached_test_status" class="w3tc-status w3tc-process"></span>
75
  <br /><span class="description">Multiple servers may be used and seperated by a comma; e.g. 192.168.1.100:11211, domain.com:22122</span>
76
  </td>
77
  </tr>
78
  <?php endif; ?>
 
 
 
 
 
 
79
  <tr>
80
  <th><label for="pgcache_file_gc">Garbage collection interval:</label></th>
81
+ <td>
82
+ <input id="pgcache_file_gc" type="text" name="pgcache.file.gc" value="<?php echo $this->_config->get_integer('pgcache.file.gc'); ?>" size="8"<?php if ($this->_config->get_string('pgcache.engine') != 'file' && $this->_config->get_string('pgcache.engine') != 'file_pgcache'): ?> disabled="disabled"<?php endif; ?> /> seconds
83
  <br /><span class="description">If caching to disk, specify how frequently expired cache data is removed. For busy sites, a lower value is best.</span>
84
  </td>
85
  </tr>
105
  </td>
106
  </tr>
107
  <tr>
108
+ <th valign="top"><label for="pgcache_accept_files">Cache exception list:</label></th>
109
  <td>
110
  <textarea id="pgcache_accept_files" name="pgcache.accept.files" cols="40" rows="5"><?php echo htmlspecialchars(implode("\r\n", $this->_config->get_array('pgcache.accept.files'))); ?></textarea><br />
111
  <span class="description">Cache the specified pages / directories even if listed in the "never cache the following pages" field.</span>
118
  <span class="description">Specify additional page headers to cache.</span>
119
  </td>
120
  </tr>
121
+ </table>
122
+
123
+ <p class="submit">
124
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
125
+ </p>
126
+ </fieldset>
127
+
128
+ <fieldset>
129
+ <legend>Cache Preload</legend>
130
+
131
+ <table class="form-table">
132
+ <tr>
133
+ <th colspan="2">
134
+ <input type="hidden" name="pgcache.prime.enabled" value="0" />
135
+ <label><input type="checkbox" name="pgcache.prime.enabled" value="1"<?php checked($this->_config->get_boolean('pgcache.prime.enabled'), true); ?> /> Automatically prime the page cache</label><br />
136
+ </th>
137
+ </tr>
138
  <tr>
139
+ <th><label for="pgcache_prime_interval">Update interval:</label></th>
140
  <td>
141
+ <input id="pgcache_prime_interval" type="text" name="pgcache.prime.interval" value="<?php echo $this->_config->get_integer('pgcache.prime.interval'); ?>" size="8" /> seconds<br />
142
+ <span class="description">The number of seconds to wait before creating another set of cached pages.</span>
143
+ </td>
144
  </tr>
145
  <tr>
146
+ <th><label for="pgcache_prime_limit">Pages per interval:</label></th>
147
  <td>
148
+ <input id="pgcache_prime_limit" type="text" name="pgcache.prime.limit" value="<?php echo $this->_config->get_integer('pgcache.prime.limit'); ?>" size="8" /><br />
149
+ <span class="description">Limit the number of pages to create per batch. Fewer pages may be better for under-powered servers.</span>
150
+ </td>
151
+ </tr>
152
+ <tr>
153
+ <th><label for="pgcache_prime_sitemap">Sitemap <acronym title="Uniform Resource Indicator">URL</acronym>:</label></th>
154
+ <td>
155
+ <input id="pgcache_prime_sitemap" type="text" name="pgcache.prime.sitemap" value="<?php echo $this->_config->get_string('pgcache.prime.sitemap'); ?>" size="100" /><br />
156
+ <span class="description">A <a href="http://www.xml-sitemaps.com/validate-xml-sitemap.html" target="_blank">compliant</a> sitemap can be used to specify the pages to maintain in the primed cache. Pages will be cached according to the priorities specified in the <acronym title="Extensible Markup Language">XML</acronym> file. <a href="http://wordpress.org/extend/plugins/google-sitemap-generator/" target="_blank">Google <acronym title="Extensible Markup Language">XML</acronym> Sitemaps</a> is recommended for use with this feature.</span>
157
+ </td>
158
+ </tr>
159
+
160
+ </table>
161
+
162
+ <p class="submit">
163
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
164
+ </p>
165
+ </fieldset>
166
+
167
+ <fieldset>
168
+ <legend>Varnish</legend>
169
+
170
+ <table class="form-table">
171
+ <tr>
172
+ <th colspan="2">
173
+ <input type="hidden" name="pgcache.varnish.enabled" value="0" />
174
+ <label><input type="checkbox" name="pgcache.varnish.enabled" value="1"<?php checked($this->_config->get_boolean('pgcache.varnish.enabled'), true); ?> /> Enable varnish cache purging</label><br />
175
+ </th>
176
+ </tr>
177
+ <tr>
178
+ <th valign="top"><label for="pgcache_varnish_servers">Varnish servers:</label></th>
179
+ <td>
180
+ <textarea id="pgcache_varnish_servers" name="pgcache.varnish.servers" cols="40" rows="5"><?php echo htmlspecialchars(implode("\r\n", $this->_config->get_array('pgcache.varnish.servers'))); ?></textarea><br />
181
+ <span class="description">Specify the IP addresses of your varnish instances above. Your <acronym title="Varnish Configuration Language">VCL</acronym>'s <acronym title="Access Control List">ACL</acronym> must allow this request.</span>
182
  </td>
183
  </tr>
184
  </table>
185
+
186
  <p class="submit">
187
+ <input type="submit" name="options_save" class="button-primary" value="Save changes" />
188
  </p>
189
  </fieldset>
190
+
191
+ <fieldset>
192
+ <legend>Note(s):</legend>
193
+
194
+ <table class="form-table">
195
+ <tr>
196
+ <th valign="top" colspan="2">
197
+ <ul>
198
+ <li>Enable <acronym title="Hypertext Transfer Protocol">HTTP</acronym> compression in the "<acronym title="Hypertext Markup Language">HTML</acronym>" section on <a href="admin.php?page=w3tc_browsercache">Browser Cache</a> Settings tab.</li>
199
+ <li>The <acronym title="Time to Live">TTL</acronym> of page cache files is set via the "Expires header lifetime" field in the "<acronym title="Hypertext Markup Language">HTML</acronym>" section on <a href="admin.php?page=w3tc_browsercache">Browser Cache</a> Settings tab.</li>
200
+ </ul>
201
+ </th>
202
+ </tr>
203
+ </table>
204
+ </fieldset>
205
+
206
  </form>
207
 
208
  <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
inc/options/support.phtml CHANGED
@@ -1,99 +1,30 @@
1
- <?php include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
 
 
 
 
2
 
3
- <h3>Support</h3>
4
-
5
- <form action="options-general.php?page=<?php echo urldecode(W3TC_FILE); ?>&amp;tab=<?php echo $this->_tab; ?>" method="post" enctype="multipart/form-data" id="support_form">
6
- <p>
7
- Request professional services or notify us of any bugs you have identified:
8
- </p>
9
-
10
- <fieldset>
11
- <legend>Required information</legend>
12
-
13
- <table class="form-table">
14
- <tr>
15
- <th valign="top"><label for="support_request_type">Request type:</label></th>
16
- <td><select id="support_request_type" name="request_type">
17
- <option value="">-- Choose Type --</option>
18
- <?php foreach ($request_types as $_request_type): ?>
19
- <option value="<?php echo $_request_type; ?>"<?php selected($_request_type, $request_type); ?>><?php echo $_request_type; ?></option>
20
- <?php endforeach; ?>
21
- </select></td>
22
- </tr>
23
- <tr>
24
- <th><label for="support_url">Blog <acronym title="Uniform Resource Locator">URL</acronym>:</label></th>
25
- <td><input id="support_url" type="text" name="url" value="<?php echo htmlspecialchars($url); ?>" size="80" /></td>
26
- </tr>
27
- <tr>
28
- <th><label for="support_name">Name:</label></th>
29
- <td><input id="support_name" type="text" name="name" value="<?php echo htmlspecialchars($name); ?>" size="80" /></td>
30
- </tr>
31
- <tr>
32
- <th><label for="support_email">E-Mail:</label></th>
33
- <td><input id="support_email" type="text" name="email" value="<?php echo htmlspecialchars($email); ?>" size="80" /></td>
34
- </tr>
35
- <tr>
36
- <th valign="top"><label for="support_description">Issue description:</label></th>
37
- <td><textarea id="support_description" name="description" cols="80" rows="8"><?php echo htmlspecialchars($description); ?></textarea></td>
38
- </tr>
39
- <tr>
40
- <th><label for="support_template">Attach template:</label></th>
41
- <td><select id="support_template" name="templates[]" multiple="multiple" size="10" style="height: auto;">
42
- <?php foreach ($template_files as $template_file): ?>
43
- <option value="<?php echo htmlspecialchars($template_file); ?>"<?php if (in_array($template_file, $templates)): ?> selected="selected"<?php endif; ?>><?php echo htmlspecialchars($template_file); ?></option>
44
- <?php endforeach; ?>
45
- </select></td>
46
- </tr>
47
- <tr>
48
- <th><label for="support_file">Attach file:</label></th>
49
- <td>
50
- <input id="support_file" type="file" name="files[]" value="" /><br />
51
- <a href="#" id="support_more_files">Attach more files</a>
52
- </td>
53
- </tr>
54
- </table>
55
- </fieldset>
56
-
57
- <fieldset>
58
- <legend>Additional information</legend>
59
-
60
- <table class="form-table">
61
- <tr>
62
- <th><label for="support_wp_login"><acronym title="WordPress">WP</acronym> Admin login:</label></th>
63
- <td><input id="support_wp_login" type="text" name="wp_login" value="<?php echo htmlspecialchars($wp_login); ?>" size="40" /></td>
64
- </tr>
65
- <tr>
66
- <th><label for="support_wp_password"><acronym title="WordPress">WP</acronym> Admin password:</label></th>
67
- <td><input id="support_wp_password" type="text" name="wp_password" value="<?php echo htmlspecialchars($wp_password); ?>" size="40" /></td>
68
- </tr>
69
- <tr>
70
- <th><label for="support_ftp_host"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> host:</label></th>
71
- <td><input id="support_ftp_host" type="text" name="ftp_host" value="<?php echo htmlspecialchars($ftp_host); ?>" size="40" /></td>
72
- </tr>
73
- <tr>
74
- <th><label for="support_ftp_login"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> login:</label></th>
75
- <td><input id="support_ftp_login" type="text" name="ftp_login" value="<?php echo htmlspecialchars($ftp_login); ?>" size="40" /></td>
76
- </tr>
77
- <tr>
78
- <th><label for="support_ftp_password"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> password:</label></th>
79
- <td><input id="support_ftp_password" type="text" name="ftp_password" value="<?php echo htmlspecialchars($ftp_password); ?>" size="40" /></td>
80
- </tr>
81
- </table>
82
- </fieldset>
83
 
84
- <fieldset>
85
- <legend>Notes</legend>
 
 
 
 
86
 
87
- <ul>
88
- <li>All submitted data will not be saved and is used solely for the purposes your support request. You will not be added to a mailing list, solicited without your permission, nor will your site be administered after this support case is closed.</li>
89
- <li>Instead of providing your primary administrative or <acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> accounts, create a new administrator account that can be disabled when the support case is closed.</li>
90
- <li>Please add the domain w3-edge.com to your <a href="http://en.wikipedia.org/wiki/Whitelist" target="_blank">email whitelist</a> as soon as possible.</li>
91
- </ul>
92
- </fieldset>
93
-
94
- <p>
95
- <input type="submit" name="Submit" class="button-primary" value="Submit request" />
96
- </p>
97
- </form>
98
 
99
- <?php include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
1
+ <?php if (! $ajax): include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
+ <p>
3
+ Request professional services, suggest a feature or submit a bug using the form below:
4
+ </p>
5
+ <?php endif; ?>
6
 
7
+ <div id="support_container">
8
+ <form action="admin.php?page=<?php echo $this->_page; ?>" method="post" enctype="multipart/form-data" id="support_form">
9
+ <?php include W3TC_DIR . '/inc/options/support/' . $request_type . '.phtml'; ?>
10
+
11
+ <fieldset>
12
+ <legend>Notes</legend>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
+ <ul>
15
+ <li>All submitted data will not be saved and is used solely for the purposes your support request. You will not be added to a mailing list, solicited without your permission, nor will your site be administered after this support case is closed.</li>
16
+ <li>Instead of providing your primary administrative or <acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> accounts, create a new administrator account that can be disabled when the support case is closed.</li>
17
+ <li>Please add the domain w3-edge.com to your <a href="http://en.wikipedia.org/wiki/Whitelist" target="_blank">email whitelist</a> as soon as possible.</li>
18
+ </ul>
19
+ </fieldset>
20
 
21
+ <p>
22
+ <input type="hidden" name="request_type" value="<?php echo $request_type; ?>" />
23
+ <input type="hidden" name="payment" value="<?php echo $payment; ?>" />
24
+ <input type="submit" name="support_request" class="button-primary" value="Submit request" />
25
+ <input id="support_cancel" type="button" value="Cancel" class="button-primary" />
26
+ </p>
27
+ </form>
28
+ </div>
 
 
 
29
 
30
+ <?php if (! $ajax) include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
inc/options/support/bug_report.phtml ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <fieldset class="required">
2
+ <legend>Required information</legend>
3
+
4
+ <table class="form-table">
5
+ <tr>
6
+ <th valign="top">Request type:</th>
7
+ <td><?php echo htmlspecialchars($this->_request_types[$request_type]); ?></td>
8
+ </tr>
9
+ <tr>
10
+ <th><label for="support_url">Blog <acronym title="Uniform Resource Locator">URL</acronym>:</label></th>
11
+ <td><input id="support_url" type="text" name="url" value="<?php echo htmlspecialchars($url); ?>" size="80" /></td>
12
+ </tr>
13
+ <tr>
14
+ <th><label for="support_name">Name:</label></th>
15
+ <td><input id="support_name" type="text" name="name" value="<?php echo htmlspecialchars($name); ?>" size="80" /></td>
16
+ </tr>
17
+ <tr>
18
+ <th><label for="support_email">E-Mail:</label></th>
19
+ <td><input id="support_email" type="text" name="email" value="<?php echo htmlspecialchars($email); ?>" size="80" /></td>
20
+ </tr>
21
+ <tr>
22
+ <th><label for="support_subject">Subject:</label></th>
23
+ <td><input id="support_subject" type="text" name="subject" value="<?php echo htmlspecialchars($subject); ?>" size="80" /></td>
24
+ </tr>
25
+ <tr>
26
+ <th valign="top"><label for="support_description">Issue description:</label></th>
27
+ <td><textarea id="support_description" name="description" cols="70" rows="8"><?php echo htmlspecialchars($description); ?></textarea></td>
28
+ </tr>
29
+ <tr>
30
+ <th><label for="support_template">Attach template:</label></th>
31
+ <td><select id="support_template" name="templates[]" multiple="multiple" size="10" style="height: auto;">
32
+ <?php foreach ($template_files as $template_file): ?>
33
+ <option value="<?php echo htmlspecialchars($template_file); ?>"<?php if (in_array($template_file, $templates)): ?> selected="selected"<?php endif; ?>><?php echo htmlspecialchars($template_file); ?></option>
34
+ <?php endforeach; ?>
35
+ </select></td>
36
+ </tr>
37
+ <tr>
38
+ <th><label for="support_file">Attach file:</label></th>
39
+ <td>
40
+ <input id="support_file" type="file" name="files[]" value="" /><br />
41
+ <a href="#" id="support_more_files">Attach more files</a>
42
+ </td>
43
+ </tr>
44
+ </table>
45
+ </fieldset>
46
+
47
+ <fieldset>
48
+ <legend>Additional information</legend>
49
+
50
+ <table class="form-table">
51
+ <tr>
52
+ <th><label for="support_phone">Phone:</label></th>
53
+ <td><input id="support_phone" type="text" name="phone" value="<?php echo htmlspecialchars($phone); ?>" size="80" /></td>
54
+ </tr>
55
+ <tr>
56
+ <th><label for="support_forum_url">Forum Topic URL:</label></th>
57
+ <td><input id="support_forum_url" type="text" name="forum_url" value="<?php echo htmlspecialchars($forum_url); ?>" size="80" /></td>
58
+ </tr>
59
+ <tr>
60
+ <th><label for="support_wp_login"><acronym title="WordPress">WP</acronym> Admin login:</label></th>
61
+ <td><input id="support_wp_login" type="text" name="wp_login" value="<?php echo htmlspecialchars($wp_login); ?>" size="80" /></td>
62
+ </tr>
63
+ <tr>
64
+ <th><label for="support_wp_password"><acronym title="WordPress">WP</acronym> Admin password:</label></th>
65
+ <td><input id="support_wp_password" type="text" name="wp_password" value="<?php echo htmlspecialchars($wp_password); ?>" size="80" /></td>
66
+ </tr>
67
+ <tr>
68
+ <th><label for="support_ftp_host"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> host:</label></th>
69
+ <td><input id="support_ftp_host" type="text" name="ftp_host" value="<?php echo htmlspecialchars($ftp_host); ?>" size="80" /></td>
70
+ </tr>
71
+ <tr>
72
+ <th><label for="support_ftp_login"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> login:</label></th>
73
+ <td><input id="support_ftp_login" type="text" name="ftp_login" value="<?php echo htmlspecialchars($ftp_login); ?>" size="80" /></td>
74
+ </tr>
75
+ <tr>
76
+ <th><label for="support_ftp_password"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> password:</label></th>
77
+ <td><input id="support_ftp_password" type="text" name="ftp_password" value="<?php echo htmlspecialchars($ftp_password); ?>" size="80" /></td>
78
+ </tr>
79
+ </table>
80
+ </fieldset>
inc/options/support/email_support.phtml ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <fieldset class="required">
2
+ <legend>Required information</legend>
3
+
4
+ <table class="form-table">
5
+ <tr>
6
+ <th valign="top">Request type:</th>
7
+ <td><?php echo htmlspecialchars($this->_request_types[$request_type]); ?></td>
8
+ </tr>
9
+ <tr>
10
+ <th><label for="support_url">Blog <acronym title="Uniform Resource Locator">URL</acronym>:</label></th>
11
+ <td><input id="support_url" type="text" name="url" value="<?php echo htmlspecialchars($url); ?>" size="80" /></td>
12
+ </tr>
13
+ <tr>
14
+ <th><label for="support_name">Name:</label></th>
15
+ <td><input id="support_name" type="text" name="name" value="<?php echo htmlspecialchars($name); ?>" size="80" /></td>
16
+ </tr>
17
+ <tr>
18
+ <th><label for="support_email">E-Mail:</label></th>
19
+ <td><input id="support_email" type="text" name="email" value="<?php echo htmlspecialchars($email); ?>" size="80" /></td>
20
+ </tr>
21
+ <tr>
22
+ <th><label for="support_subject">Subject:</label></th>
23
+ <td><input id="support_subject" type="text" name="subject" value="<?php echo htmlspecialchars($subject); ?>" size="80" /></td>
24
+ </tr>
25
+ <tr>
26
+ <th valign="top"><label for="support_description">Issue description:</label></th>
27
+ <td><textarea id="support_description" name="description" cols="70" rows="8"><?php echo htmlspecialchars($description); ?></textarea></td>
28
+ </tr>
29
+ <tr>
30
+ <th><label for="support_template">Attach template:</label></th>
31
+ <td><select id="support_template" name="templates[]" multiple="multiple" size="10" style="height: auto;">
32
+ <?php foreach ($template_files as $template_file): ?>
33
+ <option value="<?php echo htmlspecialchars($template_file); ?>"<?php if (in_array($template_file, $templates)): ?> selected="selected"<?php endif; ?>><?php echo htmlspecialchars($template_file); ?></option>
34
+ <?php endforeach; ?>
35
+ </select></td>
36
+ </tr>
37
+ <tr>
38
+ <th><label for="support_file">Attach file:</label></th>
39
+ <td>
40
+ <input id="support_file" type="file" name="files[]" value="" /><br />
41
+ <a href="#" id="support_more_files">Attach more files</a>
42
+ </td>
43
+ </tr>
44
+ </table>
45
+ </fieldset>
46
+
47
+ <fieldset>
48
+ <legend>Additional information</legend>
49
+
50
+ <table class="form-table">
51
+ <tr>
52
+ <th><label for="support_phone">Phone:</label></th>
53
+ <td><input id="support_phone" type="text" name="phone" value="<?php echo htmlspecialchars($phone); ?>" size="80" /></td>
54
+ </tr>
55
+ <tr>
56
+ <th><label for="support_forum_url">Forum Topic URL:</label></th>
57
+ <td><input id="support_forum_url" type="text" name="forum_url" value="<?php echo htmlspecialchars($forum_url); ?>" size="80" /></td>
58
+ </tr>
59
+ <tr>
60
+ <th><label for="support_wp_login"><acronym title="WordPress">WP</acronym> Admin login:</label></th>
61
+ <td><input id="support_wp_login" type="text" name="wp_login" value="<?php echo htmlspecialchars($wp_login); ?>" size="80" /></td>
62
+ </tr>
63
+ <tr>
64
+ <th><label for="support_wp_password"><acronym title="WordPress">WP</acronym> Admin password:</label></th>
65
+ <td><input id="support_wp_password" type="text" name="wp_password" value="<?php echo htmlspecialchars($wp_password); ?>" size="80" /></td>
66
+ </tr>
67
+ <tr>
68
+ <th><label for="support_ftp_host"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> host:</label></th>
69
+ <td><input id="support_ftp_host" type="text" name="ftp_host" value="<?php echo htmlspecialchars($ftp_host); ?>" size="80" /></td>
70
+ </tr>
71
+ <tr>
72
+ <th><label for="support_ftp_login"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> login:</label></th>
73
+ <td><input id="support_ftp_login" type="text" name="ftp_login" value="<?php echo htmlspecialchars($ftp_login); ?>" size="80" /></td>
74
+ </tr>
75
+ <tr>
76
+ <th><label for="support_ftp_password"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> password:</label></th>
77
+ <td><input id="support_ftp_password" type="text" name="ftp_password" value="<?php echo htmlspecialchars($ftp_password); ?>" size="80" /></td>
78
+ </tr>
79
+ </table>
80
+ </fieldset>
inc/options/support/linux_config.phtml ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <fieldset class="required">
2
+ <legend>Required information</legend>
3
+
4
+ <table class="form-table">
5
+ <tr>
6
+ <th valign="top">Request type:</th>
7
+ <td><?php echo htmlspecialchars($this->_request_types[$request_type]); ?></td>
8
+ </tr>
9
+ <tr>
10
+ <th><label for="support_url">Blog <acronym title="Uniform Resource Locator">URL</acronym>:</label></th>
11
+ <td><input id="support_url" type="text" name="url" value="<?php echo htmlspecialchars($url); ?>" size="80" /></td>
12
+ </tr>
13
+ <tr>
14
+ <th><label for="support_name">Name:</label></th>
15
+ <td><input id="support_name" type="text" name="name" value="<?php echo htmlspecialchars($name); ?>" size="80" /></td>
16
+ </tr>
17
+ <tr>
18
+ <th><label for="support_email">E-Mail:</label></th>
19
+ <td><input id="support_email" type="text" name="email" value="<?php echo htmlspecialchars($email); ?>" size="80" /></td>
20
+ </tr>
21
+ <tr>
22
+ <th><label for="support_subject">Subject:</label></th>
23
+ <td><input id="support_subject" type="text" name="subject" value="<?php echo htmlspecialchars($subject); ?>" size="80" /></td>
24
+ </tr>
25
+ <tr>
26
+ <th valign="top"><label for="support_description">Issue description:</label></th>
27
+ <td><textarea id="support_description" name="description" cols="70" rows="8"><?php echo htmlspecialchars($description); ?></textarea></td>
28
+ </tr>
29
+ <tr>
30
+ <th><label for="support_file">Attach file:</label></th>
31
+ <td>
32
+ <input id="support_file" type="file" name="files[]" value="" /><br />
33
+ <a href="#" id="support_more_files">Attach more files</a>
34
+ </td>
35
+ </tr>
36
+ <tr>
37
+ <th><label for="support_wp_login"><acronym title="WordPress">WP</acronym> Admin login:</label></th>
38
+ <td><input id="support_wp_login" type="text" name="wp_login" value="<?php echo htmlspecialchars($wp_login); ?>" size="80" /></td>
39
+ </tr>
40
+ <tr>
41
+ <th><label for="support_wp_password"><acronym title="WordPress">WP</acronym> Admin password:</label></th>
42
+ <td><input id="support_wp_password" type="text" name="wp_password" value="<?php echo htmlspecialchars($wp_password); ?>" size="80" /></td>
43
+ </tr>
44
+ <tr>
45
+ <th><label for="support_ftp_host"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> host:</label></th>
46
+ <td><input id="support_ftp_host" type="text" name="ftp_host" value="<?php echo htmlspecialchars($ftp_host); ?>" size="80" /></td>
47
+ </tr>
48
+ <tr>
49
+ <th><label for="support_ftp_login"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> login:</label></th>
50
+ <td><input id="support_ftp_login" type="text" name="ftp_login" value="<?php echo htmlspecialchars($ftp_login); ?>" size="80" /></td>
51
+ </tr>
52
+ <tr>
53
+ <th><label for="support_ftp_password"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> password:</label></th>
54
+ <td><input id="support_ftp_password" type="text" name="ftp_password" value="<?php echo htmlspecialchars($ftp_password); ?>" size="80" /></td>
55
+ </tr>
56
+ </table>
57
+ </fieldset>
58
+
59
+ <fieldset>
60
+ <legend>Additional information</legend>
61
+
62
+ <table class="form-table">
63
+ <tr>
64
+ <th><label for="support_phone">Phone:</label></th>
65
+ <td><input id="support_phone" type="text" name="phone" value="<?php echo htmlspecialchars($phone); ?>" size="80" /></td>
66
+ </tr>
67
+ </table>
68
+ </fieldset>
inc/options/support/new_feature.phtml ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <fieldset class="required">
2
+ <legend>Required information</legend>
3
+
4
+ <table class="form-table">
5
+ <tr>
6
+ <th valign="top">Request type:</th>
7
+ <td><?php echo htmlspecialchars($this->_request_types[$request_type]); ?></td>
8
+ </tr>
9
+ <tr>
10
+ <th><label for="support_url">Blog <acronym title="Uniform Resource Locator">URL</acronym>:</label></th>
11
+ <td><input id="support_url" type="text" name="url" value="<?php echo htmlspecialchars($url); ?>" size="80" /></td>
12
+ </tr>
13
+ <tr>
14
+ <th><label for="support_name">Name:</label></th>
15
+ <td><input id="support_name" type="text" name="name" value="<?php echo htmlspecialchars($name); ?>" size="80" /></td>
16
+ </tr>
17
+ <tr>
18
+ <th><label for="support_email">E-Mail:</label></th>
19
+ <td><input id="support_email" type="text" name="email" value="<?php echo htmlspecialchars($email); ?>" size="80" /></td>
20
+ </tr>
21
+ <tr>
22
+ <th><label for="support_subject">Subject:</label></th>
23
+ <td><input id="support_subject" type="text" name="subject" value="<?php echo htmlspecialchars($subject); ?>" size="80" /></td>
24
+ </tr>
25
+ <tr>
26
+ <th valign="top"><label for="support_description">Issue description:</label></th>
27
+ <td><textarea id="support_description" name="description" cols="70" rows="8"><?php echo htmlspecialchars($description); ?></textarea></td>
28
+ </tr>
29
+ </table>
30
+ </fieldset>
31
+
32
+ <fieldset>
33
+ <legend>Additional information</legend>
34
+
35
+ <table class="form-table">
36
+ <tr>
37
+ <th><label for="support_phone">Phone:</label></th>
38
+ <td><input id="support_phone" type="text" name="phone" value="<?php echo htmlspecialchars($phone); ?>" size="80" /></td>
39
+ </tr>
40
+ <tr>
41
+ <th><label for="support_forum_url">Forum Topic URL:</label></th>
42
+ <td><input id="support_forum_url" type="text" name="forum_url" value="<?php echo htmlspecialchars($forum_url); ?>" size="80" /></td>
43
+ </tr>
44
+ </table>
45
+ </fieldset>
inc/options/support/phone_support.phtml ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <fieldset class="required">
2
+ <legend>Required information</legend>
3
+
4
+ <table class="form-table">
5
+ <tr>
6
+ <th valign="top">Request type:</th>
7
+ <td><?php echo htmlspecialchars($this->_request_types[$request_type]); ?></td>
8
+ </tr>
9
+ <tr>
10
+ <th><label for="support_url">Blog <acronym title="Uniform Resource Locator">URL</acronym>:</label></th>
11
+ <td><input id="support_url" type="text" name="url" value="<?php echo htmlspecialchars($url); ?>" size="80" /></td>
12
+ </tr>
13
+ <tr>
14
+ <th><label for="support_name">Name:</label></th>
15
+ <td><input id="support_name" type="text" name="name" value="<?php echo htmlspecialchars($name); ?>" size="80" /></td>
16
+ </tr>
17
+ <tr>
18
+ <th><label for="support_email">E-Mail:</label></th>
19
+ <td><input id="support_email" type="text" name="email" value="<?php echo htmlspecialchars($email); ?>" size="80" /></td>
20
+ </tr>
21
+ <tr>
22
+ <th><label for="support_phone">Phone:</label></th>
23
+ <td><input id="support_phone" type="text" name="phone" value="<?php echo htmlspecialchars($phone); ?>" size="80" /></td>
24
+ </tr>
25
+ <tr>
26
+ <th><label for="support_subject">Subject:</label></th>
27
+ <td><input id="support_subject" type="text" name="subject" value="<?php echo htmlspecialchars($subject); ?>" size="80" /></td>
28
+ </tr>
29
+ <tr>
30
+ <th valign="top"><label for="support_description">Issue description:</label></th>
31
+ <td><textarea id="support_description" name="description" cols="70" rows="8"><?php echo htmlspecialchars($description); ?></textarea></td>
32
+ </tr>
33
+ <tr>
34
+ <th><label for="support_template">Attach template:</label></th>
35
+ <td><select id="support_template" name="templates[]" multiple="multiple" size="10" style="height: auto;">
36
+ <?php foreach ($template_files as $template_file): ?>
37
+ <option value="<?php echo htmlspecialchars($template_file); ?>"<?php if (in_array($template_file, $templates)): ?> selected="selected"<?php endif; ?>><?php echo htmlspecialchars($template_file); ?></option>
38
+ <?php endforeach; ?>
39
+ </select></td>
40
+ </tr>
41
+ <tr>
42
+ <th><label for="support_file">Attach file:</label></th>
43
+ <td>
44
+ <input id="support_file" type="file" name="files[]" value="" /><br />
45
+ <a href="#" id="support_more_files">Attach more files</a>
46
+ </td>
47
+ </tr>
48
+ </table>
49
+ </fieldset>
50
+
51
+ <fieldset>
52
+ <legend>Additional information</legend>
53
+
54
+ <table class="form-table">
55
+ <tr>
56
+ <th><label for="support_forum_url">Forum Topic URL:</label></th>
57
+ <td><input id="support_forum_url" type="text" name="forum_url" value="<?php echo htmlspecialchars($forum_url); ?>" size="80" /></td>
58
+ </tr>
59
+ <tr>
60
+ <th><label for="support_wp_login"><acronym title="WordPress">WP</acronym> Admin login:</label></th>
61
+ <td><input id="support_wp_login" type="text" name="wp_login" value="<?php echo htmlspecialchars($wp_login); ?>" size="80" /></td>
62
+ </tr>
63
+ <tr>
64
+ <th><label for="support_wp_password"><acronym title="WordPress">WP</acronym> Admin password:</label></th>
65
+ <td><input id="support_wp_password" type="text" name="wp_password" value="<?php echo htmlspecialchars($wp_password); ?>" size="80" /></td>
66
+ </tr>
67
+ <tr>
68
+ <th><label for="support_ftp_host"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> host:</label></th>
69
+ <td><input id="support_ftp_host" type="text" name="ftp_host" value="<?php echo htmlspecialchars($ftp_host); ?>" size="80" /></td>
70
+ </tr>
71
+ <tr>
72
+ <th><label for="support_ftp_login"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> login:</label></th>
73
+ <td><input id="support_ftp_login" type="text" name="ftp_login" value="<?php echo htmlspecialchars($ftp_login); ?>" size="80" /></td>
74
+ </tr>
75
+ <tr>
76
+ <th><label for="support_ftp_password"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> password:</label></th>
77
+ <td><input id="support_ftp_password" type="text" name="ftp_password" value="<?php echo htmlspecialchars($ftp_password); ?>" size="80" /></td>
78
+ </tr>
79
+ </table>
80
+ </fieldset>
inc/options/support/plugin_config.phtml ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <fieldset class="required">
2
+ <legend>Required information</legend>
3
+
4
+ <table class="form-table">
5
+ <tr>
6
+ <th valign="top">Request type:</th>
7
+ <td><?php echo htmlspecialchars($this->_request_types[$request_type]); ?></td>
8
+ </tr>
9
+ <tr>
10
+ <th><label for="support_url">Blog <acronym title="Uniform Resource Locator">URL</acronym>:</label></th>
11
+ <td><input id="support_url" type="text" name="url" value="<?php echo htmlspecialchars($url); ?>" size="80" /></td>
12
+ </tr>
13
+ <tr>
14
+ <th><label for="support_name">Name:</label></th>
15
+ <td><input id="support_name" type="text" name="name" value="<?php echo htmlspecialchars($name); ?>" size="80" /></td>
16
+ </tr>
17
+ <tr>
18
+ <th><label for="support_email">E-Mail:</label></th>
19
+ <td><input id="support_email" type="text" name="email" value="<?php echo htmlspecialchars($email); ?>" size="80" /></td>
20
+ </tr>
21
+ <tr>
22
+ <th><label for="support_subject">Subject:</label></th>
23
+ <td><input id="support_subject" type="text" name="subject" value="<?php echo htmlspecialchars($subject); ?>" size="80" /></td>
24
+ </tr>
25
+ <tr>
26
+ <th valign="top"><label for="support_description">Issue description:</label></th>
27
+ <td><textarea id="support_description" name="description" cols="70" rows="8"><?php echo htmlspecialchars($description); ?></textarea></td>
28
+ </tr>
29
+ <tr>
30
+ <th><label for="support_template">Attach template:</label></th>
31
+ <td><select id="support_template" name="templates[]" multiple="multiple" size="10" style="height: auto;">
32
+ <?php foreach ($template_files as $template_file): ?>
33
+ <option value="<?php echo htmlspecialchars($template_file); ?>"<?php if (in_array($template_file, $templates)): ?> selected="selected"<?php endif; ?>><?php echo htmlspecialchars($template_file); ?></option>
34
+ <?php endforeach; ?>
35
+ </select></td>
36
+ </tr>
37
+ <tr>
38
+ <th><label for="support_file">Attach file:</label></th>
39
+ <td>
40
+ <input id="support_file" type="file" name="files[]" value="" /><br />
41
+ <a href="#" id="support_more_files">Attach more files</a>
42
+ </td>
43
+ </tr>
44
+ <tr>
45
+ <th><label for="support_wp_login"><acronym title="WordPress">WP</acronym> Admin login:</label></th>
46
+ <td><input id="support_wp_login" type="text" name="wp_login" value="<?php echo htmlspecialchars($wp_login); ?>" size="80" /></td>
47
+ </tr>
48
+ <tr>
49
+ <th><label for="support_wp_password"><acronym title="WordPress">WP</acronym> Admin password:</label></th>
50
+ <td><input id="support_wp_password" type="text" name="wp_password" value="<?php echo htmlspecialchars($wp_password); ?>" size="80" /></td>
51
+ </tr>
52
+ </table>
53
+ </fieldset>
54
+
55
+ <fieldset>
56
+ <legend>Additional information</legend>
57
+
58
+ <table class="form-table">
59
+ <tr>
60
+ <th><label for="support_phone">Phone:</label></th>
61
+ <td><input id="support_phone" type="text" name="phone" value="<?php echo htmlspecialchars($phone); ?>" size="80" /></td>
62
+ </tr>
63
+ <tr>
64
+ <th><label for="support_ftp_host"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> host:</label></th>
65
+ <td><input id="support_ftp_host" type="text" name="ftp_host" value="<?php echo htmlspecialchars($ftp_host); ?>" size="80" /></td>
66
+ </tr>
67
+ <tr>
68
+ <th><label for="support_ftp_login"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> login:</label></th>
69
+ <td><input id="support_ftp_login" type="text" name="ftp_login" value="<?php echo htmlspecialchars($ftp_login); ?>" size="80" /></td>
70
+ </tr>
71
+ <tr>
72
+ <th><label for="support_ftp_password"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> password:</label></th>
73
+ <td><input id="support_ftp_password" type="text" name="ftp_password" value="<?php echo htmlspecialchars($ftp_password); ?>" size="80" /></td>
74
+ </tr>
75
+ </table>
76
+ </fieldset>
inc/options/support/theme_config.phtml ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <fieldset class="required">
2
+ <legend>Required information</legend>
3
+
4
+ <table class="form-table">
5
+ <tr>
6
+ <th valign="top">Request type:</th>
7
+ <td><?php echo htmlspecialchars($this->_request_types[$request_type]); ?></td>
8
+ </tr>
9
+ <tr>
10
+ <th><label for="support_url">Blog <acronym title="Uniform Resource Locator">URL</acronym>:</label></th>
11
+ <td><input id="support_url" type="text" name="url" value="<?php echo htmlspecialchars($url); ?>" size="80" /></td>
12
+ </tr>
13
+ <tr>
14
+ <th><label for="support_name">Name:</label></th>
15
+ <td><input id="support_name" type="text" name="name" value="<?php echo htmlspecialchars($name); ?>" size="80" /></td>
16
+ </tr>
17
+ <tr>
18
+ <th><label for="support_email">E-Mail:</label></th>
19
+ <td><input id="support_email" type="text" name="email" value="<?php echo htmlspecialchars($email); ?>" size="80" /></td>
20
+ </tr>
21
+ <tr>
22
+ <th><label for="support_subject">Subject:</label></th>
23
+ <td><input id="support_subject" type="text" name="subject" value="<?php echo htmlspecialchars($subject); ?>" size="80" /></td>
24
+ </tr>
25
+ <tr>
26
+ <th valign="top"><label for="support_description">Issue description:</label></th>
27
+ <td><textarea id="support_description" name="description" cols="70" rows="8"><?php echo htmlspecialchars($description); ?></textarea></td>
28
+ </tr>
29
+ <tr>
30
+ <th><label for="support_template">Attach template:</label></th>
31
+ <td><select id="support_template" name="templates[]" multiple="multiple" size="10" style="height: auto;">
32
+ <?php foreach ($template_files as $template_file): ?>
33
+ <option value="<?php echo htmlspecialchars($template_file); ?>"<?php if (in_array($template_file, $templates)): ?> selected="selected"<?php endif; ?>><?php echo htmlspecialchars($template_file); ?></option>
34
+ <?php endforeach; ?>
35
+ </select></td>
36
+ </tr>
37
+ <tr>
38
+ <th><label for="support_file">Attach file:</label></th>
39
+ <td>
40
+ <input id="support_file" type="file" name="files[]" value="" /><br />
41
+ <a href="#" id="support_more_files">Attach more files</a>
42
+ </td>
43
+ </tr>
44
+ <tr>
45
+ <th><label for="support_wp_login"><acronym title="WordPress">WP</acronym> Admin login:</label></th>
46
+ <td><input id="support_wp_login" type="text" name="wp_login" value="<?php echo htmlspecialchars($wp_login); ?>" size="80" /></td>
47
+ </tr>
48
+ <tr>
49
+ <th><label for="support_wp_password"><acronym title="WordPress">WP</acronym> Admin password:</label></th>
50
+ <td><input id="support_wp_password" type="text" name="wp_password" value="<?php echo htmlspecialchars($wp_password); ?>" size="80" /></td>
51
+ </tr>
52
+ <tr>
53
+ <th><label for="support_ftp_host"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> host:</label></th>
54
+ <td><input id="support_ftp_host" type="text" name="ftp_host" value="<?php echo htmlspecialchars($ftp_host); ?>" size="80" /></td>
55
+ </tr>
56
+ <tr>
57
+ <th><label for="support_ftp_login"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> login:</label></th>
58
+ <td><input id="support_ftp_login" type="text" name="ftp_login" value="<?php echo htmlspecialchars($ftp_login); ?>" size="80" /></td>
59
+ </tr>
60
+ <tr>
61
+ <th><label for="support_ftp_password"><acronym title="Secure Shell">SSH</acronym> / <acronym title="File Transfer Protocol">FTP</acronym> password:</label></th>
62
+ <td><input id="support_ftp_password" type="text" name="ftp_password" value="<?php echo htmlspecialchars($ftp_password); ?>" size="80" /></td>
63
+ </tr>
64
+ </table>
65
+ </fieldset>
66
+
67
+ <fieldset>
68
+ <legend>Additional information</legend>
69
+
70
+ <table class="form-table">
71
+ <tr>
72
+ <th><label for="support_phone">Phone:</label></th>
73
+ <td><input id="support_phone" type="text" name="phone" value="<?php echo htmlspecialchars($phone); ?>" size="80" /></td>
74
+ </tr>
75
+ </table>
76
+ </fieldset>
inc/options/support_payment.phtml ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if (!$ajax): include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
+ <p>
3
+ Request professional services, suggest a feature or submit a bug using the form below:
4
+ </p>
5
+ <?php endif; ?>
6
+
7
+ <div id="support_container">
8
+ <form action="<?php echo W3TC_PAYPAL_URL; ?>" method="get">
9
+ <fieldset>
10
+ <legend>Request payment</legend>
11
+
12
+ <p><?php echo htmlspecialchars($this->_request_types[$request_type]); ?></p>
13
+
14
+ <p><strong>Price: <?php echo sprintf('%.2f', $this->_request_prices[$request_type]); ?> USD</strong></p>
15
+
16
+ <p>
17
+ <input type="hidden" name="cmd" value="_xclick" />
18
+ <input type="hidden" name="business" value="<?php echo W3TC_PAYPAL_BUSINESS; ?>" />
19
+ <input type="hidden" name="item_name" value="<?php echo htmlspecialchars($this->_request_types[$request_type]); ?>" />
20
+ <input type="hidden" name="amount" value="<?php echo sprintf('%.2f', $this->_request_prices[$request_type]); ?>" />
21
+ <input type="hidden" name="currency_code" value="USD" />
22
+ <input type="hidden" name="no_shipping" value="1" />
23
+ <input type="hidden" name="rm" value="2" />
24
+ <input type="hidden" name="return" value="<?php echo htmlspecialchars($return_url); ?>" />
25
+ <input type="hidden" name="cancel_return" value="<?php echo htmlspecialchars($cancel_url); ?>" />
26
+ <input type="submit" class="button-primary" value="Buy now" />
27
+ <input id="support_cancel" type="button" value="Cancel" class="button-primary" />
28
+ </p>
29
+ </fieldset>
30
+ </form>
31
+ </div>
32
+
33
+ <?php if (! $ajax) include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
inc/options/support_select.phtml ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if (! $ajax): include W3TC_DIR . '/inc/options/common/header.phtml'; ?>
2
+ <p>
3
+ Request professional services, suggest a feature or submit a bug using the form below:
4
+ </p>
5
+ <?php endif; ?>
6
+
7
+ <div id="support_container">
8
+ <form id="support_select_form" action="admin.php" method="get">
9
+ <fieldset>
10
+ <legend>Choose request type</legend>
11
+
12
+ <table class="form-table">
13
+ <tr>
14
+ <th valign="top"><label for="support_request_type">Request type:</label></th>
15
+ <td>
16
+ <input type="hidden" name="page" value="<?php echo $this->_page; ?>" />
17
+ <select id="support_request_type" name="request_type">
18
+ <option value="">-- Choose Type --</option>
19
+ <?php foreach ($this->_request_groups as $_request_group => $_request_types): ?>
20
+ <optgroup label="<?php echo htmlspecialchars($_request_group); ?>:">
21
+ <?php foreach ($_request_types as $_request_type): ?>
22
+ <option value="<?php echo $_request_type; ?>"<?php if ($request_type == $_request_type): ?><?php endif; ?>><?php echo htmlspecialchars($this->_request_types[$_request_type]); ?></option>
23
+ <?php endforeach; ?>
24
+ </optgroup>
25
+ <?php endforeach; ?>
26
+ </select>
27
+ </td>
28
+ </tr>
29
+ </table>
30
+ </fieldset>
31
+ </form>
32
+ </div>
33
+
34
+ <?php if (! $ajax) include W3TC_DIR . '/inc/options/common/footer.phtml'; ?>
inc/popup/cdn_export_file.phtml CHANGED
@@ -9,7 +9,7 @@ var files = [
9
  ];
10
 
11
  jQuery(function() {
12
- Cdn_Export_File.init(files);
13
  });
14
  </script>
15
 
9
  ];
10
 
11
  jQuery(function() {
12
+ W3tc_Popup_Cdn_Export_File.init(files);
13
  });
14
  </script>
15
 
inc/popup/cdn_export_library.phtml CHANGED
@@ -3,7 +3,7 @@
3
  <script type="text/javascript">
4
  /*<![CDATA[*/
5
  jQuery(function() {
6
- Cdn_Export_Library.init();
7
  });
8
  /*]]>*/
9
  </script>
3
  <script type="text/javascript">
4
  /*<![CDATA[*/
5
  jQuery(function() {
6
+ W3tc_Popup_Cdn_Export_Library.init();
7
  });
8
  /*]]>*/
9
  </script>
inc/popup/cdn_import_library.phtml CHANGED
@@ -5,7 +5,7 @@
5
  var cdn_host = '<?php echo $cdn_host; ?>';
6
 
7
  jQuery(function() {
8
- Cdn_Import_Library.init(cdn_host);
9
  });
10
  /*]]>*/
11
  </script>
@@ -34,12 +34,12 @@ jQuery(function() {
34
  </tr>
35
  <tr>
36
  <td colspan="2">
37
- <label><input id="cdn_import_library_redirect_permanent" type="checkbox" checked="checked" /> Use permanent redirects</label>
38
  </td>
39
  </tr>
40
  <tr>
41
  <td colspan="2">
42
- <label><input id="cdn_import_library_redirect_cdn" type="checkbox" /> Redirect to <acronym title="Content Delivery Network">CDN</acronym></label>
43
  </td>
44
  </tr>
45
  </table>
5
  var cdn_host = '<?php echo $cdn_host; ?>';
6
 
7
  jQuery(function() {
8
+ W3tc_Popup_Cdn_Import_Library.init(cdn_host);
9
  });
10
  /*]]>*/
11
  </script>
34
  </tr>
35
  <tr>
36
  <td colspan="2">
37
+ <label><input id="cdn_import_library_redirect_permanent" type="checkbox" checked="checked" /> Create a list of permanent (301) redirects for use in your site's .htaccess file</label>
38
  </td>
39
  </tr>
40
  <tr>
41
  <td colspan="2">
42
+ <label><input id="cdn_import_library_redirect_cdn" type="checkbox" /> Create a list of redirects to <acronym title="Content Delivery Network">CDN</acronym> (hostname specified in hostname field #1.)</label>
43
  </td>
44
  </tr>
45
  </table>
inc/popup/cdn_queue.phtml CHANGED
@@ -23,13 +23,13 @@
23
  <td><?php echo htmlspecialchars($result->last_error); ?></td>
24
  <td align="center"><?php echo htmlspecialchars($result->date); ?></td>
25
  <td align="center">
26
- <a href="options-general.php?page=<?php echo W3TC_FILE; ?>&amp;w3tc_action=cdn_queue&amp;cdn_queue_tab=upload&amp;cdn_queue_action=delete&amp;cdn_queue_id=<?php echo $result->id; ?>" class="cdn_queue_delete">Delete</a>
27
  </td>
28
  </tr>
29
  <?php endforeach; ?>
30
  </table>
31
  <p>
32
- <a href="options-general.php?page=<?php echo W3TC_FILE; ?>&amp;w3tc_action=cdn_queue&amp;cdn_queue_tab=upload&amp;cdn_queue_action=empty&amp;cdn_queue_type=<?php echo W3TC_CDN_COMMAND_UPLOAD; ?>" class="cdn_queue_empty">Empty upload queue</a>
33
  </p>
34
  <?php else: ?>
35
  <p class="empty">Upload queue is empty</p>
@@ -53,13 +53,13 @@
53
  <td><?php echo htmlspecialchars($result->last_error); ?></td>
54
  <td align="center"><?php echo htmlspecialchars($result->date); ?></td>
55
  <td align="center">
56
- <a href="options-general.php?page=<?php echo W3TC_FILE; ?>&amp;w3tc_action=cdn_queue&amp;cdn_queue_tab=delete&amp;cdn_queue_action=delete&amp;cdn_queue_id=<?php echo $result->id; ?>" class="cdn_queue_delete">Delete</a>
57
  </td>
58
  </tr>
59
  <?php endforeach; ?>
60
  </table>
61
  <p>
62
- <a href="options-general.php?page=<?php echo W3TC_FILE; ?>&amp;w3tc_action=cdn_queue&amp;cdn_queue_tab=delete&amp;cdn_queue_action=empty&amp;cdn_queue_type=<?php echo W3TC_CDN_COMMAND_DELETE; ?>" class="cdn_queue_empty">Empty upload queue</a>
63
  </p>
64
  <?php else: ?>
65
  <p class="empty">Delete queue is empty</p>
23
  <td><?php echo htmlspecialchars($result->last_error); ?></td>
24
  <td align="center"><?php echo htmlspecialchars($result->date); ?></td>
25
  <td align="center">
26
+ <a href="admin.php?page=w3tc_cdn&amp;w3tc_action=cdn_queue&amp;cdn_queue_tab=upload&amp;cdn_queue_action=delete&amp;cdn_queue_id=<?php echo $result->id; ?>" class="cdn_queue_delete">Delete</a>
27
  </td>
28
  </tr>
29
  <?php endforeach; ?>
30
  </table>
31
  <p>
32
+ <a href="admin.php?page=w3tc_cdn&amp;w3tc_action=cdn_queue&amp;cdn_queue_tab=upload&amp;cdn_queue_action=empty&amp;cdn_queue_type=<?php echo W3TC_CDN_COMMAND_UPLOAD; ?>" class="cdn_queue_empty">Empty upload queue</a>
33
  </p>
34
  <?php else: ?>
35
  <p class="empty">Upload queue is empty</p>
53
  <td><?php echo htmlspecialchars($result->last_error); ?></td>
54
  <td align="center"><?php echo htmlspecialchars($result->date); ?></td>
55
  <td align="center">
56
+ <a href="admin.php?page=w3tc_cdn&amp;w3tc_action=cdn_queue&amp;cdn_queue_tab=delete&amp;cdn_queue_action=delete&amp;cdn_queue_id=<?php echo $result->id; ?>" class="cdn_queue_delete">Delete</a>
57
  </td>
58
  </tr>
59
  <?php endforeach; ?>
60
  </table>
61
  <p>
62
+ <a href="admin.php?page=w3tc_cdn&amp;w3tc_action=cdn_queue&amp;cdn_queue_tab=delete&amp;cdn_queue_action=empty&amp;cdn_queue_type=<?php echo W3TC_CDN_COMMAND_DELETE; ?>" class="cdn_queue_empty">Empty upload queue</a>
63
  </p>
64
  <?php else: ?>
65
  <p class="empty">Delete queue is empty</p>
inc/popup/cdn_rename_domain.phtml CHANGED
@@ -3,7 +3,7 @@
3
  <script type="text/javascript">
4
  /*<![CDATA[*/
5
  jQuery(function() {
6
- Cdn_Rename_Domain.init();
7
  });
8
  /*]]>*/
9
  </script>
3
  <script type="text/javascript">
4
  /*<![CDATA[*/
5
  jQuery(function() {
6
+ W3tc_Popup_Cdn_Rename_Domain.init();
7
  });
8
  /*]]>*/
9
  </script>
inc/popup/common/header.phtml CHANGED
@@ -14,9 +14,9 @@
14
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
15
  <html xmlns="http://www.w3.org/1999/xhtml" <?php do_action('admin_xml_ns'); ?> <?php language_attributes(); ?>>
16
  <head>
17
- <link rel="stylesheet" type="text/css" href="<?php echo WP_PLUGIN_URL; ?>/w3-total-cache/inc/css/popup.css"></link>
18
- <script type="text/javascript" src="<?php echo w3_get_site_url(); ?>/<?php echo WPINC; ?>/js/jquery/jquery.js"></script>
19
- <script type="text/javascript" src="<?php echo WP_PLUGIN_URL; ?>/w3-total-cache/inc/js/popup.js"></script>
20
  <title><?php echo htmlspecialchars($title); ?> - W3 Total Cache</title>
21
  <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>" />
22
  </head>
14
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
15
  <html xmlns="http://www.w3.org/1999/xhtml" <?php do_action('admin_xml_ns'); ?> <?php language_attributes(); ?>>
16
  <head>
17
+ <link rel="stylesheet" type="text/css" href="<?php echo WP_PLUGIN_URL; ?>/w3-total-cache/inc/css/popup.css?ver=<?php echo W3TC_VERSION; ?>"></link>
18
+ <script type="text/javascript" src="<?php echo w3_get_site_url(); ?>/<?php echo WPINC; ?>/js/jquery/jquery.js?ver=<?php echo W3TC_VERSION; ?>"></script>
19
+ <script type="text/javascript" src="<?php echo WP_PLUGIN_URL; ?>/w3-total-cache/inc/js/popup.js?ver=<?php echo W3TC_VERSION; ?>"></script>
20
  <title><?php echo htmlspecialchars($title); ?> - W3 Total Cache</title>
21
  <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>" />
22
  </head>
ini/_htaccess DELETED
@@ -1,126 +0,0 @@
1
- # Append the contents of this file to this .htaccess to the one in your document root or configuration file to enable http
2
- # compression and client-side (browser) caching of files that W3 Total Cache does not handle. This file can also be used
3
- # for the self-hosted subdomain used in your CDN settings. Remove the optional directives section if necessary.
4
-
5
- # BEGIN Define Mime Types (in case /etc/mime.types is poorly configured or incorrect)
6
- <IfModule mod_mime.c>
7
- AddType application/x-javascript .js
8
- AddType application/x-shockwave-flash .swf
9
- AddType image/bmp .bmp
10
- AddType image/gif .gif
11
- AddType image/pjpeg .pjpeg
12
- AddType image/jpeg .jpeg
13
- AddType image/jpg .jpg
14
- AddType image/png .png
15
- AddType image/svg+xml .svg
16
- AddType image/tif .tif
17
- AddType image/tiff .tiff
18
- AddType image/x-icon .ico
19
- AddType text/css .css
20
- AddType text/htm .htm
21
- AddType text/html .html
22
- AddType text/plain .txt
23
- AddType text/xml .xml
24
- AddType text/xsd .xsd
25
- AddType text/xsl .xsl
26
- </IfModule>
27
- # END Define Mime Types
28
-
29
- # BEGIN HTTP Compression
30
- <IfModule mod_deflate.c>
31
- # Netscape 4.x has some problems...
32
- BrowserMatch ^Mozilla/4 gzip-only-text/html
33
- # Netscape 4.06-4.08 have some more problems
34
- BrowserMatch ^Mozilla/4\.0[678] no-gzip
35
- # MSIE masquerades as Netscape, but it is fine
36
- BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
37
- # NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
38
- # the above regex won't work. You can use the following
39
- # workaround to get the desired effect:
40
- BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
41
- # Don't compress media or scripts
42
- SetEnvIfNoCase Request_URI (?:bmp|gif|jpe?g|php|png|swf|tiff?)$ no-gzip dont-vary
43
- # Make sure proxies don't deliver the wrong content
44
- Header append Vary User-Agent env=!dont-vary
45
- # Fragment size to be compressed at one time by zlib
46
- #DeflateBufferSize 4096
47
- # Amount of compression applied to output
48
- #DeflateCompressionLevel 9
49
- # How much memory should be used by zlib for compression
50
- #DeflateMemLevel 9
51
- # Zlib compression window size
52
- #DeflateWindowSize 15
53
- # Enable HTTP Compression policy for all except .css, .js and .html documents
54
- SetOutputFilter DEFLATE
55
- AddOutputFilterByType DEFLATE text/css text/plain text/html text/xml text/xsd text/xsl application/x-javascript \
56
- \. application/wlwmanifest+xml image/svg+xml image/x-icon
57
- </IfModule>
58
- # END HTTP Compression
59
-
60
- # BEGIN Headers: Ensure browser caching of objects for 3 days
61
- # Set Expires header
62
- <IfModule mod_expires.c>
63
- ExpiresActive On
64
- ExpiresByType application/x-javascript A259200
65
- ExpiresByType application/x-shockwave-flash A259200
66
- ExpiresByType application/wlwmanifest+xml A259200
67
- ExpiresByType image/bmp A259200
68
- ExpiresByType image/gif A259200
69
- ExpiresByType image/pjpeg A259200
70
- ExpiresByType image/jpeg A259200
71
- ExpiresByType image/jpg A259200
72
- ExpiresByType image/png A259200
73
- ExpiresByType image/svg+xml A259200
74
- ExpiresByType image/tif A259200
75
- ExpiresByType image/tiff A259200
76
- ExpiresByType image/x-icon A259200
77
- ExpiresByType text/css A259200
78
- ExpiresByType text/htm A259200
79
- ExpiresByType text/html A259200
80
- ExpiresByType text/plain A259200
81
- ExpiresByType text/xml A259200
82
- ExpiresByType text/xsd A259200
83
- ExpiresByType text/xsl A259200
84
- </IfModule>
85
-
86
- <FilesMatch "\.(bmp|css|ico|html?|js|tiff?|gif|p?jpe?g|png|svgz?|swf|txt|xsd|xsl|xml)$">
87
- <IfModule mod_headers.c>
88
- # Set Pragma header
89
- Header set Pragma "public"
90
- # Set Cache-Control header
91
- Header append Cache-Control "public, must-revalidate, proxy-revalidate"
92
- </IfModule>
93
-
94
- # Set Entity Tag header
95
- FileETag MTime Size
96
- </FilesMatch>
97
- # END Headers: Ensure client-side caching of objects
98
-
99
- # BEGIN Optional Directives (if using a non-default permalink setting)
100
- <IfModule mod_rewrite.c>
101
- RewriteEngine On
102
- RewriteBase /
103
-
104
- # BEGIN Do not allow WordPress to process static objects
105
- RewriteCond %{REQUEST_FILENAME} !^.*\.bmp [NC]
106
- RewriteCond %{REQUEST_FILENAME} !^.*\.css [NC]
107
- RewriteCond %{REQUEST_FILENAME} !^.*\.gif [NC]
108
- RewriteCond %{REQUEST_FILENAME} !^.*\.html? [NC]
109
- RewriteCond %{REQUEST_FILENAME} !^.*\.js [NC]
110
- RewriteCond %{REQUEST_FILENAME} !^.*\.p?jpe?g [NC]
111
- RewriteCond %{REQUEST_FILENAME} !^.*\.png [NC]
112
- RewriteCond %{REQUEST_FILENAME} !^.*\.svgz? [NC]
113
- RewriteCond %{REQUEST_FILENAME} !^.*\.swf [NC]
114
- RewriteCond %{REQUEST_FILENAME} !^.*\.tiff? [NC]
115
- RewriteCond %{REQUEST_FILENAME} !^.*\.txt [NC]
116
- RewriteCond %{REQUEST_FILENAME} !^.*\.xsd [NC]
117
- RewriteCond %{REQUEST_FILENAME} !^.*\.xsl [NC]
118
- RewriteCond %{REQUEST_FILENAME} !^.*\.xml [NC]
119
- # END Do not allow WordPress to process static objects
120
-
121
- # Default WordPress Directives
122
- RewriteCond %{REQUEST_FILENAME} !-f
123
- RewriteCond %{REQUEST_FILENAME} !-d
124
- RewriteRule . /index.php [L]
125
- </IfModule>
126
- # END Optional Directives
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ini/apc.ini CHANGED
@@ -16,12 +16,12 @@ apc.mmap_file_mask = "/tmp/apc.XXXXXX"
16
  apc.slam_defense = 0
17
  apc.file_update_protection = 2
18
  apc.enable_cli = 0
19
- apc.max_file_size = 5M
20
  apc.stat = 1
21
  apc.write_lock = 1
22
  apc.report_autofilter = 0
23
  apc.include_once_override = 0
24
- ;apc.rfc1867 = 0
25
  ;apc.rfc1867_prefix = "upload_"
26
  ;apc.rfc1867_name = "APC_UPLOAD_PROGRESS"
27
  ;apc.rfc1867_freq = 0
16
  apc.slam_defense = 0
17
  apc.file_update_protection = 2
18
  apc.enable_cli = 0
19
+ apc.max_file_size = 10M
20
  apc.stat = 1
21
  apc.write_lock = 1
22
  apc.report_autofilter = 0
23
  apc.include_once_override = 0
24
+ ;apc.rfc1867 = 0
25
  ;apc.rfc1867_prefix = "upload_"
26
  ;apc.rfc1867_name = "APC_UPLOAD_PROGRESS"
27
  ;apc.rfc1867_freq = 0
ini/eaccelerator.ini CHANGED
@@ -22,4 +22,5 @@ eaccelerator.compress_level = 9
22
  eaccelerator.keys = shm
23
  eaccelerator.sessions = shm
24
  eaccelerator.content = shm
25
- eaccelerator.allowed_admin_path = "/var/www/html/controlpanel"
 
22
  eaccelerator.keys = shm
23
  eaccelerator.sessions = shm
24
  eaccelerator.content = shm
25
+ ; Insert path to document root below, then uncomment the line
26
+ ;eaccelerator.allowed_admin_path = "/var/www/domain.com/"
ini/xcache.ini CHANGED
@@ -18,7 +18,7 @@ xcache.count = 8
18
  xcache.slots = 8K
19
  xcache.ttl = 0
20
  xcache.gc_interval = 0
21
- xcache.var_size = 16M
22
  xcache.var_count = 1
23
  xcache.var_slots = 8K
24
  xcache.var_ttl = 0
18
  xcache.slots = 8K
19
  xcache.ttl = 0
20
  xcache.gc_interval = 0
21
+ xcache.var_size = 32M
22
  xcache.var_count = 1
23
  xcache.var_slots = 8K
24
  xcache.var_ttl = 0
lib/CF/cacert.pem ADDED
@@ -0,0 +1,3113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ##
2
+ ## cacert.pem-foo -- Bundle of CA Root Certificates
3
+ ##
4
+ ## Converted at: Sat Aug 23 21:39:56 2008 UTC
5
+ ##
6
+ ## This is a bundle of X.509 certificates of public Certificate Authorities
7
+ ## (CA). These were automatically extracted from Mozilla's root certificates
8
+ ## file (certdata.txt). This file can be found in the mozilla source tree:
9
+ ## '/mozilla/security/nss/lib/ckfw/builtins/certdata.txt'
10
+ ##
11
+ ## It contains the certificates in PEM format and therefore
12
+ ## can be directly used with curl / libcurl / php_curl, or with
13
+ ## an Apache+mod_ssl webserver for SSL client authentication.
14
+ ## Just configure this file as the SSLCACertificateFile.
15
+ ##
16
+
17
+ # ***** BEGIN LICENSE BLOCK *****
18
+ # Version: MPL 1.1/GPL 2.0/LGPL 2.1
19
+ #
20
+ # The contents of this file are subject to the Mozilla Public License Version
21
+ # 1.1 (the "License"); you may not use this file except in compliance with
22
+ # the License. You may obtain a copy of the License at
23
+ # http://www.mozilla.org/MPL/
24
+ #
25
+ # Software distributed under the License is distributed on an "AS IS" basis,
26
+ # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
27
+ # for the specific language governing rights and limitations under the
28
+ # License.
29
+ #
30
+ # The Original Code is the Netscape security libraries.
31
+ #
32
+ # The Initial Developer of the Original Code is
33
+ # Netscape Communications Corporation.
34
+ # Portions created by the Initial Developer are Copyright (C) 1994-2000
35
+ # the Initial Developer. All Rights Reserved.
36
+ #
37
+ # Contributor(s):
38
+ #
39
+ # Alternatively, the contents of this file may be used under the terms of
40
+ # either the GNU General Public License Version 2 or later (the "GPL"), or
41
+ # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
42
+ # in which case the provisions of the GPL or the LGPL are applicable instead
43
+ # of those above. If you wish to allow use of your version of this file only
44
+ # under the terms of either the GPL or the LGPL, and not to allow others to
45
+ # use your version of this file under the terms of the MPL, indicate your
46
+ # decision by deleting the provisions above and replace them with the notice
47
+ # and other provisions required by the GPL or the LGPL. If you do not delete
48
+ # the provisions above, a recipient may use your version of this file under
49
+ # the terms of any one of the MPL, the GPL or the LGPL.
50
+ #
51
+ # ***** END LICENSE BLOCK *****
52
+ # @(#) $RCSfile: certdata.txt,v $ $Revision: 1.49 $ $Date: 2008/08/14 18:15:56 $
53
+
54
+ Verisign/RSA Secure Server CA
55
+ =============================
56
+ -----BEGIN CERTIFICATE-----
57
+ MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
58
+ IDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2VydmVy
59
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVow
60
+ XzELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQL
61
+ EyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUA
62
+ A4GJADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII0haGN1Xp
63
+ sSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphIuR2nKRoTLkoRWZweFdVJ
64
+ VCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZIhvcNAQECBQADfgBl3X7hsuyw4jrg7HFG
65
+ mhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2
66
+ qUtN8iD3zV9/ZHuO3ABc1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
67
+ -----END CERTIFICATE-----
68
+
69
+ GTE CyberTrust Root CA
70
+ ======================
71
+ -----BEGIN CERTIFICATE-----
72
+ MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
73
+ Q29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRydXN0IFJvb3QwHhcNOTYwMjIzMjMwMTAw
74
+ WhcNMDYwMjIzMjM1OTAwWjBFMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9u
75
+ MRwwGgYDVQQDExNHVEUgQ3liZXJUcnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
76
+ gQC45k+625h8cXyvRLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8KDPufpz+iCWaEVh43KRuH
77
+ 6X4MypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPwKfWVWgkWYXcKIiXUT0Wqx73llt/51KiOQswk
78
+ wB6RJ0q1bQaAYznEol44AwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABKzdcZfHeFhVYAA1IFLezEP
79
+ I2PnPfMD+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWlIjeaY8JIILTbcuPI9tl8vrGvU9oUtCG4
80
+ 1tWW4/5ODFlitppK+ULdjG+BqXH/9ApybW1EDp3zdHSo1TRJ6V6e6bR64eVaH4QwnNOfpSXY
81
+ -----END CERTIFICATE-----
82
+
83
+ GTE CyberTrust Global Root
84
+ ==========================
85
+ -----BEGIN CERTIFICATE-----
86
+ MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
87
+ Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
88
+ A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
89
+ MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
90
+ Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
91
+ IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
92
+ sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
93
+ HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
94
+ AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
95
+ M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
96
+ NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
97
+ -----END CERTIFICATE-----
98
+
99
+ Thawte Personal Basic CA
100
+ ========================
101
+ -----BEGIN CERTIFICATE-----
102
+ MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkExFTATBgNVBAgT
103
+ DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3Vs
104
+ dGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMY
105
+ VGhhd3RlIFBlcnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0
106
+ aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpB
107
+ MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhh
108
+ d3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x
109
+ ITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZcGVyc29u
110
+ YWwtYmFzaWNAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+C
111
+ FeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJ
112
+ l+A1OFdKwPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7G1sY
113
+ 0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAt4plrsD16
114
+ iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7c8a914phXAPjLSeoF+CEhULcXpvG
115
+ t7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN
116
+ 92NWod8isQ==
117
+ -----END CERTIFICATE-----
118
+
119
+ Thawte Personal Premium CA
120
+ ==========================
121
+ -----BEGIN CERTIFICATE-----
122
+ MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkExFTATBgNVBAgT
123
+ DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3Vs
124
+ dGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMa
125
+ VGhhd3RlIFBlcnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1p
126
+ dW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQG
127
+ EwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoT
128
+ EVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlz
129
+ aW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3DQEJARYb
130
+ cGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJ
131
+ Ztn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ
132
+ 8/JE2dWIEt12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYDZicR
133
+ FTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBAUAA4GB
134
+ AGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIHb4Vnjt4rueIXsDqg8A6iAJrf8xQV
135
+ brvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBhKXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+W
136
+ jS9Q2wfD6h+rM+D1KzGJ
137
+ -----END CERTIFICATE-----
138
+
139
+ Thawte Personal Freemail CA
140
+ ===========================
141
+ -----BEGIN CERTIFICATE-----
142
+ MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkExFTATBgNVBAgT
143
+ DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3Vs
144
+ dGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMb
145
+ VGhhd3RlIFBlcnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVl
146
+ bWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNV
147
+ BAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE
148
+ ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
149
+ aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJ
150
+ ARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
151
+ gYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6W
152
+ ZBrCFG5ErHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgk
153
+ CGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF
154
+ AAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjPMPuoSpaKH2JCI4wXD/S6ZJwXrEcp
155
+ 352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK
156
+ /qarigd1iwzdUYRr5PjRzneigQ==
157
+ -----END CERTIFICATE-----
158
+
159
+ Thawte Server CA
160
+ ================
161
+ -----BEGIN CERTIFICATE-----
162
+ MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
163
+ DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
164
+ dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
165
+ AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
166
+ b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
167
+ BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
168
+ c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
169
+ A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
170
+ ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
171
+ /Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
172
+ 1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
173
+ MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
174
+ GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
175
+ GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
176
+ -----END CERTIFICATE-----
177
+
178
+ Thawte Premium Server CA
179
+ ========================
180
+ -----BEGIN CERTIFICATE-----
181
+ MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
182
+ DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
183
+ dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
184
+ AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
185
+ ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
186
+ AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
187
+ VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
188
+ aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
189
+ cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
190
+ aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
191
+ Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
192
+ qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
193
+ SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
194
+ 8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
195
+ UCemDaYj+bvLpgcUQg==
196
+ -----END CERTIFICATE-----
197
+
198
+ Equifax Secure CA
199
+ =================
200
+ -----BEGIN CERTIFICATE-----
201
+ MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
202
+ ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
203
+ MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
204
+ B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
205
+ nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
206
+ fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
207
+ 8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
208
+ A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
209
+ CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
210
+ A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
211
+ spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
212
+ Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
213
+ zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
214
+ BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
215
+ 70+sB3c4
216
+ -----END CERTIFICATE-----
217
+
218
+ ABAecom (sub., Am. Bankers Assn.) Root CA
219
+ =========================================
220
+ -----BEGIN CERTIFICATE-----
221
+ MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEFBQAwgYkxCzAJBgNV
222
+ BAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2FzaGluZ3RvbjEXMBUGA1UEChMOQUJBLkVD
223
+ T00sIElOQy4xGTAXBgNVBAMTEEFCQS5FQ09NIFJvb3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWlu
224
+ QGRpZ3NpZ3RydXN0LmNvbTAeFw05OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQswCQYD
225
+ VQQGEwJVUzELMAkGA1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24xFzAVBgNVBAoTDkFCQS5F
226
+ Q09NLCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBSb290IENBMSQwIgYJKoZIhvcNAQkBFhVhZG1p
227
+ bkBkaWdzaWd0cnVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx0xHgeVVD
228
+ BwhMywVCAOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM0KLMsFWWU4RmBQDaREmA2FQKpSWGlO1j
229
+ Vv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFGPR7wuSw0X4x8TAgpnUBV6zx9g9618PeKgw6hTLQ6pbNf
230
+ WiKX7BmbwQVo/ea3qZGULOR4SCQaJRk665WcOQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtx
231
+ A6k4ShZsiSrK2jMTecJVjO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU+/94
232
+ Qby9cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8CAQgwDQYJKoZI
233
+ hvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0kqS8Kfv2kRLD4VAe9G52dyntQJHsR
234
+ W0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvTZOirvRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJh
235
+ koHWG9YA8A6eKHegTYjHInYZw8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm
236
+ /lowdiT/QHI8eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgxfexgeqMiKL0ZJGA/
237
+ O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJTzFxiNmIf1Q=
238
+ -----END CERTIFICATE-----
239
+
240
+ Digital Signature Trust Co. Global CA 1
241
+ =======================================
242
+ -----BEGIN CERTIFICATE-----
243
+ MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
244
+ ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
245
+ MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
246
+ IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
247
+ A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
248
+ NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
249
+ o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
250
+ BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
251
+ dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
252
+ IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
253
+ MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
254
+ BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
255
+ ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
256
+ kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
257
+ RbyhkwS7hp86W0N6w4pl
258
+ -----END CERTIFICATE-----
259
+
260
+ Digital Signature Trust Co. Global CA 3
261
+ =======================================
262
+ -----BEGIN CERTIFICATE-----
263
+ MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
264
+ ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
265
+ MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
266
+ IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
267
+ A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
268
+ VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
269
+ xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
270
+ BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
271
+ dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
272
+ IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
273
+ MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
274
+ BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
275
+ AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
276
+ up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
277
+ mPnHfxsb1gYgAlihw6ID
278
+ -----END CERTIFICATE-----
279
+
280
+ Digital Signature Trust Co. Global CA 2
281
+ =======================================
282
+ -----BEGIN CERTIFICATE-----
283
+ MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGpMQswCQYDVQQGEwJ1
284
+ czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0
285
+ YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBS
286
+ b290Q0EgWDExITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDExODE4
287
+ NTVaFw0wODExMjgxODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UE
288
+ BxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjER
289
+ MA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0BCQEW
290
+ EmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANLGJrbn
291
+ pT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdfWvnTLnUv2Chi0ZMv/E3Uq4flCMeZ55I/db3rJbQVwZsZ
292
+ PdJEjdd0IG03Ao9pk1uKxBmd9LIO/BZsubEFkoPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGA
293
+ vqPYUrBEzUNKcI5YhZXhTizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F5X5y
294
+ P4WdlGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMvOnNn7pTKBBMFYgZw
295
+ I7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAojeyP2n714Z5
296
+ VEkxlTMr89EJFEliYIalsBHiUMIdBlc+LegzZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2
297
+ vAd5ZWRzfdd5ynvVWlHG4VMElo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX
298
+ 8ngvYzZAOONGDx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn86Oawde3uPclwx12q
299
+ gUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsTF7ANUkz+/m9c4pFuHf2kYtdo+o56T9II
300
+ 2pPc8JIRetDccpMMc5NihWjQ9A==
301
+ -----END CERTIFICATE-----
302
+
303
+ Digital Signature Trust Co. Global CA 4
304
+ =======================================
305
+ -----BEGIN CERTIFICATE-----
306
+ MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGpMQswCQYDVQQGEwJ1
307
+ czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0
308
+ YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBS
309
+ b290Q0EgWDIxITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAyMjQ2
310
+ MTZaFw0wODExMjcyMjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UE
311
+ BxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjER
312
+ MA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0BCQEW
313
+ EmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANx18IzA
314
+ dZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbVp9oaBBg5kkp4o4HC9Xd6ULRw/5qrxsfKboNPQpj7Jgva
315
+ 3G3WqZlVUmfpKAOS3OWwBZoPFflrWXJW8vo5/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9
316
+ kVySVGkl5WJp3OXuAFK9MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi3sOP
317
+ 17ihYqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+QVCvbK4iNC7Va26D
318
+ unm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAtTYOXeFhKFoR
319
+ ZcA/gwN5Tb4opgsHAlKFzfiR0BBstWogWxyQ2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT
320
+ 4EOvkTvRyyzYdFQ6HE3K1GjNI3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV
321
+ 6YyDfFk/xPEL553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8PzGn0EdzMzkbzE5q
322
+ 10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30sPDst2yC7S8xmUJMqbINuBVd8d+6ybVK
323
+ 1GSYsyapMMj9puyrliGtf8J4tg==
324
+ -----END CERTIFICATE-----
325
+
326
+ Verisign Class 1 Public Primary Certification Authority
327
+ =======================================================
328
+ -----BEGIN CERTIFICATE-----
329
+ MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJBgNVBAYTAlVT
330
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
331
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTla
332
+ MF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3Mg
333
+ MSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEF
334
+ AAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0NH8xlbgyw
335
+ 0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR4k5FVmkfeAKA2txHkSm7
336
+ NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATANBgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf
337
+ 7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZoEWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnx
338
+ giJduLHdgSOjeyUVRjB5FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0A
339
+ NACY89FxlA==
340
+ -----END CERTIFICATE-----
341
+
342
+ Verisign Class 2 Public Primary Certification Authority
343
+ =======================================================
344
+ -----BEGIN CERTIFICATE-----
345
+ MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
346
+ FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmltYXJ5
347
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
348
+ XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAy
349
+ IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
350
+ A4GNADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyhYGt+eSz6
351
+ Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7FYCTXOvnzAhsPz6zSvz/
352
+ S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBAIobK/o5wXTX
353
+ XtgZZKJYSi034DNHD6zt96rbHuSLBlxgJ8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUY
354
+ YAS/QoD90KioHgE796Ncr6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2
355
+ lw0Xd8rY
356
+ -----END CERTIFICATE-----
357
+
358
+ Verisign Class 3 Public Primary Certification Authority
359
+ =======================================================
360
+ -----BEGIN CERTIFICATE-----
361
+ MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
362
+ FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
363
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
364
+ XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
365
+ IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
366
+ A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
367
+ f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
368
+ hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
369
+ TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
370
+ WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
371
+ Tqj/ZA1k
372
+ -----END CERTIFICATE-----
373
+
374
+ Verisign Class 1 Public Primary Certification Authority - G2
375
+ ============================================================
376
+ -----BEGIN CERTIFICATE-----
377
+ MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
378
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
379
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
380
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
381
+ dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
382
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
383
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
384
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
385
+ dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd
386
+ k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq
387
+ WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB
388
+ MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM
389
+ XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC
390
+ lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ
391
+ -----END CERTIFICATE-----
392
+
393
+ Verisign Class 2 Public Primary Certification Authority - G2
394
+ ============================================================
395
+ -----BEGIN CERTIFICATE-----
396
+ MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV
397
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
398
+ cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
399
+ Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
400
+ c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV
401
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
402
+ cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
403
+ Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
404
+ c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx
405
+ nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC
406
+ wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA
407
+ ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK
408
+ 1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk
409
+ LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg==
410
+ -----END CERTIFICATE-----
411
+
412
+ Verisign Class 3 Public Primary Certification Authority - G2
413
+ ============================================================
414
+ -----BEGIN CERTIFICATE-----
415
+ MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
416
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
417
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
418
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
419
+ dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
420
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
421
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
422
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
423
+ dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
424
+ FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
425
+ lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
426
+ MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
427
+ 1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
428
+ Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
429
+ -----END CERTIFICATE-----
430
+
431
+ Verisign Class 4 Public Primary Certification Authority - G2
432
+ ============================================================
433
+ -----BEGIN CERTIFICATE-----
434
+ MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
435
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy
436
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
437
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
438
+ dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
439
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFy
440
+ eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
441
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
442
+ dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4
443
+ xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDH
444
+ qGKB3FtKqsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQAB
445
+ MA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGIL4LcY/oCRaxF
446
+ WdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0ycyfYaT5DdPauxYma51N86Xv2S/PB
447
+ ZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRPT8qAkbYp
448
+ -----END CERTIFICATE-----
449
+
450
+ GlobalSign Root CA
451
+ ==================
452
+ -----BEGIN CERTIFICATE-----
453
+ MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
454
+ GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
455
+ b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
456
+ BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
457
+ VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
458
+ DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
459
+ THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
460
+ Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
461
+ c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
462
+ gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
463
+ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
464
+ AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
465
+ Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
466
+ j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
467
+ hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
468
+ X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
469
+ -----END CERTIFICATE-----
470
+
471
+ GlobalSign Root CA - R2
472
+ =======================
473
+ -----BEGIN CERTIFICATE-----
474
+ MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
475
+ YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
476
+ bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
477
+ aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
478
+ bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
479
+ ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
480
+ s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
481
+ S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
482
+ TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
483
+ ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
484
+ FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
485
+ YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
486
+ BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
487
+ 9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
488
+ 01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
489
+ 9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
490
+ TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
491
+ -----END CERTIFICATE-----
492
+
493
+ ValiCert Class 1 VA
494
+ ===================
495
+ -----BEGIN CERTIFICATE-----
496
+ MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
497
+ b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
498
+ YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
499
+ bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
500
+ MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
501
+ d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
502
+ UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
503
+ LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
504
+ A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
505
+ GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
506
+ DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
507
+ lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
508
+ icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
509
+ Orf1LXLI
510
+ -----END CERTIFICATE-----
511
+
512
+ ValiCert Class 2 VA
513
+ ===================
514
+ -----BEGIN CERTIFICATE-----
515
+ MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
516
+ b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
517
+ YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
518
+ bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
519
+ MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
520
+ d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
521
+ UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
522
+ LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
523
+ A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
524
+ CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
525
+ ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
526
+ SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
527
+ UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
528
+ W9ViH0Pd
529
+ -----END CERTIFICATE-----
530
+
531
+ RSA Root Certificate 1
532
+ ======================
533
+ -----BEGIN CERTIFICATE-----
534
+ MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
535
+ b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
536
+ YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
537
+ bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
538
+ MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
539
+ d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
540
+ UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
541
+ LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
542
+ A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
543
+ 3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
544
+ BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
545
+ 3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
546
+ V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
547
+ on+jjBXu
548
+ -----END CERTIFICATE-----
549
+
550
+ Verisign Class 1 Public Primary Certification Authority - G3
551
+ ============================================================
552
+ -----BEGIN CERTIFICATE-----
553
+ MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
554
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
555
+ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
556
+ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
557
+ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
558
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
559
+ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
560
+ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg
561
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
562
+ ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E
563
+ bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ
564
+ rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+
565
+ Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB
566
+ FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
567
+ q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N
568
+ y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
569
+ ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h
570
+ a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc
571
+ D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
572
+ -----END CERTIFICATE-----
573
+
574
+ Verisign Class 2 Public Primary Certification Authority - G3
575
+ ============================================================
576
+ -----BEGIN CERTIFICATE-----
577
+ MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT
578
+ MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y
579
+ azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug
580
+ b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0
581
+ aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ
582
+ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
583
+ c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
584
+ aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD
585
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
586
+ AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6
587
+ tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7
588
+ C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS
589
+ 0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs
590
+ Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0
591
+ JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf
592
+ 0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
593
+ sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx
594
+ JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j
595
+ GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
596
+ -----END CERTIFICATE-----
597
+
598
+ Verisign Class 3 Public Primary Certification Authority - G3
599
+ ============================================================
600
+ -----BEGIN CERTIFICATE-----
601
+ MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
602
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
603
+ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
604
+ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
605
+ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
606
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
607
+ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
608
+ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
609
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
610
+ ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
611
+ EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
612
+ cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
613
+ EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
614
+ 055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
615
+ ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
616
+ j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
617
+ /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
618
+ xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
619
+ t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
620
+ -----END CERTIFICATE-----
621
+
622
+ Verisign Class 4 Public Primary Certification Authority - G3
623
+ ============================================================
624
+ -----BEGIN CERTIFICATE-----
625
+ MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
626
+ UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
627
+ cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
628
+ IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
629
+ dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
630
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
631
+ dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
632
+ cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
633
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
634
+ ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
635
+ tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
636
+ 8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
637
+ Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
638
+ Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
639
+ j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
640
+ mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
641
+ fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
642
+ RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
643
+ UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
644
+ -----END CERTIFICATE-----
645
+
646
+ Entrust.net Secure Server CA
647
+ ============================
648
+ -----BEGIN CERTIFICATE-----
649
+ MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
650
+ BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
651
+ cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
652
+ ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
653
+ cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
654
+ A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
655
+ eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
656
+ dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
657
+ aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
658
+ aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
659
+ gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
660
+ ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
661
+ CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
662
+ dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
663
+ bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
664
+ cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
665
+ dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
666
+ NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
667
+ HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
668
+ BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
669
+ Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
670
+ n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
671
+ -----END CERTIFICATE-----
672
+
673
+ Entrust.net Secure Personal CA
674
+ ==============================
675
+ -----BEGIN CERTIFICATE-----
676
+ MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMCVVMxFDASBgNV
677
+ BAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8v
678
+ Q1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1
679
+ c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9u
680
+ IEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJV
681
+ UzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRf
682
+ Q0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5
683
+ OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRp
684
+ ZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdv
685
+ kHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGp
686
+ OZ5V+Pux5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTm
687
+ T173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkwggEVMIHkoIHh
688
+ oIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3
689
+ dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBs
690
+ aWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50
691
+ cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg
692
+ KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNVHRAEJDAigA8x
693
+ OTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU
694
+ xPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1Ud
695
+ EwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K
696
+ 8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6h
697
+ URzzwy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYG
698
+ JqibGapEPHayXOw=
699
+ -----END CERTIFICATE-----
700
+
701
+ Entrust.net Premium 2048 Secure Server CA
702
+ =========================================
703
+ -----BEGIN CERTIFICATE-----
704
+ MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
705
+ ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
706
+ bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
707
+ BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
708
+ NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
709
+ d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
710
+ MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
711
+ ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
712
+ MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
713
+ Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
714
+ hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
715
+ nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
716
+ VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
717
+ AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
718
+ gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
719
+ AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
720
+ oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
721
+ o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
722
+ 2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
723
+ OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
724
+ -----END CERTIFICATE-----
725
+
726
+ Baltimore CyberTrust Root
727
+ =========================
728
+ -----BEGIN CERTIFICATE-----
729
+ MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
730
+ ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
731
+ ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
732
+ SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
733
+ dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
734
+ uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
735
+ UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
736
+ G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
737
+ XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
738
+ l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
739
+ VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
740
+ BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
741
+ cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
742
+ hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
743
+ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
744
+ RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
745
+ -----END CERTIFICATE-----
746
+
747
+ Equifax Secure Global eBusiness CA
748
+ ==================================
749
+ -----BEGIN CERTIFICATE-----
750
+ MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
751
+ RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
752
+ bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
753
+ HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
754
+ b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
755
+ PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
756
+ qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
757
+ hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
758
+ BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
759
+ MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
760
+ I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
761
+ NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
762
+ -----END CERTIFICATE-----
763
+
764
+ Equifax Secure eBusiness CA 1
765
+ =============================
766
+ -----BEGIN CERTIFICATE-----
767
+ MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
768
+ RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
769
+ LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
770
+ ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
771
+ IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
772
+ 1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
773
+ IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
774
+ MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
775
+ Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
776
+ AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
777
+ lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
778
+ KpYrtWKmpj29f5JZzVoqgrI3eQ==
779
+ -----END CERTIFICATE-----
780
+
781
+ Equifax Secure eBusiness CA 2
782
+ =============================
783
+ -----BEGIN CERTIFICATE-----
784
+ MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
785
+ ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
786
+ MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
787
+ DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
788
+ nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
789
+ 2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
790
+ BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
791
+ A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
792
+ JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
793
+ A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
794
+ uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
795
+ Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
796
+ jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
797
+ 78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
798
+ V+GRMOrN
799
+ -----END CERTIFICATE-----
800
+
801
+ Visa International Global Root 2
802
+ ================================
803
+ -----BEGIN CERTIFICATE-----
804
+ MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMxDTALBgNVBAoT
805
+ BFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2aWNlIEFzc29jaWF0aW9uMRIw
806
+ EAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYD
807
+ VQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZp
808
+ Y2UgQXNzb2NpYXRpb24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEP
809
+ ADCCAQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdXZFwgBuHW
810
+ 73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i/SN8RnNPflRzHqgsVVh1
811
+ t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU58fy+pmjIlC++QU3o63tmsPm7Igbthkn
812
+ GziLgE3sucfFicv8GjLtI/C1AVj59o/ghalMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhl
813
+ V7or7zaMavrZ2UT0qt2E1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYE
814
+ FJ59SzS/ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0G
815
+ CSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHbmQdpNSYx/scuhMKZ
816
+ YdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQkIqUs38oW26sTTMs7WXcFsziza6k
817
+ PWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhNdBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOe
818
+ yti12HvOdUVmB/RtLdh6yumJivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8
819
+ ofyrEK9ca3CnB+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G
820
+ -----END CERTIFICATE-----
821
+
822
+ beTRUSTed Root CA
823
+ =================
824
+ -----BEGIN CERTIFICATE-----
825
+ MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJXVzESMBAGA1UE
826
+ ChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQgUm9vdCBDQXMxGjAYBgNVBAMTEWJlVFJV
827
+ U1RlZCBSb290IENBMB4XDTAwMDYyMDE0MjEwNFoXDTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMC
828
+ V1cxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRowGAYD
829
+ VQQDExFiZVRSVVNUZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANS0
830
+ c3oTCjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4SP+00PpeQY1hRIfo7clY+vyTmt9P6j41ffgz
831
+ eubx181vSUs9Ty1uDoM6GHh3o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwMjmVZxXH/YgmPqsWPzGCg
832
+ c0rXOD8Vcr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX2P8ZDoMbjNx4RWc0PfSvHI3kbWvtILNn
833
+ mrRhyxdviTX/507AMhLn7uzf/5cwdO2NR47rtMNE5qdMf1ZD6Li8tr76g5fmu/vEtpO+GRg+jIG5
834
+ c4gW9JZDnGdzF5DYCW5jrEq2I8QBoa2k5MUCAwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8w
835
+ ggFZBgNVHSAEggFQMIIBTDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQagfFS
836
+ ZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFu
837
+ Y2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBv
838
+ ZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJl
839
+ IGZvdW5kIGF0IGJlVFJVU1RlZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29t
840
+ L3ZhdWx0L3Rlcm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0
841
+ L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYDVQQKEwliZVRSVVNUZWQxCzAJBgNVBAYT
842
+ AldXMB0GA1UdDgQWBBQquZtpLjub2M3eKjEENGvKBxirZzAfBgNVHSMEGDAWgBQquZtpLjub2M3e
843
+ KjEENGvKBxirZzAOBgNVHQ8BAf8EBAMCAf4wDQYJKoZIhvcNAQEFBQADggEBAHlh26Nebhax6nZR
844
+ +csVm8tpvuaBa58oH2U+3RGFktToQb9+M70j5/Egv6S0phkBxoyNNXxlpE8JpNbYIxUFE6dDea/b
845
+ ow6be3ga8wSGWsb2jCBHOElQBp1yZzrwmAOtlmdE/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ
846
+ 1gMe1lMBzW1MaFVA4e5rxyoAAEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5mlWXKWWu
847
+ GVUlBXJH0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYctmBjRYoQtLpGEK5BV2Vs
848
+ PyMQPyEQWbfkQN0mDCP2qq4=
849
+ -----END CERTIFICATE-----
850
+
851
+ AddTrust Low-Value Services Root
852
+ ================================
853
+ -----BEGIN CERTIFICATE-----
854
+ MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
855
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
856
+ cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
857
+ CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
858
+ ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
859
+ AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
860
+ 54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
861
+ oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
862
+ Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
863
+ GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
864
+ HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
865
+ AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
866
+ RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
867
+ HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
868
+ ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
869
+ iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
870
+ eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
871
+ mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
872
+ ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
873
+ -----END CERTIFICATE-----
874
+
875
+ AddTrust External Root
876
+ ======================
877
+ -----BEGIN CERTIFICATE-----
878
+ MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
879
+ QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
880
+ VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
881
+ NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
882
+ cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
883
+ Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
884
+ +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
885
+ Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
886
+ aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
887
+ 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
888
+ 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
889
+ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
890
+ VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
891
+ VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
892
+ IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
893
+ j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
894
+ 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
895
+ e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
896
+ G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
897
+ -----END CERTIFICATE-----
898
+
899
+ AddTrust Public Services Root
900
+ =============================
901
+ -----BEGIN CERTIFICATE-----
902
+ MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
903
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
904
+ cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
905
+ BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
906
+ dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
907
+ AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
908
+ nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
909
+ d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
910
+ Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
911
+ HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
912
+ A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
913
+ /zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
914
+ FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
915
+ A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
916
+ JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
917
+ +YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
918
+ GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
919
+ Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
920
+ EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
921
+ -----END CERTIFICATE-----
922
+
923
+ AddTrust Qualified Certificates Root
924
+ ====================================
925
+ -----BEGIN CERTIFICATE-----
926
+ MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
927
+ QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
928
+ cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
929
+ CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
930
+ IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
931
+ 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
932
+ 64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
933
+ KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
934
+ L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
935
+ wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
936
+ MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
937
+ BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
938
+ BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
939
+ azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
940
+ ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
941
+ GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
942
+ dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
943
+ RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
944
+ iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
945
+ -----END CERTIFICATE-----
946
+
947
+ Verisign Time Stamping Authority CA
948
+ ===================================
949
+ -----BEGIN CERTIFICATE-----
950
+ MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUFADCBwTELMAkGA1UE
951
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQLEzNDbGFzcyAzIFB1YmxpYyBQ
952
+ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZl
953
+ cmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWdu
954
+ IFRydXN0IE5ldHdvcmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1OTU5WjCBpTEXMBUGA1UE
955
+ ChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNV
956
+ BAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTAwMSww
957
+ KgYDVQQDEyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1dGhvcml0eSBDQTCBnzANBgkqhkiG9w0B
958
+ AQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVlizrQJIkRpivglWtvtDbc2fk7gu5Q+kCWHwmFHKdm9VLhj
959
+ zCx9abQzNvQ3B5rB3UBU/OB4naCTuQk9I1F/RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6o
960
+ v8uQjI11S7zi6ESHzeZBCiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/AgEA
961
+ MEUGA1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZl
962
+ cmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0cDovL2NybC52ZXJpc2lnbi5jb20v
963
+ cGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIGCCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRw
964
+ Oi8vb2NzcC52ZXJpc2lnbi5jb20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2
965
+ DcIBcBlK0lRWHqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQnKeg3S/LvRJdrF1Ea
966
+ w1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937ntag+RaypJXUie28/sJyU58dzq6wf7iWb
967
+ wBbtt8pb8BQ=
968
+ -----END CERTIFICATE-----
969
+
970
+ Thawte Time Stamping CA
971
+ =======================
972
+ -----BEGIN CERTIFICATE-----
973
+ MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkExFTATBgNVBAgT
974
+ DFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG
975
+ A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcg
976
+ Q0EwHhcNOTcwMTAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNV
977
+ BAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEd
978
+ MBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBp
979
+ bmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+o
980
+ J9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR5zDWQQD9
981
+ nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzAR
982
+ MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCo
983
+ uqoEiYbC9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQpgCe
984
+ d/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZCayJSdM=
985
+ -----END CERTIFICATE-----
986
+
987
+ Entrust.net Global Secure Server CA
988
+ ===================================
989
+ -----BEGIN CERTIFICATE-----
990
+ MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChMLRW50cnVzdC5u
991
+ ZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGluY29ycC4gYnkgcmVmLiAobGlt
992
+ aXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE
993
+ AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0w
994
+ MDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0G
995
+ A1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh
996
+ Yi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRy
997
+ dXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3
998
+ DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55l
999
+ xyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439P
1000
+ mrkDQYC2dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEB
1001
+ BAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0VudHJ1c3QubmV0
1002
+ MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0
1003
+ cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMT
1004
+ MUVudHJ1c3QubmV0IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV
1005
+ BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD
1006
+ VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr
1007
+ 47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w
1008
+ AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbv
1009
+ H9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3
1010
+ a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw==
1011
+ -----END CERTIFICATE-----
1012
+
1013
+ Entrust.net Global Secure Personal CA
1014
+ =====================================
1015
+ -----BEGIN CERTIFICATE-----
1016
+ MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
1017
+ ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxp
1018
+ bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
1019
+ BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcx
1020
+ NjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
1021
+ d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
1022
+ MCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
1023
+ ZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
1024
+ iQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQl
1025
+ hK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKkl
1026
+ Wb1m9fkn5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNV
1027
+ HR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAwPgYDVQQLFDd3
1028
+ d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUw
1029
+ IwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5l
1030
+ dCBDbGllbnQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
1031
+ IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
1032
+ MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAM
1033
+ BgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQF
1034
+ AAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xK
1035
+ p9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQ
1036
+ Gof4T4HHdguEOnKdzmVml64mXg==
1037
+ -----END CERTIFICATE-----
1038
+
1039
+ Entrust Root Certification Authority
1040
+ ====================================
1041
+ -----BEGIN CERTIFICATE-----
1042
+ MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
1043
+ BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
1044
+ b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
1045
+ A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
1046
+ MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
1047
+ MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
1048
+ Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
1049
+ dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
1050
+ ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
1051
+ A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
1052
+ Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
1053
+ j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
1054
+ rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
1055
+ DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
1056
+ MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
1057
+ hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
1058
+ A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
1059
+ Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
1060
+ v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
1061
+ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
1062
+ tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
1063
+ -----END CERTIFICATE-----
1064
+
1065
+ AOL Time Warner Root Certification Authority 1
1066
+ ==============================================
1067
+ -----BEGIN CERTIFICATE-----
1068
+ MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMxHTAbBgNVBAoT
1069
+ FEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNhIE9ubGluZSBJbmMuMTcwNQYD
1070
+ VQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAy
1071
+ MDUyOTA2MDAwMFoXDTM3MTEyMDE1MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wg
1072
+ VGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMu
1073
+ QU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZI
1074
+ hvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U0pPlLYnKhHw/EEMbjIt8
1075
+ hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItITuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkG
1076
+ IBKOQuHfD5YQUqjPnF+VFNivO3ULMSAfRC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93
1077
+ f7DKeHEMXRZxcKLXwjqFzQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQI
1078
+ fHNlIAqhBC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEAAaNj
1079
+ MGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jYPXy+XxIwHwYDVR0j
1080
+ BBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUA
1081
+ A4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u
1082
+ 0FIy2VkyvNp5ctZ7CegCgTXTCt8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77Bf
1083
+ WgDrvq2g+EQFZ7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX
1084
+ n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoWH1iCC+GWaQVL
1085
+ juyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S
1086
+ -----END CERTIFICATE-----
1087
+
1088
+ AOL Time Warner Root Certification Authority 2
1089
+ ==============================================
1090
+ -----BEGIN CERTIFICATE-----
1091
+ MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMxHTAbBgNVBAoT
1092
+ FEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNhIE9ubGluZSBJbmMuMTcwNQYD
1093
+ VQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAy
1094
+ MDUyOTA2MDAwMFoXDTM3MDkyODIzNDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wg
1095
+ VGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMu
1096
+ QU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZI
1097
+ hvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ7ouZzU9AhqS2TcnZsdw8
1098
+ TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilbm2BPJoPRYxJWSXakFsKlnUWsi4SVqBax
1099
+ 7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOYxFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17n
1100
+ OirYlxcwfACtCJ0zr7iZYYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2w
1101
+ TPDaRrbqJS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fxI2rS
1102
+ AG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETzkxmlJ85per5n0/xQ
1103
+ pCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFhEVsVS6kkUfykXPcXnbDS+gfpj1bk
1104
+ GoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/SBtc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuW
1105
+ CpTehTacyH+BCQJJKg71ZDIMgtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1Ex
1106
+ MVCgyhwn2RAurda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
1107
+ FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO1b+pxCAoMA4G
1108
+ A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyuguh4X7ZVnnrREUpVe8WJ8kEle7
1109
+ +z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdPyXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI
1110
+ 5Rq8NEQh3q0l/HYWdyGQgJhXnU7q7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcC
1111
+ tQVBynlQboIOcXKTRuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ
1112
+ 68W/ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyBM5kYJRF3
1113
+ p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQmy8YJPamTQr5O8t1wswv
1114
+ ziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xOAU++CrYD062KRffaJ00psUjf5BHklka9
1115
+ bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4o
1116
+ GKQWDzH9OmwjkyB24f0HhdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2
1117
+ uBOLZ8/5fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg=
1118
+ -----END CERTIFICATE-----
1119
+
1120
+ beTRUSTed Root CA-Baltimore Implementation
1121
+ ==========================================
1122
+ -----BEGIN CERTIFICATE-----
1123
+ MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwliZVRSVVNUZWQx
1124
+ GzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0Et
1125
+ QmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAyMDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVow
1126
+ ZjESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNV
1127
+ BAMTKmJlVFJVU1RlZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZI
1128
+ hvcNAQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i805qX4QQ
1129
+ +2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6l2Qijvj/YaOcGx6Sj8Co
1130
+ Cd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92BFODEPM2dMPgwqZfT7syj0B9fHBOB1Bir
1131
+ lNFjw55/NZKeX0Tq7PQiXLfoPX2k+YmpkbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNe
1132
+ DsYq0ATdcT0gTlgn/FP7eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOC
1133
+ Ah4wggIaMA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4AAAEJ
1134
+ KIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3IgdXNlIG9mIHRoaXMg
1135
+ Q2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVudCBhbmQgYWNjZXB0YW5jZSBvZiB0
1136
+ aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwg
1137
+ dGhlIENlcnRpZmljYXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0
1138
+ eSBBZ3JlZW1lbnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl
1139
+ LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDBB
1140
+ BggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2lu
1141
+ ZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgccxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR
1142
+ 3D8kVpgccxiIav+DR+22MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6s
1143
+ vfoNyYt5hhwjdrCAWXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyX
1144
+ EHu67RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AYgkHNZTfq
1145
+ jjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb4cV97yHgjQ5dUX2xZ/2j
1146
+ vTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9CReJf8Py05yc493EG931t3GzUwWJBtDL
1147
+ SoDByFOQtTwxiBdQn8nEDovYqAJjDQ==
1148
+ -----END CERTIFICATE-----
1149
+
1150
+ beTRUSTed Root CA - Entrust Implementation
1151
+ ==========================================
1152
+ -----BEGIN CERTIFICATE-----
1153
+ MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwliZVRSVVNUZWQx
1154
+ GzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0Eg
1155
+ LSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAyMDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1ow
1156
+ ZjESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNV
1157
+ BAMTKmJlVFJVU1RlZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZI
1158
+ hvcNAQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtOK2/b9a0c
1159
+ S12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtDd5eHI8XbQ6P1KqNRXuE7
1160
+ 0mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdjDheT389Lrm5zdeDzqrmkwAkbhepxKYhB
1161
+ MvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCeyv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1i
1162
+ JAzqHHVOwBLkuhMdMCktVjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOC
1163
+ AwUwggMBMIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYIKwYB
1164
+ BQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNyZWF0
1165
+ ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
1166
+ ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9u
1167
+ IFByYWN0aWNlIFN0YXRlbWVudCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGlj
1168
+ aCBjYW4gYmUgZm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0
1169
+ cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUFBwIBFjZodHRw
1170
+ czovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwEQYJYIZI
1171
+ AYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHugeaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEb
1172
+ MBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAt
1173
+ IEVudHJ1c3QgSW1wbGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0
1174
+ MTEwODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFH1w5a44
1175
+ iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQwqoSEFjAMBgNVHRMEBTAD
1176
+ AQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEAKrgX
1177
+ zh8QlOu4mre5X+za95IkrNySO8cgjfKZ5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevd
1178
+ kObRVlTa4y0MnxEylCIBevZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/
1179
+ T220Y/ozADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2kXgCl
1180
+ zMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYhxKlkqu9FNtEaZnz4
1181
+ 6TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w==
1182
+ -----END CERTIFICATE-----
1183
+
1184
+ beTRUSTed Root CA - RSA Implementation
1185
+ ======================================
1186
+ -----BEGIN CERTIFICATE-----
1187
+ MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBiMRIwEAYDVQQK
1188
+ EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMmYmVUUlVT
1189
+ VGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEy
1190
+ MTEwNzI1WjBiMRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB
1191
+ czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0G
1192
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILnHGhwhRuj
1193
+ brWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I1DpAa5LxmZZk3tv/ePTu
1194
+ lh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPktPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xs
1195
+ N+lFrYWMU8NghpBKlsmzVLC7F/AcRdnUGxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQh
1196
+ hlkwk75TMzf270HPM8ercmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMB
1197
+ AAGjggIYMIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+AAAD
1198
+ CSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNf
1199
+ c2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIBOhqCATZSZWxpYW5jZSBvbiBvciB1
1200
+ c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVhdGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2Nl
1201
+ cHRhbmNlIG9mIHRoZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlv
1202
+ bnMgb2YgdXNlLCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS
1203
+ ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRoZSBiZVRSVVNU
1204
+ ZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9p
1205
+ bmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAd
1206
+ BgNVHQ4EFgQUqewUfvnZQ8xTKxStz/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTB
1207
+ mMpWBcCorSZIry0g6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05
1208
+ pmuKmET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbdLrML3kqN
1209
+ Wz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28BbJ1zTcwfBwvNMm2+fG8oe
1210
+ qqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3SK41ty8ymmFei74pnykkiFY5LKjSq5YD
1211
+ WtRIn7lAhAuYaPsBQ9Yb4gmxlxw=
1212
+ -----END CERTIFICATE-----
1213
+
1214
+ RSA Security 2048 v3
1215
+ ====================
1216
+ -----BEGIN CERTIFICATE-----
1217
+ MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
1218
+ ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
1219
+ MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
1220
+ BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
1221
+ AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
1222
+ Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
1223
+ WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
1224
+ KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
1225
+ +Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
1226
+ MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
1227
+ FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
1228
+ v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
1229
+ 0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
1230
+ VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
1231
+ nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
1232
+ pKnXwiJPZ9d37CAFYd4=
1233
+ -----END CERTIFICATE-----
1234
+
1235
+ RSA Security 1024 v3
1236
+ ====================
1237
+ -----BEGIN CERTIFICATE-----
1238
+ MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
1239
+ ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMTAyNCBWMzAeFw0wMTAy
1240
+ MjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
1241
+ BgNVBAsTFFJTQSBTZWN1cml0eSAxMDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV
1242
+ 3f5mCc8kPD6ugU5OisRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4m
1243
+ mdxY78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9zp9+1Blq
1244
+ FikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAf
1245
+ BgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAdBgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUM
1246
+ X96uBVowDQYJKoZIhvcNAQEFBQADgYEAPy1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBD
1247
+ leMf6XbN3Ou8k6BlCsdNT1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNu
1248
+ mU4/iXgDmMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E=
1249
+ -----END CERTIFICATE-----
1250
+
1251
+ GeoTrust Global CA
1252
+ ==================
1253
+ -----BEGIN CERTIFICATE-----
1254
+ MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
1255
+ Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
1256
+ MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
1257
+ LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
1258
+ CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
1259
+ BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
1260
+ 8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
1261
+ T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
1262
+ vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
1263
+ AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
1264
+ DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
1265
+ zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
1266
+ d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
1267
+ mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
1268
+ XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
1269
+ Mw==
1270
+ -----END CERTIFICATE-----
1271
+
1272
+ GeoTrust Global CA 2
1273
+ ====================
1274
+ -----BEGIN CERTIFICATE-----
1275
+ MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
1276
+ R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
1277
+ MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
1278
+ LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
1279
+ ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
1280
+ NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
1281
+ LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
1282
+ Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
1283
+ HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
1284
+ MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
1285
+ K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
1286
+ srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
1287
+ ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
1288
+ OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
1289
+ x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
1290
+ H4z1Ir+rzoPz4iIprn2DQKi6bA==
1291
+ -----END CERTIFICATE-----
1292
+
1293
+ GeoTrust Universal CA
1294
+ =====================
1295
+ -----BEGIN CERTIFICATE-----
1296
+ MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
1297
+ R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
1298
+ MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
1299
+ Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
1300
+ ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
1301
+ JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
1302
+ RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
1303
+ 7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
1304
+ 8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
1305
+ qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
1306
+ Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
1307
+ Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
1308
+ KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
1309
+ ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
1310
+ XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
1311
+ hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
1312
+ aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
1313
+ qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
1314
+ oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
1315
+ xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
1316
+ KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
1317
+ DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
1318
+ xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
1319
+ p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
1320
+ P/rmMuGNG2+k5o7Y+SlIis5z/iw=
1321
+ -----END CERTIFICATE-----
1322
+
1323
+ GeoTrust Universal CA 2
1324
+ =======================
1325
+ -----BEGIN CERTIFICATE-----
1326
+ MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
1327
+ R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
1328
+ MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
1329
+ SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
1330
+ A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
1331
+ DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
1332
+ j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
1333
+ JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
1334
+ QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
1335
+ WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
1336
+ 20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
1337
+ ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
1338
+ SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
1339
+ 8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
1340
+ +/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
1341
+ BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
1342
+ dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
1343
+ 4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
1344
+ mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
1345
+ A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
1346
+ Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
1347
+ pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
1348
+ FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
1349
+ gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
1350
+ X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
1351
+ -----END CERTIFICATE-----
1352
+
1353
+ UTN-USER First-Network Applications
1354
+ ===================================
1355
+ -----BEGIN CERTIFICATE-----
1356
+ MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE
1357
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
1358
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp
1359
+ BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5
1360
+ WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T
1361
+ YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
1362
+ dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB
1363
+ cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug
1364
+ mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj
1365
+ DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu
1366
+ Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi
1367
+ P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE
1368
+ j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w
1369
+ HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j
1370
+ cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G
1371
+ CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y
1372
+ IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK
1373
+ RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp
1374
+ xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq
1375
+ DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE
1376
+ -----END CERTIFICATE-----
1377
+
1378
+ America Online Root Certification Authority 1
1379
+ =============================================
1380
+ -----BEGIN CERTIFICATE-----
1381
+ MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
1382
+ QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
1383
+ Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
1384
+ A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
1385
+ T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
1386
+ ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
1387
+ v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
1388
+ DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
1389
+ sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
1390
+ 8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
1391
+ AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
1392
+ o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
1393
+ GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
1394
+ VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
1395
+ 3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
1396
+ Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
1397
+ sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
1398
+ -----END CERTIFICATE-----
1399
+
1400
+ America Online Root Certification Authority 2
1401
+ =============================================
1402
+ -----BEGIN CERTIFICATE-----
1403
+ MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
1404
+ QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
1405
+ Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
1406
+ A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
1407
+ T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
1408
+ ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
1409
+ fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
1410
+ f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
1411
+ qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
1412
+ RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
1413
+ gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
1414
+ 6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
1415
+ FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
1416
+ Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
1417
+ B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
1418
+ aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
1419
+ AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
1420
+ T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
1421
+ +DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
1422
+ JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
1423
+ zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
1424
+ ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
1425
+ 1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
1426
+ GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
1427
+ Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
1428
+ cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
1429
+ -----END CERTIFICATE-----
1430
+
1431
+ Visa eCommerce Root
1432
+ ===================
1433
+ -----BEGIN CERTIFICATE-----
1434
+ MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
1435
+ EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
1436
+ QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
1437
+ WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
1438
+ VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
1439
+ bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
1440
+ F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
1441
+ RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
1442
+ TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
1443
+ /k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
1444
+ GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
1445
+ MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
1446
+ CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
1447
+ YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
1448
+ zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
1449
+ YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
1450
+ 398znM/jra6O1I7mT1GvFpLgXPYHDw==
1451
+ -----END CERTIFICATE-----
1452
+
1453
+ TC TrustCenter, Germany, Class 2 CA
1454
+ ===================================
1455
+ -----BEGIN CERTIFICATE-----
1456
+ MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI
1457
+ EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig
1458
+ U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD
1459
+ bGFzcyAyIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05
1460
+ ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt
1461
+ YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy
1462
+ aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg
1463
+ MiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI
1464
+ hvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLs
1465
+ qh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5N
1466
+ u6hLVxa8/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB
1467
+ Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy
1468
+ LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBAIRS+yjf
1469
+ /x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ2
1470
+ 9ELw+HkuCkhcq8xRT3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac
1471
+ ASZ4smZHcFFk
1472
+ -----END CERTIFICATE-----
1473
+
1474
+ TC TrustCenter, Germany, Class 3 CA
1475
+ ===================================
1476
+ -----BEGIN CERTIFICATE-----
1477
+ MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQI
1478
+ EwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig
1479
+ U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBD
1480
+ bGFzcyAzIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05
1481
+ ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFt
1482
+ YnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3Vy
1483
+ aXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3Mg
1484
+ MyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZI
1485
+ hvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN
1486
+ 2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+7
1487
+ 7uMMfTDWw1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMB
1488
+ Af8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRydXN0Y2VudGVy
1489
+ LmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0GCSqGSIb3DQEBBAUAA4GBABY9xs3B
1490
+ u4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm
1491
+ 5gZOngylerpuw3yCGdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS
1492
+ CdS7kjXvD9s0
1493
+ -----END CERTIFICATE-----
1494
+
1495
+ Certum Root CA
1496
+ ==============
1497
+ -----BEGIN CERTIFICATE-----
1498
+ MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
1499
+ ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
1500
+ Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
1501
+ by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
1502
+ wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
1503
+ kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
1504
+ 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
1505
+ Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
1506
+ NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
1507
+ hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
1508
+ GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
1509
+ GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
1510
+ 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
1511
+ qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
1512
+ -----END CERTIFICATE-----
1513
+
1514
+ Comodo AAA Services root
1515
+ ========================
1516
+ -----BEGIN CERTIFICATE-----
1517
+ MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
1518
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
1519
+ TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
1520
+ MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
1521
+ c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
1522
+ BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
1523
+ ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
1524
+ C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
1525
+ i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
1526
+ Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
1527
+ Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
1528
+ Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
1529
+ BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
1530
+ cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
1531
+ LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
1532
+ 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
1533
+ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
1534
+ 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
1535
+ 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
1536
+ -----END CERTIFICATE-----
1537
+
1538
+ Comodo Secure Services root
1539
+ ===========================
1540
+ -----BEGIN CERTIFICATE-----
1541
+ MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
1542
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
1543
+ TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
1544
+ MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
1545
+ Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
1546
+ BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
1547
+ ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
1548
+ 9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
1549
+ rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
1550
+ oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
1551
+ p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
1552
+ FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
1553
+ gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
1554
+ YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
1555
+ aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
1556
+ 4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
1557
+ Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
1558
+ DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
1559
+ pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
1560
+ RR3B7Hzs/Sk=
1561
+ -----END CERTIFICATE-----
1562
+
1563
+ Comodo Trusted Services root
1564
+ ============================
1565
+ -----BEGIN CERTIFICATE-----
1566
+ MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
1567
+ R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
1568
+ TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
1569
+ MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
1570
+ bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
1571
+ IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
1572
+ AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
1573
+ 3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
1574
+ /9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
1575
+ juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
1576
+ ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
1577
+ DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
1578
+ /zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
1579
+ ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
1580
+ cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
1581
+ uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
1582
+ pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
1583
+ BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
1584
+ R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
1585
+ 9y5Xt5hwXsjEeLBi
1586
+ -----END CERTIFICATE-----
1587
+
1588
+ IPS Chained CAs root
1589
+ ====================
1590
+ -----BEGIN CERTIFICATE-----
1591
+ MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVTMRIwEAYDVQQI
1592
+ EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1
1593
+ Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg
1594
+ Qi02MDkyOTQ1MjEzMDEGA1UECxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0
1595
+ aG9yaXR5MTMwMQYDVQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
1596
+ dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMjkwMDUzNThaFw0yNTEy
1597
+ MjcwMDUzNThaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJ
1598
+ QmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwu
1599
+ MSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJ
1600
+ UFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBD
1601
+ QSBDaGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBz
1602
+ QG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJspQgvJhPUOtopKdJ
1603
+ C7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCBhYEFcYGdtJUZqV92NC5jNzVXjrQf
1604
+ Qj8VXOF6wV8TGDIxya2+o8eDZh65nAQTy2nBBt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQID
1605
+ AQABo4IEQzCCBD8wHQYDVR0OBBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCC
1606
+ AUGAFKGtMbH5PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE
1607
+ CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBw
1608
+ dWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g
1609
+ IEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBDaGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1
1610
+ dGhvcml0eTEzMDEGA1UEAxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9y
1611
+ aXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNV
1612
+ HQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUF
1613
+ BwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGC
1614
+ NwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud
1615
+ EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZp
1616
+ Y2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8v
1617
+ d3d3Lmlwcy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5pcHMuZXMvaXBz
1618
+ MjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYtaHR0cDovL3d3dy5pcHMuZXMvaXBz
1619
+ MjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/MDkGCWCGSAGG+EIBBwQsFipodHRwOi8vd3d3Lmlwcy5l
1620
+ cy9pcHMyMDAyL3JlbmV3YWxDQUMuaHRtbD8wNwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBz
1621
+ LmVzL2lwczIwMDIvcG9saWN5Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYoaHR0cDovL3d3dy5p
1622
+ cHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCgLoYsaHR0cDovL3d3d2JhY2suaXBzLmVz
1623
+ L2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRw
1624
+ Oi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1WWKJBGyi3leGmGpVfp3hAK+/b
1625
+ lkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfNHnNDJGD1HWHc3JagvPsd4+cSACczAsDAK1M9
1626
+ 2GsDgaPb1pOVIO/Tln4mkImcJpvNb2ar7QMiRDjMWb2f2/YHogF/JsRj9SVCXmK9
1627
+ -----END CERTIFICATE-----
1628
+
1629
+ IPS CLASE1 root
1630
+ ===============
1631
+ -----BEGIN CERTIFICATE-----
1632
+ MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVTMRIwEAYDVQQI
1633
+ EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1
1634
+ Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg
1635
+ Qi02MDkyOTQ1MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
1636
+ eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqG
1637
+ SIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAwNTkzOFow
1638
+ ggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx
1639
+ LjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoU
1640
+ Imlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFT
1641
+ RTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlm
1642
+ aWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkq
1643
+ hkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywSzHb5BlmvXSHU0lq4
1644
+ oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBSYmL9Yzt9fuzuOOpi9GyocY3h6YvJ
1645
+ P8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQKD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQW
1646
+ BBTrsxl588GlHKzcuh9morKbadB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKb
1647
+ adB4CKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE
1648
+ BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBz
1649
+ LmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQL
1650
+ EyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0Eg
1651
+ Q0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p
1652
+ cHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMB
1653
+ BggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB
1654
+ BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0R
1655
+ BBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBBBglghkgB
1656
+ hvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRpZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5l
1657
+ cy8wKQYJYIZIAYb4QgECBBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIB
1658
+ BAQtFitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCGSAGG
1659
+ +EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25DTEFTRTEuaHRtbD8w
1660
+ PAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMS5o
1661
+ dG1sPzA6BglghkgBhvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT
1662
+ RTEuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIw
1663
+ MDJDTEFTRTEuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy
1664
+ Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5l
1665
+ cy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuKYn4VLenZMdMu9Ccj/1urxUq2
1666
+ ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpjV4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmO
1667
+ DszFV0VRFOlOHIilkfSj945RyKm+hjM+5i9Ibq9UkE6tsSU=
1668
+ -----END CERTIFICATE-----
1669
+
1670
+ IPS CLASE3 root
1671
+ ===============
1672
+ -----BEGIN CERTIFICATE-----
1673
+ MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVTMRIwEAYDVQQI
1674
+ EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1
1675
+ Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg
1676
+ Qi02MDkyOTQ1MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
1677
+ eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqG
1678
+ SIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAxMDE0NFow
1679
+ ggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx
1680
+ LjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoU
1681
+ Imlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFT
1682
+ RTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlm
1683
+ aWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkq
1684
+ hkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZH49NzjaY2uQARIwo
1685
+ 2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY8jjsbJ0gA8DvqqPGZARRLXgNo9Ko
1686
+ OtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVrSXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQW
1687
+ BBS4k/8uy9wsjqLnev42USGjmFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGj
1688
+ mFsMNKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE
1689
+ BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBz
1690
+ LmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQL
1691
+ EyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0Eg
1692
+ Q0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p
1693
+ cHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMB
1694
+ BggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB
1695
+ BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0R
1696
+ BBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBBBglghkgB
1697
+ hvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRpZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5l
1698
+ cy8wKQYJYIZIAYb4QgECBBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIB
1699
+ BAQtFitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCGSAGG
1700
+ +EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25DTEFTRTMuaHRtbD8w
1701
+ PAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMy5o
1702
+ dG1sPzA6BglghkgBhvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT
1703
+ RTMuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIw
1704
+ MDJDTEFTRTMuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy
1705
+ Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5l
1706
+ cy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dDqsfwfewPxqmurpYPdikc4gYt
1707
+ fibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUE
1708
+ NPjDfxZ4IwwHJPJGR607VNCv1TGyr33I6unUVtkOE7LFRVA=
1709
+ -----END CERTIFICATE-----
1710
+
1711
+ IPS CLASEA1 root
1712
+ ================
1713
+ -----BEGIN CERTIFICATE-----
1714
+ MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQI
1715
+ EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1
1716
+ Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg
1717
+ Qi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
1718
+ dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ
1719
+ KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3MDEwNTMy
1720
+ WjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9u
1721
+ YTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
1722
+ ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENM
1723
+ QVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENl
1724
+ cnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8w
1725
+ DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8m2mdd81u4D/u6zJf
1726
+ X5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4WwdByOgF9H5fahGRpEiqLJpxq339fWU
1727
+ oTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNV
1728
+ HQ4EFgQUZyaW56G/2LUDnf473P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf47
1729
+ 3P7yiuYV3TChggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
1730
+ BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2Vydmlj
1731
+ ZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0G
1732
+ A1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQ
1733
+ UyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNA
1734
+ bWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsG
1735
+ AQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB
1736
+ FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw
1737
+ GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC
1738
+ BglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3
1739
+ dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7Bglg
1740
+ hkgBhvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmww
1741
+ QAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2b2NhdGlvbkNMQVNF
1742
+ QTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdh
1743
+ bENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv
1744
+ cG9saWN5Q0xBU0VBMS5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lw
1745
+ czIwMDIvaXBzMjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz
1746
+ MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRw
1747
+ Oi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyAAIQVCtWYUQxkxZwCWINmyq0e
1748
+ B81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeFaQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5bi
1749
+ KcJboOeXNp13XjFr/tOn2yrb25aLH2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG
1750
+ -----END CERTIFICATE-----
1751
+
1752
+ IPS CLASEA3 root
1753
+ ================
1754
+ -----BEGIN CERTIFICATE-----
1755
+ MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQI
1756
+ EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1
1757
+ Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg
1758
+ Qi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
1759
+ dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ
1760
+ KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3MDEwNzUw
1761
+ WjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9u
1762
+ YTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE
1763
+ ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENM
1764
+ QVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENl
1765
+ cnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8w
1766
+ DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvNG7uGBiJ2MwwSbUhW
1767
+ YdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHUVqLyjRGZ/fZ98cfEXgIqmuJKtROK
1768
+ AP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNV
1769
+ HQ4EFgQUHp9XUEe2YZM50yz82l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz8
1770
+ 2l09BXW3mQKhggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ
1771
+ BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2Vydmlj
1772
+ ZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0G
1773
+ A1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQ
1774
+ UyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNA
1775
+ bWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsG
1776
+ AQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB
1777
+ FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw
1778
+ GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC
1779
+ BglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3
1780
+ dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7Bglg
1781
+ hkgBhvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmww
1782
+ QAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2b2NhdGlvbkNMQVNF
1783
+ QTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdh
1784
+ bENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv
1785
+ cG9saWN5Q0xBU0VBMy5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lw
1786
+ czIwMDIvaXBzMjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz
1787
+ MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRw
1788
+ Oi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca2on0eisxeewBwMwB9dbB/MjD
1789
+ 81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9S
1790
+ KcJQrSRE7SOzSMtEQMEDlQwKeAYSAfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv
1791
+ -----END CERTIFICATE-----
1792
+
1793
+ IPS Servidores root
1794
+ ===================
1795
+ -----BEGIN CERTIFICATE-----
1796
+ MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCQVJD
1797
+ RUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UEChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYG
1798
+ A1UECxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3
1799
+ DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1owgaMx
1800
+ CzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcG
1801
+ A1UEChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQD
1802
+ Ew5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMIGfMA0GCSqG
1803
+ SIb3DQEBAQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyYXZhkJAk8IbPMGbWOlI6H0fg3PqHILVik
1804
+ gDVboXVsHUUMH2Fjal5vmwpMwci4YSM1gf/+rHhwLWjhOgeYlQJU3c0jt4BT18g3RXIGJBK6E2Eh
1805
+ im51KODFDzT9NthFf+G4Nu+z4cYgjui0OLzhPvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GB
1806
+ ACzzw3lYJN7GO9HgQmm47mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsUdx+2
1807
+ /iU94aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14cJ58GNCr+Lh3B0Zx
1808
+ 8coLY1xq+XKU1QFPoNtC
1809
+ -----END CERTIFICATE-----
1810
+
1811
+ IPS Timestamping root
1812
+ =====================
1813
+ -----BEGIN CERTIFICATE-----
1814
+ MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVTMRIwEAYDVQQI
1815
+ EwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1
1816
+ Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAg
1817
+ Qi02MDkyOTQ1MjE0MDIGA1UECxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1
1818
+ dGhvcml0eTE0MDIGA1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhv
1819
+ cml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMTAxOFoXDTI1
1820
+ MTIyNzAxMTAxOFowggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQH
1821
+ EwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMu
1822
+ bC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsT
1823
+ K0lQUyBDQSBUaW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQ
1824
+ UyBDQSBUaW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEW
1825
+ D2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLjuVqWajOY2ycJi
1826
+ oGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4Efdo/BdApWgnMjvEp+ZCccWZ73b/
1827
+ K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6KaFYq6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0Gm
1828
+ qaMCAwEAAaOCBIAwggR8MB0GA1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSC
1829
+ AUcwggFDgBSL0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ
1830
+ BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu
1831
+ ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5J
1832
+ LkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRp
1833
+ b24gQXV0aG9yaXR5MTQwMgYDVQQDEytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24g
1834
+ QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB
1835
+ /zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG
1836
+ CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYK
1837
+ KwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVz
1838
+ MBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5n
1839
+ IENBIENlcnRpZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC
1840
+ BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFodHRwOi8vd3d3
1841
+ Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEUGCWCGSAGG+EIBAwQ4FjZo
1842
+ dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25UaW1lc3RhbXBpbmcuaHRtbD8wQgYJ
1843
+ YIZIAYb4QgEHBDUWM2h0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGlu
1844
+ Zy5odG1sPzBABglghkgBhvhCAQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lU
1845
+ aW1lc3RhbXBpbmcuaHRtbDB/BgNVHR8EeDB2MDegNaAzhjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMy
1846
+ MDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFjay5pcHMuZXMv
1847
+ aXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUH
1848
+ MAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAZbrBzAAalZHK6Ww6vzoe
1849
+ FAh8+4Pua2JR0zORtWB5fgTYXXk36MNbsMRnLWhasl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWT
1850
+ s/zif/WN87GphV+I3pGW7hdbrqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU=
1851
+ -----END CERTIFICATE-----
1852
+
1853
+ QuoVadis Root CA
1854
+ ================
1855
+ -----BEGIN CERTIFICATE-----
1856
+ MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
1857
+ ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
1858
+ eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
1859
+ MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
1860
+ cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
1861
+ EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
1862
+ AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
1863
+ J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
1864
+ F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
1865
+ YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
1866
+ AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
1867
+ PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
1868
+ ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
1869
+ MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
1870
+ YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
1871
+ ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
1872
+ Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
1873
+ Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
1874
+ BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
1875
+ FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
1876
+ aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
1877
+ tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
1878
+ fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
1879
+ LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
1880
+ gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
1881
+ 5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
1882
+ 5nrQNiOKSnQ2+Q==
1883
+ -----END CERTIFICATE-----
1884
+
1885
+ QuoVadis Root CA 2
1886
+ ==================
1887
+ -----BEGIN CERTIFICATE-----
1888
+ MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
1889
+ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
1890
+ ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
1891
+ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
1892
+ DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
1893
+ XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
1894
+ lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
1895
+ lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
1896
+ lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
1897
+ 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
1898
+ wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
1899
+ D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
1900
+ BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
1901
+ J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
1902
+ DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
1903
+ a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
1904
+ ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
1905
+ Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
1906
+ UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
1907
+ VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
1908
+ +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
1909
+ IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
1910
+ WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
1911
+ f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
1912
+ 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
1913
+ VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
1914
+ -----END CERTIFICATE-----
1915
+
1916
+ QuoVadis Root CA 3
1917
+ ==================
1918
+ -----BEGIN CERTIFICATE-----
1919
+ MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
1920
+ EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
1921
+ OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
1922
+ aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
1923
+ DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
1924
+ DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
1925
+ KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
1926
+ DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
1927
+ BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
1928
+ p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
1929
+ nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
1930
+ MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
1931
+ Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
1932
+ uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
1933
+ BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
1934
+ YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
1935
+ aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
1936
+ BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
1937
+ VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
1938
+ ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
1939
+ AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
1940
+ qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
1941
+ hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
1942
+ POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
1943
+ Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
1944
+ 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
1945
+ bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
1946
+ g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
1947
+ vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
1948
+ qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
1949
+ -----END CERTIFICATE-----
1950
+
1951
+ Security Communication Root CA
1952
+ ==============================
1953
+ -----BEGIN CERTIFICATE-----
1954
+ MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
1955
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
1956
+ HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
1957
+ U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
1958
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
1959
+ 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
1960
+ DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
1961
+ 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
1962
+ DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
1963
+ JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
1964
+ DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
1965
+ 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
1966
+ mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
1967
+ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
1968
+ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
1969
+ FL39vmwLAw==
1970
+ -----END CERTIFICATE-----
1971
+
1972
+ Sonera Class 1 Root CA
1973
+ ======================
1974
+ -----BEGIN CERTIFICATE-----
1975
+ MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
1976
+ U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw
1977
+ NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
1978
+ IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88
1979
+ 7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9
1980
+ EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl
1981
+ 0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645
1982
+ 2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa
1983
+ HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT
1984
+ iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9
1985
+ 28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV
1986
+ yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR
1987
+ vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P
1988
+ qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z
1989
+ IRlXvVWa
1990
+ -----END CERTIFICATE-----
1991
+
1992
+ Sonera Class 2 Root CA
1993
+ ======================
1994
+ -----BEGIN CERTIFICATE-----
1995
+ MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
1996
+ U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
1997
+ NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
1998
+ IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
1999
+ /Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
2000
+ dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
2001
+ f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
2002
+ tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
2003
+ nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
2004
+ XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
2005
+ 0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
2006
+ cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
2007
+ Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
2008
+ EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
2009
+ llpwrN9M
2010
+ -----END CERTIFICATE-----
2011
+
2012
+ Staat der Nederlanden Root CA
2013
+ =============================
2014
+ -----BEGIN CERTIFICATE-----
2015
+ MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
2016
+ ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
2017
+ Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
2018
+ HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
2019
+ bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
2020
+ vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
2021
+ jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
2022
+ C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
2023
+ vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
2024
+ 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
2025
+ HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
2026
+ dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
2027
+ BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
2028
+ EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
2029
+ MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
2030
+ nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
2031
+ iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
2032
+ -----END CERTIFICATE-----
2033
+
2034
+ TDC Internet Root CA
2035
+ ====================
2036
+ -----BEGIN CERTIFICATE-----
2037
+ MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE
2038
+ ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx
2039
+ NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu
2040
+ ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
2041
+ MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j
2042
+ xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL
2043
+ znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc
2044
+ 5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6
2045
+ otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI
2046
+ AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM
2047
+ VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
2048
+ MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC
2049
+ AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe
2050
+ UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G
2051
+ CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
2052
+ gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
2053
+ 2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb
2054
+ O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU
2055
+ Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
2056
+ -----END CERTIFICATE-----
2057
+
2058
+ TDC OCES Root CA
2059
+ ================
2060
+ -----BEGIN CERTIFICATE-----
2061
+ MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE
2062
+ ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5
2063
+ MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB
2064
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH
2065
+ nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0
2066
+ zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV
2067
+ iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde
2068
+ dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO
2069
+ 3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB
2070
+ 5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k
2071
+ ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm
2072
+ cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp
2073
+ Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x
2074
+ LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM
2075
+ MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm
2076
+ aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy
2077
+ MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647
2078
+ +RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6
2079
+ NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4
2080
+ A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc
2081
+ A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9
2082
+ AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1
2083
+ AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw==
2084
+ -----END CERTIFICATE-----
2085
+
2086
+ UTN DATACorp SGC Root CA
2087
+ ========================
2088
+ -----BEGIN CERTIFICATE-----
2089
+ MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
2090
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
2091
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
2092
+ BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
2093
+ MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
2094
+ HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
2095
+ dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
2096
+ AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
2097
+ raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
2098
+ wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
2099
+ 9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
2100
+ 33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
2101
+ DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
2102
+ BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
2103
+ LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
2104
+ DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
2105
+ Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
2106
+ I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
2107
+ EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
2108
+ DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
2109
+ -----END CERTIFICATE-----
2110
+
2111
+ UTN USERFirst Email Root CA
2112
+ ===========================
2113
+ -----BEGIN CERTIFICATE-----
2114
+ MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
2115
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
2116
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0
2117
+ BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05
2118
+ OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx
2119
+ FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx
2120
+ ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz
2121
+ dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
2122
+ MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx
2123
+ B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8
2124
+ om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG
2125
+ TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl
2126
+ yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE
2127
+ AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV
2128
+ HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll
2129
+ bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH
2130
+ AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne
2131
+ xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+
2132
+ 5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV
2133
+ NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ
2134
+ w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=
2135
+ -----END CERTIFICATE-----
2136
+
2137
+ UTN USERFirst Hardware Root CA
2138
+ ==============================
2139
+ -----BEGIN CERTIFICATE-----
2140
+ MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
2141
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
2142
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
2143
+ BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
2144
+ OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
2145
+ eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
2146
+ ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
2147
+ DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
2148
+ wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
2149
+ tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
2150
+ i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
2151
+ Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
2152
+ gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
2153
+ lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
2154
+ UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
2155
+ BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
2156
+ //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
2157
+ XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
2158
+ lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
2159
+ iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
2160
+ nfhmqA==
2161
+ -----END CERTIFICATE-----
2162
+
2163
+ UTN USERFirst Object Root CA
2164
+ ============================
2165
+ -----BEGIN CERTIFICATE-----
2166
+ MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE
2167
+ BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
2168
+ IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb
2169
+ BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz
2170
+ NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx
2171
+ HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy
2172
+ dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB
2173
+ BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR
2174
+ loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ
2175
+ w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu
2176
+ lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7
2177
+ RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL
2178
+ BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8
2179
+ ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly
2180
+ c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw
2181
+ DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw
2182
+ NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO
2183
+ PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE
2184
+ qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG
2185
+ hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g=
2186
+ -----END CERTIFICATE-----
2187
+
2188
+ Camerfirma Chambers of Commerce Root
2189
+ ====================================
2190
+ -----BEGIN CERTIFICATE-----
2191
+ MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
2192
+ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
2193
+ ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
2194
+ NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
2195
+ cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
2196
+ MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
2197
+ AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
2198
+ xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
2199
+ NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
2200
+ DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
2201
+ d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
2202
+ EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
2203
+ cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
2204
+ AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
2205
+ bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
2206
+ VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
2207
+ aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
2208
+ fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
2209
+ L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
2210
+ UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
2211
+ ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
2212
+ erfutGWaIZDgqtCYvDi1czyL+Nw=
2213
+ -----END CERTIFICATE-----
2214
+
2215
+ Camerfirma Global Chambersign Root
2216
+ ==================================
2217
+ -----BEGIN CERTIFICATE-----
2218
+ MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
2219
+ QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
2220
+ ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
2221
+ NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
2222
+ YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
2223
+ MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
2224
+ ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
2225
+ 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
2226
+ by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
2227
+ 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
2228
+ 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
2229
+ BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
2230
+ aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
2231
+ Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
2232
+ aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
2233
+ ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
2234
+ bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
2235
+ PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
2236
+ gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
2237
+ PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
2238
+ IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
2239
+ t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
2240
+ -----END CERTIFICATE-----
2241
+
2242
+ NetLock Qualified (Class QA) Root
2243
+ =================================
2244
+ -----BEGIN CERTIFICATE-----
2245
+ MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
2246
+ CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
2247
+ BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn
2248
+ eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0
2249
+ bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER
2250
+ MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0
2251
+ LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0
2252
+ dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP
2253
+ aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV
2254
+ CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e
2255
+ 8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb
2256
+ m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ
2257
+ 0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM
2258
+ 0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
2259
+ HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2
2260
+ YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh
2261
+ biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p
2262
+ a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz
2263
+ YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg
2264
+ YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg
2265
+ ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov
2266
+ L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr
2267
+ Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0
2268
+ aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg
2269
+ YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0
2270
+ IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3
2271
+ DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN
2272
+ wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg
2273
+ W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc
2274
+ R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR
2275
+ 5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko
2276
+ -----END CERTIFICATE-----
2277
+
2278
+ NetLock Notary (Class A) Root
2279
+ =============================
2280
+ -----BEGIN CERTIFICATE-----
2281
+ MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
2282
+ EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
2283
+ dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
2284
+ ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
2285
+ DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
2286
+ EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
2287
+ VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
2288
+ cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
2289
+ D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
2290
+ z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
2291
+ /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
2292
+ tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
2293
+ 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
2294
+ A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
2295
+ Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
2296
+ bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
2297
+ IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
2298
+ LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
2299
+ ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
2300
+ IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
2301
+ IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
2302
+ b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
2303
+ bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
2304
+ Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
2305
+ bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
2306
+ ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
2307
+ ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
2308
+ CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
2309
+ KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
2310
+ 8CgHrTwXZoi1/baI
2311
+ -----END CERTIFICATE-----
2312
+
2313
+ NetLock Business (Class B) Root
2314
+ ===============================
2315
+ -----BEGIN CERTIFICATE-----
2316
+ MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
2317
+ CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
2318
+ BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
2319
+ VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
2320
+ VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
2321
+ bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
2322
+ VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
2323
+ iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
2324
+ o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
2325
+ 1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
2326
+ HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
2327
+ RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
2328
+ dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
2329
+ ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
2330
+ c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
2331
+ YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
2332
+ c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
2333
+ Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
2334
+ bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
2335
+ IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
2336
+ YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
2337
+ cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
2338
+ 43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
2339
+ stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
2340
+ -----END CERTIFICATE-----
2341
+
2342
+ NetLock Express (Class C) Root
2343
+ ==============================
2344
+ -----BEGIN CERTIFICATE-----
2345
+ MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
2346
+ CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
2347
+ BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
2348
+ KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
2349
+ BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
2350
+ dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
2351
+ ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
2352
+ jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
2353
+ W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
2354
+ euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
2355
+ DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
2356
+ RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
2357
+ YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
2358
+ IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
2359
+ aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
2360
+ ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
2361
+ ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
2362
+ dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
2363
+ emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
2364
+ IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
2365
+ UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
2366
+ YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
2367
+ xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
2368
+ gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
2369
+ -----END CERTIFICATE-----
2370
+
2371
+ XRamp Global CA Root
2372
+ ====================
2373
+ -----BEGIN CERTIFICATE-----
2374
+ MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
2375
+ BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
2376
+ dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
2377
+ dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
2378
+ HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
2379
+ U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
2380
+ dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
2381
+ IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
2382
+ foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
2383
+ zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
2384
+ AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
2385
+ xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
2386
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
2387
+ oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
2388
+ AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
2389
+ /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
2390
+ qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
2391
+ nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
2392
+ 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
2393
+ -----END CERTIFICATE-----
2394
+
2395
+ Go Daddy Class 2 CA
2396
+ ===================
2397
+ -----BEGIN CERTIFICATE-----
2398
+ MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
2399
+ VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
2400
+ ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
2401
+ A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
2402
+ RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
2403
+ ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
2404
+ 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
2405
+ qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
2406
+ YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
2407
+ vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
2408
+ BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
2409
+ atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
2410
+ MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
2411
+ A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
2412
+ PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
2413
+ I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
2414
+ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
2415
+ Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
2416
+ vZ8=
2417
+ -----END CERTIFICATE-----
2418
+
2419
+ Starfield Class 2 CA
2420
+ ====================
2421
+ -----BEGIN CERTIFICATE-----
2422
+ MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
2423
+ U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
2424
+ Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
2425
+ MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
2426
+ A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
2427
+ SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
2428
+ bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
2429
+ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
2430
+ epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
2431
+ F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
2432
+ MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
2433
+ hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
2434
+ bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
2435
+ QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
2436
+ afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
2437
+ PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
2438
+ xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
2439
+ KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
2440
+ QBFGmh95DmK/D5fs4C8fF5Q=
2441
+ -----END CERTIFICATE-----
2442
+
2443
+ StartCom Ltd.
2444
+ =============
2445
+ -----BEGIN CERTIFICATE-----
2446
+ MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT
2447
+ BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xGjAYBgNVBAsT
2448
+ EUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhv
2449
+ cml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoX
2450
+ DTM1MDMxMDE3Mzc0OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcT
2451
+ BUVpbGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3JpdHkgRGVw
2452
+ LjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxITAfBgkqhkiG9w0B
2453
+ CQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOe
2454
+ yEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+
2455
+ o5c5s7XvIywI6Nivcy+5yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2
2456
+ IhULpNYILzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0GA1Ud
2457
+ DgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOWzL3+MtUNjIExtpid
2458
+ jShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWls
2459
+ YXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkw
2460
+ JwYDVQQDEyBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS
2461
+ YWRtaW5Ac3RhcnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV
2462
+ HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8GCWCGSAGG+EIB
2463
+ DQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAyBglghkgBhvhCAQQEJRYjaHR0
2464
+ cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5jcmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9j
2465
+ ZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJYIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9y
2466
+ Zy9pbmRleC5waHA/YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhB
2467
+ OlP1ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p00UOpO6w
2468
+ NnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLbcCOxgN8aIDjnfg==
2469
+ -----END CERTIFICATE-----
2470
+
2471
+ StartCom Certification Authority
2472
+ ================================
2473
+ -----BEGIN CERTIFICATE-----
2474
+ MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
2475
+ U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
2476
+ ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
2477
+ NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
2478
+ LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
2479
+ U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
2480
+ ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
2481
+ o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
2482
+ Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
2483
+ eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
2484
+ 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
2485
+ 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
2486
+ osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
2487
+ untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
2488
+ UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
2489
+ 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
2490
+ FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
2491
+ Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
2492
+ YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
2493
+ AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
2494
+ Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
2495
+ U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
2496
+ LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
2497
+ cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
2498
+ cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
2499
+ dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
2500
+ AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
2501
+ 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
2502
+ vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
2503
+ fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
2504
+ fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
2505
+ EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
2506
+ yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
2507
+ 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
2508
+ lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
2509
+ g14=
2510
+ -----END CERTIFICATE-----
2511
+
2512
+ Taiwan GRCA
2513
+ ===========
2514
+ -----BEGIN CERTIFICATE-----
2515
+ MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
2516
+ EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
2517
+ DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
2518
+ dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
2519
+ ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
2520
+ w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
2521
+ BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
2522
+ 1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
2523
+ htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
2524
+ J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
2525
+ Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
2526
+ B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
2527
+ O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
2528
+ lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
2529
+ HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
2530
+ 09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
2531
+ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
2532
+ Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
2533
+ Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
2534
+ D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
2535
+ DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
2536
+ Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
2537
+ 7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
2538
+ CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
2539
+ +fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
2540
+ -----END CERTIFICATE-----
2541
+
2542
+ Firmaprofesional Root CA
2543
+ ========================
2544
+ -----BEGIN CERTIFICATE-----
2545
+ MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT
2546
+ GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp
2547
+ Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA
2548
+ ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL
2549
+ MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT
2550
+ OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2
2551
+ ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB
2552
+ AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V
2553
+ j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH
2554
+ lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf
2555
+ 3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8
2556
+ NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww
2557
+ KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG
2558
+ AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud
2559
+ DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
2560
+ ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
2561
+ u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf
2562
+ wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
2563
+ 7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG
2564
+ VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
2565
+ -----END CERTIFICATE-----
2566
+
2567
+ Wells Fargo Root CA
2568
+ ===================
2569
+ -----BEGIN CERTIFICATE-----
2570
+ MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
2571
+ BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
2572
+ cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
2573
+ MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
2574
+ bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
2575
+ MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
2576
+ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
2577
+ x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
2578
+ E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
2579
+ OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
2580
+ sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
2581
+ YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
2582
+ BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
2583
+ ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
2584
+ m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
2585
+ OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
2586
+ x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
2587
+ tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
2588
+ -----END CERTIFICATE-----
2589
+
2590
+ Swisscom Root CA 1
2591
+ ==================
2592
+ -----BEGIN CERTIFICATE-----
2593
+ MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
2594
+ EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
2595
+ dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
2596
+ MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
2597
+ aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
2598
+ IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
2599
+ MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
2600
+ NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
2601
+ AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
2602
+ b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
2603
+ 7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
2604
+ cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
2605
+ WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
2606
+ haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
2607
+ MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
2608
+ HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
2609
+ BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
2610
+ MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
2611
+ jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
2612
+ MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
2613
+ VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
2614
+ vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
2615
+ OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
2616
+ 1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
2617
+ nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
2618
+ x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
2619
+ NY6E0F/6MBr1mmz0DlP5OlvRHA==
2620
+ -----END CERTIFICATE-----
2621
+
2622
+ DigiCert Assured ID Root CA
2623
+ ===========================
2624
+ -----BEGIN CERTIFICATE-----
2625
+ MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
2626
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
2627
+ IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
2628
+ MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
2629
+ ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
2630
+ ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
2631
+ 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
2632
+ UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
2633
+ /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
2634
+ oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
2635
+ GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
2636
+ 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
2637
+ hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
2638
+ EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
2639
+ SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
2640
+ 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
2641
+ +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
2642
+ -----END CERTIFICATE-----
2643
+
2644
+ DigiCert Global Root CA
2645
+ =======================
2646
+ -----BEGIN CERTIFICATE-----
2647
+ MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
2648
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
2649
+ HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
2650
+ MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
2651
+ dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
2652
+ hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
2653
+ TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
2654
+ BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
2655
+ 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
2656
+ 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
2657
+ o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
2658
+ 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
2659
+ BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
2660
+ EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
2661
+ tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
2662
+ UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
2663
+ CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
2664
+ -----END CERTIFICATE-----
2665
+
2666
+ DigiCert High Assurance EV Root CA
2667
+ ==================================
2668
+ -----BEGIN CERTIFICATE-----
2669
+ MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
2670
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
2671
+ KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
2672
+ MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
2673
+ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
2674
+ Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
2675
+ Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
2676
+ OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
2677
+ MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
2678
+ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
2679
+ h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
2680
+ Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
2681
+ JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
2682
+ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
2683
+ myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
2684
+ mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
2685
+ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
2686
+ -----END CERTIFICATE-----
2687
+
2688
+ Certplus Class 2 Primary CA
2689
+ ===========================
2690
+ -----BEGIN CERTIFICATE-----
2691
+ MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
2692
+ BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
2693
+ OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
2694
+ dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
2695
+ ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
2696
+ 5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
2697
+ Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
2698
+ YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
2699
+ e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
2700
+ CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
2701
+ YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
2702
+ L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
2703
+ P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
2704
+ TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
2705
+ 7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
2706
+ //1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
2707
+ l7+ijrRU
2708
+ -----END CERTIFICATE-----
2709
+
2710
+ DST Root CA X3
2711
+ ==============
2712
+ -----BEGIN CERTIFICATE-----
2713
+ MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
2714
+ ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
2715
+ DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
2716
+ cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
2717
+ ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
2718
+ rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
2719
+ UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
2720
+ xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
2721
+ utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
2722
+ AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
2723
+ MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
2724
+ dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
2725
+ GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
2726
+ RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
2727
+ fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
2728
+ -----END CERTIFICATE-----
2729
+
2730
+ DST ACES CA X6
2731
+ ==============
2732
+ -----BEGIN CERTIFICATE-----
2733
+ MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
2734
+ EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
2735
+ MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
2736
+ MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
2737
+ CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
2738
+ AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
2739
+ DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
2740
+ pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
2741
+ GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
2742
+ MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
2743
+ EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
2744
+ Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
2745
+ dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
2746
+ CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
2747
+ 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
2748
+ Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
2749
+ nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
2750
+ vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
2751
+ oKfN5XozNmr6mis=
2752
+ -----END CERTIFICATE-----
2753
+
2754
+ TURKTRUST Certificate Services Provider Root 1
2755
+ ==============================================
2756
+ -----BEGIN CERTIFICATE-----
2757
+ MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
2758
+ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
2759
+ MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
2760
+ acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
2761
+ MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
2762
+ U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
2763
+ TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
2764
+ aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
2765
+ AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
2766
+ yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
2767
+ Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
2768
+ 8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
2769
+ W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
2770
+ BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
2771
+ sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
2772
+ q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
2773
+ B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
2774
+ nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
2775
+ -----END CERTIFICATE-----
2776
+
2777
+ TURKTRUST Certificate Services Provider Root 2
2778
+ ==============================================
2779
+ -----BEGIN CERTIFICATE-----
2780
+ MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
2781
+ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
2782
+ MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
2783
+ QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
2784
+ MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
2785
+ dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
2786
+ A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
2787
+ acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
2788
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
2789
+ LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
2790
+ x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
2791
+ QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
2792
+ 5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
2793
+ AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
2794
+ A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
2795
+ Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
2796
+ Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
2797
+ hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
2798
+ 9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
2799
+ UrbnBEI=
2800
+ -----END CERTIFICATE-----
2801
+
2802
+ SwissSign Platinum CA - G2
2803
+ ==========================
2804
+ -----BEGIN CERTIFICATE-----
2805
+ MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT
2806
+ BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw
2807
+ HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM
2808
+ U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ
2809
+ KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu
2810
+ 669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF
2811
+ eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne
2812
+ WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo
2813
+ j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6
2814
+ 8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T
2815
+ aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy
2816
+ domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D
2817
+ +m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV
2818
+ CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
2819
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv
2820
+ zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW
2821
+ IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1
2822
+ Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3
2823
+ NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4
2824
+ U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8
2825
+ KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl
2826
+ 9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B
2827
+ aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs
2828
+ OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY
2829
+ Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci
2830
+ IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==
2831
+ -----END CERTIFICATE-----
2832
+
2833
+ SwissSign Gold CA - G2
2834
+ ======================
2835
+ -----BEGIN CERTIFICATE-----
2836
+ MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
2837
+ EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
2838
+ MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
2839
+ c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
2840
+ AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
2841
+ t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
2842
+ jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
2843
+ vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
2844
+ ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
2845
+ AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
2846
+ jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
2847
+ peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
2848
+ 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
2849
+ GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
2850
+ AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
2851
+ OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
2852
+ L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
2853
+ 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
2854
+ 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
2855
+ Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
2856
+ Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
2857
+ mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
2858
+ vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
2859
+ KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
2860
+ NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
2861
+ viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
2862
+ -----END CERTIFICATE-----
2863
+
2864
+ SwissSign Silver CA - G2
2865
+ ========================
2866
+ -----BEGIN CERTIFICATE-----
2867
+ MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
2868
+ BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
2869
+ DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
2870
+ aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
2871
+ 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
2872
+ N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
2873
+ +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
2874
+ 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
2875
+ MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
2876
+ qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
2877
+ FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
2878
+ ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
2879
+ celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
2880
+ CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
2881
+ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
2882
+ tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
2883
+ cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
2884
+ 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
2885
+ kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
2886
+ 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
2887
+ /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
2888
+ DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
2889
+ e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
2890
+ WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
2891
+ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
2892
+ DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
2893
+ -----END CERTIFICATE-----
2894
+
2895
+ GeoTrust Primary Certification Authority
2896
+ ========================================
2897
+ -----BEGIN CERTIFICATE-----
2898
+ MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
2899
+ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
2900
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
2901
+ CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
2902
+ cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
2903
+ CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
2904
+ b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
2905
+ nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
2906
+ RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
2907
+ tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
2908
+ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
2909
+ hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
2910
+ Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
2911
+ NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
2912
+ Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
2913
+ 1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
2914
+ -----END CERTIFICATE-----
2915
+
2916
+ thawte Primary Root CA
2917
+ ======================
2918
+ -----BEGIN CERTIFICATE-----
2919
+ MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
2920
+ BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
2921
+ aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
2922
+ cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
2923
+ MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
2924
+ SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
2925
+ KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
2926
+ FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
2927
+ oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
2928
+ 1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
2929
+ q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
2930
+ aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
2931
+ afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
2932
+ VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
2933
+ AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
2934
+ uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
2935
+ xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
2936
+ jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
2937
+ z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
2938
+ -----END CERTIFICATE-----
2939
+
2940
+ VeriSign Class 3 Public Primary Certification Authority - G5
2941
+ ============================================================
2942
+ -----BEGIN CERTIFICATE-----
2943
+ MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
2944
+ BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
2945
+ ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
2946
+ IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
2947
+ ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
2948
+ yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
2949
+ biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
2950
+ dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
2951
+ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
2952
+ ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
2953
+ j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
2954
+ Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
2955
+ Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
2956
+ fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
2957
+ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
2958
+ Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
2959
+ aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
2960
+ SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
2961
+ X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
2962
+ KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
2963
+ Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
2964
+ ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
2965
+ -----END CERTIFICATE-----
2966
+
2967
+ SecureTrust CA
2968
+ ==============
2969
+ -----BEGIN CERTIFICATE-----
2970
+ MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
2971
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
2972
+ dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
2973
+ BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
2974
+ ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
2975
+ OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
2976
+ DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
2977
+ GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
2978
+ 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
2979
+ ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
2980
+ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
2981
+ aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
2982
+ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
2983
+ SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
2984
+ mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
2985
+ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
2986
+ 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
2987
+ -----END CERTIFICATE-----
2988
+
2989
+ Secure Global CA
2990
+ ================
2991
+ -----BEGIN CERTIFICATE-----
2992
+ MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
2993
+ EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
2994
+ bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
2995
+ MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
2996
+ Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
2997
+ YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
2998
+ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
2999
+ 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
3000
+ HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
3001
+ 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
3002
+ EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
3003
+ oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
3004
+ MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
3005
+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
3006
+ CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
3007
+ 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
3008
+ f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
3009
+ -----END CERTIFICATE-----
3010
+
3011
+ COMODO Certification Authority
3012
+ ==============================
3013
+ -----BEGIN CERTIFICATE-----
3014
+ MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
3015
+ BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
3016
+ A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
3017
+ dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
3018
+ MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
3019
+ T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
3020
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
3021
+ +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
3022
+ xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
3023
+ 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
3024
+ 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
3025
+ rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
3026
+ BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
3027
+ b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
3028
+ AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
3029
+ OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
3030
+ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
3031
+ IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
3032
+ +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
3033
+ -----END CERTIFICATE-----
3034
+
3035
+ DigiNotar Root CA
3036
+ =================
3037
+ -----BEGIN CERTIFICATE-----
3038
+ MIIFijCCA3KgAwIBAgIQDHbanJEMTiye/hXQWJM8TDANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQG
3039
+ EwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90YXIgUm9vdCBDQTEgMB4G
3040
+ CSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwHhcNMDcwNTE2MTcxOTM2WhcNMjUwMzMxMTgx
3041
+ OTIxWjBfMQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90
3042
+ YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwggIiMA0GCSqGSIb3
3043
+ DQEBAQUAA4ICDwAwggIKAoICAQCssFjBAL3YIQgLK5r+blYwBZ8bd5AQQVzDDYcRd46B8cp86Yxq
3044
+ 7Th0Nbva3/m7wAk3tJZzgX0zGpg595NvlX89ubF1h7pRSOiLcD6VBMXYtsMW2YiwsYcdcNqGtA8U
3045
+ i3rPENF0NqISe3eGSnnme98CEWilToauNFibJBN4ViIlHgGLS1Fx+4LMWZZpiFpoU8W5DQI3y0u8
3046
+ ZkqQfioLBQftFl9VkHXYRskbg+IIvvEjzJkd1ioPgyAVWCeCLvriIsJJsbkBgWqdbZ1Ad2h2TiEq
3047
+ bYRAhU52mXyC8/O3AlnUJgEbjt+tUwbRrhjd4rI6y9eIOI6sWym5GdOY+RgDz0iChmYLG2kPyes4
3048
+ iHomGgVMktck1JbyrFIto0fVUvY//s6EBnCmqj6i8rZWNBhXouSBbefK8GrTx5FrAoNBfBXva5pk
3049
+ XuPQPOWx63tdhvvL5ndJzaNl3Pe5nLjkC1+Tz8wwGjIczhxjlaX56uF0i57pK6kwe6AYHw4YC+Vb
3050
+ qdPRbB4HZ4+RS6mKvNJmqpMBiLKR+jFc1abBUggJzQpjotMipuih2TkGl/VujQKQjBR7P4DNG5y6
3051
+ xFhyI6+2Vp/GekIzKQc/gsnmHwUNzUwoNovTyD4cxojvXu6JZOkd69qJfjKmadHdzIif0dDJZiHc
3052
+ BmfFlHqabWJMfczgZICynkeOowIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
3053
+ AwIBBjAdBgNVHQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wDQYJKoZIhvcNAQEFBQADggIBADsC
3054
+ jcs8MOhuoK3yc7NfniUTBAXT9uOLuwt5zlPe5JbF0a9zvNXD0EBVfEB/zRtfCdXyfJ9oHbtdzno5
3055
+ wozWmHvFg1Wo1X1AyuAe94leY12hE8JdiraKfADzI8PthV9xdvBoY6pFITlIYXg23PFDk9Qlx/KA
3056
+ ZeFTAnVR/Ho67zerhChXDNjU1JlWbOOi/lmEtDHoM/hklJRRl6s5xUvt2t2AC298KQ3EjopyDedT
3057
+ FLJgQT2EkTFoPSdE2+Xe9PpjRchMPpj1P0G6Tss3DbpmmPHdy59c91Q2gmssvBNhl0L4eLvMyKKf
3058
+ yvBovWsdst+Nbwed2o5nx0ceyrm/KkKRt2NTZvFCo+H0Wk1Ya7XkpDOtXHAd3ODy63MUkZoDweoA
3059
+ ZbwH/M8SESIsrqC9OuCiKthZ6SnTGDWkrBFfGbW1G/8iSlzGeuQX7yCpp/Q/rYqnmgQlnQ7KN+ZQ
3060
+ /YxCKQSa7LnPS3K94gg2ryMvYuXKAdNw23yCIywWMQzGNgeQerEfZ1jEO1hZibCMjFCz2IbLaKPE
3061
+ CudpSyDOwR5WS5WpI2jYMNjD67BVUc3l/Su49bsRn1NU9jQZjHkJNsphFyUXC4KYcwx3dMPVDceo
3062
+ EkzHp1RxRy4sGn3J4ys7SN4nhKdjNrN9j6BkOSQNPXuHr2ZcdBtLc7LljPCGmbjlxd+Ewbfr
3063
+ -----END CERTIFICATE-----
3064
+
3065
+ Network Solutions Certificate Authority
3066
+ =======================================
3067
+ -----BEGIN CERTIFICATE-----
3068
+ MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
3069
+ EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
3070
+ IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
3071
+ MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
3072
+ MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
3073
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
3074
+ jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
3075
+ aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
3076
+ crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
3077
+ /Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
3078
+ AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
3079
+ BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
3080
+ bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
3081
+ A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
3082
+ 4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
3083
+ GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
3084
+ wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
3085
+ ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
3086
+ -----END CERTIFICATE-----
3087
+
3088
+ WellsSecure Public Root Certificate Authority
3089
+ =============================================
3090
+ -----BEGIN CERTIFICATE-----
3091
+ MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
3092
+ F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
3093
+ NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
3094
+ MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
3095
+ bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
3096
+ VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
3097
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
3098
+ iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
3099
+ i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
3100
+ bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
3101
+ K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
3102
+ AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
3103
+ cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
3104
+ lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
3105
+ i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
3106
+ GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
3107
+ Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
3108
+ K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
3109
+ bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
3110
+ qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
3111
+ E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
3112
+ tylv2G0xffX8oRAHh84vWdw+WNs=
3113
+ -----END CERTIFICATE-----
lib/CF/cloudfiles.php ADDED
@@ -0,0 +1,2137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This is the PHP Cloud Files API.
4
+ *
5
+ * <code>
6
+ * # Authenticate to Cloud Files. The default is to automatically try
7
+ * # to re-authenticate if an authentication token expires.
8
+ * #
9
+ * # NOTE: Some versions of cURL include an outdated certificate authority (CA)
10
+ * # file. This API ships with a newer version obtained directly from
11
+ * # cURL's web site (http://curl.haxx.se). To use the newer CA bundle,
12
+ * # call the CF_Authentication instance's 'ssl_use_cabundle()' method.
13
+ * #
14
+ * $auth = new CF_Authentication($username, $api_key);
15
+ * # $auth->ssl_use_cabundle(); # bypass cURL's old CA bundle
16
+ * $auth->authenticate();
17
+ *
18
+ * # Establish a connection to the storage system
19
+ * #
20
+ * # NOTE: Some versions of cURL include an outdated certificate authority (CA)
21
+ * # file. This API ships with a newer version obtained directly from
22
+ * # cURL's web site (http://curl.haxx.se). To use the newer CA bundle,
23
+ * # call the CF_Connection instance's 'ssl_use_cabundle()' method.
24
+ * #
25
+ * $conn = new CF_Connection($auth);
26
+ * # $conn->ssl_use_cabundle(); # bypass cURL's old CA bundle
27
+ *
28
+ * # Create a remote Container and storage Object
29
+ * #
30
+ * $images = $conn->create_container("photos");
31
+ * $bday = $images->create_object("first_birthday.jpg");
32
+ *
33
+ * # Upload content from a local file by streaming it. Note that we use
34
+ * # a "float" for the file size to overcome PHP's 32-bit integer limit for
35
+ * # very large files.
36
+ * #
37
+ * $fname = "/home/user/photos/birthdays/birthday1.jpg"; # filename to upload
38
+ * $size = (float) sprintf("%u", filesize($fname));
39
+ * $fp = open($fname, "r");
40
+ * $bday->write($fp, $size);
41
+ *
42
+ * # Or... use a convenience function instead
43
+ * #
44
+ * $bday->load_from_filename("/home/user/photos/birthdays/birthday1.jpg");
45
+ *
46
+ * # Now, publish the "photos" container to serve the images by CDN.
47
+ * # Use the "$uri" value to put in your web pages or send the link in an
48
+ * # email message, etc.
49
+ * #
50
+ * $uri = $images->make_public();
51
+ *
52
+ * # Or... print out the Object's public URI
53
+ * #
54
+ * print $bday->public_uri();
55
+ * </code>
56
+ *
57
+ * See the included tests directory for additional sample code.
58
+ *
59
+ * Requres PHP 5.x (for Exceptions and OO syntax) and PHP's cURL module.
60
+ *
61
+ * It uses the supporting "cloudfiles_http.php" module for HTTP(s) support and
62
+ * allows for connection re-use and streaming of content into/out of Cloud Files
63
+ * via PHP's cURL module.
64
+ *
65
+ * See COPYING for license information.
66
+ *
67
+ * @author Eric "EJ" Johnson <ej@racklabs.com>
68
+ * @copyright Copyright (c) 2008, Rackspace US, Inc.
69
+ * @package php-cloudfiles
70
+ */
71
+
72
+ /**
73
+ */
74
+ require_once("cloudfiles_exceptions.php");
75
+ require("cloudfiles_http.php");
76
+ define("DEFAULT_CF_API_VERSION", 1);
77
+ define("MAX_CONTAINER_NAME_LEN", 256);
78
+ define("MAX_OBJECT_NAME_LEN", 1024);
79
+ define("MAX_OBJECT_SIZE", 5*1024*1024*1024+1); # bigger than S3! ;-)
80
+
81
+ /**
82
+ * Class for handling Cloud Files Authentication, call it's {@link authenticate()}
83
+ * method to obtain authorized service urls and an authentication token.
84
+ *
85
+ * Example:
86
+ * <code>
87
+ * # Create the authentication instance
88
+ * #
89
+ * $auth = new CF_Authentication("username", "api_key");
90
+ *
91
+ * # NOTE: Some versions of cURL include an outdated certificate authority (CA)
92
+ * # file. This API ships with a newer version obtained directly from
93
+ * # cURL's web site (http://curl.haxx.se). To use the newer CA bundle,
94
+ * # call the CF_Authentication instance's 'ssl_use_cabundle()' method.
95
+ * #
96
+ * # $auth->ssl_use_cabundle(); # bypass cURL's old CA bundle
97
+ *
98
+ * # Perform authentication request
99
+ * #
100
+ * $auth->authenticate();
101
+ * </code>
102
+ *
103
+ * @package php-cloudfiles
104
+ */
105
+ class CF_Authentication
106
+ {
107
+ public $dbug;
108
+ public $username;
109
+ public $api_key;
110
+ public $auth_host;
111
+ public $account;
112
+
113
+ /**
114
+ * Instance variables that are set after successful authentication
115
+ */
116
+ public $storage_url;
117
+ public $cdnm_url;
118
+ public $auth_token;
119
+
120
+ /**
121
+ * Class constructor (PHP 5 syntax)
122
+ *
123
+ * @param string $username Mosso username
124
+ * @param string $api_key Mosso API Access Key
125
+ * @param string $account <b>Deprecated</b> <i>Account name</i>
126
+ * @param string $auth_host <b>Deprecated</b> <i>Authentication service URI</i>
127
+ */
128
+ function __construct($username=NULL, $api_key=NULL, $account=NULL, $auth_host=NULL)
129
+ {
130
+
131
+ $this->dbug = False;
132
+ $this->username = $username;
133
+ $this->api_key = $api_key;
134
+ $this->account_name = $account;
135
+ $this->auth_host = $auth_host;
136
+
137
+ $this->storage_url = NULL;
138
+ $this->cdnm_url = NULL;
139
+ $this->auth_token = NULL;
140
+
141
+ $this->cfs_http = new CF_Http(DEFAULT_CF_API_VERSION);
142
+ }
143
+
144
+ /**
145
+ * Use the Certificate Authority bundle included with this API
146
+ *
147
+ * Most versions of PHP with cURL support include an outdated Certificate
148
+ * Authority (CA) bundle (the file that lists all valid certificate
149
+ * signing authorities). The SSL certificates used by the Cloud Files
150
+ * storage system are perfectly valid but have been created/signed by
151
+ * a CA not listed in these outdated cURL distributions.
152
+ *
153
+ * As a work-around, we've included an updated CA bundle obtained
154
+ * directly from cURL's web site (http://curl.haxx.se). You can direct
155
+ * the API to use this CA bundle by calling this method prior to making
156
+ * any remote calls. The best place to use this method is right after
157
+ * the CF_Authentication instance has been instantiated.
158
+ *
159
+ * You can specify your own CA bundle by passing in the full pathname
160
+ * to the bundle. You can use the included CA bundle by leaving the
161
+ * argument blank.
162
+ *
163
+ * @param string $path Specify path to CA bundle (default to included)
164
+ */
165
+ function ssl_use_cabundle($path=NULL)
166
+ {
167
+ $this->cfs_http->ssl_use_cabundle($path);
168
+ }
169
+
170
+ /**
171
+ * Attempt to validate Username/API Access Key
172
+ *
173
+ * Attempts to validate credentials with the authentication service. It
174
+ * either returns <kbd>True</kbd> or throws an Exception. Accepts a single
175
+ * (optional) argument for the storage system API version.
176
+ *
177
+ * Example:
178
+ * <code>
179
+ * # Create the authentication instance
180
+ * #
181
+ * $auth = new CF_Authentication("username", "api_key");
182
+ *
183
+ * # Perform authentication request
184
+ * #
185
+ * $auth->authenticate();
186
+ * </code>
187
+ *
188
+ * @param string $version API version for Auth service (optional)
189
+ * @return boolean <kbd>True</kbd> if successfully authenticated
190
+ * @throws AuthenticationException invalid credentials
191
+ * @throws InvalidResponseException invalid response
192
+ */
193
+ function authenticate($version=DEFAULT_CF_API_VERSION)
194
+ {
195
+ list($status,$reason,$surl,$curl,$atoken) =
196
+ $this->cfs_http->authenticate($this->username, $this->api_key,
197
+ $this->account_name, $this->auth_host);
198
+
199
+ if ($status == 401) {
200
+ throw new AuthenticationException("Invalid username or access key.");
201
+ }
202
+ if ($status != 204) {
203
+ throw new InvalidResponseException(
204
+ "Unexpected response (".$status."): ".$reason);
205
+ }
206
+
207
+ if (!($surl || $curl) || !$atoken) {
208
+ throw new InvalidResponseException(
209
+ "Expected headers missing from auth service.");
210
+ }
211
+ $this->storage_url = $surl;
212
+ $this->cdnm_url = $curl;
213
+ $this->auth_token = $atoken;
214
+ return True;
215
+ }
216
+ /**
217
+ * Use Cached Token and Storage URL's rather then grabbing from the Auth System
218
+ *
219
+ * Example:
220
+ * <code>
221
+ * #Create an Auth instance
222
+ * $auth = new CF_Authentication();
223
+ * #Pass Cached URL's and Token as Args
224
+ * $auth->load_cached_credentials("auth_token", "storage_url", "cdn_management_url");
225
+ * </code>
226
+ *
227
+ * @param string $auth_token A Cloud Files Auth Token (Required)
228
+ * @param string $storage_url The Cloud Files Storage URL (Required)
229
+ * @param string $cdnm_url CDN Management URL (Required)
230
+ * @return boolean <kbd>True</kbd> if successful
231
+ * @throws SyntaxException If any of the Required Arguments are missing
232
+ */
233
+ function load_cached_credentials($auth_token, $storage_url, $cdnm_url)
234
+ {
235
+ if(!$storage_url || !$cdnm_url)
236
+ {
237
+ throw new SyntaxException("Missing Required Interface URL's!");
238
+ return False;
239
+ }
240
+ if(!$auth_token)
241
+ {
242
+ throw new SyntaxException("Missing Auth Token!");
243
+ return False;
244
+ }
245
+
246
+ $this->storage_url = $storage_url;
247
+ $this->cdnm_url = $cdnm_url;
248
+ $this->auth_token = $auth_token;
249
+ return True;
250
+ }
251
+ /**
252
+ * Grab Cloud Files info to be Cached for later use with the load_cached_credentials method.
253
+ *
254
+ * Example:
255
+ * <code>
256
+ * #Create an Auth instance
257
+ * $auth = new CF_Authentication("UserName","API_Key");
258
+ * $auth->authenticate();
259
+ * $array = $auth->export_credentials();
260
+ * </code>
261
+ *
262
+ * @return array of url's and an auth token.
263
+ */
264
+ function export_credentials()
265
+ {
266
+ $arr = array();
267
+ $arr['storage_url'] = $this->storage_url;
268
+ $arr['cdnm_url'] = $this->cdnm_url;
269
+ $arr['auth_token'] = $this->auth_token;
270
+
271
+ return $arr;
272
+ }
273
+
274
+
275
+ /**
276
+ * Make sure the CF_Authentication instance has authenticated.
277
+ *
278
+ * Ensures that the instance variables necessary to communicate with
279
+ * Cloud Files have been set from a previous authenticate() call.
280
+ *
281
+ * @return boolean <kbd>True</kbd> if successfully authenticated
282
+ */
283
+ function authenticated()
284
+ {
285
+ if (!($this->storage_url || $this->cdnm_url) || !$this->auth_token) {
286
+ return False;
287
+ }
288
+ return True;
289
+ }
290
+
291
+ /**
292
+ * Toggle debugging - set cURL verbose flag
293
+ */
294
+ function setDebug($bool)
295
+ {
296
+ $this->dbug = $bool;
297
+ $this->cfs_http->setDebug($bool);
298
+ }
299
+ }
300
+
301
+ /**
302
+ * Class for establishing connections to the Cloud Files storage system.
303
+ * Connection instances are used to communicate with the storage system at
304
+ * the account level; listing and deleting Containers and returning Container
305
+ * instances.
306
+ *
307
+ * Example:
308
+ * <code>
309
+ * # Create the authentication instance
310
+ * #
311
+ * $auth = new CF_Authentication("username", "api_key");
312
+ *
313
+ * # Perform authentication request
314
+ * #
315
+ * $auth->authenticate();
316
+ *
317
+ * # Create a connection to the storage/cdn system(s) and pass in the
318
+ * # validated CF_Authentication instance.
319
+ * #
320
+ * $conn = new CF_Connection($auth);
321
+ *
322
+ * # NOTE: Some versions of cURL include an outdated certificate authority (CA)
323
+ * # file. This API ships with a newer version obtained directly from
324
+ * # cURL's web site (http://curl.haxx.se). To use the newer CA bundle,
325
+ * # call the CF_Authentication instance's 'ssl_use_cabundle()' method.
326
+ * #
327
+ * # $conn->ssl_use_cabundle(); # bypass cURL's old CA bundle
328
+ * </code>
329
+ *
330
+ * @package php-cloudfiles
331
+ */
332
+ class CF_Connection
333
+ {
334
+ public $dbug;
335
+ public $cfs_http;
336
+ public $cfs_auth;
337
+
338
+ /**
339
+ * Pass in a previously authenticated CF_Authentication instance.
340
+ *
341
+ * Example:
342
+ * <code>
343
+ * # Create the authentication instance
344
+ * #
345
+ * $auth = new CF_Authentication("username", "api_key");
346
+ *
347
+ * # Perform authentication request
348
+ * #
349
+ * $auth->authenticate();
350
+ *
351
+ * # Create a connection to the storage/cdn system(s) and pass in the
352
+ * # validated CF_Authentication instance.
353
+ * #
354
+ * $conn = new CF_Connection($auth);
355
+ *
356
+ * # If you are connecting via Rackspace servers and have access
357
+ * # to the servicenet network you can set the $servicenet to True
358
+ * # like this.
359
+ *
360
+ * $conn = new CF_Connection($auth, $servicenet=True);
361
+ *
362
+ * </code>
363
+ *
364
+ * If the environement variable RACKSPACE_SERVICENET is defined it will
365
+ * force to connect via the servicenet.
366
+ *
367
+ * @param obj $cfs_auth previously authenticated CF_Authentication instance
368
+ * @param boolean $servicenet enable/disable access via Rackspace servicenet.
369
+ * @throws AuthenticationException not authenticated
370
+ */
371
+ function __construct($cfs_auth, $servicenet=False)
372
+ {
373
+ if (isset($_ENV['RACKSPACE_SERVICENET']))
374
+ $servicenet=True;
375
+ $this->cfs_http = new CF_Http(DEFAULT_CF_API_VERSION);
376
+ $this->cfs_auth = $cfs_auth;
377
+ if (!$this->cfs_auth->authenticated()) {
378
+ $e = "Need to pass in a previously authenticated ";
379
+ $e .= "CF_Authentication instance.";
380
+ throw new AuthenticationException($e);
381
+ }
382
+ $this->cfs_http->setCFAuth($this->cfs_auth, $servicenet=$servicenet);
383
+ $this->dbug = False;
384
+ }
385
+
386
+ /**
387
+ * Toggle debugging of instance and back-end HTTP module
388
+ *
389
+ * @param boolean $bool enable/disable cURL debugging
390
+ */
391
+ function setDebug($bool)
392
+ {
393
+ $this->dbug = (boolean) $bool;
394
+ $this->cfs_http->setDebug($this->dbug);
395
+ }
396
+
397
+ /**
398
+ * Close a connection
399
+ *
400
+ * Example:
401
+ * <code>
402
+ *
403
+ * $conn->close();
404
+ *
405
+ * </code>
406
+ *
407
+ * Will close all current cUrl active connections.
408
+ *
409
+ */
410
+ public function close()
411
+ {
412
+ $this->cfs_http->close();
413
+ }
414
+
415
+ /**
416
+ * Cloud Files account information
417
+ *
418
+ * Return an array of two floats (since PHP only supports 32-bit integers);
419
+ * number of containers on the account and total bytes used for the account.
420
+ *
421
+ * Example:
422
+ * <code>
423
+ * # ... authentication code excluded (see previous examples) ...
424
+ * #
425
+ * $conn = new CF_Authentication($auth);
426
+ *
427
+ * list($quantity, $bytes) = $conn->get_info();
428
+ * print "Number of containers: " . $quantity . "\n";
429
+ * print "Bytes stored in container: " . $bytes . "\n";
430
+ * </code>
431
+ *
432
+ * @return array (number of containers, total bytes stored)
433
+ * @throws InvalidResponseException unexpected response
434
+ */
435
+ function get_info()
436
+ {
437
+ list($status, $reason, $container_count, $total_bytes) =
438
+ $this->cfs_http->head_account();
439
+ #if ($status == 401 && $this->_re_auth()) {
440
+ # return $this->get_info();
441
+ #}
442
+ if ($status < 200 || $status > 299) {
443
+ throw new InvalidResponseException(
444
+ "Invalid response (".$status."): ".$this->cfs_http->get_error());
445
+ }
446
+ return array($container_count, $total_bytes);
447
+ }
448
+
449
+ /**
450
+ * Create a Container
451
+ *
452
+ * Given a Container name, return a Container instance, creating a new
453
+ * remote Container if it does not exit.
454
+ *
455
+ * Example:
456
+ * <code>
457
+ * # ... authentication code excluded (see previous examples) ...
458
+ * #
459
+ * $conn = new CF_Authentication($auth);
460
+ *
461
+ * $images = $conn->create_container("my photos");
462
+ * </code>
463
+ *
464
+ * @param string $container_name container name
465
+ * @return CF_Container
466
+ * @throws SyntaxException invalid name
467
+ * @throws InvalidResponseException unexpected response
468
+ */
469
+ function create_container($container_name=NULL)
470
+ {
471
+ if ($container_name != "0" and !isset($container_name))
472
+ throw new SyntaxException("Container name not set.");
473
+
474
+ if (!isset($container_name) or $container_name == "")
475
+ throw new SyntaxException("Container name not set.");
476
+
477
+ if (strpos($container_name, "/") !== False) {
478
+ $r = "Container name '".$container_name;
479
+ $r .= "' cannot contain a '/' character.";
480
+ throw new SyntaxException($r);
481
+ }
482
+ if (strlen($container_name) > MAX_CONTAINER_NAME_LEN) {
483
+ throw new SyntaxException(sprintf(
484
+ "Container name exeeds %d bytes.",
485
+ MAX_CONTAINER_NAME_LEN));
486
+ }
487
+
488
+ $return_code = $this->cfs_http->create_container($container_name);
489
+ if (!$return_code) {
490
+ throw new InvalidResponseException("Invalid response ("
491
+ . $return_code. "): " . $this->cfs_http->get_error());
492
+ }
493
+ #if ($status == 401 && $this->_re_auth()) {
494
+ # return $this->create_container($container_name);
495
+ #}
496
+ if ($return_code != 201 && $return_code != 202) {
497
+ throw new InvalidResponseException(
498
+ "Invalid response (".$return_code."): "
499
+ . $this->cfs_http->get_error());
500
+ }
501
+ return new CF_Container($this->cfs_auth, $this->cfs_http, $container_name);
502
+ }
503
+
504
+ /**
505
+ * Delete a Container
506
+ *
507
+ * Given either a Container instance or name, remove the remote Container.
508
+ * The Container must be empty prior to removing it.
509
+ *
510
+ * Example:
511
+ * <code>
512
+ * # ... authentication code excluded (see previous examples) ...
513
+ * #
514
+ * $conn = new CF_Authentication($auth);
515
+ *
516
+ * $conn->delete_container("my photos");
517
+ * </code>
518
+ *
519
+ * @param string|obj $container container name or instance
520
+ * @return boolean <kbd>True</kbd> if successfully deleted
521
+ * @throws SyntaxException missing proper argument
522
+ * @throws InvalidResponseException invalid response
523
+ * @throws NonEmptyContainerException container not empty
524
+ * @throws NoSuchContainerException remote container does not exist
525
+ */
526
+ function delete_container($container=NULL)
527
+ {
528
+ $container_name = NULL;
529
+
530
+ if (is_object($container)) {
531
+ if (get_class($container) == "CF_Container") {
532
+ $container_name = $container->name;
533
+ }
534
+ }
535
+ if (is_string($container)) {
536
+ $container_name = $container;
537
+ }
538
+
539
+ if ($container_name != "0" and !isset($container_name))
540
+ throw new SyntaxException("Must specify container object or name.");
541
+
542
+ $return_code = $this->cfs_http->delete_container($container_name);
543
+
544
+ if (!$return_code) {
545
+ throw new InvalidResponseException("Failed to obtain http response");
546
+ }
547
+ #if ($status == 401 && $this->_re_auth()) {
548
+ # return $this->delete_container($container);
549
+ #}
550
+ if ($return_code == 409) {
551
+ throw new NonEmptyContainerException(
552
+ "Container must be empty prior to removing it.");
553
+ }
554
+ if ($return_code == 404) {
555
+ throw new NoSuchContainerException(
556
+ "Specified container did not exist to delete.");
557
+ }
558
+ if ($return_code != 204) {
559
+ throw new InvalidResponseException(
560
+ "Invalid response (".$return_code."): "
561
+ . $this->cfs_http->get_error());
562
+ }
563
+ return True;
564
+ }
565
+
566
+ /**
567
+ * Return a Container instance
568
+ *
569
+ * For the given name, return a Container instance if the remote Container
570
+ * exists, otherwise throw a Not Found exception.
571
+ *
572
+ * Example:
573
+ * <code>
574
+ * # ... authentication code excluded (see previous examples) ...
575
+ * #
576
+ * $conn = new CF_Authentication($auth);
577
+ *
578
+ * $images = $conn->get_container("my photos");
579
+ * print "Number of Objects: " . $images->count . "\n";
580
+ * print "Bytes stored in container: " . $images->bytes . "\n";
581
+ * </code>
582
+ *
583
+ * @param string $container_name name of the remote Container
584
+ * @return container CF_Container instance
585
+ * @throws NoSuchContainerException thrown if no remote Container
586
+ * @throws InvalidResponseException unexpected response
587
+ */
588
+ function get_container($container_name=NULL)
589
+ {
590
+ list($status, $reason, $count, $bytes) =
591
+ $this->cfs_http->head_container($container_name);
592
+ #if ($status == 401 && $this->_re_auth()) {
593
+ # return $this->get_container($container_name);
594
+ #}
595
+ if ($status == 404) {
596
+ throw new NoSuchContainerException("Container not found.");
597
+ }
598
+ if ($status < 200 || $status > 299) {
599
+ throw new InvalidResponseException(
600
+ "Invalid response: ".$this->cfs_http->get_error());
601
+ }
602
+ return new CF_Container($this->cfs_auth, $this->cfs_http,
603
+ $container_name, $count, $bytes);
604
+ }
605
+
606
+ /**
607
+ * Return array of Container instances
608
+ *
609
+ * Return an array of CF_Container instances on the account. The instances
610
+ * will be fully populated with Container attributes (bytes stored and
611
+ * Object count)
612
+ *
613
+ * Example:
614
+ * <code>
615
+ * # ... authentication code excluded (see previous examples) ...
616
+ * #
617
+ * $conn = new CF_Authentication($auth);
618
+ *
619
+ * $clist = $conn->get_containers();
620
+ * foreach ($clist as $cont) {
621
+ * print "Container name: " . $cont->name . "\n";
622
+ * print "Number of Objects: " . $cont->count . "\n";
623
+ * print "Bytes stored in container: " . $cont->bytes . "\n";
624
+ * }
625
+ * </code>
626
+ *
627
+ * @return array An array of CF_Container instances
628
+ * @throws InvalidResponseException unexpected response
629
+ */
630
+ function get_containers($limit=0, $marker=NULL)
631
+ {
632
+ list($status, $reason, $container_info) =
633
+ $this->cfs_http->list_containers_info($limit, $marker);
634
+ #if ($status == 401 && $this->_re_auth()) {
635
+ # return $this->get_containers();
636
+ #}
637
+ if ($status < 200 || $status > 299) {
638
+ throw new InvalidResponseException(
639
+ "Invalid response: ".$this->cfs_http->get_error());
640
+ }
641
+ $containers = array();
642
+ foreach ($container_info as $name => $info) {
643
+ $containers[] = new CF_Container($this->cfs_auth, $this->cfs_http,
644
+ $info['name'], $info["count"], $info["bytes"], False);
645
+ }
646
+ return $containers;
647
+ }
648
+
649
+ /**
650
+ * Return list of remote Containers
651
+ *
652
+ * Return an array of strings containing the names of all remote Containers.
653
+ *
654
+ * Example:
655
+ * <code>
656
+ * # ... authentication code excluded (see previous examples) ...
657
+ * #
658
+ * $conn = new CF_Authentication($auth);
659
+ *
660
+ * $container_list = $conn->list_containers();
661
+ * print_r($container_list);
662
+ * Array
663
+ * (
664
+ * [0] => "my photos",
665
+ * [1] => "my docs"
666
+ * )
667
+ * </code>
668
+ *
669
+ * @param integer $limit restrict results to $limit Containers
670
+ * @param string $marker return results greater than $marker
671
+ * @return array list of remote Containers
672
+ * @throws InvalidResponseException unexpected response
673
+ */
674
+ function list_containers($limit=0, $marker=NULL)
675
+ {
676
+ list($status, $reason, $containers) =
677
+ $this->cfs_http->list_containers($limit, $marker);
678
+ #if ($status == 401 && $this->_re_auth()) {
679
+ # return $this->list_containers($limit, $marker);
680
+ #}
681
+ if ($status < 200 || $status > 299) {
682
+ throw new InvalidResponseException(
683
+ "Invalid response (".$status."): ".$this->cfs_http->get_error());
684
+ }
685
+ return $containers;
686
+ }
687
+
688
+ /**
689
+ * Return array of information about remote Containers
690
+ *
691
+ * Return a nested array structure of Container info.
692
+ *
693
+ * Example:
694
+ * <code>
695
+ * # ... authentication code excluded (see previous examples) ...
696
+ * #
697
+ *
698
+ * $container_info = $conn->list_containers_info();
699
+ * print_r($container_info);
700
+ * Array
701
+ * (
702
+ * ["my photos"] =>
703
+ * Array
704
+ * (
705
+ * ["bytes"] => 78,
706
+ * ["count"] => 2
707
+ * )
708
+ * ["docs"] =>
709
+ * Array
710
+ * (
711
+ * ["bytes"] => 37323,
712
+ * ["count"] => 12
713
+ * )
714
+ * )
715
+ * </code>
716
+ *
717
+ * @param integer $limit restrict results to $limit Containers
718
+ * @param string $marker return results greater than $marker
719
+ * @return array nested array structure of Container info
720
+ * @throws InvalidResponseException unexpected response
721
+ */
722
+ function list_containers_info($limit=0, $marker=NULL)
723
+ {
724
+ list($status, $reason, $container_info) =
725
+ $this->cfs_http->list_containers_info($limit, $marker);
726
+ #if ($status == 401 && $this->_re_auth()) {
727
+ # return $this->list_containers_info($limit, $marker);
728
+ #}
729
+ if ($status < 200 || $status > 299) {
730
+ throw new InvalidResponseException(
731
+ "Invalid response (".$status."): ".$this->cfs_http->get_error());
732
+ }
733
+ return $container_info;
734
+ }
735
+
736
+ /**
737
+ * Return list of Containers that have been published to the CDN.
738
+ *
739
+ * Return an array of strings containing the names of published Containers.
740
+ * Note that this function returns the list of any Container that has
741
+ * ever been CDN-enabled regardless of it's existence in the storage
742
+ * system.
743
+ *
744
+ * Example:
745
+ * <code>
746
+ * # ... authentication code excluded (see previous examples) ...
747
+ * #
748
+ * $conn = new CF_Authentication($auth);
749
+ *
750
+ * $public_containers = $conn->list_public_containers();
751
+ * print_r($public_containers);
752
+ * Array
753
+ * (
754
+ * [0] => "images",
755
+ * [1] => "css",
756
+ * [2] => "javascript"
757
+ * )
758
+ * </code>
759
+ *
760
+ * @return array list of published Container names
761
+ * @throws InvalidResponseException unexpected response
762
+ */
763
+ function list_public_containers()
764
+ {
765
+ list($status, $reason, $containers) =
766
+ $this->cfs_http->list_cdn_containers();
767
+ #if ($status == 401 && $this->_re_auth()) {
768
+ # return $this->list_public_containers();
769
+ #}
770
+ if ($status < 200 || $status > 299) {
771
+ throw new InvalidResponseException(
772
+ "Invalid response (".$status."): ".$this->cfs_http->get_error());
773
+ }
774
+ return $containers;
775
+ }
776
+
777
+ /**
778
+ * Set a user-supplied callback function to report download progress
779
+ *
780
+ * The callback function is used to report incremental progress of a data
781
+ * download functions (e.g. $container->list_objects(), $obj->read(), etc).
782
+ * The specified function will be periodically called with the number of
783
+ * bytes transferred until the entire download is complete. This callback
784
+ * function can be useful for implementing "progress bars" for large
785
+ * downloads.
786
+ *
787
+ * The specified callback function should take a single integer parameter.
788
+ *
789
+ * <code>
790
+ * function read_callback($bytes_transferred) {
791
+ * print ">> downloaded " . $bytes_transferred . " bytes.\n";
792
+ * # ... do other things ...
793
+ * return;
794
+ * }
795
+ *
796
+ * $conn = new CF_Connection($auth_obj);
797
+ * $conn->set_read_progress_function("read_callback");
798
+ * print_r($conn->list_containers());
799
+ *
800
+ * # output would look like this:
801
+ * #
802
+ * >> downloaded 10 bytes.
803
+ * >> downloaded 11 bytes.
804
+ * Array
805
+ * (
806
+ * [0] => fuzzy.txt
807
+ * [1] => space name
808
+ * )
809
+ * </code>
810
+ *
811
+ * @param string $func_name the name of the user callback function
812
+ */
813
+ function set_read_progress_function($func_name)
814
+ {
815
+ $this->cfs_http->setReadProgressFunc($func_name);
816
+ }
817
+
818
+ /**
819
+ * Set a user-supplied callback function to report upload progress
820
+ *
821
+ * The callback function is used to report incremental progress of a data
822
+ * upload functions (e.g. $obj->write() call). The specified function will
823
+ * be periodically called with the number of bytes transferred until the
824
+ * entire upload is complete. This callback function can be useful
825
+ * for implementing "progress bars" for large uploads/downloads.
826
+ *
827
+ * The specified callback function should take a single integer parameter.
828
+ *
829
+ * <code>
830
+ * function write_callback($bytes_transferred) {
831
+ * print ">> uploaded " . $bytes_transferred . " bytes.\n";
832
+ * # ... do other things ...
833
+ * return;
834
+ * }
835
+ *
836
+ * $conn = new CF_Connection($auth_obj);
837
+ * $conn->set_write_progress_function("write_callback");
838
+ * $container = $conn->create_container("stuff");
839
+ * $obj = $container->create_object("foo");
840
+ * $obj->write("The callback function will be called during upload.");
841
+ *
842
+ * # output would look like this:
843
+ * # >> uploaded 51 bytes.
844
+ * #
845
+ * </code>
846
+ *
847
+ * @param string $func_name the name of the user callback function
848
+ */
849
+ function set_write_progress_function($func_name)
850
+ {
851
+ $this->cfs_http->setWriteProgressFunc($func_name);
852
+ }
853
+
854
+ /**
855
+ * Use the Certificate Authority bundle included with this API
856
+ *
857
+ * Most versions of PHP with cURL support include an outdated Certificate
858
+ * Authority (CA) bundle (the file that lists all valid certificate
859
+ * signing authorities). The SSL certificates used by the Cloud Files
860
+ * storage system are perfectly valid but have been created/signed by
861
+ * a CA not listed in these outdated cURL distributions.
862
+ *
863
+ * As a work-around, we've included an updated CA bundle obtained
864
+ * directly from cURL's web site (http://curl.haxx.se). You can direct
865
+ * the API to use this CA bundle by calling this method prior to making
866
+ * any remote calls. The best place to use this method is right after
867
+ * the CF_Authentication instance has been instantiated.
868
+ *
869
+ * You can specify your own CA bundle by passing in the full pathname
870
+ * to the bundle. You can use the included CA bundle by leaving the
871
+ * argument blank.
872
+ *
873
+ * @param string $path Specify path to CA bundle (default to included)
874
+ */
875
+ function ssl_use_cabundle($path=NULL)
876
+ {
877
+ $this->cfs_http->ssl_use_cabundle($path);
878
+ }
879
+
880
+ #private function _re_auth()
881
+ #{
882
+ # $new_auth = new CF_Authentication(
883
+ # $this->cfs_auth->username,
884
+ # $this->cfs_auth->api_key,
885
+ # $this->cfs_auth->auth_host,
886
+ # $this->cfs_auth->account);
887
+ # $new_auth->authenticate();
888
+ # $this->cfs_auth = $new_auth;
889
+ # $this->cfs_http->setCFAuth($this->cfs_auth);
890
+ # return True;
891
+ #}
892
+ }
893
+
894
+ /**
895
+ * Container operations
896
+ *
897
+ * Containers are storage compartments where you put your data (objects).
898
+ * A container is similar to a directory or folder on a conventional filesystem
899
+ * with the exception that they exist in a flat namespace, you can not create
900
+ * containers inside of containers.
901
+ *
902
+ * You also have the option of marking a Container as "public" so that the
903
+ * Objects stored in the Container are publicly available via the CDN.
904
+ *
905
+ * @package php-cloudfiles
906
+ */
907
+ class CF_Container
908
+ {
909
+ public $cfs_auth;
910
+ public $cfs_http;
911
+ public $name;
912
+ public $object_count;
913
+ public $bytes_used;
914
+
915
+ public $cdn_enabled;
916
+ public $cdn_uri;
917
+ public $cdn_ttl;
918
+ public $cdn_log_retention;
919
+ public $cdn_acl_user_agent;
920
+ public $cdn_acl_referrer;
921
+
922
+ /**
923
+ * Class constructor
924
+ *
925
+ * Constructor for Container
926
+ *
927
+ * @param obj $cfs_auth CF_Authentication instance
928
+ * @param obj $cfs_http HTTP connection manager
929
+ * @param string $name name of Container
930
+ * @param int $count number of Objects stored in this Container
931
+ * @param int $bytes number of bytes stored in this Container
932
+ * @throws SyntaxException invalid Container name
933
+ */
934
+ function __construct(&$cfs_auth, &$cfs_http, $name, $count=0,
935
+ $bytes=0, $docdn=True)
936
+ {
937
+ if (strlen($name) > MAX_CONTAINER_NAME_LEN) {
938
+ throw new SyntaxException("Container name exceeds "
939
+ . "maximum allowed length.");
940
+ }
941
+ if (strpos($name, "/") !== False) {
942
+ throw new SyntaxException(
943
+ "Container names cannot contain a '/' character.");
944
+ }
945
+ $this->cfs_auth = $cfs_auth;
946
+ $this->cfs_http = $cfs_http;
947
+ $this->name = $name;
948
+ $this->object_count = $count;
949
+ $this->bytes_used = $bytes;
950
+ $this->cdn_enabled = NULL;
951
+ $this->cdn_uri = NULL;
952
+ $this->cdn_ttl = NULL;
953
+ $this->cdn_log_retention = NULL;
954
+ $this->cdn_acl_user_agent = NULL;
955
+ $this->cdn_acl_referrer = NULL;
956
+ if ($this->cfs_http->getCDNMUrl() != NULL && $docdn) {
957
+ $this->_cdn_initialize();
958
+ }
959
+ }
960
+
961
+ /**
962
+ * String representation of Container
963
+ *
964
+ * Pretty print the Container instance.
965
+ *
966
+ * @return string Container details
967
+ */
968
+ function __toString()
969
+ {
970
+ $me = sprintf("name: %s, count: %.0f, bytes: %.0f",
971
+ $this->name, $this->object_count, $this->bytes_used);
972
+ if ($this->cfs_http->getCDNMUrl() != NULL) {
973
+ $me .= sprintf(", cdn: %s, cdn uri: %s, cdn ttl: %.0f, logs retention: %s",
974
+ $this->is_public() ? "Yes" : "No",
975
+ $this->cdn_uri, $this->cdn_ttl,
976
+ $this->cdn_log_retention ? "Yes" : "No"
977
+ );
978
+
979
+ if ($this->cdn_acl_user_agent != NULL) {
980
+ $me .= ", cdn acl user agent: " . $this->cdn_acl_user_agent;
981
+ }
982
+
983
+ if ($this->cdn_acl_referrer != NULL) {
984
+ $me .= ", cdn acl referrer: " . $this->cdn_acl_referrer;
985
+ }
986
+
987
+
988
+ }
989
+ return $me;
990
+ }
991
+
992
+ /**
993
+ * Enable Container content to be served via CDN or modify CDN attributes
994
+ *
995
+ * Either enable this Container's content to be served via CDN or
996
+ * adjust its CDN attributes. This Container will always return the
997
+ * same CDN-enabled URI each time it is toggled public/private/public.
998
+ *
999
+ * Example:
1000
+ * <code>
1001
+ * # ... authentication code excluded (see previous examples) ...
1002
+ * #
1003
+ * $conn = new CF_Authentication($auth);
1004
+ *
1005
+ * $public_container = $conn->create_container("public");
1006
+ *
1007
+ * # CDN-enable the container and set it's TTL for a month
1008
+ * #
1009
+ * $public_container->make_public(86400/2); # 12 hours (86400 seconds/day)
1010
+ * </code>
1011
+ *
1012
+ * @param int $ttl the time in seconds content will be cached in the CDN
1013
+ * @returns string the CDN enabled Container's URI
1014
+ * @throws CDNNotEnabledException CDN functionality not returned during auth
1015
+ * @throws AuthenticationException if auth token is not valid/expired
1016
+ * @throws InvalidResponseException unexpected response
1017
+ */
1018
+ function make_public($ttl=86400)
1019
+ {
1020
+ if ($this->cfs_http->getCDNMUrl() == NULL) {
1021
+ throw new CDNNotEnabledException(
1022
+ "Authentication response did not indicate CDN availability");
1023
+ }
1024
+ if ($this->cdn_uri != NULL) {
1025
+ # previously published, assume we're setting new attributes
1026
+ list($status, $reason, $cdn_uri) =
1027
+ $this->cfs_http->update_cdn_container($this->name,$ttl,
1028
+ $this->cdn_log_retention,
1029
+ $this->cdn_acl_user_agent,
1030
+ $this->cdn_acl_referrer);
1031
+ #if ($status == 401 && $this->_re_auth()) {
1032
+ # return $this->make_public($ttl);
1033
+ #}
1034
+ if ($status == 404) {
1035
+ # this instance _thinks_ the container was published, but the
1036
+ # cdn management system thinks otherwise - try again with a PUT
1037
+ list($status, $reason, $cdn_uri) =
1038
+ $this->cfs_http->add_cdn_container($this->name,$ttl);
1039
+
1040
+ }
1041
+ } else {
1042
+ # publish it for first time
1043
+ list($status, $reason, $cdn_uri) =
1044
+ $this->cfs_http->add_cdn_container($this->name,$ttl);
1045
+ }
1046
+ #if ($status == 401 && $this->_re_auth()) {
1047
+ # return $this->make_public($ttl);
1048
+ #}
1049
+ if (!in_array($status, array(201,202))) {
1050
+ throw new InvalidResponseException(
1051
+ "Invalid response (".$status."): ".$this->cfs_http->get_error());
1052
+ }
1053
+ $this->cdn_enabled = True;
1054
+ $this->cdn_ttl = $ttl;
1055
+ $this->cdn_uri = $cdn_uri;
1056
+ $this->cdn_log_retention = False;
1057
+ $this->cdn_acl_user_agent = "";
1058
+ $this->cdn_acl_referrer = "";
1059
+ return $this->cdn_uri;
1060
+ }
1061
+
1062
+ /**
1063
+ * Enable ACL restriction by User Agent for this container.
1064
+ *
1065
+ * Example:
1066
+ * <code>
1067
+ * # ... authentication code excluded (see previous examples) ...
1068
+ * #
1069
+ * $conn = new CF_Authentication($auth);
1070
+ *
1071
+ * $public_container = $conn->get_container("public");
1072
+ *
1073
+ * # Enable ACL by Referrer
1074
+ * $public_container->acl_referrer("Mozilla");
1075
+ * </code>
1076
+ *
1077
+ * @returns boolean True if successful
1078
+ * @throws CDNNotEnabledException CDN functionality not returned during auth
1079
+ * @throws AuthenticationException if auth token is not valid/expired
1080
+ * @throws InvalidResponseException unexpected response
1081
+ */
1082
+ function acl_user_agent($cdn_acl_user_agent="") {
1083
+ if ($this->cfs_http->getCDNMUrl() == NULL) {
1084
+ throw new CDNNotEnabledException(
1085
+ "Authentication response did not indicate CDN availability");
1086
+ }
1087
+ list($status,$reason) =
1088
+ $this->cfs_http->update_cdn_container($this->name,
1089
+ $this->cdn_ttl,
1090
+ $this->cdn_log_retention,
1091
+ $cdn_acl_user_agent,
1092
+ $this->cdn_acl_referrer
1093
+ );
1094
+ if (!in_array($status, array(202,404))) {
1095
+ throw new InvalidResponseException(
1096
+ "Invalid response (".$status."): ".$this->cfs_http->get_error());
1097
+ }
1098
+ $this->cdn_acl_user_agent = $cdn_acl_user_agent;
1099
+ return True;
1100
+ }
1101
+
1102
+ /**
1103
+ * Enable ACL restriction by referer for this container.
1104
+ *
1105
+ * Example:
1106
+ * <code>
1107
+ * # ... authentication code excluded (see previous examples) ...
1108
+ * #
1109
+ * $conn = new CF_Authentication($auth);
1110
+ *
1111
+ * $public_container = $conn->get_container("public");
1112
+ *
1113
+ * # Enable Referrer
1114
+ * $public_container->acl_referrer("http://www.example.com/gallery.php");
1115
+ * </code>
1116
+ *
1117
+ * @returns boolean True if successful
1118
+ * @throws CDNNotEnabledException CDN functionality not returned during auth
1119
+ * @throws AuthenticationException if auth token is not valid/expired
1120
+ * @throws InvalidResponseException unexpected response
1121
+ */
1122
+ function acl_referrer($cdn_acl_referrer="") {
1123
+ if ($this->cfs_http->getCDNMUrl() == NULL) {
1124
+ throw new CDNNotEnabledException(
1125
+ "Authentication response did not indicate CDN availability");
1126
+ }
1127
+ list($status,$reason) =
1128
+ $this->cfs_http->update_cdn_container($this->name,
1129
+ $this->cdn_ttl,
1130
+ $this->cdn_log_retention,
1131
+ $this->cdn_acl_user_agent,
1132
+ $cdn_acl_referrer
1133
+ );
1134
+ if (!in_array($status, array(202,404))) {
1135
+ throw new InvalidResponseException(
1136
+ "Invalid response (".$status."): ".$this->cfs_http->get_error());
1137
+ }
1138
+ $this->cdn_acl_referrer = $cdn_acl_referrer;
1139
+ return True;
1140
+ }
1141
+
1142
+ /**
1143
+ * Enable log retention for this CDN container.
1144
+ *
1145
+ * Enable CDN log retention on the container. If enabled logs will
1146
+ * be periodically (at unpredictable intervals) compressed and
1147
+ * uploaded to a ".CDN_ACCESS_LOGS" container in the form of
1148
+ * "container_name.YYYYMMDDHH-XXXX.gz". Requires CDN be enabled on
1149
+ * the account.
1150
+ *
1151
+ * Example:
1152
+ * <code>
1153
+ * # ... authentication code excluded (see previous examples) ...
1154
+ * #
1155
+ * $conn = new CF_Authentication($auth);
1156
+ *
1157
+ * $public_container = $conn->get_container("public");
1158
+ *
1159
+ * # Enable logs retention.
1160
+ * $public_container->log_retention(True);
1161
+ * </code>
1162
+ *
1163
+ * @returns boolean True if successful
1164
+ * @throws CDNNotEnabledException CDN functionality not returned during auth
1165
+ * @throws AuthenticationException if auth token is not valid/expired
1166
+ * @throws InvalidResponseException unexpected response
1167
+ */
1168
+ function log_retention($cdn_log_retention=False) {
1169
+ if ($this->cfs_http->getCDNMUrl() == NULL) {
1170
+ throw new CDNNotEnabledException(
1171
+ "Authentication response did not indicate CDN availability");
1172
+ }
1173
+ list($status,$reason) =
1174
+ $this->cfs_http->update_cdn_container($this->name,
1175
+ $this->cdn_ttl,
1176
+ $cdn_log_retention,
1177
+ $this->cdn_acl_user_agent,
1178
+ $this->cdn_acl_referrer
1179
+ );
1180
+ if (!in_array($status, array(202,404))) {
1181
+ throw new InvalidResponseException(
1182
+ "Invalid response (".$status."): ".$this->cfs_http->get_error());
1183
+ }
1184
+ $this->cdn_log_retention = $cdn_log_retention;
1185
+ return True;
1186
+ }
1187
+
1188
+ /**
1189
+ * Disable the CDN sharing for this container
1190
+ *
1191
+ * Use this method to disallow distribution into the CDN of this Container's
1192
+ * content.
1193
+ *
1194
+ * NOTE: Any content already cached in the CDN will continue to be served
1195
+ * from its cache until the TTL expiration transpires. The default
1196
+ * TTL is typically one day, so "privatizing" the Container will take
1197
+ * up to 24 hours before the content is purged from the CDN cache.
1198
+ *
1199
+ * Example:
1200
+ * <code>
1201
+ * # ... authentication code excluded (see previous examples) ...
1202
+ * #
1203
+ * $conn = new CF_Authentication($auth);
1204
+ *
1205
+ * $public_container = $conn->get_container("public");
1206
+ *
1207
+ * # Disable CDN accessability
1208
+ * # ... still cached up to a month based on previous example
1209
+ * #
1210
+ * $public_container->make_private();
1211
+ * </code>
1212
+ *
1213
+ * @returns boolean True if successful
1214
+ * @throws CDNNotEnabledException CDN functionality not returned during auth
1215
+ * @throws AuthenticationException if auth token is not valid/expired
1216
+ * @throws InvalidResponseException unexpected response
1217
+ */
1218
+ function make_private()
1219
+ {
1220
+ if ($this->cfs_http->getCDNMUrl() == NULL) {
1221
+ throw new CDNNotEnabledException(
1222
+ "Authentication response did not indicate CDN availability");
1223
+ }
1224
+ list($status,$reason) = $this->cfs_http->remove_cdn_container($this->name);
1225
+ #if ($status == 401 && $this->_re_auth()) {
1226
+ # return $this->make_private();
1227
+ #}
1228
+ if (!in_array($status, array(202,404))) {
1229
+ throw new InvalidResponseException(
1230
+ "Invalid response (".$status."): ".$this->cfs_http->get_error());
1231
+ }
1232
+ $this->cdn_enabled = False;
1233
+ $this->cdn_ttl = NULL;
1234
+ $this->cdn_uri = NULL;
1235
+ $this->cdn_log_retention = NULL;
1236
+ $this->cdn_acl_user_agent = NULL;
1237
+ $this->cdn_acl_referrer = NULL;
1238
+ return True;
1239
+ }
1240
+
1241
+ /**
1242
+ * Check if this Container is being publicly served via CDN
1243
+ *
1244
+ * Use this method to determine if the Container's content is currently
1245
+ * available through the CDN.
1246
+ *
1247
+ * Example:
1248
+ * <code>
1249
+ * # ... authentication code excluded (see previous examples) ...
1250
+ * #
1251
+ * $conn = new CF_Authentication($auth);
1252
+ *
1253
+ * $public_container = $conn->get_container("public");
1254
+ *
1255
+ * # Display CDN accessability
1256
+ * #
1257
+ * $public_container->is_public() ? print "Yes" : print "No";
1258
+ * </code>
1259
+ *
1260
+ * @returns boolean True if enabled, False otherwise
1261
+ */
1262
+ function is_public()
1263
+ {
1264
+ return $this->cdn_enabled == True ? True : False;
1265
+ }
1266
+
1267
+ /**
1268
+ * Create a new remote storage Object
1269
+ *
1270
+ * Return a new Object instance. If the remote storage Object exists,
1271
+ * the instance's attributes are populated.
1272
+ *
1273
+ * Example:
1274
+ * <code>
1275
+ * # ... authentication code excluded (see previous examples) ...
1276
+ * #
1277
+ * $conn = new CF_Authentication($auth);
1278
+ *
1279
+ * $public_container = $conn->get_container("public");
1280
+ *
1281
+ * # This creates a local instance of a storage object but only creates
1282
+ * # it in the storage system when the object's write() method is called.
1283
+ * #
1284
+ * $pic = $public_container->create_object("baby.jpg");
1285
+ * </code>
1286
+ *
1287
+ * @param string $obj_name name of storage Object
1288
+ * @return obj CF_Object instance
1289
+ */
1290
+ function create_object($obj_name=NULL)
1291
+ {
1292
+ return new CF_Object($this, $obj_name);
1293
+ }
1294
+
1295
+ /**
1296
+ * Return an Object instance for the remote storage Object
1297
+ *
1298
+ * Given a name, return a Object instance representing the
1299
+ * remote storage object.
1300
+ *
1301
+ * Example:
1302
+ * <code>
1303
+ * # ... authentication code excluded (see previous examples) ...
1304
+ * #
1305
+ * $conn = new CF_Authentication($auth);
1306
+ *
1307
+ * $public_container = $conn->get_container("public");
1308
+ *
1309
+ * # This call only fetches header information and not the content of
1310
+ * # the storage object. Use the Object's read() or stream() methods
1311
+ * # to obtain the object's data.
1312
+ * #
1313
+ * $pic = $public_container->get_object("baby.jpg");
1314
+ * </code>
1315
+ *
1316
+ * @param string $obj_name name of storage Object
1317
+ * @return obj CF_Object instance
1318
+ */
1319
+ function get_object($obj_name=NULL)
1320
+ {
1321
+ return new CF_Object($this, $obj_name, True);
1322
+ }
1323
+
1324
+ /**
1325
+ * Return a list of Objects
1326
+ *
1327
+ * Return an array of strings listing the Object names in this Container.
1328
+ *
1329
+ * Example:
1330
+ * <code>
1331
+ * # ... authentication code excluded (see previous examples) ...
1332
+ * #
1333
+ * $images = $conn->get_container("my photos");
1334
+ *
1335
+ * # Grab the list of all storage objects
1336
+ * #
1337
+ * $all_objects = $images->list_objects();
1338
+ *
1339
+ * # Grab subsets of all storage objects
1340
+ * #
1341
+ * $first_ten = $images->list_objects(10);
1342
+ *
1343
+ * # Note the use of the previous result's last object name being
1344
+ * # used as the 'marker' parameter to fetch the next 10 objects
1345
+ * #
1346
+ * $next_ten = $images->list_objects(10, $first_ten[count($first_ten)-1]);
1347
+ *
1348
+ * # Grab images starting with "birthday_party" and default limit/marker
1349
+ * # to match all photos with that prefix
1350
+ * #
1351
+ * $prefixed = $images->list_objects(0, NULL, "birthday");
1352
+ *
1353
+ * # Assuming you have created the appropriate directory marker Objects,
1354
+ * # you can traverse your pseudo-hierarchical containers
1355
+ * # with the "path" argument.
1356
+ * #
1357
+ * $animals = $images->list_objects(0,NULL,NULL,"pictures/animals");
1358
+ * $dogs = $images->list_objects(0,NULL,NULL,"pictures/animals/dogs");
1359
+ * </code>
1360
+ *
1361
+ * @param int $limit <i>optional</i> only return $limit names
1362
+ * @param int $marker <i>optional</i> subset of names starting at $marker
1363
+ * @param string $prefix <i>optional</i> Objects whose names begin with $prefix
1364
+ * @param string $path <i>optional</i> only return results under "pathname"
1365
+ * @return array array of strings
1366
+ * @throws InvalidResponseException unexpected response
1367
+ */
1368
+ function list_objects($limit=0, $marker=NULL, $prefix=NULL, $path=NULL)
1369
+ {
1370
+ list($status, $reason, $obj_list) =
1371
+ $this->cfs_http->list_objects($this->name, $limit,
1372
+ $marker, $prefix, $path);
1373
+ #if ($status == 401 && $this->_re_auth()) {
1374
+ # return $this->list_objects($limit, $marker, $prefix, $path);
1375
+ #}
1376
+ if ($status < 200 || $status > 299) {
1377
+ throw new InvalidResponseException(
1378
+ "Invalid response (".$status."): ".$this->cfs_http->get_error());
1379
+ }
1380
+ return $obj_list;
1381
+ }
1382
+
1383
+ /**
1384
+ * Return an array of Objects
1385
+ *
1386
+ * Return an array of Object instances in this Container.
1387
+ *
1388
+ * Example:
1389
+ * <code>
1390
+ * # ... authentication code excluded (see previous examples) ...
1391
+ * #
1392
+ * $images = $conn->get_container("my photos");
1393
+ *
1394
+ * # Grab the list of all storage objects
1395
+ * #
1396
+ * $all_objects = $images->get_objects();
1397
+ *
1398
+ * # Grab subsets of all storage objects
1399
+ * #
1400
+ * $first_ten = $images->get_objects(10);
1401
+ *
1402
+ * # Note the use of the previous result's last object name being
1403
+ * # used as the 'marker' parameter to fetch the next 10 objects
1404
+ * #
1405
+ * $next_ten = $images->list_objects(10, $first_ten[count($first_ten)-1]);
1406
+ *
1407
+ * # Grab images starting with "birthday_party" and default limit/marker
1408
+ * # to match all photos with that prefix
1409
+ * #
1410
+ * $prefixed = $images->get_objects(0, NULL, "birthday");
1411
+ *
1412
+ * # Assuming you have created the appropriate directory marker Objects,
1413
+ * # you can traverse your pseudo-hierarchical containers
1414
+ * # with the "path" argument.
1415
+ * #
1416
+ * $animals = $images->get_objects(0,NULL,NULL,"pictures/animals");
1417
+ * $dogs = $images->get_objects(0,NULL,NULL,"pictures/animals/dogs");
1418
+ * </code>
1419
+ *
1420
+ * @param int $limit <i>optional</i> only return $limit names
1421
+ * @param int $marker <i>optional</i> subset of names starting at $marker
1422
+ * @param string $prefix <i>optional</i> Objects whose names begin with $prefix
1423
+ * @param string $path <i>optional</i> only return results under "pathname"
1424
+ * @return array array of strings
1425
+ * @throws InvalidResponseException unexpected response
1426
+ */
1427
+ function get_objects($limit=0, $marker=NULL, $prefix=NULL, $path=NULL)
1428
+ {
1429
+ list($status, $reason, $obj_array) =
1430
+ $this->cfs_http->get_objects($this->name, $limit,
1431
+ $marker, $prefix, $path);
1432
+ #if ($status == 401 && $this->_re_auth()) {
1433
+ # return $this->get_objects($limit, $marker, $prefix, $path);
1434
+ #}
1435
+ if ($status < 200 || $status > 299) {
1436
+ throw new InvalidResponseException(
1437
+ "Invalid response (".$status."): ".$this->cfs_http->get_error());
1438
+ }
1439
+ $objects = array();
1440
+ foreach ($obj_array as $obj) {
1441
+ $tmp = new CF_Object($this, $obj["name"], False, False);
1442
+ $tmp->content_type = $obj["content_type"];
1443
+ $tmp->content_length = (float) $obj["bytes"];
1444
+ $tmp->set_etag($obj["hash"]);
1445
+ $tmp->last_modified = $obj["last_modified"];
1446
+ $objects[] = $tmp;
1447
+ }
1448
+ return $objects;
1449
+ }
1450
+
1451
+ /**
1452
+ * Delete a remote storage Object
1453
+ *
1454
+ * Given an Object instance or name, permanently remove the remote Object
1455
+ * and all associated metadata.
1456
+ *
1457
+ * Example:
1458
+ * <code>
1459
+ * # ... authentication code excluded (see previous examples) ...
1460
+ * #
1461
+ * $conn = new CF_Authentication($auth);
1462
+ *
1463
+ * $images = $conn->get_container("my photos");
1464
+ *
1465
+ * # Delete specific object
1466
+ * #
1467
+ * $images->delete_object("disco_dancing.jpg");
1468
+ * </code>
1469
+ *
1470
+ * @param obj $obj name or instance of Object to delete
1471
+ * @return boolean <kbd>True</kbd> if successfully removed
1472
+ * @throws SyntaxException invalid Object name
1473
+ * @throws NoSuchObjectException remote Object does not exist
1474
+ * @throws InvalidResponseException unexpected response
1475
+ */
1476
+ function delete_object($obj)
1477
+ {
1478
+ $obj_name = NULL;
1479
+ if (is_object($obj)) {
1480
+ if (get_class($obj) == "CF_Object") {
1481
+ $obj_name = $obj->name;
1482
+ }
1483
+ }
1484
+ if (is_string($obj)) {
1485
+ $obj_name = $obj;
1486
+ }
1487
+ if (!$obj_name) {
1488
+ throw new SyntaxException("Object name not set.");
1489
+ }
1490
+ $status = $this->cfs_http->delete_object($this->name, $obj_name);
1491
+ #if ($status == 401 && $this->_re_auth()) {
1492
+ # return $this->delete_object($obj);
1493
+ #}
1494
+ if ($status == 404) {
1495
+ $m = "Specified object '".$this->name."/".$obj_name;
1496
+ $m.= "' did not exist to delete.";
1497
+ throw new NoSuchObjectException($m);
1498
+ }
1499
+ if ($status != 204) {
1500
+ throw new InvalidResponseException(
1501
+ "Invalid response (".$status."): ".$this->cfs_http->get_error());
1502
+ }
1503
+ return True;
1504
+ }
1505
+
1506
+ /**
1507
+ * Helper function to create "path" elements for a given Object name
1508
+ *
1509
+ * Given an Object whos name contains '/' path separators, this function
1510
+ * will create the "directory marker" Objects of one byte with the
1511
+ * Content-Type of "application/folder".
1512
+ *
1513
+ * It assumes the last element of the full path is the "real" Object
1514
+ * and does NOT create a remote storage Object for that last element.
1515
+ */
1516
+ function create_paths($path_name)
1517
+ {
1518
+ if ($path_name[0] == '/') {
1519
+ $path_name = mb_substr($path_name, 0, 1);
1520
+ }
1521
+ $elements = explode('/', $path_name, -1);
1522
+ $build_path = "";
1523
+ foreach ($elements as $idx => $val) {
1524
+ if (!$build_path) {
1525
+ $build_path = $val;
1526
+ } else {
1527
+ $build_path .= "/" . $val;
1528
+ }
1529
+ $obj = new CF_Object($this, $build_path);
1530
+ $obj->content_type = "application/directory";
1531
+ $obj->write(".", 1);
1532
+ }
1533
+ }
1534
+
1535
+ /**
1536
+ * Internal method to grab CDN/Container info if appropriate to do so
1537
+ *
1538
+ * @throws InvalidResponseException unexpected response
1539
+ */
1540
+ private function _cdn_initialize()
1541
+ {
1542
+ list($status, $reason, $cdn_enabled, $cdn_uri, $cdn_ttl,
1543
+ $cdn_log_retention, $cdn_acl_user_agent, $cdn_acl_referrer) =
1544
+ $this->cfs_http->head_cdn_container($this->name);
1545
+ #if ($status == 401 && $this->_re_auth()) {
1546
+ # return $this->_cdn_initialize();
1547
+ #}
1548
+ if (!in_array($status, array(204,404))) {
1549
+ throw new InvalidResponseException(
1550
+ "Invalid response (".$status."): ".$this->cfs_http->get_error());
1551
+ }
1552
+ $this->cdn_enabled = $cdn_enabled;
1553
+ $this->cdn_uri = $cdn_uri;
1554
+ $this->cdn_ttl = $cdn_ttl;
1555
+ $this->cdn_log_retention = $cdn_log_retention;
1556
+ $this->cdn_acl_user_agent = $cdn_acl_user_agent;
1557
+ $this->cdn_acl_referrer = $cdn_acl_referrer;
1558
+ }
1559
+
1560
+ #private function _re_auth()
1561
+ #{
1562
+ # $new_auth = new CF_Authentication(
1563
+ # $this->cfs_auth->username,
1564
+ # $this->cfs_auth->api_key,
1565
+ # $this->cfs_auth->auth_host,
1566
+ # $this->cfs_auth->account);
1567
+ # $new_auth->authenticate();
1568
+ # $this->cfs_auth = $new_auth;
1569
+ # $this->cfs_http->setCFAuth($this->cfs_auth);
1570
+ # return True;
1571
+ #}
1572
+ }
1573
+
1574
+
1575
+ /**
1576
+ * Object operations
1577
+ *
1578
+ * An Object is analogous to a file on a conventional filesystem. You can
1579
+ * read data from, or write data to your Objects. You can also associate
1580
+ * arbitrary metadata with them.
1581
+ *
1582
+ * @package php-cloudfiles
1583
+ */
1584
+ class CF_Object
1585
+ {
1586
+ public $container;
1587
+ public $name;
1588
+ public $last_modified;
1589
+ public $content_type;
1590
+ public $content_length;
1591
+ public $metadata;
1592
+ private $etag;
1593
+
1594
+ /**
1595
+ * Class constructor
1596
+ *
1597
+ * @param obj $container CF_Container instance
1598
+ * @param string $name name of Object
1599
+ * @param boolean $force_exists if set, throw an error if Object doesn't exist
1600
+ */
1601
+ function __construct(&$container, $name, $force_exists=False, $dohead=True)
1602
+ {
1603
+ if ($name[0] == "/") {
1604
+ $r = "Object name '".$name;
1605
+ $r .= "' cannot contain begin with a '/' character.";
1606
+ throw new SyntaxException($r);
1607
+ }
1608
+ if (strlen($name) > MAX_OBJECT_NAME_LEN) {
1609
+ throw new SyntaxException("Object name exceeds "
1610
+ . "maximum allowed length.");
1611
+ }
1612
+ $this->container = $container;
1613
+ $this->name = $name;
1614
+ $this->etag = NULL;
1615
+ $this->_etag_override = False;
1616
+ $this->last_modified = NULL;
1617
+ $this->content_type = NULL;
1618
+ $this->content_length = 0;
1619
+ $this->metadata = array();
1620
+ if ($dohead) {
1621
+ if (!$this->_initialize() && $force_exists) {
1622
+ throw new NoSuchObjectException("No such object '".$name."'");
1623
+ }
1624
+ }
1625
+ }
1626
+
1627
+ /**
1628
+ * String representation of Object
1629
+ *
1630
+ * Pretty print the Object's location and name
1631
+ *
1632
+ * @return string Object information
1633
+ */
1634
+ function __toString()
1635
+ {
1636
+ return $this->container->name . "/" . $this->name;
1637
+ }
1638
+
1639
+ /**
1640
+ * Internal check to get the proper mimetype.
1641
+ *
1642
+ * This function would go over the available PHP methods to get
1643
+ * the MIME type.
1644
+ *
1645
+ * By default it will try to use the PHP fileinfo library which is
1646
+ * available from PHP 5.3 or as an PECL extension
1647
+ * (http://pecl.php.net/package/Fileinfo).
1648
+ *
1649
+ * It will get the magic file by default from the system wide file
1650
+ * which is usually available in /usr/share/magic on Unix or try
1651
+ * to use the file specified in the source directory of the API
1652
+ * (share directory).
1653
+ *
1654
+ * if fileinfo is not available it will try to use the internal
1655
+ * mime_content_type function.
1656
+ *
1657
+ * @param string $handle name of file or buffer to guess the type from
1658
+ * @return boolean <kbd>True</kbd> if successful
1659
+ * @throws BadContentTypeException
1660
+ */
1661
+ function _guess_content_type($handle) {
1662
+ if ($this->content_type)
1663
+ return;
1664
+
1665
+ $this->content_type = w3_get_mime_type($handle);
1666
+
1667
+ if (!$this->content_type) {
1668
+ throw new BadContentTypeException("Required Content-Type not set");
1669
+ }
1670
+
1671
+ return True;
1672
+ }
1673
+
1674
+ /**
1675
+ * String representation of the Object's public URI
1676
+ *
1677
+ * A string representing the Object's public URI assuming that it's
1678
+ * parent Container is CDN-enabled.
1679
+ *
1680
+ * Example:
1681
+ * <code>
1682
+ * # ... authentication/connection/container code excluded
1683
+ * # ... see previous examples
1684
+ *
1685
+ * # Print out the Object's CDN URI (if it has one) in an HTML img-tag
1686
+ * #
1687
+ * print "<img src='$pic->public_uri()' />\n";
1688
+ * </code>
1689
+ *
1690
+ * @return string Object's public URI or NULL
1691
+ */
1692
+ function public_uri()
1693
+ {
1694
+ if ($this->container->cdn_enabled) {
1695
+ return $this->container->cdn_uri . "/" . $this->name;
1696
+ }
1697
+ return NULL;
1698
+ }
1699
+
1700
+ /**
1701
+ * Read the remote Object's data
1702
+ *
1703
+ * Returns the Object's data. This is useful for smaller Objects such
1704
+ * as images or office documents. Object's with larger content should use
1705
+ * the stream() method below.
1706
+ *
1707
+ * Pass in $hdrs array to set specific custom HTTP headers such as
1708
+ * If-Match, If-None-Match, If-Modified-Since, Range, etc.
1709
+ *
1710
+ * Example:
1711
+ * <code>
1712
+ * # ... authentication/connection/container code excluded
1713
+ * # ... see previous examples
1714
+ *
1715
+ * $my_docs = $conn->get_container("documents");
1716
+ * $doc = $my_docs->get_object("README");
1717
+ * $data = $doc->read(); # read image content into a string variable
1718
+ * print $data;
1719
+ *
1720
+ * # Or see stream() below for a different example.
1721
+ * #
1722
+ * </code>
1723
+ *
1724
+ * @param array $hdrs user-defined headers (Range, If-Match, etc.)
1725
+ * @return string Object's data
1726
+ * @throws InvalidResponseException unexpected response
1727
+ */
1728
+ function read($hdrs=array())
1729
+ {
1730
+ list($status, $reason, $data) =
1731
+ $this->container->cfs_http->get_object_to_string($this, $hdrs);
1732
+ #if ($status == 401 && $this->_re_auth()) {
1733
+ # return $this->read($hdrs);
1734
+ #}
1735
+ if (($status < 200) || ($status > 299
1736
+ && $status != 412 && $status != 304)) {
1737
+ throw new InvalidResponseException("Invalid response (".$status."): "
1738
+ . $this->container->cfs_http->get_error());
1739
+ }
1740
+ return $data;
1741
+ }
1742
+
1743
+ /**
1744
+ * Streaming read of Object's data
1745
+ *
1746
+ * Given an open PHP resource (see PHP's fopen() method), fetch the Object's
1747
+ * data and write it to the open resource handle. This is useful for
1748
+ * streaming an Object's content to the browser (videos, images) or for
1749
+ * fetching content to a local file.
1750
+ *
1751
+ * Pass in $hdrs array to set specific custom HTTP headers such as
1752
+ * If-Match, If-None-Match, If-Modified-Since, Range, etc.
1753
+ *
1754
+ * Example:
1755
+ * <code>
1756
+ * # ... authentication/connection/container code excluded
1757
+ * # ... see previous examples
1758
+ *
1759
+ * # Assuming this is a web script to display the README to the
1760
+ * # user's browser:
1761
+ * #
1762
+ * <?php
1763
+ * // grab README from storage system
1764
+ * //
1765
+ * $my_docs = $conn->get_container("documents");
1766
+ * $doc = $my_docs->get_object("README");
1767
+ *
1768
+ * // Hand it back to user's browser with appropriate content-type
1769
+ * //
1770
+ * header("Content-Type: " . $doc->content_type);
1771
+ * $output = fopen("php://output", "w");
1772
+ * $doc->stream($output); # stream object content to PHP's output buffer
1773
+ * fclose($output);
1774
+ * ?>
1775
+ *
1776
+ * # See read() above for a more simple example.
1777
+ * #
1778
+ * </code>
1779
+ *
1780
+ * @param resource $fp open resource for writing data to
1781
+ * @param array $hdrs user-defined headers (Range, If-Match, etc.)
1782
+ * @return string Object's data
1783
+ * @throws InvalidResponseException unexpected response
1784
+ */
1785
+ function stream(&$fp, $hdrs=array())
1786
+ {
1787
+ list($status, $reason) =
1788
+ $this->container->cfs_http->get_object_to_stream($this,$fp,$hdrs);
1789
+ #if ($status == 401 && $this->_re_auth()) {
1790
+ # return $this->stream($fp, $hdrs);
1791
+ #}
1792
+ if (($status < 200) || ($status > 299
1793
+ && $status != 412 && $status != 304)) {
1794
+ throw new InvalidResponseException("Invalid response (".$status."): "
1795
+ .$reason);
1796
+ }
1797
+ return True;
1798
+ }
1799
+
1800
+ /**
1801
+ * Store new Object metadata
1802
+ *
1803
+ * Write's an Object's metadata to the remote Object. This will overwrite
1804
+ * an prior Object metadata.
1805
+ *
1806
+ * Example:
1807
+ * <code>
1808
+ * # ... authentication/connection/container code excluded
1809
+ * # ... see previous examples
1810
+ *
1811
+ * $my_docs = $conn->get_container("documents");
1812
+ * $doc = $my_docs->get_object("README");
1813
+ *
1814
+ * # Define new metadata for the object
1815
+ * #
1816
+ * $doc->metadata = array(
1817
+ * "Author" => "EJ",
1818
+ * "Subject" => "How to use the PHP tests",
1819
+ * "Version" => "1.2.2"
1820
+ * );
1821
+ *
1822
+ * # Push the new metadata up to the storage system
1823
+ * #
1824
+ * $doc->sync_metadata();
1825
+ * </code>
1826
+ *
1827
+ * @return boolean <kbd>True</kbd> if successful, <kbd>False</kbd> otherwise
1828
+ * @throws InvalidResponseException unexpected response
1829
+ */
1830
+ function sync_metadata()
1831
+ {
1832
+ if (!empty($this->metadata)) {
1833
+ $status = $this->container->cfs_http->update_object($this);
1834
+ #if ($status == 401 && $this->_re_auth()) {
1835
+ # return $this->sync_metadata();
1836
+ #}
1837
+ if ($status != 202) {
1838
+ throw new InvalidResponseException("Invalid response ("
1839
+ .$status."): ".$this->container->cfs_http->get_error());
1840
+ }
1841
+ return True;
1842
+ }
1843
+ return False;
1844
+ }
1845
+
1846
+ /**
1847
+ * Upload Object's data to Cloud Files
1848
+ *
1849
+ * Write data to the remote Object. The $data argument can either be a
1850
+ * PHP resource open for reading (see PHP's fopen() method) or an in-memory
1851
+ * variable. If passing in a PHP resource, you must also include the $bytes
1852
+ * parameter.
1853
+ *
1854
+ * Example:
1855
+ * <code>
1856
+ * # ... authentication/connection/container code excluded
1857
+ * # ... see previous examples
1858
+ *
1859
+ * $my_docs = $conn->get_container("documents");
1860
+ * $doc = $my_docs->get_object("README");
1861
+ *
1862
+ * # Upload placeholder text in my README
1863
+ * #
1864
+ * $doc->write("This is just placeholder text for now...");
1865
+ * </code>
1866
+ *
1867
+ * @param string|resource $data string or open resource
1868
+ * @param float $bytes amount of data to upload (required for resources)
1869
+ * @param boolean $verify generate, send, and compare MD5 checksums
1870
+ * @return boolean <kbd>True</kbd> when data uploaded successfully
1871
+ * @throws SyntaxException missing required parameters
1872
+ * @throws BadContentTypeException if no Content-Type was/could be set
1873
+ * @throws MisMatchedChecksumException $verify is set and checksums unequal
1874
+ * @throws InvalidResponseException unexpected response
1875
+ */
1876
+ function write($data=NULL, $bytes=0, $verify=True)
1877
+ {
1878
+ if (!$data) {
1879
+ throw new SyntaxException("Missing data source.");
1880
+ }
1881
+ if ($bytes > MAX_OBJECT_SIZE) {
1882
+ throw new SyntaxException("Bytes exceeds maximum object size.");
1883
+ }
1884
+ if ($verify) {
1885
+ if (!$this->_etag_override) {
1886
+ $this->etag = $this->compute_md5sum($data);
1887
+ }
1888
+ } else {
1889
+ $this->etag = NULL;
1890
+ }
1891
+
1892
+ $close_fh = False;
1893
+ if (!is_resource($data)) {
1894
+ # A hack to treat string data as a file handle. php://memory feels
1895
+ # like a better option, but it seems to break on Windows so use
1896
+ # a temporary file instead.
1897
+ #
1898
+ $fp = fopen("php://temp", "wb+");
1899
+ #$fp = fopen("php://memory", "wb+");
1900
+ fwrite($fp, $data, strlen($data));
1901
+ rewind($fp);
1902
+ $close_fh = True;
1903
+ $this->content_length = (float) strlen($data);
1904
+ if ($this->content_length > MAX_OBJECT_SIZE) {
1905
+ throw new SyntaxException("Data exceeds maximum object size");
1906
+ }
1907
+ $ct_data = substr($data, 0, 64);
1908
+ } else {
1909
+ $this->content_length = $bytes;
1910
+ $fp = $data;
1911
+ $ct_data = fread($data, 64);
1912
+ rewind($data);
1913
+ }
1914
+
1915
+ $this->_guess_content_type($ct_data);
1916
+
1917
+ list($status, $reason, $etag) =
1918
+ $this->container->cfs_http->put_object($this, $fp);
1919
+ #if ($status == 401 && $this->_re_auth()) {
1920
+ # return $this->write($data, $bytes, $verify);
1921
+ #}
1922
+ if ($status == 412) {
1923
+ if ($close_fh) { fclose($fp); }
1924
+ throw new SyntaxException("Missing Content-Type header");
1925
+ }
1926
+ if ($status == 422) {
1927
+ if ($close_fh) { fclose($fp); }
1928
+ throw new MisMatchedChecksumException(
1929
+ "Supplied and computed checksums do not match.");
1930
+ }
1931
+ if ($status != 201) {
1932
+ if ($close_fh) { fclose($fp); }
1933
+ throw new InvalidResponseException("Invalid response (".$status."): "
1934
+ . $this->container->cfs_http->get_error());
1935
+ }
1936
+ if (!$verify) {
1937
+ $this->etag = $etag;
1938
+ }
1939
+ if ($close_fh) { fclose($fp); }
1940
+ return True;
1941
+ }
1942
+
1943
+ /**
1944
+ * Upload Object data from local filename
1945
+ *
1946
+ * This is a convenience function to upload the data from a local file. A
1947
+ * True value for $verify will cause the method to compute the Object's MD5
1948
+ * checksum prior to uploading.
1949
+ *
1950
+ * Example:
1951
+ * <code>
1952
+ * # ... authentication/connection/container code excluded
1953
+ * # ... see previous examples
1954
+ *
1955
+ * $my_docs = $conn->get_container("documents");
1956
+ * $doc = $my_docs->get_object("README");
1957
+ *
1958
+ * # Upload my local README's content
1959
+ * #
1960
+ * $doc->load_from_filename("/home/ej/cloudfiles/readme");
1961
+ * </code>
1962
+ *
1963
+ * @param string $filename full path to local file
1964
+ * @param boolean $verify enable local/remote MD5 checksum validation
1965
+ * @return boolean <kbd>True</kbd> if data uploaded successfully
1966
+ * @throws SyntaxException missing required parameters
1967
+ * @throws BadContentTypeException if no Content-Type was/could be set
1968
+ * @throws MisMatchedChecksumException $verify is set and checksums unequal
1969
+ * @throws InvalidResponseException unexpected response
1970
+ * @throws IOException error opening file
1971
+ */
1972
+ function load_from_filename($filename, $verify=True)
1973
+ {
1974
+ $fp = @fopen($filename, "r");
1975
+ if (!$fp) {
1976
+ throw new IOException("Could not open file for reading: ".$filename);
1977
+ }
1978
+
1979
+ clearstatcache();
1980
+
1981
+ $size = (float) sprintf("%u", filesize($filename));
1982
+ if ($size > MAX_OBJECT_SIZE) {
1983
+ throw new SyntaxException("File size exceeds maximum object size.");
1984
+ }
1985
+
1986
+ $this->_guess_content_type($filename);
1987
+
1988
+ $this->write($fp, $size, $verify);
1989
+ fclose($fp);
1990
+ return True;
1991
+ }
1992
+
1993
+ /**
1994
+ * Save Object's data to local filename
1995
+ *
1996
+ * Given a local filename, the Object's data will be written to the newly
1997
+ * created file.
1998
+ *
1999
+ * Example:
2000
+ * <code>
2001
+ * # ... authentication/connection/container code excluded
2002
+ * # ... see previous examples
2003
+ *
2004
+ * # Whoops! I deleted my local README, let me download/save it
2005
+ * #
2006
+ * $my_docs = $conn->get_container("documents");
2007
+ * $doc = $my_docs->get_object("README");
2008
+ *
2009
+ * $doc->save_to_filename("/home/ej/cloudfiles/readme.restored");
2010
+ * </code>
2011
+ *
2012
+ * @param string $filename name of local file to write data to
2013
+ * @return boolean <kbd>True</kbd> if successful
2014
+ * @throws IOException error opening file
2015
+ * @throws InvalidResponseException unexpected response
2016
+ */
2017
+ function save_to_filename($filename)
2018
+ {
2019
+ $fp = @fopen($filename, "wb");
2020
+ if (!$fp) {
2021
+ throw new IOException("Could not open file for writing: ".$filename);
2022
+ }
2023
+ $result = $this->stream($fp);
2024
+ fclose($fp);
2025
+ return $result;
2026
+ }
2027
+
2028
+ /**
2029
+ * Set Object's MD5 checksum
2030
+ *
2031
+ * Manually set the Object's ETag. Including the ETag is mandatory for
2032
+ * Cloud Files to perform end-to-end verification. Omitting the ETag forces
2033
+ * the user to handle any data integrity checks.
2034
+ *
2035
+ * @param string $etag MD5 checksum hexidecimal string
2036
+ */
2037
+ function set_etag($etag)
2038
+ {
2039
+ $this->etag = $etag;
2040
+ $this->_etag_override = True;
2041
+ }
2042
+
2043
+ /**
2044
+ * Object's MD5 checksum
2045
+ *
2046
+ * Accessor method for reading Object's private ETag attribute.
2047
+ *
2048
+ * @return string MD5 checksum hexidecimal string
2049
+ */
2050
+ function getETag()
2051
+ {
2052
+ return $this->etag;
2053
+ }
2054
+
2055
+ /**
2056
+ * Compute the MD5 checksum
2057
+ *
2058
+ * Calculate the MD5 checksum on either a PHP resource or data. The argument
2059
+ * may either be a local filename, open resource for reading, or a string.
2060
+ *
2061
+ * <b>WARNING:</b> if you are uploading a big file over a stream
2062
+ * it could get very slow to compute the md5 you probably want to
2063
+ * set the $verify parameter to False in the write() method and
2064
+ * compute yourself the md5 before if you have it.
2065
+ *
2066
+ * @param filename|obj|string $data filename, open resource, or string
2067
+ * @return string MD5 checksum hexidecimal string
2068
+ */
2069
+ function compute_md5sum(&$data)
2070
+ {
2071
+
2072
+ if (function_exists("hash_init") && is_resource($data)) {
2073
+ $ctx = hash_init('md5');
2074
+ while (!feof($data)) {
2075
+ $buffer = fgets($data, 65536);
2076
+ hash_update($ctx, $buffer);
2077
+ }
2078
+ $md5 = hash_final($ctx, false);
2079
+ rewind($data);
2080
+ } elseif ((string)is_file($data)) {
2081
+ $md5 = md5_file($data);
2082
+ } else {
2083
+ $md5 = md5($data);
2084
+ }
2085
+ return $md5;
2086
+ }
2087
+
2088
+ /**
2089
+ * PRIVATE: fetch information about the remote Object if it exists
2090
+ */
2091
+ private function _initialize()
2092
+ {
2093
+ list($status, $reason, $etag, $last_modified, $content_type,
2094
+ $content_length, $metadata) =
2095
+ $this->container->cfs_http->head_object($this);
2096
+ #if ($status == 401 && $this->_re_auth()) {
2097
+ # return $this->_initialize();
2098
+ #}
2099
+ if ($status == 404) {
2100
+ return False;
2101
+ }
2102
+ if ($status < 200 || $status > 299) {
2103
+ throw new InvalidResponseException("Invalid response (".$status."): "
2104
+ . $this->container->cfs_http->get_error());
2105
+ }
2106
+ $this->etag = $etag;
2107
+ $this->last_modified = $last_modified;
2108
+ $this->content_type = $content_type;
2109
+ $this->content_length = $content_length;
2110
+ $this->metadata = $metadata;
2111
+ return True;
2112
+ }
2113
+
2114
+ #private function _re_auth()
2115
+ #{
2116
+ # $new_auth = new CF_Authentication(
2117
+ # $this->cfs_auth->username,
2118
+ # $this->cfs_auth->api_key,
2119
+ # $this->cfs_auth->auth_host,
2120
+ # $this->cfs_auth->account);
2121
+ # $new_auth->authenticate();
2122
+ # $this->container->cfs_auth = $new_auth;
2123
+ # $this->container->cfs_http->setCFAuth($this->cfs_auth);
2124
+ # return True;
2125
+ #}
2126
+ }
2127
+
2128
+ /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
2129
+
2130
+ /*
2131
+ * Local variables:
2132
+ * tab-width: 4
2133
+ * c-basic-offset: 4
2134
+ * c-hanging-comment-ender-p: nil
2135
+ * End:
2136
+ */
2137
+ ?>
lib/CF/cloudfiles_exceptions.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Custom Exceptions for the CloudFiles API
4
+ *
5
+ * Requres PHP 5.x (for Exceptions and OO syntax)
6
+ *
7
+ * See COPYING for license information.
8
+ *
9
+ * @author Eric "EJ" Johnson <ej@racklabs.com>
10
+ * @copyright Copyright (c) 2008, Rackspace US, Inc.
11
+ * @package php-cloudfiles-exceptions
12
+ */
13
+
14
+ /**
15
+ * Custom Exceptions for the CloudFiles API
16
+ * @package php-cloudfiles-exceptions
17
+ */
18
+ class SyntaxException extends Exception { }
19
+ class AuthenticationException extends Exception { }
20
+ class InvalidResponseException extends Exception { }
21
+ class NonEmptyContainerException extends Exception { }
22
+ class NoSuchObjectException extends Exception { }
23
+ class NoSuchContainerException extends Exception { }
24
+ class NoSuchAccountException extends Exception { }
25
+ class MisMatchedChecksumException extends Exception { }
26
+ class IOException extends Exception { }
27
+ class CDNNotEnabledException extends Exception { }
28
+ class BadContentTypeException extends Exception { }
29
+ class InvalidUTF8Exception extends Exception { }
30
+ class ConnectionNotOpenException extends Exception { }
31
+
32
+ /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
33
+
34
+ /*
35
+ * Local variables:
36
+ * tab-width: 4
37
+ * c-basic-offset: 4
38
+ * c-hanging-comment-ender-p: nil
39
+ * End:
40
+ */
41
+ ?>
lib/CF/cloudfiles_http.php ADDED
@@ -0,0 +1,1338 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * This is an HTTP client class for Cloud Files. It uses PHP's cURL module
4
+ * to handle the actual HTTP request/response. This is NOT a generic HTTP
5
+ * client class and is only used to abstract out the HTTP communication for
6
+ * the PHP Cloud Files API.
7
+ *
8
+ * This module was designed to re-use existing HTTP(S) connections between
9
+ * subsequent operations. For example, performing multiple PUT operations
10
+ * will re-use the same connection.
11
+ *
12
+ * This modules also provides support for streaming content into and out
13
+ * of Cloud Files. The majority (all?) of the PHP HTTP client modules expect
14
+ * to read the server's response into a string variable. This will not work
15
+ * with large files without killing your server. Methods like,
16
+ * get_object_to_stream() and put_object() take an open filehandle
17
+ * argument for streaming data out of or into Cloud Files.
18
+ *
19
+ * Requres PHP 5.x (for Exceptions and OO syntax)
20
+ *
21
+ * See COPYING for license information.
22
+ *
23
+ * @author Eric "EJ" Johnson <ej@racklabs.com>
24
+ * @copyright Copyright (c) 2008, Rackspace US, Inc.
25
+ * @package php-cloudfiles-http
26
+ */
27
+
28
+ /**
29
+ */
30
+ require_once("cloudfiles_exceptions.php");
31
+
32
+ define("PHP_CF_VERSION", "1.7.0");
33
+ define("USER_AGENT", sprintf("PHP-CloudFiles/%s", PHP_CF_VERSION));
34
+ define("ACCOUNT_CONTAINER_COUNT", "X-Account-Container-Count");
35
+ define("ACCOUNT_BYTES_USED", "X-Account-Bytes-Used");
36
+ define("CONTAINER_OBJ_COUNT", "X-Container-Object-Count");
37
+ define("CONTAINER_BYTES_USED", "X-Container-Bytes-Used");
38
+ define("METADATA_HEADER", "X-Object-Meta-");
39
+ define("CDN_URI", "X-CDN-URI");
40
+ define("CDN_ENABLED", "X-CDN-Enabled");
41
+ define("CDN_LOG_RETENTION", "X-Log-Retention");
42
+ define("CDN_ACL_USER_AGENT", "X-User-Agent-ACL");
43
+ define("CDN_ACL_REFERRER", "X-Referrer-ACL");
44
+ define("CDN_TTL", "X-TTL");
45
+ define("CDNM_URL", "X-CDN-Management-Url");
46
+ define("STORAGE_URL", "X-Storage-Url");
47
+ define("AUTH_TOKEN", "X-Auth-Token");
48
+ define("AUTH_USER_HEADER", "X-Auth-User");
49
+ define("AUTH_KEY_HEADER", "X-Auth-Key");
50
+ define("AUTH_USER_HEADER_LEGACY", "X-Storage-User");
51
+ define("AUTH_KEY_HEADER_LEGACY", "X-Storage-Pass");
52
+ define("AUTH_TOKEN_LEGACY", "X-Storage-Token");
53
+
54
+ /**
55
+ * HTTP/cURL wrapper for Cloud Files
56
+ *
57
+ * This class should not be used directly. It's only purpose is to abstract
58
+ * out the HTTP communication from the main API.
59
+ *
60
+ * @package php-cloudfiles-http
61
+ */
62
+ class CF_Http
63
+ {
64
+ private $error_str;
65
+ private $dbug;
66
+ private $cabundle_path;
67
+ private $api_version;
68
+
69
+ # Authentication instance variables
70
+ #
71
+ private $storage_url;
72
+ private $cdnm_url;
73
+ private $auth_token;
74
+
75
+ # Request/response variables
76
+ #
77
+ private $response_status;
78
+ private $response_reason;
79
+ private $connections;
80
+
81
+ # Variables used for content/header callbacks
82
+ #
83
+ private $_user_read_progress_callback_func;
84
+ private $_user_write_progress_callback_func;
85
+ private $_write_callback_type;
86
+ private $_text_list;
87
+ private $_account_container_count;
88
+ private $_account_bytes_used;
89
+ private $_container_object_count;
90
+ private $_container_bytes_used;
91
+ private $_obj_etag;
92
+ private $_obj_last_modified;
93
+ private $_obj_content_type;
94
+ private $_obj_content_length;
95
+ private $_obj_metadata;
96
+ private $_obj_write_resource;
97
+ private $_obj_write_string;
98
+ private $_cdn_enabled;
99
+ private $_cdn_uri;
100
+ private $_cdn_ttl;
101
+ private $_cdn_log_retention;
102
+ private $_cdn_acl_user_agent;
103
+ private $_cdn_acl_referrer;
104
+
105
+ function __construct($api_version)
106
+ {
107
+ $this->dbug = False;
108
+ $this->cabundle_path = NULL;
109
+ $this->api_version = $api_version;
110
+ $this->error_str = NULL;
111
+
112
+ $this->storage_url = NULL;
113
+ $this->cdnm_url = NULL;
114
+ $this->auth_token = NULL;
115
+
116
+ $this->response_status = NULL;
117
+ $this->response_reason = NULL;
118
+
119
+ # Curl connections array - since there is no way to "re-set" the
120
+ # connection paramaters for a cURL handle, we keep an array of
121
+ # the unique use-cases and funnel all of those same type
122
+ # requests through the appropriate curl connection.
123
+ #
124
+ $this->connections = array(
125
+ "GET_CALL" => NULL, # GET objects/containers/lists
126
+ "PUT_OBJ" => NULL, # PUT object
127
+ "HEAD" => NULL, # HEAD requests
128
+ "PUT_CONT" => NULL, # PUT container
129
+ "DEL_POST" => NULL, # DELETE containers/objects, POST objects
130
+ );
131
+
132
+ $this->_user_read_progress_callback_func = NULL;
133
+ $this->_user_write_progress_callback_func = NULL;
134
+ $this->_write_callback_type = NULL;
135
+ $this->_text_list = array();
136
+ $this->_return_list = NULL;
137
+ $this->_account_container_count = 0;
138
+ $this->_account_bytes_used = 0;
139
+ $this->_container_object_count = 0;
140
+ $this->_container_bytes_used = 0;
141
+ $this->_obj_write_resource = NULL;
142
+ $this->_obj_write_string = "";
143
+ $this->_obj_etag = NULL;
144
+ $this->_obj_last_modified = NULL;
145
+ $this->_obj_content_type = NULL;
146
+ $this->_obj_content_length = NULL;
147
+ $this->_obj_metadata = array();
148
+ $this->_cdn_enabled = NULL;
149
+ $this->_cdn_uri = NULL;
150
+ $this->_cdn_ttl = NULL;
151
+ $this->_cdn_log_retention = NULL;
152
+ $this->_cdn_acl_user_agent = NULL;
153
+ $this->_cdn_acl_referrer = NULL;
154
+
155
+ # The OS list with a PHP without an updated CA File for CURL to
156
+ # connect to SSL Websites. It is the first 3 letters of the PHP_OS
157
+ # variable.
158
+ $OS_CAFILE_NONUPDATED=array(
159
+ "win",
160
+ );
161
+
162
+ if (in_array((strtolower (substr(PHP_OS, 0,3))), $OS_CAFILE_NONUPDATED))
163
+ $this->ssl_use_cabundle();
164
+
165
+ }
166
+
167
+ function ssl_use_cabundle($path=NULL)
168
+ {
169
+ if ($path) {
170
+ $this->cabundle_path = $path;
171
+ } else {
172
+ $this->cabundle_path = dirname(__FILE__) . "/cacert.pem";
173
+ }
174
+ if (!file_exists($this->cabundle_path)) {
175
+ throw new IOException("Could not use CA bundle: "
176
+ . $this->cabundle_path);
177
+ }
178
+ return;
179
+ }
180
+
181
+ # Uses separate cURL connection to authenticate
182
+ #
183
+ function authenticate($user, $pass, $acct=NULL, $host=NULL)
184
+ {
185
+ $path = array();
186
+ if (isset($acct) || isset($host)) {
187
+ $headers = array(
188
+ sprintf("%s: %s", AUTH_USER_HEADER_LEGACY, $user),
189
+ sprintf("%s: %s", AUTH_KEY_HEADER_LEGACY, $pass),
190
+ );
191
+ $path[] = $host;
192
+ $path[] = rawurlencode(sprintf("v%d",$this->api_version));
193
+ $path[] = rawurlencode($acct);
194
+ } else {
195
+ $headers = array(
196
+ sprintf("%s: %s", AUTH_USER_HEADER, $user),
197
+ sprintf("%s: %s", AUTH_KEY_HEADER, $pass),
198
+ );
199
+ $path[] = "https://auth.api.rackspacecloud.com";
200
+ }
201
+ $path[] = "v1.0";
202
+ $url = implode("/", $path);
203
+
204
+ $curl_ch = curl_init();
205
+ if (!is_null($this->cabundle_path)) {
206
+ curl_setopt($curl_ch, CURLOPT_SSL_VERIFYPEER, True);
207
+ curl_setopt($curl_ch, CURLOPT_CAINFO, $this->cabundle_path);
208
+ }
209
+ curl_setopt($curl_ch, CURLOPT_VERBOSE, $this->dbug);
210
+ curl_setopt($curl_ch, CURLOPT_FOLLOWLOCATION, 1);
211
+ curl_setopt($curl_ch, CURLOPT_MAXREDIRS, 4);
212
+ curl_setopt($curl_ch, CURLOPT_HEADER, 0);
213
+ curl_setopt($curl_ch, CURLOPT_HTTPHEADER, $headers);
214
+ curl_setopt($curl_ch, CURLOPT_USERAGENT, USER_AGENT);
215
+ curl_setopt($curl_ch, CURLOPT_RETURNTRANSFER, TRUE);
216
+ curl_setopt($curl_ch, CURLOPT_HEADERFUNCTION,array(&$this,'_auth_hdr_cb'));
217
+ curl_setopt($curl_ch, CURLOPT_URL, $url);
218
+ curl_exec($curl_ch);
219
+ curl_close($curl_ch);
220
+
221
+ return array($this->response_status, $this->response_reason,
222
+ $this->storage_url, $this->cdnm_url, $this->auth_token);
223
+ }
224
+
225
+ # (CDN) GET /v1/Account
226
+ #
227
+ function list_cdn_containers()
228
+ {
229
+ $conn_type = "GET_CALL";
230
+ $url_path = $this->_make_path("CDN", $container_name);
231
+
232
+ $this->_write_callback_type = "TEXT_LIST";
233
+ $return_code = $this->_send_request($conn_type, $url_path);
234
+
235
+ if (!$return_code) {
236
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
237
+ array(0,$this->error_str,array());
238
+ }
239
+ if ($return_code == 401) {
240
+ return array($return_code,"Unauthorized",array());
241
+ }
242
+ if ($return_code == 404) {
243
+ return array($return_code,"Account not found.",array());
244
+ }
245
+ if ($return_code == 204) {
246
+ return array($return_code,"Account has no CDN enabled Containers.",
247
+ array());
248
+ }
249
+ if ($return_code == 200) {
250
+ $this->create_array();
251
+ return array($return_code,$this->response_reason,$this->_text_list);
252
+ }
253
+ $this->error_str = "Unexpected HTTP response: ".$this->response_reason;
254
+ return array($return_code,$this->error_str,array());
255
+ }
256
+
257
+ # (CDN) POST /v1/Account/Container
258
+ #
259
+ function update_cdn_container($container_name, $ttl=86400, $cdn_log_retention=False,
260
+ $cdn_acl_user_agent="", $cdn_acl_referrer)
261
+ {
262
+ if ($container_name == "")
263
+ throw new SyntaxException("Container name not set.");
264
+
265
+ if ($container_name != "0" and !isset($container_name))
266
+ throw new SyntaxException("Container name not set.");
267
+
268
+ $url_path = $this->_make_path("CDN", $container_name);
269
+ $hdrs = array(
270
+ CDN_ENABLED => "True",
271
+ CDN_TTL => $ttl,
272
+ CDN_LOG_RETENTION => $cdn_log_retention ? "True" : "False",
273
+ CDN_ACL_USER_AGENT => $cdn_acl_user_agent,
274
+ CDN_ACL_REFERRER => $cdn_acl_referrer,
275
+ );
276
+ $return_code = $this->_send_request("DEL_POST",$url_path,$hdrs,"POST");
277
+ if ($return_code == 401) {
278
+ $this->error_str = "Unauthorized";
279
+ return array($return_code, $this->error_str, NULL);
280
+ }
281
+ if ($return_code == 404) {
282
+ $this->error_str = "Container not found.";
283
+ return array($return_code, $this->error_str, NULL);
284
+ }
285
+ if ($return_code != 202) {
286
+ $this->error_str="Unexpected HTTP response: ".$this->response_reason;
287
+ return array($return_code, $this->error_str, NULL);
288
+ }
289
+ return array($return_code, "Accepted", $this->_cdn_uri);
290
+
291
+ }
292
+
293
+ # (CDN) PUT /v1/Account/Container
294
+ #
295
+ function add_cdn_container($container_name, $ttl=86400)
296
+ {
297
+ if ($container_name == "")
298
+ throw new SyntaxException("Container name not set.");
299
+
300
+ if ($container_name != "0" and !isset($container_name))
301
+ throw new SyntaxException("Container name not set.");
302
+
303
+ $url_path = $this->_make_path("CDN", $container_name);
304
+ $hdrs = array(
305
+ CDN_ENABLED => "True",
306
+ CDN_TTL => $ttl,
307
+ );
308
+ $return_code = $this->_send_request("PUT_CONT", $url_path, $hdrs);
309
+ if ($return_code == 401) {
310
+ $this->error_str = "Unauthorized";
311
+ return array($return_code,$this->response_reason,False);
312
+ }
313
+ if (!in_array($return_code, array(201,202))) {
314
+ $this->error_str="Unexpected HTTP response: ".$this->response_reason;
315
+ return array($return_code,$this->response_reason,False);
316
+ }
317
+ return array($return_code,$this->response_reason,$this->_cdn_uri);
318
+ }
319
+
320
+ # (CDN) POST /v1/Account/Container
321
+ #
322
+ function remove_cdn_container($container_name)
323
+ {
324
+ if ($container_name == "")
325
+ throw new SyntaxException("Container name not set.");
326
+
327
+ if ($container_name != "0" and !isset($container_name))
328
+ throw new SyntaxException("Container name not set.");
329
+
330
+ $url_path = $this->_make_path("CDN", $container_name);
331
+ $hdrs = array(CDN_ENABLED => "False");
332
+ $return_code = $this->_send_request("DEL_POST",$url_path,$hdrs,"POST");
333
+ if ($return_code == 401) {
334
+ $this->error_str = "Unauthorized";
335
+ return array($return_code, $this->error_str);
336
+ }
337
+ if ($return_code == 404) {
338
+ $this->error_str = "Container not found.";
339
+ return array($return_code, $this->error_str);
340
+ }
341
+ if ($return_code != 202) {
342
+ $this->error_str="Unexpected HTTP response: ".$this->response_reason;
343
+ return array($return_code, $this->error_str);
344
+ }
345
+ return array($return_code, "Accepted");
346
+ }
347
+
348
+ # (CDN) HEAD /v1/Account
349
+ #
350
+ function head_cdn_container($container_name)
351
+ {
352
+ if ($container_name == "")
353
+ throw new SyntaxException("Container name not set.");
354
+
355
+ if ($container_name != "0" and !isset($container_name))
356
+ throw new SyntaxException("Container name not set.");
357
+
358
+ $conn_type = "HEAD";
359
+ $url_path = $this->_make_path("CDN", $container_name);
360
+ $return_code = $this->_send_request($conn_type, $url_path);
361
+
362
+ if (!$return_code) {
363
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
364
+ return array(0,$this->error_str,NULL,NULL,NULL,NULL,NULL,NULL);
365
+ }
366
+ if ($return_code == 401) {
367
+ return array($return_code,"Unauthorized",NULL,NULL,NULL,NULL,NULL,NULL);
368
+ }
369
+ if ($return_code == 404) {
370
+ return array($return_code,"Account not found.",NULL,NULL,NULL,NULL,NULL,NULL);
371
+ }
372
+ if ($return_code == 204) {
373
+ return array($return_code,$this->response_reason,
374
+ $this->_cdn_enabled, $this->_cdn_uri, $this->_cdn_ttl,
375
+ $this->_cdn_log_retention,
376
+ $this->_cdn_acl_user_agent,
377
+ $this->_cdn_acl_referrer
378
+ );
379
+ }
380
+ return array($return_code,$this->response_reason,
381
+ NULL,NULL,NULL,
382
+ $this->_cdn_log_retention,
383
+ $this->_cdn_acl_user_agent,
384
+ $this->_cdn_acl_referrer
385
+ );
386
+ }
387
+
388
+ # GET /v1/Account
389
+ #
390
+ function list_containers($limit=0, $marker=NULL)
391
+ {
392
+ $conn_type = "GET_CALL";
393
+ $url_path = $this->_make_path();
394
+
395
+ $limit = intval($limit);
396
+ $params = array();
397
+ if ($limit > 0) {
398
+ $params[] = "limit=$limit";
399
+ }
400
+ if ($marker) {
401
+ $params[] = "marker=".rawurlencode($marker);
402
+ }
403
+ if (!empty($params)) {
404
+ $url_path .= "?" . implode("&", $params);
405
+ }
406
+
407
+ $this->_write_callback_type = "TEXT_LIST";
408
+ $return_code = $this->_send_request($conn_type, $url_path);
409
+
410
+ if (!$return_code) {
411
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
412
+ return array(0,$this->error_str,array());
413
+ }
414
+ if ($return_code == 204) {
415
+ return array($return_code, "Account has no containers.", array());
416
+ }
417
+ if ($return_code == 404) {
418
+ $this->error_str = "Invalid account name for authentication token.";
419
+ return array($return_code,$this->error_str,array());
420
+ }
421
+ if ($return_code == 200) {
422
+ $this->create_array();
423
+ return array($return_code, $this->response_reason, $this->_text_list);
424
+ }
425
+ $this->error_str = "Unexpected HTTP response: ".$this->response_reason;
426
+ return array($return_code,$this->error_str,array());
427
+ }
428
+
429
+ # GET /v1/Account?format=json
430
+ #
431
+ function list_containers_info($limit=0, $marker=NULL)
432
+ {
433
+ $conn_type = "GET_CALL";
434
+ $url_path = $this->_make_path() . "?format=json";
435
+
436
+ $limit = intval($limit);
437
+ $params = array();
438
+ if ($limit > 0) {
439
+ $params[] = "limit=$limit";
440
+ }
441
+ if ($marker) {
442
+ $params[] = "marker=".rawurlencode($marker);
443
+ }
444
+ if (!empty($params)) {
445
+ $url_path .= "&" . implode("&", $params);
446
+ }
447
+
448
+ $this->_write_callback_type = "OBJECT_STRING";
449
+ $return_code = $this->_send_request($conn_type, $url_path);
450
+
451
+ if (!$return_code) {
452
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
453
+ return array(0,$this->error_str,array());
454
+ }
455
+ if ($return_code == 204) {
456
+ return array($return_code, "Account has no containers.", array());
457
+ }
458
+ if ($return_code == 404) {
459
+ $this->error_str = "Invalid account name for authentication token.";
460
+ return array($return_code,$this->error_str,array());
461
+ }
462
+ if ($return_code == 200) {
463
+ $json_body = json_decode($this->_obj_write_string, True);
464
+ return array($return_code, $this->response_reason, $json_body);
465
+ }
466
+ $this->error_str = "Unexpected HTTP response: ".$this->response_reason;
467
+ return array($return_code,$this->error_str,array());
468
+ }
469
+
470
+ # HEAD /v1/Account
471
+ #
472
+ function head_account()
473
+ {
474
+ $conn_type = "HEAD";
475
+
476
+ $url_path = $this->_make_path();
477
+ $return_code = $this->_send_request($conn_type,$url_path);
478
+
479
+ if (!$return_code) {
480
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
481
+ array(0,$this->error_str,0,0);
482
+ }
483
+ if ($return_code == 404) {
484
+ return array($return_code,"Account not found.",0,0);
485
+ }
486
+ if ($return_code == 204) {
487
+ return array($return_code,$this->response_reason,
488
+ $this->_account_container_count, $this->_account_bytes_used);
489
+ }
490
+ return array($return_code,$this->response_reason,0,0);
491
+ }
492
+
493
+ # PUT /v1/Account/Container
494
+ #
495
+ function create_container($container_name)
496
+ {
497
+ if ($container_name == "")
498
+ throw new SyntaxException("Container name not set.");
499
+
500
+ if ($container_name != "0" and !isset($container_name))
501
+ throw new SyntaxException("Container name not set.");
502
+
503
+ $url_path = $this->_make_path("STORAGE", $container_name);
504
+ $return_code = $this->_send_request("PUT_CONT",$url_path);
505
+
506
+ if (!$return_code) {
507
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
508
+ return False;
509
+ }
510
+ return $return_code;
511
+ }
512
+
513
+ # DELETE /v1/Account/Container
514
+ #
515
+ function delete_container($container_name)
516
+ {
517
+ if ($container_name == "")
518
+ throw new SyntaxException("Container name not set.");
519
+
520
+ if ($container_name != "0" and !isset($container_name))
521
+ throw new SyntaxException("Container name not set.");
522
+
523
+ $url_path = $this->_make_path("STORAGE", $container_name);
524
+ $return_code = $this->_send_request("DEL_POST",$url_path,array(),"DELETE");
525
+
526
+ if (!$return_code) {
527
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
528
+ }
529
+ if ($return_code == 409) {
530
+ $this->error_str = "Container must be empty prior to removing it.";
531
+ }
532
+ if ($return_code == 404) {
533
+ $this->error_str = "Specified container did not exist to delete.";
534
+ }
535
+ if ($return_code != 204) {
536
+ $this->error_str = "Unexpected HTTP return code: $return_code.";
537
+ }
538
+ return $return_code;
539
+ }
540
+
541
+ # GET /v1/Account/Container
542
+ #
543
+ function list_objects($cname,$limit=0,$marker=NULL,$prefix=NULL,$path=NULL)
544
+ {
545
+ if (!$cname) {
546
+ $this->error_str = "Container name not set.";
547
+ return array(0, $this->error_str, array());
548
+ }
549
+
550
+ $url_path = $this->_make_path("STORAGE", $cname);
551
+
552
+ $limit = intval($limit);
553
+ $params = array();
554
+ if ($limit > 0) {
555
+ $params[] = "limit=$limit";
556
+ }
557
+ if ($marker) {
558
+ $params[] = "marker=".rawurlencode($marker);
559
+ }
560
+ if ($prefix) {
561
+ $params[] = "prefix=".rawurlencode($prefix);
562
+ }
563
+ if ($path) {
564
+ $params[] = "path=".rawurlencode($path);
565
+ }
566
+ if (!empty($params)) {
567
+ $url_path .= "?" . implode("&", $params);
568
+ }
569
+
570
+ $conn_type = "GET_CALL";
571
+ $this->_write_callback_type = "TEXT_LIST";
572
+ $return_code = $this->_send_request($conn_type,$url_path);
573
+
574
+ if (!$return_code) {
575
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
576
+ return array(0,$this->error_str,array());
577
+ }
578
+ if ($return_code == 204) {
579
+ $this->error_str = "Container has no Objects.";
580
+ return array($return_code,$this->error_str,array());
581
+ }
582
+ if ($return_code == 404) {
583
+ $this->error_str = "Container has no Objects.";
584
+ return array($return_code,$this->error_str,array());
585
+ }
586
+ if ($return_code == 200) {
587
+ $this->create_array();
588
+ return array($return_code,$this->response_reason, $this->_text_list);
589
+ }
590
+ $this->error_str = "Unexpected HTTP response code: $return_code";
591
+ return array(0,$this->error_str,array());
592
+ }
593
+
594
+ # GET /v1/Account/Container?format=json
595
+ #
596
+ function get_objects($cname,$limit=0,$marker=NULL,$prefix=NULL,$path=NULL)
597
+ {
598
+ if (!$cname) {
599
+ $this->error_str = "Container name not set.";
600
+ return array(0, $this->error_str, array());
601
+ }
602
+
603
+ $url_path = $this->_make_path("STORAGE", $cname);
604
+
605
+ $limit = intval($limit);
606
+ $params = array();
607
+ $params[] = "format=json";
608
+ if ($limit > 0) {
609
+ $params[] = "limit=$limit";
610
+ }
611
+ if ($marker) {
612
+ $params[] = "marker=".rawurlencode($marker);
613
+ }
614
+ if ($prefix) {
615
+ $params[] = "prefix=".rawurlencode($prefix);
616
+ }
617
+ if ($path) {
618
+ $params[] = "path=".rawurlencode($path);
619
+ }
620
+ if (!empty($params)) {
621
+ $url_path .= "?" . implode("&", $params);
622
+ }
623
+
624
+ $conn_type = "GET_CALL";
625
+ $this->_write_callback_type = "OBJECT_STRING";
626
+ $return_code = $this->_send_request($conn_type,$url_path);
627
+
628
+ if (!$return_code) {
629
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
630
+ return array(0,$this->error_str,array());
631
+ }
632
+ if ($return_code == 204) {
633
+ $this->error_str = "Container has no Objects.";
634
+ return array($return_code,$this->error_str,array());
635
+ }
636
+ if ($return_code == 404) {
637
+ $this->error_str = "Container has no Objects.";
638
+ return array($return_code,$this->error_str,array());
639
+ }
640
+ if ($return_code == 200) {
641
+ $json_body = json_decode($this->_obj_write_string, True);
642
+ return array($return_code,$this->response_reason, $json_body);
643
+ }
644
+ $this->error_str = "Unexpected HTTP response code: $return_code";
645
+ return array(0,$this->error_str,array());
646
+ }
647
+
648
+
649
+ # HEAD /v1/Account/Container
650
+ #
651
+ function head_container($container_name)
652
+ {
653
+
654
+ if ($container_name == "") {
655
+ $this->error_str = "Container name not set.";
656
+ return False;
657
+ }
658
+
659
+ if ($container_name != "0" and !isset($container_name)) {
660
+ $this->error_str = "Container name not set.";
661
+ return False;
662
+ }
663
+
664
+ $conn_type = "HEAD";
665
+
666
+ $url_path = $this->_make_path("STORAGE", $container_name);
667
+ $return_code = $this->_send_request($conn_type,$url_path);
668
+
669
+ if (!$return_code) {
670
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
671
+ array(0,$this->error_str,0,0);
672
+ }
673
+ if ($return_code == 404) {
674
+ return array($return_code,"Container not found.",0,0);
675
+ }
676
+ if ($return_code == 204 || $return_code == 200) {
677
+ return array($return_code,$this->response_reason,
678
+ $this->_container_object_count, $this->_container_bytes_used);
679
+ }
680
+ return array($return_code,$this->response_reason,0,0);
681
+ }
682
+
683
+ # GET /v1/Account/Container/Object
684
+ #
685
+ function get_object_to_string(&$obj, $hdrs=array())
686
+ {
687
+ if (!is_object($obj) || get_class($obj) != "CF_Object") {
688
+ throw new SyntaxException(
689
+ "Method argument is not a valid CF_Object.");
690
+ }
691
+
692
+ $conn_type = "GET_CALL";
693
+
694
+ $url_path = $this->_make_path("STORAGE", $obj->container->name,$obj->name);
695
+ $this->_write_callback_type = "OBJECT_STRING";
696
+ $return_code = $this->_send_request($conn_type,$url_path,$hdrs);
697
+
698
+ if (!$return_code) {
699
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
700
+ return array($return_code0,$this->error_str,NULL);
701
+ }
702
+ if ($return_code == 404) {
703
+ $this->error_str = "Object not found.";
704
+ return array($return_code0,$this->error_str,NULL);
705
+ }
706
+ if (($return_code < 200) || ($return_code > 299
707
+ && $return_code != 412 && $return_code != 304)) {
708
+ $this->error_str = "Unexpected HTTP return code: $return_code";
709
+ return array($return_code,$this->error_str,NULL);
710
+ }
711
+ return array($return_code,$this->response_reason, $this->_obj_write_string);
712
+ }
713
+
714
+ # GET /v1/Account/Container/Object
715
+ #
716
+ function get_object_to_stream(&$obj, &$resource=NULL, $hdrs=array())
717
+ {
718
+ if (!is_object($obj) || get_class($obj) != "CF_Object") {
719
+ throw new SyntaxException(
720
+ "Method argument is not a valid CF_Object.");
721
+ }
722
+ if (!is_resource($resource)) {
723
+ throw new SyntaxException(
724
+ "Resource argument not a valid PHP resource.");
725
+ }
726
+
727
+ $conn_type = "GET_CALL";
728
+
729
+ $url_path = $this->_make_path("STORAGE", $obj->container->name,$obj->name);
730
+ $this->_obj_write_resource = $resource;
731
+ $this->_write_callback_type = "OBJECT_STREAM";
732
+ $return_code = $this->_send_request($conn_type,$url_path,$hdrs);
733
+
734
+ if (!$return_code) {
735
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
736
+ return array($return_code,$this->error_str);
737
+ }
738
+ if ($return_code == 404) {
739
+ $this->error_str = "Object not found.";
740
+ return array($return_code,$this->error_str);
741
+ }
742
+ if (($return_code < 200) || ($return_code > 299
743
+ && $return_code != 412 && $return_code != 304)) {
744
+ $this->error_str = "Unexpected HTTP return code: $return_code";
745
+ return array($return_code,$this->error_str);
746
+ }
747
+ return array($return_code,$this->response_reason);
748
+ }
749
+
750
+ # PUT /v1/Account/Container/Object
751
+ #
752
+ function put_object(&$obj, &$fp)
753
+ {
754
+ if (!is_object($obj) || get_class($obj) != "CF_Object") {
755
+ throw new SyntaxException(
756
+ "Method argument is not a valid CF_Object.");
757
+ }
758
+ if (!is_resource($fp)) {
759
+ throw new SyntaxException(
760
+ "File pointer argument is not a valid resource.");
761
+ }
762
+
763
+ $conn_type = "PUT_OBJ";
764
+ $url_path = $this->_make_path("STORAGE", $obj->container->name,$obj->name);
765
+
766
+ $hdrs = $this->_metadata_headers($obj);
767
+
768
+ $etag = $obj->getETag();
769
+ if (isset($etag)) {
770
+ $hdrs[] = "ETag: " . $etag;
771
+ }
772
+ if (!$obj->content_type) {
773
+ $hdrs[] = "Content-Type: application/octet-stream";
774
+ } else {
775
+ $hdrs[] = "Content-Type: " . $obj->content_type;
776
+ }
777
+
778
+ $this->_init($conn_type);
779
+ curl_setopt($this->connections[$conn_type],
780
+ CURLOPT_INFILE, $fp);
781
+ if (!$obj->content_length) {
782
+ # We don''t know the Content-Length, so assumed "chunked" PUT
783
+ #
784
+ curl_setopt($this->connections[$conn_type], CURLOPT_UPLOAD, True);
785
+ $hdrs[] = 'Transfer-Encoding: chunked';
786
+ } else {
787
+ # We know the Content-Length, so use regular transfer
788
+ #
789
+ curl_setopt($this->connections[$conn_type],
790
+ CURLOPT_INFILESIZE, $obj->content_length);
791
+ }
792
+ $return_code = $this->_send_request($conn_type,$url_path,$hdrs);
793
+
794
+ if (!$return_code) {
795
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
796
+ return array(0,$this->error_str,NULL);
797
+ }
798
+ if ($return_code == 412) {
799
+ $this->error_str = "Missing Content-Type header";
800
+ return array($return_code,$this->error_str,NULL);
801
+ }
802
+ if ($return_code == 422) {
803
+ $this->error_str = "Derived and computed checksums do not match.";
804
+ return array($return_code,$this->error_str,NULL);
805
+ }
806
+ if ($return_code != 201) {
807
+ $this->error_str = "Unexpected HTTP return code: $return_code";
808
+ return array($return_code,$this->error_str,NULL);
809
+ }
810
+ return array($return_code,$this->response_reason,$this->_obj_etag);
811
+ }
812
+
813
+ # POST /v1/Account/Container/Object
814
+ #
815
+ function update_object(&$obj)
816
+ {
817
+ if (!is_object($obj) || get_class($obj) != "CF_Object") {
818
+ throw new SyntaxException(
819
+ "Method argument is not a valid CF_Object.");
820
+ }
821
+
822
+ if (!is_array($obj->metadata) || empty($obj->metadata)) {
823
+ $this->error_str = "Metadata array is empty.";
824
+ return 0;
825
+ }
826
+
827
+ $url_path = $this->_make_path("STORAGE", $obj->container->name,$obj->name);
828
+
829
+ $hdrs = $this->_metadata_headers($obj);
830
+ $return_code = $this->_send_request("DEL_POST",$url_path,$hdrs,"POST");
831
+ if (!$return_code) {
832
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
833
+ return 0;
834
+ }
835
+ if ($return_code == 404) {
836
+ $this->error_str = "Account, Container, or Object not found.";
837
+ }
838
+ if ($return_code != 202) {
839
+ $this->error_str = "Unexpected HTTP return code: $return_code";
840
+ }
841
+ return $return_code;
842
+ }
843
+
844
+ # HEAD /v1/Account/Container/Object
845
+ #
846
+ function head_object(&$obj)
847
+ {
848
+ if (!is_object($obj) || get_class($obj) != "CF_Object") {
849
+ throw new SyntaxException(
850
+ "Method argument is not a valid CF_Object.");
851
+ }
852
+
853
+ $conn_type = "HEAD";
854
+
855
+ $url_path = $this->_make_path("STORAGE", $obj->container->name,$obj->name);
856
+ $return_code = $this->_send_request($conn_type,$url_path);
857
+
858
+ if (!$return_code) {
859
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
860
+ return array(0, $this->error_str." ".$this->response_reason,
861
+ NULL, NULL, NULL, NULL, array());
862
+ }
863
+
864
+ if ($return_code == 404) {
865
+ return array($return_code, $this->response_reason,
866
+ NULL, NULL, NULL, NULL, array());
867
+ }
868
+ if ($return_code == 204 || $return_code == 200) {
869
+ return array($return_code,$this->response_reason,
870
+ $this->_obj_etag,
871
+ $this->_obj_last_modified,
872
+ $this->_obj_content_type,
873
+ $this->_obj_content_length,
874
+ $this->_obj_metadata);
875
+ }
876
+ $this->error_str = "Unexpected HTTP return code: $return_code";
877
+ return array($return_code, $this->error_str." ".$this->response_reason,
878
+ NULL, NULL, NULL, NULL, array());
879
+ }
880
+
881
+ # DELETE /v1/Account/Container/Object
882
+ #
883
+ function delete_object($container_name, $object_name)
884
+ {
885
+ if ($container_name == "") {
886
+ $this->error_str = "Container name not set.";
887
+ return 0;
888
+ }
889
+
890
+ if ($container_name != "0" and !isset($container_name)) {
891
+ $this->error_str = "Container name not set.";
892
+ return 0;
893
+ }
894
+
895
+ if (!$object_name) {
896
+ $this->error_str = "Object name not set.";
897
+ return 0;
898
+ }
899
+
900
+ $url_path = $this->_make_path("STORAGE", $container_name,$object_name);
901
+ $return_code = $this->_send_request("DEL_POST",$url_path,NULL,"DELETE");
902
+ if (!$return_code) {
903
+ $this->error_str .= ": Failed to obtain valid HTTP response.";
904
+ return 0;
905
+ }
906
+ if ($return_code == 404) {
907
+ $this->error_str = "Specified container did not exist to delete.";
908
+ }
909
+ if ($return_code != 204) {
910
+ $this->error_str = "Unexpected HTTP return code: $return_code.";
911
+ }
912
+ return $return_code;
913
+ }
914
+
915
+ function get_error()
916
+ {
917
+ return $this->error_str;
918
+ }
919
+
920
+ function setDebug($bool)
921
+ {
922
+ $this->dbug = $bool;
923
+ foreach ($this->connections as $k => $v) {
924
+ if (!is_null($v)) {
925
+ curl_setopt($this->connections[$k], CURLOPT_VERBOSE, $this->dbug);
926
+ }
927
+ }
928
+ }
929
+
930
+ function getCDNMUrl()
931
+ {
932
+ return $this->cdnm_url;
933
+ }
934
+
935
+ function getStorageUrl()
936
+ {
937
+ return $this->storage_url;
938
+ }
939
+
940
+ function getAuthToken()
941
+ {
942
+ return $this->auth_token;
943
+ }
944
+
945
+ function setCFAuth($cfs_auth, $servicenet=False)
946
+ {
947
+ if ($servicenet) {
948
+ $this->storage_url = "https://snet-" . substr($cfs_auth->storage_url, 8);
949
+ } else {
950
+ $this->storage_url = $cfs_auth->storage_url;
951
+ }
952
+ $this->auth_token = $cfs_auth->auth_token;
953
+ $this->cdnm_url = $cfs_auth->cdnm_url;
954
+ }
955
+
956
+ function setReadProgressFunc($func_name)
957
+ {
958
+ $this->_user_read_progress_callback_func = $func_name;
959
+ }
960
+
961
+ function setWriteProgressFunc($func_name)
962
+ {
963
+ $this->_user_write_progress_callback_func = $func_name;
964
+ }
965
+
966
+ private function _header_cb($ch, $header)
967
+ {
968
+ preg_match("/^HTTP\/1\.[01] (\d{3}) (.*)/", $header, $matches);
969
+ if (isset($matches[1])) {
970
+ $this->response_status = $matches[1];
971
+ }
972
+ if (isset($matches[2])) {
973
+ $this->response_reason = $matches[2];
974
+ }
975
+ if (stripos($header, CDN_ENABLED) === 0) {
976
+ $val = trim(substr($header, strlen(CDN_ENABLED)+1));
977
+ if (strtolower($val) == "true") {
978
+ $this->_cdn_enabled = True;
979
+ } elseif (strtolower($val) == "false") {
980
+ $this->_cdn_enabled = False;
981
+ } else {
982
+ $this->_cdn_enabled = NULL;
983
+ }
984
+ return strlen($header);
985
+ }
986
+ if (stripos($header, CDN_URI) === 0) {
987
+ $this->_cdn_uri = trim(substr($header, strlen(CDN_URI)+1));
988
+ return strlen($header);
989
+ }
990
+ if (stripos($header, CDN_TTL) === 0) {
991
+ $this->_cdn_ttl = trim(substr($header, strlen(CDN_TTL)+1))+0;
992
+ return strlen($header);
993
+ }
994
+ if (stripos($header, CDN_LOG_RETENTION) === 0) {
995
+ $this->_cdn_log_retention =
996
+ trim(substr($header, strlen(CDN_LOG_RETENTION)+1)) == "True" ? True : False;
997
+ return strlen($header);
998
+ }
999
+
1000
+ if (stripos($header, CDN_ACL_USER_AGENT) === 0) {
1001
+ $this->_cdn_acl_user_agent =
1002
+ trim(substr($header, strlen(CDN_ACL_USER_AGENT)+1));
1003
+ return strlen($header);
1004
+ }
1005
+
1006
+ if (stripos($header, CDN_ACL_REFERRER) === 0) {
1007
+ $this->_cdn_acl_referrer =
1008
+ trim(substr($header, strlen(CDN_ACL_REFERRER)+1));
1009
+ return strlen($header);
1010
+ }
1011
+
1012
+ if (stripos($header, ACCOUNT_CONTAINER_COUNT) === 0) {
1013
+ $this->_account_container_count = (float) trim(substr($header,
1014
+ strlen(ACCOUNT_CONTAINER_COUNT)+1))+0;
1015
+ return strlen($header);
1016
+ }
1017
+ if (stripos($header, ACCOUNT_BYTES_USED) === 0) {
1018
+ $this->_account_bytes_used = (float) trim(substr($header,
1019
+ strlen(ACCOUNT_BYTES_USED)+1))+0;
1020
+ return strlen($header);
1021
+ }
1022
+ if (stripos($header, CONTAINER_OBJ_COUNT) === 0) {
1023
+ $this->_container_object_count = (float) trim(substr($header,
1024
+ strlen(CONTAINER_OBJ_COUNT)+1))+0;
1025
+ return strlen($header);
1026
+ }
1027
+ if (stripos($header, CONTAINER_BYTES_USED) === 0) {
1028
+ $this->_container_bytes_used = (float) trim(substr($header,
1029
+ strlen(CONTAINER_BYTES_USED)+1))+0;
1030
+ return strlen($header);
1031
+ }
1032
+ if (stripos($header, METADATA_HEADER) === 0) {
1033
+ # $header => X-Object-Meta-Foo: bar baz
1034
+ $temp = substr($header, strlen(METADATA_HEADER));
1035
+ # $temp => Foo: bar baz
1036
+ $parts = explode(":", $temp);
1037
+ # $parts[0] => Foo
1038
+ $val = substr(strstr($temp, ":"), 1);
1039
+ # $val => bar baz
1040
+ $this->_obj_metadata[$parts[0]] = trim($val);
1041
+ return strlen($header);
1042
+ }
1043
+ if (stripos($header, "ETag:") === 0) {
1044
+ # $header => ETag: abc123def456...
1045
+ $val = substr(strstr($header, ":"), 1);
1046
+ # $val => abc123def456...
1047
+ $this->_obj_etag = trim($val);
1048
+ return strlen($header);
1049
+ }
1050
+ if (stripos($header, "Last-Modified:") === 0) {
1051
+ $val = substr(strstr($header, ":"), 1);
1052
+ $this->_obj_last_modified = trim($val);
1053
+ return strlen($header);
1054
+ }
1055
+ if (stripos($header, "Content-Type:") === 0) {
1056
+ $val = substr(strstr($header, ":"), 1);
1057
+ $this->_obj_content_type = trim($val);
1058
+ return strlen($header);
1059
+ }
1060
+ if (stripos($header, "Content-Length:") === 0) {
1061
+ $val = substr(strstr($header, ":"), 1);
1062
+ $this->_obj_content_length = (float) trim($val)+0;
1063
+ return strlen($header);
1064
+ }
1065
+ return strlen($header);
1066
+ }
1067
+
1068
+ private function _read_cb($ch, $fd, $length)
1069
+ {
1070
+ $data = fread($fd, $length);
1071
+ $len = strlen($data);
1072
+ if (isset($this->_user_write_progress_callback_func)) {
1073
+ call_user_func($this->_user_write_progress_callback_func, $len);
1074
+ }
1075
+ return $data;
1076
+ }
1077
+
1078
+ private function _write_cb($ch, $data)
1079
+ {
1080
+ $dlen = strlen($data);
1081
+ switch ($this->_write_callback_type) {
1082
+ case "TEXT_LIST":
1083
+ $this->_return_list = $this->_return_list . $data;
1084
+ //= explode("\n",$data); # keep tab,space
1085
+ //his->_text_list[] = rtrim($data,"\n\r\x0B"); # keep tab,space
1086
+ break;
1087
+ case "OBJECT_STREAM":
1088
+ fwrite($this->_obj_write_resource, $data, $dlen);
1089
+ break;
1090
+ case "OBJECT_STRING":
1091
+ $this->_obj_write_string .= $data;
1092
+ break;
1093
+ }
1094
+ if (isset($this->_user_read_progress_callback_func)) {
1095
+ call_user_func($this->_user_read_progress_callback_func, $dlen);
1096
+ }
1097
+ return $dlen;
1098
+ }
1099
+
1100
+ private function _auth_hdr_cb($ch, $header)
1101
+ {
1102
+ preg_match("/^HTTP\/1\.[01] (\d{3}) (.*)/", $header, $matches);
1103
+ if (isset($matches[1])) {
1104
+ $this->response_status = $matches[1];
1105
+ }
1106
+ if (isset($matches[2])) {
1107
+ $this->response_reason = $matches[2];
1108
+ }
1109
+ if (stripos($header, STORAGE_URL) === 0) {
1110
+ $this->storage_url = trim(substr($header, strlen(STORAGE_URL)+1));
1111
+ }
1112
+ if (stripos($header, CDNM_URL) === 0) {
1113
+ $this->cdnm_url = trim(substr($header, strlen(CDNM_URL)+1));
1114
+ }
1115
+ if (stripos($header, AUTH_TOKEN) === 0) {
1116
+ $this->auth_token = trim(substr($header, strlen(AUTH_TOKEN)+1));
1117
+ }
1118
+ if (stripos($header, AUTH_TOKEN_LEGACY) === 0) {
1119
+ $this->auth_token = trim(substr($header,strlen(AUTH_TOKEN_LEGACY)+1));
1120
+ }
1121
+ return strlen($header);
1122
+ }
1123
+
1124
+ private function _make_headers($hdrs=NULL)
1125
+ {
1126
+ $new_headers = array();
1127
+ $has_stoken = False;
1128
+ $has_uagent = False;
1129
+ if (is_array($hdrs)) {
1130
+ foreach ($hdrs as $h => $v) {
1131
+ if (is_int($h)) {
1132
+ $parts = explode(":", $v);
1133
+ $header = $parts[0];
1134
+ $value = trim(substr(strstr($v, ":"), 1));
1135
+ } else {
1136
+ $header = $h;
1137
+ $value = trim($v);
1138
+ }
1139
+
1140
+ if (stripos($header, AUTH_TOKEN) === 0) {
1141
+ $has_stoken = True;
1142
+ }
1143
+ if (stripos($header, "user-agent") === 0) {
1144
+ $has_uagent = True;
1145
+ }
1146
+ $new_headers[] = $header . ": " . $value;
1147
+ }
1148
+ }
1149
+ if (!$has_stoken) {
1150
+ $new_headers[] = AUTH_TOKEN . ": " . $this->auth_token;
1151
+ }
1152
+ if (!$has_uagent) {
1153
+ $new_headers[] = "User-Agent: " . USER_AGENT;
1154
+ }
1155
+ return $new_headers;
1156
+ }
1157
+
1158
+ private function _init($conn_type, $force_new=False)
1159
+ {
1160
+ if (!array_key_exists($conn_type, $this->connections)) {
1161
+ $this->error_str = "Invalid CURL_XXX connection type";
1162
+ return False;
1163
+ }
1164
+
1165
+ if (is_null($this->connections[$conn_type]) || $force_new) {
1166
+ $ch = curl_init();
1167
+ } else {
1168
+ return;
1169
+ }
1170
+
1171
+ if ($this->dbug) { curl_setopt($ch, CURLOPT_VERBOSE, 1); }
1172
+
1173
+ if (!is_null($this->cabundle_path)) {
1174
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, True);
1175
+ curl_setopt($ch, CURLOPT_CAINFO, $this->cabundle_path);
1176
+ }
1177
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, True);
1178
+ curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
1179
+ curl_setopt($ch, CURLOPT_MAXREDIRS, 4);
1180
+ curl_setopt($ch, CURLOPT_HEADER, 0);
1181
+ curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$this, '_header_cb'));
1182
+
1183
+ if ($conn_type == "GET_CALL") {
1184
+ curl_setopt($ch, CURLOPT_WRITEFUNCTION, array(&$this, '_write_cb'));
1185
+ }
1186
+
1187
+ if ($conn_type == "PUT_OBJ") {
1188
+ curl_setopt($ch, CURLOPT_PUT, 1);
1189
+ curl_setopt($ch, CURLOPT_READFUNCTION, array(&$this, '_read_cb'));
1190
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
1191
+ }
1192
+ if ($conn_type == "HEAD") {
1193
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "HEAD");
1194
+ curl_setopt($ch, CURLOPT_NOBODY, 1);
1195
+ }
1196
+ if ($conn_type == "PUT_CONT") {
1197
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
1198
+ curl_setopt($ch, CURLOPT_INFILESIZE, 0);
1199
+ curl_setopt($ch, CURLOPT_NOBODY, 1);
1200
+ }
1201
+ if ($conn_type == "DEL_POST") {
1202
+ curl_setopt($ch, CURLOPT_NOBODY, 1);
1203
+ }
1204
+ $this->connections[$conn_type] = $ch;
1205
+ return;
1206
+ }
1207
+
1208
+ private function _reset_callback_vars()
1209
+ {
1210
+ $this->_text_list = array();
1211
+ $this->_return_list = NULL;
1212
+ $this->_account_container_count = 0;
1213
+ $this->_account_bytes_used = 0;
1214
+ $this->_container_object_count = 0;
1215
+ $this->_container_bytes_used = 0;
1216
+ $this->_obj_etag = NULL;
1217
+ $this->_obj_last_modified = NULL;
1218
+ $this->_obj_content_type = NULL;
1219
+ $this->_obj_content_length = NULL;
1220
+ $this->_obj_metadata = array();
1221
+ $this->_obj_write_string = "";
1222
+ $this->_cdn_enabled = NULL;
1223
+ $this->_cdn_uri = NULL;
1224
+ $this->_cdn_ttl = NULL;
1225
+ $this->response_status = 0;
1226
+ $this->response_reason = "";
1227
+ }
1228
+
1229
+ private function _make_path($t="STORAGE",$c=NULL,$o=NULL)
1230
+ {
1231
+ $path = array();
1232
+ switch ($t) {
1233
+ case "STORAGE":
1234
+ $path[] = $this->storage_url; break;
1235
+ case "CDN":
1236
+ $path[] = $this->cdnm_url; break;
1237
+ }
1238
+ if ($c == "0")
1239
+ $path[] = rawurlencode($c);
1240
+
1241
+ if ($c) {
1242
+ $path[] = rawurlencode($c);
1243
+ }
1244
+ if ($o) {
1245
+ # mimic Python''s urllib.quote() feature of a "safe" '/' character
1246
+ #
1247
+ $path[] = str_replace("%2F","/",rawurlencode($o));
1248
+ }
1249
+ return implode("/",$path);
1250
+ }
1251
+
1252
+ private function _metadata_headers(&$obj)
1253
+ {
1254
+ $hdrs = array();
1255
+ foreach ($obj->metadata as $k => $v) {
1256
+ if (strpos($k,":") !== False) {
1257
+ throw new SyntaxException(
1258
+ "Metadata keys cannot contain a ':' character.");
1259
+ }
1260
+ $k = trim($k);
1261
+ $key = sprintf("%s%s", METADATA_HEADER, $k);
1262
+ if (!array_key_exists($key, $hdrs)) {
1263
+ if (strlen($k) > 128 || strlen($v) > 256) {
1264
+ $this->error_str = "Metadata key or value exceeds ";
1265
+ $this->error_str .= "maximum length: ($k: $v)";
1266
+ return 0;
1267
+ }
1268
+ $hdrs[] = sprintf("%s%s: %s", METADATA_HEADER, $k, trim($v));
1269
+ }
1270
+ }
1271
+ return $hdrs;
1272
+ }
1273
+
1274
+ private function _send_request($conn_type, $url_path, $hdrs=NULL, $method="GET")
1275
+ {
1276
+ $this->_init($conn_type);
1277
+ $this->_reset_callback_vars();
1278
+ $headers = $this->_make_headers($hdrs);
1279
+
1280
+ if (gettype($this->connections[$conn_type]) == "unknown type")
1281
+ throw new ConnectionNotOpenException (
1282
+ "Connection is not open."
1283
+ );
1284
+
1285
+ switch ($method) {
1286
+ case "DELETE":
1287
+ curl_setopt($this->connections[$conn_type],
1288
+ CURLOPT_CUSTOMREQUEST, "DELETE");
1289
+ break;
1290
+ case "POST":
1291
+ curl_setopt($this->connections[$conn_type],
1292
+ CURLOPT_CUSTOMREQUEST, "POST");
1293
+ default:
1294
+ break;
1295
+ }
1296
+
1297
+ curl_setopt($this->connections[$conn_type],
1298
+ CURLOPT_HTTPHEADER, $headers);
1299
+
1300
+ curl_setopt($this->connections[$conn_type],
1301
+ CURLOPT_URL, $url_path);
1302
+
1303
+ if (!curl_exec($this->connections[$conn_type])) {
1304
+ $this->error_str = "(curl error: "
1305
+ . curl_errno($this->connections[$conn_type]) . ") ";
1306
+ $this->error_str .= curl_error($this->connections[$conn_type]);
1307
+ return False;
1308
+ }
1309
+ return curl_getinfo($this->connections[$conn_type], CURLINFO_HTTP_CODE);
1310
+ }
1311
+
1312
+ function close()
1313
+ {
1314
+ foreach ($this->connections as $cnx) {
1315
+ if (isset($cnx)) {
1316
+ curl_close($cnx);
1317
+ $this->connections[$cnx] = NULL;
1318
+ }
1319
+ }
1320
+ }
1321
+ private function create_array()
1322
+ {
1323
+ $this->_text_list = explode("\n",rtrim($this->_return_list,"\n\x0B"));
1324
+ return True;
1325
+ }
1326
+
1327
+ }
1328
+
1329
+ /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
1330
+
1331
+ /*
1332
+ * Local variables:
1333
+ * tab-width: 4
1334
+ * c-basic-offset: 4
1335
+ * c-hanging-comment-ender-p: nil
1336
+ * End:
1337
+ */
1338
+ ?>
lib/Minify/HTTP/ConditionalGet.php CHANGED
@@ -1,10 +1,10 @@
1
- <?php
2
  /**
3
  * Class HTTP_ConditionalGet
4
  * @package Minify
5
  * @subpackage HTTP
6
- */
7
-
8
  /**
9
  * Implement conditional GET via a timestamp or hash of content
10
  *
@@ -12,12 +12,12 @@
12
  * <code>
13
  * list($updateTime, $content) = getDbUpdateAndContent();
14
  * $cg = new HTTP_ConditionalGet(array(
15
- * 'lastModifiedTime' => $updateTime
16
- * ,'isPublic' => true
17
  * ));
18
  * $cg->sendHeaders();
19
  * if ($cg->cacheIsValid) {
20
- * exit();
21
  * }
22
  * echo $content;
23
  * </code>
@@ -32,11 +32,11 @@
32
  * <code>
33
  * $content = getContentFromDB();
34
  * $cg = new HTTP_ConditionalGet(array(
35
- * 'contentHash' => md5($content)
36
  * ));
37
  * $cg->sendHeaders();
38
  * if ($cg->cacheIsValid) {
39
- * exit();
40
  * }
41
  * echo $content;
42
  * </code>
@@ -45,23 +45,24 @@
45
  * <code>
46
  * // before content
47
  * $cg = new HTTP_ConditionalGet(array(
48
- * 'lastUpdateTime' => max(
49
- * filemtime(__FILE__)
50
- * ,filemtime('/path/to/header.inc')
51
- * ,filemtime('/path/to/footer.inc')
52
- * )
53
  * ));
54
  * $cg->sendHeaders();
55
  * if ($cg->cacheIsValid) {
56
- * exit();
57
  * }
58
  * </code>
59
  * @package Minify
60
  * @subpackage HTTP
61
  * @author Stephen Clay <steve@mrclay.org>
62
- */
63
- class HTTP_ConditionalGet {
64
-
 
65
  /**
66
  * Does the client have a valid copy of the requested resource?
67
  *
@@ -69,9 +70,9 @@ class HTTP_ConditionalGet {
69
  * not send content, just call sendHeaders() if you haven't already.
70
  *
71
  * @var bool
72
- */
73
- public $cacheIsValid = null;
74
-
75
  /**
76
  * @param array $spec options
77
  *
@@ -108,55 +109,95 @@ class HTTP_ConditionalGet {
108
  * conditional GET to revalidate its cache.
109
  *
110
  * @return null
111
- */
112
- public function __construct($spec)
113
- {
114
- $scope = (isset($spec['isPublic']) && $spec['isPublic'])
115
- ? 'public'
116
- : 'private';
117
- $maxAge = 0;
 
 
 
 
 
118
  // backwards compatibility (can be removed later)
119
- if (isset($spec['setExpires'])
120
- && is_numeric($spec['setExpires'])
121
- && ! isset($spec['maxAge'])) {
122
- $spec['maxAge'] = $spec['setExpires'] - $_SERVER['REQUEST_TIME'];
123
- }
124
- if (isset($spec['maxAge'])) {
125
- $maxAge = $spec['maxAge'];
126
- $this->_headers['Expires'] = self::gmtDate(
127
- $_SERVER['REQUEST_TIME'] + $spec['maxAge']
128
- );
129
- }
130
- $etagAppend = '';
131
- if (isset($spec['encoding'])) {
132
- $this->_stripEtag = true;
133
- $this->_headers['Vary'] = 'Accept-Encoding';
134
- if ('' !== $spec['encoding']) {
135
- if (0 === strpos($spec['encoding'], 'x-')) {
136
- $spec['encoding'] = substr($spec['encoding'], 2);
137
- }
138
- $etagAppend = ';' . substr($spec['encoding'], 0, 2);
139
- }
140
- }
141
- if (isset($spec['lastModifiedTime'])) {
142
- $this->_setLastModified($spec['lastModifiedTime']);
 
 
 
143
  if (isset($spec['eTag'])) { // Use it
144
- $this->_setEtag($spec['eTag'], $scope);
145
  } else { // base both headers on time
146
- $this->_setEtag($spec['lastModifiedTime'] . $etagAppend, $scope);
147
- }
148
  } elseif (isset($spec['eTag'])) { // Use it
149
- $this->_setEtag($spec['eTag'], $scope);
150
  } elseif (isset($spec['contentHash'])) { // Use the hash as the ETag
151
- $this->_setEtag($spec['contentHash'] . $etagAppend, $scope);
152
- }
153
- $this->_headers['Cache-Control'] = "max-age={$maxAge}, {$scope}, must-revalidate, proxy-revalidate";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154
  // invalidate cache if disabled, otherwise check
155
- $this->cacheIsValid = (isset($spec['invalidate']) && $spec['invalidate'])
156
- ? false
157
- : $this->_isCacheValid();
158
- }
159
-
160
  /**
161
  * Get array of output headers to be sent
162
  *
@@ -166,18 +207,18 @@ class HTTP_ConditionalGet {
166
  * Otherwise something like:
167
  * <code>
168
  * array(
169
- * 'Cache-Control' => 'max-age=0, public'
170
- * ,'ETag' => '"foobar"'
171
  * )
172
  * </code>
173
  *
174
  * @return array
175
- */
176
- public function getHeaders()
177
- {
178
- return $this->_headers;
179
- }
180
-
181
  /**
182
  * Set the Content-Length header in bytes
183
  *
@@ -188,12 +229,12 @@ class HTTP_ConditionalGet {
188
  * @param int $bytes
189
  *
190
  * @return int copy of input $bytes
191
- */
192
- public function setContentLength($bytes)
193
- {
194
- return $this->_headers['Content-Length'] = $bytes;
195
- }
196
-
197
  /**
198
  * Send headers
199
  *
@@ -204,19 +245,19 @@ class HTTP_ConditionalGet {
204
  * still return the headers.
205
  *
206
  * @return null
207
- */
208
- public function sendHeaders()
209
- {
210
- $headers = $this->_headers;
211
- if (array_key_exists('_responseCode', $headers)) {
212
- header($headers['_responseCode']);
213
- unset($headers['_responseCode']);
214
- }
215
- foreach ($headers as $name => $val) {
216
- header($name . ': ' . $val);
217
- }
218
- }
219
-
220
  /**
221
  * Exit if the client's cache is valid for this resource
222
  *
@@ -232,21 +273,20 @@ class HTTP_ConditionalGet {
232
  * @param array $options (default empty) additional options for constructor
233
  *
234
  * @return null
235
- */
236
- public static function check($lastModifiedTime = null, $isPublic = false, $options = array())
237
- {
238
- if (null !== $lastModifiedTime) {
239
- $options['lastModifiedTime'] = (int)$lastModifiedTime;
240
- }
241
- $options['isPublic'] = (bool)$isPublic;
242
- $cg = new HTTP_ConditionalGet($options);
243
- $cg->sendHeaders();
244
- if ($cg->cacheIsValid) {
245
- exit();
246
- }
247
- }
248
-
249
-
250
  /**
251
  * Get a GMT formatted date for use in HTTP headers
252
  *
@@ -257,92 +297,102 @@ class HTTP_ConditionalGet {
257
  * @param int $time unix timestamp
258
  *
259
  * @return string
260
- */
261
- public static function gmtDate($time)
262
- {
263
- return gmdate('D, d M Y H:i:s \G\M\T', $time);
264
- }
265
-
266
- protected $_headers = array();
267
- protected $_lmTime = null;
268
- protected $_etag = null;
269
- protected $_stripEtag = false;
270
-
271
- protected function _setEtag($hash, $scope)
272
- {
273
- $this->_etag = '"' . substr($scope, 0, 3) . $hash . '"';
274
- $this->_headers['ETag'] = $this->_etag;
275
- }
276
-
277
- protected function _setLastModified($time)
278
- {
279
- $this->_lmTime = (int)$time;
280
- $this->_headers['Last-Modified'] = self::gmtDate($time);
281
- }
282
-
 
 
 
 
 
 
 
 
 
283
  /**
284
  * Determine validity of client cache and queue 304 header if valid
285
- */
286
- protected function _isCacheValid()
287
- {
288
- if (null === $this->_etag) {
289
  // lmTime is copied to ETag, so this condition implies that the
290
  // server sent neither ETag nor Last-Modified, so the client can't
291
  // possibly has a valid cache.
292
- return false;
293
- }
294
- $isValid = ($this->resourceMatchedEtag() || $this->resourceNotModified());
295
- if ($isValid) {
296
- $this->_headers['_responseCode'] = 'HTTP/1.0 304 Not Modified';
297
- }
298
- return $isValid;
299
- }
300
-
301
- protected function resourceMatchedEtag()
302
- {
303
- if (!isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
304
- return false;
305
- }
306
- $clientEtagList = get_magic_quotes_gpc()
307
- ? stripslashes($_SERVER['HTTP_IF_NONE_MATCH'])
308
- : $_SERVER['HTTP_IF_NONE_MATCH'];
309
- $clientEtags = explode(',', $clientEtagList);
310
-
311
- $compareTo = $this->normalizeEtag($this->_etag);
312
- foreach ($clientEtags as $clientEtag) {
313
- if ($this->normalizeEtag($clientEtag) === $compareTo) {
314
  // respond with the client's matched ETag, even if it's not what
315
- // we would've sent by default
316
- $this->_headers['ETag'] = trim($clientEtag);
317
- return true;
318
- }
319
- }
320
- return false;
321
- }
322
-
323
- protected function normalizeEtag($etag) {
324
- $etag = trim($etag);
325
- return $this->_stripEtag
326
- ? preg_replace('/;\\w\\w"$/', '"', $etag)
327
- : $etag;
328
- }
329
-
330
- protected function resourceNotModified()
331
- {
332
- if (!isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
333
- return false;
334
- }
335
- $ifModifiedSince = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
336
- if (false !== ($semicolon = strrpos($ifModifiedSince, ';'))) {
 
337
  // IE has tacked on extra data to this header, strip it
338
- $ifModifiedSince = substr($ifModifiedSince, 0, $semicolon);
339
- }
340
- if ($ifModifiedSince == self::gmtDate($this->_lmTime)) {
341
  // Apache 2.2's behavior. If there was no ETag match, send the
342
- // non-encoded version of the ETag value.
343
- $this->_headers['ETag'] = $this->normalizeEtag($this->_etag);
344
- return true;
345
- }
346
- return false;
347
- }
 
 
348
  }
1
+ <?php
2
  /**
3
  * Class HTTP_ConditionalGet
4
  * @package Minify
5
  * @subpackage HTTP
6
+ */
7
+
8
  /**
9
  * Implement conditional GET via a timestamp or hash of content
10
  *
12
  * <code>
13
  * list($updateTime, $content) = getDbUpdateAndContent();
14
  * $cg = new HTTP_ConditionalGet(array(
15
+ * 'lastModifiedTime' => $updateTime
16
+ * ,'isPublic' => true
17
  * ));
18
  * $cg->sendHeaders();
19
  * if ($cg->cacheIsValid) {
20
+ * exit();
21
  * }
22
  * echo $content;
23
  * </code>
32
  * <code>
33
  * $content = getContentFromDB();
34
  * $cg = new HTTP_ConditionalGet(array(
35
+ * 'contentHash' => md5($content)
36
  * ));
37
  * $cg->sendHeaders();
38
  * if ($cg->cacheIsValid) {
39
+ * exit();
40
  * }
41
  * echo $content;
42
  * </code>
45
  * <code>
46
  * // before content
47
  * $cg = new HTTP_ConditionalGet(array(
48
+ * 'lastUpdateTime' => max(
49
+ * filemtime(__FILE__)
50
+ * ,filemtime('/path/to/header.inc')
51
+ * ,filemtime('/path/to/footer.inc')
52
+ * )
53
  * ));
54
  * $cg->sendHeaders();
55
  * if ($cg->cacheIsValid) {
56
+ * exit();
57
  * }
58
  * </code>
59
  * @package Minify
60
  * @subpackage HTTP
61
  * @author Stephen Clay <steve@mrclay.org>
62
+ */
63
+ class HTTP_ConditionalGet
64
+ {
65
+
66
  /**
67
  * Does the client have a valid copy of the requested resource?
68
  *
70
  * not send content, just call sendHeaders() if you haven't already.
71
  *
72
  * @var bool
73
+ */
74
+ public $cacheIsValid = null;
75
+
76
  /**
77
  * @param array $spec options
78
  *
109
  * conditional GET to revalidate its cache.
110
  *
111
  * @return null
112
+ */
113
+ public function __construct($spec)
114
+ {
115
+ if (isset($spec['cacheHeaders']) && is_array($spec['cacheHeaders'])) {
116
+ $this->_cacheHeaders = $spec['cacheHeaders'];
117
+ }
118
+
119
+ $scope = ($this->_cacheHeaders['cacheheaders_enabled'] && $this->_cacheHeaders['cacheheaders'] != 'no_cache') ? 'public' : 'private';
120
+ $maxAge = 0;
121
+
122
+ $this->_headers['Pragma'] = $scope;
123
+
124
  // backwards compatibility (can be removed later)
125
+ if (isset($spec['setExpires']) && is_numeric($spec['setExpires']) && !isset($spec['maxAge'])) {
126
+ $spec['maxAge'] = $spec['setExpires'] - $_SERVER['REQUEST_TIME'];
127
+ }
128
+
129
+ if (isset($spec['maxAge'])) {
130
+ $maxAge = $spec['maxAge'];
131
+
132
+ if ($this->_cacheHeaders['expires_enabled'] && $maxAge) {
133
+ $this->_headers['Expires'] = self::gmtDate($_SERVER['REQUEST_TIME'] + $maxAge);
134
+ }
135
+ }
136
+
137
+ $etagAppend = '';
138
+
139
+ if (isset($spec['encoding'])) {
140
+ $this->_stripEtag = true;
141
+ $this->_headers['Vary'] = 'Accept-Encoding';
142
+ if ('' !== $spec['encoding']) {
143
+ if (0 === strpos($spec['encoding'], 'x-')) {
144
+ $spec['encoding'] = substr($spec['encoding'], 2);
145
+ }
146
+ $etagAppend = ';' . substr($spec['encoding'], 0, 2);
147
+ }
148
+ }
149
+
150
+ if (isset($spec['lastModifiedTime'])) {
151
+ $this->_setLastModified($spec['lastModifiedTime']);
152
  if (isset($spec['eTag'])) { // Use it
153
+ $this->_setEtag($spec['eTag'], $scope);
154
  } else { // base both headers on time
155
+ $this->_setEtag($spec['lastModifiedTime'] . $etagAppend, $scope);
156
+ }
157
  } elseif (isset($spec['eTag'])) { // Use it
158
+ $this->_setEtag($spec['eTag'], $scope);
159
  } elseif (isset($spec['contentHash'])) { // Use the hash as the ETag
160
+ $this->_setEtag($spec['contentHash'] . $etagAppend, $scope);
161
+ }
162
+
163
+ if ($this->_cacheHeaders['cacheheaders_enabled']) {
164
+ switch ($this->_cacheHeaders['cacheheaders']) {
165
+ case 'cache':
166
+ $this->_headers['Cache-Control'] = 'public';
167
+ break;
168
+
169
+ case 'cache_validation':
170
+ $this->_headers['Cache-Control'] = 'public, must-revalidate, proxy-revalidate';
171
+ break;
172
+
173
+ case 'cache_noproxy':
174
+ $this->_headers['Cache-Control'] = 'public, must-revalidate';
175
+ break;
176
+
177
+ case 'cache_maxage':
178
+ $this->_headers['Cache-Control'] = "max-age={$maxAge}, {$scope}, must-revalidate, proxy-revalidate";
179
+ break;
180
+
181
+ case 'no_cache':
182
+ $this->_headers['Cache-Control'] = 'max-age=0, private, no-store, no-cache, must-revalidate';
183
+ break;
184
+ }
185
+ }
186
+
187
+ /**
188
+ * Disable caching for preview mode
189
+ */
190
+ if (w3_is_preview_mode()) {
191
+ $this->_headers = array_merge($this->_headers, array(
192
+ 'Pragma' => 'private',
193
+ 'Cache-Control' => 'private'
194
+ ));
195
+ }
196
+
197
  // invalidate cache if disabled, otherwise check
198
+ $this->cacheIsValid = (isset($spec['invalidate']) && $spec['invalidate']) ? false : $this->_isCacheValid();
199
+ }
200
+
 
 
201
  /**
202
  * Get array of output headers to be sent
203
  *
207
  * Otherwise something like:
208
  * <code>
209
  * array(
210
+ * 'Cache-Control' => 'max-age=0, public'
211
+ * ,'ETag' => '"foobar"'
212
  * )
213
  * </code>
214
  *
215
  * @return array
216
+ */
217
+ public function getHeaders()
218
+ {
219
+ return $this->_headers;
220
+ }
221
+
222
  /**
223
  * Set the Content-Length header in bytes
224
  *
229
  * @param int $bytes
230
  *
231
  * @return int copy of input $bytes
232
+ */
233
+ public function setContentLength($bytes)
234
+ {
235
+ return $this->_headers['Content-Length'] = $bytes;
236
+ }
237
+
238
  /**
239
  * Send headers
240
  *
245
  * still return the headers.
246
  *
247
  * @return null
248
+ */
249
+ public function sendHeaders()
250
+ {
251
+ $headers = $this->_headers;
252
+ if (array_key_exists('_responseCode', $headers)) {
253
+ header($headers['_responseCode']);
254
+ unset($headers['_responseCode']);
255
+ }
256
+ foreach ($headers as $name => $val) {
257
+ header($name . ': ' . $val);
258
+ }
259
+ }
260
+
261
  /**
262
  * Exit if the client's cache is valid for this resource
263
  *
273
  * @param array $options (default empty) additional options for constructor
274
  *
275
  * @return null
276
+ */
277
+ public static function check($lastModifiedTime = null, $isPublic = false, $options = array())
278
+ {
279
+ if (null !== $lastModifiedTime) {
280
+ $options['lastModifiedTime'] = (int) $lastModifiedTime;
281
+ }
282
+ $options['isPublic'] = (bool) $isPublic;
283
+ $cg = new HTTP_ConditionalGet($options);
284
+ $cg->sendHeaders();
285
+ if ($cg->cacheIsValid) {
286
+ exit();
287
+ }
288
+ }
289
+
 
290
  /**
291
  * Get a GMT formatted date for use in HTTP headers
292
  *
297
  * @param int $time unix timestamp
298
  *
299
  * @return string
300
+ */
301
+ public static function gmtDate($time)
302
+ {
303
+ return gmdate('D, d M Y H:i:s \G\M\T', $time);
304
+ }
305
+
306
+ protected $_headers = array();
307
+ protected $_lmTime = null;
308
+ protected $_etag = null;
309
+ protected $_stripEtag = false;
310
+ protected $_cacheHeaders = array(
311
+ 'use_etag' => true,
312
+ 'expires_enabled' => true,
313
+ 'cacheheaders_enabled' => true,
314
+ 'cacheheaders' => 'cache_validation'
315
+ );
316
+
317
+ protected function _setEtag($hash, $scope)
318
+ {
319
+ $this->_etag = '"' . substr($scope, 0, 3) . $hash . '"';
320
+
321
+ if ($this->_cacheHeaders['use_etag']) {
322
+ $this->_headers['ETag'] = $this->_etag;
323
+ }
324
+ }
325
+
326
+ protected function _setLastModified($time)
327
+ {
328
+ $this->_lmTime = (int) $time;
329
+ $this->_headers['Last-Modified'] = self::gmtDate($time);
330
+ }
331
+
332
  /**
333
  * Determine validity of client cache and queue 304 header if valid
334
+ */
335
+ protected function _isCacheValid()
336
+ {
337
+ if (null === $this->_etag) {
338
  // lmTime is copied to ETag, so this condition implies that the
339
  // server sent neither ETag nor Last-Modified, so the client can't
340
  // possibly has a valid cache.
341
+ return false;
342
+ }
343
+ $isValid = ($this->resourceMatchedEtag() || $this->resourceNotModified());
344
+ if ($isValid) {
345
+ $this->_headers['_responseCode'] = 'HTTP/1.0 304 Not Modified';
346
+ }
347
+ return $isValid;
348
+ }
349
+
350
+ protected function resourceMatchedEtag()
351
+ {
352
+ if (!isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
353
+ return false;
354
+ }
355
+ $clientEtagList = get_magic_quotes_gpc() ? stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : $_SERVER['HTTP_IF_NONE_MATCH'];
356
+ $clientEtags = explode(',', $clientEtagList);
357
+
358
+ $compareTo = $this->normalizeEtag($this->_etag);
359
+ foreach ($clientEtags as $clientEtag) {
360
+ if ($this->normalizeEtag($clientEtag) === $compareTo) {
 
 
361
  // respond with the client's matched ETag, even if it's not what
362
+ // we would've sent by default
363
+ if ($this->_cacheHeaders['use_etag']) {
364
+ $this->_headers['ETag'] = trim($clientEtag);
365
+ }
366
+ return true;
367
+ }
368
+ }
369
+ return false;
370
+ }
371
+
372
+ protected function normalizeEtag($etag)
373
+ {
374
+ $etag = trim($etag);
375
+ return $this->_stripEtag ? preg_replace('/;\\w\\w"$/', '"', $etag) : $etag;
376
+ }
377
+
378
+ protected function resourceNotModified()
379
+ {
380
+ if (!isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
381
+ return false;
382
+ }
383
+ $ifModifiedSince = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
384
+ if (false !== ($semicolon = strrpos($ifModifiedSince, ';'))) {
385
  // IE has tacked on extra data to this header, strip it
386
+ $ifModifiedSince = substr($ifModifiedSince, 0, $semicolon);
387
+ }
388
+ if ($ifModifiedSince == self::gmtDate($this->_lmTime)) {
389
  // Apache 2.2's behavior. If there was no ETag match, send the
390
+ // non-encoded version of the ETag value.
391
+ if ($this->_cacheHeaders['use_etag']) {
392
+ $this->_headers['ETag'] = $this->normalizeEtag($this->_etag);
393
+ }
394
+ return true;
395
+ }
396
+ return false;
397
+ }
398
  }
lib/Minify/HTTP/Encoder.php CHANGED
@@ -186,7 +186,7 @@ class HTTP_Encoder {
186
  * alias of that method to use in the Content-Encoding header (some browsers
187
  * call gzip "x-gzip" etc.)
188
  */
189
- public static function getAcceptedEncoding($compressions = 'gzip')
190
  {
191
  // @link http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
192
 
@@ -198,14 +198,10 @@ class HTTP_Encoder {
198
  return array('', '');
199
  }
200
 
201
- if (stristr($compressions, 'gzip') && stristr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && function_exists('gzencode')) {
202
  return array('gzip', 'gzip');
203
  }
204
 
205
- if (stristr($compressions, 'deflate') && stristr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') && function_exists('gzdeflate')) {
206
- return array('deflate', 'deflate');
207
- }
208
-
209
  return array('', '');
210
  }
211
 
186
  * alias of that method to use in the Content-Encoding header (some browsers
187
  * call gzip "x-gzip" etc.)
188
  */
189
+ public static function getAcceptedEncoding()
190
  {
191
  // @link http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
192
 
198
  return array('', '');
199
  }
200
 
201
+ if (stristr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && function_exists('gzencode')) {
202
  return array('gzip', 'gzip');
203
  }
204
 
 
 
 
 
205
  return array('', '');
206
  }
207
 
lib/Minify/Minify.php CHANGED
@@ -207,7 +207,7 @@ class Minify {
207
  }
208
 
209
  // determine encoding
210
- if (self::$_options['encodeOutput'] != '') {
211
  if (self::$_options['encodeMethod'] !== null) {
212
  // controller specifically requested this
213
  $contentEncoding = self::$_options['encodeMethod'];
@@ -226,7 +226,8 @@ class Minify {
226
  // check client cache
227
  require_once W3TC_LIB_MINIFY_DIR . '/HTTP/ConditionalGet.php';
228
  $cgOptions = array(
229
- 'lastModifiedTime' => self::$_options['lastModifiedTime']
 
230
  ,'isPublic' => self::$_options['isPublic']
231
  ,'encoding' => self::$_options['encodeMethod']
232
  );
@@ -285,13 +286,9 @@ class Minify {
285
  $content = self::_combineMinify();
286
  self::$_cache->store($cacheId, $content);
287
 
288
- if (stristr(self::$_options['encodeOutput'], 'gzip') && function_exists('gzencode')) {
289
  self::$_cache->store($cacheId . '.gzip', gzencode($content, self::$_options['encodeLevel']));
290
  }
291
-
292
- if (stristr(self::$_options['encodeOutput'], 'deflate') && function_exists('gzdeflate')) {
293
- self::$_cache->store($cacheId . '.deflate', gzdeflate($content, self::$_options['encodeLevel']));
294
- }
295
  }
296
  } else {
297
  // no cache
@@ -387,6 +384,8 @@ class Minify {
387
  if (isset($_SERVER['SERVER_SOFTWARE'])
388
  && 0 === strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS/')
389
  ) {
 
 
390
  $_SERVER['DOCUMENT_ROOT'] = rtrim(substr(
391
  $_SERVER['PATH_TRANSLATED']
392
  ,0
207
  }
208
 
209
  // determine encoding
210
+ if (self::$_options['encodeOutput']) {
211
  if (self::$_options['encodeMethod'] !== null) {
212
  // controller specifically requested this
213
  $contentEncoding = self::$_options['encodeMethod'];
226
  // check client cache
227
  require_once W3TC_LIB_MINIFY_DIR . '/HTTP/ConditionalGet.php';
228
  $cgOptions = array(
229
+ 'cacheHeaders' => self::$_options['cacheHeaders']
230
+ ,'lastModifiedTime' => self::$_options['lastModifiedTime']
231
  ,'isPublic' => self::$_options['isPublic']
232
  ,'encoding' => self::$_options['encodeMethod']
233
  );
286
  $content = self::_combineMinify();
287
  self::$_cache->store($cacheId, $content);
288
 
289
+ if (self::$_options['encodeOutput'] && function_exists('gzencode')) {
290
  self::$_cache->store($cacheId . '.gzip', gzencode($content, self::$_options['encodeLevel']));
291
  }
 
 
 
 
292
  }
293
  } else {
294
  // no cache
384
  if (isset($_SERVER['SERVER_SOFTWARE'])
385
  && 0 === strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS/')
386
  ) {
387
+ $_SERVER['PATH_TRANSLATED']= preg_replace('~[/\\\]+~', '/', $_SERVER['PATH_TRANSLATED']);
388
+
389
  $_SERVER['DOCUMENT_ROOT'] = rtrim(substr(
390
  $_SERVER['PATH_TRANSLATED']
391
  ,0
lib/Minify/Minify/CSS/Compressor.php CHANGED
@@ -68,6 +68,11 @@ class Minify_CSS_Compressor {
68
  */
69
  protected function _process($css)
70
  {
 
 
 
 
 
71
  $css = str_replace("\r\n", "\n", $css);
72
 
73
  // preserve empty comment after '>'
@@ -110,7 +115,7 @@ class Minify_CSS_Compressor {
110
  \\s*
111
  (\\b|[#\'"]) # 3 = first character of a value
112
  /x', '$1$2:$3', $css);
113
-
114
  // remove ws in selectors
115
  $css = preg_replace_callback('/
116
  (?: # non-capture
@@ -124,7 +129,7 @@ class Minify_CSS_Compressor {
124
  { # open declaration block
125
  /x'
126
  ,array($this, '_selectorsCB'), $css);
127
-
128
  // minimize hex colors
129
  $css = preg_replace('/([^=])#([a-f\\d])\\2([a-f\\d])\\3([a-f\\d])\\4([\\s;\\}])/i'
130
  , '$1#$2$3$4$5', $css);
@@ -150,6 +155,13 @@ class Minify_CSS_Compressor {
150
 
151
  // prevent triggering IE6 bug: http://www.crankygeek.com/ie6pebug/
152
  $css = preg_replace('/:first-l(etter|ine)\\{/', ':first-l$1 {', $css);
 
 
 
 
 
 
 
153
 
154
  return trim($css);
155
  }
@@ -247,4 +259,16 @@ class Minify_CSS_Compressor {
247
  /x', '$1', $m[1]);
248
  return 'font-family:' . $m[1] . $m[2];
249
  }
 
 
 
 
 
 
 
 
 
 
 
 
250
  }
68
  */
69
  protected function _process($css)
70
  {
71
+ $this->_replacementHash = 'MINIFYCSS' . md5($_SERVER['REQUEST_TIME']);
72
+ $this->_placeholders = array();
73
+
74
+ $css = preg_replace_callback('~(".*"|\'.*\')~U', array($this, '_removeQuotesCB'), $css);
75
+
76
  $css = str_replace("\r\n", "\n", $css);
77
 
78
  // preserve empty comment after '>'
115
  \\s*
116
  (\\b|[#\'"]) # 3 = first character of a value
117
  /x', '$1$2:$3', $css);
118
+
119
  // remove ws in selectors
120
  $css = preg_replace_callback('/
121
  (?: # non-capture
129
  { # open declaration block
130
  /x'
131
  ,array($this, '_selectorsCB'), $css);
132
+
133
  // minimize hex colors
134
  $css = preg_replace('/([^=])#([a-f\\d])\\2([a-f\\d])\\3([a-f\\d])\\4([\\s;\\}])/i'
135
  , '$1#$2$3$4$5', $css);
155
 
156
  // prevent triggering IE6 bug: http://www.crankygeek.com/ie6pebug/
157
  $css = preg_replace('/:first-l(etter|ine)\\{/', ':first-l$1 {', $css);
158
+
159
+ // fill placeholders
160
+ $css = str_replace(
161
+ array_keys($this->_placeholders)
162
+ ,array_values($this->_placeholders)
163
+ ,$css
164
+ );
165
 
166
  return trim($css);
167
  }
259
  /x', '$1', $m[1]);
260
  return 'font-family:' . $m[1] . $m[2];
261
  }
262
+
263
+ protected function _reservePlace($content)
264
+ {
265
+ $placeholder = '"' . $this->_replacementHash . count($this->_placeholders) . '"';
266
+ $this->_placeholders[$placeholder] = $content;
267
+ return $placeholder;
268
+ }
269
+
270
+ protected function _removeQuotesCB($m)
271
+ {
272
+ return $this->_reservePlace($m[1]);
273
+ }
274
  }
lib/Minify/Minify/CSS/UriRewriter.php CHANGED
@@ -175,7 +175,7 @@ class Minify_CSS_UriRewriter {
175
  $dir = (ltrim((strpos($dir_obj, '/') === 0 ? w3_realpath($dir_obj) : w3_realpath($dir_css . $dir_obj)), '/'));
176
  $file = basename($uri);
177
 
178
- $uri = sprintf('%s://%s%s/%s%s', $scheme, $host, $port, $dir, $file);
179
  }
180
  } else {
181
  $uri = self::$_prependPath . $uri;
@@ -271,7 +271,7 @@ class Minify_CSS_UriRewriter {
271
 
272
  self::$debugText .= "traversals removed : {$uri}\n\n";
273
 
274
- $uri = str_replace(w3_get_site_path(), w3_get_blog_path(), $uri);
275
 
276
  return $uri;
277
  }
175
  $dir = (ltrim((strpos($dir_obj, '/') === 0 ? w3_realpath($dir_obj) : w3_realpath($dir_css . $dir_obj)), '/'));
176
  $file = basename($uri);
177
 
178
+ $uri = sprintf('%s://%s%s/%s/%s', $scheme, $host, $port, $dir, $file);
179
  }
180
  } else {
181
  $uri = self::$_prependPath . $uri;
271
 
272
  self::$debugText .= "traversals removed : {$uri}\n\n";
273
 
274
+ $uri = str_replace(w3_get_base_path(), w3_get_site_path(), $uri);
275
 
276
  return $uri;
277
  }
lib/Minify/Minify/Cache/File.php CHANGED
@@ -32,13 +32,20 @@ class Minify_Cache_File {
32
  : null;
33
  if (is_file($this->_path . '/' . $id)) {
34
  @unlink($this->_path . '/' . $id);
35
- }
 
 
 
 
 
 
 
36
  if (! @file_put_contents($this->_path . '/' . $id, $data, $flag)) {
37
  return false;
38
  }
39
  // write control
40
- if ($data !== $this->fetch($id)) {
41
- @unlink($file);
42
  return false;
43
  }
44
  return true;
32
  : null;
33
  if (is_file($this->_path . '/' . $id)) {
34
  @unlink($this->_path . '/' . $id);
35
+ }
36
+
37
+ $dir = dirname($id);
38
+
39
+ if ($dir) {
40
+ w3_mkdir($dir, 0755, $this->_path);
41
+ }
42
+
43
  if (! @file_put_contents($this->_path . '/' . $id, $data, $flag)) {
44
  return false;
45
  }
46
  // write control
47
+ if ($data != $this->fetch($id)) {
48
+ @unlink($this->_path . '/' . $id);
49
  return false;
50
  }
51
  return true;
lib/Minify/Minify/CombineOnly.php CHANGED
@@ -25,4 +25,4 @@ class Minify_CombineOnly
25
 
26
  return $content;
27
  }
28
- }
25
 
26
  return $content;
27
  }
28
+ }
lib/Minify/Minify/Controller/MinApp.php CHANGED
@@ -63,7 +63,7 @@ class Minify_Controller_MinApp extends Minify_Controller_Base {
63
  ));
64
  } else {
65
  $this->log("The path \"{$file}\" could not be found (or was not a file)");
66
- return $options;
67
  }
68
  }
69
  } elseif (! $cOptions['groupsOnly'] && isset($_GET['f'])) {
63
  ));
64
  } else {
65
  $this->log("The path \"{$file}\" could not be found (or was not a file)");
66
+ continue;
67
  }
68
  }
69
  } elseif (! $cOptions['groupsOnly'] && isset($_GET['f'])) {
lib/Minify/Minify/HTML.php CHANGED
@@ -1,18 +1,18 @@
1
  <?php
2
  /**
3
- * Class Minify_HTML
4
  * @package Minify
5
  */
6
 
7
  /**
8
  * Compress HTML
9
  *
10
- * This is a heavy regex-based removal of whitespace, unnecessary comments and
11
  * tokens. IE conditional comments are preserved. There are also options to have
12
- * STYLE and SCRIPT blocks compressed by callback functions.
13
- *
14
  * A test suite is available.
15
- *
16
  * @package Minify
17
  * @author Stephen Clay <steve@mrclay.org>
18
  */
@@ -27,21 +27,21 @@ class Minify_HTML {
27
  *
28
  * 'cssMinifier' : (optional) callback function to process content of STYLE
29
  * elements.
30
- *
31
  * 'jsMinifier' : (optional) callback function to process content of SCRIPT
32
  * elements. Note: the type attribute is ignored.
33
- *
34
  * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If
35
  * unset, minify will sniff for an XHTML doctype.
36
- *
37
  * @return string
38
  */
39
  public static function minify($html, $options = array()) {
40
  $min = new Minify_HTML($html, $options);
41
  return $min->process();
42
  }
43
-
44
-
45
  /**
46
  * Create a minifier object
47
  *
@@ -51,13 +51,13 @@ class Minify_HTML {
51
  *
52
  * 'cssMinifier' : (optional) callback function to process content of STYLE
53
  * elements.
54
- *
55
  * 'jsMinifier' : (optional) callback function to process content of SCRIPT
56
  * elements. Note: the type attribute is ignored.
57
- *
58
  * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If
59
  * unset, minify will sniff for an XHTML doctype.
60
- *
61
  * @return null
62
  */
63
  public function __construct($html, $options = array())
@@ -72,17 +72,18 @@ class Minify_HTML {
72
  if (isset($options['jsMinifier'])) {
73
  $this->_jsMinifier = $options['jsMinifier'];
74
  }
75
-
76
- $this->_stripCrlf = (isset($options['stripCrlf']) ? (boolean) $options['stripCrlf'] : false) ;
77
- $this->_cssStripCrlf = (isset($options['cssStripCrlf']) ? (boolean) $options['cssStripCrlf'] : false);
78
- $this->_cssStripComments = (isset($options['cssStripComments']) ? (boolean) $options['cssStripComments'] : false);
79
- $this->_jsStripCrlf = (isset($options['jsStripCrlf']) ? (boolean) $options['jsStripCrlf'] : false);
80
- $this->_jsStripComments = (isset($options['jsStripComments']) ? (boolean) $options['jsStripComments'] : false);
 
81
  }
82
-
83
  /**
84
  * Minify the markeup given in the constructor
85
- *
86
  * @return string
87
  */
88
  public function process()
@@ -90,65 +91,71 @@ class Minify_HTML {
90
  if ($this->_isXhtml === null) {
91
  $this->_isXhtml = (false !== strpos($this->_html, '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML'));
92
  }
93
-
94
  $this->_replacementHash = 'MINIFYHTML' . md5($_SERVER['REQUEST_TIME']);
95
  $this->_placeholders = array();
96
-
 
 
 
 
 
 
97
  // replace SCRIPTs (and minify) with placeholders
98
  $this->_html = preg_replace_callback(
99
  '/(\\s*)(<script\\b[^>]*?>)([\\s\\S]*?)<\\/script>(\\s*)/i'
100
  ,array($this, '_removeScriptCB')
101
  ,$this->_html);
102
-
103
  // replace STYLEs (and minify) with placeholders
104
  $this->_html = preg_replace_callback(
105
  '/\\s*(<style\\b[^>]*?>)([\\s\\S]*?)<\\/style>\\s*/i'
106
  ,array($this, '_removeStyleCB')
107
  ,$this->_html);
108
-
109
  // remove HTML comments (not containing IE conditional comments).
110
  $this->_html = preg_replace_callback(
111
  '/<!--([\\s\\S]*?)-->/'
112
  ,array($this, '_commentCB')
113
  ,$this->_html);
114
-
115
  // replace PREs with placeholders
116
  $this->_html = preg_replace_callback('/\\s*(<pre\\b[^>]*?>[\\s\\S]*?<\\/pre>)\\s*/i'
117
  ,array($this, '_removePreCB')
118
  ,$this->_html);
119
-
120
  // replace TEXTAREAs with placeholders
121
  $this->_html = preg_replace_callback(
122
  '/\\s*(<textarea\\b[^>]*?>[\\s\\S]*?<\\/textarea>)\\s*/i'
123
  ,array($this, '_removeTextareaCB')
124
  ,$this->_html);
125
-
126
  // trim each line.
127
  // @todo take into account attribute values that span multiple lines.
128
  $this->_html = preg_replace('/^\\s+|\\s+$/m', '', $this->_html);
129
-
130
  // remove ws around block/undisplayed elements
131
  $this->_html = preg_replace('/\\s+(<\\/?(?:area|base(?:font)?|blockquote|body'
132
  .'|caption|center|cite|col(?:group)?|dd|dir|div|dl|dt|fieldset|form'
133
  .'|frame(?:set)?|h[1-6]|head|hr|html|legend|li|link|map|menu|meta'
134
  .'|ol|opt(?:group|ion)|p|param|t(?:able|body|head|d|h||r|foot|itle)'
135
  .'|ul)\\b[^>]*>)/i', '$1', $this->_html);
136
-
137
  // remove ws outside of all elements
138
  $this->_html = preg_replace_callback(
139
  '/>([^<]+)</'
140
  ,array($this, '_outsideTagCB')
141
  ,$this->_html);
142
-
143
  // use newlines before 1st attribute in open tags (to limit line lengths)
144
  $this->_html = preg_replace('/(<[a-z\\-]+)\\s+([^>]+>)/i', "$1\n$2", $this->_html);
145
-
146
  if ($this->_stripCrlf) {
147
  $this->_html = preg_replace("~[\r\n]+~", ' ', $this->_html);
148
  } else {
149
  $this->_html = preg_replace("~[\r\n]+~", "\n", $this->_html);
150
  }
151
-
152
  // fill placeholders
153
  $this->_html = str_replace(
154
  array_keys($this->_placeholders)
@@ -157,14 +164,25 @@ class Minify_HTML {
157
  );
158
  return $this->_html;
159
  }
160
-
161
  protected function _commentCB($m)
162
  {
163
- return (0 === strpos($m[1], '[') || false !== strpos($m[1], '<!['))
164
  ? $m[0]
165
  : '';
166
  }
167
-
 
 
 
 
 
 
 
 
 
 
 
168
  protected function _reservePlace($content)
169
  {
170
  $placeholder = '%' . $this->_replacementHash . count($this->_placeholders) . '%';
@@ -177,17 +195,22 @@ class Minify_HTML {
177
  protected $_placeholders = array();
178
  protected $_cssMinifier = null;
179
  protected $_jsMinifier = null;
 
 
 
 
 
180
 
181
  protected function _outsideTagCB($m)
182
  {
183
  return '>' . preg_replace('/^\\s+|\\s+$/', ' ', $m[1]) . '<';
184
  }
185
-
186
  protected function _removePreCB($m)
187
  {
188
  return $this->_reservePlace($m[1]);
189
  }
190
-
191
  protected function _removeTextareaCB($m)
192
  {
193
  return $this->_reservePlace($m[1]);
@@ -199,26 +222,26 @@ class Minify_HTML {
199
  $css = $m[2];
200
  // remove HTML comments
201
  $css = preg_replace('/(?:^\\s*<!--|-->\\s*$)/', '', $css);
202
-
203
  // remove CDATA section markers
204
  $css = $this->_removeCdata($css);
205
-
206
  // minify
207
  $minifier = $this->_cssMinifier
208
  ? $this->_cssMinifier
209
  : 'trim';
210
  $css = call_user_func($minifier, $css);
211
-
212
  if ($this->_cssStripComments) {
213
  $css = preg_replace('~/\*.*\*/~Us', '', $css);
214
  }
215
-
216
  if ($this->_cssStripCrlf) {
217
  $css = preg_replace("~[\r\n]+~", ' ', $css);
218
  } else {
219
  $css = preg_replace("~[\r\n]+~", "\n", $css);
220
- }
221
-
222
  return $this->_reservePlace($this->_needsCdata($css)
223
  ? "{$openStyle}/*<![CDATA[*/{$css}/*]]>*/</style>"
224
  : "{$openStyle}{$css}</style>"
@@ -229,34 +252,34 @@ class Minify_HTML {
229
  {
230
  $openScript = $m[2];
231
  $js = $m[3];
232
-
233
  // whitespace surrounding? preserve at least one space
234
  $ws1 = ($m[1] === '') ? '' : ' ';
235
  $ws2 = ($m[4] === '') ? '' : ' ';
236
-
237
  // remove HTML comments (and ending "//" if present)
238
  $js = preg_replace('/(?:^\\s*<!--\\s*|\\s*(?:\\/\\/)?\\s*-->\\s*$)/', '', $js);
239
-
240
  // remove CDATA section markers
241
  $js = $this->_removeCdata($js);
242
-
243
  // minify
244
  $minifier = $this->_jsMinifier
245
  ? $this->_jsMinifier
246
- : 'trim';
247
  $js = call_user_func($minifier, $js);
248
-
249
  if ($this->_jsStripComments) {
250
  $js = preg_replace('~^//.*$~m', '', $js);
251
  $js = preg_replace('~/\*.*\*/~Us', '', $js);
252
  }
253
-
254
  if ($this->_jsStripCrlf) {
255
  $js = preg_replace("~[\r\n]+~", '', $js);
256
  } else {
257
  $js = preg_replace("~[\r\n]+~", "\n", $js);
258
  }
259
-
260
  return $this->_reservePlace($this->_needsCdata($js)
261
  ? "{$ws1}{$openScript}/*<![CDATA[*/{$js}/*]]>*/</script>{$ws2}"
262
  : "{$ws1}{$openScript}{$js}</script>{$ws2}"
@@ -269,15 +292,20 @@ class Minify_HTML {
269
  $str = str_replace('//<![CDATA[', '', $str);
270
  $str = str_replace('/*<![CDATA[*/', '', $str);
271
  $str = str_replace('<![CDATA[', '', $str);
272
-
273
  $str = str_replace('//]]>', '', $str);
274
  $str = str_replace('/*]]>*/', '', $str);
275
  $str = str_replace(']]>', '', $str);
276
  }
277
-
278
  return $str;
279
  }
280
-
 
 
 
 
 
281
  protected function _needsCdata($str)
282
  {
283
  return ($this->_isXhtml && preg_match('/(?:[<&]|\\-\\-|\\]\\]>)/', $str));
1
  <?php
2
  /**
3
+ * Class Minify_HTML
4
  * @package Minify
5
  */
6
 
7
  /**
8
  * Compress HTML
9
  *
10
+ * This is a heavy regex-based removal of whitespace, unnecessary comments and
11
  * tokens. IE conditional comments are preserved. There are also options to have
12
+ * STYLE and SCRIPT blocks compressed by callback functions.
13
+ *
14
  * A test suite is available.
15
+ *
16
  * @package Minify
17
  * @author Stephen Clay <steve@mrclay.org>
18
  */
27
  *
28
  * 'cssMinifier' : (optional) callback function to process content of STYLE
29
  * elements.
30
+ *
31
  * 'jsMinifier' : (optional) callback function to process content of SCRIPT
32
  * elements. Note: the type attribute is ignored.
33
+ *
34
  * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If
35
  * unset, minify will sniff for an XHTML doctype.
36
+ *
37
  * @return string
38
  */
39
  public static function minify($html, $options = array()) {
40
  $min = new Minify_HTML($html, $options);
41
  return $min->process();
42
  }
43
+
44
+
45
  /**
46
  * Create a minifier object
47
  *
51
  *
52
  * 'cssMinifier' : (optional) callback function to process content of STYLE
53
  * elements.
54
+ *
55
  * 'jsMinifier' : (optional) callback function to process content of SCRIPT
56
  * elements. Note: the type attribute is ignored.
57
+ *
58
  * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If
59
  * unset, minify will sniff for an XHTML doctype.
60
+ *
61
  * @return null
62
  */
63
  public function __construct($html, $options = array())
72
  if (isset($options['jsMinifier'])) {
73
  $this->_jsMinifier = $options['jsMinifier'];
74
  }
75
+
76
+ $this->_stripCrlf = (isset($options['stripCrlf']) ? (boolean) $options['stripCrlf'] : false) ;
77
+ $this->_cssStripCrlf = (isset($options['cssStripCrlf']) ? (boolean) $options['cssStripCrlf'] : false);
78
+ $this->_cssStripComments = (isset($options['cssStripComments']) ? (boolean) $options['cssStripComments'] : false);
79
+ $this->_jsStripCrlf = (isset($options['jsStripCrlf']) ? (boolean) $options['jsStripCrlf'] : false);
80
+ $this->_jsStripComments = (isset($options['jsStripComments']) ? (boolean) $options['jsStripComments'] : false);
81
+ $this->_ignoredComments = (isset($options['ignoredComments']) ? (array) $options['ignoredComments'] : array());
82
  }
83
+
84
  /**
85
  * Minify the markeup given in the constructor
86
+ *
87
  * @return string
88
  */
89
  public function process()
91
  if ($this->_isXhtml === null) {
92
  $this->_isXhtml = (false !== strpos($this->_html, '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML'));
93
  }
94
+
95
  $this->_replacementHash = 'MINIFYHTML' . md5($_SERVER['REQUEST_TIME']);
96
  $this->_placeholders = array();
97
+
98
+ // replace dynamic tags
99
+ $this->_html = preg_replace_callback(
100
+ '~(<!--\s*m(func|clude)(.*)-->\s*<!--\s*/m(func|clude)\s*-->)~is'
101
+ ,array($this, '_removeComment')
102
+ ,$this->_html);
103
+
104
  // replace SCRIPTs (and minify) with placeholders
105
  $this->_html = preg_replace_callback(
106
  '/(\\s*)(<script\\b[^>]*?>)([\\s\\S]*?)<\\/script>(\\s*)/i'
107
  ,array($this, '_removeScriptCB')
108
  ,$this->_html);
109
+
110
  // replace STYLEs (and minify) with placeholders
111
  $this->_html = preg_replace_callback(
112
  '/\\s*(<style\\b[^>]*?>)([\\s\\S]*?)<\\/style>\\s*/i'
113
  ,array($this, '_removeStyleCB')
114
  ,$this->_html);
115
+
116
  // remove HTML comments (not containing IE conditional comments).
117
  $this->_html = preg_replace_callback(
118
  '/<!--([\\s\\S]*?)-->/'
119
  ,array($this, '_commentCB')
120
  ,$this->_html);
121
+
122
  // replace PREs with placeholders
123
  $this->_html = preg_replace_callback('/\\s*(<pre\\b[^>]*?>[\\s\\S]*?<\\/pre>)\\s*/i'
124
  ,array($this, '_removePreCB')
125
  ,$this->_html);
126
+
127
  // replace TEXTAREAs with placeholders
128
  $this->_html = preg_replace_callback(
129
  '/\\s*(<textarea\\b[^>]*?>[\\s\\S]*?<\\/textarea>)\\s*/i'
130
  ,array($this, '_removeTextareaCB')
131
  ,$this->_html);
132
+
133
  // trim each line.
134
  // @todo take into account attribute values that span multiple lines.
135
  $this->_html = preg_replace('/^\\s+|\\s+$/m', '', $this->_html);
136
+
137
  // remove ws around block/undisplayed elements
138
  $this->_html = preg_replace('/\\s+(<\\/?(?:area|base(?:font)?|blockquote|body'
139
  .'|caption|center|cite|col(?:group)?|dd|dir|div|dl|dt|fieldset|form'
140
  .'|frame(?:set)?|h[1-6]|head|hr|html|legend|li|link|map|menu|meta'
141
  .'|ol|opt(?:group|ion)|p|param|t(?:able|body|head|d|h||r|foot|itle)'
142
  .'|ul)\\b[^>]*>)/i', '$1', $this->_html);
143
+
144
  // remove ws outside of all elements
145
  $this->_html = preg_replace_callback(
146
  '/>([^<]+)</'
147
  ,array($this, '_outsideTagCB')
148
  ,$this->_html);
149
+
150
  // use newlines before 1st attribute in open tags (to limit line lengths)
151
  $this->_html = preg_replace('/(<[a-z\\-]+)\\s+([^>]+>)/i', "$1\n$2", $this->_html);
152
+
153
  if ($this->_stripCrlf) {
154
  $this->_html = preg_replace("~[\r\n]+~", ' ', $this->_html);
155
  } else {
156
  $this->_html = preg_replace("~[\r\n]+~", "\n", $this->_html);
157
  }
158
+
159
  // fill placeholders
160
  $this->_html = str_replace(
161
  array_keys($this->_placeholders)
164
  );
165
  return $this->_html;
166
  }
167
+
168
  protected function _commentCB($m)
169
  {
170
+ return (0 === strpos($m[1], '[') || false !== strpos($m[1], '<![') || $this->_ignoredComment($m[1]))
171
  ? $m[0]
172
  : '';
173
  }
174
+
175
+ protected function _ignoredComment($comment)
176
+ {
177
+ foreach ($this->_ignoredComments as $ignoredComment) {
178
+ if (stristr($comment, $ignoredComment) !== false) {
179
+ return true;
180
+ }
181
+ }
182
+
183
+ return false;
184
+ }
185
+
186
  protected function _reservePlace($content)
187
  {
188
  $placeholder = '%' . $this->_replacementHash . count($this->_placeholders) . '%';
195
  protected $_placeholders = array();
196
  protected $_cssMinifier = null;
197
  protected $_jsMinifier = null;
198
+ protected $_stripCrlf = null;
199
+ protected $_cssStripCrlf = null;
200
+ protected $_jsStripCrlf = null;
201
+ protected $_jsStripComments = null;
202
+ protected $_ignoredComments = null;
203
 
204
  protected function _outsideTagCB($m)
205
  {
206
  return '>' . preg_replace('/^\\s+|\\s+$/', ' ', $m[1]) . '<';
207
  }
208
+
209
  protected function _removePreCB($m)
210
  {
211
  return $this->_reservePlace($m[1]);
212
  }
213
+
214
  protected function _removeTextareaCB($m)
215
  {
216
  return $this->_reservePlace($m[1]);
222
  $css = $m[2];
223
  // remove HTML comments
224
  $css = preg_replace('/(?:^\\s*<!--|-->\\s*$)/', '', $css);
225
+
226
  // remove CDATA section markers
227
  $css = $this->_removeCdata($css);
228
+
229
  // minify
230
  $minifier = $this->_cssMinifier
231
  ? $this->_cssMinifier
232
  : 'trim';
233
  $css = call_user_func($minifier, $css);
234
+
235
  if ($this->_cssStripComments) {
236
  $css = preg_replace('~/\*.*\*/~Us', '', $css);
237
  }
238
+
239
  if ($this->_cssStripCrlf) {
240
  $css = preg_replace("~[\r\n]+~", ' ', $css);
241
  } else {
242
  $css = preg_replace("~[\r\n]+~", "\n", $css);
243
+ }
244
+
245
  return $this->_reservePlace($this->_needsCdata($css)
246
  ? "{$openStyle}/*<![CDATA[*/{$css}/*]]>*/</style>"
247
  : "{$openStyle}{$css}</style>"
252
  {
253
  $openScript = $m[2];
254
  $js = $m[3];
255
+
256
  // whitespace surrounding? preserve at least one space
257
  $ws1 = ($m[1] === '') ? '' : ' ';
258
  $ws2 = ($m[4] === '') ? '' : ' ';
259
+
260
  // remove HTML comments (and ending "//" if present)
261
  $js = preg_replace('/(?:^\\s*<!--\\s*|\\s*(?:\\/\\/)?\\s*-->\\s*$)/', '', $js);
262
+
263
  // remove CDATA section markers
264
  $js = $this->_removeCdata($js);
265
+
266
  // minify
267
  $minifier = $this->_jsMinifier
268
  ? $this->_jsMinifier
269
+ : 'trim';
270
  $js = call_user_func($minifier, $js);
271
+
272
  if ($this->_jsStripComments) {
273
  $js = preg_replace('~^//.*$~m', '', $js);
274
  $js = preg_replace('~/\*.*\*/~Us', '', $js);
275
  }
276
+
277
  if ($this->_jsStripCrlf) {
278
  $js = preg_replace("~[\r\n]+~", '', $js);
279
  } else {
280
  $js = preg_replace("~[\r\n]+~", "\n", $js);
281
  }
282
+
283
  return $this->_reservePlace($this->_needsCdata($js)
284
  ? "{$ws1}{$openScript}/*<![CDATA[*/{$js}/*]]>*/</script>{$ws2}"
285
  : "{$ws1}{$openScript}{$js}</script>{$ws2}"
292
  $str = str_replace('//<![CDATA[', '', $str);
293
  $str = str_replace('/*<![CDATA[*/', '', $str);
294
  $str = str_replace('<![CDATA[', '', $str);
295
+
296
  $str = str_replace('//]]>', '', $str);
297
  $str = str_replace('/*]]>*/', '', $str);
298
  $str = str_replace(']]>', '', $str);
299
  }
300
+
301
  return $str;
302
  }
303
+
304
+ protected function _removeComment($m)
305
+ {
306
+ return $this->_reservePlace($m[1]);
307
+ }
308
+
309
  protected function _needsCdata($str)
310
  {
311
  return ($this->_isXhtml && preg_match('/(?:[<&]|\\-\\-|\\]\\]>)/', $str));
lib/S3.php CHANGED
@@ -1046,11 +1046,7 @@ class S3 {
1046
  public static function __getMimeType(&$file) {
1047
  $type = w3_get_mime_type($file);
1048
 
1049
- if (! $type && function_exists('mime_content_type')) {
1050
- $type = trim(mime_content_type($file));
1051
- }
1052
-
1053
- return (! empty($type) ? $type : 'application/octet-stream');
1054
  }
1055
 
1056
 
@@ -1224,6 +1220,7 @@ final class S3Request {
1224
  curl_setopt($curl, CURLOPT_WRITEFUNCTION, array(&$this, '__responseWriteCallback'));
1225
  curl_setopt($curl, CURLOPT_HEADERFUNCTION, array(&$this, '__responseHeaderCallback'));
1226
  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
 
1227
 
1228
  // Request types
1229
  switch ($this->verb) {
1046
  public static function __getMimeType(&$file) {
1047
  $type = w3_get_mime_type($file);
1048
 
1049
+ return $type;
 
 
 
 
1050
  }
1051
 
1052
 
1220
  curl_setopt($curl, CURLOPT_WRITEFUNCTION, array(&$this, '__responseWriteCallback'));
1221
  curl_setopt($curl, CURLOPT_HEADERFUNCTION, array(&$this, '__responseHeaderCallback'));
1222
  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
1223
+ curl_setopt($curl, CURLOPT_TIMEOUT, 120);
1224
 
1225
  // Request types
1226
  switch ($this->verb) {
lib/W3/Cache/Apc.php CHANGED
@@ -18,7 +18,7 @@ class W3_Cache_Apc extends W3_Cache_Base
18
  * @param integer $expire
19
  * @return boolean
20
  */
21
- function add($key, $var, $expire = 0)
22
  {
23
  if ($this->get($key) === false) {
24
  return $this->set($key, $var, $expire);
@@ -35,7 +35,7 @@ class W3_Cache_Apc extends W3_Cache_Base
35
  * @param integer $expire
36
  * @return boolean
37
  */
38
- function set($key, $var, $expire = 0)
39
  {
40
  return apc_store($key, serialize($var), $expire);
41
  }
@@ -59,7 +59,7 @@ class W3_Cache_Apc extends W3_Cache_Base
59
  * @param integer $expire
60
  * @return boolean
61
  */
62
- function replace($key, $var, $expire = 0)
63
  {
64
  if ($this->get($key) !== false) {
65
  return $this->set($key, $var, $expire);
18
  * @param integer $expire
19
  * @return boolean
20
  */
21
+ function add($key, &$var, $expire = 0)
22
  {
23
  if ($this->get($key) === false) {
24
  return $this->set($key, $var, $expire);
35
  * @param integer $expire
36
  * @return boolean
37
  */
38
+ function set($key, &$var, $expire = 0)
39
  {
40
  return apc_store($key, serialize($var), $expire);
41
  }
59
  * @param integer $expire
60
  * @return boolean
61
  */
62
+ function replace($key, &$var, $expire = 0)
63
  {
64
  if ($this->get($key) !== false) {
65
  return $this->set($key, $var, $expire);
lib/W3/Cache/Base.php CHANGED
@@ -18,7 +18,7 @@ class W3_Cache_Base
18
  * @param integer $expire
19
  * @return boolean
20
  */
21
- function add($key, $data, $expire = 0)
22
  {
23
  return false;
24
  }
@@ -32,7 +32,7 @@ class W3_Cache_Base
32
  * @param integer $expire
33
  * @return boolean
34
  */
35
- function set($key, $data, $expire = 0)
36
  {
37
  return false;
38
  }
@@ -69,7 +69,7 @@ class W3_Cache_Base
69
  * @param integer $expire
70
  * @return boolean
71
  */
72
- function replace($key, $data, $expire = 0)
73
  {
74
  return false;
75
  }
18
  * @param integer $expire
19
  * @return boolean
20
  */
21
+ function add($key, &$data, $expire = 0)
22
  {
23
  return false;
24
  }
32
  * @param integer $expire
33
  * @return boolean
34
  */
35
+ function set($key, &$data, $expire = 0)
36
  {
37
  return false;
38
  }
69
  * @param integer $expire
70
  * @return boolean
71
  */
72
+ function replace($key, &$data, $expire = 0)
73
  {
74
  return false;
75
  }
lib/W3/Cache/Eaccelerator.php CHANGED
@@ -18,7 +18,7 @@ class W3_Cache_Eaccelerator extends W3_Cache_Base
18
  * @param integer $expire
19
  * @return boolean
20
  */
21
- function add($key, $var, $expire = 0)
22
  {
23
  if ($this->get($key) === false) {
24
  return $this->set($key, $var, $expire);
@@ -35,7 +35,7 @@ class W3_Cache_Eaccelerator extends W3_Cache_Base
35
  * @param integer $expire
36
  * @return boolean
37
  */
38
- function set($key, $var, $expire = 0)
39
  {
40
  return eaccelerator_put($key, serialize($var), $expire);
41
  }
@@ -59,7 +59,7 @@ class W3_Cache_Eaccelerator extends W3_Cache_Base
59
  * @param integer $expire
60
  * @return boolean
61
  */
62
- function replace($key, $var, $expire = 0)
63
  {
64
  if ($this->get($key) !== false) {
65
  return $this->set($key, $var, $expire);
18
  * @param integer $expire
19
  * @return boolean
20
  */
21
+ function add($key, &$var, $expire = 0)
22
  {
23
  if ($this->get($key) === false) {
24
  return $this->set($key, $var, $expire);
35
  * @param integer $expire
36
  * @return boolean
37
  */
38
+ function set($key, &$var, $expire = 0)
39
  {
40
  return eaccelerator_put($key, serialize($var), $expire);
41
  }
59
  * @param integer $expire
60
  * @return boolean
61
  */
62
+ function replace($key, &$var, $expire = 0)
63
  {
64
  if ($this->get($key) !== false) {
65
  return $this->set($key, $var, $expire);
lib/W3/Cache/File.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- if (! defined('W3_CACHE_FILE_EXPIRE_MAX')) {
4
  define('W3_CACHE_FILE_EXPIRE_MAX', 2592000);
5
  }
6
 
@@ -21,6 +21,13 @@ class W3_Cache_File extends W3_Cache_Base
21
  */
22
  var $_cache_dir = '';
23
 
 
 
 
 
 
 
 
24
  /**
25
  * PHP5 constructor
26
  *
@@ -29,6 +36,7 @@ class W3_Cache_File extends W3_Cache_Base
29
  function __construct($config = array())
30
  {
31
  $this->_cache_dir = isset($config['cache_dir']) ? trim($config['cache_dir']) : 'cache';
 
32
  }
33
 
34
  /**
@@ -50,7 +58,7 @@ class W3_Cache_File extends W3_Cache_Base
50
  * @param integer $expire
51
  * @return boolean
52
  */
53
- function add($key, $var, $expire = 0)
54
  {
55
  if ($this->get($key) === false) {
56
  return $this->set($key, $var, $expire);
@@ -67,7 +75,7 @@ class W3_Cache_File extends W3_Cache_Base
67
  * @param integer $expire
68
  * @return boolean
69
  */
70
- function set($key, $var, $expire = 0)
71
  {
72
  $sub_path = $this->_get_path($key);
73
  $path = $this->_cache_dir . '/' . $sub_path;
@@ -75,12 +83,22 @@ class W3_Cache_File extends W3_Cache_Base
75
  $sub_dir = dirname($sub_path);
76
  $dir = dirname($path);
77
 
78
- if ((is_dir($dir) || w3_mkdir($sub_dir, 0755, $this->_cache_dir))) {
79
  $fp = @fopen($path, 'wb');
 
80
  if ($fp) {
 
 
 
 
81
  @fputs($fp, pack('L', $expire));
82
  @fputs($fp, @serialize($var));
83
  @fclose($fp);
 
 
 
 
 
84
  return true;
85
  }
86
  }
@@ -101,21 +119,36 @@ class W3_Cache_File extends W3_Cache_Base
101
 
102
  if (is_readable($path)) {
103
  $ftime = @filemtime($path);
 
104
  if ($ftime) {
105
  $fp = @fopen($path, 'rb');
 
106
  if ($fp) {
 
 
 
 
107
  $expires = @fread($fp, 4);
 
108
  if ($expires !== false) {
109
- list (, $expire) = @unpack('L', $expires);
110
  $expire = ($expire && $expire <= W3_CACHE_FILE_EXPIRE_MAX ? $expire : W3_CACHE_FILE_EXPIRE_MAX);
 
111
  if ($ftime > time() - $expire) {
112
  $data = '';
113
- while (! @feof($fp)) {
 
114
  $data .= @fread($fp, 4096);
115
  }
 
116
  $var = @unserialize($data);
117
  }
118
  }
 
 
 
 
 
119
  @fclose($fp);
120
  }
121
  }
@@ -132,7 +165,7 @@ class W3_Cache_File extends W3_Cache_Base
132
  * @param integer $expire
133
  * @return boolean
134
  */
135
- function replace($key, $var, $expire = 0)
136
  {
137
  if ($this->get($key) !== false) {
138
  return $this->set($key, $var, $expire);
@@ -165,6 +198,8 @@ class W3_Cache_File extends W3_Cache_Base
165
  */
166
  function flush()
167
  {
 
 
168
  w3_emptydir($this->_cache_dir);
169
 
170
  return true;
@@ -172,7 +207,7 @@ class W3_Cache_File extends W3_Cache_Base
172
 
173
  /**
174
  * Returns modification time of cache file
175
- *
176
  * @param integer $key
177
  */
178
  function mtime($key)
@@ -195,7 +230,7 @@ class W3_Cache_File extends W3_Cache_Base
195
  function _get_path($key)
196
  {
197
  $hash = md5($key);
198
- $path = sprintf('%s/%s/%s', substr($hash, 0, 2), substr($hash, 2, 2), $hash);
199
 
200
  return $path;
201
  }
1
  <?php
2
 
3
+ if (!defined('W3_CACHE_FILE_EXPIRE_MAX')) {
4
  define('W3_CACHE_FILE_EXPIRE_MAX', 2592000);
5
  }
6
 
21
  */
22
  var $_cache_dir = '';
23
 
24
+ /**
25
+ * File locking
26
+ *
27
+ * @var boolean
28
+ */
29
+ var $_locking = false;
30
+
31
  /**
32
  * PHP5 constructor
33
  *
36
  function __construct($config = array())
37
  {
38
  $this->_cache_dir = isset($config['cache_dir']) ? trim($config['cache_dir']) : 'cache';
39
+ $this->_locking = isset($config['locking']) ? (boolean) $config['locking'] : false;
40
  }
41
 
42
  /**
58
  * @param integer $expire
59
  * @return boolean
60
  */
61
+ function add($key, &$var, $expire = 0)
62
  {
63
  if ($this->get($key) === false) {
64
  return $this->set($key, $var, $expire);
75
  * @param integer $expire
76
  * @return boolean
77
  */
78
+ function set($key, &$var, $expire = 0)
79
  {
80
  $sub_path = $this->_get_path($key);
81
  $path = $this->_cache_dir . '/' . $sub_path;
83
  $sub_dir = dirname($sub_path);
84
  $dir = dirname($path);
85
 
86
+ if ((@is_dir($dir) || w3_mkdir($sub_dir, 0755, $this->_cache_dir))) {
87
  $fp = @fopen($path, 'wb');
88
+
89
  if ($fp) {
90
+ if ($this->_locking) {
91
+ @flock($fp, LOCK_EX);
92
+ }
93
+
94
  @fputs($fp, pack('L', $expire));
95
  @fputs($fp, @serialize($var));
96
  @fclose($fp);
97
+
98
+ if ($this->_locking) {
99
+ @flock($fp, LOCK_UN);
100
+ }
101
+
102
  return true;
103
  }
104
  }
119
 
120
  if (is_readable($path)) {
121
  $ftime = @filemtime($path);
122
+
123
  if ($ftime) {
124
  $fp = @fopen($path, 'rb');
125
+
126
  if ($fp) {
127
+ if ($this->_locking) {
128
+ @flock($fp, LOCK_SH);
129
+ }
130
+
131
  $expires = @fread($fp, 4);
132
+
133
  if ($expires !== false) {
134
+ list(, $expire) = @unpack('L', $expires);
135
  $expire = ($expire && $expire <= W3_CACHE_FILE_EXPIRE_MAX ? $expire : W3_CACHE_FILE_EXPIRE_MAX);
136
+
137
  if ($ftime > time() - $expire) {
138
  $data = '';
139
+
140
+ while (!@feof($fp)) {
141
  $data .= @fread($fp, 4096);
142
  }
143
+
144
  $var = @unserialize($data);
145
  }
146
  }
147
+
148
+ if ($this->_locking) {
149
+ @flock($fp, LOCK_UN);
150
+ }
151
+
152
  @fclose($fp);
153
  }
154
  }
165
  * @param integer $expire
166
  * @return boolean
167
  */
168
+ function replace($key, &$var, $expire = 0)
169
  {
170
  if ($this->get($key) !== false) {
171
  return $this->set($key, $var, $expire);
198
  */
199
  function flush()
200
  {
201
+ @set_time_limit(180);
202
+
203
  w3_emptydir($this->_cache_dir);
204
 
205
  return true;
207
 
208
  /**
209
  * Returns modification time of cache file
210
+ *
211
  * @param integer $key
212
  */
213
  function mtime($key)
230
  function _get_path($key)
231
  {
232
  $hash = md5($key);
233
+ $path = sprintf('%s/%s/%s/%s', substr($hash, 0, 1), substr($hash, 1, 1), substr($hash, 2, 1), $hash);
234
 
235
  return $path;
236
  }
lib/W3/Cache/File/Manager.php CHANGED
@@ -18,6 +18,8 @@ class W3_Cache_File_Manager
18
 
19
  function clean()
20
  {
 
 
21
  $this->_clean($this->_cache_dir, false);
22
  }
23
 
@@ -26,13 +28,13 @@ class W3_Cache_File_Manager
26
  $dir = @opendir($path);
27
 
28
  if ($dir) {
29
- while (($entry = @readdir($dir))) {
30
  if ($entry != '.' && $entry != '..') {
31
  $full_path = $path . '/' . $entry;
32
 
33
- if (is_dir($full_path)) {
34
  $this->_clean($full_path);
35
- } elseif (! $this->is_valid($full_path)) {
36
  @unlink($full_path);
37
  }
38
  }
@@ -60,7 +62,7 @@ class W3_Cache_File_Manager
60
  $expires = @fread($fp, 4);
61
 
62
  if ($expires !== false) {
63
- list (, $expire) = @unpack('L', $expires);
64
  $expire = ($expire && $expire <= W3_CACHE_FILE_EXPIRE_MAX ? $expire : W3_CACHE_FILE_EXPIRE_MAX);
65
  if ($ftime > (time() - $expire)) {
66
  $valid = true;
18
 
19
  function clean()
20
  {
21
+ @set_time_limit(180);
22
+
23
  $this->_clean($this->_cache_dir, false);
24
  }
25
 
28
  $dir = @opendir($path);
29
 
30
  if ($dir) {
31
+ while (($entry = @readdir($dir)) !== false) {
32
  if ($entry != '.' && $entry != '..') {
33
  $full_path = $path . '/' . $entry;
34
 
35
+ if (@is_dir($full_path)) {
36
  $this->_clean($full_path);
37
+ } elseif (!$this->is_valid($full_path)) {
38
  @unlink($full_path);
39
  }
40
  }
62
  $expires = @fread($fp, 4);
63
 
64
  if ($expires !== false) {
65
+ list(, $expire) = @unpack('L', $expires);
66
  $expire = ($expire && $expire <= W3_CACHE_FILE_EXPIRE_MAX ? $expire : W3_CACHE_FILE_EXPIRE_MAX);
67
  if ($ftime > (time() - $expire)) {
68
  $valid = true;
lib/W3/Cache/File/PgCache.php CHANGED
@@ -10,19 +10,35 @@ require_once W3TC_LIB_W3_DIR . '/Cache/File.php';
10
  */
11
  class W3_Cache_File_PgCache extends W3_Cache_File
12
  {
 
 
 
 
 
13
  var $_expire = 0;
14
 
 
 
 
 
 
 
15
  function __construct($config = array())
16
  {
17
  parent::__construct($config);
18
 
19
  $this->_expire = (isset($config['expire']) ? (int) $config['expire'] : 0);
20
 
21
- if (! $this->_expire || $this->_expire > W3_CACHE_FILE_EXPIRE_MAX) {
22
  $this->_expire = W3_CACHE_FILE_EXPIRE_MAX;
23
  }
24
  }
25
 
 
 
 
 
 
26
  function W3_Cache_File_PgCache($config = array())
27
  {
28
  $this->__construct($config);
@@ -30,7 +46,7 @@ class W3_Cache_File_PgCache extends W3_Cache_File
30
 
31
  /**
32
  * Sets data
33
- *
34
  * @param string $key
35
  * @param string $var
36
  * @return boolean
@@ -43,12 +59,21 @@ class W3_Cache_File_PgCache extends W3_Cache_File
43
  $sub_dir = dirname($sub_path);
44
  $dir = dirname($path);
45
 
46
- if ((is_dir($dir) || w3_mkdir($sub_dir, 0755, $this->_cache_dir))) {
47
  $fp = @fopen($path, 'w');
 
48
  if ($fp) {
 
 
 
 
49
  @fputs($fp, $var);
50
  @fclose($fp);
51
 
 
 
 
 
52
  return true;
53
  }
54
  }
@@ -58,7 +83,7 @@ class W3_Cache_File_PgCache extends W3_Cache_File
58
 
59
  /**
60
  * Returns data
61
- *
62
  * @param string $key
63
  * @return string
64
  */
@@ -74,11 +99,21 @@ class W3_Cache_File_PgCache extends W3_Cache_File
74
  $fp = @fopen($path, 'r');
75
 
76
  if ($fp) {
 
 
 
 
77
  $var = '';
78
- while (! @feof($fp)) {
 
79
  $var .= @fread($fp, 4096);
80
  }
 
81
  @fclose($fp);
 
 
 
 
82
  }
83
  }
84
  }
@@ -93,6 +128,8 @@ class W3_Cache_File_PgCache extends W3_Cache_File
93
  */
94
  function flush()
95
  {
 
 
96
  w3_emptydir($this->_cache_dir, array(
97
  $this->_cache_dir . '/.htaccess'
98
  ));
@@ -102,7 +139,7 @@ class W3_Cache_File_PgCache extends W3_Cache_File
102
 
103
  /**
104
  * Returns cache file path by key
105
- *
106
  * @param string $key
107
  * @return string
108
  */
10
  */
11
  class W3_Cache_File_PgCache extends W3_Cache_File
12
  {
13
+ /**
14
+ * Expire
15
+ *
16
+ * @var integer
17
+ */
18
  var $_expire = 0;
19
 
20
+ /**
21
+ * PHP5 style constructor
22
+ *
23
+ * @param array $config
24
+ * @return void
25
+ */
26
  function __construct($config = array())
27
  {
28
  parent::__construct($config);
29
 
30
  $this->_expire = (isset($config['expire']) ? (int) $config['expire'] : 0);
31
 
32
+ if (!$this->_expire || $this->_expire > W3_CACHE_FILE_EXPIRE_MAX) {
33
  $this->_expire = W3_CACHE_FILE_EXPIRE_MAX;
34
  }
35
  }
36
 
37
+ /**
38
+ * PHP4 style constructor
39
+ * @param array $config
40
+ * @return void
41
+ */
42
  function W3_Cache_File_PgCache($config = array())
43
  {
44
  $this->__construct($config);
46
 
47
  /**
48
  * Sets data
49
+ *
50
  * @param string $key
51
  * @param string $var
52
  * @return boolean
59
  $sub_dir = dirname($sub_path);
60
  $dir = dirname($path);
61
 
62
+ if ((@is_dir($dir) || w3_mkdir($sub_dir, 0755, $this->_cache_dir))) {
63
  $fp = @fopen($path, 'w');
64
+
65
  if ($fp) {
66
+ if ($this->_locking) {
67
+ @flock($fp, LOCK_EX);
68
+ }
69
+
70
  @fputs($fp, $var);
71
  @fclose($fp);
72
 
73
+ if ($this->_locking) {
74
+ @flock($fp, LOCK_UN);
75
+ }
76
+
77
  return true;
78
  }
79
  }
83
 
84
  /**
85
  * Returns data
86
+ *
87
  * @param string $key
88
  * @return string
89
  */
99
  $fp = @fopen($path, 'r');
100
 
101
  if ($fp) {
102
+ if ($this->_locking) {
103
+ @flock($fp, LOCK_SH);
104
+ }
105
+
106
  $var = '';
107
+
108
+ while (!@feof($fp)) {
109
  $var .= @fread($fp, 4096);
110
  }
111
+
112
  @fclose($fp);
113
+
114
+ if ($this->_locking) {
115
+ @flock($fp, LOCK_UN);
116
+ }
117
  }
118
  }
119
  }
128
  */
129
  function flush()
130
  {
131
+ @set_time_limit(180);
132
+
133
  w3_emptydir($this->_cache_dir, array(
134
  $this->_cache_dir . '/.htaccess'
135
  ));
139
 
140
  /**
141
  * Returns cache file path by key
142
+ *
143
  * @param string $key
144
  * @return string
145
  */
lib/W3/Cache/Memcached.php CHANGED
@@ -58,7 +58,7 @@ class W3_Cache_Memcached extends W3_Cache_Base
58
  * @param integer $expire
59
  * @return boolean
60
  */
61
- function add($key, $var, $expire = 0)
62
  {
63
  return @$this->_memcache->add($key, $var, false, $expire);
64
  }
@@ -71,7 +71,7 @@ class W3_Cache_Memcached extends W3_Cache_Base
71
  * @param integer $expire
72
  * @return boolean
73
  */
74
- function set($key, $var, $expire = 0)
75
  {
76
  return @$this->_memcache->set($key, $var, false, $expire);
77
  }
@@ -95,7 +95,7 @@ class W3_Cache_Memcached extends W3_Cache_Base
95
  * @param integer $expire
96
  * @return boolean
97
  */
98
- function replace($key, $var, $expire = 0)
99
  {
100
  return @$this->_memcache->replace($key, $var, false, $expire);
101
  }
58
  * @param integer $expire
59
  * @return boolean
60
  */
61
+ function add($key, &$var, $expire = 0)
62
  {
63
  return @$this->_memcache->add($key, $var, false, $expire);
64
  }
71
  * @param integer $expire
72
  * @return boolean
73
  */
74
+ function set($key, &$var, $expire = 0)
75
  {
76
  return @$this->_memcache->set($key, $var, false, $expire);
77
  }
95
  * @param integer $expire
96
  * @return boolean
97
  */
98
+ function replace($key, &$var, $expire = 0)
99
  {
100
  return @$this->_memcache->replace($key, $var, false, $expire);
101
  }
lib/W3/Cache/Xcache.php CHANGED
@@ -18,7 +18,7 @@ class W3_Cache_Xcache extends W3_Cache_Base
18
  * @param integer $expire
19
  * @return boolean
20
  */
21
- function add($key, $var, $expire = 0)
22
  {
23
  if ($this->get($key) === false) {
24
  return $this->set($key, $var, $expire);
@@ -35,7 +35,7 @@ class W3_Cache_Xcache extends W3_Cache_Base
35
  * @param integer $expire
36
  * @return boolean
37
  */
38
- function set($key, $var, $expire = 0)
39
  {
40
  return xcache_set($key, serialize($var), $expire);
41
  }
@@ -59,7 +59,7 @@ class W3_Cache_Xcache extends W3_Cache_Base
59
  * @param integer $expire
60
  * @return boolean
61
  */
62
- function replace($key, $var, $expire = 0)
63
  {
64
  if ($this->get($key) !== false) {
65
  return $this->set($key, $var, $expire);
18
  * @param integer $expire
19
  * @return boolean
20
  */
21
+ function add($key, &$var, $expire = 0)
22
  {
23
  if ($this->get($key) === false) {
24
  return $this->set($key, $var, $expire);
35
  * @param integer $expire
36
  * @return boolean
37
  */
38
+ function set($key, &$var, $expire = 0)
39
  {
40
  return xcache_set($key, serialize($var), $expire);
41
  }
59
  * @param integer $expire
60
  * @return boolean
61
  */
62
+ function replace($key, &$var, $expire = 0)
63
  {
64
  if ($this->get($key) !== false) {
65
  return $this->set($key, $var, $expire);
lib/W3/Cdn.php CHANGED
@@ -4,22 +4,30 @@
4
  * W3 CDN Class
5
  */
6
 
7
- if (! defined('W3_CDN_FTP')) {
8
  define('W3_CDN_FTP', 'ftp');
9
  }
10
 
11
- if (! defined('W3_CDN_CF')) {
12
  define('W3_CDN_CF', 'cf');
13
  }
14
 
15
- if (! defined('W3_CDN_S3')) {
16
  define('W3_CDN_S3', 's3');
17
  }
18
 
19
- if (! defined('W3_CDN_MIRROR')) {
20
  define('W3_CDN_MIRROR', 'mirror');
21
  }
22
 
 
 
 
 
 
 
 
 
23
  /**
24
  * Class W3_Cdn
25
  */
@@ -38,29 +46,39 @@ class W3_Cdn
38
 
39
  $instance_key = sprintf('%s_%s', $engine, md5(serialize($config)));
40
 
41
- if (! isset($instances[$instance_key])) {
42
  switch (true) {
43
- case ($engine == W3_CDN_FTP):
44
  require_once W3TC_LIB_W3_DIR . '/Cdn/Ftp.php';
45
  $instances[$instance_key] = & new W3_Cdn_Ftp($config);
46
  break;
47
 
48
- case (W3TC_PHP5 && $engine == W3_CDN_CF):
 
 
 
 
 
49
  require_once W3TC_LIB_W3_DIR . '/Cdn/Cf.php';
50
  $instances[$instance_key] = & new W3_Cdn_Cf($config);
51
  break;
52
 
53
- case (W3TC_PHP5 && $engine == W3_CDN_S3):
54
- require_once W3TC_LIB_W3_DIR . '/Cdn/S3.php';
55
- $instances[$instance_key] = & new W3_Cdn_S3($config);
56
  break;
57
 
58
- case ($engine == W3_CDN_MIRROR):
59
  require_once W3TC_LIB_W3_DIR . '/Cdn/Mirror.php';
60
  $instances[$instance_key] = & new W3_Cdn_Mirror($config);
61
  break;
62
 
63
- default:
 
 
 
 
 
64
  trigger_error('Incorrect CDN engine', E_USER_WARNING);
65
  require_once W3TC_LIB_W3_DIR . '/Cdn/Base.php';
66
  $instances[$instance_key] = & new W3_Cdn_Base();
4
  * W3 CDN Class
5
  */
6
 
7
+ if (!defined('W3_CDN_FTP')) {
8
  define('W3_CDN_FTP', 'ftp');
9
  }
10
 
11
+ if (!defined('W3_CDN_CF')) {
12
  define('W3_CDN_CF', 'cf');
13
  }
14
 
15
+ if (!defined('W3_CDN_S3')) {
16
  define('W3_CDN_S3', 's3');
17
  }
18
 
19
+ if (!defined('W3_CDN_MIRROR')) {
20
  define('W3_CDN_MIRROR', 'mirror');
21
  }
22
 
23
+ if (!defined('W3_CDN_NETDNA')) {
24
+ define('W3_CDN_NETDNA', 'netdna');
25
+ }
26
+
27
+ if (!defined('W3_CDN_RSCF')) {
28
+ define('W3_CDN_RSCF', 'rscf');
29
+ }
30
+
31
  /**
32
  * Class W3_Cdn
33
  */
46
 
47
  $instance_key = sprintf('%s_%s', $engine, md5(serialize($config)));
48
 
49
+ if (!isset($instances[$instance_key])) {
50
  switch (true) {
51
+ case ($engine == W3_CDN_FTP) :
52
  require_once W3TC_LIB_W3_DIR . '/Cdn/Ftp.php';
53
  $instances[$instance_key] = & new W3_Cdn_Ftp($config);
54
  break;
55
 
56
+ case (W3TC_PHP5 && $engine == W3_CDN_S3) :
57
+ require_once W3TC_LIB_W3_DIR . '/Cdn/S3.php';
58
+ $instances[$instance_key] = & new W3_Cdn_S3($config);
59
+ break;
60
+
61
+ case (W3TC_PHP5 && $engine == W3_CDN_CF) :
62
  require_once W3TC_LIB_W3_DIR . '/Cdn/Cf.php';
63
  $instances[$instance_key] = & new W3_Cdn_Cf($config);
64
  break;
65
 
66
+ case (W3TC_PHP5 && $engine == W3_CDN_RSCF) :
67
+ require_once W3TC_LIB_W3_DIR . '/Cdn/Rscf.php';
68
+ $instances[$instance_key] = & new W3_Cdn_Rscf($config);
69
  break;
70
 
71
+ case ($engine == W3_CDN_MIRROR) :
72
  require_once W3TC_LIB_W3_DIR . '/Cdn/Mirror.php';
73
  $instances[$instance_key] = & new W3_Cdn_Mirror($config);
74
  break;
75
 
76
+ case ($engine == W3_CDN_NETDNA) :
77
+ require_once W3TC_LIB_W3_DIR . '/Cdn/Netdna.php';
78
+ $instances[$instance_key] = & new W3_Cdn_Netdna($config);
79
+ break;
80
+
81
+ default :
82
  trigger_error('Incorrect CDN engine', E_USER_WARNING);
83
  require_once W3TC_LIB_W3_DIR . '/Cdn/Base.php';
84
  $instances[$instance_key] = & new W3_Cdn_Base();
lib/W3/Cdn/Base.php CHANGED
@@ -4,16 +4,16 @@
4
  * W3 CDN Base class
5
  */
6
 
7
- if (! defined('W3_CDN_RESULT_HALT')) {
8
- define('W3_CDN_RESULT_HALT', - 1);
9
  }
10
 
11
- if (! defined('W3_CDN_RESULT_ERROR')) {
12
- define('W3_CDN_RESULT_ERROR', 0);
13
  }
14
 
15
- if (! defined('W3_CDN_RESULT_OK')) {
16
- define('W3_CDN_RESULT_OK', 1);
17
  }
18
 
19
  /**
@@ -28,6 +28,12 @@ class W3_Cdn_Base
28
  */
29
  var $_config = array();
30
 
 
 
 
 
 
 
31
  /**
32
  * PHP5 Constructor
33
  *
@@ -58,7 +64,8 @@ class W3_Cdn_Base
58
  */
59
  function upload($files, &$results, $force_rewrite = false)
60
  {
61
- $results = $this->get_results($files, W3_CDN_RESULT_HALT, 'Not implemented.');
 
62
  return false;
63
  }
64
 
@@ -71,10 +78,23 @@ class W3_Cdn_Base
71
  */
72
  function delete($files, &$results)
73
  {
74
- $results = $this->get_results($files, W3_CDN_RESULT_HALT, 'Not implemented.');
 
75
  return false;
76
  }
77
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  /**
79
  * Test CDN server
80
  *
@@ -82,21 +102,54 @@ class W3_Cdn_Base
82
  * @return boolean
83
  */
84
  function test(&$error)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  {
86
  $error = 'Not implemented.';
 
87
  return false;
88
  }
89
 
90
  /**
91
- * Returns CDN domain
92
- *
93
  * @return string
94
  */
95
  function get_domain()
96
  {
 
 
 
 
 
 
97
  return false;
98
  }
99
 
 
 
 
 
 
 
 
 
 
 
100
  /**
101
  * Returns via string
102
  *
@@ -104,7 +157,13 @@ class W3_Cdn_Base
104
  */
105
  function get_via()
106
  {
107
- return $this->get_domain();
 
 
 
 
 
 
108
  }
109
 
110
  /**
@@ -115,10 +174,48 @@ class W3_Cdn_Base
115
  */
116
  function format_url($path)
117
  {
118
- $domain = $this->get_domain();
 
119
 
120
- if ($domain) {
121
- $url = sprintf('%s://%s%s', (w3_is_https() ? 'https' : 'http'), $domain, $path);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
122
 
123
  return $url;
124
  }
@@ -134,7 +231,7 @@ class W3_Cdn_Base
134
  * @param string $error
135
  * @return array
136
  */
137
- function get_results($files, $result = W3_CDN_RESULT_OK, $error = 'OK')
138
  {
139
  $results = array();
140
 
@@ -154,7 +251,7 @@ class W3_Cdn_Base
154
  * @param string $error
155
  * @return array
156
  */
157
- function get_result($local_path, $remote_path, $result = W3_CDN_RESULT_OK, $error = 'OK')
158
  {
159
  return array(
160
  'local_path' => $local_path,
@@ -163,4 +260,206 @@ class W3_Cdn_Base
163
  'error' => $error
164
  );
165
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
  }
4
  * W3 CDN Base class
5
  */
6
 
7
+ if (!defined('W3TC_CDN_RESULT_HALT')) {
8
+ define('W3TC_CDN_RESULT_HALT', -1);
9
  }
10
 
11
+ if (!defined('W3TC_CDN_RESULT_ERROR')) {
12
+ define('W3TC_CDN_RESULT_ERROR', 0);
13
  }
14
 
15
+ if (!defined('W3TC_CDN_RESULT_OK')) {
16
+ define('W3TC_CDN_RESULT_OK', 1);
17
  }
18
 
19
  /**
28
  */
29
  var $_config = array();
30
 
31
+ /**
32
+ * Cache config
33
+ * @var array
34
+ */
35
+ var $cache_config = array();
36
+
37
  /**
38
  * PHP5 Constructor
39
  *
64
  */
65
  function upload($files, &$results, $force_rewrite = false)
66
  {
67
+ $results = $this->get_results($files, W3TC_CDN_RESULT_HALT, 'Not implemented.');
68
+
69
  return false;
70
  }
71
 
78
  */
79
  function delete($files, &$results)
80
  {
81
+ $results = $this->get_results($files, W3TC_CDN_RESULT_HALT, 'Not implemented.');
82
+
83
  return false;
84
  }
85
 
86
+ /**
87
+ * Purges URLs from CDN
88
+ *
89
+ * @param array $files
90
+ * @param array $results
91
+ * @return boolean
92
+ */
93
+ function purge($files, &$results)
94
+ {
95
+ return $this->upload($files, $results, true);
96
+ }
97
+
98
  /**
99
  * Test CDN server
100
  *
102
  * @return boolean
103
  */
104
  function test(&$error)
105
+ {
106
+ if (!$this->_test_domains($error)) {
107
+ return false;
108
+ }
109
+
110
+ return true;
111
+ }
112
+
113
+ /**
114
+ * Create bucket / container for some CDN engines
115
+ *
116
+ * @param string $container_id
117
+ * @param string $error
118
+ * @return boolean
119
+ */
120
+ function create_container(&$container_id, &$error)
121
  {
122
  $error = 'Not implemented.';
123
+
124
  return false;
125
  }
126
 
127
  /**
128
+ * Returns first domain
129
+ *
130
  * @return string
131
  */
132
  function get_domain()
133
  {
134
+ $domains = $this->get_domains();
135
+
136
+ if (count($domains)) {
137
+ return current($domains);
138
+ }
139
+
140
  return false;
141
  }
142
 
143
+ /**
144
+ * Returns array of CDN domains
145
+ *
146
+ * @return array
147
+ */
148
+ function get_domains()
149
+ {
150
+ return array();
151
+ }
152
+
153
  /**
154
  * Returns via string
155
  *
157
  */
158
  function get_via()
159
  {
160
+ $domain = $this->get_domain();
161
+
162
+ if ($domain) {
163
+ return $domain;
164
+ }
165
+
166
+ return 'N/A';
167
  }
168
 
169
  /**
174
  */
175
  function format_url($path)
176
  {
177
+ $domains = $this->get_domains();
178
+ $count = count($domains);
179
 
180
+ if ($count) {
181
+ switch (true) {
182
+ /**
183
+ * Reserved CSS
184
+ */
185
+ case (isset($domains[0]) && $this->_is_css($path)):
186
+ $host = $domains[0];
187
+ break;
188
+
189
+ /**
190
+ * Reserved JS in head
191
+ */
192
+ case (isset($domains[1]) && $this->_is_js($path)):
193
+ $host = $domains[1];
194
+ break;
195
+
196
+ /**
197
+ * Reserved JS after body
198
+ */
199
+ case (isset($domains[2]) && $this->_is_js_body($path)):
200
+ $host = $domains[2];
201
+ break;
202
+
203
+ /**
204
+ * Reserved JS before /body
205
+ */
206
+ case (isset($domains[3]) && $this->_is_js_footer($path)):
207
+ $host = $domains[3];
208
+ break;
209
+
210
+ default:
211
+ if ($count > 4) {
212
+ $host = $this->_get_host(array_slice($domains, 4), $path);
213
+ } else {
214
+ $host = $this->_get_host($domains, $path);
215
+ }
216
+ }
217
+
218
+ $url = sprintf('%s://%s/%s', (w3_is_https() ? 'https' : 'http'), $host, $path);
219
 
220
  return $url;
221
  }
231
  * @param string $error
232
  * @return array
233
  */
234
+ function get_results($files, $result = W3TC_CDN_RESULT_OK, $error = 'OK')
235
  {
236
  $results = array();
237
 
251
  * @param string $error
252
  * @return array
253
  */
254
+ function get_result($local_path, $remote_path, $result = W3TC_CDN_RESULT_OK, $error = 'OK')
255
  {
256
  return array(
257
  'local_path' => $local_path,
260
  'error' => $error
261
  );
262
  }
263
+
264
+ /**
265
+ * Returns headers for file
266
+ *
267
+ * @param string $file
268
+ * @return array
269
+ */
270
+ function get_headers($file)
271
+ {
272
+ $mime_type = w3_get_mime_type($file);
273
+ $last_modified = time();
274
+
275
+ $headers = array(
276
+ 'Content-Type' => $mime_type,
277
+ 'Last-Modified' => w3_http_date($last_modified)
278
+ );
279
+
280
+ if (isset($this->cache_config[$mime_type])) {
281
+ if ($this->cache_config[$mime_type]['etag']) {
282
+ $headers['Etag'] = @md5_file($file);
283
+ }
284
+
285
+ if ($this->cache_config[$mime_type]['w3tc']) {
286
+ $headers['X-Powered-By'] = W3TC_POWERED_BY;
287
+ }
288
+
289
+ if ($this->cache_config[$mime_type]['lifetime']) {
290
+ $headers['Expires'] = w3_http_date($last_modified + $this->cache_config[$mime_type]['lifetime']);
291
+ }
292
+
293
+ switch ($this->cache_config[$mime_type]['cache_control']) {
294
+ case 'cache':
295
+ $headers = array_merge($headers, array(
296
+ 'Pragma' => 'public',
297
+ 'Cache-Control' => 'public'
298
+ ));
299
+ break;
300
+
301
+ case 'cache_validation':
302
+ $headers = array_merge($headers, array(
303
+ 'Pragma' => 'public',
304
+ 'Cache-Control' => 'public, must-revalidate, proxy-revalidate'
305
+ ));
306
+ break;
307
+
308
+ case 'cache_noproxy':
309
+ $headers = array_merge($headers, array(
310
+ 'Pragma' => 'public',
311
+ 'Cache-Control' => 'public, must-revalidate'
312
+ ));
313
+ break;
314
+
315
+ case 'cache_maxage':
316
+ $headers = array_merge($headers, array(
317
+ 'Pragma' => 'public',
318
+ 'Cache-Control' => 'max-age=' . $this->cache_config[$mime_type]['lifetime'] . ', public, must-revalidate, proxy-revalidate'
319
+ ));
320
+ break;
321
+
322
+ case 'no_cache':
323
+ $headers = array_merge($headers, array(
324
+ 'Pragma' => 'no-cache',
325
+ 'Cache-Control' => 'max-age=0, private, no-store, no-cache, must-revalidate'
326
+ ));
327
+ break;
328
+ }
329
+ }
330
+
331
+ return $headers;
332
+ }
333
+
334
+ /**
335
+ * Use gzip compression only for text-based files
336
+ *
337
+ * @param string $file
338
+ * @return boolean
339
+ */
340
+ function may_gzip($file)
341
+ {
342
+ /**
343
+ * Remove query string
344
+ */
345
+ $file = preg_replace('~\?.*$~', '', $file);
346
+
347
+ /**
348
+ * Check by file extension
349
+ */
350
+ if (preg_match('~\.(ico|js|css|xml|xsd|xsl|svg|htm|html|txt)$~i', $file)) {
351
+ return true;
352
+ }
353
+
354
+ return false;
355
+ }
356
+
357
+ /**
358
+ * Test domains
359
+ *
360
+ * @param string $error
361
+ * @return boolean
362
+ */
363
+ function _test_domains(&$error)
364
+ {
365
+ $domains = $this->get_domains();
366
+
367
+ if (!count($domains)) {
368
+ $error = 'Empty domains / CNAMEs list.';
369
+
370
+ return false;
371
+
372
+ }
373
+
374
+ foreach ($domains as $domain) {
375
+ if ($domain && gethostbyname($domain) === $domain) {
376
+ $error = sprintf('Unable to resolve domain: %s.', $domain);
377
+
378
+ return false;
379
+ }
380
+ }
381
+
382
+ return true;
383
+ }
384
+
385
+ /**
386
+ * Check if css file
387
+ *
388
+ * @param string $path
389
+ * @return boolean
390
+ */
391
+ function _is_css($path)
392
+ {
393
+ return preg_match('~[a-z0-9\-_]+\.include\.[0-9]+\.css$~', $path);
394
+ }
395
+
396
+ /**
397
+ * Check if JS file in heeader
398
+ *
399
+ * @param string $path
400
+ * @return boolean
401
+ */
402
+ function _is_js($path)
403
+ {
404
+ return preg_match('~[a-z0-9\-_]+\.include(-nb)?\.[0-9]+\.js$~', $path);
405
+ }
406
+
407
+ /**
408
+ * Check if JS file after body
409
+ *
410
+ * @param string $path
411
+ * @return boolean
412
+ */
413
+ function _is_js_body($path)
414
+ {
415
+ return preg_match('~[a-z0-9\-_]+\.include-body(-nb)?\.[0-9]+\.js$~', $path);
416
+ }
417
+
418
+ /**
419
+ * Check if JS file before /body
420
+ *
421
+ * @param string $path
422
+ * @return boolean
423
+ */
424
+ function _is_js_footer($path)
425
+ {
426
+ return preg_match('~[a-z0-9\-_]+\.include-footer(-nb)?\.[0-9]+\.js$~', $path);
427
+ }
428
+
429
+ /**
430
+ * Returns host for path
431
+ *
432
+ * @param array $domains
433
+ * @param string $path
434
+ * @return string
435
+ */
436
+ function _get_host($domains, $path)
437
+ {
438
+ $count = count($domains);
439
+
440
+ if ($count) {
441
+ /**
442
+ * Use for equal URLs same host to allow caching by browser
443
+ */
444
+ $hash = $this->_get_hash($path);
445
+ $host = $domains[$hash % $count];
446
+
447
+ return $host;
448
+ }
449
+
450
+ return false;
451
+ }
452
+
453
+ /**
454
+ * Returns integer hash for key
455
+ *
456
+ * @param string $key
457
+ * @return integer
458
+ */
459
+ function _get_hash($key)
460
+ {
461
+ $hash = abs(crc32($key));
462
+
463
+ return $hash;
464
+ }
465
  }
lib/W3/Cdn/Cf.php CHANGED
@@ -5,21 +5,23 @@ require_once W3TC_LIB_W3_DIR . '/Cdn/S3.php';
5
  class W3_Cdn_Cf extends W3_Cdn_S3
6
  {
7
  /**
8
- * Returns CDN domain
9
- *
10
  * @return string
11
  */
12
- function get_domain()
13
  {
14
- if (! empty($this->_config['cname'])) {
15
- return $this->_config['cname'];
16
- } elseif (! empty($this->_config['id'])) {
17
  $domain = sprintf('%s.cloudfront.net', $this->_config['id']);
18
 
19
- return $domain;
 
 
20
  }
21
 
22
- return false;
23
  }
24
  /**
25
  * Tests CF
@@ -32,7 +34,7 @@ class W3_Cdn_Cf extends W3_Cdn_S3
32
  /**
33
  * Test S3 first
34
  */
35
- if (! parent::test($error)) {
36
  return false;
37
  }
38
 
@@ -41,7 +43,7 @@ class W3_Cdn_Cf extends W3_Cdn_S3
41
  */
42
  $dists = @$this->_s3->listDistributions();
43
 
44
- if (! $dists) {
45
  $error = 'Unable to list distributions.';
46
 
47
  return false;
@@ -59,28 +61,30 @@ class W3_Cdn_Cf extends W3_Cdn_S3
59
  }
60
  }
61
 
62
- if (! $dist) {
63
  $error = sprintf('Distribution for bucket "%s" not found.', $this->_config['bucket']);
64
 
65
  return false;
66
  }
67
 
68
- if (! $dist['enabled']) {
69
  $error = sprintf('Distribution for bucket "%s" is disabled.', $this->_config['bucket']);
70
 
71
  return false;
72
  }
73
 
74
- if ($this->_config['cname'] != '') {
 
75
  $cnames = (isset($dist['cnames']) ? (array) $dist['cnames'] : array());
76
 
77
- if (! in_array($this->_config['cname'], $cnames)) {
78
- $error = sprintf('Domain name %s is not in distribution CNAME list.', $this->_config['cname']);
79
-
80
- return false;
 
 
81
  }
82
-
83
- } elseif ($this->_config['id'] != '') {
84
  $domain = $this->get_domain();
85
 
86
  if ($domain != $dist['domain']) {
@@ -93,13 +97,45 @@ class W3_Cdn_Cf extends W3_Cdn_S3
93
  return true;
94
  }
95
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
  /**
97
  * Returns via string
98
- *
99
  * @return string
100
  */
101
  function get_via()
102
  {
103
- return sprintf('Amazon Web Services: CloudFront: %s', $this->get_domain());
104
  }
105
  }
5
  class W3_Cdn_Cf extends W3_Cdn_S3
6
  {
7
  /**
8
+ * Returns array of CDN domains
9
+ *
10
  * @return string
11
  */
12
+ function get_domains()
13
  {
14
+ if (!empty($this->_config['cname'])) {
15
+ return (array) $this->_config['cname'];
16
+ } elseif (!empty($this->_config['id'])) {
17
  $domain = sprintf('%s.cloudfront.net', $this->_config['id']);
18
 
19
+ return array(
20
+ $domain
21
+ );
22
  }
23
 
24
+ return array();
25
  }
26
  /**
27
  * Tests CF
34
  /**
35
  * Test S3 first
36
  */
37
+ if (!parent::test($error)) {
38
  return false;
39
  }
40
 
43
  */
44
  $dists = @$this->_s3->listDistributions();
45
 
46
+ if (!$dists) {
47
  $error = 'Unable to list distributions.';
48
 
49
  return false;
61
  }
62
  }
63
 
64
+ if (!$dist) {
65
  $error = sprintf('Distribution for bucket "%s" not found.', $this->_config['bucket']);
66
 
67
  return false;
68
  }
69
 
70
+ if (!$dist['enabled']) {
71
  $error = sprintf('Distribution for bucket "%s" is disabled.', $this->_config['bucket']);
72
 
73
  return false;
74
  }
75
 
76
+ if (!empty($this->_config['cname'])) {
77
+ $domains = (array) $this->_config['cname'];
78
  $cnames = (isset($dist['cnames']) ? (array) $dist['cnames'] : array());
79
 
80
+ foreach ($domains as $domain) {
81
+ if ($domain && !in_array($domain, $cnames)) {
82
+ $error = sprintf('Domain name %s is not in distribution CNAME list.', $domain);
83
+
84
+ return false;
85
+ }
86
  }
87
+ } elseif (!empty($this->_config['id'])) {
 
88
  $domain = $this->get_domain();
89
 
90
  if ($domain != $dist['domain']) {
97
  return true;
98
  }
99
 
100
+ /**
101
+ * Create bucket
102
+ *
103
+ * @param string $container_id
104
+ * @param string $error
105
+ * @return boolean
106
+ */
107
+ function create_container(&$container_id, &$error)
108
+ {
109
+ if (parent::create_container($container_id, $error)) {
110
+ $cnames = (!empty($this->_config['cname']) ? (array) $this->_config['cname'] : array());
111
+
112
+ $dist = $this->_s3->createDistribution($this->_config['bucket'], true, array());
113
+
114
+ if (!$dist) {
115
+ $error = sprintf('Unable to create distribution for bucket %s.', $this->_config['bucket']);
116
+
117
+ return false;
118
+ }
119
+
120
+ $matches = null;
121
+
122
+ if (preg_match('~^(.+)\.cloudfront\.net$~', $dist['domain'], $matches)) {
123
+ $container_id = $matches[1];
124
+ }
125
+
126
+ return true;
127
+ }
128
+
129
+ return false;
130
+ }
131
+
132
  /**
133
  * Returns via string
134
+ *
135
  * @return string
136
  */
137
  function get_via()
138
  {
139
+ return sprintf('Amazon Web Services: CloudFront: %s', parent::get_via());
140
  }
141
  }
lib/W3/Cdn/Ftp.php CHANGED
@@ -5,7 +5,7 @@
5
  */
6
  require_once W3TC_LIB_W3_DIR . '/Cdn/Base.php';
7
 
8
- if (! defined('W3_CDN_FTP_CONNECT_TIMEOUT')) {
9
  define('W3_CDN_FTP_CONNECT_TIMEOUT', 30);
10
  }
11
 
@@ -31,35 +31,37 @@ class W3_Cdn_Ftp extends W3_Cdn_Base
31
  {
32
  if (empty($this->_config['host'])) {
33
  $error = 'Empty host.';
 
34
  return false;
35
  }
36
 
37
- if (! isset($this->_config['port'])) {
38
  $this->_config['port'] = 21;
39
  }
40
 
41
  $this->_ftp = @ftp_connect($this->_config['host'], $this->_config['port'], W3_CDN_FTP_CONNECT_TIMEOUT);
42
 
43
- if (! $this->_ftp) {
44
  $error = sprintf('Unable to connect to %s:%d.', $this->_config['host'], $this->_config['port']);
 
45
  return false;
46
  }
47
 
48
- if (! @ftp_login($this->_ftp, $this->_config['user'], $this->_config['pass'])) {
49
  $this->_disconnect();
50
  $error = 'Incorrect login or password.';
51
 
52
  return false;
53
  }
54
 
55
- if (isset($this->_config['pasv']) && ! @ftp_pasv($this->_ftp, $this->_config['pasv'])) {
56
  $this->_disconnect();
57
  $error = 'Unable to change mode to passive.';
58
 
59
  return false;
60
  }
61
 
62
- if (! empty($this->_config['path']) && ! @ftp_chdir($this->_ftp, $this->_config['path'])) {
63
  $this->_disconnect();
64
  $error = sprintf('Unable to change directory to: %s.', $this->_config['path']);
65
 
@@ -102,16 +104,16 @@ class W3_Cdn_Ftp extends W3_Cdn_Base
102
  $count = 0;
103
  $error = null;
104
 
105
- if (! $this->_connect($error)) {
106
- $results = $this->get_results($files, W3_CDN_RESULT_HALT, $error);
107
  return false;
108
  }
109
 
110
  $home = @ftp_pwd($this->_ftp);
111
 
112
  foreach ($files as $local_path => $remote_path) {
113
- if (! file_exists($local_path)) {
114
- $results[] = $this->get_result($local_path, $remote_path, W3_CDN_RESULT_ERROR, 'Source file not found');
115
  continue;
116
  }
117
 
@@ -121,19 +123,19 @@ class W3_Cdn_Ftp extends W3_Cdn_Base
121
  $remote_dirs = preg_split('~\\/+~', $remote_dir);
122
 
123
  foreach ($remote_dirs as $dir) {
124
- if (! @ftp_chdir($this->_ftp, $dir)) {
125
- if (! @ftp_mkdir($this->_ftp, $dir)) {
126
  @ftp_close($this->_ftp);
127
- $results[] = $this->get_result($local_path, $remote_path, W3_CDN_RESULT_ERROR, 'Unable to create directory');
128
- continue;
129
  }
130
 
131
  @ftp_chmod($this->_ftp, 0755, $dir);
132
 
133
- if (! @ftp_chdir($this->_ftp, $dir)) {
134
  @ftp_close($this->_ftp);
135
- $results[] = $this->get_result($local_path, $remote_path, W3_CDN_RESULT_ERROR, 'Unable to change directory');
136
- continue;
137
  }
138
  }
139
  }
@@ -141,13 +143,13 @@ class W3_Cdn_Ftp extends W3_Cdn_Base
141
  $remote_file = basename($remote_path);
142
  $mtime = @filemtime($local_path);
143
 
144
- if (! $force_rewrite) {
145
  $size = @filesize($local_path);
146
  $ftp_size = @ftp_size($this->_ftp, $remote_file);
147
  $ftp_mtime = @ftp_mdtm($this->_ftp, $remote_file);
148
 
149
  if ($size === $ftp_size && $mtime === $ftp_mtime) {
150
- $results[] = $this->get_result($local_path, $remote_path, W3_CDN_RESULT_ERROR, 'File already exists');
151
  continue;
152
  }
153
  }
@@ -155,7 +157,7 @@ class W3_Cdn_Ftp extends W3_Cdn_Base
155
  $result = @ftp_put($this->_ftp, $remote_file, $local_path, FTP_BINARY);
156
  $this->_mdtm($remote_file, $mtime);
157
 
158
- $results[] = $this->get_result($local_path, $remote_path, ($result ? W3_CDN_RESULT_OK : W3_CDN_RESULT_ERROR), ($result ? 'OK' : 'Unable to upload file'));
159
 
160
  if ($result) {
161
  $count++;
@@ -180,14 +182,14 @@ class W3_Cdn_Ftp extends W3_Cdn_Base
180
  $error = null;
181
  $count = 0;
182
 
183
- if (! $this->_connect($error)) {
184
- $results = $this->get_results($files, W3_CDN_RESULT_HALT, $error);
185
  return false;
186
  }
187
 
188
  foreach ($files as $local_path => $remote_path) {
189
  $result = @ftp_delete($this->_ftp, $remote_path);
190
- $results[] = $this->get_result($local_path, $remote_path, ($result ? W3_CDN_RESULT_OK : W3_CDN_RESULT_ERROR), ($result ? 'OK' : 'Unable to delete file'));
191
 
192
  if ($result) {
193
  $count++;
@@ -195,7 +197,7 @@ class W3_Cdn_Ftp extends W3_Cdn_Base
195
 
196
  while (true) {
197
  $remote_path = dirname($remote_path);
198
- if ($remote_path == '.' || ! @ftp_rmdir($this->_ftp, $remote_path)) {
199
  break;
200
  }
201
  }
@@ -214,41 +216,49 @@ class W3_Cdn_Ftp extends W3_Cdn_Base
214
  */
215
  function test(&$error)
216
  {
 
 
 
 
217
  $rand = md5(time());
218
  $upload_info = w3_upload_info();
219
  $tmp_dir = 'test_dir_' . $rand;
220
  $tmp_file = 'test_file_' . $rand;
221
  $tmp_path = $upload_info['path'] . '/' . $tmp_file;
222
 
223
- if (! @file_put_contents($tmp_path, $rand)) {
224
  $error = sprintf('Unable to create file: %s.', $tmp_path);
 
225
  return false;
226
  }
227
 
228
- if (! $this->_connect($error)) {
229
  return false;
230
  }
231
 
232
- if (! @ftp_mkdir($this->_ftp, $tmp_dir)) {
233
  $this->_disconnect();
234
  $error = sprintf('Unable to make directory: %s.', $tmp_dir);
 
235
  return false;
236
  } else {
237
  @ftp_chmod($this->_ftp, 0755, $tmp_dir);
238
  }
239
 
240
- if (! @ftp_chdir($this->_ftp, $tmp_dir)) {
241
  $this->_disconnect();
242
  $error = sprintf('Unable to change directory to: %s.', $tmp_dir);
 
243
  return false;
244
  }
245
 
246
- if (! @ftp_put($this->_ftp, $tmp_file, $tmp_path, FTP_BINARY)) {
247
  @ftp_cdup($this->_ftp);
248
  @ftp_rmdir($this->_ftp, $tmp_dir);
249
  @unlink($tmp_path);
250
  $this->_disconnect();
251
  $error = sprintf('Unable to upload file: %s.', $tmp_path);
 
252
  return false;
253
  }
254
 
@@ -262,16 +272,16 @@ class W3_Cdn_Ftp extends W3_Cdn_Base
262
  }
263
 
264
  /**
265
- * Returns CDN domain
266
  *
267
  * @return string
268
  */
269
- function get_domain()
270
  {
271
- if (! empty($this->_config['domain'])) {
272
- return $this->_config['domain'];
273
  }
274
 
275
- return false;
276
  }
277
  }
5
  */
6
  require_once W3TC_LIB_W3_DIR . '/Cdn/Base.php';
7
 
8
+ if (!defined('W3_CDN_FTP_CONNECT_TIMEOUT')) {
9
  define('W3_CDN_FTP_CONNECT_TIMEOUT', 30);
10
  }
11
 
31
  {
32
  if (empty($this->_config['host'])) {
33
  $error = 'Empty host.';
34
+
35
  return false;
36
  }
37
 
38
+ if (!isset($this->_config['port'])) {
39
  $this->_config['port'] = 21;
40
  }
41
 
42
  $this->_ftp = @ftp_connect($this->_config['host'], $this->_config['port'], W3_CDN_FTP_CONNECT_TIMEOUT);
43
 
44
+ if (!$this->_ftp) {
45
  $error = sprintf('Unable to connect to %s:%d.', $this->_config['host'], $this->_config['port']);
46
+
47
  return false;
48
  }
49
 
50
+ if (!@ftp_login($this->_ftp, $this->_config['user'], $this->_config['pass'])) {
51
  $this->_disconnect();
52
  $error = 'Incorrect login or password.';
53
 
54
  return false;
55
  }
56
 
57
+ if (isset($this->_config['pasv']) && !@ftp_pasv($this->_ftp, $this->_config['pasv'])) {
58
  $this->_disconnect();
59
  $error = 'Unable to change mode to passive.';
60
 
61
  return false;
62
  }
63
 
64
+ if (!empty($this->_config['path']) && !@ftp_chdir($this->_ftp, $this->_config['path'])) {
65
  $this->_disconnect();
66
  $error = sprintf('Unable to change directory to: %s.', $this->_config['path']);
67
 
104
  $count = 0;
105
  $error = null;
106
 
107
+ if (!$this->_connect($error)) {
108
+ $results = $this->get_results($files, W3TC_CDN_RESULT_HALT, $error);
109
  return false;
110
  }
111
 
112
  $home = @ftp_pwd($this->_ftp);
113
 
114
  foreach ($files as $local_path => $remote_path) {
115
+ if (!file_exists($local_path)) {
116
+ $results[] = $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, 'Source file not found');
117
  continue;
118
  }
119
 
123
  $remote_dirs = preg_split('~\\/+~', $remote_dir);
124
 
125
  foreach ($remote_dirs as $dir) {
126
+ if (!@ftp_chdir($this->_ftp, $dir)) {
127
+ if (!@ftp_mkdir($this->_ftp, $dir)) {
128
  @ftp_close($this->_ftp);
129
+ $results[] = $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, 'Unable to create directory');
130
+ continue 2;
131
  }
132
 
133
  @ftp_chmod($this->_ftp, 0755, $dir);
134
 
135
+ if (!@ftp_chdir($this->_ftp, $dir)) {
136
  @ftp_close($this->_ftp);
137
+ $results[] = $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, 'Unable to change directory');
138
+ continue 2;
139
  }
140
  }
141
  }
143
  $remote_file = basename($remote_path);
144
  $mtime = @filemtime($local_path);
145
 
146
+ if (!$force_rewrite) {
147
  $size = @filesize($local_path);
148
  $ftp_size = @ftp_size($this->_ftp, $remote_file);
149
  $ftp_mtime = @ftp_mdtm($this->_ftp, $remote_file);
150
 
151
  if ($size === $ftp_size && $mtime === $ftp_mtime) {
152
+ $results[] = $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, 'File already exists');
153
  continue;
154
  }
155
  }
157
  $result = @ftp_put($this->_ftp, $remote_file, $local_path, FTP_BINARY);
158
  $this->_mdtm($remote_file, $mtime);
159
 
160
+ $results[] = $this->get_result($local_path, $remote_path, ($result ? W3TC_CDN_RESULT_OK : W3TC_CDN_RESULT_ERROR), ($result ? 'OK' : 'Unable to upload file'));
161
 
162
  if ($result) {
163
  $count++;
182
  $error = null;
183
  $count = 0;
184
 
185
+ if (!$this->_connect($error)) {
186
+ $results = $this->get_results($files, W3TC_CDN_RESULT_HALT, $error);
187
  return false;
188
  }
189
 
190
  foreach ($files as $local_path => $remote_path) {
191
  $result = @ftp_delete($this->_ftp, $remote_path);
192
+ $results[] = $this->get_result($local_path, $remote_path, ($result ? W3TC_CDN_RESULT_OK : W3TC_CDN_RESULT_ERROR), ($result ? 'OK' : 'Unable to delete file'));
193
 
194
  if ($result) {
195
  $count++;
197
 
198
  while (true) {
199
  $remote_path = dirname($remote_path);
200
+ if ($remote_path == '.' || !@ftp_rmdir($this->_ftp, $remote_path)) {
201
  break;
202
  }
203
  }
216
  */
217
  function test(&$error)
218
  {
219
+ if (!parent::test($error)) {
220
+ return false;
221
+ }
222
+
223
  $rand = md5(time());
224
  $upload_info = w3_upload_info();
225
  $tmp_dir = 'test_dir_' . $rand;
226
  $tmp_file = 'test_file_' . $rand;
227
  $tmp_path = $upload_info['path'] . '/' . $tmp_file;
228
 
229
+ if (!@file_put_contents($tmp_path, $rand)) {
230
  $error = sprintf('Unable to create file: %s.', $tmp_path);
231
+
232
  return false;
233
  }
234
 
235
+ if (!$this->_connect($error)) {
236
  return false;
237
  }
238
 
239
+ if (!@ftp_mkdir($this->_ftp, $tmp_dir)) {
240
  $this->_disconnect();
241
  $error = sprintf('Unable to make directory: %s.', $tmp_dir);
242
+
243
  return false;
244
  } else {
245
  @ftp_chmod($this->_ftp, 0755, $tmp_dir);
246
  }
247
 
248
+ if (!@ftp_chdir($this->_ftp, $tmp_dir)) {
249
  $this->_disconnect();
250
  $error = sprintf('Unable to change directory to: %s.', $tmp_dir);
251
+
252
  return false;
253
  }
254
 
255
+ if (!@ftp_put($this->_ftp, $tmp_file, $tmp_path, FTP_BINARY)) {
256
  @ftp_cdup($this->_ftp);
257
  @ftp_rmdir($this->_ftp, $tmp_dir);
258
  @unlink($tmp_path);
259
  $this->_disconnect();
260
  $error = sprintf('Unable to upload file: %s.', $tmp_path);
261
+
262
  return false;
263
  }
264
 
272
  }
273
 
274
  /**
275
+ * Returns array of CDN domains
276
  *
277
  * @return string
278
  */
279
+ function get_domains()
280
  {
281
+ if (!empty($this->_config['domain'])) {
282
+ return (array) $this->_config['domain'];
283
  }
284
 
285
+ return array();
286
  }
287
  }
lib/W3/Cdn/Mirror.php CHANGED
@@ -11,7 +11,7 @@ require_once W3TC_LIB_W3_DIR . '/Cdn/Base.php';
11
  class W3_Cdn_Mirror extends W3_Cdn_Base
12
  {
13
  /**
14
- * Uploads files to FTP
15
  *
16
  * @param array $files
17
  * @param array $results
@@ -20,13 +20,13 @@ class W3_Cdn_Mirror extends W3_Cdn_Base
20
  */
21
  function upload($files, &$results, $force_rewrite = false)
22
  {
23
- $results = $this->get_results($files, W3_CDN_RESULT_OK, 'OK');
24
 
25
  return count($files);
26
  }
27
 
28
  /**
29
- * Deletes files from FTP
30
  *
31
  * @param array $files
32
  * @param array $results
@@ -34,32 +34,22 @@ class W3_Cdn_Mirror extends W3_Cdn_Base
34
  */
35
  function delete($files, &$results)
36
  {
37
- $results = $this->get_results($files, W3_CDN_RESULT_OK, 'OK');
38
 
39
  return count($files);
40
  }
41
 
42
  /**
43
- * Tests FTP server
44
- *
45
- * @param string $error
46
- * @return boolean
47
- */
48
- function test(&$error)
49
- {
50
- return true;
51
- }
52
-
53
- /**
54
- * Returns CDN domain
55
- * @return string
56
  */
57
- function get_domain()
58
  {
59
- if (! empty($this->_config['domain'])) {
60
- return $this->_config['domain'];
61
  }
62
 
63
- return false;
64
  }
65
  }
11
  class W3_Cdn_Mirror extends W3_Cdn_Base
12
  {
13
  /**
14
+ * Uploads files stub
15
  *
16
  * @param array $files
17
  * @param array $results
20
  */
21
  function upload($files, &$results, $force_rewrite = false)
22
  {
23
+ $results = $this->get_results($files, W3TC_CDN_RESULT_OK, 'OK');
24
 
25
  return count($files);
26
  }
27
 
28
  /**
29
+ * Deletes files stub
30
  *
31
  * @param array $files
32
  * @param array $results
34
  */
35
  function delete($files, &$results)
36
  {
37
+ $results = $this->get_results($files, W3TC_CDN_RESULT_OK, 'OK');
38
 
39
  return count($files);
40
  }
41
 
42
  /**
43
+ * Returns array of CDN domains
44
+ *
45
+ * @return array
 
 
 
 
 
 
 
 
 
 
46
  */
47
+ function get_domains()
48
  {
49
+ if (!empty($this->_config['domain'])) {
50
+ return (array) $this->_config['domain'];
51
  }
52
 
53
+ return array();
54
  }
55
  }
lib/W3/Cdn/Netdna.php ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * W3 CDN Netdna Class
5
+ */
6
+ require_once W3TC_LIB_W3_DIR . '/Cdn/Base.php';
7
+
8
+ /**
9
+ * Class W3_Cdn_Netdna
10
+ */
11
+ class W3_Cdn_Netdna extends W3_Cdn_Base
12
+ {
13
+ /**
14
+ * Uploads files stub
15
+ *
16
+ * @param array $files
17
+ * @param array $results
18
+ * @param boolean $force_rewrite
19
+ * @return boolean
20
+ */
21
+ function upload($files, &$results, $force_rewrite = false)
22
+ {
23
+ $results = $this->get_results($files, W3TC_CDN_RESULT_OK, 'OK');
24
+
25
+ return count($files);
26
+ }
27
+
28
+ /**
29
+ * Deletes files stub
30
+ *
31
+ * @param array $files
32
+ * @param array $results
33
+ * @return boolean
34
+ */
35
+ function delete($files, &$results)
36
+ {
37
+ $results = $this->get_results($files, W3TC_CDN_RESULT_OK, 'OK');
38
+
39
+ return count($files);
40
+ }
41
+
42
+ /**
43
+ * Purges remote files
44
+ *
45
+ * @param array $files
46
+ * @param array $results
47
+ * @return array
48
+ */
49
+ function purge($files, &$results)
50
+ {
51
+ if (empty($this->_config['apiid'])) {
52
+ $results = $this->get_results($files, W3TC_CDN_RESULT_HALT, 'Empty API ID.');
53
+
54
+ return false;
55
+ }
56
+
57
+ if (empty($this->_config['apikey'])) {
58
+ $results = $this->get_results($files, W3TC_CDN_RESULT_HALT, 'Empty API key.');
59
+
60
+ return false;
61
+ }
62
+
63
+ if ($this->sha256('test') === false) {
64
+ $results = $this->get_results($files, W3TC_CDN_RESULT_HALT, "hash() or mhash() function doesn't exists.");
65
+
66
+ return false;
67
+ }
68
+
69
+ if (!class_exists('IXR_Client')) {
70
+ require_once (ABSPATH . WPINC . '/class-IXR.php');
71
+ }
72
+
73
+ $date = date('c');
74
+ $method = 'purge';
75
+ $auth_string = sprintf('%s:%s:%s', $date, $this->_config['apikey'], $method);
76
+ $auth_key = $this->sha256($auth_string);
77
+ $domain_url = w3_get_domain_url();
78
+
79
+ $client = new IXR_Client('http://api.netdna.com/xmlrpc/cache');
80
+ $client->timeout = 30;
81
+
82
+ $count = 0;
83
+ $results = array();
84
+
85
+ foreach ($files as $local_path => $remote_path) {
86
+ $url = $this->format_url($remote_path);
87
+
88
+ $client->query('cache.' . $method, $this->_config['apiid'], $auth_key, $date, $url);
89
+
90
+ if (!$client->isError()) {
91
+ $val = $client->getResponse();
92
+
93
+ if ($val) {
94
+ $results[] = $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_OK, 'OK');
95
+ $count++;
96
+ } else {
97
+ $results[] = $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, 'Unexpected Error');
98
+ }
99
+
100
+ } else {
101
+ $results[] = $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, $client->getErrorMessage());
102
+ }
103
+ }
104
+
105
+ return $count;
106
+ }
107
+
108
+ /**
109
+ * Returns array of CDN domains
110
+ *
111
+ * @return array
112
+ */
113
+ function get_domains()
114
+ {
115
+ if (!empty($this->_config['domain'])) {
116
+ return (array) $this->_config['domain'];
117
+ }
118
+
119
+ return array();
120
+ }
121
+
122
+ /**
123
+ * Returns SHA 256 hash of string
124
+ *
125
+ * @param string $string
126
+ * @return string
127
+ */
128
+ function sha256($string)
129
+ {
130
+ if (function_exists('hash')) {
131
+ return hash('sha256', $string);
132
+ } elseif (function_exists('mhash')) {
133
+ return bin2hex(mhash(MHASH_SHA256, $string));
134
+ }
135
+
136
+ return false;
137
+ }
138
+ }
lib/W3/Cdn/Rscf.php ADDED
@@ -0,0 +1,304 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Rackspace Cloud Files CDN engine
5
+ */
6
+ require_once W3TC_LIB_W3_DIR . '/Cdn/Base.php';
7
+ require_once W3TC_LIB_CF_DIR . '/cloudfiles.php';
8
+
9
+ /**
10
+ * Class W3_Cdn_Rscf
11
+ */
12
+ class W3_Cdn_Rscf extends W3_Cdn_Base
13
+ {
14
+ /**
15
+ * Auth object
16
+ *
17
+ * @var CF_Authentication
18
+ */
19
+ var $_auth = null;
20
+
21
+ /**
22
+ * Connection object
23
+ *
24
+ * @var CF_Connection
25
+ */
26
+ var $_connection = null;
27
+
28
+ /**
29
+ * Container object
30
+ *
31
+ * @var CF_Container
32
+ */
33
+ var $_container = null;
34
+
35
+ /**
36
+ * Init connection object
37
+ *
38
+ * @param string $error
39
+ * @return boolean
40
+ */
41
+ function _init(&$error)
42
+ {
43
+ if (empty($this->_config['user'])) {
44
+ $error = 'Empty username';
45
+
46
+ return false;
47
+ }
48
+
49
+ if (empty($this->_config['key'])) {
50
+ $error = 'Empty API key';
51
+
52
+ return false;
53
+ }
54
+
55
+ try {
56
+ $this->_auth = new CF_Authentication($this->_config['user'], $this->_config['key']);
57
+ $this->_auth->ssl_use_cabundle();
58
+ $this->_auth->authenticate();
59
+
60
+ $this->_connection = new CF_Connection($this->_auth);
61
+ $this->_connection->ssl_use_cabundle();
62
+ } catch (Exception $exception) {
63
+ $error = $exception->getMessage();
64
+
65
+ return false;
66
+ }
67
+
68
+ return true;
69
+ }
70
+
71
+ /**
72
+ * Init container object
73
+ *
74
+ * @param string $error
75
+ * @return boolean
76
+ */
77
+ function _init_container(&$error)
78
+ {
79
+ if (empty($this->_config['container'])) {
80
+ $error = 'Empty container';
81
+
82
+ return false;
83
+ }
84
+
85
+ try {
86
+ $this->_container = $this->_connection->get_container($this->_config['container']);
87
+ } catch (Exception $exception) {
88
+ $error = $exception->getMessage();
89
+
90
+ return false;
91
+ }
92
+
93
+ return true;
94
+ }
95
+
96
+ /**
97
+ * Uploads files to CDN
98
+ *
99
+ * @param array $files
100
+ * @param array $results
101
+ * @param boolean $force_rewrite
102
+ * @return integer
103
+ */
104
+ function upload($files, &$results, $force_rewrite = false)
105
+ {
106
+ $count = 0;
107
+ $error = null;
108
+
109
+ if (!$this->_init($error) || !$this->_init_container($error)) {
110
+ $results = $this->get_results($files, W3TC_CDN_RESULT_HALT, $error);
111
+ return false;
112
+ }
113
+
114
+ foreach ($files as $local_path => $remote_path) {
115
+ if (!file_exists($local_path)) {
116
+ $results[] = $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, 'Source file not found');
117
+ continue;
118
+ }
119
+
120
+ try {
121
+ $object = & new CF_Object($this->_container, $remote_path, false, false);
122
+ } catch (Exception $exception) {
123
+ $results[] = $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, 'Unable to create object');
124
+ continue;
125
+ }
126
+
127
+ if (!$force_rewrite) {
128
+ try {
129
+ list($status, $reason, $etag, $last_modified, $content_type, $content_length, $metadata) = $this->_container->cfs_http->head_object($object);
130
+ } catch (Exception $exception) {
131
+ $results[] = $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, 'Unable to get object info');
132
+ continue;
133
+ }
134
+
135
+ if ($status >= 200 && $status < 300) {
136
+ $hash = @md5_file($local_path);
137
+
138
+ if ($hash === $etag) {
139
+ $results[] = $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, 'Object already exists');
140
+ continue;
141
+ }
142
+ }
143
+ }
144
+
145
+ try {
146
+ $object->load_from_filename($local_path);
147
+
148
+ $result = true;
149
+ $count++;
150
+ } catch (Exception $exception) {
151
+ $result = false;
152
+ }
153
+
154
+ $results[] = $this->get_result($local_path, $remote_path, ($result ? W3TC_CDN_RESULT_OK : W3TC_CDN_RESULT_ERROR), ($result ? 'OK' : 'Unable to put object'));
155
+ }
156
+
157
+ return $count;
158
+ }
159
+
160
+ /**
161
+ * Deletes files from CDN
162
+ *
163
+ * @param array $files
164
+ * @param array $results
165
+ * @return integer
166
+ */
167
+ function delete($files, &$results)
168
+ {
169
+ $error = null;
170
+ $count = 0;
171
+
172
+ if (!$this->_init($error) || !$this->_init_container($error)) {
173
+ $results = $this->get_results($files, W3TC_CDN_RESULT_HALT, $error);
174
+ return false;
175
+ }
176
+
177
+ foreach ($files as $local_path => $remote_path) {
178
+ try {
179
+ $result = $this->_container->delete_object($remote_path);
180
+ $results[] = $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_OK, 'OK');
181
+ $count++;
182
+ } catch (Exception $exception) {
183
+ $results[] = $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, 'Unable to delete object');
184
+ }
185
+ }
186
+
187
+ return $count;
188
+ }
189
+
190
+ /**
191
+ * Test CDN connection
192
+ *
193
+ * @param string $error
194
+ * @return boolean
195
+ */
196
+ function test(&$error)
197
+ {
198
+ if (!parent::test(&$error)) {
199
+ return false;
200
+ }
201
+
202
+ if (!$this->_init($error) || !$this->_init_container($error)) {
203
+ return false;
204
+ }
205
+
206
+ try {
207
+ $string = 'test_rscf_' . md5(time());
208
+
209
+ $object = $this->_container->create_object($string);
210
+ $object->content_type = 'text/plain';
211
+ $object->write($string, strlen($string));
212
+
213
+ $object = $this->_container->get_object($string);
214
+ $data = $object->read();
215
+
216
+ if ($data != $string) {
217
+ throw new Exception('Objects are not equal.');
218
+ }
219
+
220
+ $this->_container->delete_object($string);
221
+ } catch (Exception $exception) {
222
+ $error = $exception->getMessage();
223
+
224
+ return false;
225
+ }
226
+
227
+ return true;
228
+ }
229
+
230
+ /**
231
+ * Returns CDN domain
232
+ *
233
+ * @return string
234
+ */
235
+ function get_domains()
236
+ {
237
+ if (!empty($this->_config['cname'])) {
238
+ return (array) $this->_config['cname'];
239
+ } elseif (!empty($this->_config['id'])) {
240
+ $domain = sprintf('%s.cdn.cloudfiles.rackspacecloud.com', $this->_config['id']);
241
+
242
+ return array(
243
+ $domain
244
+ );
245
+ }
246
+
247
+ return array();
248
+ }
249
+
250
+ /**
251
+ * Returns VIA string
252
+ *
253
+ * @return string
254
+ */
255
+ function get_via()
256
+ {
257
+ return sprintf('Rackspace Cloud Files: %s', parent::get_via());
258
+ }
259
+
260
+ /**
261
+ * Creates container
262
+ *
263
+ * @param string $container_id
264
+ * @param string $error
265
+ * @return boolean
266
+ */
267
+ function create_container(&$container_id, &$error)
268
+ {
269
+ if (!$this->_init($error)) {
270
+ return false;
271
+ }
272
+
273
+ try {
274
+ $containers = $this->_connection->list_containers();
275
+ } catch (Exception $exception) {
276
+ $error = sprintf('Unable to list containers (%s).', $exception->getMessage());
277
+
278
+ return false;
279
+ }
280
+
281
+ if (in_array($this->_config['container'], (array) $containers)) {
282
+ $error = sprintf('Container already exists: %s.', $this->_config['container']);
283
+
284
+ return false;
285
+ }
286
+
287
+ try {
288
+ $container = $this->_connection->create_container($this->_config['container']);
289
+ $container->make_public();
290
+ } catch (Exception $exception) {
291
+ $error = sprintf('Unable to create container: %s (%s).', $this->_config['container'], $exception->getMessage());
292
+
293
+ return false;
294
+ }
295
+
296
+ $matches = null;
297
+
298
+ if (preg_match('~^https?://(.+)\.cdn\.cloudfiles\.rackspacecloud\.com$~', $container->cdn_uri, $matches)) {
299
+ $container_id = $matches[1];
300
+ }
301
+
302
+ return true;
303
+ }
304
+ }
lib/W3/Cdn/S3.php CHANGED
@@ -1,8 +1,17 @@
1
  <?php
2
 
 
 
 
3
  require_once W3TC_LIB_W3_DIR . '/Cdn/Base.php';
4
- require_once W3TC_LIB_DIR . '/S3.php';
5
 
 
 
 
 
 
 
 
6
  class W3_Cdn_S3 extends W3_Cdn_Base
7
  {
8
  /**
@@ -12,6 +21,13 @@ class W3_Cdn_S3 extends W3_Cdn_Base
12
  */
13
  var $_s3 = null;
14
 
 
 
 
 
 
 
 
15
  /**
16
  * Inits S3 object
17
  *
@@ -44,7 +60,7 @@ class W3_Cdn_S3 extends W3_Cdn_Base
44
  }
45
 
46
  /**
47
- * Uploads files to FTP
48
  *
49
  * @param array $files
50
  * @param array $results
@@ -56,40 +72,114 @@ class W3_Cdn_S3 extends W3_Cdn_Base
56
  $count = 0;
57
  $error = null;
58
 
59
- if (! $this->_init($error)) {
60
- $results = $this->get_results($files, W3_CDN_RESULT_HALT, $error);
61
  return false;
62
  }
63
 
64
  foreach ($files as $local_path => $remote_path) {
65
- if (! file_exists($local_path)) {
66
- $results[] = $this->get_result($local_path, $remote_path, W3_CDN_RESULT_ERROR, 'Source file not found');
67
- continue;
 
 
68
  }
69
 
70
- if (! $force_rewrite) {
71
- $info = @$this->_s3->getObjectInfo($this->_config['bucket'], $remote_path);
 
 
72
 
73
- if ($info) {
74
- $hash = @md5_file($local_path);
75
- $s3_hash = (isset($info['hash']) ? $info['hash'] : '');
76
-
77
- if ($hash === $s3_hash) {
78
- $results[] = $this->get_result($local_path, $remote_path, W3_CDN_RESULT_ERROR, 'Object already exists');
79
- continue;
80
- }
81
  }
82
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
 
84
- $result = @$this->_s3->putObjectFile($local_path, $this->_config['bucket'], $remote_path, S3::ACL_PUBLIC_READ);
85
- $results[] = $this->get_result($local_path, $remote_path, ($result ? W3_CDN_RESULT_OK : W3_CDN_RESULT_ERROR), ($result ? 'OK' : 'Unable to put object'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
 
87
- if ($result) {
88
- $count++;
 
 
 
 
 
89
  }
90
  }
91
 
92
- return $count;
 
 
 
 
 
 
 
 
93
  }
94
 
95
  /**
@@ -104,18 +194,28 @@ class W3_Cdn_S3 extends W3_Cdn_Base
104
  $error = null;
105
  $count = 0;
106
 
107
- if (! $this->_init($error)) {
108
- $results = $this->get_results($files, W3_CDN_RESULT_HALT, $error);
109
  return false;
110
  }
111
 
112
  foreach ($files as $local_path => $remote_path) {
113
  $result = @$this->_s3->deleteObject($this->_config['bucket'], $remote_path);
114
- $results[] = $this->get_result($local_path, $remote_path, ($result ? W3_CDN_RESULT_OK : W3_CDN_RESULT_ERROR), ($result ? 'OK' : 'Unable to delete object'));
115
 
116
  if ($result) {
117
  $count++;
118
  }
 
 
 
 
 
 
 
 
 
 
119
  }
120
 
121
  return $count;
@@ -129,47 +229,37 @@ class W3_Cdn_S3 extends W3_Cdn_Base
129
  */
130
  function test(&$error)
131
  {
132
- $string = 'test_s3_' . md5(time());
133
-
134
- if (! $this->_init($error)) {
135
  return false;
136
  }
137
 
138
- $domain = $this->get_domain();
139
-
140
- if (! $domain) {
141
- $error = 'Empty domain.';
142
-
143
- return false;
144
- }
145
 
146
- if (gethostbyname($domain) == $domain) {
147
- $error = sprintf('Unable to resolve domain: %s.', $domain);
148
-
149
  return false;
150
  }
151
 
152
  $buckets = @$this->_s3->listBuckets();
153
 
154
- if (! $buckets) {
155
  $error = 'Unable to list buckets (check your credentials).';
156
 
157
  return false;
158
  }
159
 
160
- if (! in_array($this->_config['bucket'], (array) $buckets)) {
161
  $error = sprintf('Bucket doesn\'t exist: %s', $this->_config['bucket']);
162
 
163
  return false;
164
  }
165
 
166
- if (! @$this->_s3->putObjectString($string, $this->_config['bucket'], $string, S3::ACL_PUBLIC_READ)) {
167
  $error = 'Unable to put object.';
168
 
169
  return false;
170
  }
171
 
172
- if (! ($object = @$this->_s3->getObject($this->_config['bucket'], $string))) {
173
  $error = 'Unable to get object.';
174
 
175
  return false;
@@ -182,7 +272,7 @@ class W3_Cdn_S3 extends W3_Cdn_Base
182
  return false;
183
  }
184
 
185
- if (! @$this->_s3->deleteObject($this->_config['bucket'], $string)) {
186
  $error = 'Unable to delete object.';
187
 
188
  return false;
@@ -196,15 +286,19 @@ class W3_Cdn_S3 extends W3_Cdn_Base
196
  *
197
  * @return string
198
  */
199
- function get_domain()
200
  {
201
- if (! empty($this->_config['bucket'])) {
 
 
202
  $domain = sprintf('%s.s3.amazonaws.com', $this->_config['bucket']);
203
 
204
- return $domain;
 
 
205
  }
206
 
207
- return false;
208
  }
209
 
210
  /**
@@ -214,26 +308,25 @@ class W3_Cdn_S3 extends W3_Cdn_Base
214
  */
215
  function get_via()
216
  {
217
- $domain = $this->get_domain();
218
-
219
- return sprintf('Amazon Web Services: S3: %s', ($domain ? $domain : 'N/A'));
220
  }
221
 
222
  /**
223
  * Creates bucket
224
  *
 
225
  * @param string $error
226
  * @return boolean
227
  */
228
- function create_bucket(&$error)
229
  {
230
- if (! $this->_init($error)) {
231
  return false;
232
  }
233
 
234
  $buckets = @$this->_s3->listBuckets();
235
 
236
- if (! $buckets) {
237
  $error = 'Unable to list buckets (check your credentials).';
238
 
239
  return false;
@@ -245,7 +338,7 @@ class W3_Cdn_S3 extends W3_Cdn_Base
245
  return false;
246
  }
247
 
248
- if (! @$this->_s3->putBucket($this->_config['bucket'], S3::ACL_PUBLIC_READ)) {
249
  $error = sprintf('Unable to create bucket: %s.', $this->_config['bucket']);
250
 
251
  return false;
@@ -253,4 +346,26 @@ class W3_Cdn_S3 extends W3_Cdn_Base
253
 
254
  return true;
255
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  }
1
  <?php
2
 
3
+ /**
4
+ * Amazon S3 CDN engine
5
+ */
6
  require_once W3TC_LIB_W3_DIR . '/Cdn/Base.php';
 
7
 
8
+ if (!class_exists('S3')) {
9
+ require_once W3TC_LIB_DIR . '/S3.php';
10
+ }
11
+
12
+ /**
13
+ * Class W3_Cdn_S3
14
+ */
15
  class W3_Cdn_S3 extends W3_Cdn_Base
16
  {
17
  /**
21
  */
22
  var $_s3 = null;
23
 
24
+ /**
25
+ * gzip extension
26
+ *
27
+ * @var string
28
+ */
29
+ var $_gzip_extension = '.gzip';
30
+
31
  /**
32
  * Inits S3 object
33
  *
60
  }
61
 
62
  /**
63
+ * Uploads files to S3
64
  *
65
  * @param array $files
66
  * @param array $results
72
  $count = 0;
73
  $error = null;
74
 
75
+ if (!$this->_init($error)) {
76
+ $results = $this->get_results($files, W3TC_CDN_RESULT_HALT, $error);
77
  return false;
78
  }
79
 
80
  foreach ($files as $local_path => $remote_path) {
81
+ $result = $this->_upload($local_path, $remote_path, $force_rewrite);
82
+ $results[] = $result;
83
+
84
+ if ($result['result'] == W3TC_CDN_RESULT_OK) {
85
+ $count++;
86
  }
87
 
88
+ if ($this->_config['compression'] && $this->may_gzip($remote_path)) {
89
+ $remote_path_gzip = $remote_path . $this->_gzip_extension;
90
+ $result = $this->_upload_gzip($local_path, $remote_path_gzip, $force_rewrite);
91
+ $results[] = $result;
92
 
93
+ if ($result['result'] == W3TC_CDN_RESULT_OK) {
94
+ $count++;
 
 
 
 
 
 
95
  }
96
  }
97
+ }
98
+
99
+ return $count;
100
+ }
101
+
102
+ /**
103
+ * Uploads single file to S3
104
+ *
105
+ * @param string $local_path
106
+ * @param string $remote_path
107
+ * @param boolean $force_rewrite
108
+ * @return array
109
+ */
110
+ function _upload($local_path, $remote_path, $force_rewrite = false)
111
+ {
112
+ if (!file_exists($local_path)) {
113
+ return $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, 'Source file not found');
114
+ }
115
+
116
+ if (!$force_rewrite) {
117
+ $info = @$this->_s3->getObjectInfo($this->_config['bucket'], $remote_path);
118
 
119
+ if ($info) {
120
+ $hash = @md5_file($local_path);
121
+ $s3_hash = (isset($info['hash']) ? $info['hash'] : '');
122
+
123
+ if ($hash === $s3_hash) {
124
+ return $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, 'Object already exists');
125
+ }
126
+ }
127
+ }
128
+
129
+ $headers = $this->get_headers($local_path);
130
+ $result = @$this->_s3->putObjectFile($local_path, $this->_config['bucket'], $remote_path, S3::ACL_PUBLIC_READ, array(), $headers);
131
+
132
+ return $this->get_result($local_path, $remote_path, ($result ? W3TC_CDN_RESULT_OK : W3TC_CDN_RESULT_ERROR), ($result ? 'OK' : 'Unable to put object'));
133
+ }
134
+
135
+ /**
136
+ * Uploads gzip version of file
137
+ *
138
+ * @param string $local_path
139
+ * @param string $remote_path
140
+ * @param boolean $force_rewrite
141
+ * @return array
142
+ */
143
+ function _upload_gzip($local_path, $remote_path, $force_rewrite = false)
144
+ {
145
+ if (!function_exists('gzencode')) {
146
+ return $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, "GZIP library doesn't exists");
147
+ }
148
+
149
+ if (!file_exists($local_path)) {
150
+ return $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, 'Source file not found');
151
+ }
152
+
153
+ $contents = @file_get_contents($local_path);
154
+
155
+ if ($contents === false) {
156
+ return $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, 'Unable to read file');
157
+ }
158
+
159
+ $data = gzencode($contents);
160
+
161
+ if (!$force_rewrite) {
162
+ $info = @$this->_s3->getObjectInfo($this->_config['bucket'], $remote_path);
163
 
164
+ if ($info) {
165
+ $hash = md5($data);
166
+ $s3_hash = (isset($info['hash']) ? $info['hash'] : '');
167
+
168
+ if ($hash === $s3_hash) {
169
+ return $this->get_result($local_path, $remote_path, W3TC_CDN_RESULT_ERROR, 'Object already exists');
170
+ }
171
  }
172
  }
173
 
174
+ $headers = $this->get_headers($local_path);
175
+ $headers = array_merge($headers, array(
176
+ 'Vary' => 'Accept-Encoding',
177
+ 'Content-Encoding' => 'gzip'
178
+ ));
179
+
180
+ $result = @$this->_s3->putObjectString($data, $this->_config['bucket'], $remote_path, S3::ACL_PUBLIC_READ, array(), $headers);
181
+
182
+ return $this->get_result($local_path, $remote_path, ($result ? W3TC_CDN_RESULT_OK : W3TC_CDN_RESULT_ERROR), ($result ? 'OK' : 'Unable to put object'));
183
  }
184
 
185
  /**
194
  $error = null;
195
  $count = 0;
196
 
197
+ if (!$this->_init($error)) {
198
+ $results = $this->get_results($files, W3TC_CDN_RESULT_HALT, $error);
199
  return false;
200
  }
201
 
202
  foreach ($files as $local_path => $remote_path) {
203
  $result = @$this->_s3->deleteObject($this->_config['bucket'], $remote_path);
204
+ $results[] = $this->get_result($local_path, $remote_path, ($result ? W3TC_CDN_RESULT_OK : W3TC_CDN_RESULT_ERROR), ($result ? 'OK' : 'Unable to delete object'));
205
 
206
  if ($result) {
207
  $count++;
208
  }
209
+
210
+ if ($this->_config['compression']) {
211
+ $remote_path_gzip = $remote_path . $this->_gzip_extension;
212
+ $result = @$this->_s3->deleteObject($this->_config['bucket'], $remote_path_gzip);
213
+ $results[] = $this->get_result($local_path, $remote_path_gzip, ($result ? W3TC_CDN_RESULT_OK : W3TC_CDN_RESULT_ERROR), ($result ? 'OK' : 'Unable to delete object'));
214
+
215
+ if ($result) {
216
+ $count++;
217
+ }
218
+ }
219
  }
220
 
221
  return $count;
229
  */
230
  function test(&$error)
231
  {
232
+ if (!parent::test($error)) {
 
 
233
  return false;
234
  }
235
 
236
+ $string = 'test_s3_' . md5(time());
 
 
 
 
 
 
237
 
238
+ if (!$this->_init($error)) {
 
 
239
  return false;
240
  }
241
 
242
  $buckets = @$this->_s3->listBuckets();
243
 
244
+ if (!$buckets) {
245
  $error = 'Unable to list buckets (check your credentials).';
246
 
247
  return false;
248
  }
249
 
250
+ if (!in_array($this->_config['bucket'], (array) $buckets)) {
251
  $error = sprintf('Bucket doesn\'t exist: %s', $this->_config['bucket']);
252
 
253
  return false;
254
  }
255
 
256
+ if (!@$this->_s3->putObjectString($string, $this->_config['bucket'], $string, S3::ACL_PUBLIC_READ)) {
257
  $error = 'Unable to put object.';
258
 
259
  return false;
260
  }
261
 
262
+ if (!($object = @$this->_s3->getObject($this->_config['bucket'], $string))) {
263
  $error = 'Unable to get object.';
264
 
265
  return false;
272
  return false;
273
  }
274
 
275
+ if (!@$this->_s3->deleteObject($this->_config['bucket'], $string)) {
276
  $error = 'Unable to delete object.';
277
 
278
  return false;
286
  *
287
  * @return string
288
  */
289
+ function get_domains()
290
  {
291
+ if (!empty($this->_config['cname'])) {
292
+ return (array) $this->_config['cname'];
293
+ } elseif (!empty($this->_config['bucket'])) {
294
  $domain = sprintf('%s.s3.amazonaws.com', $this->_config['bucket']);
295
 
296
+ return array(
297
+ $domain
298
+ );
299
  }
300
 
301
+ return array();
302
  }
303
 
304
  /**
308
  */
309
  function get_via()
310
  {
311
+ return sprintf('Amazon Web Services: S3: %s', parent::get_via());
 
 
312
  }
313
 
314
  /**
315
  * Creates bucket
316
  *
317
+ * @param string $container_id
318
  * @param string $error
319
  * @return boolean
320
  */
321
+ function create_container(&$container_id, &$error)
322
  {
323
+ if (!$this->_init($error)) {
324
  return false;
325
  }
326
 
327
  $buckets = @$this->_s3->listBuckets();
328
 
329
+ if (!$buckets) {
330
  $error = 'Unable to list buckets (check your credentials).';
331
 
332
  return false;
338
  return false;
339
  }
340
 
341
+ if (!@$this->_s3->putBucket($this->_config['bucket'], S3::ACL_PUBLIC_READ)) {
342
  $error = sprintf('Unable to create bucket: %s.', $this->_config['bucket']);
343
 
344
  return false;
346
 
347
  return true;
348
  }
349
+
350
+ /**
351
+ * Formats URL for object
352
+ * @param string $path
353
+ * @return string
354
+ */
355
+ function format_url($path)
356
+ {
357
+ $url = parent::format_url($path);
358
+
359
+ if ($this->_config['compression'] && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && stristr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false && $this->may_gzip($path)) {
360
+ if (($qpos = strpos($url, '?')) !== false) {
361
+ $url = substr_replace($url, $this->_gzip_extension, $qpos, 0);
362
+ } else {
363
+ $url .= $this->_gzip_extension;
364
+ }
365
+
366
+ return $url;
367
+ }
368
+
369
+ return $url;
370
+ }
371
  }
lib/W3/Config.php CHANGED
@@ -31,6 +31,7 @@ class W3_Config
31
  'dbcache.debug' => 'boolean',
32
  'dbcache.engine' => 'string',
33
  'dbcache.file.gc' => 'integer',
 
34
  'dbcache.memcached.servers' => 'array',
35
  'dbcache.memcached.persistant' => 'boolean',
36
  'dbcache.reject.logged' => 'boolean',
@@ -39,14 +40,26 @@ class W3_Config
39
  'dbcache.reject.sql' => 'array',
40
  'dbcache.lifetime' => 'integer',
41
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  'pgcache.enabled' => 'boolean',
43
  'pgcache.debug' => 'boolean',
44
  'pgcache.engine' => 'string',
45
  'pgcache.file.gc' => 'integer',
 
46
  'pgcache.memcached.servers' => 'array',
47
  'pgcache.memcached.persistant' => 'boolean',
48
- 'pgcache.lifetime' => 'integer',
49
- 'pgcache.compression' => 'string',
50
  'pgcache.cache.query' => 'boolean',
51
  'pgcache.cache.home' => 'boolean',
52
  'pgcache.cache.feed' => 'boolean',
@@ -58,30 +71,32 @@ class W3_Config
58
  'pgcache.reject.uri' => 'array',
59
  'pgcache.reject.ua' => 'array',
60
  'pgcache.reject.cookie' => 'array',
61
- 'pgcache.mobile.redirect' => 'string',
62
- 'pgcache.mobile.agents' => 'array',
 
 
 
 
63
 
64
  'minify.enabled' => 'boolean',
65
  'minify.debug' => 'boolean',
66
  'minify.engine' => 'string',
67
- 'minify.file.locking' => 'boolean',
68
  'minify.file.gc' => 'integer',
 
69
  'minify.memcached.servers' => 'array',
70
  'minify.memcached.persistant' => 'boolean',
71
  'minify.rewrite' => 'boolean',
72
  'minify.fixtime' => 'integer',
73
- 'minify.compression' => 'string',
74
  'minify.options' => 'array',
75
  'minify.symlinks' => 'array',
76
- 'minify.maxage' => 'integer',
77
  'minify.lifetime' => 'integer',
78
  'minify.upload' => 'boolean',
79
  'minify.html.enable' => 'boolean',
80
- 'minify.html.reject.admin' => 'boolean',
81
  'minify.html.reject.feed' => 'boolean',
82
  'minify.html.inline.css' => 'boolean',
83
  'minify.html.inline.js' => 'boolean',
84
  'minify.html.strip.crlf' => 'boolean',
 
85
  'minify.css.enable' => 'boolean',
86
  'minify.css.combine' => 'boolean',
87
  'minify.css.strip.comments' => 'boolean',
@@ -89,12 +104,15 @@ class W3_Config
89
  'minify.css.groups' => 'array',
90
  'minify.js.enable' => 'boolean',
91
  'minify.js.combine.header' => 'boolean',
 
92
  'minify.js.combine.footer' => 'boolean',
93
  'minify.js.strip.comments' => 'boolean',
94
  'minify.js.strip.crlf' => 'boolean',
95
  'minify.js.groups' => 'array',
96
  'minify.reject.ua' => 'array',
97
  'minify.reject.uri' => 'array',
 
 
98
 
99
  'cdn.enabled' => 'boolean',
100
  'cdn.debug' => 'boolean',
@@ -110,25 +128,63 @@ class W3_Config
110
  'cdn.import.files' => 'string',
111
  'cdn.queue.limit' => 'integer',
112
  'cdn.force.rewrite' => 'boolean',
113
- 'cdn.mirror.domain' => 'string',
 
 
 
 
 
114
  'cdn.ftp.host' => 'string',
115
  'cdn.ftp.user' => 'string',
116
  'cdn.ftp.pass' => 'string',
117
  'cdn.ftp.path' => 'string',
118
  'cdn.ftp.pasv' => 'boolean',
119
- 'cdn.ftp.domain' => 'string',
120
  'cdn.s3.key' => 'string',
121
  'cdn.s3.secret' => 'string',
122
  'cdn.s3.bucket' => 'string',
 
123
  'cdn.cf.key' => 'string',
124
  'cdn.cf.secret' => 'string',
125
  'cdn.cf.bucket' => 'string',
126
  'cdn.cf.id' => 'string',
127
- 'cdn.cf.cname' => 'string',
 
 
 
 
 
128
  'cdn.reject.ua' => 'array',
129
  'cdn.reject.uri' => 'array',
130
  'cdn.reject.files' => 'array',
131
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132
  'common.support' => 'string',
133
  'common.install' => 'integer',
134
  'common.tweeted' => 'integer',
@@ -136,7 +192,6 @@ class W3_Config
136
  'widget.latest.enabled' => 'boolean',
137
  'widget.latest.items' => 'integer',
138
 
139
- 'notes.defaults' => 'boolean',
140
  'notes.wp_content_perms' => 'boolean',
141
  'notes.php_is_old' => 'boolean',
142
  'notes.theme_changed' => 'boolean',
@@ -151,7 +206,11 @@ class W3_Config
151
  'notes.support_us' => 'boolean',
152
  'notes.no_curl' => 'boolean',
153
  'notes.no_zlib' => 'boolean',
154
- 'notes.zlib_output_compression' => 'boolean'
 
 
 
 
155
  );
156
 
157
  var $_defaults = array(
@@ -159,6 +218,7 @@ class W3_Config
159
  'dbcache.debug' => false,
160
  'dbcache.engine' => 'file',
161
  'dbcache.file.gc' => 3600,
 
162
  'dbcache.memcached.servers' => array(
163
  '127.0.0.1:11211'
164
  ),
@@ -167,20 +227,47 @@ class W3_Config
167
  'dbcache.reject.uri' => array(),
168
  'dbcache.reject.cookie' => array(),
169
  'dbcache.reject.sql' => array(
170
- 'gdsr_'
 
171
  ),
172
  'dbcache.lifetime' => 180,
173
 
174
- 'pgcache.enabled' => true,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
175
  'pgcache.debug' => false,
176
  'pgcache.engine' => 'file_pgcache',
177
  'pgcache.file.gc' => 3600,
 
178
  'pgcache.memcached.servers' => array(
179
  '127.0.0.1:11211'
180
  ),
181
  'pgcache.memcached.persistant' => true,
182
- 'pgcache.lifetime' => 3600,
183
- 'pgcache.compression' => 'gzip',
184
  'pgcache.cache.query' => true,
185
  'pgcache.cache.home' => true,
186
  'pgcache.cache.feed' => true,
@@ -189,7 +276,8 @@ class W3_Config
189
  'pgcache.cache.headers' => array(
190
  'Last-Modified',
191
  'Content-Type',
192
- 'X-Pingback'
 
193
  ),
194
  'pgcache.accept.files' => array(
195
  'wp-comments-popup.php',
@@ -201,147 +289,45 @@ class W3_Config
201
  'wp-.*\.php',
202
  'index\.php'
203
  ),
204
- 'pgcache.reject.ua' => array(
205
- 'bot',
206
- 'ia_archive',
207
- 'slurp',
208
- 'crawl',
209
- 'spider'
210
- ),
211
  'pgcache.reject.cookie' => array(),
212
- 'pgcache.mobile.redirect' => '',
213
- 'pgcache.mobile.agents' => array(
214
- '2.0 MMP',
215
- '240x320',
216
- 'ASUS',
217
- 'AU-MIC',
218
- 'Alcatel',
219
- 'Amoi',
220
- 'Android',
221
- 'Audiovox',
222
- 'AvantGo',
223
- 'BenQ',
224
- 'Bird',
225
- 'BlackBerry',
226
- 'Blazer',
227
- 'CDM',
228
- 'Cellphone',
229
- 'DDIPOCKET',
230
- 'Danger',
231
- 'DoCoMo',
232
- 'Elaine/3.0',
233
- 'Ericsson',
234
- 'EudoraWeb',
235
- 'Fly',
236
- 'HP.iPAQ',
237
- 'Haier',
238
- 'Huawei',
239
- 'IEMobile',
240
- 'J-PHONE',
241
- 'KDDI',
242
- 'KONKA',
243
- 'KWC',
244
- 'KYOCERA/WX310K',
245
- 'LG',
246
- 'LG/U990',
247
- 'Lenovo',
248
- 'MIDP-2.0',
249
- 'MMEF20',
250
- 'MOT-V',
251
- 'MobilePhone',
252
- 'Motorola',
253
- 'NEWGEN',
254
- 'NetFront',
255
- 'Newt',
256
- 'Nintendo Wii',
257
- 'Nitro',
258
- 'Nokia',
259
- 'Novarra',
260
- 'O2',
261
- 'Opera Mini',
262
- 'Opera.Mobi',
263
- 'PANTECH',
264
- 'PDXGW',
265
- 'PG',
266
- 'PPC',
267
- 'PT',
268
- 'Palm',
269
- 'Panasonic',
270
- 'Philips',
271
- 'Playstation Portable',
272
- 'ProxiNet',
273
- 'Proxinet',
274
- 'Qtek',
275
- 'SCH',
276
- 'SEC',
277
- 'SGH',
278
- 'SHARP-TQ-GX10',
279
- 'SPH',
280
- 'Sagem',
281
- 'Samsung',
282
- 'Sanyo',
283
- 'Sendo',
284
- 'Sharp',
285
- 'Small',
286
- 'Smartphone',
287
- 'SoftBank',
288
- 'SonyEricsson',
289
- 'Symbian',
290
- 'Symbian OS',
291
- 'SymbianOS',
292
- 'TS21i-10',
293
- 'Toshiba',
294
- 'Treo',
295
- 'UP.Browser',
296
- 'UP.Link',
297
- 'UTS',
298
- 'Vertu',
299
- 'WILLCOME',
300
- 'WinWAP',
301
- 'Windows CE',
302
- 'Windows.CE',
303
- 'Xda',
304
- 'ZTE',
305
- 'dopod',
306
- 'hiptop',
307
- 'htc',
308
- 'i-mobile',
309
- 'iPhone',
310
- 'iPod',
311
- 'nokia',
312
- 'portalmmm',
313
- 'vodafone'
314
- ),
315
 
316
- 'minify.enabled' => true,
317
  'minify.debug' => false,
318
  'minify.engine' => 'file',
319
- 'minify.file.locking' => true,
320
  'minify.file.gc' => 86400,
 
321
  'minify.memcached.servers' => array(
322
  '127.0.0.1:11211'
323
  ),
324
  'minify.memcached.persistant' => true,
325
  'minify.rewrite' => true,
326
  'minify.fixtime' => 0,
327
- 'minify.compression' => 'gzip',
328
  'minify.options' => array(
329
- 'bubbleCssImports' => false,
330
  'minApp' => array(
331
  'groupsOnly' => false,
332
  'maxFiles' => 20
333
  )
334
  ),
335
  'minify.symlinks' => array(),
336
- 'minify.maxage' => 86400,
337
  'minify.lifetime' => 86400,
338
  'minify.upload' => true,
339
  'minify.html.enable' => false,
340
- 'minify.html.reject.admin' => false,
341
  'minify.html.reject.feed' => false,
342
  'minify.html.inline.css' => false,
343
  'minify.html.inline.js' => false,
344
  'minify.html.strip.crlf' => false,
 
 
 
 
345
  'minify.css.enable' => true,
346
  'minify.css.combine' => false,
347
  'minify.css.strip.comments' => false,
@@ -349,12 +335,15 @@ class W3_Config
349
  'minify.css.groups' => array(),
350
  'minify.js.enable' => true,
351
  'minify.js.combine.header' => false,
 
352
  'minify.js.combine.footer' => false,
353
  'minify.js.strip.comments' => false,
354
  'minify.js.strip.crlf' => false,
355
  'minify.js.groups' => array(),
356
  'minify.reject.ua' => array(),
357
  'minify.reject.uri' => array(),
 
 
358
 
359
  'cdn.enabled' => false,
360
  'cdn.debug' => false,
@@ -362,7 +351,7 @@ class W3_Config
362
  'cdn.includes.enable' => true,
363
  'cdn.includes.files' => '*.css;*.js;*.gif;*.png;*.jpg',
364
  'cdn.theme.enable' => true,
365
- 'cdn.theme.files' => '*.css;*.js;*.gif;*.png;*.jpg;*.ico',
366
  'cdn.minify.enable' => true,
367
  'cdn.custom.enable' => true,
368
  'cdn.custom.files' => array(
@@ -373,27 +362,219 @@ class W3_Config
373
  'cdn.import.files' => '*.jpg;*.png;*.gif;*.avi;*.wmv;*.mpg;*.wav;*.mp3;*.txt;*.rtf;*.doc;*.xls;*.rar;*.zip;*.tar;*.gz;*.exe',
374
  'cdn.queue.limit' => 25,
375
  'cdn.force.rewrite' => false,
376
- 'cdn.mirror.domain' => '',
 
 
 
 
 
377
  'cdn.ftp.host' => '',
378
  'cdn.ftp.user' => '',
379
  'cdn.ftp.pass' => '',
380
  'cdn.ftp.path' => '',
381
  'cdn.ftp.pasv' => false,
382
- 'cdn.ftp.domain' => '',
383
  'cdn.s3.key' => '',
384
  'cdn.s3.secret' => '',
385
  'cdn.s3.bucket' => '',
 
386
  'cdn.cf.key' => '',
387
  'cdn.cf.secret' => '',
388
  'cdn.cf.bucket' => '',
389
  'cdn.cf.id' => '',
390
- 'cdn.cf.cname' => '',
 
 
 
 
 
391
  'cdn.reject.ua' => array(),
392
  'cdn.reject.uri' => array(),
393
  'cdn.reject.files' => array(
394
  'wp-content/uploads/wpcf7_captcha/*'
395
  ),
396
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  'dbcache.debug' => 'boolean',
32
  'dbcache.engine' => 'string',
33
  'dbcache.file.gc' => 'integer',
34
+ 'dbcache.file.locking' => 'boolean',
35
  'dbcache.memcached.servers' => 'array',
36
  'dbcache.memcached.persistant' => 'boolean',
37
  'dbcache.reject.logged' => 'boolean',
40
  'dbcache.reject.sql' => 'array',
41
  'dbcache.lifetime' => 'integer',
42
 
43
+ 'objectcache.enabled' => 'boolean',
44
+ 'objectcache.debug' => 'boolean',
45
+ 'objectcache.engine' => 'string',
46
+ 'objectcache.file.gc' => 'integer',
47
+ 'objectcache.file.locking' => 'boolean',
48
+ 'objectcache.memcached.servers' => 'array',
49
+ 'objectcache.memcached.persistant' => 'boolean',
50
+ 'objectcache.reject.admin' => 'boolean',
51
+ 'objectcache.reject.uri' => 'array',
52
+ 'objectcache.groups.global' => 'array',
53
+ 'objectcache.groups.nonpersistent' => 'array',
54
+ 'objectcache.lifetime' => 'integer',
55
+
56
  'pgcache.enabled' => 'boolean',
57
  'pgcache.debug' => 'boolean',
58
  'pgcache.engine' => 'string',
59
  'pgcache.file.gc' => 'integer',
60
+ 'pgcache.file.locking' => 'boolean',
61
  'pgcache.memcached.servers' => 'array',
62
  'pgcache.memcached.persistant' => 'boolean',
 
 
63
  'pgcache.cache.query' => 'boolean',
64
  'pgcache.cache.home' => 'boolean',
65
  'pgcache.cache.feed' => 'boolean',
71
  'pgcache.reject.uri' => 'array',
72
  'pgcache.reject.ua' => 'array',
73
  'pgcache.reject.cookie' => 'array',
74
+ 'pgcache.varnish.enabled' => 'boolean',
75
+ 'pgcache.varnish.servers' => 'array',
76
+ 'pgcache.prime.enabled' => 'boolean',
77
+ 'pgcache.prime.interval' => 'integer',
78
+ 'pgcache.prime.limit' => 'integer',
79
+ 'pgcache.prime.sitemap' => 'string',
80
 
81
  'minify.enabled' => 'boolean',
82
  'minify.debug' => 'boolean',
83
  'minify.engine' => 'string',
 
84
  'minify.file.gc' => 'integer',
85
+ 'minify.file.locking' => 'boolean',
86
  'minify.memcached.servers' => 'array',
87
  'minify.memcached.persistant' => 'boolean',
88
  'minify.rewrite' => 'boolean',
89
  'minify.fixtime' => 'integer',
 
90
  'minify.options' => 'array',
91
  'minify.symlinks' => 'array',
 
92
  'minify.lifetime' => 'integer',
93
  'minify.upload' => 'boolean',
94
  'minify.html.enable' => 'boolean',
 
95
  'minify.html.reject.feed' => 'boolean',
96
  'minify.html.inline.css' => 'boolean',
97
  'minify.html.inline.js' => 'boolean',
98
  'minify.html.strip.crlf' => 'boolean',
99
+ 'minify.html.comments.ignore' => 'array',
100
  'minify.css.enable' => 'boolean',
101
  'minify.css.combine' => 'boolean',
102
  'minify.css.strip.comments' => 'boolean',
104
  'minify.css.groups' => 'array',
105
  'minify.js.enable' => 'boolean',
106
  'minify.js.combine.header' => 'boolean',
107
+ 'minify.js.combine.body' => 'boolean',
108
  'minify.js.combine.footer' => 'boolean',
109
  'minify.js.strip.comments' => 'boolean',
110
  'minify.js.strip.crlf' => 'boolean',
111
  'minify.js.groups' => 'array',
112
  'minify.reject.ua' => 'array',
113
  'minify.reject.uri' => 'array',
114
+ 'minify.error.notification' => 'string',
115
+ 'minify.error.notification.last' => 'integer',
116
 
117
  'cdn.enabled' => 'boolean',
118
  'cdn.debug' => 'boolean',
128
  'cdn.import.files' => 'string',
129
  'cdn.queue.limit' => 'integer',
130
  'cdn.force.rewrite' => 'boolean',
131
+ 'cdn.autoupload.enabled' => 'boolean',
132
+ 'cdn.autoupload.interval' => 'integer',
133
+ 'cdn.mirror.domain' => 'array',
134
+ 'cdn.netdna.apiid' => 'string',
135
+ 'cdn.netdna.apikey' => 'string',
136
+ 'cdn.netdna.domain' => 'array',
137
  'cdn.ftp.host' => 'string',
138
  'cdn.ftp.user' => 'string',
139
  'cdn.ftp.pass' => 'string',
140
  'cdn.ftp.path' => 'string',
141
  'cdn.ftp.pasv' => 'boolean',
142
+ 'cdn.ftp.domain' => 'array',
143
  'cdn.s3.key' => 'string',
144
  'cdn.s3.secret' => 'string',
145
  'cdn.s3.bucket' => 'string',
146
+ 'cdn.s3.cname' => 'array',
147
  'cdn.cf.key' => 'string',
148
  'cdn.cf.secret' => 'string',
149
  'cdn.cf.bucket' => 'string',
150
  'cdn.cf.id' => 'string',
151
+ 'cdn.cf.cname' => 'array',
152
+ 'cdn.rscf.user' => 'string',
153
+ 'cdn.rscf.key' => 'string',
154
+ 'cdn.rscf.container' => 'string',
155
+ 'cdn.rscf.id' => 'string',
156
+ 'cdn.rscf.cname' => 'array',
157
  'cdn.reject.ua' => 'array',
158
  'cdn.reject.uri' => 'array',
159
  'cdn.reject.files' => 'array',
160
 
161
+ 'browsercache.enabled' => 'boolean',
162
+ 'browsercache.no404wp' => 'boolean',
163
+ 'browsercache.cssjs.compression' => 'boolean',
164
+ 'browsercache.cssjs.expires' => 'boolean',
165
+ 'browsercache.cssjs.lifetime' => 'integer',
166
+ 'browsercache.cssjs.cache.control' => 'boolean',
167
+ 'browsercache.cssjs.cache.policy' => 'string',
168
+ 'browsercache.cssjs.etag' => 'boolean',
169
+ 'browsercache.cssjs.w3tc' => 'boolean',
170
+ 'browsercache.html.compression' => 'boolean',
171
+ 'browsercache.html.expires' => 'boolean',
172
+ 'browsercache.html.lifetime' => 'integer',
173
+ 'browsercache.html.cache.control' => 'boolean',
174
+ 'browsercache.html.cache.policy' => 'string',
175
+ 'browsercache.html.etag' => 'boolean',
176
+ 'browsercache.html.w3tc' => 'boolean',
177
+ 'browsercache.other.compression' => 'boolean',
178
+ 'browsercache.other.expires' => 'boolean',
179
+ 'browsercache.other.lifetime' => 'integer',
180
+ 'browsercache.other.cache.control' => 'boolean',
181
+ 'browsercache.other.cache.policy' => 'string',
182
+ 'browsercache.other.etag' => 'boolean',
183
+ 'browsercache.other.w3tc' => 'boolean',
184
+
185
+ 'mobile.enabled' => 'boolean',
186
+ 'mobile.groups' => 'array',
187
+
188
  'common.support' => 'string',
189
  'common.install' => 'integer',
190
  'common.tweeted' => 'integer',
192
  'widget.latest.enabled' => 'boolean',
193
  'widget.latest.items' => 'integer',
194
 
 
195
  'notes.wp_content_perms' => 'boolean',
196
  'notes.php_is_old' => 'boolean',
197
  'notes.theme_changed' => 'boolean',
206
  'notes.support_us' => 'boolean',
207
  'notes.no_curl' => 'boolean',
208
  'notes.no_zlib' => 'boolean',
209
+ 'notes.zlib_output_compression' => 'boolean',
210
+ 'notes.no_permalink_rules' => 'boolean',
211
+ 'notes.browsercache_rules_cache' => 'boolean',
212
+ 'notes.browsercache_rules_no404wp' => 'boolean',
213
+ 'notes.minify_error' => 'boolean'
214
  );
215
 
216
  var $_defaults = array(
218
  'dbcache.debug' => false,
219
  'dbcache.engine' => 'file',
220
  'dbcache.file.gc' => 3600,
221
+ 'dbcache.file.locking' => false,
222
  'dbcache.memcached.servers' => array(
223
  '127.0.0.1:11211'
224
  ),
227
  'dbcache.reject.uri' => array(),
228
  'dbcache.reject.cookie' => array(),
229
  'dbcache.reject.sql' => array(
230
+ 'gdsr_',
231
+ 'wp_rg_'
232
  ),
233
  'dbcache.lifetime' => 180,
234
 
235
+ 'objectcache.enabled' => false,
236
+ 'objectcache.debug' => false,
237
+ 'objectcache.engine' => 'file',
238
+ 'objectcache.file.gc' => 3600,
239
+ 'objectcache.file.locking' => false,
240
+ 'objectcache.memcached.servers' => array(
241
+ '127.0.0.1:11211'
242
+ ),
243
+ 'objectcache.memcached.persistant' => true,
244
+ 'objectcache.reject.admin' => true,
245
+ 'objectcache.reject.uri' => array(),
246
+ 'objectcache.groups.global' => array(
247
+ 'users',
248
+ 'userlogins',
249
+ 'usermeta',
250
+ 'site-options',
251
+ 'site-lookup',
252
+ 'blog-lookup',
253
+ 'blog-details',
254
+ 'rss'
255
+ ),
256
+ 'objectcache.groups.nonpersistent' => array(
257
+ 'comment',
258
+ 'counts'
259
+ ),
260
+ 'objectcache.lifetime' => 180,
261
+
262
+ 'pgcache.enabled' => false,
263
  'pgcache.debug' => false,
264
  'pgcache.engine' => 'file_pgcache',
265
  'pgcache.file.gc' => 3600,
266
+ 'pgcache.file.locking' => false,
267
  'pgcache.memcached.servers' => array(
268
  '127.0.0.1:11211'
269
  ),
270
  'pgcache.memcached.persistant' => true,
 
 
271
  'pgcache.cache.query' => true,
272
  'pgcache.cache.home' => true,
273
  'pgcache.cache.feed' => true,
276
  'pgcache.cache.headers' => array(
277
  'Last-Modified',
278
  'Content-Type',
279
+ 'X-Pingback',
280
+ 'P3P'
281
  ),
282
  'pgcache.accept.files' => array(
283
  'wp-comments-popup.php',
289
  'wp-.*\.php',
290
  'index\.php'
291
  ),
292
+ 'pgcache.reject.ua' => array(),
 
 
 
 
 
 
293
  'pgcache.reject.cookie' => array(),
294
+ 'pgcache.varnish.enabled' => false,
295
+ 'pgcache.varnish.servers' => array(),
296
+ 'pgcache.prime.enabled' => false,
297
+ 'pgcache.prime.interval' => 900,
298
+ 'pgcache.prime.limit' => 10,
299
+ 'pgcache.prime.sitemap' => '',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
300
 
301
+ 'minify.enabled' => false,
302
  'minify.debug' => false,
303
  'minify.engine' => 'file',
 
304
  'minify.file.gc' => 86400,
305
+ 'minify.file.locking' => false,
306
  'minify.memcached.servers' => array(
307
  '127.0.0.1:11211'
308
  ),
309
  'minify.memcached.persistant' => true,
310
  'minify.rewrite' => true,
311
  'minify.fixtime' => 0,
 
312
  'minify.options' => array(
313
+ 'bubbleCssImports' => true,
314
  'minApp' => array(
315
  'groupsOnly' => false,
316
  'maxFiles' => 20
317
  )
318
  ),
319
  'minify.symlinks' => array(),
 
320
  'minify.lifetime' => 86400,
321
  'minify.upload' => true,
322
  'minify.html.enable' => false,
 
323
  'minify.html.reject.feed' => false,
324
  'minify.html.inline.css' => false,
325
  'minify.html.inline.js' => false,
326
  'minify.html.strip.crlf' => false,
327
+ 'minify.html.comments.ignore' => array(
328
+ 'google_ad_section_',
329
+ 'RSPEAK_'
330
+ ),
331
  'minify.css.enable' => true,
332
  'minify.css.combine' => false,
333
  'minify.css.strip.comments' => false,
335
  'minify.css.groups' => array(),
336
  'minify.js.enable' => true,
337
  'minify.js.combine.header' => false,
338
+ 'minify.js.combine.body' => false,
339
  'minify.js.combine.footer' => false,
340
  'minify.js.strip.comments' => false,
341
  'minify.js.strip.crlf' => false,
342
  'minify.js.groups' => array(),
343
  'minify.reject.ua' => array(),
344
  'minify.reject.uri' => array(),
345
+ 'minify.error.notification' => '',
346
+ 'minify.error.notification.last' => 0,
347
 
348
  'cdn.enabled' => false,
349
  'cdn.debug' => false,
351
  'cdn.includes.enable' => true,
352
  'cdn.includes.files' => '*.css;*.js;*.gif;*.png;*.jpg',
353
  'cdn.theme.enable' => true,
354
+ 'cdn.theme.files' => '*.css;*.js;*.gif;*.png;*.jpg;*.ico;*.ttf;*.otf,*.woff',
355
  'cdn.minify.enable' => true,
356
  'cdn.custom.enable' => true,
357
  'cdn.custom.files' => array(
362
  'cdn.import.files' => '*.jpg;*.png;*.gif;*.avi;*.wmv;*.mpg;*.wav;*.mp3;*.txt;*.rtf;*.doc;*.xls;*.rar;*.zip;*.tar;*.gz;*.exe',
363
  'cdn.queue.limit' => 25,
364
  'cdn.force.rewrite' => false,
365
+ 'cdn.autoupload.enabled' => false,
366
+ 'cdn.autoupload.interval' => 3600,
367
+ 'cdn.mirror.domain' => array(),
368
+ 'cdn.netdna.apiid' => '',
369
+ 'cdn.netdna.apikey' => '',
370
+ 'cdn.netdna.domain' => array(),
371
  'cdn.ftp.host' => '',
372
  'cdn.ftp.user' => '',
373
  'cdn.ftp.pass' => '',
374
  'cdn.ftp.path' => '',
375
  'cdn.ftp.pasv' => false,
376
+ 'cdn.ftp.domain' => array(),
377
  'cdn.s3.key' => '',
378
  'cdn.s3.secret' => '',
379
  'cdn.s3.bucket' => '',
380
+ 'cdn.s3.cname' => array(),
381
  'cdn.cf.key' => '',
382
  'cdn.cf.secret' => '',
383
  'cdn.cf.bucket' => '',
384
  'cdn.cf.id' => '',
385
+ 'cdn.cf.cname' => array(),
386
+ 'cdn.rscf.user' => '',
387
+ 'cdn.rscf.key' => '',
388
+ 'cdn.rscf.container' => '',
389
+ 'cdn.rscf.id' => '',
390
+ 'cdn.rscf.cname' => array(),
391
  'cdn.reject.ua' => array(),
392
  'cdn.reject.uri' => array(),
393
  'cdn.reject.files' => array(
394
  'wp-content/uploads/wpcf7_captcha/*'
395
  ),
396
 
397
+ 'browsercache.enabled' => true,
398
+ 'browsercache.no404wp' => false,
399
+ 'browsercache.cssjs.compression' => true,
400
+ 'browsercache.cssjs.expires' => false,
401
+ 'browsercache.cssjs.lifetime' => 3600,
402
+ 'browsercache.cssjs.cache.control' => false,
403
+ 'browsercache.cssjs.cache.policy' => 'cache_validation',
404
+ 'browsercache.cssjs.etag' => false,
405
+ 'browsercache.cssjs.w3tc' => true,
406
+ 'browsercache.html.compression' => true,
407
+ 'browsercache.html.expires' => false,
408
+ 'browsercache.html.lifetime' => 3600,
409
+ 'browsercache.html.cache.control' => false,
410
+ 'browsercache.html.cache.policy' => 'cache_validation',
411
+ 'browsercache.html.etag' => false,
412
+ 'browsercache.html.w3tc' => true,
413
+ 'browsercache.other.compression' => true,
414
+ 'browsercache.other.expires' => false,
415
+ 'browsercache.other.lifetime' => 31536000,
416
+ 'browsercache.other.cache.control' => false,
417
+ 'browsercache.other.cache.policy' => 'cache_validation',
418
+ 'browsercache.other.etag' => false,
419
+ 'browsercache.other.w3tc' => true,
420
+
421
+ 'mobile.enabled' => true,
422
+ 'mobile.groups' => array(
423
+ 'high' => array(
424
+ 'theme' => '',
425
+ 'enabled' => true,
426
+ 'redirect' => '',
427
+ 'agents' => array(
428
+ 'acer\ s100',
429
+ 'android',
430
+ 'archos5',
431
+ 'blackberry9500',
432
+ 'blackberry9530',
433
+ 'blackberry9550',
434
+ 'cupcake',
435
+ 'docomo\ ht\-03a',
436
+ 'dream',
437
+ 'htc\ hero',
438
+ 'htc\ magic',
439
+ 'htc_dream',
440
+ 'htc_magic',
441
+ 'incognito',
442
+ 'ipad',
443
+ 'iphone',
444
+ 'ipod',
445
+ 'lg\-gw620',
446
+ 'liquid\ build',
447
+ 'maemo',
448
+ 'mot\-mb200',
449
+ 'mot\-mb300',
450
+ 'nexus\ one',
451
+ 'opera\ mini',
452
+ 'samsung\-s8000',
453
+ 'series60.*webkit',
454
+ 'series60/5\.0',
455
+ 'sonyericssone10',
456
+ 'sonyericssonu20',
457
+ 'sonyericssonx10',
458
+ 't\-mobile\ mytouch\ 3g',
459
+ 't\-mobile\ opal',
460
+ 'tattoo',
461
+ 'webmate',
462
+ 'webos'
463
+ )
464
+ ),
465
+ 'low' => array(
466
+ 'theme' => '',
467
+ 'enabled' => true,
468
+ 'redirect' => '',
469
+ 'agents' => array(
470
+ '2\.0\ mmp',
471
+ '240x320',
472
+ 'alcatel',
473
+ 'amoi',
474
+ 'asus',
475
+ 'au\-mic',
476
+ 'audiovox',
477
+ 'avantgo',
478
+ 'benq',
479
+ 'bird',
480
+ 'blackberry',
481
+ 'blazer',
482
+ 'cdm',
483
+ 'cellphone',
484
+ 'danger',
485
+ 'ddipocket',
486
+ 'docomo',
487
+ 'dopod',
488
+ 'elaine/3\.0',
489
+ 'ericsson',
490
+ 'eudoraweb',
491
+ 'fly',
492
+ 'haier',
493
+ 'hiptop',
494
+ 'hp\.ipaq',
495
+ 'htc',
496
+ 'huawei',
497
+ 'i\-mobile',
498
+ 'iemobile',
499
+ 'j\-phone',
500
+ 'kddi',
501
+ 'konka',
502
+ 'kwc',
503
+ 'kyocera/wx310k',
504
+ 'lenovo',
505
+ 'lg',
506
+ 'lg/u990',
507
+ 'lge\ vx',
508
+ 'midp',
509
+ 'midp\-2\.0',
510
+ 'mmef20',
511
+ 'mmp',
512
+ 'mobilephone',
513
+ 'mot\-v',
514
+ 'motorola',
515
+ 'netfront',
516
+ 'newgen',
517
+ 'newt',
518
+ 'nintendo\ ds',
519
+ 'nintendo\ wii',
520
+ 'nitro',
521
+ 'nokia',
522
+ 'novarra',
523
+ 'o2',
524
+ 'openweb',
525
+ 'opera\ mobi',
526
+ 'opera\.mobi',
527
+ 'palm',
528
+ 'panasonic',
529
+ 'pantech',
530
+ 'pdxgw',
531
+ 'pg',
532
+ 'philips',
533
+ 'phone',
534
+ 'playstation\ portable',
535
+ 'portalmmm',
536
+ 'ppc',
537
+ 'proxinet',
538
+ 'psp',
539
+ 'pt',
540
+ 'qtek',
541
+ 'sagem',
542
+ 'samsung',
543
+ 'sanyo',
544
+ 'sch',
545
+ 'sec',
546
+ 'sendo',
547
+ 'sgh',
548
+ 'sharp',
549
+ 'sharp\-tq\-gx10',
550
+ 'sie',
551
+ 'small',
552
+ 'smartphone',
553
+ 'softbank',
554
+ 'sonyericsson',
555
+ 'sph',
556
+ 'symbian',
557
+ 'symbian\ os',
558
+ 'symbianos',
559
+ 'toshiba',
560
+ 'treo',
561
+ 'ts21i\-10',
562
+ 'up\.browser',
563
+ 'up\.link',
564
+ 'uts',
565
+ 'vertu',
566
+ 'vodafone',
567
+ 'wap',
568
+ 'willcome',
569
+ 'windows\ ce',
570
+ 'windows\.ce',
571
+