{"version":3,"file":"default/js/hostedcheckout.js","sources":["webpack:///webpack/bootstrap","webpack:///./cartridges/app_storefront_base/cartridge/client/default/js/checkout/summary.js","webpack:///./cartridges/app_storefront_base/cartridge/client/default/js/components/cleave.js","webpack:///./cartridges/app_storefront_base/cartridge/client/default/js/components/scrollAnimate.js","webpack:///./cartridges/org_marykay/cartridge/client/default/js/checkout/formErrors.js","webpack:///./cartridges/org_marykay/cartridge/client/default/js/components/cleave.js","webpack:///./cartridges/org_marykay/cartridge/client/default/js/components/pageReload.js","webpack:///./cartridges/org_marykay/cartridge/client/default/js/hostedcheckout.js","webpack:///./cartridges/org_marykay/cartridge/client/default/js/hostedcheckout/hostedcheckout.js","webpack:///./cartridges/org_marykay/cartridge/client/default/js/stripe.checkout.js","webpack:///./cartridges/site_marykay_mx/cartridge/client/default/js/components/checkoutUtil.js","webpack:///./node_modules/cleave.js/dist/cleave-esm.js","webpack:///(webpack)/buildin/global.js"],"sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./cartridges/org_marykay/cartridge/client/default/js/hostedcheckout.js\");\n","'use strict';\n\n/**\n * updates the totals summary\n * @param {Array} totals - the totals data\n */\nfunction updateTotals(totals) {\n $('.shipping-total-cost').text(totals.totalShippingCost);\n $('.tax-total').text(totals.totalTax);\n $('.sub-total').text(totals.subTotal);\n $('.grand-total-sum').text(totals.grandTotal);\n\n if (totals.ibcDiscountAmount && totals.ibcDiscountAmount.formatted) {\n $('.ibcDiscountAmount').removeClass('d-none');\n var discountText = $('.ibcDiscountAmount').data('label');\n $('.order-discount').first().text(discountText.replace('{percentage}', totals.discountPercent));\n $('.order-discount-total').text(totals.ibcDiscountAmount.formatted);\n } else {\n $('.ibcDiscountAmount').addClass('d-none');\n }\n\n if (totals.shippingLevelDiscountTotal.value > 0) {\n $('.shipping-discount').removeClass('hide-shipping-discount');\n $('.shipping-discount-total').text('- '\n + totals.shippingLevelDiscountTotal.formatted);\n } else {\n $('.shipping-discount').addClass('hide-shipping-discount');\n }\n if (totals.discounts.length > 0) {\n $('.coupon-discounts').removeClass('d-none');\n $('.coupon-discounts').empty()\n .append(totals.couponDiscountsHtml);\n } else {\n $('.coupon-discounts').addClass('d-none');\n }\n $('.coupons-and-promos').empty().append(totals.discountsHtml);\n}\n\n/**\n * updates the order product shipping summary for an order model\n * @param {Object} order - the order model\n */\nfunction updateOrderProductSummaryInformation(order) {\n var $productSummary = $('
');\n order.shipping.forEach(function (shipping) {\n shipping.productLineItems.items.forEach(function (lineItem) {\n var pli = $('[data-product-line-item=' + lineItem.UUID + ']');\n $productSummary.append(pli);\n });\n\n var address = shipping.shippingAddress || {};\n var selectedMethod = shipping.selectedShippingMethod;\n\n var nameLine = address.firstName ? address.firstName + ' ' : '';\n if (address.lastName) nameLine += address.lastName;\n\n var address1Line = address.address1;\n var address2Line = address.address2;\n\n var phoneLine = address.phone;\n\n var shippingCost = selectedMethod ? selectedMethod.shippingCost : '';\n var methodNameLine = selectedMethod ? selectedMethod.displayName : '';\n var methodArrivalTime = selectedMethod && selectedMethod.estimatedArrivalTime\n ? '( ' + selectedMethod.estimatedArrivalTime + ' )'\n : '';\n\n var tmpl = $('#pli-shipping-summary-template').clone();\n\n if (shipping.productLineItems.items && shipping.productLineItems.items.length > 1) {\n $('h5 > span').text(' - ' + shipping.productLineItems.items.length + ' '\n + order.resources.items);\n } else {\n $('h5 > span').text('');\n }\n\n var stateRequiredAttr = $('#shippingState').attr('required');\n var isRequired = stateRequiredAttr !== undefined && stateRequiredAttr !== false;\n var stateExists = (shipping.shippingAddress && shipping.shippingAddress.stateCode)\n ? shipping.shippingAddress.stateCode\n : false;\n var stateBoolean = false;\n if ((isRequired && stateExists) || (!isRequired)) {\n stateBoolean = true;\n }\n\n var shippingForm = $('.multi-shipping input[name=\"shipmentUUID\"][value=\"' + shipping.UUID + '\"]').parent();\n\n if (shipping.shippingAddress\n && shipping.shippingAddress.firstName\n && shipping.shippingAddress.address1\n && shipping.shippingAddress.city\n && stateBoolean\n && shipping.shippingAddress.countryCode\n && (shipping.shippingAddress.phone || shipping.productLineItems.items[0].fromStoreId)) {\n $('.ship-to-name', tmpl).text(nameLine);\n $('.ship-to-address1', tmpl).text(address1Line);\n $('.ship-to-address2', tmpl).text(address2Line);\n $('.ship-to-city', tmpl).text(address.city);\n if (address.stateCode) {\n $('.ship-to-st', tmpl).text(address.stateCode);\n }\n $('.ship-to-zip', tmpl).text(address.postalCode);\n $('.ship-to-phone', tmpl).text(phoneLine);\n\n if (!address2Line) {\n $('.ship-to-address2', tmpl).hide();\n }\n\n if (!phoneLine) {\n $('.ship-to-phone', tmpl).hide();\n }\n\n shippingForm.find('.ship-to-message').text('');\n } else {\n shippingForm.find('.ship-to-message').text(order.resources.addressIncomplete);\n }\n\n if (shipping.isGift) {\n $('.gift-message-summary', tmpl).text(shipping.giftMessage);\n } else {\n $('.gift-summary', tmpl).addClass('d-none');\n }\n\n // checking h5 title shipping to or pickup\n var $shippingAddressLabel = $('.shipping-header-text', tmpl);\n $('body').trigger(\n 'shipping:updateAddressLabelText',\n { selectedShippingMethod: selectedMethod, resources: order.resources, shippingAddressLabel: $shippingAddressLabel }\n );\n\n if (shipping.selectedShippingMethod) {\n $('.display-name', tmpl).text(methodNameLine);\n $('.arrival-time', tmpl).text(methodArrivalTime);\n $('.price', tmpl).text(shippingCost);\n }\n\n var $shippingSummary = $('
');\n $shippingSummary.html(tmpl.html());\n $productSummary.append($shippingSummary);\n });\n\n $('.product-summary-block').html($productSummary.html());\n\n // Also update the line item prices, as they might have been altered\n $('.grand-total-price').text(order.totals.subTotal);\n order.items.items.forEach(function (item) {\n if (item.priceTotal && item.priceTotal.renderedPrice) {\n $('.item-total-' + item.UUID).empty().append(item.priceTotal.renderedPrice);\n }\n });\n}\n\nmodule.exports = {\n updateTotals: updateTotals,\n updateOrderProductSummaryInformation: updateOrderProductSummaryInformation\n};\n","'use strict';\n\nvar Cleave = require('cleave.js').default;\n\nmodule.exports = {\n handleCreditCardNumber: function (cardFieldSelector, cardTypeSelector) {\n var cleave = new Cleave(cardFieldSelector, {\n creditCard: true,\n onCreditCardTypeChanged: function (type) {\n var creditCardTypes = {\n visa: 'Visa',\n mastercard: 'Master Card',\n amex: 'Amex',\n discover: 'Discover',\n unknown: 'Unknown'\n };\n\n var cardType = creditCardTypes[Object.keys(creditCardTypes).indexOf(type) > -1\n ? type\n : 'unknown'];\n $(cardTypeSelector).val(cardType);\n $('.card-number-wrapper').attr('data-type', type);\n if (type === 'visa' || type === 'mastercard' || type === 'discover') {\n $('#securityCode').attr('maxlength', 3);\n } else {\n $('#securityCode').attr('maxlength', 4);\n }\n }\n });\n\n $(cardFieldSelector).data('cleave', cleave);\n },\n\n serializeData: function (form) {\n var serializedArray = form.serializeArray();\n\n serializedArray.forEach(function (item) {\n if (item.name.indexOf('cardNumber') > -1) {\n item.value = $('#cardNumber').data('cleave').getRawValue(); // eslint-disable-line\n }\n });\n\n return $.param(serializedArray);\n }\n};\n","'use strict';\n\nmodule.exports = function (element) {\n var position = element && element.length ? element.offset().top : 0;\n $('html, body').animate({\n scrollTop: position\n }, 500);\n if (!element) {\n $('.logo-home').focus();\n }\n};\n","'use strict';\n\nvar scrollAnimate = require('base/components/scrollAnimate');\n\n/**\n * Display error messages and highlight form fields with errors.\n * @param {string} parentSelector - the form which contains the fields\n * @param {Object} fieldErrors - the fields with errors\n */\nfunction loadFormErrors(parentSelector, fieldErrors) { // eslint-disable-line\n // Display error messages and highlight form fields with errors.\n $.each(fieldErrors, function (attr) {\n $('*[name=' + attr + ']', parentSelector)\n .addClass('is-invalid')\n .siblings('.invalid-feedback')\n .html(fieldErrors[attr])\n .siblings('.form-control-label')\n .addClass('is-invalid-label');\n });\n // Animate to top of form that has errors\n scrollAnimate($(parentSelector));\n}\n\n/**\n * Clear the form errors.\n * @param {string} parentSelector - the parent form selector.\n */\nfunction clearPreviousErrors(parentSelector) {\n $(parentSelector).find('.form-control.is-invalid').removeClass('is-invalid');\n $(parentSelector).find('.is-invalid-label').removeClass('is-invalid-label');\n $('.error-message').hide();\n}\n\nmodule.exports = {\n loadFormErrors: loadFormErrors,\n clearPreviousErrors: clearPreviousErrors\n};\n","'use strict';\n\nvar Cleave = require('cleave.js').default;\nvar base = require('base/components/cleave');\n\nbase.handleCreditCardNumber = function (cardFieldSelector, cardTypeSelector) {\n var cleave = new Cleave(cardFieldSelector, {\n creditCard: true,\n onCreditCardTypeChanged: function (type) {\n window.ccType = type;\n var creditCardTypes = {\n visa: 'Visa',\n mastercard: 'Master Card',\n amex: 'Amex',\n discover: 'Discover',\n maestro: 'Maestro',\n jcb: 'JCB',\n diners: 'DinersClub',\n unknown: 'Unknown'\n };\n var cardType = creditCardTypes[Object.keys(creditCardTypes).indexOf(type) > -1\n ? type\n : 'unknown'];\n $(cardTypeSelector).val(cardType);\n $('.card-number-wrapper').attr('data-type', type);\n if (type === 'visa' || type === 'mastercard' || type === 'discover') {\n $('#securityCode').attr('maxlength', 3);\n } else {\n $('#securityCode').attr('maxlength', 4);\n }\n }\n });\n if ($('li[data-method-id=\"CREDIT_CARD\"]').attr('data-sa-type') !== 'SA_FLEX') {\n $(cardFieldSelector).data('cleave', cleave);\n }\n};\n\nbase.serializeData = function (form) {\n var serializedArray = form.serializeArray();\n\n serializedArray.forEach(function (item) {\n if (item.name.indexOf('cardNumber') > -1) {\n if ($('li[data-method-id=\"CREDIT_CARD\"]').attr('data-sa-type') !== 'SA_FLEX') {\n item.value = $('#cardNumber').data('cleave').getRawValue(); // eslint-disable-line\n }\n }\n });\n\n return $.param(serializedArray);\n};\n\nmodule.exports = base;\n","'use strict';\n\nvar reloadPageTime;\nvar reloadPageTimeoutId;\n\n/**\n * Boolean function to check if reload page enabled.\n * @returns {boolean} true or false\n*/\nfunction reloadPageEnabled() {\n var checkReloadPageEnable = false;\n if (window.isReloadPageEnable === 'true') {\n checkReloadPageEnable = true;\n }\n return checkReloadPageEnable;\n}\n\n/**\n * return checkout page timer if exist in millisecond format.\n * @returns {boolean} true or false\n*/\nfunction isReloadPageTimerExist() {\n reloadPageTime = window.pageReloadTime !== null ? parseInt(window.pageReloadTime, 10) : null;\n if (reloadPageTime) {\n reloadPageTime = reloadPageTime * 60000; // convert minutes into millisecond\n }\n return reloadPageTime;\n}\n\n/**\n * In case if page timer timeout redirect to errorpage\n*/\nfunction schedulePageReload() {\n var pageTimer = isReloadPageTimerExist() ? isReloadPageTimerExist() : null;\n // var cartURL = $('.cart').attr('href');\n // var errorStartURL = window.errorStartURL;\n if (pageTimer > 0 && pageTimer !== null) {\n clearTimeout(reloadPageTimeoutId);\n reloadPageTimeoutId = setTimeout(function () {\n window.location.href = window.errorStartURL;\n // window.location.reload();\n }, pageTimer);\n }\n}\n\n/**\n * reseting page timer\n*/\nfunction stopPageRedirect() {\n if (reloadPageTimeoutId) {\n clearTimeout(reloadPageTimeoutId);\n }\n}\n\nvar pageReload = {\n reloadPageEnabled: reloadPageEnabled,\n schedulePageReload: schedulePageReload,\n stopPageRedirect: stopPageRedirect\n};\n\nmodule.exports = pageReload;\n","'use strict';\n\n// var processInclude = require('base/util');\nvar $ = window.$;\n$(document).ready(function () {\n require('./hostedcheckout/hostedcheckout');\n});\n","/* eslint-disable no-undef */\n'use strict';\n\nvar formHelpers = require('../checkout/formErrors');\nvar cleave = require('../components/cleave');\nvar scrollAnimate = require('base/components/scrollAnimate');\nvar summaryHelpers = require('base/checkout/summary');\nvar stripeCheckout = require('../stripe.checkout.js');\nvar pageReload = require('org/components/pageReload');\n\nvar TRIGGER_DELAY = 2000;\nvar checkoutUtil = require('site/components/checkoutUtil');\n\n\n/**\n * shows the error message on the checkout page\n */\nfunction showErrorOnCheckout(errorMsg) {\n $('.error-alert-dialog').removeClass('d-none');\n $('.form-error-text').removeClass('d-none')\n $('.form-error-payment-text').addClass('d-none')\n if (errorMsg) {\n $('.form-error-para').empty().html(errorMsg);\n }\n}\n\n/**\n * hides the error message on the checkout page\n */\nfunction hideErrorOnCheckout() {\n $('.error-alert-dialog').addClass('d-none');\n}\n\n/**\n* Updates the billing address form values within payment forms without any payment instrument validation\n* @param {Object} order - the order model\n*/\nfunction updateBillingAddress(order) {\n var billing = order.billing;\n if (!billing.billingAddress || !billing.billingAddress.address) return;\n\n var form = $('form[name=dwfrm_billing]');\n if (!form) return;\n\n $('input[name$=_firstName]', form).val(billing.billingAddress.address.firstName);\n $('input[name$=_lastName]', form).val(billing.billingAddress.address.lastName);\n $('input[name$=_address1]', form).val(billing.billingAddress.address.address1);\n $('input[name$=_address2]', form).val(billing.billingAddress.address.address2);\n $('input[name$=_city]', form).val(billing.billingAddress.address.city);\n $('input[name$=_state]', form).val(billing.billingAddress.address.stateCode);\n $('input[name$=_postalCode]', form).val(billing.billingAddress.address.postalCode);\n $('input[name$=_state],input[name$=_state]', form)\n .val(billing.billingAddress.address.stateCode);\n $('input[name$=_country]', form).val(billing.billingAddress.address.countryCode.value);\n $('input[name$=_phone]', form).val(billing.billingAddress.address.phone);\n $('input[name$=_email]', form).val(order.orderEmail);\n}\n\n/**\n * Submit the payment form in submit order flow\n * @param {*} $form paymentform\n */\nfunction submitPayment($form) {\n var url = $('#submit-payment').attr('action');\n var formData = cleave.serializeData($form);\n $.ajax({\n url: url,\n method: 'POST',\n dataType: 'json',\n data: formData,\n success: function (data) {\n if (data.error) {\n if (data.cartError && data.redirectUrl) {\n window.location.href = data.redirectUrl;\n } else if (data.cartError) {\n if (data.errorMessage) {\n $('.error-message').first().show();\n $('.error-message-text').first().text(data.errorMessage);\n scrollAnimate($('.error-message').first());\n }\n }\n $.spinner().stop();\n if (data.serverErrors.length) {\n showErrorOnCheckout(data.serverErrors[0]);\n }\n } else {\n hideErrorOnCheckout();\n var redirect = $('
')\n .appendTo(document.body)\n .attr({\n method: 'POST',\n action: data.continueUrl\n });\n\n $('')\n .appendTo(redirect)\n .attr({\n name: 'orderID',\n value: data.orderID\n });\n\n $('')\n .appendTo(redirect)\n .attr({\n name: 'orderToken',\n value: data.orderToken\n });\n\n redirect.submit();\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Submit the order after validating the shipping and payment form\n * @param {*} $shippingForm shippingForm\n * @param {*} $paymentForm paymentForm\n */\nfunction submitOrder($shippingForm, $paymentForm) {\n var url = $('.shipping-form').attr('action');\n if($('#skipOrderValidation').length) {\n $('#skipOrderValidation').val(true);\n }\n formHelpers.clearPreviousErrors($shippingForm);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: $shippingForm.serialize(),\n success: function (data) {\n if($('#skipOrderValidation').length) {\n $('#skipOrderValidation').val(false);\n }\n if (data.error) {\n $('.error-alert-dialog').removeClass('d-none');\n if (data.fieldErrors.length) {\n data.fieldErrors.forEach(function (error) {\n if (Object.keys(error).length) {\n formHelpers.loadFormErrors($shippingForm, error);\n }\n });\n showErrorOnCheckout(data.errorMsg);\n }\n $.spinner().stop();\n if (data.serverErrors.length) {\n showErrorOnCheckout(data.serverErrors[0]);\n } else if (data.cartError && data.redirectUrl) {\n window.location.href = data.redirectUrl;\n }\n } else {\n hideErrorOnCheckout();\n updateBillingAddress(data.order);\n $('.error-alert-dialog').addClass('d-none');\n $('.shipping-method-unavailable').addClass('d-none');\n $('.shipping-method-list').removeClass('d-none');\n if ($('.submit-payment-hostedStripe').length === 1) {\n if ($('#payment-element').length) {\n var stripeOrderAmount = parseInt($('#stripe_order_amount').val());\n if (stripeOrderAmount != data.order.totals.grandTotalValue) { \n stripeCheckout.updateGetStripeOrderItems(false);\n }\n stripeCheckout.paymentSelections();\n stripeCheckout.submitStripePayment($paymentForm, showErrorOnCheckout);\n } else {\n stripeCheckout.paymentSelections();\n }\n } else {\n submitPayment($paymentForm);\n }\n }\n },\n error: function () {\n if($('#skipOrderValidation').length) {\n $('#skipOrderValidation').val(false);\n }\n window.location.reload();\n $.spinner().stop();\n }\n });\n}\n\n$('body').on('click', '.connect-consultant', function () {\n var form = $(this).closest('form');\n var formData = form.serializeArray();\n var url = $('#show-consulatant').attr('action');\n formHelpers.clearPreviousErrors(form);\n\n if ($('.masked-input').length > 0) {\n var myFieldName = 'dwfrm_consultant_consultantPhone';\n var myFieldFilter = function (field) {\n return field.name === myFieldName;\n };\n var maskedPhoneNo = formData.filter(myFieldFilter)[0].value;\n var phoneNo = maskedPhoneNo.replace(/_| |\\+|\\(|\\)/g, '');\n if (phoneNo && phoneNo.indexOf('34') >= 0 && phoneNo.startsWith('34')) {\n phoneNo = phoneNo.replace(/34/, '');\n }\n formData.filter(myFieldFilter)[0].value = phoneNo;\n }\n\n var spinnerThreshold = parseInt(window.spinnerThreshold, 10);\n if (!($('.spinner').length > 0)) {\n var spinnerTimeout = setTimeout(function() {\n $.spinner().start();\n }, isNaN(spinnerThreshold) ? 0 : spinnerThreshold);\n }\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: formData,\n success: function (consultantData) {\n if (consultantData.error) {\n $('body').trigger('checkout:connectConsultant:invalidPhone');\n if (consultantData.fieldErrors.length) {\n consultantData.fieldErrors.forEach(function (error) {\n if (Object.keys(error).length) {\n formHelpers.loadFormErrors(form, error);\n }\n });\n }\n clearTimeout(spinnerTimeout);\n $.spinner().stop();\n } else if (!consultantData.success && consultantData.consultant === '{}') {\n $('body').trigger('checkout:connectConsultant:notFound');\n $('#consultantNotFoundModal').modal('show');\n clearTimeout(spinnerTimeout);\n $.spinner().stop();\n } else if (consultantData.success && !consultantData.consultant.isActive) {\n $('body').trigger('checkout:connectConsultant:offline');\n $('#consultantOfflineModal').modal('show');\n clearTimeout(spinnerTimeout);\n $.spinner().stop();\n } else {\n var consultant = consultantData.consultant;\n $('body').trigger('checkout:connectConsultant:phoneNumber:success', consultant);\n $('.hosted-consultant-details-title').addClass('d-none');\n $('.hosted-consultant-details.bottom').addClass('d-none');\n $('.unavailableIbc').addClass('d-none');\n $('.hosted-consultant-unavailable').addClass('d-none');\n $('.hosted-consultant-details.top').removeClass('d-none');\n $('.beautyconsultantName').find('span#beautyconsultantName').html(consultant.consultantName);\n $('.beautyconsultantDesignation').find('span#beautyconsultantDesignation').html(consultant.title);\n $('.ibcPhone p').find('span#ibcPhone').html(consultant.phone);\n $('.ibcLocation').find('span#ibcCountry').html(consultant.country);\n $('.ibcLocation').find('span#ibcCity').html(consultant.city);\n $('.ibcLocation').find('span#ibcState').html(consultant.state);\n\n //ES specific fields\n $('.ibcPhone p').find('span#ibcCustomPhone').html(consultant.customPhone);\n $('.ibcLocation').find('span#ibcCustomCity').html(consultant.customCity);\n $('.ibcLocation').find('span#ibcStateSep').toggleClass('d-none', !consultant.customState);\n $('.ibcLocation').find('span#ibcCustomState').html(consultant.customState);\n $('.ibcLocation').find('span#ibcZipSep').toggleClass('d-none', !consultant.customZip);\n $('.ibcLocation').find('span#ibcCustomZip').html(consultant.customZip);\n $('.ibcLocation').find('span#ibcCustomStreet').html(consultant.customStreet);\n $('.ibcLocation').find('span#ibcCustomStreet').html(consultant.customStreet);\n $('.ibcCustomEmail p').find('span#ibcCustomEmail').html(consultant.customEmail);\n $('.ibcTaxId p').find('span#ibcTaxId').html(consultant.taxId);\n\n $('.beautyconsultantName').attr('value', consultant.consultantName);\n $('.beautyconsultantDesignation').attr('value', consultant.title);\n $('.ibcPhone').attr('value', consultant.phone);\n $('.beautyConsultantNumber').attr('value', consultant.consultantNumber);\n if (consultant.profileImage) {\n $('.consultant-image').attr('src', consultant.profileImage);\n } else {\n $('.consultant-image').removeAttr('src');\n }\n hideErrorOnCheckout();\n clearTimeout(spinnerTimeout);\n $.spinner().stop();\n }\n summaryHelpers.updateTotals(consultantData.totals);\n clearTimeout(spinnerTimeout);\n $.spinner().stop();\n },\n error: function () {\n clearTimeout(spinnerTimeout);\n $.spinner().stop();\n }\n });\n return false;\n});\n\n$('body').on('click', '.change-consultant-link', function () {\n var url = $('#show-consulatant').data('clearaction');\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n if (data.success) {\n hideErrorOnCheckout();\n $('.hosted-consultant-unavailable').removeClass('d-none');\n $('.hosted-consultant-details').addClass('d-none');\n $('.unavailableIbc').removeClass('d-none');\n $('.hosted-consultant-details-title').removeClass('d-none');\n // Clear the below fileds to re-enter again\n $('.shippingZipCode').val('');\n $('.shippingAddressState').val('');\n $('.shippingAddressCity').val('');\n $('.shippingAddressDistrict').val('');\n $('.shippingAddressDistrict').removeAttr('data-selected-district');\n $('.shippingAddressOne').val('');\n summaryHelpers.updateTotals(data.totals);\n }\n },\n error: function () {\n }\n });\n});\n\n$('body').on('click', '.submit-payment-button', function () {\n $('.error-alert-dialog').addClass('d-none');\n var $paymentForm = $('#submit-payment').closest('form');\n var $shippingForm = $('.shipping-form').closest('form');\n $('.page-body').spinner().start();\n submitOrder($shippingForm, $paymentForm);\n return false;\n});\n\n$('body').on('click', 'button.submit-payment-hostedStripe', function (event) {\n event.preventDefault();\n stripeCheckout.submitpaymenthostedStripe();\n return false;\n});\n\n$('#default-checkbox').on('change', function () {\n if ($(this).prop('checked')) {\n $('#billing-address-details').css('display', 'none');\n } else {\n $('#billing-address-details').css('display', 'block');\n }\n});\n\n$('body').on('change', '.shipping-form', function () {\n if (checkoutUtil.shippingFormComplete()) {\n if (!($('.spinner').length > 0)) {\n $('.page-body').spinner().start();\n }\n var $form = $(this);\n var formData = $($form).serializeArray();\n var $shippingForm = $('.shipping-form').closest('form');\n var url = $('.shipping-form').attr('action');\n if ($('.masked-input').length > 0) {\n var myFieldName = 'dwfrm_shipping_shippingAddress_addressFields_phone';\n var myFieldFilter = function (field) {\n return field.name === myFieldName;\n };\n var maskedPhoneNo = formData.filter(myFieldFilter)[0].value;\n var phoneNo = maskedPhoneNo.replace(/_| |\\+|\\(|\\)/g, '');\n formData.filter(myFieldFilter)[0].value = phoneNo;\n }\n formHelpers.clearPreviousErrors($form);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: formData,\n success: function (data) {\n if (data.error) {\n if (data.cartError && data.redirectUrl) {\n window.location.href = data.redirectUrl;\n }\n if (data.fieldErrors.length) {\n data.fieldErrors.forEach(function (error) {\n if (Object.keys(error).length) {\n formHelpers.loadFormErrors($shippingForm, error);\n }\n });\n showErrorOnCheckout(data.errorMsg);\n }\n if (data.serverErrors.length) {\n showErrorOnCheckout(data.serverErrors[0]);\n }\n $('#maincontent').spinner().stop();\n } else {\n hideErrorOnCheckout();\n updateBillingAddress(data.order);\n summaryHelpers.updateTotals(data.order.totals);\n $('.shipping-method-unavailable').addClass('d-none');\n $('.shipping-method-list').removeClass('d-none');\n if ($('#payment-element').length) {\n var stripeOrderAmount = parseInt($('#stripe_order_amount').val());\n if (stripeOrderAmount != data.order.totals.grandTotalValue) { \n stripeCheckout.updateGetStripeOrderItems(false);\n }\n stripeCheckout.initNewStripePaymentIntent();\n } else {\n $('#maincontent').spinner().stop();\n }\n $('body').trigger('checkout:shipping:complete');\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n return false;\n});\n\n$('body').on('keyup', '.shipping-form input', function () {\n var $form = $(this).parents('.form-group');\n if($(this).val()!=='') {\n $form.find('.form-control.is-invalid').removeClass('is-invalid');\n $form.find('.is-invalid-label').removeClass('is-invalid-label');\n }\n});\n\n$('body').on('keyup', '.shippingZipCode', function () {\n var $formstate = $('.shippingAddressState').parents('.form-group');\n var $formcity = $('.shippingAddressCity').parents('.form-group');\n if($(this).val()!=='') {\n $formstate.find('.form-control.is-invalid').removeClass('is-invalid');\n $formstate.find('.is-invalid-label').removeClass('is-invalid-label');\n $formcity.find('.form-control.is-invalid').removeClass('is-invalid');\n $formcity.find('.is-invalid-label').removeClass('is-invalid-label');\n }\n});\n\n\n/**\n * appends params to a url\n * @param {string} url - Original url\n * @param {Object} params - Parameters to append\n * @returns {string} result url with appended parameters\n */\nfunction appendToUrl(url, params) {\n var newUrl = url;\n newUrl += (newUrl.indexOf('?') !== -1 ? '&' : '?') + Object.keys(params).map(function (key) {\n return key + '=' + encodeURIComponent(params[key]);\n }).join('&');\n\n return newUrl;\n}\n\n/**\n * re-renders the order totals and the number of items in the cart\n * @param {Object} data - AJAX response from the server\n */\nfunction updateCartTotals(data) {\n $('.number-of-items').empty().append(data.resources.numberOfItems);\n $('.shipping-cost').empty().append(data.totals.totalShippingCost);\n $('.shipping-total-cost').empty().append(data.totals.totalShippingCost);\n $('.tax-total').empty().append(data.totals.totalTax);\n $('.grand-total').empty().append(data.totals.grandTotal);\n $('.grand-total-sum').empty().append(data.totals.grandTotal);\n $('.sub-total').empty().append(data.totals.subTotal);\n $('.minicart-quantity').empty().append(data.numItems);\n $('.minicart-link').attr({\n 'aria-label': data.resources.minicartCountOfItems,\n title: data.resources.minicartCountOfItems\n });\n if (data.totals.ibcDiscountAmount && data.totals.ibcDiscountAmount.formatted) {\n $('.ibcDiscountAmount').removeClass('d-none');\n var discountText = $('.ibcDiscountAmount').data('label');\n $('.order-discount').first().text(discountText.replace('{percentage}', data.totals.discountPercent));\n $('.order-discount-total').empty()\n .append(data.totals.ibcDiscountAmount.formatted);\n } else {\n $('.ibcDiscountAmount').addClass('d-none');\n }\n\n if (data.totals.shippingLevelDiscountTotal.value > 0) {\n $('.shipping-discount').removeClass('d-none');\n $('.shipping-discount-total').empty().append('- ' +\n data.totals.shippingLevelDiscountTotal.formatted);\n } else {\n $('.shipping-discount').addClass('d-none');\n }\n\n if (data.totals.discounts.length > 0) {\n $('.coupon-discounts').removeClass('d-none');\n $('.coupon-discounts').empty()\n .append(data.totals.couponDiscountsHtml);\n } else {\n $('.coupon-discounts').addClass('d-none');\n }\n $('.delete-coupon-confirmation-btn').attr('data-action', data.actionUrls.removeCouponLineItem);\n data.items.forEach(function (item) {\n if (data.totals.orderLevelDiscountTotal.value > 0) {\n $('.coupons-and-promos').empty().append(data.totals.discountsHtml);\n }\n if (item.renderedPromotions) {\n $('.item-' + item.UUID).empty().append(item.renderedPromotions);\n } else {\n $('.item-' + item.UUID).empty();\n }\n $('.uuid-' + item.UUID + ' .unit-price').empty().append(item.renderedPrice);\n $('.line-item-price-' + item.UUID + ' .unit-price').empty().append(item.renderedPrice);\n $('.item-total-' + item.UUID).empty().append(item.priceTotal.renderedPrice);\n });\n}\n\n/**\n * re-renders the approaching discount messages\n * @param {Object} approachingDiscounts - updated approaching discounts for the cart\n */\nfunction updateApproachingDiscounts(approachingDiscounts) {\n var html = '';\n $('.approaching-discounts').empty();\n if (approachingDiscounts.length > 0) {\n approachingDiscounts.forEach(function (item) {\n html += '
'\n + item.discountMsg + '
';\n });\n }\n $('.approaching-discounts').append(html);\n}\n\n/**\n * Updates the availability of a product line item\n * @param {Object} data - AJAX response from the server\n */\nfunction updateAvailability(data) {\n var outOfStockItems = data.inventoryValidationResult ? data.inventoryValidationResult.outOfStockItems : [];\n\n if (outOfStockItems.length === 0) {\n $('.cart-has-out-of-stock-items').addClass('d-none');\n $('.checkout-btn').removeClass('disabled');\n } else {\n $('.cart-has-out-of-stock-items').removeClass('d-none');\n $('.checkout-btn').addClass('disabled');\n }\n\n $('.cart-item-out-of-stock-message').addClass('d-none');\n\n for (var i = 0; i < outOfStockItems.length; i++) {\n var sku = outOfStockItems[i];\n $('.cart-item-out-of-stock-message').filter('[data-sku=\"' + sku + '\"]').removeClass('d-none');\n }\n}\n\n/**\n * re-renders the order totals and the number of items in the cart\n * @param {Object} message - Error message to display\n */\nfunction createErrorNotification(message) {\n var errorHtml = '
'\n + '' + message + '
';\n\n $('.cart-error').append(errorHtml);\n}\n/**\n * Checks whether the basket is valid. if invalid displays error message and disables\n * checkout button\n * @param {Object} data - AJAX response from the server\n */\nfunction validateBasket(data) {\n if (data.valid.error) {\n if (data.valid.message) {\n var errorHtml = '
'\n + '' + data.valid.message + '
';\n\n $('.cart-error').append(errorHtml);\n } else {\n if ($('.cart').empty()) {\n $('.cart').empty().html(data.emptyCartHTML);\n }\n $('.number-of-items').empty().append(data.resources.numberOfItems);\n $('.minicart-quantity').empty().append(data.numItems);\n $('.minicart-link').attr({\n 'aria-label': data.resources.minicartCountOfItems,\n title: data.resources.minicartCountOfItems\n });\n $('.minicart .popover').empty();\n $('.minicart .popover').removeClass('show');\n }\n\n $('.checkout-btn').addClass('disabled');\n } else {\n $('.checkout-btn').removeClass('disabled');\n }\n}\n\n$('body').on('cart:update', function (e, data) {\n if (data) {\n var basketModel = data.basket || data;\n updateAvailability(basketModel);\n }\n});\n\n$('body').on('click', '.cart-remove-out-of-stock-items-btn', function (e) {\n e.preventDefault();\n var buttonEl = $(this);\n var url = buttonEl.data('action');\n var items = buttonEl.attr('data-items') || '';\n\n $('body').trigger('cart:beforeUpdate');\n\n $.ajax({\n url: url,\n data: { outOfStockItems: items },\n type: 'post',\n context: this,\n dataType: 'json',\n success: function (data) {\n if (data.items.length === 0) {\n $('.cart').remove();\n $('.hosted-box').after(data.emptyCartHTML);\n } else {\n $('.coupons-and-promos').empty().append(data.totals.discountsHtml);\n updateCartTotals(data);\n updateApproachingDiscounts(data.approachingDiscounts);\n updateAvailability(data);\n validateBasket(data);\n\n $('body').trigger('cart:update', data);\n\n var outOfStockItems = items.split(',');\n outOfStockItems.forEach(function (item) {\n $('.cart-item-out-of-stock-message').filter('[data-sku=\"' + item + '\"]').closest('.card.product-info').remove();\n });\n }\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $(this).val(parseInt(preSelectQty, 10));\n }\n }\n });\n});\n\n// Increase product quantity on cart page\n$('body').on('click', '.quantity-form > .button-plus', function () {\n var parentElm = $(this).parents('.quantity-form');\n $(this).addClass('clicked');\n setTimeout(function () {\n $('.clicked').removeClass('clicked');\n }, 100);\n var quantity = parentElm.find('.quantity').val();\n var maxVal = parseInt(parentElm.find('.quantity').attr('max'), 10);\n var parsedQty = parseInt(quantity, 10);\n if (parsedQty < maxVal) {\n parsedQty++;\n parentElm.find('.quantity').val(parsedQty);\n $(this).removeClass('disable');\n $(this).prop('disabled', false);\n }\n});\n// Decrease product quantity on cart page\n$('body').on('click', '.quantity-form > .button-minus', function () {\n var parentElm = $(this).parents('.quantity-form');\n $(this).addClass('clicked');\n setTimeout(function () {\n $('.clicked').removeClass('clicked');\n }, 100);\n var quantity = parentElm.find('.quantity').val();\n var minVal = parseInt(parentElm.find('.quantity').attr('min'), 10);\n var parsedQty = parseInt(quantity, 10);\n if (parsedQty > minVal) {\n parsedQty--;\n parentElm.find('.quantity').val(parsedQty);\n $(this).removeClass('disable');\n $(this).prop('disabled', false);\n }\n});\n\n$('body').on('click', '.quantity-form > .button-plus , .button-minus ', function () {\n var parentElm = $(this).parents('.quantity-form');\n var preSelectQty = parentElm.find('.quantity').data('pre-select-qty');\n var quantity = parentElm.find('.quantity').val();\n var productID = parentElm.find('.quantity').data('pid');\n var url = parentElm.find('.quantity').data('action');\n var uuid = parentElm.find('.quantity').attr('data-uuid');\n var minVal = parentElm.find('.quantity').attr('min');\n var maxVal = parentElm.find('.quantity').attr('max');\n var productCard = $(this).closest('.cart-product-card');\n\n var urlParams = {\n pid: productID,\n quantity: quantity,\n uuid: uuid\n };\n url = appendToUrl(url, urlParams);\n\n parentElm.find('.button-plus').prop('disabled', true);\n parentElm.find('.button-minus').prop('disabled', true);\n parentElm.find('.button-plus').addClass('restricted');\n parentElm.find('.button-minus').addClass('restricted');\n\n $('body').trigger('cart:beforeUpdate');\n\n $.ajax({\n url: url,\n type: 'get',\n context: this,\n dataType: 'json',\n success: function (data) {\n $('.cart-product-items').empty().html(data.cartItemsHTML);\n $('.hosted-cart-alerts').empty().html(data.cartAlertsHTML);\n $('.quantity[data-uuid=\"' + uuid + '\"]').val(quantity);\n $('.coupons-and-promos').empty().append(data.totals.discountsHtml);\n if (data.couponError) {\n $('.promo-code-form .form-control').addClass('is-invalid');\n $('.promo-code-form .form-control').attr('aria-describedby', 'invalidCouponCode');\n $('.coupon-error-message').empty().append(data.couponErrorMessage);\n $('body').trigger('promotion:error', data);\n } else {\n $('.promo-code-form .form-control').removeClass('is-invalid');\n $('.coupon-error-message').empty();\n }\n productCard.find('.add-product-back').attr('data-quantity', quantity);\n updateCartTotals(data);\n updateApproachingDiscounts(data.approachingDiscounts);\n updateAvailability(data);\n validateBasket(data);\n parentElm.find('.quantity').attr('data-pre-select-qty', quantity);\n\n $('body').trigger('cart:update', data);\n parentElm.find('.button-plus').prop('disabled', false);\n parentElm.find('.button-minus').prop('disabled', false);\n parentElm.find('.button-plus').removeClass('restricted');\n parentElm.find('.button-minus').removeClass('restricted');\n if ($(this).parents('.product-info').hasClass('bonus-product-line-item') && $('.cart-page').length) {\n location.reload();\n }\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $(this).val(parseInt(preSelectQty, 10));\n }\n }\n });\n\n if (quantity === minVal) {\n $(this).addClass('disable');\n $(this).prop('disabled', true);\n } else if (parentElm.find('.button-minus').hasClass('disable')) {\n parentElm.find('.button-minus').removeClass('disable');\n parentElm.find('.button-minus').prop('disabled', false);\n }\n if (quantity === maxVal) {\n $(this).addClass('disable');\n $(this).prop('disabled', true);\n } else if (parentElm.find('.button-plus').hasClass('disable')) {\n parentElm.find('.button-plus').removeClass('disable');\n parentElm.find('.button-plus').prop('disabled', false);\n }\n});\n\n$('body').on('change', '.quantity-form > .quantity', function () {\n var parentElm = $(this).parents('.quantity-form');\n var preSelectQty = $(this).attr('data-pre-select-qty');\n var quantity = parentElm.find('.quantity').val();\n var productID = parentElm.find('.quantity').data('pid');\n var url = parentElm.find('.quantity').data('action');\n var uuid = parentElm.find('.quantity').attr('data-uuid');\n var minVal = parseInt($(this).attr('min'), 10);\n var maxVal = parseInt($(this).attr('max'), 10);\n var parsedQty = parseInt(quantity, 10);\n var productCard = $(this).closest('.cart-product-card');\n\n if (minVal > parsedQty) {\n $(this).val(parseInt(preSelectQty, 10));\n return;\n }\n\n if (maxVal <= parsedQty) {\n quantity = maxVal;\n }\n if (parsedQty === minVal) {\n parentElm.find('.button-minus').addClass('disable');\n parentElm.find('.button-minus').prop('disabled', true);\n } else {\n parentElm.find('.button-minus').removeClass('disable');\n parentElm.find('.button-minus').prop('disabled', false);\n }\n if (quantity === maxVal) {\n parentElm.find('.button-plus').addClass('disable');\n parentElm.find('.button-plus').prop('disabled', true);\n } else {\n parentElm.find('.button-plus').removeClass('disable');\n parentElm.find('.button-plus').prop('disabled', false);\n }\n\n if (preSelectQty === quantity) {\n $(this).val(parseInt(preSelectQty, 10));\n return;\n }\n\n var urlParams = {\n pid: productID,\n quantity: quantity,\n uuid: uuid\n };\n url = appendToUrl(url, urlParams);\n\n $('body').trigger('cart:beforeUpdate');\n\n $.ajax({\n url: url,\n type: 'get',\n context: this,\n dataType: 'json',\n success: function (data) {\n $('.cart-product-items').empty().html(data.cartItemsHTML);\n $('.quantity[data-uuid=\"' + uuid + '\"]').val(quantity);\n $('.coupons-and-promos').empty().append(data.totals.discountsHtml);\n if (data.couponError) {\n $('.promo-code-form .form-control').addClass('is-invalid');\n $('.promo-code-form .form-control').attr('aria-describedby', 'invalidCouponCode');\n $('.coupon-error-message').empty().append(data.couponErrorMessage);\n $('body').trigger('promotion:error', data);\n } else {\n $('.promo-code-form .form-control').removeClass('is-invalid');\n $('.coupon-error-message').empty();\n }\n productCard.find('.add-product-back').attr('data-quantity', quantity);\n updateCartTotals(data);\n updateApproachingDiscounts(data.approachingDiscounts);\n updateAvailability(data, uuid);\n validateBasket(data);\n $(this).attr('data-pre-select-qty', quantity);\n\n $('body').trigger('cart:update', data);\n if ($(this).parents('.product-info').hasClass('bonus-product-line-item') && $('.cart-page').length) {\n location.reload();\n }\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n $(this).val(parseInt(preSelectQty, 10));\n }\n }\n });\n});\n\n$('body').on('keypress', '.quantity-form,.shippingPhoneNumber,.consultantPhone', function (e) {\n var txt = String.fromCharCode(e.which);\n if (!txt.match(/[0-9]/)) {\n return false;\n }\n return true;\n});\n\n$('.accordion-title').on('click', function () {\n var $this = $(this);\n\n var showhide = $this.find('.filterText');\n /*eslint no-unused-expressions: [\"error\", { \"allowTernary\": true }]*/\n showhide.text() === showhide.data('text-swap')\n ? showhide.text(showhide.data('text-original'))\n : showhide.text(showhide.data('text-swap'));\n\n $this.find('i').toggleClass('fa-angle-up fa-angle-down');\n});\n\n$('.orderDetailsLink').click(function () {\n $('html, body').animate({\n scrollTop: $('.order-details').offset().top\n }, 500);\n});\n\n$('body').on('click', '.remove-product', function (e) {\n e.preventDefault();\n\n var productID = $(this).data('pid');\n var url = $(this).data('action');\n var gtmData = $(this).data('gtmdata');\n var uuid = $(this).attr('data-uuid');\n var productCard = $(this).closest('.cart-product-card');\n var isOOSItem = $(this).hasClass('product-is-out-of-stock');\n var urlParams = {\n pid: productID,\n uuid: uuid\n };\n\n url = appendToUrl(url, urlParams);\n $('body').trigger('cart:beforeUpdate');\n\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n $('.coupons-and-promos').empty().append(data.basket.totals.discountsHtml);\n $('.hosted-cart-alerts').empty().html(data.basket.cartAlertsHTML);\n if (data.couponError) {\n $('.promo-code-form .form-control').addClass('is-invalid');\n $('.promo-code-form .form-control').attr('aria-describedby', 'invalidCouponCode');\n $('.coupon-error-message').empty().append(data.couponErrorMessage);\n $('body').trigger('promotion:error', data);\n } else {\n $('.promo-code-form .form-control').removeClass('is-invalid');\n $('.coupon-error-message').empty();\n }\n $('.bonus-line-item-row').parent().remove();\n if ($('body').find('.cart-product-card').hasClass('set--removed-in-cart')) {\n $('.product-line-item-revert').addClass('d-none');\n }\n if (data.basket.cartBonusItemsHTML) {\n $('.cart-product-items').last().append(data.basket.cartBonusItemsHTML);\n }\n if (isOOSItem) {\n productCard.remove();\n if (data.basket.emptyCartHTML) {\n $('.cart').empty().html(data.basket.emptyCartHTML);\n }\n } else {\n productCard.removeClass('set--in-cart');\n productCard.addClass('set--removed-in-cart');\n }\n if ($('body').find(productCard).hasClass('set--removed-in-cart')) {\n productCard.find('.product-line-item-revert').removeClass('d-none');\n }\n updateCartTotals(data.basket);\n updateApproachingDiscounts(data.basket.approachingDiscounts);\n $('body').trigger('setShippingMethodSelection', data.basket);\n $('body').trigger('cart:update', data.basket);\n if (data.basket.items.length === 0) {\n $('.checkout-btn').addClass('disabled');\n } else {\n $('.checkout-btn').removeClass('disabled');\n }\n updateAvailability(data.basket);\n },\n error: function (err) {\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n }\n }\n });\n});\n\n$('body').on('click', '.add-product-back', function (e) {\n var addToCartUrl;\n\n $('body').trigger('product:beforeAddToCart', this);\n\n addToCartUrl = $(this).attr('data-url');\n var productCard = $(this).closest('.cart-product-card');\n var addProductBack = $(this);\n var oldUUID = $(this).attr('data-uuid');\n var lineItemTotal = productCard.find('.line-item-price');\n var itemTotalAmount = productCard.find('.item-total-amount');\n var lineItemMain = productCard.find('.product-line-item-main');\n\n var form = {\n pid: $(this).attr('data-pid'),\n quantity: $(this).attr('data-quantity')\n };\n\n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\n if (data.error) {\n $('.cart-product-items').empty().html(data.cartItemsHTML);\n $('.hosted-cart-alerts').empty().html(data.cartAlertsHTML);\n $('.coupons-and-promos').empty().append(data.cart.totals.discountsHtml);\n updateCartTotals(data.cart);\n updateApproachingDiscounts(data.cart.approachingDiscounts);\n updateAvailability(data.cart);\n validateBasket(data.cart);\n } else {\n $('.coupons-and-promos').empty().append(data.cart.totals.discountsHtml);\n $('.hosted-cart-alerts').empty().html(data.cartAlertsHTML);\n productCard.find('.remove-product').attr('data-uuid', data.pliUUID);\n productCard.find('.quantity').attr('data-uuid', data.pliUUID);\n lineItemMain.removeClass('uuid-' + oldUUID).addClass('uuid-' + data.pliUUID);\n lineItemTotal.removeClass('line-item-price-' + oldUUID).addClass('line-item-price-' + data.pliUUID);\n itemTotalAmount.removeClass('item-total-' + oldUUID).addClass('item-total-' + data.pliUUID);\n addProductBack.attr('data-uuid', data.pliUUID);\n $('body').trigger('product:afterAddToCart', data);\n $('.bonus-line-item-row').parent().remove();\n productCard.removeClass('set--removed-in-cart');\n productCard.addClass('set--in-cart');\n if (data.cartBonusItemsHTML) {\n $('.cart-product-items').last().append(data.cartBonusItemsHTML);\n }\n updateCartTotals(data.cart);\n updateApproachingDiscounts(data.cart.approachingDiscounts);\n $('body').trigger('setShippingMethodSelection', data.cart);\n $('body').trigger('cart:update', data.cart);\n $('.promo-code-form .form-control').removeClass('is-invalid');\n $('.coupon-error-message').empty();\n }\n },\n error: function () {\n }\n });\n }\n});\n\n$('.promo-code-form').submit(function (e) {\n e.preventDefault();\n $('.coupon-missing-error').hide();\n $('.coupon-error-message').empty();\n if (!$('.coupon-code-field').val()) {\n $('.promo-code-form .form-control').addClass('is-invalid');\n $('.promo-code-form .form-control').attr('aria-describedby', 'missingCouponCode');\n $('.coupon-missing-error').show();\n return false;\n }\n var $form = $('.promo-code-form');\n $('.promo-code-form .form-control').removeClass('is-invalid');\n $('.coupon-error-message').empty();\n $('body').trigger('promotion:beforeUpdate');\n $.ajax({\n url: $form.attr('action'),\n type: 'GET',\n dataType: 'json',\n data: $form.serialize(),\n success: function (data) {\n if (data.error) {\n $('.promo-code-form .form-control').addClass('is-invalid');\n $('.promo-code-form .form-control').attr('aria-describedby', 'invalidCouponCode');\n $('.coupon-error-message').empty().append(data.errorMessage);\n $('body').trigger('promotion:error', data);\n } else {\n if ($('.cart-product-items').length > 0) {\n $('.cart-product-items').empty().html(data.cartItemsHTML);\n }\n $('.coupons-and-promos').empty().append(data.totals.discountsHtml);\n if ($('.checkout-ordersummary').length > 0) {\n summaryHelpers.updateTotals(data.totals);\n $('.product-details').empty().append(data.orderSummaryItemsHTML);\n } else {\n summaryHelpers.updateTotals(data.totals);\n }\n updateApproachingDiscounts(data.approachingDiscounts);\n validateBasket(data);\n $('body').trigger('promotion:success', data);\n }\n $('.coupon-code-field').val('');\n },\n error: function (err) {\n $('body').trigger('promotion:error', err);\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.errorMessage);\n $.spinner().stop();\n }\n }\n });\n return false;\n});\n\n$('body').on('click', '.remove-coupon', function (e) {\n e.preventDefault();\n\n var couponCode = $(this).data('code');\n var uuid = $(this).data('uuid');\n var action = $('#delete-coupon-confirmation-btn-id').data('action');\n var $deleteConfirmBtn = $('.delete-coupon-confirmation-btn');\n var $productToRemoveSpan = $('.coupon-to-remove');\n\n $deleteConfirmBtn.data('uuid', uuid);\n $deleteConfirmBtn.data('code', couponCode);\n $deleteConfirmBtn.data('action', action);\n\n $productToRemoveSpan.empty().append(couponCode);\n});\n\n$('body').on('click', '.delete-coupon-confirmation-btn', function (e) {\n e.preventDefault();\n\n var url = $(this).data('action');\n var uuid = $(this).data('uuid');\n var couponCode = $(this).data('code');\n var urlParams = {\n code: couponCode,\n uuid: uuid\n };\n\n url = appendToUrl(url, urlParams);\n\n $('body > .modal-backdrop').remove();\n\n $('body').trigger('promotion:beforeUpdate');\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\n $('.coupon-uuid-' + uuid).remove();\n if ($('.cart-product-items').length > 0) {\n $('.cart-product-items').empty().html(data.cartItemsHTML);\n }\n if ($('.checkout-ordersummary').length > 0) {\n summaryHelpers.updateTotals(data.totals);\n $('.product-details').empty().append(data.orderSummaryItemsHTML);\n } else {\n summaryHelpers.updateTotals(data.totals);\n }\n updateApproachingDiscounts(data.approachingDiscounts);\n validateBasket(data);\n $('body').trigger('promotion:success', data);\n },\n error: function (err) {\n $('body').trigger('promotion:error', err);\n if (err.responseJSON.redirectUrl) {\n window.location.href = err.responseJSON.redirectUrl;\n } else {\n createErrorNotification(err.responseJSON.errorMessage);\n }\n }\n });\n});\n\n$('.alert-form-error').on('click', function () {\n $('.error-alert-dialog').addClass('d-none');\n});\n\n$('.hostedproductquantity').on('click', function () {\n $(this).select();\n});\n\n$(document).ready(function () {\n var $basketCreated = $('#basketCreated');\n if ($basketCreated && $basketCreated.val() === 'true') {\n $('body').trigger('product:addProductToEmptyCart');\n }\n});\n\n$(document).ready(function () {\n if ($('#payment-element').length) {\n stripeCheckout.initNewStripePaymentIntent(); // on page load.\n }\n\n // handle page load when shipping data is prepopulated, delay is needed to ensure tagManager is loaded\n if (checkoutUtil.shippingFormComplete()) {\n setTimeout(function () {\n $('body').trigger('checkout:shipping:complete');\n }, TRIGGER_DELAY);\n }\n});\n\nif (window.matchMedia('(max-width: 768px)').matches) {\n $('.productOrderSummary').addClass('show');\n $('.accordion-title').removeClass('collapsed');\n\n $('.accordion-title').on('click', function () {\n var $this = $(this);\n\n var showhide = $this.find('.hideandshow');\n /*eslint no-unused-expressions: [\"error\", { \"allowTernary\": true }]*/\n showhide.text() === showhide.data('text-swap')\n ? showhide.text(showhide.data('text-original'))\n : showhide.text(showhide.data('text-swap'));\n\n $this.find('i').toggleClass('fa-angle-up fa-angle-down');\n });\n}\n\n// Added logic to handle automatic redirection to error page if the session is idle for more than the set time on all hosted checkout pages.\nif (pageReload.reloadPageEnabled()) {\n pageReload.schedulePageReload();\n}\n\ndocument.addEventListener('click', function () {\n // reseting checkout timer in case if user click any event in browser\n if (pageReload.reloadPageEnabled()) {\n pageReload.stopPageRedirect();\n pageReload.schedulePageReload();\n }\n});\n","/* eslint-env es6 */\n/* eslint-disable no-console */\n/* eslint-disable no-alert */\n/* eslint-disable no-param-reassign */\n/* eslint-disable dot-notation */\n/* eslint-disable no-plusplus */\n/* eslint-disable require-jsdoc */\n/* globals Stripe, $ */\n\n'use strict';\nvar enableStripeClick = false;\nvar scrollAnimate = require('base/components/scrollAnimate');\n$('.error-alert-dialog').addClass('d-none');\n\nvar stripeOptions = [];\nvar betas = document.getElementById('stripePaymentMethodsInBeta').value;\nif (betas) {\n stripeOptions.betas = betas.split(',');\n}\n\nvar stripeApiVersion = document.getElementById('stripeApiVersion').value;\nif (stripeApiVersion) {\n stripeOptions.apiVersion = stripeApiVersion;\n}\n\nvar stripe = Stripe(document.getElementById('stripePublicKey').value, stripeOptions);\nvar elements = stripe.elements();\n\nfunction setCustomCardValidationOutcome(result, id) {\n var displayError = document.getElementById(id);\n if (result.error) {\n\n displayError.textContent = result.error.code && document.getElementById(result.error.code).value ? document.getElementById(result.error.code).value : result.error.message;\n } else {\n displayError.textContent = '';\n }\n}\n\nvar cardBrandToPfClass = {\n visa: 'pf-visa',\n mastercard: 'pf-mastercard',\n discover: 'pf-discover',\n diners: 'pf-diners',\n amex: 'pf-american-express', \n jcb: 'pf-jcb',\n unknown: 'pf-credit-card'\n};\n\nfunction setCustomCardBrandIcon(brand) {\n var brandIconElement = document.getElementById('brand-icon');\n var pfClass = 'pf-credit-card';\n if (brand in cardBrandToPfClass) {\n pfClass = cardBrandToPfClass[brand];\n }\n for (var i = brandIconElement.classList.length - 1; i >= 0; i--) {\n brandIconElement.classList.remove(brandIconElement.classList[i]);\n }\n brandIconElement.classList.add('pf');\n brandIconElement.classList.add(pfClass);\n}\n\nvar cardElement = null;\nvar cardNumberElement = null;\nif (document.getElementById('card-element')) {\n cardElement = elements.create('card');\n cardElement.mount('#card-element');\n cardElement.addEventListener('change', function (event) {\n var displayError = document.getElementById('card-errors');\n if (event.error) {\n displayError.textContent = event.error.message;\n } else {\n displayError.textContent = '';\n }\n });\n} else if (document.getElementById('stripe-custom-card-group')) {\n var style = JSON.parse(document.getElementById('stripe-custom-card-group').dataset.elementstyle);\n cardNumberElement = elements.create('cardNumber', {\n style: style,\n placeholder : '4444 8888 2222 6666',\n labels: 'floating',\n });\n cardNumberElement.mount('#card-number-element');\n\n var cardExpiryElement = elements.create('cardExpiry', {\n style: style,\n placeholder : 'DD/MM',\n labels: 'floating'\n });\n cardExpiryElement.mount('#card-expiry-element');\n\n var cardCvcElement = elements.create('cardCvc', {\n style: style,\n placeholder : '123',\n labels: 'floating'\n });\n cardCvcElement.mount('#card-cvc-element');\n\n cardNumberElement.on('change', function (event) {\n // Switch brand logo\n if (event.brand) {\n setCustomCardBrandIcon(event.brand);\n }\n setCustomCardValidationOutcome(event, 'card-errors');\n });\n\n cardCvcElement.on('change', function (event) {\n setCustomCardValidationOutcome(event, 'cvc-errors');\n });\n\n cardExpiryElement.on('change', function (event) {\n setCustomCardValidationOutcome(event, 'expiry-errors');\n });\n}\n\nvar newCardFormContainer = document.getElementById('new-card-form-container');\nvar savedCardsFormContainer = document.getElementById('saved-cards-container');\nvar cardIdInput = document.getElementsByName('stripe_source_id');\nvar cardNumberInput = document.getElementById('stripe_card_number');\nvar cardHolderInput = document.getElementById('stripe_card_holder');\nvar cardTypeInput = document.getElementById('stripe_card_type');\nvar cardTypeInputSFCC = document.getElementById('cardType');\nvar cardBrandInput = document.getElementById('stripe_card_brand');\nvar cardExpMonthInput = document.getElementById('stripe_card_expiration_month');\nvar cardExpYearInput = document.getElementById('stripe_card_expiration_year');\nvar prUsedInput = document.getElementById('stripe_pr_used');\n\nvar prbPlaceholder = document.getElementById('payment-request-button');\n\nvar forceSubmit = false;\nvar prUsed = false;\n\nvar switchToSavedCardsLink = document.getElementById('switch-to-saved-cards');\nif (switchToSavedCardsLink) {\n switchToSavedCardsLink.addEventListener('click', function () {\n newCardFormContainer.style.display = 'none';\n savedCardsFormContainer.style.display = 'block';\n });\n}\n\nvar switchToNewCardLink = document.getElementById('switch-to-add-card');\nif (switchToNewCardLink) {\n switchToNewCardLink.addEventListener('click', function () {\n newCardFormContainer.style.display = 'block';\n savedCardsFormContainer.style.display = 'none';\n });\n}\n\nif (savedCardsFormContainer) {\n newCardFormContainer.style.display = 'none';\n}\n\nfunction isSavedCard() {\n return document.getElementById('saved-cards-container') && (document.getElementById('saved-cards-container').style.display === 'block') && newCardFormContainer && newCardFormContainer.style.display === 'none';\n}\n\nfunction capitalize(text) {\n return text.replace(/\\b\\w/g, function (letter) {\n return letter.toUpperCase();\n });\n}\n\nfunction copySelectedSaveCardDetails() {\n var savedCard = document.querySelector('input[name=saved_card_id]:checked');\n cardIdInput.forEach(function (input) {\n input.value = savedCard.value;\n });\n cardNumberInput.value = savedCard.dataset.cardnumber;\n cardHolderInput.value = savedCard.dataset.cardholder;\n cardTypeInput.value = savedCard.dataset.cardtype;\n cardTypeInputSFCC.value = capitalize(savedCard.dataset.cardtype);\n cardExpMonthInput.value = savedCard.dataset.cardexpmonth;\n cardExpYearInput.value = savedCard.dataset.cardexpyear;\n prUsedInput.value = '';\n}\n\nfunction copyNewCardDetails(paymentMethod) {\n cardIdInput.forEach(function (input) {\n input.value = paymentMethod.id;\n });\n\n if (paymentMethod.card) {\n cardNumberInput.value = '************' + paymentMethod.card.last4;\n cardTypeInput.value = '';\n cardTypeInputSFCC.value = capitalize(paymentMethod.card.brand);\n cardBrandInput.value = paymentMethod.card.brand;\n cardExpMonthInput.value = paymentMethod.card.exp_month;\n cardExpYearInput.value = paymentMethod.card.exp_year;\n }\n cardHolderInput.value = paymentMethod.billing_details && paymentMethod.billing_details.name;\n prUsedInput.value = '';\n}\n\nfunction getOwnerDetails() {\n var stateElement = document.querySelector('.billing-address input[name$=\"_state\"]') || document.querySelector('.billing-address input[name$=\"_stateCode\"]')\n || document.querySelector('input[name$=\"_state\"]') || document.querySelector('input[name$=\"_stateCode\"]');\n\n var ownerNames = (document.querySelector('.billing-address input[name$=\"_firstName\"]') && document.querySelector('.billing-address input[name$=\"_lastName\"]'))\n ? document.querySelector('.billing-address input[name$=\"_firstName\"]').value + ' ' + document.querySelector('.billing-address input[name$=\"_lastName\"]').value\n : document.querySelector('input[name$=\"_firstName\"]').value + ' ' + document.querySelector('input[name$=\"_lastName\"]').value;\n\n var addrLine1 = document.querySelector('.billing-address input[name$=\"_address1\"]')\n ? document.querySelector('.billing-address input[name$=\"_address1\"]').value : document.querySelector('input[name$=\"_address1\"]').value;\n\n var addrLine2 = document.querySelector('.billing-address input[name$=\"_address2\"]')\n ? document.querySelector('.billing-address input[name$=\"_address2\"]').value : document.querySelector('input[name$=\"_address2\"]').value;\n\n var addrCity = document.querySelector('.billing-address input[name$=\"_city\"]')\n ? document.querySelector('.billing-address input[name$=\"_city\"]').value : document.querySelector('input[name$=\"_city\"]').value;\n\n var addrPostalCode = document.querySelector('.billing-address input[name$=\"_postalCode\"]')\n ? document.querySelector('.billing-address input[name$=\"_postalCode\"]').value : document.querySelector('input[name$=\"_postalCode\"]').value;\n\n var addrCountry = document.querySelector('.billing-address input[name$=\"_country\"]')\n ? document.querySelector('.billing-address input[name$=\"_country\"]').value : document.querySelector('input[name$=\"_country\"]').value;\n\n var ownerEmail = '';\n if ($('.customer-summary-email').length && $('.customer-summary-email').text()) {\n ownerEmail = $('.customer-summary-email').text();\n } else {\n ownerEmail = document.querySelector('#dwfrm_billing input[name$=\"_email\"]')\n ? document.querySelector('#dwfrm_billing input[name$=\"_email\"]').value\n : document.querySelector('input[name$=\"_email\"]').value;\n }\n\n // SFRA 6 issue with email not presented on checkout\n if (!ownerEmail || ownerEmail === 'null') {\n $.ajax({\n url: document.getElementById('getCustomerEmailURL').value,\n method: 'GET',\n dataType: 'json',\n async: false\n }).done(function (json) {\n ownerEmail = json.email;\n $('.customer-summary-email').text(json.email);\n });\n }\n\n var ownerPhone = document.querySelector('#dwfrm_billing input[name$=\"_phone\"]')\n ? document.querySelector('#dwfrm_billing input[name$=\"_phone\"]').value : document.querySelector('input[name$=\"_phone\"]').value;\n\n return {\n name: ownerNames,\n address: {\n line1: addrLine1,\n line2: addrLine2,\n city: addrCity,\n postal_code: addrPostalCode,\n country: addrCountry,\n state: stateElement ? stateElement.value : ''\n },\n email: ownerEmail,\n phone: ownerPhone\n };\n}\n\nfunction populateBillingData(pr) {\n var form = document.getElementById('dwfrm_billing');\n\n var payerName = pr.payerName;\n if (payerName) {\n var payerNameSplit = payerName.split(' ');\n\n if (payerNameSplit.length > 1) {\n var firstName = payerNameSplit[0];\n var lastName = payerNameSplit[1];\n\n form.querySelector('input[name$=\"_firstName\"]').value = firstName;\n form.querySelector('input[name$=\"_lastName\"]').value = lastName;\n } else {\n form.querySelector('input[name$=\"_firstName\"]').value = payerName;\n form.querySelector('input[name$=\"_lastName\"]').value = payerName;\n }\n }\n\n form.querySelector('input[name$=\"_email\"]').value = pr.payerEmail;\n form.querySelector('input[name$=\"_phone\"]').value = pr.payerPhone;\n\n var selectCountryElement = form.querySelector('select[name$=\"_country\"]');\n var prCountry = pr.paymentMethod.billing_details.address.country.toLowerCase();\n var prCountryExists = ($('#' + selectCountryElement.id + ' option[value=' + prCountry + ']').length > 0);\n\n if (prCountryExists) {\n selectCountryElement.value = prCountry;\n }\n\n form.querySelector('input[name$=\"_city\"]').value = pr.paymentMethod.billing_details.address.city;\n form.querySelector('input[name$=\"_postalCode\"]').value = pr.paymentMethod.billing_details.address.postal_code;\n form.querySelector('input[name$=\"_address1\"]').value = pr.paymentMethod.billing_details.address.line1;\n form.querySelector('input[name$=\"_address2\"]').value = pr.paymentMethod.billing_details.address.line2;\n\n var stateElement = form.querySelector('select[name$=\"_stateCode\"]') || form.querySelector('input[name$=\"_stateCode\"]');\n stateElement.value = pr.paymentMethod.billing_details.address.state;\n}\n\nfunction updateBillingAddressAjax(billingAddress) {\n var url = $('#updateBillingAddress').val();\n $.ajax({\n type: 'post',\n url: url,\n data: JSON.stringify(billingAddress),\n contentType: 'application/json; charset=utf-8',\n traditional: true,\n success: function (data) {\n if (data.success) {\n console.log('User billing address updated successfully.');\n } else {\n console.log('billing address update failed.');\n }\n }\n });\n}\n\nfunction updateUserProfileBillingAddress() {\n if ($('#billingAddressSelector').length) {\n var selectedBillingAddress = $('#billingAddressSelector').find(':selected');\n if (selectedBillingAddress.hasClass('isBillingAddress')) {\n var billingAddress = {};\n billingAddress.addressId = selectedBillingAddress.val();\n billingAddress.firstName = $('#billingFirstName').val();\n billingAddress.lastName = $('#billingLastName').val();\n billingAddress.address1 = $('#billingAddressOne').val();\n billingAddress.address2 = $('#billingAddressTwo').val();\n billingAddress.city = $('#billingAddressCity').val();\n billingAddress.states = {};\n billingAddress.states.stateCode = $('#billingState').val();\n billingAddress.postalCode = $('#billingZipCode').val();\n billingAddress.countryCode = $('#billingCountry').val();\n billingAddress.phone = $('#phoneNumber').val();\n\n updateBillingAddressAjax(billingAddress);\n }\n }\n}\n\nfunction paymentSelections() {\n // skip event handler for Stripe Payment Elements\n // eslint-disable-next-line\n\n if ($('#submit-payment .' + $('.tab-pane.active').attr('id') + ' .payment-form-fields input.form-control').val() == 'STRIPE_PAYMENT_ELEMENT') {\n window.localStorage.setItem('stripe_payment_method', 'STRIPE_PAYMENT_ELEMENT');\n return;\n }\n\n if ($('#submit-payment .' + $('.tab-pane.active').attr('id') + ' .payment-form-fields input.form-control').val() === 'CREDIT_CARD') {\n window.localStorage.setItem('stripe_payment_method', 'CREDIT_CARD');\n } else if ($('#submit-payment .' + $('.tab-pane.active').attr('id') + ' .payment-form-fields input.form-control').val() === 'STRIPE_PAYMENT_REQUEST_BTN') {\n window.localStorage.setItem('stripe_payment_method', 'STRIPE_PAYMENT_REQUEST_BTN');\n } else {\n window.localStorage.setItem('stripe_payment_method', '');\n return;\n }\n\n var activeTabId = $('.tab-pane.active').attr('id');\n var paymentInfoSelector = '#submit-payment .' + activeTabId + ' .payment-form-fields input.form-control';\n var selectedPaymentMethod = $(paymentInfoSelector).val();\n\n window.localStorage.setItem('stripe_payment_method', selectedPaymentMethod);\n\n switch (selectedPaymentMethod) {\n case 'CREDIT_CARD':\n if (prUsed) {\n console.log('submit prUsed');\n } else if (isSavedCard()) {\n copySelectedSaveCardDetails();\n } else {\n var owner = getOwnerDetails();\n var stripeCardEl = (!cardElement) ? cardNumberElement : cardElement;\n stripe.createPaymentMethod('card', stripeCardEl, {\n billing_details: {\n name: owner.name,\n address: owner.address,\n email: owner.email,\n phone: owner.phone\n }\n }).then(function (result) {\n if (result.error) {\n $('.form-error-para').text(result.error.message);\n $('.error-alert-dialog').removeClass('d-none');\n scrollAnimate($('.error-alert-dialog').first());\n $.spinner().stop();\n } else {\n copyNewCardDetails(result.paymentMethod);\n var $paymentForm = $('#submit-payment').closest('form');\n submitStripePayment($paymentForm);\n }\n });\n }\n break;\n default:\n break;\n }\n};\n\n\n\nfunction initPRB() {\n var stripeOrderAmountInput = document.getElementById('stripe_order_amount');\n var stripeOrderCurrencyInput = document.getElementById('stripe_order_currency');\n var amountToPay = parseFloat(stripeOrderAmountInput.value);\n var currencyCode = stripeOrderCurrencyInput.value && stripeOrderCurrencyInput.value.toLowerCase();\n\n var paymentRequest = stripe.paymentRequest({\n country: document.getElementById('stripeAccountCountry').value,\n currency: currencyCode,\n total: {\n label: 'Order Total',\n amount: amountToPay\n },\n requestPayerName: true,\n requestPayerEmail: true,\n requestPayerPhone: true\n });\n\n var prButton = elements.create('paymentRequestButton', {\n paymentRequest: paymentRequest,\n style: {\n paymentRequestButton: JSON.parse(document.getElementById('stripePaymentButtonStyle').value)\n }\n });\n\n // Check the availability of the Payment Request API first.\n paymentRequest.canMakePayment().then(function (result) {\n if (result) {\n prButton.mount('#payment-request-button');\n } else {\n document.getElementById('payment-request-button').style.display = 'none';\n }\n });\n\n paymentRequest.on('paymentmethod', function (ev) {\n try {\n prUsed = true;\n prUsedInput.value = 'true';\n\n populateBillingData(ev);\n copyNewCardDetails(ev.paymentMethod);\n\n $('li.nav-item[data-method-id=\"CREDIT_CARD\"] a').click();\n $('.submit-payment').click();\n\n ev.complete('success');\n } catch (e) {\n prUsed = false;\n prUsedInput.value = '';\n\n ev.complete('fail');\n }\n });\n\n // Update request button totals - should be done on 'click' event\n prButton.on('click', function () {\n var stripeInputOrderAmount = document.getElementById('stripe_order_amount');\n var amount = parseFloat(stripeInputOrderAmount.value);\n\n paymentRequest.update({\n total: {\n label: 'Order Total',\n amount: amount\n }\n });\n });\n}\n\nif (prbPlaceholder) {\n initPRB();\n}\n\n// fix issue with SFRA select payment method when edit payment from Order confirmation\nvar ready = (callback) => {\n if (document.readyState !== 'loading') {\n callback();\n } else {\n document.addEventListener('DOMContentLoaded', callback);\n }\n};\n\nfunction handleStripePaymentElementSubmitOrder() {\n window.stripePaymentElements.submit().then(function (result) {\n if (result.error) {\n $('.form-error-para').text($('#payment-element').data('carderror'));\n $('.error-alert-dialog').removeClass('d-none');\n scrollAnimate($('.error-alert-dialog').first());\n forceSubmit =false;\n enableStripeClick = false;\n $.spinner().stop();\n return;\n }\n $.ajax({\n url: document.getElementById('paymentElementSubmitOrderURL').value,\n method: 'POST',\n data: {\n csrf_token: $('[name=\"csrf_token\"]').val()\n },\n success: function (data) {\n // placeOrder\n if (data.error) {\n if (data.errorMessage) {\n $('.form-error-para').html(data.errorMessage);\n $('.error-alert-dialog').removeClass('d-none');\n scrollAnimate($('.error-alert-dialog').first()); \n }\n $.spinner().stop();\n forceSubmit =false;\n enableStripeClick = false;\n } else {\n window.localStorage.setItem('stripe_pe_continueurl', data.continueUrl);\n window.localStorage.setItem('stripe_pe_orderid', data.orderID);\n window.localStorage.setItem('stripe_pe_ordertoken', data.orderToken);\n\n var stripeReturnURL = document.getElementById('stripe_return_url').value;\n var ownerData = getOwnerDetails();\n stripe.confirmPayment({\n elements: window.stripePaymentElements,\n clientSecret: data.clientSecret,\n confirmParams: {\n // Make sure to change this to your payment completion page\n return_url: stripeReturnURL,\n payment_method_data: {\n billing_details: {\n address: {\n postal_code: ownerData.address ? ownerData.address.postal_code : '',\n country: ownerData.address ? ownerData.address.country : 'MX',\n }\n }\n }\n }\n }).then(function (result) {\n if (result.error) {\n $.ajax({\n url: document.getElementById('logStripeErrorMessageURL').value,\n method: 'POST',\n dataType: 'json',\n data: {\n csrf_token: $('[name=\"csrf_token\"]').val(),\n msg: 'UPE stripe.confirmPayment Error ' + JSON.stringify(result.error)\n }\n }).done(function () {\n $.ajax({\n url: document.getElementById('stripeFailOrderURL').value,\n method: 'POST',\n dataType: 'json',\n data: {\n csrf_token: $('[name=\"csrf_token\"]').val()\n },\n success: function (result) {\n if (result.success === false) {\n window.location.replace(result.redirectUrl);\n } else {\n $('.form-error-para').text($('#payment-element').data('errormsg'));\n $('.form-error-payment-text').removeClass('d-none'); \n $('.error-alert-dialog').removeClass('d-none');\n $('.form-error-text').addClass('d-none');\n scrollAnimate($('.error-alert-dialog').first()); \n forceSubmit = false; \n enableStripeClick = false;\n $.spinner().stop();\n }\n }\n });\n });\n }\n });\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n}\n\nfunction initStripePaymentElement() {\n var ownerEmail = '';\n if ($('.customer-summary-email').length && $('.customer-summary-email').text()) {\n ownerEmail = $('.customer-summary-email').text();\n } else {\n ownerEmail = document.querySelector('#dwfrm_billing input[name$=\"_email\"]')\n ? document.querySelector('#dwfrm_billing input[name$=\"_email\"]').value\n : document.querySelector('input[name$=\"_email\"]').value;\n }\n\n // SFRA 6 issue with email not presented on checkout \n if (window.paymentElementInstance) {\n window.paymentElementInstance.destroy();\n }\n if (!ownerEmail || ownerEmail == 'null'){\n window.paymentElementInstance = window.stripePaymentElements.create('payment', {\n fields: {\n billingDetails: {\n address: {\n country: 'never',\n postalCode: 'never'\n }\n }\n }\n });\n window.paymentElementInstance.mount('#payment-element'); \n window.paymentElementInstance.on('change', function(event) {\n if (event.complete) {\n $('body').trigger('checkout:payment:complete'); \n }\n });\n } else {\n var ownerdetails = getOwnerDetails();\n window.paymentElementInstance = window.stripePaymentElements.create('payment', {\n defaultValues: {\n billingDetails: {\n email: ownerdetails.email,\n name: ownerdetails.name,\n phone: ownerdetails.phone,\n address: {\n postal_code: ownerdetails.address ? ownerdetails.address.postal_code : document.querySelector('.billing-address input[name$=\"_postalCode\"]').value,\n country: ownerdetails.address ? ownerdetails.address.country : 'MX'\n }\n }\n },\n fields: {\n billingDetails: {\n address: {\n country: 'never',\n postalCode: 'never'\n }\n }\n }\n });\n window.paymentElementInstance.mount('#payment-element'); \n window.paymentElementInstance.on('change', function(event) {\n if (event.complete) {\n $('body').trigger('checkout:payment:complete'); \n }\n }); \n }\n $.spinner().stop();\n}\n\nfunction initNewStripePaymentIntent() {\n var stripeOrderAmountInput = document.getElementById('stripe_order_amount');\n if (!stripeOrderAmountInput || !stripeOrderAmountInput.value) {\n return;\n }\n\n var stripeOrderCurrencyInput = document.getElementById('stripe_order_currency');\n if (!stripeOrderCurrencyInput || !stripeOrderCurrencyInput.value) {\n return;\n }\n\n const stripePaymentElementStyleObject = JSON.parse(document.getElementById('stripePaymentElementStyle').value);\n const appearance = stripePaymentElementStyleObject;\n\n const options = {\n mode: 'payment',\n amount: parseInt(stripeOrderAmountInput.value, 10),\n currency: stripeOrderCurrencyInput.value,\n appearance: appearance,\n loader: 'always',\n locale: 'es-MX',\n capture_method: document.getElementById('stripeCaptureMethod').value,\n };\n\n var allowedCards = document.getElementById('allowedCardBrands').value;\n var disallowedCards = document.getElementById('disallowedCardBrands').value;\n if (allowedCards) {\n options.allowedCardBrands = allowedCards.split(',');\n } else if (disallowedCards) {\n options.disallowedCardBrands = disallowedCards.split(',');\n }\n\n if (document.getElementById('isStripePaymentElementsSavePaymentsEnabled').value === 'true') {\n options.setup_future_usage = 'off_session';\n }\n\n window.stripePaymentElements = stripe.elements(options);\n\n initStripePaymentElement();\n}\n\n// Update stored order amount on shipping method change\nfunction updateGetStripeOrderItems (clickHostedStripe) {\n $.ajax({\n url: document.getElementById('getStripeOrderItemsURL').value,\n method: 'GET',\n dataType: 'json'\n }).done(function (json) {\n var stripeOrderAmountInput = document.getElementById('stripe_order_amount');\n\n // check if order amount has been changed\n // eslint-disable-next-line\n if (stripeOrderAmountInput && stripeOrderAmountInput.value != json.amount) {\n if ($('#payment-element').length) {\n initNewStripePaymentIntent();\n }\n }\n\n if (stripeOrderAmountInput) {\n stripeOrderAmountInput.value = json.amount;\n }\n\n var stripeOrderItems = document.getElementById('stripe_order_items');\n if (stripeOrderItems) {\n stripeOrderItems.value = json.orderItems;\n }\n\n var stripeOrderCurrencyInput = document.getElementById('stripe_order_currency');\n if (stripeOrderCurrencyInput) {\n stripeOrderCurrencyInput.value = json.currency;\n }\n\n var stripeOrderPurchaseCoutry = document.getElementById('stripe_purchase_country');\n if (stripeOrderPurchaseCoutry) {\n stripeOrderPurchaseCoutry.value = json.purchase_country;\n }\n\n var stripeOrderShippingInput = document.getElementById('stripe_order_shipping');\n if (stripeOrderShippingInput) {\n stripeOrderShippingInput.value = json.order_shipping;\n }\n\n var stripeShippingFirstName = document.getElementById('stripe_shipping_first_name');\n if (stripeShippingFirstName) {\n stripeShippingFirstName.value = json.shipping_first_name;\n }\n\n var stripeShippingLastName = document.getElementById('stripe_shipping_last_name');\n if (stripeShippingLastName) {\n stripeShippingLastName.value = json.shipping_last_name;\n }\n if ($('.submit-payment-hostedStripe').length && clickHostedStripe) {\n $('.submit-payment-hostedStripe').click();\n }\n\n });\n};\n\nready(() => {\n // eslint-disable-next-line no-unused-vars\n\n if (document.querySelector('#dwfrm_billing input[name$=\"_email\"]')) {\n document.querySelector('#dwfrm_billing input[name$=\"_email\"]').addEventListener('change', initStripePaymentElement);\n }\n\n if (document.querySelector('#dwfrm_billing input[name$=\"_firstName\"]')) {\n document.querySelector('#dwfrm_billing input[name$=\"_firstName\"]').addEventListener('change', initStripePaymentElement);\n }\n\n if (document.querySelector('#dwfrm_billing input[name$=\"_lastName\"]')) {\n document.querySelector('#dwfrm_billing input[name$=\"_lastName\"]').addEventListener('change', initStripePaymentElement);\n }\n\n if (document.querySelector('#dwfrm_billing input[name$=\"_phone\"]')) {\n document.querySelector('#dwfrm_billing input[name$=\"_phone\"]').addEventListener('change', initStripePaymentElement);\n }\n\n if (document.querySelector('#dwfrm_billing input[name$=\"_postalCode\"]')) {\n document.querySelector('#dwfrm_billing input[name$=\"_postalCode\"]').addEventListener('change', initStripePaymentElement);\n }\n\n if (document.querySelector('#dwfrm_billing input[name$=\"_country\"]')) {\n document.querySelector('#dwfrm_billing input[name$=\"_country\"]').addEventListener('change', initStripePaymentElement);\n }\n});\n\nfunction redirectToCheckoutSummaryPage() {\n var continueUrl = window.localStorage.getItem('stripe_pe_continueurl');\n var orderId = window.localStorage.getItem('stripe_pe_orderid');\n var orderToken = window.localStorage.getItem('stripe_pe_ordertoken');\n\n if (continueUrl && orderId && orderToken) {\n var form = document.createElement('form');\n form.style.display = 'none';\n\n document.body.appendChild(form);\n\n form.method = 'POST';\n form.action = continueUrl;\n\n var orderIdInput = document.createElement('input');\n orderIdInput.name = 'orderID';\n orderIdInput.value = orderId;\n form.appendChild(orderIdInput);\n\n var orderTokenInput = document.createElement('input');\n orderTokenInput.name = 'orderToken';\n orderTokenInput.value = orderToken;\n form.appendChild(orderTokenInput);\n\n form.submit();\n }\n}\n\nfunction handleStripeRequiresActionResponse(response, is3dpage) {\n\tif (response.error) {\n $.ajax({\n url: document.getElementById('stripeFailOrderURL').value,\n method: 'POST',\n dataType: 'json',\n data: {\n csrf_token: $('[name=\"csrf_token\"]').val()\n }\n });\n if (response.error.message && !is3dpage) {\n $('.form-error-para').text(response.error.message);\n $('.error-alert-dialog').removeClass('d-none');\n scrollAnimate($('.error-alert-dialog').first());\n $.spinner().stop(); \n } else {\n window.localStorage.setItem('stripe_billingError', response.error.message);\n window.location.replace(document.getElementById('billingPageUrl').value);\n }\n } else if (response.requires_action) {\n // Use Stripe.js to handle required card action\n stripe.handleCardAction(response.payment_intent_client_secret).then(function (result) {\n if (result.error) {\n $.ajax({\n url: document.getElementById('stripeFailOrderURL').value,\n method: 'POST',\n dataType: 'json',\n data: {\n csrf_token: $('[name=\"csrf_token\"]').val()\n }\n });\n $('.form-error-para').text(result.error.message);\n $('.error-alert-dialog').removeClass('d-none');\n scrollAnimate($('.error-alert-dialog').first());\n if (response.error.message && !is3dpage) {\n $.spinner().stop();\n }\n // window.location.replace(document.getElementById('billingPageUrl').value);\n } else {\n // The card action has been handled\n // The PaymentIntent can be confirmed again on the server \n on3DSComplete();\n }\n });\n } else {\n forceSubmit = false;\n redirectToCheckoutSummaryPage();\n }\n}\n\n\n// eslint-disable-next-line\nfunction handleStripeCardSubmitOrder() {\n $.ajax({\n url: document.getElementById('cardPaymentSubmitOrderURL').value,\n method: 'POST',\n data: {\n csrf_token: $('[name=\"csrf_token\"]').val()\n },\n success: function (data) {\n if (data.error) {\n if (data.errorMessage) {\n $('.form-error-para').text(data.errorMessage);\n $('.error-alert-dialog').removeClass('d-none');\n scrollAnimate($('.error-alert-dialog').first());\n forceSubmit = false;\n $.spinner().stop();\n } else {\n // window.location.replace(document.getElementById('billingPageUrl').value);\n }\n } else {\n window.localStorage.setItem('stripe_pe_continueurl', data.continueUrl);\n window.localStorage.setItem('stripe_pe_orderid', data.orderID);\n window.localStorage.setItem('stripe_pe_ordertoken', data.orderToken);\n\n if (data.requires_action) {\n handleStripeRequiresActionResponse(data, false);\n } else {\n redirectToCheckoutSummaryPage();\n }\n }\n },\n error: function () {\n // enable the placeOrder button here\n }\n });\n}\n\n// eslint-disable-next-line consistent-return\nfunction submitpaymenthostedStripe() {\n if (window.localStorage.getItem('stripe_payment_method') !== 'STRIPE_PAYMENT_ELEMENT' && window.localStorage.getItem('stripe_payment_method') !== 'CREDIT_CARD' && window.localStorage.getItem('stripe_payment_method') !== 'STRIPE_PAYMENT_REQUEST_BTN') {\n return true;\n }\n // eslint-disable-next-line no-empty\n if (window.localStorage.getItem('stripe_payment_method') === 'STRIPE_PAYMENT_ELEMENT') {\n if (forceSubmit) return false;\n\n forceSubmit = true;\n if (enableStripeClick !== true) {\n enableStripeClick = true;\n handleStripePaymentElementSubmitOrder();\n }\n return false;\n }\n\n if (forceSubmit) return true;\n if (enableStripeClick !== true) {\n enableStripeClick = true;\n handleStripeCardSubmitOrder();\n }\n}\n\n/**\n * Submit the payment form in submit order flow\n * @param {Object} $form paymentform\n * @param {Function} errorHandler paymentform\n */\nfunction submitStripePayment($form, errorHandler) {\n var url = $('#submit-payment').attr('action');\n var formData = ($form).serialize();\n $.ajax({\n url: url,\n method: 'POST',\n dataType: 'json',\n data: formData,\n success: function (data) {\n if (data.error) {\n if (data.cartError) {\n if (data.errorMessage) {\n $('.form-error-para').text(data.errorMessage);\n $('.error-alert-dialog').removeClass('d-none');\n scrollAnimate($('.error-alert-dialog').first());\n $.spinner().stop();\n } else if (data.redirectUrl) {\n window.location.href = data.redirectUrl;\n }\n }\n if (data.serverErrors && data.serverErrors.length) {\n if (errorHandler) {\n errorHandler(data.serverErrors[0]);\n }\n }\n $.spinner().stop();\n } else if ($('.submit-payment-hostedStripe').length === 1) {\n updateGetStripeOrderItems(true);\n }\n },\n error: function () {\n if (errorHandler) {\n errorHandler();\n }\n $.spinner().stop();\n }\n });\n}\n\nwindow.addEventListener('message', function(ev) { \n if (ev.data === '3DS-authentication-complete') {\n on3DSComplete();\n }\n if (ev.data === 'update_and_initNewStripePaymentIntent') {\n initNewStripePaymentIntent();\n }\n}, false);\n\nwindow.onload = function(e){ \n var billingError = window.localStorage.getItem('stripe_billingError');\n if (billingError && billingError !== undefined) {\n $('.form-error-para').text(billingError);\n $('.error-alert-dialog').removeClass('d-none');\n scrollAnimate($('.error-alert-dialog').first());\n window.localStorage.removeItem('stripe_billingError');\n }\n}\n\n/**\n * Submit the payment form in submit 3DS order flow\n * @param {*} $form paymentform\n */\nfunction on3DSComplete() {\n $.ajax({\n url: document.getElementById('cardPaymentHandleRequiresActionURL').value,\n method: 'POST',\n dataType: 'json',\n data: {\n csrf_token: $('[name=\"csrf_token\"]').val()\n }\n }).done(function (json) {\n if (json.error && json.error.message) {\n window.localStorage.setItem('stripe_billingError', json.error.message);\n window.location.replace(document.getElementById('billingPageUrl').value); \n }\n handleStripeRequiresActionResponse(json, true);\n }).fail(function (msg) {\n $.ajax({\n url: document.getElementById('stripeFailOrderURL').value,\n method: 'POST',\n dataType: 'json',\n data: {\n csrf_token: $('[name=\"csrf_token\"]').val()\n }\n });\n if (msg.responseJSON.redirectUrl) {\n window.location.href = msg.responseJSON.redirectUrl;\n }\n });\n}\n\nmodule.exports = {\n initNewStripePaymentIntent: initNewStripePaymentIntent,\n paymentSelections: paymentSelections,\n submitStripePayment: submitStripePayment,\n updateGetStripeOrderItems: updateGetStripeOrderItems,\n submitpaymenthostedStripe: submitpaymenthostedStripe\n};\n","'use strict';\nvar $ = window.$;\n/**\n * Boolean function to check if shipping form is complete\n * @returns {boolean} true or false\n */\nfunction shippingFormComplete() {\n var formComplete = !!$('.shippingFirstName').val() &&\n !!$('.shippingLastName').val() &&\n !!$('.shippingZipCode').val() &&\n !!$('.shippingAddressState').val() &&\n !!$('.shippingAddressCity').val() &&\n !!$('.shippingAddressOne').val() &&\n !!$('.shippingAddressDistrict').attr('data-selected-district') &&\n !!($('.shippingEmail').val() || $('.customerEmail').val()) &&\n !!$('.shippingPhoneNumber').val();\n return formComplete;\n}\n\n\nvar checkoutUtil = {\n shippingFormComplete: shippingFormComplete\n};\n\nmodule.exports = checkoutUtil;\n","var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nvar NumeralFormatter = function (numeralDecimalMark,\n numeralIntegerScale,\n numeralDecimalScale,\n numeralThousandsGroupStyle,\n numeralPositiveOnly,\n stripLeadingZeroes,\n prefix,\n signBeforePrefix,\n tailPrefix,\n delimiter) {\n var owner = this;\n\n owner.numeralDecimalMark = numeralDecimalMark || '.';\n owner.numeralIntegerScale = numeralIntegerScale > 0 ? numeralIntegerScale : 0;\n owner.numeralDecimalScale = numeralDecimalScale >= 0 ? numeralDecimalScale : 2;\n owner.numeralThousandsGroupStyle = numeralThousandsGroupStyle || NumeralFormatter.groupStyle.thousand;\n owner.numeralPositiveOnly = !!numeralPositiveOnly;\n owner.stripLeadingZeroes = stripLeadingZeroes !== false;\n owner.prefix = (prefix || prefix === '') ? prefix : '';\n owner.signBeforePrefix = !!signBeforePrefix;\n owner.tailPrefix = !!tailPrefix;\n owner.delimiter = (delimiter || delimiter === '') ? delimiter : ',';\n owner.delimiterRE = delimiter ? new RegExp('\\\\' + delimiter, 'g') : '';\n};\n\nNumeralFormatter.groupStyle = {\n thousand: 'thousand',\n lakh: 'lakh',\n wan: 'wan',\n none: 'none' \n};\n\nNumeralFormatter.prototype = {\n getRawValue: function (value) {\n return value.replace(this.delimiterRE, '').replace(this.numeralDecimalMark, '.');\n },\n\n format: function (value) {\n var owner = this, parts, partSign, partSignAndPrefix, partInteger, partDecimal = '';\n\n // strip alphabet letters\n value = value.replace(/[A-Za-z]/g, '')\n // replace the first decimal mark with reserved placeholder\n .replace(owner.numeralDecimalMark, 'M')\n\n // strip non numeric letters except minus and \"M\"\n // this is to ensure prefix has been stripped\n .replace(/[^\\dM-]/g, '')\n\n // replace the leading minus with reserved placeholder\n .replace(/^\\-/, 'N')\n\n // strip the other minus sign (if present)\n .replace(/\\-/g, '')\n\n // replace the minus sign (if present)\n .replace('N', owner.numeralPositiveOnly ? '' : '-')\n\n // replace decimal mark\n .replace('M', owner.numeralDecimalMark);\n\n // strip any leading zeros\n if (owner.stripLeadingZeroes) {\n value = value.replace(/^(-)?0+(?=\\d)/, '$1');\n }\n\n partSign = value.slice(0, 1) === '-' ? '-' : '';\n if (typeof owner.prefix != 'undefined') {\n if (owner.signBeforePrefix) {\n partSignAndPrefix = partSign + owner.prefix;\n } else {\n partSignAndPrefix = owner.prefix + partSign;\n }\n } else {\n partSignAndPrefix = partSign;\n }\n \n partInteger = value;\n\n if (value.indexOf(owner.numeralDecimalMark) >= 0) {\n parts = value.split(owner.numeralDecimalMark);\n partInteger = parts[0];\n partDecimal = owner.numeralDecimalMark + parts[1].slice(0, owner.numeralDecimalScale);\n }\n\n if(partSign === '-') {\n partInteger = partInteger.slice(1);\n }\n\n if (owner.numeralIntegerScale > 0) {\n partInteger = partInteger.slice(0, owner.numeralIntegerScale);\n }\n\n switch (owner.numeralThousandsGroupStyle) {\n case NumeralFormatter.groupStyle.lakh:\n partInteger = partInteger.replace(/(\\d)(?=(\\d\\d)+\\d$)/g, '$1' + owner.delimiter);\n\n break;\n\n case NumeralFormatter.groupStyle.wan:\n partInteger = partInteger.replace(/(\\d)(?=(\\d{4})+$)/g, '$1' + owner.delimiter);\n\n break;\n\n case NumeralFormatter.groupStyle.thousand:\n partInteger = partInteger.replace(/(\\d)(?=(\\d{3})+$)/g, '$1' + owner.delimiter);\n\n break;\n }\n\n if (owner.tailPrefix) {\n return partSign + partInteger.toString() + (owner.numeralDecimalScale > 0 ? partDecimal.toString() : '') + owner.prefix;\n }\n\n return partSignAndPrefix + partInteger.toString() + (owner.numeralDecimalScale > 0 ? partDecimal.toString() : '');\n }\n};\n\nvar NumeralFormatter_1 = NumeralFormatter;\n\nvar DateFormatter = function (datePattern, dateMin, dateMax) {\n var owner = this;\n\n owner.date = [];\n owner.blocks = [];\n owner.datePattern = datePattern;\n owner.dateMin = dateMin\n .split('-')\n .reverse()\n .map(function(x) {\n return parseInt(x, 10);\n });\n if (owner.dateMin.length === 2) owner.dateMin.unshift(0);\n\n owner.dateMax = dateMax\n .split('-')\n .reverse()\n .map(function(x) {\n return parseInt(x, 10);\n });\n if (owner.dateMax.length === 2) owner.dateMax.unshift(0);\n \n owner.initBlocks();\n};\n\nDateFormatter.prototype = {\n initBlocks: function () {\n var owner = this;\n owner.datePattern.forEach(function (value) {\n if (value === 'Y') {\n owner.blocks.push(4);\n } else {\n owner.blocks.push(2);\n }\n });\n },\n\n getISOFormatDate: function () {\n var owner = this,\n date = owner.date;\n\n return date[2] ? (\n date[2] + '-' + owner.addLeadingZero(date[1]) + '-' + owner.addLeadingZero(date[0])\n ) : '';\n },\n\n getBlocks: function () {\n return this.blocks;\n },\n\n getValidatedDate: function (value) {\n var owner = this, result = '';\n\n value = value.replace(/[^\\d]/g, '');\n\n owner.blocks.forEach(function (length, index) {\n if (value.length > 0) {\n var sub = value.slice(0, length),\n sub0 = sub.slice(0, 1),\n rest = value.slice(length);\n\n switch (owner.datePattern[index]) {\n case 'd':\n if (sub === '00') {\n sub = '01';\n } else if (parseInt(sub0, 10) > 3) {\n sub = '0' + sub0;\n } else if (parseInt(sub, 10) > 31) {\n sub = '31';\n }\n\n break;\n\n case 'm':\n if (sub === '00') {\n sub = '01';\n } else if (parseInt(sub0, 10) > 1) {\n sub = '0' + sub0;\n } else if (parseInt(sub, 10) > 12) {\n sub = '12';\n }\n\n break;\n }\n\n result += sub;\n\n // update remaining string\n value = rest;\n }\n });\n\n return this.getFixedDateString(result);\n },\n\n getFixedDateString: function (value) {\n var owner = this, datePattern = owner.datePattern, date = [],\n dayIndex = 0, monthIndex = 0, yearIndex = 0,\n dayStartIndex = 0, monthStartIndex = 0, yearStartIndex = 0,\n day, month, year, fullYearDone = false;\n\n // mm-dd || dd-mm\n if (value.length === 4 && datePattern[0].toLowerCase() !== 'y' && datePattern[1].toLowerCase() !== 'y') {\n dayStartIndex = datePattern[0] === 'd' ? 0 : 2;\n monthStartIndex = 2 - dayStartIndex;\n day = parseInt(value.slice(dayStartIndex, dayStartIndex + 2), 10);\n month = parseInt(value.slice(monthStartIndex, monthStartIndex + 2), 10);\n\n date = this.getFixedDate(day, month, 0);\n }\n\n // yyyy-mm-dd || yyyy-dd-mm || mm-dd-yyyy || dd-mm-yyyy || dd-yyyy-mm || mm-yyyy-dd\n if (value.length === 8) {\n datePattern.forEach(function (type, index) {\n switch (type) {\n case 'd':\n dayIndex = index;\n break;\n case 'm':\n monthIndex = index;\n break;\n default:\n yearIndex = index;\n break;\n }\n });\n\n yearStartIndex = yearIndex * 2;\n dayStartIndex = (dayIndex <= yearIndex) ? dayIndex * 2 : (dayIndex * 2 + 2);\n monthStartIndex = (monthIndex <= yearIndex) ? monthIndex * 2 : (monthIndex * 2 + 2);\n\n day = parseInt(value.slice(dayStartIndex, dayStartIndex + 2), 10);\n month = parseInt(value.slice(monthStartIndex, monthStartIndex + 2), 10);\n year = parseInt(value.slice(yearStartIndex, yearStartIndex + 4), 10);\n\n fullYearDone = value.slice(yearStartIndex, yearStartIndex + 4).length === 4;\n\n date = this.getFixedDate(day, month, year);\n }\n\n // mm-yy || yy-mm\n if (value.length === 4 && (datePattern[0] === 'y' || datePattern[1] === 'y')) {\n monthStartIndex = datePattern[0] === 'm' ? 0 : 2;\n yearStartIndex = 2 - monthStartIndex;\n month = parseInt(value.slice(monthStartIndex, monthStartIndex + 2), 10);\n year = parseInt(value.slice(yearStartIndex, yearStartIndex + 2), 10);\n\n fullYearDone = value.slice(yearStartIndex, yearStartIndex + 2).length === 2;\n\n date = [0, month, year];\n }\n\n // mm-yyyy || yyyy-mm\n if (value.length === 6 && (datePattern[0] === 'Y' || datePattern[1] === 'Y')) {\n monthStartIndex = datePattern[0] === 'm' ? 0 : 4;\n yearStartIndex = 2 - 0.5 * monthStartIndex;\n month = parseInt(value.slice(monthStartIndex, monthStartIndex + 2), 10);\n year = parseInt(value.slice(yearStartIndex, yearStartIndex + 4), 10);\n\n fullYearDone = value.slice(yearStartIndex, yearStartIndex + 4).length === 4;\n\n date = [0, month, year];\n }\n\n date = owner.getRangeFixedDate(date);\n owner.date = date;\n\n var result = date.length === 0 ? value : datePattern.reduce(function (previous, current) {\n switch (current) {\n case 'd':\n return previous + (date[0] === 0 ? '' : owner.addLeadingZero(date[0]));\n case 'm':\n return previous + (date[1] === 0 ? '' : owner.addLeadingZero(date[1]));\n case 'y':\n return previous + (fullYearDone ? owner.addLeadingZeroForYear(date[2], false) : '');\n case 'Y':\n return previous + (fullYearDone ? owner.addLeadingZeroForYear(date[2], true) : '');\n }\n }, '');\n\n return result;\n },\n\n getRangeFixedDate: function (date) {\n var owner = this,\n datePattern = owner.datePattern,\n dateMin = owner.dateMin || [],\n dateMax = owner.dateMax || [];\n\n if (!date.length || (dateMin.length < 3 && dateMax.length < 3)) return date;\n\n if (\n datePattern.find(function(x) {\n return x.toLowerCase() === 'y';\n }) &&\n date[2] === 0\n ) return date;\n\n if (dateMax.length && (dateMax[2] < date[2] || (\n dateMax[2] === date[2] && (dateMax[1] < date[1] || (\n dateMax[1] === date[1] && dateMax[0] < date[0]\n ))\n ))) return dateMax;\n\n if (dateMin.length && (dateMin[2] > date[2] || (\n dateMin[2] === date[2] && (dateMin[1] > date[1] || (\n dateMin[1] === date[1] && dateMin[0] > date[0]\n ))\n ))) return dateMin;\n\n return date;\n },\n\n getFixedDate: function (day, month, year) {\n day = Math.min(day, 31);\n month = Math.min(month, 12);\n year = parseInt((year || 0), 10);\n\n if ((month < 7 && month % 2 === 0) || (month > 8 && month % 2 === 1)) {\n day = Math.min(day, month === 2 ? (this.isLeapYear(year) ? 29 : 28) : 30);\n }\n\n return [day, month, year];\n },\n\n isLeapYear: function (year) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n },\n\n addLeadingZero: function (number) {\n return (number < 10 ? '0' : '') + number;\n },\n\n addLeadingZeroForYear: function (number, fullYearMode) {\n if (fullYearMode) {\n return (number < 10 ? '000' : (number < 100 ? '00' : (number < 1000 ? '0' : ''))) + number;\n }\n\n return (number < 10 ? '0' : '') + number;\n }\n};\n\nvar DateFormatter_1 = DateFormatter;\n\nvar TimeFormatter = function (timePattern, timeFormat) {\n var owner = this;\n\n owner.time = [];\n owner.blocks = [];\n owner.timePattern = timePattern;\n owner.timeFormat = timeFormat;\n owner.initBlocks();\n};\n\nTimeFormatter.prototype = {\n initBlocks: function () {\n var owner = this;\n owner.timePattern.forEach(function () {\n owner.blocks.push(2);\n });\n },\n\n getISOFormatTime: function () {\n var owner = this,\n time = owner.time;\n\n return time[2] ? (\n owner.addLeadingZero(time[0]) + ':' + owner.addLeadingZero(time[1]) + ':' + owner.addLeadingZero(time[2])\n ) : '';\n },\n\n getBlocks: function () {\n return this.blocks;\n },\n\n getTimeFormatOptions: function () {\n var owner = this;\n if (String(owner.timeFormat) === '12') {\n return {\n maxHourFirstDigit: 1,\n maxHours: 12,\n maxMinutesFirstDigit: 5,\n maxMinutes: 60\n };\n }\n\n return {\n maxHourFirstDigit: 2,\n maxHours: 23,\n maxMinutesFirstDigit: 5,\n maxMinutes: 60\n };\n },\n\n getValidatedTime: function (value) {\n var owner = this, result = '';\n\n value = value.replace(/[^\\d]/g, '');\n\n var timeFormatOptions = owner.getTimeFormatOptions();\n\n owner.blocks.forEach(function (length, index) {\n if (value.length > 0) {\n var sub = value.slice(0, length),\n sub0 = sub.slice(0, 1),\n rest = value.slice(length);\n\n switch (owner.timePattern[index]) {\n\n case 'h':\n if (parseInt(sub0, 10) > timeFormatOptions.maxHourFirstDigit) {\n sub = '0' + sub0;\n } else if (parseInt(sub, 10) > timeFormatOptions.maxHours) {\n sub = timeFormatOptions.maxHours + '';\n }\n\n break;\n\n case 'm':\n case 's':\n if (parseInt(sub0, 10) > timeFormatOptions.maxMinutesFirstDigit) {\n sub = '0' + sub0;\n } else if (parseInt(sub, 10) > timeFormatOptions.maxMinutes) {\n sub = timeFormatOptions.maxMinutes + '';\n }\n break;\n }\n\n result += sub;\n\n // update remaining string\n value = rest;\n }\n });\n\n return this.getFixedTimeString(result);\n },\n\n getFixedTimeString: function (value) {\n var owner = this, timePattern = owner.timePattern, time = [],\n secondIndex = 0, minuteIndex = 0, hourIndex = 0,\n secondStartIndex = 0, minuteStartIndex = 0, hourStartIndex = 0,\n second, minute, hour;\n\n if (value.length === 6) {\n timePattern.forEach(function (type, index) {\n switch (type) {\n case 's':\n secondIndex = index * 2;\n break;\n case 'm':\n minuteIndex = index * 2;\n break;\n case 'h':\n hourIndex = index * 2;\n break;\n }\n });\n\n hourStartIndex = hourIndex;\n minuteStartIndex = minuteIndex;\n secondStartIndex = secondIndex;\n\n second = parseInt(value.slice(secondStartIndex, secondStartIndex + 2), 10);\n minute = parseInt(value.slice(minuteStartIndex, minuteStartIndex + 2), 10);\n hour = parseInt(value.slice(hourStartIndex, hourStartIndex + 2), 10);\n\n time = this.getFixedTime(hour, minute, second);\n }\n\n if (value.length === 4 && owner.timePattern.indexOf('s') < 0) {\n timePattern.forEach(function (type, index) {\n switch (type) {\n case 'm':\n minuteIndex = index * 2;\n break;\n case 'h':\n hourIndex = index * 2;\n break;\n }\n });\n\n hourStartIndex = hourIndex;\n minuteStartIndex = minuteIndex;\n\n second = 0;\n minute = parseInt(value.slice(minuteStartIndex, minuteStartIndex + 2), 10);\n hour = parseInt(value.slice(hourStartIndex, hourStartIndex + 2), 10);\n\n time = this.getFixedTime(hour, minute, second);\n }\n\n owner.time = time;\n\n return time.length === 0 ? value : timePattern.reduce(function (previous, current) {\n switch (current) {\n case 's':\n return previous + owner.addLeadingZero(time[2]);\n case 'm':\n return previous + owner.addLeadingZero(time[1]);\n case 'h':\n return previous + owner.addLeadingZero(time[0]);\n }\n }, '');\n },\n\n getFixedTime: function (hour, minute, second) {\n second = Math.min(parseInt(second || 0, 10), 60);\n minute = Math.min(minute, 60);\n hour = Math.min(hour, 60);\n\n return [hour, minute, second];\n },\n\n addLeadingZero: function (number) {\n return (number < 10 ? '0' : '') + number;\n }\n};\n\nvar TimeFormatter_1 = TimeFormatter;\n\nvar PhoneFormatter = function (formatter, delimiter) {\n var owner = this;\n\n owner.delimiter = (delimiter || delimiter === '') ? delimiter : ' ';\n owner.delimiterRE = delimiter ? new RegExp('\\\\' + delimiter, 'g') : '';\n\n owner.formatter = formatter;\n};\n\nPhoneFormatter.prototype = {\n setFormatter: function (formatter) {\n this.formatter = formatter;\n },\n\n format: function (phoneNumber) {\n var owner = this;\n\n owner.formatter.clear();\n\n // only keep number and +\n phoneNumber = phoneNumber.replace(/[^\\d+]/g, '');\n\n // strip non-leading +\n phoneNumber = phoneNumber.replace(/^\\+/, 'B').replace(/\\+/g, '').replace('B', '+');\n\n // strip delimiter\n phoneNumber = phoneNumber.replace(owner.delimiterRE, '');\n\n var result = '', current, validated = false;\n\n for (var i = 0, iMax = phoneNumber.length; i < iMax; i++) {\n current = owner.formatter.inputDigit(phoneNumber.charAt(i));\n\n // has ()- or space inside\n if (/[\\s()-]/g.test(current)) {\n result = current;\n\n validated = true;\n } else {\n if (!validated) {\n result = current;\n }\n // else: over length input\n // it turns to invalid number again\n }\n }\n\n // strip ()\n // e.g. US: 7161234567 returns (716) 123-4567\n result = result.replace(/[()]/g, '');\n // replace library delimiter with user customized delimiter\n result = result.replace(/[\\s-]/g, owner.delimiter);\n\n return result;\n }\n};\n\nvar PhoneFormatter_1 = PhoneFormatter;\n\nvar CreditCardDetector = {\n blocks: {\n uatp: [4, 5, 6],\n amex: [4, 6, 5],\n diners: [4, 6, 4],\n discover: [4, 4, 4, 4],\n mastercard: [4, 4, 4, 4],\n dankort: [4, 4, 4, 4],\n instapayment: [4, 4, 4, 4],\n jcb15: [4, 6, 5],\n jcb: [4, 4, 4, 4],\n maestro: [4, 4, 4, 4],\n visa: [4, 4, 4, 4],\n mir: [4, 4, 4, 4],\n unionPay: [4, 4, 4, 4],\n general: [4, 4, 4, 4]\n },\n\n re: {\n // starts with 1; 15 digits, not starts with 1800 (jcb card)\n uatp: /^(?!1800)1\\d{0,14}/,\n\n // starts with 34/37; 15 digits\n amex: /^3[47]\\d{0,13}/,\n\n // starts with 6011/65/644-649; 16 digits\n discover: /^(?:6011|65\\d{0,2}|64[4-9]\\d?)\\d{0,12}/,\n\n // starts with 300-305/309 or 36/38/39; 14 digits\n diners: /^3(?:0([0-5]|9)|[689]\\d?)\\d{0,11}/,\n\n // starts with 51-55/2221–2720; 16 digits\n mastercard: /^(5[1-5]\\d{0,2}|22[2-9]\\d{0,1}|2[3-7]\\d{0,2})\\d{0,12}/,\n\n // starts with 5019/4175/4571; 16 digits\n dankort: /^(5019|4175|4571)\\d{0,12}/,\n\n // starts with 637-639; 16 digits\n instapayment: /^63[7-9]\\d{0,13}/,\n\n // starts with 2131/1800; 15 digits\n jcb15: /^(?:2131|1800)\\d{0,11}/,\n\n // starts with 2131/1800/35; 16 digits\n jcb: /^(?:35\\d{0,2})\\d{0,12}/,\n\n // starts with 50/56-58/6304/67; 16 digits\n maestro: /^(?:5[0678]\\d{0,2}|6304|67\\d{0,2})\\d{0,12}/,\n\n // starts with 22; 16 digits\n mir: /^220[0-4]\\d{0,12}/,\n\n // starts with 4; 16 digits\n visa: /^4\\d{0,15}/,\n\n // starts with 62/81; 16 digits\n unionPay: /^(62|81)\\d{0,14}/\n },\n\n getStrictBlocks: function (block) {\n var total = block.reduce(function (prev, current) {\n return prev + current;\n }, 0);\n\n return block.concat(19 - total);\n },\n\n getInfo: function (value, strictMode) {\n var blocks = CreditCardDetector.blocks,\n re = CreditCardDetector.re;\n\n // Some credit card can have up to 19 digits number.\n // Set strictMode to true will remove the 16 max-length restrain,\n // however, I never found any website validate card number like\n // this, hence probably you don't want to enable this option.\n strictMode = !!strictMode;\n\n for (var key in re) {\n if (re[key].test(value)) {\n var matchedBlocks = blocks[key];\n return {\n type: key,\n blocks: strictMode ? this.getStrictBlocks(matchedBlocks) : matchedBlocks\n };\n }\n }\n\n return {\n type: 'unknown',\n blocks: strictMode ? this.getStrictBlocks(blocks.general) : blocks.general\n };\n }\n};\n\nvar CreditCardDetector_1 = CreditCardDetector;\n\nvar Util = {\n noop: function () {\n },\n\n strip: function (value, re) {\n return value.replace(re, '');\n },\n\n getPostDelimiter: function (value, delimiter, delimiters) {\n // single delimiter\n if (delimiters.length === 0) {\n return value.slice(-delimiter.length) === delimiter ? delimiter : '';\n }\n\n // multiple delimiters\n var matchedDelimiter = '';\n delimiters.forEach(function (current) {\n if (value.slice(-current.length) === current) {\n matchedDelimiter = current;\n }\n });\n\n return matchedDelimiter;\n },\n\n getDelimiterREByDelimiter: function (delimiter) {\n return new RegExp(delimiter.replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1'), 'g');\n },\n\n getNextCursorPosition: function (prevPos, oldValue, newValue, delimiter, delimiters) {\n // If cursor was at the end of value, just place it back.\n // Because new value could contain additional chars.\n if (oldValue.length === prevPos) {\n return newValue.length;\n }\n\n return prevPos + this.getPositionOffset(prevPos, oldValue, newValue, delimiter ,delimiters);\n },\n\n getPositionOffset: function (prevPos, oldValue, newValue, delimiter, delimiters) {\n var oldRawValue, newRawValue, lengthOffset;\n\n oldRawValue = this.stripDelimiters(oldValue.slice(0, prevPos), delimiter, delimiters);\n newRawValue = this.stripDelimiters(newValue.slice(0, prevPos), delimiter, delimiters);\n lengthOffset = oldRawValue.length - newRawValue.length;\n\n return (lengthOffset !== 0) ? (lengthOffset / Math.abs(lengthOffset)) : 0;\n },\n\n stripDelimiters: function (value, delimiter, delimiters) {\n var owner = this;\n\n // single delimiter\n if (delimiters.length === 0) {\n var delimiterRE = delimiter ? owner.getDelimiterREByDelimiter(delimiter) : '';\n\n return value.replace(delimiterRE, '');\n }\n\n // multiple delimiters\n delimiters.forEach(function (current) {\n current.split('').forEach(function (letter) {\n value = value.replace(owner.getDelimiterREByDelimiter(letter), '');\n });\n });\n\n return value;\n },\n\n headStr: function (str, length) {\n return str.slice(0, length);\n },\n\n getMaxLength: function (blocks) {\n return blocks.reduce(function (previous, current) {\n return previous + current;\n }, 0);\n },\n\n // strip prefix\n // Before type | After type | Return value\n // PEFIX-... | PEFIX-... | ''\n // PREFIX-123 | PEFIX-123 | 123\n // PREFIX-123 | PREFIX-23 | 23\n // PREFIX-123 | PREFIX-1234 | 1234\n getPrefixStrippedValue: function (value, prefix, prefixLength, prevResult, delimiter, delimiters, noImmediatePrefix, tailPrefix, signBeforePrefix) {\n // No prefix\n if (prefixLength === 0) {\n return value;\n }\n\n // Value is prefix\n if (value === prefix && value !== '') {\n return '';\n }\n\n if (signBeforePrefix && (value.slice(0, 1) == '-')) {\n var prev = (prevResult.slice(0, 1) == '-') ? prevResult.slice(1) : prevResult;\n return '-' + this.getPrefixStrippedValue(value.slice(1), prefix, prefixLength, prev, delimiter, delimiters, noImmediatePrefix, tailPrefix, signBeforePrefix);\n }\n\n // Pre result prefix string does not match pre-defined prefix\n if (prevResult.slice(0, prefixLength) !== prefix && !tailPrefix) {\n // Check if the first time user entered something\n if (noImmediatePrefix && !prevResult && value) return value;\n return '';\n } else if (prevResult.slice(-prefixLength) !== prefix && tailPrefix) {\n // Check if the first time user entered something\n if (noImmediatePrefix && !prevResult && value) return value;\n return '';\n }\n\n var prevValue = this.stripDelimiters(prevResult, delimiter, delimiters);\n\n // New value has issue, someone typed in between prefix letters\n // Revert to pre value\n if (value.slice(0, prefixLength) !== prefix && !tailPrefix) {\n return prevValue.slice(prefixLength);\n } else if (value.slice(-prefixLength) !== prefix && tailPrefix) {\n return prevValue.slice(0, -prefixLength - 1);\n }\n\n // No issue, strip prefix for new value\n return tailPrefix ? value.slice(0, -prefixLength) : value.slice(prefixLength);\n },\n\n getFirstDiffIndex: function (prev, current) {\n var index = 0;\n\n while (prev.charAt(index) === current.charAt(index)) {\n if (prev.charAt(index++) === '') {\n return -1;\n }\n }\n\n return index;\n },\n\n getFormattedValue: function (value, blocks, blocksLength, delimiter, delimiters, delimiterLazyShow) {\n var result = '',\n multipleDelimiters = delimiters.length > 0,\n currentDelimiter = '';\n\n // no options, normal input\n if (blocksLength === 0) {\n return value;\n }\n\n blocks.forEach(function (length, index) {\n if (value.length > 0) {\n var sub = value.slice(0, length),\n rest = value.slice(length);\n\n if (multipleDelimiters) {\n currentDelimiter = delimiters[delimiterLazyShow ? (index - 1) : index] || currentDelimiter;\n } else {\n currentDelimiter = delimiter;\n }\n\n if (delimiterLazyShow) {\n if (index > 0) {\n result += currentDelimiter;\n }\n\n result += sub;\n } else {\n result += sub;\n\n if (sub.length === length && index < blocksLength - 1) {\n result += currentDelimiter;\n }\n }\n\n // update remaining string\n value = rest;\n }\n });\n\n return result;\n },\n\n // move cursor to the end\n // the first time user focuses on an input with prefix\n fixPrefixCursor: function (el, prefix, delimiter, delimiters) {\n if (!el) {\n return;\n }\n\n var val = el.value,\n appendix = delimiter || (delimiters[0] || ' ');\n\n if (!el.setSelectionRange || !prefix || (prefix.length + appendix.length) <= val.length) {\n return;\n }\n\n var len = val.length * 2;\n\n // set timeout to avoid blink\n setTimeout(function () {\n el.setSelectionRange(len, len);\n }, 1);\n },\n\n // Check if input field is fully selected\n checkFullSelection: function(value) {\n try {\n var selection = window.getSelection() || document.getSelection() || {};\n return selection.toString().length === value.length;\n } catch (ex) {\n // Ignore\n }\n\n return false;\n },\n\n setSelection: function (element, position, doc) {\n if (element !== this.getActiveElement(doc)) {\n return;\n }\n\n // cursor is already in the end\n if (element && element.value.length <= position) {\n return;\n }\n\n if (element.createTextRange) {\n var range = element.createTextRange();\n\n range.move('character', position);\n range.select();\n } else {\n try {\n element.setSelectionRange(position, position);\n } catch (e) {\n // eslint-disable-next-line\n console.warn('The input element type does not support selection');\n }\n }\n },\n\n getActiveElement: function(parent) {\n var activeElement = parent.activeElement;\n if (activeElement && activeElement.shadowRoot) {\n return this.getActiveElement(activeElement.shadowRoot);\n }\n return activeElement;\n },\n\n isAndroid: function () {\n return navigator && /android/i.test(navigator.userAgent);\n },\n\n // On Android chrome, the keyup and keydown events\n // always return key code 229 as a composition that\n // buffers the user’s keystrokes\n // see https://github.com/nosir/cleave.js/issues/147\n isAndroidBackspaceKeydown: function (lastInputValue, currentInputValue) {\n if (!this.isAndroid() || !lastInputValue || !currentInputValue) {\n return false;\n }\n\n return currentInputValue === lastInputValue.slice(0, -1);\n }\n};\n\nvar Util_1 = Util;\n\n/**\n * Props Assignment\n *\n * Separate this, so react module can share the usage\n */\nvar DefaultProperties = {\n // Maybe change to object-assign\n // for now just keep it as simple\n assign: function (target, opts) {\n target = target || {};\n opts = opts || {};\n\n // credit card\n target.creditCard = !!opts.creditCard;\n target.creditCardStrictMode = !!opts.creditCardStrictMode;\n target.creditCardType = '';\n target.onCreditCardTypeChanged = opts.onCreditCardTypeChanged || (function () {});\n\n // phone\n target.phone = !!opts.phone;\n target.phoneRegionCode = opts.phoneRegionCode || 'AU';\n target.phoneFormatter = {};\n\n // time\n target.time = !!opts.time;\n target.timePattern = opts.timePattern || ['h', 'm', 's'];\n target.timeFormat = opts.timeFormat || '24';\n target.timeFormatter = {};\n\n // date\n target.date = !!opts.date;\n target.datePattern = opts.datePattern || ['d', 'm', 'Y'];\n target.dateMin = opts.dateMin || '';\n target.dateMax = opts.dateMax || '';\n target.dateFormatter = {};\n\n // numeral\n target.numeral = !!opts.numeral;\n target.numeralIntegerScale = opts.numeralIntegerScale > 0 ? opts.numeralIntegerScale : 0;\n target.numeralDecimalScale = opts.numeralDecimalScale >= 0 ? opts.numeralDecimalScale : 2;\n target.numeralDecimalMark = opts.numeralDecimalMark || '.';\n target.numeralThousandsGroupStyle = opts.numeralThousandsGroupStyle || 'thousand';\n target.numeralPositiveOnly = !!opts.numeralPositiveOnly;\n target.stripLeadingZeroes = opts.stripLeadingZeroes !== false;\n target.signBeforePrefix = !!opts.signBeforePrefix;\n target.tailPrefix = !!opts.tailPrefix;\n\n // others\n target.swapHiddenInput = !!opts.swapHiddenInput;\n \n target.numericOnly = target.creditCard || target.date || !!opts.numericOnly;\n\n target.uppercase = !!opts.uppercase;\n target.lowercase = !!opts.lowercase;\n\n target.prefix = (target.creditCard || target.date) ? '' : (opts.prefix || '');\n target.noImmediatePrefix = !!opts.noImmediatePrefix;\n target.prefixLength = target.prefix.length;\n target.rawValueTrimPrefix = !!opts.rawValueTrimPrefix;\n target.copyDelimiter = !!opts.copyDelimiter;\n\n target.initValue = (opts.initValue !== undefined && opts.initValue !== null) ? opts.initValue.toString() : '';\n\n target.delimiter =\n (opts.delimiter || opts.delimiter === '') ? opts.delimiter :\n (opts.date ? '/' :\n (opts.time ? ':' :\n (opts.numeral ? ',' :\n (opts.phone ? ' ' :\n ' '))));\n target.delimiterLength = target.delimiter.length;\n target.delimiterLazyShow = !!opts.delimiterLazyShow;\n target.delimiters = opts.delimiters || [];\n\n target.blocks = opts.blocks || [];\n target.blocksLength = target.blocks.length;\n\n target.root = (typeof commonjsGlobal === 'object' && commonjsGlobal) ? commonjsGlobal : window;\n target.document = opts.document || target.root.document;\n\n target.maxLength = 0;\n\n target.backspace = false;\n target.result = '';\n\n target.onValueChanged = opts.onValueChanged || (function () {});\n\n return target;\n }\n};\n\nvar DefaultProperties_1 = DefaultProperties;\n\n/**\n * Construct a new Cleave instance by passing the configuration object\n *\n * @param {String | HTMLElement} element\n * @param {Object} opts\n */\nvar Cleave = function (element, opts) {\n var owner = this;\n var hasMultipleElements = false;\n\n if (typeof element === 'string') {\n owner.element = document.querySelector(element);\n hasMultipleElements = document.querySelectorAll(element).length > 1;\n } else {\n if (typeof element.length !== 'undefined' && element.length > 0) {\n owner.element = element[0];\n hasMultipleElements = element.length > 1;\n } else {\n owner.element = element;\n }\n }\n\n if (!owner.element) {\n throw new Error('[cleave.js] Please check the element');\n }\n\n if (hasMultipleElements) {\n try {\n // eslint-disable-next-line\n console.warn('[cleave.js] Multiple input fields matched, cleave.js will only take the first one.');\n } catch (e) {\n // Old IE\n }\n }\n\n opts.initValue = owner.element.value;\n\n owner.properties = Cleave.DefaultProperties.assign({}, opts);\n\n owner.init();\n};\n\nCleave.prototype = {\n init: function () {\n var owner = this, pps = owner.properties;\n\n // no need to use this lib\n if (!pps.numeral && !pps.phone && !pps.creditCard && !pps.time && !pps.date && (pps.blocksLength === 0 && !pps.prefix)) {\n owner.onInput(pps.initValue);\n\n return;\n }\n\n pps.maxLength = Cleave.Util.getMaxLength(pps.blocks);\n\n owner.isAndroid = Cleave.Util.isAndroid();\n owner.lastInputValue = '';\n owner.isBackward = '';\n\n owner.onChangeListener = owner.onChange.bind(owner);\n owner.onKeyDownListener = owner.onKeyDown.bind(owner);\n owner.onFocusListener = owner.onFocus.bind(owner);\n owner.onCutListener = owner.onCut.bind(owner);\n owner.onCopyListener = owner.onCopy.bind(owner);\n\n owner.initSwapHiddenInput();\n\n owner.element.addEventListener('input', owner.onChangeListener);\n owner.element.addEventListener('keydown', owner.onKeyDownListener);\n owner.element.addEventListener('focus', owner.onFocusListener);\n owner.element.addEventListener('cut', owner.onCutListener);\n owner.element.addEventListener('copy', owner.onCopyListener);\n\n\n owner.initPhoneFormatter();\n owner.initDateFormatter();\n owner.initTimeFormatter();\n owner.initNumeralFormatter();\n\n // avoid touch input field if value is null\n // otherwise Firefox will add red box-shadow for \n if (pps.initValue || (pps.prefix && !pps.noImmediatePrefix)) {\n owner.onInput(pps.initValue);\n }\n },\n\n initSwapHiddenInput: function () {\n var owner = this, pps = owner.properties;\n if (!pps.swapHiddenInput) return;\n\n var inputFormatter = owner.element.cloneNode(true);\n owner.element.parentNode.insertBefore(inputFormatter, owner.element);\n\n owner.elementSwapHidden = owner.element;\n owner.elementSwapHidden.type = 'hidden';\n\n owner.element = inputFormatter;\n owner.element.id = '';\n },\n\n initNumeralFormatter: function () {\n var owner = this, pps = owner.properties;\n\n if (!pps.numeral) {\n return;\n }\n\n pps.numeralFormatter = new Cleave.NumeralFormatter(\n pps.numeralDecimalMark,\n pps.numeralIntegerScale,\n pps.numeralDecimalScale,\n pps.numeralThousandsGroupStyle,\n pps.numeralPositiveOnly,\n pps.stripLeadingZeroes,\n pps.prefix,\n pps.signBeforePrefix,\n pps.tailPrefix,\n pps.delimiter\n );\n },\n\n initTimeFormatter: function() {\n var owner = this, pps = owner.properties;\n\n if (!pps.time) {\n return;\n }\n\n pps.timeFormatter = new Cleave.TimeFormatter(pps.timePattern, pps.timeFormat);\n pps.blocks = pps.timeFormatter.getBlocks();\n pps.blocksLength = pps.blocks.length;\n pps.maxLength = Cleave.Util.getMaxLength(pps.blocks);\n },\n\n initDateFormatter: function () {\n var owner = this, pps = owner.properties;\n\n if (!pps.date) {\n return;\n }\n\n pps.dateFormatter = new Cleave.DateFormatter(pps.datePattern, pps.dateMin, pps.dateMax);\n pps.blocks = pps.dateFormatter.getBlocks();\n pps.blocksLength = pps.blocks.length;\n pps.maxLength = Cleave.Util.getMaxLength(pps.blocks);\n },\n\n initPhoneFormatter: function () {\n var owner = this, pps = owner.properties;\n\n if (!pps.phone) {\n return;\n }\n\n // Cleave.AsYouTypeFormatter should be provided by\n // external google closure lib\n try {\n pps.phoneFormatter = new Cleave.PhoneFormatter(\n new pps.root.Cleave.AsYouTypeFormatter(pps.phoneRegionCode),\n pps.delimiter\n );\n } catch (ex) {\n throw new Error('[cleave.js] Please include phone-type-formatter.{country}.js lib');\n }\n },\n\n onKeyDown: function (event) {\n var owner = this,\n charCode = event.which || event.keyCode;\n\n owner.lastInputValue = owner.element.value;\n owner.isBackward = charCode === 8;\n },\n\n onChange: function (event) {\n var owner = this, pps = owner.properties,\n Util = Cleave.Util;\n\n owner.isBackward = owner.isBackward || event.inputType === 'deleteContentBackward';\n\n var postDelimiter = Util.getPostDelimiter(owner.lastInputValue, pps.delimiter, pps.delimiters);\n\n if (owner.isBackward && postDelimiter) {\n pps.postDelimiterBackspace = postDelimiter;\n } else {\n pps.postDelimiterBackspace = false;\n }\n\n this.onInput(this.element.value);\n },\n\n onFocus: function () {\n var owner = this,\n pps = owner.properties;\n owner.lastInputValue = owner.element.value;\n\n if (pps.prefix && pps.noImmediatePrefix && !owner.element.value) {\n this.onInput(pps.prefix);\n }\n\n Cleave.Util.fixPrefixCursor(owner.element, pps.prefix, pps.delimiter, pps.delimiters);\n },\n\n onCut: function (e) {\n if (!Cleave.Util.checkFullSelection(this.element.value)) return;\n this.copyClipboardData(e);\n this.onInput('');\n },\n\n onCopy: function (e) {\n if (!Cleave.Util.checkFullSelection(this.element.value)) return;\n this.copyClipboardData(e);\n },\n\n copyClipboardData: function (e) {\n var owner = this,\n pps = owner.properties,\n Util = Cleave.Util,\n inputValue = owner.element.value,\n textToCopy = '';\n\n if (!pps.copyDelimiter) {\n textToCopy = Util.stripDelimiters(inputValue, pps.delimiter, pps.delimiters);\n } else {\n textToCopy = inputValue;\n }\n\n try {\n if (e.clipboardData) {\n e.clipboardData.setData('Text', textToCopy);\n } else {\n window.clipboardData.setData('Text', textToCopy);\n }\n\n e.preventDefault();\n } catch (ex) {\n // empty\n }\n },\n\n onInput: function (value) {\n var owner = this, pps = owner.properties,\n Util = Cleave.Util;\n\n // case 1: delete one more character \"4\"\n // 1234*| -> hit backspace -> 123|\n // case 2: last character is not delimiter which is:\n // 12|34* -> hit backspace -> 1|34*\n // note: no need to apply this for numeral mode\n var postDelimiterAfter = Util.getPostDelimiter(value, pps.delimiter, pps.delimiters);\n if (!pps.numeral && pps.postDelimiterBackspace && !postDelimiterAfter) {\n value = Util.headStr(value, value.length - pps.postDelimiterBackspace.length);\n }\n\n // phone formatter\n if (pps.phone) {\n if (pps.prefix && (!pps.noImmediatePrefix || value.length)) {\n pps.result = pps.prefix + pps.phoneFormatter.format(value).slice(pps.prefix.length);\n } else {\n pps.result = pps.phoneFormatter.format(value);\n }\n owner.updateValueState();\n\n return;\n }\n\n // numeral formatter\n if (pps.numeral) {\n // Do not show prefix when noImmediatePrefix is specified\n // This mostly because we need to show user the native input placeholder\n if (pps.prefix && pps.noImmediatePrefix && value.length === 0) {\n pps.result = '';\n } else {\n pps.result = pps.numeralFormatter.format(value);\n }\n owner.updateValueState();\n\n return;\n }\n\n // date\n if (pps.date) {\n value = pps.dateFormatter.getValidatedDate(value);\n }\n\n // time\n if (pps.time) {\n value = pps.timeFormatter.getValidatedTime(value);\n }\n\n // strip delimiters\n value = Util.stripDelimiters(value, pps.delimiter, pps.delimiters);\n\n // strip prefix\n value = Util.getPrefixStrippedValue(value, pps.prefix, pps.prefixLength, pps.result, pps.delimiter, pps.delimiters, pps.noImmediatePrefix, pps.tailPrefix, pps.signBeforePrefix);\n\n // strip non-numeric characters\n value = pps.numericOnly ? Util.strip(value, /[^\\d]/g) : value;\n\n // convert case\n value = pps.uppercase ? value.toUpperCase() : value;\n value = pps.lowercase ? value.toLowerCase() : value;\n\n // prevent from showing prefix when no immediate option enabled with empty input value\n if (pps.prefix) {\n if (pps.tailPrefix) {\n value = value + pps.prefix;\n } else {\n value = pps.prefix + value;\n }\n\n\n // no blocks specified, no need to do formatting\n if (pps.blocksLength === 0) {\n pps.result = value;\n owner.updateValueState();\n\n return;\n }\n }\n\n // update credit card props\n if (pps.creditCard) {\n owner.updateCreditCardPropsByValue(value);\n }\n\n // strip over length characters\n value = Util.headStr(value, pps.maxLength);\n\n // apply blocks\n pps.result = Util.getFormattedValue(\n value,\n pps.blocks, pps.blocksLength,\n pps.delimiter, pps.delimiters, pps.delimiterLazyShow\n );\n\n owner.updateValueState();\n },\n\n updateCreditCardPropsByValue: function (value) {\n var owner = this, pps = owner.properties,\n Util = Cleave.Util,\n creditCardInfo;\n\n // At least one of the first 4 characters has changed\n if (Util.headStr(pps.result, 4) === Util.headStr(value, 4)) {\n return;\n }\n\n creditCardInfo = Cleave.CreditCardDetector.getInfo(value, pps.creditCardStrictMode);\n\n pps.blocks = creditCardInfo.blocks;\n pps.blocksLength = pps.blocks.length;\n pps.maxLength = Util.getMaxLength(pps.blocks);\n\n // credit card type changed\n if (pps.creditCardType !== creditCardInfo.type) {\n pps.creditCardType = creditCardInfo.type;\n\n pps.onCreditCardTypeChanged.call(owner, pps.creditCardType);\n }\n },\n\n updateValueState: function () {\n var owner = this,\n Util = Cleave.Util,\n pps = owner.properties;\n\n if (!owner.element) {\n return;\n }\n\n var endPos = owner.element.selectionEnd;\n var oldValue = owner.element.value;\n var newValue = pps.result;\n\n endPos = Util.getNextCursorPosition(endPos, oldValue, newValue, pps.delimiter, pps.delimiters);\n\n // fix Android browser type=\"text\" input field\n // cursor not jumping issue\n if (owner.isAndroid) {\n window.setTimeout(function () {\n owner.element.value = newValue;\n Util.setSelection(owner.element, endPos, pps.document, false);\n owner.callOnValueChanged();\n }, 1);\n\n return;\n }\n\n owner.element.value = newValue;\n if (pps.swapHiddenInput) owner.elementSwapHidden.value = owner.getRawValue();\n\n Util.setSelection(owner.element, endPos, pps.document, false);\n owner.callOnValueChanged();\n },\n\n callOnValueChanged: function () {\n var owner = this,\n pps = owner.properties;\n\n pps.onValueChanged.call(owner, {\n target: {\n name: owner.element.name,\n value: pps.result,\n rawValue: owner.getRawValue()\n }\n });\n },\n\n setPhoneRegionCode: function (phoneRegionCode) {\n var owner = this, pps = owner.properties;\n\n pps.phoneRegionCode = phoneRegionCode;\n owner.initPhoneFormatter();\n owner.onChange();\n },\n\n setRawValue: function (value) {\n var owner = this, pps = owner.properties;\n\n value = value !== undefined && value !== null ? value.toString() : '';\n\n if (pps.numeral) {\n value = value.replace('.', pps.numeralDecimalMark);\n }\n\n pps.postDelimiterBackspace = false;\n\n owner.element.value = value;\n owner.onInput(value);\n },\n\n getRawValue: function () {\n var owner = this,\n pps = owner.properties,\n Util = Cleave.Util,\n rawValue = owner.element.value;\n\n if (pps.rawValueTrimPrefix) {\n rawValue = Util.getPrefixStrippedValue(rawValue, pps.prefix, pps.prefixLength, pps.result, pps.delimiter, pps.delimiters, pps.noImmediatePrefix, pps.tailPrefix, pps.signBeforePrefix);\n }\n\n if (pps.numeral) {\n rawValue = pps.numeralFormatter.getRawValue(rawValue);\n } else {\n rawValue = Util.stripDelimiters(rawValue, pps.delimiter, pps.delimiters);\n }\n\n return rawValue;\n },\n\n getISOFormatDate: function () {\n var owner = this,\n pps = owner.properties;\n\n return pps.date ? pps.dateFormatter.getISOFormatDate() : '';\n },\n\n getISOFormatTime: function () {\n var owner = this,\n pps = owner.properties;\n\n return pps.time ? pps.timeFormatter.getISOFormatTime() : '';\n },\n\n getFormattedValue: function () {\n return this.element.value;\n },\n\n destroy: function () {\n var owner = this;\n\n owner.element.removeEventListener('input', owner.onChangeListener);\n owner.element.removeEventListener('keydown', owner.onKeyDownListener);\n owner.element.removeEventListener('focus', owner.onFocusListener);\n owner.element.removeEventListener('cut', owner.onCutListener);\n owner.element.removeEventListener('copy', owner.onCopyListener);\n },\n\n toString: function () {\n return '[Cleave Object]';\n }\n};\n\nCleave.NumeralFormatter = NumeralFormatter_1;\nCleave.DateFormatter = DateFormatter_1;\nCleave.TimeFormatter = TimeFormatter_1;\nCleave.PhoneFormatter = PhoneFormatter_1;\nCleave.CreditCardDetector = CreditCardDetector_1;\nCleave.Util = Util_1;\nCleave.DefaultProperties = DefaultProperties_1;\n\n// for angular directive\n((typeof commonjsGlobal === 'object' && commonjsGlobal) ? commonjsGlobal : window)['Cleave'] = Cleave;\n\n// CommonJS\nvar Cleave_1 = Cleave;\n\nexport default Cleave_1;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1, eval)(\"this\");\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AClFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAIA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAGA;AACA;AACA;AACA;AAEA;AAEA;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAGA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;AC7JA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;;;;;;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;;;;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAEA;AAGA;AACA;AACA;AAEA;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAIA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AChqCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAGA;AAIA;AAGA;AAGA;AAGA;AAGA;AAGA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAIA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC3+BA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AASA;AACA;AAGA;AACA;AACA;AAEA;;;;;;;;;;;;;;ACxBA;AAEA;AAUA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAAA;AACA;AAEA;AACA;AAAA;AACA;AAEA;AAAA;AACA;AAEA;AAAA;AACA;AAEA;AAAA;AACA;AAEA;AAAA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAIA;AACA;AACA;AAEA;AAIA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAGA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA;AACA;AAIA;AAMA;AAMA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAGA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AACA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAGA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAGA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAOA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;AAEA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AACA;AACA;AAEA;AAYA;AAEA;AACA;AAAA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AACA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;AACA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;;;ACrhDA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""}