WooCommerce PayPal Payments - Version 1.9.3

Version Description

  • Add - Tracking API #792
  • Fix - Improve compatibility with Siteground Optimizer plugin #797
  • Fix - Transaction ID in order not updated when manually capturing authorized payment from WC #766
  • Fix - Failed form validation on Checkout page causing page to be sticky #781
  • Fix - Do not include full path in exception #779
  • Fix - PUI conflict with Germanized plugin and taxes #808
  • Enhancement - Enable ACDC by default only in locations where WooCommerce Payments is not available #799
  • Enhancement - Add links to docs & support in plugin #782
  • Enhancement - Put gateway sub-options into tabs #772
  • Enhancement - Show tabs only after onboarding #789
  • Enhancement - Add header on settings page #790
  • Enhancement - PUI add option for a phone number field next to the Birth Date field #742
  • Enhancement - PUI gateway availability on pay for order page with unsupported currency #744
Download this release

Release Info

Developer automattic
Plugin Icon 128x128 WooCommerce PayPal Payments
Version 1.9.3
Comparing to
See all releases

Code changes from version 1.9.2 to 1.9.3

Files changed (54) hide show
  1. changelog.txt +15 -0
  2. modules.php +1 -0
  3. modules/ppcp-api-client/src/Endpoint/PayUponInvoiceOrderEndpoint.php +59 -43
  4. modules/ppcp-api-client/src/Entity/PurchaseUnit.php +4 -2
  5. modules/ppcp-api-client/src/Entity/Token.php +20 -0
  6. modules/ppcp-api-client/src/Helper/DccApplies.php +12 -0
  7. modules/ppcp-button/assets/js/button.js +1 -1
  8. modules/ppcp-button/resources/js/button.js +1 -1
  9. modules/ppcp-button/resources/js/modules/ErrorHandler.js +49 -17
  10. modules/ppcp-compat/services.php +13 -1
  11. modules/ppcp-compat/src/CompatModule.php +20 -5
  12. modules/ppcp-onboarding/assets/css/onboarding.css +51 -0
  13. modules/ppcp-onboarding/assets/js/onboarding.js +2 -0
  14. modules/ppcp-onboarding/src/Render/OnboardingOptionsRenderer.php +43 -46
  15. modules/ppcp-order-tracking/assets/css/order-edit-page.css +1 -0
  16. modules/ppcp-order-tracking/assets/js/order-edit-page-style.js +1 -0
  17. modules/ppcp-order-tracking/assets/js/order-edit-page.js +1 -0
  18. modules/ppcp-order-tracking/carriers.php +612 -0
  19. modules/ppcp-order-tracking/composer.json +17 -0
  20. modules/ppcp-order-tracking/extensions.php +12 -0
  21. modules/ppcp-order-tracking/module.php +16 -0
  22. modules/ppcp-order-tracking/package.json +23 -0
  23. modules/ppcp-order-tracking/resources/css/order-edit-page.scss +20 -0
  24. modules/ppcp-order-tracking/resources/js/order-edit-page.js +49 -0
  25. modules/ppcp-order-tracking/services.php +82 -0
  26. modules/ppcp-order-tracking/src/Assets/OrderEditPageAssets.php +100 -0
  27. modules/ppcp-order-tracking/src/Endpoint/OrderTrackingEndpoint.php +356 -0
  28. modules/ppcp-order-tracking/src/MetaBoxRenderer.php +131 -0
  29. modules/ppcp-order-tracking/src/OrderTrackingModule.php +149 -0
  30. modules/ppcp-order-tracking/webpack.config.js +36 -0
  31. modules/ppcp-order-tracking/yarn.lock +2225 -0
  32. modules/ppcp-status-report/src/StatusReportModule.php +8 -0
  33. modules/ppcp-vaulting/services.php +13 -0
  34. modules/ppcp-vaulting/src/VaultedCreditCardHandler.php +223 -0
  35. modules/ppcp-wc-gateway/services.php +84 -17
  36. modules/ppcp-wc-gateway/src/Gateway/CreditCardGateway.php +41 -185
  37. modules/ppcp-wc-gateway/src/Gateway/PayUponInvoice/PayUponInvoice.php +20 -0
  38. modules/ppcp-wc-gateway/src/Gateway/PayUponInvoice/PayUponInvoiceGateway.php +7 -1
  39. modules/ppcp-wc-gateway/src/Gateway/PayUponInvoice/PaymentSourceFactory.php +3 -3
  40. modules/ppcp-wc-gateway/src/Gateway/ProcessPaymentTrait.php +1 -1
  41. modules/ppcp-wc-gateway/src/Helper/DCCProductStatus.php +3 -4
  42. modules/ppcp-wc-gateway/src/Helper/PayUponInvoiceHelper.php +46 -2
  43. modules/ppcp-wc-gateway/src/Helper/PayUponInvoiceProductStatus.php +2 -3
  44. modules/ppcp-wc-gateway/src/Processor/AuthorizedPaymentsProcessor.php +4 -1
  45. modules/ppcp-wc-gateway/src/Settings/HeaderRenderer.php +82 -0
  46. modules/ppcp-wc-gateway/src/Settings/SectionsRenderer.php +21 -9
  47. modules/ppcp-wc-gateway/src/Settings/SettingsListener.php +33 -1
  48. modules/ppcp-wc-gateway/src/WCGatewayModule.php +62 -19
  49. readme.txt +16 -1
  50. vendor/autoload.php +1 -1
  51. vendor/composer/autoload_psr4.php +1 -0
  52. vendor/composer/autoload_real.php +7 -7
  53. vendor/composer/autoload_static.php +9 -4
  54. woocommerce-paypal-payments.php +40 -2
changelog.txt CHANGED
@@ -1,5 +1,20 @@
1
  *** Changelog ***
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  = 1.9.2 - 2022-08-09 =
4
  * Fix - Do not allow birth date older than 100 years for PUI. #743
5
  * Fix - Store the customer id for vaulted payment method in usermeta to not lose vaulted methods after the invoice prefix change. #698
1
  *** Changelog ***
2
 
3
+ = 1.9.3 - 2022-08-31 =
4
+ * Add - Tracking API #792
5
+ * Fix - Improve compatibility with Siteground Optimizer plugin #797
6
+ * Fix - Transaction ID in order not updated when manually capturing authorized payment from WC #766
7
+ * Fix - Failed form validation on Checkout page causing page to be sticky #781
8
+ * Fix - Do not include full path in exception #779
9
+ * Fix - PUI conflict with Germanized plugin and taxes #808
10
+ * Enhancement - Enable ACDC by default only in locations where WooCommerce Payments is not available #799
11
+ * Enhancement - Add links to docs & support in plugin #782
12
+ * Enhancement - Put gateway sub-options into tabs #772
13
+ * Enhancement - Show tabs only after onboarding #789
14
+ * Enhancement - Add header on settings page #790
15
+ * Enhancement - PUI add option for a phone number field next to the Birth Date field #742
16
+ * Enhancement - PUI gateway availability on pay for order page with unsupported currency #744
17
+
18
  = 1.9.2 - 2022-08-09 =
19
  * Fix - Do not allow birth date older than 100 years for PUI. #743
20
  * Fix - Store the customer id for vaulted payment method in usermeta to not lose vaulted methods after the invoice prefix change. #698
modules.php CHANGED
@@ -24,6 +24,7 @@ return function ( string $root_dir ): iterable {
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;
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
+ ( require "$modules_dir/ppcp-order-tracking/module.php" )(),
28
  );
29
 
30
  return $modules;
modules/ppcp-api-client/src/Endpoint/PayUponInvoiceOrderEndpoint.php CHANGED
@@ -12,8 +12,16 @@ namespace WooCommerce\PayPalCommerce\ApiClient\Endpoint;
12
  use Psr\Log\LoggerInterface;
13
  use RuntimeException;
14
  use stdClass;
 
 
 
 
 
 
15
  use WooCommerce\PayPalCommerce\ApiClient\Authentication\Bearer;
16
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\RequestTrait;
 
 
17
  use WooCommerce\PayPalCommerce\ApiClient\Entity\Order;
18
  use WooCommerce\PayPalCommerce\ApiClient\Entity\PurchaseUnit;
19
  use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
@@ -92,18 +100,19 @@ class PayUponInvoiceOrderEndpoint {
92
  *
93
  * @param PurchaseUnit[] $items The purchase unit items for the order.
94
  * @param PaymentSource $payment_source The payment source.
 
95
  * @return Order
96
  * @throws RuntimeException When there is a problem with the payment source.
97
  * @throws PayPalApiException When there is a problem creating the order.
98
  */
99
- public function create( array $items, PaymentSource $payment_source ): Order {
100
 
101
  $data = array(
102
  'intent' => 'CAPTURE',
103
  'processing_instruction' => 'ORDER_COMPLETE_ON_PAYMENT_APPROVAL',
104
  'purchase_units' => array_map(
105
  static function ( PurchaseUnit $item ): array {
106
- return $item->to_array();
107
  },
108
  $items
109
  ),
@@ -112,8 +121,7 @@ class PayUponInvoiceOrderEndpoint {
112
  ),
113
  );
114
 
115
- $data = $this->ensure_tax( $data );
116
- $data = $this->ensure_tax_rate( $data );
117
  $data = $this->ensure_shipping( $data, $payment_source->to_array() );
118
 
119
  $bearer = $this->bearer->bearer();
@@ -195,45 +203,6 @@ class PayUponInvoiceOrderEndpoint {
195
  return $json;
196
  }
197
 
198
- /**
199
- * Ensures items contains tax.
200
- *
201
- * @param array $data The data.
202
- * @return array
203
- */
204
- private function ensure_tax( array $data ): array {
205
- $items_count = count( $data['purchase_units'][0]['items'] );
206
-
207
- for ( $i = 0; $i < $items_count; $i++ ) {
208
- if ( ! isset( $data['purchase_units'][0]['items'][ $i ]['tax'] ) ) {
209
- $data['purchase_units'][0]['items'][ $i ]['tax'] = array(
210
- 'currency_code' => 'EUR',
211
- 'value' => '0.00',
212
- );
213
- }
214
- }
215
-
216
- return $data;
217
- }
218
-
219
- /**
220
- * Ensures items contains tax rate.
221
- *
222
- * @param array $data The data.
223
- * @return array
224
- */
225
- private function ensure_tax_rate( array $data ): array {
226
- $items_count = count( $data['purchase_units'][0]['items'] );
227
-
228
- for ( $i = 0; $i < $items_count; $i++ ) {
229
- if ( ! isset( $data['purchase_units'][0]['items'][ $i ]['tax_rate'] ) ) {
230
- $data['purchase_units'][0]['items'][ $i ]['tax_rate'] = '0.00';
231
- }
232
- }
233
-
234
- return $data;
235
- }
236
-
237
  /**
238
  * Ensures purchase units contains shipping by using payment source data.
239
  *
@@ -255,4 +224,51 @@ class PayUponInvoiceOrderEndpoint {
255
 
256
  return $data;
257
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
258
  }
12
  use Psr\Log\LoggerInterface;
13
  use RuntimeException;
14
  use stdClass;
15
+ use WC_Customer;
16
+ use WC_Order;
17
+ use WC_Order_Item_Fee;
18
+ use WC_Order_Item_Product;
19
+ use WC_Product;
20
+ use WC_Tax;
21
  use WooCommerce\PayPalCommerce\ApiClient\Authentication\Bearer;
22
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\RequestTrait;
23
+ use WooCommerce\PayPalCommerce\ApiClient\Entity\Item;
24
+ use WooCommerce\PayPalCommerce\ApiClient\Entity\Money;
25
  use WooCommerce\PayPalCommerce\ApiClient\Entity\Order;
26
  use WooCommerce\PayPalCommerce\ApiClient\Entity\PurchaseUnit;
27
  use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
100
  *
101
  * @param PurchaseUnit[] $items The purchase unit items for the order.
102
  * @param PaymentSource $payment_source The payment source.
103
+ * @param WC_Order $wc_order The WC order.
104
  * @return Order
105
  * @throws RuntimeException When there is a problem with the payment source.
106
  * @throws PayPalApiException When there is a problem creating the order.
107
  */
108
+ public function create( array $items, PaymentSource $payment_source, WC_Order $wc_order ): Order {
109
 
110
  $data = array(
111
  'intent' => 'CAPTURE',
112
  'processing_instruction' => 'ORDER_COMPLETE_ON_PAYMENT_APPROVAL',
113
  'purchase_units' => array_map(
114
  static function ( PurchaseUnit $item ): array {
115
+ return $item->to_array( false );
116
  },
117
  $items
118
  ),
121
  ),
122
  );
123
 
124
+ $data = $this->ensure_taxes( $wc_order, $data );
 
125
  $data = $this->ensure_shipping( $data, $payment_source->to_array() );
126
 
127
  $bearer = $this->bearer->bearer();
203
  return $json;
204
  }
205
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
206
  /**
207
  * Ensures purchase units contains shipping by using payment source data.
208
  *
224
 
225
  return $data;
226
  }
227
+
228
+ /**
229
+ * Ensure items contains taxes.
230
+ *
231
+ * @param WC_Order $wc_order The WC order.
232
+ * @param array $data The data.
233
+ * @return array
234
+ */
235
+ private function ensure_taxes( WC_Order $wc_order, array $data ): array {
236
+ $tax_total = $data['purchase_units'][0]['amount']['breakdown']['tax_total']['value'];
237
+ $item_total = $data['purchase_units'][0]['amount']['breakdown']['item_total']['value'];
238
+ $shipping = $data['purchase_units'][0]['amount']['breakdown']['shipping']['value'];
239
+ $order_tax_total = $wc_order->get_total_tax();
240
+ $tax_rate = round( ( $order_tax_total / $item_total ) * 100, 1 );
241
+
242
+ $item_name = $data['purchase_units'][0]['items'][0]['name'];
243
+ $item_currency = $data['purchase_units'][0]['items'][0]['unit_amount']['currency_code'];
244
+ $item_description = $data['purchase_units'][0]['items'][0]['description'];
245
+ $item_sku = $data['purchase_units'][0]['items'][0]['sku'];
246
+
247
+ unset( $data['purchase_units'][0]['items'] );
248
+ $data['purchase_units'][0]['items'][0] = array(
249
+ 'name' => $item_name,
250
+ 'unit_amount' => array(
251
+ 'currency_code' => $item_currency,
252
+ 'value' => $item_total,
253
+ ),
254
+ 'quantity' => 1,
255
+ 'description' => $item_description,
256
+ 'sku' => $item_sku,
257
+ 'category' => 'PHYSICAL_GOODS',
258
+ 'tax' => array(
259
+ 'currency_code' => 'EUR',
260
+ 'value' => $tax_total,
261
+ ),
262
+ 'tax_rate' => number_format( $tax_rate, 2, '.', '' ),
263
+ );
264
+
265
+ $total_amount = $data['purchase_units'][0]['amount']['value'];
266
+ $breakdown_total = $item_total + $tax_total + $shipping;
267
+ $diff = round( $total_amount - $breakdown_total, 2 );
268
+ if ( $diff === -0.01 || $diff === 0.01 ) {
269
+ $data['purchase_units'][0]['amount']['value'] = number_format( $breakdown_total, 2, '.', '' );
270
+ }
271
+
272
+ return $data;
273
+ }
274
  }
modules/ppcp-api-client/src/Entity/PurchaseUnit.php CHANGED
@@ -268,9 +268,11 @@ class PurchaseUnit {
268
  /**
269
  * Returns the object as array.
270
  *
 
 
271
  * @return array
272
  */
273
- public function to_array(): array {
274
  $purchase_unit = array(
275
  'reference_id' => $this->reference_id(),
276
  'amount' => $this->amount()->to_array(),
@@ -282,7 +284,7 @@ class PurchaseUnit {
282
  $this->items()
283
  ),
284
  );
285
- if ( $this->ditch_items_when_mismatch( $this->amount(), ...$this->items() ) ) {
286
  unset( $purchase_unit['items'] );
287
  unset( $purchase_unit['amount']['breakdown'] );
288
  }
268
  /**
269
  * Returns the object as array.
270
  *
271
+ * @param bool $ditch_items_when_mismatch Whether ditch items when mismatch or not.
272
+ *
273
  * @return array
274
  */
275
+ public function to_array( bool $ditch_items_when_mismatch = true ): array {
276
  $purchase_unit = array(
277
  'reference_id' => $this->reference_id(),
278
  'amount' => $this->amount()->to_array(),
284
  $this->items()
285
  ),
286
  );
287
+ if ( $ditch_items_when_mismatch && $this->ditch_items_when_mismatch( $this->amount(), ...$this->items() ) ) {
288
  unset( $purchase_unit['items'] );
289
  unset( $purchase_unit['amount']['breakdown'] );
290
  }
modules/ppcp-api-client/src/Entity/Token.php CHANGED
@@ -140,4 +140,24 @@ class Token {
140
  }
141
  return true;
142
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
  }
140
  }
141
  return true;
142
  }
143
+
144
+ /**
145
+ * Checks if tracking is available in access token scope.
146
+ *
147
+ * @return bool Whether tracking features are enabled or not.
148
+ */
149
+ public function is_tracking_available(): bool {
150
+ if ( ! isset( $this->json->scope ) ) {
151
+ return false;
152
+ }
153
+
154
+ if ( strpos(
155
+ $this->json->scope,
156
+ 'https://uri.paypal.com/services/shipping/trackers/readwrite'
157
+ ) !== false ) {
158
+ return true;
159
+ }
160
+
161
+ return false;
162
+ }
163
  }
modules/ppcp-api-client/src/Helper/DccApplies.php CHANGED
@@ -77,6 +77,18 @@ class DccApplies {
77
  return $applies;
78
  }
79
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  /**
81
  * Returns credit cards, which can be used.
82
  *
77
  return $applies;
78
  }
79
 
80
+ /**
81
+ * Returns whether WooCommerce Payments plugin is available for the store country.
82
+ *
83
+ * @return bool
84
+ */
85
+ public function for_wc_payments(): bool {
86
+ $countries = array_keys( $this->allowed_country_currency_matrix );
87
+ array_push( $countries, 'AT', 'BE', 'HK', 'IE', 'NL', 'PL', 'PT', 'SG', 'CH' );
88
+
89
+ return in_array( $this->country, $countries, true );
90
+ }
91
+
92
  /**
93
  * Returns credit cards, which can be used.
94
  *
modules/ppcp-button/assets/js/button.js CHANGED
@@ -1 +1 @@
1
- (()=>{"use strict";var __webpack_modules__={536:(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{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.messagesList === null) {\n return;\n }\n\n this.messagesList.innerHTML = '';\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 funding_source: window.ppcpFundingSource\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 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/Helper/CheckoutMethodState.js\nconst PaymentMethods = {\n PAYPAL: 'ppcp-gateway',\n CARDS: 'ppcp-credit-card-gateway',\n OXXO: 'ppcp-oxxo-gateway',\n CARD_BUTTON: 'ppcp-card-button-gateway'\n};\nconst ORDER_BUTTON_SELECTOR = '#place_order';\nconst getCurrentPaymentMethod = () => {\n const el = document.querySelector('input[name=\"payment_method\"]:checked');\n\n if (!el) {\n return null;\n }\n\n return el.value;\n};\nconst isSavedCardSelected = () => {\n const savedCardList = document.querySelector('#saved-credit-card');\n return savedCardList && savedCardList.value !== '';\n};\n;// CONCATENATED MODULE: ./resources/js/modules/ActionHandler/CartActionHandler.js\n\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 payment_method: PaymentMethods.PAYPAL,\n funding_source: window.ppcpFundingSource,\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.actionHandler.configuration(), {\n button: {\n wrapper: this.gateway.button.mini_cart_wrapper,\n style: this.gateway.button.mini_cart_style\n }\n });\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\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 payment_method: PaymentMethods.PAYPAL,\n funding_source: window.ppcpFundingSource,\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 handleChange() {\n if (!this.shouldRender()) {\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n this.renderer.hideButtons(this.gateway.button.wrapper);\n this.messages.hideMessages();\n return;\n }\n\n this.render();\n }\n\n init() {\n document.querySelector('form.cart').addEventListener('change', this.handleChange.bind(this));\n\n if (!this.shouldRender()) {\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n this.messages.hideMessages();\n return;\n }\n\n this.render();\n }\n\n shouldRender() {\n return document.querySelector('form.cart') !== null && !this.priceAmountIsZero();\n }\n\n priceAmount() {\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 } else if (document.querySelector('.product .woocommerce-Price-amount')) {\n priceText = document.querySelector('.product .woocommerce-Price-amount').innerText;\n }\n\n priceText = priceText.replace(/,/g, '.');\n return parseFloat(priceText.replace(/([^\\d,\\.\\s]*)/g, ''));\n }\n\n priceAmountIsZero() {\n return this.priceAmount() === 0;\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 this.messages.renderWithAmount(this.priceAmount());\n }, () => {\n this.renderer.hideButtons(this.gateway.button.wrapper);\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n this.messages.hideMessages();\n }, document.querySelector('form.cart'), new modules_ErrorHandler(this.gateway.labels.error.generic));\n this.renderer.render(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(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 errorHandler.clear();\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 funding_source: window.ppcpFundingSource\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\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 formData = new FormData(document.querySelector(formSelector)); // will not handle fields with multiple values (checkboxes, <select multiple>), but we do not care about this here\n\n const formJsonObj = Object.fromEntries(formData);\n const createaccount = jQuery('#createaccount').is(\":checked\") ? true : false;\n const paymentMethod = getCurrentPaymentMethod();\n const fundingSource = window.ppcpFundingSource;\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 payment_method: paymentMethod,\n funding_source: fundingSource,\n form: formJsonObj,\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.clear();\n\n if (data.data.details.length > 0) {\n errorHandler.message(data.data.details.map(d => `${d.issue} ${d.description}`).join('<br/>'), true);\n } else {\n errorHandler.message(data.data.message, true);\n }\n }\n\n throw new Error(data.data.message);\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/Helper/Hiding.js\nconst getElement = selectorOrElement => {\n if (typeof selectorOrElement === 'string') {\n return document.querySelector(selectorOrElement);\n }\n\n return selectorOrElement;\n};\n\nconst isVisible = element => {\n return !!(element.offsetWidth || element.offsetHeight || element.getClientRects().length);\n};\nconst setVisible = (selectorOrElement, show, important = false) => {\n const element = getElement(selectorOrElement);\n\n if (!element) {\n return;\n }\n\n const currentValue = element.style.getPropertyValue('display');\n\n if (!show) {\n if (currentValue === 'none') {\n return;\n }\n\n element.style.setProperty('display', 'none', important ? 'important' : '');\n } else {\n if (currentValue === 'none') {\n element.style.removeProperty('display');\n } // still not visible (if something else added display: none in CSS)\n\n\n if (!isVisible(element)) {\n element.style.setProperty('display', 'block');\n }\n }\n};\nconst hide = (selectorOrElement, important = false) => {\n setVisible(selectorOrElement, false, important);\n};\nconst show = selectorOrElement => {\n setVisible(selectorOrElement, true);\n};\n;// CONCATENATED MODULE: ./resources/js/modules/ContextBootstrap/CheckoutBootstap.js\n\n\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 this.standardOrderButtonSelector = ORDER_BUTTON_SELECTOR;\n this.buttonChangeObserver = new MutationObserver(el => {\n this.updateUi();\n });\n }\n\n init() {\n this.render(); // Unselect saved card.\n // WC saves form values, so with our current UI it would be a bit weird\n // if the user paid with saved, then after some time tries to pay again,\n // but wants to enter a new card, and to do that they have to choose “Select payment” in the list.\n\n jQuery('#saved-credit-card').val(jQuery('#saved-credit-card option:first').val());\n jQuery(document.body).on('updated_checkout', () => {\n this.render();\n });\n jQuery(document.body).on('updated_checkout payment_method_selected', () => {\n this.updateUi();\n });\n jQuery(document).on('hosted_fields_loaded', () => {\n jQuery('#saved-credit-card').on('change', () => {\n this.updateUi();\n });\n });\n this.updateUi();\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(actionHandler.configuration());\n this.buttonChangeObserver.observe(document.querySelector(this.standardOrderButtonSelector), {\n attributes: true\n });\n }\n\n updateUi() {\n const currentPaymentMethod = getCurrentPaymentMethod();\n const isPaypal = currentPaymentMethod === PaymentMethods.PAYPAL;\n const isCard = currentPaymentMethod === PaymentMethods.CARDS;\n const isSeparateButtonGateway = [PaymentMethods.CARD_BUTTON].includes(currentPaymentMethod);\n const isSavedCard = isCard && isSavedCardSelected();\n const isNotOurGateway = !isPaypal && !isCard && !isSeparateButtonGateway;\n const isFreeTrial = PayPalCommerceGateway.is_free_trial_cart;\n const hasVaultedPaypal = PayPalCommerceGateway.vaulted_paypal_email !== '';\n const paypalButtonWrappers = { ...Object.entries(PayPalCommerceGateway.separate_buttons).reduce((result, [k, data]) => {\n return { ...result,\n [data.id]: data.wrapper\n };\n }, {})\n };\n setVisible(this.standardOrderButtonSelector, isPaypal && isFreeTrial && hasVaultedPaypal || isNotOurGateway || isSavedCard, true);\n setVisible('.ppcp-vaulted-paypal-details', isPaypal);\n setVisible(this.gateway.button.wrapper, isPaypal && !(isFreeTrial && hasVaultedPaypal));\n setVisible(this.gateway.messages.wrapper, isPaypal && !isFreeTrial);\n setVisible(this.gateway.hosted_fields.wrapper, isCard && !isSavedCard);\n\n for (const [gatewayId, wrapper] of Object.entries(paypalButtonWrappers)) {\n setVisible(wrapper, gatewayId === currentPaymentMethod);\n }\n\n if (isPaypal && !isFreeTrial) {\n this.messages.render();\n }\n\n if (isCard) {\n if (isSavedCard) {\n this.disableCreditCardFields();\n } else {\n this.enableCreditCardFields();\n }\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/Helper/Subscriptions.js\nconst isChangePaymentPage = () => {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.has('change_payment_method');\n};\n;// CONCATENATED MODULE: ./resources/js/modules/ContextBootstrap/PayNowBootstrap.js\n\n\n\nclass PayNowBootstrap extends ContextBootstrap_CheckoutBootstap {\n constructor(gateway, renderer, messages, spinner) {\n super(gateway, renderer, messages, spinner);\n }\n\n updateUi() {\n if (isChangePaymentPage()) {\n return;\n }\n\n super.updateUi();\n }\n\n}\n\n/* harmony default export */ const ContextBootstrap_PayNowBootstrap = (PayNowBootstrap);\n// EXTERNAL MODULE: ./node_modules/deepmerge/dist/cjs.js\nvar cjs = __webpack_require__(996);\nvar cjs_default = /*#__PURE__*/__webpack_require__.n(cjs);\n;// CONCATENATED MODULE: ./resources/js/modules/Renderer/Renderer.js\n\n\nclass Renderer {\n constructor(creditCardRenderer, defaultSettings, onSmartButtonClick, onSmartButtonsInit) {\n this.defaultSettings = defaultSettings;\n this.creditCardRenderer = creditCardRenderer;\n this.onSmartButtonClick = onSmartButtonClick;\n this.onSmartButtonsInit = onSmartButtonsInit;\n this.renderedSources = new Set();\n }\n\n render(contextConfig, settingsOverride = {}) {\n const settings = cjs_default()(this.defaultSettings, settingsOverride);\n const enabledSeparateGateways = Object.fromEntries(Object.entries(settings.separate_buttons).filter(([s, data]) => document.querySelector(data.wrapper)));\n const hasEnabledSeparateGateways = Object.keys(enabledSeparateGateways).length !== 0;\n\n if (!hasEnabledSeparateGateways) {\n this.renderButtons(settings.button.wrapper, settings.button.style, contextConfig, hasEnabledSeparateGateways);\n } else {\n // render each button separately\n for (const fundingSource of paypal.getFundingSources().filter(s => !(s in enabledSeparateGateways))) {\n let style = settings.button.style;\n\n if (fundingSource !== 'paypal') {\n style = {\n shape: style.shape\n };\n }\n\n this.renderButtons(settings.button.wrapper, style, contextConfig, hasEnabledSeparateGateways, fundingSource);\n }\n }\n\n this.creditCardRenderer.render(settings.hosted_fields.wrapper, contextConfig);\n\n for (const [fundingSource, data] of Object.entries(enabledSeparateGateways)) {\n this.renderButtons(data.wrapper, data.style, contextConfig, hasEnabledSeparateGateways, fundingSource);\n }\n }\n\n renderButtons(wrapper, style, contextConfig, hasEnabledSeparateGateways, fundingSource = null) {\n if (!document.querySelector(wrapper) || this.isAlreadyRendered(wrapper, fundingSource, hasEnabledSeparateGateways) || 'undefined' === typeof paypal.Buttons) {\n return;\n }\n\n if (fundingSource) {\n contextConfig.fundingSource = fundingSource;\n }\n\n const btn = paypal.Buttons({\n style,\n ...contextConfig,\n onClick: this.onSmartButtonClick,\n onInit: this.onSmartButtonsInit\n });\n\n if (!btn.isEligible()) {\n return;\n }\n\n btn.render(wrapper);\n this.renderedSources.add(wrapper + fundingSource ?? '');\n }\n\n isAlreadyRendered(wrapper, fundingSource, hasEnabledSeparateGateways) {\n // Simply check that has child nodes when we do not need to render buttons separately,\n // this will reduce the risk of breaking with different themes/plugins\n // and on the cart page (where we also do not need to render separately), which may fully reload this part of the page.\n // Ideally we should also find a way to detect such full reloads and remove the corresponding keys from the set.\n if (!hasEnabledSeparateGateways) {\n return document.querySelector(wrapper).hasChildNodes();\n }\n\n return this.renderedSources.has(wrapper + fundingSource ?? '');\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 newElement.setAttribute('class', original.className);\n Object.values(styles).forEach(prop => {\n if (!styles[prop] || !isNaN(prop) || prop === 'background-image') {\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\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 }\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 const buttonSelector = wrapper + ' button';\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\n if (!gateWayBox) {\n return;\n }\n\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 const className = this._cardNumberFiledCLassNameByCardType(event.cards[0].type);\n\n this._recreateElementClassAttribute(cardNumber, cardNumberField.className);\n\n if (event.fields.number.isValid) {\n cardNumber.classList.add(className);\n }\n });\n hostedFields.on('validityChange', event => {\n const formValid = Object.keys(event.fields).every(function (key) {\n return event.fields[key].isValid;\n });\n\n const className = this._cardNumberFiledCLassNameByCardType(event.cards[0].type);\n\n event.fields.number.isValid ? cardNumber.classList.add(className) : this._recreateElementClassAttribute(cardNumber, cardNumberField.className);\n this.formValid = formValid;\n });\n show(buttonSelector);\n\n if (document.querySelector(wrapper).getAttribute('data-ppcp-subscribed') !== true) {\n document.querySelector(buttonSelector).addEventListener('click', event => {\n event.preventDefault();\n\n this._submit(contextConfig);\n });\n document.querySelector(wrapper).setAttribute('data-ppcp-subscribed', 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.can_save_vault_token ? true : false;\n let vault = document.getElementById('ppcp-credit-card-vault') ? document.getElementById('ppcp-credit-card-vault').checked : save_card;\n\n if (this.defaultConfig.enforce_vault) {\n vault = true;\n }\n\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 if (this.defaultConfig.payer) {\n hostedFieldsData.cardholderName = this.defaultConfig.payer.name.given_name + ' ' + this.defaultConfig.payer.name.surname;\n }\n\n if (!hostedFieldsData.cardholderName) {\n const firstName = document.getElementById('billing_first_name') ? document.getElementById('billing_first_name').value : '';\n const lastName = document.getElementById('billing_last_name') ? document.getElementById('billing_last_name').value : '';\n hostedFieldsData.cardholderName = firstName + ' ' + lastName;\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 this.spinner.unblock();\n this.errorHandler.clear();\n\n if (err.details) {\n this.errorHandler.message(err.details.map(d => `${d.issue} ${d.description}`).join('<br/>'), true);\n }\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 _cardNumberFiledCLassNameByCardType(cardType) {\n return cardType === 'american-express' ? 'amex' : cardType.replace('-', '');\n }\n\n _recreateElementClassAttribute(element, newClassName) {\n element.removeAttribute('class');\n element.setAttribute('class', newClassName);\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 jQuery(document.body).on('updated_cart_totals', () => {\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\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 hideMessages() {\n const domElement = document.querySelector(this.config.wrapper);\n\n if (!domElement) {\n return false;\n }\n\n domElement.style.display = 'none';\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(target = 'form.woocommerce-checkout') {\n this.target = target;\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/modules/ActionHandler/FreeTrialHandler.js\n\n\n\nclass FreeTrialHandler {\n constructor(config, spinner, errorHandler) {\n this.config = config;\n this.spinner = spinner;\n this.errorHandler = errorHandler;\n }\n\n handle() {\n this.spinner.block();\n fetch(this.config.ajax.vault_paypal.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.vault_paypal.nonce,\n return_url: location.href\n })\n }).then(res => {\n return res.json();\n }).then(data => {\n if (!data.success) {\n this.spinner.unblock();\n console.error(data);\n this.errorHandler.message(data.data.message);\n throw Error(data.data.message);\n }\n\n location.href = data.data.approve_link;\n }).catch(error => {\n this.spinner.unblock();\n console.error(error);\n this.errorHandler.genericError();\n });\n }\n\n}\n\n/* harmony default export */ const ActionHandler_FreeTrialHandler = (FreeTrialHandler);\n;// CONCATENATED MODULE: ./resources/js/button.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // TODO: could be a good idea to have a separate spinner for each gateway,\n// but I think we care mainly about the script loading, so one spinner should be enough.\n\nconst buttonsSpinner = new Helper_Spinner(document.querySelector('.ppc-button-wrapper'));\nconst cardsSpinner = new Helper_Spinner('#ppcp-hosted-fields');\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 freeTrialHandler = new ActionHandler_FreeTrialHandler(PayPalCommerceGateway, spinner, errorHandler);\n\n const onSmartButtonClick = (data, actions) => {\n window.ppcpFundingSource = data.fundingSource;\n\n if (PayPalCommerceGateway.basic_checkout_validation_enabled) {\n // TODO: quick fix to get the error about empty form before attempting PayPal order\n // it should solve #513 for most of the users, but proper solution should be implemented later.\n const requiredFields = jQuery('form.woocommerce-checkout .validate-required:visible :input');\n requiredFields.each((i, input) => {\n jQuery(input).trigger('validate');\n });\n const invalidFields = Array.from(jQuery('form.woocommerce-checkout .validate-required.woocommerce-invalid:visible'));\n\n if (invalidFields.length) {\n const billingFieldsContainer = document.querySelector('.woocommerce-billing-fields');\n const shippingFieldsContainer = document.querySelector('.woocommerce-shipping-fields');\n const nameMessageMap = PayPalCommerceGateway.labels.error.required.elements;\n const messages = invalidFields.map(el => {\n const name = el.querySelector('[name]')?.getAttribute('name');\n\n if (name && name in nameMessageMap) {\n return nameMessageMap[name];\n }\n\n let label = el.querySelector('label').textContent.replaceAll('*', '').trim();\n\n if (billingFieldsContainer?.contains(el)) {\n label = PayPalCommerceGateway.labels.billing_field.replace('%s', label);\n }\n\n if (shippingFieldsContainer?.contains(el)) {\n label = PayPalCommerceGateway.labels.shipping_field.replace('%s', label);\n }\n\n return PayPalCommerceGateway.labels.error.required.field.replace('%s', `<strong>${label}</strong>`);\n }).filter(s => s.length > 2);\n errorHandler.clear();\n\n if (messages.length) {\n messages.forEach(s => errorHandler.message(s));\n } else {\n errorHandler.message(PayPalCommerceGateway.labels.error.required.generic);\n }\n\n return actions.reject();\n }\n }\n\n const form = document.querySelector('form.woocommerce-checkout');\n\n if (form) {\n jQuery('#ppcp-funding-source-form-input').remove();\n form.insertAdjacentHTML('beforeend', `<input type=\"hidden\" name=\"ppcp-funding-source\" value=\"${data.fundingSource}\" id=\"ppcp-funding-source-form-input\">`);\n }\n\n const isFreeTrial = PayPalCommerceGateway.is_free_trial_cart;\n\n if (isFreeTrial && data.fundingSource !== 'card') {\n freeTrialHandler.handle();\n return actions.reject();\n }\n };\n\n const onSmartButtonsInit = () => {\n buttonsSpinner.unblock();\n };\n\n const renderer = new Renderer_Renderer(creditCardRenderer, PayPalCommerceGateway, onSmartButtonClick, onSmartButtonsInit);\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 if (PayPalCommerceGateway.context !== 'checkout' && PayPalCommerceGateway.data_client_id.user === 0 && PayPalCommerceGateway.data_client_id.has_subscriptions) {\n return;\n }\n\n const paypalButtonGatewayIds = [PaymentMethods.PAYPAL, ...Object.entries(PayPalCommerceGateway.separate_buttons).map(([k, data]) => data.id)]; // Sometimes PayPal script takes long time to load,\n // so we additionally hide the standard order button here to avoid failed orders.\n // Normally it is hidden later after the script load.\n\n const hideOrderButtonIfPpcpGateway = () => {\n // only in checkout and pay now page, otherwise it may break things (e.g. payment via product page),\n // and also the loading spinner may look weird on other pages\n if (!['checkout', 'pay-now'].includes(PayPalCommerceGateway.context) || isChangePaymentPage() || PayPalCommerceGateway.is_free_trial_cart && PayPalCommerceGateway.vaulted_paypal_email !== '') {\n return;\n }\n\n const currentPaymentMethod = getCurrentPaymentMethod();\n const isPaypalButton = paypalButtonGatewayIds.includes(currentPaymentMethod);\n const isCards = currentPaymentMethod === PaymentMethods.CARDS;\n setVisible(ORDER_BUTTON_SELECTOR, !isPaypalButton && !isCards, true);\n\n if (isPaypalButton) {\n // stopped after the first rendering of the buttons, in onInit\n buttonsSpinner.block();\n } else {\n buttonsSpinner.unblock();\n }\n\n if (isCards) {\n cardsSpinner.block();\n } else {\n cardsSpinner.unblock();\n }\n };\n\n jQuery(document).on('hosted_fields_loaded', () => {\n cardsSpinner.unblock();\n });\n let bootstrapped = false;\n hideOrderButtonIfPpcpGateway();\n jQuery(document.body).on('updated_checkout payment_method_selected', () => {\n if (bootstrapped) {\n return;\n }\n\n hideOrderButtonIfPpcpGateway();\n });\n const script = document.createElement('script');\n script.addEventListener('load', event => {\n bootstrapped = true;\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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MVosRUFBQUEsTUFBTSxDQUFDdEIsUUFBUSxDQUFDMkMsSUFBVixDQUFOLENBQXNCb0UsRUFBdEIsQ0FBeUIsMENBQXpCLEVBQXFFLE1BQU07QUFDdkUsUUFBSW9VLFlBQUosRUFBa0I7QUFDZDtBQUNIOztBQUVESCxJQUFBQSw0QkFBNEI7QUFDL0IsR0FORDtBQVFBLFFBQU14RCxNQUFNLEdBQUd4WCxRQUFRLENBQUN3QixhQUFULENBQXVCLFFBQXZCLENBQWY7QUFDQWdXLEVBQUFBLE1BQU0sQ0FBQ3JOLGdCQUFQLENBQXdCLE1BQXhCLEVBQWlDcUssS0FBRCxJQUFXO0FBQ3ZDMkcsSUFBQUEsWUFBWSxHQUFHLElBQWY7QUFFQXBDLElBQUFBLFNBQVM7QUFDWixHQUpEO0FBS0F2QixFQUFBQSxNQUFNLENBQUMvVixZQUFQLENBQW9CLEtBQXBCLEVBQTJCdUMscUJBQXFCLENBQUNpRCxNQUF0QixDQUE2Qm1VLEdBQXhEO0FBQ0E1UCxFQUFBQSxNQUFNLENBQUNtRCxPQUFQLENBQWUzSyxxQkFBcUIsQ0FBQ3FYLGlCQUFyQyxFQUF3RC9SLE9BQXhELENBQ0tnUyxRQUFELElBQWM7QUFDVjlELElBQUFBLE1BQU0sQ0FBQy9WLFlBQVAsQ0FBb0I2WixRQUFRLENBQUMsQ0FBRCxDQUE1QixFQUFpQ0EsUUFBUSxDQUFDLENBQUQsQ0FBekM7QUFDSCxHQUhMOztBQU1BLE1BQUl0WCxxQkFBcUIsQ0FBQzZXLGNBQXRCLENBQXFDVSxhQUF6QyxFQUF3RDtBQUNwRGhFLElBQUFBLDRCQUE0QixDQUFDQyxNQUFELEVBQVN4VCxxQkFBcUIsQ0FBQzZXLGNBQS9CLENBQTVCO0FBQ0E7QUFDSDs7QUFFRDdhLEVBQUFBLFFBQVEsQ0FBQzJDLElBQVQsQ0FBYzhKLE1BQWQsQ0FBcUIrSyxNQUFyQjtBQUNILENBMUZMIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0Vycm9ySGFuZGxlci5qcz9lNjVhIiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9PbkFwcHJvdmVIYW5kbGVyL29uQXBwcm92ZUZvckNvbnRpbnVlLmpzP2M0NTQiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0hlbHBlci9QYXllckRhdGEuanM/MmFmMSIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvSGVscGVyL0NoZWNrb3V0TWV0aG9kU3RhdGUuanM/ODBhMyIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvQWN0aW9uSGFuZGxlci9DYXJ0QWN0aW9uSGFuZGxlci5qcz84MmNmIiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9Db250ZXh0Qm9vdHN0cmFwL01pbmlDYXJ0Qm9vdHN0YXAuanM/ZDU1MiIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvSGVscGVyL1VwZGF0ZUNhcnQuanM/ZTQyMiIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvSGVscGVyL0J1dHRvbnNUb2dnbGVMaXN0ZW5lci5qcz9lMTkzIiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9FbnRpdHkvUHJvZHVjdC5qcz85ZmZmIiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9BY3Rpb25IYW5kbGVyL1NpbmdsZVByb2R1Y3RBY3Rpb25IYW5kbGVyLmpzP2Q5YjciLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0NvbnRleHRCb290c3RyYXAvU2luZ2xlUHJvZHVjdEJvb3RzdGFwLmpzPzdjMTkiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0NvbnRleHRCb290c3RyYXAvQ2FydEJvb3RzdGFwLmpzPzVlOTQiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL09uQXBwcm92ZUhhbmRsZXIvb25BcHByb3ZlRm9yUGF5Tm93LmpzPzkzMDUiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0FjdGlvbkhhbmRsZXIvQ2hlY2tvdXRBY3Rpb25IYW5kbGVyLmpzPzg1MTUiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0hlbHBlci9IaWRpbmcuanM/MWQzNiIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvQ29udGV4dEJvb3RzdHJhcC9DaGVja291dEJvb3RzdGFwLmpzP2M4NTUiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0hlbHBlci9TdWJzY3JpcHRpb25zLmpzP2I4NzAiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0NvbnRleHRCb290c3RyYXAvUGF5Tm93Qm9vdHN0cmFwLmpzP2Q5ZjUiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL1JlbmRlcmVyL1JlbmRlcmVyLmpzP2ZhOTMiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0hlbHBlci9EY2NJbnB1dEZhY3RvcnkuanM/MmEyZiIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvUmVuZGVyZXIvQ3JlZGl0Q2FyZFJlbmRlcmVyLmpzPzM4N2EiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0RhdGFDbGllbnRJZEF0dHJpYnV0ZUhhbmRsZXIuanM/ZWUwYiIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvUmVuZGVyZXIvTWVzc2FnZVJlbmRlcmVyLmpzP2NkMDIiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0hlbHBlci9TcGlubmVyLmpzPzE3MDgiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0FjdGlvbkhhbmRsZXIvRnJlZVRyaWFsSGFuZGxlci5qcz9hYjc3Iiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvYnV0dG9uLmpzPzA2MGYiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgRXJyb3JIYW5kbGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKGdlbmVyaWNFcnJvclRleHQpXG4gICAge1xuICAgICAgICB0aGlzLmdlbmVyaWNFcnJvclRleHQgPSBnZW5lcmljRXJyb3JUZXh0O1xuICAgICAgICB0aGlzLndyYXBwZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud29vY29tbWVyY2Utbm90aWNlcy13cmFwcGVyJyk7XG4gICAgICAgIHRoaXMubWVzc2FnZXNMaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndWwud29vY29tbWVyY2UtZXJyb3InKTtcbiAgICB9XG5cbiAgICBnZW5lcmljRXJyb3IoKSB7XG4gICAgICAgIGlmICh0aGlzLndyYXBwZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdwcGNwLXBlcnNpc3QnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlKHRoaXMuZ2VuZXJpY0Vycm9yVGV4dClcbiAgICB9XG5cbiAgICBhcHBlbmRQcmVwYXJlZEVycm9yTWVzc2FnZUVsZW1lbnQoZXJyb3JNZXNzYWdlRWxlbWVudClcbiAgICB7XG4gICAgICAgIGlmKHRoaXMubWVzc2FnZXNMaXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVNZXNzYWdlc0xpc3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWVzc2FnZXNMaXN0LnJlcGxhY2VXaXRoKGVycm9yTWVzc2FnZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIG1lc3NhZ2UodGV4dCwgcGVyc2lzdCA9IGZhbHNlKVxuICAgIHtcbiAgICAgICAgaWYoISB0eXBlb2YgU3RyaW5nIHx8IHRleHQubGVuZ3RoID09PSAwKXtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSBuZXcgbWVzc2FnZSB0ZXh0IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYodGhpcy5tZXNzYWdlc0xpc3QgPT09IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlTWVzc2FnZXNMaXN0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGVyc2lzdCkge1xuICAgICAgICAgICAgdGhpcy53cmFwcGVyLmNsYXNzTGlzdC5hZGQoJ3BwY3AtcGVyc2lzdCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53cmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ3BwY3AtcGVyc2lzdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1lc3NhZ2VOb2RlID0gdGhpcy5wcmVwYXJlTWVzc2FnZXNMaXN0SXRlbSh0ZXh0KTtcbiAgICAgICAgdGhpcy5tZXNzYWdlc0xpc3QuYXBwZW5kQ2hpbGQobWVzc2FnZU5vZGUpO1xuXG4gICAgICAgIGpRdWVyeS5zY3JvbGxfdG9fbm90aWNlcyhqUXVlcnkoJy53b29jb21tZXJjZS1ub3RpY2VzLXdyYXBwZXInKSlcbiAgICB9XG5cbiAgICBwcmVwYXJlTWVzc2FnZXNMaXN0KClcbiAgICB7XG4gICAgICAgIGlmKHRoaXMubWVzc2FnZXNMaXN0ID09PSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXNMaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKTtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXNMaXN0LnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnd29vY29tbWVyY2UtZXJyb3InKTtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXNMaXN0LnNldEF0dHJpYnV0ZSgncm9sZScsICdhbGVydCcpO1xuICAgICAgICAgICAgdGhpcy53cmFwcGVyLmFwcGVuZENoaWxkKHRoaXMubWVzc2FnZXNMaXN0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByZXBhcmVNZXNzYWdlc0xpc3RJdGVtKG1lc3NhZ2UpXG4gICAge1xuICAgICAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgICAgIGxpLmlubmVySFRNTCA9IG1lc3NhZ2U7XG5cbiAgICAgICAgcmV0dXJuIGxpO1xuICAgIH1cblxuICAgIHNhbml0aXplKHRleHQpXG4gICAge1xuICAgICAgICBjb25zdCB0ZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgICAgIHRleHRhcmVhLmlubmVySFRNTCA9IHRleHQ7XG4gICAgICAgIHJldHVybiB0ZXh0YXJlYS52YWx1ZS5yZXBsYWNlKCdFcnJvcjogJywgJycpO1xuICAgIH1cblxuICAgIGNsZWFyKClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VzTGlzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZXNzYWdlc0xpc3QuaW5uZXJIVE1MID0gJyc7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFcnJvckhhbmRsZXI7XG4iLCJjb25zdCBvbkFwcHJvdmUgPSAoY29udGV4dCwgZXJyb3JIYW5kbGVyKSA9PiB7XG4gICAgcmV0dXJuIChkYXRhLCBhY3Rpb25zKSA9PiB7XG4gICAgICAgIHJldHVybiBmZXRjaChjb250ZXh0LmNvbmZpZy5hamF4LmFwcHJvdmVfb3JkZXIuZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIG5vbmNlOiBjb250ZXh0LmNvbmZpZy5hamF4LmFwcHJvdmVfb3JkZXIubm9uY2UsXG4gICAgICAgICAgICAgICAgb3JkZXJfaWQ6ZGF0YS5vcmRlcklELFxuICAgICAgICAgICAgICAgIGZ1bmRpbmdfc291cmNlOiB3aW5kb3cucHBjcEZ1bmRpbmdTb3VyY2UsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KS50aGVuKChyZXMpPT57XG4gICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgICAgICAgfSkudGhlbigoZGF0YSk9PntcbiAgICAgICAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyLmdlbmVyaWNFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb25zLnJlc3RhcnQoKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIuZ2VuZXJpY0Vycm9yKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gY29udGV4dC5jb25maWcucmVkaXJlY3Q7XG4gICAgICAgIH0pO1xuXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBvbkFwcHJvdmU7XG4iLCJleHBvcnQgY29uc3QgcGF5ZXJEYXRhID0gKCkgPT4ge1xuICAgIGNvbnN0IHBheWVyID0gUGF5UGFsQ29tbWVyY2VHYXRld2F5LnBheWVyO1xuICAgIGlmICghIHBheWVyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHBob25lID0gKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX3Bob25lJykgfHwgdHlwZW9mIHBheWVyLnBob25lICE9PSAndW5kZWZpbmVkJykgP1xuICAgIHtcbiAgICAgICAgcGhvbmVfdHlwZTpcIkhPTUVcIixcbiAgICAgICAgICAgIHBob25lX251bWJlcjp7XG4gICAgICAgICAgICBuYXRpb25hbF9udW1iZXIgOiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfcGhvbmUnKSkgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19waG9uZScpLnZhbHVlIDogcGF5ZXIucGhvbmUucGhvbmVfbnVtYmVyLm5hdGlvbmFsX251bWJlclxuICAgICAgICB9XG4gICAgfSA6IG51bGw7XG4gICAgY29uc3QgcGF5ZXJEYXRhID0ge1xuICAgICAgICBlbWFpbF9hZGRyZXNzOihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19lbWFpbCcpKSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX2VtYWlsJykudmFsdWUgOiBwYXllci5lbWFpbF9hZGRyZXNzLFxuICAgICAgICBuYW1lIDoge1xuICAgICAgICAgICAgc3VybmFtZTogKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX2xhc3RfbmFtZScpKSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX2xhc3RfbmFtZScpLnZhbHVlIDogcGF5ZXIubmFtZS5zdXJuYW1lLFxuICAgICAgICAgICAgZ2l2ZW5fbmFtZTogKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX2ZpcnN0X25hbWUnKSkgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19maXJzdF9uYW1lJykudmFsdWUgOiBwYXllci5uYW1lLmdpdmVuX25hbWVcbiAgICAgICAgfSxcbiAgICAgICAgYWRkcmVzcyA6IHtcbiAgICAgICAgICAgIGNvdW50cnlfY29kZSA6IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19jb3VudHJ5JykpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfY291bnRyeScpLnZhbHVlIDogcGF5ZXIuYWRkcmVzcy5jb3VudHJ5X2NvZGUsXG4gICAgICAgICAgICBhZGRyZXNzX2xpbmVfMSA6IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19hZGRyZXNzXzEnKSkgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19hZGRyZXNzXzEnKS52YWx1ZSA6IHBheWVyLmFkZHJlc3MuYWRkcmVzc19saW5lXzEsXG4gICAgICAgICAgICBhZGRyZXNzX2xpbmVfMiA6IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19hZGRyZXNzXzInKSkgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19hZGRyZXNzXzInKS52YWx1ZSA6IHBheWVyLmFkZHJlc3MuYWRkcmVzc19saW5lXzIsXG4gICAgICAgICAgICBhZG1pbl9hcmVhXzEgOiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfc3RhdGUnKSkgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19zdGF0ZScpLnZhbHVlIDogcGF5ZXIuYWRkcmVzcy5hZG1pbl9hcmVhXzEsXG4gICAgICAgICAgICBhZG1pbl9hcmVhXzIgOiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfY2l0eScpKSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX2NpdHknKS52YWx1ZSA6IHBheWVyLmFkZHJlc3MuYWRtaW5fYXJlYV8yLFxuICAgICAgICAgICAgcG9zdGFsX2NvZGUgOiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfcG9zdGNvZGUnKSkgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19wb3N0Y29kZScpLnZhbHVlIDogcGF5ZXIuYWRkcmVzcy5wb3N0YWxfY29kZVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIGlmIChwaG9uZSkge1xuICAgICAgICBwYXllckRhdGEucGhvbmUgPSBwaG9uZTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWVyRGF0YTtcbn1cbiIsImV4cG9ydCBjb25zdCBQYXltZW50TWV0aG9kcyA9IHtcbiAgICBQQVlQQUw6ICdwcGNwLWdhdGV3YXknLFxuICAgIENBUkRTOiAncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5JyxcbiAgICBPWFhPOiAncHBjcC1veHhvLWdhdGV3YXknLFxuICAgIENBUkRfQlVUVE9OOiAncHBjcC1jYXJkLWJ1dHRvbi1nYXRld2F5Jyxcbn07XG5cbmV4cG9ydCBjb25zdCBPUkRFUl9CVVRUT05fU0VMRUNUT1IgPSAnI3BsYWNlX29yZGVyJztcblxuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRQYXltZW50TWV0aG9kID0gKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInBheW1lbnRfbWV0aG9kXCJdOmNoZWNrZWQnKTtcbiAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBlbC52YWx1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1NhdmVkQ2FyZFNlbGVjdGVkID0gKCkgPT4ge1xuICAgIGNvbnN0IHNhdmVkQ2FyZExpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2F2ZWQtY3JlZGl0LWNhcmQnKTtcbiAgICByZXR1cm4gc2F2ZWRDYXJkTGlzdCAmJiBzYXZlZENhcmRMaXN0LnZhbHVlICE9PSAnJztcbn07XG4iLCJpbXBvcnQgb25BcHByb3ZlIGZyb20gJy4uL09uQXBwcm92ZUhhbmRsZXIvb25BcHByb3ZlRm9yQ29udGludWUuanMnO1xuaW1wb3J0IHtwYXllckRhdGF9IGZyb20gXCIuLi9IZWxwZXIvUGF5ZXJEYXRhXCI7XG5pbXBvcnQge1BheW1lbnRNZXRob2RzfSBmcm9tIFwiLi4vSGVscGVyL0NoZWNrb3V0TWV0aG9kU3RhdGVcIjtcblxuY2xhc3MgQ2FydEFjdGlvbkhhbmRsZXIge1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnLCBlcnJvckhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyO1xuICAgIH1cblxuICAgIGNvbmZpZ3VyYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZU9yZGVyID0gKGRhdGEsIGFjdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBheWVyID0gcGF5ZXJEYXRhKCk7XG4gICAgICAgICAgICBjb25zdCBibkNvZGUgPSB0eXBlb2YgdGhpcy5jb25maWcuYm5fY29kZXNbdGhpcy5jb25maWcuY29udGV4dF0gIT09ICd1bmRlZmluZWQnID9cbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5ibl9jb2Rlc1t0aGlzLmNvbmZpZy5jb250ZXh0XSA6ICcnO1xuICAgICAgICAgICAgcmV0dXJuIGZldGNoKHRoaXMuY29uZmlnLmFqYXguY3JlYXRlX29yZGVyLmVuZHBvaW50LCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICBub25jZTogdGhpcy5jb25maWcuYWpheC5jcmVhdGVfb3JkZXIubm9uY2UsXG4gICAgICAgICAgICAgICAgICAgIHB1cmNoYXNlX3VuaXRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgcGF5bWVudF9tZXRob2Q6IFBheW1lbnRNZXRob2RzLlBBWVBBTCxcbiAgICAgICAgICAgICAgICAgICAgZnVuZGluZ19zb3VyY2U6IHdpbmRvdy5wcGNwRnVuZGluZ1NvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgYm5fY29kZTpibkNvZGUsXG4gICAgICAgICAgICAgICAgICAgIHBheWVyLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OnRoaXMuY29uZmlnLmNvbnRleHRcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24ocmVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XG4gICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihkYXRhLmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGEuaWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3JlYXRlT3JkZXIsXG4gICAgICAgICAgICBvbkFwcHJvdmU6IG9uQXBwcm92ZSh0aGlzLCB0aGlzLmVycm9ySGFuZGxlciksXG4gICAgICAgICAgICBvbkVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5nZW5lcmljRXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENhcnRBY3Rpb25IYW5kbGVyO1xuIiwiaW1wb3J0IEVycm9ySGFuZGxlciBmcm9tICcuLi9FcnJvckhhbmRsZXInO1xuaW1wb3J0IENhcnRBY3Rpb25IYW5kbGVyIGZyb20gJy4uL0FjdGlvbkhhbmRsZXIvQ2FydEFjdGlvbkhhbmRsZXInO1xuXG5jbGFzcyBNaW5pQ2FydEJvb3RzdGFwIHtcbiAgICBjb25zdHJ1Y3RvcihnYXRld2F5LCByZW5kZXJlcikge1xuICAgICAgICB0aGlzLmdhdGV3YXkgPSBnYXRld2F5O1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgIHRoaXMuYWN0aW9uSGFuZGxlciA9IG51bGw7XG4gICAgfVxuXG4gICAgaW5pdCgpIHtcblxuICAgICAgICB0aGlzLmFjdGlvbkhhbmRsZXIgPSBuZXcgQ2FydEFjdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICBQYXlQYWxDb21tZXJjZUdhdGV3YXksXG4gICAgICAgICAgICBuZXcgRXJyb3JIYW5kbGVyKHRoaXMuZ2F0ZXdheS5sYWJlbHMuZXJyb3IuZ2VuZXJpYyksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgICAgICAgalF1ZXJ5KGRvY3VtZW50LmJvZHkpLm9uKCd3Y19mcmFnbWVudHNfbG9hZGVkIHdjX2ZyYWdtZW50c19yZWZyZXNoZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzaG91bGRSZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZ2F0ZXdheS5idXR0b24ubWluaV9jYXJ0X3dyYXBwZXIpICE9PSBudWxsXG4gICAgICAgICAgICB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZ2F0ZXdheS5ob3N0ZWRfZmllbGRzLm1pbmlfY2FydF93cmFwcGVyKSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5zaG91bGRSZW5kZXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIoXG4gICAgICAgICAgICB0aGlzLmFjdGlvbkhhbmRsZXIuY29uZmlndXJhdGlvbigpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGJ1dHRvbjoge1xuICAgICAgICAgICAgICAgICAgICB3cmFwcGVyOiB0aGlzLmdhdGV3YXkuYnV0dG9uLm1pbmlfY2FydF93cmFwcGVyLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogdGhpcy5nYXRld2F5LmJ1dHRvbi5taW5pX2NhcnRfc3R5bGUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1pbmlDYXJ0Qm9vdHN0YXA7XG4iLCJpbXBvcnQgUHJvZHVjdCBmcm9tIFwiLi4vRW50aXR5L1Byb2R1Y3RcIjtcbmNsYXNzIFVwZGF0ZUNhcnQge1xuXG4gICAgY29uc3RydWN0b3IoZW5kcG9pbnQsIG5vbmNlKVxuICAgIHtcbiAgICAgICAgdGhpcy5lbmRwb2ludCA9IGVuZHBvaW50O1xuICAgICAgICB0aGlzLm5vbmNlID0gbm9uY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb25SZXNvbHZlXG4gICAgICogQHBhcmFtIHtQcm9kdWN0W119IHByb2R1Y3RzXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gICAgICovXG4gICAgdXBkYXRlKG9uUmVzb2x2ZSwgcHJvZHVjdHMpXG4gICAge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgZmV0Y2goXG4gICAgICAgICAgICAgICAgdGhpcy5lbmRwb2ludCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBub25jZTogdGhpcy5ub25jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICkudGhlbihcbiAgICAgICAgICAgICAgICAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qc29uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoISByZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QocmVzdWx0LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gb25SZXNvbHZlKHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBVcGRhdGVDYXJ0OyIsIi8qKlxuICogV2hlbiB5b3UgY2FuJ3QgYWRkIHNvbWV0aGluZyB0byB0aGUgY2FydCwgdGhlIFBheVBhbCBidXR0b25zIHNob3VsZCBub3Qgc2hvdy5cbiAqIFRoZXJlZm9yZSB3ZSBsaXN0ZW4gZm9yIGNoYW5nZXMgb24gdGhlIGFkZCB0byBjYXJ0IGJ1dHRvbiBhbmQgc2hvdy9oaWRlIHRoZSBidXR0b25zIGFjY29yZGluZ2x5LlxuICovXG5cbmNsYXNzIEJ1dHRvbnNUb2dnbGVMaXN0ZW5lciB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgc2hvd0NhbGxiYWNrLCBoaWRlQ2FsbGJhY2spXG4gICAge1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLnNob3dDYWxsYmFjayA9IHNob3dDYWxsYmFjaztcbiAgICAgICAgdGhpcy5oaWRlQ2FsbGJhY2sgPSBoaWRlQ2FsbGJhY2s7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGluaXQoKVxuICAgIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0geyBhdHRyaWJ1dGVzIDogdHJ1ZSB9O1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlQ2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNob3dDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjayk7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnQsIGNvbmZpZyk7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgZGlzY29ubmVjdCgpXG4gICAge1xuICAgICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbnNUb2dnbGVMaXN0ZW5lcjsiLCJjbGFzcyBQcm9kdWN0IHtcblxuICAgIGNvbnN0cnVjdG9yKGlkLCBxdWFudGl0eSwgdmFyaWF0aW9ucykge1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMucXVhbnRpdHkgPSBxdWFudGl0eTtcbiAgICAgICAgdGhpcy52YXJpYXRpb25zID0gdmFyaWF0aW9ucztcbiAgICB9XG5cbiAgICBkYXRhKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6dGhpcy5pZCxcbiAgICAgICAgICAgIHF1YW50aXR5OnRoaXMucXVhbnRpdHksXG4gICAgICAgICAgICB2YXJpYXRpb25zOnRoaXMudmFyaWF0aW9uc1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQcm9kdWN0OyIsImltcG9ydCBCdXR0b25zVG9nZ2xlTGlzdGVuZXIgZnJvbSAnLi4vSGVscGVyL0J1dHRvbnNUb2dnbGVMaXN0ZW5lcic7XG5pbXBvcnQgUHJvZHVjdCBmcm9tICcuLi9FbnRpdHkvUHJvZHVjdCc7XG5pbXBvcnQgb25BcHByb3ZlIGZyb20gJy4uL09uQXBwcm92ZUhhbmRsZXIvb25BcHByb3ZlRm9yQ29udGludWUnO1xuaW1wb3J0IHtwYXllckRhdGF9IGZyb20gXCIuLi9IZWxwZXIvUGF5ZXJEYXRhXCI7XG5pbXBvcnQge1BheW1lbnRNZXRob2RzfSBmcm9tIFwiLi4vSGVscGVyL0NoZWNrb3V0TWV0aG9kU3RhdGVcIjtcblxuY2xhc3MgU2luZ2xlUHJvZHVjdEFjdGlvbkhhbmRsZXIge1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdXBkYXRlQ2FydCxcbiAgICAgICAgc2hvd0J1dHRvbkNhbGxiYWNrLFxuICAgICAgICBoaWRlQnV0dG9uQ2FsbGJhY2ssXG4gICAgICAgIGZvcm1FbGVtZW50LFxuICAgICAgICBlcnJvckhhbmRsZXJcbiAgICApIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMudXBkYXRlQ2FydCA9IHVwZGF0ZUNhcnQ7XG4gICAgICAgIHRoaXMuc2hvd0J1dHRvbkNhbGxiYWNrID0gc2hvd0J1dHRvbkNhbGxiYWNrO1xuICAgICAgICB0aGlzLmhpZGVCdXR0b25DYWxsYmFjayA9IGhpZGVCdXR0b25DYWxsYmFjaztcbiAgICAgICAgdGhpcy5mb3JtRWxlbWVudCA9IGZvcm1FbGVtZW50O1xuICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjtcbiAgICB9XG5cbiAgICBjb25maWd1cmF0aW9uKClcbiAgICB7XG5cbiAgICAgICAgaWYgKCB0aGlzLmhhc1ZhcmlhdGlvbnMoKSApIHtcbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEJ1dHRvbnNUb2dnbGVMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaW5nbGVfYWRkX3RvX2NhcnRfYnV0dG9uJyksXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93QnV0dG9uQ2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlQnV0dG9uQ2FsbGJhY2tcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBvYnNlcnZlci5pbml0KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3JlYXRlT3JkZXI6IHRoaXMuY3JlYXRlT3JkZXIoKSxcbiAgICAgICAgICAgIG9uQXBwcm92ZTogb25BcHByb3ZlKHRoaXMsIHRoaXMuZXJyb3JIYW5kbGVyKSxcbiAgICAgICAgICAgIG9uRXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmdlbmVyaWNFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlT3JkZXIoKVxuICAgIHtcbiAgICAgICAgdmFyIGdldFByb2R1Y3RzID0gbnVsbDtcbiAgICAgICAgaWYgKCEgdGhpcy5pc0dyb3VwZWRQcm9kdWN0KCkgKSB7XG4gICAgICAgICAgICBnZXRQcm9kdWN0cyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPVwiYWRkLXRvLWNhcnRcIl0nKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBxdHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbbmFtZT1cInF1YW50aXR5XCJdJykudmFsdWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFyaWF0aW9ucyA9IHRoaXMudmFyaWF0aW9ucygpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbbmV3IFByb2R1Y3QoaWQsIHF0eSwgdmFyaWF0aW9ucyldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UHJvZHVjdHMgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZHVjdHMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9XCJudW1iZXJcIl0nKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIGVsZW1lbnQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50TmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJykubWF0Y2goL3F1YW50aXR5XFxbKFtcXGRdKilcXF0vKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gcGFyc2VJbnQoZWxlbWVudE5hbWVbMV0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWFudGl0eSA9IHBhcnNlSW50KGVsZW1lbnQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBwcm9kdWN0cy5wdXNoKG5ldyBQcm9kdWN0KGlkLCBxdWFudGl0eSwgbnVsbCkpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3RzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNyZWF0ZU9yZGVyID0gKGRhdGEsIGFjdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmNsZWFyKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9uUmVzb2x2ZSA9IChwdXJjaGFzZV91bml0cykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBheWVyID0gcGF5ZXJEYXRhKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYm5Db2RlID0gdHlwZW9mIHRoaXMuY29uZmlnLmJuX2NvZGVzW3RoaXMuY29uZmlnLmNvbnRleHRdICE9PSAndW5kZWZpbmVkJyA/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmJuX2NvZGVzW3RoaXMuY29uZmlnLmNvbnRleHRdIDogJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKHRoaXMuY29uZmlnLmFqYXguY3JlYXRlX29yZGVyLmVuZHBvaW50LCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBub25jZTogdGhpcy5jb25maWcuYWpheC5jcmVhdGVfb3JkZXIubm9uY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXJjaGFzZV91bml0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm5fY29kZTpibkNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXltZW50X21ldGhvZDogUGF5bWVudE1ldGhvZHMuUEFZUEFMLFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVuZGluZ19zb3VyY2U6IHdpbmRvdy5wcGNwRnVuZGluZ1NvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6dGhpcy5jb25maWcuY29udGV4dFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoZGF0YS5kYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGEuaWQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy51cGRhdGVDYXJ0LnVwZGF0ZShvblJlc29sdmUsIGdldFByb2R1Y3RzKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBjcmVhdGVPcmRlcjtcbiAgICB9XG5cbiAgICB2YXJpYXRpb25zKClcbiAgICB7XG5cbiAgICAgICAgaWYgKCEgdGhpcy5oYXNWYXJpYXRpb25zKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbLi4udGhpcy5mb3JtRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW25hbWVePSdhdHRyaWJ1dGVfJ11cIildLm1hcChcbiAgICAgICAgICAgIChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTplbGVtZW50LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOmVsZW1lbnQubmFtZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgaGFzVmFyaWF0aW9ucygpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3ZhcmlhdGlvbnNfZm9ybScpO1xuICAgIH1cblxuICAgIGlzR3JvdXBlZFByb2R1Y3QoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdncm91cGVkX2Zvcm0nKTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBTaW5nbGVQcm9kdWN0QWN0aW9uSGFuZGxlcjtcbiIsImltcG9ydCBFcnJvckhhbmRsZXIgZnJvbSAnLi4vRXJyb3JIYW5kbGVyJztcbmltcG9ydCBVcGRhdGVDYXJ0IGZyb20gXCIuLi9IZWxwZXIvVXBkYXRlQ2FydFwiO1xuaW1wb3J0IFNpbmdsZVByb2R1Y3RBY3Rpb25IYW5kbGVyIGZyb20gXCIuLi9BY3Rpb25IYW5kbGVyL1NpbmdsZVByb2R1Y3RBY3Rpb25IYW5kbGVyXCI7XG5cbmNsYXNzIFNpbmdsZVByb2R1Y3RCb290c3RhcCB7XG4gICAgY29uc3RydWN0b3IoZ2F0ZXdheSwgcmVuZGVyZXIsIG1lc3NhZ2VzKSB7XG4gICAgICAgIHRoaXMuZ2F0ZXdheSA9IGdhdGV3YXk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5tZXNzYWdlcyA9IG1lc3NhZ2VzO1xuICAgIH1cblxuXG4gICAgaGFuZGxlQ2hhbmdlKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkUmVuZGVyKCkpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUJ1dHRvbnModGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlcik7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmhpZGVCdXR0b25zKHRoaXMuZ2F0ZXdheS5idXR0b24ud3JhcHBlcik7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzLmhpZGVNZXNzYWdlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBpbml0KCkge1xuXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0uY2FydCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuaGFuZGxlQ2hhbmdlLmJpbmQodGhpcykpXG5cbiAgICAgICAgaWYgKCF0aGlzLnNob3VsZFJlbmRlcigpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmhpZGVCdXR0b25zKHRoaXMuZ2F0ZXdheS5ob3N0ZWRfZmllbGRzLndyYXBwZXIpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlcy5oaWRlTWVzc2FnZXMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgICB9XG5cbiAgICBzaG91bGRSZW5kZXIoKSB7XG5cbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0uY2FydCcpICE9PSBudWxsICYmICF0aGlzLnByaWNlQW1vdW50SXNaZXJvKCk7XG5cbiAgICB9XG5cbiAgICBwcmljZUFtb3VudCgpIHtcblxuICAgICAgICBsZXQgcHJpY2VUZXh0ID0gXCIwXCI7XG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtLmNhcnQgaW5zIC53b29jb21tZXJjZS1QcmljZS1hbW91bnQnKSkge1xuICAgICAgICAgICAgcHJpY2VUZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZm9ybS5jYXJ0IGlucyAud29vY29tbWVyY2UtUHJpY2UtYW1vdW50JykuaW5uZXJUZXh0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0uY2FydCAud29vY29tbWVyY2UtUHJpY2UtYW1vdW50JykpIHtcbiAgICAgICAgICAgIHByaWNlVGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0uY2FydCAud29vY29tbWVyY2UtUHJpY2UtYW1vdW50JykuaW5uZXJUZXh0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wcm9kdWN0IC53b29jb21tZXJjZS1QcmljZS1hbW91bnQnKSkge1xuICAgICAgICAgICAgcHJpY2VUZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnByb2R1Y3QgLndvb2NvbW1lcmNlLVByaWNlLWFtb3VudCcpLmlubmVyVGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaWNlVGV4dCA9IHByaWNlVGV4dC5yZXBsYWNlKC8sL2csICcuJyk7XG5cbiAgICAgICAgcmV0dXJuICBwYXJzZUZsb2F0KHByaWNlVGV4dC5yZXBsYWNlKC8oW15cXGQsXFwuXFxzXSopL2csICcnKSk7XG4gICAgfVxuXG4gICAgcHJpY2VBbW91bnRJc1plcm8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByaWNlQW1vdW50KCkgPT09IDA7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBhY3Rpb25IYW5kbGVyID0gbmV3IFNpbmdsZVByb2R1Y3RBY3Rpb25IYW5kbGVyKFxuICAgICAgICAgICAgdGhpcy5nYXRld2F5LFxuICAgICAgICAgICAgbmV3IFVwZGF0ZUNhcnQoXG4gICAgICAgICAgICAgICAgdGhpcy5nYXRld2F5LmFqYXguY2hhbmdlX2NhcnQuZW5kcG9pbnQsXG4gICAgICAgICAgICAgICAgdGhpcy5nYXRld2F5LmFqYXguY2hhbmdlX2NhcnQubm9uY2UsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2hvd0J1dHRvbnModGhpcy5nYXRld2F5LmJ1dHRvbi53cmFwcGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNob3dCdXR0b25zKHRoaXMuZ2F0ZXdheS5ob3N0ZWRfZmllbGRzLndyYXBwZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZXMucmVuZGVyV2l0aEFtb3VudCh0aGlzLnByaWNlQW1vdW50KCkpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUJ1dHRvbnModGhpcy5nYXRld2F5LmJ1dHRvbi53cmFwcGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmhpZGVCdXR0b25zKHRoaXMuZ2F0ZXdheS5ob3N0ZWRfZmllbGRzLndyYXBwZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZXMuaGlkZU1lc3NhZ2VzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZm9ybS5jYXJ0JyksXG4gICAgICAgICAgICBuZXcgRXJyb3JIYW5kbGVyKHRoaXMuZ2F0ZXdheS5sYWJlbHMuZXJyb3IuZ2VuZXJpYyksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIoXG4gICAgICAgICAgICBhY3Rpb25IYW5kbGVyLmNvbmZpZ3VyYXRpb24oKVxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2luZ2xlUHJvZHVjdEJvb3RzdGFwO1xuIiwiaW1wb3J0IENhcnRBY3Rpb25IYW5kbGVyIGZyb20gJy4uL0FjdGlvbkhhbmRsZXIvQ2FydEFjdGlvbkhhbmRsZXInO1xuaW1wb3J0IEVycm9ySGFuZGxlciBmcm9tICcuLi9FcnJvckhhbmRsZXInO1xuXG5jbGFzcyBDYXJ0Qm9vdHN0cmFwIHtcbiAgICBjb25zdHJ1Y3RvcihnYXRld2F5LCByZW5kZXJlcikge1xuICAgICAgICB0aGlzLmdhdGV3YXkgPSBnYXRld2F5O1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgfVxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNob3VsZFJlbmRlcigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlcigpO1xuXG4gICAgICAgIGpRdWVyeShkb2N1bWVudC5ib2R5KS5vbigndXBkYXRlZF9jYXJ0X3RvdGFscyB1cGRhdGVkX2NoZWNrb3V0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2hvdWxkUmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmdhdGV3YXkuYnV0dG9uLndyYXBwZXIpICE9PVxuICAgICAgICAgICAgbnVsbCB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZ2F0ZXdheS5ob3N0ZWRfZmllbGRzLndyYXBwZXIpICE9PVxuICAgICAgICAgICAgbnVsbDtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkhhbmRsZXIgPSBuZXcgQ2FydEFjdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICBQYXlQYWxDb21tZXJjZUdhdGV3YXksXG4gICAgICAgICAgICBuZXcgRXJyb3JIYW5kbGVyKHRoaXMuZ2F0ZXdheS5sYWJlbHMuZXJyb3IuZ2VuZXJpYyksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIoXG4gICAgICAgICAgICBhY3Rpb25IYW5kbGVyLmNvbmZpZ3VyYXRpb24oKVxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FydEJvb3RzdHJhcDtcbiIsImNvbnN0IG9uQXBwcm92ZSA9IChjb250ZXh0LCBlcnJvckhhbmRsZXIsIHNwaW5uZXIpID0+IHtcbiAgICByZXR1cm4gKGRhdGEsIGFjdGlvbnMpID0+IHtcbiAgICAgICAgc3Bpbm5lci5ibG9jaygpO1xuICAgICAgICBlcnJvckhhbmRsZXIuY2xlYXIoKTtcblxuICAgICAgICByZXR1cm4gZmV0Y2goY29udGV4dC5jb25maWcuYWpheC5hcHByb3ZlX29yZGVyLmVuZHBvaW50LCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBub25jZTogY29udGV4dC5jb25maWcuYWpheC5hcHByb3ZlX29yZGVyLm5vbmNlLFxuICAgICAgICAgICAgICAgIG9yZGVyX2lkOmRhdGEub3JkZXJJRCxcbiAgICAgICAgICAgICAgICBmdW5kaW5nX3NvdXJjZTogd2luZG93LnBwY3BGdW5kaW5nU291cmNlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSkudGhlbigocmVzKT0+e1xuICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XG4gICAgICAgIH0pLnRoZW4oKGRhdGEpPT57XG4gICAgICAgICAgICBzcGlubmVyLnVuYmxvY2soKTtcbiAgICAgICAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuZGF0YS5jb2RlID09PSAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm1lc3NhZ2UoZGF0YS5kYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlci5nZW5lcmljRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb25zICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgYWN0aW9ucy5yZXN0YXJ0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9ucy5yZXN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGxhY2Vfb3JkZXInKS5jbGljaygpXG4gICAgICAgIH0pO1xuXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBvbkFwcHJvdmU7XG4iLCJpbXBvcnQgb25BcHByb3ZlIGZyb20gJy4uL09uQXBwcm92ZUhhbmRsZXIvb25BcHByb3ZlRm9yUGF5Tm93LmpzJztcbmltcG9ydCB7cGF5ZXJEYXRhfSBmcm9tIFwiLi4vSGVscGVyL1BheWVyRGF0YVwiO1xuaW1wb3J0IHtnZXRDdXJyZW50UGF5bWVudE1ldGhvZH0gZnJvbSBcIi4uL0hlbHBlci9DaGVja291dE1ldGhvZFN0YXRlXCI7XG5cbmNsYXNzIENoZWNrb3V0QWN0aW9uSGFuZGxlciB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWcsIGVycm9ySGFuZGxlciwgc3Bpbm5lcikge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7XG4gICAgICAgIHRoaXMuc3Bpbm5lciA9IHNwaW5uZXI7XG4gICAgfVxuXG4gICAgY29uZmlndXJhdGlvbigpIHtcbiAgICAgICAgY29uc3Qgc3Bpbm5lciA9IHRoaXMuc3Bpbm5lcjtcbiAgICAgICAgY29uc3QgY3JlYXRlT3JkZXIgPSAoZGF0YSwgYWN0aW9ucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5ZXIgPSBwYXllckRhdGEoKTtcbiAgICAgICAgICAgIGNvbnN0IGJuQ29kZSA9IHR5cGVvZiB0aGlzLmNvbmZpZy5ibl9jb2Rlc1t0aGlzLmNvbmZpZy5jb250ZXh0XSAhPT0gJ3VuZGVmaW5lZCcgP1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmJuX2NvZGVzW3RoaXMuY29uZmlnLmNvbnRleHRdIDogJyc7XG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9ySGFuZGxlciA9IHRoaXMuZXJyb3JIYW5kbGVyO1xuXG4gICAgICAgICAgICBjb25zdCBmb3JtU2VsZWN0b3IgPSB0aGlzLmNvbmZpZy5jb250ZXh0ID09PSAnY2hlY2tvdXQnID8gJ2Zvcm0uY2hlY2tvdXQnIDogJ2Zvcm0jb3JkZXJfcmV2aWV3JztcbiAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZm9ybVNlbGVjdG9yKSk7XG4gICAgICAgICAgICAvLyB3aWxsIG5vdCBoYW5kbGUgZmllbGRzIHdpdGggbXVsdGlwbGUgdmFsdWVzIChjaGVja2JveGVzLCA8c2VsZWN0IG11bHRpcGxlPiksIGJ1dCB3ZSBkbyBub3QgY2FyZSBhYm91dCB0aGlzIGhlcmVcbiAgICAgICAgICAgIGNvbnN0IGZvcm1Kc29uT2JqID0gT2JqZWN0LmZyb21FbnRyaWVzKGZvcm1EYXRhKTtcblxuICAgICAgICAgICAgY29uc3QgY3JlYXRlYWNjb3VudCA9IGpRdWVyeSgnI2NyZWF0ZWFjY291bnQnKS5pcyhcIjpjaGVja2VkXCIpID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgICAgICBjb25zdCBwYXltZW50TWV0aG9kID0gZ2V0Q3VycmVudFBheW1lbnRNZXRob2QoKTtcbiAgICAgICAgICAgIGNvbnN0IGZ1bmRpbmdTb3VyY2UgPSB3aW5kb3cucHBjcEZ1bmRpbmdTb3VyY2U7XG5cbiAgICAgICAgICAgIHJldHVybiBmZXRjaCh0aGlzLmNvbmZpZy5hamF4LmNyZWF0ZV9vcmRlci5lbmRwb2ludCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgbm9uY2U6IHRoaXMuY29uZmlnLmFqYXguY3JlYXRlX29yZGVyLm5vbmNlLFxuICAgICAgICAgICAgICAgICAgICBwYXllcixcbiAgICAgICAgICAgICAgICAgICAgYm5fY29kZTpibkNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6dGhpcy5jb25maWcuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgb3JkZXJfaWQ6dGhpcy5jb25maWcub3JkZXJfaWQsXG4gICAgICAgICAgICAgICAgICAgIHBheW1lbnRfbWV0aG9kOiBwYXltZW50TWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICBmdW5kaW5nX3NvdXJjZTogZnVuZGluZ1NvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybTogZm9ybUpzb25PYmosXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZWFjY291bnQ6IGNyZWF0ZWFjY291bnRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XG4gICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Bpbm5lci51bmJsb2NrKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vaGFuZGxlIGJvdGggbWVzc2FnZXMgc2VudCBmcm9tIFdvb2NvbW1lcmNlIChkYXRhLm1lc3NhZ2VzKSBhbmQgdGhpcyBwbHVnaW4gKGRhdGEuZGF0YS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGRhdGEubWVzc2FnZXMpICE9PSAndW5kZWZpbmVkJyApXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvbVBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlci5hcHBlbmRQcmVwYXJlZEVycm9yTWVzc2FnZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tUGFyc2VyLnBhcnNlRnJvbVN0cmluZyhkYXRhLm1lc3NhZ2VzLCAndGV4dC9odG1sJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJ3VsJylcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmRhdGEuZGV0YWlscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm1lc3NhZ2UoZGF0YS5kYXRhLmRldGFpbHMubWFwKGQgPT4gYCR7ZC5pc3N1ZX0gJHtkLmRlc2NyaXB0aW9ufWApLmpvaW4oJzxici8+JyksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIubWVzc2FnZShkYXRhLmRhdGEubWVzc2FnZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGF0YS5kYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgnbmFtZScsICdwcGNwLXJlc3VtZS1vcmRlcicpO1xuICAgICAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgndmFsdWUnLCBkYXRhLmRhdGEucHVyY2hhc2VfdW5pdHNbMF0uY3VzdG9tX2lkKTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGZvcm1TZWxlY3RvcikuYXBwZW5kKGlucHV0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5kYXRhLmlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNyZWF0ZU9yZGVyLFxuICAgICAgICAgICAgb25BcHByb3ZlOm9uQXBwcm92ZSh0aGlzLCB0aGlzLmVycm9ySGFuZGxlciwgdGhpcy5zcGlubmVyKSxcbiAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3Bpbm5lci51bmJsb2NrKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25FcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmdlbmVyaWNFcnJvcigpO1xuICAgICAgICAgICAgICAgIHNwaW5uZXIudW5ibG9jaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDaGVja291dEFjdGlvbkhhbmRsZXI7XG4iLCJjb25zdCBnZXRFbGVtZW50ID0gKHNlbGVjdG9yT3JFbGVtZW50KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBzZWxlY3Rvck9yRWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3JPckVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0b3JPckVsZW1lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBpc1Zpc2libGUgPSAoZWxlbWVudCkgPT4ge1xuICAgIHJldHVybiAhIShlbGVtZW50Lm9mZnNldFdpZHRoIHx8IGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpO1xufVxuXG5leHBvcnQgY29uc3Qgc2V0VmlzaWJsZSA9IChzZWxlY3Rvck9yRWxlbWVudCwgc2hvdywgaW1wb3J0YW50ID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RWxlbWVudChzZWxlY3Rvck9yRWxlbWVudCk7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBlbGVtZW50LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKTtcblxuICAgIGlmICghc2hvdykge1xuICAgICAgICBpZiAoY3VycmVudFZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnbm9uZScsIGltcG9ydGFudCA/ICdpbXBvcnRhbnQnIDogJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT09ICdub25lJykge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3RpbGwgbm90IHZpc2libGUgKGlmIHNvbWV0aGluZyBlbHNlIGFkZGVkIGRpc3BsYXk6IG5vbmUgaW4gQ1NTKVxuICAgICAgICBpZiAoIWlzVmlzaWJsZShlbGVtZW50KSkge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdibG9jaycpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGhpZGUgPSAoc2VsZWN0b3JPckVsZW1lbnQsIGltcG9ydGFudCA9IGZhbHNlKSA9PiB7XG4gICAgc2V0VmlzaWJsZShzZWxlY3Rvck9yRWxlbWVudCwgZmFsc2UsIGltcG9ydGFudCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2hvdyA9IChzZWxlY3Rvck9yRWxlbWVudCkgPT4ge1xuICAgIHNldFZpc2libGUoc2VsZWN0b3JPckVsZW1lbnQsIHRydWUpO1xufTtcbiIsImltcG9ydCBFcnJvckhhbmRsZXIgZnJvbSAnLi4vRXJyb3JIYW5kbGVyJztcbmltcG9ydCBDaGVja291dEFjdGlvbkhhbmRsZXIgZnJvbSAnLi4vQWN0aW9uSGFuZGxlci9DaGVja291dEFjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgc2V0VmlzaWJsZSB9IGZyb20gJy4uL0hlbHBlci9IaWRpbmcnO1xuaW1wb3J0IHtcbiAgICBnZXRDdXJyZW50UGF5bWVudE1ldGhvZCxcbiAgICBpc1NhdmVkQ2FyZFNlbGVjdGVkLCBPUkRFUl9CVVRUT05fU0VMRUNUT1IsXG4gICAgUGF5bWVudE1ldGhvZHNcbn0gZnJvbSBcIi4uL0hlbHBlci9DaGVja291dE1ldGhvZFN0YXRlXCI7XG5cbmNsYXNzIENoZWNrb3V0Qm9vdHN0YXAge1xuICAgIGNvbnN0cnVjdG9yKGdhdGV3YXksIHJlbmRlcmVyLCBtZXNzYWdlcywgc3Bpbm5lcikge1xuICAgICAgICB0aGlzLmdhdGV3YXkgPSBnYXRld2F5O1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSBtZXNzYWdlcztcbiAgICAgICAgdGhpcy5zcGlubmVyID0gc3Bpbm5lcjtcblxuICAgICAgICB0aGlzLnN0YW5kYXJkT3JkZXJCdXR0b25TZWxlY3RvciA9IE9SREVSX0JVVFRPTl9TRUxFQ1RPUjtcblxuICAgICAgICB0aGlzLmJ1dHRvbkNoYW5nZU9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKGVsKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVpKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluaXQoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgICAgICAgLy8gVW5zZWxlY3Qgc2F2ZWQgY2FyZC5cbiAgICAgICAgLy8gV0Mgc2F2ZXMgZm9ybSB2YWx1ZXMsIHNvIHdpdGggb3VyIGN1cnJlbnQgVUkgaXQgd291bGQgYmUgYSBiaXQgd2VpcmRcbiAgICAgICAgLy8gaWYgdGhlIHVzZXIgcGFpZCB3aXRoIHNhdmVkLCB0aGVuIGFmdGVyIHNvbWUgdGltZSB0cmllcyB0byBwYXkgYWdhaW4sXG4gICAgICAgIC8vIGJ1dCB3YW50cyB0byBlbnRlciBhIG5ldyBjYXJkLCBhbmQgdG8gZG8gdGhhdCB0aGV5IGhhdmUgdG8gY2hvb3NlIOKAnFNlbGVjdCBwYXltZW504oCdIGluIHRoZSBsaXN0LlxuICAgICAgICBqUXVlcnkoJyNzYXZlZC1jcmVkaXQtY2FyZCcpLnZhbChqUXVlcnkoJyNzYXZlZC1jcmVkaXQtY2FyZCBvcHRpb246Zmlyc3QnKS52YWwoKSk7XG5cbiAgICAgICAgalF1ZXJ5KGRvY3VtZW50LmJvZHkpLm9uKCd1cGRhdGVkX2NoZWNrb3V0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXIoKVxuICAgICAgICB9KTtcblxuICAgICAgICBqUXVlcnkoZG9jdW1lbnQuYm9keSkub24oJ3VwZGF0ZWRfY2hlY2tvdXQgcGF5bWVudF9tZXRob2Rfc2VsZWN0ZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVpKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGpRdWVyeShkb2N1bWVudCkub24oJ2hvc3RlZF9maWVsZHNfbG9hZGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgalF1ZXJ5KCcjc2F2ZWQtY3JlZGl0LWNhcmQnKS5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVWkoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlVWkoKTtcbiAgICB9XG5cbiAgICBzaG91bGRSZW5kZXIoKSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZ2F0ZXdheS5idXR0b24uY2FuY2VsX3dyYXBwZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmdhdGV3YXkuYnV0dG9uLndyYXBwZXIpICE9PSBudWxsIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlcikgIT09IG51bGw7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkUmVuZGVyKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmdhdGV3YXkuaG9zdGVkX2ZpZWxkcy53cmFwcGVyICsgJz5kaXYnKSkge1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmdhdGV3YXkuaG9zdGVkX2ZpZWxkcy53cmFwcGVyICsgJz5kaXYnKS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjdGlvbkhhbmRsZXIgPSBuZXcgQ2hlY2tvdXRBY3Rpb25IYW5kbGVyKFxuICAgICAgICAgICAgUGF5UGFsQ29tbWVyY2VHYXRld2F5LFxuICAgICAgICAgICAgbmV3IEVycm9ySGFuZGxlcih0aGlzLmdhdGV3YXkubGFiZWxzLmVycm9yLmdlbmVyaWMpLFxuICAgICAgICAgICAgdGhpcy5zcGlubmVyXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIoXG4gICAgICAgICAgICBhY3Rpb25IYW5kbGVyLmNvbmZpZ3VyYXRpb24oKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuYnV0dG9uQ2hhbmdlT2JzZXJ2ZXIub2JzZXJ2ZShcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5zdGFuZGFyZE9yZGVyQnV0dG9uU2VsZWN0b3IpLFxuICAgICAgICAgICAge2F0dHJpYnV0ZXM6IHRydWV9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdXBkYXRlVWkoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYXltZW50TWV0aG9kID0gZ2V0Q3VycmVudFBheW1lbnRNZXRob2QoKTtcbiAgICAgICAgY29uc3QgaXNQYXlwYWwgPSBjdXJyZW50UGF5bWVudE1ldGhvZCA9PT0gUGF5bWVudE1ldGhvZHMuUEFZUEFMO1xuICAgICAgICBjb25zdCBpc0NhcmQgPSBjdXJyZW50UGF5bWVudE1ldGhvZCA9PT0gUGF5bWVudE1ldGhvZHMuQ0FSRFM7XG4gICAgICAgIGNvbnN0IGlzU2VwYXJhdGVCdXR0b25HYXRld2F5ID0gW1BheW1lbnRNZXRob2RzLkNBUkRfQlVUVE9OXS5pbmNsdWRlcyhjdXJyZW50UGF5bWVudE1ldGhvZCk7XG4gICAgICAgIGNvbnN0IGlzU2F2ZWRDYXJkID0gaXNDYXJkICYmIGlzU2F2ZWRDYXJkU2VsZWN0ZWQoKTtcbiAgICAgICAgY29uc3QgaXNOb3RPdXJHYXRld2F5ID0gIWlzUGF5cGFsICYmICFpc0NhcmQgJiYgIWlzU2VwYXJhdGVCdXR0b25HYXRld2F5O1xuICAgICAgICBjb25zdCBpc0ZyZWVUcmlhbCA9IFBheVBhbENvbW1lcmNlR2F0ZXdheS5pc19mcmVlX3RyaWFsX2NhcnQ7XG4gICAgICAgIGNvbnN0IGhhc1ZhdWx0ZWRQYXlwYWwgPSBQYXlQYWxDb21tZXJjZUdhdGV3YXkudmF1bHRlZF9wYXlwYWxfZW1haWwgIT09ICcnO1xuXG4gICAgICAgIGNvbnN0IHBheXBhbEJ1dHRvbldyYXBwZXJzID0ge1xuICAgICAgICAgICAgLi4uT2JqZWN0LmVudHJpZXMoUGF5UGFsQ29tbWVyY2VHYXRld2F5LnNlcGFyYXRlX2J1dHRvbnMpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgocmVzdWx0LCBbaywgZGF0YV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5yZXN1bHQsIFtkYXRhLmlkXTogZGF0YS53cmFwcGVyfVxuICAgICAgICAgICAgICAgIH0sIHt9KSxcbiAgICAgICAgfTtcblxuICAgICAgICBzZXRWaXNpYmxlKHRoaXMuc3RhbmRhcmRPcmRlckJ1dHRvblNlbGVjdG9yLCAgKGlzUGF5cGFsICYmIGlzRnJlZVRyaWFsICYmIGhhc1ZhdWx0ZWRQYXlwYWwpIHx8IGlzTm90T3VyR2F0ZXdheSB8fCBpc1NhdmVkQ2FyZCwgdHJ1ZSk7XG4gICAgICAgIHNldFZpc2libGUoJy5wcGNwLXZhdWx0ZWQtcGF5cGFsLWRldGFpbHMnLCBpc1BheXBhbCk7XG4gICAgICAgIHNldFZpc2libGUodGhpcy5nYXRld2F5LmJ1dHRvbi53cmFwcGVyLCBpc1BheXBhbCAmJiAhKGlzRnJlZVRyaWFsICYmIGhhc1ZhdWx0ZWRQYXlwYWwpKTtcbiAgICAgICAgc2V0VmlzaWJsZSh0aGlzLmdhdGV3YXkubWVzc2FnZXMud3JhcHBlciwgaXNQYXlwYWwgJiYgIWlzRnJlZVRyaWFsKTtcbiAgICAgICAgc2V0VmlzaWJsZSh0aGlzLmdhdGV3YXkuaG9zdGVkX2ZpZWxkcy53cmFwcGVyLCBpc0NhcmQgJiYgIWlzU2F2ZWRDYXJkKTtcbiAgICAgICAgZm9yIChjb25zdCBbZ2F0ZXdheUlkLCB3cmFwcGVyXSBvZiBPYmplY3QuZW50cmllcyhwYXlwYWxCdXR0b25XcmFwcGVycykpIHtcbiAgICAgICAgICAgIHNldFZpc2libGUod3JhcHBlciwgZ2F0ZXdheUlkID09PSBjdXJyZW50UGF5bWVudE1ldGhvZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNQYXlwYWwgJiYgIWlzRnJlZVRyaWFsKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzLnJlbmRlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQ2FyZCkge1xuICAgICAgICAgICAgaWYgKGlzU2F2ZWRDYXJkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ3JlZGl0Q2FyZEZpZWxkcygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUNyZWRpdENhcmRGaWVsZHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc2FibGVDcmVkaXRDYXJkRmllbGRzKCkge1xuICAgICAgICBqUXVlcnkoJ2xhYmVsW2Zvcj1cInBwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLW51bWJlclwiXScpLmFkZENsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnI3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLW51bWJlcicpLmFkZENsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnbGFiZWxbZm9yPVwicHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtZXhwaXJ5XCJdJykuYWRkQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCcjcHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtZXhwaXJ5JykuYWRkQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCdsYWJlbFtmb3I9XCJwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1jdmNcIl0nKS5hZGRDbGFzcygncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWZvcm0tZmllbGQtZGlzYWJsZWQnKVxuICAgICAgICBqUXVlcnkoJyNwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1jdmMnKS5hZGRDbGFzcygncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWZvcm0tZmllbGQtZGlzYWJsZWQnKVxuICAgICAgICBqUXVlcnkoJ2xhYmVsW2Zvcj1cInZhdWx0XCJdJykuYWRkQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCcjcHBjcC1jcmVkaXQtY2FyZC12YXVsdCcpLmFkZENsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnI3BwY3AtY3JlZGl0LWNhcmQtdmF1bHQnKS5hdHRyKFwiZGlzYWJsZWRcIiwgdHJ1ZSlcbiAgICAgICAgdGhpcy5yZW5kZXJlci5kaXNhYmxlQ3JlZGl0Q2FyZEZpZWxkcygpXG4gICAgfVxuXG4gICAgZW5hYmxlQ3JlZGl0Q2FyZEZpZWxkcygpIHtcbiAgICAgICAgalF1ZXJ5KCdsYWJlbFtmb3I9XCJwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1udW1iZXJcIl0nKS5yZW1vdmVDbGFzcygncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWZvcm0tZmllbGQtZGlzYWJsZWQnKVxuICAgICAgICBqUXVlcnkoJyNwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1udW1iZXInKS5yZW1vdmVDbGFzcygncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWZvcm0tZmllbGQtZGlzYWJsZWQnKVxuICAgICAgICBqUXVlcnkoJ2xhYmVsW2Zvcj1cInBwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLWV4cGlyeVwiXScpLnJlbW92ZUNsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnI3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLWV4cGlyeScpLnJlbW92ZUNsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnbGFiZWxbZm9yPVwicHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtY3ZjXCJdJykucmVtb3ZlQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCcjcHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtY3ZjJykucmVtb3ZlQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCdsYWJlbFtmb3I9XCJ2YXVsdFwiXScpLnJlbW92ZUNsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnI3BwY3AtY3JlZGl0LWNhcmQtdmF1bHQnKS5yZW1vdmVDbGFzcygncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWZvcm0tZmllbGQtZGlzYWJsZWQnKVxuICAgICAgICBqUXVlcnkoJyNwcGNwLWNyZWRpdC1jYXJkLXZhdWx0JykuYXR0cihcImRpc2FibGVkXCIsIGZhbHNlKVxuICAgICAgICB0aGlzLnJlbmRlcmVyLmVuYWJsZUNyZWRpdENhcmRGaWVsZHMoKVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2hlY2tvdXRCb290c3RhcFxuIiwiZXhwb3J0IGNvbnN0IGlzQ2hhbmdlUGF5bWVudFBhZ2UgPSAoKSA9PiB7XG4gICAgY29uc3QgdXJsUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKVxuICAgIHJldHVybiB1cmxQYXJhbXMuaGFzKCdjaGFuZ2VfcGF5bWVudF9tZXRob2QnKTtcbn1cbiIsImltcG9ydCBDaGVja291dEJvb3RzdGFwIGZyb20gJy4vQ2hlY2tvdXRCb290c3RhcCdcbmltcG9ydCB7aXNDaGFuZ2VQYXltZW50UGFnZX0gZnJvbSBcIi4uL0hlbHBlci9TdWJzY3JpcHRpb25zXCI7XG5cbmNsYXNzIFBheU5vd0Jvb3RzdHJhcCBleHRlbmRzIENoZWNrb3V0Qm9vdHN0YXAge1xuICAgIGNvbnN0cnVjdG9yKGdhdGV3YXksIHJlbmRlcmVyLCBtZXNzYWdlcywgc3Bpbm5lcikge1xuICAgICAgICBzdXBlcihnYXRld2F5LCByZW5kZXJlciwgbWVzc2FnZXMsIHNwaW5uZXIpXG4gICAgfVxuXG4gICAgdXBkYXRlVWkoKSB7XG4gICAgICAgIGlmIChpc0NoYW5nZVBheW1lbnRQYWdlKCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIudXBkYXRlVWkoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBheU5vd0Jvb3RzdHJhcDtcbiIsImltcG9ydCBtZXJnZSBmcm9tIFwiZGVlcG1lcmdlXCI7XG5cbmNsYXNzIFJlbmRlcmVyIHtcbiAgICBjb25zdHJ1Y3RvcihjcmVkaXRDYXJkUmVuZGVyZXIsIGRlZmF1bHRTZXR0aW5ncywgb25TbWFydEJ1dHRvbkNsaWNrLCBvblNtYXJ0QnV0dG9uc0luaXQpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0U2V0dGluZ3MgPSBkZWZhdWx0U2V0dGluZ3M7XG4gICAgICAgIHRoaXMuY3JlZGl0Q2FyZFJlbmRlcmVyID0gY3JlZGl0Q2FyZFJlbmRlcmVyO1xuICAgICAgICB0aGlzLm9uU21hcnRCdXR0b25DbGljayA9IG9uU21hcnRCdXR0b25DbGljaztcbiAgICAgICAgdGhpcy5vblNtYXJ0QnV0dG9uc0luaXQgPSBvblNtYXJ0QnV0dG9uc0luaXQ7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlZFNvdXJjZXMgPSBuZXcgU2V0KCk7XG4gICAgfVxuXG4gICAgcmVuZGVyKGNvbnRleHRDb25maWcsIHNldHRpbmdzT3ZlcnJpZGUgPSB7fSkge1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IG1lcmdlKHRoaXMuZGVmYXVsdFNldHRpbmdzLCBzZXR0aW5nc092ZXJyaWRlKTtcblxuICAgICAgICBjb25zdCBlbmFibGVkU2VwYXJhdGVHYXRld2F5cyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhcbiAgICAgICAgICAgIHNldHRpbmdzLnNlcGFyYXRlX2J1dHRvbnMpLmZpbHRlcigoW3MsIGRhdGFdKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGRhdGEud3JhcHBlcilcbiAgICAgICAgKSk7XG4gICAgICAgIGNvbnN0IGhhc0VuYWJsZWRTZXBhcmF0ZUdhdGV3YXlzID0gT2JqZWN0LmtleXMoZW5hYmxlZFNlcGFyYXRlR2F0ZXdheXMpLmxlbmd0aCAhPT0gMDtcblxuICAgICAgICBpZiAoIWhhc0VuYWJsZWRTZXBhcmF0ZUdhdGV3YXlzKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckJ1dHRvbnMoXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MuYnV0dG9uLndyYXBwZXIsXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MuYnV0dG9uLnN0eWxlLFxuICAgICAgICAgICAgICAgIGNvbnRleHRDb25maWcsXG4gICAgICAgICAgICAgICAgaGFzRW5hYmxlZFNlcGFyYXRlR2F0ZXdheXNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyByZW5kZXIgZWFjaCBidXR0b24gc2VwYXJhdGVseVxuICAgICAgICAgICAgZm9yIChjb25zdCBmdW5kaW5nU291cmNlIG9mIHBheXBhbC5nZXRGdW5kaW5nU291cmNlcygpLmZpbHRlcihzID0+ICEocyBpbiBlbmFibGVkU2VwYXJhdGVHYXRld2F5cykpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gc2V0dGluZ3MuYnV0dG9uLnN0eWxlO1xuICAgICAgICAgICAgICAgIGlmIChmdW5kaW5nU291cmNlICE9PSAncGF5cGFsJykge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlOiBzdHlsZS5zaGFwZSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckJ1dHRvbnMoXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmJ1dHRvbi53cmFwcGVyLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgaGFzRW5hYmxlZFNlcGFyYXRlR2F0ZXdheXMsXG4gICAgICAgICAgICAgICAgICAgIGZ1bmRpbmdTb3VyY2VcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcmVkaXRDYXJkUmVuZGVyZXIucmVuZGVyKHNldHRpbmdzLmhvc3RlZF9maWVsZHMud3JhcHBlciwgY29udGV4dENvbmZpZyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbZnVuZGluZ1NvdXJjZSwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoZW5hYmxlZFNlcGFyYXRlR2F0ZXdheXMpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckJ1dHRvbnMoXG4gICAgICAgICAgICAgICAgZGF0YS53cmFwcGVyLFxuICAgICAgICAgICAgICAgIGRhdGEuc3R5bGUsXG4gICAgICAgICAgICAgICAgY29udGV4dENvbmZpZyxcbiAgICAgICAgICAgICAgICBoYXNFbmFibGVkU2VwYXJhdGVHYXRld2F5cyxcbiAgICAgICAgICAgICAgICBmdW5kaW5nU291cmNlXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyQnV0dG9ucyh3cmFwcGVyLCBzdHlsZSwgY29udGV4dENvbmZpZywgaGFzRW5hYmxlZFNlcGFyYXRlR2F0ZXdheXMsIGZ1bmRpbmdTb3VyY2UgPSBudWxsKSB7XG4gICAgICAgIGlmICghIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iod3JhcHBlcikgfHwgdGhpcy5pc0FscmVhZHlSZW5kZXJlZCh3cmFwcGVyLCBmdW5kaW5nU291cmNlLCBoYXNFbmFibGVkU2VwYXJhdGVHYXRld2F5cykgfHwgJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBwYXlwYWwuQnV0dG9ucyApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdW5kaW5nU291cmNlKSB7XG4gICAgICAgICAgICBjb250ZXh0Q29uZmlnLmZ1bmRpbmdTb3VyY2UgPSBmdW5kaW5nU291cmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnRuID0gcGF5cGFsLkJ1dHRvbnMoe1xuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAuLi5jb250ZXh0Q29uZmlnLFxuICAgICAgICAgICAgb25DbGljazogdGhpcy5vblNtYXJ0QnV0dG9uQ2xpY2ssXG4gICAgICAgICAgICBvbkluaXQ6IHRoaXMub25TbWFydEJ1dHRvbnNJbml0LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFidG4uaXNFbGlnaWJsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBidG4ucmVuZGVyKHdyYXBwZXIpO1xuXG4gICAgICAgIHRoaXMucmVuZGVyZWRTb3VyY2VzLmFkZCh3cmFwcGVyICsgZnVuZGluZ1NvdXJjZSA/PyAnJyk7XG4gICAgfVxuXG4gICAgaXNBbHJlYWR5UmVuZGVyZWQod3JhcHBlciwgZnVuZGluZ1NvdXJjZSwgaGFzRW5hYmxlZFNlcGFyYXRlR2F0ZXdheXMpIHtcbiAgICAgICAgLy8gU2ltcGx5IGNoZWNrIHRoYXQgaGFzIGNoaWxkIG5vZGVzIHdoZW4gd2UgZG8gbm90IG5lZWQgdG8gcmVuZGVyIGJ1dHRvbnMgc2VwYXJhdGVseSxcbiAgICAgICAgLy8gdGhpcyB3aWxsIHJlZHVjZSB0aGUgcmlzayBvZiBicmVha2luZyB3aXRoIGRpZmZlcmVudCB0aGVtZXMvcGx1Z2luc1xuICAgICAgICAvLyBhbmQgb24gdGhlIGNhcnQgcGFnZSAod2hlcmUgd2UgYWxzbyBkbyBub3QgbmVlZCB0byByZW5kZXIgc2VwYXJhdGVseSksIHdoaWNoIG1heSBmdWxseSByZWxvYWQgdGhpcyBwYXJ0IG9mIHRoZSBwYWdlLlxuICAgICAgICAvLyBJZGVhbGx5IHdlIHNob3VsZCBhbHNvIGZpbmQgYSB3YXkgdG8gZGV0ZWN0IHN1Y2ggZnVsbCByZWxvYWRzIGFuZCByZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcga2V5cyBmcm9tIHRoZSBzZXQuXG4gICAgICAgIGlmICghaGFzRW5hYmxlZFNlcGFyYXRlR2F0ZXdheXMpIHtcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHdyYXBwZXIpLmhhc0NoaWxkTm9kZXMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlZFNvdXJjZXMuaGFzKHdyYXBwZXIgKyBmdW5kaW5nU291cmNlID8/ICcnKTtcbiAgICB9XG5cbiAgICBoaWRlQnV0dG9ucyhlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGRvbUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgICBpZiAoISBkb21FbGVtZW50ICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGRvbUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc2hvd0J1dHRvbnMoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgICAgaWYgKCEgZG9tRWxlbWVudCApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBkb21FbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBkaXNhYmxlQ3JlZGl0Q2FyZEZpZWxkcygpIHtcbiAgICAgICAgdGhpcy5jcmVkaXRDYXJkUmVuZGVyZXIuZGlzYWJsZUZpZWxkcygpO1xuICAgIH1cblxuICAgIGVuYWJsZUNyZWRpdENhcmRGaWVsZHMoKSB7XG4gICAgICAgIHRoaXMuY3JlZGl0Q2FyZFJlbmRlcmVyLmVuYWJsZUZpZWxkcygpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVuZGVyZXI7XG4iLCJjb25zdCBkY2NJbnB1dEZhY3RvcnkgPSAob3JpZ2luYWwpID0+IHtcbiAgICBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShvcmlnaW5hbCk7XG4gICAgY29uc3QgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblxuICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsIG9yaWdpbmFsLmlkKTtcbiAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBvcmlnaW5hbC5jbGFzc05hbWUpO1xuXG4gICAgT2JqZWN0LnZhbHVlcyhzdHlsZXMpLmZvckVhY2goIChwcm9wKSA9PiB7XG4gICAgICAgIGlmICghIHN0eWxlc1twcm9wXSB8fCAhIGlzTmFOKHByb3ApIHx8IHByb3AgPT09ICdiYWNrZ3JvdW5kLWltYWdlJyApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBuZXdFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHByb3AsJycgKyBzdHlsZXNbcHJvcF0pO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG5leHBvcnQgZGVmYXVsdCBkY2NJbnB1dEZhY3Rvcnk7XG4iLCJpbXBvcnQgZGNjSW5wdXRGYWN0b3J5IGZyb20gXCIuLi9IZWxwZXIvRGNjSW5wdXRGYWN0b3J5XCI7XG5pbXBvcnQge3Nob3d9IGZyb20gXCIuLi9IZWxwZXIvSGlkaW5nXCI7XG5pbXBvcnQgUHJvZHVjdCBmcm9tIFwiLi4vRW50aXR5L1Byb2R1Y3RcIjtcblxuY2xhc3MgQ3JlZGl0Q2FyZFJlbmRlcmVyIHtcblxuICAgIGNvbnN0cnVjdG9yKGRlZmF1bHRDb25maWcsIGVycm9ySGFuZGxlciwgc3Bpbm5lcikge1xuICAgICAgICB0aGlzLmRlZmF1bHRDb25maWcgPSBkZWZhdWx0Q29uZmlnO1xuICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjtcbiAgICAgICAgdGhpcy5zcGlubmVyID0gc3Bpbm5lcjtcbiAgICAgICAgdGhpcy5jYXJkVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3JtVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2UgPSBudWxsO1xuICAgIH1cblxuICAgIHJlbmRlcih3cmFwcGVyLCBjb250ZXh0Q29uZmlnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRDb25maWcuY29udGV4dCAhPT0gJ2NoZWNrb3V0J1xuICAgICAgICAgICAgICAgICYmIHRoaXMuZGVmYXVsdENvbmZpZy5jb250ZXh0ICE9PSAncGF5LW5vdydcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHx8IHdyYXBwZXIgPT09IG51bGxcbiAgICAgICAgICAgIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iod3JhcHBlcikgPT09IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHBheXBhbC5Ib3N0ZWRGaWVsZHMgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICB8fCAhIHBheXBhbC5Ib3N0ZWRGaWVsZHMuaXNFbGlnaWJsZSgpXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlckVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHdyYXBwZXIpO1xuICAgICAgICAgICAgd3JhcHBlckVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh3cmFwcGVyRWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidXR0b25TZWxlY3RvciA9IHdyYXBwZXIgKyAnIGJ1dHRvbic7XG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEhvc3RlZEZpZWxkc0luc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRIb3N0ZWRGaWVsZHNJbnN0YW5jZS50ZWFyZG93bigpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBjb25zb2xlLmVycm9yKGBIb3N0ZWQgZmllbGRzIHRlYXJkb3duIGVycm9yOiAke2Vycn1gKSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRIb3N0ZWRGaWVsZHNJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBnYXRlV2F5Qm94ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBheW1lbnRfYm94LnBheW1lbnRfbWV0aG9kX3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheScpO1xuICAgICAgICBpZighIGdhdGVXYXlCb3gpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9sZERpc3BsYXlTdHlsZSA9IGdhdGVXYXlCb3guc3R5bGUuZGlzcGxheTtcbiAgICAgICAgZ2F0ZVdheUJveC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgICAgICBjb25zdCBoaWRlRGNjR2F0ZXdheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwcGNwLWhpZGUtZGNjJyk7XG4gICAgICAgIGlmIChoaWRlRGNjR2F0ZXdheSkge1xuICAgICAgICAgICAgaGlkZURjY0dhdGV3YXkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChoaWRlRGNjR2F0ZXdheSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYXJkTnVtYmVyRmllbGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtbnVtYmVyJyk7XG5cbiAgICAgICAgY29uc3Qgc3R5bGVzUmF3ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY2FyZE51bWJlckZpZWxkKTtcbiAgICAgICAgbGV0IHN0eWxlcyA9IHt9O1xuICAgICAgICBPYmplY3QudmFsdWVzKHN0eWxlc1JhdykuZm9yRWFjaCggKHByb3ApID0+IHtcbiAgICAgICAgICAgIGlmICghIHN0eWxlc1Jhd1twcm9wXSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0eWxlc1twcm9wXSA9ICcnICsgc3R5bGVzUmF3W3Byb3BdO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjYXJkTnVtYmVyID0gZGNjSW5wdXRGYWN0b3J5KGNhcmROdW1iZXJGaWVsZCk7XG4gICAgICAgIGNhcmROdW1iZXJGaWVsZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChjYXJkTnVtYmVyLCBjYXJkTnVtYmVyRmllbGQpO1xuXG4gICAgICAgIGNvbnN0IGNhcmRFeHBpcnlGaWVsZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1leHBpcnknKTtcbiAgICAgICAgY29uc3QgY2FyZEV4cGlyeSA9IGRjY0lucHV0RmFjdG9yeShjYXJkRXhwaXJ5RmllbGQpO1xuICAgICAgICBjYXJkRXhwaXJ5RmllbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoY2FyZEV4cGlyeSwgY2FyZEV4cGlyeUZpZWxkKTtcblxuICAgICAgICBjb25zdCBjYXJkQ29kZUZpZWxkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLWN2YycpO1xuICAgICAgICBjb25zdCBjYXJkQ29kZSA9IGRjY0lucHV0RmFjdG9yeShjYXJkQ29kZUZpZWxkKTtcbiAgICAgICAgY2FyZENvZGVGaWVsZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChjYXJkQ29kZSwgY2FyZENvZGVGaWVsZCk7XG5cbiAgICAgICAgZ2F0ZVdheUJveC5zdHlsZS5kaXNwbGF5ID0gb2xkRGlzcGxheVN0eWxlO1xuXG4gICAgICAgIGNvbnN0IGZvcm1XcmFwcGVyID0gJy5wYXltZW50X2JveCBwYXltZW50X21ldGhvZF9wcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXknO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRDb25maWcuZW5mb3JjZV92YXVsdFxuICAgICAgICAgICAgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihmb3JtV3JhcHBlciArICcgLnBwY3AtY3JlZGl0LWNhcmQtdmF1bHQnKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZm9ybVdyYXBwZXIgKyAnIC5wcGNwLWNyZWRpdC1jYXJkLXZhdWx0JykuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGZvcm1XcmFwcGVyICsgJyAucHBjcC1jcmVkaXQtY2FyZC12YXVsdCcpLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBwYXlwYWwuSG9zdGVkRmllbGRzLnJlbmRlcih7XG4gICAgICAgICAgICBjcmVhdGVPcmRlcjogY29udGV4dENvbmZpZy5jcmVhdGVPcmRlcixcbiAgICAgICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICAgICAgICdpbnB1dCc6IHN0eWxlc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICAgIG51bWJlcjoge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJyNwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1udW1iZXInLFxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogdGhpcy5kZWZhdWx0Q29uZmlnLmhvc3RlZF9maWVsZHMubGFiZWxzLmNyZWRpdF9jYXJkX251bWJlcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGN2djoge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJyNwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1jdmMnLFxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogdGhpcy5kZWZhdWx0Q29uZmlnLmhvc3RlZF9maWVsZHMubGFiZWxzLmN2dixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGV4cGlyYXRpb25EYXRlOiB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnI3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLWV4cGlyeScsXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLmRlZmF1bHRDb25maWcuaG9zdGVkX2ZpZWxkcy5sYWJlbHMubW1feXksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKGhvc3RlZEZpZWxkcyA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImhvc3RlZF9maWVsZHNfbG9hZGVkXCIpKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhvc3RlZEZpZWxkc0luc3RhbmNlID0gaG9zdGVkRmllbGRzO1xuXG4gICAgICAgICAgICBob3N0ZWRGaWVsZHMub24oJ2lucHV0U3VibWl0UmVxdWVzdCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWJtaXQoY29udGV4dENvbmZpZyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGhvc3RlZEZpZWxkcy5vbignY2FyZFR5cGVDaGFuZ2UnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoICEgZXZlbnQuY2FyZHMubGVuZ3RoICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcmRWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkQ2FyZHMgPSB0aGlzLmRlZmF1bHRDb25maWcuaG9zdGVkX2ZpZWxkcy52YWxpZF9jYXJkcztcbiAgICAgICAgICAgICAgICB0aGlzLmNhcmRWYWxpZCA9IHZhbGlkQ2FyZHMuaW5kZXhPZihldmVudC5jYXJkc1swXS50eXBlKSAhPT0gLTE7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjbGFzc05hbWUgPSB0aGlzLl9jYXJkTnVtYmVyRmlsZWRDTGFzc05hbWVCeUNhcmRUeXBlKGV2ZW50LmNhcmRzWzBdLnR5cGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlY3JlYXRlRWxlbWVudENsYXNzQXR0cmlidXRlKGNhcmROdW1iZXIsIGNhcmROdW1iZXJGaWVsZC5jbGFzc05hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5maWVsZHMubnVtYmVyLmlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FyZE51bWJlci5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGhvc3RlZEZpZWxkcy5vbigndmFsaWRpdHlDaGFuZ2UnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtVmFsaWQgPSBPYmplY3Qua2V5cyhldmVudC5maWVsZHMpLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmZpZWxkc1trZXldLmlzVmFsaWQ7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjbGFzc05hbWUgPSB0aGlzLl9jYXJkTnVtYmVyRmlsZWRDTGFzc05hbWVCeUNhcmRUeXBlKGV2ZW50LmNhcmRzWzBdLnR5cGUpO1xuICAgICAgICAgICAgICAgIGV2ZW50LmZpZWxkcy5udW1iZXIuaXNWYWxpZFxuICAgICAgICAgICAgICAgICAgICA/IGNhcmROdW1iZXIuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5fcmVjcmVhdGVFbGVtZW50Q2xhc3NBdHRyaWJ1dGUoY2FyZE51bWJlciwgY2FyZE51bWJlckZpZWxkLmNsYXNzTmFtZSk7XG5cbiAgICAgICAgICAgICAgIHRoaXMuZm9ybVZhbGlkID0gZm9ybVZhbGlkO1xuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc2hvdyhidXR0b25TZWxlY3Rvcik7XG5cbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHdyYXBwZXIpLmdldEF0dHJpYnV0ZSgnZGF0YS1wcGNwLXN1YnNjcmliZWQnKSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYnV0dG9uU2VsZWN0b3IpLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgICAgICdjbGljaycsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdWJtaXQoY29udGV4dENvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih3cmFwcGVyKS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcHBjcC1zdWJzY3JpYmVkJywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwYXltZW50X21ldGhvZF9wcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXknKS5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgJ2NsaWNrJyxcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsYWJlbFtmb3I9cHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtbnVtYmVyXScpLmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICB9XG5cbiAgICBkaXNhYmxlRmllbGRzKCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhvc3RlZEZpZWxkc0luc3RhbmNlLnNldEF0dHJpYnV0ZSh7XG4gICAgICAgICAgICAgICAgZmllbGQ6ICdudW1iZXInLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZTogJ2Rpc2FibGVkJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhvc3RlZEZpZWxkc0luc3RhbmNlLnNldEF0dHJpYnV0ZSh7XG4gICAgICAgICAgICAgICAgZmllbGQ6ICdjdnYnLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZTogJ2Rpc2FibGVkJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhvc3RlZEZpZWxkc0luc3RhbmNlLnNldEF0dHJpYnV0ZSh7XG4gICAgICAgICAgICAgICAgZmllbGQ6ICdleHBpcmF0aW9uRGF0ZScsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlOiAnZGlzYWJsZWQnXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW5hYmxlRmllbGRzKCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhvc3RlZEZpZWxkc0luc3RhbmNlLnJlbW92ZUF0dHJpYnV0ZSh7XG4gICAgICAgICAgICAgICAgZmllbGQ6ICdudW1iZXInLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZTogJ2Rpc2FibGVkJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhvc3RlZEZpZWxkc0luc3RhbmNlLnJlbW92ZUF0dHJpYnV0ZSh7XG4gICAgICAgICAgICAgICAgZmllbGQ6ICdjdnYnLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZTogJ2Rpc2FibGVkJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhvc3RlZEZpZWxkc0luc3RhbmNlLnJlbW92ZUF0dHJpYnV0ZSh7XG4gICAgICAgICAgICAgICAgZmllbGQ6ICdleHBpcmF0aW9uRGF0ZScsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlOiAnZGlzYWJsZWQnXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3N1Ym1pdChjb250ZXh0Q29uZmlnKSB7XG4gICAgICAgIHRoaXMuc3Bpbm5lci5ibG9jaygpO1xuICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5jbGVhcigpO1xuXG4gICAgICAgIGlmICh0aGlzLmZvcm1WYWxpZCAmJiB0aGlzLmNhcmRWYWxpZCkge1xuICAgICAgICAgICAgY29uc3Qgc2F2ZV9jYXJkID0gdGhpcy5kZWZhdWx0Q29uZmlnLmNhbl9zYXZlX3ZhdWx0X3Rva2VuID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgbGV0IHZhdWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BwY3AtY3JlZGl0LWNhcmQtdmF1bHQnKSA/XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BwY3AtY3JlZGl0LWNhcmQtdmF1bHQnKS5jaGVja2VkIDogc2F2ZV9jYXJkO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdENvbmZpZy5lbmZvcmNlX3ZhdWx0KSB7XG4gICAgICAgICAgICAgICAgdmF1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY29udGluZ2VuY3kgPSB0aGlzLmRlZmF1bHRDb25maWcuaG9zdGVkX2ZpZWxkcy5jb250aW5nZW5jeTtcbiAgICAgICAgICAgIGNvbnN0IGhvc3RlZEZpZWxkc0RhdGEgPSB7XG4gICAgICAgICAgICAgICAgdmF1bHQ6IHZhdWx0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGNvbnRpbmdlbmN5ICE9PSAnTk9fM0RfU0VDVVJFJykge1xuICAgICAgICAgICAgICAgIGhvc3RlZEZpZWxkc0RhdGEuY29udGluZ2VuY2llcyA9IFtjb250aW5nZW5jeV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRDb25maWcucGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBob3N0ZWRGaWVsZHNEYXRhLmNhcmRob2xkZXJOYW1lID0gdGhpcy5kZWZhdWx0Q29uZmlnLnBheWVyLm5hbWUuZ2l2ZW5fbmFtZSArICcgJyArIHRoaXMuZGVmYXVsdENvbmZpZy5wYXllci5uYW1lLnN1cm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWhvc3RlZEZpZWxkc0RhdGEuY2FyZGhvbGRlck5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdE5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmlsbGluZ19maXJzdF9uYW1lJykgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmlsbGluZ19maXJzdF9uYW1lJykudmFsdWUgOiAnJztcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0TmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiaWxsaW5nX2xhc3RfbmFtZScpID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JpbGxpbmdfbGFzdF9uYW1lJykudmFsdWUgOiAnJztcblxuICAgICAgICAgICAgICAgIGhvc3RlZEZpZWxkc0RhdGEuY2FyZGhvbGRlck5hbWUgPSBmaXJzdE5hbWUgKyAnICcgKyBsYXN0TmFtZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2Uuc3VibWl0KGhvc3RlZEZpZWxkc0RhdGEpLnRoZW4oKHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLm9yZGVySUQgPSBwYXlsb2FkLm9yZGVySWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGlubmVyLnVuYmxvY2soKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dENvbmZpZy5vbkFwcHJvdmUocGF5bG9hZCk7XG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3Bpbm5lci51bmJsb2NrKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuY2xlYXIoKTtcblxuICAgICAgICAgICAgICAgIGlmIChlcnIuZGV0YWlscykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5tZXNzYWdlKGVyci5kZXRhaWxzLm1hcChkID0+IGAke2QuaXNzdWV9ICR7ZC5kZXNjcmlwdGlvbn1gKS5qb2luKCc8YnIvPicpLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3Bpbm5lci51bmJsb2NrKCk7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gISB0aGlzLmNhcmRWYWxpZCA/IHRoaXMuZGVmYXVsdENvbmZpZy5ob3N0ZWRfZmllbGRzLmxhYmVscy5jYXJkX25vdF9zdXBwb3J0ZWQgOiB0aGlzLmRlZmF1bHRDb25maWcuaG9zdGVkX2ZpZWxkcy5sYWJlbHMuZmllbGRzX25vdF92YWxpZDtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLm1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfY2FyZE51bWJlckZpbGVkQ0xhc3NOYW1lQnlDYXJkVHlwZShjYXJkVHlwZSkge1xuICAgICAgICByZXR1cm4gY2FyZFR5cGUgPT09ICdhbWVyaWNhbi1leHByZXNzJyA/ICdhbWV4JyA6IGNhcmRUeXBlLnJlcGxhY2UoJy0nLCAnJyk7XG4gICAgfVxuXG4gICAgX3JlY3JlYXRlRWxlbWVudENsYXNzQXR0cmlidXRlKGVsZW1lbnQsIG5ld0NsYXNzTmFtZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKVxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBuZXdDbGFzc05hbWUpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IENyZWRpdENhcmRSZW5kZXJlcjtcbiIsImNvbnN0IHN0b3JhZ2VLZXkgPSAncHBjcC1kYXRhLWNsaWVudC1pZCc7XG5cbmNvbnN0IHZhbGlkYXRlVG9rZW4gPSAodG9rZW4sIHVzZXIpID0+IHtcbiAgICBpZiAoISB0b2tlbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0b2tlbi51c2VyICE9PSB1c2VyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICBjb25zdCBpc0V4cGlyZWQgPSBjdXJyZW50VGltZSA+PSB0b2tlbi5leHBpcmF0aW9uICogMTAwMDtcbiAgICByZXR1cm4gISBpc0V4cGlyZWQ7XG59XG5cbmNvbnN0IHN0b3JlZFRva2VuRm9yVXNlciA9ICh1c2VyKSA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oc3RvcmFnZUtleSkpO1xuICAgIGlmICh2YWxpZGF0ZVRva2VuKHRva2VuLCB1c2VyKSkge1xuICAgICAgICByZXR1cm4gdG9rZW4udG9rZW47XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5jb25zdCBzdG9yZVRva2VuID0gKHRva2VuKSA9PiB7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShzdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeSh0b2tlbikpO1xufVxuXG5jb25zdCBkYXRhQ2xpZW50SWRBdHRyaWJ1dGVIYW5kbGVyID0gKHNjcmlwdCwgY29uZmlnKSA9PiB7XG4gICAgZmV0Y2goY29uZmlnLmVuZHBvaW50LCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBub25jZTogY29uZmlnLm5vbmNlXG4gICAgICAgIH0pXG4gICAgfSkudGhlbigocmVzKT0+e1xuICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgICB9KS50aGVuKChkYXRhKT0+e1xuICAgICAgICBjb25zdCBpc1ZhbGlkID0gdmFsaWRhdGVUb2tlbihkYXRhLCBjb25maWcudXNlcik7XG4gICAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN0b3JlVG9rZW4oZGF0YSk7XG4gICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2xpZW50LXRva2VuJywgZGF0YS50b2tlbik7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHNjcmlwdCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRhdGFDbGllbnRJZEF0dHJpYnV0ZUhhbmRsZXI7XG4iLCJjbGFzcyBNZXNzYWdlUmVuZGVyZXIge1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgaWYgKCEgdGhpcy5zaG91bGRSZW5kZXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF5cGFsLk1lc3NhZ2VzKHtcbiAgICAgICAgICAgIGFtb3VudDogdGhpcy5jb25maWcuYW1vdW50LFxuICAgICAgICAgICAgcGxhY2VtZW50OiB0aGlzLmNvbmZpZy5wbGFjZW1lbnQsXG4gICAgICAgICAgICBzdHlsZTogdGhpcy5jb25maWcuc3R5bGVcbiAgICAgICAgfSkucmVuZGVyKHRoaXMuY29uZmlnLndyYXBwZXIpO1xuXG4gICAgICAgIGpRdWVyeShkb2N1bWVudC5ib2R5KS5vbigndXBkYXRlZF9jYXJ0X3RvdGFscycsICgpID0+IHtcbiAgICAgICAgICAgIHBheXBhbC5NZXNzYWdlcyh7XG4gICAgICAgICAgICAgICAgYW1vdW50OiB0aGlzLmNvbmZpZy5hbW91bnQsXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50OiB0aGlzLmNvbmZpZy5wbGFjZW1lbnQsXG4gICAgICAgICAgICAgICAgc3R5bGU6IHRoaXMuY29uZmlnLnN0eWxlXG4gICAgICAgICAgICB9KS5yZW5kZXIodGhpcy5jb25maWcud3JhcHBlcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlcldpdGhBbW91bnQoYW1vdW50KSB7XG5cbiAgICAgICAgaWYgKCEgdGhpcy5zaG91bGRSZW5kZXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBuZXdXcmFwcGVyLnNldEF0dHJpYnV0ZSgnaWQnLCB0aGlzLmNvbmZpZy53cmFwcGVyLnJlcGxhY2UoJyMnLCAnJykpO1xuXG4gICAgICAgIGNvbnN0IHNpYmxpbmcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuY29uZmlnLndyYXBwZXIpLm5leHRTaWJsaW5nO1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuY29uZmlnLndyYXBwZXIpLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmNvbmZpZy53cmFwcGVyKSk7XG4gICAgICAgIHNpYmxpbmcucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUobmV3V3JhcHBlciwgc2libGluZyk7XG4gICAgICAgIHBheXBhbC5NZXNzYWdlcyh7XG4gICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgICBwbGFjZW1lbnQ6IHRoaXMuY29uZmlnLnBsYWNlbWVudCxcbiAgICAgICAgICAgIHN0eWxlOiB0aGlzLmNvbmZpZy5zdHlsZVxuICAgICAgICB9KS5yZW5kZXIodGhpcy5jb25maWcud3JhcHBlcik7XG4gICAgfVxuXG4gICAgc2hvdWxkUmVuZGVyKCkge1xuXG4gICAgICAgIGlmICh0eXBlb2YgcGF5cGFsLk1lc3NhZ2VzID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgdGhpcy5jb25maWcud3JhcHBlciA9PT0gJ3VuZGVmaW5lZCcgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmNvbmZpZy53cmFwcGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGhpZGVNZXNzYWdlcygpIHtcbiAgICAgICAgY29uc3QgZG9tRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5jb25maWcud3JhcHBlcik7XG4gICAgICAgIGlmICghIGRvbUVsZW1lbnQgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZG9tRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBNZXNzYWdlUmVuZGVyZXI7XG4iLCJjbGFzcyBTcGlubmVyIHtcblxuICAgIGNvbnN0cnVjdG9yKHRhcmdldCA9ICdmb3JtLndvb2NvbW1lcmNlLWNoZWNrb3V0Jykge1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICB9XG5cbiAgICBzZXRUYXJnZXQodGFyZ2V0KSB7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIH1cblxuICAgIGJsb2NrKCkge1xuXG4gICAgICAgIGpRdWVyeSggdGhpcy50YXJnZXQgKS5ibG9jayh7XG4gICAgICAgICAgICBtZXNzYWdlOiBudWxsLFxuICAgICAgICAgICAgb3ZlcmxheUNTUzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICcjZmZmJyxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjZcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdW5ibG9jaygpIHtcblxuICAgICAgICBqUXVlcnkoIHRoaXMudGFyZ2V0ICkudW5ibG9jaygpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3Bpbm5lcjtcbiIsImltcG9ydCB7UGF5bWVudE1ldGhvZHN9IGZyb20gXCIuLi9IZWxwZXIvQ2hlY2tvdXRNZXRob2RTdGF0ZVwiO1xuaW1wb3J0IGVycm9ySGFuZGxlciBmcm9tIFwiLi4vRXJyb3JIYW5kbGVyXCI7XG5cbmNsYXNzIEZyZWVUcmlhbEhhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHNwaW5uZXIsXG4gICAgICAgIGVycm9ySGFuZGxlclxuICAgICkge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5zcGlubmVyID0gc3Bpbm5lcjtcbiAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7XG4gICAgfVxuXG4gICAgaGFuZGxlKClcbiAgICB7XG4gICAgICAgIHRoaXMuc3Bpbm5lci5ibG9jaygpO1xuXG4gICAgICAgIGZldGNoKHRoaXMuY29uZmlnLmFqYXgudmF1bHRfcGF5cGFsLmVuZHBvaW50LCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBub25jZTogdGhpcy5jb25maWcuYWpheC52YXVsdF9wYXlwYWwubm9uY2UsXG4gICAgICAgICAgICAgICAgcmV0dXJuX3VybDogbG9jYXRpb24uaHJlZlxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xuICAgICAgICB9KS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNwaW5uZXIudW5ibG9jaygpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIubWVzc2FnZShkYXRhLmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoZGF0YS5kYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gZGF0YS5kYXRhLmFwcHJvdmVfbGluaztcbiAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5zcGlubmVyLnVuYmxvY2soKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuZ2VuZXJpY0Vycm9yKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IEZyZWVUcmlhbEhhbmRsZXI7XG4iLCJpbXBvcnQgTWluaUNhcnRCb290c3RhcCBmcm9tICcuL21vZHVsZXMvQ29udGV4dEJvb3RzdHJhcC9NaW5pQ2FydEJvb3RzdGFwJztcbmltcG9ydCBTaW5nbGVQcm9kdWN0Qm9vdHN0YXAgZnJvbSAnLi9tb2R1bGVzL0NvbnRleHRCb290c3RyYXAvU2luZ2xlUHJvZHVjdEJvb3RzdGFwJztcbmltcG9ydCBDYXJ0Qm9vdHN0cmFwIGZyb20gJy4vbW9kdWxlcy9Db250ZXh0Qm9vdHN0cmFwL0NhcnRCb290c3RhcCc7XG5pbXBvcnQgQ2hlY2tvdXRCb290c3RhcCBmcm9tICcuL21vZHVsZXMvQ29udGV4dEJvb3RzdHJhcC9DaGVja291dEJvb3RzdGFwJztcbmltcG9ydCBQYXlOb3dCb290c3RyYXAgZnJvbSBcIi4vbW9kdWxlcy9Db250ZXh0Qm9vdHN0cmFwL1BheU5vd0Jvb3RzdHJhcFwiO1xuaW1wb3J0IFJlbmRlcmVyIGZyb20gJy4vbW9kdWxlcy9SZW5kZXJlci9SZW5kZXJlcic7XG5pbXBvcnQgRXJyb3JIYW5kbGVyIGZyb20gJy4vbW9kdWxlcy9FcnJvckhhbmRsZXInO1xuaW1wb3J0IENyZWRpdENhcmRSZW5kZXJlciBmcm9tIFwiLi9tb2R1bGVzL1JlbmRlcmVyL0NyZWRpdENhcmRSZW5kZXJlclwiO1xuaW1wb3J0IGRhdGFDbGllbnRJZEF0dHJpYnV0ZUhhbmRsZXIgZnJvbSBcIi4vbW9kdWxlcy9EYXRhQ2xpZW50SWRBdHRyaWJ1dGVIYW5kbGVyXCI7XG5pbXBvcnQgTWVzc2FnZVJlbmRlcmVyIGZyb20gXCIuL21vZHVsZXMvUmVuZGVyZXIvTWVzc2FnZVJlbmRlcmVyXCI7XG5pbXBvcnQgU3Bpbm5lciBmcm9tIFwiLi9tb2R1bGVzL0hlbHBlci9TcGlubmVyXCI7XG5pbXBvcnQge1xuICAgIGdldEN1cnJlbnRQYXltZW50TWV0aG9kLFxuICAgIE9SREVSX0JVVFRPTl9TRUxFQ1RPUixcbiAgICBQYXltZW50TWV0aG9kc1xufSBmcm9tIFwiLi9tb2R1bGVzL0hlbHBlci9DaGVja291dE1ldGhvZFN0YXRlXCI7XG5pbXBvcnQge2hpZGUsIHNldFZpc2libGV9IGZyb20gXCIuL21vZHVsZXMvSGVscGVyL0hpZGluZ1wiO1xuaW1wb3J0IHtpc0NoYW5nZVBheW1lbnRQYWdlfSBmcm9tIFwiLi9tb2R1bGVzL0hlbHBlci9TdWJzY3JpcHRpb25zXCI7XG5pbXBvcnQgRnJlZVRyaWFsSGFuZGxlciBmcm9tIFwiLi9tb2R1bGVzL0FjdGlvbkhhbmRsZXIvRnJlZVRyaWFsSGFuZGxlclwiO1xuXG4vLyBUT0RPOiBjb3VsZCBiZSBhIGdvb2QgaWRlYSB0byBoYXZlIGEgc2VwYXJhdGUgc3Bpbm5lciBmb3IgZWFjaCBnYXRld2F5LFxuLy8gYnV0IEkgdGhpbmsgd2UgY2FyZSBtYWlubHkgYWJvdXQgdGhlIHNjcmlwdCBsb2FkaW5nLCBzbyBvbmUgc3Bpbm5lciBzaG91bGQgYmUgZW5vdWdoLlxuY29uc3QgYnV0dG9uc1NwaW5uZXIgPSBuZXcgU3Bpbm5lcihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHBjLWJ1dHRvbi13cmFwcGVyJykpO1xuY29uc3QgY2FyZHNTcGlubmVyID0gbmV3IFNwaW5uZXIoJyNwcGNwLWhvc3RlZC1maWVsZHMnKTtcblxuY29uc3QgYm9vdHN0cmFwID0gKCkgPT4ge1xuICAgIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoUGF5UGFsQ29tbWVyY2VHYXRld2F5LmxhYmVscy5lcnJvci5nZW5lcmljKTtcbiAgICBjb25zdCBzcGlubmVyID0gbmV3IFNwaW5uZXIoKTtcbiAgICBjb25zdCBjcmVkaXRDYXJkUmVuZGVyZXIgPSBuZXcgQ3JlZGl0Q2FyZFJlbmRlcmVyKFBheVBhbENvbW1lcmNlR2F0ZXdheSwgZXJyb3JIYW5kbGVyLCBzcGlubmVyKTtcblxuICAgIGNvbnN0IGZyZWVUcmlhbEhhbmRsZXIgPSBuZXcgRnJlZVRyaWFsSGFuZGxlcihQYXlQYWxDb21tZXJjZUdhdGV3YXksIHNwaW5uZXIsIGVycm9ySGFuZGxlcik7XG5cbiAgICBjb25zdCBvblNtYXJ0QnV0dG9uQ2xpY2sgPSAoZGF0YSwgYWN0aW9ucykgPT4ge1xuICAgICAgICB3aW5kb3cucHBjcEZ1bmRpbmdTb3VyY2UgPSBkYXRhLmZ1bmRpbmdTb3VyY2U7XG5cbiAgICAgICAgaWYgKFBheVBhbENvbW1lcmNlR2F0ZXdheS5iYXNpY19jaGVja291dF92YWxpZGF0aW9uX2VuYWJsZWQpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHF1aWNrIGZpeCB0byBnZXQgdGhlIGVycm9yIGFib3V0IGVtcHR5IGZvcm0gYmVmb3JlIGF0dGVtcHRpbmcgUGF5UGFsIG9yZGVyXG4gICAgICAgICAgICAvLyBpdCBzaG91bGQgc29sdmUgIzUxMyBmb3IgbW9zdCBvZiB0aGUgdXNlcnMsIGJ1dCBwcm9wZXIgc29sdXRpb24gc2hvdWxkIGJlIGltcGxlbWVudGVkIGxhdGVyLlxuICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRGaWVsZHMgPSBqUXVlcnkoJ2Zvcm0ud29vY29tbWVyY2UtY2hlY2tvdXQgLnZhbGlkYXRlLXJlcXVpcmVkOnZpc2libGUgOmlucHV0Jyk7XG4gICAgICAgICAgICByZXF1aXJlZEZpZWxkcy5lYWNoKChpLCBpbnB1dCkgPT4ge1xuICAgICAgICAgICAgICAgIGpRdWVyeShpbnB1dCkudHJpZ2dlcigndmFsaWRhdGUnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgaW52YWxpZEZpZWxkcyA9IEFycmF5LmZyb20oalF1ZXJ5KCdmb3JtLndvb2NvbW1lcmNlLWNoZWNrb3V0IC52YWxpZGF0ZS1yZXF1aXJlZC53b29jb21tZXJjZS1pbnZhbGlkOnZpc2libGUnKSk7XG4gICAgICAgICAgICBpZiAoaW52YWxpZEZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiaWxsaW5nRmllbGRzQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndvb2NvbW1lcmNlLWJpbGxpbmctZmllbGRzJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hpcHBpbmdGaWVsZHNDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud29vY29tbWVyY2Utc2hpcHBpbmctZmllbGRzJyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lTWVzc2FnZU1hcCA9IFBheVBhbENvbW1lcmNlR2F0ZXdheS5sYWJlbHMuZXJyb3IucmVxdWlyZWQuZWxlbWVudHM7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBpbnZhbGlkRmllbGRzLm1hcChlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBlbC5xdWVyeVNlbGVjdG9yKCdbbmFtZV0nKT8uZ2V0QXR0cmlidXRlKCduYW1lJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUgaW4gbmFtZU1lc3NhZ2VNYXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lTWVzc2FnZU1hcFtuYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBlbC5xdWVyeVNlbGVjdG9yKCdsYWJlbCcpLnRleHRDb250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgnKicsICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJpbGxpbmdGaWVsZHNDb250YWluZXI/LmNvbnRhaW5zKGVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBQYXlQYWxDb21tZXJjZUdhdGV3YXkubGFiZWxzLmJpbGxpbmdfZmllbGQucmVwbGFjZSgnJXMnLCBsYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNoaXBwaW5nRmllbGRzQ29udGFpbmVyPy5jb250YWlucyhlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gUGF5UGFsQ29tbWVyY2VHYXRld2F5LmxhYmVscy5zaGlwcGluZ19maWVsZC5yZXBsYWNlKCclcycsIGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGF5UGFsQ29tbWVyY2VHYXRld2F5LmxhYmVscy5lcnJvci5yZXF1aXJlZC5maWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJyVzJywgYDxzdHJvbmc+JHtsYWJlbH08L3N0cm9uZz5gKVxuICAgICAgICAgICAgICAgIH0pLmZpbHRlcihzID0+IHMubGVuZ3RoID4gMik7XG5cbiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2gocyA9PiBlcnJvckhhbmRsZXIubWVzc2FnZShzKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm1lc3NhZ2UoUGF5UGFsQ29tbWVyY2VHYXRld2F5LmxhYmVscy5lcnJvci5yZXF1aXJlZC5nZW5lcmljKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9ucy5yZWplY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtLndvb2NvbW1lcmNlLWNoZWNrb3V0Jyk7XG4gICAgICAgIGlmIChmb3JtKSB7XG4gICAgICAgICAgICBqUXVlcnkoJyNwcGNwLWZ1bmRpbmctc291cmNlLWZvcm0taW5wdXQnKS5yZW1vdmUoKTtcbiAgICAgICAgICAgIGZvcm0uaW5zZXJ0QWRqYWNlbnRIVE1MKFxuICAgICAgICAgICAgICAgICdiZWZvcmVlbmQnLFxuICAgICAgICAgICAgICAgIGA8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJwcGNwLWZ1bmRpbmctc291cmNlXCIgdmFsdWU9XCIke2RhdGEuZnVuZGluZ1NvdXJjZX1cIiBpZD1cInBwY3AtZnVuZGluZy1zb3VyY2UtZm9ybS1pbnB1dFwiPmBcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzRnJlZVRyaWFsID0gUGF5UGFsQ29tbWVyY2VHYXRld2F5LmlzX2ZyZWVfdHJpYWxfY2FydDtcbiAgICAgICAgaWYgKGlzRnJlZVRyaWFsICYmIGRhdGEuZnVuZGluZ1NvdXJjZSAhPT0gJ2NhcmQnKSB7XG4gICAgICAgICAgICBmcmVlVHJpYWxIYW5kbGVyLmhhbmRsZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnMucmVqZWN0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IG9uU21hcnRCdXR0b25zSW5pdCA9ICgpID0+IHtcbiAgICAgICAgYnV0dG9uc1NwaW5uZXIudW5ibG9jaygpO1xuICAgIH07XG4gICAgY29uc3QgcmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIoY3JlZGl0Q2FyZFJlbmRlcmVyLCBQYXlQYWxDb21tZXJjZUdhdGV3YXksIG9uU21hcnRCdXR0b25DbGljaywgb25TbWFydEJ1dHRvbnNJbml0KTtcbiAgICBjb25zdCBtZXNzYWdlUmVuZGVyZXIgPSBuZXcgTWVzc2FnZVJlbmRlcmVyKFBheVBhbENvbW1lcmNlR2F0ZXdheS5tZXNzYWdlcyk7XG4gICAgY29uc3QgY29udGV4dCA9IFBheVBhbENvbW1lcmNlR2F0ZXdheS5jb250ZXh0O1xuICAgIGlmIChjb250ZXh0ID09PSAnbWluaS1jYXJ0JyB8fCBjb250ZXh0ID09PSAncHJvZHVjdCcpIHtcbiAgICAgICAgaWYgKFBheVBhbENvbW1lcmNlR2F0ZXdheS5taW5pX2NhcnRfYnV0dG9uc19lbmFibGVkID09PSAnMScpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pbmlDYXJ0Qm9vdHN0cmFwID0gbmV3IE1pbmlDYXJ0Qm9vdHN0YXAoXG4gICAgICAgICAgICAgICAgUGF5UGFsQ29tbWVyY2VHYXRld2F5LFxuICAgICAgICAgICAgICAgIHJlbmRlcmVyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBtaW5pQ2FydEJvb3RzdHJhcC5pbml0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29udGV4dCA9PT0gJ3Byb2R1Y3QnICYmIFBheVBhbENvbW1lcmNlR2F0ZXdheS5zaW5nbGVfcHJvZHVjdF9idXR0b25zX2VuYWJsZWQgPT09ICcxJykge1xuICAgICAgICBjb25zdCBzaW5nbGVQcm9kdWN0Qm9vdHN0cmFwID0gbmV3IFNpbmdsZVByb2R1Y3RCb290c3RhcChcbiAgICAgICAgICAgIFBheVBhbENvbW1lcmNlR2F0ZXdheSxcbiAgICAgICAgICAgIHJlbmRlcmVyLFxuICAgICAgICAgICAgbWVzc2FnZVJlbmRlcmVyLFxuICAgICAgICApO1xuXG4gICAgICAgIHNpbmdsZVByb2R1Y3RCb290c3RyYXAuaW5pdCgpO1xuICAgIH1cblxuICAgIGlmIChjb250ZXh0ID09PSAnY2FydCcpIHtcbiAgICAgICAgY29uc3QgY2FydEJvb3RzdHJhcCA9IG5ldyBDYXJ0Qm9vdHN0cmFwKFxuICAgICAgICAgICAgUGF5UGFsQ29tbWVyY2VHYXRld2F5LFxuICAgICAgICAgICAgcmVuZGVyZXIsXG4gICAgICAgICk7XG5cbiAgICAgICAgY2FydEJvb3RzdHJhcC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgPT09ICdjaGVja291dCcpIHtcbiAgICAgICAgY29uc3QgY2hlY2tvdXRCb290c3RhcCA9IG5ldyBDaGVja291dEJvb3RzdGFwKFxuICAgICAgICAgICAgUGF5UGFsQ29tbWVyY2VHYXRld2F5LFxuICAgICAgICAgICAgcmVuZGVyZXIsXG4gICAgICAgICAgICBtZXNzYWdlUmVuZGVyZXIsXG4gICAgICAgICAgICBzcGlubmVyXG4gICAgICAgICk7XG5cbiAgICAgICAgY2hlY2tvdXRCb290c3RhcC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgPT09ICdwYXktbm93JyApIHtcbiAgICAgICAgY29uc3QgcGF5Tm93Qm9vdHN0cmFwID0gbmV3IFBheU5vd0Jvb3RzdHJhcChcbiAgICAgICAgICAgIFBheVBhbENvbW1lcmNlR2F0ZXdheSxcbiAgICAgICAgICAgIHJlbmRlcmVyLFxuICAgICAgICAgICAgbWVzc2FnZVJlbmRlcmVyLFxuICAgICAgICAgICAgc3Bpbm5lclxuICAgICAgICApO1xuICAgICAgICBwYXlOb3dCb290c3RyYXAuaW5pdCgpO1xuICAgIH1cblxuICAgIGlmIChjb250ZXh0ICE9PSAnY2hlY2tvdXQnKSB7XG4gICAgICAgIG1lc3NhZ2VSZW5kZXJlci5yZW5kZXIoKTtcbiAgICB9XG59O1xuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAnRE9NQ29udGVudExvYWRlZCcsXG4gICAgKCkgPT4ge1xuICAgICAgICBpZiAoIXR5cGVvZiAoUGF5UGFsQ29tbWVyY2VHYXRld2F5KSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUGF5UGFsIGJ1dHRvbiBjb3VsZCBub3QgYmUgY29uZmlndXJlZC4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIFBheVBhbENvbW1lcmNlR2F0ZXdheS5jb250ZXh0ICE9PSAnY2hlY2tvdXQnXG4gICAgICAgICAgICAmJiBQYXlQYWxDb21tZXJjZUdhdGV3YXkuZGF0YV9jbGllbnRfaWQudXNlciA9PT0gMFxuICAgICAgICAgICAgJiYgUGF5UGFsQ29tbWVyY2VHYXRld2F5LmRhdGFfY2xpZW50X2lkLmhhc19zdWJzY3JpcHRpb25zXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF5cGFsQnV0dG9uR2F0ZXdheUlkcyA9IFtcbiAgICAgICAgICAgIFBheW1lbnRNZXRob2RzLlBBWVBBTCxcbiAgICAgICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKFBheVBhbENvbW1lcmNlR2F0ZXdheS5zZXBhcmF0ZV9idXR0b25zKS5tYXAoKFtrLCBkYXRhXSkgPT4gZGF0YS5pZCksXG4gICAgICAgIF1cblxuICAgICAgICAvLyBTb21ldGltZXMgUGF5UGFsIHNjcmlwdCB0YWtlcyBsb25nIHRpbWUgdG8gbG9hZCxcbiAgICAgICAgLy8gc28gd2UgYWRkaXRpb25hbGx5IGhpZGUgdGhlIHN0YW5kYXJkIG9yZGVyIGJ1dHRvbiBoZXJlIHRvIGF2b2lkIGZhaWxlZCBvcmRlcnMuXG4gICAgICAgIC8vIE5vcm1hbGx5IGl0IGlzIGhpZGRlbiBsYXRlciBhZnRlciB0aGUgc2NyaXB0IGxvYWQuXG4gICAgICAgIGNvbnN0IGhpZGVPcmRlckJ1dHRvbklmUHBjcEdhdGV3YXkgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBvbmx5IGluIGNoZWNrb3V0IGFuZCBwYXkgbm93IHBhZ2UsIG90aGVyd2lzZSBpdCBtYXkgYnJlYWsgdGhpbmdzIChlLmcuIHBheW1lbnQgdmlhIHByb2R1Y3QgcGFnZSksXG4gICAgICAgICAgICAvLyBhbmQgYWxzbyB0aGUgbG9hZGluZyBzcGlubmVyIG1heSBsb29rIHdlaXJkIG9uIG90aGVyIHBhZ2VzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIVsnY2hlY2tvdXQnLCAncGF5LW5vdyddLmluY2x1ZGVzKFBheVBhbENvbW1lcmNlR2F0ZXdheS5jb250ZXh0KVxuICAgICAgICAgICAgICAgIHx8IGlzQ2hhbmdlUGF5bWVudFBhZ2UoKVxuICAgICAgICAgICAgICAgIHx8IChQYXlQYWxDb21tZXJjZUdhdGV3YXkuaXNfZnJlZV90cmlhbF9jYXJ0ICYmIFBheVBhbENvbW1lcmNlR2F0ZXdheS52YXVsdGVkX3BheXBhbF9lbWFpbCAhPT0gJycpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXltZW50TWV0aG9kID0gZ2V0Q3VycmVudFBheW1lbnRNZXRob2QoKTtcbiAgICAgICAgICAgIGNvbnN0IGlzUGF5cGFsQnV0dG9uID0gcGF5cGFsQnV0dG9uR2F0ZXdheUlkcy5pbmNsdWRlcyhjdXJyZW50UGF5bWVudE1ldGhvZCk7XG4gICAgICAgICAgICBjb25zdCBpc0NhcmRzID0gY3VycmVudFBheW1lbnRNZXRob2QgPT09IFBheW1lbnRNZXRob2RzLkNBUkRTO1xuXG4gICAgICAgICAgICBzZXRWaXNpYmxlKE9SREVSX0JVVFRPTl9TRUxFQ1RPUiwgIWlzUGF5cGFsQnV0dG9uICYmICFpc0NhcmRzLCB0cnVlKTtcblxuICAgICAgICAgICAgaWYgKGlzUGF5cGFsQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgLy8gc3RvcHBlZCBhZnRlciB0aGUgZmlyc3QgcmVuZGVyaW5nIG9mIHRoZSBidXR0b25zLCBpbiBvbkluaXRcbiAgICAgICAgICAgICAgICBidXR0b25zU3Bpbm5lci5ibG9jaygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBidXR0b25zU3Bpbm5lci51bmJsb2NrKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0NhcmRzKSB7XG4gICAgICAgICAgICAgICAgY2FyZHNTcGlubmVyLmJsb2NrKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhcmRzU3Bpbm5lci51bmJsb2NrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBqUXVlcnkoZG9jdW1lbnQpLm9uKCdob3N0ZWRfZmllbGRzX2xvYWRlZCcsICgpID0+IHtcbiAgICAgICAgICAgIGNhcmRzU3Bpbm5lci51bmJsb2NrKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBib290c3RyYXBwZWQgPSBmYWxzZTtcblxuICAgICAgICBoaWRlT3JkZXJCdXR0b25JZlBwY3BHYXRld2F5KCk7XG5cbiAgICAgICAgalF1ZXJ5KGRvY3VtZW50LmJvZHkpLm9uKCd1cGRhdGVkX2NoZWNrb3V0IHBheW1lbnRfbWV0aG9kX3NlbGVjdGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGJvb3RzdHJhcHBlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaGlkZU9yZGVyQnV0dG9uSWZQcGNwR2F0ZXdheSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgc2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGJvb3RzdHJhcHBlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGJvb3RzdHJhcCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgUGF5UGFsQ29tbWVyY2VHYXRld2F5LmJ1dHRvbi51cmwpO1xuICAgICAgICBPYmplY3QuZW50cmllcyhQYXlQYWxDb21tZXJjZUdhdGV3YXkuc2NyaXB0X2F0dHJpYnV0ZXMpLmZvckVhY2goXG4gICAgICAgICAgICAoa2V5VmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKGtleVZhbHVlWzBdLCBrZXlWYWx1ZVsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKFBheVBhbENvbW1lcmNlR2F0ZXdheS5kYXRhX2NsaWVudF9pZC5zZXRfYXR0cmlidXRlKSB7XG4gICAgICAgICAgICBkYXRhQ2xpZW50SWRBdHRyaWJ1dGVIYW5kbGVyKHNjcmlwdCwgUGF5UGFsQ29tbWVyY2VHYXRld2F5LmRhdGFfY2xpZW50X2lkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHNjcmlwdCk7XG4gICAgfSxcbik7XG4iXSwibmFtZXMiOlsiRXJyb3JIYW5kbGVyIiwiY29uc3RydWN0b3IiLCJnZW5lcmljRXJyb3JUZXh0Iiwid3JhcHBlciIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsIm1lc3NhZ2VzTGlzdCIsImdlbmVyaWNFcnJvciIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiY2xlYXIiLCJtZXNzYWdlIiwiYXBwZW5kUHJlcGFyZWRFcnJvck1lc3NhZ2VFbGVtZW50IiwiZXJyb3JNZXNzYWdlRWxlbWVudCIsInByZXBhcmVNZXNzYWdlc0xpc3QiLCJyZXBsYWNlV2l0aCIsInRleHQiLCJwZXJzaXN0IiwiU3RyaW5nIiwibGVuZ3RoIiwiRXJyb3IiLCJhZGQiLCJyZW1vdmUiLCJtZXNzYWdlTm9kZSIsInByZXBhcmVNZXNzYWdlc0xpc3RJdGVtIiwiYXBwZW5kQ2hpbGQiLCJqUXVlcnkiLCJzY3JvbGxfdG9fbm90aWNlcyIsImNyZWF0ZUVsZW1lbnQiLCJzZXRBdHRyaWJ1dGUiLCJsaSIsImlubmVySFRNTCIsInNhbml0aXplIiwidGV4dGFyZWEiLCJ2YWx1ZSIsInJlcGxhY2UiLCJvbkFwcHJvdmUiLCJjb250ZXh0IiwiZXJyb3JIYW5kbGVyIiwiZGF0YSIsImFjdGlvbnMiLCJmZXRjaCIsImNvbmZpZyIsImFqYXgiLCJhcHByb3ZlX29yZGVyIiwiZW5kcG9pbnQiLCJtZXRob2QiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsIm5vbmNlIiwib3JkZXJfaWQiLCJvcmRlcklEIiwiZnVuZGluZ19zb3VyY2UiLCJ3aW5kb3ciLCJwcGNwRnVuZGluZ1NvdXJjZSIsInRoZW4iLCJyZXMiLCJqc29uIiwic3VjY2VzcyIsInJlc3RhcnQiLCJjYXRjaCIsImVyciIsImxvY2F0aW9uIiwiaHJlZiIsInJlZGlyZWN0IiwicGF5ZXJEYXRhIiwicGF5ZXIiLCJQYXlQYWxDb21tZXJjZUdhdGV3YXkiLCJwaG9uZSIsInBob25lX3R5cGUiLCJwaG9uZV9udW1iZXIiLCJuYXRpb25hbF9udW1iZXIiLCJlbWFpbF9hZGRyZXNzIiwibmFtZSIsInN1cm5hbWUiLCJnaXZlbl9uYW1lIiwiYWRkcmVzcyIsImNvdW50cnlfY29kZSIsImFkZHJlc3NfbGluZV8xIiwiYWRkcmVzc19saW5lXzIiLCJhZG1pbl9hcmVhXzEiLCJhZG1pbl9hcmVhXzIiLCJwb3N0YWxfY29kZSIsIlBheW1lbnRNZXRob2RzIiwiUEFZUEFMIiwiQ0FSRFMiLCJPWFhPIiwiQ0FSRF9CVVRUT04iLCJPUkRFUl9CVVRUT05fU0VMRUNUT1IiLCJnZXRDdXJyZW50UGF5bWVudE1ldGhvZCIsImVsIiwiaXNTYXZlZENhcmRTZWxlY3RlZCIsInNhdmVkQ2FyZExpc3QiLCJDYXJ0QWN0aW9uSGFuZGxlciIsImNvbmZpZ3VyYXRpb24iLCJjcmVhdGVPcmRlciIsImJuQ29kZSIsImJuX2NvZGVzIiwiY3JlYXRlX29yZGVyIiwicHVyY2hhc2VfdW5pdHMiLCJwYXltZW50X21ldGhvZCIsImJuX2NvZGUiLCJjb25zb2xlIiwiZXJyb3IiLCJpZCIsIm9uRXJyb3IiLCJNaW5pQ2FydEJvb3RzdGFwIiwiZ2F0ZXdheSIsInJlbmRlcmVyIiwiYWN0aW9uSGFuZGxlciIsImluaXQiLCJsYWJlbHMiLCJnZW5lcmljIiwicmVuZGVyIiwib24iLCJzaG91bGRSZW5kZXIiLCJidXR0b24iLCJtaW5pX2NhcnRfd3JhcHBlciIsImhvc3RlZF9maWVsZHMiLCJzdHlsZSIsIm1pbmlfY2FydF9zdHlsZSIsIlByb2R1Y3QiLCJVcGRhdGVDYXJ0IiwidXBkYXRlIiwib25SZXNvbHZlIiwicHJvZHVjdHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInJlc3VsdCIsInJlc29sdmVkIiwiQnV0dG9uc1RvZ2dsZUxpc3RlbmVyIiwiZWxlbWVudCIsInNob3dDYWxsYmFjayIsImhpZGVDYWxsYmFjayIsIm9ic2VydmVyIiwiYXR0cmlidXRlcyIsImNhbGxiYWNrIiwiTXV0YXRpb25PYnNlcnZlciIsIm9ic2VydmUiLCJkaXNjb25uZWN0IiwicXVhbnRpdHkiLCJ2YXJpYXRpb25zIiwiU2luZ2xlUHJvZHVjdEFjdGlvbkhhbmRsZXIiLCJ1cGRhdGVDYXJ0Iiwic2hvd0J1dHRvbkNhbGxiYWNrIiwiaGlkZUJ1dHRvbkNhbGxiYWNrIiwiZm9ybUVsZW1lbnQiLCJoYXNWYXJpYXRpb25zIiwiZ2V0UHJvZHVjdHMiLCJpc0dyb3VwZWRQcm9kdWN0IiwicXR5IiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJlbGVtZW50TmFtZSIsImdldEF0dHJpYnV0ZSIsIm1hdGNoIiwicGFyc2VJbnQiLCJwdXNoIiwicHJvbWlzZSIsIm1hcCIsIlNpbmdsZVByb2R1Y3RCb290c3RhcCIsIm1lc3NhZ2VzIiwiaGFuZGxlQ2hhbmdlIiwiaGlkZUJ1dHRvbnMiLCJoaWRlTWVzc2FnZXMiLCJhZGRFdmVudExpc3RlbmVyIiwiYmluZCIsInByaWNlQW1vdW50SXNaZXJvIiwicHJpY2VBbW91bnQiLCJwcmljZVRleHQiLCJpbm5lclRleHQiLCJwYXJzZUZsb2F0IiwiY2hhbmdlX2NhcnQiLCJzaG93QnV0dG9ucyIsInJlbmRlcldpdGhBbW91bnQiLCJDYXJ0Qm9vdHN0cmFwIiwic3Bpbm5lciIsImJsb2NrIiwidW5ibG9jayIsImNvZGUiLCJjbGljayIsIkNoZWNrb3V0QWN0aW9uSGFuZGxlciIsImZvcm1TZWxlY3RvciIsImZvcm1EYXRhIiwiRm9ybURhdGEiLCJmb3JtSnNvbk9iaiIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwiY3JlYXRlYWNjb3VudCIsImlzIiwicGF5bWVudE1ldGhvZCIsImZ1bmRpbmdTb3VyY2UiLCJmb3JtIiwiZG9tUGFyc2VyIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwiZGV0YWlscyIsImQiLCJpc3N1ZSIsImRlc2NyaXB0aW9uIiwiam9pbiIsImlucHV0IiwiY3VzdG9tX2lkIiwiYXBwZW5kIiwib25DYW5jZWwiLCJnZXRFbGVtZW50Iiwic2VsZWN0b3JPckVsZW1lbnQiLCJpc1Zpc2libGUiLCJvZmZzZXRXaWR0aCIsIm9mZnNldEhlaWdodCIsImdldENsaWVudFJlY3RzIiwic2V0VmlzaWJsZSIsInNob3ciLCJpbXBvcnRhbnQiLCJjdXJyZW50VmFsdWUiLCJnZXRQcm9wZXJ0eVZhbHVlIiwic2V0UHJvcGVydHkiLCJyZW1vdmVQcm9wZXJ0eSIsImhpZGUiLCJDaGVja291dEJvb3RzdGFwIiwic3RhbmRhcmRPcmRlckJ1dHRvblNlbGVjdG9yIiwiYnV0dG9uQ2hhbmdlT2JzZXJ2ZXIiLCJ1cGRhdGVVaSIsInZhbCIsImNhbmNlbF93cmFwcGVyIiwiY3VycmVudFBheW1lbnRNZXRob2QiLCJpc1BheXBhbCIsImlzQ2FyZCIsImlzU2VwYXJhdGVCdXR0b25HYXRld2F5IiwiaW5jbHVkZXMiLCJpc1NhdmVkQ2FyZCIsImlzTm90T3VyR2F0ZXdheSIsImlzRnJlZVRyaWFsIiwiaXNfZnJlZV90cmlhbF9jYXJ0IiwiaGFzVmF1bHRlZFBheXBhbCIsInZhdWx0ZWRfcGF5cGFsX2VtYWlsIiwicGF5cGFsQnV0dG9uV3JhcHBlcnMiLCJlbnRyaWVzIiwic2VwYXJhdGVfYnV0dG9ucyIsInJlZHVjZSIsImsiLCJnYXRld2F5SWQiLCJkaXNhYmxlQ3JlZGl0Q2FyZEZpZWxkcyIsImVuYWJsZUNyZWRpdENhcmRGaWVsZHMiLCJhZGRDbGFzcyIsImF0dHIiLCJyZW1vdmVDbGFzcyIsImlzQ2hhbmdlUGF5bWVudFBhZ2UiLCJ1cmxQYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMiLCJzZWFyY2giLCJoYXMiLCJQYXlOb3dCb290c3RyYXAiLCJtZXJnZSIsIlJlbmRlcmVyIiwiY3JlZGl0Q2FyZFJlbmRlcmVyIiwiZGVmYXVsdFNldHRpbmdzIiwib25TbWFydEJ1dHRvbkNsaWNrIiwib25TbWFydEJ1dHRvbnNJbml0IiwicmVuZGVyZWRTb3VyY2VzIiwiU2V0IiwiY29udGV4dENvbmZpZyIsInNldHRpbmdzT3ZlcnJpZGUiLCJzZXR0aW5ncyIsImVuYWJsZWRTZXBhcmF0ZUdhdGV3YXlzIiwiZmlsdGVyIiwicyIsImhhc0VuYWJsZWRTZXBhcmF0ZUdhdGV3YXlzIiwia2V5cyIsInJlbmRlckJ1dHRvbnMiLCJwYXlwYWwiLCJnZXRGdW5kaW5nU291cmNlcyIsInNoYXBlIiwiaXNBbHJlYWR5UmVuZGVyZWQiLCJCdXR0b25zIiwiYnRuIiwib25DbGljayIsIm9uSW5pdCIsImlzRWxpZ2libGUiLCJoYXNDaGlsZE5vZGVzIiwiZG9tRWxlbWVudCIsImRpc3BsYXkiLCJkaXNhYmxlRmllbGRzIiwiZW5hYmxlRmllbGRzIiwiZGNjSW5wdXRGYWN0b3J5Iiwib3JpZ2luYWwiLCJzdHlsZXMiLCJnZXRDb21wdXRlZFN0eWxlIiwibmV3RWxlbWVudCIsImNsYXNzTmFtZSIsInZhbHVlcyIsInByb3AiLCJpc05hTiIsIkNyZWRpdENhcmRSZW5kZXJlciIsImRlZmF1bHRDb25maWciLCJjYXJkVmFsaWQiLCJmb3JtVmFsaWQiLCJjdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2UiLCJIb3N0ZWRGaWVsZHMiLCJ3cmFwcGVyRWxlbWVudCIsInBhcmVudE5vZGUiLCJyZW1vdmVDaGlsZCIsImJ1dHRvblNlbGVjdG9yIiwidGVhcmRvd24iLCJnYXRlV2F5Qm94Iiwib2xkRGlzcGxheVN0eWxlIiwiaGlkZURjY0dhdGV3YXkiLCJjYXJkTnVtYmVyRmllbGQiLCJzdHlsZXNSYXciLCJjYXJkTnVtYmVyIiwicmVwbGFjZUNoaWxkIiwiY2FyZEV4cGlyeUZpZWxkIiwiY2FyZEV4cGlyeSIsImNhcmRDb2RlRmllbGQiLCJjYXJkQ29kZSIsImZvcm1XcmFwcGVyIiwiZW5mb3JjZV92YXVsdCIsImNoZWNrZWQiLCJmaWVsZHMiLCJudW1iZXIiLCJzZWxlY3RvciIsInBsYWNlaG9sZGVyIiwiY3JlZGl0X2NhcmRfbnVtYmVyIiwiY3Z2IiwiZXhwaXJhdGlvbkRhdGUiLCJtbV95eSIsImhvc3RlZEZpZWxkcyIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsIl9zdWJtaXQiLCJldmVudCIsImNhcmRzIiwidmFsaWRDYXJkcyIsInZhbGlkX2NhcmRzIiwiaW5kZXhPZiIsInR5cGUiLCJfY2FyZE51bWJlckZpbGVkQ0xhc3NOYW1lQnlDYXJkVHlwZSIsIl9yZWNyZWF0ZUVsZW1lbnRDbGFzc0F0dHJpYnV0ZSIsImlzVmFsaWQiLCJldmVyeSIsImtleSIsInByZXZlbnREZWZhdWx0IiwiZmllbGQiLCJhdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzYXZlX2NhcmQiLCJjYW5fc2F2ZV92YXVsdF90b2tlbiIsInZhdWx0IiwiZ2V0RWxlbWVudEJ5SWQiLCJjb250aW5nZW5jeSIsImhvc3RlZEZpZWxkc0RhdGEiLCJjb250aW5nZW5jaWVzIiwiY2FyZGhvbGRlck5hbWUiLCJmaXJzdE5hbWUiLCJsYXN0TmFtZSIsInN1Ym1pdCIsInBheWxvYWQiLCJvcmRlcklkIiwiY2FyZF9ub3Rfc3VwcG9ydGVkIiwiZmllbGRzX25vdF92YWxpZCIsImNhcmRUeXBlIiwibmV3Q2xhc3NOYW1lIiwic3RvcmFnZUtleSIsInZhbGlkYXRlVG9rZW4iLCJ0b2tlbiIsInVzZXIiLCJjdXJyZW50VGltZSIsIkRhdGUiLCJnZXRUaW1lIiwiaXNFeHBpcmVkIiwiZXhwaXJhdGlvbiIsInN0b3JlZFRva2VuRm9yVXNlciIsInBhcnNlIiwic2Vzc2lvblN0b3JhZ2UiLCJnZXRJdGVtIiwic3RvcmVUb2tlbiIsInNldEl0ZW0iLCJkYXRhQ2xpZW50SWRBdHRyaWJ1dGVIYW5kbGVyIiwic2NyaXB0IiwiTWVzc2FnZVJlbmRlcmVyIiwiTWVzc2FnZXMiLCJhbW91bnQiLCJwbGFjZW1lbnQiLCJuZXdXcmFwcGVyIiwic2libGluZyIsIm5leHRTaWJsaW5nIiwicGFyZW50RWxlbWVudCIsImluc2VydEJlZm9yZSIsIlNwaW5uZXIiLCJ0YXJnZXQiLCJzZXRUYXJnZXQiLCJvdmVybGF5Q1NTIiwiYmFja2dyb3VuZCIsIm9wYWNpdHkiLCJGcmVlVHJpYWxIYW5kbGVyIiwiaGFuZGxlIiwidmF1bHRfcGF5cGFsIiwicmV0dXJuX3VybCIsImFwcHJvdmVfbGluayIsImJ1dHRvbnNTcGlubmVyIiwiY2FyZHNTcGlubmVyIiwiYm9vdHN0cmFwIiwiZnJlZVRyaWFsSGFuZGxlciIsImJhc2ljX2NoZWNrb3V0X3ZhbGlkYXRpb25fZW5hYmxlZCIsInJlcXVpcmVkRmllbGRzIiwiZWFjaCIsImkiLCJ0cmlnZ2VyIiwiaW52YWxpZEZpZWxkcyIsIkFycmF5IiwiZnJvbSIsImJpbGxpbmdGaWVsZHNDb250YWluZXIiLCJzaGlwcGluZ0ZpZWxkc0NvbnRhaW5lciIsIm5hbWVNZXNzYWdlTWFwIiwicmVxdWlyZWQiLCJlbGVtZW50cyIsImxhYmVsIiwidGV4dENvbnRlbnQiLCJyZXBsYWNlQWxsIiwidHJpbSIsImJpbGxpbmdfZmllbGQiLCJzaGlwcGluZ19maWVsZCIsImluc2VydEFkamFjZW50SFRNTCIsIm1lc3NhZ2VSZW5kZXJlciIsIm1pbmlfY2FydF9idXR0b25zX2VuYWJsZWQiLCJtaW5pQ2FydEJvb3RzdHJhcCIsInNpbmdsZV9wcm9kdWN0X2J1dHRvbnNfZW5hYmxlZCIsInNpbmdsZVByb2R1Y3RCb290c3RyYXAiLCJjYXJ0Qm9vdHN0cmFwIiwiY2hlY2tvdXRCb290c3RhcCIsInBheU5vd0Jvb3RzdHJhcCIsImRhdGFfY2xpZW50X2lkIiwiaGFzX3N1YnNjcmlwdGlvbnMiLCJwYXlwYWxCdXR0b25HYXRld2F5SWRzIiwiaGlkZU9yZGVyQnV0dG9uSWZQcGNwR2F0ZXdheSIsImlzUGF5cGFsQnV0dG9uIiwiaXNDYXJkcyIsImJvb3RzdHJhcHBlZCIsInVybCIsInNjcmlwdF9hdHRyaWJ1dGVzIiwia2V5VmFsdWUiLCJzZXRfYXR0cmlidXRlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///536\n")},996:module=>{eval("\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction getEnumerableOwnPropertySymbols(target) {\n\treturn Object.getOwnPropertySymbols\n\t\t? Object.getOwnPropertySymbols(target).filter(function(symbol) {\n\t\t\treturn target.propertyIsEnumerable(symbol)\n\t\t})\n\t\t: []\n}\n\nfunction getKeys(target) {\n\treturn Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))\n}\n\nfunction propertyIsOnObject(object, property) {\n\ttry {\n\t\treturn property in object\n\t} catch(_) {\n\t\treturn false\n\t}\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nfunction propertyIsUnsafe(target, key) {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tgetKeys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tgetKeys(source).forEach(function(key) {\n\t\tif (propertyIsUnsafe(target, key)) {\n\t\t\treturn\n\t\t}\n\n\t\tif (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\t// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()\n\t// implementations can use it. The caller may not replace it.\n\toptions.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTk2LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUUsSUFBSTtBQUNOOztBQUVBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL25vZGVfbW9kdWxlcy9kZWVwbWVyZ2UvZGlzdC9janMuanM/M2M0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBpc01lcmdlYWJsZU9iamVjdCA9IGZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlKSB7XG5cdHJldHVybiBpc05vbk51bGxPYmplY3QodmFsdWUpXG5cdFx0JiYgIWlzU3BlY2lhbCh2YWx1ZSlcbn07XG5cbmZ1bmN0aW9uIGlzTm9uTnVsbE9iamVjdCh2YWx1ZSkge1xuXHRyZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG59XG5cbmZ1bmN0aW9uIGlzU3BlY2lhbCh2YWx1ZSkge1xuXHR2YXIgc3RyaW5nVmFsdWUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuXG5cdHJldHVybiBzdHJpbmdWYWx1ZSA9PT0gJ1tvYmplY3QgUmVnRXhwXSdcblx0XHR8fCBzdHJpbmdWYWx1ZSA9PT0gJ1tvYmplY3QgRGF0ZV0nXG5cdFx0fHwgaXNSZWFjdEVsZW1lbnQodmFsdWUpXG59XG5cbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9iNWFjOTYzZmI3OTFkMTI5OGU3ZjM5NjIzNjM4M2JjOTU1ZjkxNmMxL3NyYy9pc29tb3JwaGljL2NsYXNzaWMvZWxlbWVudC9SZWFjdEVsZW1lbnQuanMjTDIxLUwyNVxudmFyIGNhblVzZVN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcjtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBjYW5Vc2VTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgOiAweGVhYzc7XG5cbmZ1bmN0aW9uIGlzUmVhY3RFbGVtZW50KHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFXG59XG5cbmZ1bmN0aW9uIGVtcHR5VGFyZ2V0KHZhbCkge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gW10gOiB7fVxufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZSwgb3B0aW9ucykge1xuXHRyZXR1cm4gKG9wdGlvbnMuY2xvbmUgIT09IGZhbHNlICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodmFsdWUpKVxuXHRcdD8gZGVlcG1lcmdlKGVtcHR5VGFyZ2V0KHZhbHVlKSwgdmFsdWUsIG9wdGlvbnMpXG5cdFx0OiB2YWx1ZVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuXHRyZXR1cm4gdGFyZ2V0LmNvbmNhdChzb3VyY2UpLm1hcChmdW5jdGlvbihlbGVtZW50KSB7XG5cdFx0cmV0dXJuIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGVsZW1lbnQsIG9wdGlvbnMpXG5cdH0pXG59XG5cbmZ1bmN0aW9uIGdldE1lcmdlRnVuY3Rpb24oa2V5LCBvcHRpb25zKSB7XG5cdGlmICghb3B0aW9ucy5jdXN0b21NZXJnZSkge1xuXHRcdHJldHVybiBkZWVwbWVyZ2Vcblx0fVxuXHR2YXIgY3VzdG9tTWVyZ2UgPSBvcHRpb25zLmN1c3RvbU1lcmdlKGtleSk7XG5cdHJldHVybiB0eXBlb2YgY3VzdG9tTWVyZ2UgPT09ICdmdW5jdGlvbicgPyBjdXN0b21NZXJnZSA6IGRlZXBtZXJnZVxufVxuXG5mdW5jdGlvbiBnZXRFbnVtZXJhYmxlT3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkge1xuXHRyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc1xuXHRcdD8gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpLmZpbHRlcihmdW5jdGlvbihzeW1ib2wpIHtcblx0XHRcdHJldHVybiB0YXJnZXQucHJvcGVydHlJc0VudW1lcmFibGUoc3ltYm9sKVxuXHRcdH0pXG5cdFx0OiBbXVxufVxuXG5mdW5jdGlvbiBnZXRLZXlzKHRhcmdldCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXModGFyZ2V0KS5jb25jYXQoZ2V0RW51bWVyYWJsZU93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKVxufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUlzT25PYmplY3Qob2JqZWN0LCBwcm9wZXJ0eSkge1xuXHR0cnkge1xuXHRcdHJldHVybiBwcm9wZXJ0eSBpbiBvYmplY3Rcblx0fSBjYXRjaChfKSB7XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH1cbn1cblxuLy8gUHJvdGVjdHMgZnJvbSBwcm90b3R5cGUgcG9pc29uaW5nIGFuZCB1bmV4cGVjdGVkIG1lcmdpbmcgdXAgdGhlIHByb3RvdHlwZSBjaGFpbi5cbmZ1bmN0aW9uIHByb3BlcnR5SXNVbnNhZmUodGFyZ2V0LCBrZXkpIHtcblx0cmV0dXJuIHByb3BlcnR5SXNPbk9iamVjdCh0YXJnZXQsIGtleSkgLy8gUHJvcGVydGllcyBhcmUgc2FmZSB0byBtZXJnZSBpZiB0aGV5IGRvbid0IGV4aXN0IGluIHRoZSB0YXJnZXQgeWV0LFxuXHRcdCYmICEoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpIC8vIHVuc2FmZSBpZiB0aGV5IGV4aXN0IHVwIHRoZSBwcm90b3R5cGUgY2hhaW4sXG5cdFx0XHQmJiBPYmplY3QucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0YXJnZXQsIGtleSkpIC8vIGFuZCBhbHNvIHVuc2FmZSBpZiB0aGV5J3JlIG5vbmVudW1lcmFibGUuXG59XG5cbmZ1bmN0aW9uIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG5cdHZhciBkZXN0aW5hdGlvbiA9IHt9O1xuXHRpZiAob3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh0YXJnZXQpKSB7XG5cdFx0Z2V0S2V5cyh0YXJnZXQpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG5cdFx0XHRkZXN0aW5hdGlvbltrZXldID0gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodGFyZ2V0W2tleV0sIG9wdGlvbnMpO1xuXHRcdH0pO1xuXHR9XG5cdGdldEtleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuXHRcdGlmIChwcm9wZXJ0eUlzVW5zYWZlKHRhcmdldCwga2V5KSkge1xuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXG5cdFx0aWYgKHByb3BlcnR5SXNPbk9iamVjdCh0YXJnZXQsIGtleSkgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdChzb3VyY2Vba2V5XSkpIHtcblx0XHRcdGRlc3RpbmF0aW9uW2tleV0gPSBnZXRNZXJnZUZ1bmN0aW9uKGtleSwgb3B0aW9ucykodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldLCBvcHRpb25zKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVzdGluYXRpb25ba2V5XSA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHNvdXJjZVtrZXldLCBvcHRpb25zKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gZGVzdGluYXRpb25cbn1cblxuZnVuY3Rpb24gZGVlcG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHRvcHRpb25zLmFycmF5TWVyZ2UgPSBvcHRpb25zLmFycmF5TWVyZ2UgfHwgZGVmYXVsdEFycmF5TWVyZ2U7XG5cdG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QgPSBvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0IHx8IGlzTWVyZ2VhYmxlT2JqZWN0O1xuXHQvLyBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCBpcyBhZGRlZCB0byBgb3B0aW9uc2Agc28gdGhhdCBjdXN0b20gYXJyYXlNZXJnZSgpXG5cdC8vIGltcGxlbWVudGF0aW9ucyBjYW4gdXNlIGl0LiBUaGUgY2FsbGVyIG1heSBub3QgcmVwbGFjZSBpdC5cblx0b3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkO1xuXG5cdHZhciBzb3VyY2VJc0FycmF5ID0gQXJyYXkuaXNBcnJheShzb3VyY2UpO1xuXHR2YXIgdGFyZ2V0SXNBcnJheSA9IEFycmF5LmlzQXJyYXkodGFyZ2V0KTtcblx0dmFyIHNvdXJjZUFuZFRhcmdldFR5cGVzTWF0Y2ggPSBzb3VyY2VJc0FycmF5ID09PSB0YXJnZXRJc0FycmF5O1xuXG5cdGlmICghc291cmNlQW5kVGFyZ2V0VHlwZXNNYXRjaCkge1xuXHRcdHJldHVybiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChzb3VyY2UsIG9wdGlvbnMpXG5cdH0gZWxzZSBpZiAoc291cmNlSXNBcnJheSkge1xuXHRcdHJldHVybiBvcHRpb25zLmFycmF5TWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpXG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zKVxuXHR9XG59XG5cbmRlZXBtZXJnZS5hbGwgPSBmdW5jdGlvbiBkZWVwbWVyZ2VBbGwoYXJyYXksIG9wdGlvbnMpIHtcblx0aWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIGFuIGFycmF5Jylcblx0fVxuXG5cdHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgbmV4dCkge1xuXHRcdHJldHVybiBkZWVwbWVyZ2UocHJldiwgbmV4dCwgb3B0aW9ucylcblx0fSwge30pXG59O1xuXG52YXIgZGVlcG1lcmdlXzEgPSBkZWVwbWVyZ2U7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVlcG1lcmdlXzE7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///996\n")}},__webpack_module_cache__={};function __webpack_require__(Q){var F=__webpack_module_cache__[Q];if(void 0!==F)return F.exports;var B=__webpack_module_cache__[Q]={exports:{}};return __webpack_modules__[Q](B,B.exports,__webpack_require__),B.exports}__webpack_require__.n=Q=>{var F=Q&&Q.__esModule?()=>Q.default:()=>Q;return __webpack_require__.d(F,{a:F}),F},__webpack_require__.d=(Q,F)=>{for(var B in F)__webpack_require__.o(F,B)&&!__webpack_require__.o(Q,B)&&Object.defineProperty(Q,B,{enumerable:!0,get:F[B]})},__webpack_require__.o=(Q,F)=>Object.prototype.hasOwnProperty.call(Q,F);var __webpack_exports__=__webpack_require__(536)})();
1
+ (()=>{"use strict";var __webpack_modules__={536:(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{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 * @param {String} text\n * @param {Boolean} persist\n */\n\n\n message(text, persist = false) {\n this._addMessage(text, persist);\n\n this._scrollToMessages();\n }\n /**\n * @param {Array} texts\n * @param {Boolean} persist\n */\n\n\n messages(texts, persist = false) {\n texts.forEach(t => this._addMessage(t, persist));\n\n this._scrollToMessages();\n }\n /**\n * @private\n * @param {String} text\n * @param {Boolean} persist\n */\n\n\n _addMessage(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\n this.messagesList.appendChild(messageNode);\n }\n /**\n * @private\n */\n\n\n _scrollToMessages() {\n jQuery.scroll_to_notices(jQuery('.woocommerce-notices-wrapper'));\n }\n /**\n * @private\n */\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 * @private\n */\n\n\n _prepareMessagesListItem(message) {\n const li = document.createElement('li');\n li.innerHTML = message;\n return li;\n }\n\n clear() {\n if (this.messagesList === null) {\n return;\n }\n\n this.messagesList.innerHTML = '';\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 funding_source: window.ppcpFundingSource\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 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/Helper/CheckoutMethodState.js\nconst PaymentMethods = {\n PAYPAL: 'ppcp-gateway',\n CARDS: 'ppcp-credit-card-gateway',\n OXXO: 'ppcp-oxxo-gateway',\n CARD_BUTTON: 'ppcp-card-button-gateway'\n};\nconst ORDER_BUTTON_SELECTOR = '#place_order';\nconst getCurrentPaymentMethod = () => {\n const el = document.querySelector('input[name=\"payment_method\"]:checked');\n\n if (!el) {\n return null;\n }\n\n return el.value;\n};\nconst isSavedCardSelected = () => {\n const savedCardList = document.querySelector('#saved-credit-card');\n return savedCardList && savedCardList.value !== '';\n};\n;// CONCATENATED MODULE: ./resources/js/modules/ActionHandler/CartActionHandler.js\n\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 payment_method: PaymentMethods.PAYPAL,\n funding_source: window.ppcpFundingSource,\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.actionHandler.configuration(), {\n button: {\n wrapper: this.gateway.button.mini_cart_wrapper,\n style: this.gateway.button.mini_cart_style\n }\n });\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\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 payment_method: PaymentMethods.PAYPAL,\n funding_source: window.ppcpFundingSource,\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 handleChange() {\n if (!this.shouldRender()) {\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n this.renderer.hideButtons(this.gateway.button.wrapper);\n this.messages.hideMessages();\n return;\n }\n\n this.render();\n }\n\n init() {\n document.querySelector('form.cart').addEventListener('change', this.handleChange.bind(this));\n\n if (!this.shouldRender()) {\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n this.messages.hideMessages();\n return;\n }\n\n this.render();\n }\n\n shouldRender() {\n return document.querySelector('form.cart') !== null && !this.priceAmountIsZero();\n }\n\n priceAmount() {\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 } else if (document.querySelector('.product .woocommerce-Price-amount')) {\n priceText = document.querySelector('.product .woocommerce-Price-amount').innerText;\n }\n\n priceText = priceText.replace(/,/g, '.');\n return parseFloat(priceText.replace(/([^\\d,\\.\\s]*)/g, ''));\n }\n\n priceAmountIsZero() {\n return this.priceAmount() === 0;\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 this.messages.renderWithAmount(this.priceAmount());\n }, () => {\n this.renderer.hideButtons(this.gateway.button.wrapper);\n this.renderer.hideButtons(this.gateway.hosted_fields.wrapper);\n this.messages.hideMessages();\n }, document.querySelector('form.cart'), new modules_ErrorHandler(this.gateway.labels.error.generic));\n this.renderer.render(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(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 errorHandler.clear();\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 funding_source: window.ppcpFundingSource\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\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 formData = new FormData(document.querySelector(formSelector)); // will not handle fields with multiple values (checkboxes, <select multiple>), but we do not care about this here\n\n const formJsonObj = Object.fromEntries(formData);\n const createaccount = jQuery('#createaccount').is(\":checked\") ? true : false;\n const paymentMethod = getCurrentPaymentMethod();\n const fundingSource = window.ppcpFundingSource;\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 payment_method: paymentMethod,\n funding_source: fundingSource,\n form: formJsonObj,\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.clear();\n\n if (data.data.details.length > 0) {\n errorHandler.message(data.data.details.map(d => `${d.issue} ${d.description}`).join('<br/>'), true);\n } else {\n errorHandler.message(data.data.message, true);\n }\n }\n\n throw new Error(data.data.message);\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/Helper/Hiding.js\nconst getElement = selectorOrElement => {\n if (typeof selectorOrElement === 'string') {\n return document.querySelector(selectorOrElement);\n }\n\n return selectorOrElement;\n};\n\nconst isVisible = element => {\n return !!(element.offsetWidth || element.offsetHeight || element.getClientRects().length);\n};\nconst setVisible = (selectorOrElement, show, important = false) => {\n const element = getElement(selectorOrElement);\n\n if (!element) {\n return;\n }\n\n const currentValue = element.style.getPropertyValue('display');\n\n if (!show) {\n if (currentValue === 'none') {\n return;\n }\n\n element.style.setProperty('display', 'none', important ? 'important' : '');\n } else {\n if (currentValue === 'none') {\n element.style.removeProperty('display');\n } // still not visible (if something else added display: none in CSS)\n\n\n if (!isVisible(element)) {\n element.style.setProperty('display', 'block');\n }\n }\n};\nconst hide = (selectorOrElement, important = false) => {\n setVisible(selectorOrElement, false, important);\n};\nconst show = selectorOrElement => {\n setVisible(selectorOrElement, true);\n};\n;// CONCATENATED MODULE: ./resources/js/modules/ContextBootstrap/CheckoutBootstap.js\n\n\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 this.standardOrderButtonSelector = ORDER_BUTTON_SELECTOR;\n this.buttonChangeObserver = new MutationObserver(el => {\n this.updateUi();\n });\n }\n\n init() {\n this.render(); // Unselect saved card.\n // WC saves form values, so with our current UI it would be a bit weird\n // if the user paid with saved, then after some time tries to pay again,\n // but wants to enter a new card, and to do that they have to choose “Select payment” in the list.\n\n jQuery('#saved-credit-card').val(jQuery('#saved-credit-card option:first').val());\n jQuery(document.body).on('updated_checkout', () => {\n this.render();\n });\n jQuery(document.body).on('updated_checkout payment_method_selected', () => {\n this.updateUi();\n });\n jQuery(document).on('hosted_fields_loaded', () => {\n jQuery('#saved-credit-card').on('change', () => {\n this.updateUi();\n });\n });\n this.updateUi();\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(actionHandler.configuration());\n this.buttonChangeObserver.observe(document.querySelector(this.standardOrderButtonSelector), {\n attributes: true\n });\n }\n\n updateUi() {\n const currentPaymentMethod = getCurrentPaymentMethod();\n const isPaypal = currentPaymentMethod === PaymentMethods.PAYPAL;\n const isCard = currentPaymentMethod === PaymentMethods.CARDS;\n const isSeparateButtonGateway = [PaymentMethods.CARD_BUTTON].includes(currentPaymentMethod);\n const isSavedCard = isCard && isSavedCardSelected();\n const isNotOurGateway = !isPaypal && !isCard && !isSeparateButtonGateway;\n const isFreeTrial = PayPalCommerceGateway.is_free_trial_cart;\n const hasVaultedPaypal = PayPalCommerceGateway.vaulted_paypal_email !== '';\n const paypalButtonWrappers = { ...Object.entries(PayPalCommerceGateway.separate_buttons).reduce((result, [k, data]) => {\n return { ...result,\n [data.id]: data.wrapper\n };\n }, {})\n };\n setVisible(this.standardOrderButtonSelector, isPaypal && isFreeTrial && hasVaultedPaypal || isNotOurGateway || isSavedCard, true);\n setVisible('.ppcp-vaulted-paypal-details', isPaypal);\n setVisible(this.gateway.button.wrapper, isPaypal && !(isFreeTrial && hasVaultedPaypal));\n setVisible(this.gateway.messages.wrapper, isPaypal && !isFreeTrial);\n setVisible(this.gateway.hosted_fields.wrapper, isCard && !isSavedCard);\n\n for (const [gatewayId, wrapper] of Object.entries(paypalButtonWrappers)) {\n setVisible(wrapper, gatewayId === currentPaymentMethod);\n }\n\n if (isPaypal && !isFreeTrial) {\n this.messages.render();\n }\n\n if (isCard) {\n if (isSavedCard) {\n this.disableCreditCardFields();\n } else {\n this.enableCreditCardFields();\n }\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/Helper/Subscriptions.js\nconst isChangePaymentPage = () => {\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.has('change_payment_method');\n};\n;// CONCATENATED MODULE: ./resources/js/modules/ContextBootstrap/PayNowBootstrap.js\n\n\n\nclass PayNowBootstrap extends ContextBootstrap_CheckoutBootstap {\n constructor(gateway, renderer, messages, spinner) {\n super(gateway, renderer, messages, spinner);\n }\n\n updateUi() {\n if (isChangePaymentPage()) {\n return;\n }\n\n super.updateUi();\n }\n\n}\n\n/* harmony default export */ const ContextBootstrap_PayNowBootstrap = (PayNowBootstrap);\n// EXTERNAL MODULE: ./node_modules/deepmerge/dist/cjs.js\nvar cjs = __webpack_require__(996);\nvar cjs_default = /*#__PURE__*/__webpack_require__.n(cjs);\n;// CONCATENATED MODULE: ./resources/js/modules/Renderer/Renderer.js\n\n\nclass Renderer {\n constructor(creditCardRenderer, defaultSettings, onSmartButtonClick, onSmartButtonsInit) {\n this.defaultSettings = defaultSettings;\n this.creditCardRenderer = creditCardRenderer;\n this.onSmartButtonClick = onSmartButtonClick;\n this.onSmartButtonsInit = onSmartButtonsInit;\n this.renderedSources = new Set();\n }\n\n render(contextConfig, settingsOverride = {}) {\n const settings = cjs_default()(this.defaultSettings, settingsOverride);\n const enabledSeparateGateways = Object.fromEntries(Object.entries(settings.separate_buttons).filter(([s, data]) => document.querySelector(data.wrapper)));\n const hasEnabledSeparateGateways = Object.keys(enabledSeparateGateways).length !== 0;\n\n if (!hasEnabledSeparateGateways) {\n this.renderButtons(settings.button.wrapper, settings.button.style, contextConfig, hasEnabledSeparateGateways);\n } else {\n // render each button separately\n for (const fundingSource of paypal.getFundingSources().filter(s => !(s in enabledSeparateGateways))) {\n let style = settings.button.style;\n\n if (fundingSource !== 'paypal') {\n style = {\n shape: style.shape\n };\n }\n\n this.renderButtons(settings.button.wrapper, style, contextConfig, hasEnabledSeparateGateways, fundingSource);\n }\n }\n\n this.creditCardRenderer.render(settings.hosted_fields.wrapper, contextConfig);\n\n for (const [fundingSource, data] of Object.entries(enabledSeparateGateways)) {\n this.renderButtons(data.wrapper, data.style, contextConfig, hasEnabledSeparateGateways, fundingSource);\n }\n }\n\n renderButtons(wrapper, style, contextConfig, hasEnabledSeparateGateways, fundingSource = null) {\n if (!document.querySelector(wrapper) || this.isAlreadyRendered(wrapper, fundingSource, hasEnabledSeparateGateways) || 'undefined' === typeof paypal.Buttons) {\n return;\n }\n\n if (fundingSource) {\n contextConfig.fundingSource = fundingSource;\n }\n\n const btn = paypal.Buttons({\n style,\n ...contextConfig,\n onClick: this.onSmartButtonClick,\n onInit: this.onSmartButtonsInit\n });\n\n if (!btn.isEligible()) {\n return;\n }\n\n btn.render(wrapper);\n this.renderedSources.add(wrapper + fundingSource ?? '');\n }\n\n isAlreadyRendered(wrapper, fundingSource, hasEnabledSeparateGateways) {\n // Simply check that has child nodes when we do not need to render buttons separately,\n // this will reduce the risk of breaking with different themes/plugins\n // and on the cart page (where we also do not need to render separately), which may fully reload this part of the page.\n // Ideally we should also find a way to detect such full reloads and remove the corresponding keys from the set.\n if (!hasEnabledSeparateGateways) {\n return document.querySelector(wrapper).hasChildNodes();\n }\n\n return this.renderedSources.has(wrapper + fundingSource ?? '');\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 newElement.setAttribute('class', original.className);\n Object.values(styles).forEach(prop => {\n if (!styles[prop] || !isNaN(prop) || prop === 'background-image') {\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\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 }\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 const buttonSelector = wrapper + ' button';\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\n if (!gateWayBox) {\n return;\n }\n\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 const className = this._cardNumberFiledCLassNameByCardType(event.cards[0].type);\n\n this._recreateElementClassAttribute(cardNumber, cardNumberField.className);\n\n if (event.fields.number.isValid) {\n cardNumber.classList.add(className);\n }\n });\n hostedFields.on('validityChange', event => {\n const formValid = Object.keys(event.fields).every(function (key) {\n return event.fields[key].isValid;\n });\n\n const className = this._cardNumberFiledCLassNameByCardType(event.cards[0].type);\n\n event.fields.number.isValid ? cardNumber.classList.add(className) : this._recreateElementClassAttribute(cardNumber, cardNumberField.className);\n this.formValid = formValid;\n });\n show(buttonSelector);\n\n if (document.querySelector(wrapper).getAttribute('data-ppcp-subscribed') !== true) {\n document.querySelector(buttonSelector).addEventListener('click', event => {\n event.preventDefault();\n\n this._submit(contextConfig);\n });\n document.querySelector(wrapper).setAttribute('data-ppcp-subscribed', 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.can_save_vault_token ? true : false;\n let vault = document.getElementById('ppcp-credit-card-vault') ? document.getElementById('ppcp-credit-card-vault').checked : save_card;\n\n if (this.defaultConfig.enforce_vault) {\n vault = true;\n }\n\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 if (this.defaultConfig.payer) {\n hostedFieldsData.cardholderName = this.defaultConfig.payer.name.given_name + ' ' + this.defaultConfig.payer.name.surname;\n }\n\n if (!hostedFieldsData.cardholderName) {\n const firstName = document.getElementById('billing_first_name') ? document.getElementById('billing_first_name').value : '';\n const lastName = document.getElementById('billing_last_name') ? document.getElementById('billing_last_name').value : '';\n hostedFieldsData.cardholderName = firstName + ' ' + lastName;\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 this.spinner.unblock();\n this.errorHandler.clear();\n\n if (err.details) {\n this.errorHandler.message(err.details.map(d => `${d.issue} ${d.description}`).join('<br/>'), true);\n }\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 _cardNumberFiledCLassNameByCardType(cardType) {\n return cardType === 'american-express' ? 'amex' : cardType.replace('-', '');\n }\n\n _recreateElementClassAttribute(element, newClassName) {\n element.removeAttribute('class');\n element.setAttribute('class', newClassName);\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 jQuery(document.body).on('updated_cart_totals', () => {\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\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 hideMessages() {\n const domElement = document.querySelector(this.config.wrapper);\n\n if (!domElement) {\n return false;\n }\n\n domElement.style.display = 'none';\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(target = 'form.woocommerce-checkout') {\n this.target = target;\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/modules/ActionHandler/FreeTrialHandler.js\n\n\n\nclass FreeTrialHandler {\n constructor(config, spinner, errorHandler) {\n this.config = config;\n this.spinner = spinner;\n this.errorHandler = errorHandler;\n }\n\n handle() {\n this.spinner.block();\n fetch(this.config.ajax.vault_paypal.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.vault_paypal.nonce,\n return_url: location.href\n })\n }).then(res => {\n return res.json();\n }).then(data => {\n if (!data.success) {\n this.spinner.unblock();\n console.error(data);\n this.errorHandler.message(data.data.message);\n throw Error(data.data.message);\n }\n\n location.href = data.data.approve_link;\n }).catch(error => {\n this.spinner.unblock();\n console.error(error);\n this.errorHandler.genericError();\n });\n }\n\n}\n\n/* harmony default export */ const ActionHandler_FreeTrialHandler = (FreeTrialHandler);\n;// CONCATENATED MODULE: ./resources/js/button.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // TODO: could be a good idea to have a separate spinner for each gateway,\n// but I think we care mainly about the script loading, so one spinner should be enough.\n\nconst buttonsSpinner = new Helper_Spinner(document.querySelector('.ppc-button-wrapper'));\nconst cardsSpinner = new Helper_Spinner('#ppcp-hosted-fields');\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 freeTrialHandler = new ActionHandler_FreeTrialHandler(PayPalCommerceGateway, spinner, errorHandler);\n\n const onSmartButtonClick = (data, actions) => {\n window.ppcpFundingSource = data.fundingSource;\n\n if (PayPalCommerceGateway.basic_checkout_validation_enabled) {\n // TODO: quick fix to get the error about empty form before attempting PayPal order\n // it should solve #513 for most of the users, but proper solution should be implemented later.\n const requiredFields = jQuery('form.woocommerce-checkout .validate-required:visible :input');\n requiredFields.each((i, input) => {\n jQuery(input).trigger('validate');\n });\n const invalidFields = Array.from(jQuery('form.woocommerce-checkout .validate-required.woocommerce-invalid:visible'));\n\n if (invalidFields.length) {\n const billingFieldsContainer = document.querySelector('.woocommerce-billing-fields');\n const shippingFieldsContainer = document.querySelector('.woocommerce-shipping-fields');\n const nameMessageMap = PayPalCommerceGateway.labels.error.required.elements;\n const messages = invalidFields.map(el => {\n const name = el.querySelector('[name]')?.getAttribute('name');\n\n if (name && name in nameMessageMap) {\n return nameMessageMap[name];\n }\n\n let label = el.querySelector('label').textContent.replaceAll('*', '').trim();\n\n if (billingFieldsContainer?.contains(el)) {\n label = PayPalCommerceGateway.labels.billing_field.replace('%s', label);\n }\n\n if (shippingFieldsContainer?.contains(el)) {\n label = PayPalCommerceGateway.labels.shipping_field.replace('%s', label);\n }\n\n return PayPalCommerceGateway.labels.error.required.field.replace('%s', `<strong>${label}</strong>`);\n }).filter(s => s.length > 2);\n errorHandler.clear();\n\n if (messages.length) {\n errorHandler.messages(messages);\n } else {\n errorHandler.message(PayPalCommerceGateway.labels.error.required.generic);\n }\n\n return actions.reject();\n }\n }\n\n const form = document.querySelector('form.woocommerce-checkout');\n\n if (form) {\n jQuery('#ppcp-funding-source-form-input').remove();\n form.insertAdjacentHTML('beforeend', `<input type=\"hidden\" name=\"ppcp-funding-source\" value=\"${data.fundingSource}\" id=\"ppcp-funding-source-form-input\">`);\n }\n\n const isFreeTrial = PayPalCommerceGateway.is_free_trial_cart;\n\n if (isFreeTrial && data.fundingSource !== 'card') {\n freeTrialHandler.handle();\n return actions.reject();\n }\n };\n\n const onSmartButtonsInit = () => {\n buttonsSpinner.unblock();\n };\n\n const renderer = new Renderer_Renderer(creditCardRenderer, PayPalCommerceGateway, onSmartButtonClick, onSmartButtonsInit);\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 if (PayPalCommerceGateway.context !== 'checkout' && PayPalCommerceGateway.data_client_id.user === 0 && PayPalCommerceGateway.data_client_id.has_subscriptions) {\n return;\n }\n\n const paypalButtonGatewayIds = [PaymentMethods.PAYPAL, ...Object.entries(PayPalCommerceGateway.separate_buttons).map(([k, data]) => data.id)]; // Sometimes PayPal script takes long time to load,\n // so we additionally hide the standard order button here to avoid failed orders.\n // Normally it is hidden later after the script load.\n\n const hideOrderButtonIfPpcpGateway = () => {\n // only in checkout and pay now page, otherwise it may break things (e.g. payment via product page),\n // and also the loading spinner may look weird on other pages\n if (!['checkout', 'pay-now'].includes(PayPalCommerceGateway.context) || isChangePaymentPage() || PayPalCommerceGateway.is_free_trial_cart && PayPalCommerceGateway.vaulted_paypal_email !== '') {\n return;\n }\n\n const currentPaymentMethod = getCurrentPaymentMethod();\n const isPaypalButton = paypalButtonGatewayIds.includes(currentPaymentMethod);\n const isCards = currentPaymentMethod === PaymentMethods.CARDS;\n setVisible(ORDER_BUTTON_SELECTOR, !isPaypalButton && !isCards, true);\n\n if (isPaypalButton) {\n // stopped after the first rendering of the buttons, in onInit\n buttonsSpinner.block();\n } else {\n buttonsSpinner.unblock();\n }\n\n if (isCards) {\n cardsSpinner.block();\n } else {\n cardsSpinner.unblock();\n }\n };\n\n jQuery(document).on('hosted_fields_loaded', () => {\n cardsSpinner.unblock();\n });\n let bootstrapped = false;\n hideOrderButtonIfPpcpGateway();\n jQuery(document.body).on('updated_checkout payment_method_selected', () => {\n if (bootstrapped) {\n return;\n }\n\n hideOrderButtonIfPpcpGateway();\n });\n const script = document.createElement('script');\n script.addEventListener('load', event => {\n bootstrapped = true;\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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QUFBQSxRQUFRLENBQUM2QyxJQUFULENBQWM4SixNQUFkLENBQXFCK0ssTUFBckI7QUFDSCxDQTFGTCIsInNvdXJjZXMiOlsid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9FcnJvckhhbmRsZXIuanM/ZTY1YSIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvT25BcHByb3ZlSGFuZGxlci9vbkFwcHJvdmVGb3JDb250aW51ZS5qcz9jNDU0Iiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9IZWxwZXIvUGF5ZXJEYXRhLmpzPzJhZjEiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0hlbHBlci9DaGVja291dE1ldGhvZFN0YXRlLmpzPzgwYTMiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0FjdGlvbkhhbmRsZXIvQ2FydEFjdGlvbkhhbmRsZXIuanM/ODJjZiIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvQ29udGV4dEJvb3RzdHJhcC9NaW5pQ2FydEJvb3RzdGFwLmpzP2Q1NTIiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0hlbHBlci9VcGRhdGVDYXJ0LmpzP2U0MjIiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0hlbHBlci9CdXR0b25zVG9nZ2xlTGlzdGVuZXIuanM/ZTE5MyIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvRW50aXR5L1Byb2R1Y3QuanM/OWZmZiIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL21vZHVsZXMvQWN0aW9uSGFuZGxlci9TaW5nbGVQcm9kdWN0QWN0aW9uSGFuZGxlci5qcz9kOWI3Iiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9Db250ZXh0Qm9vdHN0cmFwL1NpbmdsZVByb2R1Y3RCb290c3RhcC5qcz83YzE5Iiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9Db250ZXh0Qm9vdHN0cmFwL0NhcnRCb290c3RhcC5qcz81ZTk0Iiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9PbkFwcHJvdmVIYW5kbGVyL29uQXBwcm92ZUZvclBheU5vdy5qcz85MzA1Iiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9BY3Rpb25IYW5kbGVyL0NoZWNrb3V0QWN0aW9uSGFuZGxlci5qcz84NTE1Iiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9IZWxwZXIvSGlkaW5nLmpzPzFkMzYiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL0NvbnRleHRCb290c3RyYXAvQ2hlY2tvdXRCb290c3RhcC5qcz9jODU1Iiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9IZWxwZXIvU3Vic2NyaXB0aW9ucy5qcz9iODcwIiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9Db250ZXh0Qm9vdHN0cmFwL1BheU5vd0Jvb3RzdHJhcC5qcz9kOWY1Iiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9SZW5kZXJlci9SZW5kZXJlci5qcz9mYTkzIiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9IZWxwZXIvRGNjSW5wdXRGYWN0b3J5LmpzPzJhMmYiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL1JlbmRlcmVyL0NyZWRpdENhcmRSZW5kZXJlci5qcz8zODdhIiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9EYXRhQ2xpZW50SWRBdHRyaWJ1dGVIYW5kbGVyLmpzP2VlMGIiLCJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL3Jlc291cmNlcy9qcy9tb2R1bGVzL1JlbmRlcmVyL01lc3NhZ2VSZW5kZXJlci5qcz9jZDAyIiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9IZWxwZXIvU3Bpbm5lci5qcz8xNzA4Iiwid2VicGFjazovL3BwYy1idXR0b24vLi9yZXNvdXJjZXMvanMvbW9kdWxlcy9BY3Rpb25IYW5kbGVyL0ZyZWVUcmlhbEhhbmRsZXIuanM/YWI3NyIsIndlYnBhY2s6Ly9wcGMtYnV0dG9uLy4vcmVzb3VyY2VzL2pzL2J1dHRvbi5qcz8wNjBmIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIEVycm9ySGFuZGxlciB7XG5cbiAgICBjb25zdHJ1Y3RvcihnZW5lcmljRXJyb3JUZXh0KVxuICAgIHtcbiAgICAgICAgdGhpcy5nZW5lcmljRXJyb3JUZXh0ID0gZ2VuZXJpY0Vycm9yVGV4dDtcbiAgICAgICAgdGhpcy53cmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndvb2NvbW1lcmNlLW5vdGljZXMtd3JhcHBlcicpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VzTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3VsLndvb2NvbW1lcmNlLWVycm9yJyk7XG4gICAgfVxuXG4gICAgZ2VuZXJpY0Vycm9yKCkge1xuICAgICAgICBpZiAodGhpcy53cmFwcGVyLmNsYXNzTGlzdC5jb250YWlucygncHBjcC1wZXJzaXN0JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMubWVzc2FnZSh0aGlzLmdlbmVyaWNFcnJvclRleHQpXG4gICAgfVxuXG4gICAgYXBwZW5kUHJlcGFyZWRFcnJvck1lc3NhZ2VFbGVtZW50KGVycm9yTWVzc2FnZUVsZW1lbnQpXG4gICAge1xuICAgICAgICBpZiAodGhpcy5tZXNzYWdlc0xpc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVNZXNzYWdlc0xpc3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWVzc2FnZXNMaXN0LnJlcGxhY2VXaXRoKGVycm9yTWVzc2FnZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0XG4gICAgICogQHBhcmFtIHtCb29sZWFufSBwZXJzaXN0XG4gICAgICovXG4gICAgbWVzc2FnZSh0ZXh0LCBwZXJzaXN0ID0gZmFsc2UpXG4gICAge1xuICAgICAgICB0aGlzLl9hZGRNZXNzYWdlKHRleHQsIHBlcnNpc3QpO1xuXG4gICAgICAgIHRoaXMuX3Njcm9sbFRvTWVzc2FnZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge0FycmF5fSB0ZXh0c1xuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGVyc2lzdFxuICAgICAqL1xuICAgIG1lc3NhZ2VzKHRleHRzLCBwZXJzaXN0ID0gZmFsc2UpXG4gICAge1xuICAgICAgICB0ZXh0cy5mb3JFYWNoKHQgPT4gdGhpcy5fYWRkTWVzc2FnZSh0LCBwZXJzaXN0KSk7XG5cbiAgICAgICAgdGhpcy5fc2Nyb2xsVG9NZXNzYWdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHRcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBlcnNpc3RcbiAgICAgKi9cbiAgICBfYWRkTWVzc2FnZSh0ZXh0LCBwZXJzaXN0ID0gZmFsc2UpXG4gICAge1xuICAgICAgICBpZighIHR5cGVvZiBTdHJpbmcgfHwgdGV4dC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSBuZXcgbWVzc2FnZSB0ZXh0IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZXNMaXN0ID09PSBudWxsKXtcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVNZXNzYWdlc0xpc3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwZXJzaXN0KSB7XG4gICAgICAgICAgICB0aGlzLndyYXBwZXIuY2xhc3NMaXN0LmFkZCgncHBjcC1wZXJzaXN0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgncHBjcC1wZXJzaXN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWVzc2FnZU5vZGUgPSB0aGlzLl9wcmVwYXJlTWVzc2FnZXNMaXN0SXRlbSh0ZXh0KTtcbiAgICAgICAgdGhpcy5tZXNzYWdlc0xpc3QuYXBwZW5kQ2hpbGQobWVzc2FnZU5vZGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3Njcm9sbFRvTWVzc2FnZXMoKVxuICAgIHtcbiAgICAgICAgalF1ZXJ5LnNjcm9sbF90b19ub3RpY2VzKGpRdWVyeSgnLndvb2NvbW1lcmNlLW5vdGljZXMtd3JhcHBlcicpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9wcmVwYXJlTWVzc2FnZXNMaXN0KClcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLm1lc3NhZ2VzTGlzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlc0xpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlc0xpc3Quc2V0QXR0cmlidXRlKCdjbGFzcycsICd3b29jb21tZXJjZS1lcnJvcicpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlc0xpc3Quc2V0QXR0cmlidXRlKCdyb2xlJywgJ2FsZXJ0Jyk7XG4gICAgICAgICAgICB0aGlzLndyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5tZXNzYWdlc0xpc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfcHJlcGFyZU1lc3NhZ2VzTGlzdEl0ZW0obWVzc2FnZSlcbiAgICB7XG4gICAgICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcbiAgICAgICAgbGkuaW5uZXJIVE1MID0gbWVzc2FnZTtcblxuICAgICAgICByZXR1cm4gbGk7XG4gICAgfVxuXG4gICAgY2xlYXIoKVxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZXNMaXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1lc3NhZ2VzTGlzdC5pbm5lckhUTUwgPSAnJztcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVycm9ySGFuZGxlcjtcbiIsImNvbnN0IG9uQXBwcm92ZSA9IChjb250ZXh0LCBlcnJvckhhbmRsZXIpID0+IHtcbiAgICByZXR1cm4gKGRhdGEsIGFjdGlvbnMpID0+IHtcbiAgICAgICAgcmV0dXJuIGZldGNoKGNvbnRleHQuY29uZmlnLmFqYXguYXBwcm92ZV9vcmRlci5lbmRwb2ludCwge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgbm9uY2U6IGNvbnRleHQuY29uZmlnLmFqYXguYXBwcm92ZV9vcmRlci5ub25jZSxcbiAgICAgICAgICAgICAgICBvcmRlcl9pZDpkYXRhLm9yZGVySUQsXG4gICAgICAgICAgICAgICAgZnVuZGluZ19zb3VyY2U6IHdpbmRvdy5wcGNwRnVuZGluZ1NvdXJjZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pLnRoZW4oKHJlcyk9PntcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xuICAgICAgICB9KS50aGVuKChkYXRhKT0+e1xuICAgICAgICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIuZ2VuZXJpY0Vycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnMucmVzdGFydCgpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlci5nZW5lcmljRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBjb250ZXh0LmNvbmZpZy5yZWRpcmVjdDtcbiAgICAgICAgfSk7XG5cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG9uQXBwcm92ZTtcbiIsImV4cG9ydCBjb25zdCBwYXllckRhdGEgPSAoKSA9PiB7XG4gICAgY29uc3QgcGF5ZXIgPSBQYXlQYWxDb21tZXJjZUdhdGV3YXkucGF5ZXI7XG4gICAgaWYgKCEgcGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcGhvbmUgPSAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfcGhvbmUnKSB8fCB0eXBlb2YgcGF5ZXIucGhvbmUgIT09ICd1bmRlZmluZWQnKSA/XG4gICAge1xuICAgICAgICBwaG9uZV90eXBlOlwiSE9NRVwiLFxuICAgICAgICAgICAgcGhvbmVfbnVtYmVyOntcbiAgICAgICAgICAgIG5hdGlvbmFsX251bWJlciA6IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19waG9uZScpKSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX3Bob25lJykudmFsdWUgOiBwYXllci5waG9uZS5waG9uZV9udW1iZXIubmF0aW9uYWxfbnVtYmVyXG4gICAgICAgIH1cbiAgICB9IDogbnVsbDtcbiAgICBjb25zdCBwYXllckRhdGEgPSB7XG4gICAgICAgIGVtYWlsX2FkZHJlc3M6KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX2VtYWlsJykpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfZW1haWwnKS52YWx1ZSA6IHBheWVyLmVtYWlsX2FkZHJlc3MsXG4gICAgICAgIG5hbWUgOiB7XG4gICAgICAgICAgICBzdXJuYW1lOiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfbGFzdF9uYW1lJykpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfbGFzdF9uYW1lJykudmFsdWUgOiBwYXllci5uYW1lLnN1cm5hbWUsXG4gICAgICAgICAgICBnaXZlbl9uYW1lOiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfZmlyc3RfbmFtZScpKSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX2ZpcnN0X25hbWUnKS52YWx1ZSA6IHBheWVyLm5hbWUuZ2l2ZW5fbmFtZVxuICAgICAgICB9LFxuICAgICAgICBhZGRyZXNzIDoge1xuICAgICAgICAgICAgY291bnRyeV9jb2RlIDogKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX2NvdW50cnknKSkgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19jb3VudHJ5JykudmFsdWUgOiBwYXllci5hZGRyZXNzLmNvdW50cnlfY29kZSxcbiAgICAgICAgICAgIGFkZHJlc3NfbGluZV8xIDogKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX2FkZHJlc3NfMScpKSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX2FkZHJlc3NfMScpLnZhbHVlIDogcGF5ZXIuYWRkcmVzcy5hZGRyZXNzX2xpbmVfMSxcbiAgICAgICAgICAgIGFkZHJlc3NfbGluZV8yIDogKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX2FkZHJlc3NfMicpKSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX2FkZHJlc3NfMicpLnZhbHVlIDogcGF5ZXIuYWRkcmVzcy5hZGRyZXNzX2xpbmVfMixcbiAgICAgICAgICAgIGFkbWluX2FyZWFfMSA6IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19zdGF0ZScpKSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX3N0YXRlJykudmFsdWUgOiBwYXllci5hZGRyZXNzLmFkbWluX2FyZWFfMSxcbiAgICAgICAgICAgIGFkbWluX2FyZWFfMiA6IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19jaXR5JykpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JpbGxpbmdfY2l0eScpLnZhbHVlIDogcGF5ZXIuYWRkcmVzcy5hZG1pbl9hcmVhXzIsXG4gICAgICAgICAgICBwb3N0YWxfY29kZSA6IChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmlsbGluZ19wb3N0Y29kZScpKSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiaWxsaW5nX3Bvc3Rjb2RlJykudmFsdWUgOiBwYXllci5hZGRyZXNzLnBvc3RhbF9jb2RlXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHBob25lKSB7XG4gICAgICAgIHBheWVyRGF0YS5waG9uZSA9IHBob25lO1xuICAgIH1cbiAgICByZXR1cm4gcGF5ZXJEYXRhO1xufVxuIiwiZXhwb3J0IGNvbnN0IFBheW1lbnRNZXRob2RzID0ge1xuICAgIFBBWVBBTDogJ3BwY3AtZ2F0ZXdheScsXG4gICAgQ0FSRFM6ICdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXknLFxuICAgIE9YWE86ICdwcGNwLW94eG8tZ2F0ZXdheScsXG4gICAgQ0FSRF9CVVRUT046ICdwcGNwLWNhcmQtYnV0dG9uLWdhdGV3YXknLFxufTtcblxuZXhwb3J0IGNvbnN0IE9SREVSX0JVVFRPTl9TRUxFQ1RPUiA9ICcjcGxhY2Vfb3JkZXInO1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFBheW1lbnRNZXRob2QgPSAoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwicGF5bWVudF9tZXRob2RcIl06Y2hlY2tlZCcpO1xuICAgIGlmICghZWwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsLnZhbHVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzU2F2ZWRDYXJkU2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgY29uc3Qgc2F2ZWRDYXJkTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzYXZlZC1jcmVkaXQtY2FyZCcpO1xuICAgIHJldHVybiBzYXZlZENhcmRMaXN0ICYmIHNhdmVkQ2FyZExpc3QudmFsdWUgIT09ICcnO1xufTtcbiIsImltcG9ydCBvbkFwcHJvdmUgZnJvbSAnLi4vT25BcHByb3ZlSGFuZGxlci9vbkFwcHJvdmVGb3JDb250aW51ZS5qcyc7XG5pbXBvcnQge3BheWVyRGF0YX0gZnJvbSBcIi4uL0hlbHBlci9QYXllckRhdGFcIjtcbmltcG9ydCB7UGF5bWVudE1ldGhvZHN9IGZyb20gXCIuLi9IZWxwZXIvQ2hlY2tvdXRNZXRob2RTdGF0ZVwiO1xuXG5jbGFzcyBDYXJ0QWN0aW9uSGFuZGxlciB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWcsIGVycm9ySGFuZGxlcikge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7XG4gICAgfVxuXG4gICAgY29uZmlndXJhdGlvbigpIHtcbiAgICAgICAgY29uc3QgY3JlYXRlT3JkZXIgPSAoZGF0YSwgYWN0aW9ucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5ZXIgPSBwYXllckRhdGEoKTtcbiAgICAgICAgICAgIGNvbnN0IGJuQ29kZSA9IHR5cGVvZiB0aGlzLmNvbmZpZy5ibl9jb2Rlc1t0aGlzLmNvbmZpZy5jb250ZXh0XSAhPT0gJ3VuZGVmaW5lZCcgP1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLmJuX2NvZGVzW3RoaXMuY29uZmlnLmNvbnRleHRdIDogJyc7XG4gICAgICAgICAgICByZXR1cm4gZmV0Y2godGhpcy5jb25maWcuYWpheC5jcmVhdGVfb3JkZXIuZW5kcG9pbnQsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIG5vbmNlOiB0aGlzLmNvbmZpZy5hamF4LmNyZWF0ZV9vcmRlci5ub25jZSxcbiAgICAgICAgICAgICAgICAgICAgcHVyY2hhc2VfdW5pdHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBwYXltZW50X21ldGhvZDogUGF5bWVudE1ldGhvZHMuUEFZUEFMLFxuICAgICAgICAgICAgICAgICAgICBmdW5kaW5nX3NvdXJjZTogd2luZG93LnBwY3BGdW5kaW5nU291cmNlLFxuICAgICAgICAgICAgICAgICAgICBibl9jb2RlOmJuQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgcGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6dGhpcy5jb25maWcuY29udGV4dFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbihyZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGRhdGEuZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YS5pZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjcmVhdGVPcmRlcixcbiAgICAgICAgICAgIG9uQXBwcm92ZTogb25BcHByb3ZlKHRoaXMsIHRoaXMuZXJyb3JIYW5kbGVyKSxcbiAgICAgICAgICAgIG9uRXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmdlbmVyaWNFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FydEFjdGlvbkhhbmRsZXI7XG4iLCJpbXBvcnQgRXJyb3JIYW5kbGVyIGZyb20gJy4uL0Vycm9ySGFuZGxlcic7XG5pbXBvcnQgQ2FydEFjdGlvbkhhbmRsZXIgZnJvbSAnLi4vQWN0aW9uSGFuZGxlci9DYXJ0QWN0aW9uSGFuZGxlcic7XG5cbmNsYXNzIE1pbmlDYXJ0Qm9vdHN0YXAge1xuICAgIGNvbnN0cnVjdG9yKGdhdGV3YXksIHJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuZ2F0ZXdheSA9IGdhdGV3YXk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5hY3Rpb25IYW5kbGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBpbml0KCkge1xuXG4gICAgICAgIHRoaXMuYWN0aW9uSGFuZGxlciA9IG5ldyBDYXJ0QWN0aW9uSGFuZGxlcihcbiAgICAgICAgICAgIFBheVBhbENvbW1lcmNlR2F0ZXdheSxcbiAgICAgICAgICAgIG5ldyBFcnJvckhhbmRsZXIodGhpcy5nYXRld2F5LmxhYmVscy5lcnJvci5nZW5lcmljKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcblxuICAgICAgICBqUXVlcnkoZG9jdW1lbnQuYm9keSkub24oJ3djX2ZyYWdtZW50c19sb2FkZWQgd2NfZnJhZ21lbnRzX3JlZnJlc2hlZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNob3VsZFJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5nYXRld2F5LmJ1dHRvbi5taW5pX2NhcnRfd3JhcHBlcikgIT09IG51bGxcbiAgICAgICAgICAgIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMubWluaV9jYXJ0X3dyYXBwZXIpICE9PSBudWxsO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNob3VsZFJlbmRlcigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcihcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uSGFuZGxlci5jb25maWd1cmF0aW9uKCksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYnV0dG9uOiB7XG4gICAgICAgICAgICAgICAgICAgIHdyYXBwZXI6IHRoaXMuZ2F0ZXdheS5idXR0b24ubWluaV9jYXJ0X3dyYXBwZXIsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiB0aGlzLmdhdGV3YXkuYnV0dG9uLm1pbmlfY2FydF9zdHlsZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWluaUNhcnRCb290c3RhcDtcbiIsImltcG9ydCBQcm9kdWN0IGZyb20gXCIuLi9FbnRpdHkvUHJvZHVjdFwiO1xuY2xhc3MgVXBkYXRlQ2FydCB7XG5cbiAgICBjb25zdHJ1Y3RvcihlbmRwb2ludCwgbm9uY2UpXG4gICAge1xuICAgICAgICB0aGlzLmVuZHBvaW50ID0gZW5kcG9pbnQ7XG4gICAgICAgIHRoaXMubm9uY2UgPSBub25jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvblJlc29sdmVcbiAgICAgKiBAcGFyYW0ge1Byb2R1Y3RbXX0gcHJvZHVjdHNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICAgKi9cbiAgICB1cGRhdGUob25SZXNvbHZlLCBwcm9kdWN0cylcbiAgICB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBmZXRjaChcbiAgICAgICAgICAgICAgICB0aGlzLmVuZHBvaW50LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vbmNlOiB0aGlzLm5vbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdHMsXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKS50aGVuKFxuICAgICAgICAgICAgICAgIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lmpzb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghIHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXN1bHQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBvblJlc29sdmUocmVzdWx0LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVwZGF0ZUNhcnQ7IiwiLyoqXG4gKiBXaGVuIHlvdSBjYW4ndCBhZGQgc29tZXRoaW5nIHRvIHRoZSBjYXJ0LCB0aGUgUGF5UGFsIGJ1dHRvbnMgc2hvdWxkIG5vdCBzaG93LlxuICogVGhlcmVmb3JlIHdlIGxpc3RlbiBmb3IgY2hhbmdlcyBvbiB0aGUgYWRkIHRvIGNhcnQgYnV0dG9uIGFuZCBzaG93L2hpZGUgdGhlIGJ1dHRvbnMgYWNjb3JkaW5nbHkuXG4gKi9cblxuY2xhc3MgQnV0dG9uc1RvZ2dsZUxpc3RlbmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBzaG93Q2FsbGJhY2ssIGhpZGVDYWxsYmFjaylcbiAgICB7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMuc2hvd0NhbGxiYWNrID0gc2hvd0NhbGxiYWNrO1xuICAgICAgICB0aGlzLmhpZGVDYWxsYmFjayA9IGhpZGVDYWxsYmFjaztcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG51bGw7XG4gICAgfVxuXG4gICAgaW5pdCgpXG4gICAge1xuICAgICAgICBjb25zdCBjb25maWcgPSB7IGF0dHJpYnV0ZXMgOiB0cnVlIH07XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2hvd0NhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuZWxlbWVudCwgY29uZmlnKTtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBkaXNjb25uZWN0KClcbiAgICB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQnV0dG9uc1RvZ2dsZUxpc3RlbmVyOyIsImNsYXNzIFByb2R1Y3Qge1xuXG4gICAgY29uc3RydWN0b3IoaWQsIHF1YW50aXR5LCB2YXJpYXRpb25zKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5xdWFudGl0eSA9IHF1YW50aXR5O1xuICAgICAgICB0aGlzLnZhcmlhdGlvbnMgPSB2YXJpYXRpb25zO1xuICAgIH1cblxuICAgIGRhdGEoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDp0aGlzLmlkLFxuICAgICAgICAgICAgcXVhbnRpdHk6dGhpcy5xdWFudGl0eSxcbiAgICAgICAgICAgIHZhcmlhdGlvbnM6dGhpcy52YXJpYXRpb25zXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb2R1Y3Q7IiwiaW1wb3J0IEJ1dHRvbnNUb2dnbGVMaXN0ZW5lciBmcm9tICcuLi9IZWxwZXIvQnV0dG9uc1RvZ2dsZUxpc3RlbmVyJztcbmltcG9ydCBQcm9kdWN0IGZyb20gJy4uL0VudGl0eS9Qcm9kdWN0JztcbmltcG9ydCBvbkFwcHJvdmUgZnJvbSAnLi4vT25BcHByb3ZlSGFuZGxlci9vbkFwcHJvdmVGb3JDb250aW51ZSc7XG5pbXBvcnQge3BheWVyRGF0YX0gZnJvbSBcIi4uL0hlbHBlci9QYXllckRhdGFcIjtcbmltcG9ydCB7UGF5bWVudE1ldGhvZHN9IGZyb20gXCIuLi9IZWxwZXIvQ2hlY2tvdXRNZXRob2RTdGF0ZVwiO1xuXG5jbGFzcyBTaW5nbGVQcm9kdWN0QWN0aW9uSGFuZGxlciB7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgY29uZmlnLFxuICAgICAgICB1cGRhdGVDYXJ0LFxuICAgICAgICBzaG93QnV0dG9uQ2FsbGJhY2ssXG4gICAgICAgIGhpZGVCdXR0b25DYWxsYmFjayxcbiAgICAgICAgZm9ybUVsZW1lbnQsXG4gICAgICAgIGVycm9ySGFuZGxlclxuICAgICkge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy51cGRhdGVDYXJ0ID0gdXBkYXRlQ2FydDtcbiAgICAgICAgdGhpcy5zaG93QnV0dG9uQ2FsbGJhY2sgPSBzaG93QnV0dG9uQ2FsbGJhY2s7XG4gICAgICAgIHRoaXMuaGlkZUJ1dHRvbkNhbGxiYWNrID0gaGlkZUJ1dHRvbkNhbGxiYWNrO1xuICAgICAgICB0aGlzLmZvcm1FbGVtZW50ID0gZm9ybUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyO1xuICAgIH1cblxuICAgIGNvbmZpZ3VyYXRpb24oKVxuICAgIHtcblxuICAgICAgICBpZiAoIHRoaXMuaGFzVmFyaWF0aW9ucygpICkge1xuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgQnV0dG9uc1RvZ2dsZUxpc3RlbmVyKFxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNpbmdsZV9hZGRfdG9fY2FydF9idXR0b24nKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dCdXR0b25DYWxsYmFjayxcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVCdXR0b25DYWxsYmFja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmluaXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjcmVhdGVPcmRlcjogdGhpcy5jcmVhdGVPcmRlcigpLFxuICAgICAgICAgICAgb25BcHByb3ZlOiBvbkFwcHJvdmUodGhpcywgdGhpcy5lcnJvckhhbmRsZXIpLFxuICAgICAgICAgICAgb25FcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuZ2VuZXJpY0Vycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVPcmRlcigpXG4gICAge1xuICAgICAgICB2YXIgZ2V0UHJvZHVjdHMgPSBudWxsO1xuICAgICAgICBpZiAoISB0aGlzLmlzR3JvdXBlZFByb2R1Y3QoKSApIHtcbiAgICAgICAgICAgIGdldFByb2R1Y3RzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW25hbWU9XCJhZGQtdG8tY2FydFwiXScpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHF0eSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPVwicXVhbnRpdHlcIl0nKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YXJpYXRpb25zID0gdGhpcy52YXJpYXRpb25zKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgUHJvZHVjdChpZCwgcXR5LCB2YXJpYXRpb25zKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQcm9kdWN0cyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9kdWN0cyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT1cIm51bWJlclwiXScpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgZWxlbWVudC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnROYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKS5tYXRjaCgvcXVhbnRpdHlcXFsoW1xcZF0qKVxcXS8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWUubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSBwYXJzZUludChlbGVtZW50TmFtZVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1YW50aXR5ID0gcGFyc2VJbnQoZWxlbWVudC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzLnB1c2gobmV3IFByb2R1Y3QoaWQsIHF1YW50aXR5LCBudWxsKSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvZHVjdHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3JlYXRlT3JkZXIgPSAoZGF0YSwgYWN0aW9ucykgPT4ge1xuICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuY2xlYXIoKTtcblxuICAgICAgICAgICAgY29uc3Qgb25SZXNvbHZlID0gKHB1cmNoYXNlX3VuaXRzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF5ZXIgPSBwYXllckRhdGEoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBibkNvZGUgPSB0eXBlb2YgdGhpcy5jb25maWcuYm5fY29kZXNbdGhpcy5jb25maWcuY29udGV4dF0gIT09ICd1bmRlZmluZWQnID9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuYm5fY29kZXNbdGhpcy5jb25maWcuY29udGV4dF0gOiAnJztcbiAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2godGhpcy5jb25maWcuYWpheC5jcmVhdGVfb3JkZXIuZW5kcG9pbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vbmNlOiB0aGlzLmNvbmZpZy5hamF4LmNyZWF0ZV9vcmRlci5ub25jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1cmNoYXNlX3VuaXRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBibl9jb2RlOmJuQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheW1lbnRfbWV0aG9kOiBQYXltZW50TWV0aG9kcy5QQVlQQUwsXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5kaW5nX3NvdXJjZTogd2luZG93LnBwY3BGdW5kaW5nU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDp0aGlzLmNvbmZpZy5jb250ZXh0XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihkYXRhLmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YS5pZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnVwZGF0ZUNhcnQudXBkYXRlKG9uUmVzb2x2ZSwgZ2V0UHJvZHVjdHMoKSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZU9yZGVyO1xuICAgIH1cblxuICAgIHZhcmlhdGlvbnMoKVxuICAgIHtcblxuICAgICAgICBpZiAoISB0aGlzLmhhc1ZhcmlhdGlvbnMoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IFsuLi50aGlzLmZvcm1FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbmFtZV49J2F0dHJpYnV0ZV8nXVwiKV0ubWFwKFxuICAgICAgICAgICAgKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOmVsZW1lbnQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ZWxlbWVudC5uYW1lXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgICB9XG5cbiAgICBoYXNWYXJpYXRpb25zKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1FbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygndmFyaWF0aW9uc19mb3JtJyk7XG4gICAgfVxuXG4gICAgaXNHcm91cGVkUHJvZHVjdCgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2dyb3VwZWRfZm9ybScpO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IFNpbmdsZVByb2R1Y3RBY3Rpb25IYW5kbGVyO1xuIiwiaW1wb3J0IEVycm9ySGFuZGxlciBmcm9tICcuLi9FcnJvckhhbmRsZXInO1xuaW1wb3J0IFVwZGF0ZUNhcnQgZnJvbSBcIi4uL0hlbHBlci9VcGRhdGVDYXJ0XCI7XG5pbXBvcnQgU2luZ2xlUHJvZHVjdEFjdGlvbkhhbmRsZXIgZnJvbSBcIi4uL0FjdGlvbkhhbmRsZXIvU2luZ2xlUHJvZHVjdEFjdGlvbkhhbmRsZXJcIjtcblxuY2xhc3MgU2luZ2xlUHJvZHVjdEJvb3RzdGFwIHtcbiAgICBjb25zdHJ1Y3RvcihnYXRld2F5LCByZW5kZXJlciwgbWVzc2FnZXMpIHtcbiAgICAgICAgdGhpcy5nYXRld2F5ID0gZ2F0ZXdheTtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgICAgICB0aGlzLm1lc3NhZ2VzID0gbWVzc2FnZXM7XG4gICAgfVxuXG5cbiAgICBoYW5kbGVDaGFuZ2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5zaG91bGRSZW5kZXIoKSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5oaWRlQnV0dG9ucyh0aGlzLmdhdGV3YXkuaG9zdGVkX2ZpZWxkcy53cmFwcGVyKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUJ1dHRvbnModGhpcy5nYXRld2F5LmJ1dHRvbi53cmFwcGVyKTtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMuaGlkZU1lc3NhZ2VzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cblxuICAgIGluaXQoKSB7XG5cbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZm9ybS5jYXJ0JykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5oYW5kbGVDaGFuZ2UuYmluZCh0aGlzKSlcblxuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkUmVuZGVyKCkpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUJ1dHRvbnModGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlcik7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzLmhpZGVNZXNzYWdlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcblxuICAgIH1cblxuICAgIHNob3VsZFJlbmRlcigpIHtcblxuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZm9ybS5jYXJ0JykgIT09IG51bGwgJiYgIXRoaXMucHJpY2VBbW91bnRJc1plcm8oKTtcblxuICAgIH1cblxuICAgIHByaWNlQW1vdW50KCkge1xuXG4gICAgICAgIGxldCBwcmljZVRleHQgPSBcIjBcIjtcbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0uY2FydCBpbnMgLndvb2NvbW1lcmNlLVByaWNlLWFtb3VudCcpKSB7XG4gICAgICAgICAgICBwcmljZVRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtLmNhcnQgaW5zIC53b29jb21tZXJjZS1QcmljZS1hbW91bnQnKS5pbm5lclRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZm9ybS5jYXJ0IC53b29jb21tZXJjZS1QcmljZS1hbW91bnQnKSkge1xuICAgICAgICAgICAgcHJpY2VUZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZm9ybS5jYXJ0IC53b29jb21tZXJjZS1QcmljZS1hbW91bnQnKS5pbm5lclRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnByb2R1Y3QgLndvb2NvbW1lcmNlLVByaWNlLWFtb3VudCcpKSB7XG4gICAgICAgICAgICBwcmljZVRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdCAud29vY29tbWVyY2UtUHJpY2UtYW1vdW50JykuaW5uZXJUZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpY2VUZXh0ID0gcHJpY2VUZXh0LnJlcGxhY2UoLywvZywgJy4nKTtcblxuICAgICAgICByZXR1cm4gIHBhcnNlRmxvYXQocHJpY2VUZXh0LnJlcGxhY2UoLyhbXlxcZCxcXC5cXHNdKikvZywgJycpKTtcbiAgICB9XG5cbiAgICBwcmljZUFtb3VudElzWmVybygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJpY2VBbW91bnQoKSA9PT0gMDtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkhhbmRsZXIgPSBuZXcgU2luZ2xlUHJvZHVjdEFjdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICB0aGlzLmdhdGV3YXksXG4gICAgICAgICAgICBuZXcgVXBkYXRlQ2FydChcbiAgICAgICAgICAgICAgICB0aGlzLmdhdGV3YXkuYWpheC5jaGFuZ2VfY2FydC5lbmRwb2ludCxcbiAgICAgICAgICAgICAgICB0aGlzLmdhdGV3YXkuYWpheC5jaGFuZ2VfY2FydC5ub25jZSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaG93QnV0dG9ucyh0aGlzLmdhdGV3YXkuYnV0dG9uLndyYXBwZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2hvd0J1dHRvbnModGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlcy5yZW5kZXJXaXRoQW1vdW50KHRoaXMucHJpY2VBbW91bnQoKSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5oaWRlQnV0dG9ucyh0aGlzLmdhdGV3YXkuYnV0dG9uLndyYXBwZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUJ1dHRvbnModGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlcy5oaWRlTWVzc2FnZXMoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtLmNhcnQnKSxcbiAgICAgICAgICAgIG5ldyBFcnJvckhhbmRsZXIodGhpcy5nYXRld2F5LmxhYmVscy5lcnJvci5nZW5lcmljKSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcihcbiAgICAgICAgICAgIGFjdGlvbkhhbmRsZXIuY29uZmlndXJhdGlvbigpXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaW5nbGVQcm9kdWN0Qm9vdHN0YXA7XG4iLCJpbXBvcnQgQ2FydEFjdGlvbkhhbmRsZXIgZnJvbSAnLi4vQWN0aW9uSGFuZGxlci9DYXJ0QWN0aW9uSGFuZGxlcic7XG5pbXBvcnQgRXJyb3JIYW5kbGVyIGZyb20gJy4uL0Vycm9ySGFuZGxlcic7XG5cbmNsYXNzIENhcnRCb290c3RyYXAge1xuICAgIGNvbnN0cnVjdG9yKGdhdGV3YXksIHJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMuZ2F0ZXdheSA9IGdhdGV3YXk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICB9XG5cbiAgICBpbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkUmVuZGVyKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgICAgICAgalF1ZXJ5KGRvY3VtZW50LmJvZHkpLm9uKCd1cGRhdGVkX2NhcnRfdG90YWxzIHVwZGF0ZWRfY2hlY2tvdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzaG91bGRSZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZ2F0ZXdheS5idXR0b24ud3JhcHBlcikgIT09XG4gICAgICAgICAgICBudWxsIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5nYXRld2F5Lmhvc3RlZF9maWVsZHMud3JhcHBlcikgIT09XG4gICAgICAgICAgICBudWxsO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgYWN0aW9uSGFuZGxlciA9IG5ldyBDYXJ0QWN0aW9uSGFuZGxlcihcbiAgICAgICAgICAgIFBheVBhbENvbW1lcmNlR2F0ZXdheSxcbiAgICAgICAgICAgIG5ldyBFcnJvckhhbmRsZXIodGhpcy5nYXRld2F5LmxhYmVscy5lcnJvci5nZW5lcmljKSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcihcbiAgICAgICAgICAgIGFjdGlvbkhhbmRsZXIuY29uZmlndXJhdGlvbigpXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDYXJ0Qm9vdHN0cmFwO1xuIiwiY29uc3Qgb25BcHByb3ZlID0gKGNvbnRleHQsIGVycm9ySGFuZGxlciwgc3Bpbm5lcikgPT4ge1xuICAgIHJldHVybiAoZGF0YSwgYWN0aW9ucykgPT4ge1xuICAgICAgICBzcGlubmVyLmJsb2NrKCk7XG4gICAgICAgIGVycm9ySGFuZGxlci5jbGVhcigpO1xuXG4gICAgICAgIHJldHVybiBmZXRjaChjb250ZXh0LmNvbmZpZy5hamF4LmFwcHJvdmVfb3JkZXIuZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIG5vbmNlOiBjb250ZXh0LmNvbmZpZy5hamF4LmFwcHJvdmVfb3JkZXIubm9uY2UsXG4gICAgICAgICAgICAgICAgb3JkZXJfaWQ6ZGF0YS5vcmRlcklELFxuICAgICAgICAgICAgICAgIGZ1bmRpbmdfc291cmNlOiB3aW5kb3cucHBjcEZ1bmRpbmdTb3VyY2UsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KS50aGVuKChyZXMpPT57XG4gICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgICAgICAgfSkudGhlbigoZGF0YSk9PntcbiAgICAgICAgICAgIHNwaW5uZXIudW5ibG9jaygpO1xuICAgICAgICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5kYXRhLmNvZGUgPT09IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIubWVzc2FnZShkYXRhLmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyLmdlbmVyaWNFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbnMgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBhY3Rpb25zLnJlc3RhcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb25zLnJlc3RhcnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGRhdGEuZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwbGFjZV9vcmRlcicpLmNsaWNrKClcbiAgICAgICAgfSk7XG5cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG9uQXBwcm92ZTtcbiIsImltcG9ydCBvbkFwcHJvdmUgZnJvbSAnLi4vT25BcHByb3ZlSGFuZGxlci9vbkFwcHJvdmVGb3JQYXlOb3cuanMnO1xuaW1wb3J0IHtwYXllckRhdGF9IGZyb20gXCIuLi9IZWxwZXIvUGF5ZXJEYXRhXCI7XG5pbXBvcnQge2dldEN1cnJlbnRQYXltZW50TWV0aG9kfSBmcm9tIFwiLi4vSGVscGVyL0NoZWNrb3V0TWV0aG9kU3RhdGVcIjtcblxuY2xhc3MgQ2hlY2tvdXRBY3Rpb25IYW5kbGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZywgZXJyb3JIYW5kbGVyLCBzcGlubmVyKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjtcbiAgICAgICAgdGhpcy5zcGlubmVyID0gc3Bpbm5lcjtcbiAgICB9XG5cbiAgICBjb25maWd1cmF0aW9uKCkge1xuICAgICAgICBjb25zdCBzcGlubmVyID0gdGhpcy5zcGlubmVyO1xuICAgICAgICBjb25zdCBjcmVhdGVPcmRlciA9IChkYXRhLCBhY3Rpb25zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXllciA9IHBheWVyRGF0YSgpO1xuICAgICAgICAgICAgY29uc3QgYm5Db2RlID0gdHlwZW9mIHRoaXMuY29uZmlnLmJuX2NvZGVzW3RoaXMuY29uZmlnLmNvbnRleHRdICE9PSAndW5kZWZpbmVkJyA/XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuYm5fY29kZXNbdGhpcy5jb25maWcuY29udGV4dF0gOiAnJztcblxuICAgICAgICAgICAgY29uc3QgZXJyb3JIYW5kbGVyID0gdGhpcy5lcnJvckhhbmRsZXI7XG5cbiAgICAgICAgICAgIGNvbnN0IGZvcm1TZWxlY3RvciA9IHRoaXMuY29uZmlnLmNvbnRleHQgPT09ICdjaGVja291dCcgPyAnZm9ybS5jaGVja291dCcgOiAnZm9ybSNvcmRlcl9yZXZpZXcnO1xuICAgICAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihmb3JtU2VsZWN0b3IpKTtcbiAgICAgICAgICAgIC8vIHdpbGwgbm90IGhhbmRsZSBmaWVsZHMgd2l0aCBtdWx0aXBsZSB2YWx1ZXMgKGNoZWNrYm94ZXMsIDxzZWxlY3QgbXVsdGlwbGU+KSwgYnV0IHdlIGRvIG5vdCBjYXJlIGFib3V0IHRoaXMgaGVyZVxuICAgICAgICAgICAgY29uc3QgZm9ybUpzb25PYmogPSBPYmplY3QuZnJvbUVudHJpZXMoZm9ybURhdGEpO1xuXG4gICAgICAgICAgICBjb25zdCBjcmVhdGVhY2NvdW50ID0galF1ZXJ5KCcjY3JlYXRlYWNjb3VudCcpLmlzKFwiOmNoZWNrZWRcIikgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IHBheW1lbnRNZXRob2QgPSBnZXRDdXJyZW50UGF5bWVudE1ldGhvZCgpO1xuICAgICAgICAgICAgY29uc3QgZnVuZGluZ1NvdXJjZSA9IHdpbmRvdy5wcGNwRnVuZGluZ1NvdXJjZTtcblxuICAgICAgICAgICAgcmV0dXJuIGZldGNoKHRoaXMuY29uZmlnLmFqYXguY3JlYXRlX29yZGVyLmVuZHBvaW50LCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICBub25jZTogdGhpcy5jb25maWcuYWpheC5jcmVhdGVfb3JkZXIubm9uY2UsXG4gICAgICAgICAgICAgICAgICAgIHBheWVyLFxuICAgICAgICAgICAgICAgICAgICBibl9jb2RlOmJuQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDp0aGlzLmNvbmZpZy5jb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZDp0aGlzLmNvbmZpZy5vcmRlcl9pZCxcbiAgICAgICAgICAgICAgICAgICAgcGF5bWVudF9tZXRob2Q6IHBheW1lbnRNZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIGZ1bmRpbmdfc291cmNlOiBmdW5kaW5nU291cmNlLFxuICAgICAgICAgICAgICAgICAgICBmb3JtOiBmb3JtSnNvbk9iaixcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlYWNjb3VudDogY3JlYXRlYWNjb3VudFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICBzcGlubmVyLnVuYmxvY2soKTtcbiAgICAgICAgICAgICAgICAgICAgLy9oYW5kbGUgYm90aCBtZXNzYWdlcyBzZW50IGZyb20gV29vY29tbWVyY2UgKGRhdGEubWVzc2FnZXMpIGFuZCB0aGlzIHBsdWdpbiAoZGF0YS5kYXRhLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZGF0YS5tZXNzYWdlcykgIT09ICd1bmRlZmluZWQnIClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG9tUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyLmFwcGVuZFByZXBhcmVkRXJyb3JNZXNzYWdlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21QYXJzZXIucGFyc2VGcm9tU3RyaW5nKGRhdGEubWVzc2FnZXMsICd0ZXh0L2h0bWwnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVlcnlTZWxlY3RvcigndWwnKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlci5jbGVhcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZGF0YS5kZXRhaWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIubWVzc2FnZShkYXRhLmRhdGEuZGV0YWlscy5tYXAoZCA9PiBgJHtkLmlzc3VlfSAke2QuZGVzY3JpcHRpb259YCkuam9pbignPGJyLz4nKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlci5tZXNzYWdlKGRhdGEuZGF0YS5tZXNzYWdlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCduYW1lJywgJ3BwY3AtcmVzdW1lLW9yZGVyJyk7XG4gICAgICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIGRhdGEuZGF0YS5wdXJjaGFzZV91bml0c1swXS5jdXN0b21faWQpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZm9ybVNlbGVjdG9yKS5hcHBlbmQoaW5wdXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGEuaWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3JlYXRlT3JkZXIsXG4gICAgICAgICAgICBvbkFwcHJvdmU6b25BcHByb3ZlKHRoaXMsIHRoaXMuZXJyb3JIYW5kbGVyLCB0aGlzLnNwaW5uZXIpLFxuICAgICAgICAgICAgb25DYW5jZWw6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBzcGlubmVyLnVuYmxvY2soKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuZ2VuZXJpY0Vycm9yKCk7XG4gICAgICAgICAgICAgICAgc3Bpbm5lci51bmJsb2NrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENoZWNrb3V0QWN0aW9uSGFuZGxlcjtcbiIsImNvbnN0IGdldEVsZW1lbnQgPSAoc2VsZWN0b3JPckVsZW1lbnQpID0+IHtcbiAgICBpZiAodHlwZW9mIHNlbGVjdG9yT3JFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvck9yRWxlbWVudCk7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3Rvck9yRWxlbWVudDtcbn1cblxuZXhwb3J0IGNvbnN0IGlzVmlzaWJsZSA9IChlbGVtZW50KSA9PiB7XG4gICAgcmV0dXJuICEhKGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCk7XG59XG5cbmV4cG9ydCBjb25zdCBzZXRWaXNpYmxlID0gKHNlbGVjdG9yT3JFbGVtZW50LCBzaG93LCBpbXBvcnRhbnQgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBnZXRFbGVtZW50KHNlbGVjdG9yT3JFbGVtZW50KTtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGVsZW1lbnQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZGlzcGxheScpO1xuXG4gICAgaWYgKCFzaG93KSB7XG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT09ICdub25lJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgaW1wb3J0YW50ID8gJ2ltcG9ydGFudCcgOiAnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdkaXNwbGF5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdGlsbCBub3QgdmlzaWJsZSAoaWYgc29tZXRoaW5nIGVsc2UgYWRkZWQgZGlzcGxheTogbm9uZSBpbiBDU1MpXG4gICAgICAgIGlmICghaXNWaXNpYmxlKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ2Jsb2NrJyk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgaGlkZSA9IChzZWxlY3Rvck9yRWxlbWVudCwgaW1wb3J0YW50ID0gZmFsc2UpID0+IHtcbiAgICBzZXRWaXNpYmxlKHNlbGVjdG9yT3JFbGVtZW50LCBmYWxzZSwgaW1wb3J0YW50KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaG93ID0gKHNlbGVjdG9yT3JFbGVtZW50KSA9PiB7XG4gICAgc2V0VmlzaWJsZShzZWxlY3Rvck9yRWxlbWVudCwgdHJ1ZSk7XG59O1xuIiwiaW1wb3J0IEVycm9ySGFuZGxlciBmcm9tICcuLi9FcnJvckhhbmRsZXInO1xuaW1wb3J0IENoZWNrb3V0QWN0aW9uSGFuZGxlciBmcm9tICcuLi9BY3Rpb25IYW5kbGVyL0NoZWNrb3V0QWN0aW9uSGFuZGxlcic7XG5pbXBvcnQgeyBzZXRWaXNpYmxlIH0gZnJvbSAnLi4vSGVscGVyL0hpZGluZyc7XG5pbXBvcnQge1xuICAgIGdldEN1cnJlbnRQYXltZW50TWV0aG9kLFxuICAgIGlzU2F2ZWRDYXJkU2VsZWN0ZWQsIE9SREVSX0JVVFRPTl9TRUxFQ1RPUixcbiAgICBQYXltZW50TWV0aG9kc1xufSBmcm9tIFwiLi4vSGVscGVyL0NoZWNrb3V0TWV0aG9kU3RhdGVcIjtcblxuY2xhc3MgQ2hlY2tvdXRCb290c3RhcCB7XG4gICAgY29uc3RydWN0b3IoZ2F0ZXdheSwgcmVuZGVyZXIsIG1lc3NhZ2VzLCBzcGlubmVyKSB7XG4gICAgICAgIHRoaXMuZ2F0ZXdheSA9IGdhdGV3YXk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5tZXNzYWdlcyA9IG1lc3NhZ2VzO1xuICAgICAgICB0aGlzLnNwaW5uZXIgPSBzcGlubmVyO1xuXG4gICAgICAgIHRoaXMuc3RhbmRhcmRPcmRlckJ1dHRvblNlbGVjdG9yID0gT1JERVJfQlVUVE9OX1NFTEVDVE9SO1xuXG4gICAgICAgIHRoaXMuYnV0dG9uQ2hhbmdlT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoZWwpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVWkoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcblxuICAgICAgICAvLyBVbnNlbGVjdCBzYXZlZCBjYXJkLlxuICAgICAgICAvLyBXQyBzYXZlcyBmb3JtIHZhbHVlcywgc28gd2l0aCBvdXIgY3VycmVudCBVSSBpdCB3b3VsZCBiZSBhIGJpdCB3ZWlyZFxuICAgICAgICAvLyBpZiB0aGUgdXNlciBwYWlkIHdpdGggc2F2ZWQsIHRoZW4gYWZ0ZXIgc29tZSB0aW1lIHRyaWVzIHRvIHBheSBhZ2FpbixcbiAgICAgICAgLy8gYnV0IHdhbnRzIHRvIGVudGVyIGEgbmV3IGNhcmQsIGFuZCB0byBkbyB0aGF0IHRoZXkgaGF2ZSB0byBjaG9vc2Ug4oCcU2VsZWN0IHBheW1lbnTigJ0gaW4gdGhlIGxpc3QuXG4gICAgICAgIGpRdWVyeSgnI3NhdmVkLWNyZWRpdC1jYXJkJykudmFsKGpRdWVyeSgnI3NhdmVkLWNyZWRpdC1jYXJkIG9wdGlvbjpmaXJzdCcpLnZhbCgpKTtcblxuICAgICAgICBqUXVlcnkoZG9jdW1lbnQuYm9keSkub24oJ3VwZGF0ZWRfY2hlY2tvdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcigpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGpRdWVyeShkb2N1bWVudC5ib2R5KS5vbigndXBkYXRlZF9jaGVja291dCBwYXltZW50X21ldGhvZF9zZWxlY3RlZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVWkoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgalF1ZXJ5KGRvY3VtZW50KS5vbignaG9zdGVkX2ZpZWxkc19sb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBqUXVlcnkoJyNzYXZlZC1jcmVkaXQtY2FyZCcpLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVVaSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVVaSgpO1xuICAgIH1cblxuICAgIHNob3VsZFJlbmRlcigpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5nYXRld2F5LmJ1dHRvbi5jYW5jZWxfd3JhcHBlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZ2F0ZXdheS5idXR0b24ud3JhcHBlcikgIT09IG51bGwgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmdhdGV3YXkuaG9zdGVkX2ZpZWxkcy53cmFwcGVyKSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5zaG91bGRSZW5kZXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZ2F0ZXdheS5ob3N0ZWRfZmllbGRzLndyYXBwZXIgKyAnPmRpdicpKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZ2F0ZXdheS5ob3N0ZWRfZmllbGRzLndyYXBwZXIgKyAnPmRpdicpLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0aW9uSGFuZGxlciA9IG5ldyBDaGVja291dEFjdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICBQYXlQYWxDb21tZXJjZUdhdGV3YXksXG4gICAgICAgICAgICBuZXcgRXJyb3JIYW5kbGVyKHRoaXMuZ2F0ZXdheS5sYWJlbHMuZXJyb3IuZ2VuZXJpYyksXG4gICAgICAgICAgICB0aGlzLnNwaW5uZXJcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcihcbiAgICAgICAgICAgIGFjdGlvbkhhbmRsZXIuY29uZmlndXJhdGlvbigpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5idXR0b25DaGFuZ2VPYnNlcnZlci5vYnNlcnZlKFxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLnN0YW5kYXJkT3JkZXJCdXR0b25TZWxlY3RvciksXG4gICAgICAgICAgICB7YXR0cmlidXRlczogdHJ1ZX1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB1cGRhdGVVaSgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBheW1lbnRNZXRob2QgPSBnZXRDdXJyZW50UGF5bWVudE1ldGhvZCgpO1xuICAgICAgICBjb25zdCBpc1BheXBhbCA9IGN1cnJlbnRQYXltZW50TWV0aG9kID09PSBQYXltZW50TWV0aG9kcy5QQVlQQUw7XG4gICAgICAgIGNvbnN0IGlzQ2FyZCA9IGN1cnJlbnRQYXltZW50TWV0aG9kID09PSBQYXltZW50TWV0aG9kcy5DQVJEUztcbiAgICAgICAgY29uc3QgaXNTZXBhcmF0ZUJ1dHRvbkdhdGV3YXkgPSBbUGF5bWVudE1ldGhvZHMuQ0FSRF9CVVRUT05dLmluY2x1ZGVzKGN1cnJlbnRQYXltZW50TWV0aG9kKTtcbiAgICAgICAgY29uc3QgaXNTYXZlZENhcmQgPSBpc0NhcmQgJiYgaXNTYXZlZENhcmRTZWxlY3RlZCgpO1xuICAgICAgICBjb25zdCBpc05vdE91ckdhdGV3YXkgPSAhaXNQYXlwYWwgJiYgIWlzQ2FyZCAmJiAhaXNTZXBhcmF0ZUJ1dHRvbkdhdGV3YXk7XG4gICAgICAgIGNvbnN0IGlzRnJlZVRyaWFsID0gUGF5UGFsQ29tbWVyY2VHYXRld2F5LmlzX2ZyZWVfdHJpYWxfY2FydDtcbiAgICAgICAgY29uc3QgaGFzVmF1bHRlZFBheXBhbCA9IFBheVBhbENvbW1lcmNlR2F0ZXdheS52YXVsdGVkX3BheXBhbF9lbWFpbCAhPT0gJyc7XG5cbiAgICAgICAgY29uc3QgcGF5cGFsQnV0dG9uV3JhcHBlcnMgPSB7XG4gICAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhQYXlQYWxDb21tZXJjZUdhdGV3YXkuc2VwYXJhdGVfYnV0dG9ucylcbiAgICAgICAgICAgICAgICAucmVkdWNlKChyZXN1bHQsIFtrLCBkYXRhXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gey4uLnJlc3VsdCwgW2RhdGEuaWRdOiBkYXRhLndyYXBwZXJ9XG4gICAgICAgICAgICAgICAgfSwge30pLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNldFZpc2libGUodGhpcy5zdGFuZGFyZE9yZGVyQnV0dG9uU2VsZWN0b3IsICAoaXNQYXlwYWwgJiYgaXNGcmVlVHJpYWwgJiYgaGFzVmF1bHRlZFBheXBhbCkgfHwgaXNOb3RPdXJHYXRld2F5IHx8IGlzU2F2ZWRDYXJkLCB0cnVlKTtcbiAgICAgICAgc2V0VmlzaWJsZSgnLnBwY3AtdmF1bHRlZC1wYXlwYWwtZGV0YWlscycsIGlzUGF5cGFsKTtcbiAgICAgICAgc2V0VmlzaWJsZSh0aGlzLmdhdGV3YXkuYnV0dG9uLndyYXBwZXIsIGlzUGF5cGFsICYmICEoaXNGcmVlVHJpYWwgJiYgaGFzVmF1bHRlZFBheXBhbCkpO1xuICAgICAgICBzZXRWaXNpYmxlKHRoaXMuZ2F0ZXdheS5tZXNzYWdlcy53cmFwcGVyLCBpc1BheXBhbCAmJiAhaXNGcmVlVHJpYWwpO1xuICAgICAgICBzZXRWaXNpYmxlKHRoaXMuZ2F0ZXdheS5ob3N0ZWRfZmllbGRzLndyYXBwZXIsIGlzQ2FyZCAmJiAhaXNTYXZlZENhcmQpO1xuICAgICAgICBmb3IgKGNvbnN0IFtnYXRld2F5SWQsIHdyYXBwZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBheXBhbEJ1dHRvbldyYXBwZXJzKSkge1xuICAgICAgICAgICAgc2V0VmlzaWJsZSh3cmFwcGVyLCBnYXRld2F5SWQgPT09IGN1cnJlbnRQYXltZW50TWV0aG9kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1BheXBhbCAmJiAhaXNGcmVlVHJpYWwpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMucmVuZGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDYXJkKSB7XG4gICAgICAgICAgICBpZiAoaXNTYXZlZENhcmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDcmVkaXRDYXJkRmllbGRzKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlQ3JlZGl0Q2FyZEZpZWxkcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzYWJsZUNyZWRpdENhcmRGaWVsZHMoKSB7XG4gICAgICAgIGpRdWVyeSgnbGFiZWxbZm9yPVwicHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtbnVtYmVyXCJdJykuYWRkQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCcjcHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtbnVtYmVyJykuYWRkQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCdsYWJlbFtmb3I9XCJwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1leHBpcnlcIl0nKS5hZGRDbGFzcygncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWZvcm0tZmllbGQtZGlzYWJsZWQnKVxuICAgICAgICBqUXVlcnkoJyNwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1leHBpcnknKS5hZGRDbGFzcygncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWZvcm0tZmllbGQtZGlzYWJsZWQnKVxuICAgICAgICBqUXVlcnkoJ2xhYmVsW2Zvcj1cInBwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLWN2Y1wiXScpLmFkZENsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnI3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLWN2YycpLmFkZENsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnbGFiZWxbZm9yPVwidmF1bHRcIl0nKS5hZGRDbGFzcygncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWZvcm0tZmllbGQtZGlzYWJsZWQnKVxuICAgICAgICBqUXVlcnkoJyNwcGNwLWNyZWRpdC1jYXJkLXZhdWx0JykuYWRkQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCcjcHBjcC1jcmVkaXQtY2FyZC12YXVsdCcpLmF0dHIoXCJkaXNhYmxlZFwiLCB0cnVlKVxuICAgICAgICB0aGlzLnJlbmRlcmVyLmRpc2FibGVDcmVkaXRDYXJkRmllbGRzKClcbiAgICB9XG5cbiAgICBlbmFibGVDcmVkaXRDYXJkRmllbGRzKCkge1xuICAgICAgICBqUXVlcnkoJ2xhYmVsW2Zvcj1cInBwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLW51bWJlclwiXScpLnJlbW92ZUNsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnI3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLW51bWJlcicpLnJlbW92ZUNsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnbGFiZWxbZm9yPVwicHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtZXhwaXJ5XCJdJykucmVtb3ZlQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCcjcHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtZXhwaXJ5JykucmVtb3ZlQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCdsYWJlbFtmb3I9XCJwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1jdmNcIl0nKS5yZW1vdmVDbGFzcygncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWZvcm0tZmllbGQtZGlzYWJsZWQnKVxuICAgICAgICBqUXVlcnkoJyNwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1jdmMnKS5yZW1vdmVDbGFzcygncHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWZvcm0tZmllbGQtZGlzYWJsZWQnKVxuICAgICAgICBqUXVlcnkoJ2xhYmVsW2Zvcj1cInZhdWx0XCJdJykucmVtb3ZlQ2xhc3MoJ3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1mb3JtLWZpZWxkLWRpc2FibGVkJylcbiAgICAgICAgalF1ZXJ5KCcjcHBjcC1jcmVkaXQtY2FyZC12YXVsdCcpLnJlbW92ZUNsYXNzKCdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktZm9ybS1maWVsZC1kaXNhYmxlZCcpXG4gICAgICAgIGpRdWVyeSgnI3BwY3AtY3JlZGl0LWNhcmQtdmF1bHQnKS5hdHRyKFwiZGlzYWJsZWRcIiwgZmFsc2UpXG4gICAgICAgIHRoaXMucmVuZGVyZXIuZW5hYmxlQ3JlZGl0Q2FyZEZpZWxkcygpXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDaGVja291dEJvb3RzdGFwXG4iLCJleHBvcnQgY29uc3QgaXNDaGFuZ2VQYXltZW50UGFnZSA9ICgpID0+IHtcbiAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpXG4gICAgcmV0dXJuIHVybFBhcmFtcy5oYXMoJ2NoYW5nZV9wYXltZW50X21ldGhvZCcpO1xufVxuIiwiaW1wb3J0IENoZWNrb3V0Qm9vdHN0YXAgZnJvbSAnLi9DaGVja291dEJvb3RzdGFwJ1xuaW1wb3J0IHtpc0NoYW5nZVBheW1lbnRQYWdlfSBmcm9tIFwiLi4vSGVscGVyL1N1YnNjcmlwdGlvbnNcIjtcblxuY2xhc3MgUGF5Tm93Qm9vdHN0cmFwIGV4dGVuZHMgQ2hlY2tvdXRCb290c3RhcCB7XG4gICAgY29uc3RydWN0b3IoZ2F0ZXdheSwgcmVuZGVyZXIsIG1lc3NhZ2VzLCBzcGlubmVyKSB7XG4gICAgICAgIHN1cGVyKGdhdGV3YXksIHJlbmRlcmVyLCBtZXNzYWdlcywgc3Bpbm5lcilcbiAgICB9XG5cbiAgICB1cGRhdGVVaSgpIHtcbiAgICAgICAgaWYgKGlzQ2hhbmdlUGF5bWVudFBhZ2UoKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBzdXBlci51cGRhdGVVaSgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGF5Tm93Qm9vdHN0cmFwO1xuIiwiaW1wb3J0IG1lcmdlIGZyb20gXCJkZWVwbWVyZ2VcIjtcblxuY2xhc3MgUmVuZGVyZXIge1xuICAgIGNvbnN0cnVjdG9yKGNyZWRpdENhcmRSZW5kZXJlciwgZGVmYXVsdFNldHRpbmdzLCBvblNtYXJ0QnV0dG9uQ2xpY2ssIG9uU21hcnRCdXR0b25zSW5pdCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRTZXR0aW5ncyA9IGRlZmF1bHRTZXR0aW5ncztcbiAgICAgICAgdGhpcy5jcmVkaXRDYXJkUmVuZGVyZXIgPSBjcmVkaXRDYXJkUmVuZGVyZXI7XG4gICAgICAgIHRoaXMub25TbWFydEJ1dHRvbkNsaWNrID0gb25TbWFydEJ1dHRvbkNsaWNrO1xuICAgICAgICB0aGlzLm9uU21hcnRCdXR0b25zSW5pdCA9IG9uU21hcnRCdXR0b25zSW5pdDtcblxuICAgICAgICB0aGlzLnJlbmRlcmVkU291cmNlcyA9IG5ldyBTZXQoKTtcbiAgICB9XG5cbiAgICByZW5kZXIoY29udGV4dENvbmZpZywgc2V0dGluZ3NPdmVycmlkZSA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gbWVyZ2UodGhpcy5kZWZhdWx0U2V0dGluZ3MsIHNldHRpbmdzT3ZlcnJpZGUpO1xuXG4gICAgICAgIGNvbnN0IGVuYWJsZWRTZXBhcmF0ZUdhdGV3YXlzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgc2V0dGluZ3Muc2VwYXJhdGVfYnV0dG9ucykuZmlsdGVyKChbcywgZGF0YV0pID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZGF0YS53cmFwcGVyKVxuICAgICAgICApKTtcbiAgICAgICAgY29uc3QgaGFzRW5hYmxlZFNlcGFyYXRlR2F0ZXdheXMgPSBPYmplY3Qua2V5cyhlbmFibGVkU2VwYXJhdGVHYXRld2F5cykubGVuZ3RoICE9PSAwO1xuXG4gICAgICAgIGlmICghaGFzRW5hYmxlZFNlcGFyYXRlR2F0ZXdheXMpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQnV0dG9ucyhcbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5idXR0b24ud3JhcHBlcixcbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5idXR0b24uc3R5bGUsXG4gICAgICAgICAgICAgICAgY29udGV4dENvbmZpZyxcbiAgICAgICAgICAgICAgICBoYXNFbmFibGVkU2VwYXJhdGVHYXRld2F5c1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJlbmRlciBlYWNoIGJ1dHRvbiBzZXBhcmF0ZWx5XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZ1bmRpbmdTb3VyY2Ugb2YgcGF5cGFsLmdldEZ1bmRpbmdTb3VyY2VzKCkuZmlsdGVyKHMgPT4gIShzIGluIGVuYWJsZWRTZXBhcmF0ZUdhdGV3YXlzKSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSBzZXR0aW5ncy5idXR0b24uc3R5bGU7XG4gICAgICAgICAgICAgICAgaWYgKGZ1bmRpbmdTb3VyY2UgIT09ICdwYXlwYWwnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGU6IHN0eWxlLnNoYXBlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyQnV0dG9ucyhcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuYnV0dG9uLndyYXBwZXIsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBoYXNFbmFibGVkU2VwYXJhdGVHYXRld2F5cyxcbiAgICAgICAgICAgICAgICAgICAgZnVuZGluZ1NvdXJjZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNyZWRpdENhcmRSZW5kZXJlci5yZW5kZXIoc2V0dGluZ3MuaG9zdGVkX2ZpZWxkcy53cmFwcGVyLCBjb250ZXh0Q29uZmlnKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtmdW5kaW5nU291cmNlLCBkYXRhXSBvZiBPYmplY3QuZW50cmllcyhlbmFibGVkU2VwYXJhdGVHYXRld2F5cykpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQnV0dG9ucyhcbiAgICAgICAgICAgICAgICBkYXRhLndyYXBwZXIsXG4gICAgICAgICAgICAgICAgZGF0YS5zdHlsZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0Q29uZmlnLFxuICAgICAgICAgICAgICAgIGhhc0VuYWJsZWRTZXBhcmF0ZUdhdGV3YXlzLFxuICAgICAgICAgICAgICAgIGZ1bmRpbmdTb3VyY2VcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJCdXR0b25zKHdyYXBwZXIsIHN0eWxlLCBjb250ZXh0Q29uZmlnLCBoYXNFbmFibGVkU2VwYXJhdGVHYXRld2F5cywgZnVuZGluZ1NvdXJjZSA9IG51bGwpIHtcbiAgICAgICAgaWYgKCEgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih3cmFwcGVyKSB8fCB0aGlzLmlzQWxyZWFkeVJlbmRlcmVkKHdyYXBwZXIsIGZ1bmRpbmdTb3VyY2UsIGhhc0VuYWJsZWRTZXBhcmF0ZUdhdGV3YXlzKSB8fCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIHBheXBhbC5CdXR0b25zICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZ1bmRpbmdTb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnRleHRDb25maWcuZnVuZGluZ1NvdXJjZSA9IGZ1bmRpbmdTb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidG4gPSBwYXlwYWwuQnV0dG9ucyh7XG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIC4uLmNvbnRleHRDb25maWcsXG4gICAgICAgICAgICBvbkNsaWNrOiB0aGlzLm9uU21hcnRCdXR0b25DbGljayxcbiAgICAgICAgICAgIG9uSW5pdDogdGhpcy5vblNtYXJ0QnV0dG9uc0luaXQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWJ0bi5pc0VsaWdpYmxlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ0bi5yZW5kZXIod3JhcHBlcik7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlZFNvdXJjZXMuYWRkKHdyYXBwZXIgKyBmdW5kaW5nU291cmNlID8/ICcnKTtcbiAgICB9XG5cbiAgICBpc0FscmVhZHlSZW5kZXJlZCh3cmFwcGVyLCBmdW5kaW5nU291cmNlLCBoYXNFbmFibGVkU2VwYXJhdGVHYXRld2F5cykge1xuICAgICAgICAvLyBTaW1wbHkgY2hlY2sgdGhhdCBoYXMgY2hpbGQgbm9kZXMgd2hlbiB3ZSBkbyBub3QgbmVlZCB0byByZW5kZXIgYnV0dG9ucyBzZXBhcmF0ZWx5LFxuICAgICAgICAvLyB0aGlzIHdpbGwgcmVkdWNlIHRoZSByaXNrIG9mIGJyZWFraW5nIHdpdGggZGlmZmVyZW50IHRoZW1lcy9wbHVnaW5zXG4gICAgICAgIC8vIGFuZCBvbiB0aGUgY2FydCBwYWdlICh3aGVyZSB3ZSBhbHNvIGRvIG5vdCBuZWVkIHRvIHJlbmRlciBzZXBhcmF0ZWx5KSwgd2hpY2ggbWF5IGZ1bGx5IHJlbG9hZCB0aGlzIHBhcnQgb2YgdGhlIHBhZ2UuXG4gICAgICAgIC8vIElkZWFsbHkgd2Ugc2hvdWxkIGFsc28gZmluZCBhIHdheSB0byBkZXRlY3Qgc3VjaCBmdWxsIHJlbG9hZHMgYW5kIHJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBrZXlzIGZyb20gdGhlIHNldC5cbiAgICAgICAgaWYgKCFoYXNFbmFibGVkU2VwYXJhdGVHYXRld2F5cykge1xuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iod3JhcHBlcikuaGFzQ2hpbGROb2RlcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVkU291cmNlcy5oYXMod3JhcHBlciArIGZ1bmRpbmdTb3VyY2UgPz8gJycpO1xuICAgIH1cblxuICAgIGhpZGVCdXR0b25zKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZG9tRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudCk7XG4gICAgICAgIGlmICghIGRvbUVsZW1lbnQgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZG9tRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzaG93QnV0dG9ucyhlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGRvbUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgICBpZiAoISBkb21FbGVtZW50ICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGRvbUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGRpc2FibGVDcmVkaXRDYXJkRmllbGRzKCkge1xuICAgICAgICB0aGlzLmNyZWRpdENhcmRSZW5kZXJlci5kaXNhYmxlRmllbGRzKCk7XG4gICAgfVxuXG4gICAgZW5hYmxlQ3JlZGl0Q2FyZEZpZWxkcygpIHtcbiAgICAgICAgdGhpcy5jcmVkaXRDYXJkUmVuZGVyZXIuZW5hYmxlRmllbGRzKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBSZW5kZXJlcjtcbiIsImNvbnN0IGRjY0lucHV0RmFjdG9yeSA9IChvcmlnaW5hbCkgPT4ge1xuICAgIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG9yaWdpbmFsKTtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXG4gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgb3JpZ2luYWwuaWQpO1xuICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIG9yaWdpbmFsLmNsYXNzTmFtZSk7XG5cbiAgICBPYmplY3QudmFsdWVzKHN0eWxlcykuZm9yRWFjaCggKHByb3ApID0+IHtcbiAgICAgICAgaWYgKCEgc3R5bGVzW3Byb3BdIHx8ICEgaXNOYU4ocHJvcCkgfHwgcHJvcCA9PT0gJ2JhY2tncm91bmQtaW1hZ2UnICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG5ld0VsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkocHJvcCwnJyArIHN0eWxlc1twcm9wXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRjY0lucHV0RmFjdG9yeTtcbiIsImltcG9ydCBkY2NJbnB1dEZhY3RvcnkgZnJvbSBcIi4uL0hlbHBlci9EY2NJbnB1dEZhY3RvcnlcIjtcbmltcG9ydCB7c2hvd30gZnJvbSBcIi4uL0hlbHBlci9IaWRpbmdcIjtcbmltcG9ydCBQcm9kdWN0IGZyb20gXCIuLi9FbnRpdHkvUHJvZHVjdFwiO1xuXG5jbGFzcyBDcmVkaXRDYXJkUmVuZGVyZXIge1xuXG4gICAgY29uc3RydWN0b3IoZGVmYXVsdENvbmZpZywgZXJyb3JIYW5kbGVyLCBzcGlubmVyKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZyA9IGRlZmF1bHRDb25maWc7XG4gICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyO1xuICAgICAgICB0aGlzLnNwaW5uZXIgPSBzcGlubmVyO1xuICAgICAgICB0aGlzLmNhcmRWYWxpZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZvcm1WYWxpZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmN1cnJlbnRIb3N0ZWRGaWVsZHNJbnN0YW5jZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmVuZGVyKHdyYXBwZXIsIGNvbnRleHRDb25maWcpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZy5jb250ZXh0ICE9PSAnY2hlY2tvdXQnXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5kZWZhdWx0Q29uZmlnLmNvbnRleHQgIT09ICdwYXktbm93J1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgfHwgd3JhcHBlciA9PT0gbnVsbFxuICAgICAgICAgICAgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih3cmFwcGVyKSA9PT0gbnVsbFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgcGF5cGFsLkhvc3RlZEZpZWxkcyA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgIHx8ICEgcGF5cGFsLkhvc3RlZEZpZWxkcy5pc0VsaWdpYmxlKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iod3JhcHBlcik7XG4gICAgICAgICAgICB3cmFwcGVyRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHdyYXBwZXJFbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1dHRvblNlbGVjdG9yID0gd3JhcHBlciArICcgYnV0dG9uJztcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhvc3RlZEZpZWxkc0luc3RhbmNlLnRlYXJkb3duKClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoYEhvc3RlZCBmaWVsZHMgdGVhcmRvd24gZXJyb3I6ICR7ZXJyfWApKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEhvc3RlZEZpZWxkc0luc3RhbmNlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdhdGVXYXlCb3ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGF5bWVudF9ib3gucGF5bWVudF9tZXRob2RfcHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5Jyk7XG4gICAgICAgIGlmKCEgZ2F0ZVdheUJveCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2xkRGlzcGxheVN0eWxlID0gZ2F0ZVdheUJveC5zdHlsZS5kaXNwbGF5O1xuICAgICAgICBnYXRlV2F5Qm94LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgICAgIGNvbnN0IGhpZGVEY2NHYXRld2F5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BwY3AtaGlkZS1kY2MnKTtcbiAgICAgICAgaWYgKGhpZGVEY2NHYXRld2F5KSB7XG4gICAgICAgICAgICBoaWRlRGNjR2F0ZXdheS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGhpZGVEY2NHYXRld2F5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhcmROdW1iZXJGaWVsZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1udW1iZXInKTtcblxuICAgICAgICBjb25zdCBzdHlsZXNSYXcgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjYXJkTnVtYmVyRmllbGQpO1xuICAgICAgICBsZXQgc3R5bGVzID0ge307XG4gICAgICAgIE9iamVjdC52YWx1ZXMoc3R5bGVzUmF3KS5mb3JFYWNoKCAocHJvcCkgPT4ge1xuICAgICAgICAgICAgaWYgKCEgc3R5bGVzUmF3W3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3R5bGVzW3Byb3BdID0gJycgKyBzdHlsZXNSYXdbcHJvcF07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNhcmROdW1iZXIgPSBkY2NJbnB1dEZhY3RvcnkoY2FyZE51bWJlckZpZWxkKTtcbiAgICAgICAgY2FyZE51bWJlckZpZWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGNhcmROdW1iZXIsIGNhcmROdW1iZXJGaWVsZCk7XG5cbiAgICAgICAgY29uc3QgY2FyZEV4cGlyeUZpZWxkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLWV4cGlyeScpO1xuICAgICAgICBjb25zdCBjYXJkRXhwaXJ5ID0gZGNjSW5wdXRGYWN0b3J5KGNhcmRFeHBpcnlGaWVsZCk7XG4gICAgICAgIGNhcmRFeHBpcnlGaWVsZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChjYXJkRXhwaXJ5LCBjYXJkRXhwaXJ5RmllbGQpO1xuXG4gICAgICAgIGNvbnN0IGNhcmRDb2RlRmllbGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtY3ZjJyk7XG4gICAgICAgIGNvbnN0IGNhcmRDb2RlID0gZGNjSW5wdXRGYWN0b3J5KGNhcmRDb2RlRmllbGQpO1xuICAgICAgICBjYXJkQ29kZUZpZWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGNhcmRDb2RlLCBjYXJkQ29kZUZpZWxkKTtcblxuICAgICAgICBnYXRlV2F5Qm94LnN0eWxlLmRpc3BsYXkgPSBvbGREaXNwbGF5U3R5bGU7XG5cbiAgICAgICAgY29uc3QgZm9ybVdyYXBwZXIgPSAnLnBheW1lbnRfYm94IHBheW1lbnRfbWV0aG9kX3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheSc7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZy5lbmZvcmNlX3ZhdWx0XG4gICAgICAgICAgICAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGZvcm1XcmFwcGVyICsgJyAucHBjcC1jcmVkaXQtY2FyZC12YXVsdCcpXG4gICAgICAgICkge1xuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihmb3JtV3JhcHBlciArICcgLnBwY3AtY3JlZGl0LWNhcmQtdmF1bHQnKS5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZm9ybVdyYXBwZXIgKyAnIC5wcGNwLWNyZWRpdC1jYXJkLXZhdWx0Jykuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHBheXBhbC5Ib3N0ZWRGaWVsZHMucmVuZGVyKHtcbiAgICAgICAgICAgIGNyZWF0ZU9yZGVyOiBjb250ZXh0Q29uZmlnLmNyZWF0ZU9yZGVyLFxuICAgICAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgICAgICAgJ2lucHV0Jzogc3R5bGVzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgICAgbnVtYmVyOiB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnI3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLW51bWJlcicsXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLmRlZmF1bHRDb25maWcuaG9zdGVkX2ZpZWxkcy5sYWJlbHMuY3JlZGl0X2NhcmRfbnVtYmVyLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY3Z2OiB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnI3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheS1jYXJkLWN2YycsXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLmRlZmF1bHRDb25maWcuaG9zdGVkX2ZpZWxkcy5sYWJlbHMuY3Z2LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXhwaXJhdGlvbkRhdGU6IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICcjcHBjcC1jcmVkaXQtY2FyZC1nYXRld2F5LWNhcmQtZXhwaXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMuZGVmYXVsdENvbmZpZy5ob3N0ZWRfZmllbGRzLmxhYmVscy5tbV95eSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLnRoZW4oaG9zdGVkRmllbGRzID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiaG9zdGVkX2ZpZWxkc19sb2FkZWRcIikpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2UgPSBob3N0ZWRGaWVsZHM7XG5cbiAgICAgICAgICAgIGhvc3RlZEZpZWxkcy5vbignaW5wdXRTdWJtaXRSZXF1ZXN0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N1Ym1pdChjb250ZXh0Q29uZmlnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaG9zdGVkRmllbGRzLm9uKCdjYXJkVHlwZUNoYW5nZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICggISBldmVudC5jYXJkcy5sZW5ndGggKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FyZFZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRDYXJkcyA9IHRoaXMuZGVmYXVsdENvbmZpZy5ob3N0ZWRfZmllbGRzLnZhbGlkX2NhcmRzO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FyZFZhbGlkID0gdmFsaWRDYXJkcy5pbmRleE9mKGV2ZW50LmNhcmRzWzBdLnR5cGUpICE9PSAtMTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRoaXMuX2NhcmROdW1iZXJGaWxlZENMYXNzTmFtZUJ5Q2FyZFR5cGUoZXZlbnQuY2FyZHNbMF0udHlwZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVjcmVhdGVFbGVtZW50Q2xhc3NBdHRyaWJ1dGUoY2FyZE51bWJlciwgY2FyZE51bWJlckZpZWxkLmNsYXNzTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmZpZWxkcy5udW1iZXIuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXJkTnVtYmVyLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaG9zdGVkRmllbGRzLm9uKCd2YWxpZGl0eUNoYW5nZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1WYWxpZCA9IE9iamVjdC5rZXlzKGV2ZW50LmZpZWxkcykuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQuZmllbGRzW2tleV0uaXNWYWxpZDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRoaXMuX2NhcmROdW1iZXJGaWxlZENMYXNzTmFtZUJ5Q2FyZFR5cGUoZXZlbnQuY2FyZHNbMF0udHlwZSk7XG4gICAgICAgICAgICAgICAgZXZlbnQuZmllbGRzLm51bWJlci5pc1ZhbGlkXG4gICAgICAgICAgICAgICAgICAgID8gY2FyZE51bWJlci5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9yZWNyZWF0ZUVsZW1lbnRDbGFzc0F0dHJpYnV0ZShjYXJkTnVtYmVyLCBjYXJkTnVtYmVyRmllbGQuY2xhc3NOYW1lKTtcblxuICAgICAgICAgICAgICAgdGhpcy5mb3JtVmFsaWQgPSBmb3JtVmFsaWQ7XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzaG93KGJ1dHRvblNlbGVjdG9yKTtcblxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iod3JhcHBlcikuZ2V0QXR0cmlidXRlKCdkYXRhLXBwY3Atc3Vic2NyaWJlZCcpICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihidXR0b25TZWxlY3RvcikuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICAgICAgJ2NsaWNrJyxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N1Ym1pdChjb250ZXh0Q29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHdyYXBwZXIpLnNldEF0dHJpYnV0ZSgnZGF0YS1wcGNwLXN1YnNjcmliZWQnLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3BheW1lbnRfbWV0aG9kX3BwY3AtY3JlZGl0LWNhcmQtZ2F0ZXdheScpLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAnY2xpY2snLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsW2Zvcj1wcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXktY2FyZC1udW1iZXJdJykuY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgIH1cblxuICAgIGRpc2FibGVGaWVsZHMoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRIb3N0ZWRGaWVsZHNJbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2Uuc2V0QXR0cmlidXRlKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ251bWJlcicsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlOiAnZGlzYWJsZWQnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2Uuc2V0QXR0cmlidXRlKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2N2dicsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlOiAnZGlzYWJsZWQnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2Uuc2V0QXR0cmlidXRlKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2V4cGlyYXRpb25EYXRlJyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGU6ICdkaXNhYmxlZCdcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlbmFibGVGaWVsZHMoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRIb3N0ZWRGaWVsZHNJbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2UucmVtb3ZlQXR0cmlidXRlKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ251bWJlcicsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlOiAnZGlzYWJsZWQnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2UucmVtb3ZlQXR0cmlidXRlKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2N2dicsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlOiAnZGlzYWJsZWQnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50SG9zdGVkRmllbGRzSW5zdGFuY2UucmVtb3ZlQXR0cmlidXRlKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2V4cGlyYXRpb25EYXRlJyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGU6ICdkaXNhYmxlZCdcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc3VibWl0KGNvbnRleHRDb25maWcpIHtcbiAgICAgICAgdGhpcy5zcGlubmVyLmJsb2NrKCk7XG4gICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmNsZWFyKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZm9ybVZhbGlkICYmIHRoaXMuY2FyZFZhbGlkKSB7XG4gICAgICAgICAgICBjb25zdCBzYXZlX2NhcmQgPSB0aGlzLmRlZmF1bHRDb25maWcuY2FuX3NhdmVfdmF1bHRfdG9rZW4gPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICBsZXQgdmF1bHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHBjcC1jcmVkaXQtY2FyZC12YXVsdCcpID9cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHBjcC1jcmVkaXQtY2FyZC12YXVsdCcpLmNoZWNrZWQgOiBzYXZlX2NhcmQ7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0Q29uZmlnLmVuZm9yY2VfdmF1bHQpIHtcbiAgICAgICAgICAgICAgICB2YXVsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb250aW5nZW5jeSA9IHRoaXMuZGVmYXVsdENvbmZpZy5ob3N0ZWRfZmllbGRzLmNvbnRpbmdlbmN5O1xuICAgICAgICAgICAgY29uc3QgaG9zdGVkRmllbGRzRGF0YSA9IHtcbiAgICAgICAgICAgICAgICB2YXVsdDogdmF1bHRcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoY29udGluZ2VuY3kgIT09ICdOT18zRF9TRUNVUkUnKSB7XG4gICAgICAgICAgICAgICAgaG9zdGVkRmllbGRzRGF0YS5jb250aW5nZW5jaWVzID0gW2NvbnRpbmdlbmN5XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdENvbmZpZy5wYXllcikge1xuICAgICAgICAgICAgICAgIGhvc3RlZEZpZWxkc0RhdGEuY2FyZGhvbGRlck5hbWUgPSB0aGlzLmRlZmF1bHRDb25maWcucGF5ZXIubmFtZS5naXZlbl9uYW1lICsgJyAnICsgdGhpcy5kZWZhdWx0Q29uZmlnLnBheWVyLm5hbWUuc3VybmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaG9zdGVkRmllbGRzRGF0YS5jYXJkaG9sZGVyTmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0TmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiaWxsaW5nX2ZpcnN0X25hbWUnKSA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiaWxsaW5nX2ZpcnN0X25hbWUnKS52YWx1ZSA6ICcnO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3ROYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JpbGxpbmdfbGFzdF9uYW1lJykgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmlsbGluZ19sYXN0X25hbWUnKS52YWx1ZSA6ICcnO1xuXG4gICAgICAgICAgICAgICAgaG9zdGVkRmllbGRzRGF0YS5jYXJkaG9sZGVyTmFtZSA9IGZpcnN0TmFtZSArICcgJyArIGxhc3ROYW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRIb3N0ZWRGaWVsZHNJbnN0YW5jZS5zdWJtaXQoaG9zdGVkRmllbGRzRGF0YSkudGhlbigocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICAgIHBheWxvYWQub3JkZXJJRCA9IHBheWxvYWQub3JkZXJJZDtcbiAgICAgICAgICAgICAgICB0aGlzLnNwaW5uZXIudW5ibG9jaygpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Q29uZmlnLm9uQXBwcm92ZShwYXlsb2FkKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGlubmVyLnVuYmxvY2soKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5jbGVhcigpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVyci5kZXRhaWxzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLm1lc3NhZ2UoZXJyLmRldGFpbHMubWFwKGQgPT4gYCR7ZC5pc3N1ZX0gJHtkLmRlc2NyaXB0aW9ufWApLmpvaW4oJzxici8+JyksIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zcGlubmVyLnVuYmxvY2soKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAhIHRoaXMuY2FyZFZhbGlkID8gdGhpcy5kZWZhdWx0Q29uZmlnLmhvc3RlZF9maWVsZHMubGFiZWxzLmNhcmRfbm90X3N1cHBvcnRlZCA6IHRoaXMuZGVmYXVsdENvbmZpZy5ob3N0ZWRfZmllbGRzLmxhYmVscy5maWVsZHNfbm90X3ZhbGlkO1xuICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIubWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jYXJkTnVtYmVyRmlsZWRDTGFzc05hbWVCeUNhcmRUeXBlKGNhcmRUeXBlKSB7XG4gICAgICAgIHJldHVybiBjYXJkVHlwZSA9PT0gJ2FtZXJpY2FuLWV4cHJlc3MnID8gJ2FtZXgnIDogY2FyZFR5cGUucmVwbGFjZSgnLScsICcnKTtcbiAgICB9XG5cbiAgICBfcmVjcmVhdGVFbGVtZW50Q2xhc3NBdHRyaWJ1dGUoZWxlbWVudCwgbmV3Q2xhc3NOYW1lKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpXG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIG5ld0NsYXNzTmFtZSk7XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgQ3JlZGl0Q2FyZFJlbmRlcmVyO1xuIiwiY29uc3Qgc3RvcmFnZUtleSA9ICdwcGNwLWRhdGEtY2xpZW50LWlkJztcblxuY29uc3QgdmFsaWRhdGVUb2tlbiA9ICh0b2tlbiwgdXNlcikgPT4ge1xuICAgIGlmICghIHRva2VuKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRva2VuLnVzZXIgIT09IHVzZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIGNvbnN0IGlzRXhwaXJlZCA9IGN1cnJlbnRUaW1lID49IHRva2VuLmV4cGlyYXRpb24gKiAxMDAwO1xuICAgIHJldHVybiAhIGlzRXhwaXJlZDtcbn1cblxuY29uc3Qgc3RvcmVkVG9rZW5Gb3JVc2VyID0gKHVzZXIpID0+IHtcbiAgICBjb25zdCB0b2tlbiA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5KSk7XG4gICAgaWYgKHZhbGlkYXRlVG9rZW4odG9rZW4sIHVzZXIpKSB7XG4gICAgICAgIHJldHVybiB0b2tlbi50b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IHN0b3JlVG9rZW4gPSAodG9rZW4pID0+IHtcbiAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHN0b3JhZ2VLZXksIEpTT04uc3RyaW5naWZ5KHRva2VuKSk7XG59XG5cbmNvbnN0IGRhdGFDbGllbnRJZEF0dHJpYnV0ZUhhbmRsZXIgPSAoc2NyaXB0LCBjb25maWcpID0+IHtcbiAgICBmZXRjaChjb25maWcuZW5kcG9pbnQsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIG5vbmNlOiBjb25maWcubm9uY2VcbiAgICAgICAgfSlcbiAgICB9KS50aGVuKChyZXMpPT57XG4gICAgICAgIHJldHVybiByZXMuanNvbigpO1xuICAgIH0pLnRoZW4oKGRhdGEpPT57XG4gICAgICAgIGNvbnN0IGlzVmFsaWQgPSB2YWxpZGF0ZVRva2VuKGRhdGEsIGNvbmZpZy51c2VyKTtcbiAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmVUb2tlbihkYXRhKTtcbiAgICAgICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgnZGF0YS1jbGllbnQtdG9rZW4nLCBkYXRhLnRva2VuKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoc2NyaXB0KTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGF0YUNsaWVudElkQXR0cmlidXRlSGFuZGxlcjtcbiIsImNsYXNzIE1lc3NhZ2VSZW5kZXJlciB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBpZiAoISB0aGlzLnNob3VsZFJlbmRlcigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwYXlwYWwuTWVzc2FnZXMoe1xuICAgICAgICAgICAgYW1vdW50OiB0aGlzLmNvbmZpZy5hbW91bnQsXG4gICAgICAgICAgICBwbGFjZW1lbnQ6IHRoaXMuY29uZmlnLnBsYWNlbWVudCxcbiAgICAgICAgICAgIHN0eWxlOiB0aGlzLmNvbmZpZy5zdHlsZVxuICAgICAgICB9KS5yZW5kZXIodGhpcy5jb25maWcud3JhcHBlcik7XG5cbiAgICAgICAgalF1ZXJ5KGRvY3VtZW50LmJvZHkpLm9uKCd1cGRhdGVkX2NhcnRfdG90YWxzJywgKCkgPT4ge1xuICAgICAgICAgICAgcGF5cGFsLk1lc3NhZ2VzKHtcbiAgICAgICAgICAgICAgICBhbW91bnQ6IHRoaXMuY29uZmlnLmFtb3VudCxcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ6IHRoaXMuY29uZmlnLnBsYWNlbWVudCxcbiAgICAgICAgICAgICAgICBzdHlsZTogdGhpcy5jb25maWcuc3R5bGVcbiAgICAgICAgICAgIH0pLnJlbmRlcih0aGlzLmNvbmZpZy53cmFwcGVyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVyV2l0aEFtb3VudChhbW91bnQpIHtcblxuICAgICAgICBpZiAoISB0aGlzLnNob3VsZFJlbmRlcigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIG5ld1dyYXBwZXIuc2V0QXR0cmlidXRlKCdpZCcsIHRoaXMuY29uZmlnLndyYXBwZXIucmVwbGFjZSgnIycsICcnKSk7XG5cbiAgICAgICAgY29uc3Qgc2libGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5jb25maWcud3JhcHBlcikubmV4dFNpYmxpbmc7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5jb25maWcud3JhcHBlcikucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuY29uZmlnLndyYXBwZXIpKTtcbiAgICAgICAgc2libGluZy5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShuZXdXcmFwcGVyLCBzaWJsaW5nKTtcbiAgICAgICAgcGF5cGFsLk1lc3NhZ2VzKHtcbiAgICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICAgIHBsYWNlbWVudDogdGhpcy5jb25maWcucGxhY2VtZW50LFxuICAgICAgICAgICAgc3R5bGU6IHRoaXMuY29uZmlnLnN0eWxlXG4gICAgICAgIH0pLnJlbmRlcih0aGlzLmNvbmZpZy53cmFwcGVyKTtcbiAgICB9XG5cbiAgICBzaG91bGRSZW5kZXIoKSB7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlwYWwuTWVzc2FnZXMgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB0aGlzLmNvbmZpZy53cmFwcGVyID09PSAndW5kZWZpbmVkJyApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuY29uZmlnLndyYXBwZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaGlkZU1lc3NhZ2VzKCkge1xuICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmNvbmZpZy53cmFwcGVyKTtcbiAgICAgICAgaWYgKCEgZG9tRWxlbWVudCApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBkb21FbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IE1lc3NhZ2VSZW5kZXJlcjtcbiIsImNsYXNzIFNwaW5uZXIge1xuXG4gICAgY29uc3RydWN0b3IodGFyZ2V0ID0gJ2Zvcm0ud29vY29tbWVyY2UtY2hlY2tvdXQnKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIH1cblxuICAgIHNldFRhcmdldCh0YXJnZXQpIHtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgfVxuXG4gICAgYmxvY2soKSB7XG5cbiAgICAgICAgalF1ZXJ5KCB0aGlzLnRhcmdldCApLmJsb2NrKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IG51bGwsXG4gICAgICAgICAgICBvdmVybGF5Q1NTOiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJyNmZmYnLFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNlxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1bmJsb2NrKCkge1xuXG4gICAgICAgIGpRdWVyeSggdGhpcy50YXJnZXQgKS51bmJsb2NrKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTcGlubmVyO1xuIiwiaW1wb3J0IHtQYXltZW50TWV0aG9kc30gZnJvbSBcIi4uL0hlbHBlci9DaGVja291dE1ldGhvZFN0YXRlXCI7XG5pbXBvcnQgZXJyb3JIYW5kbGVyIGZyb20gXCIuLi9FcnJvckhhbmRsZXJcIjtcblxuY2xhc3MgRnJlZVRyaWFsSGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgc3Bpbm5lcixcbiAgICAgICAgZXJyb3JIYW5kbGVyXG4gICAgKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLnNwaW5uZXIgPSBzcGlubmVyO1xuICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcjtcbiAgICB9XG5cbiAgICBoYW5kbGUoKVxuICAgIHtcbiAgICAgICAgdGhpcy5zcGlubmVyLmJsb2NrKCk7XG5cbiAgICAgICAgZmV0Y2godGhpcy5jb25maWcuYWpheC52YXVsdF9wYXlwYWwuZW5kcG9pbnQsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIG5vbmNlOiB0aGlzLmNvbmZpZy5hamF4LnZhdWx0X3BheXBhbC5ub25jZSxcbiAgICAgICAgICAgICAgICByZXR1cm5fdXJsOiBsb2NhdGlvbi5ocmVmXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSkudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7XG4gICAgICAgIH0pLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3Bpbm5lci51bmJsb2NrKCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihkYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5tZXNzYWdlKGRhdGEuZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihkYXRhLmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBkYXRhLmRhdGEuYXBwcm92ZV9saW5rO1xuICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLnNwaW5uZXIudW5ibG9jaygpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5nZW5lcmljRXJyb3IoKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgRnJlZVRyaWFsSGFuZGxlcjtcbiIsImltcG9ydCBNaW5pQ2FydEJvb3RzdGFwIGZyb20gJy4vbW9kdWxlcy9Db250ZXh0Qm9vdHN0cmFwL01pbmlDYXJ0Qm9vdHN0YXAnO1xuaW1wb3J0IFNpbmdsZVByb2R1Y3RCb290c3RhcCBmcm9tICcuL21vZHVsZXMvQ29udGV4dEJvb3RzdHJhcC9TaW5nbGVQcm9kdWN0Qm9vdHN0YXAnO1xuaW1wb3J0IENhcnRCb290c3RyYXAgZnJvbSAnLi9tb2R1bGVzL0NvbnRleHRCb290c3RyYXAvQ2FydEJvb3RzdGFwJztcbmltcG9ydCBDaGVja291dEJvb3RzdGFwIGZyb20gJy4vbW9kdWxlcy9Db250ZXh0Qm9vdHN0cmFwL0NoZWNrb3V0Qm9vdHN0YXAnO1xuaW1wb3J0IFBheU5vd0Jvb3RzdHJhcCBmcm9tIFwiLi9tb2R1bGVzL0NvbnRleHRCb290c3RyYXAvUGF5Tm93Qm9vdHN0cmFwXCI7XG5pbXBvcnQgUmVuZGVyZXIgZnJvbSAnLi9tb2R1bGVzL1JlbmRlcmVyL1JlbmRlcmVyJztcbmltcG9ydCBFcnJvckhhbmRsZXIgZnJvbSAnLi9tb2R1bGVzL0Vycm9ySGFuZGxlcic7XG5pbXBvcnQgQ3JlZGl0Q2FyZFJlbmRlcmVyIGZyb20gXCIuL21vZHVsZXMvUmVuZGVyZXIvQ3JlZGl0Q2FyZFJlbmRlcmVyXCI7XG5pbXBvcnQgZGF0YUNsaWVudElkQXR0cmlidXRlSGFuZGxlciBmcm9tIFwiLi9tb2R1bGVzL0RhdGFDbGllbnRJZEF0dHJpYnV0ZUhhbmRsZXJcIjtcbmltcG9ydCBNZXNzYWdlUmVuZGVyZXIgZnJvbSBcIi4vbW9kdWxlcy9SZW5kZXJlci9NZXNzYWdlUmVuZGVyZXJcIjtcbmltcG9ydCBTcGlubmVyIGZyb20gXCIuL21vZHVsZXMvSGVscGVyL1NwaW5uZXJcIjtcbmltcG9ydCB7XG4gICAgZ2V0Q3VycmVudFBheW1lbnRNZXRob2QsXG4gICAgT1JERVJfQlVUVE9OX1NFTEVDVE9SLFxuICAgIFBheW1lbnRNZXRob2RzXG59IGZyb20gXCIuL21vZHVsZXMvSGVscGVyL0NoZWNrb3V0TWV0aG9kU3RhdGVcIjtcbmltcG9ydCB7aGlkZSwgc2V0VmlzaWJsZX0gZnJvbSBcIi4vbW9kdWxlcy9IZWxwZXIvSGlkaW5nXCI7XG5pbXBvcnQge2lzQ2hhbmdlUGF5bWVudFBhZ2V9IGZyb20gXCIuL21vZHVsZXMvSGVscGVyL1N1YnNjcmlwdGlvbnNcIjtcbmltcG9ydCBGcmVlVHJpYWxIYW5kbGVyIGZyb20gXCIuL21vZHVsZXMvQWN0aW9uSGFuZGxlci9GcmVlVHJpYWxIYW5kbGVyXCI7XG5cbi8vIFRPRE86IGNvdWxkIGJlIGEgZ29vZCBpZGVhIHRvIGhhdmUgYSBzZXBhcmF0ZSBzcGlubmVyIGZvciBlYWNoIGdhdGV3YXksXG4vLyBidXQgSSB0aGluayB3ZSBjYXJlIG1haW5seSBhYm91dCB0aGUgc2NyaXB0IGxvYWRpbmcsIHNvIG9uZSBzcGlubmVyIHNob3VsZCBiZSBlbm91Z2guXG5jb25zdCBidXR0b25zU3Bpbm5lciA9IG5ldyBTcGlubmVyKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wcGMtYnV0dG9uLXdyYXBwZXInKSk7XG5jb25zdCBjYXJkc1NwaW5uZXIgPSBuZXcgU3Bpbm5lcignI3BwY3AtaG9zdGVkLWZpZWxkcycpO1xuXG5jb25zdCBib290c3RyYXAgPSAoKSA9PiB7XG4gICAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcihQYXlQYWxDb21tZXJjZUdhdGV3YXkubGFiZWxzLmVycm9yLmdlbmVyaWMpO1xuICAgIGNvbnN0IHNwaW5uZXIgPSBuZXcgU3Bpbm5lcigpO1xuICAgIGNvbnN0IGNyZWRpdENhcmRSZW5kZXJlciA9IG5ldyBDcmVkaXRDYXJkUmVuZGVyZXIoUGF5UGFsQ29tbWVyY2VHYXRld2F5LCBlcnJvckhhbmRsZXIsIHNwaW5uZXIpO1xuXG4gICAgY29uc3QgZnJlZVRyaWFsSGFuZGxlciA9IG5ldyBGcmVlVHJpYWxIYW5kbGVyKFBheVBhbENvbW1lcmNlR2F0ZXdheSwgc3Bpbm5lciwgZXJyb3JIYW5kbGVyKTtcblxuICAgIGNvbnN0IG9uU21hcnRCdXR0b25DbGljayA9IChkYXRhLCBhY3Rpb25zKSA9PiB7XG4gICAgICAgIHdpbmRvdy5wcGNwRnVuZGluZ1NvdXJjZSA9IGRhdGEuZnVuZGluZ1NvdXJjZTtcblxuICAgICAgICBpZiAoUGF5UGFsQ29tbWVyY2VHYXRld2F5LmJhc2ljX2NoZWNrb3V0X3ZhbGlkYXRpb25fZW5hYmxlZCkge1xuICAgICAgICAgICAgLy8gVE9ETzogcXVpY2sgZml4IHRvIGdldCB0aGUgZXJyb3IgYWJvdXQgZW1wdHkgZm9ybSBiZWZvcmUgYXR0ZW1wdGluZyBQYXlQYWwgb3JkZXJcbiAgICAgICAgICAgIC8vIGl0IHNob3VsZCBzb2x2ZSAjNTEzIGZvciBtb3N0IG9mIHRoZSB1c2VycywgYnV0IHByb3BlciBzb2x1dGlvbiBzaG91bGQgYmUgaW1wbGVtZW50ZWQgbGF0ZXIuXG4gICAgICAgICAgICBjb25zdCByZXF1aXJlZEZpZWxkcyA9IGpRdWVyeSgnZm9ybS53b29jb21tZXJjZS1jaGVja291dCAudmFsaWRhdGUtcmVxdWlyZWQ6dmlzaWJsZSA6aW5wdXQnKTtcbiAgICAgICAgICAgIHJlcXVpcmVkRmllbGRzLmVhY2goKGksIGlucHV0KSA9PiB7XG4gICAgICAgICAgICAgICAgalF1ZXJ5KGlucHV0KS50cmlnZ2VyKCd2YWxpZGF0ZScpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpbnZhbGlkRmllbGRzID0gQXJyYXkuZnJvbShqUXVlcnkoJ2Zvcm0ud29vY29tbWVyY2UtY2hlY2tvdXQgLnZhbGlkYXRlLXJlcXVpcmVkLndvb2NvbW1lcmNlLWludmFsaWQ6dmlzaWJsZScpKTtcbiAgICAgICAgICAgIGlmIChpbnZhbGlkRmllbGRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJpbGxpbmdGaWVsZHNDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud29vY29tbWVyY2UtYmlsbGluZy1maWVsZHMnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaGlwcGluZ0ZpZWxkc0NvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy53b29jb21tZXJjZS1zaGlwcGluZy1maWVsZHMnKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVNZXNzYWdlTWFwID0gUGF5UGFsQ29tbWVyY2VHYXRld2F5LmxhYmVscy5lcnJvci5yZXF1aXJlZC5lbGVtZW50cztcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGludmFsaWRGaWVsZHMubWFwKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lXScpPy5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgJiYgbmFtZSBpbiBuYW1lTWVzc2FnZU1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVNZXNzYWdlTWFwW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsJykudGV4dENvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCcqJywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmlsbGluZ0ZpZWxkc0NvbnRhaW5lcj8uY29udGFpbnMoZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IFBheVBhbENvbW1lcmNlR2F0ZXdheS5sYWJlbHMuYmlsbGluZ19maWVsZC5yZXBsYWNlKCclcycsIGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hpcHBpbmdGaWVsZHNDb250YWluZXI/LmNvbnRhaW5zKGVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBQYXlQYWxDb21tZXJjZUdhdGV3YXkubGFiZWxzLnNoaXBwaW5nX2ZpZWxkLnJlcGxhY2UoJyVzJywgbGFiZWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXlQYWxDb21tZXJjZUdhdGV3YXkubGFiZWxzLmVycm9yLnJlcXVpcmVkLmZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgnJXMnLCBgPHN0cm9uZz4ke2xhYmVsfTwvc3Ryb25nPmApXG4gICAgICAgICAgICAgICAgfSkuZmlsdGVyKHMgPT4gcy5sZW5ndGggPiAyKTtcblxuICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlci5jbGVhcigpO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm1lc3NhZ2VzKG1lc3NhZ2VzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIubWVzc2FnZShQYXlQYWxDb21tZXJjZUdhdGV3YXkubGFiZWxzLmVycm9yLnJlcXVpcmVkLmdlbmVyaWMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb25zLnJlamVjdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0ud29vY29tbWVyY2UtY2hlY2tvdXQnKTtcbiAgICAgICAgaWYgKGZvcm0pIHtcbiAgICAgICAgICAgIGpRdWVyeSgnI3BwY3AtZnVuZGluZy1zb3VyY2UtZm9ybS1pbnB1dCcpLnJlbW92ZSgpO1xuICAgICAgICAgICAgZm9ybS5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgICAgICAgICAgICAgJ2JlZm9yZWVuZCcsXG4gICAgICAgICAgICAgICAgYDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cInBwY3AtZnVuZGluZy1zb3VyY2VcIiB2YWx1ZT1cIiR7ZGF0YS5mdW5kaW5nU291cmNlfVwiIGlkPVwicHBjcC1mdW5kaW5nLXNvdXJjZS1mb3JtLWlucHV0XCI+YFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNGcmVlVHJpYWwgPSBQYXlQYWxDb21tZXJjZUdhdGV3YXkuaXNfZnJlZV90cmlhbF9jYXJ0O1xuICAgICAgICBpZiAoaXNGcmVlVHJpYWwgJiYgZGF0YS5mdW5kaW5nU291cmNlICE9PSAnY2FyZCcpIHtcbiAgICAgICAgICAgIGZyZWVUcmlhbEhhbmRsZXIuaGFuZGxlKCk7XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9ucy5yZWplY3QoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgb25TbWFydEJ1dHRvbnNJbml0ID0gKCkgPT4ge1xuICAgICAgICBidXR0b25zU3Bpbm5lci51bmJsb2NrKCk7XG4gICAgfTtcbiAgICBjb25zdCByZW5kZXJlciA9IG5ldyBSZW5kZXJlcihjcmVkaXRDYXJkUmVuZGVyZXIsIFBheVBhbENvbW1lcmNlR2F0ZXdheSwgb25TbWFydEJ1dHRvbkNsaWNrLCBvblNtYXJ0QnV0dG9uc0luaXQpO1xuICAgIGNvbnN0IG1lc3NhZ2VSZW5kZXJlciA9IG5ldyBNZXNzYWdlUmVuZGVyZXIoUGF5UGFsQ29tbWVyY2VHYXRld2F5Lm1lc3NhZ2VzKTtcbiAgICBjb25zdCBjb250ZXh0ID0gUGF5UGFsQ29tbWVyY2VHYXRld2F5LmNvbnRleHQ7XG4gICAgaWYgKGNvbnRleHQgPT09ICdtaW5pLWNhcnQnIHx8IGNvbnRleHQgPT09ICdwcm9kdWN0Jykge1xuICAgICAgICBpZiAoUGF5UGFsQ29tbWVyY2VHYXRld2F5Lm1pbmlfY2FydF9idXR0b25zX2VuYWJsZWQgPT09ICcxJykge1xuICAgICAgICAgICAgY29uc3QgbWluaUNhcnRCb290c3RyYXAgPSBuZXcgTWluaUNhcnRCb290c3RhcChcbiAgICAgICAgICAgICAgICBQYXlQYWxDb21tZXJjZUdhdGV3YXksXG4gICAgICAgICAgICAgICAgcmVuZGVyZXJcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIG1pbmlDYXJ0Qm9vdHN0cmFwLmluaXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb250ZXh0ID09PSAncHJvZHVjdCcgJiYgUGF5UGFsQ29tbWVyY2VHYXRld2F5LnNpbmdsZV9wcm9kdWN0X2J1dHRvbnNfZW5hYmxlZCA9PT0gJzEnKSB7XG4gICAgICAgIGNvbnN0IHNpbmdsZVByb2R1Y3RCb290c3RyYXAgPSBuZXcgU2luZ2xlUHJvZHVjdEJvb3RzdGFwKFxuICAgICAgICAgICAgUGF5UGFsQ29tbWVyY2VHYXRld2F5LFxuICAgICAgICAgICAgcmVuZGVyZXIsXG4gICAgICAgICAgICBtZXNzYWdlUmVuZGVyZXIsXG4gICAgICAgICk7XG5cbiAgICAgICAgc2luZ2xlUHJvZHVjdEJvb3RzdHJhcC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgPT09ICdjYXJ0Jykge1xuICAgICAgICBjb25zdCBjYXJ0Qm9vdHN0cmFwID0gbmV3IENhcnRCb290c3RyYXAoXG4gICAgICAgICAgICBQYXlQYWxDb21tZXJjZUdhdGV3YXksXG4gICAgICAgICAgICByZW5kZXJlcixcbiAgICAgICAgKTtcblxuICAgICAgICBjYXJ0Qm9vdHN0cmFwLmluaXQoKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGV4dCA9PT0gJ2NoZWNrb3V0Jykge1xuICAgICAgICBjb25zdCBjaGVja291dEJvb3RzdGFwID0gbmV3IENoZWNrb3V0Qm9vdHN0YXAoXG4gICAgICAgICAgICBQYXlQYWxDb21tZXJjZUdhdGV3YXksXG4gICAgICAgICAgICByZW5kZXJlcixcbiAgICAgICAgICAgIG1lc3NhZ2VSZW5kZXJlcixcbiAgICAgICAgICAgIHNwaW5uZXJcbiAgICAgICAgKTtcblxuICAgICAgICBjaGVja291dEJvb3RzdGFwLmluaXQoKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGV4dCA9PT0gJ3BheS1ub3cnICkge1xuICAgICAgICBjb25zdCBwYXlOb3dCb290c3RyYXAgPSBuZXcgUGF5Tm93Qm9vdHN0cmFwKFxuICAgICAgICAgICAgUGF5UGFsQ29tbWVyY2VHYXRld2F5LFxuICAgICAgICAgICAgcmVuZGVyZXIsXG4gICAgICAgICAgICBtZXNzYWdlUmVuZGVyZXIsXG4gICAgICAgICAgICBzcGlubmVyXG4gICAgICAgICk7XG4gICAgICAgIHBheU5vd0Jvb3RzdHJhcC5pbml0KCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgIT09ICdjaGVja291dCcpIHtcbiAgICAgICAgbWVzc2FnZVJlbmRlcmVyLnJlbmRlcigpO1xuICAgIH1cbn07XG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICdET01Db250ZW50TG9hZGVkJyxcbiAgICAoKSA9PiB7XG4gICAgICAgIGlmICghdHlwZW9mIChQYXlQYWxDb21tZXJjZUdhdGV3YXkpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdQYXlQYWwgYnV0dG9uIGNvdWxkIG5vdCBiZSBjb25maWd1cmVkLicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgUGF5UGFsQ29tbWVyY2VHYXRld2F5LmNvbnRleHQgIT09ICdjaGVja291dCdcbiAgICAgICAgICAgICYmIFBheVBhbENvbW1lcmNlR2F0ZXdheS5kYXRhX2NsaWVudF9pZC51c2VyID09PSAwXG4gICAgICAgICAgICAmJiBQYXlQYWxDb21tZXJjZUdhdGV3YXkuZGF0YV9jbGllbnRfaWQuaGFzX3N1YnNjcmlwdGlvbnNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXlwYWxCdXR0b25HYXRld2F5SWRzID0gW1xuICAgICAgICAgICAgUGF5bWVudE1ldGhvZHMuUEFZUEFMLFxuICAgICAgICAgICAgLi4uT2JqZWN0LmVudHJpZXMoUGF5UGFsQ29tbWVyY2VHYXRld2F5LnNlcGFyYXRlX2J1dHRvbnMpLm1hcCgoW2ssIGRhdGFdKSA9PiBkYXRhLmlkKSxcbiAgICAgICAgXVxuXG4gICAgICAgIC8vIFNvbWV0aW1lcyBQYXlQYWwgc2NyaXB0IHRha2VzIGxvbmcgdGltZSB0byBsb2FkLFxuICAgICAgICAvLyBzbyB3ZSBhZGRpdGlvbmFsbHkgaGlkZSB0aGUgc3RhbmRhcmQgb3JkZXIgYnV0dG9uIGhlcmUgdG8gYXZvaWQgZmFpbGVkIG9yZGVycy5cbiAgICAgICAgLy8gTm9ybWFsbHkgaXQgaXMgaGlkZGVuIGxhdGVyIGFmdGVyIHRoZSBzY3JpcHQgbG9hZC5cbiAgICAgICAgY29uc3QgaGlkZU9yZGVyQnV0dG9uSWZQcGNwR2F0ZXdheSA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIG9ubHkgaW4gY2hlY2tvdXQgYW5kIHBheSBub3cgcGFnZSwgb3RoZXJ3aXNlIGl0IG1heSBicmVhayB0aGluZ3MgKGUuZy4gcGF5bWVudCB2aWEgcHJvZHVjdCBwYWdlKSxcbiAgICAgICAgICAgIC8vIGFuZCBhbHNvIHRoZSBsb2FkaW5nIHNwaW5uZXIgbWF5IGxvb2sgd2VpcmQgb24gb3RoZXIgcGFnZXNcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhWydjaGVja291dCcsICdwYXktbm93J10uaW5jbHVkZXMoUGF5UGFsQ29tbWVyY2VHYXRld2F5LmNvbnRleHQpXG4gICAgICAgICAgICAgICAgfHwgaXNDaGFuZ2VQYXltZW50UGFnZSgpXG4gICAgICAgICAgICAgICAgfHwgKFBheVBhbENvbW1lcmNlR2F0ZXdheS5pc19mcmVlX3RyaWFsX2NhcnQgJiYgUGF5UGFsQ29tbWVyY2VHYXRld2F5LnZhdWx0ZWRfcGF5cGFsX2VtYWlsICE9PSAnJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY3VycmVudFBheW1lbnRNZXRob2QgPSBnZXRDdXJyZW50UGF5bWVudE1ldGhvZCgpO1xuICAgICAgICAgICAgY29uc3QgaXNQYXlwYWxCdXR0b24gPSBwYXlwYWxCdXR0b25HYXRld2F5SWRzLmluY2x1ZGVzKGN1cnJlbnRQYXltZW50TWV0aG9kKTtcbiAgICAgICAgICAgIGNvbnN0IGlzQ2FyZHMgPSBjdXJyZW50UGF5bWVudE1ldGhvZCA9PT0gUGF5bWVudE1ldGhvZHMuQ0FSRFM7XG5cbiAgICAgICAgICAgIHNldFZpc2libGUoT1JERVJfQlVUVE9OX1NFTEVDVE9SLCAhaXNQYXlwYWxCdXR0b24gJiYgIWlzQ2FyZHMsIHRydWUpO1xuXG4gICAgICAgICAgICBpZiAoaXNQYXlwYWxCdXR0b24pIHtcbiAgICAgICAgICAgICAgICAvLyBzdG9wcGVkIGFmdGVyIHRoZSBmaXJzdCByZW5kZXJpbmcgb2YgdGhlIGJ1dHRvbnMsIGluIG9uSW5pdFxuICAgICAgICAgICAgICAgIGJ1dHRvbnNTcGlubmVyLmJsb2NrKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ1dHRvbnNTcGlubmVyLnVuYmxvY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzQ2FyZHMpIHtcbiAgICAgICAgICAgICAgICBjYXJkc1NwaW5uZXIuYmxvY2soKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FyZHNTcGlubmVyLnVuYmxvY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGpRdWVyeShkb2N1bWVudCkub24oJ2hvc3RlZF9maWVsZHNfbG9hZGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgY2FyZHNTcGlubmVyLnVuYmxvY2soKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IGJvb3RzdHJhcHBlZCA9IGZhbHNlO1xuXG4gICAgICAgIGhpZGVPcmRlckJ1dHRvbklmUHBjcEdhdGV3YXkoKTtcblxuICAgICAgICBqUXVlcnkoZG9jdW1lbnQuYm9keSkub24oJ3VwZGF0ZWRfY2hlY2tvdXQgcGF5bWVudF9tZXRob2Rfc2VsZWN0ZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoYm9vdHN0cmFwcGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBoaWRlT3JkZXJCdXR0b25JZlBwY3BHYXRld2F5KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICBzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgYm9vdHN0cmFwcGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgYm9vdHN0cmFwKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCdzcmMnLCBQYXlQYWxDb21tZXJjZUdhdGV3YXkuYnV0dG9uLnVybCk7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKFBheVBhbENvbW1lcmNlR2F0ZXdheS5zY3JpcHRfYXR0cmlidXRlcykuZm9yRWFjaChcbiAgICAgICAgICAgIChrZXlWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoa2V5VmFsdWVbMF0sIGtleVZhbHVlWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoUGF5UGFsQ29tbWVyY2VHYXRld2F5LmRhdGFfY2xpZW50X2lkLnNldF9hdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIGRhdGFDbGllbnRJZEF0dHJpYnV0ZUhhbmRsZXIoc2NyaXB0LCBQYXlQYWxDb21tZXJjZUdhdGV3YXkuZGF0YV9jbGllbnRfaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoc2NyaXB0KTtcbiAgICB9LFxuKTtcbiJdLCJuYW1lcyI6WyJFcnJvckhhbmRsZXIiLCJjb25zdHJ1Y3RvciIsImdlbmVyaWNFcnJvclRleHQiLCJ3cmFwcGVyIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwibWVzc2FnZXNMaXN0IiwiZ2VuZXJpY0Vycm9yIiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJjbGVhciIsIm1lc3NhZ2UiLCJhcHBlbmRQcmVwYXJlZEVycm9yTWVzc2FnZUVsZW1lbnQiLCJlcnJvck1lc3NhZ2VFbGVtZW50IiwiX3ByZXBhcmVNZXNzYWdlc0xpc3QiLCJyZXBsYWNlV2l0aCIsInRleHQiLCJwZXJzaXN0IiwiX2FkZE1lc3NhZ2UiLCJfc2Nyb2xsVG9NZXNzYWdlcyIsIm1lc3NhZ2VzIiwidGV4dHMiLCJmb3JFYWNoIiwidCIsIlN0cmluZyIsImxlbmd0aCIsIkVycm9yIiwiYWRkIiwicmVtb3ZlIiwibWVzc2FnZU5vZGUiLCJfcHJlcGFyZU1lc3NhZ2VzTGlzdEl0ZW0iLCJhcHBlbmRDaGlsZCIsImpRdWVyeSIsInNjcm9sbF90b19ub3RpY2VzIiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsImxpIiwiaW5uZXJIVE1MIiwib25BcHByb3ZlIiwiY29udGV4dCIsImVycm9ySGFuZGxlciIsImRhdGEiLCJhY3Rpb25zIiwiZmV0Y2giLCJjb25maWciLCJhamF4IiwiYXBwcm92ZV9vcmRlciIsImVuZHBvaW50IiwibWV0aG9kIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJub25jZSIsIm9yZGVyX2lkIiwib3JkZXJJRCIsImZ1bmRpbmdfc291cmNlIiwid2luZG93IiwicHBjcEZ1bmRpbmdTb3VyY2UiLCJ0aGVuIiwicmVzIiwianNvbiIsInN1Y2Nlc3MiLCJyZXN0YXJ0IiwiY2F0Y2giLCJlcnIiLCJsb2NhdGlvbiIsImhyZWYiLCJyZWRpcmVjdCIsInBheWVyRGF0YSIsInBheWVyIiwiUGF5UGFsQ29tbWVyY2VHYXRld2F5IiwicGhvbmUiLCJwaG9uZV90eXBlIiwicGhvbmVfbnVtYmVyIiwibmF0aW9uYWxfbnVtYmVyIiwidmFsdWUiLCJlbWFpbF9hZGRyZXNzIiwibmFtZSIsInN1cm5hbWUiLCJnaXZlbl9uYW1lIiwiYWRkcmVzcyIsImNvdW50cnlfY29kZSIsImFkZHJlc3NfbGluZV8xIiwiYWRkcmVzc19saW5lXzIiLCJhZG1pbl9hcmVhXzEiLCJhZG1pbl9hcmVhXzIiLCJwb3N0YWxfY29kZSIsIlBheW1lbnRNZXRob2RzIiwiUEFZUEFMIiwiQ0FSRFMiLCJPWFhPIiwiQ0FSRF9CVVRUT04iLCJPUkRFUl9CVVRUT05fU0VMRUNUT1IiLCJnZXRDdXJyZW50UGF5bWVudE1ldGhvZCIsImVsIiwiaXNTYXZlZENhcmRTZWxlY3RlZCIsInNhdmVkQ2FyZExpc3QiLCJDYXJ0QWN0aW9uSGFuZGxlciIsImNvbmZpZ3VyYXRpb24iLCJjcmVhdGVPcmRlciIsImJuQ29kZSIsImJuX2NvZGVzIiwiY3JlYXRlX29yZGVyIiwicHVyY2hhc2VfdW5pdHMiLCJwYXltZW50X21ldGhvZCIsImJuX2NvZGUiLCJjb25zb2xlIiwiZXJyb3IiLCJpZCIsIm9uRXJyb3IiLCJNaW5pQ2FydEJvb3RzdGFwIiwiZ2F0ZXdheSIsInJlbmRlcmVyIiwiYWN0aW9uSGFuZGxlciIsImluaXQiLCJsYWJlbHMiLCJnZW5lcmljIiwicmVuZGVyIiwib24iLCJzaG91bGRSZW5kZXIiLCJidXR0b24iLCJtaW5pX2NhcnRfd3JhcHBlciIsImhvc3RlZF9maWVsZHMiLCJzdHlsZSIsIm1pbmlfY2FydF9zdHlsZSIsIlByb2R1Y3QiLCJVcGRhdGVDYXJ0IiwidXBkYXRlIiwib25SZXNvbHZlIiwicHJvZHVjdHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInJlc3VsdCIsInJlc29sdmVkIiwiQnV0dG9uc1RvZ2dsZUxpc3RlbmVyIiwiZWxlbWVudCIsInNob3dDYWxsYmFjayIsImhpZGVDYWxsYmFjayIsIm9ic2VydmVyIiwiYXR0cmlidXRlcyIsImNhbGxiYWNrIiwiTXV0YXRpb25PYnNlcnZlciIsIm9ic2VydmUiLCJkaXNjb25uZWN0IiwicXVhbnRpdHkiLCJ2YXJpYXRpb25zIiwiU2luZ2xlUHJvZHVjdEFjdGlvbkhhbmRsZXIiLCJ1cGRhdGVDYXJ0Iiwic2hvd0J1dHRvbkNhbGxiYWNrIiwiaGlkZUJ1dHRvbkNhbGxiYWNrIiwiZm9ybUVsZW1lbnQiLCJoYXNWYXJpYXRpb25zIiwiZ2V0UHJvZHVjdHMiLCJpc0dyb3VwZWRQcm9kdWN0IiwicXR5IiwicXVlcnlTZWxlY3RvckFsbCIsImVsZW1lbnROYW1lIiwiZ2V0QXR0cmlidXRlIiwibWF0Y2giLCJwYXJzZUludCIsInB1c2giLCJwcm9taXNlIiwibWFwIiwiU2luZ2xlUHJvZHVjdEJvb3RzdGFwIiwiaGFuZGxlQ2hhbmdlIiwiaGlkZUJ1dHRvbnMiLCJoaWRlTWVzc2FnZXMiLCJhZGRFdmVudExpc3RlbmVyIiwiYmluZCIsInByaWNlQW1vdW50SXNaZXJvIiwicHJpY2VBbW91bnQiLCJwcmljZVRleHQiLCJpbm5lclRleHQiLCJyZXBsYWNlIiwicGFyc2VGbG9hdCIsImNoYW5nZV9jYXJ0Iiwic2hvd0J1dHRvbnMiLCJyZW5kZXJXaXRoQW1vdW50IiwiQ2FydEJvb3RzdHJhcCIsInNwaW5uZXIiLCJibG9jayIsInVuYmxvY2siLCJjb2RlIiwiY2xpY2siLCJDaGVja291dEFjdGlvbkhhbmRsZXIiLCJmb3JtU2VsZWN0b3IiLCJmb3JtRGF0YSIsIkZvcm1EYXRhIiwiZm9ybUpzb25PYmoiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsImNyZWF0ZWFjY291bnQiLCJpcyIsInBheW1lbnRNZXRob2QiLCJmdW5kaW5nU291cmNlIiwiZm9ybSIsImRvbVBhcnNlciIsIkRPTVBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsImRldGFpbHMiLCJkIiwiaXNzdWUiLCJkZXNjcmlwdGlvbiIsImpvaW4iLCJpbnB1dCIsImN1c3RvbV9pZCIsImFwcGVuZCIsIm9uQ2FuY2VsIiwiZ2V0RWxlbWVudCIsInNlbGVjdG9yT3JFbGVtZW50IiwiaXNWaXNpYmxlIiwib2Zmc2V0V2lkdGgiLCJvZmZzZXRIZWlnaHQiLCJnZXRDbGllbnRSZWN0cyIsInNldFZpc2libGUiLCJzaG93IiwiaW1wb3J0YW50IiwiY3VycmVudFZhbHVlIiwiZ2V0UHJvcGVydHlWYWx1ZSIsInNldFByb3BlcnR5IiwicmVtb3ZlUHJvcGVydHkiLCJoaWRlIiwiQ2hlY2tvdXRCb290c3RhcCIsInN0YW5kYXJkT3JkZXJCdXR0b25TZWxlY3RvciIsImJ1dHRvbkNoYW5nZU9ic2VydmVyIiwidXBkYXRlVWkiLCJ2YWwiLCJjYW5jZWxfd3JhcHBlciIsImN1cnJlbnRQYXltZW50TWV0aG9kIiwiaXNQYXlwYWwiLCJpc0NhcmQiLCJpc1NlcGFyYXRlQnV0dG9uR2F0ZXdheSIsImluY2x1ZGVzIiwiaXNTYXZlZENhcmQiLCJpc05vdE91ckdhdGV3YXkiLCJpc0ZyZWVUcmlhbCIsImlzX2ZyZWVfdHJpYWxfY2FydCIsImhhc1ZhdWx0ZWRQYXlwYWwiLCJ2YXVsdGVkX3BheXBhbF9lbWFpbCIsInBheXBhbEJ1dHRvbldyYXBwZXJzIiwiZW50cmllcyIsInNlcGFyYXRlX2J1dHRvbnMiLCJyZWR1Y2UiLCJrIiwiZ2F0ZXdheUlkIiwiZGlzYWJsZUNyZWRpdENhcmRGaWVsZHMiLCJlbmFibGVDcmVkaXRDYXJkRmllbGRzIiwiYWRkQ2xhc3MiLCJhdHRyIiwicmVtb3ZlQ2xhc3MiLCJpc0NoYW5nZVBheW1lbnRQYWdlIiwidXJsUGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwic2VhcmNoIiwiaGFzIiwiUGF5Tm93Qm9vdHN0cmFwIiwibWVyZ2UiLCJSZW5kZXJlciIsImNyZWRpdENhcmRSZW5kZXJlciIsImRlZmF1bHRTZXR0aW5ncyIsIm9uU21hcnRCdXR0b25DbGljayIsIm9uU21hcnRCdXR0b25zSW5pdCIsInJlbmRlcmVkU291cmNlcyIsIlNldCIsImNvbnRleHRDb25maWciLCJzZXR0aW5nc092ZXJyaWRlIiwic2V0dGluZ3MiLCJlbmFibGVkU2VwYXJhdGVHYXRld2F5cyIsImZpbHRlciIsInMiLCJoYXNFbmFibGVkU2VwYXJhdGVHYXRld2F5cyIsImtleXMiLCJyZW5kZXJCdXR0b25zIiwicGF5cGFsIiwiZ2V0RnVuZGluZ1NvdXJjZXMiLCJzaGFwZSIsImlzQWxyZWFkeVJlbmRlcmVkIiwiQnV0dG9ucyIsImJ0biIsIm9uQ2xpY2siLCJvbkluaXQiLCJpc0VsaWdpYmxlIiwiaGFzQ2hpbGROb2RlcyIsImRvbUVsZW1lbnQiLCJkaXNwbGF5IiwiZGlzYWJsZUZpZWxkcyIsImVuYWJsZUZpZWxkcyIsImRjY0lucHV0RmFjdG9yeSIsIm9yaWdpbmFsIiwic3R5bGVzIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsIm5ld0VsZW1lbnQiLCJjbGFzc05hbWUiLCJ2YWx1ZXMiLCJwcm9wIiwiaXNOYU4iLCJDcmVkaXRDYXJkUmVuZGVyZXIiLCJkZWZhdWx0Q29uZmlnIiwiY2FyZFZhbGlkIiwiZm9ybVZhbGlkIiwiY3VycmVudEhvc3RlZEZpZWxkc0luc3RhbmNlIiwiSG9zdGVkRmllbGRzIiwid3JhcHBlckVsZW1lbnQiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJidXR0b25TZWxlY3RvciIsInRlYXJkb3duIiwiZ2F0ZVdheUJveCIsIm9sZERpc3BsYXlTdHlsZSIsImhpZGVEY2NHYXRld2F5IiwiY2FyZE51bWJlckZpZWxkIiwic3R5bGVzUmF3IiwiY2FyZE51bWJlciIsInJlcGxhY2VDaGlsZCIsImNhcmRFeHBpcnlGaWVsZCIsImNhcmRFeHBpcnkiLCJjYXJkQ29kZUZpZWxkIiwiY2FyZENvZGUiLCJmb3JtV3JhcHBlciIsImVuZm9yY2VfdmF1bHQiLCJjaGVja2VkIiwiZmllbGRzIiwibnVtYmVyIiwic2VsZWN0b3IiLCJwbGFjZWhvbGRlciIsImNyZWRpdF9jYXJkX251bWJlciIsImN2diIsImV4cGlyYXRpb25EYXRlIiwibW1feXkiLCJob3N0ZWRGaWVsZHMiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJfc3VibWl0IiwiZXZlbnQiLCJjYXJkcyIsInZhbGlkQ2FyZHMiLCJ2YWxpZF9jYXJkcyIsImluZGV4T2YiLCJ0eXBlIiwiX2NhcmROdW1iZXJGaWxlZENMYXNzTmFtZUJ5Q2FyZFR5cGUiLCJfcmVjcmVhdGVFbGVtZW50Q2xhc3NBdHRyaWJ1dGUiLCJpc1ZhbGlkIiwiZXZlcnkiLCJrZXkiLCJwcmV2ZW50RGVmYXVsdCIsImZpZWxkIiwiYXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwic2F2ZV9jYXJkIiwiY2FuX3NhdmVfdmF1bHRfdG9rZW4iLCJ2YXVsdCIsImdldEVsZW1lbnRCeUlkIiwiY29udGluZ2VuY3kiLCJob3N0ZWRGaWVsZHNEYXRhIiwiY29udGluZ2VuY2llcyIsImNhcmRob2xkZXJOYW1lIiwiZmlyc3ROYW1lIiwibGFzdE5hbWUiLCJzdWJtaXQiLCJwYXlsb2FkIiwib3JkZXJJZCIsImNhcmRfbm90X3N1cHBvcnRlZCIsImZpZWxkc19ub3RfdmFsaWQiLCJjYXJkVHlwZSIsIm5ld0NsYXNzTmFtZSIsInN0b3JhZ2VLZXkiLCJ2YWxpZGF0ZVRva2VuIiwidG9rZW4iLCJ1c2VyIiwiY3VycmVudFRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsImlzRXhwaXJlZCIsImV4cGlyYXRpb24iLCJzdG9yZWRUb2tlbkZvclVzZXIiLCJwYXJzZSIsInNlc3Npb25TdG9yYWdlIiwiZ2V0SXRlbSIsInN0b3JlVG9rZW4iLCJzZXRJdGVtIiwiZGF0YUNsaWVudElkQXR0cmlidXRlSGFuZGxlciIsInNjcmlwdCIsIk1lc3NhZ2VSZW5kZXJlciIsIk1lc3NhZ2VzIiwiYW1vdW50IiwicGxhY2VtZW50IiwibmV3V3JhcHBlciIsInNpYmxpbmciLCJuZXh0U2libGluZyIsInBhcmVudEVsZW1lbnQiLCJpbnNlcnRCZWZvcmUiLCJTcGlubmVyIiwidGFyZ2V0Iiwic2V0VGFyZ2V0Iiwib3ZlcmxheUNTUyIsImJhY2tncm91bmQiLCJvcGFjaXR5IiwiRnJlZVRyaWFsSGFuZGxlciIsImhhbmRsZSIsInZhdWx0X3BheXBhbCIsInJldHVybl91cmwiLCJhcHByb3ZlX2xpbmsiLCJidXR0b25zU3Bpbm5lciIsImNhcmRzU3Bpbm5lciIsImJvb3RzdHJhcCIsImZyZWVUcmlhbEhhbmRsZXIiLCJiYXNpY19jaGVja291dF92YWxpZGF0aW9uX2VuYWJsZWQiLCJyZXF1aXJlZEZpZWxkcyIsImVhY2giLCJpIiwidHJpZ2dlciIsImludmFsaWRGaWVsZHMiLCJBcnJheSIsImZyb20iLCJiaWxsaW5nRmllbGRzQ29udGFpbmVyIiwic2hpcHBpbmdGaWVsZHNDb250YWluZXIiLCJuYW1lTWVzc2FnZU1hcCIsInJlcXVpcmVkIiwiZWxlbWVudHMiLCJsYWJlbCIsInRleHRDb250ZW50IiwicmVwbGFjZUFsbCIsInRyaW0iLCJiaWxsaW5nX2ZpZWxkIiwic2hpcHBpbmdfZmllbGQiLCJpbnNlcnRBZGphY2VudEhUTUwiLCJtZXNzYWdlUmVuZGVyZXIiLCJtaW5pX2NhcnRfYnV0dG9uc19lbmFibGVkIiwibWluaUNhcnRCb290c3RyYXAiLCJzaW5nbGVfcHJvZHVjdF9idXR0b25zX2VuYWJsZWQiLCJzaW5nbGVQcm9kdWN0Qm9vdHN0cmFwIiwiY2FydEJvb3RzdHJhcCIsImNoZWNrb3V0Qm9vdHN0YXAiLCJwYXlOb3dCb290c3RyYXAiLCJkYXRhX2NsaWVudF9pZCIsImhhc19zdWJzY3JpcHRpb25zIiwicGF5cGFsQnV0dG9uR2F0ZXdheUlkcyIsImhpZGVPcmRlckJ1dHRvbklmUHBjcEdhdGV3YXkiLCJpc1BheXBhbEJ1dHRvbiIsImlzQ2FyZHMiLCJib290c3RyYXBwZWQiLCJ1cmwiLCJzY3JpcHRfYXR0cmlidXRlcyIsImtleVZhbHVlIiwic2V0X2F0dHJpYnV0ZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///536\n")},996:module=>{eval("\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction getEnumerableOwnPropertySymbols(target) {\n\treturn Object.getOwnPropertySymbols\n\t\t? Object.getOwnPropertySymbols(target).filter(function(symbol) {\n\t\t\treturn target.propertyIsEnumerable(symbol)\n\t\t})\n\t\t: []\n}\n\nfunction getKeys(target) {\n\treturn Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))\n}\n\nfunction propertyIsOnObject(object, property) {\n\ttry {\n\t\treturn property in object\n\t} catch(_) {\n\t\treturn false\n\t}\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nfunction propertyIsUnsafe(target, key) {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tgetKeys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tgetKeys(source).forEach(function(key) {\n\t\tif (propertyIsUnsafe(target, key)) {\n\t\t\treturn\n\t\t}\n\n\t\tif (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\t// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()\n\t// implementations can use it. The caller may not replace it.\n\toptions.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTk2LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUUsSUFBSTtBQUNOOztBQUVBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcHBjLWJ1dHRvbi8uL25vZGVfbW9kdWxlcy9kZWVwbWVyZ2UvZGlzdC9janMuanM/M2M0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBpc01lcmdlYWJsZU9iamVjdCA9IGZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlKSB7XG5cdHJldHVybiBpc05vbk51bGxPYmplY3QodmFsdWUpXG5cdFx0JiYgIWlzU3BlY2lhbCh2YWx1ZSlcbn07XG5cbmZ1bmN0aW9uIGlzTm9uTnVsbE9iamVjdCh2YWx1ZSkge1xuXHRyZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG59XG5cbmZ1bmN0aW9uIGlzU3BlY2lhbCh2YWx1ZSkge1xuXHR2YXIgc3RyaW5nVmFsdWUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuXG5cdHJldHVybiBzdHJpbmdWYWx1ZSA9PT0gJ1tvYmplY3QgUmVnRXhwXSdcblx0XHR8fCBzdHJpbmdWYWx1ZSA9PT0gJ1tvYmplY3QgRGF0ZV0nXG5cdFx0fHwgaXNSZWFjdEVsZW1lbnQodmFsdWUpXG59XG5cbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi9iNWFjOTYzZmI3OTFkMTI5OGU3ZjM5NjIzNjM4M2JjOTU1ZjkxNmMxL3NyYy9pc29tb3JwaGljL2NsYXNzaWMvZWxlbWVudC9SZWFjdEVsZW1lbnQuanMjTDIxLUwyNVxudmFyIGNhblVzZVN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcjtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBjYW5Vc2VTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgOiAweGVhYzc7XG5cbmZ1bmN0aW9uIGlzUmVhY3RFbGVtZW50KHZhbHVlKSB7XG5cdHJldHVybiB2YWx1ZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFXG59XG5cbmZ1bmN0aW9uIGVtcHR5VGFyZ2V0KHZhbCkge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gW10gOiB7fVxufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZSwgb3B0aW9ucykge1xuXHRyZXR1cm4gKG9wdGlvbnMuY2xvbmUgIT09IGZhbHNlICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodmFsdWUpKVxuXHRcdD8gZGVlcG1lcmdlKGVtcHR5VGFyZ2V0KHZhbHVlKSwgdmFsdWUsIG9wdGlvbnMpXG5cdFx0OiB2YWx1ZVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuXHRyZXR1cm4gdGFyZ2V0LmNvbmNhdChzb3VyY2UpLm1hcChmdW5jdGlvbihlbGVtZW50KSB7XG5cdFx0cmV0dXJuIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGVsZW1lbnQsIG9wdGlvbnMpXG5cdH0pXG59XG5cbmZ1bmN0aW9uIGdldE1lcmdlRnVuY3Rpb24oa2V5LCBvcHRpb25zKSB7XG5cdGlmICghb3B0aW9ucy5jdXN0b21NZXJnZSkge1xuXHRcdHJldHVybiBkZWVwbWVyZ2Vcblx0fVxuXHR2YXIgY3VzdG9tTWVyZ2UgPSBvcHRpb25zLmN1c3RvbU1lcmdlKGtleSk7XG5cdHJldHVybiB0eXBlb2YgY3VzdG9tTWVyZ2UgPT09ICdmdW5jdGlvbicgPyBjdXN0b21NZXJnZSA6IGRlZXBtZXJnZVxufVxuXG5mdW5jdGlvbiBnZXRFbnVtZXJhYmxlT3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkge1xuXHRyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc1xuXHRcdD8gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpLmZpbHRlcihmdW5jdGlvbihzeW1ib2wpIHtcblx0XHRcdHJldHVybiB0YXJnZXQucHJvcGVydHlJc0VudW1lcmFibGUoc3ltYm9sKVxuXHRcdH0pXG5cdFx0OiBbXVxufVxuXG5mdW5jdGlvbiBnZXRLZXlzKHRhcmdldCkge1xuXHRyZXR1cm4gT2JqZWN0LmtleXModGFyZ2V0KS5jb25jYXQoZ2V0RW51bWVyYWJsZU93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKVxufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUlzT25PYmplY3Qob2JqZWN0LCBwcm9wZXJ0eSkge1xuXHR0cnkge1xuXHRcdHJldHVybiBwcm9wZXJ0eSBpbiBvYmplY3Rcblx0fSBjYXRjaChfKSB7XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH1cbn1cblxuLy8gUHJvdGVjdHMgZnJvbSBwcm90b3R5cGUgcG9pc29uaW5nIGFuZCB1bmV4cGVjdGVkIG1lcmdpbmcgdXAgdGhlIHByb3RvdHlwZSBjaGFpbi5cbmZ1bmN0aW9uIHByb3BlcnR5SXNVbnNhZmUodGFyZ2V0LCBrZXkpIHtcblx0cmV0dXJuIHByb3BlcnR5SXNPbk9iamVjdCh0YXJnZXQsIGtleSkgLy8gUHJvcGVydGllcyBhcmUgc2FmZSB0byBtZXJnZSBpZiB0aGV5IGRvbid0IGV4aXN0IGluIHRoZSB0YXJnZXQgeWV0LFxuXHRcdCYmICEoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpIC8vIHVuc2FmZSBpZiB0aGV5IGV4aXN0IHVwIHRoZSBwcm90b3R5cGUgY2hhaW4sXG5cdFx0XHQmJiBPYmplY3QucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0YXJnZXQsIGtleSkpIC8vIGFuZCBhbHNvIHVuc2FmZSBpZiB0aGV5J3JlIG5vbmVudW1lcmFibGUuXG59XG5cbmZ1bmN0aW9uIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG5cdHZhciBkZXN0aW5hdGlvbiA9IHt9O1xuXHRpZiAob3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh0YXJnZXQpKSB7XG5cdFx0Z2V0S2V5cyh0YXJnZXQpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG5cdFx0XHRkZXN0aW5hdGlvbltrZXldID0gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodGFyZ2V0W2tleV0sIG9wdGlvbnMpO1xuXHRcdH0pO1xuXHR9XG5cdGdldEtleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuXHRcdGlmIChwcm9wZXJ0eUlzVW5zYWZlKHRhcmdldCwga2V5KSkge1xuXHRcdFx0cmV0dXJuXG5cdFx0fVxuXG5cdFx0aWYgKHByb3BlcnR5SXNPbk9iamVjdCh0YXJnZXQsIGtleSkgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdChzb3VyY2Vba2V5XSkpIHtcblx0XHRcdGRlc3RpbmF0aW9uW2tleV0gPSBnZXRNZXJnZUZ1bmN0aW9uKGtleSwgb3B0aW9ucykodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldLCBvcHRpb25zKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVzdGluYXRpb25ba2V5XSA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHNvdXJjZVtrZXldLCBvcHRpb25zKTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gZGVzdGluYXRpb25cbn1cblxuZnVuY3Rpb24gZGVlcG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHRvcHRpb25zLmFycmF5TWVyZ2UgPSBvcHRpb25zLmFycmF5TWVyZ2UgfHwgZGVmYXVsdEFycmF5TWVyZ2U7XG5cdG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QgPSBvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0IHx8IGlzTWVyZ2VhYmxlT2JqZWN0O1xuXHQvLyBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCBpcyBhZGRlZCB0byBgb3B0aW9uc2Agc28gdGhhdCBjdXN0b20gYXJyYXlNZXJnZSgpXG5cdC8vIGltcGxlbWVudGF0aW9ucyBjYW4gdXNlIGl0LiBUaGUgY2FsbGVyIG1heSBub3QgcmVwbGFjZSBpdC5cblx0b3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkO1xuXG5cdHZhciBzb3VyY2VJc0FycmF5ID0gQXJyYXkuaXNBcnJheShzb3VyY2UpO1xuXHR2YXIgdGFyZ2V0SXNBcnJheSA9IEFycmF5LmlzQXJyYXkodGFyZ2V0KTtcblx0dmFyIHNvdXJjZUFuZFRhcmdldFR5cGVzTWF0Y2ggPSBzb3VyY2VJc0FycmF5ID09PSB0YXJnZXRJc0FycmF5O1xuXG5cdGlmICghc291cmNlQW5kVGFyZ2V0VHlwZXNNYXRjaCkge1xuXHRcdHJldHVybiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChzb3VyY2UsIG9wdGlvbnMpXG5cdH0gZWxzZSBpZiAoc291cmNlSXNBcnJheSkge1xuXHRcdHJldHVybiBvcHRpb25zLmFycmF5TWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpXG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zKVxuXHR9XG59XG5cbmRlZXBtZXJnZS5hbGwgPSBmdW5jdGlvbiBkZWVwbWVyZ2VBbGwoYXJyYXksIG9wdGlvbnMpIHtcblx0aWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIGFuIGFycmF5Jylcblx0fVxuXG5cdHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgbmV4dCkge1xuXHRcdHJldHVybiBkZWVwbWVyZ2UocHJldiwgbmV4dCwgb3B0aW9ucylcblx0fSwge30pXG59O1xuXG52YXIgZGVlcG1lcmdlXzEgPSBkZWVwbWVyZ2U7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVlcG1lcmdlXzE7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///996\n")}},__webpack_module_cache__={};function __webpack_require__(Q){var F=__webpack_module_cache__[Q];if(void 0!==F)return F.exports;var B=__webpack_module_cache__[Q]={exports:{}};return __webpack_modules__[Q](B,B.exports,__webpack_require__),B.exports}__webpack_require__.n=Q=>{var F=Q&&Q.__esModule?()=>Q.default:()=>Q;return __webpack_require__.d(F,{a:F}),F},__webpack_require__.d=(Q,F)=>{for(var B in F)__webpack_require__.o(F,B)&&!__webpack_require__.o(Q,B)&&Object.defineProperty(Q,B,{enumerable:!0,get:F[B]})},__webpack_require__.o=(Q,F)=>Object.prototype.hasOwnProperty.call(Q,F);var __webpack_exports__=__webpack_require__(536)})();
modules/ppcp-button/resources/js/button.js CHANGED
@@ -66,7 +66,7 @@ const bootstrap = () => {
66
 
67
  errorHandler.clear();
68
  if (messages.length) {
69
- messages.forEach(s => errorHandler.message(s));
70
  } else {
71
  errorHandler.message(PayPalCommerceGateway.labels.error.required.generic);
72
  }
66
 
67
  errorHandler.clear();
68
  if (messages.length) {
69
+ errorHandler.messages(messages);
70
  } else {
71
  errorHandler.message(PayPalCommerceGateway.labels.error.required.generic);
72
  }
modules/ppcp-button/resources/js/modules/ErrorHandler.js CHANGED
@@ -17,21 +17,48 @@ class ErrorHandler {
17
 
18
  appendPreparedErrorMessageElement(errorMessageElement)
19
  {
20
- if(this.messagesList === null) {
21
- this.prepareMessagesList();
22
  }
23
 
24
  this.messagesList.replaceWith(errorMessageElement);
25
  }
26
 
 
 
 
 
27
  message(text, persist = false)
28
  {
29
- if(! typeof String || text.length === 0){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  throw new Error('A new message text must be a non-empty string.');
31
  }
32
 
33
- if(this.messagesList === null){
34
- this.prepareMessagesList();
35
  }
36
 
37
  if (persist) {
@@ -40,15 +67,24 @@ class ErrorHandler {
40
  this.wrapper.classList.remove('ppcp-persist');
41
  }
42
 
43
- let messageNode = this.prepareMessagesListItem(text);
44
  this.messagesList.appendChild(messageNode);
 
45
 
46
- jQuery.scroll_to_notices(jQuery('.woocommerce-notices-wrapper'))
 
 
 
 
 
47
  }
48
 
49
- prepareMessagesList()
 
 
 
50
  {
51
- if(this.messagesList === null){
52
  this.messagesList = document.createElement('ul');
53
  this.messagesList.setAttribute('class', 'woocommerce-error');
54
  this.messagesList.setAttribute('role', 'alert');
@@ -56,7 +92,10 @@ class ErrorHandler {
56
  }
57
  }
58
 
59
- prepareMessagesListItem(message)
 
 
 
60
  {
61
  const li = document.createElement('li');
62
  li.innerHTML = message;
@@ -64,13 +103,6 @@ class ErrorHandler {
64
  return li;
65
  }
66
 
67
- sanitize(text)
68
- {
69
- const textarea = document.createElement('textarea');
70
- textarea.innerHTML = text;
71
- return textarea.value.replace('Error: ', '');
72
- }
73
-
74
  clear()
75
  {
76
  if (this.messagesList === null) {
17
 
18
  appendPreparedErrorMessageElement(errorMessageElement)
19
  {
20
+ if (this.messagesList === null) {
21
+ this._prepareMessagesList();
22
  }
23
 
24
  this.messagesList.replaceWith(errorMessageElement);
25
  }
26
 
27
+ /**
28
+ * @param {String} text
29
+ * @param {Boolean} persist
30
+ */
31
  message(text, persist = false)
32
  {
33
+ this._addMessage(text, persist);
34
+
35
+ this._scrollToMessages();
36
+ }
37
+
38
+ /**
39
+ * @param {Array} texts
40
+ * @param {Boolean} persist
41
+ */
42
+ messages(texts, persist = false)
43
+ {
44
+ texts.forEach(t => this._addMessage(t, persist));
45
+
46
+ this._scrollToMessages();
47
+ }
48
+
49
+ /**
50
+ * @private
51
+ * @param {String} text
52
+ * @param {Boolean} persist
53
+ */
54
+ _addMessage(text, persist = false)
55
+ {
56
+ if(! typeof String || text.length === 0) {
57
  throw new Error('A new message text must be a non-empty string.');
58
  }
59
 
60
+ if (this.messagesList === null){
61
+ this._prepareMessagesList();
62
  }
63
 
64
  if (persist) {
67
  this.wrapper.classList.remove('ppcp-persist');
68
  }
69
 
70
+ let messageNode = this._prepareMessagesListItem(text);
71
  this.messagesList.appendChild(messageNode);
72
+ }
73
 
74
+ /**
75
+ * @private
76
+ */
77
+ _scrollToMessages()
78
+ {
79
+ jQuery.scroll_to_notices(jQuery('.woocommerce-notices-wrapper'));
80
  }
81
 
82
+ /**
83
+ * @private
84
+ */
85
+ _prepareMessagesList()
86
  {
87
+ if (this.messagesList === null) {
88
  this.messagesList = document.createElement('ul');
89
  this.messagesList.setAttribute('class', 'woocommerce-error');
90
  this.messagesList.setAttribute('role', 'alert');
92
  }
93
  }
94
 
95
+ /**
96
+ * @private
97
+ */
98
+ _prepareMessagesListItem(message)
99
  {
100
  const li = document.createElement('li');
101
  li.innerHTML = message;
103
  return li;
104
  }
105
 
 
 
 
 
 
 
 
106
  clear()
107
  {
108
  if (this.messagesList === null) {
modules/ppcp-compat/services.php CHANGED
@@ -32,10 +32,22 @@ return array(
32
  return new PPEC\SubscriptionsHandler( $ppcp_renewal_handler, $gateway );
33
  },
34
 
35
- 'compat.ppec.settings_importer' => static function( $container ) : PPEC\SettingsImporter {
36
  $settings = $container->get( 'wcgateway.settings' );
37
 
38
  return new PPEC\SettingsImporter( $settings );
39
  },
40
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  );
32
  return new PPEC\SubscriptionsHandler( $ppcp_renewal_handler, $gateway );
33
  },
34
 
35
+ 'compat.ppec.settings_importer' => static function( ContainerInterface $container ) : PPEC\SettingsImporter {
36
  $settings = $container->get( 'wcgateway.settings' );
37
 
38
  return new PPEC\SettingsImporter( $settings );
39
  },
40
 
41
+ 'compat.plugin-script-names' => static function( ContainerInterface $container ) : array {
42
+ return array(
43
+ 'ppcp-smart-button',
44
+ 'ppcp-oxxo',
45
+ 'ppcp-pay-upon-invoice',
46
+ 'ppcp-vaulting-myaccount-payments',
47
+ 'ppcp-gateway-settings',
48
+ 'ppcp-webhooks-status-page',
49
+ 'ppcp-tracking',
50
+ );
51
+ },
52
+
53
  );
modules/ppcp-compat/src/CompatModule.php CHANGED
@@ -33,12 +33,11 @@ class CompatModule implements ModuleInterface {
33
  }
34
 
35
  /**
36
- * Run the compatibility module.
37
- *
38
- * @param ContainerInterface|null $c The Container.
39
  */
40
  public function run( ContainerInterface $c ): void {
41
  $this->initialize_ppec_compat_layer( $c );
 
42
  }
43
 
44
  /**
@@ -52,10 +51,10 @@ class CompatModule implements ModuleInterface {
52
  /**
53
  * Sets up the PayPal Express Checkout compatibility layer.
54
  *
55
- * @param ContainerInterface|null $container The Container.
56
  * @return void
57
  */
58
- private function initialize_ppec_compat_layer( $container ): void {
59
  // Process PPEC subscription renewals through PayPal Payments.
60
  $handler = $container->get( 'compat.ppec.subscriptions-handler' );
61
  $handler->maybe_hook();
@@ -76,4 +75,20 @@ class CompatModule implements ModuleInterface {
76
 
77
  }
78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  }
33
  }
34
 
35
  /**
36
+ * {@inheritDoc}
 
 
37
  */
38
  public function run( ContainerInterface $c ): void {
39
  $this->initialize_ppec_compat_layer( $c );
40
+ $this->fix_site_ground_optimizer_compatibility( $c );
41
  }
42
 
43
  /**
51
  /**
52
  * Sets up the PayPal Express Checkout compatibility layer.
53
  *
54
+ * @param ContainerInterface $container The Container.
55
  * @return void
56
  */
57
+ private function initialize_ppec_compat_layer( ContainerInterface $container ): void {
58
  // Process PPEC subscription renewals through PayPal Payments.
59
  $handler = $container->get( 'compat.ppec.subscriptions-handler' );
60
  $handler->maybe_hook();
75
 
76
  }
77
 
78
+ /**
79
+ * Fixes the compatibility issue for <a href="https://wordpress.org/plugins/sg-cachepress/">SiteGround Optimizer plugin</a>.
80
+ *
81
+ * @link https://wordpress.org/plugins/sg-cachepress/
82
+ *
83
+ * @param ContainerInterface $c The Container.
84
+ */
85
+ protected function fix_site_ground_optimizer_compatibility( ContainerInterface $c ): void {
86
+ $ppcp_script_names = $c->get( 'compat.plugin-script-names' );
87
+ add_filter(
88
+ 'sgo_js_minify_exclude',
89
+ function ( array $scripts ) use ( $ppcp_script_names ) {
90
+ return array_merge( $scripts, $ppcp_script_names );
91
+ }
92
+ );
93
+ }
94
  }
modules/ppcp-onboarding/assets/css/onboarding.css CHANGED
@@ -55,6 +55,7 @@ ul.ppcp-onboarding-options, ul.ppcp-onboarding-options-sublist {
55
 
56
  ul.ppcp-onboarding-options-sublist {
57
  margin-left: 15px;
 
58
  }
59
 
60
  .ppcp-muted-text {
@@ -168,3 +169,53 @@ ul.ppcp-onboarding-options-sublist {
168
  height: 23px;
169
  }
170
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
 
56
  ul.ppcp-onboarding-options-sublist {
57
  margin-left: 15px;
58
+ margin-top: 15px;
59
  }
60
 
61
  .ppcp-muted-text {
169
  height: 23px;
170
  }
171
  }
172
+
173
+ .ppcp-settings-page-header {
174
+ display: flex;
175
+ align-items: center;
176
+ max-width: 1200px;
177
+ margin-top: 10px;
178
+ }
179
+
180
+ .ppcp-settings-page-header img {
181
+ height: 30px;
182
+ }
183
+
184
+ .ppcp-settings-page-header h4 {
185
+ margin: 0 15px 0 5px;
186
+ }
187
+
188
+ .ppcp-settings-page-header .button, .ppcp-settings-page-header a {
189
+ margin: 0 5px;
190
+ }
191
+
192
+ .ppcp-right-align {
193
+ margin-left: auto;
194
+ }
195
+
196
+ .ppcp-settings-page-header a {
197
+ text-decoration: none;
198
+ }
199
+
200
+ @media (max-width: 1200px) {
201
+ .ppcp-settings-page-header {
202
+ display: block;
203
+ }
204
+
205
+ .ppcp-settings-page-header .ppcp-right-align {
206
+ display: block;
207
+ margin-left: 0;
208
+ }
209
+
210
+ .ppcp-settings-page-header .button, .ppcp-settings-page-header a {
211
+ margin: 5px 10px 5px 0;
212
+ }
213
+
214
+ .ppcp-settings-page-header .ppcp-inline-only {
215
+ display: none;
216
+ }
217
+
218
+ .ppcp-settings-page-header h4 {
219
+ margin-left: 0;
220
+ }
221
+ }
modules/ppcp-onboarding/assets/js/onboarding.js CHANGED
@@ -158,6 +158,8 @@ function ppcp_onboarding_productionCallback(...args) {
158
  input.disabled = !cardsChk.checked;
159
  });
160
 
 
 
161
  const basicRb = document.querySelector('#ppcp-onboarding-dcc-basic');
162
 
163
  const isExpress = !cardsChk.checked || basicRb.checked;
158
  input.disabled = !cardsChk.checked;
159
  });
160
 
161
+ document.querySelector('.ppcp-onboarding-cards-options').style.display = !cardsChk.checked ? 'none' : '';
162
+
163
  const basicRb = document.querySelector('#ppcp-onboarding-dcc-basic');
164
 
165
  const isExpress = !cardsChk.checked || basicRb.checked;
modules/ppcp-onboarding/src/Render/OnboardingOptionsRenderer.php CHANGED
@@ -56,6 +56,7 @@ class OnboardingOptionsRenderer {
56
  * @param bool $is_shop_supports_dcc Whether the shop can use DCC (country, currency).
57
  */
58
  public function render( bool $is_shop_supports_dcc ): string {
 
59
  return '
60
  <ul class="ppcp-onboarding-options">
61
  <li>
@@ -64,9 +65,7 @@ class OnboardingOptionsRenderer {
64
  </label>
65
  </li>
66
  <li>
67
- <label><input type="checkbox" id="ppcp-onboarding-accept-cards" checked> ' .
68
- __( 'Securely accept all major credit & debit cards on the strength of the PayPal network', 'woocommerce-paypal-payments' ) . '
69
- </label>
70
  </li>
71
  <li>' . $this->render_dcc( $is_shop_supports_dcc ) . '</li>' .
72
  $this->render_pui_option()
@@ -103,6 +102,44 @@ class OnboardingOptionsRenderer {
103
 
104
  $is_us_shop = 'US' === $this->country;
105
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
  if ( $is_shop_supports_dcc ) {
107
  $dcc_table_rows = array(
108
  $this->render_table_row(
@@ -146,9 +183,9 @@ class OnboardingOptionsRenderer {
146
  $items[] = '
147
  <li>
148
  <label>
149
- <input type="radio" id="ppcp-onboarding-dcc-acdc" name="ppcp_onboarding_dcc" value="acdc" checked ' .
150
  'data-screen-url="' . $this->get_screen_url( 'acdc' ) . '"> ' .
151
- __( 'Advanced Card Processing', 'woocommerce-paypal-payments' ) . '
152
  </label>
153
  ' . $this->render_tooltip( __( 'PayPal acts as the payment processor for card transactions. You can add optional features like Chargeback Protection for more security.', 'woocommerce-paypal-payments' ) ) . '
154
  <table>
@@ -157,53 +194,13 @@ class OnboardingOptionsRenderer {
157
  </li>';
158
  }
159
 
160
- $basic_table_rows = array(
161
- $this->render_table_row(
162
- __( 'Credit & Debit Card form fields', 'woocommerce-paypal-payments' ),
163
- __( 'Prebuilt user experience', 'woocommerce-paypal-payments' )
164
- ),
165
- ! $is_us_shop ? '' : $this->render_table_row(
166
- __( 'Credit & Debit Card pricing', 'woocommerce-paypal-payments' ),
167
- __( '3.49% + $0.49', 'woocommerce-paypal-payments' ),
168
- '',
169
- __( 'for US domestic transactions', 'woocommerce-paypal-payments' )
170
- ),
171
- $this->render_table_row(
172
- __( 'Seller Protection', 'woocommerce-paypal-payments' ),
173
- __( 'Yes', 'woocommerce-paypal-payments' ),
174
- __( 'No matter what you sell, Seller Protection can help you avoid chargebacks, reversals, and fees on eligible PayPal payment transactions — even when a customer has filed a dispute.', 'woocommerce-paypal-payments' ),
175
- __( 'for eligible PayPal transactions', 'woocommerce-paypal-payments' )
176
- ),
177
- $this->render_table_row(
178
- __( 'Seller Account Type', 'woocommerce-paypal-payments' ),
179
- __( 'Business or Casual', 'woocommerce-paypal-payments' ),
180
- __( 'For Standard payments, Casual sellers may connect their Personal PayPal account in eligible countries to sell on WooCommerce. For Advanced payments, a Business PayPal account is required.', 'woocommerce-paypal-payments' )
181
- ),
182
- );
183
- $items[] = '
184
- <li ' . ( ! $is_shop_supports_dcc ? 'style="display: none;"' : '' ) . '>
185
- <label>
186
- <input type="radio" id="ppcp-onboarding-dcc-basic" name="ppcp_onboarding_dcc" value="basic" ' .
187
- ( ! $is_shop_supports_dcc ? 'checked' : '' ) .
188
- ' data-screen-url="' . $this->get_screen_url( 'basic' ) . '"' .
189
- '> ' .
190
- __( 'Standard Card Processing', 'woocommerce-paypal-payments' ) . '
191
- </label>
192
- ' . $this->render_tooltip( __( 'Card transactions are managed by PayPal, which simplifies compliance requirements for you.', 'woocommerce-paypal-payments' ) ) . '
193
- <table>
194
- ' . implode( $basic_table_rows ) . '
195
- </table>
196
- </li>';
197
-
198
  return '
199
  <div class="ppcp-onboarding-cards-options">
200
  <ul id="ppcp-onboarding-dcc-options" class="ppcp-onboarding-options-sublist">' .
201
  implode( '', $items ) .
202
  '
203
  </ul>
204
- <div class="ppcp-onboarding-cards-screen">' .
205
- ( $is_shop_supports_dcc ? '<img id="ppcp-onboarding-cards-screen-img" />' : '' ) . '
206
- </div>
207
  </div>';
208
  }
209
 
56
  * @param bool $is_shop_supports_dcc Whether the shop can use DCC (country, currency).
57
  */
58
  public function render( bool $is_shop_supports_dcc ): string {
59
+ $checked = $is_shop_supports_dcc ? '' : 'checked';
60
  return '
61
  <ul class="ppcp-onboarding-options">
62
  <li>
65
  </label>
66
  </li>
67
  <li>
68
+ <label><input type="checkbox" id="ppcp-onboarding-accept-cards" ' . $checked . '> ' . __( 'Securely accept all major credit & debit cards on the strength of the PayPal network', 'woocommerce-paypal-payments' ) . '</label>
 
 
69
  </li>
70
  <li>' . $this->render_dcc( $is_shop_supports_dcc ) . '</li>' .
71
  $this->render_pui_option()
102
 
103
  $is_us_shop = 'US' === $this->country;
104
 
105
+ $basic_table_rows = array(
106
+ $this->render_table_row(
107
+ __( 'Credit & Debit Card form fields', 'woocommerce-paypal-payments' ),
108
+ __( 'Prebuilt user experience', 'woocommerce-paypal-payments' )
109
+ ),
110
+ ! $is_us_shop ? '' : $this->render_table_row(
111
+ __( 'Credit & Debit Card pricing', 'woocommerce-paypal-payments' ),
112
+ __( '3.49% + $0.49', 'woocommerce-paypal-payments' ),
113
+ '',
114
+ __( 'for US domestic transactions', 'woocommerce-paypal-payments' )
115
+ ),
116
+ $this->render_table_row(
117
+ __( 'Seller Protection', 'woocommerce-paypal-payments' ),
118
+ __( 'Yes', 'woocommerce-paypal-payments' ),
119
+ __( 'No matter what you sell, Seller Protection can help you avoid chargebacks, reversals, and fees on eligible PayPal payment transactions — even when a customer has filed a dispute.', 'woocommerce-paypal-payments' ),
120
+ __( 'for eligible PayPal transactions', 'woocommerce-paypal-payments' )
121
+ ),
122
+ $this->render_table_row(
123
+ __( 'Seller Account Type', 'woocommerce-paypal-payments' ),
124
+ __( 'Business or Casual', 'woocommerce-paypal-payments' ),
125
+ __( 'For Standard payments, Casual sellers may connect their Personal PayPal account in eligible countries to sell on WooCommerce. For Advanced payments, a Business PayPal account is required.', 'woocommerce-paypal-payments' )
126
+ ),
127
+ );
128
+ $items[] = '
129
+ <li>
130
+ <label>
131
+ <input type="radio" id="ppcp-onboarding-dcc-basic" name="ppcp_onboarding_dcc" value="basic" checked ' .
132
+ ( ! $is_shop_supports_dcc ? 'checked' : '' ) .
133
+ ' data-screen-url="' . $this->get_screen_url( 'basic' ) . '"' .
134
+ '> ' .
135
+ __( 'Standard Card Processing', 'woocommerce-paypal-payments' ) . '
136
+ </label>
137
+ ' . $this->render_tooltip( __( 'Card transactions are managed by PayPal, which simplifies compliance requirements for you.', 'woocommerce-paypal-payments' ) ) . '
138
+ <table>
139
+ ' . implode( $basic_table_rows ) . '
140
+ </table>
141
+ </li>';
142
+
143
  if ( $is_shop_supports_dcc ) {
144
  $dcc_table_rows = array(
145
  $this->render_table_row(
183
  $items[] = '
184
  <li>
185
  <label>
186
+ <input type="radio" id="ppcp-onboarding-dcc-acdc" name="ppcp_onboarding_dcc" value="acdc" ' .
187
  'data-screen-url="' . $this->get_screen_url( 'acdc' ) . '"> ' .
188
+ __( 'Advanced Card Processing', 'woocommerce-paypal-payments' ) . '
189
  </label>
190
  ' . $this->render_tooltip( __( 'PayPal acts as the payment processor for card transactions. You can add optional features like Chargeback Protection for more security.', 'woocommerce-paypal-payments' ) ) . '
191
  <table>
194
  </li>';
195
  }
196
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
197
  return '
198
  <div class="ppcp-onboarding-cards-options">
199
  <ul id="ppcp-onboarding-dcc-options" class="ppcp-onboarding-options-sublist">' .
200
  implode( '', $items ) .
201
  '
202
  </ul>
203
+ <div class="ppcp-onboarding-cards-screen"><img id="ppcp-onboarding-cards-screen-img" /></div>
 
 
204
  </div>';
205
  }
206
 
modules/ppcp-order-tracking/assets/css/order-edit-page.css ADDED
@@ -0,0 +1 @@
 
1
+ #ppcp_order-tracking .tracking-info-message{padding-left:20px}#ppcp_order-tracking .error{color:red;font-weight:bold}#ppcp_order-tracking .success{color:green;font-weight:bold}#ppcp_order-tracking input,#ppcp_order-tracking select{width:100%}
modules/ppcp-order-tracking/assets/js/order-edit-page-style.js ADDED
@@ -0,0 +1 @@
 
1
+ (()=>{"use strict";var __webpack_modules__={705:(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{eval('/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (__webpack_require__.p + "css/order-edit-page.css");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzA1LmpzIiwibWFwcGluZ3MiOiJBQUFBLHNFQUFlLHFCQUF1Qiw0QkFBNEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wcGNwLW9yZGVyLXRyYWNraW5nLy4vcmVzb3VyY2VzL2Nzcy9vcmRlci1lZGl0LXBhZ2Uuc2Nzcz83YTdmIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJjc3Mvb3JkZXItZWRpdC1wYWdlLmNzc1wiOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///705\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__[705](0,__webpack_exports__,__webpack_require__)})();
modules/ppcp-order-tracking/assets/js/order-edit-page.js ADDED
@@ -0,0 +1 @@
 
1
+ (()=>{"use strict";var __webpack_modules__={673:()=>{eval("\n;// CONCATENATED MODULE: ../ppcp-button/resources/js/modules/Helper/CheckoutMethodState.js\nconst PaymentMethods = {\n PAYPAL: 'ppcp-gateway',\n CARDS: 'ppcp-credit-card-gateway',\n OXXO: 'ppcp-oxxo-gateway',\n CARD_BUTTON: 'ppcp-card-button-gateway'\n};\nconst ORDER_BUTTON_SELECTOR = '#place_order';\nconst getCurrentPaymentMethod = () => {\n const el = document.querySelector('input[name=\"payment_method\"]:checked');\n\n if (!el) {\n return null;\n }\n\n return el.value;\n};\nconst isSavedCardSelected = () => {\n const savedCardList = document.querySelector('#saved-credit-card');\n return savedCardList && savedCardList.value !== '';\n};\n;// CONCATENATED MODULE: ./resources/js/order-edit-page.js\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const config = PayPalCommerceGatewayOrderTrackingInfo;\n\n if (!typeof PayPalCommerceGatewayOrderTrackingInfo) {\n console.error('trackign cannot be set.');\n return;\n }\n\n const transactionId = document.querySelector('.ppcp-tracking-transaction_id');\n const trackingNumber = document.querySelector('.ppcp-tracking-tracking_number');\n const status = document.querySelector('.ppcp-tracking-status');\n const carrier = document.querySelector('.ppcp-tracking-carrier');\n const orderId = document.querySelector('.ppcp-order_id');\n const submitButton = document.querySelector('.submit_tracking_info');\n submitButton.addEventListener('click', function (event) {\n submitButton.setAttribute('disabled', 'disabled');\n fetch(config.ajax.tracking_info.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: config.ajax.tracking_info.nonce,\n transaction_id: transactionId ? transactionId.value : null,\n tracking_number: trackingNumber ? trackingNumber.value : null,\n status: status ? status.value : null,\n carrier: carrier ? carrier.value : null,\n order_id: orderId ? orderId.value : null,\n action: submitButton ? submitButton.dataset.action : null\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 jQuery(\"<span class='success tracking-info-message'>\" + data.data.message + \"</span>\").insertAfter(submitButton);\n setTimeout(() => jQuery('.tracking-info-message').remove(), 3000);\n submitButton.dataset.action = 'update';\n submitButton.textContent = 'update';\n submitButton.removeAttribute('disabled');\n });\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LENBQUNBLElBQUksQ0FBQ0MsT0FBVixFQUFtQjtRQUNmNUIsT0FBTyxDQUFDQyxLQUFSLENBQWMwQixJQUFkO1FBQ0EsTUFBTUUsS0FBSyxDQUFDRixJQUFJLENBQUNBLElBQUwsQ0FBVUcsT0FBWCxDQUFYO01BQ0g7O01BRURDLE1BQU0sQ0FBRSxpREFBaURKLElBQUksQ0FBQ0EsSUFBTCxDQUFVRyxPQUEzRCxHQUFxRSxTQUF2RSxDQUFOLENBQXlGRSxXQUF6RixDQUFxR3pCLFlBQXJHO01BQ0EwQixVQUFVLENBQUMsTUFBS0YsTUFBTSxDQUFDLHdCQUFELENBQU4sQ0FBaUNHLE1BQWpDLEVBQU4sRUFBZ0QsSUFBaEQsQ0FBVjtNQUVBM0IsWUFBWSxDQUFDZ0IsT0FBYixDQUFxQkQsTUFBckIsR0FBOEIsUUFBOUI7TUFDQWYsWUFBWSxDQUFDNEIsV0FBYixHQUEyQixRQUEzQjtNQUNBNUIsWUFBWSxDQUFDNkIsZUFBYixDQUE2QixVQUE3QjtJQUNILENBekJEO0VBMEJILENBNUJEO0FBNkJILENBN0NMIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcHBjcC1vcmRlci10cmFja2luZy8uLi9wcGNwLWJ1dHRvbi9yZXNvdXJjZXMvanMvbW9kdWxlcy9IZWxwZXIvQ2hlY2tvdXRNZXRob2RTdGF0ZS5qcz81M2MxIiwid2VicGFjazovL3BwY3Atb3JkZXItdHJhY2tpbmcvLi9yZXNvdXJjZXMvanMvb3JkZXItZWRpdC1wYWdlLmpzPzdlYWUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFBheW1lbnRNZXRob2RzID0ge1xuICAgIFBBWVBBTDogJ3BwY3AtZ2F0ZXdheScsXG4gICAgQ0FSRFM6ICdwcGNwLWNyZWRpdC1jYXJkLWdhdGV3YXknLFxuICAgIE9YWE86ICdwcGNwLW94eG8tZ2F0ZXdheScsXG4gICAgQ0FSRF9CVVRUT046ICdwcGNwLWNhcmQtYnV0dG9uLWdhdGV3YXknLFxufTtcblxuZXhwb3J0IGNvbnN0IE9SREVSX0JVVFRPTl9TRUxFQ1RPUiA9ICcjcGxhY2Vfb3JkZXInO1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFBheW1lbnRNZXRob2QgPSAoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwicGF5bWVudF9tZXRob2RcIl06Y2hlY2tlZCcpO1xuICAgIGlmICghZWwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsLnZhbHVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzU2F2ZWRDYXJkU2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgY29uc3Qgc2F2ZWRDYXJkTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzYXZlZC1jcmVkaXQtY2FyZCcpO1xuICAgIHJldHVybiBzYXZlZENhcmRMaXN0ICYmIHNhdmVkQ2FyZExpc3QudmFsdWUgIT09ICcnO1xufTtcbiIsImltcG9ydCB7UGF5bWVudE1ldGhvZHN9IGZyb20gXCIuLi8uLi8uLi9wcGNwLWJ1dHRvbi9yZXNvdXJjZXMvanMvbW9kdWxlcy9IZWxwZXIvQ2hlY2tvdXRNZXRob2RTdGF0ZVwiO1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICdET01Db250ZW50TG9hZGVkJyxcbiAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IFBheVBhbENvbW1lcmNlR2F0ZXdheU9yZGVyVHJhY2tpbmdJbmZvO1xuICAgICAgICBpZiAoIXR5cGVvZiAoUGF5UGFsQ29tbWVyY2VHYXRld2F5T3JkZXJUcmFja2luZ0luZm8pKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCd0cmFja2lnbiBjYW5ub3QgYmUgc2V0LicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb25JZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wcGNwLXRyYWNraW5nLXRyYW5zYWN0aW9uX2lkJyk7XG4gICAgICAgIGNvbnN0IHRyYWNraW5nTnVtYmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBwY3AtdHJhY2tpbmctdHJhY2tpbmdfbnVtYmVyJyk7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wcGNwLXRyYWNraW5nLXN0YXR1cycpO1xuICAgICAgICBjb25zdCBjYXJyaWVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBwY3AtdHJhY2tpbmctY2FycmllcicpO1xuICAgICAgICBjb25zdCBvcmRlcklkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBwY3Atb3JkZXJfaWQnKTtcbiAgICAgICAgY29uc3Qgc3VibWl0QnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnN1Ym1pdF90cmFja2luZ19pbmZvJyk7XG5cbiAgICAgICAgc3VibWl0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBzdWJtaXRCdXR0b24uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgZmV0Y2goY29uZmlnLmFqYXgudHJhY2tpbmdfaW5mby5lbmRwb2ludCwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgbm9uY2U6IGNvbmZpZy5hamF4LnRyYWNraW5nX2luZm8ubm9uY2UsXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uX2lkOiB0cmFuc2FjdGlvbklkID8gdHJhbnNhY3Rpb25JZC52YWx1ZSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHRyYWNraW5nX251bWJlcjogdHJhY2tpbmdOdW1iZXIgPyB0cmFja2luZ051bWJlci52YWx1ZSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzID8gc3RhdHVzLnZhbHVlIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY2FycmllcjogY2FycmllciA/IGNhcnJpZXIudmFsdWUgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBvcmRlcl9pZDogb3JkZXJJZCA/IG9yZGVySWQudmFsdWUgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHN1Ym1pdEJ1dHRvbiA/IHN1Ym1pdEJ1dHRvbi5kYXRhc2V0LmFjdGlvbiA6IG51bGwsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGRhdGEuZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBqUXVlcnkoIFwiPHNwYW4gY2xhc3M9J3N1Y2Nlc3MgdHJhY2tpbmctaW5mby1tZXNzYWdlJz5cIiArIGRhdGEuZGF0YS5tZXNzYWdlICsgXCI8L3NwYW4+XCIgKS5pbnNlcnRBZnRlcihzdWJtaXRCdXR0b24pO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PiBqUXVlcnkoJy50cmFja2luZy1pbmZvLW1lc3NhZ2UnKS5yZW1vdmUoKSwzMDAwKTtcblxuICAgICAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5kYXRhc2V0LmFjdGlvbiA9ICd1cGRhdGUnO1xuICAgICAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbi50ZXh0Q29udGVudCA9ICd1cGRhdGUnO1xuICAgICAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICB9LFxuKTtcbiJdLCJuYW1lcyI6WyJQYXltZW50TWV0aG9kcyIsIlBBWVBBTCIsIkNBUkRTIiwiT1hYTyIsIkNBUkRfQlVUVE9OIiwiT1JERVJfQlVUVE9OX1NFTEVDVE9SIiwiZ2V0Q3VycmVudFBheW1lbnRNZXRob2QiLCJlbCIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsInZhbHVlIiwiaXNTYXZlZENhcmRTZWxlY3RlZCIsInNhdmVkQ2FyZExpc3QiLCJhZGRFdmVudExpc3RlbmVyIiwiY29uZmlnIiwiUGF5UGFsQ29tbWVyY2VHYXRld2F5T3JkZXJUcmFja2luZ0luZm8iLCJjb25zb2xlIiwiZXJyb3IiLCJ0cmFuc2FjdGlvbklkIiwidHJhY2tpbmdOdW1iZXIiLCJzdGF0dXMiLCJjYXJyaWVyIiwib3JkZXJJZCIsInN1Ym1pdEJ1dHRvbiIsImV2ZW50Iiwic2V0QXR0cmlidXRlIiwiZmV0Y2giLCJhamF4IiwidHJhY2tpbmdfaW5mbyIsImVuZHBvaW50IiwibWV0aG9kIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJub25jZSIsInRyYW5zYWN0aW9uX2lkIiwidHJhY2tpbmdfbnVtYmVyIiwib3JkZXJfaWQiLCJhY3Rpb24iLCJkYXRhc2V0IiwidGhlbiIsInJlcyIsImpzb24iLCJkYXRhIiwic3VjY2VzcyIsIkVycm9yIiwibWVzc2FnZSIsImpRdWVyeSIsImluc2VydEFmdGVyIiwic2V0VGltZW91dCIsInJlbW92ZSIsInRleHRDb250ZW50IiwicmVtb3ZlQXR0cmlidXRlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///673\n")}},__webpack_exports__={};__webpack_modules__[673]()})();
modules/ppcp-order-tracking/carriers.php ADDED
@@ -0,0 +1,612 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The order tracking carriers.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\OrderTracking
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\OrderTracking;
11
+
12
+ use Psr\Container\ContainerInterface;
13
+
14
+ return array(
15
+ 'global' => array(
16
+ 'name' => 'Global',
17
+ 'items' => array(
18
+ 'B_TWO_C_EUROPE' => _x( 'B2C Europe', 'Name of carrier', 'woocommerce-paypal-payments' ),
19
+ 'CJ_LOGISTICS' => _x( 'CJ Logistics', 'Name of carrier', 'woocommerce-paypal-payments' ),
20
+ 'CORREOS_EXPRESS' => _x( 'Correos Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
21
+ 'DHL_ACTIVE_TRACING' => _x( 'DHL Active Tracing', 'Name of carrier', 'woocommerce-paypal-payments' ),
22
+ 'DHL_BENELUX' => _x( 'DHL Benelux', 'Name of carrier', 'woocommerce-paypal-payments' ),
23
+ 'DHL_GLOBAL_MAIL' => _x( 'DHL ecCommerce US', 'Name of carrier', 'woocommerce-paypal-payments' ),
24
+ 'DHL_GLOBAL_MAIL_ASIA' => _x( 'DHL eCommerce Asia', 'Name of carrier', 'woocommerce-paypal-payments' ),
25
+ 'DHL' => _x( 'DHL Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
26
+ 'DHL_GLOBAL_ECOMMERCE' => _x( 'DHL Global eCommerce', 'Name of carrier', 'woocommerce-paypal-payments' ),
27
+ 'DHL_PACKET' => _x( 'DHL Packet', 'Name of carrier', 'woocommerce-paypal-payments' ),
28
+ 'DPD' => _x( 'DPD Global', 'Name of carrier', 'woocommerce-paypal-payments' ),
29
+ 'DPD_LOCAL' => _x( 'DPD Local', 'Name of carrier', 'woocommerce-paypal-payments' ),
30
+ 'DPD_LOCAL_REF' => _x( 'DPD Local Reference', 'Name of carrier', 'woocommerce-paypal-payments' ),
31
+ 'DPE_EXPRESS' => _x( 'DPE Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
32
+ 'DPEX' => _x( 'DPEX Hong Kong', 'Name of carrier', 'woocommerce-paypal-payments' ),
33
+ 'DTDC_EXPRESS' => _x( 'DTDC Express Global', 'Name of carrier', 'woocommerce-paypal-payments' ),
34
+ 'ESHOPWORLD' => _x( 'EShopWorld', 'Name of carrier', 'woocommerce-paypal-payments' ),
35
+ 'FEDEX' => _x( 'FedEx', 'Name of carrier', 'woocommerce-paypal-payments' ),
36
+ 'FLYT_EXPRESS' => _x( 'FLYT Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
37
+ 'GLS' => _x( 'GLS', 'Name of carrier', 'woocommerce-paypal-payments' ),
38
+ 'IMX' => _x( 'IMX France', 'Name of carrier', 'woocommerce-paypal-payments' ),
39
+ 'INT_SUER' => _x( 'International SEUR', 'Name of carrier', 'woocommerce-paypal-payments' ),
40
+ 'LANDMARK_GLOBAL' => _x( 'Landmark Global', 'Name of carrier', 'woocommerce-paypal-payments' ),
41
+ 'MATKAHUOLTO' => _x( 'Matkahuoloto', 'Name of carrier', 'woocommerce-paypal-payments' ),
42
+ 'OMNIPARCEL' => _x( 'Omni Parcel', 'Name of carrier', 'woocommerce-paypal-payments' ),
43
+ 'ONE_WORLD' => _x( 'One World', 'Name of carrier', 'woocommerce-paypal-payments' ),
44
+ 'POSTI' => _x( 'Posti', 'Name of carrier', 'woocommerce-paypal-payments' ),
45
+ 'RABEN_GROUP' => _x( 'Raben Group', 'Name of carrier', 'woocommerce-paypal-payments' ),
46
+ 'SF_EXPRESS' => _x( 'SF EXPRESS', 'Name of carrier', 'woocommerce-paypal-payments' ),
47
+ 'SKYNET_Worldwide' => _x( 'SkyNet Worldwide Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
48
+ 'SPREADEL' => _x( 'Spreadel', 'Name of carrier', 'woocommerce-paypal-payments' ),
49
+ 'TNT' => _x( 'TNT Global', 'Name of carrier', 'woocommerce-paypal-payments' ),
50
+ 'UPS' => _x( 'UPS', 'Name of carrier', 'woocommerce-paypal-payments' ),
51
+ 'UPS_MI' => _x( 'UPS Mail Innovations', 'Name of carrier', 'woocommerce-paypal-payments' ),
52
+ 'WEBINTERPRET' => _x( 'WebInterpret', 'Name of carrier', 'woocommerce-paypal-payments' ),
53
+ ),
54
+
55
+ ),
56
+ 'AG' => array(
57
+ 'name' => _x( 'Antigua and Barbuda', 'Name of carrier country', 'woocommerce-paypal-payments' ),
58
+ 'items' => array(
59
+ 'CORREOS_AG' => _x( 'Correos Antigua and Barbuda', 'Name of carrier', 'woocommerce-paypal-payments' ),
60
+ ),
61
+ ),
62
+ 'AR' => array(
63
+ 'name' => _x( 'Argentina', 'Name of carrier country', 'woocommerce-paypal-payments' ),
64
+ 'items' => array(
65
+ 'EMIRATES_POST' => _x( 'Emirates Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
66
+ 'OCA_AR ' => _x( 'OCA Argentina', 'Name of carrier', 'woocommerce-paypal-payments' ),
67
+ ),
68
+ ),
69
+ 'AU' => array(
70
+ 'name' => _x( 'Australia', 'Name of carrier country', 'woocommerce-paypal-payments' ),
71
+ 'items' => array(
72
+ 'ADSONE' => _x( 'Adsone', 'Name of carrier', 'woocommerce-paypal-payments' ),
73
+ 'AUSTRALIA_POST' => _x( 'Australia Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
74
+ 'TOLL_AU' => _x( 'Australia Toll', 'Name of carrier', 'woocommerce-paypal-payments' ),
75
+ 'BONDS_COURIERS' => _x( 'Bonds Couriers', 'Name of carrier', 'woocommerce-paypal-payments' ),
76
+ 'COURIERS_PLEASE' => _x( 'Couriers Please', 'Name of carrier', 'woocommerce-paypal-payments' ),
77
+ 'DHL_AU' => _x( 'DHL Australia', 'Name of carrier', 'woocommerce-paypal-payments' ),
78
+ 'DTDC_AU' => _x( 'DTDC Australia', 'Name of carrier', 'woocommerce-paypal-payments' ),
79
+ 'FASTWAY_AU' => _x( 'Fastway Australia', 'Name of carrier', 'woocommerce-paypal-payments' ),
80
+ 'HUNTER_EXPRESS ' => _x( 'Hunter Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
81
+ 'SENDLE' => _x( 'Sendle', 'Name of carrier', 'woocommerce-paypal-payments' ),
82
+ 'STARTRACK' => _x( 'Star Track', 'Name of carrier', 'woocommerce-paypal-payments' ),
83
+ 'STARTRACK_EXPRESS' => _x( 'Star Track Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
84
+ 'TNT_AU ' => _x( 'TNT Australia', 'Name of carrier', 'woocommerce-paypal-payments' ),
85
+ 'TOLL' => _x( 'Toll', 'Name of carrier', 'woocommerce-paypal-payments' ),
86
+ 'UBI_LOGISTICS' => _x( 'UBI Logistics', 'Name of carrier', 'woocommerce-paypal-payments' ),
87
+ ),
88
+ ),
89
+ 'AT' => array(
90
+ 'name' => _x( 'Austria', 'Name of carrier country', 'woocommerce-paypal-payments' ),
91
+ 'items' => array(
92
+ 'AUSTRIAN_POST_EXPRESS' => _x( 'Austrian Post Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
93
+ 'AUSTRIAN_POST' => _x( 'Austrian Post Registered', 'Name of carrier', 'woocommerce-paypal-payments' ),
94
+ 'DHL_AT' => _x( 'DHL Austria', 'Name of carrier', 'woocommerce-paypal-payments' ),
95
+ ),
96
+ ),
97
+ 'BE' => array(
98
+ 'name' => _x( 'Belgium', 'Name of carrier country', 'woocommerce-paypal-payments' ),
99
+ 'items' => array(
100
+ 'BPOST' => _x( 'bpost', 'Name of carrier', 'woocommerce-paypal-payments' ),
101
+ 'BPOST_INT' => _x( 'bpost International', 'Name of carrier', 'woocommerce-paypal-payments' ),
102
+ 'MONDIAL_BE' => _x( 'Mondial Belgium', 'Name of carrier', 'woocommerce-paypal-payments' ),
103
+ 'TAXIPOST' => _x( 'TaxiPost', 'Name of carrier', 'woocommerce-paypal-payments' ),
104
+ ),
105
+ ),
106
+ 'BR' => array(
107
+ 'name' => _x( 'Brazil', 'Name of carrier country', 'woocommerce-paypal-payments' ),
108
+ 'items' => array(
109
+ 'CORREOS_BR' => _x( 'Correos Brazil', 'Name of carrier', 'woocommerce-paypal-payments' ),
110
+ 'DIRECTLOG_BR' => _x( 'Directlog', 'Name of carrier', 'woocommerce-paypal-payments' ),
111
+ ),
112
+ ),
113
+ 'BG' => array(
114
+ 'name' => _x( 'Bulgaria', 'Name of carrier country', 'woocommerce-paypal-payments' ),
115
+ 'items' => array(
116
+ 'BULGARIAN_POST' => _x( 'Bulgarian Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
117
+ ),
118
+ ),
119
+ 'CA' => array(
120
+ 'name' => _x( 'Canada', 'Name of carrier country', 'woocommerce-paypal-payments' ),
121
+ 'items' => array(
122
+ 'CANADA_POST' => _x( 'Canada Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
123
+ 'CANPAR' => _x( 'Canpar', 'Name of carrier', 'woocommerce-paypal-payments' ),
124
+ 'GREYHOUND' => _x( 'Greyhound', 'Name of carrier', 'woocommerce-paypal-payments' ),
125
+ 'LOOMIS' => _x( 'Loomis', 'Name of carrier', 'woocommerce-paypal-payments' ),
126
+ 'PUROLATOR' => _x( 'Purolator', 'Name of carrier', 'woocommerce-paypal-payments' ),
127
+ ),
128
+ ),
129
+ 'CL' => array(
130
+ 'name' => _x( 'Chile', 'Name of carrier country', 'woocommerce-paypal-payments' ),
131
+ 'items' => array(
132
+ 'CORREOS_CL' => _x( 'Correos Chile', 'Name of carrier', 'woocommerce-paypal-payments' ),
133
+ ),
134
+ ),
135
+ 'CN' => array(
136
+ 'name' => _x( 'China', 'Name of carrier country', 'woocommerce-paypal-payments' ),
137
+ 'items' => array(
138
+ 'FOUR_PX_EXPRESS' => _x( 'Correos', 'Name of carrier', 'woocommerce-paypal-payments' ),
139
+ 'AUPOST_CN' => _x( 'AUPOST CHINA', 'Name of carrier', 'woocommerce-paypal-payments' ),
140
+ 'BQC_EXPRESS' => _x( 'BQC Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
141
+ 'BUYLOGIC' => _x( 'Buylogic', 'Name of carrier', 'woocommerce-paypal-payments' ),
142
+ 'CHINA_POST' => _x( 'China Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
143
+ 'CNEXPS' => _x( 'CN Exps', 'Name of carrier', 'woocommerce-paypal-payments' ),
144
+ 'EC_CN' => _x( 'EC China', 'Name of carrier', 'woocommerce-paypal-payments' ),
145
+ 'EFS' => _x( 'EFS', 'Name of carrier', 'woocommerce-paypal-payments' ),
146
+ 'EMPS_CN' => _x( 'EMPS China', 'Name of carrier', 'woocommerce-paypal-payments' ),
147
+ 'EMS_CN' => _x( 'EMS China', 'Name of carrier', 'woocommerce-paypal-payments' ),
148
+ 'HUAHAN_EXPRESS' => _x( 'Huahan Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
149
+ 'SFC_EXPRESS' => _x( 'SFC Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
150
+ 'TNT_CN' => _x( 'TNT China', 'Name of carrier', 'woocommerce-paypal-payments' ),
151
+ 'WINIT' => _x( 'WinIt', 'Name of carrier', 'woocommerce-paypal-payments' ),
152
+ 'YANWEN_CN' => _x( 'Yanwen', 'Name of carrier', 'woocommerce-paypal-payments' ),
153
+ ),
154
+ ),
155
+ 'CR' => array(
156
+ 'name' => _x( 'Costa Rica', 'Name of carrier country', 'woocommerce-paypal-payments' ),
157
+ 'items' => array(
158
+ 'CORREOS_CR' => _x( 'Correos De Costa Rica', 'Name of carrier', 'woocommerce-paypal-payments' ),
159
+ ),
160
+ ),
161
+ 'HR' => array(
162
+ 'name' => _x( 'Croatia', 'Name of carrier country', 'woocommerce-paypal-payments' ),
163
+ 'items' => array(
164
+ 'HRVATSKA_HR' => _x( 'Hrvatska', 'Name of carrier', 'woocommerce-paypal-payments' ),
165
+ ),
166
+ ),
167
+ 'CY' => array(
168
+ 'name' => _x( 'Cyprus', 'Name of carrier country', 'woocommerce-paypal-payments' ),
169
+ 'items' => array(
170
+ 'CYPRUS_POST_CYP' => _x( 'Cyprus Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
171
+ ),
172
+ ),
173
+ 'CZ' => array(
174
+ 'name' => _x( 'Czech Republic', 'Name of carrier country', 'woocommerce-paypal-payments' ),
175
+ 'items' => array(
176
+ 'CESKA_CZ' => _x( 'Ceska', 'Name of carrier', 'woocommerce-paypal-payments' ),
177
+ 'GLS_CZ' => _x( 'GLS Czech Republic', 'Name of carrier', 'woocommerce-paypal-payments' ),
178
+ ),
179
+ ),
180
+ 'FR' => array(
181
+ 'name' => _x( 'France', 'Name of carrier country', 'woocommerce-paypal-payments' ),
182
+ 'items' => array(
183
+ 'BERT' => _x( 'BERT TRANSPORT', 'Name of carrier', 'woocommerce-paypal-payments' ),
184
+ 'CHRONOPOST_FR' => _x( 'Chronopost France', 'Name of carrier', 'woocommerce-paypal-payments' ),
185
+ 'COLIPOSTE' => _x( 'Coliposte', 'Name of carrier', 'woocommerce-paypal-payments' ),
186
+ 'COLIS' => _x( 'Colis France', 'Name of carrier', 'woocommerce-paypal-payments' ),
187
+ 'DHL_FR' => _x( 'DHL France', 'Name of carrier', 'woocommerce-paypal-payments' ),
188
+ 'DPD_FR' => _x( 'DPD France', 'Name of carrier', 'woocommerce-paypal-payments' ),
189
+ 'GEODIS' => _x( 'GEODIS - Distribution & Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
190
+ 'GLS_FR' => _x( 'GLS France', 'Name of carrier', 'woocommerce-paypal-payments' ),
191
+ 'LAPOSTE' => _x( 'LA Poste', 'Name of carrier', 'woocommerce-paypal-payments' ),
192
+ 'MONDIAL' => _x( 'Mondial Relay', 'Name of carrier', 'woocommerce-paypal-payments' ),
193
+ 'RELAIS_COLIS_FR' => _x( 'Relais Colis', 'Name of carrier', 'woocommerce-paypal-payments' ),
194
+ 'TELIWAY' => _x( 'Teliway', 'Name of carrier', 'woocommerce-paypal-payments' ),
195
+ 'TNT_FR' => _x( 'TNT France', 'Name of carrier', 'woocommerce-paypal-payments' ),
196
+ ),
197
+ ),
198
+ 'DE' => array(
199
+ 'name' => _x( 'Germany', 'Name of carrier country', 'woocommerce-paypal-payments' ),
200
+ 'items' => array(
201
+ 'ASENDIA_DE' => _x( 'Asendia Germany', 'Name of carrier', 'woocommerce-paypal-payments' ),
202
+ 'DELTEC_DE' => _x( 'Deltec Germany', 'Name of carrier', 'woocommerce-paypal-payments' ),
203
+ 'DEUTSCHE_DE' => _x( 'Deutsche', 'Name of carrier', 'woocommerce-paypal-payments' ),
204
+ 'DHL_DEUTSCHE_POST' => _x( 'DHL Deutsche Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
205
+ 'DPD_DE' => _x( 'DPD Germany', 'Name of carrier', 'woocommerce-paypal-payments' ),
206
+ 'GLS_DE' => _x( 'GLS Germany', 'Name of carrier', 'woocommerce-paypal-payments' ),
207
+ 'HERMES_DE' => _x( 'Hermes Germany', 'Name of carrier', 'woocommerce-paypal-payments' ),
208
+ 'TNT_DE' => _x( 'TNT Germany', 'Name of carrier', 'woocommerce-paypal-payments' ),
209
+ ),
210
+ ),
211
+ 'GR' => array(
212
+ 'name' => _x( 'Greece', 'Name of carrier country', 'woocommerce-paypal-payments' ),
213
+ 'items' => array(
214
+ 'ELTA_GR' => _x( 'ELTA Greece', 'Name of carrier', 'woocommerce-paypal-payments' ),
215
+ 'GENIKI_GR' => _x( 'Geniki Greece', 'Name of carrier', 'woocommerce-paypal-payments' ),
216
+ 'ACS_GR' => _x( 'GRC Greece', 'Name of carrier', 'woocommerce-paypal-payments' ),
217
+ ),
218
+ ),
219
+ 'HK' => array(
220
+ 'name' => _x( 'Hong Kong', 'Name of carrier country', 'woocommerce-paypal-payments' ),
221
+ 'items' => array(
222
+ 'ASENDIA_HK' => _x( 'Asendia Hong Kong', 'Name of carrier', 'woocommerce-paypal-payments' ),
223
+ 'DHL_HK' => _x( 'DHL Hong Kong', 'Name of carrier', 'woocommerce-paypal-payments' ),
224
+ 'DPD_HK' => _x( 'DPD Hong Kong', 'Name of carrier', 'woocommerce-paypal-payments' ),
225
+ 'HK_POST' => _x( 'Hong Kong Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
226
+ 'KERRY_EXPRESS_HK' => _x( 'Kerry Express Hong Kong', 'Name of carrier', 'woocommerce-paypal-payments' ),
227
+ 'LOGISTICSWORLDWIDE_HK' => _x( 'Logistics Worldwide Hong Kong', 'Name of carrier', 'woocommerce-paypal-payments' ),
228
+ 'QUANTIUM' => _x( 'Quantium', 'Name of carrier', 'woocommerce-paypal-payments' ),
229
+ 'SEKOLOGISTICS' => _x( 'Seko Logistics', 'Name of carrier', 'woocommerce-paypal-payments' ),
230
+ 'TAQBIN_HK' => _x( 'TA-Q-BIN Parcel Hong Kong', 'Name of carrier', 'woocommerce-paypal-payments' ),
231
+ ),
232
+ ),
233
+ 'HU' => array(
234
+ 'name' => _x( 'Hungary', 'Name of carrier country', 'woocommerce-paypal-payments' ),
235
+ 'items' => array(
236
+ 'MAGYAR_HU' => _x( 'Magyar', 'Name of carrier', 'woocommerce-paypal-payments' ),
237
+ ),
238
+ ),
239
+ 'IS' => array(
240
+ 'name' => _x( 'Iceland', 'Name of carrier country', 'woocommerce-paypal-payments' ),
241
+ 'items' => array(
242
+ 'POSTUR_IS' => _x( 'Postur', 'Name of carrier', 'woocommerce-paypal-payments' ),
243
+ ),
244
+ ),
245
+ 'IN' => array(
246
+ 'name' => _x( 'India', 'Name of carrier country', 'woocommerce-paypal-payments' ),
247
+ 'items' => array(
248
+ 'BLUEDART' => _x( 'Bluedart', 'Name of carrier', 'woocommerce-paypal-payments' ),
249
+ 'DELHIVERY_IN' => _x( 'Delhivery', 'Name of carrier', 'woocommerce-paypal-payments' ),
250
+ 'DOTZOT' => _x( 'DotZot', 'Name of carrier', 'woocommerce-paypal-payments' ),
251
+ 'DTDC_IN' => _x( 'DTDC India', 'Name of carrier', 'woocommerce-paypal-payments' ),
252
+ 'EKART' => _x( 'Ekart', 'Name of carrier', 'woocommerce-paypal-payments' ),
253
+ 'INDIA_POST' => _x( 'India Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
254
+ 'PROFESSIONAL_COURIERS' => _x( 'Professional Couriers', 'Name of carrier', 'woocommerce-paypal-payments' ),
255
+ 'REDEXPRESS' => _x( 'Red Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
256
+ 'SWIFTAIR' => _x( 'Swift Air', 'Name of carrier', 'woocommerce-paypal-payments' ),
257
+ 'XPRESSBEES' => _x( 'Xpress Bees', 'Name of carrier', 'woocommerce-paypal-payments' ),
258
+ ),
259
+ ),
260
+ 'ID' => array(
261
+ 'name' => _x( 'Indonesia', 'Name of carrier country', 'woocommerce-paypal-payments' ),
262
+ 'items' => array(
263
+ 'FIRST_LOGISITCS' => _x( 'First Logistics', 'Name of carrier', 'woocommerce-paypal-payments' ),
264
+ 'JNE_IDN' => _x( 'JNE Indonesia', 'Name of carrier', 'woocommerce-paypal-payments' ),
265
+ 'LION_PARCEL' => _x( 'Lion Parcel', 'Name of carrier', 'woocommerce-paypal-payments' ),
266
+ 'NINJAVAN_ID' => _x( 'Ninjavan Indonesia', 'Name of carrier', 'woocommerce-paypal-payments' ),
267
+ 'PANDU' => _x( 'Pandu Logistics', 'Name of carrier', 'woocommerce-paypal-payments' ),
268
+ 'POS_ID' => _x( 'Pos Indonesia Domestic', 'Name of carrier', 'woocommerce-paypal-payments' ),
269
+ 'POS_INT' => _x( 'Pos Indonesia International', 'Name of carrier', 'woocommerce-paypal-payments' ),
270
+ 'RPX_ID' => _x( 'RPX Indonesia', 'Name of carrier', 'woocommerce-paypal-payments' ),
271
+ 'RPX' => _x( 'RPX International', 'Name of carrier', 'woocommerce-paypal-payments' ),
272
+ 'TIKI_ID' => _x( 'Tiki', 'Name of carrier', 'woocommerce-paypal-payments' ),
273
+ 'WAHANA_ID' => _x( 'Wahana', 'Name of carrier', 'woocommerce-paypal-payments' ),
274
+ ),
275
+ ),
276
+ 'IE' => array(
277
+ 'name' => _x( 'Ireland', 'Name of carrier country', 'woocommerce-paypal-payments' ),
278
+ 'items' => array(
279
+ 'AN_POST' => _x( 'AN POST Ireland', 'Name of carrier', 'woocommerce-paypal-payments' ),
280
+ 'DPD_IR' => _x( 'DPD Ireland', 'Name of carrier', 'woocommerce-paypal-payments' ),
281
+ 'MASTERLINK' => _x( 'Masterlink', 'Name of carrier', 'woocommerce-paypal-payments' ),
282
+ 'TPG' => _x( 'TPG', 'Name of carrier', 'woocommerce-paypal-payments' ),
283
+ 'WISELOADS' => _x( 'Wiseloads', 'Name of carrier', 'woocommerce-paypal-payments' ),
284
+ ),
285
+ ),
286
+ 'IL' => array(
287
+ 'name' => _x( 'Israel', 'Name of carrier country', 'woocommerce-paypal-payments' ),
288
+ 'items' => array(
289
+ 'ISRAEL_POST' => _x( 'Israel Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
290
+ ),
291
+ ),
292
+ 'IT' => array(
293
+ 'name' => _x( 'Italy', 'Name of carrier country', 'woocommerce-paypal-payments' ),
294
+ 'items' => array(
295
+ 'BRT_IT' => _x( 'BRT Bartolini', 'Name of carrier', 'woocommerce-paypal-payments' ),
296
+ 'DHL_IT' => _x( 'DHL Italy', 'Name of carrier', 'woocommerce-paypal-payments' ),
297
+ 'DMM_NETWORK' => _x( 'DMM Network', 'Name of carrier', 'woocommerce-paypal-payments' ),
298
+ 'FERCAM_IT' => _x( 'FERCAM Logistics & Transport', 'Name of carrier', 'woocommerce-paypal-payments' ),
299
+ 'GLS_IT' => _x( 'GLS Italy', 'Name of carrier', 'woocommerce-paypal-payments' ),
300
+ 'HERMES_IT' => _x( 'Hermes Italy', 'Name of carrier', 'woocommerce-paypal-payments' ),
301
+ 'POSTE_ITALIANE' => _x( 'Poste Italiane', 'Name of carrier', 'woocommerce-paypal-payments' ),
302
+ 'REGISTER_MAIL_IT' => _x( 'Register Mail IT', 'Name of carrier', 'woocommerce-paypal-payments' ),
303
+ 'SDA_IT' => _x( 'SDA Italy', 'Name of carrier', 'woocommerce-paypal-payments' ),
304
+ 'SGT_IT' => _x( 'SGT Corriere Espresso', 'Name of carrier', 'woocommerce-paypal-payments' ),
305
+ 'TNT_CLICK_IT' => _x( 'TNT Click Italy', 'Name of carrier', 'woocommerce-paypal-payments' ),
306
+ 'TNT_IT' => _x( 'TNT Italy', 'Name of carrier', 'woocommerce-paypal-payments' ),
307
+ ),
308
+ ),
309
+ 'JP' => array(
310
+ 'name' => _x( 'Japan', 'Name of carrier country', 'woocommerce-paypal-payments' ),
311
+ 'items' => array(
312
+ 'DHL_JP' => _x( 'DHL Japan', 'Name of carrier', 'woocommerce-paypal-payments' ),
313
+ 'JP_POST' => _x( 'JP Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
314
+ 'JAPAN_POST' => _x( 'Japan Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
315
+ 'POCZTEX' => _x( 'Pocztex', 'Name of carrier', 'woocommerce-paypal-payments' ),
316
+ 'SAGAWA' => _x( 'Sagawa', 'Name of carrier', 'woocommerce-paypal-payments' ),
317
+ 'SAGAWA_JP' => _x( 'Sagawa JP', 'Name of carrier', 'woocommerce-paypal-payments' ),
318
+ 'TNT_JP' => _x( 'TNT Japan', 'Name of carrier', 'woocommerce-paypal-payments' ),
319
+ 'YAMATO' => _x( 'Yamato Japan', 'Name of carrier', 'woocommerce-paypal-payments' ),
320
+ ),
321
+ ),
322
+ 'KR' => array(
323
+ 'name' => _x( 'Korea', 'Name of carrier country', 'woocommerce-paypal-payments' ),
324
+ 'items' => array(
325
+ 'ECARGO' => _x( 'Ecargo', 'Name of carrier', 'woocommerce-paypal-payments' ),
326
+ 'EPARCEL_KR' => _x( 'eParcel Korea', 'Name of carrier', 'woocommerce-paypal-payments' ),
327
+ 'KOREA_POST' => _x( 'Korea Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
328
+ 'KOR_KOREA_POST' => _x( 'KOR Korea Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
329
+ 'CJ_KR' => _x( 'Korea Thai CJ', 'Name of carrier', 'woocommerce-paypal-payments' ),
330
+ 'LOGISTICSWORLDWIDE_KR' => _x( 'Logistics Worldwide Korea', 'Name of carrier', 'woocommerce-paypal-payments' ),
331
+ 'PANTOS' => _x( 'Pantos', 'Name of carrier', 'woocommerce-paypal-payments' ),
332
+ 'RINCOS' => _x( 'Rincos', 'Name of carrier', 'woocommerce-paypal-payments' ),
333
+ 'ROCKET_PARCEL' => _x( 'Rocket Parcel International', 'Name of carrier', 'woocommerce-paypal-payments' ),
334
+ 'SRE_KOREA' => _x( 'SRE Korea', 'Name of carrier', 'woocommerce-paypal-payments' ),
335
+ ),
336
+ ),
337
+ 'LT' => array(
338
+ 'name' => _x( 'Lithuania', 'Name of carrier country', 'woocommerce-paypal-payments' ),
339
+ 'items' => array(
340
+ 'LIETUVOS_LT' => _x( 'Lietuvos Pastas', 'Name of carrier', 'woocommerce-paypal-payments' ),
341
+ ),
342
+ ),
343
+ 'MY' => array(
344
+ 'name' => _x( 'Malaysia', 'Name of carrier country', 'woocommerce-paypal-payments' ),
345
+ 'items' => array(
346
+ 'AIRPAK_MY' => _x( 'Airpak', 'Name of carrier', 'woocommerce-paypal-payments' ),
347
+ 'CITYLINK_MY' => _x( 'CityLink Malaysia', 'Name of carrier', 'woocommerce-paypal-payments' ),
348
+ 'CJ_MY' => _x( 'CJ Malaysia', 'Name of carrier', 'woocommerce-paypal-payments' ),
349
+ 'CJ_INT_MY' => _x( 'CJ Malaysia International', 'Name of carrier', 'woocommerce-paypal-payments' ),
350
+ 'CUCKOOEXPRESS' => _x( 'Cuckoo Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
351
+ 'JETSHIP_MY' => _x( 'Jet Ship Malaysia', 'Name of carrier', 'woocommerce-paypal-payments' ),
352
+ 'KANGAROO_MY' => _x( 'Kangaroo Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
353
+ 'LOGISTICSWORLDWIDE_MY' => _x( 'Logistics Worldwide Malaysia', 'Name of carrier', 'woocommerce-paypal-payments' ),
354
+ 'MALAYSIA_POST' => _x( 'Malaysia Post EMS / Pos Laju', 'Name of carrier', 'woocommerce-paypal-payments' ),
355
+ 'NATIONWIDE' => _x( 'Nationwide', 'Name of carrier', 'woocommerce-paypal-payments' ),
356
+ 'NINJAVAN_MY' => _x( 'Ninjavan Malaysia', 'Name of carrier', 'woocommerce-paypal-payments' ),
357
+ 'SKYNET_MY' => _x( 'Skynet Malaysia', 'Name of carrier', 'woocommerce-paypal-payments' ),
358
+ 'TAQBIN_MY' => _x( 'TA-Q-BIN Parcel Malaysia', 'Name of carrier', 'woocommerce-paypal-payments' ),
359
+ ),
360
+ ),
361
+ 'MX' => array(
362
+ 'name' => _x( 'Mexico', 'Name of carrier country', 'woocommerce-paypal-payments' ),
363
+ 'items' => array(
364
+ 'CORREOS_MX' => _x( 'Correos De Mexico', 'Name of carrier', 'woocommerce-paypal-payments' ),
365
+ 'ESTAFETA' => _x( 'Estafeta', 'Name of carrier', 'woocommerce-paypal-payments' ),
366
+ 'AEROFLASH' => _x( 'Mexico Aeroflash', 'Name of carrier', 'woocommerce-paypal-payments' ),
367
+ 'REDPACK' => _x( 'Mexico Redpack', 'Name of carrier', 'woocommerce-paypal-payments' ),
368
+ 'SENDA_MX' => _x( 'Mexico Senda Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
369
+ ),
370
+ ),
371
+ 'NL' => array(
372
+ 'name' => _x( 'Netherlands', 'Name of carrier country', 'woocommerce-paypal-payments' ),
373
+ 'items' => array(
374
+ 'DHL_NL' => _x( 'DHL Netherlands', 'Name of carrier', 'woocommerce-paypal-payments' ),
375
+ 'DHL_PARCEL_NL' => _x( 'DHL Parcel Netherlands', 'Name of carrier', 'woocommerce-paypal-payments' ),
376
+ 'GLS_NL' => _x( 'GLS Netherlands', 'Name of carrier', 'woocommerce-paypal-payments' ),
377
+ 'KIALA' => _x( 'Kiala', 'Name of carrier', 'woocommerce-paypal-payments' ),
378
+ 'POSTNL' => _x( 'PostNL', 'Name of carrier', 'woocommerce-paypal-payments' ),
379
+ 'POSTNL_INT' => _x( 'PostNl International', 'Name of carrier', 'woocommerce-paypal-payments' ),
380
+ 'POSTNL_INT_3_S' => _x( 'PostNL International 3S', 'Name of carrier', 'woocommerce-paypal-payments' ),
381
+ 'TNT_NL' => _x( 'TNT Netherlands', 'Name of carrier', 'woocommerce-paypal-payments' ),
382
+ 'TRANSMISSION' => _x( 'Transmission Netherlands', 'Name of carrier', 'woocommerce-paypal-payments' ),
383
+ ),
384
+ ),
385
+ 'NZ' => array(
386
+ 'name' => _x( 'New Zealand', 'Name of carrier country', 'woocommerce-paypal-payments' ),
387
+ 'items' => array(
388
+ 'COURIER_POST' => _x( 'Courier Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
389
+ 'FASTWAY_NZ' => _x( 'Fastway New Zealand', 'Name of carrier', 'woocommerce-paypal-payments' ),
390
+ 'NZ_POST' => _x( 'New Zealand Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
391
+ 'TOLL_IPEC' => _x( 'Toll IPEC', 'Name of carrier', 'woocommerce-paypal-payments' ),
392
+ ),
393
+ ),
394
+ 'NG' => array(
395
+ 'name' => _x( 'Nigeria', 'Name of carrier country', 'woocommerce-paypal-payments' ),
396
+ 'items' => array(
397
+ 'COURIERPLUS' => _x( 'Courier Plus', 'Name of carrier', 'woocommerce-paypal-payments' ),
398
+ 'NIPOST_NG' => _x( 'NiPost', 'Name of carrier', 'woocommerce-paypal-payments' ),
399
+ ),
400
+ ),
401
+ 'NO' => array(
402
+ 'name' => _x( 'Norway', 'Name of carrier country', 'woocommerce-paypal-payments' ),
403
+ 'items' => array(
404
+ 'POSTEN_NORGE' => _x( 'Posten Norge', 'Name of carrier', 'woocommerce-paypal-payments' ),
405
+ ),
406
+ ),
407
+ 'PH' => array(
408
+ 'name' => _x( 'Philippines', 'Name of carrier country', 'woocommerce-paypal-payments' ),
409
+ 'items' => array(
410
+ 'TWO_GO' => _x( '2GO', 'Name of carrier', 'woocommerce-paypal-payments' ),
411
+ 'AIR_21' => _x( 'Air 21', 'Name of carrier', 'woocommerce-paypal-payments' ),
412
+ 'AIRSPEED' => _x( 'Airspeed', 'Name of carrier', 'woocommerce-paypal-payments' ),
413
+ 'JAMEXPRESS_PH' => _x( 'Jam Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
414
+ 'LBC_PH' => _x( 'LBC Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
415
+ 'NINJAVAN_PH' => _x( 'Ninjavan Philippines', 'Name of carrier', 'woocommerce-paypal-payments' ),
416
+ 'RAF_PH' => _x( 'RAF Philippines', 'Name of carrier', 'woocommerce-paypal-payments' ),
417
+ 'XEND_EXPRESS_PH' => _x( 'Xend Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
418
+ ),
419
+ ),
420
+ 'PL' => array(
421
+ 'name' => _x( 'Poland', 'Name of carrier country', 'woocommerce-paypal-payments' ),
422
+ 'items' => array(
423
+ 'DHL_PL' => _x( 'DHL Poland', 'Name of carrier', 'woocommerce-paypal-payments' ),
424
+ 'DPD_PL' => _x( 'DPD Poland', 'Name of carrier', 'woocommerce-paypal-payments' ),
425
+ 'INPOST_PACZKOMATY' => _x( 'InPost Paczkomaty', 'Name of carrier', 'woocommerce-paypal-payments' ),
426
+ 'POCZTA_POLSKA' => _x( 'Poczta Polska', 'Name of carrier', 'woocommerce-paypal-payments' ),
427
+ 'SIODEMKA' => _x( 'Siodemka', 'Name of carrier', 'woocommerce-paypal-payments' ),
428
+ 'TNT_PL' => _x( 'TNT Poland', 'Name of carrier', 'woocommerce-paypal-payments' ),
429
+ ),
430
+ ),
431
+ 'PT' => array(
432
+ 'name' => _x( 'Portugal', 'Name of carrier country', 'woocommerce-paypal-payments' ),
433
+ 'items' => array(
434
+ 'ADICIONAL_PT' => _x( 'Adicional Logistics', 'Name of carrier', 'woocommerce-paypal-payments' ),
435
+ 'CHRONOPOST_PT' => _x( 'Chronopost Portugal', 'Name of carrier', 'woocommerce-paypal-payments' ),
436
+ 'CTT_PT' => _x( 'Portugal PTT', 'Name of carrier', 'woocommerce-paypal-payments' ),
437
+ 'SEUR_PT' => _x( 'Portugal Seur', 'Name of carrier', 'woocommerce-paypal-payments' ),
438
+ ),
439
+ ),
440
+ 'RO' => array(
441
+ 'name' => _x( 'Romania', 'Name of carrier country', 'woocommerce-paypal-payments' ),
442
+ 'items' => array(
443
+ 'DPD_RO' => _x( 'DPD Romania', 'Name of carrier', 'woocommerce-paypal-payments' ),
444
+ 'POSTA_RO' => _x( 'Postaromana', 'Name of carrier', 'woocommerce-paypal-payments' ),
445
+ ),
446
+ ),
447
+ 'RU' => array(
448
+ 'name' => _x( 'Russia', 'Name of carrier country', 'woocommerce-paypal-payments' ),
449
+ 'items' => array(
450
+ 'DPD_RU' => _x( 'DPD Russia', 'Name of carrier', 'woocommerce-paypal-payments' ),
451
+ 'RUSSIAN_POST' => _x( 'Russian Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
452
+ ),
453
+ ),
454
+ 'SA' => array(
455
+ 'name' => _x( 'Saudi Arabia', 'Name of carrier country', 'woocommerce-paypal-payments' ),
456
+ 'items' => array(
457
+ 'DAWN_WING' => _x( 'Dawn Wing', 'Name of carrier', 'woocommerce-paypal-payments' ),
458
+ 'RAM' => _x( 'Ram', 'Name of carrier', 'woocommerce-paypal-payments' ),
459
+ 'THE_COURIER_GUY' => _x( 'The Courier Guy', 'Name of carrier', 'woocommerce-paypal-payments' ),
460
+ ),
461
+ ),
462
+ 'CS' => array(
463
+ 'name' => _x( 'Serbia', 'Name of carrier country', 'woocommerce-paypal-payments' ),
464
+ 'items' => array(
465
+ 'POST_SERBIA_CS' => _x( 'Serbia Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
466
+ ),
467
+ ),
468
+ 'SG' => array(
469
+ 'name' => _x( 'Singapore', 'Name of carrier country', 'woocommerce-paypal-payments' ),
470
+ 'items' => array(
471
+ 'DHL_SG' => _x( 'DHL Singapore', 'Name of carrier', 'woocommerce-paypal-payments' ),
472
+ 'JETSHIP_SG' => _x( 'JetShip Singapore', 'Name of carrier', 'woocommerce-paypal-payments' ),
473
+ 'NINJAVAN_SG' => _x( 'Ninjavan Singapore', 'Name of carrier', 'woocommerce-paypal-payments' ),
474
+ 'PARCELPOST_SG' => _x( 'Parcel Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
475
+ 'SINGPOST' => _x( 'Singapore Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
476
+ 'TAQBIN_SG' => _x( 'TA-Q-BIN Parcel Singapore', 'Name of carrier', 'woocommerce-paypal-payments' ),
477
+ ),
478
+ ),
479
+ 'ZA' => array(
480
+ 'name' => _x( 'South Africa', 'Name of carrier country', 'woocommerce-paypal-payments' ),
481
+ 'items' => array(
482
+ 'FASTWAY_ZA' => _x( 'Fastway South Africa', 'Name of carrier', 'woocommerce-paypal-payments' ),
483
+ ),
484
+ ),
485
+ 'ES' => array(
486
+ 'name' => _x( 'Spain', 'Name of carrier country', 'woocommerce-paypal-payments' ),
487
+ 'items' => array(
488
+ 'ASM_ES' => _x( 'ASM', 'Name of carrier', 'woocommerce-paypal-payments' ),
489
+ 'CBL_LOGISTICA' => _x( 'CBL Logistics', 'Name of carrier', 'woocommerce-paypal-payments' ),
490
+ 'CORREOS_ES' => _x( 'Correos De Spain', 'Name of carrier', 'woocommerce-paypal-payments' ),
491
+ 'DHL_ES ' => _x( 'DHL Spain', 'Name of carrier', 'woocommerce-paypal-payments' ),
492
+ 'DHL_PARCEL_ES' => _x( 'DHL Parcel Spain', 'Name of carrier', 'woocommerce-paypal-payments' ),
493
+ 'GLS_ES' => _x( 'GLS Spain', 'Name of carrier', 'woocommerce-paypal-payments' ),
494
+ 'INT_SEUR' => _x( 'International Suer', 'Name of carrier', 'woocommerce-paypal-payments' ),
495
+ 'ITIS' => _x( 'ITIS', 'Name of carrier', 'woocommerce-paypal-payments' ),
496
+ 'NACEX_ES' => _x( 'Nacex Spain', 'Name of carrier', 'woocommerce-paypal-payments' ),
497
+ 'REDUR_ES' => _x( 'Redur Spain', 'Name of carrier', 'woocommerce-paypal-payments' ),
498
+ 'SEUR_ES' => _x( 'Spanish Seur', 'Name of carrier', 'woocommerce-paypal-payments' ),
499
+ 'TNT_ES' => _x( 'TNT Spain', 'Name of carrier', 'woocommerce-paypal-payments' ),
500
+ ),
501
+ ),
502
+ 'SE' => array(
503
+ 'name' => _x( 'Sweden', 'Name of carrier country', 'woocommerce-paypal-payments' ),
504
+ 'items' => array(
505
+ 'DBSCHENKER_SE' => _x( 'DB Schenker Sweden', 'Name of carrier', 'woocommerce-paypal-payments' ),
506
+ 'DIRECTLINK_SE' => _x( 'DirectLink Sweden', 'Name of carrier', 'woocommerce-paypal-payments' ),
507
+ 'POSTNORD_LOGISTICS_GLOBAL' => _x( 'PostNord Logistics', 'Name of carrier', 'woocommerce-paypal-payments' ),
508
+ 'POSTNORD_LOGISTICS_DK' => _x( 'PostNord Logistics Denmark', 'Name of carrier', 'woocommerce-paypal-payments' ),
509
+ 'POSTNORD_LOGISTICS_SE' => _x( 'PostNord Logistics Sweden', 'Name of carrier', 'woocommerce-paypal-payments' ),
510
+ ),
511
+ ),
512
+ 'CH' => array(
513
+ 'name' => _x( 'Switzerland', 'Name of carrier country', 'woocommerce-paypal-payments' ),
514
+ 'items' => array(
515
+ 'SWISS_POST' => _x( 'Swiss Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
516
+ ),
517
+ ),
518
+ 'TW' => array(
519
+ 'name' => _x( 'Taiwan', 'Name of carrier country', 'woocommerce-paypal-payments' ),
520
+ 'items' => array(
521
+ 'CHUNGHWA_POST' => _x( 'Chunghwa Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
522
+ 'TAIWAN_POST_TW' => _x( 'Taiwan Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
523
+ ),
524
+ ),
525
+ 'TH' => array(
526
+ 'name' => _x( 'Thailand', 'Name of carrier country', 'woocommerce-paypal-payments' ),
527
+ 'items' => array(
528
+ 'ACOMMMERCE' => _x( 'Acommerce', 'Name of carrier', 'woocommerce-paypal-payments' ),
529
+ 'ALPHAFAST' => _x( 'Alphafast', 'Name of carrier', 'woocommerce-paypal-payments' ),
530
+ 'CJ_TH' => _x( 'CJ Thailand', 'Name of carrier', 'woocommerce-paypal-payments' ),
531
+ 'FASTRACK' => _x( 'FastTrack Thailand', 'Name of carrier', 'woocommerce-paypal-payments' ),
532
+ 'KERRY_EXPRESS_TH' => _x( 'Kerry Express Thailand', 'Name of carrier', 'woocommerce-paypal-payments' ),
533
+ 'NIM_EXPRESS' => _x( 'NIM Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
534
+ 'NINJAVAN_THAI' => _x( 'Ninjavan Thailand', 'Name of carrier', 'woocommerce-paypal-payments' ),
535
+ 'SENDIT' => _x( 'SendIt', 'Name of carrier', 'woocommerce-paypal-payments' ),
536
+ 'THAILAND_POST' => _x( 'Thailand Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
537
+ ),
538
+ ),
539
+ 'TR' => array(
540
+ 'name' => _x( 'Turkey', 'Name of carrier country', 'woocommerce-paypal-payments' ),
541
+ 'items' => array(
542
+ 'PTT_POST' => _x( 'PTT Posta', 'Name of carrier', 'woocommerce-paypal-payments' ),
543
+ ),
544
+ ),
545
+ 'UA' => array(
546
+ 'name' => _x( 'Ukraine', 'Name of carrier country', 'woocommerce-paypal-payments' ),
547
+ 'items' => array(
548
+ 'NOVA_POSHTA' => _x( 'Nova Poshta', 'Name of carrier', 'woocommerce-paypal-payments' ),
549
+ 'NOVA_POSHTA_INT' => _x( 'Nova Poshta International', 'Name of carrier', 'woocommerce-paypal-payments' ),
550
+ ),
551
+ ),
552
+ 'AE' => array(
553
+ 'name' => _x( 'United Arab Emirates', 'Name of carrier country', 'woocommerce-paypal-payments' ),
554
+ 'items' => array(
555
+ 'AXL' => _x( 'AXL Express & Logistics', 'Name of carrier', 'woocommerce-paypal-payments' ),
556
+ 'CONTINENTAL' => _x( 'Continental', 'Name of carrier', 'woocommerce-paypal-payments' ),
557
+ 'SKYNET_UAE' => _x( 'Skynet Worldwide Express UAE', 'Name of carrier', 'woocommerce-paypal-payments' ),
558
+ ),
559
+ ),
560
+ 'GB' => array(
561
+ 'name' => _x( 'United Kingdom', 'Name of carrier country', 'woocommerce-paypal-payments' ),
562
+ 'items' => array(
563
+ 'AIRBORNE_EXPRESS_UK' => _x( 'Airborne Express UK', 'Name of carrier', 'woocommerce-paypal-payments' ),
564
+ 'AIRSURE' => _x( 'Airsure', 'Name of carrier', 'woocommerce-paypal-payments' ),
565
+ 'APC_OVERNIGHT' => _x( 'APC Overnight', 'Name of carrier', 'woocommerce-paypal-payments' ),
566
+ 'ASENDIA_UK' => _x( 'Asendia UK', 'Name of carrier', 'woocommerce-paypal-payments' ),
567
+ 'COLLECTPLUS' => _x( 'CollectPlus', 'Name of carrier', 'woocommerce-paypal-payments' ),
568
+ 'DELTEC_UK' => _x( 'Deltec UK', 'Name of carrier', 'woocommerce-paypal-payments' ),
569
+ 'DHL_UK' => _x( 'DHL UK', 'Name of carrier', 'woocommerce-paypal-payments' ),
570
+ 'DPD_DELISTRACK' => _x( 'DPD Delistrack', 'Name of carrier', 'woocommerce-paypal-payments' ),
571
+ 'DPD_UK' => _x( 'DPD UK', 'Name of carrier', 'woocommerce-paypal-payments' ),
572
+ 'FASTWAY_UK' => _x( 'Fastway UK', 'Name of carrier', 'woocommerce-paypal-payments' ),
573
+ 'HERMESWORLD_UK' => _x( 'HermesWorld', 'Name of carrier', 'woocommerce-paypal-payments' ),
574
+ 'INTERLINK' => _x( 'Interlink Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
575
+ 'MYHERMES' => _x( 'MyHermes UK', 'Name of carrier', 'woocommerce-paypal-payments' ),
576
+ 'NIGHTLINE_UK' => _x( 'Nightline UK', 'Name of carrier', 'woocommerce-paypal-payments' ),
577
+ 'PARCELFORCE' => _x( 'Parcel Force', 'Name of carrier', 'woocommerce-paypal-payments' ),
578
+ 'ROYAL_MAIL' => _x( 'Royal Mail', 'Name of carrier', 'woocommerce-paypal-payments' ),
579
+ 'RPD_2_MAN' => _x( 'RPD2man Deliveries', 'Name of carrier', 'woocommerce-paypal-payments' ),
580
+ 'SKYNET_UK' => _x( 'Skynet Worldwide Express UK', 'Name of carrier', 'woocommerce-paypal-payments' ),
581
+ 'TNT_UK' => _x( 'TNT UK', 'Name of carrier', 'woocommerce-paypal-payments' ),
582
+ 'UK_MAIL' => _x( 'UK Mail', 'Name of carrier', 'woocommerce-paypal-payments' ),
583
+ 'YODEL' => _x( 'Yodel', 'Name of carrier', 'woocommerce-paypal-payments' ),
584
+ ),
585
+ ),
586
+ 'US' => array(
587
+ 'name' => _x( 'United States', 'Name of carrier country', 'woocommerce-paypal-payments' ),
588
+ 'items' => array(
589
+ 'ABC_PACKAGE' => _x( 'ABC Package Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
590
+ 'AIRBORNE_EXPRESS' => _x( 'Airborne Express', 'Name of carrier', 'woocommerce-paypal-payments' ),
591
+ 'ASENDIA_US' => _x( 'Asendia USA', 'Name of carrier', 'woocommerce-paypal-payments' ),
592
+ 'CPACKET' => _x( 'Cpacket', 'Name of carrier', 'woocommerce-paypal-payments' ),
593
+ 'ENSENDA' => _x( 'Ensenda USA', 'Name of carrier', 'woocommerce-paypal-payments' ),
594
+ 'ESTES' => _x( 'Estes', 'Name of carrier', 'woocommerce-paypal-payments' ),
595
+ 'FASTWAY_US' => _x( 'Fastway USA', 'Name of carrier', 'woocommerce-paypal-payments' ),
596
+ 'GLOBEGISTICS' => _x( 'Globegistics USA', 'Name of carrier', 'woocommerce-paypal-payments' ),
597
+ 'INTERNATIONAL_BRIDGE' => _x( 'International Bridge', 'Name of carrier', 'woocommerce-paypal-payments' ),
598
+ 'ONTRAC' => _x( 'OnTrac', 'Name of carrier', 'woocommerce-paypal-payments' ),
599
+ 'RL_US' => _x( 'RL Carriers', 'Name of carrier', 'woocommerce-paypal-payments' ),
600
+ 'RRDONNELLEY' => _x( 'RR Donnelley', 'Name of carrier', 'woocommerce-paypal-payments' ),
601
+ 'USPS' => _x( 'USPS', 'Name of carrier', 'woocommerce-paypal-payments' ),
602
+ ),
603
+ ),
604
+ 'VN' => array(
605
+ 'name' => _x( 'Vietnam', 'Name of carrier country', 'woocommerce-paypal-payments' ),
606
+ 'items' => array(
607
+ 'KERRY_EXPRESS_VN' => _x( 'Kerry Express Vietnam', 'Name of carrier', 'woocommerce-paypal-payments' ),
608
+ 'VIETNAM_POST' => _x( 'Vietnam Post', 'Name of carrier', 'woocommerce-paypal-payments' ),
609
+ 'VNPOST_EMS' => _x( 'Vietnam Post EMS', 'Name of carrier', 'woocommerce-paypal-payments' ),
610
+ ),
611
+ ),
612
+ );
modules/ppcp-order-tracking/composer.json ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "woocommerce/ppcp-order-tracking",
3
+ "type": "dhii-mod",
4
+ "description": "Order tracking module for PPCP",
5
+ "license": "GPL-2.0",
6
+ "require": {
7
+ "php": "^7.1 | ^8.0",
8
+ "dhii/module-interface": "^0.3.0-alpha1"
9
+ },
10
+ "autoload": {
11
+ "psr-4": {
12
+ "WooCommerce\\PayPalCommerce\\OrderTracking\\": "src"
13
+ }
14
+ },
15
+ "minimum-stability": "dev",
16
+ "prefer-stable": true
17
+ }
modules/ppcp-order-tracking/extensions.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The order tracking module extensions.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\OrderTracking
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\OrderTracking;
11
+
12
+ return array();
modules/ppcp-order-tracking/module.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The order tracking module.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\OrderTracking
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\OrderTracking;
11
+
12
+ use Dhii\Modular\Module\ModuleInterface;
13
+
14
+ return static function (): ModuleInterface {
15
+ return new OrderTrackingModule();
16
+ };
modules/ppcp-order-tracking/package.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "ppcp-order-tracking",
3
+ "version": "1.0.0",
4
+ "license": "GPL-3.0-or-later",
5
+ "main": "resources/js/order-edit-page.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.0",
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-order-tracking/resources/css/order-edit-page.scss ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #ppcp_order-tracking {
2
+ .tracking-info-message {
3
+ padding-left: 20px;
4
+ }
5
+
6
+ .error {
7
+ color: red;
8
+ font-weight: bold;
9
+ }
10
+
11
+ .success {
12
+ color: green;
13
+ font-weight: bold;
14
+ }
15
+
16
+ input,select {
17
+ width: 100%;
18
+ }
19
+ }
20
+
modules/ppcp-order-tracking/resources/js/order-edit-page.js ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import {PaymentMethods} from "../../../ppcp-button/resources/js/modules/Helper/CheckoutMethodState";
2
+
3
+ document.addEventListener(
4
+ 'DOMContentLoaded',
5
+ () => {
6
+ const config = PayPalCommerceGatewayOrderTrackingInfo;
7
+ if (!typeof (PayPalCommerceGatewayOrderTrackingInfo)) {
8
+ console.error('trackign cannot be set.');
9
+ return;
10
+ }
11
+
12
+ const transactionId = document.querySelector('.ppcp-tracking-transaction_id');
13
+ const trackingNumber = document.querySelector('.ppcp-tracking-tracking_number');
14
+ const status = document.querySelector('.ppcp-tracking-status');
15
+ const carrier = document.querySelector('.ppcp-tracking-carrier');
16
+ const orderId = document.querySelector('.ppcp-order_id');
17
+ const submitButton = document.querySelector('.submit_tracking_info');
18
+
19
+ submitButton.addEventListener('click', function (event) {
20
+ submitButton.setAttribute('disabled', 'disabled');
21
+ fetch(config.ajax.tracking_info.endpoint, {
22
+ method: 'POST',
23
+ body: JSON.stringify({
24
+ nonce: config.ajax.tracking_info.nonce,
25
+ transaction_id: transactionId ? transactionId.value : null,
26
+ tracking_number: trackingNumber ? trackingNumber.value : null,
27
+ status: status ? status.value : null,
28
+ carrier: carrier ? carrier.value : null,
29
+ order_id: orderId ? orderId.value : null,
30
+ action: submitButton ? submitButton.dataset.action : null,
31
+ })
32
+ }).then(function (res) {
33
+ return res.json();
34
+ }).then(function (data) {
35
+ if (!data.success) {
36
+ console.error(data);
37
+ throw Error(data.data.message);
38
+ }
39
+
40
+ jQuery( "<span class='success tracking-info-message'>" + data.data.message + "</span>" ).insertAfter(submitButton);
41
+ setTimeout(()=> jQuery('.tracking-info-message').remove(),3000);
42
+
43
+ submitButton.dataset.action = 'update';
44
+ submitButton.textContent = 'update';
45
+ submitButton.removeAttribute('disabled');
46
+ });
47
+ })
48
+ },
49
+ );
modules/ppcp-order-tracking/services.php ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The order tracking module services.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\OrderTracking
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\OrderTracking;
11
+
12
+ use Psr\Container\ContainerInterface;
13
+ use WooCommerce\PayPalCommerce\OrderTracking\Assets\OrderEditPageAssets;
14
+ use WooCommerce\PayPalCommerce\OrderTracking\Endpoint\OrderTrackingEndpoint;
15
+ use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
16
+
17
+ return array(
18
+ 'order-tracking.assets' => function( ContainerInterface $container ) : OrderEditPageAssets {
19
+ return new OrderEditPageAssets(
20
+ $container->get( 'order-tracking.module.url' ),
21
+ $container->get( 'ppcp.asset-version' )
22
+ );
23
+ },
24
+ 'order-tracking.endpoint.controller' => static function ( ContainerInterface $container ) : OrderTrackingEndpoint {
25
+ return new OrderTrackingEndpoint(
26
+ $container->get( 'api.host' ),
27
+ $container->get( 'api.bearer' ),
28
+ $container->get( 'woocommerce.logger.woocommerce' ),
29
+ $container->get( 'button.request-data' )
30
+ );
31
+ },
32
+ 'order-tracking.module.url' => static function ( ContainerInterface $container ): string {
33
+ /**
34
+ * The path cannot be false.
35
+ *
36
+ * @psalm-suppress PossiblyFalseArgument
37
+ */
38
+ return plugins_url(
39
+ '/modules/ppcp-order-tracking/',
40
+ dirname( realpath( __FILE__ ), 3 ) . '/woocommerce-paypal-payments.php'
41
+ );
42
+ },
43
+ 'order-tracking.meta-box.renderer' => static function ( ContainerInterface $container ): MetaBoxRenderer {
44
+ return new MetaBoxRenderer(
45
+ $container->get( 'order-tracking.endpoint.controller' ),
46
+ $container->get( 'order-tracking.allowed-shipping-statuses' ),
47
+ $container->get( 'order-tracking.available-carriers' )
48
+ );
49
+ },
50
+ 'order-tracking.allowed-shipping-statuses' => static function ( ContainerInterface $container ): array {
51
+ return array( 'SHIPPED', 'ON_HOLD', 'DELIVERED', 'CANCELLED' );
52
+ },
53
+ 'order-tracking.allowed-carriers' => static function ( ContainerInterface $container ): array {
54
+ return require __DIR__ . '/carriers.php';
55
+ },
56
+ 'order-tracking.available-carriers' => static function ( ContainerInterface $container ): array {
57
+ $api_shop_country = $container->get( 'api.shop.country' );
58
+ $allowed_carriers = $container->get( 'order-tracking.allowed-carriers' );
59
+ $selected_country_carriers = $allowed_carriers[ $api_shop_country ] ?? array();
60
+
61
+ return array(
62
+ $api_shop_country => $selected_country_carriers ?? array(),
63
+ 'global' => $allowed_carriers['global'] ?? array(),
64
+ 'other' => array(
65
+ 'name' => 'Other',
66
+ 'items' => array(
67
+ 'OTHER' => _x( 'Other', 'Name of carrier', 'woocommerce-paypal-payments' ),
68
+ ),
69
+ ),
70
+ );
71
+ },
72
+ 'order-tracking.is-paypal-order-edit-page' => static function ( ContainerInterface $container ): bool {
73
+ $order_id = isset( $_GET['post'] ) ? (int) $_GET['post'] : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
74
+ if ( empty( $order_id ) ) {
75
+ return false;
76
+ }
77
+
78
+ $meta = get_post_meta( $order_id, PayPalGateway::ORDER_ID_META_KEY, true );
79
+
80
+ return ! empty( $meta );
81
+ },
82
+ );
modules/ppcp-order-tracking/src/Assets/OrderEditPageAssets.php ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Register and configure assets for order edit page.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\OrderTracking\Assets
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\OrderTracking\Assets;
11
+
12
+ use WooCommerce\PayPalCommerce\OrderTracking\Endpoint\OrderTrackingEndpoint;
13
+
14
+ /**
15
+ * Class OrderEditPageAssets
16
+ */
17
+ class OrderEditPageAssets {
18
+
19
+ /**
20
+ * The URL to the module.
21
+ *
22
+ * @var string
23
+ */
24
+ private $module_url;
25
+
26
+ /**
27
+ * The assets version.
28
+ *
29
+ * @var string
30
+ */
31
+ private $version;
32
+
33
+ /**
34
+ * WebhooksStatusPageAssets constructor.
35
+ *
36
+ * @param string $module_url The URL to the module.
37
+ * @param string $version The assets version.
38
+ */
39
+ public function __construct(
40
+ string $module_url,
41
+ string $version
42
+ ) {
43
+ $this->module_url = $module_url;
44
+ $this->version = $version;
45
+ }
46
+
47
+ /**
48
+ * Registers the scripts and styles.
49
+ *
50
+ * @return void
51
+ */
52
+ public function register(): void {
53
+ wp_register_style(
54
+ 'ppcp-webhooks-order-edit-page-style',
55
+ untrailingslashit( $this->module_url ) . '/assets/css/order-edit-page.css',
56
+ array(),
57
+ $this->version
58
+ );
59
+
60
+ wp_register_script(
61
+ 'ppcp-tracking',
62
+ untrailingslashit( $this->module_url ) . '/assets/js/order-edit-page.js',
63
+ array( 'jquery' ),
64
+ $this->version,
65
+ true
66
+ );
67
+
68
+ wp_localize_script(
69
+ 'ppcp-tracking',
70
+ 'PayPalCommerceGatewayOrderTrackingInfo',
71
+ $this->get_script_data()
72
+ );
73
+ }
74
+
75
+ /**
76
+ * Returns the data for the script.
77
+ *
78
+ * @return array a map of script data.
79
+ */
80
+ public function get_script_data(): array {
81
+ return array(
82
+ 'ajax' => array(
83
+ 'tracking_info' => array(
84
+ 'endpoint' => \WC_AJAX::get_endpoint( OrderTrackingEndpoint::ENDPOINT ),
85
+ 'nonce' => wp_create_nonce( OrderTrackingEndpoint::nonce() ),
86
+ ),
87
+ ),
88
+ );
89
+ }
90
+
91
+ /**
92
+ * Enqueues the necessary scripts.
93
+ *
94
+ * @return void
95
+ */
96
+ public function enqueue(): void {
97
+ wp_enqueue_style( 'ppcp-webhooks-order-edit-page-style' );
98
+ wp_enqueue_script( 'ppcp-tracking' );
99
+ }
100
+ }
modules/ppcp-order-tracking/src/Endpoint/OrderTrackingEndpoint.php ADDED
@@ -0,0 +1,356 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The order tracking Endpoint.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\OrderTracking\Endpoint
6
+ */
7
+
8
+ declare( strict_types=1 );
9
+
10
+ namespace WooCommerce\PayPalCommerce\OrderTracking\Endpoint;
11
+
12
+ use Exception;
13
+ use Psr\Log\LoggerInterface;
14
+ use WC_Order;
15
+ use WooCommerce\PayPalCommerce\ApiClient\Authentication\Bearer;
16
+ use WooCommerce\PayPalCommerce\ApiClient\Endpoint\RequestTrait;
17
+ use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
18
+ use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
19
+ use WooCommerce\PayPalCommerce\Button\Endpoint\RequestData;
20
+ use WooCommerce\PayPalCommerce\WcGateway\Processor\TransactionIdHandlingTrait;
21
+
22
+ /**
23
+ * The OrderTrackingEndpoint.
24
+ *
25
+ * @psalm-type SupportedStatuses = 'SHIPPED'|'ON_HOLD'|'DELIVERED'|'CANCELLED'
26
+ * @psalm-type TrackingInfo = array{transaction_id: string, status: SupportedStatuses, tracking_number?: string, carrier?: string}
27
+ * @psalm-type RequestValues = array{transaction_id: string, status: SupportedStatuses, order_id: int, action: 'create'|'update', tracking_number?: string, carrier?: string}
28
+ * Class OrderTrackingEndpoint
29
+ */
30
+ class OrderTrackingEndpoint {
31
+
32
+ use RequestTrait, TransactionIdHandlingTrait;
33
+
34
+ const ENDPOINT = 'ppc-tracking-info';
35
+
36
+ /**
37
+ * The RequestData.
38
+ *
39
+ * @var RequestData
40
+ */
41
+ protected $request_data;
42
+
43
+ /**
44
+ * The Host URL.
45
+ *
46
+ * @var string
47
+ */
48
+ private $host;
49
+
50
+ /**
51
+ * The bearer.
52
+ *
53
+ * @var Bearer
54
+ */
55
+ private $bearer;
56
+
57
+ /**
58
+ * The logger.
59
+ *
60
+ * @var LoggerInterface
61
+ */
62
+ private $logger;
63
+
64
+ /**
65
+ * PartnersEndpoint constructor.
66
+ *
67
+ * @param string $host The host.
68
+ * @param Bearer $bearer The bearer.
69
+ * @param LoggerInterface $logger The logger.
70
+ * @param RequestData $request_data The Request data.
71
+ */
72
+ public function __construct(
73
+ string $host,
74
+ Bearer $bearer,
75
+ LoggerInterface $logger,
76
+ RequestData $request_data
77
+ ) {
78
+ $this->host = $host;
79
+ $this->bearer = $bearer;
80
+ $this->logger = $logger;
81
+ $this->request_data = $request_data;
82
+ }
83
+
84
+ /**
85
+ * Handles the request.
86
+ */
87
+ public function handle_request(): void {
88
+ try {
89
+ $data = $this->request_data->read_request( $this->nonce() );
90
+ $action = $data['action'];
91
+ $request_body = $this->extract_tracking_information( $data );
92
+ $order_id = (int) $data['order_id'];
93
+ $action === 'create' ? $this->add_tracking_information( $request_body, $order_id ) : $this->update_tracking_information( $data, $order_id );
94
+
95
+ $action_message = $action === 'create' ? 'created' : 'updated';
96
+ $message = sprintf(
97
+ // translators: %1$s is the action message (created or updated).
98
+ _x( 'successfully %1$s', 'tracking info success message', 'woocommerce-paypal-payments' ),
99
+ esc_html( $action_message )
100
+ );
101
+
102
+ wp_send_json_success( array( 'message' => $message ) );
103
+ } catch ( Exception $error ) {
104
+ wp_send_json_error( $error->getMessage(), 500 );
105
+ }
106
+ }
107
+
108
+ /**
109
+ * Creates the tracking information of a given order with the given data.
110
+ *
111
+ * @param array $data The tracking information to add.
112
+ * @psalm-param TrackingInfo $data
113
+ * @param int $order_id The order ID.
114
+ * @throws RuntimeException If problem creating.
115
+ */
116
+ public function add_tracking_information( array $data, int $order_id ) : void {
117
+ $url = trailingslashit( $this->host ) . 'v1/shipping/trackers-batch';
118
+
119
+ $body = array(
120
+ 'trackers' => array( $data ),
121
+ );
122
+
123
+ $args = array(
124
+ 'method' => 'POST',
125
+ 'headers' => $this->request_headers(),
126
+ 'body' => wp_json_encode( $body ),
127
+ );
128
+ $response = $this->request( $url, $args );
129
+
130
+ if ( is_wp_error( $response ) ) {
131
+ $error = new RuntimeException(
132
+ 'Could not create order tracking information.'
133
+ );
134
+ $this->logger->log(
135
+ 'warning',
136
+ $error->getMessage(),
137
+ array(
138
+ 'args' => $args,
139
+ 'response' => $response,
140
+ )
141
+ );
142
+ throw $error;
143
+ }
144
+
145
+ /**
146
+ * Need to ignore Method WP_Error::offsetGet does not exist
147
+ *
148
+ * @psalm-suppress UndefinedMethod
149
+ */
150
+ $json = json_decode( $response['body'] );
151
+ $status_code = (int) wp_remote_retrieve_response_code( $response );
152
+ if ( 200 !== $status_code ) {
153
+ $error = new PayPalApiException(
154
+ $json,
155
+ $status_code
156
+ );
157
+ $this->logger->log(
158
+ 'warning',
159
+ sprintf(
160
+ 'Failed to create order tracking information. PayPal API response: %1$s',
161
+ $error->getMessage()
162
+ ),
163
+ array(
164
+ 'args' => $args,
165
+ 'response' => $response,
166
+ )
167
+ );
168
+ throw $error;
169
+ }
170
+
171
+ update_post_meta( $order_id, '_ppcp_paypal_tracking_number', $data['tracking_number'] ?? '' );
172
+ }
173
+
174
+ /**
175
+ * Gets the tracking information of a given order.
176
+ *
177
+ * @param int $wc_order_id The order ID.
178
+ * @return array|null The tracking information.
179
+ * @psalm-return TrackingInfo|null
180
+ * @throws RuntimeException If problem getting.
181
+ */
182
+ public function get_tracking_information( int $wc_order_id ) : ?array {
183
+ $wc_order = wc_get_order( $wc_order_id );
184
+ if ( ! is_a( $wc_order, WC_Order::class ) ) {
185
+ throw new RuntimeException( 'wrong order ID' );
186
+ }
187
+
188
+ $transaction_id = $wc_order->get_transaction_id();
189
+ $tracking_number = get_post_meta( $wc_order_id, '_ppcp_paypal_tracking_number', true );
190
+ $url = trailingslashit( $this->host ) . 'v1/shipping/trackers/' . $this->find_tracker_id( $transaction_id, $tracking_number );
191
+
192
+ $args = array(
193
+ 'method' => 'GET',
194
+ 'headers' => $this->request_headers(),
195
+ );
196
+
197
+ $response = $this->request( $url, $args );
198
+
199
+ if ( is_wp_error( $response ) ) {
200
+ $error = new RuntimeException(
201
+ 'Could not fetch the tracking information.'
202
+ );
203
+ $this->logger->log(
204
+ 'warning',
205
+ $error->getMessage(),
206
+ array(
207
+ 'args' => $args,
208
+ 'response' => $response,
209
+ )
210
+ );
211
+ throw $error;
212
+ }
213
+
214
+ /**
215
+ * Need to ignore Method WP_Error::offsetGet does not exist
216
+ *
217
+ * @psalm-suppress UndefinedMethod
218
+ */
219
+ $data = json_decode( $response['body'] );
220
+ $status_code = (int) wp_remote_retrieve_response_code( $response );
221
+
222
+ if ( 200 !== $status_code ) {
223
+ return null;
224
+ }
225
+
226
+ return $this->extract_tracking_information( (array) $data );
227
+ }
228
+
229
+ /**
230
+ * Updates the tracking information of a given order with the given data.
231
+ *
232
+ * @param array $data The tracking information to update.
233
+ * @psalm-param TrackingInfo $data
234
+ * @param int $order_id The order ID.
235
+ * @throws RuntimeException If problem updating.
236
+ */
237
+ public function update_tracking_information( array $data, int $order_id ) : void {
238
+ $tracking_info = $this->get_tracking_information( $order_id );
239
+ $transaction_id = $tracking_info['transaction_id'] ?? '';
240
+ $tracking_number = $tracking_info['tracking_number'] ?? '';
241
+ $url = trailingslashit( $this->host ) . 'v1/shipping/trackers/' . $this->find_tracker_id( $transaction_id, $tracking_number );
242
+
243
+ $args = array(
244
+ 'method' => 'PUT',
245
+ 'headers' => $this->request_headers(),
246
+ 'body' => wp_json_encode( $data ),
247
+ );
248
+
249
+ $response = $this->request( $url, $args );
250
+
251
+ if ( is_wp_error( $response ) ) {
252
+ $error = new RuntimeException(
253
+ 'Could not update order tracking information.'
254
+ );
255
+ $this->logger->log(
256
+ 'warning',
257
+ $error->getMessage(),
258
+ array(
259
+ 'args' => $args,
260
+ 'response' => $response,
261
+ )
262
+ );
263
+ throw $error;
264
+ }
265
+
266
+ /**
267
+ * Need to ignore Method WP_Error::offsetGet does not exist
268
+ *
269
+ * @psalm-suppress UndefinedMethod
270
+ */
271
+ $json = json_decode( $response['body'] );
272
+ $status_code = (int) wp_remote_retrieve_response_code( $response );
273
+ if ( 204 !== $status_code ) {
274
+ $error = new PayPalApiException(
275
+ $json,
276
+ $status_code
277
+ );
278
+ $this->logger->log(
279
+ 'warning',
280
+ sprintf(
281
+ 'Failed to update the order tracking information. PayPal API response: %1$s',
282
+ $error->getMessage()
283
+ ),
284
+ array(
285
+ 'args' => $args,
286
+ 'response' => $response,
287
+ )
288
+ );
289
+ throw $error;
290
+ }
291
+
292
+ update_post_meta( $order_id, '_ppcp_paypal_tracking_number', $data['tracking_number'] ?? '' );
293
+ }
294
+
295
+ /**
296
+ * The nonce.
297
+ *
298
+ * @return string
299
+ */
300
+ public static function nonce(): string {
301
+ return self::ENDPOINT;
302
+ }
303
+
304
+ /**
305
+ * Extracts the needed tracking information from given data.
306
+ *
307
+ * @param array $data The request data map.
308
+ * @psalm-param RequestValues $data
309
+ * @return array A map of tracking information keys to values.
310
+ * @psalm-return TrackingInfo
311
+ * @throws RuntimeException If problem extracting.
312
+ */
313
+ protected function extract_tracking_information( array $data ): array {
314
+ if ( empty( $data['transaction_id'] ) || empty( $data['status'] ) ) {
315
+ $this->logger->log( 'warning', 'Missing transaction_id or status.' );
316
+ throw new RuntimeException( 'Missing transaction_id or status.' );
317
+ }
318
+
319
+ $tracking_info = array(
320
+ 'transaction_id' => $data['transaction_id'],
321
+ 'status' => $data['status'],
322
+ );
323
+
324
+ if ( ! empty( $data['tracking_number'] ) ) {
325
+ $tracking_info['tracking_number'] = $data['tracking_number'];
326
+ }
327
+
328
+ if ( ! empty( $data['carrier'] ) ) {
329
+ $tracking_info['carrier'] = $data['carrier'];
330
+ }
331
+ return $tracking_info;
332
+ }
333
+
334
+ /**
335
+ * Creates the request headers.
336
+ *
337
+ * @return array The request headers.
338
+ */
339
+ protected function request_headers(): array {
340
+ return array(
341
+ 'Authorization' => 'Bearer ' . $this->bearer->bearer()->token(),
342
+ 'Content-Type' => 'application/json',
343
+ );
344
+ }
345
+
346
+ /**
347
+ * Finds the tracker ID from given transaction ID and tracking number.
348
+ *
349
+ * @param string $transaction_id The transaction ID.
350
+ * @param string $tracking_number The tracking number.
351
+ * @return string The tracker ID.
352
+ */
353
+ protected function find_tracker_id( string $transaction_id, string $tracking_number ): string {
354
+ return ! empty( $tracking_number ) ? "{$transaction_id}-{$tracking_number}" : "{$transaction_id}-NOTRACKER";
355
+ }
356
+ }
modules/ppcp-order-tracking/src/MetaBoxRenderer.php ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The order tracking MetaBox renderer.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\OrderTracking
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\OrderTracking;
11
+
12
+ use WC_Order;
13
+ use WooCommerce\PayPalCommerce\OrderTracking\Endpoint\OrderTrackingEndpoint;
14
+ use WP_Post;
15
+
16
+ /**
17
+ * Class MetaBoxRenderer
18
+ *
19
+ * @psalm-type CarrierType = string
20
+ * @psalm-type CarrierItemCode = string
21
+ * @psalm-type CarrierItemName = string
22
+ * @psalm-type Carrier = array{name: string, items: array<CarrierItemCode, CarrierItemName>}
23
+ * @psalm-type Carriers = array<CarrierType, Carrier>
24
+ */
25
+ class MetaBoxRenderer {
26
+
27
+ public const NAME_PREFIX = 'ppcp-tracking';
28
+
29
+ /**
30
+ * The OrderTrackingEndpoint.
31
+ *
32
+ * @var OrderTrackingEndpoint
33
+ */
34
+ protected $order_tracking_endpoint;
35
+
36
+ /**
37
+ * Allowed shipping statuses.
38
+ *
39
+ * @var string[]
40
+ */
41
+ protected $allowed_statuses;
42
+
43
+ /**
44
+ * Available shipping carriers.
45
+ *
46
+ * @var array
47
+ * @psalm-var Carriers
48
+ */
49
+ protected $carriers;
50
+
51
+ /**
52
+ * MetaBoxRenderer constructor.
53
+ *
54
+ * @param OrderTrackingEndpoint $order_tracking_endpoint The OrderTrackingEndpoint.
55
+ * @param string[] $allowed_statuses Allowed shipping statuses.
56
+ * @param array $carriers Available shipping carriers.
57
+ * @psalm-param Carriers $carriers
58
+ */
59
+ public function __construct(
60
+ OrderTrackingEndpoint $order_tracking_endpoint,
61
+ array $allowed_statuses,
62
+ array $carriers
63
+ ) {
64
+
65
+ $this->order_tracking_endpoint = $order_tracking_endpoint;
66
+ $this->allowed_statuses = $allowed_statuses;
67
+ $this->carriers = $carriers;
68
+ }
69
+
70
+ /**
71
+ * Renders the order tracking MetaBox.
72
+ *
73
+ * @param WP_Post $post The post object.
74
+ */
75
+ public function render( WP_Post $post ): void {
76
+ $wc_order = wc_get_order( $post->ID );
77
+ if ( ! is_a( $wc_order, WC_Order::class ) ) {
78
+ return;
79
+ }
80
+
81
+ $tracking_info = $this->order_tracking_endpoint->get_tracking_information( $post->ID );
82
+
83
+ $tracking_is_not_added = empty( $tracking_info );
84
+
85
+ $transaction_id = $tracking_info['transaction_id'] ?? $wc_order->get_transaction_id() ?: '';
86
+ $tracking_number = $tracking_info['tracking_number'] ?? '';
87
+ $status_value = $tracking_info['status'] ?? 'SHIPPED';
88
+ $carrier_value = $tracking_info['carrier'] ?? '';
89
+
90
+ $carriers = (array) apply_filters( 'ppcp_tracking_carriers', $this->carriers );
91
+ $statuses = (array) apply_filters( 'ppcp_tracking_statuses', $this->allowed_statuses );
92
+
93
+ $action = $tracking_is_not_added ? 'create' : 'update';
94
+ ?>
95
+ <p>
96
+ <label for="<?php echo esc_attr( self::NAME_PREFIX ); ?>-transaction_id"><?php echo esc_html__( 'Transaction ID', 'woocommerce-paypal-payments' ); ?></label>
97
+ <input type="text" disabled class="<?php echo esc_attr( self::NAME_PREFIX ); ?>-transaction_id" id="<?php echo esc_attr( self::NAME_PREFIX ); ?>-transaction_id" name="<?php echo esc_attr( self::NAME_PREFIX ); ?>[transaction_id]" value="<?php echo esc_html( $transaction_id ); ?>"/></p>
98
+ <p>
99
+ <label for="<?php echo esc_attr( self::NAME_PREFIX ); ?>-tracking_number"><?php echo esc_html__( 'Tracking Number', 'woocommerce-paypal-payments' ); ?></label>
100
+ <input type="text" class="<?php echo esc_attr( self::NAME_PREFIX ); ?>-tracking_number" id="<?php echo esc_attr( self::NAME_PREFIX ); ?>-tracking_number" name="<?php echo esc_attr( self::NAME_PREFIX ); ?>[tracking_number]" value="<?php echo esc_html( $tracking_number ); ?>"/></p>
101
+ <p>
102
+ <label for="<?php echo esc_attr( self::NAME_PREFIX ); ?>-status"><?php echo esc_html__( 'Status', 'woocommerce-paypal-payments' ); ?></label>
103
+ <select class="<?php echo esc_attr( self::NAME_PREFIX ); ?>-status" id="<?php echo esc_attr( self::NAME_PREFIX ); ?>-status" name="<?php echo esc_attr( self::NAME_PREFIX ); ?>[status]">
104
+ <?php foreach ( $statuses as $status ) : ?>
105
+ <option value="<?php echo esc_attr( $status ); ?>" <?php selected( $status_value, $status ); ?>><?php echo esc_html( $status ); ?></option>
106
+ <?php endforeach; ?>
107
+ </select>
108
+ </p>
109
+ <p>
110
+ <label for="ppcp-tracking-carrier"><?php echo esc_html__( 'Carrier', 'woocommerce-paypal-payments' ); ?></label>
111
+ <select class="ppcp-tracking-carrier" id="ppcp-tracking-carrier" name="ppcp-tracking[carrier]">
112
+ <option value=""><?php echo esc_html__( 'Select Carrier', 'woocommerce-paypal-payments' ); ?></option>
113
+ <?php
114
+ foreach ( $carriers as $carrier ) :
115
+ $country = $carrier['name'] ?? '';
116
+ $carrier_items = $carrier['items'] ?? array();
117
+ ?>
118
+ <optgroup label="<?php echo esc_attr( $country ); ?>">
119
+ <?php foreach ( $carrier_items as $carrier_code => $carrier_name ) : ?>
120
+ <option value="<?php echo esc_attr( $carrier_code ); ?>" <?php selected( $carrier_value, $carrier_code ); ?>><?php echo esc_html( $carrier_name ); ?></option>
121
+ <?php endforeach; ?>
122
+ </optgroup>
123
+ <?php endforeach; ?>
124
+ </select>
125
+ </p>
126
+ <input type="hidden" class="ppcp-order_id" name="<?php echo esc_attr( self::NAME_PREFIX ); ?>[order_id]" value="<?php echo intval( $post->ID ); ?>"/>
127
+ <p>
128
+ <button type="button" class="button submit_tracking_info" data-action="<?php echo esc_attr( $action ); ?>"><?php echo esc_html( ucfirst( $action ) ); ?></button></p>
129
+ <?php
130
+ }
131
+ }
modules/ppcp-order-tracking/src/OrderTrackingModule.php ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The order tracking module.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\OrderTracking
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\OrderTracking;
11
+
12
+ use Dhii\Container\ServiceProvider;
13
+ use Dhii\Modular\Module\ModuleInterface;
14
+ use Exception;
15
+ use Interop\Container\ServiceProviderInterface;
16
+ use Psr\Container\ContainerInterface;
17
+ use Psr\Log\LoggerInterface;
18
+ use WC_Order;
19
+ use WooCommerce\PayPalCommerce\OrderTracking\Assets\OrderEditPageAssets;
20
+ use WooCommerce\PayPalCommerce\OrderTracking\Endpoint\OrderTrackingEndpoint;
21
+ use WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException;
22
+ use WooCommerce\PayPalCommerce\WcGateway\Helper\PayUponInvoiceHelper;
23
+ use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
24
+ use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsListener;
25
+
26
+ /**
27
+ * Class OrderTrackingModule
28
+ */
29
+ class OrderTrackingModule implements ModuleInterface {
30
+
31
+ /**
32
+ * {@inheritDoc}
33
+ */
34
+ public function setup(): ServiceProviderInterface {
35
+ return new ServiceProvider(
36
+ require __DIR__ . '/../services.php',
37
+ require __DIR__ . '/../extensions.php'
38
+ );
39
+ }
40
+
41
+ /**
42
+ * {@inheritDoc}
43
+ *
44
+ * @param ContainerInterface $c A services container instance.
45
+ * @throws NotFoundException
46
+ */
47
+ public function run( ContainerInterface $c ): void {
48
+ $settings = $c->get( 'wcgateway.settings' );
49
+ assert( $settings instanceof Settings );
50
+
51
+ $pui_helper = $c->get( 'wcgateway.pay-upon-invoice-helper' );
52
+ assert( $pui_helper instanceof PayUponInvoiceHelper );
53
+
54
+ if ( $pui_helper->is_pui_enabled() ) {
55
+ $settings->set( 'tracking_enabled', true );
56
+ $settings->persist();
57
+ }
58
+
59
+ $tracking_enabled = $settings->has( 'tracking_enabled' ) && $settings->get( 'tracking_enabled' );
60
+
61
+ if ( ! $tracking_enabled ) {
62
+ return;
63
+ }
64
+
65
+ $asset_loader = $c->get( 'order-tracking.assets' );
66
+ assert( $asset_loader instanceof OrderEditPageAssets );
67
+ $is_paypal_order_edit_page = $c->get( 'order-tracking.is-paypal-order-edit-page' );
68
+
69
+ $endpoint = $c->get( 'order-tracking.endpoint.controller' );
70
+ assert( $endpoint instanceof OrderTrackingEndpoint );
71
+
72
+ $logger = $c->get( 'woocommerce.logger.woocommerce' );
73
+ assert( $logger instanceof LoggerInterface );
74
+
75
+ add_action(
76
+ 'init',
77
+ static function () use ( $asset_loader, $is_paypal_order_edit_page ) {
78
+ if ( ! $is_paypal_order_edit_page ) {
79
+ return;
80
+ }
81
+
82
+ $asset_loader->register();
83
+ }
84
+ );
85
+
86
+ add_action(
87
+ 'admin_enqueue_scripts',
88
+ static function () use ( $asset_loader, $is_paypal_order_edit_page ) {
89
+ if ( ! $is_paypal_order_edit_page ) {
90
+ return;
91
+ }
92
+
93
+ $asset_loader->enqueue();
94
+ }
95
+ );
96
+
97
+ add_action(
98
+ 'wc_ajax_' . OrderTrackingEndpoint::ENDPOINT,
99
+ array( $endpoint, 'handle_request' )
100
+ );
101
+
102
+ $meta_box_renderer = $c->get( 'order-tracking.meta-box.renderer' );
103
+ add_action(
104
+ 'add_meta_boxes',
105
+ static function() use ( $meta_box_renderer, $is_paypal_order_edit_page ) {
106
+ if ( ! $is_paypal_order_edit_page ) {
107
+ return;
108
+ }
109
+
110
+ add_meta_box( 'ppcp_order-tracking', __( 'Tracking Information', 'woocommerce-paypal-payments' ), array( $meta_box_renderer, 'render' ), 'shop_order', 'side' );
111
+ },
112
+ 10,
113
+ 2
114
+ );
115
+
116
+ add_action(
117
+ 'woocommerce_order_status_completed',
118
+ static function( int $order_id ) use ( $endpoint, $logger ) {
119
+ $tracking_information = $endpoint->get_tracking_information( $order_id );
120
+
121
+ if ( $tracking_information ) {
122
+ return;
123
+ }
124
+
125
+ $wc_order = wc_get_order( $order_id );
126
+ if ( ! is_a( $wc_order, WC_Order::class ) ) {
127
+ return;
128
+ }
129
+
130
+ $transaction_id = $wc_order->get_transaction_id();
131
+ if ( empty( $transaction_id ) ) {
132
+ return;
133
+ }
134
+
135
+ $tracking_data = array(
136
+ 'transaction_id' => $transaction_id,
137
+ 'status' => 'SHIPPED',
138
+ );
139
+
140
+ try {
141
+ $endpoint->add_tracking_information( $tracking_data, $order_id );
142
+ } catch ( Exception $exception ) {
143
+ $logger->error( "Couldn't create tracking information: " . $exception->getMessage() );
144
+ throw $exception;
145
+ }
146
+ }
147
+ );
148
+ }
149
+ }
modules/ppcp-order-tracking/webpack.config.js ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ 'order-edit-page': path.resolve('./resources/js/order-edit-page.js'),
10
+ 'order-edit-page-style': path.resolve('./resources/css/order-edit-page.scss'),
11
+ },
12
+ output: {
13
+ path: path.resolve(__dirname, 'assets/'),
14
+ filename: 'js/[name].js',
15
+ },
16
+ module: {
17
+ rules: [{
18
+ test: /\.js?$/,
19
+ exclude: /node_modules/,
20
+ loader: 'babel-loader',
21
+ },
22
+ {
23
+ test: /\.scss$/,
24
+ exclude: /node_modules/,
25
+ use: [
26
+ {
27
+ loader: 'file-loader',
28
+ options: {
29
+ name: 'css/[name].css',
30
+ }
31
+ },
32
+ {loader:'sass-loader'}
33
+ ]
34
+ }]
35
+ }
36
+ };
modules/ppcp-order-tracking/yarn.lock ADDED
@@ -0,0 +1,2225 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2
+ # yarn lockfile v1
3
+
4
+
5
+ "@ampproject/remapping@^2.1.0":
6
+ version "2.2.0"
7
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d"
8
+ integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==
9
+ dependencies:
10
+ "@jridgewell/gen-mapping" "^0.1.0"
11
+ "@jridgewell/trace-mapping" "^0.3.9"
12
+
13
+ "@babel/code-frame@^7.18.6":
14
+ version "7.18.6"
15
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a"
16
+ integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==
17
+ dependencies:
18
+ "@babel/highlight" "^7.18.6"
19
+
20
+ "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.18.8":
21
+ version "7.18.8"
22
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d"
23
+ integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==
24
+
25
+ "@babel/core@^7.9.0":
26
+ version "7.18.9"
27
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.9.tgz#805461f967c77ff46c74ca0460ccf4fe933ddd59"
28
+ integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==
29
+ dependencies:
30
+ "@ampproject/remapping" "^2.1.0"
31
+ "@babel/code-frame" "^7.18.6"
32
+ "@babel/generator" "^7.18.9"
33
+ "@babel/helper-compilation-targets" "^7.18.9"
34
+ "@babel/helper-module-transforms" "^7.18.9"
35
+ "@babel/helpers" "^7.18.9"
36
+ "@babel/parser" "^7.18.9"
37
+ "@babel/template" "^7.18.6"
38
+ "@babel/traverse" "^7.18.9"
39
+ "@babel/types" "^7.18.9"
40
+ convert-source-map "^1.7.0"
41
+ debug "^4.1.0"
42
+ gensync "^1.0.0-beta.2"
43
+ json5 "^2.2.1"
44
+ semver "^6.3.0"
45
+
46
+ "@babel/generator@^7.18.9":
47
+ version "7.18.9"
48
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.9.tgz#68337e9ea8044d6ddc690fb29acae39359cca0a5"
49
+ integrity sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==
50
+ dependencies:
51
+ "@babel/types" "^7.18.9"
52
+ "@jridgewell/gen-mapping" "^0.3.2"
53
+ jsesc "^2.5.1"
54
+
55
+ "@babel/helper-annotate-as-pure@^7.18.6":
56
+ version "7.18.6"
57
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb"
58
+ integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==
59
+ dependencies:
60
+ "@babel/types" "^7.18.6"
61
+
62
+ "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6":
63
+ version "7.18.9"
64
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb"
65
+ integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==
66
+ dependencies:
67
+ "@babel/helper-explode-assignable-expression" "^7.18.6"
68
+ "@babel/types" "^7.18.9"
69
+
70
+ "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.18.9":
71
+ version "7.18.9"
72
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf"
73
+ integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==
74
+ dependencies:
75
+ "@babel/compat-data" "^7.18.8"
76
+ "@babel/helper-validator-option" "^7.18.6"
77
+ browserslist "^4.20.2"
78
+ semver "^6.3.0"
79
+
80
+ "@babel/helper-create-class-features-plugin@^7.18.6":
81
+ version "7.18.9"
82
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz#d802ee16a64a9e824fcbf0a2ffc92f19d58550ce"
83
+ integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==
84
+ dependencies:
85
+ "@babel/helper-annotate-as-pure" "^7.18.6"
86
+ "@babel/helper-environment-visitor" "^7.18.9"
87
+ "@babel/helper-function-name" "^7.18.9"
88
+ "@babel/helper-member-expression-to-functions" "^7.18.9"
89
+ "@babel/helper-optimise-call-expression" "^7.18.6"
90
+ "@babel/helper-replace-supers" "^7.18.9"
91
+ "@babel/helper-split-export-declaration" "^7.18.6"
92
+
93
+ "@babel/helper-create-regexp-features-plugin@^7.18.6":
94
+ version "7.18.6"
95
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz#3e35f4e04acbbf25f1b3534a657610a000543d3c"
96
+ integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==
97
+ dependencies:
98
+ "@babel/helper-annotate-as-pure" "^7.18.6"
99
+ regexpu-core "^5.1.0"
100
+
101
+ "@babel/helper-define-polyfill-provider@^0.3.1":
102
+ version "0.3.1"
103
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665"
104
+ integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==
105
+ dependencies:
106
+ "@babel/helper-compilation-targets" "^7.13.0"
107
+ "@babel/helper-module-imports" "^7.12.13"
108
+ "@babel/helper-plugin-utils" "^7.13.0"
109
+ "@babel/traverse" "^7.13.0"
110
+ debug "^4.1.1"
111
+ lodash.debounce "^4.0.8"
112
+ resolve "^1.14.2"
113
+ semver "^6.1.2"
114
+
115
+ "@babel/helper-environment-visitor@^7.18.6", "@babel/helper-environment-visitor@^7.18.9":
116
+ version "7.18.9"
117
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be"
118
+ integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
119
+
120
+ "@babel/helper-explode-assignable-expression@^7.18.6":
121
+ version "7.18.6"
122
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096"
123
+ integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==
124
+ dependencies:
125
+ "@babel/types" "^7.18.6"
126
+
127
+ "@babel/helper-function-name@^7.18.9":
128
+ version "7.18.9"
129
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0"
130
+ integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==
131
+ dependencies:
132
+ "@babel/template" "^7.18.6"
133
+ "@babel/types" "^7.18.9"
134
+
135
+ "@babel/helper-hoist-variables@^7.18.6":
136
+ version "7.18.6"
137
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678"
138
+ integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==
139
+ dependencies:
140
+ "@babel/types" "^7.18.6"
141
+
142
+ "@babel/helper-member-expression-to-functions@^7.18.9":
143
+ version "7.18.9"
144
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815"
145
+ integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==
146
+ dependencies:
147
+ "@babel/types" "^7.18.9"
148
+
149
+ "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.18.6":
150
+ version "7.18.6"
151
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e"
152
+ integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==
153
+ dependencies:
154
+ "@babel/types" "^7.18.6"
155
+
156
+ "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9":
157
+ version "7.18.9"
158
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712"
159
+ integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==
160
+ dependencies:
161
+ "@babel/helper-environment-visitor" "^7.18.9"
162
+ "@babel/helper-module-imports" "^7.18.6"
163
+ "@babel/helper-simple-access" "^7.18.6"
164
+ "@babel/helper-split-export-declaration" "^7.18.6"
165
+ "@babel/helper-validator-identifier" "^7.18.6"
166
+ "@babel/template" "^7.18.6"
167
+ "@babel/traverse" "^7.18.9"
168
+ "@babel/types" "^7.18.9"
169
+
170
+ "@babel/helper-optimise-call-expression@^7.18.6":
171
+ version "7.18.6"
172
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe"
173
+ integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==
174
+ dependencies:
175
+ "@babel/types" "^7.18.6"
176
+
177
+ "@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.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
178
+ version "7.18.9"
179
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f"
180
+ integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==
181
+
182
+ "@babel/helper-remap-async-to-generator@^7.18.6":
183
+ version "7.18.9"
184
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519"
185
+ integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==
186
+ dependencies:
187
+ "@babel/helper-annotate-as-pure" "^7.18.6"
188
+ "@babel/helper-environment-visitor" "^7.18.9"
189
+ "@babel/helper-wrap-function" "^7.18.9"
190
+ "@babel/types" "^7.18.9"
191
+
192
+ "@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9":
193
+ version "7.18.9"
194
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6"
195
+ integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==
196
+ dependencies:
197
+ "@babel/helper-environment-visitor" "^7.18.9"
198
+ "@babel/helper-member-expression-to-functions" "^7.18.9"
199
+ "@babel/helper-optimise-call-expression" "^7.18.6"
200
+ "@babel/traverse" "^7.18.9"
201
+ "@babel/types" "^7.18.9"
202
+
203
+ "@babel/helper-simple-access@^7.18.6":
204
+ version "7.18.6"
205
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea"
206
+ integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==
207
+ dependencies:
208
+ "@babel/types" "^7.18.6"
209
+
210
+ "@babel/helper-skip-transparent-expression-wrappers@^7.18.9":
211
+ version "7.18.9"
212
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818"
213
+ integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==
214
+ dependencies:
215
+ "@babel/types" "^7.18.9"
216
+
217
+ "@babel/helper-split-export-declaration@^7.18.6":
218
+ version "7.18.6"
219
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075"
220
+ integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==
221
+ dependencies:
222
+ "@babel/types" "^7.18.6"
223
+
224
+ "@babel/helper-validator-identifier@^7.18.6":
225
+ version "7.18.6"
226
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076"
227
+ integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==
228
+
229
+ "@babel/helper-validator-option@^7.18.6":
230
+ version "7.18.6"
231
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8"
232
+ integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==
233
+
234
+ "@babel/helper-wrap-function@^7.18.9":
235
+ version "7.18.9"
236
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz#ae1feddc6ebbaa2fd79346b77821c3bd73a39646"
237
+ integrity sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==
238
+ dependencies:
239
+ "@babel/helper-function-name" "^7.18.9"
240
+ "@babel/template" "^7.18.6"
241
+ "@babel/traverse" "^7.18.9"
242
+ "@babel/types" "^7.18.9"
243
+
244
+ "@babel/helpers@^7.18.9":
245
+ version "7.18.9"
246
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9"
247
+ integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==
248
+ dependencies:
249
+ "@babel/template" "^7.18.6"
250
+ "@babel/traverse" "^7.18.9"
251
+ "@babel/types" "^7.18.9"
252
+
253
+ "@babel/highlight@^7.18.6":
254
+ version "7.18.6"
255
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf"
256
+ integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
257
+ dependencies:
258
+ "@babel/helper-validator-identifier" "^7.18.6"
259
+ chalk "^2.0.0"
260
+ js-tokens "^4.0.0"
261
+
262
+ "@babel/parser@^7.18.6", "@babel/parser@^7.18.9":
263
+ version "7.18.9"
264
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539"
265
+ integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==
266
+
267
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6":
268
+ version "7.18.6"
269
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2"
270
+ integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==
271
+ dependencies:
272
+ "@babel/helper-plugin-utils" "^7.18.6"
273
+
274
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9":
275
+ version "7.18.9"
276
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50"
277
+ integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==
278
+ dependencies:
279
+ "@babel/helper-plugin-utils" "^7.18.9"
280
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
281
+ "@babel/plugin-proposal-optional-chaining" "^7.18.9"
282
+
283
+ "@babel/plugin-proposal-async-generator-functions@^7.18.6":
284
+ version "7.18.6"
285
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz#aedac81e6fc12bb643374656dd5f2605bf743d17"
286
+ integrity sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==
287
+ dependencies:
288
+ "@babel/helper-environment-visitor" "^7.18.6"
289
+ "@babel/helper-plugin-utils" "^7.18.6"
290
+ "@babel/helper-remap-async-to-generator" "^7.18.6"
291
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
292
+
293
+ "@babel/plugin-proposal-class-properties@^7.18.6":
294
+ version "7.18.6"
295
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
296
+ integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==
297
+ dependencies:
298
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
299
+ "@babel/helper-plugin-utils" "^7.18.6"
300
+
301
+ "@babel/plugin-proposal-class-static-block@^7.18.6":
302
+ version "7.18.6"
303
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020"
304
+ integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==
305
+ dependencies:
306
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
307
+ "@babel/helper-plugin-utils" "^7.18.6"
308
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
309
+
310
+ "@babel/plugin-proposal-dynamic-import@^7.18.6":
311
+ version "7.18.6"
312
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94"
313
+ integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==
314
+ dependencies:
315
+ "@babel/helper-plugin-utils" "^7.18.6"
316
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
317
+
318
+ "@babel/plugin-proposal-export-namespace-from@^7.18.9":
319
+ version "7.18.9"
320
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203"
321
+ integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==
322
+ dependencies:
323
+ "@babel/helper-plugin-utils" "^7.18.9"
324
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
325
+
326
+ "@babel/plugin-proposal-json-strings@^7.18.6":
327
+ version "7.18.6"
328
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b"
329
+ integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==
330
+ dependencies:
331
+ "@babel/helper-plugin-utils" "^7.18.6"
332
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
333
+
334
+ "@babel/plugin-proposal-logical-assignment-operators@^7.18.9":
335
+ version "7.18.9"
336
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23"
337
+ integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==
338
+ dependencies:
339
+ "@babel/helper-plugin-utils" "^7.18.9"
340
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
341
+
342
+ "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6":
343
+ version "7.18.6"
344
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1"
345
+ integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==
346
+ dependencies:
347
+ "@babel/helper-plugin-utils" "^7.18.6"
348
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
349
+
350
+ "@babel/plugin-proposal-numeric-separator@^7.18.6":
351
+ version "7.18.6"
352
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75"
353
+ integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==
354
+ dependencies:
355
+ "@babel/helper-plugin-utils" "^7.18.6"
356
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
357
+
358
+ "@babel/plugin-proposal-object-rest-spread@^7.18.9":
359
+ version "7.18.9"
360
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7"
361
+ integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==
362
+ dependencies:
363
+ "@babel/compat-data" "^7.18.8"
364
+ "@babel/helper-compilation-targets" "^7.18.9"
365
+ "@babel/helper-plugin-utils" "^7.18.9"
366
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
367
+ "@babel/plugin-transform-parameters" "^7.18.8"
368
+
369
+ "@babel/plugin-proposal-optional-catch-binding@^7.18.6":
370
+ version "7.18.6"
371
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb"
372
+ integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==
373
+ dependencies:
374
+ "@babel/helper-plugin-utils" "^7.18.6"
375
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
376
+
377
+ "@babel/plugin-proposal-optional-chaining@^7.18.9":
378
+ version "7.18.9"
379
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993"
380
+ integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==
381
+ dependencies:
382
+ "@babel/helper-plugin-utils" "^7.18.9"
383
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
384
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
385
+
386
+ "@babel/plugin-proposal-private-methods@^7.18.6":
387
+ version "7.18.6"
388
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea"
389
+ integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==
390
+ dependencies:
391
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
392
+ "@babel/helper-plugin-utils" "^7.18.6"
393
+
394
+ "@babel/plugin-proposal-private-property-in-object@^7.18.6":
395
+ version "7.18.6"
396
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503"
397
+ integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==
398
+ dependencies:
399
+ "@babel/helper-annotate-as-pure" "^7.18.6"
400
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
401
+ "@babel/helper-plugin-utils" "^7.18.6"
402
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
403
+
404
+ "@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
405
+ version "7.18.6"
406
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e"
407
+ integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==
408
+ dependencies:
409
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
410
+ "@babel/helper-plugin-utils" "^7.18.6"
411
+
412
+ "@babel/plugin-syntax-async-generators@^7.8.4":
413
+ version "7.8.4"
414
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
415
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
416
+ dependencies:
417
+ "@babel/helper-plugin-utils" "^7.8.0"
418
+
419
+ "@babel/plugin-syntax-class-properties@^7.12.13":
420
+ version "7.12.13"
421
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
422
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
423
+ dependencies:
424
+ "@babel/helper-plugin-utils" "^7.12.13"
425
+
426
+ "@babel/plugin-syntax-class-static-block@^7.14.5":
427
+ version "7.14.5"
428
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
429
+ integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
430
+ dependencies:
431
+ "@babel/helper-plugin-utils" "^7.14.5"
432
+
433
+ "@babel/plugin-syntax-dynamic-import@^7.8.3":
434
+ version "7.8.3"
435
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
436
+ integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
437
+ dependencies:
438
+ "@babel/helper-plugin-utils" "^7.8.0"
439
+
440
+ "@babel/plugin-syntax-export-namespace-from@^7.8.3":
441
+ version "7.8.3"
442
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
443
+ integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
444
+ dependencies:
445
+ "@babel/helper-plugin-utils" "^7.8.3"
446
+
447
+ "@babel/plugin-syntax-import-assertions@^7.18.6":
448
+ version "7.18.6"
449
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4"
450
+ integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==
451
+ dependencies:
452
+ "@babel/helper-plugin-utils" "^7.18.6"
453
+
454
+ "@babel/plugin-syntax-json-strings@^7.8.3":
455
+ version "7.8.3"
456
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
457
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
458
+ dependencies:
459
+ "@babel/helper-plugin-utils" "^7.8.0"
460
+
461
+ "@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
462
+ version "7.10.4"
463
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
464
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
465
+ dependencies:
466
+ "@babel/helper-plugin-utils" "^7.10.4"
467
+
468
+ "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
469
+ version "7.8.3"
470
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
471
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
472
+ dependencies:
473
+ "@babel/helper-plugin-utils" "^7.8.0"
474
+
475
+ "@babel/plugin-syntax-numeric-separator@^7.10.4":
476
+ version "7.10.4"
477
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
478
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
479
+ dependencies:
480
+ "@babel/helper-plugin-utils" "^7.10.4"
481
+
482
+ "@babel/plugin-syntax-object-rest-spread@^7.8.3":
483
+ version "7.8.3"
484
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
485
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
486
+ dependencies:
487
+ "@babel/helper-plugin-utils" "^7.8.0"
488
+
489
+ "@babel/plugin-syntax-optional-catch-binding@^7.8.3":
490
+ version "7.8.3"
491
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
492
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
493
+ dependencies:
494
+ "@babel/helper-plugin-utils" "^7.8.0"
495
+
496
+ "@babel/plugin-syntax-optional-chaining@^7.8.3":
497
+ version "7.8.3"
498
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
499
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
500
+ dependencies:
501
+ "@babel/helper-plugin-utils" "^7.8.0"
502
+
503
+ "@babel/plugin-syntax-private-property-in-object@^7.14.5":
504
+ version "7.14.5"
505
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
506
+ integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
507
+ dependencies:
508
+ "@babel/helper-plugin-utils" "^7.14.5"
509
+
510
+ "@babel/plugin-syntax-top-level-await@^7.14.5":
511
+ version "7.14.5"
512
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
513
+ integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
514
+ dependencies:
515
+ "@babel/helper-plugin-utils" "^7.14.5"
516
+
517
+ "@babel/plugin-transform-arrow-functions@^7.18.6":
518
+ version "7.18.6"
519
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe"
520
+ integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==
521
+ dependencies:
522
+ "@babel/helper-plugin-utils" "^7.18.6"
523
+
524
+ "@babel/plugin-transform-async-to-generator@^7.18.6":
525
+ version "7.18.6"
526
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615"
527
+ integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==
528
+ dependencies:
529
+ "@babel/helper-module-imports" "^7.18.6"
530
+ "@babel/helper-plugin-utils" "^7.18.6"
531
+ "@babel/helper-remap-async-to-generator" "^7.18.6"
532
+
533
+ "@babel/plugin-transform-block-scoped-functions@^7.18.6":
534
+ version "7.18.6"
535
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8"
536
+ integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==
537
+ dependencies:
538
+ "@babel/helper-plugin-utils" "^7.18.6"
539
+
540
+ "@babel/plugin-transform-block-scoping@^7.18.9":
541
+ version "7.18.9"
542
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d"
543
+ integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==
544
+ dependencies:
545
+ "@babel/helper-plugin-utils" "^7.18.9"
546
+
547
+ "@babel/plugin-transform-classes@^7.18.9":
548
+ version "7.18.9"
549
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz#90818efc5b9746879b869d5ce83eb2aa48bbc3da"
550
+ integrity sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==
551
+ dependencies:
552
+ "@babel/helper-annotate-as-pure" "^7.18.6"
553
+ "@babel/helper-environment-visitor" "^7.18.9"
554
+ "@babel/helper-function-name" "^7.18.9"
555
+ "@babel/helper-optimise-call-expression" "^7.18.6"
556
+ "@babel/helper-plugin-utils" "^7.18.9"
557
+ "@babel/helper-replace-supers" "^7.18.9"
558
+ "@babel/helper-split-export-declaration" "^7.18.6"
559
+ globals "^11.1.0"
560
+
561
+ "@babel/plugin-transform-computed-properties@^7.18.9":
562
+ version "7.18.9"
563
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e"
564
+ integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==
565
+ dependencies:
566
+ "@babel/helper-plugin-utils" "^7.18.9"
567
+
568
+ "@babel/plugin-transform-destructuring@^7.18.9":
569
+ version "7.18.9"
570
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz#68906549c021cb231bee1db21d3b5b095f8ee292"
571
+ integrity sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==
572
+ dependencies:
573
+ "@babel/helper-plugin-utils" "^7.18.9"
574
+
575
+ "@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4":
576
+ version "7.18.6"
577
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8"
578
+ integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==
579
+ dependencies:
580
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
581
+ "@babel/helper-plugin-utils" "^7.18.6"
582
+
583
+ "@babel/plugin-transform-duplicate-keys@^7.18.9":
584
+ version "7.18.9"
585
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e"
586
+ integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==
587
+ dependencies:
588
+ "@babel/helper-plugin-utils" "^7.18.9"
589
+
590
+ "@babel/plugin-transform-exponentiation-operator@^7.18.6":
591
+ version "7.18.6"
592
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd"
593
+ integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==
594
+ dependencies:
595
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6"
596
+ "@babel/helper-plugin-utils" "^7.18.6"
597
+
598
+ "@babel/plugin-transform-for-of@^7.18.8":
599
+ version "7.18.8"
600
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1"
601
+ integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==
602
+ dependencies:
603
+ "@babel/helper-plugin-utils" "^7.18.6"
604
+
605
+ "@babel/plugin-transform-function-name@^7.18.9":
606
+ version "7.18.9"
607
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0"
608
+ integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==
609
+ dependencies:
610
+ "@babel/helper-compilation-targets" "^7.18.9"
611
+ "@babel/helper-function-name" "^7.18.9"
612
+ "@babel/helper-plugin-utils" "^7.18.9"
613
+
614
+ "@babel/plugin-transform-literals@^7.18.9":
615
+ version "7.18.9"
616
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc"
617
+ integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==
618
+ dependencies:
619
+ "@babel/helper-plugin-utils" "^7.18.9"
620
+
621
+ "@babel/plugin-transform-member-expression-literals@^7.18.6":
622
+ version "7.18.6"
623
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e"
624
+ integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==
625
+ dependencies:
626
+ "@babel/helper-plugin-utils" "^7.18.6"
627
+
628
+ "@babel/plugin-transform-modules-amd@^7.18.6":
629
+ version "7.18.6"
630
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21"
631
+ integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==
632
+ dependencies:
633
+ "@babel/helper-module-transforms" "^7.18.6"
634
+ "@babel/helper-plugin-utils" "^7.18.6"
635
+ babel-plugin-dynamic-import-node "^2.3.3"
636
+
637
+ "@babel/plugin-transform-modules-commonjs@^7.18.6":
638
+ version "7.18.6"
639
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883"
640
+ integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==
641
+ dependencies:
642
+ "@babel/helper-module-transforms" "^7.18.6"
643
+ "@babel/helper-plugin-utils" "^7.18.6"
644
+ "@babel/helper-simple-access" "^7.18.6"
645
+ babel-plugin-dynamic-import-node "^2.3.3"
646
+
647
+ "@babel/plugin-transform-modules-systemjs@^7.18.9":
648
+ version "7.18.9"
649
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz#545df284a7ac6a05125e3e405e536c5853099a06"
650
+ integrity sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==
651
+ dependencies:
652
+ "@babel/helper-hoist-variables" "^7.18.6"
653
+ "@babel/helper-module-transforms" "^7.18.9"
654
+ "@babel/helper-plugin-utils" "^7.18.9"
655
+ "@babel/helper-validator-identifier" "^7.18.6"
656
+ babel-plugin-dynamic-import-node "^2.3.3"
657
+
658
+ "@babel/plugin-transform-modules-umd@^7.18.6":
659
+ version "7.18.6"
660
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9"
661
+ integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==
662
+ dependencies:
663
+ "@babel/helper-module-transforms" "^7.18.6"
664
+ "@babel/helper-plugin-utils" "^7.18.6"
665
+
666
+ "@babel/plugin-transform-named-capturing-groups-regex@^7.18.6":
667
+ version "7.18.6"
668
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz#c89bfbc7cc6805d692f3a49bc5fc1b630007246d"
669
+ integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==
670
+ dependencies:
671
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
672
+ "@babel/helper-plugin-utils" "^7.18.6"
673
+
674
+ "@babel/plugin-transform-new-target@^7.18.6":
675
+ version "7.18.6"
676
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8"
677
+ integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==
678
+ dependencies:
679
+ "@babel/helper-plugin-utils" "^7.18.6"
680
+
681
+ "@babel/plugin-transform-object-super@^7.18.6":
682
+ version "7.18.6"
683
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c"
684
+ integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==
685
+ dependencies:
686
+ "@babel/helper-plugin-utils" "^7.18.6"
687
+ "@babel/helper-replace-supers" "^7.18.6"
688
+
689
+ "@babel/plugin-transform-parameters@^7.18.8":
690
+ version "7.18.8"
691
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a"
692
+ integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==
693
+ dependencies:
694
+ "@babel/helper-plugin-utils" "^7.18.6"
695
+
696
+ "@babel/plugin-transform-property-literals@^7.18.6":
697
+ version "7.18.6"
698
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3"
699
+ integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==
700
+ dependencies:
701
+ "@babel/helper-plugin-utils" "^7.18.6"
702
+
703
+ "@babel/plugin-transform-regenerator@^7.18.6":
704
+ version "7.18.6"
705
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73"
706
+ integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==
707
+ dependencies:
708
+ "@babel/helper-plugin-utils" "^7.18.6"
709
+ regenerator-transform "^0.15.0"
710
+
711
+ "@babel/plugin-transform-reserved-words@^7.18.6":
712
+ version "7.18.6"
713
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a"
714
+ integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==
715
+ dependencies:
716
+ "@babel/helper-plugin-utils" "^7.18.6"
717
+
718
+ "@babel/plugin-transform-shorthand-properties@^7.18.6":
719
+ version "7.18.6"
720
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9"
721
+ integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==
722
+ dependencies:
723
+ "@babel/helper-plugin-utils" "^7.18.6"
724
+
725
+ "@babel/plugin-transform-spread@^7.18.9":
726
+ version "7.18.9"
727
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz#6ea7a6297740f381c540ac56caf75b05b74fb664"
728
+ integrity sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==
729
+ dependencies:
730
+ "@babel/helper-plugin-utils" "^7.18.9"
731
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
732
+
733
+ "@babel/plugin-transform-sticky-regex@^7.18.6":
734
+ version "7.18.6"
735
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc"
736
+ integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==
737
+ dependencies:
738
+ "@babel/helper-plugin-utils" "^7.18.6"
739
+
740
+ "@babel/plugin-transform-template-literals@^7.18.9":
741
+ version "7.18.9"
742
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e"
743
+ integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==
744
+ dependencies:
745
+ "@babel/helper-plugin-utils" "^7.18.9"
746
+
747
+ "@babel/plugin-transform-typeof-symbol@^7.18.9":
748
+ version "7.18.9"
749
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0"
750
+ integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==
751
+ dependencies:
752
+ "@babel/helper-plugin-utils" "^7.18.9"
753
+
754
+ "@babel/plugin-transform-unicode-escapes@^7.18.6":
755
+ version "7.18.6"
756
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz#0d01fb7fb2243ae1c033f65f6e3b4be78db75f27"
757
+ integrity sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==
758
+ dependencies:
759
+ "@babel/helper-plugin-utils" "^7.18.6"
760
+
761
+ "@babel/plugin-transform-unicode-regex@^7.18.6":
762
+ version "7.18.6"
763
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca"
764
+ integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==
765
+ dependencies:
766
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
767
+ "@babel/helper-plugin-utils" "^7.18.6"
768
+
769
+ "@babel/preset-env@^7.9.5":
770
+ version "7.18.9"
771
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.9.tgz#9b3425140d724fbe590322017466580844c7eaff"
772
+ integrity sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg==
773
+ dependencies:
774
+ "@babel/compat-data" "^7.18.8"
775
+ "@babel/helper-compilation-targets" "^7.18.9"
776
+ "@babel/helper-plugin-utils" "^7.18.9"
777
+ "@babel/helper-validator-option" "^7.18.6"
778
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6"
779
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9"
780
+ "@babel/plugin-proposal-async-generator-functions" "^7.18.6"
781
+ "@babel/plugin-proposal-class-properties" "^7.18.6"
782
+ "@babel/plugin-proposal-class-static-block" "^7.18.6"
783
+ "@babel/plugin-proposal-dynamic-import" "^7.18.6"
784
+ "@babel/plugin-proposal-export-namespace-from" "^7.18.9"
785
+ "@babel/plugin-proposal-json-strings" "^7.18.6"
786
+ "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9"
787
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6"
788
+ "@babel/plugin-proposal-numeric-separator" "^7.18.6"
789
+ "@babel/plugin-proposal-object-rest-spread" "^7.18.9"
790
+ "@babel/plugin-proposal-optional-catch-binding" "^7.18.6"
791
+ "@babel/plugin-proposal-optional-chaining" "^7.18.9"
792
+ "@babel/plugin-proposal-private-methods" "^7.18.6"
793
+ "@babel/plugin-proposal-private-property-in-object" "^7.18.6"
794
+ "@babel/plugin-proposal-unicode-property-regex" "^7.18.6"
795
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
796
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
797
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
798
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
799
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
800
+ "@babel/plugin-syntax-import-assertions" "^7.18.6"
801
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
802
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
803
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
804
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
805
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
806
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
807
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
808
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
809
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
810
+ "@babel/plugin-transform-arrow-functions" "^7.18.6"
811
+ "@babel/plugin-transform-async-to-generator" "^7.18.6"
812
+ "@babel/plugin-transform-block-scoped-functions" "^7.18.6"
813
+ "@babel/plugin-transform-block-scoping" "^7.18.9"
814
+ "@babel/plugin-transform-classes" "^7.18.9"
815
+ "@babel/plugin-transform-computed-properties" "^7.18.9"
816
+ "@babel/plugin-transform-destructuring" "^7.18.9"
817
+ "@babel/plugin-transform-dotall-regex" "^7.18.6"
818
+ "@babel/plugin-transform-duplicate-keys" "^7.18.9"
819
+ "@babel/plugin-transform-exponentiation-operator" "^7.18.6"
820
+ "@babel/plugin-transform-for-of" "^7.18.8"
821
+ "@babel/plugin-transform-function-name" "^7.18.9"
822
+ "@babel/plugin-transform-literals" "^7.18.9"
823
+ "@babel/plugin-transform-member-expression-literals" "^7.18.6"
824
+ "@babel/plugin-transform-modules-amd" "^7.18.6"
825
+ "@babel/plugin-transform-modules-commonjs" "^7.18.6"
826
+ "@babel/plugin-transform-modules-systemjs" "^7.18.9"
827
+ "@babel/plugin-transform-modules-umd" "^7.18.6"
828
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6"
829
+ "@babel/plugin-transform-new-target" "^7.18.6"
830
+ "@babel/plugin-transform-object-super" "^7.18.6"
831
+ "@babel/plugin-transform-parameters" "^7.18.8"
832
+ "@babel/plugin-transform-property-literals" "^7.18.6"
833
+ "@babel/plugin-transform-regenerator" "^7.18.6"
834
+ "@babel/plugin-transform-reserved-words" "^7.18.6"
835
+ "@babel/plugin-transform-shorthand-properties" "^7.18.6"
836
+ "@babel/plugin-transform-spread" "^7.18.9"
837
+ "@babel/plugin-transform-sticky-regex" "^7.18.6"
838
+ "@babel/plugin-transform-template-literals" "^7.18.9"
839
+ "@babel/plugin-transform-typeof-symbol" "^7.18.9"
840
+ "@babel/plugin-transform-unicode-escapes" "^7.18.6"
841
+ "@babel/plugin-transform-unicode-regex" "^7.18.6"
842
+ "@babel/preset-modules" "^0.1.5"
843
+ "@babel/types" "^7.18.9"
844
+ babel-plugin-polyfill-corejs2 "^0.3.1"
845
+ babel-plugin-polyfill-corejs3 "^0.5.2"
846
+ babel-plugin-polyfill-regenerator "^0.3.1"
847
+ core-js-compat "^3.22.1"
848
+ semver "^6.3.0"
849
+
850
+ "@babel/preset-modules@^0.1.5":
851
+ version "0.1.5"
852
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9"
853
+ integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==
854
+ dependencies:
855
+ "@babel/helper-plugin-utils" "^7.0.0"
856
+ "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
857
+ "@babel/plugin-transform-dotall-regex" "^7.4.4"
858
+ "@babel/types" "^7.4.4"
859
+ esutils "^2.0.2"
860
+
861
+ "@babel/runtime@^7.8.4":
862
+ version "7.18.9"
863
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a"
864
+ integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==
865
+ dependencies:
866
+ regenerator-runtime "^0.13.4"
867
+
868
+ "@babel/template@^7.18.6":
869
+ version "7.18.6"
870
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31"
871
+ integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==
872
+ dependencies:
873
+ "@babel/code-frame" "^7.18.6"
874
+ "@babel/parser" "^7.18.6"
875
+ "@babel/types" "^7.18.6"
876
+
877
+ "@babel/traverse@^7.13.0", "@babel/traverse@^7.18.9":
878
+ version "7.18.9"
879
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.9.tgz#deeff3e8f1bad9786874cb2feda7a2d77a904f98"
880
+ integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==
881
+ dependencies:
882
+ "@babel/code-frame" "^7.18.6"
883
+ "@babel/generator" "^7.18.9"
884
+ "@babel/helper-environment-visitor" "^7.18.9"
885
+ "@babel/helper-function-name" "^7.18.9"
886
+ "@babel/helper-hoist-variables" "^7.18.6"
887
+ "@babel/helper-split-export-declaration" "^7.18.6"
888
+ "@babel/parser" "^7.18.9"
889
+ "@babel/types" "^7.18.9"
890
+ debug "^4.1.0"
891
+ globals "^11.1.0"
892
+
893
+ "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.4.4":
894
+ version "7.18.9"
895
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.9.tgz#7148d64ba133d8d73a41b3172ac4b83a1452205f"
896
+ integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==
897
+ dependencies:
898
+ "@babel/helper-validator-identifier" "^7.18.6"
899
+ to-fast-properties "^2.0.0"
900
+
901
+ "@discoveryjs/json-ext@^0.5.0":
902
+ version "0.5.7"
903
+ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
904
+ integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
905
+
906
+ "@jridgewell/gen-mapping@^0.1.0":
907
+ version "0.1.1"
908
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
909
+ integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==
910
+ dependencies:
911
+ "@jridgewell/set-array" "^1.0.0"
912
+ "@jridgewell/sourcemap-codec" "^1.4.10"
913
+
914
+ "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
915
+ version "0.3.2"
916
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
917
+ integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
918
+ dependencies:
919
+ "@jridgewell/set-array" "^1.0.1"
920
+ "@jridgewell/sourcemap-codec" "^1.4.10"
921
+ "@jridgewell/trace-mapping" "^0.3.9"
922
+
923
+ "@jridgewell/resolve-uri@^3.0.3":
924
+ version "3.1.0"
925
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
926
+ integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
927
+
928
+ "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
929
+ version "1.1.2"
930
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
931
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
932
+
933
+ "@jridgewell/source-map@^0.3.2":
934
+ version "0.3.2"
935
+ resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
936
+ integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
937
+ dependencies:
938
+ "@jridgewell/gen-mapping" "^0.3.0"
939
+ "@jridgewell/trace-mapping" "^0.3.9"
940
+
941
+ "@jridgewell/sourcemap-codec@^1.4.10":
942
+ version "1.4.14"
943
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
944
+ integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
945
+
946
+ "@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9":
947
+ version "0.3.14"
948
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed"
949
+ integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==
950
+ dependencies:
951
+ "@jridgewell/resolve-uri" "^3.0.3"
952
+ "@jridgewell/sourcemap-codec" "^1.4.10"
953
+
954
+ "@types/eslint-scope@^3.7.3":
955
+ version "3.7.4"
956
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16"
957
+ integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==
958
+ dependencies:
959
+ "@types/eslint" "*"
960
+ "@types/estree" "*"
961
+
962
+ "@types/eslint@*":
963
+ version "8.4.5"
964
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.5.tgz#acdfb7dd36b91cc5d812d7c093811a8f3d9b31e4"
965
+ integrity sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==
966
+ dependencies:
967
+ "@types/estree" "*"
968
+ "@types/json-schema" "*"
969
+
970
+ "@types/estree@*":
971
+ version "1.0.0"
972
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2"
973
+ integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==
974
+
975
+ "@types/estree@^0.0.51":
976
+ version "0.0.51"
977
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40"
978
+ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==
979
+
980
+ "@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8":
981
+ version "7.0.11"
982
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
983
+ integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
984
+
985
+ "@types/node@*":
986
+ version "18.0.6"
987
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.6.tgz#0ba49ac517ad69abe7a1508bc9b3a5483df9d5d7"
988
+ integrity sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==
989
+
990
+ "@webassemblyjs/ast@1.11.1":
991
+ version "1.11.1"
992
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
993
+ integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==
994
+ dependencies:
995
+ "@webassemblyjs/helper-numbers" "1.11.1"
996
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
997
+
998
+ "@webassemblyjs/floating-point-hex-parser@1.11.1":
999
+ version "1.11.1"
1000
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f"
1001
+ integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==
1002
+
1003
+ "@webassemblyjs/helper-api-error@1.11.1":
1004
+ version "1.11.1"
1005
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16"
1006
+ integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==
1007
+
1008
+ "@webassemblyjs/helper-buffer@1.11.1":
1009
+ version "1.11.1"
1010
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5"
1011
+ integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==
1012
+
1013
+ "@webassemblyjs/helper-numbers@1.11.1":
1014
+ version "1.11.1"
1015
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae"
1016
+ integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==
1017
+ dependencies:
1018
+ "@webassemblyjs/floating-point-hex-parser" "1.11.1"
1019
+ "@webassemblyjs/helper-api-error" "1.11.1"
1020
+ "@xtuc/long" "4.2.2"
1021
+
1022
+ "@webassemblyjs/helper-wasm-bytecode@1.11.1":
1023
+ version "1.11.1"
1024
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1"
1025
+ integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==
1026
+
1027
+ "@webassemblyjs/helper-wasm-section@1.11.1":
1028
+ version "1.11.1"
1029
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a"
1030
+ integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==
1031
+ dependencies:
1032
+ "@webassemblyjs/ast" "1.11.1"
1033
+ "@webassemblyjs/helper-buffer" "1.11.1"
1034
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
1035
+ "@webassemblyjs/wasm-gen" "1.11.1"
1036
+
1037
+ "@webassemblyjs/ieee754@1.11.1":
1038
+ version "1.11.1"
1039
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614"
1040
+ integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==
1041
+ dependencies:
1042
+ "@xtuc/ieee754" "^1.2.0"
1043
+
1044
+ "@webassemblyjs/leb128@1.11.1":
1045
+ version "1.11.1"
1046
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5"
1047
+ integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==
1048
+ dependencies:
1049
+ "@xtuc/long" "4.2.2"
1050
+
1051
+ "@webassemblyjs/utf8@1.11.1":
1052
+ version "1.11.1"
1053
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff"
1054
+ integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==
1055
+
1056
+ "@webassemblyjs/wasm-edit@1.11.1":
1057
+ version "1.11.1"
1058
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6"
1059
+ integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==
1060
+ dependencies:
1061
+ "@webassemblyjs/ast" "1.11.1"
1062
+ "@webassemblyjs/helper-buffer" "1.11.1"
1063
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
1064
+ "@webassemblyjs/helper-wasm-section" "1.11.1"
1065
+ "@webassemblyjs/wasm-gen" "1.11.1"
1066
+ "@webassemblyjs/wasm-opt" "1.11.1"
1067
+ "@webassemblyjs/wasm-parser" "1.11.1"
1068
+ "@webassemblyjs/wast-printer" "1.11.1"
1069
+
1070
+ "@webassemblyjs/wasm-gen@1.11.1":
1071
+ version "1.11.1"
1072
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76"
1073
+ integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==
1074
+ dependencies:
1075
+ "@webassemblyjs/ast" "1.11.1"
1076
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
1077
+ "@webassemblyjs/ieee754" "1.11.1"
1078
+ "@webassemblyjs/leb128" "1.11.1"
1079
+ "@webassemblyjs/utf8" "1.11.1"
1080
+
1081
+ "@webassemblyjs/wasm-opt@1.11.1":
1082
+ version "1.11.1"
1083
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2"
1084
+ integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==
1085
+ dependencies:
1086
+ "@webassemblyjs/ast" "1.11.1"
1087
+ "@webassemblyjs/helper-buffer" "1.11.1"
1088
+ "@webassemblyjs/wasm-gen" "1.11.1"
1089
+ "@webassemblyjs/wasm-parser" "1.11.1"
1090
+
1091
+ "@webassemblyjs/wasm-parser@1.11.1":
1092
+ version "1.11.1"
1093
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199"
1094
+ integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==
1095
+ dependencies:
1096
+ "@webassemblyjs/ast" "1.11.1"
1097
+ "@webassemblyjs/helper-api-error" "1.11.1"
1098
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
1099
+ "@webassemblyjs/ieee754" "1.11.1"
1100
+ "@webassemblyjs/leb128" "1.11.1"
1101
+ "@webassemblyjs/utf8" "1.11.1"
1102
+
1103
+ "@webassemblyjs/wast-printer@1.11.1":
1104
+ version "1.11.1"
1105
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0"
1106
+ integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==
1107
+ dependencies:
1108
+ "@webassemblyjs/ast" "1.11.1"
1109
+ "@xtuc/long" "4.2.2"
1110
+
1111
+ "@webpack-cli/configtest@^1.2.0":
1112
+ version "1.2.0"
1113
+ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5"
1114
+ integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==
1115
+
1116
+ "@webpack-cli/info@^1.5.0":
1117
+ version "1.5.0"
1118
+ resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1"
1119
+ integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==
1120
+ dependencies:
1121
+ envinfo "^7.7.3"
1122
+
1123
+ "@webpack-cli/serve@^1.7.0":
1124
+ version "1.7.0"
1125
+ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1"
1126
+ integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==
1127
+
1128
+ "@xtuc/ieee754@^1.2.0":
1129
+ version "1.2.0"
1130
+ resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
1131
+ integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
1132
+
1133
+ "@xtuc/long@4.2.2":
1134
+ version "4.2.2"
1135
+ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
1136
+ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
1137
+
1138
+ acorn-import-assertions@^1.7.6:
1139
+ version "1.8.0"
1140
+ resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9"
1141
+ integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==
1142
+
1143
+ acorn@^8.4.1, acorn@^8.5.0:
1144
+ version "8.7.1"
1145
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
1146
+ integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
1147
+
1148
+ ajv-keywords@^3.5.2:
1149
+ version "3.5.2"
1150
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
1151
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
1152
+
1153
+ ajv@^6.12.4, ajv@^6.12.5:
1154
+ version "6.12.6"
1155
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
1156
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
1157
+ dependencies:
1158
+ fast-deep-equal "^3.1.1"
1159
+ fast-json-stable-stringify "^2.0.0"
1160
+ json-schema-traverse "^0.4.1"
1161
+ uri-js "^4.2.2"
1162
+
1163
+ ansi-styles@^3.2.1:
1164
+ version "3.2.1"
1165
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
1166
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
1167
+ dependencies:
1168
+ color-convert "^1.9.0"
1169
+
1170
+ anymatch@~3.1.2:
1171
+ version "3.1.2"
1172
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
1173
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
1174
+ dependencies:
1175
+ normalize-path "^3.0.0"
1176
+ picomatch "^2.0.4"
1177
+
1178
+ babel-loader@^8.1.0:
1179
+ version "8.2.5"
1180
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e"
1181
+ integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==
1182
+ dependencies:
1183
+ find-cache-dir "^3.3.1"
1184
+ loader-utils "^2.0.0"
1185
+ make-dir "^3.1.0"
1186
+ schema-utils "^2.6.5"
1187
+
1188
+ babel-plugin-dynamic-import-node@^2.3.3:
1189
+ version "2.3.3"
1190
+ resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
1191
+ integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
1192
+ dependencies:
1193
+ object.assign "^4.1.0"
1194
+
1195
+ babel-plugin-polyfill-corejs2@^0.3.1:
1196
+ version "0.3.1"
1197
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5"
1198
+ integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==
1199
+ dependencies:
1200
+ "@babel/compat-data" "^7.13.11"
1201
+ "@babel/helper-define-polyfill-provider" "^0.3.1"
1202
+ semver "^6.1.1"
1203
+
1204
+ babel-plugin-polyfill-corejs3@^0.5.2:
1205
+ version "0.5.2"
1206
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72"
1207
+ integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==
1208
+ dependencies:
1209
+ "@babel/helper-define-polyfill-provider" "^0.3.1"
1210
+ core-js-compat "^3.21.0"
1211
+
1212
+ babel-plugin-polyfill-regenerator@^0.3.1:
1213
+ version "0.3.1"
1214
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990"
1215
+ integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==
1216
+ dependencies:
1217
+ "@babel/helper-define-polyfill-provider" "^0.3.1"
1218
+
1219
+ babel-plugin-syntax-object-rest-spread@^6.8.0:
1220
+ version "6.13.0"
1221
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
1222
+ integrity sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==
1223
+
1224
+ babel-plugin-transform-object-rest-spread@^6.26.0:
1225
+ version "6.26.0"
1226
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
1227
+ integrity sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA==
1228
+ dependencies:
1229
+ babel-plugin-syntax-object-rest-spread "^6.8.0"
1230
+ babel-runtime "^6.26.0"
1231
+
1232
+ babel-runtime@^6.26.0:
1233
+ version "6.26.0"
1234
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
1235
+ integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==
1236
+ dependencies:
1237
+ core-js "^2.4.0"
1238
+ regenerator-runtime "^0.11.0"
1239
+
1240
+ big.js@^5.2.2:
1241
+ version "5.2.2"
1242
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
1243
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
1244
+
1245
+ binary-extensions@^2.0.0:
1246
+ version "2.2.0"
1247
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
1248
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
1249
+
1250
+ braces@~3.0.2:
1251
+ version "3.0.2"
1252
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
1253
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
1254
+ dependencies:
1255
+ fill-range "^7.0.1"
1256
+
1257
+ browserslist@^4.14.5, browserslist@^4.20.2, browserslist@^4.21.2:
1258
+ version "4.21.2"
1259
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.2.tgz#59a400757465535954946a400b841ed37e2b4ecf"
1260
+ integrity sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==
1261
+ dependencies:
1262
+ caniuse-lite "^1.0.30001366"
1263
+ electron-to-chromium "^1.4.188"
1264
+ node-releases "^2.0.6"
1265
+ update-browserslist-db "^1.0.4"
1266
+
1267
+ buffer-from@^1.0.0:
1268
+ version "1.1.2"
1269
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
1270
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
1271
+
1272
+ call-bind@^1.0.0:
1273
+ version "1.0.2"
1274
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
1275
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
1276
+ dependencies:
1277
+ function-bind "^1.1.1"
1278
+ get-intrinsic "^1.0.2"
1279
+
1280
+ caniuse-lite@^1.0.30001366:
1281
+ version "1.0.30001367"
1282
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz#2b97fe472e8fa29c78c5970615d7cd2ee414108a"
1283
+ integrity sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==
1284
+
1285
+ chalk@^2.0.0:
1286
+ version "2.4.2"
1287
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
1288
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
1289
+ dependencies:
1290
+ ansi-styles "^3.2.1"
1291
+ escape-string-regexp "^1.0.5"
1292
+ supports-color "^5.3.0"
1293
+
1294
+ "chokidar@>=3.0.0 <4.0.0":
1295
+ version "3.5.3"
1296
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
1297
+ integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
1298
+ dependencies:
1299
+ anymatch "~3.1.2"
1300
+ braces "~3.0.2"
1301
+ glob-parent "~5.1.2"
1302
+ is-binary-path "~2.1.0"
1303
+ is-glob "~4.0.1"
1304
+ normalize-path "~3.0.0"
1305
+ readdirp "~3.6.0"
1306
+ optionalDependencies:
1307
+ fsevents "~2.3.2"
1308
+
1309
+ chrome-trace-event@^1.0.2:
1310
+ version "1.0.3"
1311
+ resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
1312
+ integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
1313
+
1314
+ clone-deep@^4.0.1:
1315
+ version "4.0.1"
1316
+ resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
1317
+ integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
1318
+ dependencies:
1319
+ is-plain-object "^2.0.4"
1320
+ kind-of "^6.0.2"
1321
+ shallow-clone "^3.0.0"
1322
+
1323
+ color-convert@^1.9.0:
1324
+ version "1.9.3"
1325
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
1326
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
1327
+ dependencies:
1328
+ color-name "1.1.3"
1329
+
1330
+ color-name@1.1.3:
1331
+ version "1.1.3"
1332
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
1333
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
1334
+
1335
+ colorette@^2.0.14:
1336
+ version "2.0.19"
1337
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
1338
+ integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
1339
+
1340
+ commander@^2.20.0:
1341
+ version "2.20.3"
1342
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
1343
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
1344
+
1345
+ commander@^7.0.0:
1346
+ version "7.2.0"
1347
+ resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
1348
+ integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
1349
+
1350
+ commondir@^1.0.1:
1351
+ version "1.0.1"
1352
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
1353
+ integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==
1354
+
1355
+ convert-source-map@^1.7.0:
1356
+ version "1.8.0"
1357
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
1358
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
1359
+ dependencies:
1360
+ safe-buffer "~5.1.1"
1361
+
1362
+ core-js-compat@^3.21.0, core-js-compat@^3.22.1:
1363
+ version "3.23.5"
1364
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.23.5.tgz#11edce2f1c4f69a96d30ce77c805ce118909cd5b"
1365
+ integrity sha512-fHYozIFIxd+91IIbXJgWd/igXIc8Mf9is0fusswjnGIWVG96y2cwyUdlCkGOw6rMLHKAxg7xtCIVaHsyOUnJIg==
1366
+ dependencies:
1367
+ browserslist "^4.21.2"
1368
+ semver "7.0.0"
1369
+
1370
+ core-js@^2.4.0:
1371
+ version "2.6.12"
1372
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
1373
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
1374
+
1375
+ cross-env@^7.0.3:
1376
+ version "7.0.3"
1377
+ resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
1378
+ integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
1379
+ dependencies:
1380
+ cross-spawn "^7.0.1"
1381
+
1382
+ cross-spawn@^7.0.1, cross-spawn@^7.0.3:
1383
+ version "7.0.3"
1384
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
1385
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
1386
+ dependencies:
1387
+ path-key "^3.1.0"
1388
+ shebang-command "^2.0.0"
1389
+ which "^2.0.1"
1390
+
1391
+ debug@^4.1.0, debug@^4.1.1:
1392
+ version "4.3.4"
1393
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
1394
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
1395
+ dependencies:
1396
+ ms "2.1.2"
1397
+
1398
+ define-properties@^1.1.3:
1399
+ version "1.1.4"
1400
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1"
1401
+ integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==
1402
+ dependencies:
1403
+ has-property-descriptors "^1.0.0"
1404
+ object-keys "^1.1.1"
1405
+
1406
+ electron-to-chromium@^1.4.188:
1407
+ version "1.4.195"
1408
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.195.tgz#139b2d95a42a3f17df217589723a1deac71d1473"
1409
+ integrity sha512-vefjEh0sk871xNmR5whJf9TEngX+KTKS3hOHpjoMpauKkwlGwtMz1H8IaIjAT/GNnX0TbGwAdmVoXCAzXf+PPg==
1410
+
1411
+ emojis-list@^3.0.0:
1412
+ version "3.0.0"
1413
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
1414
+ integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
1415
+
1416
+ enhanced-resolve@^5.9.3:
1417
+ version "5.10.0"
1418
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6"
1419
+ integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==
1420
+ dependencies:
1421
+ graceful-fs "^4.2.4"
1422
+ tapable "^2.2.0"
1423
+
1424
+ envinfo@^7.7.3:
1425
+ version "7.8.1"
1426
+ resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
1427
+ integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
1428
+
1429
+ es-module-lexer@^0.9.0:
1430
+ version "0.9.3"
1431
+ resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
1432
+ integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
1433
+
1434
+ escalade@^3.1.1:
1435
+ version "3.1.1"
1436
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
1437
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
1438
+
1439
+ escape-string-regexp@^1.0.5:
1440
+ version "1.0.5"
1441
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
1442
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
1443
+
1444
+ eslint-scope@5.1.1:
1445
+ version "5.1.1"
1446
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
1447
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
1448
+ dependencies:
1449
+ esrecurse "^4.3.0"
1450
+ estraverse "^4.1.1"
1451
+
1452
+ esrecurse@^4.3.0:
1453
+ version "4.3.0"
1454
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
1455
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
1456
+ dependencies:
1457
+ estraverse "^5.2.0"
1458
+
1459
+ estraverse@^4.1.1:
1460
+ version "4.3.0"
1461
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
1462
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
1463
+
1464
+ estraverse@^5.2.0:
1465
+ version "5.3.0"
1466
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
1467
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
1468
+
1469
+ esutils@^2.0.2:
1470
+ version "2.0.3"
1471
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
1472
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
1473
+
1474
+ events@^3.2.0:
1475
+ version "3.3.0"
1476
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
1477
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
1478
+
1479
+ fast-deep-equal@^3.1.1:
1480
+ version "3.1.3"
1481
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
1482
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
1483
+
1484
+ fast-json-stable-stringify@^2.0.0:
1485
+ version "2.1.0"
1486
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
1487
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
1488
+
1489
+ fastest-levenshtein@^1.0.12:
1490
+ version "1.0.14"
1491
+ resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.14.tgz#9054384e4b7a78c88d01a4432dc18871af0ac859"
1492
+ integrity sha512-tFfWHjnuUfKE186Tfgr+jtaFc0mZTApEgKDOeyN+FwOqRkO/zK/3h1AiRd8u8CY53owL3CUmGr/oI9p/RdyLTA==
1493
+
1494
+ file-loader@^6.2.0:
1495
+ version "6.2.0"
1496
+ resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d"
1497
+ integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==
1498
+ dependencies:
1499
+ loader-utils "^2.0.0"
1500
+ schema-utils "^3.0.0"
1501
+
1502
+ fill-range@^7.0.1:
1503
+ version "7.0.1"
1504
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
1505
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
1506
+ dependencies:
1507
+ to-regex-range "^5.0.1"
1508
+
1509
+ find-cache-dir@^3.3.1:
1510
+ version "3.3.2"
1511
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b"
1512
+ integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
1513
+ dependencies:
1514
+ commondir "^1.0.1"
1515
+ make-dir "^3.0.2"
1516
+ pkg-dir "^4.1.0"
1517
+
1518
+ find-up@^4.0.0:
1519
+ version "4.1.0"
1520
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
1521
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
1522
+ dependencies:
1523
+ locate-path "^5.0.0"
1524
+ path-exists "^4.0.0"
1525
+
1526
+ fsevents@~2.3.2:
1527
+ version "2.3.2"
1528
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
1529
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
1530
+
1531
+ function-bind@^1.1.1:
1532
+ version "1.1.1"
1533
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
1534
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
1535
+
1536
+ gensync@^1.0.0-beta.2:
1537
+ version "1.0.0-beta.2"
1538
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
1539
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
1540
+
1541
+ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1:
1542
+ version "1.1.2"
1543
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598"
1544
+ integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==
1545
+ dependencies:
1546
+ function-bind "^1.1.1"
1547
+ has "^1.0.3"
1548
+ has-symbols "^1.0.3"
1549
+
1550
+ glob-parent@~5.1.2:
1551
+ version "5.1.2"
1552
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
1553
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
1554
+ dependencies:
1555
+ is-glob "^4.0.1"
1556
+
1557
+ glob-to-regexp@^0.4.1:
1558
+ version "0.4.1"
1559
+ resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
1560
+ integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
1561
+
1562
+ globals@^11.1.0:
1563
+ version "11.12.0"
1564
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
1565
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
1566
+
1567
+ graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
1568
+ version "4.2.10"
1569
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
1570
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
1571
+
1572
+ has-flag@^3.0.0:
1573
+ version "3.0.0"
1574
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
1575
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
1576
+
1577
+ has-flag@^4.0.0:
1578
+ version "4.0.0"
1579
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
1580
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
1581
+
1582
+ has-property-descriptors@^1.0.0:
1583
+ version "1.0.0"
1584
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
1585
+ integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
1586
+ dependencies:
1587
+ get-intrinsic "^1.1.1"
1588
+
1589
+ has-symbols@^1.0.1, has-symbols@^1.0.3:
1590
+ version "1.0.3"
1591
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
1592
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
1593
+
1594
+ has@^1.0.3:
1595
+ version "1.0.3"
1596
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
1597
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
1598
+ dependencies:
1599
+ function-bind "^1.1.1"
1600
+
1601
+ immutable@^4.0.0:
1602
+ version "4.1.0"
1603
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef"
1604
+ integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==
1605
+
1606
+ import-local@^3.0.2:
1607
+ version "3.1.0"
1608
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
1609
+ integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
1610
+ dependencies:
1611
+ pkg-dir "^4.2.0"
1612
+ resolve-cwd "^3.0.0"
1613
+
1614
+ interpret@^2.2.0:
1615
+ version "2.2.0"
1616
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
1617
+ integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
1618
+
1619
+ is-binary-path@~2.1.0:
1620
+ version "2.1.0"
1621
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
1622
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
1623
+ dependencies:
1624
+ binary-extensions "^2.0.0"
1625
+
1626
+ is-core-module@^2.9.0:
1627
+ version "2.9.0"
1628
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69"
1629
+ integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
1630
+ dependencies:
1631
+ has "^1.0.3"
1632
+
1633
+ is-extglob@^2.1.1:
1634
+ version "2.1.1"
1635
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
1636
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
1637
+
1638
+ is-glob@^4.0.1, is-glob@~4.0.1:
1639
+ version "4.0.3"
1640
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
1641
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
1642
+ dependencies:
1643
+ is-extglob "^2.1.1"
1644
+
1645
+ is-number@^7.0.0:
1646
+ version "7.0.0"
1647
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
1648
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
1649
+
1650
+ is-plain-object@^2.0.4:
1651
+ version "2.0.4"
1652
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
1653
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
1654
+ dependencies:
1655
+ isobject "^3.0.1"
1656
+
1657
+ isexe@^2.0.0:
1658
+ version "2.0.0"
1659
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
1660
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
1661
+
1662
+ isobject@^3.0.1:
1663
+ version "3.0.1"
1664
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
1665
+ integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
1666
+
1667
+ jest-worker@^27.4.5:
1668
+ version "27.5.1"
1669
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
1670
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
1671
+ dependencies:
1672
+ "@types/node" "*"
1673
+ merge-stream "^2.0.0"
1674
+ supports-color "^8.0.0"
1675
+
1676
+ js-tokens@^4.0.0:
1677
+ version "4.0.0"
1678
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
1679
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
1680
+
1681
+ jsesc@^2.5.1:
1682
+ version "2.5.2"
1683
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
1684
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
1685
+
1686
+ jsesc@~0.5.0:
1687
+ version "0.5.0"
1688
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
1689
+ integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
1690
+
1691
+ json-parse-even-better-errors@^2.3.1:
1692
+ version "2.3.1"
1693
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
1694
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
1695
+
1696
+ json-schema-traverse@^0.4.1:
1697
+ version "0.4.1"
1698
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
1699
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
1700
+
1701
+ json5@^2.1.2, json5@^2.2.1:
1702
+ version "2.2.1"
1703
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
1704
+ integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
1705
+
1706
+ kind-of@^6.0.2:
1707
+ version "6.0.3"
1708
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
1709
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
1710
+
1711
+ klona@^2.0.4:
1712
+ version "2.0.5"
1713
+ resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc"
1714
+ integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==
1715
+
1716
+ loader-runner@^4.2.0:
1717
+ version "4.3.0"
1718
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1"
1719
+ integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
1720
+
1721
+ loader-utils@^2.0.0:
1722
+ version "2.0.2"
1723
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129"
1724
+ integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==
1725
+ dependencies:
1726
+ big.js "^5.2.2"
1727
+ emojis-list "^3.0.0"
1728
+ json5 "^2.1.2"
1729
+
1730
+ locate-path@^5.0.0:
1731
+ version "5.0.0"
1732
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
1733
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
1734
+ dependencies:
1735
+ p-locate "^4.1.0"
1736
+
1737
+ lodash.debounce@^4.0.8:
1738
+ version "4.0.8"
1739
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
1740
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
1741
+
1742
+ make-dir@^3.0.2, make-dir@^3.1.0:
1743
+ version "3.1.0"
1744
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
1745
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
1746
+ dependencies:
1747
+ semver "^6.0.0"
1748
+
1749
+ merge-stream@^2.0.0:
1750
+ version "2.0.0"
1751
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
1752
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
1753
+
1754
+ mime-db@1.52.0:
1755
+ version "1.52.0"
1756
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
1757
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
1758
+
1759
+ mime-types@^2.1.27:
1760
+ version "2.1.35"
1761
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
1762
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
1763
+ dependencies:
1764
+ mime-db "1.52.0"
1765
+
1766
+ ms@2.1.2:
1767
+ version "2.1.2"
1768
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
1769
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
1770
+
1771
+ neo-async@^2.6.2:
1772
+ version "2.6.2"
1773
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
1774
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
1775
+
1776
+ node-releases@^2.0.6:
1777
+ version "2.0.6"
1778
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503"
1779
+ integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==
1780
+
1781
+ normalize-path@^3.0.0, normalize-path@~3.0.0:
1782
+ version "3.0.0"
1783
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
1784
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
1785
+
1786
+ object-keys@^1.1.1:
1787
+ version "1.1.1"
1788
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
1789
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
1790
+
1791
+ object.assign@^4.1.0:
1792
+ version "4.1.2"
1793
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
1794
+ integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
1795
+ dependencies:
1796
+ call-bind "^1.0.0"
1797
+ define-properties "^1.1.3"
1798
+ has-symbols "^1.0.1"
1799
+ object-keys "^1.1.1"
1800
+
1801
+ p-limit@^2.2.0:
1802
+ version "2.3.0"
1803
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
1804
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
1805
+ dependencies:
1806
+ p-try "^2.0.0"
1807
+
1808
+ p-locate@^4.1.0:
1809
+ version "4.1.0"
1810
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
1811
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
1812
+ dependencies:
1813
+ p-limit "^2.2.0"
1814
+
1815
+ p-try@^2.0.0:
1816
+ version "2.2.0"
1817
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
1818
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
1819
+
1820
+ path-exists@^4.0.0:
1821
+ version "4.0.0"
1822
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
1823
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
1824
+
1825
+ path-key@^3.1.0:
1826
+ version "3.1.1"
1827
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
1828
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
1829
+
1830
+ path-parse@^1.0.7:
1831
+ version "1.0.7"
1832
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
1833
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
1834
+
1835
+ picocolors@^1.0.0:
1836
+ version "1.0.0"
1837
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
1838
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
1839
+
1840
+ picomatch@^2.0.4, picomatch@^2.2.1:
1841
+ version "2.3.1"
1842
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
1843
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
1844
+
1845
+ pkg-dir@^4.1.0, pkg-dir@^4.2.0:
1846
+ version "4.2.0"
1847
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
1848
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
1849
+ dependencies:
1850
+ find-up "^4.0.0"
1851
+
1852
+ punycode@^2.1.0:
1853
+ version "2.1.1"
1854
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
1855
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
1856
+
1857
+ randombytes@^2.1.0:
1858
+ version "2.1.0"
1859
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
1860
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
1861
+ dependencies:
1862
+ safe-buffer "^5.1.0"
1863
+
1864
+ readdirp@~3.6.0:
1865
+ version "3.6.0"
1866
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
1867
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
1868
+ dependencies:
1869
+ picomatch "^2.2.1"
1870
+
1871
+ rechoir@^0.7.0:
1872
+ version "0.7.1"
1873
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686"
1874
+ integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==
1875
+ dependencies:
1876
+ resolve "^1.9.0"
1877
+
1878
+ regenerate-unicode-properties@^10.0.1:
1879
+ version "10.0.1"
1880
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56"
1881
+ integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==
1882
+ dependencies:
1883
+ regenerate "^1.4.2"
1884
+
1885
+ regenerate@^1.4.2:
1886
+ version "1.4.2"
1887
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
1888
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
1889
+
1890
+ regenerator-runtime@^0.11.0:
1891
+ version "0.11.1"
1892
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
1893
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
1894
+
1895
+ regenerator-runtime@^0.13.4:
1896
+ version "0.13.9"
1897
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
1898
+ integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
1899
+
1900
+ regenerator-transform@^0.15.0:
1901
+ version "0.15.0"
1902
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537"
1903
+ integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==
1904
+ dependencies:
1905
+ "@babel/runtime" "^7.8.4"
1906
+
1907
+ regexpu-core@^5.1.0:
1908
+ version "5.1.0"
1909
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d"
1910
+ integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==
1911
+ dependencies:
1912
+ regenerate "^1.4.2"
1913
+ regenerate-unicode-properties "^10.0.1"
1914
+ regjsgen "^0.6.0"
1915
+ regjsparser "^0.8.2"
1916
+ unicode-match-property-ecmascript "^2.0.0"
1917
+ unicode-match-property-value-ecmascript "^2.0.0"
1918
+
1919
+ regjsgen@^0.6.0:
1920
+ version "0.6.0"
1921
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d"
1922
+ integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==
1923
+
1924
+ regjsparser@^0.8.2:
1925
+ version "0.8.4"
1926
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f"
1927
+ integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==
1928
+ dependencies:
1929
+ jsesc "~0.5.0"
1930
+
1931
+ resolve-cwd@^3.0.0:
1932
+ version "3.0.0"
1933
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
1934
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
1935
+ dependencies:
1936
+ resolve-from "^5.0.0"
1937
+
1938
+ resolve-from@^5.0.0:
1939
+ version "5.0.0"
1940
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
1941
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
1942
+
1943
+ resolve@^1.14.2, resolve@^1.9.0:
1944
+ version "1.22.1"
1945
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
1946
+ integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
1947
+ dependencies:
1948
+ is-core-module "^2.9.0"
1949
+ path-parse "^1.0.7"
1950
+ supports-preserve-symlinks-flag "^1.0.0"
1951
+
1952
+ safe-buffer@^5.1.0:
1953
+ version "5.2.1"
1954
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
1955
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
1956
+
1957
+ safe-buffer@~5.1.1:
1958
+ version "5.1.2"
1959
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
1960
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
1961
+
1962
+ sass-loader@^12.1.0:
1963
+ version "12.6.0"
1964
+ resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb"
1965
+ integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==
1966
+ dependencies:
1967
+ klona "^2.0.4"
1968
+ neo-async "^2.6.2"
1969
+
1970
+ sass@^1.42.1:
1971
+ version "1.53.0"
1972
+ resolved "https://registry.yarnpkg.com/sass/-/sass-1.53.0.tgz#eab73a7baac045cc57ddc1d1ff501ad2659952eb"
1973
+ integrity sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==
1974
+ dependencies:
1975
+ chokidar ">=3.0.0 <4.0.0"
1976
+ immutable "^4.0.0"
1977
+ source-map-js ">=0.6.2 <2.0.0"
1978
+
1979
+ schema-utils@^2.6.5:
1980
+ version "2.7.1"
1981
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
1982
+ integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
1983
+ dependencies:
1984
+ "@types/json-schema" "^7.0.5"
1985
+ ajv "^6.12.4"
1986
+ ajv-keywords "^3.5.2"
1987
+
1988
+ schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1:
1989
+ version "3.1.1"
1990
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281"
1991
+ integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
1992
+ dependencies:
1993
+ "@types/json-schema" "^7.0.8"
1994
+ ajv "^6.12.5"
1995
+ ajv-keywords "^3.5.2"
1996
+
1997
+ semver@7.0.0:
1998
+ version "7.0.0"
1999
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
2000
+ integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
2001
+
2002
+ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
2003
+ version "6.3.0"
2004
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
2005
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
2006
+
2007
+ serialize-javascript@^6.0.0:
2008
+ version "6.0.0"
2009
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
2010
+ integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
2011
+ dependencies:
2012
+ randombytes "^2.1.0"
2013
+
2014
+ shallow-clone@^3.0.0:
2015
+ version "3.0.1"
2016
+ resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
2017
+ integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
2018
+ dependencies:
2019
+ kind-of "^6.0.2"
2020
+
2021
+ shebang-command@^2.0.0:
2022
+ version "2.0.0"
2023
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
2024
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
2025
+ dependencies:
2026
+ shebang-regex "^3.0.0"
2027
+
2028
+ shebang-regex@^3.0.0:
2029
+ version "3.0.0"
2030
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
2031
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
2032
+
2033
+ "source-map-js@>=0.6.2 <2.0.0":
2034
+ version "1.0.2"
2035
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
2036
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
2037
+
2038
+ source-map-support@~0.5.20:
2039
+ version "0.5.21"
2040
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
2041
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
2042
+ dependencies:
2043
+ buffer-from "^1.0.0"
2044
+ source-map "^0.6.0"
2045
+
2046
+ source-map@^0.6.0:
2047
+ version "0.6.1"
2048
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
2049
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
2050
+
2051
+ supports-color@^5.3.0:
2052
+ version "5.5.0"
2053
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
2054
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
2055
+ dependencies:
2056
+ has-flag "^3.0.0"
2057
+
2058
+ supports-color@^8.0.0:
2059
+ version "8.1.1"
2060
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
2061
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
2062
+ dependencies:
2063
+ has-flag "^4.0.0"
2064
+
2065
+ supports-preserve-symlinks-flag@^1.0.0:
2066
+ version "1.0.0"
2067
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
2068
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
2069
+
2070
+ tapable@^2.1.1, tapable@^2.2.0:
2071
+ version "2.2.1"
2072
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
2073
+ integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
2074
+
2075
+ terser-webpack-plugin@^5.1.3:
2076
+ version "5.3.3"
2077
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90"
2078
+ integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==
2079
+ dependencies:
2080
+ "@jridgewell/trace-mapping" "^0.3.7"
2081
+ jest-worker "^27.4.5"
2082
+ schema-utils "^3.1.1"
2083
+ serialize-javascript "^6.0.0"
2084
+ terser "^5.7.2"
2085
+
2086
+ terser@^5.7.2:
2087
+ version "5.14.2"
2088
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10"
2089
+ integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==
2090
+ dependencies:
2091
+ "@jridgewell/source-map" "^0.3.2"
2092
+ acorn "^8.5.0"
2093
+ commander "^2.20.0"
2094
+ source-map-support "~0.5.20"
2095
+
2096
+ to-fast-properties@^2.0.0:
2097
+ version "2.0.0"
2098
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
2099
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
2100
+
2101
+ to-regex-range@^5.0.1:
2102
+ version "5.0.1"
2103
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
2104
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
2105
+ dependencies:
2106
+ is-number "^7.0.0"
2107
+
2108
+ unicode-canonical-property-names-ecmascript@^2.0.0:
2109
+ version "2.0.0"
2110
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
2111
+ integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
2112
+
2113
+ unicode-match-property-ecmascript@^2.0.0:
2114
+ version "2.0.0"
2115
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3"
2116
+ integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==
2117
+ dependencies:
2118
+ unicode-canonical-property-names-ecmascript "^2.0.0"
2119
+ unicode-property-aliases-ecmascript "^2.0.0"
2120
+
2121
+ unicode-match-property-value-ecmascript@^2.0.0:
2122
+ version "2.0.0"
2123
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714"
2124
+ integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==
2125
+
2126
+ unicode-property-aliases-ecmascript@^2.0.0:
2127
+ version "2.0.0"
2128
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8"
2129
+ integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==
2130
+
2131
+ update-browserslist-db@^1.0.4:
2132
+ version "1.0.5"
2133
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38"
2134
+ integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==
2135
+ dependencies:
2136
+ escalade "^3.1.1"
2137
+ picocolors "^1.0.0"
2138
+
2139
+ uri-js@^4.2.2:
2140
+ version "4.4.1"
2141
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
2142
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
2143
+ dependencies:
2144
+ punycode "^2.1.0"
2145
+
2146
+ watchpack@^2.3.1:
2147
+ version "2.4.0"
2148
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"
2149
+ integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==
2150
+ dependencies:
2151
+ glob-to-regexp "^0.4.1"
2152
+ graceful-fs "^4.1.2"
2153
+
2154
+ webpack-cli@^4.8.0:
2155
+ version "4.10.0"
2156
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31"
2157
+ integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==
2158
+ dependencies:
2159
+ "@discoveryjs/json-ext" "^0.5.0"
2160
+ "@webpack-cli/configtest" "^1.2.0"
2161
+ "@webpack-cli/info" "^1.5.0"
2162
+ "@webpack-cli/serve" "^1.7.0"
2163
+ colorette "^2.0.14"
2164
+ commander "^7.0.0"
2165
+ cross-spawn "^7.0.3"
2166
+ fastest-levenshtein "^1.0.12"
2167
+ import-local "^3.0.2"
2168
+ interpret "^2.2.0"
2169
+ rechoir "^0.7.0"
2170
+ webpack-merge "^5.7.3"
2171
+
2172
+ webpack-merge@^5.7.3:
2173
+ version "5.8.0"
2174
+ resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61"
2175
+ integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==
2176
+ dependencies:
2177
+ clone-deep "^4.0.1"
2178
+ wildcard "^2.0.0"
2179
+
2180
+ webpack-sources@^3.2.3:
2181
+ version "3.2.3"
2182
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
2183
+ integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
2184
+
2185
+ webpack@^5.55.0:
2186
+ version "5.73.0"
2187
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38"
2188
+ integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==
2189
+ dependencies:
2190
+ "@types/eslint-scope" "^3.7.3"
2191
+ "@types/estree" "^0.0.51"
2192
+ "@webassemblyjs/ast" "1.11.1"
2193
+ "@webassemblyjs/wasm-edit" "1.11.1"
2194
+ "@webassemblyjs/wasm-parser" "1.11.1"
2195
+ acorn "^8.4.1"
2196
+ acorn-import-assertions "^1.7.6"
2197
+ browserslist "^4.14.5"
2198
+ chrome-trace-event "^1.0.2"
2199
+ enhanced-resolve "^5.9.3"
2200
+ es-module-lexer "^0.9.0"
2201
+ eslint-scope "5.1.1"
2202
+ events "^3.2.0"
2203
+ glob-to-regexp "^0.4.1"
2204
+ graceful-fs "^4.2.9"
2205
+ json-parse-even-better-errors "^2.3.1"
2206
+ loader-runner "^4.2.0"
2207
+ mime-types "^2.1.27"
2208
+ neo-async "^2.6.2"
2209
+ schema-utils "^3.1.0"
2210
+ tapable "^2.1.1"
2211
+ terser-webpack-plugin "^5.1.3"
2212
+ watchpack "^2.3.1"
2213
+ webpack-sources "^3.2.3"
2214
+
2215
+ which@^2.0.1:
2216
+ version "2.0.2"
2217
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
2218
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
2219
+ dependencies:
2220
+ isexe "^2.0.0"
2221
+
2222
+ wildcard@^2.0.0:
2223
+ version "2.0.0"
2224
+ resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
2225
+ integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
modules/ppcp-status-report/src/StatusReportModule.php CHANGED
@@ -72,6 +72,8 @@ class StatusReportModule implements ModuleInterface {
72
 
73
  $had_ppec_plugin = PPECHelper::is_plugin_configured();
74
 
 
 
75
  $items = array(
76
  array(
77
  'label' => esc_html__( 'Onboarded', 'woocommerce-paypal-payments' ),
@@ -149,6 +151,12 @@ class StatusReportModule implements ModuleInterface {
149
  $had_ppec_plugin
150
  ),
151
  ),
 
 
 
 
 
 
152
  );
153
 
154
  echo wp_kses_post(
72
 
73
  $had_ppec_plugin = PPECHelper::is_plugin_configured();
74
 
75
+ $is_tracking_available = $c->get( 'order-tracking.is-tracking-available' );
76
+
77
  $items = array(
78
  array(
79
  'label' => esc_html__( 'Onboarded', 'woocommerce-paypal-payments' ),
151
  $had_ppec_plugin
152
  ),
153
  ),
154
+ array(
155
+ 'label' => esc_html__( 'Tracking enabled', 'woocommerce-paypal-payments' ),
156
+ 'exported_label' => 'Tracking enabled',
157
+ 'description' => esc_html__( 'Whether tracking is enabled on PayPal account or not.', 'woocommerce-paypal-payments' ),
158
+ 'value' => $this->bool_to_html( $is_tracking_available ),
159
+ ),
160
  );
161
 
162
  echo wp_kses_post(
modules/ppcp-vaulting/services.php CHANGED
@@ -57,4 +57,17 @@ return array(
57
  $container->get( 'woocommerce.logger.woocommerce' )
58
  );
59
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  );
57
  $container->get( 'woocommerce.logger.woocommerce' )
58
  );
59
  },
60
+ 'vaulting.credit-card-handler' => function( ContainerInterface $container ): VaultedCreditCardHandler {
61
+ return new VaultedCreditCardHandler(
62
+ $container->get( 'subscription.helper' ),
63
+ $container->get( 'vaulting.repository.payment-token' ),
64
+ $container->get( 'api.factory.purchase-unit' ),
65
+ $container->get( 'api.factory.payer' ),
66
+ $container->get( 'api.factory.shipping-preference' ),
67
+ $container->get( 'api.endpoint.order' ),
68
+ $container->get( 'onboarding.environment' ),
69
+ $container->get( 'wcgateway.processor.authorized-payments' ),
70
+ $container->get( 'wcgateway.settings' )
71
+ );
72
+ },
73
  );
modules/ppcp-vaulting/src/VaultedCreditCardHandler.php ADDED
@@ -0,0 +1,223 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Handles payment through saved credit card.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\Vaulting
6
+ */
7
+
8
+ declare(strict_types=1);
9
+
10
+ namespace WooCommerce\PayPalCommerce\Vaulting;
11
+
12
+ use Psr\Container\ContainerInterface;
13
+ use WC_Customer;
14
+ use WC_Order;
15
+ use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint;
16
+ use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
17
+ use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
18
+ use WooCommerce\PayPalCommerce\ApiClient\Factory\PayerFactory;
19
+ use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory;
20
+ use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingPreferenceFactory;
21
+ use WooCommerce\PayPalCommerce\Onboarding\Environment;
22
+ use WooCommerce\PayPalCommerce\Subscription\FreeTrialHandlerTrait;
23
+ use WooCommerce\PayPalCommerce\Subscription\Helper\SubscriptionHelper;
24
+ use WooCommerce\PayPalCommerce\WcGateway\Processor\AuthorizedPaymentsProcessor;
25
+ use WooCommerce\PayPalCommerce\WcGateway\Processor\OrderMetaTrait;
26
+ use WooCommerce\PayPalCommerce\WcGateway\Processor\PaymentsStatusHandlingTrait;
27
+ use WooCommerce\PayPalCommerce\WcGateway\Processor\TransactionIdHandlingTrait;
28
+
29
+ /**
30
+ * Class VaultedCreditCardHandler
31
+ */
32
+ class VaultedCreditCardHandler {
33
+
34
+ use OrderMetaTrait, TransactionIdHandlingTrait, PaymentsStatusHandlingTrait, FreeTrialHandlerTrait;
35
+
36
+ /**
37
+ * The subscription helper.
38
+ *
39
+ * @var SubscriptionHelper
40
+ */
41
+ protected $subscription_helper;
42
+
43
+ /**
44
+ * The payment token repository.
45
+ *
46
+ * @var PaymentTokenRepository
47
+ */
48
+ private $payment_token_repository;
49
+
50
+ /**
51
+ * The purchase unit factory.
52
+ *
53
+ * @var PurchaseUnitFactory
54
+ */
55
+ private $purchase_unit_factory;
56
+
57
+ /**
58
+ * The payer factory.
59
+ *
60
+ * @var PayerFactory
61
+ */
62
+ private $payer_factory;
63
+
64
+ /**
65
+ * The shipping_preference factory.
66
+ *
67
+ * @var ShippingPreferenceFactory
68
+ */
69
+ private $shipping_preference_factory;
70
+
71
+ /**
72
+ * The order endpoint.
73
+ *
74
+ * @var OrderEndpoint
75
+ */
76
+ private $order_endpoint;
77
+
78
+ /**
79
+ * The environment.
80
+ *
81
+ * @var Environment
82
+ */
83
+ protected $environment;
84
+
85
+ /**
86
+ * The processor for authorized payments.
87
+ *
88
+ * @var AuthorizedPaymentsProcessor
89
+ */
90
+ protected $authorized_payments_processor;
91
+
92
+ /**
93
+ * The settings.
94
+ *
95
+ * @var ContainerInterface
96
+ */
97
+ protected $config;
98
+
99
+ /**
100
+ * VaultedCreditCardHandler constructor
101
+ *
102
+ * @param SubscriptionHelper $subscription_helper The subscription helper.
103
+ * @param PaymentTokenRepository $payment_token_repository The payment token repository.
104
+ * @param PurchaseUnitFactory $purchase_unit_factory The purchase unit factory.
105
+ * @param PayerFactory $payer_factory The payer factory.
106
+ * @param ShippingPreferenceFactory $shipping_preference_factory The shipping_preference factory.
107
+ * @param OrderEndpoint $order_endpoint The order endpoint.
108
+ * @param Environment $environment The environment.
109
+ * @param AuthorizedPaymentsProcessor $authorized_payments_processor The processor for authorized payments.
110
+ * @param ContainerInterface $config The settings.
111
+ */
112
+ public function __construct(
113
+ SubscriptionHelper $subscription_helper,
114
+ PaymentTokenRepository $payment_token_repository,
115
+ PurchaseUnitFactory $purchase_unit_factory,
116
+ PayerFactory $payer_factory,
117
+ ShippingPreferenceFactory $shipping_preference_factory,
118
+ OrderEndpoint $order_endpoint,
119
+ Environment $environment,
120
+ AuthorizedPaymentsProcessor $authorized_payments_processor,
121
+ ContainerInterface $config
122
+ ) {
123
+ $this->subscription_helper = $subscription_helper;
124
+ $this->payment_token_repository = $payment_token_repository;
125
+ $this->purchase_unit_factory = $purchase_unit_factory;
126
+ $this->payer_factory = $payer_factory;
127
+ $this->shipping_preference_factory = $shipping_preference_factory;
128
+ $this->order_endpoint = $order_endpoint;
129
+ $this->environment = $environment;
130
+ $this->authorized_payments_processor = $authorized_payments_processor;
131
+ $this->config = $config;
132
+ }
133
+
134
+ /**
135
+ * Handles the saved credit card payment.
136
+ *
137
+ * @param string $saved_credit_card The saved credit card.
138
+ * @param WC_Order $wc_order The WC order.
139
+ * @return WC_Order
140
+ * @throws RuntimeException When something went wrong with the payment process.
141
+ */
142
+ public function handle_payment(
143
+ string $saved_credit_card,
144
+ WC_Order $wc_order
145
+ ): WC_Order {
146
+
147
+ $change_payment = filter_input( INPUT_POST, 'woocommerce_change_payment', FILTER_SANITIZE_STRING );
148
+ if (
149
+ $change_payment
150
+ && $this->subscription_helper->has_subscription( $wc_order->get_id() )
151
+ && $this->subscription_helper->is_subscription_change_payment()
152
+ && $saved_credit_card
153
+ ) {
154
+ update_post_meta( $wc_order->get_id(), 'payment_token_id', $saved_credit_card );
155
+ return $wc_order;
156
+ }
157
+
158
+ $tokens = $this->payment_token_repository->all_for_user_id( $wc_order->get_customer_id() );
159
+ $selected_token = null;
160
+ foreach ( $tokens as $token ) {
161
+ if ( $token->id() === $saved_credit_card ) {
162
+ $selected_token = $token;
163
+ break;
164
+ }
165
+ }
166
+ if ( ! $selected_token ) {
167
+ throw new RuntimeException( 'Saved card token not found.' );
168
+ }
169
+
170
+ $purchase_unit = $this->purchase_unit_factory->from_wc_order( $wc_order );
171
+ $payer = $this->payer_factory->from_wc_order( $wc_order );
172
+ $shipping_preference = $this->shipping_preference_factory->from_state(
173
+ $purchase_unit,
174
+ ''
175
+ );
176
+
177
+ try {
178
+ $order = $this->order_endpoint->create(
179
+ array( $purchase_unit ),
180
+ $shipping_preference,
181
+ $payer,
182
+ $selected_token
183
+ );
184
+
185
+ $this->add_paypal_meta( $wc_order, $order, $this->environment );
186
+
187
+ if ( ! $order->status()->is( OrderStatus::COMPLETED ) ) {
188
+ throw new RuntimeException( "Unexpected status for order {$order->id()} using a saved card: {$order->status()->name()}." );
189
+ }
190
+
191
+ if ( ! in_array(
192
+ $order->intent(),
193
+ array( 'CAPTURE', 'AUTHORIZE' ),
194
+ true
195
+ ) ) {
196
+ throw new RuntimeException( "Could neither capture nor authorize order {$order->id()} using a saved card. Status: {$order->status()->name()}. Intent: {$order->intent()}." );
197
+ }
198
+
199
+ if ( $order->intent() === 'AUTHORIZE' ) {
200
+ $order = $this->order_endpoint->authorize( $order );
201
+ $wc_order->update_meta_data( AuthorizedPaymentsProcessor::CAPTURED_META_KEY, 'false' );
202
+ }
203
+
204
+ $transaction_id = $this->get_paypal_order_transaction_id( $order );
205
+ if ( $transaction_id ) {
206
+ $this->update_transaction_id( $transaction_id, $wc_order );
207
+ }
208
+
209
+ $this->handle_new_order_status( $order, $wc_order );
210
+
211
+ if ( $this->is_free_trial_order( $wc_order ) ) {
212
+ $this->authorized_payments_processor->void_authorizations( $order );
213
+ $wc_order->payment_complete();
214
+ } elseif ( $this->config->has( 'intent' ) && strtoupper( (string) $this->config->get( 'intent' ) ) === 'CAPTURE' ) {
215
+ $this->authorized_payments_processor->capture_authorized_payment( $wc_order );
216
+ }
217
+
218
+ return $wc_order;
219
+ } catch ( RuntimeException $error ) {
220
+ throw new RuntimeException( $error->getMessage() );
221
+ }
222
+ }
223
+ }
modules/ppcp-wc-gateway/services.php CHANGED
@@ -12,6 +12,7 @@ declare(strict_types=1);
12
  namespace WooCommerce\PayPalCommerce\WcGateway;
13
 
14
  use Psr\Container\ContainerInterface;
 
15
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PayUponInvoiceOrderEndpoint;
16
  use WooCommerce\PayPalCommerce\ApiClient\Entity\ApplicationContext;
17
  use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
@@ -53,6 +54,7 @@ use WooCommerce\PayPalCommerce\WcGateway\Notice\GatewayWithoutPayPalAdminNotice;
53
  use WooCommerce\PayPalCommerce\WcGateway\Processor\AuthorizedPaymentsProcessor;
54
  use WooCommerce\PayPalCommerce\WcGateway\Processor\OrderProcessor;
55
  use WooCommerce\PayPalCommerce\WcGateway\Processor\RefundProcessor;
 
56
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SectionsRenderer;
57
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
58
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsListener;
@@ -95,40 +97,29 @@ return array(
95
  'wcgateway.credit-card-gateway' => static function ( ContainerInterface $container ): CreditCardGateway {
96
  $order_processor = $container->get( 'wcgateway.order-processor' );
97
  $settings_renderer = $container->get( 'wcgateway.settings.render' );
98
- $authorized_payments = $container->get( 'wcgateway.processor.authorized-payments' );
99
  $settings = $container->get( 'wcgateway.settings' );
100
  $module_url = $container->get( 'wcgateway.url' );
101
  $session_handler = $container->get( 'session.handler' );
102
  $refund_processor = $container->get( 'wcgateway.processor.refunds' );
103
  $state = $container->get( 'onboarding.state' );
104
  $transaction_url_provider = $container->get( 'wcgateway.transaction-url-provider' );
105
- $payment_token_repository = $container->get( 'vaulting.repository.payment-token' );
106
- $purchase_unit_factory = $container->get( 'api.factory.purchase-unit' );
107
- $payer_factory = $container->get( 'api.factory.payer' );
108
- $order_endpoint = $container->get( 'api.endpoint.order' );
109
  $subscription_helper = $container->get( 'subscription.helper' );
110
  $payments_endpoint = $container->get( 'api.endpoint.payments' );
111
  $logger = $container->get( 'woocommerce.logger.woocommerce' );
112
- $environment = $container->get( 'onboarding.environment' );
113
  return new CreditCardGateway(
114
  $settings_renderer,
115
  $order_processor,
116
- $authorized_payments,
117
  $settings,
118
  $module_url,
119
  $session_handler,
120
  $refund_processor,
121
  $state,
122
  $transaction_url_provider,
123
- $payment_token_repository,
124
- $purchase_unit_factory,
125
- $container->get( 'api.factory.shipping-preference' ),
126
- $payer_factory,
127
- $order_endpoint,
128
  $subscription_helper,
129
  $logger,
130
- $environment,
131
- $payments_endpoint
132
  );
133
  },
134
  'wcgateway.card-button-gateway' => static function ( ContainerInterface $container ): CardButtonGateway {
@@ -152,11 +143,15 @@ return array(
152
  $settings = $container->get( 'wcgateway.settings' );
153
  return new DisableGateways( $session_handler, $settings );
154
  },
 
155
  'wcgateway.is-wc-payments-page' => static function ( ContainerInterface $container ): bool {
156
  $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
157
  $tab = isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
158
  return 'wc-settings' === $page && 'checkout' === $tab;
159
  },
 
 
 
160
 
161
  'wcgateway.is-ppcp-settings-page' => static function ( ContainerInterface $container ): bool {
162
  if ( ! $container->get( 'wcgateway.is-wc-payments-page' ) ) {
@@ -211,7 +206,14 @@ return array(
211
  'wcgateway.settings.sections-renderer' => static function ( ContainerInterface $container ): SectionsRenderer {
212
  return new SectionsRenderer(
213
  $container->get( 'wcgateway.current-ppcp-settings-page-id' ),
214
- $container->get( 'wcgateway.settings.sections' )
 
 
 
 
 
 
 
215
  );
216
  },
217
  'wcgateway.settings.sections' => static function ( ContainerInterface $container ): array {
@@ -356,7 +358,7 @@ return array(
356
  $dcc_applies = $container->get( 'api.helpers.dccapplies' );
357
  assert( $dcc_applies instanceof DccApplies );
358
 
359
- $is_shop_supports_dcc = $dcc_applies->for_country_currency();
360
 
361
  $onboarding_options_renderer = $container->get( 'onboarding.render-options' );
362
  assert( $onboarding_options_renderer instanceof OnboardingOptionsRenderer );
@@ -943,6 +945,20 @@ return array(
943
  'requirements' => array(),
944
  'gateway' => 'paypal',
945
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
946
 
947
  // General button styles.
948
  'button_style_heading' => array(
@@ -2286,7 +2302,8 @@ return array(
2286
  },
2287
  'wcgateway.pay-upon-invoice-helper' => static function( ContainerInterface $container ): PayUponInvoiceHelper {
2288
  return new PayUponInvoiceHelper(
2289
- $container->get( 'wcgateway.checkout-helper' )
 
2290
  );
2291
  },
2292
  'wcgateway.pay-upon-invoice-product-status' => static function( ContainerInterface $container ): PayUponInvoiceProductStatus {
@@ -2417,4 +2434,54 @@ return array(
2417
  (bool) $settings->get( 'allow_card_button_gateway' ) :
2418
  $container->get( 'wcgateway.settings.allow_card_button_gateway.default' );
2419
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2420
  );
12
  namespace WooCommerce\PayPalCommerce\WcGateway;
13
 
14
  use Psr\Container\ContainerInterface;
15
+ use WooCommerce\PayPalCommerce\ApiClient\Authentication\Bearer;
16
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PayUponInvoiceOrderEndpoint;
17
  use WooCommerce\PayPalCommerce\ApiClient\Entity\ApplicationContext;
18
  use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
54
  use WooCommerce\PayPalCommerce\WcGateway\Processor\AuthorizedPaymentsProcessor;
55
  use WooCommerce\PayPalCommerce\WcGateway\Processor\OrderProcessor;
56
  use WooCommerce\PayPalCommerce\WcGateway\Processor\RefundProcessor;
57
+ use WooCommerce\PayPalCommerce\WcGateway\Settings\HeaderRenderer;
58
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SectionsRenderer;
59
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
60
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsListener;
97
  'wcgateway.credit-card-gateway' => static function ( ContainerInterface $container ): CreditCardGateway {
98
  $order_processor = $container->get( 'wcgateway.order-processor' );
99
  $settings_renderer = $container->get( 'wcgateway.settings.render' );
 
100
  $settings = $container->get( 'wcgateway.settings' );
101
  $module_url = $container->get( 'wcgateway.url' );
102
  $session_handler = $container->get( 'session.handler' );
103
  $refund_processor = $container->get( 'wcgateway.processor.refunds' );
104
  $state = $container->get( 'onboarding.state' );
105
  $transaction_url_provider = $container->get( 'wcgateway.transaction-url-provider' );
 
 
 
 
106
  $subscription_helper = $container->get( 'subscription.helper' );
107
  $payments_endpoint = $container->get( 'api.endpoint.payments' );
108
  $logger = $container->get( 'woocommerce.logger.woocommerce' );
109
+ $vaulted_credit_card_handler = $container->get( 'vaulting.credit-card-handler' );
110
  return new CreditCardGateway(
111
  $settings_renderer,
112
  $order_processor,
 
113
  $settings,
114
  $module_url,
115
  $session_handler,
116
  $refund_processor,
117
  $state,
118
  $transaction_url_provider,
 
 
 
 
 
119
  $subscription_helper,
120
  $logger,
121
+ $payments_endpoint,
122
+ $vaulted_credit_card_handler
123
  );
124
  },
125
  'wcgateway.card-button-gateway' => static function ( ContainerInterface $container ): CardButtonGateway {
143
  $settings = $container->get( 'wcgateway.settings' );
144
  return new DisableGateways( $session_handler, $settings );
145
  },
146
+
147
  'wcgateway.is-wc-payments-page' => static function ( ContainerInterface $container ): bool {
148
  $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : '';
149
  $tab = isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : '';
150
  return 'wc-settings' === $page && 'checkout' === $tab;
151
  },
152
+ 'wcgateway.is-wc-gateways-list-page' => static function ( ContainerInterface $container ): bool {
153
+ return $container->get( 'wcgateway.is-wc-payments-page' ) && ! isset( $_GET['section'] );
154
+ },
155
 
156
  'wcgateway.is-ppcp-settings-page' => static function ( ContainerInterface $container ): bool {
157
  if ( ! $container->get( 'wcgateway.is-wc-payments-page' ) ) {
206
  'wcgateway.settings.sections-renderer' => static function ( ContainerInterface $container ): SectionsRenderer {
207
  return new SectionsRenderer(
208
  $container->get( 'wcgateway.current-ppcp-settings-page-id' ),
209
+ $container->get( 'wcgateway.settings.sections' ),
210
+ $container->get( 'onboarding.state' )
211
+ );
212
+ },
213
+ 'wcgateway.settings.header-renderer' => static function ( ContainerInterface $container ): HeaderRenderer {
214
+ return new HeaderRenderer(
215
+ $container->get( 'wcgateway.current-ppcp-settings-page-id' ),
216
+ $container->get( 'wcgateway.url' )
217
  );
218
  },
219
  'wcgateway.settings.sections' => static function ( ContainerInterface $container ): array {
358
  $dcc_applies = $container->get( 'api.helpers.dccapplies' );
359
  assert( $dcc_applies instanceof DccApplies );
360
 
361
+ $is_shop_supports_dcc = $dcc_applies->for_country_currency() || $dcc_applies->for_wc_payments();
362
 
363
  $onboarding_options_renderer = $container->get( 'onboarding.render-options' );
364
  assert( $onboarding_options_renderer instanceof OnboardingOptionsRenderer );
945
  'requirements' => array(),
946
  'gateway' => 'paypal',
947
  ),
948
+ 'tracking_enabled' => array(
949
+ 'title' => __( 'Tracking', 'woocommerce-paypal-payments' ),
950
+ 'type' => 'checkbox',
951
+ 'desc_tip' => true,
952
+ 'label' => $container->get( 'wcgateway.settings.tracking-label' ),
953
+ 'description' => __( 'Allows to send shipment tracking numbers to PayPal for PayPal transactions.', 'woocommerce-paypal-payments' ),
954
+ 'default' => false,
955
+ 'screens' => array(
956
+ State::STATE_ONBOARDED,
957
+ ),
958
+ 'requirements' => array(),
959
+ 'gateway' => array( 'paypal' ),
960
+ 'input_class' => $container->get( 'wcgateway.settings.should-disable-tracking-checkbox' ) ? array( 'ppcp-disabled-checkbox' ) : array(),
961
+ ),
962
 
963
  // General button styles.
964
  'button_style_heading' => array(
2302
  },
2303
  'wcgateway.pay-upon-invoice-helper' => static function( ContainerInterface $container ): PayUponInvoiceHelper {
2304
  return new PayUponInvoiceHelper(
2305
+ $container->get( 'wcgateway.checkout-helper' ),
2306
+ $container->get( 'wcgateway.settings' )
2307
  );
2308
  },
2309
  'wcgateway.pay-upon-invoice-product-status' => static function( ContainerInterface $container ): PayUponInvoiceProductStatus {
2434
  (bool) $settings->get( 'allow_card_button_gateway' ) :
2435
  $container->get( 'wcgateway.settings.allow_card_button_gateway.default' );
2436
  },
2437
+ 'order-tracking.is-tracking-available' => static function ( ContainerInterface $container ): bool {
2438
+ try {
2439
+ $bearer = $container->get( 'api.bearer' );
2440
+ assert( $bearer instanceof Bearer );
2441
+
2442
+ $token = $bearer->bearer();
2443
+ return $token->is_tracking_available();
2444
+ } catch ( RuntimeException $exception ) {
2445
+ return false;
2446
+ }
2447
+ },
2448
+ 'wcgateway.settings.should-disable-tracking-checkbox' => static function ( ContainerInterface $container ): bool {
2449
+ $pui_helper = $container->get( 'wcgateway.pay-upon-invoice-helper' );
2450
+ assert( $pui_helper instanceof PayUponInvoiceHelper );
2451
+
2452
+ $is_tracking_available = $container->get( 'order-tracking.is-tracking-available' );
2453
+
2454
+ if ( ! $is_tracking_available ) {
2455
+ return true;
2456
+ }
2457
+
2458
+ if ( $pui_helper->is_pui_enabled() ) {
2459
+ return true;
2460
+ }
2461
+
2462
+ return false;
2463
+ },
2464
+ 'wcgateway.settings.tracking-label' => static function ( ContainerInterface $container ): string {
2465
+ $tracking_label = __( 'Enable tracking information feature on your store.', 'woocommerce-paypal-payments' );
2466
+ $is_tracking_available = $container->get( 'order-tracking.is-tracking-available' );
2467
+
2468
+ if ( $is_tracking_available ) {
2469
+ return $tracking_label;
2470
+ }
2471
+
2472
+ $tracking_label .= sprintf(
2473
+ // translators: %1$s and %2$s are the opening and closing of HTML <a> tag.
2474
+ __(
2475
+ ' To use tracking features, you must %1$senable tracking on your account%2$s.',
2476
+ 'woocommerce-paypal-payments'
2477
+ ),
2478
+ '<a
2479
+ href="https://docs.woocommerce.com/document/woocommerce-paypal-payments/#enable-tracking-on-your-live-account"
2480
+ target="_blank"
2481
+ >',
2482
+ '</a>'
2483
+ );
2484
+
2485
+ return $tracking_label;
2486
+ },
2487
  );
modules/ppcp-wc-gateway/src/Gateway/CreditCardGateway.php CHANGED
@@ -11,28 +11,19 @@ namespace WooCommerce\PayPalCommerce\WcGateway\Gateway;
11
 
12
  use Exception;
13
  use Psr\Log\LoggerInterface;
 
14
  use WC_Order;
15
- use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint;
16
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PaymentsEndpoint;
17
- use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
18
  use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
19
  use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
20
- use WooCommerce\PayPalCommerce\ApiClient\Factory\PayerFactory;
21
- use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory;
22
- use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingPreferenceFactory;
23
- use WooCommerce\PayPalCommerce\Onboarding\Environment;
24
  use WooCommerce\PayPalCommerce\Onboarding\State;
25
  use WooCommerce\PayPalCommerce\Session\SessionHandler;
26
- use WooCommerce\PayPalCommerce\Subscription\FreeTrialHandlerTrait;
27
  use WooCommerce\PayPalCommerce\Subscription\Helper\SubscriptionHelper;
28
  use WooCommerce\PayPalCommerce\Vaulting\PaymentTokenRepository;
 
29
  use WooCommerce\PayPalCommerce\WcGateway\Exception\GatewayGenericException;
30
- use WooCommerce\PayPalCommerce\WcGateway\Processor\AuthorizedPaymentsProcessor;
31
- use WooCommerce\PayPalCommerce\WcGateway\Processor\OrderMetaTrait;
32
  use WooCommerce\PayPalCommerce\WcGateway\Processor\OrderProcessor;
33
- use WooCommerce\PayPalCommerce\WcGateway\Processor\PaymentsStatusHandlingTrait;
34
  use WooCommerce\PayPalCommerce\WcGateway\Processor\RefundProcessor;
35
- use WooCommerce\PayPalCommerce\WcGateway\Processor\TransactionIdHandlingTrait;
36
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsRenderer;
37
  use Psr\Container\ContainerInterface;
38
 
@@ -41,8 +32,7 @@ use Psr\Container\ContainerInterface;
41
  */
42
  class CreditCardGateway extends \WC_Payment_Gateway_CC {
43
 
44
- use ProcessPaymentTrait, OrderMetaTrait, TransactionIdHandlingTrait, PaymentsStatusHandlingTrait, FreeTrialHandlerTrait,
45
- GatewaySettingsRendererTrait;
46
 
47
  const ID = 'ppcp-credit-card-gateway';
48
 
@@ -61,18 +51,18 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC {
61
  protected $order_processor;
62
 
63
  /**
64
- * The processor for authorized payments.
65
  *
66
- * @var AuthorizedPaymentsProcessor
67
  */
68
- protected $authorized_payments_processor;
69
 
70
  /**
71
- * The settings.
72
  *
73
- * @var ContainerInterface
74
  */
75
- protected $config;
76
 
77
  /**
78
  * The URL to the module.
@@ -116,34 +106,6 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC {
116
  */
117
  private $payment_token_repository;
118
 
119
- /**
120
- * The purchase unit factory.
121
- *
122
- * @var PurchaseUnitFactory
123
- */
124
- private $purchase_unit_factory;
125
-
126
- /**
127
- * The shipping_preference factory.
128
- *
129
- * @var ShippingPreferenceFactory
130
- */
131
- private $shipping_preference_factory;
132
-
133
- /**
134
- * The payer factory.
135
- *
136
- * @var PayerFactory
137
- */
138
- private $payer_factory;
139
-
140
- /**
141
- * The order endpoint.
142
- *
143
- * @var OrderEndpoint
144
- */
145
- private $order_endpoint;
146
-
147
  /**
148
  * The subscription helper.
149
  *
@@ -158,13 +120,6 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC {
158
  */
159
  protected $logger;
160
 
161
- /**
162
- * The environment.
163
- *
164
- * @var Environment
165
- */
166
- protected $environment;
167
-
168
  /**
169
  * The payments endpoint
170
  *
@@ -175,64 +130,46 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC {
175
  /**
176
  * CreditCardGateway constructor.
177
  *
178
- * @param SettingsRenderer $settings_renderer The Settings Renderer.
179
- * @param OrderProcessor $order_processor The Order processor.
180
- * @param AuthorizedPaymentsProcessor $authorized_payments_processor The Authorized Payments processor.
181
- * @param ContainerInterface $config The settings.
182
- * @param string $module_url The URL to the module.
183
- * @param SessionHandler $session_handler The Session Handler.
184
- * @param RefundProcessor $refund_processor The refund processor.
185
- * @param State $state The state.
186
- * @param TransactionUrlProvider $transaction_url_provider Service able to provide view transaction url base.
187
- * @param PaymentTokenRepository $payment_token_repository The payment token repository.
188
- * @param PurchaseUnitFactory $purchase_unit_factory The purchase unit factory.
189
- * @param ShippingPreferenceFactory $shipping_preference_factory The shipping_preference factory.
190
- * @param PayerFactory $payer_factory The payer factory.
191
- * @param OrderEndpoint $order_endpoint The order endpoint.
192
- * @param SubscriptionHelper $subscription_helper The subscription helper.
193
- * @param LoggerInterface $logger The logger.
194
- * @param Environment $environment The environment.
195
- * @param PaymentsEndpoint $payments_endpoint The payments endpoint.
196
  */
197
  public function __construct(
198
  SettingsRenderer $settings_renderer,
199
  OrderProcessor $order_processor,
200
- AuthorizedPaymentsProcessor $authorized_payments_processor,
201
  ContainerInterface $config,
202
  string $module_url,
203
  SessionHandler $session_handler,
204
  RefundProcessor $refund_processor,
205
  State $state,
206
  TransactionUrlProvider $transaction_url_provider,
207
- PaymentTokenRepository $payment_token_repository,
208
- PurchaseUnitFactory $purchase_unit_factory,
209
- ShippingPreferenceFactory $shipping_preference_factory,
210
- PayerFactory $payer_factory,
211
- OrderEndpoint $order_endpoint,
212
  SubscriptionHelper $subscription_helper,
213
  LoggerInterface $logger,
214
- Environment $environment,
215
- PaymentsEndpoint $payments_endpoint
216
  ) {
217
- $this->id = self::ID;
218
- $this->settings_renderer = $settings_renderer;
219
- $this->order_processor = $order_processor;
220
- $this->authorized_payments_processor = $authorized_payments_processor;
221
- $this->config = $config;
222
- $this->module_url = $module_url;
223
- $this->session_handler = $session_handler;
224
- $this->refund_processor = $refund_processor;
225
- $this->state = $state;
226
- $this->transaction_url_provider = $transaction_url_provider;
227
- $this->payment_token_repository = $payment_token_repository;
228
- $this->purchase_unit_factory = $purchase_unit_factory;
229
- $this->shipping_preference_factory = $shipping_preference_factory;
230
- $this->payer_factory = $payer_factory;
231
- $this->order_endpoint = $order_endpoint;
232
- $this->subscription_helper = $subscription_helper;
233
- $this->logger = $logger;
234
- $this->environment = $environment;
235
- $this->payments_endpoint = $payments_endpoint;
236
 
237
  if ( $state->current_state() === State::STATE_ONBOARDED ) {
238
  $this->supports = array( 'refunds' );
@@ -424,101 +361,20 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC {
424
  * If customer has chosen a saved credit card payment.
425
  */
426
  $saved_credit_card = filter_input( INPUT_POST, 'saved_credit_card', FILTER_SANITIZE_STRING );
427
- $change_payment = filter_input( INPUT_POST, 'woocommerce_change_payment', FILTER_SANITIZE_STRING );
428
- if ( $saved_credit_card && ! isset( $change_payment ) ) {
429
-
430
- $user_id = (int) $wc_order->get_customer_id();
431
- $customer = new \WC_Customer( $user_id );
432
- $tokens = $this->payment_token_repository->all_for_user_id( (int) $customer->get_id() );
433
-
434
- $selected_token = null;
435
- foreach ( $tokens as $token ) {
436
- if ( $token->id() === $saved_credit_card ) {
437
- $selected_token = $token;
438
- break;
439
- }
440
- }
441
-
442
- if ( ! $selected_token ) {
443
- return $this->handle_payment_failure(
444
- $wc_order,
445
- new GatewayGenericException( new Exception( 'Saved card token not found.' ) )
446
- );
447
- }
448
-
449
- $purchase_unit = $this->purchase_unit_factory->from_wc_order( $wc_order );
450
- $payer = $this->payer_factory->from_customer( $customer );
451
-
452
- $shipping_preference = $this->shipping_preference_factory->from_state(
453
- $purchase_unit,
454
- ''
455
- );
456
-
457
  try {
458
- $order = $this->order_endpoint->create(
459
- array( $purchase_unit ),
460
- $shipping_preference,
461
- $payer,
462
- $selected_token
463
  );
464
 
465
- $this->add_paypal_meta( $wc_order, $order, $this->environment );
466
-
467
- if ( ! $order->status()->is( OrderStatus::COMPLETED ) ) {
468
- return $this->handle_payment_failure(
469
- $wc_order,
470
- new GatewayGenericException( new Exception( "Unexpected status for order {$order->id()} using a saved card: {$order->status()->name()}." ) )
471
- );
472
- }
473
-
474
- if ( ! in_array(
475
- $order->intent(),
476
- array( 'CAPTURE', 'AUTHORIZE' ),
477
- true
478
- ) ) {
479
- return $this->handle_payment_failure(
480
- $wc_order,
481
- new GatewayGenericException( new Exception( "Could neither capture nor authorize order {$order->id()} using a saved card. Status: {$order->status()->name()}. Intent: {$order->intent()}." ) )
482
- );
483
- }
484
-
485
- if ( $order->intent() === 'AUTHORIZE' ) {
486
- $order = $this->order_endpoint->authorize( $order );
487
-
488
- $wc_order->update_meta_data( AuthorizedPaymentsProcessor::CAPTURED_META_KEY, 'false' );
489
- }
490
-
491
- $transaction_id = $this->get_paypal_order_transaction_id( $order );
492
- if ( $transaction_id ) {
493
- $this->update_transaction_id( $transaction_id, $wc_order );
494
- }
495
-
496
- $this->handle_new_order_status( $order, $wc_order );
497
-
498
- if ( $this->is_free_trial_order( $wc_order ) ) {
499
- $this->authorized_payments_processor->void_authorizations( $order );
500
- $wc_order->payment_complete();
501
- } elseif ( $this->config->has( 'intent' ) && strtoupper( (string) $this->config->get( 'intent' ) ) === 'CAPTURE' ) {
502
- $this->authorized_payments_processor->capture_authorized_payment( $wc_order );
503
- }
504
-
505
  return $this->handle_payment_success( $wc_order );
 
506
  } catch ( RuntimeException $error ) {
507
  return $this->handle_payment_failure( $wc_order, $error );
508
  }
509
  }
510
 
511
- /**
512
- * If customer has chosen change Subscription payment.
513
- */
514
- if ( $this->subscription_helper->has_subscription( $order_id ) && $this->subscription_helper->is_subscription_change_payment() ) {
515
- if ( $saved_credit_card ) {
516
- update_post_meta( $order_id, 'payment_token_id', $saved_credit_card );
517
-
518
- return $this->handle_payment_success( $wc_order );
519
- }
520
- }
521
-
522
  /**
523
  * If the WC_Order is paid through the approved webhook.
524
  */
11
 
12
  use Exception;
13
  use Psr\Log\LoggerInterface;
14
+ use WC_Customer;
15
  use WC_Order;
 
16
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PaymentsEndpoint;
 
17
  use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
18
  use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
 
 
 
 
19
  use WooCommerce\PayPalCommerce\Onboarding\State;
20
  use WooCommerce\PayPalCommerce\Session\SessionHandler;
 
21
  use WooCommerce\PayPalCommerce\Subscription\Helper\SubscriptionHelper;
22
  use WooCommerce\PayPalCommerce\Vaulting\PaymentTokenRepository;
23
+ use WooCommerce\PayPalCommerce\Vaulting\VaultedCreditCardHandler;
24
  use WooCommerce\PayPalCommerce\WcGateway\Exception\GatewayGenericException;
 
 
25
  use WooCommerce\PayPalCommerce\WcGateway\Processor\OrderProcessor;
 
26
  use WooCommerce\PayPalCommerce\WcGateway\Processor\RefundProcessor;
 
27
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsRenderer;
28
  use Psr\Container\ContainerInterface;
29
 
32
  */
33
  class CreditCardGateway extends \WC_Payment_Gateway_CC {
34
 
35
+ use ProcessPaymentTrait, GatewaySettingsRendererTrait;
 
36
 
37
  const ID = 'ppcp-credit-card-gateway';
38
 
51
  protected $order_processor;
52
 
53
  /**
54
+ * The settings.
55
  *
56
+ * @var ContainerInterface
57
  */
58
+ protected $config;
59
 
60
  /**
61
+ * The vaulted credit card handler.
62
  *
63
+ * @var VaultedCreditCardHandler
64
  */
65
+ protected $vaulted_credit_card_handler;
66
 
67
  /**
68
  * The URL to the module.
106
  */
107
  private $payment_token_repository;
108
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109
  /**
110
  * The subscription helper.
111
  *
120
  */
121
  protected $logger;
122
 
 
 
 
 
 
 
 
123
  /**
124
  * The payments endpoint
125
  *
130
  /**
131
  * CreditCardGateway constructor.
132
  *
133
+ * @param SettingsRenderer $settings_renderer The Settings Renderer.
134
+ * @param OrderProcessor $order_processor The Order processor.
135
+ * @param ContainerInterface $config The settings.
136
+ * @param string $module_url The URL to the module.
137
+ * @param SessionHandler $session_handler The Session Handler.
138
+ * @param RefundProcessor $refund_processor The refund processor.
139
+ * @param State $state The state.
140
+ * @param TransactionUrlProvider $transaction_url_provider Service able to provide view transaction url base.
141
+ * @param SubscriptionHelper $subscription_helper The subscription helper.
142
+ * @param LoggerInterface $logger The logger.
143
+ * @param PaymentsEndpoint $payments_endpoint The payments endpoint.
144
+ * @param VaultedCreditCardHandler $vaulted_credit_card_handler The vaulted credit card handler.
 
 
 
 
 
 
145
  */
146
  public function __construct(
147
  SettingsRenderer $settings_renderer,
148
  OrderProcessor $order_processor,
 
149
  ContainerInterface $config,
150
  string $module_url,
151
  SessionHandler $session_handler,
152
  RefundProcessor $refund_processor,
153
  State $state,
154
  TransactionUrlProvider $transaction_url_provider,
 
 
 
 
 
155
  SubscriptionHelper $subscription_helper,
156
  LoggerInterface $logger,
157
+ PaymentsEndpoint $payments_endpoint,
158
+ VaultedCreditCardHandler $vaulted_credit_card_handler
159
  ) {
160
+ $this->id = self::ID;
161
+ $this->settings_renderer = $settings_renderer;
162
+ $this->order_processor = $order_processor;
163
+ $this->config = $config;
164
+ $this->module_url = $module_url;
165
+ $this->session_handler = $session_handler;
166
+ $this->refund_processor = $refund_processor;
167
+ $this->state = $state;
168
+ $this->transaction_url_provider = $transaction_url_provider;
169
+ $this->subscription_helper = $subscription_helper;
170
+ $this->logger = $logger;
171
+ $this->payments_endpoint = $payments_endpoint;
172
+ $this->vaulted_credit_card_handler = $vaulted_credit_card_handler;
 
 
 
 
 
 
173
 
174
  if ( $state->current_state() === State::STATE_ONBOARDED ) {
175
  $this->supports = array( 'refunds' );
361
  * If customer has chosen a saved credit card payment.
362
  */
363
  $saved_credit_card = filter_input( INPUT_POST, 'saved_credit_card', FILTER_SANITIZE_STRING );
364
+ if ( $saved_credit_card ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
365
  try {
366
+ $wc_order = $this->vaulted_credit_card_handler->handle_payment(
367
+ $saved_credit_card,
368
+ $wc_order
 
 
369
  );
370
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
371
  return $this->handle_payment_success( $wc_order );
372
+
373
  } catch ( RuntimeException $error ) {
374
  return $this->handle_payment_failure( $wc_order, $error );
375
  }
376
  }
377
 
 
 
 
 
 
 
 
 
 
 
 
378
  /**
379
  * If the WC_Order is paid through the approved webhook.
380
  */
modules/ppcp-wc-gateway/src/Gateway/PayUponInvoice/PayUponInvoice.php CHANGED
@@ -333,6 +333,23 @@ class PayUponInvoice {
333
  )
334
  );
335
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
336
  echo '</div><div>';
337
 
338
  // phpcs:ignore WordPress.WP.I18n.TextDomainMismatch
@@ -376,6 +393,9 @@ class PayUponInvoice {
376
  }
377
 
378
  $national_number = filter_input( INPUT_POST, 'billing_phone', FILTER_SANITIZE_STRING );
 
 
 
379
  if ( $national_number ) {
380
  $numeric_phone_number = preg_replace( '/[^0-9]/', '', $national_number );
381
  if ( $numeric_phone_number && ! preg_match( '/^[0-9]{1,14}?$/', $numeric_phone_number ) ) {
333
  )
334
  );
335
 
336
+ $checkout_fields = WC()->checkout()->get_checkout_fields();
337
+ $checkout_phone_required = $checkout_fields['billing']['billing_phone']['required'] ?? false;
338
+ if ( ! array_key_exists( 'billing_phone', $checkout_fields['billing'] ) || $checkout_phone_required === false ) {
339
+ woocommerce_form_field(
340
+ 'billing_phone',
341
+ array(
342
+ // phpcs:ignore WordPress.WP.I18n.TextDomainMismatch
343
+ 'label' => __( 'Phone', 'woocommerce' ),
344
+ 'type' => 'tel',
345
+ 'class' => array( 'form-row-wide' ),
346
+ 'validate' => array( 'phone' ),
347
+ 'autocomplete' => 'tel',
348
+ 'required' => true,
349
+ )
350
+ );
351
+ }
352
+
353
  echo '</div><div>';
354
 
355
  // phpcs:ignore WordPress.WP.I18n.TextDomainMismatch
393
  }
394
 
395
  $national_number = filter_input( INPUT_POST, 'billing_phone', FILTER_SANITIZE_STRING );
396
+ if ( ! $national_number ) {
397
+ $errors->add( 'validation', __( 'Phone field cannot be empty.', 'woocommerce-paypal-payments' ) );
398
+ }
399
  if ( $national_number ) {
400
  $numeric_phone_number = preg_replace( '/[^0-9]/', '', $national_number );
401
  if ( $numeric_phone_number && ! preg_match( '/^[0-9]{1,14}?$/', $numeric_phone_number ) ) {
modules/ppcp-wc-gateway/src/Gateway/PayUponInvoice/PayUponInvoiceGateway.php CHANGED
@@ -215,12 +215,18 @@ class PayUponInvoiceGateway extends WC_Payment_Gateway {
215
  }
216
  }
217
 
 
 
 
 
 
 
218
  $wc_order->update_status( 'on-hold', __( 'Awaiting Pay upon Invoice payment.', 'woocommerce-paypal-payments' ) );
219
  $purchase_unit = $this->purchase_unit_factory->from_wc_order( $wc_order );
220
  $payment_source = $this->payment_source_factory->from_wc_order( $wc_order, $birth_date );
221
 
222
  try {
223
- $order = $this->order_endpoint->create( array( $purchase_unit ), $payment_source );
224
  $this->add_paypal_meta( $wc_order, $order, $this->environment );
225
 
226
  as_schedule_single_action(
215
  }
216
  }
217
 
218
+ $phone_number = filter_input( INPUT_POST, 'billing_phone', FILTER_SANITIZE_STRING ) ?? '';
219
+ if ( $phone_number ) {
220
+ $wc_order->set_billing_phone( $phone_number );
221
+ $wc_order->save();
222
+ }
223
+
224
  $wc_order->update_status( 'on-hold', __( 'Awaiting Pay upon Invoice payment.', 'woocommerce-paypal-payments' ) );
225
  $purchase_unit = $this->purchase_unit_factory->from_wc_order( $wc_order );
226
  $payment_source = $this->payment_source_factory->from_wc_order( $wc_order, $birth_date );
227
 
228
  try {
229
+ $order = $this->order_endpoint->create( array( $purchase_unit ), $payment_source, $wc_order );
230
  $this->add_paypal_meta( $wc_order, $order, $this->environment );
231
 
232
  as_schedule_single_action(
modules/ppcp-wc-gateway/src/Gateway/PayUponInvoice/PaymentSourceFactory.php CHANGED
@@ -24,8 +24,8 @@ class PaymentSourceFactory {
24
  * @return PaymentSource
25
  */
26
  public function from_wc_order( WC_Order $order, string $birth_date ) {
27
- $address = $order->get_address();
28
-
29
  $phone_country_code = WC()->countries->get_country_calling_code( $address['country'] );
30
  $phone_country_code = is_array( $phone_country_code ) && ! empty( $phone_country_code ) ? $phone_country_code[0] : $phone_country_code;
31
  if ( is_string( $phone_country_code ) && '' !== $phone_country_code ) {
@@ -44,7 +44,7 @@ class PaymentSourceFactory {
44
  $address['last_name'] ?? '',
45
  $address['email'] ?? '',
46
  $birth_date,
47
- preg_replace( '/[^0-9]/', '', $address['phone'] ) ?? '',
48
  $phone_country_code,
49
  $address['address_1'] ?? '',
50
  $address['city'] ?? '',
24
  * @return PaymentSource
25
  */
26
  public function from_wc_order( WC_Order $order, string $birth_date ) {
27
+ $address = $order->get_address();
28
+ $phone = filter_input( INPUT_POST, 'billing_phone', FILTER_SANITIZE_STRING ) ?? $address['phone'] ?: '';
29
  $phone_country_code = WC()->countries->get_country_calling_code( $address['country'] );
30
  $phone_country_code = is_array( $phone_country_code ) && ! empty( $phone_country_code ) ? $phone_country_code[0] : $phone_country_code;
31
  if ( is_string( $phone_country_code ) && '' !== $phone_country_code ) {
44
  $address['last_name'] ?? '',
45
  $address['email'] ?? '',
46
  $birth_date,
47
+ preg_replace( '/[^0-9]/', '', $phone ) ?? '',
48
  $phone_country_code,
49
  $address['address_1'] ?? '',
50
  $address['city'] ?? '',
modules/ppcp-wc-gateway/src/Gateway/ProcessPaymentTrait.php CHANGED
@@ -118,7 +118,7 @@ trait ProcessPaymentTrait {
118
  * @return string
119
  */
120
  protected function format_exception( Throwable $exception ): string {
121
- $output = $exception->getMessage() . ' ' . $exception->getFile() . ':' . $exception->getLine();
122
  $prev = $exception->getPrevious();
123
  if ( ! $prev ) {
124
  return $output;
118
  * @return string
119
  */
120
  protected function format_exception( Throwable $exception ): string {
121
+ $output = $exception->getMessage() . ' ' . basename( $exception->getFile() ) . ':' . $exception->getLine();
122
  $prev = $exception->getPrevious();
123
  if ( ! $prev ) {
124
  return $output;
modules/ppcp-wc-gateway/src/Helper/DCCProductStatus.php CHANGED
@@ -9,9 +9,9 @@ declare( strict_types=1 );
9
 
10
  namespace WooCommerce\PayPalCommerce\WcGateway\Helper;
11
 
 
12
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PartnersEndpoint;
13
  use WooCommerce\PayPalCommerce\ApiClient\Entity\SellerStatusProduct;
14
- use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
15
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
16
 
17
  /**
@@ -22,7 +22,7 @@ class DCCProductStatus {
22
  /**
23
  * Caches the status for the current load.
24
  *
25
- * @var string|null
26
  */
27
  private $current_status_cache;
28
  /**
@@ -57,7 +57,6 @@ class DCCProductStatus {
57
  * Whether the active/subscribed products support DCC.
58
  *
59
  * @return bool
60
- * @throws \WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException Should a setting not be found.
61
  */
62
  public function dcc_is_active() : bool {
63
  if ( is_bool( $this->current_status_cache ) ) {
@@ -70,7 +69,7 @@ class DCCProductStatus {
70
 
71
  try {
72
  $seller_status = $this->partners_endpoint->seller_status();
73
- } catch ( RuntimeException $error ) {
74
  $this->current_status_cache = false;
75
  return false;
76
  }
9
 
10
  namespace WooCommerce\PayPalCommerce\WcGateway\Helper;
11
 
12
+ use Throwable;
13
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PartnersEndpoint;
14
  use WooCommerce\PayPalCommerce\ApiClient\Entity\SellerStatusProduct;
 
15
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
16
 
17
  /**
22
  /**
23
  * Caches the status for the current load.
24
  *
25
+ * @var bool|null
26
  */
27
  private $current_status_cache;
28
  /**
57
  * Whether the active/subscribed products support DCC.
58
  *
59
  * @return bool
 
60
  */
61
  public function dcc_is_active() : bool {
62
  if ( is_bool( $this->current_status_cache ) ) {
69
 
70
  try {
71
  $seller_status = $this->partners_endpoint->seller_status();
72
+ } catch ( Throwable $error ) {
73
  $this->current_status_cache = false;
74
  return false;
75
  }
modules/ppcp-wc-gateway/src/Helper/PayUponInvoiceHelper.php CHANGED
@@ -9,6 +9,10 @@ declare( strict_types=1 );
9
 
10
  namespace WooCommerce\PayPalCommerce\WcGateway\Helper;
11
 
 
 
 
 
12
  /**
13
  * Class PayUponInvoiceHelper
14
  */
@@ -21,13 +25,23 @@ class PayUponInvoiceHelper {
21
  */
22
  protected $checkout_helper;
23
 
 
 
 
 
 
 
 
24
  /**
25
  * PayUponInvoiceHelper constructor.
26
  *
27
  * @param CheckoutHelper $checkout_helper The checkout helper.
 
28
  */
29
- public function __construct( CheckoutHelper $checkout_helper ) {
 
30
  $this->checkout_helper = $checkout_helper;
 
31
  }
32
 
33
  /**
@@ -46,7 +60,7 @@ class PayUponInvoiceHelper {
46
  return false;
47
  }
48
 
49
- if ( 'EUR' !== get_woocommerce_currency() ) {
50
  return false;
51
  }
52
 
@@ -56,4 +70,34 @@ class PayUponInvoiceHelper {
56
 
57
  return true;
58
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
  }
9
 
10
  namespace WooCommerce\PayPalCommerce\WcGateway\Helper;
11
 
12
+ use WC_Order;
13
+ use WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException;
14
+ use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
15
+
16
  /**
17
  * Class PayUponInvoiceHelper
18
  */
25
  */
26
  protected $checkout_helper;
27
 
28
+ /**
29
+ * The settings.
30
+ *
31
+ * @var Settings
32
+ */
33
+ protected $settings;
34
+
35
  /**
36
  * PayUponInvoiceHelper constructor.
37
  *
38
  * @param CheckoutHelper $checkout_helper The checkout helper.
39
+ * @param Settings $settings The Settings.
40
  */
41
+ public function __construct( CheckoutHelper $checkout_helper, Settings $settings ) {
42
+
43
  $this->checkout_helper = $checkout_helper;
44
+ $this->settings = $settings;
45
  }
46
 
47
  /**
60
  return false;
61
  }
62
 
63
+ if ( ! $this->is_valid_currency() ) {
64
  return false;
65
  }
66
 
70
 
71
  return true;
72
  }
73
+
74
+ /**
75
+ * Checks if currency is allowed for PUI.
76
+ *
77
+ * @return bool
78
+ */
79
+ private function is_valid_currency(): bool {
80
+ global $wp;
81
+ $order_id = isset( $wp->query_vars['order-pay'] ) ? (int) $wp->query_vars['order-pay'] : 0;
82
+ if ( 0 === $order_id ) {
83
+ return 'EUR' === get_woocommerce_currency();
84
+ }
85
+
86
+ $order = wc_get_order( $order_id );
87
+ if ( is_a( $order, WC_Order::class ) ) {
88
+ return 'EUR' === $order->get_currency();
89
+ }
90
+
91
+ return false;
92
+ }
93
+
94
+ /**
95
+ * Checks whether PUI is enabled.
96
+ *
97
+ * @return bool True if PUI is active, otherwise false.
98
+ * @throws NotFoundException If problem when checking the settings.
99
+ */
100
+ public function is_pui_enabled(): bool {
101
+ return $this->settings->has( 'products_pui_enabled' ) && $this->settings->get( 'products_pui_enabled' );
102
+ }
103
  }
modules/ppcp-wc-gateway/src/Helper/PayUponInvoiceProductStatus.php CHANGED
@@ -9,11 +9,10 @@ declare( strict_types=1 );
9
 
10
  namespace WooCommerce\PayPalCommerce\WcGateway\Helper;
11
 
 
12
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PartnersEndpoint;
13
  use WooCommerce\PayPalCommerce\ApiClient\Entity\SellerStatusProduct;
14
- use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
15
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
16
- use WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException;
17
 
18
  /**
19
  * Class PayUponInvoiceProductStatus
@@ -70,7 +69,7 @@ class PayUponInvoiceProductStatus {
70
 
71
  try {
72
  $seller_status = $this->partners_endpoint->seller_status();
73
- } catch ( RuntimeException $error ) {
74
  $this->current_status_cache = false;
75
  return false;
76
  }
9
 
10
  namespace WooCommerce\PayPalCommerce\WcGateway\Helper;
11
 
12
+ use Throwable;
13
  use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PartnersEndpoint;
14
  use WooCommerce\PayPalCommerce\ApiClient\Entity\SellerStatusProduct;
 
15
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
 
16
 
17
  /**
18
  * Class PayUponInvoiceProductStatus
69
 
70
  try {
71
  $seller_status = $this->partners_endpoint->seller_status();
72
+ } catch ( Throwable $error ) {
73
  $this->current_status_cache = false;
74
  return false;
75
  }
modules/ppcp-wc-gateway/src/Processor/AuthorizedPaymentsProcessor.php CHANGED
@@ -31,7 +31,7 @@ use WooCommerce\PayPalCommerce\WcGateway\Notice\AuthorizeOrderActionNotice;
31
  */
32
  class AuthorizedPaymentsProcessor {
33
 
34
- use PaymentsStatusHandlingTrait;
35
 
36
  const SUCCESSFUL = 'SUCCESSFUL';
37
  const ALREADY_CAPTURED = 'ALREADY_CAPTURED';
@@ -200,6 +200,9 @@ class AuthorizedPaymentsProcessor {
200
 
201
  $this->handle_capture_status( $capture, $wc_order );
202
 
 
 
 
203
  if ( self::SUCCESSFUL === $result_status ) {
204
  if ( $capture->status()->is( CaptureStatus::COMPLETED ) ) {
205
  $wc_order->add_order_note(
31
  */
32
  class AuthorizedPaymentsProcessor {
33
 
34
+ use PaymentsStatusHandlingTrait, TransactionIdHandlingTrait;
35
 
36
  const SUCCESSFUL = 'SUCCESSFUL';
37
  const ALREADY_CAPTURED = 'ALREADY_CAPTURED';
200
 
201
  $this->handle_capture_status( $capture, $wc_order );
202
 
203
+ $transaction_id = $capture->id();
204
+ $this->update_transaction_id( $transaction_id, $wc_order );
205
+
206
  if ( self::SUCCESSFUL === $result_status ) {
207
  if ( $capture->status()->is( CaptureStatus::COMPLETED ) ) {
208
  $wc_order->add_order_note(
modules/ppcp-wc-gateway/src/Settings/HeaderRenderer.php ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Renders the settings page header.
4
+ *
5
+ * @package WooCommerce\PayPalCommerce\WcGateway\Settings
6
+ */
7
+
8
+ declare( strict_types=1 );
9
+
10
+ namespace WooCommerce\PayPalCommerce\WcGateway\Settings;
11
+
12
+ /**
13
+ * Class HeaderRenderer
14
+ */
15
+ class HeaderRenderer {
16
+
17
+ const KEY = 'ppcp-tab';
18
+
19
+ /**
20
+ * ID of the current PPCP gateway settings page, or empty if it is not such page.
21
+ *
22
+ * @var string
23
+ */
24
+ private $page_id;
25
+
26
+ /**
27
+ * The URL to the module.
28
+ *
29
+ * @var string
30
+ */
31
+ private $module_url;
32
+
33
+ /**
34
+ * HeaderRenderer constructor.
35
+ *
36
+ * @param string $page_id ID of the current PPCP gateway settings page, or empty if it is not such page.
37
+ * @param string $module_url The URL to the module.
38
+ */
39
+ public function __construct( string $page_id, string $module_url ) {
40
+ $this->page_id = $page_id;
41
+ $this->module_url = $module_url;
42
+ }
43
+
44
+ /**
45
+ * Whether the sections tab should be rendered.
46
+ *
47
+ * @return bool
48
+ */
49
+ public function should_render() : bool {
50
+ return ! empty( $this->page_id );
51
+ }
52
+
53
+ /**
54
+ * Renders the Sections tab.
55
+ */
56
+ public function render(): string {
57
+ if ( ! $this->should_render() ) {
58
+ return '';
59
+ }
60
+
61
+ return '
62
+ <div class="ppcp-settings-page-header">
63
+ <img alt="PayPal" src="' . esc_url( $this->module_url ) . 'assets/images/paypal.png"/>
64
+ <h4> <span class="ppcp-inline-only">-</span> ' . __( 'The all-in-one checkout solution for WooCommerce', 'woocommerce-paypal-payments' ) . '</h4>
65
+ <a class="button" target="_blank" href="https://woocommerce.com/document/woocommerce-paypal-payments/">'
66
+ . __( 'Documentation', 'woocommerce-paypal-payments' ) .
67
+ '</a>
68
+ <a class="button" target="_blank" href="https://woocommerce.com/document/woocommerce-paypal-payments/#get-help">'
69
+ . __( 'Get Help', 'woocommerce-paypal-payments' ) .
70
+ '</a>
71
+ <span class="ppcp-right-align">
72
+ <a target="_blank" href="https://woocommerce.com/feature-requests/woocommerce-paypal-payments/">'
73
+ . __( 'Request a feature', 'woocommerce-paypal-payments' ) .
74
+ '</a>
75
+ <a target="_blank" href="https://github.com/woocommerce/woocommerce-paypal-payments/issues/new?assignees=&labels=type%3A+bug&template=bug_report.md">'
76
+ . __( 'Submit a bug', 'woocommerce-paypal-payments' ) .
77
+ '</a>
78
+ </span>
79
+ </div>
80
+ ';
81
+ }
82
+ }
modules/ppcp-wc-gateway/src/Settings/SectionsRenderer.php CHANGED
@@ -9,6 +9,7 @@ declare( strict_types=1 );
9
 
10
  namespace WooCommerce\PayPalCommerce\WcGateway\Settings;
11
 
 
12
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
13
  use WooCommerce\PayPalCommerce\Webhooks\Status\WebhooksStatusPage;
14
 
@@ -33,15 +34,24 @@ class SectionsRenderer {
33
  */
34
  protected $sections;
35
 
 
 
 
 
 
 
 
36
  /**
37
  * SectionsRenderer constructor.
38
  *
39
  * @param string $page_id ID of the current PPCP gateway settings page, or empty if it is not such page.
40
  * @param array<string, string> $sections Key - page/gateway ID, value - displayed text.
 
41
  */
42
- public function __construct( string $page_id, array $sections ) {
43
  $this->page_id = $page_id;
44
  $this->sections = $sections;
 
45
  }
46
 
47
  /**
@@ -50,20 +60,20 @@ class SectionsRenderer {
50
  * @return bool
51
  */
52
  public function should_render() : bool {
53
- return ! empty( $this->page_id );
 
 
54
  }
55
 
56
  /**
57
  * Renders the Sections tab.
58
  */
59
- public function render(): void {
60
  if ( ! $this->should_render() ) {
61
- return;
62
  }
63
 
64
- echo '<ul class="subsubsub">';
65
-
66
- $array_keys = array_keys( $this->sections );
67
 
68
  foreach ( $this->sections as $id => $label ) {
69
  $url = admin_url( 'admin.php?page=wc-settings&tab=checkout&section=' . $id );
@@ -73,9 +83,11 @@ class SectionsRenderer {
73
  // Other gateways render fields differently, and their pages are not expected to work when gateway is not available.
74
  $url = admin_url( 'admin.php?page=wc-settings&tab=checkout&section=ppcp-gateway&' . self::KEY . '=' . $id );
75
  }
76
- echo '<li><a href="' . esc_url( $url ) . '" class="' . ( $this->page_id === $id ? 'current' : '' ) . '">' . esc_html( $label ) . '</a> ' . ( end( $array_keys ) === $id ? '' : '|' ) . ' </li>';
77
  }
78
 
79
- echo '</ul><br class="clear" />';
 
 
80
  }
81
  }
9
 
10
  namespace WooCommerce\PayPalCommerce\WcGateway\Settings;
11
 
12
+ use WooCommerce\PayPalCommerce\Onboarding\State;
13
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
14
  use WooCommerce\PayPalCommerce\Webhooks\Status\WebhooksStatusPage;
15
 
34
  */
35
  protected $sections;
36
 
37
+ /**
38
+ * The onboarding state.
39
+ *
40
+ * @var State
41
+ */
42
+ private $state;
43
+
44
  /**
45
  * SectionsRenderer constructor.
46
  *
47
  * @param string $page_id ID of the current PPCP gateway settings page, or empty if it is not such page.
48
  * @param array<string, string> $sections Key - page/gateway ID, value - displayed text.
49
+ * @param State $state The onboarding state.
50
  */
51
+ public function __construct( string $page_id, array $sections, State $state ) {
52
  $this->page_id = $page_id;
53
  $this->sections = $sections;
54
+ $this->state = $state;
55
  }
56
 
57
  /**
60
  * @return bool
61
  */
62
  public function should_render() : bool {
63
+ return ! empty( $this->page_id ) &&
64
+ ( $this->state->production_state() === State::STATE_ONBOARDED ||
65
+ $this->state->sandbox_state() === State::STATE_ONBOARDED );
66
  }
67
 
68
  /**
69
  * Renders the Sections tab.
70
  */
71
+ public function render(): string {
72
  if ( ! $this->should_render() ) {
73
+ return '';
74
  }
75
 
76
+ $html = '<nav class="nav-tab-wrapper woo-nav-tab-wrapper">';
 
 
77
 
78
  foreach ( $this->sections as $id => $label ) {
79
  $url = admin_url( 'admin.php?page=wc-settings&tab=checkout&section=' . $id );
83
  // Other gateways render fields differently, and their pages are not expected to work when gateway is not available.
84
  $url = admin_url( 'admin.php?page=wc-settings&tab=checkout&section=ppcp-gateway&' . self::KEY . '=' . $id );
85
  }
86
+ $html .= '<a href="' . esc_url( $url ) . '" class="nav-tab ' . ( $this->page_id === $id ? 'nav-tab-active' : '' ) . '">' . esc_html( $label ) . '</a> ';
87
  }
88
 
89
+ $html .= '</nav>';
90
+
91
+ return $html;
92
  }
93
  }
modules/ppcp-wc-gateway/src/Settings/SettingsListener.php CHANGED
@@ -235,7 +235,7 @@ class SettingsListener {
235
  *
236
  * @throws \WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException When a setting was not found.
237
  */
238
- public function listen() {
239
 
240
  if ( ! $this->is_valid_update_request() ) {
241
  return;
@@ -473,4 +473,36 @@ class SettingsListener {
473
  }
474
  return true;
475
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
476
  }
235
  *
236
  * @throws \WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException When a setting was not found.
237
  */
238
+ public function listen(): void {
239
 
240
  if ( ! $this->is_valid_update_request() ) {
241
  return;
473
  }
474
  return true;
475
  }
476
+
477
+ /**
478
+ * Prevent enabling tracking if it is not enabled for merchant account.
479
+ */
480
+ public function listen_for_tracking_enabled(): void {
481
+ if ( State::STATE_ONBOARDED !== $this->state->current_state() ) {
482
+ return;
483
+ }
484
+
485
+ try {
486
+ $token = $this->bearer->bearer();
487
+ if ( ! $token->is_tracking_available() ) {
488
+ $this->settings->set( 'tracking_enabled', false );
489
+ $this->settings->persist();
490
+ return;
491
+ }
492
+ } catch ( RuntimeException $exception ) {
493
+ $this->settings->set( 'tracking_enabled', false );
494
+ $this->settings->persist();
495
+
496
+ add_action(
497
+ 'admin_notices',
498
+ function () use ( $exception ) {
499
+ printf(
500
+ '<div class="notice notice-error"><p>%1$s</p><p>%2$s</p></div>',
501
+ esc_html__( 'Authentication with PayPal failed: ', 'woocommerce-paypal-payments' ) . esc_attr( $exception->getMessage() ),
502
+ wp_kses_post( __( 'Please verify your API Credentials and try again to connect your PayPal business account. Visit the <a href="https://docs.woocommerce.com/document/woocommerce-paypal-payments/" target="_blank">plugin documentation</a> for more information about the setup.', 'woocommerce-paypal-payments' ) )
503
+ );
504
+ }
505
+ );
506
+ }
507
+ }
508
  }
modules/ppcp-wc-gateway/src/WCGatewayModule.php CHANGED
@@ -17,6 +17,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Entity\Capture;
17
  use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
18
  use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies;
19
  use WooCommerce\PayPalCommerce\ApiClient\Repository\PayPalRequestIdRepository;
 
20
  use WooCommerce\PayPalCommerce\WcGateway\Admin\FeesRenderer;
21
  use WooCommerce\PayPalCommerce\WcGateway\Admin\OrderTablePaymentStatusColumn;
22
  use WooCommerce\PayPalCommerce\WcGateway\Admin\PaymentStatusOrderDetail;
@@ -28,9 +29,12 @@ use WooCommerce\PayPalCommerce\WcGateway\Endpoint\ReturnUrlEndpoint;
28
  use WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException;
29
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
30
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
 
 
31
  use WooCommerce\PayPalCommerce\WcGateway\Notice\ConnectAdminNotice;
32
  use WooCommerce\PayPalCommerce\WcGateway\Notice\GatewayWithoutPayPalAdminNotice;
33
  use WooCommerce\PayPalCommerce\WcGateway\Processor\AuthorizedPaymentsProcessor;
 
34
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SectionsRenderer;
35
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
36
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsListener;
@@ -65,14 +69,16 @@ class WCGatewayModule implements ModuleInterface {
65
  add_action(
66
  'woocommerce_sections_checkout',
67
  function() use ( $c ) {
 
 
 
68
  $section_renderer = $c->get( 'wcgateway.settings.sections-renderer' );
69
- /**
70
- * The Section Renderer.
71
- *
72
- * @var SectionsRenderer $section_renderer
73
- */
74
- $section_renderer->render();
75
- }
76
  );
77
 
78
  add_action(
@@ -232,7 +238,7 @@ class WCGatewayModule implements ModuleInterface {
232
  add_action(
233
  'init',
234
  function () use ( $c ) {
235
- if ( 'DE' === $c->get( 'api.shop.country' ) && 'EUR' === $c->get( 'api.shop.currency' ) ) {
236
  ( $c->get( 'wcgateway.pay-upon-invoice' ) )->init();
237
  }
238
 
@@ -292,27 +298,63 @@ class WCGatewayModule implements ModuleInterface {
292
  add_filter(
293
  'woocommerce_payment_gateways',
294
  static function ( $methods ) use ( $container ): array {
295
- $methods[] = $container->get( 'wcgateway.paypal-gateway' );
296
- $dcc_applies = $container->get( 'api.helpers.dccapplies' );
297
 
298
- /**
299
- * The DCC Applies object.
300
- *
301
- * @var DccApplies $dcc_applies
302
- */
303
- if ( $dcc_applies->for_country_currency() ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
304
  $methods[] = $container->get( 'wcgateway.credit-card-gateway' );
305
  }
306
 
307
- if ( $container->get( 'wcgateway.settings.allow_card_button_gateway' ) ) {
308
  $methods[] = $container->get( 'wcgateway.card-button-gateway' );
309
  }
310
 
311
- if ( 'DE' === $container->get( 'api.shop.country' ) && 'EUR' === $container->get( 'api.shop.currency' ) ) {
 
 
 
 
 
 
 
 
 
 
312
  $methods[] = $container->get( 'wcgateway.pay-upon-invoice-gateway' );
313
  }
314
 
315
- if ( defined( 'PPCP_FLAG_OXXO' ) && PPCP_FLAG_OXXO === true ) {
316
  $methods[] = $container->get( 'wcgateway.oxxo-gateway' );
317
  }
318
 
@@ -344,6 +386,7 @@ class WCGatewayModule implements ModuleInterface {
344
  */
345
  $listener->listen_for_merchant_id();
346
  $listener->listen_for_vaulting_enabled();
 
347
  }
348
  );
349
 
17
  use WooCommerce\PayPalCommerce\ApiClient\Entity\OrderStatus;
18
  use WooCommerce\PayPalCommerce\ApiClient\Helper\DccApplies;
19
  use WooCommerce\PayPalCommerce\ApiClient\Repository\PayPalRequestIdRepository;
20
+ use WooCommerce\PayPalCommerce\Onboarding\State;
21
  use WooCommerce\PayPalCommerce\WcGateway\Admin\FeesRenderer;
22
  use WooCommerce\PayPalCommerce\WcGateway\Admin\OrderTablePaymentStatusColumn;
23
  use WooCommerce\PayPalCommerce\WcGateway\Admin\PaymentStatusOrderDetail;
29
  use WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException;
30
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
31
  use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
32
+ use WooCommerce\PayPalCommerce\WcGateway\Helper\DCCProductStatus;
33
+ use WooCommerce\PayPalCommerce\WcGateway\Helper\PayUponInvoiceProductStatus;
34
  use WooCommerce\PayPalCommerce\WcGateway\Notice\ConnectAdminNotice;
35
  use WooCommerce\PayPalCommerce\WcGateway\Notice\GatewayWithoutPayPalAdminNotice;
36
  use WooCommerce\PayPalCommerce\WcGateway\Processor\AuthorizedPaymentsProcessor;
37
+ use WooCommerce\PayPalCommerce\WcGateway\Settings\HeaderRenderer;
38
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SectionsRenderer;
39
  use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
40
  use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsListener;
69
  add_action(
70
  'woocommerce_sections_checkout',
71
  function() use ( $c ) {
72
+ $header_renderer = $c->get( 'wcgateway.settings.header-renderer' );
73
+ assert( $header_renderer instanceof HeaderRenderer );
74
+
75
  $section_renderer = $c->get( 'wcgateway.settings.sections-renderer' );
76
+ assert( $section_renderer instanceof SectionsRenderer );
77
+
78
+ // phpcs:ignore WordPress.Security.EscapeOutput
79
+ echo $header_renderer->render() . $section_renderer->render();
80
+ },
81
+ 20
 
82
  );
83
 
84
  add_action(
238
  add_action(
239
  'init',
240
  function () use ( $c ) {
241
+ if ( 'DE' === $c->get( 'api.shop.country' ) ) {
242
  ( $c->get( 'wcgateway.pay-upon-invoice' ) )->init();
243
  }
244
 
298
  add_filter(
299
  'woocommerce_payment_gateways',
300
  static function ( $methods ) use ( $container ): array {
301
+ $paypal_gateway = $container->get( 'wcgateway.paypal-gateway' );
302
+ assert( $paypal_gateway instanceof \WC_Payment_Gateway );
303
 
304
+ $paypal_gateway_enabled = wc_string_to_bool( $paypal_gateway->get_option( 'enabled' ) );
305
+
306
+ $methods[] = $paypal_gateway;
307
+
308
+ $onboarding_state = $container->get( 'onboarding.state' );
309
+ assert( $onboarding_state instanceof State );
310
+
311
+ $settings = $container->get( 'wcgateway.settings' );
312
+ assert( $settings instanceof ContainerInterface );
313
+
314
+ $is_our_page = $container->get( 'wcgateway.is-ppcp-settings-page' );
315
+ $is_gateways_list_page = $container->get( 'wcgateway.is-wc-gateways-list-page' );
316
+
317
+ if ( $onboarding_state->current_state() !== State::STATE_ONBOARDED ) {
318
+ return $methods;
319
+ }
320
+
321
+ $dcc_applies = $container->get( 'api.helpers.dccapplies' );
322
+ assert( $dcc_applies instanceof DccApplies );
323
+
324
+ $dcc_product_status = $container->get( 'wcgateway.helper.dcc-product-status' );
325
+ assert( $dcc_product_status instanceof DCCProductStatus );
326
+
327
+ if ( $dcc_applies->for_country_currency() &&
328
+ // Show only if allowed in PayPal account, except when on our settings pages.
329
+ // Performing the full DCCProductStatus check only when on the gateway list page
330
+ // to avoid sending the API requests all the time.
331
+ ( $is_our_page ||
332
+ ( $is_gateways_list_page && $dcc_product_status->dcc_is_active() ) ||
333
+ ( $settings->has( 'products_dcc_enabled' ) && $settings->get( 'products_dcc_enabled' ) )
334
+ )
335
+ ) {
336
  $methods[] = $container->get( 'wcgateway.credit-card-gateway' );
337
  }
338
 
339
+ if ( $paypal_gateway_enabled && $container->get( 'wcgateway.settings.allow_card_button_gateway' ) ) {
340
  $methods[] = $container->get( 'wcgateway.card-button-gateway' );
341
  }
342
 
343
+ $pui_product_status = $container->get( 'wcgateway.pay-upon-invoice-product-status' );
344
+ assert( $pui_product_status instanceof PayUponInvoiceProductStatus );
345
+
346
+ $shop_country = $container->get( 'api.shop.country' );
347
+
348
+ if ( 'DE' === $shop_country &&
349
+ ( $is_our_page ||
350
+ ( $is_gateways_list_page && $pui_product_status->pui_is_active() ) ||
351
+ ( $settings->has( 'products_pui_enabled' ) && $settings->get( 'products_pui_enabled' ) )
352
+ )
353
+ ) {
354
  $methods[] = $container->get( 'wcgateway.pay-upon-invoice-gateway' );
355
  }
356
 
357
+ if ( defined( 'PPCP_FLAG_OXXO' ) && PPCP_FLAG_OXXO === true && 'MX' === $shop_country ) {
358
  $methods[] = $container->get( 'wcgateway.oxxo-gateway' );
359
  }
360
 
386
  */
387
  $listener->listen_for_merchant_id();
388
  $listener->listen_for_vaulting_enabled();
389
+ $listener->listen_for_tracking_enabled();
390
  }
391
  );
392
 
readme.txt CHANGED
@@ -4,7 +4,7 @@ Tags: woocommerce, paypal, payments, ecommerce, e-commerce, store, sales, sell,
4
  Requires at least: 5.3
5
  Tested up to: 6.0
6
  Requires PHP: 7.1
7
- Stable tag: 1.9.2
8
  License: GPLv2
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -81,6 +81,21 @@ Follow the steps below to connect the plugin to your PayPal account:
81
 
82
  == Changelog ==
83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  = 1.9.2 =
85
  * Fix - Do not allow birth date older than 100 years for PUI. #743
86
  * Fix - Store the customer id for vaulted payment method in usermeta to not lose vaulted methods after the invoice prefix change. #698
4
  Requires at least: 5.3
5
  Tested up to: 6.0
6
  Requires PHP: 7.1
7
+ Stable tag: 1.9.3
8
  License: GPLv2
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
81
 
82
  == Changelog ==
83
 
84
+ = 1.9.3 =
85
+ * Add - Tracking API #792
86
+ * Fix - Improve compatibility with Siteground Optimizer plugin #797
87
+ * Fix - Transaction ID in order not updated when manually capturing authorized payment from WC #766
88
+ * Fix - Failed form validation on Checkout page causing page to be sticky #781
89
+ * Fix - Do not include full path in exception #779
90
+ * Fix - PUI conflict with Germanized plugin and taxes #808
91
+ * Enhancement - Enable ACDC by default only in locations where WooCommerce Payments is not available #799
92
+ * Enhancement - Add links to docs & support in plugin #782
93
+ * Enhancement - Put gateway sub-options into tabs #772
94
+ * Enhancement - Show tabs only after onboarding #789
95
+ * Enhancement - Add header on settings page #790
96
+ * Enhancement - PUI add option for a phone number field next to the Birth Date field #742
97
+ * Enhancement - PUI gateway availability on pay for order page with unsupported currency #744
98
+
99
  = 1.9.2 =
100
  * Fix - Do not allow birth date older than 100 years for PUI. #743
101
  * Fix - Store the customer id for vaulted payment method in usermeta to not lose vaulted methods after the invoice prefix change. #698
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInita666fe7b7b5a2bfddefb2ffdba48c7b2::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit4eba3a98d15e944b7d4ddcca708108f3::getLoader();
vendor/composer/autoload_psr4.php CHANGED
@@ -14,6 +14,7 @@ return array(
14
  'WooCommerce\\PayPalCommerce\\Subscription\\' => array($baseDir . '/modules/ppcp-subscription/src'),
15
  'WooCommerce\\PayPalCommerce\\StatusReport\\' => array($baseDir . '/modules/ppcp-status-report/src'),
16
  'WooCommerce\\PayPalCommerce\\Session\\' => array($baseDir . '/modules/ppcp-session/src'),
 
17
  'WooCommerce\\PayPalCommerce\\Onboarding\\' => array($baseDir . '/modules/ppcp-onboarding/src'),
18
  'WooCommerce\\PayPalCommerce\\Compat\\' => array($baseDir . '/modules/ppcp-compat/src'),
19
  'WooCommerce\\PayPalCommerce\\Button\\' => array($baseDir . '/modules/ppcp-button/src'),
14
  'WooCommerce\\PayPalCommerce\\Subscription\\' => array($baseDir . '/modules/ppcp-subscription/src'),
15
  'WooCommerce\\PayPalCommerce\\StatusReport\\' => array($baseDir . '/modules/ppcp-status-report/src'),
16
  'WooCommerce\\PayPalCommerce\\Session\\' => array($baseDir . '/modules/ppcp-session/src'),
17
+ 'WooCommerce\\PayPalCommerce\\OrderTracking\\' => array($baseDir . '/modules/ppcp-order-tracking/src'),
18
  'WooCommerce\\PayPalCommerce\\Onboarding\\' => array($baseDir . '/modules/ppcp-onboarding/src'),
19
  'WooCommerce\\PayPalCommerce\\Compat\\' => array($baseDir . '/modules/ppcp-compat/src'),
20
  'WooCommerce\\PayPalCommerce\\Button\\' => array($baseDir . '/modules/ppcp-button/src'),
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInita666fe7b7b5a2bfddefb2ffdba48c7b2
6
  {
7
  private static $loader;
8
 
@@ -22,15 +22,15 @@ class ComposerAutoloaderInita666fe7b7b5a2bfddefb2ffdba48c7b2
22
  return self::$loader;
23
  }
24
 
25
- spl_autoload_register(array('ComposerAutoloaderInita666fe7b7b5a2bfddefb2ffdba48c7b2', 'loadClassLoader'), true, true);
26
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
- spl_autoload_unregister(array('ComposerAutoloaderInita666fe7b7b5a2bfddefb2ffdba48c7b2', 'loadClassLoader'));
28
 
29
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
30
  if ($useStaticLoader) {
31
  require_once __DIR__ . '/autoload_static.php';
32
 
33
- call_user_func(\Composer\Autoload\ComposerStaticInita666fe7b7b5a2bfddefb2ffdba48c7b2::getInitializer($loader));
34
  } else {
35
  $map = require __DIR__ . '/autoload_namespaces.php';
36
  foreach ($map as $namespace => $path) {
@@ -51,19 +51,19 @@ class ComposerAutoloaderInita666fe7b7b5a2bfddefb2ffdba48c7b2
51
  $loader->register(true);
52
 
53
  if ($useStaticLoader) {
54
- $includeFiles = Composer\Autoload\ComposerStaticInita666fe7b7b5a2bfddefb2ffdba48c7b2::$files;
55
  } else {
56
  $includeFiles = require __DIR__ . '/autoload_files.php';
57
  }
58
  foreach ($includeFiles as $fileIdentifier => $file) {
59
- composerRequirea666fe7b7b5a2bfddefb2ffdba48c7b2($fileIdentifier, $file);
60
  }
61
 
62
  return $loader;
63
  }
64
  }
65
 
66
- function composerRequirea666fe7b7b5a2bfddefb2ffdba48c7b2($fileIdentifier, $file)
67
  {
68
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
69
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit4eba3a98d15e944b7d4ddcca708108f3
6
  {
7
  private static $loader;
8
 
22
  return self::$loader;
23
  }
24
 
25
+ spl_autoload_register(array('ComposerAutoloaderInit4eba3a98d15e944b7d4ddcca708108f3', 'loadClassLoader'), true, true);
26
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
+ spl_autoload_unregister(array('ComposerAutoloaderInit4eba3a98d15e944b7d4ddcca708108f3', 'loadClassLoader'));
28
 
29
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
30
  if ($useStaticLoader) {
31
  require_once __DIR__ . '/autoload_static.php';
32
 
33
+ call_user_func(\Composer\Autoload\ComposerStaticInit4eba3a98d15e944b7d4ddcca708108f3::getInitializer($loader));
34
  } else {
35
  $map = require __DIR__ . '/autoload_namespaces.php';
36
  foreach ($map as $namespace => $path) {
51
  $loader->register(true);
52
 
53
  if ($useStaticLoader) {
54
+ $includeFiles = Composer\Autoload\ComposerStaticInit4eba3a98d15e944b7d4ddcca708108f3::$files;
55
  } else {
56
  $includeFiles = require __DIR__ . '/autoload_files.php';
57
  }
58
  foreach ($includeFiles as $fileIdentifier => $file) {
59
+ composerRequire4eba3a98d15e944b7d4ddcca708108f3($fileIdentifier, $file);
60
  }
61
 
62
  return $loader;
63
  }
64
  }
65
 
66
+ function composerRequire4eba3a98d15e944b7d4ddcca708108f3($fileIdentifier, $file)
67
  {
68
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
69
  require $file;
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInita666fe7b7b5a2bfddefb2ffdba48c7b2
8
  {
9
  public static $files = array (
10
  'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
@@ -22,6 +22,7 @@ class ComposerStaticInita666fe7b7b5a2bfddefb2ffdba48c7b2
22
  'WooCommerce\\PayPalCommerce\\Subscription\\' => 40,
23
  'WooCommerce\\PayPalCommerce\\StatusReport\\' => 40,
24
  'WooCommerce\\PayPalCommerce\\Session\\' => 35,
 
25
  'WooCommerce\\PayPalCommerce\\Onboarding\\' => 38,
26
  'WooCommerce\\PayPalCommerce\\Compat\\' => 34,
27
  'WooCommerce\\PayPalCommerce\\Button\\' => 34,
@@ -88,6 +89,10 @@ class ComposerStaticInita666fe7b7b5a2bfddefb2ffdba48c7b2
88
  array (
89
  0 => __DIR__ . '/../..' . '/modules/ppcp-session/src',
90
  ),
 
 
 
 
91
  'WooCommerce\\PayPalCommerce\\Onboarding\\' =>
92
  array (
93
  0 => __DIR__ . '/../..' . '/modules/ppcp-onboarding/src',
@@ -173,9 +178,9 @@ class ComposerStaticInita666fe7b7b5a2bfddefb2ffdba48c7b2
173
  public static function getInitializer(ClassLoader $loader)
174
  {
175
  return \Closure::bind(function () use ($loader) {
176
- $loader->prefixLengthsPsr4 = ComposerStaticInita666fe7b7b5a2bfddefb2ffdba48c7b2::$prefixLengthsPsr4;
177
- $loader->prefixDirsPsr4 = ComposerStaticInita666fe7b7b5a2bfddefb2ffdba48c7b2::$prefixDirsPsr4;
178
- $loader->classMap = ComposerStaticInita666fe7b7b5a2bfddefb2ffdba48c7b2::$classMap;
179
 
180
  }, null, ClassLoader::class);
181
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit4eba3a98d15e944b7d4ddcca708108f3
8
  {
9
  public static $files = array (
10
  'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
22
  'WooCommerce\\PayPalCommerce\\Subscription\\' => 40,
23
  'WooCommerce\\PayPalCommerce\\StatusReport\\' => 40,
24
  'WooCommerce\\PayPalCommerce\\Session\\' => 35,
25
+ 'WooCommerce\\PayPalCommerce\\OrderTracking\\' => 41,
26
  'WooCommerce\\PayPalCommerce\\Onboarding\\' => 38,
27
  'WooCommerce\\PayPalCommerce\\Compat\\' => 34,
28
  'WooCommerce\\PayPalCommerce\\Button\\' => 34,
89
  array (
90
  0 => __DIR__ . '/../..' . '/modules/ppcp-session/src',
91
  ),
92
+ 'WooCommerce\\PayPalCommerce\\OrderTracking\\' =>
93
+ array (
94
+ 0 => __DIR__ . '/../..' . '/modules/ppcp-order-tracking/src',
95
+ ),
96
  'WooCommerce\\PayPalCommerce\\Onboarding\\' =>
97
  array (
98
  0 => __DIR__ . '/../..' . '/modules/ppcp-onboarding/src',
178
  public static function getInitializer(ClassLoader $loader)
179
  {
180
  return \Closure::bind(function () use ($loader) {
181
+ $loader->prefixLengthsPsr4 = ComposerStaticInit4eba3a98d15e944b7d4ddcca708108f3::$prefixLengthsPsr4;
182
+ $loader->prefixDirsPsr4 = ComposerStaticInit4eba3a98d15e944b7d4ddcca708108f3::$prefixDirsPsr4;
183
+ $loader->classMap = ComposerStaticInit4eba3a98d15e944b7d4ddcca708108f3::$classMap;
184
 
185
  }, null, ClassLoader::class);
186
  }
woocommerce-paypal-payments.php CHANGED
@@ -3,13 +3,13 @@
3
  * Plugin Name: WooCommerce PayPal Payments
4
  * Plugin URI: https://woocommerce.com/products/woocommerce-paypal-payments/
5
  * Description: PayPal's latest complete payments processing solution. Accept PayPal, Pay Later, credit/debit cards, alternative digital wallets local payment types and bank accounts. Turn on only PayPal options or process a full suite of payment methods. Enable global transaction with extensive currency and country coverage.
6
- * Version: 1.9.2
7
  * Author: WooCommerce
8
  * Author URI: https://woocommerce.com/
9
  * License: GPL-2.0
10
  * Requires PHP: 7.1
11
  * WC requires at least: 3.9
12
- * WC tested up to: 6.7
13
  * Text Domain: woocommerce-paypal-payments
14
  *
15
  * @package WooCommerce\PayPalCommerce
@@ -143,6 +143,44 @@ define( 'PPCP_FLAG_SEPARATE_APM_BUTTONS', apply_filters( 'woocommerce_paypal_pay
143
  }
144
  );
145
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  /**
147
  * Check if WooCommerce is active.
148
  *
3
  * Plugin Name: WooCommerce PayPal Payments
4
  * Plugin URI: https://woocommerce.com/products/woocommerce-paypal-payments/
5
  * Description: PayPal's latest complete payments processing solution. Accept PayPal, Pay Later, credit/debit cards, alternative digital wallets local payment types and bank accounts. Turn on only PayPal options or process a full suite of payment methods. Enable global transaction with extensive currency and country coverage.
6
+ * Version: 1.9.3
7
  * Author: WooCommerce
8
  * Author URI: https://woocommerce.com/
9
  * License: GPL-2.0
10
  * Requires PHP: 7.1
11
  * WC requires at least: 3.9
12
+ * WC tested up to: 6.8
13
  * Text Domain: woocommerce-paypal-payments
14
  *
15
  * @package WooCommerce\PayPalCommerce
143
  }
144
  );
145
 
146
+ // Add links below the description on the Plugins page.
147
+ add_filter(
148
+ 'plugin_row_meta',
149
+ function( $links, $file ) {
150
+ if ( plugin_basename( __FILE__ ) !== $file ) {
151
+ return $links;
152
+ }
153
+
154
+ return array_merge(
155
+ $links,
156
+ array(
157
+ sprintf(
158
+ '<a target="_blank" href="%1$s">%2$s</a>',
159
+ 'https://woocommerce.com/document/woocommerce-paypal-payments/',
160
+ __( 'Documentation', 'woocommerce-paypal-payments' )
161
+ ),
162
+ sprintf(
163
+ '<a target="_blank" href="%1$s">%2$s</a>',
164
+ 'https://woocommerce.com/document/woocommerce-paypal-payments/#get-help',
165
+ __( 'Get help', 'woocommerce-paypal-payments' )
166
+ ),
167
+ sprintf(
168
+ '<a target="_blank" href="%1$s">%2$s</a>',
169
+ 'https://woocommerce.com/feature-requests/woocommerce-paypal-payments/',
170
+ __( 'Request a feature', 'woocommerce-paypal-payments' )
171
+ ),
172
+ sprintf(
173
+ '<a target="_blank" href="%1$s">%2$s</a>',
174
+ 'https://github.com/woocommerce/woocommerce-paypal-payments/issues/new?assignees=&labels=type%3A+bug&template=bug_report.md',
175
+ __( 'Submit a bug', 'woocommerce-paypal-payments' )
176
+ ),
177
+ )
178
+ );
179
+ },
180
+ 10,
181
+ 2
182
+ );
183
+
184
  /**
185
  * Check if WooCommerce is active.
186
  *