WooCommerce PayPal Payments - Version 1.6.0

Version Description

  • Add - Webhook status. #246 #273
  • Add - Show CC gateway in admin payments list. #236
  • Add - Add 3d secure contingency settings. #230
  • Add - Improve logging. #252 #275
  • Add - Do not send payee email. #231
  • Add - Allow customers to see and delete their saved payments in My Account. #274
  • Fix - PayPal Payments generates multiple orders. #244
  • Fix - Saved credit card does not auto fill. #242
  • Fix - Incorrect webhooks registration. #254
  • Fix - Disable funding credit cards affecting hosted fields, unset for GB. #249
  • Fix - REFUND_CAPTURE_CURRENCY_MISMATCH on multicurrency sites. #225
  • Fix - Can't checkout to certain countries with optional postcode. #224
Download this release

Release Info

Developer woothemes
Plugin Icon 128x128 WooCommerce PayPal Payments
Version 1.6.0
Comparing to
See all releases

Code changes from version 1.5.1 to 1.6.0

Files changed (109) hide show
  1. bootstrap.php +56 -0
  2. changelog.txt +14 -0
  3. modules.php +30 -0
  4. modules/ppcp-api-client/services.php +8 -3
  5. modules/ppcp-api-client/src/Endpoint/class-orderendpoint.php +1 -1
  6. modules/ppcp-api-client/src/Endpoint/class-paymenttokenendpoint.php +1 -18
  7. modules/ppcp-api-client/src/Endpoint/class-requesttrait.php +43 -1
  8. modules/ppcp-api-client/src/Endpoint/class-webhookendpoint.php +114 -41
  9. modules/ppcp-api-client/src/Entity/class-cardauthenticationresult.php +1 -1
  10. modules/ppcp-api-client/src/Entity/class-payee.php +3 -3
  11. modules/ppcp-api-client/src/Entity/class-webhook.php +28 -1
  12. modules/ppcp-api-client/src/Entity/class-webhookevent.php +170 -0
  13. modules/ppcp-api-client/src/Factory/class-payeefactory.php +2 -7
  14. modules/ppcp-api-client/src/Factory/class-paymentsourcefactory.php +2 -2
  15. modules/ppcp-api-client/src/Factory/class-purchaseunitfactory.php +15 -0
  16. modules/ppcp-api-client/src/Factory/class-webhookeventfactory.php +74 -0
  17. modules/ppcp-button/assets/css/hosted-fields.css +1 -1
  18. modules/ppcp-button/assets/js/button.js +1 -2
  19. modules/ppcp-button/assets/js/button.js.map +0 -1
  20. modules/ppcp-button/assets/js/hosted-fields.js +1 -2
  21. modules/ppcp-button/assets/js/hosted-fields.js.map +0 -1
  22. modules/ppcp-button/resources/css/hosted-fields.scss +4 -0
  23. modules/ppcp-button/resources/js/modules/ContextBootstrap/CheckoutBootstap.js +33 -3
  24. modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js +89 -35
  25. modules/ppcp-button/resources/js/modules/Renderer/Renderer.js +9 -1
  26. modules/ppcp-button/services.php +11 -5
  27. modules/ppcp-button/src/Assets/class-smartbutton.php +27 -5
  28. modules/ppcp-button/src/Endpoint/class-approveorderendpoint.php +4 -1
  29. modules/ppcp-button/src/Endpoint/class-changecartendpoint.php +24 -11
  30. modules/ppcp-button/src/Endpoint/class-createorderendpoint.php +35 -7
  31. modules/ppcp-button/src/Endpoint/class-dataclientidendpoint.php +18 -4
  32. modules/ppcp-button/src/Helper/class-threedsecure.php +20 -1
  33. modules/ppcp-onboarding/services.php +3 -1
  34. modules/ppcp-onboarding/src/Endpoint/class-loginsellerendpoint.php +16 -3
  35. modules/ppcp-subscription/services.php +3 -10
  36. modules/ppcp-subscription/src/class-renewalhandler.php +1 -1
  37. modules/ppcp-subscription/src/class-subscriptionmodule.php +4 -4
  38. modules/ppcp-vaulting/assets/js/myaccount-payments.js +1 -0
  39. modules/ppcp-vaulting/extensions.php +12 -0
  40. modules/ppcp-vaulting/module.php +16 -0
  41. modules/ppcp-vaulting/package.json +23 -0
  42. modules/ppcp-vaulting/resources/js/myaccount-payments.js +41 -0
  43. modules/ppcp-vaulting/services.php +42 -0
  44. modules/ppcp-vaulting/src/Assets/class-myaccountpaymentsassets.php +67 -0
  45. modules/ppcp-vaulting/src/Endpoint/class-deletepaymenttokenendpoint.php +95 -0
  46. modules/{ppcp-subscription/src/Repository → ppcp-vaulting/src}/class-paymenttokenrepository.php +23 -16
  47. modules/ppcp-vaulting/src/class-paymenttokensrenderer.php +83 -0
  48. modules/ppcp-vaulting/src/class-vaultingmodule.php +116 -0
  49. modules/ppcp-vaulting/webpack.config.js +22 -0
  50. modules/ppcp-vaulting/yarn.lock +2219 -0
  51. modules/ppcp-wc-gateway/assets/js/gateway-settings.js +1 -2
  52. modules/ppcp-wc-gateway/assets/js/gateway-settings.js.map +0 -1
  53. modules/ppcp-wc-gateway/package.json +5 -5
  54. modules/ppcp-wc-gateway/services.php +109 -17
  55. modules/ppcp-wc-gateway/src/Gateway/class-creditcardgateway.php +86 -11
  56. modules/ppcp-wc-gateway/src/Gateway/class-paypalgateway.php +40 -8
  57. modules/ppcp-wc-gateway/src/Gateway/class-processpaymenttrait.php +20 -0
  58. modules/ppcp-wc-gateway/src/Notice/class-dccwithoutpaypaladminnotice.php +101 -0
  59. modules/ppcp-wc-gateway/src/Processor/class-orderprocessor.php +1 -1
  60. modules/ppcp-wc-gateway/src/Processor/class-refundprocessor.php +1 -1
  61. modules/ppcp-wc-gateway/src/Settings/class-pagematchertrait.php +49 -0
  62. modules/ppcp-wc-gateway/src/Settings/class-sectionsrenderer.php +22 -8
  63. modules/ppcp-wc-gateway/src/Settings/class-settingslistener.php +72 -41
  64. modules/ppcp-wc-gateway/src/Settings/class-settingsrenderer.php +74 -67
  65. modules/ppcp-wc-gateway/src/class-wcgatewaymodule.php +13 -60
  66. modules/ppcp-wc-gateway/webpack.config.js +1 -1
  67. modules/ppcp-wc-gateway/yarn.lock +1222 -3033
  68. modules/ppcp-webhooks/assets/css/status-page.css +1 -0
  69. modules/ppcp-webhooks/assets/js/status-page-style.js +1 -0
  70. modules/ppcp-webhooks/assets/js/status-page.js +1 -0
  71. modules/ppcp-webhooks/extensions.php +58 -1
  72. modules/ppcp-webhooks/package.json +23 -0
  73. modules/ppcp-webhooks/resources/css/status-page.scss +34 -0
  74. modules/ppcp-webhooks/resources/js/status-page.js +148 -0
  75. modules/ppcp-webhooks/services.php +140 -6
  76. modules/ppcp-webhooks/src/Endpoint/class-resubscribeendpoint.php +79 -0
  77. modules/ppcp-webhooks/src/Endpoint/class-simulateendpoint.php +77 -0
  78. modules/ppcp-webhooks/src/Endpoint/class-simulationstateendpoint.php +68 -0
  79. modules/ppcp-webhooks/src/Status/Assets/class-webhooksstatuspageassets.php +110 -0
  80. modules/ppcp-webhooks/src/Status/class-webhooksimulation.php +180 -0
  81. modules/ppcp-webhooks/src/Status/class-webhooksstatuspage.php +18 -0
  82. modules/ppcp-webhooks/src/class-incomingwebhookendpoint.php +80 -34
  83. modules/ppcp-webhooks/src/class-webhookmodule.php +73 -0
  84. modules/ppcp-webhooks/src/class-webhookregistrar.php +16 -1
  85. modules/ppcp-webhooks/webpack.config.js +36 -0
  86. modules/ppcp-webhooks/yarn.lock +2219 -0
  87. readme.txt +15 -1
  88. vendor/autoload.php +1 -1
  89. vendor/composer/ClassLoader.php +102 -11
  90. vendor/composer/InstalledVersions.php +6 -6
  91. vendor/composer/autoload_classmap.php +15 -1
  92. vendor/composer/autoload_real.php +7 -7
  93. vendor/composer/autoload_static.php +19 -5
  94. vendor/composer/installed.json +7 -7
  95. vendor/composer/installed.php +5 -5
  96. vendor/dhii/module-interface/.env.example +0 -6
  97. vendor/dhii/module-interface/CHANGELOG.md +0 -32
  98. vendor/dhii/module-interface/LICENSE +0 -21
  99. vendor/dhii/module-interface/README.md +0 -290
  100. vendor/dhii/module-interface/docker-compose.yml +0 -29
  101. vendor/dhii/module-interface/docker/Dockerfile +0 -39
  102. vendor/dhii/module-interface/phpcs.xml.dist +0 -50
  103. vendor/dhii/module-interface/phpunit.xml.dist +0 -20
  104. vendor/dhii/module-interface/psalm.xml.dist +0 -152
  105. vendor/dhii/module-interface/tests/bootstrap.php +0 -5
  106. vendor/dhii/module-interface/tests/stubs/GetImplementingMockBuilderCapableTrait.php +0 -48
  107. vendor/dhii/module-interface/tests/unit/Exception/ModuleExceptionInterfaceTest.php +0 -64
  108. vendor/dhii/module-interface/tests/unit/ModuleAwareInterfaceTest.php +0 -46
  109. vendor/dhii/module-interface/tests/unit/ModuleInterfaceTest.php +0 -38
bootstrap.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Bootstraps the modular app.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce
6
+ */
7
+
8
+ use Dhii\Container\CachingContainer;
9
+ use Dhii\Container\CompositeCachingServiceProvider;
10
+ use Dhii\Container\CompositeContainer;
11
+ use Dhii\Container\DelegatingContainer;
12
+ use Dhii\Container\ProxyContainer;
13
+ use Dhii\Modular\Module\ModuleInterface;
14
+ use Interop\Container\ServiceProviderInterface;
15
+ use Psr\Container\ContainerInterface;
16
+
17
+ return function (
18
+ string $root_dir,
19
+ ContainerInterface ...$additional_containers
20
+ ): ContainerInterface {
21
+ $modules = ( require "$root_dir/modules.php" )( $root_dir );
22
+
23
+ // Use this filter to add custom module or remove some of existing ones.
24
+ // Modules able to access container, add services and modify existing ones.
25
+ $modules = apply_filters( 'woocommerce_paypal_payments_modules', $modules );
26
+
27
+ $providers = array_map(
28
+ function ( ModuleInterface $module ): ServiceProviderInterface {
29
+ return $module->setup();
30
+ },
31
+ $modules
32
+ );
33
+
34
+ $provider = new CompositeCachingServiceProvider( $providers );
35
+ $proxy_container = new ProxyContainer();
36
+ // TODO: caching does not work currently,
37
+ // may want to consider fixing it later (pass proxy as parent to DelegatingContainer)
38
+ // for now not fixed since we were using this behavior for long time and fixing it now may break things.
39
+ $container = new DelegatingContainer( $provider );
40
+ $app_container = new CachingContainer(
41
+ new CompositeContainer(
42
+ array_merge(
43
+ $additional_containers,
44
+ array( $container )
45
+ )
46
+ )
47
+ );
48
+ $proxy_container->setInnerContainer( $app_container );
49
+
50
+ foreach ( $modules as $module ) {
51
+ /* @var $module ModuleInterface module */
52
+ $module->run( $app_container );
53
+ }
54
+
55
+ return $app_container;
56
+ };
changelog.txt CHANGED
@@ -1,5 +1,19 @@
1
  *** Changelog ***
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  = 1.5.1 - 2021-08-19 =
4
  * Fix - Set 3DS contingencies to "SCA_WHEN_REQUIRED". #178
5
  * Fix - Plugin conflict blocking line item details. #221
1
  *** Changelog ***
2
 
3
+ = 1.6.0 - 2021-09-29 =
4
+ * Add - Webhook status. #246 #273
5
+ * Add - Show CC gateway in admin payments list. #236
6
+ * Add - Add 3d secure contingency settings. #230
7
+ * Add - Improve logging. #252 #275
8
+ * Add - Do not send payee email. #231
9
+ * Add - Allow customers to see and delete their saved payments in My Account. #274
10
+ * Fix - PayPal Payments generates multiple orders. #244
11
+ * Fix - Saved credit card does not auto fill. #242
12
+ * Fix - Incorrect webhooks registration. #254
13
+ * Fix - Disable funding credit cards affecting hosted fields, unset for GB. #249
14
+ * Fix - REFUND_CAPTURE_CURRENCY_MISMATCH on multicurrency sites. #225
15
+ * Fix - Can't checkout to certain countries with optional postcode. #224
16
+
17
  = 1.5.1 - 2021-08-19 =
18
  * Fix - Set 3DS contingencies to "SCA_WHEN_REQUIRED". #178
19
  * Fix - Plugin conflict blocking line item details. #221
modules.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The list of modules.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce
6
+ */
7
+
8
+ use WooCommerce\PayPalCommerce\PluginModule;
9
+
10
+ return function ( string $root_dir ): iterable {
11
+ $modules_dir = "$root_dir/modules";
12
+
13
+ $modules = array(
14
+ new PluginModule(),
15
+ ( require "$modules_dir/woocommerce-logging/module.php" )(),
16
+ ( require "$modules_dir/ppcp-admin-notices/module.php" )(),
17
+ ( require "$modules_dir/ppcp-api-client/module.php" )(),
18
+ ( require "$modules_dir/ppcp-button/module.php" )(),
19
+ ( require "$modules_dir/ppcp-compat/module.php" )(),
20
+ ( require "$modules_dir/ppcp-onboarding/module.php" )(),
21
+ ( require "$modules_dir/ppcp-session/module.php" )(),
22
+ ( require "$modules_dir/ppcp-status-report/module.php" )(),
23
+ ( require "$modules_dir/ppcp-subscription/module.php" )(),
24
+ ( require "$modules_dir/ppcp-wc-gateway/module.php" )(),
25
+ ( require "$modules_dir/ppcp-webhooks/module.php" )(),
26
+ ( require "$modules_dir/ppcp-vaulting/module.php" )(),
27
+ );
28
+
29
+ return $modules;
30
+ };
modules/ppcp-api-client/services.php CHANGED
@@ -35,6 +35,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Factory\PaymentTokenFactory;
35
  use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory;
36
  use WooCommerce\PayPalCommerce\ApiClient\Factory\SellerStatusFactory;
37
  use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingFactory;
 
38
  use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory;
39
  use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache;
40
  use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies;
@@ -71,19 +72,19 @@ return array(
71
  return 'WC-';
72
  },
73
  'api.bearer' => static function ( $container ): Bearer {
74
-
75
  $cache = new Cache( 'ppcp-paypal-bearer' );
76
  $key = $container->get( 'api.key' );
77
  $secret = $container->get( 'api.secret' );
78
-
79
  $host = $container->get( 'api.host' );
80
  $logger = $container->get( 'woocommerce.logger.woocommerce' );
 
81
  return new PayPalBearer(
82
  $cache,
83
  $host,
84
  $key,
85
  $secret,
86
- $logger
 
87
  );
88
  },
89
  'api.endpoint.partners' => static function ( $container ) : PartnersEndpoint {
@@ -114,6 +115,7 @@ return array(
114
  $container->get( 'api.host' ),
115
  $container->get( 'api.bearer' ),
116
  $container->get( 'api.factory.webhook' ),
 
117
  $container->get( 'woocommerce.logger.woocommerce' )
118
  );
119
  },
@@ -214,6 +216,9 @@ return array(
214
  'api.factory.webhook' => static function ( $container ): WebhookFactory {
215
  return new WebhookFactory();
216
  },
 
 
 
217
  'api.factory.capture' => static function ( $container ): CaptureFactory {
218
 
219
  $amount_factory = $container->get( 'api.factory.amount' );
35
  use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory;
36
  use WooCommerce\PayPalCommerce\ApiClient\Factory\SellerStatusFactory;
37
  use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingFactory;
38
+ use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookEventFactory;
39
  use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory;
40
  use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache;
41
  use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies;
72
  return 'WC-';
73
  },
74
  'api.bearer' => static function ( $container ): Bearer {
 
75
  $cache = new Cache( 'ppcp-paypal-bearer' );
76
  $key = $container->get( 'api.key' );
77
  $secret = $container->get( 'api.secret' );
 
78
  $host = $container->get( 'api.host' );
79
  $logger = $container->get( 'woocommerce.logger.woocommerce' );
80
+ $settings = $container->get( 'wcgateway.settings' );
81
  return new PayPalBearer(
82
  $cache,
83
  $host,
84
  $key,
85
  $secret,
86
+ $logger,
87
+ $settings
88
  );
89
  },
90
  'api.endpoint.partners' => static function ( $container ) : PartnersEndpoint {
115
  $container->get( 'api.host' ),
116
  $container->get( 'api.bearer' ),
117
  $container->get( 'api.factory.webhook' ),
118
+ $container->get( 'api.factory.webhook-event' ),
119
  $container->get( 'woocommerce.logger.woocommerce' )
120
  );
121
  },
216
  'api.factory.webhook' => static function ( $container ): WebhookFactory {
217
  return new WebhookFactory();
218
  },
219
+ 'api.factory.webhook-event' => static function ( $container ): WebhookEventFactory {
220
+ return new WebhookEventFactory();
221
+ },
222
  'api.factory.capture' => static function ( $container ): CaptureFactory {
223
 
224
  $amount_factory = $container->get( 'api.factory.amount' );
modules/ppcp-api-client/src/Endpoint/class-orderendpoint.php CHANGED
@@ -390,7 +390,7 @@ class OrderEndpoint {
390
  }
391
  $json = json_decode( $response['body'] );
392
  $status_code = (int) wp_remote_retrieve_response_code( $response );
393
- if ( 201 !== $status_code ) {
394
  if ( false !== strpos( $response['body'], ErrorResponse::ORDER_ALREADY_AUTHORIZED ) ) {
395
  return $this->order( $order->id() );
396
  }
390
  }
391
  $json = json_decode( $response['body'] );
392
  $status_code = (int) wp_remote_retrieve_response_code( $response );
393
+ if ( ! in_array( $status_code, array( 200, 201 ), true ) ) {
394
  if ( false !== strpos( $response['body'], ErrorResponse::ORDER_ALREADY_AUTHORIZED ) ) {
395
  return $this->order( $order->id() );
396
  }
modules/ppcp-api-client/src/Endpoint/class-paymenttokenendpoint.php CHANGED
@@ -139,24 +139,7 @@ class PaymentTokenEndpoint {
139
  foreach ( $json->payment_tokens as $token_value ) {
140
  $tokens[] = $this->factory->from_paypal_response( $token_value );
141
  }
142
- if ( empty( $tokens ) ) {
143
- $error = new RuntimeException(
144
- sprintf(
145
- // translators: %d is the customer id.
146
- __( 'No token stored for customer %d.', 'woocommerce-paypal-payments' ),
147
- $id
148
- )
149
- );
150
- $this->logger->log(
151
- 'warning',
152
- $error->getMessage(),
153
- array(
154
- 'args' => $args,
155
- 'response' => $response,
156
- )
157
- );
158
- throw $error;
159
- }
160
  return $tokens;
161
  }
162
 
139
  foreach ( $json->payment_tokens as $token_value ) {
140
  $tokens[] = $this->factory->from_paypal_response( $token_value );
141
  }
142
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
  return $tokens;
144
  }
145
 
modules/ppcp-api-client/src/Endpoint/class-requesttrait.php CHANGED
@@ -36,6 +36,48 @@ trait RequestTrait {
36
  $args['headers']['PayPal-Partner-Attribution-Id'] = 'Woo_PPCP';
37
  }
38
 
39
- return wp_remote_get( $url, $args );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  }
41
  }
36
  $args['headers']['PayPal-Partner-Attribution-Id'] = 'Woo_PPCP';
37
  }
38
 
39
+ $response = wp_remote_get( $url, $args );
40
+ $this->logger->debug( $this->request_response_string( $url, $args, $response ) );
41
+ return $response;
42
+ }
43
+
44
+ /**
45
+ * Returns request and response information as string.
46
+ *
47
+ * @param string $url The request URL.
48
+ * @param array $args The request arguments.
49
+ * @param array $response The response.
50
+ * @return string
51
+ */
52
+ private function request_response_string( string $url, array $args, array $response ): string {
53
+ $method = $args['method'] ?? '';
54
+ $output = $method . ' ' . $url . "\n";
55
+ if ( isset( $args['body'] ) ) {
56
+ if ( ! in_array(
57
+ $url,
58
+ array(
59
+ trailingslashit( $this->host ) . 'v1/oauth2/token/',
60
+ trailingslashit( $this->host ) . 'v1/oauth2/token?grant_type=client_credentials',
61
+ ),
62
+ true
63
+ ) ) {
64
+ $output .= 'Request Body: ' . wc_print_r( $args['body'], true ) . "\n";
65
+ }
66
+ }
67
+
68
+ if ( isset( $response['headers']->getAll()['paypal-debug-id'] ) ) {
69
+ $output .= 'Response Debug ID: ' . $response['headers']->getAll()['paypal-debug-id'] . "\n";
70
+ }
71
+ if ( isset( $response['response'] ) ) {
72
+ $output .= 'Response: ' . wc_print_r( $response['response'], true ) . "\n";
73
+
74
+ if ( isset( $response['body'] )
75
+ && isset( $response['response']['code'] )
76
+ && ! in_array( $response['response']['code'], array( 200, 201, 202, 204 ), true ) ) {
77
+ $output .= 'Response Body: ' . wc_print_r( $response['body'], true ) . "\n";
78
+ }
79
+ }
80
+
81
+ return $output;
82
  }
83
  }
modules/ppcp-api-client/src/Endpoint/class-webhookendpoint.php CHANGED
@@ -11,8 +11,10 @@ namespace WooCommerce\PayPalCommerce\ApiClient\Endpoint;
11
 
12
  use WooCommerce\PayPalCommerce\ApiClient\Authentication\Bearer;
13
  use WooCommerce\PayPalCommerce\ApiClient\Entity\Webhook;
 
14
  use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
15
  use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
 
16
  use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory;
17
  use Psr\Log\LoggerInterface;
18
 
@@ -44,6 +46,13 @@ class WebhookEndpoint {
44
  */
45
  private $webhook_factory;
46
 
 
 
 
 
 
 
 
47
  /**
48
  * The logger.
49
  *
@@ -54,22 +63,25 @@ class WebhookEndpoint {
54
  /**
55
  * WebhookEndpoint constructor.
56
  *
57
- * @param string $host The host.
58
- * @param Bearer $bearer The bearer.
59
- * @param WebhookFactory $webhook_factory The webhook factory.
60
- * @param LoggerInterface $logger The logger.
 
61
  */
62
  public function __construct(
63
  string $host,
64
  Bearer $bearer,
65
  WebhookFactory $webhook_factory,
 
66
  LoggerInterface $logger
67
  ) {
68
 
69
- $this->host = $host;
70
- $this->bearer = $bearer;
71
- $this->webhook_factory = $webhook_factory;
72
- $this->logger = $logger;
 
73
  }
74
 
75
  /**
@@ -79,14 +91,14 @@ class WebhookEndpoint {
79
  *
80
  * @return Webhook
81
  * @throws RuntimeException If the request fails.
 
82
  */
83
  public function create( Webhook $hook ): Webhook {
84
- /**
85
- * An hook, which has an ID has already been created.
86
- */
87
  if ( $hook->id() ) {
88
  return $hook;
89
  }
 
90
  $bearer = $this->bearer->bearer();
91
  $url = trailingslashit( $this->host ) . 'v1/notifications/webhooks';
92
  $args = array(
@@ -100,42 +112,64 @@ class WebhookEndpoint {
100
  $response = $this->request( $url, $args );
101
 
102
  if ( is_wp_error( $response ) ) {
103
- $error = new RuntimeException(
104
  __( 'Not able to create a webhook.', 'woocommerce-paypal-payments' )
105
  );
106
- $this->logger->log(
107
- 'warning',
108
- $error->getMessage(),
109
- array(
110
- 'args' => $args,
111
- 'response' => $response,
112
- )
113
- );
114
- throw $error;
115
  }
116
 
117
  $json = json_decode( $response['body'] );
118
  $status_code = (int) wp_remote_retrieve_response_code( $response );
119
  if ( 201 !== $status_code ) {
120
- $error = new PayPalApiException(
121
  $json,
122
  $status_code
123
  );
124
- $this->logger->log(
125
- 'warning',
126
- $error->getMessage(),
127
- array(
128
- 'args' => $args,
129
- 'response' => $response,
130
- )
131
- );
132
- throw $error;
133
  }
134
 
135
  $hook = $this->webhook_factory->from_paypal_response( $json );
136
  return $hook;
137
  }
138
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
  /**
140
  * Deletes a webhook.
141
  *
@@ -160,22 +194,61 @@ class WebhookEndpoint {
160
  $response = $this->request( $url, $args );
161
 
162
  if ( is_wp_error( $response ) ) {
163
- $error = new RuntimeException(
164
  __( 'Not able to delete the webhook.', 'woocommerce-paypal-payments' )
165
  );
166
- $this->logger->log(
167
- 'warning',
168
- $error->getMessage(),
169
- array(
170
- 'args' => $args,
171
- 'response' => $response,
172
- )
173
- );
174
- throw $error;
175
  }
176
  return wp_remote_retrieve_response_code( $response ) === 204;
177
  }
178
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
179
  /**
180
  * Verifies if a webhook event is legitimate.
181
  *
11
 
12
  use WooCommerce\PayPalCommerce\ApiClient\Authentication\Bearer;
13
  use WooCommerce\PayPalCommerce\ApiClient\Entity\Webhook;
14
+ use WooCommerce\PayPalCommerce\ApiClient\Entity\WebhookEvent;
15
  use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
16
  use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
17
+ use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookEventFactory;
18
  use WooCommerce\PayPalCommerce\ApiClient\Factory\WebhookFactory;
19
  use Psr\Log\LoggerInterface;
20
 
46
  */
47
  private $webhook_factory;
48
 
49
+ /**
50
+ * The webhook event factory.
51
+ *
52
+ * @var WebhookEventFactory
53
+ */
54
+ private $webhook_event_factory;
55
+
56
  /**
57
  * The logger.
58
  *
63
  /**
64
  * WebhookEndpoint constructor.
65
  *
66
+ * @param string $host The host.
67
+ * @param Bearer $bearer The bearer.
68
+ * @param WebhookFactory $webhook_factory The webhook factory.
69
+ * @param WebhookEventFactory $webhook_event_factory The webhook event factory.
70
+ * @param LoggerInterface $logger The logger.
71
  */
72
  public function __construct(
73
  string $host,
74
  Bearer $bearer,
75
  WebhookFactory $webhook_factory,
76
+ WebhookEventFactory $webhook_event_factory,
77
  LoggerInterface $logger
78
  ) {
79
 
80
+ $this->host = $host;
81
+ $this->bearer = $bearer;
82
+ $this->webhook_factory = $webhook_factory;
83
+ $this->webhook_event_factory = $webhook_event_factory;
84
+ $this->logger = $logger;
85
  }
86
 
87
  /**
91
  *
92
  * @return Webhook
93
  * @throws RuntimeException If the request fails.
94
+ * @throws PayPalApiException If the request fails.
95
  */
96
  public function create( Webhook $hook ): Webhook {
97
+ // The hook was already created.
 
 
98
  if ( $hook->id() ) {
99
  return $hook;
100
  }
101
+
102
  $bearer = $this->bearer->bearer();
103
  $url = trailingslashit( $this->host ) . 'v1/notifications/webhooks';
104
  $args = array(
112
  $response = $this->request( $url, $args );
113
 
114
  if ( is_wp_error( $response ) ) {
115
+ throw new RuntimeException(
116
  __( 'Not able to create a webhook.', 'woocommerce-paypal-payments' )
117
  );
 
 
 
 
 
 
 
 
 
118
  }
119
 
120
  $json = json_decode( $response['body'] );
121
  $status_code = (int) wp_remote_retrieve_response_code( $response );
122
  if ( 201 !== $status_code ) {
123
+ throw new PayPalApiException(
124
  $json,
125
  $status_code
126
  );
 
 
 
 
 
 
 
 
 
127
  }
128
 
129
  $hook = $this->webhook_factory->from_paypal_response( $json );
130
  return $hook;
131
  }
132
 
133
+ /**
134
+ * Loads the webhooks list for the current auth token.
135
+ *
136
+ * @return Webhook[]
137
+ * @throws RuntimeException If the request fails.
138
+ * @throws PayPalApiException If the request fails.
139
+ */
140
+ public function list(): array {
141
+ $bearer = $this->bearer->bearer();
142
+ $url = trailingslashit( $this->host ) . 'v1/notifications/webhooks';
143
+ $args = array(
144
+ 'method' => 'GET',
145
+ 'headers' => array(
146
+ 'Authorization' => 'Bearer ' . $bearer->token(),
147
+ 'Content-Type' => 'application/json',
148
+ ),
149
+ );
150
+ $response = $this->request( $url, $args );
151
+
152
+ if ( is_wp_error( $response ) ) {
153
+ throw new RuntimeException(
154
+ __( 'Not able to load webhooks list.', 'woocommerce-paypal-payments' )
155
+ );
156
+ }
157
+
158
+ $json = json_decode( $response['body'] );
159
+ $status_code = (int) wp_remote_retrieve_response_code( $response );
160
+ if ( 200 !== $status_code ) {
161
+ throw new PayPalApiException(
162
+ $json,
163
+ $status_code
164
+ );
165
+ }
166
+
167
+ return array_map(
168
+ array( $this->webhook_factory, 'from_paypal_response' ),
169
+ $json->webhooks
170
+ );
171
+ }
172
+
173
  /**
174
  * Deletes a webhook.
175
  *
194
  $response = $this->request( $url, $args );
195
 
196
  if ( is_wp_error( $response ) ) {
197
+ throw new RuntimeException(
198
  __( 'Not able to delete the webhook.', 'woocommerce-paypal-payments' )
199
  );
 
 
 
 
 
 
 
 
 
200
  }
201
  return wp_remote_retrieve_response_code( $response ) === 204;
202
  }
203
 
204
+ /**
205
+ * Request a simulated webhook to be sent.
206
+ *
207
+ * @param Webhook $hook The webhook subscription to use.
208
+ * @param string $event_type The event type, such as CHECKOUT.ORDER.APPROVED.
209
+ * @param string|null $resource_version The event resource version, such as 2.0.
210
+ *
211
+ * @return WebhookEvent
212
+ * @throws RuntimeException If the request fails.
213
+ * @throws PayPalApiException If the request fails.
214
+ */
215
+ public function simulate( Webhook $hook, string $event_type, ?string $resource_version ): WebhookEvent {
216
+ $bearer = $this->bearer->bearer();
217
+ $url = trailingslashit( $this->host ) . 'v1/notifications/simulate-event';
218
+ $data = array(
219
+ 'webhook_id' => $hook->id(),
220
+ 'event_type' => $event_type,
221
+ );
222
+ if ( $resource_version ) {
223
+ $data['resource_version'] = $resource_version;
224
+ }
225
+ $args = array(
226
+ 'method' => 'POST',
227
+ 'headers' => array(
228
+ 'Authorization' => 'Bearer ' . $bearer->token(),
229
+ 'Content-Type' => 'application/json',
230
+ ),
231
+ 'body' => wp_json_encode( $data ),
232
+ );
233
+ $response = $this->request( $url, $args );
234
+
235
+ if ( is_wp_error( $response ) ) {
236
+ throw new RuntimeException(
237
+ __( 'Not able to simulate webhook.', 'woocommerce-paypal-payments' )
238
+ );
239
+ }
240
+ $json = json_decode( $response['body'] );
241
+ $status_code = (int) wp_remote_retrieve_response_code( $response );
242
+ if ( 202 !== $status_code ) {
243
+ throw new PayPalApiException(
244
+ $json,
245
+ $status_code
246
+ );
247
+ }
248
+
249
+ return $this->webhook_event_factory->from_paypal_response( $json );
250
+ }
251
+
252
  /**
253
  * Verifies if a webhook event is legitimate.
254
  *
modules/ppcp-api-client/src/Entity/class-cardauthenticationresult.php CHANGED
@@ -112,7 +112,7 @@ class CardAuthenticationResult {
112
  $data['liability_shift'] = $this->liability_shift();
113
  $data['three_d_secure'] = array(
114
  'enrollment_status' => $this->enrollment_status(),
115
- 'authentication_result' => $this->authentication_result(),
116
  );
117
  return $data;
118
  }
112
  $data['liability_shift'] = $this->liability_shift();
113
  $data['three_d_secure'] = array(
114
  'enrollment_status' => $this->enrollment_status(),
115
+ 'authentication_status' => $this->authentication_result(),
116
  );
117
  return $data;
118
  }
modules/ppcp-api-client/src/Entity/class-payee.php CHANGED
@@ -68,11 +68,11 @@ class Payee {
68
  * @return array
69
  */
70
  public function to_array(): array {
71
- $data = array(
72
- 'email_address' => $this->email(),
73
- );
74
  if ( $this->merchant_id ) {
75
  $data['merchant_id'] = $this->merchant_id();
 
 
76
  }
77
  return $data;
78
  }
68
  * @return array
69
  */
70
  public function to_array(): array {
71
+ $data = array();
 
 
72
  if ( $this->merchant_id ) {
73
  $data['merchant_id'] = $this->merchant_id();
74
+ } else {
75
+ $data['email_address'] = $this->email();
76
  }
77
  return $data;
78
  }
modules/ppcp-api-client/src/Entity/class-webhook.php CHANGED
@@ -9,6 +9,8 @@ declare(strict_types=1);
9
 
10
  namespace WooCommerce\PayPalCommerce\ApiClient\Entity;
11
 
 
 
12
  /**
13
  * Class Webhook
14
  */
@@ -71,13 +73,38 @@ class Webhook {
71
  /**
72
  * Returns the event types.
73
  *
74
- * @return array
75
  */
76
  public function event_types(): array {
77
 
78
  return $this->event_types;
79
  }
80
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
  /**
82
  * Returns the object as array.
83
  *
9
 
10
  namespace WooCommerce\PayPalCommerce\ApiClient\Entity;
11
 
12
+ use stdClass;
13
+
14
  /**
15
  * Class Webhook
16
  */
73
  /**
74
  * Returns the event types.
75
  *
76
+ * @return stdClass[]
77
  */
78
  public function event_types(): array {
79
 
80
  return $this->event_types;
81
  }
82
 
83
+ /**
84
+ * Returns the human-friendly names of the event types.
85
+ *
86
+ * @return string[]
87
+ */
88
+ public function humanfriendly_event_names(): array {
89
+
90
+ return array_map(
91
+ function ( $event ): string {
92
+ return Webhook::get_humanfriendly_event_name( $event->name );
93
+ },
94
+ $this->event_types
95
+ );
96
+ }
97
+
98
+ /**
99
+ * Converts event names to more human-friendly form.
100
+ *
101
+ * @param string $name The event name like 'CHECKOUT.ORDER.APPROVED'.
102
+ * @return string
103
+ */
104
+ public static function get_humanfriendly_event_name( string $name ): string {
105
+ return strtolower( str_replace( '.', ' ', $name ) );
106
+ }
107
+
108
  /**
109
  * Returns the object as array.
110
  *
modules/ppcp-api-client/src/Entity/class-webhookevent.php ADDED
@@ -0,0 +1,170 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The Webhook event notification object.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\ApiClient\Entity
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\ApiClient\Entity;
11
+
12
+ use DateTime;
13
+ use stdClass;
14
+
15
+ /**
16
+ * Class WebhookEvent
17
+ */
18
+ class WebhookEvent {
19
+
20
+ /**
21
+ * The ID of the event notification.
22
+ *
23
+ * @var string
24
+ */
25
+ private $id;
26
+
27
+ /**
28
+ * The date and time when the event notification was created.
29
+ *
30
+ * @var DateTime|null
31
+ */
32
+ private $create_time;
33
+
34
+ /**
35
+ * The name of the resource related to the webhook notification event, such as 'checkout-order'.
36
+ *
37
+ * @var string
38
+ */
39
+ private $resource_type;
40
+
41
+ /**
42
+ * The event version in the webhook notification, such as '1.0'.
43
+ *
44
+ * @var string
45
+ */
46
+ private $event_version;
47
+
48
+ /**
49
+ * The event that triggered the webhook event notification, such as 'CHECKOUT.ORDER.APPROVED'.
50
+ *
51
+ * @var string
52
+ */
53
+ private $event_type;
54
+
55
+ /**
56
+ * A summary description for the event notification.
57
+ *
58
+ * @var string
59
+ */
60
+ private $summary;
61
+
62
+ /**
63
+ * The resource version in the webhook notification, such as '1.0'.
64
+ *
65
+ * @var string
66
+ */
67
+ private $resource_version;
68
+
69
+ /**
70
+ * The resource that triggered the webhook event notification.
71
+ *
72
+ * @var stdClass
73
+ */
74
+ private $resource;
75
+
76
+ /**
77
+ * WebhookEvent constructor.
78
+ *
79
+ * @param string $id The ID of the event notification.
80
+ * @param DateTime|null $create_time The date and time when the event notification was created.
81
+ * @param string $resource_type The name of the resource related to the webhook notification event, such as 'checkout-order'.
82
+ * @param string $event_version The event version in the webhook notification, such as '1.0'.
83
+ * @param string $event_type The event that triggered the webhook event notification, such as 'CHECKOUT.ORDER.APPROVED'.
84
+ * @param string $summary A summary description for the event notification.
85
+ * @param string $resource_version The resource version in the webhook notification, such as '1.0'.
86
+ * @param stdClass $resource The resource that triggered the webhook event notification.
87
+ */
88
+ public function __construct( string $id, ?DateTime $create_time, string $resource_type, string $event_version, string $event_type, string $summary, string $resource_version, stdClass $resource ) {
89
+ $this->id = $id;
90
+ $this->create_time = $create_time;
91
+ $this->resource_type = $resource_type;
92
+ $this->event_version = $event_version;
93
+ $this->event_type = $event_type;
94
+ $this->summary = $summary;
95
+ $this->resource_version = $resource_version;
96
+ $this->resource = $resource;
97
+ }
98
+
99
+ /**
100
+ * The ID of the event notification.
101
+ *
102
+ * @return string
103
+ */
104
+ public function id(): string {
105
+ return $this->id;
106
+ }
107
+
108
+ /**
109
+ * The date and time when the event notification was created.
110
+ *
111
+ * @return DateTime|null
112
+ */
113
+ public function create_time(): ?DateTime {
114
+ return $this->create_time;
115
+ }
116
+
117
+ /**
118
+ * The name of the resource related to the webhook notification event, such as 'checkout-order'.
119
+ *
120
+ * @return string
121
+ */
122
+ public function resource_type(): string {
123
+ return $this->resource_type;
124
+ }
125
+
126
+ /**
127
+ * The event version in the webhook notification, such as '1.0'.
128
+ *
129
+ * @return string
130
+ */
131
+ public function event_version(): string {
132
+ return $this->event_version;
133
+ }
134
+
135
+ /**
136
+ * The event that triggered the webhook event notification, such as 'CHECKOUT.ORDER.APPROVED'.
137
+ *
138
+ * @return string
139
+ */
140
+ public function event_type(): string {
141
+ return $this->event_type;
142
+ }
143
+
144
+ /**
145
+ * A summary description for the event notification.
146
+ *
147
+ * @return string
148
+ */
149
+ public function summary(): string {
150
+ return $this->summary;
151
+ }
152
+
153
+ /**
154
+ * The resource version in the webhook notification, such as '1.0'.
155
+ *
156
+ * @return string
157
+ */
158
+ public function resource_version(): string {
159
+ return $this->resource_version;
160
+ }
161
+
162
+ /**
163
+ * The resource that triggered the webhook event notification.
164
+ *
165
+ * @return stdClass
166
+ */
167
+ public function resource(): stdClass {
168
+ return $this->resource;
169
+ }
170
+ }
modules/ppcp-api-client/src/Factory/class-payeefactory.php CHANGED
@@ -26,13 +26,8 @@ class PayeeFactory {
26
  * @throws RuntimeException When JSON object is malformed.
27
  */
28
  public function from_paypal_response( \stdClass $data ) {
29
- if ( ! isset( $data->email_address ) ) {
30
- throw new RuntimeException(
31
- __( 'No email for payee given.', 'woocommerce-paypal-payments' )
32
- );
33
- }
34
-
35
  $merchant_id = ( isset( $data->merchant_id ) ) ? $data->merchant_id : '';
36
- return new Payee( $data->email_address, $merchant_id );
37
  }
38
  }
26
  * @throws RuntimeException When JSON object is malformed.
27
  */
28
  public function from_paypal_response( \stdClass $data ) {
29
+ $email = ( isset( $data->email_address ) ) ? $data->email_address : '';
 
 
 
 
 
30
  $merchant_id = ( isset( $data->merchant_id ) ) ? $data->merchant_id : '';
31
+ return new Payee( $email, $merchant_id );
32
  }
33
  }
modules/ppcp-api-client/src/Factory/class-paymentsourcefactory.php CHANGED
@@ -37,8 +37,8 @@ class PaymentSourceFactory {
37
  (string) $data->card->authentication_result->liability_shift : '',
38
  isset( $data->card->authentication_result->three_d_secure->enrollment_status ) ?
39
  (string) $data->card->authentication_result->three_d_secure->enrollment_status : '',
40
- isset( $data->card->authentication_result->three_d_secure->authentication_result ) ?
41
- (string) $data->card->authentication_result->three_d_secure->authentication_result : ''
42
  );
43
  }
44
  $card = new PaymentSourceCard(
37
  (string) $data->card->authentication_result->liability_shift : '',
38
  isset( $data->card->authentication_result->three_d_secure->enrollment_status ) ?
39
  (string) $data->card->authentication_result->three_d_secure->enrollment_status : '',
40
+ isset( $data->card->authentication_result->three_d_secure->authentication_status ) ?
41
+ (string) $data->card->authentication_result->three_d_secure->authentication_status : ''
42
  );
43
  }
44
  $card = new PaymentSourceCard(
modules/ppcp-api-client/src/Factory/class-purchaseunitfactory.php CHANGED
@@ -159,6 +159,7 @@ class PurchaseUnitFactory {
159
  if (
160
  2 !== strlen( $shipping->address()->country_code() )
161
  || ( ! $shipping->address()->postal_code() )
 
162
  ) {
163
  $shipping = null;
164
  }
@@ -265,4 +266,18 @@ class PurchaseUnitFactory {
265
  }
266
  return false;
267
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
268
  }
159
  if (
160
  2 !== strlen( $shipping->address()->country_code() )
161
  || ( ! $shipping->address()->postal_code() )
162
+ || $this->country_without_postal_code( $shipping->address()->country_code() )
163
  ) {
164
  $shipping = null;
165
  }
266
  }
267
  return false;
268
  }
269
+
270
+ /**
271
+ * Check if country does not have postal code.
272
+ *
273
+ * @param string $country_code The country code.
274
+ * @return bool Whether country has postal code or not.
275
+ */
276
+ private function country_without_postal_code( string $country_code ): bool {
277
+ $countries = array( 'AE', 'AF', 'AG', 'AI', 'AL', 'AN', 'AO', 'AW', 'BB', 'BF', 'BH', 'BI', 'BJ', 'BM', 'BO', 'BS', 'BT', 'BW', 'BZ', 'CD', 'CF', 'CG', 'CI', 'CK', 'CL', 'CM', 'CO', 'CR', 'CV', 'DJ', 'DM', 'DO', 'EC', 'EG', 'ER', 'ET', 'FJ', 'FK', 'GA', 'GD', 'GH', 'GI', 'GM', 'GN', 'GQ', 'GT', 'GW', 'GY', 'HK', 'HN', 'HT', 'IE', 'IQ', 'IR', 'JM', 'JO', 'KE', 'KH', 'KI', 'KM', 'KN', 'KP', 'KW', 'KY', 'LA', 'LB', 'LC', 'LK', 'LR', 'LS', 'LY', 'ML', 'MM', 'MO', 'MR', 'MS', 'MT', 'MU', 'MW', 'MZ', 'NA', 'NE', 'NG', 'NI', 'NP', 'NR', 'NU', 'OM', 'PA', 'PE', 'PF', 'PY', 'QA', 'RW', 'SA', 'SB', 'SC', 'SD', 'SL', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SY', 'TC', 'TD', 'TG', 'TL', 'TO', 'TT', 'TV', 'TZ', 'UG', 'UY', 'VC', 'VE', 'VG', 'VN', 'VU', 'WS', 'XA', 'XB', 'XC', 'XE', 'XL', 'XM', 'XN', 'XS', 'YE', 'ZM', 'ZW' );
278
+ if ( in_array( $country_code, $countries, true ) ) {
279
+ return true;
280
+ }
281
+ return false;
282
+ }
283
  }
modules/ppcp-api-client/src/Factory/class-webhookeventfactory.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Creates WebhookEvent.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\ApiClient\Factory
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\ApiClient\Factory;
11
+
12
+ use DateTime;
13
+ use stdClass;
14
+ use WooCommerce\PayPalCommerce\ApiClient\Entity\WebhookEvent;
15
+ use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
16
+
17
+ /**
18
+ * Class WebhookEventFactory
19
+ */
20
+ class WebhookEventFactory {
21
+
22
+ /**
23
+ * Returns a webhook from a given data array.
24
+ *
25
+ * @param array $data The data array.
26
+ *
27
+ * @return WebhookEvent
28
+ */
29
+ public function from_array( array $data ): WebhookEvent {
30
+ return $this->from_paypal_response( (object) $data );
31
+ }
32
+
33
+ /**
34
+ * Returns a Webhook based of a PayPal JSON response.
35
+ *
36
+ * @param stdClass $data The JSON object.
37
+ *
38
+ * @return WebhookEvent
39
+ * @throws RuntimeException When JSON object is malformed.
40
+ */
41
+ public function from_paypal_response( stdClass $data ): WebhookEvent {
42
+ if ( ! isset( $data->id ) ) {
43
+ throw new RuntimeException(
44
+ __( 'ID for webhook event not found.', 'woocommerce-paypal-payments' )
45
+ );
46
+ }
47
+ if ( ! isset( $data->event_type ) ) {
48
+ throw new RuntimeException(
49
+ __( 'Event type for webhook event not found.', 'woocommerce-paypal-payments' )
50
+ );
51
+ }
52
+
53
+ $create_time = ( isset( $data->create_time ) ) ?
54
+ DateTime::createFromFormat( 'Y-m-d\TH:i:sO', $data->create_time )
55
+ : null;
56
+
57
+ // Sometimes the time may be in weird format 2018-12-19T22:20:32.000Z (at least in simulation),
58
+ // we do not care much about time, so just ignore on failure.
59
+ if ( false === $create_time ) {
60
+ $create_time = null;
61
+ }
62
+
63
+ return new WebhookEvent(
64
+ (string) $data->id,
65
+ $create_time,
66
+ (string) $data->resource_type ?? '',
67
+ (string) $data->event_version ?? '',
68
+ (string) $data->event_type,
69
+ (string) $data->summary ?? '',
70
+ (string) $data->resource_version ?? '',
71
+ (object) $data->resource ?? ( new stdClass() )
72
+ );
73
+ }
74
+ }
modules/ppcp-button/assets/css/hosted-fields.css CHANGED
@@ -1 +1 @@
1
- #payment ul.payment_methods li img.ppcp-card-icon{padding:0 0 3px 3px;max-height:25px;display:inline-block}.payments-sdk-contingency-handler{z-index:1000 !important}
1
+ #payment ul.payment_methods li img.ppcp-card-icon{padding:0 0 3px 3px;max-height:25px;display:inline-block}.payments-sdk-contingency-handler{z-index:1000 !important}.ppcp-credit-card-gateway-form-field-disabled{opacity:.5 !important}
modules/ppcp-button/assets/js/button.js CHANGED
@@ -1,2 +1 @@
1
- !function(e){var t={};function r(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,r),a.l=!0,a.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)r.d(n,a,function(t){return e[t]}.bind(null,a));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([,function(e,t,r){"use strict";r.r(t);var n=class{constructor(e){this.genericErrorText=e,this.wrapper=document.querySelector(".woocommerce-notices-wrapper"),this.messagesList=document.querySelector("ul.woocommerce-error")}genericError(){this.wrapper.classList.contains("ppcp-persist")||(this.clear(),this.message(this.genericErrorText))}appendPreparedErrorMessageElement(e){null===this.messagesList&&this.prepareMessagesList(),this.messagesList.replaceWith(e)}message(e,t=!1){if(0===e.length)throw new Error("A new message text must be a non-empty string.");null===this.messagesList&&this.prepareMessagesList(),t?this.wrapper.classList.add("ppcp-persist"):this.wrapper.classList.remove("ppcp-persist");let r=this.prepareMessagesListItem(e);this.messagesList.appendChild(r),jQuery.scroll_to_notices(jQuery(".woocommerce-notices-wrapper"))}prepareMessagesList(){null===this.messagesList&&(this.messagesList=document.createElement("ul"),this.messagesList.setAttribute("class","woocommerce-error"),this.messagesList.setAttribute("role","alert"),this.wrapper.appendChild(this.messagesList))}prepareMessagesListItem(e){const t=document.createElement("li");return t.innerHTML=e,t}sanitize(e){const t=document.createElement("textarea");return t.innerHTML=e,t.value.replace("Error: ","")}clear(){this.wrapper.classList.contains("woocommerce-error")&&(this.wrapper.classList.remove("woocommerce-error"),this.wrapper.innerText="")}};var a=(e,t)=>(r,n)=>fetch(e.config.ajax.approve_order.endpoint,{method:"POST",body:JSON.stringify({nonce:e.config.ajax.approve_order.nonce,order_id:r.orderID})}).then(e=>e.json()).then(r=>{if(!r.success)return t.genericError(),n.restart().catch(e=>{t.genericError()});location.href=e.config.redirect});const s=()=>{const e=PayPalCommerceGateway.payer;if(!e)return null;const t=document.querySelector("#billing_phone")||void 0!==e.phone?{phone_type:"HOME",phone_number:{national_number:document.querySelector("#billing_phone")?document.querySelector("#billing_phone").value:e.phone.phone_number.national_number}}:null,r={email_address:document.querySelector("#billing_email")?document.querySelector("#billing_email").value:e.email_address,name:{surname:document.querySelector("#billing_last_name")?document.querySelector("#billing_last_name").value:e.name.surname,given_name:document.querySelector("#billing_first_name")?document.querySelector("#billing_first_name").value:e.name.given_name},address:{country_code:document.querySelector("#billing_country")?document.querySelector("#billing_country").value:e.address.country_code,address_line_1:document.querySelector("#billing_address_1")?document.querySelector("#billing_address_1").value:e.address.address_line_1,address_line_2:document.querySelector("#billing_address_2")?document.querySelector("#billing_address_2").value:e.address.address_line_2,admin_area_1:document.querySelector("#billing_state")?document.querySelector("#billing_state").value:e.address.admin_area_1,admin_area_2:document.querySelector("#billing_city")?document.querySelector("#billing_city").value:e.address.admin_area_2,postal_code:document.querySelector("#billing_postcode")?document.querySelector("#billing_postcode").value:e.address.postal_code}};return t&&(r.phone=t),r};var o=class{constructor(e,t){this.config=e,this.errorHandler=t}configuration(){return{createOrder:(e,t)=>{const r=s(),n=void 0!==this.config.bn_codes[this.config.context]?this.config.bn_codes[this.config.context]:"";return fetch(this.config.ajax.create_order.endpoint,{method:"POST",body:JSON.stringify({nonce:this.config.ajax.create_order.nonce,purchase_units:[],bn_code:n,payer:r,context:this.config.context})}).then((function(e){return e.json()})).then((function(e){if(!e.success)throw console.error(e),Error(e.data.message);return e.data.id}))},onApprove:a(this,this.errorHandler),onError:e=>{this.errorHandler.genericError()}}}};var i=class{constructor(e,t){this.gateway=e,this.renderer=t,this.actionHandler=null}init(){this.actionHandler=new o(PayPalCommerceGateway,new n(this.gateway.labels.error.generic)),this.render(),jQuery(document.body).on("wc_fragments_loaded wc_fragments_refreshed",()=>{this.render()})}shouldRender(){return null!==document.querySelector(this.gateway.button.mini_cart_wrapper)||null!==document.querySelector(this.gateway.hosted_fields.mini_cart_wrapper)}render(){this.shouldRender()&&this.renderer.render(this.gateway.button.mini_cart_wrapper,this.gateway.hosted_fields.mini_cart_wrapper,this.actionHandler.configuration())}};var c=class{constructor(e,t,r){this.id=e,this.quantity=t,this.variations=r}data(){return{id:this.id,quantity:this.quantity,variations:this.variations}}};var d=class{constructor(e,t){this.endpoint=e,this.nonce=t}update(e,t){return new Promise((r,n)=>{fetch(this.endpoint,{method:"POST",body:JSON.stringify({nonce:this.nonce,products:t})}).then(e=>e.json()).then(t=>{if(!t.success)return void n(t.data);const a=e(t.data);r(a)})})}};var l=class{constructor(e,t,r){this.element=e,this.showCallback=t,this.hideCallback=r,this.observer=null}init(){const e=()=>{this.element.classList.contains("disabled")?this.hideCallback():this.showCallback()};this.observer=new MutationObserver(e),this.observer.observe(this.element,{attributes:!0}),e()}disconnect(){this.observer.disconnect()}};var u=class{constructor(e,t,r,n,a,s){this.config=e,this.updateCart=t,this.showButtonCallback=r,this.hideButtonCallback=n,this.formElement=a,this.errorHandler=s}configuration(){if(this.hasVariations()){new l(this.formElement.querySelector(".single_add_to_cart_button"),this.showButtonCallback,this.hideButtonCallback).init()}return{createOrder:this.createOrder(),onApprove:a(this,this.errorHandler),onError:e=>{this.errorHandler.genericError()}}}createOrder(){var e=null;e=this.isGroupedProduct()?()=>{const e=[];return this.formElement.querySelectorAll('input[type="number"]').forEach(t=>{if(!t.value)return;const r=t.getAttribute("name").match(/quantity\[([\d]*)\]/);if(2!==r.length)return;const n=parseInt(r[1]),a=parseInt(t.value);e.push(new c(n,a,null))}),e}:()=>{const e=document.querySelector('[name="add-to-cart"]').value,t=document.querySelector('[name="quantity"]').value,r=this.variations();return[new c(e,t,r)]};return(t,r)=>{this.errorHandler.clear();return this.updateCart.update(e=>{const t=s(),r=void 0!==this.config.bn_codes[this.config.context]?this.config.bn_codes[this.config.context]:"";return fetch(this.config.ajax.create_order.endpoint,{method:"POST",body:JSON.stringify({nonce:this.config.ajax.create_order.nonce,purchase_units:e,payer:t,bn_code:r,context:this.config.context})}).then((function(e){return e.json()})).then((function(e){if(!e.success)throw console.error(e),Error(e.data.message);return e.data.id}))},e())}}variations(){if(!this.hasVariations())return null;return[...this.formElement.querySelectorAll("[name^='attribute_']")].map(e=>({value:e.value,name:e.name}))}hasVariations(){return this.formElement.classList.contains("variations_form")}isGroupedProduct(){return this.formElement.classList.contains("grouped_form")}};var h=class{constructor(e,t,r){this.gateway=e,this.renderer=t,this.messages=r}init(){this.shouldRender()?this.render():this.renderer.hideButtons(this.gateway.hosted_fields.wrapper)}shouldRender(){return null!==document.querySelector("form.cart")}render(){const e=new u(this.gateway,new d(this.gateway.ajax.change_cart.endpoint,this.gateway.ajax.change_cart.nonce),()=>{this.renderer.showButtons(this.gateway.button.wrapper),this.renderer.showButtons(this.gateway.hosted_fields.wrapper);let e="0";document.querySelector("form.cart ins .woocommerce-Price-amount")?e=document.querySelector("form.cart ins .woocommerce-Price-amount").innerText:document.querySelector("form.cart .woocommerce-Price-amount")&&(e=document.querySelector("form.cart .woocommerce-Price-amount").innerText);const t=parseInt(e.replace(/([^\d,\.\s]*)/g,""));this.messages.renderWithAmount(t)},()=>{this.renderer.hideButtons(this.gateway.button.wrapper),this.renderer.hideButtons(this.gateway.hosted_fields.wrapper)},document.querySelector("form.cart"),new n(this.gateway.labels.error.generic));this.renderer.render(this.gateway.button.wrapper,this.gateway.hosted_fields.wrapper,e.configuration())}};var p=class{constructor(e,t){this.gateway=e,this.renderer=t}init(){this.shouldRender()&&(this.render(),jQuery(document.body).on("updated_cart_totals updated_checkout",()=>{this.render()}))}shouldRender(){return null!==document.querySelector(this.gateway.button.wrapper)||null!==document.querySelector(this.gateway.hosted_fields.wrapper)}render(){const e=new o(PayPalCommerceGateway,new n(this.gateway.labels.error.generic));this.renderer.render(this.gateway.button.wrapper,this.gateway.hosted_fields.wrapper,e.configuration())}};var m=(e,t,r)=>(n,a)=>(r.block(),fetch(e.config.ajax.approve_order.endpoint,{method:"POST",body:JSON.stringify({nonce:e.config.ajax.approve_order.nonce,order_id:n.orderID})}).then(e=>e.json()).then(e=>{if(r.unblock(),!e.success){if(100===e.data.code?t.message(e.data.message):t.genericError(),void 0!==a&&void 0!==a.restart)return a.restart();throw new Error(e.data.message)}document.querySelector("#place_order").click()}));var y=class{constructor(e,t,r){this.config=e,this.errorHandler=t,this.spinner=r}configuration(){const e=this.spinner;return{createOrder:(t,r)=>{const n=s(),a=void 0!==this.config.bn_codes[this.config.context]?this.config.bn_codes[this.config.context]:"",o=this.errorHandler,i="checkout"===this.config.context?"form.checkout":"form#order_review",c=jQuery(i).serialize(),d=!!jQuery("#createaccount").is(":checked");return fetch(this.config.ajax.create_order.endpoint,{method:"POST",body:JSON.stringify({nonce:this.config.ajax.create_order.nonce,payer:n,bn_code:a,context:this.config.context,order_id:this.config.order_id,form:c,createaccount:d})}).then((function(e){return e.json()})).then((function(t){if(!t.success){if(e.unblock(),void 0!==t.messages){const e=new DOMParser;o.appendPreparedErrorMessageElement(e.parseFromString(t.messages,"text/html").querySelector("ul"))}else o.message(t.data.message,!0);return}const r=document.createElement("input");return r.setAttribute("type","hidden"),r.setAttribute("name","ppcp-resume-order"),r.setAttribute("value",t.data.purchase_units[0].custom_id),document.querySelector(i).append(r),t.data.id}))},onApprove:m(this,this.errorHandler,this.spinner),onCancel:()=>{e.unblock()},onError:()=>{this.errorHandler.genericError(),e.unblock()}}}};var g=class{constructor(e,t,r,n){this.gateway=e,this.renderer=t,this.messages=r,this.spinner=n}init(){this.render(),jQuery(document.body).on("updated_checkout",()=>{this.render()}),jQuery(document.body).on("updated_checkout payment_method_selected",()=>{this.switchBetweenPayPalandOrderButton(),this.displayPlaceOrderButtonForSavedCreditCards()}),jQuery("#saved-credit-card").on("change",()=>{this.displayPlaceOrderButtonForSavedCreditCards()}),this.switchBetweenPayPalandOrderButton(),this.displayPlaceOrderButtonForSavedCreditCards()}shouldRender(){return!document.querySelector(this.gateway.button.cancel_wrapper)&&(null!==document.querySelector(this.gateway.button.wrapper)||null!==document.querySelector(this.gateway.hosted_fields.wrapper))}render(){if(!this.shouldRender())return;document.querySelector(this.gateway.hosted_fields.wrapper+">div")&&document.querySelector(this.gateway.hosted_fields.wrapper+">div").setAttribute("style","");const e=new y(PayPalCommerceGateway,new n(this.gateway.labels.error.generic),this.spinner);this.renderer.render(this.gateway.button.wrapper,this.gateway.hosted_fields.wrapper,e.configuration())}switchBetweenPayPalandOrderButton(){jQuery("#saved-credit-card").val(jQuery("#saved-credit-card option:first").val());const e=jQuery('input[name="payment_method"]:checked').val();"ppcp-gateway"!==e&&"ppcp-credit-card-gateway"!==e?(this.renderer.hideButtons(this.gateway.button.wrapper),this.renderer.hideButtons(this.gateway.messages.wrapper),this.renderer.hideButtons(this.gateway.hosted_fields.wrapper),jQuery("#place_order").show()):(jQuery("#place_order").hide(),"ppcp-gateway"===e&&(this.renderer.showButtons(this.gateway.button.wrapper),this.renderer.showButtons(this.gateway.messages.wrapper),this.messages.render(),this.renderer.hideButtons(this.gateway.hosted_fields.wrapper)),"ppcp-credit-card-gateway"===e&&(this.renderer.hideButtons(this.gateway.button.wrapper),this.renderer.hideButtons(this.gateway.messages.wrapper),this.renderer.showButtons(this.gateway.hosted_fields.wrapper)))}displayPlaceOrderButtonForSavedCreditCards(){"ppcp-credit-card-gateway"===jQuery('input[name="payment_method"]:checked').val()&&(jQuery("#saved-credit-card").length&&""!==jQuery("#saved-credit-card").val()?(this.renderer.hideButtons(this.gateway.button.wrapper),this.renderer.hideButtons(this.gateway.messages.wrapper),this.renderer.hideButtons(this.gateway.hosted_fields.wrapper),jQuery("#place_order").show()):(jQuery("#place_order").hide(),this.renderer.hideButtons(this.gateway.button.wrapper),this.renderer.hideButtons(this.gateway.messages.wrapper),this.renderer.showButtons(this.gateway.hosted_fields.wrapper)))}};var w=class{constructor(e,t,r,n){this.gateway=e,this.renderer=t,this.messages=r,this.spinner=n}init(){this.render(),jQuery(document.body).on("updated_checkout",()=>{this.render()}),jQuery(document.body).on("updated_checkout payment_method_selected",()=>{this.switchBetweenPayPalandOrderButton()}),this.switchBetweenPayPalandOrderButton()}shouldRender(){return!document.querySelector(this.gateway.button.cancel_wrapper)&&(null!==document.querySelector(this.gateway.button.wrapper)||null!==document.querySelector(this.gateway.hosted_fields.wrapper))}render(){if(!this.shouldRender())return;document.querySelector(this.gateway.hosted_fields.wrapper+">div")&&document.querySelector(this.gateway.hosted_fields.wrapper+">div").setAttribute("style","");const e=new y(PayPalCommerceGateway,new n(this.gateway.labels.error.generic),this.spinner);this.renderer.render(this.gateway.button.wrapper,this.gateway.hosted_fields.wrapper,e.configuration())}switchBetweenPayPalandOrderButton(){if(new URLSearchParams(window.location.search).has("change_payment_method"))return;const e=jQuery('input[name="payment_method"]:checked').val();"ppcp-gateway"!==e&&"ppcp-credit-card-gateway"!==e?(this.renderer.hideButtons(this.gateway.button.wrapper),this.renderer.hideButtons(this.gateway.messages.wrapper),this.renderer.hideButtons(this.gateway.hosted_fields.wrapper),jQuery("#place_order").show()):(jQuery("#place_order").hide(),"ppcp-gateway"===e&&(this.renderer.showButtons(this.gateway.button.wrapper),this.renderer.showButtons(this.gateway.messages.wrapper),this.messages.render(),this.renderer.hideButtons(this.gateway.hosted_fields.wrapper)),"ppcp-credit-card-gateway"===e&&(this.renderer.hideButtons(this.gateway.button.wrapper),this.renderer.hideButtons(this.gateway.messages.wrapper),this.renderer.showButtons(this.gateway.hosted_fields.wrapper)))}};var f=class{constructor(e,t){this.defaultConfig=t,this.creditCardRenderer=e}render(e,t,r){this.renderButtons(e,r),this.creditCardRenderer.render(t,r)}renderButtons(e,t){if(!document.querySelector(e)||this.isAlreadyRendered(e)||void 0===paypal.Buttons)return;const r=e===this.defaultConfig.button.wrapper?this.defaultConfig.button.style:this.defaultConfig.button.mini_cart_style;paypal.Buttons({style:r,...t}).render(e)}isAlreadyRendered(e){return document.querySelector(e).hasChildNodes()}hideButtons(e){const t=document.querySelector(e);return!!t&&(t.style.display="none",!0)}showButtons(e){const t=document.querySelector(e);return!!t&&(t.style.display="block",!0)}};var _=e=>{const t=window.getComputedStyle(e),r=document.createElement("span");return r.setAttribute("id",e.id),Object.values(t).forEach(e=>{t[e]&&isNaN(e)&&r.style.setProperty(e,""+t[e])}),r};var b=class{constructor(e,t,r){this.defaultConfig=e,this.errorHandler=t,this.spinner=r,this.cardValid=!1,this.formValid=!1}render(e,t){if("checkout"!==this.defaultConfig.context&&"pay-now"!==this.defaultConfig.context||null===e||null===document.querySelector(e))return;if(void 0===paypal.HostedFields||!paypal.HostedFields.isEligible()){const t=document.querySelector(e);return void t.parentNode.removeChild(t)}const r=document.querySelector(".payment_box.payment_method_ppcp-credit-card-gateway"),n=r.style.display;r.style.display="block";const a=document.querySelector("#ppcp-hide-dcc");a&&a.parentNode.removeChild(a);const s=document.querySelector("#ppcp-credit-card-gateway-card-number"),o=window.getComputedStyle(s);let i={};Object.values(o).forEach(e=>{o[e]&&(i[e]=""+o[e])});const c=_(s);s.parentNode.replaceChild(c,s);const d=document.querySelector("#ppcp-credit-card-gateway-card-expiry"),l=_(d);d.parentNode.replaceChild(l,d);const u=document.querySelector("#ppcp-credit-card-gateway-card-cvc"),h=_(u);u.parentNode.replaceChild(h,u),r.style.display=n;const p=".payment_box payment_method_ppcp-credit-card-gateway";this.defaultConfig.enforce_vault&&document.querySelector(p+" .ppcp-credit-card-vault")&&(document.querySelector(p+" .ppcp-credit-card-vault").checked=!0,document.querySelector(p+" .ppcp-credit-card-vault").setAttribute("disabled",!0)),paypal.HostedFields.render({createOrder:t.createOrder,styles:{input:i},fields:{number:{selector:"#ppcp-credit-card-gateway-card-number",placeholder:this.defaultConfig.hosted_fields.labels.credit_card_number},cvv:{selector:"#ppcp-credit-card-gateway-card-cvc",placeholder:this.defaultConfig.hosted_fields.labels.cvv},expirationDate:{selector:"#ppcp-credit-card-gateway-card-expiry",placeholder:this.defaultConfig.hosted_fields.labels.mm_yy}}}).then(r=>{const n=e=>{if(this.spinner.block(),e&&e.preventDefault(),this.errorHandler.clear(),this.formValid&&this.cardValid){const e=!!this.defaultConfig.save_card,n=document.getElementById("ppcp-credit-card-vault")?document.getElementById("ppcp-credit-card-vault").checked:e;r.submit({contingencies:["SCA_WHEN_REQUIRED"],vault:n}).then(e=>(e.orderID=e.orderId,this.spinner.unblock(),t.onApprove(e))).catch(()=>{this.errorHandler.genericError(),this.spinner.unblock()})}else{this.spinner.unblock();const e=this.cardValid?this.defaultConfig.hosted_fields.labels.fields_not_valid:this.defaultConfig.hosted_fields.labels.card_not_supported;this.errorHandler.message(e)}};r.on("inputSubmitRequest",(function(){n(null)})),r.on("cardTypeChange",e=>{if(!e.cards.length)return void(this.cardValid=!1);const t=this.defaultConfig.hosted_fields.valid_cards;this.cardValid=-1!==t.indexOf(e.cards[0].type)}),r.on("validityChange",e=>{const t=Object.keys(e.fields).every((function(t){return e.fields[t].isValid}));this.formValid=t}),document.querySelector(e+" button").addEventListener("click",n)}),document.querySelector("#payment_method_ppcp-credit-card-gateway").addEventListener("click",()=>{document.querySelector("label[for=ppcp-credit-card-gateway-card-number]").click()})}};const v=(e,t)=>{if(!e)return!1;if(e.user!==t)return!1;return!((new Date).getTime()>=1e3*e.expiration)};var S=(e,t)=>{fetch(t.endpoint,{method:"POST",body:JSON.stringify({nonce:t.nonce})}).then(e=>e.json()).then(r=>{var n;v(r,t.user)&&(n=r,sessionStorage.setItem("ppcp-data-client-id",JSON.stringify(n)),e.setAttribute("data-client-token",r.token),document.body.append(e))})};var P=class{constructor(e){this.config=e}render(){this.shouldRender()&&paypal.Messages({amount:this.config.amount,placement:this.config.placement,style:this.config.style}).render(this.config.wrapper)}renderWithAmount(e){if(!this.shouldRender())return;const t=document.createElement("div");t.setAttribute("id",this.config.wrapper.replace("#",""));const r=document.querySelector(this.config.wrapper).nextSibling;document.querySelector(this.config.wrapper).parentElement.removeChild(document.querySelector(this.config.wrapper)),r.parentElement.insertBefore(t,r),paypal.Messages({amount:e,placement:this.config.placement,style:this.config.style}).render(this.config.wrapper)}shouldRender(){return void 0!==paypal.Messages&&void 0!==this.config.wrapper&&!!document.querySelector(this.config.wrapper)}};var q=class{constructor(){this.target="form.woocommerce-checkout"}setTarget(e){this.target=e}block(){jQuery(this.target).block({message:null,overlayCSS:{background:"#fff",opacity:.6}})}unblock(){jQuery(this.target).unblock()}};document.addEventListener("DOMContentLoaded",()=>{const e=document.createElement("script");e.addEventListener("load",e=>{(()=>{const e=new n(PayPalCommerceGateway.labels.error.generic),t=new q,r=new b(PayPalCommerceGateway,e,t),a=new f(r,PayPalCommerceGateway),s=new P(PayPalCommerceGateway.messages),o=PayPalCommerceGateway.context;if(("mini-cart"===o||"product"===o)&&"1"===PayPalCommerceGateway.mini_cart_buttons_enabled){new i(PayPalCommerceGateway,a).init()}if("product"===o&&"1"===PayPalCommerceGateway.single_product_buttons_enabled){new h(PayPalCommerceGateway,a,s).init()}if("cart"===o){new p(PayPalCommerceGateway,a).init()}if("checkout"===o){new g(PayPalCommerceGateway,a,s,t).init()}if("pay-now"===o){new w(PayPalCommerceGateway,a,s,t).init()}"checkout"!==o&&s.render()})()}),e.setAttribute("src",PayPalCommerceGateway.button.url),Object.entries(PayPalCommerceGateway.script_attributes).forEach(t=>{e.setAttribute(t[0],t[1])}),PayPalCommerceGateway.data_client_id.set_attribute?S(e,PayPalCommerceGateway.data_client_id):document.body.append(e)})}]);
2
- //# sourceMappingURL=button.js.map
1
+ (()=>{"use strict";var __webpack_modules__={94:()=>{eval("\n;// CONCATENATED MODULE: ./resources/js/modules/ErrorHandler.js\nclass ErrorHandler {\n constructor(genericErrorText) {\n this.genericErrorText = genericErrorText;\n this.wrapper = document.querySelector('.woocommerce-notices-wrapper');\n this.messagesList = document.querySelector('ul.woocommerce-error');\n }\n\n genericError() {\n if (this.wrapper.classList.contains('ppcp-persist')) {\n return;\n }\n\n this.clear();\n this.message(this.genericErrorText);\n }\n\n appendPreparedErrorMessageElement(errorMessageElement) {\n if (this.messagesList === null) {\n this.prepareMessagesList();\n }\n\n this.messagesList.replaceWith(errorMessageElement);\n }\n\n message(text, persist = false) {\n if (!typeof String || text.length === 0) {\n throw new Error('A new message text must be a non-empty string.');\n }\n\n if (this.messagesList === null) {\n this.prepareMessagesList();\n }\n\n if (persist) {\n this.wrapper.classList.add('ppcp-persist');\n } else {\n this.wrapper.classList.remove('ppcp-persist');\n }\n\n let messageNode = this.prepareMessagesListItem(text);\n this.messagesList.appendChild(messageNode);\n jQuery.scroll_to_notices(jQuery('.woocommerce-notices-wrapper'));\n }\n\n prepareMessagesList() {\n if (this.messagesList === null) {\n this.messagesList = document.createElement('ul');\n this.messagesList.setAttribute('class', 'woocommerce-error');\n this.messagesList.setAttribute('role', 'alert');\n this.wrapper.appendChild(this.messagesList);\n }\n }\n\n prepareMessagesListItem(message) {\n const li = document.createElement('li');\n li.innerHTML = message;\n return li;\n }\n\n sanitize(text) {\n const textarea = document.createElement('textarea');\n textarea.innerHTML = text;\n return textarea.value.replace('Error: ', '');\n }\n\n clear() {\n if (!this.wrapper.classList.contains('woocommerce-error')) {\n return;\n }\n\n this.wrapper.classList.remove('woocommerce-error');\n this.wrapper.innerText = '';\n }\n\n}\n\n/* harmony default export */ const modules_ErrorHandler = (ErrorHandler);\n;// CONCATENATED MODULE: ./resources/js/modules/OnApproveHandler/onApproveForContinue.js\nconst onApprove = (context, errorHandler) => {\n return (data, actions) => {\n return fetch(context.config.ajax.approve_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: context.config.ajax.approve_order.nonce,\n order_id: data.orderID\n })\n }).then(res => {\n return res.json();\n }).then(data => {\n if (!data.success) {\n errorHandler.genericError();\n return actions.restart().catch(err => {\n errorHandler.genericError();\n });\n ;\n }\n\n location.href = context.config.redirect;\n });\n };\n};\n\n/* harmony default export */ const onApproveForContinue = (onApprove);\n;// CONCATENATED MODULE: ./resources/js/modules/Helper/PayerData.js\nconst payerData = () => {\n const payer = PayPalCommerceGateway.payer;\n\n if (!payer) {\n return null;\n }\n\n const phone = document.querySelector('#billing_phone') || typeof payer.phone !== 'undefined' ? {\n phone_type: \"HOME\",\n phone_number: {\n national_number: document.querySelector('#billing_phone') ? document.querySelector('#billing_phone').value : payer.phone.phone_number.national_number\n }\n } : null;\n const payerData = {\n email_address: document.querySelector('#billing_email') ? document.querySelector('#billing_email').value : payer.email_address,\n name: {\n surname: document.querySelector('#billing_last_name') ? document.querySelector('#billing_last_name').value : payer.name.surname,\n given_name: document.querySelector('#billing_first_name') ? document.querySelector('#billing_first_name').value : payer.name.given_name\n },\n address: {\n country_code: document.querySelector('#billing_country') ? document.querySelector('#billing_country').value : payer.address.country_code,\n address_line_1: document.querySelector('#billing_address_1') ? document.querySelector('#billing_address_1').value : payer.address.address_line_1,\n address_line_2: document.querySelector('#billing_address_2') ? document.querySelector('#billing_address_2').value : payer.address.address_line_2,\n admin_area_1: document.querySelector('#billing_state') ? document.querySelector('#billing_state').value : payer.address.admin_area_1,\n admin_area_2: document.querySelector('#billing_city') ? document.querySelector('#billing_city').value : payer.address.admin_area_2,\n postal_code: document.querySelector('#billing_postcode') ? document.querySelector('#billing_postcode').value : payer.address.postal_code\n }\n };\n\n if (phone) {\n payerData.phone = phone;\n }\n\n return payerData;\n};\n;// CONCATENATED MODULE: ./resources/js/modules/ActionHandler/CartActionHandler.js\n\n\n\nclass CartActionHandler {\n constructor(config, errorHandler) {\n this.config = config;\n this.errorHandler = errorHandler;\n }\n\n configuration() {\n const createOrder = (data, actions) => {\n const payer = payerData();\n const bnCode = typeof this.config.bn_codes[this.config.context] !== 'undefined' ? this.config.bn_codes[this.config.context] : '';\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n purchase_units: [],\n bn_code: bnCode,\n payer,\n context: this.config.context\n })\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n if (!data.success) {\n console.error(data);\n throw Error(data.data.message);\n }\n\n return data.data.id;\n });\n };\n\n return {\n createOrder,\n onApprove: onApproveForContinue(this, this.errorHandler),\n onError: error => {\n this.errorHandler.genericError();\n }\n };\n }\n\n}\n\n/* harmony default export */ const ActionHandler_CartActionHandler = (CartActionHandler);\n;// CONCATENATED MODULE: ./resources/js/modules/ContextBootstrap/MiniCartBootstap.js\n\n\n\nclass MiniCartBootstap {\n constructor(gateway, renderer) {\n this.gateway = gateway;\n this.renderer = renderer;\n this.actionHandler = null;\n }\n\n init() {\n this.actionHandler = new ActionHandler_CartActionHandler(PayPalCommerceGateway, new modules_ErrorHandler(this.gateway.labels.error.generic));\n this.render();\n jQuery(document.body).on('wc_fragments_loaded wc_fragments_refreshed', () => {\n this.render();\n });\n }\n\n shouldRender() {\n return document.querySelector(this.gateway.button.mini_cart_wrapper) !== null || document.querySelector(this.gateway.hosted_fields.mini_cart_wrapper) !== null;\n }\n\n render() {\n if (!this.shouldRender()) {\n return;\n }\n\n this.renderer.render(this.gateway.button.mini_cart_wrapper, this.gateway.hosted_fields.mini_cart_wrapper, this.actionHandler.configuration());\n }\n\n}\n\n/* harmony default export */ const ContextBootstrap_MiniCartBootstap = (MiniCartBootstap);\n;// CONCATENATED MODULE: ./resources/js/modules/Helper/UpdateCart.js\n\n\nclass UpdateCart {\n constructor(endpoint, nonce) {\n this.endpoint = endpoint;\n this.nonce = nonce;\n }\n /**\n *\n * @param onResolve\n * @param {Product[]} products\n * @returns {Promise<unknown>}\n */\n\n\n update(onResolve, products) {\n return new Promise((resolve, reject) => {\n fetch(this.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.nonce,\n products\n })\n }).then(result => {\n return result.json();\n }).then(result => {\n if (!result.success) {\n reject(result.data);\n return;\n }\n\n const resolved = onResolve(result.data);\n resolve(resolved);\n });\n });\n }\n\n}\n\n/* harmony default export */ const Helper_UpdateCart = (UpdateCart);\n;// CONCATENATED MODULE: ./resources/js/modules/Helper/ButtonsToggleListener.js\n/**\n * When you can't add something to the cart, the PayPal buttons should not show.\n * Therefore we listen for changes on the add to cart button and show/hide the buttons accordingly.\n */\nclass ButtonsToggleListener {\n constructor(element, showCallback, hideCallback) {\n this.element = element;\n this.showCallback = showCallback;\n this.hideCallback = hideCallback;\n this.observer = null;\n }\n\n init() {\n const config = {\n attributes: true\n };\n\n const callback = () => {\n if (this.element.classList.contains('disabled')) {\n this.hideCallback();\n return;\n }\n\n this.showCallback();\n };\n\n this.observer = new MutationObserver(callback);\n this.observer.observe(this.element, config);\n callback();\n }\n\n disconnect() {\n this.observer.disconnect();\n }\n\n}\n\n/* harmony default export */ const Helper_ButtonsToggleListener = (ButtonsToggleListener);\n;// CONCATENATED MODULE: ./resources/js/modules/Entity/Product.js\nclass Product {\n constructor(id, quantity, variations) {\n this.id = id;\n this.quantity = quantity;\n this.variations = variations;\n }\n\n data() {\n return {\n id: this.id,\n quantity: this.quantity,\n variations: this.variations\n };\n }\n\n}\n\n/* harmony default export */ const Entity_Product = (Product);\n;// CONCATENATED MODULE: ./resources/js/modules/ActionHandler/SingleProductActionHandler.js\n\n\n\n\n\nclass SingleProductActionHandler {\n constructor(config, updateCart, showButtonCallback, hideButtonCallback, formElement, errorHandler) {\n this.config = config;\n this.updateCart = updateCart;\n this.showButtonCallback = showButtonCallback;\n this.hideButtonCallback = hideButtonCallback;\n this.formElement = formElement;\n this.errorHandler = errorHandler;\n }\n\n configuration() {\n if (this.hasVariations()) {\n const observer = new Helper_ButtonsToggleListener(this.formElement.querySelector('.single_add_to_cart_button'), this.showButtonCallback, this.hideButtonCallback);\n observer.init();\n }\n\n return {\n createOrder: this.createOrder(),\n onApprove: onApproveForContinue(this, this.errorHandler),\n onError: error => {\n this.errorHandler.genericError();\n }\n };\n }\n\n createOrder() {\n var getProducts = null;\n\n if (!this.isGroupedProduct()) {\n getProducts = () => {\n const id = document.querySelector('[name=\"add-to-cart\"]').value;\n const qty = document.querySelector('[name=\"quantity\"]').value;\n const variations = this.variations();\n return [new Entity_Product(id, qty, variations)];\n };\n } else {\n getProducts = () => {\n const products = [];\n this.formElement.querySelectorAll('input[type=\"number\"]').forEach(element => {\n if (!element.value) {\n return;\n }\n\n const elementName = element.getAttribute('name').match(/quantity\\[([\\d]*)\\]/);\n\n if (elementName.length !== 2) {\n return;\n }\n\n const id = parseInt(elementName[1]);\n const quantity = parseInt(element.value);\n products.push(new Entity_Product(id, quantity, null));\n });\n return products;\n };\n }\n\n const createOrder = (data, actions) => {\n this.errorHandler.clear();\n\n const onResolve = purchase_units => {\n const payer = payerData();\n const bnCode = typeof this.config.bn_codes[this.config.context] !== 'undefined' ? this.config.bn_codes[this.config.context] : '';\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n purchase_units,\n payer,\n bn_code: bnCode,\n context: this.config.context\n })\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n if (!data.success) {\n console.error(data);\n throw Error(data.data.message);\n }\n\n return data.data.id;\n });\n };\n\n const promise = this.updateCart.update(onResolve, getProducts());\n return promise;\n };\n\n return createOrder;\n }\n\n variations() {\n if (!this.hasVariations()) {\n return null;\n }\n\n const attributes = [...this.formElement.querySelectorAll(\"[name^='attribute_']\")].map(element => {\n return {\n value: element.value,\n name: element.name\n };\n });\n return attributes;\n }\n\n hasVariations() {\n return this.formElement.classList.contains('variations_form');\n }\n\n isGroupedProduct() {\n return this.formElement.classList.contains('grouped_form');\n }\n\n}\n\n/* harmony default export */ const ActionHandler_SingleProductActionHandler = (SingleProductActionHandler);\n;// CONCATENATED MODULE: ./resources/js/modules/ContextBootstrap/SingleProductBootstap.js\n\n\n\n\nclass SingleProductBootstap {\n constructor(gateway, renderer, messages) {\n this.gateway = gateway;\n this.renderer = renderer;\n this.messages = messages;\n }\n\n init() {\n if (!this.shouldRender()) {\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n return;\n }\n\n this.render();\n }\n\n shouldRender() {\n if (document.querySelector('form.cart') === null) {\n return false;\n }\n\n return true;\n }\n\n render() {\n const actionHandler = new ActionHandler_SingleProductActionHandler(this.gateway, new Helper_UpdateCart(this.gateway.ajax.change_cart.endpoint, this.gateway.ajax.change_cart.nonce), () => {\n this.renderer.showButtons(this.gateway.button.wrapper);\n this.renderer.showButtons(this.gateway.hosted_fields.wrapper);\n let priceText = \"0\";\n\n if (document.querySelector('form.cart ins .woocommerce-Price-amount')) {\n priceText = document.querySelector('form.cart ins .woocommerce-Price-amount').innerText;\n } else if (document.querySelector('form.cart .woocommerce-Price-amount')) {\n priceText = document.querySelector('form.cart .woocommerce-Price-amount').innerText;\n }\n\n const amount = parseInt(priceText.replace(/([^\\d,\\.\\s]*)/g, ''));\n this.messages.renderWithAmount(amount);\n }, () => {\n this.renderer.hideButtons(this.gateway.button.wrapper);\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n }, document.querySelector('form.cart'), new modules_ErrorHandler(this.gateway.labels.error.generic));\n this.renderer.render(this.gateway.button.wrapper, this.gateway.hosted_fields.wrapper, actionHandler.configuration());\n }\n\n}\n\n/* harmony default export */ const ContextBootstrap_SingleProductBootstap = (SingleProductBootstap);\n;// CONCATENATED MODULE: ./resources/js/modules/ContextBootstrap/CartBootstap.js\n\n\n\nclass CartBootstrap {\n constructor(gateway, renderer) {\n this.gateway = gateway;\n this.renderer = renderer;\n }\n\n init() {\n if (!this.shouldRender()) {\n return;\n }\n\n this.render();\n jQuery(document.body).on('updated_cart_totals updated_checkout', () => {\n this.render();\n });\n }\n\n shouldRender() {\n return document.querySelector(this.gateway.button.wrapper) !== null || document.querySelector(this.gateway.hosted_fields.wrapper) !== null;\n }\n\n render() {\n const actionHandler = new ActionHandler_CartActionHandler(PayPalCommerceGateway, new modules_ErrorHandler(this.gateway.labels.error.generic));\n this.renderer.render(this.gateway.button.wrapper, this.gateway.hosted_fields.wrapper, actionHandler.configuration());\n }\n\n}\n\n/* harmony default export */ const CartBootstap = (CartBootstrap);\n;// CONCATENATED MODULE: ./resources/js/modules/OnApproveHandler/onApproveForPayNow.js\nconst onApproveForPayNow_onApprove = (context, errorHandler, spinner) => {\n return (data, actions) => {\n spinner.block();\n return fetch(context.config.ajax.approve_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: context.config.ajax.approve_order.nonce,\n order_id: data.orderID\n })\n }).then(res => {\n return res.json();\n }).then(data => {\n spinner.unblock();\n\n if (!data.success) {\n if (data.data.code === 100) {\n errorHandler.message(data.data.message);\n } else {\n errorHandler.genericError();\n }\n\n if (typeof actions !== 'undefined' && typeof actions.restart !== 'undefined') {\n return actions.restart();\n }\n\n throw new Error(data.data.message);\n }\n\n document.querySelector('#place_order').click();\n });\n };\n};\n\n/* harmony default export */ const onApproveForPayNow = (onApproveForPayNow_onApprove);\n;// CONCATENATED MODULE: ./resources/js/modules/ActionHandler/CheckoutActionHandler.js\n\n\n\nclass CheckoutActionHandler {\n constructor(config, errorHandler, spinner) {\n this.config = config;\n this.errorHandler = errorHandler;\n this.spinner = spinner;\n }\n\n configuration() {\n const spinner = this.spinner;\n\n const createOrder = (data, actions) => {\n const payer = payerData();\n const bnCode = typeof this.config.bn_codes[this.config.context] !== 'undefined' ? this.config.bn_codes[this.config.context] : '';\n const errorHandler = this.errorHandler;\n const formSelector = this.config.context === 'checkout' ? 'form.checkout' : 'form#order_review';\n const formValues = jQuery(formSelector).serialize();\n const createaccount = jQuery('#createaccount').is(\":checked\") ? true : false;\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n payer,\n bn_code: bnCode,\n context: this.config.context,\n order_id: this.config.order_id,\n form: formValues,\n createaccount: createaccount\n })\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n if (!data.success) {\n spinner.unblock(); //handle both messages sent from Woocommerce (data.messages) and this plugin (data.data.message)\n\n if (typeof data.messages !== 'undefined') {\n const domParser = new DOMParser();\n errorHandler.appendPreparedErrorMessageElement(domParser.parseFromString(data.messages, 'text/html').querySelector('ul'));\n } else {\n errorHandler.message(data.data.message, true);\n }\n\n return;\n }\n\n const input = document.createElement('input');\n input.setAttribute('type', 'hidden');\n input.setAttribute('name', 'ppcp-resume-order');\n input.setAttribute('value', data.data.purchase_units[0].custom_id);\n document.querySelector(formSelector).append(input);\n return data.data.id;\n });\n };\n\n return {\n createOrder,\n onApprove: onApproveForPayNow(this, this.errorHandler, this.spinner),\n onCancel: () => {\n spinner.unblock();\n },\n onError: () => {\n this.errorHandler.genericError();\n spinner.unblock();\n }\n };\n }\n\n}\n\n/* harmony default export */ const ActionHandler_CheckoutActionHandler = (CheckoutActionHandler);\n;// CONCATENATED MODULE: ./resources/js/modules/ContextBootstrap/CheckoutBootstap.js\n\n\n\nclass CheckoutBootstap {\n constructor(gateway, renderer, messages, spinner) {\n this.gateway = gateway;\n this.renderer = renderer;\n this.messages = messages;\n this.spinner = spinner;\n }\n\n init() {\n this.render();\n jQuery(document.body).on('updated_checkout', () => {\n this.render();\n });\n jQuery(document.body).on('updated_checkout payment_method_selected', () => {\n this.switchBetweenPayPalandOrderButton();\n this.displayPlaceOrderButtonForSavedCreditCards();\n });\n jQuery(document).on('hosted_fields_loaded', () => {\n jQuery('#saved-credit-card').on('change', () => {\n this.displayPlaceOrderButtonForSavedCreditCards();\n });\n });\n this.switchBetweenPayPalandOrderButton();\n this.displayPlaceOrderButtonForSavedCreditCards();\n }\n\n shouldRender() {\n if (document.querySelector(this.gateway.button.cancel_wrapper)) {\n return false;\n }\n\n return document.querySelector(this.gateway.button.wrapper) !== null || document.querySelector(this.gateway.hosted_fields.wrapper) !== null;\n }\n\n render() {\n if (!this.shouldRender()) {\n return;\n }\n\n if (document.querySelector(this.gateway.hosted_fields.wrapper + '>div')) {\n document.querySelector(this.gateway.hosted_fields.wrapper + '>div').setAttribute('style', '');\n }\n\n const actionHandler = new ActionHandler_CheckoutActionHandler(PayPalCommerceGateway, new modules_ErrorHandler(this.gateway.labels.error.generic), this.spinner);\n this.renderer.render(this.gateway.button.wrapper, this.gateway.hosted_fields.wrapper, actionHandler.configuration());\n }\n\n switchBetweenPayPalandOrderButton() {\n jQuery('#saved-credit-card').val(jQuery('#saved-credit-card option:first').val());\n const currentPaymentMethod = jQuery('input[name=\"payment_method\"]:checked').val();\n\n if (currentPaymentMethod !== 'ppcp-gateway' && currentPaymentMethod !== 'ppcp-credit-card-gateway') {\n this.renderer.hideButtons(this.gateway.button.wrapper);\n this.renderer.hideButtons(this.gateway.messages.wrapper);\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n jQuery('#place_order').show();\n } else {\n jQuery('#place_order').hide();\n\n if (currentPaymentMethod === 'ppcp-gateway') {\n this.renderer.showButtons(this.gateway.button.wrapper);\n this.renderer.showButtons(this.gateway.messages.wrapper);\n this.messages.render();\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n }\n\n if (currentPaymentMethod === 'ppcp-credit-card-gateway') {\n this.renderer.hideButtons(this.gateway.button.wrapper);\n this.renderer.hideButtons(this.gateway.messages.wrapper);\n this.renderer.showButtons(this.gateway.hosted_fields.wrapper);\n }\n }\n }\n\n displayPlaceOrderButtonForSavedCreditCards() {\n const currentPaymentMethod = jQuery('input[name=\"payment_method\"]:checked').val();\n\n if (currentPaymentMethod !== 'ppcp-credit-card-gateway') {\n return;\n }\n\n if (jQuery('#saved-credit-card').length && jQuery('#saved-credit-card').val() !== '') {\n this.renderer.hideButtons(this.gateway.button.wrapper);\n this.renderer.hideButtons(this.gateway.messages.wrapper);\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n jQuery('#place_order').show();\n this.disableCreditCardFields();\n } else {\n jQuery('#place_order').hide();\n this.renderer.hideButtons(this.gateway.button.wrapper);\n this.renderer.hideButtons(this.gateway.messages.wrapper);\n this.renderer.showButtons(this.gateway.hosted_fields.wrapper);\n this.enableCreditCardFields();\n }\n }\n\n disableCreditCardFields() {\n jQuery('label[for=\"ppcp-credit-card-gateway-card-number\"]').addClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('#ppcp-credit-card-gateway-card-number').addClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('label[for=\"ppcp-credit-card-gateway-card-expiry\"]').addClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('#ppcp-credit-card-gateway-card-expiry').addClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('label[for=\"ppcp-credit-card-gateway-card-cvc\"]').addClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('#ppcp-credit-card-gateway-card-cvc').addClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('label[for=\"vault\"]').addClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('#ppcp-credit-card-vault').addClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('#ppcp-credit-card-vault').attr(\"disabled\", true);\n this.renderer.disableCreditCardFields();\n }\n\n enableCreditCardFields() {\n jQuery('label[for=\"ppcp-credit-card-gateway-card-number\"]').removeClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('#ppcp-credit-card-gateway-card-number').removeClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('label[for=\"ppcp-credit-card-gateway-card-expiry\"]').removeClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('#ppcp-credit-card-gateway-card-expiry').removeClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('label[for=\"ppcp-credit-card-gateway-card-cvc\"]').removeClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('#ppcp-credit-card-gateway-card-cvc').removeClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('label[for=\"vault\"]').removeClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('#ppcp-credit-card-vault').removeClass('ppcp-credit-card-gateway-form-field-disabled');\n jQuery('#ppcp-credit-card-vault').attr(\"disabled\", false);\n this.renderer.enableCreditCardFields();\n }\n\n}\n\n/* harmony default export */ const ContextBootstrap_CheckoutBootstap = (CheckoutBootstap);\n;// CONCATENATED MODULE: ./resources/js/modules/ContextBootstrap/PayNowBootstrap.js\n\n\n\nclass PayNowBootstrap {\n constructor(gateway, renderer, messages, spinner) {\n this.gateway = gateway;\n this.renderer = renderer;\n this.messages = messages;\n this.spinner = spinner;\n }\n\n init() {\n this.render();\n jQuery(document.body).on('updated_checkout', () => {\n this.render();\n });\n jQuery(document.body).on('updated_checkout payment_method_selected', () => {\n this.switchBetweenPayPalandOrderButton();\n });\n this.switchBetweenPayPalandOrderButton();\n }\n\n shouldRender() {\n if (document.querySelector(this.gateway.button.cancel_wrapper)) {\n return false;\n }\n\n return document.querySelector(this.gateway.button.wrapper) !== null || document.querySelector(this.gateway.hosted_fields.wrapper) !== null;\n }\n\n render() {\n if (!this.shouldRender()) {\n return;\n }\n\n if (document.querySelector(this.gateway.hosted_fields.wrapper + '>div')) {\n document.querySelector(this.gateway.hosted_fields.wrapper + '>div').setAttribute('style', '');\n }\n\n const actionHandler = new ActionHandler_CheckoutActionHandler(PayPalCommerceGateway, new modules_ErrorHandler(this.gateway.labels.error.generic), this.spinner);\n this.renderer.render(this.gateway.button.wrapper, this.gateway.hosted_fields.wrapper, actionHandler.configuration());\n }\n\n switchBetweenPayPalandOrderButton() {\n const urlParams = new URLSearchParams(window.location.search);\n\n if (urlParams.has('change_payment_method')) {\n return;\n }\n\n const currentPaymentMethod = jQuery('input[name=\"payment_method\"]:checked').val();\n\n if (currentPaymentMethod !== 'ppcp-gateway' && currentPaymentMethod !== 'ppcp-credit-card-gateway') {\n this.renderer.hideButtons(this.gateway.button.wrapper);\n this.renderer.hideButtons(this.gateway.messages.wrapper);\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n jQuery('#place_order').show();\n } else {\n jQuery('#place_order').hide();\n\n if (currentPaymentMethod === 'ppcp-gateway') {\n this.renderer.showButtons(this.gateway.button.wrapper);\n this.renderer.showButtons(this.gateway.messages.wrapper);\n this.messages.render();\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n }\n\n if (currentPaymentMethod === 'ppcp-credit-card-gateway') {\n this.renderer.hideButtons(this.gateway.button.wrapper);\n this.renderer.hideButtons(this.gateway.messages.wrapper);\n this.renderer.showButtons(this.gateway.hosted_fields.wrapper);\n }\n }\n }\n\n}\n\n/* harmony default export */ const ContextBootstrap_PayNowBootstrap = (PayNowBootstrap);\n;// CONCATENATED MODULE: ./resources/js/modules/Renderer/Renderer.js\nclass Renderer {\n constructor(creditCardRenderer, defaultConfig) {\n this.defaultConfig = defaultConfig;\n this.creditCardRenderer = creditCardRenderer;\n }\n\n render(wrapper, hostedFieldsWrapper, contextConfig) {\n this.renderButtons(wrapper, contextConfig);\n this.creditCardRenderer.render(hostedFieldsWrapper, contextConfig);\n }\n\n renderButtons(wrapper, contextConfig) {\n if (!document.querySelector(wrapper) || this.isAlreadyRendered(wrapper) || 'undefined' === typeof paypal.Buttons) {\n return;\n }\n\n const style = wrapper === this.defaultConfig.button.wrapper ? this.defaultConfig.button.style : this.defaultConfig.button.mini_cart_style;\n paypal.Buttons({\n style,\n ...contextConfig\n }).render(wrapper);\n }\n\n isAlreadyRendered(wrapper) {\n return document.querySelector(wrapper).hasChildNodes();\n }\n\n hideButtons(element) {\n const domElement = document.querySelector(element);\n\n if (!domElement) {\n return false;\n }\n\n domElement.style.display = 'none';\n return true;\n }\n\n showButtons(element) {\n const domElement = document.querySelector(element);\n\n if (!domElement) {\n return false;\n }\n\n domElement.style.display = 'block';\n return true;\n }\n\n disableCreditCardFields() {\n this.creditCardRenderer.disableFields();\n }\n\n enableCreditCardFields() {\n this.creditCardRenderer.enableFields();\n }\n\n}\n\n/* harmony default export */ const Renderer_Renderer = (Renderer);\n;// CONCATENATED MODULE: ./resources/js/modules/Helper/DccInputFactory.js\nconst dccInputFactory = original => {\n const styles = window.getComputedStyle(original);\n const newElement = document.createElement('span');\n newElement.setAttribute('id', original.id);\n Object.values(styles).forEach(prop => {\n if (!styles[prop] || !isNaN(prop)) {\n return;\n }\n\n newElement.style.setProperty(prop, '' + styles[prop]);\n });\n return newElement;\n};\n\n/* harmony default export */ const DccInputFactory = (dccInputFactory);\n;// CONCATENATED MODULE: ./resources/js/modules/Renderer/CreditCardRenderer.js\n\n\nclass CreditCardRenderer {\n constructor(defaultConfig, errorHandler, spinner) {\n this.defaultConfig = defaultConfig;\n this.errorHandler = errorHandler;\n this.spinner = spinner;\n this.cardValid = false;\n this.formValid = false;\n this.currentHostedFieldsInstance = null;\n this.formSubmissionSubscribed = false;\n }\n\n render(wrapper, contextConfig) {\n if (this.defaultConfig.context !== 'checkout' && this.defaultConfig.context !== 'pay-now' || wrapper === null || document.querySelector(wrapper) === null) {\n return;\n }\n\n if (typeof paypal.HostedFields === 'undefined' || !paypal.HostedFields.isEligible()) {\n const wrapperElement = document.querySelector(wrapper);\n wrapperElement.parentNode.removeChild(wrapperElement);\n return;\n }\n\n if (this.currentHostedFieldsInstance) {\n this.currentHostedFieldsInstance.teardown().catch(err => console.error(`Hosted fields teardown error: ${err}`));\n this.currentHostedFieldsInstance = null;\n }\n\n const gateWayBox = document.querySelector('.payment_box.payment_method_ppcp-credit-card-gateway');\n const oldDisplayStyle = gateWayBox.style.display;\n gateWayBox.style.display = 'block';\n const hideDccGateway = document.querySelector('#ppcp-hide-dcc');\n\n if (hideDccGateway) {\n hideDccGateway.parentNode.removeChild(hideDccGateway);\n }\n\n const cardNumberField = document.querySelector('#ppcp-credit-card-gateway-card-number');\n const stylesRaw = window.getComputedStyle(cardNumberField);\n let styles = {};\n Object.values(stylesRaw).forEach(prop => {\n if (!stylesRaw[prop]) {\n return;\n }\n\n styles[prop] = '' + stylesRaw[prop];\n });\n const cardNumber = DccInputFactory(cardNumberField);\n cardNumberField.parentNode.replaceChild(cardNumber, cardNumberField);\n const cardExpiryField = document.querySelector('#ppcp-credit-card-gateway-card-expiry');\n const cardExpiry = DccInputFactory(cardExpiryField);\n cardExpiryField.parentNode.replaceChild(cardExpiry, cardExpiryField);\n const cardCodeField = document.querySelector('#ppcp-credit-card-gateway-card-cvc');\n const cardCode = DccInputFactory(cardCodeField);\n cardCodeField.parentNode.replaceChild(cardCode, cardCodeField);\n gateWayBox.style.display = oldDisplayStyle;\n const formWrapper = '.payment_box payment_method_ppcp-credit-card-gateway';\n\n if (this.defaultConfig.enforce_vault && document.querySelector(formWrapper + ' .ppcp-credit-card-vault')) {\n document.querySelector(formWrapper + ' .ppcp-credit-card-vault').checked = true;\n document.querySelector(formWrapper + ' .ppcp-credit-card-vault').setAttribute('disabled', true);\n }\n\n paypal.HostedFields.render({\n createOrder: contextConfig.createOrder,\n styles: {\n 'input': styles\n },\n fields: {\n number: {\n selector: '#ppcp-credit-card-gateway-card-number',\n placeholder: this.defaultConfig.hosted_fields.labels.credit_card_number\n },\n cvv: {\n selector: '#ppcp-credit-card-gateway-card-cvc',\n placeholder: this.defaultConfig.hosted_fields.labels.cvv\n },\n expirationDate: {\n selector: '#ppcp-credit-card-gateway-card-expiry',\n placeholder: this.defaultConfig.hosted_fields.labels.mm_yy\n }\n }\n }).then(hostedFields => {\n document.dispatchEvent(new CustomEvent(\"hosted_fields_loaded\"));\n this.currentHostedFieldsInstance = hostedFields;\n hostedFields.on('inputSubmitRequest', () => {\n this._submit(contextConfig);\n });\n hostedFields.on('cardTypeChange', event => {\n if (!event.cards.length) {\n this.cardValid = false;\n return;\n }\n\n const validCards = this.defaultConfig.hosted_fields.valid_cards;\n this.cardValid = validCards.indexOf(event.cards[0].type) !== -1;\n });\n hostedFields.on('validityChange', event => {\n const formValid = Object.keys(event.fields).every(function (key) {\n return event.fields[key].isValid;\n });\n this.formValid = formValid;\n });\n\n if (!this.formSubmissionSubscribed) {\n document.querySelector(wrapper + ' button').addEventListener('click', event => {\n event.preventDefault();\n\n this._submit(contextConfig);\n });\n this.formSubmissionSubscribed = true;\n }\n });\n document.querySelector('#payment_method_ppcp-credit-card-gateway').addEventListener('click', () => {\n document.querySelector('label[for=ppcp-credit-card-gateway-card-number]').click();\n });\n }\n\n disableFields() {\n if (this.currentHostedFieldsInstance) {\n this.currentHostedFieldsInstance.setAttribute({\n field: 'number',\n attribute: 'disabled'\n });\n this.currentHostedFieldsInstance.setAttribute({\n field: 'cvv',\n attribute: 'disabled'\n });\n this.currentHostedFieldsInstance.setAttribute({\n field: 'expirationDate',\n attribute: 'disabled'\n });\n }\n }\n\n enableFields() {\n if (this.currentHostedFieldsInstance) {\n this.currentHostedFieldsInstance.removeAttribute({\n field: 'number',\n attribute: 'disabled'\n });\n this.currentHostedFieldsInstance.removeAttribute({\n field: 'cvv',\n attribute: 'disabled'\n });\n this.currentHostedFieldsInstance.removeAttribute({\n field: 'expirationDate',\n attribute: 'disabled'\n });\n }\n }\n\n _submit(contextConfig) {\n this.spinner.block();\n this.errorHandler.clear();\n\n if (this.formValid && this.cardValid) {\n const save_card = this.defaultConfig.save_card ? true : false;\n const vault = document.getElementById('ppcp-credit-card-vault') ? document.getElementById('ppcp-credit-card-vault').checked : save_card;\n const contingency = this.defaultConfig.hosted_fields.contingency;\n const hostedFieldsData = {\n vault: vault\n };\n\n if (contingency !== 'NO_3D_SECURE') {\n hostedFieldsData.contingencies = [contingency];\n }\n\n this.currentHostedFieldsInstance.submit(hostedFieldsData).then(payload => {\n payload.orderID = payload.orderId;\n this.spinner.unblock();\n return contextConfig.onApprove(payload);\n }).catch(err => {\n console.error(err);\n this.spinner.unblock();\n });\n } else {\n this.spinner.unblock();\n const message = !this.cardValid ? this.defaultConfig.hosted_fields.labels.card_not_supported : this.defaultConfig.hosted_fields.labels.fields_not_valid;\n this.errorHandler.message(message);\n }\n }\n\n}\n\n/* harmony default export */ const Renderer_CreditCardRenderer = (CreditCardRenderer);\n;// CONCATENATED MODULE: ./resources/js/modules/DataClientIdAttributeHandler.js\nconst storageKey = 'ppcp-data-client-id';\n\nconst validateToken = (token, user) => {\n if (!token) {\n return false;\n }\n\n if (token.user !== user) {\n return false;\n }\n\n const currentTime = new Date().getTime();\n const isExpired = currentTime >= token.expiration * 1000;\n return !isExpired;\n};\n\nconst storedTokenForUser = user => {\n const token = JSON.parse(sessionStorage.getItem(storageKey));\n\n if (validateToken(token, user)) {\n return token.token;\n }\n\n return null;\n};\n\nconst storeToken = token => {\n sessionStorage.setItem(storageKey, JSON.stringify(token));\n};\n\nconst dataClientIdAttributeHandler = (script, config) => {\n fetch(config.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: config.nonce\n })\n }).then(res => {\n return res.json();\n }).then(data => {\n const isValid = validateToken(data, config.user);\n\n if (!isValid) {\n return;\n }\n\n storeToken(data);\n script.setAttribute('data-client-token', data.token);\n document.body.append(script);\n });\n};\n\n/* harmony default export */ const DataClientIdAttributeHandler = (dataClientIdAttributeHandler);\n;// CONCATENATED MODULE: ./resources/js/modules/Renderer/MessageRenderer.js\nclass MessageRenderer {\n constructor(config) {\n this.config = config;\n }\n\n render() {\n if (!this.shouldRender()) {\n return;\n }\n\n paypal.Messages({\n amount: this.config.amount,\n placement: this.config.placement,\n style: this.config.style\n }).render(this.config.wrapper);\n }\n\n renderWithAmount(amount) {\n if (!this.shouldRender()) {\n return;\n }\n\n const newWrapper = document.createElement('div');\n newWrapper.setAttribute('id', this.config.wrapper.replace('#', ''));\n const sibling = document.querySelector(this.config.wrapper).nextSibling;\n document.querySelector(this.config.wrapper).parentElement.removeChild(document.querySelector(this.config.wrapper));\n sibling.parentElement.insertBefore(newWrapper, sibling);\n paypal.Messages({\n amount,\n placement: this.config.placement,\n style: this.config.style\n }).render(this.config.wrapper);\n }\n\n shouldRender() {\n if (typeof paypal.Messages === 'undefined' || typeof this.config.wrapper === 'undefined') {\n return false;\n }\n\n if (!document.querySelector(this.config.wrapper)) {\n return false;\n }\n\n return true;\n }\n\n}\n\n/* harmony default export */ const Renderer_MessageRenderer = (MessageRenderer);\n;// CONCATENATED MODULE: ./resources/js/modules/Helper/Spinner.js\nclass Spinner {\n constructor() {\n this.target = 'form.woocommerce-checkout';\n }\n\n setTarget(target) {\n this.target = target;\n }\n\n block() {\n jQuery(this.target).block({\n message: null,\n overlayCSS: {\n background: '#fff',\n opacity: 0.6\n }\n });\n }\n\n unblock() {\n jQuery(this.target).unblock();\n }\n\n}\n\n/* harmony default export */ const Helper_Spinner = (Spinner);\n;// CONCATENATED MODULE: ./resources/js/button.js\n\n\n\n\n\n\n\n\n\n\n\n\nconst bootstrap = () => {\n const errorHandler = new modules_ErrorHandler(PayPalCommerceGateway.labels.error.generic);\n const spinner = new Helper_Spinner();\n const creditCardRenderer = new Renderer_CreditCardRenderer(PayPalCommerceGateway, errorHandler, spinner);\n const renderer = new Renderer_Renderer(creditCardRenderer, PayPalCommerceGateway);\n const messageRenderer = new Renderer_MessageRenderer(PayPalCommerceGateway.messages);\n const context = PayPalCommerceGateway.context;\n\n if (context === 'mini-cart' || context === 'product') {\n if (PayPalCommerceGateway.mini_cart_buttons_enabled === '1') {\n const miniCartBootstrap = new ContextBootstrap_MiniCartBootstap(PayPalCommerceGateway, renderer);\n miniCartBootstrap.init();\n }\n }\n\n if (context === 'product' && PayPalCommerceGateway.single_product_buttons_enabled === '1') {\n const singleProductBootstrap = new ContextBootstrap_SingleProductBootstap(PayPalCommerceGateway, renderer, messageRenderer);\n singleProductBootstrap.init();\n }\n\n if (context === 'cart') {\n const cartBootstrap = new CartBootstap(PayPalCommerceGateway, renderer);\n cartBootstrap.init();\n }\n\n if (context === 'checkout') {\n const checkoutBootstap = new ContextBootstrap_CheckoutBootstap(PayPalCommerceGateway, renderer, messageRenderer, spinner);\n checkoutBootstap.init();\n }\n\n if (context === 'pay-now') {\n const payNowBootstrap = new ContextBootstrap_PayNowBootstrap(PayPalCommerceGateway, renderer, messageRenderer, spinner);\n payNowBootstrap.init();\n }\n\n if (context !== 'checkout') {\n messageRenderer.render();\n }\n};\n\ndocument.addEventListener('DOMContentLoaded', () => {\n if (!typeof PayPalCommerceGateway) {\n console.error('PayPal button could not be configured.');\n return;\n }\n\n const script = document.createElement('script');\n script.addEventListener('load', event => {\n bootstrap();\n });\n script.setAttribute('src', PayPalCommerceGateway.button.url);\n Object.entries(PayPalCommerceGateway.script_attributes).forEach(keyValue => {\n script.setAttribute(keyValue[0], keyValue[1]);\n });\n\n if (PayPalCommerceGateway.data_client_id.set_attribute) {\n DataClientIdAttributeHandler(script, PayPalCommerceGateway.data_client_id);\n return;\n }\n\n document.body.append(script);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFBQSxPQUFPLENBQUNDLEtBQVIsQ0FBYyx3Q0FBZDtBQUNBO0FBQ0g7O0FBQ0QsUUFBTWdOLE1BQU0sR0FBR3ZTLFFBQVEsQ0FBQ3dCLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBZjtBQUVBK1EsRUFBQUEsTUFBTSxDQUFDaEMsZ0JBQVAsQ0FBd0IsTUFBeEIsRUFBaUNWLEtBQUQsSUFBVztBQUN2Q3lELElBQUFBLFNBQVM7QUFDWixHQUZEO0FBR0FmLEVBQUFBLE1BQU0sQ0FBQzlRLFlBQVAsQ0FBb0IsS0FBcEIsRUFBMkJxQyxxQkFBcUIsQ0FBQ3NDLE1BQXRCLENBQTZCMk4sR0FBeEQ7QUFDQTVHLEVBQUFBLE1BQU0sQ0FBQzZHLE9BQVAsQ0FBZWxRLHFCQUFxQixDQUFDbVEsaUJBQXJDLEVBQXdEMUwsT0FBeEQsQ0FDSzJMLFFBQUQsSUFBYztBQUNWM0IsSUFBQUEsTUFBTSxDQUFDOVEsWUFBUCxDQUFvQnlTLFFBQVEsQ0FBQyxDQUFELENBQTVCLEVBQWlDQSxRQUFRLENBQUMsQ0FBRCxDQUF6QztBQUNILEdBSEw7O0FBTUEsTUFBSXBRLHFCQUFxQixDQUFDcVEsY0FBdEIsQ0FBcUNDLGFBQXpDLEVBQXdEO0FBQ3BEOUIsSUFBQUEsNEJBQTRCLENBQUNDLE1BQUQsRUFBU3pPLHFCQUFxQixDQUFDcVEsY0FBL0IsQ0FBNUI7QUFDQTtBQUNIOztBQUVEblUsRUFBQUEsUUFBUSxDQUFDNEMsSUFBVCxDQUFjNkgsTUFBZCxDQUFxQjhILE1BQXJCO0FBQ0gsQ0F6QkwiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvRXJyb3JIYW5kbGVyLmpzP2U2NWEiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL09uQXBwcm92ZUhhbmRsZXIvb25BcHByb3ZlRm9yQ29udGludWUuanM/YzQ1NCIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvSGVscGVyL1BheWVyRGF0YS5qcz8yYWYxIiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9BY3Rpb25IYW5kbGVyL0NhcnRBY3Rpb25IYW5kbGVyLmpzPzgyY2YiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0NvbnRleHRCb290c3RyYXAvTWluaUNhcnRCb290c3RhcC5qcz9kNTUyIiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9IZWxwZXIvVXBkYXRlQ2FydC5qcz9lNDIyIiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9IZWxwZXIvQnV0dG9uc1RvZ2dsZUxpc3RlbmVyLmpzP2UxOTMiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0VudGl0eS9Qcm9kdWN0LmpzPzlmZmYiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0FjdGlvbkhhbmRsZXIvU2luZ2xlUHJvZHVjdEFjdGlvbkhhbmRsZXIuanM/ZDliNyIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvQ29udGV4dEJvb3RzdHJhcC9TaW5nbGVQcm9kdWN0Qm9vdHN0YXAuanM/N2MxOSIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvQ29udGV4dEJvb3RzdHJhcC9DYXJ0Qm9vdHN0YXAuanM/NWU5NCIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvT25BcHByb3ZlSGFuZGxlci9vbkFwcHJvdmVGb3JQYXlOb3cuanM/OTMwNSIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvQWN0aW9uSGFuZGxlci9DaGVja291dEFjdGlvbkhhbmRsZXIuanM/ODUxNSIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvQ29udGV4dEJvb3RzdHJhcC9DaGVja291dEJvb3RzdGFwLmpzP2M4NTUiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0NvbnRleHRCb290c3RyYXAvUGF5Tm93Qm9vdHN0cmFwLmpzP2Q5ZjUiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL1JlbmRlcmVyL1JlbmRlcmVyLmpzP2ZhOTMiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0hlbHBlci9EY2NJbnB1dEZhY3RvcnkuanM/MmEyZiIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvUmVuZGVyZXIvQ3JlZGl0Q2FyZFJlbmRlcmVyLmpzPzM4N2EiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0RhdGFDbGllbnRJZEF0dHJpYnV0ZUhhbmRsZXIuanM/ZWUwYiIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvUmVuZGVyZXIvTWVzc2FnZVJlbmRlcmVyLmpzP2NkMDIiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0hlbHBlci9TcGlubmVyLmpzPzE3MDgiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9idXR0b24uanM/MDYwZiJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBFcnJvckhhbmRsZXIge1xuXG4gICAgY29uc3RydWN0b3IoZ2VuZXJpY0Vycm9yVGV4dClcbiAgICB7XG4gICAgICAgIHRoaXMuZ2VuZXJpY0Vycm9yVGV4dCA9IGdlbmVyaWNFcnJvclRleHQ7XG4gICAgICAgIHRoaXMud3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy53b29jb21tZXJjZS1ub3RpY2VzLXdyYXBwZXInKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlc0xpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd1bC53b29jb21tZXJjZS1lcnJvcicpO1xuICAgIH1cblxuICAgIGdlbmVyaWNFcnJvcigpIHtcbiAgICAgICAgaWYgKHRoaXMud3JhcHBlci5jbGFzc0xpc3QuY29udGFpbnMoJ3BwY3AtcGVyc2lzdCcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICB0aGlzLm1lc3NhZ2UodGhpcy5nZW5lcmljRXJyb3JUZXh0KVxuICAgIH1cblxuICAgIGFwcGVuZFByZXBhcmVkRXJyb3JNZXNzYWdlRWxlbWVudChlcnJvck1lc3NhZ2VFbGVtZW50KVxuICAgIHtcbiAgICAgICAgaWYodGhpcy5tZXNzYWdlc0xpc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZU1lc3NhZ2VzTGlzdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZXNzYWdlc0xpc3QucmVwbGFjZVdpdGgoZXJyb3JNZXNzYWdlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgbWVzc2FnZSh0ZXh0LCBwZXJzaXN0ID0gZmFsc2UpXG4gICAge1xuICAgICAgICBpZighIHR5cGVvZiBTdHJpbmcgfHwgdGV4dC5sZW5ndGggPT09IDApe1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIG5ldyBtZXNzYWdlIHRleHQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLm1lc3NhZ2VzTGlzdCA9PT0gbnVsbCl7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVNZXNzYWdlc0xpc3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwZXJzaXN0KSB7XG4gICAgICAgICAgICB0aGlzLndyYXBwZXIuY2xhc3NMaXN0LmFkZCgncHBjcC1wZXJzaXN0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgncHBjcC1wZXJzaXN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWVzc2FnZU5vZGUgPSB0aGlzLnByZXBhcmVNZXNzYWdlc0xpc3RJdGVtKHRleHQpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VzTGlzdC5hcHBlbmRDaGlsZChtZXNzYWdlTm9kZSk7XG5cbiAgICAgICAgalF1ZXJ5LnNjcm9sbF90b19ub3RpY2VzKGpRdWVyeSgnLndvb2NvbW1lcmNlLW5vdGljZXMtd3JhcHBlcicpKVxuICAgIH1cblxuICAgIHByZXBhcmVNZXNzYWdlc0xpc3QoKVxuICAgIHtcbiAgICAgICAgaWYodGhpcy5tZXNzYWdlc0xpc3QgPT09IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlc0xpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlc0xpc3Quc2V0QXR0cmlidXRlKCdjbGFzcycsICd3b29jb21tZXJjZS1lcnJvcicpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlc0xpc3Quc2V0QXR0cmlidXRlKCdyb2xlJywgJ2FsZXJ0Jyk7XG4gICAgICAgICAgICB0aGlzLndyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5tZXNzYWdlc0xpc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJlcGFyZU1lc3NhZ2VzTGlzdEl0ZW0obWVzc2FnZSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICAgICAgbGkuaW5uZXJIVE1MID0gbWVzc2FnZTtcblxuICAgICAgICByZXR1cm4gbGk7XG4gICAgfVxuXG4gICAgc2FuaXRpemUodGV4dClcbiAgICB7XG4gICAgICAgIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICAgICAgdGV4dGFyZWEuaW5uZXJIVE1MID0gdGV4dDtcbiAgICAgICAgcmV0dXJuIHRleHRhcmVhLnZhbHVlLnJlcGxhY2UoJ0Vycm9yOiAnLCAnJyk7XG4gICAgfVxuXG4gICAgY2xlYXIoKVxuICAgIHtcbiAgICAgICAgaWYgKCEgdGhpcy53cmFwcGVyLmNsYXNzTGlzdC5jb250YWlucygnd29vY29tbWVyY2UtZXJyb3InKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCd3b29jb21tZXJjZS1lcnJvcicpO1xuICAgICAgICB0aGlzLndyYXBwZXIuaW5uZXJUZXh0ID0gJyc7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFcnJvckhhbmRsZXI7XG4iLCJjb25zdCBvbkFwcHJvdmUgPSAoY29udGV4dCwgZXJyb3JIYW5kbGVyKSA9PiB7XG4gICAgcmV0dXJuIChkYXRhLCBhY3Rpb25zKSA9PiB7XG4gICAgICAgIHJldHVybiBmZXRjaChjb250ZXh0LmNvbmZpZy5hamF4LmFwcHJvdmVfb3JkZXIuZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIG5vbmNlOiBjb250ZXh0LmNvbmZpZy5hamF4LmFwcHJvdmVfb3JkZXIubm9uY2UsXG4gICAgICAgICAgICAgICAgb3JkZXJfaWQ6ZGF0YS5vcmRlcklEXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KS50aGVuKChyZXMpPT57XG4gICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgICAgICAgfSkudGhlbigoZGF0YSk9PntcbiAgICAgICAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyLmdlbmVyaWNFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb25zLnJlc3RhcnQoKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIuZ2VuZXJpY0Vycm9yKCk7XG4gICAgICAgICAgICAgICAgfSk7O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IGNvbnRleHQuY29uZmlnLnJlZGlyZWN0O1xuICAgICAgICB9KTtcblxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgb25BcHByb3ZlO1xuIiwiZXhwb3J0IGNvbnN0IHBheWVyRGF0YSA9ICgpID0+IHtcbiAgICBjb25zdCBwYXllciA9IFBheVBhbENvbW1lcmNlR2F0ZXdheS5wYXllcjtcbiAgICBpZiAoISBwYXllcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwaG9uZSA9IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19waG9uZScpIHx8IHR5cGVvZiBwYXllci5waG9uZSAhPT0gJ3VuZGVmaW5lZCcpID9cbiAgICB7XG4gICAgICAgIHBob25lX3R5cGU6XCJIT01FXCIsXG4gICAgICAgICAgICBwaG9uZV9udW1iZXI6e1xuICAgICAgICAgICAgbmF0aW9uYWxfbnVtYmVyIDogKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX3Bob25lJykpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfcGhvbmUnKS52YWx1ZSA6IHBheWVyLnBob25lLnBob25lX251bWJlci5uYXRpb25hbF9udW1iZXJcbiAgICAgICAgfVxuICAgIH0gOiBudWxsO1xuICAgIGNvbnN0IHBheWVyRGF0YSA9IHtcbiAgICAgICAgZW1haWxfYWRkcmVzczooZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfZW1haWwnKSkgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19lbWFpbCcpLnZhbHVlIDogcGF5ZXIuZW1haWxfYWRkcmVzcyxcbiAgICAgICAgbmFtZSA6IHtcbiAgICAgICAgICAgIHN1cm5hbWU6IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19sYXN0X25hbWUnKSkgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19sYXN0X25hbWUnKS52YWx1ZSA6IHBheWVyLm5hbWUuc3VybmFtZSxcbiAgICAgICAgICAgIGdpdmVuX25hbWU6IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19maXJzdF9uYW1lJykpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfZmlyc3RfbmFtZScpLnZhbHVlIDogcGF5ZXIubmFtZS5naXZlbl9uYW1lXG4gICAgICAgIH0sXG4gICAgICAgIGFkZHJlc3MgOiB7XG4gICAgICAgICAgICBjb3VudHJ5X2NvZGUgOiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfY291bnRyeScpKSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX2NvdW50cnknKS52YWx1ZSA6IHBheWVyLmFkZHJlc3MuY291bnRyeV9jb2RlLFxuICAgICAgICAgICAgYWRkcmVzc19saW5lXzEgOiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfYWRkcmVzc18xJykpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfYWRkcmVzc18xJykudmFsdWUgOiBwYXllci5hZGRyZXNzLmFkZHJlc3NfbGluZV8xLFxuICAgICAgICAgICAgYWRkcmVzc19saW5lXzIgOiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfYWRkcmVzc18yJykpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfYWRkcmVzc18yJykudmFsdWUgOiBwYXllci5hZGRyZXNzLmFkZHJlc3NfbGluZV8yLFxuICAgICAgICAgICAgYWRtaW5fYXJlYV8xIDogKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX3N0YXRlJykpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfc3RhdGUnKS52YWx1ZSA6IHBheWVyLmFkZHJlc3MuYWRtaW5fYXJlYV8xLFxuICAgICAgICAgICAgYWRtaW5fYXJlYV8yIDogKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX2NpdHknKSkgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19jaXR5JykudmFsdWUgOiBwYXllci5hZGRyZXNzLmFkbWluX2FyZWFfMixcbiAgICAgICAgICAgIHBvc3RhbF9jb2RlIDogKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX3Bvc3Rjb2RlJykpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfcG9zdGNvZGUnKS52YWx1ZSA6IHBheWVyLmFkZHJlc3MucG9zdGFsX2NvZGVcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAocGhvbmUpIHtcbiAgICAgICAgcGF5ZXJEYXRhLnBob25lID0gcGhvbmU7XG4gICAgfVxuICAgIHJldHVybiBwYXllckRhdGE7XG59XG4iLCJpbXBvcnQgb25BcHByb3ZlIGZyb20gJy4uL09uQXBwcm92ZUhhbmRsZXIvb25BcHByb3ZlRm9yQ29udGludWUuanMnO1xuaW1wb3J0IHtwYXllckRhdGF9IGZyb20gXCIuLi9IZWxwZXIvUGF5ZXJEYXRhXCI7XG5cbmNsYXNzIENhcnRBY3Rpb25IYW5kbGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZywgZXJyb3JIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjtcbiAgICB9XG5cbiAgICBjb25maWd1cmF0aW9uKCkge1xuICAgICAgICBjb25zdCBjcmVhdGVPcmRlciA9IChkYXRhLCBhY3Rpb25zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXllciA9IHBheWVyRGF0YSgpO1xuICAgICAgICAgICAgY29uc3QgYm5Db2RlID0gdHlwZW9mIHRoaXMuY29uZmlnLmJuX2NvZGVzW3RoaXMuY29uZmlnLmNvbnRleHRdICE9PSAndW5kZWZpbmVkJyA/XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuYm5fY29kZXNbdGhpcy5jb25maWcuY29udGV4dF0gOiAnJztcbiAgICAgICAgICAgIHJldHVybiBmZXRjaCh0aGlzLmNvbmZpZy5hamF4LmNyZWF0ZV9vcmRlci5lbmRwb2ludCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgbm9uY2U6IHRoaXMuY29uZmlnLmFqYXguY3JlYXRlX29yZGVyLm5vbmNlLFxuICAgICAgICAgICAgICAgICAgICBwdXJjaGFzZV91bml0czogW10sXG4gICAgICAgICAgICAgICAgICAgIGJuX2NvZGU6Ym5Db2RlLFxuICAgICAgICAgICAgICAgICAgICBwYXllcixcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDp0aGlzLmNvbmZpZy5jb250ZXh0XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKHJlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoZGF0YS5kYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5kYXRhLmlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNyZWF0ZU9yZGVyLFxuICAgICAgICAgICAgb25BcHByb3ZlOiBvbkFwcHJvdmUodGhpcywgdGhpcy5lcnJvckhhbmRsZXIpLFxuICAgICAgICAgICAgb25FcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuZ2VuZXJpY0Vycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDYXJ0QWN0aW9uSGFuZGxlcjtcbiIsImltcG9ydCBFcnJvckhhbmRsZXIgZnJvbSAnLi4vRXJyb3JIYW5kbGVyJztcbmltcG9ydCBDYXJ0QWN0aW9uSGFuZGxlciBmcm9tICcuLi9BY3Rpb25IYW5kbGVyL0NhcnRBY3Rpb25IYW5kbGVyJztcblxuY2xhc3MgTWluaUNhcnRCb290c3RhcCB7XG4gICAgY29uc3RydWN0b3IoZ2F0ZXdheSwgcmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5nYXRld2F5ID0gZ2F0ZXdheTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLmFjdGlvbkhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGluaXQoKSB7XG5cbiAgICAgICAgdGhpcy5hY3Rpb25IYW5kbGVyID0gbmV3IENhcnRBY3Rpb25IYW5kbGVyKFxuICAgICAgICAgICAgUGF5UGFsQ29tbWVyY2VHYXRld2F5LFxuICAgICAgICAgICAgbmV3IEVycm9ySGFuZGxlcih0aGlzLmdhdGV3YXkubGFiZWxzLmVycm9yLmdlbmVyaWMpLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuXG4gICAgICAgIGpRdWVyeShkb2N1bWVudC5ib2R5KS5vbignd2NfZnJhZ21lbnRzX2xvYWRlZCB3Y19mcmFnbWVudHNfcmVmcmVzaGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2hvdWxkUmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmdhdGV3YXkuYnV0dG9uLm1pbmlfY2FydF93cmFwcGVyKSAhPT1cbiAgICAgICAgICAgIG51bGwgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmdhdGV3YXkuaG9zdGVkX2ZpZWxkcy5taW5pX2NhcnRfd3JhcHBlcikgIT09XG4gICAgICAgIG51bGw7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkUmVuZGVyKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKFxuICAgICAgICAgICAgdGhpcy5nYXRld2F5LmJ1dHRvbi5taW5pX2NhcnRfd3JhcHBlcixcbiAgICAgICAgICAgIHRoaXMuZ2F0ZXdheS5ob3N0ZWRfZmllbGRzLm1pbmlfY2FydF93cmFwcGVyLFxuICAgICAgICAgICAgdGhpcy5hY3Rpb25IYW5kbGVyLmNvbmZpZ3VyYXRpb24oKVxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWluaUNhcnRCb290c3RhcDsiLCJpbXBvcnQgUHJvZHVjdCBmcm9tIFwiLi4vRW50aXR5L1Byb2R1Y3RcIjtcbmNsYXNzIFVwZGF0ZUNhcnQge1xuXG4gICAgY29uc3RydWN0b3IoZW5kcG9pbnQsIG5vbmNlKVxuICAgIHtcbiAgICAgICAgdGhpcy5lbmRwb2ludCA9IGVuZHBvaW50O1xuICAgICAgICB0aGlzLm5vbmNlID0gbm9uY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25SZXNvbHZlXG4gICAgICogQHBhcmFtIHtQcm9kdWN0W119IHByb2R1Y3RzXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gICAgICovXG4gICAgdXBkYXRlKG9uUmVzb2x2ZSwgcHJvZHVjdHMpXG4gICAge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgZmV0Y2goXG4gICAgICAgICAgICAgICAgdGhpcy5lbmRwb2ludCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBub25jZTogdGhpcy5ub25jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICkudGhlbihcbiAgICAgICAgICAgICAgICAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qc29uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoISByZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QocmVzdWx0LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gb25SZXNvbHZlKHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBVcGRhdGVDYXJ0OyIsIi8qKlxuICogV2hlbiB5b3UgY2FuJ3QgYWRkIHNvbWV0aGluZyB0byB0aGUgY2FydCwgdGhlIFBheVBhbCBidXR0b25zIHNob3VsZCBub3Qgc2hvdy5cbiAqIFRoZXJlZm9yZSB3ZSBsaXN0ZW4gZm9yIGNoYW5nZXMgb24gdGhlIGFkZCB0byBjYXJ0IGJ1dHRvbiBhbmQgc2hvdy9oaWRlIHRoZSBidXR0b25zIGFjY29yZGluZ2x5LlxuICovXG5cbmNsYXNzIEJ1dHRvbnNUb2dnbGVMaXN0ZW5lciB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgc2hvd0NhbGxiYWNrLCBoaWRlQ2FsbGJhY2spXG4gICAge1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLnNob3dDYWxsYmFjayA9IHNob3dDYWxsYmFjaztcbiAgICAgICAgdGhpcy5oaWRlQ2FsbGJhY2sgPSBoaWRlQ2FsbGJhY2s7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGluaXQoKVxuICAgIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0geyBhdHRyaWJ1dGVzIDogdHJ1ZSB9O1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlQ2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNob3dDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjayk7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnQsIGNvbmZpZyk7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgZGlzY29ubmVjdCgpXG4gICAge1xuICAgICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbnNUb2dnbGVMaXN0ZW5lcjsiLCJjbGFzcyBQcm9kdWN0IHtcblxuICAgIGNvbnN0cnVjdG9yKGlkLCBxdWFudGl0eSwgdmFyaWF0aW9ucykge1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMucXVhbnRpdHkgPSBxdWFudGl0eTtcbiAgICAgICAgdGhpcy52YXJpYXRpb25zID0gdmFyaWF0aW9ucztcbiAgICB9XG5cbiAgICBkYXRhKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6dGhpcy5pZCxcbiAgICAgICAgICAgIHF1YW50aXR5OnRoaXMucXVhbnRpdHksXG4gICAgICAgICAgICB2YXJpYXRpb25zOnRoaXMudmFyaWF0aW9uc1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQcm9kdWN0OyIsImltcG9ydCBCdXR0b25zVG9nZ2xlTGlzdGVuZXIgZnJvbSAnLi4vSGVscGVyL0J1dHRvbnNUb2dnbGVMaXN0ZW5lcic7XG5pbXBvcnQgUHJvZHVjdCBmcm9tICcuLi9FbnRpdHkvUHJvZHVjdCc7XG5pbXBvcnQgb25BcHByb3ZlIGZyb20gJy4uL09uQXBwcm92ZUhhbmRsZXIvb25BcHByb3ZlRm9yQ29udGludWUnO1xuaW1wb3J0IHtwYXllckRhdGF9IGZyb20gXCIuLi9IZWxwZXIvUGF5ZXJEYXRhXCI7XG5cbmNsYXNzIFNpbmdsZVByb2R1Y3RBY3Rpb25IYW5kbGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHVwZGF0ZUNhcnQsXG4gICAgICAgIHNob3dCdXR0b25DYWxsYmFjayxcbiAgICAgICAgaGlkZUJ1dHRvbkNhbGxiYWNrLFxuICAgICAgICBmb3JtRWxlbWVudCxcbiAgICAgICAgZXJyb3JIYW5kbGVyXG4gICAgKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLnVwZGF0ZUNhcnQgPSB1cGRhdGVDYXJ0O1xuICAgICAgICB0aGlzLnNob3dCdXR0b25DYWxsYmFjayA9IHNob3dCdXR0b25DYWxsYmFjaztcbiAgICAgICAgdGhpcy5oaWRlQnV0dG9uQ2FsbGJhY2sgPSBoaWRlQnV0dG9uQ2FsbGJhY2s7XG4gICAgICAgIHRoaXMuZm9ybUVsZW1lbnQgPSBmb3JtRWxlbWVudDtcbiAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7XG4gICAgfVxuXG4gICAgY29uZmlndXJhdGlvbigpXG4gICAge1xuXG4gICAgICAgIGlmICggdGhpcy5oYXNWYXJpYXRpb25zKCkgKSB7XG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBCdXR0b25zVG9nZ2xlTGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuc2luZ2xlX2FkZF90b19jYXJ0X2J1dHRvbicpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0J1dHRvbkNhbGxiYWNrLFxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZUJ1dHRvbkNhbGxiYWNrXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuaW5pdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNyZWF0ZU9yZGVyOiB0aGlzLmNyZWF0ZU9yZGVyKCksXG4gICAgICAgICAgICBvbkFwcHJvdmU6IG9uQXBwcm92ZSh0aGlzLCB0aGlzLmVycm9ySGFuZGxlciksXG4gICAgICAgICAgICBvbkVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5nZW5lcmljRXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZU9yZGVyKClcbiAgICB7XG4gICAgICAgIHZhciBnZXRQcm9kdWN0cyA9IG51bGw7XG4gICAgICAgIGlmICghIHRoaXMuaXNHcm91cGVkUHJvZHVjdCgpICkge1xuICAgICAgICAgICAgZ2V0UHJvZHVjdHMgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbbmFtZT1cImFkZC10by1jYXJ0XCJdJykudmFsdWU7XG4gICAgICAgICAgICAgICAgY29uc3QgcXR5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW25hbWU9XCJxdWFudGl0eVwiXScpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhdGlvbnMgPSB0aGlzLnZhcmlhdGlvbnMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW25ldyBQcm9kdWN0KGlkLCBxdHksIHZhcmlhdGlvbnMpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdldFByb2R1Y3RzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2R1Y3RzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPVwibnVtYmVyXCJdJykuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoISBlbGVtZW50LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpLm1hdGNoKC9xdWFudGl0eVxcWyhbXFxkXSopXFxdLyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50TmFtZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHBhcnNlSW50KGVsZW1lbnROYW1lWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVhbnRpdHkgPSBwYXJzZUludChlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdHMucHVzaChuZXcgUHJvZHVjdChpZCwgcXVhbnRpdHksIG51bGwpKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9kdWN0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjcmVhdGVPcmRlciA9IChkYXRhLCBhY3Rpb25zKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5jbGVhcigpO1xuXG4gICAgICAgICAgICBjb25zdCBvblJlc29sdmUgPSAocHVyY2hhc2VfdW5pdHMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXllciA9IHBheWVyRGF0YSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJuQ29kZSA9IHR5cGVvZiB0aGlzLmNvbmZpZy5ibl9jb2Rlc1t0aGlzLmNvbmZpZy5jb250ZXh0XSAhPT0gJ3VuZGVmaW5lZCcgP1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5ibl9jb2Rlc1t0aGlzLmNvbmZpZy5jb250ZXh0XSA6ICcnO1xuICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaCh0aGlzLmNvbmZpZy5hamF4LmNyZWF0ZV9vcmRlci5lbmRwb2ludCwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9uY2U6IHRoaXMuY29uZmlnLmFqYXguY3JlYXRlX29yZGVyLm5vbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHVyY2hhc2VfdW5pdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXllcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGJuX2NvZGU6Ym5Db2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDp0aGlzLmNvbmZpZy5jb250ZXh0XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihkYXRhLmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YS5pZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnVwZGF0ZUNhcnQudXBkYXRlKG9uUmVzb2x2ZSwgZ2V0UHJvZHVjdHMoKSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZU9yZGVyO1xuICAgIH1cblxuICAgIHZhcmlhdGlvbnMoKVxuICAgIHtcblxuICAgICAgICBpZiAoISB0aGlzLmhhc1ZhcmlhdGlvbnMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IFsuLi50aGlzLmZvcm1FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbmFtZV49J2F0dHJpYnV0ZV8nXVwiKV0ubWFwKFxuICAgICAgICAgICAgKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOmVsZW1lbnQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ZWxlbWVudC5uYW1lXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgICB9XG5cbiAgICBoYXNWYXJpYXRpb25zKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1FbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygndmFyaWF0aW9uc19mb3JtJyk7XG4gICAgfVxuXG4gICAgaXNHcm91cGVkUHJvZHVjdCgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2dyb3VwZWRfZm9ybScpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IFNpbmdsZVByb2R1Y3RBY3Rpb25IYW5kbGVyO1xuIiwiaW1wb3J0IEVycm9ySGFuZGxlciBmcm9tICcuLi9FcnJvckhhbmRsZXInO1xuaW1wb3J0IFVwZGF0ZUNhcnQgZnJvbSBcIi4uL0hlbHBlci9VcGRhdGVDYXJ0XCI7XG5pbXBvcnQgU2luZ2xlUHJvZHVjdEFjdGlvbkhhbmRsZXIgZnJvbSBcIi4uL0FjdGlvbkhhbmRsZXIvU2luZ2xlUHJvZHVjdEFjdGlvbkhhbmRsZXJcIjtcblxuY2xhc3MgU2luZ2xlUHJvZHVjdEJvb3RzdGFwIHtcbiAgICBjb25zdHJ1Y3RvcihnYXRld2F5LCByZW5kZXJlciwgbWVzc2FnZXMpIHtcbiAgICAgICAgdGhpcy5nYXRld2F5ID0gZ2F0ZXdheTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLm1lc3NhZ2VzID0gbWVzc2FnZXM7XG4gICAgfVxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNob3VsZFJlbmRlcigpKSB7XG4gICAgICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUJ1dHRvbnModGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cblxuICAgIHNob3VsZFJlbmRlcigpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0uY2FydCcpID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkhhbmRsZXIgPSBuZXcgU2luZ2xlUHJvZHVjdEFjdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICB0aGlzLmdhdGV3YXksXG4gICAgICAgICAgICBuZXcgVXBkYXRlQ2FydChcbiAgICAgICAgICAgICAgICB0aGlzLmdhdGV3YXkuYWpheC5jaGFuZ2VfY2FydC5lbmRwb2ludCxcbiAgICAgICAgICAgICAgICB0aGlzLmdhdGV3YXkuYWpheC5jaGFuZ2VfY2FydC5ub25jZSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaG93QnV0dG9ucyh0aGlzLmdhdGV3YXkuYnV0dG9uLndyYXBwZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2hvd0J1dHRvbnModGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlcik7XG4gICAgICAgICAgICAgICAgbGV0IHByaWNlVGV4dCA9IFwiMFwiO1xuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtLmNhcnQgaW5zIC53b29jb21tZXJjZS1QcmljZS1hbW91bnQnKSkge1xuICAgICAgICAgICAgICAgICAgICBwcmljZVRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtLmNhcnQgaW5zIC53b29jb21tZXJjZS1QcmljZS1hbW91bnQnKS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0uY2FydCAud29vY29tbWVyY2UtUHJpY2UtYW1vdW50JykpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpY2VUZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZm9ybS5jYXJ0IC53b29jb21tZXJjZS1QcmljZS1hbW91bnQnKS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGFtb3VudCA9IHBhcnNlSW50KHByaWNlVGV4dC5yZXBsYWNlKC8oW15cXGQsXFwuXFxzXSopL2csICcnKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlcy5yZW5kZXJXaXRoQW1vdW50KGFtb3VudClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5oaWRlQnV0dG9ucyh0aGlzLmdhdGV3YXkuYnV0dG9uLndyYXBwZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUJ1dHRvbnModGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZm9ybS5jYXJ0JyksXG4gICAgICAgICAgICBuZXcgRXJyb3JIYW5kbGVyKHRoaXMuZ2F0ZXdheS5sYWJlbHMuZXJyb3IuZ2VuZXJpYyksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIoXG4gICAgICAgICAgICB0aGlzLmdhdGV3YXkuYnV0dG9uLndyYXBwZXIsXG4gICAgICAgICAgICB0aGlzLmdhdGV3YXkuaG9zdGVkX2ZpZWxkcy53cmFwcGVyLFxuICAgICAgICAgICAgYWN0aW9uSGFuZGxlci5jb25maWd1cmF0aW9uKCksXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaW5nbGVQcm9kdWN0Qm9vdHN0YXA7IiwiaW1wb3J0IENhcnRBY3Rpb25IYW5kbGVyIGZyb20gJy4uL0FjdGlvbkhhbmRsZXIvQ2FydEFjdGlvbkhhbmRsZXInO1xuaW1wb3J0IEVycm9ySGFuZGxlciBmcm9tICcuLi9FcnJvckhhbmRsZXInO1xuXG5jbGFzcyBDYXJ0Qm9vdHN0cmFwIHtcbiAgICBjb25zdHJ1Y3RvcihnYXRld2F5LCByZW5kZXJlcikge1xuICAgICAgICB0aGlzLmdhdGV3YXkgPSBnYXRld2F5O1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgfVxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNob3VsZFJlbmRlcigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlcigpO1xuXG4gICAgICAgIGpRdWVyeShkb2N1bWVudC5ib2R5KS5vbigndXBkYXRlZF9jYXJ0X3RvdGFscyB1cGRhdGVkX2NoZWNrb3V0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2hvdWxkUmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmdhdGV3YXkuYnV0dG9uLndyYXBwZXIpICE9PVxuICAgICAgICAgICAgbnVsbCB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZ2F0ZXdheS5ob3N0ZWRfZmllbGRzLndyYXBwZXIpICE9PVxuICAgICAgICAgICAgbnVsbDtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkhhbmRsZXIgPSBuZXcgQ2FydEFjdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICBQYXlQYWxDb21tZXJjZUdhdGV3YXksXG4gICAgICAgICAgICBuZXcgRXJyb3JIYW5kbGVyKHRoaXMuZ2F0ZXdheS5sYWJlbHMuZXJyb3IuZ2VuZXJpYyksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIoXG4gICAgICAgICAgICB0aGlzLmdhdGV3YXkuYnV0dG9uLndyYXBwZXIsXG4gICAgICAgICAgICB0aGlzLmdhdGV3YXkuaG9zdGVkX2ZpZWxkcy53cmFwcGVyLFxuICAgICAgICAgICAgYWN0aW9uSGFuZGxlci5jb25maWd1cmF0aW9uKCksXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDYXJ0Qm9vdHN0cmFwO1xuIiwiY29uc3Qgb25BcHByb3ZlID0gKGNvbnRleHQsIGVycm9ySGFuZGxlciwgc3Bpbm5lcikgPT4ge1xuICAgIHJldHVybiAoZGF0YSwgYWN0aW9ucykgPT4ge1xuICAgICAgICBzcGlubmVyLmJsb2NrKCk7XG4gICAgICAgIHJldHVybiBmZXRjaChjb250ZXh0LmNvbmZpZy5hamF4LmFwcHJvdmVfb3JkZXIuZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIG5vbmNlOiBjb250ZXh0LmNvbmZpZy5hamF4LmFwcHJvdmVfb3JkZXIubm9uY2UsXG4gICAgICAgICAgICAgICAgb3JkZXJfaWQ6ZGF0YS5vcmRlcklEXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KS50aGVuKChyZXMpPT57XG4gICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgICAgICAgfSkudGhlbigoZGF0YSk9PntcbiAgICAgICAgICAgIHNwaW5uZXIudW5ibG9jaygpO1xuICAgICAgICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5kYXRhLmNvZGUgPT09IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIubWVzc2FnZShkYXRhLmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyLmdlbmVyaWNFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbnMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBhY3Rpb25zLnJlc3RhcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb25zLnJlc3RhcnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGRhdGEuZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwbGFjZV9vcmRlcicpLmNsaWNrKClcbiAgICAgICAgfSk7XG5cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG9uQXBwcm92ZTtcbiIsImltcG9ydCBvbkFwcHJvdmUgZnJvbSAnLi4vT25BcHByb3ZlSGFuZGxlci9vbkFwcHJvdmVGb3JQYXlOb3cuanMnO1xuaW1wb3J0IHtwYXllckRhdGF9IGZyb20gXCIuLi9IZWxwZXIvUGF5ZXJEYXRhXCI7XG5cbmNsYXNzIENoZWNrb3V0QWN0aW9uSGFuZGxlciB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWcsIGVycm9ySGFuZGxlciwgc3Bpbm5lcikge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7XG4gICAgICAgIHRoaXMuc3Bpbm5lciA9IHNwaW5uZXI7XG4gICAgfVxuXG4gICAgY29uZmlndXJhdGlvbigpIHtcbiAgICAgICAgY29uc3Qgc3Bpbm5lciA9IHRoaXMuc3Bpbm5lcjtcbiAgICAgICAgY29uc3QgY3JlYXRlT3JkZXIgPSAoZGF0YSwgYWN0aW9ucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5ZXIgPSBwYXllckRhdGEoKTtcbiAgICAgICAgICAgIGNvbnN0IGJuQ29kZSA9IHR5cGVvZiB0aGlzLmNvbmZpZy5ibl9jb2Rlc1t0aGlzLmNvbmZpZy5jb250ZXh0XSAhPT0gJ3VuZGVmaW5lZCcgP1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmJuX2NvZGVzW3RoaXMuY29uZmlnLmNvbnRleHRdIDogJyc7XG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9ySGFuZGxlciA9IHRoaXMuZXJyb3JIYW5kbGVyO1xuXG4gICAgICAgICAgICBjb25zdCBmb3JtU2VsZWN0b3IgPSB0aGlzLmNvbmZpZy5jb250ZXh0ID09PSAnY2hlY2tvdXQnID8gJ2Zvcm0uY2hlY2tvdXQnIDogJ2Zvcm0jb3JkZXJfcmV2aWV3JztcbiAgICAgICAgICAgIGNvbnN0IGZvcm1WYWx1ZXMgPSBqUXVlcnkoZm9ybVNlbGVjdG9yKS5zZXJpYWxpemUoKTtcblxuICAgICAgICAgICAgY29uc3QgY3JlYXRlYWNjb3VudCA9IGpRdWVyeSgnI2NyZWF0ZWFjY291bnQnKS5pcyhcIjpjaGVja2VkXCIpID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4gZmV0Y2godGhpcy5jb25maWcuYWpheC5jcmVhdGVfb3JkZXIuZW5kcG9pbnQsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIG5vbmNlOiB0aGlzLmNvbmZpZy5hamF4LmNyZWF0ZV9vcmRlci5ub25jZSxcbiAgICAgICAgICAgICAgICAgICAgcGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgIGJuX2NvZGU6Ym5Db2RlLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OnRoaXMuY29uZmlnLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyX2lkOnRoaXMuY29uZmlnLm9yZGVyX2lkLFxuICAgICAgICAgICAgICAgICAgICBmb3JtOmZvcm1WYWx1ZXMsXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWFjY291bnQ6IGNyZWF0ZWFjY291bnRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XG4gICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Bpbm5lci51bmJsb2NrKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vaGFuZGxlIGJvdGggbWVzc2FnZXMgc2VudCBmcm9tIFdvb2NvbW1lcmNlIChkYXRhLm1lc3NhZ2VzKSBhbmQgdGhpcyBwbHVnaW4gKGRhdGEuZGF0YS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGRhdGEubWVzc2FnZXMpICE9PSAndW5kZWZpbmVkJyApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvbVBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlci5hcHBlbmRQcmVwYXJlZEVycm9yTWVzc2FnZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tUGFyc2VyLnBhcnNlRnJvbVN0cmluZyhkYXRhLm1lc3NhZ2VzLCAndGV4dC9odG1sJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJ3VsJylcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIubWVzc2FnZShkYXRhLmRhdGEubWVzc2FnZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgJ3BwY3AtcmVzdW1lLW9yZGVyJyk7XG4gICAgICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIGRhdGEuZGF0YS5wdXJjaGFzZV91bml0c1swXS5jdXN0b21faWQpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZm9ybVNlbGVjdG9yKS5hcHBlbmQoaW5wdXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGEuaWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3JlYXRlT3JkZXIsXG4gICAgICAgICAgICBvbkFwcHJvdmU6b25BcHByb3ZlKHRoaXMsIHRoaXMuZXJyb3JIYW5kbGVyLCB0aGlzLnNwaW5uZXIpLFxuICAgICAgICAgICAgb25DYW5jZWw6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBzcGlubmVyLnVuYmxvY2soKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuZ2VuZXJpY0Vycm9yKCk7XG4gICAgICAgICAgICAgICAgc3Bpbm5lci51bmJsb2NrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENoZWNrb3V0QWN0aW9uSGFuZGxlcjtcbiIsImltcG9ydCBFcnJvckhhbmRsZXIgZnJvbSAnLi4vRXJyb3JIYW5kbGVyJztcbmltcG9ydCBDaGVja291dEFjdGlvbkhhbmRsZXIgZnJvbSAnLi4vQWN0aW9uSGFuZGxlci9DaGVja291dEFjdGlvbkhhbmRsZXInO1xuXG5jbGFzcyBDaGVja291dEJvb3RzdGFwIHtcbiAgICBjb25zdHJ1Y3RvcihnYXRld2F5LCByZW5kZXJlciwgbWVzc2FnZXMsIHNwaW5uZXIpIHtcbiAgICAgICAgdGhpcy5nYXRld2F5ID0gZ2F0ZXdheTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLm1lc3NhZ2VzID0gbWVzc2FnZXM7XG4gICAgICAgIHRoaXMuc3Bpbm5lciA9IHNwaW5uZXI7XG4gICAgfVxuXG4gICAgaW5pdCgpIHtcblxuICAgICAgICB0aGlzLnJlbmRlcigpO1xuXG4gICAgICAgIGpRdWVyeShkb2N1bWVudC5ib2R5KS5vbigndXBkYXRlZF9jaGVja291dCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyKClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgalF1ZXJ5KGRvY3VtZW50LmJvZHkpLlxuICAgICAgICAgIG9uKCd1cGRhdGVkX2NoZWNrb3V0IHBheW1lbnRfbWV0aG9kX3NlbGVjdGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnN3aXRjaEJldHdlZW5QYXlQYWxhbmRPcmRlckJ1dHRvbigpXG4gICAgICAgICAgICAgIHRoaXMuZGlzcGxheVBsYWNlT3JkZXJCdXR0b25Gb3JTYXZlZENyZWRpdENhcmRzKClcblxuICAgICAgICAgIH0pXG5cbiAgICAgICAgalF1ZXJ5KGRvY3VtZW50KS5vbignaG9zdGVkX2ZpZWxkc19sb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBqUXVlcnkoJyNzYXZlZC1jcmVkaXQtY2FyZCcpLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5UGxhY2VPcmRlckJ1dHRvbkZvclNhdmVkQ3JlZGl0Q2FyZHMoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zd2l0Y2hCZXR3ZWVuUGF5UGFsYW5kT3JkZXJCdXR0b24oKVxuICAgICAgICB0aGlzLmRpc3BsYXlQbGFjZU9yZGVyQnV0dG9uRm9yU2F2ZWRDcmVkaXRDYXJkcygpXG4gICAgfVxuXG4gICAgc2hvdWxkUmVuZGVyKCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmdhdGV3YXkuYnV0dG9uLmNhbmNlbF93cmFwcGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5nYXRld2F5LmJ1dHRvbi53cmFwcGVyKSAhPT0gbnVsbCB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZ2F0ZXdheS5ob3N0ZWRfZmllbGRzLndyYXBwZXIpICE9PSBudWxsO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNob3VsZFJlbmRlcigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlciArICc+ZGl2JykpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlciArICc+ZGl2Jykuc2V0QXR0cmlidXRlKCdzdHlsZScsICcnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3Rpb25IYW5kbGVyID0gbmV3IENoZWNrb3V0QWN0aW9uSGFuZGxlcihcbiAgICAgICAgICAgIFBheVBhbENvbW1lcmNlR2F0ZXdheSxcbiAgICAgICAgICAgIG5ldyBFcnJvckhhbmRsZXIodGhpcy5nYXRld2F5LmxhYmVscy5lcnJvci5nZW5lcmljKSxcbiAgICAgICAgICAgIHRoaXMuc3Bpbm5lclxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKFxuICAgICAgICAgICAgdGhpcy5nYXRld2F5LmJ1dHRvbi53cmFwcGVyLFxuICAgICAgICAgICAgdGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlcixcbiAgICAgICAgICAgIGFjdGlvbkhhbmRsZXIuY29uZmlndXJhdGlvbigpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHN3aXRjaEJldHdlZW5QYXlQYWxhbmRPcmRlckJ1dHRvbigpIHtcbiAgICAgICAgalF1ZXJ5KCcjc2F2ZWQtY3JlZGl0LWNhcmQnKS52YWwoalF1ZXJ5KCcjc2F2ZWQtY3JlZGl0LWNhcmQgb3B0aW9uOmZpcnN0JykudmFsKCkpO1xuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYXltZW50TWV0aG9kID0galF1ZXJ5KFxuICAgICAgICAgICAgJ2lucHV0W25hbWU9XCJwYXltZW50X21ldGhvZFwiXTpjaGVja2VkJykudmFsKCk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRQYXltZW50TWV0aG9kICE9PSAncHBjcC1nYXRld2F5JyAmJiBjdXJyZW50UGF5bWVudE1ldGhvZCAhPT0gJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheScpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUJ1dHRvbnModGhpcy5nYXRld2F5LmJ1dHRvbi53cmFwcGVyKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUJ1dHRvbnModGhpcy5nYXRld2F5Lm1lc3NhZ2VzLndyYXBwZXIpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5oaWRlQnV0dG9ucyh0aGlzLmdhdGV3YXkuaG9zdGVkX2ZpZWxkcy53cmFwcGVyKTtcbiAgICAgICAgICAgIGpRdWVyeSgnI3BsYWNlX29yZGVyJykuc2hvdygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgalF1ZXJ5KCcjcGxhY2Vfb3JkZXInKS5oaWRlKCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFBheW1lbnRNZXRob2QgPT09ICdwcGNwLWdhdGV3YXknKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaG93QnV0dG9ucyh0aGlzLmdhdGV3YXkuYnV0dG9uLndyYXBwZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2hvd0J1dHRvbnModGhpcy5nYXRld2F5Lm1lc3NhZ2VzLndyYXBwZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZXMucmVuZGVyKClcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmhpZGVCdXR0b25zKHRoaXMuZ2F0ZXdheS5ob3N0ZWRfZmllbGRzLndyYXBwZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VycmVudFBheW1lbnRNZXRob2QgPT09ICdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXknKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5oaWRlQnV0dG9ucyh0aGlzLmdhdGV3YXkuYnV0dG9uLndyYXBwZXIpXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5oaWRlQnV0dG9ucyh0aGlzLmdhdGV3YXkubWVzc2FnZXMud3JhcHBlcilcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNob3dCdXR0b25zKHRoaXMuZ2F0ZXdheS5ob3N0ZWRfZmllbGRzLndyYXBwZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwbGF5UGxhY2VPcmRlckJ1dHRvbkZvclNhdmVkQ3JlZGl0Q2FyZHMoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYXltZW50TWV0aG9kID0galF1ZXJ5KFxuICAgICAgICAgICdpbnB1dFtuYW1lPVwicGF5bWVudF9tZXRob2RcIl06Y2hlY2tlZCcpLnZhbCgpO1xuICAgICAgICBpZiAoY3VycmVudFBheW1lbnRNZXRob2QgIT09ICdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXknKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoalF1ZXJ5KCcjc2F2ZWQtY3JlZGl0LWNhcmQnKS5sZW5ndGggJiYgalF1ZXJ5KCcjc2F2ZWQtY3JlZGl0LWNhcmQnKS52YWwoKSAhPT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUJ1dHRvbnModGhpcy5nYXRld2F5LmJ1dHRvbi53cmFwcGVyKVxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5oaWRlQnV0dG9ucyh0aGlzLmdhdGV3YXkubWVzc2FnZXMud3JhcHBlcilcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUJ1dHRvbnModGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlcilcbiAgICAgICAgICAgIGpRdWVyeSgnI3BsYWNlX29yZGVyJykuc2hvdygpXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVDcmVkaXRDYXJkRmllbGRzKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGpRdWVyeSgnI3BsYWNlX29yZGVyJykuaGlkZSgpXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmhpZGVCdXR0b25zKHRoaXMuZ2F0ZXdheS5idXR0b24ud3JhcHBlcilcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUJ1dHRvbnModGhpcy5nYXRld2F5Lm1lc3NhZ2VzLndyYXBwZXIpXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNob3dCdXR0b25zKHRoaXMuZ2F0ZXdheS5ob3N0ZWRfZmllbGRzLndyYXBwZXIpXG4gICAgICAgICAgICB0aGlzLmVuYWJsZUNyZWRpdENhcmRGaWVsZHMoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzYWJsZUNyZWRpdENhcmRGaWVsZHMoKSB7XG4gICAgICAgIGpRdWVyeSgnbGFiZWxbZm9yPVwicHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtbnVtYmVyXCJdJykuYWRkQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCcjcHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtbnVtYmVyJykuYWRkQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCdsYWJlbFtmb3I9XCJwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1leHBpcnlcIl0nKS5hZGRDbGFzcygncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWZvcm0tZmllbGQtZGlzYWJsZWQnKVxuICAgICAgICBqUXVlcnkoJyNwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1leHBpcnknKS5hZGRDbGFzcygncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWZvcm0tZmllbGQtZGlzYWJsZWQnKVxuICAgICAgICBqUXVlcnkoJ2xhYmVsW2Zvcj1cInBwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLWN2Y1wiXScpLmFkZENsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnI3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLWN2YycpLmFkZENsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnbGFiZWxbZm9yPVwidmF1bHRcIl0nKS5hZGRDbGFzcygncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWZvcm0tZmllbGQtZGlzYWJsZWQnKVxuICAgICAgICBqUXVlcnkoJyNwcGNwLWNyZWRpdC1jYXJkLXZhdWx0JykuYWRkQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCcjcHBjcC1jcmVkaXQtY2FyZC12YXVsdCcpLmF0dHIoXCJkaXNhYmxlZFwiLCB0cnVlKVxuICAgICAgICB0aGlzLnJlbmRlcmVyLmRpc2FibGVDcmVkaXRDYXJkRmllbGRzKClcbiAgICB9XG5cbiAgICBlbmFibGVDcmVkaXRDYXJkRmllbGRzKCkge1xuICAgICAgICBqUXVlcnkoJ2xhYmVsW2Zvcj1cInBwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLW51bWJlclwiXScpLnJlbW92ZUNsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnI3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLW51bWJlcicpLnJlbW92ZUNsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnbGFiZWxbZm9yPVwicHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtZXhwaXJ5XCJdJykucmVtb3ZlQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCcjcHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtZXhwaXJ5JykucmVtb3ZlQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCdsYWJlbFtmb3I9XCJwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1jdmNcIl0nKS5yZW1vdmVDbGFzcygncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWZvcm0tZmllbGQtZGlzYWJsZWQnKVxuICAgICAgICBqUXVlcnkoJyNwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1jdmMnKS5yZW1vdmVDbGFzcygncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWZvcm0tZmllbGQtZGlzYWJsZWQnKVxuICAgICAgICBqUXVlcnkoJ2xhYmVsW2Zvcj1cInZhdWx0XCJdJykucmVtb3ZlQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCcjcHBjcC1jcmVkaXQtY2FyZC12YXVsdCcpLnJlbW92ZUNsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnI3BwY3AtY3JlZGl0LWNhcmQtdmF1bHQnKS5hdHRyKFwiZGlzYWJsZWRcIiwgZmFsc2UpXG4gICAgICAgIHRoaXMucmVuZGVyZXIuZW5hYmxlQ3JlZGl0Q2FyZEZpZWxkcygpXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDaGVja291dEJvb3RzdGFwXG4iLCJpbXBvcnQgRXJyb3JIYW5kbGVyIGZyb20gJy4uL0Vycm9ySGFuZGxlcic7XG5pbXBvcnQgQ2hlY2tvdXRBY3Rpb25IYW5kbGVyIGZyb20gJy4uL0FjdGlvbkhhbmRsZXIvQ2hlY2tvdXRBY3Rpb25IYW5kbGVyJztcblxuY2xhc3MgUGF5Tm93Qm9vdHN0cmFwIHtcbiAgICBjb25zdHJ1Y3RvcihnYXRld2F5LCByZW5kZXJlciwgbWVzc2FnZXMsIHNwaW5uZXIpIHtcbiAgICAgICAgdGhpcy5nYXRld2F5ID0gZ2F0ZXdheTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLm1lc3NhZ2VzID0gbWVzc2FnZXM7XG4gICAgICAgIHRoaXMuc3Bpbm5lciA9IHNwaW5uZXI7XG4gICAgfVxuXG4gICAgaW5pdCgpIHtcblxuICAgICAgICB0aGlzLnJlbmRlcigpO1xuXG4gICAgICAgIGpRdWVyeShkb2N1bWVudC5ib2R5KS5vbigndXBkYXRlZF9jaGVja291dCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGpRdWVyeShkb2N1bWVudC5ib2R5KS5cbiAgICAgICAgb24oJ3VwZGF0ZWRfY2hlY2tvdXQgcGF5bWVudF9tZXRob2Rfc2VsZWN0ZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN3aXRjaEJldHdlZW5QYXlQYWxhbmRPcmRlckJ1dHRvbigpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zd2l0Y2hCZXR3ZWVuUGF5UGFsYW5kT3JkZXJCdXR0b24oKTtcbiAgICB9XG5cbiAgICBzaG91bGRSZW5kZXIoKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZ2F0ZXdheS5idXR0b24uY2FuY2VsX3dyYXBwZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmdhdGV3YXkuYnV0dG9uLndyYXBwZXIpICE9PSBudWxsIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlcikgIT09IG51bGw7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkUmVuZGVyKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmdhdGV3YXkuaG9zdGVkX2ZpZWxkcy53cmFwcGVyICsgJz5kaXYnKSkge1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmdhdGV3YXkuaG9zdGVkX2ZpZWxkcy53cmFwcGVyICsgJz5kaXYnKS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjdGlvbkhhbmRsZXIgPSBuZXcgQ2hlY2tvdXRBY3Rpb25IYW5kbGVyKFxuICAgICAgICAgICAgUGF5UGFsQ29tbWVyY2VHYXRld2F5LFxuICAgICAgICAgICAgbmV3IEVycm9ySGFuZGxlcih0aGlzLmdhdGV3YXkubGFiZWxzLmVycm9yLmdlbmVyaWMpLFxuICAgICAgICAgICAgdGhpcy5zcGlubmVyXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIoXG4gICAgICAgICAgICB0aGlzLmdhdGV3YXkuYnV0dG9uLndyYXBwZXIsXG4gICAgICAgICAgICB0aGlzLmdhdGV3YXkuaG9zdGVkX2ZpZWxkcy53cmFwcGVyLFxuICAgICAgICAgICAgYWN0aW9uSGFuZGxlci5jb25maWd1cmF0aW9uKCksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3dpdGNoQmV0d2VlblBheVBhbGFuZE9yZGVyQnV0dG9uKCkge1xuICAgICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpXG4gICAgICAgIGlmICh1cmxQYXJhbXMuaGFzKCdjaGFuZ2VfcGF5bWVudF9tZXRob2QnKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50UGF5bWVudE1ldGhvZCA9IGpRdWVyeShcbiAgICAgICAgICAgICdpbnB1dFtuYW1lPVwicGF5bWVudF9tZXRob2RcIl06Y2hlY2tlZCcpLnZhbCgpO1xuXG4gICAgICAgIGlmIChjdXJyZW50UGF5bWVudE1ldGhvZCAhPT0gJ3BwY3AtZ2F0ZXdheScgJiYgY3VycmVudFBheW1lbnRNZXRob2QgIT09ICdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXknKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmhpZGVCdXR0b25zKHRoaXMuZ2F0ZXdheS5idXR0b24ud3JhcHBlcik7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmhpZGVCdXR0b25zKHRoaXMuZ2F0ZXdheS5tZXNzYWdlcy53cmFwcGVyKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUJ1dHRvbnModGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlcik7XG4gICAgICAgICAgICBqUXVlcnkoJyNwbGFjZV9vcmRlcicpLnNob3coKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGpRdWVyeSgnI3BsYWNlX29yZGVyJykuaGlkZSgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXltZW50TWV0aG9kID09PSAncHBjcC1nYXRld2F5Jykge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2hvd0J1dHRvbnModGhpcy5nYXRld2F5LmJ1dHRvbi53cmFwcGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNob3dCdXR0b25zKHRoaXMuZ2F0ZXdheS5tZXNzYWdlcy53cmFwcGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VzLnJlbmRlcigpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUJ1dHRvbnModGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VycmVudFBheW1lbnRNZXRob2QgPT09ICdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXknKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5oaWRlQnV0dG9ucyh0aGlzLmdhdGV3YXkuYnV0dG9uLndyYXBwZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUJ1dHRvbnModGhpcy5nYXRld2F5Lm1lc3NhZ2VzLndyYXBwZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2hvd0J1dHRvbnModGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBheU5vd0Jvb3RzdHJhcDtcbiIsImNsYXNzIFJlbmRlcmVyIHtcbiAgICBjb25zdHJ1Y3RvcihjcmVkaXRDYXJkUmVuZGVyZXIsIGRlZmF1bHRDb25maWcpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0Q29uZmlnID0gZGVmYXVsdENvbmZpZztcbiAgICAgICAgdGhpcy5jcmVkaXRDYXJkUmVuZGVyZXIgPSBjcmVkaXRDYXJkUmVuZGVyZXI7XG4gICAgfVxuXG4gICAgcmVuZGVyKHdyYXBwZXIsIGhvc3RlZEZpZWxkc1dyYXBwZXIsIGNvbnRleHRDb25maWcpIHtcblxuICAgICAgICB0aGlzLnJlbmRlckJ1dHRvbnMod3JhcHBlciwgY29udGV4dENvbmZpZyk7XG4gICAgICAgIHRoaXMuY3JlZGl0Q2FyZFJlbmRlcmVyLnJlbmRlcihob3N0ZWRGaWVsZHNXcmFwcGVyLCBjb250ZXh0Q29uZmlnKTtcbiAgICB9XG5cbiAgICByZW5kZXJCdXR0b25zKHdyYXBwZXIsIGNvbnRleHRDb25maWcpIHtcbiAgICAgICAgaWYgKCEgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih3cmFwcGVyKSB8fCB0aGlzLmlzQWxyZWFkeVJlbmRlcmVkKHdyYXBwZXIpIHx8ICd1bmRlZmluZWQnID09PSB0eXBlb2YgcGF5cGFsLkJ1dHRvbnMgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdHlsZSA9IHdyYXBwZXIgPT09IHRoaXMuZGVmYXVsdENvbmZpZy5idXR0b24ud3JhcHBlciA/IHRoaXMuZGVmYXVsdENvbmZpZy5idXR0b24uc3R5bGUgOiB0aGlzLmRlZmF1bHRDb25maWcuYnV0dG9uLm1pbmlfY2FydF9zdHlsZTtcbiAgICAgICAgcGF5cGFsLkJ1dHRvbnMoe1xuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAuLi5jb250ZXh0Q29uZmlnLFxuICAgICAgICB9KS5yZW5kZXIod3JhcHBlcik7XG4gICAgfVxuXG4gICAgaXNBbHJlYWR5UmVuZGVyZWQod3JhcHBlcikge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih3cmFwcGVyKS5oYXNDaGlsZE5vZGVzKCk7XG4gICAgfVxuXG4gICAgaGlkZUJ1dHRvbnMoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgICAgaWYgKCEgZG9tRWxlbWVudCApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBkb21FbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHNob3dCdXR0b25zKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZG9tRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudCk7XG4gICAgICAgIGlmICghIGRvbUVsZW1lbnQgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZG9tRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZGlzYWJsZUNyZWRpdENhcmRGaWVsZHMoKSB7XG4gICAgICAgIHRoaXMuY3JlZGl0Q2FyZFJlbmRlcmVyLmRpc2FibGVGaWVsZHMoKTtcbiAgICB9XG5cbiAgICBlbmFibGVDcmVkaXRDYXJkRmllbGRzKCkge1xuICAgICAgICB0aGlzLmNyZWRpdENhcmRSZW5kZXJlci5lbmFibGVGaWVsZHMoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlbmRlcmVyO1xuIiwiY29uc3QgZGNjSW5wdXRGYWN0b3J5ID0gKG9yaWdpbmFsKSA9PiB7XG4gICAgY29uc3Qgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUob3JpZ2luYWwpO1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgb3JpZ2luYWwuaWQpO1xuICAgIE9iamVjdC52YWx1ZXMoc3R5bGVzKS5mb3JFYWNoKCAocHJvcCkgPT4ge1xuICAgICAgICBpZiAoISBzdHlsZXNbcHJvcF0gfHwgISBpc05hTihwcm9wKSApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBuZXdFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHByb3AsJycgKyBzdHlsZXNbcHJvcF0pO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG5leHBvcnQgZGVmYXVsdCBkY2NJbnB1dEZhY3Rvcnk7IiwiaW1wb3J0IGRjY0lucHV0RmFjdG9yeSBmcm9tIFwiLi4vSGVscGVyL0RjY0lucHV0RmFjdG9yeVwiO1xuXG5jbGFzcyBDcmVkaXRDYXJkUmVuZGVyZXIge1xuXG4gICAgY29uc3RydWN0b3IoZGVmYXVsdENvbmZpZywgZXJyb3JIYW5kbGVyLCBzcGlubmVyKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZyA9IGRlZmF1bHRDb25maWc7XG4gICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyO1xuICAgICAgICB0aGlzLnNwaW5uZXIgPSBzcGlubmVyO1xuICAgICAgICB0aGlzLmNhcmRWYWxpZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZvcm1WYWxpZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmN1cnJlbnRIb3N0ZWRGaWVsZHNJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZm9ybVN1Ym1pc3Npb25TdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmVuZGVyKHdyYXBwZXIsIGNvbnRleHRDb25maWcpIHtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0Q29uZmlnLmNvbnRleHQgIT09ICdjaGVja291dCdcbiAgICAgICAgICAgICAgICAmJiB0aGlzLmRlZmF1bHRDb25maWcuY29udGV4dCAhPT0gJ3BheS1ub3cnXG4gICAgICAgICAgICApXG4gICAgICAgICAgICB8fCB3cmFwcGVyID09PSBudWxsXG4gICAgICAgICAgICB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHdyYXBwZXIpID09PSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBwYXlwYWwuSG9zdGVkRmllbGRzID09PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgfHwgISBwYXlwYWwuSG9zdGVkRmllbGRzLmlzRWxpZ2libGUoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXJFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih3cmFwcGVyKTtcbiAgICAgICAgICAgIHdyYXBwZXJFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQod3JhcHBlckVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEhvc3RlZEZpZWxkc0luc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRIb3N0ZWRGaWVsZHNJbnN0YW5jZS50ZWFyZG93bigpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBjb25zb2xlLmVycm9yKGBIb3N0ZWQgZmllbGRzIHRlYXJkb3duIGVycm9yOiAke2Vycn1gKSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRIb3N0ZWRGaWVsZHNJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBnYXRlV2F5Qm94ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBheW1lbnRfYm94LnBheW1lbnRfbWV0aG9kX3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheScpO1xuICAgICAgICBjb25zdCBvbGREaXNwbGF5U3R5bGUgPSBnYXRlV2F5Qm94LnN0eWxlLmRpc3BsYXk7XG4gICAgICAgIGdhdGVXYXlCb3guc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgICAgY29uc3QgaGlkZURjY0dhdGV3YXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcHBjcC1oaWRlLWRjYycpO1xuICAgICAgICBpZiAoaGlkZURjY0dhdGV3YXkpIHtcbiAgICAgICAgICAgIGhpZGVEY2NHYXRld2F5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaGlkZURjY0dhdGV3YXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FyZE51bWJlckZpZWxkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLW51bWJlcicpO1xuXG4gICAgICAgIGNvbnN0IHN0eWxlc1JhdyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNhcmROdW1iZXJGaWVsZCk7XG4gICAgICAgIGxldCBzdHlsZXMgPSB7fTtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhzdHlsZXNSYXcpLmZvckVhY2goIChwcm9wKSA9PiB7XG4gICAgICAgICAgICBpZiAoISBzdHlsZXNSYXdbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHlsZXNbcHJvcF0gPSAnJyArIHN0eWxlc1Jhd1twcm9wXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2FyZE51bWJlciA9IGRjY0lucHV0RmFjdG9yeShjYXJkTnVtYmVyRmllbGQpO1xuICAgICAgICBjYXJkTnVtYmVyRmllbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoY2FyZE51bWJlciwgY2FyZE51bWJlckZpZWxkKTtcblxuICAgICAgICBjb25zdCBjYXJkRXhwaXJ5RmllbGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtZXhwaXJ5Jyk7XG4gICAgICAgIGNvbnN0IGNhcmRFeHBpcnkgPSBkY2NJbnB1dEZhY3RvcnkoY2FyZEV4cGlyeUZpZWxkKTtcbiAgICAgICAgY2FyZEV4cGlyeUZpZWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGNhcmRFeHBpcnksIGNhcmRFeHBpcnlGaWVsZCk7XG5cbiAgICAgICAgY29uc3QgY2FyZENvZGVGaWVsZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1jdmMnKTtcbiAgICAgICAgY29uc3QgY2FyZENvZGUgPSBkY2NJbnB1dEZhY3RvcnkoY2FyZENvZGVGaWVsZCk7XG4gICAgICAgIGNhcmRDb2RlRmllbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoY2FyZENvZGUsIGNhcmRDb2RlRmllbGQpO1xuXG4gICAgICAgIGdhdGVXYXlCb3guc3R5bGUuZGlzcGxheSA9IG9sZERpc3BsYXlTdHlsZTtcblxuICAgICAgICBjb25zdCBmb3JtV3JhcHBlciA9ICcucGF5bWVudF9ib3ggcGF5bWVudF9tZXRob2RfcHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5JztcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0Q29uZmlnLmVuZm9yY2VfdmF1bHRcbiAgICAgICAgICAgICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZm9ybVdyYXBwZXIgKyAnIC5wcGNwLWNyZWRpdC1jYXJkLXZhdWx0JylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGZvcm1XcmFwcGVyICsgJyAucHBjcC1jcmVkaXQtY2FyZC12YXVsdCcpLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihmb3JtV3JhcHBlciArICcgLnBwY3AtY3JlZGl0LWNhcmQtdmF1bHQnKS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcGF5cGFsLkhvc3RlZEZpZWxkcy5yZW5kZXIoe1xuICAgICAgICAgICAgY3JlYXRlT3JkZXI6IGNvbnRleHRDb25maWcuY3JlYXRlT3JkZXIsXG4gICAgICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAgICAgICAnaW5wdXQnOiBzdHlsZXNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgICBudW1iZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICcjcHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtbnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMuZGVmYXVsdENvbmZpZy5ob3N0ZWRfZmllbGRzLmxhYmVscy5jcmVkaXRfY2FyZF9udW1iZXIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjdnY6IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICcjcHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtY3ZjJyxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMuZGVmYXVsdENvbmZpZy5ob3N0ZWRfZmllbGRzLmxhYmVscy5jdnYsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBleHBpcmF0aW9uRGF0ZToge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJyNwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1leHBpcnknLFxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogdGhpcy5kZWZhdWx0Q29uZmlnLmhvc3RlZF9maWVsZHMubGFiZWxzLm1tX3l5LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbihob3N0ZWRGaWVsZHMgPT4ge1xuICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJob3N0ZWRfZmllbGRzX2xvYWRlZFwiKSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRIb3N0ZWRGaWVsZHNJbnN0YW5jZSA9IGhvc3RlZEZpZWxkcztcblxuICAgICAgICAgICAgaG9zdGVkRmllbGRzLm9uKCdpbnB1dFN1Ym1pdFJlcXVlc3QnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3VibWl0KGNvbnRleHRDb25maWcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBob3N0ZWRGaWVsZHMub24oJ2NhcmRUeXBlQ2hhbmdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCAhIGV2ZW50LmNhcmRzLmxlbmd0aCApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJkVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZENhcmRzID0gdGhpcy5kZWZhdWx0Q29uZmlnLmhvc3RlZF9maWVsZHMudmFsaWRfY2FyZHM7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJkVmFsaWQgPSB2YWxpZENhcmRzLmluZGV4T2YoZXZlbnQuY2FyZHNbMF0udHlwZSkgIT09IC0xO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGhvc3RlZEZpZWxkcy5vbigndmFsaWRpdHlDaGFuZ2UnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtVmFsaWQgPSBPYmplY3Qua2V5cyhldmVudC5maWVsZHMpLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmZpZWxkc1trZXldLmlzVmFsaWQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICB0aGlzLmZvcm1WYWxpZCA9IGZvcm1WYWxpZDtcblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5mb3JtU3VibWlzc2lvblN1YnNjcmliZWQpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHdyYXBwZXIgKyAnIGJ1dHRvbicpLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgICdjbGljaycsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdWJtaXQoY29udGV4dENvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybVN1Ym1pc3Npb25TdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BheW1lbnRfbWV0aG9kX3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheScpLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAnY2xpY2snLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsW2Zvcj1wcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1udW1iZXJdJykuY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgIH1cblxuICAgIGRpc2FibGVGaWVsZHMoKSB7XG4gICAgICAgIGlmKCB0aGlzLmN1cnJlbnRIb3N0ZWRGaWVsZHNJbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2Uuc2V0QXR0cmlidXRlKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ251bWJlcicsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlOiAnZGlzYWJsZWQnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2Uuc2V0QXR0cmlidXRlKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2N2dicsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlOiAnZGlzYWJsZWQnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2Uuc2V0QXR0cmlidXRlKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2V4cGlyYXRpb25EYXRlJyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGU6ICdkaXNhYmxlZCdcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlbmFibGVGaWVsZHMoKSB7XG4gICAgICAgIGlmKCB0aGlzLmN1cnJlbnRIb3N0ZWRGaWVsZHNJbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2UucmVtb3ZlQXR0cmlidXRlKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ251bWJlcicsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlOiAnZGlzYWJsZWQnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2UucmVtb3ZlQXR0cmlidXRlKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2N2dicsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlOiAnZGlzYWJsZWQnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2UucmVtb3ZlQXR0cmlidXRlKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2V4cGlyYXRpb25EYXRlJyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGU6ICdkaXNhYmxlZCdcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc3VibWl0KGNvbnRleHRDb25maWcpIHtcbiAgICAgICAgdGhpcy5zcGlubmVyLmJsb2NrKCk7XG4gICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmNsZWFyKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkICYmIHRoaXMuY2FyZFZhbGlkKSB7XG4gICAgICAgICAgICBjb25zdCBzYXZlX2NhcmQgPSB0aGlzLmRlZmF1bHRDb25maWcuc2F2ZV9jYXJkID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgdmF1bHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHBjcC1jcmVkaXQtY2FyZC12YXVsdCcpID9cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHBjcC1jcmVkaXQtY2FyZC12YXVsdCcpLmNoZWNrZWQgOiBzYXZlX2NhcmQ7XG4gICAgICAgICAgICBjb25zdCBjb250aW5nZW5jeSA9IHRoaXMuZGVmYXVsdENvbmZpZy5ob3N0ZWRfZmllbGRzLmNvbnRpbmdlbmN5O1xuICAgICAgICAgICAgY29uc3QgaG9zdGVkRmllbGRzRGF0YSA9IHtcbiAgICAgICAgICAgICAgICB2YXVsdDogdmF1bHRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoY29udGluZ2VuY3kgIT09ICdOT18zRF9TRUNVUkUnKSB7XG4gICAgICAgICAgICAgICAgaG9zdGVkRmllbGRzRGF0YS5jb250aW5nZW5jaWVzID0gW2NvbnRpbmdlbmN5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhvc3RlZEZpZWxkc0luc3RhbmNlLnN1Ym1pdChob3N0ZWRGaWVsZHNEYXRhKS50aGVuKChwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZC5vcmRlcklEID0gcGF5bG9hZC5vcmRlcklkO1xuICAgICAgICAgICAgICAgIHRoaXMuc3Bpbm5lci51bmJsb2NrKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHRDb25maWcub25BcHByb3ZlKHBheWxvYWQpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGlubmVyLnVuYmxvY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zcGlubmVyLnVuYmxvY2soKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAhIHRoaXMuY2FyZFZhbGlkID8gdGhpcy5kZWZhdWx0Q29uZmlnLmhvc3RlZF9maWVsZHMubGFiZWxzLmNhcmRfbm90X3N1cHBvcnRlZCA6IHRoaXMuZGVmYXVsdENvbmZpZy5ob3N0ZWRfZmllbGRzLmxhYmVscy5maWVsZHNfbm90X3ZhbGlkO1xuICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIubWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IENyZWRpdENhcmRSZW5kZXJlcjtcbiIsImNvbnN0IHN0b3JhZ2VLZXkgPSAncHBjcC1kYXRhLWNsaWVudC1pZCc7XG5cbmNvbnN0IHZhbGlkYXRlVG9rZW4gPSAodG9rZW4sIHVzZXIpID0+IHtcbiAgICBpZiAoISB0b2tlbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0b2tlbi51c2VyICE9PSB1c2VyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICBjb25zdCBpc0V4cGlyZWQgPSBjdXJyZW50VGltZSA+PSB0b2tlbi5leHBpcmF0aW9uICogMTAwMDtcbiAgICByZXR1cm4gISBpc0V4cGlyZWQ7XG59XG5cbmNvbnN0IHN0b3JlZFRva2VuRm9yVXNlciA9ICh1c2VyKSA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oc3RvcmFnZUtleSkpO1xuICAgIGlmICh2YWxpZGF0ZVRva2VuKHRva2VuLCB1c2VyKSkge1xuICAgICAgICByZXR1cm4gdG9rZW4udG9rZW47XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBzdG9yZVRva2VuID0gKHRva2VuKSA9PiB7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShzdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeSh0b2tlbikpO1xufVxuXG5jb25zdCBkYXRhQ2xpZW50SWRBdHRyaWJ1dGVIYW5kbGVyID0gKHNjcmlwdCwgY29uZmlnKSA9PiB7XG4gICAgZmV0Y2goY29uZmlnLmVuZHBvaW50LCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBub25jZTogY29uZmlnLm5vbmNlXG4gICAgICAgIH0pXG4gICAgfSkudGhlbigocmVzKT0+e1xuICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgICB9KS50aGVuKChkYXRhKT0+e1xuICAgICAgICBjb25zdCBpc1ZhbGlkID0gdmFsaWRhdGVUb2tlbihkYXRhLCBjb25maWcudXNlcik7XG4gICAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN0b3JlVG9rZW4oZGF0YSk7XG4gICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2xpZW50LXRva2VuJywgZGF0YS50b2tlbik7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHNjcmlwdCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRhdGFDbGllbnRJZEF0dHJpYnV0ZUhhbmRsZXI7XG4iLCJjbGFzcyBNZXNzYWdlUmVuZGVyZXIge1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgaWYgKCEgdGhpcy5zaG91bGRSZW5kZXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF5cGFsLk1lc3NhZ2VzKHtcbiAgICAgICAgICAgIGFtb3VudDogdGhpcy5jb25maWcuYW1vdW50LFxuICAgICAgICAgICAgcGxhY2VtZW50OiB0aGlzLmNvbmZpZy5wbGFjZW1lbnQsXG4gICAgICAgICAgICBzdHlsZTogdGhpcy5jb25maWcuc3R5bGVcbiAgICAgICAgfSkucmVuZGVyKHRoaXMuY29uZmlnLndyYXBwZXIpO1xuICAgIH1cblxuICAgIHJlbmRlcldpdGhBbW91bnQoYW1vdW50KSB7XG5cbiAgICAgICAgaWYgKCEgdGhpcy5zaG91bGRSZW5kZXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBuZXdXcmFwcGVyLnNldEF0dHJpYnV0ZSgnaWQnLCB0aGlzLmNvbmZpZy53cmFwcGVyLnJlcGxhY2UoJyMnLCAnJykpO1xuXG4gICAgICAgIGNvbnN0IHNpYmxpbmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuY29uZmlnLndyYXBwZXIpLm5leHRTaWJsaW5nO1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuY29uZmlnLndyYXBwZXIpLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmNvbmZpZy53cmFwcGVyKSk7XG4gICAgICAgIHNpYmxpbmcucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUobmV3V3JhcHBlciwgc2libGluZyk7XG4gICAgICAgIHBheXBhbC5NZXNzYWdlcyh7XG4gICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgICBwbGFjZW1lbnQ6IHRoaXMuY29uZmlnLnBsYWNlbWVudCxcbiAgICAgICAgICAgIHN0eWxlOiB0aGlzLmNvbmZpZy5zdHlsZVxuICAgICAgICB9KS5yZW5kZXIodGhpcy5jb25maWcud3JhcHBlcik7XG4gICAgfVxuXG4gICAgc2hvdWxkUmVuZGVyKCkge1xuXG4gICAgICAgIGlmICh0eXBlb2YgcGF5cGFsLk1lc3NhZ2VzID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgdGhpcy5jb25maWcud3JhcHBlciA9PT0gJ3VuZGVmaW5lZCcgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmNvbmZpZy53cmFwcGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IE1lc3NhZ2VSZW5kZXJlcjsiLCJjbGFzcyBTcGlubmVyIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRhcmdldCA9ICdmb3JtLndvb2NvbW1lcmNlLWNoZWNrb3V0JztcbiAgICB9XG5cbiAgICBzZXRUYXJnZXQodGFyZ2V0KSB7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIH1cblxuICAgIGJsb2NrKCkge1xuXG4gICAgICAgIGpRdWVyeSggdGhpcy50YXJnZXQgKS5ibG9jayh7XG4gICAgICAgICAgICBtZXNzYWdlOiBudWxsLFxuICAgICAgICAgICAgb3ZlcmxheUNTUzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICcjZmZmJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjZcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdW5ibG9jaygpIHtcblxuICAgICAgICBqUXVlcnkoIHRoaXMudGFyZ2V0ICkudW5ibG9jaygpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3Bpbm5lcjtcbiIsImltcG9ydCBNaW5pQ2FydEJvb3RzdGFwIGZyb20gJy4vbW9kdWxlcy9Db250ZXh0Qm9vdHN0cmFwL01pbmlDYXJ0Qm9vdHN0YXAnO1xuaW1wb3J0IFNpbmdsZVByb2R1Y3RCb290c3RhcCBmcm9tICcuL21vZHVsZXMvQ29udGV4dEJvb3RzdHJhcC9TaW5nbGVQcm9kdWN0Qm9vdHN0YXAnO1xuaW1wb3J0IENhcnRCb290c3RyYXAgZnJvbSAnLi9tb2R1bGVzL0NvbnRleHRCb290c3RyYXAvQ2FydEJvb3RzdGFwJztcbmltcG9ydCBDaGVja291dEJvb3RzdGFwIGZyb20gJy4vbW9kdWxlcy9Db250ZXh0Qm9vdHN0cmFwL0NoZWNrb3V0Qm9vdHN0YXAnO1xuaW1wb3J0IFBheU5vd0Jvb3RzdHJhcCBmcm9tIFwiLi9tb2R1bGVzL0NvbnRleHRCb290c3RyYXAvUGF5Tm93Qm9vdHN0cmFwXCI7XG5pbXBvcnQgUmVuZGVyZXIgZnJvbSAnLi9tb2R1bGVzL1JlbmRlcmVyL1JlbmRlcmVyJztcbmltcG9ydCBFcnJvckhhbmRsZXIgZnJvbSAnLi9tb2R1bGVzL0Vycm9ySGFuZGxlcic7XG5pbXBvcnQgQ3JlZGl0Q2FyZFJlbmRlcmVyIGZyb20gXCIuL21vZHVsZXMvUmVuZGVyZXIvQ3JlZGl0Q2FyZFJlbmRlcmVyXCI7XG5pbXBvcnQgZGF0YUNsaWVudElkQXR0cmlidXRlSGFuZGxlciBmcm9tIFwiLi9tb2R1bGVzL0RhdGFDbGllbnRJZEF0dHJpYnV0ZUhhbmRsZXJcIjtcbmltcG9ydCBNZXNzYWdlUmVuZGVyZXIgZnJvbSBcIi4vbW9kdWxlcy9SZW5kZXJlci9NZXNzYWdlUmVuZGVyZXJcIjtcbmltcG9ydCBTcGlubmVyIGZyb20gXCIuL21vZHVsZXMvSGVscGVyL1NwaW5uZXJcIjtcblxuY29uc3QgYm9vdHN0cmFwID0gKCkgPT4ge1xuICAgIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoUGF5UGFsQ29tbWVyY2VHYXRld2F5LmxhYmVscy5lcnJvci5nZW5lcmljKTtcbiAgICBjb25zdCBzcGlubmVyID0gbmV3IFNwaW5uZXIoKTtcbiAgICBjb25zdCBjcmVkaXRDYXJkUmVuZGVyZXIgPSBuZXcgQ3JlZGl0Q2FyZFJlbmRlcmVyKFBheVBhbENvbW1lcmNlR2F0ZXdheSwgZXJyb3JIYW5kbGVyLCBzcGlubmVyKTtcbiAgICBjb25zdCByZW5kZXJlciA9IG5ldyBSZW5kZXJlcihjcmVkaXRDYXJkUmVuZGVyZXIsIFBheVBhbENvbW1lcmNlR2F0ZXdheSk7XG4gICAgY29uc3QgbWVzc2FnZVJlbmRlcmVyID0gbmV3IE1lc3NhZ2VSZW5kZXJlcihQYXlQYWxDb21tZXJjZUdhdGV3YXkubWVzc2FnZXMpO1xuICAgIGNvbnN0IGNvbnRleHQgPSBQYXlQYWxDb21tZXJjZUdhdGV3YXkuY29udGV4dDtcbiAgICBpZiAoY29udGV4dCA9PT0gJ21pbmktY2FydCcgfHwgY29udGV4dCA9PT0gJ3Byb2R1Y3QnKSB7XG4gICAgICAgIGlmIChQYXlQYWxDb21tZXJjZUdhdGV3YXkubWluaV9jYXJ0X2J1dHRvbnNfZW5hYmxlZCA9PT0gJzEnKSB7XG4gICAgICAgICAgICBjb25zdCBtaW5pQ2FydEJvb3RzdHJhcCA9IG5ldyBNaW5pQ2FydEJvb3RzdGFwKFxuICAgICAgICAgICAgICAgIFBheVBhbENvbW1lcmNlR2F0ZXdheSxcbiAgICAgICAgICAgICAgICByZW5kZXJlclxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbWluaUNhcnRCb290c3RyYXAuaW5pdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgPT09ICdwcm9kdWN0JyAmJiBQYXlQYWxDb21tZXJjZUdhdGV3YXkuc2luZ2xlX3Byb2R1Y3RfYnV0dG9uc19lbmFibGVkID09PSAnMScpIHtcbiAgICAgICAgY29uc3Qgc2luZ2xlUHJvZHVjdEJvb3RzdHJhcCA9IG5ldyBTaW5nbGVQcm9kdWN0Qm9vdHN0YXAoXG4gICAgICAgICAgICBQYXlQYWxDb21tZXJjZUdhdGV3YXksXG4gICAgICAgICAgICByZW5kZXJlcixcbiAgICAgICAgICAgIG1lc3NhZ2VSZW5kZXJlcixcbiAgICAgICAgKTtcblxuICAgICAgICBzaW5nbGVQcm9kdWN0Qm9vdHN0cmFwLmluaXQoKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGV4dCA9PT0gJ2NhcnQnKSB7XG4gICAgICAgIGNvbnN0IGNhcnRCb290c3RyYXAgPSBuZXcgQ2FydEJvb3RzdHJhcChcbiAgICAgICAgICAgIFBheVBhbENvbW1lcmNlR2F0ZXdheSxcbiAgICAgICAgICAgIHJlbmRlcmVyLFxuICAgICAgICApO1xuXG4gICAgICAgIGNhcnRCb290c3RyYXAuaW5pdCgpO1xuICAgIH1cblxuICAgIGlmIChjb250ZXh0ID09PSAnY2hlY2tvdXQnKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrb3V0Qm9vdHN0YXAgPSBuZXcgQ2hlY2tvdXRCb290c3RhcChcbiAgICAgICAgICAgIFBheVBhbENvbW1lcmNlR2F0ZXdheSxcbiAgICAgICAgICAgIHJlbmRlcmVyLFxuICAgICAgICAgICAgbWVzc2FnZVJlbmRlcmVyLFxuICAgICAgICAgICAgc3Bpbm5lclxuICAgICAgICApO1xuXG4gICAgICAgIGNoZWNrb3V0Qm9vdHN0YXAuaW5pdCgpO1xuICAgIH1cblxuICAgIGlmIChjb250ZXh0ID09PSAncGF5LW5vdycgKSB7XG4gICAgICAgIGNvbnN0IHBheU5vd0Jvb3RzdHJhcCA9IG5ldyBQYXlOb3dCb290c3RyYXAoXG4gICAgICAgICAgICBQYXlQYWxDb21tZXJjZUdhdGV3YXksXG4gICAgICAgICAgICByZW5kZXJlcixcbiAgICAgICAgICAgIG1lc3NhZ2VSZW5kZXJlcixcbiAgICAgICAgICAgIHNwaW5uZXJcbiAgICAgICAgKTtcbiAgICAgICAgcGF5Tm93Qm9vdHN0cmFwLmluaXQoKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGV4dCAhPT0gJ2NoZWNrb3V0Jykge1xuICAgICAgICBtZXNzYWdlUmVuZGVyZXIucmVuZGVyKCk7XG4gICAgfVxufTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgJ0RPTUNvbnRlbnRMb2FkZWQnLFxuICAgICgpID0+IHtcbiAgICAgICAgaWYgKCF0eXBlb2YgKFBheVBhbENvbW1lcmNlR2F0ZXdheSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1BheVBhbCBidXR0b24gY291bGQgbm90IGJlIGNvbmZpZ3VyZWQuJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG5cbiAgICAgICAgc2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGJvb3RzdHJhcCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgUGF5UGFsQ29tbWVyY2VHYXRld2F5LmJ1dHRvbi51cmwpO1xuICAgICAgICBPYmplY3QuZW50cmllcyhQYXlQYWxDb21tZXJjZUdhdGV3YXkuc2NyaXB0X2F0dHJpYnV0ZXMpLmZvckVhY2goXG4gICAgICAgICAgICAoa2V5VmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKGtleVZhbHVlWzBdLCBrZXlWYWx1ZVsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKFBheVBhbENvbW1lcmNlR2F0ZXdheS5kYXRhX2NsaWVudF9pZC5zZXRfYXR0cmlidXRlKSB7XG4gICAgICAgICAgICBkYXRhQ2xpZW50SWRBdHRyaWJ1dGVIYW5kbGVyKHNjcmlwdCwgUGF5UGFsQ29tbWVyY2VHYXRld2F5LmRhdGFfY2xpZW50X2lkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHNjcmlwdCk7XG4gICAgfSxcbik7XG4iXSwibmFtZXMiOlsiRXJyb3JIYW5kbGVyIiwiY29uc3RydWN0b3IiLCJnZW5lcmljRXJyb3JUZXh0Iiwid3JhcHBlciIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsIm1lc3NhZ2VzTGlzdCIsImdlbmVyaWNFcnJvciIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiY2xlYXIiLCJtZXNzYWdlIiwiYXBwZW5kUHJlcGFyZWRFcnJvck1lc3NhZ2VFbGVtZW50IiwiZXJyb3JNZXNzYWdlRWxlbWVudCIsInByZXBhcmVNZXNzYWdlc0xpc3QiLCJyZXBsYWNlV2l0aCIsInRleHQiLCJwZXJzaXN0IiwiU3RyaW5nIiwibGVuZ3RoIiwiRXJyb3IiLCJhZGQiLCJyZW1vdmUiLCJtZXNzYWdlTm9kZSIsInByZXBhcmVNZXNzYWdlc0xpc3RJdGVtIiwiYXBwZW5kQ2hpbGQiLCJqUXVlcnkiLCJzY3JvbGxfdG9fbm90aWNlcyIsImNyZWF0ZUVsZW1lbnQiLCJzZXRBdHRyaWJ1dGUiLCJsaSIsImlubmVySFRNTCIsInNhbml0aXplIiwidGV4dGFyZWEiLCJ2YWx1ZSIsInJlcGxhY2UiLCJpbm5lclRleHQiLCJvbkFwcHJvdmUiLCJjb250ZXh0IiwiZXJyb3JIYW5kbGVyIiwiZGF0YSIsImFjdGlvbnMiLCJmZXRjaCIsImNvbmZpZyIsImFqYXgiLCJhcHByb3ZlX29yZGVyIiwiZW5kcG9pbnQiLCJtZXRob2QiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsIm5vbmNlIiwib3JkZXJfaWQiLCJvcmRlcklEIiwidGhlbiIsInJlcyIsImpzb24iLCJzdWNjZXNzIiwicmVzdGFydCIsImNhdGNoIiwiZXJyIiwibG9jYXRpb24iLCJocmVmIiwicmVkaXJlY3QiLCJwYXllckRhdGEiLCJwYXllciIsIlBheVBhbENvbW1lcmNlR2F0ZXdheSIsInBob25lIiwicGhvbmVfdHlwZSIsInBob25lX251bWJlciIsIm5hdGlvbmFsX251bWJlciIsImVtYWlsX2FkZHJlc3MiLCJuYW1lIiwic3VybmFtZSIsImdpdmVuX25hbWUiLCJhZGRyZXNzIiwiY291bnRyeV9jb2RlIiwiYWRkcmVzc19saW5lXzEiLCJhZGRyZXNzX2xpbmVfMiIsImFkbWluX2FyZWFfMSIsImFkbWluX2FyZWFfMiIsInBvc3RhbF9jb2RlIiwiQ2FydEFjdGlvbkhhbmRsZXIiLCJjb25maWd1cmF0aW9uIiwiY3JlYXRlT3JkZXIiLCJibkNvZGUiLCJibl9jb2RlcyIsImNyZWF0ZV9vcmRlciIsInB1cmNoYXNlX3VuaXRzIiwiYm5fY29kZSIsImNvbnNvbGUiLCJlcnJvciIsImlkIiwib25FcnJvciIsIk1pbmlDYXJ0Qm9vdHN0YXAiLCJnYXRld2F5IiwicmVuZGVyZXIiLCJhY3Rpb25IYW5kbGVyIiwiaW5pdCIsImxhYmVscyIsImdlbmVyaWMiLCJyZW5kZXIiLCJvbiIsInNob3VsZFJlbmRlciIsImJ1dHRvbiIsIm1pbmlfY2FydF93cmFwcGVyIiwiaG9zdGVkX2ZpZWxkcyIsIlByb2R1Y3QiLCJVcGRhdGVDYXJ0IiwidXBkYXRlIiwib25SZXNvbHZlIiwicHJvZHVjdHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInJlc3VsdCIsInJlc29sdmVkIiwiQnV0dG9uc1RvZ2dsZUxpc3RlbmVyIiwiZWxlbWVudCIsInNob3dDYWxsYmFjayIsImhpZGVDYWxsYmFjayIsIm9ic2VydmVyIiwiYXR0cmlidXRlcyIsImNhbGxiYWNrIiwiTXV0YXRpb25PYnNlcnZlciIsIm9ic2VydmUiLCJkaXNjb25uZWN0IiwicXVhbnRpdHkiLCJ2YXJpYXRpb25zIiwiU2luZ2xlUHJvZHVjdEFjdGlvbkhhbmRsZXIiLCJ1cGRhdGVDYXJ0Iiwic2hvd0J1dHRvbkNhbGxiYWNrIiwiaGlkZUJ1dHRvbkNhbGxiYWNrIiwiZm9ybUVsZW1lbnQiLCJoYXNWYXJpYXRpb25zIiwiZ2V0UHJvZHVjdHMiLCJpc0dyb3VwZWRQcm9kdWN0IiwicXR5IiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJlbGVtZW50TmFtZSIsImdldEF0dHJpYnV0ZSIsIm1hdGNoIiwicGFyc2VJbnQiLCJwdXNoIiwicHJvbWlzZSIsIm1hcCIsIlNpbmdsZVByb2R1Y3RCb290c3RhcCIsIm1lc3NhZ2VzIiwiaGlkZUJ1dHRvbnMiLCJjaGFuZ2VfY2FydCIsInNob3dCdXR0b25zIiwicHJpY2VUZXh0IiwiYW1vdW50IiwicmVuZGVyV2l0aEFtb3VudCIsIkNhcnRCb290c3RyYXAiLCJzcGlubmVyIiwiYmxvY2siLCJ1bmJsb2NrIiwiY29kZSIsImNsaWNrIiwiQ2hlY2tvdXRBY3Rpb25IYW5kbGVyIiwiZm9ybVNlbGVjdG9yIiwiZm9ybVZhbHVlcyIsInNlcmlhbGl6ZSIsImNyZWF0ZWFjY291bnQiLCJpcyIsImZvcm0iLCJkb21QYXJzZXIiLCJET01QYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJpbnB1dCIsImN1c3RvbV9pZCIsImFwcGVuZCIsIm9uQ2FuY2VsIiwiQ2hlY2tvdXRCb290c3RhcCIsInN3aXRjaEJldHdlZW5QYXlQYWxhbmRPcmRlckJ1dHRvbiIsImRpc3BsYXlQbGFjZU9yZGVyQnV0dG9uRm9yU2F2ZWRDcmVkaXRDYXJkcyIsImNhbmNlbF93cmFwcGVyIiwidmFsIiwiY3VycmVudFBheW1lbnRNZXRob2QiLCJzaG93IiwiaGlkZSIsImRpc2FibGVDcmVkaXRDYXJkRmllbGRzIiwiZW5hYmxlQ3JlZGl0Q2FyZEZpZWxkcyIsImFkZENsYXNzIiwiYXR0ciIsInJlbW92ZUNsYXNzIiwiUGF5Tm93Qm9vdHN0cmFwIiwidXJsUGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwid2luZG93Iiwic2VhcmNoIiwiaGFzIiwiUmVuZGVyZXIiLCJjcmVkaXRDYXJkUmVuZGVyZXIiLCJkZWZhdWx0Q29uZmlnIiwiaG9zdGVkRmllbGRzV3JhcHBlciIsImNvbnRleHRDb25maWciLCJyZW5kZXJCdXR0b25zIiwiaXNBbHJlYWR5UmVuZGVyZWQiLCJwYXlwYWwiLCJCdXR0b25zIiwic3R5bGUiLCJtaW5pX2NhcnRfc3R5bGUiLCJoYXNDaGlsZE5vZGVzIiwiZG9tRWxlbWVudCIsImRpc3BsYXkiLCJkaXNhYmxlRmllbGRzIiwiZW5hYmxlRmllbGRzIiwiZGNjSW5wdXRGYWN0b3J5Iiwib3JpZ2luYWwiLCJzdHlsZXMiLCJnZXRDb21wdXRlZFN0eWxlIiwibmV3RWxlbWVudCIsIk9iamVjdCIsInZhbHVlcyIsInByb3AiLCJpc05hTiIsInNldFByb3BlcnR5IiwiQ3JlZGl0Q2FyZFJlbmRlcmVyIiwiY2FyZFZhbGlkIiwiZm9ybVZhbGlkIiwiY3VycmVudEhvc3RlZEZpZWxkc0luc3RhbmNlIiwiZm9ybVN1Ym1pc3Npb25TdWJzY3JpYmVkIiwiSG9zdGVkRmllbGRzIiwiaXNFbGlnaWJsZSIsIndyYXBwZXJFbGVtZW50IiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwidGVhcmRvd24iLCJnYXRlV2F5Qm94Iiwib2xkRGlzcGxheVN0eWxlIiwiaGlkZURjY0dhdGV3YXkiLCJjYXJkTnVtYmVyRmllbGQiLCJzdHlsZXNSYXciLCJjYXJkTnVtYmVyIiwicmVwbGFjZUNoaWxkIiwiY2FyZEV4cGlyeUZpZWxkIiwiY2FyZEV4cGlyeSIsImNhcmRDb2RlRmllbGQiLCJjYXJkQ29kZSIsImZvcm1XcmFwcGVyIiwiZW5mb3JjZV92YXVsdCIsImNoZWNrZWQiLCJmaWVsZHMiLCJudW1iZXIiLCJzZWxlY3RvciIsInBsYWNlaG9sZGVyIiwiY3JlZGl0X2NhcmRfbnVtYmVyIiwiY3Z2IiwiZXhwaXJhdGlvbkRhdGUiLCJtbV95eSIsImhvc3RlZEZpZWxkcyIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsIl9zdWJtaXQiLCJldmVudCIsImNhcmRzIiwidmFsaWRDYXJkcyIsInZhbGlkX2NhcmRzIiwiaW5kZXhPZiIsInR5cGUiLCJrZXlzIiwiZXZlcnkiLCJrZXkiLCJpc1ZhbGlkIiwiYWRkRXZlbnRMaXN0ZW5lciIsInByZXZlbnREZWZhdWx0IiwiZmllbGQiLCJhdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzYXZlX2NhcmQiLCJ2YXVsdCIsImdldEVsZW1lbnRCeUlkIiwiY29udGluZ2VuY3kiLCJob3N0ZWRGaWVsZHNEYXRhIiwiY29udGluZ2VuY2llcyIsInN1Ym1pdCIsInBheWxvYWQiLCJvcmRlcklkIiwiY2FyZF9ub3Rfc3VwcG9ydGVkIiwiZmllbGRzX25vdF92YWxpZCIsInN0b3JhZ2VLZXkiLCJ2YWxpZGF0ZVRva2VuIiwidG9rZW4iLCJ1c2VyIiwiY3VycmVudFRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsImlzRXhwaXJlZCIsImV4cGlyYXRpb24iLCJzdG9yZWRUb2tlbkZvclVzZXIiLCJwYXJzZSIsInNlc3Npb25TdG9yYWdlIiwiZ2V0SXRlbSIsInN0b3JlVG9rZW4iLCJzZXRJdGVtIiwiZGF0YUNsaWVudElkQXR0cmlidXRlSGFuZGxlciIsInNjcmlwdCIsIk1lc3NhZ2VSZW5kZXJlciIsIk1lc3NhZ2VzIiwicGxhY2VtZW50IiwibmV3V3JhcHBlciIsInNpYmxpbmciLCJuZXh0U2libGluZyIsInBhcmVudEVsZW1lbnQiLCJpbnNlcnRCZWZvcmUiLCJTcGlubmVyIiwidGFyZ2V0Iiwic2V0VGFyZ2V0Iiwib3ZlcmxheUNTUyIsImJhY2tncm91bmQiLCJvcGFjaXR5IiwiYm9vdHN0cmFwIiwibWVzc2FnZVJlbmRlcmVyIiwibWluaV9jYXJ0X2J1dHRvbnNfZW5hYmxlZCIsIm1pbmlDYXJ0Qm9vdHN0cmFwIiwic2luZ2xlX3Byb2R1Y3RfYnV0dG9uc19lbmFibGVkIiwic2luZ2xlUHJvZHVjdEJvb3RzdHJhcCIsImNhcnRCb290c3RyYXAiLCJjaGVja291dEJvb3RzdGFwIiwicGF5Tm93Qm9vdHN0cmFwIiwidXJsIiwiZW50cmllcyIsInNjcmlwdF9hdHRyaWJ1dGVzIiwia2V5VmFsdWUiLCJkYXRhX2NsaWVudF9pZCIsInNldF9hdHRyaWJ1dGUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///94\n")}},__webpack_exports__={};__webpack_modules__[94]()})();
 
modules/ppcp-button/assets/js/button.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./resources/js/modules/ErrorHandler.js","webpack:///./resources/js/modules/OnApproveHandler/onApproveForContinue.js","webpack:///./resources/js/modules/Helper/PayerData.js","webpack:///./resources/js/modules/ActionHandler/CartActionHandler.js","webpack:///./resources/js/modules/ContextBootstrap/MiniCartBootstap.js","webpack:///./resources/js/modules/Entity/Product.js","webpack:///./resources/js/modules/Helper/UpdateCart.js","webpack:///./resources/js/modules/Helper/ButtonsToggleListener.js","webpack:///./resources/js/modules/ActionHandler/SingleProductActionHandler.js","webpack:///./resources/js/modules/ContextBootstrap/SingleProductBootstap.js","webpack:///./resources/js/modules/ContextBootstrap/CartBootstap.js","webpack:///./resources/js/modules/OnApproveHandler/onApproveForPayNow.js","webpack:///./resources/js/modules/ActionHandler/CheckoutActionHandler.js","webpack:///./resources/js/modules/ContextBootstrap/CheckoutBootstap.js","webpack:///./resources/js/modules/ContextBootstrap/PayNowBootstrap.js","webpack:///./resources/js/modules/Renderer/Renderer.js","webpack:///./resources/js/modules/Helper/DccInputFactory.js","webpack:///./resources/js/modules/Renderer/CreditCardRenderer.js","webpack:///./resources/js/modules/DataClientIdAttributeHandler.js","webpack:///./resources/js/modules/Renderer/MessageRenderer.js","webpack:///./resources/js/modules/Helper/Spinner.js","webpack:///./resources/js/button.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","ErrorHandler","constructor","genericErrorText","this","wrapper","document","querySelector","messagesList","genericError","classList","contains","clear","message","appendPreparedErrorMessageElement","errorMessageElement","prepareMessagesList","replaceWith","text","persist","length","Error","add","remove","messageNode","prepareMessagesListItem","appendChild","jQuery","scroll_to_notices","createElement","setAttribute","li","innerHTML","sanitize","textarea","replace","innerText","onApprove","context","errorHandler","data","actions","fetch","config","ajax","approve_order","endpoint","method","body","JSON","stringify","nonce","order_id","orderID","then","res","json","success","restart","catch","err","location","href","redirect","payerData","payer","PayPalCommerceGateway","phone","phone_type","phone_number","national_number","email_address","surname","given_name","address","country_code","address_line_1","address_line_2","admin_area_1","admin_area_2","postal_code","CartActionHandler","configuration","createOrder","bnCode","bn_codes","create_order","purchase_units","bn_code","console","error","id","onError","MiniCartBootstap","gateway","renderer","actionHandler","init","labels","generic","render","on","shouldRender","button","mini_cart_wrapper","hosted_fields","Product","quantity","variations","UpdateCart","update","onResolve","products","Promise","resolve","reject","result","resolved","ButtonsToggleListener","element","showCallback","hideCallback","observer","callback","MutationObserver","observe","attributes","disconnect","SingleProductActionHandler","updateCart","showButtonCallback","hideButtonCallback","formElement","hasVariations","getProducts","isGroupedProduct","querySelectorAll","forEach","elementName","getAttribute","match","parseInt","push","qty","map","SingleProductBootstap","messages","hideButtons","change_cart","showButtons","priceText","amount","renderWithAmount","CartBootstrap","spinner","block","unblock","code","click","CheckoutActionHandler","formSelector","formValues","serialize","createaccount","is","form","domParser","DOMParser","parseFromString","input","custom_id","append","onCancel","CheckoutBootstap","switchBetweenPayPalandOrderButton","displayPlaceOrderButtonForSavedCreditCards","cancel_wrapper","val","currentPaymentMethod","show","hide","PayNowBootstrap","URLSearchParams","window","search","has","Renderer","creditCardRenderer","defaultConfig","hostedFieldsWrapper","contextConfig","renderButtons","isAlreadyRendered","paypal","Buttons","style","mini_cart_style","hasChildNodes","domElement","display","dccInputFactory","original","styles","getComputedStyle","newElement","values","prop","isNaN","setProperty","CreditCardRenderer","cardValid","formValid","HostedFields","isEligible","wrapperElement","parentNode","removeChild","gateWayBox","oldDisplayStyle","hideDccGateway","cardNumberField","stylesRaw","cardNumber","replaceChild","cardExpiryField","cardExpiry","cardCodeField","cardCode","formWrapper","enforce_vault","checked","fields","number","selector","placeholder","credit_card_number","cvv","expirationDate","mm_yy","hostedFields","submitEvent","event","preventDefault","save_card","vault","getElementById","submit","contingencies","payload","orderId","fields_not_valid","card_not_supported","cards","validCards","valid_cards","indexOf","type","keys","every","isValid","addEventListener","validateToken","token","user","Date","getTime","expiration","dataClientIdAttributeHandler","script","sessionStorage","setItem","MessageRenderer","Messages","placement","newWrapper","sibling","nextSibling","parentElement","insertBefore","Spinner","target","setTarget","overlayCSS","background","opacity","messageRenderer","mini_cart_buttons_enabled","single_product_buttons_enabled","bootstrap","url","entries","script_attributes","keyValue","data_client_id","set_attribute"],"mappings":"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","file":"js/button.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","class ErrorHandler {\n\n constructor(genericErrorText)\n {\n this.genericErrorText = genericErrorText;\n this.wrapper = document.querySelector('.woocommerce-notices-wrapper');\n this.messagesList = document.querySelector('ul.woocommerce-error');\n }\n\n genericError() {\n if (this.wrapper.classList.contains('ppcp-persist')) {\n return;\n }\n this.clear();\n this.message(this.genericErrorText)\n }\n\n appendPreparedErrorMessageElement(errorMessageElement)\n {\n if(this.messagesList === null) {\n this.prepareMessagesList();\n }\n\n this.messagesList.replaceWith(errorMessageElement);\n }\n\n message(text, persist = false)\n {\n if(! typeof String || text.length === 0){\n throw new Error('A new message text must be a non-empty string.');\n }\n\n if(this.messagesList === null){\n this.prepareMessagesList();\n }\n\n if (persist) {\n this.wrapper.classList.add('ppcp-persist');\n } else {\n this.wrapper.classList.remove('ppcp-persist');\n }\n\n let messageNode = this.prepareMessagesListItem(text);\n this.messagesList.appendChild(messageNode);\n\n jQuery.scroll_to_notices(jQuery('.woocommerce-notices-wrapper'))\n }\n\n prepareMessagesList()\n {\n if(this.messagesList === null){\n this.messagesList = document.createElement('ul');\n this.messagesList.setAttribute('class', 'woocommerce-error');\n this.messagesList.setAttribute('role', 'alert');\n this.wrapper.appendChild(this.messagesList);\n }\n }\n\n prepareMessagesListItem(message)\n {\n const li = document.createElement('li');\n li.innerHTML = message;\n\n return li;\n }\n\n sanitize(text)\n {\n const textarea = document.createElement('textarea');\n textarea.innerHTML = text;\n return textarea.value.replace('Error: ', '');\n }\n\n clear()\n {\n if (! this.wrapper.classList.contains('woocommerce-error')) {\n return;\n }\n this.wrapper.classList.remove('woocommerce-error');\n this.wrapper.innerText = '';\n }\n}\n\nexport default ErrorHandler;\n","const onApprove = (context, errorHandler) => {\n return (data, actions) => {\n return fetch(context.config.ajax.approve_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: context.config.ajax.approve_order.nonce,\n order_id:data.orderID\n })\n }).then((res)=>{\n return res.json();\n }).then((data)=>{\n if (!data.success) {\n errorHandler.genericError();\n return actions.restart().catch(err => {\n errorHandler.genericError();\n });;\n }\n location.href = context.config.redirect;\n });\n\n }\n}\n\nexport default onApprove;\n","export const payerData = () => {\n const payer = PayPalCommerceGateway.payer;\n if (! payer) {\n return null;\n }\n\n const phone = (document.querySelector('#billing_phone') || typeof payer.phone !== 'undefined') ?\n {\n phone_type:\"HOME\",\n phone_number:{\n national_number : (document.querySelector('#billing_phone')) ? document.querySelector('#billing_phone').value : payer.phone.phone_number.national_number\n }\n } : null;\n const payerData = {\n email_address:(document.querySelector('#billing_email')) ? document.querySelector('#billing_email').value : payer.email_address,\n name : {\n surname: (document.querySelector('#billing_last_name')) ? document.querySelector('#billing_last_name').value : payer.name.surname,\n given_name: (document.querySelector('#billing_first_name')) ? document.querySelector('#billing_first_name').value : payer.name.given_name\n },\n address : {\n country_code : (document.querySelector('#billing_country')) ? document.querySelector('#billing_country').value : payer.address.country_code,\n address_line_1 : (document.querySelector('#billing_address_1')) ? document.querySelector('#billing_address_1').value : payer.address.address_line_1,\n address_line_2 : (document.querySelector('#billing_address_2')) ? document.querySelector('#billing_address_2').value : payer.address.address_line_2,\n admin_area_1 : (document.querySelector('#billing_state')) ? document.querySelector('#billing_state').value : payer.address.admin_area_1,\n admin_area_2 : (document.querySelector('#billing_city')) ? document.querySelector('#billing_city').value : payer.address.admin_area_2,\n postal_code : (document.querySelector('#billing_postcode')) ? document.querySelector('#billing_postcode').value : payer.address.postal_code\n }\n };\n\n if (phone) {\n payerData.phone = phone;\n }\n return payerData;\n}\n","import onApprove from '../OnApproveHandler/onApproveForContinue.js';\nimport {payerData} from \"../Helper/PayerData\";\n\nclass CartActionHandler {\n\n constructor(config, errorHandler) {\n this.config = config;\n this.errorHandler = errorHandler;\n }\n\n configuration() {\n const createOrder = (data, actions) => {\n const payer = payerData();\n const bnCode = typeof this.config.bn_codes[this.config.context] !== 'undefined' ?\n this.config.bn_codes[this.config.context] : '';\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n purchase_units: [],\n bn_code:bnCode,\n payer,\n context:this.config.context\n }),\n }).then(function(res) {\n return res.json();\n }).then(function(data) {\n if (!data.success) {\n console.error(data);\n throw Error(data.data.message);\n }\n return data.data.id;\n });\n };\n\n return {\n createOrder,\n onApprove: onApprove(this, this.errorHandler),\n onError: (error) => {\n this.errorHandler.genericError();\n }\n };\n }\n}\n\nexport default CartActionHandler;\n","import ErrorHandler from '../ErrorHandler';\nimport CartActionHandler from '../ActionHandler/CartActionHandler';\n\nclass MiniCartBootstap {\n constructor(gateway, renderer) {\n this.gateway = gateway;\n this.renderer = renderer;\n this.actionHandler = null;\n }\n\n init() {\n\n this.actionHandler = new CartActionHandler(\n PayPalCommerceGateway,\n new ErrorHandler(this.gateway.labels.error.generic),\n );\n this.render();\n\n jQuery(document.body).on('wc_fragments_loaded wc_fragments_refreshed', () => {\n this.render();\n });\n }\n\n shouldRender() {\n return document.querySelector(this.gateway.button.mini_cart_wrapper) !==\n null || document.querySelector(this.gateway.hosted_fields.mini_cart_wrapper) !==\n null;\n }\n\n render() {\n if (!this.shouldRender()) {\n return;\n }\n\n this.renderer.render(\n this.gateway.button.mini_cart_wrapper,\n this.gateway.hosted_fields.mini_cart_wrapper,\n this.actionHandler.configuration()\n );\n }\n}\n\nexport default MiniCartBootstap;","class Product {\n\n constructor(id, quantity, variations) {\n this.id = id;\n this.quantity = quantity;\n this.variations = variations;\n }\n\n data() {\n return {\n id:this.id,\n quantity:this.quantity,\n variations:this.variations\n }\n }\n}\n\nexport default Product;","import Product from \"../Entity/Product\";\nclass UpdateCart {\n\n constructor(endpoint, nonce)\n {\n this.endpoint = endpoint;\n this.nonce = nonce;\n }\n\n /**\n *\n * @param onResolve\n * @param {Product[]} products\n * @returns {Promise<unknown>}\n */\n update(onResolve, products)\n {\n return new Promise((resolve, reject) => {\n fetch(\n this.endpoint,\n {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.nonce,\n products,\n })\n }\n ).then(\n (result) => {\n return result.json();\n }\n ).then((result) => {\n if (! result.success) {\n reject(result.data);\n return;\n }\n\n const resolved = onResolve(result.data);\n resolve(resolved);\n })\n });\n }\n}\n\nexport default UpdateCart;","/**\n * When you can't add something to the cart, the PayPal buttons should not show.\n * Therefore we listen for changes on the add to cart button and show/hide the buttons accordingly.\n */\n\nclass ButtonsToggleListener {\n constructor(element, showCallback, hideCallback)\n {\n this.element = element;\n this.showCallback = showCallback;\n this.hideCallback = hideCallback;\n this.observer = null;\n }\n\n init()\n {\n const config = { attributes : true };\n const callback = () => {\n if (this.element.classList.contains('disabled')) {\n this.hideCallback();\n return;\n }\n this.showCallback();\n }\n this.observer = new MutationObserver(callback);\n this.observer.observe(this.element, config);\n callback();\n }\n\n disconnect()\n {\n this.observer.disconnect();\n }\n}\n\nexport default ButtonsToggleListener;","import ButtonsToggleListener from '../Helper/ButtonsToggleListener';\nimport Product from '../Entity/Product';\nimport onApprove from '../OnApproveHandler/onApproveForContinue';\nimport {payerData} from \"../Helper/PayerData\";\n\nclass SingleProductActionHandler {\n\n constructor(\n config,\n updateCart,\n showButtonCallback,\n hideButtonCallback,\n formElement,\n errorHandler\n ) {\n this.config = config;\n this.updateCart = updateCart;\n this.showButtonCallback = showButtonCallback;\n this.hideButtonCallback = hideButtonCallback;\n this.formElement = formElement;\n this.errorHandler = errorHandler;\n }\n\n configuration()\n {\n\n if ( this.hasVariations() ) {\n const observer = new ButtonsToggleListener(\n this.formElement.querySelector('.single_add_to_cart_button'),\n this.showButtonCallback,\n this.hideButtonCallback\n );\n observer.init();\n }\n\n return {\n createOrder: this.createOrder(),\n onApprove: onApprove(this, this.errorHandler),\n onError: (error) => {\n this.errorHandler.genericError();\n }\n }\n }\n\n createOrder()\n {\n var getProducts = null;\n if (! this.isGroupedProduct() ) {\n getProducts = () => {\n const id = document.querySelector('[name=\"add-to-cart\"]').value;\n const qty = document.querySelector('[name=\"quantity\"]').value;\n const variations = this.variations();\n return [new Product(id, qty, variations)];\n }\n } else {\n getProducts = () => {\n const products = [];\n this.formElement.querySelectorAll('input[type=\"number\"]').forEach((element) => {\n if (! element.value) {\n return;\n }\n const elementName = element.getAttribute('name').match(/quantity\\[([\\d]*)\\]/);\n if (elementName.length !== 2) {\n return;\n }\n const id = parseInt(elementName[1]);\n const quantity = parseInt(element.value);\n products.push(new Product(id, quantity, null));\n })\n return products;\n }\n }\n const createOrder = (data, actions) => {\n this.errorHandler.clear();\n\n const onResolve = (purchase_units) => {\n const payer = payerData();\n const bnCode = typeof this.config.bn_codes[this.config.context] !== 'undefined' ?\n this.config.bn_codes[this.config.context] : '';\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n purchase_units,\n payer,\n bn_code:bnCode,\n context:this.config.context\n })\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n if (!data.success) {\n console.error(data);\n throw Error(data.data.message);\n }\n return data.data.id;\n });\n };\n\n const promise = this.updateCart.update(onResolve, getProducts());\n return promise;\n };\n return createOrder;\n }\n\n variations()\n {\n\n if (! this.hasVariations()) {\n return null;\n }\n const attributes = [...this.formElement.querySelectorAll(\"[name^='attribute_']\")].map(\n (element) => {\n return {\n value:element.value,\n name:element.name\n }\n }\n );\n return attributes;\n }\n\n hasVariations()\n {\n return this.formElement.classList.contains('variations_form');\n }\n\n isGroupedProduct()\n {\n return this.formElement.classList.contains('grouped_form');\n }\n}\nexport default SingleProductActionHandler;\n","import ErrorHandler from '../ErrorHandler';\nimport UpdateCart from \"../Helper/UpdateCart\";\nimport SingleProductActionHandler from \"../ActionHandler/SingleProductActionHandler\";\n\nclass SingleProductBootstap {\n constructor(gateway, renderer, messages) {\n this.gateway = gateway;\n this.renderer = renderer;\n this.messages = messages;\n }\n\n init() {\n if (!this.shouldRender()) {\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n return;\n }\n\n this.render();\n }\n\n shouldRender() {\n if (document.querySelector('form.cart') === null) {\n return false;\n }\n\n return true;\n }\n\n render() {\n const actionHandler = new SingleProductActionHandler(\n this.gateway,\n new UpdateCart(\n this.gateway.ajax.change_cart.endpoint,\n this.gateway.ajax.change_cart.nonce,\n ),\n () => {\n this.renderer.showButtons(this.gateway.button.wrapper);\n this.renderer.showButtons(this.gateway.hosted_fields.wrapper);\n let priceText = \"0\";\n if (document.querySelector('form.cart ins .woocommerce-Price-amount')) {\n priceText = document.querySelector('form.cart ins .woocommerce-Price-amount').innerText;\n }\n else if (document.querySelector('form.cart .woocommerce-Price-amount')) {\n priceText = document.querySelector('form.cart .woocommerce-Price-amount').innerText;\n }\n const amount = parseInt(priceText.replace(/([^\\d,\\.\\s]*)/g, ''));\n this.messages.renderWithAmount(amount)\n },\n () => {\n this.renderer.hideButtons(this.gateway.button.wrapper);\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n },\n document.querySelector('form.cart'),\n new ErrorHandler(this.gateway.labels.error.generic),\n );\n\n this.renderer.render(\n this.gateway.button.wrapper,\n this.gateway.hosted_fields.wrapper,\n actionHandler.configuration(),\n );\n }\n}\n\nexport default SingleProductBootstap;","import CartActionHandler from '../ActionHandler/CartActionHandler';\nimport ErrorHandler from '../ErrorHandler';\n\nclass CartBootstrap {\n constructor(gateway, renderer) {\n this.gateway = gateway;\n this.renderer = renderer;\n }\n\n init() {\n if (!this.shouldRender()) {\n return;\n }\n\n this.render();\n\n jQuery(document.body).on('updated_cart_totals updated_checkout', () => {\n this.render();\n });\n }\n\n shouldRender() {\n return document.querySelector(this.gateway.button.wrapper) !==\n null || document.querySelector(this.gateway.hosted_fields.wrapper) !==\n null;\n }\n\n render() {\n const actionHandler = new CartActionHandler(\n PayPalCommerceGateway,\n new ErrorHandler(this.gateway.labels.error.generic),\n );\n\n this.renderer.render(\n this.gateway.button.wrapper,\n this.gateway.hosted_fields.wrapper,\n actionHandler.configuration(),\n );\n }\n}\n\nexport default CartBootstrap;\n","const onApprove = (context, errorHandler, spinner) => {\n return (data, actions) => {\n spinner.block();\n return fetch(context.config.ajax.approve_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: context.config.ajax.approve_order.nonce,\n order_id:data.orderID\n })\n }).then((res)=>{\n return res.json();\n }).then((data)=>{\n spinner.unblock();\n if (!data.success) {\n if (data.data.code === 100) {\n errorHandler.message(data.data.message);\n } else {\n errorHandler.genericError();\n }\n if (typeof actions !== 'undefined' && typeof actions.restart !== 'undefined') {\n return actions.restart();\n }\n throw new Error(data.data.message);\n }\n document.querySelector('#place_order').click()\n });\n\n }\n}\n\nexport default onApprove;\n","import onApprove from '../OnApproveHandler/onApproveForPayNow.js';\nimport {payerData} from \"../Helper/PayerData\";\n\nclass CheckoutActionHandler {\n\n constructor(config, errorHandler, spinner) {\n this.config = config;\n this.errorHandler = errorHandler;\n this.spinner = spinner;\n }\n\n configuration() {\n const spinner = this.spinner;\n const createOrder = (data, actions) => {\n const payer = payerData();\n const bnCode = typeof this.config.bn_codes[this.config.context] !== 'undefined' ?\n this.config.bn_codes[this.config.context] : '';\n\n const errorHandler = this.errorHandler;\n\n const formSelector = this.config.context === 'checkout' ? 'form.checkout' : 'form#order_review';\n const formValues = jQuery(formSelector).serialize();\n\n const createaccount = jQuery('#createaccount').is(\":checked\") ? true : false;\n\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n payer,\n bn_code:bnCode,\n context:this.config.context,\n order_id:this.config.order_id,\n form:formValues,\n createaccount: createaccount\n })\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n if (!data.success) {\n spinner.unblock();\n //handle both messages sent from Woocommerce (data.messages) and this plugin (data.data.message)\n if (typeof(data.messages) !== 'undefined' )\n {\n const domParser = new DOMParser();\n errorHandler.appendPreparedErrorMessageElement(\n domParser.parseFromString(data.messages, 'text/html')\n .querySelector('ul')\n );\n } else {\n errorHandler.message(data.data.message, true);\n }\n\n return;\n }\n const input = document.createElement('input');\n input.setAttribute('type', 'hidden');\n input.setAttribute('name', 'ppcp-resume-order');\n input.setAttribute('value', data.data.purchase_units[0].custom_id);\n document.querySelector(formSelector).append(input);\n return data.data.id;\n });\n }\n return {\n createOrder,\n onApprove:onApprove(this, this.errorHandler, this.spinner),\n onCancel: () => {\n spinner.unblock();\n },\n onError: () => {\n this.errorHandler.genericError();\n spinner.unblock();\n }\n }\n }\n}\n\nexport default CheckoutActionHandler;\n","import ErrorHandler from '../ErrorHandler';\nimport CheckoutActionHandler from '../ActionHandler/CheckoutActionHandler';\n\nclass CheckoutBootstap {\n constructor(gateway, renderer, messages, spinner) {\n this.gateway = gateway;\n this.renderer = renderer;\n this.messages = messages;\n this.spinner = spinner;\n }\n\n init() {\n\n this.render();\n\n jQuery(document.body).on('updated_checkout', () => {\n this.render()\n });\n\n jQuery(document.body).\n on('updated_checkout payment_method_selected', () => {\n this.switchBetweenPayPalandOrderButton()\n this.displayPlaceOrderButtonForSavedCreditCards()\n\n })\n\n jQuery('#saved-credit-card').on('change', () => {\n this.displayPlaceOrderButtonForSavedCreditCards()\n })\n\n this.switchBetweenPayPalandOrderButton()\n this.displayPlaceOrderButtonForSavedCreditCards()\n }\n\n shouldRender() {\n if (document.querySelector(this.gateway.button.cancel_wrapper)) {\n return false;\n }\n\n return document.querySelector(this.gateway.button.wrapper) !== null || document.querySelector(this.gateway.hosted_fields.wrapper) !== null;\n }\n\n render() {\n if (!this.shouldRender()) {\n return;\n }\n if (document.querySelector(this.gateway.hosted_fields.wrapper + '>div')) {\n document.querySelector(this.gateway.hosted_fields.wrapper + '>div').setAttribute('style', '');\n }\n const actionHandler = new CheckoutActionHandler(\n PayPalCommerceGateway,\n new ErrorHandler(this.gateway.labels.error.generic),\n this.spinner\n );\n\n this.renderer.render(\n this.gateway.button.wrapper,\n this.gateway.hosted_fields.wrapper,\n actionHandler.configuration(),\n );\n }\n\n switchBetweenPayPalandOrderButton() {\n jQuery('#saved-credit-card').val(jQuery('#saved-credit-card option:first').val());\n\n const currentPaymentMethod = jQuery(\n 'input[name=\"payment_method\"]:checked').val();\n\n if (currentPaymentMethod !== 'ppcp-gateway' && currentPaymentMethod !== 'ppcp-credit-card-gateway') {\n this.renderer.hideButtons(this.gateway.button.wrapper);\n this.renderer.hideButtons(this.gateway.messages.wrapper);\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n jQuery('#place_order').show();\n }\n else {\n jQuery('#place_order').hide();\n if (currentPaymentMethod === 'ppcp-gateway') {\n this.renderer.showButtons(this.gateway.button.wrapper);\n this.renderer.showButtons(this.gateway.messages.wrapper);\n this.messages.render()\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper)\n }\n if (currentPaymentMethod === 'ppcp-credit-card-gateway') {\n this.renderer.hideButtons(this.gateway.button.wrapper)\n this.renderer.hideButtons(this.gateway.messages.wrapper)\n this.renderer.showButtons(this.gateway.hosted_fields.wrapper)\n }\n }\n }\n\n displayPlaceOrderButtonForSavedCreditCards() {\n const currentPaymentMethod = jQuery(\n 'input[name=\"payment_method\"]:checked').val();\n if (currentPaymentMethod !== 'ppcp-credit-card-gateway') {\n return;\n }\n\n if (jQuery('#saved-credit-card').length && jQuery('#saved-credit-card').val() !== '') {\n this.renderer.hideButtons(this.gateway.button.wrapper)\n this.renderer.hideButtons(this.gateway.messages.wrapper)\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper)\n jQuery('#place_order').show()\n } else {\n jQuery('#place_order').hide()\n this.renderer.hideButtons(this.gateway.button.wrapper)\n this.renderer.hideButtons(this.gateway.messages.wrapper)\n this.renderer.showButtons(this.gateway.hosted_fields.wrapper)\n }\n }\n}\n\nexport default CheckoutBootstap\n","import ErrorHandler from '../ErrorHandler';\nimport CheckoutActionHandler from '../ActionHandler/CheckoutActionHandler';\n\nclass PayNowBootstrap {\n constructor(gateway, renderer, messages, spinner) {\n this.gateway = gateway;\n this.renderer = renderer;\n this.messages = messages;\n this.spinner = spinner;\n }\n\n init() {\n\n this.render();\n\n jQuery(document.body).on('updated_checkout', () => {\n this.render();\n });\n\n jQuery(document.body).\n on('updated_checkout payment_method_selected', () => {\n this.switchBetweenPayPalandOrderButton();\n });\n this.switchBetweenPayPalandOrderButton();\n }\n\n shouldRender() {\n if (document.querySelector(this.gateway.button.cancel_wrapper)) {\n return false;\n }\n\n return document.querySelector(this.gateway.button.wrapper) !== null || document.querySelector(this.gateway.hosted_fields.wrapper) !== null;\n }\n\n render() {\n if (!this.shouldRender()) {\n return;\n }\n if (document.querySelector(this.gateway.hosted_fields.wrapper + '>div')) {\n document.querySelector(this.gateway.hosted_fields.wrapper + '>div').setAttribute('style', '');\n }\n const actionHandler = new CheckoutActionHandler(\n PayPalCommerceGateway,\n new ErrorHandler(this.gateway.labels.error.generic),\n this.spinner\n );\n\n this.renderer.render(\n this.gateway.button.wrapper,\n this.gateway.hosted_fields.wrapper,\n actionHandler.configuration(),\n );\n }\n\n switchBetweenPayPalandOrderButton() {\n const urlParams = new URLSearchParams(window.location.search)\n if (urlParams.has('change_payment_method')) {\n return\n }\n\n const currentPaymentMethod = jQuery(\n 'input[name=\"payment_method\"]:checked').val();\n\n if (currentPaymentMethod !== 'ppcp-gateway' && currentPaymentMethod !== 'ppcp-credit-card-gateway') {\n this.renderer.hideButtons(this.gateway.button.wrapper);\n this.renderer.hideButtons(this.gateway.messages.wrapper);\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n jQuery('#place_order').show();\n }\n else {\n jQuery('#place_order').hide();\n if (currentPaymentMethod === 'ppcp-gateway') {\n this.renderer.showButtons(this.gateway.button.wrapper);\n this.renderer.showButtons(this.gateway.messages.wrapper);\n this.messages.render();\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n }\n if (currentPaymentMethod === 'ppcp-credit-card-gateway') {\n this.renderer.hideButtons(this.gateway.button.wrapper);\n this.renderer.hideButtons(this.gateway.messages.wrapper);\n this.renderer.showButtons(this.gateway.hosted_fields.wrapper);\n }\n }\n }\n}\n\nexport default PayNowBootstrap;\n","class Renderer {\n constructor(creditCardRenderer, defaultConfig) {\n this.defaultConfig = defaultConfig;\n this.creditCardRenderer = creditCardRenderer;\n }\n\n render(wrapper, hostedFieldsWrapper, contextConfig) {\n\n this.renderButtons(wrapper, contextConfig);\n this.creditCardRenderer.render(hostedFieldsWrapper, contextConfig);\n }\n\n renderButtons(wrapper, contextConfig) {\n if (! document.querySelector(wrapper) || this.isAlreadyRendered(wrapper) || 'undefined' === typeof paypal.Buttons ) {\n return;\n }\n\n const style = wrapper === this.defaultConfig.button.wrapper ? this.defaultConfig.button.style : this.defaultConfig.button.mini_cart_style;\n paypal.Buttons({\n style,\n ...contextConfig,\n }).render(wrapper);\n }\n\n isAlreadyRendered(wrapper) {\n return document.querySelector(wrapper).hasChildNodes();\n }\n\n hideButtons(element) {\n const domElement = document.querySelector(element);\n if (! domElement ) {\n return false;\n }\n domElement.style.display = 'none';\n return true;\n }\n\n showButtons(element) {\n const domElement = document.querySelector(element);\n if (! domElement ) {\n return false;\n }\n domElement.style.display = 'block';\n return true;\n }\n}\n\nexport default Renderer;","const dccInputFactory = (original) => {\n const styles = window.getComputedStyle(original);\n const newElement = document.createElement('span');\n newElement.setAttribute('id', original.id);\n Object.values(styles).forEach( (prop) => {\n if (! styles[prop] || ! isNaN(prop) ) {\n return;\n }\n newElement.style.setProperty(prop,'' + styles[prop]);\n });\n return newElement;\n}\n\nexport default dccInputFactory;","import dccInputFactory from \"../Helper/DccInputFactory\";\n\nclass CreditCardRenderer {\n\n constructor(defaultConfig, errorHandler, spinner) {\n this.defaultConfig = defaultConfig;\n this.errorHandler = errorHandler;\n this.spinner = spinner;\n this.cardValid = false;\n this.formValid = false;\n }\n\n render(wrapper, contextConfig) {\n\n if (\n (\n this.defaultConfig.context !== 'checkout'\n && this.defaultConfig.context !== 'pay-now'\n )\n || wrapper === null\n || document.querySelector(wrapper) === null\n ) {\n return;\n }\n if (\n typeof paypal.HostedFields === 'undefined'\n || ! paypal.HostedFields.isEligible()\n ) {\n const wrapperElement = document.querySelector(wrapper);\n wrapperElement.parentNode.removeChild(wrapperElement);\n return;\n }\n\n const gateWayBox = document.querySelector('.payment_box.payment_method_ppcp-credit-card-gateway');\n const oldDisplayStyle = gateWayBox.style.display;\n gateWayBox.style.display = 'block';\n\n const hideDccGateway = document.querySelector('#ppcp-hide-dcc');\n if (hideDccGateway) {\n hideDccGateway.parentNode.removeChild(hideDccGateway);\n }\n\n const cardNumberField = document.querySelector('#ppcp-credit-card-gateway-card-number');\n\n const stylesRaw = window.getComputedStyle(cardNumberField);\n let styles = {};\n Object.values(stylesRaw).forEach( (prop) => {\n if (! stylesRaw[prop]) {\n return;\n }\n styles[prop] = '' + stylesRaw[prop];\n });\n\n const cardNumber = dccInputFactory(cardNumberField);\n cardNumberField.parentNode.replaceChild(cardNumber, cardNumberField);\n\n const cardExpiryField = document.querySelector('#ppcp-credit-card-gateway-card-expiry');\n const cardExpiry = dccInputFactory(cardExpiryField);\n cardExpiryField.parentNode.replaceChild(cardExpiry, cardExpiryField);\n\n const cardCodeField = document.querySelector('#ppcp-credit-card-gateway-card-cvc');\n const cardCode = dccInputFactory(cardCodeField);\n cardCodeField.parentNode.replaceChild(cardCode, cardCodeField);\n\n gateWayBox.style.display = oldDisplayStyle;\n\n const formWrapper = '.payment_box payment_method_ppcp-credit-card-gateway';\n if (\n this.defaultConfig.enforce_vault\n && document.querySelector(formWrapper + ' .ppcp-credit-card-vault')\n ) {\n document.querySelector(formWrapper + ' .ppcp-credit-card-vault').checked = true;\n document.querySelector(formWrapper + ' .ppcp-credit-card-vault').setAttribute('disabled', true);\n }\n paypal.HostedFields.render({\n createOrder: contextConfig.createOrder,\n styles: {\n 'input': styles\n },\n fields: {\n number: {\n selector: '#ppcp-credit-card-gateway-card-number',\n placeholder: this.defaultConfig.hosted_fields.labels.credit_card_number,\n },\n cvv: {\n selector: '#ppcp-credit-card-gateway-card-cvc',\n placeholder: this.defaultConfig.hosted_fields.labels.cvv,\n },\n expirationDate: {\n selector: '#ppcp-credit-card-gateway-card-expiry',\n placeholder: this.defaultConfig.hosted_fields.labels.mm_yy,\n }\n }\n }).then(hostedFields => {\n const submitEvent = (event) => {\n this.spinner.block();\n if (event) {\n event.preventDefault();\n }\n this.errorHandler.clear();\n\n if (this.formValid && this.cardValid) {\n const save_card = this.defaultConfig.save_card ? true : false;\n const vault = document.getElementById('ppcp-credit-card-vault') ?\n document.getElementById('ppcp-credit-card-vault').checked : save_card;\n hostedFields.submit({\n contingencies: ['SCA_WHEN_REQUIRED'],\n vault: vault\n }).then((payload) => {\n payload.orderID = payload.orderId;\n this.spinner.unblock();\n return contextConfig.onApprove(payload);\n }).catch(() => {\n this.errorHandler.genericError();\n this.spinner.unblock();\n });\n } else {\n this.spinner.unblock();\n const message = ! this.cardValid ? this.defaultConfig.hosted_fields.labels.card_not_supported : this.defaultConfig.hosted_fields.labels.fields_not_valid;\n this.errorHandler.message(message);\n }\n }\n hostedFields.on('inputSubmitRequest', function () {\n submitEvent(null);\n });\n hostedFields.on('cardTypeChange', (event) => {\n if ( ! event.cards.length ) {\n this.cardValid = false;\n return;\n }\n const validCards = this.defaultConfig.hosted_fields.valid_cards;\n this.cardValid = validCards.indexOf(event.cards[0].type) !== -1;\n })\n hostedFields.on('validityChange', (event) => {\n const formValid = Object.keys(event.fields).every(function (key) {\n return event.fields[key].isValid;\n });\n this.formValid = formValid;\n\n })\n document.querySelector(wrapper + ' button').addEventListener(\n 'click',\n submitEvent\n );\n });\n\n document.querySelector('#payment_method_ppcp-credit-card-gateway').addEventListener(\n 'click',\n () => {\n document.querySelector('label[for=ppcp-credit-card-gateway-card-number]').click();\n }\n )\n }\n}\nexport default CreditCardRenderer;\n","const storageKey = 'ppcp-data-client-id';\n\nconst validateToken = (token, user) => {\n if (! token) {\n return false;\n }\n if (token.user !== user) {\n return false;\n }\n const currentTime = new Date().getTime();\n const isExpired = currentTime >= token.expiration * 1000;\n return ! isExpired;\n}\n\nconst storedTokenForUser = (user) => {\n const token = JSON.parse(sessionStorage.getItem(storageKey));\n if (validateToken(token, user)) {\n return token.token;\n }\n return null;\n}\n\nconst storeToken = (token) => {\n sessionStorage.setItem(storageKey, JSON.stringify(token));\n}\n\nconst dataClientIdAttributeHandler = (script, config) => {\n fetch(config.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: config.nonce\n })\n }).then((res)=>{\n return res.json();\n }).then((data)=>{\n const isValid = validateToken(data, config.user);\n if (!isValid) {\n return;\n }\n storeToken(data);\n script.setAttribute('data-client-token', data.token);\n document.body.append(script);\n });\n}\n\nexport default dataClientIdAttributeHandler;\n","class MessageRenderer {\n\n constructor(config) {\n this.config = config;\n }\n\n render() {\n if (! this.shouldRender()) {\n return;\n }\n\n paypal.Messages({\n amount: this.config.amount,\n placement: this.config.placement,\n style: this.config.style\n }).render(this.config.wrapper);\n }\n\n renderWithAmount(amount) {\n\n if (! this.shouldRender()) {\n return;\n }\n\n const newWrapper = document.createElement('div');\n newWrapper.setAttribute('id', this.config.wrapper.replace('#', ''));\n\n const sibling = document.querySelector(this.config.wrapper).nextSibling;\n document.querySelector(this.config.wrapper).parentElement.removeChild(document.querySelector(this.config.wrapper));\n sibling.parentElement.insertBefore(newWrapper, sibling);\n paypal.Messages({\n amount,\n placement: this.config.placement,\n style: this.config.style\n }).render(this.config.wrapper);\n }\n\n shouldRender() {\n\n if (typeof paypal.Messages === 'undefined' || typeof this.config.wrapper === 'undefined' ) {\n return false;\n }\n if (! document.querySelector(this.config.wrapper)) {\n return false;\n }\n return true;\n }\n}\nexport default MessageRenderer;","class Spinner {\n\n constructor() {\n this.target = 'form.woocommerce-checkout';\n }\n\n setTarget(target) {\n this.target = target;\n }\n\n block() {\n\n jQuery( this.target ).block({\n message: null,\n overlayCSS: {\n background: '#fff',\n opacity: 0.6\n }\n });\n }\n\n unblock() {\n\n jQuery( this.target ).unblock();\n }\n}\n\nexport default Spinner;\n","import MiniCartBootstap from './modules/ContextBootstrap/MiniCartBootstap';\nimport SingleProductBootstap from './modules/ContextBootstrap/SingleProductBootstap';\nimport CartBootstrap from './modules/ContextBootstrap/CartBootstap';\nimport CheckoutBootstap from './modules/ContextBootstrap/CheckoutBootstap';\nimport PayNowBootstrap from \"./modules/ContextBootstrap/PayNowBootstrap\";\nimport Renderer from './modules/Renderer/Renderer';\nimport ErrorHandler from './modules/ErrorHandler';\nimport CreditCardRenderer from \"./modules/Renderer/CreditCardRenderer\";\nimport dataClientIdAttributeHandler from \"./modules/DataClientIdAttributeHandler\";\nimport MessageRenderer from \"./modules/Renderer/MessageRenderer\";\nimport Spinner from \"./modules/Helper/Spinner\";\n\nconst bootstrap = () => {\n const errorHandler = new ErrorHandler(PayPalCommerceGateway.labels.error.generic);\n const spinner = new Spinner();\n const creditCardRenderer = new CreditCardRenderer(PayPalCommerceGateway, errorHandler, spinner);\n const renderer = new Renderer(creditCardRenderer, PayPalCommerceGateway);\n const messageRenderer = new MessageRenderer(PayPalCommerceGateway.messages);\n const context = PayPalCommerceGateway.context;\n if (context === 'mini-cart' || context === 'product') {\n if (PayPalCommerceGateway.mini_cart_buttons_enabled === '1') {\n const miniCartBootstrap = new MiniCartBootstap(\n PayPalCommerceGateway,\n renderer\n );\n\n miniCartBootstrap.init();\n }\n }\n\n if (context === 'product' && PayPalCommerceGateway.single_product_buttons_enabled === '1') {\n const singleProductBootstrap = new SingleProductBootstap(\n PayPalCommerceGateway,\n renderer,\n messageRenderer,\n );\n\n singleProductBootstrap.init();\n }\n\n if (context === 'cart') {\n const cartBootstrap = new CartBootstrap(\n PayPalCommerceGateway,\n renderer,\n );\n\n cartBootstrap.init();\n }\n\n if (context === 'checkout') {\n const checkoutBootstap = new CheckoutBootstap(\n PayPalCommerceGateway,\n renderer,\n messageRenderer,\n spinner\n );\n\n checkoutBootstap.init();\n }\n\n if (context === 'pay-now' ) {\n const payNowBootstrap = new PayNowBootstrap(\n PayPalCommerceGateway,\n renderer,\n messageRenderer,\n spinner\n );\n payNowBootstrap.init();\n }\n\n if (context !== 'checkout') {\n messageRenderer.render();\n }\n};\ndocument.addEventListener(\n 'DOMContentLoaded',\n () => {\n if (!typeof (PayPalCommerceGateway)) {\n console.error('PayPal button could not be configured.');\n return;\n }\n const script = document.createElement('script');\n\n script.addEventListener('load', (event) => {\n bootstrap();\n });\n script.setAttribute('src', PayPalCommerceGateway.button.url);\n Object.entries(PayPalCommerceGateway.script_attributes).forEach(\n (keyValue) => {\n script.setAttribute(keyValue[0], keyValue[1]);\n }\n );\n\n if (PayPalCommerceGateway.data_client_id.set_attribute) {\n dataClientIdAttributeHandler(script, PayPalCommerceGateway.data_client_id);\n return;\n }\n\n document.body.append(script);\n },\n);\n"],"sourceRoot":""}
 
modules/ppcp-button/assets/js/hosted-fields.js CHANGED
@@ -1,2 +1 @@
1
- !function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){e.exports=r.p+"css/hosted-fields.css"}]);
2
- //# sourceMappingURL=hosted-fields.js.map
1
+ (()=>{"use strict";var __webpack_modules__={555:(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{eval('/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "css/hosted-fields.css");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTU1LmpzIiwibWFwcGluZ3MiOiJBQUFBLHNFQUFlLHFCQUF1QiwwQkFBMEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2Nzcy9ob3N0ZWQtZmllbGRzLnNjc3M/NjRhYiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwiY3NzL2hvc3RlZC1maWVsZHMuY3NzXCI7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///555\n')}},__webpack_require__={};__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),(()=>{var e;__webpack_require__.g.importScripts&&(e=__webpack_require__.g.location+"");var _=__webpack_require__.g.document;if(!e&&_&&(_.currentScript&&(e=_.currentScript.src),!e)){var r=_.getElementsByTagName("script");r.length&&(e=r[r.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),__webpack_require__.p=e+"../"})();var __webpack_exports__={};__webpack_modules__[555](0,__webpack_exports__,__webpack_require__)})();
 
modules/ppcp-button/assets/js/hosted-fields.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./resources/css/hosted-fields.scss"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,G,kBClFrDhC,EAAOD,QAAU,IAA0B","file":"js/hosted-fields.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","module.exports = __webpack_public_path__ + \"css/hosted-fields.css\";"],"sourceRoot":""}
 
modules/ppcp-button/resources/css/hosted-fields.scss CHANGED
@@ -7,3 +7,7 @@
7
  .payments-sdk-contingency-handler {
8
  z-index: 1000 !important;
9
  }
 
 
 
 
7
  .payments-sdk-contingency-handler {
8
  z-index: 1000 !important;
9
  }
10
+
11
+ .ppcp-credit-card-gateway-form-field-disabled {
12
+ opacity: .5 !important;
13
+ }
modules/ppcp-button/resources/js/modules/ContextBootstrap/CheckoutBootstap.js CHANGED
@@ -24,9 +24,11 @@ class CheckoutBootstap {
24
 
25
  })
26
 
27
- jQuery('#saved-credit-card').on('change', () => {
28
- this.displayPlaceOrderButtonForSavedCreditCards()
29
- })
 
 
30
 
31
  this.switchBetweenPayPalandOrderButton()
32
  this.displayPlaceOrderButtonForSavedCreditCards()
@@ -100,13 +102,41 @@ class CheckoutBootstap {
100
  this.renderer.hideButtons(this.gateway.messages.wrapper)
101
  this.renderer.hideButtons(this.gateway.hosted_fields.wrapper)
102
  jQuery('#place_order').show()
 
103
  } else {
104
  jQuery('#place_order').hide()
105
  this.renderer.hideButtons(this.gateway.button.wrapper)
106
  this.renderer.hideButtons(this.gateway.messages.wrapper)
107
  this.renderer.showButtons(this.gateway.hosted_fields.wrapper)
 
108
  }
109
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  }
111
 
112
  export default CheckoutBootstap
24
 
25
  })
26
 
27
+ jQuery(document).on('hosted_fields_loaded', () => {
28
+ jQuery('#saved-credit-card').on('change', () => {
29
+ this.displayPlaceOrderButtonForSavedCreditCards()
30
+ })
31
+ });
32
 
33
  this.switchBetweenPayPalandOrderButton()
34
  this.displayPlaceOrderButtonForSavedCreditCards()
102
  this.renderer.hideButtons(this.gateway.messages.wrapper)
103
  this.renderer.hideButtons(this.gateway.hosted_fields.wrapper)
104
  jQuery('#place_order').show()
105
+ this.disableCreditCardFields()
106
  } else {
107
  jQuery('#place_order').hide()
108
  this.renderer.hideButtons(this.gateway.button.wrapper)
109
  this.renderer.hideButtons(this.gateway.messages.wrapper)
110
  this.renderer.showButtons(this.gateway.hosted_fields.wrapper)
111
+ this.enableCreditCardFields()
112
  }
113
  }
114
+
115
+ disableCreditCardFields() {
116
+ jQuery('label[for="ppcp-credit-card-gateway-card-number"]').addClass('ppcp-credit-card-gateway-form-field-disabled')
117
+ jQuery('#ppcp-credit-card-gateway-card-number').addClass('ppcp-credit-card-gateway-form-field-disabled')
118
+ jQuery('label[for="ppcp-credit-card-gateway-card-expiry"]').addClass('ppcp-credit-card-gateway-form-field-disabled')
119
+ jQuery('#ppcp-credit-card-gateway-card-expiry').addClass('ppcp-credit-card-gateway-form-field-disabled')
120
+ jQuery('label[for="ppcp-credit-card-gateway-card-cvc"]').addClass('ppcp-credit-card-gateway-form-field-disabled')
121
+ jQuery('#ppcp-credit-card-gateway-card-cvc').addClass('ppcp-credit-card-gateway-form-field-disabled')
122
+ jQuery('label[for="vault"]').addClass('ppcp-credit-card-gateway-form-field-disabled')
123
+ jQuery('#ppcp-credit-card-vault').addClass('ppcp-credit-card-gateway-form-field-disabled')
124
+ jQuery('#ppcp-credit-card-vault').attr("disabled", true)
125
+ this.renderer.disableCreditCardFields()
126
+ }
127
+
128
+ enableCreditCardFields() {
129
+ jQuery('label[for="ppcp-credit-card-gateway-card-number"]').removeClass('ppcp-credit-card-gateway-form-field-disabled')
130
+ jQuery('#ppcp-credit-card-gateway-card-number').removeClass('ppcp-credit-card-gateway-form-field-disabled')
131
+ jQuery('label[for="ppcp-credit-card-gateway-card-expiry"]').removeClass('ppcp-credit-card-gateway-form-field-disabled')
132
+ jQuery('#ppcp-credit-card-gateway-card-expiry').removeClass('ppcp-credit-card-gateway-form-field-disabled')
133
+ jQuery('label[for="ppcp-credit-card-gateway-card-cvc"]').removeClass('ppcp-credit-card-gateway-form-field-disabled')
134
+ jQuery('#ppcp-credit-card-gateway-card-cvc').removeClass('ppcp-credit-card-gateway-form-field-disabled')
135
+ jQuery('label[for="vault"]').removeClass('ppcp-credit-card-gateway-form-field-disabled')
136
+ jQuery('#ppcp-credit-card-vault').removeClass('ppcp-credit-card-gateway-form-field-disabled')
137
+ jQuery('#ppcp-credit-card-vault').attr("disabled", false)
138
+ this.renderer.enableCreditCardFields()
139
+ }
140
  }
141
 
142
  export default CheckoutBootstap
modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js CHANGED
@@ -8,6 +8,8 @@ class CreditCardRenderer {
8
  this.spinner = spinner;
9
  this.cardValid = false;
10
  this.formValid = false;
 
 
11
  }
12
 
13
  render(wrapper, contextConfig) {
@@ -31,6 +33,12 @@ class CreditCardRenderer {
31
  return;
32
  }
33
 
 
 
 
 
 
 
34
  const gateWayBox = document.querySelector('.payment_box.payment_method_ppcp-credit-card-gateway');
35
  const oldDisplayStyle = gateWayBox.style.display;
36
  gateWayBox.style.display = 'block';
@@ -92,36 +100,11 @@ class CreditCardRenderer {
92
  }
93
  }
94
  }).then(hostedFields => {
95
- const submitEvent = (event) => {
96
- this.spinner.block();
97
- if (event) {
98
- event.preventDefault();
99
- }
100
- this.errorHandler.clear();
101
-
102
- if (this.formValid && this.cardValid) {
103
- const save_card = this.defaultConfig.save_card ? true : false;
104
- const vault = document.getElementById('ppcp-credit-card-vault') ?
105
- document.getElementById('ppcp-credit-card-vault').checked : save_card;
106
- hostedFields.submit({
107
- contingencies: ['SCA_WHEN_REQUIRED'],
108
- vault: vault
109
- }).then((payload) => {
110
- payload.orderID = payload.orderId;
111
- this.spinner.unblock();
112
- return contextConfig.onApprove(payload);
113
- }).catch(() => {
114
- this.errorHandler.genericError();
115
- this.spinner.unblock();
116
- });
117
- } else {
118
- this.spinner.unblock();
119
- const message = ! this.cardValid ? this.defaultConfig.hosted_fields.labels.card_not_supported : this.defaultConfig.hosted_fields.labels.fields_not_valid;
120
- this.errorHandler.message(message);
121
- }
122
- }
123
- hostedFields.on('inputSubmitRequest', function () {
124
- submitEvent(null);
125
  });
126
  hostedFields.on('cardTypeChange', (event) => {
127
  if ( ! event.cards.length ) {
@@ -137,11 +120,18 @@ class CreditCardRenderer {
137
  });
138
  this.formValid = formValid;
139
 
140
- })
141
- document.querySelector(wrapper + ' button').addEventListener(
142
- 'click',
143
- submitEvent
144
- );
 
 
 
 
 
 
 
145
  });
146
 
147
  document.querySelector('#payment_method_ppcp-credit-card-gateway').addEventListener(
@@ -151,5 +141,69 @@ class CreditCardRenderer {
151
  }
152
  )
153
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154
  }
155
  export default CreditCardRenderer;
8
  this.spinner = spinner;
9
  this.cardValid = false;
10
  this.formValid = false;
11
+ this.currentHostedFieldsInstance = null;
12
+ this.formSubmissionSubscribed = false;
13
  }
14
 
15
  render(wrapper, contextConfig) {
33
  return;
34
  }
35
 
36
+ if (this.currentHostedFieldsInstance) {
37
+ this.currentHostedFieldsInstance.teardown()
38
+ .catch(err => console.error(`Hosted fields teardown error: ${err}`));
39
+ this.currentHostedFieldsInstance = null;
40
+ }
41
+
42
  const gateWayBox = document.querySelector('.payment_box.payment_method_ppcp-credit-card-gateway');
43
  const oldDisplayStyle = gateWayBox.style.display;
44
  gateWayBox.style.display = 'block';
100
  }
101
  }
102
  }).then(hostedFields => {
103
+ document.dispatchEvent(new CustomEvent("hosted_fields_loaded"));
104
+ this.currentHostedFieldsInstance = hostedFields;
105
+
106
+ hostedFields.on('inputSubmitRequest', () => {
107
+ this._submit(contextConfig);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  });
109
  hostedFields.on('cardTypeChange', (event) => {
110
  if ( ! event.cards.length ) {
120
  });
121
  this.formValid = formValid;
122
 
123
+ });
124
+
125
+ if (!this.formSubmissionSubscribed) {
126
+ document.querySelector(wrapper + ' button').addEventListener(
127
+ 'click',
128
+ event => {
129
+ event.preventDefault();
130
+ this._submit(contextConfig);
131
+ }
132
+ );
133
+ this.formSubmissionSubscribed = true;
134
+ }
135
  });
136
 
137
  document.querySelector('#payment_method_ppcp-credit-card-gateway').addEventListener(
141
  }
142
  )
143
  }
144
+
145
+ disableFields() {
146
+ if( this.currentHostedFieldsInstance) {
147
+ this.currentHostedFieldsInstance.setAttribute({
148
+ field: 'number',
149
+ attribute: 'disabled'
150
+ })
151
+ this.currentHostedFieldsInstance.setAttribute({
152
+ field: 'cvv',
153
+ attribute: 'disabled'
154
+ })
155
+ this.currentHostedFieldsInstance.setAttribute({
156
+ field: 'expirationDate',
157
+ attribute: 'disabled'
158
+ })
159
+ }
160
+ }
161
+
162
+ enableFields() {
163
+ if( this.currentHostedFieldsInstance) {
164
+ this.currentHostedFieldsInstance.removeAttribute({
165
+ field: 'number',
166
+ attribute: 'disabled'
167
+ })
168
+ this.currentHostedFieldsInstance.removeAttribute({
169
+ field: 'cvv',
170
+ attribute: 'disabled'
171
+ })
172
+ this.currentHostedFieldsInstance.removeAttribute({
173
+ field: 'expirationDate',
174
+ attribute: 'disabled'
175
+ })
176
+ }
177
+ }
178
+
179
+ _submit(contextConfig) {
180
+ this.spinner.block();
181
+ this.errorHandler.clear();
182
+
183
+ if (this.formValid && this.cardValid) {
184
+ const save_card = this.defaultConfig.save_card ? true : false;
185
+ const vault = document.getElementById('ppcp-credit-card-vault') ?
186
+ document.getElementById('ppcp-credit-card-vault').checked : save_card;
187
+ const contingency = this.defaultConfig.hosted_fields.contingency;
188
+ const hostedFieldsData = {
189
+ vault: vault
190
+ };
191
+ if (contingency !== 'NO_3D_SECURE') {
192
+ hostedFieldsData.contingencies = [contingency];
193
+ }
194
+ this.currentHostedFieldsInstance.submit(hostedFieldsData).then((payload) => {
195
+ payload.orderID = payload.orderId;
196
+ this.spinner.unblock();
197
+ return contextConfig.onApprove(payload);
198
+ }).catch(err => {
199
+ console.error(err);
200
+ this.spinner.unblock();
201
+ });
202
+ } else {
203
+ this.spinner.unblock();
204
+ const message = ! this.cardValid ? this.defaultConfig.hosted_fields.labels.card_not_supported : this.defaultConfig.hosted_fields.labels.fields_not_valid;
205
+ this.errorHandler.message(message);
206
+ }
207
+ }
208
  }
209
  export default CreditCardRenderer;
modules/ppcp-button/resources/js/modules/Renderer/Renderer.js CHANGED
@@ -43,6 +43,14 @@ class Renderer {
43
  domElement.style.display = 'block';
44
  return true;
45
  }
 
 
 
 
 
 
 
 
46
  }
47
 
48
- export default Renderer;
43
  domElement.style.display = 'block';
44
  return true;
45
  }
46
+
47
+ disableCreditCardFields() {
48
+ this.creditCardRenderer.disableFields();
49
+ }
50
+
51
+ enableCreditCardFields() {
52
+ this.creditCardRenderer.enableFields();
53
+ }
54
  }
55
 
56
+ export default Renderer;
modules/ppcp-button/services.php CHANGED
@@ -67,7 +67,7 @@ return array(
67
  $subscription_helper = $container->get( 'subscription.helper' );
68
  $messages_apply = $container->get( 'button.helper.messages-apply' );
69
  $environment = $container->get( 'onboarding.environment' );
70
- $payment_token_repository = $container->get( 'subscription.repository.payment-token' );
71
  $settings_status = $container->get( 'wcgateway.settings.status' );
72
  return new SmartButton(
73
  $container->get( 'button.url' ),
@@ -102,7 +102,8 @@ return array(
102
  $request_data = $container->get( 'button.request-data' );
103
  $repository = $container->get( 'api.repository.cart' );
104
  $data_store = \WC_Data_Store::load( 'product' );
105
- return new ChangeCartEndpoint( $cart, $shipping, $request_data, $repository, $data_store );
 
106
  },
107
  'button.endpoint.create-order' => static function ( $container ): CreateOrderEndpoint {
108
  $request_data = $container->get( 'button.request-data' );
@@ -113,6 +114,7 @@ return array(
113
  $session_handler = $container->get( 'session.handler' );
114
  $settings = $container->get( 'wcgateway.settings' );
115
  $early_order_handler = $container->get( 'button.helper.early-order-handler' );
 
116
  return new CreateOrderEndpoint(
117
  $request_data,
118
  $cart_repository,
@@ -121,7 +123,8 @@ return array(
121
  $payer_factory,
122
  $session_handler,
123
  $settings,
124
- $early_order_handler
 
125
  );
126
  },
127
  'button.helper.early-order-handler' => static function ( $container ) : EarlyOrderHandler {
@@ -153,13 +156,16 @@ return array(
153
  'button.endpoint.data-client-id' => static function( $container ) : DataClientIdEndpoint {
154
  $request_data = $container->get( 'button.request-data' );
155
  $identity_token = $container->get( 'api.endpoint.identity-token' );
 
156
  return new DataClientIdEndpoint(
157
  $request_data,
158
- $identity_token
 
159
  );
160
  },
161
  'button.helper.three-d-secure' => static function ( $container ): ThreeDSecure {
162
- return new ThreeDSecure();
 
163
  },
164
  'button.helper.messages-apply' => static function ( $container ): MessagesApply {
165
  return new MessagesApply();
67
  $subscription_helper = $container->get( 'subscription.helper' );
68
  $messages_apply = $container->get( 'button.helper.messages-apply' );
69
  $environment = $container->get( 'onboarding.environment' );
70
+ $payment_token_repository = $container->get( 'vaulting.repository.payment-token' );
71
  $settings_status = $container->get( 'wcgateway.settings.status' );
72
  return new SmartButton(
73
  $container->get( 'button.url' ),
102
  $request_data = $container->get( 'button.request-data' );
103
  $repository = $container->get( 'api.repository.cart' );
104
  $data_store = \WC_Data_Store::load( 'product' );
105
+ $logger = $container->get( 'woocommerce.logger.woocommerce' );
106
+ return new ChangeCartEndpoint( $cart, $shipping, $request_data, $repository, $data_store, $logger );
107
  },
108
  'button.endpoint.create-order' => static function ( $container ): CreateOrderEndpoint {
109
  $request_data = $container->get( 'button.request-data' );
114
  $session_handler = $container->get( 'session.handler' );
115
  $settings = $container->get( 'wcgateway.settings' );
116
  $early_order_handler = $container->get( 'button.helper.early-order-handler' );
117
+ $logger = $container->get( 'woocommerce.logger.woocommerce' );
118
  return new CreateOrderEndpoint(
119
  $request_data,
120
  $cart_repository,
123
  $payer_factory,
124
  $session_handler,
125
  $settings,
126
+ $early_order_handler,
127
+ $logger
128
  );
129
  },
130
  'button.helper.early-order-handler' => static function ( $container ) : EarlyOrderHandler {
156
  'button.endpoint.data-client-id' => static function( $container ) : DataClientIdEndpoint {
157
  $request_data = $container->get( 'button.request-data' );
158
  $identity_token = $container->get( 'api.endpoint.identity-token' );
159
+ $logger = $container->get( 'woocommerce.logger.woocommerce' );
160
  return new DataClientIdEndpoint(
161
  $request_data,
162
+ $identity_token,
163
+ $logger
164
  );
165
  },
166
  'button.helper.three-d-secure' => static function ( $container ): ThreeDSecure {
167
+ $logger = $container->get( 'woocommerce.logger.woocommerce' );
168
+ return new ThreeDSecure( $logger );
169
  },
170
  'button.helper.messages-apply' => static function ( $container ): MessagesApply {
171
  return new MessagesApply();
modules/ppcp-button/src/Assets/class-smartbutton.php CHANGED
@@ -20,7 +20,7 @@ use WooCommerce\PayPalCommerce\Button\Helper\MessagesApply;
20
  use WooCommerce\PayPalCommerce\Onboarding\Environment;
21
  use WooCommerce\PayPalCommerce\Session\SessionHandler;
22
  use WooCommerce\PayPalCommerce\Subscription\Helper\SubscriptionHelper;
23
- use WooCommerce\PayPalCommerce\Subscription\Repository\PaymentTokenRepository;
24
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
25
  use Woocommerce\PayPalCommerce\WcGateway\Helper\SettingsStatus;
26
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
@@ -601,6 +601,19 @@ class SmartButton implements SmartButtonInterface {
601
  return $this->subscription_helper->cart_contains_subscription();
602
  }
603
 
 
 
 
 
 
 
 
 
 
 
 
 
 
604
  /**
605
  * The localized data for the smart button.
606
  *
@@ -677,6 +690,7 @@ class SmartButton implements SmartButtonInterface {
677
  ),
678
  ),
679
  'valid_cards' => $this->dcc_applies->valid_cards(),
 
680
  ),
681
  'messages' => $this->message_values(),
682
  'labels' => array(
@@ -729,8 +743,7 @@ class SmartButton implements SmartButtonInterface {
729
  'currency' => get_woocommerce_currency(),
730
  'integration-date' => PAYPAL_INTEGRATION_DATE,
731
  'components' => implode( ',', $this->components() ),
732
- 'vault' => $this->can_save_vault_token() ?
733
- 'true' : 'false',
734
  'commit' => is_checkout() ? 'true' : 'false',
735
  'intent' => ( $this->settings->has( 'intent' ) ) ?
736
  $this->settings->get( 'intent' ) : 'capture',
@@ -743,11 +756,20 @@ class SmartButton implements SmartButtonInterface {
743
  ) {
744
  $params['buyer-country'] = WC()->customer->get_billing_country();
745
  }
746
- $disable_funding = $this->settings->has( 'disable_funding' ) ?
747
- $this->settings->get( 'disable_funding' ) : array();
 
 
 
748
  if ( ! is_checkout() ) {
749
  $disable_funding[] = 'card';
750
  }
 
 
 
 
 
 
751
 
752
  if ( count( $disable_funding ) > 0 ) {
753
  $params['disable-funding'] = implode( ',', array_unique( $disable_funding ) );
20
  use WooCommerce\PayPalCommerce\Onboarding\Environment;
21
  use WooCommerce\PayPalCommerce\Session\SessionHandler;
22
  use WooCommerce\PayPalCommerce\Subscription\Helper\SubscriptionHelper;
23
+ use WooCommerce\PayPalCommerce\Vaulting\PaymentTokenRepository;
24
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
25
  use Woocommerce\PayPalCommerce\WcGateway\Helper\SettingsStatus;
26
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
601
  return $this->subscription_helper->cart_contains_subscription();
602
  }
603
 
604
+ /**
605
+ * Retrieves the 3D Secure contingency settings.
606
+ *
607
+ * @return string
608
+ */
609
+ private function get_3ds_contingency(): string {
610
+ if ( $this->settings->has( '3d_secure_contingency' ) ) {
611
+ return $this->settings->get( '3d_secure_contingency' );
612
+ }
613
+
614
+ return 'SCA_WHEN_REQUIRED';
615
+ }
616
+
617
  /**
618
  * The localized data for the smart button.
619
  *
690
  ),
691
  ),
692
  'valid_cards' => $this->dcc_applies->valid_cards(),
693
+ 'contingency' => $this->get_3ds_contingency(),
694
  ),
695
  'messages' => $this->message_values(),
696
  'labels' => array(
743
  'currency' => get_woocommerce_currency(),
744
  'integration-date' => PAYPAL_INTEGRATION_DATE,
745
  'components' => implode( ',', $this->components() ),
746
+ 'vault' => $this->can_save_vault_token() ? 'true' : 'false',
 
747
  'commit' => is_checkout() ? 'true' : 'false',
748
  'intent' => ( $this->settings->has( 'intent' ) ) ?
749
  $this->settings->get( 'intent' ) : 'capture',
756
  ) {
757
  $params['buyer-country'] = WC()->customer->get_billing_country();
758
  }
759
+
760
+ $disable_funding = $this->settings->has( 'disable_funding' )
761
+ ? $this->settings->get( 'disable_funding' )
762
+ : array();
763
+
764
  if ( ! is_checkout() ) {
765
  $disable_funding[] = 'card';
766
  }
767
+ if ( is_checkout() && $this->settings->has( 'dcc_enabled' ) && $this->settings->get( 'dcc_enabled' ) ) {
768
+ $key = array_search( 'card', $disable_funding, true );
769
+ if ( false !== $key ) {
770
+ unset( $disable_funding[ $key ] );
771
+ }
772
+ }
773
 
774
  if ( count( $disable_funding ) > 0 ) {
775
  $params['disable-funding'] = implode( ',', array_unique( $disable_funding ) );
modules/ppcp-button/src/Endpoint/class-approveorderendpoint.php CHANGED
@@ -10,6 +10,7 @@ declare(strict_types=1);
10
 
11
  namespace WooCommerce\PayPalCommerce\Button\Endpoint;
12
 
 
13
  use Psr\Log\LoggerInterface;
14
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint;
15
  use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
@@ -195,7 +196,9 @@ class ApproveOrderEndpoint implements EndpointInterface {
195
  $this->session_handler->replace_order( $order );
196
  wp_send_json_success( $order );
197
  return true;
198
- } catch ( \RuntimeException $error ) {
 
 
199
  wp_send_json_error(
200
  array(
201
  'name' => is_a( $error, PayPalApiException::class ) ? $error->name() : '',
10
 
11
  namespace WooCommerce\PayPalCommerce\Button\Endpoint;
12
 
13
+ use Exception;
14
  use Psr\Log\LoggerInterface;
15
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint;
16
  use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
196
  $this->session_handler->replace_order( $order );
197
  wp_send_json_success( $order );
198
  return true;
199
+ } catch ( Exception $error ) {
200
+ $this->logger->error( 'Order approve failed: ' . $error->getMessage() );
201
+
202
  wp_send_json_error(
203
  array(
204
  'name' => is_a( $error, PayPalApiException::class ) ? $error->name() : '',
modules/ppcp-button/src/Endpoint/class-changecartendpoint.php CHANGED
@@ -9,6 +9,8 @@ declare(strict_types=1);
9
 
10
  namespace WooCommerce\PayPalCommerce\Button\Endpoint;
11
 
 
 
12
  use WooCommerce\PayPalCommerce\ApiClient\Entity\PurchaseUnit;
13
  use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
14
  use WooCommerce\PayPalCommerce\ApiClient\Repository\CartRepository;
@@ -57,21 +59,30 @@ class ChangeCartEndpoint implements EndpointInterface {
57
  */
58
  private $product_data_store;
59
 
 
 
 
 
 
 
 
60
  /**
61
  * ChangeCartEndpoint constructor.
62
  *
63
- * @param \WC_Cart $cart The current WC cart object.
64
- * @param \WC_Shipping $shipping The current WC shipping object.
65
- * @param RequestData $request_data The request data helper.
66
- * @param CartRepository $repository The repository for the current purchase items.
67
- * @param \WC_Data_Store $product_data_store The data store for products.
 
68
  */
69
  public function __construct(
70
  \WC_Cart $cart,
71
  \WC_Shipping $shipping,
72
  RequestData $request_data,
73
  CartRepository $repository,
74
- \WC_Data_Store $product_data_store
 
75
  ) {
76
 
77
  $this->cart = $cart;
@@ -79,6 +90,7 @@ class ChangeCartEndpoint implements EndpointInterface {
79
  $this->request_data = $request_data;
80
  $this->repository = $repository;
81
  $this->product_data_store = $product_data_store;
 
82
  }
83
 
84
  /**
@@ -94,12 +106,13 @@ class ChangeCartEndpoint implements EndpointInterface {
94
  * Handles the request.
95
  *
96
  * @return bool
97
- * @throws \Exception On error.
98
  */
99
  public function handle_request(): bool {
100
  try {
101
  return $this->handle_data();
102
- } catch ( RuntimeException $error ) {
 
 
103
  wp_send_json_error(
104
  array(
105
  'name' => is_a( $error, PayPalApiException::class ) ? $error->name() : '',
@@ -116,7 +129,7 @@ class ChangeCartEndpoint implements EndpointInterface {
116
  * Handles the request data.
117
  *
118
  * @return bool
119
- * @throws \Exception On error.
120
  */
121
  private function handle_data(): bool {
122
  $data = $this->request_data->read_request( $this->nonce() );
@@ -234,7 +247,7 @@ class ChangeCartEndpoint implements EndpointInterface {
234
  * @param int $quantity The Quantity.
235
  *
236
  * @return bool
237
- * @throws \Exception When product could not be added.
238
  */
239
  private function add_product( \WC_Product $product, int $quantity ): bool {
240
  return false !== $this->cart->add_to_cart( $product->get_id(), $quantity );
@@ -249,7 +262,7 @@ class ChangeCartEndpoint implements EndpointInterface {
249
  * @param array $post_variations The variations.
250
  *
251
  * @return bool
252
- * @throws \Exception When product could not be added.
253
  */
254
  private function add_variable_product(
255
  \WC_Product $product,
9
 
10
  namespace WooCommerce\PayPalCommerce\Button\Endpoint;
11
 
12
+ use Exception;
13
+ use Psr\Log\LoggerInterface;
14
  use WooCommerce\PayPalCommerce\ApiClient\Entity\PurchaseUnit;
15
  use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
16
  use WooCommerce\PayPalCommerce\ApiClient\Repository\CartRepository;
59
  */
60
  private $product_data_store;
61
 
62
+ /**
63
+ * The logger.
64
+ *
65
+ * @var LoggerInterface
66
+ */
67
+ protected $logger;
68
+
69
  /**
70
  * ChangeCartEndpoint constructor.
71
  *
72
+ * @param \WC_Cart $cart The current WC cart object.
73
+ * @param \WC_Shipping $shipping The current WC shipping object.
74
+ * @param RequestData $request_data The request data helper.
75
+ * @param CartRepository $repository The repository for the current purchase items.
76
+ * @param \WC_Data_Store $product_data_store The data store for products.
77
+ * @param LoggerInterface $logger The logger.
78
  */
79
  public function __construct(
80
  \WC_Cart $cart,
81
  \WC_Shipping $shipping,
82
  RequestData $request_data,
83
  CartRepository $repository,
84
+ \WC_Data_Store $product_data_store,
85
+ LoggerInterface $logger
86
  ) {
87
 
88
  $this->cart = $cart;
90
  $this->request_data = $request_data;
91
  $this->repository = $repository;
92
  $this->product_data_store = $product_data_store;
93
+ $this->logger = $logger;
94
  }
95
 
96
  /**
106
  * Handles the request.
107
  *
108
  * @return bool
 
109
  */
110
  public function handle_request(): bool {
111
  try {
112
  return $this->handle_data();
113
+ } catch ( Exception $error ) {
114
+ $this->logger->error( 'Cart updating failed: ' . $error->getMessage() );
115
+
116
  wp_send_json_error(
117
  array(
118
  'name' => is_a( $error, PayPalApiException::class ) ? $error->name() : '',
129
  * Handles the request data.
130
  *
131
  * @return bool
132
+ * @throws Exception On error.
133
  */
134
  private function handle_data(): bool {
135
  $data = $this->request_data->read_request( $this->nonce() );
247
  * @param int $quantity The Quantity.
248
  *
249
  * @return bool
250
+ * @throws Exception When product could not be added.
251
  */
252
  private function add_product( \WC_Product $product, int $quantity ): bool {
253
  return false !== $this->cart->add_to_cart( $product->get_id(), $quantity );
262
  * @param array $post_variations The variations.
263
  *
264
  * @return bool
265
+ * @throws Exception When product could not be added.
266
  */
267
  private function add_variable_product(
268
  \WC_Product $product,
modules/ppcp-button/src/Endpoint/class-createorderendpoint.php CHANGED
@@ -9,6 +9,8 @@ declare(strict_types=1);
9
 
10
  namespace WooCommerce\PayPalCommerce\Button\Endpoint;
11
 
 
 
12
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint;
13
  use WooCommerce\PayPalCommerce\ApiClient\Entity\Order;
14
  use WooCommerce\PayPalCommerce\ApiClient\Entity\Payer;
@@ -102,6 +104,13 @@ class CreateOrderEndpoint implements EndpointInterface {
102
  */
103
  private $purchase_units;
104
 
 
 
 
 
 
 
 
105
  /**
106
  * CreateOrderEndpoint constructor.
107
  *
@@ -113,6 +122,7 @@ class CreateOrderEndpoint implements EndpointInterface {
113
  * @param SessionHandler $session_handler The SessionHandler object.
114
  * @param Settings $settings The Settings object.
115
  * @param EarlyOrderHandler $early_order_handler The EarlyOrderHandler object.
 
116
  */
117
  public function __construct(
118
  RequestData $request_data,
@@ -122,7 +132,8 @@ class CreateOrderEndpoint implements EndpointInterface {
122
  PayerFactory $payer_factory,
123
  SessionHandler $session_handler,
124
  Settings $settings,
125
- EarlyOrderHandler $early_order_handler
 
126
  ) {
127
 
128
  $this->request_data = $request_data;
@@ -133,6 +144,7 @@ class CreateOrderEndpoint implements EndpointInterface {
133
  $this->session_handler = $session_handler;
134
  $this->settings = $settings;
135
  $this->early_order_handler = $early_order_handler;
 
136
  }
137
 
138
  /**
@@ -190,6 +202,8 @@ class CreateOrderEndpoint implements EndpointInterface {
190
  wp_send_json_success( $order->to_array() );
191
  return true;
192
  } catch ( \RuntimeException $error ) {
 
 
193
  wp_send_json_error(
194
  array(
195
  'name' => is_a( $error, PayPalApiException::class ) ? $error->name() : '',
@@ -198,7 +212,9 @@ class CreateOrderEndpoint implements EndpointInterface {
198
  'details' => is_a( $error, PayPalApiException::class ) ? $error->details() : array(),
199
  )
200
  );
201
- } catch ( \Exception $exception ) {
 
 
202
  wc_add_notice( $exception->getMessage(), 'error' );
203
  }
204
 
@@ -212,11 +228,16 @@ class CreateOrderEndpoint implements EndpointInterface {
212
  * @param \WP_Error $errors The errors, which occurred.
213
  *
214
  * @return array
 
215
  */
216
  public function after_checkout_validation( array $data, \WP_Error $errors ): array {
217
  if ( ! $errors->errors ) {
218
-
219
- $order = $this->create_paypal_order();
 
 
 
 
220
 
221
  /**
222
  * In case we are onboarded and everything is fine with the \WC_Order
@@ -231,6 +252,8 @@ class CreateOrderEndpoint implements EndpointInterface {
231
  return $data;
232
  }
233
 
 
 
234
  wp_send_json_error(
235
  array(
236
  'name' => '',
@@ -336,7 +359,7 @@ class CreateOrderEndpoint implements EndpointInterface {
336
  *
337
  * @param string $form_values The values of the form.
338
  *
339
- * @throws \Exception On Error.
340
  */
341
  private function process_checkout_form( string $form_values ) {
342
  $form_values = explode( '&', $form_values );
@@ -386,7 +409,7 @@ class CreateOrderEndpoint implements EndpointInterface {
386
  *
387
  * @param string $form_values The values of the form.
388
  * @param \WC_Order|null $wc_order WC order to get data from.
389
- * @throws \Exception On Error.
390
  */
391
  private function process_checkout_form_when_creating_account( string $form_values, \WC_Order $wc_order = null ) {
392
  $form_values = explode( '&', $form_values );
@@ -406,7 +429,12 @@ class CreateOrderEndpoint implements EndpointInterface {
406
  'woocommerce_after_checkout_validation',
407
  function ( array $data, \WP_Error $errors ) use ( $wc_order ) {
408
  if ( ! $errors->errors ) {
409
- $order = $this->create_paypal_order( $wc_order );
 
 
 
 
 
410
  wp_send_json_success( $order->to_array() );
411
  return true;
412
  }
9
 
10
  namespace WooCommerce\PayPalCommerce\Button\Endpoint;
11
 
12
+ use Exception;
13
+ use Psr\Log\LoggerInterface;
14
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint;
15
  use WooCommerce\PayPalCommerce\ApiClient\Entity\Order;
16
  use WooCommerce\PayPalCommerce\ApiClient\Entity\Payer;
104
  */
105
  private $purchase_units;
106
 
107
+ /**
108
+ * The logger.
109
+ *
110
+ * @var LoggerInterface
111
+ */
112
+ protected $logger;
113
+
114
  /**
115
  * CreateOrderEndpoint constructor.
116
  *
122
  * @param SessionHandler $session_handler The SessionHandler object.
123
  * @param Settings $settings The Settings object.
124
  * @param EarlyOrderHandler $early_order_handler The EarlyOrderHandler object.
125
+ * @param LoggerInterface $logger The logger.
126
  */
127
  public function __construct(
128
  RequestData $request_data,
132
  PayerFactory $payer_factory,
133
  SessionHandler $session_handler,
134
  Settings $settings,
135
+ EarlyOrderHandler $early_order_handler,
136
+ LoggerInterface $logger
137
  ) {
138
 
139
  $this->request_data = $request_data;
144
  $this->session_handler = $session_handler;
145
  $this->settings = $settings;
146
  $this->early_order_handler = $early_order_handler;
147
+ $this->logger = $logger;
148
  }
149
 
150
  /**
202
  wp_send_json_success( $order->to_array() );
203
  return true;
204
  } catch ( \RuntimeException $error ) {
205
+ $this->logger->error( 'Order creation failed: ' . $error->getMessage() );
206
+
207
  wp_send_json_error(
208
  array(
209
  'name' => is_a( $error, PayPalApiException::class ) ? $error->name() : '',
212
  'details' => is_a( $error, PayPalApiException::class ) ? $error->details() : array(),
213
  )
214
  );
215
+ } catch ( Exception $exception ) {
216
+ $this->logger->error( 'Order creation failed: ' . $exception->getMessage() );
217
+
218
  wc_add_notice( $exception->getMessage(), 'error' );
219
  }
220
 
228
  * @param \WP_Error $errors The errors, which occurred.
229
  *
230
  * @return array
231
+ * @throws Exception On Error.
232
  */
233
  public function after_checkout_validation( array $data, \WP_Error $errors ): array {
234
  if ( ! $errors->errors ) {
235
+ try {
236
+ $order = $this->create_paypal_order();
237
+ } catch ( Exception $exception ) {
238
+ $this->logger->error( 'Order creation failed: ' . $exception->getMessage() );
239
+ throw $exception;
240
+ }
241
 
242
  /**
243
  * In case we are onboarded and everything is fine with the \WC_Order
252
  return $data;
253
  }
254
 
255
+ $this->logger->error( 'Checkout validation failed: ' . $errors->get_error_message() );
256
+
257
  wp_send_json_error(
258
  array(
259
  'name' => '',
359
  *
360
  * @param string $form_values The values of the form.
361
  *
362
+ * @throws Exception On Error.
363
  */
364
  private function process_checkout_form( string $form_values ) {
365
  $form_values = explode( '&', $form_values );
409
  *
410
  * @param string $form_values The values of the form.
411
  * @param \WC_Order|null $wc_order WC order to get data from.
412
+ * @throws Exception On Error.
413
  */
414
  private function process_checkout_form_when_creating_account( string $form_values, \WC_Order $wc_order = null ) {
415
  $form_values = explode( '&', $form_values );
429
  'woocommerce_after_checkout_validation',
430
  function ( array $data, \WP_Error $errors ) use ( $wc_order ) {
431
  if ( ! $errors->errors ) {
432
+ try {
433
+ $order = $this->create_paypal_order( $wc_order );
434
+ } catch ( Exception $exception ) {
435
+ $this->logger->error( 'Order creation failed: ' . $exception->getMessage() );
436
+ throw $exception;
437
+ }
438
  wp_send_json_success( $order->to_array() );
439
  return true;
440
  }
modules/ppcp-button/src/Endpoint/class-dataclientidendpoint.php CHANGED
@@ -9,6 +9,8 @@ declare(strict_types=1);
9
 
10
  namespace WooCommerce\PayPalCommerce\Button\Endpoint;
11
 
 
 
12
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\IdentityToken;
13
  use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
14
  use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
@@ -35,19 +37,29 @@ class DataClientIdEndpoint implements EndpointInterface {
35
  */
36
  private $identity_token;
37
 
 
 
 
 
 
 
 
38
  /**
39
  * DataClientIdEndpoint constructor.
40
  *
41
- * @param RequestData $request_data The Request Data Helper.
42
- * @param IdentityToken $identity_token The Identity Token.
 
43
  */
44
  public function __construct(
45
  RequestData $request_data,
46
- IdentityToken $identity_token
 
47
  ) {
48
 
49
  $this->request_data = $request_data;
50
  $this->identity_token = $identity_token;
 
51
  }
52
 
53
  /**
@@ -77,7 +89,9 @@ class DataClientIdEndpoint implements EndpointInterface {
77
  )
78
  );
79
  return true;
80
- } catch ( RuntimeException $error ) {
 
 
81
  wp_send_json_error(
82
  array(
83
  'name' => is_a( $error, PayPalApiException::class ) ? $error->name() : '',
9
 
10
  namespace WooCommerce\PayPalCommerce\Button\Endpoint;
11
 
12
+ use Exception;
13
+ use Psr\Log\LoggerInterface;
14
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\IdentityToken;
15
  use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
16
  use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
37
  */
38
  private $identity_token;
39
 
40
+ /**
41
+ * The logger.
42
+ *
43
+ * @var LoggerInterface
44
+ */
45
+ protected $logger;
46
+
47
  /**
48
  * DataClientIdEndpoint constructor.
49
  *
50
+ * @param RequestData $request_data The Request Data Helper.
51
+ * @param IdentityToken $identity_token The Identity Token.
52
+ * @param LoggerInterface $logger The logger.
53
  */
54
  public function __construct(
55
  RequestData $request_data,
56
+ IdentityToken $identity_token,
57
+ LoggerInterface $logger
58
  ) {
59
 
60
  $this->request_data = $request_data;
61
  $this->identity_token = $identity_token;
62
+ $this->logger = $logger;
63
  }
64
 
65
  /**
89
  )
90
  );
91
  return true;
92
+ } catch ( Exception $error ) {
93
+ $this->logger->error( 'Client ID retrieval failed: ' . $error->getMessage() );
94
+
95
  wp_send_json_error(
96
  array(
97
  'name' => is_a( $error, PayPalApiException::class ) ? $error->name() : '',
modules/ppcp-button/src/Helper/class-threedsecure.php CHANGED
@@ -9,6 +9,7 @@ declare(strict_types=1);
9
 
10
  namespace WooCommerce\PayPalCommerce\Button\Helper;
11
 
 
12
  use WooCommerce\PayPalCommerce\ApiClient\Entity\CardAuthenticationResult as AuthResult;
13
  use WooCommerce\PayPalCommerce\ApiClient\Entity\Order;
14
 
@@ -17,12 +18,27 @@ use WooCommerce\PayPalCommerce\ApiClient\Entity\Order;
17
  */
18
  class ThreeDSecure {
19
 
20
-
21
  const NO_DECISION = 0;
22
  const PROCCEED = 1;
23
  const REJECT = 2;
24
  const RETRY = 3;
25
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  /**
27
  * Determine, how we proceed with a given order.
28
  *
@@ -42,7 +58,10 @@ class ThreeDSecure {
42
  if ( ! $order->payment_source()->card()->authentication_result() ) {
43
  return self::NO_DECISION;
44
  }
 
45
  $result = $order->payment_source()->card()->authentication_result();
 
 
46
  if ( $result->liability_shift() === AuthResult::LIABILITY_SHIFT_POSSIBLE ) {
47
  return self::PROCCEED;
48
  }
9
 
10
  namespace WooCommerce\PayPalCommerce\Button\Helper;
11
 
12
+ use Psr\Log\LoggerInterface;
13
  use WooCommerce\PayPalCommerce\ApiClient\Entity\CardAuthenticationResult as AuthResult;
14
  use WooCommerce\PayPalCommerce\ApiClient\Entity\Order;
15
 
18
  */
19
  class ThreeDSecure {
20
 
 
21
  const NO_DECISION = 0;
22
  const PROCCEED = 1;
23
  const REJECT = 2;
24
  const RETRY = 3;
25
 
26
+ /**
27
+ * The logger.
28
+ *
29
+ * @var LoggerInterface
30
+ */
31
+ protected $logger;
32
+
33
+ /**
34
+ * ThreeDSecure constructor.
35
+ *
36
+ * @param LoggerInterface $logger The logger.
37
+ */
38
+ public function __construct( LoggerInterface $logger ) {
39
+ $this->logger = $logger;
40
+ }
41
+
42
  /**
43
  * Determine, how we proceed with a given order.
44
  *
58
  if ( ! $order->payment_source()->card()->authentication_result() ) {
59
  return self::NO_DECISION;
60
  }
61
+
62
  $result = $order->payment_source()->card()->authentication_result();
63
+ $this->logger->info( '3DS authentication result: ' . wc_print_r( $result->to_array(), true ) );
64
+
65
  if ( $result->liability_shift() === AuthResult::LIABILITY_SHIFT_POSSIBLE ) {
66
  return self::PROCCEED;
67
  }
modules/ppcp-onboarding/services.php CHANGED
@@ -169,6 +169,7 @@ return array(
169
  $login_seller_sandbox = $container->get( 'api.endpoint.login-seller-sandbox' );
170
  $partner_referrals_data = $container->get( 'api.repository.partner-referrals-data' );
171
  $settings = $container->get( 'wcgateway.settings' );
 
172
 
173
  $cache = new Cache( 'ppcp-paypal-bearer' );
174
  return new LoginSellerEndpoint(
@@ -177,7 +178,8 @@ return array(
177
  $login_seller_sandbox,
178
  $partner_referrals_data,
179
  $settings,
180
- $cache
 
181
  );
182
  },
183
  'api.endpoint.partner-referrals-sandbox' => static function ( $container ) : PartnerReferrals {
169
  $login_seller_sandbox = $container->get( 'api.endpoint.login-seller-sandbox' );
170
  $partner_referrals_data = $container->get( 'api.repository.partner-referrals-data' );
171
  $settings = $container->get( 'wcgateway.settings' );
172
+ $logger = $container->get( 'woocommerce.logger.woocommerce' );
173
 
174
  $cache = new Cache( 'ppcp-paypal-bearer' );
175
  return new LoginSellerEndpoint(
178
  $login_seller_sandbox,
179
  $partner_referrals_data,
180
  $settings,
181
+ $cache,
182
+ $logger
183
  );
184
  },
185
  'api.endpoint.partner-referrals-sandbox' => static function ( $container ) : PartnerReferrals {
modules/ppcp-onboarding/src/Endpoint/class-loginsellerendpoint.php CHANGED
@@ -9,6 +9,8 @@ declare(strict_types=1);
9
 
10
  namespace WooCommerce\PayPalCommerce\Onboarding\Endpoint;
11
 
 
 
12
  use WooCommerce\PayPalCommerce\ApiClient\Authentication\PayPalBearer;
13
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\LoginSeller;
14
  use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache;
@@ -67,6 +69,13 @@ class LoginSellerEndpoint implements EndpointInterface {
67
  */
68
  private $cache;
69
 
 
 
 
 
 
 
 
70
  /**
71
  * LoginSellerEndpoint constructor.
72
  *
@@ -76,6 +85,7 @@ class LoginSellerEndpoint implements EndpointInterface {
76
  * @param PartnerReferralsData $partner_referrals_data The Partner Referrals Data.
77
  * @param Settings $settings The Settings.
78
  * @param Cache $cache The Cache.
 
79
  */
80
  public function __construct(
81
  RequestData $request_data,
@@ -83,7 +93,8 @@ class LoginSellerEndpoint implements EndpointInterface {
83
  LoginSeller $login_seller_sandbox,
84
  PartnerReferralsData $partner_referrals_data,
85
  Settings $settings,
86
- Cache $cache
 
87
  ) {
88
 
89
  $this->request_data = $request_data;
@@ -92,6 +103,7 @@ class LoginSellerEndpoint implements EndpointInterface {
92
  $this->partner_referrals_data = $partner_referrals_data;
93
  $this->settings = $settings;
94
  $this->cache = $cache;
 
95
  }
96
 
97
  /**
@@ -136,12 +148,13 @@ class LoginSellerEndpoint implements EndpointInterface {
136
  $this->cache->delete( PayPalBearer::CACHE_KEY );
137
  }
138
  wp_schedule_single_event(
139
- time() - 1,
140
  WebhookRegistrar::EVENT_HOOK
141
  );
142
  wp_send_json_success();
143
  return true;
144
- } catch ( \RuntimeException $error ) {
 
145
  wp_send_json_error( $error->getMessage() );
146
  return false;
147
  }
9
 
10
  namespace WooCommerce\PayPalCommerce\Onboarding\Endpoint;
11
 
12
+ use Exception;
13
+ use Psr\Log\LoggerInterface;
14
  use WooCommerce\PayPalCommerce\ApiClient\Authentication\PayPalBearer;
15
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\LoginSeller;
16
  use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache;
69
  */
70
  private $cache;
71
 
72
+ /**
73
+ * The logger.
74
+ *
75
+ * @var LoggerInterface
76
+ */
77
+ protected $logger;
78
+
79
  /**
80
  * LoginSellerEndpoint constructor.
81
  *
85
  * @param PartnerReferralsData $partner_referrals_data The Partner Referrals Data.
86
  * @param Settings $settings The Settings.
87
  * @param Cache $cache The Cache.
88
+ * @param LoggerInterface $logger The logger.
89
  */
90
  public function __construct(
91
  RequestData $request_data,
93
  LoginSeller $login_seller_sandbox,
94
  PartnerReferralsData $partner_referrals_data,
95
  Settings $settings,
96
+ Cache $cache,
97
+ LoggerInterface $logger
98
  ) {
99
 
100
  $this->request_data = $request_data;
103
  $this->partner_referrals_data = $partner_referrals_data;
104
  $this->settings = $settings;
105
  $this->cache = $cache;
106
+ $this->logger = $logger;
107
  }
108
 
109
  /**
148
  $this->cache->delete( PayPalBearer::CACHE_KEY );
149
  }
150
  wp_schedule_single_event(
151
+ time() + 5,
152
  WebhookRegistrar::EVENT_HOOK
153
  );
154
  wp_send_json_success();
155
  return true;
156
+ } catch ( Exception $error ) {
157
+ $this->logger->error( 'Onboarding completion handling error: ' . $error->getMessage() );
158
  wp_send_json_error( $error->getMessage() );
159
  return false;
160
  }
modules/ppcp-subscription/services.php CHANGED
@@ -10,16 +10,14 @@ declare(strict_types=1);
10
  namespace WooCommerce\PayPalCommerce\Subscription;
11
 
12
  use WooCommerce\PayPalCommerce\Subscription\Helper\SubscriptionHelper;
13
- use WooCommerce\PayPalCommerce\Subscription\Repository\PaymentTokenRepository;
14
- use Psr\Container\ContainerInterface;
15
 
16
  return array(
17
- 'subscription.helper' => static function ( $container ): SubscriptionHelper {
18
  return new SubscriptionHelper();
19
  },
20
- 'subscription.renewal-handler' => static function ( $container ): RenewalHandler {
21
  $logger = $container->get( 'woocommerce.logger.woocommerce' );
22
- $repository = $container->get( 'subscription.repository.payment-token' );
23
  $endpoint = $container->get( 'api.endpoint.order' );
24
  $purchase_unit_factory = $container->get( 'api.factory.purchase-unit' );
25
  $payer_factory = $container->get( 'api.factory.payer' );
@@ -31,9 +29,4 @@ return array(
31
  $payer_factory
32
  );
33
  },
34
- 'subscription.repository.payment-token' => static function ( $container ): PaymentTokenRepository {
35
- $factory = $container->get( 'api.factory.payment-token' );
36
- $endpoint = $container->get( 'api.endpoint.payment-token' );
37
- return new PaymentTokenRepository( $factory, $endpoint );
38
- },
39
  );
10
  namespace WooCommerce\PayPalCommerce\Subscription;
11
 
12
  use WooCommerce\PayPalCommerce\Subscription\Helper\SubscriptionHelper;
 
 
13
 
14
  return array(
15
+ 'subscription.helper' => static function ( $container ): SubscriptionHelper {
16
  return new SubscriptionHelper();
17
  },
18
+ 'subscription.renewal-handler' => static function ( $container ): RenewalHandler {
19
  $logger = $container->get( 'woocommerce.logger.woocommerce' );
20
+ $repository = $container->get( 'vaulting.repository.payment-token' );
21
  $endpoint = $container->get( 'api.endpoint.order' );
22
  $purchase_unit_factory = $container->get( 'api.factory.purchase-unit' );
23
  $payer_factory = $container->get( 'api.factory.payer' );
29
  $payer_factory
30
  );
31
  },
 
 
 
 
 
32
  );
modules/ppcp-subscription/src/class-renewalhandler.php CHANGED
@@ -15,7 +15,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
15
  use WooCommerce\PayPalCommerce\ApiClient\Entity\PaymentToken;
16
  use WooCommerce\PayPalCommerce\ApiClient\Factory\PayerFactory;
17
  use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory;
18
- use WooCommerce\PayPalCommerce\Subscription\Repository\PaymentTokenRepository;
19
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
20
  use Psr\Log\LoggerInterface;
21
 
15
  use WooCommerce\PayPalCommerce\ApiClient\Entity\PaymentToken;
16
  use WooCommerce\PayPalCommerce\ApiClient\Factory\PayerFactory;
17
  use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory;
18
+ use WooCommerce\PayPalCommerce\Vaulting\PaymentTokenRepository;
19
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
20
  use Psr\Log\LoggerInterface;
21
 
modules/ppcp-subscription/src/class-subscriptionmodule.php CHANGED
@@ -14,7 +14,7 @@ use Dhii\Modular\Module\ModuleInterface;
14
  use Psr\Log\LoggerInterface;
15
  use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
16
  use WooCommerce\PayPalCommerce\Subscription\Helper\SubscriptionHelper;
17
- use WooCommerce\PayPalCommerce\Subscription\Repository\PaymentTokenRepository;
18
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
19
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
20
  use Interop\Container\ServiceProviderInterface;
@@ -66,7 +66,7 @@ class SubscriptionModule implements ModuleInterface {
66
  add_action(
67
  'woocommerce_subscription_payment_complete',
68
  function ( $subscription ) use ( $container ) {
69
- $payment_token_repository = $container->get( 'subscription.repository.payment-token' );
70
  $logger = $container->get( 'woocommerce.logger.woocommerce' );
71
 
72
  $this->add_payment_token_id( $subscription, $payment_token_repository, $logger );
@@ -76,7 +76,7 @@ class SubscriptionModule implements ModuleInterface {
76
  add_filter(
77
  'woocommerce_gateway_description',
78
  function ( $description, $id ) use ( $container ) {
79
- $payment_token_repository = $container->get( 'subscription.repository.payment-token' );
80
  $settings = $container->get( 'wcgateway.settings' );
81
  $subscription_helper = $container->get( 'subscription.helper' );
82
 
@@ -89,7 +89,7 @@ class SubscriptionModule implements ModuleInterface {
89
  add_filter(
90
  'woocommerce_credit_card_form_fields',
91
  function ( $default_fields, $id ) use ( $container ) {
92
- $payment_token_repository = $container->get( 'subscription.repository.payment-token' );
93
  $settings = $container->get( 'wcgateway.settings' );
94
  $subscription_helper = $container->get( 'subscription.helper' );
95
 
14
  use Psr\Log\LoggerInterface;
15
  use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
16
  use WooCommerce\PayPalCommerce\Subscription\Helper\SubscriptionHelper;
17
+ use WooCommerce\PayPalCommerce\Vaulting\PaymentTokenRepository;
18
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
19
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
20
  use Interop\Container\ServiceProviderInterface;
66
  add_action(
67
  'woocommerce_subscription_payment_complete',
68
  function ( $subscription ) use ( $container ) {
69
+ $payment_token_repository = $container->get( 'vaulting.repository.payment-token' );
70
  $logger = $container->get( 'woocommerce.logger.woocommerce' );
71
 
72
  $this->add_payment_token_id( $subscription, $payment_token_repository, $logger );
76
  add_filter(
77
  'woocommerce_gateway_description',
78
  function ( $description, $id ) use ( $container ) {
79
+ $payment_token_repository = $container->get( 'vaulting.repository.payment-token' );
80
  $settings = $container->get( 'wcgateway.settings' );
81
  $subscription_helper = $container->get( 'subscription.helper' );
82
 
89
  add_filter(
90
  'woocommerce_credit_card_form_fields',
91
  function ( $default_fields, $id ) use ( $container ) {
92
+ $payment_token_repository = $container->get( 'vaulting.repository.payment-token' );
93
  $settings = $container->get( 'wcgateway.settings' );
94
  $subscription_helper = $container->get( 'subscription.helper' );
95
 
modules/ppcp-vaulting/assets/js/myaccount-payments.js ADDED
@@ -0,0 +1 @@
 
1
+ (()=>{var __webpack_modules__={864:function(){eval("document.addEventListener('DOMContentLoaded', () => {\n jQuery('.ppcp-delete-payment-button').click(async event => {\n event.preventDefault();\n jQuery(this).prop('disabled', true);\n const token = event.target.id;\n const response = await fetch(PayPalCommerceGatewayVaulting.delete.endpoint, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json'\n },\n body: JSON.stringify({\n nonce: PayPalCommerceGatewayVaulting.delete.nonce,\n token\n })\n });\n\n const reportError = error => {\n alert(error);\n };\n\n if (!response.ok) {\n try {\n const result = await response.json();\n reportError(result.data);\n } catch (exc) {\n console.error(exc);\n reportError(response.status);\n }\n }\n\n window.location.reload();\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wcGNwLXZhdWx0aW5nLy4vcmVzb3VyY2VzL2pzL215YWNjb3VudC1wYXltZW50cy5qcz9hMGIzIl0sIm5hbWVzIjpbImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsImpRdWVyeSIsImNsaWNrIiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsInByb3AiLCJ0b2tlbiIsInRhcmdldCIsImlkIiwicmVzcG9uc2UiLCJmZXRjaCIsIlBheVBhbENvbW1lcmNlR2F0ZXdheVZhdWx0aW5nIiwiZGVsZXRlIiwiZW5kcG9pbnQiLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJub25jZSIsInJlcG9ydEVycm9yIiwiZXJyb3IiLCJhbGVydCIsIm9rIiwicmVzdWx0IiwianNvbiIsImRhdGEiLCJleGMiLCJjb25zb2xlIiwic3RhdHVzIiwid2luZG93IiwibG9jYXRpb24iLCJyZWxvYWQiXSwibWFwcGluZ3MiOiJBQUFBQSxRQUFRLENBQUNDLGdCQUFULENBQ0ksa0JBREosRUFFSSxNQUFNO0FBQ0ZDLEVBQUFBLE1BQU0sQ0FBQyw2QkFBRCxDQUFOLENBQXNDQyxLQUF0QyxDQUE0QyxNQUFPQyxLQUFQLElBQWlCO0FBQ3pEQSxJQUFBQSxLQUFLLENBQUNDLGNBQU47QUFDQUgsSUFBQUEsTUFBTSxDQUFDLElBQUQsQ0FBTixDQUFhSSxJQUFiLENBQWtCLFVBQWxCLEVBQThCLElBQTlCO0FBQ0EsVUFBTUMsS0FBSyxHQUFHSCxLQUFLLENBQUNJLE1BQU4sQ0FBYUMsRUFBM0I7QUFFQSxVQUFNQyxRQUFRLEdBQUcsTUFBTUMsS0FBSyxDQUN4QkMsNkJBQTZCLENBQUNDLE1BQTlCLENBQXFDQyxRQURiLEVBRXhCO0FBQ0lDLE1BQUFBLE1BQU0sRUFBRSxNQURaO0FBRUlDLE1BQUFBLE9BQU8sRUFBRTtBQUNMLHdCQUFnQjtBQURYLE9BRmI7QUFLSUMsTUFBQUEsSUFBSSxFQUFFQyxJQUFJLENBQUNDLFNBQUwsQ0FDRjtBQUNJQyxRQUFBQSxLQUFLLEVBQUVSLDZCQUE2QixDQUFDQyxNQUE5QixDQUFxQ08sS0FEaEQ7QUFFSWIsUUFBQUE7QUFGSixPQURFO0FBTFYsS0FGd0IsQ0FBNUI7O0FBZ0JBLFVBQU1jLFdBQVcsR0FBR0MsS0FBSyxJQUFJO0FBQ3pCQyxNQUFBQSxLQUFLLENBQUNELEtBQUQsQ0FBTDtBQUNILEtBRkQ7O0FBSUEsUUFBSSxDQUFDWixRQUFRLENBQUNjLEVBQWQsRUFBa0I7QUFDZCxVQUFJO0FBQ0EsY0FBTUMsTUFBTSxHQUFHLE1BQU1mLFFBQVEsQ0FBQ2dCLElBQVQsRUFBckI7QUFDQUwsUUFBQUEsV0FBVyxDQUFDSSxNQUFNLENBQUNFLElBQVIsQ0FBWDtBQUNILE9BSEQsQ0FHRSxPQUFPQyxHQUFQLEVBQVk7QUFDVkMsUUFBQUEsT0FBTyxDQUFDUCxLQUFSLENBQWNNLEdBQWQ7QUFDQVAsUUFBQUEsV0FBVyxDQUFDWCxRQUFRLENBQUNvQixNQUFWLENBQVg7QUFDSDtBQUNKOztBQUVEQyxJQUFBQSxNQUFNLENBQUNDLFFBQVAsQ0FBZ0JDLE1BQWhCO0FBQ0gsR0FwQ0Q7QUFxQ0gsQ0F4Q0wiLCJzb3VyY2VzQ29udGVudCI6WyJkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICdET01Db250ZW50TG9hZGVkJyxcbiAgICAoKSA9PiB7XG4gICAgICAgIGpRdWVyeSgnLnBwY3AtZGVsZXRlLXBheW1lbnQtYnV0dG9uJykuY2xpY2soYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IGV2ZW50LnRhcmdldC5pZDtcblxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICBQYXlQYWxDb21tZXJjZUdhdGV3YXlWYXVsdGluZy5kZWxldGUuZW5kcG9pbnQsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25jZTogUGF5UGFsQ29tbWVyY2VHYXRld2F5VmF1bHRpbmcuZGVsZXRlLm5vbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgcmVwb3J0RXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgYWxlcnQoZXJyb3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRFcnJvcihyZXN1bHQuZGF0YSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXhjKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXhjKTtcbiAgICAgICAgICAgICAgICAgICAgcmVwb3J0RXJyb3IocmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4iXSwiZmlsZSI6Ijg2NC5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///864\n")}},__webpack_exports__={};__webpack_modules__[864]()})();
modules/ppcp-vaulting/extensions.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The vaulting module extensions.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\Vaulting
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\Vaulting;
11
+
12
+ return array();
modules/ppcp-vaulting/module.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The vaulting module.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\Vaulting
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\Vaulting;
11
+
12
+ use Dhii\Modular\Module\ModuleInterface;
13
+
14
+ return static function (): ModuleInterface {
15
+ return new VaultingModule();
16
+ };
modules/ppcp-vaulting/package.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "ppcp-vaulting",
3
+ "version": "1.0.0",
4
+ "license": "GPL-3.0-or-later",
5
+ "main": "resources/js/myaccount-payments.js",
6
+ "devDependencies": {
7
+ "@babel/core": "^7.9.0",
8
+ "@babel/preset-env": "^7.9.5",
9
+ "babel-loader": "^8.1.0",
10
+ "babel-plugin-transform-object-rest-spread": "^6.26.0",
11
+ "cross-env": "^7.0.3",
12
+ "file-loader": "^6.2.0",
13
+ "sass": "^1.42.1",
14
+ "sass-loader": "^12.1.0",
15
+ "webpack": "^5.55.1",
16
+ "webpack-cli": "^4.8.0"
17
+ },
18
+ "scripts": {
19
+ "build": "cross-env BABEL_ENV=default NODE_ENV=production webpack",
20
+ "watch": "cross-env BABEL_ENV=default NODE_ENV=production webpack --watch",
21
+ "dev": "cross-env BABEL_ENV=default webpack --watch"
22
+ }
23
+ }
modules/ppcp-vaulting/resources/js/myaccount-payments.js ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ document.addEventListener(
2
+ 'DOMContentLoaded',
3
+ () => {
4
+ jQuery('.ppcp-delete-payment-button').click(async (event) => {
5
+ event.preventDefault();
6
+ jQuery(this).prop('disabled', true);
7
+ const token = event.target.id;
8
+
9
+ const response = await fetch(
10
+ PayPalCommerceGatewayVaulting.delete.endpoint,
11
+ {
12
+ method: 'POST',
13
+ headers: {
14
+ 'content-type': 'application/json'
15
+ },
16
+ body: JSON.stringify(
17
+ {
18
+ nonce: PayPalCommerceGatewayVaulting.delete.nonce,
19
+ token,
20
+ }
21
+ )
22
+ }
23
+ );
24
+
25
+ const reportError = error => {
26
+ alert(error);
27
+ }
28
+
29
+ if (!response.ok) {
30
+ try {
31
+ const result = await response.json();
32
+ reportError(result.data);
33
+ } catch (exc) {
34
+ console.error(exc);
35
+ reportError(response.status);
36
+ }
37
+ }
38
+
39
+ window.location.reload();
40
+ });
41
+ });
modules/ppcp-vaulting/services.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The vaulting module services.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\Vaulting
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\Vaulting;
11
+
12
+ use WooCommerce\PayPalCommerce\Vaulting\Assets\MyAccountPaymentsAssets;
13
+ use WooCommerce\PayPalCommerce\Vaulting\Endpoint\DeletePaymentTokenEndpoint;
14
+
15
+ return array(
16
+ 'vaulting.module-url' => static function ( $container ): string {
17
+ return plugins_url(
18
+ '/modules/ppcp-vaulting/',
19
+ dirname( __FILE__, 3 ) . '/woocommerce-paypal-payments.php'
20
+ );
21
+ },
22
+ 'vaulting.assets.myaccount-payments' => function( $container ) : MyAccountPaymentsAssets {
23
+ return new MyAccountPaymentsAssets(
24
+ $container->get( 'vaulting.module-url' )
25
+ );
26
+ },
27
+ 'vaulting.payment-tokens-renderer' => static function (): PaymentTokensRenderer {
28
+ return new PaymentTokensRenderer();
29
+ },
30
+ 'vaulting.repository.payment-token' => static function ( $container ): PaymentTokenRepository {
31
+ $factory = $container->get( 'api.factory.payment-token' );
32
+ $endpoint = $container->get( 'api.endpoint.payment-token' );
33
+ return new PaymentTokenRepository( $factory, $endpoint );
34
+ },
35
+ 'vaulting.endpoint.delete' => function( $container ) : DeletePaymentTokenEndpoint {
36
+ return new DeletePaymentTokenEndpoint(
37
+ $container->get( 'vaulting.repository.payment-token' ),
38
+ $container->get( 'button.request-data' ),
39
+ $container->get( 'woocommerce.logger.woocommerce' )
40
+ );
41
+ },
42
+ );
modules/ppcp-vaulting/src/Assets/class-myaccountpaymentsassets.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Register and configure assets for My account PayPal payments page.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\Vaulting\Assets
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\Vaulting\Assets;
11
+
12
+ use WooCommerce\PayPalCommerce\Vaulting\Endpoint\DeletePaymentTokenEndpoint;
13
+
14
+ /**
15
+ * Class MyAccountPaymentsAssets
16
+ */
17
+ class MyAccountPaymentsAssets {
18
+
19
+ /**
20
+ * The URL to the module.
21
+ *
22
+ * @var string
23
+ */
24
+ private $module_url;
25
+
26
+ /**
27
+ * WebhooksStatusPageAssets constructor.
28
+ *
29
+ * @param string $module_url The URL to the module.
30
+ */
31
+ public function __construct(
32
+ string $module_url
33
+ ) {
34
+ $this->module_url = untrailingslashit( $module_url );
35
+ }
36
+
37
+ /**
38
+ * Enqueues the necessary scripts.
39
+ *
40
+ * @return void
41
+ */
42
+ public function enqueue(): void {
43
+ wp_enqueue_script(
44
+ 'ppcp-vaulting-myaccount-payments',
45
+ $this->module_url . '/assets/js/myaccount-payments.js',
46
+ array( 'jquery' ),
47
+ '1',
48
+ true
49
+ );
50
+ }
51
+
52
+ /**
53
+ * Localize script.
54
+ */
55
+ public function localize() {
56
+ wp_localize_script(
57
+ 'ppcp-vaulting-myaccount-payments',
58
+ 'PayPalCommerceGatewayVaulting',
59
+ array(
60
+ 'delete' => array(
61
+ 'endpoint' => home_url( \WC_AJAX::get_endpoint( DeletePaymentTokenEndpoint::ENDPOINT ) ),
62
+ 'nonce' => wp_create_nonce( DeletePaymentTokenEndpoint::nonce() ),
63
+ ),
64
+ )
65
+ );
66
+ }
67
+ }
modules/ppcp-vaulting/src/Endpoint/class-deletepaymenttokenendpoint.php ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The endpoint for deleting payment tokens.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\Vaulting\Endpoint
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\Vaulting\Endpoint;
11
+
12
+ use Exception;
13
+ use Psr\Log\LoggerInterface;
14
+ use WooCommerce\PayPalCommerce\Button\Endpoint\RequestData;
15
+ use WooCommerce\PayPalCommerce\Vaulting\PaymentTokenRepository;
16
+
17
+ /**
18
+ * Class DeletePayment
19
+ */
20
+ class DeletePaymentTokenEndpoint {
21
+
22
+ const ENDPOINT = 'ppc-vaulting-delete';
23
+
24
+ /**
25
+ * The repository.
26
+ *
27
+ * @var PaymentTokenRepository
28
+ */
29
+ protected $repository;
30
+
31
+ /**
32
+ * The request data.
33
+ *
34
+ * @var RequestData
35
+ */
36
+ protected $request_data;
37
+
38
+ /**
39
+ * The logger.
40
+ *
41
+ * @var LoggerInterface
42
+ */
43
+ protected $logger;
44
+
45
+ /**
46
+ * DeletePaymentTokenEndpoint constructor.
47
+ *
48
+ * @param PaymentTokenRepository $repository The repository.
49
+ * @param RequestData $request_data The request data.
50
+ * @param LoggerInterface $logger The logger.
51
+ */
52
+ public function __construct( PaymentTokenRepository $repository, RequestData $request_data, LoggerInterface $logger ) {
53
+ $this->repository = $repository;
54
+ $this->request_data = $request_data;
55
+ $this->logger = $logger;
56
+ }
57
+
58
+ /**
59
+ * Returns the nonce for the endpoint.
60
+ *
61
+ * @return string
62
+ */
63
+ public static function nonce(): string {
64
+ return self::ENDPOINT;
65
+ }
66
+
67
+ /**
68
+ * Handles the incoming request.
69
+ */
70
+ public function handle_request() {
71
+ try {
72
+ $data = $this->request_data->read_request( $this->nonce() );
73
+
74
+ $tokens = $this->repository->all_for_user_id( get_current_user_id() );
75
+ if ( $tokens ) {
76
+ foreach ( $tokens as $token ) {
77
+ if ( isset( $data['token'] ) && $token->id() === $data['token'] ) {
78
+ if ( $this->repository->delete_token( get_current_user_id(), $token ) ) {
79
+ wp_send_json_success();
80
+ return true;
81
+ }
82
+
83
+ wp_send_json_error( 'Could not delete payment token.' );
84
+ return false;
85
+ }
86
+ }
87
+ }
88
+ } catch ( Exception $error ) {
89
+ $this->logger->error( 'Failed to delete payment: ' . $error->getMessage() );
90
+ wp_send_json_error( $error->getMessage(), 403 );
91
+ return false;
92
+ }
93
+ }
94
+ }
95
+
modules/{ppcp-subscription/src/Repository → ppcp-vaulting/src}/class-paymenttokenrepository.php RENAMED
@@ -2,12 +2,12 @@
2
  /**
3
  * The payment token repository returns or deletes payment tokens for users.
4
  *
5
- * @package WooCommerce\PayPalCommerce\Subscription\Repository
6
  */
7
 
8
  declare(strict_types=1);
9
 
10
- namespace WooCommerce\PayPalCommerce\Subscription\Repository;
11
 
12
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PaymentTokenEndpoint;
13
  use WooCommerce\PayPalCommerce\ApiClient\Entity\PaymentToken;
@@ -107,13 +107,8 @@ class PaymentTokenRepository {
107
  * @param PaymentToken[] $tokens The tokens.
108
  * @return bool Whether tokens contains card or not.
109
  */
110
- public function tokens_contains_card( $tokens ): bool {
111
- foreach ( $tokens as $token ) {
112
- if ( isset( $token->source()->card ) ) {
113
- return true;
114
- }
115
- }
116
- return false;
117
  }
118
 
119
  /**
@@ -122,13 +117,8 @@ class PaymentTokenRepository {
122
  * @param PaymentToken[] $tokens The tokens.
123
  * @return bool Whether tokens contains card or not.
124
  */
125
- public function tokens_contains_paypal( $tokens ): bool {
126
- foreach ( $tokens as $token ) {
127
- if ( isset( $token->source()->paypal ) ) {
128
- return true;
129
- }
130
- }
131
- return false;
132
  }
133
 
134
  /**
@@ -145,4 +135,21 @@ class PaymentTokenRepository {
145
  update_user_meta( $id, self::USER_META, $token_array );
146
  return $token;
147
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
  }
2
  /**
3
  * The payment token repository returns or deletes payment tokens for users.
4
  *
5
+ * @package WooCommerce\PayPalCommerce\Vaulting
6
  */
7
 
8
  declare(strict_types=1);
9
 
10
+ namespace WooCommerce\PayPalCommerce\Vaulting;
11
 
12
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PaymentTokenEndpoint;
13
  use WooCommerce\PayPalCommerce\ApiClient\Entity\PaymentToken;
107
  * @param PaymentToken[] $tokens The tokens.
108
  * @return bool Whether tokens contains card or not.
109
  */
110
+ public function tokens_contains_card( array $tokens ): bool {
111
+ return $this->token_contains_source( $tokens, 'card' );
 
 
 
 
 
112
  }
113
 
114
  /**
117
  * @param PaymentToken[] $tokens The tokens.
118
  * @return bool Whether tokens contains card or not.
119
  */
120
+ public function tokens_contains_paypal( array $tokens ): bool {
121
+ return $this->token_contains_source( $tokens, 'paypal' );
 
 
 
 
 
122
  }
123
 
124
  /**
135
  update_user_meta( $id, self::USER_META, $token_array );
136
  return $token;
137
  }
138
+
139
+ /**
140
+ * Checks if tokens has the given source.
141
+ *
142
+ * @param array $tokens Payment tokens.
143
+ * @param string $source_type Payment token source type.
144
+ * @return bool Whether tokens contains source or not.
145
+ */
146
+ private function token_contains_source( array $tokens, string $source_type ): bool {
147
+ foreach ( $tokens as $token ) {
148
+ if ( isset( $token->source()->card ) && 'card' === $source_type || isset( $token->source()->paypal ) && 'paypal' === $source_type ) {
149
+ return true;
150
+ }
151
+ }
152
+
153
+ return false;
154
+ }
155
  }
modules/ppcp-vaulting/src/class-paymenttokensrenderer.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The payment tokens renderer.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\Vaulting
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\Vaulting;
11
+
12
+ use WooCommerce\PayPalCommerce\ApiClient\Entity\PaymentToken;
13
+
14
+ /**
15
+ * Class PaymentTokensRendered
16
+ */
17
+ class PaymentTokensRenderer {
18
+
19
+ /**
20
+ * Render payment tokens.
21
+ *
22
+ * @param PaymentToken[] $tokens The tokens.
23
+ * @return false|string
24
+ */
25
+ public function render( array $tokens ) {
26
+ ob_start();
27
+ ?>
28
+ <table class="shop_table shop_table_responsive">
29
+ <thead>
30
+ <tr>
31
+ <th><?php echo esc_html__( 'Payment sources', 'woocommerce-paypal-payments' ); ?></th>
32
+ <th></th>
33
+ </tr>
34
+ </thead>
35
+ <tbody>
36
+ <?php
37
+ foreach ( $tokens as $token ) {
38
+ $source = $token->source() ?? null;
39
+ if ( $source && isset( $source->card ) ) {
40
+ ?>
41
+ <tr>
42
+ <td><?php echo esc_attr( $source->card->brand ) . ' ...' . esc_attr( $source->card->last_digits ); ?></td>
43
+ <td>
44
+ <a class="ppcp-delete-payment-button" id="<?php echo esc_attr( $token->id() ); ?>" href=""><?php echo esc_html__( 'Delete', 'woocommerce-paypal-payments' ); ?></a>
45
+ </td>
46
+ </tr>
47
+ <?php
48
+ }
49
+ if ( $source && isset( $source->paypal ) ) {
50
+ ?>
51
+ <tr>
52
+ <td><?php echo esc_attr( $source->paypal->payer->email_address ); ?></td>
53
+ <td>
54
+ <a class="ppcp-delete-payment-button" id="<?php echo esc_attr( $token->id() ); ?>" href=""><?php echo esc_html__( 'Delete', 'woocommerce-paypal-payments' ); ?></a>
55
+ </td>
56
+ </tr>
57
+ <?php
58
+ }
59
+ ?>
60
+ <?php
61
+ }
62
+ ?>
63
+ </tbody>
64
+ </table>
65
+ <?php
66
+ return ob_get_clean();
67
+ }
68
+
69
+ /**
70
+ * Render no payments message.
71
+ *
72
+ * @return false|string
73
+ */
74
+ public function render_no_tokens() {
75
+ ob_start();
76
+ ?>
77
+ <div class="woocommerce-Message woocommerce-Message--info woocommerce-info">
78
+ <?php echo esc_html__( 'No payments available yet.', 'woocommerce-paypal-payments' ); ?>
79
+ </div>
80
+ <?php
81
+ return ob_get_clean();
82
+ }
83
+ }
modules/ppcp-vaulting/src/class-vaultingmodule.php ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The vaulting module.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\Vaulting
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\Vaulting;
11
+
12
+ use Dhii\Container\ServiceProvider;
13
+ use Dhii\Modular\Module\ModuleInterface;
14
+ use Interop\Container\ServiceProviderInterface;
15
+ use Psr\Container\ContainerInterface;
16
+ use WooCommerce\PayPalCommerce\Vaulting\Endpoint\DeletePaymentTokenEndpoint;
17
+
18
+ /**
19
+ * Class StatusReportModule
20
+ */
21
+ class VaultingModule implements ModuleInterface {
22
+
23
+
24
+ /**
25
+ * {@inheritDoc}
26
+ */
27
+ public function setup(): ServiceProviderInterface {
28
+ return new ServiceProvider(
29
+ require __DIR__ . '/../services.php',
30
+ require __DIR__ . '/../extensions.php'
31
+ );
32
+ }
33
+
34
+ /**
35
+ * {@inheritDoc}
36
+ *
37
+ * @param ContainerInterface $container A services container instance.
38
+ */
39
+ public function run( ContainerInterface $container ): void {
40
+
41
+ add_filter(
42
+ 'woocommerce_account_menu_items',
43
+ function( $menu_links ) {
44
+ $menu_links = array_slice( $menu_links, 0, 5, true )
45
+ + array( 'ppcp-paypal-payment-tokens' => 'PayPal payments' )
46
+ + array_slice( $menu_links, 5, null, true );
47
+
48
+ return $menu_links;
49
+ },
50
+ 40
51
+ );
52
+
53
+ add_action(
54
+ 'init',
55
+ function () {
56
+ add_rewrite_endpoint( 'ppcp-paypal-payment-tokens', EP_PAGES );
57
+ }
58
+ );
59
+
60
+ add_action(
61
+ 'woocommerce_account_ppcp-paypal-payment-tokens_endpoint',
62
+ function () use ( $container ) {
63
+ $payment_token_repository = $container->get( 'vaulting.repository.payment-token' );
64
+ $renderer = $container->get( 'vaulting.payment-tokens-renderer' );
65
+
66
+ $tokens = $payment_token_repository->all_for_user_id( get_current_user_id() );
67
+ if ( $tokens ) {
68
+ echo wp_kses_post( $renderer->render( $tokens ) );
69
+ } else {
70
+ echo wp_kses_post( $renderer->render_no_tokens() );
71
+ }
72
+ }
73
+ );
74
+
75
+ $asset_loader = $container->get( 'vaulting.assets.myaccount-payments' );
76
+ add_action(
77
+ 'wp_enqueue_scripts',
78
+ function () use ( $asset_loader ) {
79
+ if ( is_account_page() && $this->is_payments_page() ) {
80
+ $asset_loader->enqueue();
81
+ $asset_loader->localize();
82
+ }
83
+ }
84
+ );
85
+
86
+ add_action(
87
+ 'wc_ajax_' . DeletePaymentTokenEndpoint::ENDPOINT,
88
+ static function () use ( $container ) {
89
+ $endpoint = $container->get( 'vaulting.endpoint.delete' );
90
+ assert( $endpoint instanceof DeletePaymentTokenEndpoint );
91
+
92
+ $endpoint->handle_request();
93
+ }
94
+ );
95
+ }
96
+
97
+ /**
98
+ * {@inheritDoc}
99
+ */
100
+ public function getKey() { }
101
+
102
+ /**
103
+ * Check if is payments page.
104
+ *
105
+ * @return bool Whethen page is payments or not.
106
+ */
107
+ private function is_payments_page(): bool {
108
+ global $wp;
109
+ $request = explode( '/', wp_parse_url( $wp->request, PHP_URL_PATH ) );
110
+ if ( end( $request ) === 'ppcp-paypal-payment-tokens' ) {
111
+ return true;
112
+ }
113
+
114
+ return false;
115
+ }
116
+ }
modules/ppcp-vaulting/webpack.config.js ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const path = require('path');
2
+ const isProduction = process.env.NODE_ENV === 'production';
3
+
4
+ module.exports = {
5
+ devtool: 'eval-source-map',
6
+ mode: isProduction ? 'production' : 'development',
7
+ target: 'web',
8
+ entry: {
9
+ 'myaccount-payments': path.resolve('./resources/js/myaccount-payments.js'),
10
+ },
11
+ output: {
12
+ path: path.resolve(__dirname, 'assets/'),
13
+ filename: 'js/[name].js',
14
+ },
15
+ module: {
16
+ rules: [{
17
+ test: /\.js?$/,
18
+ exclude: /node_modules/,
19
+ loader: 'babel-loader',
20
+ }]
21
+ }
22
+ };
modules/ppcp-vaulting/yarn.lock ADDED
@@ -0,0 +1,2219 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2
+ # yarn lockfile v1
3
+
4
+
5
+ "@babel/code-frame@^7.14.5":
6
+ version "7.14.5"
7
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb"
8
+ integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==
9
+ dependencies:
10
+ "@babel/highlight" "^7.14.5"
11
+
12
+ "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0":
13
+ version "7.15.0"
14
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176"
15
+ integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==
16
+
17
+ "@babel/core@^7.9.0":
18
+ version "7.15.5"
19
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9"
20
+ integrity sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==
21
+ dependencies:
22
+ "@babel/code-frame" "^7.14.5"
23
+ "@babel/generator" "^7.15.4"
24
+ "@babel/helper-compilation-targets" "^7.15.4"
25
+ "@babel/helper-module-transforms" "^7.15.4"
26
+ "@babel/helpers" "^7.15.4"
27
+ "@babel/parser" "^7.15.5"
28
+ "@babel/template" "^7.15.4"
29
+ "@babel/traverse" "^7.15.4"
30
+ "@babel/types" "^7.15.4"
31
+ convert-source-map "^1.7.0"
32
+ debug "^4.1.0"
33
+ gensync "^1.0.0-beta.2"
34
+ json5 "^2.1.2"
35
+ semver "^6.3.0"
36
+ source-map "^0.5.0"
37
+
38
+ "@babel/generator@^7.15.4":
39
+ version "7.15.4"
40
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0"
41
+ integrity sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==
42
+ dependencies:
43
+ "@babel/types" "^7.15.4"
44
+ jsesc "^2.5.1"
45
+ source-map "^0.5.0"
46
+
47
+ "@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4":
48
+ version "7.15.4"
49
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835"
50
+ integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==
51
+ dependencies:
52
+ "@babel/types" "^7.15.4"
53
+
54
+ "@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5":
55
+ version "7.15.4"
56
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz#21ad815f609b84ee0e3058676c33cf6d1670525f"
57
+ integrity sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==
58
+ dependencies:
59
+ "@babel/helper-explode-assignable-expression" "^7.15.4"
60
+ "@babel/types" "^7.15.4"
61
+
62
+ "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4":
63
+ version "7.15.4"
64
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9"
65
+ integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==
66
+ dependencies:
67
+ "@babel/compat-data" "^7.15.0"
68
+ "@babel/helper-validator-option" "^7.14.5"
69
+ browserslist "^4.16.6"
70
+ semver "^6.3.0"
71
+
72
+ "@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4":
73
+ version "7.15.4"
74
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e"
75
+ integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==
76
+ dependencies:
77
+ "@babel/helper-annotate-as-pure" "^7.15.4"
78
+ "@babel/helper-function-name" "^7.15.4"
79
+ "@babel/helper-member-expression-to-functions" "^7.15.4"
80
+ "@babel/helper-optimise-call-expression" "^7.15.4"
81
+ "@babel/helper-replace-supers" "^7.15.4"
82
+ "@babel/helper-split-export-declaration" "^7.15.4"
83
+
84
+ "@babel/helper-create-regexp-features-plugin@^7.14.5":
85
+ version "7.14.5"
86
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4"
87
+ integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==
88
+ dependencies:
89
+ "@babel/helper-annotate-as-pure" "^7.14.5"
90
+ regexpu-core "^4.7.1"
91
+
92
+ "@babel/helper-define-polyfill-provider@^0.2.2":
93
+ version "0.2.3"
94
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6"
95
+ integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==
96
+ dependencies:
97
+ "@babel/helper-compilation-targets" "^7.13.0"
98
+ "@babel/helper-module-imports" "^7.12.13"
99
+ "@babel/helper-plugin-utils" "^7.13.0"
100
+ "@babel/traverse" "^7.13.0"
101
+ debug "^4.1.1"
102
+ lodash.debounce "^4.0.8"
103
+ resolve "^1.14.2"
104
+ semver "^6.1.2"
105
+
106
+ "@babel/helper-explode-assignable-expression@^7.15.4":
107
+ version "7.15.4"
108
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c"
109
+ integrity sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==
110
+ dependencies:
111
+ "@babel/types" "^7.15.4"
112
+
113
+ "@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4":
114
+ version "7.15.4"
115
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc"
116
+ integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==
117
+ dependencies:
118
+ "@babel/helper-get-function-arity" "^7.15.4"
119
+ "@babel/template" "^7.15.4"
120
+ "@babel/types" "^7.15.4"
121
+
122
+ "@babel/helper-get-function-arity@^7.15.4":
123
+ version "7.15.4"
124
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b"
125
+ integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==
126
+ dependencies:
127
+ "@babel/types" "^7.15.4"
128
+
129
+ "@babel/helper-hoist-variables@^7.15.4":
130
+ version "7.15.4"
131
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df"
132
+ integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==
133
+ dependencies:
134
+ "@babel/types" "^7.15.4"
135
+
136
+ "@babel/helper-member-expression-to-functions@^7.15.4":
137
+ version "7.15.4"
138
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef"
139
+ integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==
140
+ dependencies:
141
+ "@babel/types" "^7.15.4"
142
+
143
+ "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4":
144
+ version "7.15.4"
145
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f"
146
+ integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==
147
+ dependencies:
148
+ "@babel/types" "^7.15.4"
149
+
150
+ "@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4":
151
+ version "7.15.7"
152
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz#7da80c8cbc1f02655d83f8b79d25866afe50d226"
153
+ integrity sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==
154
+ dependencies:
155
+ "@babel/helper-module-imports" "^7.15.4"
156
+ "@babel/helper-replace-supers" "^7.15.4"
157
+ "@babel/helper-simple-access" "^7.15.4"
158
+ "@babel/helper-split-export-declaration" "^7.15.4"
159
+ "@babel/helper-validator-identifier" "^7.15.7"
160
+ "@babel/template" "^7.15.4"
161
+ "@babel/traverse" "^7.15.4"
162
+ "@babel/types" "^7.15.6"
163
+
164
+ "@babel/helper-optimise-call-expression@^7.15.4":
165
+ version "7.15.4"
166
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171"
167
+ integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==
168
+ dependencies:
169
+ "@babel/types" "^7.15.4"
170
+
171
+ "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
172
+ version "7.14.5"
173
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9"
174
+ integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==
175
+
176
+ "@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4":
177
+ version "7.15.4"
178
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f"
179
+ integrity sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==
180
+ dependencies:
181
+ "@babel/helper-annotate-as-pure" "^7.15.4"
182
+ "@babel/helper-wrap-function" "^7.15.4"
183
+ "@babel/types" "^7.15.4"
184
+
185
+ "@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4":
186
+ version "7.15.4"
187
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a"
188
+ integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==
189
+ dependencies:
190
+ "@babel/helper-member-expression-to-functions" "^7.15.4"
191
+ "@babel/helper-optimise-call-expression" "^7.15.4"
192
+ "@babel/traverse" "^7.15.4"
193
+ "@babel/types" "^7.15.4"
194
+
195
+ "@babel/helper-simple-access@^7.15.4":
196
+ version "7.15.4"
197
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b"
198
+ integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==
199
+ dependencies:
200
+ "@babel/types" "^7.15.4"
201
+
202
+ "@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4":
203
+ version "7.15.4"
204
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb"
205
+ integrity sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==
206
+ dependencies:
207
+ "@babel/types" "^7.15.4"
208
+
209
+ "@babel/helper-split-export-declaration@^7.15.4":
210
+ version "7.15.4"
211
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257"
212
+ integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==
213
+ dependencies:
214
+ "@babel/types" "^7.15.4"
215
+
216
+ "@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7":
217
+ version "7.15.7"
218
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389"
219
+ integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==
220
+
221
+ "@babel/helper-validator-option@^7.14.5":
222
+ version "7.14.5"
223
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3"
224
+ integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==
225
+
226
+ "@babel/helper-wrap-function@^7.15.4":
227
+ version "7.15.4"
228
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7"
229
+ integrity sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==
230
+ dependencies:
231
+ "@babel/helper-function-name" "^7.15.4"
232
+ "@babel/template" "^7.15.4"
233
+ "@babel/traverse" "^7.15.4"
234
+ "@babel/types" "^7.15.4"
235
+
236
+ "@babel/helpers@^7.15.4":
237
+ version "7.15.4"
238
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43"
239
+ integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==
240
+ dependencies:
241
+ "@babel/template" "^7.15.4"
242
+ "@babel/traverse" "^7.15.4"
243
+ "@babel/types" "^7.15.4"
244
+
245
+ "@babel/highlight@^7.14.5":
246
+ version "7.14.5"
247
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9"
248
+ integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==
249
+ dependencies:
250
+ "@babel/helper-validator-identifier" "^7.14.5"
251
+ chalk "^2.0.0"
252
+ js-tokens "^4.0.0"
253
+
254
+ "@babel/parser@^7.15.4", "@babel/parser@^7.15.5":
255
+ version "7.15.7"
256
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.7.tgz#0c3ed4a2eb07b165dfa85b3cc45c727334c4edae"
257
+ integrity sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==
258
+
259
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4":
260
+ version "7.15.4"
261
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e"
262
+ integrity sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==
263
+ dependencies:
264
+ "@babel/helper-plugin-utils" "^7.14.5"
265
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4"
266
+ "@babel/plugin-proposal-optional-chaining" "^7.14.5"
267
+
268
+ "@babel/plugin-proposal-async-generator-functions@^7.15.4":
269
+ version "7.15.4"
270
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz#f82aabe96c135d2ceaa917feb9f5fca31635277e"
271
+ integrity sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw==
272
+ dependencies:
273
+ "@babel/helper-plugin-utils" "^7.14.5"
274
+ "@babel/helper-remap-async-to-generator" "^7.15.4"
275
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
276
+
277
+ "@babel/plugin-proposal-class-properties@^7.14.5":
278
+ version "7.14.5"
279
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e"
280
+ integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==
281
+ dependencies:
282
+ "@babel/helper-create-class-features-plugin" "^7.14.5"
283
+ "@babel/helper-plugin-utils" "^7.14.5"
284
+
285
+ "@babel/plugin-proposal-class-static-block@^7.15.4":
286
+ version "7.15.4"
287
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz#3e7ca6128453c089e8b477a99f970c63fc1cb8d7"
288
+ integrity sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==
289
+ dependencies:
290
+ "@babel/helper-create-class-features-plugin" "^7.15.4"
291
+ "@babel/helper-plugin-utils" "^7.14.5"
292
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
293
+
294
+ "@babel/plugin-proposal-dynamic-import@^7.14.5":
295
+ version "7.14.5"
296
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c"
297
+ integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==
298
+ dependencies:
299
+ "@babel/helper-plugin-utils" "^7.14.5"
300
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
301
+
302
+ "@babel/plugin-proposal-export-namespace-from@^7.14.5":
303
+ version "7.14.5"
304
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76"
305
+ integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==
306
+ dependencies:
307
+ "@babel/helper-plugin-utils" "^7.14.5"
308
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
309
+
310
+ "@babel/plugin-proposal-json-strings@^7.14.5":
311
+ version "7.14.5"
312
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb"
313
+ integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==
314
+ dependencies:
315
+ "@babel/helper-plugin-utils" "^7.14.5"
316
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
317
+
318
+ "@babel/plugin-proposal-logical-assignment-operators@^7.14.5":
319
+ version "7.14.5"
320
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738"
321
+ integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==
322
+ dependencies:
323
+ "@babel/helper-plugin-utils" "^7.14.5"
324
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
325
+
326
+ "@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5":
327
+ version "7.14.5"
328
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6"
329
+ integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==
330
+ dependencies:
331
+ "@babel/helper-plugin-utils" "^7.14.5"
332
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
333
+
334
+ "@babel/plugin-proposal-numeric-separator@^7.14.5":
335
+ version "7.14.5"
336
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18"
337
+ integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==
338
+ dependencies:
339
+ "@babel/helper-plugin-utils" "^7.14.5"
340
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
341
+
342
+ "@babel/plugin-proposal-object-rest-spread@^7.15.6":
343
+ version "7.15.6"
344
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11"
345
+ integrity sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==
346
+ dependencies:
347
+ "@babel/compat-data" "^7.15.0"
348
+ "@babel/helper-compilation-targets" "^7.15.4"
349
+ "@babel/helper-plugin-utils" "^7.14.5"
350
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
351
+ "@babel/plugin-transform-parameters" "^7.15.4"
352
+
353
+ "@babel/plugin-proposal-optional-catch-binding@^7.14.5":
354
+ version "7.14.5"
355
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c"
356
+ integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==
357
+ dependencies:
358
+ "@babel/helper-plugin-utils" "^7.14.5"
359
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
360
+
361
+ "@babel/plugin-proposal-optional-chaining@^7.14.5":
362
+ version "7.14.5"
363
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603"
364
+ integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==
365
+ dependencies:
366
+ "@babel/helper-plugin-utils" "^7.14.5"
367
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5"
368
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
369
+
370
+ "@babel/plugin-proposal-private-methods@^7.14.5":
371
+ version "7.14.5"
372
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d"
373
+ integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==
374
+ dependencies:
375
+ "@babel/helper-create-class-features-plugin" "^7.14.5"
376
+ "@babel/helper-plugin-utils" "^7.14.5"
377
+
378
+ "@babel/plugin-proposal-private-property-in-object@^7.15.4":
379
+ version "7.15.4"
380
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz#55c5e3b4d0261fd44fe637e3f624cfb0f484e3e5"
381
+ integrity sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==
382
+ dependencies:
383
+ "@babel/helper-annotate-as-pure" "^7.15.4"
384
+ "@babel/helper-create-class-features-plugin" "^7.15.4"
385
+ "@babel/helper-plugin-utils" "^7.14.5"
386
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
387
+
388
+ "@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
389
+ version "7.14.5"
390
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8"
391
+ integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==
392
+ dependencies:
393
+ "@babel/helper-create-regexp-features-plugin" "^7.14.5"
394
+ "@babel/helper-plugin-utils" "^7.14.5"
395
+
396
+ "@babel/plugin-syntax-async-generators@^7.8.4":
397
+ version "7.8.4"
398
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
399
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
400
+ dependencies:
401
+ "@babel/helper-plugin-utils" "^7.8.0"
402
+
403
+ "@babel/plugin-syntax-class-properties@^7.12.13":
404
+ version "7.12.13"
405
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
406
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
407
+ dependencies:
408
+ "@babel/helper-plugin-utils" "^7.12.13"
409
+
410
+ "@babel/plugin-syntax-class-static-block@^7.14.5":
411
+ version "7.14.5"
412
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
413
+ integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
414
+ dependencies:
415
+ "@babel/helper-plugin-utils" "^7.14.5"
416
+
417
+ "@babel/plugin-syntax-dynamic-import@^7.8.3":
418
+ version "7.8.3"
419
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
420
+ integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
421
+ dependencies:
422
+ "@babel/helper-plugin-utils" "^7.8.0"
423
+
424
+ "@babel/plugin-syntax-export-namespace-from@^7.8.3":
425
+ version "7.8.3"
426
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
427
+ integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
428
+ dependencies:
429
+ "@babel/helper-plugin-utils" "^7.8.3"
430
+
431
+ "@babel/plugin-syntax-json-strings@^7.8.3":
432
+ version "7.8.3"
433
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
434
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
435
+ dependencies:
436
+ "@babel/helper-plugin-utils" "^7.8.0"
437
+
438
+ "@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
439
+ version "7.10.4"
440
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
441
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
442
+ dependencies:
443
+ "@babel/helper-plugin-utils" "^7.10.4"
444
+
445
+ "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
446
+ version "7.8.3"
447
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
448
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
449
+ dependencies:
450
+ "@babel/helper-plugin-utils" "^7.8.0"
451
+
452
+ "@babel/plugin-syntax-numeric-separator@^7.10.4":
453
+ version "7.10.4"
454
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
455
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
456
+ dependencies:
457
+ "@babel/helper-plugin-utils" "^7.10.4"
458
+
459
+ "@babel/plugin-syntax-object-rest-spread@^7.8.3":
460
+ version "7.8.3"
461
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
462
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
463
+ dependencies:
464
+ "@babel/helper-plugin-utils" "^7.8.0"
465
+
466
+ "@babel/plugin-syntax-optional-catch-binding@^7.8.3":
467
+ version "7.8.3"
468
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
469
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
470
+ dependencies:
471
+ "@babel/helper-plugin-utils" "^7.8.0"
472
+
473
+ "@babel/plugin-syntax-optional-chaining@^7.8.3":
474
+ version "7.8.3"
475
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
476
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
477
+ dependencies:
478
+ "@babel/helper-plugin-utils" "^7.8.0"
479
+
480
+ "@babel/plugin-syntax-private-property-in-object@^7.14.5":
481
+ version "7.14.5"
482
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
483
+ integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
484
+ dependencies:
485
+ "@babel/helper-plugin-utils" "^7.14.5"
486
+
487
+ "@babel/plugin-syntax-top-level-await@^7.14.5":
488
+ version "7.14.5"
489
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
490
+ integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
491
+ dependencies:
492
+ "@babel/helper-plugin-utils" "^7.14.5"
493
+
494
+ "@babel/plugin-transform-arrow-functions@^7.14.5":
495
+ version "7.14.5"
496
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a"
497
+ integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==
498
+ dependencies:
499
+ "@babel/helper-plugin-utils" "^7.14.5"
500
+
501
+ "@babel/plugin-transform-async-to-generator@^7.14.5":
502
+ version "7.14.5"
503
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67"
504
+ integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==
505
+ dependencies:
506
+ "@babel/helper-module-imports" "^7.14.5"
507
+ "@babel/helper-plugin-utils" "^7.14.5"
508
+ "@babel/helper-remap-async-to-generator" "^7.14.5"
509
+
510
+ "@babel/plugin-transform-block-scoped-functions@^7.14.5":
511
+ version "7.14.5"
512
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4"
513
+ integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==
514
+ dependencies:
515
+ "@babel/helper-plugin-utils" "^7.14.5"
516
+
517
+ "@babel/plugin-transform-block-scoping@^7.15.3":
518
+ version "7.15.3"
519
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf"
520
+ integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==
521
+ dependencies:
522
+ "@babel/helper-plugin-utils" "^7.14.5"
523
+
524
+ "@babel/plugin-transform-classes@^7.15.4":
525
+ version "7.15.4"
526
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1"
527
+ integrity sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==
528
+ dependencies:
529
+ "@babel/helper-annotate-as-pure" "^7.15.4"
530
+ "@babel/helper-function-name" "^7.15.4"
531
+ "@babel/helper-optimise-call-expression" "^7.15.4"
532
+ "@babel/helper-plugin-utils" "^7.14.5"
533
+ "@babel/helper-replace-supers" "^7.15.4"
534
+ "@babel/helper-split-export-declaration" "^7.15.4"
535
+ globals "^11.1.0"
536
+
537
+ "@babel/plugin-transform-computed-properties@^7.14.5":
538
+ version "7.14.5"
539
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f"
540
+ integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==
541
+ dependencies:
542
+ "@babel/helper-plugin-utils" "^7.14.5"
543
+
544
+ "@babel/plugin-transform-destructuring@^7.14.7":
545
+ version "7.14.7"
546
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576"
547
+ integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==
548
+ dependencies:
549
+ "@babel/helper-plugin-utils" "^7.14.5"
550
+
551
+ "@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4":
552
+ version "7.14.5"
553
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a"
554
+ integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==
555
+ dependencies:
556
+ "@babel/helper-create-regexp-features-plugin" "^7.14.5"
557
+ "@babel/helper-plugin-utils" "^7.14.5"
558
+
559
+ "@babel/plugin-transform-duplicate-keys@^7.14.5":
560
+ version "7.14.5"
561
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954"
562
+ integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==
563
+ dependencies:
564
+ "@babel/helper-plugin-utils" "^7.14.5"
565
+
566
+ "@babel/plugin-transform-exponentiation-operator@^7.14.5":
567
+ version "7.14.5"
568
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493"
569
+ integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==
570
+ dependencies:
571
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5"
572
+ "@babel/helper-plugin-utils" "^7.14.5"
573
+
574
+ "@babel/plugin-transform-for-of@^7.15.4":
575
+ version "7.15.4"
576
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2"
577
+ integrity sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==
578
+ dependencies:
579
+ "@babel/helper-plugin-utils" "^7.14.5"
580
+
581
+ "@babel/plugin-transform-function-name@^7.14.5":
582
+ version "7.14.5"
583
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2"
584
+ integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==
585
+ dependencies:
586
+ "@babel/helper-function-name" "^7.14.5"
587
+ "@babel/helper-plugin-utils" "^7.14.5"
588
+
589
+ "@babel/plugin-transform-literals@^7.14.5":
590
+ version "7.14.5"
591
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78"
592
+ integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==
593
+ dependencies:
594
+ "@babel/helper-plugin-utils" "^7.14.5"
595
+
596
+ "@babel/plugin-transform-member-expression-literals@^7.14.5":
597
+ version "7.14.5"
598
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7"
599
+ integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==
600
+ dependencies:
601
+ "@babel/helper-plugin-utils" "^7.14.5"
602
+
603
+ "@babel/plugin-transform-modules-amd@^7.14.5":
604
+ version "7.14.5"
605
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7"
606
+ integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==
607
+ dependencies:
608
+ "@babel/helper-module-transforms" "^7.14.5"
609
+ "@babel/helper-plugin-utils" "^7.14.5"
610
+ babel-plugin-dynamic-import-node "^2.3.3"
611
+
612
+ "@babel/plugin-transform-modules-commonjs@^7.15.4":
613
+ version "7.15.4"
614
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1"
615
+ integrity sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==
616
+ dependencies:
617
+ "@babel/helper-module-transforms" "^7.15.4"
618
+ "@babel/helper-plugin-utils" "^7.14.5"
619
+ "@babel/helper-simple-access" "^7.15.4"
620
+ babel-plugin-dynamic-import-node "^2.3.3"
621
+
622
+ "@babel/plugin-transform-modules-systemjs@^7.15.4":
623
+ version "7.15.4"
624
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132"
625
+ integrity sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==
626
+ dependencies:
627
+ "@babel/helper-hoist-variables" "^7.15.4"
628
+ "@babel/helper-module-transforms" "^7.15.4"
629
+ "@babel/helper-plugin-utils" "^7.14.5"
630
+ "@babel/helper-validator-identifier" "^7.14.9"
631
+ babel-plugin-dynamic-import-node "^2.3.3"
632
+
633
+ "@babel/plugin-transform-modules-umd@^7.14.5":
634
+ version "7.14.5"
635
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0"
636
+ integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==
637
+ dependencies:
638
+ "@babel/helper-module-transforms" "^7.14.5"
639
+ "@babel/helper-plugin-utils" "^7.14.5"
640
+
641
+ "@babel/plugin-transform-named-capturing-groups-regex@^7.14.9":
642
+ version "7.14.9"
643
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2"
644
+ integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==
645
+ dependencies:
646
+ "@babel/helper-create-regexp-features-plugin" "^7.14.5"
647
+
648
+ "@babel/plugin-transform-new-target@^7.14.5":
649
+ version "7.14.5"
650
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8"
651
+ integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==
652
+ dependencies:
653
+ "@babel/helper-plugin-utils" "^7.14.5"
654
+
655
+ "@babel/plugin-transform-object-super@^7.14.5":
656
+ version "7.14.5"
657
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45"
658
+ integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==
659
+ dependencies:
660
+ "@babel/helper-plugin-utils" "^7.14.5"
661
+ "@babel/helper-replace-supers" "^7.14.5"
662
+
663
+ "@babel/plugin-transform-parameters@^7.15.4":
664
+ version "7.15.4"
665
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62"
666
+ integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==
667
+ dependencies:
668
+ "@babel/helper-plugin-utils" "^7.14.5"
669
+
670
+ "@babel/plugin-transform-property-literals@^7.14.5":
671
+ version "7.14.5"
672
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34"
673
+ integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==
674
+ dependencies:
675
+ "@babel/helper-plugin-utils" "^7.14.5"
676
+
677
+ "@babel/plugin-transform-regenerator@^7.14.5":
678
+ version "7.14.5"
679
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f"
680
+ integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==
681
+ dependencies:
682
+ regenerator-transform "^0.14.2"
683
+
684
+ "@babel/plugin-transform-reserved-words@^7.14.5":
685
+ version "7.14.5"
686
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304"
687
+ integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==
688
+ dependencies:
689
+ "@babel/helper-plugin-utils" "^7.14.5"
690
+
691
+ "@babel/plugin-transform-shorthand-properties@^7.14.5":
692
+ version "7.14.5"
693
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58"
694
+ integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==
695
+ dependencies:
696
+ "@babel/helper-plugin-utils" "^7.14.5"
697
+
698
+ "@babel/plugin-transform-spread@^7.14.6":
699
+ version "7.14.6"
700
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144"
701
+ integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==
702
+ dependencies:
703
+ "@babel/helper-plugin-utils" "^7.14.5"
704
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5"
705
+
706
+ "@babel/plugin-transform-sticky-regex@^7.14.5":
707
+ version "7.14.5"
708
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9"
709
+ integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==
710
+ dependencies:
711
+ "@babel/helper-plugin-utils" "^7.14.5"
712
+
713
+ "@babel/plugin-transform-template-literals@^7.14.5":
714
+ version "7.14.5"
715
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93"
716
+ integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==
717
+ dependencies:
718
+ "@babel/helper-plugin-utils" "^7.14.5"
719
+
720
+ "@babel/plugin-transform-typeof-symbol@^7.14.5":
721
+ version "7.14.5"
722
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4"
723
+ integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==
724
+ dependencies:
725
+ "@babel/helper-plugin-utils" "^7.14.5"
726
+
727
+ "@babel/plugin-transform-unicode-escapes@^7.14.5":
728
+ version "7.14.5"
729
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b"
730
+ integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==
731
+ dependencies:
732
+ "@babel/helper-plugin-utils" "^7.14.5"
733
+
734
+ "@babel/plugin-transform-unicode-regex@^7.14.5":
735
+ version "7.14.5"
736
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e"
737
+ integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==
738
+ dependencies:
739
+ "@babel/helper-create-regexp-features-plugin" "^7.14.5"
740
+ "@babel/helper-plugin-utils" "^7.14.5"
741
+
742
+ "@babel/preset-env@^7.9.5":
743
+ version "7.15.6"
744
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.6.tgz#0f3898db9d63d320f21b17380d8462779de57659"
745
+ integrity sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw==
746
+ dependencies:
747
+ "@babel/compat-data" "^7.15.0"
748
+ "@babel/helper-compilation-targets" "^7.15.4"
749
+ "@babel/helper-plugin-utils" "^7.14.5"
750
+ "@babel/helper-validator-option" "^7.14.5"
751
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.15.4"
752
+ "@babel/plugin-proposal-async-generator-functions" "^7.15.4"
753
+ "@babel/plugin-proposal-class-properties" "^7.14.5"
754
+ "@babel/plugin-proposal-class-static-block" "^7.15.4"
755
+ "@babel/plugin-proposal-dynamic-import" "^7.14.5"
756
+ "@babel/plugin-proposal-export-namespace-from" "^7.14.5"
757
+ "@babel/plugin-proposal-json-strings" "^7.14.5"
758
+ "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5"
759
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5"
760
+ "@babel/plugin-proposal-numeric-separator" "^7.14.5"
761
+ "@babel/plugin-proposal-object-rest-spread" "^7.15.6"
762
+ "@babel/plugin-proposal-optional-catch-binding" "^7.14.5"
763
+ "@babel/plugin-proposal-optional-chaining" "^7.14.5"
764
+ "@babel/plugin-proposal-private-methods" "^7.14.5"
765
+ "@babel/plugin-proposal-private-property-in-object" "^7.15.4"
766
+ "@babel/plugin-proposal-unicode-property-regex" "^7.14.5"
767
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
768
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
769
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
770
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
771
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
772
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
773
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
774
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
775
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
776
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
777
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
778
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
779
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
780
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
781
+ "@babel/plugin-transform-arrow-functions" "^7.14.5"
782
+ "@babel/plugin-transform-async-to-generator" "^7.14.5"
783
+ "@babel/plugin-transform-block-scoped-functions" "^7.14.5"
784
+ "@babel/plugin-transform-block-scoping" "^7.15.3"
785
+ "@babel/plugin-transform-classes" "^7.15.4"
786
+ "@babel/plugin-transform-computed-properties" "^7.14.5"
787
+ "@babel/plugin-transform-destructuring" "^7.14.7"
788
+ "@babel/plugin-transform-dotall-regex" "^7.14.5"
789
+ "@babel/plugin-transform-duplicate-keys" "^7.14.5"
790
+ "@babel/plugin-transform-exponentiation-operator" "^7.14.5"
791
+ "@babel/plugin-transform-for-of" "^7.15.4"
792
+ "@babel/plugin-transform-function-name" "^7.14.5"
793
+ "@babel/plugin-transform-literals" "^7.14.5"
794
+ "@babel/plugin-transform-member-expression-literals" "^7.14.5"
795
+ "@babel/plugin-transform-modules-amd" "^7.14.5"
796
+ "@babel/plugin-transform-modules-commonjs" "^7.15.4"
797
+ "@babel/plugin-transform-modules-systemjs" "^7.15.4"
798
+ "@babel/plugin-transform-modules-umd" "^7.14.5"
799
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9"
800
+ "@babel/plugin-transform-new-target" "^7.14.5"
801
+ "@babel/plugin-transform-object-super" "^7.14.5"
802
+ "@babel/plugin-transform-parameters" "^7.15.4"
803
+ "@babel/plugin-transform-property-literals" "^7.14.5"
804
+ "@babel/plugin-transform-regenerator" "^7.14.5"
805
+ "@babel/plugin-transform-reserved-words" "^7.14.5"
806
+ "@babel/plugin-transform-shorthand-properties" "^7.14.5"
807
+ "@babel/plugin-transform-spread" "^7.14.6"
808
+ "@babel/plugin-transform-sticky-regex" "^7.14.5"
809
+ "@babel/plugin-transform-template-literals" "^7.14.5"
810
+ "@babel/plugin-transform-typeof-symbol" "^7.14.5"
811
+ "@babel/plugin-transform-unicode-escapes" "^7.14.5"
812
+ "@babel/plugin-transform-unicode-regex" "^7.14.5"
813
+ "@babel/preset-modules" "^0.1.4"
814
+ "@babel/types" "^7.15.6"
815
+ babel-plugin-polyfill-corejs2 "^0.2.2"
816
+ babel-plugin-polyfill-corejs3 "^0.2.2"
817
+ babel-plugin-polyfill-regenerator "^0.2.2"
818
+ core-js-compat "^3.16.0"
819
+ semver "^6.3.0"
820
+
821
+ "@babel/preset-modules@^0.1.4":
822
+ version "0.1.4"
823
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e"
824
+ integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==
825
+ dependencies:
826
+ "@babel/helper-plugin-utils" "^7.0.0"
827
+ "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
828
+ "@babel/plugin-transform-dotall-regex" "^7.4.4"
829
+ "@babel/types" "^7.4.4"
830
+ esutils "^2.0.2"
831
+
832
+ "@babel/runtime@^7.8.4":
833
+ version "7.15.4"
834
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a"
835
+ integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==
836
+ dependencies:
837
+ regenerator-runtime "^0.13.4"
838
+
839
+ "@babel/template@^7.15.4":
840
+ version "7.15.4"
841
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194"
842
+ integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==
843
+ dependencies:
844
+ "@babel/code-frame" "^7.14.5"
845
+ "@babel/parser" "^7.15.4"
846
+ "@babel/types" "^7.15.4"
847
+
848
+ "@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4":
849
+ version "7.15.4"
850
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d"
851
+ integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==
852
+ dependencies:
853
+ "@babel/code-frame" "^7.14.5"
854
+ "@babel/generator" "^7.15.4"
855
+ "@babel/helper-function-name" "^7.15.4"
856
+ "@babel/helper-hoist-variables" "^7.15.4"
857
+ "@babel/helper-split-export-declaration" "^7.15.4"
858
+ "@babel/parser" "^7.15.4"
859
+ "@babel/types" "^7.15.4"
860
+ debug "^4.1.0"
861
+ globals "^11.1.0"
862
+
863
+ "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.4.4":
864
+ version "7.15.6"
865
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f"
866
+ integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==
867
+ dependencies:
868
+ "@babel/helper-validator-identifier" "^7.14.9"
869
+ to-fast-properties "^2.0.0"
870
+
871
+ "@discoveryjs/json-ext@^0.5.0":
872
+ version "0.5.5"
873
+ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz#9283c9ce5b289a3c4f61c12757469e59377f81f3"
874
+ integrity sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==
875
+
876
+ "@types/eslint-scope@^3.7.0":
877
+ version "3.7.1"
878
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e"
879
+ integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==
880
+ dependencies:
881
+ "@types/eslint" "*"
882
+ "@types/estree" "*"
883
+
884
+ "@types/eslint@*":
885
+ version "7.28.0"
886
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.28.0.tgz#7e41f2481d301c68e14f483fe10b017753ce8d5a"
887
+ integrity sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==
888
+ dependencies:
889
+ "@types/estree" "*"
890
+ "@types/json-schema" "*"
891
+
892
+ "@types/estree@*", "@types/estree@^0.0.50":
893
+ version "0.0.50"
894
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
895
+ integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==
896
+
897
+ "@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8":
898
+ version "7.0.9"
899
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
900
+ integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
901
+
902
+ "@types/node@*":
903
+ version "16.10.1"
904
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.1.tgz#f3647623199ca920960006b3dccf633ea905f243"
905
+ integrity sha512-4/Z9DMPKFexZj/Gn3LylFgamNKHm4K3QDi0gz9B26Uk0c8izYf97B5fxfpspMNkWlFupblKM/nV8+NA9Ffvr+w==
906
+
907
+ "@webassemblyjs/ast@1.11.1":
908
+ version "1.11.1"
909
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
910
+ integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==
911
+ dependencies:
912
+ "@webassemblyjs/helper-numbers" "1.11.1"
913
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
914
+
915
+ "@webassemblyjs/floating-point-hex-parser@1.11.1":
916
+ version "1.11.1"
917
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f"
918
+ integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==
919
+
920
+ "@webassemblyjs/helper-api-error@1.11.1":
921
+ version "1.11.1"
922
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16"
923
+ integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==
924
+
925
+ "@webassemblyjs/helper-buffer@1.11.1":
926
+ version "1.11.1"
927
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5"
928
+ integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==
929
+
930
+ "@webassemblyjs/helper-numbers@1.11.1":
931
+ version "1.11.1"
932
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae"
933
+ integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==
934
+ dependencies:
935
+ "@webassemblyjs/floating-point-hex-parser" "1.11.1"
936
+ "@webassemblyjs/helper-api-error" "1.11.1"
937
+ "@xtuc/long" "4.2.2"
938
+
939
+ "@webassemblyjs/helper-wasm-bytecode@1.11.1":
940
+ version "1.11.1"
941
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1"
942
+ integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==
943
+
944
+ "@webassemblyjs/helper-wasm-section@1.11.1":
945
+ version "1.11.1"
946
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a"
947
+ integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==
948
+ dependencies:
949
+ "@webassemblyjs/ast" "1.11.1"
950
+ "@webassemblyjs/helper-buffer" "1.11.1"
951
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
952
+ "@webassemblyjs/wasm-gen" "1.11.1"
953
+
954
+ "@webassemblyjs/ieee754@1.11.1":
955
+ version "1.11.1"
956
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614"
957
+ integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==
958
+ dependencies:
959
+ "@xtuc/ieee754" "^1.2.0"
960
+
961
+ "@webassemblyjs/leb128@1.11.1":
962
+ version "1.11.1"
963
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5"
964
+ integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==
965
+ dependencies:
966
+ "@xtuc/long" "4.2.2"
967
+
968
+ "@webassemblyjs/utf8@1.11.1":
969
+ version "1.11.1"
970
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff"
971
+ integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==
972
+
973
+ "@webassemblyjs/wasm-edit@1.11.1":
974
+ version "1.11.1"
975
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6"
976
+ integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==
977
+ dependencies:
978
+ "@webassemblyjs/ast" "1.11.1"
979
+ "@webassemblyjs/helper-buffer" "1.11.1"
980
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
981
+ "@webassemblyjs/helper-wasm-section" "1.11.1"
982
+ "@webassemblyjs/wasm-gen" "1.11.1"
983
+ "@webassemblyjs/wasm-opt" "1.11.1"
984
+ "@webassemblyjs/wasm-parser" "1.11.1"
985
+ "@webassemblyjs/wast-printer" "1.11.1"
986
+
987
+ "@webassemblyjs/wasm-gen@1.11.1":
988
+ version "1.11.1"
989
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76"
990
+ integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==
991
+ dependencies:
992
+ "@webassemblyjs/ast" "1.11.1"
993
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
994
+ "@webassemblyjs/ieee754" "1.11.1"
995
+ "@webassemblyjs/leb128" "1.11.1"
996
+ "@webassemblyjs/utf8" "1.11.1"
997
+
998
+ "@webassemblyjs/wasm-opt@1.11.1":
999
+ version "1.11.1"
1000
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2"
1001
+ integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==
1002
+ dependencies:
1003
+ "@webassemblyjs/ast" "1.11.1"
1004
+ "@webassemblyjs/helper-buffer" "1.11.1"
1005
+ "@webassemblyjs/wasm-gen" "1.11.1"
1006
+ "@webassemblyjs/wasm-parser" "1.11.1"
1007
+
1008
+ "@webassemblyjs/wasm-parser@1.11.1":
1009
+ version "1.11.1"
1010
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199"
1011
+ integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==
1012
+ dependencies:
1013
+ "@webassemblyjs/ast" "1.11.1"
1014
+ "@webassemblyjs/helper-api-error" "1.11.1"
1015
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
1016
+ "@webassemblyjs/ieee754" "1.11.1"
1017
+ "@webassemblyjs/leb128" "1.11.1"
1018
+ "@webassemblyjs/utf8" "1.11.1"
1019
+
1020
+ "@webassemblyjs/wast-printer@1.11.1":
1021
+ version "1.11.1"
1022
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0"
1023
+ integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==
1024
+ dependencies:
1025
+ "@webassemblyjs/ast" "1.11.1"
1026
+ "@xtuc/long" "4.2.2"
1027
+
1028
+ "@webpack-cli/configtest@^1.0.4":
1029
+ version "1.0.4"
1030
+ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.4.tgz#f03ce6311c0883a83d04569e2c03c6238316d2aa"
1031
+ integrity sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==
1032
+
1033
+ "@webpack-cli/info@^1.3.0":
1034
+ version "1.3.0"
1035
+ resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.3.0.tgz#9d78a31101a960997a4acd41ffd9b9300627fe2b"
1036
+ integrity sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==
1037
+ dependencies:
1038
+ envinfo "^7.7.3"
1039
+
1040
+ "@webpack-cli/serve@^1.5.2":
1041
+ version "1.5.2"
1042
+ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.5.2.tgz#ea584b637ff63c5a477f6f21604b5a205b72c9ec"
1043
+ integrity sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw==
1044
+
1045
+ "@xtuc/ieee754@^1.2.0":
1046
+ version "1.2.0"
1047
+ resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
1048
+ integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
1049
+
1050
+ "@xtuc/long@4.2.2":
1051
+ version "4.2.2"
1052
+ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
1053
+ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
1054
+
1055
+ acorn-import-assertions@^1.7.6:
1056
+ version "1.7.6"
1057
+ resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz#580e3ffcae6770eebeec76c3b9723201e9d01f78"
1058
+ integrity sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==
1059
+
1060
+ acorn@^8.4.1:
1061
+ version "8.5.0"
1062
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
1063
+ integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==
1064
+
1065
+ ajv-keywords@^3.5.2:
1066
+ version "3.5.2"
1067
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
1068
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
1069
+
1070
+ ajv@^6.12.4, ajv@^6.12.5:
1071
+ version "6.12.6"
1072
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
1073
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
1074
+ dependencies:
1075
+ fast-deep-equal "^3.1.1"
1076
+ fast-json-stable-stringify "^2.0.0"
1077
+ json-schema-traverse "^0.4.1"
1078
+ uri-js "^4.2.2"
1079
+
1080
+ ansi-styles@^3.2.1:
1081
+ version "3.2.1"
1082
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
1083
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
1084
+ dependencies:
1085
+ color-convert "^1.9.0"
1086
+
1087
+ anymatch@~3.1.2:
1088
+ version "3.1.2"
1089
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
1090
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
1091
+ dependencies:
1092
+ normalize-path "^3.0.0"
1093
+ picomatch "^2.0.4"
1094
+
1095
+ babel-loader@^8.1.0:
1096
+ version "8.2.2"
1097
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81"
1098
+ integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==
1099
+ dependencies:
1100
+ find-cache-dir "^3.3.1"
1101
+ loader-utils "^1.4.0"
1102
+ make-dir "^3.1.0"
1103
+ schema-utils "^2.6.5"
1104
+
1105
+ babel-plugin-dynamic-import-node@^2.3.3:
1106
+ version "2.3.3"
1107
+ resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
1108
+ integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
1109
+ dependencies:
1110
+ object.assign "^4.1.0"
1111
+
1112
+ babel-plugin-polyfill-corejs2@^0.2.2:
1113
+ version "0.2.2"
1114
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327"
1115
+ integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==
1116
+ dependencies:
1117
+ "@babel/compat-data" "^7.13.11"
1118
+ "@babel/helper-define-polyfill-provider" "^0.2.2"
1119
+ semver "^6.1.1"
1120
+
1121
+ babel-plugin-polyfill-corejs3@^0.2.2:
1122
+ version "0.2.5"
1123
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz#2779846a16a1652244ae268b1e906ada107faf92"
1124
+ integrity sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==
1125
+ dependencies:
1126
+ "@babel/helper-define-polyfill-provider" "^0.2.2"
1127
+ core-js-compat "^3.16.2"
1128
+
1129
+ babel-plugin-polyfill-regenerator@^0.2.2:
1130
+ version "0.2.2"
1131
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077"
1132
+ integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==
1133
+ dependencies:
1134
+ "@babel/helper-define-polyfill-provider" "^0.2.2"
1135
+
1136
+ babel-plugin-syntax-object-rest-spread@^6.8.0:
1137
+ version "6.13.0"
1138
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
1139
+ integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=
1140
+
1141
+ babel-plugin-transform-object-rest-spread@^6.26.0:
1142
+ version "6.26.0"
1143
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
1144
+ integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=
1145
+ dependencies:
1146
+ babel-plugin-syntax-object-rest-spread "^6.8.0"
1147
+ babel-runtime "^6.26.0"
1148
+
1149
+ babel-runtime@^6.26.0:
1150
+ version "6.26.0"
1151
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
1152
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
1153
+ dependencies:
1154
+ core-js "^2.4.0"
1155
+ regenerator-runtime "^0.11.0"
1156
+
1157
+ big.js@^5.2.2:
1158
+ version "5.2.2"
1159
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
1160
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
1161
+
1162
+ binary-extensions@^2.0.0:
1163
+ version "2.2.0"
1164
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
1165
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
1166
+
1167
+ braces@~3.0.2:
1168
+ version "3.0.2"
1169
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
1170
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
1171
+ dependencies:
1172
+ fill-range "^7.0.1"
1173
+
1174
+ browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.17.1:
1175
+ version "4.17.1"
1176
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.1.tgz#a98d104f54af441290b7d592626dd541fa642eb9"
1177
+ integrity sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==
1178
+ dependencies:
1179
+ caniuse-lite "^1.0.30001259"
1180
+ electron-to-chromium "^1.3.846"
1181
+ escalade "^3.1.1"
1182
+ nanocolors "^0.1.5"
1183
+ node-releases "^1.1.76"
1184
+
1185
+ buffer-from@^1.0.0:
1186
+ version "1.1.2"
1187
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
1188
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
1189
+
1190
+ call-bind@^1.0.0:
1191
+ version "1.0.2"
1192
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
1193
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
1194
+ dependencies:
1195
+ function-bind "^1.1.1"
1196
+ get-intrinsic "^1.0.2"
1197
+
1198
+ caniuse-lite@^1.0.30001259:
1199
+ version "1.0.30001261"
1200
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001261.tgz#96d89813c076ea061209a4e040d8dcf0c66a1d01"
1201
+ integrity sha512-vM8D9Uvp7bHIN0fZ2KQ4wnmYFpJo/Etb4Vwsuc+ka0tfGDHvOPrFm6S/7CCNLSOkAUjenT2HnUPESdOIL91FaA==
1202
+
1203
+ chalk@^2.0.0:
1204
+ version "2.4.2"
1205
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
1206
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
1207
+ dependencies:
1208
+ ansi-styles "^3.2.1"
1209
+ escape-string-regexp "^1.0.5"
1210
+ supports-color "^5.3.0"
1211
+
1212
+ "chokidar@>=3.0.0 <4.0.0":
1213
+ version "3.5.2"
1214
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
1215
+ integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
1216
+ dependencies:
1217
+ anymatch "~3.1.2"
1218
+ braces "~3.0.2"
1219
+ glob-parent "~5.1.2"
1220
+ is-binary-path "~2.1.0"
1221
+ is-glob "~4.0.1"
1222
+ normalize-path "~3.0.0"
1223
+ readdirp "~3.6.0"
1224
+ optionalDependencies:
1225
+ fsevents "~2.3.2"
1226
+
1227
+ chrome-trace-event@^1.0.2:
1228
+ version "1.0.3"
1229
+ resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
1230
+ integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
1231
+
1232
+ clone-deep@^4.0.1:
1233
+ version "4.0.1"
1234
+ resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
1235
+ integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
1236
+ dependencies:
1237
+ is-plain-object "^2.0.4"
1238
+ kind-of "^6.0.2"
1239
+ shallow-clone "^3.0.0"
1240
+
1241
+ color-convert@^1.9.0:
1242
+ version "1.9.3"
1243
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
1244
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
1245
+ dependencies:
1246
+ color-name "1.1.3"
1247
+
1248
+ color-name@1.1.3:
1249
+ version "1.1.3"
1250
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
1251
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
1252
+
1253
+ colorette@^1.2.1:
1254
+ version "1.4.0"
1255
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40"
1256
+ integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==
1257
+
1258
+ commander@^2.20.0:
1259
+ version "2.20.3"
1260
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
1261
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
1262
+
1263
+ commander@^7.0.0:
1264
+ version "7.2.0"
1265
+ resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
1266
+ integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
1267
+
1268
+ commondir@^1.0.1:
1269
+ version "1.0.1"
1270
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
1271
+ integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
1272
+
1273
+ convert-source-map@^1.7.0:
1274
+ version "1.8.0"
1275
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
1276
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
1277
+ dependencies:
1278
+ safe-buffer "~5.1.1"
1279
+
1280
+ core-js-compat@^3.16.0, core-js-compat@^3.16.2:
1281
+ version "3.18.1"
1282
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.18.1.tgz#01942a0877caf9c6e5007c027183cf0bdae6a191"
1283
+ integrity sha512-XJMYx58zo4W0kLPmIingVZA10+7TuKrMLPt83+EzDmxFJQUMcTVVmQ+n5JP4r6Z14qSzhQBRi3NSWoeVyKKXUg==
1284
+ dependencies:
1285
+ browserslist "^4.17.1"
1286
+ semver "7.0.0"
1287
+
1288
+ core-js@^2.4.0:
1289
+ version "2.6.12"
1290
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
1291
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
1292
+
1293
+ cross-env@^7.0.3:
1294
+ version "7.0.3"
1295
+ resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
1296
+ integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
1297
+ dependencies:
1298
+ cross-spawn "^7.0.1"
1299
+
1300
+ cross-spawn@^7.0.1, cross-spawn@^7.0.3:
1301
+ version "7.0.3"
1302
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
1303
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
1304
+ dependencies:
1305
+ path-key "^3.1.0"
1306
+ shebang-command "^2.0.0"
1307
+ which "^2.0.1"
1308
+
1309
+ debug@^4.1.0, debug@^4.1.1:
1310
+ version "4.3.2"
1311
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
1312
+ integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
1313
+ dependencies:
1314
+ ms "2.1.2"
1315
+
1316
+ define-properties@^1.1.3:
1317
+ version "1.1.3"
1318
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
1319
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
1320
+ dependencies:
1321
+ object-keys "^1.0.12"
1322
+
1323
+ electron-to-chromium@^1.3.846:
1324
+ version "1.3.853"
1325
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.853.tgz#f3ed1d31f092cb3a17af188bca6c6a3ec91c3e82"
1326
+ integrity sha512-W4U8n+U8I5/SUaFcqZgbKRmYZwcyEIQVBDf+j5QQK6xChjXnQD+wj248eGR9X4u+dDmDR//8vIfbu4PrdBBIoQ==
1327
+
1328
+ emojis-list@^3.0.0:
1329
+ version "3.0.0"
1330
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
1331
+ integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
1332
+
1333
+ enhanced-resolve@^5.8.3:
1334
+ version "5.8.3"
1335
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0"
1336
+ integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==
1337
+ dependencies:
1338
+ graceful-fs "^4.2.4"
1339
+ tapable "^2.2.0"
1340
+
1341
+ envinfo@^7.7.3:
1342
+ version "7.8.1"
1343
+ resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
1344
+ integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
1345
+
1346
+ es-module-lexer@^0.9.0:
1347
+ version "0.9.1"
1348
+ resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.1.tgz#f203bf394a630a552d381acf01a17ef08843b140"
1349
+ integrity sha512-17Ed9misDnpyNBJh63g1OhW3qUFecDgGOivI85JeZY/LGhDum8e+cltukbkSK8pcJnXXEkya56sp4vSS1nzoUw==
1350
+
1351
+ escalade@^3.1.1:
1352
+ version "3.1.1"
1353
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
1354
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
1355
+
1356
+ escape-string-regexp@^1.0.5:
1357
+ version "1.0.5"
1358
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
1359
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
1360
+
1361
+ eslint-scope@5.1.1:
1362
+ version "5.1.1"
1363
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
1364
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
1365
+ dependencies:
1366
+ esrecurse "^4.3.0"
1367
+ estraverse "^4.1.1"
1368
+
1369
+ esrecurse@^4.3.0:
1370
+ version "4.3.0"
1371
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
1372
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
1373
+ dependencies:
1374
+ estraverse "^5.2.0"
1375
+
1376
+ estraverse@^4.1.1:
1377
+ version "4.3.0"
1378
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
1379
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
1380
+
1381
+ estraverse@^5.2.0:
1382
+ version "5.2.0"
1383
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880"
1384
+ integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==
1385
+
1386
+ esutils@^2.0.2:
1387
+ version "2.0.3"
1388
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
1389
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
1390
+
1391
+ events@^3.2.0:
1392
+ version "3.3.0"
1393
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
1394
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
1395
+
1396
+ execa@^5.0.0:
1397
+ version "5.1.1"
1398
+ resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
1399
+ integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
1400
+ dependencies:
1401
+ cross-spawn "^7.0.3"
1402
+ get-stream "^6.0.0"
1403
+ human-signals "^2.1.0"
1404
+ is-stream "^2.0.0"
1405
+ merge-stream "^2.0.0"
1406
+ npm-run-path "^4.0.1"
1407
+ onetime "^5.1.2"
1408
+ signal-exit "^3.0.3"
1409
+ strip-final-newline "^2.0.0"
1410
+
1411
+ fast-deep-equal@^3.1.1:
1412
+ version "3.1.3"
1413
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
1414
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
1415
+
1416
+ fast-json-stable-stringify@^2.0.0:
1417
+ version "2.1.0"
1418
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
1419
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
1420
+
1421
+ fastest-levenshtein@^1.0.12:
1422
+ version "1.0.12"
1423
+ resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2"
1424
+ integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
1425
+
1426
+ file-loader@^6.2.0:
1427
+ version "6.2.0"
1428
+ resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d"
1429
+ integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==
1430
+ dependencies:
1431
+ loader-utils "^2.0.0"
1432
+ schema-utils "^3.0.0"
1433
+
1434
+ fill-range@^7.0.1:
1435
+ version "7.0.1"
1436
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
1437
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
1438
+ dependencies:
1439
+ to-regex-range "^5.0.1"
1440
+
1441
+ find-cache-dir@^3.3.1:
1442
+ version "3.3.2"
1443
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b"
1444
+ integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
1445
+ dependencies:
1446
+ commondir "^1.0.1"
1447
+ make-dir "^3.0.2"
1448
+ pkg-dir "^4.1.0"
1449
+
1450
+ find-up@^4.0.0:
1451
+ version "4.1.0"
1452
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
1453
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
1454
+ dependencies:
1455
+ locate-path "^5.0.0"
1456
+ path-exists "^4.0.0"
1457
+
1458
+ fsevents@~2.3.2:
1459
+ version "2.3.2"
1460
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
1461
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
1462
+
1463
+ function-bind@^1.1.1:
1464
+ version "1.1.1"
1465
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
1466
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
1467
+
1468
+ gensync@^1.0.0-beta.2:
1469
+ version "1.0.0-beta.2"
1470
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
1471
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
1472
+
1473
+ get-intrinsic@^1.0.2:
1474
+ version "1.1.1"
1475
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
1476
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
1477
+ dependencies:
1478
+ function-bind "^1.1.1"
1479
+ has "^1.0.3"
1480
+ has-symbols "^1.0.1"
1481
+
1482
+ get-stream@^6.0.0:
1483
+ version "6.0.1"
1484
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
1485
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
1486
+
1487
+ glob-parent@~5.1.2:
1488
+ version "5.1.2"
1489
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
1490
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
1491
+ dependencies:
1492
+ is-glob "^4.0.1"
1493
+
1494
+ glob-to-regexp@^0.4.1:
1495
+ version "0.4.1"
1496
+ resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
1497
+ integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
1498
+
1499
+ globals@^11.1.0:
1500
+ version "11.12.0"
1501
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
1502
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
1503
+
1504
+ graceful-fs@^4.1.2, graceful-fs@^4.2.4:
1505
+ version "4.2.8"
1506
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
1507
+ integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
1508
+
1509
+ has-flag@^3.0.0:
1510
+ version "3.0.0"
1511
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
1512
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
1513
+
1514
+ has-flag@^4.0.0:
1515
+ version "4.0.0"
1516
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
1517
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
1518
+
1519
+ has-symbols@^1.0.1:
1520
+ version "1.0.2"
1521
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
1522
+ integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
1523
+
1524
+ has@^1.0.3:
1525
+ version "1.0.3"
1526
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
1527
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
1528
+ dependencies:
1529
+ function-bind "^1.1.1"
1530
+
1531
+ human-signals@^2.1.0:
1532
+ version "2.1.0"
1533
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
1534
+ integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
1535
+
1536
+ import-local@^3.0.2:
1537
+ version "3.0.2"
1538
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6"
1539
+ integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==
1540
+ dependencies:
1541
+ pkg-dir "^4.2.0"
1542
+ resolve-cwd "^3.0.0"
1543
+
1544
+ interpret@^2.2.0:
1545
+ version "2.2.0"
1546
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
1547
+ integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
1548
+
1549
+ is-binary-path@~2.1.0:
1550
+ version "2.1.0"
1551
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
1552
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
1553
+ dependencies:
1554
+ binary-extensions "^2.0.0"
1555
+
1556
+ is-core-module@^2.2.0:
1557
+ version "2.7.0"
1558
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.7.0.tgz#3c0ef7d31b4acfc574f80c58409d568a836848e3"
1559
+ integrity sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==
1560
+ dependencies:
1561
+ has "^1.0.3"
1562
+
1563
+ is-extglob@^2.1.1:
1564
+ version "2.1.1"
1565
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
1566
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
1567
+
1568
+ is-glob@^4.0.1, is-glob@~4.0.1:
1569
+ version "4.0.2"
1570
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.2.tgz#859fc2e731e58c902f99fcabccb75a7dd07d29d8"
1571
+ integrity sha512-ZZTOjRcDjuAAAv2cTBQP/lL59ZTArx77+7UzHdWW/XB1mrfp7DEaVpKmZ0XIzx+M7AxfhKcqV+nMetUQmFifwg==
1572
+ dependencies:
1573
+ is-extglob "^2.1.1"
1574
+
1575
+ is-number@^7.0.0:
1576
+ version "7.0.0"
1577
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
1578
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
1579
+
1580
+ is-plain-object@^2.0.4:
1581
+ version "2.0.4"
1582
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
1583
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
1584
+ dependencies:
1585
+ isobject "^3.0.1"
1586
+
1587
+ is-stream@^2.0.0:
1588
+ version "2.0.1"
1589
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
1590
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
1591
+
1592
+ isexe@^2.0.0:
1593
+ version "2.0.0"
1594
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
1595
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
1596
+
1597
+ isobject@^3.0.1:
1598
+ version "3.0.1"
1599
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
1600
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
1601
+
1602
+ jest-worker@^27.0.6:
1603
+ version "27.2.3"
1604
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.2.3.tgz#396e83d04ca575230a9bcb255c2b66aec07cb931"
1605
+ integrity sha512-ZwOvv4GCIPviL+Ie4pVguz4N5w/6IGbTaHBYOl3ZcsZZktaL7d8JOU0rmovoED7AJZKA8fvmLbBg8yg80u/tGA==
1606
+ dependencies:
1607
+ "@types/node" "*"
1608
+ merge-stream "^2.0.0"
1609
+ supports-color "^8.0.0"
1610
+
1611
+ js-tokens@^4.0.0:
1612
+ version "4.0.0"
1613
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
1614
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
1615
+
1616
+ jsesc@^2.5.1:
1617
+ version "2.5.2"
1618
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
1619
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
1620
+
1621
+ jsesc@~0.5.0:
1622
+ version "0.5.0"
1623
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
1624
+ integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
1625
+
1626
+ json-parse-better-errors@^1.0.2:
1627
+ version "1.0.2"
1628
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
1629
+ integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
1630
+
1631
+ json-schema-traverse@^0.4.1:
1632
+ version "0.4.1"
1633
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
1634
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
1635
+
1636
+ json5@^1.0.1:
1637
+ version "1.0.1"
1638
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
1639
+ integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
1640
+ dependencies:
1641
+ minimist "^1.2.0"
1642
+
1643
+ json5@^2.1.2:
1644
+ version "2.2.0"
1645
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
1646
+ integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
1647
+ dependencies:
1648
+ minimist "^1.2.5"
1649
+
1650
+ kind-of@^6.0.2:
1651
+ version "6.0.3"
1652
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
1653
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
1654
+
1655
+ klona@^2.0.4:
1656
+ version "2.0.4"
1657
+ resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0"
1658
+ integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==
1659
+
1660
+ loader-runner@^4.2.0:
1661
+ version "4.2.0"
1662
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384"
1663
+ integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==
1664
+
1665
+ loader-utils@^1.4.0:
1666
+ version "1.4.0"
1667
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
1668
+ integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
1669
+ dependencies:
1670
+ big.js "^5.2.2"
1671
+ emojis-list "^3.0.0"
1672
+ json5 "^1.0.1"
1673
+
1674
+ loader-utils@^2.0.0:
1675
+ version "2.0.0"
1676
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
1677
+ integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==
1678
+ dependencies:
1679
+ big.js "^5.2.2"
1680
+ emojis-list "^3.0.0"
1681
+ json5 "^2.1.2"
1682
+
1683
+ locate-path@^5.0.0:
1684
+ version "5.0.0"
1685
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
1686
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
1687
+ dependencies:
1688
+ p-locate "^4.1.0"
1689
+
1690
+ lodash.debounce@^4.0.8:
1691
+ version "4.0.8"
1692
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
1693
+ integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
1694
+
1695
+ make-dir@^3.0.2, make-dir@^3.1.0:
1696
+ version "3.1.0"
1697
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
1698
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
1699
+ dependencies:
1700
+ semver "^6.0.0"
1701
+
1702
+ merge-stream@^2.0.0:
1703
+ version "2.0.0"
1704
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
1705
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
1706
+
1707
+ mime-db@1.49.0:
1708
+ version "1.49.0"
1709
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed"
1710
+ integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==
1711
+
1712
+ mime-types@^2.1.27:
1713
+ version "2.1.32"
1714
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5"
1715
+ integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==
1716
+ dependencies:
1717
+ mime-db "1.49.0"
1718
+
1719
+ mimic-fn@^2.1.0:
1720
+ version "2.1.0"
1721
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
1722
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
1723
+
1724
+ minimist@^1.2.0, minimist@^1.2.5:
1725
+ version "1.2.5"
1726
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
1727
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
1728
+
1729
+ ms@2.1.2:
1730
+ version "2.1.2"
1731
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
1732
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
1733
+
1734
+ nanocolors@^0.1.5:
1735
+ version "0.1.12"
1736
+ resolved "https://registry.yarnpkg.com/nanocolors/-/nanocolors-0.1.12.tgz#8577482c58cbd7b5bb1681db4cf48f11a87fd5f6"
1737
+ integrity sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==
1738
+
1739
+ neo-async@^2.6.2:
1740
+ version "2.6.2"
1741
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
1742
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
1743
+
1744
+ node-releases@^1.1.76:
1745
+ version "1.1.76"
1746
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.76.tgz#df245b062b0cafbd5282ab6792f7dccc2d97f36e"
1747
+ integrity sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==
1748
+
1749
+ normalize-path@^3.0.0, normalize-path@~3.0.0:
1750
+ version "3.0.0"
1751
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
1752
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
1753
+
1754
+ npm-run-path@^4.0.1:
1755
+ version "4.0.1"
1756
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
1757
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
1758
+ dependencies:
1759
+ path-key "^3.0.0"
1760
+
1761
+ object-keys@^1.0.12, object-keys@^1.1.1:
1762
+ version "1.1.1"
1763
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
1764
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
1765
+
1766
+ object.assign@^4.1.0:
1767
+ version "4.1.2"
1768
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
1769
+ integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
1770
+ dependencies:
1771
+ call-bind "^1.0.0"
1772
+ define-properties "^1.1.3"
1773
+ has-symbols "^1.0.1"
1774
+ object-keys "^1.1.1"
1775
+
1776
+ onetime@^5.1.2:
1777
+ version "5.1.2"
1778
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
1779
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
1780
+ dependencies:
1781
+ mimic-fn "^2.1.0"
1782
+
1783
+ p-limit@^2.2.0:
1784
+ version "2.3.0"
1785
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
1786
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
1787
+ dependencies:
1788
+ p-try "^2.0.0"
1789
+
1790
+ p-limit@^3.1.0:
1791
+ version "3.1.0"
1792
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
1793
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
1794
+ dependencies:
1795
+ yocto-queue "^0.1.0"
1796
+
1797
+ p-locate@^4.1.0:
1798
+ version "4.1.0"
1799
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
1800
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
1801
+ dependencies:
1802
+ p-limit "^2.2.0"
1803
+
1804
+ p-try@^2.0.0:
1805
+ version "2.2.0"
1806
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
1807
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
1808
+
1809
+ path-exists@^4.0.0:
1810
+ version "4.0.0"
1811
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
1812
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
1813
+
1814
+ path-key@^3.0.0, path-key@^3.1.0:
1815
+ version "3.1.1"
1816
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
1817
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
1818
+
1819
+ path-parse@^1.0.6:
1820
+ version "1.0.7"
1821
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
1822
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
1823
+
1824
+ picomatch@^2.0.4, picomatch@^2.2.1:
1825
+ version "2.3.0"
1826
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
1827
+ integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
1828
+
1829
+ pkg-dir@^4.1.0, pkg-dir@^4.2.0:
1830
+ version "4.2.0"
1831
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
1832
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
1833
+ dependencies:
1834
+ find-up "^4.0.0"
1835
+
1836
+ punycode@^2.1.0:
1837
+ version "2.1.1"
1838
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
1839
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
1840
+
1841
+ randombytes@^2.1.0:
1842
+ version "2.1.0"
1843
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
1844
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
1845
+ dependencies:
1846
+ safe-buffer "^5.1.0"
1847
+
1848
+ readdirp@~3.6.0:
1849
+ version "3.6.0"
1850
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
1851
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
1852
+ dependencies:
1853
+ picomatch "^2.2.1"
1854
+
1855
+ rechoir@^0.7.0:
1856
+ version "0.7.1"
1857
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686"
1858
+ integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==
1859
+ dependencies:
1860
+ resolve "^1.9.0"
1861
+
1862
+ regenerate-unicode-properties@^9.0.0:
1863
+ version "9.0.0"
1864
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326"
1865
+ integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==
1866
+ dependencies:
1867
+ regenerate "^1.4.2"
1868
+
1869
+ regenerate@^1.4.2:
1870
+ version "1.4.2"
1871
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
1872
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
1873
+
1874
+ regenerator-runtime@^0.11.0:
1875
+ version "0.11.1"
1876
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
1877
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
1878
+
1879
+ regenerator-runtime@^0.13.4:
1880
+ version "0.13.9"
1881
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
1882
+ integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
1883
+
1884
+ regenerator-transform@^0.14.2:
1885
+ version "0.14.5"
1886
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4"
1887
+ integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==
1888
+ dependencies:
1889
+ "@babel/runtime" "^7.8.4"
1890
+
1891
+ regexpu-core@^4.7.1:
1892
+ version "4.8.0"
1893
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0"
1894
+ integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==
1895
+ dependencies:
1896
+ regenerate "^1.4.2"
1897
+ regenerate-unicode-properties "^9.0.0"
1898
+ regjsgen "^0.5.2"
1899
+ regjsparser "^0.7.0"
1900
+ unicode-match-property-ecmascript "^2.0.0"
1901
+ unicode-match-property-value-ecmascript "^2.0.0"
1902
+
1903
+ regjsgen@^0.5.2:
1904
+ version "0.5.2"
1905
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733"
1906
+ integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==
1907
+
1908
+ regjsparser@^0.7.0:
1909
+ version "0.7.0"
1910
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968"
1911
+ integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==
1912
+ dependencies:
1913
+ jsesc "~0.5.0"
1914
+
1915
+ resolve-cwd@^3.0.0:
1916
+ version "3.0.0"
1917
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
1918
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
1919
+ dependencies:
1920
+ resolve-from "^5.0.0"
1921
+
1922
+ resolve-from@^5.0.0:
1923
+ version "5.0.0"
1924
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
1925
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
1926
+
1927
+ resolve@^1.14.2, resolve@^1.9.0:
1928
+ version "1.20.0"
1929
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
1930
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
1931
+ dependencies:
1932
+ is-core-module "^2.2.0"
1933
+ path-parse "^1.0.6"
1934
+
1935
+ safe-buffer@^5.1.0:
1936
+ version "5.2.1"
1937
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
1938
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
1939
+
1940
+ safe-buffer@~5.1.1:
1941
+ version "5.1.2"
1942
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
1943
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
1944
+
1945
+ sass-loader@^12.1.0:
1946
+ version "12.1.0"
1947
+ resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.1.0.tgz#b73324622231009da6fba61ab76013256380d201"
1948
+ integrity sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==
1949
+ dependencies:
1950
+ klona "^2.0.4"
1951
+ neo-async "^2.6.2"
1952
+
1953
+ sass@^1.42.1:
1954
+ version "1.42.1"
1955
+ resolved "https://registry.yarnpkg.com/sass/-/sass-1.42.1.tgz#5ab17bebc1cb1881ad2e0c9a932c66ad64e441e2"
1956
+ integrity sha512-/zvGoN8B7dspKc5mC6HlaygyCBRvnyzzgD5khiaCfglWztY99cYoiTUksVx11NlnemrcfH5CEaCpsUKoW0cQqg==
1957
+ dependencies:
1958
+ chokidar ">=3.0.0 <4.0.0"
1959
+
1960
+ schema-utils@^2.6.5:
1961
+ version "2.7.1"
1962
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
1963
+ integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
1964
+ dependencies:
1965
+ "@types/json-schema" "^7.0.5"
1966
+ ajv "^6.12.4"
1967
+ ajv-keywords "^3.5.2"
1968
+
1969
+ schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1:
1970
+ version "3.1.1"
1971
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281"
1972
+ integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
1973
+ dependencies:
1974
+ "@types/json-schema" "^7.0.8"
1975
+ ajv "^6.12.5"
1976
+ ajv-keywords "^3.5.2"
1977
+
1978
+ semver@7.0.0:
1979
+ version "7.0.0"
1980
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
1981
+ integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
1982
+
1983
+ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
1984
+ version "6.3.0"
1985
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
1986
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
1987
+
1988
+ serialize-javascript@^6.0.0:
1989
+ version "6.0.0"
1990
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
1991
+ integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
1992
+ dependencies:
1993
+ randombytes "^2.1.0"
1994
+
1995
+ shallow-clone@^3.0.0:
1996
+ version "3.0.1"
1997
+ resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
1998
+ integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
1999
+ dependencies:
2000
+ kind-of "^6.0.2"
2001
+
2002
+ shebang-command@^2.0.0:
2003
+ version "2.0.0"
2004
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
2005
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
2006
+ dependencies:
2007
+ shebang-regex "^3.0.0"
2008
+
2009
+ shebang-regex@^3.0.0:
2010
+ version "3.0.0"
2011
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
2012
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
2013
+
2014
+ signal-exit@^3.0.3:
2015
+ version "3.0.4"
2016
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.4.tgz#366a4684d175b9cab2081e3681fda3747b6c51d7"
2017
+ integrity sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q==
2018
+
2019
+ source-map-support@~0.5.20:
2020
+ version "0.5.20"
2021
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9"
2022
+ integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==
2023
+ dependencies:
2024
+ buffer-from "^1.0.0"
2025
+ source-map "^0.6.0"
2026
+
2027
+ source-map@^0.5.0:
2028
+ version "0.5.7"
2029
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
2030
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
2031
+
2032
+ source-map@^0.6.0, source-map@^0.6.1:
2033
+ version "0.6.1"
2034
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
2035
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
2036
+
2037
+ source-map@~0.7.2:
2038
+ version "0.7.3"
2039
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
2040
+ integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
2041
+
2042
+ strip-final-newline@^2.0.0:
2043
+ version "2.0.0"
2044
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
2045
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
2046
+
2047
+ supports-color@^5.3.0:
2048
+ version "5.5.0"
2049
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
2050
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
2051
+ dependencies:
2052
+ has-flag "^3.0.0"
2053
+
2054
+ supports-color@^8.0.0:
2055
+ version "8.1.1"
2056
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
2057
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
2058
+ dependencies:
2059
+ has-flag "^4.0.0"
2060
+
2061
+ tapable@^2.1.1, tapable@^2.2.0:
2062
+ version "2.2.1"
2063
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
2064
+ integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
2065
+
2066
+ terser-webpack-plugin@^5.1.3:
2067
+ version "5.2.4"
2068
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz#ad1be7639b1cbe3ea49fab995cbe7224b31747a1"
2069
+ integrity sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==
2070
+ dependencies:
2071
+ jest-worker "^27.0.6"
2072
+ p-limit "^3.1.0"
2073
+ schema-utils "^3.1.1"
2074
+ serialize-javascript "^6.0.0"
2075
+ source-map "^0.6.1"
2076
+ terser "^5.7.2"
2077
+
2078
+ terser@^5.7.2:
2079
+ version "5.9.0"
2080
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.9.0.tgz#47d6e629a522963240f2b55fcaa3c99083d2c351"
2081
+ integrity sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==
2082
+ dependencies:
2083
+ commander "^2.20.0"
2084
+ source-map "~0.7.2"
2085
+ source-map-support "~0.5.20"
2086
+
2087
+ to-fast-properties@^2.0.0:
2088
+ version "2.0.0"
2089
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
2090
+ integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
2091
+
2092
+ to-regex-range@^5.0.1:
2093
+ version "5.0.1"
2094
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
2095
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
2096
+ dependencies:
2097
+ is-number "^7.0.0"
2098
+
2099
+ unicode-canonical-property-names-ecmascript@^2.0.0:
2100
+ version "2.0.0"
2101
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
2102
+ integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
2103
+
2104
+ unicode-match-property-ecmascript@^2.0.0:
2105
+ version "2.0.0"
2106
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3"
2107
+ integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==
2108
+ dependencies:
2109
+ unicode-canonical-property-names-ecmascript "^2.0.0"
2110
+ unicode-property-aliases-ecmascript "^2.0.0"
2111
+
2112
+ unicode-match-property-value-ecmascript@^2.0.0:
2113
+ version "2.0.0"
2114
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714"
2115
+ integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==
2116
+
2117
+ unicode-property-aliases-ecmascript@^2.0.0:
2118
+ version "2.0.0"
2119
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8"
2120
+ integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==
2121
+
2122
+ uri-js@^4.2.2:
2123
+ version "4.4.1"
2124
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
2125
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
2126
+ dependencies:
2127
+ punycode "^2.1.0"
2128
+
2129
+ v8-compile-cache@^2.2.0:
2130
+ version "2.3.0"
2131
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
2132
+ integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
2133
+
2134
+ watchpack@^2.2.0:
2135
+ version "2.2.0"
2136
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.2.0.tgz#47d78f5415fe550ecd740f99fe2882323a58b1ce"
2137
+ integrity sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==
2138
+ dependencies:
2139
+ glob-to-regexp "^0.4.1"
2140
+ graceful-fs "^4.1.2"
2141
+
2142
+ webpack-cli@^4.8.0:
2143
+ version "4.8.0"
2144
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.8.0.tgz#5fc3c8b9401d3c8a43e2afceacfa8261962338d1"
2145
+ integrity sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw==
2146
+ dependencies:
2147
+ "@discoveryjs/json-ext" "^0.5.0"
2148
+ "@webpack-cli/configtest" "^1.0.4"
2149
+ "@webpack-cli/info" "^1.3.0"
2150
+ "@webpack-cli/serve" "^1.5.2"
2151
+ colorette "^1.2.1"
2152
+ commander "^7.0.0"
2153
+ execa "^5.0.0"
2154
+ fastest-levenshtein "^1.0.12"
2155
+ import-local "^3.0.2"
2156
+ interpret "^2.2.0"
2157
+ rechoir "^0.7.0"
2158
+ v8-compile-cache "^2.2.0"
2159
+ webpack-merge "^5.7.3"
2160
+
2161
+ webpack-merge@^5.7.3:
2162
+ version "5.8.0"
2163
+ resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61"
2164
+ integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==
2165
+ dependencies:
2166
+ clone-deep "^4.0.1"
2167
+ wildcard "^2.0.0"
2168
+
2169
+ webpack-sources@^3.2.0:
2170
+ version "3.2.1"
2171
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.1.tgz#251a7d9720d75ada1469ca07dbb62f3641a05b6d"
2172
+ integrity sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA==
2173
+
2174
+ webpack@^5.55.1:
2175
+ version "5.55.1"
2176
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.55.1.tgz#426ebe54c15fa57f7b242590f65fd182382b5998"
2177
+ integrity sha512-EYp9lwaOOAs+AA/KviNZ7bQiITHm4bXQvyTPewD2+f5YGjv6sfiClm40yeX5FgBMxh5bxcB6LryiFoP09B97Ug==
2178
+ dependencies:
2179
+ "@types/eslint-scope" "^3.7.0"
2180
+ "@types/estree" "^0.0.50"
2181
+ "@webassemblyjs/ast" "1.11.1"
2182
+ "@webassemblyjs/wasm-edit" "1.11.1"
2183
+ "@webassemblyjs/wasm-parser" "1.11.1"
2184
+ acorn "^8.4.1"
2185
+ acorn-import-assertions "^1.7.6"
2186
+ browserslist "^4.14.5"
2187
+ chrome-trace-event "^1.0.2"
2188
+ enhanced-resolve "^5.8.3"
2189
+ es-module-lexer "^0.9.0"
2190
+ eslint-scope "5.1.1"
2191
+ events "^3.2.0"
2192
+ glob-to-regexp "^0.4.1"
2193
+ graceful-fs "^4.2.4"
2194
+ json-parse-better-errors "^1.0.2"
2195
+ loader-runner "^4.2.0"
2196
+ mime-types "^2.1.27"
2197
+ neo-async "^2.6.2"
2198
+ schema-utils "^3.1.0"
2199
+ tapable "^2.1.1"
2200
+ terser-webpack-plugin "^5.1.3"
2201
+ watchpack "^2.2.0"
2202
+ webpack-sources "^3.2.0"
2203
+
2204
+ which@^2.0.1:
2205
+ version "2.0.2"
2206
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
2207
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
2208
+ dependencies:
2209
+ isexe "^2.0.0"
2210
+
2211
+ wildcard@^2.0.0:
2212
+ version "2.0.0"
2213
+ resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
2214
+ integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
2215
+
2216
+ yocto-queue@^0.1.0:
2217
+ version "0.1.0"
2218
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
2219
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
modules/ppcp-wc-gateway/assets/js/gateway-settings.js CHANGED
@@ -1,2 +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)}([function(e,t){document.addEventListener("DOMContentLoaded",()=>{const e=document.querySelectorAll("#ppcp-message_enabled, #ppcp-message_cart_enabled, #ppcp-message_product_enabled"),t=document.querySelectorAll("#ppcp-vault_enabled");function n(e){return Array.prototype.slice.call(e).filter(e=>!e.disabled&&e.checked).length>0}function r(e){e.forEach(e=>e.setAttribute("disabled","true"))}function o(e){e.forEach(e=>e.removeAttribute("disabled"))}function a(){n(e)?r(t):o(t),n(t)?r(e):o(e),"undefined"!=typeof PayPalCommerceGatewaySettings&&"1"===PayPalCommerceGatewaySettings.vaulting_features_available||r(t)}a(),e.forEach(e=>e.addEventListener("change",a)),t.forEach(e=>e.addEventListener("change",a))})}]);
2
- //# sourceMappingURL=gateway-settings.js.map
1
+ (()=>{var __webpack_modules__={795:()=>{eval(";\ndocument.addEventListener('DOMContentLoaded', () => {\n const payLaterMessagingCheckboxes = document.querySelectorAll(\"#ppcp-message_enabled, #ppcp-message_cart_enabled, #ppcp-message_product_enabled\");\n const vaultingCheckboxes = document.querySelectorAll(\"#ppcp-vault_enabled\");\n\n function atLeastOneChecked(checkboxesNodeList) {\n return Array.prototype.slice.call(checkboxesNodeList).filter(node => !node.disabled && node.checked).length > 0;\n }\n\n function disableAll(nodeList) {\n nodeList.forEach(node => node.setAttribute('disabled', 'true'));\n }\n\n function enableAll(nodeList) {\n nodeList.forEach(node => node.removeAttribute('disabled'));\n }\n\n function updateCheckboxes() {\n atLeastOneChecked(payLaterMessagingCheckboxes) ? disableAll(vaultingCheckboxes) : enableAll(vaultingCheckboxes);\n atLeastOneChecked(vaultingCheckboxes) ? disableAll(payLaterMessagingCheckboxes) : enableAll(payLaterMessagingCheckboxes);\n\n if (typeof PayPalCommerceGatewaySettings === 'undefined' || PayPalCommerceGatewaySettings.vaulting_features_available !== '1') {\n disableAll(vaultingCheckboxes);\n }\n }\n\n updateCheckboxes();\n payLaterMessagingCheckboxes.forEach(node => node.addEventListener('change', updateCheckboxes));\n vaultingCheckboxes.forEach(node => node.addEventListener('change', updateCheckboxes));\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wcGNwLXdjLWdhdGV3YXkvLi9yZXNvdXJjZXMvanMvZ2F0ZXdheS1zZXR0aW5ncy5qcz8xODEzIl0sIm5hbWVzIjpbImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInBheUxhdGVyTWVzc2FnaW5nQ2hlY2tib3hlcyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJ2YXVsdGluZ0NoZWNrYm94ZXMiLCJhdExlYXN0T25lQ2hlY2tlZCIsImNoZWNrYm94ZXNOb2RlTGlzdCIsIkFycmF5IiwicHJvdG90eXBlIiwic2xpY2UiLCJjYWxsIiwiZmlsdGVyIiwibm9kZSIsImRpc2FibGVkIiwiY2hlY2tlZCIsImxlbmd0aCIsImRpc2FibGVBbGwiLCJub2RlTGlzdCIsImZvckVhY2giLCJzZXRBdHRyaWJ1dGUiLCJlbmFibGVBbGwiLCJyZW1vdmVBdHRyaWJ1dGUiLCJ1cGRhdGVDaGVja2JveGVzIiwiUGF5UGFsQ29tbWVyY2VHYXRld2F5U2V0dGluZ3MiLCJ2YXVsdGluZ19mZWF0dXJlc19hdmFpbGFibGUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUNBLFFBQVEsQ0FBQ0MsZ0JBQVQsQ0FDRyxrQkFESCxFQUVHLE1BQU07QUFDRixRQUFNQywyQkFBMkIsR0FBR0YsUUFBUSxDQUFDRyxnQkFBVCxDQUNoQyxrRkFEZ0MsQ0FBcEM7QUFJQSxRQUFNQyxrQkFBa0IsR0FBR0osUUFBUSxDQUFDRyxnQkFBVCxDQUN2QixxQkFEdUIsQ0FBM0I7O0FBSUEsV0FBU0UsaUJBQVQsQ0FBMkJDLGtCQUEzQixFQUErQztBQUMzQyxXQUFPQyxLQUFLLENBQUNDLFNBQU4sQ0FBZ0JDLEtBQWhCLENBQXNCQyxJQUF0QixDQUEyQkosa0JBQTNCLEVBQStDSyxNQUEvQyxDQUFzREMsSUFBSSxJQUFJLENBQUNBLElBQUksQ0FBQ0MsUUFBTixJQUFrQkQsSUFBSSxDQUFDRSxPQUFyRixFQUE4RkMsTUFBOUYsR0FBdUcsQ0FBOUc7QUFDSDs7QUFFRCxXQUFTQyxVQUFULENBQW9CQyxRQUFwQixFQUE2QjtBQUN6QkEsSUFBQUEsUUFBUSxDQUFDQyxPQUFULENBQWlCTixJQUFJLElBQUlBLElBQUksQ0FBQ08sWUFBTCxDQUFrQixVQUFsQixFQUE4QixNQUE5QixDQUF6QjtBQUNIOztBQUVELFdBQVNDLFNBQVQsQ0FBbUJILFFBQW5CLEVBQTRCO0FBQ3hCQSxJQUFBQSxRQUFRLENBQUNDLE9BQVQsQ0FBaUJOLElBQUksSUFBSUEsSUFBSSxDQUFDUyxlQUFMLENBQXFCLFVBQXJCLENBQXpCO0FBQ0g7O0FBRUQsV0FBU0MsZ0JBQVQsR0FBNEI7QUFDeEJqQixJQUFBQSxpQkFBaUIsQ0FBQ0gsMkJBQUQsQ0FBakIsR0FBaURjLFVBQVUsQ0FBQ1osa0JBQUQsQ0FBM0QsR0FBa0ZnQixTQUFTLENBQUNoQixrQkFBRCxDQUEzRjtBQUNBQyxJQUFBQSxpQkFBaUIsQ0FBQ0Qsa0JBQUQsQ0FBakIsR0FBd0NZLFVBQVUsQ0FBQ2QsMkJBQUQsQ0FBbEQsR0FBa0ZrQixTQUFTLENBQUNsQiwyQkFBRCxDQUEzRjs7QUFFQSxRQUFHLE9BQU9xQiw2QkFBUCxLQUF5QyxXQUF6QyxJQUF3REEsNkJBQTZCLENBQUNDLDJCQUE5QixLQUE4RCxHQUF6SCxFQUErSDtBQUMzSFIsTUFBQUEsVUFBVSxDQUFDWixrQkFBRCxDQUFWO0FBQ0g7QUFDSjs7QUFFRGtCLEVBQUFBLGdCQUFnQjtBQUVoQnBCLEVBQUFBLDJCQUEyQixDQUFDZ0IsT0FBNUIsQ0FBb0NOLElBQUksSUFBSUEsSUFBSSxDQUFDWCxnQkFBTCxDQUFzQixRQUF0QixFQUFnQ3FCLGdCQUFoQyxDQUE1QztBQUNBbEIsRUFBQUEsa0JBQWtCLENBQUNjLE9BQW5CLENBQTJCTixJQUFJLElBQUlBLElBQUksQ0FBQ1gsZ0JBQUwsQ0FBc0IsUUFBdEIsRUFBZ0NxQixnQkFBaEMsQ0FBbkM7QUFDSCxDQXBDSiIsInNvdXJjZXNDb250ZW50IjpbIjtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICdET01Db250ZW50TG9hZGVkJyxcbiAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBheUxhdGVyTWVzc2FnaW5nQ2hlY2tib3hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgICBcIiNwcGNwLW1lc3NhZ2VfZW5hYmxlZCwgI3BwY3AtbWVzc2FnZV9jYXJ0X2VuYWJsZWQsICNwcGNwLW1lc3NhZ2VfcHJvZHVjdF9lbmFibGVkXCJcbiAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IHZhdWx0aW5nQ2hlY2tib3hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgICBcIiNwcGNwLXZhdWx0X2VuYWJsZWRcIlxuICAgICAgICApXG5cbiAgICAgICAgZnVuY3Rpb24gYXRMZWFzdE9uZUNoZWNrZWQoY2hlY2tib3hlc05vZGVMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoY2hlY2tib3hlc05vZGVMaXN0KS5maWx0ZXIobm9kZSA9PiAhbm9kZS5kaXNhYmxlZCAmJiBub2RlLmNoZWNrZWQpLmxlbmd0aCA+IDBcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGRpc2FibGVBbGwobm9kZUxpc3Qpe1xuICAgICAgICAgICAgbm9kZUxpc3QuZm9yRWFjaChub2RlID0+IG5vZGUuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICd0cnVlJykpXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBlbmFibGVBbGwobm9kZUxpc3Qpe1xuICAgICAgICAgICAgbm9kZUxpc3QuZm9yRWFjaChub2RlID0+IG5vZGUucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpKVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQ2hlY2tib3hlcygpIHtcbiAgICAgICAgICAgIGF0TGVhc3RPbmVDaGVja2VkKHBheUxhdGVyTWVzc2FnaW5nQ2hlY2tib3hlcykgPyBkaXNhYmxlQWxsKHZhdWx0aW5nQ2hlY2tib3hlcykgOiBlbmFibGVBbGwodmF1bHRpbmdDaGVja2JveGVzKVxuICAgICAgICAgICAgYXRMZWFzdE9uZUNoZWNrZWQodmF1bHRpbmdDaGVja2JveGVzKSA/IGRpc2FibGVBbGwocGF5TGF0ZXJNZXNzYWdpbmdDaGVja2JveGVzKSA6IGVuYWJsZUFsbChwYXlMYXRlck1lc3NhZ2luZ0NoZWNrYm94ZXMpXG5cbiAgICAgICAgICAgIGlmKHR5cGVvZiBQYXlQYWxDb21tZXJjZUdhdGV3YXlTZXR0aW5ncyA9PT0gJ3VuZGVmaW5lZCcgfHwgUGF5UGFsQ29tbWVyY2VHYXRld2F5U2V0dGluZ3MudmF1bHRpbmdfZmVhdHVyZXNfYXZhaWxhYmxlICE9PSAnMScgKSB7XG4gICAgICAgICAgICAgICAgZGlzYWJsZUFsbCh2YXVsdGluZ0NoZWNrYm94ZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVDaGVja2JveGVzKClcblxuICAgICAgICBwYXlMYXRlck1lc3NhZ2luZ0NoZWNrYm94ZXMuZm9yRWFjaChub2RlID0+IG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdXBkYXRlQ2hlY2tib3hlcykpXG4gICAgICAgIHZhdWx0aW5nQ2hlY2tib3hlcy5mb3JFYWNoKG5vZGUgPT4gbm9kZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB1cGRhdGVDaGVja2JveGVzKSk7XG4gICAgfVxuKTtcbiJdLCJmaWxlIjoiNzk1LmpzIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///795\n")}},__webpack_exports__={};__webpack_modules__[795]()})();
 
modules/ppcp-wc-gateway/assets/js/gateway-settings.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./resources/js/gateway-settings.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","document","addEventListener","payLaterMessagingCheckboxes","querySelectorAll","vaultingCheckboxes","atLeastOneChecked","checkboxesNodeList","Array","slice","filter","node","disabled","checked","length","disableAll","nodeList","forEach","setAttribute","enableAll","removeAttribute","updateCheckboxes","PayPalCommerceGatewaySettings","vaulting_features_available"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,G,gBClFpDC,SAASC,iBACN,mBACA,KACI,MAAMC,EAA8BF,SAASG,iBACzC,oFAGEC,EAAqBJ,SAASG,iBAChC,uBAGJ,SAASE,EAAkBC,GACvB,OAAOC,MAAMX,UAAUY,MAAMrC,KAAKmC,GAAoBG,OAAOC,IAASA,EAAKC,UAAYD,EAAKE,SAASC,OAAS,EAGlH,SAASC,EAAWC,GAChBA,EAASC,QAAQN,GAAQA,EAAKO,aAAa,WAAY,SAG3D,SAASC,EAAUH,GACfA,EAASC,QAAQN,GAAQA,EAAKS,gBAAgB,aAGlD,SAASC,IACLf,EAAkBH,GAA+BY,EAAWV,GAAsBc,EAAUd,GAC5FC,EAAkBD,GAAsBU,EAAWZ,GAA+BgB,EAAUhB,GAEhD,oBAAlCmB,+BAA+G,MAA9DA,8BAA8BC,6BACrFR,EAAWV,GAInBgB,IAEAlB,EAA4Bc,QAAQN,GAAQA,EAAKT,iBAAiB,SAAUmB,IAC5EhB,EAAmBY,QAAQN,GAAQA,EAAKT,iBAAiB,SAAUmB","file":"js/gateway-settings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n",";document.addEventListener(\n 'DOMContentLoaded',\n () => {\n const payLaterMessagingCheckboxes = document.querySelectorAll(\n \"#ppcp-message_enabled, #ppcp-message_cart_enabled, #ppcp-message_product_enabled\"\n )\n\n const vaultingCheckboxes = document.querySelectorAll(\n \"#ppcp-vault_enabled\"\n )\n\n function atLeastOneChecked(checkboxesNodeList) {\n return Array.prototype.slice.call(checkboxesNodeList).filter(node => !node.disabled && node.checked).length > 0\n }\n\n function disableAll(nodeList){\n nodeList.forEach(node => node.setAttribute('disabled', 'true'))\n }\n\n function enableAll(nodeList){\n nodeList.forEach(node => node.removeAttribute('disabled'))\n }\n\n function updateCheckboxes() {\n atLeastOneChecked(payLaterMessagingCheckboxes) ? disableAll(vaultingCheckboxes) : enableAll(vaultingCheckboxes)\n atLeastOneChecked(vaultingCheckboxes) ? disableAll(payLaterMessagingCheckboxes) : enableAll(payLaterMessagingCheckboxes)\n\n if(typeof PayPalCommerceGatewaySettings === 'undefined' || PayPalCommerceGatewaySettings.vaulting_features_available !== '1' ) {\n disableAll(vaultingCheckboxes)\n }\n }\n\n updateCheckboxes()\n\n payLaterMessagingCheckboxes.forEach(node => node.addEventListener('change', updateCheckboxes))\n vaultingCheckboxes.forEach(node => node.addEventListener('change', updateCheckboxes));\n }\n);\n"],"sourceRoot":""}
 
modules/ppcp-wc-gateway/package.json CHANGED
@@ -7,11 +7,11 @@
7
  "@babel/core": "^7.9.0",
8
  "@babel/preset-env": "^7.9.5",
9
  "babel-loader": "^8.1.0",
10
- "cross-env": "^5.0.1",
11
- "file-loader": "^4.2.0",
12
- "webpack": "^4.42.1",
13
- "webpack-cli": "^3.1.2",
14
- "babel-plugin-transform-object-rest-spread": "^6.26.0"
15
  },
16
  "scripts": {
17
  "build": "cross-env BABEL_ENV=default NODE_ENV=production webpack",
7
  "@babel/core": "^7.9.0",
8
  "@babel/preset-env": "^7.9.5",
9
  "babel-loader": "^8.1.0",
10
+ "babel-plugin-transform-object-rest-spread": "^6.26.0",
11
+ "cross-env": "^7.0.3",
12
+ "file-loader": "^6.2.0",
13
+ "webpack": "^5.55.0",
14
+ "webpack-cli": "^4.8.0"
15
  },
16
  "scripts": {
17
  "build": "cross-env BABEL_ENV=default NODE_ENV=production webpack",
modules/ppcp-wc-gateway/services.php CHANGED
@@ -5,6 +5,8 @@
5
  * @package WooCommerce\PayPalCommerce\WcGateway
6
  */
7
 
 
 
8
  declare(strict_types=1);
9
 
10
  namespace WooCommerce\PayPalCommerce\WcGateway;
@@ -28,6 +30,7 @@ use Woocommerce\PayPalCommerce\WcGateway\Helper\DccProductStatus;
28
  use Woocommerce\PayPalCommerce\WcGateway\Helper\SettingsStatus;
29
  use WooCommerce\PayPalCommerce\WcGateway\Notice\AuthorizeOrderActionNotice;
30
  use WooCommerce\PayPalCommerce\WcGateway\Notice\ConnectAdminNotice;
 
31
  use WooCommerce\PayPalCommerce\WcGateway\Processor\AuthorizedPaymentsProcessor;
32
  use WooCommerce\PayPalCommerce\WcGateway\Processor\OrderProcessor;
33
  use WooCommerce\PayPalCommerce\WcGateway\Processor\RefundProcessor;
@@ -35,6 +38,7 @@ use WooCommerce\PayPalCommerce\WcGateway\Settings\SectionsRenderer;
35
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
36
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsListener;
37
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsRenderer;
 
38
 
39
  return array(
40
  'wcgateway.paypal-gateway' => static function ( $container ): PayPalGateway {
@@ -48,6 +52,7 @@ return array(
48
  $state = $container->get( 'onboarding.state' );
49
  $transaction_url_provider = $container->get( 'wcgateway.transaction-url-provider' );
50
  $subscription_helper = $container->get( 'subscription.helper' );
 
51
  return new PayPalGateway(
52
  $settings_renderer,
53
  $order_processor,
@@ -58,7 +63,8 @@ return array(
58
  $refund_processor,
59
  $state,
60
  $transaction_url_provider,
61
- $subscription_helper
 
62
  );
63
  },
64
  'wcgateway.credit-card-gateway' => static function ( $container ): CreditCardGateway {
@@ -72,11 +78,12 @@ return array(
72
  $refund_processor = $container->get( 'wcgateway.processor.refunds' );
73
  $state = $container->get( 'onboarding.state' );
74
  $transaction_url_provider = $container->get( 'wcgateway.transaction-url-provider' );
75
- $payment_token_repository = $container->get( 'subscription.repository.payment-token' );
76
  $purchase_unit_factory = $container->get( 'api.factory.purchase-unit' );
77
  $payer_factory = $container->get( 'api.factory.payer' );
78
  $order_endpoint = $container->get( 'api.endpoint.order' );
79
  $subscription_helper = $container->get( 'subscription.helper' );
 
80
  return new CreditCardGateway(
81
  $settings_renderer,
82
  $order_processor,
@@ -92,7 +99,8 @@ return array(
92
  $purchase_unit_factory,
93
  $payer_factory,
94
  $order_endpoint,
95
- $subscription_helper
 
96
  );
97
  },
98
  'wcgateway.disabler' => static function ( $container ): DisableGateways {
@@ -100,6 +108,33 @@ return array(
100
  $settings = $container->get( 'wcgateway.settings' );
101
  return new DisableGateways( $session_handler, $settings );
102
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  'wcgateway.settings' => static function ( $container ): Settings {
104
  return new Settings();
105
  },
@@ -108,12 +143,19 @@ return array(
108
  $settings = $container->get( 'wcgateway.settings' );
109
  return new ConnectAdminNotice( $state, $settings );
110
  },
 
 
 
 
 
 
 
111
  'wcgateway.notice.authorize-order-action' =>
112
  static function ( $container ): AuthorizeOrderActionNotice {
113
  return new AuthorizeOrderActionNotice();
114
  },
115
  'wcgateway.settings.sections-renderer' => static function ( $container ): SectionsRenderer {
116
- return new SectionsRenderer();
117
  },
118
  'wcgateway.settings.status' => static function ( $container ): SettingsStatus {
119
  $settings = $container->get( 'wcgateway.settings' );
@@ -127,6 +169,7 @@ return array(
127
  $messages_apply = $container->get( 'button.helper.messages-apply' );
128
  $dcc_product_status = $container->get( 'wcgateway.helper.dcc-product-status' );
129
  $settings_status = $container->get( 'wcgateway.settings.status' );
 
130
  return new SettingsRenderer(
131
  $settings,
132
  $state,
@@ -134,7 +177,8 @@ return array(
134
  $dcc_applies,
135
  $messages_apply,
136
  $dcc_product_status,
137
- $settings_status
 
138
  );
139
  },
140
  'wcgateway.settings.listener' => static function ( $container ): SettingsListener {
@@ -144,7 +188,8 @@ return array(
144
  $state = $container->get( 'onboarding.state' );
145
  $cache = new Cache( 'ppcp-paypal-bearer' );
146
  $bearer = $container->get( 'api.bearer' );
147
- return new SettingsListener( $settings, $fields, $webhook_registrar, $cache, $state, $bearer );
 
148
  },
149
  'wcgateway.order-processor' => static function ( $container ): OrderProcessor {
150
 
@@ -646,7 +691,7 @@ return array(
646
  'label' => sprintf(
647
  // translators: %1$s and %2$s are the opening and closing of HTML <a> tag.
648
  __( 'Enable saved cards and subscription features on your store. To use vaulting features, you must %1$senable vaulting on your account%2$s.', 'woocommerce-paypal-payments' ),
649
- '<a
650
  href="https://docs.woocommerce.com/document/woocommerce-paypal-payments/#enable-vaulting-on-your-live-account"
651
  target="_blank"
652
  >',
@@ -658,7 +703,7 @@ return array(
658
  State::STATE_ONBOARDED,
659
  ),
660
  'requirements' => array(),
661
- 'gateway' => 'all',
662
  ),
663
  'logging_enabled' => array(
664
  'title' => __( 'Logging', 'woocommerce-paypal-payments' ),
@@ -1804,6 +1849,62 @@ return array(
1804
  ),
1805
  'gateway' => 'dcc',
1806
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1807
  );
1808
  if ( ! defined( 'PPCP_FLAG_SUBSCRIPTION' ) || ! PPCP_FLAG_SUBSCRIPTION ) {
1809
  unset( $fields['vault_enabled'] );
@@ -1820,15 +1921,6 @@ return array(
1820
  unset( $fields['ppcp_disconnect_sandbox'] );
1821
  }
1822
 
1823
- /**
1824
- * Disable card for UK.
1825
- */
1826
- $region = wc_get_base_location();
1827
- $country = $region['country'];
1828
- if ( 'GB' === $country ) {
1829
- unset( $fields['disable_funding']['options']['card'] );
1830
- }
1831
-
1832
  /**
1833
  * Depending on your store location, some credit cards can't be used.
1834
  * Here, we filter them out.
5
  * @package WooCommerce\PayPalCommerce\WcGateway
6
  */
7
 
8
+ // phpcs:disable WordPress.Security.NonceVerification.Recommended
9
+
10
  declare(strict_types=1);
11
 
12
  namespace WooCommerce\PayPalCommerce\WcGateway;
30
  use Woocommerce\PayPalCommerce\WcGateway\Helper\SettingsStatus;
31
  use WooCommerce\PayPalCommerce\WcGateway\Notice\AuthorizeOrderActionNotice;
32
  use WooCommerce\PayPalCommerce\WcGateway\Notice\ConnectAdminNotice;
33
+ use WooCommerce\PayPalCommerce\WcGateway\Notice\DccWithoutPayPalAdminNotice;
34
  use WooCommerce\PayPalCommerce\WcGateway\Processor\AuthorizedPaymentsProcessor;
35
  use WooCommerce\PayPalCommerce\WcGateway\Processor\OrderProcessor;
36
  use WooCommerce\PayPalCommerce\WcGateway\Processor\RefundProcessor;
38
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
39
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsListener;
40
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsRenderer;
41
+ use WooCommerce\PayPalCommerce\Webhooks\Status\WebhooksStatusPage;
42
 
43
  return array(
44
  'wcgateway.paypal-gateway' => static function ( $container ): PayPalGateway {
52
  $state = $container->get( 'onboarding.state' );
53
  $transaction_url_provider = $container->get( 'wcgateway.transaction-url-provider' );
54
  $subscription_helper = $container->get( 'subscription.helper' );
55
+ $page_id = $container->get( 'wcgateway.current-ppcp-settings-page-id' );
56
  return new PayPalGateway(
57
  $settings_renderer,
58
  $order_processor,
63
  $refund_processor,
64
  $state,
65
  $transaction_url_provider,
66
+ $subscription_helper,
67
+ $page_id
68
  );
69
  },
70
  'wcgateway.credit-card-gateway' => static function ( $container ): CreditCardGateway {
78
  $refund_processor = $container->get( 'wcgateway.processor.refunds' );
79
  $state = $container->get( 'onboarding.state' );
80
  $transaction_url_provider = $container->get( 'wcgateway.transaction-url-provider' );
81
+ $payment_token_repository = $container->get( 'vaulting.repository.payment-token' );
82
  $purchase_unit_factory = $container->get( 'api.factory.purchase-unit' );
83
  $payer_factory = $container->get( 'api.factory.payer' );
84
  $order_endpoint = $container->get( 'api.endpoint.order' );
85
  $subscription_helper = $container->get( 'subscription.helper' );
86
+ $logger = $container->get( 'woocommerce.logger.woocommerce' );
87
  return new CreditCardGateway(
88
  $settings_renderer,
89
  $order_processor,
99
  $purchase_unit_factory,
100
  $payer_factory,
101
  $order_endpoint,
102
+ $subscription_helper,
103
+ $logger
104
  );
105
  },
106
  'wcgateway.disabler' => static function ( $container ): DisableGateways {
108
  $settings = $container->get( 'wcgateway.settings' );
109
  return new DisableGateways( $session_handler, $settings );
110
  },
111
+
112
+ 'wcgateway.is-wc-payments-page' => static function ( $container ): bool {
113
+ $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
114
+ $tab = isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
115
+ return 'wc-settings' === $page && 'checkout' === $tab;
116
+ },
117
+
118
+ 'wcgateway.is-ppcp-settings-page' => static function ( $container ): bool {
119
+ if ( ! $container->get( 'wcgateway.is-wc-payments-page' ) ) {
120
+ return false;
121
+ }
122
+
123
+ $section = isset( $_GET['section'] ) ? sanitize_text_field( wp_unslash( $_GET['section'] ) ) : '';
124
+ return in_array( $section, array( PayPalGateway::ID, CreditCardGateway::ID, WebhooksStatusPage::ID ), true );
125
+ },
126
+
127
+ 'wcgateway.current-ppcp-settings-page-id' => static function ( $container ): string {
128
+ if ( ! $container->get( 'wcgateway.is-ppcp-settings-page' ) ) {
129
+ return '';
130
+ }
131
+
132
+ $section = isset( $_GET['section'] ) ? sanitize_text_field( wp_unslash( $_GET['section'] ) ) : '';
133
+ $ppcp_tab = isset( $_GET[ SectionsRenderer::KEY ] ) ? sanitize_text_field( wp_unslash( $_GET[ SectionsRenderer::KEY ] ) ) : '';
134
+
135
+ return $ppcp_tab ? $ppcp_tab : $section;
136
+ },
137
+
138
  'wcgateway.settings' => static function ( $container ): Settings {
139
  return new Settings();
140
  },
143
  $settings = $container->get( 'wcgateway.settings' );
144
  return new ConnectAdminNotice( $state, $settings );
145
  },
146
+ 'wcgateway.notice.dcc-without-paypal' => static function ( $container ): DccWithoutPayPalAdminNotice {
147
+ $state = $container->get( 'onboarding.state' );
148
+ $settings = $container->get( 'wcgateway.settings' );
149
+ $is_payments_page = $container->get( 'wcgateway.is-wc-payments-page' );
150
+ $is_ppcp_settings_page = $container->get( 'wcgateway.is-ppcp-settings-page' );
151
+ return new DccWithoutPayPalAdminNotice( $state, $settings, $is_payments_page, $is_ppcp_settings_page );
152
+ },
153
  'wcgateway.notice.authorize-order-action' =>
154
  static function ( $container ): AuthorizeOrderActionNotice {
155
  return new AuthorizeOrderActionNotice();
156
  },
157
  'wcgateway.settings.sections-renderer' => static function ( $container ): SectionsRenderer {
158
+ return new SectionsRenderer( $container->get( 'wcgateway.current-ppcp-settings-page-id' ) );
159
  },
160
  'wcgateway.settings.status' => static function ( $container ): SettingsStatus {
161
  $settings = $container->get( 'wcgateway.settings' );
169
  $messages_apply = $container->get( 'button.helper.messages-apply' );
170
  $dcc_product_status = $container->get( 'wcgateway.helper.dcc-product-status' );
171
  $settings_status = $container->get( 'wcgateway.settings.status' );
172
+ $page_id = $container->get( 'wcgateway.current-ppcp-settings-page-id' );
173
  return new SettingsRenderer(
174
  $settings,
175
  $state,
177
  $dcc_applies,
178
  $messages_apply,
179
  $dcc_product_status,
180
+ $settings_status,
181
+ $page_id
182
  );
183
  },
184
  'wcgateway.settings.listener' => static function ( $container ): SettingsListener {
188
  $state = $container->get( 'onboarding.state' );
189
  $cache = new Cache( 'ppcp-paypal-bearer' );
190
  $bearer = $container->get( 'api.bearer' );
191
+ $page_id = $container->get( 'wcgateway.current-ppcp-settings-page-id' );
192
+ return new SettingsListener( $settings, $fields, $webhook_registrar, $cache, $state, $bearer, $page_id );
193
  },
194
  'wcgateway.order-processor' => static function ( $container ): OrderProcessor {
195
 
691
  'label' => sprintf(
692
  // translators: %1$s and %2$s are the opening and closing of HTML <a> tag.
693
  __( 'Enable saved cards and subscription features on your store. To use vaulting features, you must %1$senable vaulting on your account%2$s.', 'woocommerce-paypal-payments' ),
694
+ '<a
695
  href="https://docs.woocommerce.com/document/woocommerce-paypal-payments/#enable-vaulting-on-your-live-account"
696
  target="_blank"
697
  >',
703
  State::STATE_ONBOARDED,
704
  ),
705
  'requirements' => array(),
706
+ 'gateway' => array( 'paypal', 'dcc' ),
707
  ),
708
  'logging_enabled' => array(
709
  'title' => __( 'Logging', 'woocommerce-paypal-payments' ),
1849
  ),
1850
  'gateway' => 'dcc',
1851
  ),
1852
+ '3d_secure_heading' => array(
1853
+ 'heading' => __( '3D Secure', 'woocommerce-paypal-payments' ),
1854
+ 'type' => 'ppcp-heading',
1855
+ 'description' => wp_kses_post(
1856
+ sprintf(
1857
+ // translators: %1$s and %2$s is a link tag.
1858
+ __(
1859
+ '3D Secure benefits cardholders and merchants by providing
1860
+ an additional layer of verification using Verified by Visa,
1861
+ MasterCard SecureCode and American Express SafeKey.
1862
+ %1$sLearn more about 3D Secure.%2$s',
1863
+ 'woocommerce-paypal-payments'
1864
+ ),
1865
+ '<a
1866
+ rel="noreferrer noopener"
1867
+ href="https://woocommerce.com/posts/introducing-strong-customer-authentication-sca/"
1868
+ >',
1869
+ '</a>'
1870
+ )
1871
+ ),
1872
+ 'screens' => array(
1873
+ State::STATE_ONBOARDED,
1874
+ ),
1875
+ 'requirements' => array(
1876
+ 'dcc',
1877
+ ),
1878
+ 'gateway' => 'dcc',
1879
+ ),
1880
+ '3d_secure_contingency' => array(
1881
+ 'title' => __( 'Contingency for 3D Secure', 'woocommerce-paypal-payments' ),
1882
+ 'type' => 'select',
1883
+ 'description' => sprintf(
1884
+ // translators: %1$s and %2$s opening and closing ul tag, %3$s and %4$s opening and closing li tag.
1885
+ __( '%1$s%3$sNo 3D Secure will cause transactions to be denied if 3D Secure is required by the bank of the cardholder.%4$s%3$sSCA_WHEN_REQUIRED returns a 3D Secure contingency when it is a mandate in the region where you operate.%4$s%3$sSCA_ALWAYS triggers 3D Secure for every transaction, regardless of SCA requirements.%4$s%2$s', 'woocommerce-paypal-payments' ),
1886
+ '<ul>',
1887
+ '</ul>',
1888
+ '<li>',
1889
+ '</li>'
1890
+ ),
1891
+ 'class' => array(),
1892
+ 'input_class' => array( 'wc-enhanced-select' ),
1893
+ 'default' => 'SCA_WHEN_REQUIRED',
1894
+ 'desc_tip' => true,
1895
+ 'options' => array(
1896
+ 'NO_3D_SECURE' => __( 'No 3D Secure (transaction will be denied if 3D Secure is required)', 'woocommerce-paypal-payments' ),
1897
+ 'SCA_WHEN_REQUIRED' => __( '3D Secure when required', 'woocommerce-paypal-payments' ),
1898
+ '3D_SECURE' => __( 'Always trigger 3D Secure', 'woocommerce-paypal-payments' ),
1899
+ ),
1900
+ 'screens' => array(
1901
+ State::STATE_ONBOARDED,
1902
+ ),
1903
+ 'requirements' => array(
1904
+ 'dcc',
1905
+ ),
1906
+ 'gateway' => 'dcc',
1907
+ ),
1908
  );
1909
  if ( ! defined( 'PPCP_FLAG_SUBSCRIPTION' ) || ! PPCP_FLAG_SUBSCRIPTION ) {
1910
  unset( $fields['vault_enabled'] );
1921
  unset( $fields['ppcp_disconnect_sandbox'] );
1922
  }
1923
 
 
 
 
 
 
 
 
 
 
1924
  /**
1925
  * Depending on your store location, some credit cards can't be used.
1926
  * Here, we filter them out.
modules/ppcp-wc-gateway/src/Gateway/class-creditcardgateway.php CHANGED
@@ -9,13 +9,14 @@ declare(strict_types=1);
9
 
10
  namespace WooCommerce\PayPalCommerce\WcGateway\Gateway;
11
 
 
12
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint;
13
  use WooCommerce\PayPalCommerce\ApiClient\Factory\PayerFactory;
14
  use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory;
15
  use WooCommerce\PayPalCommerce\Onboarding\State;
16
  use WooCommerce\PayPalCommerce\Session\SessionHandler;
17
  use WooCommerce\PayPalCommerce\Subscription\Helper\SubscriptionHelper;
18
- use WooCommerce\PayPalCommerce\Subscription\Repository\PaymentTokenRepository;
19
  use WooCommerce\PayPalCommerce\WcGateway\Notice\AuthorizeOrderActionNotice;
20
  use WooCommerce\PayPalCommerce\WcGateway\Processor\AuthorizedPaymentsProcessor;
21
  use WooCommerce\PayPalCommerce\WcGateway\Processor\OrderProcessor;
@@ -46,6 +47,13 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC {
46
  */
47
  protected $subscription_helper;
48
 
 
 
 
 
 
 
 
49
  /**
50
  * The URL to the module.
51
  *
@@ -104,8 +112,9 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC {
104
  * @param PaymentTokenRepository $payment_token_repository The payment token repository.
105
  * @param PurchaseUnitFactory $purchase_unit_factory The purchase unit factory.
106
  * @param PayerFactory $payer_factory The payer factory.
107
- * @param OrderEndpoint $order_endpoint The order endpoint.
108
  * @param SubscriptionHelper $subscription_helper The subscription helper.
 
109
  */
110
  public function __construct(
111
  SettingsRenderer $settings_renderer,
@@ -122,7 +131,8 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC {
122
  PurchaseUnitFactory $purchase_unit_factory,
123
  PayerFactory $payer_factory,
124
  OrderEndpoint $order_endpoint,
125
- SubscriptionHelper $subscription_helper
 
126
  ) {
127
 
128
  $this->id = self::ID;
@@ -190,6 +200,7 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC {
190
  $this->order_endpoint = $order_endpoint;
191
  $this->transaction_url_provider = $transaction_url_provider;
192
  $this->subscription_helper = $subscription_helper;
 
193
  }
194
 
195
  /**
@@ -197,13 +208,7 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC {
197
  */
198
  public function init_form_fields() {
199
  $this->form_fields = array(
200
- 'enabled' => array(
201
- 'title' => __( 'Enable/Disable', 'woocommerce-paypal-payments' ),
202
- 'type' => 'checkbox',
203
- 'label' => __( 'Enable Credit Card Payments', 'woocommerce-paypal-payments' ),
204
- 'default' => 'no',
205
- ),
206
- 'ppcp' => array(
207
  'type' => 'ppcp',
208
  ),
209
  );
@@ -218,6 +223,20 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC {
218
  remove_action( 'gettext', 'replace_credit_card_cvv_label' );
219
  }
220
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
221
  /**
222
  * Replace WooCommerce credit card field label.
223
  *
@@ -314,7 +333,7 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC {
314
  * @return bool
315
  */
316
  public function is_available() : bool {
317
- return $this->config->has( 'dcc_enabled' ) && $this->config->get( 'dcc_enabled' );
318
  }
319
 
320
 
@@ -349,4 +368,60 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC {
349
 
350
  return parent::get_transaction_url( $order );
351
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
352
  }
9
 
10
  namespace WooCommerce\PayPalCommerce\WcGateway\Gateway;
11
 
12
+ use Psr\Log\LoggerInterface;
13
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint;
14
  use WooCommerce\PayPalCommerce\ApiClient\Factory\PayerFactory;
15
  use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory;
16
  use WooCommerce\PayPalCommerce\Onboarding\State;
17
  use WooCommerce\PayPalCommerce\Session\SessionHandler;
18
  use WooCommerce\PayPalCommerce\Subscription\Helper\SubscriptionHelper;
19
+ use WooCommerce\PayPalCommerce\Vaulting\PaymentTokenRepository;
20
  use WooCommerce\PayPalCommerce\WcGateway\Notice\AuthorizeOrderActionNotice;
21
  use WooCommerce\PayPalCommerce\WcGateway\Processor\AuthorizedPaymentsProcessor;
22
  use WooCommerce\PayPalCommerce\WcGateway\Processor\OrderProcessor;
47
  */
48
  protected $subscription_helper;
49
 
50
+ /**
51
+ * The logger.
52
+ *
53
+ * @var LoggerInterface
54
+ */
55
+ protected $logger;
56
+
57
  /**
58
  * The URL to the module.
59
  *
112
  * @param PaymentTokenRepository $payment_token_repository The payment token repository.
113
  * @param PurchaseUnitFactory $purchase_unit_factory The purchase unit factory.
114
  * @param PayerFactory $payer_factory The payer factory.
115
+ * @param OrderEndpoint $order_endpoint The order endpoint.
116
  * @param SubscriptionHelper $subscription_helper The subscription helper.
117
+ * @param LoggerInterface $logger The logger.
118
  */
119
  public function __construct(
120
  SettingsRenderer $settings_renderer,
131
  PurchaseUnitFactory $purchase_unit_factory,
132
  PayerFactory $payer_factory,
133
  OrderEndpoint $order_endpoint,
134
+ SubscriptionHelper $subscription_helper,
135
+ LoggerInterface $logger
136
  ) {
137
 
138
  $this->id = self::ID;
200
  $this->order_endpoint = $order_endpoint;
201
  $this->transaction_url_provider = $transaction_url_provider;
202
  $this->subscription_helper = $subscription_helper;
203
+ $this->logger = $logger;
204
  }
205
 
206
  /**
208
  */
209
  public function init_form_fields() {
210
  $this->form_fields = array(
211
+ 'ppcp' => array(
 
 
 
 
 
 
212
  'type' => 'ppcp',
213
  ),
214
  );
223
  remove_action( 'gettext', 'replace_credit_card_cvv_label' );
224
  }
225
 
226
+ /**
227
+ * Renders the settings.
228
+ *
229
+ * @return string
230
+ */
231
+ public function generate_ppcp_html(): string {
232
+
233
+ ob_start();
234
+ $this->settings_renderer->render();
235
+ $content = ob_get_contents();
236
+ ob_end_clean();
237
+ return $content;
238
+ }
239
+
240
  /**
241
  * Replace WooCommerce credit card field label.
242
  *
333
  * @return bool
334
  */
335
  public function is_available() : bool {
336
+ return $this->is_enabled();
337
  }
338
 
339
 
368
 
369
  return parent::get_transaction_url( $order );
370
  }
371
+
372
+ /**
373
+ * Initialize settings for WC.
374
+ *
375
+ * @return void
376
+ */
377
+ public function init_settings() {
378
+ parent::init_settings();
379
+
380
+ // looks like in some cases WC uses this field instead of get_option.
381
+ $this->enabled = $this->is_enabled();
382
+ }
383
+
384
+ /**
385
+ * Get the option value for WC.
386
+ *
387
+ * @param string $key The option key.
388
+ * @param mixed $empty_value Value when empty.
389
+ * @return mixed
390
+ */
391
+ public function get_option( $key, $empty_value = null ) {
392
+ if ( 'enabled' === $key ) {
393
+ return $this->is_enabled();
394
+ }
395
+
396
+ return parent::get_option( $key, $empty_value );
397
+ }
398
+
399
+ /**
400
+ * Handle update of WC settings.
401
+ *
402
+ * @param string $key The option key.
403
+ * @param string $value The option value.
404
+ * @return bool was anything saved?
405
+ */
406
+ public function update_option( $key, $value = '' ) {
407
+ $ret = parent::update_option( $key, $value );
408
+
409
+ if ( 'enabled' === $key ) {
410
+ $this->config->set( 'dcc_enabled', 'yes' === $value );
411
+ $this->config->persist();
412
+
413
+ return true;
414
+ }
415
+
416
+ return $ret;
417
+ }
418
+
419
+ /**
420
+ * Returns if the gateway is enabled.
421
+ *
422
+ * @return bool
423
+ */
424
+ private function is_enabled(): bool {
425
+ return $this->config->has( 'dcc_enabled' ) && $this->config->get( 'dcc_enabled' );
426
+ }
427
  }
modules/ppcp-wc-gateway/src/Gateway/class-paypalgateway.php CHANGED
@@ -19,6 +19,7 @@ use WooCommerce\PayPalCommerce\WcGateway\Processor\RefundProcessor;
19
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SectionsRenderer;
20
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsRenderer;
21
  use Psr\Container\ContainerInterface;
 
22
 
23
  /**
24
  * Class PayPalGateway
@@ -103,6 +104,13 @@ class PayPalGateway extends \WC_Payment_Gateway {
103
  */
104
  private $onboarded;
105
 
 
 
 
 
 
 
 
106
  /**
107
  * PayPalGateway constructor.
108
  *
@@ -116,6 +124,7 @@ class PayPalGateway extends \WC_Payment_Gateway {
116
  * @param State $state The state.
117
  * @param TransactionUrlProvider $transaction_url_provider Service providing transaction view URL based on order.
118
  * @param SubscriptionHelper $subscription_helper The subscription helper.
 
119
  */
120
  public function __construct(
121
  SettingsRenderer $settings_renderer,
@@ -127,7 +136,8 @@ class PayPalGateway extends \WC_Payment_Gateway {
127
  RefundProcessor $refund_processor,
128
  State $state,
129
  TransactionUrlProvider $transaction_url_provider,
130
- SubscriptionHelper $subscription_helper
 
131
  ) {
132
 
133
  $this->id = self::ID;
@@ -139,6 +149,7 @@ class PayPalGateway extends \WC_Payment_Gateway {
139
  $this->session_handler = $session_handler;
140
  $this->refund_processor = $refund_processor;
141
  $this->transaction_url_provider = $transaction_url_provider;
 
142
  $this->onboarded = $state->current_state() === State::STATE_ONBOARDED;
143
 
144
  if ( $this->onboarded ) {
@@ -214,7 +225,7 @@ class PayPalGateway extends \WC_Payment_Gateway {
214
  ),
215
  );
216
 
217
- $should_show_enabled_checkbox = ! $this->is_credit_card_tab() && ( $this->config->has( 'merchant_email' ) && $this->config->get( 'merchant_email' ) );
218
  if ( ! $should_show_enabled_checkbox ) {
219
  unset( $this->form_fields['enabled'] );
220
  }
@@ -298,6 +309,9 @@ class PayPalGateway extends \WC_Payment_Gateway {
298
  if ( $this->is_credit_card_tab() ) {
299
  return __( 'PayPal Card Processing', 'woocommerce-paypal-payments' );
300
  }
 
 
 
301
  if ( $this->is_paypal_tab() ) {
302
  return __( 'PayPal Checkout', 'woocommerce-paypal-payments' );
303
  }
@@ -316,6 +330,12 @@ class PayPalGateway extends \WC_Payment_Gateway {
316
  'woocommerce-paypal-payments'
317
  );
318
  }
 
 
 
 
 
 
319
 
320
  return __(
321
  'Accept PayPal, Pay Later and alternative payment types.',
@@ -332,11 +352,20 @@ class PayPalGateway extends \WC_Payment_Gateway {
332
  */
333
  private function is_credit_card_tab() : bool {
334
  return is_admin()
335
- && isset( $_GET[ SectionsRenderer::KEY ] )
336
- && CreditCardGateway::ID === sanitize_text_field( wp_unslash( $_GET[ SectionsRenderer::KEY ] ) );
337
 
338
  }
339
 
 
 
 
 
 
 
 
 
 
 
340
  /**
341
  * Whether we are on the PayPal settings tab.
342
  *
@@ -345,8 +374,7 @@ class PayPalGateway extends \WC_Payment_Gateway {
345
  private function is_paypal_tab() : bool {
346
  return ! $this->is_credit_card_tab()
347
  && is_admin()
348
- && isset( $_GET['section'] )
349
- && self::ID === sanitize_text_field( wp_unslash( $_GET['section'] ) );
350
  }
351
  // phpcs:enable WordPress.Security.NonceVerification.Recommended
352
 
@@ -387,14 +415,18 @@ class PayPalGateway extends \WC_Payment_Gateway {
387
  *
388
  * @param string $key The option key.
389
  * @param string $value The option value.
390
- * @return bool|void
391
  */
392
  public function update_option( $key, $value = '' ) {
393
- parent::update_option( $key, $value );
394
 
395
  if ( 'enabled' === $key ) {
396
  $this->config->set( 'enabled', 'yes' === $value );
397
  $this->config->persist();
 
 
398
  }
 
 
399
  }
400
  }
19
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SectionsRenderer;
20
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsRenderer;
21
  use Psr\Container\ContainerInterface;
22
+ use WooCommerce\PayPalCommerce\Webhooks\Status\WebhooksStatusPage;
23
 
24
  /**
25
  * Class PayPalGateway
104
  */
105
  private $onboarded;
106
 
107
+ /**
108
+ * ID of the current PPCP gateway settings page, or empty if it is not such page.
109
+ *
110
+ * @var string
111
+ */
112
+ protected $page_id;
113
+
114
  /**
115
  * PayPalGateway constructor.
116
  *
124
  * @param State $state The state.
125
  * @param TransactionUrlProvider $transaction_url_provider Service providing transaction view URL based on order.
126
  * @param SubscriptionHelper $subscription_helper The subscription helper.
127
+ * @param string $page_id ID of the current PPCP gateway settings page, or empty if it is not such page.
128
  */
129
  public function __construct(
130
  SettingsRenderer $settings_renderer,
136
  RefundProcessor $refund_processor,
137
  State $state,
138
  TransactionUrlProvider $transaction_url_provider,
139
+ SubscriptionHelper $subscription_helper,
140
+ string $page_id
141
  ) {
142
 
143
  $this->id = self::ID;
149
  $this->session_handler = $session_handler;
150
  $this->refund_processor = $refund_processor;
151
  $this->transaction_url_provider = $transaction_url_provider;
152
+ $this->page_id = $page_id;
153
  $this->onboarded = $state->current_state() === State::STATE_ONBOARDED;
154
 
155
  if ( $this->onboarded ) {
225
  ),
226
  );
227
 
228
+ $should_show_enabled_checkbox = $this->is_paypal_tab() && ( $this->config->has( 'merchant_email' ) && $this->config->get( 'merchant_email' ) );
229
  if ( ! $should_show_enabled_checkbox ) {
230
  unset( $this->form_fields['enabled'] );
231
  }
309
  if ( $this->is_credit_card_tab() ) {
310
  return __( 'PayPal Card Processing', 'woocommerce-paypal-payments' );
311
  }
312
+ if ( $this->is_webhooks_tab() ) {
313
+ return __( 'Webhooks Status', 'woocommerce-paypal-payments' );
314
+ }
315
  if ( $this->is_paypal_tab() ) {
316
  return __( 'PayPal Checkout', 'woocommerce-paypal-payments' );
317
  }
330
  'woocommerce-paypal-payments'
331
  );
332
  }
333
+ if ( $this->is_webhooks_tab() ) {
334
+ return __(
335
+ 'Status of the webhooks subscription.',
336
+ 'woocommerce-paypal-payments'
337
+ );
338
+ }
339
 
340
  return __(
341
  'Accept PayPal, Pay Later and alternative payment types.',
352
  */
353
  private function is_credit_card_tab() : bool {
354
  return is_admin()
355
+ && CreditCardGateway::ID === $this->page_id;
 
356
 
357
  }
358
 
359
+ /**
360
+ * Whether we are on the Webhooks Status tab.
361
+ *
362
+ * @return bool
363
+ */
364
+ private function is_webhooks_tab() : bool {
365
+ return is_admin()
366
+ && WebhooksStatusPage::ID === $this->page_id;
367
+ }
368
+
369
  /**
370
  * Whether we are on the PayPal settings tab.
371
  *
374
  private function is_paypal_tab() : bool {
375
  return ! $this->is_credit_card_tab()
376
  && is_admin()
377
+ && self::ID === $this->page_id;
 
378
  }
379
  // phpcs:enable WordPress.Security.NonceVerification.Recommended
380
 
415
  *
416
  * @param string $key The option key.
417
  * @param string $value The option value.
418
+ * @return bool was anything saved?
419
  */
420
  public function update_option( $key, $value = '' ) {
421
+ $ret = parent::update_option( $key, $value );
422
 
423
  if ( 'enabled' === $key ) {
424
  $this->config->set( 'enabled', 'yes' === $value );
425
  $this->config->persist();
426
+
427
+ return true;
428
  }
429
+
430
+ return $ret;
431
  }
432
  }
modules/ppcp-wc-gateway/src/Gateway/class-processpaymenttrait.php CHANGED
@@ -85,7 +85,27 @@ trait ProcessPaymentTrait {
85
  'redirect' => $this->get_return_url( $wc_order ),
86
  );
87
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  } catch ( RuntimeException $error ) {
 
89
  $this->session_handler->destroy_session_data();
90
  wc_add_notice( $error->getMessage(), 'error' );
91
  return null;
85
  'redirect' => $this->get_return_url( $wc_order ),
86
  );
87
  }
88
+
89
+ if ( $order->status()->is( OrderStatus::COMPLETED ) && $order->intent() === 'AUTHORIZE' ) {
90
+ $this->order_endpoint->authorize( $order );
91
+ $wc_order->update_meta_data( PayPalGateway::CAPTURED_META_KEY, 'false' );
92
+ $wc_order->update_meta_data( PayPalGateway::ORDER_ID_META_KEY, $order->id() );
93
+ $wc_order->update_status(
94
+ 'on-hold',
95
+ __( 'Awaiting payment.', 'woocommerce-paypal-payments' )
96
+ );
97
+
98
+ $this->session_handler->destroy_session_data();
99
+ return array(
100
+ 'result' => 'success',
101
+ 'redirect' => $this->get_return_url( $wc_order ),
102
+ );
103
+ }
104
+
105
+ $this->logger->warning( "Could neither capture nor authorize order {$order->id()} using a saved credit card:" . 'Status: ' . $order->status()->name() . ' Intent: ' . $order->intent() );
106
+
107
  } catch ( RuntimeException $error ) {
108
+ $this->logger->error( $error->getMessage() );
109
  $this->session_handler->destroy_session_data();
110
  wc_add_notice( $error->getMessage(), 'error' );
111
  return null;
modules/ppcp-wc-gateway/src/Notice/class-dccwithoutpaypaladminnotice.php ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Creates the admin message about the DCC gateway being enabled without the PayPal gateway.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\WcGateway\Notice
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\WcGateway\Notice;
11
+
12
+ use WooCommerce\PayPalCommerce\AdminNotices\Entity\Message;
13
+ use WooCommerce\PayPalCommerce\Onboarding\State;
14
+ use Psr\Container\ContainerInterface;
15
+
16
+ /**
17
+ * Creates the admin message about the DCC gateway being enabled without the PayPal gateway.
18
+ */
19
+ class DccWithoutPayPalAdminNotice {
20
+
21
+ /**
22
+ * The state.
23
+ *
24
+ * @var State
25
+ */
26
+ private $state;
27
+
28
+ /**
29
+ * The settings.
30
+ *
31
+ * @var ContainerInterface
32
+ */
33
+ private $settings;
34
+
35
+ /**
36
+ * Whether the current page is the WC payment page.
37
+ *
38
+ * @var bool
39
+ */
40
+ private $is_payments_page;
41
+
42
+ /**
43
+ * Whether the current page is the PPCP settings page.
44
+ *
45
+ * @var bool
46
+ */
47
+ private $is_ppcp_settings_page;
48
+
49
+ /**
50
+ * ConnectAdminNotice constructor.
51
+ *
52
+ * @param State $state The state.
53
+ * @param ContainerInterface $settings The settings.
54
+ * @param bool $is_payments_page Whether the current page is the WC payment page.
55
+ * @param bool $is_ppcp_settings_page Whether the current page is the PPCP settings page.
56
+ */
57
+ public function __construct(
58
+ State $state,
59
+ ContainerInterface $settings,
60
+ bool $is_payments_page,
61
+ bool $is_ppcp_settings_page
62
+ ) {
63
+ $this->state = $state;
64
+ $this->settings = $settings;
65
+ $this->is_payments_page = $is_payments_page;
66
+ $this->is_ppcp_settings_page = $is_ppcp_settings_page;
67
+ }
68
+
69
+ /**
70
+ * Returns the message.
71
+ *
72
+ * @return Message|null
73
+ */
74
+ public function message(): ?Message {
75
+ if ( ! $this->should_display() ) {
76
+ return null;
77
+ }
78
+
79
+ $message = sprintf(
80
+ /* translators: %1$s the gateway name. */
81
+ __(
82
+ 'PayPal Card Processing cannot be used without the PayPal gateway. <a href="%1$s">Enable the PayPal Gateway</a>.',
83
+ 'woocommerce-paypal-payments'
84
+ ),
85
+ admin_url( 'admin.php?page=wc-settings&tab=checkout&section=ppcp-gateway' )
86
+ );
87
+ return new Message( $message, 'warning' );
88
+ }
89
+
90
+ /**
91
+ * Whether the message should be displayed.
92
+ *
93
+ * @return bool
94
+ */
95
+ protected function should_display(): bool {
96
+ return State::STATE_ONBOARDED === $this->state->current_state()
97
+ && ( $this->is_payments_page || $this->is_ppcp_settings_page )
98
+ && ( $this->settings->has( 'dcc_enabled' ) && $this->settings->get( 'dcc_enabled' ) )
99
+ && ( ! $this->settings->has( 'enabled' ) || ! $this->settings->get( 'enabled' ) );
100
+ }
101
+ }
modules/ppcp-wc-gateway/src/Processor/class-orderprocessor.php CHANGED
@@ -16,7 +16,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
16
  use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory;
17
  use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure;
18
  use WooCommerce\PayPalCommerce\Session\SessionHandler;
19
- use WooCommerce\PayPalCommerce\Subscription\Repository\PaymentTokenRepository;
20
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
21
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
22
 
16
  use WooCommerce\PayPalCommerce\ApiClient\Factory\OrderFactory;
17
  use WooCommerce\PayPalCommerce\Button\Helper\ThreeDSecure;
18
  use WooCommerce\PayPalCommerce\Session\SessionHandler;
19
+ use WooCommerce\PayPalCommerce\Vaulting\PaymentTokenRepository;
20
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
21
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
22
 
modules/ppcp-wc-gateway/src/Processor/class-refundprocessor.php CHANGED
@@ -88,7 +88,7 @@ class RefundProcessor {
88
  $capture->invoice_id(),
89
  $reason,
90
  new Amount(
91
- new Money( $amount, get_woocommerce_currency() )
92
  )
93
  );
94
  return $this->payments_endpoint->refund( $refund );
88
  $capture->invoice_id(),
89
  $reason,
90
  new Amount(
91
+ new Money( $amount, $wc_order->get_currency() )
92
  )
93
  );
94
  return $this->payments_endpoint->refund( $refund );
modules/ppcp-wc-gateway/src/Settings/class-pagematchertrait.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * PageMatcherTrait.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\WcGateway\Settings
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\WcGateway\Settings;
11
+
12
+ use WooCommerce\PayPalCommerce\AdminNotices\Entity\Message;
13
+ use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies;
14
+ use WooCommerce\PayPalCommerce\Button\Helper\MessagesApply;
15
+ use WooCommerce\PayPalCommerce\Onboarding\State;
16
+ use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
17
+ use Psr\Container\ContainerInterface;
18
+ use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
19
+ use Woocommerce\PayPalCommerce\WcGateway\Helper\DccProductStatus;
20
+ use Woocommerce\PayPalCommerce\WcGateway\Helper\SettingsStatus;
21
+ use WooCommerce\PayPalCommerce\Webhooks\Status\WebhooksStatusPage;
22
+
23
+ /**
24
+ * Class PageMatcherTrait.
25
+ */
26
+ trait PageMatcherTrait {
27
+
28
+ /**
29
+ * Checks whether the field config matches the current page (can be rendered here).
30
+ *
31
+ * @param array $field_config The field config (from wcgateway.settings.fields).
32
+ * @param string $current_page_id ID of the current PPCP gateway settings page.
33
+ * @return bool
34
+ */
35
+ protected function field_matches_page( array $field_config, string $current_page_id ): bool {
36
+ $allowed_gateways = $field_config['gateway'];
37
+ if ( ! is_array( $allowed_gateways ) ) {
38
+ $allowed_gateways = array( $allowed_gateways );
39
+ }
40
+
41
+ $gateway_page_id_map = array(
42
+ PayPalGateway::ID => 'paypal',
43
+ CreditCardGateway::ID => 'dcc', // TODO: consider using just the gateway ID for PayPal and DCC too.
44
+ WebhooksStatusPage::ID => WebhooksStatusPage::ID,
45
+ );
46
+ return array_key_exists( $current_page_id, $gateway_page_id_map )
47
+ && in_array( $gateway_page_id_map[ $current_page_id ], $allowed_gateways, true );
48
+ }
49
+ }
modules/ppcp-wc-gateway/src/Settings/class-sectionsrenderer.php CHANGED
@@ -11,6 +11,7 @@ namespace WooCommerce\PayPalCommerce\WcGateway\Settings;
11
 
12
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
13
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
 
14
 
15
  /**
16
  * Class SectionsRenderer
@@ -19,15 +20,29 @@ class SectionsRenderer {
19
 
20
  const KEY = 'ppcp-tab';
21
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  /**
23
  * Whether the sections tab should be rendered.
24
  *
25
  * @return bool
26
  */
27
  public function should_render() : bool {
28
-
29
- global $current_section;
30
- return PayPalGateway::ID === $current_section;
31
  }
32
 
33
  /**
@@ -38,11 +53,10 @@ class SectionsRenderer {
38
  return;
39
  }
40
 
41
- //phpcs:ignore WordPress.Security.NonceVerification.Recommended
42
- $current = ! isset( $_GET[ self::KEY ] ) ? PayPalGateway::ID : sanitize_text_field( wp_unslash( $_GET[ self::KEY ] ) );
43
  $sections = array(
44
- PayPalGateway::ID => __( 'PayPal Checkout', 'woocommerce-paypal-payments' ),
45
- CreditCardGateway::ID => __( 'PayPal Card Processing', 'woocommerce-paypal-payments' ),
 
46
  );
47
 
48
  echo '<ul class="subsubsub">';
@@ -51,7 +65,7 @@ class SectionsRenderer {
51
 
52
  foreach ( $sections as $id => $label ) {
53
  $url = admin_url( 'admin.php?page=wc-settings&tab=checkout&section=ppcp-gateway&' . self::KEY . '=' . $id );
54
- echo '<li><a href="' . esc_url( $url ) . '" class="' . ( $current === $id ? 'current' : '' ) . '">' . esc_html( $label ) . '</a> ' . ( end( $array_keys ) === $id ? '' : '|' ) . ' </li>';
55
  }
56
 
57
  echo '</ul><br class="clear" />';
11
 
12
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
13
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
14
+ use WooCommerce\PayPalCommerce\Webhooks\Status\WebhooksStatusPage;
15
 
16
  /**
17
  * Class SectionsRenderer
20
 
21
  const KEY = 'ppcp-tab';
22
 
23
+ /**
24
+ * ID of the current PPCP gateway settings page, or empty if it is not such page.
25
+ *
26
+ * @var string
27
+ */
28
+ protected $page_id;
29
+
30
+ /**
31
+ * SectionsRenderer constructor.
32
+ *
33
+ * @param string $page_id ID of the current PPCP gateway settings page, or empty if it is not such page.
34
+ */
35
+ public function __construct( string $page_id ) {
36
+ $this->page_id = $page_id;
37
+ }
38
+
39
  /**
40
  * Whether the sections tab should be rendered.
41
  *
42
  * @return bool
43
  */
44
  public function should_render() : bool {
45
+ return ! empty( $this->page_id );
 
 
46
  }
47
 
48
  /**
53
  return;
54
  }
55
 
 
 
56
  $sections = array(
57
+ PayPalGateway::ID => __( 'PayPal Checkout', 'woocommerce-paypal-payments' ),
58
+ CreditCardGateway::ID => __( 'PayPal Card Processing', 'woocommerce-paypal-payments' ),
59
+ WebhooksStatusPage::ID => __( 'Webhooks Status', 'woocommerce-paypal-payments' ),
60
  );
61
 
62
  echo '<ul class="subsubsub">';
65
 
66
  foreach ( $sections as $id => $label ) {
67
  $url = admin_url( 'admin.php?page=wc-settings&tab=checkout&section=ppcp-gateway&' . self::KEY . '=' . $id );
68
+ echo '<li><a href="' . esc_url( $url ) . '" class="' . ( $this->page_id === $id ? 'current' : '' ) . '">' . esc_html( $label ) . '</a> ' . ( end( $array_keys ) === $id ? '' : '|' ) . ' </li>';
69
  }
70
 
71
  echo '</ul><br class="clear" />';
modules/ppcp-wc-gateway/src/Settings/class-settingslistener.php CHANGED
@@ -23,8 +23,15 @@ use WooCommerce\PayPalCommerce\Webhooks\WebhookRegistrar;
23
  */
24
  class SettingsListener {
25
 
 
 
26
  const NONCE = 'ppcp-settings';
27
 
 
 
 
 
 
28
  /**
29
  * The Settings.
30
  *
@@ -67,6 +74,13 @@ class SettingsListener {
67
  */
68
  private $bearer;
69
 
 
 
 
 
 
 
 
70
  /**
71
  * SettingsListener constructor.
72
  *
@@ -76,6 +90,7 @@ class SettingsListener {
76
  * @param Cache $cache The Cache.
77
  * @param State $state The state.
78
  * @param Bearer $bearer The bearer.
 
79
  */
80
  public function __construct(
81
  Settings $settings,
@@ -83,7 +98,8 @@ class SettingsListener {
83
  WebhookRegistrar $webhook_registrar,
84
  Cache $cache,
85
  State $state,
86
- Bearer $bearer
 
87
  ) {
88
 
89
  $this->settings = $settings;
@@ -92,6 +108,7 @@ class SettingsListener {
92
  $this->cache = $cache;
93
  $this->state = $state;
94
  $this->bearer = $bearer;
 
95
  }
96
 
97
  /**
@@ -218,18 +235,46 @@ class SettingsListener {
218
 
219
  $settings = $this->read_active_credentials_from_settings( $settings );
220
 
221
- if ( ! isset( $_GET[ SectionsRenderer::KEY ] ) || PayPalGateway::ID === $_GET[ SectionsRenderer::KEY ] ) {
 
 
222
  $settings['enabled'] = isset( $_POST['woocommerce_ppcp-gateway_enabled'] )
223
  && 1 === absint( $_POST['woocommerce_ppcp-gateway_enabled'] );
224
- $this->maybe_register_webhooks( $settings );
 
225
  }
226
  // phpcs:enable phpcs:disable WordPress.Security.NonceVerification.Missing
227
  // phpcs:enable phpcs:disable WordPress.Security.NonceVerification.Missing
228
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
229
  foreach ( $settings as $id => $value ) {
230
  $this->settings->set( $id, $value );
231
  }
232
  $this->settings->persist();
 
 
 
 
 
 
 
 
 
 
 
233
  if ( $this->cache->has( PayPalBearer::CACHE_KEY ) ) {
234
  $this->cache->delete( PayPalBearer::CACHE_KEY );
235
  }
@@ -265,30 +310,36 @@ class SettingsListener {
265
  }
266
 
267
  /**
268
- * Depending on the settings change, we might need to register or unregister the Webhooks at PayPal.
269
- *
270
- * @param array $settings The settings.
271
  *
272
- * @throws \WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException If a setting hasn't been found.
 
273
  */
274
- private function maybe_register_webhooks( array $settings ) {
 
 
 
 
275
 
276
- if ( ! $this->settings->has( 'client_id' ) && $settings['client_id'] ) {
277
- $this->settings->set( 'products_dcc_enabled', null );
278
- $this->webhook_registrar->register();
 
 
279
  }
280
- if ( $this->settings->has( 'client_id' ) && $this->settings->get( 'client_id' ) ) {
281
- $current_secret = $this->settings->has( 'client_secret' ) ?
282
- $this->settings->get( 'client_secret' ) : '';
 
 
283
  if (
284
- $settings['client_id'] !== $this->settings->get( 'client_id' )
285
- || $settings['client_secret'] !== $current_secret
286
  ) {
287
- $this->settings->set( 'products_dcc_enabled', null );
288
- $this->webhook_registrar->unregister();
289
- $this->webhook_registrar->register();
290
  }
291
  }
 
292
  }
293
 
294
  /**
@@ -311,20 +362,7 @@ class SettingsListener {
311
  if ( ! in_array( $this->state->current_state(), $config['screens'], true ) ) {
312
  continue;
313
  }
314
- if (
315
- 'dcc' === $config['gateway']
316
- && (
317
- ! isset( $_GET[ SectionsRenderer::KEY ] )
318
- || sanitize_text_field( wp_unslash( $_GET[ SectionsRenderer::KEY ] ) ) !== CreditCardGateway::ID
319
- )
320
- ) {
321
- continue;
322
- }
323
- if (
324
- 'paypal' === $config['gateway']
325
- && isset( $_GET[ SectionsRenderer::KEY ] )
326
- && sanitize_text_field( wp_unslash( $_GET[ SectionsRenderer::KEY ] ) ) !== PayPalGateway::ID
327
- ) {
328
  continue;
329
  }
330
  switch ( $config['type'] ) {
@@ -406,14 +444,7 @@ class SettingsListener {
406
  * phpcs:disable WordPress.Security.NonceVerification.Missing
407
  * phpcs:disable WordPress.Security.NonceVerification.Recommended
408
  */
409
- if (
410
- ! isset( $_REQUEST['section'] )
411
- || ! in_array(
412
- sanitize_text_field( wp_unslash( $_REQUEST['section'] ) ),
413
- array( 'ppcp-gateway', 'ppcp-credit-card-gateway' ),
414
- true
415
- )
416
- ) {
417
  return false;
418
  }
419
 
23
  */
24
  class SettingsListener {
25
 
26
+ use PageMatcherTrait;
27
+
28
  const NONCE = 'ppcp-settings';
29
 
30
+ private const CREDENTIALS_ADDED = 'credentials_added';
31
+ private const CREDENTIALS_REMOVED = 'credentials_removed';
32
+ private const CREDENTIALS_CHANGED = 'credentials_changed';
33
+ private const CREDENTIALS_UNCHANGED = 'credentials_unchanged';
34
+
35
  /**
36
  * The Settings.
37
  *
74
  */
75
  private $bearer;
76
 
77
+ /**
78
+ * ID of the current PPCP gateway settings page, or empty if it is not such page.
79
+ *
80
+ * @var string
81
+ */
82
+ protected $page_id;
83
+
84
  /**
85
  * SettingsListener constructor.
86
  *
90
  * @param Cache $cache The Cache.
91
  * @param State $state The state.
92
  * @param Bearer $bearer The bearer.
93
+ * @param string $page_id ID of the current PPCP gateway settings page, or empty if it is not such page.
94
  */
95
  public function __construct(
96
  Settings $settings,
98
  WebhookRegistrar $webhook_registrar,
99
  Cache $cache,
100
  State $state,
101
+ Bearer $bearer,
102
+ string $page_id
103
  ) {
104
 
105
  $this->settings = $settings;
108
  $this->cache = $cache;
109
  $this->state = $state;
110
  $this->bearer = $bearer;
111
+ $this->page_id = $page_id;
112
  }
113
 
114
  /**
235
 
236
  $settings = $this->read_active_credentials_from_settings( $settings );
237
 
238
+ $credentials_change_status = null; // Cannot detect on Card Processing page.
239
+
240
+ if ( PayPalGateway::ID === $this->page_id ) {
241
  $settings['enabled'] = isset( $_POST['woocommerce_ppcp-gateway_enabled'] )
242
  && 1 === absint( $_POST['woocommerce_ppcp-gateway_enabled'] );
243
+
244
+ $credentials_change_status = $this->determine_credentials_change_status( $settings );
245
  }
246
  // phpcs:enable phpcs:disable WordPress.Security.NonceVerification.Missing
247
  // phpcs:enable phpcs:disable WordPress.Security.NonceVerification.Missing
248
 
249
+ if ( $credentials_change_status ) {
250
+ if ( self::CREDENTIALS_UNCHANGED !== $credentials_change_status ) {
251
+ $this->settings->set( 'products_dcc_enabled', null );
252
+ }
253
+
254
+ if ( in_array(
255
+ $credentials_change_status,
256
+ array( self::CREDENTIALS_REMOVED, self::CREDENTIALS_CHANGED ),
257
+ true
258
+ ) ) {
259
+ $this->webhook_registrar->unregister();
260
+ }
261
+ }
262
+
263
  foreach ( $settings as $id => $value ) {
264
  $this->settings->set( $id, $value );
265
  }
266
  $this->settings->persist();
267
+
268
+ if ( $credentials_change_status ) {
269
+ if ( in_array(
270
+ $credentials_change_status,
271
+ array( self::CREDENTIALS_ADDED, self::CREDENTIALS_CHANGED ),
272
+ true
273
+ ) ) {
274
+ $this->webhook_registrar->register();
275
+ }
276
+ }
277
+
278
  if ( $this->cache->has( PayPalBearer::CACHE_KEY ) ) {
279
  $this->cache->delete( PayPalBearer::CACHE_KEY );
280
  }
310
  }
311
 
312
  /**
313
+ * Checks whether on the credentials changed.
 
 
314
  *
315
+ * @param array $new_settings New settings.
316
+ * @return string One of the CREDENTIALS_ constants.
317
  */
318
+ private function determine_credentials_change_status( array $new_settings ): string {
319
+ $current_id = $this->settings->has( 'client_id' ) ? $this->settings->get( 'client_id' ) : '';
320
+ $current_secret = $this->settings->has( 'client_secret' ) ? $this->settings->get( 'client_secret' ) : '';
321
+ $new_id = $new_settings['client_id'] ?? '';
322
+ $new_secret = $new_settings['client_secret'] ?? '';
323
 
324
+ $had_credentials = $current_id && $current_secret;
325
+ $submitted_credentials = $new_id && $new_secret;
326
+
327
+ if ( ! $had_credentials && $submitted_credentials ) {
328
+ return self::CREDENTIALS_ADDED;
329
  }
330
+ if ( $had_credentials ) {
331
+ if ( ! $submitted_credentials ) {
332
+ return self::CREDENTIALS_REMOVED;
333
+ }
334
+
335
  if (
336
+ $current_id !== $new_id
337
+ || $current_secret !== $new_secret
338
  ) {
339
+ return self::CREDENTIALS_CHANGED;
 
 
340
  }
341
  }
342
+ return self::CREDENTIALS_UNCHANGED;
343
  }
344
 
345
  /**
362
  if ( ! in_array( $this->state->current_state(), $config['screens'], true ) ) {
363
  continue;
364
  }
365
+ if ( ! $this->field_matches_page( $config, $this->page_id ) ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
366
  continue;
367
  }
368
  switch ( $config['type'] ) {
444
  * phpcs:disable WordPress.Security.NonceVerification.Missing
445
  * phpcs:disable WordPress.Security.NonceVerification.Recommended
446
  */
447
+ if ( empty( $this->page_id ) ) {
 
 
 
 
 
 
 
448
  return false;
449
  }
450
 
modules/ppcp-wc-gateway/src/Settings/class-settingsrenderer.php CHANGED
@@ -15,6 +15,7 @@ use WooCommerce\PayPalCommerce\Button\Helper\MessagesApply;
15
  use WooCommerce\PayPalCommerce\Onboarding\State;
16
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
17
  use Psr\Container\ContainerInterface;
 
18
  use Woocommerce\PayPalCommerce\WcGateway\Helper\DccProductStatus;
19
  use Woocommerce\PayPalCommerce\WcGateway\Helper\SettingsStatus;
20
 
@@ -23,6 +24,8 @@ use Woocommerce\PayPalCommerce\WcGateway\Helper\SettingsStatus;
23
  */
24
  class SettingsRenderer {
25
 
 
 
26
  /**
27
  * The Settings status helper.
28
  *
@@ -72,6 +75,13 @@ class SettingsRenderer {
72
  */
73
  private $dcc_product_status;
74
 
 
 
 
 
 
 
 
75
  /**
76
  * SettingsRenderer constructor.
77
  *
@@ -82,6 +92,7 @@ class SettingsRenderer {
82
  * @param MessagesApply $messages_apply Whether messages can be shown.
83
  * @param DccProductStatus $dcc_product_status The product status.
84
  * @param SettingsStatus $settings_status The Settings status helper.
 
85
  */
86
  public function __construct(
87
  ContainerInterface $settings,
@@ -90,7 +101,8 @@ class SettingsRenderer {
90
  DccApplies $dcc_applies,
91
  MessagesApply $messages_apply,
92
  DccProductStatus $dcc_product_status,
93
- SettingsStatus $settings_status
 
94
  ) {
95
 
96
  $this->settings = $settings;
@@ -100,6 +112,7 @@ class SettingsRenderer {
100
  $this->messages_apply = $messages_apply;
101
  $this->dcc_product_status = $dcc_product_status;
102
  $this->settings_status = $settings_status;
 
103
  }
104
 
105
  /**
@@ -166,21 +179,7 @@ class SettingsRenderer {
166
  * @return bool Whether is PayPal checkout screen or not.
167
  */
168
  private function is_paypal_checkout_screen(): bool {
169
- $current_screen = get_current_screen();
170
- //phpcs:disable WordPress.Security.NonceVerification.Recommended
171
- //phpcs:disable WordPress.Security.NonceVerification.Missing
172
- if ( isset( $current_screen->id ) && 'woocommerce_page_wc-settings' === $current_screen->id
173
- && isset( $_GET['section'] ) && 'ppcp-gateway' === $_GET['section'] ) {
174
-
175
- if ( isset( $_GET['ppcp-tab'] ) && 'ppcp-gateway' !== $_GET['ppcp-tab'] ) {
176
- return false;
177
- }
178
-
179
- return true;
180
- }
181
- //phpcs:enable
182
-
183
- return false;
184
  }
185
 
186
  /**
@@ -312,14 +311,66 @@ class SettingsRenderer {
312
  return $html;
313
  }
314
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
315
  /**
316
  * Renders the settings.
317
  */
318
  public function render() {
319
 
320
- //phpcs:disable WordPress.Security.NonceVerification.Recommended
321
- //phpcs:disable WordPress.Security.NonceVerification.Missing
322
- $is_dcc = isset( $_GET[ SectionsRenderer::KEY ] ) && CreditCardGateway::ID === sanitize_text_field( wp_unslash( $_GET[ SectionsRenderer::KEY ] ) );
323
  //phpcs:enable WordPress.Security.NonceVerification.Recommended
324
  //phpcs:enable WordPress.Security.NonceVerification.Missing
325
  $nonce = wp_create_nonce( SettingsListener::NONCE );
@@ -330,10 +381,7 @@ class SettingsRenderer {
330
  if ( ! in_array( $this->state->current_state(), $config['screens'], true ) ) {
331
  continue;
332
  }
333
- if ( $is_dcc && ! in_array( $config['gateway'], array( 'all', 'dcc' ), true ) ) {
334
- continue;
335
- }
336
- if ( ! $is_dcc && ! in_array( $config['gateway'], array( 'all', 'paypal' ), true ) ) {
337
  continue;
338
  }
339
  if (
@@ -354,7 +402,7 @@ class SettingsRenderer {
354
  ) {
355
  continue;
356
  }
357
- $value = $this->settings->has( $field ) ? $this->settings->get( $field ) : null;
358
  $key = 'ppcp[' . $field . ']';
359
  $id = 'ppcp-' . $field;
360
  $config['id'] = $id;
@@ -399,8 +447,6 @@ class SettingsRenderer {
399
  if ( $this->dcc_applies->for_country_currency() ) {
400
  if ( State::STATE_ONBOARDED > $this->state->current_state() ) {
401
  $this->render_dcc_onboarding_info();
402
- } elseif ( State::STATE_ONBOARDED === $this->state->current_state() && $this->dcc_product_status->dcc_is_active() ) {
403
- $this->render_3d_secure_info();
404
  } elseif ( ! $this->dcc_product_status->dcc_is_active() ) {
405
  $this->render_dcc_not_active_yet();
406
  }
@@ -450,45 +496,6 @@ class SettingsRenderer {
450
  <?php
451
  }
452
 
453
- /**
454
- * Renders the 3d secure info text.
455
- */
456
- private function render_3d_secure_info() {
457
- ?>
458
- <tr>
459
- <th><?php esc_html_e( '3D Secure', 'woocommerce-paypal-payments' ); ?></th>
460
- <td>
461
- <p>
462
- <?php
463
- /**
464
- * We still need to provide a docs link.
465
- *
466
- * @todo: Provide link to documentation.
467
- */
468
- echo wp_kses_post(
469
- sprintf(
470
- // translators: %1$s and %2$s is a link tag.
471
- __(
472
- '3D Secure benefits cardholders and merchants by providing
473
- an additional layer of verification using Verified by Visa,
474
- MasterCard SecureCode and American Express SafeKey.
475
- %1$sLearn more about 3D Secure.%2$s',
476
- 'woocommerce-paypal-payments'
477
- ),
478
- '<a
479
- rel="noreferrer noopener"
480
- href="https://woocommerce.com/posts/introducing-strong-customer-authentication-sca/"
481
- >',
482
- '</a>'
483
- )
484
- );
485
- ?>
486
- </p>
487
- </td>
488
- </tr>
489
- <?php
490
- }
491
-
492
  /**
493
  * Renders the DCC onboarding info.
494
  */
@@ -547,8 +554,8 @@ class SettingsRenderer {
547
  return false;
548
  }
549
 
550
- return $this->is_paypal_checkout_screen() && $this->paypal_vaulting_is_enabled()
551
- || $this->is_paypal_checkout_screen() && $this->settings_status->pay_later_messaging_is_enabled();
552
  }
553
  }
554
 
15
  use WooCommerce\PayPalCommerce\Onboarding\State;
16
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
17
  use Psr\Container\ContainerInterface;
18
+ use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
19
  use Woocommerce\PayPalCommerce\WcGateway\Helper\DccProductStatus;
20
  use Woocommerce\PayPalCommerce\WcGateway\Helper\SettingsStatus;
21
 
24
  */
25
  class SettingsRenderer {
26
 
27
+ use PageMatcherTrait;
28
+
29
  /**
30
  * The Settings status helper.
31
  *
75
  */
76
  private $dcc_product_status;
77
 
78
+ /**
79
+ * ID of the current PPCP gateway settings page, or empty if it is not such page.
80
+ *
81
+ * @var string
82
+ */
83
+ protected $page_id;
84
+
85
  /**
86
  * SettingsRenderer constructor.
87
  *
92
  * @param MessagesApply $messages_apply Whether messages can be shown.
93
  * @param DccProductStatus $dcc_product_status The product status.
94
  * @param SettingsStatus $settings_status The Settings status helper.
95
+ * @param string $page_id ID of the current PPCP gateway settings page, or empty if it is not such page.
96
  */
97
  public function __construct(
98
  ContainerInterface $settings,
101
  DccApplies $dcc_applies,
102
  MessagesApply $messages_apply,
103
  DccProductStatus $dcc_product_status,
104
+ SettingsStatus $settings_status,
105
+ string $page_id
106
  ) {
107
 
108
  $this->settings = $settings;
112
  $this->messages_apply = $messages_apply;
113
  $this->dcc_product_status = $dcc_product_status;
114
  $this->settings_status = $settings_status;
115
+ $this->page_id = $page_id;
116
  }
117
 
118
  /**
179
  * @return bool Whether is PayPal checkout screen or not.
180
  */
181
  private function is_paypal_checkout_screen(): bool {
182
+ return PayPalGateway::ID === $this->page_id;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  }
184
 
185
  /**
311
  return $html;
312
  }
313
 
314
+ /**
315
+ * Renders the table row.
316
+ *
317
+ * @param array $data Values of the row cells.
318
+ * @param string $tag HTML tag ('td', 'th').
319
+ * @return string
320
+ */
321
+ public function render_table_row( array $data, string $tag = 'td' ): string {
322
+ $cells = array_map(
323
+ function ( $value ) use ( $tag ): string {
324
+ return "<$tag>" . (string) $value . "</$tag>";
325
+ },
326
+ $data
327
+ );
328
+ return '<tr>' . implode( $cells ) . '</tr>';
329
+ }
330
+
331
+ /**
332
+ * Renders the table field.
333
+ *
334
+ * @param string $field The current field HTML.
335
+ * @param string $key The key.
336
+ * @param array $config The configuration of the field.
337
+ * @param array $value The current value.
338
+ *
339
+ * @return string HTML.
340
+ */
341
+ public function render_table( $field, $key, $config, $value ): string {
342
+ if ( 'ppcp-table' !== $config['type'] ) {
343
+ return $field;
344
+ }
345
+
346
+ $data = $value['data'];
347
+ if ( empty( $data ) ) {
348
+ $empty_placeholder = $value['empty_placeholder'] ?? ( $config['empty_placeholder'] ?? null );
349
+ if ( $empty_placeholder ) {
350
+ return $empty_placeholder;
351
+ }
352
+ }
353
+
354
+ $header_row_html = $this->render_table_row( $value['headers'], 'th' );
355
+ $data_rows_html = implode(
356
+ array_map(
357
+ array( $this, 'render_table_row' ),
358
+ $data
359
+ )
360
+ );
361
+
362
+ return "<table>
363
+ $header_row_html
364
+ $data_rows_html
365
+ </table>";
366
+ }
367
+
368
  /**
369
  * Renders the settings.
370
  */
371
  public function render() {
372
 
373
+ $is_dcc = CreditCardGateway::ID === $this->page_id;
 
 
374
  //phpcs:enable WordPress.Security.NonceVerification.Recommended
375
  //phpcs:enable WordPress.Security.NonceVerification.Missing
376
  $nonce = wp_create_nonce( SettingsListener::NONCE );
381
  if ( ! in_array( $this->state->current_state(), $config['screens'], true ) ) {
382
  continue;
383
  }
384
+ if ( ! $this->field_matches_page( $config, $this->page_id ) ) {
 
 
 
385
  continue;
386
  }
387
  if (
402
  ) {
403
  continue;
404
  }
405
+ $value = $this->settings->has( $field ) ? $this->settings->get( $field ) : ( isset( $config['value'] ) ? $config['value']() : null );
406
  $key = 'ppcp[' . $field . ']';
407
  $id = 'ppcp-' . $field;
408
  $config['id'] = $id;
447
  if ( $this->dcc_applies->for_country_currency() ) {
448
  if ( State::STATE_ONBOARDED > $this->state->current_state() ) {
449
  $this->render_dcc_onboarding_info();
 
 
450
  } elseif ( ! $this->dcc_product_status->dcc_is_active() ) {
451
  $this->render_dcc_not_active_yet();
452
  }
496
  <?php
497
  }
498
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
499
  /**
500
  * Renders the DCC onboarding info.
501
  */
554
  return false;
555
  }
556
 
557
+ return $this->is_paypal_checkout_screen()
558
+ && ( $this->paypal_vaulting_is_enabled() || $this->settings_status->pay_later_messaging_is_enabled() );
559
  }
560
  }
561
 
modules/ppcp-wc-gateway/src/class-wcgatewaymodule.php CHANGED
@@ -24,6 +24,7 @@ use WooCommerce\PayPalCommerce\WcGateway\Endpoint\ReturnUrlEndpoint;
24
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
25
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
26
  use WooCommerce\PayPalCommerce\WcGateway\Notice\ConnectAdminNotice;
 
27
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SectionsRenderer;
28
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
29
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsListener;
@@ -58,7 +59,6 @@ class WcGatewayModule implements ModuleInterface {
58
  $this->register_order_functionality( $container );
59
  $this->register_columns( $container );
60
  $this->register_checkout_paypal_address_preset( $container );
61
- $this->ajax_gateway_enabler( $container );
62
 
63
  add_action(
64
  'woocommerce_sections_checkout',
@@ -86,15 +86,19 @@ class WcGatewayModule implements ModuleInterface {
86
  Repository::NOTICES_FILTER,
87
  static function ( $notices ) use ( $container ): array {
88
  $notice = $container->get( 'wcgateway.notice.connect' );
89
- /**
90
- * The Connect Admin Notice object.
91
- *
92
- * @var ConnectAdminNotice $notice
93
- */
94
  $connect_message = $notice->connect_message();
95
  if ( $connect_message ) {
96
  $notices[] = $connect_message;
97
  }
 
 
 
 
 
 
 
 
98
  $authorize_order_action = $container->get( 'wcgateway.notice.authorize-order-action' );
99
  $authorized_message = $authorize_order_action->message();
100
  if ( $authorized_message ) {
@@ -102,11 +106,7 @@ class WcGatewayModule implements ModuleInterface {
102
  }
103
 
104
  $settings_renderer = $container->get( 'wcgateway.settings.render' );
105
- /**
106
- * The settings renderer.
107
- *
108
- * @var SettingsRenderer $settings_renderer
109
- */
110
  $messages = $settings_renderer->messages();
111
  $notices = array_merge( $notices, $messages );
112
 
@@ -149,50 +149,6 @@ class WcGatewayModule implements ModuleInterface {
149
  );
150
  }
151
 
152
- /**
153
- * Adds the functionality to listen to the ajax enable gateway switch.
154
- *
155
- * @param ContainerInterface $container The container.
156
- */
157
- private function ajax_gateway_enabler( ContainerInterface $container ) {
158
- add_action(
159
- 'wp_ajax_woocommerce_toggle_gateway_enabled',
160
- static function () use ( $container ) {
161
- if (
162
- ! current_user_can( 'manage_woocommerce' )
163
- || ! check_ajax_referer(
164
- 'woocommerce-toggle-payment-gateway-enabled',
165
- 'security'
166
- )
167
- || ! isset( $_POST['gateway_id'] )
168
- ) {
169
- return;
170
- }
171
-
172
- /**
173
- * The settings.
174
- *
175
- * @var Settings $settings
176
- */
177
- $settings = $container->get( 'wcgateway.settings' );
178
- $key = PayPalGateway::ID === $_POST['gateway_id'] ? 'enabled' : '';
179
- if ( CreditCardGateway::ID === $_POST['gateway_id'] ) {
180
- $key = 'dcc_enabled';
181
- }
182
- if ( ! $key ) {
183
- return;
184
- }
185
- $enabled = $settings->has( $key ) ? $settings->get( $key ) : false;
186
- if ( ! $enabled ) {
187
- return;
188
- }
189
- $settings->set( $key, false );
190
- $settings->persist();
191
- },
192
- 9
193
- );
194
- }
195
-
196
  /**
197
  * Registers the payment gateways.
198
  *
@@ -206,16 +162,12 @@ class WcGatewayModule implements ModuleInterface {
206
  $methods[] = $container->get( 'wcgateway.paypal-gateway' );
207
  $dcc_applies = $container->get( 'api.helpers.dccapplies' );
208
 
209
- $screen = ! function_exists( 'get_current_screen' ) ? (object) array( 'id' => 'front' ) : get_current_screen();
210
- if ( ! $screen ) {
211
- $screen = (object) array( 'id' => 'front' );
212
- }
213
  /**
214
  * The DCC Applies object.
215
  *
216
  * @var DccApplies $dcc_applies
217
  */
218
- if ( 'woocommerce_page_wc-settings' !== $screen->id && $dcc_applies->for_country_currency() ) {
219
  $methods[] = $container->get( 'wcgateway.credit-card-gateway' );
220
  }
221
  return (array) $methods;
@@ -262,6 +214,7 @@ class WcGatewayModule implements ModuleInterface {
262
  $field = $renderer->render_password( $field, $key, $args, $value );
263
  $field = $renderer->render_text_input( $field, $key, $args, $value );
264
  $field = $renderer->render_heading( $field, $key, $args, $value );
 
265
  return $field;
266
  },
267
  10,
24
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
25
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
26
  use WooCommerce\PayPalCommerce\WcGateway\Notice\ConnectAdminNotice;
27
+ use WooCommerce\PayPalCommerce\WcGateway\Notice\DccWithoutPayPalAdminNotice;
28
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SectionsRenderer;
29
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
30
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsListener;
59
  $this->register_order_functionality( $container );
60
  $this->register_columns( $container );
61
  $this->register_checkout_paypal_address_preset( $container );
 
62
 
63
  add_action(
64
  'woocommerce_sections_checkout',
86
  Repository::NOTICES_FILTER,
87
  static function ( $notices ) use ( $container ): array {
88
  $notice = $container->get( 'wcgateway.notice.connect' );
89
+ assert( $notice instanceof ConnectAdminNotice );
 
 
 
 
90
  $connect_message = $notice->connect_message();
91
  if ( $connect_message ) {
92
  $notices[] = $connect_message;
93
  }
94
+
95
+ $dcc_without_paypal_notice = $container->get( 'wcgateway.notice.dcc-without-paypal' );
96
+ assert( $dcc_without_paypal_notice instanceof DccWithoutPayPalAdminNotice );
97
+ $dcc_without_paypal_message = $dcc_without_paypal_notice->message();
98
+ if ( $dcc_without_paypal_message ) {
99
+ $notices[] = $dcc_without_paypal_message;
100
+ }
101
+
102
  $authorize_order_action = $container->get( 'wcgateway.notice.authorize-order-action' );
103
  $authorized_message = $authorize_order_action->message();
104
  if ( $authorized_message ) {
106
  }
107
 
108
  $settings_renderer = $container->get( 'wcgateway.settings.render' );
109
+ assert( $settings_renderer instanceof SettingsRenderer );
 
 
 
 
110
  $messages = $settings_renderer->messages();
111
  $notices = array_merge( $notices, $messages );
112
 
149
  );
150
  }
151
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  /**
153
  * Registers the payment gateways.
154
  *
162
  $methods[] = $container->get( 'wcgateway.paypal-gateway' );
163
  $dcc_applies = $container->get( 'api.helpers.dccapplies' );
164
 
 
 
 
 
165
  /**
166
  * The DCC Applies object.
167
  *
168
  * @var DccApplies $dcc_applies
169
  */
170
+ if ( $dcc_applies->for_country_currency() ) {
171
  $methods[] = $container->get( 'wcgateway.credit-card-gateway' );
172
  }
173
  return (array) $methods;
214
  $field = $renderer->render_password( $field, $key, $args, $value );
215
  $field = $renderer->render_text_input( $field, $key, $args, $value );
216
  $field = $renderer->render_heading( $field, $key, $args, $value );
217
+ $field = $renderer->render_table( $field, $key, $args, $value );
218
  return $field;
219
  },
220
  10,
modules/ppcp-wc-gateway/webpack.config.js CHANGED
@@ -2,7 +2,7 @@ const path = require('path');
2
  const isProduction = process.env.NODE_ENV === 'production';
3
 
4
  module.exports = {
5
- devtool: 'sourcemap',
6
  mode: isProduction ? 'production' : 'development',
7
  target: 'web',
8
  entry: {
2
  const isProduction = process.env.NODE_ENV === 'production';
3
 
4
  module.exports = {
5
+ devtool: 'eval-source-map',
6
  mode: isProduction ? 'production' : 'development',
7
  target: 'web',
8
  entry: {
modules/ppcp-wc-gateway/yarn.lock CHANGED
@@ -2,97 +2,97 @@
2
  # yarn lockfile v1
3
 
4
 
5
- "@babel/code-frame@^7.12.13":
6
- version "7.12.13"
7
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658"
8
- integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==
9
  dependencies:
10
- "@babel/highlight" "^7.12.13"
11
 
12
- "@babel/compat-data@^7.13.0", "@babel/compat-data@^7.13.12", "@babel/compat-data@^7.13.8":
13
- version "7.13.12"
14
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.12.tgz#a8a5ccac19c200f9dd49624cac6e19d7be1236a1"
15
- integrity sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==
16
 
17
  "@babel/core@^7.9.0":
18
- version "7.13.13"
19
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.13.tgz#bc44c4a2be2288ec4ddf56b66fc718019c76ac29"
20
- integrity sha512-1xEs9jZAyKIouOoCmpsgk/I26PoKyvzQ2ixdRpRzfbcp1fL+ozw7TUgdDgwonbTovqRaTfRh50IXuw4QrWO0GA==
21
- dependencies:
22
- "@babel/code-frame" "^7.12.13"
23
- "@babel/generator" "^7.13.9"
24
- "@babel/helper-compilation-targets" "^7.13.13"
25
- "@babel/helper-module-transforms" "^7.13.12"
26
- "@babel/helpers" "^7.13.10"
27
- "@babel/parser" "^7.13.13"
28
- "@babel/template" "^7.12.13"
29
- "@babel/traverse" "^7.13.13"
30
- "@babel/types" "^7.13.13"
31
  convert-source-map "^1.7.0"
32
  debug "^4.1.0"
33
  gensync "^1.0.0-beta.2"
34
  json5 "^2.1.2"
35
- lodash "^4.17.19"
36
  semver "^6.3.0"
37
  source-map "^0.5.0"
38
 
39
- "@babel/generator@^7.13.9":
40
- version "7.13.9"
41
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39"
42
- integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==
43
  dependencies:
44
- "@babel/types" "^7.13.0"
45
  jsesc "^2.5.1"
46
  source-map "^0.5.0"
47
 
48
- "@babel/helper-annotate-as-pure@^7.12.13":
49
- version "7.12.13"
50
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab"
51
- integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==
52
  dependencies:
53
- "@babel/types" "^7.12.13"
54
 
55
- "@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13":
56
- version "7.12.13"
57
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc"
58
- integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==
59
  dependencies:
60
- "@babel/helper-explode-assignable-expression" "^7.12.13"
61
- "@babel/types" "^7.12.13"
62
 
63
- "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.10", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.8":
64
- version "7.13.13"
65
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz#2b2972a0926474853f41e4adbc69338f520600e5"
66
- integrity sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==
67
  dependencies:
68
- "@babel/compat-data" "^7.13.12"
69
- "@babel/helper-validator-option" "^7.12.17"
70
- browserslist "^4.14.5"
71
  semver "^6.3.0"
72
 
73
- "@babel/helper-create-class-features-plugin@^7.13.0":
74
- version "7.13.11"
75
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6"
76
- integrity sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==
77
  dependencies:
78
- "@babel/helper-function-name" "^7.12.13"
79
- "@babel/helper-member-expression-to-functions" "^7.13.0"
80
- "@babel/helper-optimise-call-expression" "^7.12.13"
81
- "@babel/helper-replace-supers" "^7.13.0"
82
- "@babel/helper-split-export-declaration" "^7.12.13"
 
83
 
84
- "@babel/helper-create-regexp-features-plugin@^7.12.13":
85
- version "7.12.17"
86
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7"
87
- integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==
88
  dependencies:
89
- "@babel/helper-annotate-as-pure" "^7.12.13"
90
  regexpu-core "^4.7.1"
91
 
92
- "@babel/helper-define-polyfill-provider@^0.1.5":
93
- version "0.1.5"
94
- resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e"
95
- integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==
96
  dependencies:
97
  "@babel/helper-compilation-targets" "^7.13.0"
98
  "@babel/helper-module-imports" "^7.12.13"
@@ -103,277 +103,295 @@
103
  resolve "^1.14.2"
104
  semver "^6.1.2"
105
 
106
- "@babel/helper-explode-assignable-expression@^7.12.13":
107
- version "7.13.0"
108
- resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f"
109
- integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==
110
- dependencies:
111
- "@babel/types" "^7.13.0"
112
-
113
- "@babel/helper-function-name@^7.12.13":
114
- version "7.12.13"
115
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a"
116
- integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==
117
- dependencies:
118
- "@babel/helper-get-function-arity" "^7.12.13"
119
- "@babel/template" "^7.12.13"
120
- "@babel/types" "^7.12.13"
121
-
122
- "@babel/helper-get-function-arity@^7.12.13":
123
- version "7.12.13"
124
- resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583"
125
- integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==
126
- dependencies:
127
- "@babel/types" "^7.12.13"
128
-
129
- "@babel/helper-hoist-variables@^7.13.0":
130
- version "7.13.0"
131
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz#5d5882e855b5c5eda91e0cadc26c6e7a2c8593d8"
132
- integrity sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==
133
- dependencies:
134
- "@babel/traverse" "^7.13.0"
135
- "@babel/types" "^7.13.0"
136
-
137
- "@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.13.12":
138
- version "7.13.12"
139
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72"
140
- integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==
141
- dependencies:
142
- "@babel/types" "^7.13.12"
143
-
144
- "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12":
145
- version "7.13.12"
146
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977"
147
- integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==
148
- dependencies:
149
- "@babel/types" "^7.13.12"
150
-
151
- "@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.13.12":
152
- version "7.13.12"
153
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz#600e58350490828d82282631a1422268e982ba96"
154
- integrity sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==
155
- dependencies:
156
- "@babel/helper-module-imports" "^7.13.12"
157
- "@babel/helper-replace-supers" "^7.13.12"
158
- "@babel/helper-simple-access" "^7.13.12"
159
- "@babel/helper-split-export-declaration" "^7.12.13"
160
- "@babel/helper-validator-identifier" "^7.12.11"
161
- "@babel/template" "^7.12.13"
162
- "@babel/traverse" "^7.13.0"
163
- "@babel/types" "^7.13.12"
164
-
165
- "@babel/helper-optimise-call-expression@^7.12.13":
166
- version "7.12.13"
167
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea"
168
- integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==
169
- dependencies:
170
- "@babel/types" "^7.12.13"
171
-
172
- "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
173
- version "7.13.0"
174
- resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af"
175
- integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==
176
-
177
- "@babel/helper-remap-async-to-generator@^7.13.0":
178
- version "7.13.0"
179
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209"
180
- integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==
181
- dependencies:
182
- "@babel/helper-annotate-as-pure" "^7.12.13"
183
- "@babel/helper-wrap-function" "^7.13.0"
184
- "@babel/types" "^7.13.0"
185
-
186
- "@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12":
187
- version "7.13.12"
188
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804"
189
- integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==
190
- dependencies:
191
- "@babel/helper-member-expression-to-functions" "^7.13.12"
192
- "@babel/helper-optimise-call-expression" "^7.12.13"
193
- "@babel/traverse" "^7.13.0"
194
- "@babel/types" "^7.13.12"
195
-
196
- "@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.13.12":
197
- version "7.13.12"
198
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6"
199
- integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==
200
- dependencies:
201
- "@babel/types" "^7.13.12"
202
-
203
- "@babel/helper-skip-transparent-expression-wrappers@^7.12.1":
204
- version "7.12.1"
205
- resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf"
206
- integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==
207
- dependencies:
208
- "@babel/types" "^7.12.1"
209
-
210
- "@babel/helper-split-export-declaration@^7.12.13":
211
- version "7.12.13"
212
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05"
213
- integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==
214
  dependencies:
215
- "@babel/types" "^7.12.13"
216
-
217
- "@babel/helper-validator-identifier@^7.12.11":
218
- version "7.12.11"
219
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed"
220
- integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
221
-
222
- "@babel/helper-validator-option@^7.12.17":
223
- version "7.12.17"
224
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831"
225
- integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==
226
-
227
- "@babel/helper-wrap-function@^7.13.0":
228
- version "7.13.0"
229
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4"
230
- integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==
231
  dependencies:
232
- "@babel/helper-function-name" "^7.12.13"
233
- "@babel/template" "^7.12.13"
234
- "@babel/traverse" "^7.13.0"
235
- "@babel/types" "^7.13.0"
236
 
237
- "@babel/helpers@^7.13.10":
238
- version "7.13.10"
239
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.10.tgz#fd8e2ba7488533cdeac45cc158e9ebca5e3c7df8"
240
- integrity sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==
241
  dependencies:
242
- "@babel/template" "^7.12.13"
243
- "@babel/traverse" "^7.13.0"
244
- "@babel/types" "^7.13.0"
 
 
 
 
 
245
 
246
- "@babel/highlight@^7.12.13":
247
- version "7.13.10"
248
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1"
249
- integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==
250
- dependencies:
251
- "@babel/helper-validator-identifier" "^7.12.11"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
252
  chalk "^2.0.0"
253
  js-tokens "^4.0.0"
254
 
255
- "@babel/parser@^7.12.13", "@babel/parser@^7.13.13":
256
- version "7.13.13"
257
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.13.tgz#42f03862f4aed50461e543270916b47dd501f0df"
258
- integrity sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==
259
 
260
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12":
261
- version "7.13.12"
262
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a"
263
- integrity sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==
264
  dependencies:
265
- "@babel/helper-plugin-utils" "^7.13.0"
266
- "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
267
- "@babel/plugin-proposal-optional-chaining" "^7.13.12"
268
 
269
- "@babel/plugin-proposal-async-generator-functions@^7.13.8":
270
- version "7.13.8"
271
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz#87aacb574b3bc4b5603f6fe41458d72a5a2ec4b1"
272
- integrity sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==
273
  dependencies:
274
- "@babel/helper-plugin-utils" "^7.13.0"
275
- "@babel/helper-remap-async-to-generator" "^7.13.0"
276
  "@babel/plugin-syntax-async-generators" "^7.8.4"
277
 
278
- "@babel/plugin-proposal-class-properties@^7.13.0":
279
- version "7.13.0"
280
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37"
281
- integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==
282
  dependencies:
283
- "@babel/helper-create-class-features-plugin" "^7.13.0"
284
- "@babel/helper-plugin-utils" "^7.13.0"
285
 
286
- "@babel/plugin-proposal-dynamic-import@^7.13.8":
287
- version "7.13.8"
288
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d"
289
- integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==
290
  dependencies:
291
- "@babel/helper-plugin-utils" "^7.13.0"
 
 
 
 
 
 
 
 
 
292
  "@babel/plugin-syntax-dynamic-import" "^7.8.3"
293
 
294
- "@babel/plugin-proposal-export-namespace-from@^7.12.13":
295
- version "7.12.13"
296
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d"
297
- integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==
298
  dependencies:
299
- "@babel/helper-plugin-utils" "^7.12.13"
300
  "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
301
 
302
- "@babel/plugin-proposal-json-strings@^7.13.8":
303
- version "7.13.8"
304
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b"
305
- integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==
306
  dependencies:
307
- "@babel/helper-plugin-utils" "^7.13.0"
308
  "@babel/plugin-syntax-json-strings" "^7.8.3"
309
 
310
- "@babel/plugin-proposal-logical-assignment-operators@^7.13.8":
311
- version "7.13.8"
312
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a"
313
- integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==
314
  dependencies:
315
- "@babel/helper-plugin-utils" "^7.13.0"
316
  "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
317
 
318
- "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8":
319
- version "7.13.8"
320
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3"
321
- integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==
322
  dependencies:
323
- "@babel/helper-plugin-utils" "^7.13.0"
324
  "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
325
 
326
- "@babel/plugin-proposal-numeric-separator@^7.12.13":
327
- version "7.12.13"
328
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db"
329
- integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==
330
  dependencies:
331
- "@babel/helper-plugin-utils" "^7.12.13"
332
  "@babel/plugin-syntax-numeric-separator" "^7.10.4"
333
 
334
- "@babel/plugin-proposal-object-rest-spread@^7.13.8":
335
- version "7.13.8"
336
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a"
337
- integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==
338
  dependencies:
339
- "@babel/compat-data" "^7.13.8"
340
- "@babel/helper-compilation-targets" "^7.13.8"
341
- "@babel/helper-plugin-utils" "^7.13.0"
342
  "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
343
- "@babel/plugin-transform-parameters" "^7.13.0"
344
 
345
- "@babel/plugin-proposal-optional-catch-binding@^7.13.8":
346
- version "7.13.8"
347
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107"
348
- integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==
349
  dependencies:
350
- "@babel/helper-plugin-utils" "^7.13.0"
351
  "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
352
 
353
- "@babel/plugin-proposal-optional-chaining@^7.13.12":
354
- version "7.13.12"
355
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866"
356
- integrity sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==
357
  dependencies:
358
- "@babel/helper-plugin-utils" "^7.13.0"
359
- "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
360
  "@babel/plugin-syntax-optional-chaining" "^7.8.3"
361
 
362
- "@babel/plugin-proposal-private-methods@^7.13.0":
363
- version "7.13.0"
364
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787"
365
- integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==
366
  dependencies:
367
- "@babel/helper-create-class-features-plugin" "^7.13.0"
368
- "@babel/helper-plugin-utils" "^7.13.0"
369
 
370
- "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
371
- version "7.12.13"
372
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba"
373
- integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==
374
  dependencies:
375
- "@babel/helper-create-regexp-features-plugin" "^7.12.13"
376
- "@babel/helper-plugin-utils" "^7.12.13"
 
 
 
 
 
 
 
 
 
 
377
 
378
  "@babel/plugin-syntax-async-generators@^7.8.4":
379
  version "7.8.4"
@@ -389,6 +407,13 @@
389
  dependencies:
390
  "@babel/helper-plugin-utils" "^7.12.13"
391
 
 
 
 
 
 
 
 
392
  "@babel/plugin-syntax-dynamic-import@^7.8.3":
393
  version "7.8.3"
394
  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
@@ -452,286 +477,296 @@
452
  dependencies:
453
  "@babel/helper-plugin-utils" "^7.8.0"
454
 
455
- "@babel/plugin-syntax-top-level-await@^7.12.13":
456
- version "7.12.13"
457
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178"
458
- integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==
459
  dependencies:
460
- "@babel/helper-plugin-utils" "^7.12.13"
461
 
462
- "@babel/plugin-transform-arrow-functions@^7.13.0":
463
- version "7.13.0"
464
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae"
465
- integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==
466
  dependencies:
467
- "@babel/helper-plugin-utils" "^7.13.0"
468
 
469
- "@babel/plugin-transform-async-to-generator@^7.13.0":
470
- version "7.13.0"
471
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f"
472
- integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==
473
  dependencies:
474
- "@babel/helper-module-imports" "^7.12.13"
475
- "@babel/helper-plugin-utils" "^7.13.0"
476
- "@babel/helper-remap-async-to-generator" "^7.13.0"
477
 
478
- "@babel/plugin-transform-block-scoped-functions@^7.12.13":
479
- version "7.12.13"
480
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4"
481
- integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==
482
  dependencies:
483
- "@babel/helper-plugin-utils" "^7.12.13"
 
 
484
 
485
- "@babel/plugin-transform-block-scoping@^7.12.13":
486
- version "7.12.13"
487
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61"
488
- integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==
489
  dependencies:
490
- "@babel/helper-plugin-utils" "^7.12.13"
491
 
492
- "@babel/plugin-transform-classes@^7.13.0":
493
- version "7.13.0"
494
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b"
495
- integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==
496
  dependencies:
497
- "@babel/helper-annotate-as-pure" "^7.12.13"
498
- "@babel/helper-function-name" "^7.12.13"
499
- "@babel/helper-optimise-call-expression" "^7.12.13"
500
- "@babel/helper-plugin-utils" "^7.13.0"
501
- "@babel/helper-replace-supers" "^7.13.0"
502
- "@babel/helper-split-export-declaration" "^7.12.13"
 
 
 
 
 
 
 
503
  globals "^11.1.0"
504
 
505
- "@babel/plugin-transform-computed-properties@^7.13.0":
506
- version "7.13.0"
507
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed"
508
- integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==
509
  dependencies:
510
- "@babel/helper-plugin-utils" "^7.13.0"
511
 
512
- "@babel/plugin-transform-destructuring@^7.13.0":
513
- version "7.13.0"
514
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz#c5dce270014d4e1ebb1d806116694c12b7028963"
515
- integrity sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==
516
  dependencies:
517
- "@babel/helper-plugin-utils" "^7.13.0"
518
 
519
- "@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4":
520
- version "7.12.13"
521
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad"
522
- integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==
523
  dependencies:
524
- "@babel/helper-create-regexp-features-plugin" "^7.12.13"
525
- "@babel/helper-plugin-utils" "^7.12.13"
526
 
527
- "@babel/plugin-transform-duplicate-keys@^7.12.13":
528
- version "7.12.13"
529
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de"
530
- integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==
531
  dependencies:
532
- "@babel/helper-plugin-utils" "^7.12.13"
533
 
534
- "@babel/plugin-transform-exponentiation-operator@^7.12.13":
535
- version "7.12.13"
536
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1"
537
- integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==
538
  dependencies:
539
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13"
540
- "@babel/helper-plugin-utils" "^7.12.13"
541
 
542
- "@babel/plugin-transform-for-of@^7.13.0":
543
- version "7.13.0"
544
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062"
545
- integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==
546
  dependencies:
547
- "@babel/helper-plugin-utils" "^7.13.0"
548
 
549
- "@babel/plugin-transform-function-name@^7.12.13":
550
- version "7.12.13"
551
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051"
552
- integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==
553
  dependencies:
554
- "@babel/helper-function-name" "^7.12.13"
555
- "@babel/helper-plugin-utils" "^7.12.13"
556
 
557
- "@babel/plugin-transform-literals@^7.12.13":
558
- version "7.12.13"
559
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9"
560
- integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==
561
  dependencies:
562
- "@babel/helper-plugin-utils" "^7.12.13"
563
 
564
- "@babel/plugin-transform-member-expression-literals@^7.12.13":
565
- version "7.12.13"
566
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40"
567
- integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==
568
  dependencies:
569
- "@babel/helper-plugin-utils" "^7.12.13"
570
 
571
- "@babel/plugin-transform-modules-amd@^7.13.0":
572
- version "7.13.0"
573
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3"
574
- integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==
575
  dependencies:
576
- "@babel/helper-module-transforms" "^7.13.0"
577
- "@babel/helper-plugin-utils" "^7.13.0"
578
  babel-plugin-dynamic-import-node "^2.3.3"
579
 
580
- "@babel/plugin-transform-modules-commonjs@^7.13.8":
581
- version "7.13.8"
582
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b"
583
- integrity sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==
584
  dependencies:
585
- "@babel/helper-module-transforms" "^7.13.0"
586
- "@babel/helper-plugin-utils" "^7.13.0"
587
- "@babel/helper-simple-access" "^7.12.13"
588
  babel-plugin-dynamic-import-node "^2.3.3"
589
 
590
- "@babel/plugin-transform-modules-systemjs@^7.13.8":
591
- version "7.13.8"
592
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3"
593
- integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==
594
  dependencies:
595
- "@babel/helper-hoist-variables" "^7.13.0"
596
- "@babel/helper-module-transforms" "^7.13.0"
597
- "@babel/helper-plugin-utils" "^7.13.0"
598
- "@babel/helper-validator-identifier" "^7.12.11"
599
  babel-plugin-dynamic-import-node "^2.3.3"
600
 
601
- "@babel/plugin-transform-modules-umd@^7.13.0":
602
- version "7.13.0"
603
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b"
604
- integrity sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==
605
  dependencies:
606
- "@babel/helper-module-transforms" "^7.13.0"
607
- "@babel/helper-plugin-utils" "^7.13.0"
608
 
609
- "@babel/plugin-transform-named-capturing-groups-regex@^7.12.13":
610
- version "7.12.13"
611
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9"
612
- integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==
613
  dependencies:
614
- "@babel/helper-create-regexp-features-plugin" "^7.12.13"
615
 
616
- "@babel/plugin-transform-new-target@^7.12.13":
617
- version "7.12.13"
618
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c"
619
- integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==
620
  dependencies:
621
- "@babel/helper-plugin-utils" "^7.12.13"
622
 
623
- "@babel/plugin-transform-object-super@^7.12.13":
624
- version "7.12.13"
625
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7"
626
- integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==
627
  dependencies:
628
- "@babel/helper-plugin-utils" "^7.12.13"
629
- "@babel/helper-replace-supers" "^7.12.13"
630
 
631
- "@babel/plugin-transform-parameters@^7.13.0":
632
- version "7.13.0"
633
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007"
634
- integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==
635
  dependencies:
636
- "@babel/helper-plugin-utils" "^7.13.0"
637
 
638
- "@babel/plugin-transform-property-literals@^7.12.13":
639
- version "7.12.13"
640
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81"
641
- integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==
642
  dependencies:
643
- "@babel/helper-plugin-utils" "^7.12.13"
644
 
645
- "@babel/plugin-transform-regenerator@^7.12.13":
646
- version "7.12.13"
647
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5"
648
- integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==
649
  dependencies:
650
  regenerator-transform "^0.14.2"
651
 
652
- "@babel/plugin-transform-reserved-words@^7.12.13":
653
- version "7.12.13"
654
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695"
655
- integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==
656
  dependencies:
657
- "@babel/helper-plugin-utils" "^7.12.13"
658
 
659
- "@babel/plugin-transform-shorthand-properties@^7.12.13":
660
- version "7.12.13"
661
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad"
662
- integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==
663
  dependencies:
664
- "@babel/helper-plugin-utils" "^7.12.13"
665
 
666
- "@babel/plugin-transform-spread@^7.13.0":
667
- version "7.13.0"
668
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd"
669
- integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==
670
  dependencies:
671
- "@babel/helper-plugin-utils" "^7.13.0"
672
- "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1"
673
 
674
- "@babel/plugin-transform-sticky-regex@^7.12.13":
675
- version "7.12.13"
676
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f"
677
- integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==
678
  dependencies:
679
- "@babel/helper-plugin-utils" "^7.12.13"
680
 
681
- "@babel/plugin-transform-template-literals@^7.13.0":
682
- version "7.13.0"
683
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d"
684
- integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==
685
  dependencies:
686
- "@babel/helper-plugin-utils" "^7.13.0"
687
 
688
- "@babel/plugin-transform-typeof-symbol@^7.12.13":
689
- version "7.12.13"
690
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f"
691
- integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==
692
  dependencies:
693
- "@babel/helper-plugin-utils" "^7.12.13"
694
 
695
- "@babel/plugin-transform-unicode-escapes@^7.12.13":
696
- version "7.12.13"
697
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74"
698
- integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==
699
  dependencies:
700
- "@babel/helper-plugin-utils" "^7.12.13"
701
 
702
- "@babel/plugin-transform-unicode-regex@^7.12.13":
703
- version "7.12.13"
704
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac"
705
- integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==
706
  dependencies:
707
- "@babel/helper-create-regexp-features-plugin" "^7.12.13"
708
- "@babel/helper-plugin-utils" "^7.12.13"
709
 
710
  "@babel/preset-env@^7.9.5":
711
- version "7.13.12"
712
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.12.tgz#6dff470478290582ac282fb77780eadf32480237"
713
- integrity sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA==
714
- dependencies:
715
- "@babel/compat-data" "^7.13.12"
716
- "@babel/helper-compilation-targets" "^7.13.10"
717
- "@babel/helper-plugin-utils" "^7.13.0"
718
- "@babel/helper-validator-option" "^7.12.17"
719
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12"
720
- "@babel/plugin-proposal-async-generator-functions" "^7.13.8"
721
- "@babel/plugin-proposal-class-properties" "^7.13.0"
722
- "@babel/plugin-proposal-dynamic-import" "^7.13.8"
723
- "@babel/plugin-proposal-export-namespace-from" "^7.12.13"
724
- "@babel/plugin-proposal-json-strings" "^7.13.8"
725
- "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8"
726
- "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8"
727
- "@babel/plugin-proposal-numeric-separator" "^7.12.13"
728
- "@babel/plugin-proposal-object-rest-spread" "^7.13.8"
729
- "@babel/plugin-proposal-optional-catch-binding" "^7.13.8"
730
- "@babel/plugin-proposal-optional-chaining" "^7.13.12"
731
- "@babel/plugin-proposal-private-methods" "^7.13.0"
732
- "@babel/plugin-proposal-unicode-property-regex" "^7.12.13"
 
 
733
  "@babel/plugin-syntax-async-generators" "^7.8.4"
734
  "@babel/plugin-syntax-class-properties" "^7.12.13"
 
735
  "@babel/plugin-syntax-dynamic-import" "^7.8.3"
736
  "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
737
  "@babel/plugin-syntax-json-strings" "^7.8.3"
@@ -741,45 +776,46 @@
741
  "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
742
  "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
743
  "@babel/plugin-syntax-optional-chaining" "^7.8.3"
744
- "@babel/plugin-syntax-top-level-await" "^7.12.13"
745
- "@babel/plugin-transform-arrow-functions" "^7.13.0"
746
- "@babel/plugin-transform-async-to-generator" "^7.13.0"
747
- "@babel/plugin-transform-block-scoped-functions" "^7.12.13"
748
- "@babel/plugin-transform-block-scoping" "^7.12.13"
749
- "@babel/plugin-transform-classes" "^7.13.0"
750
- "@babel/plugin-transform-computed-properties" "^7.13.0"
751
- "@babel/plugin-transform-destructuring" "^7.13.0"
752
- "@babel/plugin-transform-dotall-regex" "^7.12.13"
753
- "@babel/plugin-transform-duplicate-keys" "^7.12.13"
754
- "@babel/plugin-transform-exponentiation-operator" "^7.12.13"
755
- "@babel/plugin-transform-for-of" "^7.13.0"
756
- "@babel/plugin-transform-function-name" "^7.12.13"
757
- "@babel/plugin-transform-literals" "^7.12.13"
758
- "@babel/plugin-transform-member-expression-literals" "^7.12.13"
759
- "@babel/plugin-transform-modules-amd" "^7.13.0"
760
- "@babel/plugin-transform-modules-commonjs" "^7.13.8"
761
- "@babel/plugin-transform-modules-systemjs" "^7.13.8"
762
- "@babel/plugin-transform-modules-umd" "^7.13.0"
763
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13"
764
- "@babel/plugin-transform-new-target" "^7.12.13"
765
- "@babel/plugin-transform-object-super" "^7.12.13"
766
- "@babel/plugin-transform-parameters" "^7.13.0"
767
- "@babel/plugin-transform-property-literals" "^7.12.13"
768
- "@babel/plugin-transform-regenerator" "^7.12.13"
769
- "@babel/plugin-transform-reserved-words" "^7.12.13"
770
- "@babel/plugin-transform-shorthand-properties" "^7.12.13"
771
- "@babel/plugin-transform-spread" "^7.13.0"
772
- "@babel/plugin-transform-sticky-regex" "^7.12.13"
773
- "@babel/plugin-transform-template-literals" "^7.13.0"
774
- "@babel/plugin-transform-typeof-symbol" "^7.12.13"
775
- "@babel/plugin-transform-unicode-escapes" "^7.12.13"
776
- "@babel/plugin-transform-unicode-regex" "^7.12.13"
 
777
  "@babel/preset-modules" "^0.1.4"
778
- "@babel/types" "^7.13.12"
779
- babel-plugin-polyfill-corejs2 "^0.1.4"
780
- babel-plugin-polyfill-corejs3 "^0.1.3"
781
- babel-plugin-polyfill-regenerator "^0.1.2"
782
- core-js-compat "^3.9.0"
783
  semver "^6.3.0"
784
 
785
  "@babel/preset-modules@^0.1.4":
@@ -794,193 +830,217 @@
794
  esutils "^2.0.2"
795
 
796
  "@babel/runtime@^7.8.4":
797
- version "7.13.10"
798
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d"
799
- integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==
800
  dependencies:
801
  regenerator-runtime "^0.13.4"
802
 
803
- "@babel/template@^7.12.13":
804
- version "7.12.13"
805
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327"
806
- integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==
807
- dependencies:
808
- "@babel/code-frame" "^7.12.13"
809
- "@babel/parser" "^7.12.13"
810
- "@babel/types" "^7.12.13"
811
-
812
- "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13":
813
- version "7.13.13"
814
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.13.tgz#39aa9c21aab69f74d948a486dd28a2dbdbf5114d"
815
- integrity sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==
816
- dependencies:
817
- "@babel/code-frame" "^7.12.13"
818
- "@babel/generator" "^7.13.9"
819
- "@babel/helper-function-name" "^7.12.13"
820
- "@babel/helper-split-export-declaration" "^7.12.13"
821
- "@babel/parser" "^7.13.13"
822
- "@babel/types" "^7.13.13"
 
823
  debug "^4.1.0"
824
  globals "^11.1.0"
825
 
826
- "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.13", "@babel/types@^7.4.4":
827
- version "7.13.13"
828
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.13.tgz#dcd8b815b38f537a3697ce84c8e3cc62197df96f"
829
- integrity sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w==
830
  dependencies:
831
- "@babel/helper-validator-identifier" "^7.12.11"
832
- lodash "^4.17.19"
833
  to-fast-properties "^2.0.0"
834
 
835
- "@types/json-schema@^7.0.5":
836
- version "7.0.7"
837
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad"
838
- integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==
839
-
840
- "@webassemblyjs/ast@1.9.0":
841
- version "1.9.0"
842
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
843
- integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==
844
- dependencies:
845
- "@webassemblyjs/helper-module-context" "1.9.0"
846
- "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
847
- "@webassemblyjs/wast-parser" "1.9.0"
848
-
849
- "@webassemblyjs/floating-point-hex-parser@1.9.0":
850
- version "1.9.0"
851
- resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4"
852
- integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==
853
-
854
- "@webassemblyjs/helper-api-error@1.9.0":
855
- version "1.9.0"
856
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2"
857
- integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==
858
-
859
- "@webassemblyjs/helper-buffer@1.9.0":
860
- version "1.9.0"
861
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00"
862
- integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==
863
-
864
- "@webassemblyjs/helper-code-frame@1.9.0":
865
- version "1.9.0"
866
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27"
867
- integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==
868
- dependencies:
869
- "@webassemblyjs/wast-printer" "1.9.0"
870
-
871
- "@webassemblyjs/helper-fsm@1.9.0":
872
- version "1.9.0"
873
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8"
874
- integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==
875
-
876
- "@webassemblyjs/helper-module-context@1.9.0":
877
- version "1.9.0"
878
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07"
879
- integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==
880
- dependencies:
881
- "@webassemblyjs/ast" "1.9.0"
882
-
883
- "@webassemblyjs/helper-wasm-bytecode@1.9.0":
884
- version "1.9.0"
885
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790"
886
- integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==
887
-
888
- "@webassemblyjs/helper-wasm-section@1.9.0":
889
- version "1.9.0"
890
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346"
891
- integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==
892
- dependencies:
893
- "@webassemblyjs/ast" "1.9.0"
894
- "@webassemblyjs/helper-buffer" "1.9.0"
895
- "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
896
- "@webassemblyjs/wasm-gen" "1.9.0"
897
-
898
- "@webassemblyjs/ieee754@1.9.0":
899
- version "1.9.0"
900
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4"
901
- integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
902
  dependencies:
903
  "@xtuc/ieee754" "^1.2.0"
904
 
905
- "@webassemblyjs/leb128@1.9.0":
906
- version "1.9.0"
907
- resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95"
908
- integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==
909
  dependencies:
910
  "@xtuc/long" "4.2.2"
911
 
912
- "@webassemblyjs/utf8@1.9.0":
913
- version "1.9.0"
914
- resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab"
915
- integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==
916
-
917
- "@webassemblyjs/wasm-edit@1.9.0":
918
- version "1.9.0"
919
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf"
920
- integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==
921
- dependencies:
922
- "@webassemblyjs/ast" "1.9.0"
923
- "@webassemblyjs/helper-buffer" "1.9.0"
924
- "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
925
- "@webassemblyjs/helper-wasm-section" "1.9.0"
926
- "@webassemblyjs/wasm-gen" "1.9.0"
927
- "@webassemblyjs/wasm-opt" "1.9.0"
928
- "@webassemblyjs/wasm-parser" "1.9.0"
929
- "@webassemblyjs/wast-printer" "1.9.0"
930
-
931
- "@webassemblyjs/wasm-gen@1.9.0":
932
- version "1.9.0"
933
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c"
934
- integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==
935
- dependencies:
936
- "@webassemblyjs/ast" "1.9.0"
937
- "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
938
- "@webassemblyjs/ieee754" "1.9.0"
939
- "@webassemblyjs/leb128" "1.9.0"
940
- "@webassemblyjs/utf8" "1.9.0"
941
-
942
- "@webassemblyjs/wasm-opt@1.9.0":
943
- version "1.9.0"
944
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61"
945
- integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==
946
- dependencies:
947
- "@webassemblyjs/ast" "1.9.0"
948
- "@webassemblyjs/helper-buffer" "1.9.0"
949
- "@webassemblyjs/wasm-gen" "1.9.0"
950
- "@webassemblyjs/wasm-parser" "1.9.0"
951
-
952
- "@webassemblyjs/wasm-parser@1.9.0":
953
- version "1.9.0"
954
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e"
955
- integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==
956
- dependencies:
957
- "@webassemblyjs/ast" "1.9.0"
958
- "@webassemblyjs/helper-api-error" "1.9.0"
959
- "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
960
- "@webassemblyjs/ieee754" "1.9.0"
961
- "@webassemblyjs/leb128" "1.9.0"
962
- "@webassemblyjs/utf8" "1.9.0"
963
-
964
- "@webassemblyjs/wast-parser@1.9.0":
965
- version "1.9.0"
966
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914"
967
- integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==
968
- dependencies:
969
- "@webassemblyjs/ast" "1.9.0"
970
- "@webassemblyjs/floating-point-hex-parser" "1.9.0"
971
- "@webassemblyjs/helper-api-error" "1.9.0"
972
- "@webassemblyjs/helper-code-frame" "1.9.0"
973
- "@webassemblyjs/helper-fsm" "1.9.0"
974
  "@xtuc/long" "4.2.2"
975
 
976
- "@webassemblyjs/wast-printer@1.9.0":
977
- version "1.9.0"
978
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899"
979
- integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==
 
 
 
 
 
980
  dependencies:
981
- "@webassemblyjs/ast" "1.9.0"
982
- "@webassemblyjs/wast-parser" "1.9.0"
983
- "@xtuc/long" "4.2.2"
 
 
 
984
 
985
  "@xtuc/ieee754@^1.2.0":
986
  version "1.2.0"
@@ -992,22 +1052,22 @@
992
  resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
993
  integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
994
 
995
- acorn@^6.4.1:
996
- version "6.4.2"
997
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6"
998
- integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==
999
 
1000
- ajv-errors@^1.0.0:
1001
- version "1.0.1"
1002
- resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
1003
- integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
1004
 
1005
- ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2:
1006
  version "3.5.2"
1007
  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
1008
  integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
1009
 
1010
- ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.4:
1011
  version "6.12.6"
1012
  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
1013
  integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -1017,92 +1077,13 @@ ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.4:
1017
  json-schema-traverse "^0.4.1"
1018
  uri-js "^4.2.2"
1019
 
1020
- ansi-regex@^4.1.0:
1021
- version "4.1.0"
1022
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
1023
- integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
1024
-
1025
- ansi-styles@^3.2.0, ansi-styles@^3.2.1:
1026
  version "3.2.1"
1027
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
1028
  integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
1029
  dependencies:
1030
  color-convert "^1.9.0"
1031
 
1032
- anymatch@^2.0.0:
1033
- version "2.0.0"
1034
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
1035
- integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
1036
- dependencies:
1037
- micromatch "^3.1.4"
1038
- normalize-path "^2.1.1"
1039
-
1040
- anymatch@~3.1.1:
1041
- version "3.1.1"
1042
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
1043
- integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
1044
- dependencies:
1045
- normalize-path "^3.0.0"
1046
- picomatch "^2.0.4"
1047
-
1048
- aproba@^1.1.1:
1049
- version "1.2.0"
1050
- resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
1051
- integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
1052
-
1053
- arr-diff@^4.0.0:
1054
- version "4.0.0"
1055
- resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
1056
- integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
1057
-
1058
- arr-flatten@^1.1.0:
1059
- version "1.1.0"
1060
- resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
1061
- integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
1062
-
1063
- arr-union@^3.1.0:
1064
- version "3.1.0"
1065
- resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
1066
- integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
1067
-
1068
- array-unique@^0.3.2:
1069
- version "0.3.2"
1070
- resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
1071
- integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
1072
-
1073
- asn1.js@^5.2.0:
1074
- version "5.4.1"
1075
- resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
1076
- integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
1077
- dependencies:
1078
- bn.js "^4.0.0"
1079
- inherits "^2.0.1"
1080
- minimalistic-assert "^1.0.0"
1081
- safer-buffer "^2.1.0"
1082
-
1083
- assert@^1.1.1:
1084
- version "1.5.0"
1085
- resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
1086
- integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
1087
- dependencies:
1088
- object-assign "^4.1.1"
1089
- util "0.10.3"
1090
-
1091
- assign-symbols@^1.0.0:
1092
- version "1.0.0"
1093
- resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
1094
- integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
1095
-
1096
- async-each@^1.0.1:
1097
- version "1.0.3"
1098
- resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
1099
- integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
1100
-
1101
- atob@^2.1.2:
1102
- version "2.1.2"
1103
- resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
1104
- integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
1105
-
1106
  babel-loader@^8.1.0:
1107
  version "8.2.2"
1108
  resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81"
@@ -1120,29 +1101,29 @@ babel-plugin-dynamic-import-node@^2.3.3:
1120
  dependencies:
1121
  object.assign "^4.1.0"
1122
 
1123
- babel-plugin-polyfill-corejs2@^0.1.4:
1124
- version "0.1.10"
1125
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz#a2c5c245f56c0cac3dbddbf0726a46b24f0f81d1"
1126
- integrity sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==
1127
  dependencies:
1128
- "@babel/compat-data" "^7.13.0"
1129
- "@babel/helper-define-polyfill-provider" "^0.1.5"
1130
  semver "^6.1.1"
1131
 
1132
- babel-plugin-polyfill-corejs3@^0.1.3:
1133
- version "0.1.7"
1134
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0"
1135
- integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==
1136
  dependencies:
1137
- "@babel/helper-define-polyfill-provider" "^0.1.5"
1138
- core-js-compat "^3.8.1"
1139
 
1140
- babel-plugin-polyfill-regenerator@^0.1.2:
1141
- version "0.1.6"
1142
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz#0fe06a026fe0faa628ccc8ba3302da0a6ce02f3f"
1143
- integrity sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==
1144
  dependencies:
1145
- "@babel/helper-define-polyfill-provider" "^0.1.5"
1146
 
1147
  babel-plugin-syntax-object-rest-spread@^6.8.0:
1148
  version "6.13.0"
@@ -1165,233 +1146,26 @@ babel-runtime@^6.26.0:
1165
  core-js "^2.4.0"
1166
  regenerator-runtime "^0.11.0"
1167
 
1168
- balanced-match@^1.0.0:
1169
- version "1.0.0"
1170
- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
1171
- integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
1172
-
1173
- base64-js@^1.0.2:
1174
- version "1.5.1"
1175
- resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
1176
- integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
1177
-
1178
- base@^0.11.1:
1179
- version "0.11.2"
1180
- resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
1181
- integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
1182
- dependencies:
1183
- cache-base "^1.0.1"
1184
- class-utils "^0.3.5"
1185
- component-emitter "^1.2.1"
1186
- define-property "^1.0.0"
1187
- isobject "^3.0.1"
1188
- mixin-deep "^1.2.0"
1189
- pascalcase "^0.1.1"
1190
-
1191
  big.js@^5.2.2:
1192
  version "5.2.2"
1193
  resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
1194
  integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
1195
 
1196
- binary-extensions@^1.0.0:
1197
- version "1.13.1"
1198
- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
1199
- integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
1200
-
1201
- binary-extensions@^2.0.0:
1202
- version "2.2.0"
1203
- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
1204
- integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
1205
-
1206
- bindings@^1.5.0:
1207
- version "1.5.0"
1208
- resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
1209
- integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
1210
- dependencies:
1211
- file-uri-to-path "1.0.0"
1212
-
1213
- bluebird@^3.5.5:
1214
- version "3.7.2"
1215
- resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
1216
- integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
1217
-
1218
- bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
1219
- version "4.12.0"
1220
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
1221
- integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
1222
-
1223
- bn.js@^5.0.0, bn.js@^5.1.1:
1224
- version "5.2.0"
1225
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
1226
- integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
1227
-
1228
- brace-expansion@^1.1.7:
1229
- version "1.1.11"
1230
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
1231
- integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
1232
- dependencies:
1233
- balanced-match "^1.0.0"
1234
- concat-map "0.0.1"
1235
-
1236
- braces@^2.3.1, braces@^2.3.2:
1237
- version "2.3.2"
1238
- resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
1239
- integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
1240
- dependencies:
1241
- arr-flatten "^1.1.0"
1242
- array-unique "^0.3.2"
1243
- extend-shallow "^2.0.1"
1244
- fill-range "^4.0.0"
1245
- isobject "^3.0.1"
1246
- repeat-element "^1.1.2"
1247
- snapdragon "^0.8.1"
1248
- snapdragon-node "^2.0.1"
1249
- split-string "^3.0.2"
1250
- to-regex "^3.0.1"
1251
-
1252
- braces@~3.0.2:
1253
- version "3.0.2"
1254
- resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
1255
- integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
1256
- dependencies:
1257
- fill-range "^7.0.1"
1258
-
1259
- brorand@^1.0.1, brorand@^1.1.0:
1260
- version "1.1.0"
1261
- resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
1262
- integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
1263
-
1264
- browserify-aes@^1.0.0, browserify-aes@^1.0.4:
1265
- version "1.2.0"
1266
- resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
1267
- integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
1268
- dependencies:
1269
- buffer-xor "^1.0.3"
1270
- cipher-base "^1.0.0"
1271
- create-hash "^1.1.0"
1272
- evp_bytestokey "^1.0.3"
1273
- inherits "^2.0.1"
1274
- safe-buffer "^5.0.1"
1275
-
1276
- browserify-cipher@^1.0.0:
1277
- version "1.0.1"
1278
- resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
1279
- integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
1280
- dependencies:
1281
- browserify-aes "^1.0.4"
1282
- browserify-des "^1.0.0"
1283
- evp_bytestokey "^1.0.0"
1284
-
1285
- browserify-des@^1.0.0:
1286
- version "1.0.2"
1287
- resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
1288
- integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
1289
  dependencies:
1290
- cipher-base "^1.0.1"
1291
- des.js "^1.0.0"
1292
- inherits "^2.0.1"
1293
- safe-buffer "^5.1.2"
1294
-
1295
- browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
1296
- version "4.1.0"
1297
- resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
1298
- integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
1299
- dependencies:
1300
- bn.js "^5.0.0"
1301
- randombytes "^2.0.1"
1302
-
1303
- browserify-sign@^4.0.0:
1304
- version "4.2.1"
1305
- resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
1306
- integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
1307
- dependencies:
1308
- bn.js "^5.1.1"
1309
- browserify-rsa "^4.0.1"
1310
- create-hash "^1.2.0"
1311
- create-hmac "^1.1.7"
1312
- elliptic "^6.5.3"
1313
- inherits "^2.0.4"
1314
- parse-asn1 "^5.1.5"
1315
- readable-stream "^3.6.0"
1316
- safe-buffer "^5.2.0"
1317
-
1318
- browserify-zlib@^0.2.0:
1319
- version "0.2.0"
1320
- resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
1321
- integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
1322
- dependencies:
1323
- pako "~1.0.5"
1324
-
1325
- browserslist@^4.14.5, browserslist@^4.16.3:
1326
- version "4.16.3"
1327
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717"
1328
- integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==
1329
- dependencies:
1330
- caniuse-lite "^1.0.30001181"
1331
- colorette "^1.2.1"
1332
- electron-to-chromium "^1.3.649"
1333
  escalade "^3.1.1"
1334
- node-releases "^1.1.70"
 
1335
 
1336
  buffer-from@^1.0.0:
1337
- version "1.1.1"
1338
- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
1339
- integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
1340
-
1341
- buffer-xor@^1.0.3:
1342
- version "1.0.3"
1343
- resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
1344
- integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
1345
-
1346
- buffer@^4.3.0:
1347
- version "4.9.2"
1348
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8"
1349
- integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
1350
- dependencies:
1351
- base64-js "^1.0.2"
1352
- ieee754 "^1.1.4"
1353
- isarray "^1.0.0"
1354
-
1355
- builtin-status-codes@^3.0.0:
1356
- version "3.0.0"
1357
- resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
1358
- integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
1359
-
1360
- cacache@^12.0.2:
1361
- version "12.0.4"
1362
- resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c"
1363
- integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==
1364
- dependencies:
1365
- bluebird "^3.5.5"
1366
- chownr "^1.1.1"
1367
- figgy-pudding "^3.5.1"
1368
- glob "^7.1.4"
1369
- graceful-fs "^4.1.15"
1370
- infer-owner "^1.0.3"
1371
- lru-cache "^5.1.1"
1372
- mississippi "^3.0.0"
1373
- mkdirp "^0.5.1"
1374
- move-concurrently "^1.0.1"
1375
- promise-inflight "^1.0.1"
1376
- rimraf "^2.6.3"
1377
- ssri "^6.0.1"
1378
- unique-filename "^1.1.1"
1379
- y18n "^4.0.0"
1380
-
1381
- cache-base@^1.0.1:
1382
- version "1.0.1"
1383
- resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
1384
- integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
1385
- dependencies:
1386
- collection-visit "^1.0.0"
1387
- component-emitter "^1.2.1"
1388
- get-value "^2.0.6"
1389
- has-value "^1.0.0"
1390
- isobject "^3.0.1"
1391
- set-value "^2.0.0"
1392
- to-object-path "^0.3.0"
1393
- union-value "^1.0.0"
1394
- unset-value "^1.0.0"
1395
 
1396
  call-bind@^1.0.0:
1397
  version "1.0.2"
@@ -1401,17 +1175,12 @@ call-bind@^1.0.0:
1401
  function-bind "^1.1.1"
1402
  get-intrinsic "^1.0.2"
1403
 
1404
- camelcase@^5.0.0:
1405
- version "5.3.1"
1406
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
1407
- integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
1408
 
1409
- caniuse-lite@^1.0.30001181:
1410
- version "1.0.30001204"
1411
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz#256c85709a348ec4d175e847a3b515c66e79f2aa"
1412
- integrity sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ==
1413
-
1414
- chalk@^2.0.0, chalk@^2.4.2:
1415
  version "2.4.2"
1416
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
1417
  integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -1420,86 +1189,19 @@ chalk@^2.0.0, chalk@^2.4.2:
1420
  escape-string-regexp "^1.0.5"
1421
  supports-color "^5.3.0"
1422
 
1423
- chokidar@^2.1.8:
1424
- version "2.1.8"
1425
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
1426
- integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
1427
- dependencies:
1428
- anymatch "^2.0.0"
1429
- async-each "^1.0.1"
1430
- braces "^2.3.2"
1431
- glob-parent "^3.1.0"
1432
- inherits "^2.0.3"
1433
- is-binary-path "^1.0.0"
1434
- is-glob "^4.0.0"
1435
- normalize-path "^3.0.0"
1436
- path-is-absolute "^1.0.0"
1437
- readdirp "^2.2.1"
1438
- upath "^1.1.1"
1439
- optionalDependencies:
1440
- fsevents "^1.2.7"
1441
-
1442
- chokidar@^3.4.1:
1443
- version "3.5.1"
1444
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a"
1445
- integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==
1446
- dependencies:
1447
- anymatch "~3.1.1"
1448
- braces "~3.0.2"
1449
- glob-parent "~5.1.0"
1450
- is-binary-path "~2.1.0"
1451
- is-glob "~4.0.1"
1452
- normalize-path "~3.0.0"
1453
- readdirp "~3.5.0"
1454
- optionalDependencies:
1455
- fsevents "~2.3.1"
1456
-
1457
- chownr@^1.1.1:
1458
- version "1.1.4"
1459
- resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
1460
- integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
1461
-
1462
  chrome-trace-event@^1.0.2:
1463
- version "1.0.2"
1464
- resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
1465
- integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==
1466
- dependencies:
1467
- tslib "^1.9.0"
1468
-
1469
- cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
1470
- version "1.0.4"
1471
- resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
1472
- integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
1473
- dependencies:
1474
- inherits "^2.0.1"
1475
- safe-buffer "^5.0.1"
1476
-
1477
- class-utils@^0.3.5:
1478
- version "0.3.6"
1479
- resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
1480
- integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
1481
- dependencies:
1482
- arr-union "^3.1.0"
1483
- define-property "^0.2.5"
1484
- isobject "^3.0.0"
1485
- static-extend "^0.1.1"
1486
-
1487
- cliui@^5.0.0:
1488
- version "5.0.0"
1489
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
1490
- integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
1491
- dependencies:
1492
- string-width "^3.1.0"
1493
- strip-ansi "^5.2.0"
1494
- wrap-ansi "^5.1.0"
1495
 
1496
- collection-visit@^1.0.0:
1497
- version "1.0.0"
1498
- resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
1499
- integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
1500
  dependencies:
1501
- map-visit "^1.0.0"
1502
- object-visit "^1.0.0"
 
1503
 
1504
  color-convert@^1.9.0:
1505
  version "1.9.3"
@@ -1514,80 +1216,38 @@ color-name@1.1.3:
1514
  integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
1515
 
1516
  colorette@^1.2.1:
1517
- version "1.2.2"
1518
- resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
1519
- integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
1520
 
1521
  commander@^2.20.0:
1522
  version "2.20.3"
1523
  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
1524
  integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
1525
 
 
 
 
 
 
1526
  commondir@^1.0.1:
1527
  version "1.0.1"
1528
  resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
1529
  integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
1530
 
1531
- component-emitter@^1.2.1:
1532
- version "1.3.0"
1533
- resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
1534
- integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
1535
-
1536
- concat-map@0.0.1:
1537
- version "0.0.1"
1538
- resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
1539
- integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
1540
-
1541
- concat-stream@^1.5.0:
1542
- version "1.6.2"
1543
- resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
1544
- integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
1545
- dependencies:
1546
- buffer-from "^1.0.0"
1547
- inherits "^2.0.3"
1548
- readable-stream "^2.2.2"
1549
- typedarray "^0.0.6"
1550
-
1551
- console-browserify@^1.1.0:
1552
- version "1.2.0"
1553
- resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
1554
- integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
1555
-
1556
- constants-browserify@^1.0.0:
1557
- version "1.0.0"
1558
- resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
1559
- integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
1560
-
1561
  convert-source-map@^1.7.0:
1562
- version "1.7.0"
1563
- resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
1564
- integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
1565
  dependencies:
1566
  safe-buffer "~5.1.1"
1567
 
1568
- copy-concurrently@^1.0.0:
1569
- version "1.0.5"
1570
- resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
1571
- integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
1572
- dependencies:
1573
- aproba "^1.1.1"
1574
- fs-write-stream-atomic "^1.0.8"
1575
- iferr "^0.1.5"
1576
- mkdirp "^0.5.1"
1577
- rimraf "^2.5.4"
1578
- run-queue "^1.0.0"
1579
-
1580
- copy-descriptor@^0.1.0:
1581
- version "0.1.1"
1582
- resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
1583
- integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
1584
-
1585
- core-js-compat@^3.8.1, core-js-compat@^3.9.0:
1586
- version "3.9.1"
1587
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.1.tgz#4e572acfe90aff69d76d8c37759d21a5c59bb455"
1588
- integrity sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==
1589
- dependencies:
1590
- browserslist "^4.16.3"
1591
  semver "7.0.0"
1592
 
1593
  core-js@^2.4.0:
@@ -1595,106 +1255,29 @@ core-js@^2.4.0:
1595
  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
1596
  integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
1597
 
1598
- core-util-is@~1.0.0:
1599
- version "1.0.2"
1600
- resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
1601
- integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
1602
-
1603
- create-ecdh@^4.0.0:
1604
- version "4.0.4"
1605
- resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
1606
- integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
1607
  dependencies:
1608
- bn.js "^4.1.0"
1609
- elliptic "^6.5.3"
1610
-
1611
- create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
1612
- version "1.2.0"
1613
- resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
1614
- integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
1615
- dependencies:
1616
- cipher-base "^1.0.1"
1617
- inherits "^2.0.1"
1618
- md5.js "^1.3.4"
1619
- ripemd160 "^2.0.1"
1620
- sha.js "^2.4.0"
1621
-
1622
- create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
1623
- version "1.1.7"
1624
- resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
1625
- integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
1626
- dependencies:
1627
- cipher-base "^1.0.3"
1628
- create-hash "^1.1.0"
1629
- inherits "^2.0.1"
1630
- ripemd160 "^2.0.0"
1631
- safe-buffer "^5.0.1"
1632
- sha.js "^2.4.8"
1633
-
1634
- cross-env@^5.0.1:
1635
- version "5.2.1"
1636
- resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.1.tgz#b2c76c1ca7add66dc874d11798466094f551b34d"
1637
- integrity sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==
1638
- dependencies:
1639
- cross-spawn "^6.0.5"
1640
-
1641
- cross-spawn@^6.0.5:
1642
- version "6.0.5"
1643
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
1644
- integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
1645
- dependencies:
1646
- nice-try "^1.0.4"
1647
- path-key "^2.0.1"
1648
- semver "^5.5.0"
1649
- shebang-command "^1.2.0"
1650
- which "^1.2.9"
1651
-
1652
- crypto-browserify@^3.11.0:
1653
- version "3.12.0"
1654
- resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
1655
- integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
1656
- dependencies:
1657
- browserify-cipher "^1.0.0"
1658
- browserify-sign "^4.0.0"
1659
- create-ecdh "^4.0.0"
1660
- create-hash "^1.1.0"
1661
- create-hmac "^1.1.0"
1662
- diffie-hellman "^5.0.0"
1663
- inherits "^2.0.1"
1664
- pbkdf2 "^3.0.3"
1665
- public-encrypt "^4.0.0"
1666
- randombytes "^2.0.0"
1667
- randomfill "^1.0.3"
1668
-
1669
- cyclist@^1.0.1:
1670
- version "1.0.1"
1671
- resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
1672
- integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
1673
 
1674
- debug@^2.2.0, debug@^2.3.3:
1675
- version "2.6.9"
1676
- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
1677
- integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
1678
  dependencies:
1679
- ms "2.0.0"
 
 
1680
 
1681
  debug@^4.1.0, debug@^4.1.1:
1682
- version "4.3.1"
1683
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
1684
- integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
1685
  dependencies:
1686
  ms "2.1.2"
1687
 
1688
- decamelize@^1.2.0:
1689
- version "1.2.0"
1690
- resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
1691
- integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
1692
-
1693
- decode-uri-component@^0.2.0:
1694
- version "0.2.0"
1695
- resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
1696
- integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
1697
-
1698
  define-properties@^1.1.3:
1699
  version "1.1.3"
1700
  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
@@ -1702,115 +1285,33 @@ define-properties@^1.1.3:
1702
  dependencies:
1703
  object-keys "^1.0.12"
1704
 
1705
- define-property@^0.2.5:
1706
- version "0.2.5"
1707
- resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
1708
- integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
1709
- dependencies:
1710
- is-descriptor "^0.1.0"
1711
-
1712
- define-property@^1.0.0:
1713
- version "1.0.0"
1714
- resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
1715
- integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
1716
- dependencies:
1717
- is-descriptor "^1.0.0"
1718
-
1719
- define-property@^2.0.2:
1720
- version "2.0.2"
1721
- resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
1722
- integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
1723
- dependencies:
1724
- is-descriptor "^1.0.2"
1725
- isobject "^3.0.1"
1726
-
1727
- des.js@^1.0.0:
1728
- version "1.0.1"
1729
- resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
1730
- integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
1731
- dependencies:
1732
- inherits "^2.0.1"
1733
- minimalistic-assert "^1.0.0"
1734
-
1735
- detect-file@^1.0.0:
1736
- version "1.0.0"
1737
- resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
1738
- integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
1739
-
1740
- diffie-hellman@^5.0.0:
1741
- version "5.0.3"
1742
- resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
1743
- integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
1744
- dependencies:
1745
- bn.js "^4.1.0"
1746
- miller-rabin "^4.0.0"
1747
- randombytes "^2.0.0"
1748
-
1749
- domain-browser@^1.1.1:
1750
- version "1.2.0"
1751
- resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
1752
- integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
1753
-
1754
- duplexify@^3.4.2, duplexify@^3.6.0:
1755
- version "3.7.1"
1756
- resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
1757
- integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
1758
- dependencies:
1759
- end-of-stream "^1.0.0"
1760
- inherits "^2.0.1"
1761
- readable-stream "^2.0.0"
1762
- stream-shift "^1.0.0"
1763
-
1764
- electron-to-chromium@^1.3.649:
1765
- version "1.3.701"
1766
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.701.tgz#5e796ed7ce88cd77bc7bf831cf311ef6b067c389"
1767
- integrity sha512-Zd9ofdIMYHYhG1gvnejQDvC/kqSeXQvtXF0yRURGxgwGqDZm9F9Fm3dYFnm5gyuA7xpXfBlzVLN1sz0FjxpKfw==
1768
-
1769
- elliptic@^6.5.3:
1770
- version "6.5.4"
1771
- resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
1772
- integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
1773
- dependencies:
1774
- bn.js "^4.11.9"
1775
- brorand "^1.1.0"
1776
- hash.js "^1.0.0"
1777
- hmac-drbg "^1.0.1"
1778
- inherits "^2.0.4"
1779
- minimalistic-assert "^1.0.1"
1780
- minimalistic-crypto-utils "^1.0.1"
1781
-
1782
- emoji-regex@^7.0.1:
1783
- version "7.0.3"
1784
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
1785
- integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
1786
 
1787
  emojis-list@^3.0.0:
1788
  version "3.0.0"
1789
  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
1790
  integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
1791
 
1792
- end-of-stream@^1.0.0, end-of-stream@^1.1.0:
1793
- version "1.4.4"
1794
- resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
1795
- integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
1796
  dependencies:
1797
- once "^1.4.0"
 
1798
 
1799
- enhanced-resolve@^4.1.1, enhanced-resolve@^4.5.0:
1800
- version "4.5.0"
1801
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec"
1802
- integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==
1803
- dependencies:
1804
- graceful-fs "^4.1.2"
1805
- memory-fs "^0.5.0"
1806
- tapable "^1.0.0"
1807
 
1808
- errno@^0.1.3, errno@~0.1.7:
1809
- version "0.1.8"
1810
- resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
1811
- integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
1812
- dependencies:
1813
- prr "~1.0.1"
1814
 
1815
  escalade@^3.1.1:
1816
  version "3.1.1"
@@ -1822,15 +1323,15 @@ escape-string-regexp@^1.0.5:
1822
  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
1823
  integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
1824
 
1825
- eslint-scope@^4.0.3:
1826
- version "4.0.3"
1827
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
1828
- integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
1829
  dependencies:
1830
- esrecurse "^4.1.0"
1831
  estraverse "^4.1.1"
1832
 
1833
- esrecurse@^4.1.0:
1834
  version "4.3.0"
1835
  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
1836
  integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
@@ -1852,67 +1353,25 @@ esutils@^2.0.2:
1852
  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
1853
  integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
1854
 
1855
- events@^3.0.0:
1856
  version "3.3.0"
1857
  resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
1858
  integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
1859
 
1860
- evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
1861
- version "1.0.3"
1862
- resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
1863
- integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
1864
- dependencies:
1865
- md5.js "^1.3.4"
1866
- safe-buffer "^5.1.1"
1867
-
1868
- expand-brackets@^2.1.4:
1869
- version "2.1.4"
1870
- resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
1871
- integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
1872
- dependencies:
1873
- debug "^2.3.3"
1874
- define-property "^0.2.5"
1875
- extend-shallow "^2.0.1"
1876
- posix-character-classes "^0.1.0"