WP Staging – DB & File Duplicator & Migration - Version 2.1.6

Version Description

  • New: increased speed for cloning process by factor 5, using new method of file agregation
  • New: Skip files larger than 8MB
  • Fix: Additional checks to ensure that the root path is never deleted
  • New: Compatible up to WP 4.9.1
Download this release

Release Info

Developer ReneHermi
Plugin Icon 128x128 WP Staging – DB & File Duplicator & Migration
Version 2.1.6
Comparing to
See all releases

Code changes from version 2.1.5 to 2.1.6

apps/Backend/Modules/Jobs/Cancel.php CHANGED
@@ -1,60 +1,74 @@
1
- <?php
2
- namespace WPStaging\Backend\Modules\Jobs;
3
-
4
- /**
5
- * Class Cancel
6
- * @package WPStaging\Backend\Modules\Jobs
7
- */
8
- class Cancel extends Job
9
- {
10
- /**
11
- * @return bool
12
- */
13
- public function check()
14
- {
15
- return (
16
- isset($this->options) &&
17
- isset($this->options->clone) &&
18
- isset($this->options->cloneNumber) &&
19
- isset($this->options->cloneDirectoryName) &&
20
- isset($_POST["clone"]) &&
21
- $_POST["clone"] === $this->options->clone
22
- );
23
- }
24
-
25
- /**
26
- * @return array
27
- */
28
- protected function createCloneData()
29
- {
30
- $clone = array();
31
-
32
- if (!$this->check())
33
- {
34
- return $clone;
35
- }
36
-
37
- $clone["name"] = $this->options->clone;
38
- $clone["number"] = $this->options->cloneNumber;
39
- $clone["path"] = ABSPATH . $this->options->cloneDirectoryName;
40
-
41
- return $clone;
42
- }
43
-
44
- /**
45
- * Start Module
46
- * @return bool
47
- */
48
- public function start()
49
- {
50
- $cloneData = $this->createCloneData();
51
-
52
- if (empty($cloneData))
53
- {
54
- return true;
55
- }
56
-
57
- $delete = new Delete();
58
- return $delete->start($cloneData);
59
- }
60
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WPStaging\Backend\Modules\Jobs;
4
+
5
+ /**
6
+ * Class Cancel Processing
7
+ * @package WPStaging\Backend\Modules\Jobs
8
+ */
9
+ class Cancel extends Job {
10
+
11
+ /**
12
+ * Start Module
13
+ * @return bool
14
+ */
15
+ public function start() {
16
+ $cloneData = $this->createCloneData();
17
+
18
+ if (empty($cloneData)) {
19
+ return true;
20
+ }
21
+
22
+
23
+ $delete = new Delete();
24
+ return $delete->start($cloneData);
25
+ }
26
+
27
+ /**
28
+ * @return array
29
+ */
30
+ protected function createCloneData() {
31
+ $clone = array();
32
+
33
+ if (!$this->check()) {
34
+ return $clone;
35
+ }
36
+
37
+ $clone["name"] = $this->options->clone;
38
+ $clone["number"] = $this->options->cloneNumber;
39
+ $clone["path"] = ABSPATH . $this->options->cloneDirectoryName;
40
+ $clone["prefix"] = ABSPATH . $this->options->prefix;
41
+
42
+ return $clone;
43
+ }
44
+
45
+ /**
46
+ * @return bool
47
+ */
48
+ public function check() {
49
+ return (
50
+ isset($this->options) &&
51
+ isset($this->options->clone) &&
52
+ isset($this->options->cloneNumber) &&
53
+ isset($this->options->cloneDirectoryName) &&
54
+ isset($_POST["clone"]) &&
55
+ $_POST["clone"] === $this->options->clone
56
+ );
57
+ }
58
+
59
+ /**
60
+ * Get json response
61
+ * return json
62
+ */
63
+ private function returnFinish($message = '') {
64
+
65
+ wp_die(json_encode(array(
66
+ 'job' => 'delete',
67
+ 'status' => true,
68
+ 'message' => $message,
69
+ 'error' => false,
70
+ 'delete' => 'finished'
71
+ )));
72
+ }
73
+
74
+ }
apps/Backend/Modules/Jobs/Delete.php CHANGED
@@ -96,7 +96,6 @@ class Delete extends Job {
96
  //$wpdb = WPStaging::getInstance()->get("wpdb");
97
  $this->wpdb = WPStaging::getInstance()->get("wpdb");
98
 
99
-
100
  $stagingPrefix = $this->getStagingPrefix();
101
 
102
  $tables = $this->wpdb->get_results("SHOW TABLE STATUS LIKE '{$stagingPrefix}%'");
@@ -117,52 +116,8 @@ class Delete extends Job {
117
  * Check and return prefix of the staging site
118
  */
119
  public function getStagingPrefix() {
120
- // prefix not defined! Happens if staging site has ben generated with older version of wpstg
121
- // Try to get staging prefix from wp-config.php of staging site
122
- //wp_die($this->clone->directoryName);
123
- if (empty($this->clone->prefix)) {
124
- // Throw error
125
- $path = ABSPATH . $this->clone->directoryName . "/wp-config.php";
126
- if (false === ($content = @file_get_contents($path))) {
127
- $this->log("Can not open {$path}. Can't read contents", Logger::TYPE_ERROR);
128
- // Create a random prefix which highly like never exists
129
- $this->clone->prefix = rand(7, 15) . '_';
130
- } else {
131
-
132
- // Get prefix from wp-config.php
133
- //preg_match_all("/table_prefix\s*=\s*'(\w*)';/", $content, $matches);
134
- preg_match("/table_prefix\s*=\s*'(\w*)';/", $content, $matches);
135
-
136
- if (!empty($matches[1])) {
137
- $this->clone->prefix = $matches[1];
138
- } else {
139
- $this->log("Can not find Prefix. '{$matches[1]}'.");
140
- // Create a random prefix which highly like never exists
141
- return $this->clone->prefix = rand(7, 15) . '_';
142
- }
143
- }
144
- }
145
-
146
- // Check if staging prefix is the same as the live prefix
147
- if ($this->wpdb->prefix == $this->clone->prefix) {
148
- // Create a random prefix which highly like never exists
149
- return $this->clone->prefix = rand(7, 15) . '_';
150
- $this->log("Can not use prefix. '{$this->clone->prefix}', is used for the live site. Creating a new random prefix");
151
- //wp_die("Fatal Error: Can not delete staging site. Prefix. '{$this->clone->prefix}' is used for the live site. Creating a new staging site will likely resolve this the next time. Stopping for security reasons. Contact support@wp-staging.com");
152
- }
153
-
154
- // Else
155
- return $this->clone->prefix;
156
- }
157
-
158
- /**
159
- * Check if we can delete the staging site tables without affecting live ones
160
- * @return bool
161
- */
162
- public function isInvalidStagingPrefix() {
163
- // prefix not defined! Happens if staging site has ben generated with older version of wpstg
164
  // Try to get staging prefix from wp-config.php of staging site
165
- //wp_die($this->clone->directoryName);
166
  if (empty($this->clone->prefix)) {
167
  // Throw error
168
  $path = ABSPATH . $this->clone->directoryName . "/wp-config.php";
@@ -189,11 +144,12 @@ class Delete extends Job {
189
 
190
  // Check if staging prefix is the same as the live prefix
191
  if ($this->wpdb->prefix == $this->clone->prefix) {
192
- return true;
 
193
  }
194
 
195
  // Else
196
- return false;
197
  }
198
 
199
  /**
@@ -257,23 +213,12 @@ class Delete extends Job {
257
  return;
258
  }
259
 
260
- // Skip deletion of tables and generate JOB to delete directories
261
- if ($this->isInvalidStagingPrefix()) {
262
- $this->log('Invalid staging prefix. Skip deleting tables');
263
- // Generate JOB and delete tables
264
- $this->job = (object) array(
265
- "current" => "directory",
266
- "nextDirectoryToDelete" => $this->clone->path,
267
- "name" => $this->clone->name
268
- );
269
- } else {
270
- // Generate JOB and delete tables
271
- $this->job = (object) array(
272
- "current" => "tables",
273
- "nextDirectoryToDelete" => $this->clone->path,
274
- "name" => $this->clone->name
275
- );
276
- }
277
 
278
  $this->cache->save("delete_job_{$this->clone->name}", $this->job);
279
  }
@@ -316,11 +261,12 @@ class Delete extends Job {
316
  return;
317
  }
318
 
 
319
 
320
  foreach ($this->getTablesToRemove() as $table) {
321
  // PROTECTION: Never delete any table that beginns with wp prefix of live site
322
  if ($this->startsWith($table, $this->wpdb->prefix)) {
323
- $this->log("Fatal Error: Trying to delete table {$table} of main WP installation! Contact support[at]wp-staging.com", Logger::TYPE_CRITICAL);
324
  return false;
325
  } else {
326
  $this->wpdb->query("DROP TABLE {$table}");
@@ -349,9 +295,16 @@ class Delete extends Job {
349
  * @throws InvalidArgumentException
350
  */
351
  public function deleteDirectory() {
352
-
 
 
 
353
  // Finished or path does not exist
354
- if (!is_dir($this->clone->path)) {
 
 
 
 
355
  $this->job->current = "finish";
356
  $this->updateJob();
357
  return $this->returnFinish();
@@ -360,7 +313,7 @@ class Delete extends Job {
360
  $this->log("Delete staging site: " . $this->clone->path, Logger::TYPE_INFO);
361
 
362
  // Just to make sure the root dir is never deleted!
363
- if ($this->clone->path === get_home_path()) {
364
  $this->log("Fatal Error 8: Trying to delete root of WP installation!", Logger::TYPE_CRITICAL);
365
  $this->returnException('Fatal Error 8: Trying to delete root of WP installation!');
366
  }
@@ -374,7 +327,8 @@ class Delete extends Job {
374
  $di = new \RecursiveDirectoryIterator($this->clone->path, \FilesystemIterator::SKIP_DOTS);
375
  $ri = new \RecursiveIteratorIterator($di, \RecursiveIteratorIterator::CHILD_FIRST);
376
  foreach ($ri as $file) {
377
- $file->isDir() ? @rmdir($file) : unlink($file);
 
378
  if ($this->isOverThreshold()) {
379
  //$this->returnException('Maximum PHP execution time exceeded. Run again and repeat the deletion process until it is sucessfully finished.');
380
  return;
@@ -387,7 +341,21 @@ class Delete extends Job {
387
  return;
388
  }
389
 
390
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
391
 
392
  /**
393
  * @return bool
@@ -404,58 +372,69 @@ class Delete extends Job {
404
  * @param string $path
405
  * @return mixed
406
  */
407
- private function processDirectory($path) {
408
- // We hit the limit, stop
409
- if ($this->shouldStop($path)) {
410
- $this->updateJob();
411
- return false;
412
- }
413
-
414
- $this->totalRecursion++;
415
-
416
- $contents = new \DirectoryIterator($path);
417
-
418
- foreach ($contents as $content => $value) {
419
-
420
- // Skip dots
421
- if ($content->isDot())
422
-
423
-
424
- // Get into the directory
425
- if (!$content->isLink() && $content->isDir()) {
426
- return $this->processDirectory($content->getRealPath());
427
- }
428
-
429
- // Delete file
430
- if ($content->isFile()) {
431
- @unlink($content->getRealPath());
432
- }
433
- }
434
-
435
- // Delete directory
436
- $this->job->lastDeletedDirectory = realpath($path . "/..");
437
- @rmdir($path);
438
- $this->updateJob();
439
- $this->processDirectory($this->job->nextDirectoryToDelete);
440
- }
441
 
442
  /**
443
  * @param string $path
444
  * @return bool
445
  */
446
- private function shouldStop($path) {
447
- // Just to make sure the root dir is never deleted!
448
- if ($path === get_home_path()) {
449
- $this->log("Fatal Error: Trying to delete root of WP installation!", Logger::TYPE_CRITICAL);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
450
  return true;
451
  }
452
-
453
- // Check if threshold is reached and is valid dir
454
- return (
455
- $this->isOverThreshold() ||
456
- !is_dir($path) ||
457
- $this->isDirectoryDeletingFinished()
458
- );
459
  }
460
 
461
  /**
@@ -486,7 +465,18 @@ class Delete extends Job {
486
  wp_die(json_encode($response));
487
  }
488
 
489
-
 
 
 
 
 
 
 
 
 
 
 
490
  /**
491
  * Get json response
492
  * return json
96
  //$wpdb = WPStaging::getInstance()->get("wpdb");
97
  $this->wpdb = WPStaging::getInstance()->get("wpdb");
98
 
 
99
  $stagingPrefix = $this->getStagingPrefix();
100
 
101
  $tables = $this->wpdb->get_results("SHOW TABLE STATUS LIKE '{$stagingPrefix}%'");
116
  * Check and return prefix of the staging site
117
  */
118
  public function getStagingPrefix() {
119
+ // Prefix not defined! Happens if staging site has ben generated with older version of wpstg
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  // Try to get staging prefix from wp-config.php of staging site
 
121
  if (empty($this->clone->prefix)) {
122
  // Throw error
123
  $path = ABSPATH . $this->clone->directoryName . "/wp-config.php";
144
 
145
  // Check if staging prefix is the same as the live prefix
146
  if ($this->wpdb->prefix == $this->clone->prefix) {
147
+ $this->log("Fatal Error: Can not delete staging site. Prefix. '{$this->clone->prefix}' is used for the live site. Creating a new staging site will likely resolve this the next time. Stopping for security reasons. Contact support@wp-staging.com");
148
+ wp_die("Fatal Error: Can not delete staging site. Prefix. '{$this->clone->prefix}' is used for the live site. Creating a new staging site will likely resolve this the next time. Stopping for security reasons. Contact support@wp-staging.com");
149
  }
150
 
151
  // Else
152
+ return $this->clone->prefix;
153
  }
154
 
155
  /**
213
  return;
214
  }
215
 
216
+ // Generate JOB
217
+ $this->job = (object) array(
218
+ "current" => "tables",
219
+ "nextDirectoryToDelete" => $this->clone->path,
220
+ "name" => $this->clone->name
221
+ );
 
 
 
 
 
 
 
 
 
 
 
222
 
223
  $this->cache->save("delete_job_{$this->clone->name}", $this->job);
224
  }
261
  return;
262
  }
263
 
264
+ //$wpdb = WPStaging::getInstance()->get("wpdb");
265
 
266
  foreach ($this->getTablesToRemove() as $table) {
267
  // PROTECTION: Never delete any table that beginns with wp prefix of live site
268
  if ($this->startsWith($table, $this->wpdb->prefix)) {
269
+ $this->log("Fatal Error: Trying to delete table {$table} of main WP installation!", Logger::TYPE_CRITICAL);
270
  return false;
271
  } else {
272
  $this->wpdb->query("DROP TABLE {$table}");
295
  * @throws InvalidArgumentException
296
  */
297
  public function deleteDirectory() {
298
+ if ($this->isFatalError()) {
299
+ $this->returnException('Can not delete directory: ' . $this->clone->path . '. This seems to be the root directory. Please contact support@wp-staging.com');
300
+ throw new \Exception('Can not delete directory: ' . $this->clone->path . ' This seems to be the root directory. Please contact support@wp-staging.com');
301
+ }
302
  // Finished or path does not exist
303
+ if (
304
+ empty($this->clone->path) ||
305
+ $this->clone->path == get_home_path() ||
306
+ !is_dir($this->clone->path)) {
307
+
308
  $this->job->current = "finish";
309
  $this->updateJob();
310
  return $this->returnFinish();
313
  $this->log("Delete staging site: " . $this->clone->path, Logger::TYPE_INFO);
314
 
315
  // Just to make sure the root dir is never deleted!
316
+ if ($this->clone->path == get_home_path()) {
317
  $this->log("Fatal Error 8: Trying to delete root of WP installation!", Logger::TYPE_CRITICAL);
318
  $this->returnException('Fatal Error 8: Trying to delete root of WP installation!');
319
  }
327
  $di = new \RecursiveDirectoryIterator($this->clone->path, \FilesystemIterator::SKIP_DOTS);
328
  $ri = new \RecursiveIteratorIterator($di, \RecursiveIteratorIterator::CHILD_FIRST);
329
  foreach ($ri as $file) {
330
+ //$file->isDir() ? @rmdir($file) : unlink($file);
331
+ $this->deleteFile($file);
332
  if ($this->isOverThreshold()) {
333
  //$this->returnException('Maximum PHP execution time exceeded. Run again and repeat the deletion process until it is sucessfully finished.');
334
  return;
341
  return;
342
  }
343
 
344
+ /**
345
+ * Delete file
346
+ * @param object iterator $file
347
+ */
348
+ private function deleteFile($file) {
349
+ if ($file->isDir()) {
350
+ if (!@rmdir($file)) {
351
+ $this->returnException('Permission Error: Can not delete folder ' . $file);
352
+ }
353
+ } else {
354
+ if (!unlink($file)) {
355
+ $this->returnException('Permission Error: Can not delete file ' . $file);
356
+ }
357
+ }
358
+ }
359
 
360
  /**
361
  * @return bool
372
  * @param string $path
373
  * @return mixed
374
  */
375
+ // private function processDirectory($path) {
376
+ // // We hit the limit, stop
377
+ // if ($this->shouldStop($path)) {
378
+ // $this->updateJob();
379
+ // return false;
380
+ // }
381
+ //
382
+ // $this->totalRecursion++;
383
+ //
384
+ // $contents = new \DirectoryIterator($path);
385
+ //
386
+ // foreach ($contents as $content => $value) {
387
+ //
388
+ // // Skip dots
389
+ // if ($content->isDot())
390
+ //
391
+ //
392
+ // // Get into the directory
393
+ // if (!$content->isLink() && $content->isDir()) {
394
+ // return $this->processDirectory($content->getRealPath());
395
+ // }
396
+ //
397
+ // // Delete file
398
+ // if ($content->isFile()) {
399
+ // @unlink($content->getRealPath());
400
+ // }
401
+ // }
402
+ //
403
+ // // Delete directory
404
+ // $this->job->lastDeletedDirectory = realpath($path . "/..");
405
+ // @rmdir($path);
406
+ // $this->updateJob();
407
+ // $this->processDirectory($this->job->nextDirectoryToDelete);
408
+ // }
409
 
410
  /**
411
  * @param string $path
412
  * @return bool
413
  */
414
+ // private function shouldStop($path) {
415
+ // // Just to make sure the root dir is never deleted!
416
+ // if ($path === get_home_path()) {
417
+ // $this->log("Fatal Error: Trying to delete root of WP installation!", Logger::TYPE_CRITICAL);
418
+ // return true;
419
+ // }
420
+ //
421
+ // // Check if threshold is reached and is valid dir
422
+ // return (
423
+ // $this->isOverThreshold() ||
424
+ // !is_dir($path) ||
425
+ // $this->isDirectoryDeletingFinished()
426
+ // );
427
+ // }
428
+
429
+ /**
430
+ *
431
+ * @return boolean
432
+ */
433
+ public function isFatalError() {
434
+ if (rtrim($this->clone->path, "/") == rtrim(get_home_path(), "/")) {
435
  return true;
436
  }
437
+ return false;
 
 
 
 
 
 
438
  }
439
 
440
  /**
465
  wp_die(json_encode($response));
466
  }
467
 
468
+ /**
469
+ * Get json response
470
+ * return json
471
+ */
472
+ // private function returnException($message = ''){
473
+ // wp_die( json_encode(array(
474
+ // 'job' => 'delete',
475
+ // 'status' => false,
476
+ // 'message' => $message,
477
+ // 'error' => true
478
+ // )));
479
+ // }
480
  /**
481
  * Get json response
482
  * return json
apps/Backend/Modules/Jobs/Directories.php CHANGED
@@ -1,393 +1,444 @@
1
- <?php
2
-
3
- namespace WPStaging\Backend\Modules\Jobs;
4
-
5
- // No Direct Access
6
- if( !defined( "WPINC" ) ) {
7
- die;
8
- }
9
-
10
- use WPStaging\WPStaging;
11
- use WPStaging\Utils\Logger;
12
-
13
-
14
- /**
15
- * Class Files
16
- * @package WPStaging\Backend\Modules\Directories
17
- */
18
- class Directories extends JobExecutable {
19
-
20
- /**
21
- * @var array
22
- */
23
- private $files = array();
24
-
25
- /**
26
- * @var int
27
- */
28
- private $total = 0;
29
-
30
- /**
31
- * Initialize
32
- */
33
- public function initialize() {
34
- $this->total = count( $this->options->directoriesToCopy );
35
- $this->getFiles();
36
- }
37
-
38
- /**
39
- * Calculate Total Steps in This Job and Assign It to $this->options->totalSteps
40
- * @return void
41
- */
42
- protected function calculateTotalSteps() {
43
- $this->options->totalSteps = $this->total;
44
- }
45
-
46
- /**
47
- * Get Root Files
48
- */
49
- protected function getRootFiles() {
50
- if( 1 < $this->options->totalFiles ) {
51
- return;
52
- }
53
-
54
- $this->getFilesFromDirectory( ABSPATH );
55
- }
56
-
57
- /**
58
- * Start Module
59
- * @return object
60
- */
61
- public function start() {
62
- // Root files
63
- $this->getRootFiles();
64
-
65
- // Execute steps
66
- $this->run();
67
-
68
- // Save option, progress
69
- $this->saveProgress();
70
-
71
- return ( object ) $this->response;
72
- }
73
-
74
- /**
75
- * Execute the Current Step
76
- * Returns false when over threshold limits are hit or when the job is done, true otherwise
77
- * @return bool
78
- */
79
- protected function execute() {
80
- // No job left to execute
81
- if( $this->isFinished() ) {
82
- $this->prepareResponse( true, false );
83
- return false;
84
- }
85
-
86
- // Get current directory
87
- $directory = $this->options->directoriesToCopy[$this->options->currentStep];
88
-
89
- // Get files recursively
90
- if( !$this->getFilesFromSubDirectories( $directory ) ) {
91
- $this->prepareResponse( false, false );
92
- return false;
93
- }
94
-
95
- // Add directory to scanned directories listing
96
- $this->options->scannedDirectories[] = $directory;
97
-
98
- // Prepare response
99
- $this->prepareResponse();
100
-
101
- // Not finished
102
- return true;
103
- }
104
-
105
- /**
106
- * Checks Whether There is Any Job to Execute or Not
107
- * @return bool
108
- */
109
- private function isFinished() {
110
- return (
111
- $this->options->currentStep > $this->total ||
112
- empty( $this->options->directoriesToCopy ) ||
113
- !isset( $this->options->directoriesToCopy[$this->options->currentStep] )
114
- );
115
- }
116
-
117
- /**
118
- * @param $path
119
- * @return bool
120
- */
121
- protected function getFilesFromSubDirectories( $path ) {
122
- $this->totalRecursion++;
123
-
124
- if( $this->isOverThreshold() ) {
125
- //$this->saveProgress();
126
- return false;
127
- }
128
-
129
- $this->log( "Scanning {$path} for its sub-directories and files" );
130
-
131
- $directories = new \DirectoryIterator( $path );
132
-
133
- foreach ( $directories as $directory ) {
134
-
135
-
136
- // Not a valid directory
137
- if( false === ($path = $this->getPath( $directory )) ) {
138
- continue;
139
- }
140
-
141
- // Excluded directory
142
- if( $this->isDirectoryExcluded( $directory->getRealPath() ) ) {
143
- continue;
144
- }
145
-
146
- // This directory is already scanned
147
- if( in_array( $path, $this->options->scannedDirectories ) ) {
148
- continue;
149
- }
150
-
151
- // Save all files
152
- $dir = ABSPATH . $path . DIRECTORY_SEPARATOR;
153
- $this->getFilesFromDirectory( $dir );
154
-
155
- // Add scanned directory listing
156
- $this->options->scannedDirectories[] = $dir;
157
-
158
- if( $this->isOverThreshold() ) {
159
- //$this->saveProgress();
160
- return false;
161
- }
162
- }
163
-
164
- $this->saveOptions();
165
-
166
- // Not finished
167
- return true;
168
- }
169
-
170
- /**
171
- * Get files from directory
172
- * @param $directory
173
- * @return bool
174
- */
175
- protected function getFilesFromDirectory( $directory ) {
176
- $this->totalRecursion++;
177
-
178
- // Get only files
179
- $files = array_diff( scandir( $directory ), array('.', "..") );
180
-
181
- foreach ( $files as $file ) {
182
- $fullPath = $directory . $file;
183
-
184
- // Conditions:
185
- // - Must be valid file
186
- // - Is readable file
187
- // - Not collected already
188
- // - File not excluded by another rule or condition
189
-
190
- if( is_file( $fullPath ) && is_readable( $fullPath ) && !in_array( $fullPath, $this->files ) && !$this->isExcluded($file) ) {
191
- $this->options->totalFiles++;
192
- $this->files[] = $fullPath;
193
- continue;
194
- }
195
- // It's a valid file but not readable
196
- if( is_file( $fullPath ) && !is_readable( $fullPath ) ) {
197
- $this->debugLog('File {$fullPath} is not readable', Logger::TYPE_DEBUG );
198
- continue;
199
- }
200
-
201
- // Iterate and loop through if it's a directory and if it's not excluded
202
- if( is_dir( $fullPath ) && !in_array( $fullPath, $this->options->directoriesToCopy ) && !$this->isDirectoryExcluded( $fullPath ) ) {
203
- $this->options->directoriesToCopy[] = $fullPath;
204
-
205
- //return $this->getFilesFromSubDirectories( $fullPath );
206
- //continue;
207
- $this->getFilesFromSubDirectories( $fullPath );
208
- continue;
209
- }
210
-
211
- // if( !is_file( $fullPath ) || in_array( $fullPath, $this->files ) ) {
212
- // continue;
213
- // }
214
-
215
- // $this->options->totalFiles++;
216
- //
217
- // $this->files[] = $fullPath;
218
-
219
- /**
220
- * Test and measure if its faster to copy at the same time while the array with folders is generated
221
- */
222
- //$this->copy($fullPath);
223
-
224
- }
225
- }
226
-
227
- /**
228
- * Get Path from $directory
229
- * @param \SplFileInfo $directory
230
- * @return string|false
231
- */
232
- protected function getPath( $directory ) {
233
-
234
- /*
235
- * Do not follow root path like src/web/..
236
- * This must be done before \SplFileInfo->isDir() is used!
237
- * Prevents open base dir restriction fatal errors
238
- */
239
- if (strpos( $directory->getRealPath(), ABSPATH ) !== 0 ) {
240
- return false;
241
- }
242
-
243
- $path = str_replace( ABSPATH, null, $directory->getRealPath() );
244
-
245
- // Using strpos() for symbolic links as they could create nasty stuff in nix stuff for directory structures
246
- if( !$directory->isDir() || strlen( $path ) < 1 ) {
247
- return false;
248
- }
249
-
250
- return $path;
251
- }
252
-
253
- /**
254
- * Check if directory is excluded from copying
255
- * @param string $directory
256
- * @return bool
257
- */
258
- protected function isDirectoryExcluded( $directory ) {
259
- foreach ( $this->options->excludedDirectories as $excludedDirectory ) {
260
- if( strpos( $directory, $excludedDirectory ) === 0 && !$this->isExtraDirectory( $directory ) ) {
261
- return true;
262
- }
263
- }
264
-
265
- return false;
266
- }
267
-
268
- /**
269
- * Check if directory is an extra directory and should be copied
270
- * @param string $directory
271
- * @return boolean
272
- */
273
- protected function isExtraDirectory( $directory ) {
274
- foreach ( $this->options->extraDirectories as $extraDirectory ) {
275
- if( strpos( $directory, $extraDirectory ) === 0 ) {
276
- return true;
277
- }
278
- }
279
-
280
- return false;
281
- }
282
-
283
- /**
284
- * Save files
285
- * @return bool
286
- */
287
- protected function saveProgress() {
288
- $this->saveOptions();
289
-
290
- $fileName = $this->cache->getCacheDir() . "files_to_copy." . $this->cache->getCacheExtension();
291
- $files = implode( PHP_EOL, $this->files );
292
-
293
- if( strlen( $files ) > 0 ) {
294
- //$files .= PHP_EOL;
295
- }
296
-
297
- return (false !== @file_put_contents( $fileName, $files ));
298
- }
299
-
300
- /**
301
- * Get files
302
- * @return void
303
- */
304
- protected function getFiles() {
305
- $fileName = $this->cache->getCacheDir() . "files_to_copy." . $this->cache->getCacheExtension();
306
-
307
- if( false === ($this->files = @file_get_contents( $fileName )) ) {
308
- $this->files = array();
309
- return;
310
- }
311
-
312
- $this->files = explode( PHP_EOL, $this->files );
313
- }
314
-
315
- /**
316
- * Copy File using PHP (Only for testing)
317
- * @param string $file
318
- * @param string $destination
319
- * @return bool
320
- *
321
- * @deprecated since version 2.0.2
322
- */
323
- protected function copy($file)
324
- {
325
-
326
- if( $this->isOverThreshold() ) {
327
- return false;
328
- }
329
-
330
- // Failed to get destination
331
- if (false === ($destination = $this->getDestination($file)))
332
- {
333
- //$this->log("Can't get the destination of {$file}");
334
- //return false;
335
- }
336
-
337
- // Attempt to copy
338
- if (!@copy($file, $destination))
339
- {
340
- //$this->log("Failed to copy file to destination: {$file} -> {$destination}", Logger::TYPE_ERROR);
341
- //return false;
342
- }
343
-
344
- //$this->log("Copy {$file} -> {$destination}", Logger::TYPE_INFO);
345
-
346
- // Not finished
347
- return true;
348
- }
349
-
350
-
351
- /**
352
- * (only for testing)
353
- * Gets destination file and checks if the directory exists, if it does not attempts to create it.
354
- * If creating destination directory fails, it returns false, gives destination full path otherwise
355
- * @param string $file
356
- * @return bool|string
357
- *
358
- * @deprecated
359
- */
360
- private function getDestination($file)
361
- {
362
- $destination = ABSPATH . $this->options->cloneDirectoryName . DIRECTORY_SEPARATOR;
363
- $relativePath = str_replace(ABSPATH, null, $file);
364
- $destinationPath = $destination . $relativePath;
365
- $destinationDirectory = dirname($destinationPath);
366
-
367
- if (!is_dir($destinationDirectory) && !@mkdir($destinationDirectory, 0775, true))
368
- {
369
- $this->log("Destination directory doesn't exist; {$destinationDirectory}", Logger::TYPE_ERROR);
370
- //return false;
371
- }
372
-
373
- return $destinationPath;
374
- }
375
-
376
- /**
377
- * Check if filename is excluded for cloning process
378
- *
379
- * @param string $file filename including ending
380
- * @return boolean
381
- */
382
- private function isExcluded( $file ) {
383
- $excluded = false;
384
- foreach ( $this->options->excludedFiles as $excludedFile ) {
385
- if (stripos(strrev($file), strrev($excludedFile)) === 0) {
386
- $excluded = true;
387
- break;
388
- }
389
- }
390
- return $excluded;
391
- }
392
-
393
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WPStaging\Backend\Modules\Jobs;
4
+
5
+ // No Direct Access
6
+ if (!defined("WPINC")) {
7
+ die;
8
+ }
9
+
10
+ use WPStaging\WPStaging;
11
+ use WPStaging\Utils\Logger;
12
+ use WPStaging\Iterators\RecursiveDirectoryIterator;
13
+ use WPStaging\Iterators\RecursiveFilterNewLine;
14
+ use WPStaging\Iterators\RecursiveFilterExclude;
15
+
16
+ /**
17
+ * Class Files
18
+ * @package WPStaging\Backend\Modules\Directories
19
+ */
20
+ class Directories extends JobExecutable {
21
+
22
+ /**
23
+ * @var array
24
+ */
25
+ private $files = array();
26
+
27
+ /**
28
+ * Total steps to do
29
+ * @var int
30
+ */
31
+ private $total = 4;
32
+ private $fileHandle;
33
+
34
+ private $filename;
35
+
36
+ /**
37
+ * Initialize
38
+ */
39
+ public function initialize() {
40
+ $this->filename = $this->cache->getCacheDir() . "files_to_copy." . $this->cache->getCacheExtension();
41
+ }
42
+
43
+ /**
44
+ * Calculate Total Steps in This Job and Assign It to $this->options->totalSteps
45
+ * @return void
46
+ */
47
+ protected function calculateTotalSteps() {
48
+ $this->options->totalSteps = $this->total;
49
+ }
50
+
51
+ /**
52
+ * Start Module
53
+ * @return object
54
+ */
55
+ public function start() {
56
+
57
+ // Execute steps
58
+ $this->run();
59
+
60
+ // Save option, progress
61
+ $this->saveProgress();
62
+
63
+ return (object) $this->response;
64
+ }
65
+
66
+ /**
67
+ * Step 1
68
+ * Get WP Root files
69
+ */
70
+ private function getWpRootFiles() {
71
+
72
+ // open file handle
73
+ $files = $this->open($this->filename, 'a');
74
+
75
+
76
+ try {
77
+
78
+ // Iterate over content directory
79
+ $iterator = new \DirectoryIterator(ABSPATH);
80
+
81
+ // Write path line
82
+ foreach ($iterator as $item) {
83
+ if ($item->isFile()) {
84
+ if ($this->write($files, $iterator->getFilename() . PHP_EOL)) {
85
+ $this->options->totalFiles++;
86
+
87
+ // Add current file size
88
+ $this->options->totalFileSize += $iterator->getSize();
89
+ }
90
+ }
91
+ }
92
+ } catch (\Exception $e) {
93
+ throw new \Exception('Out of disk space.');
94
+ } catch (\Exception $e) {
95
+ // Skip bad file permissions
96
+ }
97
+
98
+ $this->close($files);
99
+ return true;
100
+
101
+ }
102
+
103
+ /**
104
+ * Step 2
105
+ * Get WP Content Files
106
+ */
107
+ public function getWpContentFiles() {
108
+
109
+ // if (1 < $this->options->totalFiles) {
110
+ // return;
111
+ // }
112
+
113
+ // open file handle
114
+ $files = $this->open($this->filename, 'a');
115
+
116
+ $excludeWpContent = array(
117
+ 'HUGE-FOLDER',
118
+ 'cache',
119
+ 'wps-hide-login',
120
+ 'node_modules',
121
+ 'nbproject'
122
+ );
123
+
124
+ try {
125
+
126
+ // Iterate over content directory
127
+ $iterator = new \WPStaging\Iterators\RecursiveDirectoryIterator(WP_CONTENT_DIR);
128
+
129
+ // Exclude new line file names
130
+ $iterator = new \WPStaging\Iterators\RecursiveFilterNewLine($iterator);
131
+
132
+ // Exclude uploads, plugins or themes
133
+ $iterator = new \WPStaging\Iterators\RecursiveFilterExclude($iterator, apply_filters('wpstg_exclude_content', $excludeWpContent));
134
+ // Recursively iterate over content directory
135
+ $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::LEAVES_ONLY, \RecursiveIteratorIterator::CATCH_GET_CHILD);
136
+
137
+ // Write path line
138
+ foreach ($iterator as $item) {
139
+ if ($item->isFile()) {
140
+ if ($this->write($files, 'wp-content' . DIRECTORY_SEPARATOR . $iterator->getSubPathName() . PHP_EOL)) {
141
+ $this->options->totalFiles++;
142
+
143
+ // Add current file size
144
+ $this->options->totalFileSize += $iterator->getSize();
145
+ }
146
+ }
147
+ }
148
+ } catch (\Exception $e) {
149
+ throw new \Exception('Out of disk space.');
150
+ } catch (\Exception $e) {
151
+ // Skip bad file permissions
152
+ }
153
+
154
+ // close the file handler
155
+ $this->close($files);
156
+ return true;
157
+ }
158
+
159
+ /**
160
+ * Step 3
161
+ * @return boolean
162
+ * @throws \Exception
163
+ */
164
+ public function getWpIncludesFiles() {
165
+
166
+ // open file handle and attach data to end of file
167
+ $files = $this->open($this->filename, 'a');
168
+
169
+ try {
170
+
171
+ // Iterate over wp-admin directory
172
+ $iterator = new \WPStaging\Iterators\RecursiveDirectoryIterator(ABSPATH . 'wp-includes' . DIRECTORY_SEPARATOR);
173
+
174
+ // Exclude new line file names
175
+ $iterator = new \WPStaging\Iterators\RecursiveFilterNewLine($iterator);
176
+
177
+ // Exclude uploads, plugins or themes
178
+ //$iterator = new \WPStaging\Iterators\RecursiveFilterExclude($iterator, apply_filters('wpstg_exclude_content', $exclude_filters));
179
+ // Recursively iterate over wp-includes directory
180
+ $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::LEAVES_ONLY, \RecursiveIteratorIterator::CATCH_GET_CHILD);
181
+
182
+ // Write files
183
+ foreach ($iterator as $item) {
184
+ if ($item->isFile()) {
185
+ if ($this->write($files, 'wp-includes' . DIRECTORY_SEPARATOR . $iterator->getSubPathName() . PHP_EOL)) {
186
+ $this->options->totalFiles++;
187
+
188
+ // Add current file size
189
+ $this->options->totalFileSize += $iterator->getSize();
190
+ }
191
+ }
192
+ }
193
+ } catch (\Exception $e) {
194
+ throw new \Exception('Out of disk space.');
195
+ } catch (\Exception $e) {
196
+ // Skip bad file permissions
197
+ }
198
+
199
+ // close the file handler
200
+ $this->close($files);
201
+ return true;
202
+ }
203
+
204
+ /**
205
+ * Step 4
206
+ * @return boolean
207
+ * @throws \Exception
208
+ */
209
+ public function getWpAdminFiles() {
210
+
211
+ // open file handle and attach data to end of file
212
+ $files = $this->open($this->filename, 'a');
213
+
214
+ try {
215
+
216
+ // Iterate over wp-admin directory
217
+ $iterator = new \WPStaging\Iterators\RecursiveDirectoryIterator(ABSPATH . 'wp-admin' . DIRECTORY_SEPARATOR);
218
+
219
+ // Exclude new line file names
220
+ $iterator = new \WPStaging\Iterators\RecursiveFilterNewLine($iterator);
221
+
222
+ // Exclude uploads, plugins or themes
223
+ //$iterator = new \WPStaging\Iterators\RecursiveFilterExclude($iterator, apply_filters('wpstg_exclude_content', $exclude_filters));
224
+ // Recursively iterate over content directory
225
+ $iterator = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::LEAVES_ONLY, \RecursiveIteratorIterator::CATCH_GET_CHILD);
226
+
227
+ // Write path line
228
+ foreach ($iterator as $item) {
229
+ if ($item->isFile()) {
230
+ if ($this->write($files, 'wp-admin' . DIRECTORY_SEPARATOR . $iterator->getSubPathName() . PHP_EOL)) {
231
+ $this->options->totalFiles++;
232
+ // Add current file size
233
+ $this->options->totalFileSize += $iterator->getSize();
234
+ }
235
+ }
236
+ }
237
+ } catch (\Exception $e) {
238
+ throw new \Exception('Out of disk space.');
239
+ } catch (\Exception $e) {
240
+ // Skip bad file permissions
241
+ }
242
+
243
+ // close the file handler
244
+ $this->close($files);
245
+ return true;
246
+ }
247
+
248
+ /**
249
+ * Closes a file handle
250
+ *
251
+ * @param resource $handle File handle to close
252
+ * @return boolean
253
+ */
254
+ public function close($handle) {
255
+ return @fclose($handle);
256
+ }
257
+
258
+ /**
259
+ * Opens a file in specified mode
260
+ *
261
+ * @param string $file Path to the file to open
262
+ * @param string $mode Mode in which to open the file
263
+ * @return resource
264
+ * @throws Exception
265
+ */
266
+ public function open($file, $mode) {
267
+
268
+ $file_handle = @fopen($file, $mode);
269
+ if (false === $file_handle) {
270
+ throw new Exception(sprintf(__('Unable to open %s with mode %s', 'wpstg'), $file, $mode));
271
+ }
272
+
273
+ return $file_handle;
274
+ }
275
+
276
+ /**
277
+ * Write contents to a file
278
+ *
279
+ * @param resource $handle File handle to write to
280
+ * @param string $content Contents to write to the file
281
+ * @return integer
282
+ * @throws Exception
283
+ * @throws Exception
284
+ */
285
+ public function write($handle, $content) {
286
+ $write_result = @fwrite($handle, $content);
287
+ if (false === $write_result) {
288
+ if (( $meta = \stream_get_meta_data($handle))) {
289
+ throw new \Exception(sprintf(__('Unable to write to: %s', 'wpstg'), $meta['uri']));
290
+ }
291
+ } elseif (strlen($content) !== $write_result) {
292
+ throw new \Exception(__('Out of disk space.', 'wpstg'));
293
+ }
294
+
295
+ return $write_result;
296
+ }
297
+
298
+ /**
299
+ * Execute the Current Step
300
+ * Returns false when over threshold limits are hit or when the job is done, true otherwise
301
+ * @return bool
302
+ */
303
+ protected function execute() {
304
+
305
+ // No job left to execute
306
+ if ($this->isFinished()) {
307
+ $this->prepareResponse(true, false);
308
+ return false;
309
+ }
310
+
311
+
312
+ if ($this->options->currentStep == 0) {
313
+ $this->getWpRootFiles();
314
+ $this->prepareResponse(false, true);
315
+ return false;
316
+ }
317
+
318
+ if ($this->options->currentStep == 1) {
319
+ $this->getWpContentFiles();
320
+ $this->prepareResponse(false, true);
321
+ return false;
322
+ }
323
+
324
+ if ($this->options->currentStep == 2) {
325
+ $this->getWpIncludesFiles();
326
+ $this->prepareResponse(false, true);
327
+ return false;
328
+ }
329
+
330
+ if ($this->options->currentStep == 3) {
331
+ $this->getWpAdminFiles();
332
+ $this->prepareResponse(false, true);
333
+ return false;
334
+ }
335
+
336
+
337
+ // Prepare response
338
+ $this->prepareResponse(false, true);
339
+ // Not finished
340
+ return true;
341
+ }
342
+
343
+ /**
344
+ * Checks Whether There is Any Job to Execute or Not
345
+ * @return bool
346
+ */
347
+ protected function isFinished() {
348
+ return (
349
+ $this->options->currentStep > $this->total ||
350
+ $this->options->currentStep == 4
351
+ );
352
+ }
353
+
354
+ /**
355
+ * Get Path from $directory
356
+ * @param \SplFileInfo $directory
357
+ * @return string|false
358
+ */
359
+ // protected function getPath($directory) {
360
+ //
361
+ // /*
362
+ // * Do not follow root path like src/web/..
363
+ // * This must be done before \SplFileInfo->isDir() is used!
364
+ // * Prevents open base dir restriction fatal errors
365
+ // */
366
+ // if (strpos($directory->getRealPath(), ABSPATH) !== 0) {
367
+ // return false;
368
+ // }
369
+ //
370
+ // $path = str_replace(ABSPATH, null, $directory->getRealPath());
371
+ //
372
+ // // Using strpos() for symbolic links as they could create nasty stuff in nix stuff for directory structures
373
+ // if (!$directory->isDir() || strlen($path) < 1) {
374
+ // return false;
375
+ // }
376
+ //
377
+ // return $path;
378
+ // }
379
+
380
+ /**
381
+ * Check if directory is excluded from copying
382
+ * @param string $directory
383
+ * @return bool
384
+ */
385
+ // protected function isDirectoryExcluded($directory) {
386
+ // foreach ($this->options->excludedDirectories as $excludedDirectory) {
387
+ // if (strpos($directory, $excludedDirectory) === 0 && !$this->isExtraDirectory($directory)) {
388
+ // return true;
389
+ // }
390
+ // }
391
+ //
392
+ // return false;
393
+ // }
394
+
395
+ /**
396
+ * Check if directory is an extra directory and should be copied
397
+ * @param string $directory
398
+ * @return boolean
399
+ */
400
+ // protected function isExtraDirectory($directory) {
401
+ // foreach ($this->options->extraDirectories as $extraDirectory) {
402
+ // if (strpos($directory, $extraDirectory) === 0) {
403
+ // return true;
404
+ // }
405
+ // }
406
+ //
407
+ // return false;
408
+ // }
409
+
410
+ /**
411
+ * Save files
412
+ * @return bool
413
+ */
414
+ protected function saveProgress() {
415
+ return $this->saveOptions();
416
+
417
+ // $fileName = $this->cache->getCacheDir() . "files_to_copy." . $this->cache->getCacheExtension();
418
+ // $files = implode(PHP_EOL, $this->files);
419
+ //
420
+ // if (strlen($files) > 0) {
421
+ // //$files .= PHP_EOL;
422
+ // }
423
+ //
424
+ // return (false !== @file_put_contents($fileName, $files));
425
+ }
426
+
427
+ /**
428
+ * Get files
429
+ * @return void
430
+ */
431
+ protected function getFiles() {
432
+ $fileName = $this->cache->getCacheDir() . "files_to_copy." . $this->cache->getCacheExtension();
433
+
434
+ if (false === ($this->files = @file_get_contents($fileName))) {
435
+ $this->files = array();
436
+ return;
437
+ }
438
+
439
+ $this->files = explode(PHP_EOL, $this->files);
440
+ }
441
+
442
+
443
+
444
+ }
apps/Backend/Modules/Jobs/Files.php CHANGED
@@ -23,9 +23,8 @@ class Files extends JobExecutable {
23
  /**
24
  * @var int
25
  */
26
- //private $maxFilesPerRun = 500;
27
  private $maxFilesPerRun;
28
-
29
  /**
30
  * File Object
31
  */
@@ -40,8 +39,7 @@ class Files extends JobExecutable {
40
  * Initialization
41
  */
42
  public function initialize() {
43
- //$this->getVerifyFiles();
44
-
45
  $this->destination = ABSPATH . $this->options->cloneDirectoryName . DIRECTORY_SEPARATOR;
46
 
47
  $filePath = $this->cache->getCacheDir() . "files_to_copy." . $this->cache->getCacheExtension();
@@ -57,8 +55,6 @@ class Files extends JobExecutable {
57
 
58
  $this->settings->batchSize = $this->settings->batchSize * 1000000;
59
  $this->maxFilesPerRun = $this->settings->fileLimit;
60
- //$this->maxFilesPerRun = 1;
61
- //$this->options->copiedFiles = 0;
62
  }
63
 
64
  /**
@@ -67,7 +63,6 @@ class Files extends JobExecutable {
67
  */
68
  protected function calculateTotalSteps() {
69
  $this->options->totalSteps = ceil($this->options->totalFiles / $this->maxFilesPerRun);
70
- //$this->options->totalSteps = $this->options->totalFiles;
71
  }
72
 
73
  /**
@@ -112,22 +107,15 @@ class Files extends JobExecutable {
112
  // Go to last copied line and than to next one
113
  //if ($this->options->copiedFiles != 0) {
114
  if (isset($this->options->copiedFiles) && $this->options->copiedFiles != 0) {
115
- $this->file->seek($this->options->copiedFiles-1);
116
  }
117
 
118
  $this->file->setFlags(\SplFileObject::SKIP_EMPTY | \SplFileObject::READ_AHEAD);
119
 
120
- // End of file
121
- // if ($this->file->eof())
122
- // {
123
- // // Increment copied files when end of file is reached
124
- // $this->options->copiedFiles++;
125
- // return;
126
- // }
127
  // Loop x files at a time
128
  for ($i = 0; $i < $this->maxFilesPerRun; $i++) {
129
-
130
-
131
  // Increment copied files
132
  // Do this anytime to make sure to not stuck in the same step / files
133
  $this->options->copiedFiles++;
@@ -136,19 +124,16 @@ class Files extends JobExecutable {
136
  if ($this->file->eof()) {
137
  break;
138
  }
139
-
140
 
141
  $file = $this->file->fgets();
142
  $this->debugLog('copy file ' . $file, Logger::TYPE_DEBUG);
143
  $this->copyFile($file);
144
- //$this->verifyFiles[] = $file;
145
-
146
  }
147
 
148
  //$totalFiles = $this->maxFilesPerRun + $this->options->copiedFiles;
149
  $totalFiles = $this->options->copiedFiles;
150
  $this->log("Total {$totalFiles} files processed");
151
- //$this->saveCopiedFiles();
152
 
153
  return true;
154
  }
@@ -169,7 +154,30 @@ class Files extends JobExecutable {
169
  * @return bool
170
  */
171
  private function copyFile($file) {
172
- $file = trim($file);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
173
 
174
  // Invalid file, skipping it as if succeeded
175
  if (!is_file($file) || !is_readable($file)) {
@@ -183,8 +191,22 @@ class Files extends JobExecutable {
183
  return false;
184
  }
185
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
  // Good old PHP
187
- return $this->copy($file, $destination);
188
  }
189
 
190
  /**
@@ -212,24 +234,25 @@ class Files extends JobExecutable {
212
  * @param string $destination
213
  * @return bool
214
  */
215
- private function copy($file, $destination) {
216
- // Get file size
217
- $fileSize = filesize($file);
218
-
219
- // File is over batch size
220
- if ($fileSize >= $this->settings->batchSize) {
221
- $this->log("Trying to copy big file {$file} -> {$destination}", Logger::TYPE_INFO);
222
- return $this->copyBig($file, $destination, $this->settings->batchSize);
223
- }
224
-
225
- // Attempt to copy
226
- if (!@copy($file, $destination)) {
227
- $this->log("Failed to copy file to destination: {$file} -> {$destination}", Logger::TYPE_ERROR);
228
- return false;
229
- }
230
-
231
- return true;
232
- }
 
233
 
234
  /**
235
  * Copy bigger files than $this->settings->batchSize
@@ -291,31 +314,52 @@ class Files extends JobExecutable {
291
  fclose($dest);
292
  return true;
293
  }
294
-
295
  /**
296
- * Save verified Files
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
297
  * @return bool
298
  */
299
- // private function saveCopiedFiles(){
300
- // $fileName = $this->cache->getCacheDir() . "files_to_verify." . $this->cache->getCacheExtension();
301
- // $files = implode( PHP_EOL, $this->verifyFiles );
302
- //
303
- // return (false !== @file_put_contents( $fileName, $files ));
304
- // }
305
-
 
 
 
306
  /**
307
- * Get files
308
- * @return void
 
309
  */
310
- // protected function getVerifyFiles() {
311
- // $fileName = $this->cache->getCacheDir() . "files_to_verify." . $this->cache->getCacheExtension();
312
- //
313
- // if( false === ($this->verifyFiles = @file_get_contents( $fileName )) ) {
314
- // $this->verifyFiles = array();
315
- // return;
316
- // }
317
- //
318
- // $this->verifyFiles = explode( PHP_EOL, $this->verifyFiles );
319
- // }
320
 
321
  }
23
  /**
24
  * @var int
25
  */
 
26
  private $maxFilesPerRun;
27
+
28
  /**
29
  * File Object
30
  */
39
  * Initialization
40
  */
41
  public function initialize() {
42
+
 
43
  $this->destination = ABSPATH . $this->options->cloneDirectoryName . DIRECTORY_SEPARATOR;
44
 
45
  $filePath = $this->cache->getCacheDir() . "files_to_copy." . $this->cache->getCacheExtension();
55
 
56
  $this->settings->batchSize = $this->settings->batchSize * 1000000;
57
  $this->maxFilesPerRun = $this->settings->fileLimit;
 
 
58
  }
59
 
60
  /**
63
  */
64
  protected function calculateTotalSteps() {
65
  $this->options->totalSteps = ceil($this->options->totalFiles / $this->maxFilesPerRun);
 
66
  }
67
 
68
  /**
107
  // Go to last copied line and than to next one
108
  //if ($this->options->copiedFiles != 0) {
109
  if (isset($this->options->copiedFiles) && $this->options->copiedFiles != 0) {
110
+ $this->file->seek($this->options->copiedFiles - 1);
111
  }
112
 
113
  $this->file->setFlags(\SplFileObject::SKIP_EMPTY | \SplFileObject::READ_AHEAD);
114
 
115
+
 
 
 
 
 
 
116
  // Loop x files at a time
117
  for ($i = 0; $i < $this->maxFilesPerRun; $i++) {
118
+
 
119
  // Increment copied files
120
  // Do this anytime to make sure to not stuck in the same step / files
121
  $this->options->copiedFiles++;
124
  if ($this->file->eof()) {
125
  break;
126
  }
127
+
128
 
129
  $file = $this->file->fgets();
130
  $this->debugLog('copy file ' . $file, Logger::TYPE_DEBUG);
131
  $this->copyFile($file);
 
 
132
  }
133
 
134
  //$totalFiles = $this->maxFilesPerRun + $this->options->copiedFiles;
135
  $totalFiles = $this->options->copiedFiles;
136
  $this->log("Total {$totalFiles} files processed");
 
137
 
138
  return true;
139
  }
154
  * @return bool
155
  */
156
  private function copyFile($file) {
157
+ $file = trim(ABSPATH . $file);
158
+
159
+ $directory = dirname($file);
160
+
161
+ // Get file size
162
+ $fileSize = filesize($file);
163
+
164
+ // Directory is excluded
165
+ if ($this->isDirectoryExcluded($directory)) {
166
+ $this->log("Skipping directory by rule: {$file}", Logger::TYPE_INFO);
167
+ return false;
168
+ }
169
+
170
+ // File is excluded
171
+ if ($this->isFileExcluded($file)) {
172
+ $this->log("Skipping file by rule: {$file}", Logger::TYPE_INFO);
173
+ return false;
174
+ }
175
+
176
+ // File is over maximum allowed file size (8MB)
177
+ if ($fileSize >= 8000000) {
178
+ $this->log("Skipping big file: {$file}", Logger::TYPE_INFO);
179
+ return false;
180
+ }
181
 
182
  // Invalid file, skipping it as if succeeded
183
  if (!is_file($file) || !is_readable($file)) {
191
  return false;
192
  }
193
 
194
+ // File is over batch size
195
+ if ($fileSize >= $this->settings->batchSize) {
196
+ $this->log("Trying to copy big file: {$file} -> {$destination}", Logger::TYPE_INFO);
197
+ return $this->copyBig($file, $destination, $this->settings->batchSize);
198
+ }
199
+
200
+ // Attempt to copy
201
+ if (!@copy($file, $destination)) {
202
+ $this->log("Failed to copy file to destination: {$file} -> {$destination}", Logger::TYPE_ERROR);
203
+ return false;
204
+ }
205
+
206
+ return true;
207
+
208
  // Good old PHP
209
+ //return $this->copy($file, $destination);
210
  }
211
 
212
  /**
234
  * @param string $destination
235
  * @return bool
236
  */
237
+ // private function copy($file, $destination) {
238
+ // // Get file size
239
+ // $fileSize = filesize($file);
240
+ //
241
+ //
242
+ // // File is over batch size
243
+ // if ($fileSize >= $this->settings->batchSize) {
244
+ // $this->log("Trying to copy big file: {$file} -> {$destination}", Logger::TYPE_INFO);
245
+ // return $this->copyBig($file, $destination, $this->settings->batchSize);
246
+ // }
247
+ //
248
+ // // Attempt to copy
249
+ // if (!@copy($file, $destination)) {
250
+ // $this->log("Failed to copy file to destination: {$file} -> {$destination}", Logger::TYPE_ERROR);
251
+ // return false;
252
+ // }
253
+ //
254
+ // return true;
255
+ // }
256
 
257
  /**
258
  * Copy bigger files than $this->settings->batchSize
314
  fclose($dest);
315
  return true;
316
  }
317
+
318
  /**
319
+ * Check if file is excluded from copying process
320
+ *
321
+ * @param string $file filename including ending
322
+ * @return boolean
323
+ */
324
+ private function isFileExcluded($file) {
325
+ $excluded = false;
326
+ foreach ($this->options->excludedFiles as $excludedFile) {
327
+ if (stripos(strrev($file), strrev($excludedFile)) === 0) {
328
+ $excluded = true;
329
+ break;
330
+ }
331
+ }
332
+ return $excluded;
333
+ }
334
+
335
+ /**
336
+ * Check if directory is excluded from copying
337
+ * @param string $directory
338
  * @return bool
339
  */
340
+ private function isDirectoryExcluded($directory) {
341
+ foreach ($this->options->excludedDirectories as $excludedDirectory) {
342
+ if (strpos($directory, $excludedDirectory) === 0 && !$this->isExtraDirectory($directory)) {
343
+ return true;
344
+ }
345
+ }
346
+
347
+ return false;
348
+ }
349
+
350
  /**
351
+ * Check if directory is an extra directory and should be copied
352
+ * @param string $directory
353
+ * @return boolean
354
  */
355
+ protected function isExtraDirectory($directory) {
356
+ foreach ($this->options->extraDirectories as $extraDirectory) {
357
+ if (strpos($directory, $extraDirectory) === 0) {
358
+ return true;
359
+ }
360
+ }
361
+
362
+ return false;
363
+ }
 
364
 
365
  }
apps/Backend/Modules/Jobs/Job.php CHANGED
@@ -380,19 +380,19 @@ abstract class Job implements JobInterface
380
  * @deprecated since version 2.0.0
381
 
382
  */
383
- protected function resetTime()
384
- {
385
- // Attempt to reset timeout
386
- if (!@set_time_limit($this->maxExecutionTime))
387
- {
388
- return false;
389
- }
390
-
391
- // Increase execution limit
392
- $this->executionLimit = $this->executionLimit * 2;
393
-
394
- return true;
395
- }
396
 
397
  /**
398
  * Reset time limit and memory
@@ -400,22 +400,22 @@ abstract class Job implements JobInterface
400
  *
401
  * @deprecated since version 2.0.0
402
  */
403
- protected function reset()
404
- {
405
- // Attempt to reset time
406
- if (!$this->resetTime())
407
- {
408
- return false;
409
- }
410
-
411
- // Attempt to reset memory
412
- if (!$this->resetMemory())
413
- {
414
- return false;
415
- }
416
-
417
- return true;
418
- }
419
 
420
  /**
421
  * Checks if calls are over recursion limit
@@ -475,7 +475,7 @@ abstract class Job implements JobInterface
475
  */
476
  protected function returnException($message = ''){
477
  wp_die( json_encode(array(
478
- 'job' => $this->options->currentJob,
479
  'status' => false,
480
  'message' => $message,
481
  'error' => true
380
  * @deprecated since version 2.0.0
381
 
382
  */
383
+ // protected function resetTime()
384
+ // {
385
+ // // Attempt to reset timeout
386
+ // if (!@set_time_limit($this->maxExecutionTime))
387
+ // {
388
+ // return false;
389
+ // }
390
+ //
391
+ // // Increase execution limit
392
+ // $this->executionLimit = $this->executionLimit * 2;
393
+ //
394
+ // return true;
395
+ // }
396
 
397
  /**
398
  * Reset time limit and memory
400
  *
401
  * @deprecated since version 2.0.0
402
  */
403
+ // protected function reset()
404
+ // {
405
+ // // Attempt to reset time
406
+ // if (!$this->resetTime())
407
+ // {
408
+ // return false;
409
+ // }
410
+ //
411
+ // // Attempt to reset memory
412
+ // if (!$this->resetMemory())
413
+ // {
414
+ // return false;
415
+ // }
416
+ //
417
+ // return true;
418
+ // }
419
 
420
  /**
421
  * Checks if calls are over recursion limit
475
  */
476
  protected function returnException($message = ''){
477
  wp_die( json_encode(array(
478
+ 'job' => isset($this->options->currentJob) ? $this->options->currentJob : '',
479
  'status' => false,
480
  'message' => $message,
481
  'error' => true
apps/Backend/Modules/Jobs/Scan.php CHANGED
@@ -69,8 +69,10 @@ class Scan extends Job
69
 
70
  // Files
71
  $this->options->totalFiles = 0;
 
72
  $this->options->copiedFiles = 0;
73
 
 
74
  // Directories
75
  $this->options->includedDirectories = array();
76
  $this->options->excludedDirectories = array();
69
 
70
  // Files
71
  $this->options->totalFiles = 0;
72
+ $this->options->totalFileSize = 0;
73
  $this->options->copiedFiles = 0;
74
 
75
+
76
  // Directories
77
  $this->options->includedDirectories = array();
78
  $this->options->excludedDirectories = array();
apps/Backend/public/css/wpstg-admin.css CHANGED
@@ -337,9 +337,10 @@ color:#777777;
337
 
338
  #wpstg-error-wrapper,
339
  #wpstg-error-details {
340
- display: none;
341
- margin-top: 10px;
342
  font-size: 13px;
 
343
  }
344
 
345
  #wpstg-show-error-details {
337
 
338
  #wpstg-error-wrapper,
339
  #wpstg-error-details {
340
+ display:none;
341
+ padding-top: 10px;
342
  font-size: 13px;
343
+ clear:both;
344
  }
345
 
346
  #wpstg-show-error-details {
apps/Core/Iterators/RecursiveDirectoryIterator.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WPStaging\Iterators;
4
+
5
+ // No Direct Access
6
+ if (!defined("WPINC")) {
7
+ die;
8
+ }
9
+
10
+ class RecursiveDirectoryIterator extends \RecursiveDirectoryIterator {
11
+
12
+ protected $exclude = array();
13
+
14
+ public function __construct( $path ) {
15
+ parent::__construct( $path );
16
+
17
+ // Skip current and parent directory
18
+ $this->skipdots();
19
+ }
20
+
21
+ public function rewind() {
22
+ parent::rewind();
23
+
24
+ // Skip current and parent directory
25
+ $this->skipdots();
26
+ }
27
+
28
+ public function next() {
29
+ parent::next();
30
+
31
+ // Skip current and parent directory
32
+ $this->skipdots();
33
+ }
34
+
35
+ /**
36
+ * Returns whether current entry is a directory and not '.' or '..'
37
+ *
38
+ * Explicitly set allow links flag, because RecursiveDirectoryIterator::FOLLOW_SYMLINKS
39
+ * is not supported by <= PHP 5.3.0
40
+ *
41
+ * @return bool
42
+ */
43
+ public function hasChildren( $allow_links = true ) {
44
+ return parent::hasChildren( $allow_links );
45
+ }
46
+
47
+ protected function skipdots() {
48
+ while ( $this->isDot() ) {
49
+ parent::next();
50
+ }
51
+ }
52
+ }
apps/Core/Iterators/RecursiveFilterExclude.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WPStaging\Iterators;
4
+
5
+ class RecursiveFilterExclude extends \RecursiveFilterIterator {
6
+
7
+ protected $exclude = array();
8
+
9
+ public function __construct( \RecursiveIterator $iterator, $exclude = array() ) {
10
+ parent::__construct( $iterator );
11
+
12
+ // Set exclude filter
13
+ $this->exclude = $exclude;
14
+ }
15
+
16
+ public function accept() {
17
+ return ! in_array( $this->getInnerIterator()->getSubPathname(), $this->exclude );
18
+ }
19
+
20
+ public function getChildren() {
21
+ return new self( $this->getInnerIterator()->getChildren(), $this->exclude );
22
+ }
23
+ }
apps/Core/Iterators/RecursiveFilterNewLine.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WPStaging\Iterators;
4
+
5
+ // No Direct Access
6
+ if (!defined("WPINC")) {
7
+ die;
8
+ }
9
+
10
+ /**
11
+ * Filter files which contain new line character in name
12
+ */
13
+
14
+ class RecursiveFilterNewLine extends \RecursiveFilterIterator {
15
+
16
+ public function accept() {
17
+ return strpos( $this->getInnerIterator()->getSubPathname(), "\n" ) === false &&
18
+ strpos( $this->getInnerIterator()->getSubPathname(), "\r" ) === false;
19
+ }
20
+ }
21
+
apps/Core/Utils/Cache.php CHANGED
@@ -1,197 +1,212 @@
1
- <?php
2
- namespace WPStaging\Utils;
3
-
4
- // No Direct Access
5
- if (!defined("WPINC"))
6
- {
7
- die;
8
- }
9
-
10
- use WPStaging\WPStaging;
11
-
12
- /**
13
- * Class Cache
14
- * @package WPStaging\Utils
15
- */
16
- class Cache
17
- {
18
- /**
19
- * Cache directory (full path)
20
- * @var string
21
- */
22
- private $cacheDir;
23
-
24
- /**
25
- * Cache file extension
26
- * @var string
27
- */
28
- private $cacheExtension = "cache";
29
-
30
- /**
31
- * Lifetime of cache files in seconds
32
- * @var int
33
- */
34
- private $lifetime = 2592000; // 30 days
35
-
36
- /**
37
- * Cache constructor.
38
- * @param null|int $lifetime
39
- * @param null|string $cacheDir
40
- * @param null|string $cacheExtension
41
- * @throws \Exception
42
- */
43
- public function __construct($lifetime = null, $cacheDir = null, $cacheExtension = null)
44
- {
45
- // Set lifetime
46
- $lifetime = (int) $lifetime;
47
- if ($lifetime > 0)
48
- {
49
- $this->lifetime = $lifetime;
50
- }
51
-
52
- // Set cache directory
53
- if (!empty($cacheDir) && is_dir($cacheDir))
54
- {
55
- $this->cacheDir = $cacheDir;
56
- }
57
- // Set default
58
- else
59
- {
60
-
61
- $this->cacheDir = \WPStaging\WPStaging::getContentDir();
62
- }
63
-
64
- // Set cache extension
65
- if (!empty($cacheExtension))
66
- {
67
- $this->cacheExtension = $cacheExtension;
68
- }
69
-
70
- // If cache directory doesn't exists, create it
71
- if (!is_dir($this->cacheDir) && !@mkdir($this->cacheDir, 0775, true))
72
- {
73
- throw new \Exception("Failed to create cache directory " . $this->cacheDir . '! Make sure folder permission is 755 and owner is correct. Should be www-data or similar.');
74
- }
75
- }
76
-
77
- /**
78
- * Get cache
79
- * @param string $cacheFileName
80
- * @param mixed $defaultValue
81
- * @param null|int $lifetime
82
- * @return mixed|null
83
- */
84
- public function get($cacheFileName, $defaultValue = null, $lifetime = null)
85
- {
86
- // Check if file is valid
87
- if (false === ($cacheFile = $this->isValid($cacheFileName, true, $lifetime)))
88
- {
89
- return $defaultValue;
90
- }
91
-
92
- return @unserialize(file_get_contents($cacheFile));
93
- }
94
-
95
- /**
96
- * Saves value to given cache file
97
- * @param string $cacheFileName
98
- * @param mixed $value
99
- * @return bool
100
- * @throws \Exception
101
- */
102
- public function save($cacheFileName, $value)
103
- {
104
- $cacheFile = $this->cacheDir . $cacheFileName . '.' . $this->cacheExtension;
105
-
106
- // Attempt to delete cache file if it exists
107
- if (is_file($cacheFile) && !@unlink($cacheFile))
108
- {
109
- throw new \Exception("Can't delete existing cache file");
110
- }
111
-
112
- // Save it to file
113
- return (file_put_contents($cacheFile, @serialize($value), LOCK_EX) !== false);
114
- //return (file_put_contents($cacheFile, @serialize($value)) !== false);
115
- }
116
-
117
- /**
118
- * Checks if file is valid or not
119
- * @param $cacheFileName
120
- * @param bool $deleteFileIfInvalid
121
- * @param null|int $lifetime
122
- * @return string|bool
123
- * @throws \Exception
124
- */
125
- public function isValid($cacheFileName, $deleteFileIfInvalid = false, $lifetime = null)
126
- {
127
- // Lifetime
128
- $lifetime = (int) $lifetime;
129
- if (-1 > $lifetime || 0 == $lifetime)
130
- {
131
- $lifetime = $this->lifetime;
132
- }
133
-
134
- // Get full path of the given cache file
135
- $cacheFile = $this->cacheDir . $cacheFileName . '.' . $this->cacheExtension;
136
-
137
- // File doesn't exist
138
- if (!is_file($cacheFile))
139
- {
140
- return false;
141
- }
142
-
143
- // As long as file exists, don't check lifetime
144
- if (-1 == $lifetime)
145
- {
146
- return $cacheFile;
147
- }
148
-
149
- // Time is up, file is invalid
150
- if (time() - filemtime($cacheFile) >= $lifetime)
151
- {
152
-
153
- // Attempt to delete the file
154
- if ($deleteFileIfInvalid === true && !@unlink($cacheFile))
155
- {
156
- throw new \Exception("Attempting to delete invalid cache file has failed!");
157
- }
158
-
159
- // No need to delete the file, return
160
- return false;
161
- }
162
-
163
- return $cacheFile;
164
- }
165
-
166
- /**
167
- * Delete a cache file
168
- * @param string $cacheFileName
169
- * @return bool
170
- * @throws \Exception
171
- */
172
- public function delete($cacheFileName)
173
- {
174
- if (false !== ($cacheFile = $this->isValid($cacheFileName, true)) && false === @unlink($cacheFile))
175
- {
176
- throw new \Exception("Couldn't delete cache: {$cacheFileName}. Full Path: {$cacheFile}");
177
- }
178
-
179
- return true;
180
- }
181
-
182
- /**
183
- * @return string
184
- */
185
- public function getCacheDir()
186
- {
187
- return $this->cacheDir;
188
- }
189
-
190
- /**
191
- * @return string
192
- */
193
- public function getCacheExtension()
194
- {
195
- return $this->cacheExtension;
196
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
197
  }
1
+ <?php
2
+ namespace WPStaging\Utils;
3
+
4
+ // No Direct Access
5
+ if (!defined("WPINC"))
6
+ {
7
+ die;
8
+ }
9
+
10
+ use WPStaging\WPStaging;
11
+ use WPStaging\Backend\Modules\Jobs;
12
+
13
+ /**
14
+ * Class Cache
15
+ * @package WPStaging\Utils
16
+ */
17
+ class Cache
18
+ {
19
+ /**
20
+ * Cache directory (full path)
21
+ * @var string
22
+ */
23
+ private $cacheDir;
24
+
25
+ /**
26
+ * Cache file extension
27
+ * @var string
28
+ */
29
+ private $cacheExtension = "cache";
30
+
31
+ /**
32
+ * Lifetime of cache files in seconds
33
+ * @var int
34
+ */
35
+ private $lifetime = 2592000; // 30 days
36
+
37
+ /**
38
+ * Cache constructor.
39
+ * @param null|int $lifetime
40
+ * @param null|string $cacheDir
41
+ * @param null|string $cacheExtension
42
+ * @throws \Exception
43
+ */
44
+ public function __construct($lifetime = null, $cacheDir = null, $cacheExtension = null)
45
+ {
46
+ // Set lifetime
47
+ $lifetime = (int) $lifetime;
48
+ if ($lifetime > 0)
49
+ {
50
+ $this->lifetime = $lifetime;
51
+ }
52
+
53
+ // Set cache directory
54
+ if (!empty($cacheDir) && is_dir($cacheDir))
55
+ {
56
+ $this->cacheDir = $cacheDir;
57
+ }
58
+ // Set default
59
+ else
60
+ {
61
+
62
+ $this->cacheDir = \WPStaging\WPStaging::getContentDir();
63
+ }
64
+
65
+ // Set cache extension
66
+ if (!empty($cacheExtension))
67
+ {
68
+ $this->cacheExtension = $cacheExtension;
69
+ }
70
+
71
+ // If cache directory doesn't exists, create it
72
+ if (!is_dir($this->cacheDir) && !@mkdir($this->cacheDir, 0775, true))
73
+ {
74
+ throw new \Exception("Failed to create cache directory " . $this->cacheDir . '! Make sure folder permission is 755 and owner is correct. Should be www-data or similar.');
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Get cache
80
+ * @param string $cacheFileName
81
+ * @param mixed $defaultValue
82
+ * @param null|int $lifetime
83
+ * @return mixed|null
84
+ */
85
+ public function get($cacheFileName, $defaultValue = null, $lifetime = null)
86
+ {
87
+ // Check if file is valid
88
+ if (false === ($cacheFile = $this->isValid($cacheFileName, true, $lifetime)))
89
+ {
90
+ return $defaultValue;
91
+ }
92
+
93
+ return @unserialize(file_get_contents($cacheFile));
94
+ }
95
+
96
+ /**
97
+ * Saves value to given cache file
98
+ * @param string $cacheFileName
99
+ * @param mixed $value
100
+ * @return bool
101
+ * @throws \Exception
102
+ */
103
+ public function save($cacheFileName, $value)
104
+ {
105
+ $cacheFile = $this->cacheDir . $cacheFileName . '.' . $this->cacheExtension;
106
+
107
+ // Attempt to delete cache file if it exists
108
+ if (is_file($cacheFile) && !@unlink($cacheFile))
109
+ {
110
+ $this->returnException("Can't delete existing cache file");
111
+ throw new \Exception("Can't delete existing cache file");
112
+ }
113
+
114
+ // Save it to file
115
+ return (file_put_contents($cacheFile, @serialize($value), LOCK_EX) !== false);
116
+ //return (file_put_contents($cacheFile, @serialize($value)) !== false);
117
+ }
118
+
119
+ /**
120
+ * Throw a errror message via json and stop further execution
121
+ * @param string $message
122
+ */
123
+ protected function returnException($message = ''){
124
+ wp_die( json_encode(array(
125
+ 'job' => isset($this->options->currentJob) ? $this->options->currentJob : '',
126
+ 'status' => false,
127
+ 'message' => $message,
128
+ 'error' => true
129
+ )));
130
+ }
131
+
132
+ /**
133
+ * Checks if file is valid or not
134
+ * @param $cacheFileName
135
+ * @param bool $deleteFileIfInvalid
136
+ * @param null|int $lifetime
137
+ * @return string|bool
138
+ * @throws \Exception
139
+ */
140
+ public function isValid($cacheFileName, $deleteFileIfInvalid = false, $lifetime = null)
141
+ {
142
+ // Lifetime
143
+ $lifetime = (int) $lifetime;
144
+ if (-1 > $lifetime || 0 == $lifetime)
145
+ {
146
+ $lifetime = $this->lifetime;
147
+ }
148
+
149
+ // Get full path of the given cache file
150
+ $cacheFile = $this->cacheDir . $cacheFileName . '.' . $this->cacheExtension;
151
+
152
+ // File doesn't exist
153
+ if (!is_file($cacheFile))
154
+ {
155
+ return false;
156
+ }
157
+
158
+ // As long as file exists, don't check lifetime
159
+ if (-1 == $lifetime)
160
+ {
161
+ return $cacheFile;
162
+ }
163
+
164
+ // Time is up, file is invalid
165
+ if (time() - filemtime($cacheFile) >= $lifetime)
166
+ {
167
+
168
+ // Attempt to delete the file
169
+ if ($deleteFileIfInvalid === true && !@unlink($cacheFile))
170
+ {
171
+ throw new \Exception("Attempting to delete invalid cache file has failed!");
172
+ }
173
+
174
+ // No need to delete the file, return
175
+ return false;
176
+ }
177
+
178
+ return $cacheFile;
179
+ }
180
+
181
+ /**
182
+ * Delete a cache file
183
+ * @param string $cacheFileName
184
+ * @return bool
185
+ * @throws \Exception
186
+ */
187
+ public function delete($cacheFileName)
188
+ {
189
+ if (false !== ($cacheFile = $this->isValid($cacheFileName, true)) && false === @unlink($cacheFile))
190
+ {
191
+ throw new \Exception("Couldn't delete cache: {$cacheFileName}. Full Path: {$cacheFile}");
192
+ }
193
+
194
+ return true;
195
+ }
196
+
197
+ /**
198
+ * @return string
199
+ */
200
+ public function getCacheDir()
201
+ {
202
+ return $this->cacheDir;
203
+ }
204
+
205
+ /**
206
+ * @return string
207
+ */
208
+ public function getCacheExtension()
209
+ {
210
+ return $this->cacheExtension;
211
+ }
212
  }
apps/Core/WPStaging.php CHANGED
@@ -29,7 +29,7 @@ final class WPStaging {
29
  /**
30
  * Plugin version
31
  */
32
- const VERSION = "2.1.5";
33
 
34
  /**
35
  * Plugin name
@@ -44,7 +44,7 @@ final class WPStaging {
44
  /**
45
  * Compatible WP Version
46
  */
47
- const WP_COMPATIBLE = "4.9.1";
48
 
49
  /**
50
  * Slug: Either wp-staging or wp-staging-pro
29
  /**
30
  * Plugin version
31
  */
32
+ const VERSION = "2.1.6";
33
 
34
  /**
35
  * Plugin name
44
  /**
45
  * Compatible WP Version
46
  */
47
+ const WP_COMPATIBLE = "4.9.0";
48
 
49
  /**
50
  * Slug: Either wp-staging or wp-staging-pro
package-lock.json ADDED
@@ -0,0 +1,3333 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "wp-staging",
3
+ "version": "2.1.6",
4
+ "lockfileVersion": 1,
5
+ "requires": true,
6
+ "dependencies": {
7
+ "abbrev": {
8
+ "version": "1.1.1",
9
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
10
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
11
+ "dev": true
12
+ },
13
+ "ajv": {
14
+ "version": "5.5.1",
15
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.1.tgz",
16
+ "integrity": "sha1-s4u4h22ehr7plJVqBOch6IskjrI=",
17
+ "dev": true,
18
+ "optional": true,
19
+ "requires": {
20
+ "co": "4.6.0",
21
+ "fast-deep-equal": "1.0.0",
22
+ "fast-json-stable-stringify": "2.0.0",
23
+ "json-schema-traverse": "0.3.1"
24
+ }
25
+ },
26
+ "amdefine": {
27
+ "version": "1.0.1",
28
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
29
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
30
+ "dev": true
31
+ },
32
+ "ansi-regex": {
33
+ "version": "0.2.1",
34
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz",
35
+ "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=",
36
+ "dev": true
37
+ },
38
+ "ansi-styles": {
39
+ "version": "1.1.0",
40
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz",
41
+ "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=",
42
+ "dev": true
43
+ },
44
+ "aproba": {
45
+ "version": "1.2.0",
46
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
47
+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
48
+ "dev": true
49
+ },
50
+ "archiver": {
51
+ "version": "1.3.0",
52
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz",
53
+ "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=",
54
+ "dev": true,
55
+ "requires": {
56
+ "archiver-utils": "1.3.0",
57
+ "async": "2.6.0",
58
+ "buffer-crc32": "0.2.13",
59
+ "glob": "7.1.2",
60
+ "lodash": "4.17.4",
61
+ "readable-stream": "2.3.3",
62
+ "tar-stream": "1.5.5",
63
+ "walkdir": "0.0.11",
64
+ "zip-stream": "1.2.0"
65
+ },
66
+ "dependencies": {
67
+ "async": {
68
+ "version": "2.6.0",
69
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
70
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
71
+ "dev": true,
72
+ "requires": {
73
+ "lodash": "4.17.4"
74
+ }
75
+ },
76
+ "glob": {
77
+ "version": "7.1.2",
78
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
79
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
80
+ "dev": true,
81
+ "requires": {
82
+ "fs.realpath": "1.0.0",
83
+ "inflight": "1.0.6",
84
+ "inherits": "2.0.3",
85
+ "minimatch": "3.0.4",
86
+ "once": "1.4.0",
87
+ "path-is-absolute": "1.0.1"
88
+ }
89
+ },
90
+ "lodash": {
91
+ "version": "4.17.4",
92
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
93
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
94
+ "dev": true
95
+ },
96
+ "minimatch": {
97
+ "version": "3.0.4",
98
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
99
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
100
+ "dev": true,
101
+ "requires": {
102
+ "brace-expansion": "1.1.8"
103
+ }
104
+ }
105
+ }
106
+ },
107
+ "archiver-utils": {
108
+ "version": "1.3.0",
109
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz",
110
+ "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=",
111
+ "dev": true,
112
+ "requires": {
113
+ "glob": "7.1.2",
114
+ "graceful-fs": "4.1.11",
115
+ "lazystream": "1.0.0",
116
+ "lodash": "4.17.4",
117
+ "normalize-path": "2.1.1",
118
+ "readable-stream": "2.3.3"
119
+ },
120
+ "dependencies": {
121
+ "glob": {
122
+ "version": "7.1.2",
123
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
124
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
125
+ "dev": true,
126
+ "requires": {
127
+ "fs.realpath": "1.0.0",
128
+ "inflight": "1.0.6",
129
+ "inherits": "2.0.3",
130
+ "minimatch": "3.0.4",
131
+ "once": "1.4.0",
132
+ "path-is-absolute": "1.0.1"
133
+ }
134
+ },
135
+ "graceful-fs": {
136
+ "version": "4.1.11",
137
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
138
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
139
+ "dev": true
140
+ },
141
+ "lodash": {
142
+ "version": "4.17.4",
143
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
144
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
145
+ "dev": true
146
+ },
147
+ "minimatch": {
148
+ "version": "3.0.4",
149
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
150
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
151
+ "dev": true,
152
+ "requires": {
153
+ "brace-expansion": "1.1.8"
154
+ }
155
+ }
156
+ }
157
+ },
158
+ "are-we-there-yet": {
159
+ "version": "1.1.4",
160
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
161
+ "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
162
+ "dev": true,
163
+ "requires": {
164
+ "delegates": "1.0.0",
165
+ "readable-stream": "2.3.3"
166
+ }
167
+ },
168
+ "argparse": {
169
+ "version": "1.0.9",
170
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
171
+ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
172
+ "dev": true,
173
+ "requires": {
174
+ "sprintf-js": "1.0.3"
175
+ }
176
+ },
177
+ "array-differ": {
178
+ "version": "1.0.0",
179
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
180
+ "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
181
+ "dev": true
182
+ },
183
+ "array-find-index": {
184
+ "version": "1.0.2",
185
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
186
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
187
+ "dev": true
188
+ },
189
+ "array-union": {
190
+ "version": "1.0.2",
191
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
192
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
193
+ "dev": true,
194
+ "requires": {
195
+ "array-uniq": "1.0.3"
196
+ }
197
+ },
198
+ "array-uniq": {
199
+ "version": "1.0.3",
200
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
201
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
202
+ "dev": true
203
+ },
204
+ "arrify": {
205
+ "version": "1.0.1",
206
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
207
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
208
+ "dev": true
209
+ },
210
+ "asn1": {
211
+ "version": "0.2.3",
212
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
213
+ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
214
+ "dev": true,
215
+ "optional": true
216
+ },
217
+ "assert-plus": {
218
+ "version": "1.0.0",
219
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
220
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
221
+ "dev": true
222
+ },
223
+ "async": {
224
+ "version": "1.5.2",
225
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
226
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
227
+ "dev": true
228
+ },
229
+ "asynckit": {
230
+ "version": "0.4.0",
231
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
232
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
233
+ "dev": true,
234
+ "optional": true
235
+ },
236
+ "aws-sign2": {
237
+ "version": "0.7.0",
238
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
239
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
240
+ "dev": true,
241
+ "optional": true
242
+ },
243
+ "aws4": {
244
+ "version": "1.6.0",
245
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
246
+ "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
247
+ "dev": true,
248
+ "optional": true
249
+ },
250
+ "balanced-match": {
251
+ "version": "1.0.0",
252
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
253
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
254
+ "dev": true
255
+ },
256
+ "bcrypt-pbkdf": {
257
+ "version": "1.0.1",
258
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
259
+ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
260
+ "dev": true,
261
+ "optional": true,
262
+ "requires": {
263
+ "tweetnacl": "0.14.5"
264
+ }
265
+ },
266
+ "bl": {
267
+ "version": "1.2.1",
268
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz",
269
+ "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=",
270
+ "dev": true,
271
+ "requires": {
272
+ "readable-stream": "2.3.3"
273
+ }
274
+ },
275
+ "block-stream": {
276
+ "version": "0.0.9",
277
+ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
278
+ "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
279
+ "dev": true,
280
+ "optional": true,
281
+ "requires": {
282
+ "inherits": "2.0.3"
283
+ }
284
+ },
285
+ "boom": {
286
+ "version": "4.3.1",
287
+ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
288
+ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
289
+ "dev": true,
290
+ "optional": true,
291
+ "requires": {
292
+ "hoek": "4.2.0"
293
+ }
294
+ },
295
+ "brace-expansion": {
296
+ "version": "1.1.8",
297
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
298
+ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
299
+ "dev": true,
300
+ "requires": {
301
+ "balanced-match": "1.0.0",
302
+ "concat-map": "0.0.1"
303
+ }
304
+ },
305
+ "browserify-zlib": {
306
+ "version": "0.1.4",
307
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
308
+ "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
309
+ "dev": true,
310
+ "requires": {
311
+ "pako": "0.2.9"
312
+ }
313
+ },
314
+ "buffer-crc32": {
315
+ "version": "0.2.13",
316
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
317
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
318
+ "dev": true
319
+ },
320
+ "builtin-modules": {
321
+ "version": "1.1.1",
322
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
323
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
324
+ "dev": true
325
+ },
326
+ "cache-swap": {
327
+ "version": "0.0.6",
328
+ "resolved": "https://registry.npmjs.org/cache-swap/-/cache-swap-0.0.6.tgz",
329
+ "integrity": "sha1-F834NebDAf0VgJCwPRzDb0Z7FpU=",
330
+ "dev": true,
331
+ "requires": {
332
+ "async": "0.2.10",
333
+ "lodash": "1.1.1",
334
+ "rimraf": "2.1.4"
335
+ },
336
+ "dependencies": {
337
+ "async": {
338
+ "version": "0.2.10",
339
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
340
+ "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
341
+ "dev": true
342
+ },
343
+ "lodash": {
344
+ "version": "1.1.1",
345
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.1.1.tgz",
346
+ "integrity": "sha1-QaKy6aAOZNbRmZ8UP/awdV9ruyQ=",
347
+ "dev": true
348
+ },
349
+ "rimraf": {
350
+ "version": "2.1.4",
351
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.1.4.tgz",
352
+ "integrity": "sha1-Wm62Lu2gaPUe3lDymz5c0i89m7I=",
353
+ "dev": true,
354
+ "requires": {
355
+ "graceful-fs": "1.2.3"
356
+ }
357
+ }
358
+ }
359
+ },
360
+ "camelcase": {
361
+ "version": "2.1.1",
362
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
363
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
364
+ "dev": true
365
+ },
366
+ "camelcase-keys": {
367
+ "version": "2.1.0",
368
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
369
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
370
+ "dev": true,
371
+ "requires": {
372
+ "camelcase": "2.1.1",
373
+ "map-obj": "1.0.1"
374
+ }
375
+ },
376
+ "caseless": {
377
+ "version": "0.12.0",
378
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
379
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
380
+ "dev": true,
381
+ "optional": true
382
+ },
383
+ "chalk": {
384
+ "version": "0.5.1",
385
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz",
386
+ "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=",
387
+ "dev": true,
388
+ "requires": {
389
+ "ansi-styles": "1.1.0",
390
+ "escape-string-regexp": "1.0.5",
391
+ "has-ansi": "0.1.0",
392
+ "strip-ansi": "0.3.0",
393
+ "supports-color": "0.2.0"
394
+ }
395
+ },
396
+ "chownr": {
397
+ "version": "1.0.1",
398
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz",
399
+ "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=",
400
+ "dev": true,
401
+ "optional": true
402
+ },
403
+ "clean-css": {
404
+ "version": "3.4.28",
405
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz",
406
+ "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=",
407
+ "dev": true,
408
+ "requires": {
409
+ "commander": "2.8.1",
410
+ "source-map": "0.4.4"
411
+ }
412
+ },
413
+ "cli": {
414
+ "version": "0.4.5",
415
+ "resolved": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz",
416
+ "integrity": "sha1-ePlIXNFhtWbppsctcXDEJw6B22E=",
417
+ "dev": true,
418
+ "requires": {
419
+ "glob": "3.1.21"
420
+ }
421
+ },
422
+ "co": {
423
+ "version": "4.6.0",
424
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
425
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
426
+ "dev": true,
427
+ "optional": true
428
+ },
429
+ "code-point-at": {
430
+ "version": "1.1.0",
431
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
432
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
433
+ "dev": true
434
+ },
435
+ "coffee-script": {
436
+ "version": "1.10.0",
437
+ "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz",
438
+ "integrity": "sha1-EpOLz5vhlI+gBvkuDEyegXBRCMA=",
439
+ "dev": true
440
+ },
441
+ "colors": {
442
+ "version": "1.1.2",
443
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
444
+ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
445
+ "dev": true
446
+ },
447
+ "combined-stream": {
448
+ "version": "1.0.5",
449
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
450
+ "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
451
+ "dev": true,
452
+ "requires": {
453
+ "delayed-stream": "1.0.0"
454
+ }
455
+ },
456
+ "commander": {
457
+ "version": "2.8.1",
458
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
459
+ "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
460
+ "dev": true,
461
+ "requires": {
462
+ "graceful-readlink": "1.0.1"
463
+ }
464
+ },
465
+ "compress-commons": {
466
+ "version": "1.2.2",
467
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz",
468
+ "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=",
469
+ "dev": true,
470
+ "requires": {
471
+ "buffer-crc32": "0.2.13",
472
+ "crc32-stream": "2.0.0",
473
+ "normalize-path": "2.1.1",
474
+ "readable-stream": "2.3.3"
475
+ }
476
+ },
477
+ "concat-map": {
478
+ "version": "0.0.1",
479
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
480
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
481
+ "dev": true
482
+ },
483
+ "concat-stream": {
484
+ "version": "1.6.0",
485
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
486
+ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
487
+ "dev": true,
488
+ "requires": {
489
+ "inherits": "2.0.3",
490
+ "readable-stream": "2.3.3",
491
+ "typedarray": "0.0.6"
492
+ },
493
+ "dependencies": {
494
+ "isarray": {
495
+ "version": "1.0.0",
496
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
497
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
498
+ "dev": true
499
+ },
500
+ "readable-stream": {
501
+ "version": "2.3.3",
502
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
503
+ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
504
+ "dev": true,
505
+ "requires": {
506
+ "core-util-is": "1.0.2",
507
+ "inherits": "2.0.3",
508
+ "isarray": "1.0.0",
509
+ "process-nextick-args": "1.0.7",
510
+ "safe-buffer": "5.1.1",
511
+ "string_decoder": "1.0.3",
512
+ "util-deprecate": "1.0.2"
513
+ }
514
+ },
515
+ "string_decoder": {
516
+ "version": "1.0.3",
517
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
518
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
519
+ "dev": true,
520
+ "requires": {
521
+ "safe-buffer": "5.1.1"
522
+ }
523
+ }
524
+ }
525
+ },
526
+ "console-browserify": {
527
+ "version": "0.1.6",
528
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-0.1.6.tgz",
529
+ "integrity": "sha1-0SijwLuINQ61YmxufHGm8P1ImDw=",
530
+ "dev": true
531
+ },
532
+ "console-control-strings": {
533
+ "version": "1.1.0",
534
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
535
+ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
536
+ "dev": true
537
+ },
538
+ "core-util-is": {
539
+ "version": "1.0.2",
540
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
541
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
542
+ "dev": true
543
+ },
544
+ "crc": {
545
+ "version": "3.5.0",
546
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz",
547
+ "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=",
548
+ "dev": true
549
+ },
550
+ "crc32-stream": {
551
+ "version": "2.0.0",
552
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz",
553
+ "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=",
554
+ "dev": true,
555
+ "requires": {
556
+ "crc": "3.5.0",
557
+ "readable-stream": "2.3.3"
558
+ }
559
+ },
560
+ "cryptiles": {
561
+ "version": "3.1.2",
562
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
563
+ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
564
+ "dev": true,
565
+ "optional": true,
566
+ "requires": {
567
+ "boom": "5.2.0"
568
+ },
569
+ "dependencies": {
570
+ "boom": {
571
+ "version": "5.2.0",
572
+ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
573
+ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
574
+ "dev": true,
575
+ "optional": true,
576
+ "requires": {
577
+ "hoek": "4.2.0"
578
+ }
579
+ }
580
+ }
581
+ },
582
+ "cson": {
583
+ "version": "3.0.2",
584
+ "resolved": "https://registry.npmjs.org/cson/-/cson-3.0.2.tgz",
585
+ "integrity": "sha1-g+6Qids8JUvsHpjkmNmqzxGtzFQ=",
586
+ "dev": true,
587
+ "requires": {
588
+ "coffee-script": "1.12.7",
589
+ "cson-parser": "1.3.5",
590
+ "extract-opts": "3.3.1",
591
+ "requirefresh": "2.1.0",
592
+ "safefs": "4.1.0"
593
+ },
594
+ "dependencies": {
595
+ "coffee-script": {
596
+ "version": "1.12.7",
597
+ "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz",
598
+ "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==",
599
+ "dev": true
600
+ }
601
+ }
602
+ },
603
+ "cson-parser": {
604
+ "version": "1.3.5",
605
+ "resolved": "https://registry.npmjs.org/cson-parser/-/cson-parser-1.3.5.tgz",
606
+ "integrity": "sha1-fsZ14DkUVTO/KmqFYHPxWZ2cLSQ=",
607
+ "dev": true,
608
+ "requires": {
609
+ "coffee-script": "1.12.7"
610
+ },
611
+ "dependencies": {
612
+ "coffee-script": {
613
+ "version": "1.12.7",
614
+ "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz",
615
+ "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==",
616
+ "dev": true
617
+ }
618
+ }
619
+ },
620
+ "currently-unhandled": {
621
+ "version": "0.4.1",
622
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
623
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
624
+ "dev": true,
625
+ "requires": {
626
+ "array-find-index": "1.0.2"
627
+ }
628
+ },
629
+ "dashdash": {
630
+ "version": "1.14.1",
631
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
632
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
633
+ "dev": true,
634
+ "optional": true,
635
+ "requires": {
636
+ "assert-plus": "1.0.0"
637
+ }
638
+ },
639
+ "date-time": {
640
+ "version": "1.1.0",
641
+ "resolved": "https://registry.npmjs.org/date-time/-/date-time-1.1.0.tgz",
642
+ "integrity": "sha1-GIdtC9pMGf5w3Tv0sDTygbEqQLY=",
643
+ "dev": true,
644
+ "requires": {
645
+ "time-zone": "0.1.0"
646
+ }
647
+ },
648
+ "dateformat": {
649
+ "version": "1.0.12",
650
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
651
+ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
652
+ "dev": true,
653
+ "requires": {
654
+ "get-stdin": "4.0.1",
655
+ "meow": "3.7.0"
656
+ }
657
+ },
658
+ "decamelize": {
659
+ "version": "1.2.0",
660
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
661
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
662
+ "dev": true
663
+ },
664
+ "deep-extend": {
665
+ "version": "0.4.2",
666
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
667
+ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
668
+ "dev": true,
669
+ "optional": true
670
+ },
671
+ "delayed-stream": {
672
+ "version": "1.0.0",
673
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
674
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
675
+ "dev": true
676
+ },
677
+ "delegates": {
678
+ "version": "1.0.0",
679
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
680
+ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
681
+ "dev": true
682
+ },
683
+ "detect-libc": {
684
+ "version": "0.2.0",
685
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-0.2.0.tgz",
686
+ "integrity": "sha1-R/31ZzSKF+wl/L8LnkRjSKdvn7U=",
687
+ "dev": true,
688
+ "optional": true
689
+ },
690
+ "eachr": {
691
+ "version": "3.2.0",
692
+ "resolved": "https://registry.npmjs.org/eachr/-/eachr-3.2.0.tgz",
693
+ "integrity": "sha1-LDXkPqCGUW95l8+At6pk1VpKRIQ=",
694
+ "dev": true,
695
+ "requires": {
696
+ "editions": "1.3.3",
697
+ "typechecker": "4.4.1"
698
+ }
699
+ },
700
+ "ecc-jsbn": {
701
+ "version": "0.1.1",
702
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
703
+ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
704
+ "dev": true,
705
+ "optional": true,
706
+ "requires": {
707
+ "jsbn": "0.1.1"
708
+ }
709
+ },
710
+ "editions": {
711
+ "version": "1.3.3",
712
+ "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.3.tgz",
713
+ "integrity": "sha1-CQcQG92iD6w8vjNMJ8vQaI3Jmls=",
714
+ "dev": true
715
+ },
716
+ "end-of-stream": {
717
+ "version": "1.4.0",
718
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz",
719
+ "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=",
720
+ "dev": true,
721
+ "requires": {
722
+ "once": "1.4.0"
723
+ }
724
+ },
725
+ "error-ex": {
726
+ "version": "1.3.1",
727
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
728
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
729
+ "dev": true,
730
+ "requires": {
731
+ "is-arrayish": "0.2.1"
732
+ }
733
+ },
734
+ "escape-string-regexp": {
735
+ "version": "1.0.5",
736
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
737
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
738
+ "dev": true
739
+ },
740
+ "esprima": {
741
+ "version": "2.7.3",
742
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
743
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
744
+ "dev": true
745
+ },
746
+ "eventemitter2": {
747
+ "version": "0.4.14",
748
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
749
+ "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
750
+ "dev": true
751
+ },
752
+ "exit": {
753
+ "version": "0.1.2",
754
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
755
+ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
756
+ "dev": true
757
+ },
758
+ "expand-template": {
759
+ "version": "1.1.0",
760
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.0.tgz",
761
+ "integrity": "sha512-kkjwkMqj0h4w/sb32ERCDxCQkREMCAgS39DscDnSwDsbxnwwM1BTZySdC3Bn1lhY7vL08n9GoO/fVTynjDgRyQ==",
762
+ "dev": true,
763
+ "optional": true
764
+ },
765
+ "extend": {
766
+ "version": "3.0.1",
767
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
768
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
769
+ "dev": true,
770
+ "optional": true
771
+ },
772
+ "extract-opts": {
773
+ "version": "3.3.1",
774
+ "resolved": "https://registry.npmjs.org/extract-opts/-/extract-opts-3.3.1.tgz",
775
+ "integrity": "sha1-WrvtyYwNUgLjJ4cn+Rktfghsa+E=",
776
+ "dev": true,
777
+ "requires": {
778
+ "eachr": "3.2.0",
779
+ "editions": "1.3.3",
780
+ "typechecker": "4.4.1"
781
+ }
782
+ },
783
+ "extsprintf": {
784
+ "version": "1.3.0",
785
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
786
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
787
+ "dev": true
788
+ },
789
+ "fast-deep-equal": {
790
+ "version": "1.0.0",
791
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
792
+ "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=",
793
+ "dev": true,
794
+ "optional": true
795
+ },
796
+ "fast-json-stable-stringify": {
797
+ "version": "2.0.0",
798
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
799
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
800
+ "dev": true,
801
+ "optional": true
802
+ },
803
+ "figures": {
804
+ "version": "1.7.0",
805
+ "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
806
+ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
807
+ "dev": true,
808
+ "requires": {
809
+ "escape-string-regexp": "1.0.5",
810
+ "object-assign": "4.1.1"
811
+ }
812
+ },
813
+ "find-up": {
814
+ "version": "1.1.2",
815
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
816
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
817
+ "dev": true,
818
+ "requires": {
819
+ "path-exists": "2.1.0",
820
+ "pinkie-promise": "2.0.1"
821
+ }
822
+ },
823
+ "findup-sync": {
824
+ "version": "0.3.0",
825
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
826
+ "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
827
+ "dev": true,
828
+ "requires": {
829
+ "glob": "5.0.15"
830
+ },
831
+ "dependencies": {
832
+ "glob": {
833
+ "version": "5.0.15",
834
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
835
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
836
+ "dev": true,
837
+ "requires": {
838
+ "inflight": "1.0.6",
839
+ "inherits": "2.0.3",
840
+ "minimatch": "3.0.4",
841
+ "once": "1.4.0",
842
+ "path-is-absolute": "1.0.1"
843
+ }
844
+ },
845
+ "minimatch": {
846
+ "version": "3.0.4",
847
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
848
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
849
+ "dev": true,
850
+ "requires": {
851
+ "brace-expansion": "1.1.8"
852
+ }
853
+ }
854
+ }
855
+ },
856
+ "forever-agent": {
857
+ "version": "0.6.1",
858
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
859
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
860
+ "dev": true,
861
+ "optional": true
862
+ },
863
+ "form-data": {
864
+ "version": "2.3.1",
865
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz",
866
+ "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=",
867
+ "dev": true,
868
+ "optional": true,
869
+ "requires": {
870
+ "asynckit": "0.4.0",
871
+ "combined-stream": "1.0.5",
872
+ "mime-types": "2.1.17"
873
+ }
874
+ },
875
+ "fs.realpath": {
876
+ "version": "1.0.0",
877
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
878
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
879
+ "dev": true
880
+ },
881
+ "fstream": {
882
+ "version": "1.0.11",
883
+ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
884
+ "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
885
+ "dev": true,
886
+ "requires": {
887
+ "graceful-fs": "4.1.11",
888
+ "inherits": "2.0.3",
889
+ "mkdirp": "0.5.1",
890
+ "rimraf": "2.2.8"
891
+ },
892
+ "dependencies": {
893
+ "graceful-fs": {
894
+ "version": "4.1.11",
895
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
896
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
897
+ "dev": true
898
+ }
899
+ }
900
+ },
901
+ "gauge": {
902
+ "version": "2.7.4",
903
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
904
+ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
905
+ "dev": true,
906
+ "requires": {
907
+ "aproba": "1.2.0",
908
+ "console-control-strings": "1.1.0",
909
+ "has-unicode": "2.0.1",
910
+ "object-assign": "4.1.1",
911
+ "signal-exit": "3.0.2",
912
+ "string-width": "1.0.2",
913
+ "strip-ansi": "3.0.1",
914
+ "wide-align": "1.1.2"
915
+ },
916
+ "dependencies": {
917
+ "ansi-regex": {
918
+ "version": "2.1.1",
919
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
920
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
921
+ "dev": true
922
+ },
923
+ "strip-ansi": {
924
+ "version": "3.0.1",
925
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
926
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
927
+ "dev": true,
928
+ "requires": {
929
+ "ansi-regex": "2.1.1"
930
+ }
931
+ }
932
+ }
933
+ },
934
+ "get-stdin": {
935
+ "version": "4.0.1",
936
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
937
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
938
+ "dev": true
939
+ },
940
+ "getobject": {
941
+ "version": "0.1.0",
942
+ "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz",
943
+ "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=",
944
+ "dev": true
945
+ },
946
+ "getpass": {
947
+ "version": "0.1.7",
948
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
949
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
950
+ "dev": true,
951
+ "optional": true,
952
+ "requires": {
953
+ "assert-plus": "1.0.0"
954
+ }
955
+ },
956
+ "github-from-package": {
957
+ "version": "0.0.0",
958
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
959
+ "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=",
960
+ "dev": true,
961
+ "optional": true
962
+ },
963
+ "glob": {
964
+ "version": "3.1.21",
965
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
966
+ "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
967
+ "dev": true,
968
+ "requires": {
969
+ "graceful-fs": "1.2.3",
970
+ "inherits": "1.0.2",
971
+ "minimatch": "0.2.14"
972
+ },
973
+ "dependencies": {
974
+ "inherits": {
975
+ "version": "1.0.2",
976
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
977
+ "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=",
978
+ "dev": true
979
+ }
980
+ }
981
+ },
982
+ "graceful-fs": {
983
+ "version": "1.2.3",
984
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
985
+ "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
986
+ "dev": true
987
+ },
988
+ "graceful-readlink": {
989
+ "version": "1.0.1",
990
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
991
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
992
+ "dev": true
993
+ },
994
+ "grunt": {
995
+ "version": "1.0.1",
996
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.1.tgz",
997
+ "integrity": "sha1-6HeHZOlEsY8yuw8QuQeEdcnftWs=",
998
+ "dev": true,
999
+ "requires": {
1000
+ "coffee-script": "1.10.0",
1001
+ "dateformat": "1.0.12",
1002
+ "eventemitter2": "0.4.14",
1003
+ "exit": "0.1.2",
1004
+ "findup-sync": "0.3.0",
1005
+ "glob": "7.0.6",
1006
+ "grunt-cli": "1.2.0",
1007
+ "grunt-known-options": "1.1.0",
1008
+ "grunt-legacy-log": "1.0.0",
1009
+ "grunt-legacy-util": "1.0.0",
1010
+ "iconv-lite": "0.4.19",
1011
+ "js-yaml": "3.5.5",
1012
+ "minimatch": "3.0.4",
1013
+ "nopt": "3.0.6",
1014
+ "path-is-absolute": "1.0.1",
1015
+ "rimraf": "2.2.8"
1016
+ },
1017
+ "dependencies": {
1018
+ "glob": {
1019
+ "version": "7.0.6",
1020
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
1021
+ "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
1022
+ "dev": true,
1023
+ "requires": {
1024
+ "fs.realpath": "1.0.0",
1025
+ "inflight": "1.0.6",
1026
+ "inherits": "2.0.3",
1027
+ "minimatch": "3.0.4",
1028
+ "once": "1.4.0",
1029
+ "path-is-absolute": "1.0.1"
1030
+ }
1031
+ },
1032
+ "grunt-cli": {
1033
+ "version": "1.2.0",
1034
+ "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
1035
+ "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=",
1036
+ "dev": true,
1037
+ "requires": {
1038
+ "findup-sync": "0.3.0",
1039
+ "grunt-known-options": "1.1.0",
1040
+ "nopt": "3.0.6",
1041
+ "resolve": "1.1.7"
1042
+ }
1043
+ },
1044
+ "minimatch": {
1045
+ "version": "3.0.4",
1046
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1047
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1048
+ "dev": true,
1049
+ "requires": {
1050
+ "brace-expansion": "1.1.8"
1051
+ }
1052
+ }
1053
+ }
1054
+ },
1055
+ "grunt-contrib-clean": {
1056
+ "version": "0.6.0",
1057
+ "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.6.0.tgz",
1058
+ "integrity": "sha1-9TLbpLghJnTHwBPhRr2mY4uQSPY=",
1059
+ "dev": true,
1060
+ "requires": {
1061
+ "rimraf": "2.2.8"
1062
+ }
1063
+ },
1064
+ "grunt-contrib-compress": {
1065
+ "version": "1.4.3",
1066
+ "resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-1.4.3.tgz",
1067
+ "integrity": "sha1-Ac7/ucY39S5wgfRjdQmD0KOw+nM=",
1068
+ "dev": true,
1069
+ "requires": {
1070
+ "archiver": "1.3.0",
1071
+ "chalk": "1.1.3",
1072
+ "iltorb": "1.3.10",
1073
+ "lodash": "4.17.4",
1074
+ "pretty-bytes": "4.0.2",
1075
+ "stream-buffers": "2.2.0"
1076
+ },
1077
+ "dependencies": {
1078
+ "ansi-regex": {
1079
+ "version": "2.1.1",
1080
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
1081
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
1082
+ "dev": true
1083
+ },
1084
+ "ansi-styles": {
1085
+ "version": "2.2.1",
1086
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
1087
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
1088
+ "dev": true
1089
+ },
1090
+ "chalk": {
1091
+ "version": "1.1.3",
1092
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
1093
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
1094
+ "dev": true,
1095
+ "requires": {
1096
+ "ansi-styles": "2.2.1",
1097
+ "escape-string-regexp": "1.0.5",
1098
+ "has-ansi": "2.0.0",
1099
+ "strip-ansi": "3.0.1",
1100
+ "supports-color": "2.0.0"
1101
+ }
1102
+ },
1103
+ "has-ansi": {
1104
+ "version": "2.0.0",
1105
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
1106
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
1107
+ "dev": true,
1108
+ "requires": {
1109
+ "ansi-regex": "2.1.1"
1110
+ }
1111
+ },
1112
+ "lodash": {
1113
+ "version": "4.17.4",
1114
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
1115
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
1116
+ "dev": true
1117
+ },
1118
+ "pretty-bytes": {
1119
+ "version": "4.0.2",
1120
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
1121
+ "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=",
1122
+ "dev": true
1123
+ },
1124
+ "strip-ansi": {
1125
+ "version": "3.0.1",
1126
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1127
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1128
+ "dev": true,
1129
+ "requires": {
1130
+ "ansi-regex": "2.1.1"
1131
+ }
1132
+ },
1133
+ "supports-color": {
1134
+ "version": "2.0.0",
1135
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1136
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
1137
+ "dev": true
1138
+ }
1139
+ }
1140
+ },
1141
+ "grunt-contrib-copy": {
1142
+ "version": "0.7.0",
1143
+ "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-0.7.0.tgz",
1144
+ "integrity": "sha1-xt5I4N9zFEmu2w8InAldvCpVBQ8=",
1145
+ "dev": true,
1146
+ "requires": {
1147
+ "chalk": "0.5.1"
1148
+ }
1149
+ },
1150
+ "grunt-contrib-cssmin": {
1151
+ "version": "0.12.3",
1152
+ "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-0.12.3.tgz",
1153
+ "integrity": "sha1-QVdZYJb7dlb8RktMx7B0beHzkBQ=",
1154
+ "dev": true,
1155
+ "requires": {
1156
+ "chalk": "1.1.3",
1157
+ "clean-css": "3.4.28",
1158
+ "maxmin": "1.1.0"
1159
+ },
1160
+ "dependencies": {
1161
+ "ansi-regex": {
1162
+ "version": "2.1.1",
1163
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
1164
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
1165
+ "dev": true
1166
+ },
1167
+ "ansi-styles": {
1168
+ "version": "2.2.1",
1169
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
1170
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
1171
+ "dev": true
1172
+ },
1173
+ "chalk": {
1174
+ "version": "1.1.3",
1175
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
1176
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
1177
+ "dev": true,
1178
+ "requires": {
1179
+ "ansi-styles": "2.2.1",
1180
+ "escape-string-regexp": "1.0.5",
1181
+ "has-ansi": "2.0.0",
1182
+ "strip-ansi": "3.0.1",
1183
+ "supports-color": "2.0.0"
1184
+ }
1185
+ },
1186
+ "has-ansi": {
1187
+ "version": "2.0.0",
1188
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
1189
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
1190
+ "dev": true,
1191
+ "requires": {
1192
+ "ansi-regex": "2.1.1"
1193
+ }
1194
+ },
1195
+ "strip-ansi": {
1196
+ "version": "3.0.1",
1197
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1198
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1199
+ "dev": true,
1200
+ "requires": {
1201
+ "ansi-regex": "2.1.1"
1202
+ }
1203
+ },
1204
+ "supports-color": {
1205
+ "version": "2.0.0",
1206
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1207
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
1208
+ "dev": true
1209
+ }
1210
+ }
1211
+ },
1212
+ "grunt-contrib-jshint": {
1213
+ "version": "0.6.5",
1214
+ "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.6.5.tgz",
1215
+ "integrity": "sha1-OvtGdnRTZMxKGe7nk0wOBgCLVm4=",
1216
+ "dev": true,
1217
+ "requires": {
1218
+ "jshint": "2.1.11"
1219
+ }
1220
+ },
1221
+ "grunt-contrib-uglify": {
1222
+ "version": "0.2.7",
1223
+ "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.2.7.tgz",
1224
+ "integrity": "sha1-5r2lHgxAoUWfbOrUI8Ze/XJaG/c=",
1225
+ "dev": true,
1226
+ "requires": {
1227
+ "grunt-lib-contrib": "0.6.1",
1228
+ "uglify-js": "2.4.24"
1229
+ }
1230
+ },
1231
+ "grunt-known-options": {
1232
+ "version": "1.1.0",
1233
+ "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz",
1234
+ "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=",
1235
+ "dev": true
1236
+ },
1237
+ "grunt-legacy-log": {
1238
+ "version": "1.0.0",
1239
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.0.tgz",
1240
+ "integrity": "sha1-+4bxgJhHvAfcR4Q/ns1srLYt8tU=",
1241
+ "dev": true,
1242
+ "requires": {
1243
+ "colors": "1.1.2",
1244
+ "grunt-legacy-log-utils": "1.0.0",
1245
+ "hooker": "0.2.3",
1246
+ "lodash": "3.10.1",
1247
+ "underscore.string": "3.2.3"
1248
+ }
1249
+ },
1250
+ "grunt-legacy-log-utils": {
1251
+ "version": "1.0.0",
1252
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz",
1253
+ "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=",
1254
+ "dev": true,
1255
+ "requires": {
1256
+ "chalk": "1.1.3",
1257
+ "lodash": "4.3.0"
1258
+ },
1259
+ "dependencies": {
1260
+ "ansi-regex": {
1261
+ "version": "2.1.1",
1262
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
1263
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
1264
+ "dev": true
1265
+ },
1266
+ "ansi-styles": {
1267
+ "version": "2.2.1",
1268
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
1269
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
1270
+ "dev": true
1271
+ },
1272
+ "chalk": {
1273
+ "version": "1.1.3",
1274
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
1275
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
1276
+ "dev": true,
1277
+ "requires": {
1278
+ "ansi-styles": "2.2.1",
1279
+ "escape-string-regexp": "1.0.5",
1280
+ "has-ansi": "2.0.0",
1281
+ "strip-ansi": "3.0.1",
1282
+ "supports-color": "2.0.0"
1283
+ }
1284
+ },
1285
+ "has-ansi": {
1286
+ "version": "2.0.0",
1287
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
1288
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
1289
+ "dev": true,
1290
+ "requires": {
1291
+ "ansi-regex": "2.1.1"
1292
+ }
1293
+ },
1294
+ "lodash": {
1295
+ "version": "4.3.0",
1296
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz",
1297
+ "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=",
1298
+ "dev": true
1299
+ },
1300
+ "strip-ansi": {
1301
+ "version": "3.0.1",
1302
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1303
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1304
+ "dev": true,
1305
+ "requires": {
1306
+ "ansi-regex": "2.1.1"
1307
+ }
1308
+ },
1309
+ "supports-color": {
1310
+ "version": "2.0.0",
1311
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1312
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
1313
+ "dev": true
1314
+ }
1315
+ }
1316
+ },
1317
+ "grunt-legacy-util": {
1318
+ "version": "1.0.0",
1319
+ "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz",
1320
+ "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=",
1321
+ "dev": true,
1322
+ "requires": {
1323
+ "async": "1.5.2",
1324
+ "exit": "0.1.2",
1325
+ "getobject": "0.1.0",
1326
+ "hooker": "0.2.3",
1327
+ "lodash": "4.3.0",
1328
+ "underscore.string": "3.2.3",
1329
+ "which": "1.2.14"
1330
+ },
1331
+ "dependencies": {
1332
+ "lodash": {
1333
+ "version": "4.3.0",
1334
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz",
1335
+ "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=",
1336
+ "dev": true
1337
+ }
1338
+ }
1339
+ },
1340
+ "grunt-lib-contrib": {
1341
+ "version": "0.6.1",
1342
+ "resolved": "https://registry.npmjs.org/grunt-lib-contrib/-/grunt-lib-contrib-0.6.1.tgz",
1343
+ "integrity": "sha1-P1att9oG6BR5XuJBWw6+X7iQPrs=",
1344
+ "dev": true,
1345
+ "requires": {
1346
+ "zlib-browserify": "0.0.1"
1347
+ }
1348
+ },
1349
+ "grunt-phplint": {
1350
+ "version": "0.0.8",
1351
+ "resolved": "https://registry.npmjs.org/grunt-phplint/-/grunt-phplint-0.0.8.tgz",
1352
+ "integrity": "sha1-wSeqKP930jnBSgHwUMx7cVnOkMA=",
1353
+ "dev": true,
1354
+ "requires": {
1355
+ "cache-swap": "0.0.6",
1356
+ "grunt": "0.4.5"
1357
+ },
1358
+ "dependencies": {
1359
+ "argparse": {
1360
+ "version": "0.1.16",
1361
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz",
1362
+ "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=",
1363
+ "dev": true,
1364
+ "requires": {
1365
+ "underscore": "1.7.0",
1366
+ "underscore.string": "2.4.0"
1367
+ },
1368
+ "dependencies": {
1369
+ "underscore.string": {
1370
+ "version": "2.4.0",
1371
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz",
1372
+ "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=",
1373
+ "dev": true
1374
+ }
1375
+ }
1376
+ },
1377
+ "async": {
1378
+ "version": "0.1.22",
1379
+ "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz",
1380
+ "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=",
1381
+ "dev": true
1382
+ },
1383
+ "coffee-script": {
1384
+ "version": "1.3.3",
1385
+ "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz",
1386
+ "integrity": "sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=",
1387
+ "dev": true
1388
+ },
1389
+ "colors": {
1390
+ "version": "0.6.2",
1391
+ "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
1392
+ "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=",
1393
+ "dev": true
1394
+ },
1395
+ "dateformat": {
1396
+ "version": "1.0.2-1.2.3",
1397
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz",
1398
+ "integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=",
1399
+ "dev": true
1400
+ },
1401
+ "esprima": {
1402
+ "version": "1.0.4",
1403
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz",
1404
+ "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=",
1405
+ "dev": true
1406
+ },
1407
+ "findup-sync": {
1408
+ "version": "0.1.3",
1409
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz",
1410
+ "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=",
1411
+ "dev": true,
1412
+ "requires": {
1413
+ "glob": "3.2.11",
1414
+ "lodash": "2.4.2"
1415
+ },
1416
+ "dependencies": {
1417
+ "glob": {
1418
+ "version": "3.2.11",
1419
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz",
1420
+ "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=",
1421
+ "dev": true,
1422
+ "requires": {
1423
+ "inherits": "2.0.3",
1424
+ "minimatch": "0.3.0"
1425
+ }
1426
+ },
1427
+ "lodash": {
1428
+ "version": "2.4.2",
1429
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
1430
+ "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
1431
+ "dev": true
1432
+ },
1433
+ "minimatch": {
1434
+ "version": "0.3.0",
1435
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz",
1436
+ "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=",
1437
+ "dev": true,
1438
+ "requires": {
1439
+ "lru-cache": "2.7.3",
1440
+ "sigmund": "1.0.1"
1441
+ }
1442
+ }
1443
+ }
1444
+ },
1445
+ "grunt": {
1446
+ "version": "0.4.5",
1447
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz",
1448
+ "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=",
1449
+ "dev": true,
1450
+ "requires": {
1451
+ "async": "0.1.22",
1452
+ "coffee-script": "1.3.3",
1453
+ "colors": "0.6.2",
1454
+ "dateformat": "1.0.2-1.2.3",
1455
+ "eventemitter2": "0.4.14",
1456
+ "exit": "0.1.2",
1457
+ "findup-sync": "0.1.3",
1458
+ "getobject": "0.1.0",
1459
+ "glob": "3.1.21",
1460
+ "grunt-legacy-log": "0.1.3",
1461
+ "grunt-legacy-util": "0.2.0",
1462
+ "hooker": "0.2.3",
1463
+ "iconv-lite": "0.2.11",
1464
+ "js-yaml": "2.0.5",
1465
+ "lodash": "0.9.2",
1466
+ "minimatch": "0.2.14",
1467
+ "nopt": "1.0.10",
1468
+ "rimraf": "2.2.8",
1469
+ "underscore.string": "2.2.1",
1470
+ "which": "1.0.9"
1471
+ }
1472
+ },
1473
+ "grunt-legacy-log": {
1474
+ "version": "0.1.3",
1475
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz",
1476
+ "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=",
1477
+ "dev": true,
1478
+ "requires": {
1479
+ "colors": "0.6.2",
1480
+ "grunt-legacy-log-utils": "0.1.1",
1481
+ "hooker": "0.2.3",
1482
+ "lodash": "2.4.2",
1483
+ "underscore.string": "2.3.3"
1484
+ },
1485
+ "dependencies": {
1486
+ "lodash": {
1487
+ "version": "2.4.2",
1488
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
1489
+ "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
1490
+ "dev": true
1491
+ },
1492
+ "underscore.string": {
1493
+ "version": "2.3.3",
1494
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
1495
+ "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
1496
+ "dev": true
1497
+ }
1498
+ }
1499
+ },
1500
+ "grunt-legacy-log-utils": {
1501
+ "version": "0.1.1",
1502
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz",
1503
+ "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=",
1504
+ "dev": true,
1505
+ "requires": {
1506
+ "colors": "0.6.2",
1507
+ "lodash": "2.4.2",
1508
+ "underscore.string": "2.3.3"
1509
+ },
1510
+ "dependencies": {
1511
+ "lodash": {
1512
+ "version": "2.4.2",
1513
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
1514
+ "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
1515
+ "dev": true
1516
+ },
1517
+ "underscore.string": {
1518
+ "version": "2.3.3",
1519
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
1520
+ "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
1521
+ "dev": true
1522
+ }
1523
+ }
1524
+ },
1525
+ "grunt-legacy-util": {
1526
+ "version": "0.2.0",
1527
+ "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz",
1528
+ "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=",
1529
+ "dev": true,
1530
+ "requires": {
1531
+ "async": "0.1.22",
1532
+ "exit": "0.1.2",
1533
+ "getobject": "0.1.0",
1534
+ "hooker": "0.2.3",
1535
+ "lodash": "0.9.2",
1536
+ "underscore.string": "2.2.1",
1537
+ "which": "1.0.9"
1538
+ }
1539
+ },
1540
+ "iconv-lite": {
1541
+ "version": "0.2.11",
1542
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz",
1543
+ "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=",
1544
+ "dev": true
1545
+ },
1546
+ "js-yaml": {
1547
+ "version": "2.0.5",
1548
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz",
1549
+ "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=",
1550
+ "dev": true,
1551
+ "requires": {
1552
+ "argparse": "0.1.16",
1553
+ "esprima": "1.0.4"
1554
+ }
1555
+ },
1556
+ "lodash": {
1557
+ "version": "0.9.2",
1558
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz",
1559
+ "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=",
1560
+ "dev": true
1561
+ },
1562
+ "nopt": {
1563
+ "version": "1.0.10",
1564
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1565
+ "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
1566
+ "dev": true,
1567
+ "requires": {
1568
+ "abbrev": "1.1.1"
1569
+ }
1570
+ },
1571
+ "underscore.string": {
1572
+ "version": "2.2.1",
1573
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz",
1574
+ "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=",
1575
+ "dev": true
1576
+ },
1577
+ "which": {
1578
+ "version": "1.0.9",
1579
+ "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz",
1580
+ "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=",
1581
+ "dev": true
1582
+ }
1583
+ }
1584
+ },
1585
+ "grunt-string-replace": {
1586
+ "version": "1.2.1",
1587
+ "resolved": "https://registry.npmjs.org/grunt-string-replace/-/grunt-string-replace-1.2.1.tgz",
1588
+ "integrity": "sha1-c9tiSuiyVNfB52LVGgPgQOEHIcY=",
1589
+ "dev": true,
1590
+ "requires": {
1591
+ "async": "1.5.2",
1592
+ "chalk": "1.1.3"
1593
+ },
1594
+ "dependencies": {
1595
+ "ansi-regex": {
1596
+ "version": "2.1.1",
1597
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
1598
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
1599
+ "dev": true
1600
+ },
1601
+ "ansi-styles": {
1602
+ "version": "2.2.1",
1603
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
1604
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
1605
+ "dev": true
1606
+ },
1607
+ "async": {
1608
+ "version": "1.5.2",
1609
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
1610
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
1611
+ "dev": true
1612
+ },
1613
+ "chalk": {
1614
+ "version": "1.1.3",
1615
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
1616
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
1617
+ "dev": true,
1618
+ "requires": {
1619
+ "ansi-styles": "2.2.1",
1620
+ "escape-string-regexp": "1.0.5",
1621
+ "has-ansi": "2.0.0",
1622
+ "strip-ansi": "3.0.1",
1623
+ "supports-color": "2.0.0"
1624
+ }
1625
+ },
1626
+ "has-ansi": {
1627
+ "version": "2.0.0",
1628
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
1629
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
1630
+ "dev": true,
1631
+ "requires": {
1632
+ "ansi-regex": "2.1.1"
1633
+ }
1634
+ },
1635
+ "strip-ansi": {
1636
+ "version": "3.0.1",
1637
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1638
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1639
+ "dev": true,
1640
+ "requires": {
1641
+ "ansi-regex": "2.1.1"
1642
+ }
1643
+ },
1644
+ "supports-color": {
1645
+ "version": "2.0.0",
1646
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1647
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
1648
+ "dev": true
1649
+ }
1650
+ }
1651
+ },
1652
+ "grunt-version": {
1653
+ "version": "1.2.1",
1654
+ "resolved": "https://registry.npmjs.org/grunt-version/-/grunt-version-1.2.1.tgz",
1655
+ "integrity": "sha512-FMRde7kCY1T2zCBAg4ZbLR9GbKDX60xCIZS89kCyk29LLQ/nbRSgXY+782HjT+HfC21kszcpWttfCGq1eERHPA==",
1656
+ "dev": true,
1657
+ "requires": {
1658
+ "grunt": "1.0.1",
1659
+ "semver": "4.3.6"
1660
+ },
1661
+ "dependencies": {
1662
+ "semver": {
1663
+ "version": "4.3.6",
1664
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
1665
+ "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
1666
+ "dev": true
1667
+ }
1668
+ }
1669
+ },
1670
+ "gzip-size": {
1671
+ "version": "1.0.0",
1672
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz",
1673
+ "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=",
1674
+ "dev": true,
1675
+ "requires": {
1676
+ "browserify-zlib": "0.1.4",
1677
+ "concat-stream": "1.6.0"
1678
+ }
1679
+ },
1680
+ "har-schema": {
1681
+ "version": "2.0.0",
1682
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
1683
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
1684
+ "dev": true,
1685
+ "optional": true
1686
+ },
1687
+ "har-validator": {
1688
+ "version": "5.0.3",
1689
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
1690
+ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
1691
+ "dev": true,
1692
+ "optional": true,
1693
+ "requires": {
1694
+ "ajv": "5.5.1",
1695
+ "har-schema": "2.0.0"
1696
+ }
1697
+ },
1698
+ "has-ansi": {
1699
+ "version": "0.1.0",
1700
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz",
1701
+ "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=",
1702
+ "dev": true,
1703
+ "requires": {
1704
+ "ansi-regex": "0.2.1"
1705
+ }
1706
+ },
1707
+ "has-unicode": {
1708
+ "version": "2.0.1",
1709
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
1710
+ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
1711
+ "dev": true
1712
+ },
1713
+ "hawk": {
1714
+ "version": "6.0.2",
1715
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
1716
+ "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
1717
+ "dev": true,
1718
+ "optional": true,
1719
+ "requires": {
1720
+ "boom": "4.3.1",
1721
+ "cryptiles": "3.1.2",
1722
+ "hoek": "4.2.0",
1723
+ "sntp": "2.1.0"
1724
+ }
1725
+ },
1726
+ "hoek": {
1727
+ "version": "4.2.0",
1728
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz",
1729
+ "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==",
1730
+ "dev": true
1731
+ },
1732
+ "hooker": {
1733
+ "version": "0.2.3",
1734
+ "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
1735
+ "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
1736
+ "dev": true
1737
+ },
1738
+ "hosted-git-info": {
1739
+ "version": "2.5.0",
1740
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
1741
+ "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==",
1742
+ "dev": true
1743
+ },
1744
+ "http-signature": {
1745
+ "version": "1.2.0",
1746
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
1747
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
1748
+ "dev": true,
1749
+ "optional": true,
1750
+ "requires": {
1751
+ "assert-plus": "1.0.0",
1752
+ "jsprim": "1.4.1",
1753
+ "sshpk": "1.13.1"
1754
+ }
1755
+ },
1756
+ "iconv-lite": {
1757
+ "version": "0.4.19",
1758
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
1759
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
1760
+ "dev": true
1761
+ },
1762
+ "iltorb": {
1763
+ "version": "1.3.10",
1764
+ "resolved": "https://registry.npmjs.org/iltorb/-/iltorb-1.3.10.tgz",
1765
+ "integrity": "sha512-nyB4+ru1u8CQqQ6w7YjasboKN3NQTN8GH/V/eEssNRKhW6UbdxdWhB9fJ5EEdjJfezKY0qPrcwLyIcgjL8hHxA==",
1766
+ "dev": true,
1767
+ "optional": true,
1768
+ "requires": {
1769
+ "detect-libc": "0.2.0",
1770
+ "nan": "2.8.0",
1771
+ "node-gyp": "3.6.2",
1772
+ "prebuild-install": "2.4.1"
1773
+ }
1774
+ },
1775
+ "indent-string": {
1776
+ "version": "2.1.0",
1777
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
1778
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
1779
+ "dev": true,
1780
+ "requires": {
1781
+ "repeating": "2.0.1"
1782
+ }
1783
+ },
1784
+ "inflight": {
1785
+ "version": "1.0.6",
1786
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1787
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1788
+ "dev": true,
1789
+ "requires": {
1790
+ "once": "1.4.0",
1791
+ "wrappy": "1.0.2"
1792
+ }
1793
+ },
1794
+ "inherit": {
1795
+ "version": "2.2.6",
1796
+ "resolved": "https://registry.npmjs.org/inherit/-/inherit-2.2.6.tgz",
1797
+ "integrity": "sha1-8WFLBshUToEo5CKchjR9tzrZeI0=",
1798
+ "dev": true
1799
+ },
1800
+ "inherits": {
1801
+ "version": "2.0.3",
1802
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1803
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
1804
+ "dev": true
1805
+ },
1806
+ "ini": {
1807
+ "version": "1.3.5",
1808
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
1809
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
1810
+ "dev": true,
1811
+ "optional": true
1812
+ },
1813
+ "is-arrayish": {
1814
+ "version": "0.2.1",
1815
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
1816
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
1817
+ "dev": true
1818
+ },
1819
+ "is-builtin-module": {
1820
+ "version": "1.0.0",
1821
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
1822
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
1823
+ "dev": true,
1824
+ "requires": {
1825
+ "builtin-modules": "1.1.1"
1826
+ }
1827
+ },
1828
+ "is-finite": {
1829
+ "version": "1.0.2",
1830
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
1831
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
1832
+ "dev": true,
1833
+ "requires": {
1834
+ "number-is-nan": "1.0.1"
1835
+ }
1836
+ },
1837
+ "is-fullwidth-code-point": {
1838
+ "version": "1.0.0",
1839
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
1840
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
1841
+ "dev": true,
1842
+ "requires": {
1843
+ "number-is-nan": "1.0.1"
1844
+ }
1845
+ },
1846
+ "is-typedarray": {
1847
+ "version": "1.0.0",
1848
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
1849
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
1850
+ "dev": true,
1851
+ "optional": true
1852
+ },
1853
+ "is-utf8": {
1854
+ "version": "0.2.1",
1855
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
1856
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
1857
+ "dev": true
1858
+ },
1859
+ "isarray": {
1860
+ "version": "1.0.0",
1861
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1862
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
1863
+ "dev": true
1864
+ },
1865
+ "isexe": {
1866
+ "version": "2.0.0",
1867
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1868
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1869
+ "dev": true
1870
+ },
1871
+ "isstream": {
1872
+ "version": "0.1.2",
1873
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
1874
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
1875
+ "dev": true,
1876
+ "optional": true
1877
+ },
1878
+ "jit-grunt": {
1879
+ "version": "0.10.0",
1880
+ "resolved": "https://registry.npmjs.org/jit-grunt/-/jit-grunt-0.10.0.tgz",
1881
+ "integrity": "sha1-AIw6f+Hpa9DYTiYOofoXg0V/ecI=",
1882
+ "dev": true
1883
+ },
1884
+ "js-yaml": {
1885
+ "version": "3.5.5",
1886
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz",
1887
+ "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=",
1888
+ "dev": true,
1889
+ "requires": {
1890
+ "argparse": "1.0.9",
1891
+ "esprima": "2.7.3"
1892
+ }
1893
+ },
1894
+ "jsbn": {
1895
+ "version": "0.1.1",
1896
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
1897
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
1898
+ "dev": true,
1899
+ "optional": true
1900
+ },
1901
+ "jshint": {
1902
+ "version": "2.1.11",
1903
+ "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.1.11.tgz",
1904
+ "integrity": "sha1-61EI/vm6Xd67gwmD9XLSQuSeP5Y=",
1905
+ "dev": true,
1906
+ "requires": {
1907
+ "cli": "0.4.5",
1908
+ "console-browserify": "0.1.6",
1909
+ "minimatch": "0.2.14",
1910
+ "shelljs": "0.1.4",
1911
+ "underscore": "1.4.4"
1912
+ },
1913
+ "dependencies": {
1914
+ "underscore": {
1915
+ "version": "1.4.4",
1916
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz",
1917
+ "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=",
1918
+ "dev": true
1919
+ }
1920
+ }
1921
+ },
1922
+ "json-schema": {
1923
+ "version": "0.2.3",
1924
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
1925
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
1926
+ "dev": true,
1927
+ "optional": true
1928
+ },
1929
+ "json-schema-traverse": {
1930
+ "version": "0.3.1",
1931
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
1932
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
1933
+ "dev": true,
1934
+ "optional": true
1935
+ },
1936
+ "json-stringify-safe": {
1937
+ "version": "5.0.1",
1938
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
1939
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
1940
+ "dev": true,
1941
+ "optional": true
1942
+ },
1943
+ "jsprim": {
1944
+ "version": "1.4.1",
1945
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
1946
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
1947
+ "dev": true,
1948
+ "optional": true,
1949
+ "requires": {
1950
+ "assert-plus": "1.0.0",
1951
+ "extsprintf": "1.3.0",
1952
+ "json-schema": "0.2.3",
1953
+ "verror": "1.10.0"
1954
+ }
1955
+ },
1956
+ "lazystream": {
1957
+ "version": "1.0.0",
1958
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
1959
+ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
1960
+ "dev": true,
1961
+ "requires": {
1962
+ "readable-stream": "2.3.3"
1963
+ }
1964
+ },
1965
+ "load-grunt-config": {
1966
+ "version": "0.19.2",
1967
+ "resolved": "https://registry.npmjs.org/load-grunt-config/-/load-grunt-config-0.19.2.tgz",
1968
+ "integrity": "sha1-UgkNSiDG5j90p2SPJJsZ57f87CQ=",
1969
+ "dev": true,
1970
+ "requires": {
1971
+ "cson": "3.0.2",
1972
+ "glob": "5.0.15",
1973
+ "jit-grunt": "0.10.0",
1974
+ "js-yaml": "3.4.6",
1975
+ "load-grunt-tasks": "3.3.0",
1976
+ "lodash": "3.10.1"
1977
+ },
1978
+ "dependencies": {
1979
+ "argparse": {
1980
+ "version": "1.0.9",
1981
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
1982
+ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
1983
+ "dev": true,
1984
+ "requires": {
1985
+ "sprintf-js": "1.0.3"
1986
+ }
1987
+ },
1988
+ "esprima": {
1989
+ "version": "2.7.3",
1990
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
1991
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
1992
+ "dev": true
1993
+ },
1994
+ "glob": {
1995
+ "version": "5.0.15",
1996
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
1997
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
1998
+ "dev": true,
1999
+ "requires": {
2000
+ "inflight": "1.0.6",
2001
+ "inherits": "2.0.3",
2002
+ "minimatch": "3.0.4",
2003
+ "once": "1.4.0",
2004
+ "path-is-absolute": "1.0.1"
2005
+ }
2006
+ },
2007
+ "js-yaml": {
2008
+ "version": "3.4.6",
2009
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.4.6.tgz",
2010
+ "integrity": "sha1-a+GyP2JJ9T0pM3D9TRqqY84bTrA=",
2011
+ "dev": true,
2012
+ "requires": {
2013
+ "argparse": "1.0.9",
2014
+ "esprima": "2.7.3",
2015
+ "inherit": "2.2.6"
2016
+ }
2017
+ },
2018
+ "load-grunt-tasks": {
2019
+ "version": "3.3.0",
2020
+ "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-3.3.0.tgz",
2021
+ "integrity": "sha1-vliSkJRY2T3fdp60vGhRAggMYyE=",
2022
+ "dev": true,
2023
+ "requires": {
2024
+ "arrify": "1.0.1",
2025
+ "multimatch": "2.1.0",
2026
+ "pkg-up": "1.0.0"
2027
+ }
2028
+ },
2029
+ "lodash": {
2030
+ "version": "3.10.1",
2031
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
2032
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
2033
+ "dev": true
2034
+ },
2035
+ "minimatch": {
2036
+ "version": "3.0.4",
2037
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2038
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
2039
+ "dev": true,
2040
+ "requires": {
2041
+ "brace-expansion": "1.1.8"
2042
+ }
2043
+ }
2044
+ }
2045
+ },
2046
+ "load-grunt-tasks": {
2047
+ "version": "3.1.0",
2048
+ "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-3.1.0.tgz",
2049
+ "integrity": "sha1-9Z56g0E+Loclkcd3f/3BijcJ2iA=",
2050
+ "dev": true,
2051
+ "requires": {
2052
+ "findup-sync": "0.2.1",
2053
+ "multimatch": "2.1.0"
2054
+ },
2055
+ "dependencies": {
2056
+ "findup-sync": {
2057
+ "version": "0.2.1",
2058
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.2.1.tgz",
2059
+ "integrity": "sha1-4KkKRQB1xJRm7lE3MgV1FLgeh4w=",
2060
+ "dev": true,
2061
+ "requires": {
2062
+ "glob": "4.3.5"
2063
+ }
2064
+ },
2065
+ "glob": {
2066
+ "version": "4.3.5",
2067
+ "resolved": "https://registry.npmjs.org/glob/-/glob-4.3.5.tgz",
2068
+ "integrity": "sha1-gPuwjKVA8jiszl0R0em8QedRc9M=",
2069
+ "dev": true,
2070
+ "requires": {
2071
+ "inflight": "1.0.6",
2072
+ "inherits": "2.0.3",
2073
+ "minimatch": "2.0.10",
2074
+ "once": "1.4.0"
2075
+ }
2076
+ },
2077
+ "minimatch": {
2078
+ "version": "2.0.10",
2079
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
2080
+ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
2081
+ "dev": true,
2082
+ "requires": {
2083
+ "brace-expansion": "1.1.8"
2084
+ }
2085
+ }
2086
+ }
2087
+ },
2088
+ "load-json-file": {
2089
+ "version": "1.1.0",
2090
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
2091
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
2092
+ "dev": true,
2093
+ "requires": {
2094
+ "graceful-fs": "4.1.11",
2095
+ "parse-json": "2.2.0",
2096
+ "pify": "2.3.0",
2097
+ "pinkie-promise": "2.0.1",
2098
+ "strip-bom": "2.0.0"
2099
+ },
2100
+ "dependencies": {
2101
+ "graceful-fs": {
2102
+ "version": "4.1.11",
2103
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
2104
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
2105
+ "dev": true
2106
+ }
2107
+ }
2108
+ },
2109
+ "lodash": {
2110
+ "version": "3.10.1",
2111
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
2112
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
2113
+ "dev": true
2114
+ },
2115
+ "loud-rejection": {
2116
+ "version": "1.6.0",
2117
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
2118
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
2119
+ "dev": true,
2120
+ "requires": {
2121
+ "currently-unhandled": "0.4.1",
2122
+ "signal-exit": "3.0.2"
2123
+ }
2124
+ },
2125
+ "lru-cache": {
2126
+ "version": "2.7.3",
2127
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
2128
+ "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
2129
+ "dev": true
2130
+ },
2131
+ "map-obj": {
2132
+ "version": "1.0.1",
2133
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
2134
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
2135
+ "dev": true
2136
+ },
2137
+ "maxmin": {
2138
+ "version": "1.1.0",
2139
+ "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz",
2140
+ "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=",
2141
+ "dev": true,
2142
+ "requires": {
2143
+ "chalk": "1.1.3",
2144
+ "figures": "1.7.0",
2145
+ "gzip-size": "1.0.0",
2146
+ "pretty-bytes": "1.0.4"
2147
+ },
2148
+ "dependencies": {
2149
+ "ansi-regex": {
2150
+ "version": "2.1.1",
2151
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
2152
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
2153
+ "dev": true
2154
+ },
2155
+ "ansi-styles": {
2156
+ "version": "2.2.1",
2157
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
2158
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
2159
+ "dev": true
2160
+ },
2161
+ "chalk": {
2162
+ "version": "1.1.3",
2163
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
2164
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
2165
+ "dev": true,
2166
+ "requires": {
2167
+ "ansi-styles": "2.2.1",
2168
+ "escape-string-regexp": "1.0.5",
2169
+ "has-ansi": "2.0.0",
2170
+ "strip-ansi": "3.0.1",
2171
+ "supports-color": "2.0.0"
2172
+ }
2173
+ },
2174
+ "has-ansi": {
2175
+ "version": "2.0.0",
2176
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
2177
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
2178
+ "dev": true,
2179
+ "requires": {
2180
+ "ansi-regex": "2.1.1"
2181
+ }
2182
+ },
2183
+ "strip-ansi": {
2184
+ "version": "3.0.1",
2185
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
2186
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
2187
+ "dev": true,
2188
+ "requires": {
2189
+ "ansi-regex": "2.1.1"
2190
+ }
2191
+ },
2192
+ "supports-color": {
2193
+ "version": "2.0.0",
2194
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
2195
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
2196
+ "dev": true
2197
+ }
2198
+ }
2199
+ },
2200
+ "meow": {
2201
+ "version": "3.7.0",
2202
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
2203
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
2204
+ "dev": true,
2205
+ "requires": {
2206
+ "camelcase-keys": "2.1.0",
2207
+ "decamelize": "1.2.0",
2208
+ "loud-rejection": "1.6.0",
2209
+ "map-obj": "1.0.1",
2210
+ "minimist": "1.2.0",
2211
+ "normalize-package-data": "2.4.0",
2212
+ "object-assign": "4.1.1",
2213
+ "read-pkg-up": "1.0.1",
2214
+ "redent": "1.0.0",
2215
+ "trim-newlines": "1.0.0"
2216
+ }
2217
+ },
2218
+ "mime-db": {
2219
+ "version": "1.30.0",
2220
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
2221
+ "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=",
2222
+ "dev": true
2223
+ },
2224
+ "mime-types": {
2225
+ "version": "2.1.17",
2226
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
2227
+ "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
2228
+ "dev": true,
2229
+ "requires": {
2230
+ "mime-db": "1.30.0"
2231
+ }
2232
+ },
2233
+ "minimatch": {
2234
+ "version": "0.2.14",
2235
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
2236
+ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
2237
+ "dev": true,
2238
+ "requires": {
2239
+ "lru-cache": "2.7.3",
2240
+ "sigmund": "1.0.1"
2241
+ }
2242
+ },
2243
+ "minimist": {
2244
+ "version": "1.2.0",
2245
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
2246
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
2247
+ "dev": true
2248
+ },
2249
+ "mkdirp": {
2250
+ "version": "0.5.1",
2251
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
2252
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
2253
+ "dev": true,
2254
+ "requires": {
2255
+ "minimist": "0.0.8"
2256
+ },
2257
+ "dependencies": {
2258
+ "minimist": {
2259
+ "version": "0.0.8",
2260
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
2261
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
2262
+ "dev": true
2263
+ }
2264
+ }
2265
+ },
2266
+ "multimatch": {
2267
+ "version": "2.1.0",
2268
+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz",
2269
+ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=",
2270
+ "dev": true,
2271
+ "requires": {
2272
+ "array-differ": "1.0.0",
2273
+ "array-union": "1.0.2",
2274
+ "arrify": "1.0.1",
2275
+ "minimatch": "3.0.4"
2276
+ },
2277
+ "dependencies": {
2278
+ "minimatch": {
2279
+ "version": "3.0.4",
2280
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2281
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
2282
+ "dev": true,
2283
+ "requires": {
2284
+ "brace-expansion": "1.1.8"
2285
+ }
2286
+ }
2287
+ }
2288
+ },
2289
+ "nan": {
2290
+ "version": "2.8.0",
2291
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz",
2292
+ "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=",
2293
+ "dev": true,
2294
+ "optional": true
2295
+ },
2296
+ "node-abi": {
2297
+ "version": "2.1.2",
2298
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.1.2.tgz",
2299
+ "integrity": "sha512-hmUtb8m75RSi7N+zZLYqe75XDvZB+6LyTBPkj2DConvNgQet2e3BIqEwe1LLvqMrfyjabuT5ZOrTioLCH1HTdA==",
2300
+ "dev": true,
2301
+ "optional": true,
2302
+ "requires": {
2303
+ "semver": "5.4.1"
2304
+ }
2305
+ },
2306
+ "node-gyp": {
2307
+ "version": "3.6.2",
2308
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz",
2309
+ "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=",
2310
+ "dev": true,
2311
+ "optional": true,
2312
+ "requires": {
2313
+ "fstream": "1.0.11",
2314
+ "glob": "7.1.2",
2315
+ "graceful-fs": "4.1.11",
2316
+ "minimatch": "3.0.4",
2317
+ "mkdirp": "0.5.1",
2318
+ "nopt": "3.0.6",
2319
+ "npmlog": "4.1.2",
2320
+ "osenv": "0.1.4",
2321
+ "request": "2.83.0",
2322
+ "rimraf": "2.2.8",
2323
+ "semver": "5.3.0",
2324
+ "tar": "2.2.1",
2325
+ "which": "1.2.14"
2326
+ },
2327
+ "dependencies": {
2328
+ "glob": {
2329
+ "version": "7.1.2",
2330
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
2331
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
2332
+ "dev": true,
2333
+ "optional": true,
2334
+ "requires": {
2335
+ "fs.realpath": "1.0.0",
2336
+ "inflight": "1.0.6",
2337
+ "inherits": "2.0.3",
2338
+ "minimatch": "3.0.4",
2339
+ "once": "1.4.0",
2340
+ "path-is-absolute": "1.0.1"
2341
+ }
2342
+ },
2343
+ "graceful-fs": {
2344
+ "version": "4.1.11",
2345
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
2346
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
2347
+ "dev": true,
2348
+ "optional": true
2349
+ },
2350
+ "minimatch": {
2351
+ "version": "3.0.4",
2352
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2353
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
2354
+ "dev": true,
2355
+ "requires": {
2356
+ "brace-expansion": "1.1.8"
2357
+ }
2358
+ },
2359
+ "semver": {
2360
+ "version": "5.3.0",
2361
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
2362
+ "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
2363
+ "dev": true,
2364
+ "optional": true
2365
+ }
2366
+ }
2367
+ },
2368
+ "noop-logger": {
2369
+ "version": "0.1.1",
2370
+ "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz",
2371
+ "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=",
2372
+ "dev": true,
2373
+ "optional": true
2374
+ },
2375
+ "nopt": {
2376
+ "version": "3.0.6",
2377
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
2378
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
2379
+ "dev": true,
2380
+ "requires": {
2381
+ "abbrev": "1.1.1"
2382
+ }
2383
+ },
2384
+ "normalize-package-data": {
2385
+ "version": "2.4.0",
2386
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
2387
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
2388
+ "dev": true,
2389
+ "requires": {
2390
+ "hosted-git-info": "2.5.0",
2391
+ "is-builtin-module": "1.0.0",
2392
+ "semver": "5.4.1",
2393
+ "validate-npm-package-license": "3.0.1"
2394
+ }
2395
+ },
2396
+ "normalize-path": {
2397
+ "version": "2.1.1",
2398
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
2399
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
2400
+ "dev": true,
2401
+ "requires": {
2402
+ "remove-trailing-separator": "1.1.0"
2403
+ }
2404
+ },
2405
+ "npmlog": {
2406
+ "version": "4.1.2",
2407
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
2408
+ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
2409
+ "dev": true,
2410
+ "requires": {
2411
+ "are-we-there-yet": "1.1.4",
2412
+ "console-control-strings": "1.1.0",
2413
+ "gauge": "2.7.4",
2414
+ "set-blocking": "2.0.0"
2415
+ }
2416
+ },
2417
+ "number-is-nan": {
2418
+ "version": "1.0.1",
2419
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
2420
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
2421
+ "dev": true
2422
+ },
2423
+ "oauth-sign": {
2424
+ "version": "0.8.2",
2425
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
2426
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
2427
+ "dev": true,
2428
+ "optional": true
2429
+ },
2430
+ "object-assign": {
2431
+ "version": "4.1.1",
2432
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2433
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
2434
+ "dev": true
2435
+ },
2436
+ "once": {
2437
+ "version": "1.4.0",
2438
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2439
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
2440
+ "dev": true,
2441
+ "requires": {
2442
+ "wrappy": "1.0.2"
2443
+ }
2444
+ },
2445
+ "os-homedir": {
2446
+ "version": "1.0.2",
2447
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
2448
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
2449
+ "dev": true
2450
+ },
2451
+ "os-tmpdir": {
2452
+ "version": "1.0.2",
2453
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
2454
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
2455
+ "dev": true,
2456
+ "optional": true
2457
+ },
2458
+ "osenv": {
2459
+ "version": "0.1.4",
2460
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz",
2461
+ "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=",
2462
+ "dev": true,
2463
+ "optional": true,
2464
+ "requires": {
2465
+ "os-homedir": "1.0.2",
2466
+ "os-tmpdir": "1.0.2"
2467
+ }
2468
+ },
2469
+ "pako": {
2470
+ "version": "0.2.9",
2471
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
2472
+ "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
2473
+ "dev": true
2474
+ },
2475
+ "parse-json": {
2476
+ "version": "2.2.0",
2477
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
2478
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
2479
+ "dev": true,
2480
+ "requires": {
2481
+ "error-ex": "1.3.1"
2482
+ }
2483
+ },
2484
+ "parse-ms": {
2485
+ "version": "1.0.1",
2486
+ "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz",
2487
+ "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=",
2488
+ "dev": true
2489
+ },
2490
+ "path-exists": {
2491
+ "version": "2.1.0",
2492
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
2493
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
2494
+ "dev": true,
2495
+ "requires": {
2496
+ "pinkie-promise": "2.0.1"
2497
+ }
2498
+ },
2499
+ "path-is-absolute": {
2500
+ "version": "1.0.1",
2501
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2502
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
2503
+ "dev": true
2504
+ },
2505
+ "path-type": {
2506
+ "version": "1.1.0",
2507
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
2508
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
2509
+ "dev": true,
2510
+ "requires": {
2511
+ "graceful-fs": "4.1.11",
2512
+ "pify": "2.3.0",
2513
+ "pinkie-promise": "2.0.1"
2514
+ },
2515
+ "dependencies": {
2516
+ "graceful-fs": {
2517
+ "version": "4.1.11",
2518
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
2519
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
2520
+ "dev": true
2521
+ }
2522
+ }
2523
+ },
2524
+ "performance-now": {
2525
+ "version": "2.1.0",
2526
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
2527
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
2528
+ "dev": true,
2529
+ "optional": true
2530
+ },
2531
+ "pify": {
2532
+ "version": "2.3.0",
2533
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2534
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
2535
+ "dev": true
2536
+ },
2537
+ "pinkie": {
2538
+ "version": "2.0.4",
2539
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
2540
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
2541
+ "dev": true
2542
+ },
2543
+ "pinkie-promise": {
2544
+ "version": "2.0.1",
2545
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
2546
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
2547
+ "dev": true,
2548
+ "requires": {
2549
+ "pinkie": "2.0.4"
2550
+ }
2551
+ },
2552
+ "pkg-up": {
2553
+ "version": "1.0.0",
2554
+ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz",
2555
+ "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=",
2556
+ "dev": true,
2557
+ "requires": {
2558
+ "find-up": "1.1.2"
2559
+ }
2560
+ },
2561
+ "plur": {
2562
+ "version": "1.0.0",
2563
+ "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz",
2564
+ "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=",
2565
+ "dev": true
2566
+ },
2567
+ "prebuild-install": {
2568
+ "version": "2.4.1",
2569
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.4.1.tgz",
2570
+ "integrity": "sha512-99TyEFYTTkBWANT+mwSptmLb9ZCLQ6qKIUE36fXSIOtShB0JNprL2hzBD8F1yIuT9btjFrFEwbRHXhqDi1HmRA==",
2571
+ "dev": true,
2572
+ "optional": true,
2573
+ "requires": {
2574
+ "expand-template": "1.1.0",
2575
+ "github-from-package": "0.0.0",
2576
+ "minimist": "1.2.0",
2577
+ "mkdirp": "0.5.1",
2578
+ "node-abi": "2.1.2",
2579
+ "noop-logger": "0.1.1",
2580
+ "npmlog": "4.1.2",
2581
+ "os-homedir": "1.0.2",
2582
+ "pump": "1.0.3",
2583
+ "rc": "1.2.2",
2584
+ "simple-get": "1.4.3",
2585
+ "tar-fs": "1.16.0",
2586
+ "tunnel-agent": "0.6.0",
2587
+ "xtend": "4.0.1"
2588
+ }
2589
+ },
2590
+ "pretty-bytes": {
2591
+ "version": "1.0.4",
2592
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz",
2593
+ "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=",
2594
+ "dev": true,
2595
+ "requires": {
2596
+ "get-stdin": "4.0.1",
2597
+ "meow": "3.7.0"
2598
+ }
2599
+ },
2600
+ "pretty-ms": {
2601
+ "version": "1.4.0",
2602
+ "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-1.4.0.tgz",
2603
+ "integrity": "sha1-aQ1VY3lXwMU/gIaoEK23R4Jamg8=",
2604
+ "dev": true,
2605
+ "requires": {
2606
+ "get-stdin": "4.0.1",
2607
+ "is-finite": "1.0.2",
2608
+ "meow": "3.7.0",
2609
+ "parse-ms": "1.0.1",
2610
+ "plur": "1.0.0"
2611
+ }
2612
+ },
2613
+ "process-nextick-args": {
2614
+ "version": "1.0.7",
2615
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
2616
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
2617
+ "dev": true
2618
+ },
2619
+ "pump": {
2620
+ "version": "1.0.3",
2621
+ "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz",
2622
+ "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==",
2623
+ "dev": true,
2624
+ "requires": {
2625
+ "end-of-stream": "1.4.0",
2626
+ "once": "1.4.0"
2627
+ }
2628
+ },
2629
+ "punycode": {
2630
+ "version": "1.4.1",
2631
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
2632
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
2633
+ "dev": true,
2634
+ "optional": true
2635
+ },
2636
+ "qs": {
2637
+ "version": "6.5.1",
2638
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
2639
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
2640
+ "dev": true,
2641
+ "optional": true
2642
+ },
2643
+ "rc": {
2644
+ "version": "1.2.2",
2645
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz",
2646
+ "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=",
2647
+ "dev": true,
2648
+ "optional": true,
2649
+ "requires": {
2650
+ "deep-extend": "0.4.2",
2651
+ "ini": "1.3.5",
2652
+ "minimist": "1.2.0",
2653
+ "strip-json-comments": "2.0.1"
2654
+ }
2655
+ },
2656
+ "read-pkg": {
2657
+ "version": "1.1.0",
2658
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
2659
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
2660
+ "dev": true,
2661
+ "requires": {
2662
+ "load-json-file": "1.1.0",
2663
+ "normalize-package-data": "2.4.0",
2664
+ "path-type": "1.1.0"
2665
+ }
2666
+ },
2667
+ "read-pkg-up": {
2668
+ "version": "1.0.1",
2669
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
2670
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
2671
+ "dev": true,
2672
+ "requires": {
2673
+ "find-up": "1.1.2",
2674
+ "read-pkg": "1.1.0"
2675
+ }
2676
+ },
2677
+ "readable-stream": {
2678
+ "version": "2.3.3",
2679
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
2680
+ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
2681
+ "dev": true,
2682
+ "requires": {
2683
+ "core-util-is": "1.0.2",
2684
+ "inherits": "2.0.3",
2685
+ "isarray": "1.0.0",
2686
+ "process-nextick-args": "1.0.7",
2687
+ "safe-buffer": "5.1.1",
2688
+ "string_decoder": "1.0.3",
2689
+ "util-deprecate": "1.0.2"
2690
+ }
2691
+ },
2692
+ "redent": {
2693
+ "version": "1.0.0",
2694
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
2695
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
2696
+ "dev": true,
2697
+ "requires": {
2698
+ "indent-string": "2.1.0",
2699
+ "strip-indent": "1.0.1"
2700
+ }
2701
+ },
2702
+ "remove-trailing-separator": {
2703
+ "version": "1.1.0",
2704
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
2705
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
2706
+ "dev": true
2707
+ },
2708
+ "repeating": {
2709
+ "version": "2.0.1",
2710
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
2711
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
2712
+ "dev": true,
2713
+ "requires": {
2714
+ "is-finite": "1.0.2"
2715
+ }
2716
+ },
2717
+ "request": {
2718
+ "version": "2.83.0",
2719
+ "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz",
2720
+ "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==",
2721
+ "dev": true,
2722
+ "optional": true,
2723
+ "requires": {
2724
+ "aws-sign2": "0.7.0",
2725
+ "aws4": "1.6.0",
2726
+ "caseless": "0.12.0",
2727
+ "combined-stream": "1.0.5",
2728
+ "extend": "3.0.1",
2729
+ "forever-agent": "0.6.1",
2730
+ "form-data": "2.3.1",
2731
+ "har-validator": "5.0.3",
2732
+ "hawk": "6.0.2",
2733
+ "http-signature": "1.2.0",
2734
+ "is-typedarray": "1.0.0",
2735
+ "isstream": "0.1.2",
2736
+ "json-stringify-safe": "5.0.1",
2737
+ "mime-types": "2.1.17",
2738
+ "oauth-sign": "0.8.2",
2739
+ "performance-now": "2.1.0",
2740
+ "qs": "6.5.1",
2741
+ "safe-buffer": "5.1.1",
2742
+ "stringstream": "0.0.5",
2743
+ "tough-cookie": "2.3.3",
2744
+ "tunnel-agent": "0.6.0",
2745
+ "uuid": "3.1.0"
2746
+ }
2747
+ },
2748
+ "requirefresh": {
2749
+ "version": "2.1.0",
2750
+ "resolved": "https://registry.npmjs.org/requirefresh/-/requirefresh-2.1.0.tgz",
2751
+ "integrity": "sha1-dC3Mwg86lpGNZsbxWX3I/+vE9vU=",
2752
+ "dev": true,
2753
+ "requires": {
2754
+ "editions": "1.3.3"
2755
+ }
2756
+ },
2757
+ "resolve": {
2758
+ "version": "1.1.7",
2759
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
2760
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
2761
+ "dev": true
2762
+ },
2763
+ "rimraf": {
2764
+ "version": "2.2.8",
2765
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
2766
+ "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
2767
+ "dev": true
2768
+ },
2769
+ "safe-buffer": {
2770
+ "version": "5.1.1",
2771
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
2772
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
2773
+ "dev": true
2774
+ },
2775
+ "safefs": {
2776
+ "version": "4.1.0",
2777
+ "resolved": "https://registry.npmjs.org/safefs/-/safefs-4.1.0.tgz",
2778
+ "integrity": "sha1-+CrrS9165R9lPrIPZyizBYyNZEU=",
2779
+ "dev": true,
2780
+ "requires": {
2781
+ "editions": "1.3.3",
2782
+ "graceful-fs": "4.1.11"
2783
+ },
2784
+ "dependencies": {
2785
+ "graceful-fs": {
2786
+ "version": "4.1.11",
2787
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
2788
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
2789
+ "dev": true
2790
+ }
2791
+ }
2792
+ },
2793
+ "semver": {
2794
+ "version": "5.4.1",
2795
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
2796
+ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
2797
+ "dev": true
2798
+ },
2799
+ "set-blocking": {
2800
+ "version": "2.0.0",
2801
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
2802
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
2803
+ "dev": true
2804
+ },
2805
+ "shelljs": {
2806
+ "version": "0.1.4",
2807
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.1.4.tgz",
2808
+ "integrity": "sha1-37vnjVbDwBaNL7eeEOzR28sH7A4=",
2809
+ "dev": true
2810
+ },
2811
+ "sigmund": {
2812
+ "version": "1.0.1",
2813
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
2814
+ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
2815
+ "dev": true
2816
+ },
2817
+ "signal-exit": {
2818
+ "version": "3.0.2",
2819
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
2820
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
2821
+ "dev": true
2822
+ },
2823
+ "simple-get": {
2824
+ "version": "1.4.3",
2825
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-1.4.3.tgz",
2826
+ "integrity": "sha1-6XVe2kB+ltpAxeUVjJ6jezO+y+s=",
2827
+ "dev": true,
2828
+ "optional": true,
2829
+ "requires": {
2830
+ "once": "1.4.0",
2831
+ "unzip-response": "1.0.2",
2832
+ "xtend": "4.0.1"
2833
+ }
2834
+ },
2835
+ "sntp": {
2836
+ "version": "2.1.0",
2837
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
2838
+ "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
2839
+ "dev": true,
2840
+ "optional": true,
2841
+ "requires": {
2842
+ "hoek": "4.2.0"
2843
+ }
2844
+ },
2845
+ "source-map": {
2846
+ "version": "0.4.4",
2847
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
2848
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
2849
+ "dev": true,
2850
+ "requires": {
2851
+ "amdefine": "1.0.1"
2852
+ }
2853
+ },
2854
+ "spdx-correct": {
2855
+ "version": "1.0.2",
2856
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
2857
+ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
2858
+ "dev": true,
2859
+ "requires": {
2860
+ "spdx-license-ids": "1.2.2"
2861
+ }
2862
+ },
2863
+ "spdx-expression-parse": {
2864
+ "version": "1.0.4",
2865
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
2866
+ "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
2867
+ "dev": true
2868
+ },
2869
+ "spdx-license-ids": {
2870
+ "version": "1.2.2",
2871
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
2872
+ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
2873
+ "dev": true
2874
+ },
2875
+ "sprintf-js": {
2876
+ "version": "1.0.3",
2877
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
2878
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
2879
+ "dev": true
2880
+ },
2881
+ "sshpk": {
2882
+ "version": "1.13.1",
2883
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
2884
+ "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
2885
+ "dev": true,
2886
+ "optional": true,
2887
+ "requires": {
2888
+ "asn1": "0.2.3",
2889
+ "assert-plus": "1.0.0",
2890
+ "bcrypt-pbkdf": "1.0.1",
2891
+ "dashdash": "1.14.1",
2892
+ "ecc-jsbn": "0.1.1",
2893
+ "getpass": "0.1.7",
2894
+ "jsbn": "0.1.1",
2895
+ "tweetnacl": "0.14.5"
2896
+ }
2897
+ },
2898
+ "stream-buffers": {
2899
+ "version": "2.2.0",
2900
+ "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz",
2901
+ "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=",
2902
+ "dev": true
2903
+ },
2904
+ "string-width": {
2905
+ "version": "1.0.2",
2906
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
2907
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
2908
+ "dev": true,
2909
+ "requires": {
2910
+ "code-point-at": "1.1.0",
2911
+ "is-fullwidth-code-point": "1.0.0",
2912
+ "strip-ansi": "3.0.1"
2913
+ },
2914
+ "dependencies": {
2915
+ "ansi-regex": {
2916
+ "version": "2.1.1",
2917
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
2918
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
2919
+ "dev": true
2920
+ },
2921
+ "strip-ansi": {
2922
+ "version": "3.0.1",
2923
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
2924
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
2925
+ "dev": true,
2926
+ "requires": {
2927
+ "ansi-regex": "2.1.1"
2928
+ }
2929
+ }
2930
+ }
2931
+ },
2932
+ "string_decoder": {
2933
+ "version": "1.0.3",
2934
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
2935
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
2936
+ "dev": true,
2937
+ "requires": {
2938
+ "safe-buffer": "5.1.1"
2939
+ }
2940
+ },
2941
+ "stringstream": {
2942
+ "version": "0.0.5",
2943
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
2944
+ "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
2945
+ "dev": true,
2946
+ "optional": true
2947
+ },
2948
+ "strip-ansi": {
2949
+ "version": "0.3.0",
2950
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz",
2951
+ "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=",
2952
+ "dev": true,
2953
+ "requires": {
2954
+ "ansi-regex": "0.2.1"
2955
+ }
2956
+ },
2957
+ "strip-bom": {
2958
+ "version": "2.0.0",
2959
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
2960
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
2961
+ "dev": true,
2962
+ "requires": {
2963
+ "is-utf8": "0.2.1"
2964
+ }
2965
+ },
2966
+ "strip-indent": {
2967
+ "version": "1.0.1",
2968
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
2969
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
2970
+ "dev": true,
2971
+ "requires": {
2972
+ "get-stdin": "4.0.1"
2973
+ }
2974
+ },
2975
+ "strip-json-comments": {
2976
+ "version": "2.0.1",
2977
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
2978
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
2979
+ "dev": true,
2980
+ "optional": true
2981
+ },
2982
+ "supports-color": {
2983
+ "version": "0.2.0",
2984
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz",
2985
+ "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=",
2986
+ "dev": true
2987
+ },
2988
+ "tar": {
2989
+ "version": "2.2.1",
2990
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
2991
+ "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
2992
+ "dev": true,
2993
+ "optional": true,
2994
+ "requires": {
2995
+ "block-stream": "0.0.9",
2996
+ "fstream": "1.0.11",
2997
+ "inherits": "2.0.3"
2998
+ }
2999
+ },
3000
+ "tar-fs": {
3001
+ "version": "1.16.0",
3002
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.0.tgz",
3003
+ "integrity": "sha512-I9rb6v7mjWLtOfCau9eH5L7sLJyU2BnxtEZRQ5Mt+eRKmf1F0ohXmT/Jc3fr52kDvjJ/HV5MH3soQfPL5bQ0Yg==",
3004
+ "dev": true,
3005
+ "optional": true,
3006
+ "requires": {
3007
+ "chownr": "1.0.1",
3008
+ "mkdirp": "0.5.1",
3009
+ "pump": "1.0.3",
3010
+ "tar-stream": "1.5.5"
3011
+ }
3012
+ },
3013
+ "tar-stream": {
3014
+ "version": "1.5.5",
3015
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz",
3016
+ "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==",
3017
+ "dev": true,
3018
+ "requires": {
3019
+ "bl": "1.2.1",
3020
+ "end-of-stream": "1.4.0",
3021
+ "readable-stream": "2.3.3",
3022
+ "xtend": "4.0.1"
3023
+ }
3024
+ },
3025
+ "text-table": {
3026
+ "version": "0.2.0",
3027
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
3028
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
3029
+ "dev": true
3030
+ },
3031
+ "time-grunt": {
3032
+ "version": "1.1.1",
3033
+ "resolved": "https://registry.npmjs.org/time-grunt/-/time-grunt-1.1.1.tgz",
3034
+ "integrity": "sha1-8YW6AAkdu+xmY6Y2cKqr+OcXlM8=",
3035
+ "dev": true,
3036
+ "requires": {
3037
+ "chalk": "1.1.3",
3038
+ "date-time": "1.1.0",
3039
+ "figures": "1.7.0",
3040
+ "hooker": "0.2.3",
3041
+ "pretty-ms": "1.4.0",
3042
+ "text-table": "0.2.0"
3043
+ },
3044
+ "dependencies": {
3045
+ "ansi-regex": {
3046
+ "version": "2.1.1",
3047
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
3048
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
3049
+ "dev": true
3050
+ },
3051
+ "ansi-styles": {
3052
+ "version": "2.2.1",
3053
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
3054
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
3055
+ "dev": true
3056
+ },
3057
+ "chalk": {
3058
+ "version": "1.1.3",
3059
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
3060
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
3061
+ "dev": true,
3062
+ "requires": {
3063
+ "ansi-styles": "2.2.1",
3064
+ "escape-string-regexp": "1.0.5",
3065
+ "has-ansi": "2.0.0",
3066
+ "strip-ansi": "3.0.1",
3067
+ "supports-color": "2.0.0"
3068
+ }
3069
+ },
3070
+ "has-ansi": {
3071
+ "version": "2.0.0",
3072
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
3073
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
3074
+ "dev": true,
3075
+ "requires": {
3076
+ "ansi-regex": "2.1.1"
3077
+ }
3078
+ },
3079
+ "strip-ansi": {
3080
+ "version": "3.0.1",
3081
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
3082
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
3083
+ "dev": true,
3084
+ "requires": {
3085
+ "ansi-regex": "2.1.1"
3086
+ }
3087
+ },
3088
+ "supports-color": {
3089
+ "version": "2.0.0",
3090
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
3091
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
3092
+ "dev": true
3093
+ }
3094
+ }
3095
+ },
3096
+ "time-zone": {
3097
+ "version": "0.1.0",
3098
+ "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-0.1.0.tgz",
3099
+ "integrity": "sha1-Sncotqwo2w4Aj1FAQ/1VW9VXO0Y=",
3100
+ "dev": true
3101
+ },
3102
+ "tough-cookie": {
3103
+ "version": "2.3.3",
3104
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
3105
+ "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
3106
+ "dev": true,
3107
+ "optional": true,
3108
+ "requires": {
3109
+ "punycode": "1.4.1"
3110
+ }
3111
+ },
3112
+ "trim-newlines": {
3113
+ "version": "1.0.0",
3114
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
3115
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
3116
+ "dev": true
3117
+ },
3118
+ "tunnel-agent": {
3119
+ "version": "0.6.0",
3120
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
3121
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
3122
+ "dev": true,
3123
+ "requires": {
3124
+ "safe-buffer": "5.1.1"
3125
+ }
3126
+ },
3127
+ "tweetnacl": {
3128
+ "version": "0.14.5",
3129
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
3130
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
3131
+ "dev": true,
3132
+ "optional": true
3133
+ },
3134
+ "typechecker": {
3135
+ "version": "4.4.1",
3136
+ "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-4.4.1.tgz",
3137
+ "integrity": "sha1-+XuV9RsDhBchLWd9RaNz7nvO1+Y=",
3138
+ "dev": true,
3139
+ "requires": {
3140
+ "editions": "1.3.3"
3141
+ }
3142
+ },
3143
+ "typedarray": {
3144
+ "version": "0.0.6",
3145
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
3146
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
3147
+ "dev": true
3148
+ },
3149
+ "uglify-js": {
3150
+ "version": "2.4.24",
3151
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz",
3152
+ "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=",
3153
+ "dev": true,
3154
+ "requires": {
3155
+ "async": "0.2.10",
3156
+ "source-map": "0.1.34",
3157
+ "uglify-to-browserify": "1.0.2",
3158
+ "yargs": "3.5.4"
3159
+ },
3160
+ "dependencies": {
3161
+ "async": {
3162
+ "version": "0.2.10",
3163
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
3164
+ "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
3165
+ "dev": true
3166
+ },
3167
+ "source-map": {
3168
+ "version": "0.1.34",
3169
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz",
3170
+ "integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=",
3171
+ "dev": true,
3172
+ "requires": {
3173
+ "amdefine": "1.0.1"
3174
+ }
3175
+ }
3176
+ }
3177
+ },
3178
+ "uglify-to-browserify": {
3179
+ "version": "1.0.2",
3180
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
3181
+ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
3182
+ "dev": true
3183
+ },
3184
+ "underscore": {
3185
+ "version": "1.7.0",
3186
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
3187
+ "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
3188
+ "dev": true
3189
+ },
3190
+ "underscore.string": {
3191
+ "version": "3.2.3",
3192
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz",
3193
+ "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=",
3194
+ "dev": true
3195
+ },
3196
+ "unzip-response": {
3197
+ "version": "1.0.2",
3198
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz",
3199
+ "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=",
3200
+ "dev": true,
3201
+ "optional": true
3202
+ },
3203
+ "util-deprecate": {
3204
+ "version": "1.0.2",
3205
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
3206
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
3207
+ "dev": true
3208
+ },
3209
+ "uuid": {
3210
+ "version": "3.1.0",
3211
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
3212
+ "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==",
3213
+ "dev": true,
3214
+ "optional": true
3215
+ },
3216
+ "validate-npm-package-license": {
3217
+ "version": "3.0.1",
3218
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
3219
+ "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
3220
+ "dev": true,
3221
+ "requires": {
3222
+ "spdx-correct": "1.0.2",
3223
+ "spdx-expression-parse": "1.0.4"
3224
+ }
3225
+ },
3226
+ "verror": {
3227
+ "version": "1.10.0",
3228
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
3229
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
3230
+ "dev": true,
3231
+ "optional": true,
3232
+ "requires": {
3233
+ "assert-plus": "1.0.0",
3234
+ "core-util-is": "1.0.2",
3235
+ "extsprintf": "1.3.0"
3236
+ }
3237
+ },
3238
+ "walkdir": {
3239
+ "version": "0.0.11",
3240
+ "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz",
3241
+ "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=",
3242
+ "dev": true
3243
+ },
3244
+ "which": {
3245
+ "version": "1.2.14",
3246
+ "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz",
3247
+ "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=",
3248
+ "dev": true,
3249
+ "requires": {
3250
+ "isexe": "2.0.0"
3251
+ }
3252
+ },
3253
+ "wide-align": {
3254
+ "version": "1.1.2",
3255
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
3256
+ "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
3257
+ "dev": true,
3258
+ "requires": {
3259
+ "string-width": "1.0.2"
3260
+ }
3261
+ },
3262
+ "window-size": {
3263
+ "version": "0.1.0",
3264
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
3265
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
3266
+ "dev": true
3267
+ },
3268
+ "wordwrap": {
3269
+ "version": "0.0.2",
3270
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
3271
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
3272
+ "dev": true
3273
+ },
3274
+ "wrappy": {
3275
+ "version": "1.0.2",
3276
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
3277
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
3278
+ "dev": true
3279
+ },
3280
+ "xtend": {
3281
+ "version": "4.0.1",
3282
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
3283
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
3284
+ "dev": true
3285
+ },
3286
+ "yargs": {
3287
+ "version": "3.5.4",
3288
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz",
3289
+ "integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=",
3290
+ "dev": true,
3291
+ "requires": {
3292
+ "camelcase": "1.2.1",
3293
+ "decamelize": "1.2.0",
3294
+ "window-size": "0.1.0",
3295
+ "wordwrap": "0.0.2"
3296
+ },
3297
+ "dependencies": {
3298
+ "camelcase": {
3299
+ "version": "1.2.1",
3300
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
3301
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
3302
+ "dev": true
3303
+ }
3304
+ }
3305
+ },
3306
+ "zip-stream": {
3307
+ "version": "1.2.0",
3308
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz",
3309
+ "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=",
3310
+ "dev": true,
3311
+ "requires": {
3312
+ "archiver-utils": "1.3.0",
3313
+ "compress-commons": "1.2.2",
3314
+ "lodash": "4.17.4",
3315
+ "readable-stream": "2.3.3"
3316
+ },
3317
+ "dependencies": {
3318
+ "lodash": {
3319
+ "version": "4.17.4",
3320
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
3321
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
3322
+ "dev": true
3323
+ }
3324
+ }
3325
+ },
3326
+ "zlib-browserify": {
3327
+ "version": "0.0.1",
3328
+ "resolved": "https://registry.npmjs.org/zlib-browserify/-/zlib-browserify-0.0.1.tgz",
3329
+ "integrity": "sha1-T6akXQDbwV8xikr6HZr8Aljhdsw=",
3330
+ "dev": true
3331
+ }
3332
+ }
3333
+ }
readme.txt CHANGED
@@ -9,12 +9,14 @@ License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
  Tags: staging, duplication, cloning, clone, migration, sandbox, test site, testing, backup, post, admin, administration, duplicate posts
10
  Requires at least: 3.6+
11
  Tested up to: 4.9
12
- Stable tag: 2.1.5
13
 
14
  A duplicator plugin! Clone, duplicate and migrate live sites to independent staging and development sites that are available only to administrators.
15
 
16
  == Description ==
17
 
 
 
18
  <strong>This cloning and staging plugin is well tested but work in progress. <br><br>
19
  If you find any issue, please open a [support ticket](https://wp-staging.com/support/ "support ticket").
20
  </strong>
@@ -139,6 +141,12 @@ https://wp-staging.com
139
 
140
  == Changelog ==
141
 
 
 
 
 
 
 
142
  = 2.1.5 =
143
  * Fix. Change link to support
144
  * Fix: Missing files in clone site if copy file limit is higher than 1
@@ -283,5 +291,5 @@ Complete changelog: [https://wp-staging.com/changelog.txt](https://wp-staging.co
283
 
284
  == Upgrade Notice ==
285
 
286
- = 2.1.2 =
287
- 2.1.2 * Lot of modifications to increase speed and reliability for crewating staging sites
9
  Tags: staging, duplication, cloning, clone, migration, sandbox, test site, testing, backup, post, admin, administration, duplicate posts
10
  Requires at least: 3.6+
11
  Tested up to: 4.9
12
+ Stable tag: 2.1.6
13
 
14
  A duplicator plugin! Clone, duplicate and migrate live sites to independent staging and development sites that are available only to administrators.
15
 
16
  == Description ==
17
 
18
+ <strong>User of WP Super Cache? Than you need to exclude the WP Super Cache plugin from the WP Staging cloning process or the staging site will throw an error! This will be fixed with next WP Super Cache Update</strong>
19
+ <br/>
20
  <strong>This cloning and staging plugin is well tested but work in progress. <br><br>
21
  If you find any issue, please open a [support ticket](https://wp-staging.com/support/ "support ticket").
22
  </strong>
141
 
142
  == Changelog ==
143
 
144
+ = 2.1.6 =
145
+ * New: increased speed for cloning process by factor 5, using new method of file agregation
146
+ * New: Skip files larger than 8MB
147
+ * Fix: Additional checks to ensure that the root path is never deleted
148
+ * New: Compatible up to WP 4.9.1
149
+
150
  = 2.1.5 =
151
  * Fix. Change link to support
152
  * Fix: Missing files in clone site if copy file limit is higher than 1
291
 
292
  == Upgrade Notice ==
293
 
294
+ = 2.1.6 =
295
+ 2.1.6 * * Fix: Additional checks to ensure that the root path is never deleted
wp-staging.php CHANGED
@@ -1,91 +1,91 @@
1
- <?php
2
-
3
- /**
4
- * Plugin Name: WP Staging
5
- * Plugin URI: https://wordpress.org/plugins/wp-staging
6
- * Description: Create a staging clone site for testing & developing
7
- * Author: WP-Staging
8
- * Author URI: https://wp-staging.com
9
- * Contributors: ReneHermi, ilgityildirim
10
- * Version: 2.1.5
11
- * Text Domain: wpstg
12
- * Domain Path: /languages/
13
-
14
- *
15
- * WP-Staging is free software: you can redistribute it and/or modify
16
- * it under the terms of the GNU General Public License as published by
17
- * the Free Software Foundation, either version 2 of the License, or
18
- * any later version.
19
- *
20
- * WP-Staging is distributed in the hope that it will be useful,
21
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
22
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23
- * GNU General Public License for more details.
24
- *
25
- * You should have received a copy of the GNU General Public License
26
- * along with Staging. If not, see <http://www.gnu.org/licenses/>.
27
- *
28
- * @package WPSTG
29
- * @category Core
30
- * @author René Hermenau, Ilgıt Yıldırım
31
- */
32
-
33
- // No Direct Access
34
- if (!defined("WPINC"))
35
- {
36
- die;
37
- }
38
-
39
- // Plugin Folder Path
40
- if( !defined( 'WPSTG_PLUGIN_DIR' ) ) {
41
- define( 'WPSTG_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
42
- }
43
- // Plugin Folder URL
44
- if( !defined( 'WPSTG_PLUGIN_URL' ) ) {
45
- define( 'WPSTG_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
46
- }
47
-
48
-
49
- /**
50
- * Fix nonce check
51
- * https://core.trac.wordpress.org/ticket/41617#ticket
52
- * @param int $seconds
53
- * @return int
54
- */
55
- function wpstg_overwrite_nonce($seconds){
56
- return 86400;
57
- }
58
- add_filter('nonce_life', 'wpstg_overwrite_nonce', 99999);
59
-
60
- /**
61
- * Path to main WP Staging class
62
- * Make sure to not redeclare class in case free version has been installed previosly
63
- */
64
- if (!class_exists( 'WPStaging\WPStaging' )){
65
- require_once plugin_dir_path(__FILE__) . "apps/Core/WPStaging.php";
66
- }
67
-
68
- $wpStaging = \WPStaging\WPStaging::getInstance();
69
-
70
- /**
71
- * Load a few important WP globals into WPStaging class to make them available via dependancy injection
72
- */
73
-
74
- // Wordpress DB Object
75
- if (isset($wpdb))
76
- {
77
- $wpStaging->set("wpdb", $wpdb);
78
- }
79
-
80
- // WordPress Filter Object
81
- if (isset($wp_filter))
82
- {
83
- $wpStaging->set("wp_filter", function() use(&$wp_filter) {
84
- return $wp_filter;
85
- });
86
- }
87
-
88
- /**
89
- * Inititalize WPStaging
90
- */
91
- $wpStaging->run();
1
+ <?php
2
+
3
+ /**
4
+ * Plugin Name: WP Staging
5
+ * Plugin URI: https://wordpress.org/plugins/wp-staging
6
+ * Description: Create a staging clone site for testing & developing
7
+ * Author: WP-Staging
8
+ * Author URI: https://wp-staging.com
9
+ * Contributors: ReneHermi, ilgityildirim
10
+ * Version: 2.1.6
11
+ * Text Domain: wpstg
12
+ * Domain Path: /languages/
13
+
14
+ *
15
+ * WP-Staging is free software: you can redistribute it and/or modify
16
+ * it under the terms of the GNU General Public License as published by
17
+ * the Free Software Foundation, either version 2 of the License, or
18
+ * any later version.
19
+ *
20
+ * WP-Staging is distributed in the hope that it will be useful,
21
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
22
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23
+ * GNU General Public License for more details.
24
+ *
25
+ * You should have received a copy of the GNU General Public License
26
+ * along with Staging. If not, see <http://www.gnu.org/licenses/>.
27
+ *
28
+ * @package WPSTG
29
+ * @category Core
30
+ * @author René Hermenau, Ilgıt Yıldırım
31
+ */
32
+
33
+ // No Direct Access
34
+ if (!defined("WPINC"))
35
+ {
36
+ die;
37
+ }
38
+
39
+ // Plugin Folder Path
40
+ if( !defined( 'WPSTG_PLUGIN_DIR' ) ) {
41
+ define( 'WPSTG_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
42
+ }
43
+ // Plugin Folder URL
44
+ if( !defined( 'WPSTG_PLUGIN_URL' ) ) {
45
+ define( 'WPSTG_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
46
+ }
47
+
48
+
49
+ /**
50
+ * Fix nonce check
51
+ * https://core.trac.wordpress.org/ticket/41617#ticket
52
+ * @param int $seconds
53
+ * @return int
54
+ */
55
+ function wpstg_overwrite_nonce($seconds){
56
+ return 86400;
57
+ }
58
+ add_filter('nonce_life', 'wpstg_overwrite_nonce', 99999);
59
+
60
+ /**
61
+ * Path to main WP Staging class
62
+ * Make sure to not redeclare class in case free version has been installed previosly
63
+ */
64
+ if (!class_exists( 'WPStaging\WPStaging' )){
65
+ require_once plugin_dir_path(__FILE__) . "apps/Core/WPStaging.php";
66
+ }
67
+
68
+ $wpStaging = \WPStaging\WPStaging::getInstance();
69
+
70
+ /**
71
+ * Load a few important WP globals into WPStaging class to make them available via dependancy injection
72
+ */
73
+
74
+ // Wordpress DB Object
75
+ if (isset($wpdb))
76
+ {
77
+ $wpStaging->set("wpdb", $wpdb);
78
+ }
79
+
80
+ // WordPress Filter Object
81
+ if (isset($wp_filter))
82
+ {
83
+ $wpStaging->set("wp_filter", function() use(&$wp_filter) {
84
+ return $wp_filter;
85
+ });
86
+ }
87
+
88
+ /**
89
+ * Inititalize WPStaging
90
+ */
91
+ $wpStaging->run();