Members - Version 3.0.0

Version Description

If upgrading from a version prior to 2.0.0, please note that the plugin now requires PHP 5.3.0 or later.

Download this release

Release Info

Developer caseproof
Plugin Icon 128x128 Members
Version 3.0.0
Comparing to
See all releases

Code changes from version 2.2.0 to 3.0.0

Files changed (158) hide show
  1. addons/members-acf-integration/.gitignore +6 -0
  2. addons/members-acf-integration/addon.php +43 -0
  3. addons/members-acf-integration/changelog.md +7 -0
  4. addons/members-acf-integration/package-lock.json +235 -0
  5. addons/members-acf-integration/package.json +23 -0
  6. addons/members-acf-integration/readme.md +19 -0
  7. addons/members-acf-integration/src/Activator.php +47 -0
  8. addons/members-acf-integration/src/Plugin.php +385 -0
  9. addons/members-acf-integration/src/functions-caps.php +60 -0
  10. addons/members-acf-integration/src/functions-roles.php +44 -0
  11. addons/members-admin-access/.gitignore +2 -0
  12. addons/members-admin-access/addon.php +3 -0
  13. addons/members-admin-access/app/class-app.php +55 -0
  14. addons/members-admin-access/app/class-view-settings.php +193 -0
  15. addons/members-admin-access/app/functions-admin.php +64 -0
  16. addons/members-admin-access/app/functions.php +194 -0
  17. addons/members-admin-access/bootstrap/app.php +47 -0
  18. addons/members-admin-access/changelog.md +14 -0
  19. addons/members-admin-access/config/app.php +37 -0
  20. addons/members-admin-access/contributing.md +31 -0
  21. addons/members-admin-access/license.md +339 -0
  22. addons/members-admin-access/package-lock.json +804 -0
  23. addons/members-admin-access/package.json +29 -0
  24. addons/members-admin-access/readme.md +39 -0
  25. addons/members-admin-access/resources/build/dist.js +23 -0
  26. addons/members-admin-access/resources/build/i18n.js +3 -0
  27. addons/members-block-permissions/.gitignore +4 -0
  28. addons/members-block-permissions/addon.php +47 -0
  29. addons/members-block-permissions/changelog.md +7 -0
  30. addons/members-block-permissions/composer.json +26 -0
  31. addons/members-block-permissions/package-lock.json +9914 -0
  32. addons/members-block-permissions/package.json +36 -0
  33. addons/members-block-permissions/public/css/editor.css +1 -0
  34. addons/members-block-permissions/public/js/editor.js +1 -0
  35. addons/members-block-permissions/public/js/upsell.js +1 -0
  36. addons/members-block-permissions/public/mix-manifest.json +5 -0
  37. addons/members-block-permissions/readme.md +61 -0
  38. addons/members-block-permissions/resources/js/editor.js +12 -0
  39. addons/members-block-permissions/resources/js/editor/controls/cap-text-input.js +46 -0
  40. addons/members-block-permissions/resources/js/editor/controls/condition-select.js +66 -0
  41. addons/members-block-permissions/resources/js/editor/controls/message-textarea.js +47 -0
  42. addons/members-block-permissions/resources/js/editor/controls/role-checkbox.js +56 -0
  43. addons/members-block-permissions/resources/js/editor/controls/role-checklist.js +56 -0
  44. addons/members-block-permissions/resources/js/editor/controls/type-select.js +71 -0
  45. addons/members-block-permissions/resources/js/editor/controls/upgrade-prompt.js +31 -0
  46. addons/members-block-permissions/resources/js/editor/controls/user-status-select.js +47 -0
  47. addons/members-block-permissions/resources/js/editor/filter-block-edit.js +131 -0
  48. addons/members-block-permissions/resources/js/editor/filter-block-register.js +38 -0
  49. addons/members-block-permissions/resources/js/editor/filter-block-upsell.js +54 -0
  50. addons/members-block-permissions/resources/js/editor/notices/not-allowed.js +28 -0
  51. addons/members-block-permissions/resources/js/editor/styles/upgrade-prompt.css +23 -0
  52. addons/members-block-permissions/resources/js/upsell.js +10 -0
  53. addons/members-block-permissions/resources/lang/members-block-permissions.pot +109 -0
  54. addons/members-block-permissions/resources/scss/editor.scss +32 -0
  55. addons/members-block-permissions/src/Activator.php +42 -0
  56. addons/members-block-permissions/src/Block.php +265 -0
  57. addons/members-block-permissions/src/Editor.php +152 -0
  58. addons/members-block-permissions/src/Integration.php +55 -0
  59. addons/members-block-permissions/src/Plugin.php +190 -0
  60. addons/members-block-permissions/webpack.mix.export.js +58 -0
  61. addons/members-block-permissions/webpack.mix.js +61 -0
  62. addons/members-category-and-tag-caps/.gitignore +6 -0
  63. addons/members-category-and-tag-caps/addon.php +23 -0
  64. addons/members-category-and-tag-caps/changelog.md +7 -0
  65. addons/members-category-and-tag-caps/readme.md +24 -0
  66. addons/members-category-and-tag-caps/src/Activator.php +51 -0
  67. addons/members-category-and-tag-caps/src/functions-filters.php +101 -0
  68. addons/members-category-and-tag-caps/uninstall.php +55 -0
  69. addons/members-core-create-caps/addon.php +113 -0
  70. addons/members-core-create-caps/changelog.md +7 -0
  71. addons/members-core-create-caps/contributing.md +31 -0
  72. addons/members-core-create-caps/license.md +339 -0
  73. addons/members-core-create-caps/readme.md +36 -0
  74. addons/members-edd-integration/.gitignore +6 -0
  75. addons/members-edd-integration/addon.php +11 -0
  76. addons/members-edd-integration/changelog.md +7 -0
  77. addons/members-edd-integration/package-lock.json +227 -0
  78. addons/members-edd-integration/package.json +23 -0
  79. addons/members-edd-integration/readme.md +27 -0
  80. addons/members-edd-integration/src/functions-caps.php +341 -0
  81. addons/members-edd-integration/src/functions-filters.php +99 -0
  82. addons/members-edd-integration/src/functions-roles.php +60 -0
  83. addons/members-givewp-integration/.gitignore +6 -0
  84. addons/members-givewp-integration/addon.php +11 -0
  85. addons/members-givewp-integration/changelog.md +7 -0
  86. addons/members-givewp-integration/package-lock.json +235 -0
  87. addons/members-givewp-integration/package.json +23 -0
  88. addons/members-givewp-integration/readme.md +28 -0
  89. addons/members-givewp-integration/src/functions-caps.php +230 -0
  90. addons/members-givewp-integration/src/functions-filters.php +98 -0
  91. addons/members-givewp-integration/src/functions-roles.php +64 -0
  92. addons/members-meta-box-integration/.gitignore +6 -0
  93. addons/members-meta-box-integration/addon.php +43 -0
  94. addons/members-meta-box-integration/changelog.md +7 -0
  95. addons/members-meta-box-integration/package-lock.json +227 -0
  96. addons/members-meta-box-integration/package.json +23 -0
  97. addons/members-meta-box-integration/readme.md +24 -0
  98. addons/members-meta-box-integration/src/Activator.php +45 -0
  99. addons/members-meta-box-integration/src/Plugin.php +171 -0
  100. addons/members-meta-box-integration/src/functions-caps.php +50 -0
  101. addons/members-meta-box-integration/src/functions-roles.php +43 -0
  102. addons/members-privacy-caps/.gitignore +2 -0
  103. addons/members-privacy-caps/addon.php +100 -0
  104. addons/members-privacy-caps/changelog.md +7 -0
  105. addons/members-privacy-caps/contributing.md +31 -0
  106. addons/members-privacy-caps/license.md +339 -0
  107. addons/members-privacy-caps/package-lock.json +813 -0
  108. addons/members-privacy-caps/package.json +29 -0
  109. addons/members-privacy-caps/readme.md +50 -0
  110. addons/members-privacy-caps/resources/build/dist.js +23 -0
  111. addons/members-privacy-caps/resources/build/i18n.js +3 -0
  112. addons/members-role-hierarchy/addon.php +117 -0
  113. addons/members-role-hierarchy/admin/class-edit-role.php +162 -0
  114. addons/members-role-hierarchy/admin/class-manage-roles.php +125 -0
  115. addons/members-role-hierarchy/admin/functions-settings.php +90 -0
  116. addons/members-role-hierarchy/changelog.md +7 -0
  117. addons/members-role-hierarchy/contributing.md +31 -0
  118. addons/members-role-hierarchy/inc/functions-filters.php +83 -0
  119. addons/members-role-hierarchy/inc/functions-options.php +57 -0
  120. addons/members-role-hierarchy/inc/functions-position.php +238 -0
  121. addons/members-role-hierarchy/license.md +339 -0
  122. addons/members-role-hierarchy/readme.md +49 -0
  123. addons/members-role-hierarchy/readme.txt +62 -0
  124. addons/members-role-hierarchy/screenshot-1.png +0 -0
  125. addons/members-role-levels/addon.php +93 -0
  126. addons/members-role-levels/admin/class-column-level.php +122 -0
  127. addons/members-role-levels/admin/class-meta-box-level.php +180 -0
  128. addons/members-role-levels/admin/functions-helpers.php +158 -0
  129. addons/members-role-levels/changelog.md +7 -0
  130. addons/members-role-levels/contributing.md +31 -0
  131. addons/members-role-levels/license.md +339 -0
  132. addons/members-role-levels/readme.md +53 -0
  133. addons/members-role-levels/screenshot-1.png +0 -0
  134. addons/members-role-levels/screenshot-2.png +0 -0
  135. addons/members-role-levels/screenshot-3.png +0 -0
  136. addons/members-woocommerce-integration/.gitignore +6 -0
  137. addons/members-woocommerce-integration/addon.php +11 -0
  138. addons/members-woocommerce-integration/changelog.md +7 -0
  139. addons/members-woocommerce-integration/package-lock.json +227 -0
  140. addons/members-woocommerce-integration/package.json +23 -0
  141. addons/members-woocommerce-integration/readme.md +24 -0
  142. addons/members-woocommerce-integration/src/functions-caps.php +273 -0
  143. addons/members-woocommerce-integration/src/functions-filters.php +101 -0
  144. addons/members-woocommerce-integration/src/functions-roles.php +59 -0
  145. admin/class-addon.php +179 -173
  146. admin/class-cap-control.php +132 -132
  147. admin/class-cap-section.php +119 -119
  148. admin/class-cap-tabs.php +262 -262
  149. admin/class-manage-roles.php +170 -169
  150. admin/class-manage-users.php +466 -466
  151. admin/class-meta-box-content-permissions.php +0 -0
  152. admin/class-meta-box-custom-cap.php +110 -110
  153. admin/class-meta-box-publish-role.php +169 -169
  154. admin/class-role-edit.php +353 -353
  155. admin/class-role-list-table.php +512 -512
  156. admin/class-role-new.php +418 -401
  157. admin/class-roles.php +313 -313
  158. admin/class-settings.php +667 -329
addons/members-acf-integration/.gitignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ /node_modules
2
+ /vendor
3
+ /composer.lock
4
+ /phpcs.xml
5
+ /.phpcs.xml
6
+ *.map
addons/members-acf-integration/addon.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Members\Integration\ACF;
4
+
5
+ # Don't execute code if file is file is accessed directly.
6
+ defined( 'ABSPATH' ) || exit;
7
+
8
+ /**
9
+ * Registers the plugin activation callback.
10
+ *
11
+ * @since 1.0.0
12
+ * @access public
13
+ * @return void
14
+ */
15
+ register_activation_hook( __FILE__, function() {
16
+ require_once 'src/Activator.php';
17
+ Activator::activate();
18
+ } );
19
+
20
+ /**
21
+ * Wrapper for the plugin instance.
22
+ *
23
+ * @since 1.0.0
24
+ * @access public
25
+ * @return void
26
+ */
27
+ function plugin() {
28
+ static $instance = null;
29
+
30
+ if ( is_null( $instance ) ) {
31
+ $instance = new Plugin();
32
+ }
33
+
34
+ return $instance;
35
+ }
36
+
37
+ # Bootstrap plugin.
38
+ require_once 'src/Plugin.php';
39
+ require_once 'src/functions-caps.php';
40
+ require_once 'src/functions-roles.php';
41
+
42
+ # Boot the plugin.
43
+ plugin()->boot();
addons/members-acf-integration/changelog.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ # Change Log
2
+
3
+ ## [1.0.0] - 2019-08-07
4
+
5
+ ### Added
6
+
7
+ - Plugin launch. Everything's new!
addons/members-acf-integration/package-lock.json ADDED
@@ -0,0 +1,235 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-acf-integration",
3
+ "requires": true,
4
+ "lockfileVersion": 1,
5
+ "dependencies": {
6
+ "balanced-match": {
7
+ "version": "1.0.0",
8
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
9
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
10
+ "dev": true
11
+ },
12
+ "bluebird": {
13
+ "version": "3.5.5",
14
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
15
+ "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
16
+ "dev": true
17
+ },
18
+ "brace-expansion": {
19
+ "version": "1.1.11",
20
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
21
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
22
+ "dev": true,
23
+ "requires": {
24
+ "balanced-match": "^1.0.0",
25
+ "concat-map": "0.0.1"
26
+ }
27
+ },
28
+ "concat-map": {
29
+ "version": "0.0.1",
30
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
31
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
32
+ "dev": true
33
+ },
34
+ "encoding": {
35
+ "version": "0.1.12",
36
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
37
+ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
38
+ "dev": true,
39
+ "requires": {
40
+ "iconv-lite": "~0.4.13"
41
+ }
42
+ },
43
+ "fs.realpath": {
44
+ "version": "1.0.0",
45
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
46
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
47
+ "dev": true
48
+ },
49
+ "gettext-parser": {
50
+ "version": "3.1.1",
51
+ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-3.1.1.tgz",
52
+ "integrity": "sha512-vNhWcqXEtZPs5Ft1ReA34g7ByWotpcOIeJvXVy2jF3/G2U9v6W0wG4Z4hXzcU8R//jArqkgHcVCGgGqa4vxVlQ==",
53
+ "dev": true,
54
+ "requires": {
55
+ "encoding": "^0.1.12",
56
+ "readable-stream": "^3.2.0",
57
+ "safe-buffer": "^5.1.2"
58
+ }
59
+ },
60
+ "glob": {
61
+ "version": "7.1.4",
62
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
63
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
64
+ "dev": true,
65
+ "requires": {
66
+ "fs.realpath": "^1.0.0",
67
+ "inflight": "^1.0.4",
68
+ "inherits": "2",
69
+ "minimatch": "^3.0.4",
70
+ "once": "^1.3.0",
71
+ "path-is-absolute": "^1.0.0"
72
+ }
73
+ },
74
+ "iconv-lite": {
75
+ "version": "0.4.24",
76
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
77
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
78
+ "dev": true,
79
+ "requires": {
80
+ "safer-buffer": ">= 2.1.2 < 3"
81
+ }
82
+ },
83
+ "inflight": {
84
+ "version": "1.0.6",
85
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
86
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
87
+ "dev": true,
88
+ "requires": {
89
+ "once": "^1.3.0",
90
+ "wrappy": "1"
91
+ }
92
+ },
93
+ "inherits": {
94
+ "version": "2.0.4",
95
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
96
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
97
+ "dev": true
98
+ },
99
+ "lodash": {
100
+ "version": "4.17.15",
101
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
102
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
103
+ "dev": true
104
+ },
105
+ "minimatch": {
106
+ "version": "3.0.4",
107
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
108
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
109
+ "dev": true,
110
+ "requires": {
111
+ "brace-expansion": "^1.1.7"
112
+ }
113
+ },
114
+ "minimist": {
115
+ "version": "1.2.0",
116
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
117
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
118
+ "dev": true
119
+ },
120
+ "mkdirp": {
121
+ "version": "0.5.1",
122
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
123
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
124
+ "dev": true,
125
+ "requires": {
126
+ "minimist": "0.0.8"
127
+ },
128
+ "dependencies": {
129
+ "minimist": {
130
+ "version": "0.0.8",
131
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
132
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
133
+ "dev": true
134
+ }
135
+ }
136
+ },
137
+ "node-wp-i18n": {
138
+ "version": "1.2.3",
139
+ "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.2.3.tgz",
140
+ "integrity": "sha512-YMzMcsjXbGYDB9vHyb289CYXAGmXhcNLbeTlOnWgPNkZd9xrovcbRd7cQyKd9BQHOjS7Nw8WCbJ7nvtR7rc0rg==",
141
+ "dev": true,
142
+ "requires": {
143
+ "bluebird": "^3.4.1",
144
+ "gettext-parser": "^3.1.0",
145
+ "glob": "^7.0.5",
146
+ "lodash": "^4.14.2",
147
+ "minimist": "^1.2.0",
148
+ "mkdirp": "^0.5.1",
149
+ "tmp": "^0.0.33"
150
+ }
151
+ },
152
+ "once": {
153
+ "version": "1.4.0",
154
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
155
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
156
+ "dev": true,
157
+ "requires": {
158
+ "wrappy": "1"
159
+ }
160
+ },
161
+ "os-tmpdir": {
162
+ "version": "1.0.2",
163
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
164
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
165
+ "dev": true
166
+ },
167
+ "path-is-absolute": {
168
+ "version": "1.0.1",
169
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
170
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
171
+ "dev": true
172
+ },
173
+ "readable-stream": {
174
+ "version": "3.4.0",
175
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
176
+ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
177
+ "dev": true,
178
+ "requires": {
179
+ "inherits": "^2.0.3",
180
+ "string_decoder": "^1.1.1",
181
+ "util-deprecate": "^1.0.1"
182
+ }
183
+ },
184
+ "safe-buffer": {
185
+ "version": "5.2.0",
186
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
187
+ "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
188
+ "dev": true
189
+ },
190
+ "safer-buffer": {
191
+ "version": "2.1.2",
192
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
193
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
194
+ "dev": true
195
+ },
196
+ "string_decoder": {
197
+ "version": "1.2.0",
198
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz",
199
+ "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==",
200
+ "dev": true,
201
+ "requires": {
202
+ "safe-buffer": "~5.1.0"
203
+ },
204
+ "dependencies": {
205
+ "safe-buffer": {
206
+ "version": "5.1.2",
207
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
208
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
209
+ "dev": true
210
+ }
211
+ }
212
+ },
213
+ "tmp": {
214
+ "version": "0.0.33",
215
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
216
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
217
+ "dev": true,
218
+ "requires": {
219
+ "os-tmpdir": "~1.0.2"
220
+ }
221
+ },
222
+ "util-deprecate": {
223
+ "version": "1.0.2",
224
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
225
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
226
+ "dev": true
227
+ },
228
+ "wrappy": {
229
+ "version": "1.0.2",
230
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
231
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
232
+ "dev": true
233
+ }
234
+ }
235
+ }
addons/members-acf-integration/package.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-acf-integration",
3
+ "author": "Justin Tadlock",
4
+ "license": "GPL-2.0+",
5
+ "homepage": "https://themehybrid.com/plugins/members-acf-integration",
6
+ "main": "resources/js/app.js",
7
+ "scripts": {
8
+ "i18n": "npm run i18n:textdomain && npm run i18n:pot",
9
+ "i18n:textdomain": "npx wpi18n addtextdomain --exclude=vendor,node_modules",
10
+ "i18n:pot": "npx wpi18n makepot --domain-path=/resources/lang"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/justintadlock/members-acf-integration.git"
15
+ },
16
+ "bugs": {
17
+ "url": "https://github.com/justintadlock/members-acf-integration/issues"
18
+ },
19
+ "devDependencies": {
20
+ "node-wp-i18n": "^1.2.3"
21
+ },
22
+ "dependencies": {}
23
+ }
addons/members-acf-integration/readme.md ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Members - ACF Integration
2
+
3
+ The Members - ACF Integration add-on creates custom capabilities for the [Advanced Custom Fields](https://advancedcustomfields.com) (ACF) plugin for managing with the Members plugin.
4
+
5
+ The [Members plugin](https://themehybrid.com/plugins/members) and the ACF plugin are required to be installed and activated for this plugin to work. The Recurring Donations plugin is optional.
6
+
7
+ ## ACF Role Group
8
+
9
+ The plugin creates a new role group called "Advanced Custom Fields," which is located under the Users > Roles screen in the admin. This role group lists any roles that have ACF-related capabilities.
10
+
11
+ ## ACF Capability Group
12
+
13
+ When editing or creating a new role in Members, this add-on creates a new "Custom Fields" tab (cap group). This tab combines all of the ACF capabilities in one place. That way, you can see all available caps without jumping between different tabs.
14
+
15
+ ## Copyright and License
16
+
17
+ This project is licensed under the [GNU GPL](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html), version 2 or later.
18
+
19
+ 2019 &copy; [Justin Tadlock](http://justintadlock.com).
addons/members-acf-integration/src/Activator.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin Activator.
4
+ *
5
+ * Runs the plugin activation routine.
6
+ *
7
+ * @package MembersIntegrationACF
8
+ * @author Justin Tadlock <justintadlock@gmail.com>
9
+ * @copyright 2019, Justin Tadlock
10
+ * @link https://themehybrid.com/plugins/members-acf-integration
11
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
12
+ */
13
+
14
+ namespace Members\Integration\ACF;
15
+
16
+ /**
17
+ * Activator class.
18
+ *
19
+ * @since 1.0.0
20
+ * @access public
21
+ */
22
+ class Activator {
23
+
24
+ /**
25
+ * Runs necessary code when first activating the plugin.
26
+ *
27
+ * @since 1.0.0
28
+ * @access public
29
+ * @return void
30
+ */
31
+ public static function activate() {
32
+
33
+ // Get the administrator role.
34
+ $role = get_role( 'administrator' );
35
+
36
+ // If the administrator role exists, add required capabilities
37
+ // for the plugin.
38
+ if ( ! empty( $role ) ) {
39
+
40
+ $role->add_cap( 'manage_acf' );
41
+ $role->add_cap( 'edit_acf_field_groups' );
42
+ $role->add_cap( 'edit_others_acf_field_groups' );
43
+ $role->add_cap( 'delete_acf_field_groups' );
44
+ $role->add_cap( 'delete_others_acf_field_groups' );
45
+ }
46
+ }
47
+ }
addons/members-acf-integration/src/Plugin.php ADDED
@@ -0,0 +1,385 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin Filters.
4
+ *
5
+ * @package MembersIntegrationACF
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-acf-integration
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\Integration\ACF;
13
+
14
+ use function acf;
15
+ use function acf_get_setting;
16
+ use function members_register_cap;
17
+ use function members_register_cap_group;
18
+ use function members_register_role_group;
19
+ use function members_unregister_cap_group;
20
+
21
+ class Plugin {
22
+
23
+ /**
24
+ * Bootstrap the plugin.
25
+ *
26
+ * @since 1.0.0
27
+ * @access public
28
+ * @return void
29
+ */
30
+ public function boot() {
31
+
32
+ // Load early to check if ACF is installed.
33
+ add_action( 'plugins_loaded', [ $this, 'load' ], ~PHP_INT_MAX );
34
+ }
35
+
36
+ /**
37
+ * Loads the plugin late.
38
+ *
39
+ * @since 1.0.0
40
+ * @access public
41
+ * @return void
42
+ */
43
+ public function load() {
44
+
45
+ if ( ! function_exists( 'acf' ) ) {
46
+ return;
47
+ }
48
+
49
+ // Load translations.
50
+ add_action( 'plugins_loaded', [ $this, 'loadTextdomain' ] );
51
+
52
+ // Filter the ACF settings capability.
53
+ add_filter( 'acf/settings/capability', [ $this, 'acfSettingsCapability' ] );
54
+
55
+ // Fakes the capability check when saving field groups.
56
+ add_action( 'save_post', [ $this, 'beforeSaveFieldGroup' ], ~PHP_INT_MAX, 2 );
57
+ add_action( 'save_post', [ $this, 'afterSaveFieldGroup' ], PHP_INT_MAX, 2 );
58
+
59
+ // Adjust admin menus.
60
+ add_action( 'admin_menu', [ $this, 'adminMenuBump' ], ~PHP_INT_MAX );
61
+ add_action( 'admin_menu', [ $this, 'adminMenu' ], 9 );
62
+
63
+ // Filter CPT caps for ACF.
64
+ add_filter( 'register_post_type_args', [ $this, 'registerPostTypeArgs' ], 10, 2 );
65
+
66
+ // Register custom roles, caps, and groups.
67
+ add_action( 'members_register_role_groups', [ $this, 'registerRoleGroups' ] );
68
+ add_action( 'members_register_cap_groups', [ $this, 'registerCapGroups' ] );
69
+ add_action( 'members_register_caps', [ $this, 'registerCaps' ] );
70
+ }
71
+
72
+ /**
73
+ * Load the plugin textdomain.
74
+ *
75
+ * @since 1.0.0
76
+ * @access public
77
+ * @return void
78
+ */
79
+ public function loadTextdomain() {
80
+
81
+ load_plugin_textdomain(
82
+ 'members-acf-integration',
83
+ false,
84
+ plugin_basename( realpath( __DIR__ . '/../public/lang' ) )
85
+ );
86
+ }
87
+
88
+ /**
89
+ * Filters the ACF capability setting. This is the primary capability used
90
+ * throughout the ACF plugin for permission and is set to `manage_options` by
91
+ * default.
92
+ *
93
+ * @since 1.0.0
94
+ * @access public
95
+ * @return void
96
+ */
97
+ function acfSettingsCapability() {
98
+ return 'manage_acf';
99
+ }
100
+
101
+ /**
102
+ * Filters the ACF capability setting when saving a field group because
103
+ * this is hardcoded in ACF on its `save_post` action.
104
+ *
105
+ * @since 1.0.0
106
+ * @access public
107
+ * @return void
108
+ */
109
+ public function acfSettingsCapabilityTemp() {
110
+ return get_post_type_object( 'acf-field-group' )->cap->edit_posts;
111
+ }
112
+
113
+ /**
114
+ * Adds the temporary settings capability filter before the field group
115
+ * is saved.
116
+ *
117
+ * @since 1.0.0
118
+ * @access public
119
+ * @param int $post_id
120
+ * @param \WP_Post $post
121
+ * @return void
122
+ */
123
+ public function beforeSaveFieldGroup( $post_id, $post ) {
124
+
125
+ if ( 'acf-field-group' === $post->post_type ) {
126
+ add_filter( 'acf/settings/capability', [ $this, 'acfSettingsCapabilityTemp' ], 95 );
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Removes the temporary settings capability filter before the field group
132
+ * is saved.
133
+ *
134
+ * @since 1.0.0
135
+ * @access public
136
+ * @param int $post_id
137
+ * @param \WP_Post $post
138
+ * @return void
139
+ */
140
+ public function afterSaveFieldGroup( $post_id, $post ) {
141
+
142
+ if ( 'acf-field-group' === $post->post_type ) {
143
+ remove_filter( 'acf/settings/capability', [ $this, 'acfSettingsCapabilityTemp' ], 95 );
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Moves the ACF admin action on `admin_menu` up a couple of spots in priority.
149
+ * This is so that we can remove and re-add the all items and add new item
150
+ * sub-menu pages (see below).
151
+ *
152
+ * @since 1.0.0
153
+ * @access public
154
+ * @return void
155
+ */
156
+ public function adminMenuBump() {
157
+
158
+ if ( ! acf_get_setting( 'show_admin' ) ) {
159
+ return;
160
+ }
161
+
162
+ remove_action( 'admin_menu', [ acf()->admin, 'admin_menu' ] );
163
+ add_action( 'admin_menu', [ acf()->admin, 'admin_menu' ], 8 );
164
+ }
165
+
166
+ /**
167
+ * Hacky method to change the capabilities for the admin menus.
168
+ *
169
+ * @since 1.0.0
170
+ * @access public
171
+ * @global array $menu
172
+ * @return void
173
+ */
174
+ public function adminMenu() {
175
+ global $menu;
176
+
177
+ if ( ! acf_get_setting( 'show_admin' ) ) {
178
+ return;
179
+ }
180
+
181
+ $type = get_post_type_object( 'acf-field-group' );
182
+ $parent = "edit.php?post_type={$type->name}";
183
+
184
+ // Remove the CPT sub-menus. We need to re-add them with the appropriate
185
+ // capability for editing field groups.
186
+
187
+ remove_submenu_page( $parent, $parent );
188
+ remove_submenu_page( $parent, "post-new.php?post_type={$type->name}" );
189
+
190
+ add_submenu_page(
191
+ $parent,
192
+ $type->labels->all_items,
193
+ $type->labels->all_items,
194
+ $type->cap->edit_posts,
195
+ $parent
196
+ );
197
+
198
+ add_submenu_page(
199
+ $parent,
200
+ $type->labels->add_new_item,
201
+ $type->labels->new_item,
202
+ $type->cap->create_posts,
203
+ "post-new.php?post_type={$type->name}"
204
+ );
205
+
206
+ // Changes the capability for the ACF top-level menu so that users who
207
+ // can edit have access to the the menu page. This should be fixed in
208
+ // core WP b/c it's not picking up that there are sub-menus that the
209
+ // user has permission for.
210
+ foreach ( $menu as $menu_key => $menu_item ) {
211
+
212
+ if ( $parent === $menu_item[2] ) {
213
+
214
+ if ( current_user_can( 'edit_acf_field_groups' ) ) {
215
+ $menu[ $menu_key ][1] = 'edit_acf_field_groups';
216
+ }
217
+
218
+ break;
219
+ }
220
+ }
221
+ }
222
+
223
+ /**
224
+ * Overwrites the ACF custom post type args to roll out custom capabilities.
225
+ *
226
+ * @since 1.0.0
227
+ * @access public
228
+ * @param array $args
229
+ * @param string $type
230
+ * @return array
231
+ */
232
+ public function registerPostTypeArgs( $args, $type ) {
233
+
234
+ // Field groups.
235
+ if ( 'acf-field-group' === $type ) {
236
+
237
+ // Adds support for an author field so that the `*_others_*`
238
+ // caps actually have some meaning.
239
+ $args['supports'][] = 'author';
240
+
241
+ // Change the capability type to tie it to the CPT.
242
+ $args['capability_type'] = 'acf_field_group';
243
+
244
+ // Let core WP map meta caps for us.
245
+ $args['map_meta_cap'] = true;
246
+
247
+ // Roll out a limited set of custom caps.
248
+ $args['capabilities'] = [
249
+ // meta caps (don't assign these to roles)
250
+ 'edit_post' => 'edit_acf_field_group',
251
+ 'read_post' => 'read_acf_field_group',
252
+ 'delete_post' => 'delete_acf_field_group',
253
+
254
+ // primitive/meta caps
255
+ 'create_posts' => 'edit_acf_field_groups',
256
+
257
+ // primitive caps used outside of map_meta_cap()
258
+ 'edit_posts' => 'edit_acf_field_groups',
259
+ 'edit_others_posts' => 'edit_others_acf_field_groups',
260
+ 'publish_posts' => 'edit_acf_field_groups',
261
+ 'read_private_posts' => 'edit_acf_field_groups',
262
+
263
+ // primitive caps used inside of map_meta_cap()
264
+ 'read' => 'read',
265
+ 'delete_posts' => 'delete_acf_field_groups',
266
+ 'delete_private_posts' => 'delete_acf_field_groups',
267
+ 'delete_published_posts' => 'delete_acf_field_groups',
268
+ 'delete_others_posts' => 'delete_others_acf_field_groups',
269
+ 'edit_private_posts' => 'edit_acf_field_groups',
270
+ 'edit_published_posts' => 'edit_acf_field_groups'
271
+ ];
272
+
273
+ // Fields.
274
+ } elseif ( 'acf-field' === $type ) {
275
+
276
+ // Change the capability type to tie it to the CPT.
277
+ // Note we're tying this to the `acf-field-group` type.
278
+ $args['capability_type'] = 'acf_field_group';
279
+
280
+ // Let core WP map meta caps for us.
281
+ $args['map_meta_cap'] = true;
282
+
283
+ // Roll out a limited set of custom caps.
284
+ $args['capabilities'] = [
285
+ // meta caps (don't assign these to roles)
286
+ 'edit_post' => 'edit_acf_field',
287
+ 'read_post' => 'read_acf_field',
288
+ 'delete_post' => 'delete_acf_field',
289
+
290
+ // primitive/meta caps
291
+ 'create_posts' => 'edit_acf_field_groups',
292
+
293
+ // primitive caps used outside of map_meta_cap()
294
+ 'edit_posts' => 'edit_acf_field_groups',
295
+ 'edit_others_posts' => 'edit_acf_field_groups',
296
+ 'publish_posts' => 'edit_acf_field_groups',
297
+ 'read_private_posts' => 'edit_acf_field_groups',
298
+
299
+ // primitive caps used inside of map_meta_cap()
300
+ 'read' => 'read',
301
+ 'delete_posts' => 'edit_acf_field_groups',
302
+ 'delete_private_posts' => 'edit_acf_field_groups',
303
+ 'delete_published_posts' => 'edit_acf_field_groups',
304
+ 'delete_others_posts' => 'edit_acf_field_groups',
305
+ 'edit_private_posts' => 'edit_acf_field_groups',
306
+ 'edit_published_posts' => 'edit_acf_field_groups'
307
+ ];
308
+ }
309
+
310
+ return $args;
311
+ }
312
+
313
+ /**
314
+ * Registers custom role groups.
315
+ *
316
+ * @since 1.0.0
317
+ * @access public
318
+ * @return void
319
+ */
320
+ public function registerRoleGroups() {
321
+
322
+ $roles = acf_roles();
323
+
324
+ // Add the plugin-specific role group only if the ACF plugin is active
325
+ // and there are existing roles with plugin-specific caps.
326
+ if ( $roles ) {
327
+ members_register_role_group( 'plugin-acf', [
328
+ 'label' => esc_html__( 'Advanced Custom Fields', 'members-acf-integration' ),
329
+ 'label_count' => _n_noop( 'Advanced Custom Fields %s', 'Advanced Custom Fields %s', 'members-acf-integration' ),
330
+ 'roles' => $roles,
331
+ ] );
332
+ }
333
+ }
334
+
335
+ /**
336
+ * Registers custom cap groups.
337
+ *
338
+ * @since 1.0.0
339
+ * @access public
340
+ * @return void
341
+ */
342
+ public function registerCapGroups() {
343
+
344
+ // Only run if we have the `give_forms` post type.
345
+ if ( $type = get_post_type_object( 'acf-field-group' ) ) {
346
+
347
+ $groups = [
348
+ 'acf-field-group',
349
+ 'acf-field'
350
+ ];
351
+
352
+ // Unregister any cap groups already registered for the plugin's
353
+ // custom post types.
354
+ foreach ( $groups as $group ) {
355
+ members_unregister_cap_group( "type-{$group}" );
356
+ }
357
+
358
+ // Register a cap group for the ACF plugin.
359
+ members_register_cap_group( 'plugin-acf', [
360
+ 'label' => esc_html__( 'Custom Fields', 'members-acf-integration' ),
361
+ 'icon' => 'dashicons-welcome-widgets-menus',
362
+ 'priority' => 11
363
+ ] );
364
+ }
365
+ }
366
+
367
+ /**
368
+ * Registers the ACF plugin capabilities.
369
+ *
370
+ * @since 1.0.0
371
+ * @access public
372
+ * @return void
373
+ */
374
+ public function registerCaps() {
375
+
376
+ foreach ( acf_caps() as $name => $options ) {
377
+
378
+ members_register_cap( $name, [
379
+ 'label' => $options['label'],
380
+ 'description' => $options['description'],
381
+ 'group' => 'plugin-acf'
382
+ ] );
383
+ }
384
+ }
385
+ }
addons/members-acf-integration/src/functions-caps.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Capability Functions.
4
+ *
5
+ * @package MembersIntegrationACF
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\Integration\ACF;
13
+
14
+ # Don't execute code if file is accessed directly.
15
+ defined( 'ABSPATH' ) || exit;
16
+
17
+ /**
18
+ * Returns an array of the ACF plugin capabilities.
19
+ *
20
+ * @since 1.0.0
21
+ * @access public
22
+ * @return array
23
+ */
24
+ function acf_caps() {
25
+
26
+ return [
27
+ 'manage_acf' => [
28
+ 'label' => __( 'Manage Advanced Custom Fields', 'members' ),
29
+ 'description' => __( 'Allows access to settings and tools for the Advanced Custom Fields plugin and may be required to access some third-party add-ons.', 'members' )
30
+ ],
31
+
32
+ 'edit_acf_field_groups' => [
33
+ 'label' => __( 'Edit Field Groups', 'members' ),
34
+ 'description' => sprintf(
35
+ // Translators: %s is a capability name.
36
+ __( "Allows users to edit field groups. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
37
+ '<code>edit_*_acf_field_groups</code>'
38
+ )
39
+ ],
40
+
41
+ 'edit_others_acf_field_groups' => [
42
+ 'label' => __( "Edit Others' Field Groups", 'members' ),
43
+ 'description' => __( "Allows users to edit others user's field groups.", 'members' )
44
+ ],
45
+
46
+ 'delete_acf_field_groups' => [
47
+ 'label' => __( 'Delete Field Groups', 'members' ),
48
+ 'description' => sprintf(
49
+ // Translators: %s is a capability name.
50
+ __( "Allows users to delete field groups. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
51
+ '<code>delete_*_acf_field_groups</code>'
52
+ )
53
+ ],
54
+
55
+ 'delete_others_acf_field_groups' => [
56
+ 'label' => __( "Delete Others' Field Groups", 'members' ),
57
+ 'description' => __( "Allows users to delete other user's field groups.", 'members' )
58
+ ]
59
+ ];
60
+ }
addons/members-acf-integration/src/functions-roles.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Role Functions.
4
+ *
5
+ * @package MembersIntegrationACF
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-acf-integration
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\Integration\ACF;
13
+
14
+ use function members_get_roles;
15
+ use function members_role_exists;
16
+
17
+ # Don't execute code if file is accessed directly.
18
+ defined( 'ABSPATH' ) || exit;
19
+
20
+ /**
21
+ * Returns an array of the ACF plugin roles.
22
+ *
23
+ * @since 1.0.0
24
+ * @access public
25
+ * @return array
26
+ */
27
+ function acf_roles() {
28
+
29
+ $roles = [];
30
+
31
+ // Add any roles that have any of the ACF capabilities to the group.
32
+ $role_objects = members_get_roles();
33
+
34
+ $acf_caps = array_keys( acf_caps() );
35
+
36
+ foreach ( $role_objects as $role ) {
37
+
38
+ if ( 0 < count( array_intersect( $acf_caps, (array) $role->get( 'granted_caps' ) ) ) ) {
39
+ $roles[] = $role->get( 'name' );
40
+ }
41
+ }
42
+
43
+ return $roles;
44
+ }
addons/members-admin-access/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
1
+ node_modules/
2
+ dist/
addons/members-admin-access/addon.php ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ <?php
2
+
3
+ require_once( 'bootstrap/app.php' );
addons/members-admin-access/app/class-app.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Primary class for setting up the plugin.
4
+ *
5
+ * @package MembersAdminAccess
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright Copyright (c) 2018, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-admin-access
9
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10
+ */
11
+
12
+ namespace Members\AddOns\AdminAccess;
13
+
14
+ /**
15
+ * Application class.
16
+ *
17
+ * @since 1.0.0
18
+ * @access public
19
+ */
20
+ class App {
21
+
22
+ /**
23
+ * Houses the plugin directory path.
24
+ *
25
+ * @since 1.0.0
26
+ * @access public
27
+ * @var string
28
+ */
29
+ public $dir = '';
30
+
31
+ /**
32
+ * Namespace used for filter hooks and such.
33
+ *
34
+ * @since 1.0.0
35
+ * @access public
36
+ * @var string
37
+ */
38
+ public $namespace = '';
39
+
40
+ /**
41
+ * Takes in a configuration array and assigns the keys to the class properties.
42
+ *
43
+ * @since 1.0.0
44
+ * @access public
45
+ * @return void
46
+ */
47
+ public function __construct( array $args = [] ) {
48
+
49
+ foreach ( array_keys( get_object_vars( $this ) ) as $key ) {
50
+
51
+ if ( isset( $args[ $key ] ) )
52
+ $this->$key = $args[ $key ];
53
+ }
54
+ }
55
+ }
addons/members-admin-access/app/class-view-settings.php ADDED
@@ -0,0 +1,193 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Outputs a custom settings view under "Admin Access" on the Members plugin
4
+ * settings page.
5
+ *
6
+ * @package MembersAdminAccess
7
+ * @author Justin Tadlock <justintadlock@gmail.com>
8
+ * @copyright Copyright (c) 2018, Justin Tadlock
9
+ * @link https://themehybrid.com/plugins/members-admin-access
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ namespace Members\AddOns\AdminAccess;
14
+
15
+ use Members\Admin\View;
16
+
17
+ /**
18
+ * Sets up and handles the general settings view.
19
+ *
20
+ * @since 1.0.0
21
+ * @access public
22
+ */
23
+ class View_Settings extends View {
24
+
25
+ /**
26
+ * Registers the plugin settings.
27
+ *
28
+ * @since 1.0.0
29
+ * @access public
30
+ * @return void
31
+ */
32
+ function register_settings() {
33
+
34
+ // Register the setting.
35
+ register_setting( 'members_admin_access_settings', 'members_admin_access_settings', array( $this, 'validate_settings' ) );
36
+
37
+ /* === Settings Sections === */
38
+
39
+ add_settings_section( 'general', esc_html__( 'Admin Access', 'members' ), array( $this, 'section_general' ), app()->namespace . '/settings' );
40
+
41
+ /* === Settings Fields === */
42
+
43
+ add_settings_field( 'select_roles', esc_html__( 'Select Roles', 'members' ), array( $this, 'field_select_roles' ), app()->namespace . '/settings', 'general' );
44
+ add_settings_field( 'redirect', esc_html__( 'Redirect', 'members' ), array( $this, 'field_redirect' ), app()->namespace . '/settings', 'general' );
45
+ add_settings_field( 'toolbar', esc_html__( 'Toolbar', 'members' ), array( $this, 'field_toolbar' ), app()->namespace . '/settings', 'general' );
46
+ }
47
+
48
+ /**
49
+ * Validates the plugin settings.
50
+ *
51
+ * @since 1.0.0
52
+ * @access public
53
+ * @param array $input
54
+ * @return array
55
+ */
56
+ function validate_settings( $settings ) {
57
+
58
+ // Validate selected roles.
59
+ //
60
+ // Note that it's possible for `$settings['roles']` to not be set
61
+ // when no roles at all are selected.
62
+
63
+ if ( empty( $settings['roles'] ) ) {
64
+ $settings['roles'] = array();
65
+ }
66
+
67
+ foreach ( $settings['roles'] as $key => $role ) {
68
+
69
+ if ( ! members_role_exists( $role ) )
70
+ unset( $settings['roles'][ $key ] );
71
+ }
72
+
73
+ // Escape URLs.
74
+ $settings['redirect_url'] = esc_url_raw( $settings['redirect_url'] );
75
+
76
+ if ( ! $settings['redirect_url'] )
77
+ $settings['redirect_url'] = esc_url_raw( home_url() );
78
+
79
+ // Handle checkboxes.
80
+ $settings['disable_toolbar'] = ! empty( $settings['disable_toolbar'] ) ? true : false;
81
+
82
+ return $settings;
83
+ }
84
+
85
+ /**
86
+ * Role/Caps section callback.
87
+ *
88
+ * @since 1.0.0
89
+ * @access public
90
+ * @return void
91
+ */
92
+ public function section_general() { ?>
93
+
94
+ <p class="description">
95
+ <?php esc_html_e( 'Control admin access by user role.', 'members' ); ?>
96
+ </p>
97
+ <?php }
98
+
99
+ /**
100
+ * Outputs the field for selecting roles.
101
+ *
102
+ * @since 1.0.0
103
+ * @access public
104
+ * @return void
105
+ */
106
+ public function field_select_roles() { ?>
107
+
108
+ <p class="description">
109
+ <?php esc_html_e( 'Select which roles should have admin access.', 'members' ); ?>
110
+ </p>
111
+
112
+ <div class="wp-tab-panel">
113
+
114
+ <ul>
115
+ <?php foreach ( members_get_roles() as $role ) :
116
+
117
+ $disabled = in_array( $role->name, get_roles_with_permanent_access() ); ?>
118
+
119
+ <li>
120
+ <label>
121
+ <?php if ( ! $disabled ) : ?>
122
+
123
+ <input type="checkbox" name="members_admin_access_settings[roles][]" value="<?php echo esc_attr( $role->name ); ?>" <?php checked( role_has_access( $role->name ) ); ?> />
124
+
125
+ <?php else : ?>
126
+
127
+ <input readonly="readonly" disabled="disabled" type="checkbox" name="members_admin_access_settings[roles][]" value="<?php echo esc_attr( $role->name ); ?>" <?php checked( role_has_access( $role->name ) ); ?> />
128
+
129
+ <?php endif; ?>
130
+
131
+ <?php echo esc_html( $role->label ); ?>
132
+ </label>
133
+ </li>
134
+
135
+ <?php endforeach; ?>
136
+ </ul>
137
+
138
+ </div><!-- .wp-tab-panel -->
139
+ <?php }
140
+
141
+ /**
142
+ * Outputs the redirect URL field.
143
+ *
144
+ * @since 1.0.0
145
+ * @access public
146
+ * @return void
147
+ */
148
+ public function field_redirect() { ?>
149
+
150
+ <p>
151
+ <label>
152
+ <?php esc_html_e( 'Redirect users without access to:', 'members' ); ?>
153
+
154
+ <input type="url" name="members_admin_access_settings[redirect_url]" value="<?php echo esc_attr( get_redirect_url() ); ?>" />
155
+ </label>
156
+ </p>
157
+ <?php }
158
+
159
+ /**
160
+ * The toolbar field callback.
161
+ *
162
+ * @since 1.0.0
163
+ * @access public
164
+ * @return void
165
+ */
166
+ public function field_toolbar() { ?>
167
+
168
+ <p>
169
+ <label>
170
+ <input type="checkbox" name="members_admin_access_settings[disable_toolbar]" value="1" <?php checked( disable_toolbar() ); ?> />
171
+
172
+ <?php esc_html_e( 'Disable toolbar on the front end for users without admin access.', 'members' ); ?>
173
+ </label>
174
+ </p>
175
+ <?php }
176
+
177
+ /**
178
+ * Renders the settings page.
179
+ *
180
+ * @since 1.0.0
181
+ * @access public
182
+ * @return void
183
+ */
184
+ public function template() { ?>
185
+
186
+ <form method="post" action="options.php">
187
+ <?php settings_fields( 'members_admin_access_settings' ); ?>
188
+ <?php do_settings_sections( app()->namespace . '/settings' ); ?>
189
+ <?php submit_button( esc_attr__( 'Update Settings', 'members' ), 'primary' ); ?>
190
+ </form>
191
+
192
+ <?php }
193
+ }
addons/members-admin-access/app/functions-admin.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin functions.
4
+ *
5
+ * @package MembersAdminAccess
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright Copyright (c) 2018, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-admin-access
9
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10
+ */
11
+
12
+ namespace Members\AddOns\AdminAccess;
13
+
14
+ # Redirect users without access.
15
+ add_action( 'admin_init', __NAMESPACE__ . '\access_check', 0 );
16
+
17
+ # Register custom settings views.
18
+ add_action( 'members_register_settings_views', __NAMESPACE__ . '\register_views' );
19
+
20
+ /**
21
+ * Checks if the current user has access to the admin. If not, it redirects them.
22
+ *
23
+ * @since 1.0.0
24
+ * @access public
25
+ * @return void
26
+ */
27
+ function access_check() {
28
+
29
+ if ( ! current_user_has_access() && ! wp_doing_ajax() ) {
30
+ wp_redirect( esc_url_raw( get_redirect_url() ) );
31
+ exit;
32
+ }
33
+
34
+ // Override WooCommerce's admin redirect.
35
+ add_filter( 'woocommerce_prevent_admin_access', '__return_false' );
36
+ }
37
+
38
+ /**
39
+ * Registers custom settings views with the Members plugin.
40
+ *
41
+ * @since 1.0.0
42
+ * @access public
43
+ * @param object $manager
44
+ * @return void
45
+ */
46
+ function register_views( $manager ) {
47
+
48
+ // Bail if not on the settings screen.
49
+ if ( 'members-settings' !== $manager->name )
50
+ return;
51
+
52
+ require_once( app()->dir . 'app/class-view-settings.php' );
53
+
54
+ // Register a view for the plugin settings.
55
+ $manager->register_view(
56
+ new View_Settings(
57
+ 'members_admin_access',
58
+ [
59
+ 'label' => esc_html__( 'Admin Access', 'members' ),
60
+ 'priority' => 15
61
+ ]
62
+ )
63
+ );
64
+ }
addons/members-admin-access/app/functions.php ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin functions.
4
+ *
5
+ * @package MembersAdminAccess
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright Copyright (c) 2018, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-admin-access
9
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10
+ */
11
+
12
+ namespace Members\AddOns\AdminAccess;
13
+
14
+ # Filter whether to show the toolbar.
15
+ add_filter( 'show_admin_bar', __NAMESPACE__ . '\show_admin_bar', 95 );
16
+
17
+ # Modify toolbar items.
18
+ add_action( 'admin_bar_menu', __NAMESPACE__ . '\admin_bar_menu', 95 );
19
+
20
+ /**
21
+ * Filter on the `show_admin_bar` hook to disable the admin bar for users without admin access.
22
+ *
23
+ * @since 1.0.0
24
+ * @access public
25
+ * @param bool $show
26
+ * @return bool
27
+ */
28
+ function show_admin_bar( $show ) {
29
+
30
+ return disable_toolbar() && ! current_user_has_access() ? false : $show;
31
+ }
32
+
33
+ /**
34
+ * Removes items from the toolbar if it is showing for a user without access.
35
+ *
36
+ * @since 1.0.0
37
+ * @access public
38
+ * @param object $wp_admin_bar
39
+ * @return void
40
+ */
41
+ function admin_bar_menu( $wp_admin_bar ) {
42
+
43
+ if ( is_admin() || disable_toolbar() || current_user_has_access() )
44
+ return;
45
+
46
+ $items = [
47
+ 'about',
48
+ 'site-name',
49
+ 'dashboard',
50
+ 'customize',
51
+ 'updates',
52
+ 'comments',
53
+ 'new-content',
54
+ 'edit',
55
+ 'edit-profile',
56
+ 'user-info'
57
+ ];
58
+
59
+ apply_filters( app()->namespace . '/remove_toolbar_items', $items );
60
+
61
+ foreach ( $items as $item )
62
+ $wp_admin_bar->remove_menu( $item );
63
+ }
64
+
65
+ /**
66
+ * Returns an array of the default plugin settings.
67
+ *
68
+ * @since 1.0.0
69
+ * @access public
70
+ * @return array
71
+ */
72
+ function get_default_settings() {
73
+
74
+ $settings = [
75
+ 'roles' => array_keys( members_get_roles() ), // Defaults to all roles.
76
+ 'redirect_url' => esc_url_raw( home_url() ),
77
+ 'disable_toolbar' => true
78
+ ];
79
+
80
+ return apply_filters( app()->namespace . '/get_default_settings', $settings );
81
+ }
82
+
83
+ /**
84
+ * Returns the requested plugin setting's value.
85
+ *
86
+ * @since 1.0.0
87
+ * @access public
88
+ * @param string $option
89
+ * @return mixed
90
+ */
91
+ function get_setting( $option = '' ) {
92
+
93
+ $defaults = get_default_settings();
94
+
95
+ $settings = wp_parse_args( get_option( 'members_admin_access_settings', $defaults ), $defaults );
96
+
97
+ return isset( $settings[ $option ] ) ? $settings[ $option ] : false;
98
+ }
99
+
100
+ /**
101
+ * Returns the redirect to ID. A value of `0` is the home/front page.
102
+ *
103
+ * @since 1.0.0
104
+ * @access public
105
+ * @return int
106
+ */
107
+ function get_redirect_url() {
108
+
109
+ return apply_filters( app()->namespace . '/get_redirect_url', get_setting( 'redirect_url' ) );
110
+ }
111
+
112
+ /**
113
+ * Conditional check on whether to disable the toolbar for users without admin access.
114
+ *
115
+ * @since 1.0.0
116
+ * @access public
117
+ * @return bool
118
+ */
119
+ function disable_toolbar() {
120
+
121
+ return (bool) apply_filters( app()->namespace . '/disable_toolbar', get_setting( 'disable_toolbar' ) );
122
+ }
123
+
124
+ /**
125
+ * Returns an array of roles with admin access.
126
+ *
127
+ * @since 1.0.0
128
+ * @access public
129
+ * @return array
130
+ */
131
+ function get_roles_with_access() {
132
+
133
+ $roles = (array) apply_filters( app()->namespace . '/get_roles_with_access', get_setting( 'roles' ) );
134
+
135
+ return array_merge( get_roles_with_permanent_access(), $roles );
136
+ }
137
+
138
+ /**
139
+ * Returns an array of roles with permanent admin access, such as administrators.
140
+ *
141
+ * @since 1.0.0
142
+ * @access public
143
+ * @return array
144
+ */
145
+ function get_roles_with_permanent_access() {
146
+
147
+ return apply_filters( app()->namespace . '/get_roles_with_permanent_access', [ 'administrator' ] );
148
+ }
149
+
150
+ /**
151
+ * Conditional function for checking if a particular role has access.
152
+ *
153
+ * @since 1.0.0
154
+ * @access public
155
+ * @param string $role
156
+ * @return bool
157
+ */
158
+ function role_has_access( $role ) {
159
+
160
+ return apply_filters(
161
+ app()->namespace . '/role_has_access',
162
+ in_array( $role, get_roles_with_access() ),
163
+ $role
164
+ );
165
+ }
166
+
167
+ /**
168
+ * Conditional function to check if the current user has admin access.
169
+ *
170
+ * @since 1.0.0
171
+ * @access public
172
+ * @return bool
173
+ */
174
+ function current_user_has_access() {
175
+
176
+ return user_has_access( get_current_user_id() );
177
+ }
178
+
179
+ /**
180
+ * Conditional function to check if a specific user has admin access.
181
+ *
182
+ * @since 1.0.0
183
+ * @access public
184
+ * @param int $user_id
185
+ * @return bool
186
+ */
187
+ function user_has_access( $user_id = 0 ) {
188
+
189
+ return apply_filters(
190
+ app()->namespace . '/user_has_access',
191
+ members_user_has_role( $user_id, get_roles_with_access() ),
192
+ $user_id
193
+ );
194
+ }
addons/members-admin-access/bootstrap/app.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Loads the plugin.
4
+ *
5
+ * @package MembersAdminAccess
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright Copyright (c) 2018, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-admin-access
9
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10
+ */
11
+
12
+ namespace Members\AddOns\AdminAccess;
13
+
14
+ /**
15
+ * Single instance of the application. Primarily use this for getting
16
+ * config data.
17
+ *
18
+ * @since 1.0.0
19
+ * @access public
20
+ * @return object
21
+ */
22
+ function app() {
23
+
24
+ static $instance = null;
25
+
26
+ if ( is_null( $instance ) ) {
27
+
28
+ $dir = trailingslashit( plugin_dir_path( __FILE__ ) );
29
+
30
+ require_once( $dir . '../app/class-app.php' );
31
+
32
+ $config = require_once( $dir . '../config/app.php' );
33
+
34
+ $instance = new App( $config );
35
+ }
36
+
37
+ return $instance;
38
+ }
39
+
40
+ # Load functions files.
41
+ require_once( app()->dir . 'app/functions.php' );
42
+
43
+ # Load admin functions files.
44
+ if ( is_admin() ) {
45
+
46
+ require_once( app()->dir . 'app/functions-admin.php' );
47
+ }
addons/members-admin-access/changelog.md ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Change Log
2
+
3
+ ## [1.0.1] - 2018-08-22
4
+
5
+ ### Fixed
6
+
7
+ - Disables WooCommerce's admin redirect since this plugin is handling it.
8
+ - Don't redirect when performing an admin Ajax action from the front end.
9
+
10
+ ## [1.0.0] - 2018-02-08
11
+
12
+ ### Added
13
+
14
+ * Plugin launch. Everything's new!
addons/members-admin-access/config/app.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Some basic configuration for the plugin.
4
+ *
5
+ * @package MembersAdminAccess
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright Copyright (c) 2018, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-admin-access
9
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10
+ */
11
+
12
+ return [
13
+
14
+ /*
15
+ |--------------------------------------------------------------------------
16
+ | App Directory
17
+ |--------------------------------------------------------------------------
18
+ |
19
+ | This is the location of the plugin's directory path. Use it for loading
20
+ | files and other needs.
21
+ |
22
+ */
23
+
24
+ 'dir' => trailingslashit( realpath( trailingslashit( __DIR__ ) . '../' ) ),
25
+
26
+ /*
27
+ |--------------------------------------------------------------------------
28
+ | App Namespace
29
+ |--------------------------------------------------------------------------
30
+ |
31
+ | This is a namespace for things like filter hooks used in WordPress. Not
32
+ | to be confused with the PHP namespace.
33
+ |
34
+ */
35
+
36
+ 'namespace' => 'members/addons/admin_access'
37
+ ];
addons/members-admin-access/contributing.md ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contributing
2
+
3
+ The code for the project is handled via its [GitHub Repository](https://github.com/justintadlock/members-admin-access). You can open tickets, create patches, and send pull requests there.
4
+
5
+ ## Pull requests
6
+
7
+ Problem first. Solution second.
8
+
9
+ Pull requests should have a ticket open for discussion first. I rarely accept pull requests that aren't for a specific issue for various reasons. It's far better to post an issue and let me or the community provide feedback prior to creating a pull request.
10
+
11
+ Please don't make pull requests against the `master` branch. This is the latest, stable code. You can make a pull request against one of the point branches or the `dev` (future release) branch.
12
+
13
+ ## Coding standards
14
+
15
+ In general, the project follows all WordPress [coding standards](https://make.wordpress.org/core/handbook/best-practices/coding-standards). There are instances where it doesn't, opting for personal choices of my own, but in terms of contributing, following the WordPress standards is best practice.
16
+
17
+ ## Script and style files
18
+
19
+ The project consists of several script and style files. When making patches or pull requests with changes to these files, only do so to the primary file. Don't create patches for the minified (`.min`) versions of the files. Those will be minified after a patch is merged into the code base.
20
+
21
+ ## Language
22
+
23
+ All text strings follow U.S. English by default. While such guides are generally unneeded, in cases where style considerations are necessary, these will typically follow conventions laid out in *Elements of Style* or the *AP Stylebook*.
24
+
25
+ ## Licensing
26
+
27
+ Any code contributed to the project via patches, pull requests, or other means will be licensed under the [GPL version 2](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html) or later. By contributing code to the project, you provide consent to use such code under this license. The exception to this rule is when bringing in third-party code with an alternate open source license.
28
+
29
+ ## Versioning
30
+
31
+ The project uses [semantic versioning](http://semver.org). Version numbers will look like `3.2.1` where `3` is the "major" release, `2` is the minor release, and `1` is the patch release.
addons/members-admin-access/license.md ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+ Preamble
10
+
11
+ The licenses for most software are designed to take away your
12
+ freedom to share and change it. By contrast, the GNU General Public
13
+ License is intended to guarantee your freedom to share and change free
14
+ software--to make sure the software is free for all its users. This
15
+ General Public License applies to most of the Free Software
16
+ Foundation's software and to any other program whose authors commit to
17
+ using it. (Some other Free Software Foundation software is covered by
18
+ the GNU Lesser General Public License instead.) You can apply it to
19
+ your programs, too.
20
+
21
+ When we speak of free software, we are referring to freedom, not
22
+ price. Our General Public Licenses are designed to make sure that you
23
+ have the freedom to distribute copies of free software (and charge for
24
+ this service if you wish), that you receive source code or can get it
25
+ if you want it, that you can change the software or use pieces of it
26
+ in new free programs; and that you know you can do these things.
27
+
28
+ To protect your rights, we need to make restrictions that forbid
29
+ anyone to deny you these rights or to ask you to surrender the rights.
30
+ These restrictions translate to certain responsibilities for you if you
31
+ distribute copies of the software, or if you modify it.
32
+
33
+ For example, if you distribute copies of such a program, whether
34
+ gratis or for a fee, you must give the recipients all the rights that
35
+ you have. You must make sure that they, too, receive or can get the
36
+ source code. And you must show them these terms so they know their
37
+ rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and
40
+ (2) offer you this license which gives you legal permission to copy,
41
+ distribute and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain
44
+ that everyone understands that there is no warranty for this free
45
+ software. If the software is modified by someone else and passed on, we
46
+ want its recipients to know that what they have is not the original, so
47
+ that any problems introduced by others will not reflect on the original
48
+ authors' reputations.
49
+
50
+ Finally, any free program is threatened constantly by software
51
+ patents. We wish to avoid the danger that redistributors of a free
52
+ program will individually obtain patent licenses, in effect making the
53
+ program proprietary. To prevent this, we have made it clear that any
54
+ patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ GNU GENERAL PUBLIC LICENSE
60
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+ 0. This License applies to any program or other work which contains
63
+ a notice placed by the copyright holder saying it may be distributed
64
+ under the terms of this General Public License. The "Program", below,
65
+ refers to any such program or work, and a "work based on the Program"
66
+ means either the Program or any derivative work under copyright law:
67
+ that is to say, a work containing the Program or a portion of it,
68
+ either verbatim or with modifications and/or translated into another
69
+ language. (Hereinafter, translation is included without limitation in
70
+ the term "modification".) Each licensee is addressed as "you".
71
+
72
+ Activities other than copying, distribution and modification are not
73
+ covered by this License; they are outside its scope. The act of
74
+ running the Program is not restricted, and the output from the Program
75
+ is covered only if its contents constitute a work based on the
76
+ Program (independent of having been made by running the Program).
77
+ Whether that is true depends on what the Program does.
78
+
79
+ 1. You may copy and distribute verbatim copies of the Program's
80
+ source code as you receive it, in any medium, provided that you
81
+ conspicuously and appropriately publish on each copy an appropriate
82
+ copyright notice and disclaimer of warranty; keep intact all the
83
+ notices that refer to this License and to the absence of any warranty;
84
+ and give any other recipients of the Program a copy of this License
85
+ along with the Program.
86
+
87
+ You may charge a fee for the physical act of transferring a copy, and
88
+ you may at your option offer warranty protection in exchange for a fee.
89
+
90
+ 2. You may modify your copy or copies of the Program or any portion
91
+ of it, thus forming a work based on the Program, and copy and
92
+ distribute such modifications or work under the terms of Section 1
93
+ above, provided that you also meet all of these conditions:
94
+
95
+ a) You must cause the modified files to carry prominent notices
96
+ stating that you changed the files and the date of any change.
97
+
98
+ b) You must cause any work that you distribute or publish, that in
99
+ whole or in part contains or is derived from the Program or any
100
+ part thereof, to be licensed as a whole at no charge to all third
101
+ parties under the terms of this License.
102
+
103
+ c) If the modified program normally reads commands interactively
104
+ when run, you must cause it, when started running for such
105
+ interactive use in the most ordinary way, to print or display an
106
+ announcement including an appropriate copyright notice and a
107
+ notice that there is no warranty (or else, saying that you provide
108
+ a warranty) and that users may redistribute the program under
109
+ these conditions, and telling the user how to view a copy of this
110
+ License. (Exception: if the Program itself is interactive but
111
+ does not normally print such an announcement, your work based on
112
+ the Program is not required to print an announcement.)
113
+
114
+ These requirements apply to the modified work as a whole. If
115
+ identifiable sections of that work are not derived from the Program,
116
+ and can be reasonably considered independent and separate works in
117
+ themselves, then this License, and its terms, do not apply to those
118
+ sections when you distribute them as separate works. But when you
119
+ distribute the same sections as part of a whole which is a work based
120
+ on the Program, the distribution of the whole must be on the terms of
121
+ this License, whose permissions for other licensees extend to the
122
+ entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+ Thus, it is not the intent of this section to claim rights or contest
125
+ your rights to work written entirely by you; rather, the intent is to
126
+ exercise the right to control the distribution of derivative or
127
+ collective works based on the Program.
128
+
129
+ In addition, mere aggregation of another work not based on the Program
130
+ with the Program (or with a work based on the Program) on a volume of
131
+ a storage or distribution medium does not bring the other work under
132
+ the scope of this License.
133
+
134
+ 3. You may copy and distribute the Program (or a work based on it,
135
+ under Section 2) in object code or executable form under the terms of
136
+ Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+ a) Accompany it with the complete corresponding machine-readable
139
+ source code, which must be distributed under the terms of Sections
140
+ 1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+ b) Accompany it with a written offer, valid for at least three
143
+ years, to give any third party, for a charge no more than your
144
+ cost of physically performing source distribution, a complete
145
+ machine-readable copy of the corresponding source code, to be
146
+ distributed under the terms of Sections 1 and 2 above on a medium
147
+ customarily used for software interchange; or,
148
+
149
+ c) Accompany it with the information you received as to the offer
150
+ to distribute corresponding source code. (This alternative is
151
+ allowed only for noncommercial distribution and only if you
152
+ received the program in object code or executable form with such
153
+ an offer, in accord with Subsection b above.)
154
+
155
+ The source code for a work means the preferred form of the work for
156
+ making modifications to it. For an executable work, complete source
157
+ code means all the source code for all modules it contains, plus any
158
+ associated interface definition files, plus the scripts used to
159
+ control compilation and installation of the executable. However, as a
160
+ special exception, the source code distributed need not include
161
+ anything that is normally distributed (in either source or binary
162
+ form) with the major components (compiler, kernel, and so on) of the
163
+ operating system on which the executable runs, unless that component
164
+ itself accompanies the executable.
165
+
166
+ If distribution of executable or object code is made by offering
167
+ access to copy from a designated place, then offering equivalent
168
+ access to copy the source code from the same place counts as
169
+ distribution of the source code, even though third parties are not
170
+ compelled to copy the source along with the object code.
171
+
172
+ 4. You may not copy, modify, sublicense, or distribute the Program
173
+ except as expressly provided under this License. Any attempt
174
+ otherwise to copy, modify, sublicense or distribute the Program is
175
+ void, and will automatically terminate your rights under this License.
176
+ However, parties who have received copies, or rights, from you under
177
+ this License will not have their licenses terminated so long as such
178
+ parties remain in full compliance.
179
+
180
+ 5. You are not required to accept this License, since you have not
181
+ signed it. However, nothing else grants you permission to modify or
182
+ distribute the Program or its derivative works. These actions are
183
+ prohibited by law if you do not accept this License. Therefore, by
184
+ modifying or distributing the Program (or any work based on the
185
+ Program), you indicate your acceptance of this License to do so, and
186
+ all its terms and conditions for copying, distributing or modifying
187
+ the Program or works based on it.
188
+
189
+ 6. Each time you redistribute the Program (or any work based on the
190
+ Program), the recipient automatically receives a license from the
191
+ original licensor to copy, distribute or modify the Program subject to
192
+ these terms and conditions. You may not impose any further
193
+ restrictions on the recipients' exercise of the rights granted herein.
194
+ You are not responsible for enforcing compliance by third parties to
195
+ this License.
196
+
197
+ 7. If, as a consequence of a court judgment or allegation of patent
198
+ infringement or for any other reason (not limited to patent issues),
199
+ conditions are imposed on you (whether by court order, agreement or
200
+ otherwise) that contradict the conditions of this License, they do not
201
+ excuse you from the conditions of this License. If you cannot
202
+ distribute so as to satisfy simultaneously your obligations under this
203
+ License and any other pertinent obligations, then as a consequence you
204
+ may not distribute the Program at all. For example, if a patent
205
+ license would not permit royalty-free redistribution of the Program by
206
+ all those who receive copies directly or indirectly through you, then
207
+ the only way you could satisfy both it and this License would be to
208
+ refrain entirely from distribution of the Program.
209
+
210
+ If any portion of this section is held invalid or unenforceable under
211
+ any particular circumstance, the balance of the section is intended to
212
+ apply and the section as a whole is intended to apply in other
213
+ circumstances.
214
+
215
+ It is not the purpose of this section to induce you to infringe any
216
+ patents or other property right claims or to contest validity of any
217
+ such claims; this section has the sole purpose of protecting the
218
+ integrity of the free software distribution system, which is
219
+ implemented by public license practices. Many people have made
220
+ generous contributions to the wide range of software distributed
221
+ through that system in reliance on consistent application of that
222
+ system; it is up to the author/donor to decide if he or she is willing
223
+ to distribute software through any other system and a licensee cannot
224
+ impose that choice.
225
+
226
+ This section is intended to make thoroughly clear what is believed to
227
+ be a consequence of the rest of this License.
228
+
229
+ 8. If the distribution and/or use of the Program is restricted in
230
+ certain countries either by patents or by copyrighted interfaces, the
231
+ original copyright holder who places the Program under this License
232
+ may add an explicit geographical distribution limitation excluding
233
+ those countries, so that distribution is permitted only in or among
234
+ countries not thus excluded. In such case, this License incorporates
235
+ the limitation as if written in the body of this License.
236
+
237
+ 9. The Free Software Foundation may publish revised and/or new versions
238
+ of the General Public License from time to time. Such new versions will
239
+ be similar in spirit to the present version, but may differ in detail to
240
+ address new problems or concerns.
241
+
242
+ Each version is given a distinguishing version number. If the Program
243
+ specifies a version number of this License which applies to it and "any
244
+ later version", you have the option of following the terms and conditions
245
+ either of that version or of any later version published by the Free
246
+ Software Foundation. If the Program does not specify a version number of
247
+ this License, you may choose any version ever published by the Free Software
248
+ Foundation.
249
+
250
+ 10. If you wish to incorporate parts of the Program into other free
251
+ programs whose distribution conditions are different, write to the author
252
+ to ask for permission. For software which is copyrighted by the Free
253
+ Software Foundation, write to the Free Software Foundation; we sometimes
254
+ make exceptions for this. Our decision will be guided by the two goals
255
+ of preserving the free status of all derivatives of our free software and
256
+ of promoting the sharing and reuse of software generally.
257
+
258
+ NO WARRANTY
259
+
260
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+ REPAIR OR CORRECTION.
269
+
270
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+ POSSIBILITY OF SUCH DAMAGES.
279
+
280
+ END OF TERMS AND CONDITIONS
281
+
282
+ How to Apply These Terms to Your New Programs
283
+
284
+ If you develop a new program, and you want it to be of the greatest
285
+ possible use to the public, the best way to achieve this is to make it
286
+ free software which everyone can redistribute and change under these terms.
287
+
288
+ To do so, attach the following notices to the program. It is safest
289
+ to attach them to the start of each source file to most effectively
290
+ convey the exclusion of warranty; and each file should have at least
291
+ the "copyright" line and a pointer to where the full notice is found.
292
+
293
+ <one line to give the program's name and a brief idea of what it does.>
294
+ Copyright (C) <year> <name of author>
295
+
296
+ This program is free software; you can redistribute it and/or modify
297
+ it under the terms of the GNU General Public License as published by
298
+ the Free Software Foundation; either version 2 of the License, or
299
+ (at your option) any later version.
300
+
301
+ This program is distributed in the hope that it will be useful,
302
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
303
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
+ GNU General Public License for more details.
305
+
306
+ You should have received a copy of the GNU General Public License along
307
+ with this program; if not, write to the Free Software Foundation, Inc.,
308
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309
+
310
+ Also add information on how to contact you by electronic and paper mail.
311
+
312
+ If the program is interactive, make it output a short notice like this
313
+ when it starts in an interactive mode:
314
+
315
+ Gnomovision version 69, Copyright (C) year name of author
316
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317
+ This is free software, and you are welcome to redistribute it
318
+ under certain conditions; type `show c' for details.
319
+
320
+ The hypothetical commands `show w' and `show c' should show the appropriate
321
+ parts of the General Public License. Of course, the commands you use may
322
+ be called something other than `show w' and `show c'; they could even be
323
+ mouse-clicks or menu items--whatever suits your program.
324
+
325
+ You should also get your employer (if you work as a programmer) or your
326
+ school, if any, to sign a "copyright disclaimer" for the program, if
327
+ necessary. Here is a sample; alter the names:
328
+
329
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
+
332
+ <signature of Ty Coon>, 1 April 1989
333
+ Ty Coon, President of Vice
334
+
335
+ This General Public License does not permit incorporating your program into
336
+ proprietary programs. If your program is a subroutine library, you may
337
+ consider it more useful to permit linking proprietary applications with the
338
+ library. If this is what you want to do, use the GNU Lesser General
339
+ Public License instead of this License.
addons/members-admin-access/package-lock.json ADDED
@@ -0,0 +1,804 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-admin-access",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 1,
5
+ "requires": true,
6
+ "dependencies": {
7
+ "ansi-green": {
8
+ "version": "0.1.1",
9
+ "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz",
10
+ "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=",
11
+ "dev": true,
12
+ "requires": {
13
+ "ansi-wrap": "0.1.0"
14
+ }
15
+ },
16
+ "ansi-wrap": {
17
+ "version": "0.1.0",
18
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
19
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
20
+ "dev": true
21
+ },
22
+ "arr-union": {
23
+ "version": "3.1.0",
24
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
25
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
26
+ "dev": true
27
+ },
28
+ "async-array-reduce": {
29
+ "version": "0.2.1",
30
+ "resolved": "https://registry.npmjs.org/async-array-reduce/-/async-array-reduce-0.2.1.tgz",
31
+ "integrity": "sha1-yL4BCitc0A3qlsgRFgNGk9/dgtE=",
32
+ "dev": true
33
+ },
34
+ "async-each": {
35
+ "version": "1.0.1",
36
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
37
+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
38
+ "dev": true
39
+ },
40
+ "balanced-match": {
41
+ "version": "1.0.0",
42
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
43
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
44
+ "dev": true
45
+ },
46
+ "bluebird": {
47
+ "version": "3.5.1",
48
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
49
+ "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
50
+ "dev": true
51
+ },
52
+ "brace-expansion": {
53
+ "version": "1.1.9",
54
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.9.tgz",
55
+ "integrity": "sha512-/+o3o6OV1cm3WKrO7U4wykU+ZICE6HiMEuravc2d03NIuM/VaRn5iMcoQ7NyxFXjvpmRICP2EER0YOnh4yIapA==",
56
+ "dev": true,
57
+ "requires": {
58
+ "balanced-match": "1.0.0",
59
+ "concat-map": "0.0.1"
60
+ }
61
+ },
62
+ "clone": {
63
+ "version": "1.0.3",
64
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
65
+ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
66
+ "dev": true
67
+ },
68
+ "clone-stats": {
69
+ "version": "0.0.1",
70
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
71
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
72
+ "dev": true
73
+ },
74
+ "concat-map": {
75
+ "version": "0.0.1",
76
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
77
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
78
+ "dev": true
79
+ },
80
+ "copy": {
81
+ "version": "0.3.1",
82
+ "resolved": "https://registry.npmjs.org/copy/-/copy-0.3.1.tgz",
83
+ "integrity": "sha512-v2O6JyzUf2lEFZdfL+zHKpkM1/N7+3OPBn8G7bUc/dyExb7EJ3u66QHXrsIJ2tsVStTUII9rkyMfk/HrQUfUiw==",
84
+ "dev": true,
85
+ "requires": {
86
+ "async-each": "1.0.1",
87
+ "bluebird": "3.5.1",
88
+ "extend-shallow": "2.0.1",
89
+ "file-contents": "0.3.2",
90
+ "glob-parent": "2.0.0",
91
+ "graceful-fs": "4.1.11",
92
+ "has-glob": "0.1.1",
93
+ "is-absolute": "0.2.6",
94
+ "lazy-cache": "2.0.2",
95
+ "log-ok": "0.1.1",
96
+ "matched": "0.4.4",
97
+ "mkdirp": "0.5.1",
98
+ "resolve-dir": "0.1.1",
99
+ "to-file": "0.2.0"
100
+ }
101
+ },
102
+ "core-util-is": {
103
+ "version": "1.0.2",
104
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
105
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
106
+ "dev": true
107
+ },
108
+ "define-property": {
109
+ "version": "0.2.5",
110
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
111
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
112
+ "dev": true,
113
+ "requires": {
114
+ "is-descriptor": "0.1.6"
115
+ }
116
+ },
117
+ "encoding": {
118
+ "version": "0.1.12",
119
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
120
+ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
121
+ "dev": true,
122
+ "requires": {
123
+ "iconv-lite": "0.4.19"
124
+ }
125
+ },
126
+ "expand-tilde": {
127
+ "version": "1.2.2",
128
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
129
+ "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=",
130
+ "dev": true,
131
+ "requires": {
132
+ "os-homedir": "1.0.2"
133
+ }
134
+ },
135
+ "extend-shallow": {
136
+ "version": "2.0.1",
137
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
138
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
139
+ "dev": true,
140
+ "requires": {
141
+ "is-extendable": "0.1.1"
142
+ }
143
+ },
144
+ "file-contents": {
145
+ "version": "0.3.2",
146
+ "resolved": "https://registry.npmjs.org/file-contents/-/file-contents-0.3.2.tgz",
147
+ "integrity": "sha1-oJOf7RuM2hWAJm/Gt1OiMvtG3lM=",
148
+ "dev": true,
149
+ "requires": {
150
+ "define-property": "0.2.5",
151
+ "extend-shallow": "2.0.1",
152
+ "file-stat": "0.2.3",
153
+ "fs-exists-sync": "0.1.0",
154
+ "graceful-fs": "4.1.11",
155
+ "is-buffer": "1.1.6",
156
+ "isobject": "2.1.0",
157
+ "lazy-cache": "2.0.2",
158
+ "strip-bom-buffer": "0.1.1",
159
+ "strip-bom-string": "0.1.2",
160
+ "through2": "2.0.3",
161
+ "vinyl": "1.2.0"
162
+ }
163
+ },
164
+ "file-stat": {
165
+ "version": "0.2.3",
166
+ "resolved": "https://registry.npmjs.org/file-stat/-/file-stat-0.2.3.tgz",
167
+ "integrity": "sha1-Rpp+kn1pMAeWJM2zgQlAVFbLBqk=",
168
+ "dev": true,
169
+ "requires": {
170
+ "fs-exists-sync": "0.1.0",
171
+ "graceful-fs": "4.1.11",
172
+ "lazy-cache": "2.0.2",
173
+ "through2": "2.0.3"
174
+ }
175
+ },
176
+ "fs-exists-sync": {
177
+ "version": "0.1.0",
178
+ "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
179
+ "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=",
180
+ "dev": true
181
+ },
182
+ "fs.realpath": {
183
+ "version": "1.0.0",
184
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
185
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
186
+ "dev": true
187
+ },
188
+ "gettext-parser": {
189
+ "version": "1.3.0",
190
+ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.3.0.tgz",
191
+ "integrity": "sha512-iloxjcw+uTPnQ8DrGICWtqkHNgk3mAiDI77pLmXQCnhM+BxFQXstzTA4zj3EpIYMysRQnnNzHyHzBUEazz80Sw==",
192
+ "dev": true,
193
+ "requires": {
194
+ "encoding": "0.1.12",
195
+ "safe-buffer": "5.1.1"
196
+ }
197
+ },
198
+ "glob": {
199
+ "version": "7.1.2",
200
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
201
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
202
+ "dev": true,
203
+ "requires": {
204
+ "fs.realpath": "1.0.0",
205
+ "inflight": "1.0.6",
206
+ "inherits": "2.0.3",
207
+ "minimatch": "3.0.4",
208
+ "once": "1.4.0",
209
+ "path-is-absolute": "1.0.1"
210
+ }
211
+ },
212
+ "glob-parent": {
213
+ "version": "2.0.0",
214
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
215
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
216
+ "dev": true,
217
+ "requires": {
218
+ "is-glob": "2.0.1"
219
+ }
220
+ },
221
+ "global-modules": {
222
+ "version": "0.2.3",
223
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
224
+ "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=",
225
+ "dev": true,
226
+ "requires": {
227
+ "global-prefix": "0.1.5",
228
+ "is-windows": "0.2.0"
229
+ }
230
+ },
231
+ "global-prefix": {
232
+ "version": "0.1.5",
233
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
234
+ "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=",
235
+ "dev": true,
236
+ "requires": {
237
+ "homedir-polyfill": "1.0.1",
238
+ "ini": "1.3.5",
239
+ "is-windows": "0.2.0",
240
+ "which": "1.3.0"
241
+ }
242
+ },
243
+ "graceful-fs": {
244
+ "version": "4.1.11",
245
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
246
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
247
+ "dev": true
248
+ },
249
+ "has-glob": {
250
+ "version": "0.1.1",
251
+ "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-0.1.1.tgz",
252
+ "integrity": "sha1-omHEwqbGZ+DHe3AKfyl8Oe86pYk=",
253
+ "dev": true,
254
+ "requires": {
255
+ "is-glob": "2.0.1"
256
+ }
257
+ },
258
+ "homedir-polyfill": {
259
+ "version": "1.0.1",
260
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
261
+ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
262
+ "dev": true,
263
+ "requires": {
264
+ "parse-passwd": "1.0.0"
265
+ }
266
+ },
267
+ "iconv-lite": {
268
+ "version": "0.4.19",
269
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
270
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
271
+ "dev": true
272
+ },
273
+ "inflight": {
274
+ "version": "1.0.6",
275
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
276
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
277
+ "dev": true,
278
+ "requires": {
279
+ "once": "1.4.0",
280
+ "wrappy": "1.0.2"
281
+ }
282
+ },
283
+ "inherits": {
284
+ "version": "2.0.3",
285
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
286
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
287
+ "dev": true
288
+ },
289
+ "ini": {
290
+ "version": "1.3.5",
291
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
292
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
293
+ "dev": true
294
+ },
295
+ "is-absolute": {
296
+ "version": "0.2.6",
297
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz",
298
+ "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=",
299
+ "dev": true,
300
+ "requires": {
301
+ "is-relative": "0.2.1",
302
+ "is-windows": "0.2.0"
303
+ }
304
+ },
305
+ "is-accessor-descriptor": {
306
+ "version": "0.1.6",
307
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
308
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
309
+ "dev": true,
310
+ "requires": {
311
+ "kind-of": "3.2.2"
312
+ },
313
+ "dependencies": {
314
+ "kind-of": {
315
+ "version": "3.2.2",
316
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
317
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
318
+ "dev": true,
319
+ "requires": {
320
+ "is-buffer": "1.1.6"
321
+ }
322
+ }
323
+ }
324
+ },
325
+ "is-buffer": {
326
+ "version": "1.1.6",
327
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
328
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
329
+ "dev": true
330
+ },
331
+ "is-data-descriptor": {
332
+ "version": "0.1.4",
333
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
334
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
335
+ "dev": true,
336
+ "requires": {
337
+ "kind-of": "3.2.2"
338
+ },
339
+ "dependencies": {
340
+ "kind-of": {
341
+ "version": "3.2.2",
342
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
343
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
344
+ "dev": true,
345
+ "requires": {
346
+ "is-buffer": "1.1.6"
347
+ }
348
+ }
349
+ }
350
+ },
351
+ "is-descriptor": {
352
+ "version": "0.1.6",
353
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
354
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
355
+ "dev": true,
356
+ "requires": {
357
+ "is-accessor-descriptor": "0.1.6",
358
+ "is-data-descriptor": "0.1.4",
359
+ "kind-of": "5.1.0"
360
+ }
361
+ },
362
+ "is-extendable": {
363
+ "version": "0.1.1",
364
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
365
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
366
+ "dev": true
367
+ },
368
+ "is-extglob": {
369
+ "version": "1.0.0",
370
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
371
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
372
+ "dev": true
373
+ },
374
+ "is-glob": {
375
+ "version": "2.0.1",
376
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
377
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
378
+ "dev": true,
379
+ "requires": {
380
+ "is-extglob": "1.0.0"
381
+ }
382
+ },
383
+ "is-relative": {
384
+ "version": "0.2.1",
385
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz",
386
+ "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=",
387
+ "dev": true,
388
+ "requires": {
389
+ "is-unc-path": "0.1.2"
390
+ }
391
+ },
392
+ "is-unc-path": {
393
+ "version": "0.1.2",
394
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz",
395
+ "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=",
396
+ "dev": true,
397
+ "requires": {
398
+ "unc-path-regex": "0.1.2"
399
+ }
400
+ },
401
+ "is-utf8": {
402
+ "version": "0.2.1",
403
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
404
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
405
+ "dev": true
406
+ },
407
+ "is-valid-glob": {
408
+ "version": "0.3.0",
409
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
410
+ "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=",
411
+ "dev": true
412
+ },
413
+ "is-windows": {
414
+ "version": "0.2.0",
415
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
416
+ "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=",
417
+ "dev": true
418
+ },
419
+ "isarray": {
420
+ "version": "1.0.0",
421
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
422
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
423
+ "dev": true
424
+ },
425
+ "isexe": {
426
+ "version": "2.0.0",
427
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
428
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
429
+ "dev": true
430
+ },
431
+ "isobject": {
432
+ "version": "2.1.0",
433
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
434
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
435
+ "dev": true,
436
+ "requires": {
437
+ "isarray": "1.0.0"
438
+ }
439
+ },
440
+ "kind-of": {
441
+ "version": "5.1.0",
442
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
443
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
444
+ "dev": true
445
+ },
446
+ "lazy-cache": {
447
+ "version": "2.0.2",
448
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
449
+ "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
450
+ "dev": true,
451
+ "requires": {
452
+ "set-getter": "0.1.0"
453
+ }
454
+ },
455
+ "lodash": {
456
+ "version": "4.17.5",
457
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
458
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
459
+ "dev": true
460
+ },
461
+ "log-ok": {
462
+ "version": "0.1.1",
463
+ "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz",
464
+ "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=",
465
+ "dev": true,
466
+ "requires": {
467
+ "ansi-green": "0.1.1",
468
+ "success-symbol": "0.1.0"
469
+ }
470
+ },
471
+ "matched": {
472
+ "version": "0.4.4",
473
+ "resolved": "https://registry.npmjs.org/matched/-/matched-0.4.4.tgz",
474
+ "integrity": "sha1-Vte36xgDPwz5vFLrIJD6x9weifo=",
475
+ "dev": true,
476
+ "requires": {
477
+ "arr-union": "3.1.0",
478
+ "async-array-reduce": "0.2.1",
479
+ "extend-shallow": "2.0.1",
480
+ "fs-exists-sync": "0.1.0",
481
+ "glob": "7.1.2",
482
+ "has-glob": "0.1.1",
483
+ "is-valid-glob": "0.3.0",
484
+ "lazy-cache": "2.0.2",
485
+ "resolve-dir": "0.1.1"
486
+ }
487
+ },
488
+ "minimatch": {
489
+ "version": "3.0.4",
490
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
491
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
492
+ "dev": true,
493
+ "requires": {
494
+ "brace-expansion": "1.1.9"
495
+ }
496
+ },
497
+ "minimist": {
498
+ "version": "1.2.0",
499
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
500
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
501
+ "dev": true
502
+ },
503
+ "mkdirp": {
504
+ "version": "0.5.1",
505
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
506
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
507
+ "dev": true,
508
+ "requires": {
509
+ "minimist": "0.0.8"
510
+ },
511
+ "dependencies": {
512
+ "minimist": {
513
+ "version": "0.0.8",
514
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
515
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
516
+ "dev": true
517
+ }
518
+ }
519
+ },
520
+ "node-wp-i18n": {
521
+ "version": "1.0.5",
522
+ "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.0.5.tgz",
523
+ "integrity": "sha512-IqU2IR5XEptL3e+m4nxlKStS71Vcxe1lEQq8d33ou6T0c0JmoLk8rexs2ur6PBjJWGN5dhSG6y0NWMAS64C4mw==",
524
+ "dev": true,
525
+ "requires": {
526
+ "bluebird": "3.5.1",
527
+ "gettext-parser": "1.3.0",
528
+ "glob": "7.1.2",
529
+ "lodash": "4.17.5",
530
+ "minimist": "1.2.0",
531
+ "mkdirp": "0.5.1",
532
+ "tmp": "0.0.33"
533
+ }
534
+ },
535
+ "once": {
536
+ "version": "1.4.0",
537
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
538
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
539
+ "dev": true,
540
+ "requires": {
541
+ "wrappy": "1.0.2"
542
+ }
543
+ },
544
+ "os-homedir": {
545
+ "version": "1.0.2",
546
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
547
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
548
+ "dev": true
549
+ },
550
+ "os-tmpdir": {
551
+ "version": "1.0.2",
552
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
553
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
554
+ "dev": true
555
+ },
556
+ "parse-passwd": {
557
+ "version": "1.0.0",
558
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
559
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
560
+ "dev": true
561
+ },
562
+ "path-is-absolute": {
563
+ "version": "1.0.1",
564
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
565
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
566
+ "dev": true
567
+ },
568
+ "process-nextick-args": {
569
+ "version": "2.0.0",
570
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
571
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
572
+ "dev": true
573
+ },
574
+ "readable-stream": {
575
+ "version": "2.3.4",
576
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz",
577
+ "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==",
578
+ "dev": true,
579
+ "requires": {
580
+ "core-util-is": "1.0.2",
581
+ "inherits": "2.0.3",
582
+ "isarray": "1.0.0",
583
+ "process-nextick-args": "2.0.0",
584
+ "safe-buffer": "5.1.1",
585
+ "string_decoder": "1.0.3",
586
+ "util-deprecate": "1.0.2"
587
+ }
588
+ },
589
+ "replace-ext": {
590
+ "version": "0.0.1",
591
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
592
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
593
+ "dev": true
594
+ },
595
+ "resolve-dir": {
596
+ "version": "0.1.1",
597
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
598
+ "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=",
599
+ "dev": true,
600
+ "requires": {
601
+ "expand-tilde": "1.2.2",
602
+ "global-modules": "0.2.3"
603
+ }
604
+ },
605
+ "rimraf": {
606
+ "version": "2.6.2",
607
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
608
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
609
+ "dev": true,
610
+ "requires": {
611
+ "glob": "7.1.2"
612
+ }
613
+ },
614
+ "safe-buffer": {
615
+ "version": "5.1.1",
616
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
617
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
618
+ "dev": true
619
+ },
620
+ "set-getter": {
621
+ "version": "0.1.0",
622
+ "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
623
+ "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
624
+ "dev": true,
625
+ "requires": {
626
+ "to-object-path": "0.3.0"
627
+ }
628
+ },
629
+ "string_decoder": {
630
+ "version": "1.0.3",
631
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
632
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
633
+ "dev": true,
634
+ "requires": {
635
+ "safe-buffer": "5.1.1"
636
+ }
637
+ },
638
+ "strip-bom-buffer": {
639
+ "version": "0.1.1",
640
+ "resolved": "https://registry.npmjs.org/strip-bom-buffer/-/strip-bom-buffer-0.1.1.tgz",
641
+ "integrity": "sha1-yj3cSRnBP5/d8wsd/xAKmDUki00=",
642
+ "dev": true,
643
+ "requires": {
644
+ "is-buffer": "1.1.6",
645
+ "is-utf8": "0.2.1"
646
+ }
647
+ },
648
+ "strip-bom-string": {
649
+ "version": "0.1.2",
650
+ "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-0.1.2.tgz",
651
+ "integrity": "sha1-nG5yCjE7qYNliVGEBcz7iKX0G5w=",
652
+ "dev": true
653
+ },
654
+ "success-symbol": {
655
+ "version": "0.1.0",
656
+ "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz",
657
+ "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc=",
658
+ "dev": true
659
+ },
660
+ "through2": {
661
+ "version": "2.0.3",
662
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
663
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
664
+ "dev": true,
665
+ "requires": {
666
+ "readable-stream": "2.3.4",
667
+ "xtend": "4.0.1"
668
+ }
669
+ },
670
+ "tmp": {
671
+ "version": "0.0.33",
672
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
673
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
674
+ "dev": true,
675
+ "requires": {
676
+ "os-tmpdir": "1.0.2"
677
+ }
678
+ },
679
+ "to-file": {
680
+ "version": "0.2.0",
681
+ "resolved": "https://registry.npmjs.org/to-file/-/to-file-0.2.0.tgz",
682
+ "integrity": "sha1-I2xsCIBl5XDe+9Fc9LTlZb5G6pM=",
683
+ "dev": true,
684
+ "requires": {
685
+ "define-property": "0.2.5",
686
+ "extend-shallow": "2.0.1",
687
+ "file-contents": "0.2.4",
688
+ "glob-parent": "2.0.0",
689
+ "is-valid-glob": "0.3.0",
690
+ "isobject": "2.1.0",
691
+ "lazy-cache": "2.0.2",
692
+ "vinyl": "1.2.0"
693
+ },
694
+ "dependencies": {
695
+ "file-contents": {
696
+ "version": "0.2.4",
697
+ "resolved": "https://registry.npmjs.org/file-contents/-/file-contents-0.2.4.tgz",
698
+ "integrity": "sha1-BQb3uO/2KvpFrkXaTfnp1H30U8s=",
699
+ "dev": true,
700
+ "requires": {
701
+ "extend-shallow": "2.0.1",
702
+ "file-stat": "0.1.3",
703
+ "graceful-fs": "4.1.11",
704
+ "is-buffer": "1.1.6",
705
+ "is-utf8": "0.2.1",
706
+ "lazy-cache": "0.2.7",
707
+ "through2": "2.0.3"
708
+ },
709
+ "dependencies": {
710
+ "lazy-cache": {
711
+ "version": "0.2.7",
712
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
713
+ "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=",
714
+ "dev": true
715
+ }
716
+ }
717
+ },
718
+ "file-stat": {
719
+ "version": "0.1.3",
720
+ "resolved": "https://registry.npmjs.org/file-stat/-/file-stat-0.1.3.tgz",
721
+ "integrity": "sha1-0PGWHX0QcykoEgpuaVVHHCpbVBE=",
722
+ "dev": true,
723
+ "requires": {
724
+ "graceful-fs": "4.1.11",
725
+ "lazy-cache": "0.2.7",
726
+ "through2": "2.0.3"
727
+ },
728
+ "dependencies": {
729
+ "lazy-cache": {
730
+ "version": "0.2.7",
731
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
732
+ "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=",
733
+ "dev": true
734
+ }
735
+ }
736
+ }
737
+ }
738
+ },
739
+ "to-object-path": {
740
+ "version": "0.3.0",
741
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
742
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
743
+ "dev": true,
744
+ "requires": {
745
+ "kind-of": "3.2.2"
746
+ },
747
+ "dependencies": {
748
+ "kind-of": {
749
+ "version": "3.2.2",
750
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
751
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
752
+ "dev": true,
753
+ "requires": {
754
+ "is-buffer": "1.1.6"
755
+ }
756
+ }
757
+ }
758
+ },
759
+ "unc-path-regex": {
760
+ "version": "0.1.2",
761
+ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
762
+ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
763
+ "dev": true
764
+ },
765
+ "util-deprecate": {
766
+ "version": "1.0.2",
767
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
768
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
769
+ "dev": true
770
+ },
771
+ "vinyl": {
772
+ "version": "1.2.0",
773
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
774
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
775
+ "dev": true,
776
+ "requires": {
777
+ "clone": "1.0.3",
778
+ "clone-stats": "0.0.1",
779
+ "replace-ext": "0.0.1"
780
+ }
781
+ },
782
+ "which": {
783
+ "version": "1.3.0",
784
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
785
+ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
786
+ "dev": true,
787
+ "requires": {
788
+ "isexe": "2.0.0"
789
+ }
790
+ },
791
+ "wrappy": {
792
+ "version": "1.0.2",
793
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
794
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
795
+ "dev": true
796
+ },
797
+ "xtend": {
798
+ "version": "4.0.1",
799
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
800
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
801
+ "dev": true
802
+ }
803
+ }
804
+ }
addons/members-admin-access/package.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-admin-access",
3
+ "version": "1.0.0",
4
+ "description": "An add-on plugin for Members that allows you to control admin access by role.",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "build:i18n": "node resources/build/i18n.js",
8
+ "build:dist": "node resources/build/dist.js"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/justintadlock/members-admin-access.git"
13
+ },
14
+ "keywords": [
15
+ "wordpress"
16
+ ],
17
+ "author": "Justin Tadlock",
18
+ "license": "GPL-2.0+",
19
+ "bugs": {
20
+ "url": "https://github.com/justintadlock/members-admin-access/issues"
21
+ },
22
+ "homepage": "https://github.com/justintadlock/members-admin-access#readme",
23
+ "devDependencies": {
24
+ "copy": "^0.3.1",
25
+ "node-wp-i18n": "^1.0.5",
26
+ "rimraf": "^2.6.2"
27
+ },
28
+ "dependencies": {}
29
+ }
addons/members-admin-access/readme.md ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Members - Admin Access
2
+
3
+ Members - Admin Access is an add-on for the [Members plugin](https://themehybrid.com/plugins/members) that allows you to control which users have access to the WordPress admin via role.
4
+
5
+ _Please note that this is a commercial plugin. It is public here on GitHub so that anyone can contribute to its development or easily post bugs. If using on a live site, please [purchase a copy of the plugin](https://themehybrid.com/plugins/members-admin-access)._
6
+
7
+ ## Professional Support
8
+
9
+ If you need professional plugin support from me, the plugin author, you can access the support forums at [Theme Hybrid](https://themehybrid.com/board/topics), which is a professional WordPress help/support site where I handle support for all my plugins and themes for a community of 75,000+ users (and growing).
10
+
11
+ ## Copyright and License
12
+
13
+ This project is licensed under the [GNU GPL](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html), version 2 or later.
14
+
15
+ 2018 &copy; [Justin Tadlock](http://justintadlock.com).
16
+
17
+ ## Documentation
18
+
19
+ The use of this plugin is fairly straightforward. You must have the [Members plugin](https://themehybrid.com/plugins/members) installed and activated to use this plugin.
20
+
21
+ You should also have, at minimum, PHP 5.6 installed on your server. If you're unsure of your PHP version, you can install the [Display PHP Version](https://wordpress.org/plugins/display-php-version/) plugin to check.
22
+
23
+ ### Usage
24
+
25
+ The first thing you'll want to do is go to Settings > Members in your WordPress admin. Click the "Admin Access" link on that page to view this plugin's settings. From there, you'll see the following settings:
26
+
27
+ #### Select Roles
28
+
29
+ This setting allows you to select which roles will always have access to the WordPress admin. Note that, by default, the Administrator role cannot be unselected and has permanent access.
30
+
31
+ #### Redirect
32
+
33
+ The redirect option allows you to set a URL to redirect users who do not have admin access. By default, this is set to your site's home page.
34
+
35
+ #### Toolbar
36
+
37
+ Select whether you want to allow the toolbar to appear for users who don't have access.
38
+
39
+ The WordPress toolbar is generally considered an extension of the admin (was previously named "admin bar"). This plugin will auto-hide core WordPress admin links from the toolbar. However, it cannot account for what third-party plugins add. Therefore, the best option is to simply keep it disabled.
addons/members-admin-access/resources/build/dist.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const copy = require( 'copy' );
2
+ const rimraf = require( 'rimraf' );
3
+
4
+ var dest = 'dist';
5
+
6
+ var src = [
7
+ '**',
8
+ '!_assets/',
9
+ '!_assets/**',
10
+ '!node_modules/',
11
+ '!node_modules/**',
12
+ '!resources/build/',
13
+ '!resources/build/**',
14
+ '!package.json',
15
+ '!package-lock.json'
16
+ ];
17
+
18
+ function distribute() {
19
+
20
+ copy( src, dest, function() {} );
21
+ }
22
+
23
+ rimraf( dest, distribute );
addons/members-admin-access/resources/build/i18n.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ const wpi18n = require( 'node-wp-i18n' );
2
+
3
+ wpi18n.makepot();
addons/members-block-permissions/.gitignore ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ /node_modules
2
+ /vendor
3
+ /composer.lock
4
+ *.map
addons/members-block-permissions/addon.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Members\BlockPermissions;
4
+
5
+ # Don't execute code if file is accessed directly.
6
+ defined( 'ABSPATH' ) || exit;
7
+
8
+ /**
9
+ * Registers the plugin activation callback.
10
+ *
11
+ * @since 1.0.0
12
+ * @access public
13
+ * @return void
14
+ */
15
+ register_activation_hook( __FILE__, function() {
16
+ require_once 'src/Activator.php';
17
+ Activator::activate();
18
+ } );
19
+
20
+ /**
21
+ * Wrapper for the plugin instance.
22
+ *
23
+ * @since 1.0.0
24
+ * @access public
25
+ * @return void
26
+ */
27
+ function plugin() {
28
+ static $instance = null;
29
+
30
+ if ( is_null( $instance ) ) {
31
+ $instance = new Plugin(
32
+ __DIR__,
33
+ plugin_dir_url( __FILE__ )
34
+ );
35
+ }
36
+
37
+ return $instance;
38
+ }
39
+
40
+ # Bootstrap plugin.
41
+ require_once 'src/Block.php';
42
+ require_once 'src/Editor.php';
43
+ require_once 'src/Integration.php';
44
+ require_once 'src/Plugin.php';
45
+
46
+ # Boot the plugin.
47
+ plugin()->boot();
addons/members-block-permissions/changelog.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ # Change Log
2
+
3
+ ## [1.0.0] - 2019-08-21
4
+
5
+ ### Added
6
+
7
+ - Plugin launch. Everything's new!
addons/members-block-permissions/composer.json ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name" : "wptrt/customize-section-button",
3
+ "description" : "A button section for the WordPress customizer.",
4
+ "keywords" : [ "wordpress" ],
5
+ "homepage" : "https://github.com/WPTRT/customize-section-button",
6
+ "license" : "GPL-2.0-or-later",
7
+ "authors" : [
8
+ {
9
+ "name" : "WordPress.org Theme Review Team",
10
+ "email" : "themes@wordpress.org",
11
+ "homepage" : "https://make.wordpress.org/themes",
12
+ "role" : "Developer"
13
+ }
14
+ ],
15
+ "support" : {
16
+ "issues" : "https://github.com/WPTRT/customize-section-button/issues"
17
+ },
18
+ "autoload" : {
19
+ "psr-4" : {
20
+ "WPTRT\\Customize\\Section\\" : "src/"
21
+ }
22
+ },
23
+ "require" : {
24
+ "php" : ">=5.6"
25
+ }
26
+ }
addons/members-block-permissions/package-lock.json ADDED
@@ -0,0 +1,9914 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-block-permissions",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 1,
5
+ "requires": true,
6
+ "dependencies": {
7
+ "@babel/code-frame": {
8
+ "version": "7.5.5",
9
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
10
+ "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
11
+ "dev": true,
12
+ "requires": {
13
+ "@babel/highlight": "^7.0.0"
14
+ }
15
+ },
16
+ "@babel/core": {
17
+ "version": "7.5.5",
18
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz",
19
+ "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==",
20
+ "dev": true,
21
+ "requires": {
22
+ "@babel/code-frame": "^7.5.5",
23
+ "@babel/generator": "^7.5.5",
24
+ "@babel/helpers": "^7.5.5",
25
+ "@babel/parser": "^7.5.5",
26
+ "@babel/template": "^7.4.4",
27
+ "@babel/traverse": "^7.5.5",
28
+ "@babel/types": "^7.5.5",
29
+ "convert-source-map": "^1.1.0",
30
+ "debug": "^4.1.0",
31
+ "json5": "^2.1.0",
32
+ "lodash": "^4.17.13",
33
+ "resolve": "^1.3.2",
34
+ "semver": "^5.4.1",
35
+ "source-map": "^0.5.0"
36
+ }
37
+ },
38
+ "@babel/generator": {
39
+ "version": "7.5.5",
40
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz",
41
+ "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==",
42
+ "dev": true,
43
+ "requires": {
44
+ "@babel/types": "^7.5.5",
45
+ "jsesc": "^2.5.1",
46
+ "lodash": "^4.17.13",
47
+ "source-map": "^0.5.0",
48
+ "trim-right": "^1.0.1"
49
+ }
50
+ },
51
+ "@babel/helper-annotate-as-pure": {
52
+ "version": "7.0.0",
53
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz",
54
+ "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==",
55
+ "dev": true,
56
+ "requires": {
57
+ "@babel/types": "^7.0.0"
58
+ }
59
+ },
60
+ "@babel/helper-builder-binary-assignment-operator-visitor": {
61
+ "version": "7.1.0",
62
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz",
63
+ "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==",
64
+ "dev": true,
65
+ "requires": {
66
+ "@babel/helper-explode-assignable-expression": "^7.1.0",
67
+ "@babel/types": "^7.0.0"
68
+ }
69
+ },
70
+ "@babel/helper-builder-react-jsx": {
71
+ "version": "7.3.0",
72
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz",
73
+ "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==",
74
+ "dev": true,
75
+ "requires": {
76
+ "@babel/types": "^7.3.0",
77
+ "esutils": "^2.0.0"
78
+ }
79
+ },
80
+ "@babel/helper-call-delegate": {
81
+ "version": "7.4.4",
82
+ "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz",
83
+ "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==",
84
+ "dev": true,
85
+ "requires": {
86
+ "@babel/helper-hoist-variables": "^7.4.4",
87
+ "@babel/traverse": "^7.4.4",
88
+ "@babel/types": "^7.4.4"
89
+ }
90
+ },
91
+ "@babel/helper-define-map": {
92
+ "version": "7.5.5",
93
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz",
94
+ "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==",
95
+ "dev": true,
96
+ "requires": {
97
+ "@babel/helper-function-name": "^7.1.0",
98
+ "@babel/types": "^7.5.5",
99
+ "lodash": "^4.17.13"
100
+ }
101
+ },
102
+ "@babel/helper-explode-assignable-expression": {
103
+ "version": "7.1.0",
104
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz",
105
+ "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==",
106
+ "dev": true,
107
+ "requires": {
108
+ "@babel/traverse": "^7.1.0",
109
+ "@babel/types": "^7.0.0"
110
+ }
111
+ },
112
+ "@babel/helper-function-name": {
113
+ "version": "7.1.0",
114
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
115
+ "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
116
+ "dev": true,
117
+ "requires": {
118
+ "@babel/helper-get-function-arity": "^7.0.0",
119
+ "@babel/template": "^7.1.0",
120
+ "@babel/types": "^7.0.0"
121
+ }
122
+ },
123
+ "@babel/helper-get-function-arity": {
124
+ "version": "7.0.0",
125
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
126
+ "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
127
+ "dev": true,
128
+ "requires": {
129
+ "@babel/types": "^7.0.0"
130
+ }
131
+ },
132
+ "@babel/helper-hoist-variables": {
133
+ "version": "7.4.4",
134
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz",
135
+ "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==",
136
+ "dev": true,
137
+ "requires": {
138
+ "@babel/types": "^7.4.4"
139
+ }
140
+ },
141
+ "@babel/helper-member-expression-to-functions": {
142
+ "version": "7.5.5",
143
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz",
144
+ "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==",
145
+ "dev": true,
146
+ "requires": {
147
+ "@babel/types": "^7.5.5"
148
+ }
149
+ },
150
+ "@babel/helper-module-imports": {
151
+ "version": "7.0.0",
152
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz",
153
+ "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==",
154
+ "dev": true,
155
+ "requires": {
156
+ "@babel/types": "^7.0.0"
157
+ }
158
+ },
159
+ "@babel/helper-module-transforms": {
160
+ "version": "7.5.5",
161
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz",
162
+ "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==",
163
+ "dev": true,
164
+ "requires": {
165
+ "@babel/helper-module-imports": "^7.0.0",
166
+ "@babel/helper-simple-access": "^7.1.0",
167
+ "@babel/helper-split-export-declaration": "^7.4.4",
168
+ "@babel/template": "^7.4.4",
169
+ "@babel/types": "^7.5.5",
170
+ "lodash": "^4.17.13"
171
+ }
172
+ },
173
+ "@babel/helper-optimise-call-expression": {
174
+ "version": "7.0.0",
175
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz",
176
+ "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==",
177
+ "dev": true,
178
+ "requires": {
179
+ "@babel/types": "^7.0.0"
180
+ }
181
+ },
182
+ "@babel/helper-plugin-utils": {
183
+ "version": "7.0.0",
184
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz",
185
+ "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==",
186
+ "dev": true
187
+ },
188
+ "@babel/helper-regex": {
189
+ "version": "7.5.5",
190
+ "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz",
191
+ "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==",
192
+ "dev": true,
193
+ "requires": {
194
+ "lodash": "^4.17.13"
195
+ }
196
+ },
197
+ "@babel/helper-remap-async-to-generator": {
198
+ "version": "7.1.0",
199
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz",
200
+ "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==",
201
+ "dev": true,
202
+ "requires": {
203
+ "@babel/helper-annotate-as-pure": "^7.0.0",
204
+ "@babel/helper-wrap-function": "^7.1.0",
205
+ "@babel/template": "^7.1.0",
206
+ "@babel/traverse": "^7.1.0",
207
+ "@babel/types": "^7.0.0"
208
+ }
209
+ },
210
+ "@babel/helper-replace-supers": {
211
+ "version": "7.5.5",
212
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz",
213
+ "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==",
214
+ "dev": true,
215
+ "requires": {
216
+ "@babel/helper-member-expression-to-functions": "^7.5.5",
217
+ "@babel/helper-optimise-call-expression": "^7.0.0",
218
+ "@babel/traverse": "^7.5.5",
219
+ "@babel/types": "^7.5.5"
220
+ }
221
+ },
222
+ "@babel/helper-simple-access": {
223
+ "version": "7.1.0",
224
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz",
225
+ "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==",
226
+ "dev": true,
227
+ "requires": {
228
+ "@babel/template": "^7.1.0",
229
+ "@babel/types": "^7.0.0"
230
+ }
231
+ },
232
+ "@babel/helper-split-export-declaration": {
233
+ "version": "7.4.4",
234
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
235
+ "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
236
+ "dev": true,
237
+ "requires": {
238
+ "@babel/types": "^7.4.4"
239
+ }
240
+ },
241
+ "@babel/helper-wrap-function": {
242
+ "version": "7.2.0",
243
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz",
244
+ "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==",
245
+ "dev": true,
246
+ "requires": {
247
+ "@babel/helper-function-name": "^7.1.0",
248
+ "@babel/template": "^7.1.0",
249
+ "@babel/traverse": "^7.1.0",
250
+ "@babel/types": "^7.2.0"
251
+ }
252
+ },
253
+ "@babel/helpers": {
254
+ "version": "7.5.5",
255
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz",
256
+ "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==",
257
+ "dev": true,
258
+ "requires": {
259
+ "@babel/template": "^7.4.4",
260
+ "@babel/traverse": "^7.5.5",
261
+ "@babel/types": "^7.5.5"
262
+ }
263
+ },
264
+ "@babel/highlight": {
265
+ "version": "7.5.0",
266
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
267
+ "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
268
+ "dev": true,
269
+ "requires": {
270
+ "chalk": "^2.0.0",
271
+ "esutils": "^2.0.2",
272
+ "js-tokens": "^4.0.0"
273
+ }
274
+ },
275
+ "@babel/parser": {
276
+ "version": "7.5.5",
277
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz",
278
+ "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==",
279
+ "dev": true
280
+ },
281
+ "@babel/plugin-proposal-async-generator-functions": {
282
+ "version": "7.2.0",
283
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz",
284
+ "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==",
285
+ "dev": true,
286
+ "requires": {
287
+ "@babel/helper-plugin-utils": "^7.0.0",
288
+ "@babel/helper-remap-async-to-generator": "^7.1.0",
289
+ "@babel/plugin-syntax-async-generators": "^7.2.0"
290
+ }
291
+ },
292
+ "@babel/plugin-proposal-dynamic-import": {
293
+ "version": "7.5.0",
294
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz",
295
+ "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==",
296
+ "dev": true,
297
+ "requires": {
298
+ "@babel/helper-plugin-utils": "^7.0.0",
299
+ "@babel/plugin-syntax-dynamic-import": "^7.2.0"
300
+ }
301
+ },
302
+ "@babel/plugin-proposal-json-strings": {
303
+ "version": "7.2.0",
304
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz",
305
+ "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==",
306
+ "dev": true,
307
+ "requires": {
308
+ "@babel/helper-plugin-utils": "^7.0.0",
309
+ "@babel/plugin-syntax-json-strings": "^7.2.0"
310
+ }
311
+ },
312
+ "@babel/plugin-proposal-object-rest-spread": {
313
+ "version": "7.5.5",
314
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz",
315
+ "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==",
316
+ "dev": true,
317
+ "requires": {
318
+ "@babel/helper-plugin-utils": "^7.0.0",
319
+ "@babel/plugin-syntax-object-rest-spread": "^7.2.0"
320
+ }
321
+ },
322
+ "@babel/plugin-proposal-optional-catch-binding": {
323
+ "version": "7.2.0",
324
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz",
325
+ "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==",
326
+ "dev": true,
327
+ "requires": {
328
+ "@babel/helper-plugin-utils": "^7.0.0",
329
+ "@babel/plugin-syntax-optional-catch-binding": "^7.2.0"
330
+ }
331
+ },
332
+ "@babel/plugin-proposal-unicode-property-regex": {
333
+ "version": "7.4.4",
334
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz",
335
+ "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==",
336
+ "dev": true,
337
+ "requires": {
338
+ "@babel/helper-plugin-utils": "^7.0.0",
339
+ "@babel/helper-regex": "^7.4.4",
340
+ "regexpu-core": "^4.5.4"
341
+ }
342
+ },
343
+ "@babel/plugin-syntax-async-generators": {
344
+ "version": "7.2.0",
345
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz",
346
+ "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==",
347
+ "dev": true,
348
+ "requires": {
349
+ "@babel/helper-plugin-utils": "^7.0.0"
350
+ }
351
+ },
352
+ "@babel/plugin-syntax-dynamic-import": {
353
+ "version": "7.2.0",
354
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz",
355
+ "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==",
356
+ "dev": true,
357
+ "requires": {
358
+ "@babel/helper-plugin-utils": "^7.0.0"
359
+ }
360
+ },
361
+ "@babel/plugin-syntax-json-strings": {
362
+ "version": "7.2.0",
363
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz",
364
+ "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==",
365
+ "dev": true,
366
+ "requires": {
367
+ "@babel/helper-plugin-utils": "^7.0.0"
368
+ }
369
+ },
370
+ "@babel/plugin-syntax-jsx": {
371
+ "version": "7.2.0",
372
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz",
373
+ "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==",
374
+ "dev": true,
375
+ "requires": {
376
+ "@babel/helper-plugin-utils": "^7.0.0"
377
+ }
378
+ },
379
+ "@babel/plugin-syntax-object-rest-spread": {
380
+ "version": "7.2.0",
381
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz",
382
+ "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==",
383
+ "dev": true,
384
+ "requires": {
385
+ "@babel/helper-plugin-utils": "^7.0.0"
386
+ }
387
+ },
388
+ "@babel/plugin-syntax-optional-catch-binding": {
389
+ "version": "7.2.0",
390
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz",
391
+ "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==",
392
+ "dev": true,
393
+ "requires": {
394
+ "@babel/helper-plugin-utils": "^7.0.0"
395
+ }
396
+ },
397
+ "@babel/plugin-transform-arrow-functions": {
398
+ "version": "7.2.0",
399
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz",
400
+ "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==",
401
+ "dev": true,
402
+ "requires": {
403
+ "@babel/helper-plugin-utils": "^7.0.0"
404
+ }
405
+ },
406
+ "@babel/plugin-transform-async-to-generator": {
407
+ "version": "7.5.0",
408
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz",
409
+ "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==",
410
+ "dev": true,
411
+ "requires": {
412
+ "@babel/helper-module-imports": "^7.0.0",
413
+ "@babel/helper-plugin-utils": "^7.0.0",
414
+ "@babel/helper-remap-async-to-generator": "^7.1.0"
415
+ }
416
+ },
417
+ "@babel/plugin-transform-block-scoped-functions": {
418
+ "version": "7.2.0",
419
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz",
420
+ "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==",
421
+ "dev": true,
422
+ "requires": {
423
+ "@babel/helper-plugin-utils": "^7.0.0"
424
+ }
425
+ },
426
+ "@babel/plugin-transform-block-scoping": {
427
+ "version": "7.5.5",
428
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz",
429
+ "integrity": "sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==",
430
+ "dev": true,
431
+ "requires": {
432
+ "@babel/helper-plugin-utils": "^7.0.0",
433
+ "lodash": "^4.17.13"
434
+ }
435
+ },
436
+ "@babel/plugin-transform-classes": {
437
+ "version": "7.5.5",
438
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz",
439
+ "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==",
440
+ "dev": true,
441
+ "requires": {
442
+ "@babel/helper-annotate-as-pure": "^7.0.0",
443
+ "@babel/helper-define-map": "^7.5.5",
444
+ "@babel/helper-function-name": "^7.1.0",
445
+ "@babel/helper-optimise-call-expression": "^7.0.0",
446
+ "@babel/helper-plugin-utils": "^7.0.0",
447
+ "@babel/helper-replace-supers": "^7.5.5",
448
+ "@babel/helper-split-export-declaration": "^7.4.4",
449
+ "globals": "^11.1.0"
450
+ }
451
+ },
452
+ "@babel/plugin-transform-computed-properties": {
453
+ "version": "7.2.0",
454
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz",
455
+ "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==",
456
+ "dev": true,
457
+ "requires": {
458
+ "@babel/helper-plugin-utils": "^7.0.0"
459
+ }
460
+ },
461
+ "@babel/plugin-transform-destructuring": {
462
+ "version": "7.5.0",
463
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz",
464
+ "integrity": "sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==",
465
+ "dev": true,
466
+ "requires": {
467
+ "@babel/helper-plugin-utils": "^7.0.0"
468
+ }
469
+ },
470
+ "@babel/plugin-transform-dotall-regex": {
471
+ "version": "7.4.4",
472
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz",
473
+ "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==",
474
+ "dev": true,
475
+ "requires": {
476
+ "@babel/helper-plugin-utils": "^7.0.0",
477
+ "@babel/helper-regex": "^7.4.4",
478
+ "regexpu-core": "^4.5.4"
479
+ }
480
+ },
481
+ "@babel/plugin-transform-duplicate-keys": {
482
+ "version": "7.5.0",
483
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz",
484
+ "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==",
485
+ "dev": true,
486
+ "requires": {
487
+ "@babel/helper-plugin-utils": "^7.0.0"
488
+ }
489
+ },
490
+ "@babel/plugin-transform-exponentiation-operator": {
491
+ "version": "7.2.0",
492
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz",
493
+ "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==",
494
+ "dev": true,
495
+ "requires": {
496
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0",
497
+ "@babel/helper-plugin-utils": "^7.0.0"
498
+ }
499
+ },
500
+ "@babel/plugin-transform-for-of": {
501
+ "version": "7.4.4",
502
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz",
503
+ "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==",
504
+ "dev": true,
505
+ "requires": {
506
+ "@babel/helper-plugin-utils": "^7.0.0"
507
+ }
508
+ },
509
+ "@babel/plugin-transform-function-name": {
510
+ "version": "7.4.4",
511
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz",
512
+ "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==",
513
+ "dev": true,
514
+ "requires": {
515
+ "@babel/helper-function-name": "^7.1.0",
516
+ "@babel/helper-plugin-utils": "^7.0.0"
517
+ }
518
+ },
519
+ "@babel/plugin-transform-literals": {
520
+ "version": "7.2.0",
521
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz",
522
+ "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==",
523
+ "dev": true,
524
+ "requires": {
525
+ "@babel/helper-plugin-utils": "^7.0.0"
526
+ }
527
+ },
528
+ "@babel/plugin-transform-member-expression-literals": {
529
+ "version": "7.2.0",
530
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz",
531
+ "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==",
532
+ "dev": true,
533
+ "requires": {
534
+ "@babel/helper-plugin-utils": "^7.0.0"
535
+ }
536
+ },
537
+ "@babel/plugin-transform-modules-amd": {
538
+ "version": "7.5.0",
539
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz",
540
+ "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==",
541
+ "dev": true,
542
+ "requires": {
543
+ "@babel/helper-module-transforms": "^7.1.0",
544
+ "@babel/helper-plugin-utils": "^7.0.0",
545
+ "babel-plugin-dynamic-import-node": "^2.3.0"
546
+ }
547
+ },
548
+ "@babel/plugin-transform-modules-commonjs": {
549
+ "version": "7.5.0",
550
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz",
551
+ "integrity": "sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==",
552
+ "dev": true,
553
+ "requires": {
554
+ "@babel/helper-module-transforms": "^7.4.4",
555
+ "@babel/helper-plugin-utils": "^7.0.0",
556
+ "@babel/helper-simple-access": "^7.1.0",
557
+ "babel-plugin-dynamic-import-node": "^2.3.0"
558
+ }
559
+ },
560
+ "@babel/plugin-transform-modules-systemjs": {
561
+ "version": "7.5.0",
562
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz",
563
+ "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==",
564
+ "dev": true,
565
+ "requires": {
566
+ "@babel/helper-hoist-variables": "^7.4.4",
567
+ "@babel/helper-plugin-utils": "^7.0.0",
568
+ "babel-plugin-dynamic-import-node": "^2.3.0"
569
+ }
570
+ },
571
+ "@babel/plugin-transform-modules-umd": {
572
+ "version": "7.2.0",
573
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz",
574
+ "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==",
575
+ "dev": true,
576
+ "requires": {
577
+ "@babel/helper-module-transforms": "^7.1.0",
578
+ "@babel/helper-plugin-utils": "^7.0.0"
579
+ }
580
+ },
581
+ "@babel/plugin-transform-named-capturing-groups-regex": {
582
+ "version": "7.4.5",
583
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz",
584
+ "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==",
585
+ "dev": true,
586
+ "requires": {
587
+ "regexp-tree": "^0.1.6"
588
+ }
589
+ },
590
+ "@babel/plugin-transform-new-target": {
591
+ "version": "7.4.4",
592
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz",
593
+ "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==",
594
+ "dev": true,
595
+ "requires": {
596
+ "@babel/helper-plugin-utils": "^7.0.0"
597
+ }
598
+ },
599
+ "@babel/plugin-transform-object-super": {
600
+ "version": "7.5.5",
601
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz",
602
+ "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==",
603
+ "dev": true,
604
+ "requires": {
605
+ "@babel/helper-plugin-utils": "^7.0.0",
606
+ "@babel/helper-replace-supers": "^7.5.5"
607
+ }
608
+ },
609
+ "@babel/plugin-transform-parameters": {
610
+ "version": "7.4.4",
611
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz",
612
+ "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==",
613
+ "dev": true,
614
+ "requires": {
615
+ "@babel/helper-call-delegate": "^7.4.4",
616
+ "@babel/helper-get-function-arity": "^7.0.0",
617
+ "@babel/helper-plugin-utils": "^7.0.0"
618
+ }
619
+ },
620
+ "@babel/plugin-transform-property-literals": {
621
+ "version": "7.2.0",
622
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz",
623
+ "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==",
624
+ "dev": true,
625
+ "requires": {
626
+ "@babel/helper-plugin-utils": "^7.0.0"
627
+ }
628
+ },
629
+ "@babel/plugin-transform-react-display-name": {
630
+ "version": "7.2.0",
631
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz",
632
+ "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==",
633
+ "dev": true,
634
+ "requires": {
635
+ "@babel/helper-plugin-utils": "^7.0.0"
636
+ }
637
+ },
638
+ "@babel/plugin-transform-react-jsx": {
639
+ "version": "7.3.0",
640
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz",
641
+ "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==",
642
+ "dev": true,
643
+ "requires": {
644
+ "@babel/helper-builder-react-jsx": "^7.3.0",
645
+ "@babel/helper-plugin-utils": "^7.0.0",
646
+ "@babel/plugin-syntax-jsx": "^7.2.0"
647
+ }
648
+ },
649
+ "@babel/plugin-transform-react-jsx-self": {
650
+ "version": "7.2.0",
651
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz",
652
+ "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==",
653
+ "dev": true,
654
+ "requires": {
655
+ "@babel/helper-plugin-utils": "^7.0.0",
656
+ "@babel/plugin-syntax-jsx": "^7.2.0"
657
+ }
658
+ },
659
+ "@babel/plugin-transform-react-jsx-source": {
660
+ "version": "7.5.0",
661
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz",
662
+ "integrity": "sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg==",
663
+ "dev": true,
664
+ "requires": {
665
+ "@babel/helper-plugin-utils": "^7.0.0",
666
+ "@babel/plugin-syntax-jsx": "^7.2.0"
667
+ }
668
+ },
669
+ "@babel/plugin-transform-regenerator": {
670
+ "version": "7.4.5",
671
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz",
672
+ "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==",
673
+ "dev": true,
674
+ "requires": {
675
+ "regenerator-transform": "^0.14.0"
676
+ }
677
+ },
678
+ "@babel/plugin-transform-reserved-words": {
679
+ "version": "7.2.0",
680
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz",
681
+ "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==",
682
+ "dev": true,
683
+ "requires": {
684
+ "@babel/helper-plugin-utils": "^7.0.0"
685
+ }
686
+ },
687
+ "@babel/plugin-transform-runtime": {
688
+ "version": "7.5.5",
689
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.5.tgz",
690
+ "integrity": "sha512-6Xmeidsun5rkwnGfMOp6/z9nSzWpHFNVr2Jx7kwoq4mVatQfQx5S56drBgEHF+XQbKOdIaOiMIINvp/kAwMN+w==",
691
+ "dev": true,
692
+ "requires": {
693
+ "@babel/helper-module-imports": "^7.0.0",
694
+ "@babel/helper-plugin-utils": "^7.0.0",
695
+ "resolve": "^1.8.1",
696
+ "semver": "^5.5.1"
697
+ }
698
+ },
699
+ "@babel/plugin-transform-shorthand-properties": {
700
+ "version": "7.2.0",
701
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz",
702
+ "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==",
703
+ "dev": true,
704
+ "requires": {
705
+ "@babel/helper-plugin-utils": "^7.0.0"
706
+ }
707
+ },
708
+ "@babel/plugin-transform-spread": {
709
+ "version": "7.2.2",
710
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz",
711
+ "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==",
712
+ "dev": true,
713
+ "requires": {
714
+ "@babel/helper-plugin-utils": "^7.0.0"
715
+ }
716
+ },
717
+ "@babel/plugin-transform-sticky-regex": {
718
+ "version": "7.2.0",
719
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz",
720
+ "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==",
721
+ "dev": true,
722
+ "requires": {
723
+ "@babel/helper-plugin-utils": "^7.0.0",
724
+ "@babel/helper-regex": "^7.0.0"
725
+ }
726
+ },
727
+ "@babel/plugin-transform-template-literals": {
728
+ "version": "7.4.4",
729
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz",
730
+ "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==",
731
+ "dev": true,
732
+ "requires": {
733
+ "@babel/helper-annotate-as-pure": "^7.0.0",
734
+ "@babel/helper-plugin-utils": "^7.0.0"
735
+ }
736
+ },
737
+ "@babel/plugin-transform-typeof-symbol": {
738
+ "version": "7.2.0",
739
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz",
740
+ "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==",
741
+ "dev": true,
742
+ "requires": {
743
+ "@babel/helper-plugin-utils": "^7.0.0"
744
+ }
745
+ },
746
+ "@babel/plugin-transform-unicode-regex": {
747
+ "version": "7.4.4",
748
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz",
749
+ "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==",
750
+ "dev": true,
751
+ "requires": {
752
+ "@babel/helper-plugin-utils": "^7.0.0",
753
+ "@babel/helper-regex": "^7.4.4",
754
+ "regexpu-core": "^4.5.4"
755
+ }
756
+ },
757
+ "@babel/preset-env": {
758
+ "version": "7.5.5",
759
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.5.5.tgz",
760
+ "integrity": "sha512-GMZQka/+INwsMz1A5UEql8tG015h5j/qjptpKY2gJ7giy8ohzU710YciJB5rcKsWGWHiW3RUnHib0E5/m3Tp3A==",
761
+ "dev": true,
762
+ "requires": {
763
+ "@babel/helper-module-imports": "^7.0.0",
764
+ "@babel/helper-plugin-utils": "^7.0.0",
765
+ "@babel/plugin-proposal-async-generator-functions": "^7.2.0",
766
+ "@babel/plugin-proposal-dynamic-import": "^7.5.0",
767
+ "@babel/plugin-proposal-json-strings": "^7.2.0",
768
+ "@babel/plugin-proposal-object-rest-spread": "^7.5.5",
769
+ "@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
770
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
771
+ "@babel/plugin-syntax-async-generators": "^7.2.0",
772
+ "@babel/plugin-syntax-dynamic-import": "^7.2.0",
773
+ "@babel/plugin-syntax-json-strings": "^7.2.0",
774
+ "@babel/plugin-syntax-object-rest-spread": "^7.2.0",
775
+ "@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
776
+ "@babel/plugin-transform-arrow-functions": "^7.2.0",
777
+ "@babel/plugin-transform-async-to-generator": "^7.5.0",
778
+ "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
779
+ "@babel/plugin-transform-block-scoping": "^7.5.5",
780
+ "@babel/plugin-transform-classes": "^7.5.5",
781
+ "@babel/plugin-transform-computed-properties": "^7.2.0",
782
+ "@babel/plugin-transform-destructuring": "^7.5.0",
783
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
784
+ "@babel/plugin-transform-duplicate-keys": "^7.5.0",
785
+ "@babel/plugin-transform-exponentiation-operator": "^7.2.0",
786
+ "@babel/plugin-transform-for-of": "^7.4.4",
787
+ "@babel/plugin-transform-function-name": "^7.4.4",
788
+ "@babel/plugin-transform-literals": "^7.2.0",
789
+ "@babel/plugin-transform-member-expression-literals": "^7.2.0",
790
+ "@babel/plugin-transform-modules-amd": "^7.5.0",
791
+ "@babel/plugin-transform-modules-commonjs": "^7.5.0",
792
+ "@babel/plugin-transform-modules-systemjs": "^7.5.0",
793
+ "@babel/plugin-transform-modules-umd": "^7.2.0",
794
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5",
795
+ "@babel/plugin-transform-new-target": "^7.4.4",
796
+ "@babel/plugin-transform-object-super": "^7.5.5",
797
+ "@babel/plugin-transform-parameters": "^7.4.4",
798
+ "@babel/plugin-transform-property-literals": "^7.2.0",
799
+ "@babel/plugin-transform-regenerator": "^7.4.5",
800
+ "@babel/plugin-transform-reserved-words": "^7.2.0",
801
+ "@babel/plugin-transform-shorthand-properties": "^7.2.0",
802
+ "@babel/plugin-transform-spread": "^7.2.0",
803
+ "@babel/plugin-transform-sticky-regex": "^7.2.0",
804
+ "@babel/plugin-transform-template-literals": "^7.4.4",
805
+ "@babel/plugin-transform-typeof-symbol": "^7.2.0",
806
+ "@babel/plugin-transform-unicode-regex": "^7.4.4",
807
+ "@babel/types": "^7.5.5",
808
+ "browserslist": "^4.6.0",
809
+ "core-js-compat": "^3.1.1",
810
+ "invariant": "^2.2.2",
811
+ "js-levenshtein": "^1.1.3",
812
+ "semver": "^5.5.0"
813
+ }
814
+ },
815
+ "@babel/preset-react": {
816
+ "version": "7.0.0",
817
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz",
818
+ "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==",
819
+ "dev": true,
820
+ "requires": {
821
+ "@babel/helper-plugin-utils": "^7.0.0",
822
+ "@babel/plugin-transform-react-display-name": "^7.0.0",
823
+ "@babel/plugin-transform-react-jsx": "^7.0.0",
824
+ "@babel/plugin-transform-react-jsx-self": "^7.0.0",
825
+ "@babel/plugin-transform-react-jsx-source": "^7.0.0"
826
+ }
827
+ },
828
+ "@babel/runtime": {
829
+ "version": "7.5.5",
830
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.5.tgz",
831
+ "integrity": "sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==",
832
+ "dev": true,
833
+ "requires": {
834
+ "regenerator-runtime": "^0.13.2"
835
+ }
836
+ },
837
+ "@babel/template": {
838
+ "version": "7.4.4",
839
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz",
840
+ "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==",
841
+ "dev": true,
842
+ "requires": {
843
+ "@babel/code-frame": "^7.0.0",
844
+ "@babel/parser": "^7.4.4",
845
+ "@babel/types": "^7.4.4"
846
+ }
847
+ },
848
+ "@babel/traverse": {
849
+ "version": "7.5.5",
850
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz",
851
+ "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==",
852
+ "dev": true,
853
+ "requires": {
854
+ "@babel/code-frame": "^7.5.5",
855
+ "@babel/generator": "^7.5.5",
856
+ "@babel/helper-function-name": "^7.1.0",
857
+ "@babel/helper-split-export-declaration": "^7.4.4",
858
+ "@babel/parser": "^7.5.5",
859
+ "@babel/types": "^7.5.5",
860
+ "debug": "^4.1.0",
861
+ "globals": "^11.1.0",
862
+ "lodash": "^4.17.13"
863
+ }
864
+ },
865
+ "@babel/types": {
866
+ "version": "7.5.5",
867
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz",
868
+ "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==",
869
+ "dev": true,
870
+ "requires": {
871
+ "esutils": "^2.0.2",
872
+ "lodash": "^4.17.13",
873
+ "to-fast-properties": "^2.0.0"
874
+ }
875
+ },
876
+ "@csstools/convert-colors": {
877
+ "version": "1.4.0",
878
+ "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz",
879
+ "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==",
880
+ "dev": true
881
+ },
882
+ "@mrmlnc/readdir-enhanced": {
883
+ "version": "2.2.1",
884
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
885
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
886
+ "dev": true,
887
+ "requires": {
888
+ "call-me-maybe": "^1.0.1",
889
+ "glob-to-regexp": "^0.3.0"
890
+ }
891
+ },
892
+ "@nodelib/fs.stat": {
893
+ "version": "1.1.3",
894
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
895
+ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
896
+ "dev": true
897
+ },
898
+ "@types/events": {
899
+ "version": "3.0.0",
900
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
901
+ "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
902
+ "dev": true
903
+ },
904
+ "@types/glob": {
905
+ "version": "7.1.1",
906
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
907
+ "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
908
+ "dev": true,
909
+ "requires": {
910
+ "@types/events": "*",
911
+ "@types/minimatch": "*",
912
+ "@types/node": "*"
913
+ }
914
+ },
915
+ "@types/minimatch": {
916
+ "version": "3.0.3",
917
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
918
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
919
+ "dev": true
920
+ },
921
+ "@types/node": {
922
+ "version": "12.6.8",
923
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.8.tgz",
924
+ "integrity": "sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==",
925
+ "dev": true
926
+ },
927
+ "@types/q": {
928
+ "version": "1.5.2",
929
+ "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz",
930
+ "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==",
931
+ "dev": true
932
+ },
933
+ "@vue/component-compiler-utils": {
934
+ "version": "2.6.0",
935
+ "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-2.6.0.tgz",
936
+ "integrity": "sha512-IHjxt7LsOFYc0DkTncB7OXJL7UzwOLPPQCfEUNyxL2qt+tF12THV+EO33O1G2Uk4feMSWua3iD39Itszx0f0bw==",
937
+ "dev": true,
938
+ "requires": {
939
+ "consolidate": "^0.15.1",
940
+ "hash-sum": "^1.0.2",
941
+ "lru-cache": "^4.1.2",
942
+ "merge-source-map": "^1.1.0",
943
+ "postcss": "^7.0.14",
944
+ "postcss-selector-parser": "^5.0.0",
945
+ "prettier": "1.16.3",
946
+ "source-map": "~0.6.1",
947
+ "vue-template-es2015-compiler": "^1.9.0"
948
+ },
949
+ "dependencies": {
950
+ "lru-cache": {
951
+ "version": "4.1.5",
952
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
953
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
954
+ "dev": true,
955
+ "requires": {
956
+ "pseudomap": "^1.0.2",
957
+ "yallist": "^2.1.2"
958
+ }
959
+ },
960
+ "source-map": {
961
+ "version": "0.6.1",
962
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
963
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
964
+ "dev": true
965
+ },
966
+ "yallist": {
967
+ "version": "2.1.2",
968
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
969
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
970
+ "dev": true
971
+ }
972
+ }
973
+ },
974
+ "@webassemblyjs/ast": {
975
+ "version": "1.8.5",
976
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz",
977
+ "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==",
978
+ "dev": true,
979
+ "requires": {
980
+ "@webassemblyjs/helper-module-context": "1.8.5",
981
+ "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
982
+ "@webassemblyjs/wast-parser": "1.8.5"
983
+ }
984
+ },
985
+ "@webassemblyjs/floating-point-hex-parser": {
986
+ "version": "1.8.5",
987
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz",
988
+ "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==",
989
+ "dev": true
990
+ },
991
+ "@webassemblyjs/helper-api-error": {
992
+ "version": "1.8.5",
993
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz",
994
+ "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==",
995
+ "dev": true
996
+ },
997
+ "@webassemblyjs/helper-buffer": {
998
+ "version": "1.8.5",
999
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz",
1000
+ "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==",
1001
+ "dev": true
1002
+ },
1003
+ "@webassemblyjs/helper-code-frame": {
1004
+ "version": "1.8.5",
1005
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz",
1006
+ "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==",
1007
+ "dev": true,
1008
+ "requires": {
1009
+ "@webassemblyjs/wast-printer": "1.8.5"
1010
+ }
1011
+ },
1012
+ "@webassemblyjs/helper-fsm": {
1013
+ "version": "1.8.5",
1014
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz",
1015
+ "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==",
1016
+ "dev": true
1017
+ },
1018
+ "@webassemblyjs/helper-module-context": {
1019
+ "version": "1.8.5",
1020
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz",
1021
+ "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==",
1022
+ "dev": true,
1023
+ "requires": {
1024
+ "@webassemblyjs/ast": "1.8.5",
1025
+ "mamacro": "^0.0.3"
1026
+ }
1027
+ },
1028
+ "@webassemblyjs/helper-wasm-bytecode": {
1029
+ "version": "1.8.5",
1030
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz",
1031
+ "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==",
1032
+ "dev": true
1033
+ },
1034
+ "@webassemblyjs/helper-wasm-section": {
1035
+ "version": "1.8.5",
1036
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz",
1037
+ "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==",
1038
+ "dev": true,
1039
+ "requires": {
1040
+ "@webassemblyjs/ast": "1.8.5",
1041
+ "@webassemblyjs/helper-buffer": "1.8.5",
1042
+ "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
1043
+ "@webassemblyjs/wasm-gen": "1.8.5"
1044
+ }
1045
+ },
1046
+ "@webassemblyjs/ieee754": {
1047
+ "version": "1.8.5",
1048
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz",
1049
+ "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==",
1050
+ "dev": true,
1051
+ "requires": {
1052
+ "@xtuc/ieee754": "^1.2.0"
1053
+ }
1054
+ },
1055
+ "@webassemblyjs/leb128": {
1056
+ "version": "1.8.5",
1057
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz",
1058
+ "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==",
1059
+ "dev": true,
1060
+ "requires": {
1061
+ "@xtuc/long": "4.2.2"
1062
+ }
1063
+ },
1064
+ "@webassemblyjs/utf8": {
1065
+ "version": "1.8.5",
1066
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz",
1067
+ "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==",
1068
+ "dev": true
1069
+ },
1070
+ "@webassemblyjs/wasm-edit": {
1071
+ "version": "1.8.5",
1072
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz",
1073
+ "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==",
1074
+ "dev": true,
1075
+ "requires": {
1076
+ "@webassemblyjs/ast": "1.8.5",
1077
+ "@webassemblyjs/helper-buffer": "1.8.5",
1078
+ "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
1079
+ "@webassemblyjs/helper-wasm-section": "1.8.5",
1080
+ "@webassemblyjs/wasm-gen": "1.8.5",
1081
+ "@webassemblyjs/wasm-opt": "1.8.5",
1082
+ "@webassemblyjs/wasm-parser": "1.8.5",
1083
+ "@webassemblyjs/wast-printer": "1.8.5"
1084
+ }
1085
+ },
1086
+ "@webassemblyjs/wasm-gen": {
1087
+ "version": "1.8.5",
1088
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz",
1089
+ "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==",
1090
+ "dev": true,
1091
+ "requires": {
1092
+ "@webassemblyjs/ast": "1.8.5",
1093
+ "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
1094
+ "@webassemblyjs/ieee754": "1.8.5",
1095
+ "@webassemblyjs/leb128": "1.8.5",
1096
+ "@webassemblyjs/utf8": "1.8.5"
1097
+ }
1098
+ },
1099
+ "@webassemblyjs/wasm-opt": {
1100
+ "version": "1.8.5",
1101
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz",
1102
+ "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==",
1103
+ "dev": true,
1104
+ "requires": {
1105
+ "@webassemblyjs/ast": "1.8.5",
1106
+ "@webassemblyjs/helper-buffer": "1.8.5",
1107
+ "@webassemblyjs/wasm-gen": "1.8.5",
1108
+ "@webassemblyjs/wasm-parser": "1.8.5"
1109
+ }
1110
+ },
1111
+ "@webassemblyjs/wasm-parser": {
1112
+ "version": "1.8.5",
1113
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz",
1114
+ "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==",
1115
+ "dev": true,
1116
+ "requires": {
1117
+ "@webassemblyjs/ast": "1.8.5",
1118
+ "@webassemblyjs/helper-api-error": "1.8.5",
1119
+ "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
1120
+ "@webassemblyjs/ieee754": "1.8.5",
1121
+ "@webassemblyjs/leb128": "1.8.5",
1122
+ "@webassemblyjs/utf8": "1.8.5"
1123
+ }
1124
+ },
1125
+ "@webassemblyjs/wast-parser": {
1126
+ "version": "1.8.5",
1127
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz",
1128
+ "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==",
1129
+ "dev": true,
1130
+ "requires": {
1131
+ "@webassemblyjs/ast": "1.8.5",
1132
+ "@webassemblyjs/floating-point-hex-parser": "1.8.5",
1133
+ "@webassemblyjs/helper-api-error": "1.8.5",
1134
+ "@webassemblyjs/helper-code-frame": "1.8.5",
1135
+ "@webassemblyjs/helper-fsm": "1.8.5",
1136
+ "@xtuc/long": "4.2.2"
1137
+ }
1138
+ },
1139
+ "@webassemblyjs/wast-printer": {
1140
+ "version": "1.8.5",
1141
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz",
1142
+ "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==",
1143
+ "dev": true,
1144
+ "requires": {
1145
+ "@webassemblyjs/ast": "1.8.5",
1146
+ "@webassemblyjs/wast-parser": "1.8.5",
1147
+ "@xtuc/long": "4.2.2"
1148
+ }
1149
+ },
1150
+ "@xtuc/ieee754": {
1151
+ "version": "1.2.0",
1152
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
1153
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
1154
+ "dev": true
1155
+ },
1156
+ "@xtuc/long": {
1157
+ "version": "4.2.2",
1158
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
1159
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
1160
+ "dev": true
1161
+ },
1162
+ "accepts": {
1163
+ "version": "1.3.7",
1164
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
1165
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
1166
+ "dev": true,
1167
+ "requires": {
1168
+ "mime-types": "~2.1.24",
1169
+ "negotiator": "0.6.2"
1170
+ }
1171
+ },
1172
+ "acorn": {
1173
+ "version": "6.2.0",
1174
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.0.tgz",
1175
+ "integrity": "sha512-8oe72N3WPMjA+2zVG71Ia0nXZ8DpQH+QyyHO+p06jT8eg8FGG3FbcUIi8KziHlAfheJQZeoqbvq1mQSQHXKYLw==",
1176
+ "dev": true
1177
+ },
1178
+ "ajv": {
1179
+ "version": "6.10.2",
1180
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
1181
+ "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
1182
+ "dev": true,
1183
+ "requires": {
1184
+ "fast-deep-equal": "^2.0.1",
1185
+ "fast-json-stable-stringify": "^2.0.0",
1186
+ "json-schema-traverse": "^0.4.1",
1187
+ "uri-js": "^4.2.2"
1188
+ }
1189
+ },
1190
+ "ajv-errors": {
1191
+ "version": "1.0.1",
1192
+ "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
1193
+ "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
1194
+ "dev": true
1195
+ },
1196
+ "ajv-keywords": {
1197
+ "version": "3.4.1",
1198
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz",
1199
+ "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==",
1200
+ "dev": true
1201
+ },
1202
+ "alphanum-sort": {
1203
+ "version": "1.0.2",
1204
+ "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
1205
+ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
1206
+ "dev": true
1207
+ },
1208
+ "ansi-colors": {
1209
+ "version": "3.2.4",
1210
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
1211
+ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
1212
+ "dev": true
1213
+ },
1214
+ "ansi-html": {
1215
+ "version": "0.0.7",
1216
+ "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
1217
+ "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
1218
+ "dev": true
1219
+ },
1220
+ "ansi-regex": {
1221
+ "version": "2.1.1",
1222
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
1223
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
1224
+ "dev": true
1225
+ },
1226
+ "ansi-styles": {
1227
+ "version": "3.2.1",
1228
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
1229
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
1230
+ "dev": true,
1231
+ "requires": {
1232
+ "color-convert": "^1.9.0"
1233
+ }
1234
+ },
1235
+ "anymatch": {
1236
+ "version": "2.0.0",
1237
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
1238
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
1239
+ "dev": true,
1240
+ "requires": {
1241
+ "micromatch": "^3.1.4",
1242
+ "normalize-path": "^2.1.1"
1243
+ },
1244
+ "dependencies": {
1245
+ "normalize-path": {
1246
+ "version": "2.1.1",
1247
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
1248
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
1249
+ "dev": true,
1250
+ "requires": {
1251
+ "remove-trailing-separator": "^1.0.1"
1252
+ }
1253
+ }
1254
+ }
1255
+ },
1256
+ "aproba": {
1257
+ "version": "1.2.0",
1258
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
1259
+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
1260
+ "dev": true
1261
+ },
1262
+ "argparse": {
1263
+ "version": "1.0.10",
1264
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
1265
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
1266
+ "dev": true,
1267
+ "requires": {
1268
+ "sprintf-js": "~1.0.2"
1269
+ }
1270
+ },
1271
+ "arr-diff": {
1272
+ "version": "4.0.0",
1273
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
1274
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
1275
+ "dev": true
1276
+ },
1277
+ "arr-flatten": {
1278
+ "version": "1.1.0",
1279
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
1280
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
1281
+ "dev": true
1282
+ },
1283
+ "arr-union": {
1284
+ "version": "3.1.0",
1285
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
1286
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
1287
+ "dev": true
1288
+ },
1289
+ "array-flatten": {
1290
+ "version": "2.1.2",
1291
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
1292
+ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
1293
+ "dev": true
1294
+ },
1295
+ "array-union": {
1296
+ "version": "1.0.2",
1297
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
1298
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
1299
+ "dev": true,
1300
+ "requires": {
1301
+ "array-uniq": "^1.0.1"
1302
+ }
1303
+ },
1304
+ "array-uniq": {
1305
+ "version": "1.0.3",
1306
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
1307
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
1308
+ "dev": true
1309
+ },
1310
+ "array-unique": {
1311
+ "version": "0.3.2",
1312
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
1313
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
1314
+ "dev": true
1315
+ },
1316
+ "arrify": {
1317
+ "version": "1.0.1",
1318
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
1319
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
1320
+ "dev": true
1321
+ },
1322
+ "asn1.js": {
1323
+ "version": "4.10.1",
1324
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
1325
+ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
1326
+ "dev": true,
1327
+ "requires": {
1328
+ "bn.js": "^4.0.0",
1329
+ "inherits": "^2.0.1",
1330
+ "minimalistic-assert": "^1.0.0"
1331
+ }
1332
+ },
1333
+ "assert": {
1334
+ "version": "1.5.0",
1335
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
1336
+ "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
1337
+ "dev": true,
1338
+ "requires": {
1339
+ "object-assign": "^4.1.1",
1340
+ "util": "0.10.3"
1341
+ },
1342
+ "dependencies": {
1343
+ "inherits": {
1344
+ "version": "2.0.1",
1345
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
1346
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
1347
+ "dev": true
1348
+ },
1349
+ "util": {
1350
+ "version": "0.10.3",
1351
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
1352
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
1353
+ "dev": true,
1354
+ "requires": {
1355
+ "inherits": "2.0.1"
1356
+ }
1357
+ }
1358
+ }
1359
+ },
1360
+ "assign-symbols": {
1361
+ "version": "1.0.0",
1362
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
1363
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
1364
+ "dev": true
1365
+ },
1366
+ "ast-types": {
1367
+ "version": "0.9.6",
1368
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz",
1369
+ "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=",
1370
+ "dev": true
1371
+ },
1372
+ "async": {
1373
+ "version": "2.6.3",
1374
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
1375
+ "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
1376
+ "dev": true,
1377
+ "requires": {
1378
+ "lodash": "^4.17.14"
1379
+ }
1380
+ },
1381
+ "async-each": {
1382
+ "version": "1.0.3",
1383
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
1384
+ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
1385
+ "dev": true
1386
+ },
1387
+ "atob": {
1388
+ "version": "2.1.2",
1389
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
1390
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
1391
+ "dev": true
1392
+ },
1393
+ "autoprefixer": {
1394
+ "version": "9.6.1",
1395
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz",
1396
+ "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==",
1397
+ "dev": true,
1398
+ "requires": {
1399
+ "browserslist": "^4.6.3",
1400
+ "caniuse-lite": "^1.0.30000980",
1401
+ "chalk": "^2.4.2",
1402
+ "normalize-range": "^0.1.2",
1403
+ "num2fraction": "^1.2.2",
1404
+ "postcss": "^7.0.17",
1405
+ "postcss-value-parser": "^4.0.0"
1406
+ }
1407
+ },
1408
+ "babel-code-frame": {
1409
+ "version": "6.26.0",
1410
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
1411
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
1412
+ "dev": true,
1413
+ "requires": {
1414
+ "chalk": "^1.1.3",
1415
+ "esutils": "^2.0.2",
1416
+ "js-tokens": "^3.0.2"
1417
+ },
1418
+ "dependencies": {
1419
+ "ansi-styles": {
1420
+ "version": "2.2.1",
1421
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
1422
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
1423
+ "dev": true
1424
+ },
1425
+ "chalk": {
1426
+ "version": "1.1.3",
1427
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
1428
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
1429
+ "dev": true,
1430
+ "requires": {
1431
+ "ansi-styles": "^2.2.1",
1432
+ "escape-string-regexp": "^1.0.2",
1433
+ "has-ansi": "^2.0.0",
1434
+ "strip-ansi": "^3.0.0",
1435
+ "supports-color": "^2.0.0"
1436
+ }
1437
+ },
1438
+ "js-tokens": {
1439
+ "version": "3.0.2",
1440
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
1441
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
1442
+ "dev": true
1443
+ },
1444
+ "supports-color": {
1445
+ "version": "2.0.0",
1446
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1447
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
1448
+ "dev": true
1449
+ }
1450
+ }
1451
+ },
1452
+ "babel-loader": {
1453
+ "version": "8.0.6",
1454
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz",
1455
+ "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==",
1456
+ "dev": true,
1457
+ "requires": {
1458
+ "find-cache-dir": "^2.0.0",
1459
+ "loader-utils": "^1.0.2",
1460
+ "mkdirp": "^0.5.1",
1461
+ "pify": "^4.0.1"
1462
+ }
1463
+ },
1464
+ "babel-merge": {
1465
+ "version": "2.0.1",
1466
+ "resolved": "https://registry.npmjs.org/babel-merge/-/babel-merge-2.0.1.tgz",
1467
+ "integrity": "sha512-puTQQxuzS+0JlMyVdfsTVaCgzqjBXKPMv7oUANpYcHFY+7IptWZ4PZDYX+qBxrRMtrriuBA44LkKpS99EJzqVA==",
1468
+ "dev": true,
1469
+ "requires": {
1470
+ "@babel/core": "^7.0.0-beta.49",
1471
+ "deepmerge": "^2.1.0",
1472
+ "object.omit": "^3.0.0"
1473
+ }
1474
+ },
1475
+ "babel-plugin-dynamic-import-node": {
1476
+ "version": "2.3.0",
1477
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
1478
+ "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==",
1479
+ "dev": true,
1480
+ "requires": {
1481
+ "object.assign": "^4.1.0"
1482
+ }
1483
+ },
1484
+ "balanced-match": {
1485
+ "version": "1.0.0",
1486
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
1487
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
1488
+ "dev": true
1489
+ },
1490
+ "base": {
1491
+ "version": "0.11.2",
1492
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
1493
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
1494
+ "dev": true,
1495
+ "requires": {
1496
+ "cache-base": "^1.0.1",
1497
+ "class-utils": "^0.3.5",
1498
+ "component-emitter": "^1.2.1",
1499
+ "define-property": "^1.0.0",
1500
+ "isobject": "^3.0.1",
1501
+ "mixin-deep": "^1.2.0",
1502
+ "pascalcase": "^0.1.1"
1503
+ },
1504
+ "dependencies": {
1505
+ "define-property": {
1506
+ "version": "1.0.0",
1507
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
1508
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
1509
+ "dev": true,
1510
+ "requires": {
1511
+ "is-descriptor": "^1.0.0"
1512
+ }
1513
+ },
1514
+ "is-accessor-descriptor": {
1515
+ "version": "1.0.0",
1516
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
1517
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
1518
+ "dev": true,
1519
+ "requires": {
1520
+ "kind-of": "^6.0.0"
1521
+ }
1522
+ },
1523
+ "is-data-descriptor": {
1524
+ "version": "1.0.0",
1525
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
1526
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
1527
+ "dev": true,
1528
+ "requires": {
1529
+ "kind-of": "^6.0.0"
1530
+ }
1531
+ },
1532
+ "is-descriptor": {
1533
+ "version": "1.0.2",
1534
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
1535
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
1536
+ "dev": true,
1537
+ "requires": {
1538
+ "is-accessor-descriptor": "^1.0.0",
1539
+ "is-data-descriptor": "^1.0.0",
1540
+ "kind-of": "^6.0.2"
1541
+ }
1542
+ }
1543
+ }
1544
+ },
1545
+ "base64-js": {
1546
+ "version": "1.3.0",
1547
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
1548
+ "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
1549
+ "dev": true
1550
+ },
1551
+ "batch": {
1552
+ "version": "0.6.1",
1553
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
1554
+ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
1555
+ "dev": true
1556
+ },
1557
+ "big.js": {
1558
+ "version": "5.2.2",
1559
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
1560
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
1561
+ "dev": true
1562
+ },
1563
+ "binary-extensions": {
1564
+ "version": "1.13.1",
1565
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
1566
+ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
1567
+ "dev": true
1568
+ },
1569
+ "bluebird": {
1570
+ "version": "3.5.5",
1571
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
1572
+ "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
1573
+ "dev": true
1574
+ },
1575
+ "bn.js": {
1576
+ "version": "4.11.8",
1577
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
1578
+ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
1579
+ "dev": true
1580
+ },
1581
+ "body-parser": {
1582
+ "version": "1.19.0",
1583
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
1584
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
1585
+ "dev": true,
1586
+ "requires": {
1587
+ "bytes": "3.1.0",
1588
+ "content-type": "~1.0.4",
1589
+ "debug": "2.6.9",
1590
+ "depd": "~1.1.2",
1591
+ "http-errors": "1.7.2",
1592
+ "iconv-lite": "0.4.24",
1593
+ "on-finished": "~2.3.0",
1594
+ "qs": "6.7.0",
1595
+ "raw-body": "2.4.0",
1596
+ "type-is": "~1.6.17"
1597
+ },
1598
+ "dependencies": {
1599
+ "bytes": {
1600
+ "version": "3.1.0",
1601
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
1602
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
1603
+ "dev": true
1604
+ },
1605
+ "debug": {
1606
+ "version": "2.6.9",
1607
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1608
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1609
+ "dev": true,
1610
+ "requires": {
1611
+ "ms": "2.0.0"
1612
+ }
1613
+ },
1614
+ "ms": {
1615
+ "version": "2.0.0",
1616
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1617
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1618
+ "dev": true
1619
+ }
1620
+ }
1621
+ },
1622
+ "bonjour": {
1623
+ "version": "3.5.0",
1624
+ "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
1625
+ "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
1626
+ "dev": true,
1627
+ "requires": {
1628
+ "array-flatten": "^2.1.0",
1629
+ "deep-equal": "^1.0.1",
1630
+ "dns-equal": "^1.0.0",
1631
+ "dns-txt": "^2.0.2",
1632
+ "multicast-dns": "^6.0.1",
1633
+ "multicast-dns-service-types": "^1.1.0"
1634
+ }
1635
+ },
1636
+ "boolbase": {
1637
+ "version": "1.0.0",
1638
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
1639
+ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
1640
+ "dev": true
1641
+ },
1642
+ "brace-expansion": {
1643
+ "version": "1.1.11",
1644
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1645
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1646
+ "dev": true,
1647
+ "requires": {
1648
+ "balanced-match": "^1.0.0",
1649
+ "concat-map": "0.0.1"
1650
+ }
1651
+ },
1652
+ "braces": {
1653
+ "version": "2.3.2",
1654
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
1655
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
1656
+ "dev": true,
1657
+ "requires": {
1658
+ "arr-flatten": "^1.1.0",
1659
+ "array-unique": "^0.3.2",
1660
+ "extend-shallow": "^2.0.1",
1661
+ "fill-range": "^4.0.0",
1662
+ "isobject": "^3.0.1",
1663
+ "repeat-element": "^1.1.2",
1664
+ "snapdragon": "^0.8.1",
1665
+ "snapdragon-node": "^2.0.1",
1666
+ "split-string": "^3.0.2",
1667
+ "to-regex": "^3.0.1"
1668
+ },
1669
+ "dependencies": {
1670
+ "extend-shallow": {
1671
+ "version": "2.0.1",
1672
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1673
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1674
+ "dev": true,
1675
+ "requires": {
1676
+ "is-extendable": "^0.1.0"
1677
+ }
1678
+ },
1679
+ "is-extendable": {
1680
+ "version": "0.1.1",
1681
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
1682
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
1683
+ "dev": true
1684
+ }
1685
+ }
1686
+ },
1687
+ "brorand": {
1688
+ "version": "1.1.0",
1689
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
1690
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
1691
+ "dev": true
1692
+ },
1693
+ "browserify-aes": {
1694
+ "version": "1.2.0",
1695
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
1696
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
1697
+ "dev": true,
1698
+ "requires": {
1699
+ "buffer-xor": "^1.0.3",
1700
+ "cipher-base": "^1.0.0",
1701
+ "create-hash": "^1.1.0",
1702
+ "evp_bytestokey": "^1.0.3",
1703
+ "inherits": "^2.0.1",
1704
+ "safe-buffer": "^5.0.1"
1705
+ }
1706
+ },
1707
+ "browserify-cipher": {
1708
+ "version": "1.0.1",
1709
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
1710
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
1711
+ "dev": true,
1712
+ "requires": {
1713
+ "browserify-aes": "^1.0.4",
1714
+ "browserify-des": "^1.0.0",
1715
+ "evp_bytestokey": "^1.0.0"
1716
+ }
1717
+ },
1718
+ "browserify-des": {
1719
+ "version": "1.0.2",
1720
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
1721
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
1722
+ "dev": true,
1723
+ "requires": {
1724
+ "cipher-base": "^1.0.1",
1725
+ "des.js": "^1.0.0",
1726
+ "inherits": "^2.0.1",
1727
+ "safe-buffer": "^5.1.2"
1728
+ }
1729
+ },
1730
+ "browserify-rsa": {
1731
+ "version": "4.0.1",
1732
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
1733
+ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
1734
+ "dev": true,
1735
+ "requires": {
1736
+ "bn.js": "^4.1.0",
1737
+ "randombytes": "^2.0.1"
1738
+ }
1739
+ },
1740
+ "browserify-sign": {
1741
+ "version": "4.0.4",
1742
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
1743
+ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
1744
+ "dev": true,
1745
+ "requires": {
1746
+ "bn.js": "^4.1.1",
1747
+ "browserify-rsa": "^4.0.0",
1748
+ "create-hash": "^1.1.0",
1749
+ "create-hmac": "^1.1.2",
1750
+ "elliptic": "^6.0.0",
1751
+ "inherits": "^2.0.1",
1752
+ "parse-asn1": "^5.0.0"
1753
+ }
1754
+ },
1755
+ "browserify-zlib": {
1756
+ "version": "0.2.0",
1757
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
1758
+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
1759
+ "dev": true,
1760
+ "requires": {
1761
+ "pako": "~1.0.5"
1762
+ }
1763
+ },
1764
+ "browserslist": {
1765
+ "version": "4.6.6",
1766
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz",
1767
+ "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==",
1768
+ "dev": true,
1769
+ "requires": {
1770
+ "caniuse-lite": "^1.0.30000984",
1771
+ "electron-to-chromium": "^1.3.191",
1772
+ "node-releases": "^1.1.25"
1773
+ }
1774
+ },
1775
+ "buffer": {
1776
+ "version": "4.9.1",
1777
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
1778
+ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
1779
+ "dev": true,
1780
+ "requires": {
1781
+ "base64-js": "^1.0.2",
1782
+ "ieee754": "^1.1.4",
1783
+ "isarray": "^1.0.0"
1784
+ }
1785
+ },
1786
+ "buffer-from": {
1787
+ "version": "1.1.1",
1788
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
1789
+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
1790
+ "dev": true
1791
+ },
1792
+ "buffer-indexof": {
1793
+ "version": "1.1.1",
1794
+ "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
1795
+ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
1796
+ "dev": true
1797
+ },
1798
+ "buffer-xor": {
1799
+ "version": "1.0.3",
1800
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
1801
+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
1802
+ "dev": true
1803
+ },
1804
+ "builtin-status-codes": {
1805
+ "version": "3.0.0",
1806
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
1807
+ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
1808
+ "dev": true
1809
+ },
1810
+ "bytes": {
1811
+ "version": "3.0.0",
1812
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
1813
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
1814
+ "dev": true
1815
+ },
1816
+ "cacache": {
1817
+ "version": "11.3.3",
1818
+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz",
1819
+ "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==",
1820
+ "dev": true,
1821
+ "requires": {
1822
+ "bluebird": "^3.5.5",
1823
+ "chownr": "^1.1.1",
1824
+ "figgy-pudding": "^3.5.1",
1825
+ "glob": "^7.1.4",
1826
+ "graceful-fs": "^4.1.15",
1827
+ "lru-cache": "^5.1.1",
1828
+ "mississippi": "^3.0.0",
1829
+ "mkdirp": "^0.5.1",
1830
+ "move-concurrently": "^1.0.1",
1831
+ "promise-inflight": "^1.0.1",
1832
+ "rimraf": "^2.6.3",
1833
+ "ssri": "^6.0.1",
1834
+ "unique-filename": "^1.1.1",
1835
+ "y18n": "^4.0.0"
1836
+ },
1837
+ "dependencies": {
1838
+ "rimraf": {
1839
+ "version": "2.7.1",
1840
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
1841
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
1842
+ "dev": true,
1843
+ "requires": {
1844
+ "glob": "^7.1.3"
1845
+ }
1846
+ }
1847
+ }
1848
+ },
1849
+ "cache-base": {
1850
+ "version": "1.0.1",
1851
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
1852
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
1853
+ "dev": true,
1854
+ "requires": {
1855
+ "collection-visit": "^1.0.0",
1856
+ "component-emitter": "^1.2.1",
1857
+ "get-value": "^2.0.6",
1858
+ "has-value": "^1.0.0",
1859
+ "isobject": "^3.0.1",
1860
+ "set-value": "^2.0.0",
1861
+ "to-object-path": "^0.3.0",
1862
+ "union-value": "^1.0.0",
1863
+ "unset-value": "^1.0.0"
1864
+ }
1865
+ },
1866
+ "call-me-maybe": {
1867
+ "version": "1.0.1",
1868
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
1869
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
1870
+ "dev": true
1871
+ },
1872
+ "caller-callsite": {
1873
+ "version": "2.0.0",
1874
+ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
1875
+ "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
1876
+ "dev": true,
1877
+ "requires": {
1878
+ "callsites": "^2.0.0"
1879
+ }
1880
+ },
1881
+ "caller-path": {
1882
+ "version": "2.0.0",
1883
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
1884
+ "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
1885
+ "dev": true,
1886
+ "requires": {
1887
+ "caller-callsite": "^2.0.0"
1888
+ }
1889
+ },
1890
+ "callsites": {
1891
+ "version": "2.0.0",
1892
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
1893
+ "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
1894
+ "dev": true
1895
+ },
1896
+ "camel-case": {
1897
+ "version": "3.0.0",
1898
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
1899
+ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
1900
+ "dev": true,
1901
+ "requires": {
1902
+ "no-case": "^2.2.0",
1903
+ "upper-case": "^1.1.1"
1904
+ }
1905
+ },
1906
+ "camelcase": {
1907
+ "version": "5.3.1",
1908
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
1909
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
1910
+ "dev": true
1911
+ },
1912
+ "caniuse-api": {
1913
+ "version": "3.0.0",
1914
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
1915
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
1916
+ "dev": true,
1917
+ "requires": {
1918
+ "browserslist": "^4.0.0",
1919
+ "caniuse-lite": "^1.0.0",
1920
+ "lodash.memoize": "^4.1.2",
1921
+ "lodash.uniq": "^4.5.0"
1922
+ }
1923
+ },
1924
+ "caniuse-lite": {
1925
+ "version": "1.0.30000984",
1926
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000984.tgz",
1927
+ "integrity": "sha512-n5tKOjMaZ1fksIpQbjERuqCyfgec/m9pferkFQbLmWtqLUdmt12hNhjSwsmPdqeiG2NkITOQhr1VYIwWSAceiA==",
1928
+ "dev": true
1929
+ },
1930
+ "chalk": {
1931
+ "version": "2.4.2",
1932
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
1933
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
1934
+ "dev": true,
1935
+ "requires": {
1936
+ "ansi-styles": "^3.2.1",
1937
+ "escape-string-regexp": "^1.0.5",
1938
+ "supports-color": "^5.3.0"
1939
+ }
1940
+ },
1941
+ "charenc": {
1942
+ "version": "0.0.2",
1943
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
1944
+ "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=",
1945
+ "dev": true
1946
+ },
1947
+ "chokidar": {
1948
+ "version": "2.1.6",
1949
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz",
1950
+ "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==",
1951
+ "dev": true,
1952
+ "requires": {
1953
+ "anymatch": "^2.0.0",
1954
+ "async-each": "^1.0.1",
1955
+ "braces": "^2.3.2",
1956
+ "fsevents": "^1.2.7",
1957
+ "glob-parent": "^3.1.0",
1958
+ "inherits": "^2.0.3",
1959
+ "is-binary-path": "^1.0.0",
1960
+ "is-glob": "^4.0.0",
1961
+ "normalize-path": "^3.0.0",
1962
+ "path-is-absolute": "^1.0.0",
1963
+ "readdirp": "^2.2.1",
1964
+ "upath": "^1.1.1"
1965
+ }
1966
+ },
1967
+ "chownr": {
1968
+ "version": "1.1.2",
1969
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz",
1970
+ "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==",
1971
+ "dev": true
1972
+ },
1973
+ "chrome-trace-event": {
1974
+ "version": "1.0.2",
1975
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
1976
+ "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
1977
+ "dev": true,
1978
+ "requires": {
1979
+ "tslib": "^1.9.0"
1980
+ }
1981
+ },
1982
+ "cipher-base": {
1983
+ "version": "1.0.4",
1984
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
1985
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
1986
+ "dev": true,
1987
+ "requires": {
1988
+ "inherits": "^2.0.1",
1989
+ "safe-buffer": "^5.0.1"
1990
+ }
1991
+ },
1992
+ "class-utils": {
1993
+ "version": "0.3.6",
1994
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
1995
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
1996
+ "dev": true,
1997
+ "requires": {
1998
+ "arr-union": "^3.1.0",
1999
+ "define-property": "^0.2.5",
2000
+ "isobject": "^3.0.0",
2001
+ "static-extend": "^0.1.1"
2002
+ },
2003
+ "dependencies": {
2004
+ "define-property": {
2005
+ "version": "0.2.5",
2006
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
2007
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
2008
+ "dev": true,
2009
+ "requires": {
2010
+ "is-descriptor": "^0.1.0"
2011
+ }
2012
+ }
2013
+ }
2014
+ },
2015
+ "clean-css": {
2016
+ "version": "4.2.1",
2017
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
2018
+ "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==",
2019
+ "dev": true,
2020
+ "requires": {
2021
+ "source-map": "~0.6.0"
2022
+ },
2023
+ "dependencies": {
2024
+ "source-map": {
2025
+ "version": "0.6.1",
2026
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2027
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2028
+ "dev": true
2029
+ }
2030
+ }
2031
+ },
2032
+ "cliui": {
2033
+ "version": "5.0.0",
2034
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
2035
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
2036
+ "dev": true,
2037
+ "requires": {
2038
+ "string-width": "^3.1.0",
2039
+ "strip-ansi": "^5.2.0",
2040
+ "wrap-ansi": "^5.1.0"
2041
+ },
2042
+ "dependencies": {
2043
+ "ansi-regex": {
2044
+ "version": "4.1.0",
2045
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
2046
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
2047
+ "dev": true
2048
+ },
2049
+ "string-width": {
2050
+ "version": "3.1.0",
2051
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
2052
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
2053
+ "dev": true,
2054
+ "requires": {
2055
+ "emoji-regex": "^7.0.1",
2056
+ "is-fullwidth-code-point": "^2.0.0",
2057
+ "strip-ansi": "^5.1.0"
2058
+ }
2059
+ },
2060
+ "strip-ansi": {
2061
+ "version": "5.2.0",
2062
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
2063
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
2064
+ "dev": true,
2065
+ "requires": {
2066
+ "ansi-regex": "^4.1.0"
2067
+ }
2068
+ }
2069
+ }
2070
+ },
2071
+ "clone-deep": {
2072
+ "version": "2.0.2",
2073
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz",
2074
+ "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==",
2075
+ "dev": true,
2076
+ "requires": {
2077
+ "for-own": "^1.0.0",
2078
+ "is-plain-object": "^2.0.4",
2079
+ "kind-of": "^6.0.0",
2080
+ "shallow-clone": "^1.0.0"
2081
+ }
2082
+ },
2083
+ "coa": {
2084
+ "version": "2.0.2",
2085
+ "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
2086
+ "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
2087
+ "dev": true,
2088
+ "requires": {
2089
+ "@types/q": "^1.5.1",
2090
+ "chalk": "^2.4.1",
2091
+ "q": "^1.1.2"
2092
+ }
2093
+ },
2094
+ "code-point-at": {
2095
+ "version": "1.1.0",
2096
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
2097
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
2098
+ "dev": true
2099
+ },
2100
+ "collection-visit": {
2101
+ "version": "1.0.0",
2102
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
2103
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
2104
+ "dev": true,
2105
+ "requires": {
2106
+ "map-visit": "^1.0.0",
2107
+ "object-visit": "^1.0.0"
2108
+ }
2109
+ },
2110
+ "color": {
2111
+ "version": "3.1.2",
2112
+ "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz",
2113
+ "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==",
2114
+ "dev": true,
2115
+ "requires": {
2116
+ "color-convert": "^1.9.1",
2117
+ "color-string": "^1.5.2"
2118
+ }
2119
+ },
2120
+ "color-convert": {
2121
+ "version": "1.9.3",
2122
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
2123
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
2124
+ "dev": true,
2125
+ "requires": {
2126
+ "color-name": "1.1.3"
2127
+ }
2128
+ },
2129
+ "color-name": {
2130
+ "version": "1.1.3",
2131
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
2132
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
2133
+ "dev": true
2134
+ },
2135
+ "color-string": {
2136
+ "version": "1.5.3",
2137
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
2138
+ "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
2139
+ "dev": true,
2140
+ "requires": {
2141
+ "color-name": "^1.0.0",
2142
+ "simple-swizzle": "^0.2.2"
2143
+ }
2144
+ },
2145
+ "commander": {
2146
+ "version": "2.17.1",
2147
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
2148
+ "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
2149
+ "dev": true
2150
+ },
2151
+ "commondir": {
2152
+ "version": "1.0.1",
2153
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
2154
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
2155
+ "dev": true
2156
+ },
2157
+ "component-emitter": {
2158
+ "version": "1.3.0",
2159
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
2160
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
2161
+ "dev": true
2162
+ },
2163
+ "compressible": {
2164
+ "version": "2.0.17",
2165
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz",
2166
+ "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==",
2167
+ "dev": true,
2168
+ "requires": {
2169
+ "mime-db": ">= 1.40.0 < 2"
2170
+ }
2171
+ },
2172
+ "compression": {
2173
+ "version": "1.7.4",
2174
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
2175
+ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
2176
+ "dev": true,
2177
+ "requires": {
2178
+ "accepts": "~1.3.5",
2179
+ "bytes": "3.0.0",
2180
+ "compressible": "~2.0.16",
2181
+ "debug": "2.6.9",
2182
+ "on-headers": "~1.0.2",
2183
+ "safe-buffer": "5.1.2",
2184
+ "vary": "~1.1.2"
2185
+ },
2186
+ "dependencies": {
2187
+ "debug": {
2188
+ "version": "2.6.9",
2189
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
2190
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
2191
+ "dev": true,
2192
+ "requires": {
2193
+ "ms": "2.0.0"
2194
+ }
2195
+ },
2196
+ "ms": {
2197
+ "version": "2.0.0",
2198
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
2199
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
2200
+ "dev": true
2201
+ }
2202
+ }
2203
+ },
2204
+ "concat-map": {
2205
+ "version": "0.0.1",
2206
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
2207
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
2208
+ "dev": true
2209
+ },
2210
+ "concat-stream": {
2211
+ "version": "1.6.2",
2212
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
2213
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
2214
+ "dev": true,
2215
+ "requires": {
2216
+ "buffer-from": "^1.0.0",
2217
+ "inherits": "^2.0.3",
2218
+ "readable-stream": "^2.2.2",
2219
+ "typedarray": "^0.0.6"
2220
+ }
2221
+ },
2222
+ "concatenate": {
2223
+ "version": "0.0.2",
2224
+ "resolved": "https://registry.npmjs.org/concatenate/-/concatenate-0.0.2.tgz",
2225
+ "integrity": "sha1-C0nW6MQQR9dyjNyNYqCGYjOXtJ8=",
2226
+ "dev": true,
2227
+ "requires": {
2228
+ "globs": "^0.1.2"
2229
+ }
2230
+ },
2231
+ "connect-history-api-fallback": {
2232
+ "version": "1.6.0",
2233
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
2234
+ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
2235
+ "dev": true
2236
+ },
2237
+ "console-browserify": {
2238
+ "version": "1.1.0",
2239
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
2240
+ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
2241
+ "dev": true,
2242
+ "requires": {
2243
+ "date-now": "^0.1.4"
2244
+ }
2245
+ },
2246
+ "consolidate": {
2247
+ "version": "0.15.1",
2248
+ "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz",
2249
+ "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==",
2250
+ "dev": true,
2251
+ "requires": {
2252
+ "bluebird": "^3.1.1"
2253
+ }
2254
+ },
2255
+ "constants-browserify": {
2256
+ "version": "1.0.0",
2257
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
2258
+ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
2259
+ "dev": true
2260
+ },
2261
+ "content-disposition": {
2262
+ "version": "0.5.3",
2263
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
2264
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
2265
+ "dev": true,
2266
+ "requires": {
2267
+ "safe-buffer": "5.1.2"
2268
+ }
2269
+ },
2270
+ "content-type": {
2271
+ "version": "1.0.4",
2272
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
2273
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
2274
+ "dev": true
2275
+ },
2276
+ "convert-source-map": {
2277
+ "version": "1.6.0",
2278
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
2279
+ "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
2280
+ "dev": true,
2281
+ "requires": {
2282
+ "safe-buffer": "~5.1.1"
2283
+ }
2284
+ },
2285
+ "cookie": {
2286
+ "version": "0.4.0",
2287
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
2288
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
2289
+ "dev": true
2290
+ },
2291
+ "cookie-signature": {
2292
+ "version": "1.0.6",
2293
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
2294
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
2295
+ "dev": true
2296
+ },
2297
+ "copy-concurrently": {
2298
+ "version": "1.0.5",
2299
+ "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
2300
+ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
2301
+ "dev": true,
2302
+ "requires": {
2303
+ "aproba": "^1.1.1",
2304
+ "fs-write-stream-atomic": "^1.0.8",
2305
+ "iferr": "^0.1.5",
2306
+ "mkdirp": "^0.5.1",
2307
+ "rimraf": "^2.5.4",
2308
+ "run-queue": "^1.0.0"
2309
+ },
2310
+ "dependencies": {
2311
+ "rimraf": {
2312
+ "version": "2.7.1",
2313
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
2314
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
2315
+ "dev": true,
2316
+ "requires": {
2317
+ "glob": "^7.1.3"
2318
+ }
2319
+ }
2320
+ }
2321
+ },
2322
+ "copy-descriptor": {
2323
+ "version": "0.1.1",
2324
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
2325
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
2326
+ "dev": true
2327
+ },
2328
+ "core-js-compat": {
2329
+ "version": "3.1.4",
2330
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.4.tgz",
2331
+ "integrity": "sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg==",
2332
+ "dev": true,
2333
+ "requires": {
2334
+ "browserslist": "^4.6.2",
2335
+ "core-js-pure": "3.1.4",
2336
+ "semver": "^6.1.1"
2337
+ },
2338
+ "dependencies": {
2339
+ "semver": {
2340
+ "version": "6.2.0",
2341
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz",
2342
+ "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==",
2343
+ "dev": true
2344
+ }
2345
+ }
2346
+ },
2347
+ "core-js-pure": {
2348
+ "version": "3.1.4",
2349
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.1.4.tgz",
2350
+ "integrity": "sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA==",
2351
+ "dev": true
2352
+ },
2353
+ "core-util-is": {
2354
+ "version": "1.0.2",
2355
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
2356
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
2357
+ "dev": true
2358
+ },
2359
+ "cosmiconfig": {
2360
+ "version": "5.2.1",
2361
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
2362
+ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
2363
+ "dev": true,
2364
+ "requires": {
2365
+ "import-fresh": "^2.0.0",
2366
+ "is-directory": "^0.3.1",
2367
+ "js-yaml": "^3.13.1",
2368
+ "parse-json": "^4.0.0"
2369
+ }
2370
+ },
2371
+ "create-ecdh": {
2372
+ "version": "4.0.3",
2373
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
2374
+ "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
2375
+ "dev": true,
2376
+ "requires": {
2377
+ "bn.js": "^4.1.0",
2378
+ "elliptic": "^6.0.0"
2379
+ }
2380
+ },
2381
+ "create-hash": {
2382
+ "version": "1.2.0",
2383
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
2384
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
2385
+ "dev": true,
2386
+ "requires": {
2387
+ "cipher-base": "^1.0.1",
2388
+ "inherits": "^2.0.1",
2389
+ "md5.js": "^1.3.4",
2390
+ "ripemd160": "^2.0.1",
2391
+ "sha.js": "^2.4.0"
2392
+ }
2393
+ },
2394
+ "create-hmac": {
2395
+ "version": "1.1.7",
2396
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
2397
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
2398
+ "dev": true,
2399
+ "requires": {
2400
+ "cipher-base": "^1.0.3",
2401
+ "create-hash": "^1.1.0",
2402
+ "inherits": "^2.0.1",
2403
+ "ripemd160": "^2.0.0",
2404
+ "safe-buffer": "^5.0.1",
2405
+ "sha.js": "^2.4.8"
2406
+ }
2407
+ },
2408
+ "cross-env": {
2409
+ "version": "5.2.0",
2410
+ "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz",
2411
+ "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==",
2412
+ "dev": true,
2413
+ "requires": {
2414
+ "cross-spawn": "^6.0.5",
2415
+ "is-windows": "^1.0.0"
2416
+ }
2417
+ },
2418
+ "cross-spawn": {
2419
+ "version": "6.0.5",
2420
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
2421
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
2422
+ "dev": true,
2423
+ "requires": {
2424
+ "nice-try": "^1.0.4",
2425
+ "path-key": "^2.0.1",
2426
+ "semver": "^5.5.0",
2427
+ "shebang-command": "^1.2.0",
2428
+ "which": "^1.2.9"
2429
+ }
2430
+ },
2431
+ "crypt": {
2432
+ "version": "0.0.2",
2433
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
2434
+ "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=",
2435
+ "dev": true
2436
+ },
2437
+ "crypto-browserify": {
2438
+ "version": "3.12.0",
2439
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
2440
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
2441
+ "dev": true,
2442
+ "requires": {
2443
+ "browserify-cipher": "^1.0.0",
2444
+ "browserify-sign": "^4.0.0",
2445
+ "create-ecdh": "^4.0.0",
2446
+ "create-hash": "^1.1.0",
2447
+ "create-hmac": "^1.1.0",
2448
+ "diffie-hellman": "^5.0.0",
2449
+ "inherits": "^2.0.1",
2450
+ "pbkdf2": "^3.0.3",
2451
+ "public-encrypt": "^4.0.0",
2452
+ "randombytes": "^2.0.0",
2453
+ "randomfill": "^1.0.3"
2454
+ }
2455
+ },
2456
+ "css-blank-pseudo": {
2457
+ "version": "0.1.4",
2458
+ "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz",
2459
+ "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==",
2460
+ "dev": true,
2461
+ "requires": {
2462
+ "postcss": "^7.0.5"
2463
+ }
2464
+ },
2465
+ "css-color-names": {
2466
+ "version": "0.0.4",
2467
+ "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
2468
+ "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
2469
+ "dev": true
2470
+ },
2471
+ "css-declaration-sorter": {
2472
+ "version": "4.0.1",
2473
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
2474
+ "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
2475
+ "dev": true,
2476
+ "requires": {
2477
+ "postcss": "^7.0.1",
2478
+ "timsort": "^0.3.0"
2479
+ }
2480
+ },
2481
+ "css-has-pseudo": {
2482
+ "version": "0.10.0",
2483
+ "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz",
2484
+ "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==",
2485
+ "dev": true,
2486
+ "requires": {
2487
+ "postcss": "^7.0.6",
2488
+ "postcss-selector-parser": "^5.0.0-rc.4"
2489
+ }
2490
+ },
2491
+ "css-loader": {
2492
+ "version": "1.0.1",
2493
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz",
2494
+ "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==",
2495
+ "dev": true,
2496
+ "requires": {
2497
+ "babel-code-frame": "^6.26.0",
2498
+ "css-selector-tokenizer": "^0.7.0",
2499
+ "icss-utils": "^2.1.0",
2500
+ "loader-utils": "^1.0.2",
2501
+ "lodash": "^4.17.11",
2502
+ "postcss": "^6.0.23",
2503
+ "postcss-modules-extract-imports": "^1.2.0",
2504
+ "postcss-modules-local-by-default": "^1.2.0",
2505
+ "postcss-modules-scope": "^1.1.0",
2506
+ "postcss-modules-values": "^1.3.0",
2507
+ "postcss-value-parser": "^3.3.0",
2508
+ "source-list-map": "^2.0.0"
2509
+ },
2510
+ "dependencies": {
2511
+ "postcss": {
2512
+ "version": "6.0.23",
2513
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
2514
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
2515
+ "dev": true,
2516
+ "requires": {
2517
+ "chalk": "^2.4.1",
2518
+ "source-map": "^0.6.1",
2519
+ "supports-color": "^5.4.0"
2520
+ }
2521
+ },
2522
+ "postcss-value-parser": {
2523
+ "version": "3.3.1",
2524
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
2525
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
2526
+ "dev": true
2527
+ },
2528
+ "source-map": {
2529
+ "version": "0.6.1",
2530
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2531
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2532
+ "dev": true
2533
+ }
2534
+ }
2535
+ },
2536
+ "css-prefers-color-scheme": {
2537
+ "version": "3.1.1",
2538
+ "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz",
2539
+ "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==",
2540
+ "dev": true,
2541
+ "requires": {
2542
+ "postcss": "^7.0.5"
2543
+ }
2544
+ },
2545
+ "css-select": {
2546
+ "version": "2.0.2",
2547
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz",
2548
+ "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==",
2549
+ "dev": true,
2550
+ "requires": {
2551
+ "boolbase": "^1.0.0",
2552
+ "css-what": "^2.1.2",
2553
+ "domutils": "^1.7.0",
2554
+ "nth-check": "^1.0.2"
2555
+ }
2556
+ },
2557
+ "css-select-base-adapter": {
2558
+ "version": "0.1.1",
2559
+ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
2560
+ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
2561
+ "dev": true
2562
+ },
2563
+ "css-selector-tokenizer": {
2564
+ "version": "0.7.1",
2565
+ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz",
2566
+ "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==",
2567
+ "dev": true,
2568
+ "requires": {
2569
+ "cssesc": "^0.1.0",
2570
+ "fastparse": "^1.1.1",
2571
+ "regexpu-core": "^1.0.0"
2572
+ },
2573
+ "dependencies": {
2574
+ "jsesc": {
2575
+ "version": "0.5.0",
2576
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
2577
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
2578
+ "dev": true
2579
+ },
2580
+ "regexpu-core": {
2581
+ "version": "1.0.0",
2582
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
2583
+ "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
2584
+ "dev": true,
2585
+ "requires": {
2586
+ "regenerate": "^1.2.1",
2587
+ "regjsgen": "^0.2.0",
2588
+ "regjsparser": "^0.1.4"
2589
+ }
2590
+ },
2591
+ "regjsgen": {
2592
+ "version": "0.2.0",
2593
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
2594
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
2595
+ "dev": true
2596
+ },
2597
+ "regjsparser": {
2598
+ "version": "0.1.5",
2599
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
2600
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
2601
+ "dev": true,
2602
+ "requires": {
2603
+ "jsesc": "~0.5.0"
2604
+ }
2605
+ }
2606
+ }
2607
+ },
2608
+ "css-tree": {
2609
+ "version": "1.0.0-alpha.33",
2610
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz",
2611
+ "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==",
2612
+ "dev": true,
2613
+ "requires": {
2614
+ "mdn-data": "2.0.4",
2615
+ "source-map": "^0.5.3"
2616
+ }
2617
+ },
2618
+ "css-unit-converter": {
2619
+ "version": "1.1.1",
2620
+ "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz",
2621
+ "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=",
2622
+ "dev": true
2623
+ },
2624
+ "css-what": {
2625
+ "version": "2.1.3",
2626
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
2627
+ "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
2628
+ "dev": true
2629
+ },
2630
+ "cssdb": {
2631
+ "version": "4.4.0",
2632
+ "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz",
2633
+ "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==",
2634
+ "dev": true
2635
+ },
2636
+ "cssesc": {
2637
+ "version": "0.1.0",
2638
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz",
2639
+ "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=",
2640
+ "dev": true
2641
+ },
2642
+ "cssnano": {
2643
+ "version": "4.1.10",
2644
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz",
2645
+ "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
2646
+ "dev": true,
2647
+ "requires": {
2648
+ "cosmiconfig": "^5.0.0",
2649
+ "cssnano-preset-default": "^4.0.7",
2650
+ "is-resolvable": "^1.0.0",
2651
+ "postcss": "^7.0.0"
2652
+ }
2653
+ },
2654
+ "cssnano-preset-default": {
2655
+ "version": "4.0.7",
2656
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
2657
+ "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
2658
+ "dev": true,
2659
+ "requires": {
2660
+ "css-declaration-sorter": "^4.0.1",
2661
+ "cssnano-util-raw-cache": "^4.0.1",
2662
+ "postcss": "^7.0.0",
2663
+ "postcss-calc": "^7.0.1",
2664
+ "postcss-colormin": "^4.0.3",
2665
+ "postcss-convert-values": "^4.0.1",
2666
+ "postcss-discard-comments": "^4.0.2",
2667
+ "postcss-discard-duplicates": "^4.0.2",
2668
+ "postcss-discard-empty": "^4.0.1",
2669
+ "postcss-discard-overridden": "^4.0.1",
2670
+ "postcss-merge-longhand": "^4.0.11",
2671
+ "postcss-merge-rules": "^4.0.3",
2672
+ "postcss-minify-font-values": "^4.0.2",
2673
+ "postcss-minify-gradients": "^4.0.2",
2674
+ "postcss-minify-params": "^4.0.2",
2675
+ "postcss-minify-selectors": "^4.0.2",
2676
+ "postcss-normalize-charset": "^4.0.1",
2677
+ "postcss-normalize-display-values": "^4.0.2",
2678
+ "postcss-normalize-positions": "^4.0.2",
2679
+ "postcss-normalize-repeat-style": "^4.0.2",
2680
+ "postcss-normalize-string": "^4.0.2",
2681
+ "postcss-normalize-timing-functions": "^4.0.2",
2682
+ "postcss-normalize-unicode": "^4.0.1",
2683
+ "postcss-normalize-url": "^4.0.1",
2684
+ "postcss-normalize-whitespace": "^4.0.2",
2685
+ "postcss-ordered-values": "^4.1.2",
2686
+ "postcss-reduce-initial": "^4.0.3",
2687
+ "postcss-reduce-transforms": "^4.0.2",
2688
+ "postcss-svgo": "^4.0.2",
2689
+ "postcss-unique-selectors": "^4.0.1"
2690
+ }
2691
+ },
2692
+ "cssnano-util-get-arguments": {
2693
+ "version": "4.0.0",
2694
+ "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
2695
+ "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=",
2696
+ "dev": true
2697
+ },
2698
+ "cssnano-util-get-match": {
2699
+ "version": "4.0.0",
2700
+ "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
2701
+ "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=",
2702
+ "dev": true
2703
+ },
2704
+ "cssnano-util-raw-cache": {
2705
+ "version": "4.0.1",
2706
+ "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
2707
+ "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
2708
+ "dev": true,
2709
+ "requires": {
2710
+ "postcss": "^7.0.0"
2711
+ }
2712
+ },
2713
+ "cssnano-util-same-parent": {
2714
+ "version": "4.0.1",
2715
+ "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
2716
+ "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
2717
+ "dev": true
2718
+ },
2719
+ "csso": {
2720
+ "version": "3.5.1",
2721
+ "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz",
2722
+ "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==",
2723
+ "dev": true,
2724
+ "requires": {
2725
+ "css-tree": "1.0.0-alpha.29"
2726
+ },
2727
+ "dependencies": {
2728
+ "css-tree": {
2729
+ "version": "1.0.0-alpha.29",
2730
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz",
2731
+ "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==",
2732
+ "dev": true,
2733
+ "requires": {
2734
+ "mdn-data": "~1.1.0",
2735
+ "source-map": "^0.5.3"
2736
+ }
2737
+ },
2738
+ "mdn-data": {
2739
+ "version": "1.1.4",
2740
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz",
2741
+ "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==",
2742
+ "dev": true
2743
+ }
2744
+ }
2745
+ },
2746
+ "cyclist": {
2747
+ "version": "0.2.2",
2748
+ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
2749
+ "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
2750
+ "dev": true
2751
+ },
2752
+ "date-now": {
2753
+ "version": "0.1.4",
2754
+ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
2755
+ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
2756
+ "dev": true
2757
+ },
2758
+ "de-indent": {
2759
+ "version": "1.0.2",
2760
+ "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
2761
+ "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=",
2762
+ "dev": true
2763
+ },
2764
+ "debug": {
2765
+ "version": "4.1.1",
2766
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
2767
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
2768
+ "dev": true,
2769
+ "requires": {
2770
+ "ms": "^2.1.1"
2771
+ }
2772
+ },
2773
+ "decamelize": {
2774
+ "version": "1.2.0",
2775
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
2776
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
2777
+ "dev": true
2778
+ },
2779
+ "decode-uri-component": {
2780
+ "version": "0.2.0",
2781
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
2782
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
2783
+ "dev": true
2784
+ },
2785
+ "deep-equal": {
2786
+ "version": "1.0.1",
2787
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
2788
+ "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
2789
+ "dev": true
2790
+ },
2791
+ "deepmerge": {
2792
+ "version": "2.2.1",
2793
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
2794
+ "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==",
2795
+ "dev": true
2796
+ },
2797
+ "default-gateway": {
2798
+ "version": "4.2.0",
2799
+ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
2800
+ "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
2801
+ "dev": true,
2802
+ "requires": {
2803
+ "execa": "^1.0.0",
2804
+ "ip-regex": "^2.1.0"
2805
+ }
2806
+ },
2807
+ "define-properties": {
2808
+ "version": "1.1.3",
2809
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
2810
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
2811
+ "dev": true,
2812
+ "requires": {
2813
+ "object-keys": "^1.0.12"
2814
+ }
2815
+ },
2816
+ "define-property": {
2817
+ "version": "2.0.2",
2818
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
2819
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
2820
+ "dev": true,
2821
+ "requires": {
2822
+ "is-descriptor": "^1.0.2",
2823
+ "isobject": "^3.0.1"
2824
+ },
2825
+ "dependencies": {
2826
+ "is-accessor-descriptor": {
2827
+ "version": "1.0.0",
2828
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
2829
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
2830
+ "dev": true,
2831
+ "requires": {
2832
+ "kind-of": "^6.0.0"
2833
+ }
2834
+ },
2835
+ "is-data-descriptor": {
2836
+ "version": "1.0.0",
2837
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
2838
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
2839
+ "dev": true,
2840
+ "requires": {
2841
+ "kind-of": "^6.0.0"
2842
+ }
2843
+ },
2844
+ "is-descriptor": {
2845
+ "version": "1.0.2",
2846
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
2847
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
2848
+ "dev": true,
2849
+ "requires": {
2850
+ "is-accessor-descriptor": "^1.0.0",
2851
+ "is-data-descriptor": "^1.0.0",
2852
+ "kind-of": "^6.0.2"
2853
+ }
2854
+ }
2855
+ }
2856
+ },
2857
+ "del": {
2858
+ "version": "4.1.1",
2859
+ "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
2860
+ "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
2861
+ "dev": true,
2862
+ "requires": {
2863
+ "@types/glob": "^7.1.1",
2864
+ "globby": "^6.1.0",
2865
+ "is-path-cwd": "^2.0.0",
2866
+ "is-path-in-cwd": "^2.0.0",
2867
+ "p-map": "^2.0.0",
2868
+ "pify": "^4.0.1",
2869
+ "rimraf": "^2.6.3"
2870
+ },
2871
+ "dependencies": {
2872
+ "globby": {
2873
+ "version": "6.1.0",
2874
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
2875
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
2876
+ "dev": true,
2877
+ "requires": {
2878
+ "array-union": "^1.0.1",
2879
+ "glob": "^7.0.3",
2880
+ "object-assign": "^4.0.1",
2881
+ "pify": "^2.0.0",
2882
+ "pinkie-promise": "^2.0.0"
2883
+ },
2884
+ "dependencies": {
2885
+ "pify": {
2886
+ "version": "2.3.0",
2887
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2888
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
2889
+ "dev": true
2890
+ }
2891
+ }
2892
+ },
2893
+ "rimraf": {
2894
+ "version": "2.7.1",
2895
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
2896
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
2897
+ "dev": true,
2898
+ "requires": {
2899
+ "glob": "^7.1.3"
2900
+ }
2901
+ }
2902
+ }
2903
+ },
2904
+ "depd": {
2905
+ "version": "1.1.2",
2906
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
2907
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
2908
+ "dev": true
2909
+ },
2910
+ "des.js": {
2911
+ "version": "1.0.0",
2912
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
2913
+ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
2914
+ "dev": true,
2915
+ "requires": {
2916
+ "inherits": "^2.0.1",
2917
+ "minimalistic-assert": "^1.0.0"
2918
+ }
2919
+ },
2920
+ "destroy": {
2921
+ "version": "1.0.4",
2922
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
2923
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
2924
+ "dev": true
2925
+ },
2926
+ "detect-file": {
2927
+ "version": "1.0.0",
2928
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
2929
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
2930
+ "dev": true
2931
+ },
2932
+ "detect-node": {
2933
+ "version": "2.0.4",
2934
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
2935
+ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
2936
+ "dev": true
2937
+ },
2938
+ "diffie-hellman": {
2939
+ "version": "5.0.3",
2940
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
2941
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
2942
+ "dev": true,
2943
+ "requires": {
2944
+ "bn.js": "^4.1.0",
2945
+ "miller-rabin": "^4.0.0",
2946
+ "randombytes": "^2.0.0"
2947
+ }
2948
+ },
2949
+ "dir-glob": {
2950
+ "version": "2.0.0",
2951
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
2952
+ "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
2953
+ "dev": true,
2954
+ "requires": {
2955
+ "arrify": "^1.0.1",
2956
+ "path-type": "^3.0.0"
2957
+ }
2958
+ },
2959
+ "dns-equal": {
2960
+ "version": "1.0.0",
2961
+ "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
2962
+ "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
2963
+ "dev": true
2964
+ },
2965
+ "dns-packet": {
2966
+ "version": "1.3.1",
2967
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
2968
+ "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
2969
+ "dev": true,
2970
+ "requires": {
2971
+ "ip": "^1.1.0",
2972
+ "safe-buffer": "^5.0.1"
2973
+ }
2974
+ },
2975
+ "dns-txt": {
2976
+ "version": "2.0.2",
2977
+ "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
2978
+ "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
2979
+ "dev": true,
2980
+ "requires": {
2981
+ "buffer-indexof": "^1.0.0"
2982
+ }
2983
+ },
2984
+ "dom-serializer": {
2985
+ "version": "0.1.1",
2986
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
2987
+ "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
2988
+ "dev": true,
2989
+ "requires": {
2990
+ "domelementtype": "^1.3.0",
2991
+ "entities": "^1.1.1"
2992
+ }
2993
+ },
2994
+ "domain-browser": {
2995
+ "version": "1.2.0",
2996
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
2997
+ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
2998
+ "dev": true
2999
+ },
3000
+ "domelementtype": {
3001
+ "version": "1.3.1",
3002
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
3003
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
3004
+ "dev": true
3005
+ },
3006
+ "domutils": {
3007
+ "version": "1.7.0",
3008
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
3009
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
3010
+ "dev": true,
3011
+ "requires": {
3012
+ "dom-serializer": "0",
3013
+ "domelementtype": "1"
3014
+ }
3015
+ },
3016
+ "dot-prop": {
3017
+ "version": "4.2.0",
3018
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
3019
+ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
3020
+ "dev": true,
3021
+ "requires": {
3022
+ "is-obj": "^1.0.0"
3023
+ }
3024
+ },
3025
+ "dotenv": {
3026
+ "version": "6.2.0",
3027
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz",
3028
+ "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==",
3029
+ "dev": true
3030
+ },
3031
+ "dotenv-expand": {
3032
+ "version": "4.2.0",
3033
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz",
3034
+ "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=",
3035
+ "dev": true
3036
+ },
3037
+ "duplexify": {
3038
+ "version": "3.7.1",
3039
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
3040
+ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
3041
+ "dev": true,
3042
+ "requires": {
3043
+ "end-of-stream": "^1.0.0",
3044
+ "inherits": "^2.0.1",
3045
+ "readable-stream": "^2.0.0",
3046
+ "stream-shift": "^1.0.0"
3047
+ }
3048
+ },
3049
+ "ee-first": {
3050
+ "version": "1.1.1",
3051
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
3052
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
3053
+ "dev": true
3054
+ },
3055
+ "electron-to-chromium": {
3056
+ "version": "1.3.193",
3057
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.193.tgz",
3058
+ "integrity": "sha512-WX01CG1UoPtTUFaKKwMn+u8nJ63loP6hNxePWtk1pN8ibWMyX1q6TiWPsz1ABBKXezvmaIdtP+0BwzjC1wyCaw==",
3059
+ "dev": true
3060
+ },
3061
+ "elliptic": {
3062
+ "version": "6.5.0",
3063
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz",
3064
+ "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==",
3065
+ "dev": true,
3066
+ "requires": {
3067
+ "bn.js": "^4.4.0",
3068
+ "brorand": "^1.0.1",
3069
+ "hash.js": "^1.0.0",
3070
+ "hmac-drbg": "^1.0.0",
3071
+ "inherits": "^2.0.1",
3072
+ "minimalistic-assert": "^1.0.0",
3073
+ "minimalistic-crypto-utils": "^1.0.0"
3074
+ }
3075
+ },
3076
+ "emoji-regex": {
3077
+ "version": "7.0.3",
3078
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
3079
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
3080
+ "dev": true
3081
+ },
3082
+ "emojis-list": {
3083
+ "version": "2.1.0",
3084
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
3085
+ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
3086
+ "dev": true
3087
+ },
3088
+ "encodeurl": {
3089
+ "version": "1.0.2",
3090
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
3091
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
3092
+ "dev": true
3093
+ },
3094
+ "encoding": {
3095
+ "version": "0.1.12",
3096
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
3097
+ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
3098
+ "dev": true,
3099
+ "requires": {
3100
+ "iconv-lite": "~0.4.13"
3101
+ }
3102
+ },
3103
+ "end-of-stream": {
3104
+ "version": "1.4.1",
3105
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
3106
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
3107
+ "dev": true,
3108
+ "requires": {
3109
+ "once": "^1.4.0"
3110
+ }
3111
+ },
3112
+ "enhanced-resolve": {
3113
+ "version": "4.1.0",
3114
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
3115
+ "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
3116
+ "dev": true,
3117
+ "requires": {
3118
+ "graceful-fs": "^4.1.2",
3119
+ "memory-fs": "^0.4.0",
3120
+ "tapable": "^1.0.0"
3121
+ }
3122
+ },
3123
+ "entities": {
3124
+ "version": "1.1.2",
3125
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
3126
+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
3127
+ "dev": true
3128
+ },
3129
+ "errno": {
3130
+ "version": "0.1.7",
3131
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
3132
+ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
3133
+ "dev": true,
3134
+ "requires": {
3135
+ "prr": "~1.0.1"
3136
+ }
3137
+ },
3138
+ "error-ex": {
3139
+ "version": "1.3.2",
3140
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
3141
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
3142
+ "dev": true,
3143
+ "requires": {
3144
+ "is-arrayish": "^0.2.1"
3145
+ }
3146
+ },
3147
+ "error-stack-parser": {
3148
+ "version": "2.0.2",
3149
+ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.2.tgz",
3150
+ "integrity": "sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw==",
3151
+ "dev": true,
3152
+ "requires": {
3153
+ "stackframe": "^1.0.4"
3154
+ }
3155
+ },
3156
+ "es-abstract": {
3157
+ "version": "1.13.0",
3158
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz",
3159
+ "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==",
3160
+ "dev": true,
3161
+ "requires": {
3162
+ "es-to-primitive": "^1.2.0",
3163
+ "function-bind": "^1.1.1",
3164
+ "has": "^1.0.3",
3165
+ "is-callable": "^1.1.4",
3166
+ "is-regex": "^1.0.4",
3167
+ "object-keys": "^1.0.12"
3168
+ }
3169
+ },
3170
+ "es-to-primitive": {
3171
+ "version": "1.2.0",
3172
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
3173
+ "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
3174
+ "dev": true,
3175
+ "requires": {
3176
+ "is-callable": "^1.1.4",
3177
+ "is-date-object": "^1.0.1",
3178
+ "is-symbol": "^1.0.2"
3179
+ }
3180
+ },
3181
+ "es6-templates": {
3182
+ "version": "0.2.3",
3183
+ "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz",
3184
+ "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=",
3185
+ "dev": true,
3186
+ "requires": {
3187
+ "recast": "~0.11.12",
3188
+ "through": "~2.3.6"
3189
+ }
3190
+ },
3191
+ "escape-html": {
3192
+ "version": "1.0.3",
3193
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
3194
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
3195
+ "dev": true
3196
+ },
3197
+ "escape-string-regexp": {
3198
+ "version": "1.0.5",
3199
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
3200
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
3201
+ "dev": true
3202
+ },
3203
+ "eslint-scope": {
3204
+ "version": "4.0.3",
3205
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
3206
+ "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
3207
+ "dev": true,
3208
+ "requires": {
3209
+ "esrecurse": "^4.1.0",
3210
+ "estraverse": "^4.1.1"
3211
+ }
3212
+ },
3213
+ "esprima": {
3214
+ "version": "3.1.3",
3215
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
3216
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
3217
+ "dev": true
3218
+ },
3219
+ "esrecurse": {
3220
+ "version": "4.2.1",
3221
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
3222
+ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
3223
+ "dev": true,
3224
+ "requires": {
3225
+ "estraverse": "^4.1.0"
3226
+ }
3227
+ },
3228
+ "estraverse": {
3229
+ "version": "4.2.0",
3230
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
3231
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
3232
+ "dev": true
3233
+ },
3234
+ "esutils": {
3235
+ "version": "2.0.2",
3236
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
3237
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
3238
+ "dev": true
3239
+ },
3240
+ "etag": {
3241
+ "version": "1.8.1",
3242
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
3243
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
3244
+ "dev": true
3245
+ },
3246
+ "eventemitter3": {
3247
+ "version": "3.1.2",
3248
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
3249
+ "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==",
3250
+ "dev": true
3251
+ },
3252
+ "events": {
3253
+ "version": "3.0.0",
3254
+ "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz",
3255
+ "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==",
3256
+ "dev": true
3257
+ },
3258
+ "eventsource": {
3259
+ "version": "1.0.7",
3260
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
3261
+ "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
3262
+ "dev": true,
3263
+ "requires": {
3264
+ "original": "^1.0.0"
3265
+ }
3266
+ },
3267
+ "evp_bytestokey": {
3268
+ "version": "1.0.3",
3269
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
3270
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
3271
+ "dev": true,
3272
+ "requires": {
3273
+ "md5.js": "^1.3.4",
3274
+ "safe-buffer": "^5.1.1"
3275
+ }
3276
+ },
3277
+ "execa": {
3278
+ "version": "1.0.0",
3279
+ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
3280
+ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
3281
+ "dev": true,
3282
+ "requires": {
3283
+ "cross-spawn": "^6.0.0",
3284
+ "get-stream": "^4.0.0",
3285
+ "is-stream": "^1.1.0",
3286
+ "npm-run-path": "^2.0.0",
3287
+ "p-finally": "^1.0.0",
3288
+ "signal-exit": "^3.0.0",
3289
+ "strip-eof": "^1.0.0"
3290
+ }
3291
+ },
3292
+ "expand-brackets": {
3293
+ "version": "2.1.4",
3294
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
3295
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
3296
+ "dev": true,
3297
+ "requires": {
3298
+ "debug": "^2.3.3",
3299
+ "define-property": "^0.2.5",
3300
+ "extend-shallow": "^2.0.1",
3301
+ "posix-character-classes": "^0.1.0",
3302
+ "regex-not": "^1.0.0",
3303
+ "snapdragon": "^0.8.1",
3304
+ "to-regex": "^3.0.1"
3305
+ },
3306
+ "dependencies": {
3307
+ "debug": {
3308
+ "version": "2.6.9",
3309
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
3310
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
3311
+ "dev": true,
3312
+ "requires": {
3313
+ "ms": "2.0.0"
3314
+ }
3315
+ },
3316
+ "define-property": {
3317
+ "version": "0.2.5",
3318
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
3319
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
3320
+ "dev": true,
3321
+ "requires": {
3322
+ "is-descriptor": "^0.1.0"
3323
+ }
3324
+ },
3325
+ "extend-shallow": {
3326
+ "version": "2.0.1",
3327
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
3328
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
3329
+ "dev": true,
3330
+ "requires": {
3331
+ "is-extendable": "^0.1.0"
3332
+ }
3333
+ },
3334
+ "is-extendable": {
3335
+ "version": "0.1.1",
3336
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
3337
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
3338
+ "dev": true
3339
+ },
3340
+ "ms": {
3341
+ "version": "2.0.0",
3342
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
3343
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
3344
+ "dev": true
3345
+ }
3346
+ }
3347
+ },
3348
+ "expand-tilde": {
3349
+ "version": "2.0.2",
3350
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
3351
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
3352
+ "dev": true,
3353
+ "requires": {
3354
+ "homedir-polyfill": "^1.0.1"
3355
+ }
3356
+ },
3357
+ "express": {
3358
+ "version": "4.17.1",
3359
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
3360
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
3361
+ "dev": true,
3362
+ "requires": {
3363
+ "accepts": "~1.3.7",
3364
+ "array-flatten": "1.1.1",
3365
+ "body-parser": "1.19.0",
3366
+ "content-disposition": "0.5.3",
3367
+ "content-type": "~1.0.4",
3368
+ "cookie": "0.4.0",
3369
+ "cookie-signature": "1.0.6",
3370
+ "debug": "2.6.9",
3371
+ "depd": "~1.1.2",
3372
+ "encodeurl": "~1.0.2",
3373
+ "escape-html": "~1.0.3",
3374
+ "etag": "~1.8.1",
3375
+ "finalhandler": "~1.1.2",
3376
+ "fresh": "0.5.2",
3377
+ "merge-descriptors": "1.0.1",
3378
+ "methods": "~1.1.2",
3379
+ "on-finished": "~2.3.0",
3380
+ "parseurl": "~1.3.3",
3381
+ "path-to-regexp": "0.1.7",
3382
+ "proxy-addr": "~2.0.5",
3383
+ "qs": "6.7.0",
3384
+ "range-parser": "~1.2.1",
3385
+ "safe-buffer": "5.1.2",
3386
+ "send": "0.17.1",
3387
+ "serve-static": "1.14.1",
3388
+ "setprototypeof": "1.1.1",
3389
+ "statuses": "~1.5.0",
3390
+ "type-is": "~1.6.18",
3391
+ "utils-merge": "1.0.1",
3392
+ "vary": "~1.1.2"
3393
+ },
3394
+ "dependencies": {
3395
+ "array-flatten": {
3396
+ "version": "1.1.1",
3397
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
3398
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
3399
+ "dev": true
3400
+ },
3401
+ "debug": {
3402
+ "version": "2.6.9",
3403
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
3404
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
3405
+ "dev": true,
3406
+ "requires": {
3407
+ "ms": "2.0.0"
3408
+ }
3409
+ },
3410
+ "ms": {
3411
+ "version": "2.0.0",
3412
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
3413
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
3414
+ "dev": true
3415
+ }
3416
+ }
3417
+ },
3418
+ "extend-shallow": {
3419
+ "version": "3.0.2",
3420
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
3421
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
3422
+ "dev": true,
3423
+ "requires": {
3424
+ "assign-symbols": "^1.0.0",
3425
+ "is-extendable": "^1.0.1"
3426
+ }
3427
+ },
3428
+ "extglob": {
3429
+ "version": "2.0.4",
3430
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
3431
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
3432
+ "dev": true,
3433
+ "requires": {
3434
+ "array-unique": "^0.3.2",
3435
+ "define-property": "^1.0.0",
3436
+ "expand-brackets": "^2.1.4",
3437
+ "extend-shallow": "^2.0.1",
3438
+ "fragment-cache": "^0.2.1",
3439
+ "regex-not": "^1.0.0",
3440
+ "snapdragon": "^0.8.1",
3441
+ "to-regex": "^3.0.1"
3442
+ },
3443
+ "dependencies": {
3444
+ "define-property": {
3445
+ "version": "1.0.0",
3446
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
3447
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
3448
+ "dev": true,
3449
+ "requires": {
3450
+ "is-descriptor": "^1.0.0"
3451
+ }
3452
+ },
3453
+ "extend-shallow": {
3454
+ "version": "2.0.1",
3455
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
3456
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
3457
+ "dev": true,
3458
+ "requires": {
3459
+ "is-extendable": "^0.1.0"
3460
+ }
3461
+ },
3462
+ "is-accessor-descriptor": {
3463
+ "version": "1.0.0",
3464
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
3465
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
3466
+ "dev": true,
3467
+ "requires": {
3468
+ "kind-of": "^6.0.0"
3469
+ }
3470
+ },
3471
+ "is-data-descriptor": {
3472
+ "version": "1.0.0",
3473
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
3474
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
3475
+ "dev": true,
3476
+ "requires": {
3477
+ "kind-of": "^6.0.0"
3478
+ }
3479
+ },
3480
+ "is-descriptor": {
3481
+ "version": "1.0.2",
3482
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
3483
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
3484
+ "dev": true,
3485
+ "requires": {
3486
+ "is-accessor-descriptor": "^1.0.0",
3487
+ "is-data-descriptor": "^1.0.0",
3488
+ "kind-of": "^6.0.2"
3489
+ }
3490
+ },
3491
+ "is-extendable": {
3492
+ "version": "0.1.1",
3493
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
3494
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
3495
+ "dev": true
3496
+ }
3497
+ }
3498
+ },
3499
+ "extract-text-webpack-plugin": {
3500
+ "version": "4.0.0-beta.0",
3501
+ "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-4.0.0-beta.0.tgz",
3502
+ "integrity": "sha512-Hypkn9jUTnFr0DpekNam53X47tXn3ucY08BQumv7kdGgeVUBLq3DJHJTi6HNxv4jl9W+Skxjz9+RnK0sJyqqjA==",
3503
+ "dev": true,
3504
+ "requires": {
3505
+ "async": "^2.4.1",
3506
+ "loader-utils": "^1.1.0",
3507
+ "schema-utils": "^0.4.5",
3508
+ "webpack-sources": "^1.1.0"
3509
+ }
3510
+ },
3511
+ "fast-deep-equal": {
3512
+ "version": "2.0.1",
3513
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
3514
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
3515
+ "dev": true
3516
+ },
3517
+ "fast-glob": {
3518
+ "version": "2.2.7",
3519
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
3520
+ "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
3521
+ "dev": true,
3522
+ "requires": {
3523
+ "@mrmlnc/readdir-enhanced": "^2.2.1",
3524
+ "@nodelib/fs.stat": "^1.1.2",
3525
+ "glob-parent": "^3.1.0",
3526
+ "is-glob": "^4.0.0",
3527
+ "merge2": "^1.2.3",
3528
+ "micromatch": "^3.1.10"
3529
+ }
3530
+ },
3531
+ "fast-json-stable-stringify": {
3532
+ "version": "2.0.0",
3533
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
3534
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
3535
+ "dev": true
3536
+ },
3537
+ "fastparse": {
3538
+ "version": "1.1.2",
3539
+ "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
3540
+ "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
3541
+ "dev": true
3542
+ },
3543
+ "faye-websocket": {
3544
+ "version": "0.10.0",
3545
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
3546
+ "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
3547
+ "dev": true,
3548
+ "requires": {
3549
+ "websocket-driver": ">=0.5.1"
3550
+ }
3551
+ },
3552
+ "figgy-pudding": {
3553
+ "version": "3.5.1",
3554
+ "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
3555
+ "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==",
3556
+ "dev": true
3557
+ },
3558
+ "file-loader": {
3559
+ "version": "2.0.0",
3560
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz",
3561
+ "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==",
3562
+ "dev": true,
3563
+ "requires": {
3564
+ "loader-utils": "^1.0.2",
3565
+ "schema-utils": "^1.0.0"
3566
+ },
3567
+ "dependencies": {
3568
+ "schema-utils": {
3569
+ "version": "1.0.0",
3570
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
3571
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
3572
+ "dev": true,
3573
+ "requires": {
3574
+ "ajv": "^6.1.0",
3575
+ "ajv-errors": "^1.0.0",
3576
+ "ajv-keywords": "^3.1.0"
3577
+ }
3578
+ }
3579
+ }
3580
+ },
3581
+ "file-type": {
3582
+ "version": "10.11.0",
3583
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz",
3584
+ "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==",
3585
+ "dev": true
3586
+ },
3587
+ "fill-range": {
3588
+ "version": "4.0.0",
3589
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
3590
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
3591
+ "dev": true,
3592
+ "requires": {
3593
+ "extend-shallow": "^2.0.1",
3594
+ "is-number": "^3.0.0",
3595
+ "repeat-string": "^1.6.1",
3596
+ "to-regex-range": "^2.1.0"
3597
+ },
3598
+ "dependencies": {
3599
+ "extend-shallow": {
3600
+ "version": "2.0.1",
3601
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
3602
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
3603
+ "dev": true,
3604
+ "requires": {
3605
+ "is-extendable": "^0.1.0"
3606
+ }
3607
+ },
3608
+ "is-extendable": {
3609
+ "version": "0.1.1",
3610
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
3611
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
3612
+ "dev": true
3613
+ }
3614
+ }
3615
+ },
3616
+ "finalhandler": {
3617
+ "version": "1.1.2",
3618
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
3619
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
3620
+ "dev": true,
3621
+ "requires": {
3622
+ "debug": "2.6.9",
3623
+ "encodeurl": "~1.0.2",
3624
+ "escape-html": "~1.0.3",
3625
+ "on-finished": "~2.3.0",
3626
+ "parseurl": "~1.3.3",
3627
+ "statuses": "~1.5.0",
3628
+ "unpipe": "~1.0.0"
3629
+ },
3630
+ "dependencies": {
3631
+ "debug": {
3632
+ "version": "2.6.9",
3633
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
3634
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
3635
+ "dev": true,
3636
+ "requires": {
3637
+ "ms": "2.0.0"
3638
+ }
3639
+ },
3640
+ "ms": {
3641
+ "version": "2.0.0",
3642
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
3643
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
3644
+ "dev": true
3645
+ }
3646
+ }
3647
+ },
3648
+ "find-cache-dir": {
3649
+ "version": "2.1.0",
3650
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
3651
+ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
3652
+ "dev": true,
3653
+ "requires": {
3654
+ "commondir": "^1.0.1",
3655
+ "make-dir": "^2.0.0",
3656
+ "pkg-dir": "^3.0.0"
3657
+ }
3658
+ },
3659
+ "find-up": {
3660
+ "version": "3.0.0",
3661
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
3662
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
3663
+ "dev": true,
3664
+ "requires": {
3665
+ "locate-path": "^3.0.0"
3666
+ }
3667
+ },
3668
+ "findup-sync": {
3669
+ "version": "3.0.0",
3670
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
3671
+ "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
3672
+ "dev": true,
3673
+ "requires": {
3674
+ "detect-file": "^1.0.0",
3675
+ "is-glob": "^4.0.0",
3676
+ "micromatch": "^3.0.4",
3677
+ "resolve-dir": "^1.0.1"
3678
+ }
3679
+ },
3680
+ "flatten": {
3681
+ "version": "1.0.2",
3682
+ "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz",
3683
+ "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=",
3684
+ "dev": true
3685
+ },
3686
+ "flush-write-stream": {
3687
+ "version": "1.1.1",
3688
+ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
3689
+ "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
3690
+ "dev": true,
3691
+ "requires": {
3692
+ "inherits": "^2.0.3",
3693
+ "readable-stream": "^2.3.6"
3694
+ }
3695
+ },
3696
+ "follow-redirects": {
3697
+ "version": "1.7.0",
3698
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz",
3699
+ "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==",
3700
+ "dev": true,
3701
+ "requires": {
3702
+ "debug": "^3.2.6"
3703
+ },
3704
+ "dependencies": {
3705
+ "debug": {
3706
+ "version": "3.2.6",
3707
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
3708
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
3709
+ "dev": true,
3710
+ "requires": {
3711
+ "ms": "^2.1.1"
3712
+ }
3713
+ }
3714
+ }
3715
+ },
3716
+ "for-in": {
3717
+ "version": "1.0.2",
3718
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
3719
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
3720
+ "dev": true
3721
+ },
3722
+ "for-own": {
3723
+ "version": "1.0.0",
3724
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
3725
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
3726
+ "dev": true,
3727
+ "requires": {
3728
+ "for-in": "^1.0.1"
3729
+ }
3730
+ },
3731
+ "forwarded": {
3732
+ "version": "0.1.2",
3733
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
3734
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
3735
+ "dev": true
3736
+ },
3737
+ "fragment-cache": {
3738
+ "version": "0.2.1",
3739
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
3740
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
3741
+ "dev": true,
3742
+ "requires": {
3743
+ "map-cache": "^0.2.2"
3744
+ }
3745
+ },
3746
+ "fresh": {
3747
+ "version": "0.5.2",
3748
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
3749
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
3750
+ "dev": true
3751
+ },
3752
+ "friendly-errors-webpack-plugin": {
3753
+ "version": "1.7.0",
3754
+ "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz",
3755
+ "integrity": "sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw==",
3756
+ "dev": true,
3757
+ "requires": {
3758
+ "chalk": "^1.1.3",
3759
+ "error-stack-parser": "^2.0.0",
3760
+ "string-width": "^2.0.0"
3761
+ },
3762
+ "dependencies": {
3763
+ "ansi-styles": {
3764
+ "version": "2.2.1",
3765
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
3766
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
3767
+ "dev": true
3768
+ },
3769
+ "chalk": {
3770
+ "version": "1.1.3",
3771
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
3772
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
3773
+ "dev": true,
3774
+ "requires": {
3775
+ "ansi-styles": "^2.2.1",
3776
+ "escape-string-regexp": "^1.0.2",
3777
+ "has-ansi": "^2.0.0",
3778
+ "strip-ansi": "^3.0.0",
3779
+ "supports-color": "^2.0.0"
3780
+ }
3781
+ },
3782
+ "supports-color": {
3783
+ "version": "2.0.0",
3784
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
3785
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
3786
+ "dev": true
3787
+ }
3788
+ }
3789
+ },
3790
+ "from2": {
3791
+ "version": "2.3.0",
3792
+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
3793
+ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
3794
+ "dev": true,
3795
+ "requires": {
3796
+ "inherits": "^2.0.1",
3797
+ "readable-stream": "^2.0.0"
3798
+ }
3799
+ },
3800
+ "fs-extra": {
3801
+ "version": "7.0.1",
3802
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
3803
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
3804
+ "dev": true,
3805
+ "requires": {
3806
+ "graceful-fs": "^4.1.2",
3807
+ "jsonfile": "^4.0.0",
3808
+ "universalify": "^0.1.0"
3809
+ }
3810
+ },
3811
+ "fs-write-stream-atomic": {
3812
+ "version": "1.0.10",
3813
+ "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
3814
+ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
3815
+ "dev": true,
3816
+ "requires": {
3817
+ "graceful-fs": "^4.1.2",
3818
+ "iferr": "^0.1.5",
3819
+ "imurmurhash": "^0.1.4",
3820
+ "readable-stream": "1 || 2"
3821
+ }
3822
+ },
3823
+ "fs.realpath": {
3824
+ "version": "1.0.0",
3825
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
3826
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
3827
+ "dev": true
3828
+ },
3829
+ "fsevents": {
3830
+ "version": "1.2.9",
3831
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
3832
+ "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
3833
+ "dev": true,
3834
+ "optional": true,
3835
+ "requires": {
3836
+ "nan": "^2.12.1",
3837
+ "node-pre-gyp": "^0.12.0"
3838
+ },
3839
+ "dependencies": {
3840
+ "abbrev": {
3841
+ "version": "1.1.1",
3842
+ "bundled": true,
3843
+ "dev": true,
3844
+ "optional": true
3845
+ },
3846
+ "ansi-regex": {
3847
+ "version": "2.1.1",
3848
+ "bundled": true,
3849
+ "dev": true,
3850
+ "optional": true
3851
+ },
3852
+ "aproba": {
3853
+ "version": "1.2.0",
3854
+ "bundled": true,
3855
+ "dev": true,
3856
+ "optional": true
3857
+ },
3858
+ "are-we-there-yet": {
3859
+ "version": "1.1.5",
3860
+ "bundled": true,
3861
+ "dev": true,
3862
+ "optional": true,
3863
+ "requires": {
3864
+ "delegates": "^1.0.0",
3865
+ "readable-stream": "^2.0.6"
3866
+ }
3867
+ },
3868
+ "balanced-match": {
3869
+ "version": "1.0.0",
3870
+ "bundled": true,
3871
+ "dev": true,
3872
+ "optional": true
3873
+ },
3874
+ "brace-expansion": {
3875
+ "version": "1.1.11",
3876
+ "bundled": true,
3877
+ "dev": true,
3878
+ "optional": true,
3879
+ "requires": {
3880
+ "balanced-match": "^1.0.0",
3881
+ "concat-map": "0.0.1"
3882
+ }
3883
+ },
3884
+ "chownr": {
3885
+ "version": "1.1.1",
3886
+ "bundled": true,
3887
+ "dev": true,
3888
+ "optional": true
3889
+ },
3890
+ "code-point-at": {
3891
+ "version": "1.1.0",
3892
+ "bundled": true,
3893
+ "dev": true,
3894
+ "optional": true
3895
+ },
3896
+ "concat-map": {
3897
+ "version": "0.0.1",
3898
+ "bundled": true,
3899
+ "dev": true,
3900
+ "optional": true
3901
+ },
3902
+ "console-control-strings": {
3903
+ "version": "1.1.0",
3904
+ "bundled": true,
3905
+ "dev": true,
3906
+ "optional": true
3907
+ },
3908
+ "core-util-is": {
3909
+ "version": "1.0.2",
3910
+ "bundled": true,
3911
+ "dev": true,
3912
+ "optional": true
3913
+ },
3914
+ "debug": {
3915
+ "version": "4.1.1",
3916
+ "bundled": true,
3917
+ "dev": true,
3918
+ "optional": true,
3919
+ "requires": {
3920
+ "ms": "^2.1.1"
3921
+ }
3922
+ },
3923
+ "deep-extend": {
3924
+ "version": "0.6.0",
3925
+ "bundled": true,
3926
+ "dev": true,
3927
+ "optional": true
3928
+ },
3929
+ "delegates": {
3930
+ "version": "1.0.0",
3931
+ "bundled": true,
3932
+ "dev": true,
3933
+ "optional": true
3934
+ },
3935
+ "detect-libc": {
3936
+ "version": "1.0.3",
3937
+ "bundled": true,
3938
+ "dev": true,
3939
+ "optional": true
3940
+ },
3941
+ "fs-minipass": {
3942
+ "version": "1.2.5",
3943
+ "bundled": true,
3944
+ "dev": true,
3945
+ "optional": true,
3946
+ "requires": {
3947
+ "minipass": "^2.2.1"
3948
+ }
3949
+ },
3950
+ "fs.realpath": {
3951
+ "version": "1.0.0",
3952
+ "bundled": true,
3953
+ "dev": true,
3954
+ "optional": true
3955
+ },
3956
+ "gauge": {
3957
+ "version": "2.7.4",
3958
+ "bundled": true,
3959
+ "dev": true,
3960
+ "optional": true,
3961
+ "requires": {
3962
+ "aproba": "^1.0.3",
3963
+ "console-control-strings": "^1.0.0",
3964
+ "has-unicode": "^2.0.0",
3965
+ "object-assign": "^4.1.0",
3966
+ "signal-exit": "^3.0.0",
3967
+ "string-width": "^1.0.1",
3968
+ "strip-ansi": "^3.0.1",
3969
+ "wide-align": "^1.1.0"
3970
+ }
3971
+ },
3972
+ "glob": {
3973
+ "version": "7.1.3",
3974
+ "bundled": true,
3975
+ "dev": true,
3976
+ "optional": true,
3977
+ "requires": {
3978
+ "fs.realpath": "^1.0.0",
3979
+ "inflight": "^1.0.4",
3980
+ "inherits": "2",
3981
+ "minimatch": "^3.0.4",
3982
+ "once": "^1.3.0",
3983
+ "path-is-absolute": "^1.0.0"
3984
+ }
3985
+ },
3986
+ "has-unicode": {
3987
+ "version": "2.0.1",
3988
+ "bundled": true,
3989
+ "dev": true,
3990
+ "optional": true
3991
+ },
3992
+ "iconv-lite": {
3993
+ "version": "0.4.24",
3994
+ "bundled": true,
3995
+ "dev": true,
3996
+ "optional": true,
3997
+ "requires": {
3998
+ "safer-buffer": ">= 2.1.2 < 3"
3999
+ }
4000
+ },
4001
+ "ignore-walk": {
4002
+ "version": "3.0.1",
4003
+ "bundled": true,
4004
+ "dev": true,
4005
+ "optional": true,
4006
+ "requires": {
4007
+ "minimatch": "^3.0.4"
4008
+ }
4009
+ },
4010
+ "inflight": {
4011
+ "version": "1.0.6",
4012
+ "bundled": true,
4013
+ "dev": true,
4014
+ "optional": true,
4015
+ "requires": {
4016
+ "once": "^1.3.0",
4017
+ "wrappy": "1"
4018
+ }
4019
+ },
4020
+ "inherits": {
4021
+ "version": "2.0.3",
4022
+ "bundled": true,
4023
+ "dev": true,
4024
+ "optional": true
4025
+ },
4026
+ "ini": {
4027
+ "version": "1.3.5",
4028
+ "bundled": true,
4029
+ "dev": true,
4030
+ "optional": true
4031
+ },
4032
+ "is-fullwidth-code-point": {
4033
+ "version": "1.0.0",
4034
+ "bundled": true,
4035
+ "dev": true,
4036
+ "optional": true,
4037
+ "requires": {
4038
+ "number-is-nan": "^1.0.0"
4039
+ }
4040
+ },
4041
+ "isarray": {
4042
+ "version": "1.0.0",
4043
+ "bundled": true,
4044
+ "dev": true,
4045
+ "optional": true
4046
+ },
4047
+ "minimatch": {
4048
+ "version": "3.0.4",
4049
+ "bundled": true,
4050
+ "dev": true,
4051
+ "optional": true,
4052
+ "requires": {
4053
+ "brace-expansion": "^1.1.7"
4054
+ }
4055
+ },
4056
+ "minimist": {
4057
+ "version": "0.0.8",
4058
+ "bundled": true,
4059
+ "dev": true,
4060
+ "optional": true
4061
+ },
4062
+ "minipass": {
4063
+ "version": "2.3.5",
4064
+ "bundled": true,
4065
+ "dev": true,
4066
+ "optional": true,
4067
+ "requires": {
4068
+ "safe-buffer": "^5.1.2",
4069
+ "yallist": "^3.0.0"
4070
+ }
4071
+ },
4072
+ "minizlib": {
4073
+ "version": "1.2.1",
4074
+ "bundled": true,
4075
+ "dev": true,
4076
+ "optional": true,
4077
+ "requires": {
4078
+ "minipass": "^2.2.1"
4079
+ }
4080
+ },
4081
+ "mkdirp": {
4082
+ "version": "0.5.1",
4083
+ "bundled": true,
4084
+ "dev": true,
4085
+ "optional": true,
4086
+ "requires": {
4087
+ "minimist": "0.0.8"
4088
+ }
4089
+ },
4090
+ "ms": {
4091
+ "version": "2.1.1",
4092
+ "bundled": true,
4093
+ "dev": true,
4094
+ "optional": true
4095
+ },
4096
+ "needle": {
4097
+ "version": "2.3.0",
4098
+ "bundled": true,
4099
+ "dev": true,
4100
+ "optional": true,
4101
+ "requires": {
4102
+ "debug": "^4.1.0",
4103
+ "iconv-lite": "^0.4.4",
4104
+ "sax": "^1.2.4"
4105
+ }
4106
+ },
4107
+ "node-pre-gyp": {
4108
+ "version": "0.12.0",
4109
+ "bundled": true,
4110
+ "dev": true,
4111
+ "optional": true,
4112
+ "requires": {
4113
+ "detect-libc": "^1.0.2",
4114
+ "mkdirp": "^0.5.1",
4115
+ "needle": "^2.2.1",
4116
+ "nopt": "^4.0.1",
4117
+ "npm-packlist": "^1.1.6",
4118
+ "npmlog": "^4.0.2",
4119
+ "rc": "^1.2.7",
4120
+ "rimraf": "^2.6.1",
4121
+ "semver": "^5.3.0",
4122
+ "tar": "^4"
4123
+ }
4124
+ },
4125
+ "nopt": {
4126
+ "version": "4.0.1",
4127
+ "bundled": true,
4128
+ "dev": true,
4129
+ "optional": true,
4130
+ "requires": {
4131
+ "abbrev": "1",
4132
+ "osenv": "^0.1.4"
4133
+ }
4134
+ },
4135
+ "npm-bundled": {
4136
+ "version": "1.0.6",
4137
+ "bundled": true,
4138
+ "dev": true,
4139
+ "optional": true
4140
+ },
4141
+ "npm-packlist": {
4142
+ "version": "1.4.1",
4143
+ "bundled": true,
4144
+ "dev": true,
4145
+ "optional": true,
4146
+ "requires": {
4147
+ "ignore-walk": "^3.0.1",
4148
+ "npm-bundled": "^1.0.1"
4149
+ }
4150
+ },
4151
+ "npmlog": {
4152
+ "version": "4.1.2",
4153
+ "bundled": true,
4154
+ "dev": true,
4155
+ "optional": true,
4156
+ "requires": {
4157
+ "are-we-there-yet": "~1.1.2",
4158
+ "console-control-strings": "~1.1.0",
4159
+ "gauge": "~2.7.3",
4160
+ "set-blocking": "~2.0.0"
4161
+ }
4162
+ },
4163
+ "number-is-nan": {
4164
+ "version": "1.0.1",
4165
+ "bundled": true,
4166
+ "dev": true,
4167
+ "optional": true
4168
+ },
4169
+ "object-assign": {
4170
+ "version": "4.1.1",
4171
+ "bundled": true,
4172
+ "dev": true,
4173
+ "optional": true
4174
+ },
4175
+ "once": {
4176
+ "version": "1.4.0",
4177
+ "bundled": true,
4178
+ "dev": true,
4179
+ "optional": true,
4180
+ "requires": {
4181
+ "wrappy": "1"
4182
+ }
4183
+ },
4184
+ "os-homedir": {
4185
+ "version": "1.0.2",
4186
+ "bundled": true,
4187
+ "dev": true,
4188
+ "optional": true
4189
+ },
4190
+ "os-tmpdir": {
4191
+ "version": "1.0.2",
4192
+ "bundled": true,
4193
+ "dev": true,
4194
+ "optional": true
4195
+ },
4196
+ "osenv": {
4197
+ "version": "0.1.5",
4198
+ "bundled": true,
4199
+ "dev": true,
4200
+ "optional": true,
4201
+ "requires": {
4202
+ "os-homedir": "^1.0.0",
4203
+ "os-tmpdir": "^1.0.0"
4204
+ }
4205
+ },
4206
+ "path-is-absolute": {
4207
+ "version": "1.0.1",
4208
+ "bundled": true,
4209
+ "dev": true,
4210
+ "optional": true
4211
+ },
4212
+ "process-nextick-args": {
4213
+ "version": "2.0.0",
4214
+ "bundled": true,
4215
+ "dev": true,
4216
+ "optional": true
4217
+ },
4218
+ "rc": {
4219
+ "version": "1.2.8",
4220
+ "bundled": true,
4221
+ "dev": true,
4222
+ "optional": true,
4223
+ "requires": {
4224
+ "deep-extend": "^0.6.0",
4225
+ "ini": "~1.3.0",
4226
+ "minimist": "^1.2.0",
4227
+ "strip-json-comments": "~2.0.1"
4228
+ },
4229
+ "dependencies": {
4230
+ "minimist": {
4231
+ "version": "1.2.0",
4232
+ "bundled": true,
4233
+ "dev": true,
4234
+ "optional": true
4235
+ }
4236
+ }
4237
+ },
4238
+ "readable-stream": {
4239
+ "version": "2.3.6",
4240
+ "bundled": true,
4241
+ "dev": true,
4242
+ "optional": true,
4243
+ "requires": {
4244
+ "core-util-is": "~1.0.0",
4245
+ "inherits": "~2.0.3",
4246
+ "isarray": "~1.0.0",
4247
+ "process-nextick-args": "~2.0.0",
4248
+ "safe-buffer": "~5.1.1",
4249
+ "string_decoder": "~1.1.1",
4250
+ "util-deprecate": "~1.0.1"
4251
+ }
4252
+ },
4253
+ "rimraf": {
4254
+ "version": "2.6.3",
4255
+ "bundled": true,
4256
+ "dev": true,
4257
+ "optional": true,
4258
+ "requires": {
4259
+ "glob": "^7.1.3"
4260
+ }
4261
+ },
4262
+ "safe-buffer": {
4263
+ "version": "5.1.2",
4264
+ "bundled": true,
4265
+ "dev": true,
4266
+ "optional": true
4267
+ },
4268
+ "safer-buffer": {
4269
+ "version": "2.1.2",
4270
+ "bundled": true,
4271
+ "dev": true,
4272
+ "optional": true
4273
+ },
4274
+ "sax": {
4275
+ "version": "1.2.4",
4276
+ "bundled": true,
4277
+ "dev": true,
4278
+ "optional": true
4279
+ },
4280
+ "semver": {
4281
+ "version": "5.7.0",
4282
+ "bundled": true,
4283
+ "dev": true,
4284
+ "optional": true
4285
+ },
4286
+ "set-blocking": {
4287
+ "version": "2.0.0",
4288
+ "bundled": true,
4289
+ "dev": true,
4290
+ "optional": true
4291
+ },
4292
+ "signal-exit": {
4293
+ "version": "3.0.2",
4294
+ "bundled": true,
4295
+ "dev": true,
4296
+ "optional": true
4297
+ },
4298
+ "string-width": {
4299
+ "version": "1.0.2",
4300
+ "bundled": true,
4301
+ "dev": true,
4302
+ "optional": true,
4303
+ "requires": {
4304
+ "code-point-at": "^1.0.0",
4305
+ "is-fullwidth-code-point": "^1.0.0",
4306
+ "strip-ansi": "^3.0.0"
4307
+ }
4308
+ },
4309
+ "string_decoder": {
4310
+ "version": "1.1.1",
4311
+ "bundled": true,
4312
+ "dev": true,
4313
+ "optional": true,
4314
+ "requires": {
4315
+ "safe-buffer": "~5.1.0"
4316
+ }
4317
+ },
4318
+ "strip-ansi": {
4319
+ "version": "3.0.1",
4320
+ "bundled": true,
4321
+ "dev": true,
4322
+ "optional": true,
4323
+ "requires": {
4324
+ "ansi-regex": "^2.0.0"
4325
+ }
4326
+ },
4327
+ "strip-json-comments": {
4328
+ "version": "2.0.1",
4329
+ "bundled": true,
4330
+ "dev": true,
4331
+ "optional": true
4332
+ },
4333
+ "tar": {
4334
+ "version": "4.4.8",
4335
+ "bundled": true,
4336
+ "dev": true,
4337
+ "optional": true,
4338
+ "requires": {
4339
+ "chownr": "^1.1.1",
4340
+ "fs-minipass": "^1.2.5",
4341
+ "minipass": "^2.3.4",
4342
+ "minizlib": "^1.1.1",
4343
+ "mkdirp": "^0.5.0",
4344
+ "safe-buffer": "^5.1.2",
4345
+ "yallist": "^3.0.2"
4346
+ }
4347
+ },
4348
+ "util-deprecate": {
4349
+ "version": "1.0.2",
4350
+ "bundled": true,
4351
+ "dev": true,
4352
+ "optional": true
4353
+ },
4354
+ "wide-align": {
4355
+ "version": "1.1.3",
4356
+ "bundled": true,
4357
+ "dev": true,
4358
+ "optional": true,
4359
+ "requires": {
4360
+ "string-width": "^1.0.2 || 2"
4361
+ }
4362
+ },
4363
+ "wrappy": {
4364
+ "version": "1.0.2",
4365
+ "bundled": true,
4366
+ "dev": true,
4367
+ "optional": true
4368
+ },
4369
+ "yallist": {
4370
+ "version": "3.0.3",
4371
+ "bundled": true,
4372
+ "dev": true,
4373
+ "optional": true
4374
+ }
4375
+ }
4376
+ },
4377
+ "function-bind": {
4378
+ "version": "1.1.1",
4379
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
4380
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
4381
+ "dev": true
4382
+ },
4383
+ "get-caller-file": {
4384
+ "version": "2.0.5",
4385
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
4386
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
4387
+ "dev": true
4388
+ },
4389
+ "get-stream": {
4390
+ "version": "4.1.0",
4391
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
4392
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
4393
+ "dev": true,
4394
+ "requires": {
4395
+ "pump": "^3.0.0"
4396
+ }
4397
+ },
4398
+ "get-value": {
4399
+ "version": "2.0.6",
4400
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
4401
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
4402
+ "dev": true
4403
+ },
4404
+ "gettext-parser": {
4405
+ "version": "3.1.1",
4406
+ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-3.1.1.tgz",
4407
+ "integrity": "sha512-vNhWcqXEtZPs5Ft1ReA34g7ByWotpcOIeJvXVy2jF3/G2U9v6W0wG4Z4hXzcU8R//jArqkgHcVCGgGqa4vxVlQ==",
4408
+ "dev": true,
4409
+ "requires": {
4410
+ "encoding": "^0.1.12",
4411
+ "readable-stream": "^3.2.0",
4412
+ "safe-buffer": "^5.1.2"
4413
+ },
4414
+ "dependencies": {
4415
+ "readable-stream": {
4416
+ "version": "3.4.0",
4417
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
4418
+ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
4419
+ "dev": true,
4420
+ "requires": {
4421
+ "inherits": "^2.0.3",
4422
+ "string_decoder": "^1.1.1",
4423
+ "util-deprecate": "^1.0.1"
4424
+ }
4425
+ }
4426
+ }
4427
+ },
4428
+ "glob": {
4429
+ "version": "7.1.4",
4430
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
4431
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
4432
+ "dev": true,
4433
+ "requires": {
4434
+ "fs.realpath": "^1.0.0",
4435
+ "inflight": "^1.0.4",
4436
+ "inherits": "2",
4437
+ "minimatch": "^3.0.4",
4438
+ "once": "^1.3.0",
4439
+ "path-is-absolute": "^1.0.0"
4440
+ }
4441
+ },
4442
+ "glob-parent": {
4443
+ "version": "3.1.0",
4444
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
4445
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
4446
+ "dev": true,
4447
+ "requires": {
4448
+ "is-glob": "^3.1.0",
4449
+ "path-dirname": "^1.0.0"
4450
+ },
4451
+ "dependencies": {
4452
+ "is-glob": {
4453
+ "version": "3.1.0",
4454
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
4455
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
4456
+ "dev": true,
4457
+ "requires": {
4458
+ "is-extglob": "^2.1.0"
4459
+ }
4460
+ }
4461
+ }
4462
+ },
4463
+ "glob-to-regexp": {
4464
+ "version": "0.3.0",
4465
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
4466
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
4467
+ "dev": true
4468
+ },
4469
+ "global-modules": {
4470
+ "version": "2.0.0",
4471
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
4472
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
4473
+ "dev": true,
4474
+ "requires": {
4475
+ "global-prefix": "^3.0.0"
4476
+ },
4477
+ "dependencies": {
4478
+ "global-prefix": {
4479
+ "version": "3.0.0",
4480
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
4481
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
4482
+ "dev": true,
4483
+ "requires": {
4484
+ "ini": "^1.3.5",
4485
+ "kind-of": "^6.0.2",
4486
+ "which": "^1.3.1"
4487
+ }
4488
+ }
4489
+ }
4490
+ },
4491
+ "global-prefix": {
4492
+ "version": "1.0.2",
4493
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
4494
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
4495
+ "dev": true,
4496
+ "requires": {
4497
+ "expand-tilde": "^2.0.2",
4498
+ "homedir-polyfill": "^1.0.1",
4499
+ "ini": "^1.3.4",
4500
+ "is-windows": "^1.0.1",
4501
+ "which": "^1.2.14"
4502
+ }
4503
+ },
4504
+ "globals": {
4505
+ "version": "11.12.0",
4506
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
4507
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
4508
+ "dev": true
4509
+ },
4510
+ "globby": {
4511
+ "version": "8.0.2",
4512
+ "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz",
4513
+ "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==",
4514
+ "dev": true,
4515
+ "requires": {
4516
+ "array-union": "^1.0.1",
4517
+ "dir-glob": "2.0.0",
4518
+ "fast-glob": "^2.0.2",
4519
+ "glob": "^7.1.2",
4520
+ "ignore": "^3.3.5",
4521
+ "pify": "^3.0.0",
4522
+ "slash": "^1.0.0"
4523
+ },
4524
+ "dependencies": {
4525
+ "pify": {
4526
+ "version": "3.0.0",
4527
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
4528
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
4529
+ "dev": true
4530
+ }
4531
+ }
4532
+ },
4533
+ "globs": {
4534
+ "version": "0.1.4",
4535
+ "resolved": "https://registry.npmjs.org/globs/-/globs-0.1.4.tgz",
4536
+ "integrity": "sha512-D23dWbOq48vlOraoSigbcQV4tWrnhwk+E/Um2cMuDS3/5dwGmdFeA7L/vAvDhLFlQOTDqHcXh35m/71g2A2WzQ==",
4537
+ "dev": true,
4538
+ "requires": {
4539
+ "glob": "^7.1.1"
4540
+ }
4541
+ },
4542
+ "graceful-fs": {
4543
+ "version": "4.2.0",
4544
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
4545
+ "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==",
4546
+ "dev": true
4547
+ },
4548
+ "growly": {
4549
+ "version": "1.3.0",
4550
+ "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
4551
+ "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
4552
+ "dev": true
4553
+ },
4554
+ "handle-thing": {
4555
+ "version": "2.0.0",
4556
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz",
4557
+ "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==",
4558
+ "dev": true
4559
+ },
4560
+ "has": {
4561
+ "version": "1.0.3",
4562
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
4563
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
4564
+ "dev": true,
4565
+ "requires": {
4566
+ "function-bind": "^1.1.1"
4567
+ }
4568
+ },
4569
+ "has-ansi": {
4570
+ "version": "2.0.0",
4571
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
4572
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
4573
+ "dev": true,
4574
+ "requires": {
4575
+ "ansi-regex": "^2.0.0"
4576
+ }
4577
+ },
4578
+ "has-flag": {
4579
+ "version": "3.0.0",
4580
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
4581
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
4582
+ "dev": true
4583
+ },
4584
+ "has-symbols": {
4585
+ "version": "1.0.0",
4586
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
4587
+ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
4588
+ "dev": true
4589
+ },
4590
+ "has-value": {
4591
+ "version": "1.0.0",
4592
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
4593
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
4594
+ "dev": true,
4595
+ "requires": {
4596
+ "get-value": "^2.0.6",
4597
+ "has-values": "^1.0.0",
4598
+ "isobject": "^3.0.0"
4599
+ }
4600
+ },
4601
+ "has-values": {
4602
+ "version": "1.0.0",
4603
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
4604
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
4605
+ "dev": true,
4606
+ "requires": {
4607
+ "is-number": "^3.0.0",
4608
+ "kind-of": "^4.0.0"
4609
+ },
4610
+ "dependencies": {
4611
+ "kind-of": {
4612
+ "version": "4.0.0",
4613
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
4614
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
4615
+ "dev": true,
4616
+ "requires": {
4617
+ "is-buffer": "^1.1.5"
4618
+ }
4619
+ }
4620
+ }
4621
+ },
4622
+ "hash-base": {
4623
+ "version": "3.0.4",
4624
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
4625
+ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
4626
+ "dev": true,
4627
+ "requires": {
4628
+ "inherits": "^2.0.1",
4629
+ "safe-buffer": "^5.0.1"
4630
+ }
4631
+ },
4632
+ "hash-sum": {
4633
+ "version": "1.0.2",
4634
+ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
4635
+ "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
4636
+ "dev": true
4637
+ },
4638
+ "hash.js": {
4639
+ "version": "1.1.7",
4640
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
4641
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
4642
+ "dev": true,
4643
+ "requires": {
4644
+ "inherits": "^2.0.3",
4645
+ "minimalistic-assert": "^1.0.1"
4646
+ }
4647
+ },
4648
+ "he": {
4649
+ "version": "1.2.0",
4650
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
4651
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
4652
+ "dev": true
4653
+ },
4654
+ "hex-color-regex": {
4655
+ "version": "1.1.0",
4656
+ "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
4657
+ "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
4658
+ "dev": true
4659
+ },
4660
+ "hmac-drbg": {
4661
+ "version": "1.0.1",
4662
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
4663
+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
4664
+ "dev": true,
4665
+ "requires": {
4666
+ "hash.js": "^1.0.3",
4667
+ "minimalistic-assert": "^1.0.0",
4668
+ "minimalistic-crypto-utils": "^1.0.1"
4669
+ }
4670
+ },
4671
+ "homedir-polyfill": {
4672
+ "version": "1.0.3",
4673
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
4674
+ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
4675
+ "dev": true,
4676
+ "requires": {
4677
+ "parse-passwd": "^1.0.0"
4678
+ }
4679
+ },
4680
+ "hpack.js": {
4681
+ "version": "2.1.6",
4682
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
4683
+ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
4684
+ "dev": true,
4685
+ "requires": {
4686
+ "inherits": "^2.0.1",
4687
+ "obuf": "^1.0.0",
4688
+ "readable-stream": "^2.0.1",
4689
+ "wbuf": "^1.1.0"
4690
+ }
4691
+ },
4692
+ "hsl-regex": {
4693
+ "version": "1.0.0",
4694
+ "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
4695
+ "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=",
4696
+ "dev": true
4697
+ },
4698
+ "hsla-regex": {
4699
+ "version": "1.0.0",
4700
+ "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
4701
+ "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
4702
+ "dev": true
4703
+ },
4704
+ "html-comment-regex": {
4705
+ "version": "1.1.2",
4706
+ "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
4707
+ "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
4708
+ "dev": true
4709
+ },
4710
+ "html-entities": {
4711
+ "version": "1.2.1",
4712
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
4713
+ "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
4714
+ "dev": true
4715
+ },
4716
+ "html-loader": {
4717
+ "version": "0.5.5",
4718
+ "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz",
4719
+ "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==",
4720
+ "dev": true,
4721
+ "requires": {
4722
+ "es6-templates": "^0.2.3",
4723
+ "fastparse": "^1.1.1",
4724
+ "html-minifier": "^3.5.8",
4725
+ "loader-utils": "^1.1.0",
4726
+ "object-assign": "^4.1.1"
4727
+ }
4728
+ },
4729
+ "html-minifier": {
4730
+ "version": "3.5.21",
4731
+ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz",
4732
+ "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==",
4733
+ "dev": true,
4734
+ "requires": {
4735
+ "camel-case": "3.0.x",
4736
+ "clean-css": "4.2.x",
4737
+ "commander": "2.17.x",
4738
+ "he": "1.2.x",
4739
+ "param-case": "2.1.x",
4740
+ "relateurl": "0.2.x",
4741
+ "uglify-js": "3.4.x"
4742
+ }
4743
+ },
4744
+ "http-deceiver": {
4745
+ "version": "1.2.7",
4746
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
4747
+ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
4748
+ "dev": true
4749
+ },
4750
+ "http-errors": {
4751
+ "version": "1.7.2",
4752
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
4753
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
4754
+ "dev": true,
4755
+ "requires": {
4756
+ "depd": "~1.1.2",
4757
+ "inherits": "2.0.3",
4758
+ "setprototypeof": "1.1.1",
4759
+ "statuses": ">= 1.5.0 < 2",
4760
+ "toidentifier": "1.0.0"
4761
+ },
4762
+ "dependencies": {
4763
+ "inherits": {
4764
+ "version": "2.0.3",
4765
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
4766
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
4767
+ "dev": true
4768
+ }
4769
+ }
4770
+ },
4771
+ "http-parser-js": {
4772
+ "version": "0.4.10",
4773
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz",
4774
+ "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=",
4775
+ "dev": true
4776
+ },
4777
+ "http-proxy": {
4778
+ "version": "1.17.0",
4779
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
4780
+ "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
4781
+ "dev": true,
4782
+ "requires": {
4783
+ "eventemitter3": "^3.0.0",
4784
+ "follow-redirects": "^1.0.0",
4785
+ "requires-port": "^1.0.0"
4786
+ }
4787
+ },
4788
+ "http-proxy-middleware": {
4789
+ "version": "0.19.1",
4790
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
4791
+ "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
4792
+ "dev": true,
4793
+ "requires": {
4794
+ "http-proxy": "^1.17.0",
4795
+ "is-glob": "^4.0.0",
4796
+ "lodash": "^4.17.11",
4797
+ "micromatch": "^3.1.10"
4798
+ }
4799
+ },
4800
+ "https-browserify": {
4801
+ "version": "1.0.0",
4802
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
4803
+ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
4804
+ "dev": true
4805
+ },
4806
+ "iconv-lite": {
4807
+ "version": "0.4.24",
4808
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
4809
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
4810
+ "dev": true,
4811
+ "requires": {
4812
+ "safer-buffer": ">= 2.1.2 < 3"
4813
+ }
4814
+ },
4815
+ "icss-replace-symbols": {
4816
+ "version": "1.1.0",
4817
+ "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
4818
+ "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
4819
+ "dev": true
4820
+ },
4821
+ "icss-utils": {
4822
+ "version": "2.1.0",
4823
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz",
4824
+ "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=",
4825
+ "dev": true,
4826
+ "requires": {
4827
+ "postcss": "^6.0.1"
4828
+ },
4829
+ "dependencies": {
4830
+ "postcss": {
4831
+ "version": "6.0.23",
4832
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
4833
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
4834
+ "dev": true,
4835
+ "requires": {
4836
+ "chalk": "^2.4.1",
4837
+ "source-map": "^0.6.1",
4838
+ "supports-color": "^5.4.0"
4839
+ }
4840
+ },
4841
+ "source-map": {
4842
+ "version": "0.6.1",
4843
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
4844
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
4845
+ "dev": true
4846
+ }
4847
+ }
4848
+ },
4849
+ "ieee754": {
4850
+ "version": "1.1.13",
4851
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
4852
+ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
4853
+ "dev": true
4854
+ },
4855
+ "iferr": {
4856
+ "version": "0.1.5",
4857
+ "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
4858
+ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
4859
+ "dev": true
4860
+ },
4861
+ "ignore": {
4862
+ "version": "3.3.10",
4863
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
4864
+ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
4865
+ "dev": true
4866
+ },
4867
+ "imagemin": {
4868
+ "version": "6.1.0",
4869
+ "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-6.1.0.tgz",
4870
+ "integrity": "sha512-8ryJBL1CN5uSHpiBMX0rJw79C9F9aJqMnjGnrd/1CafegpNuA81RBAAru/jQQEOWlOJJlpRnlcVFF6wq+Ist0A==",
4871
+ "dev": true,
4872
+ "requires": {
4873
+ "file-type": "^10.7.0",
4874
+ "globby": "^8.0.1",
4875
+ "make-dir": "^1.0.0",
4876
+ "p-pipe": "^1.1.0",
4877
+ "pify": "^4.0.1",
4878
+ "replace-ext": "^1.0.0"
4879
+ },
4880
+ "dependencies": {
4881
+ "make-dir": {
4882
+ "version": "1.3.0",
4883
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
4884
+ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
4885
+ "dev": true,
4886
+ "requires": {
4887
+ "pify": "^3.0.0"
4888
+ },
4889
+ "dependencies": {
4890
+ "pify": {
4891
+ "version": "3.0.0",
4892
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
4893
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
4894
+ "dev": true
4895
+ }
4896
+ }
4897
+ }
4898
+ }
4899
+ },
4900
+ "img-loader": {
4901
+ "version": "3.0.1",
4902
+ "resolved": "https://registry.npmjs.org/img-loader/-/img-loader-3.0.1.tgz",
4903
+ "integrity": "sha512-0jDJqexgzOuq3zlXwFTBKJlMcaP1uXyl5t4Qu6b1IgXb3IwBDjPfVylBC8vHFIIESDw/S+5QkBbtBrt4T8wESA==",
4904
+ "dev": true,
4905
+ "requires": {
4906
+ "loader-utils": "^1.1.0"
4907
+ }
4908
+ },
4909
+ "import-cwd": {
4910
+ "version": "2.1.0",
4911
+ "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
4912
+ "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
4913
+ "dev": true,
4914
+ "requires": {
4915
+ "import-from": "^2.1.0"
4916
+ }
4917
+ },
4918
+ "import-fresh": {
4919
+ "version": "2.0.0",
4920
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
4921
+ "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
4922
+ "dev": true,
4923
+ "requires": {
4924
+ "caller-path": "^2.0.0",
4925
+ "resolve-from": "^3.0.0"
4926
+ }
4927
+ },
4928
+ "import-from": {
4929
+ "version": "2.1.0",
4930
+ "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
4931
+ "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
4932
+ "dev": true,
4933
+ "requires": {
4934
+ "resolve-from": "^3.0.0"
4935
+ }
4936
+ },
4937
+ "import-local": {
4938
+ "version": "2.0.0",
4939
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
4940
+ "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
4941
+ "dev": true,
4942
+ "requires": {
4943
+ "pkg-dir": "^3.0.0",
4944
+ "resolve-cwd": "^2.0.0"
4945
+ }
4946
+ },
4947
+ "imurmurhash": {
4948
+ "version": "0.1.4",
4949
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
4950
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
4951
+ "dev": true
4952
+ },
4953
+ "indexes-of": {
4954
+ "version": "1.0.1",
4955
+ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
4956
+ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
4957
+ "dev": true
4958
+ },
4959
+ "inflight": {
4960
+ "version": "1.0.6",
4961
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
4962
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
4963
+ "dev": true,
4964
+ "requires": {
4965
+ "once": "^1.3.0",
4966
+ "wrappy": "1"
4967
+ }
4968
+ },
4969
+ "inherits": {
4970
+ "version": "2.0.4",
4971
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
4972
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
4973
+ "dev": true
4974
+ },
4975
+ "ini": {
4976
+ "version": "1.3.5",
4977
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
4978
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
4979
+ "dev": true
4980
+ },
4981
+ "internal-ip": {
4982
+ "version": "4.3.0",
4983
+ "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
4984
+ "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
4985
+ "dev": true,
4986
+ "requires": {
4987
+ "default-gateway": "^4.2.0",
4988
+ "ipaddr.js": "^1.9.0"
4989
+ }
4990
+ },
4991
+ "interpret": {
4992
+ "version": "1.2.0",
4993
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
4994
+ "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
4995
+ "dev": true
4996
+ },
4997
+ "invariant": {
4998
+ "version": "2.2.4",
4999
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
5000
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
5001
+ "dev": true,
5002
+ "requires": {
5003
+ "loose-envify": "^1.0.0"
5004
+ }
5005
+ },
5006
+ "invert-kv": {
5007
+ "version": "2.0.0",
5008
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
5009
+ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
5010
+ "dev": true
5011
+ },
5012
+ "ip": {
5013
+ "version": "1.1.5",
5014
+ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
5015
+ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
5016
+ "dev": true
5017
+ },
5018
+ "ip-regex": {
5019
+ "version": "2.1.0",
5020
+ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
5021
+ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
5022
+ "dev": true
5023
+ },
5024
+ "ipaddr.js": {
5025
+ "version": "1.9.0",
5026
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
5027
+ "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==",
5028
+ "dev": true
5029
+ },
5030
+ "is-absolute-url": {
5031
+ "version": "2.1.0",
5032
+ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
5033
+ "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
5034
+ "dev": true
5035
+ },
5036
+ "is-accessor-descriptor": {
5037
+ "version": "0.1.6",
5038
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
5039
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
5040
+ "dev": true,
5041
+ "requires": {
5042
+ "kind-of": "^3.0.2"
5043
+ },
5044
+ "dependencies": {
5045
+ "kind-of": {
5046
+ "version": "3.2.2",
5047
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
5048
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
5049
+ "dev": true,
5050
+ "requires": {
5051
+ "is-buffer": "^1.1.5"
5052
+ }
5053
+ }
5054
+ }
5055
+ },
5056
+ "is-arrayish": {
5057
+ "version": "0.2.1",
5058
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
5059
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
5060
+ "dev": true
5061
+ },
5062
+ "is-binary-path": {
5063
+ "version": "1.0.1",
5064
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
5065
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
5066
+ "dev": true,
5067
+ "requires": {
5068
+ "binary-extensions": "^1.0.0"
5069
+ }
5070
+ },
5071
+ "is-buffer": {
5072
+ "version": "1.1.6",
5073
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
5074
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
5075
+ "dev": true
5076
+ },
5077
+ "is-callable": {
5078
+ "version": "1.1.4",
5079
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
5080
+ "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
5081
+ "dev": true
5082
+ },
5083
+ "is-color-stop": {
5084
+ "version": "1.1.0",
5085
+ "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
5086
+ "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
5087
+ "dev": true,
5088
+ "requires": {
5089
+ "css-color-names": "^0.0.4",
5090
+ "hex-color-regex": "^1.1.0",
5091
+ "hsl-regex": "^1.0.0",
5092
+ "hsla-regex": "^1.0.0",
5093
+ "rgb-regex": "^1.0.1",
5094
+ "rgba-regex": "^1.0.0"
5095
+ }
5096
+ },
5097
+ "is-data-descriptor": {
5098
+ "version": "0.1.4",
5099
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
5100
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
5101
+ "dev": true,
5102
+ "requires": {
5103
+ "kind-of": "^3.0.2"
5104
+ },
5105
+ "dependencies": {
5106
+ "kind-of": {
5107
+ "version": "3.2.2",
5108
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
5109
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
5110
+ "dev": true,
5111
+ "requires": {
5112
+ "is-buffer": "^1.1.5"
5113
+ }
5114
+ }
5115
+ }
5116
+ },
5117
+ "is-date-object": {
5118
+ "version": "1.0.1",
5119
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
5120
+ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
5121
+ "dev": true
5122
+ },
5123
+ "is-descriptor": {
5124
+ "version": "0.1.6",
5125
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
5126
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
5127
+ "dev": true,
5128
+ "requires": {
5129
+ "is-accessor-descriptor": "^0.1.6",
5130
+ "is-data-descriptor": "^0.1.4",
5131
+ "kind-of": "^5.0.0"
5132
+ },
5133
+ "dependencies": {
5134
+ "kind-of": {
5135
+ "version": "5.1.0",
5136
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
5137
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
5138
+ "dev": true
5139
+ }
5140
+ }
5141
+ },
5142
+ "is-directory": {
5143
+ "version": "0.3.1",
5144
+ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
5145
+ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
5146
+ "dev": true
5147
+ },
5148
+ "is-extendable": {
5149
+ "version": "1.0.1",
5150
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
5151
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
5152
+ "dev": true,
5153
+ "requires": {
5154
+ "is-plain-object": "^2.0.4"
5155
+ }
5156
+ },
5157
+ "is-extglob": {
5158
+ "version": "2.1.1",
5159
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
5160
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
5161
+ "dev": true
5162
+ },
5163
+ "is-fullwidth-code-point": {
5164
+ "version": "2.0.0",
5165
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
5166
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
5167
+ "dev": true
5168
+ },
5169
+ "is-glob": {
5170
+ "version": "4.0.1",
5171
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
5172
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
5173
+ "dev": true,
5174
+ "requires": {
5175
+ "is-extglob": "^2.1.1"
5176
+ }
5177
+ },
5178
+ "is-number": {
5179
+ "version": "3.0.0",
5180
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
5181
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
5182
+ "dev": true,
5183
+ "requires": {
5184
+ "kind-of": "^3.0.2"
5185
+ },
5186
+ "dependencies": {
5187
+ "kind-of": {
5188
+ "version": "3.2.2",
5189
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
5190
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
5191
+ "dev": true,
5192
+ "requires": {
5193
+ "is-buffer": "^1.1.5"
5194
+ }
5195
+ }
5196
+ }
5197
+ },
5198
+ "is-obj": {
5199
+ "version": "1.0.1",
5200
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
5201
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
5202
+ "dev": true
5203
+ },
5204
+ "is-path-cwd": {
5205
+ "version": "2.2.0",
5206
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
5207
+ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
5208
+ "dev": true
5209
+ },
5210
+ "is-path-in-cwd": {
5211
+ "version": "2.1.0",
5212
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
5213
+ "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
5214
+ "dev": true,
5215
+ "requires": {
5216
+ "is-path-inside": "^2.1.0"
5217
+ }
5218
+ },
5219
+ "is-path-inside": {
5220
+ "version": "2.1.0",
5221
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
5222
+ "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
5223
+ "dev": true,
5224
+ "requires": {
5225
+ "path-is-inside": "^1.0.2"
5226
+ }
5227
+ },
5228
+ "is-plain-object": {
5229
+ "version": "2.0.4",
5230
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
5231
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
5232
+ "dev": true,
5233
+ "requires": {
5234
+ "isobject": "^3.0.1"
5235
+ }
5236
+ },
5237
+ "is-regex": {
5238
+ "version": "1.0.4",
5239
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
5240
+ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
5241
+ "dev": true,
5242
+ "requires": {
5243
+ "has": "^1.0.1"
5244
+ }
5245
+ },
5246
+ "is-resolvable": {
5247
+ "version": "1.1.0",
5248
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
5249
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
5250
+ "dev": true
5251
+ },
5252
+ "is-stream": {
5253
+ "version": "1.1.0",
5254
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
5255
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
5256
+ "dev": true
5257
+ },
5258
+ "is-svg": {
5259
+ "version": "3.0.0",
5260
+ "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz",
5261
+ "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==",
5262
+ "dev": true,
5263
+ "requires": {
5264
+ "html-comment-regex": "^1.1.0"
5265
+ }
5266
+ },
5267
+ "is-symbol": {
5268
+ "version": "1.0.2",
5269
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
5270
+ "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
5271
+ "dev": true,
5272
+ "requires": {
5273
+ "has-symbols": "^1.0.0"
5274
+ }
5275
+ },
5276
+ "is-windows": {
5277
+ "version": "1.0.2",
5278
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
5279
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
5280
+ "dev": true
5281
+ },
5282
+ "is-wsl": {
5283
+ "version": "1.1.0",
5284
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
5285
+ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
5286
+ "dev": true
5287
+ },
5288
+ "isarray": {
5289
+ "version": "1.0.0",
5290
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
5291
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
5292
+ "dev": true
5293
+ },
5294
+ "isexe": {
5295
+ "version": "2.0.0",
5296
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
5297
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
5298
+ "dev": true
5299
+ },
5300
+ "isobject": {
5301
+ "version": "3.0.1",
5302
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
5303
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
5304
+ "dev": true
5305
+ },
5306
+ "js-levenshtein": {
5307
+ "version": "1.1.6",
5308
+ "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
5309
+ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
5310
+ "dev": true
5311
+ },
5312
+ "js-tokens": {
5313
+ "version": "4.0.0",
5314
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
5315
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
5316
+ "dev": true
5317
+ },
5318
+ "js-yaml": {
5319
+ "version": "3.13.1",
5320
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
5321
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
5322
+ "dev": true,
5323
+ "requires": {
5324
+ "argparse": "^1.0.7",
5325
+ "esprima": "^4.0.0"
5326
+ },
5327
+ "dependencies": {
5328
+ "esprima": {
5329
+ "version": "4.0.1",
5330
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
5331
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
5332
+ "dev": true
5333
+ }
5334
+ }
5335
+ },
5336
+ "jsesc": {
5337
+ "version": "2.5.2",
5338
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
5339
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
5340
+ "dev": true
5341
+ },
5342
+ "json-parse-better-errors": {
5343
+ "version": "1.0.2",
5344
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
5345
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
5346
+ "dev": true
5347
+ },
5348
+ "json-schema-traverse": {
5349
+ "version": "0.4.1",
5350
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
5351
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
5352
+ "dev": true
5353
+ },
5354
+ "json3": {
5355
+ "version": "3.3.3",
5356
+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
5357
+ "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==",
5358
+ "dev": true
5359
+ },
5360
+ "json5": {
5361
+ "version": "2.1.0",
5362
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz",
5363
+ "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==",
5364
+ "dev": true,
5365
+ "requires": {
5366
+ "minimist": "^1.2.0"
5367
+ }
5368
+ },
5369
+ "jsonfile": {
5370
+ "version": "4.0.0",
5371
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
5372
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
5373
+ "dev": true,
5374
+ "requires": {
5375
+ "graceful-fs": "^4.1.6"
5376
+ }
5377
+ },
5378
+ "killable": {
5379
+ "version": "1.0.1",
5380
+ "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
5381
+ "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
5382
+ "dev": true
5383
+ },
5384
+ "kind-of": {
5385
+ "version": "6.0.2",
5386
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
5387
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
5388
+ "dev": true
5389
+ },
5390
+ "laravel-mix": {
5391
+ "version": "4.1.2",
5392
+ "resolved": "https://registry.npmjs.org/laravel-mix/-/laravel-mix-4.1.2.tgz",
5393
+ "integrity": "sha512-nA+JME+59hWI5u+r3VfPfmpUj8CxlNmNsvslBOUtUwRc1K2Wq55uAPUtTLgAp7n5JngF3O7qFN3LcTCVO/SpZQ==",
5394
+ "dev": true,
5395
+ "requires": {
5396
+ "@babel/core": "^7.2.0",
5397
+ "@babel/plugin-proposal-object-rest-spread": "^7.2.0",
5398
+ "@babel/plugin-syntax-dynamic-import": "^7.2.0",
5399
+ "@babel/plugin-transform-runtime": "^7.2.0",
5400
+ "@babel/preset-env": "^7.2.0",
5401
+ "@babel/runtime": "^7.2.0",
5402
+ "autoprefixer": "^9.4.2",
5403
+ "babel-loader": "^8.0.4",
5404
+ "babel-merge": "^2.0.1",
5405
+ "chokidar": "^2.0.3",
5406
+ "clean-css": "^4.1.3",
5407
+ "concatenate": "0.0.2",
5408
+ "css-loader": "^1.0.1",
5409
+ "dotenv": "^6.2.0",
5410
+ "dotenv-expand": "^4.2.0",
5411
+ "extract-text-webpack-plugin": "v4.0.0-beta.0",
5412
+ "file-loader": "^2.0.0",
5413
+ "friendly-errors-webpack-plugin": "^1.6.1",
5414
+ "fs-extra": "^7.0.1",
5415
+ "glob": "^7.1.2",
5416
+ "html-loader": "^0.5.5",
5417
+ "imagemin": "^6.0.0",
5418
+ "img-loader": "^3.0.0",
5419
+ "lodash": "^4.17.5",
5420
+ "md5": "^2.2.1",
5421
+ "optimize-css-assets-webpack-plugin": "^5.0.1",
5422
+ "postcss-loader": "^3.0.0",
5423
+ "style-loader": "^0.23.1",
5424
+ "terser": "^3.11.0",
5425
+ "terser-webpack-plugin": "^1.2.2",
5426
+ "vue-loader": "^15.4.2",
5427
+ "webpack": "^4.27.1",
5428
+ "webpack-cli": "^3.1.2",
5429
+ "webpack-dev-server": "^3.1.14",
5430
+ "webpack-merge": "^4.1.0",
5431
+ "webpack-notifier": "^1.5.1",
5432
+ "yargs": "^12.0.5"
5433
+ }
5434
+ },
5435
+ "last-call-webpack-plugin": {
5436
+ "version": "3.0.0",
5437
+ "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz",
5438
+ "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==",
5439
+ "dev": true,
5440
+ "requires": {
5441
+ "lodash": "^4.17.5",
5442
+ "webpack-sources": "^1.1.0"
5443
+ }
5444
+ },
5445
+ "lcid": {
5446
+ "version": "2.0.0",
5447
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
5448
+ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
5449
+ "dev": true,
5450
+ "requires": {
5451
+ "invert-kv": "^2.0.0"
5452
+ }
5453
+ },
5454
+ "loader-runner": {
5455
+ "version": "2.4.0",
5456
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
5457
+ "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
5458
+ "dev": true
5459
+ },
5460
+ "loader-utils": {
5461
+ "version": "1.2.3",
5462
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
5463
+ "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
5464
+ "dev": true,
5465
+ "requires": {
5466
+ "big.js": "^5.2.2",
5467
+ "emojis-list": "^2.0.0",
5468
+ "json5": "^1.0.1"
5469
+ },
5470
+ "dependencies": {
5471
+ "json5": {
5472
+ "version": "1.0.1",
5473
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
5474
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
5475
+ "dev": true,
5476
+ "requires": {
5477
+ "minimist": "^1.2.0"
5478
+ }
5479
+ }
5480
+ }
5481
+ },
5482
+ "locate-path": {
5483
+ "version": "3.0.0",
5484
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
5485
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
5486
+ "dev": true,
5487
+ "requires": {
5488
+ "p-locate": "^3.0.0",
5489
+ "path-exists": "^3.0.0"
5490
+ }
5491
+ },
5492
+ "lodash": {
5493
+ "version": "4.17.14",
5494
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz",
5495
+ "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==",
5496
+ "dev": true
5497
+ },
5498
+ "lodash._reinterpolate": {
5499
+ "version": "3.0.0",
5500
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
5501
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
5502
+ "dev": true
5503
+ },
5504
+ "lodash.memoize": {
5505
+ "version": "4.1.2",
5506
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
5507
+ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
5508
+ "dev": true
5509
+ },
5510
+ "lodash.tail": {
5511
+ "version": "4.1.1",
5512
+ "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz",
5513
+ "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=",
5514
+ "dev": true
5515
+ },
5516
+ "lodash.template": {
5517
+ "version": "4.5.0",
5518
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
5519
+ "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
5520
+ "dev": true,
5521
+ "requires": {
5522
+ "lodash._reinterpolate": "^3.0.0",
5523
+ "lodash.templatesettings": "^4.0.0"
5524
+ }
5525
+ },
5526
+ "lodash.templatesettings": {
5527
+ "version": "4.2.0",
5528
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
5529
+ "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
5530
+ "dev": true,
5531
+ "requires": {
5532
+ "lodash._reinterpolate": "^3.0.0"
5533
+ }
5534
+ },
5535
+ "lodash.uniq": {
5536
+ "version": "4.5.0",
5537
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
5538
+ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
5539
+ "dev": true
5540
+ },
5541
+ "loglevel": {
5542
+ "version": "1.6.3",
5543
+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.3.tgz",
5544
+ "integrity": "sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==",
5545
+ "dev": true
5546
+ },
5547
+ "loose-envify": {
5548
+ "version": "1.4.0",
5549
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
5550
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
5551
+ "dev": true,
5552
+ "requires": {
5553
+ "js-tokens": "^3.0.0 || ^4.0.0"
5554
+ }
5555
+ },
5556
+ "lower-case": {
5557
+ "version": "1.1.4",
5558
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
5559
+ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
5560
+ "dev": true
5561
+ },
5562
+ "lru-cache": {
5563
+ "version": "5.1.1",
5564
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
5565
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
5566
+ "dev": true,
5567
+ "requires": {
5568
+ "yallist": "^3.0.2"
5569
+ }
5570
+ },
5571
+ "make-dir": {
5572
+ "version": "2.1.0",
5573
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
5574
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
5575
+ "dev": true,
5576
+ "requires": {
5577
+ "pify": "^4.0.1",
5578
+ "semver": "^5.6.0"
5579
+ }
5580
+ },
5581
+ "mamacro": {
5582
+ "version": "0.0.3",
5583
+ "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz",
5584
+ "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==",
5585
+ "dev": true
5586
+ },
5587
+ "map-age-cleaner": {
5588
+ "version": "0.1.3",
5589
+ "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
5590
+ "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
5591
+ "dev": true,
5592
+ "requires": {
5593
+ "p-defer": "^1.0.0"
5594
+ }
5595
+ },
5596
+ "map-cache": {
5597
+ "version": "0.2.2",
5598
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
5599
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
5600
+ "dev": true
5601
+ },
5602
+ "map-visit": {
5603
+ "version": "1.0.0",
5604
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
5605
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
5606
+ "dev": true,
5607
+ "requires": {
5608
+ "object-visit": "^1.0.0"
5609
+ }
5610
+ },
5611
+ "md5": {
5612
+ "version": "2.2.1",
5613
+ "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
5614
+ "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
5615
+ "dev": true,
5616
+ "requires": {
5617
+ "charenc": "~0.0.1",
5618
+ "crypt": "~0.0.1",
5619
+ "is-buffer": "~1.1.1"
5620
+ }
5621
+ },
5622
+ "md5.js": {
5623
+ "version": "1.3.5",
5624
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
5625
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
5626
+ "dev": true,
5627
+ "requires": {
5628
+ "hash-base": "^3.0.0",
5629
+ "inherits": "^2.0.1",
5630
+ "safe-buffer": "^5.1.2"
5631
+ }
5632
+ },
5633
+ "mdn-data": {
5634
+ "version": "2.0.4",
5635
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
5636
+ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
5637
+ "dev": true
5638
+ },
5639
+ "media-typer": {
5640
+ "version": "0.3.0",
5641
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
5642
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
5643
+ "dev": true
5644
+ },
5645
+ "mem": {
5646
+ "version": "4.3.0",
5647
+ "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
5648
+ "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
5649
+ "dev": true,
5650
+ "requires": {
5651
+ "map-age-cleaner": "^0.1.1",
5652
+ "mimic-fn": "^2.0.0",
5653
+ "p-is-promise": "^2.0.0"
5654
+ }
5655
+ },
5656
+ "memory-fs": {
5657
+ "version": "0.4.1",
5658
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
5659
+ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
5660
+ "dev": true,
5661
+ "requires": {
5662
+ "errno": "^0.1.3",
5663
+ "readable-stream": "^2.0.1"
5664
+ }
5665
+ },
5666
+ "merge-descriptors": {
5667
+ "version": "1.0.1",
5668
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
5669
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
5670
+ "dev": true
5671
+ },
5672
+ "merge-source-map": {
5673
+ "version": "1.1.0",
5674
+ "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
5675
+ "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
5676
+ "dev": true,
5677
+ "requires": {
5678
+ "source-map": "^0.6.1"
5679
+ },
5680
+ "dependencies": {
5681
+ "source-map": {
5682
+ "version": "0.6.1",
5683
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
5684
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
5685
+ "dev": true
5686
+ }
5687
+ }
5688
+ },
5689
+ "merge2": {
5690
+ "version": "1.2.3",
5691
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz",
5692
+ "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==",
5693
+ "dev": true
5694
+ },
5695
+ "methods": {
5696
+ "version": "1.1.2",
5697
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
5698
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
5699
+ "dev": true
5700
+ },
5701
+ "micromatch": {
5702
+ "version": "3.1.10",
5703
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
5704
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
5705
+ "dev": true,
5706
+ "requires": {
5707
+ "arr-diff": "^4.0.0",
5708
+ "array-unique": "^0.3.2",
5709
+ "braces": "^2.3.1",
5710
+ "define-property": "^2.0.2",
5711
+ "extend-shallow": "^3.0.2",
5712
+ "extglob": "^2.0.4",
5713
+ "fragment-cache": "^0.2.1",
5714
+ "kind-of": "^6.0.2",
5715
+ "nanomatch": "^1.2.9",
5716
+ "object.pick": "^1.3.0",
5717
+ "regex-not": "^1.0.0",
5718
+ "snapdragon": "^0.8.1",
5719
+ "to-regex": "^3.0.2"
5720
+ }
5721
+ },
5722
+ "miller-rabin": {
5723
+ "version": "4.0.1",
5724
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
5725
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
5726
+ "dev": true,
5727
+ "requires": {
5728
+ "bn.js": "^4.0.0",
5729
+ "brorand": "^1.0.1"
5730
+ }
5731
+ },
5732
+ "mime": {
5733
+ "version": "1.6.0",
5734
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
5735
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
5736
+ "dev": true
5737
+ },
5738
+ "mime-db": {
5739
+ "version": "1.40.0",
5740
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
5741
+ "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
5742
+ "dev": true
5743
+ },
5744
+ "mime-types": {
5745
+ "version": "2.1.24",
5746
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
5747
+ "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
5748
+ "dev": true,
5749
+ "requires": {
5750
+ "mime-db": "1.40.0"
5751
+ }
5752
+ },
5753
+ "mimic-fn": {
5754
+ "version": "2.1.0",
5755
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
5756
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
5757
+ "dev": true
5758
+ },
5759
+ "minimalistic-assert": {
5760
+ "version": "1.0.1",
5761
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
5762
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
5763
+ "dev": true
5764
+ },
5765
+ "minimalistic-crypto-utils": {
5766
+ "version": "1.0.1",
5767
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
5768
+ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
5769
+ "dev": true
5770
+ },
5771
+ "minimatch": {
5772
+ "version": "3.0.4",
5773
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
5774
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
5775
+ "dev": true,
5776
+ "requires": {
5777
+ "brace-expansion": "^1.1.7"
5778
+ }
5779
+ },
5780
+ "minimist": {
5781
+ "version": "1.2.0",
5782
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
5783
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
5784
+ "dev": true
5785
+ },
5786
+ "mississippi": {
5787
+ "version": "3.0.0",
5788
+ "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
5789
+ "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
5790
+ "dev": true,
5791
+ "requires": {
5792
+ "concat-stream": "^1.5.0",
5793
+ "duplexify": "^3.4.2",
5794
+ "end-of-stream": "^1.1.0",
5795
+ "flush-write-stream": "^1.0.0",
5796
+ "from2": "^2.1.0",
5797
+ "parallel-transform": "^1.1.0",
5798
+ "pump": "^3.0.0",
5799
+ "pumpify": "^1.3.3",
5800
+ "stream-each": "^1.1.0",
5801
+ "through2": "^2.0.0"
5802
+ }
5803
+ },
5804
+ "mixin-deep": {
5805
+ "version": "1.3.2",
5806
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
5807
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
5808
+ "dev": true,
5809
+ "requires": {
5810
+ "for-in": "^1.0.2",
5811
+ "is-extendable": "^1.0.1"
5812
+ }
5813
+ },
5814
+ "mixin-object": {
5815
+ "version": "2.0.1",
5816
+ "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
5817
+ "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=",
5818
+ "dev": true,
5819
+ "requires": {
5820
+ "for-in": "^0.1.3",
5821
+ "is-extendable": "^0.1.1"
5822
+ },
5823
+ "dependencies": {
5824
+ "for-in": {
5825
+ "version": "0.1.8",
5826
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
5827
+ "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=",
5828
+ "dev": true
5829
+ },
5830
+ "is-extendable": {
5831
+ "version": "0.1.1",
5832
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
5833
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
5834
+ "dev": true
5835
+ }
5836
+ }
5837
+ },
5838
+ "mkdirp": {
5839
+ "version": "0.5.1",
5840
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
5841
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
5842
+ "dev": true,
5843
+ "requires": {
5844
+ "minimist": "0.0.8"
5845
+ },
5846
+ "dependencies": {
5847
+ "minimist": {
5848
+ "version": "0.0.8",
5849
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
5850
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
5851
+ "dev": true
5852
+ }
5853
+ }
5854
+ },
5855
+ "move-concurrently": {
5856
+ "version": "1.0.1",
5857
+ "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
5858
+ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
5859
+ "dev": true,
5860
+ "requires": {
5861
+ "aproba": "^1.1.1",
5862
+ "copy-concurrently": "^1.0.0",
5863
+ "fs-write-stream-atomic": "^1.0.8",
5864
+ "mkdirp": "^0.5.1",
5865
+ "rimraf": "^2.5.4",
5866
+ "run-queue": "^1.0.3"
5867
+ },
5868
+ "dependencies": {
5869
+ "rimraf": {
5870
+ "version": "2.7.1",
5871
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
5872
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
5873
+ "dev": true,
5874
+ "requires": {
5875
+ "glob": "^7.1.3"
5876
+ }
5877
+ }
5878
+ }
5879
+ },
5880
+ "ms": {
5881
+ "version": "2.1.2",
5882
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
5883
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
5884
+ "dev": true
5885
+ },
5886
+ "multicast-dns": {
5887
+ "version": "6.2.3",
5888
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
5889
+ "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
5890
+ "dev": true,
5891
+ "requires": {
5892
+ "dns-packet": "^1.3.1",
5893
+ "thunky": "^1.0.2"
5894
+ }
5895
+ },
5896
+ "multicast-dns-service-types": {
5897
+ "version": "1.1.0",
5898
+ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
5899
+ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
5900
+ "dev": true
5901
+ },
5902
+ "nan": {
5903
+ "version": "2.14.0",
5904
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
5905
+ "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
5906
+ "dev": true,
5907
+ "optional": true
5908
+ },
5909
+ "nanomatch": {
5910
+ "version": "1.2.13",
5911
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
5912
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
5913
+ "dev": true,
5914
+ "requires": {
5915
+ "arr-diff": "^4.0.0",
5916
+ "array-unique": "^0.3.2",
5917
+ "define-property": "^2.0.2",
5918
+ "extend-shallow": "^3.0.2",
5919
+ "fragment-cache": "^0.2.1",
5920
+ "is-windows": "^1.0.2",
5921
+ "kind-of": "^6.0.2",
5922
+ "object.pick": "^1.3.0",
5923
+ "regex-not": "^1.0.0",
5924
+ "snapdragon": "^0.8.1",
5925
+ "to-regex": "^3.0.1"
5926
+ }
5927
+ },
5928
+ "negotiator": {
5929
+ "version": "0.6.2",
5930
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
5931
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
5932
+ "dev": true
5933
+ },
5934
+ "neo-async": {
5935
+ "version": "2.6.1",
5936
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
5937
+ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
5938
+ "dev": true
5939
+ },
5940
+ "nice-try": {
5941
+ "version": "1.0.5",
5942
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
5943
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
5944
+ "dev": true
5945
+ },
5946
+ "no-case": {
5947
+ "version": "2.3.2",
5948
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
5949
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
5950
+ "dev": true,
5951
+ "requires": {
5952
+ "lower-case": "^1.1.1"
5953
+ }
5954
+ },
5955
+ "node-forge": {
5956
+ "version": "0.7.5",
5957
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz",
5958
+ "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==",
5959
+ "dev": true
5960
+ },
5961
+ "node-libs-browser": {
5962
+ "version": "2.2.1",
5963
+ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
5964
+ "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
5965
+ "dev": true,
5966
+ "requires": {
5967
+ "assert": "^1.1.1",
5968
+ "browserify-zlib": "^0.2.0",
5969
+ "buffer": "^4.3.0",
5970
+ "console-browserify": "^1.1.0",
5971
+ "constants-browserify": "^1.0.0",
5972
+ "crypto-browserify": "^3.11.0",
5973
+ "domain-browser": "^1.1.1",
5974
+ "events": "^3.0.0",
5975
+ "https-browserify": "^1.0.0",
5976
+ "os-browserify": "^0.3.0",
5977
+ "path-browserify": "0.0.1",
5978
+ "process": "^0.11.10",
5979
+ "punycode": "^1.2.4",
5980
+ "querystring-es3": "^0.2.0",
5981
+ "readable-stream": "^2.3.3",
5982
+ "stream-browserify": "^2.0.1",
5983
+ "stream-http": "^2.7.2",
5984
+ "string_decoder": "^1.0.0",
5985
+ "timers-browserify": "^2.0.4",
5986
+ "tty-browserify": "0.0.0",
5987
+ "url": "^0.11.0",
5988
+ "util": "^0.11.0",
5989
+ "vm-browserify": "^1.0.1"
5990
+ },
5991
+ "dependencies": {
5992
+ "punycode": {
5993
+ "version": "1.4.1",
5994
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
5995
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
5996
+ "dev": true
5997
+ }
5998
+ }
5999
+ },
6000
+ "node-notifier": {
6001
+ "version": "5.4.0",
6002
+ "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz",
6003
+ "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==",
6004
+ "dev": true,
6005
+ "requires": {
6006
+ "growly": "^1.3.0",
6007
+ "is-wsl": "^1.1.0",
6008
+ "semver": "^5.5.0",
6009
+ "shellwords": "^0.1.1",
6010
+ "which": "^1.3.0"
6011
+ }
6012
+ },
6013
+ "node-releases": {
6014
+ "version": "1.1.25",
6015
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.25.tgz",
6016
+ "integrity": "sha512-fI5BXuk83lKEoZDdH3gRhtsNgh05/wZacuXkgbiYkceE7+QIMXOg98n9ZV7mz27B+kFHnqHcUpscZZlGRSmTpQ==",
6017
+ "dev": true,
6018
+ "requires": {
6019
+ "semver": "^5.3.0"
6020
+ }
6021
+ },
6022
+ "node-wp-i18n": {
6023
+ "version": "1.2.3",
6024
+ "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.2.3.tgz",
6025
+ "integrity": "sha512-YMzMcsjXbGYDB9vHyb289CYXAGmXhcNLbeTlOnWgPNkZd9xrovcbRd7cQyKd9BQHOjS7Nw8WCbJ7nvtR7rc0rg==",
6026
+ "dev": true,
6027
+ "requires": {
6028
+ "bluebird": "^3.4.1",
6029
+ "gettext-parser": "^3.1.0",
6030
+ "glob": "^7.0.5",
6031
+ "lodash": "^4.14.2",
6032
+ "minimist": "^1.2.0",
6033
+ "mkdirp": "^0.5.1",
6034
+ "tmp": "^0.0.33"
6035
+ }
6036
+ },
6037
+ "normalize-path": {
6038
+ "version": "3.0.0",
6039
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
6040
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
6041
+ "dev": true
6042
+ },
6043
+ "normalize-range": {
6044
+ "version": "0.1.2",
6045
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
6046
+ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
6047
+ "dev": true
6048
+ },
6049
+ "normalize-url": {
6050
+ "version": "3.3.0",
6051
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
6052
+ "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
6053
+ "dev": true
6054
+ },
6055
+ "npm-run-path": {
6056
+ "version": "2.0.2",
6057
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
6058
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
6059
+ "dev": true,
6060
+ "requires": {
6061
+ "path-key": "^2.0.0"
6062
+ }
6063
+ },
6064
+ "nth-check": {
6065
+ "version": "1.0.2",
6066
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
6067
+ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
6068
+ "dev": true,
6069
+ "requires": {
6070
+ "boolbase": "~1.0.0"
6071
+ }
6072
+ },
6073
+ "num2fraction": {
6074
+ "version": "1.2.2",
6075
+ "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
6076
+ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
6077
+ "dev": true
6078
+ },
6079
+ "number-is-nan": {
6080
+ "version": "1.0.1",
6081
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
6082
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
6083
+ "dev": true
6084
+ },
6085
+ "object-assign": {
6086
+ "version": "4.1.1",
6087
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
6088
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
6089
+ "dev": true
6090
+ },
6091
+ "object-copy": {
6092
+ "version": "0.1.0",
6093
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
6094
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
6095
+ "dev": true,
6096
+ "requires": {
6097
+ "copy-descriptor": "^0.1.0",
6098
+ "define-property": "^0.2.5",
6099
+ "kind-of": "^3.0.3"
6100
+ },
6101
+ "dependencies": {
6102
+ "define-property": {
6103
+ "version": "0.2.5",
6104
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
6105
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
6106
+ "dev": true,
6107
+ "requires": {
6108
+ "is-descriptor": "^0.1.0"
6109
+ }
6110
+ },
6111
+ "kind-of": {
6112
+ "version": "3.2.2",
6113
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
6114
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
6115
+ "dev": true,
6116
+ "requires": {
6117
+ "is-buffer": "^1.1.5"
6118
+ }
6119
+ }
6120
+ }
6121
+ },
6122
+ "object-keys": {
6123
+ "version": "1.1.1",
6124
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
6125
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
6126
+ "dev": true
6127
+ },
6128
+ "object-visit": {
6129
+ "version": "1.0.1",
6130
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
6131
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
6132
+ "dev": true,
6133
+ "requires": {
6134
+ "isobject": "^3.0.0"
6135
+ }
6136
+ },
6137
+ "object.assign": {
6138
+ "version": "4.1.0",
6139
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
6140
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
6141
+ "dev": true,
6142
+ "requires": {
6143
+ "define-properties": "^1.1.2",
6144
+ "function-bind": "^1.1.1",
6145
+ "has-symbols": "^1.0.0",
6146
+ "object-keys": "^1.0.11"
6147
+ }
6148
+ },
6149
+ "object.getownpropertydescriptors": {
6150
+ "version": "2.0.3",
6151
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
6152
+ "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
6153
+ "dev": true,
6154
+ "requires": {
6155
+ "define-properties": "^1.1.2",
6156
+ "es-abstract": "^1.5.1"
6157
+ }
6158
+ },
6159
+ "object.omit": {
6160
+ "version": "3.0.0",
6161
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-3.0.0.tgz",
6162
+ "integrity": "sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==",
6163
+ "dev": true,
6164
+ "requires": {
6165
+ "is-extendable": "^1.0.0"
6166
+ }
6167
+ },
6168
+ "object.pick": {
6169
+ "version": "1.3.0",
6170
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
6171
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
6172
+ "dev": true,
6173
+ "requires": {
6174
+ "isobject": "^3.0.1"
6175
+ }
6176
+ },
6177
+ "object.values": {
6178
+ "version": "1.1.0",
6179
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz",
6180
+ "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==",
6181
+ "dev": true,
6182
+ "requires": {
6183
+ "define-properties": "^1.1.3",
6184
+ "es-abstract": "^1.12.0",
6185
+ "function-bind": "^1.1.1",
6186
+ "has": "^1.0.3"
6187
+ }
6188
+ },
6189
+ "obuf": {
6190
+ "version": "1.1.2",
6191
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
6192
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
6193
+ "dev": true
6194
+ },
6195
+ "on-finished": {
6196
+ "version": "2.3.0",
6197
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
6198
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
6199
+ "dev": true,
6200
+ "requires": {
6201
+ "ee-first": "1.1.1"
6202
+ }
6203
+ },
6204
+ "on-headers": {
6205
+ "version": "1.0.2",
6206
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
6207
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
6208
+ "dev": true
6209
+ },
6210
+ "once": {
6211
+ "version": "1.4.0",
6212
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
6213
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
6214
+ "dev": true,
6215
+ "requires": {
6216
+ "wrappy": "1"
6217
+ }
6218
+ },
6219
+ "opn": {
6220
+ "version": "5.5.0",
6221
+ "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
6222
+ "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
6223
+ "dev": true,
6224
+ "requires": {
6225
+ "is-wsl": "^1.1.0"
6226
+ }
6227
+ },
6228
+ "optimize-css-assets-webpack-plugin": {
6229
+ "version": "5.0.3",
6230
+ "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz",
6231
+ "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==",
6232
+ "dev": true,
6233
+ "requires": {
6234
+ "cssnano": "^4.1.10",
6235
+ "last-call-webpack-plugin": "^3.0.0"
6236
+ }
6237
+ },
6238
+ "original": {
6239
+ "version": "1.0.2",
6240
+ "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
6241
+ "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
6242
+ "dev": true,
6243
+ "requires": {
6244
+ "url-parse": "^1.4.3"
6245
+ }
6246
+ },
6247
+ "os-browserify": {
6248
+ "version": "0.3.0",
6249
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
6250
+ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
6251
+ "dev": true
6252
+ },
6253
+ "os-locale": {
6254
+ "version": "3.1.0",
6255
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
6256
+ "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
6257
+ "dev": true,
6258
+ "requires": {
6259
+ "execa": "^1.0.0",
6260
+ "lcid": "^2.0.0",
6261
+ "mem": "^4.0.0"
6262
+ }
6263
+ },
6264
+ "os-tmpdir": {
6265
+ "version": "1.0.2",
6266
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
6267
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
6268
+ "dev": true
6269
+ },
6270
+ "p-defer": {
6271
+ "version": "1.0.0",
6272
+ "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
6273
+ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
6274
+ "dev": true
6275
+ },
6276
+ "p-finally": {
6277
+ "version": "1.0.0",
6278
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
6279
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
6280
+ "dev": true
6281
+ },
6282
+ "p-is-promise": {
6283
+ "version": "2.1.0",
6284
+ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
6285
+ "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
6286
+ "dev": true
6287
+ },
6288
+ "p-limit": {
6289
+ "version": "2.2.0",
6290
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
6291
+ "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
6292
+ "dev": true,
6293
+ "requires": {
6294
+ "p-try": "^2.0.0"
6295
+ }
6296
+ },
6297
+ "p-locate": {
6298
+ "version": "3.0.0",
6299
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
6300
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
6301
+ "dev": true,
6302
+ "requires": {
6303
+ "p-limit": "^2.0.0"
6304
+ }
6305
+ },
6306
+ "p-map": {
6307
+ "version": "2.1.0",
6308
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
6309
+ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
6310
+ "dev": true
6311
+ },
6312
+ "p-pipe": {
6313
+ "version": "1.2.0",
6314
+ "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz",
6315
+ "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=",
6316
+ "dev": true
6317
+ },
6318
+ "p-retry": {
6319
+ "version": "3.0.1",
6320
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
6321
+ "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
6322
+ "dev": true,
6323
+ "requires": {
6324
+ "retry": "^0.12.0"
6325
+ }
6326
+ },
6327
+ "p-try": {
6328
+ "version": "2.2.0",
6329
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
6330
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
6331
+ "dev": true
6332
+ },
6333
+ "pako": {
6334
+ "version": "1.0.10",
6335
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz",
6336
+ "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==",
6337
+ "dev": true
6338
+ },
6339
+ "parallel-transform": {
6340
+ "version": "1.1.0",
6341
+ "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
6342
+ "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
6343
+ "dev": true,
6344
+ "requires": {
6345
+ "cyclist": "~0.2.2",
6346
+ "inherits": "^2.0.3",
6347
+ "readable-stream": "^2.1.5"
6348
+ }
6349
+ },
6350
+ "param-case": {
6351
+ "version": "2.1.1",
6352
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
6353
+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
6354
+ "dev": true,
6355
+ "requires": {
6356
+ "no-case": "^2.2.0"
6357
+ }
6358
+ },
6359
+ "parse-asn1": {
6360
+ "version": "5.1.4",
6361
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz",
6362
+ "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==",
6363
+ "dev": true,
6364
+ "requires": {
6365
+ "asn1.js": "^4.0.0",
6366
+ "browserify-aes": "^1.0.0",
6367
+ "create-hash": "^1.1.0",
6368
+ "evp_bytestokey": "^1.0.0",
6369
+ "pbkdf2": "^3.0.3",
6370
+ "safe-buffer": "^5.1.1"
6371
+ }
6372
+ },
6373
+ "parse-json": {
6374
+ "version": "4.0.0",
6375
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
6376
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
6377
+ "dev": true,
6378
+ "requires": {
6379
+ "error-ex": "^1.3.1",
6380
+ "json-parse-better-errors": "^1.0.1"
6381
+ }
6382
+ },
6383
+ "parse-passwd": {
6384
+ "version": "1.0.0",
6385
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
6386
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
6387
+ "dev": true
6388
+ },
6389
+ "parseurl": {
6390
+ "version": "1.3.3",
6391
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
6392
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
6393
+ "dev": true
6394
+ },
6395
+ "pascalcase": {
6396
+ "version": "0.1.1",
6397
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
6398
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
6399
+ "dev": true
6400
+ },
6401
+ "path-browserify": {
6402
+ "version": "0.0.1",
6403
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
6404
+ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
6405
+ "dev": true
6406
+ },
6407
+ "path-dirname": {
6408
+ "version": "1.0.2",
6409
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
6410
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
6411
+ "dev": true
6412
+ },
6413
+ "path-exists": {
6414
+ "version": "3.0.0",
6415
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
6416
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
6417
+ "dev": true
6418
+ },
6419
+ "path-is-absolute": {
6420
+ "version": "1.0.1",
6421
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
6422
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
6423
+ "dev": true
6424
+ },
6425
+ "path-is-inside": {
6426
+ "version": "1.0.2",
6427
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
6428
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
6429
+ "dev": true
6430
+ },
6431
+ "path-key": {
6432
+ "version": "2.0.1",
6433
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
6434
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
6435
+ "dev": true
6436
+ },
6437
+ "path-parse": {
6438
+ "version": "1.0.6",
6439
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
6440
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
6441
+ "dev": true
6442
+ },
6443
+ "path-to-regexp": {
6444
+ "version": "0.1.7",
6445
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
6446
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
6447
+ "dev": true
6448
+ },
6449
+ "path-type": {
6450
+ "version": "3.0.0",
6451
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
6452
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
6453
+ "dev": true,
6454
+ "requires": {
6455
+ "pify": "^3.0.0"
6456
+ },
6457
+ "dependencies": {
6458
+ "pify": {
6459
+ "version": "3.0.0",
6460
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
6461
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
6462
+ "dev": true
6463
+ }
6464
+ }
6465
+ },
6466
+ "pbkdf2": {
6467
+ "version": "3.0.17",
6468
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
6469
+ "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
6470
+ "dev": true,
6471
+ "requires": {
6472
+ "create-hash": "^1.1.2",
6473
+ "create-hmac": "^1.1.4",
6474
+ "ripemd160": "^2.0.1",
6475
+ "safe-buffer": "^5.0.1",
6476
+ "sha.js": "^2.4.8"
6477
+ }
6478
+ },
6479
+ "pify": {
6480
+ "version": "4.0.1",
6481
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
6482
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
6483
+ "dev": true
6484
+ },
6485
+ "pinkie": {
6486
+ "version": "2.0.4",
6487
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
6488
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
6489
+ "dev": true
6490
+ },
6491
+ "pinkie-promise": {
6492
+ "version": "2.0.1",
6493
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
6494
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
6495
+ "dev": true,
6496
+ "requires": {
6497
+ "pinkie": "^2.0.0"
6498
+ }
6499
+ },
6500
+ "pkg-dir": {
6501
+ "version": "3.0.0",
6502
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
6503
+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
6504
+ "dev": true,
6505
+ "requires": {
6506
+ "find-up": "^3.0.0"
6507
+ }
6508
+ },
6509
+ "portfinder": {
6510
+ "version": "1.0.21",
6511
+ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz",
6512
+ "integrity": "sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA==",
6513
+ "dev": true,
6514
+ "requires": {
6515
+ "async": "^1.5.2",
6516
+ "debug": "^2.2.0",
6517
+ "mkdirp": "0.5.x"
6518
+ },
6519
+ "dependencies": {
6520
+ "async": {
6521
+ "version": "1.5.2",
6522
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
6523
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
6524
+ "dev": true
6525
+ },
6526
+ "debug": {
6527
+ "version": "2.6.9",
6528
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
6529
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
6530
+ "dev": true,
6531
+ "requires": {
6532
+ "ms": "2.0.0"
6533
+ }
6534
+ },
6535
+ "ms": {
6536
+ "version": "2.0.0",
6537
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
6538
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
6539
+ "dev": true
6540
+ }
6541
+ }
6542
+ },
6543
+ "posix-character-classes": {
6544
+ "version": "0.1.1",
6545
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
6546
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
6547
+ "dev": true
6548
+ },
6549
+ "postcss": {
6550
+ "version": "7.0.17",
6551
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz",
6552
+ "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==",
6553
+ "dev": true,
6554
+ "requires": {
6555
+ "chalk": "^2.4.2",
6556
+ "source-map": "^0.6.1",
6557
+ "supports-color": "^6.1.0"
6558
+ },
6559
+ "dependencies": {
6560
+ "source-map": {
6561
+ "version": "0.6.1",
6562
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
6563
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
6564
+ "dev": true
6565
+ },
6566
+ "supports-color": {
6567
+ "version": "6.1.0",
6568
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
6569
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
6570
+ "dev": true,
6571
+ "requires": {
6572
+ "has-flag": "^3.0.0"
6573
+ }
6574
+ }
6575
+ }
6576
+ },
6577
+ "postcss-attribute-case-insensitive": {
6578
+ "version": "4.0.1",
6579
+ "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz",
6580
+ "integrity": "sha512-L2YKB3vF4PetdTIthQVeT+7YiSzMoNMLLYxPXXppOOP7NoazEAy45sh2LvJ8leCQjfBcfkYQs8TtCcQjeZTp8A==",
6581
+ "dev": true,
6582
+ "requires": {
6583
+ "postcss": "^7.0.2",
6584
+ "postcss-selector-parser": "^5.0.0"
6585
+ }
6586
+ },
6587
+ "postcss-calc": {
6588
+ "version": "7.0.1",
6589
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz",
6590
+ "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==",
6591
+ "dev": true,
6592
+ "requires": {
6593
+ "css-unit-converter": "^1.1.1",
6594
+ "postcss": "^7.0.5",
6595
+ "postcss-selector-parser": "^5.0.0-rc.4",
6596
+ "postcss-value-parser": "^3.3.1"
6597
+ },
6598
+ "dependencies": {
6599
+ "postcss-value-parser": {
6600
+ "version": "3.3.1",
6601
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6602
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6603
+ "dev": true
6604
+ }
6605
+ }
6606
+ },
6607
+ "postcss-color-functional-notation": {
6608
+ "version": "2.0.1",
6609
+ "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz",
6610
+ "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==",
6611
+ "dev": true,
6612
+ "requires": {
6613
+ "postcss": "^7.0.2",
6614
+ "postcss-values-parser": "^2.0.0"
6615
+ }
6616
+ },
6617
+ "postcss-color-gray": {
6618
+ "version": "5.0.0",
6619
+ "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz",
6620
+ "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==",
6621
+ "dev": true,
6622
+ "requires": {
6623
+ "@csstools/convert-colors": "^1.4.0",
6624
+ "postcss": "^7.0.5",
6625
+ "postcss-values-parser": "^2.0.0"
6626
+ }
6627
+ },
6628
+ "postcss-color-hex-alpha": {
6629
+ "version": "5.0.3",
6630
+ "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz",
6631
+ "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==",
6632
+ "dev": true,
6633
+ "requires": {
6634
+ "postcss": "^7.0.14",
6635
+ "postcss-values-parser": "^2.0.1"
6636
+ }
6637
+ },
6638
+ "postcss-color-mod-function": {
6639
+ "version": "3.0.3",
6640
+ "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz",
6641
+ "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==",
6642
+ "dev": true,
6643
+ "requires": {
6644
+ "@csstools/convert-colors": "^1.4.0",
6645
+ "postcss": "^7.0.2",
6646
+ "postcss-values-parser": "^2.0.0"
6647
+ }
6648
+ },
6649
+ "postcss-color-rebeccapurple": {
6650
+ "version": "4.0.1",
6651
+ "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz",
6652
+ "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==",
6653
+ "dev": true,
6654
+ "requires": {
6655
+ "postcss": "^7.0.2",
6656
+ "postcss-values-parser": "^2.0.0"
6657
+ }
6658
+ },
6659
+ "postcss-colormin": {
6660
+ "version": "4.0.3",
6661
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
6662
+ "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
6663
+ "dev": true,
6664
+ "requires": {
6665
+ "browserslist": "^4.0.0",
6666
+ "color": "^3.0.0",
6667
+ "has": "^1.0.0",
6668
+ "postcss": "^7.0.0",
6669
+ "postcss-value-parser": "^3.0.0"
6670
+ },
6671
+ "dependencies": {
6672
+ "postcss-value-parser": {
6673
+ "version": "3.3.1",
6674
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6675
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6676
+ "dev": true
6677
+ }
6678
+ }
6679
+ },
6680
+ "postcss-convert-values": {
6681
+ "version": "4.0.1",
6682
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
6683
+ "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
6684
+ "dev": true,
6685
+ "requires": {
6686
+ "postcss": "^7.0.0",
6687
+ "postcss-value-parser": "^3.0.0"
6688
+ },
6689
+ "dependencies": {
6690
+ "postcss-value-parser": {
6691
+ "version": "3.3.1",
6692
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6693
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6694
+ "dev": true
6695
+ }
6696
+ }
6697
+ },
6698
+ "postcss-custom-media": {
6699
+ "version": "7.0.8",
6700
+ "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz",
6701
+ "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==",
6702
+ "dev": true,
6703
+ "requires": {
6704
+ "postcss": "^7.0.14"
6705
+ }
6706
+ },
6707
+ "postcss-custom-properties": {
6708
+ "version": "8.0.11",
6709
+ "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz",
6710
+ "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==",
6711
+ "dev": true,
6712
+ "requires": {
6713
+ "postcss": "^7.0.17",
6714
+ "postcss-values-parser": "^2.0.1"
6715
+ }
6716
+ },
6717
+ "postcss-custom-selectors": {
6718
+ "version": "5.1.2",
6719
+ "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz",
6720
+ "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==",
6721
+ "dev": true,
6722
+ "requires": {
6723
+ "postcss": "^7.0.2",
6724
+ "postcss-selector-parser": "^5.0.0-rc.3"
6725
+ }
6726
+ },
6727
+ "postcss-dir-pseudo-class": {
6728
+ "version": "5.0.0",
6729
+ "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz",
6730
+ "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==",
6731
+ "dev": true,
6732
+ "requires": {
6733
+ "postcss": "^7.0.2",
6734
+ "postcss-selector-parser": "^5.0.0-rc.3"
6735
+ }
6736
+ },
6737
+ "postcss-discard-comments": {
6738
+ "version": "4.0.2",
6739
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
6740
+ "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
6741
+ "dev": true,
6742
+ "requires": {
6743
+ "postcss": "^7.0.0"
6744
+ }
6745
+ },
6746
+ "postcss-discard-duplicates": {
6747
+ "version": "4.0.2",
6748
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
6749
+ "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
6750
+ "dev": true,
6751
+ "requires": {
6752
+ "postcss": "^7.0.0"
6753
+ }
6754
+ },
6755
+ "postcss-discard-empty": {
6756
+ "version": "4.0.1",
6757
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
6758
+ "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
6759
+ "dev": true,
6760
+ "requires": {
6761
+ "postcss": "^7.0.0"
6762
+ }
6763
+ },
6764
+ "postcss-discard-overridden": {
6765
+ "version": "4.0.1",
6766
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
6767
+ "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
6768
+ "dev": true,
6769
+ "requires": {
6770
+ "postcss": "^7.0.0"
6771
+ }
6772
+ },
6773
+ "postcss-double-position-gradients": {
6774
+ "version": "1.0.0",
6775
+ "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz",
6776
+ "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==",
6777
+ "dev": true,
6778
+ "requires": {
6779
+ "postcss": "^7.0.5",
6780
+ "postcss-values-parser": "^2.0.0"
6781
+ }
6782
+ },
6783
+ "postcss-env-function": {
6784
+ "version": "2.0.2",
6785
+ "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz",
6786
+ "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==",
6787
+ "dev": true,
6788
+ "requires": {
6789
+ "postcss": "^7.0.2",
6790
+ "postcss-values-parser": "^2.0.0"
6791
+ }
6792
+ },
6793
+ "postcss-focus-visible": {
6794
+ "version": "4.0.0",
6795
+ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz",
6796
+ "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==",
6797
+ "dev": true,
6798
+ "requires": {
6799
+ "postcss": "^7.0.2"
6800
+ }
6801
+ },
6802
+ "postcss-focus-within": {
6803
+ "version": "3.0.0",
6804
+ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz",
6805
+ "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==",
6806
+ "dev": true,
6807
+ "requires": {
6808
+ "postcss": "^7.0.2"
6809
+ }
6810
+ },
6811
+ "postcss-font-variant": {
6812
+ "version": "4.0.0",
6813
+ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz",
6814
+ "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==",
6815
+ "dev": true,
6816
+ "requires": {
6817
+ "postcss": "^7.0.2"
6818
+ }
6819
+ },
6820
+ "postcss-gap-properties": {
6821
+ "version": "2.0.0",
6822
+ "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz",
6823
+ "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==",
6824
+ "dev": true,
6825
+ "requires": {
6826
+ "postcss": "^7.0.2"
6827
+ }
6828
+ },
6829
+ "postcss-image-set-function": {
6830
+ "version": "3.0.1",
6831
+ "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz",
6832
+ "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==",
6833
+ "dev": true,
6834
+ "requires": {
6835
+ "postcss": "^7.0.2",
6836
+ "postcss-values-parser": "^2.0.0"
6837
+ }
6838
+ },
6839
+ "postcss-initial": {
6840
+ "version": "3.0.1",
6841
+ "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.1.tgz",
6842
+ "integrity": "sha512-I2Sz83ZSHybMNh02xQDK609lZ1/QOyYeuizCjzEhlMgeV/HcDJapQiH4yTqLjZss0X6/6VvKFXUeObaHpJoINw==",
6843
+ "dev": true,
6844
+ "requires": {
6845
+ "lodash.template": "^4.5.0",
6846
+ "postcss": "^7.0.2"
6847
+ }
6848
+ },
6849
+ "postcss-lab-function": {
6850
+ "version": "2.0.1",
6851
+ "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz",
6852
+ "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==",
6853
+ "dev": true,
6854
+ "requires": {
6855
+ "@csstools/convert-colors": "^1.4.0",
6856
+ "postcss": "^7.0.2",
6857
+ "postcss-values-parser": "^2.0.0"
6858
+ }
6859
+ },
6860
+ "postcss-load-config": {
6861
+ "version": "2.1.0",
6862
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz",
6863
+ "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==",
6864
+ "dev": true,
6865
+ "requires": {
6866
+ "cosmiconfig": "^5.0.0",
6867
+ "import-cwd": "^2.0.0"
6868
+ }
6869
+ },
6870
+ "postcss-loader": {
6871
+ "version": "3.0.0",
6872
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz",
6873
+ "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==",
6874
+ "dev": true,
6875
+ "requires": {
6876
+ "loader-utils": "^1.1.0",
6877
+ "postcss": "^7.0.0",
6878
+ "postcss-load-config": "^2.0.0",
6879
+ "schema-utils": "^1.0.0"
6880
+ },
6881
+ "dependencies": {
6882
+ "schema-utils": {
6883
+ "version": "1.0.0",
6884
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
6885
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
6886
+ "dev": true,
6887
+ "requires": {
6888
+ "ajv": "^6.1.0",
6889
+ "ajv-errors": "^1.0.0",
6890
+ "ajv-keywords": "^3.1.0"
6891
+ }
6892
+ }
6893
+ }
6894
+ },
6895
+ "postcss-logical": {
6896
+ "version": "3.0.0",
6897
+ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz",
6898
+ "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==",
6899
+ "dev": true,
6900
+ "requires": {
6901
+ "postcss": "^7.0.2"
6902
+ }
6903
+ },
6904
+ "postcss-media-minmax": {
6905
+ "version": "4.0.0",
6906
+ "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz",
6907
+ "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==",
6908
+ "dev": true,
6909
+ "requires": {
6910
+ "postcss": "^7.0.2"
6911
+ }
6912
+ },
6913
+ "postcss-merge-longhand": {
6914
+ "version": "4.0.11",
6915
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
6916
+ "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
6917
+ "dev": true,
6918
+ "requires": {
6919
+ "css-color-names": "0.0.4",
6920
+ "postcss": "^7.0.0",
6921
+ "postcss-value-parser": "^3.0.0",
6922
+ "stylehacks": "^4.0.0"
6923
+ },
6924
+ "dependencies": {
6925
+ "postcss-value-parser": {
6926
+ "version": "3.3.1",
6927
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6928
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6929
+ "dev": true
6930
+ }
6931
+ }
6932
+ },
6933
+ "postcss-merge-rules": {
6934
+ "version": "4.0.3",
6935
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
6936
+ "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
6937
+ "dev": true,
6938
+ "requires": {
6939
+ "browserslist": "^4.0.0",
6940
+ "caniuse-api": "^3.0.0",
6941
+ "cssnano-util-same-parent": "^4.0.0",
6942
+ "postcss": "^7.0.0",
6943
+ "postcss-selector-parser": "^3.0.0",
6944
+ "vendors": "^1.0.0"
6945
+ },
6946
+ "dependencies": {
6947
+ "postcss-selector-parser": {
6948
+ "version": "3.1.1",
6949
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz",
6950
+ "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
6951
+ "dev": true,
6952
+ "requires": {
6953
+ "dot-prop": "^4.1.1",
6954
+ "indexes-of": "^1.0.1",
6955
+ "uniq": "^1.0.1"
6956
+ }
6957
+ }
6958
+ }
6959
+ },
6960
+ "postcss-minify-font-values": {
6961
+ "version": "4.0.2",
6962
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
6963
+ "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
6964
+ "dev": true,
6965
+ "requires": {
6966
+ "postcss": "^7.0.0",
6967
+ "postcss-value-parser": "^3.0.0"
6968
+ },
6969
+ "dependencies": {
6970
+ "postcss-value-parser": {
6971
+ "version": "3.3.1",
6972
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6973
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6974
+ "dev": true
6975
+ }
6976
+ }
6977
+ },
6978
+ "postcss-minify-gradients": {
6979
+ "version": "4.0.2",
6980
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
6981
+ "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
6982
+ "dev": true,
6983
+ "requires": {
6984
+ "cssnano-util-get-arguments": "^4.0.0",
6985
+ "is-color-stop": "^1.0.0",
6986
+ "postcss": "^7.0.0",
6987
+ "postcss-value-parser": "^3.0.0"
6988
+ },
6989
+ "dependencies": {
6990
+ "postcss-value-parser": {
6991
+ "version": "3.3.1",
6992
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6993
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6994
+ "dev": true
6995
+ }
6996
+ }
6997
+ },
6998
+ "postcss-minify-params": {
6999
+ "version": "4.0.2",
7000
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
7001
+ "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
7002
+ "dev": true,
7003
+ "requires": {
7004
+ "alphanum-sort": "^1.0.0",
7005
+ "browserslist": "^4.0.0",
7006
+ "cssnano-util-get-arguments": "^4.0.0",
7007
+ "postcss": "^7.0.0",
7008
+ "postcss-value-parser": "^3.0.0",
7009
+ "uniqs": "^2.0.0"
7010
+ },
7011
+ "dependencies": {
7012
+ "postcss-value-parser": {
7013
+ "version": "3.3.1",
7014
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
7015
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
7016
+ "dev": true
7017
+ }
7018
+ }
7019
+ },
7020
+ "postcss-minify-selectors": {
7021
+ "version": "4.0.2",
7022
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
7023
+ "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
7024
+ "dev": true,
7025
+ "requires": {
7026
+ "alphanum-sort": "^1.0.0",
7027
+ "has": "^1.0.0",
7028
+ "postcss": "^7.0.0",
7029
+ "postcss-selector-parser": "^3.0.0"
7030
+ },
7031
+ "dependencies": {
7032
+ "postcss-selector-parser": {
7033
+ "version": "3.1.1",
7034
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz",
7035
+ "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
7036
+ "dev": true,
7037
+ "requires": {
7038
+ "dot-prop": "^4.1.1",
7039
+ "indexes-of": "^1.0.1",
7040
+ "uniq": "^1.0.1"
7041
+ }
7042
+ }
7043
+ }
7044
+ },
7045
+ "postcss-modules-extract-imports": {
7046
+ "version": "1.2.1",
7047
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz",
7048
+ "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==",
7049
+ "dev": true,
7050
+ "requires": {
7051
+ "postcss": "^6.0.1"
7052
+ },
7053
+ "dependencies": {
7054
+ "postcss": {
7055
+ "version": "6.0.23",
7056
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
7057
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
7058
+ "dev": true,
7059
+ "requires": {
7060
+ "chalk": "^2.4.1",
7061
+ "source-map": "^0.6.1",
7062
+ "supports-color": "^5.4.0"
7063
+ }
7064
+ },
7065
+ "source-map": {
7066
+ "version": "0.6.1",
7067
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
7068
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
7069
+ "dev": true
7070
+ }
7071
+ }
7072
+ },
7073
+ "postcss-modules-local-by-default": {
7074
+ "version": "1.2.0",
7075
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
7076
+ "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
7077
+ "dev": true,
7078
+ "requires": {
7079
+ "css-selector-tokenizer": "^0.7.0",
7080
+ "postcss": "^6.0.1"
7081
+ },
7082
+ "dependencies": {
7083
+ "postcss": {
7084
+ "version": "6.0.23",
7085
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
7086
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
7087
+ "dev": true,
7088
+ "requires": {
7089
+ "chalk": "^2.4.1",
7090
+ "source-map": "^0.6.1",
7091
+ "supports-color": "^5.4.0"
7092
+ }
7093
+ },
7094
+ "source-map": {
7095
+ "version": "0.6.1",
7096
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
7097
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
7098
+ "dev": true
7099
+ }
7100
+ }
7101
+ },
7102
+ "postcss-modules-scope": {
7103
+ "version": "1.1.0",
7104
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
7105
+ "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
7106
+ "dev": true,
7107
+ "requires": {
7108
+ "css-selector-tokenizer": "^0.7.0",
7109
+ "postcss": "^6.0.1"
7110
+ },
7111
+ "dependencies": {
7112
+ "postcss": {
7113
+ "version": "6.0.23",
7114
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
7115
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
7116
+ "dev": true,
7117
+ "requires": {
7118
+ "chalk": "^2.4.1",
7119
+ "source-map": "^0.6.1",
7120
+ "supports-color": "^5.4.0"
7121
+ }
7122
+ },
7123
+ "source-map": {
7124
+ "version": "0.6.1",
7125
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
7126
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
7127
+ "dev": true
7128
+ }
7129
+ }
7130
+ },
7131
+ "postcss-modules-values": {
7132
+ "version": "1.3.0",
7133
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
7134
+ "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=",
7135
+ "dev": true,
7136
+ "requires": {
7137
+ "icss-replace-symbols": "^1.1.0",
7138
+ "postcss": "^6.0.1"
7139
+ },
7140
+ "dependencies": {
7141
+ "postcss": {
7142
+ "version": "6.0.23",
7143
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
7144
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
7145
+ "dev": true,
7146
+ "requires": {
7147
+ "chalk": "^2.4.1",
7148
+ "source-map": "^0.6.1",
7149
+ "supports-color": "^5.4.0"
7150
+ }
7151
+ },
7152
+ "source-map": {
7153
+ "version": "0.6.1",
7154
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
7155
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
7156
+ "dev": true
7157
+ }
7158
+ }
7159
+ },
7160
+ "postcss-nesting": {
7161
+ "version": "7.0.0",
7162
+ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.0.tgz",
7163
+ "integrity": "sha512-WSsbVd5Ampi3Y0nk/SKr5+K34n52PqMqEfswu6RtU4r7wA8vSD+gM8/D9qq4aJkHImwn1+9iEFTbjoWsQeqtaQ==",
7164
+ "dev": true,
7165
+ "requires": {
7166
+ "postcss": "^7.0.2"
7167
+ }
7168
+ },
7169
+ "postcss-normalize-charset": {
7170
+ "version": "4.0.1",
7171
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
7172
+ "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
7173
+ "dev": true,
7174
+ "requires": {
7175
+ "postcss": "^7.0.0"
7176
+ }
7177
+ },
7178
+ "postcss-normalize-display-values": {
7179
+ "version": "4.0.2",
7180
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
7181
+ "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
7182
+ "dev": true,
7183
+ "requires": {
7184
+ "cssnano-util-get-match": "^4.0.0",
7185
+ "postcss": "^7.0.0",
7186
+ "postcss-value-parser": "^3.0.0"
7187
+ },
7188
+ "dependencies": {
7189
+ "postcss-value-parser": {
7190
+ "version": "3.3.1",
7191
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
7192
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
7193
+ "dev": true
7194
+ }
7195
+ }
7196
+ },
7197
+ "postcss-normalize-positions": {
7198
+ "version": "4.0.2",
7199
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
7200
+ "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
7201
+ "dev": true,
7202
+ "requires": {
7203
+ "cssnano-util-get-arguments": "^4.0.0",
7204
+ "has": "^1.0.0",
7205
+ "postcss": "^7.0.0",
7206
+ "postcss-value-parser": "^3.0.0"
7207
+ },
7208
+ "dependencies": {
7209
+ "postcss-value-parser": {
7210
+ "version": "3.3.1",
7211
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
7212
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
7213
+ "dev": true
7214
+ }
7215
+ }
7216
+ },
7217
+ "postcss-normalize-repeat-style": {
7218
+ "version": "4.0.2",
7219
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
7220
+ "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
7221
+ "dev": true,
7222
+ "requires": {
7223
+ "cssnano-util-get-arguments": "^4.0.0",
7224
+ "cssnano-util-get-match": "^4.0.0",
7225
+ "postcss": "^7.0.0",
7226
+ "postcss-value-parser": "^3.0.0"
7227
+ },
7228
+ "dependencies": {
7229
+ "postcss-value-parser": {
7230
+ "version": "3.3.1",
7231
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
7232
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
7233
+ "dev": true
7234
+ }
7235
+ }
7236
+ },
7237
+ "postcss-normalize-string": {
7238
+ "version": "4.0.2",
7239
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
7240
+ "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
7241
+ "dev": true,
7242
+ "requires": {
7243
+ "has": "^1.0.0",
7244
+ "postcss": "^7.0.0",
7245
+ "postcss-value-parser": "^3.0.0"
7246
+ },
7247
+ "dependencies": {
7248
+ "postcss-value-parser": {
7249
+ "version": "3.3.1",
7250
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
7251
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
7252
+ "dev": true
7253
+ }
7254
+ }
7255
+ },
7256
+ "postcss-normalize-timing-functions": {
7257
+ "version": "4.0.2",
7258
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
7259
+ "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
7260
+ "dev": true,
7261
+ "requires": {
7262
+ "cssnano-util-get-match": "^4.0.0",
7263
+ "postcss": "^7.0.0",
7264
+ "postcss-value-parser": "^3.0.0"
7265
+ },
7266
+ "dependencies": {
7267
+ "postcss-value-parser": {
7268
+ "version": "3.3.1",
7269
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
7270
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
7271
+ "dev": true
7272
+ }
7273
+ }
7274
+ },
7275
+ "postcss-normalize-unicode": {
7276
+ "version": "4.0.1",
7277
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
7278
+ "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
7279
+ "dev": true,
7280
+ "requires": {
7281
+ "browserslist": "^4.0.0",
7282
+ "postcss": "^7.0.0",
7283
+ "postcss-value-parser": "^3.0.0"
7284
+ },
7285
+ "dependencies": {
7286
+ "postcss-value-parser": {
7287
+ "version": "3.3.1",
7288
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
7289
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
7290
+ "dev": true
7291
+ }
7292
+ }
7293
+ },
7294
+ "postcss-normalize-url": {
7295
+ "version": "4.0.1",
7296
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
7297
+ "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
7298
+ "dev": true,
7299
+ "requires": {
7300
+ "is-absolute-url": "^2.0.0",
7301
+ "normalize-url": "^3.0.0",
7302
+ "postcss": "^7.0.0",
7303
+ "postcss-value-parser": "^3.0.0"
7304
+ },
7305
+ "dependencies": {
7306
+ "postcss-value-parser": {
7307
+ "version": "3.3.1",
7308
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
7309
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
7310
+ "dev": true
7311
+ }
7312
+ }
7313
+ },
7314
+ "postcss-normalize-whitespace": {
7315
+ "version": "4.0.2",
7316
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
7317
+ "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
7318
+ "dev": true,
7319
+ "requires": {
7320
+ "postcss": "^7.0.0",
7321
+ "postcss-value-parser": "^3.0.0"
7322
+ },
7323
+ "dependencies": {
7324
+ "postcss-value-parser": {
7325
+ "version": "3.3.1",
7326
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
7327
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
7328
+ "dev": true
7329
+ }
7330
+ }
7331
+ },
7332
+ "postcss-ordered-values": {
7333
+ "version": "4.1.2",
7334
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
7335
+ "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
7336
+ "dev": true,
7337
+ "requires": {
7338
+ "cssnano-util-get-arguments": "^4.0.0",
7339
+ "postcss": "^7.0.0",
7340
+ "postcss-value-parser": "^3.0.0"
7341
+ },
7342
+ "dependencies": {
7343
+ "postcss-value-parser": {
7344
+ "version": "3.3.1",
7345
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
7346
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
7347
+ "dev": true
7348
+ }
7349
+ }
7350
+ },
7351
+ "postcss-overflow-shorthand": {
7352
+ "version": "2.0.0",
7353
+ "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz",
7354
+ "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==",
7355
+ "dev": true,
7356
+ "requires": {
7357
+ "postcss": "^7.0.2"
7358
+ }
7359
+ },
7360
+ "postcss-page-break": {
7361
+ "version": "2.0.0",
7362
+ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz",
7363
+ "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==",
7364
+ "dev": true,
7365
+ "requires": {
7366
+ "postcss": "^7.0.2"
7367
+ }
7368
+ },
7369
+ "postcss-place": {
7370
+ "version": "4.0.1",
7371
+ "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz",
7372
+ "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==",
7373
+ "dev": true,
7374
+ "requires": {
7375
+ "postcss": "^7.0.2",
7376
+ "postcss-values-parser": "^2.0.0"
7377
+ }
7378
+ },
7379
+ "postcss-preset-env": {
7380
+ "version": "6.7.0",
7381
+ "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz",
7382
+ "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==",
7383
+ "dev": true,
7384
+ "requires": {
7385
+ "autoprefixer": "^9.6.1",
7386
+ "browserslist": "^4.6.4",
7387
+ "caniuse-lite": "^1.0.30000981",
7388
+ "css-blank-pseudo": "^0.1.4",
7389
+ "css-has-pseudo": "^0.10.0",
7390
+ "css-prefers-color-scheme": "^3.1.1",
7391
+ "cssdb": "^4.4.0",
7392
+ "postcss": "^7.0.17",
7393
+ "postcss-attribute-case-insensitive": "^4.0.1",
7394
+ "postcss-color-functional-notation": "^2.0.1",
7395
+ "postcss-color-gray": "^5.0.0",
7396
+ "postcss-color-hex-alpha": "^5.0.3",
7397
+ "postcss-color-mod-function": "^3.0.3",
7398
+ "postcss-color-rebeccapurple": "^4.0.1",
7399
+ "postcss-custom-media": "^7.0.8",
7400
+ "postcss-custom-properties": "^8.0.11",
7401
+ "postcss-custom-selectors": "^5.1.2",
7402
+ "postcss-dir-pseudo-class": "^5.0.0",
7403
+ "postcss-double-position-gradients": "^1.0.0",
7404
+ "postcss-env-function": "^2.0.2",
7405
+ "postcss-focus-visible": "^4.0.0",
7406
+ "postcss-focus-within": "^3.0.0",
7407
+ "postcss-font-variant": "^4.0.0",
7408
+ "postcss-gap-properties": "^2.0.0",
7409
+ "postcss-image-set-function": "^3.0.1",
7410
+ "postcss-initial": "^3.0.0",
7411
+ "postcss-lab-function": "^2.0.1",
7412
+ "postcss-logical": "^3.0.0",
7413
+ "postcss-media-minmax": "^4.0.0",
7414
+ "postcss-nesting": "^7.0.0",
7415
+ "postcss-overflow-shorthand": "^2.0.0",
7416
+ "postcss-page-break": "^2.0.0",
7417
+ "postcss-place": "^4.0.1",
7418
+ "postcss-pseudo-class-any-link": "^6.0.0",
7419
+ "postcss-replace-overflow-wrap": "^3.0.0",
7420
+ "postcss-selector-matches": "^4.0.0",
7421
+ "postcss-selector-not": "^4.0.0"
7422
+ }
7423
+ },
7424
+ "postcss-pseudo-class-any-link": {
7425
+ "version": "6.0.0",
7426
+ "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz",
7427
+ "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==",
7428
+ "dev": true,
7429
+ "requires": {
7430
+ "postcss": "^7.0.2",
7431
+ "postcss-selector-parser": "^5.0.0-rc.3"
7432
+ }
7433
+ },
7434
+ "postcss-reduce-initial": {
7435
+ "version": "4.0.3",
7436
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
7437
+ "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
7438
+ "dev": true,
7439
+ "requires": {
7440
+ "browserslist": "^4.0.0",
7441
+ "caniuse-api": "^3.0.0",
7442
+ "has": "^1.0.0",
7443
+ "postcss": "^7.0.0"
7444
+ }
7445
+ },
7446
+ "postcss-reduce-transforms": {
7447
+ "version": "4.0.2",
7448
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
7449
+ "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
7450
+ "dev": true,
7451
+ "requires": {
7452
+ "cssnano-util-get-match": "^4.0.0",
7453
+ "has": "^1.0.0",
7454
+ "postcss": "^7.0.0",
7455
+ "postcss-value-parser": "^3.0.0"
7456
+ },
7457
+ "dependencies": {
7458
+ "postcss-value-parser": {
7459
+ "version": "3.3.1",
7460
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
7461
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
7462
+ "dev": true
7463
+ }
7464
+ }
7465
+ },
7466
+ "postcss-replace-overflow-wrap": {
7467
+ "version": "3.0.0",
7468
+ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz",
7469
+ "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==",
7470
+ "dev": true,
7471
+ "requires": {
7472
+ "postcss": "^7.0.2"
7473
+ }
7474
+ },
7475
+ "postcss-selector-matches": {
7476
+ "version": "4.0.0",
7477
+ "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz",
7478
+ "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==",
7479
+ "dev": true,
7480
+ "requires": {
7481
+ "balanced-match": "^1.0.0",
7482
+ "postcss": "^7.0.2"
7483
+ }
7484
+ },
7485
+ "postcss-selector-not": {
7486
+ "version": "4.0.0",
7487
+ "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz",
7488
+ "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==",
7489
+ "dev": true,
7490
+ "requires": {
7491
+ "balanced-match": "^1.0.0",
7492
+ "postcss": "^7.0.2"
7493
+ }
7494
+ },
7495
+ "postcss-selector-parser": {
7496
+ "version": "5.0.0",
7497
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
7498
+ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
7499
+ "dev": true,
7500
+ "requires": {
7501
+ "cssesc": "^2.0.0",
7502
+ "indexes-of": "^1.0.1",
7503
+ "uniq": "^1.0.1"
7504
+ },
7505
+ "dependencies": {
7506
+ "cssesc": {
7507
+ "version": "2.0.0",
7508
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
7509
+ "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
7510
+ "dev": true
7511
+ }
7512
+ }
7513
+ },
7514
+ "postcss-svgo": {
7515
+ "version": "4.0.2",
7516
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
7517
+ "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
7518
+ "dev": true,
7519
+ "requires": {
7520
+ "is-svg": "^3.0.0",
7521
+ "postcss": "^7.0.0",
7522
+ "postcss-value-parser": "^3.0.0",
7523
+ "svgo": "^1.0.0"
7524
+ },
7525
+ "dependencies": {
7526
+ "postcss-value-parser": {
7527
+ "version": "3.3.1",
7528
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
7529
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
7530
+ "dev": true
7531
+ }
7532
+ }
7533
+ },
7534
+ "postcss-unique-selectors": {
7535
+ "version": "4.0.1",
7536
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
7537
+ "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
7538
+ "dev": true,
7539
+ "requires": {
7540
+ "alphanum-sort": "^1.0.0",
7541
+ "postcss": "^7.0.0",
7542
+ "uniqs": "^2.0.0"
7543
+ }
7544
+ },
7545
+ "postcss-value-parser": {
7546
+ "version": "4.0.0",
7547
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.0.tgz",
7548
+ "integrity": "sha512-ESPktioptiSUchCKgggAkzdmkgzKfmp0EU8jXH+5kbIUB+unr0Y4CY9SRMvibuvYUBjNh1ACLbxqYNpdTQOteQ==",
7549
+ "dev": true
7550
+ },
7551
+ "postcss-values-parser": {
7552
+ "version": "2.0.1",
7553
+ "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz",
7554
+ "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==",
7555
+ "dev": true,
7556
+ "requires": {
7557
+ "flatten": "^1.0.2",
7558
+ "indexes-of": "^1.0.1",
7559
+ "uniq": "^1.0.1"
7560
+ }
7561
+ },
7562
+ "prettier": {
7563
+ "version": "1.16.3",
7564
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.3.tgz",
7565
+ "integrity": "sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw==",
7566
+ "dev": true
7567
+ },
7568
+ "private": {
7569
+ "version": "0.1.8",
7570
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
7571
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
7572
+ "dev": true
7573
+ },
7574
+ "process": {
7575
+ "version": "0.11.10",
7576
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
7577
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
7578
+ "dev": true
7579
+ },
7580
+ "process-nextick-args": {
7581
+ "version": "2.0.1",
7582
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
7583
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
7584
+ "dev": true
7585
+ },
7586
+ "promise-inflight": {
7587
+ "version": "1.0.1",
7588
+ "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
7589
+ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
7590
+ "dev": true
7591
+ },
7592
+ "proxy-addr": {
7593
+ "version": "2.0.5",
7594
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
7595
+ "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
7596
+ "dev": true,
7597
+ "requires": {
7598
+ "forwarded": "~0.1.2",
7599
+ "ipaddr.js": "1.9.0"
7600
+ }
7601
+ },
7602
+ "prr": {
7603
+ "version": "1.0.1",
7604
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
7605
+ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
7606
+ "dev": true
7607
+ },
7608
+ "pseudomap": {
7609
+ "version": "1.0.2",
7610
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
7611
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
7612
+ "dev": true
7613
+ },
7614
+ "public-encrypt": {
7615
+ "version": "4.0.3",
7616
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
7617
+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
7618
+ "dev": true,
7619
+ "requires": {
7620
+ "bn.js": "^4.1.0",
7621
+ "browserify-rsa": "^4.0.0",
7622
+ "create-hash": "^1.1.0",
7623
+ "parse-asn1": "^5.0.0",
7624
+ "randombytes": "^2.0.1",
7625
+ "safe-buffer": "^5.1.2"
7626
+ }
7627
+ },
7628
+ "pump": {
7629
+ "version": "3.0.0",
7630
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
7631
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
7632
+ "dev": true,
7633
+ "requires": {
7634
+ "end-of-stream": "^1.1.0",
7635
+ "once": "^1.3.1"
7636
+ }
7637
+ },
7638
+ "pumpify": {
7639
+ "version": "1.5.1",
7640
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
7641
+ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
7642
+ "dev": true,
7643
+ "requires": {
7644
+ "duplexify": "^3.6.0",
7645
+ "inherits": "^2.0.3",
7646
+ "pump": "^2.0.0"
7647
+ },
7648
+ "dependencies": {
7649
+ "pump": {
7650
+ "version": "2.0.1",
7651
+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
7652
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
7653
+ "dev": true,
7654
+ "requires": {
7655
+ "end-of-stream": "^1.1.0",
7656
+ "once": "^1.3.1"
7657
+ }
7658
+ }
7659
+ }
7660
+ },
7661
+ "punycode": {
7662
+ "version": "2.1.1",
7663
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
7664
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
7665
+ "dev": true
7666
+ },
7667
+ "q": {
7668
+ "version": "1.5.1",
7669
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
7670
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
7671
+ "dev": true
7672
+ },
7673
+ "qs": {
7674
+ "version": "6.7.0",
7675
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
7676
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
7677
+ "dev": true
7678
+ },
7679
+ "querystring": {
7680
+ "version": "0.2.0",
7681
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
7682
+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
7683
+ "dev": true
7684
+ },
7685
+ "querystring-es3": {
7686
+ "version": "0.2.1",
7687
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
7688
+ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
7689
+ "dev": true
7690
+ },
7691
+ "querystringify": {
7692
+ "version": "2.1.1",
7693
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
7694
+ "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==",
7695
+ "dev": true
7696
+ },
7697
+ "randombytes": {
7698
+ "version": "2.1.0",
7699
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
7700
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
7701
+ "dev": true,
7702
+ "requires": {
7703
+ "safe-buffer": "^5.1.0"
7704
+ }
7705
+ },
7706
+ "randomfill": {
7707
+ "version": "1.0.4",
7708
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
7709
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
7710
+ "dev": true,
7711
+ "requires": {
7712
+ "randombytes": "^2.0.5",
7713
+ "safe-buffer": "^5.1.0"
7714
+ }
7715
+ },
7716
+ "range-parser": {
7717
+ "version": "1.2.1",
7718
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
7719
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
7720
+ "dev": true
7721
+ },
7722
+ "raw-body": {
7723
+ "version": "2.4.0",
7724
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
7725
+ "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
7726
+ "dev": true,
7727
+ "requires": {
7728
+ "bytes": "3.1.0",
7729
+ "http-errors": "1.7.2",
7730
+ "iconv-lite": "0.4.24",
7731
+ "unpipe": "1.0.0"
7732
+ },
7733
+ "dependencies": {
7734
+ "bytes": {
7735
+ "version": "3.1.0",
7736
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
7737
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
7738
+ "dev": true
7739
+ }
7740
+ }
7741
+ },
7742
+ "readable-stream": {
7743
+ "version": "2.3.6",
7744
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
7745
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
7746
+ "dev": true,
7747
+ "requires": {
7748
+ "core-util-is": "~1.0.0",
7749
+ "inherits": "~2.0.3",
7750
+ "isarray": "~1.0.0",
7751
+ "process-nextick-args": "~2.0.0",
7752
+ "safe-buffer": "~5.1.1",
7753
+ "string_decoder": "~1.1.1",
7754
+ "util-deprecate": "~1.0.1"
7755
+ }
7756
+ },
7757
+ "readdirp": {
7758
+ "version": "2.2.1",
7759
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
7760
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
7761
+ "dev": true,
7762
+ "requires": {
7763
+ "graceful-fs": "^4.1.11",
7764
+ "micromatch": "^3.1.10",
7765
+ "readable-stream": "^2.0.2"
7766
+ }
7767
+ },
7768
+ "recast": {
7769
+ "version": "0.11.23",
7770
+ "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz",
7771
+ "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=",
7772
+ "dev": true,
7773
+ "requires": {
7774
+ "ast-types": "0.9.6",
7775
+ "esprima": "~3.1.0",
7776
+ "private": "~0.1.5",
7777
+ "source-map": "~0.5.0"
7778
+ }
7779
+ },
7780
+ "regenerate": {
7781
+ "version": "1.4.0",
7782
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
7783
+ "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
7784
+ "dev": true
7785
+ },
7786
+ "regenerate-unicode-properties": {
7787
+ "version": "8.1.0",
7788
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz",
7789
+ "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==",
7790
+ "dev": true,
7791
+ "requires": {
7792
+ "regenerate": "^1.4.0"
7793
+ }
7794
+ },
7795
+ "regenerator-runtime": {
7796
+ "version": "0.13.2",
7797
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
7798
+ "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==",
7799
+ "dev": true
7800
+ },
7801
+ "regenerator-transform": {
7802
+ "version": "0.14.0",
7803
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.0.tgz",
7804
+ "integrity": "sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w==",
7805
+ "dev": true,
7806
+ "requires": {
7807
+ "private": "^0.1.6"
7808
+ }
7809
+ },
7810
+ "regex-not": {
7811
+ "version": "1.0.2",
7812
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
7813
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
7814
+ "dev": true,
7815
+ "requires": {
7816
+ "extend-shallow": "^3.0.2",
7817
+ "safe-regex": "^1.1.0"
7818
+ }
7819
+ },
7820
+ "regexp-tree": {
7821
+ "version": "0.1.11",
7822
+ "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.11.tgz",
7823
+ "integrity": "sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg==",
7824
+ "dev": true
7825
+ },
7826
+ "regexpu-core": {
7827
+ "version": "4.5.4",
7828
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz",
7829
+ "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==",
7830
+ "dev": true,
7831
+ "requires": {
7832
+ "regenerate": "^1.4.0",
7833
+ "regenerate-unicode-properties": "^8.0.2",
7834
+ "regjsgen": "^0.5.0",
7835
+ "regjsparser": "^0.6.0",
7836
+ "unicode-match-property-ecmascript": "^1.0.4",
7837
+ "unicode-match-property-value-ecmascript": "^1.1.0"
7838
+ }
7839
+ },
7840
+ "regjsgen": {
7841
+ "version": "0.5.0",
7842
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
7843
+ "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==",
7844
+ "dev": true
7845
+ },
7846
+ "regjsparser": {
7847
+ "version": "0.6.0",
7848
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
7849
+ "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
7850
+ "dev": true,
7851
+ "requires": {
7852
+ "jsesc": "~0.5.0"
7853
+ },
7854
+ "dependencies": {
7855
+ "jsesc": {
7856
+ "version": "0.5.0",
7857
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
7858
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
7859
+ "dev": true
7860
+ }
7861
+ }
7862
+ },
7863
+ "relateurl": {
7864
+ "version": "0.2.7",
7865
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
7866
+ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
7867
+ "dev": true
7868
+ },
7869
+ "remove-trailing-separator": {
7870
+ "version": "1.1.0",
7871
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
7872
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
7873
+ "dev": true
7874
+ },
7875
+ "repeat-element": {
7876
+ "version": "1.1.3",
7877
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
7878
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
7879
+ "dev": true
7880
+ },
7881
+ "repeat-string": {
7882
+ "version": "1.6.1",
7883
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
7884
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
7885
+ "dev": true
7886
+ },
7887
+ "replace-ext": {
7888
+ "version": "1.0.0",
7889
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
7890
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
7891
+ "dev": true
7892
+ },
7893
+ "require-directory": {
7894
+ "version": "2.1.1",
7895
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
7896
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
7897
+ "dev": true
7898
+ },
7899
+ "require-main-filename": {
7900
+ "version": "2.0.0",
7901
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
7902
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
7903
+ "dev": true
7904
+ },
7905
+ "requires-port": {
7906
+ "version": "1.0.0",
7907
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
7908
+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
7909
+ "dev": true
7910
+ },
7911
+ "resolve": {
7912
+ "version": "1.11.1",
7913
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
7914
+ "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==",
7915
+ "dev": true,
7916
+ "requires": {
7917
+ "path-parse": "^1.0.6"
7918
+ }
7919
+ },
7920
+ "resolve-cwd": {
7921
+ "version": "2.0.0",
7922
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
7923
+ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
7924
+ "dev": true,
7925
+ "requires": {
7926
+ "resolve-from": "^3.0.0"
7927
+ }
7928
+ },
7929
+ "resolve-dir": {
7930
+ "version": "1.0.1",
7931
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
7932
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
7933
+ "dev": true,
7934
+ "requires": {
7935
+ "expand-tilde": "^2.0.0",
7936
+ "global-modules": "^1.0.0"
7937
+ },
7938
+ "dependencies": {
7939
+ "global-modules": {
7940
+ "version": "1.0.0",
7941
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
7942
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
7943
+ "dev": true,
7944
+ "requires": {
7945
+ "global-prefix": "^1.0.1",
7946
+ "is-windows": "^1.0.1",
7947
+ "resolve-dir": "^1.0.0"
7948
+ }
7949
+ }
7950
+ }
7951
+ },
7952
+ "resolve-from": {
7953
+ "version": "3.0.0",
7954
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
7955
+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
7956
+ "dev": true
7957
+ },
7958
+ "resolve-url": {
7959
+ "version": "0.2.1",
7960
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
7961
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
7962
+ "dev": true
7963
+ },
7964
+ "ret": {
7965
+ "version": "0.1.15",
7966
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
7967
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
7968
+ "dev": true
7969
+ },
7970
+ "retry": {
7971
+ "version": "0.12.0",
7972
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
7973
+ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
7974
+ "dev": true
7975
+ },
7976
+ "rgb-regex": {
7977
+ "version": "1.0.1",
7978
+ "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
7979
+ "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=",
7980
+ "dev": true
7981
+ },
7982
+ "rgba-regex": {
7983
+ "version": "1.0.0",
7984
+ "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
7985
+ "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=",
7986
+ "dev": true
7987
+ },
7988
+ "rimraf": {
7989
+ "version": "3.0.0",
7990
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz",
7991
+ "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==",
7992
+ "dev": true,
7993
+ "requires": {
7994
+ "glob": "^7.1.3"
7995
+ }
7996
+ },
7997
+ "ripemd160": {
7998
+ "version": "2.0.2",
7999
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
8000
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
8001
+ "dev": true,
8002
+ "requires": {
8003
+ "hash-base": "^3.0.0",
8004
+ "inherits": "^2.0.1"
8005
+ }
8006
+ },
8007
+ "run-queue": {
8008
+ "version": "1.0.3",
8009
+ "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
8010
+ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
8011
+ "dev": true,
8012
+ "requires": {
8013
+ "aproba": "^1.1.1"
8014
+ }
8015
+ },
8016
+ "safe-buffer": {
8017
+ "version": "5.1.2",
8018
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
8019
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
8020
+ "dev": true
8021
+ },
8022
+ "safe-regex": {
8023
+ "version": "1.1.0",
8024
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
8025
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
8026
+ "dev": true,
8027
+ "requires": {
8028
+ "ret": "~0.1.10"
8029
+ }
8030
+ },
8031
+ "safer-buffer": {
8032
+ "version": "2.1.2",
8033
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
8034
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
8035
+ "dev": true
8036
+ },
8037
+ "sass": {
8038
+ "version": "1.22.5",
8039
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.5.tgz",
8040
+ "integrity": "sha512-Z06zPez82QqlQbqvGKMMEs2bBpLUsmFQxd+8wZJedkptMn8jyk+fccMhfUloD8HsfsYw572ca7Be3zbMBsip4A==",
8041
+ "dev": true,
8042
+ "requires": {
8043
+ "chokidar": ">=2.0.0 <4.0.0"
8044
+ }
8045
+ },
8046
+ "sass-loader": {
8047
+ "version": "7.1.0",
8048
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz",
8049
+ "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==",
8050
+ "dev": true,
8051
+ "requires": {
8052
+ "clone-deep": "^2.0.1",
8053
+ "loader-utils": "^1.0.1",
8054
+ "lodash.tail": "^4.1.1",
8055
+ "neo-async": "^2.5.0",
8056
+ "pify": "^3.0.0",
8057
+ "semver": "^5.5.0"
8058
+ },
8059
+ "dependencies": {
8060
+ "pify": {
8061
+ "version": "3.0.0",
8062
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
8063
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
8064
+ "dev": true
8065
+ }
8066
+ }
8067
+ },
8068
+ "sax": {
8069
+ "version": "1.2.4",
8070
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
8071
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
8072
+ "dev": true
8073
+ },
8074
+ "schema-utils": {
8075
+ "version": "0.4.7",
8076
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
8077
+ "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
8078
+ "dev": true,
8079
+ "requires": {
8080
+ "ajv": "^6.1.0",
8081
+ "ajv-keywords": "^3.1.0"
8082
+ }
8083
+ },
8084
+ "select-hose": {
8085
+ "version": "2.0.0",
8086
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
8087
+ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
8088
+ "dev": true
8089
+ },
8090
+ "selfsigned": {
8091
+ "version": "1.10.4",
8092
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz",
8093
+ "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==",
8094
+ "dev": true,
8095
+ "requires": {
8096
+ "node-forge": "0.7.5"
8097
+ }
8098
+ },
8099
+ "semver": {
8100
+ "version": "5.7.0",
8101
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
8102
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
8103
+ "dev": true
8104
+ },
8105
+ "send": {
8106
+ "version": "0.17.1",
8107
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
8108
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
8109
+ "dev": true,
8110
+ "requires": {
8111
+ "debug": "2.6.9",
8112
+ "depd": "~1.1.2",
8113
+ "destroy": "~1.0.4",
8114
+ "encodeurl": "~1.0.2",
8115
+ "escape-html": "~1.0.3",
8116
+ "etag": "~1.8.1",
8117
+ "fresh": "0.5.2",
8118
+ "http-errors": "~1.7.2",
8119
+ "mime": "1.6.0",
8120
+ "ms": "2.1.1",
8121
+ "on-finished": "~2.3.0",
8122
+ "range-parser": "~1.2.1",
8123
+ "statuses": "~1.5.0"
8124
+ },
8125
+ "dependencies": {
8126
+ "debug": {
8127
+ "version": "2.6.9",
8128
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
8129
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
8130
+ "dev": true,
8131
+ "requires": {
8132
+ "ms": "2.0.0"
8133
+ },
8134
+ "dependencies": {
8135
+ "ms": {
8136
+ "version": "2.0.0",
8137
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
8138
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
8139
+ "dev": true
8140
+ }
8141
+ }
8142
+ },
8143
+ "ms": {
8144
+ "version": "2.1.1",
8145
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
8146
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
8147
+ "dev": true
8148
+ }
8149
+ }
8150
+ },
8151
+ "serialize-javascript": {
8152
+ "version": "1.7.0",
8153
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz",
8154
+ "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==",
8155
+ "dev": true
8156
+ },
8157
+ "serve-index": {
8158
+ "version": "1.9.1",
8159
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
8160
+ "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
8161
+ "dev": true,
8162
+ "requires": {
8163
+ "accepts": "~1.3.4",
8164
+ "batch": "0.6.1",
8165
+ "debug": "2.6.9",
8166
+ "escape-html": "~1.0.3",
8167
+ "http-errors": "~1.6.2",
8168
+ "mime-types": "~2.1.17",
8169
+ "parseurl": "~1.3.2"
8170
+ },
8171
+ "dependencies": {
8172
+ "debug": {
8173
+ "version": "2.6.9",
8174
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
8175
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
8176
+ "dev": true,
8177
+ "requires": {
8178
+ "ms": "2.0.0"
8179
+ }
8180
+ },
8181
+ "http-errors": {
8182
+ "version": "1.6.3",
8183
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
8184
+ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
8185
+ "dev": true,
8186
+ "requires": {
8187
+ "depd": "~1.1.2",
8188
+ "inherits": "2.0.3",
8189
+ "setprototypeof": "1.1.0",
8190
+ "statuses": ">= 1.4.0 < 2"
8191
+ }
8192
+ },
8193
+ "inherits": {
8194
+ "version": "2.0.3",
8195
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
8196
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
8197
+ "dev": true
8198
+ },
8199
+ "ms": {
8200
+ "version": "2.0.0",
8201
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
8202
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
8203
+ "dev": true
8204
+ },
8205
+ "setprototypeof": {
8206
+ "version": "1.1.0",
8207
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
8208
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
8209
+ "dev": true
8210
+ }
8211
+ }
8212
+ },
8213
+ "serve-static": {
8214
+ "version": "1.14.1",
8215
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
8216
+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
8217
+ "dev": true,
8218
+ "requires": {
8219
+ "encodeurl": "~1.0.2",
8220
+ "escape-html": "~1.0.3",
8221
+ "parseurl": "~1.3.3",
8222
+ "send": "0.17.1"
8223
+ }
8224
+ },
8225
+ "set-blocking": {
8226
+ "version": "2.0.0",
8227
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
8228
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
8229
+ "dev": true
8230
+ },
8231
+ "set-value": {
8232
+ "version": "2.0.1",
8233
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
8234
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
8235
+ "dev": true,
8236
+ "requires": {
8237
+ "extend-shallow": "^2.0.1",
8238
+ "is-extendable": "^0.1.1",
8239
+ "is-plain-object": "^2.0.3",
8240
+ "split-string": "^3.0.1"
8241
+ },
8242
+ "dependencies": {
8243
+ "extend-shallow": {
8244
+ "version": "2.0.1",
8245
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
8246
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
8247
+ "dev": true,
8248
+ "requires": {
8249
+ "is-extendable": "^0.1.0"
8250
+ }
8251
+ },
8252
+ "is-extendable": {
8253
+ "version": "0.1.1",
8254
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
8255
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
8256
+ "dev": true
8257
+ }
8258
+ }
8259
+ },
8260
+ "setimmediate": {
8261
+ "version": "1.0.5",
8262
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
8263
+ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
8264
+ "dev": true
8265
+ },
8266
+ "setprototypeof": {
8267
+ "version": "1.1.1",
8268
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
8269
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
8270
+ "dev": true
8271
+ },
8272
+ "sha.js": {
8273
+ "version": "2.4.11",
8274
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
8275
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
8276
+ "dev": true,
8277
+ "requires": {
8278
+ "inherits": "^2.0.1",
8279
+ "safe-buffer": "^5.0.1"
8280
+ }
8281
+ },
8282
+ "shallow-clone": {
8283
+ "version": "1.0.0",
8284
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz",
8285
+ "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==",
8286
+ "dev": true,
8287
+ "requires": {
8288
+ "is-extendable": "^0.1.1",
8289
+ "kind-of": "^5.0.0",
8290
+ "mixin-object": "^2.0.1"
8291
+ },
8292
+ "dependencies": {
8293
+ "is-extendable": {
8294
+ "version": "0.1.1",
8295
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
8296
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
8297
+ "dev": true
8298
+ },
8299
+ "kind-of": {
8300
+ "version": "5.1.0",
8301
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
8302
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
8303
+ "dev": true
8304
+ }
8305
+ }
8306
+ },
8307
+ "shebang-command": {
8308
+ "version": "1.2.0",
8309
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
8310
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
8311
+ "dev": true,
8312
+ "requires": {
8313
+ "shebang-regex": "^1.0.0"
8314
+ }
8315
+ },
8316
+ "shebang-regex": {
8317
+ "version": "1.0.0",
8318
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
8319
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
8320
+ "dev": true
8321
+ },
8322
+ "shellwords": {
8323
+ "version": "0.1.1",
8324
+ "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
8325
+ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
8326
+ "dev": true
8327
+ },
8328
+ "signal-exit": {
8329
+ "version": "3.0.2",
8330
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
8331
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
8332
+ "dev": true
8333
+ },
8334
+ "simple-swizzle": {
8335
+ "version": "0.2.2",
8336
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
8337
+ "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
8338
+ "dev": true,
8339
+ "requires": {
8340
+ "is-arrayish": "^0.3.1"
8341
+ },
8342
+ "dependencies": {
8343
+ "is-arrayish": {
8344
+ "version": "0.3.2",
8345
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
8346
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
8347
+ "dev": true
8348
+ }
8349
+ }
8350
+ },
8351
+ "slash": {
8352
+ "version": "1.0.0",
8353
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
8354
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
8355
+ "dev": true
8356
+ },
8357
+ "snapdragon": {
8358
+ "version": "0.8.2",
8359
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
8360
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
8361
+ "dev": true,
8362
+ "requires": {
8363
+ "base": "^0.11.1",
8364
+ "debug": "^2.2.0",
8365
+ "define-property": "^0.2.5",
8366
+ "extend-shallow": "^2.0.1",
8367
+ "map-cache": "^0.2.2",
8368
+ "source-map": "^0.5.6",
8369
+ "source-map-resolve": "^0.5.0",
8370
+ "use": "^3.1.0"
8371
+ },
8372
+ "dependencies": {
8373
+ "debug": {
8374
+ "version": "2.6.9",
8375
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
8376
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
8377
+ "dev": true,
8378
+ "requires": {
8379
+ "ms": "2.0.0"
8380
+ }
8381
+ },
8382
+ "define-property": {
8383
+ "version": "0.2.5",
8384
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
8385
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
8386
+ "dev": true,
8387
+ "requires": {
8388
+ "is-descriptor": "^0.1.0"
8389
+ }
8390
+ },
8391
+ "extend-shallow": {
8392
+ "version": "2.0.1",
8393
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
8394
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
8395
+ "dev": true,
8396
+ "requires": {
8397
+ "is-extendable": "^0.1.0"
8398
+ }
8399
+ },
8400
+ "is-extendable": {
8401
+ "version": "0.1.1",
8402
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
8403
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
8404
+ "dev": true
8405
+ },
8406
+ "ms": {
8407
+ "version": "2.0.0",
8408
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
8409
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
8410
+ "dev": true
8411
+ }
8412
+ }
8413
+ },
8414
+ "snapdragon-node": {
8415
+ "version": "2.1.1",
8416
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
8417
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
8418
+ "dev": true,
8419
+ "requires": {
8420
+ "define-property": "^1.0.0",
8421
+ "isobject": "^3.0.0",
8422
+ "snapdragon-util": "^3.0.1"
8423
+ },
8424
+ "dependencies": {
8425
+ "define-property": {
8426
+ "version": "1.0.0",
8427
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
8428
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
8429
+ "dev": true,
8430
+ "requires": {
8431
+ "is-descriptor": "^1.0.0"
8432
+ }
8433
+ },
8434
+ "is-accessor-descriptor": {
8435
+ "version": "1.0.0",
8436
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
8437
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
8438
+ "dev": true,
8439
+ "requires": {
8440
+ "kind-of": "^6.0.0"
8441
+ }
8442
+ },
8443
+ "is-data-descriptor": {
8444
+ "version": "1.0.0",
8445
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
8446
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
8447
+ "dev": true,
8448
+ "requires": {
8449
+ "kind-of": "^6.0.0"
8450
+ }
8451
+ },
8452
+ "is-descriptor": {
8453
+ "version": "1.0.2",
8454
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
8455
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
8456
+ "dev": true,
8457
+ "requires": {
8458
+ "is-accessor-descriptor": "^1.0.0",
8459
+ "is-data-descriptor": "^1.0.0",
8460
+ "kind-of": "^6.0.2"
8461
+ }
8462
+ }
8463
+ }
8464
+ },
8465
+ "snapdragon-util": {
8466
+ "version": "3.0.1",
8467
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
8468
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
8469
+ "dev": true,
8470
+ "requires": {
8471
+ "kind-of": "^3.2.0"
8472
+ },
8473
+ "dependencies": {
8474
+ "kind-of": {
8475
+ "version": "3.2.2",
8476
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
8477
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
8478
+ "dev": true,
8479
+ "requires": {
8480
+ "is-buffer": "^1.1.5"
8481
+ }
8482
+ }
8483
+ }
8484
+ },
8485
+ "sockjs": {
8486
+ "version": "0.3.19",
8487
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
8488
+ "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
8489
+ "dev": true,
8490
+ "requires": {
8491
+ "faye-websocket": "^0.10.0",
8492
+ "uuid": "^3.0.1"
8493
+ }
8494
+ },
8495
+ "sockjs-client": {
8496
+ "version": "1.3.0",
8497
+ "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz",
8498
+ "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==",
8499
+ "dev": true,
8500
+ "requires": {
8501
+ "debug": "^3.2.5",
8502
+ "eventsource": "^1.0.7",
8503
+ "faye-websocket": "~0.11.1",
8504
+ "inherits": "^2.0.3",
8505
+ "json3": "^3.3.2",
8506
+ "url-parse": "^1.4.3"
8507
+ },
8508
+ "dependencies": {
8509
+ "debug": {
8510
+ "version": "3.2.6",
8511
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
8512
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
8513
+ "dev": true,
8514
+ "requires": {
8515
+ "ms": "^2.1.1"
8516
+ }
8517
+ },
8518
+ "faye-websocket": {
8519
+ "version": "0.11.3",
8520
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
8521
+ "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
8522
+ "dev": true,
8523
+ "requires": {
8524
+ "websocket-driver": ">=0.5.1"
8525
+ }
8526
+ }
8527
+ }
8528
+ },
8529
+ "source-list-map": {
8530
+ "version": "2.0.1",
8531
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
8532
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
8533
+ "dev": true
8534
+ },
8535
+ "source-map": {
8536
+ "version": "0.5.7",
8537
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
8538
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
8539
+ "dev": true
8540
+ },
8541
+ "source-map-resolve": {
8542
+ "version": "0.5.2",
8543
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
8544
+ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
8545
+ "dev": true,
8546
+ "requires": {
8547
+ "atob": "^2.1.1",
8548
+ "decode-uri-component": "^0.2.0",
8549
+ "resolve-url": "^0.2.1",
8550
+ "source-map-url": "^0.4.0",
8551
+ "urix": "^0.1.0"
8552
+ }
8553
+ },
8554
+ "source-map-support": {
8555
+ "version": "0.5.12",
8556
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
8557
+ "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
8558
+ "dev": true,
8559
+ "requires": {
8560
+ "buffer-from": "^1.0.0",
8561
+ "source-map": "^0.6.0"
8562
+ },
8563
+ "dependencies": {
8564
+ "source-map": {
8565
+ "version": "0.6.1",
8566
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
8567
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
8568
+ "dev": true
8569
+ }
8570
+ }
8571
+ },
8572
+ "source-map-url": {
8573
+ "version": "0.4.0",
8574
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
8575
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
8576
+ "dev": true
8577
+ },
8578
+ "spdy": {
8579
+ "version": "4.0.0",
8580
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz",
8581
+ "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==",
8582
+ "dev": true,
8583
+ "requires": {
8584
+ "debug": "^4.1.0",
8585
+ "handle-thing": "^2.0.0",
8586
+ "http-deceiver": "^1.2.7",
8587
+ "select-hose": "^2.0.0",
8588
+ "spdy-transport": "^3.0.0"
8589
+ }
8590
+ },
8591
+ "spdy-transport": {
8592
+ "version": "3.0.0",
8593
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
8594
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
8595
+ "dev": true,
8596
+ "requires": {
8597
+ "debug": "^4.1.0",
8598
+ "detect-node": "^2.0.4",
8599
+ "hpack.js": "^2.1.6",
8600
+ "obuf": "^1.1.2",
8601
+ "readable-stream": "^3.0.6",
8602
+ "wbuf": "^1.7.3"
8603
+ },
8604
+ "dependencies": {
8605
+ "readable-stream": {
8606
+ "version": "3.4.0",
8607
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
8608
+ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
8609
+ "dev": true,
8610
+ "requires": {
8611
+ "inherits": "^2.0.3",
8612
+ "string_decoder": "^1.1.1",
8613
+ "util-deprecate": "^1.0.1"
8614
+ }
8615
+ }
8616
+ }
8617
+ },
8618
+ "split-string": {
8619
+ "version": "3.1.0",
8620
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
8621
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
8622
+ "dev": true,
8623
+ "requires": {
8624
+ "extend-shallow": "^3.0.0"
8625
+ }
8626
+ },
8627
+ "sprintf-js": {
8628
+ "version": "1.0.3",
8629
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
8630
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
8631
+ "dev": true
8632
+ },
8633
+ "ssri": {
8634
+ "version": "6.0.1",
8635
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
8636
+ "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
8637
+ "dev": true,
8638
+ "requires": {
8639
+ "figgy-pudding": "^3.5.1"
8640
+ }
8641
+ },
8642
+ "stable": {
8643
+ "version": "0.1.8",
8644
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
8645
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
8646
+ "dev": true
8647
+ },
8648
+ "stackframe": {
8649
+ "version": "1.0.4",
8650
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz",
8651
+ "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==",
8652
+ "dev": true
8653
+ },
8654
+ "static-extend": {
8655
+ "version": "0.1.2",
8656
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
8657
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
8658
+ "dev": true,
8659
+ "requires": {
8660
+ "define-property": "^0.2.5",
8661
+ "object-copy": "^0.1.0"
8662
+ },
8663
+ "dependencies": {
8664
+ "define-property": {
8665
+ "version": "0.2.5",
8666
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
8667
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
8668
+ "dev": true,
8669
+ "requires": {
8670
+ "is-descriptor": "^0.1.0"
8671
+ }
8672
+ }
8673
+ }
8674
+ },
8675
+ "statuses": {
8676
+ "version": "1.5.0",
8677
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
8678
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
8679
+ "dev": true
8680
+ },
8681
+ "stream-browserify": {
8682
+ "version": "2.0.2",
8683
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
8684
+ "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
8685
+ "dev": true,
8686
+ "requires": {
8687
+ "inherits": "~2.0.1",
8688
+ "readable-stream": "^2.0.2"
8689
+ }
8690
+ },
8691
+ "stream-each": {
8692
+ "version": "1.2.3",
8693
+ "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
8694
+ "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
8695
+ "dev": true,
8696
+ "requires": {
8697
+ "end-of-stream": "^1.1.0",
8698
+ "stream-shift": "^1.0.0"
8699
+ }
8700
+ },
8701
+ "stream-http": {
8702
+ "version": "2.8.3",
8703
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
8704
+ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
8705
+ "dev": true,
8706
+ "requires": {
8707
+ "builtin-status-codes": "^3.0.0",
8708
+ "inherits": "^2.0.1",
8709
+ "readable-stream": "^2.3.6",
8710
+ "to-arraybuffer": "^1.0.0",
8711
+ "xtend": "^4.0.0"
8712
+ }
8713
+ },
8714
+ "stream-shift": {
8715
+ "version": "1.0.0",
8716
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
8717
+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
8718
+ "dev": true
8719
+ },
8720
+ "string-width": {
8721
+ "version": "2.1.1",
8722
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
8723
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
8724
+ "dev": true,
8725
+ "requires": {
8726
+ "is-fullwidth-code-point": "^2.0.0",
8727
+ "strip-ansi": "^4.0.0"
8728
+ },
8729
+ "dependencies": {
8730
+ "ansi-regex": {
8731
+ "version": "3.0.0",
8732
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
8733
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
8734
+ "dev": true
8735
+ },
8736
+ "strip-ansi": {
8737
+ "version": "4.0.0",
8738
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
8739
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
8740
+ "dev": true,
8741
+ "requires": {
8742
+ "ansi-regex": "^3.0.0"
8743
+ }
8744
+ }
8745
+ }
8746
+ },
8747
+ "string_decoder": {
8748
+ "version": "1.1.1",
8749
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
8750
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
8751
+ "dev": true,
8752
+ "requires": {
8753
+ "safe-buffer": "~5.1.0"
8754
+ }
8755
+ },
8756
+ "strip-ansi": {
8757
+ "version": "3.0.1",
8758
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
8759
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
8760
+ "dev": true,
8761
+ "requires": {
8762
+ "ansi-regex": "^2.0.0"
8763
+ }
8764
+ },
8765
+ "strip-eof": {
8766
+ "version": "1.0.0",
8767
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
8768
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
8769
+ "dev": true
8770
+ },
8771
+ "style-loader": {
8772
+ "version": "0.23.1",
8773
+ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz",
8774
+ "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==",
8775
+ "dev": true,
8776
+ "requires": {
8777
+ "loader-utils": "^1.1.0",
8778
+ "schema-utils": "^1.0.0"
8779
+ },
8780
+ "dependencies": {
8781
+ "schema-utils": {
8782
+ "version": "1.0.0",
8783
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
8784
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
8785
+ "dev": true,
8786
+ "requires": {
8787
+ "ajv": "^6.1.0",
8788
+ "ajv-errors": "^1.0.0",
8789
+ "ajv-keywords": "^3.1.0"
8790
+ }
8791
+ }
8792
+ }
8793
+ },
8794
+ "stylehacks": {
8795
+ "version": "4.0.3",
8796
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
8797
+ "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
8798
+ "dev": true,
8799
+ "requires": {
8800
+ "browserslist": "^4.0.0",
8801
+ "postcss": "^7.0.0",
8802
+ "postcss-selector-parser": "^3.0.0"
8803
+ },
8804
+ "dependencies": {
8805
+ "postcss-selector-parser": {
8806
+ "version": "3.1.1",
8807
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz",
8808
+ "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
8809
+ "dev": true,
8810
+ "requires": {
8811
+ "dot-prop": "^4.1.1",
8812
+ "indexes-of": "^1.0.1",
8813
+ "uniq": "^1.0.1"
8814
+ }
8815
+ }
8816
+ }
8817
+ },
8818
+ "supports-color": {
8819
+ "version": "5.5.0",
8820
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
8821
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
8822
+ "dev": true,
8823
+ "requires": {
8824
+ "has-flag": "^3.0.0"
8825
+ }
8826
+ },
8827
+ "svgo": {
8828
+ "version": "1.3.0",
8829
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz",
8830
+ "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==",
8831
+ "dev": true,
8832
+ "requires": {
8833
+ "chalk": "^2.4.1",
8834
+ "coa": "^2.0.2",
8835
+ "css-select": "^2.0.0",
8836
+ "css-select-base-adapter": "^0.1.1",
8837
+ "css-tree": "1.0.0-alpha.33",
8838
+ "csso": "^3.5.1",
8839
+ "js-yaml": "^3.13.1",
8840
+ "mkdirp": "~0.5.1",
8841
+ "object.values": "^1.1.0",
8842
+ "sax": "~1.2.4",
8843
+ "stable": "^0.1.8",
8844
+ "unquote": "~1.1.1",
8845
+ "util.promisify": "~1.0.0"
8846
+ }
8847
+ },
8848
+ "tapable": {
8849
+ "version": "1.1.3",
8850
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
8851
+ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
8852
+ "dev": true
8853
+ },
8854
+ "terser": {
8855
+ "version": "3.17.0",
8856
+ "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz",
8857
+ "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==",
8858
+ "dev": true,
8859
+ "requires": {
8860
+ "commander": "^2.19.0",
8861
+ "source-map": "~0.6.1",
8862
+ "source-map-support": "~0.5.10"
8863
+ },
8864
+ "dependencies": {
8865
+ "commander": {
8866
+ "version": "2.20.0",
8867
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
8868
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
8869
+ "dev": true
8870
+ },
8871
+ "source-map": {
8872
+ "version": "0.6.1",
8873
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
8874
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
8875
+ "dev": true
8876
+ }
8877
+ }
8878
+ },
8879
+ "terser-webpack-plugin": {
8880
+ "version": "1.3.0",
8881
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz",
8882
+ "integrity": "sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==",
8883
+ "dev": true,
8884
+ "requires": {
8885
+ "cacache": "^11.3.2",
8886
+ "find-cache-dir": "^2.0.0",
8887
+ "is-wsl": "^1.1.0",
8888
+ "loader-utils": "^1.2.3",
8889
+ "schema-utils": "^1.0.0",
8890
+ "serialize-javascript": "^1.7.0",
8891
+ "source-map": "^0.6.1",
8892
+ "terser": "^4.0.0",
8893
+ "webpack-sources": "^1.3.0",
8894
+ "worker-farm": "^1.7.0"
8895
+ },
8896
+ "dependencies": {
8897
+ "commander": {
8898
+ "version": "2.20.0",
8899
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
8900
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
8901
+ "dev": true
8902
+ },
8903
+ "schema-utils": {
8904
+ "version": "1.0.0",
8905
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
8906
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
8907
+ "dev": true,
8908
+ "requires": {
8909
+ "ajv": "^6.1.0",
8910
+ "ajv-errors": "^1.0.0",
8911
+ "ajv-keywords": "^3.1.0"
8912
+ }
8913
+ },
8914
+ "source-map": {
8915
+ "version": "0.6.1",
8916
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
8917
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
8918
+ "dev": true
8919
+ },
8920
+ "terser": {
8921
+ "version": "4.1.2",
8922
+ "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.2.tgz",
8923
+ "integrity": "sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw==",
8924
+ "dev": true,
8925
+ "requires": {
8926
+ "commander": "^2.20.0",
8927
+ "source-map": "~0.6.1",
8928
+ "source-map-support": "~0.5.12"
8929
+ }
8930
+ }
8931
+ }
8932
+ },
8933
+ "through": {
8934
+ "version": "2.3.8",
8935
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
8936
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
8937
+ "dev": true
8938
+ },
8939
+ "through2": {
8940
+ "version": "2.0.5",
8941
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
8942
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
8943
+ "dev": true,
8944
+ "requires": {
8945
+ "readable-stream": "~2.3.6",
8946
+ "xtend": "~4.0.1"
8947
+ }
8948
+ },
8949
+ "thunky": {
8950
+ "version": "1.0.3",
8951
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz",
8952
+ "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==",
8953
+ "dev": true
8954
+ },
8955
+ "timers-browserify": {
8956
+ "version": "2.0.10",
8957
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
8958
+ "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
8959
+ "dev": true,
8960
+ "requires": {
8961
+ "setimmediate": "^1.0.4"
8962
+ }
8963
+ },
8964
+ "timsort": {
8965
+ "version": "0.3.0",
8966
+ "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
8967
+ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
8968
+ "dev": true
8969
+ },
8970
+ "tmp": {
8971
+ "version": "0.0.33",
8972
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
8973
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
8974
+ "dev": true,
8975
+ "requires": {
8976
+ "os-tmpdir": "~1.0.2"
8977
+ }
8978
+ },
8979
+ "to-arraybuffer": {
8980
+ "version": "1.0.1",
8981
+ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
8982
+ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
8983
+ "dev": true
8984
+ },
8985
+ "to-fast-properties": {
8986
+ "version": "2.0.0",
8987
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
8988
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
8989
+ "dev": true
8990
+ },
8991
+ "to-object-path": {
8992
+ "version": "0.3.0",
8993
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
8994
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
8995
+ "dev": true,
8996
+ "requires": {
8997
+ "kind-of": "^3.0.2"
8998
+ },
8999
+ "dependencies": {
9000
+ "kind-of": {
9001
+ "version": "3.2.2",
9002
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
9003
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
9004
+ "dev": true,
9005
+ "requires": {
9006
+ "is-buffer": "^1.1.5"
9007
+ }
9008
+ }
9009
+ }
9010
+ },
9011
+ "to-regex": {
9012
+ "version": "3.0.2",
9013
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
9014
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
9015
+ "dev": true,
9016
+ "requires": {
9017
+ "define-property": "^2.0.2",
9018
+ "extend-shallow": "^3.0.2",
9019
+ "regex-not": "^1.0.2",
9020
+ "safe-regex": "^1.1.0"
9021
+ }
9022
+ },
9023
+ "to-regex-range": {
9024
+ "version": "2.1.1",
9025
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
9026
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
9027
+ "dev": true,
9028
+ "requires": {
9029
+ "is-number": "^3.0.0",
9030
+ "repeat-string": "^1.6.1"
9031
+ }
9032
+ },
9033
+ "toidentifier": {
9034
+ "version": "1.0.0",
9035
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
9036
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
9037
+ "dev": true
9038
+ },
9039
+ "trim-right": {
9040
+ "version": "1.0.1",
9041
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
9042
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
9043
+ "dev": true
9044
+ },
9045
+ "tslib": {
9046
+ "version": "1.10.0",
9047
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
9048
+ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
9049
+ "dev": true
9050
+ },
9051
+ "tty-browserify": {
9052
+ "version": "0.0.0",
9053
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
9054
+ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
9055
+ "dev": true
9056
+ },
9057
+ "type-is": {
9058
+ "version": "1.6.18",
9059
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
9060
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
9061
+ "dev": true,
9062
+ "requires": {
9063
+ "media-typer": "0.3.0",
9064
+ "mime-types": "~2.1.24"
9065
+ }
9066
+ },
9067
+ "typedarray": {
9068
+ "version": "0.0.6",
9069
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
9070
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
9071
+ "dev": true
9072
+ },
9073
+ "uglify-js": {
9074
+ "version": "3.4.10",
9075
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz",
9076
+ "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==",
9077
+ "dev": true,
9078
+ "requires": {
9079
+ "commander": "~2.19.0",
9080
+ "source-map": "~0.6.1"
9081
+ },
9082
+ "dependencies": {
9083
+ "commander": {
9084
+ "version": "2.19.0",
9085
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
9086
+ "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
9087
+ "dev": true
9088
+ },
9089
+ "source-map": {
9090
+ "version": "0.6.1",
9091
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
9092
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
9093
+ "dev": true
9094
+ }
9095
+ }
9096
+ },
9097
+ "unicode-canonical-property-names-ecmascript": {
9098
+ "version": "1.0.4",
9099
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
9100
+ "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
9101
+ "dev": true
9102
+ },
9103
+ "unicode-match-property-ecmascript": {
9104
+ "version": "1.0.4",
9105
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
9106
+ "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
9107
+ "dev": true,
9108
+ "requires": {
9109
+ "unicode-canonical-property-names-ecmascript": "^1.0.4",
9110
+ "unicode-property-aliases-ecmascript": "^1.0.4"
9111
+ }
9112
+ },
9113
+ "unicode-match-property-value-ecmascript": {
9114
+ "version": "1.1.0",
9115
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz",
9116
+ "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==",
9117
+ "dev": true
9118
+ },
9119
+ "unicode-property-aliases-ecmascript": {
9120
+ "version": "1.0.5",
9121
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz",
9122
+ "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==",
9123
+ "dev": true
9124
+ },
9125
+ "union-value": {
9126
+ "version": "1.0.1",
9127
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
9128
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
9129
+ "dev": true,
9130
+ "requires": {
9131
+ "arr-union": "^3.1.0",
9132
+ "get-value": "^2.0.6",
9133
+ "is-extendable": "^0.1.1",
9134
+ "set-value": "^2.0.1"
9135
+ },
9136
+ "dependencies": {
9137
+ "is-extendable": {
9138
+ "version": "0.1.1",
9139
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
9140
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
9141
+ "dev": true
9142
+ }
9143
+ }
9144
+ },
9145
+ "uniq": {
9146
+ "version": "1.0.1",
9147
+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
9148
+ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
9149
+ "dev": true
9150
+ },
9151
+ "uniqs": {
9152
+ "version": "2.0.0",
9153
+ "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
9154
+ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
9155
+ "dev": true
9156
+ },
9157
+ "unique-filename": {
9158
+ "version": "1.1.1",
9159
+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
9160
+ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
9161
+ "dev": true,
9162
+ "requires": {
9163
+ "unique-slug": "^2.0.0"
9164
+ }
9165
+ },
9166
+ "unique-slug": {
9167
+ "version": "2.0.2",
9168
+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
9169
+ "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
9170
+ "dev": true,
9171
+ "requires": {
9172
+ "imurmurhash": "^0.1.4"
9173
+ }
9174
+ },
9175
+ "universalify": {
9176
+ "version": "0.1.2",
9177
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
9178
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
9179
+ "dev": true
9180
+ },
9181
+ "unpipe": {
9182
+ "version": "1.0.0",
9183
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
9184
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
9185
+ "dev": true
9186
+ },
9187
+ "unquote": {
9188
+ "version": "1.1.1",
9189
+ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
9190
+ "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
9191
+ "dev": true
9192
+ },
9193
+ "unset-value": {
9194
+ "version": "1.0.0",
9195
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
9196
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
9197
+ "dev": true,
9198
+ "requires": {
9199
+ "has-value": "^0.3.1",
9200
+ "isobject": "^3.0.0"
9201
+ },
9202
+ "dependencies": {
9203
+ "has-value": {
9204
+ "version": "0.3.1",
9205
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
9206
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
9207
+ "dev": true,
9208
+ "requires": {
9209
+ "get-value": "^2.0.3",
9210
+ "has-values": "^0.1.4",
9211
+ "isobject": "^2.0.0"
9212
+ },
9213
+ "dependencies": {
9214
+ "isobject": {
9215
+ "version": "2.1.0",
9216
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
9217
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
9218
+ "dev": true,
9219
+ "requires": {
9220
+ "isarray": "1.0.0"
9221
+ }
9222
+ }
9223
+ }
9224
+ },
9225
+ "has-values": {
9226
+ "version": "0.1.4",
9227
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
9228
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
9229
+ "dev": true
9230
+ }
9231
+ }
9232
+ },
9233
+ "upath": {
9234
+ "version": "1.1.2",
9235
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz",
9236
+ "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==",
9237
+ "dev": true
9238
+ },
9239
+ "upper-case": {
9240
+ "version": "1.1.3",
9241
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
9242
+ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
9243
+ "dev": true
9244
+ },
9245
+ "uri-js": {
9246
+ "version": "4.2.2",
9247
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
9248
+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
9249
+ "dev": true,
9250
+ "requires": {
9251
+ "punycode": "^2.1.0"
9252
+ }
9253
+ },
9254
+ "urix": {
9255
+ "version": "0.1.0",
9256
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
9257
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
9258
+ "dev": true
9259
+ },
9260
+ "url": {
9261
+ "version": "0.11.0",
9262
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
9263
+ "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
9264
+ "dev": true,
9265
+ "requires": {
9266
+ "punycode": "1.3.2",
9267
+ "querystring": "0.2.0"
9268
+ },
9269
+ "dependencies": {
9270
+ "punycode": {
9271
+ "version": "1.3.2",
9272
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
9273
+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
9274
+ "dev": true
9275
+ }
9276
+ }
9277
+ },
9278
+ "url-parse": {
9279
+ "version": "1.4.7",
9280
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
9281
+ "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
9282
+ "dev": true,
9283
+ "requires": {
9284
+ "querystringify": "^2.1.1",
9285
+ "requires-port": "^1.0.0"
9286
+ }
9287
+ },
9288
+ "use": {
9289
+ "version": "3.1.1",
9290
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
9291
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
9292
+ "dev": true
9293
+ },
9294
+ "util": {
9295
+ "version": "0.11.1",
9296
+ "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
9297
+ "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
9298
+ "dev": true,
9299
+ "requires": {
9300
+ "inherits": "2.0.3"
9301
+ },
9302
+ "dependencies": {
9303
+ "inherits": {
9304
+ "version": "2.0.3",
9305
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
9306
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
9307
+ "dev": true
9308
+ }
9309
+ }
9310
+ },
9311
+ "util-deprecate": {
9312
+ "version": "1.0.2",
9313
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
9314
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
9315
+ "dev": true
9316
+ },
9317
+ "util.promisify": {
9318
+ "version": "1.0.0",
9319
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
9320
+ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
9321
+ "dev": true,
9322
+ "requires": {
9323
+ "define-properties": "^1.1.2",
9324
+ "object.getownpropertydescriptors": "^2.0.3"
9325
+ }
9326
+ },
9327
+ "utils-merge": {
9328
+ "version": "1.0.1",
9329
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
9330
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
9331
+ "dev": true
9332
+ },
9333
+ "uuid": {
9334
+ "version": "3.3.2",
9335
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
9336
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
9337
+ "dev": true
9338
+ },
9339
+ "v8-compile-cache": {
9340
+ "version": "2.0.3",
9341
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz",
9342
+ "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==",
9343
+ "dev": true
9344
+ },
9345
+ "vary": {
9346
+ "version": "1.1.2",
9347
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
9348
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
9349
+ "dev": true
9350
+ },
9351
+ "vendors": {
9352
+ "version": "1.0.3",
9353
+ "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz",
9354
+ "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==",
9355
+ "dev": true
9356
+ },
9357
+ "vm-browserify": {
9358
+ "version": "1.1.0",
9359
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz",
9360
+ "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==",
9361
+ "dev": true
9362
+ },
9363
+ "vue-hot-reload-api": {
9364
+ "version": "2.3.3",
9365
+ "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz",
9366
+ "integrity": "sha512-KmvZVtmM26BQOMK1rwUZsrqxEGeKiYSZGA7SNWE6uExx8UX/cj9hq2MRV/wWC3Cq6AoeDGk57rL9YMFRel/q+g==",
9367
+ "dev": true
9368
+ },
9369
+ "vue-loader": {
9370
+ "version": "15.7.0",
9371
+ "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.7.0.tgz",
9372
+ "integrity": "sha512-x+NZ4RIthQOxcFclEcs8sXGEWqnZHodL2J9Vq+hUz+TDZzBaDIh1j3d9M2IUlTjtrHTZy4uMuRdTi8BGws7jLA==",
9373
+ "dev": true,
9374
+ "requires": {
9375
+ "@vue/component-compiler-utils": "^2.5.1",
9376
+ "hash-sum": "^1.0.2",
9377
+ "loader-utils": "^1.1.0",
9378
+ "vue-hot-reload-api": "^2.3.0",
9379
+ "vue-style-loader": "^4.1.0"
9380
+ }
9381
+ },
9382
+ "vue-style-loader": {
9383
+ "version": "4.1.2",
9384
+ "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz",
9385
+ "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==",
9386
+ "dev": true,
9387
+ "requires": {
9388
+ "hash-sum": "^1.0.2",
9389
+ "loader-utils": "^1.0.2"
9390
+ }
9391
+ },
9392
+ "vue-template-compiler": {
9393
+ "version": "2.6.10",
9394
+ "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.10.tgz",
9395
+ "integrity": "sha512-jVZkw4/I/HT5ZMvRnhv78okGusqe0+qH2A0Em0Cp8aq78+NK9TII263CDVz2QXZsIT+yyV/gZc/j/vlwa+Epyg==",
9396
+ "dev": true,
9397
+ "requires": {
9398
+ "de-indent": "^1.0.2",
9399
+ "he": "^1.1.0"
9400
+ }
9401
+ },
9402
+ "vue-template-es2015-compiler": {
9403
+ "version": "1.9.1",
9404
+ "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz",
9405
+ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
9406
+ "dev": true
9407
+ },
9408
+ "watchpack": {
9409
+ "version": "1.6.0",
9410
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",
9411
+ "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==",
9412
+ "dev": true,
9413
+ "requires": {
9414
+ "chokidar": "^2.0.2",
9415
+ "graceful-fs": "^4.1.2",
9416
+ "neo-async": "^2.5.0"
9417
+ }
9418
+ },
9419
+ "wbuf": {
9420
+ "version": "1.7.3",
9421
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
9422
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
9423
+ "dev": true,
9424
+ "requires": {
9425
+ "minimalistic-assert": "^1.0.0"
9426
+ }
9427
+ },
9428
+ "webpack": {
9429
+ "version": "4.36.1",
9430
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.36.1.tgz",
9431
+ "integrity": "sha512-Ej01/N9W8DVyhEpeQnbUdGvOECw0L46FxS12cCOs8gSK7bhUlrbHRnWkjiXckGlHjUrmL89kDpTRIkUk6Y+fKg==",
9432
+ "dev": true,
9433
+ "requires": {
9434
+ "@webassemblyjs/ast": "1.8.5",
9435
+ "@webassemblyjs/helper-module-context": "1.8.5",
9436
+ "@webassemblyjs/wasm-edit": "1.8.5",
9437
+ "@webassemblyjs/wasm-parser": "1.8.5",
9438
+ "acorn": "^6.2.0",
9439
+ "ajv": "^6.1.0",
9440
+ "ajv-keywords": "^3.1.0",
9441
+ "chrome-trace-event": "^1.0.0",
9442
+ "enhanced-resolve": "^4.1.0",
9443
+ "eslint-scope": "^4.0.0",
9444
+ "json-parse-better-errors": "^1.0.2",
9445
+ "loader-runner": "^2.3.0",
9446
+ "loader-utils": "^1.1.0",
9447
+ "memory-fs": "~0.4.1",
9448
+ "micromatch": "^3.1.8",
9449
+ "mkdirp": "~0.5.0",
9450
+ "neo-async": "^2.5.0",
9451
+ "node-libs-browser": "^2.0.0",
9452
+ "schema-utils": "^1.0.0",
9453
+ "tapable": "^1.1.0",
9454
+ "terser-webpack-plugin": "^1.1.0",
9455
+ "watchpack": "^1.5.0",
9456
+ "webpack-sources": "^1.3.0"
9457
+ },
9458
+ "dependencies": {
9459
+ "schema-utils": {
9460
+ "version": "1.0.0",
9461
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
9462
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
9463
+ "dev": true,
9464
+ "requires": {
9465
+ "ajv": "^6.1.0",
9466
+ "ajv-errors": "^1.0.0",
9467
+ "ajv-keywords": "^3.1.0"
9468
+ }
9469
+ }
9470
+ }
9471
+ },
9472
+ "webpack-cli": {
9473
+ "version": "3.3.6",
9474
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.6.tgz",
9475
+ "integrity": "sha512-0vEa83M7kJtxK/jUhlpZ27WHIOndz5mghWL2O53kiDoA9DIxSKnfqB92LoqEn77cT4f3H2cZm1BMEat/6AZz3A==",
9476
+ "dev": true,
9477
+ "requires": {
9478
+ "chalk": "2.4.2",
9479
+ "cross-spawn": "6.0.5",
9480
+ "enhanced-resolve": "4.1.0",
9481
+ "findup-sync": "3.0.0",
9482
+ "global-modules": "2.0.0",
9483
+ "import-local": "2.0.0",
9484
+ "interpret": "1.2.0",
9485
+ "loader-utils": "1.2.3",
9486
+ "supports-color": "6.1.0",
9487
+ "v8-compile-cache": "2.0.3",
9488
+ "yargs": "13.2.4"
9489
+ },
9490
+ "dependencies": {
9491
+ "ansi-regex": {
9492
+ "version": "4.1.0",
9493
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
9494
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
9495
+ "dev": true
9496
+ },
9497
+ "string-width": {
9498
+ "version": "3.1.0",
9499
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
9500
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
9501
+ "dev": true,
9502
+ "requires": {
9503
+ "emoji-regex": "^7.0.1",
9504
+ "is-fullwidth-code-point": "^2.0.0",
9505
+ "strip-ansi": "^5.1.0"
9506
+ }
9507
+ },
9508
+ "strip-ansi": {
9509
+ "version": "5.2.0",
9510
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
9511
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
9512
+ "dev": true,
9513
+ "requires": {
9514
+ "ansi-regex": "^4.1.0"
9515
+ }
9516
+ },
9517
+ "supports-color": {
9518
+ "version": "6.1.0",
9519
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
9520
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
9521
+ "dev": true,
9522
+ "requires": {
9523
+ "has-flag": "^3.0.0"
9524
+ }
9525
+ },
9526
+ "yargs": {
9527
+ "version": "13.2.4",
9528
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz",
9529
+ "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==",
9530
+ "dev": true,
9531
+ "requires": {
9532
+ "cliui": "^5.0.0",
9533
+ "find-up": "^3.0.0",
9534
+ "get-caller-file": "^2.0.1",
9535
+ "os-locale": "^3.1.0",
9536
+ "require-directory": "^2.1.1",
9537
+ "require-main-filename": "^2.0.0",
9538
+ "set-blocking": "^2.0.0",
9539
+ "string-width": "^3.0.0",
9540
+ "which-module": "^2.0.0",
9541
+ "y18n": "^4.0.0",
9542
+ "yargs-parser": "^13.1.0"
9543
+ }
9544
+ }
9545
+ }
9546
+ },
9547
+ "webpack-dev-middleware": {
9548
+ "version": "3.7.0",
9549
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz",
9550
+ "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==",
9551
+ "dev": true,
9552
+ "requires": {
9553
+ "memory-fs": "^0.4.1",
9554
+ "mime": "^2.4.2",
9555
+ "range-parser": "^1.2.1",
9556
+ "webpack-log": "^2.0.0"
9557
+ },
9558
+ "dependencies": {
9559
+ "mime": {
9560
+ "version": "2.4.4",
9561
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
9562
+ "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
9563
+ "dev": true
9564
+ }
9565
+ }
9566
+ },
9567
+ "webpack-dev-server": {
9568
+ "version": "3.7.2",
9569
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz",
9570
+ "integrity": "sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew==",
9571
+ "dev": true,
9572
+ "requires": {
9573
+ "ansi-html": "0.0.7",
9574
+ "bonjour": "^3.5.0",
9575
+ "chokidar": "^2.1.6",
9576
+ "compression": "^1.7.4",
9577
+ "connect-history-api-fallback": "^1.6.0",
9578
+ "debug": "^4.1.1",
9579
+ "del": "^4.1.1",
9580
+ "express": "^4.17.1",
9581
+ "html-entities": "^1.2.1",
9582
+ "http-proxy-middleware": "^0.19.1",
9583
+ "import-local": "^2.0.0",
9584
+ "internal-ip": "^4.3.0",
9585
+ "ip": "^1.1.5",
9586
+ "killable": "^1.0.1",
9587
+ "loglevel": "^1.6.3",
9588
+ "opn": "^5.5.0",
9589
+ "p-retry": "^3.0.1",
9590
+ "portfinder": "^1.0.20",
9591
+ "schema-utils": "^1.0.0",
9592
+ "selfsigned": "^1.10.4",
9593
+ "semver": "^6.1.1",
9594
+ "serve-index": "^1.9.1",
9595
+ "sockjs": "0.3.19",
9596
+ "sockjs-client": "1.3.0",
9597
+ "spdy": "^4.0.0",
9598
+ "strip-ansi": "^3.0.1",
9599
+ "supports-color": "^6.1.0",
9600
+ "url": "^0.11.0",
9601
+ "webpack-dev-middleware": "^3.7.0",
9602
+ "webpack-log": "^2.0.0",
9603
+ "yargs": "12.0.5"
9604
+ },
9605
+ "dependencies": {
9606
+ "schema-utils": {
9607
+ "version": "1.0.0",
9608
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
9609
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
9610
+ "dev": true,
9611
+ "requires": {
9612
+ "ajv": "^6.1.0",
9613
+ "ajv-errors": "^1.0.0",
9614
+ "ajv-keywords": "^3.1.0"
9615
+ }
9616
+ },
9617
+ "semver": {
9618
+ "version": "6.2.0",
9619
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz",
9620
+ "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==",
9621
+ "dev": true
9622
+ },
9623
+ "supports-color": {
9624
+ "version": "6.1.0",
9625
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
9626
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
9627
+ "dev": true,
9628
+ "requires": {
9629
+ "has-flag": "^3.0.0"
9630
+ }
9631
+ }
9632
+ }
9633
+ },
9634
+ "webpack-log": {
9635
+ "version": "2.0.0",
9636
+ "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
9637
+ "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
9638
+ "dev": true,
9639
+ "requires": {
9640
+ "ansi-colors": "^3.0.0",
9641
+ "uuid": "^3.3.2"
9642
+ }
9643
+ },
9644
+ "webpack-merge": {
9645
+ "version": "4.2.1",
9646
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz",
9647
+ "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==",
9648
+ "dev": true,
9649
+ "requires": {
9650
+ "lodash": "^4.17.5"
9651
+ }
9652
+ },
9653
+ "webpack-notifier": {
9654
+ "version": "1.8.0",
9655
+ "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.8.0.tgz",
9656
+ "integrity": "sha512-I6t76NoPe5DZCCm5geELmDV2wlJ89LbU425uN6T2FG8Ywrrt1ZcUMz6g8yWGNg4pttqTPFQJYUPjWAlzUEQ+cQ==",
9657
+ "dev": true,
9658
+ "requires": {
9659
+ "node-notifier": "^5.1.2",
9660
+ "object-assign": "^4.1.0",
9661
+ "strip-ansi": "^3.0.1"
9662
+ }
9663
+ },
9664
+ "webpack-sources": {
9665
+ "version": "1.3.0",
9666
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
9667
+ "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
9668
+ "dev": true,
9669
+ "requires": {
9670
+ "source-list-map": "^2.0.0",
9671
+ "source-map": "~0.6.1"
9672
+ },
9673
+ "dependencies": {
9674
+ "source-map": {
9675
+ "version": "0.6.1",
9676
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
9677
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
9678
+ "dev": true
9679
+ }
9680
+ }
9681
+ },
9682
+ "websocket-driver": {
9683
+ "version": "0.7.3",
9684
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz",
9685
+ "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==",
9686
+ "dev": true,
9687
+ "requires": {
9688
+ "http-parser-js": ">=0.4.0 <0.4.11",
9689
+ "safe-buffer": ">=5.1.0",
9690
+ "websocket-extensions": ">=0.1.1"
9691
+ }
9692
+ },
9693
+ "websocket-extensions": {
9694
+ "version": "0.1.3",
9695
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
9696
+ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
9697
+ "dev": true
9698
+ },
9699
+ "which": {
9700
+ "version": "1.3.1",
9701
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
9702
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
9703
+ "dev": true,
9704
+ "requires": {
9705
+ "isexe": "^2.0.0"
9706
+ }
9707
+ },
9708
+ "which-module": {
9709
+ "version": "2.0.0",
9710
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
9711
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
9712
+ "dev": true
9713
+ },
9714
+ "worker-farm": {
9715
+ "version": "1.7.0",
9716
+ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
9717
+ "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
9718
+ "dev": true,
9719
+ "requires": {
9720
+ "errno": "~0.1.7"
9721
+ }
9722
+ },
9723
+ "wrap-ansi": {
9724
+ "version": "5.1.0",
9725
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
9726
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
9727
+ "dev": true,
9728
+ "requires": {
9729
+ "ansi-styles": "^3.2.0",
9730
+ "string-width": "^3.0.0",
9731
+ "strip-ansi": "^5.0.0"
9732
+ },
9733
+ "dependencies": {
9734
+ "ansi-regex": {
9735
+ "version": "4.1.0",
9736
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
9737
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
9738
+ "dev": true
9739
+ },
9740
+ "string-width": {
9741
+ "version": "3.1.0",
9742
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
9743
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
9744
+ "dev": true,
9745
+ "requires": {
9746
+ "emoji-regex": "^7.0.1",
9747
+ "is-fullwidth-code-point": "^2.0.0",
9748
+ "strip-ansi": "^5.1.0"
9749
+ }
9750
+ },
9751
+ "strip-ansi": {
9752
+ "version": "5.2.0",
9753
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
9754
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
9755
+ "dev": true,
9756
+ "requires": {
9757
+ "ansi-regex": "^4.1.0"
9758
+ }
9759
+ }
9760
+ }
9761
+ },
9762
+ "wrappy": {
9763
+ "version": "1.0.2",
9764
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
9765
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
9766
+ "dev": true
9767
+ },
9768
+ "xtend": {
9769
+ "version": "4.0.2",
9770
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
9771
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
9772
+ "dev": true
9773
+ },
9774
+ "y18n": {
9775
+ "version": "4.0.0",
9776
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
9777
+ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
9778
+ "dev": true
9779
+ },
9780
+ "yallist": {
9781
+ "version": "3.0.3",
9782
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
9783
+ "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
9784
+ "dev": true
9785
+ },
9786
+ "yargs": {
9787
+ "version": "12.0.5",
9788
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
9789
+ "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
9790
+ "dev": true,
9791
+ "requires": {
9792
+ "cliui": "^4.0.0",
9793
+ "decamelize": "^1.2.0",
9794
+ "find-up": "^3.0.0",
9795
+ "get-caller-file": "^1.0.1",
9796
+ "os-locale": "^3.0.0",
9797
+ "require-directory": "^2.1.1",
9798
+ "require-main-filename": "^1.0.1",
9799
+ "set-blocking": "^2.0.0",
9800
+ "string-width": "^2.0.0",
9801
+ "which-module": "^2.0.0",
9802
+ "y18n": "^3.2.1 || ^4.0.0",
9803
+ "yargs-parser": "^11.1.1"
9804
+ },
9805
+ "dependencies": {
9806
+ "ansi-regex": {
9807
+ "version": "3.0.0",
9808
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
9809
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
9810
+ "dev": true
9811
+ },
9812
+ "cliui": {
9813
+ "version": "4.1.0",
9814
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
9815
+ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
9816
+ "dev": true,
9817
+ "requires": {
9818
+ "string-width": "^2.1.1",
9819
+ "strip-ansi": "^4.0.0",
9820
+ "wrap-ansi": "^2.0.0"
9821
+ }
9822
+ },
9823
+ "get-caller-file": {
9824
+ "version": "1.0.3",
9825
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
9826
+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
9827
+ "dev": true
9828
+ },
9829
+ "is-fullwidth-code-point": {
9830
+ "version": "1.0.0",
9831
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
9832
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
9833
+ "dev": true,
9834
+ "requires": {
9835
+ "number-is-nan": "^1.0.0"
9836
+ }
9837
+ },
9838
+ "require-main-filename": {
9839
+ "version": "1.0.1",
9840
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
9841
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
9842
+ "dev": true
9843
+ },
9844
+ "strip-ansi": {
9845
+ "version": "4.0.0",
9846
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
9847
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
9848
+ "dev": true,
9849
+ "requires": {
9850
+ "ansi-regex": "^3.0.0"
9851
+ }
9852
+ },
9853
+ "wrap-ansi": {
9854
+ "version": "2.1.0",
9855
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
9856
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
9857
+ "dev": true,
9858
+ "requires": {
9859
+ "string-width": "^1.0.1",
9860
+ "strip-ansi": "^3.0.1"
9861
+ },
9862
+ "dependencies": {
9863
+ "ansi-regex": {
9864
+ "version": "2.1.1",
9865
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
9866
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
9867
+ "dev": true
9868
+ },
9869
+ "string-width": {
9870
+ "version": "1.0.2",
9871
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
9872
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
9873
+ "dev": true,
9874
+ "requires": {
9875
+ "code-point-at": "^1.0.0",
9876
+ "is-fullwidth-code-point": "^1.0.0",
9877
+ "strip-ansi": "^3.0.0"
9878
+ }
9879
+ },
9880
+ "strip-ansi": {
9881
+ "version": "3.0.1",
9882
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
9883
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
9884
+ "dev": true,
9885
+ "requires": {
9886
+ "ansi-regex": "^2.0.0"
9887
+ }
9888
+ }
9889
+ }
9890
+ },
9891
+ "yargs-parser": {
9892
+ "version": "11.1.1",
9893
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
9894
+ "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
9895
+ "dev": true,
9896
+ "requires": {
9897
+ "camelcase": "^5.0.0",
9898
+ "decamelize": "^1.2.0"
9899
+ }
9900
+ }
9901
+ }
9902
+ },
9903
+ "yargs-parser": {
9904
+ "version": "13.1.1",
9905
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
9906
+ "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
9907
+ "dev": true,
9908
+ "requires": {
9909
+ "camelcase": "^5.0.0",
9910
+ "decamelize": "^1.2.0"
9911
+ }
9912
+ }
9913
+ }
9914
+ }
addons/members-block-permissions/package.json ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-block-permissions",
3
+ "version": "1.0.0",
4
+ "author": "WPTRT",
5
+ "license": "GPL-2.0+",
6
+ "homepage": "https://github.com/WPTRT/customize-section-button",
7
+ "main": "",
8
+ "scripts": {
9
+ "dev": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
10
+ "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
11
+ "prod": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
12
+ "export": "cross-env export=1 NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
13
+ "i18n": "npm run i18n:textdomain && npm run i18n:pot",
14
+ "i18n:textdomain": "npx wpi18n addtextdomain --exclude=vendor,node_modules",
15
+ "i18n:pot": "npx wpi18n makepot --domain-path=/resources/lang"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/WPTRT/customize-section-button.git"
20
+ },
21
+ "bugs": {
22
+ "url": "https://github.com/WPTRT/customize-section-button/issues"
23
+ },
24
+ "devDependencies": {
25
+ "@babel/preset-react": "^7.0.0",
26
+ "cross-env": "^5.2.0",
27
+ "laravel-mix": "^4.0.16",
28
+ "node-wp-i18n": "^1.2.3",
29
+ "postcss-preset-env": "^6.6.0",
30
+ "rimraf": "^3.0.0",
31
+ "sass": "^1.22.0",
32
+ "sass-loader": "^7.1.0",
33
+ "vue-template-compiler": "^2.6.10"
34
+ },
35
+ "dependencies": {}
36
+ }
addons/members-block-permissions/public/css/editor.css ADDED
@@ -0,0 +1 @@
 
1
+ .edit-post-settings-sidebar__panel-block .members-bp-controls .members-bp-notice{margin-bottom:24px}.edit-post-settings-sidebar__panel-block .members-bp-controls .members-bp-notice .components-notice{margin:0}.edit-post-settings-sidebar__panel-block .members-bp-controls .members-bp-notice .components-notice__content{margin:1em 1em 1em 0}.edit-post-settings-sidebar__panel-block .members-bp-controls .members-bp-checklist__panel{padding:8px;margin-bottom:24px}.edit-post-settings-sidebar__panel-block .members-bp-controls .members-bp-checklist__label{display:block;margin-bottom:4px}.edit-post-settings-sidebar__panel-block .members-bp-controls .members-bp-checklist__control{margin-bottom:0}
addons/members-block-permissions/public/js/editor.js ADDED
@@ -0,0 +1 @@
 
1
+ !function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=0)}({"+c5n":function(e,t){var n=lodash.assign;(0,wp.hooks.addFilter)("blocks.registerBlockType","members/block/permissions/register",function(e,t){return e.attributes=n(e.attributes,{blockPermissionsCondition:{type:"string"},blockPermissionsType:{type:"string"},blockPermissionsUserStatus:{type:"string"},blockPermissionsRoles:{type:"array"},blockPermissionsCap:{type:"string"},blockPermissionsMessage:{type:"string"}}),e})},0:function(e,t,n){n("pNZs"),e.exports=n("iY67")},"9tPo":function(e,t){e.exports=function(e){var t="undefined"!=typeof window&&window.location;if(!t)throw new Error("fixUrls requires window.location");if(!e||"string"!=typeof e)return e;var n=t.protocol+"//"+t.host,r=n+t.pathname.replace(/\/[^\/]*$/,"/");return e.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,function(e,t){var o,i=t.trim().replace(/^"(.*)"$/,function(e,t){return t}).replace(/^'(.*)'$/,function(e,t){return t});return/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(i)?e:(o=0===i.indexOf("//")?i:0===i.indexOf("/")?n+i:r+i.replace(/^\.\//,""),"url("+JSON.stringify(o)+")")})}},I1BE:function(e,t){e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var n=function(e,t){var n=e[1]||"",r=e[3];if(!r)return n;if(t&&"function"==typeof btoa){var o=(s=r,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(s))))+" */"),i=r.sources.map(function(e){return"/*# sourceURL="+r.sourceRoot+e+" */"});return[n].concat(i).concat([o]).join("\n")}var s;return[n].join("\n")}(t,e);return t[2]?"@media "+t[2]+"{"+n+"}":n}).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var r={},o=0;o<this.length;o++){var i=this[o][0];"number"==typeof i&&(r[i]=!0)}for(o=0;o<e.length;o++){var s=e[o];"number"==typeof s[0]&&r[s[0]]||(n&&!s[2]?s[2]=n:n&&(s[2]="("+s[2]+") and ("+n+")"),t.push(s))}},t}},"PDM/":function(e,t,n){var r=n("RwBp");"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n("aET+")(r,o);r.locals&&(e.exports=r.locals)},RwBp:function(e,t,n){(e.exports=n("I1BE")(!1)).push([e.i,".members-bp-memberpress-upgrade {\n\tbackground-color: #f5f5f5;\n\tpadding: 20px;\n\tmargin-bottom: 20px;\n}\n\n.members-bp-memberpress-upgrade__cta-button {\n\tbackground-color: #06429e;\n\tcolor: #fff;\n\ttext-decoration: none;\n\tborder-radius: 300px;\n\tmargin: 20px auto 0;\n\twidth: auto;\n\ttext-align: center;\n\tmax-width: 200px;\n\tpadding: 10px;\n\tdisplay: block;\n\theight: auto;\n}\n\n.members-bp-memberpress-upgrade__cta-button:hover {\n\tcolor: #fff;\n}",""])},"aET+":function(e,t,n){var r,o,i={},s=(r=function(){return window&&document&&document.all&&!window.atob},function(){return void 0===o&&(o=r.apply(this,arguments)),o}),c=function(e){var t={};return function(e,n){if("function"==typeof e)return e();if(void 0===t[e]){var r=function(e,t){return t?t.querySelector(e):document.querySelector(e)}.call(this,e,n);if(window.HTMLIFrameElement&&r instanceof window.HTMLIFrameElement)try{r=r.contentDocument.head}catch(e){r=null}t[e]=r}return t[e]}}(),a=null,l=0,u=[],f=n("9tPo");function p(e,t){for(var n=0;n<e.length;n++){var r=e[n],o=i[r.id];if(o){o.refs++;for(var s=0;s<o.parts.length;s++)o.parts[s](r.parts[s]);for(;s<r.parts.length;s++)o.parts.push(v(r.parts[s],t))}else{var c=[];for(s=0;s<r.parts.length;s++)c.push(v(r.parts[s],t));i[r.id]={id:r.id,refs:1,parts:c}}}}function b(e,t){for(var n=[],r={},o=0;o<e.length;o++){var i=e[o],s=t.base?i[0]+t.base:i[0],c={css:i[1],media:i[2],sourceMap:i[3]};r[s]?r[s].parts.push(c):n.push(r[s]={id:s,parts:[c]})}return n}function m(e,t){var n=c(e.insertInto);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");var r=u[u.length-1];if("top"===e.insertAt)r?r.nextSibling?n.insertBefore(t,r.nextSibling):n.appendChild(t):n.insertBefore(t,n.firstChild),u.push(t);else if("bottom"===e.insertAt)n.appendChild(t);else{if("object"!=typeof e.insertAt||!e.insertAt.before)throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n");var o=c(e.insertAt.before,n);n.insertBefore(t,o)}}function y(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e);var t=u.indexOf(e);t>=0&&u.splice(t,1)}function d(e){var t=document.createElement("style");if(void 0===e.attrs.type&&(e.attrs.type="text/css"),void 0===e.attrs.nonce){var r=function(){0;return n.nc}();r&&(e.attrs.nonce=r)}return h(t,e.attrs),m(e,t),t}function h(e,t){Object.keys(t).forEach(function(n){e.setAttribute(n,t[n])})}function v(e,t){var n,r,o,i;if(t.transform&&e.css){if(!(i="function"==typeof t.transform?t.transform(e.css):t.transform.default(e.css)))return function(){};e.css=i}if(t.singleton){var s=l++;n=a||(a=d(t)),r=P.bind(null,n,s,!1),o=P.bind(null,n,s,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(e){var t=document.createElement("link");return void 0===e.attrs.type&&(e.attrs.type="text/css"),e.attrs.rel="stylesheet",h(t,e.attrs),m(e,t),t}(t),r=function(e,t,n){var r=n.css,o=n.sourceMap,i=void 0===t.convertToAbsoluteUrls&&o;(t.convertToAbsoluteUrls||i)&&(r=f(r));o&&(r+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(o))))+" */");var s=new Blob([r],{type:"text/css"}),c=e.href;e.href=URL.createObjectURL(s),c&&URL.revokeObjectURL(c)}.bind(null,n,t),o=function(){y(n),n.href&&URL.revokeObjectURL(n.href)}):(n=d(t),r=function(e,t){var n=t.css,r=t.media;r&&e.setAttribute("media",r);if(e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}.bind(null,n),o=function(){y(n)});return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else o()}}e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||"boolean"==typeof t.singleton||(t.singleton=s()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var n=b(e,t);return p(n,t),function(e){for(var r=[],o=0;o<n.length;o++){var s=n[o];(c=i[s.id]).refs--,r.push(c)}e&&p(b(e,t),t);for(o=0;o<r.length;o++){var c;if(0===(c=r[o]).refs){for(var a=0;a<c.parts.length;a++)c.parts[a]();delete i[c.id]}}}};var g,w=(g=[],function(e,t){return g[e]=t,g.filter(Boolean).join("\n")});function P(e,t,n,r){var o=n?"":r.css;if(e.styleSheet)e.styleSheet.cssText=w(t,o);else{var i=document.createTextNode(o),s=e.childNodes;s[t]&&e.removeChild(s[t]),s.length?e.insertBefore(i,s[t]):e.appendChild(i)}}},iY67:function(e,t){},"mfq/":function(e,t,n){"use strict";n("PDM/");function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function o(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function i(e,t){return!t||"object"!==r(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function c(e,t){return(c=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var a=wp.element.Component,l=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),i(this,s(t).apply(this,arguments))}var n,r,l;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&c(e,t)}(t,a),n=t,(r=[{key:"render",value:function(){return React.createElement("div",{className:"members-bp-memberpress-upgrade"},React.createElement("div",{className:"members-bp-memberpress-upgrade__message"},this.props.message),React.createElement("div",{className:"members-bp-memberpress-upgrade__cta"},React.createElement("a",{href:"https://memberpress.com/plans/pricing",target:"_blank",className:"members-bp-memberpress-upgrade__cta-button"},"Upgrade to MemberPress")))}}])&&o(n.prototype,r),l&&o(n,l),t}();t.a=l},pNZs:function(e,t,n){"use strict";function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function o(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function i(e,t){return!t||"object"!==r(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function s(e){return(s=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function c(e,t){return(c=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}n.r(t);var a=wp.components.CheckboxControl,l=wp.compose.withState,u=wp.element.Component,f=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),i(this,s(t).apply(this,arguments))}var n,r,l;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&c(e,t)}(t,u),n=t,(r=[{key:"render",value:function(){var e=this.props,t=this.props,n=t.setState,r=t.roleName,o=t.roleLabel,i=this.props.attributes.blockPermissionsRoles,s=void 0===i?[]:i;return React.createElement(a,{disabled:!membersBlockPermissions.userCanAssignPermissions,className:"members-bp-checklist__control",label:o,checked:s.includes(r),onChange:function(t){t&&!s.includes(r)?(s.push(r),e.setAttributes({blockPermissionsRoles:s})):!t&&s.includes(r)&&(s=s.filter(function(e){return e!==r}),e.setAttributes({blockPermissionsRoles:s})),n({blockPermissionsRoles:s})}})}}])&&o(n.prototype,r),l&&o(n,l),t}(),p=l()(f);function b(e){return(b="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function m(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function y(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function d(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function h(e,t){return!t||"object"!==b(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function v(e){return(v=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function g(e,t){return(g=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}wp.components.SelectControl;var w=wp.element.Component,P=membersBlockPermissions.labels.controls.roles,O=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),h(this,v(t).apply(this,arguments))}var n,r,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&g(e,t)}(t,w),n=t,(r=[{key:"render",value:function(){var e=membersBlockPermissions.roles,t=this.props;return React.createElement("div",{className:"members-bp-checklist"},React.createElement("span",{className:"components-base-control__label members-bp-checklist__label"},P.label),React.createElement("div",{className:"members-bp-checklist__panel wp-tab-panel"},e.map(function(e,n){var r=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?m(n,!0).forEach(function(t){y(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):m(n).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}({},{roleName:e.name,roleLabel:e.label,key:"members_roles_".concat(n)},{},t);return React.createElement(p,r)})))}}])&&d(n.prototype,r),o&&d(n,o),t}();function k(e){return(k="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function S(e,t){return!t||"object"!==k(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function j(e){return(j=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function E(e,t){return(E=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var R=wp.components.SelectControl,C=wp.element.Component,x=membersBlockPermissions.labels.controls.condition,T=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),S(this,j(t).apply(this,arguments))}var n,r,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&E(e,t)}(t,C),n=t,(r=[{key:"render",value:function(){var e=this.props,t=[{label:x.options.default,value:""},{label:x.options.show,value:"="},{label:x.options.hide,value:"!="}],n=e.attributes.blockPermissionsCondition;return React.createElement(R,{disabled:!membersBlockPermissions.userCanAssignPermissions,key:"blockPermissionsCondition",label:x.label,value:n,options:t,onChange:function(t){var n={blockPermissionsCondition:t};t&&!e.attributes.blockPermissionsType?(n.blockPermissionsType="user-status",e.attributes.blockPermissionsUserStatus||(n.blockPermissionsUserStatus="logged-in")):t||(n.blockPermissionsCondition=void 0,n.blockPermissionsType=void 0,n.blockPermissionsCap=void 0,n.blockPermissionsUserStatus=void 0,n.blockPermissionsRoles=void 0,n.blockPermissionsMessage=void 0),e.setAttributes(n)}})}}])&&_(n.prototype,r),o&&_(n,o),t}();function B(e){return(B="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function U(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function M(e,t){return!t||"object"!==B(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function A(e){return(A=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function N(e,t){return(N=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var L=wp.components.RadioControl,I=wp.element.Component,D=membersBlockPermissions.labels.controls.type,z=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),M(this,A(t).apply(this,arguments))}var n,r,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&N(e,t)}(t,I),n=t,(r=[{key:"render",value:function(){var e=this.props,t=[{label:D.options.userStatus,value:"user-status"},{label:D.options.role,value:"role"},{label:D.options.cap,value:"cap"},{label:D.options.paidMembership,value:"paidMembership"},{label:D.options.contentRule,value:"contentRule"}],n=e.attributes.blockPermissionsType;return React.createElement(L,{disabled:!membersBlockPermissions.userCanAssignPermissions,key:"blockPermissionsType",label:D.label,selected:n,options:t,onChange:function(t){var n={blockPermissionsType:t};"role"===t?(delete e.attributes.blockPermissionsCap,delete e.attributes.blockPermissionsUserStatus):"cap"===t?(delete e.attributes.blockPermissionsRoles,delete e.attributes.blockPermissionsUserStatus):"user-status"===t&&(e.attributes.blockPermissionsUserStatus||(n.blockPermissionsUserStatus="logged-in"),delete e.attributes.blockPermissionsCap,delete e.attributes.blockPermissionsRoles),e.setAttributes(n)}})}}])&&U(n.prototype,r),o&&U(n,o),t}();function q(e){return(q="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function F(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function H(e,t){return!t||"object"!==q(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function $(e){return($=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function J(e,t){return(J=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var G=wp.compose.withState,Y=wp.element.Component,Z=wp.components.TextControl,V=membersBlockPermissions.labels,K=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),H(this,$(t).apply(this,arguments))}var n,r,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&J(e,t)}(t,Y),n=t,(r=[{key:"render",value:function(){var e=this.props,t=e.setState,n=e.attributes.blockPermissionsCap;return React.createElement(Z,{disabled:!membersBlockPermissions.userCanAssignPermissions,className:"members-bp-capability__control",label:V.controls.cap.label,value:n,onChange:function(n){e.setAttributes({blockPermissionsCap:n}),t({blockPermissionsCap:n})}})}}])&&F(n.prototype,r),o&&F(n,o),t}(),Q=G()(K),W=n("mfq/");function X(e){return(X="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ee(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function te(e,t){return!t||"object"!==X(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function ne(e){return(ne=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function re(e,t){return(re=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var oe=wp.components.SelectControl,ie=wp.element.Component,se=membersBlockPermissions.labels.controls.userStatus,ce=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),te(this,ne(t).apply(this,arguments))}var n,r,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&re(e,t)}(t,ie),n=t,(r=[{key:"render",value:function(){var e=this.props,t=[{label:se.options.loggedIn,value:"logged-in"},{label:se.options.loggedOut,value:"logged-out"}],n=e.attributes.blockPermissionsUserStatus;return n||(n="logged-in"),React.createElement(oe,{disabled:!membersBlockPermissions.userCanAssignPermissions,key:"blockPermissionsUserStatus",label:se.label,value:n,options:t,onChange:function(t){e.setAttributes({blockPermissionsUserStatus:t})}})}}])&&ee(n.prototype,r),o&&ee(n,o),t}();function ae(e){return(ae="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function le(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function ue(e,t){return!t||"object"!==ae(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function fe(e){return(fe=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function pe(e,t){return(pe=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var be=wp.compose.withState,me=wp.element.Component,ye=wp.components.TextareaControl,de=membersBlockPermissions.labels.controls.message,he=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),ue(this,fe(t).apply(this,arguments))}var n,r,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&pe(e,t)}(t,me),n=t,(r=[{key:"render",value:function(){var e=this.props,t=this.props.setState,n=this.props.attributes.blockPermissionsMessage;return React.createElement(ye,{disabled:!membersBlockPermissions.userCanAssignPermissions,className:"members-bp-error__control",label:de.label,help:de.help,value:n,onChange:function(n){e.setAttributes({blockPermissionsMessage:n}),t({blockPermissionsMessage:n})}})}}])&&le(n.prototype,r),o&&le(n,o),t}(),ve=be()(he);function ge(e){return(ge="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function we(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function Pe(e,t){return!t||"object"!==ge(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function Oe(e){return(Oe=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function ke(e,t){return(ke=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var _e=wp.element.Component,Se=wp.components.Notice,je=membersBlockPermissions.labels,Ee=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),Pe(this,Oe(t).apply(this,arguments))}var n,r,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&ke(e,t)}(t,_e),n=t,(r=[{key:"render",value:function(){return React.createElement("div",{className:"members-bp-notice"},React.createElement(Se,{status:"warning",isDismissible:!1},React.createElement("p",null,je.notices.notAllowed)))}}])&&we(n.prototype,r),o&&we(n,o),t}(),Re=wp.compose.createHigherOrderComponent,Ce=wp.element.Fragment,xe=wp.blockEditor.InspectorControls,Te=wp.hooks.addFilter,Be=wp.components,Ue=Be.PanelBody,Me=Be.Icon,Ae=membersBlockPermissions.labels,Ne=function(e){return React.createElement(Ce,null,React.createElement(Me,{icon:React.createElement("svg",{width:"20px","aria-hidden":"true",focusable:"false","data-prefix":"fas","data-icon":"users-cog",className:"svg-inline--fa fa-users-cog fa-w-20",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 640 512"},React.createElement("path",{fill:"currentColor",d:"M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z"}))}),React.createElement("div",{style:{marginLeft:"10px",position:"relative",top:"3px"}},e.title))};Te("editor.BlockEdit","members/block/permissions/edit",Re(function(e){return function(t){var n=t.attributes,r=n.blockPermissionsCondition,o=void 0===r?"":r,i=n.blockPermissionsType,s=void 0===i?"":i;return membersBlockPermissions.userCanAssignPermissions||o?React.createElement(Ce,null,React.createElement(e,t),React.createElement(xe,null,React.createElement(Ue,{title:React.createElement(Ne,{title:Ae.panel}),initialOpen:!1,className:"members-bp-controls"},membersBlockPermissions.userCanAssignPermissions?null:React.createElement(Ee,null),React.createElement(T,t),o?React.createElement(z,t):null,o&&"user-status"===s?React.createElement(ce,t):null,o&&"cap"===s?React.createElement(Q,t):null,o&&"role"===s?React.createElement(O,t):null,o&&"paidMembership"===s?React.createElement(W.a,{message:Ae.paidMembership}):null,o&&"contentRule"===s?React.createElement(W.a,{message:Ae.contentRule}):null,o&&"contentRule"!==s&&"paidMembership"!==s?React.createElement(ve,t):null))):React.createElement(e,t)}},"MembersBlockPermissionsBlockEdit"));n("+c5n")}});
addons/members-block-permissions/public/js/upsell.js ADDED
@@ -0,0 +1 @@
 
1
+ !function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=1)}({1:function(e,t,n){e.exports=n("NyUW")},"9tPo":function(e,t){e.exports=function(e){var t="undefined"!=typeof window&&window.location;if(!t)throw new Error("fixUrls requires window.location");if(!e||"string"!=typeof e)return e;var n=t.protocol+"//"+t.host,r=n+t.pathname.replace(/\/[^\/]*$/,"/");return e.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,function(e,t){var o,i=t.trim().replace(/^"(.*)"$/,function(e,t){return t}).replace(/^'(.*)'$/,function(e,t){return t});return/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(i)?e:(o=0===i.indexOf("//")?i:0===i.indexOf("/")?n+i:r+i.replace(/^\.\//,""),"url("+JSON.stringify(o)+")")})}},I1BE:function(e,t){e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var n=function(e,t){var n=e[1]||"",r=e[3];if(!r)return n;if(t&&"function"==typeof btoa){var o=(a=r,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(a))))+" */"),i=r.sources.map(function(e){return"/*# sourceURL="+r.sourceRoot+e+" */"});return[n].concat(i).concat([o]).join("\n")}var a;return[n].join("\n")}(t,e);return t[2]?"@media "+t[2]+"{"+n+"}":n}).join("")},t.i=function(e,n){"string"==typeof e&&(e=[[null,e,""]]);for(var r={},o=0;o<this.length;o++){var i=this[o][0];"number"==typeof i&&(r[i]=!0)}for(o=0;o<e.length;o++){var a=e[o];"number"==typeof a[0]&&r[a[0]]||(n&&!a[2]?a[2]=n:n&&(a[2]="("+a[2]+") and ("+n+")"),t.push(a))}},t}},NyUW:function(e,t,n){"use strict";n.r(t);var r=n("mfq/"),o=wp.compose.createHigherOrderComponent,i=wp.element.Fragment,a=wp.hooks.addFilter,c=wp.components,s=c.PanelBody,u=c.Icon,l=wp.editor.InspectorControls,f=membersUpsell,p=f.title,d=f.message,m=function(e){return React.createElement(i,null,React.createElement(u,{icon:React.createElement("svg",{width:"20px","aria-hidden":"true",focusable:"false","data-prefix":"fas","data-icon":"users-cog",className:"svg-inline--fa fa-users-cog fa-w-20",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 640 512"},React.createElement("path",{fill:"currentColor",d:"M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z"}))}),React.createElement("div",{style:{marginLeft:"10px",position:"relative",top:"3px"}},e.title))};a("editor.BlockEdit","members/block/upsell",o(function(e){return function(t){return React.createElement(i,null,React.createElement(e,t),React.createElement(l,null,React.createElement(s,{title:React.createElement(m,{title:p}),initialOpen:!0,className:"members-upsell"},React.createElement(r.a,{message:d}))))}},"MembersUpsell"))},"PDM/":function(e,t,n){var r=n("RwBp");"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0,insertInto:void 0};n("aET+")(r,o);r.locals&&(e.exports=r.locals)},RwBp:function(e,t,n){(e.exports=n("I1BE")(!1)).push([e.i,".members-bp-memberpress-upgrade {\n\tbackground-color: #f5f5f5;\n\tpadding: 20px;\n\tmargin-bottom: 20px;\n}\n\n.members-bp-memberpress-upgrade__cta-button {\n\tbackground-color: #06429e;\n\tcolor: #fff;\n\ttext-decoration: none;\n\tborder-radius: 300px;\n\tmargin: 20px auto 0;\n\twidth: auto;\n\ttext-align: center;\n\tmax-width: 200px;\n\tpadding: 10px;\n\tdisplay: block;\n\theight: auto;\n}\n\n.members-bp-memberpress-upgrade__cta-button:hover {\n\tcolor: #fff;\n}",""])},"aET+":function(e,t,n){var r,o,i={},a=(r=function(){return window&&document&&document.all&&!window.atob},function(){return void 0===o&&(o=r.apply(this,arguments)),o}),c=function(e){var t={};return function(e,n){if("function"==typeof e)return e();if(void 0===t[e]){var r=function(e,t){return t?t.querySelector(e):document.querySelector(e)}.call(this,e,n);if(window.HTMLIFrameElement&&r instanceof window.HTMLIFrameElement)try{r=r.contentDocument.head}catch(e){r=null}t[e]=r}return t[e]}}(),s=null,u=0,l=[],f=n("9tPo");function p(e,t){for(var n=0;n<e.length;n++){var r=e[n],o=i[r.id];if(o){o.refs++;for(var a=0;a<o.parts.length;a++)o.parts[a](r.parts[a]);for(;a<r.parts.length;a++)o.parts.push(y(r.parts[a],t))}else{var c=[];for(a=0;a<r.parts.length;a++)c.push(y(r.parts[a],t));i[r.id]={id:r.id,refs:1,parts:c}}}}function d(e,t){for(var n=[],r={},o=0;o<e.length;o++){var i=e[o],a=t.base?i[0]+t.base:i[0],c={css:i[1],media:i[2],sourceMap:i[3]};r[a]?r[a].parts.push(c):n.push(r[a]={id:a,parts:[c]})}return n}function m(e,t){var n=c(e.insertInto);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");var r=l[l.length-1];if("top"===e.insertAt)r?r.nextSibling?n.insertBefore(t,r.nextSibling):n.appendChild(t):n.insertBefore(t,n.firstChild),l.push(t);else if("bottom"===e.insertAt)n.appendChild(t);else{if("object"!=typeof e.insertAt||!e.insertAt.before)throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n");var o=c(e.insertAt.before,n);n.insertBefore(t,o)}}function b(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e);var t=l.indexOf(e);t>=0&&l.splice(t,1)}function v(e){var t=document.createElement("style");if(void 0===e.attrs.type&&(e.attrs.type="text/css"),void 0===e.attrs.nonce){var r=function(){0;return n.nc}();r&&(e.attrs.nonce=r)}return h(t,e.attrs),m(e,t),t}function h(e,t){Object.keys(t).forEach(function(n){e.setAttribute(n,t[n])})}function y(e,t){var n,r,o,i;if(t.transform&&e.css){if(!(i="function"==typeof t.transform?t.transform(e.css):t.transform.default(e.css)))return function(){};e.css=i}if(t.singleton){var a=u++;n=s||(s=v(t)),r=x.bind(null,n,a,!1),o=x.bind(null,n,a,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(e){var t=document.createElement("link");return void 0===e.attrs.type&&(e.attrs.type="text/css"),e.attrs.rel="stylesheet",h(t,e.attrs),m(e,t),t}(t),r=function(e,t,n){var r=n.css,o=n.sourceMap,i=void 0===t.convertToAbsoluteUrls&&o;(t.convertToAbsoluteUrls||i)&&(r=f(r));o&&(r+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(o))))+" */");var a=new Blob([r],{type:"text/css"}),c=e.href;e.href=URL.createObjectURL(a),c&&URL.revokeObjectURL(c)}.bind(null,n,t),o=function(){b(n),n.href&&URL.revokeObjectURL(n.href)}):(n=v(t),r=function(e,t){var n=t.css,r=t.media;r&&e.setAttribute("media",r);if(e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}.bind(null,n),o=function(){b(n)});return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else o()}}e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||"boolean"==typeof t.singleton||(t.singleton=a()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var n=d(e,t);return p(n,t),function(e){for(var r=[],o=0;o<n.length;o++){var a=n[o];(c=i[a.id]).refs--,r.push(c)}e&&p(d(e,t),t);for(o=0;o<r.length;o++){var c;if(0===(c=r[o]).refs){for(var s=0;s<c.parts.length;s++)c.parts[s]();delete i[c.id]}}}};var g,w=(g=[],function(e,t){return g[e]=t,g.filter(Boolean).join("\n")});function x(e,t,n,r){var o=n?"":r.css;if(e.styleSheet)e.styleSheet.cssText=w(t,o);else{var i=document.createTextNode(o),a=e.childNodes;a[t]&&e.removeChild(a[t]),a.length?e.insertBefore(i,a[t]):e.appendChild(i)}}},"mfq/":function(e,t,n){"use strict";n("PDM/");function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function o(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function i(e,t){return!t||"object"!==r(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function c(e,t){return(c=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}var s=wp.element.Component,u=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),i(this,a(t).apply(this,arguments))}var n,r,u;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&c(e,t)}(t,s),n=t,(r=[{key:"render",value:function(){return React.createElement("div",{className:"members-bp-memberpress-upgrade"},React.createElement("div",{className:"members-bp-memberpress-upgrade__message"},this.props.message),React.createElement("div",{className:"members-bp-memberpress-upgrade__cta"},React.createElement("a",{href:"https://memberpress.com/plans/pricing",target:"_blank",className:"members-bp-memberpress-upgrade__cta-button"},"Upgrade to MemberPress")))}}])&&o(n.prototype,r),u&&o(n,u),t}();t.a=u}});
addons/members-block-permissions/public/mix-manifest.json ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ {
2
+ "/js/editor.js": "/js/editor.js?id=f93918b5693c8a3af062",
3
+ "/css/editor.css": "/css/editor.css?id=dc3291c444832a7a271b",
4
+ "/js/upsell.js": "/js/upsell.js?id=720b0b10c4172ffe62b0"
5
+ }
addons/members-block-permissions/readme.md ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Members - Block Permissions
2
+
3
+ A plugin for hiding/showing blocks on the front end based on the given user. Blocks can be shown or hidden by:
4
+
5
+ - Use Status (logged in/out)
6
+ - User Role
7
+ - Capability
8
+
9
+ While this plugin is within the [Members](https://themehybrid.com/plugins/members) "family" of plugins, it can be used as a standalone plugin if desired.
10
+
11
+ ## Usage
12
+
13
+ The plugin adds a new "Permissions" meta box for every block in the WordPress block editor. It provides the following options:
14
+
15
+ - Condition
16
+ - Show the block to everyone.
17
+ - Show the block to selected.
18
+ - Hide the block from selected.
19
+ - Type
20
+ - User Status
21
+ - User Role
22
+ - Capability
23
+ - User Status (if selected)
24
+ - Logged In
25
+ - Logged Out
26
+ - User Roles (if selected)
27
+ - Administrator
28
+ - Editor
29
+ - ...
30
+ - Capability (if selected)
31
+ - Error Message
32
+
33
+ Depending on which options are selected, other options will appear or disappear.
34
+
35
+ ## Who can assign block permissions?
36
+
37
+ By default, only administrators can assign block permissions. They are given the `assign_block_permissions` capability when the plugin is first activated.
38
+
39
+ If you want to provide this capability to other users, you can do so using a role manager such as [Members](https://themehybrid.com/plugins/members).
40
+
41
+ ## Important Notes
42
+
43
+ Please read the following for some edge cases that may not work for your situation.
44
+
45
+ ### Dynamic Blocks
46
+
47
+ "Dynamic" or "Server-Side Rendered" blocks, such as the "Archives" block, may not work correctly because they work differently than normal blocks. There is an existing bug filed with the WordPress team to address this particular issue.
48
+
49
+ If you run into trouble with this, you can simply wrap your block within the "Group" block and place the permissions on it.
50
+
51
+ ### Code Editor
52
+
53
+ While the plugin requires the `assign_block_permissions` capability, there's nothing it can do to stop users from entering the code editor and manually making changes.
54
+
55
+ If this is a concern for you, such as on a client site or a site with many contributors, I suggest disabling the code editor for those users. This is outside the scope of the Members - Block Permissions plugin.
56
+
57
+ ## Copyright and License
58
+
59
+ This project is licensed under the [GNU GPL](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html), version 2 or later.
60
+
61
+ 2019 &copy; [Justin Tadlock](http://justintadlock.com).
addons/members-block-permissions/resources/js/editor.js ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Primary editor script.
3
+ *
4
+ * @package MembersBlockPermissions
5
+ * @author Justin Tadlock <justintadlock@gmail.com>
6
+ * @copyright 2019 Justin Tadlock
7
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
8
+ * @link https://themehybrid.com/plugins/members-block-permissions
9
+ */
10
+
11
+ import filterBlockEdit from './editor/filter-block-edit';
12
+ import filterBlockRegister from './editor/filter-block-register';
addons/members-block-permissions/resources/js/editor/controls/cap-text-input.js ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Cap text input component.
3
+ *
4
+ * @package MembersBlockPermissions
5
+ * @author Justin Tadlock <justintadlock@gmail.com>
6
+ * @copyright 2019 Justin Tadlock
7
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
8
+ * @link https://themehybrid.com/plugins/members-block-permissions
9
+ */
10
+
11
+ const { withState } = wp.compose;
12
+ const { Component } = wp.element;
13
+ const { TextControl } = wp.components;
14
+ const { labels } = membersBlockPermissions;
15
+
16
+ class CapTextInput extends Component {
17
+
18
+ render() {
19
+ let props = this.props;
20
+
21
+ const { setState } = props;
22
+
23
+ let { blockPermissionsCap } = props.attributes;
24
+
25
+ return (
26
+ <TextControl
27
+ disabled={ ! membersBlockPermissions.userCanAssignPermissions }
28
+ className="members-bp-capability__control"
29
+ label={ labels.controls.cap.label }
30
+ value={ blockPermissionsCap }
31
+ onChange={ ( blockPermissionsCap ) => {
32
+
33
+ props.setAttributes( {
34
+ blockPermissionsCap: blockPermissionsCap
35
+ } );
36
+
37
+ setState( {
38
+ blockPermissionsCap: blockPermissionsCap
39
+ } );
40
+ } }
41
+ />
42
+ );
43
+ }
44
+ }
45
+
46
+ export default withState()(CapTextInput);
addons/members-block-permissions/resources/js/editor/controls/condition-select.js ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Condition select component.
3
+ *
4
+ * @package MembersBlockPermissions
5
+ * @author Justin Tadlock <justintadlock@gmail.com>
6
+ * @copyright 2019 Justin Tadlock
7
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
8
+ * @link https://themehybrid.com/plugins/members-block-permissions
9
+ */
10
+
11
+ // Get the core WP select control.
12
+ const { SelectControl } = wp.components;
13
+ const { Component } = wp.element;
14
+ const labels = membersBlockPermissions.labels.controls.condition;
15
+
16
+ class ConditionSelect extends Component {
17
+
18
+ render() {
19
+ let props = this.props;
20
+
21
+ let options = [
22
+ { label: labels.options.default, value: '' },
23
+ { label: labels.options.show, value: '=' },
24
+ { label: labels.options.hide, value: '!=' }
25
+ ];
26
+
27
+ let { blockPermissionsCondition } = props.attributes;
28
+
29
+ return (
30
+ <SelectControl
31
+ disabled={ ! membersBlockPermissions.userCanAssignPermissions }
32
+ key="blockPermissionsCondition"
33
+ label={ labels.label }
34
+ value={ blockPermissionsCondition }
35
+ options={ options }
36
+ onChange={ ( selected ) => {
37
+
38
+ let attr = {
39
+ blockPermissionsCondition: selected,
40
+ };
41
+
42
+ if ( selected && ! props.attributes.blockPermissionsType ) {
43
+
44
+ attr.blockPermissionsType = 'user-status';
45
+
46
+ if ( ! props.attributes.blockPermissionsUserStatus ) {
47
+ attr.blockPermissionsUserStatus = 'logged-in';
48
+ }
49
+
50
+ } else if ( ! selected ) {
51
+ attr.blockPermissionsCondition = undefined;
52
+ attr.blockPermissionsType = undefined;
53
+ attr.blockPermissionsCap = undefined;
54
+ attr.blockPermissionsUserStatus = undefined;
55
+ attr.blockPermissionsRoles = undefined;
56
+ attr.blockPermissionsMessage = undefined;
57
+ }
58
+
59
+ props.setAttributes( attr );
60
+ } }
61
+ />
62
+ );
63
+ }
64
+ }
65
+
66
+ export default ConditionSelect;
addons/members-block-permissions/resources/js/editor/controls/message-textarea.js ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Error message textarea component.
3
+ *
4
+ * @package MembersBlockPermissions
5
+ * @author Justin Tadlock <justintadlock@gmail.com>
6
+ * @copyright 2019 Justin Tadlock
7
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
8
+ * @link https://themehybrid.com/plugins/members-block-permissions
9
+ */
10
+
11
+ const { withState } = wp.compose;
12
+ const { Component } = wp.element;
13
+ const { TextareaControl } = wp.components;
14
+ const labels = membersBlockPermissions.labels.controls.message;
15
+
16
+ class MessageTextarea extends Component {
17
+
18
+ render() {
19
+ let props = this.props;
20
+
21
+ const { setState } = this.props;
22
+
23
+ let { blockPermissionsMessage } = this.props.attributes;
24
+
25
+ return (
26
+ <TextareaControl
27
+ disabled={ ! membersBlockPermissions.userCanAssignPermissions }
28
+ className="members-bp-error__control"
29
+ label={ labels.label }
30
+ help={ labels.help }
31
+ value={ blockPermissionsMessage }
32
+ onChange={ ( blockPermissionsMessage ) => {
33
+
34
+ props.setAttributes( {
35
+ blockPermissionsMessage: blockPermissionsMessage
36
+ } );
37
+
38
+ setState( {
39
+ blockPermissionsMessage: blockPermissionsMessage
40
+ } );
41
+ } }
42
+ />
43
+ );
44
+ }
45
+ }
46
+
47
+ export default withState()(MessageTextarea);
addons/members-block-permissions/resources/js/editor/controls/role-checkbox.js ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Role checkbox component.
3
+ *
4
+ * @package MembersBlockPermissions
5
+ * @author Justin Tadlock <justintadlock@gmail.com>
6
+ * @copyright 2019 Justin Tadlock
7
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
8
+ * @link https://themehybrid.com/plugins/members-block-permissions
9
+ */
10
+
11
+ const { CheckboxControl } = wp.components;
12
+ const { withState } = wp.compose;
13
+ const { Component } = wp.element;
14
+
15
+ class RoleCheckbox extends Component {
16
+
17
+ render() {
18
+ let props = this.props;
19
+
20
+ const { setState, roleName, roleLabel } = this.props;
21
+
22
+ let { blockPermissionsRoles = [] } = this.props.attributes;
23
+
24
+ return (
25
+ <CheckboxControl
26
+ disabled={ ! membersBlockPermissions.userCanAssignPermissions }
27
+ className="members-bp-checklist__control"
28
+ label={ roleLabel }
29
+ checked={ blockPermissionsRoles.includes( roleName ) }
30
+ onChange={ ( isChecked ) => {
31
+
32
+ if ( isChecked && ! blockPermissionsRoles.includes( roleName ) ) {
33
+
34
+ blockPermissionsRoles.push( roleName );
35
+
36
+ props.setAttributes( {
37
+ blockPermissionsRoles: blockPermissionsRoles
38
+ } );
39
+
40
+ } else if ( ! isChecked && blockPermissionsRoles.includes( roleName ) ) {
41
+
42
+ blockPermissionsRoles = blockPermissionsRoles.filter( role => role !== roleName );
43
+
44
+ props.setAttributes( {
45
+ blockPermissionsRoles: blockPermissionsRoles
46
+ } );
47
+ }
48
+
49
+ setState( { blockPermissionsRoles: blockPermissionsRoles } );
50
+ } }
51
+ />
52
+ );
53
+ }
54
+ }
55
+
56
+ export default withState()(RoleCheckbox);
addons/members-block-permissions/resources/js/editor/controls/role-checklist.js ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Role checklist component.
3
+ *
4
+ * @package MembersBlockPermissions
5
+ * @author Justin Tadlock <justintadlock@gmail.com>
6
+ * @copyright 2019 Justin Tadlock
7
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
8
+ * @link https://themehybrid.com/plugins/members-block-permissions
9
+ */
10
+
11
+ import RoleCheckbox from './role-checkbox';
12
+
13
+ // Get the core WP select control.
14
+ const { SelectControl } = wp.components;
15
+ const { Component } = wp.element;
16
+ const labels = membersBlockPermissions.labels.controls.roles;
17
+
18
+ class RoleCheckList extends Component {
19
+
20
+ render() {
21
+
22
+ let roles = membersBlockPermissions.roles;
23
+
24
+ let props = this.props;
25
+
26
+ return (
27
+ <div className="members-bp-checklist">
28
+ <span className="components-base-control__label members-bp-checklist__label">{ labels.label }</span>
29
+
30
+ <div className="members-bp-checklist__panel wp-tab-panel">
31
+
32
+ {
33
+ roles.map( ( role, i ) => {
34
+
35
+ let attr = {
36
+ roleName: role.name,
37
+ roleLabel: role.label,
38
+ key: `members_roles_${i}`
39
+ };
40
+
41
+ let newProps = { ...attr, ...props };
42
+
43
+ return (
44
+ <RoleCheckbox { ...newProps } />
45
+ )
46
+ } )
47
+ }
48
+
49
+ </div>
50
+
51
+ </div>
52
+ );
53
+ }
54
+ }
55
+
56
+ export default RoleCheckList;
addons/members-block-permissions/resources/js/editor/controls/type-select.js ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Type select component.
3
+ *
4
+ * @package MembersBlockPermissions
5
+ * @author Justin Tadlock <justintadlock@gmail.com>
6
+ * @copyright 2019 Justin Tadlock
7
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
8
+ * @link https://themehybrid.com/plugins/members-block-permissions
9
+ */
10
+
11
+ const { RadioControl } = wp.components;
12
+ const { Component } = wp.element;
13
+ const labels = membersBlockPermissions.labels.controls.type;
14
+
15
+ class TypeSelect extends Component {
16
+
17
+ render() {
18
+ let props = this.props;
19
+
20
+ let options = [
21
+ { label: labels.options.userStatus, value: 'user-status' },
22
+ { label: labels.options.role, value: 'role' },
23
+ { label: labels.options.cap, value: 'cap' },
24
+ { label: labels.options.paidMembership, value: 'paidMembership'},
25
+ { label: labels.options.contentRule, value: 'contentRule' }
26
+ ];
27
+
28
+ let { blockPermissionsType } = props.attributes;
29
+
30
+ return (
31
+ <RadioControl
32
+ disabled={ ! membersBlockPermissions.userCanAssignPermissions }
33
+ key="blockPermissionsType"
34
+ label={ labels.label }
35
+ selected={ blockPermissionsType }
36
+ options={ options }
37
+ onChange={ ( selected ) => {
38
+
39
+ let attr = {
40
+ blockPermissionsType: selected,
41
+ };
42
+
43
+ if ( 'role' === selected ) {
44
+
45
+ delete props.attributes.blockPermissionsCap;
46
+ delete props.attributes.blockPermissionsUserStatus;
47
+
48
+ } else if ( 'cap' === selected ) {
49
+
50
+ delete props.attributes.blockPermissionsRoles;
51
+ delete props.attributes.blockPermissionsUserStatus;
52
+
53
+ } else if ( 'user-status' === selected ) {
54
+
55
+ if ( ! props.attributes.blockPermissionsUserStatus ) {
56
+ attr.blockPermissionsUserStatus = 'logged-in';
57
+ }
58
+
59
+ delete props.attributes.blockPermissionsCap;
60
+ delete props.attributes.blockPermissionsRoles;
61
+ }
62
+
63
+ props.setAttributes( attr );
64
+ } }
65
+ />
66
+ );
67
+ }
68
+ }
69
+
70
+
71
+ export default TypeSelect;
addons/members-block-permissions/resources/js/editor/controls/upgrade-prompt.js ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Upgrade Prompt component.
3
+ *
4
+ * @package MembersBlockPermissions
5
+ * @author Caseproof LLC
6
+ * @copyright 2019 Caseproof LLC
7
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
8
+ * @link https://themehybrid.com/plugins/members-block-permissions
9
+ */
10
+
11
+ import '../styles/upgrade-prompt.css';
12
+ const { Component } = wp.element;
13
+
14
+ class UpgradePrompt extends Component {
15
+
16
+ render() {
17
+
18
+ return (
19
+ <div className="members-bp-memberpress-upgrade">
20
+ <div className="members-bp-memberpress-upgrade__message">
21
+ {this.props.message}
22
+ </div>
23
+ <div className="members-bp-memberpress-upgrade__cta">
24
+ <a href="https://memberpress.com/plans/pricing" target="_blank" className="members-bp-memberpress-upgrade__cta-button">Upgrade to MemberPress</a>
25
+ </div>
26
+ </div>
27
+ );
28
+ }
29
+ }
30
+
31
+ export default UpgradePrompt;
addons/members-block-permissions/resources/js/editor/controls/user-status-select.js ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * User status select component.
3
+ *
4
+ * @package MembersBlockPermissions
5
+ * @author Justin Tadlock <justintadlock@gmail.com>
6
+ * @copyright 2019 Justin Tadlock
7
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
8
+ * @link https://themehybrid.com/plugins/members-block-permissions
9
+ */
10
+
11
+ // Get the core WP select control.
12
+ const { SelectControl } = wp.components;
13
+ const { Component } = wp.element;
14
+ const labels = membersBlockPermissions.labels.controls.userStatus;
15
+
16
+ class UserStatusSelect extends Component {
17
+
18
+ render() {
19
+ let props = this.props;
20
+
21
+ let options = [
22
+ { label: labels.options.loggedIn, value: 'logged-in' },
23
+ { label: labels.options.loggedOut, value: 'logged-out' }
24
+ ];
25
+
26
+ let { blockPermissionsUserStatus } = props.attributes;
27
+
28
+ if ( ! blockPermissionsUserStatus ) {
29
+ blockPermissionsUserStatus = 'logged-in';
30
+ }
31
+
32
+ return (
33
+ <SelectControl
34
+ disabled={ ! membersBlockPermissions.userCanAssignPermissions }
35
+ key="blockPermissionsUserStatus"
36
+ label={ labels.label }
37
+ value={ blockPermissionsUserStatus }
38
+ options={ options }
39
+ onChange={ ( selected ) => {
40
+ props.setAttributes( { blockPermissionsUserStatus: selected } );
41
+ } }
42
+ />
43
+ );
44
+ }
45
+ }
46
+
47
+ export default UserStatusSelect;
addons/members-block-permissions/resources/js/editor/filter-block-edit.js ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Block edit filter.
3
+ *
4
+ * @package MembersBlockPermissions
5
+ * @author Justin Tadlock <justintadlock@gmail.com>
6
+ * @copyright 2019 Justin Tadlock
7
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
8
+ * @link https://themehybrid.com/plugins/members-block-permissions
9
+ */
10
+
11
+ // Import plugin control components.
12
+ import RoleCheckList from './controls/role-checklist';
13
+ import ConditionSelect from './controls/condition-select';
14
+ import TypeSelect from './controls/type-select';
15
+ import CapTextInput from './controls/cap-text-input';
16
+ import UpgradePrompt from './controls/upgrade-prompt';
17
+ import UserStatusSelect from './controls/user-status-select';
18
+ import MessageTextarea from './controls/message-textarea';
19
+
20
+ // Import plugin notice components.
21
+ import NotAllowedNotice from './notices/not-allowed';
22
+
23
+ // Assign core WP variables.
24
+ const { createHigherOrderComponent } = wp.compose;
25
+ const { Fragment } = wp.element;
26
+ const { InspectorControls } = wp.blockEditor;
27
+ const { addFilter } = wp.hooks;
28
+ const { PanelBody, Icon } = wp.components;
29
+ const { labels } = membersBlockPermissions;
30
+
31
+ const PermissionsIconTitle = ( props ) => (
32
+ <Fragment>
33
+ <Icon
34
+ icon={
35
+ <svg width="20px" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="users-cog" className="svg-inline--fa fa-users-cog fa-w-20" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="currentColor" d="M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z"></path></svg>
36
+ }
37
+ />
38
+ <div style={{marginLeft: '10px', position: 'relative', top: '3px'}}>
39
+ {props.title}
40
+ </div>
41
+ </Fragment>
42
+ );
43
+
44
+ const MembersBlockPermissionsBlockEdit = createHigherOrderComponent( ( BlockEdit ) => {
45
+
46
+ return ( props ) => {
47
+
48
+ let { blockPermissionsCondition = '', blockPermissionsType = '' } = props.attributes;
49
+
50
+ // If the user doesn't have permission to access Block Permissions
51
+ // and there are no existing permissions set, just return the
52
+ // block edit component.
53
+ //
54
+ // If there are permissions, we'll output a notice and disable
55
+ // each of the fields individually.
56
+
57
+ if ( ! membersBlockPermissions.userCanAssignPermissions && ! blockPermissionsCondition ) {
58
+ return (
59
+ <BlockEdit { ...props } />
60
+ );
61
+ }
62
+
63
+ return (
64
+ <Fragment>
65
+ <BlockEdit { ...props } />
66
+ <InspectorControls>
67
+ <PanelBody
68
+ title={ <PermissionsIconTitle title={labels.panel} /> }
69
+ initialOpen={ false }
70
+ className="members-bp-controls"
71
+ >
72
+
73
+ {
74
+ ! membersBlockPermissions.userCanAssignPermissions
75
+ ? <NotAllowedNotice />
76
+ : null
77
+ }
78
+
79
+ <ConditionSelect { ...props } />
80
+
81
+ {
82
+ blockPermissionsCondition
83
+ ? <TypeSelect { ...props } />
84
+ : null
85
+ }
86
+
87
+ {
88
+ blockPermissionsCondition && 'user-status' === blockPermissionsType
89
+ ? <UserStatusSelect { ...props } />
90
+ : null
91
+ }
92
+
93
+ {
94
+ blockPermissionsCondition && 'cap' === blockPermissionsType
95
+ ? <CapTextInput { ...props } />
96
+ : null
97
+ }
98
+
99
+ {
100
+ blockPermissionsCondition && 'role' === blockPermissionsType
101
+ ? <RoleCheckList { ...props } />
102
+ : null
103
+ }
104
+
105
+ {
106
+ blockPermissionsCondition && 'paidMembership' === blockPermissionsType
107
+ ? <UpgradePrompt message={ labels.paidMembership } />
108
+ : null
109
+ }
110
+
111
+ {
112
+ blockPermissionsCondition && 'contentRule' === blockPermissionsType
113
+ ? <UpgradePrompt message={ labels.contentRule } />
114
+ : null
115
+ }
116
+
117
+ {
118
+ blockPermissionsCondition && 'contentRule' !== blockPermissionsType && 'paidMembership' !== blockPermissionsType
119
+ ? <MessageTextarea { ...props } />
120
+ : null
121
+ }
122
+
123
+ </PanelBody>
124
+ </InspectorControls>
125
+ </Fragment>
126
+ );
127
+ };
128
+
129
+ }, 'MembersBlockPermissionsBlockEdit' );
130
+
131
+ addFilter( 'editor.BlockEdit', 'members/block/permissions/edit', MembersBlockPermissionsBlockEdit );
addons/members-block-permissions/resources/js/editor/filter-block-register.js ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Block registration filter.
3
+ *
4
+ * @package MembersBlockPermissions
5
+ * @author Justin Tadlock <justintadlock@gmail.com>
6
+ * @copyright 2019 Justin Tadlock
7
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
8
+ * @link https://themehybrid.com/plugins/members-block-permissions
9
+ */
10
+
11
+ const { assign } = lodash;
12
+ const { addFilter } = wp.hooks;
13
+
14
+ addFilter( 'blocks.registerBlockType', 'members/block/permissions/register', ( settings, name ) => {
15
+
16
+ settings.attributes = assign( settings.attributes, {
17
+ blockPermissionsCondition: {
18
+ type: 'string'
19
+ },
20
+ blockPermissionsType: {
21
+ type: 'string'
22
+ },
23
+ blockPermissionsUserStatus: {
24
+ type: 'string'
25
+ },
26
+ blockPermissionsRoles: {
27
+ type: 'array'
28
+ },
29
+ blockPermissionsCap: {
30
+ type: 'string'
31
+ },
32
+ blockPermissionsMessage: {
33
+ type: 'string'
34
+ }
35
+ } );
36
+
37
+ return settings;
38
+ } );
addons/members-block-permissions/resources/js/editor/filter-block-upsell.js ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Block edit filter.
3
+ *
4
+ * @package MembersBlockPermissions
5
+ * @author Caseproof LLC
6
+ * @copyright 2019 Caseproof LLC
7
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
8
+ */
9
+ import UpgradePrompt from './controls/upgrade-prompt';
10
+
11
+ // Assign core WP variables.
12
+ const { createHigherOrderComponent } = wp.compose;
13
+ const { Fragment } = wp.element;
14
+ const { addFilter } = wp.hooks;
15
+ const { PanelBody, Icon } = wp.components;
16
+ const { InspectorControls } = wp.editor;
17
+ const { title, message } = membersUpsell;
18
+
19
+ const PermissionsIconTitle = ( props ) => (
20
+ <Fragment>
21
+ <Icon
22
+ icon={
23
+ <svg width="20px" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="users-cog" className="svg-inline--fa fa-users-cog fa-w-20" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="currentColor" d="M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z"></path></svg>
24
+ }
25
+ />
26
+ <div style={{marginLeft: '10px', position: 'relative', top: '3px'}}>
27
+ {props.title}
28
+ </div>
29
+ </Fragment>
30
+ );
31
+
32
+ const MembersUpsell = createHigherOrderComponent( ( BlockEdit ) => {
33
+
34
+ return ( props ) => {
35
+
36
+ return (
37
+ <Fragment>
38
+ <BlockEdit { ...props } />
39
+ <InspectorControls>
40
+ <PanelBody
41
+ title={ <PermissionsIconTitle title={ title } /> }
42
+ initialOpen={ true }
43
+ className="members-upsell"
44
+ >
45
+ <UpgradePrompt message={ message } />
46
+ </PanelBody>
47
+ </InspectorControls>
48
+ </Fragment>
49
+ );
50
+ };
51
+
52
+ }, 'MembersUpsell' );
53
+
54
+ addFilter( 'editor.BlockEdit', 'members/block/upsell', MembersUpsell );
addons/members-block-permissions/resources/js/editor/notices/not-allowed.js ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Not allowed notice component.
3
+ *
4
+ * @package MembersBlockPermissions
5
+ * @author Justin Tadlock <justintadlock@gmail.com>
6
+ * @copyright 2019 Justin Tadlock
7
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
8
+ * @link https://themehybrid.com/plugins/members-block-permissions
9
+ */
10
+
11
+ const { Component } = wp.element;
12
+ const { Notice } = wp.components;
13
+ const { labels } = membersBlockPermissions;
14
+
15
+ class NotAllowedNotice extends Component {
16
+
17
+ render() {
18
+ return (
19
+ <div className="members-bp-notice">
20
+ <Notice status="warning" isDismissible={ false }>
21
+ <p>{ labels.notices.notAllowed }</p>
22
+ </Notice>
23
+ </div>
24
+ );
25
+ }
26
+ }
27
+
28
+ export default NotAllowedNotice;
addons/members-block-permissions/resources/js/editor/styles/upgrade-prompt.css ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .members-bp-memberpress-upgrade {
2
+ background-color: #f5f5f5;
3
+ padding: 20px;
4
+ margin-bottom: 20px;
5
+ }
6
+
7
+ .members-bp-memberpress-upgrade__cta-button {
8
+ background-color: #06429e;
9
+ color: #fff;
10
+ text-decoration: none;
11
+ border-radius: 300px;
12
+ margin: 20px auto 0;
13
+ width: auto;
14
+ text-align: center;
15
+ max-width: 200px;
16
+ padding: 10px;
17
+ display: block;
18
+ height: auto;
19
+ }
20
+
21
+ .members-bp-memberpress-upgrade__cta-button:hover {
22
+ color: #fff;
23
+ }
addons/members-block-permissions/resources/js/upsell.js ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Upsell script.
3
+ *
4
+ * @package MembersBlockPermissions
5
+ * @author Caseproof LLC
6
+ * @copyright 2019 Caseproof LLC
7
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
8
+ */
9
+
10
+ import MembersUpsell from './editor/filter-block-upsell';
addons/members-block-permissions/resources/lang/members-block-permissions.pot ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2019 Justin Tadlock
2
+ # This file is distributed under the same license as the Members - Block Permissions package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: Members - Block Permissions 1.0.0-alpha\n"
6
+ "Report-Msgid-Bugs-To: "
7
+ "https://wordpress.org/support/plugin/members-block-permissions\n"
8
+ "POT-Creation-Date: 2019-08-20 17:02:06+00:00\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=utf-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "PO-Revision-Date: 2019-MO-DA HO:MI+ZONE\n"
13
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
+ "Language-Team: LANGUAGE <LL@li.org>\n"
15
+ "X-Generator: node-wp-i18n 1.2.3\n"
16
+
17
+ #: src/Editor.php:87
18
+ msgid "Permissions"
19
+ msgstr ""
20
+
21
+ #: src/Editor.php:90 src/Editor.php:116
22
+ msgid "Capability"
23
+ msgstr ""
24
+
25
+ #: src/Editor.php:94
26
+ msgid "Condition"
27
+ msgstr ""
28
+
29
+ #: src/Editor.php:96
30
+ msgid "Show block to everyone"
31
+ msgstr ""
32
+
33
+ #: src/Editor.php:97
34
+ msgid "Show block to selected"
35
+ msgstr ""
36
+
37
+ #: src/Editor.php:98
38
+ msgid "Hide block from selected"
39
+ msgstr ""
40
+
41
+ #: src/Editor.php:103
42
+ msgid "Error Message"
43
+ msgstr ""
44
+
45
+ #: src/Editor.php:104
46
+ msgid "Optionally display an error message for users who cannot see this block."
47
+ msgstr ""
48
+
49
+ #: src/Editor.php:108
50
+ msgid "User Roles"
51
+ msgstr ""
52
+
53
+ #: src/Editor.php:112
54
+ msgid "Type"
55
+ msgstr ""
56
+
57
+ #: src/Editor.php:114 src/Editor.php:121
58
+ msgid "User Status"
59
+ msgstr ""
60
+
61
+ #: src/Editor.php:115
62
+ msgid "User Role"
63
+ msgstr ""
64
+
65
+ #: src/Editor.php:123
66
+ msgid "Logged In"
67
+ msgstr ""
68
+
69
+ #: src/Editor.php:124
70
+ msgid "Logged Out"
71
+ msgstr ""
72
+
73
+ #: src/Editor.php:128
74
+ msgid "Your user account does not have access to assign permissions to this block."
75
+ msgstr ""
76
+
77
+ #: src/Integration.php:49
78
+ msgid "Assign Block Permissions"
79
+ msgstr ""
80
+
81
+ #: src/Integration.php:50
82
+ msgid "Allows users to assign block permissions inside of the block editor."
83
+ msgstr ""
84
+
85
+ #: uninstall.php:15
86
+ msgid "%s should only be called when uninstalling the plugin."
87
+ msgstr ""
88
+
89
+ #. Plugin Name of the plugin/theme
90
+ msgid "Members - Block Permissions"
91
+ msgstr ""
92
+
93
+ #. Plugin URI of the plugin/theme
94
+ msgid "https://themehybrid.com/plugins/members-block-permissions"
95
+ msgstr ""
96
+
97
+ #. Description of the plugin/theme
98
+ msgid ""
99
+ "Allows site owners to show or hide blocks based on user status, role, or "
100
+ "capability on the front end of the site."
101
+ msgstr ""
102
+
103
+ #. Author of the plugin/theme
104
+ msgid "Justin Tadlock"
105
+ msgstr ""
106
+
107
+ #. Author URI of the plugin/theme
108
+ msgid "https://themehybrid.com"
109
+ msgstr ""
addons/members-block-permissions/resources/scss/editor.scss ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ .edit-post-settings-sidebar__panel-block .members-bp-controls {
3
+
4
+ .members-bp-notice {
5
+ margin-bottom: 24px;
6
+
7
+ .components-notice {
8
+ margin: 0;
9
+
10
+ &__content {
11
+ margin: 1em 1em 1em 0;
12
+ }
13
+ }
14
+ }
15
+
16
+ .members-bp-checklist {
17
+
18
+ &__panel {
19
+ padding: 8px;
20
+ margin-bottom: 24px;
21
+ }
22
+
23
+ &__label {
24
+ display: block;
25
+ margin-bottom: 4px;
26
+ }
27
+
28
+ &__control {
29
+ margin-bottom: 0;
30
+ }
31
+ }
32
+ }
addons/members-block-permissions/src/Activator.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin Activator.
4
+ *
5
+ * Runs the plugin activation routine.
6
+ *
7
+ * @package MembersBlockPermissions
8
+ * @author Justin Tadlock <justintadlock@gmail.com>
9
+ * @copyright 2019, Justin Tadlock
10
+ * @link https://themehybrid.com/plugins/members-block-permissions
11
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
12
+ */
13
+
14
+ namespace Members\BlockPermissions;
15
+
16
+ /**
17
+ * Activator class.
18
+ *
19
+ * @since 1.0.0
20
+ * @access public
21
+ */
22
+ class Activator {
23
+
24
+ /**
25
+ * Runs necessary code when first activating the plugin.
26
+ *
27
+ * @since 1.0.0
28
+ * @access public
29
+ * @return void
30
+ */
31
+ public static function activate() {
32
+
33
+ // Get the administrator role.
34
+ $role = get_role( 'administrator' );
35
+
36
+ // If the administrator role exists, add required capabilities
37
+ // for the plugin.
38
+ if ( ! empty( $role ) ) {
39
+ $role->add_cap( 'assign_block_permissions' );
40
+ }
41
+ }
42
+ }
addons/members-block-permissions/src/Block.php ADDED
@@ -0,0 +1,265 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Block Class.
4
+ *
5
+ * Handles front-end output of blocks.
6
+ *
7
+ * @package MembersBlockPermissions
8
+ * @author Justin Tadlock <justintadlock@gmail.com>
9
+ * @copyright 2019, Justin Tadlock
10
+ * @link https://themehybrid.com/plugins/members-block-permissions
11
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
12
+ */
13
+
14
+ namespace Members\BlockPermissions;
15
+
16
+ use WP_User;
17
+
18
+ /**
19
+ * Block component class.
20
+ *
21
+ * @since 1.0.0
22
+ * @access public
23
+ */
24
+ class Block {
25
+
26
+ /**
27
+ * Bootstraps the component.
28
+ *
29
+ * @since 1.0.0
30
+ * @access public
31
+ * @return void
32
+ */
33
+ public function boot() {
34
+ add_filter( 'pre_render_block', [ $this, 'preRenderBlock' ], PHP_INT_MAX, 2 );
35
+ }
36
+
37
+ /**
38
+ * Short-circuits block rendering on the front end if the user doesn't
39
+ * have permission view the block.
40
+ *
41
+ * @since 1.0.0
42
+ * @access public
43
+ * @param string|null $pre_render Returning anything other than null will short-circuit the block.
44
+ * @param array $block The block data.
45
+ * @return mixed
46
+ */
47
+ public function preRenderBlock( $pre_render, $block ) {
48
+
49
+ // Bail if we're in the admin or there are no block attributes.
50
+ if ( is_admin() || ! isset( $block['attrs'] ) ) {
51
+ return $pre_render;
52
+ }
53
+
54
+ // Bail if there isn't a condition set.
55
+ if ( ! isset( $block['attrs']['blockPermissionsCondition'] ) || ! $block['attrs']['blockPermissionsCondition'] ) {
56
+ return $pre_render;
57
+ }
58
+
59
+ // Bail if there isn't a type set.
60
+ if ( ! isset( $block['attrs']['blockPermissionsType'] ) || ! $block['attrs']['blockPermissionsType'] ) {
61
+ return $pre_render;
62
+ }
63
+
64
+ // Gets the permissions type.
65
+ $type = $block['attrs']['blockPermissionsType'];
66
+
67
+ // Assume that we will render this block by default.
68
+ $maybe_render = true;
69
+
70
+ // Check the permission type to determine whether we will render
71
+ // the block.
72
+ if ( 'user-status' === $type ) {
73
+ $maybe_render = $this->checkUserStatus( $block );
74
+ } elseif ( 'role' === $type ) {
75
+ $maybe_render = $this->checkRole( $block );
76
+ } elseif ( 'cap' === $type ) {
77
+ $maybe_render = $this->checkCap( $block );
78
+ }
79
+
80
+ // If the block should not be rendered.
81
+ if ( ! $maybe_render ) {
82
+
83
+ // Set to an empty string by default, which will short-
84
+ // circuit the block output.
85
+ $pre_render = '';
86
+
87
+ // Get the error message.
88
+ $message = isset( $block['attrs']['blockPermissionsMessage'] )
89
+ ? $block['attrs']['blockPermissionsMessage']
90
+ : '';
91
+
92
+ // Allow devs to overwrite the message.
93
+ $message = apply_filters(
94
+ 'members/block/permissions/error/message',
95
+ $message,
96
+ $block
97
+ );
98
+
99
+ // Check if there's an error message and use it if so.
100
+ if ( $message ) {
101
+
102
+ $class = apply_filters(
103
+ 'members/block/permissions/error/class',
104
+ [ 'block-permissions-error' ],
105
+ $block
106
+ );
107
+
108
+ $pre_render = sprintf(
109
+ '<div class="%s">%s</div>',
110
+ esc_attr( join( ' ', $class ) ),
111
+ wpautop( $message )
112
+ );
113
+
114
+ $pre_render = apply_filters(
115
+ 'members/block/permissions/error',
116
+ $pre_render,
117
+ $block
118
+ );
119
+ }
120
+ }
121
+
122
+ return $pre_render;
123
+ }
124
+
125
+ /**
126
+ * Determines whether to render the block based on user status.
127
+ *
128
+ * @since 1.0.0
129
+ * @access protected
130
+ * @param array $block The block data.
131
+ * @return bool
132
+ */
133
+ protected function checkUserStatus( $block ) {
134
+
135
+ $maybe_render = true;
136
+ $user_status = false;
137
+
138
+ if ( isset( $block['attrs']['blockPermissionsUserStatus'] ) && $block['attrs']['blockPermissionsUserStatus'] ) {
139
+ $user_status = $block['attrs']['blockPermissionsUserStatus'];
140
+ }
141
+
142
+ // Bail if we don't have a user status.
143
+ if ( ! $user_status ) {
144
+ return $maybe_render;
145
+ }
146
+
147
+ $condition = $block['attrs']['blockPermissionsCondition'];
148
+
149
+ if ( '=' === $condition ) {
150
+
151
+ $maybe_render = false;
152
+
153
+ if ( 'logged-in' === $user_status && is_user_logged_in() ) {
154
+ $maybe_render = true;
155
+ } elseif ( 'logged-out' === $user_status && ! is_user_logged_in() ) {
156
+ $maybe_render = true;
157
+ }
158
+
159
+ } elseif ( '!=' === $condition ) {
160
+
161
+ $maybe_render = true;
162
+
163
+ if ( 'logged-in' === $user_status && is_user_logged_in() ) {
164
+ $maybe_render = false;
165
+ } elseif ( 'logged-out' === $user_status && ! is_user_logged_in() ) {
166
+ $maybe_render = false;
167
+ }
168
+ }
169
+
170
+ return $maybe_render;
171
+ }
172
+
173
+ /**
174
+ * Determines whether to render the block based on user role.
175
+ *
176
+ * @since 1.0.0
177
+ * @access protected
178
+ * @param array $block The block data.
179
+ * @return bool
180
+ */
181
+ protected function checkRole( $block ) {
182
+
183
+ $maybe_render = true;
184
+ $roles = false;
185
+
186
+ if ( isset( $block['attrs']['blockPermissionsRoles'] ) && is_array( $block['attrs']['blockPermissionsRoles'] ) && $block['attrs']['blockPermissionsRoles'] ) {
187
+ $roles = $block['attrs']['blockPermissionsRoles'];
188
+ }
189
+
190
+ // Bail if we don't have any roles.
191
+ if ( ! $roles ) {
192
+ return $maybe_render;
193
+ }
194
+
195
+ $condition = $block['attrs']['blockPermissionsCondition'];
196
+
197
+ if ( '=' === $condition ) {
198
+
199
+ $maybe_render = false;
200
+
201
+ if ( is_user_logged_in() ) {
202
+ $user = new WP_User( get_current_user_id() );
203
+
204
+ foreach ( (array) $user->roles as $role ) {
205
+
206
+ if ( in_array( $role, $roles ) ) {
207
+ $maybe_render = true;
208
+ break;
209
+ }
210
+ }
211
+ }
212
+
213
+ } elseif ( '!=' === $condition ) {
214
+
215
+ $maybe_render = true;
216
+
217
+ if ( is_user_logged_in() ) {
218
+ $user = new WP_User( get_current_user_id() );
219
+
220
+ foreach ( (array) $user->roles as $role ) {
221
+
222
+ if ( in_array( $role, $roles ) ) {
223
+ $maybe_render = false;
224
+ break;
225
+ }
226
+ }
227
+ }
228
+ }
229
+
230
+ return $maybe_render;
231
+ }
232
+
233
+ /**
234
+ * Determines whether to render the block based on capability.
235
+ *
236
+ * @since 1.0.0
237
+ * @access protected
238
+ * @param array $block The block data.
239
+ * @return bool
240
+ */
241
+ protected function checkCap( $block ) {
242
+
243
+ $maybe_render = true;
244
+ $cap = false;
245
+
246
+ if ( isset( $block['attrs']['blockPermissionsCap'] ) && $block['attrs']['blockPermissionsCap'] ) {
247
+ $cap = $block['attrs']['blockPermissionsCap'];
248
+ }
249
+
250
+ // Bail if we have no capability.
251
+ if ( ! $cap ) {
252
+ return $maybe_render;
253
+ }
254
+
255
+ $condition = $block['attrs']['blockPermissionsCondition'];
256
+
257
+ if ( '=' === $condition ) {
258
+ $maybe_render = current_user_can( $cap );
259
+ } elseif ( '!=' === $condition ) {
260
+ $maybe_render = ! current_user_can( $cap );
261
+ }
262
+
263
+ return $maybe_render;
264
+ }
265
+ }
addons/members-block-permissions/src/Editor.php ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Editor Class.
4
+ *
5
+ * Handles block editor functionality.
6
+ *
7
+ * @package MembersBlockPermissions
8
+ * @author Justin Tadlock <justintadlock@gmail.com>
9
+ * @copyright 2019, Justin Tadlock
10
+ * @link https://themehybrid.com/plugins/members-block-permissions
11
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
12
+ */
13
+
14
+ namespace Members\BlockPermissions;
15
+
16
+ /**
17
+ * Editor component class.
18
+ *
19
+ * @since 1.0.0
20
+ * @access public
21
+ */
22
+ class Editor {
23
+
24
+ /**
25
+ * Bootstraps the component.
26
+ *
27
+ * @since 1.0.0
28
+ * @access public
29
+ * @return void
30
+ */
31
+ public function boot() {
32
+ add_action( 'enqueue_block_editor_assets', [ $this, 'enqueue'] );
33
+ }
34
+
35
+ /**
36
+ * Enqueues the editor assets.
37
+ *
38
+ * @since 1.0.0
39
+ * @access public
40
+ * @return void
41
+ */
42
+ public function enqueue() {
43
+
44
+ wp_enqueue_script(
45
+ 'members-block-permissions-editor',
46
+ plugin()->asset( 'js/editor.js' ),
47
+ [
48
+ 'lodash',
49
+ 'wp-block-editor',
50
+ 'wp-compose',
51
+ 'wp-components',
52
+ 'wp-element',
53
+ 'wp-hooks'
54
+ ],
55
+ null,
56
+ true
57
+ );
58
+
59
+ wp_localize_script(
60
+ 'members-block-permissions-editor',
61
+ 'membersBlockPermissions',
62
+ $this->jsonData()
63
+ );
64
+
65
+ wp_enqueue_style(
66
+ 'members-block-permissions-editor',
67
+ plugin()->asset( 'css/editor.css' ),
68
+ [],
69
+ null
70
+ );
71
+ }
72
+
73
+ /**
74
+ * Returns an array of the data that is passed to the script via JSON.
75
+ *
76
+ * @since 1.0.0
77
+ * @access private
78
+ * @return array
79
+ */
80
+ private function jsonData() {
81
+
82
+ $labels = [
83
+ 'controls' => [],
84
+ 'notices' => []
85
+ ];
86
+
87
+ $labels['panel'] = __( 'Permissions', 'members' );
88
+
89
+ $labels['controls']['cap'] = [
90
+ 'label' => __( 'Capability', 'members' )
91
+ ];
92
+
93
+ $labels['controls']['condition'] = [
94
+ 'label' => __( 'Condition', 'members' ),
95
+ 'options' => [
96
+ 'default' => __( 'Show block to everyone', 'members' ),
97
+ 'show' => __( 'Show block to selected', 'members' ),
98
+ 'hide' => __( 'Hide block from selected', 'members' )
99
+ ]
100
+ ];
101
+
102
+ $labels['controls']['message'] = [
103
+ 'label' => __( 'Error Message', 'members' ),
104
+ 'help' => __( 'Optionally display an error message for users who cannot see this block.', 'members' )
105
+ ];
106
+
107
+ $labels['controls']['roles'] = [
108
+ 'label' => __( 'User Roles', 'members' )
109
+ ];
110
+
111
+ $labels['controls']['type'] = [
112
+ 'label' => __( 'Type', 'members' ),
113
+ 'options' => [
114
+ 'userStatus' => __( 'User Status', 'members' ),
115
+ 'role' => __( 'User Role', 'members' ),
116
+ 'cap' => __( 'Capability', 'members' ),
117
+ 'paidMembership' => __( 'Paid Membership', 'members' ),
118
+ 'contentRule' => __( 'Content Protection Rule', 'members' )
119
+ ]
120
+ ];
121
+
122
+ $labels['controls']['userStatus'] = [
123
+ 'label' => __( 'User Status', 'members' ),
124
+ 'options' => [
125
+ 'loggedIn' => __( 'Logged In', 'members' ),
126
+ 'loggedOut' => __( 'Logged Out', 'members' )
127
+ ]
128
+ ];
129
+
130
+ $labels['notices']['notAllowed'] = __( 'Your user account does not have access to assign permissions to this block.', 'members' );
131
+ $labels['paidMembership'] = __( 'To protect this block by paid membership or centrally with a content protection rule, upgrade to MemberPress.', 'members' );
132
+ $labels['contentRule'] = __( 'To protect this block by paid membership or centrally with a content protection rule, upgrade to MemberPress.', 'members' );
133
+
134
+ $data = [
135
+ 'roles' => [],
136
+ 'labels' => $labels,
137
+ 'userCanAssignPermissions' => current_user_can( 'assign_block_permissions' )
138
+ ];
139
+
140
+ $_roles = wp_roles()->roles;
141
+ ksort( $_roles );
142
+
143
+ foreach ( $_roles as $role => $args ) {
144
+ $data['roles'][] = [
145
+ 'name' => $role,
146
+ 'label' => $args['name']
147
+ ];
148
+ }
149
+
150
+ return $data;
151
+ }
152
+ }
addons/members-block-permissions/src/Integration.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Integration Class.
4
+ *
5
+ * Integrates the plugin with the Members plugin.
6
+ *
7
+ * @package MembersBlockPermissions
8
+ * @author Justin Tadlock <justintadlock@gmail.com>
9
+ * @copyright 2019, Justin Tadlock
10
+ * @link https://themehybrid.com/plugins/members-block-permissions
11
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
12
+ */
13
+
14
+ namespace Members\BlockPermissions;
15
+
16
+ use function members_register_cap;
17
+
18
+ /**
19
+ * Integration component class.
20
+ *
21
+ * @since 1.0.0
22
+ * @access public
23
+ */
24
+ class Integration {
25
+
26
+ /**
27
+ * Bootstraps the component.
28
+ *
29
+ * @since 1.0.0
30
+ * @access public
31
+ * @return void
32
+ */
33
+ public function boot() {
34
+ add_action( 'members_register_caps', [ $this, 'registerCaps' ] );
35
+ }
36
+
37
+ /**
38
+ * Registers our custom capability with the Members plugin.
39
+ *
40
+ * @since 1.0.0
41
+ * @access public
42
+ * @return void
43
+ */
44
+ public function registerCaps() {
45
+
46
+ if ( function_exists( 'members_register_cap' ) ) {
47
+
48
+ members_register_cap( 'assign_block_permissions', [
49
+ 'label' => __( 'Assign Block Permissions', 'members' ),
50
+ 'description' => __( 'Allows users to assign block permissions inside of the block editor.', 'members' ),
51
+ 'group' => 'type-wp_block'
52
+ ] );
53
+ }
54
+ }
55
+ }
addons/members-block-permissions/src/Plugin.php ADDED
@@ -0,0 +1,190 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Primary plugin class.
4
+ *
5
+ * Launches the plugin components and acts as a simple container.
6
+ *
7
+ * @package MembersBlockPermissions
8
+ * @author Justin Tadlock <justintadlock@gmail.com>
9
+ * @copyright 2019, Justin Tadlock
10
+ * @link https://themehybrid.com/plugins/members-block-permissions
11
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
12
+ */
13
+
14
+ namespace Members\BlockPermissions;
15
+
16
+ /**
17
+ * Plugin class.
18
+ *
19
+ * @since 1.0.0
20
+ * @access public
21
+ */
22
+ class Plugin {
23
+
24
+ /**
25
+ * Stores the plugin directory path.
26
+ *
27
+ * @since 1.0.0
28
+ * @access protected
29
+ * @var string
30
+ */
31
+ protected $path;
32
+
33
+ /**
34
+ * Stores the plugin directory URI.
35
+ *
36
+ * @since 1.0.0
37
+ * @access protected
38
+ * @var string
39
+ */
40
+ protected $uri;
41
+
42
+ /**
43
+ * Stores the the `public/mix-manifest.json` data as an array.
44
+ *
45
+ * @since 1.0.0
46
+ * @access private
47
+ * @var array
48
+ */
49
+ private $mix = [];
50
+
51
+ /**
52
+ * Holds an array of the plugin component objects.
53
+ *
54
+ * @since 1.0.0
55
+ * @access protected
56
+ * @var array
57
+ */
58
+ protected $components = [];
59
+
60
+ /**
61
+ * Sets up the object properties.
62
+ *
63
+ * @since 1.0.0
64
+ * @access public
65
+ * @param string $path Plugin directory path.
66
+ * @param string $uri Plugin directory URI.
67
+ * @return void
68
+ */
69
+ public function __construct( $path, $uri ) {
70
+
71
+ $this->path = untrailingslashit( $path );
72
+ $this->uri = untrailingslashit( $uri );
73
+
74
+ $this->registerDefaultComponents();
75
+ }
76
+
77
+ /**
78
+ * Bootstraps the components.
79
+ *
80
+ * @since 1.0.0
81
+ * @access public
82
+ * @return void
83
+ */
84
+ public function boot() {
85
+
86
+ // Bootstrap components.
87
+ foreach ( $this->components as $component ) {
88
+ $component->boot();
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Returns the plugin path.
94
+ *
95
+ * @since 1.0.0
96
+ * @access public
97
+ * @param string $file
98
+ * @return string
99
+ */
100
+ public function path( $file = '' ) {
101
+
102
+ $file = ltrim( $file, '/' );
103
+
104
+ return $file ? $this->path . "/{$file}" : $this->path;
105
+ }
106
+
107
+ /**
108
+ * Returns the plugin URI.
109
+ *
110
+ * @since 1.0.0
111
+ * @access public
112
+ * @param string $file
113
+ * @return string
114
+ */
115
+ public function uri( $file = '' ) {
116
+
117
+ $file = ltrim( $file, '/' );
118
+
119
+ return $file ? $this->uri . "/{$file}" : $this->uri;
120
+ }
121
+
122
+ /**
123
+ * Helper function for outputting an asset URL in the plugin.
124
+ *
125
+ * @since 1.0.0
126
+ * @access public
127
+ * @param string $path A relative path/file to append to the `public` folder.
128
+ * @return string
129
+ */
130
+ function asset( $path ) {
131
+
132
+ if ( ! $this->mix ) {
133
+ $file = $this->path( 'public/mix-manifest.json' );
134
+ $this->mix = (array) json_decode( file_get_contents( $file ), true );
135
+ }
136
+
137
+ // Make sure to trim any slashes from the front of the path.
138
+ $path = '/' . ltrim( $path, '/' );
139
+
140
+ if ( $this->mix && isset( $this->mix[ $path ] ) ) {
141
+ $path = $this->mix[ $path ];
142
+ }
143
+
144
+ return $this->uri( 'public' . $path );
145
+ }
146
+
147
+ /**
148
+ * Registers the default plugin components.
149
+ *
150
+ * @since 1.0.0
151
+ * @access public
152
+ * @return void
153
+ */
154
+ protected function registerDefaultComponents() {
155
+
156
+ $components = [
157
+ Block::class,
158
+ Editor::class,
159
+ Integration::class
160
+ ];
161
+
162
+ foreach ( $components as $component ) {
163
+ $this->registerComponent( $component );
164
+ }
165
+ }
166
+
167
+ /**
168
+ * Returns a plugin component.
169
+ *
170
+ * @since 1.0.0
171
+ * @access public
172
+ * @param string $abstract
173
+ * @return object
174
+ */
175
+ public function getComponent( $abstract ) {
176
+ return $this->components[ $abstract ];
177
+ }
178
+
179
+ /**
180
+ * Registers a plugin component.
181
+ *
182
+ * @since 1.0.0
183
+ * @access public
184
+ * @param string $abstract
185
+ * @return void
186
+ */
187
+ protected function registerComponent( $abstract ) {
188
+ $this->components[ $abstract ] = new $abstract();
189
+ }
190
+ }
addons/members-block-permissions/webpack.mix.export.js ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ // Import required packages.
3
+ const mix = require( 'laravel-mix' );
4
+ const rimraf = require( 'rimraf' );
5
+ const fs = require( 'fs' );
6
+
7
+ // Folder name to export the files to.
8
+ let exportPath = 'members-block-permissions';
9
+
10
+ // Theme root-level files to include.
11
+ let files = [
12
+ 'changelog.md',
13
+ 'license.md',
14
+ 'plugin.php',
15
+ 'readme.md',
16
+ 'uninstall.php'
17
+ ];
18
+
19
+ // Folders to include.
20
+ let folders = [
21
+ 'src',
22
+ 'public'
23
+ ];
24
+
25
+ // Delete the previous export to start clean.
26
+ rimraf.sync( exportPath );
27
+
28
+ // Loop through the root files and copy them over.
29
+ files.forEach( file => {
30
+
31
+ if ( fs.existsSync( file ) ) {
32
+ mix.copy( file, `${exportPath}/${file}` );
33
+ }
34
+ } );
35
+
36
+ // Loop through the folders and copy them over.
37
+ folders.forEach( folder => {
38
+
39
+ if ( fs.existsSync( folder ) ) {
40
+ mix.copyDirectory( folder, `${exportPath}/${folder}` );
41
+ }
42
+ } );
43
+
44
+ // Delete the `vendor/bin` and `vendor/composer/installers` folder, which can
45
+ // get left over, even in production. Mix will also create an additional
46
+ // `mix-manifest.json` file in the root, which we don't need.
47
+ mix.then( () => {
48
+
49
+ let files = [
50
+ 'mix-manifest.json'
51
+ ];
52
+
53
+ files.forEach( file => {
54
+ if ( fs.existsSync( file ) ) {
55
+ rimraf.sync( file );
56
+ }
57
+ } );
58
+ } );
addons/members-block-permissions/webpack.mix.js ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Lavarel Mix Config.
3
+ *
4
+ * Laravel Mix is a simplified wrapper for Webpack. Use this file to add CSS/JS
5
+ * files to compile.
6
+ *
7
+ * @package CustomizeSectionButton
8
+ * @author WPTRT <themes@wordpress.org>
9
+ * @copyright 2019 WPTRT
10
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
11
+ * @link https://github.com/WPTRT/customize-section-button
12
+ */
13
+
14
+ // Import required packages.
15
+ const mix = require( 'laravel-mix' );
16
+
17
+ // Set dev path.
18
+ const devPath = 'resources';
19
+
20
+ // Run the export process.
21
+ if ( process.env.export ) {
22
+ const exportTheme = require( './webpack.mix.export.js' );
23
+ return;
24
+ }
25
+
26
+ // Set public path.
27
+ mix.setPublicPath( 'public' );
28
+
29
+ // Set options.
30
+ mix.options( {
31
+ postCss : [ require( 'postcss-preset-env' )() ],
32
+ processCssUrls : false
33
+ } );
34
+
35
+ // Source maps.
36
+ mix.sourceMaps();
37
+
38
+ // Versioning and cache-busting with `mix-manifest.json`.
39
+ mix.version();
40
+
41
+ // Compile JS.
42
+ mix.react( `${devPath}/js/editor.js`, 'js' );
43
+ mix.react( `${devPath}/js/upsell.js`, 'js' );
44
+
45
+ // Sass configuration.
46
+ var sassConfig = {
47
+ outputStyle : 'expanded',
48
+ indentType : 'tab',
49
+ indentWidth : 1
50
+ };
51
+
52
+ // Compile SASS/CSS.
53
+ mix.sass( `${devPath}/scss/editor.scss`, 'css', sassConfig );
54
+
55
+ // Extra Webpack config.
56
+ mix.webpackConfig( {
57
+ stats : 'minimal',
58
+ devtool : mix.inProduction() ? false : 'source-map',
59
+ performance : { hints : false },
60
+ externals : { jquery : 'jQuery' },
61
+ } );
addons/members-category-and-tag-caps/.gitignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ /node_modules
2
+ /vendor
3
+ /composer.lock
4
+ /phpcs.xml
5
+ /.phpcs.xml
6
+ *.map
addons/members-category-and-tag-caps/addon.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Members\CategoryAndTagCaps;
4
+
5
+ use Members\CategoryAndTagCaps\Activator;
6
+
7
+ // Don't execute code if file is accessed directly.
8
+ defined( 'ABSPATH' ) || exit;
9
+
10
+ /**
11
+ * Registers the plugin activation callback.
12
+ *
13
+ * @since 1.0.0
14
+ * @access public
15
+ * @return void
16
+ */
17
+ register_activation_hook( __FILE__, function() {
18
+ require_once 'src/Activator.php';
19
+ Activator::activate();
20
+ } );
21
+
22
+ # Load plugin files.
23
+ require_once 'src/functions-filters.php';
addons/members-category-and-tag-caps/changelog.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ # Change Log
2
+
3
+ ## [1.0.0] - 2019-08-04
4
+
5
+ ### Added
6
+
7
+ - Plugin launch. Everything's new!
addons/members-category-and-tag-caps/readme.md ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Members - Category and Tag Caps
2
+
3
+ The Category and Tag Caps add-on creates custom capabilities for the core category and post tag taxonomies. This allows site owners to have precise control over who can manage, edit, delete, or assign categories/tags.
4
+
5
+ The plugin creates the following capabilities, which can be managed from the edit role screen.
6
+
7
+ - **Categories:**
8
+ - `manage_categories` - Allows access to the Posts > Categories admin screen.
9
+ - `edit_categories` - Allows users to edit categories.
10
+ - `delete_categories` - Allows users to delete categories.
11
+ - `assign_categories` - Allows users to assign categories to posts.
12
+ - **Tags:**
13
+ - `manage_post_tags` - Allows access to the Posts > Tags admin screen.
14
+ - `edit_post_tags` - Allows users to edit tags.
15
+ - `delete_post_tags` - Allows users to delete tags.
16
+ - `assign_post_tags` - Allows users to assign tags to posts.
17
+
18
+ The [Members WordPress plugin](https://themehybrid.com/plugins/members) is required to be installed and activated for this plugin to work.
19
+
20
+ ## Copyright and License
21
+
22
+ This project is licensed under the [GNU GPL](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html), version 2 or later.
23
+
24
+ 2019 &copy; [Justin Tadlock](http://justintadlock.com).
addons/members-category-and-tag-caps/src/Activator.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin Activator.
4
+ *
5
+ * Runs the plugin activation routine.
6
+ *
7
+ * @package MembersCategoryAndTagCaps
8
+ * @author Justin Tadlock <justintadlock@gmail.com>
9
+ * @copyright 2019, Justin Tadlock
10
+ * @link https://themehybrid.com/plugins/members-category-and-tag-caps
11
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
12
+ */
13
+
14
+ namespace Members\CategoryAndTagCaps;
15
+
16
+ /**
17
+ * Activator class.
18
+ *
19
+ * @since 1.0.0
20
+ * @access public
21
+ */
22
+ class Activator {
23
+
24
+ /**
25
+ * Runs necessary code when first activating the plugin.
26
+ *
27
+ * @since 1.0.0
28
+ * @access public
29
+ * @return void
30
+ */
31
+ public static function activate() {
32
+
33
+ // Get the administrator role.
34
+ $role = get_role( 'administrator' );
35
+
36
+ // If the administrator role exists, add required capabilities
37
+ // for the plugin.
38
+ if ( ! empty( $role ) ) {
39
+
40
+ $role->add_cap( 'manage_categories' );
41
+ $role->add_cap( 'assign_categories' );
42
+ $role->add_cap( 'edit_categories' );
43
+ $role->add_cap( 'delete_categories' );
44
+
45
+ $role->add_cap( 'manage_post_tags' );
46
+ $role->add_cap( 'assign_post_tags' );
47
+ $role->add_cap( 'edit_post_tags' );
48
+ $role->add_cap( 'delete_post_tags' );
49
+ }
50
+ }
51
+ }
addons/members-category-and-tag-caps/src/functions-filters.php ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin filters.
4
+ *
5
+ * @package MembersCategoryAndTagCaps
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-category-and-tag-caps
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\CategoryAndTagCaps;
13
+
14
+ // Don't execute code if file is accessed directly.
15
+ defined( 'ABSPATH' ) || exit;
16
+
17
+ /**
18
+ * Filters the category and tag registration arguments and overwrites their
19
+ * capabilities with custom ones.
20
+ *
21
+ * @since 1.0.0
22
+ * @access public
23
+ * @param array $args Array of taxonomy options.
24
+ * @param string $taxonomy Name/Slug of the taxonomy.
25
+ * @return array
26
+ */
27
+ add_filter( 'register_taxonomy_args', function( $args, $taxonomy ) {
28
+
29
+ if ( 'category' === $taxonomy || 'post_tag' === $taxonomy ) {
30
+
31
+ if ( ! isset( $args['capabilities'] ) || ! is_array( $args['capabilities'] ) ) {
32
+ $args['capabilities'] = [];
33
+ }
34
+
35
+ if ( 'category' === $taxonomy ) {
36
+ $args['capabilities']['manage_terms'] = 'manage_categories';
37
+ $args['capabilities']['assign_terms'] = 'assign_categories';
38
+ $args['capabilities']['edit_terms'] = 'edit_categories';
39
+ $args['capabilities']['delete_terms'] = 'delete_categories';
40
+ } elseif ( 'post_tag' === $taxonomy ) {
41
+ $args['capabilities']['manage_terms'] = 'manage_post_tags';
42
+ $args['capabilities']['assign_terms'] = 'assign_post_tags';
43
+ $args['capabilities']['edit_terms'] = 'edit_post_tags';
44
+ $args['capabilities']['delete_terms'] = 'delete_post_tags';
45
+ }
46
+ }
47
+
48
+ return $args;
49
+
50
+ }, 10, 2 );
51
+
52
+ /**
53
+ * Filters `map_meta_cap` to make sure core recognizes the appropriate capabilities
54
+ * when looking for category and tag permission.
55
+ *
56
+ * @since 1.0.0
57
+ * @access public
58
+ * @param array $caps Array of capabilities the user must have.
59
+ * @param string $cap The current capability being checked.
60
+ * @return array
61
+ */
62
+ add_filter( 'map_meta_cap', function( $caps, $cap ) {
63
+
64
+ // Category caps.
65
+ if ( 'manage_categories' === $cap ) {
66
+
67
+ return [ get_taxonomy( 'category' )->cap->manage_terms ];
68
+
69
+ } elseif ( 'assign_categories' === $cap ) {
70
+
71
+ return [ get_taxonomy( 'category' )->cap->assign_terms ];
72
+
73
+ } elseif ( 'edit_categories' === $cap ) {
74
+
75
+ return [ get_taxonomy( 'category' )->cap->edit_terms ];
76
+
77
+ } elseif ( 'delete_categories' === $cap ) {
78
+
79
+ return [ get_taxonomy( 'category' )->cap->delete_terms ];
80
+
81
+ // Tag caps.
82
+ } elseif ( 'manage_post_tags' === $cap ) {
83
+
84
+ return [ get_taxonomy( 'post_tag' )->cap->manage_terms ];
85
+
86
+ } elseif ( 'assign_post_tags' === $cap ) {
87
+
88
+ return [ get_taxonomy( 'post_tag' )->cap->assign_terms ];
89
+
90
+ } elseif ( 'edit_post_tags' === $cap ) {
91
+
92
+ return [ get_taxonomy( 'post_tag' )->cap->edit_terms ];
93
+
94
+ } elseif ( 'delete_post_tags' === $cap ) {
95
+
96
+ return [ get_taxonomy( 'post_tag' )->cap->delete_terms ];
97
+ }
98
+
99
+ return $caps;
100
+
101
+ }, 10, 2 );
addons/members-category-and-tag-caps/uninstall.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Uninstall routine.
4
+ *
5
+ * @package MembersCategoryAndTagCaps
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-category-and-tag-caps
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ // Make sure we're actually uninstalling the plugin.
13
+ if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
14
+ wp_die( sprintf(
15
+ __( '%s should only be called when uninstalling the plugin.', 'members-category-and-tag-caps' ),
16
+ '<code>' . __FILE__ . '</code>'
17
+ ) );
18
+ exit;
19
+ }
20
+
21
+ // Get all roles.
22
+
23
+ $roles = wp_roles();
24
+
25
+ // Get an array of the plugin's caps.
26
+ //
27
+ // Note that we're not including `manage_categories` here because it is a core
28
+ // WordPress cap. We don't want to remove it.
29
+
30
+ $plugin_caps = [
31
+ 'assign_categories',
32
+ 'edit_categories',
33
+ 'delete_categories',
34
+ 'manage_post_tags',
35
+ 'assign_post_tags',
36
+ 'edit_post_tags',
37
+ 'delete_post_tags'
38
+ ];
39
+
40
+ // Loop through all roles and remove the plugin's capabilities because they will
41
+ // no longer work once the plugin is uninstalled.
42
+
43
+ foreach ( array_keys( $roles->get_names() ) as $name ) {
44
+
45
+ // Get the role object.
46
+ $role = $roles->get_role( $name );
47
+
48
+ foreach ( $plugin_caps as $cap ) {
49
+
50
+ // Check if the role has the cap before trying to remove it.
51
+ if ( $role->has_cap( $cap ) ) {
52
+ $roles->remove_cap( $name, $cap );
53
+ }
54
+ }
55
+ }
addons/members-core-create-caps/addon.php ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Members\Core_Create_Caps;
4
+
5
+ # Register custom caps with Members.
6
+ add_action( 'members_register_caps', __NAMESPACE__ . '\register_caps' );
7
+
8
+ # Add admin menu hack.
9
+ add_action( 'admin_menu', __NAMESPACE__ . '\admin_menu', 99 );
10
+
11
+ # Overwrite core post type caps.
12
+ add_filter( 'register_post_type_args', __NAMESPACE__ . '\register_post_type_args', 10, 2 );
13
+
14
+ /**
15
+ * Registers our custom `create_*` capabilities with the Members plugin.
16
+ *
17
+ * @since 1.0.0
18
+ * @access public
19
+ * @return void
20
+ */
21
+ function register_caps() {
22
+
23
+ if ( ! members_cap_exists( 'create_posts' ) ) {
24
+
25
+ members_register_cap( 'create_posts', array( 'label' => __( 'Create Posts', 'members' ) ) );
26
+ }
27
+
28
+ if ( ! members_cap_exists( 'create_pages' ) ) {
29
+
30
+ members_register_cap( 'create_pages', array( 'label' => __( 'Create Pages', 'members' ) ) );
31
+ }
32
+ }
33
+
34
+ /**
35
+ * Filter on `register_post_type_args` for the post and page post types. We need
36
+ * to register the caps with the post type.
37
+ *
38
+ * @since 1.0.0
39
+ * @access public
40
+ * @param array $args
41
+ * @param string $name
42
+ * @return array
43
+ */
44
+ function register_post_type_args( $args, $name ) {
45
+
46
+ if ( in_array( $name, array( 'post', 'page' ) ) ) {
47
+
48
+ if ( ! isset( $args['capabilities'] ) )
49
+ $args['capabilities'] = array();
50
+
51
+ $args['capabilities']['create_posts'] = 'page' === $name ? 'create_pages' : 'create_posts';
52
+ }
53
+
54
+ return $args;
55
+ }
56
+
57
+ /**
58
+ * This is a nasty hack to fix to fix a core bug with the way it handles access to admin
59
+ * pages. We must add a fake page, which we later remove with JS.
60
+ *
61
+ * @link https://core.trac.wordpress.org/ticket/22895
62
+ * @since 1.0.0
63
+ * @access public
64
+ * @return void
65
+ */
66
+ function admin_menu() {
67
+
68
+ $do_js = false;
69
+
70
+ if ( current_user_can( 'edit_posts' ) && ! current_user_can( 'create_posts' ) ) {
71
+
72
+ $do_js = true;
73
+
74
+ add_submenu_page( 'edit.php', '', '', 'edit_posts', 'members-core-create-caps', '__return_false' );
75
+ }
76
+
77
+ if ( current_user_can( 'edit_pages' ) && ! current_user_can( 'create_pages' ) ) {
78
+
79
+ $do_js = true;
80
+
81
+ add_submenu_page( 'edit.php?post_type=page', '', '', 'edit_pages', 'members-core-create-caps', '__return_false' );
82
+ }
83
+
84
+ if ( $do_js ) {
85
+
86
+ add_action( 'admin_footer', __NAMESPACE__ . '\admin_footer_scripts' );
87
+ }
88
+ }
89
+
90
+ /**
91
+ * JS to remove our fake admin page hack.
92
+ *
93
+ * @since 1.0.0
94
+ * @access public
95
+ * @return void
96
+ */
97
+ function admin_footer_scripts() { ?>
98
+
99
+ <script>( function() {
100
+
101
+ var menuLinks = document.querySelectorAll( '#adminmenu li > a[href*="page=members-core-create-caps"]' );
102
+
103
+ for ( var i = 0; i < menuLinks.length; i++ ) {
104
+
105
+ var menuItem = menuLinks[ i ].parentNode;
106
+
107
+ if ( null !== menuItem ) {
108
+
109
+ menuItem.parentNode.removeChild( menuItem );
110
+ }
111
+ }
112
+ }() );</script>
113
+ <?php }
addons/members-core-create-caps/changelog.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ # Change Log
2
+
3
+ ## [1.0.0] - 2017-12-11
4
+
5
+ ### Added
6
+
7
+ * Plugin launch. Everything's new!
addons/members-core-create-caps/contributing.md ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contributing
2
+
3
+ The code for the project is handled via its [GitHub Repository](https://github.com/justintadlock/members-core-create-caps). You can open tickets, create patches, and send pull requests there.
4
+
5
+ ## Pull requests
6
+
7
+ Problem first. Solution second.
8
+
9
+ Pull requests should have a ticket open for discussion first. I rarely accept pull requests that aren't for a specific issue for various reasons. It's far better to post an issue and let me or the community provide feedback prior to creating a pull request.
10
+
11
+ Please don't make pull requests against the `master` branch. This is the latest, stable code. You can make a pull request against one of the point branches or the `dev` (future release) branch.
12
+
13
+ ## Coding standards
14
+
15
+ In general, the project follows all WordPress [coding standards](https://make.wordpress.org/core/handbook/best-practices/coding-standards). There are instances where it doesn't, opting for personal choices of my own, but in terms of contributing, following the WordPress standards is best practice.
16
+
17
+ ## Script and style files
18
+
19
+ The project consists of several script and style files. When making patches or pull requests with changes to these files, only do so to the primary file. Don't create patches for the minified (`.min`) versions of the files. Those will be minified after a patch is merged into the code base.
20
+
21
+ ## Language
22
+
23
+ All text strings follow U.S. English by default. While such guides are generally unneeded, in cases where style considerations are necessary, these will typically follow conventions laid out in *Elements of Style* or the *AP Stylebook*.
24
+
25
+ ## Licensing
26
+
27
+ Any code contributed to the project via patches, pull requests, or other means will be licensed under the [GPL version 2](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html) or later. By contributing code to the project, you provide consent to use such code under this license. The exception to this rule is when bringing in third-party code with an alternate open source license.
28
+
29
+ ## Versioning
30
+
31
+ The project uses [semantic versioning](http://semver.org). Version numbers will look like `3.2.1` where `3` is the "major" release, `2` is the minor release, and `1` is the patch release.
addons/members-core-create-caps/license.md ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+ Preamble
10
+
11
+ The licenses for most software are designed to take away your
12
+ freedom to share and change it. By contrast, the GNU General Public
13
+ License is intended to guarantee your freedom to share and change free
14
+ software--to make sure the software is free for all its users. This
15
+ General Public License applies to most of the Free Software
16
+ Foundation's software and to any other program whose authors commit to
17
+ using it. (Some other Free Software Foundation software is covered by
18
+ the GNU Lesser General Public License instead.) You can apply it to
19
+ your programs, too.
20
+
21
+ When we speak of free software, we are referring to freedom, not
22
+ price. Our General Public Licenses are designed to make sure that you
23
+ have the freedom to distribute copies of free software (and charge for
24
+ this service if you wish), that you receive source code or can get it
25
+ if you want it, that you can change the software or use pieces of it
26
+ in new free programs; and that you know you can do these things.
27
+
28
+ To protect your rights, we need to make restrictions that forbid
29
+ anyone to deny you these rights or to ask you to surrender the rights.
30
+ These restrictions translate to certain responsibilities for you if you
31
+ distribute copies of the software, or if you modify it.
32
+
33
+ For example, if you distribute copies of such a program, whether
34
+ gratis or for a fee, you must give the recipients all the rights that
35
+ you have. You must make sure that they, too, receive or can get the
36
+ source code. And you must show them these terms so they know their
37
+ rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and
40
+ (2) offer you this license which gives you legal permission to copy,
41
+ distribute and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain
44
+ that everyone understands that there is no warranty for this free
45
+ software. If the software is modified by someone else and passed on, we
46
+ want its recipients to know that what they have is not the original, so
47
+ that any problems introduced by others will not reflect on the original
48
+ authors' reputations.
49
+
50
+ Finally, any free program is threatened constantly by software
51
+ patents. We wish to avoid the danger that redistributors of a free
52
+ program will individually obtain patent licenses, in effect making the
53
+ program proprietary. To prevent this, we have made it clear that any
54
+ patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ GNU GENERAL PUBLIC LICENSE
60
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+ 0. This License applies to any program or other work which contains
63
+ a notice placed by the copyright holder saying it may be distributed
64
+ under the terms of this General Public License. The "Program", below,
65
+ refers to any such program or work, and a "work based on the Program"
66
+ means either the Program or any derivative work under copyright law:
67
+ that is to say, a work containing the Program or a portion of it,
68
+ either verbatim or with modifications and/or translated into another
69
+ language. (Hereinafter, translation is included without limitation in
70
+ the term "modification".) Each licensee is addressed as "you".
71
+
72
+ Activities other than copying, distribution and modification are not
73
+ covered by this License; they are outside its scope. The act of
74
+ running the Program is not restricted, and the output from the Program
75
+ is covered only if its contents constitute a work based on the
76
+ Program (independent of having been made by running the Program).
77
+ Whether that is true depends on what the Program does.
78
+
79
+ 1. You may copy and distribute verbatim copies of the Program's
80
+ source code as you receive it, in any medium, provided that you
81
+ conspicuously and appropriately publish on each copy an appropriate
82
+ copyright notice and disclaimer of warranty; keep intact all the
83
+ notices that refer to this License and to the absence of any warranty;
84
+ and give any other recipients of the Program a copy of this License
85
+ along with the Program.
86
+
87
+ You may charge a fee for the physical act of transferring a copy, and
88
+ you may at your option offer warranty protection in exchange for a fee.
89
+
90
+ 2. You may modify your copy or copies of the Program or any portion
91
+ of it, thus forming a work based on the Program, and copy and
92
+ distribute such modifications or work under the terms of Section 1
93
+ above, provided that you also meet all of these conditions:
94
+
95
+ a) You must cause the modified files to carry prominent notices
96
+ stating that you changed the files and the date of any change.
97
+
98
+ b) You must cause any work that you distribute or publish, that in
99
+ whole or in part contains or is derived from the Program or any
100
+ part thereof, to be licensed as a whole at no charge to all third
101
+ parties under the terms of this License.
102
+
103
+ c) If the modified program normally reads commands interactively
104
+ when run, you must cause it, when started running for such
105
+ interactive use in the most ordinary way, to print or display an
106
+ announcement including an appropriate copyright notice and a
107
+ notice that there is no warranty (or else, saying that you provide
108
+ a warranty) and that users may redistribute the program under
109
+ these conditions, and telling the user how to view a copy of this
110
+ License. (Exception: if the Program itself is interactive but
111
+ does not normally print such an announcement, your work based on
112
+ the Program is not required to print an announcement.)
113
+
114
+ These requirements apply to the modified work as a whole. If
115
+ identifiable sections of that work are not derived from the Program,
116
+ and can be reasonably considered independent and separate works in
117
+ themselves, then this License, and its terms, do not apply to those
118
+ sections when you distribute them as separate works. But when you
119
+ distribute the same sections as part of a whole which is a work based
120
+ on the Program, the distribution of the whole must be on the terms of
121
+ this License, whose permissions for other licensees extend to the
122
+ entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+ Thus, it is not the intent of this section to claim rights or contest
125
+ your rights to work written entirely by you; rather, the intent is to
126
+ exercise the right to control the distribution of derivative or
127
+ collective works based on the Program.
128
+
129
+ In addition, mere aggregation of another work not based on the Program
130
+ with the Program (or with a work based on the Program) on a volume of
131
+ a storage or distribution medium does not bring the other work under
132
+ the scope of this License.
133
+
134
+ 3. You may copy and distribute the Program (or a work based on it,
135
+ under Section 2) in object code or executable form under the terms of
136
+ Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+ a) Accompany it with the complete corresponding machine-readable
139
+ source code, which must be distributed under the terms of Sections
140
+ 1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+ b) Accompany it with a written offer, valid for at least three
143
+ years, to give any third party, for a charge no more than your
144
+ cost of physically performing source distribution, a complete
145
+ machine-readable copy of the corresponding source code, to be
146
+ distributed under the terms of Sections 1 and 2 above on a medium
147
+ customarily used for software interchange; or,
148
+
149
+ c) Accompany it with the information you received as to the offer
150
+ to distribute corresponding source code. (This alternative is
151
+ allowed only for noncommercial distribution and only if you
152
+ received the program in object code or executable form with such
153
+ an offer, in accord with Subsection b above.)
154
+
155
+ The source code for a work means the preferred form of the work for
156
+ making modifications to it. For an executable work, complete source
157
+ code means all the source code for all modules it contains, plus any
158
+ associated interface definition files, plus the scripts used to
159
+ control compilation and installation of the executable. However, as a
160
+ special exception, the source code distributed need not include
161
+ anything that is normally distributed (in either source or binary
162
+ form) with the major components (compiler, kernel, and so on) of the
163
+ operating system on which the executable runs, unless that component
164
+ itself accompanies the executable.
165
+
166
+ If distribution of executable or object code is made by offering
167
+ access to copy from a designated place, then offering equivalent
168
+ access to copy the source code from the same place counts as
169
+ distribution of the source code, even though third parties are not
170
+ compelled to copy the source along with the object code.
171
+
172
+ 4. You may not copy, modify, sublicense, or distribute the Program
173
+ except as expressly provided under this License. Any attempt
174
+ otherwise to copy, modify, sublicense or distribute the Program is
175
+ void, and will automatically terminate your rights under this License.
176
+ However, parties who have received copies, or rights, from you under
177
+ this License will not have their licenses terminated so long as such
178
+ parties remain in full compliance.
179
+
180
+ 5. You are not required to accept this License, since you have not
181
+ signed it. However, nothing else grants you permission to modify or
182
+ distribute the Program or its derivative works. These actions are
183
+ prohibited by law if you do not accept this License. Therefore, by
184
+ modifying or distributing the Program (or any work based on the
185
+ Program), you indicate your acceptance of this License to do so, and
186
+ all its terms and conditions for copying, distributing or modifying
187
+ the Program or works based on it.
188
+
189
+ 6. Each time you redistribute the Program (or any work based on the
190
+ Program), the recipient automatically receives a license from the
191
+ original licensor to copy, distribute or modify the Program subject to
192
+ these terms and conditions. You may not impose any further
193
+ restrictions on the recipients' exercise of the rights granted herein.
194
+ You are not responsible for enforcing compliance by third parties to
195
+ this License.
196
+
197
+ 7. If, as a consequence of a court judgment or allegation of patent
198
+ infringement or for any other reason (not limited to patent issues),
199
+ conditions are imposed on you (whether by court order, agreement or
200
+ otherwise) that contradict the conditions of this License, they do not
201
+ excuse you from the conditions of this License. If you cannot
202
+ distribute so as to satisfy simultaneously your obligations under this
203
+ License and any other pertinent obligations, then as a consequence you
204
+ may not distribute the Program at all. For example, if a patent
205
+ license would not permit royalty-free redistribution of the Program by
206
+ all those who receive copies directly or indirectly through you, then
207
+ the only way you could satisfy both it and this License would be to
208
+ refrain entirely from distribution of the Program.
209
+
210
+ If any portion of this section is held invalid or unenforceable under
211
+ any particular circumstance, the balance of the section is intended to
212
+ apply and the section as a whole is intended to apply in other
213
+ circumstances.
214
+
215
+ It is not the purpose of this section to induce you to infringe any
216
+ patents or other property right claims or to contest validity of any
217
+ such claims; this section has the sole purpose of protecting the
218
+ integrity of the free software distribution system, which is
219
+ implemented by public license practices. Many people have made
220
+ generous contributions to the wide range of software distributed
221
+ through that system in reliance on consistent application of that
222
+ system; it is up to the author/donor to decide if he or she is willing
223
+ to distribute software through any other system and a licensee cannot
224
+ impose that choice.
225
+
226
+ This section is intended to make thoroughly clear what is believed to
227
+ be a consequence of the rest of this License.
228
+
229
+ 8. If the distribution and/or use of the Program is restricted in
230
+ certain countries either by patents or by copyrighted interfaces, the
231
+ original copyright holder who places the Program under this License
232
+ may add an explicit geographical distribution limitation excluding
233
+ those countries, so that distribution is permitted only in or among
234
+ countries not thus excluded. In such case, this License incorporates
235
+ the limitation as if written in the body of this License.
236
+
237
+ 9. The Free Software Foundation may publish revised and/or new versions
238
+ of the General Public License from time to time. Such new versions will
239
+ be similar in spirit to the present version, but may differ in detail to
240
+ address new problems or concerns.
241
+
242
+ Each version is given a distinguishing version number. If the Program
243
+ specifies a version number of this License which applies to it and "any
244
+ later version", you have the option of following the terms and conditions
245
+ either of that version or of any later version published by the Free
246
+ Software Foundation. If the Program does not specify a version number of
247
+ this License, you may choose any version ever published by the Free Software
248
+ Foundation.
249
+
250
+ 10. If you wish to incorporate parts of the Program into other free
251
+ programs whose distribution conditions are different, write to the author
252
+ to ask for permission. For software which is copyrighted by the Free
253
+ Software Foundation, write to the Free Software Foundation; we sometimes
254
+ make exceptions for this. Our decision will be guided by the two goals
255
+ of preserving the free status of all derivatives of our free software and
256
+ of promoting the sharing and reuse of software generally.
257
+
258
+ NO WARRANTY
259
+
260
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+ REPAIR OR CORRECTION.
269
+
270
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+ POSSIBILITY OF SUCH DAMAGES.
279
+
280
+ END OF TERMS AND CONDITIONS
281
+
282
+ How to Apply These Terms to Your New Programs
283
+
284
+ If you develop a new program, and you want it to be of the greatest
285
+ possible use to the public, the best way to achieve this is to make it
286
+ free software which everyone can redistribute and change under these terms.
287
+
288
+ To do so, attach the following notices to the program. It is safest
289
+ to attach them to the start of each source file to most effectively
290
+ convey the exclusion of warranty; and each file should have at least
291
+ the "copyright" line and a pointer to where the full notice is found.
292
+
293
+ <one line to give the program's name and a brief idea of what it does.>
294
+ Copyright (C) <year> <name of author>
295
+
296
+ This program is free software; you can redistribute it and/or modify
297
+ it under the terms of the GNU General Public License as published by
298
+ the Free Software Foundation; either version 2 of the License, or
299
+ (at your option) any later version.
300
+
301
+ This program is distributed in the hope that it will be useful,
302
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
303
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
+ GNU General Public License for more details.
305
+
306
+ You should have received a copy of the GNU General Public License along
307
+ with this program; if not, write to the Free Software Foundation, Inc.,
308
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309
+
310
+ Also add information on how to contact you by electronic and paper mail.
311
+
312
+ If the program is interactive, make it output a short notice like this
313
+ when it starts in an interactive mode:
314
+
315
+ Gnomovision version 69, Copyright (C) year name of author
316
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317
+ This is free software, and you are welcome to redistribute it
318
+ under certain conditions; type `show c' for details.
319
+
320
+ The hypothetical commands `show w' and `show c' should show the appropriate
321
+ parts of the General Public License. Of course, the commands you use may
322
+ be called something other than `show w' and `show c'; they could even be
323
+ mouse-clicks or menu items--whatever suits your program.
324
+
325
+ You should also get your employer (if you work as a programmer) or your
326
+ school, if any, to sign a "copyright disclaimer" for the program, if
327
+ necessary. Here is a sample; alter the names:
328
+
329
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
+
332
+ <signature of Ty Coon>, 1 April 1989
333
+ Ty Coon, President of Vice
334
+
335
+ This General Public License does not permit incorporating your program into
336
+ proprietary programs. If your program is a subroutine library, you may
337
+ consider it more useful to permit linking proprietary applications with the
338
+ library. If this is what you want to do, use the GNU Lesser General
339
+ Public License instead of this License.
addons/members-core-create-caps/readme.md ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Members - Core Create Caps
2
+
3
+ Members - Core Create Caps is an add-on plugin for the [Members plugin](http://themehybrid.com/plugins/members) that creates new `create_posts` and `create_pages` capabilities and splits them from their `edit_*` counterparts.
4
+
5
+ In core WordPress, the `create_*` and `edit_*` capabilities for posts/pages are directly tied together. For those who need more fine-grain control, this plugin is necessary.
6
+
7
+ ## The create_* issue
8
+
9
+ Currently, there's a bug in core WordPress that prevents users from having only the `create_posts` or `create_pages` capability. You'll need the `edit_posts` or `edit_pages` capability to go along with that.
10
+
11
+ However, you can still have users who have the `edit_posts` or `edit_pages` caps without being able to create new posts/pages.
12
+
13
+ ## Professional Support
14
+
15
+ If you need professional plugin support from me, the plugin author, you can access the support forums at [Theme Hybrid](http://themehybrid.com/board/topics), which is a professional WordPress help/support site where I handle support for all my plugins and themes for a community of 75,000+ users (and growing).
16
+
17
+ ## Copyright and License
18
+
19
+ This project is licensed under the [GNU GPL](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html), version 2 or later.
20
+
21
+ 2017 &copy; [Justin Tadlock](http://justintadlock.com).
22
+
23
+ ## Documentation
24
+
25
+ The use of this plugin is fairly straightforward. You must have the [Members plugin](http://themehybrid.com/plugins/members) installed and activated to use this plugin.
26
+
27
+ ### Usage
28
+
29
+ Once this plugin is activated, no user will be able to create new posts or pages. You'll need to visit the Users > Roles screen in the WordPress admin. From there, you'll need to edit any role that you wish to be able to create posts or pages.
30
+
31
+ Click on the role(s) you wish to edit and grant the following capabilities (they'll be listed):
32
+
33
+ * Create Posts (`create_posts`)
34
+ * Create Pages (`create_pages`)
35
+
36
+ From that point forward, only users who have roles with these capabilities will be able to edit posts or pages.
addons/members-edd-integration/.gitignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ /node_modules
2
+ /vendor
3
+ /composer.lock
4
+ /phpcs.xml
5
+ /.phpcs.xml
6
+ *.map
addons/members-edd-integration/addon.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Members\Integration\EDD;
4
+
5
+ # Don't execute code if file is accessed directly.
6
+ defined( 'ABSPATH' ) || exit;
7
+
8
+ # Bootstrap plugin.
9
+ require_once 'src/functions-filters.php';
10
+ require_once 'src/functions-caps.php';
11
+ require_once 'src/functions-roles.php';
addons/members-edd-integration/changelog.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ # Change Log
2
+
3
+ ## [1.0.0] - 2019-08-13
4
+
5
+ ### Added
6
+
7
+ - Plugin launch. Everything's new!
addons/members-edd-integration/package-lock.json ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-edd-integration",
3
+ "requires": true,
4
+ "lockfileVersion": 1,
5
+ "dependencies": {
6
+ "balanced-match": {
7
+ "version": "1.0.0",
8
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
9
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
10
+ "dev": true
11
+ },
12
+ "bluebird": {
13
+ "version": "3.5.5",
14
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
15
+ "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
16
+ "dev": true
17
+ },
18
+ "brace-expansion": {
19
+ "version": "1.1.11",
20
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
21
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
22
+ "dev": true,
23
+ "requires": {
24
+ "balanced-match": "^1.0.0",
25
+ "concat-map": "0.0.1"
26
+ }
27
+ },
28
+ "concat-map": {
29
+ "version": "0.0.1",
30
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
31
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
32
+ "dev": true
33
+ },
34
+ "encoding": {
35
+ "version": "0.1.12",
36
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
37
+ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
38
+ "dev": true,
39
+ "requires": {
40
+ "iconv-lite": "~0.4.13"
41
+ }
42
+ },
43
+ "fs.realpath": {
44
+ "version": "1.0.0",
45
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
46
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
47
+ "dev": true
48
+ },
49
+ "gettext-parser": {
50
+ "version": "3.1.1",
51
+ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-3.1.1.tgz",
52
+ "integrity": "sha512-vNhWcqXEtZPs5Ft1ReA34g7ByWotpcOIeJvXVy2jF3/G2U9v6W0wG4Z4hXzcU8R//jArqkgHcVCGgGqa4vxVlQ==",
53
+ "dev": true,
54
+ "requires": {
55
+ "encoding": "^0.1.12",
56
+ "readable-stream": "^3.2.0",
57
+ "safe-buffer": "^5.1.2"
58
+ }
59
+ },
60
+ "glob": {
61
+ "version": "7.1.4",
62
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
63
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
64
+ "dev": true,
65
+ "requires": {
66
+ "fs.realpath": "^1.0.0",
67
+ "inflight": "^1.0.4",
68
+ "inherits": "2",
69
+ "minimatch": "^3.0.4",
70
+ "once": "^1.3.0",
71
+ "path-is-absolute": "^1.0.0"
72
+ }
73
+ },
74
+ "iconv-lite": {
75
+ "version": "0.4.24",
76
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
77
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
78
+ "dev": true,
79
+ "requires": {
80
+ "safer-buffer": ">= 2.1.2 < 3"
81
+ }
82
+ },
83
+ "inflight": {
84
+ "version": "1.0.6",
85
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
86
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
87
+ "dev": true,
88
+ "requires": {
89
+ "once": "^1.3.0",
90
+ "wrappy": "1"
91
+ }
92
+ },
93
+ "inherits": {
94
+ "version": "2.0.4",
95
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
96
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
97
+ "dev": true
98
+ },
99
+ "lodash": {
100
+ "version": "4.17.15",
101
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
102
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
103
+ "dev": true
104
+ },
105
+ "minimatch": {
106
+ "version": "3.0.4",
107
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
108
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
109
+ "dev": true,
110
+ "requires": {
111
+ "brace-expansion": "^1.1.7"
112
+ }
113
+ },
114
+ "minimist": {
115
+ "version": "1.2.0",
116
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
117
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
118
+ "dev": true
119
+ },
120
+ "mkdirp": {
121
+ "version": "0.5.1",
122
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
123
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
124
+ "dev": true,
125
+ "requires": {
126
+ "minimist": "0.0.8"
127
+ },
128
+ "dependencies": {
129
+ "minimist": {
130
+ "version": "0.0.8",
131
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
132
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
133
+ "dev": true
134
+ }
135
+ }
136
+ },
137
+ "node-wp-i18n": {
138
+ "version": "1.2.3",
139
+ "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.2.3.tgz",
140
+ "integrity": "sha512-YMzMcsjXbGYDB9vHyb289CYXAGmXhcNLbeTlOnWgPNkZd9xrovcbRd7cQyKd9BQHOjS7Nw8WCbJ7nvtR7rc0rg==",
141
+ "dev": true,
142
+ "requires": {
143
+ "bluebird": "^3.4.1",
144
+ "gettext-parser": "^3.1.0",
145
+ "glob": "^7.0.5",
146
+ "lodash": "^4.14.2",
147
+ "minimist": "^1.2.0",
148
+ "mkdirp": "^0.5.1",
149
+ "tmp": "^0.0.33"
150
+ }
151
+ },
152
+ "once": {
153
+ "version": "1.4.0",
154
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
155
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
156
+ "dev": true,
157
+ "requires": {
158
+ "wrappy": "1"
159
+ }
160
+ },
161
+ "os-tmpdir": {
162
+ "version": "1.0.2",
163
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
164
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
165
+ "dev": true
166
+ },
167
+ "path-is-absolute": {
168
+ "version": "1.0.1",
169
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
170
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
171
+ "dev": true
172
+ },
173
+ "readable-stream": {
174
+ "version": "3.4.0",
175
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
176
+ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
177
+ "dev": true,
178
+ "requires": {
179
+ "inherits": "^2.0.3",
180
+ "string_decoder": "^1.1.1",
181
+ "util-deprecate": "^1.0.1"
182
+ }
183
+ },
184
+ "safe-buffer": {
185
+ "version": "5.2.0",
186
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
187
+ "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
188
+ "dev": true
189
+ },
190
+ "safer-buffer": {
191
+ "version": "2.1.2",
192
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
193
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
194
+ "dev": true
195
+ },
196
+ "string_decoder": {
197
+ "version": "1.3.0",
198
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
199
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
200
+ "dev": true,
201
+ "requires": {
202
+ "safe-buffer": "~5.2.0"
203
+ }
204
+ },
205
+ "tmp": {
206
+ "version": "0.0.33",
207
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
208
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
209
+ "dev": true,
210
+ "requires": {
211
+ "os-tmpdir": "~1.0.2"
212
+ }
213
+ },
214
+ "util-deprecate": {
215
+ "version": "1.0.2",
216
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
217
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
218
+ "dev": true
219
+ },
220
+ "wrappy": {
221
+ "version": "1.0.2",
222
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
223
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
224
+ "dev": true
225
+ }
226
+ }
227
+ }
addons/members-edd-integration/package.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-edd-integration",
3
+ "author": "Justin Tadlock",
4
+ "license": "GPL-2.0+",
5
+ "homepage": "https://themehybrid.com/plugins/members-edd-integration",
6
+ "main": "resources/js/app.js",
7
+ "scripts": {
8
+ "i18n": "npm run i18n:textdomain && npm run i18n:pot",
9
+ "i18n:textdomain": "npx wpi18n addtextdomain --exclude=vendor,node_modules",
10
+ "i18n:pot": "npx wpi18n makepot --domain-path=/resources/lang"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/justintadlock/members-edd-integration.git"
15
+ },
16
+ "bugs": {
17
+ "url": "https://github.com/justintadlock/members-edd-integration/issues"
18
+ },
19
+ "devDependencies": {
20
+ "node-wp-i18n": "^1.2.3"
21
+ },
22
+ "dependencies": {}
23
+ }
addons/members-edd-integration/readme.md ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Members - EDD Integration
2
+
3
+ The Members - EDD Integration add-on more nicely integrates the [Easy Digital Downloads](https://easydigitaldownloads.com/) plugin capabilities into the Members plugin's role manager.
4
+
5
+ The [Members plugin](https://themehybrid.com/plugins/members) and the Easy Digital Downloads plugin are required to be installed and activated for this plugin to work.
6
+
7
+ ## Shop Role Group
8
+
9
+ The plugin creates a new "Shop" role group for Easy Digital Downloads, which is located under the Users > Roles screen in the admin. This role group lists the following roles:
10
+
11
+ - Shop Accountant
12
+ - Shop Manager
13
+ - Shop Vendor
14
+ - Shop Worker
15
+ - Any other roles that have EDD-related capabilities.
16
+
17
+ This allows you to see any roles that have EDD permissions at a glance.
18
+
19
+ ## Downloads Capability Group
20
+
21
+ When editing or creating a new role in Members, this add-on creates a new "Downloads" tab (cap group). This tab combines all of the Easy Digital Downloads capabilities in one place. That way, you can see all available caps without jumping between different tabs.
22
+
23
+ ## Copyright and License
24
+
25
+ This project is licensed under the [GNU GPL](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html), version 2 or later.
26
+
27
+ 2019 &copy; [Justin Tadlock](http://justintadlock.com).
addons/members-edd-integration/src/functions-caps.php ADDED
@@ -0,0 +1,341 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Capability Functions.
4
+ *
5
+ * @package MembersIntegrationEDD
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-edd-integration
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\Integration\EDD;
13
+
14
+ # Don't execute code if file is accessed directly.
15
+ defined( 'ABSPATH' ) || exit;
16
+
17
+ /**
18
+ * Returns an array of the plugin capabilities.
19
+ *
20
+ * @since 1.0.0
21
+ * @access public
22
+ * @return array
23
+ */
24
+ function edd_caps() {
25
+
26
+ return [
27
+
28
+ // -------------------------------------------------------------
29
+ // Shop caps.
30
+ // -------------------------------------------------------------
31
+
32
+ 'manage_shop_settings' => [
33
+ 'label' => __( 'Shop: Manage Settings', 'members' ),
34
+ 'description' => __( 'Allows management of the shop settings.', 'members' )
35
+ ],
36
+
37
+ 'view_shop_sensitive_data' => [
38
+ 'label' => __( 'Shop: View Sensitive Data', 'members' ),
39
+ 'description' => __( 'Allows access to sensitive user data.', 'members' )
40
+ ],
41
+
42
+ // -------------------------------------------------------------
43
+ // Reports caps.
44
+ // -------------------------------------------------------------
45
+
46
+ 'view_shop_reports' => [
47
+ 'label' => __( 'Reports: View', 'members' ),
48
+ 'description' => __( 'Allows users to view shop reports.', 'members' )
49
+ ],
50
+
51
+ 'export_shop_reports' => [
52
+ 'label' => __( 'Reports: Export', 'members' ),
53
+ 'description' => __( 'Allows users to export shop reports data.', 'members' )
54
+ ],
55
+
56
+ // -------------------------------------------------------------
57
+ // Download/Product caps.
58
+ // -------------------------------------------------------------
59
+
60
+ // Custom caps.
61
+ 'view_product_stats' => [
62
+ 'label' => __( 'Downloads: View Stats', 'members' ),
63
+ 'description' => __( 'Allows users to view download stats.', 'members' )
64
+ ],
65
+
66
+ 'import_products' => [
67
+ 'label' => __( 'Downloads: Import', 'members' ),
68
+ 'description' => __( 'Allows users to import downloads into the database.', 'members' )
69
+ ],
70
+
71
+ // Download CPT caps.
72
+ 'edit_products' => [
73
+ 'label' => __( 'Downloads: Edit', 'members' ),
74
+ 'description' => sprintf(
75
+ __( "Allows users to edit downloads. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
76
+ '<code>edit_*_products</code>'
77
+ )
78
+ ],
79
+
80
+ 'edit_others_products' => [
81
+ 'label' => __( "Downloads: Edit Others'", 'members' ),
82
+ 'description' => __( "Allows users to edit other user's downloads.", 'members' )
83
+ ],
84
+
85
+ 'edit_private_products' => [
86
+ 'label' => __( 'Downloads: Edit Private', 'members' ),
87
+ 'description' => __( 'Allows users to edit private downloads.', 'members' )
88
+ ],
89
+
90
+ 'edit_published_products' => [
91
+ 'label' => __( 'Downloads: Edit Published', 'members' ),
92
+ 'description' => __( 'Allows users to edit published downloads.', 'members' )
93
+ ],
94
+
95
+ 'publish_products' => [
96
+ 'label' => __( 'Downloads: Publish', 'members' ),
97
+ 'description' => __( 'Allows users to publish downloads.', 'members' )
98
+ ],
99
+
100
+ 'read_private_products' => [
101
+ 'label' => __( 'Downloads: Read Private', 'members' ),
102
+ 'description' => __( 'Allows users to read private downloads.', 'members' )
103
+ ],
104
+
105
+ 'delete_products' => [
106
+ 'label' => __( 'Downloads: Delete', 'members' ),
107
+ 'description' => sprintf(
108
+ __( "Allows users to delete downloads. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
109
+ '<code>delete_*_products</code>'
110
+ )
111
+ ],
112
+
113
+ 'delete_private_products' => [
114
+ 'label' => __( 'Downloads: Delete Private', 'members' ),
115
+ 'description' => __( 'Allows users to delete private downloads.', 'members' )
116
+ ],
117
+
118
+ 'delete_others_products' => [
119
+ 'label' => __( "Downloads: Delete Others'", 'members' ),
120
+ 'description' => __( "Allows users to delete other users' downloads.", 'members' )
121
+ ],
122
+
123
+ 'delete_published_products' => [
124
+ 'label' => __( 'Downloads: Delete Published', 'members' ),
125
+ 'description' => __( 'Allows users to delete published downloads.', 'members' )
126
+ ],
127
+
128
+ // Product taxonomy caps.
129
+ 'assign_product_terms' => [
130
+ 'label' => __( 'Downloads: Assign Taxonomy Terms', 'members' ),
131
+ 'description' => __( 'Allows users to assign taxonomy terms to downloads.', 'members' )
132
+ ],
133
+
134
+ 'edit_product_terms' => [
135
+ 'label' => __( 'Downloads: Edit Taxonomy Terms', 'members' ),
136
+ 'description' => __( 'Allows users to edit download taxonomy terms.', 'members' )
137
+ ],
138
+
139
+ 'delete_product_terms' => [
140
+ 'label' => __( 'Downloads: Delete Taxonomy Terms', 'members' ),
141
+ 'description' => __( 'Allows users to delete download taxonomy terms.', 'members' )
142
+ ],
143
+
144
+ 'manage_product_terms' => [
145
+ 'label' => __( 'Downloads: Manage Taxonomy Terms', 'members' ),
146
+ 'description' => __( 'Allows access to download taxonomy management screens.', 'members' )
147
+ ],
148
+
149
+ // -------------------------------------------------------------
150
+ // Payment caps.
151
+ // -------------------------------------------------------------
152
+
153
+ // Payment custom caps.
154
+ 'view_shop_payment_stats' => [
155
+ 'label' => __( 'Payments: View Stats', 'members' ),
156
+ 'description' => __( 'Allows users to view payment stats.', 'members' )
157
+ ],
158
+
159
+ 'import_shop_payments' => [
160
+ 'label' => __( 'Payments: Import', 'members' ),
161
+ 'description' => __( 'Allows users to import payments into the database.', 'members' )
162
+ ],
163
+
164
+ // Payment CPT caps.
165
+ 'edit_shop_payments' => [
166
+ 'label' => __( 'Payments: Edit', 'members' ),
167
+ 'description' => sprintf(
168
+ __( "Allows users to edit payments. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
169
+ '<code>edit_*_shop_payments</code>'
170
+ )
171
+ ],
172
+
173
+ 'edit_others_shop_payments' => [
174
+ 'label' => __( "Payments: Edit Others'", 'members' ),
175
+ 'description' => __( "Allows users to edit other user's payments.", 'members' )
176
+ ],
177
+
178
+ 'edit_private_shop_payments' => [
179
+ 'label' => __( 'Payments: Edit Private', 'members' ),
180
+ 'description' => __( 'Allows users to edit private payments.', 'members' )
181
+ ],
182
+
183
+ 'edit_published_shop_payments' => [
184
+ 'label' => __( 'Payments: Edit Published', 'members' ),
185
+ 'description' => __( 'Allows users to edit published payments.', 'members' )
186
+ ],
187
+
188
+ 'publish_shop_payments' => [
189
+ 'label' => __( 'Payments: Publish', 'members' ),
190
+ 'description' => __( 'Allows users to publish payments.', 'members' )
191
+ ],
192
+
193
+ 'read_private_shop_payments' => [
194
+ 'label' => __( 'Payments: Read Private', 'members' ),
195
+ 'description' => __( 'Allows users to read private payments.', 'members' )
196
+ ],
197
+
198
+ 'delete_shop_payments' => [
199
+ 'label' => __( 'Payments: Delete', 'members' ),
200
+ 'description' => sprintf(
201
+ __( "Allows users to delete payments. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
202
+ '<code>delete_*_shop_payments</code>'
203
+ )
204
+ ],
205
+
206
+ 'delete_private_shop_payments' => [
207
+ 'label' => __( 'Payments: Delete Private', 'members' ),
208
+ 'description' => __( 'Allows users to delete private payments.', 'members' )
209
+ ],
210
+
211
+ 'delete_others_shop_payments' => [
212
+ 'label' => __( "Payments: Delete Others'", 'members' ),
213
+ 'description' => __( "Allows users to delete other users' payments.", 'members' )
214
+ ],
215
+
216
+ 'delete_published_shop_payments' => [
217
+ 'label' => __( 'Payments: Delete Published', 'members' ),
218
+ 'description' => __( 'Allows users to delete published payments.', 'members' )
219
+ ],
220
+
221
+ // Payment taxonomy caps.
222
+ 'assign_shop_payment_terms' => [
223
+ 'label' => __( 'Payments: Assign Taxonomy Terms', 'members' ),
224
+ 'description' => __( 'Allows users to assign taxonomy terms to payments.', 'members' )
225
+ ],
226
+
227
+ 'edit_shop_payment_terms' => [
228
+ 'label' => __( 'Payments: Edit Taxonomy Terms', 'members' ),
229
+ 'description' => __( 'Allows users to edit payment taxonomy terms.', 'members' )
230
+ ],
231
+
232
+ 'delete_shop_payment_terms' => [
233
+ 'label' => __( 'Payments: Delete Taxonomy Terms', 'members' ),
234
+ 'description' => __( 'Allows users to delete payment taxonomy terms.', 'members' )
235
+ ],
236
+
237
+ 'manage_shop_payment_terms' => [
238
+ 'label' => __( 'Payments: Manage Taxonomy Terms', 'members' ),
239
+ 'description' => __( 'Allows access to payment taxonomy management screens.', 'members' )
240
+ ],
241
+
242
+ // -------------------------------------------------------------
243
+ // Discount caps.
244
+ // -------------------------------------------------------------
245
+
246
+ // Discount custom caps.
247
+ 'manage_shop_discounts' => [
248
+ 'label' => __( 'Discounts: Manage', 'members' ),
249
+ 'description' => __( 'Allows users to manage shop discounts.', 'members' )
250
+ ],
251
+
252
+ 'view_shop_discount_stats' => [
253
+ 'label' => __( 'Discounts: View Stats', 'members' ),
254
+ 'description' => __( 'Allows users to view discount stats.', 'members' )
255
+ ],
256
+
257
+ 'import_shop_discounts' => [
258
+ 'label' => __( 'Discounts: Import', 'members' ),
259
+ 'description' => __( 'Allows users to import discounts into the database.', 'members' )
260
+ ],
261
+
262
+ // Discount CPT caps.
263
+ 'edit_shop_discounts' => [
264
+ 'label' => __( 'Discounts: Edit', 'members' ),
265
+ 'description' => sprintf(
266
+ __( "Allows users to edit discounts. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
267
+ '<code>edit_*_shop_discounts</code>'
268
+ )
269
+ ],
270
+
271
+ 'edit_others_shop_discounts' => [
272
+ 'label' => __( "Discounts: Edit Others'", 'members' ),
273
+ 'description' => __( "Allows users to edit other user's discounts.", 'members' )
274
+ ],
275
+
276
+ 'edit_private_shop_discounts' => [
277
+ 'label' => __( 'Discounts: Edit Private', 'members' ),
278
+ 'description' => __( 'Allows users to edit private discounts.', 'members' )
279
+ ],
280
+
281
+ 'edit_published_shop_discounts' => [
282
+ 'label' => __( 'Discounts: Edit Published', 'members' ),
283
+ 'description' => __( 'Allows users to edit published discounts.', 'members' )
284
+ ],
285
+
286
+ 'publish_shop_discounts' => [
287
+ 'label' => __( 'Discounts: Publish', 'members' ),
288
+ 'description' => __( 'Allows users to publish discounts.', 'members' )
289
+ ],
290
+
291
+ 'read_private_shop_discounts' => [
292
+ 'label' => __( 'Discounts: Read Private', 'members' ),
293
+ 'description' => __( 'Allows users to read private discounts.', 'members' )
294
+ ],
295
+
296
+ 'delete_shop_discounts' => [
297
+ 'label' => __( 'Discounts: Delete', 'members' ),
298
+ 'description' => sprintf(
299
+ __( "Allows users to delete discounts. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
300
+ '<code>delete_*_shop_discounts</code>'
301
+ )
302
+ ],
303
+
304
+ 'delete_private_shop_discounts' => [
305
+ 'label' => __( 'Discounts: Delete Private', 'members' ),
306
+ 'description' => __( 'Allows users to delete private discounts.', 'members' )
307
+ ],
308
+
309
+ 'delete_others_shop_discounts' => [
310
+ 'label' => __( "Discounts: Delete Others'", 'members' ),
311
+ 'description' => __( "Allows users to delete other users' discounts.", 'members' )
312
+ ],
313
+
314
+ 'delete_published_shop_discounts' => [
315
+ 'label' => __( 'Discounts: Delete Published', 'members' ),
316
+ 'description' => __( 'Allows users to delete published discounts.', 'members' )
317
+ ],
318
+
319
+ // Discount taxonomy caps.
320
+ 'assign_shop_discount_terms' => [
321
+ 'label' => __( 'Discounts: Assign Taxonomy Terms', 'members' ),
322
+ 'description' => __( 'Allows users to assign taxonomy terms to discounts.', 'members' )
323
+ ],
324
+
325
+ 'edit_shop_discount_terms' => [
326
+ 'label' => __( 'Discounts: Edit Taxonomy Terms', 'members' ),
327
+ 'description' => __( 'Allows users to edit discount taxonomy terms.', 'members' )
328
+ ],
329
+
330
+ 'delete_shop_discount_terms' => [
331
+ 'label' => __( 'Discounts: Delete Taxonomy Terms', 'members' ),
332
+ 'description' => __( 'Allows users to delete discount taxonomy terms.', 'members' )
333
+ ],
334
+
335
+ 'manage_shop_discount_terms' => [
336
+ 'label' => __( 'Discounts: Manage Taxonomy Terms', 'members' ),
337
+ 'description' => __( 'Allows access to discount taxonomy management screens.', 'members' )
338
+ ]
339
+
340
+ ];
341
+ }
addons/members-edd-integration/src/functions-filters.php ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin Filters.
4
+ *
5
+ * @package MembersIntegrationEDD
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-edd-integration
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\Integration\EDD;
13
+
14
+ use function members_register_cap;
15
+ use function members_register_cap_group;
16
+ use function members_register_role_group;
17
+ use function members_unregister_cap_group;
18
+
19
+ # Don't execute code if file is accessed directly.
20
+ defined( 'ABSPATH' ) || exit;
21
+
22
+ /**
23
+ * Registers custom role groups.
24
+ *
25
+ * @since 1.0.0
26
+ * @access public
27
+ * @return void
28
+ */
29
+ add_action( 'members_register_role_groups', function() {
30
+
31
+ $roles = edd_roles();
32
+
33
+ // Add the plugin-specific role group only if the plugin is active
34
+ // and there are existing roles with plugin-specific caps.
35
+ if ( class_exists( 'Easy_Digital_Downloads' ) && $roles ) {
36
+ members_register_role_group( 'plugin-edd', [
37
+ 'label' => esc_html__( 'Shop', 'members' ),
38
+ 'label_count' => _n_noop( 'Shop %s', 'Shop %s', 'members' ),
39
+ 'roles' => $roles
40
+ ] );
41
+ }
42
+ } );
43
+
44
+ /**
45
+ * Registers custom cap groups.
46
+ *
47
+ * @since 1.0.0
48
+ * @access public
49
+ * @return void
50
+ */
51
+ add_action( 'members_register_cap_groups', function() {
52
+
53
+ // Only run if we have the `download` post type.
54
+ if ( $type = get_post_type_object( 'download' ) ) {
55
+
56
+ $groups = [
57
+ 'download',
58
+ 'edd_payment',
59
+ 'edd_discount'
60
+ ];
61
+
62
+ // Unregister any cap groups already registered for the plugin's
63
+ // custom post types.
64
+ foreach ( $groups as $group ) {
65
+ members_unregister_cap_group( "type-{$group}" );
66
+ }
67
+
68
+ // Register a cap group for the EDD plugin.
69
+ members_register_cap_group( 'plugin-edd',[
70
+ 'label' => esc_html__( 'Downloads', 'members' ),
71
+ 'icon' => $type->menu_icon,
72
+ 'priority' => 11
73
+ ] );
74
+ }
75
+
76
+ } );
77
+
78
+ /**
79
+ * Registers the EDD plugin capabilities.
80
+ *
81
+ * @since 1.0.0
82
+ * @access public
83
+ * @return void
84
+ */
85
+ add_action( 'members_register_caps', function() {
86
+
87
+ if ( class_exists( 'Easy_Digital_Downloads' ) ) {
88
+
89
+ foreach ( edd_caps() as $name => $args ) {
90
+
91
+ members_register_cap( $name, [
92
+ 'label' => $args['label'],
93
+ 'description' => $args['description'],
94
+ 'group' => 'plugin-edd'
95
+ ] );
96
+ }
97
+ }
98
+
99
+ } );
addons/members-edd-integration/src/functions-roles.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Role Functions.
4
+ *
5
+ * @package MembersIntegrationEDD
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-edd-integration
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\Integration\EDD;
13
+
14
+ use function members_get_roles;
15
+ use function members_role_exists;
16
+
17
+ # Don't execute code if file is accessed directly.
18
+ defined( 'ABSPATH' ) || exit;
19
+
20
+ /**
21
+ * Returns an array of the plugin roles.
22
+ *
23
+ * @since 1.0.0
24
+ * @access public
25
+ * @return array
26
+ */
27
+ function edd_roles() {
28
+
29
+ $roles = [];
30
+
31
+ $edd_roles = [
32
+ 'shop_accountant',
33
+ 'shop_manager',
34
+ 'shop_vendor',
35
+ 'shop_worker'
36
+ ];
37
+
38
+ // Specifically add the plugin's roles. We need to check that these
39
+ // exist in case a user decides to delete them or in case the role
40
+ // is from an add-on that's not installed.
41
+ foreach ( $edd_roles as $role ) {
42
+ if ( members_role_exists( $role ) ) {
43
+ $roles[] = $role;
44
+ }
45
+ }
46
+
47
+ // Add any roles that have any of the plugin capabilities to the group.
48
+ $role_objects = members_get_roles();
49
+
50
+ $edd_caps = array_keys( edd_caps() );
51
+
52
+ foreach ( $role_objects as $role ) {
53
+
54
+ if ( 0 < count( array_intersect( $edd_caps, (array) $role->get( 'granted_caps' ) ) ) ) {
55
+ $roles[] = $role->get( 'name' );
56
+ }
57
+ }
58
+
59
+ return $roles;
60
+ }
addons/members-givewp-integration/.gitignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ /node_modules
2
+ /vendor
3
+ /composer.lock
4
+ /phpcs.xml
5
+ /.phpcs.xml
6
+ *.map
addons/members-givewp-integration/addon.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Members\Integration\GiveWP;
4
+
5
+ # Don't execute code if file is file is accessed directly.
6
+ defined( 'ABSPATH' ) || exit;
7
+
8
+ # Bootstrap plugin.
9
+ require_once 'src/functions-filters.php';
10
+ require_once 'src/functions-caps.php';
11
+ require_once 'src/functions-roles.php';
addons/members-givewp-integration/changelog.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ # Change Log
2
+
3
+ ## [1.0.0] - 2019-08-05
4
+
5
+ ### Added
6
+
7
+ - Plugin launch. Everything's new!
addons/members-givewp-integration/package-lock.json ADDED
@@ -0,0 +1,235 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-givewp-integration",
3
+ "requires": true,
4
+ "lockfileVersion": 1,
5
+ "dependencies": {
6
+ "balanced-match": {
7
+ "version": "1.0.0",
8
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
9
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
10
+ "dev": true
11
+ },
12
+ "bluebird": {
13
+ "version": "3.5.5",
14
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
15
+ "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
16
+ "dev": true
17
+ },
18
+ "brace-expansion": {
19
+ "version": "1.1.11",
20
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
21
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
22
+ "dev": true,
23
+ "requires": {
24
+ "balanced-match": "^1.0.0",
25
+ "concat-map": "0.0.1"
26
+ }
27
+ },
28
+ "concat-map": {
29
+ "version": "0.0.1",
30
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
31
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
32
+ "dev": true
33
+ },
34
+ "encoding": {
35
+ "version": "0.1.12",
36
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
37
+ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
38
+ "dev": true,
39
+ "requires": {
40
+ "iconv-lite": "~0.4.13"
41
+ }
42
+ },
43
+ "fs.realpath": {
44
+ "version": "1.0.0",
45
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
46
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
47
+ "dev": true
48
+ },
49
+ "gettext-parser": {
50
+ "version": "3.1.1",
51
+ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-3.1.1.tgz",
52
+ "integrity": "sha512-vNhWcqXEtZPs5Ft1ReA34g7ByWotpcOIeJvXVy2jF3/G2U9v6W0wG4Z4hXzcU8R//jArqkgHcVCGgGqa4vxVlQ==",
53
+ "dev": true,
54
+ "requires": {
55
+ "encoding": "^0.1.12",
56
+ "readable-stream": "^3.2.0",
57
+ "safe-buffer": "^5.1.2"
58
+ }
59
+ },
60
+ "glob": {
61
+ "version": "7.1.4",
62
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
63
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
64
+ "dev": true,
65
+ "requires": {
66
+ "fs.realpath": "^1.0.0",
67
+ "inflight": "^1.0.4",
68
+ "inherits": "2",
69
+ "minimatch": "^3.0.4",
70
+ "once": "^1.3.0",
71
+ "path-is-absolute": "^1.0.0"
72
+ }
73
+ },
74
+ "iconv-lite": {
75
+ "version": "0.4.24",
76
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
77
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
78
+ "dev": true,
79
+ "requires": {
80
+ "safer-buffer": ">= 2.1.2 < 3"
81
+ }
82
+ },
83
+ "inflight": {
84
+ "version": "1.0.6",
85
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
86
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
87
+ "dev": true,
88
+ "requires": {
89
+ "once": "^1.3.0",
90
+ "wrappy": "1"
91
+ }
92
+ },
93
+ "inherits": {
94
+ "version": "2.0.4",
95
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
96
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
97
+ "dev": true
98
+ },
99
+ "lodash": {
100
+ "version": "4.17.15",
101
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
102
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
103
+ "dev": true
104
+ },
105
+ "minimatch": {
106
+ "version": "3.0.4",
107
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
108
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
109
+ "dev": true,
110
+ "requires": {
111
+ "brace-expansion": "^1.1.7"
112
+ }
113
+ },
114
+ "minimist": {
115
+ "version": "1.2.0",
116
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
117
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
118
+ "dev": true
119
+ },
120
+ "mkdirp": {
121
+ "version": "0.5.1",
122
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
123
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
124
+ "dev": true,
125
+ "requires": {
126
+ "minimist": "0.0.8"
127
+ },
128
+ "dependencies": {
129
+ "minimist": {
130
+ "version": "0.0.8",
131
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
132
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
133
+ "dev": true
134
+ }
135
+ }
136
+ },
137
+ "node-wp-i18n": {
138
+ "version": "1.2.3",
139
+ "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.2.3.tgz",
140
+ "integrity": "sha512-YMzMcsjXbGYDB9vHyb289CYXAGmXhcNLbeTlOnWgPNkZd9xrovcbRd7cQyKd9BQHOjS7Nw8WCbJ7nvtR7rc0rg==",
141
+ "dev": true,
142
+ "requires": {
143
+ "bluebird": "^3.4.1",
144
+ "gettext-parser": "^3.1.0",
145
+ "glob": "^7.0.5",
146
+ "lodash": "^4.14.2",
147
+ "minimist": "^1.2.0",
148
+ "mkdirp": "^0.5.1",
149
+ "tmp": "^0.0.33"
150
+ }
151
+ },
152
+ "once": {
153
+ "version": "1.4.0",
154
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
155
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
156
+ "dev": true,
157
+ "requires": {
158
+ "wrappy": "1"
159
+ }
160
+ },
161
+ "os-tmpdir": {
162
+ "version": "1.0.2",
163
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
164
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
165
+ "dev": true
166
+ },
167
+ "path-is-absolute": {
168
+ "version": "1.0.1",
169
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
170
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
171
+ "dev": true
172
+ },
173
+ "readable-stream": {
174
+ "version": "3.4.0",
175
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
176
+ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
177
+ "dev": true,
178
+ "requires": {
179
+ "inherits": "^2.0.3",
180
+ "string_decoder": "^1.1.1",
181
+ "util-deprecate": "^1.0.1"
182
+ }
183
+ },
184
+ "safe-buffer": {
185
+ "version": "5.2.0",
186
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
187
+ "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
188
+ "dev": true
189
+ },
190
+ "safer-buffer": {
191
+ "version": "2.1.2",
192
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
193
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
194
+ "dev": true
195
+ },
196
+ "string_decoder": {
197
+ "version": "1.2.0",
198
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz",
199
+ "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==",
200
+ "dev": true,
201
+ "requires": {
202
+ "safe-buffer": "~5.1.0"
203
+ },
204
+ "dependencies": {
205
+ "safe-buffer": {
206
+ "version": "5.1.2",
207
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
208
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
209
+ "dev": true
210
+ }
211
+ }
212
+ },
213
+ "tmp": {
214
+ "version": "0.0.33",
215
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
216
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
217
+ "dev": true,
218
+ "requires": {
219
+ "os-tmpdir": "~1.0.2"
220
+ }
221
+ },
222
+ "util-deprecate": {
223
+ "version": "1.0.2",
224
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
225
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
226
+ "dev": true
227
+ },
228
+ "wrappy": {
229
+ "version": "1.0.2",
230
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
231
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
232
+ "dev": true
233
+ }
234
+ }
235
+ }
addons/members-givewp-integration/package.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-givewp-integration",
3
+ "author": "Justin Tadlock",
4
+ "license": "GPL-2.0+",
5
+ "homepage": "https://themehybrid.com/plugins/members-givewp-integration",
6
+ "main": "resources/js/app.js",
7
+ "scripts": {
8
+ "i18n": "npm run i18n:textdomain && npm run i18n:pot",
9
+ "i18n:textdomain": "npx wpi18n addtextdomain --exclude=vendor,node_modules",
10
+ "i18n:pot": "npx wpi18n makepot --domain-path=/resources/lang"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/justintadlock/members-givewp-integration.git"
15
+ },
16
+ "bugs": {
17
+ "url": "https://github.com/justintadlock/members-givewp-integration/issues"
18
+ },
19
+ "devDependencies": {
20
+ "node-wp-i18n": "^1.2.3"
21
+ },
22
+ "dependencies": {}
23
+ }
addons/members-givewp-integration/readme.md ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Members - GiveWP Integration
2
+
3
+ The Members - GiveWP Integration add-on more nicely integrates the [GiveWP](https://givewp.com/) and [GiveWP Recurring Donations](https://givewp.com/addons/recurring-donations/) plugin capabilities into the Members plugin's role manager.
4
+
5
+ The [Members plugin](https://themehybrid.com/plugins/members) and the GiveWP plugin are required to be installed and activated for this plugin to work. The Recurring Donations plugin is optional.
6
+
7
+ ## GiveWP Role Group
8
+
9
+ The plugin creates a new role group for GiveWP, which is located under the Users > Roles screen in the admin. This role group lists the following roles:
10
+
11
+ - Give Accountant
12
+ - Give Donor (_Recurring Donations_ extension)
13
+ - Give Manager
14
+ - Give Subscriber
15
+ - Give Worker
16
+ - Any other roles that have GiveWP-related capabilities.
17
+
18
+ This allows you to see any roles that have GiveWP permissions at a glance.
19
+
20
+ ## GiveWP Capability Group
21
+
22
+ When editing or creating a new role in Members, this add-on creates a new GiveWP tab (cap group). This tab combines all of the GiveWP capabilities in one place. That way, you can see all available caps without jumping between different tabs.
23
+
24
+ ## Copyright and License
25
+
26
+ This project is licensed under the [GNU GPL](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html), version 2 or later.
27
+
28
+ 2019 &copy; [Justin Tadlock](http://justintadlock.com).
addons/members-givewp-integration/src/functions-caps.php ADDED
@@ -0,0 +1,230 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Capability Functions.
4
+ *
5
+ * @package MembersIntegrationGiveWP
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-givewp-integration
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\Integration\GiveWP;
13
+
14
+ # Don't execute code if file is accessed directly.
15
+ defined( 'ABSPATH' ) || exit;
16
+
17
+ /**
18
+ * Returns an array of the GiveWP plugin capabilities.
19
+ *
20
+ * @since 1.0.0
21
+ * @access public
22
+ * @return array
23
+ */
24
+ function givewp_caps() {
25
+
26
+ return [
27
+ // Plugin caps.
28
+ 'manage_give_settings' => [
29
+ 'label' => __( 'GiveWP: Manage Settings', 'members' ),
30
+ 'description' => __( 'Allows access to manage the GiveWP plugin settings.', 'members' )
31
+ ],
32
+
33
+ 'view_give_sensitive_data' => [
34
+ 'label' => __( 'GiveWP: View Sensitive Data', 'members' ),
35
+ 'description' => __( 'Allows access to view sensitive user data.', 'members' )
36
+ ],
37
+
38
+ // Report caps.
39
+ 'export_give_reports' => [
40
+ 'label' => __( 'Reports: Export', 'members' ),
41
+ 'description' => __( 'Allows access to export reports.', 'members' )
42
+ ],
43
+
44
+ 'view_give_reports' => [
45
+ 'label' => __( 'Reports: View', 'members' ),
46
+ 'description' => __( 'Allows access to view reports.', 'members' )
47
+ ],
48
+
49
+ // Form caps.
50
+ 'edit_give_forms' => [
51
+ 'label' => __( 'Forms: Edit', 'members' ),
52
+ 'description' => sprintf(
53
+ __( "Allows users to edit donation forms. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
54
+ '<code>edit_*_forms</code>'
55
+ )
56
+ ],
57
+
58
+ 'edit_others_give_forms' => [
59
+ 'label' => __( "Forms: Edit Others'", 'members' ),
60
+ 'description' => __( "Allows users to edit other user's donation forms.", 'members' )
61
+ ],
62
+
63
+ 'edit_private_give_forms' => [
64
+ 'label' => __( 'Forms: Edit Private', 'members' ),
65
+ 'description' => __( 'Allows users to edit private donation forms.', 'members' )
66
+ ],
67
+
68
+ 'edit_published_give_forms' => [
69
+ 'label' => __( 'Forms: Edit Published', 'members' ),
70
+ 'description' => __( 'Allows users to edit published donation forms.', 'members' )
71
+ ],
72
+
73
+ 'publish_give_forms' => [
74
+ 'label' => __( 'Forms: Publish', 'members' ),
75
+ 'description' => __( 'Allows users to publish donation forms.', 'members' )
76
+ ],
77
+
78
+ 'read_private_give_forms' => [
79
+ 'label' => __( 'Forms: Read Private', 'members' ),
80
+ 'description' => __( 'Allows users to read private donation forms.', 'members' )
81
+ ],
82
+
83
+ 'delete_give_forms' => [
84
+ 'label' => __( 'Forms: Delete', 'members' ),
85
+ 'description' => sprintf(
86
+ __( "Allows users to delete donation forms. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
87
+ '<code>delete_*_forms</code>'
88
+ )
89
+ ],
90
+
91
+ 'delete_private_give_forms' => [
92
+ 'label' => __( 'Forms: Delete Private', 'members' ),
93
+ 'description' => __( 'Allows users to delete private donation forms.', 'members' )
94
+ ],
95
+
96
+ 'delete_others_give_forms' => [
97
+ 'label' => __( "Forms: Delete Others'", 'members' ),
98
+ 'description' => __( "Allows users to delete other users' donation forms.", 'members' )
99
+ ],
100
+
101
+ 'delete_published_give_forms' => [
102
+ 'label' => __( 'Forms: Delete Published', 'members' ),
103
+ 'description' => __( 'Allows users to delete published donation forms.', 'members' )
104
+ ],
105
+
106
+ 'import_give_forms' => [
107
+ 'label' => __( 'Forms: Import', 'members' ),
108
+ 'description' => __( 'Allows users to import donation forms.', 'members' )
109
+ ],
110
+
111
+ 'view_give_form_stats' => [
112
+ 'label' => __( 'Forms: View Stats', 'members' ),
113
+ 'description' => __( 'Allows users to view donation form stats.', 'members' )
114
+ ],
115
+
116
+ // Form taxonomy caps.
117
+ 'assign_give_form_terms' => [
118
+ 'label' => __( 'Forms: Assign Taxonomy Terms', 'members' ),
119
+ 'description' => __( 'Allows users to assign taxonomy terms to donation forms.', 'members' )
120
+ ],
121
+
122
+ 'edit_give_form_terms' => [
123
+ 'label' => __( 'Forms: Edit Taxonomy Terms', 'members' ),
124
+ 'description' => __( 'Allows users to edit donation form taxonomy terms.', 'members' )
125
+ ],
126
+
127
+ 'delete_give_form_terms' => [
128
+ 'label' => __( 'Forms: Delete Taxonomy Terms', 'members' ),
129
+ 'description' => __( 'Allows users to delete donation form taxonomy terms.', 'members' )
130
+ ],
131
+
132
+ 'manage_give_form_terms' => [
133
+ 'label' => __( 'Forms: Manage Taxonomy Terms', 'members' ),
134
+ 'description' => __( 'Allows access to donation taxonomy management screens.', 'members' )
135
+ ],
136
+
137
+ // Donation caps.
138
+ 'edit_give_payments' => [
139
+ 'label' => __( 'Donations: Edit', 'members' ),
140
+ 'description' => sprintf(
141
+ __( "Allows users to edit donations. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
142
+ '<code>edit_*_payments</code>'
143
+ )
144
+ ],
145
+
146
+ 'edit_others_give_payments' => [
147
+ 'label' => __( "Donations: Edit Others'", 'members' ),
148
+ 'description' => __( "Allows users to edit other user's donations.", 'members' )
149
+ ],
150
+
151
+ 'edit_private_give_payments' => [
152
+ 'label' => __( 'Donations: Edit Private', 'members' ),
153
+ 'description' => __( 'Allows users to edit private donations.', 'members' )
154
+ ],
155
+
156
+ 'edit_published_give_payments' => [
157
+ 'label' => __( 'Donations: Edit Published', 'members' ),
158
+ 'description' => __( 'Allows users to edit published donations.', 'members' )
159
+ ],
160
+
161
+ 'publish_give_payments' => [
162
+ 'label' => __( 'Donations: Publish', 'members' ),
163
+ 'description' => __( 'Allows users to publish donations.', 'members' )
164
+ ],
165
+
166
+ 'read_private_give_payments' => [
167
+ 'label' => __( 'Donations: Read Private', 'members' ),
168
+ 'description' => __( 'Allows users to read private donations.', 'members' )
169
+ ],
170
+
171
+ 'delete_give_payments' => [
172
+ 'label' => __( 'Donations: Delete', 'members' ),
173
+ 'description' => sprintf(
174
+ __( "Allows users to delete donations. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
175
+ '<code>delete_*_payments</code>'
176
+ )
177
+ ],
178
+
179
+ 'delete_private_give_payments' => [
180
+ 'label' => __( 'Donations: Delete Private', 'members' ),
181
+ 'description' => __( 'Allows users to delete private donations.', 'members' )
182
+ ],
183
+
184
+ 'delete_others_give_payments' => [
185
+ 'label' => __( "Donations: Delete Others'", 'members' ),
186
+ 'description' => __( "Allows users to delete other users' donations.", 'members' )
187
+ ],
188
+
189
+ 'delete_published_give_payments' => [
190
+ 'label' => __( 'Donations: Delete Published', 'members' ),
191
+ 'description' => __( 'Allows users to delete published donations.', 'members' )
192
+ ],
193
+
194
+ 'import_give_payments' => [
195
+ 'label' => __( 'Donations: Import', 'members' ),
196
+ 'description' => __( 'Allows users to import donations.', 'members' )
197
+ ],
198
+
199
+ 'view_give_payments' => [
200
+ 'label' => __( 'Donations: View', 'members' ),
201
+ 'description' => __( 'Allows users to view donations.', 'members' )
202
+ ],
203
+
204
+ 'view_give_payment_stats' => [
205
+ 'label' => __( 'Donations: View Stats', 'members' ),
206
+ 'description' => __( 'Allows users to view donation stats.', 'members' )
207
+ ],
208
+
209
+ // Donation taxonomy caps.
210
+ 'assign_give_payment_terms' => [
211
+ 'label' => __( 'Donations: Assign Taxonomy Terms', 'members' ),
212
+ 'description' => __( 'Allows users to assign taxonomy terms to donations.', 'members' )
213
+ ],
214
+
215
+ 'edit_give_payment_terms' => [
216
+ 'label' => __( 'Donations: Edit Taxonomy Terms', 'members' ),
217
+ 'description' => __( 'Allows users to edit donation taxonomy terms.', 'members' )
218
+ ],
219
+
220
+ 'delete_give_payment_terms' => [
221
+ 'label' => __( 'Donations: Delete Taxonomy Terms', 'members' ),
222
+ 'description' => __( 'Allows users to delete donation taxonomy terms.', 'members' )
223
+ ],
224
+
225
+ 'manage_give_payment_terms' => [
226
+ 'label' => __( 'Donations: Manage Taxonomy Terms', 'members' ),
227
+ 'description' => __( 'Allows access to taxonomy management screens.', 'members' )
228
+ ]
229
+ ];
230
+ }
addons/members-givewp-integration/src/functions-filters.php ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin Filters.
4
+ *
5
+ * @package MembersIntegrationGiveWP
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-givewp-integration
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\Integration\GiveWP;
13
+
14
+ use function members_register_cap;
15
+ use function members_register_cap_group;
16
+ use function members_register_role_group;
17
+ use function members_unregister_cap_group;
18
+
19
+ # Don't execute code if file is accessed directly.
20
+ defined( 'ABSPATH' ) || exit;
21
+
22
+ /**
23
+ * Registers custom role groups.
24
+ *
25
+ * @since 1.0.0
26
+ * @access public
27
+ * @return void
28
+ */
29
+ add_action( 'members_register_role_groups', function() {
30
+
31
+ $roles = givewp_roles();
32
+
33
+ // Add the plugin-specific role group only if the GiveWP plugin is active
34
+ // and there are existing roles with plugin-specific caps.
35
+ if ( class_exists( 'Give' ) && $roles ) {
36
+ members_register_role_group( 'plugin-givewp', [
37
+ 'label' => esc_html__( 'GiveWP', 'members' ),
38
+ 'label_count' => _n_noop( 'GiveWP %s', 'GiveWP %s', 'members' ),
39
+ 'roles' => $roles,
40
+ ] );
41
+ }
42
+ } );
43
+
44
+ /**
45
+ * Registers custom cap groups.
46
+ *
47
+ * @since 1.0.0
48
+ * @access public
49
+ * @return void
50
+ */
51
+ add_action( 'members_register_cap_groups', function() {
52
+
53
+ // Only run if we have the `give_forms` post type.
54
+ if ( $type = get_post_type_object( 'give_forms' ) ) {
55
+
56
+ $groups = [
57
+ 'give_forms',
58
+ 'give_payment'
59
+ ];
60
+
61
+ // Unregister any cap groups already registered for the plugin's
62
+ // custom post types.
63
+ foreach ( $groups as $group ) {
64
+ members_unregister_cap_group( "type-{$group}" );
65
+ }
66
+
67
+ // Register a cap group for the GiveWP plugin.
68
+ members_register_cap_group( 'plugin-givewp', [
69
+ 'label' => esc_html__( 'GiveWP', 'members' ),
70
+ 'icon' => $type->menu_icon,
71
+ 'priority' => 11
72
+ ] );
73
+ }
74
+
75
+ } );
76
+
77
+ /**
78
+ * Registers the GiveWP plugin capabilities.
79
+ *
80
+ * @since 1.0.0
81
+ * @access public
82
+ * @return void
83
+ */
84
+ add_action( 'members_register_caps', function() {
85
+
86
+ if ( class_exists( 'Give' ) ) {
87
+
88
+ foreach ( givewp_caps() as $name => $options ) {
89
+
90
+ members_register_cap( $name, [
91
+ 'label' => $options['label'],
92
+ 'description' => $options['description'],
93
+ 'group' => 'plugin-givewp'
94
+ ] );
95
+ }
96
+ }
97
+
98
+ } );
addons/members-givewp-integration/src/functions-roles.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Role Functions.
4
+ *
5
+ * @package MembersIntegrationGiveWP
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-givewp-integration
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\Integration\GiveWP;
13
+
14
+ use function members_get_roles;
15
+ use function members_role_exists;
16
+
17
+ # Don't execute code if file is accessed directly.
18
+ defined( 'ABSPATH' ) || exit;
19
+
20
+ /**
21
+ * Returns an array of the GiveWP plugin roles.
22
+ *
23
+ * @since 1.0.0
24
+ * @access public
25
+ * @return array
26
+ */
27
+ function givewp_roles() {
28
+
29
+ $roles = [];
30
+
31
+ $givewp_roles = [
32
+ // Core GiveWP plugin roles.
33
+ 'give_accountant',
34
+ 'give_manager',
35
+ 'give_subscriber',
36
+ 'give_worker',
37
+
38
+ // Recurring Donations (add-on) roles.
39
+ 'give_donor'
40
+ ];
41
+
42
+ // Specifically add the GiveWP plugin's roles. We need to check that
43
+ // these exist in case a user decides to delete them or in case the role
44
+ // is from an add-on that's not installed.
45
+ foreach ( $givewp_roles as $role ) {
46
+ if ( members_role_exists( $role ) ) {
47
+ $roles[] = $role;
48
+ }
49
+ }
50
+
51
+ // Add any roles that have any of the GiveWP capabilities to the group.
52
+ $role_objects = members_get_roles();
53
+
54
+ $givewp_caps = array_keys( givewp_caps() );
55
+
56
+ foreach ( $role_objects as $role ) {
57
+
58
+ if ( 0 < count( array_intersect( $givewp_caps, (array) $role->get( 'granted_caps' ) ) ) ) {
59
+ $roles[] = $role->get( 'name' );
60
+ }
61
+ }
62
+
63
+ return $roles;
64
+ }
addons/members-meta-box-integration/.gitignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ /node_modules
2
+ /vendor
3
+ /composer.lock
4
+ /phpcs.xml
5
+ /.phpcs.xml
6
+ *.map
addons/members-meta-box-integration/addon.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Members\Integration\MetaBox;
4
+
5
+ # Don't execute code if file is accessed directly.
6
+ defined( 'ABSPATH' ) || exit;
7
+
8
+ /**
9
+ * Registers the plugin activation callback.
10
+ *
11
+ * @since 1.0.0
12
+ * @access public
13
+ * @return void
14
+ */
15
+ register_activation_hook( __FILE__, function() {
16
+ require_once 'src/Activator.php';
17
+ Activator::activate();
18
+ } );
19
+
20
+ /**
21
+ * Wrapper for the plugin instance.
22
+ *
23
+ * @since 1.0.0
24
+ * @access public
25
+ * @return void
26
+ */
27
+ function plugin() {
28
+ static $instance = null;
29
+
30
+ if ( is_null( $instance ) ) {
31
+ $instance = new Plugin();
32
+ }
33
+
34
+ return $instance;
35
+ }
36
+
37
+ # Bootstrap plugin.
38
+ require_once 'src/Plugin.php';
39
+ require_once 'src/functions-caps.php';
40
+ require_once 'src/functions-roles.php';
41
+
42
+ # Boot the plugin.
43
+ plugin()->boot();
addons/members-meta-box-integration/changelog.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ # Change Log
2
+
3
+ ## [1.0.0] - 2019-08-16
4
+
5
+ ### Added
6
+
7
+ - Plugin launch. Everything's new!
addons/members-meta-box-integration/package-lock.json ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-meta-box-integration",
3
+ "requires": true,
4
+ "lockfileVersion": 1,
5
+ "dependencies": {
6
+ "balanced-match": {
7
+ "version": "1.0.0",
8
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
9
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
10
+ "dev": true
11
+ },
12
+ "bluebird": {
13
+ "version": "3.5.5",
14
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
15
+ "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
16
+ "dev": true
17
+ },
18
+ "brace-expansion": {
19
+ "version": "1.1.11",
20
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
21
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
22
+ "dev": true,
23
+ "requires": {
24
+ "balanced-match": "^1.0.0",
25
+ "concat-map": "0.0.1"
26
+ }
27
+ },
28
+ "concat-map": {
29
+ "version": "0.0.1",
30
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
31
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
32
+ "dev": true
33
+ },
34
+ "encoding": {
35
+ "version": "0.1.12",
36
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
37
+ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
38
+ "dev": true,
39
+ "requires": {
40
+ "iconv-lite": "~0.4.13"
41
+ }
42
+ },
43
+ "fs.realpath": {
44
+ "version": "1.0.0",
45
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
46
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
47
+ "dev": true
48
+ },
49
+ "gettext-parser": {
50
+ "version": "3.1.1",
51
+ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-3.1.1.tgz",
52
+ "integrity": "sha512-vNhWcqXEtZPs5Ft1ReA34g7ByWotpcOIeJvXVy2jF3/G2U9v6W0wG4Z4hXzcU8R//jArqkgHcVCGgGqa4vxVlQ==",
53
+ "dev": true,
54
+ "requires": {
55
+ "encoding": "^0.1.12",
56
+ "readable-stream": "^3.2.0",
57
+ "safe-buffer": "^5.1.2"
58
+ }
59
+ },
60
+ "glob": {
61
+ "version": "7.1.4",
62
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
63
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
64
+ "dev": true,
65
+ "requires": {
66
+ "fs.realpath": "^1.0.0",
67
+ "inflight": "^1.0.4",
68
+ "inherits": "2",
69
+ "minimatch": "^3.0.4",
70
+ "once": "^1.3.0",
71
+ "path-is-absolute": "^1.0.0"
72
+ }
73
+ },
74
+ "iconv-lite": {
75
+ "version": "0.4.24",
76
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
77
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
78
+ "dev": true,
79
+ "requires": {
80
+ "safer-buffer": ">= 2.1.2 < 3"
81
+ }
82
+ },
83
+ "inflight": {
84
+ "version": "1.0.6",
85
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
86
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
87
+ "dev": true,
88
+ "requires": {
89
+ "once": "^1.3.0",
90
+ "wrappy": "1"
91
+ }
92
+ },
93
+ "inherits": {
94
+ "version": "2.0.4",
95
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
96
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
97
+ "dev": true
98
+ },
99
+ "lodash": {
100
+ "version": "4.17.15",
101
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
102
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
103
+ "dev": true
104
+ },
105
+ "minimatch": {
106
+ "version": "3.0.4",
107
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
108
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
109
+ "dev": true,
110
+ "requires": {
111
+ "brace-expansion": "^1.1.7"
112
+ }
113
+ },
114
+ "minimist": {
115
+ "version": "1.2.0",
116
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
117
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
118
+ "dev": true
119
+ },
120
+ "mkdirp": {
121
+ "version": "0.5.1",
122
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
123
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
124
+ "dev": true,
125
+ "requires": {
126
+ "minimist": "0.0.8"
127
+ },
128
+ "dependencies": {
129
+ "minimist": {
130
+ "version": "0.0.8",
131
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
132
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
133
+ "dev": true
134
+ }
135
+ }
136
+ },
137
+ "node-wp-i18n": {
138
+ "version": "1.2.3",
139
+ "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.2.3.tgz",
140
+ "integrity": "sha512-YMzMcsjXbGYDB9vHyb289CYXAGmXhcNLbeTlOnWgPNkZd9xrovcbRd7cQyKd9BQHOjS7Nw8WCbJ7nvtR7rc0rg==",
141
+ "dev": true,
142
+ "requires": {
143
+ "bluebird": "^3.4.1",
144
+ "gettext-parser": "^3.1.0",
145
+ "glob": "^7.0.5",
146
+ "lodash": "^4.14.2",
147
+ "minimist": "^1.2.0",
148
+ "mkdirp": "^0.5.1",
149
+ "tmp": "^0.0.33"
150
+ }
151
+ },
152
+ "once": {
153
+ "version": "1.4.0",
154
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
155
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
156
+ "dev": true,
157
+ "requires": {
158
+ "wrappy": "1"
159
+ }
160
+ },
161
+ "os-tmpdir": {
162
+ "version": "1.0.2",
163
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
164
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
165
+ "dev": true
166
+ },
167
+ "path-is-absolute": {
168
+ "version": "1.0.1",
169
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
170
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
171
+ "dev": true
172
+ },
173
+ "readable-stream": {
174
+ "version": "3.4.0",
175
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
176
+ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
177
+ "dev": true,
178
+ "requires": {
179
+ "inherits": "^2.0.3",
180
+ "string_decoder": "^1.1.1",
181
+ "util-deprecate": "^1.0.1"
182
+ }
183
+ },
184
+ "safe-buffer": {
185
+ "version": "5.2.0",
186
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
187
+ "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
188
+ "dev": true
189
+ },
190
+ "safer-buffer": {
191
+ "version": "2.1.2",
192
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
193
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
194
+ "dev": true
195
+ },
196
+ "string_decoder": {
197
+ "version": "1.3.0",
198
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
199
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
200
+ "dev": true,
201
+ "requires": {
202
+ "safe-buffer": "~5.2.0"
203
+ }
204
+ },
205
+ "tmp": {
206
+ "version": "0.0.33",
207
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
208
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
209
+ "dev": true,
210
+ "requires": {
211
+ "os-tmpdir": "~1.0.2"
212
+ }
213
+ },
214
+ "util-deprecate": {
215
+ "version": "1.0.2",
216
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
217
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
218
+ "dev": true
219
+ },
220
+ "wrappy": {
221
+ "version": "1.0.2",
222
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
223
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
224
+ "dev": true
225
+ }
226
+ }
227
+ }
addons/members-meta-box-integration/package.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-meta-box-integration",
3
+ "author": "Justin Tadlock",
4
+ "license": "GPL-2.0+",
5
+ "homepage": "https://themehybrid.com/plugins/members-meta-box-integration",
6
+ "main": "resources/js/app.js",
7
+ "scripts": {
8
+ "i18n": "npm run i18n:textdomain && npm run i18n:pot",
9
+ "i18n:textdomain": "npx wpi18n addtextdomain --exclude=vendor,node_modules",
10
+ "i18n:pot": "npx wpi18n makepot --domain-path=/resources/lang"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/justintadlock/members-meta-box-integration.git"
15
+ },
16
+ "bugs": {
17
+ "url": "https://github.com/justintadlock/members-meta-box-integration/issues"
18
+ },
19
+ "devDependencies": {
20
+ "node-wp-i18n": "^1.2.3"
21
+ },
22
+ "dependencies": {}
23
+ }
addons/members-meta-box-integration/readme.md ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Members - Meta Box Integration
2
+
3
+ The Members - Meta Box Integration add-on more nicely integrates the [Meta Box](https://metabox.io/) plugin capabilities into the Members plugin's role manager.
4
+
5
+ The [Members plugin](https://themehybrid.com/plugins/members) and the Meta Box plugin are required to be installed and activated for this plugin to work.
6
+
7
+ ## Meta Box Role Group
8
+
9
+ The plugin creates a new role group for Meta Box, which is located under the Users > Roles screen in the admin. This role group lists the following roles:
10
+
11
+ - Customer
12
+ - Any other roles that have Meta Box-related capabilities.
13
+
14
+ This allows you to see any roles that have Meta Box permissions at a glance.
15
+
16
+ ## Meta Box Capability Group
17
+
18
+ When editing or creating a new role in Members, this add-on creates a new "MetaBox" tab (cap group). This tab combines all of the Meta Box capabilities in one place. That way, you can see all available caps without jumping between different tabs.
19
+
20
+ ## Copyright and License
21
+
22
+ This project is licensed under the [GNU GPL](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html), version 2 or later.
23
+
24
+ 2019 &copy; [Justin Tadlock](http://justintadlock.com).
addons/members-meta-box-integration/src/Activator.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin Activator.
4
+ *
5
+ * Runs the plugin activation routine.
6
+ *
7
+ * @package MembersIntegrationMetaBox
8
+ * @author Justin Tadlock <justintadlock@gmail.com>
9
+ * @copyright 2019, Justin Tadlock
10
+ * @link https://themehybrid.com/plugins/members-metabox-integration
11
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
12
+ */
13
+
14
+ namespace Members\Integration\MetaBox;
15
+
16
+ /**
17
+ * Activator class.
18
+ *
19
+ * @since 1.0.0
20
+ * @access public
21
+ */
22
+ class Activator {
23
+
24
+ /**
25
+ * Runs necessary code when first activating the plugin.
26
+ *
27
+ * @since 1.0.0
28
+ * @access public
29
+ * @return void
30
+ */
31
+ public static function activate() {
32
+
33
+ // Get the administrator role.
34
+ $role = get_role( 'administrator' );
35
+
36
+ // If the administrator role exists, add required capabilities
37
+ // for the plugin.
38
+ if ( ! empty( $role ) ) {
39
+
40
+ $role->add_cap( 'create_metabox_field_groups' );
41
+ $role->add_cap( 'edit_metabox_field_groups' );
42
+ $role->add_cap( 'delete_metabox_field_groups' );
43
+ }
44
+ }
45
+ }
addons/members-meta-box-integration/src/Plugin.php ADDED
@@ -0,0 +1,171 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin Filters.
4
+ *
5
+ * @package MembersIntegrationMetaBox
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-meta-box-integration
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\Integration\MetaBox;
13
+
14
+ use function members_register_cap;
15
+ use function members_register_cap_group;
16
+ use function members_register_role_group;
17
+ use function members_unregister_cap_group;
18
+
19
+ class Plugin {
20
+
21
+ /**
22
+ * Bootstrap the plugin.
23
+ *
24
+ * @since 1.0.0
25
+ * @access public
26
+ * @return void
27
+ */
28
+ public function boot() {
29
+
30
+ // Load early to check if MetaBox is installed.
31
+ add_action( 'plugins_loaded', [ $this, 'load' ], ~PHP_INT_MAX );
32
+ }
33
+
34
+ /**
35
+ * Loads the plugin late.
36
+ *
37
+ * @since 1.0.0
38
+ * @access public
39
+ * @return void
40
+ */
41
+ public function load() {
42
+
43
+ if ( ! function_exists( 'mb_builder_load' ) ) {
44
+ return;
45
+ }
46
+
47
+ // Filter CPT caps for MetaBox.
48
+ add_filter( 'register_post_type_args', [ $this, 'registerPostTypeArgs' ], 10, 2 );
49
+
50
+ // Register custom roles, caps, and groups.
51
+ add_action( 'members_register_role_groups', [ $this, 'registerRoleGroups' ] );
52
+ add_action( 'members_register_cap_groups', [ $this, 'registerCapGroups' ] );
53
+ add_action( 'members_register_caps', [ $this, 'registerCaps' ] );
54
+ }
55
+
56
+ /**
57
+ * Overwrites the Meta Box custom post type args to roll out custom capabilities.
58
+ *
59
+ * @since 1.0.0
60
+ * @access public
61
+ * @param array $args
62
+ * @param string $type
63
+ * @return array
64
+ */
65
+ public function registerPostTypeArgs( $args, $type ) {
66
+
67
+ // Field groups.
68
+ if ( 'meta-box' === $type ) {
69
+
70
+ // Change the capability type to tie it to the CPT.
71
+ $args['capability_type'] = 'metabox';
72
+
73
+ // Let core WP map meta caps for us.
74
+ $args['map_meta_cap'] = true;
75
+
76
+ // Roll out a limited set of custom caps.
77
+ $args['capabilities'] = [
78
+ // meta caps (don't assign these to roles)
79
+ 'edit_post' => 'edit_metabox_field_group',
80
+ 'read_post' => 'read_metabox_field_group',
81
+ 'delete_post' => 'delete_metabox_field_group',
82
+
83
+ // primitive/meta caps
84
+ 'create_posts' => 'create_metabox_field_groups',
85
+
86
+ // primitive caps used outside of map_meta_cap()
87
+ 'edit_posts' => 'edit_metabox_field_groups',
88
+ 'edit_others_posts' => 'edit_metabox_field_groups',
89
+ 'publish_posts' => 'edit_metabox_field_groups',
90
+ 'read_private_posts' => 'edit_metabox_field_groups',
91
+
92
+ // primitive caps used inside of map_meta_cap()
93
+ 'read' => 'read',
94
+ 'delete_posts' => 'delete_metabox_field_groups',
95
+ 'delete_private_posts' => 'delete_metabox_field_groups',
96
+ 'delete_published_posts' => 'delete_metabox_field_groups',
97
+ 'delete_others_posts' => 'delete_metabox_field_groups',
98
+ 'edit_private_posts' => 'edit_metabox_field_groups',
99
+ 'edit_published_posts' => 'edit_metabox_field_groups'
100
+ ];
101
+ }
102
+
103
+ return $args;
104
+ }
105
+
106
+ /**
107
+ * Registers custom role groups.
108
+ *
109
+ * @since 1.0.0
110
+ * @access public
111
+ * @return void
112
+ */
113
+ public function registerRoleGroups() {
114
+
115
+ $roles = meta_box_roles();
116
+
117
+ // Add the plugin-specific role group only if there are existing
118
+ // roles with plugin-specific caps.
119
+ if ( $roles ) {
120
+ members_register_role_group( 'plugin-meta-box', [
121
+ 'label' => esc_html__( 'Meta Box', 'members' ),
122
+ 'label_count' => _n_noop( 'Meta Box %s', 'MetaBox %s', 'members' ),
123
+ 'roles' => $roles,
124
+ ] );
125
+ }
126
+ }
127
+
128
+ /**
129
+ * Registers custom cap groups.
130
+ *
131
+ * @since 1.0.0
132
+ * @access public
133
+ * @return void
134
+ */
135
+ public function registerCapGroups() {
136
+
137
+ // Only run if we have the `product` post type.
138
+ if ( $type = get_post_type_object( 'meta-box' ) ) {
139
+
140
+ // Unregister any cap groups already registered for the
141
+ // plugin's custom post types.
142
+ members_unregister_cap_group( "type-{$type->name}" );
143
+
144
+ // Register a cap group for the Meta Box plugin.
145
+ members_register_cap_group( 'plugin-meta-box', [
146
+ 'label' => esc_html__( 'Meta Box', 'members' ),
147
+ 'icon' => 'dashicons-admin-settings',
148
+ 'priority' => 11,
149
+ 'caps' => array_keys( meta_box_caps() )
150
+ ] );
151
+ }
152
+ }
153
+
154
+ /**
155
+ * Registers the plugin capabilities.
156
+ *
157
+ * @since 1.0.0
158
+ * @access public
159
+ * @return void
160
+ */
161
+ public function registerCaps() {
162
+
163
+ foreach ( meta_box_caps() as $name => $options ) {
164
+
165
+ members_register_cap( $name, [
166
+ 'label' => $options['label'],
167
+ 'description' => $options['description']
168
+ ] );
169
+ }
170
+ }
171
+ }
addons/members-meta-box-integration/src/functions-caps.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Capability Functions.
4
+ *
5
+ * @package MembersIntegrationMetaBox
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-meta-box-integration
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\Integration\MetaBox;
13
+
14
+ # Don't execute code if file is accessed directly.
15
+ defined( 'ABSPATH' ) || exit;
16
+
17
+ /**
18
+ * Returns an array of the Meta Box plugin capabilities.
19
+ *
20
+ * @since 1.0.0
21
+ * @access public
22
+ * @return array
23
+ */
24
+ function meta_box_caps() {
25
+
26
+ return [
27
+ 'create_metabox_field_groups' => [
28
+ 'label' => __( 'Create Field Groups', 'members' ),
29
+ 'description' => __( 'Allows users to create new field groups.', 'members' )
30
+ ],
31
+
32
+ 'edit_metabox_field_groups' => [
33
+ 'label' => __( 'Edit Field Groups', 'members' ),
34
+ 'description' => sprintf(
35
+ // Translators: %s is a capability name.
36
+ __( "Allows users to edit field groups. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
37
+ '<code>edit_*_metabox_field_groups</code>'
38
+ )
39
+ ],
40
+
41
+ 'delete_metabox_field_groups' => [
42
+ 'label' => __( 'Delete Field Groups', 'members' ),
43
+ 'description' => sprintf(
44
+ // Translators: %s is a capability name.
45
+ __( "Allows users to delete field groups. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
46
+ '<code>delete_*_metabox_field_groups</code>'
47
+ )
48
+ ]
49
+ ];
50
+ }
addons/members-meta-box-integration/src/functions-roles.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Role Functions.
4
+ *
5
+ * @package MembersIntegrationMetaBox
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-meta-box-integration
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\Integration\MetaBox;
13
+
14
+ use function members_get_roles;
15
+
16
+ # Don't execute code if file is accessed directly.
17
+ defined( 'ABSPATH' ) || exit;
18
+
19
+ /**
20
+ * Returns an array of the Meta Box plugin roles.
21
+ *
22
+ * @since 1.0.0
23
+ * @access public
24
+ * @return array
25
+ */
26
+ function meta_box_roles() {
27
+
28
+ $roles = [];
29
+
30
+ // Add any roles that have any of the Meta Box capabilities to the group.
31
+ $role_objects = members_get_roles();
32
+
33
+ $meta_box_caps = array_keys( meta_box_caps() );
34
+
35
+ foreach ( $role_objects as $role ) {
36
+
37
+ if ( 0 < count( array_intersect( $meta_box_caps, (array) $role->get( 'granted_caps' ) ) ) ) {
38
+ $roles[] = $role->get( 'name' );
39
+ }
40
+ }
41
+
42
+ return $roles;
43
+ }
addons/members-privacy-caps/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
1
+ node_modules/
2
+ dist/
addons/members-privacy-caps/addon.php ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Members\AddOns\PrivacyCaps;
4
+
5
+ # Add actions and filters.
6
+ add_action( 'members_register_caps', __NAMESPACE__ . '\register_caps' );
7
+ add_filter( 'map_meta_cap', __NAMESPACE__ . '\map_meta_cap', 95, 2 );
8
+
9
+ # Register activation/deactivation hooks.
10
+ register_activation_hook( __FILE__, __NAMESPACE__ . '\activation' );
11
+
12
+ /**
13
+ * Adds the privacy capabilities to the administrator role whenever the plugin
14
+ * is activated.
15
+ *
16
+ * On Multisite, we're not adding any caps to a role because these caps are, by
17
+ * default, only allowed for people with the `manage_network` capability, which
18
+ * is a Super Admin cap. If network owners want sub-site administrators to be
19
+ * able to have thse caps, they should be added to the role via the edit role
20
+ * screen in Members.
21
+ *
22
+ * @since 1.0.0
23
+ * @access public
24
+ * @return void
25
+ */
26
+ function activation() {
27
+
28
+ if ( is_multisite() ) {
29
+ return;
30
+ }
31
+
32
+ $role = get_role( 'administrator' );
33
+
34
+ if ( $role ) {
35
+ $role->add_cap( 'export_others_personal_data' );
36
+ $role->add_cap( 'erase_others_personal_data' );
37
+ $role->add_cap( 'manage_privacy_options' );
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Registers capabilities with the Members plugin.
43
+ *
44
+ * @since 1.0.0
45
+ * @access public
46
+ * @return void
47
+ */
48
+ function register_caps() {
49
+
50
+ members_register_cap( 'manage_privacy_options', [
51
+ 'label' => __( 'Manage Privacy Options', 'members' ),
52
+ 'group' => 'general'
53
+ ] );
54
+
55
+ members_register_cap( 'erase_others_personal_data', [
56
+ 'label' => __( "Erase Others' Personal Data", 'members' ),
57
+ 'group' => 'user'
58
+ ] );
59
+
60
+ members_register_cap( 'export_others_personal_data', [
61
+ 'label' => __( "Export Others' Personal Data", 'members' ),
62
+ 'group' => 'user'
63
+ ] );
64
+ }
65
+
66
+ /**
67
+ * The privacy caps are mapped to `manage_options` (or `manage_network` in the
68
+ * case of multisite) by default, effectively making them meta caps. We're
69
+ * turning the caps into primitive caps.
70
+ *
71
+ * @since 1.0.0
72
+ * @access public
73
+ * @param array $caps
74
+ * @param string $cap
75
+ * @return array
76
+ */
77
+ function map_meta_cap( $caps, $cap ) {
78
+
79
+ $privacy_caps = [
80
+ 'export_others_personal_data',
81
+ 'erase_others_personal_data',
82
+ 'manage_privacy_options'
83
+ ];
84
+
85
+ if ( in_array( $cap, $privacy_caps ) ) {
86
+
87
+ // The cap should map back to itself.
88
+ $caps = [ $cap ];
89
+
90
+ // Core WP requires the 'delete_users' cap when erasing a user's
91
+ // personal data. This becomes even more important on multisite
92
+ // where even a sub-site admin might not be able to delete users.
93
+ // So, we're adding this as a required cap too.
94
+ if ( 'erase_others_personal_data' === $cap ) {
95
+ $caps[] = 'delete_users';
96
+ }
97
+ }
98
+
99
+ return $caps;
100
+ }
addons/members-privacy-caps/changelog.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ # Change Log
2
+
3
+ ## [1.0.0] - 2018-05-04
4
+
5
+ ### Added
6
+
7
+ * Plugin launch. Everything's new!
addons/members-privacy-caps/contributing.md ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contributing
2
+
3
+ The code for the project is handled via its [GitHub Repository](https://github.com/justintadlock/members-privacy-caps). You can open tickets, create patches, and send pull requests there.
4
+
5
+ ## Pull requests
6
+
7
+ Problem first. Solution second.
8
+
9
+ Pull requests should have a ticket open for discussion first. I rarely accept pull requests that aren't for a specific issue for various reasons. It's far better to post an issue and let me or the community provide feedback prior to creating a pull request.
10
+
11
+ Please don't make pull requests against the `master` branch. This is the latest, stable code. You can make a pull request against one of the point branches or the `dev` (future release) branch.
12
+
13
+ ## Coding standards
14
+
15
+ In general, the project follows all WordPress [coding standards](https://make.wordpress.org/core/handbook/best-practices/coding-standards). There are instances where it doesn't, opting for personal choices of my own, but in terms of contributing, following the WordPress standards is best practice.
16
+
17
+ ## Script and style files
18
+
19
+ The project consists of several script and style files. When making patches or pull requests with changes to these files, only do so to the primary file. Don't create patches for the minified (`.min`) versions of the files. Those will be minified after a patch is merged into the code base.
20
+
21
+ ## Language
22
+
23
+ All text strings follow U.S. English by default. While such guides are generally unneeded, in cases where style considerations are necessary, these will typically follow conventions laid out in *Elements of Style* or the *AP Stylebook*.
24
+
25
+ ## Licensing
26
+
27
+ Any code contributed to the project via patches, pull requests, or other means will be licensed under the [GPL version 2](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html) or later. By contributing code to the project, you provide consent to use such code under this license. The exception to this rule is when bringing in third-party code with an alternate open source license.
28
+
29
+ ## Versioning
30
+
31
+ The project uses [semantic versioning](http://semver.org). Version numbers will look like `3.2.1` where `3` is the "major" release, `2` is the minor release, and `1` is the patch release.
addons/members-privacy-caps/license.md ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+ Preamble
10
+
11
+ The licenses for most software are designed to take away your
12
+ freedom to share and change it. By contrast, the GNU General Public
13
+ License is intended to guarantee your freedom to share and change free
14
+ software--to make sure the software is free for all its users. This
15
+ General Public License applies to most of the Free Software
16
+ Foundation's software and to any other program whose authors commit to
17
+ using it. (Some other Free Software Foundation software is covered by
18
+ the GNU Lesser General Public License instead.) You can apply it to
19
+ your programs, too.
20
+
21
+ When we speak of free software, we are referring to freedom, not
22
+ price. Our General Public Licenses are designed to make sure that you
23
+ have the freedom to distribute copies of free software (and charge for
24
+ this service if you wish), that you receive source code or can get it
25
+ if you want it, that you can change the software or use pieces of it
26
+ in new free programs; and that you know you can do these things.
27
+
28
+ To protect your rights, we need to make restrictions that forbid
29
+ anyone to deny you these rights or to ask you to surrender the rights.
30
+ These restrictions translate to certain responsibilities for you if you
31
+ distribute copies of the software, or if you modify it.
32
+
33
+ For example, if you distribute copies of such a program, whether
34
+ gratis or for a fee, you must give the recipients all the rights that
35
+ you have. You must make sure that they, too, receive or can get the
36
+ source code. And you must show them these terms so they know their
37
+ rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and
40
+ (2) offer you this license which gives you legal permission to copy,
41
+ distribute and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain
44
+ that everyone understands that there is no warranty for this free
45
+ software. If the software is modified by someone else and passed on, we
46
+ want its recipients to know that what they have is not the original, so
47
+ that any problems introduced by others will not reflect on the original
48
+ authors' reputations.
49
+
50
+ Finally, any free program is threatened constantly by software
51
+ patents. We wish to avoid the danger that redistributors of a free
52
+ program will individually obtain patent licenses, in effect making the
53
+ program proprietary. To prevent this, we have made it clear that any
54
+ patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ GNU GENERAL PUBLIC LICENSE
60
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+ 0. This License applies to any program or other work which contains
63
+ a notice placed by the copyright holder saying it may be distributed
64
+ under the terms of this General Public License. The "Program", below,
65
+ refers to any such program or work, and a "work based on the Program"
66
+ means either the Program or any derivative work under copyright law:
67
+ that is to say, a work containing the Program or a portion of it,
68
+ either verbatim or with modifications and/or translated into another
69
+ language. (Hereinafter, translation is included without limitation in
70
+ the term "modification".) Each licensee is addressed as "you".
71
+
72
+ Activities other than copying, distribution and modification are not
73
+ covered by this License; they are outside its scope. The act of
74
+ running the Program is not restricted, and the output from the Program
75
+ is covered only if its contents constitute a work based on the
76
+ Program (independent of having been made by running the Program).
77
+ Whether that is true depends on what the Program does.
78
+
79
+ 1. You may copy and distribute verbatim copies of the Program's
80
+ source code as you receive it, in any medium, provided that you
81
+ conspicuously and appropriately publish on each copy an appropriate
82
+ copyright notice and disclaimer of warranty; keep intact all the
83
+ notices that refer to this License and to the absence of any warranty;
84
+ and give any other recipients of the Program a copy of this License
85
+ along with the Program.
86
+
87
+ You may charge a fee for the physical act of transferring a copy, and
88
+ you may at your option offer warranty protection in exchange for a fee.
89
+
90
+ 2. You may modify your copy or copies of the Program or any portion
91
+ of it, thus forming a work based on the Program, and copy and
92
+ distribute such modifications or work under the terms of Section 1
93
+ above, provided that you also meet all of these conditions:
94
+
95
+ a) You must cause the modified files to carry prominent notices
96
+ stating that you changed the files and the date of any change.
97
+
98
+ b) You must cause any work that you distribute or publish, that in
99
+ whole or in part contains or is derived from the Program or any
100
+ part thereof, to be licensed as a whole at no charge to all third
101
+ parties under the terms of this License.
102
+
103
+ c) If the modified program normally reads commands interactively
104
+ when run, you must cause it, when started running for such
105
+ interactive use in the most ordinary way, to print or display an
106
+ announcement including an appropriate copyright notice and a
107
+ notice that there is no warranty (or else, saying that you provide
108
+ a warranty) and that users may redistribute the program under
109
+ these conditions, and telling the user how to view a copy of this
110
+ License. (Exception: if the Program itself is interactive but
111
+ does not normally print such an announcement, your work based on
112
+ the Program is not required to print an announcement.)
113
+
114
+ These requirements apply to the modified work as a whole. If
115
+ identifiable sections of that work are not derived from the Program,
116
+ and can be reasonably considered independent and separate works in
117
+ themselves, then this License, and its terms, do not apply to those
118
+ sections when you distribute them as separate works. But when you
119
+ distribute the same sections as part of a whole which is a work based
120
+ on the Program, the distribution of the whole must be on the terms of
121
+ this License, whose permissions for other licensees extend to the
122
+ entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+ Thus, it is not the intent of this section to claim rights or contest
125
+ your rights to work written entirely by you; rather, the intent is to
126
+ exercise the right to control the distribution of derivative or
127
+ collective works based on the Program.
128
+
129
+ In addition, mere aggregation of another work not based on the Program
130
+ with the Program (or with a work based on the Program) on a volume of
131
+ a storage or distribution medium does not bring the other work under
132
+ the scope of this License.
133
+
134
+ 3. You may copy and distribute the Program (or a work based on it,
135
+ under Section 2) in object code or executable form under the terms of
136
+ Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+ a) Accompany it with the complete corresponding machine-readable
139
+ source code, which must be distributed under the terms of Sections
140
+ 1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+ b) Accompany it with a written offer, valid for at least three
143
+ years, to give any third party, for a charge no more than your
144
+ cost of physically performing source distribution, a complete
145
+ machine-readable copy of the corresponding source code, to be
146
+ distributed under the terms of Sections 1 and 2 above on a medium
147
+ customarily used for software interchange; or,
148
+
149
+ c) Accompany it with the information you received as to the offer
150
+ to distribute corresponding source code. (This alternative is
151
+ allowed only for noncommercial distribution and only if you
152
+ received the program in object code or executable form with such
153
+ an offer, in accord with Subsection b above.)
154
+
155
+ The source code for a work means the preferred form of the work for
156
+ making modifications to it. For an executable work, complete source
157
+ code means all the source code for all modules it contains, plus any
158
+ associated interface definition files, plus the scripts used to
159
+ control compilation and installation of the executable. However, as a
160
+ special exception, the source code distributed need not include
161
+ anything that is normally distributed (in either source or binary
162
+ form) with the major components (compiler, kernel, and so on) of the
163
+ operating system on which the executable runs, unless that component
164
+ itself accompanies the executable.
165
+
166
+ If distribution of executable or object code is made by offering
167
+ access to copy from a designated place, then offering equivalent
168
+ access to copy the source code from the same place counts as
169
+ distribution of the source code, even though third parties are not
170
+ compelled to copy the source along with the object code.
171
+
172
+ 4. You may not copy, modify, sublicense, or distribute the Program
173
+ except as expressly provided under this License. Any attempt
174
+ otherwise to copy, modify, sublicense or distribute the Program is
175
+ void, and will automatically terminate your rights under this License.
176
+ However, parties who have received copies, or rights, from you under
177
+ this License will not have their licenses terminated so long as such
178
+ parties remain in full compliance.
179
+
180
+ 5. You are not required to accept this License, since you have not
181
+ signed it. However, nothing else grants you permission to modify or
182
+ distribute the Program or its derivative works. These actions are
183
+ prohibited by law if you do not accept this License. Therefore, by
184
+ modifying or distributing the Program (or any work based on the
185
+ Program), you indicate your acceptance of this License to do so, and
186
+ all its terms and conditions for copying, distributing or modifying
187
+ the Program or works based on it.
188
+
189
+ 6. Each time you redistribute the Program (or any work based on the
190
+ Program), the recipient automatically receives a license from the
191
+ original licensor to copy, distribute or modify the Program subject to
192
+ these terms and conditions. You may not impose any further
193
+ restrictions on the recipients' exercise of the rights granted herein.
194
+ You are not responsible for enforcing compliance by third parties to
195
+ this License.
196
+
197
+ 7. If, as a consequence of a court judgment or allegation of patent
198
+ infringement or for any other reason (not limited to patent issues),
199
+ conditions are imposed on you (whether by court order, agreement or
200
+ otherwise) that contradict the conditions of this License, they do not
201
+ excuse you from the conditions of this License. If you cannot
202
+ distribute so as to satisfy simultaneously your obligations under this
203
+ License and any other pertinent obligations, then as a consequence you
204
+ may not distribute the Program at all. For example, if a patent
205
+ license would not permit royalty-free redistribution of the Program by
206
+ all those who receive copies directly or indirectly through you, then
207
+ the only way you could satisfy both it and this License would be to
208
+ refrain entirely from distribution of the Program.
209
+
210
+ If any portion of this section is held invalid or unenforceable under
211
+ any particular circumstance, the balance of the section is intended to
212
+ apply and the section as a whole is intended to apply in other
213
+ circumstances.
214
+
215
+ It is not the purpose of this section to induce you to infringe any
216
+ patents or other property right claims or to contest validity of any
217
+ such claims; this section has the sole purpose of protecting the
218
+ integrity of the free software distribution system, which is
219
+ implemented by public license practices. Many people have made
220
+ generous contributions to the wide range of software distributed
221
+ through that system in reliance on consistent application of that
222
+ system; it is up to the author/donor to decide if he or she is willing
223
+ to distribute software through any other system and a licensee cannot
224
+ impose that choice.
225
+
226
+ This section is intended to make thoroughly clear what is believed to
227
+ be a consequence of the rest of this License.
228
+
229
+ 8. If the distribution and/or use of the Program is restricted in
230
+ certain countries either by patents or by copyrighted interfaces, the
231
+ original copyright holder who places the Program under this License
232
+ may add an explicit geographical distribution limitation excluding
233
+ those countries, so that distribution is permitted only in or among
234
+ countries not thus excluded. In such case, this License incorporates
235
+ the limitation as if written in the body of this License.
236
+
237
+ 9. The Free Software Foundation may publish revised and/or new versions
238
+ of the General Public License from time to time. Such new versions will
239
+ be similar in spirit to the present version, but may differ in detail to
240
+ address new problems or concerns.
241
+
242
+ Each version is given a distinguishing version number. If the Program
243
+ specifies a version number of this License which applies to it and "any
244
+ later version", you have the option of following the terms and conditions
245
+ either of that version or of any later version published by the Free
246
+ Software Foundation. If the Program does not specify a version number of
247
+ this License, you may choose any version ever published by the Free Software
248
+ Foundation.
249
+
250
+ 10. If you wish to incorporate parts of the Program into other free
251
+ programs whose distribution conditions are different, write to the author
252
+ to ask for permission. For software which is copyrighted by the Free
253
+ Software Foundation, write to the Free Software Foundation; we sometimes
254
+ make exceptions for this. Our decision will be guided by the two goals
255
+ of preserving the free status of all derivatives of our free software and
256
+ of promoting the sharing and reuse of software generally.
257
+
258
+ NO WARRANTY
259
+
260
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+ REPAIR OR CORRECTION.
269
+
270
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+ POSSIBILITY OF SUCH DAMAGES.
279
+
280
+ END OF TERMS AND CONDITIONS
281
+
282
+ How to Apply These Terms to Your New Programs
283
+
284
+ If you develop a new program, and you want it to be of the greatest
285
+ possible use to the public, the best way to achieve this is to make it
286
+ free software which everyone can redistribute and change under these terms.
287
+
288
+ To do so, attach the following notices to the program. It is safest
289
+ to attach them to the start of each source file to most effectively
290
+ convey the exclusion of warranty; and each file should have at least
291
+ the "copyright" line and a pointer to where the full notice is found.
292
+
293
+ <one line to give the program's name and a brief idea of what it does.>
294
+ Copyright (C) <year> <name of author>
295
+
296
+ This program is free software; you can redistribute it and/or modify
297
+ it under the terms of the GNU General Public License as published by
298
+ the Free Software Foundation; either version 2 of the License, or
299
+ (at your option) any later version.
300
+
301
+ This program is distributed in the hope that it will be useful,
302
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
303
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
+ GNU General Public License for more details.
305
+
306
+ You should have received a copy of the GNU General Public License along
307
+ with this program; if not, write to the Free Software Foundation, Inc.,
308
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309
+
310
+ Also add information on how to contact you by electronic and paper mail.
311
+
312
+ If the program is interactive, make it output a short notice like this
313
+ when it starts in an interactive mode:
314
+
315
+ Gnomovision version 69, Copyright (C) year name of author
316
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317
+ This is free software, and you are welcome to redistribute it
318
+ under certain conditions; type `show c' for details.
319
+
320
+ The hypothetical commands `show w' and `show c' should show the appropriate
321
+ parts of the General Public License. Of course, the commands you use may
322
+ be called something other than `show w' and `show c'; they could even be
323
+ mouse-clicks or menu items--whatever suits your program.
324
+
325
+ You should also get your employer (if you work as a programmer) or your
326
+ school, if any, to sign a "copyright disclaimer" for the program, if
327
+ necessary. Here is a sample; alter the names:
328
+
329
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
+
332
+ <signature of Ty Coon>, 1 April 1989
333
+ Ty Coon, President of Vice
334
+
335
+ This General Public License does not permit incorporating your program into
336
+ proprietary programs. If your program is a subroutine library, you may
337
+ consider it more useful to permit linking proprietary applications with the
338
+ library. If this is what you want to do, use the GNU Lesser General
339
+ Public License instead of this License.
addons/members-privacy-caps/package-lock.json ADDED
@@ -0,0 +1,813 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-privacy-caps",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 1,
5
+ "requires": true,
6
+ "dependencies": {
7
+ "ansi-green": {
8
+ "version": "0.1.1",
9
+ "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz",
10
+ "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=",
11
+ "dev": true,
12
+ "requires": {
13
+ "ansi-wrap": "0.1.0"
14
+ }
15
+ },
16
+ "ansi-wrap": {
17
+ "version": "0.1.0",
18
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
19
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
20
+ "dev": true
21
+ },
22
+ "arr-union": {
23
+ "version": "3.1.0",
24
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
25
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
26
+ "dev": true
27
+ },
28
+ "async-array-reduce": {
29
+ "version": "0.2.1",
30
+ "resolved": "https://registry.npmjs.org/async-array-reduce/-/async-array-reduce-0.2.1.tgz",
31
+ "integrity": "sha1-yL4BCitc0A3qlsgRFgNGk9/dgtE=",
32
+ "dev": true
33
+ },
34
+ "async-each": {
35
+ "version": "1.0.1",
36
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
37
+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
38
+ "dev": true
39
+ },
40
+ "balanced-match": {
41
+ "version": "1.0.0",
42
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
43
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
44
+ "dev": true
45
+ },
46
+ "bluebird": {
47
+ "version": "3.5.1",
48
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
49
+ "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
50
+ "dev": true
51
+ },
52
+ "brace-expansion": {
53
+ "version": "1.1.11",
54
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
55
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
56
+ "dev": true,
57
+ "requires": {
58
+ "balanced-match": "1.0.0",
59
+ "concat-map": "0.0.1"
60
+ }
61
+ },
62
+ "clone": {
63
+ "version": "1.0.4",
64
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
65
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
66
+ "dev": true
67
+ },
68
+ "clone-stats": {
69
+ "version": "0.0.1",
70
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
71
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
72
+ "dev": true
73
+ },
74
+ "concat-map": {
75
+ "version": "0.0.1",
76
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
77
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
78
+ "dev": true
79
+ },
80
+ "copy": {
81
+ "version": "0.3.2",
82
+ "resolved": "https://registry.npmjs.org/copy/-/copy-0.3.2.tgz",
83
+ "integrity": "sha512-drDFuUZctIuvSuvL9dOF/v5GxrwB1Q8eMIRlYONC0lSMEq+L2xabXP3jme8cQFdDO8cgP8JsuYhQg7JtTwezmg==",
84
+ "dev": true,
85
+ "requires": {
86
+ "async-each": "1.0.1",
87
+ "bluebird": "3.5.1",
88
+ "extend-shallow": "2.0.1",
89
+ "file-contents": "0.3.2",
90
+ "glob-parent": "2.0.0",
91
+ "graceful-fs": "4.1.11",
92
+ "has-glob": "0.1.1",
93
+ "is-absolute": "0.2.6",
94
+ "lazy-cache": "2.0.2",
95
+ "log-ok": "0.1.1",
96
+ "matched": "0.4.4",
97
+ "mkdirp": "0.5.1",
98
+ "resolve-dir": "0.1.1",
99
+ "to-file": "0.2.0"
100
+ }
101
+ },
102
+ "core-util-is": {
103
+ "version": "1.0.2",
104
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
105
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
106
+ "dev": true
107
+ },
108
+ "define-property": {
109
+ "version": "0.2.5",
110
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
111
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
112
+ "dev": true,
113
+ "requires": {
114
+ "is-descriptor": "0.1.6"
115
+ }
116
+ },
117
+ "encoding": {
118
+ "version": "0.1.12",
119
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
120
+ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
121
+ "dev": true,
122
+ "requires": {
123
+ "iconv-lite": "0.4.23"
124
+ }
125
+ },
126
+ "expand-tilde": {
127
+ "version": "1.2.2",
128
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
129
+ "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=",
130
+ "dev": true,
131
+ "requires": {
132
+ "os-homedir": "1.0.2"
133
+ }
134
+ },
135
+ "extend-shallow": {
136
+ "version": "2.0.1",
137
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
138
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
139
+ "dev": true,
140
+ "requires": {
141
+ "is-extendable": "0.1.1"
142
+ }
143
+ },
144
+ "file-contents": {
145
+ "version": "0.3.2",
146
+ "resolved": "https://registry.npmjs.org/file-contents/-/file-contents-0.3.2.tgz",
147
+ "integrity": "sha1-oJOf7RuM2hWAJm/Gt1OiMvtG3lM=",
148
+ "dev": true,
149
+ "requires": {
150
+ "define-property": "0.2.5",
151
+ "extend-shallow": "2.0.1",
152
+ "file-stat": "0.2.3",
153
+ "fs-exists-sync": "0.1.0",
154
+ "graceful-fs": "4.1.11",
155
+ "is-buffer": "1.1.6",
156
+ "isobject": "2.1.0",
157
+ "lazy-cache": "2.0.2",
158
+ "strip-bom-buffer": "0.1.1",
159
+ "strip-bom-string": "0.1.2",
160
+ "through2": "2.0.3",
161
+ "vinyl": "1.2.0"
162
+ }
163
+ },
164
+ "file-stat": {
165
+ "version": "0.2.3",
166
+ "resolved": "https://registry.npmjs.org/file-stat/-/file-stat-0.2.3.tgz",
167
+ "integrity": "sha1-Rpp+kn1pMAeWJM2zgQlAVFbLBqk=",
168
+ "dev": true,
169
+ "requires": {
170
+ "fs-exists-sync": "0.1.0",
171
+ "graceful-fs": "4.1.11",
172
+ "lazy-cache": "2.0.2",
173
+ "through2": "2.0.3"
174
+ }
175
+ },
176
+ "fs-exists-sync": {
177
+ "version": "0.1.0",
178
+ "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
179
+ "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=",
180
+ "dev": true
181
+ },
182
+ "fs.realpath": {
183
+ "version": "1.0.0",
184
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
185
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
186
+ "dev": true
187
+ },
188
+ "gettext-parser": {
189
+ "version": "1.3.1",
190
+ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.3.1.tgz",
191
+ "integrity": "sha512-W4t55eB/c7WrH0gbCHFiHuaEnJ1WiPJVnbFFiNEoh2QkOmuSLxs0PmJDGAmCQuTJCU740Fmb6D+2D/2xECWZGQ==",
192
+ "dev": true,
193
+ "requires": {
194
+ "encoding": "0.1.12",
195
+ "safe-buffer": "5.1.2"
196
+ }
197
+ },
198
+ "glob": {
199
+ "version": "7.1.2",
200
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
201
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
202
+ "dev": true,
203
+ "requires": {
204
+ "fs.realpath": "1.0.0",
205
+ "inflight": "1.0.6",
206
+ "inherits": "2.0.3",
207
+ "minimatch": "3.0.4",
208
+ "once": "1.4.0",
209
+ "path-is-absolute": "1.0.1"
210
+ }
211
+ },
212
+ "glob-parent": {
213
+ "version": "2.0.0",
214
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
215
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
216
+ "dev": true,
217
+ "requires": {
218
+ "is-glob": "2.0.1"
219
+ }
220
+ },
221
+ "global-modules": {
222
+ "version": "0.2.3",
223
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
224
+ "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=",
225
+ "dev": true,
226
+ "requires": {
227
+ "global-prefix": "0.1.5",
228
+ "is-windows": "0.2.0"
229
+ }
230
+ },
231
+ "global-prefix": {
232
+ "version": "0.1.5",
233
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
234
+ "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=",
235
+ "dev": true,
236
+ "requires": {
237
+ "homedir-polyfill": "1.0.1",
238
+ "ini": "1.3.5",
239
+ "is-windows": "0.2.0",
240
+ "which": "1.3.1"
241
+ }
242
+ },
243
+ "graceful-fs": {
244
+ "version": "4.1.11",
245
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
246
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
247
+ "dev": true
248
+ },
249
+ "has-glob": {
250
+ "version": "0.1.1",
251
+ "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-0.1.1.tgz",
252
+ "integrity": "sha1-omHEwqbGZ+DHe3AKfyl8Oe86pYk=",
253
+ "dev": true,
254
+ "requires": {
255
+ "is-glob": "2.0.1"
256
+ }
257
+ },
258
+ "homedir-polyfill": {
259
+ "version": "1.0.1",
260
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
261
+ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
262
+ "dev": true,
263
+ "requires": {
264
+ "parse-passwd": "1.0.0"
265
+ }
266
+ },
267
+ "iconv-lite": {
268
+ "version": "0.4.23",
269
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
270
+ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
271
+ "dev": true,
272
+ "requires": {
273
+ "safer-buffer": "2.1.2"
274
+ }
275
+ },
276
+ "inflight": {
277
+ "version": "1.0.6",
278
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
279
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
280
+ "dev": true,
281
+ "requires": {
282
+ "once": "1.4.0",
283
+ "wrappy": "1.0.2"
284
+ }
285
+ },
286
+ "inherits": {
287
+ "version": "2.0.3",
288
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
289
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
290
+ "dev": true
291
+ },
292
+ "ini": {
293
+ "version": "1.3.5",
294
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
295
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
296
+ "dev": true
297
+ },
298
+ "is-absolute": {
299
+ "version": "0.2.6",
300
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz",
301
+ "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=",
302
+ "dev": true,
303
+ "requires": {
304
+ "is-relative": "0.2.1",
305
+ "is-windows": "0.2.0"
306
+ }
307
+ },
308
+ "is-accessor-descriptor": {
309
+ "version": "0.1.6",
310
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
311
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
312
+ "dev": true,
313
+ "requires": {
314
+ "kind-of": "3.2.2"
315
+ },
316
+ "dependencies": {
317
+ "kind-of": {
318
+ "version": "3.2.2",
319
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
320
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
321
+ "dev": true,
322
+ "requires": {
323
+ "is-buffer": "1.1.6"
324
+ }
325
+ }
326
+ }
327
+ },
328
+ "is-buffer": {
329
+ "version": "1.1.6",
330
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
331
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
332
+ "dev": true
333
+ },
334
+ "is-data-descriptor": {
335
+ "version": "0.1.4",
336
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
337
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
338
+ "dev": true,
339
+ "requires": {
340
+ "kind-of": "3.2.2"
341
+ },
342
+ "dependencies": {
343
+ "kind-of": {
344
+ "version": "3.2.2",
345
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
346
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
347
+ "dev": true,
348
+ "requires": {
349
+ "is-buffer": "1.1.6"
350
+ }
351
+ }
352
+ }
353
+ },
354
+ "is-descriptor": {
355
+ "version": "0.1.6",
356
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
357
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
358
+ "dev": true,
359
+ "requires": {
360
+ "is-accessor-descriptor": "0.1.6",
361
+ "is-data-descriptor": "0.1.4",
362
+ "kind-of": "5.1.0"
363
+ }
364
+ },
365
+ "is-extendable": {
366
+ "version": "0.1.1",
367
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
368
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
369
+ "dev": true
370
+ },
371
+ "is-extglob": {
372
+ "version": "1.0.0",
373
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
374
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
375
+ "dev": true
376
+ },
377
+ "is-glob": {
378
+ "version": "2.0.1",
379
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
380
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
381
+ "dev": true,
382
+ "requires": {
383
+ "is-extglob": "1.0.0"
384
+ }
385
+ },
386
+ "is-relative": {
387
+ "version": "0.2.1",
388
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz",
389
+ "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=",
390
+ "dev": true,
391
+ "requires": {
392
+ "is-unc-path": "0.1.2"
393
+ }
394
+ },
395
+ "is-unc-path": {
396
+ "version": "0.1.2",
397
+ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz",
398
+ "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=",
399
+ "dev": true,
400
+ "requires": {
401
+ "unc-path-regex": "0.1.2"
402
+ }
403
+ },
404
+ "is-utf8": {
405
+ "version": "0.2.1",
406
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
407
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
408
+ "dev": true
409
+ },
410
+ "is-valid-glob": {
411
+ "version": "0.3.0",
412
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
413
+ "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=",
414
+ "dev": true
415
+ },
416
+ "is-windows": {
417
+ "version": "0.2.0",
418
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
419
+ "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=",
420
+ "dev": true
421
+ },
422
+ "isarray": {
423
+ "version": "1.0.0",
424
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
425
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
426
+ "dev": true
427
+ },
428
+ "isexe": {
429
+ "version": "2.0.0",
430
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
431
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
432
+ "dev": true
433
+ },
434
+ "isobject": {
435
+ "version": "2.1.0",
436
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
437
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
438
+ "dev": true,
439
+ "requires": {
440
+ "isarray": "1.0.0"
441
+ }
442
+ },
443
+ "kind-of": {
444
+ "version": "5.1.0",
445
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
446
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
447
+ "dev": true
448
+ },
449
+ "lazy-cache": {
450
+ "version": "2.0.2",
451
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
452
+ "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
453
+ "dev": true,
454
+ "requires": {
455
+ "set-getter": "0.1.0"
456
+ }
457
+ },
458
+ "lodash": {
459
+ "version": "4.17.10",
460
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
461
+ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
462
+ "dev": true
463
+ },
464
+ "log-ok": {
465
+ "version": "0.1.1",
466
+ "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz",
467
+ "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=",
468
+ "dev": true,
469
+ "requires": {
470
+ "ansi-green": "0.1.1",
471
+ "success-symbol": "0.1.0"
472
+ }
473
+ },
474
+ "matched": {
475
+ "version": "0.4.4",
476
+ "resolved": "https://registry.npmjs.org/matched/-/matched-0.4.4.tgz",
477
+ "integrity": "sha1-Vte36xgDPwz5vFLrIJD6x9weifo=",
478
+ "dev": true,
479
+ "requires": {
480
+ "arr-union": "3.1.0",
481
+ "async-array-reduce": "0.2.1",
482
+ "extend-shallow": "2.0.1",
483
+ "fs-exists-sync": "0.1.0",
484
+ "glob": "7.1.2",
485
+ "has-glob": "0.1.1",
486
+ "is-valid-glob": "0.3.0",
487
+ "lazy-cache": "2.0.2",
488
+ "resolve-dir": "0.1.1"
489
+ }
490
+ },
491
+ "minimatch": {
492
+ "version": "3.0.4",
493
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
494
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
495
+ "dev": true,
496
+ "requires": {
497
+ "brace-expansion": "1.1.11"
498
+ }
499
+ },
500
+ "minimist": {
501
+ "version": "0.0.8",
502
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
503
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
504
+ "dev": true
505
+ },
506
+ "mkdirp": {
507
+ "version": "0.5.1",
508
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
509
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
510
+ "dev": true,
511
+ "requires": {
512
+ "minimist": "0.0.8"
513
+ }
514
+ },
515
+ "node-wp-i18n": {
516
+ "version": "1.1.1",
517
+ "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.1.1.tgz",
518
+ "integrity": "sha512-SI3+vhddQDBh2pkOowqPdXs/YN/bRnNvR4gDmcSJaQ4P+z8jSuPRZTFFClaD/fVv0AG0zY/ku07oQuayr844Mg==",
519
+ "dev": true,
520
+ "requires": {
521
+ "bluebird": "3.5.1",
522
+ "gettext-parser": "1.3.1",
523
+ "glob": "7.1.2",
524
+ "lodash": "4.17.10",
525
+ "minimist": "1.2.0",
526
+ "mkdirp": "0.5.1",
527
+ "tmp": "0.0.33"
528
+ },
529
+ "dependencies": {
530
+ "minimist": {
531
+ "version": "1.2.0",
532
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
533
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
534
+ "dev": true
535
+ }
536
+ }
537
+ },
538
+ "once": {
539
+ "version": "1.4.0",
540
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
541
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
542
+ "dev": true,
543
+ "requires": {
544
+ "wrappy": "1.0.2"
545
+ }
546
+ },
547
+ "os-homedir": {
548
+ "version": "1.0.2",
549
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
550
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
551
+ "dev": true
552
+ },
553
+ "os-tmpdir": {
554
+ "version": "1.0.2",
555
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
556
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
557
+ "dev": true
558
+ },
559
+ "parse-passwd": {
560
+ "version": "1.0.0",
561
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
562
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
563
+ "dev": true
564
+ },
565
+ "path-is-absolute": {
566
+ "version": "1.0.1",
567
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
568
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
569
+ "dev": true
570
+ },
571
+ "process-nextick-args": {
572
+ "version": "2.0.0",
573
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
574
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
575
+ "dev": true
576
+ },
577
+ "readable-stream": {
578
+ "version": "2.3.6",
579
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
580
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
581
+ "dev": true,
582
+ "requires": {
583
+ "core-util-is": "1.0.2",
584
+ "inherits": "2.0.3",
585
+ "isarray": "1.0.0",
586
+ "process-nextick-args": "2.0.0",
587
+ "safe-buffer": "5.1.2",
588
+ "string_decoder": "1.1.1",
589
+ "util-deprecate": "1.0.2"
590
+ }
591
+ },
592
+ "replace-ext": {
593
+ "version": "0.0.1",
594
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
595
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
596
+ "dev": true
597
+ },
598
+ "resolve-dir": {
599
+ "version": "0.1.1",
600
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
601
+ "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=",
602
+ "dev": true,
603
+ "requires": {
604
+ "expand-tilde": "1.2.2",
605
+ "global-modules": "0.2.3"
606
+ }
607
+ },
608
+ "rimraf": {
609
+ "version": "2.6.2",
610
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
611
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
612
+ "dev": true,
613
+ "requires": {
614
+ "glob": "7.1.2"
615
+ }
616
+ },
617
+ "safe-buffer": {
618
+ "version": "5.1.2",
619
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
620
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
621
+ "dev": true
622
+ },
623
+ "safer-buffer": {
624
+ "version": "2.1.2",
625
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
626
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
627
+ "dev": true
628
+ },
629
+ "set-getter": {
630
+ "version": "0.1.0",
631
+ "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
632
+ "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
633
+ "dev": true,
634
+ "requires": {
635
+ "to-object-path": "0.3.0"
636
+ }
637
+ },
638
+ "string_decoder": {
639
+ "version": "1.1.1",
640
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
641
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
642
+ "dev": true,
643
+ "requires": {
644
+ "safe-buffer": "5.1.2"
645
+ }
646
+ },
647
+ "strip-bom-buffer": {
648
+ "version": "0.1.1",
649
+ "resolved": "https://registry.npmjs.org/strip-bom-buffer/-/strip-bom-buffer-0.1.1.tgz",
650
+ "integrity": "sha1-yj3cSRnBP5/d8wsd/xAKmDUki00=",
651
+ "dev": true,
652
+ "requires": {
653
+ "is-buffer": "1.1.6",
654
+ "is-utf8": "0.2.1"
655
+ }
656
+ },
657
+ "strip-bom-string": {
658
+ "version": "0.1.2",
659
+ "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-0.1.2.tgz",
660
+ "integrity": "sha1-nG5yCjE7qYNliVGEBcz7iKX0G5w=",
661
+ "dev": true
662
+ },
663
+ "success-symbol": {
664
+ "version": "0.1.0",
665
+ "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz",
666
+ "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc=",
667
+ "dev": true
668
+ },
669
+ "through2": {
670
+ "version": "2.0.3",
671
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
672
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
673
+ "dev": true,
674
+ "requires": {
675
+ "readable-stream": "2.3.6",
676
+ "xtend": "4.0.1"
677
+ }
678
+ },
679
+ "tmp": {
680
+ "version": "0.0.33",
681
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
682
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
683
+ "dev": true,
684
+ "requires": {
685
+ "os-tmpdir": "1.0.2"
686
+ }
687
+ },
688
+ "to-file": {
689
+ "version": "0.2.0",
690
+ "resolved": "https://registry.npmjs.org/to-file/-/to-file-0.2.0.tgz",
691
+ "integrity": "sha1-I2xsCIBl5XDe+9Fc9LTlZb5G6pM=",
692
+ "dev": true,
693
+ "requires": {
694
+ "define-property": "0.2.5",
695
+ "extend-shallow": "2.0.1",
696
+ "file-contents": "0.2.4",
697
+ "glob-parent": "2.0.0",
698
+ "is-valid-glob": "0.3.0",
699
+ "isobject": "2.1.0",
700
+ "lazy-cache": "2.0.2",
701
+ "vinyl": "1.2.0"
702
+ },
703
+ "dependencies": {
704
+ "file-contents": {
705
+ "version": "0.2.4",
706
+ "resolved": "https://registry.npmjs.org/file-contents/-/file-contents-0.2.4.tgz",
707
+ "integrity": "sha1-BQb3uO/2KvpFrkXaTfnp1H30U8s=",
708
+ "dev": true,
709
+ "requires": {
710
+ "extend-shallow": "2.0.1",
711
+ "file-stat": "0.1.3",
712
+ "graceful-fs": "4.1.11",
713
+ "is-buffer": "1.1.6",
714
+ "is-utf8": "0.2.1",
715
+ "lazy-cache": "0.2.7",
716
+ "through2": "2.0.3"
717
+ },
718
+ "dependencies": {
719
+ "lazy-cache": {
720
+ "version": "0.2.7",
721
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
722
+ "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=",
723
+ "dev": true
724
+ }
725
+ }
726
+ },
727
+ "file-stat": {
728
+ "version": "0.1.3",
729
+ "resolved": "https://registry.npmjs.org/file-stat/-/file-stat-0.1.3.tgz",
730
+ "integrity": "sha1-0PGWHX0QcykoEgpuaVVHHCpbVBE=",
731
+ "dev": true,
732
+ "requires": {
733
+ "graceful-fs": "4.1.11",
734
+ "lazy-cache": "0.2.7",
735
+ "through2": "2.0.3"
736
+ },
737
+ "dependencies": {
738
+ "lazy-cache": {
739
+ "version": "0.2.7",
740
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
741
+ "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=",
742
+ "dev": true
743
+ }
744
+ }
745
+ }
746
+ }
747
+ },
748
+ "to-object-path": {
749
+ "version": "0.3.0",
750
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
751
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
752
+ "dev": true,
753
+ "requires": {
754
+ "kind-of": "3.2.2"
755
+ },
756
+ "dependencies": {
757
+ "kind-of": {
758
+ "version": "3.2.2",
759
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
760
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
761
+ "dev": true,
762
+ "requires": {
763
+ "is-buffer": "1.1.6"
764
+ }
765
+ }
766
+ }
767
+ },
768
+ "unc-path-regex": {
769
+ "version": "0.1.2",
770
+ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
771
+ "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
772
+ "dev": true
773
+ },
774
+ "util-deprecate": {
775
+ "version": "1.0.2",
776
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
777
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
778
+ "dev": true
779
+ },
780
+ "vinyl": {
781
+ "version": "1.2.0",
782
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
783
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
784
+ "dev": true,
785
+ "requires": {
786
+ "clone": "1.0.4",
787
+ "clone-stats": "0.0.1",
788
+ "replace-ext": "0.0.1"
789
+ }
790
+ },
791
+ "which": {
792
+ "version": "1.3.1",
793
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
794
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
795
+ "dev": true,
796
+ "requires": {
797
+ "isexe": "2.0.0"
798
+ }
799
+ },
800
+ "wrappy": {
801
+ "version": "1.0.2",
802
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
803
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
804
+ "dev": true
805
+ },
806
+ "xtend": {
807
+ "version": "4.0.1",
808
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
809
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
810
+ "dev": true
811
+ }
812
+ }
813
+ }
addons/members-privacy-caps/package.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-privacy-caps",
3
+ "version": "1.0.0",
4
+ "description": "Creates additional capabilities for control over WordPress' privacy and personal data features.",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "build:i18n": "node resources/build/i18n.js",
8
+ "build:dist": "node resources/build/dist.js"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/justintadlock/members-privacy-caps.git"
13
+ },
14
+ "keywords": [
15
+ "wordpress"
16
+ ],
17
+ "author": "Justin Tadlock",
18
+ "license": "GPL-2.0+",
19
+ "bugs": {
20
+ "url": "https://github.com/justintadlock/members-privacy-caps/issues"
21
+ },
22
+ "homepage": "https://github.com/justintadlock/members-privacy-caps#readme",
23
+ "devDependencies": {
24
+ "copy": "^0.3.1",
25
+ "node-wp-i18n": "^1.0.5",
26
+ "rimraf": "^2.6.2"
27
+ },
28
+ "dependencies": {}
29
+ }
addons/members-privacy-caps/readme.md ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Members - Privacy Caps
2
+
3
+ Members - Privacy Caps is an add-on for the [Members plugin](https://themehybrid.com/plugins/members) that creates additional capabilities related to the privacy and personal data features added in WordPress 4.9.6. For some people, these are known as the GDPR tools.
4
+
5
+ _Please note that this is a commercial plugin. It is public here on GitHub so that anyone can contribute to its development or easily post bugs. If using on a live site, please [purchase a copy of the plugin](https://themehybrid.com/plugins/members-privacy-caps)._
6
+
7
+ ## Professional Support
8
+
9
+ If you need professional plugin support from me, the plugin author, you can access the support forums at [Theme Hybrid](https://themehybrid.com/board/topics), which is a professional WordPress help/support site where I handle support for all my plugins and themes for a community of 75,000+ users (and growing).
10
+
11
+ ## Copyright and License
12
+
13
+ This project is licensed under the [GNU GPL](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html), version 2 or later.
14
+
15
+ 2018 &copy; [Justin Tadlock](http://justintadlock.com).
16
+
17
+ ## Documentation
18
+
19
+ The use of this plugin is fairly straightforward. You must have the [Members plugin](https://themehybrid.com/plugins/members) installed and activated to use this plugin.
20
+
21
+ You should also have, at minimum, PHP 5.6 installed on your server. If you're unsure of your PHP version, you can install the [Display PHP Version](https://wordpress.org/plugins/display-php-version/) plugin to check.
22
+
23
+ ### Usage
24
+
25
+ The plugin adds the following capabilities to the "General" tab on the edit role screen:
26
+
27
+ * **Manage Privacy Options** (`manage_privacy_options`) - Allows you to manage the site or network's privacy options, including the privacy page.
28
+
29
+ The plugin adds the following capabilities to the "Users" tab on the edit role screen:
30
+
31
+ * **Export Others' Personal Data** (`export_others_personal_data`) - Allows you to export personal data for users other than your own.
32
+ * **Erase Others' Personal Data** (`erase_others_personal_data`) - Allows you to erase personal data for users other than your own.
33
+
34
+ These capabilities are granted to the `administrator` role upon plugin activation. They can be granted to additional roles via the edit role screen just like you'd do with any other capabilities using the Members plugin.
35
+
36
+ ### Managing privacy options
37
+
38
+ Currently, there's a bug in WordPress ([Trac ticket](https://core.trac.wordpress.org/ticket/22895)) that won't allow users without `manage_options` to see sub-menu items of "Settings" in the admin, even if the user has permission to do so. There's nothing this plugin can do to address this. Therefore, if you have the `manage_privacy_options` but not the `manage_options` capability, you won't be able to access the Settings > Privacy page in the admin.
39
+
40
+ However, you will be able to edit the Privacy Policy page if one has been set for the site under the "Pages" screen in the admin. Of course, you'll need the appropriate page-editing capabilities for editing the page.
41
+
42
+ A good use case for this is to give Editors (or a similar role) the `manage_privacy_options` cap to allow them to actually make copyediting changes to the page.
43
+
44
+ ### Erasing personal data
45
+
46
+ The `erase_others_personal_data` capability must be used in conjunction with the `delete_users` capability. This is how core WP is set up. It makes sense when you think about it. Users shouldn't be able to erase others' data without high enough permission to actually delete the actual user account.
47
+
48
+ ### Multisite
49
+
50
+ If you're on a multisite setup, the new capabilities (see above) are not automatically added to administrators on each sub-site. This is because WordPress, by default, considers the privacy and personal data features a "super admin" privilege. You may assign these capabilities to administrators or other roles on a per-site basis if you feel like your administrators should have these permissions.
addons/members-privacy-caps/resources/build/dist.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const copy = require( 'copy' );
2
+ const rimraf = require( 'rimraf' );
3
+
4
+ var dest = 'dist';
5
+
6
+ var src = [
7
+ '**',
8
+ '!_assets/',
9
+ '!_assets/**',
10
+ '!node_modules/',
11
+ '!node_modules/**',
12
+ '!resources/build/',
13
+ '!resources/build/**',
14
+ '!package.json',
15
+ '!package-lock.json'
16
+ ];
17
+
18
+ function distribute() {
19
+
20
+ copy( src, dest, function() {} );
21
+ }
22
+
23
+ rimraf( dest, distribute );
addons/members-privacy-caps/resources/build/i18n.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ const wpi18n = require( 'node-wp-i18n' );
2
+
3
+ wpi18n.makepot();
addons/members-role-hierarchy/addon.php ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Singleton class for setting up the plugin.
5
+ *
6
+ * @since 1.0.0
7
+ * @access public
8
+ */
9
+ final class Members_Role_Hierarchy_Plugin {
10
+
11
+ /**
12
+ * Plugin directory path.
13
+ *
14
+ * @since 1.0.0
15
+ * @access public
16
+ * @var string
17
+ */
18
+ public $dir = '';
19
+
20
+ /**
21
+ * Plugin directory URI.
22
+ *
23
+ * @since 1.0.0
24
+ * @access public
25
+ * @var string
26
+ */
27
+ public $uri = '';
28
+
29
+ /**
30
+ * Returns the instance.
31
+ *
32
+ * @since 1.0.0
33
+ * @access public
34
+ * @return object
35
+ */
36
+ public static function get_instance() {
37
+
38
+ static $instance = null;
39
+
40
+ if ( is_null( $instance ) ) {
41
+ $instance = new self;
42
+ $instance->setup();
43
+ $instance->includes();
44
+ $instance->setup_actions();
45
+ }
46
+
47
+ return $instance;
48
+ }
49
+
50
+ /**
51
+ * Constructor method.
52
+ *
53
+ * @since 1.0.0
54
+ * @access private
55
+ * @return void
56
+ */
57
+ private function __construct() {}
58
+
59
+ /**
60
+ * Magic method to output a string if trying to use the object as a string.
61
+ *
62
+ * @since 1.0.0
63
+ * @access public
64
+ * @return void
65
+ */
66
+ public function __toString() {
67
+ return 'members-role-hierarchy';
68
+ }
69
+
70
+ /**
71
+ * Sets up globals.
72
+ *
73
+ * @since 1.0.0
74
+ * @access public
75
+ * @return void
76
+ */
77
+ private function setup() {
78
+
79
+ // Main plugin directory path and URI.
80
+ $this->dir = trailingslashit( plugin_dir_path( __FILE__ ) );
81
+ $this->uri = trailingslashit( plugin_dir_url( __FILE__ ) );
82
+ }
83
+
84
+ /**
85
+ * Loads files needed by the plugin.
86
+ *
87
+ * @since 1.0.0
88
+ * @access public
89
+ * @return void
90
+ */
91
+ private function includes() {
92
+
93
+ // Load function files.
94
+ require_once( $this->dir . 'inc/functions-filters.php' );
95
+ require_once( $this->dir . 'inc/functions-options.php' );
96
+ require_once( $this->dir . 'inc/functions-position.php' );
97
+
98
+ // Load admin files.
99
+ if ( is_admin() ) {
100
+
101
+ require_once( $this->dir . 'admin/functions-settings.php' );
102
+ require_once( $this->dir . 'admin/class-edit-role.php' );
103
+ require_once( $this->dir . 'admin/class-manage-roles.php' );
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Sets up main plugin actions and filters.
109
+ *
110
+ * @since 1.0.0
111
+ * @access public
112
+ * @return void
113
+ */
114
+ private function setup_actions() {}
115
+ }
116
+
117
+ Members_Role_Hierarchy_Plugin::get_instance();
addons/members-role-hierarchy/admin/class-edit-role.php ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Adds the role position meta box on the edit/new role screen and handles the save
4
+ * callback functionality.
5
+ *
6
+ * @package MembersRoleHierarchy
7
+ * @author Justin Tadlock <justin@justintadlock.com>
8
+ * @copyright Copyright (c) 2017, Justin Tadlock
9
+ * @link http://themehybrid.com/plugins/members-role-hierarchy
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ /**
14
+ * Edit role class.
15
+ *
16
+ * @since 1.0.0
17
+ * @access public
18
+ */
19
+ final class MRH_Edit_Role {
20
+
21
+ /**
22
+ * Returns the instance.
23
+ *
24
+ * @since 1.0.0
25
+ * @access public
26
+ * @return object
27
+ */
28
+ public static function get_instance() {
29
+
30
+ static $instance = null;
31
+
32
+ if ( is_null( $instance ) ) {
33
+ $instance = new self;
34
+ $instance->setup_actions();
35
+ }
36
+
37
+ return $instance;
38
+ }
39
+
40
+ /**
41
+ * Constructor method.
42
+ *
43
+ * @since 1.0.0
44
+ * @access private
45
+ * @return void
46
+ */
47
+ private function __construct() {}
48
+
49
+ /**
50
+ * Sets up actions and filters.
51
+ *
52
+ * @since 1.0.0
53
+ * @access public
54
+ * @return void
55
+ */
56
+ private function setup_actions() {
57
+
58
+ // Call when screen is loaded.
59
+ add_action( 'members_load_role_edit', array( $this, 'load' ) );
60
+ add_action( 'members_load_role_new', array( $this, 'load' ) );
61
+
62
+ // Save role position.
63
+ add_action( 'members_role_updated', array( $this, 'save' ) );
64
+ add_action( 'members_role_added', array( $this, 'save' ) );
65
+ }
66
+
67
+ /**
68
+ * Runs on the role new/edit screen load.
69
+ *
70
+ * @since 1.0.0
71
+ * @access public
72
+ * @return void
73
+ */
74
+ public function load() {
75
+
76
+ add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
77
+ }
78
+
79
+ /**
80
+ * Adds custom meta boxes to the edit role screen.
81
+ *
82
+ * @since 1.0.0
83
+ * @access public
84
+ * @param string $screen_id
85
+ * @param string $role
86
+ * @return void
87
+ */
88
+ public function add_meta_boxes( $screen_id, $role = '' ) {
89
+
90
+ // If role isn't editable, bail.
91
+ if ( $role && ! members_is_role_editable( $role ) )
92
+ return;
93
+
94
+ // Add the meta box.
95
+ add_meta_box(
96
+ 'mrh_role_position',
97
+ esc_html__( 'Role Position', 'members' ),
98
+ array( $this, 'meta_box' ),
99
+ $screen_id,
100
+ 'side',
101
+ 'default'
102
+ );
103
+ }
104
+
105
+ /**
106
+ * Outputs the role position meta box.
107
+ *
108
+ * @since 1.0.0
109
+ * @access public
110
+ * @param object $role
111
+ * @return void
112
+ */
113
+ public function meta_box( $role ) {
114
+
115
+ $position = $role ? mrh_get_role_position( $role->name ) : mrh_get_default_role_position();
116
+
117
+ wp_nonce_field( 'role_position', 'mrh_role_position_nonce' ); ?>
118
+
119
+ <label>
120
+ <input type="number" name="mrh_role_position" value="<?php echo esc_attr( $position ); ?>" />
121
+ </label>
122
+
123
+ <p class="description">
124
+ <?php esc_html_e( "Set the role's position in the hierarchy.", 'members' ); ?>
125
+ </p>
126
+ <?php }
127
+
128
+ /**
129
+ * Saves the role position.
130
+ *
131
+ * @since 1.0.0
132
+ * @access public
133
+ * @param string $role
134
+ * @return void
135
+ */
136
+ public function save( $role ) {
137
+
138
+ // Verify the nonce before proceeding.
139
+ if ( ! isset( $_POST['mrh_role_position_nonce'] ) || ! wp_verify_nonce( $_POST['mrh_role_position_nonce'], 'role_position' ) ) {
140
+ return;
141
+ }
142
+
143
+ // Get the current role to edit.
144
+ $role = members_sanitize_role( $role );
145
+
146
+ // If the role doesn't exist, bail.
147
+ if ( ! $role )
148
+ return;
149
+
150
+ // Get the posted position.
151
+ $new_position = isset( $_POST['mrh_role_position'] ) ? intval( $_POST['mrh_role_position'] ) : 0;
152
+
153
+ // Get the role's current position.
154
+ $old_position = mrh_get_role_position( $role );
155
+
156
+ // If the posted position doesn't matche the old position, update it.
157
+ if ( $new_position != $old_position )
158
+ mrh_set_role_position( $role, $new_position );
159
+ }
160
+ }
161
+
162
+ MRH_Edit_Role::get_instance();
addons/members-role-hierarchy/admin/class-manage-roles.php ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class for handling extras on the Manage Roles screen.
4
+ *
5
+ * @package MembersRoleHierarchy
6
+ * @author Justin Tadlock <justin@justintadlock.com>
7
+ * @copyright Copyright (c) 2017, Justin Tadlock
8
+ * @link http://themehybrid.com/plugins/members-role-hierarchy
9
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10
+ */
11
+
12
+ /**
13
+ * Role management class.
14
+ *
15
+ * @since 1.0.0
16
+ * @access public
17
+ */
18
+ final class MRH_Manage_Roles {
19
+
20
+ /**
21
+ * Returns the instance.
22
+ *
23
+ * @since 1.0.0
24
+ * @access public
25
+ * @return object
26
+ */
27
+ public static function get_instance() {
28
+
29
+ static $instance = null;
30
+
31
+ if ( is_null( $instance ) ) {
32
+ $instance = new self;
33
+ $instance->setup_actions();
34
+ }
35
+
36
+ return $instance;
37
+ }
38
+
39
+ /**
40
+ * Sets up our initial actions.
41
+ *
42
+ * @since 1.0.0
43
+ * @access public
44
+ * @return void
45
+ */
46
+ private function __construct() {}
47
+
48
+ /**
49
+ * Sets up actions and filters.
50
+ *
51
+ * @since 1.0.0
52
+ * @access public
53
+ * @return void
54
+ */
55
+ private function setup_actions() {
56
+
57
+ add_action( 'members_load_manage_roles', array( $this, 'load' ) );
58
+ }
59
+
60
+ /**
61
+ * Runs on the manage roles screen load.
62
+ *
63
+ * @since 1.0.0
64
+ * @access public
65
+ * @return void
66
+ */
67
+ public function load() {
68
+
69
+ add_filter( 'members_manage_roles_columns', array( $this, 'columns' ) );
70
+
71
+ add_filter( 'members_manage_roles_column_position', array( $this, 'column_position' ), 10, 2 );
72
+
73
+ add_action( 'admin_head', array( $this, 'print_styles' ) );
74
+ }
75
+
76
+ /**
77
+ * Adds custom columns.
78
+ *
79
+ * @since 1.0.0
80
+ * @access public
81
+ * @param array $columns
82
+ * @return array
83
+ */
84
+ public function columns( $columns ) {
85
+
86
+ $columns['position'] = esc_html__( 'Position', 'members' );
87
+
88
+ return $columns;
89
+ }
90
+
91
+ /**
92
+ * Handles the output for custom "position" column.
93
+ *
94
+ * @since 1.0.0
95
+ * @access public
96
+ * @param string $output
97
+ * @param string $role
98
+ * @return string
99
+ */
100
+ public function column_position( $output, $role ) {
101
+
102
+ return mrh_get_role_position( $role );
103
+ }
104
+
105
+ /**
106
+ * Prints custom styles to the header.
107
+ *
108
+ * @since 1.0.0
109
+ * @access public
110
+ * @return void
111
+ */
112
+ public function print_styles() { ?>
113
+
114
+ <style type="text/css">
115
+ @media only screen and ( min-width: 783px ) {
116
+ .members_page_roles .column-position {
117
+ width: 100px;
118
+ text-align: center;
119
+ }
120
+ }
121
+ </style>
122
+ <?php }
123
+ }
124
+
125
+ MRH_Manage_Roles::get_instance();
addons/members-role-hierarchy/admin/functions-settings.php ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Functions and filters related to plugin settings in the admin.
4
+ *
5
+ * @package MembersRoleHierarchy
6
+ * @author Justin Tadlock <justin@justintadlock.com>
7
+ * @copyright Copyright (c) 2017, Justin Tadlock
8
+ * @link http://themehybrid.com/plugins/members-role-hierarchy
9
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10
+ */
11
+
12
+ # Register settings on `admin_init`.
13
+ add_action( 'admin_init', 'mrh_register_settings', 15 );
14
+
15
+ /**
16
+ * Registers plugin settings and adds custom settings fields to the Members Settings
17
+ * screen in the admin.
18
+ *
19
+ * @since 1.0.0
20
+ * @access public
21
+ * @return void
22
+ */
23
+ function mrh_register_settings() {
24
+
25
+ // Register our plugin setting to the `members_settings` group (defined in Members plugin).
26
+ register_setting( 'members_settings', 'mrh_plugin_settings', 'mrh_validate_settings' );
27
+
28
+ // Adds the Role Hierarchy setting field.
29
+ add_settings_field(
30
+ 'mrh_role_hierarchy',
31
+ esc_html__( 'Role Hierarchy', 'members' ),
32
+ 'mrh_settings_field_hierarchy',
33
+ 'admin_page_members-settings',
34
+ 'roles_caps'
35
+ );
36
+ }
37
+
38
+ /**
39
+ * Callback function for validating plugin settings.
40
+ *
41
+ * @since 1.0.0
42
+ * @access public
43
+ * @param array $settings
44
+ * @return array
45
+ */
46
+ function mrh_validate_settings( $settings ) {
47
+
48
+ $allowed = array( '>', '>=' );
49
+
50
+ $settings['comparison_operator'] = isset( $settings['comparison_operater'] ) && in_array( $settings['comparison_operater'], $allowed ) ? $settings['comparison_operater'] : '>';
51
+
52
+ return $settings;
53
+ }
54
+
55
+ /**
56
+ * Outputs the hierarchy settings field.
57
+ *
58
+ * @since 1.0.0
59
+ * @access public
60
+ * @return void
61
+ */
62
+ function mrh_settings_field_hierarchy() {
63
+
64
+ $exceptions = array();
65
+
66
+ foreach ( mrh_get_highest_roles() as $role )
67
+ $exceptions[] = "<code>{$role}</code>"; ?>
68
+
69
+ <p class="description">
70
+ <?php esc_html_e( 'Should users manage users/roles that are "lower" or "lower or equal" to their own role?', 'members' ); ?>
71
+ </p>
72
+
73
+ <ul>
74
+ <li>
75
+ <label>
76
+ <input type="radio" name="members_settings[comparison_operator]" value=">" <?php checked( '>', mrh_get_comparison_operator() ); ?> />
77
+ <?php printf(
78
+ __( 'Lower. <em>Exceptions are the following roles:</em> %s.', 'members' ),
79
+ join( ', ', $exceptions )
80
+ ); ?>
81
+ </label>
82
+ </li>
83
+ <li>
84
+ <label>
85
+ <input type="radio" name="members_settings[comparison_operator]" value=">=" <?php checked( '>=', mrh_get_comparison_operator() ); ?> />
86
+ <?php esc_html_e( 'Lower or equal.', 'members' ); ?>
87
+ </label>
88
+ </li>
89
+ </ul>
90
+ <?php }
addons/members-role-hierarchy/changelog.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ # Change Log
2
+
3
+ ## [1.0.0] - 2017-02-03
4
+
5
+ ### Added
6
+
7
+ * Plugin launch. Everything's new!
addons/members-role-hierarchy/contributing.md ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contributing
2
+
3
+ The code for the project is handled via its [GitHub Repository](https://github.com/justintadlock/members-role-hierarchy). You can open tickets, create patches, and send pull requests there.
4
+
5
+ ## Pull requests
6
+
7
+ Problem first. Solution second.
8
+
9
+ Pull requests should have a ticket open for discussion first. I rarely accept pull requests that aren't for a specific issue for various reasons. It's far better to post an issue and let me or the community provide feedback prior to creating a pull request.
10
+
11
+ Please don't make pull requests against the `master` branch. This is the latest, stable code. You can make a pull request against one of the point branches or the `dev` (future release) branch.
12
+
13
+ ## Coding standards
14
+
15
+ In general, the project follows all WordPress [coding standards](https://make.wordpress.org/core/handbook/best-practices/coding-standards). There are instances where it doesn't, opting for personal choices of my own, but in terms of contributing, following the WordPress standards is best practice.
16
+
17
+ ## Script and style files
18
+
19
+ The project consists of several script and style files. When making patches or pull requests with changes to these files, only do so to the primary file. Don't create patches for the minified (`.min`) versions of the files. Those will be minified after a patch is merged into the code base.
20
+
21
+ ## Language
22
+
23
+ All text strings follow U.S. English by default. While such guides are generally unneeded, in cases where style considerations are necessary, these will typically follow conventions laid out in *Elements of Style* or the *AP Stylebook*.
24
+
25
+ ## Licensing
26
+
27
+ Any code contributed to the project via patches, pull requests, or other means will be licensed under the [GPL version 2](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html) or later. By contributing code to the project, you provide consent to use such code under this license. The exception to this rule is when bringing in third-party code with an alternate open source license.
28
+
29
+ ## Versioning
30
+
31
+ The project uses [semantic versioning](http://semver.org). Version numbers will look like `3.2.1` where `3` is the "major" release, `2` is the minor release, and `1` is the patch release.
addons/members-role-hierarchy/inc/functions-filters.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Custom filters to make the plugin work.
4
+ *
5
+ * @package MembersRoleHierarchy
6
+ * @author Justin Tadlock <justin@justintadlock.com>
7
+ * @copyright Copyright (c) 2017, Justin Tadlock
8
+ * @link http://themehybrid.com/plugins/members-role-hierarchy
9
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10
+ */
11
+
12
+ # Filter the editable roles.
13
+ add_filter( 'editable_roles', 'mrh_editable_roles', 95 );
14
+
15
+ # Map meta capabilities.
16
+ add_filter( 'map_meta_cap', 'mrh_map_meta_cap', 95, 4 );
17
+
18
+ /**
19
+ * Filters the array of editable roles to remove any roles that are lower than the
20
+ * current user's highest role by role position.
21
+ *
22
+ * @since 1.0.0
23
+ * @access public
24
+ * @param array $editable
25
+ * @return array
26
+ */
27
+ function mrh_editable_roles( $editable ) {
28
+
29
+ // Gets the roles.
30
+ $roles = array_keys( $editable );
31
+
32
+ // Gets the user's highest role.
33
+ $user_role = mrh_get_user_highest_role( get_current_user_id() );
34
+
35
+ // Administrators are the exception to the operator. Admins can always edit any role.
36
+ $operator = in_array( $user_role, mrh_get_highest_roles() ) ? '>=' : mrh_get_comparison_operator();
37
+
38
+ // Loop through the roles and removes any that can't be edited for the current user.
39
+ foreach ( $roles as $edit_role ) {
40
+
41
+ if ( ! mrh_compare_role( $user_role, $edit_role, $operator ) )
42
+ unset( $editable[ $edit_role ] );
43
+ }
44
+
45
+ return $editable;
46
+ }
47
+
48
+ /**
49
+ * Filter on `map_meta_cap` that listens for user-related meta capabilities. If one is called,
50
+ * we make sure that the user's highest role is greater than the highest role of the user
51
+ * being promoted, edited, removed, deleted, etc.
52
+ *
53
+ * @since 1.0.0
54
+ * @access public
55
+ * @param array $caps
56
+ * @param string $cap
57
+ * @param int $user_id
58
+ * @param array $args
59
+ * @return array
60
+ */
61
+ function mrh_map_meta_cap( $caps, $cap, $user_id, $args ) {
62
+
63
+ // If not a user-related cap, bail.
64
+ if ( ! in_array( $cap, array( 'promote_user', 'edit_user', 'remove_user', 'delete_user' ) ) )
65
+ return $caps;
66
+
67
+ // If we have a user (it's the first argument of the array).
68
+ // Also, only proceed if the user is not attempting to edit themselves.
69
+ if ( isset( $args[ 0 ] ) && $user_id != $args[ 0 ] ) {
70
+
71
+ $user_role = mrh_get_user_highest_role( $user_id );
72
+ $edit_role = mrh_get_user_highest_role( $args[ 0 ] );
73
+
74
+ // Administrators are the exception to the operator. Admins can always edit other admins.
75
+ $operator = in_array( $user_role, mrh_get_highest_roles() ) ? '>=' : mrh_get_comparison_operator();
76
+
77
+ // If the current user cannot edit, don't allow.
78
+ if ( ! mrh_compare_role( $user_role, $edit_role, $operator ) )
79
+ $caps[] = 'do_not_allow';
80
+ }
81
+
82
+ return $caps;
83
+ }
addons/members-role-hierarchy/inc/functions-options.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Functions for handling plugin options.
4
+ *
5
+ * @package MembersRoleHierarchy
6
+ * @subpackage Includes
7
+ * @author Justin Tadlock <justin@justintadlock.com>
8
+ * @copyright Copyright (c) 2017, Justin Tadlock
9
+ * @link http://themehybrid.com/plugins/members-role-hierarchy
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ /**
14
+ * Returns the comparison operator to compare roles.
15
+ *
16
+ * @since 1.0.0
17
+ * @return string
18
+ */
19
+ function mrh_get_comparison_operator() {
20
+
21
+ $allowed = array( '>', '>=' );
22
+
23
+ $operator = apply_filters( 'mrh_get_comparison_operator', members_get_setting( 'comparison_operator' ) );
24
+
25
+ return in_array( $operator, $allowed ) ? $operator : '>';
26
+ }
27
+
28
+ /**
29
+ * Gets a setting from from the plugin settings in the database.
30
+ *
31
+ * @since 1.0.0
32
+ * @access public
33
+ * @return mixed
34
+ */
35
+ function mrh_get_setting( $option = '' ) {
36
+
37
+ $defaults = members_get_default_settings();
38
+
39
+ $settings = wp_parse_args( get_option( 'mrh_plugin_settings', $defaults ), $defaults );
40
+
41
+ return isset( $settings[ $option ] ) ? $settings[ $option ] : false;
42
+ }
43
+
44
+ /**
45
+ * Returns an array of the default plugin settings.
46
+ *
47
+ * @since 1.0.0
48
+ * @access public
49
+ * @return array
50
+ */
51
+ function mrh_get_default_settings() {
52
+
53
+ return array(
54
+ // @since 1.0.0
55
+ 'comparison_operator' => '>'
56
+ );
57
+ }
addons/members-role-hierarchy/inc/functions-position.php ADDED
@@ -0,0 +1,238 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Functions related to role positions. Role positions are how we determine a role's
4
+ * "position" in the hierarchy. The higher the position, the higher the role is in
5
+ * the hierarchy.
6
+ *
7
+ * @package MembersRoleHierarchy
8
+ * @author Justin Tadlock <justin@justintadlock.com>
9
+ * @copyright Copyright (c) 2017, Justin Tadlock
10
+ * @link http://themehybrid.com/plugins/members-role-hierarchy
11
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
12
+ */
13
+
14
+ /**
15
+ * Returns an array of role positions.
16
+ *
17
+ * @since 1.0.0
18
+ * @access public
19
+ * @return array
20
+ */
21
+ function mrh_get_role_positions() {
22
+
23
+ $defaults = mrh_get_default_role_positions();
24
+
25
+ $positions = get_option( 'members_role_hierarchy', $defaults );
26
+
27
+ return apply_filters( 'mrh_get_role_positions', wp_parse_args( $positions, $defaults ) );
28
+ }
29
+
30
+ /**
31
+ * Returns the default role positions. We're just setting defaults the core roles.
32
+ *
33
+ * @since 1.0.0
34
+ * @access public
35
+ * @return array
36
+ */
37
+ function mrh_get_default_role_positions() {
38
+
39
+ $defaults = array(
40
+ 'administrator' => 100,
41
+ 'editor' => 80,
42
+ 'author' => 60,
43
+ 'contributor' => 40,
44
+ 'subscriber' => 20
45
+ );
46
+
47
+ return apply_filters( 'mrh_get_default_role_positions', $defaults );
48
+ }
49
+
50
+ /**
51
+ * Returns a role's position in the hierarchy.
52
+ *
53
+ * @since 1.0.0
54
+ * @access public
55
+ * @param string $role
56
+ * @return int
57
+ */
58
+ function mrh_get_role_position( $role ) {
59
+
60
+ $positions = mrh_get_role_positions();
61
+
62
+ $position = isset( $positions[ $role ] ) ? $positions[ $role ] : mrh_get_default_role_position();
63
+
64
+ return apply_filters( 'mrh_get_role_position', $position, $role );
65
+ }
66
+
67
+ /**
68
+ * Returns the fallback role position when none is set for a particular role.
69
+ *
70
+ * @since 1.0.0
71
+ * @access public
72
+ * @return int
73
+ */
74
+ function mrh_get_default_role_position() {
75
+
76
+ return apply_filters( 'mrh_get_default_role_position', 0 );
77
+ }
78
+
79
+ /**
80
+ * Sets a role position.
81
+ *
82
+ * @since 1.0.0
83
+ * @access public
84
+ * @param string $role
85
+ * @param int $position
86
+ * @return bool
87
+ */
88
+ function mrh_set_role_position( $role, $position = 0 ) {
89
+
90
+ $positions = mrh_get_role_positions();
91
+
92
+ $positions[ $role ] = $position;
93
+
94
+ return update_option( 'members_role_hierarchy', $positions );
95
+ }
96
+
97
+ /**
98
+ * Function for comparing roles by their position.
99
+ *
100
+ * @since 1.0.0
101
+ * @access public
102
+ * @param int $role_a
103
+ * @param int $role_b
104
+ * @param string $operator
105
+ * @return bool
106
+ */
107
+ function mrh_compare_role( $role_a, $role_b, $operator = '==' ) {
108
+
109
+ $pos_a = mrh_get_role_position( $role_a );
110
+ $pos_b = mrh_get_role_position( $role_b );
111
+
112
+ return mrh_compare( $pos_a, $pos_b, $operator );
113
+ }
114
+
115
+ /**
116
+ * Helper function for comparing numbers with a dynamic operator.
117
+ *
118
+ * @since 1.0.0
119
+ * @access public
120
+ * @param int $a
121
+ * @param int $b
122
+ * @param string $operator
123
+ * @return bool
124
+ */
125
+ function mrh_compare( $a, $b, $operator = '==' ) {
126
+
127
+ switch ( $operator ) {
128
+
129
+ case '==' : return $a == $b;
130
+ case '===' : return $a === $b;
131
+ case '!=' : return $a !== $b;
132
+ case '<>' : return $a <> $b;
133
+ case '!==' : return $a !== $b;
134
+ case '>=' : return $a >= $b;
135
+ case '<=' : return $a <= $b;
136
+ case '>' : return $a > $b;
137
+ case '<' : return $a < $b;
138
+ // case '<=>' : return $a <=> $b; // PHP7
139
+ default : return false;
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Conditional function to check if a role is higher than another.
145
+ *
146
+ * @since 1.0.0
147
+ * @access public
148
+ * @param string $role_a
149
+ * @param string $role_b
150
+ * @return bool
151
+ */
152
+ function mrh_is_role_higher( $role_a, $role_b ) {
153
+
154
+ $role_a_pos = mrh_get_role_position( $role_a );
155
+ $role_b_pos = mrh_get_role_position( $role_b );
156
+
157
+ return $role_a_pos > $role_b_pos;
158
+ }
159
+
160
+ /**
161
+ * Returns an array with the highest roles by position. It's very possible for
162
+ * the two or more roles to have the same position. That's why we're returning
163
+ * an array of roles rather than a single "highest" role.
164
+ *
165
+ * @since 1.0.0
166
+ * @access public
167
+ * @return array
168
+ */
169
+ function mrh_get_highest_roles() {
170
+
171
+ $highest = array();
172
+
173
+ $roles = mrh_get_role_positions();
174
+
175
+ // Sort numbers in descending order.
176
+ arsort( $roles, SORT_NUMERIC );
177
+
178
+ // Reset the array pointer.
179
+ reset( $roles );
180
+
181
+ // Get the first key, which is the highest role.
182
+ $key = key( $roles );
183
+
184
+ // Loop through the sorted roles and add any that match the highest role's position.
185
+ foreach ( $roles as $role => $position ) {
186
+
187
+ // Bail if we hit a role that doesn't match. No others will after either.
188
+ if ( $roles[ $key ] != $position )
189
+ break;
190
+
191
+ $highest[] = $role;
192
+ }
193
+
194
+ return $highest;
195
+ }
196
+
197
+ /**
198
+ * Gets a user's highest role based on its position in the hierarchy.
199
+ *
200
+ * @since 1.0.0
201
+ * @access public
202
+ * @param int $user_id
203
+ * @return string
204
+ */
205
+ function mrh_get_user_highest_role( $user_id ) {
206
+
207
+ $positions = mrh_get_role_positions();
208
+
209
+ $user = new WP_User( $user_id );
210
+
211
+ $highest_role = '';
212
+
213
+ if ( $user->roles ) {
214
+
215
+ foreach ( $user->roles as $role ) {
216
+
217
+ if ( ! $highest_role ) {
218
+
219
+ $highest_role = $role;
220
+
221
+ } else if ( $highest_role ) {
222
+
223
+ // Get the position of the highest role.
224
+ $h_role_pos = mrh_get_role_position( $highest_role );
225
+
226
+ // Get the position of the current role.
227
+ $c_role_pos = mrh_get_role_position( $role );
228
+
229
+ // If the current role is higher than the highest role, it becomes
230
+ // the new highest role.
231
+ if ( $c_role_pos > $h_role_pos )
232
+ $highest_role = $role;
233
+ }
234
+ }
235
+ }
236
+
237
+ return $highest_role;
238
+ }
addons/members-role-hierarchy/license.md ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+ Preamble
10
+
11
+ The licenses for most software are designed to take away your
12
+ freedom to share and change it. By contrast, the GNU General Public
13
+ License is intended to guarantee your freedom to share and change free
14
+ software--to make sure the software is free for all its users. This
15
+ General Public License applies to most of the Free Software
16
+ Foundation's software and to any other program whose authors commit to
17
+ using it. (Some other Free Software Foundation software is covered by
18
+ the GNU Lesser General Public License instead.) You can apply it to
19
+ your programs, too.
20
+
21
+ When we speak of free software, we are referring to freedom, not
22
+ price. Our General Public Licenses are designed to make sure that you
23
+ have the freedom to distribute copies of free software (and charge for
24
+ this service if you wish), that you receive source code or can get it
25
+ if you want it, that you can change the software or use pieces of it
26
+ in new free programs; and that you know you can do these things.
27
+
28
+ To protect your rights, we need to make restrictions that forbid
29
+ anyone to deny you these rights or to ask you to surrender the rights.
30
+ These restrictions translate to certain responsibilities for you if you
31
+ distribute copies of the software, or if you modify it.
32
+
33
+ For example, if you distribute copies of such a program, whether
34
+ gratis or for a fee, you must give the recipients all the rights that
35
+ you have. You must make sure that they, too, receive or can get the
36
+ source code. And you must show them these terms so they know their
37
+ rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and
40
+ (2) offer you this license which gives you legal permission to copy,
41
+ distribute and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain
44
+ that everyone understands that there is no warranty for this free
45
+ software. If the software is modified by someone else and passed on, we
46
+ want its recipients to know that what they have is not the original, so
47
+ that any problems introduced by others will not reflect on the original
48
+ authors' reputations.
49
+
50
+ Finally, any free program is threatened constantly by software
51
+ patents. We wish to avoid the danger that redistributors of a free
52
+ program will individually obtain patent licenses, in effect making the
53
+ program proprietary. To prevent this, we have made it clear that any
54
+ patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ GNU GENERAL PUBLIC LICENSE
60
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+ 0. This License applies to any program or other work which contains
63
+ a notice placed by the copyright holder saying it may be distributed
64
+ under the terms of this General Public License. The "Program", below,
65
+ refers to any such program or work, and a "work based on the Program"
66
+ means either the Program or any derivative work under copyright law:
67
+ that is to say, a work containing the Program or a portion of it,
68
+ either verbatim or with modifications and/or translated into another
69
+ language. (Hereinafter, translation is included without limitation in
70
+ the term "modification".) Each licensee is addressed as "you".
71
+
72
+ Activities other than copying, distribution and modification are not
73
+ covered by this License; they are outside its scope. The act of
74
+ running the Program is not restricted, and the output from the Program
75
+ is covered only if its contents constitute a work based on the
76
+ Program (independent of having been made by running the Program).
77
+ Whether that is true depends on what the Program does.
78
+
79
+ 1. You may copy and distribute verbatim copies of the Program's
80
+ source code as you receive it, in any medium, provided that you
81
+ conspicuously and appropriately publish on each copy an appropriate
82
+ copyright notice and disclaimer of warranty; keep intact all the
83
+ notices that refer to this License and to the absence of any warranty;
84
+ and give any other recipients of the Program a copy of this License
85
+ along with the Program.
86
+
87
+ You may charge a fee for the physical act of transferring a copy, and
88
+ you may at your option offer warranty protection in exchange for a fee.
89
+
90
+ 2. You may modify your copy or copies of the Program or any portion
91
+ of it, thus forming a work based on the Program, and copy and
92
+ distribute such modifications or work under the terms of Section 1
93
+ above, provided that you also meet all of these conditions:
94
+
95
+ a) You must cause the modified files to carry prominent notices
96
+ stating that you changed the files and the date of any change.
97
+
98
+ b) You must cause any work that you distribute or publish, that in
99
+ whole or in part contains or is derived from the Program or any
100
+ part thereof, to be licensed as a whole at no charge to all third
101
+ parties under the terms of this License.
102
+
103
+ c) If the modified program normally reads commands interactively
104
+ when run, you must cause it, when started running for such
105
+ interactive use in the most ordinary way, to print or display an
106
+ announcement including an appropriate copyright notice and a
107
+ notice that there is no warranty (or else, saying that you provide
108
+ a warranty) and that users may redistribute the program under
109
+ these conditions, and telling the user how to view a copy of this
110
+ License. (Exception: if the Program itself is interactive but
111
+ does not normally print such an announcement, your work based on
112
+ the Program is not required to print an announcement.)
113
+
114
+ These requirements apply to the modified work as a whole. If
115
+ identifiable sections of that work are not derived from the Program,
116
+ and can be reasonably considered independent and separate works in
117
+ themselves, then this License, and its terms, do not apply to those
118
+ sections when you distribute them as separate works. But when you
119
+ distribute the same sections as part of a whole which is a work based
120
+ on the Program, the distribution of the whole must be on the terms of
121
+ this License, whose permissions for other licensees extend to the
122
+ entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+ Thus, it is not the intent of this section to claim rights or contest
125
+ your rights to work written entirely by you; rather, the intent is to
126
+ exercise the right to control the distribution of derivative or
127
+ collective works based on the Program.
128
+
129
+ In addition, mere aggregation of another work not based on the Program
130
+ with the Program (or with a work based on the Program) on a volume of
131
+ a storage or distribution medium does not bring the other work under
132
+ the scope of this License.
133
+
134
+ 3. You may copy and distribute the Program (or a work based on it,
135
+ under Section 2) in object code or executable form under the terms of
136
+ Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+ a) Accompany it with the complete corresponding machine-readable
139
+ source code, which must be distributed under the terms of Sections
140
+ 1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+ b) Accompany it with a written offer, valid for at least three
143
+ years, to give any third party, for a charge no more than your
144
+ cost of physically performing source distribution, a complete
145
+ machine-readable copy of the corresponding source code, to be
146
+ distributed under the terms of Sections 1 and 2 above on a medium
147
+ customarily used for software interchange; or,
148
+
149
+ c) Accompany it with the information you received as to the offer
150
+ to distribute corresponding source code. (This alternative is
151
+ allowed only for noncommercial distribution and only if you
152
+ received the program in object code or executable form with such
153
+ an offer, in accord with Subsection b above.)
154
+
155
+ The source code for a work means the preferred form of the work for
156
+ making modifications to it. For an executable work, complete source
157
+ code means all the source code for all modules it contains, plus any
158
+ associated interface definition files, plus the scripts used to
159
+ control compilation and installation of the executable. However, as a
160
+ special exception, the source code distributed need not include
161
+ anything that is normally distributed (in either source or binary
162
+ form) with the major components (compiler, kernel, and so on) of the
163
+ operating system on which the executable runs, unless that component
164
+ itself accompanies the executable.
165
+
166
+ If distribution of executable or object code is made by offering
167
+ access to copy from a designated place, then offering equivalent
168
+ access to copy the source code from the same place counts as
169
+ distribution of the source code, even though third parties are not
170
+ compelled to copy the source along with the object code.
171
+
172
+ 4. You may not copy, modify, sublicense, or distribute the Program
173
+ except as expressly provided under this License. Any attempt
174
+ otherwise to copy, modify, sublicense or distribute the Program is
175
+ void, and will automatically terminate your rights under this License.
176
+ However, parties who have received copies, or rights, from you under
177
+ this License will not have their licenses terminated so long as such
178
+ parties remain in full compliance.
179
+
180
+ 5. You are not required to accept this License, since you have not
181
+ signed it. However, nothing else grants you permission to modify or
182
+ distribute the Program or its derivative works. These actions are
183
+ prohibited by law if you do not accept this License. Therefore, by
184
+ modifying or distributing the Program (or any work based on the
185
+ Program), you indicate your acceptance of this License to do so, and
186
+ all its terms and conditions for copying, distributing or modifying
187
+ the Program or works based on it.
188
+
189
+ 6. Each time you redistribute the Program (or any work based on the
190
+ Program), the recipient automatically receives a license from the
191
+ original licensor to copy, distribute or modify the Program subject to
192
+ these terms and conditions. You may not impose any further
193
+ restrictions on the recipients' exercise of the rights granted herein.
194
+ You are not responsible for enforcing compliance by third parties to
195
+ this License.
196
+
197
+ 7. If, as a consequence of a court judgment or allegation of patent
198
+ infringement or for any other reason (not limited to patent issues),
199
+ conditions are imposed on you (whether by court order, agreement or
200
+ otherwise) that contradict the conditions of this License, they do not
201
+ excuse you from the conditions of this License. If you cannot
202
+ distribute so as to satisfy simultaneously your obligations under this
203
+ License and any other pertinent obligations, then as a consequence you
204
+ may not distribute the Program at all. For example, if a patent
205
+ license would not permit royalty-free redistribution of the Program by
206
+ all those who receive copies directly or indirectly through you, then
207
+ the only way you could satisfy both it and this License would be to
208
+ refrain entirely from distribution of the Program.
209
+
210
+ If any portion of this section is held invalid or unenforceable under
211
+ any particular circumstance, the balance of the section is intended to
212
+ apply and the section as a whole is intended to apply in other
213
+ circumstances.
214
+
215
+ It is not the purpose of this section to induce you to infringe any
216
+ patents or other property right claims or to contest validity of any
217
+ such claims; this section has the sole purpose of protecting the
218
+ integrity of the free software distribution system, which is
219
+ implemented by public license practices. Many people have made
220
+ generous contributions to the wide range of software distributed
221
+ through that system in reliance on consistent application of that
222
+ system; it is up to the author/donor to decide if he or she is willing
223
+ to distribute software through any other system and a licensee cannot
224
+ impose that choice.
225
+
226
+ This section is intended to make thoroughly clear what is believed to
227
+ be a consequence of the rest of this License.
228
+
229
+ 8. If the distribution and/or use of the Program is restricted in
230
+ certain countries either by patents or by copyrighted interfaces, the
231
+ original copyright holder who places the Program under this License
232
+ may add an explicit geographical distribution limitation excluding
233
+ those countries, so that distribution is permitted only in or among
234
+ countries not thus excluded. In such case, this License incorporates
235
+ the limitation as if written in the body of this License.
236
+
237
+ 9. The Free Software Foundation may publish revised and/or new versions
238
+ of the General Public License from time to time. Such new versions will
239
+ be similar in spirit to the present version, but may differ in detail to
240
+ address new problems or concerns.
241
+
242
+ Each version is given a distinguishing version number. If the Program
243
+ specifies a version number of this License which applies to it and "any
244
+ later version", you have the option of following the terms and conditions
245
+ either of that version or of any later version published by the Free
246
+ Software Foundation. If the Program does not specify a version number of
247
+ this License, you may choose any version ever published by the Free Software
248
+ Foundation.
249
+
250
+ 10. If you wish to incorporate parts of the Program into other free
251
+ programs whose distribution conditions are different, write to the author
252
+ to ask for permission. For software which is copyrighted by the Free
253
+ Software Foundation, write to the Free Software Foundation; we sometimes
254
+ make exceptions for this. Our decision will be guided by the two goals
255
+ of preserving the free status of all derivatives of our free software and
256
+ of promoting the sharing and reuse of software generally.
257
+
258
+ NO WARRANTY
259
+
260
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+ REPAIR OR CORRECTION.
269
+
270
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+ POSSIBILITY OF SUCH DAMAGES.
279
+
280
+ END OF TERMS AND CONDITIONS
281
+
282
+ How to Apply These Terms to Your New Programs
283
+
284
+ If you develop a new program, and you want it to be of the greatest
285
+ possible use to the public, the best way to achieve this is to make it
286
+ free software which everyone can redistribute and change under these terms.
287
+
288
+ To do so, attach the following notices to the program. It is safest
289
+ to attach them to the start of each source file to most effectively
290
+ convey the exclusion of warranty; and each file should have at least
291
+ the "copyright" line and a pointer to where the full notice is found.
292
+
293
+ <one line to give the program's name and a brief idea of what it does.>
294
+ Copyright (C) <year> <name of author>
295
+
296
+ This program is free software; you can redistribute it and/or modify
297
+ it under the terms of the GNU General Public License as published by
298
+ the Free Software Foundation; either version 2 of the License, or
299
+ (at your option) any later version.
300
+
301
+ This program is distributed in the hope that it will be useful,
302
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
303
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
+ GNU General Public License for more details.
305
+
306
+ You should have received a copy of the GNU General Public License along
307
+ with this program; if not, write to the Free Software Foundation, Inc.,
308
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309
+
310
+ Also add information on how to contact you by electronic and paper mail.
311
+
312
+ If the program is interactive, make it output a short notice like this
313
+ when it starts in an interactive mode:
314
+
315
+ Gnomovision version 69, Copyright (C) year name of author
316
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317
+ This is free software, and you are welcome to redistribute it
318
+ under certain conditions; type `show c' for details.
319
+
320
+ The hypothetical commands `show w' and `show c' should show the appropriate
321
+ parts of the General Public License. Of course, the commands you use may
322
+ be called something other than `show w' and `show c'; they could even be
323
+ mouse-clicks or menu items--whatever suits your program.
324
+
325
+ You should also get your employer (if you work as a programmer) or your
326
+ school, if any, to sign a "copyright disclaimer" for the program, if
327
+ necessary. Here is a sample; alter the names:
328
+
329
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
+
332
+ <signature of Ty Coon>, 1 April 1989
333
+ Ty Coon, President of Vice
334
+
335
+ This General Public License does not permit incorporating your program into
336
+ proprietary programs. If your program is a subroutine library, you may
337
+ consider it more useful to permit linking proprietary applications with the
338
+ library. If this is what you want to do, use the GNU Lesser General
339
+ Public License instead of this License.
addons/members-role-hierarchy/readme.md ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Members - Role Hierarchy
2
+
3
+ _Members - Role Hierarchy is an add-on plugin for [Members](http://themehybrid.com/plugins/members). You must have it installed for this plugin to work._
4
+
5
+ The purpose of this plugin is to create a hierarchical role system. WordPress roles, by default, are not hierarchical.
6
+
7
+ Often, it makes sense that the Administrator role is higher than the Subscriber role, but that's not how WordPress' roles system works. It works on a simpler system: _either a user/role can doing something or it cannot do something_. This is problematic when you want to allow certain users to create, edit, promote, or delete other users because it means they have full access to perform these actions on **any user** on the install.
8
+
9
+ What this plugin does is provide a numeric system ("position") for each role. So, you might give the Administrator role a position of 100 and the Editor role a position of 80. Then, you can allow Editors to create new users without allowing them to create new Administrators, for example.
10
+
11
+ ## Usage
12
+
13
+ Using the plugin is fairly straightforward. It fits right into the admin screens created by the Members plugin and adds no new screens to the admin.
14
+
15
+ ### Role positions
16
+
17
+ To use the plugin, you merely need to go to the Users > Roles screen in the admin and edit a role. There's a meta box labeled "Position". The higher the position, the higher the role will be in the hierarchy. So, a position of `100` is higher than a position of `10`.
18
+
19
+ Role positions are also listed on the manage roles screen via Users > Roles, so you can always see all roles' positions at a glance.
20
+
21
+ ### Lower or equal
22
+
23
+ When building the plugin, the big question was whether roles should only be able to edit users with roles "lower" or "lower or equal" to their own role. For example, should Editors be able to create new Editors or only roles lower than Editor? The answer to this is different for different people.
24
+
25
+ Therefore, there's a single setting on the Settings > Members screen for "Role Hierarchy". This setting allows you to choose what's best for your site.
26
+
27
+ _Note: If you choose the "lower" option, it will exclude the highest-positioned role(s) (generally, this is the Administrator). This is for practical reasons. There must be at least one role with the ability to manage any user._
28
+
29
+ ### Default positions
30
+
31
+ The plugin sets up some default positions for the core WordPress roles, which are the following.
32
+
33
+ * Administrator - `100`
34
+ * Editor - `80`
35
+ * Author - `60`
36
+ * Contributor - `40`
37
+ * Subscriber - `20`
38
+
39
+ All other roles default to `0`.
40
+
41
+ ## Professional Support
42
+
43
+ If you need professional plugin support from me, the plugin author, you can access the support forums at [Theme Hybrid](http://themehybrid.com/board/topics), which is a professional WordPress help/support site where I handle support for all my plugins and themes for a community of 60,000+ users (and growing).
44
+
45
+ ## Copyright and License
46
+
47
+ This project is licensed under the [GNU GPL](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html), version 2 or later.
48
+
49
+ 2017 &copy; [Justin Tadlock](http://justintadlock.com).
addons/members-role-hierarchy/readme.txt ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === Members - Role Hiearchy ===
2
+
3
+ Contributors: greenshady
4
+ Donate link: http://themehybrid.com/donate
5
+ Tags: roles, members, users
6
+ Requires at least: 4.7
7
+ Tested up to: 4.7.2
8
+ Stable tag: 1.0.0
9
+
10
+ Add-on plugin for Members for hierarchical user roles.
11
+
12
+ == Description ==
13
+
14
+ Members - Role Hierarchy is an add-on plugin for the [Members plugin](https://wordpress.org/plugins/members), which adds a hierarchical role system.
15
+
16
+ Hierarchical roles are important when you want to allow "lower" level users, such as Editors, to create, edit, promote, or delete users without giving them access to a higher role, such as Administrator.
17
+
18
+ For more info, visit the [plugin home page](http://themehybrid.com/plugins/members-role-hierarchy).
19
+
20
+ ### Like this plugin?
21
+
22
+ Please consider helping the cause by:
23
+
24
+ * [Making a donation](http://themehybrid.com/donate).
25
+ * [Signing up at my site](http://themehybrid.com/club).
26
+ * [Rating the plugin](https://wordpress.org/support/view/plugin-reviews/members-role-hierarchy?rate=5#postform).
27
+
28
+ ### Professional Support
29
+
30
+ If you need professional plugin support from me, the plugin author, you can access the support forums at [Theme Hybrid](http://themehybrid.com/board/topics), which is a professional WordPress help/support site where I handle support for all my plugins and themes for a community of 60,000+ users (and growing).
31
+
32
+ ### Plugin Development
33
+
34
+ If you're a theme author, plugin author, or just a code hobbyist, you can follow the development of this plugin on it's [GitHub repository](https://github.com/justintadlock/members).
35
+
36
+ == Installation ==
37
+
38
+ 1. Upload `members-role-hierarchy` to the `/wp-content/plugins/` directory.
39
+ 2. Activate the plugin through the 'Plugins' menu in WordPress.
40
+ 3. Go to "Settings > Members" to select which settings you'd like to use.
41
+
42
+ More detailed instructions are included in the plugin's `readme.html` file.
43
+
44
+ == Frequently Asked Questions ==
45
+
46
+ ### Why was this plugin created?
47
+
48
+ A hierarchical role system is one of the most-requested features that I've gotten over the years from Members' users. Fortunately, an awesome client had me build this add-on and allowed me to release it back for free to the community.
49
+
50
+ ### How do I use it?
51
+
52
+ Most things should be fairly straightforward if you've used Members, but I've included an in-depth guide in the plugin download. It's a file called `readme.md` in the plugin folder.
53
+
54
+ You can also [view the readme](https://github.com/justintadlock/members-role-hierarchy/blob/master/readme.md) online.
55
+
56
+ == Screenshots ==
57
+
58
+ 1. Role Position meta box on edit role screen
59
+
60
+ == Changelog ==
61
+
62
+ The change log is located in the `changelog.md` file in the plugin folder. You may also [view the change log](https://github.com/justintadlock/members-role-hierarchy/blob/master/changelog.md) online.
addons/members-role-hierarchy/screenshot-1.png ADDED
Binary file
addons/members-role-levels/addon.php ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Singleton class for setting up the plugin.
5
+ *
6
+ * @since 1.0.0
7
+ * @access public
8
+ */
9
+ final class Members_Role_Levels_Plugin {
10
+
11
+ /**
12
+ * Plugin directory path.
13
+ *
14
+ * @since 1.0.0
15
+ * @access public
16
+ * @var string
17
+ */
18
+ public $dir_path = '';
19
+
20
+ /**
21
+ * Constructor method.
22
+ *
23
+ * @since 1.0.0
24
+ * @access private
25
+ * @return void
26
+ */
27
+ private function __construct() {}
28
+
29
+ /**
30
+ * Sets up globals.
31
+ *
32
+ * @since 1.0.0
33
+ * @access public
34
+ * @return void
35
+ */
36
+ private function setup() {
37
+
38
+ $this->dir_path = trailingslashit( plugin_dir_path( __FILE__ ) );
39
+ }
40
+
41
+ /**
42
+ * Loads files needed by the plugin.
43
+ *
44
+ * @since 1.0.0
45
+ * @access public
46
+ * @return void
47
+ */
48
+ private function includes() {
49
+
50
+ if ( is_admin() ) {
51
+
52
+ require_once( $this->dir_path . 'admin/functions-helpers.php' );
53
+ require_once( $this->dir_path . 'admin/class-column-level.php' );
54
+ require_once( $this->dir_path . 'admin/class-meta-box-level.php' );
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Sets up main plugin actions and filters.
60
+ *
61
+ * @since 1.0.0
62
+ * @access public
63
+ * @return void
64
+ */
65
+ private function setup_actions() {
66
+
67
+ // Always hide the old user levels in Members.
68
+ add_filter( 'members_remove_old_levels', '__return_true', 95 );
69
+ }
70
+
71
+ /**
72
+ * Returns the instance.
73
+ *
74
+ * @since 1.0.0
75
+ * @access public
76
+ * @return object
77
+ */
78
+ public static function get_instance() {
79
+
80
+ static $instance = null;
81
+
82
+ if ( is_null( $instance ) ) {
83
+ $instance = new Members_Role_Levels_Plugin;
84
+ $instance->setup();
85
+ $instance->includes();
86
+ $instance->setup_actions();
87
+ }
88
+
89
+ return $instance;
90
+ }
91
+ }
92
+
93
+ Members_Role_Levels_Plugin::get_instance();
addons/members-role-levels/admin/class-column-level.php ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Adds the "Level" column on the manage roles screen.
4
+ *
5
+ * @package MembersRoleLevels
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justin@justintadlock.com>
8
+ * @copyright Copyright (c) 2015, Justin Tadlock
9
+ * @link http://themehybrid.com/plugins/members-role-levels
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ /**
14
+ * Manage role levels class.
15
+ *
16
+ * @since 1.0.0
17
+ * @access public
18
+ */
19
+ final class Members_Role_Levels_Column_Level {
20
+
21
+ /**
22
+ * Constructor method.
23
+ *
24
+ * @since 1.0.0
25
+ * @access private
26
+ * @return void
27
+ */
28
+ private function __construct() {}
29
+
30
+ /**
31
+ * Sets up actions and filters.
32
+ *
33
+ * @since 1.0.0
34
+ * @access public
35
+ * @return void
36
+ */
37
+ private function setup() {
38
+
39
+ add_action( 'members_load_manage_roles', array( $this, 'load' ) );
40
+ }
41
+
42
+ /**
43
+ * Executes on page load.
44
+ *
45
+ * @since 1.0.0
46
+ * @access public
47
+ * @return void
48
+ */
49
+ public function load() {
50
+
51
+ // Print custom styles.
52
+ add_action( 'admin_head', array( $this, 'print_styles' ) );
53
+
54
+ // Add custom columns.
55
+ add_filter( 'members_manage_roles_columns', array( $this, 'columns' ) );
56
+
57
+ // Output custom column content.
58
+ add_filter( 'members_manage_roles_column_level', array( $this, 'column_level' ), 10, 2 );
59
+ }
60
+
61
+ /**
62
+ * Prints styles to the header.
63
+ *
64
+ * @since 1.0.0
65
+ * @access public
66
+ * @return void
67
+ */
68
+ public function print_styles() { ?>
69
+ <style type="text/css">@media only screen and (min-width: 783px) {
70
+ .members_page_roles .column-level { width: 100px; text-align: center; }
71
+ }</style>
72
+ <?php }
73
+
74
+ /**
75
+ * Adds the custom "Level" column.
76
+ *
77
+ * @since 1.0.0
78
+ * @access public
79
+ * @return void
80
+ */
81
+ public function columns( $columns ) {
82
+
83
+ $columns['level'] = esc_html__( 'Level', 'members' );
84
+
85
+ return $columns;
86
+ }
87
+
88
+ /**
89
+ * Returns the content for the level column.
90
+ *
91
+ * @since 1.0.0
92
+ * @access public
93
+ * @return void
94
+ */
95
+ public function column_level( $out, $role ) {
96
+
97
+ $level = mrl_get_role_level( get_role( $role ) );
98
+
99
+ return $level ? mrl_remove_level_prefix( $level ) : '&ndash;';
100
+ }
101
+
102
+ /**
103
+ * Returns the instance.
104
+ *
105
+ * @since 1.0.0
106
+ * @access public
107
+ * @return object
108
+ */
109
+ public static function get_instance() {
110
+
111
+ static $instance = null;
112
+
113
+ if ( is_null( $instance ) ) {
114
+ $instance = new Members_Role_Levels_Column_Level;
115
+ $instance->setup();
116
+ }
117
+
118
+ return $instance;
119
+ }
120
+ }
121
+
122
+ Members_Role_Levels_Column_Level::get_instance();
addons/members-role-levels/admin/class-meta-box-level.php ADDED
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Adds the "Level" meta box to the edit/new role screen.
4
+ *
5
+ * @package MembersRoleLevels
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justin@justintadlock.com>
8
+ * @copyright Copyright (c) 2015, Justin Tadlock
9
+ * @link http://themehybrid.com/plugins/members-role-levels
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ /**
14
+ * Role level meta box.
15
+ *
16
+ * @since 1.0.0
17
+ * @access public
18
+ */
19
+ final class Members_Role_Levels_Meta_Box_Level {
20
+
21
+ /**
22
+ * Constructor method.
23
+ *
24
+ * @since 1.0.0
25
+ * @access private
26
+ * @return void
27
+ */
28
+ private function __construct() {}
29
+
30
+ /**
31
+ * Sets up actions and filters.
32
+ *
33
+ * @since 1.0.0
34
+ * @access public
35
+ * @return void
36
+ */
37
+ private function setup() {
38
+
39
+ // Add actions on page load.
40
+ add_action( 'members_load_role_edit', array( $this, 'load' ) );
41
+ add_action( 'members_load_role_new', array( $this, 'load' ) );
42
+
43
+ // Update role levels.
44
+ add_action( 'members_role_updated', array( $this, 'update_role_level' ) );
45
+ add_action( 'members_role_added', array( $this, 'update_role_level' ) );
46
+ }
47
+
48
+ /**
49
+ * Add actions/filters on page load.
50
+ *
51
+ * @since 1.0.0
52
+ * @access public
53
+ * @return void
54
+ */
55
+ public function load() {
56
+
57
+ add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
58
+ }
59
+
60
+ /**
61
+ * Adds custom meta boxes.
62
+ *
63
+ * @since 1.0.0
64
+ * @access public
65
+ * @param string $screen_id
66
+ * @return void
67
+ */
68
+ public function add_meta_boxes( $screen_id ) {
69
+
70
+ // Add the meta box.
71
+ add_meta_box( 'mrl_role_level', esc_html__( 'Level', 'members' ), array( $this, 'meta_box' ), $screen_id, 'side', 'default' );
72
+ }
73
+
74
+ /**
75
+ * Outputs the role level meta box.
76
+ *
77
+ * @since 1.0.0
78
+ * @access public
79
+ * @param object $role
80
+ * @return void
81
+ */
82
+ public function meta_box( $role ) {
83
+
84
+ // If the role isn't editable, the field should be read-only.
85
+ $is_editable = $role ? members_is_role_editable( $role->name ) : true;
86
+ $readonly = $is_editable ? '' : ' disabled="disabled" readonly="readonly"';
87
+
88
+ // Get the role level.
89
+ $role_level = mrl_get_role_level( $role );
90
+
91
+ // If there is no role level, check if cloning or error.
92
+ if ( ! $role_level ) {
93
+
94
+ // If there was a posted level (error).
95
+ if ( isset( $_POST['mrl-role-level'] ) && mrl_is_valid_level( $_POST['mrl-role-level'] ) )
96
+ $role_level = $_POST['mrl-role-level'];
97
+
98
+ // If we're cloning a new role.
99
+ else if ( isset( $_GET['page'] ) && 'role-new' === $_GET['page'] && ! empty( $_GET['clone'] ) )
100
+ $role_level = mrl_get_role_level( members_sanitize_role( $_GET['clone'] ) );
101
+ }
102
+
103
+ // If still no level, set it to `level_0`.
104
+ $role_level = $role_level ? $role_level : 'level_0';
105
+
106
+ wp_nonce_field( 'role_level', 'mrl_role_level_nonce' ); ?>
107
+
108
+ <p>
109
+ <select class="widefat" name="mrl-role-level"<?php echo $readonly; ?>>
110
+
111
+ <?php foreach ( mrl_get_role_levels() as $level => $label ) : ?>
112
+
113
+ <option value="<?php echo esc_attr( $level ); ?>" <?php selected( $level, $role_level ); ?>><?php echo esc_html( $label ); ?></option>
114
+
115
+ <?php endforeach; ?>
116
+
117
+ </select>
118
+ </p>
119
+ <?php }
120
+
121
+ /**
122
+ * Updates the role level when a new role is added or an existing role is updated. Note
123
+ * that in order to properly update the `user_level` field of users, we need to run
124
+ * `WP_User::update_user_level_from_caps()`, which can be a heavy function if the role
125
+ * as a lot of users because each user of the role needs to be updated.
126
+ *
127
+ * @since 1.0.0
128
+ * @access public
129
+ * @param string $role
130
+ * @return void
131
+ */
132
+ public function update_role_level( $role ) {
133
+
134
+ // Verify the nonce before proceeding.
135
+ if ( isset( $_POST['mrl_role_level_nonce'] ) && wp_verify_nonce( $_POST['mrl_role_level_nonce'], 'role_level' ) ) {
136
+
137
+ // Get the current role object to edit.
138
+ $role = get_role( members_sanitize_role( $role ) );
139
+
140
+ // If the role doesn't exist, bail.
141
+ if ( is_null( $role ) )
142
+ return;
143
+
144
+ // Get the posted level.
145
+ $new_level = isset( $_POST['mrl-role-level'] ) ? $_POST['mrl-role-level'] : '';
146
+
147
+ // Make sure the posted level is in the whitelisted array of levels.
148
+ if ( ! mrl_is_valid_level( $new_level ) )
149
+ return;
150
+
151
+ // Get the role's current level.
152
+ $role_level = mrl_get_role_level( $role );
153
+
154
+ // If the posted level doesn't match the role level, update it.
155
+ if ( $new_level !== $role_level )
156
+ mrl_set_role_level( $role, $new_level );
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Returns the instance.
162
+ *
163
+ * @since 1.0.0
164
+ * @access public
165
+ * @return object
166
+ */
167
+ public static function get_instance() {
168
+
169
+ static $instance = null;
170
+
171
+ if ( is_null( $instance ) ) {
172
+ $instance = new Members_Role_Levels_Meta_Box_Level;
173
+ $instance->setup();
174
+ }
175
+
176
+ return $instance;
177
+ }
178
+ }
179
+
180
+ Members_Role_Levels_Meta_Box_Level::get_instance();
addons/members-role-levels/admin/functions-helpers.php ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Helper functions for dealing with role levels.
4
+ *
5
+ * @package MembersRoleLevels
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justin@justintadlock.com>
8
+ * @copyright Copyright (c) 2015, Justin Tadlock
9
+ * @link http://themehybrid.com/plugins/members-role-levels
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ /**
14
+ * Removes the `level_` prefix from a role level to return the numeric version.
15
+ *
16
+ * @since 1.0.0
17
+ * @access public
18
+ * @param string $level
19
+ * @return string
20
+ */
21
+ function mrl_remove_level_prefix( $level ) {
22
+ return str_replace( 'level_', '', $level );
23
+ }
24
+
25
+ /**
26
+ * Adds the `level_` prefix from a role level to return the non-numeric version.
27
+ *
28
+ * @since 1.0.0
29
+ * @access public
30
+ * @param string $level
31
+ * @return string
32
+ */
33
+ function mrl_add_level_prefix( $level ) {
34
+ return "level_{$level}";
35
+ }
36
+
37
+ /**
38
+ * Checks the role level against a white-list of allowed role levels.
39
+ *
40
+ * @since 1.0.0
41
+ * @access public
42
+ * @param string $level
43
+ * @return bool
44
+ */
45
+ function mrl_is_valid_level( $level ) {
46
+
47
+ return in_array( $level, array_keys( mrl_get_role_levels() ) );
48
+ }
49
+
50
+ /**
51
+ * Returns an array of role levels. The array keys are the levels. The array values are the
52
+ * internationalized level labels.
53
+ *
54
+ * @since 1.0.0
55
+ * @access public
56
+ * @return array
57
+ */
58
+ function mrl_get_role_levels() {
59
+
60
+ return array(
61
+ 'level_0' => __( 'Level 0', 'members' ),
62
+ 'level_1' => __( 'Level 1', 'members' ),
63
+ 'level_2' => __( 'Level 2', 'members' ),
64
+ 'level_3' => __( 'Level 3', 'members' ),
65
+ 'level_4' => __( 'Level 4', 'members' ),
66
+ 'level_5' => __( 'Level 5', 'members' ),
67
+ 'level_6' => __( 'Level 6', 'members' ),
68
+ 'level_7' => __( 'Level 7', 'members' ),
69
+ 'level_8' => __( 'Level 8', 'members' ),
70
+ 'level_9' => __( 'Level 9', 'members' ),
71
+ 'level_10' => __( 'Level 10', 'members' )
72
+ );
73
+ }
74
+
75
+ /**
76
+ * Returns the highest level a role has. Technically, roles have multiple levels. For example,
77
+ * if a role has `level_7`, it will also have `level_0` - `level_6`. This function will simply
78
+ * return the highest.
79
+ *
80
+ * @since 1.0.0
81
+ * @access public
82
+ * @param string|object $role
83
+ * @return string
84
+ */
85
+ function mrl_get_role_level( $role ) {
86
+
87
+ // Bail if the role is empty.
88
+ if ( ! $role )
89
+ return '';
90
+
91
+ // Make sure we have the role object.
92
+ if ( ! is_object( $role ) )
93
+ $role = get_role( $role );
94
+
95
+ // Get all the role's levels.
96
+ $levels = array_intersect( array_keys( $role->capabilities ), array_keys( mrl_get_role_levels() ) );
97
+
98
+ // Return an empty string if the role doesn't have any levels.
99
+ if ( ! $levels )
100
+ return '';
101
+
102
+ // Get the numeric versions of the levels.
103
+ $numeric_levels = array_map( 'mrl_remove_level_prefix', $levels );
104
+
105
+ // Sort the levels in descending order (high to low).
106
+ rsort( $numeric_levels );
107
+
108
+ // Return the highest level and re-add the `level_` prefix.
109
+ return mrl_add_level_prefix( array_shift( $numeric_levels ) );
110
+ }
111
+
112
+ /**
113
+ * Sets a new role level. This function also updates all users of the given role to update
114
+ * their user level.
115
+ *
116
+ * Note: WP will always set the user level to the highest level when calling the
117
+ * `WP_User:update_user_level_from_caps()` method, so there's no need to check for the
118
+ * highest role when dealing with users with multiple roles.
119
+ *
120
+ * @since 1.0.0
121
+ * @access public
122
+ * @param string|object $role
123
+ * @return void
124
+ */
125
+ function mrl_set_role_level( $role, $new_level = 'level_0' ) {
126
+
127
+ // Make sure we have the role object.
128
+ if ( ! is_object( $role ) )
129
+ $role = get_role( $role );
130
+
131
+ // Get the allowed levels.
132
+ $levels = array_keys( mrl_get_role_levels() );
133
+
134
+ // Get the posted level without the `level` prefix.
135
+ $new_level_numeric = absint( mrl_remove_level_prefix( $new_level ) );
136
+
137
+ // Get the levels to add and remove.
138
+ $add = array_slice( $levels, 0, $new_level_numeric + 1, true );
139
+ $remove = array_diff( $levels, $add );
140
+
141
+ // Add new levels.
142
+ foreach ( $add as $add_level )
143
+ $role->add_cap( $add_level );
144
+
145
+ // Remove levels.
146
+ foreach ( $remove as $remove_level )
147
+ $role->remove_cap( $remove_level );
148
+
149
+ // Get the users with the current role.
150
+ $users = get_users( array( 'role' => $role->name ) );
151
+
152
+ // If there are users with the role, update their user level from caps.
153
+ if ( $users ) {
154
+
155
+ foreach ( $users as $user )
156
+ $user->update_user_level_from_caps();
157
+ }
158
+ }
addons/members-role-levels/changelog.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ # Change Log
2
+
3
+ ## [1.0.0] - 2015-10-19
4
+
5
+ ### Added
6
+
7
+ * Plugin launch. Everything's new!
addons/members-role-levels/contributing.md ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contributing
2
+
3
+ The code for the project is handled via its [GitHub Repository](https://github.com/justintadlock/members-role-levels). You can open tickets, create patches, and send pull requests there.
4
+
5
+ ## Pull requests
6
+
7
+ Problem first. Solution second.
8
+
9
+ Pull requests should have a ticket open for discussion first. I rarely accept pull requests that aren't for a specific issue for various reasons. It's far better to post an issue and let me or the community provide feedback prior to creating a pull request.
10
+
11
+ Please don't make pull requests against the `master` branch. This is the latest, stable code. You can make a pull request against one of the point branches or the `dev` (future release) branch.
12
+
13
+ ## Coding standards
14
+
15
+ In general, the project follows all WordPress [coding standards](https://make.wordpress.org/core/handbook/best-practices/coding-standards). There are instances where it doesn't, opting for personal choices of my own, but in terms of contributing, following the WordPress standards is best practice.
16
+
17
+ ## Script and style files
18
+
19
+ The project consists of several script and style files. When making patches or pull requests with changes to these files, only do so to the primary file. Don't create patches for the minified (`.min`) versions of the files. Those will be minified after a patch is merged into the code base.
20
+
21
+ ## Language
22
+
23
+ All text strings follow U.S. English by default. While such guides are generally unneeded, in cases where style considerations are necessary, these will typically follow conventions laid out in *Elements of Style* or the *AP Stylebook*.
24
+
25
+ ## Licensing
26
+
27
+ Any code contributed to the project via patches, pull requests, or other means will be licensed under the [GPL version 2](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html) or later. By contributing code to the project, you provide consent to use such code under this license. The exception to this rule is when bringing in third-party code with an alternate open source license.
28
+
29
+ ## Versioning
30
+
31
+ The project uses [semantic versioning](http://semver.org). Version numbers will look like `3.2.1` where `3` is the "major" release, `2` is the minor release, and `1` is the patch release.
addons/members-role-levels/license.md ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+ Preamble
10
+
11
+ The licenses for most software are designed to take away your
12
+ freedom to share and change it. By contrast, the GNU General Public
13
+ License is intended to guarantee your freedom to share and change free
14
+ software--to make sure the software is free for all its users. This
15
+ General Public License applies to most of the Free Software
16
+ Foundation's software and to any other program whose authors commit to
17
+ using it. (Some other Free Software Foundation software is covered by
18
+ the GNU Lesser General Public License instead.) You can apply it to
19
+ your programs, too.
20
+
21
+ When we speak of free software, we are referring to freedom, not
22
+ price. Our General Public Licenses are designed to make sure that you
23
+ have the freedom to distribute copies of free software (and charge for
24
+ this service if you wish), that you receive source code or can get it
25
+ if you want it, that you can change the software or use pieces of it
26
+ in new free programs; and that you know you can do these things.
27
+
28
+ To protect your rights, we need to make restrictions that forbid
29
+ anyone to deny you these rights or to ask you to surrender the rights.
30
+ These restrictions translate to certain responsibilities for you if you
31
+ distribute copies of the software, or if you modify it.
32
+
33
+ For example, if you distribute copies of such a program, whether
34
+ gratis or for a fee, you must give the recipients all the rights that
35
+ you have. You must make sure that they, too, receive or can get the
36
+ source code. And you must show them these terms so they know their
37
+ rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and
40
+ (2) offer you this license which gives you legal permission to copy,
41
+ distribute and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain
44
+ that everyone understands that there is no warranty for this free
45
+ software. If the software is modified by someone else and passed on, we
46
+ want its recipients to know that what they have is not the original, so
47
+ that any problems introduced by others will not reflect on the original
48
+ authors' reputations.
49
+
50
+ Finally, any free program is threatened constantly by software
51
+ patents. We wish to avoid the danger that redistributors of a free
52
+ program will individually obtain patent licenses, in effect making the
53
+ program proprietary. To prevent this, we have made it clear that any
54
+ patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ GNU GENERAL PUBLIC LICENSE
60
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+ 0. This License applies to any program or other work which contains
63
+ a notice placed by the copyright holder saying it may be distributed
64
+ under the terms of this General Public License. The "Program", below,
65
+ refers to any such program or work, and a "work based on the Program"
66
+ means either the Program or any derivative work under copyright law:
67
+ that is to say, a work containing the Program or a portion of it,
68
+ either verbatim or with modifications and/or translated into another
69
+ language. (Hereinafter, translation is included without limitation in
70
+ the term "modification".) Each licensee is addressed as "you".
71
+
72
+ Activities other than copying, distribution and modification are not
73
+ covered by this License; they are outside its scope. The act of
74
+ running the Program is not restricted, and the output from the Program
75
+ is covered only if its contents constitute a work based on the
76
+ Program (independent of having been made by running the Program).
77
+ Whether that is true depends on what the Program does.
78
+
79
+ 1. You may copy and distribute verbatim copies of the Program's
80
+ source code as you receive it, in any medium, provided that you
81
+ conspicuously and appropriately publish on each copy an appropriate
82
+ copyright notice and disclaimer of warranty; keep intact all the
83
+ notices that refer to this License and to the absence of any warranty;
84
+ and give any other recipients of the Program a copy of this License
85
+ along with the Program.
86
+
87
+ You may charge a fee for the physical act of transferring a copy, and
88
+ you may at your option offer warranty protection in exchange for a fee.
89
+
90
+ 2. You may modify your copy or copies of the Program or any portion
91
+ of it, thus forming a work based on the Program, and copy and
92
+ distribute such modifications or work under the terms of Section 1
93
+ above, provided that you also meet all of these conditions:
94
+
95
+ a) You must cause the modified files to carry prominent notices
96
+ stating that you changed the files and the date of any change.
97
+
98
+ b) You must cause any work that you distribute or publish, that in
99
+ whole or in part contains or is derived from the Program or any
100
+ part thereof, to be licensed as a whole at no charge to all third
101
+ parties under the terms of this License.
102
+
103
+ c) If the modified program normally reads commands interactively
104
+ when run, you must cause it, when started running for such
105
+ interactive use in the most ordinary way, to print or display an
106
+ announcement including an appropriate copyright notice and a
107
+ notice that there is no warranty (or else, saying that you provide
108
+ a warranty) and that users may redistribute the program under
109
+ these conditions, and telling the user how to view a copy of this
110
+ License. (Exception: if the Program itself is interactive but
111
+ does not normally print such an announcement, your work based on
112
+ the Program is not required to print an announcement.)
113
+
114
+ These requirements apply to the modified work as a whole. If
115
+ identifiable sections of that work are not derived from the Program,
116
+ and can be reasonably considered independent and separate works in
117
+ themselves, then this License, and its terms, do not apply to those
118
+ sections when you distribute them as separate works. But when you
119
+ distribute the same sections as part of a whole which is a work based
120
+ on the Program, the distribution of the whole must be on the terms of
121
+ this License, whose permissions for other licensees extend to the
122
+ entire whole, and thus to each and every part regardless of who wrote it.
123
+
124
+ Thus, it is not the intent of this section to claim rights or contest
125
+ your rights to work written entirely by you; rather, the intent is to
126
+ exercise the right to control the distribution of derivative or
127
+ collective works based on the Program.
128
+
129
+ In addition, mere aggregation of another work not based on the Program
130
+ with the Program (or with a work based on the Program) on a volume of
131
+ a storage or distribution medium does not bring the other work under
132
+ the scope of this License.
133
+
134
+ 3. You may copy and distribute the Program (or a work based on it,
135
+ under Section 2) in object code or executable form under the terms of
136
+ Sections 1 and 2 above provided that you also do one of the following:
137
+
138
+ a) Accompany it with the complete corresponding machine-readable
139
+ source code, which must be distributed under the terms of Sections
140
+ 1 and 2 above on a medium customarily used for software interchange; or,
141
+
142
+ b) Accompany it with a written offer, valid for at least three
143
+ years, to give any third party, for a charge no more than your
144
+ cost of physically performing source distribution, a complete
145
+ machine-readable copy of the corresponding source code, to be
146
+ distributed under the terms of Sections 1 and 2 above on a medium
147
+ customarily used for software interchange; or,
148
+
149
+ c) Accompany it with the information you received as to the offer
150
+ to distribute corresponding source code. (This alternative is
151
+ allowed only for noncommercial distribution and only if you
152
+ received the program in object code or executable form with such
153
+ an offer, in accord with Subsection b above.)
154
+
155
+ The source code for a work means the preferred form of the work for
156
+ making modifications to it. For an executable work, complete source
157
+ code means all the source code for all modules it contains, plus any
158
+ associated interface definition files, plus the scripts used to
159
+ control compilation and installation of the executable. However, as a
160
+ special exception, the source code distributed need not include
161
+ anything that is normally distributed (in either source or binary
162
+ form) with the major components (compiler, kernel, and so on) of the
163
+ operating system on which the executable runs, unless that component
164
+ itself accompanies the executable.
165
+
166
+ If distribution of executable or object code is made by offering
167
+ access to copy from a designated place, then offering equivalent
168
+ access to copy the source code from the same place counts as
169
+ distribution of the source code, even though third parties are not
170
+ compelled to copy the source along with the object code.
171
+
172
+ 4. You may not copy, modify, sublicense, or distribute the Program
173
+ except as expressly provided under this License. Any attempt
174
+ otherwise to copy, modify, sublicense or distribute the Program is
175
+ void, and will automatically terminate your rights under this License.
176
+ However, parties who have received copies, or rights, from you under
177
+ this License will not have their licenses terminated so long as such
178
+ parties remain in full compliance.
179
+
180
+ 5. You are not required to accept this License, since you have not
181
+ signed it. However, nothing else grants you permission to modify or
182
+ distribute the Program or its derivative works. These actions are
183
+ prohibited by law if you do not accept this License. Therefore, by
184
+ modifying or distributing the Program (or any work based on the
185
+ Program), you indicate your acceptance of this License to do so, and
186
+ all its terms and conditions for copying, distributing or modifying
187
+ the Program or works based on it.
188
+
189
+ 6. Each time you redistribute the Program (or any work based on the
190
+ Program), the recipient automatically receives a license from the
191
+ original licensor to copy, distribute or modify the Program subject to
192
+ these terms and conditions. You may not impose any further
193
+ restrictions on the recipients' exercise of the rights granted herein.
194
+ You are not responsible for enforcing compliance by third parties to
195
+ this License.
196
+
197
+ 7. If, as a consequence of a court judgment or allegation of patent
198
+ infringement or for any other reason (not limited to patent issues),
199
+ conditions are imposed on you (whether by court order, agreement or
200
+ otherwise) that contradict the conditions of this License, they do not
201
+ excuse you from the conditions of this License. If you cannot
202
+ distribute so as to satisfy simultaneously your obligations under this
203
+ License and any other pertinent obligations, then as a consequence you
204
+ may not distribute the Program at all. For example, if a patent
205
+ license would not permit royalty-free redistribution of the Program by
206
+ all those who receive copies directly or indirectly through you, then
207
+ the only way you could satisfy both it and this License would be to
208
+ refrain entirely from distribution of the Program.
209
+
210
+ If any portion of this section is held invalid or unenforceable under
211
+ any particular circumstance, the balance of the section is intended to
212
+ apply and the section as a whole is intended to apply in other
213
+ circumstances.
214
+
215
+ It is not the purpose of this section to induce you to infringe any
216
+ patents or other property right claims or to contest validity of any
217
+ such claims; this section has the sole purpose of protecting the
218
+ integrity of the free software distribution system, which is
219
+ implemented by public license practices. Many people have made
220
+ generous contributions to the wide range of software distributed
221
+ through that system in reliance on consistent application of that
222
+ system; it is up to the author/donor to decide if he or she is willing
223
+ to distribute software through any other system and a licensee cannot
224
+ impose that choice.
225
+
226
+ This section is intended to make thoroughly clear what is believed to
227
+ be a consequence of the rest of this License.
228
+
229
+ 8. If the distribution and/or use of the Program is restricted in
230
+ certain countries either by patents or by copyrighted interfaces, the
231
+ original copyright holder who places the Program under this License
232
+ may add an explicit geographical distribution limitation excluding
233
+ those countries, so that distribution is permitted only in or among
234
+ countries not thus excluded. In such case, this License incorporates
235
+ the limitation as if written in the body of this License.
236
+
237
+ 9. The Free Software Foundation may publish revised and/or new versions
238
+ of the General Public License from time to time. Such new versions will
239
+ be similar in spirit to the present version, but may differ in detail to
240
+ address new problems or concerns.
241
+
242
+ Each version is given a distinguishing version number. If the Program
243
+ specifies a version number of this License which applies to it and "any
244
+ later version", you have the option of following the terms and conditions
245
+ either of that version or of any later version published by the Free
246
+ Software Foundation. If the Program does not specify a version number of
247
+ this License, you may choose any version ever published by the Free Software
248
+ Foundation.
249
+
250
+ 10. If you wish to incorporate parts of the Program into other free
251
+ programs whose distribution conditions are different, write to the author
252
+ to ask for permission. For software which is copyrighted by the Free
253
+ Software Foundation, write to the Free Software Foundation; we sometimes
254
+ make exceptions for this. Our decision will be guided by the two goals
255
+ of preserving the free status of all derivatives of our free software and
256
+ of promoting the sharing and reuse of software generally.
257
+
258
+ NO WARRANTY
259
+
260
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
261
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
262
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
263
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
264
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
265
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
266
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
267
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
268
+ REPAIR OR CORRECTION.
269
+
270
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
271
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
272
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
273
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
274
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
275
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
276
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
277
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
278
+ POSSIBILITY OF SUCH DAMAGES.
279
+
280
+ END OF TERMS AND CONDITIONS
281
+
282
+ How to Apply These Terms to Your New Programs
283
+
284
+ If you develop a new program, and you want it to be of the greatest
285
+ possible use to the public, the best way to achieve this is to make it
286
+ free software which everyone can redistribute and change under these terms.
287
+
288
+ To do so, attach the following notices to the program. It is safest
289
+ to attach them to the start of each source file to most effectively
290
+ convey the exclusion of warranty; and each file should have at least
291
+ the "copyright" line and a pointer to where the full notice is found.
292
+
293
+ <one line to give the program's name and a brief idea of what it does.>
294
+ Copyright (C) <year> <name of author>
295
+
296
+ This program is free software; you can redistribute it and/or modify
297
+ it under the terms of the GNU General Public License as published by
298
+ the Free Software Foundation; either version 2 of the License, or
299
+ (at your option) any later version.
300
+
301
+ This program is distributed in the hope that it will be useful,
302
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
303
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304
+ GNU General Public License for more details.
305
+
306
+ You should have received a copy of the GNU General Public License along
307
+ with this program; if not, write to the Free Software Foundation, Inc.,
308
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309
+
310
+ Also add information on how to contact you by electronic and paper mail.
311
+
312
+ If the program is interactive, make it output a short notice like this
313
+ when it starts in an interactive mode:
314
+
315
+ Gnomovision version 69, Copyright (C) year name of author
316
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317
+ This is free software, and you are welcome to redistribute it
318
+ under certain conditions; type `show c' for details.
319
+
320
+ The hypothetical commands `show w' and `show c' should show the appropriate
321
+ parts of the General Public License. Of course, the commands you use may
322
+ be called something other than `show w' and `show c'; they could even be
323
+ mouse-clicks or menu items--whatever suits your program.
324
+
325
+ You should also get your employer (if you work as a programmer) or your
326
+ school, if any, to sign a "copyright disclaimer" for the program, if
327
+ necessary. Here is a sample; alter the names:
328
+
329
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
+
332
+ <signature of Ty Coon>, 1 April 1989
333
+ Ty Coon, President of Vice
334
+
335
+ This General Public License does not permit incorporating your program into
336
+ proprietary programs. If your program is a subroutine library, you may
337
+ consider it more useful to permit linking proprietary applications with the
338
+ library. If this is what you want to do, use the GNU Lesser General
339
+ Public License instead of this License.
addons/members-role-levels/readme.md ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Members - Role Levels
2
+
3
+ Members - Role Levels is an add-on plugin for the [Members plugin](http://themehybrid.com/plugins/members) that provides access to the old user levels system.
4
+
5
+ The plugin fixes a longstanding [WordPress bug](https://core.trac.wordpress.org/ticket/16841) in which users don't appear in the author drop-down on the edit post screen.
6
+
7
+ ## The author drop-down issue
8
+
9
+ In WordPress 2.1, user levels were deprecated and replaced with the newer roles and caps system. Roles and caps make for a far superior system for managing user permissions. However, parts of core WordPress still require the use of user levels to function correctly. One item in particular is the author drop-down on the edit posts screen.
10
+
11
+ The author drop-down requires that the `user_level` be set to 1 or higher for a user in order for that user to appear in the drop-down, even if that user has the `edit_posts` capability (or whatever capability is required for your post type). So, when you create custom roles without one of the available levels, new users won't get the appropriate user level nor will they appear in the author drop-down.
12
+
13
+ It's a mess that should've been cleaned up in core WP ages ago. This plugin corrects this mess behind the scenes and provides a nice UI on the Edit Role screen for managing levels on a per-role basis.
14
+
15
+ If none of this makes sense to you, just know that it will correct the issue if you have users who are not correctly appearing in the author drop-down.
16
+
17
+ ## Professional Support
18
+
19
+ If you need professional plugin support from me, the plugin author, you can access the support forums at [Theme Hybrid](http://themehybrid.com/board/topics), which is a professional WordPress help/support site where I handle support for all my plugins and themes for a community of 60,000+ users (and growing).
20
+
21
+ ## Copyright and License
22
+
23
+ This project is licensed under the [GNU GPL](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html), version 2 or later.
24
+
25
+ 2015 &copy; [Justin Tadlock](http://justintadlock.com).
26
+
27
+ ## Documentation
28
+
29
+ The use of this plugin is fairly straightforward. You must have the [Members plugin](http://themehybrid.com/plugins/members) installed and activated to use this plugin.
30
+
31
+ ### Usage
32
+
33
+ The Users > Roles screen in the admin will get a new "Level" column. This column will show the level for each of the roles.
34
+
35
+ The Edit/New Role screens will have a meta box labeled "Level". You simply need to select one of the available levels and update/create the role. The selected level will be saved.
36
+
37
+ ### Fixing the author drop-down
38
+
39
+ Role levels are "translated" to user levels. So, if your role has level 5, each of its users will have level 5. In order for a user to appear in the post author drop-down, that user needs at least level 1.
40
+
41
+ Of course, the user's role must also have the appropriate capabilities for editing posts as well (e.g., `edit_posts`). The level just makes sure users appear where appropriate.
42
+
43
+ ### Only levels 0 - 10?
44
+
45
+ Yes, those are the only available levels. This is a limitation of the old user levels system. So, you can't add custom levels (not that you should need to).
46
+
47
+ ### Does this make roles hierarchical?
48
+
49
+ No, not really. Theoretically, you could build on top of this for hierarchical roles. But, this plugin is merely for providing access to the old user levels system.
50
+
51
+ ### Roles with many users
52
+
53
+ When you update a role that has many users (1,000s or more), it could be very slow, depending on your server. When a role level is updated, every single user of that role is going to be updated in the database. It's impossible or me to say what the upper limit is on your server, but it should be noted that this could be an issue.
addons/members-role-levels/screenshot-1.png ADDED
Binary file
addons/members-role-levels/screenshot-2.png ADDED
Binary file
addons/members-role-levels/screenshot-3.png ADDED
Binary file
addons/members-woocommerce-integration/.gitignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ /node_modules
2
+ /vendor
3
+ /composer.lock
4
+ /phpcs.xml
5
+ /.phpcs.xml
6
+ *.map
addons/members-woocommerce-integration/addon.php ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Members\Integration\WooCommerce;
4
+
5
+ # Don't execute code if file is file is accessed directly.
6
+ defined( 'ABSPATH' ) || exit;
7
+
8
+ # Bootstrap plugin.
9
+ require_once 'src/functions-filters.php';
10
+ require_once 'src/functions-caps.php';
11
+ require_once 'src/functions-roles.php';
addons/members-woocommerce-integration/changelog.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ # Change Log
2
+
3
+ ## [1.0.0] - 2019-08-16
4
+
5
+ ### Added
6
+
7
+ - Plugin launch. Everything's new!
addons/members-woocommerce-integration/package-lock.json ADDED
@@ -0,0 +1,227 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-woocommerce-integration",
3
+ "requires": true,
4
+ "lockfileVersion": 1,
5
+ "dependencies": {
6
+ "balanced-match": {
7
+ "version": "1.0.0",
8
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
9
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
10
+ "dev": true
11
+ },
12
+ "bluebird": {
13
+ "version": "3.5.5",
14
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
15
+ "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
16
+ "dev": true
17
+ },
18
+ "brace-expansion": {
19
+ "version": "1.1.11",
20
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
21
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
22
+ "dev": true,
23
+ "requires": {
24
+ "balanced-match": "^1.0.0",
25
+ "concat-map": "0.0.1"
26
+ }
27
+ },
28
+ "concat-map": {
29
+ "version": "0.0.1",
30
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
31
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
32
+ "dev": true
33
+ },
34
+ "encoding": {
35
+ "version": "0.1.12",
36
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
37
+ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
38
+ "dev": true,
39
+ "requires": {
40
+ "iconv-lite": "~0.4.13"
41
+ }
42
+ },
43
+ "fs.realpath": {
44
+ "version": "1.0.0",
45
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
46
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
47
+ "dev": true
48
+ },
49
+ "gettext-parser": {
50
+ "version": "3.1.1",
51
+ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-3.1.1.tgz",
52
+ "integrity": "sha512-vNhWcqXEtZPs5Ft1ReA34g7ByWotpcOIeJvXVy2jF3/G2U9v6W0wG4Z4hXzcU8R//jArqkgHcVCGgGqa4vxVlQ==",
53
+ "dev": true,
54
+ "requires": {
55
+ "encoding": "^0.1.12",
56
+ "readable-stream": "^3.2.0",
57
+ "safe-buffer": "^5.1.2"
58
+ }
59
+ },
60
+ "glob": {
61
+ "version": "7.1.4",
62
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
63
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
64
+ "dev": true,
65
+ "requires": {
66
+ "fs.realpath": "^1.0.0",
67
+ "inflight": "^1.0.4",
68
+ "inherits": "2",
69
+ "minimatch": "^3.0.4",
70
+ "once": "^1.3.0",
71
+ "path-is-absolute": "^1.0.0"
72
+ }
73
+ },
74
+ "iconv-lite": {
75
+ "version": "0.4.24",
76
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
77
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
78
+ "dev": true,
79
+ "requires": {
80
+ "safer-buffer": ">= 2.1.2 < 3"
81
+ }
82
+ },
83
+ "inflight": {
84
+ "version": "1.0.6",
85
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
86
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
87
+ "dev": true,
88
+ "requires": {
89
+ "once": "^1.3.0",
90
+ "wrappy": "1"
91
+ }
92
+ },
93
+ "inherits": {
94
+ "version": "2.0.4",
95
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
96
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
97
+ "dev": true
98
+ },
99
+ "lodash": {
100
+ "version": "4.17.15",
101
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
102
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
103
+ "dev": true
104
+ },
105
+ "minimatch": {
106
+ "version": "3.0.4",
107
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
108
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
109
+ "dev": true,
110
+ "requires": {
111
+ "brace-expansion": "^1.1.7"
112
+ }
113
+ },
114
+ "minimist": {
115
+ "version": "1.2.0",
116
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
117
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
118
+ "dev": true
119
+ },
120
+ "mkdirp": {
121
+ "version": "0.5.1",
122
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
123
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
124
+ "dev": true,
125
+ "requires": {
126
+ "minimist": "0.0.8"
127
+ },
128
+ "dependencies": {
129
+ "minimist": {
130
+ "version": "0.0.8",
131
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
132
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
133
+ "dev": true
134
+ }
135
+ }
136
+ },
137
+ "node-wp-i18n": {
138
+ "version": "1.2.3",
139
+ "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.2.3.tgz",
140
+ "integrity": "sha512-YMzMcsjXbGYDB9vHyb289CYXAGmXhcNLbeTlOnWgPNkZd9xrovcbRd7cQyKd9BQHOjS7Nw8WCbJ7nvtR7rc0rg==",
141
+ "dev": true,
142
+ "requires": {
143
+ "bluebird": "^3.4.1",
144
+ "gettext-parser": "^3.1.0",
145
+ "glob": "^7.0.5",
146
+ "lodash": "^4.14.2",
147
+ "minimist": "^1.2.0",
148
+ "mkdirp": "^0.5.1",
149
+ "tmp": "^0.0.33"
150
+ }
151
+ },
152
+ "once": {
153
+ "version": "1.4.0",
154
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
155
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
156
+ "dev": true,
157
+ "requires": {
158
+ "wrappy": "1"
159
+ }
160
+ },
161
+ "os-tmpdir": {
162
+ "version": "1.0.2",
163
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
164
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
165
+ "dev": true
166
+ },
167
+ "path-is-absolute": {
168
+ "version": "1.0.1",
169
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
170
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
171
+ "dev": true
172
+ },
173
+ "readable-stream": {
174
+ "version": "3.4.0",
175
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
176
+ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
177
+ "dev": true,
178
+ "requires": {
179
+ "inherits": "^2.0.3",
180
+ "string_decoder": "^1.1.1",
181
+ "util-deprecate": "^1.0.1"
182
+ }
183
+ },
184
+ "safe-buffer": {
185
+ "version": "5.2.0",
186
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
187
+ "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
188
+ "dev": true
189
+ },
190
+ "safer-buffer": {
191
+ "version": "2.1.2",
192
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
193
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
194
+ "dev": true
195
+ },
196
+ "string_decoder": {
197
+ "version": "1.3.0",
198
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
199
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
200
+ "dev": true,
201
+ "requires": {
202
+ "safe-buffer": "~5.2.0"
203
+ }
204
+ },
205
+ "tmp": {
206
+ "version": "0.0.33",
207
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
208
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
209
+ "dev": true,
210
+ "requires": {
211
+ "os-tmpdir": "~1.0.2"
212
+ }
213
+ },
214
+ "util-deprecate": {
215
+ "version": "1.0.2",
216
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
217
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
218
+ "dev": true
219
+ },
220
+ "wrappy": {
221
+ "version": "1.0.2",
222
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
223
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
224
+ "dev": true
225
+ }
226
+ }
227
+ }
addons/members-woocommerce-integration/package.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "members-woocommerce-integration",
3
+ "author": "Justin Tadlock",
4
+ "license": "GPL-2.0+",
5
+ "homepage": "https://themehybrid.com/plugins/members-woocommerce-integration",
6
+ "main": "resources/js/app.js",
7
+ "scripts": {
8
+ "i18n": "npm run i18n:textdomain && npm run i18n:pot",
9
+ "i18n:textdomain": "npx wpi18n addtextdomain --exclude=vendor,node_modules",
10
+ "i18n:pot": "npx wpi18n makepot --domain-path=/resources/lang"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/justintadlock/members-woocommerce-integration.git"
15
+ },
16
+ "bugs": {
17
+ "url": "https://github.com/justintadlock/members-woocommerce-integration/issues"
18
+ },
19
+ "devDependencies": {
20
+ "node-wp-i18n": "^1.2.3"
21
+ },
22
+ "dependencies": {}
23
+ }
addons/members-woocommerce-integration/readme.md ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Members - WooCommerce Integration
2
+
3
+ The Members - WooCommerce Integration add-on more nicely integrates the [WooCommerce](https://woocommerce.com/) plugin capabilities into the Members plugin's role manager.
4
+
5
+ The [Members plugin](https://themehybrid.com/plugins/members) and the WooCommerce plugin are required to be installed and activated for this plugin to work.
6
+
7
+ ## WooCommerce Role Group
8
+
9
+ The plugin creates a new role group for WooCommerce, which is located under the Users > Roles screen in the admin. This role group lists the following roles:
10
+
11
+ - Customer
12
+ - Any other roles that have WooCommerce-related capabilities.
13
+
14
+ This allows you to see any roles that have WooCommerce permissions at a glance.
15
+
16
+ ## WooCommerce Capability Group
17
+
18
+ When editing or creating a new role in Members, this add-on creates a new "WooCommerce" tab (cap group). This tab combines all of the WooCommerce capabilities in one place. That way, you can see all available caps without jumping between different tabs.
19
+
20
+ ## Copyright and License
21
+
22
+ This project is licensed under the [GNU GPL](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html), version 2 or later.
23
+
24
+ 2019 &copy; [Justin Tadlock](http://justintadlock.com).
addons/members-woocommerce-integration/src/functions-caps.php ADDED
@@ -0,0 +1,273 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Capability Functions.
4
+ *
5
+ * @package MembersIntegrationWooCommerce
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-woocommerce-integration
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\Integration\WooCommerce;
13
+
14
+ # Don't execute code if file is accessed directly.
15
+ defined( 'ABSPATH' ) || exit;
16
+
17
+ /**
18
+ * Returns an array of the WooCommerce plugin capabilities.
19
+ *
20
+ * @since 1.0.0
21
+ * @access public
22
+ * @return array
23
+ */
24
+ function woocommerce_caps() {
25
+
26
+ return [
27
+ // Plugin caps.
28
+ 'manage_woocommerce' => [
29
+ 'label' => __( 'Manage WooCommerce', 'members' ),
30
+ 'description' => __( 'Allows access to manage the WooCommerce plugin settings.', 'members' )
31
+ ],
32
+
33
+ // Report caps.
34
+ 'view_woocommerce_reports' => [
35
+ 'label' => __( 'Reports: View', 'members' ),
36
+ 'description' => __( 'Allows access to view reports.', 'members' )
37
+ ],
38
+
39
+ // Product caps.
40
+ 'edit_products' => [
41
+ 'label' => __( 'Products: Edit', 'members' ),
42
+ 'description' => sprintf(
43
+ __( "Allows users to edit products. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
44
+ '<code>edit_*_products</code>'
45
+ )
46
+ ],
47
+
48
+ 'edit_others_products' => [
49
+ 'label' => __( "Products: Edit Others'", 'members' ),
50
+ 'description' => __( "Allows users to edit other user's products.", 'members' )
51
+ ],
52
+
53
+ 'edit_private_products' => [
54
+ 'label' => __( 'Products: Edit Private', 'members' ),
55
+ 'description' => __( 'Allows users to edit private products.', 'members' )
56
+ ],
57
+
58
+ 'edit_published_products' => [
59
+ 'label' => __( 'Products: Edit Published', 'members' ),
60
+ 'description' => __( 'Allows users to edit published products.', 'members' )
61
+ ],
62
+
63
+ 'publish_products' => [
64
+ 'label' => __( 'Products: Publish', 'members' ),
65
+ 'description' => __( 'Allows users to publish products.', 'members' )
66
+ ],
67
+
68
+ 'read_private_products' => [
69
+ 'label' => __( 'Products: Read Private', 'members' ),
70
+ 'description' => __( 'Allows users to read private products.', 'members' )
71
+ ],
72
+
73
+ 'delete_products' => [
74
+ 'label' => __( 'Products: Delete', 'members' ),
75
+ 'description' => sprintf(
76
+ __( "Allows users to delete products. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
77
+ '<code>delete_*_products</code>'
78
+ )
79
+ ],
80
+
81
+ 'delete_private_products' => [
82
+ 'label' => __( 'Products: Delete Private', 'members' ),
83
+ 'description' => __( 'Allows users to delete private products.', 'members' )
84
+ ],
85
+
86
+ 'delete_others_products' => [
87
+ 'label' => __( "Products: Delete Others'", 'members' ),
88
+ 'description' => __( "Allows users to delete other users' products.", 'members' )
89
+ ],
90
+
91
+ 'delete_published_products' => [
92
+ 'label' => __( 'Products: Delete Published', 'members' ),
93
+ 'description' => __( 'Allows users to delete published products.', 'members' )
94
+ ],
95
+
96
+ // Product taxonomy caps.
97
+ 'assign_product_terms' => [
98
+ 'label' => __( 'Products: Assign Taxonomy Terms', 'members' ),
99
+ 'description' => __( 'Allows users to assign taxonomy terms to products.', 'members' )
100
+ ],
101
+
102
+ 'edit_product_terms' => [
103
+ 'label' => __( 'Products: Edit Taxonomy Terms', 'members' ),
104
+ 'description' => __( 'Allows users to edit product taxonomy terms.', 'members' )
105
+ ],
106
+
107
+ 'delete_product_terms' => [
108
+ 'label' => __( 'Products: Delete Taxonomy Terms', 'members' ),
109
+ 'description' => __( 'Allows users to delete product taxonomy terms.', 'members' )
110
+ ],
111
+
112
+ 'manage_product_terms' => [
113
+ 'label' => __( 'Products: Manage Taxonomy Terms', 'members' ),
114
+ 'description' => __( 'Allows access to product taxonomy management screens.', 'members' )
115
+ ],
116
+
117
+ // Order caps.
118
+ 'edit_shop_orders' => [
119
+ 'label' => __( 'Orders: Edit', 'members' ),
120
+ 'description' => sprintf(
121
+ __( "Allows users to edit orders. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
122
+ '<code>edit_*_shop_orders</code>'
123
+ )
124
+ ],
125
+
126
+ 'edit_others_shop_orders' => [
127
+ 'label' => __( "Orders: Edit Others'", 'members' ),
128
+ 'description' => __( "Allows users to edit other user's orders.", 'members' )
129
+ ],
130
+
131
+ 'edit_private_shop_orders' => [
132
+ 'label' => __( 'Orders: Edit Private', 'members' ),
133
+ 'description' => __( 'Allows users to edit private orders.', 'members' )
134
+ ],
135
+
136
+ 'edit_published_shop_orders' => [
137
+ 'label' => __( 'Orders: Edit Published', 'members' ),
138
+ 'description' => __( 'Allows users to edit published orders.', 'members' )
139
+ ],
140
+
141
+ 'publish_shop_orders' => [
142
+ 'label' => __( 'Orders: Publish', 'members' ),
143
+ 'description' => __( 'Allows users to publish orders.', 'members' )
144
+ ],
145
+
146
+ 'read_private_shop_orders' => [
147
+ 'label' => __( 'Orders: Read Private', 'members' ),
148
+ 'description' => __( 'Allows users to read private orders.', 'members' )
149
+ ],
150
+
151
+ 'delete_shop_orders' => [
152
+ 'label' => __( 'Orders: Delete', 'members' ),
153
+ 'description' => sprintf(
154
+ __( "Allows users to delete orders. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
155
+ '<code>delete_*_shop_orders</code>'
156
+ )
157
+ ],
158
+
159
+ 'delete_private_shop_orders' => [
160
+ 'label' => __( 'Orders: Delete Private', 'members' ),
161
+ 'description' => __( 'Allows users to delete private orders.', 'members' )
162
+ ],
163
+
164
+ 'delete_others_shop_orders' => [
165
+ 'label' => __( "Orders: Delete Others'", 'members' ),
166
+ 'description' => __( "Allows users to delete other users' orders.", 'members' )
167
+ ],
168
+
169
+ 'delete_published_shop_orders' => [
170
+ 'label' => __( 'Orders: Delete Published', 'members' ),
171
+ 'description' => __( 'Allows users to delete published orders.', 'members' )
172
+ ],
173
+
174
+ // Order taxonomy caps.
175
+ 'assign_shop_order_terms' => [
176
+ 'label' => __( 'Orders: Assign Taxonomy Terms', 'members' ),
177
+ 'description' => __( 'Allows users to assign taxonomy terms to orders.', 'members' )
178
+ ],
179
+
180
+ 'edit_shop_order_terms' => [
181
+ 'label' => __( 'Orders: Edit Taxonomy Terms', 'members' ),
182
+ 'description' => __( 'Allows users to edit order taxonomy terms.', 'members' )
183
+ ],
184
+
185
+ 'delete_shop_order_terms' => [
186
+ 'label' => __( 'Orders: Delete Taxonomy Terms', 'members' ),
187
+ 'description' => __( 'Allows users to delete order taxonomy terms.', 'members' )
188
+ ],
189
+
190
+ 'manage_shop_order_terms' => [
191
+ 'label' => __( 'Orders: Manage Taxonomy Terms', 'members' ),
192
+ 'description' => __( 'Allows access to order taxonomy management screens.', 'members' )
193
+ ],
194
+
195
+ // Coupon caps.
196
+ 'edit_shop_coupons' => [
197
+ 'label' => __( 'Coupons: Edit', 'members' ),
198
+ 'description' => sprintf(
199
+ __( "Allows users to edit coupons. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
200
+ '<code>edit_*_shop_coupons</code>'
201
+ )
202
+ ],
203
+
204
+ 'edit_others_shop_coupons' => [
205
+ 'label' => __( "Coupons: Edit Others'", 'members' ),
206
+ 'description' => __( "Allows users to edit other user's coupons.", 'members' )
207
+ ],
208
+
209
+ 'edit_private_shop_coupons' => [
210
+ 'label' => __( 'Coupons: Edit Private', 'members' ),
211
+ 'description' => __( 'Allows users to edit private coupons.', 'members' )
212
+ ],
213
+
214
+ 'edit_published_shop_coupons' => [
215
+ 'label' => __( 'Coupons: Edit Published', 'members' ),
216
+ 'description' => __( 'Allows users to edit published coupons.', 'members' )
217
+ ],
218
+
219
+ 'publish_shop_coupons' => [
220
+ 'label' => __( 'Coupons: Publish', 'members' ),
221
+ 'description' => __( 'Allows users to publish coupons.', 'members' )
222
+ ],
223
+
224
+ 'read_private_shop_coupons' => [
225
+ 'label' => __( 'Coupons: Read Private', 'members' ),
226
+ 'description' => __( 'Allows users to read private coupons.', 'members' )
227
+ ],
228
+
229
+ 'delete_shop_coupons' => [
230
+ 'label' => __( 'Coupons: Delete', 'members' ),
231
+ 'description' => sprintf(
232
+ __( "Allows users to delete coupons. May need to be combined with other %s capabilities, depending on the scenario.", 'members' ),
233
+ '<code>delete_*_shop_coupons</code>'
234
+ )
235
+ ],
236
+
237
+ 'delete_private_shop_coupons' => [
238
+ 'label' => __( 'Coupons: Delete Private', 'members' ),
239
+ 'description' => __( 'Allows users to delete private coupons.', 'members' )
240
+ ],
241
+
242
+ 'delete_others_shop_coupons' => [
243
+ 'label' => __( "Coupons: Delete Others'", 'members' ),
244
+ 'description' => __( "Allows users to delete other users' coupons.", 'members' )
245
+ ],
246
+
247
+ 'delete_published_shop_coupons' => [
248
+ 'label' => __( 'Coupons: Delete Published', 'members' ),
249
+ 'description' => __( 'Allows users to delete published coupons.', 'members' )
250
+ ],
251
+
252
+ // Coupon taxonomy caps.
253
+ 'assign_shop_coupon_terms' => [
254
+ 'label' => __( 'Coupons: Assign Taxonomy Terms', 'members' ),
255
+ 'description' => __( 'Allows users to assign taxonomy terms to coupons.', 'members' )
256
+ ],
257
+
258
+ 'edit_shop_coupon_terms' => [
259
+ 'label' => __( 'Coupons: Edit Taxonomy Terms', 'members' ),
260
+ 'description' => __( 'Allows users to edit coupon taxonomy terms.', 'members' )
261
+ ],
262
+
263
+ 'delete_shop_coupon_terms' => [
264
+ 'label' => __( 'Coupons: Delete Taxonomy Terms', 'members' ),
265
+ 'description' => __( 'Allows users to delete coupon taxonomy terms.', 'members' )
266
+ ],
267
+
268
+ 'manage_shop_coupon_terms' => [
269
+ 'label' => __( 'Coupons: Manage Taxonomy Terms', 'members' ),
270
+ 'description' => __( 'Allows access to coupon taxonomy management screens.', 'members' )
271
+ ]
272
+ ];
273
+ }
addons/members-woocommerce-integration/src/functions-filters.php ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin Filters.
4
+ *
5
+ * @package MembersIntegrationWooCommerce
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-woocommerce-integration
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\Integration\WooCommerce;
13
+
14
+ use function members_register_cap;
15
+ use function members_register_cap_group;
16
+ use function members_register_role_group;
17
+ use function members_unregister_cap_group;
18
+
19
+ # Don't execute code if file is accessed directly.
20
+ defined( 'ABSPATH' ) || exit;
21
+
22
+ /**
23
+ * Registers custom role groups.
24
+ *
25
+ * @since 1.0.0
26
+ * @access public
27
+ * @return void
28
+ */
29
+ add_action( 'members_register_role_groups', function() {
30
+
31
+ $roles = woocommerce_roles();
32
+
33
+ // Add the plugin-specific role group only if the WooCommerce plugin is active
34
+ // and there are existing roles with plugin-specific caps.
35
+ if ( class_exists( 'WooCommerce' ) && $roles ) {
36
+ members_register_role_group( 'plugin-woocommerce', [
37
+ 'label' => esc_html__( 'WooCommerce', 'members' ),
38
+ 'label_count' => _n_noop( 'WooCommerce %s', 'WooCommerce %s', 'members' ),
39
+ 'roles' => $roles,
40
+ ] );
41
+ }
42
+ } );
43
+
44
+ /**
45
+ * Registers custom cap groups.
46
+ *
47
+ * @since 1.0.0
48
+ * @access public
49
+ * @return void
50
+ */
51
+ add_action( 'members_register_cap_groups', function() {
52
+
53
+ // Only run if we have the `product` post type.
54
+ if ( $type = get_post_type_object( 'product' ) ) {
55
+
56
+ $groups = [
57
+ 'product',
58
+ 'product_variation',
59
+ 'shop_order_refund',
60
+ 'shop_coupon',
61
+ 'shop_order'
62
+ ];
63
+
64
+ // Unregister any cap groups already registered for the plugin's
65
+ // custom post types.
66
+ foreach ( $groups as $group ) {
67
+ members_unregister_cap_group( "type-{$group}" );
68
+ }
69
+
70
+ // Register a cap group for the WooCommerce plugin.
71
+ members_register_cap_group( 'plugin-woocommerce', [
72
+ 'label' => esc_html__( 'WooCommerce', 'members' ),
73
+ 'icon' => 'dashicons-cart',
74
+ 'priority' => 11,
75
+ 'caps' => array_keys( woocommerce_caps() )
76
+ ] );
77
+ }
78
+
79
+ } );
80
+
81
+ /**
82
+ * Registers the WooCommerce plugin capabilities.
83
+ *
84
+ * @since 1.0.0
85
+ * @access public
86
+ * @return void
87
+ */
88
+ add_action( 'members_register_caps', function() {
89
+
90
+ if ( class_exists( 'WooCommerce' ) ) {
91
+
92
+ foreach ( woocommerce_caps() as $name => $options ) {
93
+
94
+ members_register_cap( $name, [
95
+ 'label' => $options['label'],
96
+ 'description' => $options['description']
97
+ ] );
98
+ }
99
+ }
100
+
101
+ } );
addons/members-woocommerce-integration/src/functions-roles.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Role Functions.
4
+ *
5
+ * @package MembersIntegrationWooCommerce
6
+ * @author Justin Tadlock <justintadlock@gmail.com>
7
+ * @copyright 2019, Justin Tadlock
8
+ * @link https://themehybrid.com/plugins/members-woocommerce-integration
9
+ * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0-or-later
10
+ */
11
+
12
+ namespace Members\Integration\WooCommerce;
13
+
14
+ use function members_get_roles;
15
+ use function members_role_exists;
16
+
17
+ # Don't execute code if file is accessed directly.
18
+ defined( 'ABSPATH' ) || exit;
19
+
20
+ /**
21
+ * Returns an array of the WooCommerce plugin roles.
22
+ *
23
+ * @since 1.0.0
24
+ * @access public
25
+ * @return array
26
+ */
27
+ function woocommerce_roles() {
28
+
29
+ $roles = [];
30
+
31
+ $woocommerce_roles = [
32
+ // Core WooCommerce plugin roles.
33
+ 'customer',
34
+ 'shop_manager'
35
+ ];
36
+
37
+ // Specifically add the WooCommerce plugin's roles. We need to check that
38
+ // these exist in case a user decides to delete them or in case the role
39
+ // is from an add-on that's not installed.
40
+ foreach ( $woocommerce_roles as $role ) {
41
+ if ( members_role_exists( $role ) ) {
42
+ $roles[] = $role;
43
+ }
44
+ }
45
+
46
+ // Add any roles that have any of the WooCommerce capabilities to the group.
47
+ $role_objects = members_get_roles();
48
+
49
+ $woocommerce_caps = array_keys( woocommerce_caps() );
50
+
51
+ foreach ( $role_objects as $role ) {
52
+
53
+ if ( 0 < count( array_intersect( $woocommerce_caps, (array) $role->get( 'granted_caps' ) ) ) ) {
54
+ $roles[] = $role->get( 'name' );
55
+ }
56
+ }
57
+
58
+ return $roles;
59
+ }
admin/class-addon.php CHANGED
@@ -1,173 +1,179 @@
1
- <?php
2
- /**
3
- * Class for handling an add-on object.
4
- *
5
- * @package Members
6
- * @subpackage Admin
7
- * @author Justin Tadlock <justintadlock@gmail.com>
8
- * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
- * @link https://themehybrid.com/plugins/members
10
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
- */
12
-
13
- namespace Members;
14
-
15
- /**
16
- * Add-on object class.
17
- *
18
- * @since 2.0.0
19
- * @access public
20
- */
21
- final class Addon {
22
-
23
- /**
24
- * Name/ID for the addon.
25
- *
26
- * @since 2.0.0
27
- * @access protected
28
- * @var string
29
- */
30
- public $name = '';
31
-
32
- /**
33
- * Title of the add-on.
34
- *
35
- * @since 2.0.0
36
- * @access protected
37
- * @var string
38
- */
39
- public $title = '';
40
-
41
- /**
42
- * Short description of the add-on.
43
- *
44
- * @since 2.0.0
45
- * @access protected
46
- * @var string
47
- */
48
- public $excerpt = '';
49
-
50
- /**
51
- * URL where the add-on can be found.
52
- *
53
- * @since 2.0.0
54
- * @access protected
55
- * @var string
56
- */
57
- public $url = 'https://themehybrid.com/plugins/members';
58
-
59
- /**
60
- * Add-on ZIP file URL.
61
- *
62
- * @since 2.0.0
63
- * @access protected
64
- * @var string
65
- */
66
- public $download_url = '';
67
-
68
- /**
69
- * Alternate purchase URL.
70
- *
71
- * @since 2.0.0
72
- * @access protected
73
- * @var string
74
- */
75
- public $purchase_url = '';
76
-
77
- /**
78
- * URL for a 128x128 (size used by WordPress.org) icon image.
79
- *
80
- * @since 2.0.0
81
- * @access protected
82
- * @var string
83
- */
84
- public $icon_url = '';
85
-
86
- /**
87
- * Add-on plugin's author URL.
88
- *
89
- * @since 2.0.0
90
- * @access protected
91
- * @var string
92
- */
93
- public $author_url = '';
94
-
95
- /**
96
- * Add-on plugin's author display name.
97
- *
98
- * @since 2.0.0
99
- * @access protected
100
- * @var string
101
- */
102
- public $author_name = '';
103
-
104
- /**
105
- * Rating for the add-on. This is the total rating based on a 5-star rating system.
106
- * It will be divided by the rating count, so both must be supplied.
107
- *
108
- * @since 2.0.0
109
- * @access protected
110
- * @var int
111
- */
112
- public $rating = '';
113
-
114
- /**
115
- * Number of ratings.
116
- *
117
- * @since 2.0.0
118
- * @access protected
119
- * @var int
120
- */
121
- public $rating_count = 0;
122
-
123
- /**
124
- * Number of active installs. Note that this will be displayed with a `+` at
125
- * the end, such as `100,000+`. Exact counts are necessary. Just a round number.
126
- *
127
- * @since 2.0.0
128
- * @access protected
129
- * @var string
130
- */
131
- public $install_count = 0;
132
-
133
- /**
134
- * Magic method to use in case someone tries to output the object as a string.
135
- * We'll just return the name.
136
- *
137
- * @since 2.0.0
138
- * @access public
139
- * @return string
140
- */
141
- public function __toString() {
142
- return $this->name;
143
- }
144
-
145
- /**
146
- * Register a new object.
147
- *
148
- * @since 2.0.0
149
- * @access public
150
- * @param string $name
151
- * @param array $args {
152
- * @type string $label Internationalized text label.
153
- * @type string $icon Dashicon icon in the form of `dashicons-icon-name`.
154
- * @type array $caps Array of capabilities in the addon.
155
- * @type bool $merge_added Whether to merge this caps into the added caps array.
156
- * @type bool $diff_added Whether to remove previously-added caps from this addon.
157
- * }
158
- * @return void
159
- */
160
- public function __construct( $name, $args = array() ) {
161
-
162
- foreach ( array_keys( get_object_vars( $this ) ) as $key ) {
163
-
164
- if ( isset( $args[ $key ] ) )
165
- $this->$key = $args[ $key ];
166
- }
167
-
168
- $this->name = sanitize_key( $name );
169
-
170
- if ( ! $this->icon_url )
171
- $this->icon_url = members_plugin()->uri . 'img/icon-addon.png';
172
- }
173
- }
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class for handling an add-on object.
4
+ *
5
+ * @package Members
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justintadlock@gmail.com>
8
+ * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
+ * @link https://themehybrid.com/plugins/members
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ namespace Members;
14
+
15
+ /**
16
+ * Add-on object class.
17
+ *
18
+ * @since 2.0.0
19
+ * @access public
20
+ */
21
+ final class Addon {
22
+
23
+ /**
24
+ * Name/ID for the addon.
25
+ *
26
+ * @since 2.0.0
27
+ * @access protected
28
+ * @var string
29
+ */
30
+ public $name = '';
31
+
32
+ /**
33
+ * Title of the add-on.
34
+ *
35
+ * @since 2.0.0
36
+ * @access protected
37
+ * @var string
38
+ */
39
+ public $title = '';
40
+
41
+ /**
42
+ * Short description of the add-on.
43
+ *
44
+ * @since 2.0.0
45
+ * @access protected
46
+ * @var string
47
+ */
48
+ public $excerpt = '';
49
+
50
+ /**
51
+ * URL where the add-on can be found.
52
+ *
53
+ * @since 2.0.0
54
+ * @access protected
55
+ * @var string
56
+ */
57
+ public $url = 'https://themehybrid.com/plugins/members';
58
+
59
+ /**
60
+ * Add-on ZIP file URL.
61
+ *
62
+ * @since 2.0.0
63
+ * @access protected
64
+ * @var string
65
+ */
66
+ public $download_url = '';
67
+
68
+ /**
69
+ * Alternate purchase URL.
70
+ *
71
+ * @since 2.0.0
72
+ * @access protected
73
+ * @var string
74
+ */
75
+ public $purchase_url = '';
76
+
77
+ /**
78
+ * URL for a 128x128 (size used by WordPress.org) icon image.
79
+ *
80
+ * @since 2.0.0
81
+ * @access protected
82
+ * @var string
83
+ */
84
+ public $icon_url = '';
85
+
86
+ /**
87
+ * Add-on plugin's author URL.
88
+ *
89
+ * @since 2.0.0
90
+ * @access protected
91
+ * @var string
92
+ */
93
+ public $author_url = '';
94
+
95
+ /**
96
+ * Add-on plugin's author display name.
97
+ *
98
+ * @since 2.0.0
99
+ * @access protected
100
+ * @var string
101
+ */
102
+ public $author_name = '';
103
+
104
+ /**
105
+ * Rating for the add-on. This is the total rating based on a 5-star rating system.
106
+ * It will be divided by the rating count, so both must be supplied.
107
+ *
108
+ * @since 2.0.0
109
+ * @access protected
110
+ * @var int
111
+ */
112
+ public $rating = '';
113
+
114
+ /**
115
+ * Number of ratings.
116
+ *
117
+ * @since 2.0.0
118
+ * @access protected
119
+ * @var int
120
+ */
121
+ public $rating_count = 0;
122
+
123
+ /**
124
+ * Number of active installs. Note that this will be displayed with a `+` at
125
+ * the end, such as `100,000+`. Exact counts are necessary. Just a round number.
126
+ *
127
+ * @since 2.0.0
128
+ * @access protected
129
+ * @var string
130
+ */
131
+ public $install_count = 0;
132
+
133
+ public $is_memberpress = false;
134
+
135
+ /**
136
+ * Magic method to use in case someone tries to output the object as a string.
137
+ * We'll just return the name.
138
+ *
139
+ * @since 2.0.0
140
+ * @access public
141
+ * @return string
142
+ */
143
+ public function __toString() {
144
+ return $this->name;
145
+ }
146
+
147
+ /**
148
+ * Register a new object.
149
+ *
150
+ * @since 2.0.0
151
+ * @access public
152
+ * @param string $name
153
+ * @param array $args {
154
+ * @type string $label Internationalized text label.
155
+ * @type string $icon Dashicon icon in the form of `dashicons-icon-name`.
156
+ * @type array $caps Array of capabilities in the addon.
157
+ * @type bool $merge_added Whether to merge this caps into the added caps array.
158
+ * @type bool $diff_added Whether to remove previously-added caps from this addon.
159
+ * }
160
+ * @return void
161
+ */
162
+ public function __construct( $name, $args = array() ) {
163
+
164
+ foreach ( array_keys( get_object_vars( $this ) ) as $key ) {
165
+
166
+ if ( isset( $args[ $key ] ) ) {
167
+ $this->$key = $args[ $key ];
168
+ }
169
+ }
170
+
171
+ $this->name = sanitize_key( $name );
172
+
173
+ $this->is_memberpress = isset( $args['is_memberpress'] ) && true === $args['is_memberpress'];
174
+
175
+ if ( ! $this->icon_url ) {
176
+ $this->icon_url = members_plugin()->uri . 'img/icon-addon.png';
177
+ }
178
+ }
179
+ }
admin/class-cap-control.php CHANGED
@@ -1,132 +1,132 @@
1
- <?php
2
- /**
3
- * Capability control class for use in the edit capabilities tabs.
4
- *
5
- * @package Members
6
- * @subpackage Admin
7
- * @author Justin Tadlock <justintadlock@gmail.com>
8
- * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
- * @link https://themehybrid.com/plugins/members
10
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
- */
12
-
13
- namespace Members\Admin;
14
-
15
- /**
16
- * Cap control class.
17
- *
18
- * @since 2.0.0
19
- * @access public
20
- */
21
- final class Cap_Control {
22
-
23
- /**
24
- * Stores the cap tabs object.
25
- *
26
- * @see Members_Cap_Tabs
27
- * @since 2.0.0
28
- * @access public
29
- * @var object
30
- */
31
- public $manager;
32
-
33
- /**
34
- * Name of the capability the control is for.
35
- *
36
- * @since 2.0.0
37
- * @access public
38
- * @var string
39
- */
40
- public $cap = '';
41
-
42
- /**
43
- * ID of the section the control is for.
44
- *
45
- * @since 2.0.0
46
- * @access public
47
- * @var string
48
- */
49
- public $section = '';
50
-
51
- /**
52
- * Array of data to pass as a json object to the Underscore template.
53
- *
54
- * @since 2.0.0
55
- * @access public
56
- * @var array
57
- */
58
- public $json = array();
59
-
60
- /**
61
- * Creates a new control object.
62
- *
63
- * @since 2.0.0
64
- * @access public
65
- * @param object $manager
66
- * @param string $cap
67
- * @param array $args
68
- * @return void
69
- */
70
- public function __construct( $manager, $cap, $args = array() ) {
71
-
72
- foreach ( array_keys( get_object_vars( $this ) ) as $key ) {
73
-
74
- if ( isset( $args[ $key ] ) )
75
- $this->$key = $args[ $key ];
76
- }
77
-
78
- $this->manager = $manager;
79
- $this->cap = $cap;
80
- }
81
-
82
- /**
83
- * Returns the json array.
84
- *
85
- * @since 2.0.0
86
- * @access public
87
- * @return array
88
- */
89
- public function json() {
90
- $this->to_json();
91
- return $this->json;
92
- }
93
-
94
- /**
95
- * Adds custom data to the json array. This data is passed to the Underscore template.
96
- *
97
- * @since 2.0.0
98
- * @access public
99
- * @return void
100
- */
101
- public function to_json() {
102
-
103
- // Is the role editable?
104
- $is_editable = $this->manager->role ? members_is_role_editable( $this->manager->role->name ) : true;
105
-
106
- // Get the current capability.
107
- $this->json['cap'] = $this->cap;
108
-
109
- // Add the section ID.
110
- $this->json['section'] = $this->section;
111
-
112
- // If the cap is not editable, the inputs should be read-only.
113
- $this->json['readonly'] = $is_editable ? '' : ' disabled="disabled" readonly="readonly"';
114
-
115
- // Set up the input labels.
116
- $this->json['label'] = array(
117
- 'cap' => members_show_human_caps() && members_cap_exists( $this->cap ) ? members_get_cap( $this->cap )->label : $this->cap,
118
- 'grant' => sprintf( esc_html__( 'Grant %s capability', 'members' ), "<code>{$this->cap}</code>" ),
119
- 'deny' => sprintf( esc_html__( 'Deny %s capability', 'members' ), "<code>{$this->cap}</code>" )
120
- );
121
-
122
- // Set up the input `name` attributes.
123
- $this->json['name'] = array(
124
- 'grant' => 'grant-caps[]',
125
- 'deny' => 'deny-caps[]'
126
- );
127
-
128
- // Is this a granted or denied cap?
129
- $this->json['is_granted_cap'] = isset( $this->manager->has_caps[ $this->cap ] ) && $this->manager->has_caps[ $this->cap ];
130
- $this->json['is_denied_cap'] = isset( $this->manager->has_caps[ $this->cap ] ) && false === $this->manager->has_caps[ $this->cap ];
131
- }
132
- }
1
+ <?php
2
+ /**
3
+ * Capability control class for use in the edit capabilities tabs.
4
+ *
5
+ * @package Members
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justintadlock@gmail.com>
8
+ * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
+ * @link https://themehybrid.com/plugins/members
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ namespace Members\Admin;
14
+
15
+ /**
16
+ * Cap control class.
17
+ *
18
+ * @since 2.0.0
19
+ * @access public
20
+ */
21
+ final class Cap_Control {
22
+
23
+ /**
24
+ * Stores the cap tabs object.
25
+ *
26
+ * @see Members_Cap_Tabs
27
+ * @since 2.0.0
28
+ * @access public
29
+ * @var object
30
+ */
31
+ public $manager;
32
+
33
+ /**
34
+ * Name of the capability the control is for.
35
+ *
36
+ * @since 2.0.0
37
+ * @access public
38
+ * @var string
39
+ */
40
+ public $cap = '';
41
+
42
+ /**
43
+ * ID of the section the control is for.
44
+ *
45
+ * @since 2.0.0
46
+ * @access public
47
+ * @var string
48
+ */
49
+ public $section = '';
50
+
51
+ /**
52
+ * Array of data to pass as a json object to the Underscore template.
53
+ *
54
+ * @since 2.0.0
55
+ * @access public
56
+ * @var array
57
+ */
58
+ public $json = array();
59
+
60
+ /**
61
+ * Creates a new control object.
62
+ *
63
+ * @since 2.0.0
64
+ * @access public
65
+ * @param object $manager
66
+ * @param string $cap
67
+ * @param array $args
68
+ * @return void
69
+ */
70
+ public function __construct( $manager, $cap, $args = array() ) {
71
+
72
+ foreach ( array_keys( get_object_vars( $this ) ) as $key ) {
73
+
74
+ if ( isset( $args[ $key ] ) )
75
+ $this->$key = $args[ $key ];
76
+ }
77
+
78
+ $this->manager = $manager;
79
+ $this->cap = $cap;
80
+ }
81
+
82
+ /**
83
+ * Returns the json array.
84
+ *
85
+ * @since 2.0.0
86
+ * @access public
87
+ * @return array
88
+ */
89
+ public function json() {
90
+ $this->to_json();
91
+ return $this->json;
92
+ }
93
+
94
+ /**
95
+ * Adds custom data to the json array. This data is passed to the Underscore template.
96
+ *
97
+ * @since 2.0.0
98
+ * @access public
99
+ * @return void
100
+ */
101
+ public function to_json() {
102
+
103
+ // Is the role editable?
104
+ $is_editable = $this->manager->role ? members_is_role_editable( $this->manager->role->name ) : true;
105
+
106
+ // Get the current capability.
107
+ $this->json['cap'] = $this->cap;
108
+
109
+ // Add the section ID.
110
+ $this->json['section'] = $this->section;
111
+
112
+ // If the cap is not editable, the inputs should be read-only.
113
+ $this->json['readonly'] = $is_editable ? '' : ' disabled="disabled" readonly="readonly"';
114
+
115
+ // Set up the input labels.
116
+ $this->json['label'] = array(
117
+ 'cap' => members_show_human_caps() && members_cap_exists( $this->cap ) ? members_get_cap( $this->cap )->label : $this->cap,
118
+ 'grant' => sprintf( esc_html__( 'Grant %s capability', 'members' ), "<code>{$this->cap}</code>" ),
119
+ 'deny' => sprintf( esc_html__( 'Deny %s capability', 'members' ), "<code>{$this->cap}</code>" )
120
+ );
121
+
122
+ // Set up the input `name` attributes.
123
+ $this->json['name'] = array(
124
+ 'grant' => 'grant-caps[]',
125
+ 'deny' => 'deny-caps[]'
126
+ );
127
+
128
+ // Is this a granted or denied cap?
129
+ $this->json['is_granted_cap'] = isset( $this->manager->has_caps[ $this->cap ] ) && $this->manager->has_caps[ $this->cap ];
130
+ $this->json['is_denied_cap'] = isset( $this->manager->has_caps[ $this->cap ] ) && false === $this->manager->has_caps[ $this->cap ];
131
+ }
132
+ }
admin/class-cap-section.php CHANGED
@@ -1,119 +1,119 @@
1
- <?php
2
- /**
3
- * Capability section class for use in the edit capabilities tabs.
4
- *
5
- * @package Members
6
- * @subpackage Admin
7
- * @author Justin Tadlock <justintadlock@gmail.com>
8
- * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
- * @link https://themehybrid.com/plugins/members
10
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
- */
12
-
13
- namespace Members\Admin;
14
-
15
- /**
16
- * Cap section class.
17
- *
18
- * @since 2.0.0
19
- * @access public
20
- */
21
- final class Cap_Section {
22
-
23
- /**
24
- * Stores the cap tabs object.
25
- *
26
- * @see Members_Cap_Tabs
27
- * @since 2.0.0
28
- * @access public
29
- * @var object
30
- */
31
- public $manager;
32
-
33
- /**
34
- * ID of the section.
35
- *
36
- * @since 2.0.0
37
- * @access public
38
- * @var string
39
- */
40
- public $section = '';
41
-
42
- /**
43
- * Dashicons icon for the section.
44
- *
45
- * @since 2.0.0
46
- * @access public
47
- * @var string
48
- */
49
- public $icon = 'dashicons-admin-generic';
50
-
51
- /**
52
- * Label for the section.
53
- *
54
- * @since 2.0.0
55
- * @access public
56
- * @var string
57
- */
58
- public $label = '';
59
-
60
- /**
61
- * Array of data to pass as a json object to the Underscore template.
62
- *
63
- * @since 2.0.0
64
- * @access public
65
- * @var array
66
- */
67
- public $json = array();
68
-
69
- /**
70
- * Creates a new section object.
71
- *
72
- * @since 2.0.0
73
- * @access public
74
- * @param object $manager
75
- * @param string $section
76
- * @param array $args
77
- * @return void
78
- */
79
- public function __construct( $manager, $section, $args = array() ) {
80
-
81
- foreach ( array_keys( get_object_vars( $this ) ) as $key ) {
82
-
83
- if ( isset( $args[ $key ] ) )
84
- $this->$key = $args[ $key ];
85
- }
86
-
87
- $this->manager = $manager;
88
- $this->section = $section;
89
- }
90
-
91
- /**
92
- * Returns the json array.
93
- *
94
- * @since 2.0.0
95
- * @access public
96
- * @return array
97
- */
98
- public function json() {
99
- $this->to_json();
100
- return $this->json;
101
- }
102
-
103
- /**
104
- * Adds custom data to the json array. This data is passed to the Underscore template.
105
- *
106
- * @since 2.0.0
107
- * @access public
108
- * @return void
109
- */
110
- public function to_json() {
111
-
112
- // Is the role editable?
113
- $is_editable = $this->manager->role ? members_is_role_editable( $this->manager->role->name ) : true;
114
-
115
- // Set up the ID and class.
116
- $this->json['id'] = $this->section;
117
- $this->json['class'] = 'members-tab-content' . ( $is_editable ? ' editable-role' : '' );
118
- }
119
- }
1
+ <?php
2
+ /**
3
+ * Capability section class for use in the edit capabilities tabs.
4
+ *
5
+ * @package Members
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justintadlock@gmail.com>
8
+ * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
+ * @link https://themehybrid.com/plugins/members
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ namespace Members\Admin;
14
+
15
+ /**
16
+ * Cap section class.
17
+ *
18
+ * @since 2.0.0
19
+ * @access public
20
+ */
21
+ final class Cap_Section {
22
+
23
+ /**
24
+ * Stores the cap tabs object.
25
+ *
26
+ * @see Members_Cap_Tabs
27
+ * @since 2.0.0
28
+ * @access public
29
+ * @var object
30
+ */
31
+ public $manager;
32
+
33
+ /**
34
+ * ID of the section.
35
+ *
36
+ * @since 2.0.0
37
+ * @access public
38
+ * @var string
39
+ */
40
+ public $section = '';
41
+
42
+ /**
43
+ * Dashicons icon for the section.
44
+ *
45
+ * @since 2.0.0
46
+ * @access public
47
+ * @var string
48
+ */
49
+ public $icon = 'dashicons-admin-generic';
50
+
51
+ /**
52
+ * Label for the section.
53
+ *
54
+ * @since 2.0.0
55
+ * @access public
56
+ * @var string
57
+ */
58
+ public $label = '';
59
+
60
+ /**
61
+ * Array of data to pass as a json object to the Underscore template.
62
+ *
63
+ * @since 2.0.0
64
+ * @access public
65
+ * @var array
66
+ */
67
+ public $json = array();
68
+
69
+ /**
70
+ * Creates a new section object.
71
+ *
72
+ * @since 2.0.0
73
+ * @access public
74
+ * @param object $manager
75
+ * @param string $section
76
+ * @param array $args
77
+ * @return void
78
+ */
79
+ public function __construct( $manager, $section, $args = array() ) {
80
+
81
+ foreach ( array_keys( get_object_vars( $this ) ) as $key ) {
82
+
83
+ if ( isset( $args[ $key ] ) )
84
+ $this->$key = $args[ $key ];
85
+ }
86
+
87
+ $this->manager = $manager;
88
+ $this->section = $section;
89
+ }
90
+
91
+ /**
92
+ * Returns the json array.
93
+ *
94
+ * @since 2.0.0
95
+ * @access public
96
+ * @return array
97
+ */
98
+ public function json() {
99
+ $this->to_json();
100
+ return $this->json;
101
+ }
102
+
103
+ /**
104
+ * Adds custom data to the json array. This data is passed to the Underscore template.
105
+ *
106
+ * @since 2.0.0
107
+ * @access public
108
+ * @return void
109
+ */
110
+ public function to_json() {
111
+
112
+ // Is the role editable?
113
+ $is_editable = $this->manager->role ? members_is_role_editable( $this->manager->role->name ) : true;
114
+
115
+ // Set up the ID and class.
116
+ $this->json['id'] = $this->section;
117
+ $this->json['class'] = 'members-tab-content' . ( $is_editable ? ' editable-role' : '' );
118
+ }
119
+ }
admin/class-cap-tabs.php CHANGED
@@ -1,262 +1,262 @@
1
- <?php
2
- /**
3
- * Edit Capabilities tab section on the edit/new role screen.
4
- *
5
- * @package Members
6
- * @subpackage Admin
7
- * @author Justin Tadlock <justintadlock@gmail.com>
8
- * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
- * @link https://themehybrid.com/plugins/members
10
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
- */
12
-
13
- namespace Members\Admin;
14
-
15
- /**
16
- * Handles building the edit caps tabs.
17
- *
18
- * @since 2.0.0
19
- * @access public
20
- */
21
- final class Cap_Tabs {
22
-
23
- /**
24
- * The role object that we're creating tabs for.
25
- *
26
- * @since 2.0.0
27
- * @access public
28
- * @var object
29
- */
30
- public $role;
31
-
32
- /**
33
- * Array of caps shown by the cap tabs.
34
- *
35
- * @since 2.0.0
36
- * @access public
37
- * @var array
38
- */
39
- public $added_caps = array();
40
-
41
- /**
42
- * The caps the role has. Note that if this is a new role (new role screen), the default
43
- * new role caps will be passed in.
44
- *
45
- * @since 2.0.0
46
- * @access public
47
- * @var array
48
- */
49
- public $has_caps = array();
50
-
51
- /**
52
- * Array of tab sections.
53
- *
54
- * @since 2.0.0
55
- * @access public
56
- * @var array
57
- */
58
- public $sections = array();
59
-
60
- /**
61
- * Array of single cap controls.
62
- *
63
- * @since 2.0.0
64
- * @access public
65
- * @var array
66
- */
67
- public $controls = array();
68
-
69
- /**
70
- * Array of section json data.
71
- *
72
- * @since 2.0.0
73
- * @access public
74
- * @var array
75
- */
76
- public $sections_json = array();
77
-
78
- /**
79
- * Array of control json data.
80
- *
81
- * @since 2.0.0
82
- * @access public
83
- * @var array
84
- */
85
- public $controls_json = array();
86
-
87
- /**
88
- * Sets up the cap tabs.
89
- *
90
- * @since 2.0.0
91
- * @access public
92
- * @param string $role
93
- * @param array $has_caps
94
- * @return void
95
- */
96
- public function __construct( $role = '', $has_caps = array() ) {
97
-
98
- // Check if there were explicit caps passed in.
99
- if ( $has_caps )
100
- $this->has_caps = $has_caps;
101
-
102
- // Check if we have a role.
103
- if ( $role ) {
104
- $this->role = members_get_role( $role );
105
-
106
- // If no explicit caps were passed in, use the role's caps.
107
- if ( ! $has_caps )
108
- $this->has_caps = $this->role->caps;
109
- }
110
-
111
- // Add sections and controls.
112
- $this->register();
113
-
114
- // Print custom JS in the footer.
115
- add_action( 'admin_footer', array( $this, 'localize_scripts' ), 0 );
116
- add_action( 'admin_footer', array( $this, 'print_templates' ) );
117
- }
118
-
119
- /**
120
- * Registers the sections (and each section's controls) that will be used for
121
- * the tab content.
122
- *
123
- * @since 2.0.0
124
- * @access public
125
- * @return void
126
- */
127
- public function register() {
128
-
129
- // Hook before registering.
130
- do_action( 'members_pre_edit_caps_manager_register' );
131
-
132
- $groups = members_get_cap_groups();
133
-
134
- uasort( $groups, 'members_priority_sort' );
135
-
136
- // Get and loop through the available capability groups.
137
- foreach ( $groups as $group ) {
138
-
139
- $caps = $group->caps;
140
-
141
- // Remove added caps.
142
- if ( $group->diff_added )
143
- $caps = array_diff( $group->caps, $this->added_caps );
144
-
145
- // Add group's caps to the added caps array.
146
- $this->added_caps = array_unique( array_merge( $this->added_caps, $caps ) );
147
-
148
- // Create a new section.
149
- $this->sections[] = $section = new Cap_Section( $this, $group->name, array( 'icon' => $group->icon, 'label' => $group->label ) );
150
-
151
- // Get the section json data.
152
- $this->sections_json[] = $section->json();
153
-
154
- // Create new controls for each cap.
155
- foreach ( $caps as $cap ) {
156
-
157
- $this->controls[] = $control = new Cap_Control( $this, $cap, array( 'section' => $group->name ) );
158
-
159
- // Get the control json data.
160
- $this->controls_json[] = $control->json();
161
- }
162
- }
163
-
164
- // Create a new "All" section.
165
- $this->sections[] = $section = new Cap_Section( $this, 'all', array( 'icon' => 'dashicons-plus', 'label' => esc_html__( 'All', 'members' ) ) );
166
-
167
- // Get the section json data.
168
- $this->sections_json[] = $section->json();
169
-
170
- // Create new controls for each cap.
171
- foreach ( $this->added_caps as $cap ) {
172
-
173
- $this->controls[] = $control = new Cap_Control( $this, $cap, array( 'section' => 'all' ) );
174
-
175
- // Get the control json data.
176
- $this->controls_json[] = $control->json();
177
- }
178
-
179
- // Hook after registering.
180
- do_action( 'members_edit_caps_manager_register' );
181
- }
182
-
183
- /**
184
- * Displays the cap tabs.
185
- *
186
- * @since 2.0.0
187
- * @access public
188
- * @return void
189
- */
190
- public function display() { ?>
191
-
192
- <div id="tabcapsdiv" class="postbox">
193
-
194
- <h2 class="hndle"><?php printf( esc_html__( 'Edit Capabilities: %s', 'members' ), '<span class="members-which-tab"></span>' ); ?></h2>
195
-
196
- <div class="inside">
197
-
198
- <div class="members-cap-tabs">
199
- <?php $this->tab_nav(); ?>
200
- <div class="members-tab-wrap"></div>
201
- </div><!-- .members-cap-tabs -->
202
-
203
- </div><!-- .inside -->
204
-
205
- </div><!-- .postbox -->
206
- <?php }
207
-
208
- /**
209
- * Outputs the tab nav.
210
- *
211
- * @since 2.0.0
212
- * @access public
213
- * @return void
214
- */
215
- public function tab_nav() { ?>
216
-
217
- <ul class="members-tab-nav">
218
-
219
- <?php foreach ( $this->sections as $section ) : ?>
220
-
221
- <?php $icon = preg_match( '/dashicons-/', $section->icon ) ? sprintf( 'dashicons %s', sanitize_html_class( $section->icon ) ) : esc_attr( $section->icon ); ?>
222
-
223
- <li class="members-tab-title">
224
- <a href="<?php echo esc_attr( "#members-tab-{$section->section}" ); ?>"><i class="<?php echo $icon; ?>"></i> <span class="label"><?php echo esc_html( $section->label ); ?></span></a>
225
- </li>
226
-
227
- <?php endforeach; ?>
228
-
229
- </ul><!-- .members-tab-nav -->
230
- <?php }
231
-
232
- /**
233
- * Passes our sections and controls data as json to the `edit-role.js` file.
234
- *
235
- * @since 2.0.0
236
- * @access public
237
- * @return void
238
- */
239
- public function localize_scripts() {
240
-
241
- wp_localize_script( 'members-edit-role', 'members_sections', $this->sections_json );
242
- wp_localize_script( 'members-edit-role', 'members_controls', $this->controls_json );
243
- }
244
-
245
- /**
246
- * Outputs the Underscore JS templates.
247
- *
248
- * @since 2.0.0
249
- * @access public
250
- * @return void
251
- */
252
- public function print_templates() { ?>
253
-
254
- <script type="text/html" id="tmpl-members-cap-section">
255
- <?php members_get_underscore_template( 'cap-section' ); ?>
256
- </script>
257
-
258
- <script type="text/html" id="tmpl-members-cap-control">
259
- <?php members_get_underscore_template( 'cap-control' ); ?>
260
- </script>
261
- <?php }
262
- }
1
+ <?php
2
+ /**
3
+ * Edit Capabilities tab section on the edit/new role screen.
4
+ *
5
+ * @package Members
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justintadlock@gmail.com>
8
+ * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
+ * @link https://themehybrid.com/plugins/members
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ namespace Members\Admin;
14
+
15
+ /**
16
+ * Handles building the edit caps tabs.
17
+ *
18
+ * @since 2.0.0
19
+ * @access public
20
+ */
21
+ final class Cap_Tabs {
22
+
23
+ /**
24
+ * The role object that we're creating tabs for.
25
+ *
26
+ * @since 2.0.0
27
+ * @access public
28
+ * @var object
29
+ */
30
+ public $role;
31
+
32
+ /**
33
+ * Array of caps shown by the cap tabs.
34
+ *
35
+ * @since 2.0.0
36
+ * @access public
37
+ * @var array
38
+ */
39
+ public $added_caps = array();
40
+
41
+ /**
42
+ * The caps the role has. Note that if this is a new role (new role screen), the default
43
+ * new role caps will be passed in.
44
+ *
45
+ * @since 2.0.0
46
+ * @access public
47
+ * @var array
48
+ */
49
+ public $has_caps = array();
50
+
51
+ /**
52
+ * Array of tab sections.
53
+ *
54
+ * @since 2.0.0
55
+ * @access public
56
+ * @var array
57
+ */
58
+ public $sections = array();
59
+
60
+ /**
61
+ * Array of single cap controls.
62
+ *
63
+ * @since 2.0.0
64
+ * @access public
65
+ * @var array
66
+ */
67
+ public $controls = array();
68
+
69
+ /**
70
+ * Array of section json data.
71
+ *
72
+ * @since 2.0.0
73
+ * @access public
74
+ * @var array
75
+ */
76
+ public $sections_json = array();
77
+
78
+ /**
79
+ * Array of control json data.
80
+ *
81
+ * @since 2.0.0
82
+ * @access public
83
+ * @var array
84
+ */
85
+ public $controls_json = array();
86
+
87
+ /**
88
+ * Sets up the cap tabs.
89
+ *
90
+ * @since 2.0.0
91
+ * @access public
92
+ * @param string $role
93
+ * @param array $has_caps
94
+ * @return void
95
+ */
96
+ public function __construct( $role = '', $has_caps = array() ) {
97
+
98
+ // Check if there were explicit caps passed in.
99
+ if ( $has_caps )
100
+ $this->has_caps = $has_caps;
101
+
102
+ // Check if we have a role.
103
+ if ( $role ) {
104
+ $this->role = members_get_role( $role );
105
+
106
+ // If no explicit caps were passed in, use the role's caps.
107
+ if ( ! $has_caps )
108
+ $this->has_caps = $this->role->caps;
109
+ }
110
+
111
+ // Add sections and controls.
112
+ $this->register();
113
+
114
+ // Print custom JS in the footer.
115
+ add_action( 'admin_footer', array( $this, 'localize_scripts' ), 0 );
116
+ add_action( 'admin_footer', array( $this, 'print_templates' ) );
117
+ }
118
+
119
+ /**
120
+ * Registers the sections (and each section's controls) that will be used for
121
+ * the tab content.
122
+ *
123
+ * @since 2.0.0
124
+ * @access public
125
+ * @return void
126
+ */
127
+ public function register() {
128
+
129
+ // Hook before registering.
130
+ do_action( 'members_pre_edit_caps_manager_register' );
131
+
132
+ $groups = members_get_cap_groups();
133
+
134
+ uasort( $groups, 'members_priority_sort' );
135
+
136
+ // Get and loop through the available capability groups.
137
+ foreach ( $groups as $group ) {
138
+
139
+ $caps = $group->caps;
140
+
141
+ // Remove added caps.
142
+ if ( $group->diff_added )
143
+ $caps = array_diff( $group->caps, $this->added_caps );
144
+
145
+ // Add group's caps to the added caps array.
146
+ $this->added_caps = array_unique( array_merge( $this->added_caps, $caps ) );
147
+
148
+ // Create a new section.
149
+ $this->sections[] = $section = new Cap_Section( $this, $group->name, array( 'icon' => $group->icon, 'label' => $group->label ) );
150
+
151
+ // Get the section json data.
152
+ $this->sections_json[] = $section->json();
153
+
154
+ // Create new controls for each cap.
155
+ foreach ( $caps as $cap ) {
156
+
157
+ $this->controls[] = $control = new Cap_Control( $this, $cap, array( 'section' => $group->name ) );
158
+
159
+ // Get the control json data.
160
+ $this->controls_json[] = $control->json();
161
+ }
162
+ }
163
+
164
+ // Create a new "All" section.
165
+ $this->sections[] = $section = new Cap_Section( $this, 'all', array( 'icon' => 'dashicons-plus', 'label' => esc_html__( 'All', 'members' ) ) );
166
+
167
+ // Get the section json data.
168
+ $this->sections_json[] = $section->json();
169
+
170
+ // Create new controls for each cap.
171
+ foreach ( $this->added_caps as $cap ) {
172
+
173
+ $this->controls[] = $control = new Cap_Control( $this, $cap, array( 'section' => 'all' ) );
174
+
175
+ // Get the control json data.
176
+ $this->controls_json[] = $control->json();
177
+ }
178
+
179
+ // Hook after registering.
180
+ do_action( 'members_edit_caps_manager_register' );
181
+ }
182
+
183
+ /**
184
+ * Displays the cap tabs.
185
+ *
186
+ * @since 2.0.0
187
+ * @access public
188
+ * @return void
189
+ */
190
+ public function display() { ?>
191
+
192
+ <div id="tabcapsdiv" class="postbox">
193
+
194
+ <h2 class="hndle"><?php printf( esc_html__( 'Edit Capabilities: %s', 'members' ), '<span class="members-which-tab"></span>' ); ?></h2>
195
+
196
+ <div class="inside">
197
+
198
+ <div class="members-cap-tabs">
199
+ <?php $this->tab_nav(); ?>
200
+ <div class="members-tab-wrap"></div>
201
+ </div><!-- .members-cap-tabs -->
202
+
203
+ </div><!-- .inside -->
204
+
205
+ </div><!-- .postbox -->
206
+ <?php }
207
+
208
+ /**
209
+ * Outputs the tab nav.
210
+ *
211
+ * @since 2.0.0
212
+ * @access public
213
+ * @return void
214
+ */
215
+ public function tab_nav() { ?>
216
+
217
+ <ul class="members-tab-nav">
218
+
219
+ <?php foreach ( $this->sections as $section ) : ?>
220
+
221
+ <?php $icon = preg_match( '/dashicons-/', $section->icon ) ? sprintf( 'dashicons %s', sanitize_html_class( $section->icon ) ) : esc_attr( $section->icon ); ?>
222
+
223
+ <li class="members-tab-title">
224
+ <a href="<?php echo esc_attr( "#members-tab-{$section->section}" ); ?>"><i class="<?php echo $icon; ?>"></i> <span class="label"><?php echo esc_html( $section->label ); ?></span></a>
225
+ </li>
226
+
227
+ <?php endforeach; ?>
228
+
229
+ </ul><!-- .members-tab-nav -->
230
+ <?php }
231
+
232
+ /**
233
+ * Passes our sections and controls data as json to the `edit-role.js` file.
234
+ *
235
+ * @since 2.0.0
236
+ * @access public
237
+ * @return void
238
+ */
239
+ public function localize_scripts() {
240
+
241
+ wp_localize_script( 'members-edit-role', 'members_sections', $this->sections_json );
242
+ wp_localize_script( 'members-edit-role', 'members_controls', $this->controls_json );
243
+ }
244
+
245
+ /**
246
+ * Outputs the Underscore JS templates.
247
+ *
248
+ * @since 2.0.0
249
+ * @access public
250
+ * @return void
251
+ */
252
+ public function print_templates() { ?>
253
+
254
+ <script type="text/html" id="tmpl-members-cap-section">
255
+ <?php members_get_underscore_template( 'cap-section' ); ?>
256
+ </script>
257
+
258
+ <script type="text/html" id="tmpl-members-cap-control">
259
+ <?php members_get_underscore_template( 'cap-control' ); ?>
260
+ </script>
261
+ <?php }
262
+ }
admin/class-manage-roles.php CHANGED
@@ -1,169 +1,170 @@
1
- <?php
2
- /**
3
- * Role management. This is the base class for the Roles and Edit Role screens.
4
- *
5
- * @package Members
6
- * @subpackage Admin
7
- * @author Justin Tadlock <justintadlock@gmail.com>
8
- * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
- * @link https://themehybrid.com/plugins/members
10
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
- */
12
-
13
- namespace Members\Admin;
14
-
15
- /**
16
- * Role management class.
17
- *
18
- * @since 2.0.0
19
- * @access public
20
- */
21
- final class Manage_Roles {
22
-
23
- /**
24
- * Holds the instances of this class.
25
- *
26
- * @since 2.0.0
27
- * @access private
28
- * @var object
29
- */
30
- private static $instance;
31
-
32
- /**
33
- * Name of the page we've created.
34
- *
35
- * @since 2.0.0
36
- * @access public
37
- * @var string
38
- */
39
- public $page = '';
40
-
41
- /**
42
- * The page object to show.
43
- *
44
- * @since 2.0.0
45
- * @access public
46
- * @var object
47
- */
48
- public $page_obj = '';
49
-
50
- /**
51
- * Sets up our initial actions.
52
- *
53
- * @since 2.0.0
54
- * @access public
55
- * @return void
56
- */
57
- public function __construct() {
58
-
59
- // If the role manager is active.
60
- if ( members_role_manager_enabled() )
61
- add_action( 'admin_menu', array( $this, 'add_admin_page' ) );
62
- }
63
-
64
- /**
65
- * Adds the roles page to the admin.
66
- *
67
- * @since 2.0.0
68
- * @access public
69
- * @return void
70
- */
71
- public function add_admin_page() {
72
-
73
- // The "Roles" page should be shown for anyone that has the 'list_roles', 'edit_roles', or
74
- // 'delete_roles' caps, so we're checking against all three.
75
- $edit_roles_cap = 'list_roles';
76
-
77
- // If the current user can 'edit_roles'.
78
- if ( current_user_can( 'edit_roles' ) )
79
- $edit_roles_cap = 'edit_roles';
80
-
81
- // If the current user can 'delete_roles'.
82
- elseif ( current_user_can( 'delete_roles' ) )
83
- $edit_roles_cap = 'delete_roles';
84
-
85
- // Get the page title.
86
- $title = esc_html__( 'Roles', 'members' );
87
-
88
- if ( isset( $_GET['action'] ) && 'edit' === $_GET['action'] && isset( $_GET['role'] ) )
89
- $title = esc_html__( 'Edit Role', 'members' );
90
-
91
- // Create the Manage Roles page.
92
- $this->page = add_submenu_page( 'users.php', $title, esc_html__( 'Roles', 'members' ), $edit_roles_cap, 'roles', array( $this, 'page' ) );
93
-
94
- // Let's roll if we have a page.
95
- if ( $this->page ) {
96
-
97
- // If viewing the edit role page.
98
- if ( isset( $_REQUEST['action'] ) && 'edit' === $_REQUEST['action'] && current_user_can( 'edit_roles' ) )
99
- $this->page_obj = new Role_Edit();
100
-
101
- // If viewing the role list page.
102
- else
103
- $this->page_obj = new Roles();
104
-
105
- // Load actions.
106
- add_action( "load-{$this->page}", array( $this, 'load' ) );
107
-
108
- // Load scripts/styles.
109
- add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
110
- }
111
- }
112
-
113
- /**
114
- * Checks posted data on load and performs actions if needed.
115
- *
116
- * @since 2.0.0
117
- * @access public
118
- * @return void
119
- */
120
- public function load() {
121
-
122
- if ( method_exists( $this->page_obj, 'load' ) )
123
- $this->page_obj->load();
124
- }
125
-
126
- /**
127
- * Loads necessary scripts/styles.
128
- *
129
- * @since 2.0.0
130
- * @access public
131
- * @param string $hook_suffix
132
- * @return void
133
- */
134
- public function enqueue( $hook_suffix ) {
135
-
136
- if ( $this->page === $hook_suffix && method_exists( $this->page_obj, 'enqueue' ) )
137
- $this->page_obj->enqueue();
138
- }
139
-
140
- /**
141
- * Outputs the page.
142
- *
143
- * @since 2.0.0
144
- * @access public
145
- * @return void
146
- */
147
- public function page() {
148
-
149
- if ( method_exists( $this->page_obj, 'page' ) )
150
- $this->page_obj->page();
151
- }
152
-
153
- /**
154
- * Returns the instance.
155
- *
156
- * @since 2.0.0
157
- * @access public
158
- * @return object
159
- */
160
- public static function get_instance() {
161
-
162
- if ( ! self::$instance )
163
- self::$instance = new self;
164
-
165
- return self::$instance;
166
- }
167
- }
168
-
169
- Manage_Roles::get_instance();
 
1
+ <?php
2
+ /**
3
+ * Role management. This is the base class for the Roles and Edit Role screens.
4
+ *
5
+ * @package Members
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justintadlock@gmail.com>
8
+ * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
+ * @link https://themehybrid.com/plugins/members
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ namespace Members\Admin;
14
+
15
+ /**
16
+ * Role management class.
17
+ *
18
+ * @since 2.0.0
19
+ * @access public
20
+ */
21
+ final class Manage_Roles {
22
+
23
+ /**
24
+ * Holds the instances of this class.
25
+ *
26
+ * @since 2.0.0
27
+ * @access private
28
+ * @var object
29
+ */
30
+ private static $instance;
31
+
32
+ /**
33
+ * Name of the page we've created.
34
+ *
35
+ * @since 2.0.0
36
+ * @access public
37
+ * @var string
38
+ */
39
+ public $page = '';
40
+
41
+ /**
42
+ * The page object to show.
43
+ *
44
+ * @since 2.0.0
45
+ * @access public
46
+ * @var object
47
+ */
48
+ public $page_obj = '';
49
+
50
+ /**
51
+ * Sets up our initial actions.
52
+ *
53
+ * @since 2.0.0
54
+ * @access public
55
+ * @return void
56
+ */
57
+ public function __construct() {
58
+
59
+ // If the role manager is active.
60
+ if ( members_role_manager_enabled() ) {
61
+ add_action( 'admin_menu', array( $this, 'add_admin_page' ), 15 );
62
+ }
63
+ }
64
+
65
+ /**
66
+ * Adds the roles page to the admin.
67
+ *
68
+ * @since 2.0.0
69
+ * @access public
70
+ * @return void
71
+ */
72
+ public function add_admin_page() {
73
+
74
+ // The "Roles" page should be shown for anyone that has the 'list_roles', 'edit_roles', or
75
+ // 'delete_roles' caps, so we're checking against all three.
76
+ $edit_roles_cap = 'list_roles';
77
+
78
+ // If the current user can 'edit_roles'.
79
+ if ( current_user_can( 'edit_roles' ) )
80
+ $edit_roles_cap = 'edit_roles';
81
+
82
+ // If the current user can 'delete_roles'.
83
+ elseif ( current_user_can( 'delete_roles' ) )
84
+ $edit_roles_cap = 'delete_roles';
85
+
86
+ // Get the page title.
87
+ $title = esc_html__( 'Roles', 'members' );
88
+
89
+ if ( isset( $_GET['action'] ) && 'edit' === $_GET['action'] && isset( $_GET['role'] ) )
90
+ $title = esc_html__( 'Edit Role', 'members' );
91
+
92
+ // Create the Manage Roles page.
93
+ $this->page = add_submenu_page( 'members', $title, esc_html__( 'Roles', 'members' ), $edit_roles_cap, 'roles', array( $this, 'page' ) );
94
+
95
+ // Let's roll if we have a page.
96
+ if ( $this->page ) {
97
+
98
+ // If viewing the edit role page.
99
+ if ( isset( $_REQUEST['action'] ) && 'edit' === $_REQUEST['action'] && current_user_can( 'edit_roles' ) )
100
+ $this->page_obj = new Role_Edit();
101
+
102
+ // If viewing the role list page.
103
+ else
104
+ $this->page_obj = new Roles();
105
+
106
+ // Load actions.
107
+ add_action( "load-{$this->page}", array( $this, 'load' ) );
108
+
109
+ // Load scripts/styles.
110
+ add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
111
+ }
112
+ }
113
+
114
+ /**
115
+ * Checks posted data on load and performs actions if needed.
116
+ *
117
+ * @since 2.0.0
118
+ * @access public
119
+ * @return void
120
+ */
121
+ public function load() {
122
+
123
+ if ( method_exists( $this->page_obj, 'load' ) )
124
+ $this->page_obj->load();
125
+ }
126
+
127
+ /**
128
+ * Loads necessary scripts/styles.
129
+ *
130
+ * @since 2.0.0
131
+ * @access public
132
+ * @param string $hook_suffix
133
+ * @return void
134
+ */
135
+ public function enqueue( $hook_suffix ) {
136
+
137
+ if ( $this->page === $hook_suffix && method_exists( $this->page_obj, 'enqueue' ) )
138
+ $this->page_obj->enqueue();
139
+ }
140
+
141
+ /**
142
+ * Outputs the page.
143
+ *
144
+ * @since 2.0.0
145
+ * @access public
146
+ * @return void
147
+ */
148
+ public function page() {
149
+
150
+ if ( method_exists( $this->page_obj, 'page' ) )
151
+ $this->page_obj->page();
152
+ }
153
+
154
+ /**
155
+ * Returns the instance.
156
+ *
157
+ * @since 2.0.0
158
+ * @access public
159
+ * @return object
160
+ */
161
+ public static function get_instance() {
162
+
163
+ if ( ! self::$instance )
164
+ self::$instance = new self;
165
+
166
+ return self::$instance;
167
+ }
168
+ }
169
+
170
+ Manage_Roles::get_instance();
admin/class-manage-users.php CHANGED
@@ -1,466 +1,466 @@
1
- <?php
2
- /**
3
- * Handles custom functionality on the manage users screen.
4
- *
5
- * @package Members
6
- * @subpackage Admin
7
- * @author Justin Tadlock <justintadlock@gmail.com>
8
- * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
- * @link https://themehybrid.com/plugins/members
10
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
- */
12
-
13
- namespace Members\Admin;
14
-
15
- /**
16
- * Manager users screen class.
17
- *
18
- * @since 2.0.0
19
- * @access public
20
- */
21
- final class Manage_Users {
22
-
23
- /**
24
- * Holds the instances of this class.
25
- *
26
- * @since 2.0.0
27
- * @access private
28
- * @var object
29
- */
30
- private static $instance = null;
31
-
32
- /**
33
- * Custom admin notices.
34
- *
35
- * @since 2.0.0
36
- * @access public
37
- * @var array
38
- */
39
- public $notices = array();
40
-
41
- /**
42
- * Constructore method.
43
- *
44
- * @since 2.0.0
45
- * @access private
46
- * @return void
47
- */
48
- private function __construct() {}
49
-
50
- /**
51
- * Sets up needed actions/filters.
52
- *
53
- * @since 2.0.0
54
- * @access private
55
- * @return void
56
- */
57
- private function setup_actions() {
58
-
59
- // If multiple roles per user is not enabled, bail.
60
- if ( ! members_multiple_user_roles_enabled() )
61
- return;
62
-
63
- // Add our primary actions to the load hook.
64
- add_action( 'load-users.php', array( $this, 'load' ) );
65
- add_action( 'load-users.php', array( $this, 'role_bulk_add' ) );
66
- add_action( 'load-users.php', array( $this, 'role_bulk_remove' ) );
67
- }
68
-
69
- /**
70
- * Adds actions/filters on load.
71
- *
72
- * @since 2.0.0
73
- * @access public
74
- * @return void
75
- */
76
- public function load() {
77
-
78
- // Add custom bulk fields.
79
- add_action( 'restrict_manage_users', array( $this, 'bulk_fields' ), 5 );
80
-
81
- // Custom manage users columns.
82
- add_filter( 'manage_users_columns', array( $this, 'manage_users_columns' ) );
83
-
84
- // Handle scripts and styles.
85
- add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
86
- add_action( 'admin_footer', array( $this, 'print_scripts' ), 25 );
87
- add_action( 'admin_head', array( $this, 'print_styles' ) );
88
-
89
- // If there was an update, add notices if they're from our plugin.
90
- if ( isset( $_GET['update'] ) ) {
91
-
92
- $action = sanitize_key( $_GET['update'] );
93
-
94
- // If a role was added.
95
- if ( 'members-role-added' === $action ) {
96
-
97
- $this->notices['role_added'] = array( 'message' => esc_html__( 'Role added to selected users.', 'members' ), 'type' => 'success' );
98
-
99
- // If a role was removed.
100
- } elseif ( 'members-role-removed' === $action ) {
101
-
102
- $this->notices['role_removed'] = array( 'message' => esc_html__( 'Role removed from selected users.', 'members' ), 'type' => 'success' );
103
-
104
- } elseif ( 'members-error-remove-admin' === $action ) {
105
-
106
- $this->notices['error_remove_admin'] = array( 'message' => esc_html__( 'The current user&#8217;s role must have user editing capabilities.', 'members' ), 'type' => 'error' );
107
- $this->notices['role_removed'] = array( 'message' => esc_html__( 'Role removed from other selected users.', 'members' ), 'type' => 'success' );
108
- }
109
-
110
- // If we have notices, hook them in.
111
- if ( $this->notices )
112
- add_action( 'admin_notices', array( $this, 'notices' ) );
113
- }
114
- }
115
-
116
- /**
117
- * Adds a single role to users in bulk.
118
- *
119
- * @since 2.0.0
120
- * @access public
121
- * @return void
122
- */
123
- public function role_bulk_add() {
124
-
125
- // Bail if we ain't got users.
126
- if ( empty( $_REQUEST['users'] ) )
127
- return;
128
-
129
- // Figure out if we have a role selected.
130
- if ( ! empty( $_REQUEST['members-add-role-top'] ) && ! empty( $_REQUEST['members-add-role-submit-top'] ) )
131
- $role = members_sanitize_role( $_REQUEST['members-add-role-top'] );
132
-
133
- elseif ( ! empty( $_REQUEST['members-add-role-bottom'] ) && ! empty( $_REQUEST['members-add-role-submit-bottom'] ) )
134
- $role = members_sanitize_role( $_REQUEST['members-add-role-bottom'] );
135
-
136
- // Get only editable roles.
137
- $editable_roles = members_get_editable_roles();
138
-
139
- // If we don't have a role or the role is not editable, bail.
140
- if ( empty( $role ) || ! in_array( $role, $editable_roles ) )
141
- return;
142
-
143
- // Validate our nonce.
144
- check_admin_referer( 'members-bulk-users', 'members-bulk-users-nonce' );
145
-
146
- // If the current user cannot promote users, bail.
147
- if ( ! current_user_can( 'promote_users' ) )
148
- return;
149
-
150
- // Loop through the users and add the role if possible.
151
- foreach ( (array) $_REQUEST['users'] as $user_id ) {
152
-
153
- $user_id = absint( $user_id );
154
-
155
- // If the user doesn't already belong to the blog, bail.
156
- if ( is_multisite() && ! is_user_member_of_blog( $user_id ) ) {
157
-
158
- wp_die(
159
- sprintf(
160
- '<h1>%s</h1> <p>%s</p>',
161
- esc_html__( 'Whoah, partner!', 'members' ),
162
- esc_html__( 'One of the selected users is not a member of this site.', 'members' )
163
- ),
164
- 403
165
- );
166
- }
167
-
168
- // Check that the current user can promote this specific user.
169
- if ( ! current_user_can( 'promote_user', $user_id ) )
170
- continue;
171
-
172
- // Get the user object.
173
- $user = new \WP_User( $user_id );
174
-
175
- // If the user doesn't have the role, add it.
176
- if ( ! in_array( $role, $user->roles ) )
177
- $user->add_role( $role );
178
- }
179
-
180
- // Redirect to the users screen.
181
- wp_redirect( add_query_arg( 'update', 'members-role-added', 'users.php' ) );
182
- }
183
-
184
- /**
185
- * Removes a single role from users in bulk.
186
- *
187
- * @since 2.0.0
188
- * @access public
189
- * @return void
190
- */
191
- public function role_bulk_remove() {
192
-
193
- // Bail if we ain't got users.
194
- if ( empty( $_REQUEST['users'] ) )
195
- return;
196
-
197
- // Figure out if we have a role selected.
198
- if ( ! empty( $_REQUEST['members-remove-role-top'] ) && ! empty( $_REQUEST['members-remove-role-submit-top'] ) )
199
- $role = members_sanitize_role( $_REQUEST['members-remove-role-top'] );
200
-
201
- elseif ( ! empty( $_REQUEST['members-remove-role-bottom'] ) && ! empty( $_REQUEST['members-remove-role-submit-bottom'] ) )
202
- $role = members_sanitize_role( $_REQUEST['members-remove-role-bottom'] );
203
-
204
- // Get only editable roles.
205
- $editable_roles = members_get_editable_roles();
206
-
207
- // If we don't have a role or the role is not editable, bail.
208
- if ( empty( $role ) || ! in_array( $role, $editable_roles ) )
209
- return;
210
-
211
- // Validate our nonce.
212
- check_admin_referer( 'members-bulk-users', 'members-bulk-users-nonce' );
213
-
214
- // If the current user cannot promote users, bail.
215
- if ( ! current_user_can( 'promote_users' ) )
216
- return;
217
-
218
- // Get the current user.
219
- $current_user = wp_get_current_user();
220
-
221
- $m_role = members_get_role( $role );
222
-
223
- $update = 'members-role-removed';
224
-
225
- // Loop through the users and remove the role if possible.
226
- foreach ( (array) $_REQUEST['users'] as $user_id ) {
227
-
228
- $user_id = absint( $user_id );
229
-
230
- // If the user doesn't already belong to the blog, bail.
231
- if ( is_multisite() && ! is_user_member_of_blog( $user_id ) ) {
232
-
233
- wp_die(
234
- sprintf(
235
- '<h1>%s</h1> <p>%s</p>',
236
- esc_html__( 'Whoah, partner!', 'members' ),
237
- esc_html__( 'One of the selected users is not a member of this site.', 'members' )
238
- ),
239
- 403
240
- );
241
- }
242
-
243
- // Check that the current user can promote this specific user.
244
- if ( ! current_user_can( 'promote_user', $user_id ) )
245
- continue;
246
-
247
- $is_current_user = $user_id == $current_user->ID;
248
- $role_can_promote = in_array( 'promote_users', $m_role->granted_caps );
249
- $can_manage_network = is_multisite() && current_user_can( 'manage_network_users' );
250
-
251
- // If the removed role has the `promote_users` cap and user is removing it from themselves.
252
- if ( $is_current_user && $role_can_promote && ! $can_manage_network ) {
253
-
254
- $can_remove = false;
255
-
256
- // Loop through the current user's roles.
257
- foreach ( $current_user->roles as $_r ) {
258
-
259
- // If the current user has another role that can promote users, it's
260
- // safe to remove the role. Else, the current user needs to keep
261
- // the role.
262
- if ( $role !== $_r && in_array( 'promote_users', members_get_role( $_r )->granted_caps ) ) {
263
-
264
- $can_remove = true;
265
- break;
266
- }
267
- }
268
-
269
- if ( ! $can_remove ) {
270
- $update = 'members-error-remove-admin';
271
- continue;
272
- }
273
- }
274
-
275
- // Get the user object.
276
- $user = new \WP_User( $user_id );
277
-
278
- // If the user has the role, remove it.
279
- if ( in_array( $role, $user->roles ) )
280
- $user->remove_role( $role );
281
- }
282
-
283
- // Redirect to the users screen.
284
- wp_redirect( add_query_arg( 'update', $update, 'users.php' ) );
285
- }
286
-
287
- /**
288
- * Print admin notices.
289
- *
290
- * @since 2.0.0
291
- * @access public
292
- * @param string $which
293
- * @return void
294
- */
295
- public function notices() {
296
-
297
- if ( $this->notices ) : ?>
298
-
299
- <?php foreach ( $this->notices as $notice ) : ?>
300
-
301
- <div class="notice notice-<?php echo esc_attr( $notice['type'] ); ?> is-dismissible">
302
- <?php echo wpautop( '<strong>' . $notice['message'] . '</strong>' ); ?>
303
- </div>
304
-
305
- <?php endforeach;
306
-
307
- endif;
308
- }
309
-
310
- /**
311
- * Outputs "add role" and "remove role" dropdown select fields.
312
- *
313
- * @since 2.0.0
314
- * @access public
315
- * @param string $which
316
- * @return void
317
- */
318
- public function bulk_fields( $which ) {
319
-
320
- if ( ! current_user_can( 'promote_users' ) )
321
- return;
322
-
323
- wp_nonce_field( 'members-bulk-users', 'members-bulk-users-nonce' ); ?>
324
-
325
- <label class="screen-reader-text" for="<?php echo esc_attr( "members-add-role-{$which}" ); ?>">
326
- <?php esc_html_e( 'Add role&hellip;', 'members' ); ?>
327
- </label>
328
-
329
- <select name="<?php echo esc_attr( "members-add-role-{$which}" ); ?>" id="<?php echo esc_attr( "members-add-role-{$which}" ); ?>" style="display: inline-block; float: none;">
330
- <option value=""><?php esc_html_e( 'Add role&hellip;', 'members' ); ?></option>
331
- <?php wp_dropdown_roles(); ?>
332
- </select>
333
-
334
- <?php submit_button( esc_html__( 'Add', 'members' ), 'secondary', esc_attr( "members-add-role-submit-{$which}" ), false ); ?>
335
-
336
- <label class="screen-reader-text" for="<?php echo esc_attr( "members-remove-role-{$which}" ); ?>">
337
- <?php esc_html_e( 'Remove role&hellip;', 'members' ); ?>
338
- </label>
339
-
340
- <select name="<?php echo esc_attr( "members-remove-role-{$which}" ); ?>" id="<?php echo esc_attr( "members-remove-role-{$which}" ); ?>" style="display: inline-block; float: none;">
341
- <option value=""><?php esc_html_e( 'Remove role&hellip;', 'members' ); ?></option>
342
- <?php wp_dropdown_roles(); ?>
343
- </select>
344
-
345
- <?php submit_button( esc_html__( 'Remove', 'members' ), 'secondary', esc_attr( "members-remove-role-submit-{$which}" ), false );
346
- }
347
-
348
- /**
349
- * Handles table column headers.
350
- *
351
- * @since 2.0.0
352
- * @access public
353
- * @param array $columns
354
- * @return array
355
- */
356
- public function manage_users_columns( $columns ) {
357
-
358
- // Make sure role column is named correctly.
359
- if ( isset( $columns['role'] ) )
360
- $columns['role'] = esc_html__( 'Roles', 'members' );
361
-
362
- return $columns;
363
- }
364
-
365
- /**
366
- * Handles the output of the roles column on the `users.php` screen.
367
- *
368
- * @since 2.0.0
369
- * @access public
370
- * @param string $output
371
- * @param string $column
372
- * @param int $user_id
373
- * @return string
374
- */
375
- public function manage_users_custom_column( $output, $column, $user_id ) {
376
-
377
- if ( 'roles' === $column ) {
378
-
379
- $user = new \WP_User( $user_id );
380
-
381
- $user_roles = array();
382
- $output = esc_html__( 'None', 'members' );
383
-
384
- if ( is_array( $user->roles ) ) {
385
-
386
- foreach ( $user->roles as $role ) {
387
-
388
- if ( members_role_exists( $role ) )
389
- $user_roles[] = members_translate_role( $role );
390
- }
391
-
392
- $output = join( ', ', $user_roles );
393
- }
394
- }
395
-
396
- return $output;
397
- }
398
-
399
- /**
400
- * Enqueue scripts.
401
- *
402
- * @since 2.0.0
403
- * @access public
404
- * @return void
405
- */
406
- public function enqueue() {
407
-
408
- wp_enqueue_script( 'jquery' );
409
- }
410
-
411
- /**
412
- * Enqueue the plugin admin CSS.
413
- *
414
- * @since 2.0.0
415
- * @access public
416
- * @return void
417
- */
418
- public function print_scripts() { ?>
419
-
420
- <script>
421
- jQuery( document ).ready( function() {
422
-
423
- jQuery(
424
- 'label[for="new_role"], label[for="new_role2"], #new_role, #new_role2, #changeit, #changeit2'
425
- ).remove();
426
- } );
427
- </script>
428
-
429
- <?php }
430
-
431
- /**
432
- * Hides the core WP change role form fields because these are hardcoded in.
433
- *
434
- * @since 2.0.0
435
- * @access public
436
- * @return void
437
- */
438
- public function print_styles() { ?>
439
-
440
- <style type="text/css">
441
- label[for="new_role"], #new_role, #changeit,
442
- label[for="new_role2"], #new_role2, #changeit2 { display: none !important; }
443
- </style>
444
-
445
- <?php }
446
-
447
- /**
448
- * Returns the instance.
449
- *
450
- * @since 2.0.0
451
- * @access public
452
- * @return object
453
- */
454
- public static function get_instance() {
455
-
456
- if ( is_null( self::$instance ) ) {
457
- self::$instance = new self;
458
-
459
- self::$instance->setup_actions();
460
- }
461
-
462
- return self::$instance;
463
- }
464
- }
465
-
466
- Manage_Users::get_instance();
1
+ <?php
2
+ /**
3
+ * Handles custom functionality on the manage users screen.
4
+ *
5
+ * @package Members
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justintadlock@gmail.com>
8
+ * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
+ * @link https://themehybrid.com/plugins/members
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ namespace Members\Admin;
14
+
15
+ /**
16
+ * Manager users screen class.
17
+ *
18
+ * @since 2.0.0
19
+ * @access public
20
+ */
21
+ final class Manage_Users {
22
+
23
+ /**
24
+ * Holds the instances of this class.
25
+ *
26
+ * @since 2.0.0
27
+ * @access private
28
+ * @var object
29
+ */
30
+ private static $instance = null;
31
+
32
+ /**
33
+ * Custom admin notices.
34
+ *
35
+ * @since 2.0.0
36
+ * @access public
37
+ * @var array
38
+ */
39
+ public $notices = array();
40
+
41
+ /**
42
+ * Constructore method.
43
+ *
44
+ * @since 2.0.0
45
+ * @access private
46
+ * @return void
47
+ */
48
+ private function __construct() {}
49
+
50
+ /**
51
+ * Sets up needed actions/filters.
52
+ *
53
+ * @since 2.0.0
54
+ * @access private
55
+ * @return void
56
+ */
57
+ private function setup_actions() {
58
+
59
+ // If multiple roles per user is not enabled, bail.
60
+ if ( ! members_multiple_user_roles_enabled() )
61
+ return;
62
+
63
+ // Add our primary actions to the load hook.
64
+ add_action( 'load-users.php', array( $this, 'load' ) );
65
+ add_action( 'load-users.php', array( $this, 'role_bulk_add' ) );
66
+ add_action( 'load-users.php', array( $this, 'role_bulk_remove' ) );
67
+ }
68
+
69
+ /**
70
+ * Adds actions/filters on load.
71
+ *
72
+ * @since 2.0.0
73
+ * @access public
74
+ * @return void
75
+ */
76
+ public function load() {
77
+
78
+ // Add custom bulk fields.
79
+ add_action( 'restrict_manage_users', array( $this, 'bulk_fields' ), 5 );
80
+
81
+ // Custom manage users columns.
82
+ add_filter( 'manage_users_columns', array( $this, 'manage_users_columns' ) );
83
+
84
+ // Handle scripts and styles.
85
+ add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
86
+ add_action( 'admin_footer', array( $this, 'print_scripts' ), 25 );
87
+ add_action( 'admin_head', array( $this, 'print_styles' ) );
88
+
89
+ // If there was an update, add notices if they're from our plugin.
90
+ if ( isset( $_GET['update'] ) ) {
91
+
92
+ $action = sanitize_key( $_GET['update'] );
93
+
94
+ // If a role was added.
95
+ if ( 'members-role-added' === $action ) {
96
+
97
+ $this->notices['role_added'] = array( 'message' => esc_html__( 'Role added to selected users.', 'members' ), 'type' => 'success' );
98
+
99
+ // If a role was removed.
100
+ } elseif ( 'members-role-removed' === $action ) {
101
+
102
+ $this->notices['role_removed'] = array( 'message' => esc_html__( 'Role removed from selected users.', 'members' ), 'type' => 'success' );
103
+
104
+ } elseif ( 'members-error-remove-admin' === $action ) {
105
+
106
+ $this->notices['error_remove_admin'] = array( 'message' => esc_html__( 'The current user&#8217;s role must have user editing capabilities.', 'members' ), 'type' => 'error' );
107
+ $this->notices['role_removed'] = array( 'message' => esc_html__( 'Role removed from other selected users.', 'members' ), 'type' => 'success' );
108
+ }
109
+
110
+ // If we have notices, hook them in.
111
+ if ( $this->notices )
112
+ add_action( 'admin_notices', array( $this, 'notices' ) );
113
+ }
114
+ }
115
+
116
+ /**
117
+ * Adds a single role to users in bulk.
118
+ *
119
+ * @since 2.0.0
120
+ * @access public
121
+ * @return void
122
+ */
123
+ public function role_bulk_add() {
124
+
125
+ // Bail if we ain't got users.
126
+ if ( empty( $_REQUEST['users'] ) )
127
+ return;
128
+
129
+ // Figure out if we have a role selected.
130
+ if ( ! empty( $_REQUEST['members-add-role-top'] ) && ! empty( $_REQUEST['members-add-role-submit-top'] ) )
131
+ $role = members_sanitize_role( $_REQUEST['members-add-role-top'] );
132
+
133
+ elseif ( ! empty( $_REQUEST['members-add-role-bottom'] ) && ! empty( $_REQUEST['members-add-role-submit-bottom'] ) )
134
+ $role = members_sanitize_role( $_REQUEST['members-add-role-bottom'] );
135
+
136
+ // Get only editable roles.
137
+ $editable_roles = members_get_editable_roles();
138
+
139
+ // If we don't have a role or the role is not editable, bail.
140
+ if ( empty( $role ) || ! in_array( $role, $editable_roles ) )
141
+ return;
142
+
143
+ // Validate our nonce.
144
+ check_admin_referer( 'members-bulk-users', 'members-bulk-users-nonce' );
145
+
146
+ // If the current user cannot promote users, bail.
147
+ if ( ! current_user_can( 'promote_users' ) )
148
+ return;
149
+
150
+ // Loop through the users and add the role if possible.
151
+ foreach ( (array) $_REQUEST['users'] as $user_id ) {
152
+
153
+ $user_id = absint( $user_id );
154
+
155
+ // If the user doesn't already belong to the blog, bail.
156
+ if ( is_multisite() && ! is_user_member_of_blog( $user_id ) ) {
157
+
158
+ wp_die(
159
+ sprintf(
160
+ '<h1>%s</h1> <p>%s</p>',
161
+ esc_html__( 'Whoah, partner!', 'members' ),
162
+ esc_html__( 'One of the selected users is not a member of this site.', 'members' )
163
+ ),
164
+ 403
165
+ );
166
+ }
167
+
168
+ // Check that the current user can promote this specific user.
169
+ if ( ! current_user_can( 'promote_user', $user_id ) )
170
+ continue;
171
+
172
+ // Get the user object.
173
+ $user = new \WP_User( $user_id );
174
+
175
+ // If the user doesn't have the role, add it.
176
+ if ( ! in_array( $role, $user->roles ) )
177
+ $user->add_role( $role );
178
+ }
179
+
180
+ // Redirect to the users screen.
181
+ wp_redirect( add_query_arg( 'update', 'members-role-added', 'users.php' ) );
182
+ }
183
+
184
+ /**
185
+ * Removes a single role from users in bulk.
186
+ *
187
+ * @since 2.0.0
188
+ * @access public
189
+ * @return void
190
+ */
191
+ public function role_bulk_remove() {
192
+
193
+ // Bail if we ain't got users.
194
+ if ( empty( $_REQUEST['users'] ) )
195
+ return;
196
+
197
+ // Figure out if we have a role selected.
198
+ if ( ! empty( $_REQUEST['members-remove-role-top'] ) && ! empty( $_REQUEST['members-remove-role-submit-top'] ) )
199
+ $role = members_sanitize_role( $_REQUEST['members-remove-role-top'] );
200
+
201
+ elseif ( ! empty( $_REQUEST['members-remove-role-bottom'] ) && ! empty( $_REQUEST['members-remove-role-submit-bottom'] ) )
202
+ $role = members_sanitize_role( $_REQUEST['members-remove-role-bottom'] );
203
+
204
+ // Get only editable roles.
205
+ $editable_roles = members_get_editable_roles();
206
+
207
+ // If we don't have a role or the role is not editable, bail.
208
+ if ( empty( $role ) || ! in_array( $role, $editable_roles ) )
209
+ return;
210
+
211
+ // Validate our nonce.
212
+ check_admin_referer( 'members-bulk-users', 'members-bulk-users-nonce' );
213
+
214
+ // If the current user cannot promote users, bail.
215
+ if ( ! current_user_can( 'promote_users' ) )
216
+ return;
217
+
218
+ // Get the current user.
219
+ $current_user = wp_get_current_user();
220
+
221
+ $m_role = members_get_role( $role );
222
+
223
+ $update = 'members-role-removed';
224
+
225
+ // Loop through the users and remove the role if possible.
226
+ foreach ( (array) $_REQUEST['users'] as $user_id ) {
227
+
228
+ $user_id = absint( $user_id );
229
+
230
+ // If the user doesn't already belong to the blog, bail.
231
+ if ( is_multisite() && ! is_user_member_of_blog( $user_id ) ) {
232
+
233
+ wp_die(
234
+ sprintf(
235
+ '<h1>%s</h1> <p>%s</p>',
236
+ esc_html__( 'Whoah, partner!', 'members' ),
237
+ esc_html__( 'One of the selected users is not a member of this site.', 'members' )
238
+ ),
239
+ 403
240
+ );
241
+ }
242
+
243
+ // Check that the current user can promote this specific user.
244
+ if ( ! current_user_can( 'promote_user', $user_id ) )
245
+ continue;
246
+
247
+ $is_current_user = $user_id == $current_user->ID;
248
+ $role_can_promote = in_array( 'promote_users', $m_role->granted_caps );
249
+ $can_manage_network = is_multisite() && current_user_can( 'manage_network_users' );
250
+
251
+ // If the removed role has the `promote_users` cap and user is removing it from themselves.
252
+ if ( $is_current_user && $role_can_promote && ! $can_manage_network ) {
253
+
254
+ $can_remove = false;
255
+
256
+ // Loop through the current user's roles.
257
+ foreach ( $current_user->roles as $_r ) {
258
+
259
+ // If the current user has another role that can promote users, it's
260
+ // safe to remove the role. Else, the current user needs to keep
261
+ // the role.
262
+ if ( $role !== $_r && in_array( 'promote_users', members_get_role( $_r )->granted_caps ) ) {
263
+
264
+ $can_remove = true;
265
+ break;
266
+ }
267
+ }
268
+
269
+ if ( ! $can_remove ) {
270
+ $update = 'members-error-remove-admin';
271
+ continue;
272
+ }
273
+ }
274
+
275
+ // Get the user object.
276
+ $user = new \WP_User( $user_id );
277
+
278
+ // If the user has the role, remove it.
279
+ if ( in_array( $role, $user->roles ) )
280
+ $user->remove_role( $role );
281
+ }
282
+
283
+ // Redirect to the users screen.
284
+ wp_redirect( add_query_arg( 'update', $update, 'users.php' ) );
285
+ }
286
+
287
+ /**
288
+ * Print admin notices.
289
+ *
290
+ * @since 2.0.0
291
+ * @access public
292
+ * @param string $which
293
+ * @return void
294
+ */
295
+ public function notices() {
296
+
297
+ if ( $this->notices ) : ?>
298
+
299
+ <?php foreach ( $this->notices as $notice ) : ?>
300
+
301
+ <div class="notice notice-<?php echo esc_attr( $notice['type'] ); ?> is-dismissible">
302
+ <?php echo wpautop( '<strong>' . $notice['message'] . '</strong>' ); ?>
303
+ </div>
304
+
305
+ <?php endforeach;
306
+
307
+ endif;
308
+ }
309
+
310
+ /**
311
+ * Outputs "add role" and "remove role" dropdown select fields.
312
+ *
313
+ * @since 2.0.0
314
+ * @access public
315
+ * @param string $which
316
+ * @return void
317
+ */
318
+ public function bulk_fields( $which ) {
319
+
320
+ if ( ! current_user_can( 'promote_users' ) )
321
+ return;
322
+
323
+ wp_nonce_field( 'members-bulk-users', 'members-bulk-users-nonce' ); ?>
324
+
325
+ <label class="screen-reader-text" for="<?php echo esc_attr( "members-add-role-{$which}" ); ?>">
326
+ <?php esc_html_e( 'Add role&hellip;', 'members' ); ?>
327
+ </label>
328
+
329
+ <select name="<?php echo esc_attr( "members-add-role-{$which}" ); ?>" id="<?php echo esc_attr( "members-add-role-{$which}" ); ?>" style="display: inline-block; float: none;">
330
+ <option value=""><?php esc_html_e( 'Add role&hellip;', 'members' ); ?></option>
331
+ <?php wp_dropdown_roles(); ?>
332
+ </select>
333
+
334
+ <?php submit_button( esc_html__( 'Add', 'members' ), 'secondary', esc_attr( "members-add-role-submit-{$which}" ), false ); ?>
335
+
336
+ <label class="screen-reader-text" for="<?php echo esc_attr( "members-remove-role-{$which}" ); ?>">
337
+ <?php esc_html_e( 'Remove role&hellip;', 'members' ); ?>
338
+ </label>
339
+
340
+ <select name="<?php echo esc_attr( "members-remove-role-{$which}" ); ?>" id="<?php echo esc_attr( "members-remove-role-{$which}" ); ?>" style="display: inline-block; float: none;">
341
+ <option value=""><?php esc_html_e( 'Remove role&hellip;', 'members' ); ?></option>
342
+ <?php wp_dropdown_roles(); ?>
343
+ </select>
344
+
345
+ <?php submit_button( esc_html__( 'Remove', 'members' ), 'secondary', esc_attr( "members-remove-role-submit-{$which}" ), false );
346
+ }
347
+
348
+ /**
349
+ * Handles table column headers.
350
+ *
351
+ * @since 2.0.0
352
+ * @access public
353
+ * @param array $columns
354
+ * @return array
355
+ */
356
+ public function manage_users_columns( $columns ) {
357
+
358
+ // Make sure role column is named correctly.
359
+ if ( isset( $columns['role'] ) )
360
+ $columns['role'] = esc_html__( 'Roles', 'members' );
361
+
362
+ return $columns;
363
+ }
364
+
365
+ /**
366
+ * Handles the output of the roles column on the `users.php` screen.
367
+ *
368
+ * @since 2.0.0
369
+ * @access public
370
+ * @param string $output
371
+ * @param string $column
372
+ * @param int $user_id
373
+ * @return string
374
+ */
375
+ public function manage_users_custom_column( $output, $column, $user_id ) {
376
+
377
+ if ( 'roles' === $column ) {
378
+
379
+ $user = new \WP_User( $user_id );
380
+
381
+ $user_roles = array();
382
+ $output = esc_html__( 'None', 'members' );
383
+
384
+ if ( is_array( $user->roles ) ) {
385
+
386
+ foreach ( $user->roles as $role ) {
387
+
388
+ if ( members_role_exists( $role ) )
389
+ $user_roles[] = members_translate_role( $role );
390
+ }
391
+
392
+ $output = join( ', ', $user_roles );
393
+ }
394
+ }
395
+
396
+ return $output;
397
+ }
398
+
399
+ /**
400
+ * Enqueue scripts.
401
+ *
402
+ * @since 2.0.0
403
+ * @access public
404
+ * @return void
405
+ */
406
+ public function enqueue() {
407
+
408
+ wp_enqueue_script( 'jquery' );
409
+ }
410
+
411
+ /**
412
+ * Enqueue the plugin admin CSS.
413
+ *
414
+ * @since 2.0.0
415
+ * @access public
416
+ * @return void
417
+ */
418
+ public function print_scripts() { ?>
419
+
420
+ <script>
421
+ jQuery( document ).ready( function() {
422
+
423
+ jQuery(
424
+ 'label[for="new_role"], label[for="new_role2"], #new_role, #new_role2, #changeit, #changeit2'
425
+ ).remove();
426
+ } );
427
+ </script>
428
+
429
+ <?php }
430
+
431
+ /**
432
+ * Hides the core WP change role form fields because these are hardcoded in.
433
+ *
434
+ * @since 2.0.0
435
+ * @access public
436
+ * @return void
437
+ */
438
+ public function print_styles() { ?>
439
+
440
+ <style type="text/css">
441
+ label[for="new_role"], #new_role, #changeit,
442
+ label[for="new_role2"], #new_role2, #changeit2 { display: none !important; }
443
+ </style>
444
+
445
+ <?php }
446
+
447
+ /**
448
+ * Returns the instance.
449
+ *
450
+ * @since 2.0.0
451
+ * @access public
452
+ * @return object
453
+ */
454
+ public static function get_instance() {
455
+
456
+ if ( is_null( self::$instance ) ) {
457
+ self::$instance = new self;
458
+
459
+ self::$instance->setup_actions();
460
+ }
461
+
462
+ return self::$instance;
463
+ }
464
+ }
465
+
466
+ Manage_Users::get_instance();
admin/class-meta-box-content-permissions.php CHANGED
File without changes
admin/class-meta-box-custom-cap.php CHANGED
@@ -1,110 +1,110 @@
1
- <?php
2
- /**
3
- * Add new/custom capability meta box.
4
- *
5
- * @package Members
6
- * @subpackage Admin
7
- * @author Justin Tadlock <justintadlock@gmail.com>
8
- * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
- * @link https://themehybrid.com/plugins/members
10
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
- */
12
-
13
- namespace Members\Admin;
14
-
15
- /**
16
- * Class to handle the new cap meta box on the edit/new role screen.
17
- *
18
- * @since 2.0.0
19
- * @access public
20
- */
21
- final class Meta_Box_Custom_Cap {
22
-
23
- /**
24
- * Holds the instances of this class.
25
- *
26
- * @since 2.0.0
27
- * @access private
28
- * @var object
29
- */
30
- private static $instance;
31
-
32
- /**
33
- * Adds our methods to the proper hooks.
34
- *
35
- * @since 2.0.0
36
- * @access public
37
- * @return void
38
- */
39
- protected function __construct() {
40
-
41
- add_action( 'members_load_role_edit', array( $this, 'load' ) );
42
- add_action( 'members_load_role_new', array( $this, 'load' ) );
43
- }
44
-
45
- /**
46
- * Runs on the page load hook to hook in the meta boxes.
47
- *
48
- * @since 2.0.0
49
- * @access public
50
- * @return void
51
- */
52
- public function load() {
53
-
54
- add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
55
- }
56
-
57
- /**
58
- * Adds the meta box.
59
- *
60
- * @since 2.0.0
61
- * @access public
62
- * @param string $screen_id
63
- * @param string $role
64
- * @return void
65
- */
66
- public function add_meta_boxes( $screen_id, $role = '' ) {
67
-
68
- // If role isn't editable, bail.
69
- if ( $role && ! members_is_role_editable( $role ) )
70
- return;
71
-
72
- // Add the meta box.
73
- add_meta_box( 'newcapdiv', esc_html__( 'Custom Capability', 'members' ), array( $this, 'meta_box' ), $screen_id, 'side', 'core' );
74
- }
75
-
76
- /**
77
- * Outputs the meta box HTML.
78
- *
79
- * @since 2.0.0
80
- * @access public
81
- * @return void
82
- */
83
- public function meta_box() { ?>
84
-
85
- <p>
86
- <input type="text" id="members-new-cap-field" class="widefat" />
87
- </p>
88
-
89
- <p>
90
- <button type="button" class="button-secondary" id="members-add-new-cap"><?php echo esc_html_x( 'Add New', 'capability', 'members' ); ?></button>
91
- </p>
92
- <?php }
93
-
94
- /**
95
- * Returns the instance.
96
- *
97
- * @since 2.0.0
98
- * @access public
99
- * @return object
100
- */
101
- public static function get_instance() {
102
-
103
- if ( ! self::$instance )
104
- self::$instance = new self;
105
-
106
- return self::$instance;
107
- }
108
- }
109
-
110
- Meta_Box_Custom_Cap::get_instance();
1
+ <?php
2
+ /**
3
+ * Add new/custom capability meta box.
4
+ *
5
+ * @package Members
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justintadlock@gmail.com>
8
+ * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
+ * @link https://themehybrid.com/plugins/members
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ namespace Members\Admin;
14
+
15
+ /**
16
+ * Class to handle the new cap meta box on the edit/new role screen.
17
+ *
18
+ * @since 2.0.0
19
+ * @access public
20
+ */
21
+ final class Meta_Box_Custom_Cap {
22
+
23
+ /**
24
+ * Holds the instances of this class.
25
+ *
26
+ * @since 2.0.0
27
+ * @access private
28
+ * @var object
29
+ */
30
+ private static $instance;
31
+
32
+ /**
33
+ * Adds our methods to the proper hooks.
34
+ *
35
+ * @since 2.0.0
36
+ * @access public
37
+ * @return void
38
+ */
39
+ protected function __construct() {
40
+
41
+ add_action( 'members_load_role_edit', array( $this, 'load' ) );
42
+ add_action( 'members_load_role_new', array( $this, 'load' ) );
43
+ }
44
+
45
+ /**
46
+ * Runs on the page load hook to hook in the meta boxes.
47
+ *
48
+ * @since 2.0.0
49
+ * @access public
50
+ * @return void
51
+ */
52
+ public function load() {
53
+
54
+ add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
55
+ }
56
+
57
+ /**
58
+ * Adds the meta box.
59
+ *
60
+ * @since 2.0.0
61
+ * @access public
62
+ * @param string $screen_id
63
+ * @param string $role
64
+ * @return void
65
+ */
66
+ public function add_meta_boxes( $screen_id, $role = '' ) {
67
+
68
+ // If role isn't editable, bail.
69
+ if ( $role && ! members_is_role_editable( $role ) )
70
+ return;
71
+
72
+ // Add the meta box.
73
+ add_meta_box( 'newcapdiv', esc_html__( 'Custom Capability', 'members' ), array( $this, 'meta_box' ), $screen_id, 'side', 'core' );
74
+ }
75
+
76
+ /**
77
+ * Outputs the meta box HTML.
78
+ *
79
+ * @since 2.0.0
80
+ * @access public
81
+ * @return void
82
+ */
83
+ public function meta_box() { ?>
84
+
85
+ <p>
86
+ <input type="text" id="members-new-cap-field" class="widefat" />
87
+ </p>
88
+
89
+ <p>
90
+ <button type="button" class="button-secondary" id="members-add-new-cap"><?php echo esc_html_x( 'Add New', 'capability', 'members' ); ?></button>
91
+ </p>
92
+ <?php }
93
+
94
+ /**
95
+ * Returns the instance.
96
+ *
97
+ * @since 2.0.0
98
+ * @access public
99
+ * @return object
100
+ */
101
+ public static function get_instance() {
102
+
103
+ if ( ! self::$instance )
104
+ self::$instance = new self;
105
+
106
+ return self::$instance;
107
+ }
108
+ }
109
+
110
+ Meta_Box_Custom_Cap::get_instance();
admin/class-meta-box-publish-role.php CHANGED
@@ -1,169 +1,169 @@
1
- <?php
2
- /**
3
- * Publish/Update role meta box.
4
- *
5
- * @package Members
6
- * @subpackage Admin
7
- * @author Justin Tadlock <justintadlock@gmail.com>
8
- * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
- * @link https://themehybrid.com/plugins/members
10
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
- */
12
-
13
- namespace Members\Admin;
14
-
15
- /**
16
- * Class to handle the role meta box edit/new role screen.
17
- *
18
- * @since 2.0.0
19
- * @access public
20
- */
21
- final class Meta_Box_Publish_Role {
22
-
23
- /**
24
- * Holds the instances of this class.
25
- *
26
- * @since 2.0.0
27
- * @access private
28
- * @var object
29
- */
30
- private static $instance;
31
-
32
- /**
33
- * Adds our methods to the proper hooks.
34
- *
35
- * @since 2.0.0
36
- * @access public
37
- * @return void
38
- */
39
- protected function __construct() {
40
-
41
- add_action( 'members_load_role_edit', array( $this, 'load' ) );
42
- add_action( 'members_load_role_new', array( $this, 'load' ) );
43
- }
44
-
45
- /**
46
- * Runs on the page load hook to hook in the meta boxes.
47
- *
48
- * @since 2.0.0
49
- * @access public
50
- * @return void
51
- */
52
- public function load() {
53
-
54
- add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
55
- }
56
-
57
- /**
58
- * Adds the meta box.
59
- *
60
- * @since 2.0.0
61
- * @access public
62
- * @param string $screen_id
63
- * @return void
64
- */
65
- public function add_meta_boxes( $screen_id ) {
66
-
67
- add_meta_box( 'submitdiv', esc_html__( 'Role', 'members' ), array( $this, 'meta_box' ), $screen_id, 'side', 'high' );
68
- }
69
-
70
- /**
71
- * Outputs the meta box HTML.
72
- *
73
- * @since 2.0.0
74
- * @access public
75
- * @param object $role
76
- * @return void
77
- */
78
- public function meta_box( $role ) {
79
-
80
- // Set up some defaults for new roles.
81
- $is_editable = true;
82
- $user_count = 0;
83
- $grant_count = 0;
84
- $deny_count = 0;
85
-
86
- // If we're editing a role, overwrite the defaults.
87
- if ( $role ) {
88
- $is_editable = members_is_role_editable( $role->name );
89
- $user_count = members_get_role_user_count( $role->name );
90
- $grant_count = members_get_role_granted_cap_count( $role->name );
91
- $deny_count = members_get_role_denied_cap_count( $role->name );
92
- } ?>
93
-
94
- <div class="submitbox" id="submitpost">
95
-
96
- <div id="misc-publishing-actions">
97
-
98
- <div class="misc-pub-section misc-pub-section-users">
99
- <i class="dashicons dashicons-admin-users"></i>
100
- <?php if ( 0 < $user_count && current_user_can( 'list_users' ) ) : ?>
101
-
102
- <a href="<?php echo esc_url( add_query_arg( 'role', $role->name, admin_url( 'users.php' ) ) ); ?>"><?php echo esc_html(
103
- sprintf(
104
- _n( '%s User', '%s Users', absint( $user_count ), 'members' ),
105
- number_format_i18n( $user_count )
106
- )
107
- ); ?></a>
108
-
109
- <?php else : ?>
110
- <?php esc_html_e( 'Users:', 'members' ); ?>
111
- <strong class="user-count"><?php echo number_format_i18n( $user_count ); ?></strong>
112
- <?php endif; ?>
113
- </div>
114
-
115
- <div class="misc-pub-section misc-pub-section-granted">
116
- <i class="dashicons dashicons-yes"></i>
117
- <?php esc_html_e( 'Granted:', 'members' ); ?>
118
- <strong class="granted-count"><?php echo number_format_i18n( $grant_count ); ?></strong>
119
- </div>
120
-
121
- <div class="misc-pub-section misc-pub-section-denied">
122
- <i class="dashicons dashicons-no"></i>
123
- <?php esc_html_e( 'Denied:', 'members' ); ?>
124
- <strong class="denied-count"><?php echo number_format_i18n( $deny_count ); ?></strong>
125
- </div>
126
-
127
- </div><!-- #misc-publishing-actions -->
128
-
129
- <div id="major-publishing-actions">
130
-
131
- <div id="delete-action">
132
-
133
- <?php if ( $is_editable && $role ) : ?>
134
- <a class="submitdelete deletion members-delete-role-link" href="<?php echo esc_url( members_get_delete_role_url( $role->name ) ); ?>"><?php echo esc_html_x( 'Delete', 'delete role', 'members' ); ?></a>
135
- <?php endif; ?>
136
- </div>
137
-
138
- <div id="publishing-action">
139
-
140
- <?php if ( $is_editable ) : ?>
141
- <?php submit_button( $role ? esc_attr__( 'Update', 'members' ) : esc_attr__( 'Add Role', 'members' ), 'primary', 'publish', false, array( 'id' => 'publish' ) ); ?>
142
- <?php endif; ?>
143
-
144
- </div><!-- #publishing-action -->
145
-
146
- <div class="clear"></div>
147
-
148
- </div><!-- #major-publishing-actions -->
149
-
150
- </div><!-- .submitbox -->
151
- <?php }
152
-
153
- /**
154
- * Returns the instance.
155
- *
156
- * @since 2.0.0
157
- * @access public
158
- * @return object
159
- */
160
- public static function get_instance() {
161
-
162
- if ( ! self::$instance )
163
- self::$instance = new self;
164
-
165
- return self::$instance;
166
- }
167
- }
168
-
169
- Meta_Box_Publish_Role::get_instance();
1
+ <?php
2
+ /**
3
+ * Publish/Update role meta box.
4
+ *
5
+ * @package Members
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justintadlock@gmail.com>
8
+ * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
+ * @link https://themehybrid.com/plugins/members
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ namespace Members\Admin;
14
+
15
+ /**
16
+ * Class to handle the role meta box edit/new role screen.
17
+ *
18
+ * @since 2.0.0
19
+ * @access public
20
+ */
21
+ final class Meta_Box_Publish_Role {
22
+
23
+ /**
24
+ * Holds the instances of this class.
25
+ *
26
+ * @since 2.0.0
27
+ * @access private
28
+ * @var object
29
+ */
30
+ private static $instance;
31
+
32
+ /**
33
+ * Adds our methods to the proper hooks.
34
+ *
35
+ * @since 2.0.0
36
+ * @access public
37
+ * @return void
38
+ */
39
+ protected function __construct() {
40
+
41
+ add_action( 'members_load_role_edit', array( $this, 'load' ) );
42
+ add_action( 'members_load_role_new', array( $this, 'load' ) );
43
+ }
44
+
45
+ /**
46
+ * Runs on the page load hook to hook in the meta boxes.
47
+ *
48
+ * @since 2.0.0
49
+ * @access public
50
+ * @return void
51
+ */
52
+ public function load() {
53
+
54
+ add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
55
+ }
56
+
57
+ /**
58
+ * Adds the meta box.
59
+ *
60
+ * @since 2.0.0
61
+ * @access public
62
+ * @param string $screen_id
63
+ * @return void
64
+ */
65
+ public function add_meta_boxes( $screen_id ) {
66
+
67
+ add_meta_box( 'submitdiv', esc_html__( 'Role', 'members' ), array( $this, 'meta_box' ), $screen_id, 'side', 'high' );
68
+ }
69
+
70
+ /**
71
+ * Outputs the meta box HTML.
72
+ *
73
+ * @since 2.0.0
74
+ * @access public
75
+ * @param object $role
76
+ * @return void
77
+ */
78
+ public function meta_box( $role ) {
79
+
80
+ // Set up some defaults for new roles.
81
+ $is_editable = true;
82
+ $user_count = 0;
83
+ $grant_count = 0;
84
+ $deny_count = 0;
85
+
86
+ // If we're editing a role, overwrite the defaults.
87
+ if ( $role ) {
88
+ $is_editable = members_is_role_editable( $role->name );
89
+ $user_count = members_get_role_user_count( $role->name );
90
+ $grant_count = members_get_role_granted_cap_count( $role->name );
91
+ $deny_count = members_get_role_denied_cap_count( $role->name );
92
+ } ?>
93
+
94
+ <div class="submitbox" id="submitpost">
95
+
96
+ <div id="misc-publishing-actions">
97
+
98
+ <div class="misc-pub-section misc-pub-section-users">
99
+ <i class="dashicons dashicons-admin-users"></i>
100
+ <?php if ( 0 < $user_count && current_user_can( 'list_users' ) ) : ?>
101
+
102
+ <a href="<?php echo esc_url( add_query_arg( 'role', $role->name, admin_url( 'users.php' ) ) ); ?>"><?php echo esc_html(
103
+ sprintf(
104
+ _n( '%s User', '%s Users', absint( $user_count ), 'members' ),
105
+ number_format_i18n( $user_count )
106
+ )
107
+ ); ?></a>
108
+
109
+ <?php else : ?>
110
+ <?php esc_html_e( 'Users:', 'members' ); ?>
111
+ <strong class="user-count"><?php echo number_format_i18n( $user_count ); ?></strong>
112
+ <?php endif; ?>
113
+ </div>
114
+
115
+ <div class="misc-pub-section misc-pub-section-granted">
116
+ <i class="dashicons dashicons-yes"></i>
117
+ <?php esc_html_e( 'Granted:', 'members' ); ?>
118
+ <strong class="granted-count"><?php echo number_format_i18n( $grant_count ); ?></strong>
119
+ </div>
120
+
121
+ <div class="misc-pub-section misc-pub-section-denied">
122
+ <i class="dashicons dashicons-no"></i>
123
+ <?php esc_html_e( 'Denied:', 'members' ); ?>
124
+ <strong class="denied-count"><?php echo number_format_i18n( $deny_count ); ?></strong>
125
+ </div>
126
+
127
+ </div><!-- #misc-publishing-actions -->
128
+
129
+ <div id="major-publishing-actions">
130
+
131
+ <div id="delete-action">
132
+
133
+ <?php if ( $is_editable && $role ) : ?>
134
+ <a class="submitdelete deletion members-delete-role-link" href="<?php echo esc_url( members_get_delete_role_url( $role->name ) ); ?>"><?php echo esc_html_x( 'Delete', 'delete role', 'members' ); ?></a>
135
+ <?php endif; ?>
136
+ </div>
137
+
138
+ <div id="publishing-action">
139
+
140
+ <?php if ( $is_editable ) : ?>
141
+ <?php submit_button( $role ? esc_attr__( 'Update', 'members' ) : esc_attr__( 'Add Role', 'members' ), 'primary', 'publish', false, array( 'id' => 'publish' ) ); ?>
142
+ <?php endif; ?>
143
+
144
+ </div><!-- #publishing-action -->
145
+
146
+ <div class="clear"></div>
147
+
148
+ </div><!-- #major-publishing-actions -->
149
+
150
+ </div><!-- .submitbox -->
151
+ <?php }
152
+
153
+ /**
154
+ * Returns the instance.
155
+ *
156
+ * @since 2.0.0
157
+ * @access public
158
+ * @return object
159
+ */
160
+ public static function get_instance() {
161
+
162
+ if ( ! self::$instance )
163
+ self::$instance = new self;
164
+
165
+ return self::$instance;
166
+ }
167
+ }
168
+
169
+ Meta_Box_Publish_Role::get_instance();
admin/class-role-edit.php CHANGED
@@ -1,353 +1,353 @@
1
- <?php
2
- /**
3
- * Handles the edit role screen.
4
- *
5
- * @package Members
6
- * @subpackage Admin
7
- * @author Justin Tadlock <justintadlock@gmail.com>
8
- * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
- * @link https://themehybrid.com/plugins/members
10
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
- */
12
-
13
- namespace Members\Admin;
14
-
15
- /**
16
- * Class that displays the edit role screen and handles the form submissions for that page.
17
- *
18
- * @since 2.0.0
19
- * @access public
20
- */
21
- final class Role_Edit {
22
-
23
- /**
24
- * Current role object to be edited/viewed.
25
- *
26
- * @since 2.0.0
27
- * @access protected
28
- * @var object
29
- */
30
- protected $role;
31
-
32
- /**
33
- * Current Members role object to be edited/viewed.
34
- *
35
- * @since 2.0.0
36
- * @access protected
37
- * @var object
38
- */
39
- protected $members_role;
40
-
41
- /**
42
- * Whether the current role can be edited.
43
- *
44
- * @since 2.0.0
45
- * @access protected
46
- * @var bool
47
- */
48
- protected $is_editable = true;
49
-
50
- /**
51
- * Available capabilities.
52
- *
53
- * @since 2.0.0
54
- * @access protected
55
- * @var array
56
- */
57
- protected $capabilities = array();
58
-
59
- /**
60
- * Whether the page was updated.
61
- *
62
- * @since 2.0.0
63
- * @access protected
64
- * @var bool
65
- */
66
- protected $role_updated = false;
67
-
68
- /**
69
- * Sets up some necessary actions/filters.
70
- *
71
- * @since 2.0.0
72
- * @access public
73
- * @return void
74
- */
75
- public function __construct() {
76
-
77
- // Add help tabs.
78
- add_action( 'members_load_role_edit', array( $this, 'add_help_tabs' ) );
79
- }
80
-
81
- /**
82
- * Runs on the `load-{$page}` hook. This is the handler for form submissions.
83
- *
84
- * @since 2.0.0
85
- * @access public
86
- * @return void
87
- */
88
- public function load() {
89
-
90
- // If the current user can't edit roles, don't proceed.
91
- if ( ! current_user_can( 'edit_roles' ) )
92
- wp_die( esc_html__( 'Whoah, partner!', 'members' ) );
93
-
94
- // Get the current role object to edit.
95
- $this->role = get_role( members_sanitize_role( $_GET['role'] ) );
96
-
97
- // If we don't have a real role, die.
98
- if ( is_null( $this->role ) )
99
- wp_die( esc_html__( 'The requested role to edit does not exist.', 'members' ) );
100
-
101
- $this->members_role = members_get_role( $this->role->name );
102
-
103
- // Get all the capabilities.
104
- $this->capabilities = members_get_capabilities();
105
-
106
- // Add all caps from the cap groups.
107
- foreach ( members_get_cap_groups() as $group )
108
- $this->capabilities = array_merge( $this->capabilities, $group->caps );
109
-
110
- // Make sure we have a unique array of caps.
111
- $this->capabilities = array_unique( $this->capabilities );
112
-
113
- // Is the role editable?
114
- $this->is_editable = members_is_role_editable( $this->role->name );
115
-
116
- // Check if the form has been submitted.
117
- if ( $this->is_editable && isset( $_POST['members_edit_role_nonce'] ) ) {
118
-
119
- // Verify the nonce.
120
- check_admin_referer( 'edit_role', 'members_edit_role_nonce' );
121
-
122
- // Get the granted and denied caps.
123
- $grant_caps = ! empty( $_POST['grant-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['grant-caps'] ) ) : array();
124
- $deny_caps = ! empty( $_POST['deny-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['deny-caps'] ) ) : array();
125
-
126
- // Get the new (custom) granted and denied caps.
127
- $grant_new_caps = ! empty( $_POST['grant-new-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['grant-new-caps'] ) ) : array();
128
- $deny_new_caps = ! empty( $_POST['deny-new-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['deny-new-caps'] ) ) : array();
129
-
130
- // Get the all and custom cap group objects.
131
- $all_group = members_get_cap_group( 'all' );
132
- $custom_group = members_get_cap_group( 'custom' );
133
-
134
- // New caps to push to cap groups on update.
135
- $push_caps = array();
136
-
137
- // Set the $role_updated variable to true.
138
- $this->role_updated = true;
139
-
140
- // Loop through all available capabilities.
141
- foreach ( $this->capabilities as $cap ) {
142
-
143
- // Get the posted capability.
144
- $grant_this_cap = in_array( $cap, $grant_caps );
145
- $deny_this_cap = in_array( $cap, $deny_caps );
146
-
147
- // Does the role have the cap?
148
- $is_granted_cap = $this->role->has_cap( $cap );
149
- $is_denied_cap = isset( $this->role->capabilities[ $cap ] ) && false === $this->role->capabilities[ $cap ];
150
-
151
- if ( $grant_this_cap && ! $is_granted_cap )
152
- $this->role->add_cap( $cap );
153
-
154
- else if ( $deny_this_cap && ! $is_denied_cap )
155
- $this->role->add_cap( $cap, false );
156
-
157
- else if ( ! $grant_this_cap && $is_granted_cap )
158
- $this->role->remove_cap( $cap );
159
-
160
- else if ( ! $deny_this_cap && $is_denied_cap )
161
- $this->role->remove_cap( $cap );
162
-
163
- } // End loop through existing capabilities.
164
-
165
- // Loop through the custom granted caps.
166
- foreach ( $grant_new_caps as $grant_new_cap ) {
167
-
168
- $_cap = members_sanitize_cap( $grant_new_cap );
169
-
170
- // If not an existing cap, add it.
171
- if ( 'do_not_allow' !== $_cap && ! in_array( $_cap, $this->capabilities ) ) {
172
- $this->role->add_cap( $_cap );
173
-
174
- $push_caps[] = $_cap;
175
- }
176
- }
177
-
178
- // Loop through the custom denied caps.
179
- foreach ( $deny_new_caps as $deny_new_cap ) {
180
-
181
- $_cap = members_sanitize_cap( $deny_new_cap );
182
-
183
- // If not a granted cap and not an existing cap, add it.
184
- if ( 'do_not_allow' !== $_cap && ! in_array( $_cap, $this->capabilities ) && ! in_array( $_cap, $grant_new_caps ) ) {
185
- $this->role->add_cap( $_cap, false );
186
-
187
- $push_caps[] = $_cap;
188
- }
189
- }
190
-
191
- // If there are new caps, add them to the all and custom groups.
192
- if ( $push_caps ) {
193
-
194
- if ( $all_group ) {
195
- $all_group->caps[] = $_cap;
196
- sort( $all_group->caps );
197
- }
198
-
199
- if ( $custom_group ) {
200
- $custom_group->caps[] = $_cap;
201
- sort( $custom_group->caps );
202
- }
203
- }
204
-
205
- // Add the updated role to the role registry.
206
- members_unregister_role( $this->role->name );
207
-
208
- members_register_role(
209
- $this->role->name,
210
- array(
211
- 'label' => $this->members_role->get( 'label' ),
212
- 'caps' => $this->role->capabilities
213
- )
214
- );
215
-
216
- // Reset the Members role object.
217
- $this->members_role = members_get_role( $this->role->name );
218
-
219
- // Action hook for when a role is updated.
220
- do_action( 'members_role_updated', $this->role->name );
221
-
222
- } // End check for form submission.
223
-
224
- // If successful update.
225
- if ( $this->role_updated )
226
- add_settings_error( 'members_edit_role', 'role_updated', sprintf( esc_html__( '%s role updated.', 'members' ), members_get_role( $this->role->name )->get( 'label' ) ), 'updated' );
227
-
228
- // If the role is not editable.
229
- if ( ! $this->is_editable )
230
- add_settings_error( 'members_edit_role', 'role_uneditable', sprintf( esc_html__( 'The %s role is not editable. This means that it is most likely added via another plugin for a special use or that you do not have permission to edit it.', 'members' ), members_get_role( $this->role->name )->get( 'label' ) ) );
231
-
232
- // If editing the core administrator role.
233
- if ( 'administrator' === $this->role->name )
234
- add_settings_error( 'members_edit_role', 'role_is_admin', sprintf( esc_html__( 'The %s role is typically the most important role on the site. Please take extreme caution that you do not inadvertently remove necessary capabilities.', 'members' ), members_get_role( $this->role->name )->get( 'label' ) ) );
235
-
236
- // If a new role was added (redirect from new role screen).
237
- if ( isset( $_GET['message'] ) && 'role_added' === $_GET['message'] )
238
- add_settings_error( 'members_edit_role', 'role_added', sprintf( esc_html__( 'The %s role has been created.', 'members' ), members_get_role( $this->role->name )->get( 'label' ) ), 'updated' );
239
-
240
- // Load page hook.
241
- do_action( 'members_load_role_edit' );
242
-
243
- // Hook for adding in meta boxes.
244
- do_action( 'add_meta_boxes_' . get_current_screen()->id, $this->role->name );
245
- do_action( 'add_meta_boxes', get_current_screen()->id, $this->role->name );
246
-
247
- // Add layout screen option.
248
- add_screen_option( 'layout_columns', array( 'max' => 2, 'default' => 2 ) );
249
- }
250
-
251
- /**
252
- * Adds help tabs.
253
- *
254
- * @since 2.0.0
255
- * @access public
256
- * @return void
257
- */
258
- public function add_help_tabs() {
259
-
260
- // Get the current screen.
261
- $screen = get_current_screen();
262
-
263
- // Add help tabs.
264
- $screen->add_help_tab( members_get_edit_role_help_overview_args() );
265
- $screen->add_help_tab( members_get_edit_role_help_role_name_args() );
266
- $screen->add_help_tab( members_get_edit_role_help_edit_caps_args() );
267
- $screen->add_help_tab( members_get_edit_role_help_custom_cap_args() );
268
-
269
- // Set the help sidebar.
270
- $screen->set_help_sidebar( members_get_help_sidebar_text() );
271
- }
272
-
273
- /**
274
- * Enqueue scripts/styles.
275
- *
276
- * @since 2.0.0
277
- * @access public
278
- * @return void
279
- */
280
- public function enqueue() {
281
-
282
- wp_enqueue_style( 'members-admin' );
283
- wp_enqueue_script( 'members-edit-role' );
284
- }
285
-
286
- /**
287
- * Displays the page content.
288
- *
289
- * @since 2.0.0
290
- * @access public
291
- * @return void
292
- */
293
- public function page() { ?>
294
-
295
- <div class="wrap">
296
-
297
- <h1>
298
- <?php esc_html_e( 'Edit Role', 'members' ); ?>
299
-
300
- <?php if ( current_user_can( 'create_roles' ) ) : ?>
301
- <?php printf( '<a class="page-title-action" href="%s">%s</a>', esc_url( members_get_new_role_url() ), esc_html_x( 'Add New', 'role', 'members' ) ); ?>
302
- <?php endif; ?>
303
- </h1>
304
-
305
- <?php settings_errors( 'members_edit_role' ); ?>
306
-
307
- <div id="poststuff">
308
-
309
- <form name="form0" method="post" action="<?php echo esc_url( members_get_edit_role_url( $this->role->name ) ); ?>">
310
-
311
- <?php wp_nonce_field( 'edit_role', 'members_edit_role_nonce' ); ?>
312
-
313
- <div id="post-body" class="metabox-holder columns-<?php echo 1 == get_current_screen()->get_columns() ? 1 : 2; ?>">
314
-
315
- <div id="post-body-content">
316
-
317
- <div id="titlediv" class="members-title-div">
318
-
319
- <div id="titlewrap">
320
- <span class="screen-reader-text"><?php esc_html_e( 'Role Name', 'members' ); ?></span>
321
- <input type="text" disabled="disabled" readonly="readonly" value="<?php echo esc_attr( members_get_role( $this->role->name )->get( 'label' ) ); ?>" />
322
- </div><!-- #titlewrap -->
323
-
324
- <div class="inside">
325
- <div id="edit-slug-box">
326
- <strong><?php esc_html_e( 'Role:', 'members' ); ?></strong> <?php echo esc_attr( $this->role->name ); ?> <!-- edit box -->
327
- </div>
328
- </div><!-- .inside -->
329
-
330
- </div><!-- .members-title-div -->
331
-
332
- <?php $cap_tabs = new Cap_Tabs( $this->role->name ); ?>
333
- <?php $cap_tabs->display(); ?>
334
-
335
- </div><!-- #post-body-content -->
336
-
337
- <?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?>
338
- <?php wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); ?>
339
-
340
- <div id="postbox-container-1" class="postbox-container side">
341
-
342
- <?php do_meta_boxes( get_current_screen()->id, 'side', $this->role ); ?>
343
-
344
- </div><!-- .post-box-container -->
345
-
346
- </div><!-- #post-body -->
347
- </form>
348
-
349
- </div><!-- #poststuff -->
350
-
351
- </div><!-- .wrap -->
352
- <?php }
353
- }
1
+ <?php
2
+ /**
3
+ * Handles the edit role screen.
4
+ *
5
+ * @package Members
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justintadlock@gmail.com>
8
+ * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
+ * @link https://themehybrid.com/plugins/members
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ namespace Members\Admin;
14
+
15
+ /**
16
+ * Class that displays the edit role screen and handles the form submissions for that page.
17
+ *
18
+ * @since 2.0.0
19
+ * @access public
20
+ */
21
+ final class Role_Edit {
22
+
23
+ /**
24
+ * Current role object to be edited/viewed.
25
+ *
26
+ * @since 2.0.0
27
+ * @access protected
28
+ * @var object
29
+ */
30
+ protected $role;
31
+
32
+ /**
33
+ * Current Members role object to be edited/viewed.
34
+ *
35
+ * @since 2.0.0
36
+ * @access protected
37
+ * @var object
38
+ */
39
+ protected $members_role;
40
+
41
+ /**
42
+ * Whether the current role can be edited.
43
+ *
44
+ * @since 2.0.0
45
+ * @access protected
46
+ * @var bool
47
+ */
48
+ protected $is_editable = true;
49
+
50
+ /**
51
+ * Available capabilities.
52
+ *
53
+ * @since 2.0.0
54
+ * @access protected
55
+ * @var array
56
+ */
57
+ protected $capabilities = array();
58
+
59
+ /**
60
+ * Whether the page was updated.
61
+ *
62
+ * @since 2.0.0
63
+ * @access protected
64
+ * @var bool
65
+ */
66
+ protected $role_updated = false;
67
+
68
+ /**
69
+ * Sets up some necessary actions/filters.
70
+ *
71
+ * @since 2.0.0
72
+ * @access public
73
+ * @return void
74
+ */
75
+ public function __construct() {
76
+
77
+ // Add help tabs.
78
+ add_action( 'members_load_role_edit', array( $this, 'add_help_tabs' ) );
79
+ }
80
+
81
+ /**
82
+ * Runs on the `load-{$page}` hook. This is the handler for form submissions.
83
+ *
84
+ * @since 2.0.0
85
+ * @access public
86
+ * @return void
87
+ */
88
+ public function load() {
89
+
90
+ // If the current user can't edit roles, don't proceed.
91
+ if ( ! current_user_can( 'edit_roles' ) )
92
+ wp_die( esc_html__( 'Whoah, partner!', 'members' ) );
93
+
94
+ // Get the current role object to edit.
95
+ $this->role = get_role( members_sanitize_role( $_GET['role'] ) );
96
+
97
+ // If we don't have a real role, die.
98
+ if ( is_null( $this->role ) )
99
+ wp_die( esc_html__( 'The requested role to edit does not exist.', 'members' ) );
100
+
101
+ $this->members_role = members_get_role( $this->role->name );
102
+
103
+ // Get all the capabilities.
104
+ $this->capabilities = members_get_capabilities();
105
+
106
+ // Add all caps from the cap groups.
107
+ foreach ( members_get_cap_groups() as $group )
108
+ $this->capabilities = array_merge( $this->capabilities, $group->caps );
109
+
110
+ // Make sure we have a unique array of caps.
111
+ $this->capabilities = array_unique( $this->capabilities );
112
+
113
+ // Is the role editable?
114
+ $this->is_editable = members_is_role_editable( $this->role->name );
115
+
116
+ // Check if the form has been submitted.
117
+ if ( $this->is_editable && isset( $_POST['members_edit_role_nonce'] ) ) {
118
+
119
+ // Verify the nonce.
120
+ check_admin_referer( 'edit_role', 'members_edit_role_nonce' );
121
+
122
+ // Get the granted and denied caps.
123
+ $grant_caps = ! empty( $_POST['grant-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['grant-caps'] ) ) : array();
124
+ $deny_caps = ! empty( $_POST['deny-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['deny-caps'] ) ) : array();
125
+
126
+ // Get the new (custom) granted and denied caps.
127
+ $grant_new_caps = ! empty( $_POST['grant-new-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['grant-new-caps'] ) ) : array();
128
+ $deny_new_caps = ! empty( $_POST['deny-new-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['deny-new-caps'] ) ) : array();
129
+
130
+ // Get the all and custom cap group objects.
131
+ $all_group = members_get_cap_group( 'all' );
132
+ $custom_group = members_get_cap_group( 'custom' );
133
+
134
+ // New caps to push to cap groups on update.
135
+ $push_caps = array();
136
+
137
+ // Set the $role_updated variable to true.
138
+ $this->role_updated = true;
139
+
140
+ // Loop through all available capabilities.
141
+ foreach ( $this->capabilities as $cap ) {
142
+
143
+ // Get the posted capability.
144
+ $grant_this_cap = in_array( $cap, $grant_caps );
145
+ $deny_this_cap = in_array( $cap, $deny_caps );
146
+
147
+ // Does the role have the cap?
148
+ $is_granted_cap = $this->role->has_cap( $cap );
149
+ $is_denied_cap = isset( $this->role->capabilities[ $cap ] ) && false === $this->role->capabilities[ $cap ];
150
+
151
+ if ( $grant_this_cap && ! $is_granted_cap )
152
+ $this->role->add_cap( $cap );
153
+
154
+ else if ( $deny_this_cap && ! $is_denied_cap )
155
+ $this->role->add_cap( $cap, false );
156
+
157
+ else if ( ! $grant_this_cap && $is_granted_cap )
158
+ $this->role->remove_cap( $cap );
159
+
160
+ else if ( ! $deny_this_cap && $is_denied_cap )
161
+ $this->role->remove_cap( $cap );
162
+
163
+ } // End loop through existing capabilities.
164
+
165
+ // Loop through the custom granted caps.
166
+ foreach ( $grant_new_caps as $grant_new_cap ) {
167
+
168
+ $_cap = members_sanitize_cap( $grant_new_cap );
169
+
170
+ // If not an existing cap, add it.
171
+ if ( 'do_not_allow' !== $_cap && ! in_array( $_cap, $this->capabilities ) ) {
172
+ $this->role->add_cap( $_cap );
173
+
174
+ $push_caps[] = $_cap;
175
+ }
176
+ }
177
+
178
+ // Loop through the custom denied caps.
179
+ foreach ( $deny_new_caps as $deny_new_cap ) {
180
+
181
+ $_cap = members_sanitize_cap( $deny_new_cap );
182
+
183
+ // If not a granted cap and not an existing cap, add it.
184
+ if ( 'do_not_allow' !== $_cap && ! in_array( $_cap, $this->capabilities ) && ! in_array( $_cap, $grant_new_caps ) ) {
185
+ $this->role->add_cap( $_cap, false );
186
+
187
+ $push_caps[] = $_cap;
188
+ }
189
+ }
190
+
191
+ // If there are new caps, add them to the all and custom groups.
192
+ if ( $push_caps ) {
193
+
194
+ if ( $all_group ) {
195
+ $all_group->caps[] = $_cap;
196
+ sort( $all_group->caps );
197
+ }
198
+
199
+ if ( $custom_group ) {
200
+ $custom_group->caps[] = $_cap;
201
+ sort( $custom_group->caps );
202
+ }
203
+ }
204
+
205
+ // Add the updated role to the role registry.
206
+ members_unregister_role( $this->role->name );
207
+
208
+ members_register_role(
209
+ $this->role->name,
210
+ array(
211
+ 'label' => $this->members_role->get( 'label' ),
212
+ 'caps' => $this->role->capabilities
213
+ )
214
+ );
215
+
216
+ // Reset the Members role object.
217
+ $this->members_role = members_get_role( $this->role->name );
218
+
219
+ // Action hook for when a role is updated.
220
+ do_action( 'members_role_updated', $this->role->name );
221
+
222
+ } // End check for form submission.
223
+
224
+ // If successful update.
225
+ if ( $this->role_updated )
226
+ add_settings_error( 'members_edit_role', 'role_updated', sprintf( esc_html__( '%s role updated.', 'members' ), members_get_role( $this->role->name )->get( 'label' ) ), 'updated' );
227
+
228
+ // If the role is not editable.
229
+ if ( ! $this->is_editable )
230
+ add_settings_error( 'members_edit_role', 'role_uneditable', sprintf( esc_html__( 'The %s role is not editable. This means that it is most likely added via another plugin for a special use or that you do not have permission to edit it.', 'members' ), members_get_role( $this->role->name )->get( 'label' ) ) );
231
+
232
+ // If editing the core administrator role.
233
+ if ( 'administrator' === $this->role->name )
234
+ add_settings_error( 'members_edit_role', 'role_is_admin', sprintf( esc_html__( 'The %s role is typically the most important role on the site. Please take extreme caution that you do not inadvertently remove necessary capabilities.', 'members' ), members_get_role( $this->role->name )->get( 'label' ) ) );
235
+
236
+ // If a new role was added (redirect from new role screen).
237
+ if ( isset( $_GET['message'] ) && 'role_added' === $_GET['message'] )
238
+ add_settings_error( 'members_edit_role', 'role_added', sprintf( esc_html__( 'The %s role has been created.', 'members' ), members_get_role( $this->role->name )->get( 'label' ) ), 'updated' );
239
+
240
+ // Load page hook.
241
+ do_action( 'members_load_role_edit' );
242
+
243
+ // Hook for adding in meta boxes.
244
+ do_action( 'add_meta_boxes_' . get_current_screen()->id, $this->role->name );
245
+ do_action( 'add_meta_boxes', get_current_screen()->id, $this->role->name );
246
+
247
+ // Add layout screen option.
248
+ add_screen_option( 'layout_columns', array( 'max' => 2, 'default' => 2 ) );
249
+ }
250
+
251
+ /**
252
+ * Adds help tabs.
253
+ *
254
+ * @since 2.0.0
255
+ * @access public
256
+ * @return void
257
+ */
258
+ public function add_help_tabs() {
259
+
260
+ // Get the current screen.
261
+ $screen = get_current_screen();
262
+
263
+ // Add help tabs.
264
+ $screen->add_help_tab( members_get_edit_role_help_overview_args() );
265
+ $screen->add_help_tab( members_get_edit_role_help_role_name_args() );
266
+ $screen->add_help_tab( members_get_edit_role_help_edit_caps_args() );
267
+ $screen->add_help_tab( members_get_edit_role_help_custom_cap_args() );
268
+
269
+ // Set the help sidebar.
270
+ $screen->set_help_sidebar( members_get_help_sidebar_text() );
271
+ }
272
+
273
+ /**
274
+ * Enqueue scripts/styles.
275
+ *
276
+ * @since 2.0.0
277
+ * @access public
278
+ * @return void
279
+ */
280
+ public function enqueue() {
281
+
282
+ wp_enqueue_style( 'members-admin' );
283
+ wp_enqueue_script( 'members-edit-role' );
284
+ }
285
+
286
+ /**
287
+ * Displays the page content.
288
+ *
289
+ * @since 2.0.0
290
+ * @access public
291
+ * @return void
292
+ */
293
+ public function page() { ?>
294
+
295
+ <div class="wrap">
296
+
297
+ <h1>
298
+ <?php esc_html_e( 'Edit Role', 'members' ); ?>
299
+
300
+ <?php if ( current_user_can( 'create_roles' ) ) : ?>
301
+ <?php printf( '<a class="page-title-action" href="%s">%s</a>', esc_url( members_get_new_role_url() ), esc_html_x( 'Add New', 'role', 'members' ) ); ?>
302
+ <?php endif; ?>
303
+ </h1>
304
+
305
+ <?php settings_errors( 'members_edit_role' ); ?>
306
+
307
+ <div id="poststuff">
308
+
309
+ <form name="form0" method="post" action="<?php echo esc_url( members_get_edit_role_url( $this->role->name ) ); ?>">
310
+
311
+ <?php wp_nonce_field( 'edit_role', 'members_edit_role_nonce' ); ?>
312
+
313
+ <div id="post-body" class="metabox-holder columns-<?php echo 1 == get_current_screen()->get_columns() ? 1 : 2; ?>">
314
+
315
+ <div id="post-body-content">
316
+
317
+ <div id="titlediv" class="members-title-div">
318
+
319
+ <div id="titlewrap">
320
+ <span class="screen-reader-text"><?php esc_html_e( 'Role Name', 'members' ); ?></span>
321
+ <input type="text" disabled="disabled" readonly="readonly" value="<?php echo esc_attr( members_get_role( $this->role->name )->get( 'label' ) ); ?>" />
322
+ </div><!-- #titlewrap -->
323
+
324
+ <div class="inside">
325
+ <div id="edit-slug-box">
326
+ <strong><?php esc_html_e( 'Role:', 'members' ); ?></strong> <?php echo esc_attr( $this->role->name ); ?> <!-- edit box -->
327
+ </div>
328
+ </div><!-- .inside -->
329
+
330
+ </div><!-- .members-title-div -->
331
+
332
+ <?php $cap_tabs = new Cap_Tabs( $this->role->name ); ?>
333
+ <?php $cap_tabs->display(); ?>
334
+
335
+ </div><!-- #post-body-content -->
336
+
337
+ <?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?>
338
+ <?php wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); ?>
339
+
340
+ <div id="postbox-container-1" class="postbox-container side">
341
+
342
+ <?php do_meta_boxes( get_current_screen()->id, 'side', $this->role ); ?>
343
+
344
+ </div><!-- .post-box-container -->
345
+
346
+ </div><!-- #post-body -->
347
+ </form>
348
+
349
+ </div><!-- #poststuff -->
350
+
351
+ </div><!-- .wrap -->
352
+ <?php }
353
+ }
admin/class-role-list-table.php CHANGED
@@ -1,512 +1,512 @@
1
- <?php
2
- /**
3
- * Handles the roles table on the Roles admin screen.
4
- *
5
- * @package Members
6
- * @subpackage Admin
7
- * @author Justin Tadlock <justintadlock@gmail.com>
8
- * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
- * @link https://themehybrid.com/plugins/members
10
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
- */
12
-
13
- namespace Members\Admin;
14
-
15
- /**
16
- * Role list table for the roles management page in the admin. Extends the core `WP_List_Table`
17
- * class in the admin.
18
- *
19
- * @since 2.0.0
20
- * @access public
21
- */
22
- class Role_List_Table extends \WP_List_Table {
23
-
24
- /**
25
- * The current view.
26
- *
27
- * @since 2.0.0
28
- * @access public
29
- * @var string
30
- */
31
- public $role_view = 'all';
32
-
33
- /**
34
- * Array of role views.
35
- *
36
- * @since 2.0.0
37
- * @access public
38
- * @var array
39
- */
40
- public $role_views = array();
41
-
42
- /**
43
- * Allowed role views.
44
- *
45
- * @since 2.0.0
46
- * @access public
47
- * @var array
48
- */
49
- public $allowed_role_views = array();
50
-
51
- /**
52
- * The default role. This will be assigned the value of `get_option( 'default_role' )`.
53
- *
54
- * @since 2.0.0
55
- * @access public
56
- * @var string
57
- */
58
- public $default_role = 'subscriber';
59
-
60
- /**
61
- * The current user object.
62
- *
63
- * @since 2.0.0
64
- * @access public
65
- * @var object
66
- */
67
- public $current_user = '';
68
-
69
- /**
70
- * Sets up the list table.
71
- *
72
- * @since 2.0.0
73
- * @access public
74
- * @return void
75
- */
76
- public function __construct() {
77
-
78
- $args = array(
79
- 'plural' => 'roles',
80
- 'singular' => 'role',
81
- );
82
-
83
- parent::__construct( $args );
84
-
85
- // Get the current user object.
86
- $this->current_user = new \WP_User( get_current_user_id() );
87
-
88
- // Get the defined default role.
89
- $this->default_role = get_option( 'default_role', $this->default_role );
90
-
91
- // Get the role views.
92
- $this->allowed_role_views = array_keys( $this->get_views() );
93
-
94
- // Get the current view.
95
- if ( isset( $_GET['view'] ) && in_array( $_GET['view'], $this->allowed_role_views ) )
96
- $this->role_view = $_GET['view'];
97
- }
98
-
99
- /**
100
- * Sets up the items (roles) to list.
101
- *
102
- * @since 2.0.0
103
- * @access public
104
- * @return void
105
- */
106
- public function prepare_items() {
107
-
108
- $roles = array();
109
-
110
- // Get the roles for the view.
111
- if ( ! empty( $this->role_views[ $this->role_view ]['roles'] ) )
112
- $roles = $this->role_views[ $this->role_view ]['roles'];
113
-
114
- // Allow devs to filter the items.
115
- $roles = apply_filters( 'members_manage_roles_items', $roles, $this->role_view );
116
-
117
- // Sort the roles if given something to sort by.
118
- if ( isset( $_GET['orderby'] ) && isset( $_GET['order'] ) ) {
119
-
120
- // Sort by title/role name, descending.
121
- if ( 'title' === $_GET['orderby'] && 'desc' === $_GET['order'] )
122
- arsort( $roles );
123
-
124
- // Sort by role, ascending.
125
- elseif ( 'role' === $_GET['orderby'] && 'asc' === $_GET['order'] )
126
- ksort( $roles );
127
-
128
- // Sort by role, descending.
129
- elseif ( 'role' === $_GET['orderby'] && 'desc' === $_GET['order'] )
130
- krsort( $roles );
131
-
132
- // Sort by title/role name, ascending.
133
- else
134
- asort( $roles );
135
-
136
- // Sort by title/role name, ascending.
137
- } else {
138
- asort( $roles );
139
- }
140
-
141
- // Get the per page option name.
142
- $option = $this->screen->get_option( 'per_page', 'option' );
143
-
144
- if ( ! $option )
145
- $option = str_replace( '-', '_', "{$this->screen->id}_per_page" );
146
-
147
- // Get the number of roles to show per page.
148
- $per_page = (int) get_user_option( $option );
149
-
150
- if ( ! $per_page || $per_page < 1 ) {
151
-
152
- $per_page = $this->screen->get_option( 'per_page', 'default' );
153
-
154
- if ( ! $per_page )
155
- $per_page = 20;
156
- }
157
-
158
- // Set up some current page variables.
159
- $current_page = $this->get_pagenum();
160
- $items = $roles;
161
- $total_count = count( $items );
162
-
163
- // Set the current page items.
164
- $this->items = array_slice( $items, ( $current_page - 1 ) * $per_page, $per_page );
165
-
166
- // Set the pagination arguments.
167
- $this->set_pagination_args( array( 'total_items' => $total_count, 'per_page' => $per_page ) );
168
- }
169
-
170
- /**
171
- * Returns an array of columns to show.
172
- *
173
- * @see members_manage_roles_columns()
174
- * @since 2.0.0
175
- * @access public
176
- * @return array
177
- */
178
- public function get_columns() {
179
- return get_column_headers( $this->screen );
180
- }
181
-
182
- /**
183
- * Returns the default column output. By default, this will return an empty string. The
184
- * purpose of the method is to provide plugin authors a hook to return content for
185
- * custom columns: `members_manage_roles_column_{$column_name}`.
186
- *
187
- * @since 1.1.0
188
- * @access protected
189
- * @param string $role
190
- * @param string $column_name
191
- * @return string
192
- */
193
- protected function column_default( $role, $column_name ) {
194
-
195
- return apply_filters( "members_manage_roles_column_{$column_name}", '', $role );
196
- }
197
-
198
- /**
199
- * The checkbox column callback.
200
- *
201
- * @since 2.0.0
202
- * @access protected
203
- * @param string $role
204
- * @return string
205
- */
206
- protected function column_cb( $role ) {
207
-
208
- if ( $role == get_option( 'default_role' ) || in_array( $role, $this->current_user->roles ) || ! members_is_role_editable( $role ) )
209
- $out = '';
210
-
211
- else
212
- $out = sprintf( '<input type="checkbox" name="roles[%1$s]" value="%1$s" />', esc_attr( $role ) );
213
-
214
- return apply_filters( 'members_manage_roles_column_cb', $out, $role );
215
- }
216
-
217
- /**
218
- * The role name column callback.
219
- *
220
- * @since 2.0.0
221
- * @access protected
222
- * @param string $role
223
- * @return string
224
- */
225
- protected function column_title( $role ) {
226
-
227
- $states = array();
228
- $role_states = '';
229
-
230
- // If the role is the default role.
231
- if ( $role == get_option( 'default_role' ) )
232
- $states['default'] = esc_html__( 'Default Role', 'members' );
233
-
234
- // If the current user has this role.
235
- if ( members_current_user_has_role( $role ) )
236
- $states['mine'] = esc_html__( 'Your Role', 'members' );
237
-
238
- // Allow devs to filter the role states.
239
- $states = apply_filters( 'members_role_states', $states, $role );
240
-
241
- // If we have states, string them together.
242
- if ( ! empty( $states ) ) {
243
-
244
- foreach ( $states as $state => $label )
245
- $states[ $state ] = sprintf( '<span class="role-state">%s</span>', $label );
246
-
247
- $role_states = ' &ndash; ' . join( ', ', $states );
248
- }
249
-
250
- // Add the title and role states.
251
- if ( current_user_can( 'edit_roles' ) )
252
- $title = sprintf( '<strong><a class="row-title" href="%s">%s</a>%s</strong>', esc_url( members_get_edit_role_url( $role ) ), esc_html( members_get_role( $role )->get( 'label' ) ), $role_states );
253
-
254
- else
255
- $title = sprintf( '<strong><span class="row-title">%s</span>%s</strong>', esc_html( members_get_role( $role )->get( 'label' ) ), $role_states );
256
-
257
- return apply_filters( 'members_manage_roles_column_role_name', $title, $role );
258
- }
259
-
260
- /**
261
- * The role column callback.
262
- *
263
- * @since 2.0.0
264
- * @access protected
265
- * @param string $role
266
- * @return string
267
- */
268
- protected function column_role( $role ) {
269
- return apply_filters( 'members_manage_roles_column_role', members_sanitize_role( $role ), $role );
270
- }
271
-
272
- /**
273
- * The users column callback.
274
- *
275
- * @since 2.0.0
276
- * @access protected
277
- * @param string $role
278
- * @return string
279
- */
280
- protected function column_users( $role ) {
281
-
282
- $user_count = members_get_role_user_count( $role );
283
-
284
- $output = number_format_i18n( $user_count );
285
-
286
- if ( 0 < absint( $user_count ) && current_user_can( 'list_users' ) ) {
287
-
288
- $output = sprintf(
289
- '<a href="%s">%s</a>',
290
- esc_url( add_query_arg( 'role', $role, admin_url( 'users.php' ) ) ),
291
- $output
292
- );
293
- }
294
-
295
- return apply_filters( 'members_manage_roles_column_users', $output, $role );
296
- }
297
-
298
- /**
299
- * The caps column callback.
300
- *
301
- * @since 2.0.0
302
- * @access protected
303
- * @param string $role
304
- * @return string
305
- */
306
- protected function column_granted_caps( $role ) {
307
- return apply_filters( 'members_manage_roles_column_granted_caps', members_get_role_granted_cap_count( $role ), $role );
308
- }
309
-
310
- /**
311
- * The caps column callback.
312
- *
313
- * @since 2.0.0
314
- * @access protected
315
- * @param string $role
316
- * @return string
317
- */
318
- protected function column_denied_caps( $role ) {
319
- return apply_filters( 'members_manage_roles_column_denied_caps', members_get_role_denied_cap_count( $role ), $role );
320
- }
321
-
322
- /**
323
- * Returns the name of the primary column.
324
- *
325
- * @since 2.0.0
326
- * @access protected
327
- * @return string
328
- */
329
- protected function get_default_primary_column_name() {
330
- return 'title';
331
- }
332
-
333
- /**
334
- * Handles the row actions.
335
- *
336
- * @since 2.0.0
337
- * @access protected
338
- * @param string $role
339
- * @param string $column_name
340
- * @param string $primary
341
- * @return array
342
- */
343
- protected function handle_row_actions( $role, $column_name, $primary ) {
344
-
345
- $actions = array();
346
-
347
- // Only add row actions on the primary column (title/role name).
348
- if ( $primary === $column_name ) {
349
-
350
- // If the role can be edited.
351
- if ( members_is_role_editable( $role ) ) {
352
-
353
- // If the current user can edit the role, add an edit link.
354
- if ( current_user_can( 'edit_roles' ) )
355
- $actions['edit'] = sprintf( '<a href="%s">%s</a>', esc_url( members_get_edit_role_url( $role ) ), esc_html__( 'Edit', 'members' ) );
356
-
357
- // If the current user can delete the role, add a delete link.
358
- if ( ( is_multisite() && is_super_admin() && $role !== $this->default_role ) || ( current_user_can( 'delete_roles' ) && $role !== $this->default_role && ! current_user_can( $role ) ) )
359
- $actions['delete'] = sprintf( '<a class="members-delete-role-link" href="%s">%s</a>', esc_url( members_get_delete_role_url( $role ) ), esc_html__( 'Delete', 'members' ) );
360
-
361
- // If the role cannot be edited.
362
- } elseif ( current_user_can( 'edit_roles' ) ) {
363
-
364
- // Add the view role link.
365
- $actions['view'] = sprintf( '<a href="%s">%s</a>', esc_url( members_get_edit_role_url( $role ) ), esc_html__( 'View', 'members' ) );
366
- }
367
-
368
- // If the current user can create roles, add the clone role link.
369
- if ( current_user_can( 'create_roles' ) )
370
- $actions['clone'] = sprintf( '<a href="%s">%s</a>', esc_url( members_get_clone_role_url( $role ) ), esc_html__( 'Clone', 'members' ) );
371
-
372
- // If this is the default role and the current user can manage options, add a default role change link.
373
- if ( current_user_can( 'manage_options' ) && $role === $this->default_role )
374
- $actions['default_role'] = sprintf( '<a href="%s">%s</a>', esc_url( admin_url( 'options-general.php#default_role' ) ), esc_html__( 'Change Default', 'members' ) );
375
-
376
- // If the currrent user can view users, add a users link.
377
- if ( current_user_can( 'list_users' ) )
378
- $actions['users'] = sprintf( '<a href="%s">%s</a>', members_get_role_users_url( $role ), esc_html__( 'Users', 'members' ) );
379
-
380
- // Allow devs to filter the row actions.
381
- $actions = apply_filters( 'members_roles_row_actions', $actions, $role );
382
- }
383
-
384
- return $this->row_actions( $actions );
385
- }
386
-
387
- /**
388
- * Returns an array of sortable columns.
389
- *
390
- * @since 2.0.0
391
- * @access protected
392
- * @return array
393
- */
394
- protected function get_sortable_columns() {
395
-
396
- return array(
397
- 'title' => array( 'title', true ),
398
- 'role' => array( 'role', false ),
399
- );
400
- }
401
-
402
- /**
403
- * Returns an array of views for the list table.
404
- *
405
- * @since 2.0.0
406
- * @access protected
407
- * @return array
408
- */
409
- protected function get_views() {
410
-
411
- // Get the current user.
412
- $current_user = wp_get_current_user();
413
-
414
- $views = array();
415
- $current = ' class="current"';
416
-
417
- $this->role_views['all'] = array(
418
- 'label_count' => _n_noop( 'All %s', 'All %s', 'members' ),
419
- 'roles' => array_keys( members_get_roles() )
420
- );
421
-
422
- $this->role_views['mine'] = array(
423
- 'label_count' => _n_noop( 'Mine %s', 'Mine %s', 'members' ),
424
- 'roles' => $current_user->roles
425
- );
426
-
427
- $this->role_views['active'] = array(
428
- 'label_count' => _n_noop( 'Has Users %s', 'Has Users %s', 'members' ),
429
- 'roles' => members_get_active_roles()
430
- );
431
-
432
- $this->role_views['inactive'] = array(
433
- 'label_count' => _n_noop( 'No Users %s', 'No Users %s', 'members' ),
434
- 'roles' =>members_get_inactive_roles()
435
- );
436
-
437
- $this->role_views['editable'] = array(
438
- 'label_count' => _n_noop( 'Editable %s', 'Editable %s', 'members' ),
439
- 'roles' => members_get_editable_roles()
440
- );
441
-
442
- $this->role_views['uneditable'] = array(
443
- 'label_count' => _n_noop( 'Uneditable %s', 'Uneditable %s', 'members' ),
444
- 'roles' => members_get_uneditable_roles()
445
- );
446
-
447
- // Loop through the role groups and put them into the view list.
448
- foreach ( members_get_role_groups() as $group ) {
449
-
450
- // Skip role groups that shouldn't be shown in the view list.
451
- if ( ! $group->show_in_view_list )
452
- continue;
453
-
454
- $this->role_views[ "group-{$group->name}" ] = array(
455
- 'label_count' => $group->label_count,
456
- 'roles' => $group->roles
457
- );
458
- }
459
-
460
- // Loop through the default views and put them into the view list.
461
- foreach ( $this->role_views as $view => $args ) {
462
-
463
- $count = count( $args['roles'] );
464
-
465
- // Skip any views with 0 roles.
466
- if ( 0 >= $count )
467
- continue;
468
-
469
- $noop = $args['label_count'];
470
-
471
- // Add the view link.
472
- $views[ $view ] = sprintf(
473
- '<a%s href="%s">%s</a>',
474
- $view === $this->role_view ? $current : '',
475
- 'all' === $view ? esc_url( members_get_edit_roles_url() ) : esc_url( members_get_role_view_url( $view ) ),
476
- sprintf( translate_nooped_plural( $noop, $count, $noop['domain'] ), sprintf( '<span class="count">(%s)</span>', number_format_i18n( $count ) ) )
477
- );
478
- }
479
-
480
- return apply_filters( 'members_manage_roles_views', $views, $this->role_view, members_get_edit_roles_url() );
481
- }
482
-
483
- /**
484
- * Displays the list table.
485
- *
486
- * @since 2.0.0
487
- * @access public
488
- * @return void
489
- */
490
- public function display() {
491
-
492
- $this->views();
493
-
494
- parent::display();
495
- }
496
-
497
- /**
498
- * Returns an array of bulk actions available.
499
- *
500
- * @since 2.0.0
501
- * @access protected
502
- * @return array
503
- */
504
- protected function get_bulk_actions() {
505
- $actions = array();
506
-
507
- if ( current_user_can( 'delete_roles' ) )
508
- $actions['delete'] = esc_html__( 'Delete', 'members' );
509
-
510
- return apply_filters( 'members_manage_roles_bulk_actions', $actions );
511
- }
512
- }
1
+ <?php
2
+ /**
3
+ * Handles the roles table on the Roles admin screen.
4
+ *
5
+ * @package Members
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justintadlock@gmail.com>
8
+ * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
+ * @link https://themehybrid.com/plugins/members
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ namespace Members\Admin;
14
+
15
+ /**
16
+ * Role list table for the roles management page in the admin. Extends the core `WP_List_Table`
17
+ * class in the admin.
18
+ *
19
+ * @since 2.0.0
20
+ * @access public
21
+ */
22
+ class Role_List_Table extends \WP_List_Table {
23
+
24
+ /**
25
+ * The current view.
26
+ *
27
+ * @since 2.0.0
28
+ * @access public
29
+ * @var string
30
+ */
31
+ public $role_view = 'all';
32
+
33
+ /**
34
+ * Array of role views.
35
+ *
36
+ * @since 2.0.0
37
+ * @access public
38
+ * @var array
39
+ */
40
+ public $role_views = array();
41
+
42
+ /**
43
+ * Allowed role views.
44
+ *
45
+ * @since 2.0.0
46
+ * @access public
47
+ * @var array
48
+ */
49
+ public $allowed_role_views = array();
50
+
51
+ /**
52
+ * The default role. This will be assigned the value of `get_option( 'default_role' )`.
53
+ *
54
+ * @since 2.0.0
55
+ * @access public
56
+ * @var string
57
+ */
58
+ public $default_role = 'subscriber';
59
+
60
+ /**
61
+ * The current user object.
62
+ *
63
+ * @since 2.0.0
64
+ * @access public
65
+ * @var object
66
+ */
67
+ public $current_user = '';
68
+
69
+ /**
70
+ * Sets up the list table.
71
+ *
72
+ * @since 2.0.0
73
+ * @access public
74
+ * @return void
75
+ */
76
+ public function __construct() {
77
+
78
+ $args = array(
79
+ 'plural' => 'roles',
80
+ 'singular' => 'role',
81
+ );
82
+
83
+ parent::__construct( $args );
84
+
85
+ // Get the current user object.
86
+ $this->current_user = new \WP_User( get_current_user_id() );
87
+
88
+ // Get the defined default role.
89
+ $this->default_role = get_option( 'default_role', $this->default_role );
90
+
91
+ // Get the role views.
92
+ $this->allowed_role_views = array_keys( $this->get_views() );
93
+
94
+ // Get the current view.
95
+ if ( isset( $_GET['view'] ) && in_array( $_GET['view'], $this->allowed_role_views ) )
96
+ $this->role_view = $_GET['view'];
97
+ }
98
+
99
+ /**
100
+ * Sets up the items (roles) to list.
101
+ *
102
+ * @since 2.0.0
103
+ * @access public
104
+ * @return void
105
+ */
106
+ public function prepare_items() {
107
+
108
+ $roles = array();
109
+
110
+ // Get the roles for the view.
111
+ if ( ! empty( $this->role_views[ $this->role_view ]['roles'] ) )
112
+ $roles = $this->role_views[ $this->role_view ]['roles'];
113
+
114
+ // Allow devs to filter the items.
115
+ $roles = apply_filters( 'members_manage_roles_items', $roles, $this->role_view );
116
+
117
+ // Sort the roles if given something to sort by.
118
+ if ( isset( $_GET['orderby'] ) && isset( $_GET['order'] ) ) {
119
+
120
+ // Sort by title/role name, descending.
121
+ if ( 'title' === $_GET['orderby'] && 'desc' === $_GET['order'] )
122
+ arsort( $roles );
123
+
124
+ // Sort by role, ascending.
125
+ elseif ( 'role' === $_GET['orderby'] && 'asc' === $_GET['order'] )
126
+ ksort( $roles );
127
+
128
+ // Sort by role, descending.
129
+ elseif ( 'role' === $_GET['orderby'] && 'desc' === $_GET['order'] )
130
+ krsort( $roles );
131
+
132
+ // Sort by title/role name, ascending.
133
+ else
134
+ asort( $roles );
135
+
136
+ // Sort by title/role name, ascending.
137
+ } else {
138
+ asort( $roles );
139
+ }
140
+
141
+ // Get the per page option name.
142
+ $option = $this->screen->get_option( 'per_page', 'option' );
143
+
144
+ if ( ! $option )
145
+ $option = str_replace( '-', '_', "{$this->screen->id}_per_page" );
146
+
147
+ // Get the number of roles to show per page.
148
+ $per_page = (int) get_user_option( $option );
149
+
150
+ if ( ! $per_page || $per_page < 1 ) {
151
+
152
+ $per_page = $this->screen->get_option( 'per_page', 'default' );
153
+
154
+ if ( ! $per_page )
155
+ $per_page = 20;
156
+ }
157
+
158
+ // Set up some current page variables.
159
+ $current_page = $this->get_pagenum();
160
+ $items = $roles;
161
+ $total_count = count( $items );
162
+
163
+ // Set the current page items.
164
+ $this->items = array_slice( $items, ( $current_page - 1 ) * $per_page, $per_page );
165
+
166
+ // Set the pagination arguments.
167
+ $this->set_pagination_args( array( 'total_items' => $total_count, 'per_page' => $per_page ) );
168
+ }
169
+
170
+ /**
171
+ * Returns an array of columns to show.
172
+ *
173
+ * @see members_manage_roles_columns()
174
+ * @since 2.0.0
175
+ * @access public
176
+ * @return array
177
+ */
178
+ public function get_columns() {
179
+ return get_column_headers( $this->screen );
180
+ }
181
+
182
+ /**
183
+ * Returns the default column output. By default, this will return an empty string. The
184
+ * purpose of the method is to provide plugin authors a hook to return content for
185
+ * custom columns: `members_manage_roles_column_{$column_name}`.
186
+ *
187
+ * @since 1.1.0
188
+ * @access protected
189
+ * @param string $role
190
+ * @param string $column_name
191
+ * @return string
192
+ */
193
+ protected function column_default( $role, $column_name ) {
194
+
195
+ return apply_filters( "members_manage_roles_column_{$column_name}", '', $role );
196
+ }
197
+
198
+ /**
199
+ * The checkbox column callback.
200
+ *
201
+ * @since 2.0.0
202
+ * @access protected
203
+ * @param string $role
204
+ * @return string
205
+ */
206
+ protected function column_cb( $role ) {
207
+
208
+ if ( $role == get_option( 'default_role' ) || in_array( $role, $this->current_user->roles ) || ! members_is_role_editable( $role ) )
209
+ $out = '';
210
+
211
+ else
212
+ $out = sprintf( '<input type="checkbox" name="roles[%1$s]" value="%1$s" />', esc_attr( $role ) );
213
+
214
+ return apply_filters( 'members_manage_roles_column_cb', $out, $role );
215
+ }
216
+
217
+ /**
218
+ * The role name column callback.
219
+ *
220
+ * @since 2.0.0
221
+ * @access protected
222
+ * @param string $role
223
+ * @return string
224
+ */
225
+ protected function column_title( $role ) {
226
+
227
+ $states = array();
228
+ $role_states = '';
229
+
230
+ // If the role is the default role.
231
+ if ( $role == get_option( 'default_role' ) )
232
+ $states['default'] = esc_html__( 'Default Role', 'members' );
233
+
234
+ // If the current user has this role.
235
+ if ( members_current_user_has_role( $role ) )
236
+ $states['mine'] = esc_html__( 'Your Role', 'members' );
237
+
238
+ // Allow devs to filter the role states.
239
+ $states = apply_filters( 'members_role_states', $states, $role );
240
+
241
+ // If we have states, string them together.
242
+ if ( ! empty( $states ) ) {
243
+
244
+ foreach ( $states as $state => $label )
245
+ $states[ $state ] = sprintf( '<span class="role-state">%s</span>', $label );
246
+
247
+ $role_states = ' &ndash; ' . join( ', ', $states );
248
+ }
249
+
250
+ // Add the title and role states.
251
+ if ( current_user_can( 'edit_roles' ) )
252
+ $title = sprintf( '<strong><a class="row-title" href="%s">%s</a>%s</strong>', esc_url( members_get_edit_role_url( $role ) ), esc_html( members_get_role( $role )->get( 'label' ) ), $role_states );
253
+
254
+ else
255
+ $title = sprintf( '<strong><span class="row-title">%s</span>%s</strong>', esc_html( members_get_role( $role )->get( 'label' ) ), $role_states );
256
+
257
+ return apply_filters( 'members_manage_roles_column_role_name', $title, $role );
258
+ }
259
+
260
+ /**
261
+ * The role column callback.
262
+ *
263
+ * @since 2.0.0
264
+ * @access protected
265
+ * @param string $role
266
+ * @return string
267
+ */
268
+ protected function column_role( $role ) {
269
+ return apply_filters( 'members_manage_roles_column_role', members_sanitize_role( $role ), $role );
270
+ }
271
+
272
+ /**
273
+ * The users column callback.
274
+ *
275
+ * @since 2.0.0
276
+ * @access protected
277
+ * @param string $role
278
+ * @return string
279
+ */
280
+ protected function column_users( $role ) {
281
+
282
+ $user_count = members_get_role_user_count( $role );
283
+
284
+ $output = number_format_i18n( $user_count );
285
+
286
+ if ( 0 < absint( $user_count ) && current_user_can( 'list_users' ) ) {
287
+
288
+ $output = sprintf(
289
+ '<a href="%s">%s</a>',
290
+ esc_url( add_query_arg( 'role', $role, admin_url( 'users.php' ) ) ),
291
+ $output
292
+ );
293
+ }
294
+
295
+ return apply_filters( 'members_manage_roles_column_users', $output, $role );
296
+ }
297
+
298
+ /**
299
+ * The caps column callback.
300
+ *
301
+ * @since 2.0.0
302
+ * @access protected
303
+ * @param string $role
304
+ * @return string
305
+ */
306
+ protected function column_granted_caps( $role ) {
307
+ return apply_filters( 'members_manage_roles_column_granted_caps', members_get_role_granted_cap_count( $role ), $role );
308
+ }
309
+
310
+ /**
311
+ * The caps column callback.
312
+ *
313
+ * @since 2.0.0
314
+ * @access protected
315
+ * @param string $role
316
+ * @return string
317
+ */
318
+ protected function column_denied_caps( $role ) {
319
+ return apply_filters( 'members_manage_roles_column_denied_caps', members_get_role_denied_cap_count( $role ), $role );
320
+ }
321
+
322
+ /**
323
+ * Returns the name of the primary column.
324
+ *
325
+ * @since 2.0.0
326
+ * @access protected
327
+ * @return string
328
+ */
329
+ protected function get_default_primary_column_name() {
330
+ return 'title';
331
+ }
332
+
333
+ /**
334
+ * Handles the row actions.
335
+ *
336
+ * @since 2.0.0
337
+ * @access protected
338
+ * @param string $role
339
+ * @param string $column_name
340
+ * @param string $primary
341
+ * @return array
342
+ */
343
+ protected function handle_row_actions( $role, $column_name, $primary ) {
344
+
345
+ $actions = array();
346
+
347
+ // Only add row actions on the primary column (title/role name).
348
+ if ( $primary === $column_name ) {
349
+
350
+ // If the role can be edited.
351
+ if ( members_is_role_editable( $role ) ) {
352
+
353
+ // If the current user can edit the role, add an edit link.
354
+ if ( current_user_can( 'edit_roles' ) )
355
+ $actions['edit'] = sprintf( '<a href="%s">%s</a>', esc_url( members_get_edit_role_url( $role ) ), esc_html__( 'Edit', 'members' ) );
356
+
357
+ // If the current user can delete the role, add a delete link.
358
+ if ( ( is_multisite() && is_super_admin() && $role !== $this->default_role ) || ( current_user_can( 'delete_roles' ) && $role !== $this->default_role && ! current_user_can( $role ) ) )
359
+ $actions['delete'] = sprintf( '<a class="members-delete-role-link" href="%s">%s</a>', esc_url( members_get_delete_role_url( $role ) ), esc_html__( 'Delete', 'members' ) );
360
+
361
+ // If the role cannot be edited.
362
+ } elseif ( current_user_can( 'edit_roles' ) ) {
363
+
364
+ // Add the view role link.
365
+ $actions['view'] = sprintf( '<a href="%s">%s</a>', esc_url( members_get_edit_role_url( $role ) ), esc_html__( 'View', 'members' ) );
366
+ }
367
+
368
+ // If the current user can create roles, add the clone role link.
369
+ if ( current_user_can( 'create_roles' ) )
370
+ $actions['clone'] = sprintf( '<a href="%s">%s</a>', esc_url( members_get_clone_role_url( $role ) ), esc_html__( 'Clone', 'members' ) );
371
+
372
+ // If this is the default role and the current user can manage options, add a default role change link.
373
+ if ( current_user_can( 'manage_options' ) && $role === $this->default_role )
374
+ $actions['default_role'] = sprintf( '<a href="%s">%s</a>', esc_url( admin_url( 'options-general.php#default_role' ) ), esc_html__( 'Change Default', 'members' ) );
375
+
376
+ // If the currrent user can view users, add a users link.
377
+ if ( current_user_can( 'list_users' ) )
378
+ $actions['users'] = sprintf( '<a href="%s">%s</a>', members_get_role_users_url( $role ), esc_html__( 'Users', 'members' ) );
379
+
380
+ // Allow devs to filter the row actions.
381
+ $actions = apply_filters( 'members_roles_row_actions', $actions, $role );
382
+ }
383
+
384
+ return $this->row_actions( $actions );
385
+ }
386
+
387
+ /**
388
+ * Returns an array of sortable columns.
389
+ *
390
+ * @since 2.0.0
391
+ * @access protected
392
+ * @return array
393
+ */
394
+ protected function get_sortable_columns() {
395
+
396
+ return array(
397
+ 'title' => array( 'title', true ),
398
+ 'role' => array( 'role', false ),
399
+ );
400
+ }
401
+
402
+ /**
403
+ * Returns an array of views for the list table.
404
+ *
405
+ * @since 2.0.0
406
+ * @access protected
407
+ * @return array
408
+ */
409
+ protected function get_views() {
410
+
411
+ // Get the current user.
412
+ $current_user = wp_get_current_user();
413
+
414
+ $views = array();
415
+ $current = ' class="current"';
416
+
417
+ $this->role_views['all'] = array(
418
+ 'label_count' => _n_noop( 'All %s', 'All %s', 'members' ),
419
+ 'roles' => array_keys( members_get_roles() )
420
+ );
421
+
422
+ $this->role_views['mine'] = array(
423
+ 'label_count' => _n_noop( 'Mine %s', 'Mine %s', 'members' ),
424
+ 'roles' => $current_user->roles
425
+ );
426
+
427
+ $this->role_views['active'] = array(
428
+ 'label_count' => _n_noop( 'Has Users %s', 'Has Users %s', 'members' ),
429
+ 'roles' => members_get_active_roles()
430
+ );
431
+
432
+ $this->role_views['inactive'] = array(
433
+ 'label_count' => _n_noop( 'No Users %s', 'No Users %s', 'members' ),
434
+ 'roles' =>members_get_inactive_roles()
435
+ );
436
+
437
+ $this->role_views['editable'] = array(
438
+ 'label_count' => _n_noop( 'Editable %s', 'Editable %s', 'members' ),
439
+ 'roles' => members_get_editable_roles()
440
+ );
441
+
442
+ $this->role_views['uneditable'] = array(
443
+ 'label_count' => _n_noop( 'Uneditable %s', 'Uneditable %s', 'members' ),
444
+ 'roles' => members_get_uneditable_roles()
445
+ );
446
+
447
+ // Loop through the role groups and put them into the view list.
448
+ foreach ( members_get_role_groups() as $group ) {
449
+
450
+ // Skip role groups that shouldn't be shown in the view list.
451
+ if ( ! $group->show_in_view_list )
452
+ continue;
453
+
454
+ $this->role_views[ "group-{$group->name}" ] = array(
455
+ 'label_count' => $group->label_count,
456
+ 'roles' => $group->roles
457
+ );
458
+ }
459
+
460
+ // Loop through the default views and put them into the view list.
461
+ foreach ( $this->role_views as $view => $args ) {
462
+
463
+ $count = count( $args['roles'] );
464
+
465
+ // Skip any views with 0 roles.
466
+ if ( 0 >= $count )
467
+ continue;
468
+
469
+ $noop = $args['label_count'];
470
+
471
+ // Add the view link.
472
+ $views[ $view ] = sprintf(
473
+ '<a%s href="%s">%s</a>',
474
+ $view === $this->role_view ? $current : '',
475
+ 'all' === $view ? esc_url( members_get_edit_roles_url() ) : esc_url( members_get_role_view_url( $view ) ),
476
+ sprintf( translate_nooped_plural( $noop, $count, $noop['domain'] ), sprintf( '<span class="count">(%s)</span>', number_format_i18n( $count ) ) )
477
+ );
478
+ }
479
+
480
+ return apply_filters( 'members_manage_roles_views', $views, $this->role_view, members_get_edit_roles_url() );
481
+ }
482
+
483
+ /**
484
+ * Displays the list table.
485
+ *
486
+ * @since 2.0.0
487
+ * @access public
488
+ * @return void
489
+ */
490
+ public function display() {
491
+
492
+ $this->views();
493
+
494
+ parent::display();
495
+ }
496
+
497
+ /**
498
+ * Returns an array of bulk actions available.
499
+ *
500
+ * @since 2.0.0
501
+ * @access protected
502
+ * @return array
503
+ */
504
+ protected function get_bulk_actions() {
505
+ $actions = array();
506
+
507
+ if ( current_user_can( 'delete_roles' ) )
508
+ $actions['delete'] = esc_html__( 'Delete', 'members' );
509
+
510
+ return apply_filters( 'members_manage_roles_bulk_actions', $actions );
511
+ }
512
+ }
admin/class-role-new.php CHANGED
@@ -1,401 +1,418 @@
1
- <?php
2
- /**
3
- * Handles the new role screen.
4
- *
5
- * @package Members
6
- * @subpackage Admin
7
- * @author Justin Tadlock <justintadlock@gmail.com>
8
- * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
- * @link https://themehybrid.com/plugins/members
10
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
- */
12
-
13
- namespace Members\Admin;
14
-
15
- /**
16
- * Class that displays the new role screen and handles the form submissions for that page.
17
- *
18
- * @since 2.0.0
19
- * @access public
20
- */
21
- final class Role_New {
22
-
23
- /**
24
- * Holds the instances of this class.
25
- *
26
- * @since 2.0.0
27
- * @access private
28
- * @var object
29
- */
30
- private static $instance;
31
-
32
- /**
33
- * Name of the page we've created.
34
- *
35
- * @since 2.0.0
36
- * @access public
37
- * @var string
38
- */
39
- public $page = '';
40
-
41
- /**
42
- * Role that's being created.
43
- *
44
- * @since 2.0.0
45
- * @access public
46
- * @var string
47
- */
48
- public $role = '';
49
-
50
- /**
51
- * Name of the role that's being created.
52
- *
53
- * @since 2.0.0
54
- * @access public
55
- * @var string
56
- */
57
- public $role_name = '';
58
-
59
- /**
60
- * Array of the role's capabilities.
61
- *
62
- * @since 2.0.0
63
- * @access public
64
- * @var array
65
- */
66
- public $capabilities = array();
67
-
68
- /**
69
- * Conditional to see if we're cloning a role.
70
- *
71
- * @since 2.0.0
72
- * @access public
73
- * @var bool
74
- */
75
- public $is_clone = false;
76
-
77
- /**
78
- * Role that is being cloned.
79
- *
80
- * @since 2.0.0
81
- * @access public
82
- * @var string
83
- */
84
- public $clone_role = '';
85
-
86
- /**
87
- * Sets up our initial actions.
88
- *
89
- * @since 2.0.0
90
- * @access public
91
- * @return void
92
- */
93
- public function __construct() {
94
-
95
- // If the role manager is active.
96
- if ( members_role_manager_enabled() )
97
- add_action( 'admin_menu', array( $this, 'add_admin_page' ) );
98
- }
99
-
100
- /**
101
- * Adds the roles page to the admin.
102
- *
103
- * @since 2.0.0
104
- * @access public
105
- * @return void
106
- */
107
- public function add_admin_page() {
108
-
109
- $this->page = add_submenu_page( 'users.php', esc_html__( 'Add New Role', 'members' ), esc_html__( 'Add New Role', 'members' ), 'create_roles', 'role-new', array( $this, 'page' ) );
110
-
111
- // Let's roll if we have a page.
112
- if ( $this->page ) {
113
-
114
- add_action( "load-{$this->page}", array( $this, 'load' ) );
115
- add_action( "load-{$this->page}", array( $this, 'add_help_tabs' ) );
116
- }
117
- }
118
-
119
- /**
120
- * Checks posted data on load and performs actions if needed.
121
- *
122
- * @since 2.0.0
123
- * @access public
124
- * @return void
125
- */
126
- public function load() {
127
-
128
- // Are we cloning a role?
129
- $this->is_clone = isset( $_GET['clone'] ) && members_role_exists( $_GET['clone'] );
130
-
131
- if ( $this->is_clone ) {
132
-
133
- // Override the default new role caps.
134
- add_filter( 'members_new_role_default_caps', array( $this, 'clone_default_caps' ), 15 );
135
-
136
- // Set the clone role.
137
- $this->clone_role = members_sanitize_role( $_GET['clone'] );
138
- }
139
-
140
- // Check if the current user can create roles and the form has been submitted.
141
- if ( current_user_can( 'create_roles' ) && isset( $_POST['members_new_role_nonce'] ) ) {
142
-
143
- // Verify the nonce.
144
- check_admin_referer( 'new_role', 'members_new_role_nonce' );
145
-
146
- // Set up some variables.
147
- $this->capabilities = array();
148
- $new_caps = array();
149
- $is_duplicate = false;
150
-
151
- // Get all the capabilities.
152
- $_m_caps = members_get_capabilities();
153
-
154
- // Add all caps from the cap groups.
155
- foreach ( members_get_cap_groups() as $group )
156
- $_m_caps = array_merge( $_m_caps, $group->caps );
157
-
158
- // Make sure we have a unique array of caps.
159
- $_m_caps = array_unique( $_m_caps );
160
-
161
- // Check if any capabilities were selected.
162
- if ( isset( $_POST['grant-caps'] ) || isset( $_POST['deny-caps'] ) ) {
163
-
164
- $grant_caps = ! empty( $_POST['grant-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['grant-caps'] ) ) : array();
165
- $deny_caps = ! empty( $_POST['deny-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['deny-caps'] ) ) : array();
166
-
167
- foreach ( $_m_caps as $cap ) {
168
-
169
- if ( in_array( $cap, $grant_caps ) )
170
- $new_caps[ $cap ] = true;
171
-
172
- else if ( in_array( $cap, $deny_caps ) )
173
- $new_caps[ $cap ] = false;
174
- }
175
- }
176
-
177
- $grant_new_caps = ! empty( $_POST['grant-new-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['grant-new-caps'] ) ) : array();
178
- $deny_new_caps = ! empty( $_POST['deny-new-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['deny-new-caps'] ) ) : array();
179
-
180
- foreach ( $grant_new_caps as $grant_new_cap ) {
181
-
182
- $_cap = members_sanitize_cap( $grant_new_cap );
183
-
184
- if ( ! in_array( $_cap, $_m_caps ) )
185
- $new_caps[ $_cap ] = true;
186
- }
187
-
188
- foreach ( $deny_new_caps as $deny_new_cap ) {
189
-
190
- $_cap = members_sanitize_cap( $deny_new_cap );
191
-
192
- if ( ! in_array( $_cap, $_m_caps ) )
193
- $new_caps[ $_cap ] = false;
194
- }
195
-
196
- // Sanitize the new role name/label. We just want to strip any tags here.
197
- if ( ! empty( $_POST['role_name'] ) )
198
- $this->role_name = wp_strip_all_tags( wp_unslash( $_POST['role_name'] ) );
199
-
200
- // Sanitize the new role, removing any unwanted characters.
201
- if ( ! empty( $_POST['role'] ) )
202
- $this->role = members_sanitize_role( $_POST['role'] );
203
-
204
- else if ( $this->role_name )
205
- $this->role = members_sanitize_role( $this->role_name );
206
-
207
- // Is duplicate?
208
- if ( members_role_exists( $this->role ) )
209
- $is_duplicate = true;
210
-
211
- // Add a new role with the data input.
212
- if ( $this->role && $this->role_name && ! $is_duplicate ) {
213
-
214
- add_role( $this->role, $this->role_name, $new_caps );
215
-
216
- // Action hook for when a role is added.
217
- do_action( 'members_role_added', $this->role );
218
-
219
- // If the current user can edit roles, redirect to edit role screen.
220
- if ( current_user_can( 'edit_roles' ) ) {
221
- wp_redirect( esc_url_raw( add_query_arg( 'message', 'role_added', members_get_edit_role_url( $this->role ) ) ) );
222
- exit;
223
- }
224
-
225
- // Add role added message.
226
- add_settings_error( 'members_role_new', 'role_added', sprintf( esc_html__( 'The %s role has been created.', 'members' ), $this->role_name ), 'updated' );
227
- }
228
-
229
- // If there are new caps, let's assign them.
230
- if ( ! empty( $new_caps ) )
231
- $this->capabilities = $new_caps;
232
-
233
- // Add error if there's no role.
234
- if ( ! $this->role )
235
- add_settings_error( 'members_role_new', 'no_role', esc_html__( 'You must enter a valid role.', 'members' ) );
236
-
237
- // Add error if this is a duplicate role.
238
- if ( $is_duplicate )
239
- add_settings_error( 'members_role_new', 'duplicate_role', sprintf( esc_html__( 'The %s role already exists.', 'members' ), $this->role ) );
240
-
241
- // Add error if there's no role name.
242
- if ( ! $this->role_name )
243
- add_settings_error( 'members_role_new', 'no_role_name', esc_html__( 'You must enter a valid role name.', 'members' ) );
244
- }
245
-
246
- // If we don't have caps yet, get the new role default caps.
247
- if ( empty( $this->capabilities ) )
248
- $this->capabilities = members_new_role_default_caps();
249
-
250
- // Load page hook.
251
- do_action( 'members_load_role_new' );
252
-
253
- // Hook for adding in meta boxes.
254
- do_action( 'add_meta_boxes_' . get_current_screen()->id, '' );
255
- do_action( 'add_meta_boxes', get_current_screen()->id, '' );
256
-
257
- // Add layout screen option.
258
- add_screen_option( 'layout_columns', array( 'max' => 2, 'default' => 2 ) );
259
-
260
- // Load scripts/styles.
261
- add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
262
- }
263
-
264
- /**
265
- * Adds help tabs.
266
- *
267
- * @since 2.0.0
268
- * @access public
269
- * @return void
270
- */
271
- public function add_help_tabs() {
272
-
273
- // Get the current screen.
274
- $screen = get_current_screen();
275
-
276
- // Add help tabs.
277
- $screen->add_help_tab( members_get_edit_role_help_overview_args() );
278
- $screen->add_help_tab( members_get_edit_role_help_role_name_args() );
279
- $screen->add_help_tab( members_get_edit_role_help_edit_caps_args() );
280
- $screen->add_help_tab( members_get_edit_role_help_custom_cap_args() );
281
-
282
- // Set the help sidebar.
283
- $screen->set_help_sidebar( members_get_help_sidebar_text() );
284
- }
285
-
286
- /**
287
- * Enqueue scripts/styles.
288
- *
289
- * @since 2.0.0
290
- * @access public
291
- * @return void
292
- */
293
- public function enqueue() {
294
-
295
- wp_enqueue_style( 'members-admin' );
296
- wp_enqueue_script( 'members-edit-role' );
297
- }
298
-
299
- /**
300
- * Outputs the page.
301
- *
302
- * @since 2.0.0
303
- * @access public
304
- * @return void
305
- */
306
- public function page() { ?>
307
-
308
- <div class="wrap">
309
-
310
- <h1><?php ! $this->is_clone ? esc_html_e( 'Add New Role', 'members' ) : esc_html_e( 'Clone Role', 'members' ); ?></h1>
311
-
312
- <?php settings_errors( 'members_role_new' ); ?>
313
-
314
- <div id="poststuff">
315
-
316
- <form name="form0" method="post" action="<?php echo esc_url( members_get_new_role_url() ); ?>">
317
-
318
- <?php wp_nonce_field( 'new_role', 'members_new_role_nonce' ); ?>
319
-
320
- <div id="post-body" class="metabox-holder columns-<?php echo 1 == get_current_screen()->get_columns() ? 1 : 2; ?>">
321
-
322
- <div id="post-body-content">
323
-
324
- <div id="titlediv" class="members-title-div">
325
-
326
- <div id="titlewrap">
327
- <span class="screen-reader-text"><?php esc_html_e( 'Role Name', 'members' ); ?></span>
328
- <input type="text" name="role_name" value="<?php echo ! $this->role && $this->clone_role ? esc_attr( sprintf( __( '%s Clone', 'members' ), members_get_role( $this->clone_role )->get( 'label' ) ) ) : esc_attr( $this->role_name ); ?>" placeholder="<?php esc_attr_e( 'Enter role name', 'members' ); ?>" />
329
- </div><!-- #titlewrap -->
330
-
331
- <div class="inside">
332
- <div id="edit-slug-box">
333
- <strong><?php esc_html_e( 'Role:', 'members' ); ?></strong> <span class="role-slug"><?php echo ! $this->role && $this->clone_role ? esc_attr( "{$this->clone_role}_clone" ) : esc_attr( $this->role ); ?></span> <!-- edit box -->
334
- <input type="text" name="role" value="<?php echo members_sanitize_role( $this->role ); ?>" />
335
- <button type="button" class="role-edit-button button button-small closed"><?php esc_html_e( 'Edit', 'members' ); ?></button>
336
- </div>
337
- </div><!-- .inside -->
338
-
339
- </div><!-- .members-title-div -->
340
-
341
- <?php $cap_tabs = new Cap_Tabs( '', $this->capabilities ); ?>
342
- <?php $cap_tabs->display(); ?>
343
-
344
- </div><!-- #post-body-content -->
345
-
346
- <?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?>
347
- <?php wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); ?>
348
-
349
- <div id="postbox-container-1" class="postbox-container side">
350
-
351
- <?php do_meta_boxes( get_current_screen()->id, 'side', '' ); ?>
352
-
353
- </div><!-- .post-box-container -->
354
-
355
- </div><!-- #post-body -->
356
- </form>
357
-
358
- </div><!-- #poststuff -->
359
-
360
- </div><!-- .wrap -->
361
-
362
- <?php }
363
-
364
- /**
365
- * Filters the new role default caps in the case that we're cloning a role.
366
- *
367
- * @since 2.0.0
368
- * @access public
369
- * @param array $capabilities
370
- * @param array
371
- */
372
- public function clone_default_caps( $capabilities ) {
373
-
374
- if ( $this->is_clone ) {
375
-
376
- $role = get_role( $this->clone_role );
377
-
378
- if ( $role && isset( $role->capabilities ) && is_array( $role->capabilities ) )
379
- $capabilities = $role->capabilities;
380
- }
381
-
382
- return $capabilities;
383
- }
384
-
385
- /**
386
- * Returns the instance.
387
- *
388
- * @since 2.0.0
389
- * @access public
390
- * @return object
391
- */
392
- public static function get_instance() {
393
-
394
- if ( ! self::$instance )
395
- self::$instance = new self;
396
-
397
- return self::$instance;
398
- }
399
- }
400
-
401
- Role_New::get_instance();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Handles the new role screen.
4
+ *
5
+ * @package Members
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justintadlock@gmail.com>
8
+ * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
+ * @link https://themehybrid.com/plugins/members
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ namespace Members\Admin;
14
+
15
+ /**
16
+ * Class that displays the new role screen and handles the form submissions for that page.
17
+ *
18
+ * @since 2.0.0
19
+ * @access public
20
+ */
21
+ final class Role_New {
22
+
23
+ /**
24
+ * Holds the instances of this class.
25
+ *
26
+ * @since 2.0.0
27
+ * @access private
28
+ * @var object
29
+ */
30
+ private static $instance;
31
+
32
+ /**
33
+ * Name of the page we've created.
34
+ *
35
+ * @since 2.0.0
36
+ * @access public
37
+ * @var string
38
+ */
39
+ public $page = '';
40
+
41
+ /**
42
+ * Role that's being created.
43
+ *
44
+ * @since 2.0.0
45
+ * @access public
46
+ * @var string
47
+ */
48
+ public $role = '';
49
+
50
+ /**
51
+ * Name of the role that's being created.
52
+ *
53
+ * @since 2.0.0
54
+ * @access public
55
+ * @var string
56
+ */
57
+ public $role_name = '';
58
+
59
+ /**
60
+ * Array of the role's capabilities.
61
+ *
62
+ * @since 2.0.0
63
+ * @access public
64
+ * @var array
65
+ */
66
+ public $capabilities = array();
67
+
68
+ /**
69
+ * Conditional to see if we're cloning a role.
70
+ *
71
+ * @since 2.0.0
72
+ * @access public
73
+ * @var bool
74
+ */
75
+ public $is_clone = false;
76
+
77
+ /**
78
+ * Role that is being cloned.
79
+ *
80
+ * @since 2.0.0
81
+ * @access public
82
+ * @var string
83
+ */
84
+ public $clone_role = '';
85
+
86
+ /**
87
+ * Sets up our initial actions.
88
+ *
89
+ * @since 2.0.0
90
+ * @access public
91
+ * @return void
92
+ */
93
+ public function __construct() {
94
+
95
+ // If the role manager is active.
96
+ if ( members_role_manager_enabled() ) {
97
+ add_action( 'admin_menu', array( $this, 'add_admin_page' ) );
98
+ add_action( 'admin_menu', array( $this, 'add_submenu_admin_page' ), 20 );
99
+ }
100
+ }
101
+
102
+ /**
103
+ * Adds the roles page to the admin.
104
+ *
105
+ * @since 2.0.0
106
+ * @access public
107
+ * @return void
108
+ */
109
+ public function add_admin_page() {
110
+
111
+ $this->page = add_menu_page( esc_html__( 'Members', 'members' ), esc_html__( 'Members', 'members' ), 'create_roles', 'members', array( $this, 'page' ), 'data:image/svg+xml;base64,' . base64_encode( '<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="users-cog" class="svg-inline--fa fa-users-cog fa-w-20" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="currentColor" d="M610.5 341.3c2.6-14.1 2.6-28.5 0-42.6l25.8-14.9c3-1.7 4.3-5.2 3.3-8.5-6.7-21.6-18.2-41.2-33.2-57.4-2.3-2.5-6-3.1-9-1.4l-25.8 14.9c-10.9-9.3-23.4-16.5-36.9-21.3v-29.8c0-3.4-2.4-6.4-5.7-7.1-22.3-5-45-4.8-66.2 0-3.3.7-5.7 3.7-5.7 7.1v29.8c-13.5 4.8-26 12-36.9 21.3l-25.8-14.9c-2.9-1.7-6.7-1.1-9 1.4-15 16.2-26.5 35.8-33.2 57.4-1 3.3.4 6.8 3.3 8.5l25.8 14.9c-2.6 14.1-2.6 28.5 0 42.6l-25.8 14.9c-3 1.7-4.3 5.2-3.3 8.5 6.7 21.6 18.2 41.1 33.2 57.4 2.3 2.5 6 3.1 9 1.4l25.8-14.9c10.9 9.3 23.4 16.5 36.9 21.3v29.8c0 3.4 2.4 6.4 5.7 7.1 22.3 5 45 4.8 66.2 0 3.3-.7 5.7-3.7 5.7-7.1v-29.8c13.5-4.8 26-12 36.9-21.3l25.8 14.9c2.9 1.7 6.7 1.1 9-1.4 15-16.2 26.5-35.8 33.2-57.4 1-3.3-.4-6.8-3.3-8.5l-25.8-14.9zM496 368.5c-26.8 0-48.5-21.8-48.5-48.5s21.8-48.5 48.5-48.5 48.5 21.8 48.5 48.5-21.7 48.5-48.5 48.5zM96 224c35.3 0 64-28.7 64-64s-28.7-64-64-64-64 28.7-64 64 28.7 64 64 64zm224 32c1.9 0 3.7-.5 5.6-.6 8.3-21.7 20.5-42.1 36.3-59.2 7.4-8 17.9-12.6 28.9-12.6 6.9 0 13.7 1.8 19.6 5.3l7.9 4.6c.8-.5 1.6-.9 2.4-1.4 7-14.6 11.2-30.8 11.2-48 0-61.9-50.1-112-112-112S208 82.1 208 144c0 61.9 50.1 112 112 112zm105.2 194.5c-2.3-1.2-4.6-2.6-6.8-3.9-8.2 4.8-15.3 9.8-27.5 9.8-10.9 0-21.4-4.6-28.9-12.6-18.3-19.8-32.3-43.9-40.2-69.6-10.7-34.5 24.9-49.7 25.8-50.3-.1-2.6-.1-5.2 0-7.8l-7.9-4.6c-3.8-2.2-7-5-9.8-8.1-3.3.2-6.5.6-9.8.6-24.6 0-47.6-6-68.5-16h-8.3C179.6 288 128 339.6 128 403.2V432c0 26.5 21.5 48 48 48h255.4c-3.7-6-6.2-12.8-6.2-20.3v-9.2zM173.1 274.6C161.5 263.1 145.6 256 128 256H64c-35.3 0-64 28.7-64 64v32c0 17.7 14.3 32 32 32h65.9c6.3-47.4 34.9-87.3 75.2-109.4z"></path></svg>' ) );
112
+
113
+ // We don't need to have a "Members" link in the submenu, so this removes it
114
+ add_submenu_page( 'members', '', '', 'create_roles', 'members', array( $this, 'page' ) );
115
+ remove_submenu_page( 'members', 'members' );
116
+
117
+ // Let's roll if we have a page.
118
+ if ( $this->page ) {
119
+
120
+ add_action( "load-{$this->page}", array( $this, 'load' ) );
121
+ add_action( "load-{$this->page}", array( $this, 'add_help_tabs' ) );
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Adds the "Add New Role" submenu page to the admin.
127
+ *
128
+ * @since 3.0.0
129
+ * @access public
130
+ * @return void
131
+ */
132
+ public function add_submenu_admin_page() {
133
+ add_submenu_page( 'members', esc_html_x( 'Add New Role', 'admin screen', 'members' ), esc_html_x( 'Add New Role', 'admin screen', 'members' ), 'create_roles', 'members', array( $this, 'page' ) );
134
+ }
135
+
136
+ /**
137
+ * Checks posted data on load and performs actions if needed.
138
+ *
139
+ * @since 2.0.0
140
+ * @access public
141
+ * @return void
142
+ */
143
+ public function load() {
144
+
145
+ // Are we cloning a role?
146
+ $this->is_clone = isset( $_GET['clone'] ) && members_role_exists( $_GET['clone'] );
147
+
148
+ if ( $this->is_clone ) {
149
+
150
+ // Override the default new role caps.
151
+ add_filter( 'members_new_role_default_caps', array( $this, 'clone_default_caps' ), 15 );
152
+
153
+ // Set the clone role.
154
+ $this->clone_role = members_sanitize_role( $_GET['clone'] );
155
+ }
156
+
157
+ // Check if the current user can create roles and the form has been submitted.
158
+ if ( current_user_can( 'create_roles' ) && isset( $_POST['members_new_role_nonce'] ) ) {
159
+
160
+ // Verify the nonce.
161
+ check_admin_referer( 'new_role', 'members_new_role_nonce' );
162
+
163
+ // Set up some variables.
164
+ $this->capabilities = array();
165
+ $new_caps = array();
166
+ $is_duplicate = false;
167
+
168
+ // Get all the capabilities.
169
+ $_m_caps = members_get_capabilities();
170
+
171
+ // Add all caps from the cap groups.
172
+ foreach ( members_get_cap_groups() as $group )
173
+ $_m_caps = array_merge( $_m_caps, $group->caps );
174
+
175
+ // Make sure we have a unique array of caps.
176
+ $_m_caps = array_unique( $_m_caps );
177
+
178
+ // Check if any capabilities were selected.
179
+ if ( isset( $_POST['grant-caps'] ) || isset( $_POST['deny-caps'] ) ) {
180
+
181
+ $grant_caps = ! empty( $_POST['grant-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['grant-caps'] ) ) : array();
182
+ $deny_caps = ! empty( $_POST['deny-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['deny-caps'] ) ) : array();
183
+
184
+ foreach ( $_m_caps as $cap ) {
185
+
186
+ if ( in_array( $cap, $grant_caps ) )
187
+ $new_caps[ $cap ] = true;
188
+
189
+ else if ( in_array( $cap, $deny_caps ) )
190
+ $new_caps[ $cap ] = false;
191
+ }
192
+ }
193
+
194
+ $grant_new_caps = ! empty( $_POST['grant-new-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['grant-new-caps'] ) ) : array();
195
+ $deny_new_caps = ! empty( $_POST['deny-new-caps'] ) ? members_remove_hidden_caps( array_unique( $_POST['deny-new-caps'] ) ) : array();
196
+
197
+ foreach ( $grant_new_caps as $grant_new_cap ) {
198
+
199
+ $_cap = members_sanitize_cap( $grant_new_cap );
200
+
201
+ if ( ! in_array( $_cap, $_m_caps ) )
202
+ $new_caps[ $_cap ] = true;
203
+ }
204
+
205
+ foreach ( $deny_new_caps as $deny_new_cap ) {
206
+
207
+ $_cap = members_sanitize_cap( $deny_new_cap );
208
+
209
+ if ( ! in_array( $_cap, $_m_caps ) )
210
+ $new_caps[ $_cap ] = false;
211
+ }
212
+
213
+ // Sanitize the new role name/label. We just want to strip any tags here.
214
+ if ( ! empty( $_POST['role_name'] ) )
215
+ $this->role_name = wp_strip_all_tags( wp_unslash( $_POST['role_name'] ) );
216
+
217
+ // Sanitize the new role, removing any unwanted characters.
218
+ if ( ! empty( $_POST['role'] ) )
219
+ $this->role = members_sanitize_role( $_POST['role'] );
220
+
221
+ else if ( $this->role_name )
222
+ $this->role = members_sanitize_role( $this->role_name );
223
+
224
+ // Is duplicate?
225
+ if ( members_role_exists( $this->role ) )
226
+ $is_duplicate = true;
227
+
228
+ // Add a new role with the data input.
229
+ if ( $this->role && $this->role_name && ! $is_duplicate ) {
230
+
231
+ add_role( $this->role, $this->role_name, $new_caps );
232
+
233
+ // Action hook for when a role is added.
234
+ do_action( 'members_role_added', $this->role );
235
+
236
+ // If the current user can edit roles, redirect to edit role screen.
237
+ if ( current_user_can( 'edit_roles' ) ) {
238
+ wp_redirect( esc_url_raw( add_query_arg( 'message', 'role_added', members_get_edit_role_url( $this->role ) ) ) );
239
+ exit;
240
+ }
241
+
242
+ // Add role added message.
243
+ add_settings_error( 'members_role_new', 'role_added', sprintf( esc_html__( 'The %s role has been created.', 'members' ), $this->role_name ), 'updated' );
244
+ }
245
+
246
+ // If there are new caps, let's assign them.
247
+ if ( ! empty( $new_caps ) )
248
+ $this->capabilities = $new_caps;
249
+
250
+ // Add error if there's no role.
251
+ if ( ! $this->role )
252
+ add_settings_error( 'members_role_new', 'no_role', esc_html__( 'You must enter a valid role.', 'members' ) );
253
+
254
+ // Add error if this is a duplicate role.
255
+ if ( $is_duplicate )
256
+ add_settings_error( 'members_role_new', 'duplicate_role', sprintf( esc_html__( 'The %s role already exists.', 'members' ), $this->role ) );
257
+
258
+ // Add error if there's no role name.
259
+ if ( ! $this->role_name )
260
+ add_settings_error( 'members_role_new', 'no_role_name', esc_html__( 'You must enter a valid role name.', 'members' ) );
261
+ }
262
+
263
+ // If we don't have caps yet, get the new role default caps.
264
+ if ( empty( $this->capabilities ) )
265
+ $this->capabilities = members_new_role_default_caps();
266
+
267
+ // Load page hook.
268
+ do_action( 'members_load_role_new' );
269
+
270
+ // Hook for adding in meta boxes.
271
+ do_action( 'add_meta_boxes_' . get_current_screen()->id, '' );
272
+ do_action( 'add_meta_boxes', get_current_screen()->id, '' );
273
+
274
+ // Add layout screen option.
275
+ add_screen_option( 'layout_columns', array( 'max' => 2, 'default' => 2 ) );
276
+
277
+ // Load scripts/styles.
278
+ add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
279
+ }
280
+
281
+ /**
282
+ * Adds help tabs.
283
+ *
284
+ * @since 2.0.0
285
+ * @access public
286
+ * @return void
287
+ */
288
+ public function add_help_tabs() {
289
+
290
+ // Get the current screen.
291
+ $screen = get_current_screen();
292
+
293
+ // Add help tabs.
294
+ $screen->add_help_tab( members_get_edit_role_help_overview_args() );
295
+ $screen->add_help_tab( members_get_edit_role_help_role_name_args() );
296
+ $screen->add_help_tab( members_get_edit_role_help_edit_caps_args() );
297
+ $screen->add_help_tab( members_get_edit_role_help_custom_cap_args() );
298
+
299
+ // Set the help sidebar.
300
+ $screen->set_help_sidebar( members_get_help_sidebar_text() );
301
+ }
302
+
303
+ /**
304
+ * Enqueue scripts/styles.
305
+ *
306
+ * @since 2.0.0
307
+ * @access public
308
+ * @return void
309
+ */
310
+ public function enqueue() {
311
+
312
+ wp_enqueue_style( 'members-admin' );
313
+ wp_enqueue_script( 'members-edit-role' );
314
+ }
315
+
316
+ /**
317
+ * Outputs the page.
318
+ *
319
+ * @since 2.0.0
320
+ * @access public
321
+ * @return void
322
+ */
323
+ public function page() { ?>
324
+
325
+ <div class="wrap">
326
+
327
+ <h1><?php ! $this->is_clone ? esc_html_e( 'Add New Role', 'members' ) : esc_html_e( 'Clone Role', 'members' ); ?></h1>
328
+
329
+ <?php settings_errors( 'members_role_new' ); ?>
330
+
331
+ <div id="poststuff">
332
+
333
+ <form name="form0" method="post" action="<?php echo esc_url( members_get_new_role_url() ); ?>">
334
+
335
+ <?php wp_nonce_field( 'new_role', 'members_new_role_nonce' ); ?>
336
+
337
+ <div id="post-body" class="metabox-holder columns-<?php echo 1 == get_current_screen()->get_columns() ? 1 : 2; ?>">
338
+
339
+ <div id="post-body-content">
340
+
341
+ <div id="titlediv" class="members-title-div">
342
+
343
+ <div id="titlewrap">
344
+ <span class="screen-reader-text"><?php esc_html_e( 'Role Name', 'members' ); ?></span>
345
+ <input type="text" name="role_name" value="<?php echo ! $this->role && $this->clone_role ? esc_attr( sprintf( __( '%s Clone', 'members' ), members_get_role( $this->clone_role )->get( 'label' ) ) ) : esc_attr( $this->role_name ); ?>" placeholder="<?php esc_attr_e( 'Enter role name', 'members' ); ?>" />
346
+ </div><!-- #titlewrap -->
347
+
348
+ <div class="inside">
349
+ <div id="edit-slug-box">
350
+ <strong><?php esc_html_e( 'Role:', 'members' ); ?></strong> <span class="role-slug"><?php echo ! $this->role && $this->clone_role ? esc_attr( "{$this->clone_role}_clone" ) : esc_attr( $this->role ); ?></span> <!-- edit box -->
351
+ <input type="text" name="role" value="<?php echo members_sanitize_role( $this->role ); ?>" />
352
+ <button type="button" class="role-edit-button button button-small closed"><?php esc_html_e( 'Edit', 'members' ); ?></button>
353
+ </div>
354
+ </div><!-- .inside -->
355
+
356
+ </div><!-- .members-title-div -->
357
+
358
+ <?php $cap_tabs = new Cap_Tabs( '', $this->capabilities ); ?>
359
+ <?php $cap_tabs->display(); ?>
360
+
361
+ </div><!-- #post-body-content -->
362
+
363
+ <?php wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?>
364
+ <?php wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); ?>
365
+
366
+ <div id="postbox-container-1" class="postbox-container side">
367
+
368
+ <?php do_meta_boxes( get_current_screen()->id, 'side', '' ); ?>
369
+
370
+ </div><!-- .post-box-container -->
371
+
372
+ </div><!-- #post-body -->
373
+ </form>
374
+
375
+ </div><!-- #poststuff -->
376
+
377
+ </div><!-- .wrap -->
378
+
379
+ <?php }
380
+
381
+ /**
382
+ * Filters the new role default caps in the case that we're cloning a role.
383
+ *
384
+ * @since 2.0.0
385
+ * @access public
386
+ * @param array $capabilities
387
+ * @param array
388
+ */
389
+ public function clone_default_caps( $capabilities ) {
390
+
391
+ if ( $this->is_clone ) {
392
+
393
+ $role = get_role( $this->clone_role );
394
+
395
+ if ( $role && isset( $role->capabilities ) && is_array( $role->capabilities ) )
396
+ $capabilities = $role->capabilities;
397
+ }
398
+
399
+ return $capabilities;
400
+ }
401
+
402
+ /**
403
+ * Returns the instance.
404
+ *
405
+ * @since 2.0.0
406
+ * @access public
407
+ * @return object
408
+ */
409
+ public static function get_instance() {
410
+
411
+ if ( ! self::$instance )
412
+ self::$instance = new self;
413
+
414
+ return self::$instance;
415
+ }
416
+ }
417
+
418
+ Role_New::get_instance();
admin/class-roles.php CHANGED
@@ -1,313 +1,313 @@
1
- <?php
2
- /**
3
- * Roles admin screen.
4
- *
5
- * @package Members
6
- * @subpackage Admin
7
- * @author Justin Tadlock <justintadlock@gmail.com>
8
- * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
- * @link https://themehybrid.com/plugins/members
10
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
- */
12
-
13
- namespace Members\Admin;
14
-
15
- /**
16
- * Class that displays the roles admin screen and handles requests for that page.
17
- *
18
- * @since 2.0.0
19
- * @access public
20
- */
21
- final class Roles {
22
-
23
- /**
24
- * Sets up some necessary actions/filters.
25
- *
26
- * @since 2.0.0
27
- * @access public
28
- * @return void
29
- */
30
- public function __construct() {
31
-
32
- // Set up some page options for the current screen.
33
- add_action( 'current_screen', array( $this, 'current_screen' ) );
34
-
35
- // Set up the role list table columns.
36
- add_filter( 'manage_users_page_roles_columns', array( $this, 'manage_roles_columns' ), 5 );
37
-
38
- // Add help tabs.
39
- add_action( 'members_load_manage_roles', array( $this, 'add_help_tabs' ) );
40
- }
41
-
42
- /**
43
- * Modifies the current screen object.
44
- *
45
- * @since 2.0.0
46
- * @access public
47
- * @return void
48
- */
49
- public function current_screen( $screen ) {
50
-
51
- if ( 'users_page_roles' === $screen->id )
52
- $screen->add_option( 'per_page', array( 'default' => 20 ) );
53
- }
54
-
55
- /**
56
- * Sets up the roles column headers.
57
- *
58
- * @since 2.0.0
59
- * @access public
60
- * @param array $columns
61
- * @return array
62
- */
63
- public function manage_roles_columns( $columns ) {
64
-
65
- $columns = array(
66
- 'cb' => '<input type="checkbox" />',
67
- 'title' => esc_html__( 'Role Name', 'members' ),
68
- 'role' => esc_html__( 'Role', 'members' ),
69
- 'users' => esc_html__( 'Users', 'members' ),
70
- 'granted_caps' => esc_html__( 'Granted', 'members' ),
71
- 'denied_caps' => esc_html__( 'Denied', 'members' )
72
- );
73
-
74
- return apply_filters( 'members_manage_roles_columns', $columns );
75
- }
76
-
77
- /**
78
- * Runs on the `load-{$page}` hook. This is the handler for form submissions and requests.
79
- *
80
- * @since 2.0.0
81
- * @access public
82
- * @return void
83
- */
84
- public function load() {
85
-
86
- // Get the current action if sent as request.
87
- $action = isset( $_REQUEST['action'] ) ? sanitize_key( $_REQUEST['action'] ) : false;
88
-
89
- // Get the current action if posted.
90
- if ( ( isset( $_POST['action'] ) && 'delete' == $_POST['action'] ) || ( isset( $_POST['action2'] ) && 'delete' == $_POST['action2'] ) )
91
- $action = 'bulk-delete';
92
-
93
- // Bulk delete role handler.
94
- if ( 'bulk-delete' === $action ) {
95
-
96
- // If roles were selected, let's delete some roles.
97
- if ( current_user_can( 'delete_roles' ) && isset( $_POST['roles'] ) && is_array( $_POST['roles'] ) ) {
98
-
99
- // Verify the nonce. Nonce created via `WP_List_Table::display_tablenav()`.
100
- check_admin_referer( 'bulk-roles' );
101
-
102
- // Loop through each of the selected roles.
103
- foreach ( $_POST['roles'] as $role ) {
104
-
105
- $role = members_sanitize_role( $role );
106
-
107
- if ( members_role_exists( $role ) )
108
- members_delete_role( $role );
109
- }
110
-
111
- // Add roles deleted message.
112
- add_settings_error( 'members_roles', 'roles_deleted', esc_html__( 'Selected roles deleted.', 'members' ), 'updated' );
113
- }
114
-
115
- // Delete single role handler.
116
- } else if ( 'delete' === $action ) {
117
-
118
- // Make sure the current user can delete roles.
119
- if ( current_user_can( 'delete_roles' ) ) {
120
-
121
- // Verify the referer.
122
- check_admin_referer( 'delete_role', 'members_delete_role_nonce' );
123
-
124
- // Get the role we want to delete.
125
- $role = members_sanitize_role( $_GET['role'] );
126
-
127
- // Check that we have a role before attempting to delete it.
128
- if ( members_role_exists( $role ) ) {
129
-
130
- // Add role deleted message.
131
- add_settings_error( 'members_roles', 'role_deleted', sprintf( esc_html__( '%s role deleted.', 'members' ), members_get_role( $role )->get( 'label' ) ), 'updated' );
132
-
133
- // Delete the role.
134
- members_delete_role( $role );
135
- }
136
- }
137
- }
138
-
139
- // Load page hook.
140
- do_action( 'members_load_manage_roles' );
141
- }
142
-
143
- /**
144
- * Enqueue scripts/styles.
145
- *
146
- * @since 2.0.0
147
- * @access public
148
- * @return void
149
- */
150
- public function enqueue() {
151
-
152
- wp_enqueue_style( 'members-admin' );
153
- wp_enqueue_script( 'members-edit-role' );
154
- }
155
-
156
- /**
157
- * Displays the page content.
158
- *
159
- * @since 2.0.0
160
- * @access public
161
- * @return void
162
- */
163
- public function page() {
164
-
165
- require_once( members_plugin()->dir . 'admin/class-role-list-table.php' ); ?>
166
-
167
- <div class="wrap">
168
-
169
- <h1>
170
- <?php esc_html_e( 'Roles', 'members' ); ?>
171
-
172
- <?php if ( current_user_can( 'create_roles' ) ) : ?>
173
- <a href="<?php echo esc_url( members_get_new_role_url() ); ?>" class="page-title-action"><?php echo esc_html_x( 'Add New', 'role', 'members' ); ?></a>
174
- <?php endif; ?>
175
- </h1>
176
-
177
- <?php settings_errors( 'members_roles' ); ?>
178
-
179
- <div id="poststuff">
180
-
181
- <form id="roles" action="<?php echo esc_url( members_get_edit_roles_url() ); ?>" method="post">
182
-
183
- <?php $table = new Role_List_Table(); ?>
184
- <?php $table->prepare_items(); ?>
185
- <?php $table->display(); ?>
186
-
187
- </form><!-- #roles -->
188
-
189
- </div><!-- #poststuff -->
190
-
191
- </div><!-- .wrap -->
192
- <?php }
193
-
194
- /**
195
- * Adds help tabs.
196
- *
197
- * @since 2.0.0
198
- * @access public
199
- * @return void
200
- */
201
- public function add_help_tabs() {
202
-
203
- // Get the current screen.
204
- $screen = get_current_screen();
205
-
206
- // Add overview help tab.
207
- $screen->add_help_tab(
208
- array(
209
- 'id' => 'overview',
210
- 'title' => esc_html__( 'Overview', 'members' ),
211
- 'callback' => array( $this, 'help_tab_overview' )
212
- )
213
- );
214
-
215
- // Add screen content help tab.
216
- $screen->add_help_tab(
217
- array(
218
- 'id' => 'screen-content',
219
- 'title' => esc_html__( 'Screen Content', 'members' ),
220
- 'callback' => array( $this, 'help_tab_screen_content' )
221
- )
222
- );
223
-
224
- // Add available actions help tab.
225
- $screen->add_help_tab(
226
- array(
227
- 'id' => 'row-actions',
228
- 'title' => esc_html__( 'Available Actions', 'members' ),
229
- 'callback' => array( $this, 'help_tab_row_actions' )
230
- )
231
- );
232
-
233
- // Add bulk actions help tab.
234
- $screen->add_help_tab(
235
- array(
236
- 'id' => 'bulk-actions',
237
- 'title' => esc_html__( 'Bulk Actions', 'members' ),
238
- 'callback' => array( $this, 'help_tab_bulk_actions' )
239
- )
240
- );
241
-
242
- // Set the help sidebar.
243
- $screen->set_help_sidebar( members_get_help_sidebar_text() );
244
- }
245
-
246
- /**
247
- * Overview help tab callback function.
248
- *
249
- * @since 2.0.0
250
- * @access public
251
- * @return void
252
- */
253
- public function help_tab_overview() { ?>
254
-
255
- <p>
256
- <?php esc_html_e( 'This screen provides access to all of your user roles. Roles are a method of grouping users. They are made up of capabilities (caps), which give permission to users to perform specific actions on the site.' ); ?>
257
- <p>
258
- <?php }
259
-
260
- /**
261
- * Screen content help tab callback function.
262
- *
263
- * @since 2.0.0
264
- * @access public
265
- * @return void
266
- */
267
- public function help_tab_screen_content() { ?>
268
-
269
- <p>
270
- <?php esc_html_e( 'You can customize the display of this screen&#8216;s contents in a number of ways:', 'members' ); ?>
271
- </p>
272
-
273
- <ul>
274
- <li><?php esc_html_e( 'You can hide/display columns based on your needs and decide how many roles to list per screen using the Screen Options tab.', 'members' ); ?></li>
275
- <li><?php esc_html_e( 'You can filter the list of roles by types using the text links in the upper left. The default view is to show all roles.', 'members' ); ?></li>
276
- </ul>
277
- <?php }
278
-
279
- /**
280
- * Row actions help tab callback function.
281
- *
282
- * @since 2.0.0
283
- * @access public
284
- * @return void
285
- */
286
- public function help_tab_row_actions() { ?>
287
-
288
- <p>
289
- <?php esc_html_e( 'Hovering over a row in the roles list will display action links that allow you to manage your role. You can perform the following actions:', 'members' ); ?>
290
- </p>
291
-
292
- <ul>
293
- <li><?php _e( '<strong>Edit</strong> takes you to the editing screen for that role. You can also reach that screen by clicking on the role name.', 'members' ); ?></li>
294
- <li><?php _e( '<strong>Delete</strong> removes your role from this list and permanently deletes it.', 'members' ); ?></li>
295
- <li><?php _e( '<strong>Clone</strong> copies the role and takes you to the new role screen to further edit it.', 'members' ); ?></li>
296
- <li><?php _e( '<strong>Users</strong> takes you to the users screen and lists the users that have that role.', 'members' ); ?></li>
297
- </ul>
298
- <?php }
299
-
300
- /**
301
- * Bulk actions help tab callback function.
302
- *
303
- * @since 2.0.0
304
- * @access public
305
- * @return void
306
- */
307
- public function help_tab_bulk_actions() { ?>
308
-
309
- <p>
310
- <?php esc_html_e( 'You can permanently delete multiple roles at once. Select the roles you want to act on using the checkboxes, then select the action you want to take from the Bulk Actions menu and click Apply.', 'members' ); ?>
311
- </p>
312
- <?php }
313
- }
1
+ <?php
2
+ /**
3
+ * Roles admin screen.
4
+ *
5
+ * @package Members
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justintadlock@gmail.com>
8
+ * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
+ * @link https://themehybrid.com/plugins/members
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ namespace Members\Admin;
14
+
15
+ /**
16
+ * Class that displays the roles admin screen and handles requests for that page.
17
+ *
18
+ * @since 2.0.0
19
+ * @access public
20
+ */
21
+ final class Roles {
22
+
23
+ /**
24
+ * Sets up some necessary actions/filters.
25
+ *
26
+ * @since 2.0.0
27
+ * @access public
28
+ * @return void
29
+ */
30
+ public function __construct() {
31
+
32
+ // Set up some page options for the current screen.
33
+ add_action( 'current_screen', array( $this, 'current_screen' ) );
34
+
35
+ // Set up the role list table columns.
36
+ add_filter( 'manage_members_page_roles_columns', array( $this, 'manage_roles_columns' ), 5 );
37
+
38
+ // Add help tabs.
39
+ add_action( 'members_load_manage_roles', array( $this, 'add_help_tabs' ) );
40
+ }
41
+
42
+ /**
43
+ * Modifies the current screen object.
44
+ *
45
+ * @since 2.0.0
46
+ * @access public
47
+ * @return void
48
+ */
49
+ public function current_screen( $screen ) {
50
+
51
+ if ( 'members_page_roles' === $screen->id )
52
+ $screen->add_option( 'per_page', array( 'default' => 20 ) );
53
+ }
54
+
55
+ /**
56
+ * Sets up the roles column headers.
57
+ *
58
+ * @since 2.0.0
59
+ * @access public
60
+ * @param array $columns
61
+ * @return array
62
+ */
63
+ public function manage_roles_columns( $columns ) {
64
+
65
+ $columns = array(
66
+ 'cb' => '<input type="checkbox" />',
67
+ 'title' => esc_html__( 'Role Name', 'members' ),
68
+ 'role' => esc_html__( 'Role', 'members' ),
69
+ 'users' => esc_html__( 'Users', 'members' ),
70
+ 'granted_caps' => esc_html__( 'Granted', 'members' ),
71
+ 'denied_caps' => esc_html__( 'Denied', 'members' )
72
+ );
73
+
74
+ return apply_filters( 'members_manage_roles_columns', $columns );
75
+ }
76
+
77
+ /**
78
+ * Runs on the `load-{$page}` hook. This is the handler for form submissions and requests.
79
+ *
80
+ * @since 2.0.0
81
+ * @access public
82
+ * @return void
83
+ */
84
+ public function load() {
85
+
86
+ // Get the current action if sent as request.
87
+ $action = isset( $_REQUEST['action'] ) ? sanitize_key( $_REQUEST['action'] ) : false;
88
+
89
+ // Get the current action if posted.
90
+ if ( ( isset( $_POST['action'] ) && 'delete' == $_POST['action'] ) || ( isset( $_POST['action2'] ) && 'delete' == $_POST['action2'] ) )
91
+ $action = 'bulk-delete';
92
+
93
+ // Bulk delete role handler.
94
+ if ( 'bulk-delete' === $action ) {
95
+
96
+ // If roles were selected, let's delete some roles.
97
+ if ( current_user_can( 'delete_roles' ) && isset( $_POST['roles'] ) && is_array( $_POST['roles'] ) ) {
98
+
99
+ // Verify the nonce. Nonce created via `WP_List_Table::display_tablenav()`.
100
+ check_admin_referer( 'bulk-roles' );
101
+
102
+ // Loop through each of the selected roles.
103
+ foreach ( $_POST['roles'] as $role ) {
104
+
105
+ $role = members_sanitize_role( $role );
106
+
107
+ if ( members_role_exists( $role ) )
108
+ members_delete_role( $role );
109
+ }
110
+
111
+ // Add roles deleted message.
112
+ add_settings_error( 'members_roles', 'roles_deleted', esc_html__( 'Selected roles deleted.', 'members' ), 'updated' );
113
+ }
114
+
115
+ // Delete single role handler.
116
+ } else if ( 'delete' === $action ) {
117
+
118
+ // Make sure the current user can delete roles.
119
+ if ( current_user_can( 'delete_roles' ) ) {
120
+
121
+ // Verify the referer.
122
+ check_admin_referer( 'delete_role', 'members_delete_role_nonce' );
123
+
124
+ // Get the role we want to delete.
125
+ $role = members_sanitize_role( $_GET['role'] );
126
+
127
+ // Check that we have a role before attempting to delete it.
128
+ if ( members_role_exists( $role ) ) {
129
+
130
+ // Add role deleted message.
131
+ add_settings_error( 'members_roles', 'role_deleted', sprintf( esc_html__( '%s role deleted.', 'members' ), members_get_role( $role )->get( 'label' ) ), 'updated' );
132
+
133
+ // Delete the role.
134
+ members_delete_role( $role );
135
+ }
136
+ }
137
+ }
138
+
139
+ // Load page hook.
140
+ do_action( 'members_load_manage_roles' );
141
+ }
142
+
143
+ /**
144
+ * Enqueue scripts/styles.
145
+ *
146
+ * @since 2.0.0
147
+ * @access public
148
+ * @return void
149
+ */
150
+ public function enqueue() {
151
+
152
+ wp_enqueue_style( 'members-admin' );
153
+ wp_enqueue_script( 'members-edit-role' );
154
+ }
155
+
156
+ /**
157
+ * Displays the page content.
158
+ *
159
+ * @since 2.0.0
160
+ * @access public
161
+ * @return void
162
+ */
163
+ public function page() {
164
+
165
+ require_once( members_plugin()->dir . 'admin/class-role-list-table.php' ); ?>
166
+
167
+ <div class="wrap">
168
+
169
+ <h1>
170
+ <?php esc_html_e( 'Roles', 'members' ); ?>
171
+
172
+ <?php if ( current_user_can( 'create_roles' ) ) : ?>
173
+ <a href="<?php echo esc_url( members_get_new_role_url() ); ?>" class="page-title-action"><?php echo esc_html_x( 'Add New', 'role', 'members' ); ?></a>
174
+ <?php endif; ?>
175
+ </h1>
176
+
177
+ <?php settings_errors( 'members_roles' ); ?>
178
+
179
+ <div id="poststuff">
180
+
181
+ <form id="roles" action="<?php echo esc_url( members_get_edit_roles_url() ); ?>" method="post">
182
+
183
+ <?php $table = new Role_List_Table(); ?>
184
+ <?php $table->prepare_items(); ?>
185
+ <?php $table->display(); ?>
186
+
187
+ </form><!-- #roles -->
188
+
189
+ </div><!-- #poststuff -->
190
+
191
+ </div><!-- .wrap -->
192
+ <?php }
193
+
194
+ /**
195
+ * Adds help tabs.
196
+ *
197
+ * @since 2.0.0
198
+ * @access public
199
+ * @return void
200
+ */
201
+ public function add_help_tabs() {
202
+
203
+ // Get the current screen.
204
+ $screen = get_current_screen();
205
+
206
+ // Add overview help tab.
207
+ $screen->add_help_tab(
208
+ array(
209
+ 'id' => 'overview',
210
+ 'title' => esc_html__( 'Overview', 'members' ),
211
+ 'callback' => array( $this, 'help_tab_overview' )
212
+ )
213
+ );
214
+
215
+ // Add screen content help tab.
216
+ $screen->add_help_tab(
217
+ array(
218
+ 'id' => 'screen-content',
219
+ 'title' => esc_html__( 'Screen Content', 'members' ),
220
+ 'callback' => array( $this, 'help_tab_screen_content' )
221
+ )
222
+ );
223
+
224
+ // Add available actions help tab.
225
+ $screen->add_help_tab(
226
+ array(
227
+ 'id' => 'row-actions',
228
+ 'title' => esc_html__( 'Available Actions', 'members' ),
229
+ 'callback' => array( $this, 'help_tab_row_actions' )
230
+ )
231
+ );
232
+
233
+ // Add bulk actions help tab.
234
+ $screen->add_help_tab(
235
+ array(
236
+ 'id' => 'bulk-actions',
237
+ 'title' => esc_html__( 'Bulk Actions', 'members' ),
238
+ 'callback' => array( $this, 'help_tab_bulk_actions' )
239
+ )
240
+ );
241
+
242
+ // Set the help sidebar.
243
+ $screen->set_help_sidebar( members_get_help_sidebar_text() );
244
+ }
245
+
246
+ /**
247
+ * Overview help tab callback function.
248
+ *
249
+ * @since 2.0.0
250
+ * @access public
251
+ * @return void
252
+ */
253
+ public function help_tab_overview() { ?>
254
+
255
+ <p>
256
+ <?php esc_html_e( 'This screen provides access to all of your user roles. Roles are a method of grouping users. They are made up of capabilities (caps), which give permission to users to perform specific actions on the site.' ); ?>
257
+ <p>
258
+ <?php }
259
+
260
+ /**
261
+ * Screen content help tab callback function.
262
+ *
263
+ * @since 2.0.0
264
+ * @access public
265
+ * @return void
266
+ */
267
+ public function help_tab_screen_content() { ?>
268
+
269
+ <p>
270
+ <?php esc_html_e( 'You can customize the display of this screen&#8216;s contents in a number of ways:', 'members' ); ?>
271
+ </p>
272
+
273
+ <ul>
274
+ <li><?php esc_html_e( 'You can hide/display columns based on your needs and decide how many roles to list per screen using the Screen Options tab.', 'members' ); ?></li>
275
+ <li><?php esc_html_e( 'You can filter the list of roles by types using the text links in the upper left. The default view is to show all roles.', 'members' ); ?></li>
276
+ </ul>
277
+ <?php }
278
+
279
+ /**
280
+ * Row actions help tab callback function.
281
+ *
282
+ * @since 2.0.0
283
+ * @access public
284
+ * @return void
285
+ */
286
+ public function help_tab_row_actions() { ?>
287
+
288
+ <p>
289
+ <?php esc_html_e( 'Hovering over a row in the roles list will display action links that allow you to manage your role. You can perform the following actions:', 'members' ); ?>
290
+ </p>
291
+
292
+ <ul>
293
+ <li><?php _e( '<strong>Edit</strong> takes you to the editing screen for that role. You can also reach that screen by clicking on the role name.', 'members' ); ?></li>
294
+ <li><?php _e( '<strong>Delete</strong> removes your role from this list and permanently deletes it.', 'members' ); ?></li>
295
+ <li><?php _e( '<strong>Clone</strong> copies the role and takes you to the new role screen to further edit it.', 'members' ); ?></li>
296
+ <li><?php _e( '<strong>Users</strong> takes you to the users screen and lists the users that have that role.', 'members' ); ?></li>
297
+ </ul>
298
+ <?php }
299
+
300
+ /**
301
+ * Bulk actions help tab callback function.
302
+ *
303
+ * @since 2.0.0
304
+ * @access public
305
+ * @return void
306
+ */
307
+ public function help_tab_bulk_actions() { ?>
308
+
309
+ <p>
310
+ <?php esc_html_e( 'You can permanently delete multiple roles at once. Select the roles you want to act on using the checkboxes, then select the action you want to take from the Bulk Actions menu and click Apply.', 'members' ); ?>
311
+ </p>
312
+ <?php }
313
+ }
admin/class-settings.php CHANGED
@@ -1,329 +1,747 @@
1
- <?php
2
- /**
3
- * Handles the settings screen.
4
- *
5
- * @package Members
6
- * @subpackage Admin
7
- * @author Justin Tadlock <justintadlock@gmail.com>
8
- * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
- * @link https://themehybrid.com/plugins/members
10
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
- */
12
-
13
- namespace Members\Admin;
14
-
15
- /**
16
- * Sets up and handles the plugin settings screen.
17
- *
18
- * @since 1.0.0
19
- * @access public
20
- */
21
- final class Settings_Page {
22
-
23
- /**
24
- * Admin page name/ID.
25
- *
26
- * @since 2.0.0
27
- * @access public
28
- * @var string
29
- */
30
- public $name = 'members-settings';
31
-
32
- /**
33
- * Settings page name.
34
- *
35
- * @since 1.0.0
36
- * @access public
37
- * @var string
38
- */
39
- public $settings_page = '';
40
-
41
- /**
42
- * Holds an array the settings page views.
43
- *
44
- * @since 2.0.0
45
- * @access public
46
- * @var array
47
- */
48
- public $views = array();
49
-
50
- /**
51
- * Returns the instance.
52
- *
53
- * @since 1.0.0
54
- * @access public
55
- * @return object
56
- */
57
- public static function get_instance() {
58
-
59
- static $instance = null;
60
-
61
- if ( is_null( $instance ) ) {
62
- $instance = new self;
63
- $instance->includes();
64
- $instance->setup_actions();
65
- }
66
-
67
- return $instance;
68
- }
69
-
70
- /**
71
- * Constructor method.
72
- *
73
- * @since 1.0.0
74
- * @access public
75
- * @return void
76
- */
77
- private function __construct() {}
78
-
79
- /**
80
- * Loads settings files.
81
- *
82
- * @since 2.0.0
83
- * @access private
84
- * @return void
85
- */
86
- private function includes() {
87
-
88
- // Include the settings functions.
89
- require_once( members_plugin()->dir . 'admin/functions-settings.php' );
90
-
91
- // Load settings view classes.
92
- require_once( members_plugin()->dir . 'admin/views/class-view.php' );
93
- require_once( members_plugin()->dir . 'admin/views/class-view-general.php' );
94
- require_once( members_plugin()->dir . 'admin/views/class-view-addons.php' );
95
- require_once( members_plugin()->dir . 'admin/views/class-view-donate.php' );
96
- }
97
-
98
- /**
99
- * Sets up initial actions.
100
- *
101
- * @since 2.0.0
102
- * @access private
103
- * @return void
104
- */
105
- private function setup_actions() {
106
-
107
- add_action( 'admin_menu', array( $this, 'admin_menu' ) );
108
- }
109
-
110
- /**
111
- * Register a view.
112
- *
113
- * @since 2.0.0
114
- * @access public
115
- * @param object $view
116
- * @return void
117
- */
118
- public function register_view( $view ) {
119
-
120
- if ( ! $this->view_exists( $view->name ) )
121
- $this->views[ $view->name ] = $view;
122
- }
123
-
124
- /**
125
- * Unregister a view.
126
- *
127
- * @since 2.0.0
128
- * @access public
129
- * @param string $name
130
- * @return void
131
- */
132
- public function unregister_view( $name ) {
133
-
134
- if ( $this->view_exists( $name ) )
135
- unset( $this->view[ $name ] );
136
- }
137
-
138
- /**
139
- * Get a view object
140
- *
141
- * @since 2.0.0
142
- * @access public
143
- * @param string $name
144
- * @return object
145
- */
146
- public function get_view( $name ) {
147
-
148
- return $this->view_exists( $name ) ? $this->views[ $name ] : false;
149
- }
150
-
151
- /**
152
- * Check if a view exists.
153
- *
154
- * @since 2.0.0
155
- * @access public
156
- * @param string $name
157
- * @return bool
158
- */
159
- public function view_exists( $name ) {
160
-
161
- return isset( $this->views[ $name ] );
162
- }
163
-
164
- /**
165
- * Sets up custom admin menus.
166
- *
167
- * @since 1.0.0
168
- * @access public
169
- * @return void
170
- */
171
- public function admin_menu() {
172
-
173
- // Create the settings page.
174
- $this->settings_page = add_options_page(
175
- esc_html_x( 'Members', 'admin screen', 'members' ),
176
- esc_html_x( 'Members', 'admin screen', 'members' ),
177
- apply_filters( 'members_settings_capability', 'manage_options' ),
178
- $this->name,
179
- array( $this, 'settings_page' )
180
- );
181
-
182
- if ( $this->settings_page ) {
183
-
184
- do_action( 'members_register_settings_views', $this );
185
-
186
- uasort( $this->views, 'members_priority_sort' );
187
-
188
- // Register setings.
189
- add_action( 'admin_init', array( $this, 'register_settings' ) );
190
-
191
- // Page load callback.
192
- add_action( "load-{$this->settings_page}", array( $this, 'load' ) );
193
-
194
- // Enqueue scripts/styles.
195
- add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
196
- }
197
- }
198
-
199
- /**
200
- * Runs on page load.
201
- *
202
- * @since 2.0.0
203
- * @access public
204
- * @return void
205
- */
206
- public function load() {
207
-
208
- // Print custom styles.
209
- add_action( 'admin_head', array( $this, 'print_styles' ) );
210
-
211
- // Add help tabs for the current view.
212
- $view = $this->get_view( members_get_current_settings_view() );
213
-
214
- if ( $view ) {
215
- $view->load();
216
- $view->add_help_tabs();
217
- }
218
- }
219
-
220
- /**
221
- * Print styles to the header.
222
- *
223
- * @since 2.0.0
224
- * @access public
225
- * @return void
226
- */
227
- public function print_styles() { ?>
228
-
229
- <style type="text/css">
230
- .settings_page_members-settings .wp-filter { margin-bottom: 15px; }
231
- </style>
232
- <?php }
233
-
234
- /**
235
- * Enqueue scripts/styles.
236
- *
237
- * @since 1.0.0
238
- * @access public
239
- * @param string $hook_suffix
240
- * @return void
241
- */
242
- public function enqueue( $hook_suffix ) {
243
-
244
- if ( $this->settings_page !== $hook_suffix )
245
- return;
246
-
247
- $view = $this->get_view( members_get_current_settings_view() );
248
-
249
- if ( $view )
250
- $view->enqueue();
251
- }
252
-
253
- /**
254
- * Registers the plugin settings.
255
- *
256
- * @since 1.0.0
257
- * @access public
258
- * @return void
259
- */
260
- function register_settings() {
261
-
262
- foreach ( $this->views as $view )
263
- $view->register_settings();
264
- }
265
-
266
- /**
267
- * Renders the settings page.
268
- *
269
- * @since 1.0.0
270
- * @access public
271
- * @return void
272
- */
273
- public function settings_page() { ?>
274
-
275
- <div class="wrap">
276
- <h1><?php echo esc_html_x( 'Members', 'admin screen', 'members' ); ?></h1>
277
-
278
- <div class="wp-filter">
279
- <?php $this->filter_links(); ?>
280
- </div>
281
-
282
- <?php $this->get_view( members_get_current_settings_view() )->template(); ?>
283
-
284
- </div><!-- wrap -->
285
- <?php }
286
-
287
- /**
288
- * Outputs the list of views.
289
- *
290
- * @since 2.0.0
291
- * @access public
292
- * @return void
293
- */
294
- private function filter_links() { ?>
295
-
296
- <ul class="filter-links">
297
-
298
- <?php foreach ( $this->views as $view ) :
299
-
300
- // Determine current class.
301
- $class = $view->name === members_get_current_settings_view() ? 'class="current"' : '';
302
-
303
- // Get the URL.
304
- $url = members_get_settings_view_url( $view->name );
305
-
306
- if ( 'general' === $view->name )
307
- $url = remove_query_arg( 'view', $url ); ?>
308
-
309
- <li class="<?php echo sanitize_html_class( $view->name ); ?>">
310
- <a href="<?php echo esc_url( $url ); ?>" <?php echo $class; ?>><?php echo esc_html( $view->label ); ?></a>
311
- </li>
312
-
313
- <?php endforeach; ?>
314
-
315
- </ul>
316
- <?php }
317
-
318
- /**
319
- * Adds help tabs.
320
- *
321
- * @since 1.0.0
322
- * @deprecated 2.0.0
323
- * @access public
324
- * @return void
325
- */
326
- public function add_help_tabs() {}
327
- }
328
-
329
- Settings_Page::get_instance();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Handles the settings screen.
4
+ *
5
+ * @package Members
6
+ * @subpackage Admin
7
+ * @author Justin Tadlock <justintadlock@gmail.com>
8
+ * @copyright Copyright (c) 2009 - 2018, Justin Tadlock
9
+ * @link https://themehybrid.com/plugins/members
10
+ * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
11
+ */
12
+
13
+ namespace Members\Admin;
14
+
15
+ /**
16
+ * Sets up and handles the plugin settings screen.
17
+ *
18
+ * @since 1.0.0
19
+ * @access public
20
+ */
21
+ final class Settings_Page {
22
+
23
+ /**
24
+ * Admin page name/ID.
25
+ *
26
+ * @since 2.0.0
27
+ * @access public
28
+ * @var string
29
+ */
30
+ public $name = 'members-settings';
31
+
32
+ /**
33
+ * Settings page name.
34
+ *
35
+ * @since 1.0.0
36
+ * @access public
37
+ * @var string
38
+ */
39
+ public $settings_page = '';
40
+
41
+ /**
42
+ * Holds an array the settings page views.
43
+ *
44
+ * @since 2.0.0
45
+ * @access public
46
+ * @var array
47
+ */
48
+ public $views = array();
49
+
50
+ /**
51
+ * Returns the instance.
52
+ *
53
+ * @since 1.0.0
54
+ * @access public
55
+ * @return object
56
+ */
57
+ public static function get_instance() {
58
+
59
+ static $instance = null;
60
+
61
+ if ( is_null( $instance ) ) {
62
+ $instance = new self;
63
+ $instance->includes();
64
+ $instance->setup_actions();
65
+ }
66
+
67
+ return $instance;
68
+ }
69
+
70
+ /**
71
+ * Constructor method.
72
+ *
73
+ * @since 1.0.0
74
+ * @access public
75
+ * @return void
76
+ */
77
+ private function __construct() {}
78
+
79
+ /**
80
+ * Loads settings files.
81
+ *
82
+ * @since 2.0.0
83
+ * @access private
84
+ * @return void
85
+ */
86
+ private function includes() {
87
+
88
+ // Include the settings functions.
89
+ require_once( members_plugin()->dir . 'admin/functions-settings.php' );
90
+
91
+ // Load settings view classes.
92
+ require_once( members_plugin()->dir . 'admin/views/class-view.php' );
93
+ require_once( members_plugin()->dir . 'admin/views/class-view-general.php' );
94
+ require_once( members_plugin()->dir . 'admin/views/class-view-addons.php' );
95
+ }
96
+
97
+ /**
98
+ * Sets up initial actions.
99
+ *
100
+ * @since 2.0.0
101
+ * @access private
102
+ * @return void
103
+ */
104
+ private function setup_actions() {
105
+
106
+ add_action( 'admin_menu', array( $this, 'admin_menu' ), 25 );
107
+ add_action( 'wp_ajax_mbrs_toggle_addon', array( $this, 'toggle_addon' ) );
108
+ }
109
+
110
+ /**
111
+ * AJAX call to toggle an addon off and on
112
+ *
113
+ * @return void
114
+ */
115
+ public function toggle_addon() {
116
+
117
+ if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( $_POST['nonce'], 'mbrs_toggle_addon' ) ) {
118
+ die();
119
+ }
120
+
121
+ $addon = ! empty( $_POST['addon'] ) ? sanitize_text_field( $_POST['addon'] ) : false;
122
+
123
+ if ( false === $addon ) {
124
+ wp_send_json_error( array(
125
+ 'msg' => esc_html__( 'No add-on provided.', 'members' )
126
+ ) );
127
+ }
128
+
129
+ // Grab the currently active add-ons
130
+ $active_addons = get_option( 'members_active_addons', array() );
131
+
132
+ if ( ! in_array( $addon, $active_addons ) ) { // Activate the addon
133
+ $active_addons[] = $addon;
134
+ $response = array(
135
+ 'status' => 'active',
136
+ 'action_label' => esc_html__( 'Active', 'members' ),
137
+ 'msg' => esc_html__( 'Add-on activated', 'members' )
138
+ );
139
+
140
+ // Run the add-on's activation hook
141
+ members_plugin()->run_addon_activator( $addon );
142
+
143
+ } else { // Deactivate the addon
144
+ $key = array_search( $addon, $active_addons );
145
+ unset( $active_addons[$key] );
146
+ $response = array(
147
+ 'status' => 'inactive',
148
+ 'action_label' => esc_html__( 'Activate', 'members' ),
149
+ 'msg' => esc_html__( 'Add-on deactivated', 'members' )
150
+ );
151
+ }
152
+
153
+ update_option( 'members_active_addons', $active_addons );
154
+
155
+ wp_send_json_success( $response );
156
+ }
157
+
158
+ /**
159
+ * Register a view.
160
+ *
161
+ * @since 2.0.0
162
+ * @access public
163
+ * @param object $view
164
+ * @return void
165
+ */
166
+ public function register_view( $view ) {
167
+
168
+ if ( ! $this->view_exists( $view->name ) )
169
+ $this->views[ $view->name ] = $view;
170
+ }
171
+
172
+ /**
173
+ * Unregister a view.
174
+ *
175
+ * @since 2.0.0
176
+ * @access public
177
+ * @param string $name
178
+ * @return void
179
+ */
180
+ public function unregister_view( $name ) {
181
+
182
+ if ( $this->view_exists( $name ) )
183
+ unset( $this->view[ $name ] );
184
+ }
185
+
186
+ /**
187
+ * Get a view object
188
+ *
189
+ * @since 2.0.0
190
+ * @access public
191
+ * @param string $name
192
+ * @return object
193
+ */
194
+ public function get_view( $name ) {
195
+
196
+ return $this->view_exists( $name ) ? $this->views[ $name ] : false;
197
+ }
198
+
199
+ /**
200
+ * Check if a view exists.
201
+ *
202
+ * @since 2.0.0
203
+ * @access public
204
+ * @param string $name
205
+ * @return bool
206
+ */
207
+ public function view_exists( $name ) {
208
+
209
+ return isset( $this->views[ $name ] );
210
+ }
211
+
212
+ /**
213
+ * Sets up custom admin menus.
214
+ *
215
+ * @since 1.0.0
216
+ * @access public
217
+ * @return void
218
+ */
219
+ public function admin_menu() {
220
+
221
+ // Create the settings page.
222
+ $this->settings_page = add_submenu_page( 'members', esc_html_x( 'Settings', 'admin screen', 'members' ), esc_html_x( 'Settings', 'admin screen', 'members' ), apply_filters( 'members_settings_capability', 'manage_options' ), 'members-settings', array( $this, 'settings_page' ) );
223
+ $this->addons_page = add_submenu_page( 'members', esc_html_x( 'Add-Ons', 'admin screen', 'members' ), _x( '<span style="color: #8CBD5A;">Add-Ons</span>', 'admin screen', 'members' ), apply_filters( 'members_settings_capability', 'manage_options' ), 'members-settings&view=add-ons', array( $this, 'settings_page' ) );
224
+ if ( ! is_plugin_active( 'memberpress/memberpress.php' ) ) {
225
+ $this->payments_page = add_submenu_page( 'members', esc_html_x( 'Payments', 'admin screen', 'members' ), esc_html_x( 'Payments', 'admin screen', 'members' ), apply_filters( 'members_settings_capability', 'manage_options' ), 'members-payments', array( $this, 'payments_page' ) );
226
+ }
227
+ $this->about_page = add_submenu_page( 'members', esc_html_x( 'About Us', 'admin screen', 'members' ), esc_html_x( 'About Us', 'admin screen', 'members' ), apply_filters( 'members_settings_capability', 'manage_options' ), 'members-about', array( $this, 'about_page' ) );
228
+
229
+ if ( $this->settings_page ) {
230
+
231
+ do_action( 'members_register_settings_views', $this );
232
+
233
+ uasort( $this->views, 'members_priority_sort' );
234
+
235
+ // Register setings.
236
+ add_action( 'admin_init', array( $this, 'register_settings' ) );
237
+
238
+ // Page load callback.
239
+ add_action( "load-{$this->settings_page}", array( $this, 'load' ) );
240
+
241
+ // Enqueue scripts/styles.
242
+ add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) );
243
+ }
244
+ }
245
+
246
+ /**
247
+ * Runs on page load.
248
+ *
249
+ * @since 2.0.0
250
+ * @access public
251
+ * @return void
252
+ */
253
+ public function load() {
254
+
255
+ // Print custom styles.
256
+ add_action( 'admin_head', array( $this, 'print_styles' ) );
257
+
258
+ // Add help tabs for the current view.
259
+ $view = $this->get_view( members_get_current_settings_view() );
260
+
261
+ if ( $view ) {
262
+ $view->load();
263
+ $view->add_help_tabs();
264
+ }
265
+ }
266
+
267
+ /**
268
+ * Print styles to the header.
269
+ *
270
+ * @since 2.0.0
271
+ * @access public
272
+ * @return void
273
+ */
274
+ public function print_styles() { ?>
275
+
276
+ <style type="text/css">
277
+
278
+ </style>
279
+ <?php }
280
+
281
+ /**
282
+ * Enqueue scripts/styles.
283
+ *
284
+ * @since 1.0.0
285
+ * @access public
286
+ * @param string $hook_suffix
287
+ * @return void
288
+ */
289
+ public function enqueue( $hook_suffix ) {
290
+
291
+ if ( $this->settings_page !== $hook_suffix )
292
+ return;
293
+
294
+ $view = $this->get_view( members_get_current_settings_view() );
295
+
296
+ if ( $view )
297
+ $view->enqueue();
298
+ }
299
+
300
+ /**
301
+ * Registers the plugin settings.
302
+ *
303
+ * @since 1.0.0
304
+ * @access public
305
+ * @return void
306
+ */
307
+ function register_settings() {
308
+
309
+ foreach ( $this->views as $view )
310
+ $view->register_settings();
311
+ }
312
+
313
+ /**
314
+ * Renders the settings page.
315
+ *
316
+ * @since 1.0.0
317
+ * @access public
318
+ * @return void
319
+ */
320
+ public function settings_page() { ?>
321
+
322
+ <div class="wrap">
323
+ <h1><?php echo esc_html_x( 'Members', 'admin screen', 'members' ); ?></h1>
324
+
325
+ <?php $this->get_view( members_get_current_settings_view() )->template(); ?>
326
+
327
+ </div><!-- wrap -->
328
+ <?php }
329
+
330
+ /**
331
+ * Renders the payments page.
332
+ *
333
+ * @since 1.0.0
334
+ * @access public
335
+ * @return void
336
+ */
337
+ public function payments_page() {
338
+
339
+ wp_enqueue_style( 'members-admin' );
340
+ wp_enqueue_script( 'members-settings' );
341
+
342
+ ?>
343
+
344
+ <div class="wrap">
345
+ <h1><?php echo esc_html_x( 'Payments', 'admin screen', 'members' ); ?></h1>
346
+ <div class="mepr-upgrade-table">
347
+ <?php members_memberpress_upgrade( 'https://memberpress.com/?utm_source=members_plugin&utm_medium=link&utm_campaign=payments&utm_content=payments_page' ); ?>
348
+ <table class="wp-list-table widefat fixed striped mepr_dummy_txns">
349
+ <thead>
350
+ <tr>
351
+ <th scope="col" class="manage-column column-col_id column-primary"><a href=""><span>Id</span></a></th>
352
+ <th scope="col" class="manage-column column-col_id column-primary"><a href=""><span>Transaction</span></a></th>
353
+ <th scope="col" class="manage-column column-col_id column-primary"><a href=""><span>Subscription</span></a></th>
354
+ <th scope="col" class="manage-column column-col_id column-primary"><a href=""><span>Status</span></a></th>
355
+ <th scope="col" class="manage-column column-col_id column-primary"><a href=""><span>Membership</span></a></th>
356
+ <th scope="col" class="manage-column column-col_id column-primary"><a href=""><span>Net</span></a></th>
357
+ <th scope="col" class="manage-column column-col_id column-primary"><a href=""><span>Tax</span></a></th>
358
+ <th scope="col" class="manage-column column-col_id column-primary"><a href=""><span>Total</span></a></th>
359
+ <th scope="col" class="manage-column column-col_id column-primary"><a href=""><span>Name</span></a></th>
360
+ <th scope="col" class="manage-column column-col_id column-primary"><a href=""><span>User</span></a></th>
361
+ <th scope="col" class="manage-column column-col_id column-primary"><a href=""><span>Gateway</span></a></th>
362
+ <th scope="col" class="manage-column column-col_id column-primary"><a href=""><span>Created On</span></a></th>
363
+ <th scope="col" class="manage-column column-col_id column-primary"><a href=""><span>Expires On</span></a></th>
364
+ </tr>
365
+ </thead>
366
+ <tbody id="the-list">
367
+ <tr class="alternate">
368
+ <td class="col_id column-col_id">1</td>
369
+ <td class="col_trans_num column-col_trans_num">
370
+ <a href="">1</a>
371
+ </td>
372
+ <td class="col_subscr_id column-col_subscr_id">None</td>
373
+ <td class="col_status column-col_status">
374
+ <div class="status_initial">
375
+ <a href="" title="Change transaction's status">Complete</a>
376
+ </div>
377
+ </td>
378
+ <td class="col_product column-col_product"><a href="">Your Membership</a></td>
379
+ <td class="col_net column-col_net">$20.00</td>
380
+ <td class="col_tax column-col_tax">$0.00</td>
381
+ <td class="col_total column-col_total">$20.00</td>
382
+ <td class="col_propername column-col_propername">Your Customer</td>
383
+ <td class="col_user_login column-col_user_login"><a href="#" title="View member's profile">user</a></td>
384
+ <td class="col_payment_system column-col_payment_system">Payment Method</td>
385
+ <td class="col_created_at column-col_created_at">January 27, 2020</td>
386
+ <td class="col_expires_at column-col_expires_at">Never</td>
387
+ </tr>
388
+ <tr class="">
389
+ <td class="col_id column-col_id">2</td>
390
+ <td class="col_trans_num column-col_trans_num">
391
+ <a href="">2</a>
392
+ </td>
393
+ <td class="col_subscr_id column-col_subscr_id">None</td>
394
+ <td class="col_status column-col_status">
395
+ <div class="status_initial">
396
+ <a href="" title="Change transaction's status">Complete</a>
397
+ </div>
398
+ </td>
399
+ <td class="col_product column-col_product"><a href="">Your Membership</a></td>
400
+ <td class="col_net column-col_net">$20.00</td>
401
+ <td class="col_tax column-col_tax">$0.00</td>
402
+ <td class="col_total column-col_total">$20.00</td>
403
+ <td class="col_propername column-col_propername">Your Customer</td>
404
+ <td class="col_user_login column-col_user_login"><a href="#" title="View member's profile">user</a></td>
405
+ <td class="col_payment_system column-col_payment_system">Payment Method</td>
406
+ <td class="col_created_at column-col_created_at">January 27, 2020</td>
407
+ <td class="col_expires_at column-col_expires_at">Never</td>
408
+ </tr>
409
+ <tr class="alternate">
410
+ <td class="col_id column-col_id">3</td>
411
+ <td class="col_trans_num column-col_trans_num">
412
+ <a href="">3</a>
413
+ </td>
414
+ <td class="col_subscr_id column-col_subscr_id">None</td>
415
+ <td class="col_status column-col_status">
416
+ <div class="status_initial">
417
+ <a href="" title="Change transaction's status">Complete</a>
418
+ </div>
419
+ </td>
420
+ <td class="col_product column-col_product"><a href="">Your Membership</a></td>
421
+ <td class="col_net column-col_net">$20.00</td>
422
+ <td class="col_tax column-col_tax">$0.00</td>
423
+ <td class="col_total column-col_total">$20.00</td>
424
+ <td class="col_propername column-col_propername">Your Customer</td>
425
+ <td class="col_user_login column-col_user_login"><a href="#" title="View member's profile">user</a></td>
426
+ <td class="col_payment_system column-col_payment_system">Payment Method</td>
427
+ <td class="col_created_at column-col_created_at">January 27, 2020</td>
428
+ <td class="col_expires_at column-col_expires_at">Never</td>
429
+ </tr>
430
+ <tr class="">
431
+ <td class="col_id column-col_id">4</td>
432
+ <td class="col_trans_num column-col_trans_num">
433
+ <a href="">4</a>
434
+ </td>
435
+ <td class="col_subscr_id column-col_subscr_id">None</td>
436
+ <td class="col_status column-col_status">
437
+ <div class="status_initial">
438
+ <a href="" title="Change transaction's status">Complete</a>
439
+ </div>
440
+ </td>
441
+ <td class="col_product column-col_product"><a href="">Your Membership</a></td>
442
+ <td class="col_net column-col_net">$20.00</td>
443
+ <td class="col_tax column-col_tax">$0.00</td>
444
+ <td class="col_total column-col_total">$20.00</td>
445
+ <td class="col_propername column-col_propername">Your Customer</td>
446
+ <td class="col_user_login column-col_user_login"><a href="#" title="View member's profile">user</a></td>
447
+ <td class="col_payment_system column-col_payment_system">Payment Method</td>
448
+ <td class="col_created_at column-col_created_at">January 27, 2020</td>
449
+ <td class="col_expires_at column-col_expires_at">Never</td>
450
+ </tr>
451
+ <tr class="alternate">
452
+ <td class="col_id column-col_id">5</td>
453
+ <td class="col_trans_num column-col_trans_num">
454
+ <a href="">5</a>
455
+ </td>
456
+ <td class="col_subscr_id column-col_subscr_id">None</td>
457
+ <td class="col_status column-col_status">
458
+ <div class="status_initial">
459
+ <a href="" title="Change transaction's status">Complete</a>
460
+ </div>
461
+ </td>
462
+ <td class="col_product column-col_product"><a href="">Your Membership</a></td>
463
+ <td class="col_net column-col_net">$20.00</td>
464
+ <td class="col_tax column-col_tax">$0.00</td>
465
+ <td class="col_total column-col_total">$20.00</td>
466
+ <td class="col_propername column-col_propername">Your Customer</td>
467
+ <td class="col_user_login column-col_user_login"><a href="#" title="View member's profile">user</a></td>
468
+ <td class="col_payment_system column-col_payment_system">Payment Method</td>
469
+ <td class="col_created_at column-col_created_at">January 27, 2020</td>
470
+ <td class="col_expires_at column-col_expires_at">Never</td>
471
+ </tr>
472
+ <tr class="">
473
+ <td class="col_id column-col_id">6</td>
474
+ <td class="col_trans_num column-col_trans_num">
475
+ <a href="">6</a>
476
+ </td>
477
+ <td class="col_subscr_id column-col_subscr_id">None</td>
478
+ <td class="col_status column-col_status">
479
+ <div class="status_initial">
480
+ <a href="" title="Change transaction's status">Complete</a>
481
+ </div>
482
+ </td>
483
+ <td class="col_product column-col_product"><a href="">Your Membership</a></td>
484
+ <td class="col_net column-col_net">$20.00</td>
485
+ <td class="col_tax column-col_tax">$0.00</td>
486
+ <td class="col_total column-col_total">$20.00</td>
487
+ <td class="col_propername column-col_propername">Your Customer</td>
488
+ <td class="col_user_login column-col_user_login"><a href="#" title="View member's profile">user</a></td>
489
+ <td class="col_payment_system column-col_payment_system">Payment Method</td>
490
+ <td class="col_created_at column-col_created_at">January 27, 2020</td>
491
+ <td class="col_expires_at column-col_expires_at">Never</td>
492
+ </tr>
493
+ <tr class="alternate">
494
+ <td class="col_id column-col_id">7</td>
495
+ <td class="col_trans_num column-col_trans_num">
496
+ <a href="">7</a>
497
+ </td>
498
+ <td class="col_subscr_id column-col_subscr_id">None</td>
499
+ <td class="col_status column-col_status">
500
+ <div class="status_initial">
501
+ <a href="" title="Change transaction's status">Complete</a>
502
+ </div>
503
+ </td>
504
+ <td class="col_product column-col_product"><a href="">Your Membership</a></td>
505
+ <td class="col_net column-col_net">$20.00</td>
506
+ <td class="col_tax column-col_tax">$0.00</td>
507
+ <td class="col_total column-col_total">$20.00</td>
508
+ <td class="col_propername column-col_propername">Your Customer</td>
509
+ <td class="col_user_login column-col_user_login"><a href="#" title="View member's profile">user</a></td>
510
+ <td class="col_payment_system column-col_payment_system">Payment Method</td>
511
+ <td class="col_created_at column-col_created_at">January 27, 2020</td>
512
+ <td class="col_expires_at column-col_expires_at">Never</td>
513
+ </tr>
514
+ <tr class="">
515
+ <td class="col_id column-col_id">8</td>
516
+ <td class="col_trans_num column-col_trans_num">
517
+ <a href="">8</a>
518
+ </td>
519
+ <td class="col_subscr_id column-col_subscr_id">None</td>
520
+ <td class="col_status column-col_status">
521
+ <div class="status_initial">
522
+ <a href="" title="Change transaction's status">Complete</a>
523
+ </div>
524
+ </td>
525
+ <td class="col_product column-col_product"><a href="">Your Membership</a></td>
526
+ <td class="col_net column-col_net">$20.00</td>
527
+ <td class="col_tax column-col_tax">$0.00</td>
528
+ <td class="col_total column-col_total">$20.00</td>
529
+ <td class="col_propername column-col_propername">Your Customer</td>
530
+ <td class="col_user_login column-col_user_login"><a href="#" title="View member's profile">user</a></td>
531
+ <td class="col_payment_system column-col_payment_system">Payment Method</td>
532
+ <td class="col_created_at column-col_created_at">January 27, 2020</td>
533
+ <td class="col_expires_at column-col_expires_at">Never</td>
534
+ </tr>
535
+ <tr class="alternate">
536
+ <td class="col_id column-col_id">9</td>
537
+ <td class="col_trans_num column-col_trans_num">
538
+ <a href="">9</a>
539
+ </td>
540
+ <td class="col_subscr_id column-col_subscr_id">None</td>
541
+ <td class="col_status column-col_status">
542
+ <div class="status_initial">
543
+ <a href="" title="Change transaction's status">Complete</a>
544
+ </div>
545
+ </td>
546
+ <td class="col_product column-col_product"><a href="">Your Membership</a></td>
547
+ <td class="col_net column-col_net">$20.00</td>
548
+ <td class="col_tax column-col_tax">$0.00</td>
549
+ <td class="col_total column-col_total">$20.00</td>
550
+ <td class="col_propername column-col_propername">Your Customer</td>
551
+ <td class="col_user_login column-col_user_login"><a href="#" title="View member's profile">user</a></td>
552
+ <td class="col_payment_system column-col_payment_system">Payment Method</td>
553
+ <td class="col_created_at column-col_created_at">January 27, 2020</td>
554
+ <td class="col_expires_at column-col_expires_at">Never</td>
555
+ </tr>
556
+ <tr class="">
557
+ <td class="col_id column-col_id">10</td>
558
+ <td class="col_trans_num column-col_trans_num">
559
+ <a href="">10</a>
560
+ </td>
561
+ <td class="col_subscr_id column-col_subscr_id">None</td>
562
+ <td class="col_status column-col_status">
563
+ <div class="status_initial">
564
+ <a href="" title="Change transaction's status">Complete</a>
565
+ </div>
566
+ </td>
567
+ <td class="col_product column-col_product"><a href="">Your Membership</a></td>
568
+ <td class="col_net column-col_net">$20.00</td>
569
+ <td class="col_tax column-col_tax">$0.00</td>
570
+ <td class="col_total column-col_total">$20.00</td>
571
+ <td class="col_propername column-col_propername">Your Customer</td>
572
+ <td class="col_user_login column-col_user_login"><a href="#" title="View member's profile">user</a></td>
573
+ <td class="col_payment_system column-col_payment_system">Payment Method</td>
574
+ <td class="col_created_at column-col_created_at">January 27, 2020</td>
575
+ <td class="col_expires_at column-col_expires_at">Never</td>
576
+ </tr>
577
+ </tbody>
578
+
579
+ </table>
580
+ </div>
581
+ </div><!-- wrap -->
582
+ <?php }
583
+
584
+ /**
585
+ * Renders the about page.
586
+ *
587
+ * @since 1.0.0
588
+ * @access public
589
+ * @return void
590
+ */
591
+ public function about_page() {
592
+
593
+ $installed_plugins = get_plugins();
594
+
595
+ wp_enqueue_style( 'members-admin' );
596
+ wp_enqueue_script( 'members-settings' );
597
+
598
+ ?>
599
+
600
+ <div class="wrap">
601
+ <h1><?php echo esc_html_x( 'About Us', 'admin screen', 'members' ); ?></h1>
602
+ <div class="welcome-panel">
603
+ <div class="welcome-panel-content memberpress-about">
604
+ <div class="welcome-panel-column-container">
605
+ <div class="mp-desc">
606
+ <p style="font-weight: bold;">Hello and welcome to Members by <a href="https://memberpress.com/?utm_source=members_plugin&utm_medium=link&utm_campaign=about_us&utm_content=link_1" target="_blank">MemberPress</a>, the simplest WordPress membership and role editor plugin. Our team here at MemberPress builds software that helps you to easily add powerful membership features to your website in minutes.</p>
607
+ <p>Over the years, we found that most WordPress membership plugins were bloated, buggy, slow, very hard to use and expensive. So, we started with a simple goal: build a WordPress membership plugin that’s both easy and powerful.</p>
608
+ <p>Our goal is to take the pain out of creating membership sites and make it easy.</p>
609
+ <p>Members is brought to you by the same team that’s behind the most powerful, full-featured membership plugin, <a href="https://memberpress.com/?utm_source=members_plugin&utm_medium=link&utm_campaign=about_us&utm_content=link_2" target="_blank">MemberPress</a>, the best Affiliate Program plugin, <a href="https://affiliateroyale.com/?utm_source=members_plugin&utm_medium=link&utm_campaign=about_us&utm_content=link_3" target="_blank">Affiliate Royale</a>, and the best Affiliate Link Management plugin on the market, <a href="https://prettylinks.com/?utm_source=members_plugin&utm_medium=link&utm_campaign=about_us&utm_content=link_4" target="_blank">Pretty Links</a>.</p>
610
+ <p>So, you can see that we know a thing or two about building great products that customers love.</p>
611
+ </div>
612
+ <div class="mp-logo-wrap">
613
+ <a href="https://memberpress.com/?utm_source=members_plugin&utm_medium=banner&utm_campaign=about_us&utm_content=memberpress_logo_large">
614
+ <img src="<?php echo members_plugin()->uri . "img/mp-logo-stacked-RGB.jpg"; ?>" class="mp-logo" alt="">
615
+ </a>
616
+ </div>
617
+ </div>
618
+ </div>
619
+ </div>
620
+ <div class="members-about-addons">
621
+ <div class="members-plugin-card plugin-card plugin-card-memberpress" style="margin-left: 0;">
622
+ <div class="plugin-card-top">
623
+ <div class="name column-name">
624
+ <h3>
625
+ <a href="https://memberpress.com/?utm_source=members_plugin&utm_medium=link&utm_campaign=about_us&utm_content=memberpress_icon_title" target="_blank" rel="noopener noreferrer">
626
+ MemberPress <img src="<?php echo members_plugin()->uri . "img/mp-icon-RGB.jpg"; ?>" class="plugin-icon" alt="">
627
+ </a>
628
+ </h3>
629
+ </div>
630
+ <div class="desc column-description">
631
+ <p>MemberPress will help you build astounding WordPress membership sites, accept credit cards securely, control who sees your content and sell digital downloads... all without the difficult setup.</p>
632
+ </div>
633
+ </div>
634
+ <div class="plugin-card-bottom">
635
+ <?php if ( is_plugin_active( 'memberpress/memberpress.php' ) ) : // Installed and active ?>
636
+ <div class="column-rating column-status">Status: <span class="active">Active</span></div>
637
+ <div class="column-updated"><a href="https://memberpress.com/?utm_source=members_plugin&utm_medium=link&utm_campaign=about_us&utm_content=memberpress_learn_more" target="_blank" class="button button-secondary">Learn More</a></div>
638
+ <?php elseif ( array_key_exists( 'memberpress/memberpress.php', $installed_plugins ) ) : // Installed but inactive ?>
639
+ <div class="column-rating column-status">Status: <span class="inactive">Inactive</span></div>
640
+ <div class="column-updated"><a href="<?php echo wp_nonce_url( admin_url( 'plugins.php?action=activate&plugin=memberpress/memberpress.php' ), 'activate-plugin_memberpress/memberpress.php' ); ?>" class="button button-secondary">Activate</a></div>
641
+ <?php else : // Not installed ?>
642
+ <div class="column-rating column-status">Status: Not Installed</div>
643
+ <div class="column-updated"><a href="https://memberpress.com/?utm_source=members_plugin&utm_medium=link&utm_campaign=about_us&utm_content=memberpress_install" target="_blank" class="button button-primary">Install Plugin</a></div>
644
+ <?php endif; ?>
645
+ </div>
646
+ </div>
647
+
648
+ <div class="members-plugin-card plugin-card plugin-card-pretty-links">
649
+ <div class="plugin-card-top">
650
+ <div class="name column-name">
651
+ <h3>
652
+ <a href="https://prettylinks.com/?utm_source=members_plugin&utm_medium=link&utm_campaign=about_us&utm_content=prettylinks_icon_title" target="_blank" rel="noopener noreferrer">
653
+ Pretty Links <img src="<?php echo members_plugin()->uri . "img/pl-icon-RGB.jpg"; ?>" class="plugin-icon" alt="">
654
+ </a>
655
+ </h3>
656
+ </div>
657
+ <div class="desc column-description">
658
+ <p>The easiest way to monetize your content. Are you tired of managing affiliate offers manually? Pretty Links helps you unlock more affiliate revenue from your existing content ... it’s like a surprise inheritance!</p>
659
+ </div>
660
+ </div>
661
+ <div class="plugin-card-bottom">
662
+ <?php if ( is_plugin_active( 'pretty-link/pretty-link.php' ) ) : // Installed and active ?>
663
+ <div class="column-rating column-status">Status: <span class="active">Active</span></div>
664
+ <div class="column-updated"><a href="https://prettylinks.com/?utm_source=members_plugin&utm_medium=link&utm_campaign=about_us&utm_content=prettylinks_learn_more" target="_blank" class="button button-secondary">Learn More</a></div>
665
+ <?php elseif ( array_key_exists( 'pretty-link/pretty-link.php', $installed_plugins ) ) : // Installed but inactive ?>
666
+ <div class="column-rating column-status">Status: <span class="inactive">Inactive</span></div>
667
+ <div class="column-updated"><a href="<?php echo wp_nonce_url( admin_url( 'plugins.php?action=activate&plugin=pretty-link/p