\";\n return div.innerHTML.indexOf('
') > 0\n }\n\n // #3663: IE encodes newlines inside attribute values while other browsers don't\n var shouldDecodeNewlines = inBrowser ? getShouldDecode(false) : false;\n // #6828: chrome encodes content in a[href]\n var shouldDecodeNewlinesForHref = inBrowser ? getShouldDecode(true) : false;\n\n /* */\n\n var idToTemplate = cached(function (id) {\n var el = query(id);\n return el && el.innerHTML\n });\n\n var mount = Vue.prototype.$mount;\n Vue.prototype.$mount = function (\n el,\n hydrating\n ) {\n el = el && query(el);\n\n /* istanbul ignore if */\n if (el === document.body || el === document.documentElement) {\n warn(\n \"Do not mount Vue to or - mount to normal elements instead.\"\n );\n return this\n }\n\n var options = this.$options;\n // resolve template/el and convert to render function\n if (!options.render) {\n var template = options.template;\n if (template) {\n if (typeof template === 'string') {\n if (template.charAt(0) === '#') {\n template = idToTemplate(template);\n /* istanbul ignore if */\n if (!template) {\n warn(\n (\"Template element not found or is empty: \" + (options.template)),\n this\n );\n }\n }\n } else if (template.nodeType) {\n template = template.innerHTML;\n } else {\n {\n warn('invalid template option:' + template, this);\n }\n return this\n }\n } else if (el) {\n template = getOuterHTML(el);\n }\n if (template) {\n /* istanbul ignore if */\n if (config.performance && mark) {\n mark('compile');\n }\n\n var ref = compileToFunctions(template, {\n outputSourceRange: \"development\" !== 'production',\n shouldDecodeNewlines: shouldDecodeNewlines,\n shouldDecodeNewlinesForHref: shouldDecodeNewlinesForHref,\n delimiters: options.delimiters,\n comments: options.comments\n }, this);\n var render = ref.render;\n var staticRenderFns = ref.staticRenderFns;\n options.render = render;\n options.staticRenderFns = staticRenderFns;\n\n /* istanbul ignore if */\n if (config.performance && mark) {\n mark('compile end');\n measure((\"vue \" + (this._name) + \" compile\"), 'compile', 'compile end');\n }\n }\n }\n return mount.call(this, el, hydrating)\n };\n\n /**\n * Get outerHTML of elements, taking care\n * of SVG elements in IE as well.\n */\n function getOuterHTML (el) {\n if (el.outerHTML) {\n return el.outerHTML\n } else {\n var container = document.createElement('div');\n container.appendChild(el.cloneNode(true));\n return container.innerHTML\n }\n }\n\n Vue.compile = compileToFunctions;\n\n return Vue;\n\n}));\n","export function Action(target, key, descriptor) {\r\n var vuexModule = target.constructor;\r\n if (!vuexModule.__actions) {\r\n vuexModule.__actions = {};\r\n }\r\n if (descriptor.value) {\r\n vuexModule.__actions[key] = descriptor.value;\r\n }\r\n}\r\n","var VuexModule = /** @class */ (function () {\r\n function VuexModule(options) {\r\n this.__options = options;\r\n }\r\n VuexModule.prototype.$watch = function (fn, callback, options) { };\r\n return VuexModule;\r\n}());\r\nexport { VuexModule };\r\n","var __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nimport { VuexModule } from \"./VuexModule\";\r\nvar VuexClassModuleFactory = /** @class */ (function () {\r\n function VuexClassModuleFactory(classModule, instance, moduleOptions) {\r\n this.definition = {\r\n state: {},\r\n moduleRefs: {},\r\n getters: {},\r\n mutations: {},\r\n actions: {},\r\n localFunctions: {}\r\n };\r\n this.moduleOptions = moduleOptions;\r\n this.instance = instance;\r\n this.registerOptions = instance.__options;\r\n this.init(classModule);\r\n }\r\n VuexClassModuleFactory.prototype.init = function (classModule) {\r\n // state\r\n for (var _i = 0, _a = Object.keys(this.instance); _i < _a.length; _i++) {\r\n var key = _a[_i];\r\n var val = this.instance[key];\r\n if (key !== \"__options\" && this.instance.hasOwnProperty(key)) {\r\n if (val instanceof VuexModule) {\r\n this.definition.moduleRefs[key] = val;\r\n }\r\n else {\r\n this.definition.state[key] = this.instance[key];\r\n }\r\n }\r\n }\r\n this.definition.mutations = classModule.__mutations || {};\r\n this.definition.actions = classModule.__actions || {};\r\n // getters & helper functions\r\n var actionKeys = Object.keys(this.definition.mutations);\r\n var mutationKeys = Object.keys(this.definition.actions);\r\n for (var _b = 0, _c = Object.getOwnPropertyNames(classModule.prototype); _b < _c.length; _b++) {\r\n var key = _c[_b];\r\n var descriptor = Object.getOwnPropertyDescriptor(classModule.prototype, key);\r\n var isGetter = !!descriptor.get;\r\n if (isGetter) {\r\n this.definition.getters[key] = descriptor.get;\r\n }\r\n var isHelperFunction = descriptor.value &&\r\n typeof classModule.prototype[key] === \"function\" &&\r\n actionKeys.indexOf(key) === -1 &&\r\n mutationKeys.indexOf(key) === -1 &&\r\n key !== \"constructor\";\r\n if (isHelperFunction) {\r\n this.definition.localFunctions[key] = classModule.prototype[key];\r\n }\r\n }\r\n };\r\n VuexClassModuleFactory.prototype.registerVuexModule = function () {\r\n var _a;\r\n var _this = this;\r\n var vuexModule = {\r\n state: this.definition.state,\r\n getters: {},\r\n mutations: {},\r\n actions: {},\r\n namespaced: true\r\n };\r\n // getters\r\n mapValues(vuexModule.getters, this.definition.getters, function (getter) {\r\n return function (state, getters) {\r\n var thisObj = _this.buildThisProxy({ state: state, getters: getters });\r\n return getter.call(thisObj);\r\n };\r\n });\r\n // mutations\r\n mapValues(vuexModule.mutations, this.definition.mutations, function (mutation) {\r\n return function (state, payload) {\r\n var thisObj = _this.buildThisProxy({\r\n state: state,\r\n stateSetter: function (stateField, val) {\r\n state[stateField] = val;\r\n }\r\n });\r\n mutation.call(thisObj, payload);\r\n };\r\n });\r\n if (this.moduleOptions.generateMutationSetters) {\r\n var _loop_1 = function (stateKey) {\r\n var mutation = function (state, payload) {\r\n state[stateKey] = payload;\r\n };\r\n vuexModule.mutations[this_1.getMutationSetterName(stateKey)] = mutation;\r\n };\r\n var this_1 = this;\r\n for (var _i = 0, _b = Object.keys(this.definition.state); _i < _b.length; _i++) {\r\n var stateKey = _b[_i];\r\n _loop_1(stateKey);\r\n }\r\n }\r\n // actions\r\n mapValues(vuexModule.actions, this.definition.actions, function (action) {\r\n return function (context, payload) {\r\n var proxyDefinition = __assign({}, context, { stateSetter: _this.moduleOptions.generateMutationSetters\r\n ? function (field, val) {\r\n context.commit(_this.getMutationSetterName(field), val);\r\n }\r\n : undefined });\r\n var thisObj = _this.buildThisProxy(proxyDefinition);\r\n return action.call(thisObj, payload);\r\n };\r\n });\r\n // register module\r\n var _c = this.registerOptions, store = _c.store, name = _c.name;\r\n if (store.state[name]) {\r\n if (module.hot) {\r\n store.hotUpdate({\r\n modules: (_a = {},\r\n _a[name] = vuexModule,\r\n _a)\r\n });\r\n }\r\n else {\r\n throw Error(\"[vuex-class-module]: A module with name '\" + name + \"' already exists.\");\r\n }\r\n }\r\n else {\r\n store.registerModule(this.registerOptions.name, vuexModule);\r\n }\r\n };\r\n VuexClassModuleFactory.prototype.buildAccessor = function () {\r\n var _this = this;\r\n var _a = this.registerOptions, store = _a.store, name = _a.name;\r\n var stateSetter = this.moduleOptions.generateMutationSetters\r\n ? function (field, val) {\r\n store.commit(name + \"/\" + _this.getMutationSetterName(field), val);\r\n }\r\n : undefined;\r\n var accessorModule = this.buildThisProxy(__assign({}, store, { state: store.state[name], stateSetter: stateSetter, useNamespaceKey: true, excludeModuleRefs: true, excludeLocalFunctions: true }));\r\n // watch API\r\n accessorModule.$watch = function (fn, callback, options) {\r\n store.watch(function (state, getters) { return fn(_this.buildThisProxy({ state: state[name], getters: getters, useNamespaceKey: true })); }, callback, options);\r\n };\r\n Object.setPrototypeOf(accessorModule, Object.getPrototypeOf(this.instance));\r\n Object.freeze(accessorModule);\r\n return accessorModule;\r\n };\r\n VuexClassModuleFactory.prototype.buildThisProxy = function (proxyDefinition) {\r\n var obj = {};\r\n if (proxyDefinition.state) {\r\n mapValuesToProperty(obj, this.definition.state, function (key) { return proxyDefinition.state[key]; }, proxyDefinition.stateSetter\r\n ? function (key, val) { return proxyDefinition.stateSetter(key, val); }\r\n : function () {\r\n throw Error(\"[vuex-class-module]: Cannot modify state outside mutations.\");\r\n });\r\n }\r\n if (!proxyDefinition.excludeModuleRefs) {\r\n mapValues(obj, this.definition.moduleRefs, function (val) { return val; });\r\n }\r\n var namespaceKey = proxyDefinition.useNamespaceKey ? this.registerOptions.name + \"/\" : \"\";\r\n if (proxyDefinition.getters) {\r\n mapValuesToProperty(obj, this.definition.getters, function (key) { return proxyDefinition.getters[\"\" + namespaceKey + key]; });\r\n }\r\n if (proxyDefinition.commit) {\r\n mapValues(obj, this.definition.mutations, function (mutation, key) {\r\n return function (payload) { return proxyDefinition.commit(\"\" + namespaceKey + key, payload); };\r\n });\r\n }\r\n if (proxyDefinition.dispatch) {\r\n mapValues(obj, this.definition.actions, function (action, key) {\r\n return function (payload) { return proxyDefinition.dispatch(\"\" + namespaceKey + key, payload); };\r\n });\r\n }\r\n if (!proxyDefinition.excludeLocalFunctions) {\r\n mapValues(obj, this.definition.localFunctions, function (localFunction) {\r\n return function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n return localFunction.apply(obj, args);\r\n };\r\n });\r\n }\r\n return obj;\r\n };\r\n VuexClassModuleFactory.prototype.getMutationSetterName = function (stateKey) {\r\n return \"set__\" + stateKey;\r\n };\r\n return VuexClassModuleFactory;\r\n}());\r\nexport { VuexClassModuleFactory };\r\nfunction mapValues(target, source, mapFunc) {\r\n for (var _i = 0, _a = Object.keys(source); _i < _a.length; _i++) {\r\n var key = _a[_i];\r\n target[key] = mapFunc(source[key], key);\r\n }\r\n}\r\nfunction mapValuesToProperty(target, source, get, set) {\r\n var _loop_2 = function (key) {\r\n Object.defineProperty(target, key, {\r\n get: function () { return get(key); },\r\n set: set ? function (val) { return set(key, val); } : undefined\r\n });\r\n };\r\n for (var _i = 0, _a = Object.keys(source); _i < _a.length; _i++) {\r\n var key = _a[_i];\r\n _loop_2(key);\r\n }\r\n}\r\n","import { VuexClassModuleFactory } from \"./module-factory\";\r\nexport function Module(arg) {\r\n if (typeof arg === \"function\") {\r\n return moduleDecoratorFactory()(arg);\r\n }\r\n else {\r\n return moduleDecoratorFactory(arg);\r\n }\r\n}\r\nfunction moduleDecoratorFactory(moduleOptions) {\r\n return function (constructor) {\r\n var accessor = function () {\r\n var _a;\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var instance = new ((_a = constructor.prototype.constructor).bind.apply(_a, [void 0].concat(args)))();\r\n Object.setPrototypeOf(instance, accessor.prototype);\r\n var factory = new VuexClassModuleFactory(constructor, instance, moduleOptions || {});\r\n factory.registerVuexModule();\r\n return factory.buildAccessor();\r\n };\r\n accessor.prototype = Object.create(constructor.prototype);\r\n accessor.prototype.constructor = accessor;\r\n return accessor;\r\n };\r\n}\r\n","/**\n * vuex v3.1.1\n * (c) 2019 Evan You\n * @license MIT\n */\nfunction applyMixin (Vue) {\n var version = Number(Vue.version.split('.')[0]);\n\n if (version >= 2) {\n Vue.mixin({ beforeCreate: vuexInit });\n } else {\n // override init and inject vuex init procedure\n // for 1.x backwards compatibility.\n var _init = Vue.prototype._init;\n Vue.prototype._init = function (options) {\n if ( options === void 0 ) options = {};\n\n options.init = options.init\n ? [vuexInit].concat(options.init)\n : vuexInit;\n _init.call(this, options);\n };\n }\n\n /**\n * Vuex init hook, injected into each instances init hooks list.\n */\n\n function vuexInit () {\n var options = this.$options;\n // store injection\n if (options.store) {\n this.$store = typeof options.store === 'function'\n ? options.store()\n : options.store;\n } else if (options.parent && options.parent.$store) {\n this.$store = options.parent.$store;\n }\n }\n}\n\nvar target = typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\nvar devtoolHook = target.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\nfunction devtoolPlugin (store) {\n if (!devtoolHook) { return }\n\n store._devtoolHook = devtoolHook;\n\n devtoolHook.emit('vuex:init', store);\n\n devtoolHook.on('vuex:travel-to-state', function (targetState) {\n store.replaceState(targetState);\n });\n\n store.subscribe(function (mutation, state) {\n devtoolHook.emit('vuex:mutation', mutation, state);\n });\n}\n\n/**\n * Get the first item that pass the test\n * by second argument function\n *\n * @param {Array} list\n * @param {Function} f\n * @return {*}\n */\n\n/**\n * forEach for object\n */\nfunction forEachValue (obj, fn) {\n Object.keys(obj).forEach(function (key) { return fn(obj[key], key); });\n}\n\nfunction isObject (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\nfunction isPromise (val) {\n return val && typeof val.then === 'function'\n}\n\nfunction assert (condition, msg) {\n if (!condition) { throw new Error((\"[vuex] \" + msg)) }\n}\n\nfunction partial (fn, arg) {\n return function () {\n return fn(arg)\n }\n}\n\n// Base data struct for store's module, package with some attribute and method\nvar Module = function Module (rawModule, runtime) {\n this.runtime = runtime;\n // Store some children item\n this._children = Object.create(null);\n // Store the origin module object which passed by programmer\n this._rawModule = rawModule;\n var rawState = rawModule.state;\n\n // Store the origin module's state\n this.state = (typeof rawState === 'function' ? rawState() : rawState) || {};\n};\n\nvar prototypeAccessors = { namespaced: { configurable: true } };\n\nprototypeAccessors.namespaced.get = function () {\n return !!this._rawModule.namespaced\n};\n\nModule.prototype.addChild = function addChild (key, module) {\n this._children[key] = module;\n};\n\nModule.prototype.removeChild = function removeChild (key) {\n delete this._children[key];\n};\n\nModule.prototype.getChild = function getChild (key) {\n return this._children[key]\n};\n\nModule.prototype.update = function update (rawModule) {\n this._rawModule.namespaced = rawModule.namespaced;\n if (rawModule.actions) {\n this._rawModule.actions = rawModule.actions;\n }\n if (rawModule.mutations) {\n this._rawModule.mutations = rawModule.mutations;\n }\n if (rawModule.getters) {\n this._rawModule.getters = rawModule.getters;\n }\n};\n\nModule.prototype.forEachChild = function forEachChild (fn) {\n forEachValue(this._children, fn);\n};\n\nModule.prototype.forEachGetter = function forEachGetter (fn) {\n if (this._rawModule.getters) {\n forEachValue(this._rawModule.getters, fn);\n }\n};\n\nModule.prototype.forEachAction = function forEachAction (fn) {\n if (this._rawModule.actions) {\n forEachValue(this._rawModule.actions, fn);\n }\n};\n\nModule.prototype.forEachMutation = function forEachMutation (fn) {\n if (this._rawModule.mutations) {\n forEachValue(this._rawModule.mutations, fn);\n }\n};\n\nObject.defineProperties( Module.prototype, prototypeAccessors );\n\nvar ModuleCollection = function ModuleCollection (rawRootModule) {\n // register root module (Vuex.Store options)\n this.register([], rawRootModule, false);\n};\n\nModuleCollection.prototype.get = function get (path) {\n return path.reduce(function (module, key) {\n return module.getChild(key)\n }, this.root)\n};\n\nModuleCollection.prototype.getNamespace = function getNamespace (path) {\n var module = this.root;\n return path.reduce(function (namespace, key) {\n module = module.getChild(key);\n return namespace + (module.namespaced ? key + '/' : '')\n }, '')\n};\n\nModuleCollection.prototype.update = function update$1 (rawRootModule) {\n update([], this.root, rawRootModule);\n};\n\nModuleCollection.prototype.register = function register (path, rawModule, runtime) {\n var this$1 = this;\n if ( runtime === void 0 ) runtime = true;\n\n if (process.env.NODE_ENV !== 'production') {\n assertRawModule(path, rawModule);\n }\n\n var newModule = new Module(rawModule, runtime);\n if (path.length === 0) {\n this.root = newModule;\n } else {\n var parent = this.get(path.slice(0, -1));\n parent.addChild(path[path.length - 1], newModule);\n }\n\n // register nested modules\n if (rawModule.modules) {\n forEachValue(rawModule.modules, function (rawChildModule, key) {\n this$1.register(path.concat(key), rawChildModule, runtime);\n });\n }\n};\n\nModuleCollection.prototype.unregister = function unregister (path) {\n var parent = this.get(path.slice(0, -1));\n var key = path[path.length - 1];\n if (!parent.getChild(key).runtime) { return }\n\n parent.removeChild(key);\n};\n\nfunction update (path, targetModule, newModule) {\n if (process.env.NODE_ENV !== 'production') {\n assertRawModule(path, newModule);\n }\n\n // update target module\n targetModule.update(newModule);\n\n // update nested modules\n if (newModule.modules) {\n for (var key in newModule.modules) {\n if (!targetModule.getChild(key)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n \"[vuex] trying to add a new module '\" + key + \"' on hot reloading, \" +\n 'manual reload is needed'\n );\n }\n return\n }\n update(\n path.concat(key),\n targetModule.getChild(key),\n newModule.modules[key]\n );\n }\n }\n}\n\nvar functionAssert = {\n assert: function (value) { return typeof value === 'function'; },\n expected: 'function'\n};\n\nvar objectAssert = {\n assert: function (value) { return typeof value === 'function' ||\n (typeof value === 'object' && typeof value.handler === 'function'); },\n expected: 'function or object with \"handler\" function'\n};\n\nvar assertTypes = {\n getters: functionAssert,\n mutations: functionAssert,\n actions: objectAssert\n};\n\nfunction assertRawModule (path, rawModule) {\n Object.keys(assertTypes).forEach(function (key) {\n if (!rawModule[key]) { return }\n\n var assertOptions = assertTypes[key];\n\n forEachValue(rawModule[key], function (value, type) {\n assert(\n assertOptions.assert(value),\n makeAssertionMessage(path, key, type, value, assertOptions.expected)\n );\n });\n });\n}\n\nfunction makeAssertionMessage (path, key, type, value, expected) {\n var buf = key + \" should be \" + expected + \" but \\\"\" + key + \".\" + type + \"\\\"\";\n if (path.length > 0) {\n buf += \" in module \\\"\" + (path.join('.')) + \"\\\"\";\n }\n buf += \" is \" + (JSON.stringify(value)) + \".\";\n return buf\n}\n\nvar Vue; // bind on install\n\nvar Store = function Store (options) {\n var this$1 = this;\n if ( options === void 0 ) options = {};\n\n // Auto install if it is not done yet and `window` has `Vue`.\n // To allow users to avoid auto-installation in some cases,\n // this code should be placed here. See #731\n if (!Vue && typeof window !== 'undefined' && window.Vue) {\n install(window.Vue);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert(Vue, \"must call Vue.use(Vuex) before creating a store instance.\");\n assert(typeof Promise !== 'undefined', \"vuex requires a Promise polyfill in this browser.\");\n assert(this instanceof Store, \"store must be called with the new operator.\");\n }\n\n var plugins = options.plugins; if ( plugins === void 0 ) plugins = [];\n var strict = options.strict; if ( strict === void 0 ) strict = false;\n\n // store internal state\n this._committing = false;\n this._actions = Object.create(null);\n this._actionSubscribers = [];\n this._mutations = Object.create(null);\n this._wrappedGetters = Object.create(null);\n this._modules = new ModuleCollection(options);\n this._modulesNamespaceMap = Object.create(null);\n this._subscribers = [];\n this._watcherVM = new Vue();\n\n // bind commit and dispatch to self\n var store = this;\n var ref = this;\n var dispatch = ref.dispatch;\n var commit = ref.commit;\n this.dispatch = function boundDispatch (type, payload) {\n return dispatch.call(store, type, payload)\n };\n this.commit = function boundCommit (type, payload, options) {\n return commit.call(store, type, payload, options)\n };\n\n // strict mode\n this.strict = strict;\n\n var state = this._modules.root.state;\n\n // init root module.\n // this also recursively registers all sub-modules\n // and collects all module getters inside this._wrappedGetters\n installModule(this, state, [], this._modules.root);\n\n // initialize the store vm, which is responsible for the reactivity\n // (also registers _wrappedGetters as computed properties)\n resetStoreVM(this, state);\n\n // apply plugins\n plugins.forEach(function (plugin) { return plugin(this$1); });\n\n var useDevtools = options.devtools !== undefined ? options.devtools : Vue.config.devtools;\n if (useDevtools) {\n devtoolPlugin(this);\n }\n};\n\nvar prototypeAccessors$1 = { state: { configurable: true } };\n\nprototypeAccessors$1.state.get = function () {\n return this._vm._data.$$state\n};\n\nprototypeAccessors$1.state.set = function (v) {\n if (process.env.NODE_ENV !== 'production') {\n assert(false, \"use store.replaceState() to explicit replace store state.\");\n }\n};\n\nStore.prototype.commit = function commit (_type, _payload, _options) {\n var this$1 = this;\n\n // check object-style commit\n var ref = unifyObjectStyle(_type, _payload, _options);\n var type = ref.type;\n var payload = ref.payload;\n var options = ref.options;\n\n var mutation = { type: type, payload: payload };\n var entry = this._mutations[type];\n if (!entry) {\n if (process.env.NODE_ENV !== 'production') {\n console.error((\"[vuex] unknown mutation type: \" + type));\n }\n return\n }\n this._withCommit(function () {\n entry.forEach(function commitIterator (handler) {\n handler(payload);\n });\n });\n this._subscribers.forEach(function (sub) { return sub(mutation, this$1.state); });\n\n if (\n process.env.NODE_ENV !== 'production' &&\n options && options.silent\n ) {\n console.warn(\n \"[vuex] mutation type: \" + type + \". Silent option has been removed. \" +\n 'Use the filter functionality in the vue-devtools'\n );\n }\n};\n\nStore.prototype.dispatch = function dispatch (_type, _payload) {\n var this$1 = this;\n\n // check object-style dispatch\n var ref = unifyObjectStyle(_type, _payload);\n var type = ref.type;\n var payload = ref.payload;\n\n var action = { type: type, payload: payload };\n var entry = this._actions[type];\n if (!entry) {\n if (process.env.NODE_ENV !== 'production') {\n console.error((\"[vuex] unknown action type: \" + type));\n }\n return\n }\n\n try {\n this._actionSubscribers\n .filter(function (sub) { return sub.before; })\n .forEach(function (sub) { return sub.before(action, this$1.state); });\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\"[vuex] error in before action subscribers: \");\n console.error(e);\n }\n }\n\n var result = entry.length > 1\n ? Promise.all(entry.map(function (handler) { return handler(payload); }))\n : entry[0](payload);\n\n return result.then(function (res) {\n try {\n this$1._actionSubscribers\n .filter(function (sub) { return sub.after; })\n .forEach(function (sub) { return sub.after(action, this$1.state); });\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\"[vuex] error in after action subscribers: \");\n console.error(e);\n }\n }\n return res\n })\n};\n\nStore.prototype.subscribe = function subscribe (fn) {\n return genericSubscribe(fn, this._subscribers)\n};\n\nStore.prototype.subscribeAction = function subscribeAction (fn) {\n var subs = typeof fn === 'function' ? { before: fn } : fn;\n return genericSubscribe(subs, this._actionSubscribers)\n};\n\nStore.prototype.watch = function watch (getter, cb, options) {\n var this$1 = this;\n\n if (process.env.NODE_ENV !== 'production') {\n assert(typeof getter === 'function', \"store.watch only accepts a function.\");\n }\n return this._watcherVM.$watch(function () { return getter(this$1.state, this$1.getters); }, cb, options)\n};\n\nStore.prototype.replaceState = function replaceState (state) {\n var this$1 = this;\n\n this._withCommit(function () {\n this$1._vm._data.$$state = state;\n });\n};\n\nStore.prototype.registerModule = function registerModule (path, rawModule, options) {\n if ( options === void 0 ) options = {};\n\n if (typeof path === 'string') { path = [path]; }\n\n if (process.env.NODE_ENV !== 'production') {\n assert(Array.isArray(path), \"module path must be a string or an Array.\");\n assert(path.length > 0, 'cannot register the root module by using registerModule.');\n }\n\n this._modules.register(path, rawModule);\n installModule(this, this.state, path, this._modules.get(path), options.preserveState);\n // reset store to update getters...\n resetStoreVM(this, this.state);\n};\n\nStore.prototype.unregisterModule = function unregisterModule (path) {\n var this$1 = this;\n\n if (typeof path === 'string') { path = [path]; }\n\n if (process.env.NODE_ENV !== 'production') {\n assert(Array.isArray(path), \"module path must be a string or an Array.\");\n }\n\n this._modules.unregister(path);\n this._withCommit(function () {\n var parentState = getNestedState(this$1.state, path.slice(0, -1));\n Vue.delete(parentState, path[path.length - 1]);\n });\n resetStore(this);\n};\n\nStore.prototype.hotUpdate = function hotUpdate (newOptions) {\n this._modules.update(newOptions);\n resetStore(this, true);\n};\n\nStore.prototype._withCommit = function _withCommit (fn) {\n var committing = this._committing;\n this._committing = true;\n fn();\n this._committing = committing;\n};\n\nObject.defineProperties( Store.prototype, prototypeAccessors$1 );\n\nfunction genericSubscribe (fn, subs) {\n if (subs.indexOf(fn) < 0) {\n subs.push(fn);\n }\n return function () {\n var i = subs.indexOf(fn);\n if (i > -1) {\n subs.splice(i, 1);\n }\n }\n}\n\nfunction resetStore (store, hot) {\n store._actions = Object.create(null);\n store._mutations = Object.create(null);\n store._wrappedGetters = Object.create(null);\n store._modulesNamespaceMap = Object.create(null);\n var state = store.state;\n // init all modules\n installModule(store, state, [], store._modules.root, true);\n // reset vm\n resetStoreVM(store, state, hot);\n}\n\nfunction resetStoreVM (store, state, hot) {\n var oldVm = store._vm;\n\n // bind store public getters\n store.getters = {};\n var wrappedGetters = store._wrappedGetters;\n var computed = {};\n forEachValue(wrappedGetters, function (fn, key) {\n // use computed to leverage its lazy-caching mechanism\n // direct inline function use will lead to closure preserving oldVm.\n // using partial to return function with only arguments preserved in closure enviroment.\n computed[key] = partial(fn, store);\n Object.defineProperty(store.getters, key, {\n get: function () { return store._vm[key]; },\n enumerable: true // for local getters\n });\n });\n\n // use a Vue instance to store the state tree\n // suppress warnings just in case the user has added\n // some funky global mixins\n var silent = Vue.config.silent;\n Vue.config.silent = true;\n store._vm = new Vue({\n data: {\n $$state: state\n },\n computed: computed\n });\n Vue.config.silent = silent;\n\n // enable strict mode for new vm\n if (store.strict) {\n enableStrictMode(store);\n }\n\n if (oldVm) {\n if (hot) {\n // dispatch changes in all subscribed watchers\n // to force getter re-evaluation for hot reloading.\n store._withCommit(function () {\n oldVm._data.$$state = null;\n });\n }\n Vue.nextTick(function () { return oldVm.$destroy(); });\n }\n}\n\nfunction installModule (store, rootState, path, module, hot) {\n var isRoot = !path.length;\n var namespace = store._modules.getNamespace(path);\n\n // register in namespace map\n if (module.namespaced) {\n store._modulesNamespaceMap[namespace] = module;\n }\n\n // set state\n if (!isRoot && !hot) {\n var parentState = getNestedState(rootState, path.slice(0, -1));\n var moduleName = path[path.length - 1];\n store._withCommit(function () {\n Vue.set(parentState, moduleName, module.state);\n });\n }\n\n var local = module.context = makeLocalContext(store, namespace, path);\n\n module.forEachMutation(function (mutation, key) {\n var namespacedType = namespace + key;\n registerMutation(store, namespacedType, mutation, local);\n });\n\n module.forEachAction(function (action, key) {\n var type = action.root ? key : namespace + key;\n var handler = action.handler || action;\n registerAction(store, type, handler, local);\n });\n\n module.forEachGetter(function (getter, key) {\n var namespacedType = namespace + key;\n registerGetter(store, namespacedType, getter, local);\n });\n\n module.forEachChild(function (child, key) {\n installModule(store, rootState, path.concat(key), child, hot);\n });\n}\n\n/**\n * make localized dispatch, commit, getters and state\n * if there is no namespace, just use root ones\n */\nfunction makeLocalContext (store, namespace, path) {\n var noNamespace = namespace === '';\n\n var local = {\n dispatch: noNamespace ? store.dispatch : function (_type, _payload, _options) {\n var args = unifyObjectStyle(_type, _payload, _options);\n var payload = args.payload;\n var options = args.options;\n var type = args.type;\n\n if (!options || !options.root) {\n type = namespace + type;\n if (process.env.NODE_ENV !== 'production' && !store._actions[type]) {\n console.error((\"[vuex] unknown local action type: \" + (args.type) + \", global type: \" + type));\n return\n }\n }\n\n return store.dispatch(type, payload)\n },\n\n commit: noNamespace ? store.commit : function (_type, _payload, _options) {\n var args = unifyObjectStyle(_type, _payload, _options);\n var payload = args.payload;\n var options = args.options;\n var type = args.type;\n\n if (!options || !options.root) {\n type = namespace + type;\n if (process.env.NODE_ENV !== 'production' && !store._mutations[type]) {\n console.error((\"[vuex] unknown local mutation type: \" + (args.type) + \", global type: \" + type));\n return\n }\n }\n\n store.commit(type, payload, options);\n }\n };\n\n // getters and state object must be gotten lazily\n // because they will be changed by vm update\n Object.defineProperties(local, {\n getters: {\n get: noNamespace\n ? function () { return store.getters; }\n : function () { return makeLocalGetters(store, namespace); }\n },\n state: {\n get: function () { return getNestedState(store.state, path); }\n }\n });\n\n return local\n}\n\nfunction makeLocalGetters (store, namespace) {\n var gettersProxy = {};\n\n var splitPos = namespace.length;\n Object.keys(store.getters).forEach(function (type) {\n // skip if the target getter is not match this namespace\n if (type.slice(0, splitPos) !== namespace) { return }\n\n // extract local getter type\n var localType = type.slice(splitPos);\n\n // Add a port to the getters proxy.\n // Define as getter property because\n // we do not want to evaluate the getters in this time.\n Object.defineProperty(gettersProxy, localType, {\n get: function () { return store.getters[type]; },\n enumerable: true\n });\n });\n\n return gettersProxy\n}\n\nfunction registerMutation (store, type, handler, local) {\n var entry = store._mutations[type] || (store._mutations[type] = []);\n entry.push(function wrappedMutationHandler (payload) {\n handler.call(store, local.state, payload);\n });\n}\n\nfunction registerAction (store, type, handler, local) {\n var entry = store._actions[type] || (store._actions[type] = []);\n entry.push(function wrappedActionHandler (payload, cb) {\n var res = handler.call(store, {\n dispatch: local.dispatch,\n commit: local.commit,\n getters: local.getters,\n state: local.state,\n rootGetters: store.getters,\n rootState: store.state\n }, payload, cb);\n if (!isPromise(res)) {\n res = Promise.resolve(res);\n }\n if (store._devtoolHook) {\n return res.catch(function (err) {\n store._devtoolHook.emit('vuex:error', err);\n throw err\n })\n } else {\n return res\n }\n });\n}\n\nfunction registerGetter (store, type, rawGetter, local) {\n if (store._wrappedGetters[type]) {\n if (process.env.NODE_ENV !== 'production') {\n console.error((\"[vuex] duplicate getter key: \" + type));\n }\n return\n }\n store._wrappedGetters[type] = function wrappedGetter (store) {\n return rawGetter(\n local.state, // local state\n local.getters, // local getters\n store.state, // root state\n store.getters // root getters\n )\n };\n}\n\nfunction enableStrictMode (store) {\n store._vm.$watch(function () { return this._data.$$state }, function () {\n if (process.env.NODE_ENV !== 'production') {\n assert(store._committing, \"do not mutate vuex store state outside mutation handlers.\");\n }\n }, { deep: true, sync: true });\n}\n\nfunction getNestedState (state, path) {\n return path.length\n ? path.reduce(function (state, key) { return state[key]; }, state)\n : state\n}\n\nfunction unifyObjectStyle (type, payload, options) {\n if (isObject(type) && type.type) {\n options = payload;\n payload = type;\n type = type.type;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert(typeof type === 'string', (\"expects string as the type, but found \" + (typeof type) + \".\"));\n }\n\n return { type: type, payload: payload, options: options }\n}\n\nfunction install (_Vue) {\n if (Vue && _Vue === Vue) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(\n '[vuex] already installed. Vue.use(Vuex) should be called only once.'\n );\n }\n return\n }\n Vue = _Vue;\n applyMixin(Vue);\n}\n\n/**\n * Reduce the code which written in Vue.js for getting the state.\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} states # Object's item can be a function which accept state and getters for param, you can do something for state and getters in it.\n * @param {Object}\n */\nvar mapState = normalizeNamespace(function (namespace, states) {\n var res = {};\n normalizeMap(states).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n res[key] = function mappedState () {\n var state = this.$store.state;\n var getters = this.$store.getters;\n if (namespace) {\n var module = getModuleByNamespace(this.$store, 'mapState', namespace);\n if (!module) {\n return\n }\n state = module.context.state;\n getters = module.context.getters;\n }\n return typeof val === 'function'\n ? val.call(this, state, getters)\n : state[val]\n };\n // mark vuex getter for devtools\n res[key].vuex = true;\n });\n return res\n});\n\n/**\n * Reduce the code which written in Vue.js for committing the mutation\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} mutations # Object's item can be a function which accept `commit` function as the first param, it can accept anthor params. You can commit mutation and do any other things in this function. specially, You need to pass anthor params from the mapped function.\n * @return {Object}\n */\nvar mapMutations = normalizeNamespace(function (namespace, mutations) {\n var res = {};\n normalizeMap(mutations).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n res[key] = function mappedMutation () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n // Get the commit method from store\n var commit = this.$store.commit;\n if (namespace) {\n var module = getModuleByNamespace(this.$store, 'mapMutations', namespace);\n if (!module) {\n return\n }\n commit = module.context.commit;\n }\n return typeof val === 'function'\n ? val.apply(this, [commit].concat(args))\n : commit.apply(this.$store, [val].concat(args))\n };\n });\n return res\n});\n\n/**\n * Reduce the code which written in Vue.js for getting the getters\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} getters\n * @return {Object}\n */\nvar mapGetters = normalizeNamespace(function (namespace, getters) {\n var res = {};\n normalizeMap(getters).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n // The namespace has been mutated by normalizeNamespace\n val = namespace + val;\n res[key] = function mappedGetter () {\n if (namespace && !getModuleByNamespace(this.$store, 'mapGetters', namespace)) {\n return\n }\n if (process.env.NODE_ENV !== 'production' && !(val in this.$store.getters)) {\n console.error((\"[vuex] unknown getter: \" + val));\n return\n }\n return this.$store.getters[val]\n };\n // mark vuex getter for devtools\n res[key].vuex = true;\n });\n return res\n});\n\n/**\n * Reduce the code which written in Vue.js for dispatch the action\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} actions # Object's item can be a function which accept `dispatch` function as the first param, it can accept anthor params. You can dispatch action and do any other things in this function. specially, You need to pass anthor params from the mapped function.\n * @return {Object}\n */\nvar mapActions = normalizeNamespace(function (namespace, actions) {\n var res = {};\n normalizeMap(actions).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n res[key] = function mappedAction () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n // get dispatch function from store\n var dispatch = this.$store.dispatch;\n if (namespace) {\n var module = getModuleByNamespace(this.$store, 'mapActions', namespace);\n if (!module) {\n return\n }\n dispatch = module.context.dispatch;\n }\n return typeof val === 'function'\n ? val.apply(this, [dispatch].concat(args))\n : dispatch.apply(this.$store, [val].concat(args))\n };\n });\n return res\n});\n\n/**\n * Rebinding namespace param for mapXXX function in special scoped, and return them by simple object\n * @param {String} namespace\n * @return {Object}\n */\nvar createNamespacedHelpers = function (namespace) { return ({\n mapState: mapState.bind(null, namespace),\n mapGetters: mapGetters.bind(null, namespace),\n mapMutations: mapMutations.bind(null, namespace),\n mapActions: mapActions.bind(null, namespace)\n}); };\n\n/**\n * Normalize the map\n * normalizeMap([1, 2, 3]) => [ { key: 1, val: 1 }, { key: 2, val: 2 }, { key: 3, val: 3 } ]\n * normalizeMap({a: 1, b: 2, c: 3}) => [ { key: 'a', val: 1 }, { key: 'b', val: 2 }, { key: 'c', val: 3 } ]\n * @param {Array|Object} map\n * @return {Object}\n */\nfunction normalizeMap (map) {\n return Array.isArray(map)\n ? map.map(function (key) { return ({ key: key, val: key }); })\n : Object.keys(map).map(function (key) { return ({ key: key, val: map[key] }); })\n}\n\n/**\n * Return a function expect two param contains namespace and map. it will normalize the namespace and then the param's function will handle the new namespace and the map.\n * @param {Function} fn\n * @return {Function}\n */\nfunction normalizeNamespace (fn) {\n return function (namespace, map) {\n if (typeof namespace !== 'string') {\n map = namespace;\n namespace = '';\n } else if (namespace.charAt(namespace.length - 1) !== '/') {\n namespace += '/';\n }\n return fn(namespace, map)\n }\n}\n\n/**\n * Search a special module from store by namespace. if module not exist, print error message.\n * @param {Object} store\n * @param {String} helper\n * @param {String} namespace\n * @return {Object}\n */\nfunction getModuleByNamespace (store, helper, namespace) {\n var module = store._modulesNamespaceMap[namespace];\n if (process.env.NODE_ENV !== 'production' && !module) {\n console.error((\"[vuex] module namespace not found in \" + helper + \"(): \" + namespace));\n }\n return module\n}\n\nvar index_esm = {\n Store: Store,\n install: install,\n version: '3.1.1',\n mapState: mapState,\n mapMutations: mapMutations,\n mapGetters: mapGetters,\n mapActions: mapActions,\n createNamespacedHelpers: createNamespacedHelpers\n};\n\nexport default index_esm;\nexport { Store, install, mapState, mapMutations, mapGetters, mapActions, createNamespacedHelpers };\n","const brand = \"Lodge Cast Iron\";\n\n/**\n * A GTM object\n * @typedef {{\n * \tevent: string,\n * \tcategory?: string,\n * \tlabel?: string,\n * \tvalue: string,\n * }} GTMObject\n */\n\n/**\n * Enforces custom events being there\n * @param {GTMObject} data\n */\nexport const gtmCustomEventPush = (data) => {\n\tif (!data.event) console.error(\"No name given for Custom Event\");\n\tgtmPush(data);\n};\n\n/**\n * Enforces custom events being there\n * @param {GTMObject} data\n */\nexport const gtmPush = (data) => {\n\tif (window.dataLayer) {\n\t\tconsole.log(\"GTM data was sent as follows:\", data);\n\t\twindow.dataLayer.push(data);\n\t} else {\n\t\tconsole.warn(\n\t\t\t\"GTM does not exist or is not enabled on this environment. The following data would have been sent:\",\n\t\t);\n\t\tconsole.log(data);\n\t}\n};\n\nexport const massageProducts = (product, userOpt = null) => {\n\tconst { variations } = product;\n\n\t// Set up basic option object\n\tlet opt = {\n\t\tvariant: false,\n\t\tshowPosition: false,\n\t\toffset: 0,\n\t};\n\n\t// Merge options if required w/ the defaults being overwritten\n\tif (userOpt) {\n\t\topt = Object.assign({}, opt, userOpt);\n\t}\n\n\treturn variations.map((p, idx) => {\n\t\tif (!p.sku) console.warn(\"Product has no SKU for GTM\");\n\n\t\tconst obj = {\n\t\t\tid: p.sku || `No SKU for ${p.title}`,\n\t\t\tname: p.title || product.title,\n\t\t\tprice: p.price,\n\t\t\tbrand,\n\t\t};\n\n\t\tif (opt.variant) {\n\t\t\tobj.variant = [\n\t\t\t\tp.shape,\n\t\t\t\tp.color || (p.attributes && p.attributes.attribute_color),\n\t\t\t\tp.material,\n\t\t\t\tp.size || (p.attributes && p.attributes.attribute_size),\n\t\t\t]\n\t\t\t\t.filter((i) => i)\n\t\t\t\t.reduce((acc, curr) => {\n\t\t\t\t\treturn (acc += `${acc.length === 0 ? \"\" : \"|\"}${curr}`);\n\t\t\t\t}, \"\")\n\t\t\t\t.toLowerCase();\n\t\t}\n\n\t\tif (opt.showPosition) {\n\t\t\tobj.position = opt.offset + idx;\n\t\t}\n\n\t\tif (p.category) {\n\t\t\tobj.category = p.category;\n\t\t}\n\n\t\treturn obj;\n\t});\n};\n\n/**\n * Creates the impression data structure based off an array of products\n * @param {Product[]} products\n * @param {string} filterList\n */\nexport const massageImpressions = (products, filterList = \"\") => {\n\tconsole.log(filterList);\n\treturn products.map((p, idx) => {\n\t\tconst obj = {\n\t\t\tname: p.title,\n\t\t\tbrand,\n\t\t\tposition: idx,\n\t\t\tlist: `Shop All - ${\n\t\t\t\tfilterList ? decodeURIComponent(filterList) : \"No Filters\"\n\t\t\t}`,\n\t\t};\n\n\t\tif (p.variations && p.variations.length) {\n\t\t\tobj.price = p.variations[0].price;\n\n\t\t\tconst category = p.variations.reduce((acc, curr) => {\n\t\t\t\treturn !curr.category\n\t\t\t\t\t? acc\n\t\t\t\t\t: (acc += `${acc.length === 0 ? \"\" : \",\"}${curr.category}`);\n\t\t\t}, \"\");\n\n\t\t\tif (category) {\n\t\t\t\tobj.category = category;\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t});\n};\n\nexport const productClick = (product, el, variant = null, price = null) => {\n\tconsole.log(123, price);\n\tconst massagedProduct = {\n\t\tname: product.title,\n\t\tbrand,\n\t\tprice: price ? price : product.variations[0].price,\n\t\tposition: [...el.parentNode.children].findIndex((c) => c === el),\n\t\tvariant: variant ? variant : \"N/A\",\n\t};\n\n\tgtmCustomEventPush({\n\t\tevent: \"ProductClick\",\n\t\tecommerce: {\n\t\t\tactionField: { list: \"Shop All Page\" },\n\t\t\tproducts: [massagedProduct],\n\t\t},\n\t});\n};\n\nexport const gtmCartAdd = (product, quantity, productItem = {}) => {\n\tcartProduct(product, quantity, {\n\t\tevent: \"AddToCart\",\n\t\ttype: \"add\",\n\t\tproductItem,\n\t});\n};\n\nexport const gtmCartRemove = (product, quantity, productItem = {}) => {\n\tcartProduct(product, quantity, {\n\t\tevent: \"RemoveFromCart\",\n\t\ttype: \"remove\",\n\t\tproductItem,\n\t});\n};\n\nexport const cartProduct = (\n\tproduct,\n\tquantity,\n\t{ event, type, productItem = {} },\n) => {\n\tgtmCustomEventPush({\n\t\tevent,\n\t\tecommerce: {\n\t\t\t[type]: {\n\t\t\t\tproducts: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: product.title || product.name || product.product_name,\n\t\t\t\t\t\tid: product.sku || product.id || product.product_id,\n\t\t\t\t\t\tbrand,\n\t\t\t\t\t\tprice: product.price || productItem.price,\n\t\t\t\t\t\tquantity,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t});\n};\nexport const ecommerceDetail = (product) => {\n\tconst products = massageProducts(\n\t\t{ variations: [product] },\n\t\t{ variant: true },\n\t);\n\tgtmCustomEventPush({\n\t\tevent: \"ProductDetailView\",\n\t\tecommerce: {\n\t\t\tdetail: {\n\t\t\t\tactionField: {\n\t\t\t\t\tlist: \"Product Detail Page\",\n\t\t\t\t},\n\t\t\t\tproducts,\n\t\t\t},\n\t\t},\n\t});\n};\n\nconst sfraGetItemInfo = (el) => {\n\tconst row = el.closest(\".product-info\");\n\tconst productInfo = {};\n\n\tconst title = row.querySelector(\".item-attributes .h7\");\n\tif (title) productInfo.title = title.innerText;\n\n\tconst sku = row\n\t\t.querySelector(\".item-attributes .size-mini\")\n\t\t.innerText.split(\"SKU: \")[1];\n\tif (sku) productInfo.id = sku;\n\n\tconst price = row.querySelector(\".sales .value\");\n\tif (price) productInfo.price = price.getAttribute(\"content\");\n\n\tconst quantity = row.querySelector(\".quantity-form select\");\n\tif (quantity) productInfo.quantity = quantity.value;\n\n\treturn productInfo;\n};\n\nconst sfraGetQuickAddInfo = (el) => {\n\tconst row = el.closest(\".recommendation.product-detail\");\n\tconst sku = row.getAttribute(\"data-pid\");\n\tconst title = row.querySelector(\".name\").innerText;\n\tconst price = row.querySelector(\".sales .value\").getAttribute(\"content\");\n\n\treturn {\n\t\tid: sku,\n\t\tname: title,\n\t\tquantity: 1,\n\t\tprice,\n\t};\n};\n\nexport const sfraQuickAddCartEvents = () => {\n\tconst buttons = document.querySelectorAll(\n\t\t\".recommendation.product-detail .add-to-cart-global\",\n\t);\n\tconsole.log(\"quick add\", buttons);\n\tbuttons.forEach((el) => {\n\t\tconsole.log(\"Quick Add\", el);\n\t\tel.addEventListener(\"click\", (_) => {\n\t\t\tconst productItem = sfraGetQuickAddInfo(el);\n\t\t\tcartProduct(productItem, productItem.quantity, {\n\t\t\t\tevent: \"AddToCart\",\n\t\t\t\ttype: \"add\",\n\t\t\t});\n\t\t});\n\t});\n};\nexport const sfraRemoveFromCartEvents = () => {\n\tconst buttons = document.querySelectorAll(\".remove-product.btn\");\n\tconsole.log(\"remove buttons\", buttons);\n\tbuttons.forEach((el) => {\n\t\tel.addEventListener(\"click\", (e) => {\n\t\t\tconsole.log(\"Remove From Cart\", el);\n\t\t\tconst productItem = sfraGetItemInfo(el);\n\t\t\tcartProduct(productItem, productItem.quantity, {\n\t\t\t\tevent: \"RemoveFromCart\",\n\t\t\t\ttype: \"remove\",\n\t\t\t});\n\t\t});\n\t});\n};\nexport const sfraUpdateCartQuantity = () => {\n\tconst selects = document.querySelectorAll(\"select.quantity.custom-select\");\n\tconsole.log(selects);\n\tselects.forEach((el) => {\n\t\tconst value = el.value;\n\t\tel.parentNode.setAttribute(\"gtm-product-count\", value);\n\t\tel.addEventListener(\"change\", (e) => {\n\t\t\tconsole.log(\"Changing select\", el);\n\t\t\tconst newValue = parseInt(el.value, 10);\n\t\t\tconst oldValue = parseInt(\n\t\t\t\tel.parentNode.getAttribute(\"gtm-product-count\"),\n\t\t\t\t10,\n\t\t\t);\n\t\t\tel.parentNode.setAttribute(\"gtm-product-count\", newValue);\n\t\t\tconst wasAnAddition = newValue - oldValue > 0;\n\t\t\tconst productItem = sfraGetItemInfo(el);\n\t\t\tcartProduct(productItem, productItem.quantity, {\n\t\t\t\tevent: wasAnAddition ? \"AddToCart\" : \"RemoveFromCart\",\n\t\t\t\ttype: wasAnAddition ? \"add\" : \"remove\",\n\t\t\t});\n\t\t});\n\t});\n};\n\nexport const sfraMutationObserverForPaypal = () => {\n\tconst paypalCustomEvent = (e) => {\n\t\tif (e.data) {\n\t\t\ttry {\n\t\t\t\tconst _data = JSON.parse(e.data);\n\t\t\t\tconst messageName =\n\t\t\t\t\t_data && _data.__postRobot__ && _data.__postRobot__.data\n\t\t\t\t\t\t? _data.__postRobot__.data.name\n\t\t\t\t\t\t: \"UnknownStep\";\n\t\t\t\tif (messageName === \"onAuthorize\") {\n\t\t\t\t\tgtmCustomEventPush({\n\t\t\t\t\t\tevent: EVENTS.PAYPAL_AUTHORIZED,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// do nothing\n\t\t\t}\n\t\t}\n\t};\n\twindow.addEventListener(\"message\", paypalCustomEvent);\n};\n\nexport const EVENTS = {\n\tBOTTOM_PROMO: \"BOTTOM_PROMO\",\n\tHERO_VIDEO: \"HERO_VIDEO\",\n\tHERO_VIDEO_TIMING: \"HERO_VIDEO_TIMING\",\n\tSTANDALONE_CHAT_NOW: \"STANDALONE_CHAT_NOW\",\n\tCUSTOMER_RECOMMENDATION_FAILURE: \"CustomerRecommendationFailure\",\n\tASSOCIATED_PRODUCT_FAILURE: \"AssociatedProductFailure\",\n\tPRODUCT_FAILURE: \"ProductFailure\",\n\tPAYPAL_AUTHORIZED: \"PaypalAuthorized\",\n\tBACK_IN_STOCK_NOTIFICATION: \"BackInStockNotification\",\n\tSEEN_OUT_OF_STOCK: \"SeenOutOfStock\",\n\tDISTRIBUTOR_SEARCH_FAILURE: \"DistributorSearchFailure\",\n\tDISTRIBUTOR_SEARCH_SELECT: \"DistributorSearchSelect\",\n\tDISTRIBUTOR_SEARCH_DEEPLINK: \"DistributorSearchDeeplink\",\n\tQUICK_ANSWER_OPEN: \"QuickAnswerDeepOpen\",\n\tQUICK_ANSWER_SEEN: \"QuickAnswerSeen\",\n\tWIZARD_PERSONA: \"WizardPersona\",\n\tWIZARD_PAGE_VIEW: \"WizardPageView\",\n\tWIZARD_RESULTS: \"WizardResults\",\n\tWIZARD_RECOMMENDATIONS: \"WizardRecommendations\",\n\tLIFT_DATA: \"liftData\",\n};\n","class LodgeStorage {\n\tconstructor(type) {\n\t\tthis.exists = window[type] ? true : false;\n\t\tif (this.exists) {\n\t\t\tthis.storage = window[type];\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @param {string} key\n\t */\n\tget(key) {\n\t\tif (this.exists) {\n\t\t\tconst item = this.storage.getItem(`lodge_${key}`);\n\t\t\treturn item ? JSON.parse(item) : null;\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @param {key} key has lodge_ prepended to it\n\t */\n\tset(key, data) {\n\t\tif (this.exists) {\n\t\t\tthis.storage.setItem(`lodge_${key}`, JSON.stringify(data));\n\t\t}\n\t}\n}\n\nexport const lodgeSessionStorage = new LodgeStorage(\"sessionStorage\");\nexport const lodgeLocalStorage = new LodgeStorage(\"localStorage\");\n","import { isRegExp } from './is';\n/**\n * Truncates given string to the maximum characters count\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nexport function truncate(str, max) {\n if (max === void 0) { max = 0; }\n // tslint:disable-next-line:strict-type-predicates\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n return str.length <= max ? str : str.substr(0, max) + \"...\";\n}\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nexport function snipLine(line, colno) {\n var newLine = line;\n var ll = newLine.length;\n if (ll <= 150) {\n return newLine;\n }\n if (colno > ll) {\n colno = ll; // tslint:disable-line:no-parameter-reassignment\n }\n var start = Math.max(colno - 60, 0);\n if (start < 5) {\n start = 0;\n }\n var end = Math.min(start + 140, ll);\n if (end > ll - 5) {\n end = ll;\n }\n if (end === ll) {\n start = Math.max(end - 140, 0);\n }\n newLine = newLine.slice(start, end);\n if (start > 0) {\n newLine = \"'{snip} \" + newLine;\n }\n if (end < ll) {\n newLine += ' {snip}';\n }\n return newLine;\n}\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns Joined values\n */\nexport function safeJoin(input, delimiter) {\n if (!Array.isArray(input)) {\n return '';\n }\n var output = [];\n // tslint:disable-next-line:prefer-for-of\n for (var i = 0; i < input.length; i++) {\n var value = input[i];\n try {\n output.push(String(value));\n }\n catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n return output.join(delimiter);\n}\n/**\n * Checks if the value matches a regex or includes the string\n * @param value The string value to be checked against\n * @param pattern Either a regex or a string that must be contained in value\n */\nexport function isMatchingPattern(value, pattern) {\n if (isRegExp(pattern)) {\n return pattern.test(value);\n }\n if (typeof pattern === 'string') {\n return value.indexOf(pattern) !== -1;\n }\n return false;\n}\n//# sourceMappingURL=string.js.map","import * as tslib_1 from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { getEventDescription, isMatchingPattern, logger } from '@sentry/utils';\n// \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\nvar DEFAULT_IGNORE_ERRORS = [/^Script error\\.?$/, /^Javascript error: Script error\\.? on line 0$/];\n/** Inbound filters configurable by the user */\nvar InboundFilters = /** @class */ (function () {\n function InboundFilters(_options) {\n if (_options === void 0) { _options = {}; }\n this._options = _options;\n /**\n * @inheritDoc\n */\n this.name = InboundFilters.id;\n }\n /**\n * @inheritDoc\n */\n InboundFilters.prototype.setupOnce = function () {\n addGlobalEventProcessor(function (event) {\n var hub = getCurrentHub();\n if (!hub) {\n return event;\n }\n var self = hub.getIntegration(InboundFilters);\n if (self) {\n var client = hub.getClient();\n var clientOptions = client ? client.getOptions() : {};\n var options = self._mergeOptions(clientOptions);\n if (self._shouldDropEvent(event, options)) {\n return null;\n }\n }\n return event;\n });\n };\n /** JSDoc */\n InboundFilters.prototype._shouldDropEvent = function (event, options) {\n if (this._isSentryError(event, options)) {\n logger.warn(\"Event dropped due to being internal Sentry Error.\\nEvent: \" + getEventDescription(event));\n return true;\n }\n if (this._isIgnoredError(event, options)) {\n logger.warn(\"Event dropped due to being matched by `ignoreErrors` option.\\nEvent: \" + getEventDescription(event));\n return true;\n }\n if (this._isBlacklistedUrl(event, options)) {\n logger.warn(\"Event dropped due to being matched by `blacklistUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n return true;\n }\n if (!this._isWhitelistedUrl(event, options)) {\n logger.warn(\"Event dropped due to not being matched by `whitelistUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n return true;\n }\n return false;\n };\n /** JSDoc */\n InboundFilters.prototype._isSentryError = function (event, options) {\n if (options === void 0) { options = {}; }\n if (!options.ignoreInternal) {\n return false;\n }\n try {\n return ((event &&\n event.exception &&\n event.exception.values &&\n event.exception.values[0] &&\n event.exception.values[0].type === 'SentryError') ||\n false);\n }\n catch (_oO) {\n return false;\n }\n };\n /** JSDoc */\n InboundFilters.prototype._isIgnoredError = function (event, options) {\n if (options === void 0) { options = {}; }\n if (!options.ignoreErrors || !options.ignoreErrors.length) {\n return false;\n }\n return this._getPossibleEventMessages(event).some(function (message) {\n // Not sure why TypeScript complains here...\n return options.ignoreErrors.some(function (pattern) { return isMatchingPattern(message, pattern); });\n });\n };\n /** JSDoc */\n InboundFilters.prototype._isBlacklistedUrl = function (event, options) {\n if (options === void 0) { options = {}; }\n // TODO: Use Glob instead?\n if (!options.blacklistUrls || !options.blacklistUrls.length) {\n return false;\n }\n var url = this._getEventFilterUrl(event);\n return !url ? false : options.blacklistUrls.some(function (pattern) { return isMatchingPattern(url, pattern); });\n };\n /** JSDoc */\n InboundFilters.prototype._isWhitelistedUrl = function (event, options) {\n if (options === void 0) { options = {}; }\n // TODO: Use Glob instead?\n if (!options.whitelistUrls || !options.whitelistUrls.length) {\n return true;\n }\n var url = this._getEventFilterUrl(event);\n return !url ? true : options.whitelistUrls.some(function (pattern) { return isMatchingPattern(url, pattern); });\n };\n /** JSDoc */\n InboundFilters.prototype._mergeOptions = function (clientOptions) {\n if (clientOptions === void 0) { clientOptions = {}; }\n return {\n blacklistUrls: tslib_1.__spread((this._options.blacklistUrls || []), (clientOptions.blacklistUrls || [])),\n ignoreErrors: tslib_1.__spread((this._options.ignoreErrors || []), (clientOptions.ignoreErrors || []), DEFAULT_IGNORE_ERRORS),\n ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true,\n whitelistUrls: tslib_1.__spread((this._options.whitelistUrls || []), (clientOptions.whitelistUrls || [])),\n };\n };\n /** JSDoc */\n InboundFilters.prototype._getPossibleEventMessages = function (event) {\n if (event.message) {\n return [event.message];\n }\n if (event.exception) {\n try {\n var _a = (event.exception.values && event.exception.values[0]) || {}, _b = _a.type, type = _b === void 0 ? '' : _b, _c = _a.value, value = _c === void 0 ? '' : _c;\n return [\"\" + value, type + \": \" + value];\n }\n catch (oO) {\n logger.error(\"Cannot extract message for event \" + getEventDescription(event));\n return [];\n }\n }\n return [];\n };\n /** JSDoc */\n InboundFilters.prototype._getEventFilterUrl = function (event) {\n try {\n if (event.stacktrace) {\n var frames_1 = event.stacktrace.frames;\n return (frames_1 && frames_1[frames_1.length - 1].filename) || null;\n }\n if (event.exception) {\n var frames_2 = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames;\n return (frames_2 && frames_2[frames_2.length - 1].filename) || null;\n }\n return null;\n }\n catch (oO) {\n logger.error(\"Cannot extract url for event \" + getEventDescription(event));\n return null;\n }\n };\n /**\n * @inheritDoc\n */\n InboundFilters.id = 'InboundFilters';\n return InboundFilters;\n}());\nexport { InboundFilters };\n//# sourceMappingURL=inboundfilters.js.map","var originalFunctionToString;\n/** Patch toString calls to return proper name for wrapped functions */\nvar FunctionToString = /** @class */ (function () {\n function FunctionToString() {\n /**\n * @inheritDoc\n */\n this.name = FunctionToString.id;\n }\n /**\n * @inheritDoc\n */\n FunctionToString.prototype.setupOnce = function () {\n originalFunctionToString = Function.prototype.toString;\n Function.prototype.toString = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var context = this.__sentry_original__ || this;\n // tslint:disable-next-line:no-unsafe-any\n return originalFunctionToString.apply(context, args);\n };\n };\n /**\n * @inheritDoc\n */\n FunctionToString.id = 'FunctionToString';\n return FunctionToString;\n}());\nexport { FunctionToString };\n//# sourceMappingURL=functiontostring.js.map","export var setPrototypeOf = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties); // tslint:disable-line:no-unbound-method\n/**\n * setPrototypeOf polyfill using __proto__\n */\nfunction setProtoOf(obj, proto) {\n // @ts-ignore\n obj.__proto__ = proto;\n return obj;\n}\n/**\n * setPrototypeOf polyfill using mixin\n */\nfunction mixinProperties(obj, proto) {\n for (var prop in proto) {\n if (!obj.hasOwnProperty(prop)) {\n // @ts-ignore\n obj[prop] = proto[prop];\n }\n }\n return obj;\n}\n//# sourceMappingURL=polyfill.js.map","import * as tslib_1 from \"tslib\";\nimport { setPrototypeOf } from './polyfill';\n/** An error emitted by Sentry SDKs and related utilities. */\nvar SentryError = /** @class */ (function (_super) {\n tslib_1.__extends(SentryError, _super);\n function SentryError(message) {\n var _newTarget = this.constructor;\n var _this = _super.call(this, message) || this;\n _this.message = message;\n // tslint:disable:no-unsafe-any\n _this.name = _newTarget.prototype.constructor.name;\n setPrototypeOf(_this, _newTarget.prototype);\n return _this;\n }\n return SentryError;\n}(Error));\nexport { SentryError };\n//# sourceMappingURL=error.js.map","import * as tslib_1 from \"tslib\";\nimport { SentryError } from './error';\n/** Regular expression used to parse a Dsn. */\nvar DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+))?@)([\\w\\.-]+)(?::(\\d+))?\\/(.+)/;\n/** Error message */\nvar ERROR_MESSAGE = 'Invalid Dsn';\n/** The Sentry Dsn, identifying a Sentry instance and project. */\nvar Dsn = /** @class */ (function () {\n /** Creates a new Dsn component */\n function Dsn(from) {\n if (typeof from === 'string') {\n this._fromString(from);\n }\n else {\n this._fromComponents(from);\n }\n this._validate();\n }\n /**\n * Renders the string representation of this Dsn.\n *\n * By default, this will render the public representation without the password\n * component. To get the deprecated private _representation, set `withPassword`\n * to true.\n *\n * @param withPassword When set to true, the password will be included.\n */\n Dsn.prototype.toString = function (withPassword) {\n if (withPassword === void 0) { withPassword = false; }\n // tslint:disable-next-line:no-this-assignment\n var _a = this, host = _a.host, path = _a.path, pass = _a.pass, port = _a.port, projectId = _a.projectId, protocol = _a.protocol, user = _a.user;\n return (protocol + \"://\" + user + (withPassword && pass ? \":\" + pass : '') +\n (\"@\" + host + (port ? \":\" + port : '') + \"/\" + (path ? path + \"/\" : path) + projectId));\n };\n /** Parses a string into this Dsn. */\n Dsn.prototype._fromString = function (str) {\n var match = DSN_REGEX.exec(str);\n if (!match) {\n throw new SentryError(ERROR_MESSAGE);\n }\n var _a = tslib_1.__read(match.slice(1), 6), protocol = _a[0], user = _a[1], _b = _a[2], pass = _b === void 0 ? '' : _b, host = _a[3], _c = _a[4], port = _c === void 0 ? '' : _c, lastPath = _a[5];\n var path = '';\n var projectId = lastPath;\n var split = projectId.split('/');\n if (split.length > 1) {\n path = split.slice(0, -1).join('/');\n projectId = split.pop();\n }\n this._fromComponents({ host: host, pass: pass, path: path, projectId: projectId, port: port, protocol: protocol, user: user });\n };\n /** Maps Dsn components into this instance. */\n Dsn.prototype._fromComponents = function (components) {\n this.protocol = components.protocol;\n this.user = components.user;\n this.pass = components.pass || '';\n this.host = components.host;\n this.port = components.port || '';\n this.path = components.path || '';\n this.projectId = components.projectId;\n };\n /** Validates this Dsn and throws on error. */\n Dsn.prototype._validate = function () {\n var _this = this;\n ['protocol', 'user', 'host', 'projectId'].forEach(function (component) {\n if (!_this[component]) {\n throw new SentryError(ERROR_MESSAGE);\n }\n });\n if (this.protocol !== 'http' && this.protocol !== 'https') {\n throw new SentryError(ERROR_MESSAGE);\n }\n if (this.port && isNaN(parseInt(this.port, 10))) {\n throw new SentryError(ERROR_MESSAGE);\n }\n };\n return Dsn;\n}());\nexport { Dsn };\n//# sourceMappingURL=dsn.js.map","// tslint:disable:no-unsafe-any\n/**\n * Memo class used for decycle json objects. Uses WeakSet if available otherwise array.\n */\nvar Memo = /** @class */ (function () {\n function Memo() {\n // tslint:disable-next-line\n this._hasWeakSet = typeof WeakSet === 'function';\n this._inner = this._hasWeakSet ? new WeakSet() : [];\n }\n /**\n * Sets obj to remember.\n * @param obj Object to remember\n */\n Memo.prototype.memoize = function (obj) {\n if (this._hasWeakSet) {\n if (this._inner.has(obj)) {\n return true;\n }\n this._inner.add(obj);\n return false;\n }\n // tslint:disable-next-line:prefer-for-of\n for (var i = 0; i < this._inner.length; i++) {\n var value = this._inner[i];\n if (value === obj) {\n return true;\n }\n }\n this._inner.push(obj);\n return false;\n };\n /**\n * Removes object from internal storage.\n * @param obj Object to forget\n */\n Memo.prototype.unmemoize = function (obj) {\n if (this._hasWeakSet) {\n this._inner.delete(obj);\n }\n else {\n for (var i = 0; i < this._inner.length; i++) {\n if (this._inner[i] === obj) {\n this._inner.splice(i, 1);\n break;\n }\n }\n }\n };\n return Memo;\n}());\nexport { Memo };\n//# sourceMappingURL=memo.js.map","import * as tslib_1 from \"tslib\";\nimport { isElement, isError, isEvent, isInstanceOf, isPlainObject, isPrimitive, isSyntheticEvent } from './is';\nimport { Memo } from './memo';\nimport { getFunctionName, htmlTreeAsString } from './misc';\nimport { truncate } from './string';\n/**\n * Wrap a given object method with a higher-order function\n *\n * @param source An object that contains a method to be wrapped.\n * @param name A name of method to be wrapped.\n * @param replacement A function that should be used to wrap a given method.\n * @returns void\n */\nexport function fill(source, name, replacement) {\n if (!(name in source)) {\n return;\n }\n var original = source[name];\n var wrapped = replacement(original);\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n // tslint:disable-next-line:strict-type-predicates\n if (typeof wrapped === 'function') {\n try {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __sentry_original__: {\n enumerable: false,\n value: original,\n },\n });\n }\n catch (_Oo) {\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n }\n source[name] = wrapped;\n}\n/**\n * Encodes given object into url-friendly format\n *\n * @param object An object that contains serializable values\n * @returns string Encoded\n */\nexport function urlEncode(object) {\n return Object.keys(object)\n .map(\n // tslint:disable-next-line:no-unsafe-any\n function (key) { return encodeURIComponent(key) + \"=\" + encodeURIComponent(object[key]); })\n .join('&');\n}\n/**\n * Transforms any object into an object literal with all it's attributes\n * attached to it.\n *\n * @param value Initial source that we have to transform in order to be usable by the serializer\n */\nfunction getWalkSource(value) {\n if (isError(value)) {\n var error = value;\n var err = {\n message: error.message,\n name: error.name,\n stack: error.stack,\n };\n for (var i in error) {\n if (Object.prototype.hasOwnProperty.call(error, i)) {\n err[i] = error[i];\n }\n }\n return err;\n }\n if (isEvent(value)) {\n var event_1 = value;\n var source = {};\n source.type = event_1.type;\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n source.target = isElement(event_1.target)\n ? htmlTreeAsString(event_1.target)\n : Object.prototype.toString.call(event_1.target);\n }\n catch (_oO) {\n source.target = '
';\n }\n try {\n source.currentTarget = isElement(event_1.currentTarget)\n ? htmlTreeAsString(event_1.currentTarget)\n : Object.prototype.toString.call(event_1.currentTarget);\n }\n catch (_oO) {\n source.currentTarget = '';\n }\n // tslint:disable-next-line:strict-type-predicates\n if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {\n source.detail = event_1.detail;\n }\n for (var i in event_1) {\n if (Object.prototype.hasOwnProperty.call(event_1, i)) {\n source[i] = event_1;\n }\n }\n return source;\n }\n return value;\n}\n/** Calculates bytes size of input string */\nfunction utf8Length(value) {\n // tslint:disable-next-line:no-bitwise\n return ~-encodeURI(value).split(/%..|./).length;\n}\n/** Calculates bytes size of input object */\nfunction jsonSize(value) {\n return utf8Length(JSON.stringify(value));\n}\n/** JSDoc */\nexport function normalizeToSize(object, \n// Default Node.js REPL depth\ndepth, \n// 100kB, as 200kB is max payload size, so half sounds reasonable\nmaxSize) {\n if (depth === void 0) { depth = 3; }\n if (maxSize === void 0) { maxSize = 100 * 1024; }\n var serialized = normalize(object, depth);\n if (jsonSize(serialized) > maxSize) {\n return normalizeToSize(object, depth - 1, maxSize);\n }\n return serialized;\n}\n/** Transforms any input value into a string form, either primitive value or a type of the input */\nfunction serializeValue(value) {\n var type = Object.prototype.toString.call(value);\n // Node.js REPL notation\n if (typeof value === 'string') {\n return value;\n }\n if (type === '[object Object]') {\n return '[Object]';\n }\n if (type === '[object Array]') {\n return '[Array]';\n }\n var normalized = normalizeValue(value);\n return isPrimitive(normalized) ? normalized : type;\n}\n/**\n * normalizeValue()\n *\n * Takes unserializable input and make it serializable friendly\n *\n * - translates undefined/NaN values to \"[undefined]\"/\"[NaN]\" respectively,\n * - serializes Error objects\n * - filter global objects\n */\n// tslint:disable-next-line:cyclomatic-complexity\nfunction normalizeValue(value, key) {\n if (key === 'domain' && value && typeof value === 'object' && value._events) {\n return '[Domain]';\n }\n if (key === 'domainEmitter') {\n return '[DomainEmitter]';\n }\n if (typeof global !== 'undefined' && value === global) {\n return '[Global]';\n }\n if (typeof window !== 'undefined' && value === window) {\n return '[Window]';\n }\n if (typeof document !== 'undefined' && value === document) {\n return '[Document]';\n }\n // React's SyntheticEvent thingy\n if (isSyntheticEvent(value)) {\n return '[SyntheticEvent]';\n }\n // tslint:disable-next-line:no-tautology-expression\n if (typeof value === 'number' && value !== value) {\n return '[NaN]';\n }\n if (value === void 0) {\n return '[undefined]';\n }\n if (typeof value === 'function') {\n return \"[Function: \" + getFunctionName(value) + \"]\";\n }\n return value;\n}\n/**\n * Walks an object to perform a normalization on it\n *\n * @param key of object that's walked in current iteration\n * @param value object to be walked\n * @param depth Optional number indicating how deep should walking be performed\n * @param memo Optional Memo class handling decycling\n */\nexport function walk(key, value, depth, memo) {\n if (depth === void 0) { depth = +Infinity; }\n if (memo === void 0) { memo = new Memo(); }\n // If we reach the maximum depth, serialize whatever has left\n if (depth === 0) {\n return serializeValue(value);\n }\n // If value implements `toJSON` method, call it and return early\n // tslint:disable:no-unsafe-any\n if (value !== null && value !== undefined && typeof value.toJSON === 'function') {\n return value.toJSON();\n }\n // tslint:enable:no-unsafe-any\n // If normalized value is a primitive, there are no branches left to walk, so we can just bail out, as theres no point in going down that branch any further\n var normalized = normalizeValue(value, key);\n if (isPrimitive(normalized)) {\n return normalized;\n }\n // Create source that we will use for next itterations, either objectified error object (Error type with extracted keys:value pairs) or the input itself\n var source = getWalkSource(value);\n // Create an accumulator that will act as a parent for all future itterations of that branch\n var acc = Array.isArray(value) ? [] : {};\n // If we already walked that branch, bail out, as it's circular reference\n if (memo.memoize(value)) {\n return '[Circular ~]';\n }\n // Walk all keys of the source\n for (var innerKey in source) {\n // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n if (!Object.prototype.hasOwnProperty.call(source, innerKey)) {\n continue;\n }\n // Recursively walk through all the child nodes\n acc[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo);\n }\n // Once walked through all the branches, remove the parent from memo storage\n memo.unmemoize(value);\n // Return accumulated values\n return acc;\n}\n/**\n * normalize()\n *\n * - Creates a copy to prevent original input mutation\n * - Skip non-enumerablers\n * - Calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializeable values (undefined/NaN/Functions) to serializable format\n * - Translates known global objects/Classes to a string representations\n * - Takes care of Error objects serialization\n * - Optionally limit depth of final output\n */\nexport function normalize(input, depth) {\n try {\n // tslint:disable-next-line:no-unsafe-any\n return JSON.parse(JSON.stringify(input, function (key, value) { return walk(key, value, depth); }));\n }\n catch (_oO) {\n return '**non-serializable**';\n }\n}\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nexport function extractExceptionKeysForMessage(exception, maxLength) {\n if (maxLength === void 0) { maxLength = 40; }\n // tslint:disable:strict-type-predicates\n var keys = Object.keys(getWalkSource(exception));\n keys.sort();\n if (!keys.length) {\n return '[object has no keys]';\n }\n if (keys[0].length >= maxLength) {\n return truncate(keys[0], maxLength);\n }\n for (var includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n var serialized = keys.slice(0, includedKeys).join(', ');\n if (serialized.length > maxLength) {\n continue;\n }\n if (includedKeys === keys.length) {\n return serialized;\n }\n return truncate(serialized, maxLength);\n }\n return '';\n}\n/**\n * Given any object, return the new object with removed keys that value was `undefined`.\n * Works recursively on objects and arrays.\n */\nexport function dropUndefinedKeys(val) {\n var e_1, _a;\n if (isPlainObject(val)) {\n var obj = val;\n var rv = {};\n try {\n for (var _b = tslib_1.__values(Object.keys(obj)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var key = _c.value;\n if (typeof obj[key] !== 'undefined') {\n rv[key] = dropUndefinedKeys(obj[key]);\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return rv;\n }\n if (Array.isArray(val)) {\n return val.map(dropUndefinedKeys);\n }\n return val;\n}\n//# sourceMappingURL=object.js.map","import { Dsn, urlEncode } from '@sentry/utils';\nvar SENTRY_API_VERSION = '7';\n/** Helper class to provide urls to different Sentry endpoints. */\nvar API = /** @class */ (function () {\n /** Create a new instance of API */\n function API(dsn) {\n this.dsn = dsn;\n this._dsnObject = new Dsn(dsn);\n }\n /** Returns the Dsn object. */\n API.prototype.getDsn = function () {\n return this._dsnObject;\n };\n /** Returns a string with auth headers in the url to the store endpoint. */\n API.prototype.getStoreEndpoint = function () {\n return \"\" + this._getBaseUrl() + this.getStoreEndpointPath();\n };\n /** Returns the store endpoint with auth added in url encoded. */\n API.prototype.getStoreEndpointWithUrlEncodedAuth = function () {\n var dsn = this._dsnObject;\n var auth = {\n sentry_key: dsn.user,\n sentry_version: SENTRY_API_VERSION,\n };\n // Auth is intentionally sent as part of query string (NOT as custom HTTP header)\n // to avoid preflight CORS requests\n return this.getStoreEndpoint() + \"?\" + urlEncode(auth);\n };\n /** Returns the base path of the url including the port. */\n API.prototype._getBaseUrl = function () {\n var dsn = this._dsnObject;\n var protocol = dsn.protocol ? dsn.protocol + \":\" : '';\n var port = dsn.port ? \":\" + dsn.port : '';\n return protocol + \"//\" + dsn.host + port;\n };\n /** Returns only the path component for the store endpoint. */\n API.prototype.getStoreEndpointPath = function () {\n var dsn = this._dsnObject;\n return (dsn.path ? \"/\" + dsn.path : '') + \"/api/\" + dsn.projectId + \"/store/\";\n };\n /** Returns an object that can be used in request headers. */\n API.prototype.getRequestHeaders = function (clientName, clientVersion) {\n var dsn = this._dsnObject;\n var header = [\"Sentry sentry_version=\" + SENTRY_API_VERSION];\n header.push(\"sentry_client=\" + clientName + \"/\" + clientVersion);\n header.push(\"sentry_key=\" + dsn.user);\n if (dsn.pass) {\n header.push(\"sentry_secret=\" + dsn.pass);\n }\n return {\n 'Content-Type': 'application/json',\n 'X-Sentry-Auth': header.join(', '),\n };\n };\n /** Returns the url to the report dialog endpoint. */\n API.prototype.getReportDialogEndpoint = function (dialogOptions) {\n if (dialogOptions === void 0) { dialogOptions = {}; }\n var dsn = this._dsnObject;\n var endpoint = \"\" + this._getBaseUrl() + (dsn.path ? \"/\" + dsn.path : '') + \"/api/embed/error-page/\";\n var encodedOptions = [];\n encodedOptions.push(\"dsn=\" + dsn.toString());\n for (var key in dialogOptions) {\n if (key === 'user') {\n if (!dialogOptions.user) {\n continue;\n }\n if (dialogOptions.user.name) {\n encodedOptions.push(\"name=\" + encodeURIComponent(dialogOptions.user.name));\n }\n if (dialogOptions.user.email) {\n encodedOptions.push(\"email=\" + encodeURIComponent(dialogOptions.user.email));\n }\n }\n else {\n encodedOptions.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(dialogOptions[key]));\n }\n }\n if (encodedOptions.length) {\n return endpoint + \"?\" + encodedOptions.join('&');\n }\n return endpoint;\n };\n return API;\n}());\nexport { API };\n//# sourceMappingURL=api.js.map","import * as tslib_1 from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { logger } from '@sentry/utils';\nexport var installedIntegrations = [];\n/** Gets integration to install */\nexport function getIntegrationsToSetup(options) {\n var defaultIntegrations = (options.defaultIntegrations && tslib_1.__spread(options.defaultIntegrations)) || [];\n var userIntegrations = options.integrations;\n var integrations = [];\n if (Array.isArray(userIntegrations)) {\n var userIntegrationsNames_1 = userIntegrations.map(function (i) { return i.name; });\n var pickedIntegrationsNames_1 = [];\n // Leave only unique default integrations, that were not overridden with provided user integrations\n defaultIntegrations.forEach(function (defaultIntegration) {\n if (userIntegrationsNames_1.indexOf(defaultIntegration.name) === -1 &&\n pickedIntegrationsNames_1.indexOf(defaultIntegration.name) === -1) {\n integrations.push(defaultIntegration);\n pickedIntegrationsNames_1.push(defaultIntegration.name);\n }\n });\n // Don't add same user integration twice\n userIntegrations.forEach(function (userIntegration) {\n if (pickedIntegrationsNames_1.indexOf(userIntegration.name) === -1) {\n integrations.push(userIntegration);\n pickedIntegrationsNames_1.push(userIntegration.name);\n }\n });\n }\n else if (typeof userIntegrations === 'function') {\n integrations = userIntegrations(defaultIntegrations);\n integrations = Array.isArray(integrations) ? integrations : [integrations];\n }\n else {\n integrations = tslib_1.__spread(defaultIntegrations);\n }\n // Make sure that if present, `Debug` integration will always run last\n var integrationsNames = integrations.map(function (i) { return i.name; });\n var alwaysLastToRun = 'Debug';\n if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {\n integrations.push.apply(integrations, tslib_1.__spread(integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1)));\n }\n return integrations;\n}\n/** Setup given integration */\nexport function setupIntegration(integration) {\n if (installedIntegrations.indexOf(integration.name) !== -1) {\n return;\n }\n integration.setupOnce(addGlobalEventProcessor, getCurrentHub);\n installedIntegrations.push(integration.name);\n logger.log(\"Integration installed: \" + integration.name);\n}\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nexport function setupIntegrations(options) {\n var integrations = {};\n getIntegrationsToSetup(options).forEach(function (integration) {\n integrations[integration.name] = integration;\n setupIntegration(integration);\n });\n return integrations;\n}\n//# sourceMappingURL=integration.js.map","import * as tslib_1 from \"tslib\";\nimport { Dsn, isPrimitive, isThenable, logger, normalize, SyncPromise, truncate, uuid4 } from '@sentry/utils';\nimport { setupIntegrations } from './integration';\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding backend constructor and options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}. Also, the Backend instance is available via\n * {@link Client.getBackend}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event via the backend, it is passed through\n * {@link BaseClient.prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends BaseClient {\n * public constructor(options: NodeOptions) {\n * super(NodeBackend, options);\n * }\n *\n * // ...\n * }\n */\nvar BaseClient = /** @class */ (function () {\n /**\n * Initializes this client instance.\n *\n * @param backendClass A constructor function to create the backend.\n * @param options Options for the client.\n */\n function BaseClient(backendClass, options) {\n /** Array of used integrations. */\n this._integrations = {};\n /** Is the client still processing a call? */\n this._processing = false;\n this._backend = new backendClass(options);\n this._options = options;\n if (options.dsn) {\n this._dsn = new Dsn(options.dsn);\n }\n if (this._isEnabled()) {\n this._integrations = setupIntegrations(this._options);\n }\n }\n /**\n * @inheritDoc\n */\n BaseClient.prototype.captureException = function (exception, hint, scope) {\n var _this = this;\n var eventId = hint && hint.event_id;\n this._processing = true;\n this._getBackend()\n .eventFromException(exception, hint)\n .then(function (event) { return _this._processEvent(event, hint, scope); })\n .then(function (finalEvent) {\n // We need to check for finalEvent in case beforeSend returned null\n eventId = finalEvent && finalEvent.event_id;\n _this._processing = false;\n })\n .then(null, function (reason) {\n logger.error(reason);\n _this._processing = false;\n });\n return eventId;\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.captureMessage = function (message, level, hint, scope) {\n var _this = this;\n var eventId = hint && hint.event_id;\n this._processing = true;\n var promisedEvent = isPrimitive(message)\n ? this._getBackend().eventFromMessage(\"\" + message, level, hint)\n : this._getBackend().eventFromException(message, hint);\n promisedEvent\n .then(function (event) { return _this._processEvent(event, hint, scope); })\n .then(function (finalEvent) {\n // We need to check for finalEvent in case beforeSend returned null\n eventId = finalEvent && finalEvent.event_id;\n _this._processing = false;\n })\n .then(null, function (reason) {\n logger.error(reason);\n _this._processing = false;\n });\n return eventId;\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.captureEvent = function (event, hint, scope) {\n var _this = this;\n var eventId = hint && hint.event_id;\n this._processing = true;\n this._processEvent(event, hint, scope)\n .then(function (finalEvent) {\n // We need to check for finalEvent in case beforeSend returned null\n eventId = finalEvent && finalEvent.event_id;\n _this._processing = false;\n })\n .then(null, function (reason) {\n logger.error(reason);\n _this._processing = false;\n });\n return eventId;\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.getDsn = function () {\n return this._dsn;\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.getOptions = function () {\n return this._options;\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.flush = function (timeout) {\n var _this = this;\n return this._isClientProcessing(timeout).then(function (status) {\n clearInterval(status.interval);\n return _this._getBackend()\n .getTransport()\n .close(timeout)\n .then(function (transportFlushed) { return status.ready && transportFlushed; });\n });\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.close = function (timeout) {\n var _this = this;\n return this.flush(timeout).then(function (result) {\n _this.getOptions().enabled = false;\n return result;\n });\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.getIntegrations = function () {\n return this._integrations || {};\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.getIntegration = function (integration) {\n try {\n return this._integrations[integration.id] || null;\n }\n catch (_oO) {\n logger.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Client\");\n return null;\n }\n };\n /** Waits for the client to be done with processing. */\n BaseClient.prototype._isClientProcessing = function (timeout) {\n var _this = this;\n return new SyncPromise(function (resolve) {\n var ticked = 0;\n var tick = 1;\n var interval = 0;\n clearInterval(interval);\n interval = setInterval(function () {\n if (!_this._processing) {\n resolve({\n interval: interval,\n ready: true,\n });\n }\n else {\n ticked += tick;\n if (timeout && ticked >= timeout) {\n resolve({\n interval: interval,\n ready: false,\n });\n }\n }\n }, tick);\n });\n };\n /** Returns the current backend. */\n BaseClient.prototype._getBackend = function () {\n return this._backend;\n };\n /** Determines whether this SDK is enabled and a valid Dsn is present. */\n BaseClient.prototype._isEnabled = function () {\n return this.getOptions().enabled !== false && this._dsn !== undefined;\n };\n /**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`,\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * @param event The original event.\n * @param hint May contain additional informartion about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A new event with more information.\n */\n BaseClient.prototype._prepareEvent = function (event, scope, hint) {\n var _this = this;\n var _a = this.getOptions(), environment = _a.environment, release = _a.release, dist = _a.dist, _b = _a.maxValueLength, maxValueLength = _b === void 0 ? 250 : _b, _c = _a.normalizeDepth, normalizeDepth = _c === void 0 ? 3 : _c;\n var prepared = tslib_1.__assign({}, event);\n if (prepared.environment === undefined && environment !== undefined) {\n prepared.environment = environment;\n }\n if (prepared.release === undefined && release !== undefined) {\n prepared.release = release;\n }\n if (prepared.dist === undefined && dist !== undefined) {\n prepared.dist = dist;\n }\n if (prepared.message) {\n prepared.message = truncate(prepared.message, maxValueLength);\n }\n var exception = prepared.exception && prepared.exception.values && prepared.exception.values[0];\n if (exception && exception.value) {\n exception.value = truncate(exception.value, maxValueLength);\n }\n var request = prepared.request;\n if (request && request.url) {\n request.url = truncate(request.url, maxValueLength);\n }\n if (prepared.event_id === undefined) {\n prepared.event_id = hint && hint.event_id ? hint.event_id : uuid4();\n }\n this._addIntegrations(prepared.sdk);\n // We prepare the result here with a resolved Event.\n var result = SyncPromise.resolve(prepared);\n // This should be the last thing called, since we want that\n // {@link Hub.addEventProcessor} gets the finished prepared event.\n if (scope) {\n // In case we have a hub we reassign it.\n result = scope.applyToEvent(prepared, hint);\n }\n return result.then(function (evt) {\n // tslint:disable-next-line:strict-type-predicates\n if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n return _this._normalizeEvent(evt, normalizeDepth);\n }\n return evt;\n });\n };\n /**\n * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n * Normalized keys:\n * - `breadcrumbs.data`\n * - `user`\n * - `contexts`\n * - `extra`\n * @param event Event\n * @returns Normalized event\n */\n BaseClient.prototype._normalizeEvent = function (event, depth) {\n if (!event) {\n return null;\n }\n // tslint:disable:no-unsafe-any\n return tslib_1.__assign({}, event, (event.breadcrumbs && {\n breadcrumbs: event.breadcrumbs.map(function (b) { return (tslib_1.__assign({}, b, (b.data && {\n data: normalize(b.data, depth),\n }))); }),\n }), (event.user && {\n user: normalize(event.user, depth),\n }), (event.contexts && {\n contexts: normalize(event.contexts, depth),\n }), (event.extra && {\n extra: normalize(event.extra, depth),\n }));\n };\n /**\n * This function adds all used integrations to the SDK info in the event.\n * @param sdkInfo The sdkInfo of the event that will be filled with all integrations.\n */\n BaseClient.prototype._addIntegrations = function (sdkInfo) {\n var integrationsArray = Object.keys(this._integrations);\n if (sdkInfo && integrationsArray.length > 0) {\n sdkInfo.integrations = integrationsArray;\n }\n };\n /**\n * Processes an event (either error or message) and sends it to Sentry.\n *\n * This also adds breadcrumbs and context information to the event. However,\n * platform specific meta data (such as the User's IP address) must be added\n * by the SDK implementor.\n *\n *\n * @param event The event to send to Sentry.\n * @param hint May contain additional informartion about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n */\n BaseClient.prototype._processEvent = function (event, hint, scope) {\n var _this = this;\n var _a = this.getOptions(), beforeSend = _a.beforeSend, sampleRate = _a.sampleRate;\n if (!this._isEnabled()) {\n return SyncPromise.reject('SDK not enabled, will not send event.');\n }\n // 1.0 === 100% events are sent\n // 0.0 === 0% events are sent\n if (typeof sampleRate === 'number' && Math.random() > sampleRate) {\n return SyncPromise.reject('This event has been sampled, will not send event.');\n }\n return new SyncPromise(function (resolve, reject) {\n _this._prepareEvent(event, scope, hint)\n .then(function (prepared) {\n if (prepared === null) {\n reject('An event processor returned null, will not send event.');\n return;\n }\n var finalEvent = prepared;\n var isInternalException = hint && hint.data && hint.data.__sentry__ === true;\n if (isInternalException || !beforeSend) {\n _this._getBackend().sendEvent(finalEvent);\n resolve(finalEvent);\n return;\n }\n var beforeSendResult = beforeSend(prepared, hint);\n // tslint:disable-next-line:strict-type-predicates\n if (typeof beforeSendResult === 'undefined') {\n logger.error('`beforeSend` method has to return `null` or a valid event.');\n }\n else if (isThenable(beforeSendResult)) {\n _this._handleAsyncBeforeSend(beforeSendResult, resolve, reject);\n }\n else {\n finalEvent = beforeSendResult;\n if (finalEvent === null) {\n logger.log('`beforeSend` returned `null`, will not send event.');\n resolve(null);\n return;\n }\n // From here on we are really async\n _this._getBackend().sendEvent(finalEvent);\n resolve(finalEvent);\n }\n })\n .then(null, function (reason) {\n _this.captureException(reason, {\n data: {\n __sentry__: true,\n },\n originalException: reason,\n });\n reject(\"Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: \" + reason);\n });\n });\n };\n /**\n * Resolves before send Promise and calls resolve/reject on parent SyncPromise.\n */\n BaseClient.prototype._handleAsyncBeforeSend = function (beforeSend, resolve, reject) {\n var _this = this;\n beforeSend\n .then(function (processedEvent) {\n if (processedEvent === null) {\n reject('`beforeSend` returned `null`, will not send event.');\n return;\n }\n // From here on we are really async\n _this._getBackend().sendEvent(processedEvent);\n resolve(processedEvent);\n })\n .then(null, function (e) {\n reject(\"beforeSend rejected with \" + e);\n });\n };\n return BaseClient;\n}());\nexport { BaseClient };\n//# sourceMappingURL=baseclient.js.map","/** The status of an event. */\nexport var Status;\n(function (Status) {\n /** The status could not be determined. */\n Status[\"Unknown\"] = \"unknown\";\n /** The event was skipped due to configuration or callbacks. */\n Status[\"Skipped\"] = \"skipped\";\n /** The event was sent to Sentry successfully. */\n Status[\"Success\"] = \"success\";\n /** The client is currently rate limited and will try again later. */\n Status[\"RateLimit\"] = \"rate_limit\";\n /** The event could not be processed. */\n Status[\"Invalid\"] = \"invalid\";\n /** A server-side error ocurred during submission. */\n Status[\"Failed\"] = \"failed\";\n})(Status || (Status = {}));\n// tslint:disable:completed-docs\n// tslint:disable:no-unnecessary-qualifier no-namespace\n(function (Status) {\n /**\n * Converts a HTTP status code into a {@link Status}.\n *\n * @param code The HTTP response status code.\n * @returns The send status or {@link Status.Unknown}.\n */\n function fromHttpCode(code) {\n if (code >= 200 && code < 300) {\n return Status.Success;\n }\n if (code === 429) {\n return Status.RateLimit;\n }\n if (code >= 400 && code < 500) {\n return Status.Invalid;\n }\n if (code >= 500) {\n return Status.Failed;\n }\n return Status.Unknown;\n }\n Status.fromHttpCode = fromHttpCode;\n})(Status || (Status = {}));\n//# sourceMappingURL=status.js.map","import { Status } from '@sentry/types';\nimport { SyncPromise } from '@sentry/utils';\n/** Noop transport */\nvar NoopTransport = /** @class */ (function () {\n function NoopTransport() {\n }\n /**\n * @inheritDoc\n */\n NoopTransport.prototype.sendEvent = function (_) {\n return SyncPromise.resolve({\n reason: \"NoopTransport: Event has been skipped because no Dsn is configured.\",\n status: Status.Skipped,\n });\n };\n /**\n * @inheritDoc\n */\n NoopTransport.prototype.close = function (_) {\n return SyncPromise.resolve(true);\n };\n return NoopTransport;\n}());\nexport { NoopTransport };\n//# sourceMappingURL=noop.js.map","/** JSDoc */\nexport var Severity;\n(function (Severity) {\n /** JSDoc */\n Severity[\"Fatal\"] = \"fatal\";\n /** JSDoc */\n Severity[\"Error\"] = \"error\";\n /** JSDoc */\n Severity[\"Warning\"] = \"warning\";\n /** JSDoc */\n Severity[\"Log\"] = \"log\";\n /** JSDoc */\n Severity[\"Info\"] = \"info\";\n /** JSDoc */\n Severity[\"Debug\"] = \"debug\";\n /** JSDoc */\n Severity[\"Critical\"] = \"critical\";\n})(Severity || (Severity = {}));\n// tslint:disable:completed-docs\n// tslint:disable:no-unnecessary-qualifier no-namespace\n(function (Severity) {\n /**\n * Converts a string-based level into a {@link Severity}.\n *\n * @param level string representation of Severity\n * @returns Severity\n */\n function fromString(level) {\n switch (level) {\n case 'debug':\n return Severity.Debug;\n case 'info':\n return Severity.Info;\n case 'warn':\n case 'warning':\n return Severity.Warning;\n case 'error':\n return Severity.Error;\n case 'fatal':\n return Severity.Fatal;\n case 'critical':\n return Severity.Critical;\n case 'log':\n default:\n return Severity.Log;\n }\n }\n Severity.fromString = fromString;\n})(Severity || (Severity = {}));\n//# sourceMappingURL=severity.js.map","import { logger, SentryError } from '@sentry/utils';\nimport { NoopTransport } from './transports/noop';\n/**\n * This is the base implemention of a Backend.\n * @hidden\n */\nvar BaseBackend = /** @class */ (function () {\n /** Creates a new backend instance. */\n function BaseBackend(options) {\n this._options = options;\n if (!this._options.dsn) {\n logger.warn('No DSN provided, backend will not do anything.');\n }\n this._transport = this._setupTransport();\n }\n /**\n * Sets up the transport so it can be used later to send requests.\n */\n BaseBackend.prototype._setupTransport = function () {\n return new NoopTransport();\n };\n /**\n * @inheritDoc\n */\n BaseBackend.prototype.eventFromException = function (_exception, _hint) {\n throw new SentryError('Backend has to implement `eventFromException` method');\n };\n /**\n * @inheritDoc\n */\n BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) {\n throw new SentryError('Backend has to implement `eventFromMessage` method');\n };\n /**\n * @inheritDoc\n */\n BaseBackend.prototype.sendEvent = function (event) {\n this._transport.sendEvent(event).then(null, function (reason) {\n logger.error(\"Error while sending event: \" + reason);\n });\n };\n /**\n * @inheritDoc\n */\n BaseBackend.prototype.getTransport = function () {\n return this._transport;\n };\n return BaseBackend;\n}());\nexport { BaseBackend };\n//# sourceMappingURL=basebackend.js.map","import { logger } from './logger';\nimport { getGlobalObject } from './misc';\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent() {\n try {\n // tslint:disable:no-unused-expression\n new ErrorEvent('');\n return true;\n }\n catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError() {\n try {\n // It really needs 1 argument, not 0.\n // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n // 1 argument required, but only 0 present.\n // @ts-ignore\n // tslint:disable:no-unused-expression\n new DOMError('');\n return true;\n }\n catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException() {\n try {\n // tslint:disable:no-unused-expression\n new DOMException('');\n return true;\n }\n catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsFetch() {\n if (!('fetch' in getGlobalObject())) {\n return false;\n }\n try {\n // tslint:disable-next-line:no-unused-expression\n new Headers();\n // tslint:disable-next-line:no-unused-expression\n new Request('');\n // tslint:disable-next-line:no-unused-expression\n new Response();\n return true;\n }\n catch (e) {\n return false;\n }\n}\n/**\n * isNativeFetch checks if the given function is a native implementation of fetch()\n */\nfunction isNativeFetch(func) {\n return func && /^function fetch\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch() {\n if (!supportsFetch()) {\n return false;\n }\n var global = getGlobalObject();\n // Fast path to avoid DOM I/O\n // tslint:disable-next-line:no-unbound-method\n if (isNativeFetch(global.fetch)) {\n return true;\n }\n // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n // so create a \"pure\" iframe to see if that has native fetch\n var result = false;\n var doc = global.document;\n if (doc) {\n try {\n var sandbox = doc.createElement('iframe');\n sandbox.hidden = true;\n doc.head.appendChild(sandbox);\n if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n // tslint:disable-next-line:no-unbound-method\n result = isNativeFetch(sandbox.contentWindow.fetch);\n }\n doc.head.removeChild(sandbox);\n }\n catch (err) {\n logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n }\n }\n return result;\n}\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver() {\n // tslint:disable-next-line: no-unsafe-any\n return 'ReportingObserver' in getGlobalObject();\n}\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReferrerPolicy() {\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n if (!supportsFetch()) {\n return false;\n }\n try {\n // tslint:disable:no-unused-expression\n new Request('_', {\n referrerPolicy: 'origin',\n });\n return true;\n }\n catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory() {\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n var global = getGlobalObject();\n var chrome = global.chrome;\n // tslint:disable-next-line:no-unsafe-any\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;\n return !isChromePackagedApp && hasHistoryApi;\n}\n//# sourceMappingURL=supports.js.map","// tslint:disable:object-literal-sort-keys\nimport * as tslib_1 from \"tslib\";\n// global reference to slice\nvar UNKNOWN_FUNCTION = '?';\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nvar chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack||[-a-z]+:|.*bundle|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nvar gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js))(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nvar winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\nvar geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\nvar chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n/** JSDoc */\nexport function computeStackTrace(ex) {\n // tslint:disable:no-unsafe-any\n var stack = null;\n var popSize = ex && ex.framesToPop;\n try {\n // This must be tried first because Opera 10 *destroys*\n // its stacktrace property if you try to access the stack\n // property first!!\n stack = computeStackTraceFromStacktraceProp(ex);\n if (stack) {\n return popFrames(stack, popSize);\n }\n }\n catch (e) {\n // no-empty\n }\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return popFrames(stack, popSize);\n }\n }\n catch (e) {\n // no-empty\n }\n return {\n message: extractMessage(ex),\n name: ex && ex.name,\n stack: [],\n failed: true,\n };\n}\n/** JSDoc */\n// tslint:disable-next-line:cyclomatic-complexity\nfunction computeStackTraceFromStackProp(ex) {\n // tslint:disable:no-conditional-assignment\n if (!ex || !ex.stack) {\n return null;\n }\n var stack = [];\n var lines = ex.stack.split('\\n');\n var isEval;\n var submatch;\n var parts;\n var element;\n for (var i = 0; i < lines.length; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = submatch[1]; // url\n parts[3] = submatch[2]; // line\n parts[4] = submatch[3]; // column\n }\n element = {\n // working with the regexp above is super painful. it is quite a hack, but just stripping the `address at `\n // prefix here seems like the quickest solution for now.\n url: parts[2] && parts[2].indexOf('address at ') === 0 ? parts[2].substr('address at '.length) : parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: isNative ? [parts[2]] : [],\n line: parts[3] ? +parts[3] : null,\n column: parts[4] ? +parts[4] : null,\n };\n }\n else if ((parts = winjs.exec(lines[i]))) {\n element = {\n url: parts[2],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: [],\n line: +parts[3],\n column: parts[4] ? +parts[4] : null,\n };\n }\n else if ((parts = gecko.exec(lines[i]))) {\n isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || \"eval\";\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = ''; // no column when eval\n }\n else if (i === 0 && !parts[5] && ex.columnNumber !== void 0) {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n // NOTE: this hack doesn't work if top-most frame is eval\n stack[0].column = ex.columnNumber + 1;\n }\n element = {\n url: parts[3],\n func: parts[1] || UNKNOWN_FUNCTION,\n args: parts[2] ? parts[2].split(',') : [],\n line: parts[4] ? +parts[4] : null,\n column: parts[5] ? +parts[5] : null,\n };\n }\n else {\n continue;\n }\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n stack.push(element);\n }\n if (!stack.length) {\n return null;\n }\n return {\n message: extractMessage(ex),\n name: ex.name,\n stack: stack,\n };\n}\n/** JSDoc */\nfunction computeStackTraceFromStacktraceProp(ex) {\n if (!ex || !ex.stacktrace) {\n return null;\n }\n // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n var stacktrace = ex.stacktrace;\n var opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n var opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:]+)>|([^\\)]+))\\((.*)\\))? in (.*):\\s*$/i;\n var lines = stacktrace.split('\\n');\n var stack = [];\n var parts;\n for (var line = 0; line < lines.length; line += 2) {\n // tslint:disable:no-conditional-assignment\n var element = null;\n if ((parts = opera10Regex.exec(lines[line]))) {\n element = {\n url: parts[2],\n func: parts[3],\n args: [],\n line: +parts[1],\n column: null,\n };\n }\n else if ((parts = opera11Regex.exec(lines[line]))) {\n element = {\n url: parts[6],\n func: parts[3] || parts[4],\n args: parts[5] ? parts[5].split(',') : [],\n line: +parts[1],\n column: +parts[2],\n };\n }\n if (element) {\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n stack.push(element);\n }\n }\n if (!stack.length) {\n return null;\n }\n return {\n message: extractMessage(ex),\n name: ex.name,\n stack: stack,\n };\n}\n/** Remove N number of frames from the stack */\nfunction popFrames(stacktrace, popSize) {\n try {\n return tslib_1.__assign({}, stacktrace, { stack: stacktrace.stack.slice(popSize) });\n }\n catch (e) {\n return stacktrace;\n }\n}\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\nfunction extractMessage(ex) {\n var message = ex && ex.message;\n if (!message) {\n return 'No error message';\n }\n if (message.error && typeof message.error.message === 'string') {\n return message.error.message;\n }\n return message;\n}\n//# sourceMappingURL=tracekit.js.map","import { extractExceptionKeysForMessage, isEvent, normalizeToSize } from '@sentry/utils';\nimport { computeStackTrace } from './tracekit';\nvar STACKTRACE_LIMIT = 50;\n/**\n * This function creates an exception from an TraceKitStackTrace\n * @param stacktrace TraceKitStackTrace that will be converted to an exception\n * @hidden\n */\nexport function exceptionFromStacktrace(stacktrace) {\n var frames = prepareFramesForEvent(stacktrace.stack);\n var exception = {\n type: stacktrace.name,\n value: stacktrace.message,\n };\n if (frames && frames.length) {\n exception.stacktrace = { frames: frames };\n }\n // tslint:disable-next-line:strict-type-predicates\n if (exception.type === undefined && exception.value === '') {\n exception.value = 'Unrecoverable error caught';\n }\n return exception;\n}\n/**\n * @hidden\n */\nexport function eventFromPlainObject(exception, syntheticException, rejection) {\n var event = {\n exception: {\n values: [\n {\n type: isEvent(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error',\n value: \"Non-Error \" + (rejection ? 'promise rejection' : 'exception') + \" captured with keys: \" + extractExceptionKeysForMessage(exception),\n },\n ],\n },\n extra: {\n __serialized__: normalizeToSize(exception),\n },\n };\n if (syntheticException) {\n var stacktrace = computeStackTrace(syntheticException);\n var frames_1 = prepareFramesForEvent(stacktrace.stack);\n event.stacktrace = {\n frames: frames_1,\n };\n }\n return event;\n}\n/**\n * @hidden\n */\nexport function eventFromStacktrace(stacktrace) {\n var exception = exceptionFromStacktrace(stacktrace);\n return {\n exception: {\n values: [exception],\n },\n };\n}\n/**\n * @hidden\n */\nexport function prepareFramesForEvent(stack) {\n if (!stack || !stack.length) {\n return [];\n }\n var localStack = stack;\n var firstFrameFunction = localStack[0].func || '';\n var lastFrameFunction = localStack[localStack.length - 1].func || '';\n // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {\n localStack = localStack.slice(1);\n }\n // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {\n localStack = localStack.slice(0, -1);\n }\n // The frame where the crash happened, should be the last entry in the array\n return localStack\n .map(function (frame) { return ({\n colno: frame.column === null ? undefined : frame.column,\n filename: frame.url || localStack[0].url,\n function: frame.func || '?',\n in_app: true,\n lineno: frame.line === null ? undefined : frame.line,\n }); })\n .slice(0, STACKTRACE_LIMIT)\n .reverse();\n}\n//# sourceMappingURL=parsers.js.map","import { addExceptionMechanism, addExceptionTypeValue, isDOMError, isDOMException, isError, isErrorEvent, isEvent, isPlainObject, } from '@sentry/utils';\nimport { eventFromPlainObject, eventFromStacktrace, prepareFramesForEvent } from './parsers';\nimport { computeStackTrace } from './tracekit';\n/** JSDoc */\nexport function eventFromUnknownInput(exception, syntheticException, options) {\n if (options === void 0) { options = {}; }\n var event;\n if (isErrorEvent(exception) && exception.error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n var errorEvent = exception;\n exception = errorEvent.error; // tslint:disable-line:no-parameter-reassignment\n event = eventFromStacktrace(computeStackTrace(exception));\n return event;\n }\n if (isDOMError(exception) || isDOMException(exception)) {\n // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n // then we just extract the name and message, as they don't provide anything else\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n var domException = exception;\n var name_1 = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n var message = domException.message ? name_1 + \": \" + domException.message : name_1;\n event = eventFromString(message, syntheticException, options);\n addExceptionTypeValue(event, message);\n return event;\n }\n if (isError(exception)) {\n // we have a real Error object, do nothing\n event = eventFromStacktrace(computeStackTrace(exception));\n return event;\n }\n if (isPlainObject(exception) || isEvent(exception)) {\n // If it is plain Object or Event, serialize it manually and extract options\n // This will allow us to group events based on top-level keys\n // which is much better than creating new group when any key/value change\n var objectException = exception;\n event = eventFromPlainObject(objectException, syntheticException, options.rejection);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n return event;\n }\n // If none of previous checks were valid, then it means that it's not:\n // - an instance of DOMError\n // - an instance of DOMException\n // - an instance of Event\n // - an instance of Error\n // - a valid ErrorEvent (one with an error property)\n // - a plain Object\n //\n // So bail out and capture it as a simple message:\n event = eventFromString(exception, syntheticException, options);\n addExceptionTypeValue(event, \"\" + exception, undefined);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n return event;\n}\n// this._options.attachStacktrace\n/** JSDoc */\nexport function eventFromString(input, syntheticException, options) {\n if (options === void 0) { options = {}; }\n var event = {\n message: input,\n };\n if (options.attachStacktrace && syntheticException) {\n var stacktrace = computeStackTrace(syntheticException);\n var frames_1 = prepareFramesForEvent(stacktrace.stack);\n event.stacktrace = {\n frames: frames_1,\n };\n }\n return event;\n}\n//# sourceMappingURL=eventbuilder.js.map","import { SentryError } from './error';\nimport { SyncPromise } from './syncpromise';\n/** A simple queue that holds promises. */\nvar PromiseBuffer = /** @class */ (function () {\n function PromiseBuffer(_limit) {\n this._limit = _limit;\n /** Internal set of queued Promises */\n this._buffer = [];\n }\n /**\n * Says if the buffer is ready to take more requests\n */\n PromiseBuffer.prototype.isReady = function () {\n return this._limit === undefined || this.length() < this._limit;\n };\n /**\n * Add a promise to the queue.\n *\n * @param task Can be any PromiseLike\n * @returns The original promise.\n */\n PromiseBuffer.prototype.add = function (task) {\n var _this = this;\n if (!this.isReady()) {\n return SyncPromise.reject(new SentryError('Not adding Promise due to buffer limit reached.'));\n }\n if (this._buffer.indexOf(task) === -1) {\n this._buffer.push(task);\n }\n task\n .then(function () { return _this.remove(task); })\n .then(null, function () {\n return _this.remove(task).then(null, function () {\n // We have to add this catch here otherwise we have an unhandledPromiseRejection\n // because it's a new Promise chain.\n });\n });\n return task;\n };\n /**\n * Remove a promise to the queue.\n *\n * @param task Can be any PromiseLike\n * @returns Removed promise.\n */\n PromiseBuffer.prototype.remove = function (task) {\n var removedTask = this._buffer.splice(this._buffer.indexOf(task), 1)[0];\n return removedTask;\n };\n /**\n * This function returns the number of unresolved promises in the queue.\n */\n PromiseBuffer.prototype.length = function () {\n return this._buffer.length;\n };\n /**\n * This will drain the whole queue, returns true if queue is empty or drained.\n * If timeout is provided and the queue takes longer to drain, the promise still resolves but with false.\n *\n * @param timeout Number in ms to wait until it resolves with false.\n */\n PromiseBuffer.prototype.drain = function (timeout) {\n var _this = this;\n return new SyncPromise(function (resolve) {\n var capturedSetTimeout = setTimeout(function () {\n if (timeout && timeout > 0) {\n resolve(false);\n }\n }, timeout);\n SyncPromise.all(_this._buffer)\n .then(function () {\n clearTimeout(capturedSetTimeout);\n resolve(true);\n })\n .then(null, function () {\n resolve(true);\n });\n });\n };\n return PromiseBuffer;\n}());\nexport { PromiseBuffer };\n//# sourceMappingURL=promisebuffer.js.map","import { API } from '@sentry/core';\nimport { PromiseBuffer, SentryError } from '@sentry/utils';\n/** Base Transport class implementation */\nvar BaseTransport = /** @class */ (function () {\n function BaseTransport(options) {\n this.options = options;\n /** A simple buffer holding all requests. */\n this._buffer = new PromiseBuffer(30);\n this.url = new API(this.options.dsn).getStoreEndpointWithUrlEncodedAuth();\n }\n /**\n * @inheritDoc\n */\n BaseTransport.prototype.sendEvent = function (_) {\n throw new SentryError('Transport Class has to implement `sendEvent` method');\n };\n /**\n * @inheritDoc\n */\n BaseTransport.prototype.close = function (timeout) {\n return this._buffer.drain(timeout);\n };\n return BaseTransport;\n}());\nexport { BaseTransport };\n//# sourceMappingURL=base.js.map","import * as tslib_1 from \"tslib\";\nimport { Status } from '@sentry/types';\nimport { getGlobalObject, logger, parseRetryAfterHeader, supportsReferrerPolicy, SyncPromise } from '@sentry/utils';\nimport { BaseTransport } from './base';\nvar global = getGlobalObject();\n/** `fetch` based transport */\nvar FetchTransport = /** @class */ (function (_super) {\n tslib_1.__extends(FetchTransport, _super);\n function FetchTransport() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n /** Locks transport after receiving 429 response */\n _this._disabledUntil = new Date(Date.now());\n return _this;\n }\n /**\n * @inheritDoc\n */\n FetchTransport.prototype.sendEvent = function (event) {\n var _this = this;\n if (new Date(Date.now()) < this._disabledUntil) {\n return Promise.reject({\n event: event,\n reason: \"Transport locked till \" + this._disabledUntil + \" due to too many requests.\",\n status: 429,\n });\n }\n var defaultOptions = {\n body: JSON.stringify(event),\n method: 'POST',\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n referrerPolicy: (supportsReferrerPolicy() ? 'origin' : ''),\n };\n if (this.options.headers !== undefined) {\n defaultOptions.headers = this.options.headers;\n }\n return this._buffer.add(new SyncPromise(function (resolve, reject) {\n global\n .fetch(_this.url, defaultOptions)\n .then(function (response) {\n var status = Status.fromHttpCode(response.status);\n if (status === Status.Success) {\n resolve({ status: status });\n return;\n }\n if (status === Status.RateLimit) {\n var now = Date.now();\n _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, response.headers.get('Retry-After')));\n logger.warn(\"Too many requests, backing off till: \" + _this._disabledUntil);\n }\n reject(response);\n })\n .catch(reject);\n }));\n };\n return FetchTransport;\n}(BaseTransport));\nexport { FetchTransport };\n//# sourceMappingURL=fetch.js.map","import * as tslib_1 from \"tslib\";\nimport { Status } from '@sentry/types';\nimport { logger, parseRetryAfterHeader, SyncPromise } from '@sentry/utils';\nimport { BaseTransport } from './base';\n/** `XHR` based transport */\nvar XHRTransport = /** @class */ (function (_super) {\n tslib_1.__extends(XHRTransport, _super);\n function XHRTransport() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n /** Locks transport after receiving 429 response */\n _this._disabledUntil = new Date(Date.now());\n return _this;\n }\n /**\n * @inheritDoc\n */\n XHRTransport.prototype.sendEvent = function (event) {\n var _this = this;\n if (new Date(Date.now()) < this._disabledUntil) {\n return Promise.reject({\n event: event,\n reason: \"Transport locked till \" + this._disabledUntil + \" due to too many requests.\",\n status: 429,\n });\n }\n return this._buffer.add(new SyncPromise(function (resolve, reject) {\n var request = new XMLHttpRequest();\n request.onreadystatechange = function () {\n if (request.readyState !== 4) {\n return;\n }\n var status = Status.fromHttpCode(request.status);\n if (status === Status.Success) {\n resolve({ status: status });\n return;\n }\n if (status === Status.RateLimit) {\n var now = Date.now();\n _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, request.getResponseHeader('Retry-After')));\n logger.warn(\"Too many requests, backing off till: \" + _this._disabledUntil);\n }\n reject(request);\n };\n request.open('POST', _this.url);\n for (var header in _this.options.headers) {\n if (_this.options.headers.hasOwnProperty(header)) {\n request.setRequestHeader(header, _this.options.headers[header]);\n }\n }\n request.send(JSON.stringify(event));\n }));\n };\n return XHRTransport;\n}(BaseTransport));\nexport { XHRTransport };\n//# sourceMappingURL=xhr.js.map","import * as tslib_1 from \"tslib\";\nimport { BaseBackend } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { addExceptionMechanism, supportsFetch, SyncPromise } from '@sentry/utils';\nimport { eventFromString, eventFromUnknownInput } from './eventbuilder';\nimport { FetchTransport, XHRTransport } from './transports';\n/**\n * The Sentry Browser SDK Backend.\n * @hidden\n */\nvar BrowserBackend = /** @class */ (function (_super) {\n tslib_1.__extends(BrowserBackend, _super);\n function BrowserBackend() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * @inheritDoc\n */\n BrowserBackend.prototype._setupTransport = function () {\n if (!this._options.dsn) {\n // We return the noop transport here in case there is no Dsn.\n return _super.prototype._setupTransport.call(this);\n }\n var transportOptions = tslib_1.__assign({}, this._options.transportOptions, { dsn: this._options.dsn });\n if (this._options.transport) {\n return new this._options.transport(transportOptions);\n }\n if (supportsFetch()) {\n return new FetchTransport(transportOptions);\n }\n return new XHRTransport(transportOptions);\n };\n /**\n * @inheritDoc\n */\n BrowserBackend.prototype.eventFromException = function (exception, hint) {\n var syntheticException = (hint && hint.syntheticException) || undefined;\n var event = eventFromUnknownInput(exception, syntheticException, {\n attachStacktrace: this._options.attachStacktrace,\n });\n addExceptionMechanism(event, {\n handled: true,\n type: 'generic',\n });\n event.level = Severity.Error;\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return SyncPromise.resolve(event);\n };\n /**\n * @inheritDoc\n */\n BrowserBackend.prototype.eventFromMessage = function (message, level, hint) {\n if (level === void 0) { level = Severity.Info; }\n var syntheticException = (hint && hint.syntheticException) || undefined;\n var event = eventFromString(message, syntheticException, {\n attachStacktrace: this._options.attachStacktrace,\n });\n event.level = level;\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return SyncPromise.resolve(event);\n };\n return BrowserBackend;\n}(BaseBackend));\nexport { BrowserBackend };\n//# sourceMappingURL=backend.js.map","export var SDK_NAME = 'sentry.javascript.browser';\nexport var SDK_VERSION = '5.13.2';\n//# sourceMappingURL=version.js.map","import * as tslib_1 from \"tslib\";\nimport { API, BaseClient } from '@sentry/core';\nimport { getGlobalObject, logger } from '@sentry/utils';\nimport { BrowserBackend } from './backend';\nimport { SDK_NAME, SDK_VERSION } from './version';\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nvar BrowserClient = /** @class */ (function (_super) {\n tslib_1.__extends(BrowserClient, _super);\n /**\n * Creates a new Browser SDK instance.\n *\n * @param options Configuration options for this SDK.\n */\n function BrowserClient(options) {\n if (options === void 0) { options = {}; }\n return _super.call(this, BrowserBackend, options) || this;\n }\n /**\n * @inheritDoc\n */\n BrowserClient.prototype._prepareEvent = function (event, scope, hint) {\n event.platform = event.platform || 'javascript';\n event.sdk = tslib_1.__assign({}, event.sdk, { name: SDK_NAME, packages: tslib_1.__spread(((event.sdk && event.sdk.packages) || []), [\n {\n name: 'npm:@sentry/browser',\n version: SDK_VERSION,\n },\n ]), version: SDK_VERSION });\n return _super.prototype._prepareEvent.call(this, event, scope, hint);\n };\n /**\n * Show a report dialog to the user to send feedback to a specific event.\n *\n * @param options Set individual options for the dialog\n */\n BrowserClient.prototype.showReportDialog = function (options) {\n if (options === void 0) { options = {}; }\n // doesn't work without a document (React Native)\n var document = getGlobalObject().document;\n if (!document) {\n return;\n }\n if (!this._isEnabled()) {\n logger.error('Trying to call showReportDialog with Sentry Client is disabled');\n return;\n }\n var dsn = options.dsn || this.getDsn();\n if (!options.eventId) {\n logger.error('Missing `eventId` option in showReportDialog call');\n return;\n }\n if (!dsn) {\n logger.error('Missing `Dsn` option in showReportDialog call');\n return;\n }\n var script = document.createElement('script');\n script.async = true;\n script.src = new API(dsn).getReportDialogEndpoint(options);\n if (options.onLoad) {\n script.onload = options.onLoad;\n }\n (document.head || document.body).appendChild(script);\n };\n return BrowserClient;\n}(BaseClient));\nexport { BrowserClient };\n//# sourceMappingURL=client.js.map","import * as tslib_1 from \"tslib\";\nimport { getCurrentHub } from '@sentry/hub';\n/**\n * This calls a function on the current hub.\n * @param method function to call on hub.\n * @param args to pass to function.\n */\nfunction callOnHub(method) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var hub = getCurrentHub();\n if (hub && hub[method]) {\n // tslint:disable-next-line:no-unsafe-any\n return hub[method].apply(hub, tslib_1.__spread(args));\n }\n throw new Error(\"No hub defined or \" + method + \" was not found on the hub, please open a bug report.\");\n}\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception An exception-like object.\n * @returns The generated eventId.\n */\nexport function captureException(exception) {\n var syntheticException;\n try {\n throw new Error('Sentry syntheticException');\n }\n catch (exception) {\n syntheticException = exception;\n }\n return callOnHub('captureException', exception, {\n originalException: exception,\n syntheticException: syntheticException,\n });\n}\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param message The message to send to Sentry.\n * @param level Define the level of the message.\n * @returns The generated eventId.\n */\nexport function captureMessage(message, level) {\n var syntheticException;\n try {\n throw new Error(message);\n }\n catch (exception) {\n syntheticException = exception;\n }\n return callOnHub('captureMessage', message, level, {\n originalException: message,\n syntheticException: syntheticException,\n });\n}\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param event The event to send to Sentry.\n * @returns The generated eventId.\n */\nexport function captureEvent(event) {\n return callOnHub('captureEvent', event);\n}\n/**\n * Callback to set context information onto the scope.\n * @param callback Callback function that receives Scope.\n */\nexport function configureScope(callback) {\n callOnHub('configureScope', callback);\n}\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n *\n * @param breadcrumb The breadcrumb to record.\n */\nexport function addBreadcrumb(breadcrumb) {\n callOnHub('addBreadcrumb', breadcrumb);\n}\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normailzed.\n */\nexport function setContext(name, context) {\n callOnHub('setContext', name, context);\n}\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\nexport function setExtras(extras) {\n callOnHub('setExtras', extras);\n}\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\nexport function setTags(tags) {\n callOnHub('setTags', tags);\n}\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normailzed.\n */\nexport function setExtra(key, extra) {\n callOnHub('setExtra', key, extra);\n}\n/**\n * Set key:value that will be sent as tags data with the event.\n * @param key String key of tag\n * @param value String value of tag\n */\nexport function setTag(key, value) {\n callOnHub('setTag', key, value);\n}\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\nexport function setUser(user) {\n callOnHub('setUser', user);\n}\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n *\n * This is essentially a convenience function for:\n *\n * pushScope();\n * callback();\n * popScope();\n *\n * @param callback that will be enclosed into push/popScope.\n */\nexport function withScope(callback) {\n callOnHub('withScope', callback);\n}\n/**\n * Calls a function on the latest client. Use this with caution, it's meant as\n * in \"internal\" helper so we don't need to expose every possible function in\n * the shim. It is not guaranteed that the client actually implements the\n * function.\n *\n * @param method The method to call on the client/client.\n * @param args Arguments to pass to the client/fontend.\n * @hidden\n */\nexport function _callOnClient(method) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n callOnHub.apply(void 0, tslib_1.__spread(['_invokeClient', method], args));\n}\n//# sourceMappingURL=index.js.map","import * as tslib_1 from \"tslib\";\nimport { captureException, withScope } from '@sentry/core';\nimport { addExceptionMechanism, addExceptionTypeValue } from '@sentry/utils';\nvar ignoreOnError = 0;\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError() {\n return ignoreOnError > 0;\n}\n/**\n * @hidden\n */\nexport function ignoreNextOnError() {\n // onerror should trigger before setTimeout\n ignoreOnError += 1;\n setTimeout(function () {\n ignoreOnError -= 1;\n });\n}\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap(fn, options, before) {\n if (options === void 0) { options = {}; }\n // tslint:disable-next-line:strict-type-predicates\n if (typeof fn !== 'function') {\n return fn;\n }\n try {\n // We don't wanna wrap it twice\n if (fn.__sentry__) {\n return fn;\n }\n // If this has already been wrapped in the past, return that wrapped function\n if (fn.__sentry_wrapped__) {\n return fn.__sentry_wrapped__;\n }\n }\n catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return fn;\n }\n var sentryWrapped = function () {\n var args = Array.prototype.slice.call(arguments);\n // tslint:disable:no-unsafe-any\n try {\n // tslint:disable-next-line:strict-type-predicates\n if (before && typeof before === 'function') {\n before.apply(this, arguments);\n }\n var wrappedArguments = args.map(function (arg) { return wrap(arg, options); });\n if (fn.handleEvent) {\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n return fn.handleEvent.apply(this, wrappedArguments);\n }\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n return fn.apply(this, wrappedArguments);\n // tslint:enable:no-unsafe-any\n }\n catch (ex) {\n ignoreNextOnError();\n withScope(function (scope) {\n scope.addEventProcessor(function (event) {\n var processedEvent = tslib_1.__assign({}, event);\n if (options.mechanism) {\n addExceptionTypeValue(processedEvent, undefined, undefined);\n addExceptionMechanism(processedEvent, options.mechanism);\n }\n processedEvent.extra = tslib_1.__assign({}, processedEvent.extra, { arguments: args });\n return processedEvent;\n });\n captureException(ex);\n });\n throw ex;\n }\n };\n // Accessing some objects may throw\n // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n try {\n for (var property in fn) {\n if (Object.prototype.hasOwnProperty.call(fn, property)) {\n sentryWrapped[property] = fn[property];\n }\n }\n }\n catch (_oO) { } // tslint:disable-line:no-empty\n fn.prototype = fn.prototype || {};\n sentryWrapped.prototype = fn.prototype;\n Object.defineProperty(fn, '__sentry_wrapped__', {\n enumerable: false,\n value: sentryWrapped,\n });\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n Object.defineProperties(sentryWrapped, {\n __sentry__: {\n enumerable: false,\n value: true,\n },\n __sentry_original__: {\n enumerable: false,\n value: fn,\n },\n });\n // Restore original function name (not all browsers allow that)\n try {\n var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name');\n if (descriptor.configurable) {\n Object.defineProperty(sentryWrapped, 'name', {\n get: function () {\n return fn.name;\n },\n });\n }\n }\n catch (_oO) {\n /*no-empty*/\n }\n return sentryWrapped;\n}\n//# sourceMappingURL=helpers.js.map","import { fill, getFunctionName, getGlobalObject } from '@sentry/utils';\nimport { wrap } from '../helpers';\n/** Wrap timer functions and event targets to catch errors and provide better meta data */\nvar TryCatch = /** @class */ (function () {\n function TryCatch() {\n /** JSDoc */\n this._ignoreOnError = 0;\n /**\n * @inheritDoc\n */\n this.name = TryCatch.id;\n }\n /** JSDoc */\n TryCatch.prototype._wrapTimeFunction = function (original) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var originalCallback = args[0];\n args[0] = wrap(originalCallback, {\n mechanism: {\n data: { function: getFunctionName(original) },\n handled: true,\n type: 'instrument',\n },\n });\n return original.apply(this, args);\n };\n };\n /** JSDoc */\n TryCatch.prototype._wrapRAF = function (original) {\n return function (callback) {\n return original(wrap(callback, {\n mechanism: {\n data: {\n function: 'requestAnimationFrame',\n handler: getFunctionName(original),\n },\n handled: true,\n type: 'instrument',\n },\n }));\n };\n };\n /** JSDoc */\n TryCatch.prototype._wrapEventTarget = function (target) {\n var global = getGlobalObject();\n var proto = global[target] && global[target].prototype;\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n fill(proto, 'addEventListener', function (original) {\n return function (eventName, fn, options) {\n try {\n // tslint:disable-next-line:no-unbound-method strict-type-predicates\n if (typeof fn.handleEvent === 'function') {\n fn.handleEvent = wrap(fn.handleEvent.bind(fn), {\n mechanism: {\n data: {\n function: 'handleEvent',\n handler: getFunctionName(fn),\n target: target,\n },\n handled: true,\n type: 'instrument',\n },\n });\n }\n }\n catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n return original.call(this, eventName, wrap(fn, {\n mechanism: {\n data: {\n function: 'addEventListener',\n handler: getFunctionName(fn),\n target: target,\n },\n handled: true,\n type: 'instrument',\n },\n }), options);\n };\n });\n fill(proto, 'removeEventListener', function (original) {\n return function (eventName, fn, options) {\n var callback = fn;\n try {\n callback = callback && (callback.__sentry_wrapped__ || callback);\n }\n catch (e) {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return original.call(this, eventName, callback, options);\n };\n });\n };\n /** JSDoc */\n TryCatch.prototype._wrapXHR = function (originalSend) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var xhr = this; // tslint:disable-line:no-this-assignment\n var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n xmlHttpRequestProps.forEach(function (prop) {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n fill(xhr, prop, function (original) {\n var wrapOptions = {\n mechanism: {\n data: {\n function: prop,\n handler: getFunctionName(original),\n },\n handled: true,\n type: 'instrument',\n },\n };\n // If Instrument integration has been called before TryCatch, get the name of original function\n if (original.__sentry_original__) {\n wrapOptions.mechanism.data.handler = getFunctionName(original.__sentry_original__);\n }\n // Otherwise wrap directly\n return wrap(original, wrapOptions);\n });\n }\n });\n return originalSend.apply(this, args);\n };\n };\n /**\n * Wrap timer functions and event targets to catch errors\n * and provide better metadata.\n */\n TryCatch.prototype.setupOnce = function () {\n this._ignoreOnError = this._ignoreOnError;\n var global = getGlobalObject();\n fill(global, 'setTimeout', this._wrapTimeFunction.bind(this));\n fill(global, 'setInterval', this._wrapTimeFunction.bind(this));\n fill(global, 'requestAnimationFrame', this._wrapRAF.bind(this));\n if ('XMLHttpRequest' in global) {\n fill(XMLHttpRequest.prototype, 'send', this._wrapXHR.bind(this));\n }\n [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload',\n ].forEach(this._wrapEventTarget.bind(this));\n };\n /**\n * @inheritDoc\n */\n TryCatch.id = 'TryCatch';\n return TryCatch;\n}());\nexport { TryCatch };\n//# sourceMappingURL=trycatch.js.map","/* tslint:disable:only-arrow-functions no-unsafe-any */\nimport * as tslib_1 from \"tslib\";\nimport { isInstanceOf, isString } from './is';\nimport { logger } from './logger';\nimport { getFunctionName, getGlobalObject } from './misc';\nimport { fill } from './object';\nimport { supportsHistory, supportsNativeFetch } from './supports';\nvar global = getGlobalObject();\n/**\n * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.\n * - Console API\n * - Fetch API\n * - XHR API\n * - History API\n * - DOM API (click/typing)\n */\nvar handlers = {};\nvar instrumented = {};\n/** Instruments given API */\nfunction instrument(type) {\n if (instrumented[type]) {\n return;\n }\n instrumented[type] = true;\n switch (type) {\n case 'console':\n instrumentConsole();\n break;\n case 'dom':\n instrumentDOM();\n break;\n case 'xhr':\n instrumentXHR();\n break;\n case 'fetch':\n instrumentFetch();\n break;\n case 'history':\n instrumentHistory();\n break;\n default:\n logger.warn('unknown instrumentation type:', type);\n }\n}\n/**\n * Add handler that will be called when given type of instrumentation triggers.\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addInstrumentationHandler(handler) {\n // tslint:disable-next-line:strict-type-predicates\n if (!handler || typeof handler.type !== 'string' || typeof handler.callback !== 'function') {\n return;\n }\n handlers[handler.type] = handlers[handler.type] || [];\n handlers[handler.type].push(handler.callback);\n instrument(handler.type);\n}\n/** JSDoc */\nfunction triggerHandlers(type, data) {\n var e_1, _a;\n if (!type || !handlers[type]) {\n return;\n }\n try {\n for (var _b = tslib_1.__values(handlers[type] || []), _c = _b.next(); !_c.done; _c = _b.next()) {\n var handler = _c.value;\n try {\n handler(data);\n }\n catch (e) {\n logger.error(\"Error while triggering instrumentation handler.\\nType: \" + type + \"\\nName: \" + getFunctionName(handler) + \"\\nError: \" + e);\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n}\n/** JSDoc */\nfunction instrumentConsole() {\n if (!('console' in global)) {\n return;\n }\n ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function (level) {\n if (!(level in global.console)) {\n return;\n }\n fill(global.console, level, function (originalConsoleLevel) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n triggerHandlers('console', { args: args, level: level });\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n Function.prototype.apply.call(originalConsoleLevel, global.console, args);\n }\n };\n });\n });\n}\n/** JSDoc */\nfunction instrumentFetch() {\n if (!supportsNativeFetch()) {\n return;\n }\n fill(global, 'fetch', function (originalFetch) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var commonHandlerData = {\n args: args,\n fetchData: {\n method: getFetchMethod(args),\n url: getFetchUrl(args),\n },\n startTimestamp: Date.now(),\n };\n triggerHandlers('fetch', tslib_1.__assign({}, commonHandlerData));\n return originalFetch.apply(global, args).then(function (response) {\n triggerHandlers('fetch', tslib_1.__assign({}, commonHandlerData, { endTimestamp: Date.now(), response: response }));\n return response;\n }, function (error) {\n triggerHandlers('fetch', tslib_1.__assign({}, commonHandlerData, { endTimestamp: Date.now(), error: error }));\n throw error;\n });\n };\n });\n}\n/** Extract `method` from fetch call arguments */\nfunction getFetchMethod(fetchArgs) {\n if (fetchArgs === void 0) { fetchArgs = []; }\n if ('Request' in global && isInstanceOf(fetchArgs[0], Request) && fetchArgs[0].method) {\n return String(fetchArgs[0].method).toUpperCase();\n }\n if (fetchArgs[1] && fetchArgs[1].method) {\n return String(fetchArgs[1].method).toUpperCase();\n }\n return 'GET';\n}\n/** Extract `url` from fetch call arguments */\nfunction getFetchUrl(fetchArgs) {\n if (fetchArgs === void 0) { fetchArgs = []; }\n if (typeof fetchArgs[0] === 'string') {\n return fetchArgs[0];\n }\n if ('Request' in global && isInstanceOf(fetchArgs[0], Request)) {\n return fetchArgs[0].url;\n }\n return String(fetchArgs[0]);\n}\n/** JSDoc */\nfunction instrumentXHR() {\n if (!('XMLHttpRequest' in global)) {\n return;\n }\n var xhrproto = XMLHttpRequest.prototype;\n fill(xhrproto, 'open', function (originalOpen) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var url = args[1];\n this.__sentry_xhr__ = {\n method: isString(args[0]) ? args[0].toUpperCase() : args[0],\n url: args[1],\n };\n // if Sentry key appears in URL, don't capture it as a request\n if (isString(url) && this.__sentry_xhr__.method === 'POST' && url.match(/sentry_key/)) {\n this.__sentry_own_request__ = true;\n }\n return originalOpen.apply(this, args);\n };\n });\n fill(xhrproto, 'send', function (originalSend) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var xhr = this; // tslint:disable-line:no-this-assignment\n var commonHandlerData = {\n args: args,\n startTimestamp: Date.now(),\n xhr: xhr,\n };\n triggerHandlers('xhr', tslib_1.__assign({}, commonHandlerData));\n xhr.addEventListener('readystatechange', function () {\n if (xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n if (xhr.__sentry_xhr__) {\n xhr.__sentry_xhr__.status_code = xhr.status;\n }\n }\n catch (e) {\n /* do nothing */\n }\n triggerHandlers('xhr', tslib_1.__assign({}, commonHandlerData, { endTimestamp: Date.now() }));\n }\n });\n return originalSend.apply(this, args);\n };\n });\n}\nvar lastHref;\n/** JSDoc */\nfunction instrumentHistory() {\n if (!supportsHistory()) {\n return;\n }\n var oldOnPopState = global.onpopstate;\n global.onpopstate = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var to = global.location.href;\n // keep track of the current URL state, as we always receive only the updated state\n var from = lastHref;\n lastHref = to;\n triggerHandlers('history', {\n from: from,\n to: to,\n });\n if (oldOnPopState) {\n return oldOnPopState.apply(this, args);\n }\n };\n /** @hidden */\n function historyReplacementFunction(originalHistoryFunction) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var url = args.length > 2 ? args[2] : undefined;\n if (url) {\n // coerce to string (this is what pushState does)\n var from = lastHref;\n var to = String(url);\n // keep track of the current URL state, as we always receive only the updated state\n lastHref = to;\n triggerHandlers('history', {\n from: from,\n to: to,\n });\n }\n return originalHistoryFunction.apply(this, args);\n };\n }\n fill(global.history, 'pushState', historyReplacementFunction);\n fill(global.history, 'replaceState', historyReplacementFunction);\n}\n/** JSDoc */\nfunction instrumentDOM() {\n if (!('document' in global)) {\n return;\n }\n // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n // to the document. Do this before we instrument addEventListener.\n global.document.addEventListener('click', domEventHandler('click', triggerHandlers.bind(null, 'dom')), false);\n global.document.addEventListener('keypress', keypressEventHandler(triggerHandlers.bind(null, 'dom')), false);\n // After hooking into document bubbled up click and keypresses events, we also hook into user handled click & keypresses.\n ['EventTarget', 'Node'].forEach(function (target) {\n var proto = global[target] && global[target].prototype;\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n fill(proto, 'addEventListener', function (original) {\n return function (eventName, fn, options) {\n if (fn && fn.handleEvent) {\n if (eventName === 'click') {\n fill(fn, 'handleEvent', function (innerOriginal) {\n return function (event) {\n domEventHandler('click', triggerHandlers.bind(null, 'dom'))(event);\n return innerOriginal.call(this, event);\n };\n });\n }\n if (eventName === 'keypress') {\n fill(fn, 'handleEvent', function (innerOriginal) {\n return function (event) {\n keypressEventHandler(triggerHandlers.bind(null, 'dom'))(event);\n return innerOriginal.call(this, event);\n };\n });\n }\n }\n else {\n if (eventName === 'click') {\n domEventHandler('click', triggerHandlers.bind(null, 'dom'), true)(this);\n }\n if (eventName === 'keypress') {\n keypressEventHandler(triggerHandlers.bind(null, 'dom'))(this);\n }\n }\n return original.call(this, eventName, fn, options);\n };\n });\n fill(proto, 'removeEventListener', function (original) {\n return function (eventName, fn, options) {\n var callback = fn;\n try {\n callback = callback && (callback.__sentry_wrapped__ || callback);\n }\n catch (e) {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return original.call(this, eventName, callback, options);\n };\n });\n });\n}\nvar debounceDuration = 1000;\nvar debounceTimer = 0;\nvar keypressTimeout;\nvar lastCapturedEvent;\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param name the event name (e.g. \"click\")\n * @param handler function that will be triggered\n * @param debounce decides whether it should wait till another event loop\n * @returns wrapped breadcrumb events handler\n * @hidden\n */\nfunction domEventHandler(name, handler, debounce) {\n if (debounce === void 0) { debounce = false; }\n return function (event) {\n // reset keypress timeout; e.g. triggering a 'click' after\n // a 'keypress' will reset the keypress debounce so that a new\n // set of keypresses can be recorded\n keypressTimeout = undefined;\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors). Ignore if we've\n // already captured the event.\n if (!event || lastCapturedEvent === event) {\n return;\n }\n lastCapturedEvent = event;\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n if (debounce) {\n debounceTimer = setTimeout(function () {\n handler({ event: event, name: name });\n });\n }\n else {\n handler({ event: event, name: name });\n }\n };\n}\n/**\n * Wraps addEventListener to capture keypress UI events\n * @param handler function that will be triggered\n * @returns wrapped keypress events handler\n * @hidden\n */\nfunction keypressEventHandler(handler) {\n // TODO: if somehow user switches keypress target before\n // debounce timeout is triggered, we will only capture\n // a single breadcrumb from the FIRST target (acceptable?)\n return function (event) {\n var target;\n try {\n target = event.target;\n }\n catch (e) {\n // just accessing event properties can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/raven-js/issues/838\n return;\n }\n var tagName = target && target.tagName;\n // only consider keypress events on actual input elements\n // this will disregard keypresses targeting body (e.g. tabbing\n // through elements, hotkeys, etc)\n if (!tagName || (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)) {\n return;\n }\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n if (!keypressTimeout) {\n domEventHandler('input', handler)(event);\n }\n clearTimeout(keypressTimeout);\n keypressTimeout = setTimeout(function () {\n keypressTimeout = undefined;\n }, debounceDuration);\n };\n}\n//# sourceMappingURL=instrument.js.map","import * as tslib_1 from \"tslib\";\nimport { API, getCurrentHub } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { addInstrumentationHandler, getEventDescription, getGlobalObject, htmlTreeAsString, logger, parseUrl, safeJoin, } from '@sentry/utils';\n/**\n * Default Breadcrumbs instrumentations\n * TODO: Deprecated - with v6, this will be renamed to `Instrument`\n */\nvar Breadcrumbs = /** @class */ (function () {\n /**\n * @inheritDoc\n */\n function Breadcrumbs(options) {\n /**\n * @inheritDoc\n */\n this.name = Breadcrumbs.id;\n this._options = tslib_1.__assign({ console: true, dom: true, fetch: true, history: true, sentry: true, xhr: true }, options);\n }\n /**\n * Creates breadcrumbs from console API calls\n */\n Breadcrumbs.prototype._consoleBreadcrumb = function (handlerData) {\n var breadcrumb = {\n category: 'console',\n data: {\n arguments: handlerData.args,\n logger: 'console',\n },\n level: Severity.fromString(handlerData.level),\n message: safeJoin(handlerData.args, ' '),\n };\n if (handlerData.level === 'assert') {\n if (handlerData.args[0] === false) {\n breadcrumb.message = \"Assertion failed: \" + (safeJoin(handlerData.args.slice(1), ' ') || 'console.assert');\n breadcrumb.data.arguments = handlerData.args.slice(1);\n }\n else {\n // Don't capture a breadcrumb for passed assertions\n return;\n }\n }\n getCurrentHub().addBreadcrumb(breadcrumb, {\n input: handlerData.args,\n level: handlerData.level,\n });\n };\n /**\n * Creates breadcrumbs from DOM API calls\n */\n Breadcrumbs.prototype._domBreadcrumb = function (handlerData) {\n var target;\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n target = handlerData.event.target\n ? htmlTreeAsString(handlerData.event.target)\n : htmlTreeAsString(handlerData.event);\n }\n catch (e) {\n target = '';\n }\n if (target.length === 0) {\n return;\n }\n getCurrentHub().addBreadcrumb({\n category: \"ui.\" + handlerData.name,\n message: target,\n }, {\n event: handlerData.event,\n name: handlerData.name,\n });\n };\n /**\n * Creates breadcrumbs from XHR API calls\n */\n Breadcrumbs.prototype._xhrBreadcrumb = function (handlerData) {\n if (handlerData.endTimestamp) {\n // We only capture complete, non-sentry requests\n if (handlerData.xhr.__sentry_own_request__) {\n return;\n }\n getCurrentHub().addBreadcrumb({\n category: 'xhr',\n data: handlerData.xhr.__sentry_xhr__,\n type: 'http',\n }, {\n xhr: handlerData.xhr,\n });\n return;\n }\n // We only capture issued sentry requests\n if (handlerData.xhr.__sentry_own_request__) {\n addSentryBreadcrumb(handlerData.args[0]);\n }\n };\n /**\n * Creates breadcrumbs from fetch API calls\n */\n Breadcrumbs.prototype._fetchBreadcrumb = function (handlerData) {\n // We only capture complete fetch requests\n if (!handlerData.endTimestamp) {\n return;\n }\n var client = getCurrentHub().getClient();\n var dsn = client && client.getDsn();\n if (dsn) {\n var filterUrl = new API(dsn).getStoreEndpoint();\n // if Sentry key appears in URL, don't capture it as a request\n // but rather as our own 'sentry' type breadcrumb\n if (filterUrl &&\n handlerData.fetchData.url.indexOf(filterUrl) !== -1 &&\n handlerData.fetchData.method === 'POST' &&\n handlerData.args[1] &&\n handlerData.args[1].body) {\n addSentryBreadcrumb(handlerData.args[1].body);\n return;\n }\n }\n if (handlerData.error) {\n getCurrentHub().addBreadcrumb({\n category: 'fetch',\n data: tslib_1.__assign({}, handlerData.fetchData, { status_code: handlerData.response.status }),\n level: Severity.Error,\n type: 'http',\n }, {\n data: handlerData.error,\n input: handlerData.args,\n });\n }\n else {\n getCurrentHub().addBreadcrumb({\n category: 'fetch',\n data: tslib_1.__assign({}, handlerData.fetchData, { status_code: handlerData.response.status }),\n type: 'http',\n }, {\n input: handlerData.args,\n response: handlerData.response,\n });\n }\n };\n /**\n * Creates breadcrumbs from history API calls\n */\n Breadcrumbs.prototype._historyBreadcrumb = function (handlerData) {\n var global = getGlobalObject();\n var from = handlerData.from;\n var to = handlerData.to;\n var parsedLoc = parseUrl(global.location.href);\n var parsedFrom = parseUrl(from);\n var parsedTo = parseUrl(to);\n // Initial pushState doesn't provide `from` information\n if (!parsedFrom.path) {\n parsedFrom = parsedLoc;\n }\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n // tslint:disable-next-line:no-parameter-reassignment\n to = parsedTo.relative;\n }\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n // tslint:disable-next-line:no-parameter-reassignment\n from = parsedFrom.relative;\n }\n getCurrentHub().addBreadcrumb({\n category: 'navigation',\n data: {\n from: from,\n to: to,\n },\n });\n };\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - Console API\n * - DOM API (click/typing)\n * - XMLHttpRequest API\n * - Fetch API\n * - History API\n */\n Breadcrumbs.prototype.setupOnce = function () {\n var _this = this;\n if (this._options.console) {\n addInstrumentationHandler({\n callback: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n _this._consoleBreadcrumb.apply(_this, tslib_1.__spread(args));\n },\n type: 'console',\n });\n }\n if (this._options.dom) {\n addInstrumentationHandler({\n callback: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n _this._domBreadcrumb.apply(_this, tslib_1.__spread(args));\n },\n type: 'dom',\n });\n }\n if (this._options.xhr) {\n addInstrumentationHandler({\n callback: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n _this._xhrBreadcrumb.apply(_this, tslib_1.__spread(args));\n },\n type: 'xhr',\n });\n }\n if (this._options.fetch) {\n addInstrumentationHandler({\n callback: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n _this._fetchBreadcrumb.apply(_this, tslib_1.__spread(args));\n },\n type: 'fetch',\n });\n }\n if (this._options.history) {\n addInstrumentationHandler({\n callback: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n _this._historyBreadcrumb.apply(_this, tslib_1.__spread(args));\n },\n type: 'history',\n });\n }\n };\n /**\n * @inheritDoc\n */\n Breadcrumbs.id = 'Breadcrumbs';\n return Breadcrumbs;\n}());\nexport { Breadcrumbs };\n/**\n * Create a breadcrumb of `sentry` from the events themselves\n */\nfunction addSentryBreadcrumb(serializedData) {\n // There's always something that can go wrong with deserialization...\n try {\n var event_1 = JSON.parse(serializedData);\n getCurrentHub().addBreadcrumb({\n category: \"sentry.\" + (event_1.type === 'transaction' ? 'transaction' : 'event'),\n event_id: event_1.event_id,\n level: event_1.level || Severity.fromString('error'),\n message: getEventDescription(event_1),\n }, {\n event: event_1,\n });\n }\n catch (_oO) {\n logger.error('Error while adding sentry type breadcrumb');\n }\n}\n//# sourceMappingURL=breadcrumbs.js.map","import * as tslib_1 from \"tslib\";\nimport { getCurrentHub } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { addExceptionMechanism, getGlobalObject, getLocationHref, isErrorEvent, isPrimitive, isString, logger, } from '@sentry/utils';\nimport { eventFromUnknownInput } from '../eventbuilder';\nimport { shouldIgnoreOnError } from '../helpers';\n/** Global handlers */\nvar GlobalHandlers = /** @class */ (function () {\n /** JSDoc */\n function GlobalHandlers(options) {\n /**\n * @inheritDoc\n */\n this.name = GlobalHandlers.id;\n /** JSDoc */\n this._global = getGlobalObject();\n /** JSDoc */\n this._oldOnErrorHandler = null;\n /** JSDoc */\n this._oldOnUnhandledRejectionHandler = null;\n /** JSDoc */\n this._onErrorHandlerInstalled = false;\n /** JSDoc */\n this._onUnhandledRejectionHandlerInstalled = false;\n this._options = tslib_1.__assign({ onerror: true, onunhandledrejection: true }, options);\n }\n /**\n * @inheritDoc\n */\n GlobalHandlers.prototype.setupOnce = function () {\n Error.stackTraceLimit = 50;\n if (this._options.onerror) {\n logger.log('Global Handler attached: onerror');\n this._installGlobalOnErrorHandler();\n }\n if (this._options.onunhandledrejection) {\n logger.log('Global Handler attached: onunhandledrejection');\n this._installGlobalOnUnhandledRejectionHandler();\n }\n };\n /** JSDoc */\n GlobalHandlers.prototype._installGlobalOnErrorHandler = function () {\n if (this._onErrorHandlerInstalled) {\n return;\n }\n var self = this; // tslint:disable-line:no-this-assignment\n this._oldOnErrorHandler = this._global.onerror;\n this._global.onerror = function (msg, url, line, column, error) {\n var currentHub = getCurrentHub();\n var hasIntegration = currentHub.getIntegration(GlobalHandlers);\n var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n if (self._oldOnErrorHandler) {\n return self._oldOnErrorHandler.apply(this, arguments);\n }\n return false;\n }\n var client = currentHub.getClient();\n var event = isPrimitive(error)\n ? self._eventFromIncompleteOnError(msg, url, line, column)\n : self._enhanceEventWithInitialFrame(eventFromUnknownInput(error, undefined, {\n attachStacktrace: client && client.getOptions().attachStacktrace,\n rejection: false,\n }), url, line, column);\n addExceptionMechanism(event, {\n handled: false,\n type: 'onerror',\n });\n currentHub.captureEvent(event, {\n originalException: error,\n });\n if (self._oldOnErrorHandler) {\n return self._oldOnErrorHandler.apply(this, arguments);\n }\n return false;\n };\n this._onErrorHandlerInstalled = true;\n };\n /** JSDoc */\n GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () {\n if (this._onUnhandledRejectionHandlerInstalled) {\n return;\n }\n var self = this; // tslint:disable-line:no-this-assignment\n this._oldOnUnhandledRejectionHandler = this._global.onunhandledrejection;\n this._global.onunhandledrejection = function (e) {\n var error = e;\n // dig the object of the rejection out of known event types\n try {\n // PromiseRejectionEvents store the object of the rejection under 'reason'\n // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n if ('reason' in e) {\n error = e.reason;\n }\n // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n // https://github.com/getsentry/sentry-javascript/issues/2380\n else if ('detail' in e && 'reason' in e.detail) {\n error = e.detail.reason;\n }\n }\n catch (_oO) {\n // no-empty\n }\n var currentHub = getCurrentHub();\n var hasIntegration = currentHub.getIntegration(GlobalHandlers);\n var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n if (self._oldOnUnhandledRejectionHandler) {\n return self._oldOnUnhandledRejectionHandler.apply(this, arguments);\n }\n return true;\n }\n var client = currentHub.getClient();\n var event = isPrimitive(error)\n ? self._eventFromIncompleteRejection(error)\n : eventFromUnknownInput(error, undefined, {\n attachStacktrace: client && client.getOptions().attachStacktrace,\n rejection: true,\n });\n event.level = Severity.Error;\n addExceptionMechanism(event, {\n handled: false,\n type: 'onunhandledrejection',\n });\n currentHub.captureEvent(event, {\n originalException: error,\n });\n if (self._oldOnUnhandledRejectionHandler) {\n return self._oldOnUnhandledRejectionHandler.apply(this, arguments);\n }\n return true;\n };\n this._onUnhandledRejectionHandlerInstalled = true;\n };\n /**\n * This function creates a stack from an old, error-less onerror handler.\n */\n GlobalHandlers.prototype._eventFromIncompleteOnError = function (msg, url, line, column) {\n var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;\n // If 'message' is ErrorEvent, get real message from inside\n var message = isErrorEvent(msg) ? msg.message : msg;\n var name;\n if (isString(message)) {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n }\n var event = {\n exception: {\n values: [\n {\n type: name || 'Error',\n value: message,\n },\n ],\n },\n };\n return this._enhanceEventWithInitialFrame(event, url, line, column);\n };\n /**\n * This function creates an Event from an TraceKitStackTrace that has part of it missing.\n */\n GlobalHandlers.prototype._eventFromIncompleteRejection = function (error) {\n return {\n exception: {\n values: [\n {\n type: 'UnhandledRejection',\n value: \"Non-Error promise rejection captured with value: \" + error,\n },\n ],\n },\n };\n };\n /** JSDoc */\n GlobalHandlers.prototype._enhanceEventWithInitialFrame = function (event, url, line, column) {\n event.exception = event.exception || {};\n event.exception.values = event.exception.values || [];\n event.exception.values[0] = event.exception.values[0] || {};\n event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {};\n event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || [];\n var colno = isNaN(parseInt(column, 10)) ? undefined : column;\n var lineno = isNaN(parseInt(line, 10)) ? undefined : line;\n var filename = isString(url) && url.length > 0 ? url : getLocationHref();\n if (event.exception.values[0].stacktrace.frames.length === 0) {\n event.exception.values[0].stacktrace.frames.push({\n colno: colno,\n filename: filename,\n function: '?',\n in_app: true,\n lineno: lineno,\n });\n }\n return event;\n };\n /**\n * @inheritDoc\n */\n GlobalHandlers.id = 'GlobalHandlers';\n return GlobalHandlers;\n}());\nexport { GlobalHandlers };\n//# sourceMappingURL=globalhandlers.js.map","import * as tslib_1 from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { isInstanceOf } from '@sentry/utils';\nimport { exceptionFromStacktrace } from '../parsers';\nimport { computeStackTrace } from '../tracekit';\nvar DEFAULT_KEY = 'cause';\nvar DEFAULT_LIMIT = 5;\n/** Adds SDK info to an event. */\nvar LinkedErrors = /** @class */ (function () {\n /**\n * @inheritDoc\n */\n function LinkedErrors(options) {\n if (options === void 0) { options = {}; }\n /**\n * @inheritDoc\n */\n this.name = LinkedErrors.id;\n this._key = options.key || DEFAULT_KEY;\n this._limit = options.limit || DEFAULT_LIMIT;\n }\n /**\n * @inheritDoc\n */\n LinkedErrors.prototype.setupOnce = function () {\n addGlobalEventProcessor(function (event, hint) {\n var self = getCurrentHub().getIntegration(LinkedErrors);\n if (self) {\n return self._handler(event, hint);\n }\n return event;\n });\n };\n /**\n * @inheritDoc\n */\n LinkedErrors.prototype._handler = function (event, hint) {\n if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n return event;\n }\n var linkedErrors = this._walkErrorTree(hint.originalException, this._key);\n event.exception.values = tslib_1.__spread(linkedErrors, event.exception.values);\n return event;\n };\n /**\n * @inheritDoc\n */\n LinkedErrors.prototype._walkErrorTree = function (error, key, stack) {\n if (stack === void 0) { stack = []; }\n if (!isInstanceOf(error[key], Error) || stack.length + 1 >= this._limit) {\n return stack;\n }\n var stacktrace = computeStackTrace(error[key]);\n var exception = exceptionFromStacktrace(stacktrace);\n return this._walkErrorTree(error[key], key, tslib_1.__spread([exception], stack));\n };\n /**\n * @inheritDoc\n */\n LinkedErrors.id = 'LinkedErrors';\n return LinkedErrors;\n}());\nexport { LinkedErrors };\n//# sourceMappingURL=linkederrors.js.map","import * as tslib_1 from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { getGlobalObject } from '@sentry/utils';\nvar global = getGlobalObject();\n/** UserAgent */\nvar UserAgent = /** @class */ (function () {\n function UserAgent() {\n /**\n * @inheritDoc\n */\n this.name = UserAgent.id;\n }\n /**\n * @inheritDoc\n */\n UserAgent.prototype.setupOnce = function () {\n addGlobalEventProcessor(function (event) {\n if (getCurrentHub().getIntegration(UserAgent)) {\n if (!global.navigator || !global.location) {\n return event;\n }\n // Request Interface: https://docs.sentry.io/development/sdk-dev/event-payloads/request/\n var request = event.request || {};\n request.url = request.url || global.location.href;\n request.headers = request.headers || {};\n request.headers['User-Agent'] = global.navigator.userAgent;\n return tslib_1.__assign({}, event, { request: request });\n }\n return event;\n });\n };\n /**\n * @inheritDoc\n */\n UserAgent.id = 'UserAgent';\n return UserAgent;\n}());\nexport { UserAgent };\n//# sourceMappingURL=useragent.js.map","import { getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core';\nimport { getGlobalObject, SyncPromise } from '@sentry/utils';\nimport { BrowserClient } from './client';\nimport { wrap as internalWrap } from './helpers';\nimport { Breadcrumbs, GlobalHandlers, LinkedErrors, TryCatch, UserAgent } from './integrations';\nexport var defaultIntegrations = [\n new CoreIntegrations.InboundFilters(),\n new CoreIntegrations.FunctionToString(),\n new TryCatch(),\n new Breadcrumbs(),\n new GlobalHandlers(),\n new LinkedErrors(),\n new UserAgent(),\n];\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n * dsn: '__DSN__',\n * // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { configureScope } from '@sentry/browser';\n * configureScope((scope: Scope) => {\n * scope.setExtra({ battery: 0.7 });\n * scope.setTag({ user_mode: 'admin' });\n * scope.setUser({ id: '4711' });\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n * message: 'My Breadcrumb',\n * // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n * message: 'Manual',\n * stacktrace: [\n * // ...\n * ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nexport function init(options) {\n if (options === void 0) { options = {}; }\n if (options.defaultIntegrations === undefined) {\n options.defaultIntegrations = defaultIntegrations;\n }\n if (options.release === undefined) {\n var window_1 = getGlobalObject();\n // This supports the variable that sentry-webpack-plugin injects\n if (window_1.SENTRY_RELEASE && window_1.SENTRY_RELEASE.id) {\n options.release = window_1.SENTRY_RELEASE.id;\n }\n }\n initAndBind(BrowserClient, options);\n}\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\nexport function showReportDialog(options) {\n if (options === void 0) { options = {}; }\n if (!options.eventId) {\n options.eventId = getCurrentHub().lastEventId();\n }\n var client = getCurrentHub().getClient();\n if (client) {\n client.showReportDialog(options);\n }\n}\n/**\n * This is the getter for lastEventId.\n *\n * @returns The last event id of a captured event.\n */\nexport function lastEventId() {\n return getCurrentHub().lastEventId();\n}\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function forceLoad() {\n // Noop\n}\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function onLoad(callback) {\n callback();\n}\n/**\n * A promise that resolves when all current events have been sent.\n * If you provide a timeout and the queue takes longer to drain the promise returns false.\n *\n * @param timeout Maximum time in ms the client should wait.\n */\nexport function flush(timeout) {\n var client = getCurrentHub().getClient();\n if (client) {\n return client.flush(timeout);\n }\n return SyncPromise.reject(false);\n}\n/**\n * A promise that resolves when all current events have been sent.\n * If you provide a timeout and the queue takes longer to drain the promise returns false.\n *\n * @param timeout Maximum time in ms the client should wait.\n */\nexport function close(timeout) {\n var client = getCurrentHub().getClient();\n if (client) {\n return client.close(timeout);\n }\n return SyncPromise.reject(false);\n}\n/**\n * Wrap code within a try/catch block so the SDK is able to capture errors.\n *\n * @param fn A function to wrap.\n *\n * @returns The result of wrapped function call.\n */\nexport function wrap(fn) {\n return internalWrap(fn)(); // tslint:disable-line:no-unsafe-any\n}\n//# sourceMappingURL=sdk.js.map","import { getCurrentHub } from '@sentry/hub';\nimport { logger } from '@sentry/utils';\n/**\n * Internal function to create a new SDK client instance. The client is\n * installed and then bound to the current scope.\n *\n * @param clientClass The client class to instanciate.\n * @param options Options to pass to the client.\n */\nexport function initAndBind(clientClass, options) {\n if (options.debug === true) {\n logger.enable();\n }\n getCurrentHub().bindClient(new clientClass(options));\n}\n//# sourceMappingURL=sdk.js.map","import { getGlobalObject, isPlainObject, logger } from '@sentry/utils';\n/** JSDoc */\nvar Vue = /** @class */ (function () {\n /**\n * @inheritDoc\n */\n function Vue(options) {\n if (options === void 0) { options = {}; }\n /**\n * @inheritDoc\n */\n this.name = Vue.id;\n /**\n * When set to false, Sentry will suppress reporting all props data\n * from your Vue components for privacy concerns.\n */\n this._attachProps = true;\n /**\n * When set to true, original Vue's `logError` will be called as well.\n * https://github.com/vuejs/vue/blob/c2b1cfe9ccd08835f2d99f6ce60f67b4de55187f/src/core/util/error.js#L38-L48\n */\n this._logErrors = false;\n // tslint:disable-next-line: no-unsafe-any\n this._Vue = options.Vue || getGlobalObject().Vue;\n if (options.logErrors !== undefined) {\n this._logErrors = options.logErrors;\n }\n if (options.attachProps === false) {\n this._attachProps = false;\n }\n }\n /** JSDoc */\n Vue.prototype._formatComponentName = function (vm) {\n // tslint:disable:no-unsafe-any\n if (vm.$root === vm) {\n return 'root instance';\n }\n var name = vm._isVue ? vm.$options.name || vm.$options._componentTag : vm.name;\n return ((name ? \"component <\" + name + \">\" : 'anonymous component') +\n (vm._isVue && vm.$options.__file ? \" at \" + vm.$options.__file : ''));\n };\n /**\n * @inheritDoc\n */\n Vue.prototype.setupOnce = function (_, getCurrentHub) {\n // tslint:disable:no-unsafe-any\n var _this = this;\n if (!this._Vue || !this._Vue.config) {\n logger.error('VueIntegration is missing a Vue instance');\n return;\n }\n var oldOnError = this._Vue.config.errorHandler;\n this._Vue.config.errorHandler = function (error, vm, info) {\n var metadata = {};\n if (isPlainObject(vm)) {\n metadata.componentName = _this._formatComponentName(vm);\n if (_this._attachProps) {\n metadata.propsData = vm.$options.propsData;\n }\n }\n if (info !== void 0) {\n metadata.lifecycleHook = info;\n }\n if (getCurrentHub().getIntegration(Vue)) {\n // This timeout makes sure that any breadcrumbs are recorded before sending it off the sentry\n setTimeout(function () {\n getCurrentHub().withScope(function (scope) {\n scope.setContext('vue', metadata);\n getCurrentHub().captureException(error);\n });\n });\n }\n if (typeof oldOnError === 'function') {\n oldOnError.call(_this._Vue, error, vm, info);\n }\n if (_this._logErrors) {\n _this._Vue.util.warn(\"Error in \" + info + \": \\\"\" + error.toString() + \"\\\"\", vm);\n // tslint:disable-next-line:no-console\n console.error(error);\n }\n };\n };\n /**\n * @inheritDoc\n */\n Vue.id = 'Vue';\n return Vue;\n}());\nexport { Vue };\n//# sourceMappingURL=vue.js.map","import * as Sentry from \"@sentry/browser\";\nimport { Vue as SentryVueIntegration } from \"@sentry/integrations\";\nimport \"objectFitPolyfill\";\nimport { gtmCustomEventPush, EVENTS } from \"./analytics\";\nimport Bowser from \"bowser\";\n\nexport const DESKTOP_SIZE = 992; // >= 992\nexport const TABLET_SIZE = 768; // =< 991\nexport const getSentryEnv = () => {\n\tswitch (location.hostname) {\n\t\tcase \"www.lodgecastiron.com\":\n\t\t\treturn \"production\";\n\t\tcase \"stage.acquia.lodgecastiron.com\":\n\t\t\treturn \"staging\";\n\t\tcase \"dev.acquia.lodgecastiron.com\":\n\t\t\treturn \"dev\";\n\t\tdefault:\n\t\t\treturn \"unknown\";\n\t}\n};\nlet sentryHasInititated = false;\nexport const initSentry = (Vue) => {\n\tlet environment = getSentryEnv();\n\tif (environment == \"unknown\") {\n\t\treturn console.info(\n\t\t\t`Unknown Sentry environment, ${location.hostname}, not initiating Sentry reporting.`,\n\t\t);\n\t}\n\tif (sentryHasInititated) {\n\t\treturn console.error(\"Sentry as already been initiated.\");\n\t}\n\tsentryHasInititated = true;\n\tSentry.init({\n\t\tdsn: \"https://a3f5d17337794d00a2fcec782bf2dc59@sentry.io/3826867\",\n\t\tintegrations: !!Vue\n\t\t\t? [new SentryVueIntegration({ Vue, attachProps: true, logErrors: false })]\n\t\t\t: [],\n\t\tenvironment,\n\t});\n\tconsole.log(`Sentry initiated on ${getSentryEnv()}`);\n};\nexport const isLayoutPage = !!document.querySelector(\n\t\"#layout-builder\",\n\t\".node-page-layout-builder-form\",\n);\nexport const THEME_PATH = \"/themes/custom/tombras\";\nexport const DRUPAL_API = \"/api/lodge\";\nexport const GOOGLE_MAPS_KEY = ``;\n/**\n * Helps keep track of component versions\n * @param {string} component\n * @param {string} version\n */\nexport const componentVersion = (component, version = \"WIP\") =>\n\tconsole.log(`${component} - ${version}`);\n\n/**\n * Limits the invocations of a function in a given time frame.\n *\n * The debounce function wrapper should be used sparingly. One clear use case\n * is limiting the invocation of a callback attached to the window resize event.\n *\n * Before using the debounce function wrapper, consider first whether the\n * callback could be attached to an event that fires less frequently or if the\n * function can be written in such a way that it is only invoked under specific\n * conditions.\n *\n * @param {function} func\n * The function to be invoked.\n * @param {number} wait\n * The time period within which the callback function should only be\n * invoked once. For example if the wait period is 250ms, then the callback\n * will only be called at most 4 times per second.\n * @param {boolean} [immediate]\n * Whether we wait at the beginning or end to execute the function.\n *\n * @return {function}\n * The debounced function.\n */\nexport const debounce = (func, wait, immediate) => {\n\tlet timeout;\n\tlet result;\n\treturn function (...args) {\n\t\tconst context = this;\n\t\tconst later = function () {\n\t\t\ttimeout = null;\n\t\t\tif (!immediate) {\n\t\t\t\tresult = func.apply(context, args);\n\t\t\t}\n\t\t};\n\t\tconst callNow = immediate && !timeout;\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t\tif (callNow) {\n\t\t\tresult = func.apply(context, args);\n\t\t}\n\t\treturn result;\n\t};\n};\n\n/**\n * throttle func is called once per duration\n * @param func\n * @param duration\n * @returns {(function(...[*]=): void)|*}\n */\nexport const throttle = (func, duration) => {\n\tlet shouldWait = false;\n\treturn function (...args) {\n\t\tconst context = this;\n\t\tif (!shouldWait) {\n\t\t\tconsole.log(\"running leading function\", args);\n\t\t\tfunc.apply(context, args)\n\t\t\tshouldWait = true\n\t\t\tsetTimeout(function () {\n\t\t\t\tshouldWait = false;\n\t\t\t\tconsole.log(\"running trailing function\", args);\n\t\t\t\tfunc.apply(context, args);\n\t\t\t}, duration)\n\t\t}\n\t}\n}\n\n/**\n * Various Bowser utils\n */\nconst parser = Bowser.getParser(window.navigator.userAgent);\nexport const isMobile = () => {\n\tconst OS = parser.getOS().name;\n\tconsole.log(OS);\n\treturn [\"android\", \"ios\", \"ipados\"].indexOf(OS.toLowerCase()) >= 0;\n};\nexport const isIE = () => {\n\tconst browser = parser.getResult();\n\tconsole.log(\"browser name\", browser);\n\treturn browser.browser.name.toLowerCase() === \"internet explorer\";\n};\n\nexport const qs = (selector, el = document) => el.querySelector(selector);\nexport const qsa = (selector, el = document) => el.querySelectorAll(selector);\nexport const LEFT = \"LEFT\";\nexport const RIGHT = \"RIGHT\";\n\nexport const callFnIfEnterKeyWasPressed = (fn) => (e) => {\n\tif (e.keyCode === 13) fn();\n};\n\nexport function getUrlParameter(name) {\n\tname = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n\tvar regex = new RegExp(\"[\\\\?&]\" + name + \"=([^]*)\");\n\tvar results = regex.exec(location.search);\n\treturn results === null\n\t\t? \"\"\n\t\t: decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n}\n\nexport const queryParams = (locationSearch = window.location.search) =>\n\tlocationSearch\n\t\t.substr(1)\n\t\t.split(\"&\")\n\t\t.reduce(\n\t\t\t(acc, curr) =>\n\t\t\t\tObject.assign(\n\t\t\t\t\tacc,\n\t\t\t\t\t(curr.indexOf(\"=\") !== -1 ? curr : `${curr}=`)\n\t\t\t\t\t\t.split(\"=\")\n\t\t\t\t\t\t.reduce((acc, curr) => ({ [acc]: decodeURIComponent(curr) })),\n\t\t\t\t),\n\t\t\t{},\n\t\t);\nexport const createComponent = (selector, theClass) => {\n\treturn [...qsa(selector)].map((el) => new theClass(el));\n};\n\nexport const handleBackButtons = (selector) => {\n\t[...qsa(selector)].forEach((el) => {\n\t\tel.addEventListener(\"click\", history.back);\n\t\tel.addEventListener(\"keydown\", callFnIfEnterKeyWasPressed(history.back));\n\t});\n};\n\nexport const handlePrintButtons = (selector) => {\n\t[...qsa(selector)].forEach((el) => {\n\t\tel.addEventListener(\"click\", () => {\n\t\t\twindow.print();\n\t\t});\n\t\tel.addEventListener(\n\t\t\t\"keydown\",\n\t\t\tcallFnIfEnterKeyWasPressed(() => {\n\t\t\t\twindow.print();\n\t\t\t}),\n\t\t);\n\t});\n};\n\nexport const validProductProperties = [\n\t\"Material\",\n\t\"Type\",\n\t\"Color\",\n\t\"Size\",\n\t\"Shape\",\n\t\"Collection\",\n\t\"Sale\",\n];\n\nexport const objectFitForIE = () => {\n\tif (isIE()) {\n\t\tconst images = [\n\t\t\t\".fifty-fifty-carousel img\",\n\t\t\t\".hero-block .image-holder img\",\n\t\t\t\".hero-block video\",\n\t\t\t\".product-viewer .image-holder img\",\n\t\t\t\".call-to-action img\",\n\t\t\t// \".author-credits img\",\n\t\t\t\".parallax-image .image-wrapper img\",\n\t\t\t// \".half-large-image--imagery-area .special-image.image-holder img\",\n\t\t\t\".half-large-image--imagery-area .card .image-holder img\",\n\t\t\t\".object-fit-cover\",\n\t\t\t// \".menu--dropdown .promo img\",\n\t\t];\n\t\tobjectFitPolyfill(document.querySelectorAll(images.join(\",\")));\n\t}\n};\n\nexport const chatNowBtn = () => {\n\tconst chats = document.querySelectorAll(\".btn-chat-now\");\n\t[...chats].forEach((el) =>\n\t\tel.addEventListener(\"click\", (e) => {\n\t\t\te.preventDefault();\n\n\t\t\tif (embedded_svc) {\n\t\t\t\tembedded_svc.onHelpButtonClick();\n\t\t\t\tgtmCustomEventPush({\n\t\t\t\t\tevent: EVENTS.STANDALONE_CHAT_NOW,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tgtmCustomEventPush({\n\t\t\t\t\tevent: EVENTS.STANDALONE_CHAT_NOW,\n\t\t\t\t\tvalue: \"Not loaded\",\n\t\t\t\t});\n\t\t\t}\n\t\t}),\n\t);\n};\n\nexport const luma = (hex) => {\n\t// source: https://stackoverflow.com/a/12043228\n\tconst c = hex.substring(1); // strip #\n\tconst rgb = parseInt(c, 16); // convert rrggbb to decimal\n\tconst r = (rgb >> 16) & 0xff; // extract red\n\tconst g = (rgb >> 8) & 0xff; // extract green\n\tconst b = (rgb >> 0) & 0xff; // extract blue\n\treturn 0.2126 * r + 0.7152 * g + 0.0722 * b; // per ITU-R BT.709\n};\n\nexport const getSwatchOrColor = (color) => {\n\treturn !color.swatch ? color.hex : `url(${color.swatch})`;\n};\n\nexport const getProductColorBorderColor = (color, defaultColor = \"#ccc\") => {\n\treturn color.indexOf(\"#\") !== 0\n\t\t? defaultColor\n\t\t: luma(color) < 205\n\t\t? color\n\t\t: \"#ccc\";\n};\n\nexport const playMobileFullscreenHelper = (\n\tstream,\n\tidentifier = \"unidentified stream\",\n) => {\n\tconsole.log(\"playing mobile fullscreen\", this.stream);\n\tstream.play();\n\t// try {\n\t// \tstream.webkitEnterFullScreen();\n\t// } catch (err) {\n\t// \tconsole.warn(`${identifier} - stream:`, err);\n\t// \ttry {\n\t// \t\tconst innerVideo = stream.querySelector(\"video\");\n\t// \t\tconsole.log(innerVideo);\n\t// \t\tinnerVideo.webkitEnterFullscreen();\n\t// \t} catch (err) {\n\t// \t\tconsole.warn(`${identifier} - direct 2 video:`, err);\n\t// \t\tstream.pause();\n\t// \t}\n\t// }\n};\n\nexport const addNewBadgeToRecipes = () => {\n\tconst createdDates = [...document.querySelectorAll(\"[data-created-date]\")];\n\tconst today = new Date();\n\tcreatedDates.forEach((el) => {\n\t\tconst daysSincePosting =\n\t\t\t(today - new Date(el.getAttribute(\"data-created-date\"))) /\n\t\t\t1000 /\n\t\t\t60 /\n\t\t\t60 /\n\t\t\t24;\n\t\tif (daysSincePosting < 14) {\n\t\t\tconst inner = el.querySelector(\"span\") || el;\n\t\t\tinner.innerHTML = \"New Recipe!\";\n\t\t\tel.removeAttribute(\"aria-hidden\");\n\t\t\tel.classList.remove(\"visually-hidden\");\n\t\t}\n\t});\n};\n\nexport const copyBlockID = (e) => {\n\tconst uuid = e.target.getAttribute(\"data-copy-uuid\");\n\n\tnavigator.clipboard\n\t\t.writeText(uuid)\n\t\t.then(() => {\n\t\t\te.target.innerText = \"Copied!\";\n\t\t})\n\t\t.catch(() => {\n\t\t\te.target.innerText = \"Click again\";\n\t\t});\n};\n\n/**\n *\n * @param items {Array}\n * @param size {Number}\n */\nexport function chunk (items, size) {\n\tconst chunks = []\n\titems = [].concat(...items)\n\n\twhile (items.length) {\n\t\tchunks.push(\n\t\t\titems.splice(0, size)\n\t\t)\n\t}\n\n\treturn chunks\n}\n\n/**\n * Set equal heights of components\n * @param src string | class name\n */\nexport const equalHeights = (() => {\n\tconst _self = {};\n\tlet _elements = [];\n\n const resetHeight = () => {\n\t\treturn new Promise((resolve) => {\n\t\t\t_elements.slice(0).forEach((el) => {\n\t\t\t\tel.setAttribute('style', 'position: relative; height: auto');\n\t\t\t});\n\t\t\tresolve();\n\t\t});\n }\n\n const setHeight = (hgt) => {\n _elements.slice(0).forEach((el) => {\n el.setAttribute('style', 'position: relative; height: 100%; min-height: ' + hgt + 'px');\n });\n }\n\n const getTallestElement = () => {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst tallest = _elements.slice(0).map((el) => el.offsetHeight)\n\t\t\t.reduce((previousHgt, currentHgt) => (currentHgt > previousHgt) ? currentHgt : previousHgt, 0);\n\t\t\tresolve(tallest);\n\t\t});\n };\n\n _self.reset = async (src) => {\n _elements = [...document.querySelectorAll(src)];\n\t\tawait resetHeight();\n };\n\n _self.set = async (src) => {\n _elements = [...document.querySelectorAll(src)];\n\t\tawait resetHeight();\n\t\tconst tallest = await getTallestElement();\n setHeight(tallest);\n };\n\n\treturn _self;\n})();\n","export default {\n\t// treewithlocationandconcernsfirst\n\t\"tree\": {\n\t\tcommon: {\n\t\t\t\"submit\": {\n\t\t\t\tnode: \"submit\",\n\t\t\t\tchildren: {\n\t\t\t\t\t\"no\": {\n\t\t\t\t\t\tnode: \"start\",\n\t\t\t\t\t\tend: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"text-photo\": {\n\t\t\t\tnode: \"text-photo\",\n\t\t\t\tchildren: \"contact-address\",\n\t\t\t},\n\t\t\t\"contact-address\": {\n\t\t\t\tnode: \"contact-address\",\n\t\t\t\tchildren: \"submit\",\n\t\t\t},\n\t\t\t\"credit-exchange\": {\n\t\t\t\tnode: \"credit-exchange\",\n\t\t\t\tchildren: {\n\t\t\t\t\t\"credit\": \"text-photo\",\n\t\t\t\t\t\"exchange\": \"text-photo\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"replace\": {\n\t\t\t\tnode: \"replace\",\n\t\t\t\tchildren: {\n\t\t\t\t\t\"replace\": \"text-photo\",\n\t\t\t\t\t\"no\": \"text-photo\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"refund\": {\n\t\t\t\tnode: \"refund\",\n\t\t\t\tchildren: {\n\t\t\t\t\t\"refund\": \"text-photo\",\n\t\t\t\t\t\"no\": \"text-photo\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"replace-refund\": {\n\t\t\t\tnode: \"replace-refund\",\n\t\t\t\tchildren: {\n\t\t\t\t\t\"refund\": \"text-photo\",\n\t\t\t\t\t\"replacement\": \"text-photo\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"replace-return\": {\n\t\t\t\tnode: \"replace-return\",\n\t\t\t\tchildren: {\n\t\t\t\t\t\"refund\": \"text-photo\",\n\t\t\t\t\t\"replacement-parts\": \"text-photo\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"lodge-reason\": {\n\t\t\t\tnode: \"reason\",\n\t\t\t\tchildren: {\n\t\t\t\t\t\"wrong-product\": \"replace-refund\",\n\t\t\t\t\t\"not-wanted\": \"contact-address\",\n\t\t\t\t\t\"not-expected\": {\n\t\t\t\t\t\tnode: \"how-so\",\n\t\t\t\t\t\tchildren: \"text-photo\",\n\t\t\t\t\t},\n\t\t\t\t\t\"parts-missing\": {\n\t\t\t\t\t\tnode: \"shipping-box-damaged\",\n\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t// NEW\n\t\t\t\t\t\t\t// LODGE same flow for both but need photos if box damaged\n\t\t\t\t\t\t\t// Amazon/Retailer\n\t\t\t\t\t\t\t// don't care about shipping box damage\n\t\t\t\t\t\t\t// submit - send them back to source\n\t\t\t\t\t\t\t\"yes\": {\n\t\t\t\t\t\t\t\tnode: \"parts-missing\",\n\t\t\t\t\t\t\t\tchildren: \"replace-return\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"no\": {\n\t\t\t\t\t\t\t\tnode: \"parts-missing\",\n\t\t\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\t\tnode: \"replace-return\",\n\t\t\t\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\t\t\t\"refund\": \"contact-address\",\n\t\t\t\t\t\t\t\t\t\t\"replacement-parts\": \"contact-address\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t\"missing-order\": \"replace-refund\",\n\t\t\t\t\t\"not-received\": \"text-photo\",\n\t\t\t\t\t\"noticeable-imperfection\": \"refund\",\n\t\t\t\t\t\"other\": \"text-photo\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"retailer-reason\": {\n\t\t\t\tnode: \"reason\",\n\t\t\t\tchildren: {\n\t\t\t\t\t\"wrong-product\": \"submit\",\n\n\t\t\t\t\t// need to handle shipping box damage so we can show the right verbiage\n\t\t\t\t\t// Concern spreadsheet updated to show verbiage for\n\t\t\t\t\t// Amazon with damaged shipping box vs non\n\t\t\t\t\t// and retailer with damaged shipping box vs non\n\t\t\t\t\t\"parts-missing\": {\n\t\t\t\t\t\tnode: \"shipping-box-damaged\",\n\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\"yes\": \"submit\",\n\t\t\t\t\t\t\t\"no\": {\n\t\t\t\t\t\t\t\tnode: \"parts-missing\",\n\t\t\t\t\t\t\t\tchildren: \"contact-address\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"not-wanted\": \"submit\",\n\t\t\t\t\t\"not-expected\": {\n\t\t\t\t\t\tnode: \"how-so\",\n\t\t\t\t\t\tchildren: \"text-photo\",\n\t\t\t\t\t},\n\t\t\t\t\t\"not-received\": \"submit\",\n\t\t\t\t\t\"missing-order\": \"submit\",\n\t\t\t\t\t\"noticeable-imperfection\": \"text-photo\",\n\t\t\t\t\t\"other\": \"text-photo\"\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"damaged\": {\n\t\t\t\tnode: \"damaged\",\n\t\t\t\tchildren: {\n\t\t\t\t\t\"yes\": {\n\t\t\t\t\t\tnode: \"used\",\n\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\"yes\": {\n\t\t\t\t\t\t\t\tnode: \"dropped\",\n\t\t\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\t\t\"yes\": \"submit\",\n\t\t\t\t\t\t\t\t\t\"no\": {\n\t\t\t\t\t\t\t\t\t\tnode: \"used-follow-up-questions\",\n\t\t\t\t\t\t\t\t\t\tchildren: \"text-photo\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"no\": {\n\t\t\t\t\t\t\t\tnode: \"product-order\",\n\t\t\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\t\t\"which-product\": {\n\t\t\t\t\t\t\t\t\t\tnode: \"purchased-from\",\n\t\t\t\t\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\t\t\t\t\"website\": {\n\t\t\t\t\t\t\t\t\t\t\t\tnode: \"shipping-box-damaged\",\n\t\t\t\t\t\t\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"yes\": \"replace-refund\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"no\": \"replace-refund\",\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\"gift\": \"submit\",\n\t\t\t\t\t\t\t\t\t\t\t\"amazon\": \"submit\",\n\t\t\t\t\t\t\t\t\t\t\t\"retailer\": \"submit\",\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"which-order\": \"replace-refund\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t\"no\": {\n\t\t\t\t\t\tnode: \"used\",\n\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t// USED\n\t\t\t\t\t\t\t// LODGE/AMAZON/RETAILER - you have to buy it - submit\n\t\t\t\t\t\t\t// IF can't find part then send to CC for help\n\t\t\t\t\t\t\t// If can find part then give link to go buy part\n\t\t\t\t\t\t\t\"yes\": {\n\t\t\t\t\t\t\t\tnode: \"reason\",\n\t\t\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\t\t\"parts-missing\": {\n\t\t\t\t\t\t\t\t\t\tnode: \"parts-missing\",\n\t\t\t\t\t\t\t\t\t\tchildren: \"replace-return\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\"other\": {\n\t\t\t\t\t\t\t\t\t\tnode: \"used-follow-up-questions\",\n\t\t\t\t\t\t\t\t\t\tchildren: \"text-photo\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"no\": {\n\t\t\t\t\t\t\t\tnode: \"purchased-from\",\n\t\t\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\t\t\"website\": \"lodge-reason\",\n\t\t\t\t\t\t\t\t\t// this needs to be handled with reason\n\t\t\t\t\t\t\t\t\t\"gift\": \"retailer-reason\",\n\t\t\t\t\t\t\t\t\t\"amazon\": \"retailer-reason\",\n\t\t\t\t\t\t\t\t\t\"retailer\": \"retailer-reason\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"select-concern\": {\n\t\t\t\tnode: \"select-concern\",\n\t\t\t\tchildren: {\n\t\t\t\t\t\"still-need-help\": {\n\t\t\t\t\t\tnode: \"still-need-help\",\n\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\"yes\": \"damaged\",\n\t\t\t\t\t\t\t\"no\": \"submit\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t\"missing-order\": {\n\t\t\t\t\t\tnode: \"replace-refund\",\n\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\"refund\": \"contact-address\",\n\t\t\t\t\t\t\t\"replace\": \"contact-address\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t\"need-purchase-location\": \"purchased-from\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"purchased-from\": {\n\t\t\t\tnode: \"purchased-from\",\n\t\t\t\tchildren: {\n\t\t\t\t\t\"website\": \"damaged\",\n\t\t\t\t\t\"gift\": \"damaged\",\n\t\t\t\t\t\"amazon\": \"damaged\",\n\t\t\t\t\t\"retailer\": \"damaged\",\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"request-parts\": {\n\t\t\t\tnode: \"request-parts\",\n\t\t\t\tchildren: {\n\t\t\t\t\t\"yes\": {\n\t\t\t\t\t\tnode: \"shipping-box-damaged\",\n\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\"yes\": \"text-photo\",\n\t\t\t\t\t\t\t\"no\": {\n\t\t\t\t\t\t\t\tnode: \"parts-missing\",\n\t\t\t\t\t\t\t\tchildren: \"contact-address\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t\"no\": \"submit\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tchildren: {\n\t\t\t\"start\": {\n\t\t\t\tnode: \"start\",\n\t\t\t\tchildren: {\n\t\t\t\t\t\"product-order\": {\n\t\t\t\t\t\tnode: \"product-order\",\n\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\"which-product\": {\n\t\t\t\t\t\t\t\tnode: \"which-product\",\n\t\t\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\t\t\"used\": {\n\t\t\t\t\t\t\t\t\t\tnode: \"used\",\n\t\t\t\t\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\t\t\t\t\"yes\": \"select-concern\",\n\t\t\t\t\t\t\t\t\t\t\t\"no\": \"select-concern\",\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\"which-order\": {\n\t\t\t\t\t\t\t\tnode: \"which-order\",\n\t\t\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\t\t\"used\": {\n\t\t\t\t\t\t\t\t\t\tnode: \"used\",\n\t\t\t\t\t\t\t\t\t\tchildren: {\n\t\t\t\t\t\t\t\t\t\t\t\"yes\": \"select-concern\",\n\t\t\t\t\t\t\t\t\t\t\t\"no\": \"select-concern\",\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t},\n\n\t\"nodes\": {\n\t\t\"start\": {\n\t\t\tlabel: \"Let's get started\",\n\t\t\ttype: \"start\",\n\t\t},\n\t\t\"end-flow\": {\n\t\t\tlabel: \"Glad we could help!\",\n\t\t\ttype: \"end\",\n\t\t},\n\t\t\"product-order\": {\n\t\t\tsubtitle: \"Choose a path\",\n\t\t\tlabel: \"Do you have an issue with or need to return a product or order?\",\n\t\t\ttype: \"question\",\n\t\t\tmeta: {\n\t\t\t\t\"addToNotes\": true,\n\t\t\t\t\"autoContinue\": true,\n\t\t\t},\n\t\t\toptions: [\n\t\t\t\t{ value: \"which-product\", text: \"Product\", description: \"Search for a product by name or SKU\" },\n\t\t\t\t{ value: \"which-order\", text: \"Order\", description: \"Choose a product from a previous order\" },\n\t\t\t],\n\t\t},\n\t\t\"which-product\": {\n\t\t\tsubtitle: \"Find a product\",\n\t\t\tlabel: \"Which product are you having a problem with?\",\n\t\t\ttype: \"product-finder\",\n\t\t\toptions: [],\n\t\t},\n\t\t\"which-order\": {\n\t\t\tsubtitle: \"Find an order\",\n\t\t\tlabel: \"Which order are you have a problem with?\",\n\t\t\ttype: \"order-finder\",\n\t\t\toptions: [],\n\t\t},\n\t\t\"purchased-from\": {\n\t\t\tsubtitle: \"Choose retailer\",\n\t\t\tlabel: \"Where was the item purchased?\",\n\t\t\tcopy: \"Note that we can't refund/replace items if they were not purchased from Lodge\",\n\t\t\ttype: \"question\",\n\t\t\tmeta: {\n\t\t\t\t\"addToNotes\": false,\n\t\t\t\t\"autoContinue\": true,\n\t\t\t},\n\t\t\toptions: [\n\t\t\t\t{ value: \"website\", text: \"Lodge website\" },\n\t\t\t\t{ value: \"gift\", text: \"Gift or I don't know\" },\n\t\t\t\t{ value: \"amazon\", text: \"Amazon\" },\n\t\t\t\t{ value: \"retailer\", text: \"Another Retailer\" },\n\t\t\t],\n\t\t},\n\t\t\"request-parts\": {\n\t\t\tlabel: \"Would you like parts?\",\n\t\t\tcopy: \"This screen will be dependent on whether parts are available for the selected product once we have that data in Commerce Cloud\",\n\t\t\ttype: \"question\",\n\t\t\tmeta: {\n\t\t\t\t\"autoContinue\": true,\n\t\t\t},\n\t\t\toptions: [\n\t\t\t\t{ value: \"yes\", text: \"Yes\" },\n\t\t\t\t{ value: \"no\", text: \"No\" },\n\t\t\t],\n\t\t},\n\t\t\"text-photo\": {\n\t\t\tlabel: \"Please enter text and/or upload a photo\",\n\t\t\ttype: \"photo-uploader\",\n\t\t\toptions: [],\n\t\t},\n\t\t\"photo-uploader\": {\n\t\t\tlabel: \"Please enter text and/or upload a photo\",\n\t\t\ttype: \"photo-uploader\",\n\t\t\toptions: [],\n\t\t},\n\t\t\"damaged\": {\n\t\t\t\"label\": \"Is the product damaged?\",\n\t\t\t\"type\": \"question\",\n\t\t\t\"meta\": {\n\t\t\t\t\"autoContinue\": true,\n\t\t\t},\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"yes\", text: \"Yes\" },\n\t\t\t\t{ value: \"no\", text: \"No\" },\n\t\t\t],\n\t\t},\n\t\t\"used\": {\n\t\t\t\"label\": \"Has the item been used?\",\n\t\t\t\"type\": \"question\",\n\t\t\t\"meta\": {\n\t\t\t\t\"autoContinue\": true,\n\t\t\t},\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"yes\", text: \"Yes\" },\n\t\t\t\t{ value: \"no\", text: \"No\" },\n\t\t\t],\n\t\t},\n\t\t\"damage-follow-up-questions\": {\n\t\t\t\"label\": \"We need a bit more info:\",\n\t\t\t\"type\": \"multi-node\",\n\t\t\t\"nodes\": [\n\t\t\t\t\"when-purchased\",\n\t\t\t\t\"type-of-stove\",\n\t\t\t\t\"what-heat\",\n\t\t\t\t\"what-preheat\",\n\t\t\t],\n\t\t},\n\t\t\"used-follow-up-questions\": {\n\t\t\t\"label\": \"We need a bit more info:\",\n\t\t\t\"type\": \"multi-node\",\n\t\t\t\"meta\": {\n\t\t\t\tfilter: \"material\",\n\t\t\t},\n\t\t\t\"nodes\": [\n\t\t\t\t{\n\t\t\t\t\tnode: \"type-of-stove\",\n\t\t\t\t\tfilters: {\n\t\t\t\t\t\t\"material\": [\n\t\t\t\t\t\t\t\"Seasoned Cast Iron\",\n\t\t\t\t\t\t\t\"Carbon Steel\",\n\t\t\t\t\t\t\t\"Enameled Cast Iron\",\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnode: \"heat-source\",\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t\tfilters: {\n\t\t\t\t\t\t\"material\": [\n\t\t\t\t\t\t\t\"Accessories\",\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// conditional node\n\t\t\t\t{\n\t\t\t\t\tnode: \"what-heat\",\n\t\t\t\t\trequired: true,\n\t\t\t\t\tfilters: {\n\t\t\t\t\t\t\"material\": [\n\t\t\t\t\t\t\t\"Seasoned Cast Iron\",\n\t\t\t\t\t\t\t\"Carbon Steel\",\n\t\t\t\t\t\t\t\"Enameled Cast Iron\",\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// conditional node\n\t\t\t\t{\n\t\t\t\t\tnode: \"what-heat-accessory\",\n\t\t\t\t\tfilters: {\n\t\t\t\t\t\t\"material\": [\n\t\t\t\t\t\t\t\"Accessories\",\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\n\t\t\t\t// not required?\n\t\t\t\t{\n\t\t\t\t\tnode: \"what-issue-accessory\",\n\t\t\t\t\tfilters: {\n\t\t\t\t\t\t\"material\": [\n\t\t\t\t\t\t\t\"Accessories\",\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// not required?\n\t\t\t\t{\n\t\t\t\t\tnode: \"how-used-accessory\",\n\t\t\t\t\tfilters: {\n\t\t\t\t\t\t\"material\": [\n\t\t\t\t\t\t\t\"Accessories\",\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnode: \"what-preheat\",\n\t\t\t\t\tfilters: {\n\t\t\t\t\t\t\"material\": [\n\t\t\t\t\t\t\t\"Seasoned Cast Iron\",\n\t\t\t\t\t\t\t\"Carbon Steel\",\n\t\t\t\t\t\t\t\"Enameled Cast Iron\",\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"how-cleaned\",\n\t\t\t\t\"how-damaged\",\n\t\t\t],\n\t\t},\n\t\t\"when-purchased\": {\n\t\t\t\"label\": \"When was the item purchased\",\n\t\t\t\"type\": \"date-input\",\n\t\t\tmeta: {\n\t\t\t\t\"input-only\": true,\n\t\t\t\t\"addToNotes\": true,\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t},\n\t\t\"heat-source\": {\n\t\t\t\"label\": \"What heat source is the item being used on?\",\n\t\t\t\"type\": \"question\",\n\t\t\tmeta: {\n\t\t\t\t\"input-only\": true,\n\t\t\t\t\"addToNotes\": true,\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"gas\", text: \"Gas\" },\n\t\t\t\t{ value: \"electric\", text: \"Electric\" },\n\t\t\t\t{ value: \"induction\", text: \"Induction\" },\n\t\t\t\t{ value: \"charcoal\", text: \"Charcoal\" },\n\t\t\t],\n\t\t},\n\t\t\"type-of-stove\": {\n\t\t\t\"label\": \"What type of stove do you use?\",\n\t\t\t\"type\": \"question\",\n\t\t\tmeta: {\n\t\t\t\t\"input-only\": true,\n\t\t\t\t\"addToNotes\": true,\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"gas\", text: \"Gas\" },\n\t\t\t\t{ value: \"electric\", text: \"Electric\" },\n\t\t\t\t{ value: \"induction\", text: \"Induction\" },\n\t\t\t],\n\t\t},\n\t\t\"what-heat\": {\n\t\t\t\"label\": \"Do you start on low, medium, or high when cooking on the stove top?\",\n\t\t\t\"type\": \"question\",\n\t\t\tmeta: {\n\t\t\t\t\"input-only\": true,\n\t\t\t\t\"addToNotes\": true,\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"low\", text: \"Low\" },\n\t\t\t\t{ value: \"medium\", text: \"Medium\" },\n\t\t\t\t{ value: \"high\", text: \"High\" },\n\t\t\t],\n\t\t},\n\t\t\"what-heat-accessory\": {\n\t\t\t\"label\": \"What temperature setting do you cook with if using the accessory on the stovetop or in the oven?\",\n\t\t\t\"type\": \"text-input\",\n\t\t\tmeta: {\n\t\t\t\t\"input-only\": true,\n\t\t\t\t\"addToNotes\": true,\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t},\n\t\t\"what-issue-accessory\": {\n\t\t\t\"label\": \"What issue are you having with the item?\",\n\t\t\t\"type\": \"text-input\",\n\t\t\tmeta: {\n\t\t\t\t\"input-only\": true,\n\t\t\t\t\"addToNotes\": true,\n\t\t\t\trequired: false,\n\t\t\t},\n\t\t},\n\t\t\"how-used-accessory\": {\n\t\t\t\"label\": \"How was the item used?\",\n\t\t\t\"type\": \"text-input\",\n\t\t\tmeta: {\n\t\t\t\t\"input-only\": true,\n\t\t\t\t\"addToNotes\": true,\n\t\t\t\trequired: false,\n\t\t\t},\n\t\t},\n\t\t\"what-preheat\": {\n\t\t\t\"label\": \"What do you typically put in the cookware to preheat it?\",\n\t\t\t\"type\": \"text-input\",\n\t\t\tmeta: {\n\t\t\t\t\"input-only\": true,\n\t\t\t\t\"addToNotes\": true,\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t},\n\t\t\"how-cleaned\": {\n\t\t\t\"label\": \"How is the item cleaned and cared for?\",\n\t\t\t\"type\": \"text-input\",\n\t\t\tmeta: {\n\t\t\t\t\"input-only\": true,\n\t\t\t\t\"addToNotes\": true,\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t},\n\t\t\"how-damaged\": {\n\t\t\t\"label\": \"How did the damage happen?\",\n\t\t\t\"type\": \"text-input\",\n\t\t\tmeta: {\n\t\t\t\t\"input-only\": true,\n\t\t\t\t\"addToNotes\": true,\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t},\n\t\t\"dropped\": {\n\t\t\t\"label\": \"Was the item dropped?\",\n\t\t\t\"type\": \"question\",\n\t\t\tmeta: {\n\t\t\t\t// \"input-only\": true,\n\t\t\t\t\"addToNotes\": true,\n\t\t\t\t\"autoContinue\": true,\n\t\t\t\tfilters: {\n\t\t\t\t\t\"select-concern\": [\n\t\t\t\t\t\t\"Chipped\",\n\t\t\t\t\t\t\"Cracked\",\n\t\t\t\t\t\t\"Handle Broken\",\n\t\t\t\t\t\t\"Handle Broke\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\tfilteredAnswer: { value: \"no\", text: \"No\" },\n\t\t\t},\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"yes\", text: \"Yes\" },\n\t\t\t\t{ value: \"no\", text: \"No\" },\n\t\t\t],\n\t\t},\n\t\t\"gift\": {\n\t\t\t\"label\": \"Did you receive this item as a gift?\",\n\t\t\t\"type\": \"question\",\n\t\t\tmeta: {\n\t\t\t\t\"autoContinue\": true,\n\t\t\t},\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"yes\", text: \"Yes\" },\n\t\t\t\t{ value: \"no\", text: \"No\" },\n\t\t\t],\n\t\t},\n\t\t\"still-need-help\": {\n\t\t\t\"label\": \"Still need help?\",\n\t\t\t\"type\": \"question\",\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"yes\", text: \"Yes\" },\n\t\t\t\t{ value: \"no\", text: \"No\" },\n\t\t\t],\n\t\t},\n\t\t\"want-cc-help\": {\n\t\t\t\"label\": \"Want customer care help or would like to return the item?\",\n\t\t\t\"type\": \"question\",\n\t\t\tmeta: {\n\t\t\t\t\"autoContinue\": true,\n\t\t\t},\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"yes\", text: \"Customer Care Help\" },\n\t\t\t\t{ value: \"no\", text: \"Return\" },\n\t\t\t],\n\t\t},\n\t\t\"common-concerns\": {\n\t\t\t\"label\": \"Common Concerns\",\n\t\t\t\"type\": \"information\",\n\t\t\t\"information\": `some html with common concerns
`,\n\t\t},\n\t\t\"select-concern\": {\n\t\t\t\"subtitle\": \"Select an issue\",\n\t\t\t\"label\": \"Which issue are you experiencing?\",\n\t\t\t\"type\": \"select-concern\",\n\t\t\tmeta: {\n\t\t\t\t\"input-only\": true,\n\t\t\t\t\"data\": \"material\",\n\t\t\t},\n\t\t},\n\t\t\"reason\": {\n\t\t\t\"label\": \"Reason for a refund\",\n\t\t\t\"type\": \"reason\",\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"wrong-product\", text: \"I was shipped the wrong product\" },\n\t\t\t\t{ value: \"missing-order\", text: \"Missing Order\" },\n\t\t\t\t{ value: \"not-wanted\", text: \"Item no longer wanted\" },\n\t\t\t\t{ value: \"not-expected\", text: \"Item not as expected\" },\n\t\t\t\t{ value: \"parts-missing\", text: \"Product parts missing\" },\n\t\t\t\t{ value: \"not-received\", text: \"Item not received\" },\n\t\t\t\t{ value: \"noticeable-imperfection\", text: \"Noticeable Imperfection\" },\n\t\t\t\t{ value: \"other\", text: \"Other\" },\n\t\t\t],\n\t\t},\n\t\t\"shipping-box-damaged\": {\n\t\t\t\"label\": \"Was the shipping box damaged?\",\n\t\t\t\"type\": \"question\",\n\t\t\tmeta: {\n\t\t\t\t\"autoContinue\": true,\n\t\t\t},\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"yes\", text: \"Yes\" },\n\t\t\t\t{ value: \"no\", text: \"No\" },\n\t\t\t],\n\t\t},\n\t\t\"credit-exchange\": {\n\t\t\t\"label\": \"Would you like a credit or an exchange?\",\n\t\t\t\"type\": \"question\",\n\t\t\t\"meta\": {\n\t\t\t\t\"remedy\": true,\n\t\t\t\t\"autoContinue\": true,\n\t\t\t},\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"credit\", text: \"Credit\" },\n\t\t\t\t{ value: \"exchange\", text: \"Exchange\" },\n\t\t\t],\n\t\t},\n\t\t\"replace\": {\n\t\t\t\"label\": \"Would you like a replacement?\",\n\t\t\t\"type\": \"question\",\n\t\t\t\"meta\": {\n\t\t\t\t\"remedy\": true,\n\t\t\t\t\"autoContinue\": true,\n\t\t\t},\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"replacement\", text: \"Yes\" },\n\t\t\t\t{ value: \"no\", text: \"No\" },\n\t\t\t],\n\t\t},\n\t\t\"refund\": {\n\t\t\t\"label\": \"Would you like a refund?\",\n\t\t\t\"type\": \"question\",\n\t\t\t\"meta\": {\n\t\t\t\t\"remedy\": true,\n\t\t\t\t\"autoContinue\": true,\n\t\t\t},\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"refund\", text: \"Yes\" },\n\t\t\t\t{ value: \"no\", text: \"No\" },\n\t\t\t],\n\t\t},\n\t\t\"replace-refund\": {\n\t\t\t\"label\": \"Would you like a replacement or a refund?\",\n\t\t\t\"type\": \"question\",\n\t\t\t\"meta\": {\n\t\t\t\t\"remedy\": true,\n\t\t\t\t\"autoContinue\": true,\n\t\t\t},\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"replacement\", text: \"Replace\" },\n\t\t\t\t{ value: \"refund\", text: \"Refund\" },\n\t\t\t],\n\t\t},\n\t\t\"replace-return\": {\n\t\t\t\"label\": \"Would you like to replace the missing part or return the item?\",\n\t\t\t\"type\": \"question\",\n\t\t\t\"meta\": {\n\t\t\t\t\"remedy\": true,\n\t\t\t\t\"autoContinue\": true,\n\t\t\t},\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"replacement-parts\", text: \"Replace the missing part\" },\n\t\t\t\t{ value: \"refund\", text: \"Return the entire item\" },\n\t\t\t],\n\t\t},\n\t\t\"how-so\": {\n\t\t\t\"label\": \"How so?\",\n\t\t\t\"type\": \"text-input\",\n\t\t\t\"meta\": {\n\t\t\t\t// \"input-only\": true,\n\t\t\t\t\"addToNotes\": true,\n\t\t\t},\n\t\t},\n\t\t\"parts-missing\": {\n\t\t\t\"label\": \"Which parts are missing?\",\n\t\t\t\"type\": \"parts-missing\",\n\t\t\t\"meta\": {},\n\t\t},\n\t\t\"contact-address\": {\n\t\t\t\"subtitle\": \"Shipping and Contact\",\n\t\t\t\"label\": \"Review your information\",\n\t\t\t\"copy\": {\n\t\t\t\t\"product-order\": {\n\t\t\t\t\t\"which-order\": \"This information is pulled directly from your order, so please make any necessary updates.\",\n\t\t\t\t\t\"which-product\": \"Please provide contact information so we can reach out to you.
You may also find the relevant order to fill the contact information from your order.\",\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"type\": \"contact-information\",\n\t\t},\n\t\t\"continue\": {\n\t\t\t\"label\": \"Do you need help with another product\",\n\t\t\t\"type\": \"question\",\n\t\t\t\"meta\": {\n\t\t\t\t\"autoContinue\": true,\n\t\t\t},\n\t\t\t\"options\": [\n\t\t\t\t{ value: \"yes\", text: \"Yes\" },\n\t\t\t\t{ value: \"no\", text: \"No\" },\n\t\t\t],\n\t\t},\n\t\t\"submit\": {\n\t\t\t\"label\": \"We'll be in touch soon!\",\n\t\t\t\"copy\": \"You'll receive a confirmation email from our customer care team shortly.\",\n\t\t\t\"type\": \"submit\",\n\t\t},\n\t},\n\n\t\"concerns\": [\n\t\t{\"id\": \"Bubble\",\"label\": \"Bubble\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Bubble\",\"cause\": \"Seasoning\",\"response\": \"The black coating is vegetable oil. When cooking oil is applied to the surface, then heated, the oil turns black. This is the seasoning process.
The coating is a functional application and not a cosmetic application. It is normal to have areas where the seasoning has bubbled and flaked off or not seasoned as well as other areas; underneath, the seasoning can be a lighter colored spot. No need to worry - it is not rust. Whenever you see a seasoned spot that is dark brown, it means it's the first stage of seasoning. It will darken up over time with proper use and care.\",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/castiron/bubble.jpg\",\"meta\": {\"used\": \"no\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Bubble\",}},\n\t\t{\"id\": \"Drip\",\"label\": \"Drip\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Bubble\",\"cause\": \"Seasoning\",\"response\": \"At Lodge, cast iron and carbon steel cookware is seasoned with 100% soybean oil baked onto the surface at a high temperature. During this process, the cookware hangs from a rack as it moves from the seasoning chamber to the oven. That means some new pieces may experience a \\\"bubble\\\" on the cookware - visibly known as the drip- where the oil hasn't fully adhered to the cookware. The bubble can chip away and reveal a light brown color. It's perfectly safe, as this is just the initial layers of seasoning. It will disappear with regular use and care.\",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/castiron/drip.jpg\",\"meta\": {\"used\": \"no\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Drip\",}},\n\t\t{\"id\": \"Black Residue\",\"label\": \"Black Residue\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Black Residue\",\"cause\": \"Seasoning\",\"response\": \"There can be residue from the seasoning that may come off your seasoned cookware. The residue is not harmful in any way and will decrease as the cookware is used over time. It can also appear when cooking liquids, boiling water, using soap on newer cookware, or cooking acidic and alkaline foods such as beans and tomatoes.
The Fix:
Continue to use and care for your cookware, and you will see a reduction in black residue as the seasoning improves.\",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/castiron/residue.jpg\",\"meta\": {\"used\": \"no\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Black Residue\",}},\n\t\t{\"id\": \"Uneven Seasoning\",\"label\": \"Uneven Seasoning\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Seasoning\",\"cause\": \"Seasoning\",\"response\": \"Some cookware may have slight variations in the seasoning finish. These variations do not affect cooking performance and typically even out with use.\",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/castiron/unevenseasoning.jpg\",\"meta\": {\"used\": \"no\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Uneven Seasoning\",}},\n\t\t{\"id\": \"Rough Surface\",\"label\": \"Rough Surface\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Roughness\",\"cause\": \"Product Information\",\"response\": \"The texture is a result of the sand-casting process Lodge uses. It creates a surface texture that allows the seasoning to adhere to it. As you use your cookware over time and continue to season it, the pan will become smoother. Unlike other types of cookware, Lodge Cast Iron only gets better with age.
Some people prefer to smooth out the roughness, and it is okay to do so using fine grade sandpaper. Be sure to re-season the item promptly after doing so.\",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/castiron/roughsurface.jpg\",\"meta\": {\"used\": \"no\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Rough Surface\",}},\n\t\t{\"id\": \"Noticeable Imperfection\",\"label\": \"Noticeable Imperfection\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"\",\"cause\": \"TBD\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"image\": \"/themes/custom/tombras/images/product-help/castiron/imperfection.jpg\",\"meta\": {\"used\": \"no\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"reason\": [\"noticeable-imperfection\"],\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Noticeable Imperfection\",}},\n\t\t{\"id\": \"Grind Marks\",\"label\": \"Grind Marks\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Grind Marks\",\"cause\": \"Manufacturing/Casting Defect\",\"response\": \"After the cast iron is poured into a sand mold, there can be excess iron around the cookware's edges. The excess iron is removed, but there are lines left behind. This is normal and will not affect the performance of your new piece of cast iron cookware.\",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/castiron/grind_marks.jpg\",\"meta\": {\"used\": \"no\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Grind Marks\",}},\n\t\t{\"id\": \"Other\",\"label\": \"Other\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Other\",\"cause\": \"TBD\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"no\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Other\",}},\n\n\t\t{\"id\": \"Black Residue\",\"label\": \"Black Residue\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Black Residue\",\"cause\": \"Seasoning\",\"response\": \"There can be residue from the seasoning that may come off your seasoned cookware. The residue is not harmful in any way and will decrease as the cookware is used over time. Continue to use and care for your cookware, and you will see a reduction in black residue as the seasoning improves.\",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/castiron/residue.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Black Residue\",}},\n\t\t{\"id\": \"Food Turned Dark During Cooking\",\"label\": \"Food Turned Dark During Cooking\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Black Residue\",\"cause\": \"Seasoning \",\"response\": \"The black coating on the cookware is cooking oil. Here at the foundry, we apply cooking oil to the surface of each piece, then heat it; this turns the cooking oil black. This is what we refer to as the seasoning process. Seasoning is a natural process and not harmful in any way. The seasoning layers can build up over time or break down.
Foods that are very acidic (i.e., beans, tomatoes, citrus juices, etc.) or that contain a lot of liquid should not be cooked in seasoned cast iron until the cookware is highly seasoned. These foods break down the seasoning and result in discoloration and metallic-tasting food. Wait until cast iron is better seasoned to cook these types of foods. Lodge Enameled Cast Iron is not affected by acidity and can be used with all foods.
For cookware with seasoning that has been impacted by acidic foods or excess liquids, it must be re-seasoned in the oven following these simple instructions: https://www.lodgecastiron.com/cleaning-and-care/cast-iron/science-cast-iron-seasoning\",\"hasResponse\": \"yes\",\"meta\": {\"used\": \"yes\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Food Turned Dark During Cooking\",}},\n\t\t{\"id\": \"Flaking\",\"label\": \"Flaking\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Flaking\",\"cause\": \"Seasoning\",\"response\": \"The black flakes are part of the seasoning layer (the coating of oil which is baked onto the iron at a high temperature). Occasionally, the seasoning may break down and flake off, but this is not harmful in any way. To remove any loose flakes, scour the cookware with an SOS or Brillo pad, then re-season the cookware following these simple instructions: https://www.lodgecastiron.com/cleaning-and-care/cast-iron/science-cast-iron-seasoning\",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/castiron/flakeyseasoning.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Flaking\",}},\n\t\t{\"id\": \"Rust\",\"label\": \"Rust\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Rust\",\"cause\": \"User Error Lack of Info\",\"response\": \"Rust forms when the cookware is exposed to moisture for extended periods and is not harmful in any way. To clean the pan after cooking, rinse with warm water, hand-dry, and promptly rub with cooking oil. If left out to air dry, it will rust. Be sure to store the cookware in a cool, dry place, keeping it away from humidity around a sink or dishwasher.
You can restore your cookware with the steps below:
1. Scour the surface with hot, soapy water and an SOS or Brillo pad. It is okay to use soap this time because you are preparing to re-season the cookware.
2. Rinse and hand-dry thoroughly.
3. Apply a very thin, even coating of vegetable or canola oil to the cookware (inside and out). If you use too much oil, your pan may become sticky.
4. Place the cookware in the oven upside-down on the top rack.
5. Place a large baking sheet or aluminum foil on the bottom rack to catch any excess oil that may drip off the cookware.
6. Bake at 450 - 500 F for 1 hour.
7. Allow to cool in the oven, and repeat steps 3-6 as necessary to achieve the classic black patina.\",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/castiron/rust.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Rust\",}},\n\t\t{\"id\": \"Food Sticking\",\"label\": \"Food Sticking\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Sticking\",\"cause\": \"User Error Lack of Info\",\"response\": \"Lodge seasoned cookware is not non-stick to start with; over time, with proper use and care, the seasoning layers will build up to a naturally non-stick surface, but this takes time. Below are some tips for cooking on the stovetop that will help when cooking.
*Add extra oil to the surface before cooking
*Start on the lowest setting you have allowed to heat for 3-5 minutes then gradually increase the temperature
*Cook on a lower temperature, medium is enough heat to sear a steak, most foods can be cooked halfway between low and medium.
*Allow food to sit out while the skillet is heating up. When added to a hot skillet, cold food tends to stick more than room temperature food.
*Avoid cooking highly acidic foods for long periods of time until the cookware has been used 8-10 times. \",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/castiron/stuck_food.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Food Sticking\",}},\n\t\t{\"id\": \"Sticky Surface\",\"label\": \"Sticky Surface\",\"caseRecordType\": \"General Information\",\"type\": \"Use & Care, Seasoning, & Cooking\",\"subType\": \"How Do I Keep My Cookware from Being Sticky (Excess Oil)\",\"cause\": \"Use and Care Information\",\"response\": \"The sticky residue is typically the result of using too much oil. You can first try giving your cookware a bath with warm, soapy water. This may do the trick. If you still have sticky residue, we recommend the following:
1. Place the cookware in the oven upside-down on the top rack.
2. Place a large baking sheet or aluminum foil on the bottom rack to catch any excess oil that may drip off the cookware.
3. Bake at 400 - 450 °F for 1 hour.
4. Allow to cool and repeat if necessary.
This process will help evenly distribute the excess oil so that it adheres to the cookware, reducing the sticky residue.\",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/castiron/sticky.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Sticky Surface\",}},\n\t\t{\"id\": \"Odors\",\"label\": \"Odors\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Odors\",\"cause\": \"User Error Lack of Info\",\"response\": \"To eliminate the unwanted odor, simply bake your cast iron pan in the oven at 400 degrees F for 15 minutes. This easy, odor-eliminating method won't damage the seasoning on your cookware. A traditional method calls for you to sprinkle a layer of regular table salt on the cooking surface of your cookware, leave it on overnight, and rinse it off in the morning. This will also eliminate any lingering odors. If smells persist, you may need to scour and re-season your cookware.\",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/castiron/odor.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Odors\",}},\n\t\t{\"id\": \"Stuck on Food\",\"label\": \"Stuck on Food\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Sticking\",\"cause\": \"Use and Care Information\",\"response\": \"After cooking, allow the cookware to cool, then use a pan scraper to remove stuck-on food, scrub with a nylon brush or non-scratch pad, hand dry, and add a layer of oil. If that does not remove the stuck on food try boiling water and a small amount of soap in the cookware for 3-5 minutes, then clean the surface after the pan has cooled. If the boiling water does not remove the stuck-on residue, then scour the surface with hot, soapy water and an SOS or Brillo pad, then re-season in the oven.\",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/castiron/stuck_food.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Stuck on Food\",}},\n\t\t{\"id\": \"Cracked\",\"label\": \"Cracked\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Cracked\",\"cause\": {\"default\": \"TBD\", \"dropped\": \"User Error Lack of Info\"},\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": {\"dropped\": \"Unfortunately, there is a notion out there that cast iron is indestructible; however, just like other metals, it can break, especially when dropped or handled roughly. Cast iron is strong but brittle (especially when cold), so it will break before it ever bends. This has nothing to do with the quality; it is just the nature of cast iron.While there is an infinite number of events/situations that could cause cast iron to break, I can tell you that the most common we see are from cookware being dropped onto various surfaces, having objects dropped onto the cast iron, or switching cast iron between temperature extremes. Lodge does not replace cookware damaged from being dropped.\", \"default\": \"\"},\"image\": \"/themes/custom/tombras/images/product-help/castiron/cracked.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Cracked\",}},\n\t\t{\"id\": \"Warped\",\"label\": \"Warped\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Warped\",\"cause\": \"TBD\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"yes\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Warped\",}},\n\t\t{\"id\": \"Uneven Heating\",\"label\": \"Uneven Heating\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Warped\",\"cause\": \"TBD\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"yes\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Uneven Heating\",}},\n\t\t{\"id\": \"Handle Broken\",\"label\": \"Handle Broken\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Handle Broke\",\"cause\": {\"default\": \"TBD\", \"dropped\": \"User Error Lack of Info\"},\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": {\"dropped\": \"Unfortunately, there is a notion out there that cast iron is indestructible; however, just like other metals, it can break, especially when dropped or handled roughly. Cast iron is strong but brittle (especially when cold), so it will break before it ever bends. This has nothing to do with the quality; it is just the nature of cast iron.While there is an infinite number of events/situations that could cause cast iron to break, I can tell you that the most common we see are from cookware being dropped onto various surfaces, having objects dropped onto the cast iron, or switching cast iron between temperature extremes. Lodge does not replace cookware damaged from being dropped.\", \"default\": \"\"},\"image\": \"/themes/custom/tombras/images/product-help/castiron/brokenhandle.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Seasoned Cast Iron\",],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Handle Broken\",}},\n\t\t{\"id\": \"Other\",\"label\": \"Other\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Seasoned Cast Iron\": \"Seasoned Cast Iron Issue\",\"Carbon Steel\": \"Carbon Steel Issue\",},\"subType\": \"Other\",\"cause\": \"TBD\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"yes\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Other\",}},\n\n\t\t{\"id\": \"Chipped\",\"label\": \"Chipped\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": {\"Enameled Cast Iron\": \"Enamel Cast Iron\"},\"subType\": \"Chipped\",\"cause\": {\"default\": \"TBD\", \"dropped\": \"User Error Lack of Info\"},\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": {\"dropped\": \"Unfortunately, there is a notion out there that enameled cast iron is indestructible; however, just like other metals, it can break, especially when dropped or handled roughly. Cast iron is strong but brittle (especially when cold), so it will break before it ever bends. This has nothing to do with the quality; it is just the nature of cast iron.While there is an infinite number of events/situations that could cause cast iron to break, I can tell you that the most common we see are from cookware being dropped onto various surfaces, having objects dropped onto the cast iron, or switching cast iron between temperature extremes. Lodge does not replace cookware damaged from being dropped.\", \"default\": \"\"},\"image\": \"/themes/custom/tombras/images/product-help/enamel/chipped.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Enameled Cast Iron\"],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Chipped\",}},\n\t\t{\"id\": \"Cracked\",\"label\": \"Cracked\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": {\"Enameled Cast Iron\": \"Enamel Cast Iron\"},\"subType\": \"Cracked\",\"cause\": {\"default\": \"TBD\", \"dropped\": \"User Error Lack of Info\"},\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": {\"dropped\": \"Unfortunately, there is a notion out there that cast iron is indestructible; however, just like other metals, it can break, especially when dropped or handled roughly. Cast iron is strong but brittle (especially when cold), so it will break before it ever bends. This has nothing to do with the quality; it is just the nature of cast iron.While there is an infinite number of events/situations that could cause cast iron to break, I can tell you that the most common we see are from cookware being dropped onto various surfaces, having objects dropped onto the cast iron, or switching cast iron between temperature extremes. Lodge does not replace cookware damaged from being dropped.\", \"default\": \"\"},\"image\": \"/themes/custom/tombras/images/product-help/enamel/chipped.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Enameled Cast Iron\"],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Cracked\",}},\n\t\t{\"id\": \"Powdery or Rough Surface\",\"label\": \"Powdery or Rough Surface\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Enameled Cast Iron\": \"Enamel Cast Iron Issue\"},\"subType\": \"Powdery or rough surface\",\"cause\": \"User Error Lack of Info\",\"response\": \"If the surface of your enamel cookware is powdery or rough, citrus juices and citrus-based cleaners (including some dish detergents) may be to blame. These items can dull the exterior gloss, which is not harmful and will not impair cooking performance, but it will alter the finish of your cookware. Keep in mind the use of these products is not covered by our warranty.\",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/enamel/powdery_surface.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Enameled Cast Iron\"],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Powdery or Rough Surface\",}},\n\t\t{\"id\": \"Staining\",\"label\": \"Staining\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Enameled Cast Iron\": \"Enamel Cast Iron Issue\"},\"subType\": \"Staining\",\"cause\": \"User Error Lack of Info\",\"response\": \"Stains are to be expected when you use enamel cookware and does not affect performance.
To remove slight stains:
Follow the steps above to clean your cookware.
Rub with a dampened cloth and Lodge Enamel Cleaner or another ceramic cleaner according to directions on the bottle.
For persistent stains:
Follow the steps above to clean and remove slight stains.
Soak the interior of the cookware for 2-3 hours with a mixture of 3 tablespoons of household bleach per quart of water.
To remove stubborn, baked-on food, boil 2 cups of water and 4 tablespoons of baking soda. Boil for a few minutes, then use a pan scraper to loosen the food.\",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/enamel/stain_and_stuck_food.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Enameled Cast Iron\"],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Staining\",}},\n\t\t{\"id\": \"Rim Rusting\",\"label\": \"Rim Rusting\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Enameled Cast Iron\": \"Enamel Cast Iron Issue\"},\"subType\": \"Rust\",\"cause\": \"User Error Lack of Info\",\"response\": \"If rust develops around the rim, it may be that the pan has been in a damp area. Leaving pans on a draining board to drip dry or cleaning in the dishwasher can cause a rust deposit. Rust can also form if the rim of the pan is not dried sufficiently after being washed. Should rust develop, we recommend cleaning with a nylon sponge and dish detergent and dry thoroughly. We recommend rubbing a small amount of cooking oil around the rim to create a seal and prevent rust from re-appearing. We recommend rubbing with oil periodically to prevent rusting.\",\"hasResponse\": \"yes\",\"image\": \"/themes/custom/tombras/images/product-help/enamel/rust.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Enameled Cast Iron\"],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Rim Rusting\",}},\n\t\t{\"id\": \"Handle Broke\",\"label\": \"Handle Broke\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Enameled Cast Iron\": \"Enamel Cast Iron Issue\"},\"subType\": \"Handle Broke\",\"cause\": {\"default\": \"TBD\", \"dropped\": \"User Error Lack of Info\"},\"response\": \"If a handle on your enameled cast iron cookware has broken, it is likely the result of being dropped. We do not replace cookware that has been dropped.\",\"hasResponse\": \"yes\",\"finalResponse\": {\"dropped\": \"Unfortunately, there is a notion out there that cast iron is indestructible; however, just like other metals, it can break, especially when dropped or handled roughly. Cast iron is strong but brittle (especially when cold), so it will break before it ever bends. This has nothing to do with the quality; it is just the nature of cast iron.While there is an infinite number of events/situations that could cause cast iron to break, I can tell you that the most common we see are from cookware being dropped onto various surfaces, having objects dropped onto the cast iron, or switching cast iron between temperature extremes. Lodge does not replace cookware damaged from being dropped.\", \"default\": \"\"},\"image\": \"/themes/custom/tombras/images/product-help/enamel/handle_broke.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Enameled Cast Iron\"],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Handle Broke\",}},\n\t\t{\"id\": \"Other\",\"label\": \"Other\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Enameled Cast Iron\": \"Enamel Cast Iron Issue\"},\"subType\": \"Other\",\"cause\": \"TBD\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"image\": \"/themes/custom/tombras/images/product-help/enamel/other.jpg\",\"meta\": {\"used\": [\"yes\", \"no\"],\"material\": [\"Enameled Cast Iron\"],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Other\",}},\n\n\t\t{\"id\": \"Broken\",\"label\": \"Broken\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": \"Accessories\",\"subType\": \"Cracked\",\"cause\": \"TBD\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"yes\",\"material\": [\"Accessories\"],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Broken\",}},\n\t\t{\"id\": \"Silicone Melted\",\"label\": \"Silicone Melted\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": \"Accessories\",\"subType\": \"Melted\",\"cause\": \"User Error Lack of Info\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"image\": \"/themes/custom/tombras/images/product-help/accessories/silicone_melted.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Accessories\"],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Silicone Melted\",}},\n\t\t{\"id\": \"Handle Fit\",\"label\": \"Handle Fit\",\"caseRecordType\": \"Issues & Concerns\",\"type\": \"Accessories Issue\",\"subType\": \"Handle Fit\",\"cause\": \"TBD\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"image\": \"/themes/custom/tombras/images/product-help/accessories/handlefit.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Accessories\"],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Handle Fit\",}},\n\t\t{\"id\": \"Handle Broke\",\"label\": \"Handle Broke\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": \"Accessories\",\"subType\": \"Handle Broke\",\"cause\": \"TBD\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"yes\",\"material\": [\"Accessories\"],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Handle Broke\",}},\n\t\t{\"id\": \"Lid Fit\",\"label\": \"Lid Fit\",\"caseRecordType\": \"Issues & Concerns\",\"type\": \"Accessories Issue\",\"subType\": \"Lid Fit\",\"cause\": \"TBD\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"image\": \"/themes/custom/tombras/images/product-help/accessories/lidfit.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Accessories\"],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Lid Fit\",}},\n\t\t{\"id\": \"Torn\",\"label\": \"Torn\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": \"Accessories\",\"subType\": \"Torn\",\"cause\": \"TBD\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"yes\",\"material\": [\"Accessories\"],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Torn\",}},\n\t\t{\"id\": \"Zipper\",\"label\": \"Zipper\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": \"Accessories\",\"subType\": \"Zipper\",\"cause\": \"TBD \",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"image\": \"/themes/custom/tombras/images/product-help/accessories/brokenzipper.jpg\",\"meta\": {\"used\": \"yes\",\"material\": [\"Accessories\"],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Zipper\",}},\n\t\t{\"id\": \"Other\",\"label\": \"Other\",\"caseRecordType\": \"Issues & Concerns\",\"type\": \"Accessories Issue\",\"subType\": \"Other\",\"cause\": \"TBD\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": [\"yes\", \"no\"],\"material\": [\"Accessories\"],\"damaged\": \"no\", \"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Other\",}},\n\n\t\t{\"id\": \"Product Arrived Broken\",\"label\": \"Product Arrived Broken\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": \"Order And Shipment Error\",\"subType\": \"Product Arrived Damaged\",\"cause\": \"Carrier\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"reason\": [\"arrived-broken\"],\"purchased-from\": [\"website\"],\"select-concern\": \"Product Arrived Broken\",}},\n\t\t{\"id\": \"Product Arrived Broken\",\"label\": \"Product Arrived Broken\",\"caseRecordType\": \"Issues & Concerns\",\"type\": \"Order And Shipment Error\",\"subType\": \"Product Arrived Damaged\",\"cause\": \"Carrier\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"reason\": [\"arrived-broken\"],\"purchased-from\": [\"gift\"],\"select-concern\": \"Product Arrived Broken\",}},\n\t\t{\"id\": \"Missing Part\",\"label\": \"Missing Part\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill - Placeholder for the missing parts scenarios\",\"type\": \"\",\"subType\": \"\",\"cause\": \"\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"parts-missing\"],\"purchased-from\": [\"website\", \"amazon\", \"gift\", \"retailer\"],\"select-concern\": \"Missing Part\",}},\n\t\t{\"id\": \"Missing Part - Box Damaged\",\"label\": \"Missing Part - Box Damaged\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": \"Order And Shipment Error\",\"subType\": \"Missing or Replacement Parts\",\"cause\": \"Carrier\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"parts-missing\"],\"shipping-box-damaged\": \"yes\",\"purchased-from\": [\"website\"],\"select-concern\": \"Missing Part - Box Damaged\",}},\n\t\t{\"id\": \"Missing Part - Box Not Damaged\",\"label\": \"Missing Part - Box Not Damaged\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": \"Order And Shipment Error\",\"subType\": \"Missing or Replacement Parts\",\"cause\": \"Packing Error\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"parts-missing\"],\"shipping-box-damaged\": \"no\",\"purchased-from\": [\"website\"],\"select-concern\": \"Missing Part - Box Not Damaged\",}},\n\t\t{\"id\": \"Wrong Item\",\"label\": \"Wrong Item\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": \"Order And Shipment Error\",\"subType\": \"Received Incorrect Product\",\"cause\": \"TBD\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"wrong-product\"],\"purchased-from\": [\"website\"],\"select-concern\": \"Wrong Item\",}},\n\t\t{\"id\": \"Missing Order\",\"label\": \"Missing Order\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": \"Order And Shipment Error\",\"subType\": \"Missing Order That Has Shipped\",\"cause\": \"Carrier\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"missing-order\"],\"purchased-from\": [\"website\"],\"select-concern\": \"Missing Order\",}},\n\t\t{\"id\": \"No Longer Needed/Wanted\",\"label\": \"No Longer Needed/Wanted\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": {\"Enameled Cast Iron\": \"Enamel Cast Iron\"},\"subType\": \"Product Not Needed Or Wanted\",\"cause\": \"Not Wanted/Needed\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"RAResponse\": \"The item may be returned to us; once received, a refund for the product will only be issued to the card used to purchase. You are responsible for the shipping charges. A new order can be placed at any time on our website.
*Items are only accepted if they are new/unused and in the original packaging.
Please include the return authorization number in the box with the cookware.
Return Address:
Lodge Cast Iron
Attn: Returns Department
205 East 5th Street
South Pittsburg, TN 37380\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"not-wanted\"],\"requestedRemedy\": \"refund\",\"purchased-from\": [\"website\"],\"select-concern\": \"No Longer Needed/Wanted\",}},\n\n\t\t{\"id\": \"Product Arrived Broken\",\"label\": \"Product Arrived Broken\",\"caseRecordType\": \"Issues & Concerns\",\"type\": \"Order And Shipment Issue\",\"subType\": \"Product Arrived Damaged\",\"cause\": \"Other Retailer Damaged\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": \"Since the item arrived damaged you would need to reach out to the place of purchase to have the item replaced or a refund issued.\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"reason\": [\"arrived-broken\"],\"requestedRemedy\": \"none\",\"purchased-from\": [\"gift\"],\"select-concern\": \"Product Arrived Broken\",}},\n\t\t{\"id\": \"Product Arrived Broken\",\"label\": \"Product Arrived Broken\",\"caseRecordType\": \"Issues & Concerns\",\"type\": \"Order And Shipment Issue\",\"subType\": \"Product Arrived Damaged\",\"cause\": \"Other Retailer Damaged\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": \"Since this was ordered from Amazon instead of Lodge, it shipped from Amazon's facility. Please reach out to the Amazon Customer Care team for a resolution. You can reach them at (888) 280-4331.
Occasionally when trying to submit a return on Amazon's website, they may direct you to Lodge; however, this is incorrect. If you call Amazon, they will process your return.\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"yes\", \"still-need-help\": \"yes\",\"reason\": [\"arrived-broken\"],\"requestedRemedy\": \"none\",\"purchased-from\": [\"amazon\"],\"select-concern\": \"Product Arrived Broken\",}},\n\t\t{\"id\": \"Missing Part - Box Damaged\",\"label\": \"Missing Part - Box Damaged\",\"caseRecordType\": \"Issues & Concerns\",\"type\": \"Order And Shipment Issue\",\"subType\": \"Missing or Replacement Parts\",\"cause\": \"Other Retailer Damaged\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": \"Since the item was not ordered or shipped from Lodge you would need to reach out to the place of purchase to have the missing part shipped to you.\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"parts-missing\"],\"requestedRemedy\": \"none\",\"shipping-box-damaged\": \"yes\",\"purchased-from\": [\"gift\"],\"select-concern\": \"Missing Part - Box Damaged\",}},\n\t\t{\"id\": \"Missing Part - Box Damaged\",\"label\": \"Missing Part - Box Damaged\",\"caseRecordType\": \"Issues & Concerns\",\"type\": \"Order And Shipment Issue\",\"subType\": \"Missing or Replacement Parts\",\"cause\": \"Other Retailer Damaged\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": \"Since the item was not ordered or shipped from Lodge you would need to reach out to the place of purchase to have the missing part shipped to you.\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"parts-missing\"],\"requestedRemedy\": \"none\",\"shipping-box-damaged\": \"yes\",\"purchased-from\": [\"retailer\"],\"select-concern\": \"Missing Part - Box Damaged\",}},\n\t\t{\"id\": \"Missing Part - Box Damaged\",\"label\": \"Missing Part - Box Damaged\",\"caseRecordType\": \"Issues & Concerns\",\"type\": \"Order And Shipment Issue\",\"subType\": \"Missing or Replacement Parts\",\"cause\": \"Other Retailer Damaged\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": \"Since this was ordered from Amazon instead of Lodge, it shipped from Amazon's facility. Please reach out to the Amazon Customer Care team for a resolution. You can reach them at (888) 280-4331.
Occasionally when trying to submit a return on Amazon's website, they may direct you to Lodge; however, this is incorrect. If you call Amazon, they will process your return.\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"parts-missing\"],\"requestedRemedy\": \"none\",\"shipping-box-damaged\": \"yes\",\"purchased-from\": [\"amazon\"],\"select-concern\": \"Missing Part - Box Damaged\",}},\n\t\t{\"id\": \"Missing Part - Box Not Damaged\",\"label\": \"Missing Part - Box Not Damaged\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": \"Seasoned Cast Iron\",\"subType\": \"Missing or Replacement Parts\",\"cause\": \"Packing Error\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"no\",\"material\": [\"Seasoned Cast Iron\", \"Carbon Steel\",],\"damaged\": \"no\", \"reason\": [\"parts-missing\"],\"shipping-box-damaged\": \"no\",\"purchased-from\": [\"gift\",\"amazon\",\"retailer\"],\"select-concern\": \"Missing Part - Box Not Damaged\",}},\n\t\t{\"id\": \"Missing Part - Box Not Damaged\",\"label\": \"Missing Part - Box Not Damaged\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": \"Enamel Cast Iron\",\"subType\": \"Missing or Replacement Parts\",\"cause\": \"Packing Error\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"no\",\"material\": [\"Enameled Cast Iron\"],\"damaged\": \"no\", \"reason\": [\"parts-missing\"],\"shipping-box-damaged\": \"no\",\"purchased-from\": [\"gift\",\"amazon\",\"retailer\"],\"select-concern\": \"Missing Part - Box Not Damaged\",}},\n\t\t{\"id\": \"Missing Part - Box Not Damaged\",\"label\": \"Missing Part - Box Not Damaged\",\"caseRecordType\": \"Returns, Exceptions, & Goodwill\",\"type\": \"Accessories\",\"subType\": \"Missing or Replacement Parts\",\"cause\": \"Packing Error\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"no\",\"meta\": {\"used\": \"no\",\"material\": [\"Accessories\"],\"damaged\": \"no\", \"reason\": [\"parts-missing\"],\"shipping-box-damaged\": \"no\",\"purchased-from\": [\"gift\",\"amazon\",\"retailer\"],\"select-concern\": \"Missing Part - Box Not Damaged\",}},\n\t\t{\"id\": \"Wrong Item\",\"label\": \"Wrong Item\",\"caseRecordType\": \"Issues & Concerns\",\"type\": \"Order And Shipment Issue\",\"subType\": \"Received Incorrect Product\",\"cause\": \"Dealer Error\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": \"Since the item was not ordered or shipped from Lodge you would need to reach out to the place of purchase to have the correct item shipped.\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"wrong-product\"],\"requestedRemedy\": \"none\",\"purchased-from\": [\"retailer\"],\"select-concern\": \"Wrong Item\",}},\n\t\t{\"id\": \"Wrong Item\",\"label\": \"Wrong Item\",\"caseRecordType\": \"Issues & Concerns\",\"type\": \"Order And Shipment Issue\",\"subType\": \"Product Arrived Damaged\",\"cause\": \"Other Retailer Damaged\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": \"We do not sell on Amazon or ship for Amazon. Since it was ordered from Amazon, it would have been shipped from their facility. I recommend reaching out to the Amazon Customer Care team for a resolution. You can reach them at (888) 280-4331.
If you try to do a return through the Amazon website, they will direct you to Lodge. But that information is wrong. We have asked Amazon to change that information. If you call Amazon, they will be able to help you with this.\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"wrong-product\"],\"requestedRemedy\": \"none\",\"purchased-from\": [\"amazon\"],\"select-concern\": \"Wrong Item\",}},\n\t\t{\"id\": \"Missing Order/Item\",\"label\": \"Missing Order/Item\",\"caseRecordType\": \"Issues & Concerns\",\"type\": \"Order And Shipment Issue\",\"subType\": \"Missing Order That Has Shipped\",\"cause\": \"Dealer Error\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": \"Please reach out to the place of purchase about the missing order since it was not ordered or shipped from Lodge directly.\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"missing-order\"],\"requestedRemedy\": \"none\",\"purchased-from\": [\"gift\"],\"select-concern\": \"Missing Order/Item\",}},\n\t\t{\"id\": \"Missing Order/Item\",\"label\": \"Missing Order/Item\",\"caseRecordType\": \"Issues & Concerns\",\"type\": \"Order And Shipment Issue\",\"subType\": \"Missing Order That Has Shipped\",\"cause\": \"Dealer Error\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": \"Please reach out to the place of purchase about the missing order since it was not ordered or shipped from Lodge directly.\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"missing-order\"],\"requestedRemedy\": \"none\",\"purchased-from\": [\"retailer\"],\"select-concern\": \"Missing Order/Item\",}},\n\t\t{\"id\": \"Missing Order/Item\",\"label\": \"Missing Order/Item\",\"caseRecordType\": \"Issues & Concerns\",\"type\": \"Order And Shipment Issue\",\"subType\": \"Missing Order That Has Shipped\",\"cause\": \"Dealer Error\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": \"Since this was ordered from Amazon instead of Lodge, it shipped from Amazon's facility. Please reach out to the Amazon Customer Care team for a resolution. You can reach them at (888) 280-4331.
Occasionally when trying to submit a return on Amazon's website, they may direct you to Lodge; however, this is incorrect. If you call Amazon, they will process your return.\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"missing-order\"],\"requestedRemedy\": \"none\",\"purchased-from\": [\"amazon\"],\"select-concern\": \"Missing Order/Item\",}},\n\t\t{\"id\": \"No Longer Needed/Wanted\",\"label\": \"No Longer Needed/Wanted\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Enameled Cast Iron\": \"Enamel Cast Iron\"},\"subType\": \"Product Not Needed Or Wanted\",\"cause\": \"Not Wanted/Needed\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": \"Since the item was not ordered or shipped from Lodge you would need to reach out to Amazon to return or exchange the item. You can reach them at (888) 280-4331. If you try to do a return through the Amazon website, they will direct you to Lodge. But that information is wrong. We have asked Amazon to change that information. If you call Amazon, they will be able to help you with this.\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"not-wanted\"],\"requestedRemedy\": \"none\",\"purchased-from\": [\"amazon\"],\"select-concern\": \"No Longer Needed/Wanted\",}},\n\t\t{\"id\": \"No Longer Needed/Wanted\",\"label\": \"No Longer Needed/Wanted\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Enameled Cast Iron\": \"Enamel Cast Iron\"},\"subType\": \"Product Not Needed Or Wanted\",\"cause\": \"Not Wanted/Needed\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": \"Since the item was not ordered or shipped from Lodge you would need to reach out to the place of purchase to return or exchange the item.\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"not-wanted\"],\"requestedRemedy\": \"none\",\"purchased-from\": [\"retailer\"],\"select-concern\": \"No Longer Needed/Wanted\",}},\n\t\t{\"id\": \"No Longer Needed/Wanted\",\"label\": \"No Longer Needed/Wanted\",\"caseRecordType\": \"Issues & Concerns\",\"type\": {\"Enameled Cast Iron\": \"Enamel Cast Iron\"},\"subType\": \"Product Not Needed Or Wanted\",\"cause\": \"Not Wanted/Needed\",\"response\": \"Just a couple more steps and we'll have all the info we need for Customer Care to review your request.\",\"hasResponse\": \"yes\",\"finalResponse\": \"The item should be returned or exchanged with the retailer it was purchased from. Because this was a gift, you would need to check with the person who bought it to see where it was purchased. We are unable to accept returns or exchange items bought from another retailer.\",\"meta\": {\"used\": \"no\",\"material\": [\"Any\"],\"damaged\": \"no\", \"reason\": [\"not-wanted\"],\"requestedRemedy\": \"none\",\"purchased-from\": [\"gift\"],\"select-concern\": \"No Longer Needed/Wanted\",}},\n\t]\n};\n","export function determineFlavorValidation({ flavorsByType, collection, tier }) {\n\tlet returnedKey = null;\n\n\tif (collection === \"basic\") {\n\t\tconst percentages = {\n\t\t\t1: 80,\n\t\t\t2: 60,\n\t\t\t3: 51,\n\t\t};\n\n\t\tconst percentage = percentages[tier] / 100;\n\t\tconst { byType, total } = flavorsByType;\n\n\t\tconst _type = Object.keys(byType);\n\t\tfor (let i = 0; i < _type.length; i++) {\n\t\t\tconsole.log(\n\t\t\t\t`VALIDATION NUMBERS for ${_type[i]}`,\n\t\t\t\tbyType[_type[i]],\n\t\t\t\ttotal,\n\t\t\t\tbyType[_type[i]] / total,\n\t\t\t\tpercentage,\n\t\t\t);\n\t\t\tconsole.log(byType[_type[i]] / total >= percentage);\n\t\t\tif (byType[_type[i]] / total >= percentage) {\n\t\t\t\treturnedKey = _type[i];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tconst invertedHash = invertHash(flavorsByType.byType);\n\t\tconst sortedKeys = Object.keys(invertedHash).sort();\n\t\tconst highestValue = sortedKeys[sortedKeys.length - 1];\n\t\tif (highestValue >= 4 && invertedHash[highestValue].length === 1)\n\t\t\treturn invertedHash[highestValue][0];\n\t}\n\n\treturn returnedKey;\n}\n\nexport const invertHash = (hash) => {\n\treturn Object.keys(hash).reduce((acc, curr) => {\n\t\tconst value = hash[curr];\n\t\tif (!acc[value]) acc[value] = [curr];\n\t\telse acc[value].push(curr);\n\t\treturn acc;\n\t}, {});\n};\n\nexport const keyboardAccessibility = (e, context) => {\n\tlet usesKeyboard = false;\n\tif (e.detail === 0) {\n\t\tusesKeyboard = true;\n\t}\n\tcontext.$emit(\"usesKeyboard\", { usesKeyboard });\n};\n","//http://lodgemfgode3.prod.acquia-sites.com/api/lodge/salesforce/products\n\n/**\n * @type {import(\"vuex\").MutationTree}\n */\nconst Mutations = {\n\t/**\n\t * @param {Product[]} payload\n\t */\n\tproducts(state, payload) {\n\t\tstate.products = payload;\n\t},\n\t/**\n\t * @param {Color[]} payload\n\t */\n\tcolors(state, payload) {\n\t\tstate.colors = payload;\n\t},\n\t/**\n\t * @param {LoadingState} payload\n\t */\n\tloadingState(state, payload) {\n\t\tstate.loadingState = payload;\n\t},\n\n\t/**\n\t *\n\t * @param {String[]} payload\n\t */\n\t// selectedFilters(state, payload) {\n\t// \tstate.selectedFilters = payload;\n\t// },\n\tclearFilterItems(state) {\n\t\tstate.selectedFilters = [];\n\t},\n\tselectedFilters(state, payload) {\n\t\tstate.selectedFilters = payload;\n\t},\n\taddFilterItem(state, payload) {\n\t\tstate.selectedFilters = [...state.selectedFilters, payload];\n\t},\n\tremoveFilterItem(state, payload) {\n\t\tconst indx = state.selectedFilters.indexOf(payload);\n\t\t// state.selectedFilters = [...state.selectedFilters].splice(indx, 1);\n\t\tstate.selectedFilters = state.selectedFilters.filter(f => f !== payload);\n\t\t// state.selectedFilters.splice(indx, 1);\n\t},\n\tincrementPage(state) {\n\t\tstate.page = state.page + 1;\n\t},\n\tsetPage(state, payload) {\n\t\tstate.page = payload;\n\t},\n\tresetPage(state) {\n\t\tstate.page = 1;\n\t},\n\tsetNavigatedProduct(state, payload ) {\n\t\tstate.navigatedProduct = payload;\n\t}\n};\n\nexport default Mutations;\nexport const Commit = {\n\t/**\n\t *\n\t * @param {import(\"vuex\").Commit} commit\n\t * @param {Product[]} payload\n\t */\n\tproducts(commit, payload) {\n\t\tcommit(\"products\", payload);\n\t},\n\n\t/**\n\t *\n\t * @param {import(\"vuex\").Commit} commit\n\t * @param {Color[]} payload\n\t */\n\tcolors(commit, payload) {\n\t\tcommit(\"colors\", payload);\n\t},\n\n\t/**\n\t *\n\t * @param {import(\"vuex\").Commit} commit\n\t * @param {LoadingState} payload\n\t */\n\tloadingState(commit, payload) {\n\t\tcommit(\"loadingState\", payload);\n\t},\n\n\t/**\n\t *\n\t * @param {import(\"vuex\").Commit} commit\n\t * @param {String[]} payload\n\t */\n\tselectedFilters(commit, payload) {\n\t\tcommit(\"selectedFilters\", payload);\n\t},\n\t/**\n\t * @param {import(\"vuex\").Commit} commit\n\t */\n\tincrementPage(commit) {\n\t\tcommit(\"incrementPage\");\n\t}\n};\n","const EMPTY_STATE = 'emptyState';\n\nmodule.exports = {\n\tinstall(Vue, options = {}) {\n\t\tif (!Vue._installedPlugins.find(plugin => plugin.Store)) {\n\t\t\tthrow new Error(\"VuexUndoRedo plugin must be installed after the Vuex plugin.\")\n\t\t}\n\t\tVue.mixin({\n\t\t\tdata() {\n\t\t\t\treturn {\n\t\t\t\t\tdone: [],\n\t\t\t\t\tundone: [],\n\t\t\t\t\tnewMutation: true,\n\t\t\t\t\tignoreMutations: options.ignoreMutations|| [],\n\t\t\t\t\treplaying: false,\n\t\t\t\t};\n\t\t\t},\n\t\t\tcreated() {\n\t\t\t\tif (this.$store) {\n\t\t\t\t\tthis.$store.subscribe(mutation => {\n\t\t\t\t\t\tif (this.newMutation\n\t\t\t\t\t\t\t&& mutation.type !== `${options.module ? `${options.module}/` : ''}${EMPTY_STATE}`\n\t\t\t\t\t\t\t&& (!options.module || mutation.type.includes(options.module))\n\t\t\t\t\t\t\t&& this.ignoreMutations.indexOf(mutation.type) === -1\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// reset the replay variable\n\t\t\t\t\t\t\tthis.replaying = false;\n\t\t\t\t\t\t\tthis.done.push(mutation);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (this.newMutation) {\n\t\t\t\t\t\t\tthis.undone = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\tcomputed: {\n\t\t\t\tcanRedo() {\n\t\t\t\t\treturn this.undone.length;\n\t\t\t\t},\n\t\t\t\tcanUndo() {\n\t\t\t\t\treturn this.done.length;\n\t\t\t\t},\n\t\t\t},\n\t\t\tmethods: {\n\t\t\t\tredo() {\n\t\t\t\t\t// TODO update this to incorporate the changes from undo if we need it\n\t\t\t\t\t// let commit = this.undone.pop();\n\t\t\t\t\t// this.newMutation = false;\n\t\t\t\t\t// switch (typeof commit.payload) {\n\t\t\t\t\t// \tcase 'object':\n\t\t\t\t\t// \t\tthis.$store.commit(`${commit.type}`, Object.assign({}, commit.payload));\n\t\t\t\t\t// \t\tbreak;\n\t\t\t\t\t// \tdefault:\n\t\t\t\t\t// \t\tthis.$store.commit(`${commit.type}`, commit.payload);\n\t\t\t\t\t// }\n\t\t\t\t\t// this.newMutation = true;\n\t\t\t\t},\n\t\t\t\tundo() {\n\t\t\t\t\t// console.time(\"undo\");\n\t\t\t\t\t// push all the mutations back to but not including the undoDelimiter\n\t\t\t\t\t// if there is one\n\t\t\t\t\tif (options.undoDelimiter) {\n\t\t\t\t\t\tlet undoing = true;\n\t\t\t\t\t\twhile (undoing) {\n\t\t\t\t\t\t\tundoing = !this.done[this.done.length - 1].type.includes(options.undoDelimiter);\n\t\t\t\t\t\t\tthis.undone.push(this.done.pop());\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.undone.push(this.done.pop());\n\t\t\t\t\t}\n\t\t\t\t\tthis.replaying = true;\n\t\t\t\t\tthis.newMutation = false;\n\t\t\t\t\tthis.$store.commit(`${options.module ? `${options.module}/` : ''}${EMPTY_STATE}`);\n\t\t\t\t\tthis.done.forEach(mutation => {\n\t\t\t\t\t\tswitch (typeof mutation.payload) {\n\t\t\t\t\t\t\tcase 'object':\n\t\t\t\t\t\t\t\tthis.$store.commit(`${mutation.type}`, Object.assign({}, mutation.payload));\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tthis.$store.commit(`${mutation.type}`, mutation.payload);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// this.done.pop();\n\t\t\t\t\t});\n\t\t\t\t\tthis.newMutation = true;\n\t\t\t\t\t// console.timeEnd(\"undo\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n}\n","import regeneratorRuntime from \"regenerator-runtime\";\n\nimport { getUrlParameter, queryParams } from \"../utils\";\nimport axios from \"axios\";\n\nimport {\n\tdomain as sfccDomain,\n\tcontrollerPath,\n} from \"../../lodge-vue/src/ocapi\";\n\nexport const createVariantKey = attributes => {\n\tconst keys = [...Object.keys(attributes)].sort();\n\tlet vue_key = \"\";\n\tkeys.map(key => {\n\t\tif (attributes[key]) {\n\t\t\tvue_key += `${key}:${attributes[key]};`;\n\t\t}\n\t});\n\treturn vue_key;\n};\n\nexport const convertBetweenAttributes = (obj, addAttribute = true) => {\n\tconst keys = Object.keys(obj);\n\tconst swappedKeys = keys.map(key =>\n\t\taddAttribute\n\t\t\t? `attribute_${key}`\n\t\t\t: key\n\t\t\t\t\t.split(\"attribute_\")\n\t\t\t\t\t.filter(i => i)\n\t\t\t\t\t.reduce((acc, curr) => curr, key),\n\t);\n\n\tconst retObj = {};\n\tkeys.forEach((k, idx) => {\n\t\tretObj[swappedKeys[idx]] = obj[k];\n\t});\n\treturn retObj;\n};\n\nexport const createQueryParamsForProduct = sku => {\n\tconst qp = queryParams();\n\tconst params = Object.keys(qp)\n\t\t.filter(k => k !== \"sku\" && k !== '')\n\t\t.reduce((acc, k) => acc + `&${k}${qp[k] ? `=${qp[k]}` : \"\"}`, \"\");\n\treturn `?sku=${sku}${params}`;\n};\n\nexport const getAttributesFromQueryParam = () => {\n\tconst sku = getUrlParameter(\"sku\");\n\treturn sku.length ? sku : null;\n};\n\nexport const getProductDetails = async productId => {\n\tconst data = await axios\n\t\t.get(\n\t\t\t`${sfccDomain}${controllerPath}API-ProductDetails?productId=${productId}`,\n\t\t\t{\n\t\t\t\twithCredentials: true,\n\t\t\t},\n\t\t)\n\t\t.then(res => res.data)\n\t\t.then(data => data.product)\n\t\t.catch(err => {\n\t\t\tconsole.log(err);\n\t\t\treturn {};\n\t\t});\n\treturn data;\n};\n\nexport const getColorData = async () => {\n\tconst data = await axios\n\t\t.get(`${sfccDomain}${controllerPath}API-ColorData`, {\n\t\t\twithCredentials: true,\n\t\t})\n\t\t.then(res => res.data)\n\t\t.then(data => data.colors)\n\t\t.catch(err => {\n\t\t\tconsole.log(err);\n\t\t\treturn {};\n\t\t});\n\treturn data;\n};\n\nexport const getProductData = async skus => {\n\tconsole.log(\"skus\", skus);\n\tconst data = await axios\n\t\t.get(`${sfccDomain}${controllerPath}API-ProductCardInfo?skus=${skus}`, {\n\t\t\twithCredentials: true,\n\t\t})\n\t\t.then(res => res.data)\n\t\t.then(data => data.products)\n\t\t.catch(err => {\n\t\t\tconsole.log(err);\n\t\t\treturn {};\n\t\t});\n\treturn data;\n};\n\nexport const getCategoryProducts = async categoryId => {\n\tconst data = await axios\n\t\t.get(\n\t\t\t`${sfccDomain}${controllerPath}API-CategoryProducts?categoryId=${categoryId}`,\n\t\t\t{\n\t\t\t\twithCredentials: true,\n\t\t\t},\n\t\t)\n\t\t.then(res => res.data)\n\t\t.then(data => ({\n\t\t\tcategoryInfo: data.categoryInfo,\n\t\t\tproducts: data.products,\n\t\t}))\n\t\t.catch(err => {\n\t\t\tconsole.log(err);\n\t\t\treturn {};\n\t\t});\n\treturn data;\n};\n\nexport const getProductsSearchResults = async searchText => {\n\tconst data = await axios\n\t\t.get(\n\t\t\t`${sfccDomain}${controllerPath}API-ProductsSearch?searchText=${searchText}`,\n\t\t\t{\n\t\t\t\twithCredentials: true,\n\t\t\t},\n\t\t)\n\t\t.then(res => res.data)\n\t\t.then(data => data.products)\n\t\t.catch(err => {\n\t\t\tconsole.log(err);\n\t\t\treturn {};\n\t\t});\n\treturn data;\n};\n\nexport const addSkuToNotificationList = async (email, sku) => {\n\tconst data = await axios\n\t\t.get(\n\t\t\t`${sfccDomain}${controllerPath}API-AddToNotificationListByEmail?email=${email}&sku=${sku}`,\n\t\t\t{\n\t\t\t\twithCredentials: true,\n\t\t\t},\n\t\t)\n\t\t.then(res => res.data)\n\t\t.then(data => ({\n\t\t\tskus: data.skus,\n\t\t\temail: data.email,\n\t\t\terror: data.error,\n\t\t}))\n\t\t.catch(err => {\n\t\t\tconsole.log(err);\n\t\t\treturn {\n\t\t\t\terror: err,\n\t\t\t};\n\t\t});\n\treturn data;\n};\n\nexport const SIDEBAR_STEPS = {\n\tSTART: 0,\n\tLIST: 1,\n\tSTORE: 2,\n};\n\nexport const PRODUCT_OFFSET = (function() {\n\tif (\n\t\twindow.drupalSettings &&\n\t\twindow.drupalSettings.lodge &&\n\t\twindow.drupalSettings.lodge.productCountOffset\n\t) {\n\t\treturn window.drupalSettings.lodge.productCountOffset;\n\t}\n\treturn 21;\n})();\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","import axios from \"axios\";\nimport {chunk} from \"../../../js/utils\";\nimport {Basket, Customer, JWTType, Product, ProductDetailsLink, ProductItem} from \"@/types\";\n\nconst ds = (window as any).drupalSettings;\n\nexport const domain = (ds && ds.lodge && ds.lodge.sfcc) || \"\";\nexport const ocapiBase = `${domain}/s/lodge/`;\nexport const ocapiClientId = \"db2801c7-2c67-4baa-8e65-8d48d8c348fe\";\nexport const ocapiVersion = \"v19_5\";\nexport const controllerPath = \"/on/demandware.store/Sites-lodge-Site/default/\";\n\ninterface AuthResponse {\n\tjwt: string;\n\tcustomer: Customer;\n}\nlet autoRefreshTimer: number | null = null;\nexport function setAutoRefreshTimer(timer: number | null) {\n\tautoRefreshTimer = timer;\n}\n\n/**\n * get JWT from OCAPI\n * @param type {string} - denotes the type of jwt call\n * @param username {string} - needed if type is \"credentials\"\n * @param password {string} - needed if type is \"credentials\"\n */\nexport async function getJWT(\n\ttype: JWTType,\n\tusername?: string,\n\tpassword?: string,\n\tjwt?: string,\n): Promise {\n\tconst url = `${ocapiBase}dw/shop/${ocapiVersion}/customers/auth?client_id=${ocapiClientId}`;\n\tconsole.log(url, type);\n\tlet post;\n\tswitch (type) {\n\t\tcase \"credentials\": {\n\t\t\tif (!username || !password) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"username and password are required to get JWT with credentials\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tpost = axios.post(\n\t\t\t\turl,\n\t\t\t\t{\n\t\t\t\t\ttype,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\tAuthorization: `Basic ${btoa(`${username}:${password}`)}`,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"refresh\": {\n\t\t\tpost = axios.post(\n\t\t\t\turl,\n\t\t\t\t{\n\t\t\t\t\ttype,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\tAuthorization: jwt,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"session\": {\n\t\t\tpost = axios.post(\n\t\t\t\turl,\n\t\t\t\t{\n\t\t\t\t\ttype,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\twithCredentials: true,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\t\tcase \"guest\":\n\t\tdefault: {\n\t\t\tpost = axios.post(url, {\n\t\t\t\ttype,\n\t\t\t});\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn post\n\t\t.then(r => {\n\t\t\tconsole.log(\"auth\", r);\n\t\t\treturn r;\n\t\t})\n\t\t.then(r => ({\n\t\t\tcustomer: r.data,\n\t\t\tjwt: r.headers.authorization,\n\t\t}))\n\t\t.catch(e => {\n\t\t\tif (type !== \"refresh\") {\n\t\t\t\tlet error = `Error getting JWT. Type: ${type}. Error: ${JSON.stringify(\n\t\t\t\t\te,\n\t\t\t\t)}`;\n\t\t\t\tconsole.log(error);\n\t\t\t\tthrow new Error(error);\n\t\t\t} else {\n\t\t\t\tlet error = `Error getting JWT. Type: ${type}. Error: ${JSON.stringify(\n\t\t\t\t\te,\n\t\t\t\t)}`;\n\t\t\t\tconsole.log(error);\n\t\t\t\t// show error message about session being expired\n\t\t\t\tlet message = document.createElement(\"div\");\n\t\t\t\tmessage.classList.add(\"session-expired\");\n\t\t\t\tmessage.append(\n\t\t\t\t\t\"Your session has expired.\",\n\t\t\t\t\tdocument.createElement(\"br\"),\n\t\t\t\t\t\"Please refresh the page to continue shopping.\",\n\t\t\t\t);\n\t\t\t\tdocument.body.appendChild(message);\n\t\t\t\tdocument.body.style.overflow = \"hidden\";\n\t\t\t\tautoRefreshTimer && clearInterval(autoRefreshTimer);\n\t\t\t\treturn e;\n\t\t\t}\n\t\t});\n}\n\n/**\n * Generates the session cookies needed to transition from Drupal to SFCC site\n */\nexport async function getSession(jwt: string) {\n\tconst url = `${ocapiBase}dw/shop/${ocapiVersion}/sessions?client_id=${ocapiClientId}`;\n\treturn axios\n\t\t.post(url, null, {\n\t\t\twithCredentials: true,\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tAuthorization: jwt,\n\t\t\t},\n\t\t})\n\t\t.then(r => r.data)\n\t\t.catch(e => {\n\t\t\tlet error = `Error creating session. JWT: ${jwt}. Error: ${JSON.stringify(\n\t\t\t\te,\n\t\t\t)}`;\n\t\t\tconsole.log(error);\n\t\t\tthrow new Error(error);\n\t\t});\n}\n\n/**\n * creates a new basket on Salesforce using OCAPI\n */\nexport async function getCustomerBasket(\n\tjwt: string,\n\tcustomerId: string,\n\tbasket?: Basket,\n): Promise {\n\tconst url = `${ocapiBase}dw/shop/${ocapiVersion}/customers/${customerId}/baskets?client_id=${ocapiClientId}`;\n\treturn axios\n\t\t.get(url, {\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tAuthorization: jwt,\n\t\t\t},\n\t\t})\n\t\t.then(r => {\n\t\t\tconsole.log(\"basket results\", r);\n\t\t\tif (r.data.total > 0) {\n\t\t\t\treturn r.data.baskets[0];\n\t\t\t} else {\n\t\t\t\treturn basket && basket.product_items\n\t\t\t\t\t? recreateBasket(jwt, basket)\n\t\t\t\t\t: createBasket(jwt);\n\t\t\t}\n\t\t})\n\t\t.catch(e => {\n\t\t\tlet error = `Error getting customer baskets. \n JWT: ${jwt}. \n Customer ID: ${customerId}.\n Error: ${JSON.stringify(e)}`;\n\t\t\tconsole.log(error);\n\t\t\tthrow new Error(error);\n\t\t});\n}\n\nexport async function getBasket(\n\tjwt: string,\n\tbasketId: string,\n): Promise {\n\tconst url = `${ocapiBase}dw/shop/${ocapiVersion}/baskets/${basketId}?client_id=${ocapiClientId}`;\n\treturn axios\n\t\t.get(url, {\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tAuthorization: jwt,\n\t\t\t},\n\t\t})\n\t\t.then(r => r.data)\n\t\t.catch(e => {\n\t\t\tlet error = `Error getting Basket. JWT: ${jwt}. BasketId: ${basketId}. Error: ${JSON.stringify(\n\t\t\t\te,\n\t\t\t)}`;\n\t\t\tconsole.log(error);\n\t\t\tthrow new Error(error);\n\t\t});\n}\n\n/**\n * get an existing basket on Salesforce using OCAPI\n */\nexport async function createBasket(jwt: string): Promise {\n\tconst url = `${ocapiBase}dw/shop/${ocapiVersion}/baskets?client_id=${ocapiClientId}`;\n\treturn axios\n\t\t.post(url, null, {\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tAuthorization: jwt,\n\t\t\t},\n\t\t})\n\t\t.then(r => r.data)\n\t\t.catch(e => {\n\t\t\tif (\n\t\t\t\te.response.data.fault.type === \"CustomerBasketsQuotaExceededException\"\n\t\t\t) {\n\t\t\t\treturn getBasket(jwt, e.response.data.fault.arguments.basketIds);\n\t\t\t} else {\n\t\t\t\tlet error = `Error creating Basket. JWT: ${jwt}. Error: ${JSON.stringify(\n\t\t\t\t\te,\n\t\t\t\t)}`;\n\t\t\t\tconsole.log(error);\n\t\t\t\tthrow new Error(error);\n\t\t\t}\n\t\t});\n}\n\nexport async function getBasketById(\n\tjwt: string,\n\tbasketId: string,\n): Promise {\n\tconst url = `${ocapiBase}dw/shop/${ocapiVersion}/baskets/${basketId}?client_id=${ocapiClientId}`;\n\treturn axios\n\t\t.get(url, {\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tAuthorization: jwt,\n\t\t\t},\n\t\t})\n\t\t.then(r => r.data)\n\t\t.catch(e => {\n\t\t\tlet error = `Error getting Basket. Basket ID: ${basketId}. Error: ${JSON.stringify(\n\t\t\t\te,\n\t\t\t)}`;\n\t\t\tconsole.log(error);\n\t\t\tthrow new Error(error);\n\t\t});\n}\n\n/**\n *\n * @param basketId {string | undefined}\n * @param productItems {Array}\n */\nexport async function addProductsToBasket(\n\tjwt: string,\n\tbasketId: string,\n\tproductItems: ProductItem[],\n): Promise {\n\tconst url = `${ocapiBase}dw/shop/${ocapiVersion}/baskets/${basketId}/items?client_id=${ocapiClientId}`;\n\treturn axios\n\t\t.post(url, productItems, {\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tAuthorization: jwt,\n\t\t\t},\n\t\t})\n\t\t.then(r => r.data)\n\t\t.catch(e => {\n\t\t\tlet error = `Error adding products to Basket. JWT: ${jwt}.\n Basket Id: ${basketId}.\n Products: ${JSON.stringify(productItems)}.\n Error: ${JSON.stringify(e)}`;\n\t\t\tconsole.log(error);\n\t\t\tthrow new Error(error);\n\t\t});\n}\n\n/**\n * Add bonus product to basket\n * @param jwt\n * @param basketId\n * @param productId\n * @param bonusItemId\n * @param qty\n */\nexport async function addBonusProductToBasket(\n\tjwt: string,\n\tbasketId: string,\n\tproductId: string,\n\tbonusProductLineItemUUID: string | undefined,\n\tbonusItemId: string,\n\tqty: number,\n): Promise {\n\t// Cart-AddBonusProducts\n\t// ?pids={\"bonusProducts\":[{\"pid\":\"008885004519M\",\"qty\":1,\"options\":[null]}],\"totalQty\":1}\n\t// &uuid=0a6c45ca93022dbae29b885b51\n\t// &pliuuid=41b75ecab2a69ae62ff205f384\n\t// const url = `${domain}${controllerPath}Cart-AddBonusProducts?`;\n\tconst url = `${ocapiBase}dw/shop/${ocapiVersion}/baskets/${basketId}/items?client_id=${ocapiClientId}`;\n\treturn axios\n\t\t.post(url, [{\n\t\t\tproduct_id: productId,\n\t\t\tbonus_discount_line_item_id: bonusItemId,\n\t\t\tc_bonusProductLineItemUUID: bonusProductLineItemUUID,\n\t\t\tquantity: qty,\n\t\t}], {\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tAuthorization: jwt,\n\t\t\t},\n\t\t})\n\t\t.then(r => r.data)\n\t\t.catch(e => {\n\t\t\tlet error = `Error adding bonus product to Basket. JWT: ${jwt}.\n Basket Id: ${basketId}.\n Products: ${bonusItemId}.\n Error: ${JSON.stringify(e)}`;\n\t\t\tconsole.log(error);\n\t\t\tthrow new Error(error);\n\t\t});\n}\n\n/**\n *\n * @param basketId {string | undefined}\n * @param productItem {Array}\n */\nexport async function removeProductFromBasket(\n\tjwt: string,\n\tbasketId: string,\n\tproductItem: ProductItem,\n): Promise {\n\tconst url = `${ocapiBase}dw/shop/${ocapiVersion}/baskets/${basketId}/items/${productItem.item_id}?client_id=${ocapiClientId}`;\n\treturn axios\n\t\t.delete(url, {\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tAuthorization: jwt,\n\t\t\t},\n\t\t})\n\t\t.then(r => r.data)\n\t\t.catch(e => {\n\t\t\tlet error = `Error removing product from Basket. JWT: ${jwt}.\n Basket Id: ${basketId}.\n Products: ${JSON.stringify(productItem)}.\n Error: ${JSON.stringify(e)}`;\n\t\t\tconsole.log(error);\n\t\t\tthrow new Error(error);\n\t\t});\n}\n\nexport async function updateProductQuantityInBasket(\n\tjwt: string,\n\tbasketId: string,\n\tproductItem: ProductItem,\n\tquantity: number,\n): Promise {\n\tconsole.log(basketId, productItem);\n\tconst url = `${ocapiBase}dw/shop/${ocapiVersion}/baskets/${basketId}/items/${productItem.item_id}?client_id=${ocapiClientId}`;\n\treturn axios\n\t\t.patch(\n\t\t\turl,\n\t\t\t{\n\t\t\t\tproduct_id: productItem.product_id,\n\t\t\t\tquantity,\n\t\t\t},\n\t\t\t{\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\tAuthorization: jwt,\n\t\t\t\t},\n\t\t\t},\n\t\t)\n\t\t.then(r => r.data)\n\t\t.catch(e => {\n\t\t\tlet error = `Error updating product quantity in Basket. JWT: ${jwt}.\n Basket Id: ${basketId}.\n Products: ${JSON.stringify(productItem)}.\n Quantity: ${quantity}\n Error: ${JSON.stringify(e)}`;\n\t\t\tconsole.log(error);\n\t\t\tthrow new Error(error);\n\t\t});\n}\n\n/**\n * creates a new basket on Salesforce using OCAPI and populates it with existing products\n * @param jwt {string}\n * @param basket {Basket}\n */\nexport async function recreateBasket(\n\tjwt: string,\n\tbasket: Basket,\n): Promise {\n\tlet newBasket = await createBasket(jwt);\n\treturn await addProductsToBasket(\n\t\tjwt,\n\t\tnewBasket.basket_id,\n\t\tbasket.product_items || ([] as ProductItem[]),\n\t);\n}\n\n/**\n * Register a new customer\n * @param username\n * @param password\n * @param lastName\n */\nexport async function registerCustomer(\n\tjwt: string,\n\tusername: string,\n\tpassword: string,\n\tlastName: string,\n) {\n\tconst url = `${ocapiBase}dw/shop/${ocapiVersion}/customers?client_id=${ocapiClientId}`;\n\treturn axios\n\t\t.post(\n\t\t\turl,\n\t\t\t{\n\t\t\t\tcustomer: {\n\t\t\t\t\tlogin: username,\n\t\t\t\t\temail: username,\n\t\t\t\t\tlast_name: lastName,\n\t\t\t\t},\n\t\t\t\tpassword: password,\n\t\t\t},\n\t\t\t{\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\tAuthorization: jwt,\n\t\t\t\t},\n\t\t\t},\n\t\t)\n\t\t.then(r => r.data)\n\t\t.catch(e => {\n\t\t\tlet error = `Error registering customer. JWT: ${jwt}.\n\t\t\t\tError: ${JSON.stringify(e)}`;\n\t\t\tconsole.log(error);\n\t\t\tthrow new Error(error);\n\t\t});\n}\n\nconst fetchProductDetails = (jwt: string) => (ids:Array) => {\n\tconst url = `${ocapiBase}dw/shop/${ocapiVersion}/products/(${ids.join(',')})?expand=images,availability,variations&client_id=${ocapiClientId}`;\n\treturn axios\n\t\t.get(url)\n\t\t.then(r => r.data.data as Product[])\n\t\t.catch(e => {\n\t\t\tlet error = `Error getting Image groups for ${ids.join(', ')}.\n \t\t\t\t\tJWT: ${jwt}.\n\t\t\t\t\t\t\t\tError: ${JSON.stringify(e)}`;\n\t\t\tconsole.log(error);\n\t\t\tthrow new Error(error);\n\t\t});\n}\n\n/**\n * Get image groups object for a product by its ID\n * @param productId {string}\n */\nexport async function getUpdatedProductsForProductItems(\n\tjwt: string,\n\tbasket: Basket,\n\tcurrentProducts: Product[],\n): Promise> {\n\tlet newProducts, productItems;\n\tif (!basket.product_items) {\n\t\treturn [] as Product[];\n\t} else {\n\t\tproductItems = basket.product_items;\n\t}\n\ttry {\n\t\tconst productIds = chunk(productItems\n\t\t\t.filter(p => {\n\t\t\t\treturn !currentProducts.some(\n\t\t\t\t\t(storedProduct: Product) => storedProduct.id === p.product_id,\n\t\t\t\t);\n\t\t\t})\n\t\t\t.map(p => p.product_id), 24); // the OCAPI endpoint can only return results for 24 IDs at a time\n\n\t\tnewProducts = await Promise.all(productIds.map(fetchProductDetails(jwt)));\n\n\t\tnewProducts = newProducts.flat();\n\n\t} catch (e) {\n\t\tnewProducts = [] as Product[];\n\t}\n\treturn currentProducts.concat(newProducts as Product[]);\n}\n\n/**\n * Get image groups object for a product by its ID\n * @param productId {string}\n */\nexport async function getUpdatedProductsForBonusItems(\n\tjwt: string,\n\tbasket: Basket,\n\tbonusProducts: ProductDetailsLink[],\n): Promise> {\n\tlet newProducts, productItems;\n\ttry {\n\t\tconst productIds = chunk(bonusProducts.map(p => p.product_id), 24); // the OCAPI endpoint can only return results for 24 IDs at a time\n\n\t\tnewProducts = await Promise.all(productIds.map(fetchProductDetails(jwt)));\n\t\tnewProducts = newProducts.flat();\n\n\t} catch (e) {\n\t\tnewProducts = [] as Product[];\n\t}\n\treturn newProducts as Product[];\n}\n\n/**\n * Get explicit recommendations for a product by its ID\n * Optionally filtered by recommendation type\n * @param productId {string}\n * @param recommendationType {number}\n */\nexport async function getProductRecommendations(\n\tjwt: string,\n\tproductId: string,\n\trecommendationType?: number,\n) {\n\tconst url = `${ocapiBase}dw/shop/${ocapiVersion}/products/${productId}/recommendations?${\n\t\trecommendationType ? `recommendation_type=${recommendationType}&` : \"\"\n\t}client_id=${ocapiClientId}`;\n\treturn axios\n\t\t.get(url, {\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tAuthorization: jwt,\n\t\t\t},\n\t\t})\n\t\t.then(r => r.data)\n\t\t.catch(e => {\n\t\t\tlet error = `Error getting product recommendations. JWT: ${jwt}.\n Product ID: ${productId}.\n Error: ${JSON.stringify(e)}`;\n\t\t\tconsole.log(error);\n\t\t\tthrow new Error(error);\n\t\t});\n}\n\n/**\n * Updates a customer's recipe list (aka cookbook)\n * @param jwt {string}\n * @param customerId {string}\n */\nexport async function updateCustomerRecipeList(\n\tjwt: string,\n\tcustomerId: string,\n\tpayload: { recipeList: [string]; env?: string },\n) {\n\tconst url = `${ocapiBase}dw/shop/${ocapiVersion}/customers/${customerId}?client_id=${ocapiClientId}`;\n\treturn axios\n\t\t.patch(\n\t\t\turl,\n\t\t\t{\n\t\t\t\tc_cookbookRecipes: payload.recipeList,\n\t\t\t},\n\t\t\t{\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\tAuthorization: jwt,\n\t\t\t\t},\n\t\t\t},\n\t\t)\n\t\t.then(r => r.data)\n\t\t.catch(e => {\n\t\t\tconsole.log(\"error updating recipes\", e.response);\n\t\t\tlet error = {\n\t\t\t\terror: `Error updating customer recipe list. JWT: ${jwt}.\n Customer ID: ${customerId}.\n Error: ${JSON.stringify(e.response)}`,\n\t\t\t\tresponse: e.response.data,\n\t\t\t};\n\t\t\tconsole.log(error);\n\t\t\tthrow error;\n\t\t});\n}\n","import Vue from \"vue\";\n\nconst EventBus = new Vue();\n\nexport default EventBus;\n","import { SaveableModule } from \"@/store/types\";\nimport Cookies from \"universal-cookie\";\n\nconst cookies = new Cookies();\nconst cookieDomainMatch = /(\\w+\\.\\w+)$/g.exec(window.location.hostname);\nconst cookieDomain =\n\tcookieDomainMatch && cookieDomainMatch[1]\n\t\t? `.${cookieDomainMatch[1]}`\n\t\t: \".lodgecastiron.com\";\n\nconsole.log(\"cookie domain\", cookieDomain);\n\ninterface PersistOptions {\n\tstorage: any;\n\tkey: string;\n\n\t[propName: string]: any;\n}\n\nclass PersistentData {\n\tprivate options: PersistOptions;\n\tprivate storage: any;\n\tprivate key: string;\n\n\tconstructor(options?: PersistOptions) {\n\t\tthis.options = options || ({} as PersistOptions);\n\t\tthis.storage = this.options.storage || (window && window.localStorage);\n\t\tthis.key = this.options.key || \"vuex\";\n\t\tif (!this.canWriteStorage(this.storage)) {\n\t\t\tthrow new Error(\"Invalid storage instance given\");\n\t\t}\n\t}\n\n\tcanWriteStorage(storage: any) {\n\t\ttry {\n\t\t\tcookies.set(\"@@\", 1, {\n\t\t\t\tsecure: true\n\t\t\t});\n\t\t\tcookies.remove(\"@@\",{\n\t\t\t\tsecure: true\n\t\t\t});\n\t\t\t// storage.setItem('@@', 1);\n\t\t\t// storage.removeItem('@@');\n\t\t\treturn true;\n\t\t} catch (e) {\n\t\t\tconsole.log(\"could not read/write to cookies\");\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Uses LZString to decompress cookies\n\t * @param module\n\t * @param key\n\t * @param storage\n\t * @param value\n\t */\n\tgetState(\n\t\tmodule: SaveableModule,\n\t\tkey: string,\n\t\tstorage: any,\n\t\tvalue?: string | undefined,\n\t) {\n\t\tconst obj: { [propName: string]: any } = module.toObject();\n\t\tconsole.log(\"cookies getting\", key, obj, Object.keys(obj));\n\n\t\ttry {\n\t\t\treturn Object.keys(obj).reduce(\n\t\t\t\t(o: { [propName: string]: any }, prop: string): object => {\n\t\t\t\t\to[prop] = cookies.get(prop) || obj[prop];\n\t\t\t\t\treturn o;\n\t\t\t\t},\n\t\t\t\t{} as { [propName: string]: any },\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tconsole.log(\"cookies get Error getting state or parsing JSON of state\");\n\t\t}\n\t\treturn {};\n\t}\n\n\t/**\n\t * Uses LZString to compress object strings and stores them to cookies\n\t * @param module\n\t * @param key\n\t * @param storage\n\t */\n\tsetState(\n\t\tmodule: SaveableModule,\n\t\tkey: string = this.key,\n\t\tstorage: any = this.storage,\n\t) {\n\t\tconsole.log(\"writing cookies\", key, module.toObject());\n\t\tconst obj: { [propName: string]: any } = module.toObject();\n\t\tfor (const prop in obj) {\n\t\t\tif (obj.hasOwnProperty(prop)) {\n\t\t\t\tconst value: string =\n\t\t\t\t\ttypeof obj[prop] === \"object\" ? JSON.stringify(obj[prop]) : obj[prop];\n\t\t\t\tcookies.set(prop, value, {\n\t\t\t\t\tpath: \"/\",\n\t\t\t\t\tdomain: cookieDomain,\n\t\t\t\t\texpires: new Date(Date.now() + 60 * 60 * 24 * 365 * 10 * 1000), // now + 10 years\n\t\t\t\t\tsecure: true\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\thydrate(module: SaveableModule) {\n\t\tconst state = this.getState(module, this.key, this.storage);\n\t\tconsole.log(\"Hydrating cookies getting\", state);\n\n\t\t// Overwrite parts of module's that\n\t\t// we saved\n\t\tconst keys = Object.keys(state);\n\t\tkeys.forEach(key => {\n\t\t\t(module as any)[key] = state[key];\n\t\t});\n\t}\n}\n\nexport const persistentData = new PersistentData();\n","import {\n Action,\n Module,\n Mutation,\n RegisterOptions,\n VuexModule,\n} from \"vuex-class-modules\";\nimport store from \"../index\";\nimport EventBus from \"../../event-bus\";\nimport {SaveableModule} from \"@/store/types\";\nimport {MutationPayload} from \"vuex\";\nimport {accountState} from \"./types\";\nimport {persistentData} from \"../persistState\";\nimport {Basket, Customer, JWTType, Product, ProductDetailsLink, ProductItem} from \"@/types\";\nimport {\n addProductsToBasket,\n createBasket,\n getCustomerBasket,\n getJWT,\n getUpdatedProductsForProductItems,\n recreateBasket,\n removeProductFromBasket,\n updateCustomerRecipeList,\n updateProductQuantityInBasket,\n getSession, getUpdatedProductsForBonusItems, addBonusProductToBasket,\n} from \"../../ocapi\";\n\nconst name: string = \"accountModule\";\n\ninterface JWTResponse {\n jwt: string;\n customer: Customer;\n jwtExpiration: number;\n customerLoggedIn: boolean;\n}\n\nfunction PreValidateJWTAndBasket(\n target: AccountModule,\n key: string,\n descriptor: any,\n) {\n const original = descriptor.value;\n if (typeof original === \"function\") {\n console.log(\"prevalidate setup\", target, key, descriptor);\n descriptor.value = async function (...args: any[]) {\n console.log(\"prevalidate run\", target, key, descriptor);\n const boundOriginal = original.bind(this);\n const currentJWTValid = this.isJWTValid();\n await this.getValidJWT(\"prevalidate\");\n await this.getValidBasket(currentJWTValid);\n await boundOriginal(...args);\n };\n }\n return descriptor;\n}\n\n@Module({generateMutationSetters: true})\nexport class AccountModule extends VuexModule\n implements accountState, SaveableModule {\n moduleName: string = name;\n jwt: string = \"\";\n customer: Customer = {} as Customer;\n jwtExpiration: number = 0;\n basket: Basket = {} as Basket;\n products: Product[] = [];\n customerLoggedIn: boolean = false;\n error: any = null;\n expirationTime: number = 30 * 60 * 1000; // 30 minutes\n refreshTimeWindow: number = 5 * 60 * 1000; // 5 minutes\n sessionChecked: boolean = false;\n guestChecked: boolean = false;\n\n constructor(options: RegisterOptions) {\n super(options);\n persistentData.hydrate(this);\n }\n\n minBasket(basket: Basket) {\n\n const bonus_discount_line_items = this.basket.bonus_discount_line_items && this.basket.bonus_discount_line_items.map(bdli => {\n if (!bdli.bonusProductLineItemUUID) {\n // we don't have a bonus product line item id associated so\n // we look for a product item that hasn't been associated yet and use that id\n const bonusProductLineItemUUID = this.basket.product_items\n && this.basket.product_items.find(p => {\n return this.basket.bonus_discount_line_items\n && this.basket.bonus_discount_line_items\n .every(b => p.item_id !== b.bonusProductLineItemUUID);\n });\n bdli.bonusProductLineItemUUID = (bonusProductLineItemUUID && bonusProductLineItemUUID.item_id) || \"\";\n }\n return bdli;\n });\n\n return {\n basket_id: this.basket.basket_id,\n customer_info: this.basket.customer_info,\n bonus_discount_line_items: bonus_discount_line_items,\n product_items:\n this.basket.product_items &&\n this.basket.product_items\n .filter(p => !p.bonus_product_line_item)\n .map(p => ({\n product_id: p.product_id,\n quantity: p.quantity,\n item_id: p.item_id\n })),\n };\n }\n\n toJSON(): string {\n return JSON.stringify(this.toObject());\n }\n\n toObject(): object {\n return {\n jwtExpiration: this.jwtExpiration,\n jwt: this.jwt,\n customer: this.customer,\n basket: this.minBasket(this.basket),\n // products: this.products,\n };\n }\n\n subscribe(mutation: MutationPayload) {\n if (this.shouldSave(mutation)) {\n console.log(\"saving\", this.basket, mutation);\n this.save();\n }\n }\n\n shouldSave(mutation: MutationPayload) {\n // We want to save any change to this module\n // So it's basically a truthy value\n return mutation.type.indexOf(\"account\") === 0;\n }\n\n save() {\n // This passes state jwt and basket\n persistentData.setState(this);\n }\n\n getJWTExpiration() {\n return Date.now() + this.expirationTime;\n }\n\n isJWTValid() {\n return !!this.jwt && Date.now() < +this.jwtExpiration;\n }\n\n /**\n * Scenarios\n * Invalid JWT\n * first visit: (invalid jwt)\n * try\n * jwt from session\n * catch\n * new guest jwt;\n * and new basket\n * repeat visit in 60 min from 1st: (invalid jwt)\n * new guest jwt AND\n * new basket AND\n * copy over products\n *\n * Valid JWT\n * repeat visit in 10 min from 1st: (valid jwt)\n * continue with jwt AND\n * continue with basket\n * repeat visit between 25 and 30 min from 1st: (valid jwt)\n * refresh jwt AND\n * continue with basket\n */\n\n @Action\n @PreValidateJWTAndBasket\n async initAccount() {\n console.log(\"initializing Account\");\n this.products = await getUpdatedProductsForProductItems(\n this.jwt,\n this.basket,\n this.products,\n );\n EventBus.$emit(\"sfccAccountReady\");\n return this.basket;\n }\n\n /**\n * create a flow for getting valid jwt and basket whether that means\n * from storage or from SFCC\n * which is used by the PreValidateJWTAndBasket decorator to add to other methods\n */\n\n async getValidJWT(from: string) {\n // try to restore SFCC session\n // if this fails continue to get a JWT\n console.log(\n \"get valid jwt from:\",\n from,\n \"sessionChecked:\",\n this.sessionChecked,\n \"guestChecked:\",\n this.guestChecked,\n );\n try {\n if (!this.sessionChecked) {\n this.sessionChecked = true;\n let jwt = await this.getJWT({type: \"session\"});\n console.log(\"validatejwt: got session\", this.jwt);\n return jwt;\n } else {\n throw new Error(\"Session has been checked and does not exist\");\n }\n } catch (e) {\n // if valid jwt use it\n if (this.customer && this.customer.auth_type && this.isJWTValid()) {\n console.log(\"validatejwt: use existing jwt\");\n return this.jwt;\n } else {\n // get a new guest JWT\n try {\n if (!this.guestChecked) {\n this.guestChecked = true;\n let jwt = await this.getJWT({type: \"guest\"});\n console.log(\n \"validatejwt: couldn't authenticate session and no JWT to refresh so create a guest JWT:\",\n jwt,\n );\n return jwt;\n } else {\n return this.jwt;\n }\n } catch (e) {\n console.error(\"Error getting guest JWT\");\n // TODO display error message to the user...\n throw new Error(\"Error getting guest JWT\");\n }\n }\n }\n }\n\n /**\n * if there is a jwt in local storage but ut is invalid we need to create a new one\n * otherwise we can just use it\n * also handle refreshing the JWT before it expires\n * @param type {JWTType}\n * @param username {string}\n * @param password {string}\n */\n @Action\n async getJWT(payload: {\n type: JWTType;\n username?: string;\n password?: string;\n }): Promise {\n if (\n payload.type === \"credentials\" &&\n (!payload.username || !payload.password)\n ) {\n throw new Error(\n \"Error getting JWT, credentials type requires username and password\",\n );\n }\n try {\n let jwtResponse = await getJWT(\n payload.type,\n payload.username,\n payload.password,\n this.jwt, // for refreshing JWT when payload.type is \"refresh\"\n );\n this.jwt = jwtResponse.jwt;\n this.customer = jwtResponse.customer;\n console.log(\"customer\", this.customer);\n this.jwtExpiration = this.getJWTExpiration();\n this.customerLoggedIn = this.customer && this.customer.auth_type === \"registered\";\n return jwtResponse.jwt;\n } catch (e) {\n throw new Error(e); // error already formatted in api call\n }\n }\n\n /**\n * if basketStub from cookie\n * need to know if it's a basketStub vs full basket\n * check if basket is available for current jwt/customerId\n * basket: use it\n * no-basket: get new basket && add items from basketStub to it\n * @param currentJWTValid\n */\n async getValidBasket(currentJWTValid?: boolean) {\n // isJWTValid is always true cause we just got a new when we init\n // with old jwt - so we need to pass in here an arg that tells\n // that we need a new basket: currentJWTValid\n\n if (!this.basket.basket_id) {\n // no basket, need to create one\n // this will try to get a customer basket and if none exists returns a new one\n try {\n this.basket = await getCustomerBasket(\n this.jwt,\n this.customer.customer_id,\n );\n } catch (error) {\n this.guestChecked = true;\n await this.getJWT({type: \"guest\"});\n this.basket = this.basket.product_items\n ? await recreateBasket(this.jwt, this.basket)\n : await createBasket(this.jwt);\n console.log(\n \"error getting customer basket with no basket in storage\",\n error,\n );\n }\n } else if (!this.basket.last_modified) {\n // not a real basket so need to try to get or create one\n try {\n // try to get a customer basket in case the user was logged in,\n // but the session is not valid anymore\n console.log(\"get customer basket\");\n this.basket = await getCustomerBasket(\n this.jwt,\n this.customer.customer_id,\n this.basket,\n );\n } catch (e) {\n // didn't get a customer basket because of error so create a new one\n // if we have products recreate them in a new basket\n // otherwise get a fresh basket\n console.log(\"(re)create basket after failing to get customer basket\");\n this.guestChecked = true;\n await this.getJWT({type: \"guest\"});\n this.basket = this.basket.product_items\n ? await recreateBasket(this.jwt, this.basket)\n : await createBasket(this.jwt);\n }\n } else if (currentJWTValid) {\n // we have a real basket and valid jwt so use the basket\n console.log(\"use current basket\");\n return this.basket;\n } else {\n // we have a real basket but the jwt is invalid so we need to recreate it\n // if we have products in it\n // otherwise we can just create a fresh one\n console.log(\"(re)create basket because jwt is invalid\");\n this.basket = await getCustomerBasket(\n this.jwt,\n this.customer.customer_id,\n this.basket,\n );\n }\n\n return this.basket;\n }\n\n /**\n * Adds items to basket\n * @param productItems\n */\n @Action\n @PreValidateJWTAndBasket\n async addProductsToBasket(productItems: Array) {\n this.basket = await addProductsToBasket(\n this.jwt,\n this.basket.basket_id,\n productItems,\n );\n this.products = await getUpdatedProductsForProductItems(\n this.jwt,\n this.basket,\n this.products,\n );\n return this.basket;\n }\n\n /**\n * Adds bonus items to basket\n * @param productId\n * @param bonusItemId\n * @param qty\n */\n @Action\n @PreValidateJWTAndBasket\n async addBonusProductToBasket({productId, bonusProductLineItemUUID, bonusItemId, qty}: {\n productId: string,\n bonusProductLineItemUUID: string | undefined,\n bonusItemId: string,\n qty: number}) {\n console.log(productId, bonusProductLineItemUUID, bonusItemId, qty);\n this.basket = await addBonusProductToBasket(\n this.jwt,\n this.basket.basket_id,\n productId,\n bonusProductLineItemUUID,\n bonusItemId,\n qty,\n );\n\n return this.basket;\n }\n\n /**\n * Get Bonus Product Details\n * @param bonusItems\n */\n @Action\n @PreValidateJWTAndBasket\n async getBonusProductDetails(bonusItems: Array) {\n const newBonusItems = bonusItems.filter(b => !this.products.some(p => p.id === b.product_id))\n const products = await getUpdatedProductsForBonusItems(\n this.jwt,\n this.basket,\n newBonusItems,\n );\n\n this.products = this.products.concat(products);\n\n return this.basket;\n }\n\n @Action\n @PreValidateJWTAndBasket\n async updateProductQuantityInBasket(payload: {\n productItem: ProductItem;\n quantity: number;\n }) {\n let productItem: ProductItem | false =\n !!this.basket.product_items &&\n this.basket.product_items.length > 0 &&\n this.basket.product_items\n .filter(p => p.product_id === payload.productItem.product_id\n && !p.bonus_product_line_item)\n .reduce((a, c) => c);\n\n if (productItem) {\n this.basket = await updateProductQuantityInBasket(\n this.jwt,\n this.basket.basket_id,\n productItem,\n payload.quantity,\n );\n this.products = await getUpdatedProductsForProductItems(\n this.jwt,\n this.basket,\n this.products,\n );\n }\n return this.basket;\n }\n\n @Action\n @PreValidateJWTAndBasket\n async removeProductFromBasket(payload: {\n basketId: string;\n productItem: ProductItem;\n }) {\n this.basket = await removeProductFromBasket(\n this.jwt,\n payload.basketId,\n payload.productItem,\n );\n this.products = await getUpdatedProductsForProductItems(\n this.jwt,\n this.basket,\n this.products,\n );\n return this.basket;\n }\n\n @Action\n @PreValidateJWTAndBasket\n async updateCustomerRecipeList(payload: {\n recipeList: [string];\n env: string;\n }) {\n this.customer = await updateCustomerRecipeList(\n this.jwt,\n this.customer.customer_id,\n payload,\n );\n return this.customer;\n }\n\n // @Action\n // async loginUser(payload: { type: JWTType, username: string, password: string }) {\n // if (payload.type === 'credentials' && (!payload.username || !payload.password)) {\n // throw new Error('Error logging in user, credentials type requires username and password');\n // }\n // const jwt = this.getNewJWT(payload.type, payload.username, payload.password);\n // this.customerLoggedIn = true;\n // return jwt;\n // }\n //\n // @Action\n // async registerCustomer(payload: { username: string, password: string, lastName: string }) {\n // const [err, customer] = await to(registerCustomer(payload.username, payload.password, payload.lastName));\n // if (err) {\n // // TODO handle register errors\n // console.log(\"register error\", err);\n // return err;\n // }\n // this.customerLoggedIn = true;\n // return customer;\n // }\n\n @PreValidateJWTAndBasket\n async getSession() {\n try {\n const session = await getSession(this.jwt);\n console.log(session);\n return session;\n } catch (e) {\n console.log(e);\n }\n }\n\n @Action\n resetAccount(): boolean {\n try {\n this.jwt = \"\";\n this.jwtExpiration = Date.now() - 1000;\n this.basket = {} as Basket;\n this.customer = {} as Customer;\n return true;\n } catch (e) {\n return false;\n }\n }\n\n @PreValidateJWTAndBasket\n get drupalCanUseAccountFunctions(): boolean {\n return !!(this.jwt && this.jwt.length);\n }\n}\n\nexport const accountModule: AccountModule = new AccountModule({\n store,\n name,\n});\n\nstore.subscribe(accountModule.subscribe.bind(accountModule));\n","import { createVariantKey } from \"../../utils\";\nimport { THEME_PATH } from \"../../../utils\";\nexport default {\n\tgetProducts(state) {\n\t\treturn state.products;\n\t},\n\tgetColors(state) {\n\t\treturn state.colors;\n\t},\n\tgetMasterInfo(state) {\n\t\treturn state.masterInfo;\n\t},\n\tgetAssociatedProducts(state, getters) {\n\t\treturn state.associatedProducts[getters.getCurrentVariant.sku];\n\t},\n\n\tgetFreeProducts(state) {\n\t\treturn state.freeProducts;\n\t},\n\tgetCurrentVariant(state) {\n\t\tconst key = createVariantKey(state.selected);\n\t\treturn state.products\n\t\t\t.filter((item) => {\n\t\t\t\treturn item.vue_key === key;\n\t\t\t})\n\t\t\t.reduce((acc, curr) => curr, {});\n\t},\n\tgetQuantity(state) {\n\t\treturn state.quantity;\n\t},\n\tgetDefaultAttribute(state, getters) {\n\t\tconsole.log(state.type);\n\t\tif (state.type !== \"variationName\") return [];\n\t\treturn state.products.map((v) => {\n\t\t\treturn {\n\t\t\t\tlabel: v.title,\n\t\t\t\tname: v.sku,\n\t\t\t};\n\t\t});\n\t},\n\tgetVariantMedia(state, getters) {\n\t\treturn getters.getCurrentVariant.images;\n\t},\n\tgetOptions(state) {\n\t\treturn state.options;\n\t},\n\tgetAvailableColorsBySize(state, getters) {\n\t\tif (!state.selected.attribute_color) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (state.type === \"color\") {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst availableColorsBySize = {};\n\n\t\tstate.products.forEach((p) => {\n\t\t\tif (!availableColorsBySize[p.attributes.attribute_size]) {\n\t\t\t\tavailableColorsBySize[p.attributes.attribute_size] = new Set();\n\t\t\t}\n\n\t\t\tavailableColorsBySize[p.attributes.attribute_size].add(\n\t\t\t\tp.attributes.attribute_color,\n\t\t\t);\n\t\t});\n\n\t\treturn availableColorsBySize;\n\t\t/*\n\t\t\t'3.5\"': [ 'blue', 'red'],\n\t\t\t'4.5 qt': ['oyster']\n\t\t*/\n\t},\n\tgetSelectedOptions(state) {\n\t\treturn {\n\t\t\tselected_size: state.selected.attribute_size,\n\t\t\tselected_color: state.selected.attribute_color,\n\t\t\tselected_quantity: state.selected.attribute_quantity,\n\t\t};\n\t},\n\tgetImages(state, getters) {\n\t\tconst noImagesArray = [`${THEME_PATH}/images/no-product-image.png`];\n\t\tconst images =\n\t\t\tgetters.getCurrentVariant &&\n\t\t\t(getters.getCurrentVariant.parent_images ||\n\t\t\t\tgetters.getCurrentVariant.images);\n\t\tif (!images) {\n\t\t\treturn noImagesArray;\n\t\t}\n\t\tif (images.large.length) return images.large;\n\t\telse if (images.medium.length) return images.medium;\n\t\treturn noImagesArray;\n\t},\n\tgetVideos(state, getters) {\n\t\tconst noVideosArray = [];\n\t\tconst videos = getters.getCurrentVariant && getters.getCurrentVariant.videos;\n\t\tif (!videos) {\n\t\t\treturn noVideosArray;\n\t\t}\n\t\tif (videos.length) return videos;\n\t\treturn noVideosArray;\n\t},\n};\n","import Vue from \"vue\";\nimport { createVariantKey } from \"../../utils\";\n\nexport default {\n\tsetRecommendations(state, { data }) {\n\t\tVue.set(state, \"recommendations\", data);\n\t},\n\tsetAssociatedProducts(state, { sku, data }) {\n\t\tVue.set(state.associatedProducts, sku, data);\n\t},\n\tsetFreeProducts(state, { data }) {\n\t\tconsole.log(data);\n\t\tVue.set(state.freeProducts, \"data\" ,data);\n\t},\n\tsetOptions(state, { options, type, colors }) {\n\t\tstate.options = options;\n\t\tstate.type = type;\n\t\tstate.colors = colors;\n\t},\n\tsetQuantity(state, { quantity }) {\n\t\tconst q = parseInt(quantity, 10);\n\t\tif (!isNaN(q)) {\n\t\t\tstate.quantity = q;\n\t\t}\n\t},\n\tsetCurrentVariant(state, { sku }) {\n\t\tstate.sku = sku;\n\t},\n\tsetVariants(state, { products }) {\n\t\tstate.products = products;\n\t},\n\tsetSpecificOption(state, options = {}) {\n\t\tlet selected = JSON.parse(JSON.stringify(state.selected));\n\t\tconst keys = Object.keys(options);\n\t\tkeys.forEach(key => {\n\t\t\tselected[key] = options[key];\n\t\t});\n\n\t\tconst key = createVariantKey(selected);\n\t\tconst doesItExist = state.products.filter(i => i.vue_key === key);\n\t\tif (!doesItExist.length) {\n\t\t\t// the option is something they're trying to select that doesn't exist,\n\t\t\t// so now we're going to loop through and find the first product that fits their match\n\t\t\tconst partialKey = createVariantKey(options);\n\t\t\t// this _has_ to exist because otherwise where did the filter button come from...\n\t\t\tconst product = state.products.filter(\n\t\t\t\ti => i.vue_key.indexOf(partialKey) >= 0,\n\t\t\t)[0];\n\t\t\tselected = product.attributes;\n\t\t}\n\t\tstate.selected = selected;\n\t},\n\tsetMasterInfo(state, masterInfo) {\n\t\tstate.masterInfo = masterInfo;\n\t},\n};\n","import axios from \"axios\";\nimport {\n\tdomain as sfccDomain,\n\tcontrollerPath,\n\tgetProductRecommendations,\n} from \"../../../../lodge-vue/src/ocapi\";\nimport { DRUPAL_API } from \"../../../utils\";\nimport regeneratorRuntime from \"regenerator-runtime\";\nimport { gtmCustomEventPush, EVENTS } from \"../../../analytics\";\n\nconst getProductDataFromDrupal = async (jwt, sku, type) => {\n\tconst recommendationData = await getProductRecommendations(jwt, sku, type);\n\tif (recommendationData.recommendations) {\n\t\tconst { recommendations } = recommendationData;\n\t\tconst skus = recommendations.reduce((acc, curr) => {\n\t\t\tconst sku = curr.recommended_item_id;\n\t\t\treturn (acc += acc.length > 0 ? `,${sku}` : `${sku}`);\n\t\t}, \"\");\n\t\tconst variantData = await axios\n\t\t\t// .get(`${DRUPAL_API}/salesforce/variant?skus=${skus}`)\n\t\t\t.get(`${sfccDomain}${controllerPath}API-VariantContent?skus=${skus}`)\n\t\t\t.then(res => res.data.variants)\n\t\t\t.then(data =>\n\t\t\t\tdata.map(p => {\n\t\t\t\t\tp.content.sku = p.sku;\n\t\t\t\t\treturn Object.assign({}, { sku: p.sku }, p.content);\n\t\t\t\t}),\n\t\t\t);\n\n\t\treturn variantData;\n\t}\n\n\treturn [];\n};\nexport default {\n\tasync fetchRelatedItems({ commit }, { sku, jwt, type }) {\n\t\ttry {\n\t\t\tconsole.log(33, \"fetch related items\", sku);\n\t\t\tconst data = await getProductDataFromDrupal(jwt, sku, type);\n\t\t\tcommit(\"setAssociatedProducts\", { sku, data });\n\t\t} catch (err) {\n\t\t\tgtmCustomEventPush({\n\t\t\t\tevent: EVENTS.ASSOCIATED_PRODUCT_FAILURE,\n\t\t\t\textraData: {\n\t\t\t\t\tsku,\n\t\t\t\t\ttype,\n\t\t\t\t},\n\t\t\t});\n\t\t\tcommit(\"setAssociatedProducts\", { sku, data: [] });\n\t\t}\n\t},\n\tasync fetchFreeItems({ commit }, { id }) {\n\t\ttry {\n\t\t\tconst data = await axios\n\t\t\t.get(`${sfccDomain}${controllerPath}API-GiftProductDetails?productId=${id}`)\n\t\t\t.then(res => res.data.product)\n\t\t\tcommit(\"setFreeProducts\", { data } );\n\t\t\tconsole.log(data);\n\t\t} catch (err) {\n\t\t\tcommit(\"setFreeProducts\", { data :{}});\n\t\t}\n\n\t},\n\tasync fetchCustomerRecommendations({ commit }, { jwt, sku, type }) {\n\t\ttry {\n\t\t\tconsole.log(\"customer recommendations\", sku);\n\t\t\tconst data = await getProductDataFromDrupal(jwt, sku, type);\n\t\t\tcommit(\"setRecommendations\", { data });\n\t\t} catch (err) {\n\t\t\tgtmCustomEventPush({\n\t\t\t\tevent: EVENTS.CUSTOMER_RECOMMENDATION_FAILURE,\n\t\t\t\textraData: {\n\t\t\t\t\tsku,\n\t\t\t\t\ttype,\n\t\t\t\t},\n\t\t\t});\n\t\t\tcommit(\"setRecommendations\", { data: [] });\n\t\t}\n\t},\n};\n","import getters from \"./getters\";\nimport mutations from \"./mutations\";\nimport actions from \"./actions\";\nimport state from \"./state\";\n\nexport default {\n\tnamespaced: true,\n\tstate,\n\tactions,\n\tgetters,\n\tmutations,\n};\n","import { lodgeLocalStorage } from \"../../../classes/LodgeStorage\";\n\nexport default {\n\t// sku will end up being a getter, i think\n\tsku: \"\",\n\tquantity: 1,\n\n\t// from drupal\n\ttype: \"\",\n\toptions: {},\n\tcolors: [],\n\tproducts: [],\n\tassociatedProducts: {},\n\tfreeProducts:{},\n\t// these are all the attributes\n\t// that get selected by the user\n\tselected: {\n\t\tattribute_color: null,\n\t\tattribute_size: null,\n\t\tattribute_quantity: null,\n\t\tattribute_default: null,\n\t\tattribute_variationName: null,\n\t},\n\n\trecommendations: [],\n\trecentlyViewed: lodgeLocalStorage.get(\"recently_viewed\"),\n\tmasterInfo: null,\n};\n","//http://lodgemfgode3.prod.acquia-sites.com/api/lodge/salesforce/products\n\nimport { queryParams } from \"../../../utils.js\";\nimport { validProductProperties } from \"../../../utils.js\";\nfunction validFilterKey(key) {\n\treturn validProductProperties.includes(key);\n}\n\n/**\n * @type {ProductListingState}\n */\nlet qp = queryParams();\nconst State = {\n\tloadingState: \"idle\",\n\tproducts: [],\n\tcolors: [],\n\tselectedFilters: Object.keys(qp)\n\t\t.filter(validFilterKey)\n\t\t.reduce((acc, key) => {\n\t\t\treturn acc.concat(qp[key].split(\"|\").map(val => `${key}:${val}`));\n\t\t}, []),\n\tquerySeparator: \"|\",\n\tpage: (qp && qp[\"page\"] && parseInt(qp[\"page\"], 10)) || 1,\n\tnavigatedProduct: (qp && qp[\"p\"]) || \"\",\n};\n\nexport default State;\n","//http://lodgemfgode3.prod.acquia-sites.com/api/lodge/salesforce/products\nimport { validProductProperties, queryParams } from \"../../../utils\";\n\nfunction _filteredProducts(selectedFilters, filterableProducts) {\n\tif (selectedFilters.length == 0) return filterableProducts;\n\t//const p1 = performance.now();\n\tconst sListHash = selectedFilters.reduce(\n\t\t(hash, f) => {\n\t\t\tif (f.includes(\"Material\")) hash.Materials.push(f);\n\t\t\telse if (f.includes(\"Type\")) hash.Types.push(f);\n\t\t\telse if (f.includes(\"Size\")) hash.Sizes.push(f);\n\t\t\telse if (f.includes(\"Color\")) hash.Colors.push(f);\n\t\t\telse if (f.includes(\"Shape\")) hash.Shapes.push(f);\n\t\t\telse if (f.includes(\"Collection\")) hash.Collections.push(f);\n\t\t\telse if (f.includes(\"Sale\")) hash.Sales.push(f);\n\t\t\treturn hash;\n\t\t},\n\t\t{\n\t\t\tMaterials: [],\n\t\t\tTypes: [],\n\t\t\tSizes: [],\n\t\t\tColors: [],\n\t\t\tShapes: [],\n\t\t\tCollections: [],\n\t\t\tSales: [],\n\t\t},\n\t);\n\t//const p2 = performance.now();\n\t//console.log(`sListHash took ${p2 - p1} milliseconds.`);\n\t//const pr1 = performance.now();\n\tconst result = filterableProducts.filter(p => {\n\t\t//const p3 = performance.now();\n\t\tconst pListHash = p.filterList.reduce(\n\t\t\t(hash, f) => {\n\t\t\t\tif (f.indexOf(\"Material\") != -1) hash.Materials.push(f);\n\t\t\t\telse if (f.indexOf(\"Type\") != -1) hash.Types.push(f);\n\t\t\t\telse if (f.indexOf(\"Size\") != -1) hash.Sizes.push(f);\n\t\t\t\telse if (f.indexOf(\"Color\") != -1) hash.Colors.push(f);\n\t\t\t\telse if (f.indexOf(\"Shape\") != -1) hash.Shapes.push(f);\n\t\t\t\telse if (f.indexOf(\"Collection\") != -1) hash.Collections.push(f);\n\t\t\t\telse if (f.indexOf(\"Sale\") != -1) hash.Sales.push(f);\n\t\t\t\treturn hash;\n\t\t\t},\n\t\t\t{\n\t\t\t\tMaterials: [],\n\t\t\t\tTypes: [],\n\t\t\t\tSizes: [],\n\t\t\t\tColors: [],\n\t\t\t\tShapes: [],\n\t\t\t\tCollections: [],\n\t\t\t\tSales: [],\n\t\t\t},\n\t\t);\n\t\t//const p4 = performance.now();\n\t\t//console.log(`pListHash took ${p4 - p3} milliseconds.`);\n\n\t\t// TODO: See if we can move these checks up into above array loops\n\t\tconst hasMaterial = sListHash.Materials.length\n\t\t\t? sListHash.Materials.some(val => pListHash.Materials.includes(val))\n\t\t\t: true;\n\t\tconst hasTypes = sListHash.Types.length\n\t\t\t? sListHash.Types.some(val => pListHash.Types.includes(val))\n\t\t\t: true;\n\t\tconst hasSizes = sListHash.Sizes.length\n\t\t\t? sListHash.Sizes.some(val => pListHash.Sizes.includes(val))\n\t\t\t: true;\n\t\tconst hasColors = sListHash.Colors.length\n\t\t\t? sListHash.Colors.some(val => pListHash.Colors.includes(val))\n\t\t\t: true;\n\t\tconst hasShapes = sListHash.Shapes.length\n\t\t\t? sListHash.Shapes.some(val => pListHash.Shapes.includes(val))\n\t\t\t: true;\n\t\tconst hasCollections = sListHash.Collections.length\n\t\t\t? sListHash.Collections.some(val => pListHash.Collections.includes(val))\n\t\t\t: true;\n\t\t\tconst hasSales = sListHash.Sales.length\n\t\t\t\t? sListHash.Sales.some(val => pListHash.Sales.includes(val))\n\t\t\t\t: true;\n\t\treturn (\n\t\t\thasMaterial &&\n\t\t\thasTypes &&\n\t\t\thasCollections &&\n\t\t\thasSizes &&\n\t\t\thasColors &&\n\t\t\thasShapes &&\n\t\t\thasSales\n\t\t);\n\t});\n\t//const pr2 = performance.now();\n\t//console.log(`result took ${pr2 - pr1} milliseconds.`);\n\treturn result;\n}\n\nconst Getters = {\n\tfilteredProducts(state, getters) {\n\t\treturn _filteredProducts(state.selectedFilters, getters.filterableProducts);\n\t},\n\tfilteredProductsProperties(state, getters) {\n\t\tif (state.selectedFilters.length == 0)\n\t\t\treturn getters.propertyListSelectValues;\n\n\t\tlet availableFilters = [...state.selectedFilters];\n\t\tgetters.propertyListSelectValues.forEach(val => {\n\t\t\tif (availableFilters.includes(val)) return;\n\t\t\tconst resultCount = _filteredProducts(\n\t\t\t\tstate.selectedFilters.concat(val),\n\t\t\t\tgetters.filterableProducts,\n\t\t\t).length;\n\n\t\t\tif (resultCount != 0 && resultCount != getters.filteredProducts.length) {\n\t\t\t\tavailableFilters.push(val);\n\t\t\t}\n\t\t});\n\t\treturn availableFilters;\n\t\tconst primaryFilters = state.selectedFilters.filter(f =>\n\t\t\tf.includes(\"Material\"),\n\t\t);\n\t\tconst materialFilters = primaryFilters.filter(f => f.includes(\"Material\"));\n\t\tconst typeFilters = primaryFilters.filter(f => f.includes(\"Type\"));\n\t\tconst secondaryFilters = state.selectedFilters.filter(\n\t\t\tf => !f.includes(\"Material\"),\n\t\t);\n\t\t// debugger;\n\t\treturn Array.from(\n\t\t\tnew Set(\n\t\t\t\tgetters.filterableProducts.reduce((filterList, p) => {\n\t\t\t\t\t// TODO: clean up\n\t\t\t\t\tconst hasPrimary = primaryFilters.length\n\t\t\t\t\t\t? primaryFilters.some(f => p.filterList.includes(f))\n\t\t\t\t\t\t: true;\n\t\t\t\t\tconst hasSecondary = secondaryFilters.length\n\t\t\t\t\t\t? secondaryFilters.some(v => {\n\t\t\t\t\t\t\t\treturn p.filterList.includes(v);\n\t\t\t\t\t\t }) || hasPrimary\n\t\t\t\t\t\t: true;\n\t\t\t\t\tif (!hasSecondary) return filterList;\n\t\t\t\t\tif (primaryFilters.length) {\n\t\t\t\t\t\tconst productMaterials = p.filterList.filter(f =>\n\t\t\t\t\t\t\tf.includes(\"Material\"),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst productTypes = p.filterList.filter(f => f.includes(\"Type\"));\n\t\t\t\t\t\tconst prodHasMaterial = materialFilters.length\n\t\t\t\t\t\t\t? productMaterials.some(f => materialFilters.includes(f))\n\t\t\t\t\t\t\t: true;\n\t\t\t\t\t\tconst prodHasType = productTypes.some(f => typeFilters.includes(f));\n\t\t\t\t\t\tif (prodHasMaterial || prodHasType) {\n\t\t\t\t\t\t\treturn filterList.concat(p.filterList);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn filterList.concat(\n\t\t\t\t\t\t\t\tp.filterList.filter(f => f.includes(\"Material\")),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (secondaryFilters.length) {\n\t\t\t\t\t\tconst hasSecondary = p.filterList.some(f =>\n\t\t\t\t\t\t\tsecondaryFilters.includes(f),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn hasSecondary ? filterList.concat(p.filterList) : filterList;\n\t\t\t\t\t}\n\t\t\t\t\treturn filterList.concat(p.filterList);\n\t\t\t\t}, []),\n\t\t\t),\n\t\t);\n\t},\n\tfilterableProducts(state, getters) {\n\t\treturn state.products\n\t\t\t.map(p => {\n\n\t\t\t\tconst hasDiscount = p.variations && p.variations.some(v => (v.list_price && v.promotions));\n\t\t\t\treturn {\n\t\t\t\t\t...p,\n\t\t\t\t\tfilterList: p.properties.reduce((filterList, filter) => {\n\t\t\t\t\t\treturn filterList.concat(\n\t\t\t\t\t\t\tfilter.assignments.map(a => `${filter.label}:${a}`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t// adding 'Sale' | Discounts. Not an original property of the item \n\t\t\t\t\t\t.concat(\n\t\t\t\t\t\t\thasDiscount && filter.assignments.map(a => (filter.label === 'Type') ? `Sale:${a}` : null ),\n\t\t\t\t\t\t);\n\t\t\t\t\t}, [])\n\t\t\t\t\t.concat(hasDiscount && 'Sale:All Sale Items')\n\t\t\t\t\t.filter((a) => a),\n\t\t\t\t};\n\t\t\t})\n\t\t\t.filter(p => p.filterList.length > 0);\n\t},\n\n\tpropertyListSelectValues(state, getters) {\n\t\treturn Object.keys(getters.propertyList).reduce((acc, key) => {\n\t\t\treturn acc.concat(getters.propertyList[key].map(v => `${key}:${v}`));\n\t\t}, []);\n\t},\n\tpropertyList(state, getters) {\n\t\treturn getters.filterableProducts.reduce((properties, product) => {\n\t\t\tproduct.properties\n\t\t\t\t.filter(p => validProductProperties.includes(p.label))\n\t\t\t\t.forEach(p => {\n\t\t\t\t\tif (!(p.label in properties)) properties[p.label] = [];\n\t\t\t\t\tproperties[p.label] = Array.from(\n\t\t\t\t\t\tnew Set([...properties[p.label], ...p.assignments]),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t\t// adding 'Sale' | Discounts. Not an original property of the item \n\n\t\t\t\tconst hasDiscount = product.variations && product.variations.some(v => (v.list_price && v.promotions));\n\t\t\t\tif (hasDiscount) {\n\t\t\t\t\tproduct.filterList\n\t\t\t\t\t\t.forEach(p => {\n\t\t\t\t\t\tif (!('Sale' in properties)) properties['Sale'] = [];\n\t\t\t\t\t\tproperties['Sale'] = Array.from(\n\t\t\t\t\t\t\tnew Set([...properties['Sale'], (p.includes('Sale')) ? p.split(':')[1] : '' ]),\n\t\t\t\t\t\t).filter((a) => a);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\treturn properties;\n\t\t}, {});\n\t},\n\n\tpropertyListAvailableValues(state, getters) {\n\t\treturn Object.keys(getters.propertyListAvailable).reduce((acc, key) => {\n\t\t\treturn acc.concat(\n\t\t\t\tgetters.propertyListAvailable[key].map(v => `${key}:${v}`),\n\t\t\t);\n\t\t}, []);\n\t},\n\tpropertyListAvailable(state, getters) {\n\t\treturn getters.filteredProducts.reduce((properties, product) => {\n\t\t\tproduct.properties\n\t\t\t\t.filter(p => validProductProperties.includes(p.label))\n\t\t\t\t.forEach(p => {\n\t\t\t\t\tif (!(p.label in properties)) properties[p.label] = [];\n\t\t\t\t\tproperties[p.label] = Array.from(\n\t\t\t\t\t\tnew Set([...properties[p.label], ...p.assignments]),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\treturn properties;\n\t\t}, {});\n\t},\n\n\tqueryValues(state) {\n\t\tconst filters = state.selectedFilters.reduce((filterHash, curr) => {\n\t\t\tconst [type, ...val] = curr.split(\":\").map(e => encodeURIComponent(e));\n\t\t\tif (!(type in filterHash)) filterHash[type] = [];\n\t\t\tfilterHash[type].push(val);\n\t\t\treturn filterHash;\n\t\t}, {});\n\t\tlet qv = Object.keys(filters)\n\t\t\t.reduce((queryParts, key) => {\n\t\t\t\tqueryParts.push(`${key}=${filters[key].join(state.querySeparator)}`);\n\t\t\t\treturn queryParts;\n\t\t\t}, [])\n\t\t\t.join(\"&\");\n\t\treturn `${qv}${qv ? '&' : ''}page=${state.page}${state.navigatedProduct ? `&p=${state.navigatedProduct}`: ''}`;\n\t},\n\tgetColors(state) {\n\t\treturn state.colors;\n\t},\n\tgetQueryParams(state) {\n\t\treturn queryParams();\n\t},\n\tgetSelectedFilters(state) {\n\t\treturn state.selectedFilters;\n\t},\n\tgetPage(state) {\n\t\treturn state.page;\n\t},\n\tgetNavigatedProduct(state) {\n\t\treturn state.navigatedProduct;\n\t}\n};\n\nexport default Getters;\n","//http://lodgemfgode3.prod.acquia-sites.com/api/lodge/salesforce/products\n\nimport state from \"./state\";\nimport actions from \"./actions\";\nimport getters from \"./getters\";\nimport mutations from \"./mutations\";\n\n/**\n * @type {import(\"vuex\").Module}\n */\nconst Module = {\n\tnamespaced: true,\n\tstate,\n\tgetters,\n\tactions,\n\tmutations,\n};\n\nexport default Module;\n","import axios from \"axios\";\nimport {\n\tdomain as sfccDomain,\n\tcontrollerPath,\n} from \"../../../../lodge-vue/src/ocapi\";\nimport { Commit } from \"./mutations\";\n\n/**\n * @return {import(\"axios\").AxiosPromise}\n */\nfunction getProds() {\n\treturn axios.get(`${sfccDomain}${controllerPath}API-AllProducts`).then(r => ({\n\t\tstatus: r.status,\n\t\tdata: r.data,\n\t}));\n}\n/**\n * @type {import(\"vuex\").ActionTree}\n */\nconst Actions = {\n\tgetProducts({ commit }) {\n\t\tCommit.loadingState(commit, \"loading\");\n\t\tgetProds().then(r => {\n\t\t\tif (r.status == 200) {\n\t\t\t\tCommit.products(commit, r.data.products);\n\t\t\t\tCommit.colors(commit, r.data.colors);\n\t\t\t\tCommit.loadingState(commit, \"loaded\");\n\t\t\t} else {\n\t\t\t\tCommit.loadingState(commit, \"error\");\n\t\t\t}\n\t\t});\n\t},\n};\n\nexport default Actions;\n","import getters from \"./getters\";\nimport mutations from \"./mutations\";\nimport actions from \"./actions\";\nimport state from \"./state\";\n\nexport default {\n\tnamespaced: true,\n\tstate,\n\tactions,\n\tgetters,\n\tmutations,\n};\n","import { lodgeLocalStorage } from \"../../../classes/LodgeStorage\";\n\nexport default {\n\tfetchingData: false,\n\tproducts: [],\n\tloadingState: \"loading\",\n};\n","import axios from \"axios\";\nimport regeneratorRuntime from \"regenerator-runtime\";\nimport { gtmCustomEventPush, EVENTS } from \"../../../analytics\";\n\nexport default {};\n","export default {\n\tgetFetchingData(state) {\n\t\treturn state.fetchingData;\n\t},\n\tgetProducts(state) {\n\t\treturn state.products;\n\t},\n\tgetLoadingState(state) {\n\t\treturn state.loadingState;\n\t},\n};\n","import Vue from \"vue\";\n\nexport default {\n\tsetFetchingData(state, { fetchingData }) {\n\t\tstate.fetchingData = fetchingData;\n\t},\n\tsetProducts(state, { products }) {\n\t\tstate.products = products;\n\t},\n\tsetLoadingState(state, { loadingState }) {\n\t\tstate.loadingState = loadingState;\n\t},\n};\n","import { invertHash } from \"../../components/Wizard/utils\";\n\nconst lookupResults = ({\n\tflavorKey,\n\tcollection,\n\tservings,\n\tleftovers,\n\tanswers,\n}) => {\n\tconsole.log(\n\t\t`PWR LOOKUP INFO: ${flavorKey} ${collection}, ${servings}, ${leftovers}`,\n\t);\n\t// If on page 5 THEN:\n\t// 1. Get collection\n\t// console.log(\"PWR: Check flavor key\");\n\tlet _results = answers[flavorKey];\n\t// console.log(\"PWR: Post flavor key\", _results);\n\t// 2. If collection is an array, immediately return\n\t// TODO: Strip out items that the user already owns\n\t// console.log(\"PWR: Check for array\", _results);\n\tif (Array.isArray(_results)) return _results;\n\n\t// 3. Get serving sizes\n\t// console.log(\"PWR: Get servings\", servings, _results);\n\t_results = _results[servings];\n\n\t// console.log(\"results post servings\", _results);\n\t// 4A. If it's an array, do nothing here. If\n\t// it's an object, then add in the leftovers\n\t// console.log(\"PWR: Check leftovers\", leftovers);\n\tif (!Array.isArray(_results)) {\n\t\t// console.log(\"here we are\", _results[leftovers]);\n\t\t_results = _results[leftovers || \"leftovers\"];\n\t}\n\n\t// 5A. If a user owns a product, then replace it with the next size up or one of it's alternates\n\t// 5B. Check if next size up has leftovers and if not select immediately from array\n\t// TODO: Check against user owned products\n\t// console.log(\"PWR: Return results\", _results);\n\treturn _results;\n};\n\nconst checkForSuitableReplacement = ({\n\tflavorKey,\n\tcollection,\n\tservings,\n\tleftovers,\n\tanswers,\n\tproducts,\n\tidx,\n\tgivenProducts = null,\n}) => {\n\tlet replacementProds = [];\n\treplacementProds = lookupResults({\n\t\tcollection,\n\t\tservings,\n\t\tleftovers,\n\t\tflavorKey,\n\t\tanswers,\n\t});\n\t// console.log(\"prods\", products, \"replacement\", replacementProds);\n\tconst replacementProduct = products[replacementProds[idx]];\n\t// console.log(\n\t// \t\"[WIZ] replacement prod\",\n\t// \treplacementProduct,\n\t// \treplacementProds[idx],\n\t// );\n\tif (replacementProduct.available) {\n\t\treturn [replacementProds, replacementProds[idx]];\n\t}\n\treturn [replacementProds, null];\n};\n\nexport default {\n\tgetSkill(state) {\n\t\treturn state.skill;\n\t},\n\tgetCollection(state) {\n\t\treturn state.collection;\n\t},\n\tgetServings(state) {\n\t\tconst { servings } = state;\n\t\tif (servings === \"party\") return servings;\n\t\telse return parseInt(state.servings, 10);\n\t},\n\tgetServingsRaw(state) {\n\t\treturn state.servings;\n\t},\n\t// TODO: decide if it'd be easier to do this as one computed w/ param\n\t// but also decided it's worth having it cached\n\tgetFlavors(state) {\n\t\treturn state.flavors;\n\t},\n\tgetFlavorsB(state) {\n\t\treturn state.flavorsB;\n\t},\n\tgetFlavorsC(state) {\n\t\treturn state.flavorsC;\n\t},\n\tgetFlavorStatus(state) {\n\t\treturn (id) => {\n\t\t\treturn state.flavors.indexOf(id);\n\t\t};\n\t},\n\tgetFlavorTier(state) {\n\t\treturn state.flavorTier;\n\t},\n\tgetFlavorPictures(state) {\n\t\t// Return an empty bit\n\t\tif (!state.collection || !state.flavorPictures[state.collection])\n\t\t\treturn { 1: [], 2: [], 3: [] };\n\t\treturn state.flavorPictures[state.collection];\n\t},\n\tgetLeftovers(state) {\n\t\treturn state.leftovers;\n\t},\n\tgetActivePage(state) {\n\t\treturn state.activePage;\n\t},\n\tgetResults(state, getters) {\n\t\t// HOW TO GET RESULTS\n\t\t// If not on page 5, it doesn't matter and return []\n\t\tconsole.log(\"PWR: Check page\");\n\n\t\tconst { collection, servings, leftovers, answers } = state;\n\t\tconst flavorKey = getters.getFlavorValidation;\n\t\tconsole.log(\n\t\t\t\"PWR:\",\n\t\t\twindow.location.hash.indexOf(\"results\") < 0,\n\t\t\tstate.answersLoadingStatus.indexOf(\"LOADED\") < 0,\n\t\t\t!collection,\n\t\t\t!servings,\n\t\t\t!flavorKey,\n\t\t);\n\t\tconsole.log(\"PWR: on 56\");\n\t\tif (\n\t\t\twindow.location.hash.indexOf(\"results\") < 0 ||\n\t\t\tstate.answersLoadingStatus.indexOf(\"LOADED\") < 0 ||\n\t\t\t!collection ||\n\t\t\t!servings ||\n\t\t\t!flavorKey\n\t\t) {\n\t\t\treturn {};\n\t\t}\n\n\t\tlet _results = [];\n\t\t_results = lookupResults({\n\t\t\tcollection,\n\t\t\tservings,\n\t\t\tleftovers,\n\t\t\tflavorKey,\n\t\t\tanswers,\n\t\t});\n\n\t\tconst SERVING_SIZES = [\"1\", \"2\", \"3-4\", \"5-6\", \"party\"];\n\t\tconst CSI = SERVING_SIZES.indexOf(servings);\n\t\tconst checks = {\n\t\t\tup: null,\n\t\t\tdown: null,\n\t\t};\n\n\t\t_results = _results.map((sku, idx) => {\n\t\t\tconst product = state.products[sku];\n\t\t\tconsole.log(state.products[sku]);\n\t\t\tif (!product.available) {\n\t\t\t\tconsole.log(`${product.name} WAS NOT AVAILABLE, HERE WE GO.`);\n\t\t\t\t// BUSINESS LOGIC: Check for upsell first\n\t\t\t\tif (CSI < SERVING_SIZES.length - 1) {\n\t\t\t\t\tconsole.log(\"look up for replacement\");\n\t\t\t\t\tconst [upProds, upSku] = checkForSuitableReplacement({\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t\tservings: SERVING_SIZES[CSI + 1],\n\t\t\t\t\t\tleftovers,\n\t\t\t\t\t\tflavorKey,\n\t\t\t\t\t\tanswers,\n\t\t\t\t\t\tproducts: state.products,\n\t\t\t\t\t\tidx,\n\t\t\t\t\t\tgivenProducts: checks.up,\n\t\t\t\t\t});\n\t\t\t\t\tconsole.log(\"[wiz] 180\", upProds, upSku);\n\t\t\t\t\tif (upProds) checks.up = upProds;\n\t\t\t\t\tif (upSku) return upSku;\n\t\t\t\t}\n\n\t\t\t\t// BUSINESS LOGIC: Check down afterwards\n\t\t\t\tif (CSI > 0) {\n\t\t\t\t\tconsole.log(\"look down for replacement\");\n\t\t\t\t\tconst [downProds, downSku] = checkForSuitableReplacement({\n\t\t\t\t\t\tcollection,\n\t\t\t\t\t\tservings: SERVING_SIZES[CSI - 1],\n\t\t\t\t\t\tleftovers,\n\t\t\t\t\t\tflavorKey,\n\t\t\t\t\t\tanswers,\n\t\t\t\t\t\tproducts: state.products,\n\t\t\t\t\t\tidx,\n\t\t\t\t\t\tgivenProducts: checks.down,\n\t\t\t\t\t});\n\t\t\t\t\tif (downProds) checks.down = downProds;\n\t\t\t\t\tif (downSku) return downSku;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn sku;\n\t\t});\n\n\t\t// we have to see if we're going to be able to show results or not here\n\t\tconst filterUnavailable = _results.filter((p) => {\n\t\t\treturn state.products[p].available;\n\t\t});\n\t\tif (filterUnavailable.length) {\n\t\t\t// we have results to show\n\t\t\t_results = filterUnavailable;\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\t\"[WIZARD]: No results would have been available if they were all filtered\",\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\ttop: Object.assign({}, state.products[_results[0]], { sku: _results[0] }),\n\t\t\talternates: _results\n\t\t\t\t.slice(1, 3)\n\t\t\t\t.map((sku) => Object.assign({}, state.products[sku], { sku })),\n\t\t};\n\t},\n\tgetFinalSettings(state) {\n\t\treturn {\n\t\t\tsawResults: true,\n\t\t\tskill: state.skill,\n\t\t\tservings: state.servings,\n\t\t\tflavorKey: state.flavorKey,\n\t\t\tflavors: state.flavors,\n\t\t\tflavorsB: state.flavorsB,\n\t\t\tflavorsC: state.flavorsC,\n\t\t\tflavorTier: state.flavorTier,\n\t\t\tleftovers: state.leftovers,\n\t\t\tcollection: state.collection,\n\t\t};\n\t},\n\tgetSawResults(state) {\n\t\treturn state.sawResults;\n\t},\n\tgetFlavorsByTier: (state, getters) => (collection, tier) => {\n\t\tif (!collection || !tier) return [];\n\t\tif (\n\t\t\t!state.flavorPictures ||\n\t\t\t!state.flavorPictures[collection] ||\n\t\t\t!state.flavorPictures[collection][tier]\n\t\t) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst pictures = state.flavorPictures[collection][tier];\n\t\t// this is simple, just show whatever is inside of there currently\n\t\tif (collection == \"basic\" || (collection != \"basic\" && tier !== 3)) {\n\t\t\treturn pictures;\n\t\t}\n\n\t\tconst flavorsByType = getters.getFlavorsByType([\"flavorsB\"]).byType;\n\t\tconsole.log(getters, flavorsByType);\n\t\tconst invertedHash = invertHash(flavorsByType);\n\t\tconst sortedKeys = Object.keys(invertedHash).sort();\n\t\tconst highestValue = sortedKeys[sortedKeys.length - 1];\n\t\tconst typesArray = invertedHash[highestValue];\n\t\tconsole.log(typesArray, invertedHash, invertedHash[highestValue]);\n\t\tconst builtPicturesArray = [];\n\n\t\tfor (let i = 0; i < pictures.length; i++) {\n\t\t\tconst [type] = pictures[i].id.split(\"|\");\n\t\t\tif (typesArray.indexOf(type) >= 0) {\n\t\t\t\tbuiltPicturesArray.push(pictures[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn builtPicturesArray;\n\t},\n\tgetFlavorsByType: (state) => (tiers = []) => {\n\t\tlet total = 0;\n\t\tlet combinedTiers = [...state.flavors];\n\t\tconsole.log(state.flavors, state.flavorsB, state.flavorsC);\n\t\t// Do this so we only grab tiers as we actually need to look at them\n\t\tfor (let i = 0; i < tiers.length; i++) {\n\t\t\tconsole.log(state[tiers[i]]);\n\t\t\tcombinedTiers = combinedTiers.concat(state[tiers[i]]);\n\t\t}\n\t\tconsole.log(combinedTiers);\n\t\tconst byType = combinedTiers.reduce((acc, curr) => {\n\t\t\tconsole.log(curr);\n\t\t\tconst [type, typeId] = curr.split(\"|\");\n\t\t\ttotal++;\n\t\t\tif (acc[type]) acc[type] = acc[type] + 1;\n\t\t\telse acc[type] = 1;\n\t\t\treturn acc;\n\t\t}, {});\n\t\tconsole.log(`STATS:`, { byType, total });\n\t\treturn {\n\t\t\tbyType,\n\t\t\ttotal,\n\t\t};\n\t},\n\tgetAPIDataStatus(state) {\n\t\treturn {\n\t\t\tflavors: state.flavorPicturesLoaded,\n\t\t\tresults: state.answersLoadingStatus.indexOf(\"LOADED\") >= 0,\n\t\t};\n\t},\n\tgetFlavorValidation(state, getters /*{ flavorsByType, collection, tier }*/) {\n\t\tconsole.log(\"flavor validation!\");\n\t\tlet returnedKey = null;\n\t\tconst collection = state.collection;\n\t\tconsole.log(\"FV: 194\");\n\t\tif (!collection) return returnedKey;\n\t\tconst tier = state.flavorTier;\n\t\tconsole.log(\"FV: 197\");\n\t\tconst seenTiers = [];\n\t\tif (tier >= 2) seenTiers.push(\"flavorsB\");\n\t\tif (tier === 3) seenTiers.push(\"flavorsC\");\n\t\tconst flavorsByType = getters.getFlavorsByType(seenTiers);\n\n\t\tif (collection === \"basic\") {\n\t\t\tconsole.log(\"FV: basic\");\n\t\t\tconst percentages = {\n\t\t\t\t1: 80,\n\t\t\t\t2: 60,\n\t\t\t\t3: 51,\n\t\t\t};\n\n\t\t\tconst chosen = {\n\t\t\t\t1: 5,\n\t\t\t\t2: 3,\n\t\t\t\t3: 1,\n\t\t\t};\n\n\t\t\tconst percentage = percentages[tier] / 100;\n\t\t\tconst { byType } = flavorsByType;\n\t\t\tconst total = chosen[tier];\n\n\t\t\tconst _type = Object.keys(byType);\n\t\t\tfor (let i = 0; i < _type.length; i++) {\n\t\t\t\tconsole.log(\"FV: 222\");\n\t\t\t\tconsole.log(\n\t\t\t\t\t`FV: VALIDATION NUMBERS for ${_type[i]}`,\n\t\t\t\t\tbyType[_type[i]],\n\t\t\t\t\ttotal,\n\t\t\t\t\tbyType[_type[i]] / total,\n\t\t\t\t\tpercentage,\n\t\t\t\t);\n\t\t\t\tconsole.log(byType[_type[i]] / total >= percentage);\n\t\t\t\tif (byType[_type[i]] / total >= percentage) {\n\t\t\t\t\tconsole.log(_type[i]);\n\t\t\t\t\treturnedKey = _type[i];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.log(\"FV: 236\");\n\t\t\tconst invertedHash = invertHash(flavorsByType.byType);\n\t\t\tconst sortedKeys = Object.keys(invertedHash).sort();\n\t\t\tconst highestValue = sortedKeys[sortedKeys.length - 1];\n\t\t\tif (highestValue >= 4 && invertedHash[highestValue].length === 1)\n\t\t\t\treturn invertedHash[highestValue][0];\n\n\t\t\t// ADDED TO FIX LDG-690: if flavor related picking breaks, look here.\n\t\t\t// If they've gotten here and the highest one is still just a single item,\n\t\t\t// then we'll pick it because otherwise they'll get a single picture\n\t\t\tconsole.log(365, tier, invertedHash[highestValue]);\n\t\t\tif (tier === 2) {\n\t\t\t\tconst tierThreeFlavors = getters.getFlavorsByTier(collection, 3);\n\t\t\t\tif (tierThreeFlavors.length === 1) {\n\t\t\t\t\treturn tierThreeFlavors[0].id.split(\"|\")[0];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (tier == 3 && invertedHash[highestValue].length === 1)\n\t\t\t\treturn invertedHash[highestValue][0];\n\t\t}\n\n\t\treturn returnedKey;\n\t},\n\tgetUniqueKey(state, getters) {\n\t\treturn `${state.skill || \"No Skill\"}|${\n\t\t\tstate.collection || \"No Collection\"\n\t\t}|${getters.getFlavorValidation || \"No Flavor\"}|${\n\t\t\tstate.servings || \"No Servings\"\n\t\t}|${state.leftovers || \"No Leftovers\"}`;\n\t},\n};\n","export default {\n\tsetSkill(state, { skill }) {\n\t\tstate.skill = skill;\n\t},\n\tsetCollection(state, { collection }) {\n\t\tstate.collection = collection;\n\t},\n\tsetFlavors(state, { flavors, type }) {\n\t\tstate[type] = flavors;\n\t},\n\tsetFlavorKey(state, { flavorKey }) {\n\t\tstate.flavorKey = flavorKey;\n\t},\n\tsetFlavorTier(state, { tier }) {\n\t\tstate.flavorTier = tier;\n\t},\n\tsetServings(state, { servings }) {\n\t\tstate.servings = servings;\n\t},\n\tsetLeftovers(state, { leftovers }) {\n\t\tstate.leftovers = leftovers;\n\t},\n\tsetActivePage(state, { page }) {\n\t\tstate.activePage = page;\n\t},\n\tsetAnswers(state, { answers, products }) {\n\t\tstate.answers = answers;\n\t\tstate.products = products;\n\t},\n\tsetPictures(state, { pictures }) {\n\t\tstate.flavorPictures = pictures;\n\t\tstate.flavorPicturesLoaded = true;\n\t},\n\tsetAnswersLoadingStatus(state, { status }) {\n\t\tstate.answersLoadingStatus = status;\n\t},\n\trestart(state) {\n\t\tstate.skill = \"\";\n\t\tstate.sawResults = false;\n\t\tstate.activePage = 0;\n\t\tstate.collection = \"\";\n\t\tstate.flavorTier = 1;\n\t\tstate.flavorKey = \"\";\n\t\tstate.flavors = [];\n\t\tstate.flavorsB = [];\n\t\tstate.flavorsC = [];\n\t\tstate.servings = \"\";\n\t\tstate.leftovers = \"\";\n\t},\n\tsetBackButtonHash(state, { hash }) {\n\t\tstate.backButtonHash = hash;\n\t},\n};\n","import axios from \"axios\";\nimport { domain as sfccDomain } from \"../../../../lodge-vue/src/ocapi\";\nimport { lodgeSessionStorage } from \"../../../classes/LodgeStorage\";\n\nexport default {\n\tloadAnswerData({ commit }) {\n\t\t// commit(\"setAnswersLoadingS\ttatus\", { status: \"ANSWERS_LOADING\" });\n\t\tconst localAnswers = false; //lodgeSessionStorage.get(\"wizard-answers\");\n\t\tif (localAnswers) {\n\t\t\tcommit(\"setAnswersLoadingStatus\", {\n\t\t\t\tstatus: \"ANSWERS_LOADED_FROM_CACHE\",\n\t\t\t});\n\t\t\tcommit(\"setAnswers\", { answers: localAnswers });\n\t\t} else {\n\t\t\treturn axios\n\t\t\t\t.get(\n\t\t\t\t\t`${sfccDomain}/on/demandware.store/Sites-lodge-Site/default/API-ProductWizard?categoryId=product-wizard `,\n\t\t\t\t)\n\t\t\t\t.then((r) => r.data)\n\t\t\t\t.then((data) => {\n\t\t\t\t\tconsole.log(\"Wizard Data\", data);\n\t\t\t\t\tconst wizardData = {\n\t\t\t\t\t\tanswers: data.results.answers,\n\t\t\t\t\t\tproducts: data.results.products,\n\t\t\t\t\t};\n\t\t\t\t\t// lodgeSessionStorage.set(\"wizard-answers\", wizardData);\n\t\t\t\t\tcommit(\"setAnswers\", wizardData);\n\t\t\t\t\tcommit(\"setAnswersLoadingStatus\", {\n\t\t\t\t\t\tstatus: \"ANSWERS_LOADED_FROM_SF\",\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tconsole.error(err);\n\t\t\t\t\tcommit(\"setAnswersLoadingStatus\", { status: \"ANSWERS_FAILED\" });\n\t\t\t\t});\n\t\t}\n\t},\n\tloadPictureData({ commit }) {\n\t\t// commit(\"setPictures\", );\n\t\treturn axios\n\t\t\t.get(`/themes/custom/tombras/images/product-wizard/pictures.json`)\n\t\t\t.then((r) => r.data)\n\t\t\t.then((data) => {\n\t\t\t\tcommit(\"setPictures\", data);\n\t\t\t})\n\t\t\t.catch(e => {\n\t\t\t\tconsole.log(\"Error getting wizard pictures\", e);\n\t\t\t});\n\t},\n};\n","import { lodgeLocalStorage } from \"../../../classes/LodgeStorage\";\nconst oldState = lodgeLocalStorage.get(\"wizard\") || {};\nconsole.log(\"OLD STATE FOR WIZARD\", oldState);\nconst defaultState = {\n\tsawResults: false,\n\tactivePage: 0,\n\tskill: \"\",\n\tcollection: \"\",\n\tflavors: [],\n\tflavorsB: [],\n\tflavorsC: [],\n\tflavorTier: 1,\n\tflavorKey: \"\",\n\tservings: \"\",\n\tleftovers: \"\",\n\tanswersLoadingStatus: \"ANSWERS_LOADING\",\n\tanswers: {},\n\tproducts: {},\n\tflavorPictures: {},\n\tflavorPicturesLoaded: false,\n\tbackButtonHash: \"#product-wizard/close\",\n};\n\nexport default Object.assign({}, defaultState, oldState);\n","import getters from \"./getters\";\nimport mutations from \"./mutations\";\nimport actions from \"./actions\";\nimport state from \"./state\";\n\nexport default {\n\tnamespaced: true,\n\tstate,\n\tactions,\n\tgetters,\n\tmutations,\n};\n","import getters from \"./getters\";\nimport mutations from \"./mutations\";\nimport actions from \"./actions\";\nimport state from \"./state\";\n\nexport default {\n\tnamespaced: true,\n\tstate,\n\tactions,\n\tgetters,\n\tmutations,\n};\n","export default {\n\tactivePage: 1,\n\tquestionWithAnswers: {},\n\tcollectedAnswers: [],\n\tanswerGroup: {},\n\tbackButton: 1\n}","export default {\n\tsetActivePage({ commit }, data) {\n\t\tcommit(\"setActivePage\", data);\n\t},\n\tsetQuestionWithAnswers({ commit }, data) {\n\t\tcommit(\"setQuestionWithAnswers\", data);\n\t},\n\tsetCollectedAnswers({ commit }, data) {\n\t\tcommit(\"setCollectedAnswers\", data);\n\t},\n\tsetAnswerGroup({ commit }, data) {\n\t\tcommit(\"setAnswerGroup\", data);\n\t},\n\tsetBackButton({ commit }, data) {\n\t\tcommit(\"setBackButton\", data);\n\t},\n\trestart({ commit }) {\n\t\tcommit(\"restart\");\n\t},\n}","export default {\n\tgetActivePage(state) {\n\t\treturn state.activePage;\n\t},\n\tgetQuestionWithAnswers(state) {\n\t\treturn state.questionWithAnswers;\n\t},\n\tgetCollectedAnswers(state) {\n\t\treturn state.collectedAnswers;\n\t},\n\tgetAnswerGroup(state) {\n\t\treturn state.answerGroup;\n\t},\n\tgetBackButton(state) {\n\t\treturn state.backButton;\n\t}\n};\n","export default {\n\tsetActivePage(state, data) {\n\t\tstate.activePage = data.value;\n\t},\n\tsetQuestionWithAnswers(state, data) {\n\t\tstate.questionWithAnswers = data.value;\n\t},\n\tsetCollectedAnswers(state, data) {\n\t\tstate.collectedAnswers.splice((state.activePage - 1), 1, data.value);\n\t\t// state.collectedAnswers.push(data.value);\n\t},\n\tsetAnswerGroup(state, data) {\n\t\tstate.answerGroup = data.value;\n\t},\n\trestart(state) {\n\t\tstate.activePage = 1;\n\t\tstate.questionWithAnswers = {};\n\t\tstate.collectedAnswers = [];\n\t\tstate.answerGroup = {};\n\t\tstate.backButton = 1;\n\t},\n\tsetBackButton(state, data) {\n\t\tstate.backButton = data.value;\n\t},\n};\n","import dataModel from '../../components/ProductHelp/productHelpDataModel';\n\nexport default {\n\tgetAnswers(state) {\n\t\treturn state.issues[state.currentIssueId] && state.issues[state.currentIssueId].answers;\n\t},\n\tgetAnswer: (state) => (id) => {\n\t\treturn state.issues[state.currentIssueId].answers[id];\n\t},\n\tgetCurrentStep(state) {\n\t\treturn state.currentStep;\n\t},\n\tgetNextStep(state) {\n\t\treturn state.nextStep;\n\t},\n\tgetProducts(state) {\n\t\treturn state.products;\n\t},\n\tgetMaterialOptions(state) {\n\t\treturn state.materialOptions;\n\t},\n\tgetMaterial(state) {\n\t\treturn state.issues[state.currentIssueId].product\n\t\t\t&& state.materialOptions.find(m => {\n\t\t\t\treturn state.issues[state.currentIssueId].product.categories.includes(m);\n\t\t\t});\n\t},\n\tgetProductsLoadingStatus(state) {\n\t\treturn state.productsLoadingStatus;\n\t},\n\tgetOrderLoadingStatus(state) {\n\t\treturn state.orderLoadingStatus;\n\t},\n\tgetIssuesResponseLoadingStatus(state) {\n\t\treturn state.issuesResponseLoadingStatus;\n\t},\n\tgetOrder(state) {\n\t\treturn state.order;\n\t},\n\tgetUploadsComplete(state) {\n\t\treturn state.uploadsComplete;\n\t},\n\tgetIssue(state) {\n\t\treturn state.issues[state.currentIssueId];\n\t},\n\tgetCurrentIssueId(state) {\n\t\treturn state.currentIssueId;\n\t},\n\tgetRequest(state) {\n\t\treturn state.request;\n\t},\n\tgetIssueProduct(state) {\n\t\treturn state.issues[state.currentIssueId].product || {};\n\t},\n\tgetMissingParts(state) {\n\t\treturn state.issues[state.currentIssueId].missingParts;\n\t},\n\tgetNotes(state, { text }) {\n\t\treturn state.issues[state.currentIssueId].notes;\n\t},\n\tgetPath(state) {\n\t\treturn state.path;\n\t},\n\tgetAutoContinue(state) {\n\t\treturn state.currentStep\n\t\t\t&& dataModel.nodes[state.currentStep]\n\t\t\t&& dataModel.nodes[state.currentStep].meta\n\t\t\t&& dataModel.nodes[state.currentStep].meta.autoContinue;\n\t},\n\tgetBranch(state) {\n\t\treturn state.branch;\n\t},\n\tgetTree(state, { tree }) {\n\t\treturn state.tree;\n\t},\n\tgetCSRFToken(state) {\n\t\treturn state.csrfToken;\n\t},\n\tgetIssuesResponse(state) {\n\t\treturn state.issuesResponse;\n\t},\n\tgetFlowComplete(state) {\n\t\treturn state.flowComplete;\n\t},\n\tgetNextFocus(state) {\n\t\treturn state.nextFocus;\n\t},\n\tgetPrevIssues(state) {\n\t\t// TODO fix going back from the start of a new round to the end of previous round\n\t\t// currentIssue Id is incrementing incorrectly\n\t\tconst indices = state.currentIssueId - 2 >= 0 && Array.from(new Array(state.currentIssueId - 1));\n\t\tconsole.log(\"indices\", indices, state.currentIssueId, state.request.issues);\n\t\treturn indices\n\t\t\t? indices.map((v, i) => state.request.issues[i])\n\t\t\t: [];\n\n\t},\n\tgetResolvedFlag(state) {\n\t\treturn state.resolvedFlag;\n\t},\n\tgetRequestedRemedies(state) {\n\t\treturn state.request.issues.map(i => i.requestedRemedy);\n\t}\n};\n","export default {\n\tcsrfToken: \"\",\n\tcaptchaToken: \"\",\n\tuploadsComplete: true,\n\tnextStep: \"\",\n\tcurrentStep: \"\",\n\tproducts: [],\n\tmaterialOptions: [\n\t\t\"Seasoned Cast Iron\",\n\t\t\"Carbon Steel\",\n\t\t\"Enameled Cast Iron\",\n\t\t\"Accessories\"\n\t],\n\torder: {\n\t\torderCreationDate: \"\",\n\t\torderNumber: \"\",\n\t\torderEmail: \"\",\n\t\torderPhone: \"\",\n\t\torderName: \"\",\n\t\torderAddress1: \"\",\n\t\torderAddress2: \"\",\n\t\torderCity: \"\",\n\t\torderState: \"\",\n\t\torderZip: \"\",\n\t\torderCountry: \"\",\n\t\tpurchaseLocation: \"\",\n\t\tgift: false,\n\t\tproducts: []\n\t},\n\tproductsLoadingStatus: \"PRODUCTS_LOADING\",\n\torderLoadingStatus: \"\",\n\tissuesResponseLoadingStatus: \"RESPONSE_LOADING\",\n\tcurrentIssueId: 0,\n\tissues: {},\n\tpath: [],\n\ttree: {},\n\tbranch: {},\n\t// request: {},\n\tissueTemplate: {\n\t\trequestNumber: 0,\n\t\tcaseRecordType: \"\",\n\t\ttype: \"\",\n\t\tsubType: \"\",\n\t\trequestedRemedy: \"\",\n\t\tremedyAmount: \"\",\n\t\tphotos: [],\n\t\tproduct: {\n\t\t\t\"sku\": \"\",\n\t\t\t\"quantity\": 0,\n\t\t\t\"material\": \"\",\n\t\t\t\"damagedBox\": \"\",\n\t\t\t\"used\": \"\",\n\t\t\t\"unitPrice\": \"\"\n\t\t},\n\t\tmissingParts: \"\",\n\t\tanswers: {},\n\t\tnotes: \"\",\n\t\tresolvedFlag: false,\n\t},\n\trequest: {\n\t\t\"captchaToken\": \"\",\n\t\t\"name\": \"\",\n\t\t\"email\": \"\",\n\t\t\"phone\": \"\",\n\t\t\"address1\": \"\",\n\t\t\"address2\": \"\",\n\t\t\"city\": \"\",\n\t\t\"state\": \"\",\n\t\t\"zipcode\": \"\",\n\t\t\"country\": \"\",\n\t\t\"updateContact\": false,\n\t\t\"order\": {\n\t\t\t\"orderNumber\": \"\",\n\t\t\t\"orderEmail\": \"\",\n\t\t\t\"orderPhone\": \"\",\n\t\t\t\"orderName\": \"\",\n\t\t\t\"orderAddress1\": \"\",\n\t\t\t\"orderAddress2\": \"\",\n\t\t\t\"orderCity\": \"\",\n\t\t\t\"orderState\": \"\",\n\t\t\t\"orderZip\": \"\",\n\t\t\t\"orderCountry\": \"\",\n\t\t\t\"purchaseLocation\": \"\",\n\t\t\t\"gift\": false,\n\t\t},\n\t\t\"issues\": [\n\t\t\t{\n\t\t\t\t\"requestNumber\": 0,\n\t\t\t\t\"caseRecordType\": \"\",\n\t\t\t\t\"type\": \"\",\n\t\t\t\t\"subType\": \"\",\n\t\t\t\t\"requestedRemedy\": \"\",\n\t\t\t\t\"remedyAmount\": \"\",\n\t\t\t\t\"photos\": [],\n\t\t\t\t\"product\": {\n\t\t\t\t\t\"sku\": \"\",\n\t\t\t\t\t\"quantity\": 0,\n\t\t\t\t\t\"material\": \"\",\n\t\t\t\t\t\"damagedBox\": \"\",\n\t\t\t\t\t\"used\": \"\",\n\t\t\t\t},\n\t\t\t\t\"notes\": \"\",\n\t\t\t\t\"resolvedFlag\": false,\n\t\t\t},\n\t\t],\n\t},\n\tissuesResponse: null,\n\tflowComplete: false,\n\tnextFocus: false,\n\tresolvedFlag: false\n};\n","import Vue from \"vue\";\nimport dataModel from '../../components/ProductHelp/productHelpDataModel';\nimport initState from \"./state\";\n\nconst freshState = JSON.parse(JSON.stringify(initState));\n\nexport default {\n\temptyState(state) {\n\t\tObject.assign(state, freshState);\n\t},\n\tsetUndoPoint() {\n\t\t// only here to have a mutation to go back to\n\t},\n\tsetAnswer(state, { id, answer }) {\n\t\t// has to be done this way for reactivity in multi-node component to work\n\t\t// can't use Vue.set\n\t\tstate.issues[state.currentIssueId].answers = {\n\t\t\t...state.issues[state.currentIssueId].answers,\n\t\t\t[id]: answer,\n\t\t};\n\t},\n\tremoveAnswer(state, { id }) {\n\t\tdelete state.issues[state.currentIssueId].answers[id];\n\t},\n\tsetRemedy(state, { id, remedy }) {\n\t\tstate.issues[state.currentIssueId].requestedRemedy = remedy;\n\t},\n\tsetGift(state, { gift }) {\n\t\tconsole.log(\"gift\", gift);\n\t\tstate.order.gift = gift;\n\t},\n\tsetCurrentStep(state, { step }) {\n\t\tstate.currentStep = step;\n\t},\n\tsetNextStep(state, { step }) {\n\t\tstate.nextStep = step;\n\t},\n\tsetFollowingStep(state) {\n\t\tlet key = Object.keys(state.branch.children)[0];\n\t\tstate.nextStep = state.branch.children[key].node;\n\t},\n\tunsetNextStep(state) {\n\t\tstate.nextStep = \"\";\n\t},\n\tsetProducts(state, { products }) {\n\t\tstate.products = products;\n\t},\n\tsetProductsLoadingStatus(state, { status }) {\n\t\tstate.productsLoadingStatus = status;\n\t},\n\tsetOrderLoadingStatus(state, { status }) {\n\t\tstate.orderLoadingStatus = status;\n\t},\n\tsetIssuesResponseLoadingStatus(state, { status }) {\n\t\tstate.issuesResponseLoadingStatus = status;\n\t},\n\tsetOrder(state, { order }) {\n\t\tstate.order = Object.assign(state.order, order);\n\t},\n\tremoveOrder(state) {\n\t\tstate.order = JSON.parse(JSON.stringify(freshState.order));\n\t},\n\tcreateIssue(state, { id }) {\n\t\tlet issue = JSON.parse(JSON.stringify(state.issueTemplate));\n\t\tissue.requestNumber = id;\n\t\tVue.set(state.issues, id, issue);\n\t\tstate.currentIssueId = id;\n\t},\n\tsetCurrentIssueId(state, { id }) {\n\t\tstate.currentIssueId = id;\n\t},\n\taddIssuePhotos(state, { photos }) {\n\t\tstate.issues[state.currentIssueId].photos = state.issues[state.currentIssueId].photos.concat(photos);\n\t},\n\tremoveIssuePhotos(state, { photos }) {\n\t\tstate.issues[state.currentIssueId].photos = state.issues[state.currentIssueId].photos.filter(p => {\n\t\t\treturn !photos.includes(p);\n\t\t});\n\t},\n\tsetIssuePhotos(state, { photos }) {\n\t\tstate.issues[state.currentIssueId].photos = photos;\n\t},\n\tsetIssueProduct(state, { product, quantity }) {\n\t\tstate.issues[state.currentIssueId].product = product;\n\t\tstate.issues[state.currentIssueId].product.quantity = quantity || 1;\n\t},\n\tunsetIssueProduct(state) {\n\t\tconst freshState = JSON.parse(JSON.stringify(initState));\n\t\tstate.issues[state.currentIssueId].product = freshState.issueTemplate.product;\n\t},\n\tupdateMissingParts(state, { parts }) {\n\t\tstate.issues[state.currentIssueId].missingParts = parts;\n\t},\n\tsetNotes(state, { text }) {\n\t\tstate.issues[state.currentIssueId].notes = text;\n\t},\n\tsetUploadsComplete(state, complete) {\n\t\tstate.uploadsComplete = complete;\n\t},\n\taddPathStep(state, { step, tree }) {\n\t\tstate.path = [...state.path, step];\n\t\tstate.branch = state.path.reduce((tree, step) => {\n\t\t\treturn tree.children[step];\n\t\t}, tree);\n\t},\n\tremovePathStep(state, { tree }) {\n\t\t// remove the answer for the step being removed\n\t\tlet answers = state.issues[state.currentIssueId].answers;\n\t\tanswers[state.currentStep] && (answers[state.currentStep].repeatUndone || !answers[state.currentStep].repeat) && (delete answers[state.currentStep]);\n\n\t\t// handle removing multi-node answers\n\t\tlet node = state.path.reduce((tree, step) => {\n\t\t\treturn tree.children[step];\n\t\t}, tree).node;\n\t\tif (dataModel.nodes[node].type === \"multi-node\") {\n\t\t\tdataModel.nodes[node].nodes.forEach(answer => {\n\t\t\t\tdelete answers[answer];\n\t\t\t});\n\t\t}\n\t\t// handle removing the product...\n\t\tif (state.currentStep === \"which-product\") {\n\t\t\tstate.issues[state.currentIssueId].answers[\"material\"] && (delete state.issues[state.currentIssueId].answers[\"material\"]);\n\t\t\tstate.issues[state.currentIssueId].product = \"\";\n\t\t}\n\t\t// trim the path\n\t\tstate.path = state.path.slice(0, -1);\n\t\t// reset the branch\n\t\tstate.branch = state.path.reduce((tree, step) => {\n\t\t\treturn tree.children[step];\n\t\t}, tree);\n\t},\n\tsetCSRFToken(state, { csrfToken }) {\n\t\tstate.csrfToken = csrfToken;\n\t},\n\tupdateRequest(state) {\n\t\t// modify the state.request object\n\n\t\t// deep clone the issues\n\t\tlet issues = JSON.parse(JSON.stringify(state.issues));\n\t\tstate.request.order = JSON.parse(JSON.stringify(state.order));\n\t\tdelete state.request.order.products;\n\n\t\tstate.request.issues = Object.keys(issues).map(issueKey => {\n\t\t\tlet issue = issues[issueKey];\n\n\t\t\tlet concerns = dataModel.concerns.filter(concern => {\n\t\t\t\tif (!concern.type) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn Object.keys(concern.meta)\n\t\t\t\t\t.every(key => {\n\t\t\t\t\t\tif (issue.answers[key] !== undefined) {\n\t\t\t\t\t\t\tlet answer = typeof issue.answers[key] === \"string\"\n\t\t\t\t\t\t\t\t? issue.answers[key]\n\t\t\t\t\t\t\t\t: issue.answers[key].value || issue.answers[key].id;\n\t\t\t\t\t\t\treturn concern.meta[key].includes(\"Any\") || concern.meta[key].includes(answer);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t});\n\t\t\t// TODO if there are no matches pick a default\n\t\t\tlet concern = concerns.reduce((acc, curr) => curr, {});\n\n\t\t\tconsole.log(\"concern for submission\", concern);\n\t\t\t// compile answers into notes field\n\t\t\tlet additionalNotes = Object.keys(issue.answers).filter(key => {\n\t\t\t\treturn (typeof issue.answers[key] === \"object\")\n\t\t\t\t\t&& issue.answers[key].addToNotes;\n\t\t\t}).map(key => {\n\t\t\t\treturn `${dataModel.nodes[key].label}: ${issue.answers[key].text}`;\n\t\t\t}).join(\"\\n\\n\");\n\n\t\t\tissue.notes = `Comments: ${issue.notes} \\n\\n ${additionalNotes}`;\n\t\t\tconst dropped = issue.answers.dropped && issue.answers.dropped.value === \"yes\";\n\n\t\t\tissue.resolvedFlag = dropped ? true : issue.resolvedFlag;\n\n\t\t\tconst hasResponse = (typeof concern.finalResponse === \"object\"\n\t\t\t\t\t? (dropped ? !!concern.finalResponse.dropped : !!concern.finalResponse.default)\n\t\t\t\t\t: concern.hasResponse === \"yes\");\n\n\t\t\tconst response = typeof concern.finalResponse === \"object\"\n\t\t\t\t? (dropped ? concern.finalResponse.dropped : concern.finalResponse.default)\n\t\t\t\t: concern.finalResponse || (hasResponse ? concern.response : \"\");\n\n\t\t\tconst raResponse = concern.RAResponse;\n\t\t\tconst material = issue.answers.material === \"\"\n\t\t\t\t? \"Accessories\"\n\t\t\t\t: issue.answers.material;\n\n\t\t\tconst type = typeof concern.type === \"string\"\n\t\t\t\t? concern.type\n\t\t\t\t: concern.type[material] || material;\n\n\t\t\tconst cause = typeof concern.cause === \"object\"\n\t\t\t\t? (dropped ? concern.cause.dropped : concern.cause.default)\n\t\t\t\t: concern.cause;\n\n\t\t\tif (issue.answers[\"purchased-from\"]) {\n\t\t\t\tissue.purchaseLocation = issue.answers[\"purchased-from\"].text;\n\t\t\t}\n\n\t\t\tissue.used = issue.answers[\"used\"].value === \"yes\";\n\t\t\tissue.damaged = issue.answers[\"damaged\"].value === \"yes\";\n\n\t\t\tissue.caseRecordType = concern.caseRecordType.trim();\n\t\t\t// this is the concern label\n\t\t\tissue.concern = concern.id;\n\t\t\tissue.type = type.trim();\n\t\t\tissue.subType = concern.subType.trim();\n\t\t\tissue.hasResponse = hasResponse;\n\t\t\tissue.response = response;\n\t\t\tissue.raResponse = raResponse;\n\t\t\tissue.cause = cause.trim();\n\n\t\t\t// for refunds get product value if there is an order\n\t\t\t// TODO until we have a proper algorithm to determine refund amount we are not going to send it\n\t\t\t// if (issue.requestedRemedy === \"refund\" && state.request.order.orderNumber) {\n\t\t\t// \tissue.remedyAmount = issue.product.unitPrice * issue.product.quantity;\n\t\t\t// }\n\n\t\t\t// set a default remedy of help for all issues\n\t\t\t// that don't have a specific remedy and are not resolved\n\t\t\t// e.g. customer still wants help for an issue with standard response\n\t\t\tif (concern.meta.requestedRemedy) {\n\t\t\t\tissue.requestedRemedy = concern.meta.requestedRemedy\n\t\t\t} else if (!issue.resolvedFlag && !issue.requestedRemedy) {\n\t\t\t\tissue.requestedRemedy = \"help\";\n\t\t\t} else if (issue.resolvedFlag || !issue.requestedRemedy) {\n\t\t\t\tissue.requestedRemedy = \"none\";\n\t\t\t}\n\n\t\t\t// remove answers for clarity\n\t\t\tdelete issue.answers;\n\t\t\t// remove accessories from product for clarity\n\t\t\tdelete issue.product.parts;\n\t\t\treturn issue;\n\t\t});\n\t\tstate.request.captchaToken = state.captchaToken;\n\t\t// contact information is set by setContactInformation\n\n\t},\n\tsetIssuesResponse(state, { response }) {\n\t\tstate.issuesResponse = response;\n\t},\n\tsetContactInformation(state, {\n\t\tname,\n\t\taddress1,\n\t\taddress2,\n\t\tcity,\n\t\tstate: st,\n\t\tzip,\n\t\tcountry,\n\t\temail,\n\t\tphone,\n\t\tupdateContact,\n\t}) {\n\t\tstate.request.name = name;\n\t\tstate.request.address1 = address1;\n\t\tstate.request.address2 = address2;\n\t\tstate.request.city = city;\n\t\tstate.request.state = st;\n\t\tstate.request.zipcode = zip;\n\t\tstate.request.country = country;\n\t\tstate.request.email = email;\n\t\tstate.request.phone = phone;\n\t\tstate.request.updateContact = updateContact;\n\t},\n\tsetTree(state, { tree }) {\n\t\tstate.tree = tree;\n\t},\n\tresetFlow(state) {\n\t\tstate.currentStep = Object.keys(state.tree.children)[0];\n\t\tstate.path = [state.currentStep];\n\t\tstate.branch = state.path.reduce((tree, step) => {\n\t\t\treturn tree.children[step];\n\t\t}, state.tree);\n\t},\n\tsetFlowComplete(state) {\n\t\tstate.flowComplete = true;\n\t},\n\tsetNextFocus(state, { focus }) {\n\t\tstate.nextFocus = focus;\n\t},\n\tsetResolvedFlag(state, { resolved }) {\n\t\tstate.issues[state.currentIssueId].resolvedFlag = resolved;\n\t}\n};\n","import axios from \"axios\";\nimport { domain as sfccDomain, ocapiClientId } from \"../../../../lodge-vue/src/ocapi\";\nimport dataModel from '../../components/ProductHelp/productHelpDataModel';\n\nconst loadProducts = ({ commit }) => {\n\tcommit(\"setProductsLoadingStatus\", { status: \"PRODUCTS_LOADING\" });\n\treturn axios\n\t\t.get(\n\t\t\t`${sfccDomain}/on/demandware.store/Sites-lodge-Site/default/API-ProductHelpProductsList`,\n\t\t)\n\t\t.then((r) => r.data)\n\t\t.then((data) => {\n\t\t\tconsole.log(data);\n\t\t\tconst products = data.products;\n\t\t\tcommit(\"setProducts\", { products });\n\t\t\tcommit(\"setProductsLoadingStatus\", { status: \"PRODUCTS_LOADED\" });\n\t\t})\n\t\t.catch((err) => {\n\t\t\tconsole.error(err);\n\t\t\tcommit(\"setProductsLoadingStatus\", { status: \"PRODUCTS_FAILED\" });\n\t\t});\n};\n\nconst getOrder = ({ commit }, { orderNumber, email, zip, csrfToken }) => {\n\tcommit(\"setOrderLoadingStatus\", { status: \"ORDER_LOADING\" });\n\treturn axios\n\t\t.get(\n\t\t\t`${sfccDomain}/on/demandware.store/Sites-lodge-Site/default/API-OrderDetails?orderEmail=${email}&orderPostal=${zip}&orderNumber=${orderNumber}&csrf_token=${csrfToken}`,\n\t\t)\n\t\t.then((r) => r.data)\n\t\t.then((data) => {\n\t\t\tconsole.log(data);\n\t\t\tconst order = data.order;\n\t\t\tcommit(\"setOrder\", { order });\n\t\t\tcommit(\"setOrderLoadingStatus\", { status: \"ORDER_LOADED\" });\n\t\t\treturn data;\n\t\t})\n\t\t.catch((err) => {\n\t\t\tconsole.error(err);\n\t\t\tcommit(\"setOrderLoadingStatus\", { status: \"ORDER_FAILED\" });\n\t\t\treturn error;\n\t\t});\n};\n\nconst submitIssues = ({ commit }, { request, csrfToken }) => {\n\tcommit(\"setIssuesResponseLoadingStatus\", { status: \"RESPONSE_LOADING\" });\n\treturn axios\n\t\t.post(\n\t\t\t`${sfccDomain}/on/demandware.store/Sites-lodge-Site/default/API-ProductHelpCaseSubmit?csrf_token=${csrfToken}`,\n\t\t\trequest\n\t\t)\n\t\t.then((r) => r.data)\n\t\t.then((data) => {\n\t\t\tconsole.log(data);\n\t\t\tcommit(\"setIssuesResponse\", {\n\t\t\t\tresponse: data.data.requests\n\t\t\t});\n\t\t\tcommit(\"setIssuesResponseLoadingStatus\", { status: \"RESPONSE_LOADED\" });\n\t\t})\n\t\t.catch((err) => {\n\t\t\tconsole.error(err);\n\t\t\tcommit(\"setIssuesResponse\", {\n\t\t\t\tresponse: [{\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\terror: true\n\t\t\t\t}]\n\t\t\t});\n\t\t\tcommit(\"setIssuesResponseLoadingStatus\", { status: \"RESPONSE_FAILED\" });\n\t\t});\n};\n\nexport default {\n\tloadProducts,\n\tgetOrder,\n\tsubmitIssues,\n};\n","import getters from \"./getters\";\nimport mutations from \"./mutations\";\nimport actions from \"./actions\";\nimport state from \"./state\";\n\nexport default {\n\tnamespaced: true,\n\tstate,\n\tactions,\n\tgetters,\n\tmutations,\n};\n","//http://lodgemfgode3.prod.acquia-sites.com/api/lodge/salesforce/products\n\nimport { queryParams } from \"../../../utils.js\";\nimport { validProductProperties } from \"../../../utils.js\";\nfunction validFilterKey(key) {\n\treturn validProductProperties.includes(key);\n}\n\n/**\n * @type {RecipeListingState}\n */\nlet qp = queryParams();\nconst State = {\n\tloadingState: \"idle\",\n\trecipes: [],\n\tfilterText: (qp && qp[\"text\"]) || \"\",\n\tpageMax: 18,\n\tquerySeparator: \"|\",\n\tpage: (qp && qp[\"page\"] && parseInt(qp[\"page\"], 10)) || 1,\n\tnavigatedRecipe: (qp && qp[\"r\"]) || \"\",\n\trecipeTotal: 0\n};\n\nexport default State;\n","//http://lodgemfgode3.prod.acquia-sites.com/api/lodge/salesforce/products\n\n/**\n * @type {import(\"vuex\").MutationTree}\n */\nconst Mutations = {\n\t/**\n\t * @param {Product[]} payload\n\t */\n\trecipes(state, {recipes, total}) {\n\t\tstate.recipes = recipes;\n\t\tstate.recipeTotal = total;\n\t},\n\t/**\n\t * @param {LoadingState} payload\n\t */\n\tloadingState(state, payload) {\n\t\tstate.loadingState = payload;\n\t},\n\n\tsetFilterText(state, payload) {\n\t\tstate.filterText = payload.text;\n\t\tstate.recipes = [];\n\t\tstate.navigatedRecipe = \"\";\n\t},\n\n\t/**\n\t *\n\t * @param {String[]} payload\n\t */\n\tclearFilters(state) {\n\t\tstate.filterText = \"\";\n\t},\n\tincrementPage(state) {\n\t\tstate.page = state.page + 1;\n\t},\n\tsetPage(state, payload) {\n\t\tstate.page = payload;\n\t},\n\tresetPage(state) {\n\t\tstate.page = 1;\n\t},\n\tsetNavigatedRecipe(state, payload ) {\n\t\tstate.navigatedRecipe = payload;\n\t}\n};\n\nexport default Mutations;\nexport const Commit = {\n\t/**\n\t *\n\t * @param {import(\"vuex\").Commit} commit\n\t * @param {Recipe[]} payload\n\t */\n\trecipes(commit, payload) {\n\t\tcommit(\"recipes\", payload);\n\t},\n\t/**\n\t *\n\t * @param {import(\"vuex\").Commit} commit\n\t * @param {LoadingState} payload\n\t */\n\tloadingState(commit, payload) {\n\t\tcommit(\"loadingState\", payload);\n\t},\n\n\t/**\n\t * @param {import(\"vuex\").Commit} commit\n\t */\n\tincrementPage(commit) {\n\t\tcommit(\"incrementPage\");\n\t}\n};\n","//http://lodgemfgode3.prod.acquia-sites.com/api/lodge/salesforce/products\n\nimport state from \"./state\";\nimport actions from \"./actions\";\nimport getters from \"./getters\";\nimport mutations from \"./mutations\";\n\n/**\n * @type {import(\"vuex\").Module}\n */\nconst Module = {\n\tnamespaced: true,\n\tstate,\n\tgetters,\n\tactions,\n\tmutations,\n};\n\nexport default Module;\n","//http://lodgemfgode3.prod.acquia-sites.com/api/lodge/salesforce/products\nimport { queryParams } from \"../../../utils\";\n\n\nconst Getters = {\n\tqueryValues(state) {\n\t\treturn `text=${state.filterText}&page=${state.page}${state.navigatedRecipe ? `&r=${state.navigatedRecipe}`: ''}`;\n\t},\n\tgetColors(state) {\n\t\treturn state.colors;\n\t},\n\tgetQueryParams(state) {\n\t\treturn queryParams();\n\t},\n\tgetSelectedFilters(state) {\n\t\treturn state.selectedFilters;\n\t},\n\tgetPage(state) {\n\t\treturn state.page;\n\t},\n\tgetNavigatedRecipe(state) {\n\t\treturn state.navigatedRecipe;\n\t},\n\tgetRecipes(state) {\n\t\treturn state.recipes;\n\t},\n\tgetLoadingState(state) {\n\t\treturn state.loadingState;\n\t},\n\tgetFilterText(state) {\n\t\treturn state.filterText;\n\t}\n};\n\nexport default Getters;\n","import axios from \"axios\";\nimport { Commit } from \"./mutations\";\n\n/**\n * @return {import(\"axios\").AxiosPromise}\n */\nfunction getRecipes(filterText, page, pageMax) {\n\tconst filters = `${filterText ? `&keyword_search=${filterText}`: ''}`;\n\treturn axios.get(`/lodge-content-api/recipes?page_max=${pageMax}&page_offset=${page - 1}${filters}`)\n\t\t.then(r => ({\n\t\t\tstatus: r.status,\n\t\t\tdata: r.data.data.nodes,\n\t\t\ttotal: parseInt(r.data.data.total, 10)\n\t\t}));\n}\n\n/**\n * @type {import(\"vuex\").ActionTree}\n */\nconst Actions = {\n\tgetRecipes({ commit, state }, { addToList = false } = {}) {\n\t\tCommit.loadingState(commit, \"loading\");\n\t\tlet page = state.page;\n\t\tlet max = state.pageMax;\n\t\t// if there are no recipes yet fill up the results\n\t\t// with state.page's worth of recipes in one request\n\t\tif (state.recipes.length === 0) {\n\t\t\tpage = 1;\n\t\t\tmax = state.pageMax * state.page;\n\t\t}\n\t\tgetRecipes(state.filterText, page, max).then(r => {\n\t\t\tif (r.status == 200) {\n\t\t\t\tconsole.log(\"get recipes\", r);\n\t\t\t\tif (addToList) {\n\t\t\t\t\tCommit.recipes(commit, {\n\t\t\t\t\t\trecipes: state.recipes.concat(r.data),\n\t\t\t\t\t\ttotal: r.total\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tCommit.recipes(commit, {\n\t\t\t\t\t\trecipes: r.data,\n\t\t\t\t\t\ttotal: r.total\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tCommit.loadingState(commit, \"loaded\");\n\t\t\t} else {\n\t\t\t\tCommit.loadingState(commit, \"error\");\n\t\t\t}\n\t\t});\n\t},\n};\n\nexport default Actions;\n","import Vue from \"vue\";\nimport Vuex from \"vuex\";\nimport { Basket } from \"../types\";\nimport { accountState } from \"@/store/account/types\";\n\nimport likes from \"./../../../js/vue/store/likes.js\";\nimport productDetail from \"./../../../js/vue/store/product-detail/index.js\";\nimport productListing from \"./../../../js/vue/store/product-listing/index.js\";\nimport productCard from \"./../../../js/vue/store/product-card/index.js\";\nimport wizard from \"./../../../js/vue/store/wizard/index.js\";\nimport productWizard from \"./../../../js/vue/store/product-wizard/index.js\";\nimport productHelp from \"./../../../js/vue/store/product-help/index.js\";\nimport recipeListing from \"./../../../js/vue/store/recipe-listing/index.js\";\n\nexport interface State {\n\taccountModule: accountState;\n\tbasket: Basket;\n\tjwt: string;\n\tfoo: string;\n}\n\nVue.use(Vuex);\n\nconst store = new Vuex.Store({\n\tstrict: process.env.NODE_ENV !== \"production\",\n});\n\nstore.registerModule(\"likes\", likes, { preserveState: false });\nstore.registerModule(\"productDetail\", productDetail, { preserveState: false });\nstore.registerModule(\"productListing\", productListing, {\n\tpreserveState: false,\n});\nstore.registerModule(\"productCard\", productCard, {\n\tpreserveState: false,\n});\nstore.registerModule(\"wizard\", wizard, {\n\tpreserveState: false,\n});\nstore.registerModule(\"productWizard\", productWizard, {\n\tpreserveState: false,\n});\nstore.registerModule(\"productHelp\", productHelp, {\n\tpreserveState: false,\n});\nstore.registerModule(\"recipeListing\", recipeListing, {\n\tpreserveState: false,\n});\nexport default store;\n","export default {\n\tnamespaced: true,\n\tstate: {\n\t\tlikedIDs: [],\n\t\tloggedIn: true,\n\t},\n\tmutations: {\n\t\t// need to make a mutation to remove from like\n\t\t// need to make a mutation to add from like\n\t\t// login\n\t\t// logout\n\t},\n\tactions: {\n\t\t// 1. need to make an action to send off the JSON request\n\t\t// that will then call the mutation\n\t\t// maybe need to save failures in localStorage\n\t\t// and retry again on next page load / next request?\n\t\t// 2. login stuff\n\t\t// utilize whatever Andre has for carting, probably?\n\t},\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = function(module) {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: function() {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","import Vue from \"vue\";\nimport Vuex from \"vuex\";\nimport VuexUndoRedo from './vuex-undo-redo';\n\n// import likes from \"./likes\";\n// import productDetail from \"./product-detail/index.js\";\n// import productListing from \"./product-listing/index.js\";\n\nVue.use(Vuex);\nVue.use(VuexUndoRedo, {\n\tmodule: \"productHelp\",\n\tundoDelimiter: \"setUndoPoint\"\n})\n// export const store = new Vuex.Store({\n// \tmodules: {\n// \t\tlikes,\n// \t\tproductDetail,\n// \t\tproductListing,\n// \t},\n// });\n\nimport s from \"../../../lodge-vue/src/store/index.ts\";\nexport const store = s;\nconsole.log(\"JS STORE\");\n","import { lodgeSessionStorage } from \"../classes/LodgeStorage\";\nimport { gtmCustomEventPush } from \"../analytics\";\nimport Cookies from \"universal-cookie\";\n\nconst CLASSIFICATION_VERSION = 0.1;\nconst SESSION_KEY = `user_classification_session`;\n// const LOCAL_KEY = `user_classification_long_term`;\n\nconst cookies = new Cookies();\nconst cookieDomainMatch = /(\\w+\\.\\w+)$/g.exec(window.location.hostname);\nconst cookieDomain =\n\tcookieDomainMatch && cookieDomainMatch[1]\n\t\t? `.${cookieDomainMatch[1]}`\n\t\t: \".lodgecastiron.com\";\n\nclass UserClassifier {\n\tconstructor({ state, reducer }) {\n\t\tthis.intents = {};\n\t\tthis.dataPoints = state;\n\t\tthis.intentOutcomes = {};\n\t\tthis.reducer = reducer;\n\n\t\tthis.hydrateUserClassifier();\n\t}\n\n\t/**\n\t * Handles loading current state and outcomes\n\t */\n\thydrateUserClassifier() {\n\t\tconst dataPointKeys = Object.keys(this.dataPoints);\n\t\tdataPointKeys.forEach((key) => {\n\t\t\tlet savedData = cookies.get(`${SESSION_KEY}_${key}`);\n\t\t\tif (savedData) {\n\t\t\t\t// if we have a string, then we're dealing with a boolean\n\t\t\t\tif (typeof savedData === \"string\")\n\t\t\t\t\tsavedData = savedData.toLowerCase() === \"true\";\n\t\t\t\tthis.dataPoints[key] = savedData;\n\t\t\t}\n\t\t});\n\t\tconst savedIntentOutcomes = cookies.get(`${SESSION_KEY}_intent_outcomes`);\n\t\tif (savedIntentOutcomes) {\n\t\t\tthis.intentOutcomes = savedIntentOutcomes;\n\t\t}\n\n\t\t// Create an ID that we can use for cookies\n\t\t// and stashes it immediately\n\t\tif (!this.dataPoints.id) {\n\t\t\tthis.dataPoints.id = `uc_${new Date().getTime()}`;\n\t\t}\n\n\t\tthis.sendDataToGTM();\n\t}\n\n\taddDataPoint(dataPoint) {\n\t\tconst { type } = dataPoint;\n\t\tthis.dataPoints = this.reducer(dataPoint, this.dataPoints);\n\t\tthis.publishDataPoint(type);\n\t\tthis.save();\n\t}\n\n\tpublishDataPoint(dataType) {\n\t\tconst start = performance.now();\n\t\tconst { dataPoints } = this;\n\t\t(Object.keys(this.intents) || []).forEach((intentKey) => {\n\t\t\tif (this.intents[intentKey].subscribesTo.indexOf(dataType) >= 0) {\n\t\t\t\tconst classifyStart = performance.now();\n\t\t\t\ttry {\n\t\t\t\t\tthis.intents[intentKey].classify(dataPoints, dataType);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(`CLASSIFIER ERROR: `, err);\n\t\t\t\t\tgtmCustomEventPush({\n\t\t\t\t\t\tevent: \"UserClassifierFailure\",\n\t\t\t\t\t\tcategory: intentKey,\n\t\t\t\t\t\tlabel: \"Failed to classify\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.intentOutcomes = this.outcomes();\n\t\tthis.sendDataToGTM();\n\t\tconsole.log(`TOTAL PERF WITH GTM: ${(performance.now() - start) / 1000}`);\n\t}\n\n\t/**\n\t * Handles pushing data to GTM\n\t * @return void\n\t */\n\toutcomes() {\n\t\tconst _outcomes = {};\n\t\tObject.keys(this.intents).forEach((key) => {\n\t\t\tconst intent = this.intents[key];\n\t\t\t// TODO: figure out why .negatedBy wasn't already an array\n\t\t\t_outcomes[intent.intentName] = (intent.negatedBy || []).reduce(\n\t\t\t\t(acc, curr) => {\n\t\t\t\t\treturn this.intents[curr]\n\t\t\t\t\t\t? acc && !this.intents[curr].isMatch()\n\t\t\t\t\t\t: acc;\n\t\t\t\t},\n\t\t\t\tintent.isMatch(),\n\t\t\t);\n\t\t});\n\t\treturn _outcomes;\n\t}\n\n\tsendDataToGTM() {\n\t\tgtmCustomEventPush({\n\t\t\tevent: \"UserClassification\",\n\t\t\tclassifications: {\n\t\t\t\tintents: this.intentOutcomes,\n\t\t\t\tversion: CLASSIFICATION_VERSION,\n\t\t\t},\n\t\t});\n\t}\n\n\tregisterIntent(intent) {\n\t\tconst guard = !!this.intents[intent.intentName];\n\t\tif (!guard.length) {\n\t\t\tthis.intents[intent.intentName] = intent;\n\n\t\t\t// We don't want to overwrite if this came from session\n\t\t\tif (!!this.intentOutcomes[intent.intentName]) {\n\t\t\t\tthis.intentOutcomes[intent.intentName] = false;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handles registering more than one intent at a time\n\t * @param {Array} intents\n\t */\n\tregisterIntents(intents, options = {}) {\n\t\tintents.forEach((intent) => {\n\t\t\tthis.registerIntent(intent);\n\t\t});\n\n\t\tif (options.debug) {\n\t\t\tintents.forEach((intent) => {\n\t\t\t\twindow[`lodge_uc_${intent.prettyName.toLowerCase()}`] = intent;\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Deletes all mentions of intent\n\t * @param {} intentName\n\t */\n\tderegisterIntent(intentName) {\n\t\tif (this.intents[intentName]) {\n\t\t\tdelete this.intents[intentName];\n\t\t\tdelete this.intentOutcomes[intentName];\n\t\t}\n\t}\n\n\tsave() {\n\t\tconst cookieOptions = {\n\t\t\tpath: \"/\",\n\t\t\tdomain: cookieDomain,\n\t\t};\n\n\t\t// Break bits of data points out into separate cookies\n\t\t// so we can save more data easily\n\t\tconst dataPointKeys = Object.keys(this.dataPoints);\n\t\tdataPointKeys.forEach((key) => {\n\t\t\tcookies.set(`${SESSION_KEY}_${key}`, this.dataPoints[key], cookieOptions);\n\t\t});\n\t\tcookies.set(\n\t\t\t`${SESSION_KEY}_intent_outcomes`,\n\t\t\tthis.intentOutcomes,\n\t\t\tcookieOptions,\n\t\t);\n\t}\n}\n\nexport default UserClassifier;\n","/**\n *\t@typedef {{\n *\t\tid?: null | string,\n *\t\tpages: Array,\n *\t\tviewedProducts: Array,\n *\t\tpurchases: Array\n *\t\tinteractedWithCart: boolean\n *\t}} ClassifierState\n */\nexport const baseState = {\n\tid: null,\n\tpages: [],\n\tviewedProducts: [],\n\tpurchases: [],\n\tinteractedWithCart: false,\n};\n\n/**\n *\n * @param {string|number} val\n * @return string\n */\nexport const stripMoneySign = (val) => {\n\tif (val) {\n\t\treturn val.toString().replace(\"$\", \"\");\n\t}\n\treturn val;\n};\n\n/**\n * @typedef {{\n *\ttype: string,\n *\tdata?: object\n * }} StatePayload\n */\n\n/**\n *\n * @param { StatePayload } payload\n * @param {ClassifierState} state\n * @return ClassifierState\n */\nexport const reducer = (payload, state) => {\n\tswitch (payload.type) {\n\t\tcase CLASSIFIER_TYPES.PAGE_VIEW:\n\t\t\tconst alreadySeen = state.pages.filter((p) => {\n\t\t\t\treturn p.path === payload.data.path;\n\t\t\t});\n\t\t\treturn Object.assign({}, state, {\n\t\t\t\tpages: alreadySeen.length\n\t\t\t\t\t? [...state.pages]\n\t\t\t\t\t: [...state.pages, payload.data],\n\t\t\t});\n\t\tcase CLASSIFIER_TYPES.PRODUCT_VIEW:\n\t\t\tconst alreadySeenProduct =\n\t\t\t\tstate.viewedProducts.indexOf(payload.data.salesforce_id) >= 0;\n\t\t\treturn Object.assign({}, state, {\n\t\t\t\tviewedProducts: alreadySeenProduct\n\t\t\t\t\t? [...state.viewedProducts]\n\t\t\t\t\t: [...state.viewedProducts, payload.data.salesforce_id],\n\t\t\t});\n\t\tcase CLASSIFIER_TYPES.ECOM_ADD_TO_CART:\n\t\t\treturn Object.assign({}, state, {\n\t\t\t\tinteractedWithCart: payload.data.interactedWithCart,\n\t\t\t});\n\t\tcase CLASSIFIER_TYPES.ECOM_PURCHASE:\n\t\t\tconsole.log(\"product 40\", payload);\n\t\t\treturn Object.assign({}, state, {\n\t\t\t\tpurchases: [\n\t\t\t\t\t...state.purchases,\n\t\t\t\t\t{\n\t\t\t\t\t\tunits: payload.data.units,\n\t\t\t\t\t\tprice: payload.data.price,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\tdefault:\n\t\t\treturn Object.assign({}, state);\n\t}\n};\n\nexport const CLASSIFIER_TYPES = {\n\tPAGE_VIEW: `PAGE_VIEW`,\n\tECOM_ADD_TO_CART: `ECOM_ADD_TO_CART`,\n\tECOM_PURCHASE: `ECOM_PURCHASE`,\n\tPRODUCT_VIEW: \"PRODUCT_VIEW\",\n};\n","export default class BaseLodgeIntent {\n\tconstructor({ intentName, subscribesTo, prettyName, negatedBy }) {\n\t\tthis.intentName = intentName;\n\t\tthis.prettyName = prettyName || intentName;\n\t\tthis.subscribesTo = subscribesTo ? subscribesTo : [];\n\t\tthis.negatedBy = negatedBy ? negatedBy : [];\n\t}\n\n\tclassify() {\n\t\tconsole.warn(`Intent ${name} cannot classify.`);\n\t\treturn false;\n\t}\n}\n","import BaseLodgeIntent from \"../BaseLodgeIntent\";\nimport { CLASSIFIER_TYPES } from \"../classifierUtils\";\n\nclass RecipeChef extends BaseLodgeIntent {\n\tconstructor(options) {\n\t\tsuper(options);\n\n\t\t// Constants that could be pulld in by Drupal\n\t\tthis.FIRST_N_PAGES = 3;\n\t\tthis.SEEN_N_PAGES = 2;\n\n\t\tthis.seenByNPages = false;\n\t\tthis.visitedNRecipes = false;\n\t}\n\n\tclassify(data) {\n\t\t// we cannot be unclassified as a recipe chef\n\t\tif (this.seenByNPages && this.visitedNRecipes) return;\n\n\t\tconst regex = /\\/recipe(s?|\\/?)/;\n\t\tlet counter = 0;\n\t\t// make the filter do double duty to keep count\n\t\tdata.pages.forEach((p, idx) => {\n\t\t\tconst regexTest = regex.test(p.path);\n\t\t\tif (!this.seenByNPages && idx <= this.FIRST_N_PAGES) {\n\t\t\t\tthis.seenByNPages = this.seenByNPages || regexTest;\n\t\t\t}\n\t\t\tif (regexTest) counter++;\n\t\t});\n\n\t\tthis.visitedNRecipes = counter >= 2;\n\t}\n\n\tisMatch() {\n\t\treturn this.seenByNPages && this.visitedNRecipes;\n\t}\n}\n\nexport default new RecipeChef({\n\tprettyName: \"RecipeChef\",\n\tintentName: \"USER_INTENT_1\",\n\tsubscribesTo: [CLASSIFIER_TYPES.PAGE_VIEW],\n\tnegatedBy: [],\n});\n","import BaseLodgeIntent from \"../BaseLodgeIntent\";\nimport { CLASSIFIER_TYPES } from \"../classifierUtils\";\n\nclass CaringOwner extends BaseLodgeIntent {\n\tconstructor(options) {\n\t\tsuper(options);\n\n\t\t// Constants that could be pulld in by Drupal\n\t\tthis.SEEN_N_PAGES = 2;\n\n\t\tthis.visitedNHelpArticles = false;\n\t}\n\n\tclassify(data) {\n\t\t// Cannot unclassify the user\n\t\tif (this.visitedNHelpArticles) return;\n\n\t\tconst regex = /\\/cleaning-and-care/;\n\t\tlet counter = 0;\n\t\t// make the filter do double duty to keep count\n\t\tdata.pages.forEach((p, idx) => {\n\t\t\tif (regex.test(p.path)) counter++;\n\t\t});\n\n\t\tthis.visitedNHelpArticles = counter >= 2;\n\t}\n\n\tisMatch() {\n\t\treturn this.visitedNHelpArticles;\n\t}\n}\n\nexport default new CaringOwner({\n\tprettyName: \"CaringOwner\",\n\tintentName: \"USER_INTENT_5\",\n\tsubscribesTo: [CLASSIFIER_TYPES.PAGE_VIEW],\n\tnegatedBy: [`USER_INTENT_2`, `USER_INTENT_3`, `USER_INTENT_4`],\n});\n","import BaseLodgeIntent from \"../BaseLodgeIntent\";\nimport { CLASSIFIER_TYPES } from \"../classifierUtils\";\n\nclass PowerBuyer extends BaseLodgeIntent {\n\tconstructor(options) {\n\t\tsuper(options);\n\n\t\tthis.AVERAGE_UNITS_PER_PURCHASE = 2.5;\n\t\tthis.SEEN_N_PAGES = 3;\n\t\tthis.SHOP_PAGE_URL = \"shop\";\n\n\t\tthis.boughtOverAverage = false;\n\t\tthis.seenByNPages = false;\n\t}\n\n\tclassify(data) {\n\t\t// no reason to keep reclassifying\n\t\tif (this.seenByNPages && this.boughtOverAverage) return;\n\n\t\t// handle updating this if we saw a product\n\t\tif (!this.seenByNPages) {\n\t\t\tconsole.log(\"hasnt been seen by n pages\");\n\t\t\tlet hasSeenEarly = false;\n\t\t\tconst loopLength = Math.min(data.pages.length, this.SEEN_N_PAGES);\n\t\t\tfor (let i = 0; i < loopLength; i++) {\n\t\t\t\tconst p = data.pages[i].path.split(\"/\")[1];\n\t\t\t\tconsole.log(\n\t\t\t\t\tp,\n\t\t\t\t\tdata.viewedProducts,\n\t\t\t\t\tdata.viewedProducts.indexOf(p) >= 0,\n\t\t\t\t\tp === this.SHOP_PAGE_URL,\n\t\t\t\t);\n\t\t\t\tif (data.viewedProducts.indexOf(p) >= 0 || p === this.SHOP_PAGE_URL) {\n\t\t\t\t\tconsole.log(\"product has been viewed early\");\n\t\t\t\t\thasSeenEarly = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.seenByNPages = hasSeenEarly;\n\t\t}\n\n\t\t// check to see if they bought over average\n\t\tif (!this.boughtOverAverage) {\n\t\t\tthis.boughtOverAverage = data.purchases.reduce((acc, curr) => {\n\t\t\t\tconsole.log(34, curr.units, this.AVERAGE_UNITS_PER_PURCHASE);\n\t\t\t\treturn acc || curr.units > this.AVERAGE_UNITS_PER_PURCHASE;\n\t\t\t}, false);\n\t\t}\n\t}\n\n\tisMatch() {\n\t\treturn this.boughtOverAverage && this.seenByNPages;\n\t}\n}\n\nexport default new PowerBuyer({\n\tprettyName: \"PowerBuyer\",\n\tintentName: \"USER_INTENT_2\",\n\tsubscribesTo: [\n\t\tCLASSIFIER_TYPES.PAGE_VIEW,\n\t\tCLASSIFIER_TYPES.ECOM_PURCHASE,\n\t\tCLASSIFIER_TYPES.PRODUCT_VIEW,\n\t],\n\tnegatedBy: [],\n});\n","import BaseLodgeIntent from \"../BaseLodgeIntent\";\nimport { CLASSIFIER_TYPES } from \"../classifierUtils\";\n\nclass UnconfidentUser extends BaseLodgeIntent {\n\tconstructor(options) {\n\t\tsuper(options);\n\n\t\tthis.N_VIEWED_PRODUCTS = 5;\n\n\t\tthis.viewedProductsCount = false;\n\t\tthis.madePurchase = false;\n\t\tthis.interactedWithCart = false;\n\t}\n\n\tclassify(data) {\n\t\t// this intent can be reclassified over and over\n\t\t// so we don't want to assume anything\n\t\tconsole.log(data.interactedWithCart);\n\t\tthis.viewedProductsCount =\n\t\t\tdata.viewedProducts.length >= this.N_VIEWED_PRODUCTS;\n\t\tthis.interactedWithCart = data.interactedWithCart;\n\t\tthis.madePurchase = data.purchases.length > 0;\n\t}\n\n\tisMatch() {\n\t\tconsole.log(this);\n\t\treturn (\n\t\t\t!this.interactedWithCart && !this.madePurchase && this.viewedProductsCount\n\t\t);\n\t}\n}\n\nexport default new UnconfidentUser({\n\tprettyName: \"UnconfidentUser\",\n\tintentName: \"USER_INTENT_4\",\n\tsubscribesTo: [\n\t\tCLASSIFIER_TYPES.PRODUCT_VIEW,\n\t\tCLASSIFIER_TYPES.ECOM_PURCHASE,\n\t\tCLASSIFIER_TYPES.ECOM_ADD_TO_CART,\n\t],\n\tnegatedBy: [],\n});\n","import BaseLodgeIntent from \"../BaseLodgeIntent\";\nimport { CLASSIFIER_TYPES } from \"../classifierUtils\";\n\nclass InfluencedMogul extends BaseLodgeIntent {\n\tconstructor(options) {\n\t\tsuper(options);\n\n\t\tthis.broughtBySocial = false;\n\t\tthis.madePurchase = false;\n\t}\n\n\tclassify(data) {\n\t\t// no reason to keep reclassifying\n\t\tif (this.broughtBySocial && this.madePurchase) return;\n\n\t\t// handle updating this if we saw a product\n\t\tif (!this.broughtBySocial) {\n\t\t\tconst introPage = data.pages[0];\n\t\t\tthis.broughtBySocial =\n\t\t\t\tintroPage.queryString.indexOf(\"facebook\") >= 0 ||\n\t\t\t\tintroPage.queryString.indexOf(\"instagram\") >= 0 ||\n\t\t\t\tintroPage.queryString.indexOf(\"twitter\") >= 0;\n\t\t}\n\n\t\tif (!this.madePurchase) {\n\t\t\tthis.madePurchase = data.purchases.length > 0;\n\t\t}\n\t}\n\n\tisMatch() {\n\t\treturn this.madePurchase && this.broughtBySocial;\n\t}\n}\n\nexport default new InfluencedMogul({\n\tprettyName: \"InfluencedMogul\",\n\tintentName: \"USER_INTENT_3\",\n\tsubscribesTo: [CLASSIFIER_TYPES.PAGE_VIEW, CLASSIFIER_TYPES.ECOM_PURCHASE],\n\tnegatedBy: [],\n});\n","import UserClassifier from \"./UserClassifier\";\nimport { baseState, reducer, CLASSIFIER_TYPES as CT } from \"./classifierUtils\";\nimport RecipeChef from \"./intents/RecipeChef\";\nimport CaringOwner from \"./intents/CaringOwner\";\nimport PowerBuyer from \"./intents/PowerBuyer\";\nimport UnconfidentUser from \"./intents/UnconfidentUser\";\nimport InfluencedMogul from \"./intents/InfluencedMogul\";\n\nconst USER_CLASSIFIER_DEBUGGER = true;\nconst userClassifier = new UserClassifier({ state: baseState, reducer });\nuserClassifier.registerIntents(\n\t[RecipeChef, CaringOwner, PowerBuyer, UnconfidentUser, InfluencedMogul],\n\t{ debug: USER_CLASSIFIER_DEBUGGER },\n);\n\nuserClassifier.addDataPoint({\n\ttype: CT.PAGE_VIEW,\n\tdata: {\n\t\tpath: location.pathname,\n\t\tqueryString: location.search,\n\t},\n});\n\nif (USER_CLASSIFIER_DEBUGGER) {\n\twindow.lodge_user_classifier = userClassifier;\n}\nexport const CLASSIFIER_TYPES = CT;\nexport default userClassifier;\n","import { gtmCustomEventPush } from \"./analytics\";\nimport { callFnIfEnterKeyWasPressed } from \"./utils\";\n\n(function () {\n\t// debugger;\n\tconst searchWrapper = document.querySelector(\n\t\t\".block--exposedformsearchpage-1\",\n\t);\n\tconst searchIcon = document.querySelector(\".search-icon\");\n\tif (!searchWrapper || !searchIcon) return;\n\tconst closeElem = document.querySelector(\n\t\t\".block--exposedformsearchpage-1--button\",\n\t);\n\t// const searchInput = document.querySelector(\"#edit-search-api-fulltext\");\n\tconst searchInputs = document.querySelectorAll('input[name=\"search_api_fulltext\"]');\n\tconst closeSearch = () => {\n\t\tsearchWrapper.classList.remove(\"block--exposedformsearchpage-1--show\");\n\t\tsetTimeout(() => searchIcon.focus(), 16);\n\t};\n\tcloseElem.addEventListener(\"click\", function () {\n\t\tcloseSearch();\n\t});\n\tcloseElem.addEventListener(\"keydown\", (e) => {\n\t\tconsole.log(\"keydown \", e.key, \" on close button?\");\n\t\tif (e.key === \"Enter\") {\n\t\t\tcloseSearch();\n\t\t}\n\t});\n\n\tconst openSearch = () => {\n\t\tsearchWrapper.classList.add(\"block--exposedformsearchpage-1--show\");\n\t\t// searchInput.focus();\n\t\tsearchInputs[0].focus();\n\t};\n\tsearchIcon.addEventListener(\"click\", function () {\n\t\topenSearch();\n\t});\n\tsearchIcon.addEventListener(\"keypress\", (e) => {\n\t\tif (e.key === \"Enter\") {\n\t\t\topenSearch();\n\t\t}\n\t});\n\n\t// gtm analytics stuff because drupal prevents form fires\n\t// const searchBtn = searchWrapper.querySelector('[type=\"submit\"]');\n\t// const mobileSearchInput = document.querySelector(\n\t// \t'.links-holder input[name=\"search_api_fulltext\"]',\n\t// );\n\tconst fireQueryToGTM = (e) => {\n\t\tconst query = (e && e.target.querySelector('input')) ? e.target.querySelector('input').value : searchInput.value;\n\t\tgtmCustomEventPush({\n\t\t\tevent: \"SiteSearch\",\n\t\t\tcategory: \"Search\",\n\t\t\tlabel: `${query}`,\n\t\t});\n\t};\n\tconst fireMobileQueryToGTM = () => {\n\t\tgtmCustomEventPush({\n\t\t\tevent: \"SiteSearch\",\n\t\t\tcategory: \"Search\",\n\t\t\tlabel: `${mobileSearchInput.value}`,\n\t\t});\n\t};\n\tconst forms = document.querySelectorAll('[id*=views-exposed-form-site-search-search], .links-holder input[name=search_api_fulltext]');\n\tforms.forEach((btn) => btn.addEventListener(\"submit\", (e) => fireQueryToGTM(e)));\n\t// searchBtn.addEventListener(\"click\", (e) => fireQueryToGTM());\n\t// searchInput.addEventListener(\n\t// \t\"keydown\",\n\t// \tcallFnIfEnterKeyWasPressed(fireQueryToGTM),\n\t// );\n\t// mobileSearchInput.addEventListener(\n\t// \t\"keydown\",\n\t// \tcallFnIfEnterKeyWasPressed(fireMobileQueryToGTM),\n\t// );\n})();\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.quizTaken)?_c('div',{staticClass:\"quiz component\"},[(_vm.JSONQuizData.pages.length)?_c('QuizContainer',{attrs:{\"quiz\":_vm.JSONQuizData},on:{\"finished\":_vm.quizIsFinished},scopedSlots:_vm._u([{key:\"default\",fn:function(quizData){return [_c('div',[_c('Pagination',{attrs:{\"show\":quizData.pages[quizData.current].type !== 'result',\"total\":quizData.pages.length,\"current\":quizData.current,\"back\":quizData.movement.prev}}),_vm._v(\" \"),_vm._l((quizData.pages),function(page,idx){return _c('Page',{key:(\"page-\" + idx),class:{\n\t\t\t\t\tactive: idx === quizData.current,\n\t\t\t\t\tresults: idx === quizData.pages.length - 1,\n\t\t\t\t},attrs:{\"page\":page,\"movement\":quizData.movement,\"choices\":quizData.choices,\"choicesResults\":quizData.choicesResults}})})],2)]}}],null,false,3320156347)}):_vm._e()],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export default {\n\tpages: [\n\t\t{\n\t\t\ttype: \"page\",\n\t\t\tsubtitle: \"We want to get to know you.\",\n\t\t\ttitle: \"What's your cooking skill level?\",\n\t\t\tmultiselect: false,\n\t\t\tbuttons: [\n\t\t\t\t{ id: 0, label: \"I'm a beginner\", value: 1 },\n\t\t\t\t{ id: 1, label: \"I have some experience\", value: 3 },\n\t\t\t\t{ id: 2, label: \"I'm a pro\", value: 5 },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\ttype: \"page\",\n\t\t\tsubtitle: \"We want to get to know you.\",\n\t\t\ttitle: \"How often do you cook?\",\n\t\t\tmultiselect: false,\n\t\t\tbuttons: [\n\t\t\t\t{ id: 0, label: \"Rarely or never\", value: 0 },\n\t\t\t\t{ id: 1, label: \"A few times a month\", value: 0 },\n\t\t\t\t{ id: 2, label: \"A few times a week\", value: 0 },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\ttype: \"page\",\n\t\t\tsubtitle: \"We want to get to know you.\",\n\t\t\ttitle: \"What type of Lodge cookware do you own?\",\n\t\t\tdescription: \"(Select all that apply.)\",\n\t\t\tmultiselect: true,\n\t\t\tbuttons: [\n\t\t\t\t{ id: 0, label: \"Cast Iron\", value: 0 },\n\t\t\t\t{ id: 1, label: \"Carbon Steel\", value: 0 },\n\t\t\t\t{ id: 2, label: \"Stoneware\", value: 0 },\n\t\t\t\t{ id: 3, label: \"Enameled Cast Iron\", value: 0 },\n\t\t\t\t{ id: 4, label: \"Heat-Treated Serveware\", value: 0 },\n\t\t\t\t{ id: 5, label: \"I don't own Lodge cookware\", value: 0 },\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\ttype: \"result\",\n\t\t\ttitle: \"Thank you for your responses!\",\n\t\t\tdescription: \"We recommend: \",\n\t\t\tdata: {\n\t\t\t\t\"result-1\": [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"recipe\",\n\t\t\t\t\t\ttitle: \"Grilled Margherita Pizza\",\n\t\t\t\t\t\thref: \"/recipe/grilled-margherita-pizza\",\n\t\t\t\t\t\tall: \"/discover/recipes\",\n\t\t\t\t\t\timage: \"/themes/custom/tombras/images/quiz/pizza.jpg\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"product\",\n\t\t\t\t\t\ttitle: '12\" Cast Iron Skillet',\n\t\t\t\t\t\thref: \"/round-cast-iron-classic-skillet?sku=L10SK3\",\n\t\t\t\t\t\tall: \"/shop\",\n\t\t\t\t\t\timage: \"/themes/custom/tombras/images/quiz/12-skillet.jpg\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"result-3\": [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"recipe\",\n\t\t\t\t\t\ttitle: \"Roast Chicken with Spring Veggies\",\n\t\t\t\t\t\thref: \"/recipe/splayed-roast-chicken-with-spring-vegetables\",\n\t\t\t\t\t\tall: \"/discover/recipes\",\n\t\t\t\t\t\timage: \"/themes/custom/tombras/images/quiz/chicken.jpg\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"product\",\n\t\t\t\t\t\ttitle: \"Chef Collection\",\n\t\t\t\t\t\thref: \"/shop?Collection=Chef%20Collection\",\n\t\t\t\t\t\tall: \"/shop\",\n\t\t\t\t\t\timage: \"/themes/custom/tombras/images/quiz/chef.jpg\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"result-5\": [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"recipe\",\n\t\t\t\t\t\ttitle: \"Winter Root Vegetable Chili\",\n\t\t\t\t\t\thref: \"/recipe/winter-root-vegetable-chili\",\n\t\t\t\t\t\tall: \"/discover/recipes\",\n\t\t\t\t\t\timage: \"/themes/custom/tombras/images/quiz/chili.jpg\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"product\",\n\t\t\t\t\t\ttitle: \"Enameled Dutch Oven\",\n\t\t\t\t\t\thref: \"/enameled-dutch-oven\",\n\t\t\t\t\t\tall: \"/shop\",\n\t\t\t\t\t\timage: \"/themes/custom/tombras/images/quiz/dutch-oven.jpg\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t},\n\t],\n};\n","/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nexport default function normalizeComponent (\n scriptExports,\n render,\n staticRenderFns,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier, /* server only */\n shadowMode /* vue-cli only */\n) {\n // Vue.extend constructor export interop\n var options = typeof scriptExports === 'function'\n ? scriptExports.options\n : scriptExports\n\n // render functions\n if (render) {\n options.render = render\n options.staticRenderFns = staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = 'data-v-' + scopeId\n }\n\n var hook\n if (moduleIdentifier) { // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () {\n injectStyles.call(\n this,\n (options.functional ? this.parent : this).$root.$options.shadowRoot\n )\n }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functional component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection (h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing\n ? [].concat(existing, hook)\n : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n","import { render, staticRenderFns } from \"./Title.vue?vue&type=template&id=7e02954d&\"\nimport script from \"./Title.vue?vue&type=script&lang=js&\"\nexport * from \"./Title.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t
{{ subtitle }}\n\t\t
{{ title }}
\n\t\t
{{ desc }}
\n\t
\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"quiz--title\"},[_c('span',{staticClass:\"color--secondary\"},[_vm._v(_vm._s(_vm.subtitle))]),_vm._v(\" \"),_c('h4',[_vm._v(_vm._s(_vm.title))]),_vm._v(\" \"),(_vm.desc)?_c('p',[_vm._v(_vm._s(_vm.desc))]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./QuizButton.vue?vue&type=template&id=308bd384&\"\nimport script from \"./QuizButton.vue?vue&type=script&lang=js&\"\nexport * from \"./QuizButton.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t\n\t\t\n\t
\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],staticClass:\"quiz-checkbox\",attrs:{\"id\":_vm.id,\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.value)?_vm._i(_vm.value,null)>-1:(_vm.value)},on:{\"change\":function($event){var $$a=_vm.value,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.value=$$a.concat([$$v]))}else{$$i>-1&&(_vm.value=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.value=$$c}}}}),_vm._v(\" \"),_c('label',{staticClass:\"btn btn--transparent\",attrs:{\"tabindex\":\"0\",\"for\":_vm.id},on:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.onEnterKeyUp($event)}}},[_vm._v(_vm._s(_vm.btn.label))])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./ButtonSelection.vue?vue&type=template&id=4ea78722&\"\nimport script from \"./ButtonSelection.vue?vue&type=script&lang=js&\"\nexport * from \"./ButtonSelection.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"quiz--buttons\"},[_c('div',{staticClass:\"quiz--buttons-container\",class:{ column: _vm.isFlexedColumn }},_vm._l((_vm.buttons),function(button){return _c('QuizButton',{key:(\"button-\" + (button.id)),attrs:{\"btn\":button},on:{\"selected\":_vm.onSelection}})}),1),_vm._v(\" \"),(_vm.multiselect && _vm.selections.length > 0)?_c('div',{staticStyle:{\"text-align\":\"center\"}},[_c('a',{staticClass:\"btn btn--link color--secondary\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.onMultiselectFinish($event)},\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.onMultiselectFinish($event)}}},[_vm._v(\"Continue\")])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Result.vue?vue&type=template&id=be129c6a&\"\nimport script from \"./Result.vue?vue&type=script&lang=js&\"\nexport * from \"./Result.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t
![]()
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
View all {{ result.type }}s\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t
\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"quiz--result\"},[_c('div',{staticClass:\"frow-container\"},[_c('div',{staticClass:\"frow gutters card-container\"},[_c('div',{staticClass:\"card-container-inner\"},_vm._l((_vm.resultData),function(result,idx){return _c('div',{key:idx,staticClass:\"quiz--card-wrapper\"},[_c('div',{staticClass:\"card primary recipe-card card-normal card-quiz\"},[_c('div',{staticClass:\"image-holder\"},[_c('img',{attrs:{\"src\":result.image,\"alt\":(\"Image of \" + (result.title))}})]),_vm._v(\" \"),_c('div',{staticClass:\"card-title\"},[_c('a',{staticClass:\"primary-hover\",attrs:{\"href\":result.href}},[_c('h4',{staticClass:\"h7 title\"},[_vm._v(_vm._s(result.title))]),_vm._v(\" \"),_c('span',{staticClass:\"link-text\"},[_vm._v(\" View this \"+_vm._s(result.type)+\" \")])])])]),_vm._v(\" \"),_c('a',{staticClass:\"size-small btn btn--link color--secondary\",attrs:{\"href\":result.all}},[_vm._v(\"View all \"+_vm._s(result.type)+\"s\")])])}),0)])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Page.vue?vue&type=template&id=a562e9f2&\"\nimport script from \"./Page.vue?vue&type=script&lang=js&\"\nexport * from \"./Page.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t
\n\t
\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"quiz--page frow-container\"},[_c('div',{staticClass:\"frow gutters\"},[_c('div',{staticClass:\"col-md-1-2\"},[_c('TitleContent',{attrs:{\"page\":_vm.page}})],1),_vm._v(\" \"),_c('div',{staticClass:\"col-md-1-2\"},[(_vm.page.type === 'page')?_c('ButtonSelection',{attrs:{\"buttons\":_vm.page.buttons,\"multiselect\":_vm.page.multiselect},on:{\"nextWithData\":_vm.nextWithData}}):_c('Result',{attrs:{\"page\":_vm.page,\"choices\":_vm.choicesResults}})],1)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render, staticRenderFns\nimport script from \"./QuizContainer.vue?vue&type=script&lang=js&\"\nexport * from \"./QuizContainer.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","","import { render, staticRenderFns } from \"./Pagination.vue?vue&type=template&id=45888fa3&\"\nimport script from \"./Pagination.vue?vue&type=script&lang=js&\"\nexport * from \"./Pagination.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t
\n\t\t\t
\n\t\t\t\t
0\" @click=\"back\"\n\t\t\t\t\t>\n\t\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t{{ current + 1 }}/{{ total - 1 }}\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t
\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"frow-container quiz--pagination\",class:{ hide: !_vm.show }},[_c('div',{staticClass:\"frow gutters\"},[_c('div',{staticClass:\"col-xs-1-2 chevron-holder\"},[_c('span',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.current > 0),expression:\"current > 0\"}],on:{\"click\":_vm.back}},[_c('div',{staticClass:\"chevron\"})])]),_vm._v(\" \"),_c('div',{staticClass:\"col-xs-1-2\",staticStyle:{\"text-align\":\"right\"}},[_c('div',[_c('span',[_vm._v(_vm._s(_vm.current + 1))]),_vm._v(\"/\"),_c('span',[_vm._v(_vm._s(_vm.total - 1))])])])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Quiz.vue?vue&type=template&id=1c930268&\"\nimport script from \"./Quiz.vue?vue&type=script&lang=js&\"\nexport * from \"./Quiz.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t
\n\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t\n\t
\n\n\n","import { render, staticRenderFns } from \"./Bookmark.vue?vue&type=template&id=2c3f2ede&\"\nimport script from \"./Bookmark.vue?vue&type=script&lang=js&\"\nexport * from \"./Bookmark.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t
\n\t\t
{{ screenreaderText }} {{ title }}\n\t\t
\n\t\t\t
Processing request
\n\t\t\t
\n\t\t\t\t{{ toasterMessages[toasterStatus] }}\n\t\t\t
\n\t\t
\n\t
\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.loggedIn),expression:\"loggedIn\"}],staticClass:\"top-right-icon btn btn--round-icon\",class:{\n\t\tbackgroundless: _vm.inSocialBar,\n\t\ttoasted: _vm.toasterStatus,\n\t\tprocessing: _vm.processing,\n\t},attrs:{\"tabindex\":\"0\",\"data-bookmarkable\":\"true\",\"data-bookmark-id\":\"431431413\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.setStatus($event)},\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.stopPropagation();return _vm.setStatus($event)}}},[_c('span',{class:['icon', _vm.iconStatus],attrs:{\"role\":\"presentation\",\"data-icon\":\"bookmark\"}}),_vm._v(\" \"),_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(_vm.screenreaderText)+\" \"+_vm._s(_vm.title))]),_vm._v(\" \"),_c('div',{staticClass:\"toaster frow row-center\",class:{ show: _vm.toasterStatus, active: _vm.isBookmarkedRecipe }},[(_vm.processing)?_c('div',{staticClass:\"sr-only\"},[_vm._v(\"Processing request\")]):_vm._e(),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.toasterStatus !== ''),expression:\"toasterStatus !== ''\"}],staticClass:\"toast\"},[_vm._v(\"\\n\\t\\t\\t\"+_vm._s(_vm.toasterMessages[_vm.toasterStatus])+\"\\n\\t\\t\")])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\n/*!\n * GSAP 3.9.1\n * https://greensock.com\n *\n * @license Copyright 2008-2021, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, jack@greensock.com\n*/\n\n/* eslint-disable */\nvar _config = {\n autoSleep: 120,\n force3D: \"auto\",\n nullTargetWarn: 1,\n units: {\n lineHeight: \"\"\n }\n},\n _defaults = {\n duration: .5,\n overwrite: false,\n delay: 0\n},\n _suppressOverwrites,\n _bigNum = 1e8,\n _tinyNum = 1 / _bigNum,\n _2PI = Math.PI * 2,\n _HALF_PI = _2PI / 4,\n _gsID = 0,\n _sqrt = Math.sqrt,\n _cos = Math.cos,\n _sin = Math.sin,\n _isString = function _isString(value) {\n return typeof value === \"string\";\n},\n _isFunction = function _isFunction(value) {\n return typeof value === \"function\";\n},\n _isNumber = function _isNumber(value) {\n return typeof value === \"number\";\n},\n _isUndefined = function _isUndefined(value) {\n return typeof value === \"undefined\";\n},\n _isObject = function _isObject(value) {\n return typeof value === \"object\";\n},\n _isNotFalse = function _isNotFalse(value) {\n return value !== false;\n},\n _windowExists = function _windowExists() {\n return typeof window !== \"undefined\";\n},\n _isFuncOrString = function _isFuncOrString(value) {\n return _isFunction(value) || _isString(value);\n},\n _isTypedArray = typeof ArrayBuffer === \"function\" && ArrayBuffer.isView || function () {},\n // note: IE10 has ArrayBuffer, but NOT ArrayBuffer.isView().\n_isArray = Array.isArray,\n _strictNumExp = /(?:-?\\.?\\d|\\.)+/gi,\n //only numbers (including negatives and decimals) but NOT relative values.\n_numExp = /[-+=.]*\\d+[.e\\-+]*\\d*[e\\-+]*\\d*/g,\n //finds any numbers, including ones that start with += or -=, negative numbers, and ones in scientific notation like 1e-8.\n_numWithUnitExp = /[-+=.]*\\d+[.e-]*\\d*[a-z%]*/g,\n _complexStringNumExp = /[-+=.]*\\d+\\.?\\d*(?:e-|e\\+)?\\d*/gi,\n //duplicate so that while we're looping through matches from exec(), it doesn't contaminate the lastIndex of _numExp which we use to search for colors too.\n_relExp = /[+-]=-?[.\\d]+/,\n _delimitedValueExp = /[^,'\"\\[\\]\\s]+/gi,\n // previously /[#\\-+.]*\\b[a-z\\d\\-=+%.]+/gi but didn't catch special characters.\n_unitExp = /[\\d.+\\-=]+(?:e[-+]\\d*)*/i,\n _globalTimeline,\n _win,\n _coreInitted,\n _doc,\n _globals = {},\n _installScope = {},\n _coreReady,\n _install = function _install(scope) {\n return (_installScope = _merge(scope, _globals)) && gsap;\n},\n _missingPlugin = function _missingPlugin(property, value) {\n return console.warn(\"Invalid property\", property, \"set to\", value, \"Missing plugin? gsap.registerPlugin()\");\n},\n _warn = function _warn(message, suppress) {\n return !suppress && console.warn(message);\n},\n _addGlobal = function _addGlobal(name, obj) {\n return name && (_globals[name] = obj) && _installScope && (_installScope[name] = obj) || _globals;\n},\n _emptyFunc = function _emptyFunc() {\n return 0;\n},\n _reservedProps = {},\n _lazyTweens = [],\n _lazyLookup = {},\n _lastRenderedFrame,\n _plugins = {},\n _effects = {},\n _nextGCFrame = 30,\n _harnessPlugins = [],\n _callbackNames = \"\",\n _harness = function _harness(targets) {\n var target = targets[0],\n harnessPlugin,\n i;\n _isObject(target) || _isFunction(target) || (targets = [targets]);\n\n if (!(harnessPlugin = (target._gsap || {}).harness)) {\n // find the first target with a harness. We assume targets passed into an animation will be of similar type, meaning the same kind of harness can be used for them all (performance optimization)\n i = _harnessPlugins.length;\n\n while (i-- && !_harnessPlugins[i].targetTest(target)) {}\n\n harnessPlugin = _harnessPlugins[i];\n }\n\n i = targets.length;\n\n while (i--) {\n targets[i] && (targets[i]._gsap || (targets[i]._gsap = new GSCache(targets[i], harnessPlugin))) || targets.splice(i, 1);\n }\n\n return targets;\n},\n _getCache = function _getCache(target) {\n return target._gsap || _harness(toArray(target))[0]._gsap;\n},\n _getProperty = function _getProperty(target, property, v) {\n return (v = target[property]) && _isFunction(v) ? target[property]() : _isUndefined(v) && target.getAttribute && target.getAttribute(property) || v;\n},\n _forEachName = function _forEachName(names, func) {\n return (names = names.split(\",\")).forEach(func) || names;\n},\n //split a comma-delimited list of names into an array, then run a forEach() function and return the split array (this is just a way to consolidate/shorten some code).\n_round = function _round(value) {\n return Math.round(value * 100000) / 100000 || 0;\n},\n _roundPrecise = function _roundPrecise(value) {\n return Math.round(value * 10000000) / 10000000 || 0;\n},\n // increased precision mostly for timing values.\n_arrayContainsAny = function _arrayContainsAny(toSearch, toFind) {\n //searches one array to find matches for any of the items in the toFind array. As soon as one is found, it returns true. It does NOT return all the matches; it's simply a boolean search.\n var l = toFind.length,\n i = 0;\n\n for (; toSearch.indexOf(toFind[i]) < 0 && ++i < l;) {}\n\n return i < l;\n},\n _lazyRender = function _lazyRender() {\n var l = _lazyTweens.length,\n a = _lazyTweens.slice(0),\n i,\n tween;\n\n _lazyLookup = {};\n _lazyTweens.length = 0;\n\n for (i = 0; i < l; i++) {\n tween = a[i];\n tween && tween._lazy && (tween.render(tween._lazy[0], tween._lazy[1], true)._lazy = 0);\n }\n},\n _lazySafeRender = function _lazySafeRender(animation, time, suppressEvents, force) {\n _lazyTweens.length && _lazyRender();\n animation.render(time, suppressEvents, force);\n _lazyTweens.length && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when someone calls seek() or time() or progress(), they expect an immediate render.\n},\n _numericIfPossible = function _numericIfPossible(value) {\n var n = parseFloat(value);\n return (n || n === 0) && (value + \"\").match(_delimitedValueExp).length < 2 ? n : _isString(value) ? value.trim() : value;\n},\n _passThrough = function _passThrough(p) {\n return p;\n},\n _setDefaults = function _setDefaults(obj, defaults) {\n for (var p in defaults) {\n p in obj || (obj[p] = defaults[p]);\n }\n\n return obj;\n},\n _setKeyframeDefaults = function _setKeyframeDefaults(excludeDuration) {\n return function (obj, defaults) {\n for (var p in defaults) {\n p in obj || p === \"duration\" && excludeDuration || p === \"ease\" || (obj[p] = defaults[p]);\n }\n };\n},\n _merge = function _merge(base, toMerge) {\n for (var p in toMerge) {\n base[p] = toMerge[p];\n }\n\n return base;\n},\n _mergeDeep = function _mergeDeep(base, toMerge) {\n for (var p in toMerge) {\n p !== \"__proto__\" && p !== \"constructor\" && p !== \"prototype\" && (base[p] = _isObject(toMerge[p]) ? _mergeDeep(base[p] || (base[p] = {}), toMerge[p]) : toMerge[p]);\n }\n\n return base;\n},\n _copyExcluding = function _copyExcluding(obj, excluding) {\n var copy = {},\n p;\n\n for (p in obj) {\n p in excluding || (copy[p] = obj[p]);\n }\n\n return copy;\n},\n _inheritDefaults = function _inheritDefaults(vars) {\n var parent = vars.parent || _globalTimeline,\n func = vars.keyframes ? _setKeyframeDefaults(_isArray(vars.keyframes)) : _setDefaults;\n\n if (_isNotFalse(vars.inherit)) {\n while (parent) {\n func(vars, parent.vars.defaults);\n parent = parent.parent || parent._dp;\n }\n }\n\n return vars;\n},\n _arraysMatch = function _arraysMatch(a1, a2) {\n var i = a1.length,\n match = i === a2.length;\n\n while (match && i-- && a1[i] === a2[i]) {}\n\n return i < 0;\n},\n _addLinkedListItem = function _addLinkedListItem(parent, child, firstProp, lastProp, sortBy) {\n if (firstProp === void 0) {\n firstProp = \"_first\";\n }\n\n if (lastProp === void 0) {\n lastProp = \"_last\";\n }\n\n var prev = parent[lastProp],\n t;\n\n if (sortBy) {\n t = child[sortBy];\n\n while (prev && prev[sortBy] > t) {\n prev = prev._prev;\n }\n }\n\n if (prev) {\n child._next = prev._next;\n prev._next = child;\n } else {\n child._next = parent[firstProp];\n parent[firstProp] = child;\n }\n\n if (child._next) {\n child._next._prev = child;\n } else {\n parent[lastProp] = child;\n }\n\n child._prev = prev;\n child.parent = child._dp = parent;\n return child;\n},\n _removeLinkedListItem = function _removeLinkedListItem(parent, child, firstProp, lastProp) {\n if (firstProp === void 0) {\n firstProp = \"_first\";\n }\n\n if (lastProp === void 0) {\n lastProp = \"_last\";\n }\n\n var prev = child._prev,\n next = child._next;\n\n if (prev) {\n prev._next = next;\n } else if (parent[firstProp] === child) {\n parent[firstProp] = next;\n }\n\n if (next) {\n next._prev = prev;\n } else if (parent[lastProp] === child) {\n parent[lastProp] = prev;\n }\n\n child._next = child._prev = child.parent = null; // don't delete the _dp just so we can revert if necessary. But parent should be null to indicate the item isn't in a linked list.\n},\n _removeFromParent = function _removeFromParent(child, onlyIfParentHasAutoRemove) {\n child.parent && (!onlyIfParentHasAutoRemove || child.parent.autoRemoveChildren) && child.parent.remove(child);\n child._act = 0;\n},\n _uncache = function _uncache(animation, child) {\n if (animation && (!child || child._end > animation._dur || child._start < 0)) {\n // performance optimization: if a child animation is passed in we should only uncache if that child EXTENDS the animation (its end time is beyond the end)\n var a = animation;\n\n while (a) {\n a._dirty = 1;\n a = a.parent;\n }\n }\n\n return animation;\n},\n _recacheAncestors = function _recacheAncestors(animation) {\n var parent = animation.parent;\n\n while (parent && parent.parent) {\n //sometimes we must force a re-sort of all children and update the duration/totalDuration of all ancestor timelines immediately in case, for example, in the middle of a render loop, one tween alters another tween's timeScale which shoves its startTime before 0, forcing the parent timeline to shift around and shiftChildren() which could affect that next tween's render (startTime). Doesn't matter for the root timeline though.\n parent._dirty = 1;\n parent.totalDuration();\n parent = parent.parent;\n }\n\n return animation;\n},\n _hasNoPausedAncestors = function _hasNoPausedAncestors(animation) {\n return !animation || animation._ts && _hasNoPausedAncestors(animation.parent);\n},\n _elapsedCycleDuration = function _elapsedCycleDuration(animation) {\n return animation._repeat ? _animationCycle(animation._tTime, animation = animation.duration() + animation._rDelay) * animation : 0;\n},\n // feed in the totalTime and cycleDuration and it'll return the cycle (iteration minus 1) and if the playhead is exactly at the very END, it will NOT bump up to the next cycle.\n_animationCycle = function _animationCycle(tTime, cycleDuration) {\n var whole = Math.floor(tTime /= cycleDuration);\n return tTime && whole === tTime ? whole - 1 : whole;\n},\n _parentToChildTotalTime = function _parentToChildTotalTime(parentTime, child) {\n return (parentTime - child._start) * child._ts + (child._ts >= 0 ? 0 : child._dirty ? child.totalDuration() : child._tDur);\n},\n _setEnd = function _setEnd(animation) {\n return animation._end = _roundPrecise(animation._start + (animation._tDur / Math.abs(animation._ts || animation._rts || _tinyNum) || 0));\n},\n _alignPlayhead = function _alignPlayhead(animation, totalTime) {\n // adjusts the animation's _start and _end according to the provided totalTime (only if the parent's smoothChildTiming is true and the animation isn't paused). It doesn't do any rendering or forcing things back into parent timelines, etc. - that's what totalTime() is for.\n var parent = animation._dp;\n\n if (parent && parent.smoothChildTiming && animation._ts) {\n animation._start = _roundPrecise(parent._time - (animation._ts > 0 ? totalTime / animation._ts : ((animation._dirty ? animation.totalDuration() : animation._tDur) - totalTime) / -animation._ts));\n\n _setEnd(animation);\n\n parent._dirty || _uncache(parent, animation); //for performance improvement. If the parent's cache is already dirty, it already took care of marking the ancestors as dirty too, so skip the function call here.\n }\n\n return animation;\n},\n\n/*\n_totalTimeToTime = (clampedTotalTime, duration, repeat, repeatDelay, yoyo) => {\n\tlet cycleDuration = duration + repeatDelay,\n\t\ttime = _round(clampedTotalTime % cycleDuration);\n\tif (time > duration) {\n\t\ttime = duration;\n\t}\n\treturn (yoyo && (~~(clampedTotalTime / cycleDuration) & 1)) ? duration - time : time;\n},\n*/\n_postAddChecks = function _postAddChecks(timeline, child) {\n var t;\n\n if (child._time || child._initted && !child._dur) {\n //in case, for example, the _start is moved on a tween that has already rendered. Imagine it's at its end state, then the startTime is moved WAY later (after the end of this timeline), it should render at its beginning.\n t = _parentToChildTotalTime(timeline.rawTime(), child);\n\n if (!child._dur || _clamp(0, child.totalDuration(), t) - child._tTime > _tinyNum) {\n child.render(t, true);\n }\n } //if the timeline has already ended but the inserted tween/timeline extends the duration, we should enable this timeline again so that it renders properly. We should also align the playhead with the parent timeline's when appropriate.\n\n\n if (_uncache(timeline, child)._dp && timeline._initted && timeline._time >= timeline._dur && timeline._ts) {\n //in case any of the ancestors had completed but should now be enabled...\n if (timeline._dur < timeline.duration()) {\n t = timeline;\n\n while (t._dp) {\n t.rawTime() >= 0 && t.totalTime(t._tTime); //moves the timeline (shifts its startTime) if necessary, and also enables it. If it's currently zero, though, it may not be scheduled to render until later so there's no need to force it to align with the current playhead position. Only move to catch up with the playhead.\n\n t = t._dp;\n }\n }\n\n timeline._zTime = -_tinyNum; // helps ensure that the next render() will be forced (crossingStart = true in render()), even if the duration hasn't changed (we're adding a child which would need to get rendered). Definitely an edge case. Note: we MUST do this AFTER the loop above where the totalTime() might trigger a render() because this _addToTimeline() method gets called from the Animation constructor, BEFORE tweens even record their targets, etc. so we wouldn't want things to get triggered in the wrong order.\n }\n},\n _addToTimeline = function _addToTimeline(timeline, child, position, skipChecks) {\n child.parent && _removeFromParent(child);\n child._start = _roundPrecise((_isNumber(position) ? position : position || timeline !== _globalTimeline ? _parsePosition(timeline, position, child) : timeline._time) + child._delay);\n child._end = _roundPrecise(child._start + (child.totalDuration() / Math.abs(child.timeScale()) || 0));\n\n _addLinkedListItem(timeline, child, \"_first\", \"_last\", timeline._sort ? \"_start\" : 0);\n\n _isFromOrFromStart(child) || (timeline._recent = child);\n skipChecks || _postAddChecks(timeline, child);\n return timeline;\n},\n _scrollTrigger = function _scrollTrigger(animation, trigger) {\n return (_globals.ScrollTrigger || _missingPlugin(\"scrollTrigger\", trigger)) && _globals.ScrollTrigger.create(trigger, animation);\n},\n _attemptInitTween = function _attemptInitTween(tween, totalTime, force, suppressEvents) {\n _initTween(tween, totalTime);\n\n if (!tween._initted) {\n return 1;\n }\n\n if (!force && tween._pt && (tween._dur && tween.vars.lazy !== false || !tween._dur && tween.vars.lazy) && _lastRenderedFrame !== _ticker.frame) {\n _lazyTweens.push(tween);\n\n tween._lazy = [totalTime, suppressEvents];\n return 1;\n }\n},\n _parentPlayheadIsBeforeStart = function _parentPlayheadIsBeforeStart(_ref) {\n var parent = _ref.parent;\n return parent && parent._ts && parent._initted && !parent._lock && (parent.rawTime() < 0 || _parentPlayheadIsBeforeStart(parent));\n},\n // check parent's _lock because when a timeline repeats/yoyos and does its artificial wrapping, we shouldn't force the ratio back to 0\n_isFromOrFromStart = function _isFromOrFromStart(_ref2) {\n var data = _ref2.data;\n return data === \"isFromStart\" || data === \"isStart\";\n},\n _renderZeroDurationTween = function _renderZeroDurationTween(tween, totalTime, suppressEvents, force) {\n var prevRatio = tween.ratio,\n ratio = totalTime < 0 || !totalTime && (!tween._start && _parentPlayheadIsBeforeStart(tween) && !(!tween._initted && _isFromOrFromStart(tween)) || (tween._ts < 0 || tween._dp._ts < 0) && !_isFromOrFromStart(tween)) ? 0 : 1,\n // if the tween or its parent is reversed and the totalTime is 0, we should go to a ratio of 0. Edge case: if a from() or fromTo() stagger tween is placed later in a timeline, the \"startAt\" zero-duration tween could initially render at a time when the parent timeline's playhead is technically BEFORE where this tween is, so make sure that any \"from\" and \"fromTo\" startAt tweens are rendered the first time at a ratio of 1.\n repeatDelay = tween._rDelay,\n tTime = 0,\n pt,\n iteration,\n prevIteration;\n\n if (repeatDelay && tween._repeat) {\n // in case there's a zero-duration tween that has a repeat with a repeatDelay\n tTime = _clamp(0, tween._tDur, totalTime);\n iteration = _animationCycle(tTime, repeatDelay);\n tween._yoyo && iteration & 1 && (ratio = 1 - ratio);\n\n if (iteration !== _animationCycle(tween._tTime, repeatDelay)) {\n // if iteration changed\n prevRatio = 1 - ratio;\n tween.vars.repeatRefresh && tween._initted && tween.invalidate();\n }\n }\n\n if (ratio !== prevRatio || force || tween._zTime === _tinyNum || !totalTime && tween._zTime) {\n if (!tween._initted && _attemptInitTween(tween, totalTime, force, suppressEvents)) {\n // if we render the very beginning (time == 0) of a fromTo(), we must force the render (normal tweens wouldn't need to render at a time of 0 when the prevTime was also 0). This is also mandatory to make sure overwriting kicks in immediately.\n return;\n }\n\n prevIteration = tween._zTime;\n tween._zTime = totalTime || (suppressEvents ? _tinyNum : 0); // when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration tween, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.\n\n suppressEvents || (suppressEvents = totalTime && !prevIteration); // if it was rendered previously at exactly 0 (_zTime) and now the playhead is moving away, DON'T fire callbacks otherwise they'll seem like duplicates.\n\n tween.ratio = ratio;\n tween._from && (ratio = 1 - ratio);\n tween._time = 0;\n tween._tTime = tTime;\n pt = tween._pt;\n\n while (pt) {\n pt.r(ratio, pt.d);\n pt = pt._next;\n }\n\n tween._startAt && totalTime < 0 && tween._startAt.render(totalTime, true, true);\n tween._onUpdate && !suppressEvents && _callback(tween, \"onUpdate\");\n tTime && tween._repeat && !suppressEvents && tween.parent && _callback(tween, \"onRepeat\");\n\n if ((totalTime >= tween._tDur || totalTime < 0) && tween.ratio === ratio) {\n ratio && _removeFromParent(tween, 1);\n\n if (!suppressEvents) {\n _callback(tween, ratio ? \"onComplete\" : \"onReverseComplete\", true);\n\n tween._prom && tween._prom();\n }\n }\n } else if (!tween._zTime) {\n tween._zTime = totalTime;\n }\n},\n _findNextPauseTween = function _findNextPauseTween(animation, prevTime, time) {\n var child;\n\n if (time > prevTime) {\n child = animation._first;\n\n while (child && child._start <= time) {\n if (child.data === \"isPause\" && child._start > prevTime) {\n return child;\n }\n\n child = child._next;\n }\n } else {\n child = animation._last;\n\n while (child && child._start >= time) {\n if (child.data === \"isPause\" && child._start < prevTime) {\n return child;\n }\n\n child = child._prev;\n }\n }\n},\n _setDuration = function _setDuration(animation, duration, skipUncache, leavePlayhead) {\n var repeat = animation._repeat,\n dur = _roundPrecise(duration) || 0,\n totalProgress = animation._tTime / animation._tDur;\n totalProgress && !leavePlayhead && (animation._time *= dur / animation._dur);\n animation._dur = dur;\n animation._tDur = !repeat ? dur : repeat < 0 ? 1e10 : _roundPrecise(dur * (repeat + 1) + animation._rDelay * repeat);\n totalProgress > 0 && !leavePlayhead ? _alignPlayhead(animation, animation._tTime = animation._tDur * totalProgress) : animation.parent && _setEnd(animation);\n skipUncache || _uncache(animation.parent, animation);\n return animation;\n},\n _onUpdateTotalDuration = function _onUpdateTotalDuration(animation) {\n return animation instanceof Timeline ? _uncache(animation) : _setDuration(animation, animation._dur);\n},\n _zeroPosition = {\n _start: 0,\n endTime: _emptyFunc,\n totalDuration: _emptyFunc\n},\n _parsePosition = function _parsePosition(animation, position, percentAnimation) {\n var labels = animation.labels,\n recent = animation._recent || _zeroPosition,\n clippedDuration = animation.duration() >= _bigNum ? recent.endTime(false) : animation._dur,\n //in case there's a child that infinitely repeats, users almost never intend for the insertion point of a new child to be based on a SUPER long value like that so we clip it and assume the most recently-added child's endTime should be used instead.\n i,\n offset,\n isPercent;\n\n if (_isString(position) && (isNaN(position) || position in labels)) {\n //if the string is a number like \"1\", check to see if there's a label with that name, otherwise interpret it as a number (absolute value).\n offset = position.charAt(0);\n isPercent = position.substr(-1) === \"%\";\n i = position.indexOf(\"=\");\n\n if (offset === \"<\" || offset === \">\") {\n i >= 0 && (position = position.replace(/=/, \"\"));\n return (offset === \"<\" ? recent._start : recent.endTime(recent._repeat >= 0)) + (parseFloat(position.substr(1)) || 0) * (isPercent ? (i < 0 ? recent : percentAnimation).totalDuration() / 100 : 1);\n }\n\n if (i < 0) {\n position in labels || (labels[position] = clippedDuration);\n return labels[position];\n }\n\n offset = parseFloat(position.charAt(i - 1) + position.substr(i + 1));\n\n if (isPercent && percentAnimation) {\n offset = offset / 100 * (_isArray(percentAnimation) ? percentAnimation[0] : percentAnimation).totalDuration();\n }\n\n return i > 1 ? _parsePosition(animation, position.substr(0, i - 1), percentAnimation) + offset : clippedDuration + offset;\n }\n\n return position == null ? clippedDuration : +position;\n},\n _createTweenType = function _createTweenType(type, params, timeline) {\n var isLegacy = _isNumber(params[1]),\n varsIndex = (isLegacy ? 2 : 1) + (type < 2 ? 0 : 1),\n vars = params[varsIndex],\n irVars,\n parent;\n\n isLegacy && (vars.duration = params[1]);\n vars.parent = timeline;\n\n if (type) {\n irVars = vars;\n parent = timeline;\n\n while (parent && !(\"immediateRender\" in irVars)) {\n // inheritance hasn't happened yet, but someone may have set a default in an ancestor timeline. We could do vars.immediateRender = _isNotFalse(_inheritDefaults(vars).immediateRender) but that'd exact a slight performance penalty because _inheritDefaults() also runs in the Tween constructor. We're paying a small kb price here to gain speed.\n irVars = parent.vars.defaults || {};\n parent = _isNotFalse(parent.vars.inherit) && parent.parent;\n }\n\n vars.immediateRender = _isNotFalse(irVars.immediateRender);\n type < 2 ? vars.runBackwards = 1 : vars.startAt = params[varsIndex - 1]; // \"from\" vars\n }\n\n return new Tween(params[0], vars, params[varsIndex + 1]);\n},\n _conditionalReturn = function _conditionalReturn(value, func) {\n return value || value === 0 ? func(value) : func;\n},\n _clamp = function _clamp(min, max, value) {\n return value < min ? min : value > max ? max : value;\n},\n getUnit = function getUnit(value, v) {\n return !_isString(value) || !(v = _unitExp.exec(value)) ? \"\" : value.substr(v.index + v[0].length);\n},\n // note: protect against padded numbers as strings, like \"100.100\". That shouldn't return \"00\" as the unit. If it's numeric, return no unit.\nclamp = function clamp(min, max, value) {\n return _conditionalReturn(value, function (v) {\n return _clamp(min, max, v);\n });\n},\n _slice = [].slice,\n _isArrayLike = function _isArrayLike(value, nonEmpty) {\n return value && _isObject(value) && \"length\" in value && (!nonEmpty && !value.length || value.length - 1 in value && _isObject(value[0])) && !value.nodeType && value !== _win;\n},\n _flatten = function _flatten(ar, leaveStrings, accumulator) {\n if (accumulator === void 0) {\n accumulator = [];\n }\n\n return ar.forEach(function (value) {\n var _accumulator;\n\n return _isString(value) && !leaveStrings || _isArrayLike(value, 1) ? (_accumulator = accumulator).push.apply(_accumulator, toArray(value)) : accumulator.push(value);\n }) || accumulator;\n},\n //takes any value and returns an array. If it's a string (and leaveStrings isn't true), it'll use document.querySelectorAll() and convert that to an array. It'll also accept iterables like jQuery objects.\ntoArray = function toArray(value, scope, leaveStrings) {\n return _isString(value) && !leaveStrings && (_coreInitted || !_wake()) ? _slice.call((scope || _doc).querySelectorAll(value), 0) : _isArray(value) ? _flatten(value, leaveStrings) : _isArrayLike(value) ? _slice.call(value, 0) : value ? [value] : [];\n},\n selector = function selector(value) {\n value = toArray(value)[0] || _warn(\"Invalid scope\") || {};\n return function (v) {\n var el = value.current || value.nativeElement || value;\n return toArray(v, el.querySelectorAll ? el : el === value ? _warn(\"Invalid scope\") || _doc.createElement(\"div\") : value);\n };\n},\n shuffle = function shuffle(a) {\n return a.sort(function () {\n return .5 - Math.random();\n });\n},\n // alternative that's a bit faster and more reliably diverse but bigger: for (let j, v, i = a.length; i; j = Math.floor(Math.random() * i), v = a[--i], a[i] = a[j], a[j] = v); return a;\n//for distributing values across an array. Can accept a number, a function or (most commonly) a function which can contain the following properties: {base, amount, from, ease, grid, axis, length, each}. Returns a function that expects the following parameters: index, target, array. Recognizes the following\ndistribute = function distribute(v) {\n if (_isFunction(v)) {\n return v;\n }\n\n var vars = _isObject(v) ? v : {\n each: v\n },\n //n:1 is just to indicate v was a number; we leverage that later to set v according to the length we get. If a number is passed in, we treat it like the old stagger value where 0.1, for example, would mean that things would be distributed with 0.1 between each element in the array rather than a total \"amount\" that's chunked out among them all.\n ease = _parseEase(vars.ease),\n from = vars.from || 0,\n base = parseFloat(vars.base) || 0,\n cache = {},\n isDecimal = from > 0 && from < 1,\n ratios = isNaN(from) || isDecimal,\n axis = vars.axis,\n ratioX = from,\n ratioY = from;\n\n if (_isString(from)) {\n ratioX = ratioY = {\n center: .5,\n edges: .5,\n end: 1\n }[from] || 0;\n } else if (!isDecimal && ratios) {\n ratioX = from[0];\n ratioY = from[1];\n }\n\n return function (i, target, a) {\n var l = (a || vars).length,\n distances = cache[l],\n originX,\n originY,\n x,\n y,\n d,\n j,\n max,\n min,\n wrapAt;\n\n if (!distances) {\n wrapAt = vars.grid === \"auto\" ? 0 : (vars.grid || [1, _bigNum])[1];\n\n if (!wrapAt) {\n max = -_bigNum;\n\n while (max < (max = a[wrapAt++].getBoundingClientRect().left) && wrapAt < l) {}\n\n wrapAt--;\n }\n\n distances = cache[l] = [];\n originX = ratios ? Math.min(wrapAt, l) * ratioX - .5 : from % wrapAt;\n originY = wrapAt === _bigNum ? 0 : ratios ? l * ratioY / wrapAt - .5 : from / wrapAt | 0;\n max = 0;\n min = _bigNum;\n\n for (j = 0; j < l; j++) {\n x = j % wrapAt - originX;\n y = originY - (j / wrapAt | 0);\n distances[j] = d = !axis ? _sqrt(x * x + y * y) : Math.abs(axis === \"y\" ? y : x);\n d > max && (max = d);\n d < min && (min = d);\n }\n\n from === \"random\" && shuffle(distances);\n distances.max = max - min;\n distances.min = min;\n distances.v = l = (parseFloat(vars.amount) || parseFloat(vars.each) * (wrapAt > l ? l - 1 : !axis ? Math.max(wrapAt, l / wrapAt) : axis === \"y\" ? l / wrapAt : wrapAt) || 0) * (from === \"edges\" ? -1 : 1);\n distances.b = l < 0 ? base - l : base;\n distances.u = getUnit(vars.amount || vars.each) || 0; //unit\n\n ease = ease && l < 0 ? _invertEase(ease) : ease;\n }\n\n l = (distances[i] - distances.min) / distances.max || 0;\n return _roundPrecise(distances.b + (ease ? ease(l) : l) * distances.v) + distances.u; //round in order to work around floating point errors\n };\n},\n _roundModifier = function _roundModifier(v) {\n //pass in 0.1 get a function that'll round to the nearest tenth, or 5 to round to the closest 5, or 0.001 to the closest 1000th, etc.\n var p = Math.pow(10, ((v + \"\").split(\".\")[1] || \"\").length); //to avoid floating point math errors (like 24 * 0.1 == 2.4000000000000004), we chop off at a specific number of decimal places (much faster than toFixed())\n\n return function (raw) {\n var n = Math.round(parseFloat(raw) / v) * v * p;\n return (n - n % 1) / p + (_isNumber(raw) ? 0 : getUnit(raw)); // n - n % 1 replaces Math.floor() in order to handle negative values properly. For example, Math.floor(-150.00000000000003) is 151!\n };\n},\n snap = function snap(snapTo, value) {\n var isArray = _isArray(snapTo),\n radius,\n is2D;\n\n if (!isArray && _isObject(snapTo)) {\n radius = isArray = snapTo.radius || _bigNum;\n\n if (snapTo.values) {\n snapTo = toArray(snapTo.values);\n\n if (is2D = !_isNumber(snapTo[0])) {\n radius *= radius; //performance optimization so we don't have to Math.sqrt() in the loop.\n }\n } else {\n snapTo = _roundModifier(snapTo.increment);\n }\n }\n\n return _conditionalReturn(value, !isArray ? _roundModifier(snapTo) : _isFunction(snapTo) ? function (raw) {\n is2D = snapTo(raw);\n return Math.abs(is2D - raw) <= radius ? is2D : raw;\n } : function (raw) {\n var x = parseFloat(is2D ? raw.x : raw),\n y = parseFloat(is2D ? raw.y : 0),\n min = _bigNum,\n closest = 0,\n i = snapTo.length,\n dx,\n dy;\n\n while (i--) {\n if (is2D) {\n dx = snapTo[i].x - x;\n dy = snapTo[i].y - y;\n dx = dx * dx + dy * dy;\n } else {\n dx = Math.abs(snapTo[i] - x);\n }\n\n if (dx < min) {\n min = dx;\n closest = i;\n }\n }\n\n closest = !radius || min <= radius ? snapTo[closest] : raw;\n return is2D || closest === raw || _isNumber(raw) ? closest : closest + getUnit(raw);\n });\n},\n random = function random(min, max, roundingIncrement, returnFunction) {\n return _conditionalReturn(_isArray(min) ? !max : roundingIncrement === true ? !!(roundingIncrement = 0) : !returnFunction, function () {\n return _isArray(min) ? min[~~(Math.random() * min.length)] : (roundingIncrement = roundingIncrement || 1e-5) && (returnFunction = roundingIncrement < 1 ? Math.pow(10, (roundingIncrement + \"\").length - 2) : 1) && Math.floor(Math.round((min - roundingIncrement / 2 + Math.random() * (max - min + roundingIncrement * .99)) / roundingIncrement) * roundingIncrement * returnFunction) / returnFunction;\n });\n},\n pipe = function pipe() {\n for (var _len = arguments.length, functions = new Array(_len), _key = 0; _key < _len; _key++) {\n functions[_key] = arguments[_key];\n }\n\n return function (value) {\n return functions.reduce(function (v, f) {\n return f(v);\n }, value);\n };\n},\n unitize = function unitize(func, unit) {\n return function (value) {\n return func(parseFloat(value)) + (unit || getUnit(value));\n };\n},\n normalize = function normalize(min, max, value) {\n return mapRange(min, max, 0, 1, value);\n},\n _wrapArray = function _wrapArray(a, wrapper, value) {\n return _conditionalReturn(value, function (index) {\n return a[~~wrapper(index)];\n });\n},\n wrap = function wrap(min, max, value) {\n // NOTE: wrap() CANNOT be an arrow function! A very odd compiling bug causes problems (unrelated to GSAP).\n var range = max - min;\n return _isArray(min) ? _wrapArray(min, wrap(0, min.length), max) : _conditionalReturn(value, function (value) {\n return (range + (value - min) % range) % range + min;\n });\n},\n wrapYoyo = function wrapYoyo(min, max, value) {\n var range = max - min,\n total = range * 2;\n return _isArray(min) ? _wrapArray(min, wrapYoyo(0, min.length - 1), max) : _conditionalReturn(value, function (value) {\n value = (total + (value - min) % total) % total || 0;\n return min + (value > range ? total - value : value);\n });\n},\n _replaceRandom = function _replaceRandom(value) {\n //replaces all occurrences of random(...) in a string with the calculated random value. can be a range like random(-100, 100, 5) or an array like random([0, 100, 500])\n var prev = 0,\n s = \"\",\n i,\n nums,\n end,\n isArray;\n\n while (~(i = value.indexOf(\"random(\", prev))) {\n end = value.indexOf(\")\", i);\n isArray = value.charAt(i + 7) === \"[\";\n nums = value.substr(i + 7, end - i - 7).match(isArray ? _delimitedValueExp : _strictNumExp);\n s += value.substr(prev, i - prev) + random(isArray ? nums : +nums[0], isArray ? 0 : +nums[1], +nums[2] || 1e-5);\n prev = end + 1;\n }\n\n return s + value.substr(prev, value.length - prev);\n},\n mapRange = function mapRange(inMin, inMax, outMin, outMax, value) {\n var inRange = inMax - inMin,\n outRange = outMax - outMin;\n return _conditionalReturn(value, function (value) {\n return outMin + ((value - inMin) / inRange * outRange || 0);\n });\n},\n interpolate = function interpolate(start, end, progress, mutate) {\n var func = isNaN(start + end) ? 0 : function (p) {\n return (1 - p) * start + p * end;\n };\n\n if (!func) {\n var isString = _isString(start),\n master = {},\n p,\n i,\n interpolators,\n l,\n il;\n\n progress === true && (mutate = 1) && (progress = null);\n\n if (isString) {\n start = {\n p: start\n };\n end = {\n p: end\n };\n } else if (_isArray(start) && !_isArray(end)) {\n interpolators = [];\n l = start.length;\n il = l - 2;\n\n for (i = 1; i < l; i++) {\n interpolators.push(interpolate(start[i - 1], start[i])); //build the interpolators up front as a performance optimization so that when the function is called many times, it can just reuse them.\n }\n\n l--;\n\n func = function func(p) {\n p *= l;\n var i = Math.min(il, ~~p);\n return interpolators[i](p - i);\n };\n\n progress = end;\n } else if (!mutate) {\n start = _merge(_isArray(start) ? [] : {}, start);\n }\n\n if (!interpolators) {\n for (p in end) {\n _addPropTween.call(master, start, p, \"get\", end[p]);\n }\n\n func = function func(p) {\n return _renderPropTweens(p, master) || (isString ? start.p : start);\n };\n }\n }\n\n return _conditionalReturn(progress, func);\n},\n _getLabelInDirection = function _getLabelInDirection(timeline, fromTime, backward) {\n //used for nextLabel() and previousLabel()\n var labels = timeline.labels,\n min = _bigNum,\n p,\n distance,\n label;\n\n for (p in labels) {\n distance = labels[p] - fromTime;\n\n if (distance < 0 === !!backward && distance && min > (distance = Math.abs(distance))) {\n label = p;\n min = distance;\n }\n }\n\n return label;\n},\n _callback = function _callback(animation, type, executeLazyFirst) {\n var v = animation.vars,\n callback = v[type],\n params,\n scope;\n\n if (!callback) {\n return;\n }\n\n params = v[type + \"Params\"];\n scope = v.callbackScope || animation;\n executeLazyFirst && _lazyTweens.length && _lazyRender(); //in case rendering caused any tweens to lazy-init, we should render them because typically when a timeline finishes, users expect things to have rendered fully. Imagine an onUpdate on a timeline that reports/checks tweened values.\n\n return params ? callback.apply(scope, params) : callback.call(scope);\n},\n _interrupt = function _interrupt(animation) {\n _removeFromParent(animation);\n\n animation.scrollTrigger && animation.scrollTrigger.kill(false);\n animation.progress() < 1 && _callback(animation, \"onInterrupt\");\n return animation;\n},\n _quickTween,\n _createPlugin = function _createPlugin(config) {\n config = !config.name && config[\"default\"] || config; //UMD packaging wraps things oddly, so for example MotionPathHelper becomes {MotionPathHelper:MotionPathHelper, default:MotionPathHelper}.\n\n var name = config.name,\n isFunc = _isFunction(config),\n Plugin = name && !isFunc && config.init ? function () {\n this._props = [];\n } : config,\n //in case someone passes in an object that's not a plugin, like CustomEase\n instanceDefaults = {\n init: _emptyFunc,\n render: _renderPropTweens,\n add: _addPropTween,\n kill: _killPropTweensOf,\n modifier: _addPluginModifier,\n rawVars: 0\n },\n statics = {\n targetTest: 0,\n get: 0,\n getSetter: _getSetter,\n aliases: {},\n register: 0\n };\n\n _wake();\n\n if (config !== Plugin) {\n if (_plugins[name]) {\n return;\n }\n\n _setDefaults(Plugin, _setDefaults(_copyExcluding(config, instanceDefaults), statics)); //static methods\n\n\n _merge(Plugin.prototype, _merge(instanceDefaults, _copyExcluding(config, statics))); //instance methods\n\n\n _plugins[Plugin.prop = name] = Plugin;\n\n if (config.targetTest) {\n _harnessPlugins.push(Plugin);\n\n _reservedProps[name] = 1;\n }\n\n name = (name === \"css\" ? \"CSS\" : name.charAt(0).toUpperCase() + name.substr(1)) + \"Plugin\"; //for the global name. \"motionPath\" should become MotionPathPlugin\n }\n\n _addGlobal(name, Plugin);\n\n config.register && config.register(gsap, Plugin, PropTween);\n},\n\n/*\n * --------------------------------------------------------------------------------------\n * COLORS\n * --------------------------------------------------------------------------------------\n */\n_255 = 255,\n _colorLookup = {\n aqua: [0, _255, _255],\n lime: [0, _255, 0],\n silver: [192, 192, 192],\n black: [0, 0, 0],\n maroon: [128, 0, 0],\n teal: [0, 128, 128],\n blue: [0, 0, _255],\n navy: [0, 0, 128],\n white: [_255, _255, _255],\n olive: [128, 128, 0],\n yellow: [_255, _255, 0],\n orange: [_255, 165, 0],\n gray: [128, 128, 128],\n purple: [128, 0, 128],\n green: [0, 128, 0],\n red: [_255, 0, 0],\n pink: [_255, 192, 203],\n cyan: [0, _255, _255],\n transparent: [_255, _255, _255, 0]\n},\n // possible future idea to replace the hard-coded color name values - put this in the ticker.wake() where we set the _doc:\n// let ctx = _doc.createElement(\"canvas\").getContext(\"2d\");\n// _forEachName(\"aqua,lime,silver,black,maroon,teal,blue,navy,white,olive,yellow,orange,gray,purple,green,red,pink,cyan\", color => {ctx.fillStyle = color; _colorLookup[color] = splitColor(ctx.fillStyle)});\n_hue = function _hue(h, m1, m2) {\n h += h < 0 ? 1 : h > 1 ? -1 : 0;\n return (h * 6 < 1 ? m1 + (m2 - m1) * h * 6 : h < .5 ? m2 : h * 3 < 2 ? m1 + (m2 - m1) * (2 / 3 - h) * 6 : m1) * _255 + .5 | 0;\n},\n splitColor = function splitColor(v, toHSL, forceAlpha) {\n var a = !v ? _colorLookup.black : _isNumber(v) ? [v >> 16, v >> 8 & _255, v & _255] : 0,\n r,\n g,\n b,\n h,\n s,\n l,\n max,\n min,\n d,\n wasHSL;\n\n if (!a) {\n if (v.substr(-1) === \",\") {\n //sometimes a trailing comma is included and we should chop it off (typically from a comma-delimited list of values like a textShadow:\"2px 2px 2px blue, 5px 5px 5px rgb(255,0,0)\" - in this example \"blue,\" has a trailing comma. We could strip it out inside parseComplex() but we'd need to do it to the beginning and ending values plus it wouldn't provide protection from other potential scenarios like if the user passes in a similar value.\n v = v.substr(0, v.length - 1);\n }\n\n if (_colorLookup[v]) {\n a = _colorLookup[v];\n } else if (v.charAt(0) === \"#\") {\n if (v.length < 6) {\n //for shorthand like #9F0 or #9F0F (could have alpha)\n r = v.charAt(1);\n g = v.charAt(2);\n b = v.charAt(3);\n v = \"#\" + r + r + g + g + b + b + (v.length === 5 ? v.charAt(4) + v.charAt(4) : \"\");\n }\n\n if (v.length === 9) {\n // hex with alpha, like #fd5e53ff\n a = parseInt(v.substr(1, 6), 16);\n return [a >> 16, a >> 8 & _255, a & _255, parseInt(v.substr(7), 16) / 255];\n }\n\n v = parseInt(v.substr(1), 16);\n a = [v >> 16, v >> 8 & _255, v & _255];\n } else if (v.substr(0, 3) === \"hsl\") {\n a = wasHSL = v.match(_strictNumExp);\n\n if (!toHSL) {\n h = +a[0] % 360 / 360;\n s = +a[1] / 100;\n l = +a[2] / 100;\n g = l <= .5 ? l * (s + 1) : l + s - l * s;\n r = l * 2 - g;\n a.length > 3 && (a[3] *= 1); //cast as number\n\n a[0] = _hue(h + 1 / 3, r, g);\n a[1] = _hue(h, r, g);\n a[2] = _hue(h - 1 / 3, r, g);\n } else if (~v.indexOf(\"=\")) {\n //if relative values are found, just return the raw strings with the relative prefixes in place.\n a = v.match(_numExp);\n forceAlpha && a.length < 4 && (a[3] = 1);\n return a;\n }\n } else {\n a = v.match(_strictNumExp) || _colorLookup.transparent;\n }\n\n a = a.map(Number);\n }\n\n if (toHSL && !wasHSL) {\n r = a[0] / _255;\n g = a[1] / _255;\n b = a[2] / _255;\n max = Math.max(r, g, b);\n min = Math.min(r, g, b);\n l = (max + min) / 2;\n\n if (max === min) {\n h = s = 0;\n } else {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = max === r ? (g - b) / d + (g < b ? 6 : 0) : max === g ? (b - r) / d + 2 : (r - g) / d + 4;\n h *= 60;\n }\n\n a[0] = ~~(h + .5);\n a[1] = ~~(s * 100 + .5);\n a[2] = ~~(l * 100 + .5);\n }\n\n forceAlpha && a.length < 4 && (a[3] = 1);\n return a;\n},\n _colorOrderData = function _colorOrderData(v) {\n // strips out the colors from the string, finds all the numeric slots (with units) and returns an array of those. The Array also has a \"c\" property which is an Array of the index values where the colors belong. This is to help work around issues where there's a mis-matched order of color/numeric data like drop-shadow(#f00 0px 1px 2px) and drop-shadow(0x 1px 2px #f00). This is basically a helper function used in _formatColors()\n var values = [],\n c = [],\n i = -1;\n v.split(_colorExp).forEach(function (v) {\n var a = v.match(_numWithUnitExp) || [];\n values.push.apply(values, a);\n c.push(i += a.length + 1);\n });\n values.c = c;\n return values;\n},\n _formatColors = function _formatColors(s, toHSL, orderMatchData) {\n var result = \"\",\n colors = (s + result).match(_colorExp),\n type = toHSL ? \"hsla(\" : \"rgba(\",\n i = 0,\n c,\n shell,\n d,\n l;\n\n if (!colors) {\n return s;\n }\n\n colors = colors.map(function (color) {\n return (color = splitColor(color, toHSL, 1)) && type + (toHSL ? color[0] + \",\" + color[1] + \"%,\" + color[2] + \"%,\" + color[3] : color.join(\",\")) + \")\";\n });\n\n if (orderMatchData) {\n d = _colorOrderData(s);\n c = orderMatchData.c;\n\n if (c.join(result) !== d.c.join(result)) {\n shell = s.replace(_colorExp, \"1\").split(_numWithUnitExp);\n l = shell.length - 1;\n\n for (; i < l; i++) {\n result += shell[i] + (~c.indexOf(i) ? colors.shift() || type + \"0,0,0,0)\" : (d.length ? d : colors.length ? colors : orderMatchData).shift());\n }\n }\n }\n\n if (!shell) {\n shell = s.split(_colorExp);\n l = shell.length - 1;\n\n for (; i < l; i++) {\n result += shell[i] + colors[i];\n }\n }\n\n return result + shell[l];\n},\n _colorExp = function () {\n var s = \"(?:\\\\b(?:(?:rgb|rgba|hsl|hsla)\\\\(.+?\\\\))|\\\\B#(?:[0-9a-f]{3,4}){1,2}\\\\b\",\n //we'll dynamically build this Regular Expression to conserve file size. After building it, it will be able to find rgb(), rgba(), # (hexadecimal), and named color values like red, blue, purple, etc.,\n p;\n\n for (p in _colorLookup) {\n s += \"|\" + p + \"\\\\b\";\n }\n\n return new RegExp(s + \")\", \"gi\");\n}(),\n _hslExp = /hsl[a]?\\(/,\n _colorStringFilter = function _colorStringFilter(a) {\n var combined = a.join(\" \"),\n toHSL;\n _colorExp.lastIndex = 0;\n\n if (_colorExp.test(combined)) {\n toHSL = _hslExp.test(combined);\n a[1] = _formatColors(a[1], toHSL);\n a[0] = _formatColors(a[0], toHSL, _colorOrderData(a[1])); // make sure the order of numbers/colors match with the END value.\n\n return true;\n }\n},\n\n/*\n * --------------------------------------------------------------------------------------\n * TICKER\n * --------------------------------------------------------------------------------------\n */\n_tickerActive,\n _ticker = function () {\n var _getTime = Date.now,\n _lagThreshold = 500,\n _adjustedLag = 33,\n _startTime = _getTime(),\n _lastUpdate = _startTime,\n _gap = 1000 / 240,\n _nextTime = _gap,\n _listeners = [],\n _id,\n _req,\n _raf,\n _self,\n _delta,\n _i,\n _tick = function _tick(v) {\n var elapsed = _getTime() - _lastUpdate,\n manual = v === true,\n overlap,\n dispatch,\n time,\n frame;\n\n elapsed > _lagThreshold && (_startTime += elapsed - _adjustedLag);\n _lastUpdate += elapsed;\n time = _lastUpdate - _startTime;\n overlap = time - _nextTime;\n\n if (overlap > 0 || manual) {\n frame = ++_self.frame;\n _delta = time - _self.time * 1000;\n _self.time = time = time / 1000;\n _nextTime += overlap + (overlap >= _gap ? 4 : _gap - overlap);\n dispatch = 1;\n }\n\n manual || (_id = _req(_tick)); //make sure the request is made before we dispatch the \"tick\" event so that timing is maintained. Otherwise, if processing the \"tick\" requires a bunch of time (like 15ms) and we're using a setTimeout() that's based on 16.7ms, it'd technically take 31.7ms between frames otherwise.\n\n if (dispatch) {\n for (_i = 0; _i < _listeners.length; _i++) {\n // use _i and check _listeners.length instead of a variable because a listener could get removed during the loop, and if that happens to an element less than the current index, it'd throw things off in the loop.\n _listeners[_i](time, _delta, frame, v);\n }\n }\n };\n\n _self = {\n time: 0,\n frame: 0,\n tick: function tick() {\n _tick(true);\n },\n deltaRatio: function deltaRatio(fps) {\n return _delta / (1000 / (fps || 60));\n },\n wake: function wake() {\n if (_coreReady) {\n if (!_coreInitted && _windowExists()) {\n _win = _coreInitted = window;\n _doc = _win.document || {};\n _globals.gsap = gsap;\n (_win.gsapVersions || (_win.gsapVersions = [])).push(gsap.version);\n\n _install(_installScope || _win.GreenSockGlobals || !_win.gsap && _win || {});\n\n _raf = _win.requestAnimationFrame;\n }\n\n _id && _self.sleep();\n\n _req = _raf || function (f) {\n return setTimeout(f, _nextTime - _self.time * 1000 + 1 | 0);\n };\n\n _tickerActive = 1;\n\n _tick(2);\n }\n },\n sleep: function sleep() {\n (_raf ? _win.cancelAnimationFrame : clearTimeout)(_id);\n _tickerActive = 0;\n _req = _emptyFunc;\n },\n lagSmoothing: function lagSmoothing(threshold, adjustedLag) {\n _lagThreshold = threshold || 1 / _tinyNum; //zero should be interpreted as basically unlimited\n\n _adjustedLag = Math.min(adjustedLag, _lagThreshold, 0);\n },\n fps: function fps(_fps) {\n _gap = 1000 / (_fps || 240);\n _nextTime = _self.time * 1000 + _gap;\n },\n add: function add(callback) {\n _listeners.indexOf(callback) < 0 && _listeners.push(callback);\n\n _wake();\n },\n remove: function remove(callback, i) {\n ~(i = _listeners.indexOf(callback)) && _listeners.splice(i, 1) && _i >= i && _i--;\n },\n _listeners: _listeners\n };\n return _self;\n}(),\n _wake = function _wake() {\n return !_tickerActive && _ticker.wake();\n},\n //also ensures the core classes are initialized.\n\n/*\n* -------------------------------------------------\n* EASING\n* -------------------------------------------------\n*/\n_easeMap = {},\n _customEaseExp = /^[\\d.\\-M][\\d.\\-,\\s]/,\n _quotesExp = /[\"']/g,\n _parseObjectInString = function _parseObjectInString(value) {\n //takes a string like \"{wiggles:10, type:anticipate})\" and turns it into a real object. Notice it ends in \")\" and includes the {} wrappers. This is because we only use this function for parsing ease configs and prioritized optimization rather than reusability.\n var obj = {},\n split = value.substr(1, value.length - 3).split(\":\"),\n key = split[0],\n i = 1,\n l = split.length,\n index,\n val,\n parsedVal;\n\n for (; i < l; i++) {\n val = split[i];\n index = i !== l - 1 ? val.lastIndexOf(\",\") : val.length;\n parsedVal = val.substr(0, index);\n obj[key] = isNaN(parsedVal) ? parsedVal.replace(_quotesExp, \"\").trim() : +parsedVal;\n key = val.substr(index + 1).trim();\n }\n\n return obj;\n},\n _valueInParentheses = function _valueInParentheses(value) {\n var open = value.indexOf(\"(\") + 1,\n close = value.indexOf(\")\"),\n nested = value.indexOf(\"(\", open);\n return value.substring(open, ~nested && nested < close ? value.indexOf(\")\", close + 1) : close);\n},\n _configEaseFromString = function _configEaseFromString(name) {\n //name can be a string like \"elastic.out(1,0.5)\", and pass in _easeMap as obj and it'll parse it out and call the actual function like _easeMap.Elastic.easeOut.config(1,0.5). It will also parse custom ease strings as long as CustomEase is loaded and registered (internally as _easeMap._CE).\n var split = (name + \"\").split(\"(\"),\n ease = _easeMap[split[0]];\n return ease && split.length > 1 && ease.config ? ease.config.apply(null, ~name.indexOf(\"{\") ? [_parseObjectInString(split[1])] : _valueInParentheses(name).split(\",\").map(_numericIfPossible)) : _easeMap._CE && _customEaseExp.test(name) ? _easeMap._CE(\"\", name) : ease;\n},\n _invertEase = function _invertEase(ease) {\n return function (p) {\n return 1 - ease(1 - p);\n };\n},\n // allow yoyoEase to be set in children and have those affected when the parent/ancestor timeline yoyos.\n_propagateYoyoEase = function _propagateYoyoEase(timeline, isYoyo) {\n var child = timeline._first,\n ease;\n\n while (child) {\n if (child instanceof Timeline) {\n _propagateYoyoEase(child, isYoyo);\n } else if (child.vars.yoyoEase && (!child._yoyo || !child._repeat) && child._yoyo !== isYoyo) {\n if (child.timeline) {\n _propagateYoyoEase(child.timeline, isYoyo);\n } else {\n ease = child._ease;\n child._ease = child._yEase;\n child._yEase = ease;\n child._yoyo = isYoyo;\n }\n }\n\n child = child._next;\n }\n},\n _parseEase = function _parseEase(ease, defaultEase) {\n return !ease ? defaultEase : (_isFunction(ease) ? ease : _easeMap[ease] || _configEaseFromString(ease)) || defaultEase;\n},\n _insertEase = function _insertEase(names, easeIn, easeOut, easeInOut) {\n if (easeOut === void 0) {\n easeOut = function easeOut(p) {\n return 1 - easeIn(1 - p);\n };\n }\n\n if (easeInOut === void 0) {\n easeInOut = function easeInOut(p) {\n return p < .5 ? easeIn(p * 2) / 2 : 1 - easeIn((1 - p) * 2) / 2;\n };\n }\n\n var ease = {\n easeIn: easeIn,\n easeOut: easeOut,\n easeInOut: easeInOut\n },\n lowercaseName;\n\n _forEachName(names, function (name) {\n _easeMap[name] = _globals[name] = ease;\n _easeMap[lowercaseName = name.toLowerCase()] = easeOut;\n\n for (var p in ease) {\n _easeMap[lowercaseName + (p === \"easeIn\" ? \".in\" : p === \"easeOut\" ? \".out\" : \".inOut\")] = _easeMap[name + \".\" + p] = ease[p];\n }\n });\n\n return ease;\n},\n _easeInOutFromOut = function _easeInOutFromOut(easeOut) {\n return function (p) {\n return p < .5 ? (1 - easeOut(1 - p * 2)) / 2 : .5 + easeOut((p - .5) * 2) / 2;\n };\n},\n _configElastic = function _configElastic(type, amplitude, period) {\n var p1 = amplitude >= 1 ? amplitude : 1,\n //note: if amplitude is < 1, we simply adjust the period for a more natural feel. Otherwise the math doesn't work right and the curve starts at 1.\n p2 = (period || (type ? .3 : .45)) / (amplitude < 1 ? amplitude : 1),\n p3 = p2 / _2PI * (Math.asin(1 / p1) || 0),\n easeOut = function easeOut(p) {\n return p === 1 ? 1 : p1 * Math.pow(2, -10 * p) * _sin((p - p3) * p2) + 1;\n },\n ease = type === \"out\" ? easeOut : type === \"in\" ? function (p) {\n return 1 - easeOut(1 - p);\n } : _easeInOutFromOut(easeOut);\n\n p2 = _2PI / p2; //precalculate to optimize\n\n ease.config = function (amplitude, period) {\n return _configElastic(type, amplitude, period);\n };\n\n return ease;\n},\n _configBack = function _configBack(type, overshoot) {\n if (overshoot === void 0) {\n overshoot = 1.70158;\n }\n\n var easeOut = function easeOut(p) {\n return p ? --p * p * ((overshoot + 1) * p + overshoot) + 1 : 0;\n },\n ease = type === \"out\" ? easeOut : type === \"in\" ? function (p) {\n return 1 - easeOut(1 - p);\n } : _easeInOutFromOut(easeOut);\n\n ease.config = function (overshoot) {\n return _configBack(type, overshoot);\n };\n\n return ease;\n}; // a cheaper (kb and cpu) but more mild way to get a parameterized weighted ease by feeding in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.\n// _weightedEase = ratio => {\n// \tlet y = 0.5 + ratio / 2;\n// \treturn p => (2 * (1 - p) * p * y + p * p);\n// },\n// a stronger (but more expensive kb/cpu) parameterized weighted ease that lets you feed in a value between -1 (easeIn) and 1 (easeOut) where 0 is linear.\n// _weightedEaseStrong = ratio => {\n// \tratio = .5 + ratio / 2;\n// \tlet o = 1 / 3 * (ratio < .5 ? ratio : 1 - ratio),\n// \t\tb = ratio - o,\n// \t\tc = ratio + o;\n// \treturn p => p === 1 ? p : 3 * b * (1 - p) * (1 - p) * p + 3 * c * (1 - p) * p * p + p * p * p;\n// };\n\n\n_forEachName(\"Linear,Quad,Cubic,Quart,Quint,Strong\", function (name, i) {\n var power = i < 5 ? i + 1 : i;\n\n _insertEase(name + \",Power\" + (power - 1), i ? function (p) {\n return Math.pow(p, power);\n } : function (p) {\n return p;\n }, function (p) {\n return 1 - Math.pow(1 - p, power);\n }, function (p) {\n return p < .5 ? Math.pow(p * 2, power) / 2 : 1 - Math.pow((1 - p) * 2, power) / 2;\n });\n});\n\n_easeMap.Linear.easeNone = _easeMap.none = _easeMap.Linear.easeIn;\n\n_insertEase(\"Elastic\", _configElastic(\"in\"), _configElastic(\"out\"), _configElastic());\n\n(function (n, c) {\n var n1 = 1 / c,\n n2 = 2 * n1,\n n3 = 2.5 * n1,\n easeOut = function easeOut(p) {\n return p < n1 ? n * p * p : p < n2 ? n * Math.pow(p - 1.5 / c, 2) + .75 : p < n3 ? n * (p -= 2.25 / c) * p + .9375 : n * Math.pow(p - 2.625 / c, 2) + .984375;\n };\n\n _insertEase(\"Bounce\", function (p) {\n return 1 - easeOut(1 - p);\n }, easeOut);\n})(7.5625, 2.75);\n\n_insertEase(\"Expo\", function (p) {\n return p ? Math.pow(2, 10 * (p - 1)) : 0;\n});\n\n_insertEase(\"Circ\", function (p) {\n return -(_sqrt(1 - p * p) - 1);\n});\n\n_insertEase(\"Sine\", function (p) {\n return p === 1 ? 1 : -_cos(p * _HALF_PI) + 1;\n});\n\n_insertEase(\"Back\", _configBack(\"in\"), _configBack(\"out\"), _configBack());\n\n_easeMap.SteppedEase = _easeMap.steps = _globals.SteppedEase = {\n config: function config(steps, immediateStart) {\n if (steps === void 0) {\n steps = 1;\n }\n\n var p1 = 1 / steps,\n p2 = steps + (immediateStart ? 0 : 1),\n p3 = immediateStart ? 1 : 0,\n max = 1 - _tinyNum;\n return function (p) {\n return ((p2 * _clamp(0, max, p) | 0) + p3) * p1;\n };\n }\n};\n_defaults.ease = _easeMap[\"quad.out\"];\n\n_forEachName(\"onComplete,onUpdate,onStart,onRepeat,onReverseComplete,onInterrupt\", function (name) {\n return _callbackNames += name + \",\" + name + \"Params,\";\n});\n/*\n * --------------------------------------------------------------------------------------\n * CACHE\n * --------------------------------------------------------------------------------------\n */\n\n\nexport var GSCache = function GSCache(target, harness) {\n this.id = _gsID++;\n target._gsap = this;\n this.target = target;\n this.harness = harness;\n this.get = harness ? harness.get : _getProperty;\n this.set = harness ? harness.getSetter : _getSetter;\n};\n/*\n * --------------------------------------------------------------------------------------\n * ANIMATION\n * --------------------------------------------------------------------------------------\n */\n\nexport var Animation = /*#__PURE__*/function () {\n function Animation(vars) {\n this.vars = vars;\n this._delay = +vars.delay || 0;\n\n if (this._repeat = vars.repeat === Infinity ? -2 : vars.repeat || 0) {\n // TODO: repeat: Infinity on a timeline's children must flag that timeline internally and affect its totalDuration, otherwise it'll stop in the negative direction when reaching the start.\n this._rDelay = vars.repeatDelay || 0;\n this._yoyo = !!vars.yoyo || !!vars.yoyoEase;\n }\n\n this._ts = 1;\n\n _setDuration(this, +vars.duration, 1, 1);\n\n this.data = vars.data;\n _tickerActive || _ticker.wake();\n }\n\n var _proto = Animation.prototype;\n\n _proto.delay = function delay(value) {\n if (value || value === 0) {\n this.parent && this.parent.smoothChildTiming && this.startTime(this._start + value - this._delay);\n this._delay = value;\n return this;\n }\n\n return this._delay;\n };\n\n _proto.duration = function duration(value) {\n return arguments.length ? this.totalDuration(this._repeat > 0 ? value + (value + this._rDelay) * this._repeat : value) : this.totalDuration() && this._dur;\n };\n\n _proto.totalDuration = function totalDuration(value) {\n if (!arguments.length) {\n return this._tDur;\n }\n\n this._dirty = 0;\n return _setDuration(this, this._repeat < 0 ? value : (value - this._repeat * this._rDelay) / (this._repeat + 1));\n };\n\n _proto.totalTime = function totalTime(_totalTime, suppressEvents) {\n _wake();\n\n if (!arguments.length) {\n return this._tTime;\n }\n\n var parent = this._dp;\n\n if (parent && parent.smoothChildTiming && this._ts) {\n _alignPlayhead(this, _totalTime);\n\n !parent._dp || parent.parent || _postAddChecks(parent, this); // edge case: if this is a child of a timeline that already completed, for example, we must re-activate the parent.\n //in case any of the ancestor timelines had completed but should now be enabled, we should reset their totalTime() which will also ensure that they're lined up properly and enabled. Skip for animations that are on the root (wasteful). Example: a TimelineLite.exportRoot() is performed when there's a paused tween on the root, the export will not complete until that tween is unpaused, but imagine a child gets restarted later, after all [unpaused] tweens have completed. The start of that child would get pushed out, but one of the ancestors may have completed.\n\n while (parent && parent.parent) {\n if (parent.parent._time !== parent._start + (parent._ts >= 0 ? parent._tTime / parent._ts : (parent.totalDuration() - parent._tTime) / -parent._ts)) {\n parent.totalTime(parent._tTime, true);\n }\n\n parent = parent.parent;\n }\n\n if (!this.parent && this._dp.autoRemoveChildren && (this._ts > 0 && _totalTime < this._tDur || this._ts < 0 && _totalTime > 0 || !this._tDur && !_totalTime)) {\n //if the animation doesn't have a parent, put it back into its last parent (recorded as _dp for exactly cases like this). Limit to parents with autoRemoveChildren (like globalTimeline) so that if the user manually removes an animation from a timeline and then alters its playhead, it doesn't get added back in.\n _addToTimeline(this._dp, this, this._start - this._delay);\n }\n }\n\n if (this._tTime !== _totalTime || !this._dur && !suppressEvents || this._initted && Math.abs(this._zTime) === _tinyNum || !_totalTime && !this._initted && (this.add || this._ptLookup)) {\n // check for _ptLookup on a Tween instance to ensure it has actually finished being instantiated, otherwise if this.reverse() gets called in the Animation constructor, it could trigger a render() here even though the _targets weren't populated, thus when _init() is called there won't be any PropTweens (it'll act like the tween is non-functional)\n this._ts || (this._pTime = _totalTime); // otherwise, if an animation is paused, then the playhead is moved back to zero, then resumed, it'd revert back to the original time at the pause\n //if (!this._lock) { // avoid endless recursion (not sure we need this yet or if it's worth the performance hit)\n // this._lock = 1;\n\n _lazySafeRender(this, _totalTime, suppressEvents); // this._lock = 0;\n //}\n\n }\n\n return this;\n };\n\n _proto.time = function time(value, suppressEvents) {\n return arguments.length ? this.totalTime(Math.min(this.totalDuration(), value + _elapsedCycleDuration(this)) % (this._dur + this._rDelay) || (value ? this._dur : 0), suppressEvents) : this._time; // note: if the modulus results in 0, the playhead could be exactly at the end or the beginning, and we always defer to the END with a non-zero value, otherwise if you set the time() to the very end (duration()), it would render at the START!\n };\n\n _proto.totalProgress = function totalProgress(value, suppressEvents) {\n return arguments.length ? this.totalTime(this.totalDuration() * value, suppressEvents) : this.totalDuration() ? Math.min(1, this._tTime / this._tDur) : this.ratio;\n };\n\n _proto.progress = function progress(value, suppressEvents) {\n return arguments.length ? this.totalTime(this.duration() * (this._yoyo && !(this.iteration() & 1) ? 1 - value : value) + _elapsedCycleDuration(this), suppressEvents) : this.duration() ? Math.min(1, this._time / this._dur) : this.ratio;\n };\n\n _proto.iteration = function iteration(value, suppressEvents) {\n var cycleDuration = this.duration() + this._rDelay;\n\n return arguments.length ? this.totalTime(this._time + (value - 1) * cycleDuration, suppressEvents) : this._repeat ? _animationCycle(this._tTime, cycleDuration) + 1 : 1;\n } // potential future addition:\n // isPlayingBackwards() {\n // \tlet animation = this,\n // \t\torientation = 1; // 1 = forward, -1 = backward\n // \twhile (animation) {\n // \t\torientation *= animation.reversed() || (animation.repeat() && !(animation.iteration() & 1)) ? -1 : 1;\n // \t\tanimation = animation.parent;\n // \t}\n // \treturn orientation < 0;\n // }\n ;\n\n _proto.timeScale = function timeScale(value) {\n if (!arguments.length) {\n return this._rts === -_tinyNum ? 0 : this._rts; // recorded timeScale. Special case: if someone calls reverse() on an animation with timeScale of 0, we assign it -_tinyNum to remember it's reversed.\n }\n\n if (this._rts === value) {\n return this;\n }\n\n var tTime = this.parent && this._ts ? _parentToChildTotalTime(this.parent._time, this) : this._tTime; // make sure to do the parentToChildTotalTime() BEFORE setting the new _ts because the old one must be used in that calculation.\n // future addition? Up side: fast and minimal file size. Down side: only works on this animation; if a timeline is reversed, for example, its childrens' onReverse wouldn't get called.\n //(+value < 0 && this._rts >= 0) && _callback(this, \"onReverse\", true);\n // prioritize rendering where the parent's playhead lines up instead of this._tTime because there could be a tween that's animating another tween's timeScale in the same rendering loop (same parent), thus if the timeScale tween renders first, it would alter _start BEFORE _tTime was set on that tick (in the rendering loop), effectively freezing it until the timeScale tween finishes.\n\n this._rts = +value || 0;\n this._ts = this._ps || value === -_tinyNum ? 0 : this._rts; // _ts is the functional timeScale which would be 0 if the animation is paused.\n\n _recacheAncestors(this.totalTime(_clamp(-this._delay, this._tDur, tTime), true));\n\n _setEnd(this); // if parent.smoothChildTiming was false, the end time didn't get updated in the _alignPlayhead() method, so do it here.\n\n\n return this;\n };\n\n _proto.paused = function paused(value) {\n if (!arguments.length) {\n return this._ps;\n }\n\n if (this._ps !== value) {\n this._ps = value;\n\n if (value) {\n this._pTime = this._tTime || Math.max(-this._delay, this.rawTime()); // if the pause occurs during the delay phase, make sure that's factored in when resuming.\n\n this._ts = this._act = 0; // _ts is the functional timeScale, so a paused tween would effectively have a timeScale of 0. We record the \"real\" timeScale as _rts (recorded time scale)\n } else {\n _wake();\n\n this._ts = this._rts; //only defer to _pTime (pauseTime) if tTime is zero. Remember, someone could pause() an animation, then scrub the playhead and resume(). If the parent doesn't have smoothChildTiming, we render at the rawTime() because the startTime won't get updated.\n\n this.totalTime(this.parent && !this.parent.smoothChildTiming ? this.rawTime() : this._tTime || this._pTime, this.progress() === 1 && Math.abs(this._zTime) !== _tinyNum && (this._tTime -= _tinyNum)); // edge case: animation.progress(1).pause().play() wouldn't render again because the playhead is already at the end, but the call to totalTime() below will add it back to its parent...and not remove it again (since removing only happens upon rendering at a new time). Offsetting the _tTime slightly is done simply to cause the final render in totalTime() that'll pop it off its timeline (if autoRemoveChildren is true, of course). Check to make sure _zTime isn't -_tinyNum to avoid an edge case where the playhead is pushed to the end but INSIDE a tween/callback, the timeline itself is paused thus halting rendering and leaving a few unrendered. When resuming, it wouldn't render those otherwise.\n }\n }\n\n return this;\n };\n\n _proto.startTime = function startTime(value) {\n if (arguments.length) {\n this._start = value;\n var parent = this.parent || this._dp;\n parent && (parent._sort || !this.parent) && _addToTimeline(parent, this, value - this._delay);\n return this;\n }\n\n return this._start;\n };\n\n _proto.endTime = function endTime(includeRepeats) {\n return this._start + (_isNotFalse(includeRepeats) ? this.totalDuration() : this.duration()) / Math.abs(this._ts || 1);\n };\n\n _proto.rawTime = function rawTime(wrapRepeats) {\n var parent = this.parent || this._dp; // _dp = detached parent\n\n return !parent ? this._tTime : wrapRepeats && (!this._ts || this._repeat && this._time && this.totalProgress() < 1) ? this._tTime % (this._dur + this._rDelay) : !this._ts ? this._tTime : _parentToChildTotalTime(parent.rawTime(wrapRepeats), this);\n };\n\n _proto.globalTime = function globalTime(rawTime) {\n var animation = this,\n time = arguments.length ? rawTime : animation.rawTime();\n\n while (animation) {\n time = animation._start + time / (animation._ts || 1);\n animation = animation._dp;\n }\n\n return time;\n };\n\n _proto.repeat = function repeat(value) {\n if (arguments.length) {\n this._repeat = value === Infinity ? -2 : value;\n return _onUpdateTotalDuration(this);\n }\n\n return this._repeat === -2 ? Infinity : this._repeat;\n };\n\n _proto.repeatDelay = function repeatDelay(value) {\n if (arguments.length) {\n var time = this._time;\n this._rDelay = value;\n\n _onUpdateTotalDuration(this);\n\n return time ? this.time(time) : this;\n }\n\n return this._rDelay;\n };\n\n _proto.yoyo = function yoyo(value) {\n if (arguments.length) {\n this._yoyo = value;\n return this;\n }\n\n return this._yoyo;\n };\n\n _proto.seek = function seek(position, suppressEvents) {\n return this.totalTime(_parsePosition(this, position), _isNotFalse(suppressEvents));\n };\n\n _proto.restart = function restart(includeDelay, suppressEvents) {\n return this.play().totalTime(includeDelay ? -this._delay : 0, _isNotFalse(suppressEvents));\n };\n\n _proto.play = function play(from, suppressEvents) {\n from != null && this.seek(from, suppressEvents);\n return this.reversed(false).paused(false);\n };\n\n _proto.reverse = function reverse(from, suppressEvents) {\n from != null && this.seek(from || this.totalDuration(), suppressEvents);\n return this.reversed(true).paused(false);\n };\n\n _proto.pause = function pause(atTime, suppressEvents) {\n atTime != null && this.seek(atTime, suppressEvents);\n return this.paused(true);\n };\n\n _proto.resume = function resume() {\n return this.paused(false);\n };\n\n _proto.reversed = function reversed(value) {\n if (arguments.length) {\n !!value !== this.reversed() && this.timeScale(-this._rts || (value ? -_tinyNum : 0)); // in case timeScale is zero, reversing would have no effect so we use _tinyNum.\n\n return this;\n }\n\n return this._rts < 0;\n };\n\n _proto.invalidate = function invalidate() {\n this._initted = this._act = 0;\n this._zTime = -_tinyNum;\n return this;\n };\n\n _proto.isActive = function isActive() {\n var parent = this.parent || this._dp,\n start = this._start,\n rawTime;\n return !!(!parent || this._ts && this._initted && parent.isActive() && (rawTime = parent.rawTime(true)) >= start && rawTime < this.endTime(true) - _tinyNum);\n };\n\n _proto.eventCallback = function eventCallback(type, callback, params) {\n var vars = this.vars;\n\n if (arguments.length > 1) {\n if (!callback) {\n delete vars[type];\n } else {\n vars[type] = callback;\n params && (vars[type + \"Params\"] = params);\n type === \"onUpdate\" && (this._onUpdate = callback);\n }\n\n return this;\n }\n\n return vars[type];\n };\n\n _proto.then = function then(onFulfilled) {\n var self = this;\n return new Promise(function (resolve) {\n var f = _isFunction(onFulfilled) ? onFulfilled : _passThrough,\n _resolve = function _resolve() {\n var _then = self.then;\n self.then = null; // temporarily null the then() method to avoid an infinite loop (see https://github.com/greensock/GSAP/issues/322)\n\n _isFunction(f) && (f = f(self)) && (f.then || f === self) && (self.then = _then);\n resolve(f);\n self.then = _then;\n };\n\n if (self._initted && self.totalProgress() === 1 && self._ts >= 0 || !self._tTime && self._ts < 0) {\n _resolve();\n } else {\n self._prom = _resolve;\n }\n });\n };\n\n _proto.kill = function kill() {\n _interrupt(this);\n };\n\n return Animation;\n}();\n\n_setDefaults(Animation.prototype, {\n _time: 0,\n _start: 0,\n _end: 0,\n _tTime: 0,\n _tDur: 0,\n _dirty: 0,\n _repeat: 0,\n _yoyo: false,\n parent: null,\n _initted: false,\n _rDelay: 0,\n _ts: 1,\n _dp: 0,\n ratio: 0,\n _zTime: -_tinyNum,\n _prom: 0,\n _ps: false,\n _rts: 1\n});\n/*\n * -------------------------------------------------\n * TIMELINE\n * -------------------------------------------------\n */\n\n\nexport var Timeline = /*#__PURE__*/function (_Animation) {\n _inheritsLoose(Timeline, _Animation);\n\n function Timeline(vars, position) {\n var _this;\n\n if (vars === void 0) {\n vars = {};\n }\n\n _this = _Animation.call(this, vars) || this;\n _this.labels = {};\n _this.smoothChildTiming = !!vars.smoothChildTiming;\n _this.autoRemoveChildren = !!vars.autoRemoveChildren;\n _this._sort = _isNotFalse(vars.sortChildren);\n _globalTimeline && _addToTimeline(vars.parent || _globalTimeline, _assertThisInitialized(_this), position);\n vars.reversed && _this.reverse();\n vars.paused && _this.paused(true);\n vars.scrollTrigger && _scrollTrigger(_assertThisInitialized(_this), vars.scrollTrigger);\n return _this;\n }\n\n var _proto2 = Timeline.prototype;\n\n _proto2.to = function to(targets, vars, position) {\n _createTweenType(0, arguments, this);\n\n return this;\n };\n\n _proto2.from = function from(targets, vars, position) {\n _createTweenType(1, arguments, this);\n\n return this;\n };\n\n _proto2.fromTo = function fromTo(targets, fromVars, toVars, position) {\n _createTweenType(2, arguments, this);\n\n return this;\n };\n\n _proto2.set = function set(targets, vars, position) {\n vars.duration = 0;\n vars.parent = this;\n _inheritDefaults(vars).repeatDelay || (vars.repeat = 0);\n vars.immediateRender = !!vars.immediateRender;\n new Tween(targets, vars, _parsePosition(this, position), 1);\n return this;\n };\n\n _proto2.call = function call(callback, params, position) {\n return _addToTimeline(this, Tween.delayedCall(0, callback, params), position);\n } //ONLY for backward compatibility! Maybe delete?\n ;\n\n _proto2.staggerTo = function staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {\n vars.duration = duration;\n vars.stagger = vars.stagger || stagger;\n vars.onComplete = onCompleteAll;\n vars.onCompleteParams = onCompleteAllParams;\n vars.parent = this;\n new Tween(targets, vars, _parsePosition(this, position));\n return this;\n };\n\n _proto2.staggerFrom = function staggerFrom(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {\n vars.runBackwards = 1;\n _inheritDefaults(vars).immediateRender = _isNotFalse(vars.immediateRender);\n return this.staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams);\n };\n\n _proto2.staggerFromTo = function staggerFromTo(targets, duration, fromVars, toVars, stagger, position, onCompleteAll, onCompleteAllParams) {\n toVars.startAt = fromVars;\n _inheritDefaults(toVars).immediateRender = _isNotFalse(toVars.immediateRender);\n return this.staggerTo(targets, duration, toVars, stagger, position, onCompleteAll, onCompleteAllParams);\n };\n\n _proto2.render = function render(totalTime, suppressEvents, force) {\n var prevTime = this._time,\n tDur = this._dirty ? this.totalDuration() : this._tDur,\n dur = this._dur,\n tTime = totalTime <= 0 ? 0 : _roundPrecise(totalTime),\n // if a paused timeline is resumed (or its _start is updated for another reason...which rounds it), that could result in the playhead shifting a **tiny** amount and a zero-duration child at that spot may get rendered at a different ratio, like its totalTime in render() may be 1e-17 instead of 0, for example.\n crossingStart = this._zTime < 0 !== totalTime < 0 && (this._initted || !dur),\n time,\n child,\n next,\n iteration,\n cycleDuration,\n prevPaused,\n pauseTween,\n timeScale,\n prevStart,\n prevIteration,\n yoyo,\n isYoyo;\n this !== _globalTimeline && tTime > tDur && totalTime >= 0 && (tTime = tDur);\n\n if (tTime !== this._tTime || force || crossingStart) {\n if (prevTime !== this._time && dur) {\n //if totalDuration() finds a child with a negative startTime and smoothChildTiming is true, things get shifted around internally so we need to adjust the time accordingly. For example, if a tween starts at -30 we must shift EVERYTHING forward 30 seconds and move this timeline's startTime backward by 30 seconds so that things align with the playhead (no jump).\n tTime += this._time - prevTime;\n totalTime += this._time - prevTime;\n }\n\n time = tTime;\n prevStart = this._start;\n timeScale = this._ts;\n prevPaused = !timeScale;\n\n if (crossingStart) {\n dur || (prevTime = this._zTime); //when the playhead arrives at EXACTLY time 0 (right on top) of a zero-duration timeline, we need to discern if events are suppressed so that when the playhead moves again (next time), it'll trigger the callback. If events are NOT suppressed, obviously the callback would be triggered in this render. Basically, the callback should fire either when the playhead ARRIVES or LEAVES this exact spot, not both. Imagine doing a timeline.seek(0) and there's a callback that sits at 0. Since events are suppressed on that seek() by default, nothing will fire, but when the playhead moves off of that position, the callback should fire. This behavior is what people intuitively expect.\n\n (totalTime || !suppressEvents) && (this._zTime = totalTime);\n }\n\n if (this._repeat) {\n //adjust the time for repeats and yoyos\n yoyo = this._yoyo;\n cycleDuration = dur + this._rDelay;\n\n if (this._repeat < -1 && totalTime < 0) {\n return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);\n }\n\n time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)\n\n if (tTime === tDur) {\n // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)\n iteration = this._repeat;\n time = dur;\n } else {\n iteration = ~~(tTime / cycleDuration);\n\n if (iteration && iteration === tTime / cycleDuration) {\n time = dur;\n iteration--;\n }\n\n time > dur && (time = dur);\n }\n\n prevIteration = _animationCycle(this._tTime, cycleDuration);\n !prevTime && this._tTime && prevIteration !== iteration && (prevIteration = iteration); // edge case - if someone does addPause() at the very beginning of a repeating timeline, that pause is technically at the same spot as the end which causes this._time to get set to 0 when the totalTime would normally place the playhead at the end. See https://greensock.com/forums/topic/23823-closing-nav-animation-not-working-on-ie-and-iphone-6-maybe-other-older-browser/?tab=comments#comment-113005\n\n if (yoyo && iteration & 1) {\n time = dur - time;\n isYoyo = 1;\n }\n /*\n make sure children at the end/beginning of the timeline are rendered properly. If, for example,\n a 3-second long timeline rendered at 2.9 seconds previously, and now renders at 3.2 seconds (which\n would get translated to 2.8 seconds if the timeline yoyos or 0.2 seconds if it just repeats), there\n could be a callback or a short tween that's at 2.95 or 3 seconds in which wouldn't render. So\n we need to push the timeline to the end (and/or beginning depending on its yoyo value). Also we must\n ensure that zero-duration tweens at the very beginning or end of the Timeline work.\n */\n\n\n if (iteration !== prevIteration && !this._lock) {\n var rewinding = yoyo && prevIteration & 1,\n doesWrap = rewinding === (yoyo && iteration & 1);\n iteration < prevIteration && (rewinding = !rewinding);\n prevTime = rewinding ? 0 : dur;\n this._lock = 1;\n this.render(prevTime || (isYoyo ? 0 : _roundPrecise(iteration * cycleDuration)), suppressEvents, !dur)._lock = 0;\n this._tTime = tTime; // if a user gets the iteration() inside the onRepeat, for example, it should be accurate.\n\n !suppressEvents && this.parent && _callback(this, \"onRepeat\");\n this.vars.repeatRefresh && !isYoyo && (this.invalidate()._lock = 1);\n\n if (prevTime && prevTime !== this._time || prevPaused !== !this._ts || this.vars.onRepeat && !this.parent && !this._act) {\n // if prevTime is 0 and we render at the very end, _time will be the end, thus won't match. So in this edge case, prevTime won't match _time but that's okay. If it gets killed in the onRepeat, eject as well.\n return this;\n }\n\n dur = this._dur; // in case the duration changed in the onRepeat\n\n tDur = this._tDur;\n\n if (doesWrap) {\n this._lock = 2;\n prevTime = rewinding ? dur : -0.0001;\n this.render(prevTime, true);\n this.vars.repeatRefresh && !isYoyo && this.invalidate();\n }\n\n this._lock = 0;\n\n if (!this._ts && !prevPaused) {\n return this;\n } //in order for yoyoEase to work properly when there's a stagger, we must swap out the ease in each sub-tween.\n\n\n _propagateYoyoEase(this, isYoyo);\n }\n }\n\n if (this._hasPause && !this._forcing && this._lock < 2) {\n pauseTween = _findNextPauseTween(this, _roundPrecise(prevTime), _roundPrecise(time));\n\n if (pauseTween) {\n tTime -= time - (time = pauseTween._start);\n }\n }\n\n this._tTime = tTime;\n this._time = time;\n this._act = !timeScale; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.\n\n if (!this._initted) {\n this._onUpdate = this.vars.onUpdate;\n this._initted = 1;\n this._zTime = totalTime;\n prevTime = 0; // upon init, the playhead should always go forward; someone could invalidate() a completed timeline and then if they restart(), that would make child tweens render in reverse order which could lock in the wrong starting values if they build on each other, like tl.to(obj, {x: 100}).to(obj, {x: 0}).\n }\n\n if (!prevTime && time && !suppressEvents) {\n _callback(this, \"onStart\");\n\n if (this._tTime !== tTime) {\n // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart.\n return this;\n }\n }\n\n if (time >= prevTime && totalTime >= 0) {\n child = this._first;\n\n while (child) {\n next = child._next;\n\n if ((child._act || time >= child._start) && child._ts && pauseTween !== child) {\n if (child.parent !== this) {\n // an extreme edge case - the child's render could do something like kill() the \"next\" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.\n return this.render(totalTime, suppressEvents, force);\n }\n\n child.render(child._ts > 0 ? (time - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (time - child._start) * child._ts, suppressEvents, force);\n\n if (time !== this._time || !this._ts && !prevPaused) {\n //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete\n pauseTween = 0;\n next && (tTime += this._zTime = -_tinyNum); // it didn't finish rendering, so flag zTime as negative so that so that the next time render() is called it'll be forced (to render any remaining children)\n\n break;\n }\n }\n\n child = next;\n }\n } else {\n child = this._last;\n var adjustedTime = totalTime < 0 ? totalTime : time; //when the playhead goes backward beyond the start of this timeline, we must pass that information down to the child animations so that zero-duration tweens know whether to render their starting or ending values.\n\n while (child) {\n next = child._prev;\n\n if ((child._act || adjustedTime <= child._end) && child._ts && pauseTween !== child) {\n if (child.parent !== this) {\n // an extreme edge case - the child's render could do something like kill() the \"next\" one in the linked list, or reparent it. In that case we must re-initiate the whole render to be safe.\n return this.render(totalTime, suppressEvents, force);\n }\n\n child.render(child._ts > 0 ? (adjustedTime - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (adjustedTime - child._start) * child._ts, suppressEvents, force);\n\n if (time !== this._time || !this._ts && !prevPaused) {\n //in case a tween pauses or seeks the timeline when rendering, like inside of an onUpdate/onComplete\n pauseTween = 0;\n next && (tTime += this._zTime = adjustedTime ? -_tinyNum : _tinyNum); // it didn't finish rendering, so adjust zTime so that so that the next time render() is called it'll be forced (to render any remaining children)\n\n break;\n }\n }\n\n child = next;\n }\n }\n\n if (pauseTween && !suppressEvents) {\n this.pause();\n pauseTween.render(time >= prevTime ? 0 : -_tinyNum)._zTime = time >= prevTime ? 1 : -1;\n\n if (this._ts) {\n //the callback resumed playback! So since we may have held back the playhead due to where the pause is positioned, go ahead and jump to where it's SUPPOSED to be (if no pause happened).\n this._start = prevStart; //if the pause was at an earlier time and the user resumed in the callback, it could reposition the timeline (changing its startTime), throwing things off slightly, so we make sure the _start doesn't shift.\n\n _setEnd(this);\n\n return this.render(totalTime, suppressEvents, force);\n }\n }\n\n this._onUpdate && !suppressEvents && _callback(this, \"onUpdate\", true);\n if (tTime === tDur && tDur >= this.totalDuration() || !tTime && prevTime) if (prevStart === this._start || Math.abs(timeScale) !== Math.abs(this._ts)) if (!this._lock) {\n (totalTime || !dur) && (tTime === tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.\n\n if (!suppressEvents && !(totalTime < 0 && !prevTime) && (tTime || prevTime || !tDur)) {\n _callback(this, tTime === tDur && totalTime >= 0 ? \"onComplete\" : \"onReverseComplete\", true);\n\n this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();\n }\n }\n }\n\n return this;\n };\n\n _proto2.add = function add(child, position) {\n var _this2 = this;\n\n _isNumber(position) || (position = _parsePosition(this, position, child));\n\n if (!(child instanceof Animation)) {\n if (_isArray(child)) {\n child.forEach(function (obj) {\n return _this2.add(obj, position);\n });\n return this;\n }\n\n if (_isString(child)) {\n return this.addLabel(child, position);\n }\n\n if (_isFunction(child)) {\n child = Tween.delayedCall(0, child);\n } else {\n return this;\n }\n }\n\n return this !== child ? _addToTimeline(this, child, position) : this; //don't allow a timeline to be added to itself as a child!\n };\n\n _proto2.getChildren = function getChildren(nested, tweens, timelines, ignoreBeforeTime) {\n if (nested === void 0) {\n nested = true;\n }\n\n if (tweens === void 0) {\n tweens = true;\n }\n\n if (timelines === void 0) {\n timelines = true;\n }\n\n if (ignoreBeforeTime === void 0) {\n ignoreBeforeTime = -_bigNum;\n }\n\n var a = [],\n child = this._first;\n\n while (child) {\n if (child._start >= ignoreBeforeTime) {\n if (child instanceof Tween) {\n tweens && a.push(child);\n } else {\n timelines && a.push(child);\n nested && a.push.apply(a, child.getChildren(true, tweens, timelines));\n }\n }\n\n child = child._next;\n }\n\n return a;\n };\n\n _proto2.getById = function getById(id) {\n var animations = this.getChildren(1, 1, 1),\n i = animations.length;\n\n while (i--) {\n if (animations[i].vars.id === id) {\n return animations[i];\n }\n }\n };\n\n _proto2.remove = function remove(child) {\n if (_isString(child)) {\n return this.removeLabel(child);\n }\n\n if (_isFunction(child)) {\n return this.killTweensOf(child);\n }\n\n _removeLinkedListItem(this, child);\n\n if (child === this._recent) {\n this._recent = this._last;\n }\n\n return _uncache(this);\n };\n\n _proto2.totalTime = function totalTime(_totalTime2, suppressEvents) {\n if (!arguments.length) {\n return this._tTime;\n }\n\n this._forcing = 1;\n\n if (!this._dp && this._ts) {\n //special case for the global timeline (or any other that has no parent or detached parent).\n this._start = _roundPrecise(_ticker.time - (this._ts > 0 ? _totalTime2 / this._ts : (this.totalDuration() - _totalTime2) / -this._ts));\n }\n\n _Animation.prototype.totalTime.call(this, _totalTime2, suppressEvents);\n\n this._forcing = 0;\n return this;\n };\n\n _proto2.addLabel = function addLabel(label, position) {\n this.labels[label] = _parsePosition(this, position);\n return this;\n };\n\n _proto2.removeLabel = function removeLabel(label) {\n delete this.labels[label];\n return this;\n };\n\n _proto2.addPause = function addPause(position, callback, params) {\n var t = Tween.delayedCall(0, callback || _emptyFunc, params);\n t.data = \"isPause\";\n this._hasPause = 1;\n return _addToTimeline(this, t, _parsePosition(this, position));\n };\n\n _proto2.removePause = function removePause(position) {\n var child = this._first;\n position = _parsePosition(this, position);\n\n while (child) {\n if (child._start === position && child.data === \"isPause\") {\n _removeFromParent(child);\n }\n\n child = child._next;\n }\n };\n\n _proto2.killTweensOf = function killTweensOf(targets, props, onlyActive) {\n var tweens = this.getTweensOf(targets, onlyActive),\n i = tweens.length;\n\n while (i--) {\n _overwritingTween !== tweens[i] && tweens[i].kill(targets, props);\n }\n\n return this;\n };\n\n _proto2.getTweensOf = function getTweensOf(targets, onlyActive) {\n var a = [],\n parsedTargets = toArray(targets),\n child = this._first,\n isGlobalTime = _isNumber(onlyActive),\n // a number is interpreted as a global time. If the animation spans\n children;\n\n while (child) {\n if (child instanceof Tween) {\n if (_arrayContainsAny(child._targets, parsedTargets) && (isGlobalTime ? (!_overwritingTween || child._initted && child._ts) && child.globalTime(0) <= onlyActive && child.globalTime(child.totalDuration()) > onlyActive : !onlyActive || child.isActive())) {\n // note: if this is for overwriting, it should only be for tweens that aren't paused and are initted.\n a.push(child);\n }\n } else if ((children = child.getTweensOf(parsedTargets, onlyActive)).length) {\n a.push.apply(a, children);\n }\n\n child = child._next;\n }\n\n return a;\n } // potential future feature - targets() on timelines\n // targets() {\n // \tlet result = [];\n // \tthis.getChildren(true, true, false).forEach(t => result.push(...t.targets()));\n // \treturn result.filter((v, i) => result.indexOf(v) === i);\n // }\n ;\n\n _proto2.tweenTo = function tweenTo(position, vars) {\n vars = vars || {};\n\n var tl = this,\n endTime = _parsePosition(tl, position),\n _vars = vars,\n startAt = _vars.startAt,\n _onStart = _vars.onStart,\n onStartParams = _vars.onStartParams,\n immediateRender = _vars.immediateRender,\n initted,\n tween = Tween.to(tl, _setDefaults({\n ease: vars.ease || \"none\",\n lazy: false,\n immediateRender: false,\n time: endTime,\n overwrite: \"auto\",\n duration: vars.duration || Math.abs((endTime - (startAt && \"time\" in startAt ? startAt.time : tl._time)) / tl.timeScale()) || _tinyNum,\n onStart: function onStart() {\n tl.pause();\n\n if (!initted) {\n var duration = vars.duration || Math.abs((endTime - (startAt && \"time\" in startAt ? startAt.time : tl._time)) / tl.timeScale());\n tween._dur !== duration && _setDuration(tween, duration, 0, 1).render(tween._time, true, true);\n initted = 1;\n }\n\n _onStart && _onStart.apply(tween, onStartParams || []); //in case the user had an onStart in the vars - we don't want to overwrite it.\n }\n }, vars));\n\n return immediateRender ? tween.render(0) : tween;\n };\n\n _proto2.tweenFromTo = function tweenFromTo(fromPosition, toPosition, vars) {\n return this.tweenTo(toPosition, _setDefaults({\n startAt: {\n time: _parsePosition(this, fromPosition)\n }\n }, vars));\n };\n\n _proto2.recent = function recent() {\n return this._recent;\n };\n\n _proto2.nextLabel = function nextLabel(afterTime) {\n if (afterTime === void 0) {\n afterTime = this._time;\n }\n\n return _getLabelInDirection(this, _parsePosition(this, afterTime));\n };\n\n _proto2.previousLabel = function previousLabel(beforeTime) {\n if (beforeTime === void 0) {\n beforeTime = this._time;\n }\n\n return _getLabelInDirection(this, _parsePosition(this, beforeTime), 1);\n };\n\n _proto2.currentLabel = function currentLabel(value) {\n return arguments.length ? this.seek(value, true) : this.previousLabel(this._time + _tinyNum);\n };\n\n _proto2.shiftChildren = function shiftChildren(amount, adjustLabels, ignoreBeforeTime) {\n if (ignoreBeforeTime === void 0) {\n ignoreBeforeTime = 0;\n }\n\n var child = this._first,\n labels = this.labels,\n p;\n\n while (child) {\n if (child._start >= ignoreBeforeTime) {\n child._start += amount;\n child._end += amount;\n }\n\n child = child._next;\n }\n\n if (adjustLabels) {\n for (p in labels) {\n if (labels[p] >= ignoreBeforeTime) {\n labels[p] += amount;\n }\n }\n }\n\n return _uncache(this);\n };\n\n _proto2.invalidate = function invalidate() {\n var child = this._first;\n this._lock = 0;\n\n while (child) {\n child.invalidate();\n child = child._next;\n }\n\n return _Animation.prototype.invalidate.call(this);\n };\n\n _proto2.clear = function clear(includeLabels) {\n if (includeLabels === void 0) {\n includeLabels = true;\n }\n\n var child = this._first,\n next;\n\n while (child) {\n next = child._next;\n this.remove(child);\n child = next;\n }\n\n this._dp && (this._time = this._tTime = this._pTime = 0);\n includeLabels && (this.labels = {});\n return _uncache(this);\n };\n\n _proto2.totalDuration = function totalDuration(value) {\n var max = 0,\n self = this,\n child = self._last,\n prevStart = _bigNum,\n prev,\n start,\n parent;\n\n if (arguments.length) {\n return self.timeScale((self._repeat < 0 ? self.duration() : self.totalDuration()) / (self.reversed() ? -value : value));\n }\n\n if (self._dirty) {\n parent = self.parent;\n\n while (child) {\n prev = child._prev; //record it here in case the tween changes position in the sequence...\n\n child._dirty && child.totalDuration(); //could change the tween._startTime, so make sure the animation's cache is clean before analyzing it.\n\n start = child._start;\n\n if (start > prevStart && self._sort && child._ts && !self._lock) {\n //in case one of the tweens shifted out of order, it needs to be re-inserted into the correct position in the sequence\n self._lock = 1; //prevent endless recursive calls - there are methods that get triggered that check duration/totalDuration when we add().\n\n _addToTimeline(self, child, start - child._delay, 1)._lock = 0;\n } else {\n prevStart = start;\n }\n\n if (start < 0 && child._ts) {\n //children aren't allowed to have negative startTimes unless smoothChildTiming is true, so adjust here if one is found.\n max -= start;\n\n if (!parent && !self._dp || parent && parent.smoothChildTiming) {\n self._start += start / self._ts;\n self._time -= start;\n self._tTime -= start;\n }\n\n self.shiftChildren(-start, false, -1e999);\n prevStart = 0;\n }\n\n child._end > max && child._ts && (max = child._end);\n child = prev;\n }\n\n _setDuration(self, self === _globalTimeline && self._time > max ? self._time : max, 1, 1);\n\n self._dirty = 0;\n }\n\n return self._tDur;\n };\n\n Timeline.updateRoot = function updateRoot(time) {\n if (_globalTimeline._ts) {\n _lazySafeRender(_globalTimeline, _parentToChildTotalTime(time, _globalTimeline));\n\n _lastRenderedFrame = _ticker.frame;\n }\n\n if (_ticker.frame >= _nextGCFrame) {\n _nextGCFrame += _config.autoSleep || 120;\n var child = _globalTimeline._first;\n if (!child || !child._ts) if (_config.autoSleep && _ticker._listeners.length < 2) {\n while (child && !child._ts) {\n child = child._next;\n }\n\n child || _ticker.sleep();\n }\n }\n };\n\n return Timeline;\n}(Animation);\n\n_setDefaults(Timeline.prototype, {\n _lock: 0,\n _hasPause: 0,\n _forcing: 0\n});\n\nvar _addComplexStringPropTween = function _addComplexStringPropTween(target, prop, start, end, setter, stringFilter, funcParam) {\n //note: we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus \"this\" would refer to the plugin.\n var pt = new PropTween(this._pt, target, prop, 0, 1, _renderComplexString, null, setter),\n index = 0,\n matchIndex = 0,\n result,\n startNums,\n color,\n endNum,\n chunk,\n startNum,\n hasRandom,\n a;\n pt.b = start;\n pt.e = end;\n start += \"\"; //ensure values are strings\n\n end += \"\";\n\n if (hasRandom = ~end.indexOf(\"random(\")) {\n end = _replaceRandom(end);\n }\n\n if (stringFilter) {\n a = [start, end];\n stringFilter(a, target, prop); //pass an array with the starting and ending values and let the filter do whatever it needs to the values.\n\n start = a[0];\n end = a[1];\n }\n\n startNums = start.match(_complexStringNumExp) || [];\n\n while (result = _complexStringNumExp.exec(end)) {\n endNum = result[0];\n chunk = end.substring(index, result.index);\n\n if (color) {\n color = (color + 1) % 5;\n } else if (chunk.substr(-5) === \"rgba(\") {\n color = 1;\n }\n\n if (endNum !== startNums[matchIndex++]) {\n startNum = parseFloat(startNums[matchIndex - 1]) || 0; //these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.\n\n pt._pt = {\n _next: pt._pt,\n p: chunk || matchIndex === 1 ? chunk : \",\",\n //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.\n s: startNum,\n c: endNum.charAt(1) === \"=\" ? parseFloat(endNum.substr(2)) * (endNum.charAt(0) === \"-\" ? -1 : 1) : parseFloat(endNum) - startNum,\n m: color && color < 4 ? Math.round : 0\n };\n index = _complexStringNumExp.lastIndex;\n }\n }\n\n pt.c = index < end.length ? end.substring(index, end.length) : \"\"; //we use the \"c\" of the PropTween to store the final part of the string (after the last number)\n\n pt.fp = funcParam;\n\n if (_relExp.test(end) || hasRandom) {\n pt.e = 0; //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).\n }\n\n this._pt = pt; //start the linked list with this new PropTween. Remember, we call _addComplexStringPropTween.call(tweenInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus \"this\" would refer to the plugin.\n\n return pt;\n},\n _addPropTween = function _addPropTween(target, prop, start, end, index, targets, modifier, stringFilter, funcParam) {\n _isFunction(end) && (end = end(index || 0, target, targets));\n var currentValue = target[prop],\n parsedStart = start !== \"get\" ? start : !_isFunction(currentValue) ? currentValue : funcParam ? target[prop.indexOf(\"set\") || !_isFunction(target[\"get\" + prop.substr(3)]) ? prop : \"get\" + prop.substr(3)](funcParam) : target[prop](),\n setter = !_isFunction(currentValue) ? _setterPlain : funcParam ? _setterFuncWithParam : _setterFunc,\n pt;\n\n if (_isString(end)) {\n if (~end.indexOf(\"random(\")) {\n end = _replaceRandom(end);\n }\n\n if (end.charAt(1) === \"=\") {\n pt = parseFloat(parsedStart) + parseFloat(end.substr(2)) * (end.charAt(0) === \"-\" ? -1 : 1) + (getUnit(parsedStart) || 0);\n\n if (pt || pt === 0) {\n // to avoid isNaN, like if someone passes in a value like \"!= whatever\"\n end = pt;\n }\n }\n }\n\n if (parsedStart !== end) {\n if (!isNaN(parsedStart * end) && end !== \"\") {\n // fun fact: any number multiplied by \"\" is evaluated as the number 0!\n pt = new PropTween(this._pt, target, prop, +parsedStart || 0, end - (parsedStart || 0), typeof currentValue === \"boolean\" ? _renderBoolean : _renderPlain, 0, setter);\n funcParam && (pt.fp = funcParam);\n modifier && pt.modifier(modifier, this, target);\n return this._pt = pt;\n }\n\n !currentValue && !(prop in target) && _missingPlugin(prop, end);\n return _addComplexStringPropTween.call(this, target, prop, parsedStart, end, setter, stringFilter || _config.stringFilter, funcParam);\n }\n},\n //creates a copy of the vars object and processes any function-based values (putting the resulting values directly into the copy) as well as strings with \"random()\" in them. It does NOT process relative values.\n_processVars = function _processVars(vars, index, target, targets, tween) {\n _isFunction(vars) && (vars = _parseFuncOrString(vars, tween, index, target, targets));\n\n if (!_isObject(vars) || vars.style && vars.nodeType || _isArray(vars) || _isTypedArray(vars)) {\n return _isString(vars) ? _parseFuncOrString(vars, tween, index, target, targets) : vars;\n }\n\n var copy = {},\n p;\n\n for (p in vars) {\n copy[p] = _parseFuncOrString(vars[p], tween, index, target, targets);\n }\n\n return copy;\n},\n _checkPlugin = function _checkPlugin(property, vars, tween, index, target, targets) {\n var plugin, pt, ptLookup, i;\n\n if (_plugins[property] && (plugin = new _plugins[property]()).init(target, plugin.rawVars ? vars[property] : _processVars(vars[property], index, target, targets, tween), tween, index, targets) !== false) {\n tween._pt = pt = new PropTween(tween._pt, target, property, 0, 1, plugin.render, plugin, 0, plugin.priority);\n\n if (tween !== _quickTween) {\n ptLookup = tween._ptLookup[tween._targets.indexOf(target)]; //note: we can't use tween._ptLookup[index] because for staggered tweens, the index from the fullTargets array won't match what it is in each individual tween that spawns from the stagger.\n\n i = plugin._props.length;\n\n while (i--) {\n ptLookup[plugin._props[i]] = pt;\n }\n }\n }\n\n return plugin;\n},\n _overwritingTween,\n //store a reference temporarily so we can avoid overwriting itself.\n_initTween = function _initTween(tween, time) {\n var vars = tween.vars,\n ease = vars.ease,\n startAt = vars.startAt,\n immediateRender = vars.immediateRender,\n lazy = vars.lazy,\n onUpdate = vars.onUpdate,\n onUpdateParams = vars.onUpdateParams,\n callbackScope = vars.callbackScope,\n runBackwards = vars.runBackwards,\n yoyoEase = vars.yoyoEase,\n keyframes = vars.keyframes,\n autoRevert = vars.autoRevert,\n dur = tween._dur,\n prevStartAt = tween._startAt,\n targets = tween._targets,\n parent = tween.parent,\n fullTargets = parent && parent.data === \"nested\" ? parent.parent._targets : targets,\n autoOverwrite = tween._overwrite === \"auto\" && !_suppressOverwrites,\n tl = tween.timeline,\n cleanVars,\n i,\n p,\n pt,\n target,\n hasPriority,\n gsData,\n harness,\n plugin,\n ptLookup,\n index,\n harnessVars,\n overwritten;\n tl && (!keyframes || !ease) && (ease = \"none\");\n tween._ease = _parseEase(ease, _defaults.ease);\n tween._yEase = yoyoEase ? _invertEase(_parseEase(yoyoEase === true ? ease : yoyoEase, _defaults.ease)) : 0;\n\n if (yoyoEase && tween._yoyo && !tween._repeat) {\n //there must have been a parent timeline with yoyo:true that is currently in its yoyo phase, so flip the eases.\n yoyoEase = tween._yEase;\n tween._yEase = tween._ease;\n tween._ease = yoyoEase;\n }\n\n tween._from = !tl && !!vars.runBackwards; //nested timelines should never run backwards - the backwards-ness is in the child tweens.\n\n if (!tl || keyframes && !vars.stagger) {\n //if there's an internal timeline, skip all the parsing because we passed that task down the chain.\n harness = targets[0] ? _getCache(targets[0]).harness : 0;\n harnessVars = harness && vars[harness.prop]; //someone may need to specify CSS-specific values AND non-CSS values, like if the element has an \"x\" property plus it's a standard DOM element. We allow people to distinguish by wrapping plugin-specific stuff in a css:{} object for example.\n\n cleanVars = _copyExcluding(vars, _reservedProps);\n prevStartAt && _removeFromParent(prevStartAt.render(-1, true));\n\n if (startAt) {\n _removeFromParent(tween._startAt = Tween.set(targets, _setDefaults({\n data: \"isStart\",\n overwrite: false,\n parent: parent,\n immediateRender: true,\n lazy: _isNotFalse(lazy),\n startAt: null,\n delay: 0,\n onUpdate: onUpdate,\n onUpdateParams: onUpdateParams,\n callbackScope: callbackScope,\n stagger: 0\n }, startAt))); //copy the properties/values into a new object to avoid collisions, like var to = {x:0}, from = {x:500}; timeline.fromTo(e, from, to).fromTo(e, to, from);\n\n\n time < 0 && !immediateRender && !autoRevert && tween._startAt.render(-1, true); // rare edge case, like if a render is forced in the negative direction of a non-initted tween.\n\n if (immediateRender) {\n time > 0 && !autoRevert && (tween._startAt = 0); //tweens that render immediately (like most from() and fromTo() tweens) shouldn't revert when their parent timeline's playhead goes backward past the startTime because the initial render could have happened anytime and it shouldn't be directly correlated to this tween's startTime. Imagine setting up a complex animation where the beginning states of various objects are rendered immediately but the tween doesn't happen for quite some time - if we revert to the starting values as soon as the playhead goes backward past the tween's startTime, it will throw things off visually. Reversion should only happen in Timeline instances where immediateRender was false or when autoRevert is explicitly set to true.\n\n if (dur && time <= 0) {\n time && (tween._zTime = time);\n return; //we skip initialization here so that overwriting doesn't occur until the tween actually begins. Otherwise, if you create several immediateRender:true tweens of the same target/properties to drop into a Timeline, the last one created would overwrite the first ones because they didn't get placed into the timeline yet before the first render occurs and kicks in overwriting.\n } // if (time > 0) {\n // \tautoRevert || (tween._startAt = 0); //tweens that render immediately (like most from() and fromTo() tweens) shouldn't revert when their parent timeline's playhead goes backward past the startTime because the initial render could have happened anytime and it shouldn't be directly correlated to this tween's startTime. Imagine setting up a complex animation where the beginning states of various objects are rendered immediately but the tween doesn't happen for quite some time - if we revert to the starting values as soon as the playhead goes backward past the tween's startTime, it will throw things off visually. Reversion should only happen in Timeline instances where immediateRender was false or when autoRevert is explicitly set to true.\n // } else if (dur && !(time < 0 && prevStartAt)) {\n // \ttime && (tween._zTime = time);\n // \treturn; //we skip initialization here so that overwriting doesn't occur until the tween actually begins. Otherwise, if you create several immediateRender:true tweens of the same target/properties to drop into a Timeline, the last one created would overwrite the first ones because they didn't get placed into the timeline yet before the first render occurs and kicks in overwriting.\n // }\n\n } else if (autoRevert === false) {\n tween._startAt = 0;\n }\n } else if (runBackwards && dur) {\n //from() tweens must be handled uniquely: their beginning values must be rendered but we don't want overwriting to occur yet (when time is still 0). Wait until the tween actually begins before doing all the routines like overwriting. At that time, we should render at the END of the tween to ensure that things initialize correctly (remember, from() tweens go backwards)\n if (prevStartAt) {\n !autoRevert && (tween._startAt = 0);\n } else {\n time && (immediateRender = false); //in rare cases (like if a from() tween runs and then is invalidate()-ed), immediateRender could be true but the initial forced-render gets skipped, so there's no need to force the render in this context when the _time is greater than 0\n\n p = _setDefaults({\n overwrite: false,\n data: \"isFromStart\",\n //we tag the tween with as \"isFromStart\" so that if [inside a plugin] we need to only do something at the very END of a tween, we have a way of identifying this tween as merely the one that's setting the beginning values for a \"from()\" tween. For example, clearProps in CSSPlugin should only get applied at the very END of a tween and without this tag, from(...{height:100, clearProps:\"height\", delay:1}) would wipe the height at the beginning of the tween and after 1 second, it'd kick back in.\n lazy: immediateRender && _isNotFalse(lazy),\n immediateRender: immediateRender,\n //zero-duration tweens render immediately by default, but if we're not specifically instructed to render this tween immediately, we should skip this and merely _init() to record the starting values (rendering them immediately would push them to completion which is wasteful in that case - we'd have to render(-1) immediately after)\n stagger: 0,\n parent: parent //ensures that nested tweens that had a stagger are handled properly, like gsap.from(\".class\", {y:gsap.utils.wrap([-100,100])})\n\n }, cleanVars);\n harnessVars && (p[harness.prop] = harnessVars); // in case someone does something like .from(..., {css:{}})\n\n _removeFromParent(tween._startAt = Tween.set(targets, p));\n\n time < 0 && tween._startAt.render(-1, true); // rare edge case, like if a render is forced in the negative direction of a non-initted from() tween.\n\n tween._zTime = time;\n\n if (!immediateRender) {\n _initTween(tween._startAt, _tinyNum); //ensures that the initial values are recorded\n\n } else if (!time) {\n return;\n }\n }\n }\n\n tween._pt = 0;\n lazy = dur && _isNotFalse(lazy) || lazy && !dur;\n\n for (i = 0; i < targets.length; i++) {\n target = targets[i];\n gsData = target._gsap || _harness(targets)[i]._gsap;\n tween._ptLookup[i] = ptLookup = {};\n _lazyLookup[gsData.id] && _lazyTweens.length && _lazyRender(); //if other tweens of the same target have recently initted but haven't rendered yet, we've got to force the render so that the starting values are correct (imagine populating a timeline with a bunch of sequential tweens and then jumping to the end)\n\n index = fullTargets === targets ? i : fullTargets.indexOf(target);\n\n if (harness && (plugin = new harness()).init(target, harnessVars || cleanVars, tween, index, fullTargets) !== false) {\n tween._pt = pt = new PropTween(tween._pt, target, plugin.name, 0, 1, plugin.render, plugin, 0, plugin.priority);\n\n plugin._props.forEach(function (name) {\n ptLookup[name] = pt;\n });\n\n plugin.priority && (hasPriority = 1);\n }\n\n if (!harness || harnessVars) {\n for (p in cleanVars) {\n if (_plugins[p] && (plugin = _checkPlugin(p, cleanVars, tween, index, target, fullTargets))) {\n plugin.priority && (hasPriority = 1);\n } else {\n ptLookup[p] = pt = _addPropTween.call(tween, target, p, \"get\", cleanVars[p], index, fullTargets, 0, vars.stringFilter);\n }\n }\n }\n\n tween._op && tween._op[i] && tween.kill(target, tween._op[i]);\n\n if (autoOverwrite && tween._pt) {\n _overwritingTween = tween;\n\n _globalTimeline.killTweensOf(target, ptLookup, tween.globalTime(time)); // make sure the overwriting doesn't overwrite THIS tween!!!\n\n\n overwritten = !tween.parent;\n _overwritingTween = 0;\n }\n\n tween._pt && lazy && (_lazyLookup[gsData.id] = 1);\n }\n\n hasPriority && _sortPropTweensByPriority(tween);\n tween._onInit && tween._onInit(tween); //plugins like RoundProps must wait until ALL of the PropTweens are instantiated. In the plugin's init() function, it sets the _onInit on the tween instance. May not be pretty/intuitive, but it's fast and keeps file size down.\n }\n\n tween._onUpdate = onUpdate;\n tween._initted = (!tween._op || tween._pt) && !overwritten; // if overwrittenProps resulted in the entire tween being killed, do NOT flag it as initted or else it may render for one tick.\n\n keyframes && time <= 0 && tl.render(_bigNum, true, true); // if there's a 0% keyframe, it'll render in the \"before\" state for any staggered/delayed animations thus when the following tween initializes, it'll use the \"before\" state instead of the \"after\" state as the initial values.\n},\n _addAliasesToVars = function _addAliasesToVars(targets, vars) {\n var harness = targets[0] ? _getCache(targets[0]).harness : 0,\n propertyAliases = harness && harness.aliases,\n copy,\n p,\n i,\n aliases;\n\n if (!propertyAliases) {\n return vars;\n }\n\n copy = _merge({}, vars);\n\n for (p in propertyAliases) {\n if (p in copy) {\n aliases = propertyAliases[p].split(\",\");\n i = aliases.length;\n\n while (i--) {\n copy[aliases[i]] = copy[p];\n }\n }\n }\n\n return copy;\n},\n // parses multiple formats, like {\"0%\": {x: 100}, {\"50%\": {x: -20}} and { x: {\"0%\": 100, \"50%\": -20} }, and an \"ease\" can be set on any object. We populate an \"allProps\" object with an Array for each property, like {x: [{}, {}], y:[{}, {}]} with data for each property tween. The objects have a \"t\" (time), \"v\", (value), and \"e\" (ease) property. This allows us to piece together a timeline later.\n_parseKeyframe = function _parseKeyframe(prop, obj, allProps, easeEach) {\n var ease = obj.ease || easeEach || \"power1.inOut\",\n p,\n a;\n\n if (_isArray(obj)) {\n a = allProps[prop] || (allProps[prop] = []); // t = time (out of 100), v = value, e = ease\n\n obj.forEach(function (value, i) {\n return a.push({\n t: i / (obj.length - 1) * 100,\n v: value,\n e: ease\n });\n });\n } else {\n for (p in obj) {\n a = allProps[p] || (allProps[p] = []);\n p === \"ease\" || a.push({\n t: parseFloat(prop),\n v: obj[p],\n e: ease\n });\n }\n }\n},\n _parseFuncOrString = function _parseFuncOrString(value, tween, i, target, targets) {\n return _isFunction(value) ? value.call(tween, i, target, targets) : _isString(value) && ~value.indexOf(\"random(\") ? _replaceRandom(value) : value;\n},\n _staggerTweenProps = _callbackNames + \"repeat,repeatDelay,yoyo,repeatRefresh,yoyoEase\",\n _staggerPropsToSkip = {};\n\n_forEachName(_staggerTweenProps + \",id,stagger,delay,duration,paused,scrollTrigger\", function (name) {\n return _staggerPropsToSkip[name] = 1;\n});\n/*\n * --------------------------------------------------------------------------------------\n * TWEEN\n * --------------------------------------------------------------------------------------\n */\n\n\nexport var Tween = /*#__PURE__*/function (_Animation2) {\n _inheritsLoose(Tween, _Animation2);\n\n function Tween(targets, vars, position, skipInherit) {\n var _this3;\n\n if (typeof vars === \"number\") {\n position.duration = vars;\n vars = position;\n position = null;\n }\n\n _this3 = _Animation2.call(this, skipInherit ? vars : _inheritDefaults(vars)) || this;\n var _this3$vars = _this3.vars,\n duration = _this3$vars.duration,\n delay = _this3$vars.delay,\n immediateRender = _this3$vars.immediateRender,\n stagger = _this3$vars.stagger,\n overwrite = _this3$vars.overwrite,\n keyframes = _this3$vars.keyframes,\n defaults = _this3$vars.defaults,\n scrollTrigger = _this3$vars.scrollTrigger,\n yoyoEase = _this3$vars.yoyoEase,\n parent = vars.parent || _globalTimeline,\n parsedTargets = (_isArray(targets) || _isTypedArray(targets) ? _isNumber(targets[0]) : \"length\" in vars) ? [targets] : toArray(targets),\n tl,\n i,\n copy,\n l,\n p,\n curTarget,\n staggerFunc,\n staggerVarsToMerge;\n _this3._targets = parsedTargets.length ? _harness(parsedTargets) : _warn(\"GSAP target \" + targets + \" not found. https://greensock.com\", !_config.nullTargetWarn) || [];\n _this3._ptLookup = []; //PropTween lookup. An array containing an object for each target, having keys for each tweening property\n\n _this3._overwrite = overwrite;\n\n if (keyframes || stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {\n vars = _this3.vars;\n tl = _this3.timeline = new Timeline({\n data: \"nested\",\n defaults: defaults || {}\n });\n tl.kill();\n tl.parent = tl._dp = _assertThisInitialized(_this3);\n tl._start = 0;\n\n if (stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {\n l = parsedTargets.length;\n staggerFunc = stagger && distribute(stagger);\n\n if (_isObject(stagger)) {\n //users can pass in callbacks like onStart/onComplete in the stagger object. These should fire with each individual tween.\n for (p in stagger) {\n if (~_staggerTweenProps.indexOf(p)) {\n staggerVarsToMerge || (staggerVarsToMerge = {});\n staggerVarsToMerge[p] = stagger[p];\n }\n }\n }\n\n for (i = 0; i < l; i++) {\n copy = _copyExcluding(vars, _staggerPropsToSkip);\n copy.stagger = 0;\n yoyoEase && (copy.yoyoEase = yoyoEase);\n staggerVarsToMerge && _merge(copy, staggerVarsToMerge);\n curTarget = parsedTargets[i]; //don't just copy duration or delay because if they're a string or function, we'd end up in an infinite loop because _isFuncOrString() would evaluate as true in the child tweens, entering this loop, etc. So we parse the value straight from vars and default to 0.\n\n copy.duration = +_parseFuncOrString(duration, _assertThisInitialized(_this3), i, curTarget, parsedTargets);\n copy.delay = (+_parseFuncOrString(delay, _assertThisInitialized(_this3), i, curTarget, parsedTargets) || 0) - _this3._delay;\n\n if (!stagger && l === 1 && copy.delay) {\n // if someone does delay:\"random(1, 5)\", repeat:-1, for example, the delay shouldn't be inside the repeat.\n _this3._delay = delay = copy.delay;\n _this3._start += delay;\n copy.delay = 0;\n }\n\n tl.to(curTarget, copy, staggerFunc ? staggerFunc(i, curTarget, parsedTargets) : 0);\n tl._ease = _easeMap.none;\n }\n\n tl.duration() ? duration = delay = 0 : _this3.timeline = 0; // if the timeline's duration is 0, we don't need a timeline internally!\n } else if (keyframes) {\n _inheritDefaults(_setDefaults(tl.vars.defaults, {\n ease: \"none\"\n }));\n\n tl._ease = _parseEase(keyframes.ease || vars.ease || \"none\");\n var time = 0,\n a,\n kf,\n v;\n\n if (_isArray(keyframes)) {\n keyframes.forEach(function (frame) {\n return tl.to(parsedTargets, frame, \">\");\n });\n } else {\n copy = {};\n\n for (p in keyframes) {\n p === \"ease\" || p === \"easeEach\" || _parseKeyframe(p, keyframes[p], copy, keyframes.easeEach);\n }\n\n for (p in copy) {\n a = copy[p].sort(function (a, b) {\n return a.t - b.t;\n });\n time = 0;\n\n for (i = 0; i < a.length; i++) {\n kf = a[i];\n v = {\n ease: kf.e,\n duration: (kf.t - (i ? a[i - 1].t : 0)) / 100 * duration\n };\n v[p] = kf.v;\n tl.to(parsedTargets, v, time);\n time += v.duration;\n }\n }\n\n tl.duration() < duration && tl.to({}, {\n duration: duration - tl.duration()\n }); // in case keyframes didn't go to 100%\n }\n }\n\n duration || _this3.duration(duration = tl.duration());\n } else {\n _this3.timeline = 0; //speed optimization, faster lookups (no going up the prototype chain)\n }\n\n if (overwrite === true && !_suppressOverwrites) {\n _overwritingTween = _assertThisInitialized(_this3);\n\n _globalTimeline.killTweensOf(parsedTargets);\n\n _overwritingTween = 0;\n }\n\n _addToTimeline(parent, _assertThisInitialized(_this3), position);\n\n vars.reversed && _this3.reverse();\n vars.paused && _this3.paused(true);\n\n if (immediateRender || !duration && !keyframes && _this3._start === _roundPrecise(parent._time) && _isNotFalse(immediateRender) && _hasNoPausedAncestors(_assertThisInitialized(_this3)) && parent.data !== \"nested\") {\n _this3._tTime = -_tinyNum; //forces a render without having to set the render() \"force\" parameter to true because we want to allow lazying by default (using the \"force\" parameter always forces an immediate full render)\n\n _this3.render(Math.max(0, -delay)); //in case delay is negative\n\n }\n\n scrollTrigger && _scrollTrigger(_assertThisInitialized(_this3), scrollTrigger);\n return _this3;\n }\n\n var _proto3 = Tween.prototype;\n\n _proto3.render = function render(totalTime, suppressEvents, force) {\n var prevTime = this._time,\n tDur = this._tDur,\n dur = this._dur,\n tTime = totalTime > tDur - _tinyNum && totalTime >= 0 ? tDur : totalTime < _tinyNum ? 0 : totalTime,\n time,\n pt,\n iteration,\n cycleDuration,\n prevIteration,\n isYoyo,\n ratio,\n timeline,\n yoyoEase;\n\n if (!dur) {\n _renderZeroDurationTween(this, totalTime, suppressEvents, force);\n } else if (tTime !== this._tTime || !totalTime || force || !this._initted && this._tTime || this._startAt && this._zTime < 0 !== totalTime < 0) {\n //this senses if we're crossing over the start time, in which case we must record _zTime and force the render, but we do it in this lengthy conditional way for performance reasons (usually we can skip the calculations): this._initted && (this._zTime < 0) !== (totalTime < 0)\n time = tTime;\n timeline = this.timeline;\n\n if (this._repeat) {\n //adjust the time for repeats and yoyos\n cycleDuration = dur + this._rDelay;\n\n if (this._repeat < -1 && totalTime < 0) {\n return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);\n }\n\n time = _roundPrecise(tTime % cycleDuration); //round to avoid floating point errors. (4 % 0.8 should be 0 but some browsers report it as 0.79999999!)\n\n if (tTime === tDur) {\n // the tDur === tTime is for edge cases where there's a lengthy decimal on the duration and it may reach the very end but the time is rendered as not-quite-there (remember, tDur is rounded to 4 decimals whereas dur isn't)\n iteration = this._repeat;\n time = dur;\n } else {\n iteration = ~~(tTime / cycleDuration);\n\n if (iteration && iteration === tTime / cycleDuration) {\n time = dur;\n iteration--;\n }\n\n time > dur && (time = dur);\n }\n\n isYoyo = this._yoyo && iteration & 1;\n\n if (isYoyo) {\n yoyoEase = this._yEase;\n time = dur - time;\n }\n\n prevIteration = _animationCycle(this._tTime, cycleDuration);\n\n if (time === prevTime && !force && this._initted) {\n //could be during the repeatDelay part. No need to render and fire callbacks.\n return this;\n }\n\n if (iteration !== prevIteration) {\n timeline && this._yEase && _propagateYoyoEase(timeline, isYoyo); //repeatRefresh functionality\n\n if (this.vars.repeatRefresh && !isYoyo && !this._lock) {\n this._lock = force = 1; //force, otherwise if lazy is true, the _attemptInitTween() will return and we'll jump out and get caught bouncing on each tick.\n\n this.render(_roundPrecise(cycleDuration * iteration), true).invalidate()._lock = 0;\n }\n }\n }\n\n if (!this._initted) {\n if (_attemptInitTween(this, totalTime < 0 ? totalTime : time, force, suppressEvents)) {\n this._tTime = 0; // in constructor if immediateRender is true, we set _tTime to -_tinyNum to have the playhead cross the starting point but we can't leave _tTime as a negative number.\n\n return this;\n }\n\n if (dur !== this._dur) {\n // while initting, a plugin like InertiaPlugin might alter the duration, so rerun from the start to ensure everything renders as it should.\n return this.render(totalTime, suppressEvents, force);\n }\n }\n\n this._tTime = tTime;\n this._time = time;\n\n if (!this._act && this._ts) {\n this._act = 1; //as long as it's not paused, force it to be active so that if the user renders independent of the parent timeline, it'll be forced to re-render on the next tick.\n\n this._lazy = 0;\n }\n\n this.ratio = ratio = (yoyoEase || this._ease)(time / dur);\n\n if (this._from) {\n this.ratio = ratio = 1 - ratio;\n }\n\n if (time && !prevTime && !suppressEvents) {\n _callback(this, \"onStart\");\n\n if (this._tTime !== tTime) {\n // in case the onStart triggered a render at a different spot, eject. Like if someone did animation.pause(0.5) or something inside the onStart.\n return this;\n }\n }\n\n pt = this._pt;\n\n while (pt) {\n pt.r(ratio, pt.d);\n pt = pt._next;\n }\n\n timeline && timeline.render(totalTime < 0 ? totalTime : !time && isYoyo ? -_tinyNum : timeline._dur * timeline._ease(time / this._dur), suppressEvents, force) || this._startAt && (this._zTime = totalTime);\n\n if (this._onUpdate && !suppressEvents) {\n totalTime < 0 && this._startAt && this._startAt.render(totalTime, true, force); //note: for performance reasons, we tuck this conditional logic inside less traveled areas (most tweens don't have an onUpdate). We'd just have it at the end before the onComplete, but the values should be updated before any onUpdate is called, so we ALSO put it here and then if it's not called, we do so later near the onComplete.\n\n _callback(this, \"onUpdate\");\n }\n\n this._repeat && iteration !== prevIteration && this.vars.onRepeat && !suppressEvents && this.parent && _callback(this, \"onRepeat\");\n\n if ((tTime === this._tDur || !tTime) && this._tTime === tTime) {\n totalTime < 0 && this._startAt && !this._onUpdate && this._startAt.render(totalTime, true, true);\n (totalTime || !dur) && (tTime === this._tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1); // don't remove if we're rendering at exactly a time of 0, as there could be autoRevert values that should get set on the next tick (if the playhead goes backward beyond the startTime, negative totalTime). Don't remove if the timeline is reversed and the playhead isn't at 0, otherwise tl.progress(1).reverse() won't work. Only remove if the playhead is at the end and timeScale is positive, or if the playhead is at 0 and the timeScale is negative.\n\n if (!suppressEvents && !(totalTime < 0 && !prevTime) && (tTime || prevTime)) {\n // if prevTime and tTime are zero, we shouldn't fire the onReverseComplete. This could happen if you gsap.to(... {paused:true}).play();\n _callback(this, tTime === tDur ? \"onComplete\" : \"onReverseComplete\", true);\n\n this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();\n }\n }\n }\n\n return this;\n };\n\n _proto3.targets = function targets() {\n return this._targets;\n };\n\n _proto3.invalidate = function invalidate() {\n this._pt = this._op = this._startAt = this._onUpdate = this._lazy = this.ratio = 0;\n this._ptLookup = [];\n this.timeline && this.timeline.invalidate();\n return _Animation2.prototype.invalidate.call(this);\n };\n\n _proto3.kill = function kill(targets, vars) {\n if (vars === void 0) {\n vars = \"all\";\n }\n\n if (!targets && (!vars || vars === \"all\")) {\n this._lazy = this._pt = 0;\n return this.parent ? _interrupt(this) : this;\n }\n\n if (this.timeline) {\n var tDur = this.timeline.totalDuration();\n this.timeline.killTweensOf(targets, vars, _overwritingTween && _overwritingTween.vars.overwrite !== true)._first || _interrupt(this); // if nothing is left tweening, interrupt.\n\n this.parent && tDur !== this.timeline.totalDuration() && _setDuration(this, this._dur * this.timeline._tDur / tDur, 0, 1); // if a nested tween is killed that changes the duration, it should affect this tween's duration. We must use the ratio, though, because sometimes the internal timeline is stretched like for keyframes where they don't all add up to whatever the parent tween's duration was set to.\n\n return this;\n }\n\n var parsedTargets = this._targets,\n killingTargets = targets ? toArray(targets) : parsedTargets,\n propTweenLookup = this._ptLookup,\n firstPT = this._pt,\n overwrittenProps,\n curLookup,\n curOverwriteProps,\n props,\n p,\n pt,\n i;\n\n if ((!vars || vars === \"all\") && _arraysMatch(parsedTargets, killingTargets)) {\n vars === \"all\" && (this._pt = 0);\n return _interrupt(this);\n }\n\n overwrittenProps = this._op = this._op || [];\n\n if (vars !== \"all\") {\n //so people can pass in a comma-delimited list of property names\n if (_isString(vars)) {\n p = {};\n\n _forEachName(vars, function (name) {\n return p[name] = 1;\n });\n\n vars = p;\n }\n\n vars = _addAliasesToVars(parsedTargets, vars);\n }\n\n i = parsedTargets.length;\n\n while (i--) {\n if (~killingTargets.indexOf(parsedTargets[i])) {\n curLookup = propTweenLookup[i];\n\n if (vars === \"all\") {\n overwrittenProps[i] = vars;\n props = curLookup;\n curOverwriteProps = {};\n } else {\n curOverwriteProps = overwrittenProps[i] = overwrittenProps[i] || {};\n props = vars;\n }\n\n for (p in props) {\n pt = curLookup && curLookup[p];\n\n if (pt) {\n if (!(\"kill\" in pt.d) || pt.d.kill(p) === true) {\n _removeLinkedListItem(this, pt, \"_pt\");\n }\n\n delete curLookup[p];\n }\n\n if (curOverwriteProps !== \"all\") {\n curOverwriteProps[p] = 1;\n }\n }\n }\n }\n\n this._initted && !this._pt && firstPT && _interrupt(this); //if all tweening properties are killed, kill the tween. Without this line, if there's a tween with multiple targets and then you killTweensOf() each target individually, the tween would technically still remain active and fire its onComplete even though there aren't any more properties tweening.\n\n return this;\n };\n\n Tween.to = function to(targets, vars) {\n return new Tween(targets, vars, arguments[2]);\n };\n\n Tween.from = function from(targets, vars) {\n return _createTweenType(1, arguments);\n };\n\n Tween.delayedCall = function delayedCall(delay, callback, params, scope) {\n return new Tween(callback, 0, {\n immediateRender: false,\n lazy: false,\n overwrite: false,\n delay: delay,\n onComplete: callback,\n onReverseComplete: callback,\n onCompleteParams: params,\n onReverseCompleteParams: params,\n callbackScope: scope\n });\n };\n\n Tween.fromTo = function fromTo(targets, fromVars, toVars) {\n return _createTweenType(2, arguments);\n };\n\n Tween.set = function set(targets, vars) {\n vars.duration = 0;\n vars.repeatDelay || (vars.repeat = 0);\n return new Tween(targets, vars);\n };\n\n Tween.killTweensOf = function killTweensOf(targets, props, onlyActive) {\n return _globalTimeline.killTweensOf(targets, props, onlyActive);\n };\n\n return Tween;\n}(Animation);\n\n_setDefaults(Tween.prototype, {\n _targets: [],\n _lazy: 0,\n _startAt: 0,\n _op: 0,\n _onInit: 0\n}); //add the pertinent timeline methods to Tween instances so that users can chain conveniently and create a timeline automatically. (removed due to concerns that it'd ultimately add to more confusion especially for beginners)\n// _forEachName(\"to,from,fromTo,set,call,add,addLabel,addPause\", name => {\n// \tTween.prototype[name] = function() {\n// \t\tlet tl = new Timeline();\n// \t\treturn _addToTimeline(tl, this)[name].apply(tl, toArray(arguments));\n// \t}\n// });\n//for backward compatibility. Leverage the timeline calls.\n\n\n_forEachName(\"staggerTo,staggerFrom,staggerFromTo\", function (name) {\n Tween[name] = function () {\n var tl = new Timeline(),\n params = _slice.call(arguments, 0);\n\n params.splice(name === \"staggerFromTo\" ? 5 : 4, 0, 0);\n return tl[name].apply(tl, params);\n };\n});\n/*\n * --------------------------------------------------------------------------------------\n * PROPTWEEN\n * --------------------------------------------------------------------------------------\n */\n\n\nvar _setterPlain = function _setterPlain(target, property, value) {\n return target[property] = value;\n},\n _setterFunc = function _setterFunc(target, property, value) {\n return target[property](value);\n},\n _setterFuncWithParam = function _setterFuncWithParam(target, property, value, data) {\n return target[property](data.fp, value);\n},\n _setterAttribute = function _setterAttribute(target, property, value) {\n return target.setAttribute(property, value);\n},\n _getSetter = function _getSetter(target, property) {\n return _isFunction(target[property]) ? _setterFunc : _isUndefined(target[property]) && target.setAttribute ? _setterAttribute : _setterPlain;\n},\n _renderPlain = function _renderPlain(ratio, data) {\n return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 1000000) / 1000000, data);\n},\n _renderBoolean = function _renderBoolean(ratio, data) {\n return data.set(data.t, data.p, !!(data.s + data.c * ratio), data);\n},\n _renderComplexString = function _renderComplexString(ratio, data) {\n var pt = data._pt,\n s = \"\";\n\n if (!ratio && data.b) {\n //b = beginning string\n s = data.b;\n } else if (ratio === 1 && data.e) {\n //e = ending string\n s = data.e;\n } else {\n while (pt) {\n s = pt.p + (pt.m ? pt.m(pt.s + pt.c * ratio) : Math.round((pt.s + pt.c * ratio) * 10000) / 10000) + s; //we use the \"p\" property for the text inbetween (like a suffix). And in the context of a complex string, the modifier (m) is typically just Math.round(), like for RGB colors.\n\n pt = pt._next;\n }\n\n s += data.c; //we use the \"c\" of the PropTween to store the final chunk of non-numeric text.\n }\n\n data.set(data.t, data.p, s, data);\n},\n _renderPropTweens = function _renderPropTweens(ratio, data) {\n var pt = data._pt;\n\n while (pt) {\n pt.r(ratio, pt.d);\n pt = pt._next;\n }\n},\n _addPluginModifier = function _addPluginModifier(modifier, tween, target, property) {\n var pt = this._pt,\n next;\n\n while (pt) {\n next = pt._next;\n pt.p === property && pt.modifier(modifier, tween, target);\n pt = next;\n }\n},\n _killPropTweensOf = function _killPropTweensOf(property) {\n var pt = this._pt,\n hasNonDependentRemaining,\n next;\n\n while (pt) {\n next = pt._next;\n\n if (pt.p === property && !pt.op || pt.op === property) {\n _removeLinkedListItem(this, pt, \"_pt\");\n } else if (!pt.dep) {\n hasNonDependentRemaining = 1;\n }\n\n pt = next;\n }\n\n return !hasNonDependentRemaining;\n},\n _setterWithModifier = function _setterWithModifier(target, property, value, data) {\n data.mSet(target, property, data.m.call(data.tween, value, data.mt), data);\n},\n _sortPropTweensByPriority = function _sortPropTweensByPriority(parent) {\n var pt = parent._pt,\n next,\n pt2,\n first,\n last; //sorts the PropTween linked list in order of priority because some plugins need to do their work after ALL of the PropTweens were created (like RoundPropsPlugin and ModifiersPlugin)\n\n while (pt) {\n next = pt._next;\n pt2 = first;\n\n while (pt2 && pt2.pr > pt.pr) {\n pt2 = pt2._next;\n }\n\n if (pt._prev = pt2 ? pt2._prev : last) {\n pt._prev._next = pt;\n } else {\n first = pt;\n }\n\n if (pt._next = pt2) {\n pt2._prev = pt;\n } else {\n last = pt;\n }\n\n pt = next;\n }\n\n parent._pt = first;\n}; //PropTween key: t = target, p = prop, r = renderer, d = data, s = start, c = change, op = overwriteProperty (ONLY populated when it's different than p), pr = priority, _next/_prev for the linked list siblings, set = setter, m = modifier, mSet = modifierSetter (the original setter, before a modifier was added)\n\n\nexport var PropTween = /*#__PURE__*/function () {\n function PropTween(next, target, prop, start, change, renderer, data, setter, priority) {\n this.t = target;\n this.s = start;\n this.c = change;\n this.p = prop;\n this.r = renderer || _renderPlain;\n this.d = data || this;\n this.set = setter || _setterPlain;\n this.pr = priority || 0;\n this._next = next;\n\n if (next) {\n next._prev = this;\n }\n }\n\n var _proto4 = PropTween.prototype;\n\n _proto4.modifier = function modifier(func, tween, target) {\n this.mSet = this.mSet || this.set; //in case it was already set (a PropTween can only have one modifier)\n\n this.set = _setterWithModifier;\n this.m = func;\n this.mt = target; //modifier target\n\n this.tween = tween;\n };\n\n return PropTween;\n}(); //Initialization tasks\n\n_forEachName(_callbackNames + \"parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger\", function (name) {\n return _reservedProps[name] = 1;\n});\n\n_globals.TweenMax = _globals.TweenLite = Tween;\n_globals.TimelineLite = _globals.TimelineMax = Timeline;\n_globalTimeline = new Timeline({\n sortChildren: false,\n defaults: _defaults,\n autoRemoveChildren: true,\n id: \"root\",\n smoothChildTiming: true\n});\n_config.stringFilter = _colorStringFilter;\n/*\n * --------------------------------------------------------------------------------------\n * GSAP\n * --------------------------------------------------------------------------------------\n */\n\nvar _gsap = {\n registerPlugin: function registerPlugin() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n args.forEach(function (config) {\n return _createPlugin(config);\n });\n },\n timeline: function timeline(vars) {\n return new Timeline(vars);\n },\n getTweensOf: function getTweensOf(targets, onlyActive) {\n return _globalTimeline.getTweensOf(targets, onlyActive);\n },\n getProperty: function getProperty(target, property, unit, uncache) {\n _isString(target) && (target = toArray(target)[0]); //in case selector text or an array is passed in\n\n var getter = _getCache(target || {}).get,\n format = unit ? _passThrough : _numericIfPossible;\n\n unit === \"native\" && (unit = \"\");\n return !target ? target : !property ? function (property, unit, uncache) {\n return format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));\n } : format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));\n },\n quickSetter: function quickSetter(target, property, unit) {\n target = toArray(target);\n\n if (target.length > 1) {\n var setters = target.map(function (t) {\n return gsap.quickSetter(t, property, unit);\n }),\n l = setters.length;\n return function (value) {\n var i = l;\n\n while (i--) {\n setters[i](value);\n }\n };\n }\n\n target = target[0] || {};\n\n var Plugin = _plugins[property],\n cache = _getCache(target),\n p = cache.harness && (cache.harness.aliases || {})[property] || property,\n // in case it's an alias, like \"rotate\" for \"rotation\".\n setter = Plugin ? function (value) {\n var p = new Plugin();\n _quickTween._pt = 0;\n p.init(target, unit ? value + unit : value, _quickTween, 0, [target]);\n p.render(1, p);\n _quickTween._pt && _renderPropTweens(1, _quickTween);\n } : cache.set(target, p);\n\n return Plugin ? setter : function (value) {\n return setter(target, p, unit ? value + unit : value, cache, 1);\n };\n },\n isTweening: function isTweening(targets) {\n return _globalTimeline.getTweensOf(targets, true).length > 0;\n },\n defaults: function defaults(value) {\n value && value.ease && (value.ease = _parseEase(value.ease, _defaults.ease));\n return _mergeDeep(_defaults, value || {});\n },\n config: function config(value) {\n return _mergeDeep(_config, value || {});\n },\n registerEffect: function registerEffect(_ref3) {\n var name = _ref3.name,\n effect = _ref3.effect,\n plugins = _ref3.plugins,\n defaults = _ref3.defaults,\n extendTimeline = _ref3.extendTimeline;\n (plugins || \"\").split(\",\").forEach(function (pluginName) {\n return pluginName && !_plugins[pluginName] && !_globals[pluginName] && _warn(name + \" effect requires \" + pluginName + \" plugin.\");\n });\n\n _effects[name] = function (targets, vars, tl) {\n return effect(toArray(targets), _setDefaults(vars || {}, defaults), tl);\n };\n\n if (extendTimeline) {\n Timeline.prototype[name] = function (targets, vars, position) {\n return this.add(_effects[name](targets, _isObject(vars) ? vars : (position = vars) && {}, this), position);\n };\n }\n },\n registerEase: function registerEase(name, ease) {\n _easeMap[name] = _parseEase(ease);\n },\n parseEase: function parseEase(ease, defaultEase) {\n return arguments.length ? _parseEase(ease, defaultEase) : _easeMap;\n },\n getById: function getById(id) {\n return _globalTimeline.getById(id);\n },\n exportRoot: function exportRoot(vars, includeDelayedCalls) {\n if (vars === void 0) {\n vars = {};\n }\n\n var tl = new Timeline(vars),\n child,\n next;\n tl.smoothChildTiming = _isNotFalse(vars.smoothChildTiming);\n\n _globalTimeline.remove(tl);\n\n tl._dp = 0; //otherwise it'll get re-activated when adding children and be re-introduced into _globalTimeline's linked list (then added to itself).\n\n tl._time = tl._tTime = _globalTimeline._time;\n child = _globalTimeline._first;\n\n while (child) {\n next = child._next;\n\n if (includeDelayedCalls || !(!child._dur && child instanceof Tween && child.vars.onComplete === child._targets[0])) {\n _addToTimeline(tl, child, child._start - child._delay);\n }\n\n child = next;\n }\n\n _addToTimeline(_globalTimeline, tl, 0);\n\n return tl;\n },\n utils: {\n wrap: wrap,\n wrapYoyo: wrapYoyo,\n distribute: distribute,\n random: random,\n snap: snap,\n normalize: normalize,\n getUnit: getUnit,\n clamp: clamp,\n splitColor: splitColor,\n toArray: toArray,\n selector: selector,\n mapRange: mapRange,\n pipe: pipe,\n unitize: unitize,\n interpolate: interpolate,\n shuffle: shuffle\n },\n install: _install,\n effects: _effects,\n ticker: _ticker,\n updateRoot: Timeline.updateRoot,\n plugins: _plugins,\n globalTimeline: _globalTimeline,\n core: {\n PropTween: PropTween,\n globals: _addGlobal,\n Tween: Tween,\n Timeline: Timeline,\n Animation: Animation,\n getCache: _getCache,\n _removeLinkedListItem: _removeLinkedListItem,\n suppressOverwrites: function suppressOverwrites(value) {\n return _suppressOverwrites = value;\n }\n }\n};\n\n_forEachName(\"to,from,fromTo,delayedCall,set,killTweensOf\", function (name) {\n return _gsap[name] = Tween[name];\n});\n\n_ticker.add(Timeline.updateRoot);\n\n_quickTween = _gsap.to({}, {\n duration: 0\n}); // ---- EXTRA PLUGINS --------------------------------------------------------\n\nvar _getPluginPropTween = function _getPluginPropTween(plugin, prop) {\n var pt = plugin._pt;\n\n while (pt && pt.p !== prop && pt.op !== prop && pt.fp !== prop) {\n pt = pt._next;\n }\n\n return pt;\n},\n _addModifiers = function _addModifiers(tween, modifiers) {\n var targets = tween._targets,\n p,\n i,\n pt;\n\n for (p in modifiers) {\n i = targets.length;\n\n while (i--) {\n pt = tween._ptLookup[i][p];\n\n if (pt && (pt = pt.d)) {\n if (pt._pt) {\n // is a plugin\n pt = _getPluginPropTween(pt, p);\n }\n\n pt && pt.modifier && pt.modifier(modifiers[p], tween, targets[i], p);\n }\n }\n }\n},\n _buildModifierPlugin = function _buildModifierPlugin(name, modifier) {\n return {\n name: name,\n rawVars: 1,\n //don't pre-process function-based values or \"random()\" strings.\n init: function init(target, vars, tween) {\n tween._onInit = function (tween) {\n var temp, p;\n\n if (_isString(vars)) {\n temp = {};\n\n _forEachName(vars, function (name) {\n return temp[name] = 1;\n }); //if the user passes in a comma-delimited list of property names to roundProps, like \"x,y\", we round to whole numbers.\n\n\n vars = temp;\n }\n\n if (modifier) {\n temp = {};\n\n for (p in vars) {\n temp[p] = modifier(vars[p]);\n }\n\n vars = temp;\n }\n\n _addModifiers(tween, vars);\n };\n }\n };\n}; //register core plugins\n\n\nexport var gsap = _gsap.registerPlugin({\n name: \"attr\",\n init: function init(target, vars, tween, index, targets) {\n var p, pt;\n\n for (p in vars) {\n pt = this.add(target, \"setAttribute\", (target.getAttribute(p) || 0) + \"\", vars[p], index, targets, 0, 0, p);\n pt && (pt.op = p);\n\n this._props.push(p);\n }\n }\n}, {\n name: \"endArray\",\n init: function init(target, value) {\n var i = value.length;\n\n while (i--) {\n this.add(target, i, target[i] || 0, value[i]);\n }\n }\n}, _buildModifierPlugin(\"roundProps\", _roundModifier), _buildModifierPlugin(\"modifiers\"), _buildModifierPlugin(\"snap\", snap)) || _gsap; //to prevent the core plugins from being dropped via aggressive tree shaking, we must include them in the variable declaration in this way.\n\nTween.version = Timeline.version = gsap.version = \"3.9.1\";\n_coreReady = 1;\n_windowExists() && _wake();\nvar Power0 = _easeMap.Power0,\n Power1 = _easeMap.Power1,\n Power2 = _easeMap.Power2,\n Power3 = _easeMap.Power3,\n Power4 = _easeMap.Power4,\n Linear = _easeMap.Linear,\n Quad = _easeMap.Quad,\n Cubic = _easeMap.Cubic,\n Quart = _easeMap.Quart,\n Quint = _easeMap.Quint,\n Strong = _easeMap.Strong,\n Elastic = _easeMap.Elastic,\n Back = _easeMap.Back,\n SteppedEase = _easeMap.SteppedEase,\n Bounce = _easeMap.Bounce,\n Sine = _easeMap.Sine,\n Expo = _easeMap.Expo,\n Circ = _easeMap.Circ;\nexport { Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ };\nexport { Tween as TweenMax, Tween as TweenLite, Timeline as TimelineMax, Timeline as TimelineLite, gsap as default, wrap, wrapYoyo, distribute, random, snap, normalize, getUnit, clamp, splitColor, toArray, selector, mapRange, pipe, unitize, interpolate, shuffle }; //export some internal methods/orojects for use in CSSPlugin so that we can externalize that file and allow custom builds that exclude it.\n\nexport { _getProperty, _numExp, _numWithUnitExp, _isString, _isUndefined, _renderComplexString, _relExp, _setDefaults, _removeLinkedListItem, _forEachName, _sortPropTweensByPriority, _colorStringFilter, _replaceRandom, _checkPlugin, _plugins, _ticker, _config, _roundModifier, _round, _missingPlugin, _getSetter, _getCache, _colorExp };","/*!\n * CSSPlugin 3.9.1\n * https://greensock.com\n *\n * Copyright 2008-2021, GreenSock. All rights reserved.\n * Subject to the terms at https://greensock.com/standard-license or for\n * Club GreenSock members, the agreement issued with that membership.\n * @author: Jack Doyle, jack@greensock.com\n*/\n\n/* eslint-disable */\nimport { gsap, _getProperty, _numExp, _numWithUnitExp, getUnit, _isString, _isUndefined, _renderComplexString, _relExp, _forEachName, _sortPropTweensByPriority, _colorStringFilter, _checkPlugin, _replaceRandom, _plugins, GSCache, PropTween, _config, _ticker, _round, _missingPlugin, _getSetter, _getCache, _colorExp, _setDefaults, _removeLinkedListItem //for the commented-out className feature.\n} from \"./gsap-core.js\";\n\nvar _win,\n _doc,\n _docElement,\n _pluginInitted,\n _tempDiv,\n _tempDivStyler,\n _recentSetterPlugin,\n _windowExists = function _windowExists() {\n return typeof window !== \"undefined\";\n},\n _transformProps = {},\n _RAD2DEG = 180 / Math.PI,\n _DEG2RAD = Math.PI / 180,\n _atan2 = Math.atan2,\n _bigNum = 1e8,\n _capsExp = /([A-Z])/g,\n _horizontalExp = /(?:left|right|width|margin|padding|x)/i,\n _complexExp = /[\\s,\\(]\\S/,\n _propertyAliases = {\n autoAlpha: \"opacity,visibility\",\n scale: \"scaleX,scaleY\",\n alpha: \"opacity\"\n},\n _renderCSSProp = function _renderCSSProp(ratio, data) {\n return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);\n},\n _renderPropWithEnd = function _renderPropWithEnd(ratio, data) {\n return data.set(data.t, data.p, ratio === 1 ? data.e : Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);\n},\n _renderCSSPropWithBeginning = function _renderCSSPropWithBeginning(ratio, data) {\n return data.set(data.t, data.p, ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data);\n},\n //if units change, we need a way to render the original unit/value when the tween goes all the way back to the beginning (ratio:0)\n_renderRoundedCSSProp = function _renderRoundedCSSProp(ratio, data) {\n var value = data.s + data.c * ratio;\n data.set(data.t, data.p, ~~(value + (value < 0 ? -.5 : .5)) + data.u, data);\n},\n _renderNonTweeningValue = function _renderNonTweeningValue(ratio, data) {\n return data.set(data.t, data.p, ratio ? data.e : data.b, data);\n},\n _renderNonTweeningValueOnlyAtEnd = function _renderNonTweeningValueOnlyAtEnd(ratio, data) {\n return data.set(data.t, data.p, ratio !== 1 ? data.b : data.e, data);\n},\n _setterCSSStyle = function _setterCSSStyle(target, property, value) {\n return target.style[property] = value;\n},\n _setterCSSProp = function _setterCSSProp(target, property, value) {\n return target.style.setProperty(property, value);\n},\n _setterTransform = function _setterTransform(target, property, value) {\n return target._gsap[property] = value;\n},\n _setterScale = function _setterScale(target, property, value) {\n return target._gsap.scaleX = target._gsap.scaleY = value;\n},\n _setterScaleWithRender = function _setterScaleWithRender(target, property, value, data, ratio) {\n var cache = target._gsap;\n cache.scaleX = cache.scaleY = value;\n cache.renderTransform(ratio, cache);\n},\n _setterTransformWithRender = function _setterTransformWithRender(target, property, value, data, ratio) {\n var cache = target._gsap;\n cache[property] = value;\n cache.renderTransform(ratio, cache);\n},\n _transformProp = \"transform\",\n _transformOriginProp = _transformProp + \"Origin\",\n _supports3D,\n _createElement = function _createElement(type, ns) {\n var e = _doc.createElementNS ? _doc.createElementNS((ns || \"http://www.w3.org/1999/xhtml\").replace(/^https/, \"http\"), type) : _doc.createElement(type); //some servers swap in https for http in the namespace which can break things, making \"style\" inaccessible.\n\n return e.style ? e : _doc.createElement(type); //some environments won't allow access to the element's style when created with a namespace in which case we default to the standard createElement() to work around the issue. Also note that when GSAP is embedded directly inside an SVG file, createElement() won't allow access to the style object in Firefox (see https://greensock.com/forums/topic/20215-problem-using-tweenmax-in-standalone-self-containing-svg-file-err-cannot-set-property-csstext-of-undefined/).\n},\n _getComputedProperty = function _getComputedProperty(target, property, skipPrefixFallback) {\n var cs = getComputedStyle(target);\n return cs[property] || cs.getPropertyValue(property.replace(_capsExp, \"-$1\").toLowerCase()) || cs.getPropertyValue(property) || !skipPrefixFallback && _getComputedProperty(target, _checkPropPrefix(property) || property, 1) || \"\"; //css variables may not need caps swapped out for dashes and lowercase.\n},\n _prefixes = \"O,Moz,ms,Ms,Webkit\".split(\",\"),\n _checkPropPrefix = function _checkPropPrefix(property, element, preferPrefix) {\n var e = element || _tempDiv,\n s = e.style,\n i = 5;\n\n if (property in s && !preferPrefix) {\n return property;\n }\n\n property = property.charAt(0).toUpperCase() + property.substr(1);\n\n while (i-- && !(_prefixes[i] + property in s)) {}\n\n return i < 0 ? null : (i === 3 ? \"ms\" : i >= 0 ? _prefixes[i] : \"\") + property;\n},\n _initCore = function _initCore() {\n if (_windowExists() && window.document) {\n _win = window;\n _doc = _win.document;\n _docElement = _doc.documentElement;\n _tempDiv = _createElement(\"div\") || {\n style: {}\n };\n _tempDivStyler = _createElement(\"div\");\n _transformProp = _checkPropPrefix(_transformProp);\n _transformOriginProp = _transformProp + \"Origin\";\n _tempDiv.style.cssText = \"border-width:0;line-height:0;position:absolute;padding:0\"; //make sure to override certain properties that may contaminate measurements, in case the user has overreaching style sheets.\n\n _supports3D = !!_checkPropPrefix(\"perspective\");\n _pluginInitted = 1;\n }\n},\n _getBBoxHack = function _getBBoxHack(swapIfPossible) {\n //works around issues in some browsers (like Firefox) that don't correctly report getBBox() on SVG elements inside a element and/or . We try creating an SVG, adding it to the documentElement and toss the element in there so that it's definitely part of the rendering tree, then grab the bbox and if it works, we actually swap out the original getBBox() method for our own that does these extra steps whenever getBBox is needed. This helps ensure that performance is optimal (only do all these extra steps when absolutely necessary...most elements don't need it).\n var svg = _createElement(\"svg\", this.ownerSVGElement && this.ownerSVGElement.getAttribute(\"xmlns\") || \"http://www.w3.org/2000/svg\"),\n oldParent = this.parentNode,\n oldSibling = this.nextSibling,\n oldCSS = this.style.cssText,\n bbox;\n\n _docElement.appendChild(svg);\n\n svg.appendChild(this);\n this.style.display = \"block\";\n\n if (swapIfPossible) {\n try {\n bbox = this.getBBox();\n this._gsapBBox = this.getBBox; //store the original\n\n this.getBBox = _getBBoxHack;\n } catch (e) {}\n } else if (this._gsapBBox) {\n bbox = this._gsapBBox();\n }\n\n if (oldParent) {\n if (oldSibling) {\n oldParent.insertBefore(this, oldSibling);\n } else {\n oldParent.appendChild(this);\n }\n }\n\n _docElement.removeChild(svg);\n\n this.style.cssText = oldCSS;\n return bbox;\n},\n _getAttributeFallbacks = function _getAttributeFallbacks(target, attributesArray) {\n var i = attributesArray.length;\n\n while (i--) {\n if (target.hasAttribute(attributesArray[i])) {\n return target.getAttribute(attributesArray[i]);\n }\n }\n},\n _getBBox = function _getBBox(target) {\n var bounds;\n\n try {\n bounds = target.getBBox(); //Firefox throws errors if you try calling getBBox() on an SVG element that's not rendered (like in a or ). https://bugzilla.mozilla.org/show_bug.cgi?id=612118\n } catch (error) {\n bounds = _getBBoxHack.call(target, true);\n }\n\n bounds && (bounds.width || bounds.height) || target.getBBox === _getBBoxHack || (bounds = _getBBoxHack.call(target, true)); //some browsers (like Firefox) misreport the bounds if the element has zero width and height (it just assumes it's at x:0, y:0), thus we need to manually grab the position in that case.\n\n return bounds && !bounds.width && !bounds.x && !bounds.y ? {\n x: +_getAttributeFallbacks(target, [\"x\", \"cx\", \"x1\"]) || 0,\n y: +_getAttributeFallbacks(target, [\"y\", \"cy\", \"y1\"]) || 0,\n width: 0,\n height: 0\n } : bounds;\n},\n _isSVG = function _isSVG(e) {\n return !!(e.getCTM && (!e.parentNode || e.ownerSVGElement) && _getBBox(e));\n},\n //reports if the element is an SVG on which getBBox() actually works\n_removeProperty = function _removeProperty(target, property) {\n if (property) {\n var style = target.style;\n\n if (property in _transformProps && property !== _transformOriginProp) {\n property = _transformProp;\n }\n\n if (style.removeProperty) {\n if (property.substr(0, 2) === \"ms\" || property.substr(0, 6) === \"webkit\") {\n //Microsoft and some Webkit browsers don't conform to the standard of capitalizing the first prefix character, so we adjust so that when we prefix the caps with a dash, it's correct (otherwise it'd be \"ms-transform\" instead of \"-ms-transform\" for IE9, for example)\n property = \"-\" + property;\n }\n\n style.removeProperty(property.replace(_capsExp, \"-$1\").toLowerCase());\n } else {\n //note: old versions of IE use \"removeAttribute()\" instead of \"removeProperty()\"\n style.removeAttribute(property);\n }\n }\n},\n _addNonTweeningPT = function _addNonTweeningPT(plugin, target, property, beginning, end, onlySetAtEnd) {\n var pt = new PropTween(plugin._pt, target, property, 0, 1, onlySetAtEnd ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue);\n plugin._pt = pt;\n pt.b = beginning;\n pt.e = end;\n\n plugin._props.push(property);\n\n return pt;\n},\n _nonConvertibleUnits = {\n deg: 1,\n rad: 1,\n turn: 1\n},\n //takes a single value like 20px and converts it to the unit specified, like \"%\", returning only the numeric amount.\n_convertToUnit = function _convertToUnit(target, property, value, unit) {\n var curValue = parseFloat(value) || 0,\n curUnit = (value + \"\").trim().substr((curValue + \"\").length) || \"px\",\n // some browsers leave extra whitespace at the beginning of CSS variables, hence the need to trim()\n style = _tempDiv.style,\n horizontal = _horizontalExp.test(property),\n isRootSVG = target.tagName.toLowerCase() === \"svg\",\n measureProperty = (isRootSVG ? \"client\" : \"offset\") + (horizontal ? \"Width\" : \"Height\"),\n amount = 100,\n toPixels = unit === \"px\",\n toPercent = unit === \"%\",\n px,\n parent,\n cache,\n isSVG;\n\n if (unit === curUnit || !curValue || _nonConvertibleUnits[unit] || _nonConvertibleUnits[curUnit]) {\n return curValue;\n }\n\n curUnit !== \"px\" && !toPixels && (curValue = _convertToUnit(target, property, value, \"px\"));\n isSVG = target.getCTM && _isSVG(target);\n\n if ((toPercent || curUnit === \"%\") && (_transformProps[property] || ~property.indexOf(\"adius\"))) {\n px = isSVG ? target.getBBox()[horizontal ? \"width\" : \"height\"] : target[measureProperty];\n return _round(toPercent ? curValue / px * amount : curValue / 100 * px);\n }\n\n style[horizontal ? \"width\" : \"height\"] = amount + (toPixels ? curUnit : unit);\n parent = ~property.indexOf(\"adius\") || unit === \"em\" && target.appendChild && !isRootSVG ? target : target.parentNode;\n\n if (isSVG) {\n parent = (target.ownerSVGElement || {}).parentNode;\n }\n\n if (!parent || parent === _doc || !parent.appendChild) {\n parent = _doc.body;\n }\n\n cache = parent._gsap;\n\n if (cache && toPercent && cache.width && horizontal && cache.time === _ticker.time) {\n return _round(curValue / cache.width * amount);\n } else {\n (toPercent || curUnit === \"%\") && (style.position = _getComputedProperty(target, \"position\"));\n parent === target && (style.position = \"static\"); // like for borderRadius, if it's a % we must have it relative to the target itself but that may not have position: relative or position: absolute in which case it'd go up the chain until it finds its offsetParent (bad). position: static protects against that.\n\n parent.appendChild(_tempDiv);\n px = _tempDiv[measureProperty];\n parent.removeChild(_tempDiv);\n style.position = \"absolute\";\n\n if (horizontal && toPercent) {\n cache = _getCache(parent);\n cache.time = _ticker.time;\n cache.width = parent[measureProperty];\n }\n }\n\n return _round(toPixels ? px * curValue / amount : px && curValue ? amount / px * curValue : 0);\n},\n _get = function _get(target, property, unit, uncache) {\n var value;\n _pluginInitted || _initCore();\n\n if (property in _propertyAliases && property !== \"transform\") {\n property = _propertyAliases[property];\n\n if (~property.indexOf(\",\")) {\n property = property.split(\",\")[0];\n }\n }\n\n if (_transformProps[property] && property !== \"transform\") {\n value = _parseTransform(target, uncache);\n value = property !== \"transformOrigin\" ? value[property] : value.svg ? value.origin : _firstTwoOnly(_getComputedProperty(target, _transformOriginProp)) + \" \" + value.zOrigin + \"px\";\n } else {\n value = target.style[property];\n\n if (!value || value === \"auto\" || uncache || ~(value + \"\").indexOf(\"calc(\")) {\n value = _specialProps[property] && _specialProps[property](target, property, unit) || _getComputedProperty(target, property) || _getProperty(target, property) || (property === \"opacity\" ? 1 : 0); // note: some browsers, like Firefox, don't report borderRadius correctly! Instead, it only reports every corner like borderTopLeftRadius\n }\n }\n\n return unit && !~(value + \"\").trim().indexOf(\" \") ? _convertToUnit(target, property, value, unit) + unit : value;\n},\n _tweenComplexCSSString = function _tweenComplexCSSString(target, prop, start, end) {\n //note: we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within a plugin too, thus \"this\" would refer to the plugin.\n if (!start || start === \"none\") {\n // some browsers like Safari actually PREFER the prefixed property and mis-report the unprefixed value like clipPath (BUG). In other words, even though clipPath exists in the style (\"clipPath\" in target.style) and it's set in the CSS properly (along with -webkit-clip-path), Safari reports clipPath as \"none\" whereas WebkitClipPath reports accurately like \"ellipse(100% 0% at 50% 0%)\", so in this case we must SWITCH to using the prefixed property instead. See https://greensock.com/forums/topic/18310-clippath-doesnt-work-on-ios/\n var p = _checkPropPrefix(prop, target, 1),\n s = p && _getComputedProperty(target, p, 1);\n\n if (s && s !== start) {\n prop = p;\n start = s;\n } else if (prop === \"borderColor\") {\n start = _getComputedProperty(target, \"borderTopColor\"); // Firefox bug: always reports \"borderColor\" as \"\", so we must fall back to borderTopColor. See https://greensock.com/forums/topic/24583-how-to-return-colors-that-i-had-after-reverse/\n }\n }\n\n var pt = new PropTween(this._pt, target.style, prop, 0, 1, _renderComplexString),\n index = 0,\n matchIndex = 0,\n a,\n result,\n startValues,\n startNum,\n color,\n startValue,\n endValue,\n endNum,\n chunk,\n endUnit,\n startUnit,\n relative,\n endValues;\n pt.b = start;\n pt.e = end;\n start += \"\"; //ensure values are strings\n\n end += \"\";\n\n if (end === \"auto\") {\n target.style[prop] = end;\n end = _getComputedProperty(target, prop) || end;\n target.style[prop] = start;\n }\n\n a = [start, end];\n\n _colorStringFilter(a); //pass an array with the starting and ending values and let the filter do whatever it needs to the values. If colors are found, it returns true and then we must match where the color shows up order-wise because for things like boxShadow, sometimes the browser provides the computed values with the color FIRST, but the user provides it with the color LAST, so flip them if necessary. Same for drop-shadow().\n\n\n start = a[0];\n end = a[1];\n startValues = start.match(_numWithUnitExp) || [];\n endValues = end.match(_numWithUnitExp) || [];\n\n if (endValues.length) {\n while (result = _numWithUnitExp.exec(end)) {\n endValue = result[0];\n chunk = end.substring(index, result.index);\n\n if (color) {\n color = (color + 1) % 5;\n } else if (chunk.substr(-5) === \"rgba(\" || chunk.substr(-5) === \"hsla(\") {\n color = 1;\n }\n\n if (endValue !== (startValue = startValues[matchIndex++] || \"\")) {\n startNum = parseFloat(startValue) || 0;\n startUnit = startValue.substr((startNum + \"\").length);\n relative = endValue.charAt(1) === \"=\" ? +(endValue.charAt(0) + \"1\") : 0;\n\n if (relative) {\n endValue = endValue.substr(2);\n }\n\n endNum = parseFloat(endValue);\n endUnit = endValue.substr((endNum + \"\").length);\n index = _numWithUnitExp.lastIndex - endUnit.length;\n\n if (!endUnit) {\n //if something like \"perspective:300\" is passed in and we must add a unit to the end\n endUnit = endUnit || _config.units[prop] || startUnit;\n\n if (index === end.length) {\n end += endUnit;\n pt.e += endUnit;\n }\n }\n\n if (startUnit !== endUnit) {\n startNum = _convertToUnit(target, prop, startValue, endUnit) || 0;\n } //these nested PropTweens are handled in a special way - we'll never actually call a render or setter method on them. We'll just loop through them in the parent complex string PropTween's render method.\n\n\n pt._pt = {\n _next: pt._pt,\n p: chunk || matchIndex === 1 ? chunk : \",\",\n //note: SVG spec allows omission of comma/space when a negative sign is wedged between two numbers, like 2.5-5.3 instead of 2.5,-5.3 but when tweening, the negative value may switch to positive, so we insert the comma just in case.\n s: startNum,\n c: relative ? relative * endNum : endNum - startNum,\n m: color && color < 4 || prop === \"zIndex\" ? Math.round : 0\n };\n }\n }\n\n pt.c = index < end.length ? end.substring(index, end.length) : \"\"; //we use the \"c\" of the PropTween to store the final part of the string (after the last number)\n } else {\n pt.r = prop === \"display\" && end === \"none\" ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue;\n }\n\n _relExp.test(end) && (pt.e = 0); //if the end string contains relative values or dynamic random(...) values, delete the end it so that on the final render we don't actually set it to the string with += or -= characters (forces it to use the calculated value).\n\n this._pt = pt; //start the linked list with this new PropTween. Remember, we call _tweenComplexCSSString.call(pluginInstance...) to ensure that it's scoped properly. We may call it from within another plugin too, thus \"this\" would refer to the plugin.\n\n return pt;\n},\n _keywordToPercent = {\n top: \"0%\",\n bottom: \"100%\",\n left: \"0%\",\n right: \"100%\",\n center: \"50%\"\n},\n _convertKeywordsToPercentages = function _convertKeywordsToPercentages(value) {\n var split = value.split(\" \"),\n x = split[0],\n y = split[1] || \"50%\";\n\n if (x === \"top\" || x === \"bottom\" || y === \"left\" || y === \"right\") {\n //the user provided them in the wrong order, so flip them\n value = x;\n x = y;\n y = value;\n }\n\n split[0] = _keywordToPercent[x] || x;\n split[1] = _keywordToPercent[y] || y;\n return split.join(\" \");\n},\n _renderClearProps = function _renderClearProps(ratio, data) {\n if (data.tween && data.tween._time === data.tween._dur) {\n var target = data.t,\n style = target.style,\n props = data.u,\n cache = target._gsap,\n prop,\n clearTransforms,\n i;\n\n if (props === \"all\" || props === true) {\n style.cssText = \"\";\n clearTransforms = 1;\n } else {\n props = props.split(\",\");\n i = props.length;\n\n while (--i > -1) {\n prop = props[i];\n\n if (_transformProps[prop]) {\n clearTransforms = 1;\n prop = prop === \"transformOrigin\" ? _transformOriginProp : _transformProp;\n }\n\n _removeProperty(target, prop);\n }\n }\n\n if (clearTransforms) {\n _removeProperty(target, _transformProp);\n\n if (cache) {\n cache.svg && target.removeAttribute(\"transform\");\n\n _parseTransform(target, 1); // force all the cached values back to \"normal\"/identity, otherwise if there's another tween that's already set to render transforms on this element, it could display the wrong values.\n\n\n cache.uncache = 1;\n }\n }\n }\n},\n // note: specialProps should return 1 if (and only if) they have a non-zero priority. It indicates we need to sort the linked list.\n_specialProps = {\n clearProps: function clearProps(plugin, target, property, endValue, tween) {\n if (tween.data !== \"isFromStart\") {\n var pt = plugin._pt = new PropTween(plugin._pt, target, property, 0, 0, _renderClearProps);\n pt.u = endValue;\n pt.pr = -10;\n pt.tween = tween;\n\n plugin._props.push(property);\n\n return 1;\n }\n }\n /* className feature (about 0.4kb gzipped).\n , className(plugin, target, property, endValue, tween) {\n \tlet _renderClassName = (ratio, data) => {\n \t\t\tdata.css.render(ratio, data.css);\n \t\t\tif (!ratio || ratio === 1) {\n \t\t\t\tlet inline = data.rmv,\n \t\t\t\t\ttarget = data.t,\n \t\t\t\t\tp;\n \t\t\t\ttarget.setAttribute(\"class\", ratio ? data.e : data.b);\n \t\t\t\tfor (p in inline) {\n \t\t\t\t\t_removeProperty(target, p);\n \t\t\t\t}\n \t\t\t}\n \t\t},\n \t\t_getAllStyles = (target) => {\n \t\t\tlet styles = {},\n \t\t\t\tcomputed = getComputedStyle(target),\n \t\t\t\tp;\n \t\t\tfor (p in computed) {\n \t\t\t\tif (isNaN(p) && p !== \"cssText\" && p !== \"length\") {\n \t\t\t\t\tstyles[p] = computed[p];\n \t\t\t\t}\n \t\t\t}\n \t\t\t_setDefaults(styles, _parseTransform(target, 1));\n \t\t\treturn styles;\n \t\t},\n \t\tstartClassList = target.getAttribute(\"class\"),\n \t\tstyle = target.style,\n \t\tcssText = style.cssText,\n \t\tcache = target._gsap,\n \t\tclassPT = cache.classPT,\n \t\tinlineToRemoveAtEnd = {},\n \t\tdata = {t:target, plugin:plugin, rmv:inlineToRemoveAtEnd, b:startClassList, e:(endValue.charAt(1) !== \"=\") ? endValue : startClassList.replace(new RegExp(\"(?:\\\\s|^)\" + endValue.substr(2) + \"(?![\\\\w-])\"), \"\") + ((endValue.charAt(0) === \"+\") ? \" \" + endValue.substr(2) : \"\")},\n \t\tchangingVars = {},\n \t\tstartVars = _getAllStyles(target),\n \t\ttransformRelated = /(transform|perspective)/i,\n \t\tendVars, p;\n \tif (classPT) {\n \t\tclassPT.r(1, classPT.d);\n \t\t_removeLinkedListItem(classPT.d.plugin, classPT, \"_pt\");\n \t}\n \ttarget.setAttribute(\"class\", data.e);\n \tendVars = _getAllStyles(target, true);\n \ttarget.setAttribute(\"class\", startClassList);\n \tfor (p in endVars) {\n \t\tif (endVars[p] !== startVars[p] && !transformRelated.test(p)) {\n \t\t\tchangingVars[p] = endVars[p];\n \t\t\tif (!style[p] && style[p] !== \"0\") {\n \t\t\t\tinlineToRemoveAtEnd[p] = 1;\n \t\t\t}\n \t\t}\n \t}\n \tcache.classPT = plugin._pt = new PropTween(plugin._pt, target, \"className\", 0, 0, _renderClassName, data, 0, -11);\n \tif (style.cssText !== cssText) { //only apply if things change. Otherwise, in cases like a background-image that's pulled dynamically, it could cause a refresh. See https://greensock.com/forums/topic/20368-possible-gsap-bug-switching-classnames-in-chrome/.\n \t\tstyle.cssText = cssText; //we recorded cssText before we swapped classes and ran _getAllStyles() because in cases when a className tween is overwritten, we remove all the related tweening properties from that class change (otherwise class-specific stuff can't override properties we've directly set on the target's style object due to specificity).\n \t}\n \t_parseTransform(target, true); //to clear the caching of transforms\n \tdata.css = new gsap.plugins.css();\n \tdata.css.init(target, changingVars, tween);\n \tplugin._props.push(...data.css._props);\n \treturn 1;\n }\n */\n\n},\n\n/*\n * --------------------------------------------------------------------------------------\n * TRANSFORMS\n * --------------------------------------------------------------------------------------\n */\n_identity2DMatrix = [1, 0, 0, 1, 0, 0],\n _rotationalProperties = {},\n _isNullTransform = function _isNullTransform(value) {\n return value === \"matrix(1, 0, 0, 1, 0, 0)\" || value === \"none\" || !value;\n},\n _getComputedTransformMatrixAsArray = function _getComputedTransformMatrixAsArray(target) {\n var matrixString = _getComputedProperty(target, _transformProp);\n\n return _isNullTransform(matrixString) ? _identity2DMatrix : matrixString.substr(7).match(_numExp).map(_round);\n},\n _getMatrix = function _getMatrix(target, force2D) {\n var cache = target._gsap || _getCache(target),\n style = target.style,\n matrix = _getComputedTransformMatrixAsArray(target),\n parent,\n nextSibling,\n temp,\n addedToDOM;\n\n if (cache.svg && target.getAttribute(\"transform\")) {\n temp = target.transform.baseVal.consolidate().matrix; //ensures that even complex values like \"translate(50,60) rotate(135,0,0)\" are parsed because it mashes it into a matrix.\n\n matrix = [temp.a, temp.b, temp.c, temp.d, temp.e, temp.f];\n return matrix.join(\",\") === \"1,0,0,1,0,0\" ? _identity2DMatrix : matrix;\n } else if (matrix === _identity2DMatrix && !target.offsetParent && target !== _docElement && !cache.svg) {\n //note: if offsetParent is null, that means the element isn't in the normal document flow, like if it has display:none or one of its ancestors has display:none). Firefox returns null for getComputedStyle() if the element is in an iframe that has display:none. https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n //browsers don't report transforms accurately unless the element is in the DOM and has a display value that's not \"none\". Firefox and Microsoft browsers have a partial bug where they'll report transforms even if display:none BUT not any percentage-based values like translate(-50%, 8px) will be reported as if it's translate(0, 8px).\n temp = style.display;\n style.display = \"block\";\n parent = target.parentNode;\n\n if (!parent || !target.offsetParent) {\n // note: in 3.3.0 we switched target.offsetParent to _doc.body.contains(target) to avoid [sometimes unnecessary] MutationObserver calls but that wasn't adequate because there are edge cases where nested position: fixed elements need to get reparented to accurately sense transforms. See https://github.com/greensock/GSAP/issues/388 and https://github.com/greensock/GSAP/issues/375\n addedToDOM = 1; //flag\n\n nextSibling = target.nextSibling;\n\n _docElement.appendChild(target); //we must add it to the DOM in order to get values properly\n\n }\n\n matrix = _getComputedTransformMatrixAsArray(target);\n temp ? style.display = temp : _removeProperty(target, \"display\");\n\n if (addedToDOM) {\n nextSibling ? parent.insertBefore(target, nextSibling) : parent ? parent.appendChild(target) : _docElement.removeChild(target);\n }\n }\n\n return force2D && matrix.length > 6 ? [matrix[0], matrix[1], matrix[4], matrix[5], matrix[12], matrix[13]] : matrix;\n},\n _applySVGOrigin = function _applySVGOrigin(target, origin, originIsAbsolute, smooth, matrixArray, pluginToAddPropTweensTo) {\n var cache = target._gsap,\n matrix = matrixArray || _getMatrix(target, true),\n xOriginOld = cache.xOrigin || 0,\n yOriginOld = cache.yOrigin || 0,\n xOffsetOld = cache.xOffset || 0,\n yOffsetOld = cache.yOffset || 0,\n a = matrix[0],\n b = matrix[1],\n c = matrix[2],\n d = matrix[3],\n tx = matrix[4],\n ty = matrix[5],\n originSplit = origin.split(\" \"),\n xOrigin = parseFloat(originSplit[0]) || 0,\n yOrigin = parseFloat(originSplit[1]) || 0,\n bounds,\n determinant,\n x,\n y;\n\n if (!originIsAbsolute) {\n bounds = _getBBox(target);\n xOrigin = bounds.x + (~originSplit[0].indexOf(\"%\") ? xOrigin / 100 * bounds.width : xOrigin);\n yOrigin = bounds.y + (~(originSplit[1] || originSplit[0]).indexOf(\"%\") ? yOrigin / 100 * bounds.height : yOrigin);\n } else if (matrix !== _identity2DMatrix && (determinant = a * d - b * c)) {\n //if it's zero (like if scaleX and scaleY are zero), skip it to avoid errors with dividing by zero.\n x = xOrigin * (d / determinant) + yOrigin * (-c / determinant) + (c * ty - d * tx) / determinant;\n y = xOrigin * (-b / determinant) + yOrigin * (a / determinant) - (a * ty - b * tx) / determinant;\n xOrigin = x;\n yOrigin = y;\n }\n\n if (smooth || smooth !== false && cache.smooth) {\n tx = xOrigin - xOriginOld;\n ty = yOrigin - yOriginOld;\n cache.xOffset = xOffsetOld + (tx * a + ty * c) - tx;\n cache.yOffset = yOffsetOld + (tx * b + ty * d) - ty;\n } else {\n cache.xOffset = cache.yOffset = 0;\n }\n\n cache.xOrigin = xOrigin;\n cache.yOrigin = yOrigin;\n cache.smooth = !!smooth;\n cache.origin = origin;\n cache.originIsAbsolute = !!originIsAbsolute;\n target.style[_transformOriginProp] = \"0px 0px\"; //otherwise, if someone sets an origin via CSS, it will likely interfere with the SVG transform attribute ones (because remember, we're baking the origin into the matrix() value).\n\n if (pluginToAddPropTweensTo) {\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"xOrigin\", xOriginOld, xOrigin);\n\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"yOrigin\", yOriginOld, yOrigin);\n\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"xOffset\", xOffsetOld, cache.xOffset);\n\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"yOffset\", yOffsetOld, cache.yOffset);\n }\n\n target.setAttribute(\"data-svg-origin\", xOrigin + \" \" + yOrigin);\n},\n _parseTransform = function _parseTransform(target, uncache) {\n var cache = target._gsap || new GSCache(target);\n\n if (\"x\" in cache && !uncache && !cache.uncache) {\n return cache;\n }\n\n var style = target.style,\n invertedScaleX = cache.scaleX < 0,\n px = \"px\",\n deg = \"deg\",\n origin = _getComputedProperty(target, _transformOriginProp) || \"0\",\n x,\n y,\n z,\n scaleX,\n scaleY,\n rotation,\n rotationX,\n rotationY,\n skewX,\n skewY,\n perspective,\n xOrigin,\n yOrigin,\n matrix,\n angle,\n cos,\n sin,\n a,\n b,\n c,\n d,\n a12,\n a22,\n t1,\n t2,\n t3,\n a13,\n a23,\n a33,\n a42,\n a43,\n a32;\n x = y = z = rotation = rotationX = rotationY = skewX = skewY = perspective = 0;\n scaleX = scaleY = 1;\n cache.svg = !!(target.getCTM && _isSVG(target));\n matrix = _getMatrix(target, cache.svg);\n\n if (cache.svg) {\n t1 = (!cache.uncache || origin === \"0px 0px\") && !uncache && target.getAttribute(\"data-svg-origin\"); // if origin is 0,0 and cache.uncache is true, let the recorded data-svg-origin stay. Otherwise, whenever we set cache.uncache to true, we'd need to set element.style.transformOrigin = (cache.xOrigin - bbox.x) + \"px \" + (cache.yOrigin - bbox.y) + \"px\". Remember, to work around browser inconsistencies we always force SVG elements' transformOrigin to 0,0 and offset the translation accordingly.\n\n _applySVGOrigin(target, t1 || origin, !!t1 || cache.originIsAbsolute, cache.smooth !== false, matrix);\n }\n\n xOrigin = cache.xOrigin || 0;\n yOrigin = cache.yOrigin || 0;\n\n if (matrix !== _identity2DMatrix) {\n a = matrix[0]; //a11\n\n b = matrix[1]; //a21\n\n c = matrix[2]; //a31\n\n d = matrix[3]; //a41\n\n x = a12 = matrix[4];\n y = a22 = matrix[5]; //2D matrix\n\n if (matrix.length === 6) {\n scaleX = Math.sqrt(a * a + b * b);\n scaleY = Math.sqrt(d * d + c * c);\n rotation = a || b ? _atan2(b, a) * _RAD2DEG : 0; //note: if scaleX is 0, we cannot accurately measure rotation. Same for skewX with a scaleY of 0. Therefore, we default to the previously recorded value (or zero if that doesn't exist).\n\n skewX = c || d ? _atan2(c, d) * _RAD2DEG + rotation : 0;\n skewX && (scaleY *= Math.abs(Math.cos(skewX * _DEG2RAD)));\n\n if (cache.svg) {\n x -= xOrigin - (xOrigin * a + yOrigin * c);\n y -= yOrigin - (xOrigin * b + yOrigin * d);\n } //3D matrix\n\n } else {\n a32 = matrix[6];\n a42 = matrix[7];\n a13 = matrix[8];\n a23 = matrix[9];\n a33 = matrix[10];\n a43 = matrix[11];\n x = matrix[12];\n y = matrix[13];\n z = matrix[14];\n angle = _atan2(a32, a33);\n rotationX = angle * _RAD2DEG; //rotationX\n\n if (angle) {\n cos = Math.cos(-angle);\n sin = Math.sin(-angle);\n t1 = a12 * cos + a13 * sin;\n t2 = a22 * cos + a23 * sin;\n t3 = a32 * cos + a33 * sin;\n a13 = a12 * -sin + a13 * cos;\n a23 = a22 * -sin + a23 * cos;\n a33 = a32 * -sin + a33 * cos;\n a43 = a42 * -sin + a43 * cos;\n a12 = t1;\n a22 = t2;\n a32 = t3;\n } //rotationY\n\n\n angle = _atan2(-c, a33);\n rotationY = angle * _RAD2DEG;\n\n if (angle) {\n cos = Math.cos(-angle);\n sin = Math.sin(-angle);\n t1 = a * cos - a13 * sin;\n t2 = b * cos - a23 * sin;\n t3 = c * cos - a33 * sin;\n a43 = d * sin + a43 * cos;\n a = t1;\n b = t2;\n c = t3;\n } //rotationZ\n\n\n angle = _atan2(b, a);\n rotation = angle * _RAD2DEG;\n\n if (angle) {\n cos = Math.cos(angle);\n sin = Math.sin(angle);\n t1 = a * cos + b * sin;\n t2 = a12 * cos + a22 * sin;\n b = b * cos - a * sin;\n a22 = a22 * cos - a12 * sin;\n a = t1;\n a12 = t2;\n }\n\n if (rotationX && Math.abs(rotationX) + Math.abs(rotation) > 359.9) {\n //when rotationY is set, it will often be parsed as 180 degrees different than it should be, and rotationX and rotation both being 180 (it looks the same), so we adjust for that here.\n rotationX = rotation = 0;\n rotationY = 180 - rotationY;\n }\n\n scaleX = _round(Math.sqrt(a * a + b * b + c * c));\n scaleY = _round(Math.sqrt(a22 * a22 + a32 * a32));\n angle = _atan2(a12, a22);\n skewX = Math.abs(angle) > 0.0002 ? angle * _RAD2DEG : 0;\n perspective = a43 ? 1 / (a43 < 0 ? -a43 : a43) : 0;\n }\n\n if (cache.svg) {\n //sense if there are CSS transforms applied on an SVG element in which case we must overwrite them when rendering. The transform attribute is more reliable cross-browser, but we can't just remove the CSS ones because they may be applied in a CSS rule somewhere (not just inline).\n t1 = target.getAttribute(\"transform\");\n cache.forceCSS = target.setAttribute(\"transform\", \"\") || !_isNullTransform(_getComputedProperty(target, _transformProp));\n t1 && target.setAttribute(\"transform\", t1);\n }\n }\n\n if (Math.abs(skewX) > 90 && Math.abs(skewX) < 270) {\n if (invertedScaleX) {\n scaleX *= -1;\n skewX += rotation <= 0 ? 180 : -180;\n rotation += rotation <= 0 ? 180 : -180;\n } else {\n scaleY *= -1;\n skewX += skewX <= 0 ? 180 : -180;\n }\n }\n\n cache.x = x - ((cache.xPercent = x && (cache.xPercent || (Math.round(target.offsetWidth / 2) === Math.round(-x) ? -50 : 0))) ? target.offsetWidth * cache.xPercent / 100 : 0) + px;\n cache.y = y - ((cache.yPercent = y && (cache.yPercent || (Math.round(target.offsetHeight / 2) === Math.round(-y) ? -50 : 0))) ? target.offsetHeight * cache.yPercent / 100 : 0) + px;\n cache.z = z + px;\n cache.scaleX = _round(scaleX);\n cache.scaleY = _round(scaleY);\n cache.rotation = _round(rotation) + deg;\n cache.rotationX = _round(rotationX) + deg;\n cache.rotationY = _round(rotationY) + deg;\n cache.skewX = skewX + deg;\n cache.skewY = skewY + deg;\n cache.transformPerspective = perspective + px;\n\n if (cache.zOrigin = parseFloat(origin.split(\" \")[2]) || 0) {\n style[_transformOriginProp] = _firstTwoOnly(origin);\n }\n\n cache.xOffset = cache.yOffset = 0;\n cache.force3D = _config.force3D;\n cache.renderTransform = cache.svg ? _renderSVGTransforms : _supports3D ? _renderCSSTransforms : _renderNon3DTransforms;\n cache.uncache = 0;\n return cache;\n},\n _firstTwoOnly = function _firstTwoOnly(value) {\n return (value = value.split(\" \"))[0] + \" \" + value[1];\n},\n //for handling transformOrigin values, stripping out the 3rd dimension\n_addPxTranslate = function _addPxTranslate(target, start, value) {\n var unit = getUnit(start);\n return _round(parseFloat(start) + parseFloat(_convertToUnit(target, \"x\", value + \"px\", unit))) + unit;\n},\n _renderNon3DTransforms = function _renderNon3DTransforms(ratio, cache) {\n cache.z = \"0px\";\n cache.rotationY = cache.rotationX = \"0deg\";\n cache.force3D = 0;\n\n _renderCSSTransforms(ratio, cache);\n},\n _zeroDeg = \"0deg\",\n _zeroPx = \"0px\",\n _endParenthesis = \") \",\n _renderCSSTransforms = function _renderCSSTransforms(ratio, cache) {\n var _ref = cache || this,\n xPercent = _ref.xPercent,\n yPercent = _ref.yPercent,\n x = _ref.x,\n y = _ref.y,\n z = _ref.z,\n rotation = _ref.rotation,\n rotationY = _ref.rotationY,\n rotationX = _ref.rotationX,\n skewX = _ref.skewX,\n skewY = _ref.skewY,\n scaleX = _ref.scaleX,\n scaleY = _ref.scaleY,\n transformPerspective = _ref.transformPerspective,\n force3D = _ref.force3D,\n target = _ref.target,\n zOrigin = _ref.zOrigin,\n transforms = \"\",\n use3D = force3D === \"auto\" && ratio && ratio !== 1 || force3D === true; // Safari has a bug that causes it not to render 3D transform-origin values properly, so we force the z origin to 0, record it in the cache, and then do the math here to offset the translate values accordingly (basically do the 3D transform-origin part manually)\n\n\n if (zOrigin && (rotationX !== _zeroDeg || rotationY !== _zeroDeg)) {\n var angle = parseFloat(rotationY) * _DEG2RAD,\n a13 = Math.sin(angle),\n a33 = Math.cos(angle),\n cos;\n\n angle = parseFloat(rotationX) * _DEG2RAD;\n cos = Math.cos(angle);\n x = _addPxTranslate(target, x, a13 * cos * -zOrigin);\n y = _addPxTranslate(target, y, -Math.sin(angle) * -zOrigin);\n z = _addPxTranslate(target, z, a33 * cos * -zOrigin + zOrigin);\n }\n\n if (transformPerspective !== _zeroPx) {\n transforms += \"perspective(\" + transformPerspective + _endParenthesis;\n }\n\n if (xPercent || yPercent) {\n transforms += \"translate(\" + xPercent + \"%, \" + yPercent + \"%) \";\n }\n\n if (use3D || x !== _zeroPx || y !== _zeroPx || z !== _zeroPx) {\n transforms += z !== _zeroPx || use3D ? \"translate3d(\" + x + \", \" + y + \", \" + z + \") \" : \"translate(\" + x + \", \" + y + _endParenthesis;\n }\n\n if (rotation !== _zeroDeg) {\n transforms += \"rotate(\" + rotation + _endParenthesis;\n }\n\n if (rotationY !== _zeroDeg) {\n transforms += \"rotateY(\" + rotationY + _endParenthesis;\n }\n\n if (rotationX !== _zeroDeg) {\n transforms += \"rotateX(\" + rotationX + _endParenthesis;\n }\n\n if (skewX !== _zeroDeg || skewY !== _zeroDeg) {\n transforms += \"skew(\" + skewX + \", \" + skewY + _endParenthesis;\n }\n\n if (scaleX !== 1 || scaleY !== 1) {\n transforms += \"scale(\" + scaleX + \", \" + scaleY + _endParenthesis;\n }\n\n target.style[_transformProp] = transforms || \"translate(0, 0)\";\n},\n _renderSVGTransforms = function _renderSVGTransforms(ratio, cache) {\n var _ref2 = cache || this,\n xPercent = _ref2.xPercent,\n yPercent = _ref2.yPercent,\n x = _ref2.x,\n y = _ref2.y,\n rotation = _ref2.rotation,\n skewX = _ref2.skewX,\n skewY = _ref2.skewY,\n scaleX = _ref2.scaleX,\n scaleY = _ref2.scaleY,\n target = _ref2.target,\n xOrigin = _ref2.xOrigin,\n yOrigin = _ref2.yOrigin,\n xOffset = _ref2.xOffset,\n yOffset = _ref2.yOffset,\n forceCSS = _ref2.forceCSS,\n tx = parseFloat(x),\n ty = parseFloat(y),\n a11,\n a21,\n a12,\n a22,\n temp;\n\n rotation = parseFloat(rotation);\n skewX = parseFloat(skewX);\n skewY = parseFloat(skewY);\n\n if (skewY) {\n //for performance reasons, we combine all skewing into the skewX and rotation values. Remember, a skewY of 10 degrees looks the same as a rotation of 10 degrees plus a skewX of 10 degrees.\n skewY = parseFloat(skewY);\n skewX += skewY;\n rotation += skewY;\n }\n\n if (rotation || skewX) {\n rotation *= _DEG2RAD;\n skewX *= _DEG2RAD;\n a11 = Math.cos(rotation) * scaleX;\n a21 = Math.sin(rotation) * scaleX;\n a12 = Math.sin(rotation - skewX) * -scaleY;\n a22 = Math.cos(rotation - skewX) * scaleY;\n\n if (skewX) {\n skewY *= _DEG2RAD;\n temp = Math.tan(skewX - skewY);\n temp = Math.sqrt(1 + temp * temp);\n a12 *= temp;\n a22 *= temp;\n\n if (skewY) {\n temp = Math.tan(skewY);\n temp = Math.sqrt(1 + temp * temp);\n a11 *= temp;\n a21 *= temp;\n }\n }\n\n a11 = _round(a11);\n a21 = _round(a21);\n a12 = _round(a12);\n a22 = _round(a22);\n } else {\n a11 = scaleX;\n a22 = scaleY;\n a21 = a12 = 0;\n }\n\n if (tx && !~(x + \"\").indexOf(\"px\") || ty && !~(y + \"\").indexOf(\"px\")) {\n tx = _convertToUnit(target, \"x\", x, \"px\");\n ty = _convertToUnit(target, \"y\", y, \"px\");\n }\n\n if (xOrigin || yOrigin || xOffset || yOffset) {\n tx = _round(tx + xOrigin - (xOrigin * a11 + yOrigin * a12) + xOffset);\n ty = _round(ty + yOrigin - (xOrigin * a21 + yOrigin * a22) + yOffset);\n }\n\n if (xPercent || yPercent) {\n //The SVG spec doesn't support percentage-based translation in the \"transform\" attribute, so we merge it into the translation to simulate it.\n temp = target.getBBox();\n tx = _round(tx + xPercent / 100 * temp.width);\n ty = _round(ty + yPercent / 100 * temp.height);\n }\n\n temp = \"matrix(\" + a11 + \",\" + a21 + \",\" + a12 + \",\" + a22 + \",\" + tx + \",\" + ty + \")\";\n target.setAttribute(\"transform\", temp);\n forceCSS && (target.style[_transformProp] = temp); //some browsers prioritize CSS transforms over the transform attribute. When we sense that the user has CSS transforms applied, we must overwrite them this way (otherwise some browser simply won't render the transform attribute changes!)\n},\n _addRotationalPropTween = function _addRotationalPropTween(plugin, target, property, startNum, endValue, relative) {\n var cap = 360,\n isString = _isString(endValue),\n endNum = parseFloat(endValue) * (isString && ~endValue.indexOf(\"rad\") ? _RAD2DEG : 1),\n change = relative ? endNum * relative : endNum - startNum,\n finalValue = startNum + change + \"deg\",\n direction,\n pt;\n\n if (isString) {\n direction = endValue.split(\"_\")[1];\n\n if (direction === \"short\") {\n change %= cap;\n\n if (change !== change % (cap / 2)) {\n change += change < 0 ? cap : -cap;\n }\n }\n\n if (direction === \"cw\" && change < 0) {\n change = (change + cap * _bigNum) % cap - ~~(change / cap) * cap;\n } else if (direction === \"ccw\" && change > 0) {\n change = (change - cap * _bigNum) % cap - ~~(change / cap) * cap;\n }\n }\n\n plugin._pt = pt = new PropTween(plugin._pt, target, property, startNum, change, _renderPropWithEnd);\n pt.e = finalValue;\n pt.u = \"deg\";\n\n plugin._props.push(property);\n\n return pt;\n},\n _assign = function _assign(target, source) {\n // Internet Explorer doesn't have Object.assign(), so we recreate it here.\n for (var p in source) {\n target[p] = source[p];\n }\n\n return target;\n},\n _addRawTransformPTs = function _addRawTransformPTs(plugin, transforms, target) {\n //for handling cases where someone passes in a whole transform string, like transform: \"scale(2, 3) rotate(20deg) translateY(30em)\"\n var startCache = _assign({}, target._gsap),\n exclude = \"perspective,force3D,transformOrigin,svgOrigin\",\n style = target.style,\n endCache,\n p,\n startValue,\n endValue,\n startNum,\n endNum,\n startUnit,\n endUnit;\n\n if (startCache.svg) {\n startValue = target.getAttribute(\"transform\");\n target.setAttribute(\"transform\", \"\");\n style[_transformProp] = transforms;\n endCache = _parseTransform(target, 1);\n\n _removeProperty(target, _transformProp);\n\n target.setAttribute(\"transform\", startValue);\n } else {\n startValue = getComputedStyle(target)[_transformProp];\n style[_transformProp] = transforms;\n endCache = _parseTransform(target, 1);\n style[_transformProp] = startValue;\n }\n\n for (p in _transformProps) {\n startValue = startCache[p];\n endValue = endCache[p];\n\n if (startValue !== endValue && exclude.indexOf(p) < 0) {\n //tweening to no perspective gives very unintuitive results - just keep the same perspective in that case.\n startUnit = getUnit(startValue);\n endUnit = getUnit(endValue);\n startNum = startUnit !== endUnit ? _convertToUnit(target, p, startValue, endUnit) : parseFloat(startValue);\n endNum = parseFloat(endValue);\n plugin._pt = new PropTween(plugin._pt, endCache, p, startNum, endNum - startNum, _renderCSSProp);\n plugin._pt.u = endUnit || 0;\n\n plugin._props.push(p);\n }\n }\n\n _assign(endCache, startCache);\n}; // handle splitting apart padding, margin, borderWidth, and borderRadius into their 4 components. Firefox, for example, won't report borderRadius correctly - it will only do borderTopLeftRadius and the other corners. We also want to handle paddingTop, marginLeft, borderRightWidth, etc.\n\n\n_forEachName(\"padding,margin,Width,Radius\", function (name, index) {\n var t = \"Top\",\n r = \"Right\",\n b = \"Bottom\",\n l = \"Left\",\n props = (index < 3 ? [t, r, b, l] : [t + l, t + r, b + r, b + l]).map(function (side) {\n return index < 2 ? name + side : \"border\" + side + name;\n });\n\n _specialProps[index > 1 ? \"border\" + name : name] = function (plugin, target, property, endValue, tween) {\n var a, vars;\n\n if (arguments.length < 4) {\n // getter, passed target, property, and unit (from _get())\n a = props.map(function (prop) {\n return _get(plugin, prop, property);\n });\n vars = a.join(\" \");\n return vars.split(a[0]).length === 5 ? a[0] : vars;\n }\n\n a = (endValue + \"\").split(\" \");\n vars = {};\n props.forEach(function (prop, i) {\n return vars[prop] = a[i] = a[i] || a[(i - 1) / 2 | 0];\n });\n plugin.init(target, vars, tween);\n };\n});\n\nexport var CSSPlugin = {\n name: \"css\",\n register: _initCore,\n targetTest: function targetTest(target) {\n return target.style && target.nodeType;\n },\n init: function init(target, vars, tween, index, targets) {\n var props = this._props,\n style = target.style,\n startAt = tween.vars.startAt,\n startValue,\n endValue,\n endNum,\n startNum,\n type,\n specialProp,\n p,\n startUnit,\n endUnit,\n relative,\n isTransformRelated,\n transformPropTween,\n cache,\n smooth,\n hasPriority;\n _pluginInitted || _initCore();\n\n for (p in vars) {\n if (p === \"autoRound\") {\n continue;\n }\n\n endValue = vars[p];\n\n if (_plugins[p] && _checkPlugin(p, vars, tween, index, target, targets)) {\n // plugins\n continue;\n }\n\n type = typeof endValue;\n specialProp = _specialProps[p];\n\n if (type === \"function\") {\n endValue = endValue.call(tween, index, target, targets);\n type = typeof endValue;\n }\n\n if (type === \"string\" && ~endValue.indexOf(\"random(\")) {\n endValue = _replaceRandom(endValue);\n }\n\n if (specialProp) {\n specialProp(this, target, p, endValue, tween) && (hasPriority = 1);\n } else if (p.substr(0, 2) === \"--\") {\n //CSS variable\n startValue = (getComputedStyle(target).getPropertyValue(p) + \"\").trim();\n endValue += \"\";\n _colorExp.lastIndex = 0;\n\n if (!_colorExp.test(startValue)) {\n // colors don't have units\n startUnit = getUnit(startValue);\n endUnit = getUnit(endValue);\n }\n\n endUnit ? startUnit !== endUnit && (startValue = _convertToUnit(target, p, startValue, endUnit) + endUnit) : startUnit && (endValue += startUnit);\n this.add(style, \"setProperty\", startValue, endValue, index, targets, 0, 0, p);\n props.push(p);\n } else if (type !== \"undefined\") {\n if (startAt && p in startAt) {\n // in case someone hard-codes a complex value as the start, like top: \"calc(2vh / 2)\". Without this, it'd use the computed value (always in px)\n startValue = typeof startAt[p] === \"function\" ? startAt[p].call(tween, index, target, targets) : startAt[p];\n _isString(startValue) && ~startValue.indexOf(\"random(\") && (startValue = _replaceRandom(startValue));\n getUnit(startValue + \"\") || (startValue += _config.units[p] || getUnit(_get(target, p)) || \"\"); // for cases when someone passes in a unitless value like {x: 100}; if we try setting translate(100, 0px) it won't work.\n\n (startValue + \"\").charAt(1) === \"=\" && (startValue = _get(target, p)); // can't work with relative values\n } else {\n startValue = _get(target, p);\n }\n\n startNum = parseFloat(startValue);\n relative = type === \"string\" && endValue.charAt(1) === \"=\" ? +(endValue.charAt(0) + \"1\") : 0;\n relative && (endValue = endValue.substr(2));\n endNum = parseFloat(endValue);\n\n if (p in _propertyAliases) {\n if (p === \"autoAlpha\") {\n //special case where we control the visibility along with opacity. We still allow the opacity value to pass through and get tweened.\n if (startNum === 1 && _get(target, \"visibility\") === \"hidden\" && endNum) {\n //if visibility is initially set to \"hidden\", we should interpret that as intent to make opacity 0 (a convenience)\n startNum = 0;\n }\n\n _addNonTweeningPT(this, style, \"visibility\", startNum ? \"inherit\" : \"hidden\", endNum ? \"inherit\" : \"hidden\", !endNum);\n }\n\n if (p !== \"scale\" && p !== \"transform\") {\n p = _propertyAliases[p];\n ~p.indexOf(\",\") && (p = p.split(\",\")[0]);\n }\n }\n\n isTransformRelated = p in _transformProps; //--- TRANSFORM-RELATED ---\n\n if (isTransformRelated) {\n if (!transformPropTween) {\n cache = target._gsap;\n cache.renderTransform && !vars.parseTransform || _parseTransform(target, vars.parseTransform); // if, for example, gsap.set(... {transform:\"translateX(50vw)\"}), the _get() call doesn't parse the transform, thus cache.renderTransform won't be set yet so force the parsing of the transform here.\n\n smooth = vars.smoothOrigin !== false && cache.smooth;\n transformPropTween = this._pt = new PropTween(this._pt, style, _transformProp, 0, 1, cache.renderTransform, cache, 0, -1); //the first time through, create the rendering PropTween so that it runs LAST (in the linked list, we keep adding to the beginning)\n\n transformPropTween.dep = 1; //flag it as dependent so that if things get killed/overwritten and this is the only PropTween left, we can safely kill the whole tween.\n }\n\n if (p === \"scale\") {\n this._pt = new PropTween(this._pt, cache, \"scaleY\", cache.scaleY, (relative ? relative * endNum : endNum - cache.scaleY) || 0);\n props.push(\"scaleY\", p);\n p += \"X\";\n } else if (p === \"transformOrigin\") {\n endValue = _convertKeywordsToPercentages(endValue); //in case something like \"left top\" or \"bottom right\" is passed in. Convert to percentages.\n\n if (cache.svg) {\n _applySVGOrigin(target, endValue, 0, smooth, 0, this);\n } else {\n endUnit = parseFloat(endValue.split(\" \")[2]) || 0; //handle the zOrigin separately!\n\n endUnit !== cache.zOrigin && _addNonTweeningPT(this, cache, \"zOrigin\", cache.zOrigin, endUnit);\n\n _addNonTweeningPT(this, style, p, _firstTwoOnly(startValue), _firstTwoOnly(endValue));\n }\n\n continue;\n } else if (p === \"svgOrigin\") {\n _applySVGOrigin(target, endValue, 1, smooth, 0, this);\n\n continue;\n } else if (p in _rotationalProperties) {\n _addRotationalPropTween(this, cache, p, startNum, endValue, relative);\n\n continue;\n } else if (p === \"smoothOrigin\") {\n _addNonTweeningPT(this, cache, \"smooth\", cache.smooth, endValue);\n\n continue;\n } else if (p === \"force3D\") {\n cache[p] = endValue;\n continue;\n } else if (p === \"transform\") {\n _addRawTransformPTs(this, endValue, target);\n\n continue;\n }\n } else if (!(p in style)) {\n p = _checkPropPrefix(p) || p;\n }\n\n if (isTransformRelated || (endNum || endNum === 0) && (startNum || startNum === 0) && !_complexExp.test(endValue) && p in style) {\n startUnit = (startValue + \"\").substr((startNum + \"\").length);\n endNum || (endNum = 0); // protect against NaN\n\n endUnit = getUnit(endValue) || (p in _config.units ? _config.units[p] : startUnit);\n startUnit !== endUnit && (startNum = _convertToUnit(target, p, startValue, endUnit));\n this._pt = new PropTween(this._pt, isTransformRelated ? cache : style, p, startNum, relative ? relative * endNum : endNum - startNum, !isTransformRelated && (endUnit === \"px\" || p === \"zIndex\") && vars.autoRound !== false ? _renderRoundedCSSProp : _renderCSSProp);\n this._pt.u = endUnit || 0;\n\n if (startUnit !== endUnit && endUnit !== \"%\") {\n //when the tween goes all the way back to the beginning, we need to revert it to the OLD/ORIGINAL value (with those units). We record that as a \"b\" (beginning) property and point to a render method that handles that. (performance optimization)\n this._pt.b = startValue;\n this._pt.r = _renderCSSPropWithBeginning;\n }\n } else if (!(p in style)) {\n if (p in target) {\n //maybe it's not a style - it could be a property added directly to an element in which case we'll try to animate that.\n this.add(target, p, startValue || target[p], endValue, index, targets);\n } else {\n _missingPlugin(p, endValue);\n\n continue;\n }\n } else {\n _tweenComplexCSSString.call(this, target, p, startValue, endValue);\n }\n\n props.push(p);\n }\n }\n\n hasPriority && _sortPropTweensByPriority(this);\n },\n get: _get,\n aliases: _propertyAliases,\n getSetter: function getSetter(target, property, plugin) {\n //returns a setter function that accepts target, property, value and applies it accordingly. Remember, properties like \"x\" aren't as simple as target.style.property = value because they've got to be applied to a proxy object and then merged into a transform string in a renderer.\n var p = _propertyAliases[property];\n p && p.indexOf(\",\") < 0 && (property = p);\n return property in _transformProps && property !== _transformOriginProp && (target._gsap.x || _get(target, \"x\")) ? plugin && _recentSetterPlugin === plugin ? property === \"scale\" ? _setterScale : _setterTransform : (_recentSetterPlugin = plugin || {}) && (property === \"scale\" ? _setterScaleWithRender : _setterTransformWithRender) : target.style && !_isUndefined(target.style[property]) ? _setterCSSStyle : ~property.indexOf(\"-\") ? _setterCSSProp : _getSetter(target, property);\n },\n core: {\n _removeProperty: _removeProperty,\n _getMatrix: _getMatrix\n }\n};\ngsap.utils.checkPrefix = _checkPropPrefix;\n\n(function (positionAndScale, rotation, others, aliases) {\n var all = _forEachName(positionAndScale + \",\" + rotation + \",\" + others, function (name) {\n _transformProps[name] = 1;\n });\n\n _forEachName(rotation, function (name) {\n _config.units[name] = \"deg\";\n _rotationalProperties[name] = 1;\n });\n\n _propertyAliases[all[13]] = positionAndScale + \",\" + rotation;\n\n _forEachName(aliases, function (name) {\n var split = name.split(\":\");\n _propertyAliases[split[1]] = all[split[0]];\n });\n})(\"x,y,z,scale,scaleX,scaleY,xPercent,yPercent\", \"rotation,rotationX,rotationY,skewX,skewY\", \"transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective\", \"0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY\");\n\n_forEachName(\"x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective\", function (name) {\n _config.units[name] = \"px\";\n});\n\ngsap.registerPlugin(CSSPlugin);\nexport { CSSPlugin as default, _getBBox, _createElement, _checkPropPrefix as checkPrefix };","import { gsap, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ, TweenLite, TimelineLite, TimelineMax } from \"./gsap-core.js\";\nimport { CSSPlugin } from \"./CSSPlugin.js\";\nvar gsapWithCSS = gsap.registerPlugin(CSSPlugin) || gsap,\n // to protect from tree shaking\nTweenMaxWithCSS = gsapWithCSS.core.Tween;\nexport { gsapWithCSS as gsap, gsapWithCSS as default, CSSPlugin, TweenMaxWithCSS as TweenMax, TweenLite, TimelineMax, TimelineLite, Power0, Power1, Power2, Power3, Power4, Linear, Quad, Cubic, Quart, Quint, Strong, Elastic, Back, SteppedEase, Bounce, Sine, Expo, Circ };","export const ani = (...args) => Object.assign({}, ...args);\nimport { Power3, Power1 } from \"gsap\";\n\nexport const paused = true;\nexport const DEFAULT_TIME_SHORT = 0.2;\nexport const DEFAULT_TIME = 1;\nexport const DEFAULT_STAGGER = 0.1;\nexport const DEFAULT_EASE = { ease: Power1.easeOut };\n\n// Delays\nexport const SUBTLE_DELAY = 0.4;\nexport const NOT_SUBTLE_DELAY = 0.6;\n// Opacity\nexport const START_OPACITY = { opacity: 0 };\nexport const FINISH_OPACITY = { opacity: 1 };\n\n// Offsets\nexport const START_Y_OFFSET = { y: 20 };\nexport const FINISH_Y_OFFSET = { y: 0 };\n\nexport const DEFAULT_OPTIONS = {\n\tDEFAULT_STAGGER,\n};\nexport const COLORS = {\n\tbrandPrimary: \"#ffd846\",\n\tbrandWhite: \"#f6f6f6\",\n\tblack: \"#000\",\n\twhite: \"#fff\",\n};\nexport const ANIMATION_DEFAULTS = {\n\tpaused,\n\tDEFAULT_TIME,\n\tDEFAULT_TIME_SHORT,\n\tDEFAULT_STAGGER,\n\tCOLORS,\n};\n\nexport const ANIMATION_MOVEMENT = {\n\tOFFSET: {\n\t\tSTART_Y_OFFSET,\n\t\tFINISH_Y_OFFSET,\n\t},\n\tOPACITY: { START_OPACITY, FINISH_OPACITY },\n};\n\nexport const SIMPLE_ANIMATION_START = ani(\n\tSTART_Y_OFFSET,\n\tSTART_OPACITY,\n\tDEFAULT_EASE,\n);\nexport const SIMPLE_ANIMATION_FINISH = ani(\n\tFINISH_Y_OFFSET,\n\tFINISH_OPACITY,\n\tDEFAULT_EASE,\n);\n","import gsap from \"gsap\";\nimport { paused, ANIMATION_DEFAULTS } from \"../../js/animations/config\";\nimport { debounce, TABLET_SIZE, qs, DESKTOP_SIZE, qsa } from \"../../js/utils\";\n\nclass MainMenu {\n\tconstructor(el) {\n\t\tif (!el) return;\n\t\tthis.opened = false;\n\t\tthis.el = el;\n\t\tconsole.log(document.querySelector(\"#toolbar-administration\"));\n\t\tthis.hasPromo = document.querySelector(\".promo--top\") ? true : false;\n\t\tif (\n\t\t\t!document.querySelector(\".submenu\") &&\n\t\t\t!document.querySelector(\"#toolbar-administration\")\n\t\t) {\n\t\t\tthis.el.classList.add(\"sticky\");\n\t\t}\n\t\tif (this.el) {\n\t\t\tthis.setupEvents();\n\t\t}\n\t}\n\n\tisMenuOpened() {\n\t\treturn this.opened;\n\t}\n\n\thandleClickaway({ target }) {\n\t\tif (!target.closest(\"#site-header\") && window.innerWidth >= DESKTOP_SIZE) {\n\t\t\t// this lets us offcenter thing as neede\n\t\t\tconst dropdown = document.querySelector(\".menu--dropdown-active\");\n\t\t\tif (dropdown) {\n\t\t\t\tdocument.body.classList.remove(\"prevent-scrolling\");\n\t\t\t\tconsole.log(dropdown.classList);\n\t\t\t\tdropdown.classList.remove(\"menu--dropdown-active\");\n\t\t\t\tdropdown\n\t\t\t\t\t.querySelector('[aria-expanded=\"true\"]')\n\t\t\t\t\t.setAttribute(\"aria-expanded\", \"false\");\n\t\t\t\tconsole.log(dropdown.classList);\n\t\t\t}\n\t\t}\n\n\t\t// Handle clickaway cart - WOOOOOOOOOOOOOO\n\t\tconst cart = document.querySelector(\"#cart-app\");\n\t\tif (target.id == \"cart-app\" && cart && cart.classList.contains(\"active\")) {\n\t\t\tcart.classList.remove(\"active\");\n\t\t\tdocument.body.classList.remove(\"prevent-scrolling\");\n\t\t}\n\t}\n\n\tsetupEvents() {\n\t\tconst hamburger = this.el.querySelector(\".hamburger\");\n\t\tdocument.body.addEventListener(\"click\", this.handleClickaway.bind(this));\n\t\thamburger.addEventListener(\"click\", this.toggleMobileMenu.bind(this));\n\n\t\tconst dropdownLinks = this.el.querySelectorAll(\".has-dropdown\");\n\t\t[...dropdownLinks].forEach((wrapper) => {\n\t\t\tconst link = wrapper.querySelector(\"[data-link-title]\");\n\t\t\tconst dropdown = wrapper.querySelector(\".js-menu-dropdown\");\n\n\t\t\tlink.addEventListener(\"click\", this.toggleDropdowns.bind(this));\n\t\t});\n\n\t\tthis.recalculate();\n\t}\n\n\ttoggleMobileMenu() {\n\t\tconst mobileActiveClass = \"mobile-menu-opened\";\n\t\tconsole.log(this.el);\n\t\tconst fn = this.el.classList.contains(mobileActiveClass) ? \"remove\" : \"add\";\n\t\tthis.opened = !this.opened;\n\t\tthis.menuToggleAnimation(this.el, { fn, mobileActiveClass });\n\t}\n\n\ttoggleDropdowns(e) {\n\t\t\n\t\t// for discover submenu\n\t\tconst subItemsEl = e.target.parentNode.querySelector('.js-sub-items');\n\t\tlet dropdownEnabled = (subItemsEl && window.getComputedStyle(subItemsEl).display == 'none') ? false : true\n\t\tif (dropdownEnabled) e.preventDefault();\n\n\t\tconst { target } = e;\n\t\tconst targetParent = target.parentNode;\n\t\tconst dropdown = target.parentNode.querySelector(\".js-menu-dropdown\");\n\t\t// const otherDropdowns = this.el.querySelectorAll(\".menu--dropdown-active\");\n\t\tconst otherDropdowns = targetParent.parentNode.querySelectorAll(\".menu--dropdown-active\");\n\n\t\t// this lets us offcenter thing as needed\n\t\tconst windowSize = window.innerWidth;\n\t\tconsole.log(windowSize >= TABLET_SIZE);\n\t\tlet promoTopOffset = windowSize >= TABLET_SIZE ? 100 : 0;\n\t\tpromoTopOffset = this.getOffsetForMenu();\n\n\t\t[...otherDropdowns].forEach((el) => {\n\t\t\tif (el !== targetParent) {\n\t\t\t\tel.classList.remove(\"menu--dropdown-active\");\n\t\t\t\tel.querySelector('[aria-expanded=\"true\"]').setAttribute(\n\t\t\t\t\t\"aria-expanded\",\n\t\t\t\t\t\"false\",\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\ttarget.parentNode.classList.toggle(\"menu--dropdown-active\");\n\t\tconst addOrRemove = target.parentNode.classList.contains(\n\t\t\t\"menu--dropdown-active\",\n\t\t)\n\t\t\t? \"add\"\n\t\t\t: \"remove\";\n\t\tdocument.body.classList[addOrRemove](\"prevent-scrolling\");\n\t\ttarget.setAttribute(\n\t\t\t\"aria-expanded\",\n\t\t\ttarget.parentNode.classList.contains(\"menu--dropdown-active\"),\n\t\t);\n\t\tconsole.log(\"promo top offset is...\", promoTopOffset);\n\t\tdropdown.style.top = `${promoTopOffset}px`;\n\t\tif (window.outerWidth > 767) {\n\t\t\tdropdown.style.maxHeight = `calc(100vh - ${promoTopOffset}px`;\n\t\t} else {\n\t\t\tdropdown.style.maxHeight = \"none\";\n\t\t}\n\t}\n\n\tgetOffsetForMenu() {\n\t\t// const promoTop = document.querySelector(\".promo--top\");\n\t\t// const bodyTopMargin = parseInt(\n\t\t// \twindow.getComputedStyle(document.body).paddingTop,\n\t\t// \t10,\n\t\t// );\n\t\t// let offset = 0;\n\t\t// if (promoTop && window.pageYOffset <= promoTop.offsetHeight) {\n\t\t// \toffset += promoTop.offsetHeight;\n\t\t// }\n\t\t// offset += bodyTopMargin;\n\t\t// return offset;\n\t\tconst aboveHeader = document.querySelector(\".above-header\");\n\t\tconst siteHeader = document.querySelector(\"#site-header\");\n\t\tif (!aboveHeader && !siteHeader ) return 0;\n\t\tconst aboveHeaderRect = aboveHeader.getBoundingClientRect();\n\t\tconst siteHeaderRect = siteHeader.getBoundingClientRect();\n\t\treturn (siteHeaderRect.top === 0) \n\t\t\t? siteHeaderRect.top + siteHeaderRect.height\n\t\t\t: aboveHeaderRect.top + aboveHeaderRect.height + siteHeaderRect.height;\n\t}\n\n\tmenuToggleAnimation(el, { fn, mobileActiveClass }) {\n\t\t// variables\n\t\tconst menuOpened = this.isMenuOpened();\n\t\tconst { hasPromo } = this;\n\t\tconst { DEFAULT_TIME, DEFAULT_TIME_SHORT, COLORS } = ANIMATION_DEFAULTS;\n\t\tconst animatedCover = this.el.querySelector(\n\t\t\t\".links-holder--animated-cover\",\n\t\t);\n\t\tconst allLinks = el.querySelectorAll(\"header nav > ul > li\");\n\t\tconst search = el.querySelector(\".mobile--drupal-search\");\n\t\tconst isRemoving = fn === \"remove\";\n\t\tconst linksStartingX = isRemoving ? { x: 0 } : { x: -10 };\n\t\tconst linksFinishing = isRemoving\n\t\t\t? { autoAlpha: 0, x: -10, stagger: 0.2 }\n\t\t\t: { autoAlpha: 1, x: 0, stagger: 0.2 };\n\t\t// open animation\n\t\t// 1. Cover with the border\n\t\t// 2. Move things around because of promo potentially being there\n\t\t// 3. Uncover\n\t\t// 4. Slide things in\n\t\tconsole.log(\"starting\");\n\t\tconst tl = gsap.timeline();\n\t\ttl.to(animatedCover, DEFAULT_TIME_SHORT, {\n\t\t\tzIndex: 5,\n\t\t\tborderWidth: \"50vw 50vw\",\n\t\t});\n\t\ttl.call(() => {\n\t\t\tthis.el.classList[fn](mobileActiveClass);\n\t\t\tif (fn === \"add\") {\n\t\t\t\t[...allLinks].forEach((el) => (el.style.opacity = \"0\"));\n\t\t\t}\n\t\t});\n\t\ttl.to(animatedCover, DEFAULT_TIME_SHORT, {\n\t\t\tdelay: DEFAULT_TIME_SHORT,\n\t\t\tborderWidth: \"0\",\n\t\t});\n\t\tif (fn === \"add\") {\n\t\t\ttl.staggerFromTo(allLinks, DEFAULT_TIME, linksStartingX, linksFinishing);\n\t\t}\n\t}\n\n\t// TODO: decide if this is how I want this to behave\n\trecalculate(el) {\n\t\tconsole.log(\"this would recalculate all the things\");\n\t\twindow.addEventListener(\n\t\t\t\"resize\",\n\t\t\tdebounce(() => {\n\t\t\t\tif (window.innerWidth >= TABLET_SIZE) {\n\t\t\t\t\tconst activeDropdown = document.querySelector(\n\t\t\t\t\t\t\".menu--dropdown-active\",\n\t\t\t\t\t);\n\t\t\t\t\tconst offset = this.getOffsetForMenu();\n\t\t\t\t\tif (activeDropdown) {\n\t\t\t\t\t\tactiveDropdown.style = \"\";\n\t\t\t\t\t\tdocument.querySelector(\".menu--dropdown\").style = `top: ${\n\t\t\t\t\t\t\toffset\n\t\t\t\t\t\t}px; max-height: calc(100vh - ${offset}px)`;\n\t\t\t\t\t\twindow.scroll({ top: 0 });\n\t\t\t\t\t\tdocument.body.classList.add(\"prevent-scrolling\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (window.innerWidth < TABLET_SIZE) {\n\t\t\t\t\tdocument.body.classList.remove(\"prevent-scrolling\");\n\t\t\t\t}\n\t\t\t}, 200),\n\t\t);\n\t}\n}\n\nconst nav = document.querySelector(\"#site-header\");\nif (!nav) {\n\tconsole.warn(\"Menu isn't found\");\n}\nexport default new MainMenu(nav);\n","import Vue from \"vue\";\nimport gsap from \"gsap\";\n\nexport const wizardIntroAnimation = (el) => {\n\tconst tl = gsap.timeline({\n\t\t/*paused: true*/\n\t});\n\tconst wizard = el;\n\tconst actionBar = el.querySelector(\".product-wizard--action-bar\");\n\tconst content = el.querySelector(\".product-wizard--content\");\n\n\ttl.call(function () {\n\t\tthis.shown = true;\n\t\twizard.classList.add(\"enabled\");\n\t});\n\t// tl.set(wizard, { delay: 0.4, className: \"+=animate-in\" });\n\ttl.set(wizard, { delay: 0.4 });\n\ttl.call(function () {\n\t\twizard.classList.add(\"animate-in\");\n\t});\n\ttl.fromTo(\n\t\t[content, actionBar],\n\t\t0.4,\n\t\t{ delay: 0.2, autoAlpha: 0 },\n\t\t{ autoAlpha: 1 },\n\t);\n\n\treturn tl;\n};\n\nexport const wizardOutroAnimation = (el) => {\n\tconst tl = gsap.timeline();\n\tconst wizard = el;\n\tconst actionBar = el.querySelector(\".product-wizard--action-bar\");\n\tconst content = el.querySelector(\".product-wizard--content\");\n\n\ttl.to([content, actionBar], 0.4, { autoAlpha: 0 }, { autoAlpha: 1 });\n\ttl.call(() => {\n\t\twizard.classList.remove(\"animate-in\");\n\t});\n\t// tl.set(wizard, { delay: 0.4, className: \"-=enabled\" });\n\ttl.set(wizard, { delay: 0.4 });\n\ttl.call(() => {\n\t\twizard.classList.remove(\"enabled\");\n\t});\n\n\treturn tl;\n};\n\nexport const resultsIntroAnimation = (el) => {\n\tconst wizard = el.closest(\".product-wizard\");\n\tconst topChoice = el.querySelector(\".product-wizard--top-choice\");\n\tconst topChoiceContent = el.querySelector(\n\t\t\".product-wizard--top-choice-content\",\n\t);\n\tconst alternativeDivs = el.querySelectorAll(\n\t\t\".product-wizard--alternatives > div\",\n\t);\n\tconst tl = gsap.timeline();\n\t// tl.delay(1);\n\t// tl.set(el, { autoAlpha: 0 });\n\ttl.call(() => {\n\t\twizard.classList.add(\"results\");\n\t});\n\t// tl.set(wizard, { className: \"+=results\" });\n\ttl.to(el, 0.2, { delay: 0.4, autoAlpha: 1 });\n\ttl.call(() => {\n\t\ttopChoice.classList.add(\"animate-in\");\n\t});\n\t// tl.set(topChoice, { className: \"+=animate-in\" }, 0.2);\n\ttl.fromTo(\n\t\t[topChoiceContent, ...alternativeDivs],\n\t\t0.5,\n\t\t{ autoAlpha: 0, y: -100 },\n\t\t{ delay: 0.3, autoAlpha: 1, y: 0 },\n\t);\n\treturn tl;\n};\n\n// In this context, el is the outermost Wizard\nexport const resultsOutroAnimation = (el) => {\n\tconst topChoice = el.querySelector(\".product-wizard--top-choice\");\n\tconst topChoiceContent = el.querySelector(\n\t\t\".product-wizard--top-choice-content\",\n\t);\n\tconst alternativeDivs = el.querySelectorAll(\n\t\t\".product-wizard--alternatives > div\",\n\t);\n\tconst tl = gsap.timeline({ paused: true });\n\ttl.fromTo(\n\t\t[topChoiceContent, ...alternativeDivs],\n\t\t0.5,\n\t\t{ autoAlpha: 1, y: 0 },\n\t\t{ autoAlpha: 0, y: -100 },\n\t);\n\ttl.call(() => {\n\t\ttopChoice.classList.remove(\"animate-in\");\n\t\tel.classList.remove(\"results\");\n\t});\n\treturn tl;\n};\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('svg',{attrs:{\"version\":\"1.1\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":\"15\",\"height\":\"15\",\"viewBox\":\"0 0 28 28\"}},[_c('path',{attrs:{\"d\":\"M24.327 4.548c-2.56-2.795-6.239-4.548-10.327-4.548-7.732 0-14 6.268-14 14h2.625c0-6.282 5.093-11.375 11.375-11.375 3.364 0 6.386 1.461 8.468 3.782l-4.093 4.093h9.625v-9.625l-3.673 3.673z\"}}),_vm._v(\" \"),_c('path',{attrs:{\"d\":\"M25.375 14c0 6.282-5.093 11.375-11.375 11.375-3.364 0-6.386-1.461-8.468-3.782l4.093-4.093h-9.625v9.625l3.673-3.673c2.56 2.795 6.239 4.548 10.327 4.548 7.732 0 14-6.268 14-14h-2.625z\"}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./RestartIcon.vue?vue&type=template&id=19d5878a&\"\nvar script = {}\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import { render, staticRenderFns } from \"./BackArrow.vue?vue&type=template&id=4fb0e301&\"\nvar script = {}\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('svg',{attrs:{\"version\":\"1.1\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":\"10\",\"height\":\"10\",\"viewBox\":\"0 0 28 28\"}},[_c('path',{attrs:{\"d\":\"M11.013 23.987l-8.75-8.75c-0.683-0.683-0.683-1.791 0-2.475l8.75-8.75c0.683-0.683 1.791-0.683 2.475 0s0.683 1.791 0 2.475l-5.763 5.763h16.775c0.966 0 1.75 0.784 1.75 1.75s-0.784 1.75-1.75 1.75h-16.775l5.763 5.763c0.342 0.342 0.513 0.79 0.513 1.237s-0.171 0.896-0.513 1.237c-0.683 0.683-1.791 0.683-2.475 0z\"}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./ButtonPage.vue?vue&type=template&id=cf1b9da8&\"\nimport script from \"./ButtonPage.vue?vue&type=script&lang=js&\"\nexport * from \"./ButtonPage.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t
\n\t\t\t\n\t\t
\n\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t
\n\t
\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"product-wizard--content\"},[_c('div',{staticClass:\"product-wizard--question wizard-gutters pattern--base\"},[_vm._t(\"header\")],2),_vm._v(\" \"),_c('div',{staticClass:\"product-wizard--card\"},[_c('div',{staticClass:\"product-wizard--card-choices wizard-gutters\",class:{ 'flex-card': _vm.flexCard }},[_vm._t(\"buttons\")],2),_vm._v(\" \"),_c('div',{staticClass:\"product-wizard--card-next wizard-gutters pattern--black\"},[_vm._t(\"nextButton\",[_c('a',{staticClass:\"btn btn--border btn--arrow btn--primary borderless\",attrs:{\"href\":\"#product-wizard\"},on:{\"click\":function($event){$event.preventDefault();return _vm.validate(_vm.hash)},\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.preventDefault();return _vm.validate(_vm.hash)}}},[_vm._v(\"\\n\\t\\t\\t\\t\\tNext\\n\\t\\t\\t\\t\")])])],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Page1.vue?vue&type=template&id=b739819c&\"\nimport script from \"./Page1.vue?vue&type=script&lang=js&\"\nexport * from \"./Page1.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t\n\t\t\tWe want to get to know you.\n\t\t\tWhat's your cooking skill level?
\n\t\t\tPlease select one of the skill levels.
\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\tNext\n\t\t\t\n\t\t\n\t\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button-page',{attrs:{\"flexCard\":false}},[_c('template',{slot:\"header\"},[_c('span',{staticClass:\"subtitle--line secondary\"},[_vm._v(\"We want to get to know you.\")]),_vm._v(\" \"),_c('h1',{staticClass:\"h2\"},[_vm._v(\"What's your cooking skill level?\")]),_vm._v(\" \"),(_vm.error)?_c('p',{staticClass:\"error\"},[_vm._v(\"Please select one of the skill levels.\")]):_vm._e()]),_vm._v(\" \"),_c('template',{slot:\"buttons\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"type\":\"radio\",\"id\":\"beginner\",\"name\":\"skill\",\"value\":\"adam\"},domProps:{\"checked\":_vm._q(_vm.value,\"adam\")},on:{\"change\":function($event){_vm.value=\"adam\"}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"beginner\"}},[_c('strong',[_vm._v(\"I'm a beginner.\")]),_vm._v(\" \"),_c('p',[_vm._v(\"I'm mostly new to cooking, and I'm eager to learn more.\")])]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"type\":\"radio\",\"id\":\"intermediate\",\"name\":\"skill\",\"value\":\"megan\"},domProps:{\"checked\":_vm._q(_vm.value,\"megan\")},on:{\"change\":function($event){_vm.value=\"megan\"}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"intermediate\"}},[_c('strong',[_vm._v(\"I have some experience.\")]),_vm._v(\" \"),_c('p',[_vm._v(\"\\n\\t\\t\\t\\tI'm comfortable cooking most recipes, and I'm ready to improve my\\n\\t\\t\\t\\tcraft.\\n\\t\\t\\t\")])]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"type\":\"radio\",\"id\":\"professional\",\"name\":\"skill\",\"value\":\"kathy\"},domProps:{\"checked\":_vm._q(_vm.value,\"kathy\")},on:{\"change\":function($event){_vm.value=\"kathy\"}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"professional\"}},[_c('strong',[_vm._v(\"I'm a pro.\")]),_vm._v(\" \"),_c('p',[_vm._v(\"I find cooking easy, and I'm not intimidated by complex recipes.\")])])]),_vm._v(\" \"),_c('template',{slot:\"nextButton\"},[_c('a',{staticClass:\"btn btn--border btn--arrow btn--primary borderless\",attrs:{\"disabled\":_vm.buttonDisabled,\"href\":\"#product-wizard/collection\"},on:{\"click\":_vm.validate}},[_vm._v(\"\\n\\t\\t\\tNext\\n\\t\\t\")])])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Page2.vue?vue&type=template&id=bc9d93f4&\"\nimport script from \"./Page2.vue?vue&type=script&lang=js&\"\nexport * from \"./Page2.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t\n\t\t\tCooking Type\n\t\t\tWhat can we help you find today?
\n\t\t\tPlease select one of the choices.
\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\tNext\n\t\t\t\n\t\t\n\t\n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button-page',{attrs:{\"flexCard\":false}},[_c('template',{slot:\"header\"},[_c('span',{staticClass:\"subtitle--line secondary\"},[_vm._v(\"Cooking Type\")]),_vm._v(\" \"),_c('h1',{staticClass:\"h2\"},[_vm._v(\"What can we help you find today?\")]),_vm._v(\" \"),(_vm.error)?_c('p',{staticClass:\"error\"},[_vm._v(\"Please select one of the choices.\")]):_vm._e()]),_vm._v(\" \"),_c('template',{slot:\"buttons\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"type\":\"radio\",\"id\":\"beginner\",\"name\":\"skill\",\"value\":\"basic\"},domProps:{\"checked\":_vm._q(_vm.value,\"basic\")},on:{\"change\":function($event){_vm.value=\"basic\"}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"beginner\"}},[_c('strong',[_vm._v(\"I'm in need of the basics.\")]),_vm._v(\" \"),_c('p',[_vm._v(\"\\n\\t\\t\\t\\tMy go-to pots and pans are looking a little worse for wear; it's time\\n\\t\\t\\t\\tfor some new everyday cookware.\\n\\t\\t\\t\")])]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"type\":\"radio\",\"id\":\"intermediate\",\"name\":\"skill\",\"value\":\"intermediate\"},domProps:{\"checked\":_vm._q(_vm.value,\"intermediate\")},on:{\"change\":function($event){_vm.value=\"intermediate\"}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"intermediate\"}},[_c('strong',[_vm._v(\"I want to grow my collection.\")]),_vm._v(\" \"),_c('p',[_vm._v(\"\\n\\t\\t\\t\\tI have a few pieces of cookware I love, and I'm ready to add more.\\n\\t\\t\\t\")])]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"type\":\"radio\",\"id\":\"professional\",\"name\":\"skill\",\"value\":\"professional\"},domProps:{\"checked\":_vm._q(_vm.value,\"professional\")},on:{\"change\":function($event){_vm.value=\"professional\"}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"professional\"}},[_c('strong',[_vm._v(\"I want unique cookware items.\")]),_vm._v(\" \"),_c('p',[_vm._v(\"\\n\\t\\t\\t\\tI have a well-stocked collection of cookware, but I'm always looking\\n\\t\\t\\t\\tfor new pieces.\\n\\t\\t\\t\")])])]),_vm._v(\" \"),_c('template',{slot:\"nextButton\"},[_c('a',{staticClass:\"btn btn--border btn--arrow btn--primary borderless\",attrs:{\"disabled\":_vm.buttonDisabled,\"href\":\"#product-wizard/flavor\"},on:{\"click\":_vm.validate}},[_vm._v(\"\\n\\t\\t\\tNext\\n\\t\\t\")])])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./ImageButton.vue?vue&type=template&id=7eff9072&\"\nimport script from \"./ImageButton.vue?vue&type=script&lang=js&\"\nexport * from \"./ImageButton.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"product-wizard--image-button\",class:{ checked: _vm.checked },attrs:{\"tabindex\":\"0\",\"role\":\"button\"},on:{\"click\":_vm.onClick,\"keypress\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.onClick($event)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"space\",32,$event.key,[\" \",\"Spacebar\"])){ return null; }return _vm.onClick($event)}]}},[_c('div',[_c('div',[_c('img',{attrs:{\"src\":_vm.image,\"alt\":_vm.alt}})])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Loader.vue?vue&type=template&id=d8b2b9f8&\"\nvar script = {}\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _vm._m(0)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"product-wizard--content\"},[_c('div',{staticClass:\"product-wizard--question wizard-gutters pattern--base\"},[_c('h1',{staticClass:\"h2\"},[_vm._v(\"This is a real tough choice.\")])]),_vm._v(\" \"),_c('div',{staticClass:\"product-wizard--card\"},[_c('div',{staticClass:\"product-wizard--card-choices wizard-gutters\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\tIt's hard to narrow it down to just a few of our products to\\n\\t\\t\\t\\trecommend. Give us one more second.\\n\\t\\t\\t\")])])])])}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Page3.vue?vue&type=template&id=b1121628&\"\nimport script from \"./Page3.vue?vue&type=script&lang=js&\"\nexport * from \"./Page3.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\n\t\t\n\t\t\tFlavors\n\t\t\tPick 5 things you'd like to make.
\n\t\t\t{{ leftToChoose }}
\n\t\t\tPlease finish selecting options.
\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\n\t\t\n\t\t\t\n\t\t\t\tNext\n\t\t\t\n\t\t\n\t\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.waitingOnAPI)?_c('Loader'):_c('button-page',{attrs:{\"flexCard\":false}},[_c('template',{slot:\"header\"},[_c('span',{staticClass:\"subtitle--line secondary\"},[_vm._v(\"Flavors\")]),_vm._v(\" \"),_c('h1',{staticClass:\"h2\"},[_vm._v(\"Pick 5 things you'd like to make.\")]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.leftToChoose))]),_vm._v(\" \"),(_vm.error)?_c('p',{staticClass:\"error\"},[_vm._v(\"Please finish selecting options.\")]):_vm._e()]),_vm._v(\" \"),_c('template',{slot:\"buttons\"},[_c('div',{staticClass:\"product-wizard--selectable\"},_vm._l((_vm.imagesToShow),function(img){return _c('image-button',{key:img.id,attrs:{\"tier\":_vm.tier,\"image\":img.image,\"initialValues\":_vm.value,\"id\":img.id,\"alt\":img.alt},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})}),1)]),_vm._v(\" \"),_c('template',{slot:\"nextButton\"},[_c('a',{staticClass:\"btn btn--border btn--arrow btn--primary borderless\",attrs:{\"disabled\":_vm.disabledButton,\"href\":_vm.nextPageHash},on:{\"click\":_vm.validate}},[_vm._v(\"\\n\\t\\t\\tNext\\n\\t\\t\")])])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Page3B.vue?vue&type=template&id=7385835e&\"\nimport script from \"./Page3B.vue?vue&type=script&lang=js&\"\nexport * from \"./Page3B.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t\n\t\t\tFlavors\n\t\t\tChoose 3 more delicious looking meals.
\n\t\t\t{{ leftToChoose }}
\n\t\t\tPlease finish selecting options.
\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\n\t\t\n\t\t\t\n\t\t\t\tNext\n\t\t\t\n\t\t\n\t\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button-page',{attrs:{\"flexCard\":false}},[_c('template',{slot:\"header\"},[_c('span',{staticClass:\"subtitle--line secondary\"},[_vm._v(\"Flavors\")]),_vm._v(\" \"),_c('h1',{staticClass:\"h2\"},[_vm._v(\"Choose 3 more delicious looking meals.\")]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.leftToChoose))]),_vm._v(\" \"),(_vm.error)?_c('p',{staticClass:\"error\"},[_vm._v(\"Please finish selecting options.\")]):_vm._e()]),_vm._v(\" \"),_c('template',{slot:\"buttons\"},[_c('div',{staticClass:\"product-wizard--selectable tier-2\"},_vm._l((_vm.imagesToShow),function(img){return _c('image-button',{key:img.id,attrs:{\"tier\":_vm.tier,\"image\":img.image,\"initialValues\":_vm.value,\"id\":img.id,\"alt\":img.alt},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})}),1)]),_vm._v(\" \"),_c('template',{slot:\"nextButton\"},[_c('a',{staticClass:\"btn btn--border btn--arrow btn--primary borderless\",attrs:{\"disabled\":_vm.disabledButton,\"href\":_vm.nextPageHash},on:{\"click\":_vm.validate}},[_vm._v(\"\\n\\t\\t\\tNext\\n\\t\\t\")])])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Page3C.vue?vue&type=template&id=84c948ac&\"\nimport script from \"./Page3C.vue?vue&type=script&lang=js&\"\nexport * from \"./Page3C.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t\n\t\t\tFlavors\n\t\t\tJust pick one more.
\n\t\t\tPlease select your last option.
\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\n\t\t\n\t\t\t\n\t\t\t\tNext\n\t\t\t\n\t\t\n\t\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button-page',{attrs:{\"flexCard\":false}},[_c('template',{slot:\"header\"},[_c('span',{staticClass:\"subtitle--line secondary\"},[_vm._v(\"Flavors\")]),_vm._v(\" \"),_c('h1',{staticClass:\"h2\"},[_vm._v(\"Just pick one more.\")]),_vm._v(\" \"),(_vm.error)?_c('p',{staticClass:\"error\"},[_vm._v(\"Please select your last option.\")]):_vm._e()]),_vm._v(\" \"),_c('template',{slot:\"buttons\"},[_c('div',{staticClass:\"product-wizard--selectable tier-3\"},_vm._l((_vm.imagesToShow),function(img){return _c('image-button',{key:img.id,attrs:{\"tier\":_vm.tier,\"image\":img.image,\"initialValues\":_vm.value,\"id\":img.id,\"alt\":img.alt},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}})}),1)]),_vm._v(\" \"),_c('template',{slot:\"nextButton\"},[_c('a',{staticClass:\"btn btn--border btn--arrow btn--primary borderless\",attrs:{\"disabled\":_vm.disabledButton,\"href\":\"#product-wizard/servings\"},on:{\"click\":_vm.validate}},[_vm._v(\"\\n\\t\\t\\tNext\\n\\t\\t\")])])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Page4.vue?vue&type=template&id=d545824e&\"\nimport script from \"./Page4.vue?vue&type=script&lang=js&\"\nexport * from \"./Page4.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t\n\t\t\tServing Sizes\n\t\t\tHow many people are you planning to cook for?
\n\t\t\tPlease select a serving size.
\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\tNext\n\t\t\t\n\t\t\n\t\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button-page',{attrs:{\"flexCard\":true}},[_c('template',{slot:\"header\"},[_c('span',{staticClass:\"subtitle--line secondary\"},[_vm._v(\"Serving Sizes\")]),_vm._v(\" \"),_c('h1',{staticClass:\"h2\"},[_vm._v(\"How many people are you planning to cook for?\")]),_vm._v(\" \"),(_vm.error)?_c('p',{staticClass:\"error\"},[_vm._v(\"Please select a serving size.\")]):_vm._e()]),_vm._v(\" \"),_c('template',{slot:\"buttons\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"type\":\"radio\",\"id\":\"serving-1\",\"name\":\"servings\",\"value\":\"1\"},domProps:{\"checked\":_vm._q(_vm.value,\"1\")},on:{\"change\":function($event){_vm.value=\"1\"}}}),_vm._v(\" \"),_c('label',{staticClass:\"half left\",attrs:{\"for\":\"serving-1\"}},[_c('strong',[_vm._v(\"Just myself\")])]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"type\":\"radio\",\"id\":\"serving-2\",\"name\":\"servings\",\"value\":\"2\"},domProps:{\"checked\":_vm._q(_vm.value,\"2\")},on:{\"change\":function($event){_vm.value=\"2\"}}}),_vm._v(\" \"),_c('label',{staticClass:\"half right\",attrs:{\"for\":\"serving-2\"}},[_c('strong',[_vm._v(\"For 2\")])]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"type\":\"radio\",\"id\":\"serving-4\",\"name\":\"servings\",\"value\":\"3-4\"},domProps:{\"checked\":_vm._q(_vm.value,\"3-4\")},on:{\"change\":function($event){_vm.value=\"3-4\"}}}),_vm._v(\" \"),_c('label',{staticClass:\"half left\",attrs:{\"for\":\"serving-4\"}},[_c('strong',[_vm._v(\"3-4\")])]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"type\":\"radio\",\"id\":\"serving-6\",\"name\":\"servings\",\"value\":\"5-6\"},domProps:{\"checked\":_vm._q(_vm.value,\"5-6\")},on:{\"change\":function($event){_vm.value=\"5-6\"}}}),_vm._v(\" \"),_c('label',{staticClass:\"half right\",attrs:{\"for\":\"serving-6\"}},[_c('strong',[_vm._v(\"5-6\")])]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"type\":\"radio\",\"id\":\"serving-100\",\"name\":\"servings\",\"value\":\"party\"},domProps:{\"checked\":_vm._q(_vm.value,\"party\")},on:{\"change\":function($event){_vm.value=\"party\"}}}),_vm._v(\" \"),_c('label',{staticClass:\"full\",attrs:{\"for\":\"serving-100\"}},[_c('strong',[_vm._v(\"For parties\")])])]),_vm._v(\" \"),_c('template',{slot:\"nextButton\"},[_c('a',{staticClass:\"btn btn--border btn--arrow btn--primary borderless\",attrs:{\"href\":_vm.nextPageHash,\"disabled\":_vm.disabledButton},on:{\"click\":_vm.validate}},[_vm._v(\"\\n\\t\\t\\tNext\\n\\t\\t\")])])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Page5.vue?vue&type=template&id=0690b146&\"\nimport script from \"./Page5.vue?vue&type=script&lang=js&\"\nexport * from \"./Page5.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t\n\t\t\tLeftovers\n\t\t\tWhen you cook a meal, do you prefer to have leftovers?
\n\t\t\t\n\t\t\t\tPlease select one of the options for leftovers.\n\t\t\t
\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\tNext\n\t\t\t\n\t\t\n\t\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button-page',{attrs:{\"flexCard\":false}},[_c('template',{slot:\"header\"},[_c('span',{staticClass:\"subtitle--line secondary\"},[_vm._v(\"Leftovers\")]),_vm._v(\" \"),_c('h1',{staticClass:\"h2\"},[_vm._v(\"When you cook a meal, do you prefer to have leftovers?\")]),_vm._v(\" \"),(_vm.error)?_c('p',{staticClass:\"error\"},[_vm._v(\"\\n\\t\\t\\tPlease select one of the options for leftovers.\\n\\t\\t\")]):_vm._e()]),_vm._v(\" \"),_c('template',{slot:\"buttons\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"type\":\"radio\",\"id\":\"meal\",\"name\":\"meal\",\"value\":\"meal\"},domProps:{\"checked\":_vm._q(_vm.value,\"meal\")},on:{\"change\":function($event){_vm.value=\"meal\"}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"meal\"}},[_c('strong',[_vm._v(\"No\")]),_vm._v(\" \"),_c('p',[_vm._v(\"I prefer cooking just enough for one meal.\")])]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"type\":\"radio\",\"id\":\"leftovers\",\"name\":\"leftovers\",\"value\":\"leftovers\"},domProps:{\"checked\":_vm._q(_vm.value,\"leftovers\")},on:{\"change\":function($event){_vm.value=\"leftovers\"}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"leftovers\"}},[_c('strong',[_vm._v(\"I like some leftovers\")]),_vm._v(\" \"),_c('p',[_vm._v(\"\\n\\t\\t\\t\\tI prefer cooking a little extra to have leftovers for the next day.\\n\\t\\t\\t\")])]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.value),expression:\"value\"}],attrs:{\"type\":\"radio\",\"id\":\"prepping\",\"name\":\"prepping\",\"value\":\"prepping\"},domProps:{\"checked\":_vm._q(_vm.value,\"prepping\")},on:{\"change\":function($event){_vm.value=\"prepping\"}}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"prepping\"}},[_c('strong',[_vm._v(\"I like meal prepping\")]),_vm._v(\" \"),_c('p',[_vm._v(\"\\n\\t\\t\\t\\tI prefer cooking in large portions to have leftovers for several days\\n\\t\\t\\t\")])])]),_vm._v(\" \"),_c('template',{slot:\"nextButton\"},[_c('a',{staticClass:\"btn btn--border btn--arrow btn--primary borderless\",attrs:{\"disabled\":_vm.disabledButton,\"href\":\"#product-wizard/results\"},on:{\"click\":_vm.validate}},[_vm._v(\"\\n\\t\\t\\tNext\\n\\t\\t\")])])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * vue-class-component v7.1.0\n * (c) 2015-present Evan You\n * @license MIT\n */\nimport Vue from 'vue';\n\n// The rational behind the verbose Reflect-feature check below is the fact that there are polyfills\n// which add an implementation for Reflect.defineMetadata but not for Reflect.getOwnMetadataKeys.\n// Without this check consumers will encounter hard to track down runtime errors.\nvar reflectionIsSupported = typeof Reflect !== 'undefined' && Reflect.defineMetadata && Reflect.getOwnMetadataKeys;\nfunction copyReflectionMetadata(to, from) {\n forwardMetadata(to, from);\n Object.getOwnPropertyNames(from.prototype).forEach(function (key) {\n forwardMetadata(to.prototype, from.prototype, key);\n });\n Object.getOwnPropertyNames(from).forEach(function (key) {\n forwardMetadata(to, from, key);\n });\n}\nfunction forwardMetadata(to, from, propertyKey) {\n var metaKeys = propertyKey\n ? Reflect.getOwnMetadataKeys(from, propertyKey)\n : Reflect.getOwnMetadataKeys(from);\n metaKeys.forEach(function (metaKey) {\n var metadata = propertyKey\n ? Reflect.getOwnMetadata(metaKey, from, propertyKey)\n : Reflect.getOwnMetadata(metaKey, from);\n if (propertyKey) {\n Reflect.defineMetadata(metaKey, metadata, to, propertyKey);\n }\n else {\n Reflect.defineMetadata(metaKey, metadata, to);\n }\n });\n}\n\nvar fakeArray = { __proto__: [] };\nvar hasProto = fakeArray instanceof Array;\nfunction createDecorator(factory) {\n return function (target, key, index) {\n var Ctor = typeof target === 'function'\n ? target\n : target.constructor;\n if (!Ctor.__decorators__) {\n Ctor.__decorators__ = [];\n }\n if (typeof index !== 'number') {\n index = undefined;\n }\n Ctor.__decorators__.push(function (options) { return factory(options, key, index); });\n };\n}\nfunction mixins() {\n var Ctors = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n Ctors[_i] = arguments[_i];\n }\n return Vue.extend({ mixins: Ctors });\n}\nfunction isPrimitive(value) {\n var type = typeof value;\n return value == null || (type !== 'object' && type !== 'function');\n}\nfunction warn(message) {\n if (typeof console !== 'undefined') {\n console.warn('[vue-class-component] ' + message);\n }\n}\n\nfunction collectDataFromConstructor(vm, Component) {\n // override _init to prevent to init as Vue instance\n var originalInit = Component.prototype._init;\n Component.prototype._init = function () {\n var _this = this;\n // proxy to actual vm\n var keys = Object.getOwnPropertyNames(vm);\n // 2.2.0 compat (props are no longer exposed as self properties)\n if (vm.$options.props) {\n for (var key in vm.$options.props) {\n if (!vm.hasOwnProperty(key)) {\n keys.push(key);\n }\n }\n }\n keys.forEach(function (key) {\n if (key.charAt(0) !== '_') {\n Object.defineProperty(_this, key, {\n get: function () { return vm[key]; },\n set: function (value) { vm[key] = value; },\n configurable: true\n });\n }\n });\n };\n // should be acquired class property values\n var data = new Component();\n // restore original _init to avoid memory leak (#209)\n Component.prototype._init = originalInit;\n // create plain data object\n var plainData = {};\n Object.keys(data).forEach(function (key) {\n if (data[key] !== undefined) {\n plainData[key] = data[key];\n }\n });\n if (process.env.NODE_ENV !== 'production') {\n if (!(Component.prototype instanceof Vue) && Object.keys(plainData).length > 0) {\n warn('Component class must inherit Vue or its descendant class ' +\n 'when class property is used.');\n }\n }\n return plainData;\n}\n\nvar $internalHooks = [\n 'data',\n 'beforeCreate',\n 'created',\n 'beforeMount',\n 'mounted',\n 'beforeDestroy',\n 'destroyed',\n 'beforeUpdate',\n 'updated',\n 'activated',\n 'deactivated',\n 'render',\n 'errorCaptured',\n 'serverPrefetch' // 2.6\n];\nfunction componentFactory(Component, options) {\n if (options === void 0) { options = {}; }\n options.name = options.name || Component._componentTag || Component.name;\n // prototype props.\n var proto = Component.prototype;\n Object.getOwnPropertyNames(proto).forEach(function (key) {\n if (key === 'constructor') {\n return;\n }\n // hooks\n if ($internalHooks.indexOf(key) > -1) {\n options[key] = proto[key];\n return;\n }\n var descriptor = Object.getOwnPropertyDescriptor(proto, key);\n if (descriptor.value !== void 0) {\n // methods\n if (typeof descriptor.value === 'function') {\n (options.methods || (options.methods = {}))[key] = descriptor.value;\n }\n else {\n // typescript decorated data\n (options.mixins || (options.mixins = [])).push({\n data: function () {\n var _a;\n return _a = {}, _a[key] = descriptor.value, _a;\n }\n });\n }\n }\n else if (descriptor.get || descriptor.set) {\n // computed properties\n (options.computed || (options.computed = {}))[key] = {\n get: descriptor.get,\n set: descriptor.set\n };\n }\n });\n (options.mixins || (options.mixins = [])).push({\n data: function () {\n return collectDataFromConstructor(this, Component);\n }\n });\n // decorate options\n var decorators = Component.__decorators__;\n if (decorators) {\n decorators.forEach(function (fn) { return fn(options); });\n delete Component.__decorators__;\n }\n // find super\n var superProto = Object.getPrototypeOf(Component.prototype);\n var Super = superProto instanceof Vue\n ? superProto.constructor\n : Vue;\n var Extended = Super.extend(options);\n forwardStaticMembers(Extended, Component, Super);\n if (reflectionIsSupported) {\n copyReflectionMetadata(Extended, Component);\n }\n return Extended;\n}\nvar reservedPropertyNames = [\n // Unique id\n 'cid',\n // Super Vue constructor\n 'super',\n // Component options that will be used by the component\n 'options',\n 'superOptions',\n 'extendOptions',\n 'sealedOptions',\n // Private assets\n 'component',\n 'directive',\n 'filter'\n];\nvar shouldIgnore = {\n prototype: true,\n arguments: true,\n callee: true,\n caller: true\n};\nfunction forwardStaticMembers(Extended, Original, Super) {\n // We have to use getOwnPropertyNames since Babel registers methods as non-enumerable\n Object.getOwnPropertyNames(Original).forEach(function (key) {\n // Skip the properties that should not be overwritten\n if (shouldIgnore[key]) {\n return;\n }\n // Some browsers does not allow reconfigure built-in properties\n var extendedDescriptor = Object.getOwnPropertyDescriptor(Extended, key);\n if (extendedDescriptor && !extendedDescriptor.configurable) {\n return;\n }\n var descriptor = Object.getOwnPropertyDescriptor(Original, key);\n // If the user agent does not support `__proto__` or its family (IE <= 10),\n // the sub class properties may be inherited properties from the super class in TypeScript.\n // We need to exclude such properties to prevent to overwrite\n // the component options object which stored on the extended constructor (See #192).\n // If the value is a referenced value (object or function),\n // we can check equality of them and exclude it if they have the same reference.\n // If it is a primitive value, it will be forwarded for safety.\n if (!hasProto) {\n // Only `cid` is explicitly exluded from property forwarding\n // because we cannot detect whether it is a inherited property or not\n // on the no `__proto__` environment even though the property is reserved.\n if (key === 'cid') {\n return;\n }\n var superDescriptor = Object.getOwnPropertyDescriptor(Super, key);\n if (!isPrimitive(descriptor.value) &&\n superDescriptor &&\n superDescriptor.value === descriptor.value) {\n return;\n }\n }\n // Warn if the users manually declare reserved properties\n if (process.env.NODE_ENV !== 'production' &&\n reservedPropertyNames.indexOf(key) >= 0) {\n warn(\"Static property name '\" + key + \"' declared on class '\" + Original.name + \"' \" +\n 'conflicts with reserved property name of Vue internal. ' +\n 'It may cause unexpected behavior of the component. Consider renaming the property.');\n }\n Object.defineProperty(Extended, key, descriptor);\n });\n}\n\nfunction Component(options) {\n if (typeof options === 'function') {\n return componentFactory(options);\n }\n return function (Component) {\n return componentFactory(Component, options);\n };\n}\nComponent.registerHooks = function registerHooks(keys) {\n $internalHooks.push.apply($internalHooks, keys);\n};\n\nexport default Component;\nexport { createDecorator, mixins };\n","/** vue-property-decorator verson 8.2.2 MIT LICENSE copyright 2019 kaorun343 */\n/// \n'use strict';\nimport Vue from 'vue';\nimport Component, { createDecorator, mixins } from 'vue-class-component';\nexport { Component, Vue, mixins as Mixins };\n/** Used for keying reactive provide/inject properties */\nvar reactiveInjectKey = '__reactiveInject__';\n/**\n * decorator of an inject\n * @param from key\n * @return PropertyDecorator\n */\nexport function Inject(options) {\n return createDecorator(function (componentOptions, key) {\n if (typeof componentOptions.inject === 'undefined') {\n componentOptions.inject = {};\n }\n if (!Array.isArray(componentOptions.inject)) {\n componentOptions.inject[key] = options || key;\n }\n });\n}\n/**\n * decorator of a reactive inject\n * @param from key\n * @return PropertyDecorator\n */\nexport function InjectReactive(options) {\n return createDecorator(function (componentOptions, key) {\n if (typeof componentOptions.inject === 'undefined') {\n componentOptions.inject = {};\n }\n if (!Array.isArray(componentOptions.inject)) {\n var fromKey_1 = !!options ? options.from || options : key;\n var defaultVal_1 = (!!options && options.default) || undefined;\n if (!componentOptions.computed)\n componentOptions.computed = {};\n componentOptions.computed[key] = function () {\n var obj = this[reactiveInjectKey];\n return obj ? obj[fromKey_1] : defaultVal_1;\n };\n componentOptions.inject[reactiveInjectKey] = reactiveInjectKey;\n }\n });\n}\n/**\n * decorator of a provide\n * @param key key\n * @return PropertyDecorator | void\n */\nexport function Provide(key) {\n return createDecorator(function (componentOptions, k) {\n var provide = componentOptions.provide;\n if (typeof provide !== 'function' || !provide.managed) {\n var original_1 = componentOptions.provide;\n provide = componentOptions.provide = function () {\n var rv = Object.create((typeof original_1 === 'function' ? original_1.call(this) : original_1) ||\n null);\n for (var i in provide.managed)\n rv[provide.managed[i]] = this[i];\n return rv;\n };\n provide.managed = {};\n }\n provide.managed[k] = key || k;\n });\n}\n/**\n * decorator of a reactive provide\n * @param key key\n * @return PropertyDecorator | void\n */\nexport function ProvideReactive(key) {\n return createDecorator(function (componentOptions, k) {\n var provide = componentOptions.provide;\n if (typeof provide !== 'function' || !provide.managed) {\n var original_2 = componentOptions.provide;\n provide = componentOptions.provide = function () {\n var _this = this;\n var rv = Object.create((typeof original_2 === 'function' ? original_2.call(this) : original_2) ||\n null);\n rv[reactiveInjectKey] = {};\n var _loop_1 = function (i) {\n rv[provide.managed[i]] = this_1[i]; // Duplicates the behavior of `@Provide`\n Object.defineProperty(rv[reactiveInjectKey], provide.managed[i], {\n enumerable: true,\n get: function () { return _this[i]; },\n });\n };\n var this_1 = this;\n for (var i in provide.managed) {\n _loop_1(i);\n }\n return rv;\n };\n provide.managed = {};\n }\n provide.managed[k] = key || k;\n });\n}\n/** @see {@link https://github.com/vuejs/vue-class-component/blob/master/src/reflect.ts} */\nvar reflectMetadataIsSupported = typeof Reflect !== 'undefined' && typeof Reflect.getMetadata !== 'undefined';\nfunction applyMetadata(options, target, key) {\n if (reflectMetadataIsSupported) {\n if (!Array.isArray(options) &&\n typeof options !== 'function' &&\n typeof options.type === 'undefined') {\n options.type = Reflect.getMetadata('design:type', target, key);\n }\n }\n}\n/**\n * decorator of model\n * @param event event name\n * @param options options\n * @return PropertyDecorator\n */\nexport function Model(event, options) {\n if (options === void 0) { options = {}; }\n return function (target, key) {\n applyMetadata(options, target, key);\n createDecorator(function (componentOptions, k) {\n ;\n (componentOptions.props || (componentOptions.props = {}))[k] = options;\n componentOptions.model = { prop: k, event: event || k };\n })(target, key);\n };\n}\n/**\n * decorator of a prop\n * @param options the options for the prop\n * @return PropertyDecorator | void\n */\nexport function Prop(options) {\n if (options === void 0) { options = {}; }\n return function (target, key) {\n applyMetadata(options, target, key);\n createDecorator(function (componentOptions, k) {\n ;\n (componentOptions.props || (componentOptions.props = {}))[k] = options;\n })(target, key);\n };\n}\n/**\n * decorator of a synced prop\n * @param propName the name to interface with from outside, must be different from decorated property\n * @param options the options for the synced prop\n * @return PropertyDecorator | void\n */\nexport function PropSync(propName, options) {\n if (options === void 0) { options = {}; }\n // @ts-ignore\n return function (target, key) {\n applyMetadata(options, target, key);\n createDecorator(function (componentOptions, k) {\n ;\n (componentOptions.props || (componentOptions.props = {}))[propName] = options;\n (componentOptions.computed || (componentOptions.computed = {}))[k] = {\n get: function () {\n return this[propName];\n },\n set: function (value) {\n // @ts-ignore\n this.$emit(\"update:\" + propName, value);\n },\n };\n })(target, key);\n };\n}\n/**\n * decorator of a watch function\n * @param path the path or the expression to observe\n * @param WatchOption\n * @return MethodDecorator\n */\nexport function Watch(path, options) {\n if (options === void 0) { options = {}; }\n var _a = options.deep, deep = _a === void 0 ? false : _a, _b = options.immediate, immediate = _b === void 0 ? false : _b;\n return createDecorator(function (componentOptions, handler) {\n if (typeof componentOptions.watch !== 'object') {\n componentOptions.watch = Object.create(null);\n }\n var watch = componentOptions.watch;\n if (typeof watch[path] === 'object' && !Array.isArray(watch[path])) {\n watch[path] = [watch[path]];\n }\n else if (typeof watch[path] === 'undefined') {\n watch[path] = [];\n }\n watch[path].push({ handler: handler, deep: deep, immediate: immediate });\n });\n}\n// Code copied from Vue/src/shared/util.js\nvar hyphenateRE = /\\B([A-Z])/g;\nvar hyphenate = function (str) { return str.replace(hyphenateRE, '-$1').toLowerCase(); };\n/**\n * decorator of an event-emitter function\n * @param event The name of the event\n * @return MethodDecorator\n */\nexport function Emit(event) {\n return function (_target, key, descriptor) {\n key = hyphenate(key);\n var original = descriptor.value;\n descriptor.value = function emitter() {\n var _this = this;\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var emit = function (returnValue) {\n if (returnValue !== undefined)\n args.unshift(returnValue);\n _this.$emit.apply(_this, [event || key].concat(args));\n };\n var returnValue = original.apply(this, args);\n if (isPromise(returnValue)) {\n returnValue.then(function (returnValue) {\n emit(returnValue);\n });\n }\n else {\n emit(returnValue);\n }\n return returnValue;\n };\n };\n}\n/**\n * decorator of a ref prop\n * @param refKey the ref key defined in template\n */\nexport function Ref(refKey) {\n return createDecorator(function (options, key) {\n options.computed = options.computed || {};\n options.computed[key] = {\n cache: false,\n get: function () {\n return this.$refs[refKey || key];\n },\n };\n });\n}\nfunction isPromise(obj) {\n return obj instanceof Promise || (obj && typeof obj.then === 'function');\n}\n","import Vue from \"vue\";\nimport Component from \"vue-class-component\";\n\nlet accountModule = require(\"../store/account\").accountModule;\n\nexport function AddAsyncUpdates(property: string) {\n\treturn function(target: Vue, key: string, descriptor: any) {\n\t\tconst original = descriptor.value;\n\t\tif (typeof original === \"function\") {\n\t\t\t// console.log(target, key, descriptor);\n\t\t\tdescriptor.value = async function(...args: any[]) {\n\t\t\t\tconst boundOriginal = original.bind(this);\n\t\t\t\tconsole.log(\"before\", key);\n\t\t\t\tthis[property] = true;\n\t\t\t\tawait boundOriginal(...args);\n\t\t\t\tthis[property] = false;\n\t\t\t\tconsole.log(\"after\", key);\n\t\t\t};\n\t\t}\n\t\treturn descriptor;\n\t};\n}\n\n/**\n * Method to get value from an object by the path\n * @param obj {Object} an object\n * @param path {string} path to the value in the object\n */\nexport function getByPath(obj: any, path: string) {\n\treturn path.split(\".\").reduce((acc, curr) => {\n\t\treturn acc && acc[curr];\n\t}, obj);\n}\n\n/**\n * Method to dedupe an array of objects using a path to the key to dedupe by\n * @param arr {[Object]} Array of Objects\n * @param path {string} Path to the key to dedupe array of objects by\n */\nexport function deduplicateObjectsByKey(arr: T[], path: string) {\n\tvar hashTable: any = {};\n\n\treturn arr.filter(function(el) {\n\t\tvar key = getByPath(el, path);\n\t\tvar match = Boolean(hashTable[key]);\n\n\t\treturn match ? false : (hashTable[key] = true);\n\t});\n}\n\n// You can declare a mixin as the same style as components.\n@Component({\n\tfilters: {\n\t\tdollars(p: number) {\n\t\t\treturn typeof p === \"number\" ? `$${p.toFixed(2)}` : \"\";\n\t\t},\n\t\tpluralize(s: string, n: number) {\n\t\t\treturn `${s}${n === 0 || n > 1 ? \"s\" : \"\"}`;\n\t\t},\n\t},\n})\nexport default class Helpers extends Vue {\n\taccountModule = accountModule;\n}\n","import { render, staticRenderFns } from \"./AddToCart.vue?vue&type=template&id=0eb21776&\"\nimport script from \"./AddToCart.vue?vue&type=script&lang=ts&\"\nexport * from \"./AddToCart.vue?vue&type=script&lang=ts&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nimport { Component, Prop, Vue } from \"vue-property-decorator\";\nimport { accountModule } from \"./store/account\";\nimport { AddAsyncUpdates } from \"./mixins/helpers\";\n\n@Component({})\nexport default class AddToCart extends Vue {\n\t// public\n\t@Prop(String) private freeProd!: string;\n\t@Prop(String) private sku!: string;\n\t@Prop(String) private name!: string;\n\t@Prop({ default: 1 }) private quantity!: number;\n\t@Prop({ default: \"\" }) private buttonOverride!: string;\n\t@Prop({ default: \"btn btn--border borderless btn--black\" }) private classes!: string;\n @Prop({ default: false }) private disabled!: boolean;\n\tupdating: boolean = false;\n\n\t@AddAsyncUpdates(\"updating\")\n\tprivate async addToCart() {\n\t\tlet productsAdded = await accountModule.addProductsToBasket([\n\t\t\t{\n\t\t\t\tproduct_id: this.sku,\n\t\t\t\tquantity: this.quantity,\n\t\t\t},\n\t\t]);\n\t\tthis.showCartAfterUpdate();\n\t}\n\n\t@AddAsyncUpdates(\"updating\")\n\tprivate async addGiftToCart() {\n\t\tlet productsAdded = await accountModule.addProductsToBasket([{\n\t\t\t\tproduct_id: this.sku,\n\t\t\t\tquantity: this.quantity,\n\t\t\t\tgift:true,\n\t\t\t},]\n\t\t\t\n\t\t);\n\t\tthis.showCartAfterUpdate();\n\t}\n\n\tprivate showCartAfterUpdate() {\n\t\tconst cart = document.querySelector(\"#cart-app\");\n\t\tif (cart) {\n\t\t\tthis.$emit(\"resetQuantity\");\n\t\t\tcart.classList.add(\"active\");\n\t\t\tdocument.body.classList.add(\"prevent-scrolling\");\n\t\t\t// @ts-ignore\n\t\t\twindow.returnFocusTo = this.$refs.button;\n\t\t\t// @ts-ignore\n\t\t\tconsole.log(\"the returnFocusTo is\", window.returnFocusTo);\n\t\t\tconst closeBtn = cart.querySelector('button[title=\"Closes cart modal\"]');\n\t\t\tif (closeBtn) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t(closeBtn as HTMLElement).focus();\n\t\t\t\t}, 200);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate get buttonText() {\n\t\tif (this.buttonOverride.length) return this.buttonOverride;\n\t\treturn `Add To Cart`;\n\t}\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"add-to-cart-btn\"},[(!_vm.freeProd)?_c('button',{ref:\"button\",class:(\"\" + _vm.classes + (_vm.updating ? ' updating' : '')),attrs:{\"data-sku\":_vm.sku,\"disabled\":_vm.disabled},on:{\"click\":_vm.addToCart}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.buttonText)+\"\\n\\t\")]):_vm._e(),_vm._v(\" \"),(_vm.freeProd)?_c('button',{ref:\"button\",class:(\"\" + _vm.classes + (_vm.updating ? ' updating' : '')),attrs:{\"data-sku\":_vm.sku,\"disabled\":_vm.disabled},on:{\"click\":_vm.addGiftToCart}},[_vm._v(\"\\n\\t\\t\"+_vm._s(_vm.buttonText)+\"\\n\\t\")]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./RecommendedItem.vue?vue&type=template&id=5a22108f&\"\nimport script from \"./RecommendedItem.vue?vue&type=script&lang=js&\"\nexport * from \"./RecommendedItem.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t
\n\t\t\t
![]()
\n\t\t\t
Out of stock\n\t\t
\n\t\t
\n\t\t\t
\n\t\t\t\t
{{ product.name }}
\n\t\t\t\t
${{ product.price }}\n\t\t\t\t
\n\t\t\t\t
Benefits
\n\t\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t
\n\t
\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"product-wizard--recommended-item\"},[_c('div',{staticClass:\"small-imagery\"},[_c('img',{attrs:{\"src\":_vm.product.images[0],\"alt\":(\"Image of \" + (_vm.product.name))}}),_vm._v(\" \"),(!_vm.product.available)?_c('span',{staticClass:\"size-small bg-brand-primary font-family-roboto-slab\"},[_vm._v(\"Out of stock\")]):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"recommended-content\"},[_c('div',[_c('h3',{staticClass:\"h7\"},[_vm._v(_vm._s(_vm.product.name))]),_vm._v(\" \"),_c('span',{staticClass:\"color--secondary size-os-large\"},[_vm._v(\"$\"+_vm._s(_vm.product.price))]),_vm._v(\" \"),_c('p',{staticClass:\"size-small\",domProps:{\"innerHTML\":_vm._s(_vm.product.description)}}),_vm._v(\" \"),_c('p',{staticClass:\"size-small\"},[_vm._v(\"Benefits\")]),_vm._v(\" \"),_c('div',{staticClass:\"size-small\",domProps:{\"innerHTML\":_vm._s(_vm.product.features)}})]),_vm._v(\" \"),_c('div',[_c('a',{staticClass:\"btn borderless btn--border btn--arrow btn--primary\",attrs:{\"href\":(\"/product/\" + (_vm.product.masterId))}},[_vm._v(\"View product\")]),_vm._v(\" \"),(_vm.product.available)?_c('AddToCart',{attrs:{\"classes\":\"btn btn-recommended-cart btn--link color--secondary\",\"sku\":_vm.product.sku,\"quantity\":1}}):_vm._e()],1)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Carousel.vue?vue&type=template&id=43af9838&\"\nimport script from \"./Carousel.vue?vue&type=script&lang=js&\"\nexport * from \"./Carousel.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t
\n\t\t\t
Currently out of stock\n\t\t\t
![]()
\n\t\t
\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\tSwitch to product image {{ idx }}\n\t\t\t\n\t\t
\n\t
\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"product-wizard--viewer\"},[_c('div',{staticClass:\"imagery\"},[(!_vm.available)?_c('span',{staticClass:\"product-wizard--viewer--oos bg--primary font-family-roboto-slab\"},[_vm._v(\"Currently out of stock\")]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.images),function(image,idx){return _c('img',{directives:[{name:\"show\",rawName:\"v-show\",value:(idx === _vm.active),expression:\"idx === active\"}],key:idx,attrs:{\"src\":image,\"alt\":(\"Image #\" + idx)}})})],2),_vm._v(\" \"),_c('div',{staticClass:\"product-wizard--viewer-holder\"},_vm._l((_vm.images),function(image,idx){return _c('span',{key:idx,staticClass:\"product-wizard--viewer-dot\",class:{ active: idx === _vm.active },on:{\"click\":function($event){return _vm.updateActive(idx)}}},[_c('span',{staticClass:\"circle\"}),_vm._v(\" \"),_c('span',{staticClass:\"sr-only\"},[_vm._v(\"Switch to product image \"+_vm._s(idx))])])}),0)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./TopChoice.vue?vue&type=template&id=10f19a62&\"\nimport script from \"./TopChoice.vue?vue&type=script&lang=js&\"\nexport * from \"./TopChoice.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t\n\t\t
\n\t\t
\n\t\t\t
\n\t\t\t\t
{{ result.name }}
\n\t\t\t\t
${{ result.price }}\n\t\t\t\t
\n\t\t\t\t
Benefits
\n\t\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t
\n\t\t
\n\t
\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"product-wizard--top-choice-content controlled-width animatable\"},[_c('carousel',{attrs:{\"images\":_vm.result.images,\"available\":_vm.result.available}}),_vm._v(\" \"),_c('div',{staticClass:\"wizard-gutters\"},[_c('div',{staticClass:\"bottom-info\"},[_c('h2',{staticClass:\"h5\"},[_vm._v(_vm._s(_vm.result.name))]),_vm._v(\" \"),_c('span',{staticClass:\"color--primary h7\"},[_vm._v(\"$\"+_vm._s(_vm.result.price))]),_vm._v(\" \"),_c('p',{staticClass:\"size-small\",domProps:{\"innerHTML\":_vm._s(_vm.result.description)}}),_vm._v(\" \"),_c('p',{staticClass:\"benefits-text h7\"},[_vm._v(\"Benefits\")]),_vm._v(\" \"),_c('div',{staticClass:\"size-small\",domProps:{\"innerHTML\":_vm._s(_vm.result.features)}})]),_vm._v(\" \"),_c('div',{staticClass:\"product-wizard--buttons\"},[_c('a',{staticClass:\"btn btn--border btn--arrow btn--primary borderless\",attrs:{\"href\":(\"/product/\" + (_vm.result.masterId) + \"?sku=\" + (_vm.result.sku))}},[_vm._v(\"View Product\")]),_vm._v(\" \"),(_vm.result.available)?_c('AddToCart',{attrs:{\"classes\":\"btn btn--link color--primary\",\"sku\":_vm.result.sku,\"quantity\":1}}):_vm._e()],1)]),_vm._v(\" \"),_c('Arrow',{staticClass:\"top-choice-scroll-down\"})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Failure.vue?vue&type=template&id=fafeb842&\"\nvar script = {}\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _vm._m(0)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"product-wizard--content\"},[_c('div',{staticClass:\"product-wizard--question wizard-gutters pattern--base\"},[_c('h1',{staticClass:\"h2\"},[_vm._v(\"Oh no!\")])]),_vm._v(\" \"),_c('div',{staticClass:\"product-wizard--card\"},[_c('div',{staticClass:\"product-wizard--card-choices wizard-gutters\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\tWe've ran into a problem and can't seem to find your results. Let's\\n\\t\\t\\t\\t\"),_c('a',{attrs:{\"href\":\"#product-wizard/skill\"}},[_vm._v(\"try again\")]),_vm._v(\".\\n\\t\\t\\t\")])])])])}]\n\nexport { render, staticRenderFns }","import Page1 from \"./Pages/Page1.vue\";\nimport Page2 from \"./Pages/Page2.vue\";\nimport Page3 from \"./Pages/Page3.vue\";\nimport Page3B from \"./Pages/Page3B.vue\";\nimport Page3C from \"./Pages/Page3C.vue\";\nimport Page4 from \"./Pages/Page4.vue\";\nimport Page5 from \"./Pages/Page5.vue\";\nimport Results from \"./Pages/Results.vue\";\n\nexport default {\n\t\"#product-wizard/skill\": Page1,\n\t\"#product-wizard/collection\": Page2,\n\t\"#product-wizard/flavor\": Page3,\n\t\"#product-wizard/flavorB\": Page3B,\n\t\"#product-wizard/flavorC\": Page3C,\n\t\"#product-wizard/servings\": Page4,\n\t\"#product-wizard/leftovers\": Page5,\n\t\"#product-wizard/results\": Results,\n};\n","import { render, staticRenderFns } from \"./Results.vue?vue&type=template&id=d992ae50&\"\nimport script from \"./Results.vue?vue&type=script&lang=js&\"\nexport * from \"./Results.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t
\n\t\t
\n\t\t\t\n\t\t
\n\t\t
\n\t\t\t
\n\t\t\t\t
Looking for a different style?
\n\t\t\t\t
\n\t\t\t\t\tChoose any of our cast iron skillets for unparalled quality and\n\t\t\t\t\tversatile cooking.\n\t\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t
\n\t\t
\n\t
\n\t\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.results.top && _vm.results.alternates)?_c('div',{staticClass:\"product-wizard--results pattern--base animatable\"},[_c('div',{staticClass:\"product-wizard--results-overlay\"}),_vm._v(\" \"),_c('div',{staticClass:\"product-wizard--top-choice\"},[_c('TopChoice',{attrs:{\"result\":_vm.results.top}})],1),_vm._v(\" \"),_c('div',{staticClass:\"product-wizard--alternatives wizard-gutters controlled-width animatable-children\"},[_vm._m(0),_vm._v(\" \"),_c('div',{staticClass:\"product-wizard--alternatives-container\"},_vm._l((_vm.results.alternates),function(item){return _c('RecommendedItem',{key:item.sku,attrs:{\"product\":item}})}),1)])]):(_vm.failed)?_c('Failure'):_vm._e()}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"alternative-intro\"},[_c('h3',[_vm._v(\"Looking for a different style?\")]),_vm._v(\" \"),_c('p',[_vm._v(\"\\n\\t\\t\\t\\tChoose any of our cast iron skillets for unparalled quality and\\n\\t\\t\\t\\tversatile cooking.\\n\\t\\t\\t\")])])}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Wizard.vue?vue&type=template&id=a81f36a8&\"\nimport script from \"./Wizard.vue?vue&type=script&lang=js&\"\nexport * from \"./Wizard.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"product-wizard\",attrs:{\"aria-hidden\":!_vm.shown},on:{\"keydown\":_vm.checkForTabDown}},[_c('div',{staticClass:\"product-wizard--action-bar\"},[_c('div',[_c('a',{staticClass:\"back-btn btn size-mini\",attrs:{\"href\":_vm.backButtonHash}},[_c('BackArrow'),_vm._v(\" \"+_vm._s(_vm.backButtonText)+\"\\n\\t\\t\\t\")],1),_vm._v(\" \"),_c('a',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.shouldShowResults),expression:\"shouldShowResults\"}],staticClass:\"back-btn close-btn btn size-mini\",attrs:{\"href\":\"#product-wizard/close\"}},[_vm._v(\"\\n\\t\\t\\t\\t× Close\")])]),_vm._v(\" \"),_c('div',[_c('a',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.currentPage != '#product-wizard/skill'),expression:\"currentPage != '#product-wizard/skill'\"}],staticClass:\"btn size-mini white-on-desktop\",attrs:{\"href\":\"#product-wizard/skill/restart\"}},[_c('RestartIcon'),_vm._v(\"\\n\\t\\t\\t\\tStart Over\\n\\t\\t\\t\")],1)])]),_vm._v(\" \"),_c('transition',{attrs:{\"name\":\"wizard-fade\",\"mode\":\"out-in\"}},[_c(_vm.currentPageComponent,{tag:\"component\",attrs:{\"pageNumber\":(\"Page\" + (_vm.activePage + 1)),\"handleFocus\":_vm.handleWizardFocus,\"usesKeyboard\":_vm.usesKeyboard},on:{\"usesKeyboard\":_vm.handleAccessibility}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import dataModel from './productHelpDataModel';\nimport { mapGetters, mapMutations } from 'vuex';\n\nexport default {\n\tdata() {\n\t\treturn {\n\t\t\tisReplaying: false,\n\t\t};\n\t},\n\tcreated: function () {\n\t\twindow.scroll({\n\t\t\tleft: 0,\n\t\t\ttop: 100,\n\t\t\tbehavior: 'smooth',\n\t\t});\n\t},\n\tcomputed: {\n\t\t...mapGetters({\n\t\t\tanswers: \"productHelp/getAnswers\",\n\t\t\tcurrentStep: \"productHelp/getCurrentStep\",\n\t\t\tnextStep: \"productHelp/getNextStep\",\n\t\t\tpath: \"productHelp/getPath\",\n\t\t\tbranch: \"productHelp/getBranch\",\n\t\t\tflowComplete: \"productHelp/getFlowComplete\",\n\t\t\ttree: \"productHelp/getTree\",\n\t\t\tnextFocus: \"productHelp/getNextFocus\",\n\t\t\tmaterialOptions: \"productHelp/getMaterialOptions\",\n\t\t}),\n\t},\n\tmethods: {\n\t\t...mapMutations({\n\t\t\tsetAnswer: \"productHelp/setAnswer\",\n\t\t\tsetCurrentStep: \"productHelp/setCurrentStep\",\n\t\t\tsetNextStep: \"productHelp/setNextStep\",\n\t\t\tcreateIssue: \"productHelp/createIssue\",\n\t\t\taddPathStep: \"productHelp/addPathStep\",\n\t\t\tsetCSRFToken: \"productHelp/setCSRFToken\",\n\t\t\tremovePathStep: \"productHelp/removePathStep\",\n\t\t\tsetTree: \"productHelp/setTree\",\n\t\t\tsetUndoPoint: \"productHelp/setUndoPoint\",\n\t\t\tsetNextFocus: \"productHelp/setNextFocus\",\n\t\t\tsetResolvedFlag: \"productHelp/setResolvedFlag\"\n\t\t}),\n\t\tvalidate(data, re) {\n\t\t\tlet ok = re.test(data);\n\t\t\treturn ok;\n\t\t},\n\t\tgetMaterial(product) {\n\t\t\treturn this.materialOptions.find(m => {\n\t\t\t\treturn product.categories && product.categories.includes(m);\n\t\t\t}) || product.material;\n\t\t},\n\t\tparseTree(tree) {\n\t\t\t// returns a new parsed tree instead of modifying the passed in one\n\t\t\tlet newTree = JSON.parse(JSON.stringify(tree));\n\n\t\t\tif (typeof newTree === \"string\") {\n\t\t\t\tlet common = this.parseTree(dataModel.tree.common[newTree]);\n\t\t\t\tnewTree = JSON.parse(JSON.stringify(common));\n\t\t\t} else if (typeof newTree.children === \"string\" && dataModel.tree.common[newTree.children]) {\n\t\t\t\tlet common = this.parseTree(dataModel.tree.common[newTree.children]);\n\t\t\t\tnewTree.children = {\n\t\t\t\t\t[newTree.children]: JSON.parse(JSON.stringify(common)),\n\t\t\t\t};\n\t\t\t} else if (typeof newTree.children === \"object\") {\n\t\t\t\tif (newTree.children.node) {\n\t\t\t\t\t// handles a node object used directly without a key\n\t\t\t\t\tnewTree.children = {\n\t\t\t\t\t\t[newTree.children.node]: {\n\t\t\t\t\t\t\tnode: newTree.children.node,\n\t\t\t\t\t\t\tchildren: Object.keys(newTree.children.children)\n\t\t\t\t\t\t\t\t.reduce((acc, c) => {\n\t\t\t\t\t\t\t\t\tacc[c] = this.parseTree(newTree.children.children[c]);\n\t\t\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t\t\t}, {})\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\t// handles an object with multiple nodes\n\t\t\t\t\tObject.keys(newTree.children).forEach(c =>\n\t\t\t\t\t\tnewTree.children[c] = this.parseTree(newTree.children[c]));\n\t\t\t\t}\n\t\t\t} else if (newTree.end) {\n\t\t\t\t// this is the end leaf nothing to do here\n\t\t\t} else {\n\t\t\t\t// should not happen\n\t\t\t\tthrow new Error(\"children should be a string reference to common branch or an object\");\n\t\t\t}\n\t\t\treturn newTree;\n\t\t},\n\t\tgetPreviousStep(path) {\n\t\t\treturn path.reduce((step, p) => {\n\t\t\t\treturn step.children[p];\n\t\t\t}, this.tree);\n\t\t},\n\t\tgetCurrentStep(branch, nextStep) {\n\t\t\tif (typeof branch.children[nextStep] === \"object\") {\n\t\t\t\t// should always be an object\n\t\t\t\treturn branch.children[nextStep].node;\n\t\t\t} else if (typeof branch.children[nextStep] === \"string\") {\n\t\t\t\t// TODO check to see if this can ever happen???\n\t\t\t\treturn dataModel.common[branch.children[nextStep]];\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"children should be a string reference to common branch or an object\");\n\t\t\t}\n\t\t},\n\t\tgoToPreviousStep(path) {\n\t\t\tthis.undo(\"productHelp\");\n\t\t\tthis.setNextStep({\n\t\t\t\tstep: \"\",\n\t\t\t});\n\n\t\t},\n\t\tcheckForAnsweredStep() {\n\t\t\t// skip next step if answered already\n\t\t\tlet answer = this.answers[this.branch.children[this.nextStep].node];\n\t\t\tif (this.branch.children[this.nextStep].node === \"select-concern\" && answer) {\n\t\t\t\tif (answer.meta && answer.meta.reason\n\t\t\t\t\t&& this.branch.children[this.nextStep].children[answer.meta.reason[0]]) {\n\t\t\t\t\tthis.setCurrentStep({\n\t\t\t\t\t\tstep: this.getCurrentStep(this.branch, this.nextStep),\n\t\t\t\t\t});\n\t\t\t\t\tthis.addPathStep({\n\t\t\t\t\t\tstep: this.nextStep,\n\t\t\t\t\t\ttree: this.tree,\n\t\t\t\t\t});\n\t\t\t\t\tthis.setNextStep({\n\t\t\t\t\t\tstep: answer.meta.reason[0],\n\t\t\t\t\t});\n\t\t\t\t\tthis.checkForAnsweredStep();\n\t\t\t\t} else if (answer.meta && answer.meta[\"purchased-from\"]) {\n\t\t\t\t\tthis.setCurrentStep({\n\t\t\t\t\t\tstep: this.getCurrentStep(this.branch, this.nextStep),\n\t\t\t\t\t});\n\t\t\t\t\tthis.addPathStep({\n\t\t\t\t\t\tstep: this.nextStep,\n\t\t\t\t\t\ttree: this.tree,\n\t\t\t\t\t});\n\t\t\t\t\tthis.setNextStep({\n\t\t\t\t\t\tstep: \"need-purchase-location\",\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.setFollowingStep();\n\t\t\t\t}\n\t\t\t\tthis.checkForAnsweredStep();\n\t\t\t} else if (answer) {\n\t\t\t\tlet value = typeof answer === \"string\"\n\t\t\t\t\t? answer\n\t\t\t\t\t: answer.value || answer.id;\n\t\t\t\tif (this.branch.children[this.nextStep].children[value]) {\n\t\t\t\t\t// mark as duplicate step so we can reverse it later\n\t\t\t\t\tanswer.repeat = true;\n\t\t\t\t\tthis.setCurrentStep({\n\t\t\t\t\t\tstep: this.getCurrentStep(this.branch, this.nextStep),\n\t\t\t\t\t});\n\t\t\t\t\tthis.addPathStep({\n\t\t\t\t\t\tstep: this.nextStep,\n\t\t\t\t\t\ttree: this.tree,\n\t\t\t\t\t});\n\t\t\t\t\tthis.setNextStep({\n\t\t\t\t\t\tstep: value,\n\t\t\t\t\t});\n\t\t\t\t\tthis.checkForAnsweredStep();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcheckForFilteredStep() {\n\t\t\t// skip next step if filter is applicable\n\t\t\tlet node = dataModel.nodes[this.currentStep];\n\t\t\tif (node.meta && node.meta.filters) {\n\t\t\t\tif (Object.keys(node.meta.filters).every(key => {\n\t\t\t\t\tlet answer = typeof this.answers[key] === \"string\"\n\t\t\t\t\t\t? this.answers[key]\n\t\t\t\t\t\t: this.answers[key].value || this.answers[key].id;\n\t\t\t\t\treturn node.meta.filters[key].includes(answer);\n\t\t\t\t})) {\n\t\t\t\t\t// dont' skip step\n\t\t\t\t} else {\n\t\t\t\t\t// skip step\n\t\t\t\t\tthis.setAnswer({\n\t\t\t\t\t\tid: this.currentStep,\n\t\t\t\t\t\tanswer: node.meta.filteredAnswer,\n\t\t\t\t\t});\n\t\t\t\t\tthis.setNextStep({\n\t\t\t\t\t\tstep: node.meta.filteredAnswer.value,\n\t\t\t\t\t});\n\t\t\t\t\tthis.moveToNextStep();\n\t\t\t\t}\n\t\t\t}\n\n\t\t},\n\t\tmoveToNextStep() {\n\t\t\tthis.setCurrentStep({\n\t\t\t\tstep: this.getCurrentStep(this.branch, this.nextStep),\n\t\t\t});\n\t\t\tthis.addPathStep({\n\t\t\t\tstep: this.nextStep,\n\t\t\t\ttree: this.tree,\n\t\t\t});\n\t\t\tthis.setNextStep({\n\t\t\t\tstep: \"\",\n\t\t\t});\n\t\t\tthis.setNextFocus({\n\t\t\t\tfocus: false,\n\t\t\t});\n\t\t},\n\t\tgoToNextStep() {\n\t\t\tthis.setUndoPoint();\n\n\t\t\t// driven by the tree\n\t\t\t// the current answer and the current node of the tree tells us what is the next node\n\t\t\tthis.checkForAnsweredStep();\n\n\t\t\tthis.moveToNextStep();\n\n\t\t\tthis.checkForFilteredStep();\n\n\t\t},\n\t\tgoToSpecificStep(steps) {\n\t\t\tthis.setUndoPoint();\n\t\t\tsteps.forEach((step, i) => {\n\t\t\t\t// need to set the answer if repeating\n\t\t\t\tif (i < steps.length - 1) {\n\t\t\t\t\tthis.setAnswer({\n\t\t\t\t\t\tid: step,\n\t\t\t\t\t\tanswer: dataModel.nodes[step].options\n\t\t\t\t\t\t\t.find(option => option.value === steps[i + 1]) // get answer from dataModel based on the following step\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis.setNextStep({\n\t\t\t\t\tstep: step,\n\t\t\t\t});\n\t\t\t\tthis.addPathStep({\n\t\t\t\t\tstep: step,\n\t\t\t\t\ttree: this.tree,\n\t\t\t\t});\n\t\t\t});\n\t\t\tthis.setCurrentStep({\n\t\t\t\tstep: steps[steps.length - 1],\n\t\t\t});\n\t\t\tthis.setNextStep({\n\t\t\t\tstep: \"\",\n\t\t\t});\n\t\t},\n\t\tgoToEnd(resolved) {\n\t\t\tthis.setUndoPoint();\n\t\t\tthis.setResolvedFlag({\n\t\t\t\tresolved: resolved\n\t\t\t})\n\t\t\tthis.setCurrentStep({\n\t\t\t\tstep: \"submit\",\n\t\t\t});\n\t\t\tthis.addPathStep({\n\t\t\t\tstep: \"submit\",\n\t\t\t\ttree: this.tree,\n\t\t\t});\n\t\t\tthis.setNextStep({\n\t\t\t\tstep: \"\",\n\t\t\t});\n\t\t}\n\t},\n};\n","import { render, staticRenderFns } from \"./Start.vue?vue&type=template&id=1f1b0073&scoped=true&\"\nimport script from \"./Start.vue?vue&type=script&lang=js&\"\nexport * from \"./Start.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1f1b0073\",\n null\n \n)\n\nexport default component.exports","\n \n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _vm._m(0)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"frow\"},[_c('p',[_vm._v(\"Loading...\")])])])}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./NodeWrap.vue?vue&type=template&id=37e7a930&scoped=true&\"\nimport script from \"./NodeWrap.vue?vue&type=script&lang=js&\"\nexport * from \"./NodeWrap.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"37e7a930\",\n null\n \n)\n\nexport default component.exports","\n \n
\n
{{ node.subtitle }}
\n
{{ node.label }}
\n
\n
\n
\n \n
\n
\n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"frow justify-between\"},[_c('div',{staticClass:\"label col-xs-1-1 col-sm-5-12\"},[(_vm.node.subtitle)?_c('p',{staticClass:\"subtitle--line brown\"},[_vm._v(_vm._s(_vm.node.subtitle))]):_vm._e(),_vm._v(\" \"),_c('h1',{staticClass:\"h2 mb-0\",class:{'form-required': _vm.required}},[_vm._v(_vm._s(_vm.node.label))]),_vm._v(\" \"),(_vm.node.copy)?_c('p',{domProps:{\"innerHTML\":_vm._s(_vm.node.copy)}}):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"node-wrap col-xs-1-1 col-sm-6-12 frow\"},[_vm._t(\"default\")],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Question.vue?vue&type=template&id=2ba270f6&scoped=true&\"\nimport script from \"./Question.vue?vue&type=script&lang=js&\"\nexport * from \"./Question.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2ba270f6\",\n null\n \n)\n\nexport default component.exports","\n \n
\n \n
\n
\n
\n
{{ option.text }}
\n
\n
\n
\n {{ option.text }}\n
\n
\n
\n
\n \n
\n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"question\"},[_c('node-wrap',{attrs:{\"node\":_vm.node,\"required\":_vm.required}},[_c('div',{staticClass:\"frow centered gutters col-xs-1-1\"},_vm._l((_vm.node.options),function(option,index){return _c('div',{key:(\"question-option-\" + index),staticClass:\"col-xs-1-1\",class:_vm.optionWidth},[_c('div',{ref:(\"option-\" + (index + 1)),refInFor:true,staticClass:\"frow justify-start centered option\",class:{active: _vm.chosenIndex === index, 'mt-3': _vm.optionWidth === 'col-xs-1-1' && index !== 0},attrs:{\"tabindex\":\"0\"},on:{\"click\":function($event){return _vm.setChoice(option, index)},\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.preventDefault();return _vm.setChoice(option, index)}}},[(option.description)?_c('div',{staticClass:\" frow row-start\"},[_c('div',{staticClass:\"col-sm-1-3\"},[_c('strong',[_vm._v(_vm._s(option.text))])]),_vm._v(\" \"),_c('div',{staticClass:\"col-sm-2-3\"},[_c('p',{staticClass:\"mb-0\"},[_vm._v(_vm._s(option.description))])])]):_c('div',{staticClass:\"frow centered\"},[_c('strong',[_vm._v(_vm._s(option.text))])])])])}),0)])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./DateInput.vue?vue&type=template&id=cef71570&scoped=true&\"\nimport script from \"./DateInput.vue?vue&type=script&lang=js&\"\nexport * from \"./DateInput.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"cef71570\",\n null\n \n)\n\nexport default component.exports","\n \n \n \n
\n \n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('node-wrap',{attrs:{\"node\":_vm.node,\"required\":_vm.required}},[_c('div',{staticClass:\"frow\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.date),expression:\"date\"}],attrs:{\"type\":\"date\"},domProps:{\"value\":(_vm.date)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.date=$event.target.value}}})])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./TextInput.vue?vue&type=template&id=61a77b04&scoped=true&\"\nimport script from \"./TextInput.vue?vue&type=script&lang=js&\"\nexport * from \"./TextInput.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"61a77b04\",\n null\n \n)\n\nexport default component.exports","\n \n \n \n
\n \n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('node-wrap',{attrs:{\"node\":_vm.node,\"required\":_vm.required}},[_c('div',{staticClass:\"frow\"},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.text),expression:\"text\"}],ref:\"textinput\",attrs:{\"cols\":\"50\",\"rows\":\"5\"},domProps:{\"value\":(_vm.text)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.text=$event.target.value}}})])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./MultiNode.vue?vue&type=template&id=ac2103d0&scoped=true&\"\nimport script from \"./MultiNode.vue?vue&type=script&lang=js&\"\nexport * from \"./MultiNode.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"ac2103d0\",\n null\n \n)\n\nexport default component.exports","\n \n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"multi-node\"},_vm._l((Math.ceil(_vm.nodes.length/_vm.nodesPerRow)),function(w,i){return _c('div',{staticClass:\"frow gutters justify-start\"},_vm._l((_vm.nodes.slice(_vm.nodesPerRow * (w-1), _vm.nodesPerRow*(w-1)+_vm.nodesPerRow)),function(nd,index){return _c('div',{staticClass:\"node col-sm-1-2 mb-4\"},[_c(nd.type,{key:nd.key,tag:\"component\",attrs:{\"step\":_vm.steps[index + (i*_vm.nodesPerRow)],\"node\":nd,\"answerOnly\":true,\"required\":nd.meta.required,\"noFocus\":i !== 0 || index !== 0}})],1)}),0)}),0)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Reason.vue?vue&type=template&id=37501f27&scoped=true&\"\nimport script from \"./Reason.vue?vue&type=script&lang=js&\"\nexport * from \"./Reason.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"37501f27\",\n null\n \n)\n\nexport default component.exports","\n \n\n\n\n\n\n\n\n
\n
\n
\n
\n {{ choice.text }}\n
\n
\n
\n
\n
\n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"frow reason\"},[_c('div',{staticClass:\"frow justify-start gutters\"},_vm._l((_vm.options),function(choice,index){return _c('div',{staticClass:\"col-xs-1-1 col-sm-1-2\",class:{'mt-3': index !== 0 || index !== 1}},[_c('div',{staticClass:\"option\",class:{active: _vm.chosenIndex === index},on:{\"click\":function($event){return _vm.setChoice(choice, index)}}},[_c('div',{},[_c('strong',[_vm._v(_vm._s(choice.text))])])])])}),0)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./SelectConcern.vue?vue&type=template&id=45ce72a7&scoped=true&\"\nimport script from \"./SelectConcern.vue?vue&type=script&lang=js&\"\nexport * from \"./SelectConcern.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"45ce72a7\",\n null\n \n)\n\nexport default component.exports","\n \n
\n
\n {{ node.subtitle }}\n
\n
{{ node.label }}
\n
\n
\n
\n
\n
\n
\n
\n
![]()
\n
{{ concern.label }}
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"concern\"},[_c('div',{staticClass:\"frow justify-start\"},[(_vm.node.subtitle)?_c('p',{staticClass:\"subtitle--line brown\"},[_vm._v(\"\\n \"+_vm._s(_vm.node.subtitle)+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('h1',{staticClass:\"h2\"},[_vm._v(_vm._s(_vm.node.label))])]),_vm._v(\" \"),_c('div',{staticClass:\"frow justify-start\"},[_c('div',{staticClass:\"frow col-xs-1-1 col-sm-1-2\"},[_c('div',{staticClass:\"frow gutters justify-start concern-items\"},_vm._l((_vm.concerns),function(concern,index){return _c('div',{key:concern.id,staticClass:\"col-xs-1-1 col-sm-1-2\",class:{'mt-3': index !== 0 && index !== 1, 'mt-3-mobile': index === 1}},[_c('div',{ref:(\"concern-\" + (index+1)),refInFor:true,staticClass:\"option-card\",class:{active: _vm.selectedConcern === concern},attrs:{\"tabindex\":\"0\"},on:{\"click\":function($event){return _vm.setConcern(concern, index)},\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.preventDefault();return _vm.setConcern(concern, index)}}},[_c('div',{staticClass:\"option-card--wrapper\"},[_c('img',{attrs:{\"src\":concern.image ? (\"\" + _vm.drupalRoot + (concern.image)) : (_vm.drupalRoot + \"/themes/custom/tombras/images/product-help/generic.jpg\"),\"alt\":(\"Visual representation of \" + (concern.label))}}),_vm._v(\" \"),_c('p',{staticClass:\"h7\"},[_vm._v(_vm._s(concern.label))])])])])}),0)]),_vm._v(\" \"),_c('div',{staticClass:\"frow col-xs-1-1 col-sm-1-2 justify-center items-start\"},[(_vm.selectedConcern)?_c('div',{staticClass:\"bg-white col-xs-1-1 col-sm-10-12 rounded concern-explanation\"},[_c('div',{staticClass:\"concern-explanation--image\",style:({backgroundImage: (\"url(\" + (_vm.selectedConcern.image ? (\"\" + _vm.drupalRoot + (_vm.selectedConcern.image)) : (_vm.drupalRoot + \"/themes/custom/tombras/images/product-help/generic.jpg\")) + \")\")}),attrs:{\"role\":\"presentation\"}}),_vm._v(\" \"),(_vm.selectedConcern.response)?_c('div',{staticClass:\"p-4\",domProps:{\"innerHTML\":_vm._s(_vm.response)}}):_vm._e()]):_vm._e()])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Information.vue?vue&type=template&id=771e3a41&scoped=true&\"\nimport script from \"./Information.vue?vue&type=script&lang=js&\"\nexport * from \"./Information.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"771e3a41\",\n null\n \n)\n\nexport default component.exports","\n \n
\n
\n
\n
{{ concern.label }}
\n
\n
\n
\n
\n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{domProps:{\"innerHTML\":_vm._s(_vm.node.information)}}),_vm._v(\" \"),_c('div',{staticClass:\"concerns\"},_vm._l((_vm.concerns),function(concern){return _c('div',[_c('h4',[_vm._v(_vm._s(concern.label))]),_vm._v(\" \"),_c('p',{domProps:{\"innerHTML\":_vm._s(concern.response)}})])}),0)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nvar defer = function defer() {\n var state = false; // Resolved or not\n\n var callbacks = [];\n\n var resolve = function resolve(val) {\n if (state) {\n return;\n }\n\n state = true;\n\n for (var i = 0, len = callbacks.length; i < len; i++) {\n callbacks[i](val);\n }\n };\n\n var then = function then(cb) {\n if (!state) {\n callbacks.push(cb);\n return;\n }\n\n cb();\n };\n\n var deferred = {\n resolved: function resolved() {\n return state;\n },\n resolve: resolve,\n promise: {\n then: then\n }\n };\n return deferred;\n};\n\nvar ownProp = Object.prototype.hasOwnProperty;\nfunction createRecaptcha() {\n var deferred = defer();\n return {\n notify: function notify() {\n deferred.resolve();\n },\n wait: function wait() {\n return deferred.promise;\n },\n render: function render(ele, options, cb) {\n this.wait().then(function () {\n cb(window.grecaptcha.render(ele, options));\n });\n },\n reset: function reset(widgetId) {\n if (typeof widgetId === 'undefined') {\n return;\n }\n\n this.assertLoaded();\n this.wait().then(function () {\n return window.grecaptcha.reset(widgetId);\n });\n },\n execute: function execute(widgetId) {\n if (typeof widgetId === 'undefined') {\n return;\n }\n\n this.assertLoaded();\n this.wait().then(function () {\n return window.grecaptcha.execute(widgetId);\n });\n },\n checkRecaptchaLoad: function checkRecaptchaLoad() {\n if (ownProp.call(window, 'grecaptcha') && ownProp.call(window.grecaptcha, 'render')) {\n this.notify();\n }\n },\n assertLoaded: function assertLoaded() {\n if (!deferred.resolved()) {\n throw new Error('ReCAPTCHA has not been loaded');\n }\n }\n };\n}\nvar recaptcha = createRecaptcha();\n\nif (typeof window !== 'undefined') {\n window.vueRecaptchaApiLoaded = recaptcha.notify;\n}\n\nvar VueRecaptcha = {\n name: 'VueRecaptcha',\n props: {\n sitekey: {\n type: String,\n required: true\n },\n theme: {\n type: String\n },\n badge: {\n type: String\n },\n type: {\n type: String\n },\n size: {\n type: String\n },\n tabindex: {\n type: String\n },\n loadRecaptchaScript: {\n type: Boolean,\n \"default\": false\n },\n recaptchaScriptId: {\n type: String,\n \"default\": '__RECAPTCHA_SCRIPT'\n },\n recaptchaHost: {\n type: String,\n \"default\": 'www.google.com'\n },\n language: {\n type: String,\n \"default\": ''\n }\n },\n beforeMount: function beforeMount() {\n if (this.loadRecaptchaScript) {\n if (!document.getElementById(this.recaptchaScriptId)) {\n // Note: vueRecaptchaApiLoaded load callback name is per the latest documentation\n var script = document.createElement('script');\n script.id = this.recaptchaScriptId;\n script.src = \"https://\" + this.recaptchaHost + \"/recaptcha/api.js?onload=vueRecaptchaApiLoaded&render=explicit&hl=\" + this.language;\n script.async = true;\n script.defer = true;\n document.head.appendChild(script);\n }\n }\n },\n mounted: function mounted() {\n var _this = this;\n\n recaptcha.checkRecaptchaLoad();\n\n var opts = _extends({}, this.$props, {\n callback: this.emitVerify,\n 'expired-callback': this.emitExpired,\n 'error-callback': this.emitError\n });\n\n var container = this.$slots[\"default\"] ? this.$el.children[0] : this.$el;\n recaptcha.render(container, opts, function (id) {\n _this.$widgetId = id;\n\n _this.$emit('render', id);\n });\n },\n methods: {\n reset: function reset() {\n recaptcha.reset(this.$widgetId);\n },\n execute: function execute() {\n recaptcha.execute(this.$widgetId);\n },\n emitVerify: function emitVerify(response) {\n this.$emit('verify', response);\n },\n emitExpired: function emitExpired() {\n this.$emit('expired');\n },\n emitError: function emitError() {\n this.$emit('error');\n }\n },\n render: function render(h) {\n return h('div', {}, this.$slots[\"default\"]);\n }\n};\n\nexport default VueRecaptcha;\n","import { render, staticRenderFns } from \"./PhotoUploader.vue?vue&type=template&id=83e7451e&\"\nimport script from \"./PhotoUploader.vue?vue&type=script&lang=js&\"\nexport * from \"./PhotoUploader.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n \n
Please upload one picture of the area of concern and one picture of the Lodge logo (this is usually on the bottom of our cookware).
\n\n
\n
\n
\n \n \n
\n
\n
\n
\n
{{ f.id ? \"Uploaded\" : \"Ready to upload\" }}
\n
![\"Preview]()
\n
\n
\n
\n
\n
\n \n
\n
\n
Comments (add any details you want customer care to know about):
\n
\n
\n
\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('p',[_vm._v(\"Please upload one picture of the area of concern and one picture of the Lodge logo (this is usually on the bottom of our cookware).\")]),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.hide),expression:\"!hide\"}],ref:\"dropArea\",staticClass:\"image-uploader-drop-area\"},[_c('div',{staticClass:\"my-form\",attrs:{\"data-vue-updateable\":\"true\"}},[_c('p',[_vm._v(\"\\n Upload up-to \"+_vm._s(_vm.maxImages)+\" image files (.jpg or .png) with the file\\n dialog or by dragging and dropping images onto the dashed region.\\n \")]),_vm._v(\" \"),_vm._m(0),_vm._v(\" \"),_c('p',[_vm._v(\"Please select your image(s) and then click the \\\"Upload Files\\\" button.\")]),_vm._v(\" \"),_c('input',{staticClass:\"image-uploader-drop-area--file-elem\",attrs:{\"type\":\"file\",\"id\":\"fileElem\",\"multiple\":\"\",\"accept\":\"image/*\"},on:{\"change\":function($event){return _vm.handleFiles($event)}}}),_vm._v(\" \"),(_vm.fileListPreview.length < 2)?_c('label',{ref:\"select-images\",staticClass:\"btn btn--arrow\",attrs:{\"tabindex\":\"0\",\"for\":\"fileElem\"},on:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.preventDefault();return _vm.openFileDialog($event)}}},[_vm._v(\"Select image(s)\")]):_vm._e()]),_vm._v(\" \"),_c('transition',{attrs:{\"name\":\"fade\"}},[_c('progress',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isUploading),expression:\"isUploading\"}],ref:\"progressBar\",staticClass:\"progress-bar\",attrs:{\"max\":\"100\",\"value\":\"0\"}})]),_vm._v(\" \"),_c('div',{staticClass:\"frow direction-row items-center justify-start gutters mt-10\",attrs:{\"data-vue-updateable\":\"true\"}},_vm._l((_vm.fileListPreview),function(f,index){return _c('div',{key:index,staticClass:\"col-xs-1-2\"},[_c('div',{staticClass:\"image-uploader-drop-area--image-container\"},[_c('div',{staticClass:\"btn--close\",attrs:{\"aria-label\":\"Close\",\"role\":\"button\",\"tabindex\":\"0\"},on:{\"click\":function($event){return _vm.removeFile(index)}}},[_vm._m(1,true)]),_vm._v(\" \"),_c('div',{staticClass:\"status\"},[_vm._v(_vm._s(f.id ? \"Uploaded\" : \"Ready to upload\"))]),_vm._v(\" \"),_c('img',{attrs:{\"src\":f.image,\"alt\":\"Preview of uploaded file\"}})])])}),0)],1),_vm._v(\" \"),_c('div',{staticClass:\"col-xs-12 col-sm-5 col-md-4 col-lg-3\"},[_c('button',{staticClass:\"btn btn-primary\",attrs:{\"disabled\":!_vm.fileListPreview.length || _vm.isUploading || _vm.fileListPreview.every(function (f) { return f.id; })},on:{\"click\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.submitFiles($event)}}},[_vm._v(\"Upload Files\")])]),_vm._v(\" \"),_c('div',{staticClass:\"frow mt-4 direction-column\"},[_c('p',[_vm._v(\"Comments (add any details you want customer care to know about):\")]),_vm._v(\" \"),_c('textarea',{attrs:{\"name\":\"notes\",\"id\":\"notes\",\"cols\":\"30\",\"rows\":\"5\"},domProps:{\"value\":_vm.notes},on:{\"input\":_vm.updateNotes}})])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('p',[_c('strong',[_vm._v(\"Please attach one photograph of the damaged area and one photograph that clearly shows the Lodge\\n logo.\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"btn--close-slices\"},[_c('span',{attrs:{\"role\":\"presentation\"}}),_vm._v(\" \"),_c('span',{attrs:{\"role\":\"presentation\"}})])}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./OrderChooser.vue?vue&type=template&id=9812e608&scoped=true&\"\nimport script from \"./OrderChooser.vue?vue&type=script&lang=js&\"\nexport * from \"./OrderChooser.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"9812e608\",\n null\n \n)\n\nexport default component.exports","\n \n
\n
\n
\n
\n There was a problem getting the order...\n Please check that the order number is correct, check for Os instead of zeroes.\n Make sure you have the email and zip code used on the order.\n
\n
\n
\n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"order-finder\"},[_c('form',{staticClass:\"frow column-start\",attrs:{\"aria-label\":\"Order Finder\"}},[_c('label',{staticClass:\"secondary-highlight\",attrs:{\"for\":\"search\"}},[_vm._v(\"Enter order information\")]),_vm._v(\" \"),_c('div',{staticClass:\"floating-label--wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model.trim\",value:(_vm.orderNumber),expression:\"orderNumber\",modifiers:{\"trim\":true}}],ref:\"order-number\",staticClass:\"floating-label--field\",attrs:{\"id\":\"order-number\",\"type\":\"text\",\"placeholder\":\"Order Number\"},domProps:{\"value\":(_vm.orderNumber)},on:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.preventDefault();return _vm.findOrder($event)},\"input\":function($event){if($event.target.composing){ return; }_vm.orderNumber=$event.target.value.trim()},\"blur\":function($event){return _vm.$forceUpdate()}}}),_vm._v(\" \"),_c('label',{staticClass:\"floating-label\",attrs:{\"for\":\"order-number\"}},[_vm._v(\"Lodge Order Number\")])]),_vm._v(\" \"),_c('div',{staticClass:\"floating-label--wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model.trim\",value:(_vm.email),expression:\"email\",modifiers:{\"trim\":true}}],staticClass:\"floating-label--field\",attrs:{\"id\":\"order-email\",\"type\":\"text\",\"placeholder\":\"Order Email\"},domProps:{\"value\":(_vm.email)},on:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.preventDefault();return _vm.findOrder($event)},\"input\":function($event){if($event.target.composing){ return; }_vm.email=$event.target.value.trim()},\"blur\":function($event){return _vm.$forceUpdate()}}}),_vm._v(\" \"),_c('label',{staticClass:\"floating-label\",attrs:{\"for\":\"order-email\"}},[_vm._v(\"Order Email\")]),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.emailError && _vm.email),expression:\"emailError && email\"}],staticClass:\"error\"},[_vm._v(\"\\n Please enter a valid email address\\n \")])]),_vm._v(\" \"),_c('div',{staticClass:\"floating-label--wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model.trim\",value:(_vm.zip),expression:\"zip\",modifiers:{\"trim\":true}}],staticClass:\"floating-label--field\",attrs:{\"id\":\"order-zip\",\"type\":\"text\",\"placeholder\":\"Order Zip Code\"},domProps:{\"value\":(_vm.zip)},on:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.preventDefault();return _vm.findOrder($event)},\"input\":function($event){if($event.target.composing){ return; }_vm.zip=$event.target.value.trim()},\"blur\":function($event){return _vm.$forceUpdate()}}}),_vm._v(\" \"),_c('label',{staticClass:\"floating-label\",attrs:{\"for\":\"order-zip\"}},[_vm._v(\"Billing Order Zip Code\")]),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.zipError && _vm.zip),expression:\"zipError && zip\"}],staticClass:\"error\"},[_vm._v(\"\\n Please enter a valid zip code\\n \")])])]),_vm._v(\" \"),_c('div',{staticClass:\"frow inline\"},[_c('button',{staticClass:\"btn btn-primary borderless px-4 mt-4\",attrs:{\"disabled\":!_vm.findEnabled},on:{\"click\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.findOrder($event)}}},[_vm._v(\"Find Order\\n \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.orderLoadingStatus === 'ORDER_LOADING'),expression:\"orderLoadingStatus === 'ORDER_LOADING'\"}],staticClass:\"lds-ring\"},[_c('div'),_c('div'),_c('div'),_c('div')])])]),_vm._v(\" \"),_c('div',{staticClass:\"frow justify-start mt-2\"},[(_vm.error)?_c('div',{staticClass:\"error\"},[_vm._v(\"\\n There was a problem getting the order...\\n Please check that the order number is correct, check for Os instead of zeroes.\\n Make sure you have the email and zip code used on the order.\\n \")]):_vm._e()])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./ContactInformation.vue?vue&type=template&id=4fdfc08e&scoped=true&\"\nimport script from \"./ContactInformation.vue?vue&type=script&lang=js&\"\nexport * from \"./ContactInformation.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4fdfc08e\",\n null\n \n)\n\nexport default component.exports","\n \n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"shipping-information\"},[_c('div',{staticClass:\"mb-60\"},[(_vm.node.subtitle)?_c('p',{staticClass:\"subtitle--line brown\"},[_vm._v(_vm._s(_vm.node.subtitle))]):_vm._e(),_vm._v(\" \"),_c('h1',{staticClass:\"h2 mb-0\"},[_vm._v(_vm._s(_vm.node.label))]),_vm._v(\" \"),(_vm.subhead)?_c('p',{staticClass:\"mt-30\",domProps:{\"innerHTML\":_vm._s(_vm.subhead)}}):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"frow justify-between\"},[_c('div',{staticClass:\"label col-xs-1-1 col-sm-5-12 mb-4\"},[(_vm.order && !_vm.order.orderNumber)?_c('order-chooser'):_vm._e(),_vm._v(\" \"),(_vm.order && _vm.order.orderNumber)?_c('div',{staticClass:\"frow column-start\"},[_c('div',{staticClass:\"secondary-highlight\"},[_vm._v(\"Order \"),_c('strong',[_vm._v(_vm._s(_vm.order.orderNumber))]),_vm._v(\" |\\n \"),_c('button',{staticClass:\"btn--text-link\",on:{\"click\":_vm.removeOrder}},[_vm._v(\"Check a different order\")])]),_vm._v(\" \"),_c('div',{staticClass:\"products\"},[_vm._l((_vm.order.products),function(product){return _c('div',{staticClass:\"frow justify-start mb-4\",class:{'selected-product': product.id === _vm.issueProduct.id}},[_c('img',{attrs:{\"src\":product.image,\"alt\":product.name}}),_vm._v(\" \"),_c('div',{staticClass:\"product-name\"},[_c('strong',[_vm._v(_vm._s(product.name))]),_c('br'),_vm._v(\" \"),_c('span',{staticClass:\"sku\"},[_vm._v(_vm._s(product.id)+_vm._s(product.name === _vm.issueProduct.name ? (\" (\" + (product.quantity) + \")\") : ''))])])])}),_vm._v(\" \"),(!_vm.order.products.find(function (p) { return _vm.issueProduct.id === p.id; }))?_c('div',{staticClass:\"frow justify-start mb-4 selected-product\"},[_c('img',{attrs:{\"src\":_vm.issueProduct.image.url || _vm.issueProduct.image.url,\"alt\":_vm.issueProduct.image.alt || _vm.issueProduct.name}}),_vm._v(\" \"),_c('div',{staticClass:\"product-name\"},[_c('strong',[_vm._v(_vm._s(_vm.issueProduct.name))]),_c('br'),_vm._v(\" \"),_c('span',{staticClass:\"sku\"},[_vm._v(_vm._s(_vm.issueProduct.id)+\" (\"+_vm._s(_vm.issueProduct.quantity)+\")\")])])]):_vm._e()],2)]):_vm._e()],1),_vm._v(\" \"),_c('form',{staticClass:\"col-xs-1-1 col-sm-6-12 frow column-start\",attrs:{\"aria-label\":\"Contact Information\"}},[_c('div',{staticClass:\"frow column-start mb-4\"},[_c('label',{staticClass:\"secondary-highlight\"},[_vm._v(\"Contact Information\")]),_vm._v(\" \"),_c('div',{staticClass:\"floating-label--wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.name),expression:\"name\"}],ref:\"name\",staticClass:\"floating-label--field\",attrs:{\"type\":\"text\",\"id\":\"name\",\"placeholder\":\"Name\"},domProps:{\"value\":(_vm.name)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.name=$event.target.value}}}),_vm._v(\" \"),_vm._m(0),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.nameError && _vm.name),expression:\"nameError && name\"}],staticClass:\"error\"},[_vm._v(\"\\n Please enter a name\\n \")])]),_vm._v(\" \"),_c('div',{staticClass:\"floating-label--wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.email),expression:\"email\"}],staticClass:\"floating-label--field\",attrs:{\"type\":\"text\",\"id\":\"email\",\"placeholder\":\"Email\"},domProps:{\"value\":(_vm.email)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.email=$event.target.value}}}),_vm._v(\" \"),_vm._m(1),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.emailError && _vm.email),expression:\"emailError && email\"}],staticClass:\"error\"},[_vm._v(\"\\n Please enter a valid email address\\n \")])]),_vm._v(\" \"),_c('div',{staticClass:\"floating-label--wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.phone),expression:\"phone\"}],staticClass:\"floating-label--field\",attrs:{\"type\":\"text\",\"id\":\"phone\",\"placeholder\":\"Phone\"},domProps:{\"value\":(_vm.phone)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.phone=$event.target.value}}}),_vm._v(\" \"),_vm._m(2),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.phoneError && _vm.phone),expression:\"phoneError && phone\"}],staticClass:\"error\"},[_vm._v(\"\\n Please enter a valid phone number including area code\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"frow items-center justify-start\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.intlPhone),expression:\"intlPhone\"}],staticClass:\"mb-0\",attrs:{\"type\":\"checkbox\",\"id\":\"intl-phone\"},domProps:{\"checked\":Array.isArray(_vm.intlPhone)?_vm._i(_vm.intlPhone,null)>-1:(_vm.intlPhone)},on:{\"change\":function($event){var $$a=_vm.intlPhone,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.intlPhone=$$a.concat([$$v]))}else{$$i>-1&&(_vm.intlPhone=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.intlPhone=$$c}}}}),_vm._v(\" \"),_c('span',{staticClass:\"ml-2 intl-phone-note\"},[_vm._v(\"Non-US #\")])])])]),_vm._v(\" \"),_c('div',{staticClass:\"frow column-start\"},[_c('label',{staticClass:\"secondary-highlight\"},[_vm._v(\"Shipping Address\")]),_vm._v(\" \"),_c('div',{staticClass:\"floating-label--wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.address1),expression:\"address1\"}],staticClass:\"floating-label--field\",attrs:{\"type\":\"text\",\"id\":\"address1\",\"placeholder\":\"Address Line 1\"},domProps:{\"value\":(_vm.address1)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.address1=$event.target.value}}}),_vm._v(\" \"),_c('label',{staticClass:\"floating-label\",attrs:{\"for\":\"address1\"}},[_vm._v(\"Address Line 1\")])]),_vm._v(\" \"),_c('div',{staticClass:\"floating-label--wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.address2),expression:\"address2\"}],staticClass:\"floating-label--field\",attrs:{\"type\":\"text\",\"id\":\"address2\",\"placeholder\":\"Address Line 2\"},domProps:{\"value\":(_vm.address2)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.address2=$event.target.value}}}),_vm._v(\" \"),_c('label',{staticClass:\"floating-label\",attrs:{\"for\":\"address2\"}},[_vm._v(\"Address Line 2\")])]),_vm._v(\" \"),_c('div',{staticClass:\"floating-label--wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.city),expression:\"city\"}],staticClass:\"floating-label--field\",attrs:{\"type\":\"text\",\"id\":\"city\",\"placeholder\":\"City\"},domProps:{\"value\":(_vm.city)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.city=$event.target.value}}}),_vm._v(\" \"),_c('label',{staticClass:\"floating-label\",attrs:{\"for\":\"city\"}},[_vm._v(\"City\")])]),_vm._v(\" \"),_c('div',{staticClass:\"floating-label--wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.state),expression:\"state\"}],staticClass:\"floating-label--field\",attrs:{\"type\":\"text\",\"id\":\"state\",\"placeholder\":\"State\"},domProps:{\"value\":(_vm.state)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.state=$event.target.value}}}),_vm._v(\" \"),_c('label',{staticClass:\"floating-label\",attrs:{\"for\":\"state\"}},[_vm._v(\"State\")])]),_vm._v(\" \"),_c('div',{staticClass:\"floating-label--wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.zip),expression:\"zip\"}],staticClass:\"floating-label--field\",attrs:{\"type\":\"text\",\"id\":\"zip\",\"placeholder\":\"Zip Code\"},domProps:{\"value\":(_vm.zip)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.zip=$event.target.value}}}),_vm._v(\" \"),_c('label',{staticClass:\"floating-label\",attrs:{\"for\":\"zip\"}},[_vm._v(\"Zip Code\")])]),_vm._v(\" \"),_c('div',{staticClass:\"floating-label--wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.country),expression:\"country\"}],staticClass:\"floating-label--field\",attrs:{\"type\":\"text\",\"id\":\"country\",\"placeholder\":\"Country\"},domProps:{\"value\":(_vm.country)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.country=$event.target.value}}}),_vm._v(\" \"),_c('label',{staticClass:\"floating-label\",attrs:{\"for\":\"country\"}},[_vm._v(\"Country\")])])])])])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('label',{staticClass:\"floating-label\",attrs:{\"for\":\"name\"}},[_vm._v(\"Name\"),_c('span',{staticClass:\"required\",attrs:{\"title\":\"required\"}},[_vm._v(\"*\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('label',{staticClass:\"floating-label\",attrs:{\"for\":\"email\"}},[_vm._v(\"Email\"),_c('span',{staticClass:\"required\",attrs:{\"title\":\"required\"}},[_vm._v(\"*\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('label',{staticClass:\"floating-label\",attrs:{\"for\":\"phone\"}},[_vm._v(\"Phone\"),_c('span',{staticClass:\"required\",attrs:{\"title\":\"required\"}},[_vm._v(\"*\")])])}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./ProductChooser.vue?vue&type=template&id=0f14bfda&scoped=true&\"\nimport script from \"./ProductChooser.vue?vue&type=script&lang=js&\"\nexport * from \"./ProductChooser.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0f14bfda\",\n null\n \n)\n\nexport default component.exports","\n \n
\n Loading products...\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
{{ productChoice.id }}
{{ productChoice.name }}
\n
\n \n
\n
{{ productChoice.id }}
{{ productChoice.name }}
\n
\n \n
\n
{{ productChoice.id }}
{{ productChoice.name }}
\n
\n \n
\n
\n \n
\n
\n
\n
Enter the name or SKU of your product and select a material
\n
\n \n \n
\n
\n
\n \n
\n
\n
\n
\n Sorry, there was a problem getting the products. Please reload the page and try again.\n
\n
\n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"product-finder col-xs-1-1 frow column-start\"},[(_vm.productsLoadingStatus === 'PRODUCTS_LOADING')?_c('div',[_vm._v(\"\\n Loading products...\\n \"),_vm._m(0)]):(_vm.products.length)?_c('div',{staticClass:\"col-xs-12\"},[(!_vm.showCustomProductForm)?_c('div',{staticClass:\"frow justify-between column-start items-stretch col-xs-12\"},[_c('label',{attrs:{\"for\":\"search\"}},[_vm._v(\"Enter product name or SKU\")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.search),expression:\"search\"}],ref:\"product-help-product-search\",attrs:{\"type\":\"text\",\"name\":\"product-help-product-search\",\"id\":\"product-help-product-search\"},domProps:{\"value\":(_vm.search)},on:{\"input\":[function($event){if($event.target.composing){ return; }_vm.search=$event.target.value},_vm.findProduct],\"focus\":_vm.findProduct,\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.selectHighlighted($event)},\"keydown\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.hideDropdown($event)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"tab\",9,$event.key,\"Tab\")){ return null; }if(!$event.shiftKey){ return null; }return _vm.hideDropdown($event)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"up\",38,$event.key,[\"Up\",\"ArrowUp\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }$event.preventDefault();return _vm.startArrowKeys($event)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"down\",40,$event.key,[\"Down\",\"ArrowDown\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }$event.preventDefault();return _vm.startArrowKeys($event)}]}}),_vm._v(\" \"),_c('div',{ref:\"dropdown\",staticClass:\"product-choices col-xs-1-1 mt-3\"},[_vm._l((_vm.productChoices),function(productChoice,i){return [(i === 0)?_c('div',{key:productChoice.id,staticClass:\"frow row-start product-choice\",class:{active: productChoice.id === _vm.product.id},attrs:{\"tabindex\":\"0\"},on:{\"click\":function($event){return _vm.chooseProduct(productChoice)},\"keydown\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"up\",38,$event.key,[\"Up\",\"ArrowUp\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }$event.preventDefault();},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"tab\",9,$event.key,\"Tab\")){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.focusNext(false)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"down\",40,$event.key,[\"Down\",\"ArrowDown\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }$event.preventDefault();return _vm.focusNext(true)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.hideDropdown($event)}],\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.preventDefault();return _vm.chooseProduct(productChoice, true)}}},[_c('div',[_c('img',{attrs:{\"src\":productChoice.image.url,\"alt\":productChoice.image.alt || productChoice.name}})]),_vm._v(\" \"),_c('div',{staticClass:\"detail\"},[_c('strong',[_vm._v(_vm._s(productChoice.id))]),_c('br'),_vm._v(_vm._s(productChoice.name))])]):(i === _vm.productChoices.length - 1)?_c('div',{key:productChoice.id,staticClass:\"frow row-start product-choice\",class:{active: productChoice.id === _vm.product.id},attrs:{\"tabindex\":\"0\"},on:{\"click\":function($event){return _vm.chooseProduct(productChoice)},\"keydown\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"tab\",9,$event.key,\"Tab\")){ return null; }if(!$event.shiftKey){ return null; }return _vm.focusPrevious(false)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"up\",38,$event.key,[\"Up\",\"ArrowUp\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }$event.preventDefault();return _vm.focusPrevious(true)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"down\",40,$event.key,[\"Down\",\"ArrowDown\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }$event.preventDefault();},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"tab\",9,$event.key,\"Tab\")){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.hideDropdown($event)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.hideDropdown($event)}],\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.preventDefault();return _vm.chooseProduct(productChoice, true)}}},[_c('div',[_c('img',{attrs:{\"src\":productChoice.image.url,\"alt\":productChoice.image.alt || productChoice.name}})]),_vm._v(\" \"),_c('div',{staticClass:\"detail\"},[_c('strong',[_vm._v(_vm._s(productChoice.id))]),_c('br'),_vm._v(_vm._s(productChoice.name))])]):_c('div',{key:productChoice.id,staticClass:\"frow row-start product-choice\",class:{active: productChoice.id === _vm.product.id},attrs:{\"tabindex\":\"0\"},on:{\"click\":function($event){return _vm.chooseProduct(productChoice)},\"keydown\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"tab\",9,$event.key,\"Tab\")){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.focusNext(false)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"tab\",9,$event.key,\"Tab\")){ return null; }if(!$event.shiftKey){ return null; }return _vm.focusPrevious(false)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"up\",38,$event.key,[\"Up\",\"ArrowUp\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }$event.preventDefault();return _vm.focusPrevious(true)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"down\",40,$event.key,[\"Down\",\"ArrowDown\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }$event.preventDefault();return _vm.focusNext(true)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }return _vm.hideDropdown($event)}],\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.preventDefault();return _vm.chooseProduct(productChoice, true)}}},[_c('div',[_c('img',{attrs:{\"src\":productChoice.image.url,\"alt\":productChoice.image.alt || productChoice.name}})]),_vm._v(\" \"),_c('div',{staticClass:\"detail\"},[_c('strong',[_vm._v(_vm._s(productChoice.id))]),_c('br'),_vm._v(_vm._s(productChoice.name))])])]})],2),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.showCustomProductForm),expression:\"!showCustomProductForm\"}],staticClass:\"frow col-xs-12 justify-end mt-4\"},[_c('button',{staticClass:\"btn--text-link\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.showCustomProductForm = true}}},[_vm._v(\"Don't see your\\n product?\")])])]):_vm._e(),_vm._v(\" \"),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showCustomProductForm),expression:\"showCustomProductForm\"}],staticClass:\"frow column-start items-stretch\"},[_c('p',[_vm._v(\"Enter the name or SKU of your product and select a material\")]),_vm._v(\" \"),_c('div',{staticClass:\"floating-label--wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.customProduct),expression:\"customProduct\"}],ref:\"product-chooser-custom-product\",staticClass:\"floating-label--field\",attrs:{\"type\":\"text\",\"placeholder\":\"Name or SKU\"},domProps:{\"value\":(_vm.customProduct)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.customProduct=$event.target.value}}}),_vm._v(\" \"),_c('label',{staticClass:\"floating-label\",attrs:{\"for\":\"order-email\"}},[_vm._v(\"Name or SKU (required)\")])]),_vm._v(\" \"),_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.customMaterial),expression:\"customMaterial\"}],ref:\"product-chooser-custom-material\",staticClass:\"mt-4\",attrs:{\"name\":\"material\",\"id\":\"material\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.customMaterial=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},[_c('option',{attrs:{\"value\":\"default\"}},[_vm._v(\"Choose a category (required)\")]),_vm._v(\" \"),_vm._l((_vm.materialOptions),function(material){return _c('option',{key:material,domProps:{\"value\":material}},[_vm._v(_vm._s(material))])})],2),_vm._v(\" \"),_c('div',{staticClass:\"frow col-xs-12 justify-end mt-4\"},[_c('button',{staticClass:\"btn--text-link\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.showCustomProductForm = false}}},[_vm._v(\"Want to search for your\\n product?\")])])])]):_c('div',{staticClass:\"error\"},[_vm._v(\"\\n Sorry, there was a problem getting the products. Please reload the page and try again.\\n \")])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"lds-ring black\"},[_c('div'),_vm._v(\" \"),_c('div'),_vm._v(\" \"),_c('div'),_vm._v(\" \"),_c('div')])}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./ProductFinder.vue?vue&type=template&id=6a3df481&scoped=true&\"\nimport script from \"./ProductFinder.vue?vue&type=script&lang=js&\"\nexport * from \"./ProductFinder.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6a3df481\",\n null\n \n)\n\nexport default component.exports","\n \n \n \n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('node-wrap',{attrs:{\"node\":_vm.node}},[_c('product-chooser',{attrs:{\"node\":_vm.node}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./OrderFinder.vue?vue&type=template&id=85c030ee&scoped=true&\"\nimport script from \"./OrderFinder.vue?vue&type=script&lang=js&\"\nexport * from \"./OrderFinder.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"85c030ee\",\n null\n \n)\n\nexport default component.exports","\n \n
\n
\n
\n \n
Help us find your order.
\n \n
\n \n
\n
\n
\n
\n
Which product are you having a problem with?
\n
Note that you can only choose one product at a time.
\n If you need help with an order that is missing (you did not receive any part of it)\n or that you wish to return entirely please call customer service at: 1.833.563.4387.
\n
\n
\n
\n
\n
![]()
\n
{{ product.name }}
\n SKU: {{ product.id }}\n
\n
\n
\n
\n
\n
\n {{ productIssueQuantities[index] }}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
Find a product |\n \n
\n
Which product are you having a problem with?
\n
\n
\n
\n
\n
\n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"order-finder\"},[(!_vm.showCustomProductForm)?_c('div',{staticClass:\"frow\"},[(_vm.order && !_vm.order.orderNumber)?_c('div',{staticClass:\"frow justify-between\"},[_vm._m(0),_vm._v(\" \"),_c('div',{staticClass:\"node-wrap col-xs-1-1 col-sm-6-12 frow\"},[_c('order-chooser')],1)]):_vm._e(),_vm._v(\" \"),(_vm.order && _vm.order.orderNumber)?_c('div',{staticClass:\"order-result mt-4 w-100\"},[_c('div',{staticClass:\"secondary-highlight\"},[_vm._v(\"Order Number \"+_vm._s(_vm.order.orderNumber)+\"\\n \"),(_vm.trackingNumbers && _vm.trackingNumbers.length > 0)?[_vm._l((_vm.trackingNumbers),function(trackingNumber,index){return [_vm._v(\"\\n | \"),_c('a',{staticClass:\"btn--text-link\",attrs:{\"tabindex\":\"0tabindex\",\"target\":\"_blank\",\"href\":(\"https://www.ups.com/track?loc=en_US&Requester=DAN&tracknum=\" + trackingNumber + \"&AgreeToTermsAndConditions=yes&WT.z_eCTAid=ct1_eml_Tracking__ct1_eml_tra_sb_upg1\")}},[_vm._v(\"\\n Track Package #\"+_vm._s(index + 1))])]})]:_c('span',[_vm._v(\"\\n | Has not shipped yet\\n \")]),_vm._v(\"\\n | \"),_c('button',{staticClass:\"btn--text-link\",on:{\"click\":_vm.removeOrder}},[_vm._v(\"Check a different order\")])],2),_vm._v(\" \"),_c('h2',{staticClass:\"h2 col-md-8-12 mb-40\"},[_vm._v(\"Which product are you having a problem with?\")]),_vm._v(\" \"),_vm._m(1),_vm._v(\" \"),_c('div',{staticClass:\"products col-xs-1-1 col-md-8-12\"},_vm._l((_vm.products),function(product,index){return _c('div',{staticClass:\"frow justify-start pt-2 pb-4 mb-4 product\",class:{active: _vm.selectedProductIndex === index}},[_c('div',{staticClass:\"frow justify-between w-100 px-4 items-center\"},[_c('div',{staticClass:\"frow justify-start items-center col-xs-1-1 col-sm-7-12\"},[_c('img',{staticClass:\"product-image mr-4\",attrs:{\"src\":product.image,\"alt\":product.name}}),_vm._v(\" \"),_c('div',[_c('strong',[_vm._v(_vm._s(product.name))]),_c('br'),_vm._v(\" \"),_c('span',{staticClass:\"sku\"},[_vm._v(\"SKU: \"+_vm._s(product.id))])])]),_vm._v(\" \"),_c('div',{staticClass:\"frow justify-end items-center w-40 col-xs-1-1 col-sm-5-12\"},[_c('div',{staticClass:\"product-counter frow justify-start mr-4\"},[_c('button',{staticClass:\"down col-xs-1-3\",on:{\"click\":function($event){return _vm.dec(index)}}},[_vm._v(\"\\n -\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"counter-value col-xs-1-3\"},[_vm._v(\"\\n \"+_vm._s(_vm.productIssueQuantities[index])+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"up col-xs-1-3\",on:{\"click\":function($event){return _vm.inc(index)}}},[_vm._v(\"\\n +\\n \")])]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn--primary btn--border borderless w-auto px-4\",on:{\"click\":function($event){return _vm.toggleProduct(product, index)}}},[_vm._v(_vm._s(_vm.selectedProductIndex === index ? 'Deselect' : 'Select')+\"\\n \")])])])])}),0),_vm._v(\" \"),_c('div',{staticClass:\"frow justify-end\"},[_c('button',{staticClass:\"btn--text-link\",on:{\"click\":function($event){_vm.showCustomProductForm = true}}},[_vm._v(\"My product isn't listed\\n \")])])]):_vm._e()]):_c('div',{staticClass:\"mt-4\"},[_c('div',{staticClass:\"frow justify-between\"},[_c('div',{staticClass:\"label col-xs-1-1 col-sm-5-12\"},[_c('div',{staticClass:\"secondary-highlight subtitle--line brown\"},[_vm._v(\"Find a product |\\n \"),_c('button',{staticClass:\"btn--text-link\",on:{\"click\":function($event){_vm.showCustomProductForm = false}}},[_vm._v(\"Search for my order\\n \")])]),_vm._v(\" \"),_c('h1',{staticClass:\"h2 mb-0\"},[_vm._v(\"Which product are you having a problem with?\")])]),_vm._v(\" \"),_c('div',{staticClass:\"node-wrap col-xs-1-1 col-sm-6-12 frow\"},[_c('product-chooser',{attrs:{\"node\":_vm.node}})],1)])])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"label col-xs-1-1 col-sm-5-12\"},[_c('label',{staticClass:\"subtitle--line brown\"},[_vm._v(\"Lookup an order\\n \")]),_vm._v(\" \"),_c('h1',{staticClass:\"h2 mb-0\"},[_vm._v(\"Help us find your order.\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('p',{staticClass:\"col-md-8-12\"},[_vm._v(\"Note that you can only choose one product at a time.\"),_c('br'),_vm._v(\"\\n If you need help with an order that is missing (you did not receive any part of it)\\n or that you wish to return entirely please call customer service at: \"),_c('a',{attrs:{\"href\":\"tel:+18335634387\"}},[_vm._v(\"1.833.563.4387\")]),_vm._v(\".\")])}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./PartsMissing.vue?vue&type=template&id=57def934&scoped=true&\"\nimport script from \"./PartsMissing.vue?vue&type=script&lang=js&\"\nexport * from \"./PartsMissing.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"57def934\",\n null\n \n)\n\nexport default component.exports","\n \n
{{ node.label }}
\n
\n
\n
\n
\n
\n
![]()
\n
{{ product.name }}
\n SKU: {{ product.id }}\n
\n
\n
\n
\n
\n
\n
Other: (if your part is not listed above write it in here)
\n \n
\n
\n
\n
\n
\n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('h1',{staticClass:\"h2\"},[_vm._v(_vm._s(_vm.node.label))]),_vm._v(\" \"),_c('div',{staticClass:\"parts\"},[_c('div',{staticClass:\"products col-xs-1-1 col-md-8-12\"},[_vm._l((_vm.parts),function(product,index){return _c('div',{key:product.id,staticClass:\"frow justify-start pt-2 pb-4 mb-4 product\",class:{active: _vm.selectedPartsIndices[index + 1]},attrs:{\"data-index\":index}},[_c('div',{staticClass:\"frow justify-between w-100 px-4 items-center\"},[_c('div',{staticClass:\"frow justify-start items-center product-detail\"},[_c('img',{staticClass:\"product-image mr-4\",attrs:{\"src\":product.image,\"alt\":product.name}}),_vm._v(\" \"),_c('div',{staticClass:\"name\"},[_c('strong',[_vm._v(_vm._s(product.name))]),_c('br'),_vm._v(\" \"),_c('span',{staticClass:\"sku\"},[_vm._v(\"SKU: \"+_vm._s(product.id))])])]),_vm._v(\" \"),_c('button',{ref:(\"option-\" + (index + 1)),refInFor:true,staticClass:\"btn btn--primary btn--border borderless w-auto px-4\",on:{\"click\":function($event){return _vm.handleMissingPart(product, index + 1)}}},[_vm._v(\"\\n \"+_vm._s(_vm.selectedPartsIndices[index + 1] ? \"Deselect\" : \"Select\")+\"\\n \")])])])}),_vm._v(\" \"),_c('div',{staticClass:\"frow justify-start items-center\"},[_c('div',[_c('strong',[_vm._v(\"Other:\")]),_vm._v(\" (if your part is not listed above write it in here)\"),_c('br'),_vm._v(\" \"),_c('input',{ref:\"other-part\",attrs:{\"type\":\"text\"},on:{\"keyup\":function($event){$event.preventDefault();return _vm.handleOtherPart($event)}}})])])],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./copyToClipboard.vue?vue&type=template&id=297ce420&scoped=true&\"\nimport script from \"./copyToClipboard.vue?vue&type=script&lang=js&\"\nexport * from \"./copyToClipboard.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"297ce420\",\n null\n \n)\n\nexport default component.exports","\n \n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.canCopyToClipboard)?_c('button',{staticClass:\"copy-to-clipboard-wrapper\"},[_c('span',{class:{'copy-to-clipboard': _vm.canCopyToClipboard, copied: _vm.clipboardCopied},attrs:{\"title\":_vm.title,\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.copyToClipboard(_vm.clipboardText)}}})]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Submit.vue?vue&type=template&id=7fae93f9&scoped=true&\"\nimport script from \"./Submit.vue?vue&type=script&lang=js&\"\nexport * from \"./Submit.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7fae93f9\",\n null\n \n)\n\nexport default component.exports","\n \n \n
\n
r === 'none')\" class=\"label col-xs-1-1 col-sm-5-12\">\n
{{ node.subtitle }}
\n
Can we help you with anything else today?
\n
Start another product return or shop our products
\n
\n
\n
\n
{{ node.subtitle }}
\n
{{ node.label }}
\n
\n
\n
\n
r === 'none')\" class=\"node-wrap col-xs-1-1 col-sm-6-12 frow\">\n
i.status === 'success' && !i.error)\">\n
\n
\n
\n
![]()
\n
\n {{ issue.product.name }}
\n SKU: {{ issue.product.id || \"N/A\" }}\n
\n
\n
Thank you for sending us your case!
\n
Your case number is {{ issuesResponse[index].caseNumber }}\n \n , and a support agent will be in touch with you soon.
\n
Your Return Authorization Number is: {{ issuesResponse[index].RA }}\n \n
\n
\n
\n
Problem: {{ issue.type }}: {{ issue.subType }}
\n
Solution:
\n
Solution:
\n
\n
0\" >\n Missing Part{{ issue.missingParts.length > 1 ? \"s\" : \"\" }}:
\n \n
![]()
\n
\n {{ part.name }}
\n SKU: {{ part.id || \"N/A\" }}\n
\n
\n \n
\n
\n
\n
\n
\n
\n Sorry there was an error submitting your request.\n
\n
\n You can send the information you just gave us to customer support via email instead.\n
Email Customer Support\n
\n
\n
\n
r === 'none')\" class=\"node-wrap col-xs-1-1 col-sm-6-12 frow\">\n
\n
\n
\n
![]()
\n
\n {{ issue.product.name }}
\n SKU: {{ issue.product.id || \"N/A\" }}\n
\n
\n
Problem: {{ issue.type }}: {{ issue.subType }}
\n
Solution:
\n
\n
0\" >\n Missing Part{{ issue.missingParts.length > 1 ? \"s\" : \"\" }}:
\n \n
![]()
\n
\n {{ part.name }}
\n SKU: {{ part.id || \"N/A\" }}\n
\n
\n \n
\n
\n
\n
\n
\n Hang on while we submit your request.
\n
\n
\n
\n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"summary\"},[_c('div',{staticClass:\"frow justify-between\"},[(_vm.resolvedFlag || _vm.requestedRemedies.every(function (r) { return r === 'none'; }))?_c('div',{staticClass:\"label col-xs-1-1 col-sm-5-12\"},[(_vm.node.subtitle)?_c('p',{staticClass:\"subtitle--line brown\"},[_vm._v(_vm._s(_vm.node.subtitle))]):_vm._e(),_vm._v(\" \"),_c('h1',{staticClass:\"h2 mb-0\"},[_vm._v(\"Can we help you with anything else today?\")]),_vm._v(\" \"),(_vm.node.copy)?_c('p',{staticClass:\"mt-30\"},[_vm._v(\"Start another product return or shop our products\")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"frow inline\"},[_c('a',{staticClass:\"btn btn--black btn--border borderless w-auto px-4\",attrs:{\"href\":\"https://www.lodgecastiron.com/shop\"}},[_vm._v(\"Shop our products\")]),_vm._v(\" \"),_c('button',{staticClass:\"ml-2 btn btn--border btn--arrow btn--primary borderless w-auto\",on:{\"click\":_vm.reload}},[_vm._v(\"Start\\n another return\\n \")])])]):_c('div',{staticClass:\"label col-xs-1-1 col-sm-5-12\"},[(_vm.node.subtitle)?_c('p',{staticClass:\"subtitle--line brown\"},[_vm._v(_vm._s(_vm.node.subtitle))]):_vm._e(),_vm._v(\" \"),_c('h1',{staticClass:\"h2 mb-0\"},[_vm._v(_vm._s(_vm.node.label))]),_vm._v(\" \"),(_vm.node.copy)?_c('p',{staticClass:\"mt-30\",domProps:{\"innerHTML\":_vm._s(_vm.node.copy)}}):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"frow inline\"},[_c('a',{staticClass:\"btn btn--black btn--border borderless w-auto px-4\",attrs:{\"href\":\"https://www.lodgecastiron.com/shop\"}},[_vm._v(\"Shop our products\")]),_vm._v(\" \"),_c('button',{staticClass:\"ml-2 btn btn--border btn--arrow btn--primary borderless w-auto\",on:{\"click\":_vm.reload}},[_vm._v(\"Start\\n another return\\n \")])])]),_vm._v(\" \"),(_vm.issuesResponse && !_vm.resolvedFlag && !_vm.requestedRemedies.every(function (r) { return r === 'none'; }))?_c('div',{staticClass:\"node-wrap col-xs-1-1 col-sm-6-12 frow\"},[(_vm.issuesResponse.every(function (i) { return i.status === 'success' && !i.error; }))?_c('div',_vm._l((_vm.request.issues),function(issue,index){return _c('div',{staticClass:\"frow products\"},[_c('div',{staticClass:\"product frow justify-between w-100 px-4 items-center\"},[_c('div',{staticClass:\"frow justify-start items-center\"},[(issue.product.image)?_c('img',{staticClass:\"product-image mr-4\",attrs:{\"src\":typeof issue.product.image === 'object' ? issue.product.image.url : issue.product.image,\"alt\":issue.product.image.alt || (\"Image of \" + (issue.product.name))}}):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"product-detail\"},[_c('strong',[_vm._v(_vm._s(issue.product.name))]),_c('br'),_vm._v(\" \"),_c('span',{staticClass:\"sku\"},[_vm._v(\"SKU: \"+_vm._s(issue.product.id || \"N/A\"))])]),_vm._v(\" \"),(_vm.issuesResponse[index] && _vm.issuesResponse[index]['caseStatus'] !== 'Resolved')?_c('div',{staticClass:\"mt-4\"},[_c('p',[_vm._v(\"Thank you for sending us your case!\")]),_vm._v(\" \"),_c('p',[_vm._v(\"Your case number is \"),_c('strong',[_vm._v(_vm._s(_vm.issuesResponse[index].caseNumber))]),_vm._v(\" \"),_c('copy-to-clipboard',{attrs:{\"clipboard-text\":_vm.issuesResponse[index].caseNumber,\"title\":\"click to copy the case number\"}}),_vm._v(\", and a support agent will be in touch with you soon. \")],1),_vm._v(\" \"),(_vm.issuesResponse[index].RA)?_c('p',[_vm._v(\"Your Return Authorization Number is: \"),_c('strong',[_vm._v(_vm._s(_vm.issuesResponse[index].RA))]),_vm._v(\" \"),_c('copy-to-clipboard',{attrs:{\"clipboard-text\":_vm.issuesResponse[index].RA,\"title\":\"click to copy the RA number\"}})],1):_vm._e()]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"w-100\"},[_c('p',[_c('strong',[_vm._v(\"Problem:\")]),_vm._v(\" \"+_vm._s(issue.type)+\": \"+_vm._s(issue.subType))]),_vm._v(\" \"),(_vm.issuesResponse[index].RA && issue.raResponse)?_c('p',[_c('strong',[_vm._v(\"Solution:\")]),_vm._v(\" \"),_c('span',{domProps:{\"innerHTML\":_vm._s(issue.raResponse)}})]):(issue.response && issue.hasResponse)?_c('p',[_c('strong',[_vm._v(\"Solution:\")]),_vm._v(\" \"),_c('span',{domProps:{\"innerHTML\":_vm._s(issue.response)}})]):_vm._e()]),_vm._v(\" \"),(issue.missingParts.length > 0)?[_c('div',{staticClass:\"w-100 mr-2\"},[_c('strong',[_vm._v(\"Missing Part\"+_vm._s(issue.missingParts.length > 1 ? \"s\" : \"\")+\":\")])]),_vm._v(\" \"),_vm._l((issue.missingParts),function(part){return _c('div',{staticClass:\"w-100 frow justify-start items-center\"},[(part.image)?_c('img',{staticClass:\"product-image mr-4\",attrs:{\"src\":typeof part.image === 'object' ? part.image.url : part.image,\"alt\":part.image.alt || (\"Image of \" + (part.name))}}):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"product-detail\"},[_c('strong',[_vm._v(_vm._s(part.name))]),_c('br'),_vm._v(\" \"),(part.id)?_c('span',{staticClass:\"sku\"},[_vm._v(\"SKU: \"+_vm._s(part.id || \"N/A\"))]):_vm._e()])])})]:_vm._e()],2)])])}),0):_c('div',[_c('div',{staticClass:\"error\"},[_vm._v(\"\\n Sorry there was an error submitting your request.\\n \")]),_vm._v(\" \"),_c('div',[_vm._v(\"\\n You can send the information you just gave us to customer support via email instead.\\n \"),_c('a',{staticClass:\"btn btn--primary w-auto p-4 mt-2\",attrs:{\"href\":(\"mailto:info@lodgecastiron.com?subject=Product%20Issue&body=\" + _vm.emailFormattedRequest),\"target\":\"_blank\"}},[_vm._v(\"Email Customer Support\")])])])]):(_vm.requestedRemedies.every(function (r) { return r === 'none'; }))?_c('div',{staticClass:\"node-wrap col-xs-1-1 col-sm-6-12 frow\"},_vm._l((_vm.request.issues),function(issue,index){return _c('div',{staticClass:\"frow products\"},[_c('div',{staticClass:\"product frow justify-between w-100 px-4 items-center\"},[_c('div',{staticClass:\"frow justify-start items-center\"},[(issue.product.image)?_c('img',{staticClass:\"product-image mr-4\",attrs:{\"src\":typeof issue.product.image === 'object' ? issue.product.image.url : issue.product.image,\"alt\":issue.product.image.alt || (\"Image of \" + (issue.product.name))}}):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"product-detail\"},[_c('strong',[_vm._v(_vm._s(issue.product.name))]),_c('br'),_vm._v(\" \"),_c('span',{staticClass:\"sku\"},[_vm._v(\"SKU: \"+_vm._s(issue.product.id || \"N/A\"))])]),_vm._v(\" \"),_c('div',{staticClass:\"w-100\"},[_c('p',[_c('strong',[_vm._v(\"Problem:\")]),_vm._v(\" \"+_vm._s(issue.type)+\": \"+_vm._s(issue.subType))]),_vm._v(\" \"),(issue.response && issue.hasResponse)?_c('p',[_c('strong',[_vm._v(\"Solution:\")]),_vm._v(\" \"),_c('span',{domProps:{\"innerHTML\":_vm._s(issue.response)}})]):_vm._e()]),_vm._v(\" \"),(issue.missingParts.length > 0)?[_c('div',{staticClass:\"w-100 mr-2\"},[_c('strong',[_vm._v(\"Missing Part\"+_vm._s(issue.missingParts.length > 1 ? \"s\" : \"\")+\":\")])]),_vm._v(\" \"),_vm._l((issue.missingParts),function(part){return _c('div',{staticClass:\"w-100 frow justify-start items-center\"},[(part.image)?_c('img',{staticClass:\"product-image mr-4\",attrs:{\"src\":typeof part.image === 'object' ? part.image.url : part.image,\"alt\":part.image.alt || (\"Image of \" + (part.name))}}):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"product-detail\"},[_c('strong',[_vm._v(_vm._s(part.name))]),_c('br'),_vm._v(\" \"),(part.id)?_c('span',{staticClass:\"sku\"},[_vm._v(\"SKU: \"+_vm._s(part.id || \"N/A\"))]):_vm._e()])])})]:_vm._e()],2)])])}),0):(!_vm.resolvedFlag)?_c('div',{staticClass:\"node-wrap col-xs-1-1 col-sm-6-12 frow centered\"},[_vm._v(\"\\n Hang on while we submit your request. \"),_vm._m(0)]):_vm._e()])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"lds-ring black\"},[_c('div'),_c('div'),_c('div'),_c('div')])}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./End.vue?vue&type=template&id=6c88da68&scoped=true&\"\nimport script from \"./End.vue?vue&type=script&lang=js&\"\nexport * from \"./End.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6c88da68\",\n null\n \n)\n\nexport default component.exports","\n \n
\n
Done
\n
Glad we could help!
\n
more info...
\n
\n
\n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _vm._m(0)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"frow column-center\"},[_c('h4',[_vm._v(\"Done\")]),_vm._v(\" \"),_c('p',[_vm._v(\"Glad we could help!\")]),_vm._v(\" \"),_c('p',[_vm._v(\"more info...\")])])])}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./ProductHelp.vue?vue&type=template&id=658be61e&scoped=true&\"\nimport script from \"./ProductHelp.vue?vue&type=script&lang=js&\"\nexport * from \"./ProductHelp.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"658be61e\",\n null\n \n)\n\nexport default component.exports","\n \n
\n
\n
\n
\n {{ key }} : {{ answer.value || answer.id || answer }}\n
\n
\n
0 && currentStep !== 'submit'\"\n class=\"current-cases frow column-start mb-4 summary\">\n
Cases you have created so far:
\n
\n
Problem: {{ issue.subType }}
\n
\n
\n
\n {{ issue.product.id }}\n
{{ issue.product.name }}\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"product-help\"}},[_c('div',{staticClass:\"frow centered frow-container\",attrs:{\"id\":\"product-help-wrapper\"}},[_c('div',{staticClass:\"col-xs-12 col-sm-10-12 col-md-11-12\"},[(_vm.answers && _vm.debug)?_c('div',{staticClass:\"current-cases frow column-start mb-4 summary\"},_vm._l((_vm.answers),function(answer,key){return _c('div',[_vm._v(\"\\n \"+_vm._s(key)+\" : \"+_vm._s(answer.value || answer.id || answer)+\"\\n \")])}),0):_vm._e(),_vm._v(\" \"),(_vm.prevIssues.length > 0 && _vm.currentStep !== 'submit')?_c('div',{staticClass:\"current-cases frow column-start mb-4 summary\"},[_c('p',[_vm._v(\"Cases you have created so far:\")]),_vm._v(\" \"),_vm._l((_vm.prevIssues),function(issue){return _c('div',{staticClass:\"frow column-start\"},[_c('div',[_c('strong',[_vm._v(\"Problem:\")]),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(issue.subType))])]),_vm._v(\" \"),_c('div',{staticClass:\"frow row-start product mb-3\"},[_c('div',[_c('img',{attrs:{\"src\":issue.product.image.url || issue.product.image,\"alt\":issue.product.image.alt || issue.product.name}})]),_vm._v(\" \"),_c('div',{staticClass:\"detail\"},[_c('strong',[_vm._v(_vm._s(issue.product.id))]),_vm._v(\" \"),_c('br'),_vm._v(_vm._s(issue.product.name)+\"\\n \")])])])})],2):_vm._e(),_vm._v(\" \"),_c('div',{class:{replaying: _vm.replaying}},[_c('form',{staticClass:\"product-help-form\",attrs:{\"action\":\"#\",\"method\":\"get\",\"id\":\"product-help-form\",\"accept-charset\":\"UTF-8\"},on:{\"submit\":function($event){$event.preventDefault();}}},[_c('div',[_c('transition',{attrs:{\"name\":\"fade\",\"mode\":\"out-in\"}},[_c(_vm.dataModel.nodes[_vm.currentStep].type,{tag:\"component\",attrs:{\"step\":_vm.currentStep,\"node\":_vm.dataModel.nodes[_vm.currentStep]}})],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"frow justify-end\"},[_c('div',{staticClass:\"col-xs-6-12 button-wrapper frow justify-end\"},[(_vm.currentStep !== 'submit')?[(_vm.selectedConcernHasResponse)?_c('div',{staticClass:\"col-xs-1-1 frow justify-end mb-4\"},[_c('button',{ref:\"next\",staticClass:\"btn--text-link\",attrs:{\"disabled\":!_vm.nextStep},on:{\"click\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.setIssueUnsolved($event)}}},[_vm._v(\"Still Need Help?\\n \")])]):_vm._e(),_vm._v(\" \"),_c('div',{},[_c('button',{ref:\"back\",staticClass:\"btn btn--border btn--primary borderless back\",attrs:{\"disabled\":_vm.path.length < 3},on:{\"click\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.goToPreviousStep($event)}}},[_vm._v(\"\\n Back\\n \")])]),_vm._v(\" \"),_c('div',{},[(_vm.selectedConcernHasResponse)?_c('button',{ref:\"done\",staticClass:\"btn btn--border btn--arrow btn--primary borderless done mr-4\",on:{\"click\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.setIssueSolved($event)}}},[_vm._v(\"Issue Solved\\n \")]):_c('button',{ref:\"next\",staticClass:\"btn btn--border btn--arrow btn--primary borderless next\",attrs:{\"disabled\":!_vm.nextStep},on:{\"click\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.goToNextStep($event)}}},[_vm._v(\"Next\\n \")])])]:_vm._e()],2)])])])])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./CartIcon.vue?vue&type=template&id=a516a196&scoped=true&\"\nimport script from \"./CartIcon.vue?vue&type=script&lang=js&\"\nexport * from \"./CartIcon.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"a516a196\",\n null\n \n)\n\nexport default component.exports","\n \n\n\n\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"menu-icon salesforce-cart icon-cart\",attrs:{\"role\":\"button\",\"tabindex\":\"0\",\"title\":\"Your Cart\"},on:{\"click\":_vm.openMenu}},[(_vm.cartNumber || _vm.sfraCartNumber)?_c('span',{staticClass:\"salesforce-cart-qty\"},[_vm._v(_vm._s(_vm.sfraCartNumber || _vm.cartNumber))]):_vm._e(),_vm._v(\" \"),_c('span',{staticClass:\"sr-only\"},[_vm._v(\"Your Cart\")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import regeneratorRuntime from \"regenerator-runtime\";\nimport \"objectFitPolyfill\";\nimport Vue from \"vue\";\nimport { store } from \"./vue/store\";\nimport { accountModule } from \"../lodge-vue/src/store/account\";\nimport { initSentry } from \"./utils\";\nimport lazysizes from \"lazysizes\";\nimport userClassifier, { CLASSIFIER_TYPES } from \"../js/classifier\";\nimport { stripMoneySign } from \"../js/classifier/classifierUtils\";\n\ninitSentry(Vue);\nlazysizes.cfg.customMedia = {\n\textra_small: \"\",\n\tsmall: \"all and (min-width: 480px)\",\n\tmedium: \"all and (min-width: 768px)\",\n\twide: \"all and (min-width: 992px)\",\n\textra_wide: \"all and (min-width: 1200px)\",\n};\nimport \"./search.js\";\n\nimport QuizApp from \"./vue/components/Quiz\";\nimport {\n\tsfraMutationObserverForPaypal,\n\tsfraQuickAddCartEvents,\n\tsfraRemoveFromCartEvents,\n\tsfraUpdateCartQuantity,\n} from \"./analytics\";\n\nimport BookmarkApp from \"./vue/components/Bookmark\";\nimport \"../templates/main-menu\";\nimport { qs, qsa } from \"./utils\";\nimport WizardApp from \"./vue/components/Wizard\";\nimport ProductHelpApp from \"./vue/components/ProductHelp\";\nimport CartIcon from './vue/components/CartIcon';\nVue.config.ignoredElements = [\"stream\"];\n\nVue.component(\"Quiz\", QuizApp);\nVue.component(\"Bookmark\", BookmarkApp);\nVue.component(\"Wizard\", WizardApp);\nVue.component(\"ProductHelp\", ProductHelpApp);\nVue.component(\"CartIcon\", CartIcon);\n\nasync function init() {\n\ttry {\n\t\tawait accountModule.initAccount();\n\t\tlet vueComponents = [...document.querySelectorAll(\".vue-component\")];\n\t\tvueComponents.forEach((c) => {\n\t\t\tnew Vue({\n\t\t\t\tel: c,\n\t\t\t\tstore,\n\t\t\t});\n\t\t});\n\t} catch (_) {\n\t\tconsole.log(\"failed to init the account\");\n\t}\n}\n\n// init the account so that removing recipe bookmarks will work\nlet initPromise = init();\n\nif (window.location.pathname === \"/cart\") {\n\tsfraMutationObserverForPaypal();\n\tsfraQuickAddCartEvents();\n\tsfraRemoveFromCartEvents();\n\tsfraUpdateCartQuantity();\n}\n\nif (window.location.pathname === \"/checkout\") {\n\t// this event is fired by salesforce checkout js\n\t// when place order has succeeded and before page redirects\n\tconsole.log(\"setting up account reset\");\n\twindow.resetShopSiteAccount = accountModule.resetAccount;\n}\n\n// const cartIcon = document.querySelector(\".salesforce-cart\");\n// cartIcon &&\n// \tcartIcon.addEventListener(\"click\", (e) => {\n// \t\twindow.location.href = \"/cart\";\n// \t});\n\n// Handles all of the classifier functionality\nuserClassifier.addDataPoint({\n\ttype: CLASSIFIER_TYPES.PAGE_VIEW,\n\tdata: {\n\t\tpath: location.pathname,\n\t\tqueryString: location.search,\n\t},\n});\nif (window.sfcc && window.sfcc.order) {\n\tconst { order } = window.sfcc;\n\tuserClassifier.addDataPoint({\n\t\ttype: CLASSIFIER_TYPES.ECOM_PURCHASE,\n\t\tdata: {\n\t\t\tunits: order.itemsTotalQuantity,\n\t\t\tprice: stripMoneySign(order.totals.grandTotal),\n\t\t},\n\t});\n}\n\n// add 'shown' class to SF cart level promo header\nif (qs(\".promo--top\")) {\n\t[...qsa(\".promo--top p\")].forEach((el) => el.classList.add(\"shown\"));\n}"],"names":["Hub","client","scope","_version","this","_stack","push","prototype","_invokeClient","method","_a","args","_i","arguments","length","top","getStackTop","apply","isOlderThan","version","bindClient","pushScope","stack","getStack","parentScope","undefined","getClient","popScope","pop","withScope","callback","getScope","captureException","exception","hint","eventId","_lastEventId","finalHint","syntheticException","Error","originalException","event_id","captureMessage","message","level","captureEvent","event","lastEventId","addBreadcrumb","breadcrumb","getOptions","_b","beforeBreadcrumb","_c","maxBreadcrumbs","timestamp","mergedBreadcrumb","finalBreadcrumb","Math","min","setUser","user","setTags","tags","setExtras","extras","setTag","key","value","setExtra","extra","setContext","name","context","configureScope","run","oldHub","makeMain","getIntegration","integration","_oO","id","startSpan","spanOrSpanContext","forceNoChild","_callExtensionMethod","traceHeaders","carrier","getMainCarrier","sentry","__SENTRY__","extensions","hub","registry","getHubFromCarrier","setHubOnCarrier","getCurrentHub","hasHubOnCarrier","activeDomain","module","active","registryHubTopStack","_Oo","getHubFromActiveDomain","Scope","_notifyingListeners","_scopeListeners","_eventProcessors","_breadcrumbs","_user","_tags","_extra","_context","addScopeListener","addEventProcessor","_notifyScopeListeners","_this","setTimeout","forEach","_notifyEventProcessors","processors","index","resolve","reject","processor","result","then","final","setFingerprint","fingerprint","_fingerprint","setLevel","_level","setTransaction","transaction","_transaction","_span","setSpan","span","getSpan","clone","newScope","clear","slice","clearBreadcrumbs","_applyFingerprint","Array","isArray","concat","applyToEvent","Object","keys","contexts","breadcrumbs","getGlobalEventProcessors","global","globalEventProcessors","addGlobalEventProcessor","isError","wat","toString","call","isInstanceOf","isErrorEvent","isDOMError","isDOMException","isString","isPrimitive","isPlainObject","isEvent","Event","isElement","Element","isRegExp","isThenable","Boolean","isSyntheticEvent","base","_e","PREFIX","Logger","_enabled","disable","enable","log","console","join","warn","error","logger","dynamicRequire","mod","request","require","isNodeEnv","process","fallbackGlobalObject","getGlobalObject","g","window","self","uuid4","crypto","msCrypto","getRandomValues","arr","Uint16Array","pad","num","v","replace","c","r","random","parseUrl","url","match","query","fragment","host","path","protocol","relative","getEventDescription","values","type","consoleSandbox","originalConsole","wrappedLevels","__sentry_original__","addExceptionTypeValue","addExceptionMechanism","mechanism","getLocationHref","document","location","href","oO","htmlTreeAsString","elem","currentElem","out","height","len","sepLength","nextStr","_htmlElementAsString","parentNode","reverse","el","className","classes","attr","i","tagName","toLowerCase","split","attrWhitelist","getAttribute","timestampWithMs","Date","now","parseRetryAfterHeader","header","headerDelay","parseInt","isNaN","headerDate","parse","defaultFunctionName","getFunctionName","fn","e","States","SyncPromise","executor","_state","PENDING","_handlers","_resolve","_setResult","RESOLVED","_reject","reason","REJECTED","state","_value","_executeHandlers","_attachHandler","handler","onrejected","onfulfilled","_","all","collection","counter","resolvedCollection","item","TypeError","catch","val","finally","onfinally","isRejected","exports","utils","settle","buildURL","buildFullPath","parseHeaders","isURLSameOrigin","createError","config","Promise","requestData","data","requestHeaders","headers","isFormData","XMLHttpRequest","auth","username","password","Authorization","btoa","fullPath","baseURL","open","toUpperCase","params","paramsSerializer","timeout","onreadystatechange","readyState","status","responseURL","indexOf","responseHeaders","getAllResponseHeaders","response","responseType","responseText","statusText","onabort","onerror","ontimeout","timeoutErrorMessage","isStandardBrowserEnv","cookies","xsrfValue","withCredentials","xsrfCookieName","read","xsrfHeaderName","setRequestHeader","isUndefined","onDownloadProgress","addEventListener","onUploadProgress","upload","cancelToken","promise","cancel","abort","send","bind","Axios","mergeConfig","createInstance","defaultConfig","instance","extend","axios","create","instanceConfig","defaults","Cancel","CancelToken","isCancel","promises","spread","default","__CANCEL__","resolvePromise","token","throwIfRequested","source","InterceptorManager","dispatchRequest","interceptors","chain","interceptor","unshift","fulfilled","rejected","shift","getUri","merge","handlers","use","eject","h","isAbsoluteURL","combineURLs","requestedURL","enhanceError","code","transformData","throwIfCancellationRequested","transformRequest","common","adapter","transformResponse","isAxiosError","toJSON","description","number","fileName","lineNumber","columnNumber","config1","config2","valueFromConfig2Keys","mergeDeepPropertiesKeys","defaultToConfig2Keys","prop","isObject","deepMerge","axiosKeys","otherKeys","filter","validateStatus","fns","normalizeHeaderName","DEFAULT_CONTENT_TYPE","setContentTypeIfUnset","isArrayBuffer","isBuffer","isStream","isFile","isBlob","isArrayBufferView","buffer","isURLSearchParams","JSON","stringify","maxContentLength","thisArg","encode","encodeURIComponent","serializedParams","parts","isDate","toISOString","hashmarkIndex","relativeURL","write","expires","domain","secure","cookie","isNumber","toGMTString","RegExp","decodeURIComponent","remove","test","originURL","msie","navigator","userAgent","urlParsingNode","createElement","resolveURL","setAttribute","search","hash","hostname","port","pathname","charAt","requestURL","parsed","normalizedName","ignoreDuplicateOf","line","trim","substr","isFunction","obj","l","hasOwnProperty","constructor","FormData","ArrayBuffer","isView","pipe","URLSearchParams","product","assignValue","a","b","str","t","n","m","d","o","defineProperty","enumerable","get","Symbol","toStringTag","__esModule","p","s","17","getFirstMatch","getSecondMatch","matchAndReturnConst","getWindowsVersionName","getAndroidVersionName","splice","map","getVersionPrecision","compareVersions","max","u","getBrowserAlias","BROWSER_ALIASES_MAP","getBrowserTypeByAlias","BROWSER_MAP","18","ENGINE_MAP","OS_MAP","PLATFORMS_MAP","Bada","BlackBerry","Chrome","Chromium","Epiphany","Firefox","Focus","Generic","Googlebot","Maxthon","Opera","PhantomJS","Puffin","QupZilla","Safari","Sailfish","SeaMonkey","Sleipnir","Swing","Tizen","Vivaldi","WeChat","Roku","amazon_silk","android","bada","blackberry","chrome","chromium","epiphany","firefox","focus","generic","googlebot","ie","k_meleon","maxthon","edge","mz","naver","opera","opera_coast","phantomjs","puffin","qupzilla","safari","sailfish","samsung_internet","seamonkey","sleipnir","swing","tizen","uc","vivaldi","webos","wechat","yandex","tablet","mobile","desktop","tv","WindowsPhone","Windows","MacOS","iOS","Android","WebOS","Linux","ChromeOS","PlayStation4","EdgeHTML","Blink","Trident","Presto","Gecko","WebKit","90","configurable","writable","getParser","getResult","91","_ua","parsedResult","getUA","parseBrowser","browser","find","some","describe","getBrowser","getBrowserName","String","getBrowserVersion","getOS","os","parseOS","getOSName","getOSVersion","getPlatform","platform","parsePlatform","getPlatformType","getEngine","engine","parseEngine","getEngineName","assign","satisfies","isOS","isPlatform","f","isBrowser","compareVersion","isEngine","is","92","93","versionName","94","vendor","model","Number","95","options","opt","pairs","pairSplitRegExp","dec","decode","pair","eq_idx","tryDecode","enc","fieldContentRegExp","maxAge","floor","toUTCString","httpOnly","sameSite","isCallable","tryToString","argument","S","unicode","toIndexedObject","toAbsoluteIndex","lengthOfArrayLike","createMethod","IS_INCLUDES","$this","fromIndex","O","includes","uncurryThis","stringSlice","it","TO_STRING_TAG_SUPPORT","classofRaw","TO_STRING_TAG","wellKnownSymbol","CORRECT_ARGUMENTS","tag","tryGet","callee","hasOwn","ownKeys","getOwnPropertyDescriptorModule","definePropertyModule","target","exceptions","getOwnPropertyDescriptor","DESCRIPTORS","createPropertyDescriptor","object","bitmap","fails","EXISTS","getBuiltIn","Deno","versions","v8","createNonEnumerableProperty","redefine","setGlobal","copyConstructorProperties","isForced","targetProperty","sourceProperty","descriptor","TARGET","GLOBAL","STATIC","stat","noTargetGet","forced","sham","exec","regexpExec","SPECIES","RegExpPrototype","KEY","FORCED","SHAM","SYMBOL","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","re","flags","uncurriedNativeRegExpMethod","methods","nativeMethod","regexp","arg2","forceStringMethod","uncurriedNativeMethod","$exec","done","NATIVE_BIND","FunctionPrototype","Function","Reflect","getDescriptor","PROPER","CONFIGURABLE","aFunction","namespace","aCallable","V","P","func","toObject","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","matched","position","captures","namedCaptures","replacement","tailPos","symbols","ch","capture","check","globalThis","classof","propertyIsEnumerable","store","functionToString","inspectSource","set","has","NATIVE_WEAK_MAP","shared","sharedKey","hiddenKeys","OBJECT_ALREADY_INITIALIZED","WeakMap","wmget","wmhas","wmset","metadata","facade","STATE","enforce","getterFor","TYPE","feature","detection","normalize","POLYFILL","NATIVE","string","isPrototypeOf","USE_SYMBOL_AS_UID","$Symbol","toLength","V8_VERSION","getOwnPropertySymbols","symbol","activeXDocument","anObject","definePropertiesModule","enumBugKeys","html","documentCreateElement","IE_PROTO","EmptyConstructor","scriptTag","content","LT","NullProtoObjectViaActiveX","close","temp","parentWindow","NullProtoObject","ActiveXObject","iframeDocument","iframe","style","display","appendChild","src","contentWindow","F","Properties","V8_PROTOTYPE_DEFINE_BUG","objectKeys","defineProperties","props","IE8_DOM_DEFINE","toPropertyKey","$defineProperty","$getOwnPropertyDescriptor","ENUMERABLE","WRITABLE","Attributes","current","propertyIsEnumerableModule","internalObjectKeys","getOwnPropertyNames","names","$propertyIsEnumerable","NASHORN_BUG","1","input","pref","valueOf","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","InternalStateModule","CONFIGURABLE_FUNCTION_NAME","getInternalState","enforceInternalState","TEMPLATE","unsafe","simple","R","re1","re2","regexpFlags","stickyHelpers","UNSUPPORTED_DOT_ALL","UNSUPPORTED_NCG","nativeReplace","nativeExec","patchedExec","UPDATES_LAST_INDEX_WRONG","lastIndex","UNSUPPORTED_Y","BROKEN_CARET","NPCG_INCLUDED","reCopy","group","raw","groups","sticky","charsAdded","strCopy","multiline","that","ignoreCase","dotAll","$RegExp","MISSED_STICKY","uid","SHARED","IS_PURE","mode","copyright","license","toIntegerOrInfinity","requireObjectCoercible","charCodeAt","CONVERT_TO_STRING","pos","first","second","size","codeAt","integer","IndexedObject","ceil","isSymbol","getMethod","ordinaryToPrimitive","TO_PRIMITIVE","exoticToPrim","toPrimitive","postfix","NATIVE_SYMBOL","iterator","WellKnownSymbolsStore","symbolFor","createWellKnownSymbol","withoutSetter","$","proto","fixRegExpWellKnownSymbolLogic","advanceStringIndex","getSubstitution","regExpExec","REPLACE","stringIndexOf","REPLACE_KEEPS_$0","REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE","maybeCallNative","UNSAFE_SUBSTITUTE","searchValue","replaceValue","replacer","rx","res","functionalReplace","fullUnicode","results","accumulatedResult","nextSourcePosition","j","replacerArgs","factory","lazySizes","lazysizes","lazySizesCfg","lazySizesDefaults","lazyClass","loadedClass","loadingClass","preloadClass","errorClass","autosizesClass","fastLoadedClass","iframeLoadMode","srcAttr","srcsetAttr","sizesAttr","minSize","customMedia","init","expFactor","hFac","loadMode","loadHidden","ricTimeout","throttleDelay","lazySizesConfig","lazysizesConfig","getElementsByClassName","cfg","noSupport","docElem","documentElement","supportPicture","HTMLPictureElement","_addEventListener","_getAttribute","requestAnimationFrame","requestIdleCallback","regPicture","loadEvents","regClassCache","hasClass","ele","cls","addClass","removeClass","reg","addRemoveLoadEvents","dom","add","action","evt","triggerEvent","detail","noBubbles","noCancelable","createEvent","initEvent","dispatchEvent","updatePolyfill","full","polyfill","picturefill","pf","reevaluate","elements","getCSS","getComputedStyle","getWidth","parent","width","offsetWidth","_lazysizesWidth","rAF","firstFns","secondFns","runFns","running","waiting","rafBatch","queue","hidden","_lsFlush","rAFIt","throttle","lastTime","gDelay","rICTimeout","idleCallback","isPriority","delay","debounce","wait","later","last","loader","regImg","regIframe","supportScroll","shrinkExpand","currentExpand","isLoading","lowRuns","resetPreloading","isVisible","isBodyHidden","body","isNestedVisible","elemExpand","outerRect","visible","eLtop","eLbottom","eLleft","eLright","offsetParent","getBoundingClientRect","left","right","bottom","checkElements","eLlen","rect","autoLoadElem","loadedSomething","elemNegativeExpand","elemExpandVal","beforeExpandVal","defaultExpand","preloadExpand","lazyloadElems","_lazyRace","prematureUnveil","unveilElement","expand","clientHeight","clientWidth","_defEx","eLvW","innerWidth","elvH","innerHeight","isCompleted","preloadElems","preloadAfterLoad","throttledCheckElements","switchLoadingClass","_lazyCache","rafSwitchLoadingClass","rafedSwitchLoadingClass","changeIframeSrc","handleSources","sourceSrcset","lazyUnveil","isAuto","sizes","isImg","srcset","isPicture","firesLoad","defaultPrevented","nodeName","clearTimeout","resetPreloadingTimer","getElementsByTagName","isLoaded","complete","naturalWidth","loading","autoSizer","updateElem","afterScroll","altLoadmodeScrollListner","onload","started","persisted","loadingElements","querySelectorAll","img","MutationObserver","observe","childList","subtree","attributes","setInterval","checkElems","unveil","_aLSL","sizeElement","sources","dataAttr","getSizeElement","debouncedUpdateElementsSizes","autosizesElems","uP","aC","rC","hC","fire","gW","propIsEnumerable","test1","test2","fromCharCode","test3","letter","err","shouldUseNative","from","to","dataset","objectFit","objectPosition","getPropertyValue","overflow","marginTop","marginLeft","objectFitPolyfill","extendStatics","setPrototypeOf","__proto__","__extends","__","__assign","__decorate","decorators","desc","decorate","__awaiter","_arguments","generator","step","next","__generator","y","label","sent","trys","ops","verb","op","__values","__read","ar","__spread","hasDocumentCookie","isJsDom","readCookie","cleanValue","cleanupCookieValue","doNotParse","isParsingCookie","objectAssign","Cookies","changeListeners","HAS_DOCUMENT_COOKIE","parseCookies","_updateBrowserValues","_emitChange","getAll","name_1","finalOptions","addChangeListener","removeChangeListener","idx","emptyObject","freeze","isUndef","isDef","isTrue","isFalse","_toString","toRawType","isValidArrayIndex","parseFloat","isFinite","isPromise","toNumber","makeMap","expectsLowerCase","list","isBuiltInTag","isReservedAttribute","cached","cache","camelizeRE","camelize","capitalize","hyphenateRE","hyphenate","polyfillBind","ctx","boundFn","_length","nativeBind","toArray","start","ret","_from","noop","no","identity","genStaticKeys","modules","reduce","staticKeys","looseEqual","isObjectA","isObjectB","isArrayA","isArrayB","every","getTime","keysA","keysB","looseIndexOf","once","called","SSR_ATTR","ASSET_TYPES","LIFECYCLE_HOOKS","optionMergeStrategies","silent","productionTip","devtools","performance","errorHandler","warnHandler","ignoredElements","keyCodes","isReservedTag","isReservedAttr","isUnknownElement","getTagNamespace","parsePlatformTagName","mustUseProp","async","_lifecycleHooks","unicodeRegExp","isReserved","def","bailRE","parsePath","segments","_isServer","hasProto","inBrowser","inWeex","WXEnvironment","weexPlatform","UA","isIE","isIE9","isEdge","isIOS","isFF","nativeWatch","watch","supportsPassive","opts","isServerRendering","env","VUE_ENV","__VUE_DEVTOOLS_GLOBAL_HOOK__","isNative","Ctor","_Set","hasSymbol","Set","tip","generateComponentTrace","formatComponentName","hasConsole","classifyRE","classify","msg","vm","trace","includeFile","$root","cid","_isVue","$options","_componentTag","file","__file","repeat","$parent","tree","currentRecursiveSequence","Dep","subs","addSub","sub","removeSub","depend","addDep","notify","sort","update","targetStack","pushTarget","popTarget","VNode","children","text","elm","componentOptions","asyncFactory","ns","fnContext","fnOptions","fnScopeId","componentInstance","isStatic","isRootInsert","isComment","isCloned","isOnce","asyncMeta","isAsyncPlaceholder","prototypeAccessors","child","createEmptyVNode","node","createTextVNode","cloneVNode","vnode","cloned","arrayProto","arrayMethods","original","inserted","ob","__ob__","observeArray","dep","arrayKeys","shouldObserve","toggleObserving","Observer","vmCount","protoAugment","copyAugment","walk","asRootData","isExtensible","defineReactive$$1","customSetter","shallow","property","getter","setter","childOb","dependArray","newVal","del","items","strats","mergeData","toVal","fromVal","mergeDataOrFn","parentVal","childVal","instanceData","defaultData","mergeHook","dedupeHooks","hooks","mergeAssets","assertObjectType","propsData","defaultStrat","hook","key$1","inject","computed","provide","checkComponents","components","validateComponentName","normalizeProps","normalizeInject","normalized","normalizeDirectives","dirs","directives","def$$1","mergeOptions","_base","extends","mixins","mergeField","strat","resolveAsset","warnMissing","assets","camelizedId","PascalCaseId","validateProp","propOptions","absent","booleanIndex","getTypeIndex","stringIndex","getPropDefaultValue","prevShouldObserve","assertProp","_props","getType","required","valid","expectedTypes","assertedType","assertType","expectedType","validator","getInvalidTypeMessage","simpleCheckRE","isSameType","receivedType","expectedValue","styleValue","receivedValue","isExplicable","isBoolean","handleError","info","cur","errorCaptured","globalHandleError","invokeWithErrorHandling","_handled","logError","timerFunc","mark","measure","isUsingMicroTask","callbacks","pending","flushCallbacks","copies","setImmediate","observer","textNode","createTextNode","characterData","nextTick","cb","initProxy","perf","clearMarks","clearMeasures","startTag","endTag","allowedGlobals","warnNonPresent","warnReservedPrefix","hasProxy","Proxy","isBuiltInModifier","hasHandler","isAllowed","$data","getHandler","render","_withStripped","_renderProxy","seenObjects","traverse","_traverse","seen","isA","isFrozen","depId","normalizeEvent","passive","once$$1","createFnInvoker","invoker","arguments$1","updateListeners","on","oldOn","remove$$1","createOnceHandler","old","mergeVNodeHook","hookKey","oldHook","wrappedHook","merged","extractPropsFromVNodeData","attrs","altKey","keyInLowerCase","checkProp","preserve","simpleNormalizeChildren","normalizeChildren","normalizeArrayChildren","isTextNode","nestedIndex","_isVList","initProvide","_provided","initInjections","resolveInject","provideKey","provideDefault","resolveSlots","slots","slot","name$1","isWhitespace","normalizeScopedSlots","normalSlots","prevSlots","hasNormalSlots","isStable","$stable","$key","_normalized","$hasNormal","normalizeScopedSlot","key$2","proxyNormalSlot","proxy","renderList","renderSlot","fallback","bindObject","nodes","scopedSlotFn","$scopedSlots","$slots","$createElement","resolveFilter","isKeyNotMatch","expect","actual","checkKeyCodes","eventKeyCode","builtInKeyCode","eventKeyName","builtInKeyName","mappedKeyCode","bindObjectProps","asProp","isSync","loop","domProps","camelizedKey","hyphenatedKey","$event","renderStatic","isInFor","_staticTrees","markStatic","staticRenderFns","markOnce","markStaticNode","bindObjectListeners","existing","ours","resolveScopedSlots","hasDynamicKeys","contentHashKey","bindDynamicKeys","baseObj","prependModifier","installRenderHelpers","_o","_n","_s","_l","_t","_q","_m","_f","_k","_v","_u","_g","_d","_p","FunctionalRenderContext","contextVm","this$1","_original","isCompiled","_compiled","needNormalization","listeners","injections","scopedSlots","_scopeId","createFunctionalComponent","mergeProps","renderContext","cloneAndMarkFunctionalResult","vnodes","devtoolsMeta","componentVNodeHooks","hydrating","_isDestroyed","keepAlive","mountedNode","prepatch","createComponentInstanceForVnode","activeInstance","$mount","oldVnode","updateChildComponent","insert","_isMounted","callHook","queueActivatedComponent","activateChildComponent","destroy","deactivateChildComponent","$destroy","hooksToMerge","createComponent","baseCtor","resolveAsyncComponent","createAsyncPlaceholder","resolveConstructorOptions","transformModel","functional","nativeOn","abstract","installComponentHooks","_isComponent","_parentVnode","inlineTemplate","toMerge","_merged","mergeHook$1","f1","f2","SIMPLE_NORMALIZE","ALWAYS_NORMALIZE","normalizationType","alwaysNormalize","_createElement","$vnode","pre","applyNS","registerDeepBindings","force","class","initRender","_vnode","parentVnode","_renderChildren","parentData","isUpdatingChildComponent","_parentListeners","currentRenderingInstance","renderMixin","Vue","$nextTick","_render","ref","renderError","ensureCtor","comp","errorComp","resolved","owner","owners","loadingComp","sync","timerLoading","timerTimeout","$on","forceRender","renderCompleted","$forceUpdate","component","getFirstComponentChild","initEvents","_events","_hasHookEvent","updateComponentListeners","remove$1","$off","_target","onceHandler","oldListeners","eventsMixin","hookRE","$once","i$1","cbs","$emit","lowerCaseEvent","setActiveInstance","prevActiveInstance","initLifecycle","$children","$refs","_watcher","_inactive","_directInactive","_isBeingDestroyed","lifecycleMixin","_update","prevEl","$el","prevVnode","restoreActiveInstance","__patch__","__vue__","teardown","_watchers","_data","mountComponent","updateComponent","template","_name","_uid","Watcher","before","renderChildren","newScopedSlots","oldScopedSlots","hasDynamicScopedSlot","needsForceUpdate","$attrs","$listeners","propKeys","_propKeys","isInInactiveTree","direct","MAX_UPDATE_COUNT","activatedChildren","circular","flushing","resetSchedulerState","currentFlushTimestamp","getNow","timeStamp","flushSchedulerQueue","watcher","activatedQueue","updatedQueue","callActivatedHooks","callUpdatedHooks","emit","queueWatcher","uid$2","expOrFn","isRenderWatcher","deep","lazy","dirty","deps","newDeps","depIds","newDepIds","expression","cleanupDeps","tmp","oldValue","evaluate","sharedPropertyDefinition","sourceKey","initState","initProps","initMethods","initData","initComputed","initWatch","propsOptions","isRoot","getData","computedWatcherOptions","watchers","_computedWatchers","isSSR","userDef","defineComputed","shouldCache","createComputedGetter","createGetterInvoker","createWatcher","$watch","stateMixin","dataDef","propsDef","$set","$delete","immediate","uid$3","initMixin","_init","initInternalComponent","_self","vnodeComponentOptions","super","superOptions","modifiedOptions","resolveModifiedOptions","extendOptions","modified","latest","sealed","sealedOptions","initUse","plugin","installedPlugins","_installedPlugins","install","initMixin$1","mixin","initExtend","Super","SuperId","cachedCtors","_Ctor","Sub","initProps$1","initComputed$1","Comp","initAssetRegisters","definition","getComponentName","matches","pattern","pruneCache","keepAliveInstance","cachedNode","pruneCacheEntry","cached$$1","patternTypes","builtInComponents","KeepAlive","include","exclude","created","destroyed","mounted","ref$1","initGlobalAPI","configDef","util","defineReactive","delete","observable","ssrContext","acceptValue","isEnumeratedAttr","isValidContentEditableValue","convertEnumeratedValue","isFalsyAttrValue","isBooleanAttr","xlinkNS","isXlink","getXlinkProp","genClassForVnode","childNode","mergeClassData","renderClass","staticClass","dynamicClass","stringifyClass","stringifyArray","stringifyObject","stringified","namespaceMap","svg","math","isHTMLTag","isSVG","isPreTag","unknownElementCache","HTMLUnknownElement","HTMLElement","isTextInputType","selected","querySelector","createElement$1","multiple","createElementNS","createComment","insertBefore","newNode","referenceNode","removeChild","nextSibling","setTextContent","textContent","setStyleScope","scopeId","nodeOps","registerRef","isRemoval","refs","refInFor","emptyNode","sameVnode","sameInputType","typeA","typeB","createKeyToOldIdx","beginIdx","endIdx","createPatchFunction","backend","emptyNodeAt","createRmCb","childElm","removeNode","isUnknownElement$$1","inVPre","ignore","creatingElmInVPre","createElm","insertedVnodeQueue","parentElm","refElm","nested","ownerArray","setScope","createChildren","invokeCreateHooks","isReactivated","initComponent","reactivateComponent","pendingInsert","isPatchable","innerNode","transition","activate","ref$$1","checkDuplicateKeys","ancestor","addVnodes","startIdx","invokeDestroyHook","removeVnodes","removeAndInvokeRemoveHook","rm","updateChildren","oldCh","newCh","removeOnly","oldKeyToIdx","idxInOld","vnodeToMove","oldStartIdx","newStartIdx","oldEndIdx","oldStartVnode","oldEndVnode","newEndIdx","newStartVnode","newEndVnode","canMove","patchVnode","findIdxInOld","seenKeys","end","hydrate","postpatch","invokeInsertHook","initial","hydrationBailed","isRenderedModule","assertNodeMatch","hasChildNodes","innerHTML","childrenMatch","firstChild","fullInvoke","nodeType","isInitialPatch","isRealElement","hasAttribute","removeAttribute","oldElm","_leaveCb","patchable","i$2","updateDirectives","oldDir","dir","isCreate","isDestroy","oldDirs","normalizeDirectives$1","newDirs","dirsWithInsert","dirsWithPostpatch","oldArg","arg","callHook$1","componentUpdated","callInsert","emptyModifiers","modifiers","getRawDirName","rawName","baseModules","updateAttrs","inheritAttrs","oldAttrs","setAttr","removeAttributeNS","baseSetAttr","setAttributeNS","__ieph","blocker","stopImmediatePropagation","removeEventListener","updateClass","oldData","transitionClass","_transitionClasses","_prevClass","chr","index$1","expressionPos","expressionEndPos","warn$1","klass","validDivisionCharRE","parseFilters","exp","prev","filters","inSingle","inDouble","inTemplateString","inRegex","curly","square","paren","lastFilterIndex","pushFilter","wrapFilter","baseWarn","range","pluckModuleFunction","addProp","dynamic","rangeSetItem","plain","addAttr","dynamicAttrs","addRawAttr","attrsMap","attrsList","addDirective","isDynamicArg","prependModifierMarker","addHandler","important","events","prevent","middle","native","nativeEvents","newHandler","getRawBindingAttr","rawAttrsMap","getBindingAttr","getStatic","dynamicValue","getAndRemoveAttr","staticValue","removeFromMap","getAndRemoveAttrByRegex","genComponentModel","baseValueExpression","valueExpression","assignment","genAssignmentCode","parseModel","lastIndexOf","eof","isStringStart","parseString","parseBracket","inBracket","stringQuote","target$1","RANGE_TOKEN","CHECKBOX_RADIO_TOKEN","_warn","genSelect","genCheckboxModel","genRadioModel","genDefaultModel","valueBinding","trueValueBinding","falseValueBinding","value$1","typeBinding","binding","needCompositionGuard","normalizeEvents","change","createOnceHandler$1","remove$2","useMicrotaskFix","add$1","attachedTimestamp","_wrapper","currentTarget","ownerDocument","updateDOMListeners","svgContainer","updateDOMProps","oldProps","childNodes","strCur","shouldUpdateValue","checkVal","composing","isNotInFocusAndDirty","isDirtyWithModifiers","notInFocus","activeElement","_vModifiers","parseStyleText","cssText","listDelimiter","propertyDelimiter","normalizeStyleData","normalizeStyleBinding","staticStyle","bindingStyle","getStyle","checkChild","styleData","emptyStyle","cssVarRE","importantRE","setProp","setProperty","vendorNames","capName","updateStyle","oldStaticStyle","oldStyleBinding","normalizedStyle","oldStyle","newStyle","whitespaceRE","classList","tar","resolveTransition","css","autoCssTransition","enterClass","enterToClass","enterActiveClass","leaveClass","leaveToClass","leaveActiveClass","hasTransition","TRANSITION","ANIMATION","transitionProp","transitionEndEvent","animationProp","animationEndEvent","ontransitionend","onwebkittransitionend","onanimationend","onwebkitanimationend","raf","nextFrame","addTransitionClass","transitionClasses","removeTransitionClass","whenTransitionEnds","getTransitionInfo","propCount","ended","onEnd","transformRE","styles","transitionDelays","transitionDurations","transitionTimeout","getTimeout","animationDelays","animationDurations","animationTimeout","hasTransform","delays","durations","toMs","enter","toggleDisplay","cancelled","_enterCb","appearClass","appearToClass","appearActiveClass","beforeEnter","afterEnter","enterCancelled","beforeAppear","appear","afterAppear","appearCancelled","duration","transitionNode","isAppear","startClass","activeClass","toClass","beforeEnterHook","enterHook","afterEnterHook","enterCancelledHook","explicitEnterDuration","checkDuration","expectsCSS","userWantsControl","getHookArgumentsLength","show","pendingNode","_pending","isValidDuration","leave","beforeLeave","afterLeave","leaveCancelled","delayLeave","explicitLeaveDuration","performLeave","invokerFns","_enter","patch","vmodel","trigger","directive","_vOptions","setSelected","getValue","onCompositionStart","onCompositionEnd","prevOptions","curOptions","hasNoMatchingOption","actuallySetSelected","isMultiple","option","selectedIndex","locateNode","platformDirectives","transition$$1","originalDisplay","__vOriginalDisplay","unbind","transitionProps","getRealChild","compOptions","extractTransitionData","placeholder","rawChild","hasParentTransition","isSameChild","oldChild","isNotTextNode","isVShowDirective","Transition","_leaving","oldRawChild","delayedLeave","moveClass","callPendingCbs","_moveCb","recordPosition","newPos","applyTranslation","oldPos","dx","dy","moved","transform","WebkitTransform","transitionDuration","platformComponents","TransitionGroup","beforeMount","kept","prevChildren","rawChildren","transitionData","removed","c$1","updated","hasMove","_reflow","offsetHeight","propertyName","_hasMove","cloneNode","defaultTagRE","regexEscapeRE","buildRegex","delimiters","parseText","tagRE","tokenValue","tokens","rawTokens","transformNode","classBinding","genData","klass$1","transformNode$1","styleBinding","genData$1","decoder","style$1","he","isUnaryTag","canBeLeftOpenTag","isNonPhrasingTag","attribute","dynamicArgAttribute","ncname","qnameCapture","startTagOpen","startTagClose","doctype","comment","conditionalComment","isPlainTextElement","reCache","decodingMap","encodedAttr","encodedAttrWithNewLines","isIgnoreNewlineTag","shouldIgnoreFirstNewline","decodeAttr","shouldDecodeNewlines","parseHTML","lastTag","expectHTML","isUnaryTag$$1","canBeLeftOpenTag$$1","endTagLength","stackedTag","reStackedTag","rest$1","chars","parseEndTag","textEnd","commentEnd","shouldKeepComment","substring","advance","conditionalEnd","doctypeMatch","endTagMatch","curIndex","startTagMatch","parseStartTag","handleStartTag","rest","unarySlash","unary","shouldDecodeNewlinesForHref","outputSourceRange","lowerCasedTag","lowerCasedTagName","warn$2","transforms","preTransforms","postTransforms","platformIsPreTag","platformMustUseProp","platformGetTagNamespace","maybeComponent","onRE","dirRE","forAliasRE","forIteratorRE","stripParensRE","dynamicArgRE","argRE","bindRE","modifierRE","slotRE","lineBreakRE","whitespaceRE$1","invalidAttributeRE","decodeHTMLCached","emptySlotScopeToken","createASTElement","makeAttrsMap","root","currentParent","preserveWhitespace","whitespaceOption","whitespace","inPre","warned","warnOnce","closeElement","element","trimEndingWhitespace","processed","processElement","if","elseif","else","checkRootConstraints","addIfCondition","block","forbidden","processIfConditions","slotScope","slotTarget","lastNode","comments","start$1","guardIESVGBug","cumulated","isForbiddenTag","processPre","processRawAttrs","processFor","processIf","processOnce","end$1","isTextTag","processKey","processRef","processSlotContent","processSlotOutlet","processComponent","processAttrs","for","iterator2","iterator1","checkInFor","parseFor","inMatch","alias","iteratorMatch","findPrevElement","condition","ifConditions","slotTargetDynamic","slotBinding","getSlotName","slotBinding$1","dynamic$1","slotContainer","slotName","syncGen","isDynamic","hasBindings","parseModifiers","camel","argMatch","checkForAliasModel","ieNSBug","ieNSPrefix","_el","preTransformNode","ifCondition","ifConditionExtra","hasElse","elseIfCondition","branch0","cloneASTElement","branch1","branch2","modules$1","isStaticKey","isPlatformReservedTag","baseOptions","genStaticKeysCached","genStaticKeys$1","optimize","markStatic$1","markStaticRoots","static","l$1","staticInFor","staticRoot","isDirectChildOfTemplateFor","fnExpRE","fnInvokeRE","simplePathRE","esc","tab","space","up","down","keyNames","genGuard","modifierCode","stop","ctrl","alt","meta","genHandlers","prefix","staticHandlers","dynamicHandlers","handlerCode","genHandler","isMethodPath","isFunctionExpression","isFunctionInvocation","genModifierCode","keyModifier","genKeyFilter","genFilterCode","keyVal","keyCode","keyName","wrapListeners","bind$1","wrapData","baseDirectives","cloak","CodegenState","dataGenFns","onceId","generate","ast","genElement","staticProcessed","genStatic","onceProcessed","genOnce","forProcessed","genFor","ifProcessed","genIf","genSlot","genComponent","genData$2","genChildren","originalPreState","altGen","altEmpty","genIfConditions","conditions","genTernaryExp","altHelper","genDirectives","genProps","genScopedSlots","genInlineTemplate","needRuntime","hasRuntime","gen","inlineRenderFns","containsSlotChild","needsKey","generatedSlots","genScopedSlot","isLegacySyntax","reverseProxy","checkSkip","altGenElement","altGenNode","el$1","normalizationType$1","getNormalizationType","genNode","needsNormalization","genComment","genText","transformSpecialNewlines","bind$$1","componentName","staticProps","dynamicProps","prohibitedKeywordRE","unaryOperatorsRE","stripStringRE","detectErrors","checkNode","checkFor","checkEvent","checkExpression","stipped","keywordMatch","checkIdentifier","ident","generateCodeFrame","lines","count","repeat$1","lineLength","length$1","createFunction","errors","createCompileToFunctionFn","compile","warn$$1","compiled","tips","fnGenErrors","createCompilerCreator","baseCompile","leadingSpaceLength","compileToFunctions","div","createCompiler","getShouldDecode","idToTemplate","mount","getOuterHTML","outerHTML","container","Action","vuexModule","__actions","VuexModule","__options","VuexClassModuleFactory","classModule","moduleOptions","moduleRefs","getters","mutations","actions","localFunctions","registerOptions","__mutations","actionKeys","mutationKeys","registerVuexModule","namespaced","mapValues","thisObj","buildThisProxy","mutation","payload","stateSetter","stateField","generateMutationSetters","_loop_1","stateKey","this_1","getMutationSetterName","proxyDefinition","field","commit","registerModule","buildAccessor","accessorModule","useNamespaceKey","excludeModuleRefs","excludeLocalFunctions","getPrototypeOf","mapValuesToProperty","namespaceKey","dispatch","localFunction","mapFunc","_loop_2","Module","moduleDecoratorFactory","accessor","devtoolHook","forEachValue","rawModule","runtime","_children","_rawModule","rawState","addChild","getChild","forEachChild","forEachGetter","forEachAction","forEachMutation","ModuleCollection","rawRootModule","register","targetModule","newModule","getNamespace","rawChildModule","unregister","Store","plugins","strict","_committing","_actions","_actionSubscribers","_mutations","_wrappedGetters","_modules","_modulesNamespaceMap","_subscribers","_watcherVM","installModule","resetStoreVM","_devtoolHook","targetState","replaceState","subscribe","devtoolPlugin","prototypeAccessors$1","genericSubscribe","resetStore","hot","oldVm","_vm","wrappedGetters","partial","$$state","enableStrictMode","_withCommit","rootState","parentState","getNestedState","moduleName","local","noNamespace","_type","_payload","_options","unifyObjectStyle","gettersProxy","splitPos","localType","makeLocalGetters","makeLocalContext","registerMutation","rootGetters","registerAction","rawGetter","registerGetter","_Vue","beforeCreate","vuexInit","$store","applyMixin","entry","after","subscribeAction","preserveState","unregisterModule","hotUpdate","newOptions","committing","mapState","normalizeNamespace","states","normalizeMap","getModuleByNamespace","vuex","mapMutations","mapGetters","mapActions","helper","index_esm","createNamespacedHelpers","brand","gtmCustomEventPush","gtmPush","dataLayer","cartProduct","quantity","productItem","ecommerce","products","title","product_name","sku","product_id","price","sfraGetItemInfo","row","closest","productInfo","innerText","sfraQuickAddCartEvents","sfraGetQuickAddInfo","sfraRemoveFromCartEvents","sfraUpdateCartQuantity","newValue","wasAnAddition","sfraMutationObserverForPaypal","__postRobot__","EVENTS","PAYPAL_AUTHORIZED","BOTTOM_PROMO","HERO_VIDEO","HERO_VIDEO_TIMING","STANDALONE_CHAT_NOW","CUSTOMER_RECOMMENDATION_FAILURE","ASSOCIATED_PRODUCT_FAILURE","PRODUCT_FAILURE","BACK_IN_STOCK_NOTIFICATION","SEEN_OUT_OF_STOCK","DISTRIBUTOR_SEARCH_FAILURE","DISTRIBUTOR_SEARCH_SELECT","DISTRIBUTOR_SEARCH_DEEPLINK","QUICK_ANSWER_OPEN","QUICK_ANSWER_SEEN","WIZARD_PERSONA","WIZARD_PAGE_VIEW","WIZARD_RESULTS","WIZARD_RECOMMENDATIONS","LIFT_DATA","LodgeStorage","exists","storage","getItem","setItem","lodgeLocalStorage","truncate","safeJoin","delimiter","output","isMatchingPattern","originalFunctionToString","DEFAULT_IGNORE_ERRORS","InboundFilters","setupOnce","clientOptions","_mergeOptions","_shouldDropEvent","_isSentryError","_isIgnoredError","_isBlacklistedUrl","_getEventFilterUrl","_isWhitelistedUrl","ignoreInternal","ignoreErrors","_getPossibleEventMessages","blacklistUrls","whitelistUrls","stacktrace","frames_1","frames","filename","frames_2","FunctionToString","SentryError","_super","_newTarget","DSN_REGEX","ERROR_MESSAGE","Dsn","_fromString","_fromComponents","_validate","withPassword","pass","projectId","Memo","_hasWeakSet","WeakSet","_inner","memoize","unmemoize","fill","wrapped","getWalkSource","event_1","CustomEvent","jsonSize","encodeURI","utf8Length","normalizeToSize","depth","maxSize","serialized","normalizeValue","memo","Infinity","serializeValue","acc","innerKey","extractExceptionKeysForMessage","maxLength","includedKeys","API","dsn","_dsnObject","getDsn","getStoreEndpoint","_getBaseUrl","getStoreEndpointPath","getStoreEndpointWithUrlEncodedAuth","sentry_key","sentry_version","getRequestHeaders","clientName","clientVersion","getReportDialogEndpoint","dialogOptions","endpoint","encodedOptions","email","installedIntegrations","setupIntegrations","integrations","defaultIntegrations","userIntegrations","userIntegrationsNames_1","pickedIntegrationsNames_1","defaultIntegration","userIntegration","integrationsNames","alwaysLastToRun","getIntegrationsToSetup","setupIntegration","Status","BaseClient","backendClass","_integrations","_processing","_backend","_dsn","_isEnabled","_getBackend","eventFromException","_processEvent","finalEvent","eventFromMessage","flush","_isClientProcessing","clearInterval","interval","getTransport","transportFlushed","ready","enabled","getIntegrations","ticked","_prepareEvent","environment","release","dist","maxValueLength","normalizeDepth","prepared","_addIntegrations","sdk","_normalizeEvent","sdkInfo","integrationsArray","beforeSend","sampleRate","__sentry__","sendEvent","beforeSendResult","_handleAsyncBeforeSend","processedEvent","fromHttpCode","Success","RateLimit","Invalid","Failed","Unknown","Severity","NoopTransport","Skipped","BaseBackend","_transport","_setupTransport","_exception","_hint","_message","supportsFetch","Headers","Request","Response","isNativeFetch","supportsReferrerPolicy","referrerPolicy","fromString","Debug","Info","Warning","Fatal","Critical","Log","UNKNOWN_FUNCTION","gecko","winjs","geckoEval","chromeEval","computeStackTrace","ex","popSize","framesToPop","opera10Regex","opera11Regex","column","extractMessage","computeStackTraceFromStacktraceProp","popFrames","submatch","computeStackTraceFromStackProp","failed","exceptionFromStacktrace","prepareFramesForEvent","eventFromStacktrace","localStack","firstFrameFunction","lastFrameFunction","frame","colno","function","in_app","lineno","eventFromUnknownInput","domException","eventFromString","rejection","__serialized__","eventFromPlainObject","synthetic","attachStacktrace","PromiseBuffer","_limit","_buffer","isReady","task","drain","capturedSetTimeout","BaseTransport","FetchTransport","_disabledUntil","defaultOptions","fetch","XHRTransport","getResponseHeader","BrowserBackend","transportOptions","transport","handled","SDK_VERSION","BrowserClient","packages","showReportDialog","script","onLoad","head","callOnHub","ignoreOnError","shouldIgnoreOnError","ignoreNextOnError","wrap","__sentry_wrapped__","sentryWrapped","wrappedArguments","handleEvent","lastHref","TryCatch","_ignoreOnError","_wrapTimeFunction","originalCallback","_wrapRAF","_wrapEventTarget","eventName","_wrapXHR","originalSend","xhr","xmlHttpRequestProps","wrapOptions","instrumented","instrument","originalConsoleLevel","triggerHandlers","instrumentConsole","domEventHandler","keypressEventHandler","innerOriginal","instrumentDOM","xhrproto","originalOpen","__sentry_xhr__","__sentry_own_request__","commonHandlerData","startTimestamp","status_code","endTimestamp","instrumentXHR","doc","sandbox","supportsNativeFetch","originalFetch","fetchData","getFetchMethod","getFetchUrl","instrumentFetch","isChromePackagedApp","app","hasHistoryApi","history","pushState","supportsHistory","oldOnPopState","onpopstate","historyReplacementFunction","originalHistoryFunction","instrumentHistory","addInstrumentationHandler","e_1","e_1_1","return","fetchArgs","keypressTimeout","lastCapturedEvent","debounceTimer","isContentEditable","Breadcrumbs","_consoleBreadcrumb","handlerData","category","_domBreadcrumb","_xhrBreadcrumb","addSentryBreadcrumb","_fetchBreadcrumb","filterUrl","_historyBreadcrumb","parsedLoc","parsedFrom","parsedTo","serializedData","GlobalHandlers","_global","_oldOnErrorHandler","_oldOnUnhandledRejectionHandler","_onErrorHandlerInstalled","_onUnhandledRejectionHandlerInstalled","onunhandledrejection","stackTraceLimit","_installGlobalOnErrorHandler","_installGlobalOnUnhandledRejectionHandler","currentHub","hasIntegration","isFailedOwnDelivery","_eventFromIncompleteOnError","_enhanceEventWithInitialFrame","_eventFromIncompleteRejection","LinkedErrors","_key","limit","_handler","linkedErrors","_walkErrorTree","UserAgent","window_1","SENTRY_RELEASE","clientClass","debug","initAndBind","_attachProps","_logErrors","logErrors","attachProps","_formatComponentName","oldOnError","lifecycleHook","DESKTOP_SIZE","TABLET_SIZE","sentryHasInititated","initSentry","getSentryEnv","Sentry","SentryVueIntegration","THEME_PATH","callNow","qs","Bowser","selector","qsa","queryParams","locationSearch","curr","validProductProperties","chunk","chunks","_elements","resetHeight","reset","tallest","previousHgt","currentHgt","hgt","subtitle","copy","filteredAnswer","invertHash","keyboardAccessibility","usesKeyboard","Mutations","colors","loadingState","clearFilterItems","selectedFilters","addFilterItem","removeFilterItem","incrementPage","page","setPage","resetPage","setNavigatedProduct","navigatedProduct","Commit","undone","newMutation","ignoreMutations","replaying","canRedo","canUndo","redo","undo","undoDelimiter","undoing","createVariantKey","vue_key","drupalSettings","lodge","productCountOffset","Op","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","define","innerFn","outerFn","tryLocsList","protoGenerator","Generator","Context","_invoke","GenStateSuspendedStart","GenStateExecuting","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","_sent","dispatchException","abrupt","record","tryCatch","GenStateSuspendedYield","makeInvokeMethod","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","NativeIteratorPrototype","Gp","defineIteratorMethods","AsyncIterator","PromiseImpl","invoke","__await","unwrapped","previousPromise","callInvokeWithMethodAndArg","resultName","nextLoc","pushTryEntry","locs","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","iterable","iteratorMethod","displayName","isGeneratorFunction","genFun","ctor","awrap","iter","skipTempReset","rootRecord","rval","handle","loc","caught","hasCatch","hasFinally","finallyEntry","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","ds","sfcc","ocapiBase","ocapiClientId","controllerPath","autoRefreshTimer","getJWT","jwt","post","customer","authorization","append","getSession","getCustomerBasket","customerId","basket","total","baskets","product_items","recreateBasket","createBasket","fault","basketId","getBasket","basketIds","addProductsToBasket","productItems","addBonusProductToBasket","productId","bonusProductLineItemUUID","bonusItemId","qty","bonus_discount_line_item_id","c_bonusProductLineItemUUID","removeProductFromBasket","item_id","updateProductQuantityInBasket","newBasket","basket_id","fetchProductDetails","ids","getUpdatedProductsForProductItems","currentProducts","productIds","storedProduct","newProducts","flat","getUpdatedProductsForBonusItems","bonusProducts","getProductRecommendations","recommendationType","updateCustomerRecipeList","c_cookbookRecipes","recipeList","cookieDomainMatch","cookieDomain","persistentData","localStorage","canWriteStorage","getState","setState","PreValidateJWTAndBasket","boundOriginal","currentJWTValid","isJWTValid","getValidJWT","getValidBasket","accountModule","jwtExpiration","customerLoggedIn","expirationTime","refreshTimeWindow","sessionChecked","guestChecked","minBasket","bonus_discount_line_items","bdli","customer_info","bonus_product_line_item","shouldSave","save","getJWTExpiration","initAccount","auth_type","jwtResponse","customer_id","last_modified","getBonusProductDetails","bonusItems","newBonusItems","resetAccount","AccountModule","getProducts","getColors","getMasterInfo","masterInfo","getAssociatedProducts","associatedProducts","getCurrentVariant","getFreeProducts","freeProducts","getQuantity","getDefaultAttribute","getVariantMedia","images","getAvailableColorsBySize","attribute_color","availableColorsBySize","attribute_size","getSelectedOptions","selected_size","selected_color","selected_quantity","attribute_quantity","getImages","noImagesArray","parent_images","large","medium","getVideos","noVideosArray","videos","setRecommendations","setAssociatedProducts","setFreeProducts","setOptions","setQuantity","q","setCurrentVariant","setVariants","setSpecificOption","partialKey","setMasterInfo","getProductDataFromDrupal","recommendationData","recommendations","skus","recommended_item_id","sfccDomain","variants","extraData","attribute_default","attribute_variationName","recentlyViewed","qp","querySeparator","_filteredProducts","filterableProducts","sListHash","Materials","Types","Sizes","Colors","Shapes","Collections","Sales","pListHash","filterList","hasMaterial","hasTypes","hasSizes","hasColors","hasShapes","hasCollections","hasSales","filteredProducts","filteredProductsProperties","propertyListSelectValues","availableFilters","resultCount","hasDiscount","variations","list_price","promotions","properties","assignments","propertyList","propertyListAvailableValues","propertyListAvailable","queryValues","filterHash","qv","queryParts","getQueryParams","getSelectedFilters","getPage","getNavigatedProduct","fetchingData","getFetchingData","getLoadingState","setFetchingData","setProducts","setLoadingState","lookupResults","flavorKey","servings","leftovers","answers","_results","checkForSuitableReplacement","givenProducts","replacementProds","available","getSkill","skill","getCollection","getServings","getServingsRaw","getFlavors","flavors","getFlavorsB","flavorsB","getFlavorsC","flavorsC","getFlavorStatus","getFlavorTier","flavorTier","getFlavorPictures","flavorPictures","2","3","getLeftovers","getActivePage","activePage","getResults","getFlavorValidation","answersLoadingStatus","SERVING_SIZES","CSI","checks","upProds","upSku","downProds","downSku","filterUnavailable","alternates","getFinalSettings","sawResults","getSawResults","getFlavorsByTier","tier","pictures","flavorsByType","getFlavorsByType","byType","invertedHash","sortedKeys","typesArray","builtPicturesArray","tiers","combinedTiers","typeId","getAPIDataStatus","flavorPicturesLoaded","returnedKey","seenTiers","chosen","percentage","highestValue","tierThreeFlavors","getUniqueKey","setSkill","setCollection","setFlavors","setFlavorKey","setFlavorTier","setServings","setLeftovers","setActivePage","setAnswers","setPictures","setAnswersLoadingStatus","restart","setBackButtonHash","backButtonHash","loadAnswerData","wizardData","loadPictureData","oldState","questionWithAnswers","collectedAnswers","answerGroup","backButton","setQuestionWithAnswers","setCollectedAnswers","setAnswerGroup","setBackButton","getQuestionWithAnswers","getCollectedAnswers","getAnswerGroup","getBackButton","getAnswers","issues","currentIssueId","getAnswer","getCurrentStep","currentStep","getNextStep","nextStep","getMaterialOptions","materialOptions","getMaterial","categories","getProductsLoadingStatus","productsLoadingStatus","getOrderLoadingStatus","orderLoadingStatus","getIssuesResponseLoadingStatus","issuesResponseLoadingStatus","getOrder","order","getUploadsComplete","uploadsComplete","getIssue","getCurrentIssueId","getRequest","getIssueProduct","getMissingParts","missingParts","getNotes","notes","getPath","getAutoContinue","dataModel","autoContinue","getBranch","branch","getTree","getCSRFToken","csrfToken","getIssuesResponse","issuesResponse","getFlowComplete","flowComplete","getNextFocus","nextFocus","getPrevIssues","indices","getResolvedFlag","resolvedFlag","getRequestedRemedies","requestedRemedy","captchaToken","orderCreationDate","orderNumber","orderEmail","orderPhone","orderName","orderAddress1","orderAddress2","orderCity","orderState","orderZip","orderCountry","purchaseLocation","gift","issueTemplate","requestNumber","caseRecordType","subType","remedyAmount","photos","freshState","loadProducts","zip","submitIssues","requests","emptyState","setUndoPoint","setAnswer","answer","removeAnswer","setRemedy","remedy","setGift","setCurrentStep","setNextStep","setFollowingStep","unsetNextStep","setProductsLoadingStatus","setOrderLoadingStatus","setIssuesResponseLoadingStatus","setOrder","removeOrder","createIssue","issue","setCurrentIssueId","addIssuePhotos","removeIssuePhotos","setIssuePhotos","setIssueProduct","unsetIssueProduct","updateMissingParts","setNotes","setUploadsComplete","addPathStep","removePathStep","repeatUndone","setCSRFToken","updateRequest","issueKey","concern","additionalNotes","addToNotes","dropped","hasResponse","finalResponse","raResponse","RAResponse","material","cause","used","damaged","setIssuesResponse","setContactInformation","address1","address2","city","st","country","phone","updateContact","zipcode","setTree","resetFlow","setFlowComplete","setNextFocus","setResolvedFlag","State","recipes","filterText","pageMax","navigatedRecipe","recipeTotal","getNavigatedRecipe","getRecipes","getFilterText","addToList","setFilterText","clearFilters","setNavigatedRecipe","likedIDs","loggedIn","wizard","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","loaded","__webpack_modules__","hmd","Vuex","VuexUndoRedo","SESSION_KEY","reducer","intents","dataPoints","intentOutcomes","hydrateUserClassifier","savedData","savedIntentOutcomes","sendDataToGTM","addDataPoint","dataPoint","publishDataPoint","dataType","intentKey","subscribesTo","outcomes","_outcomes","intent","intentName","negatedBy","isMatch","classifications","registerIntent","registerIntents","prettyName","deregisterIntent","cookieOptions","CLASSIFIER_TYPES","PAGE_VIEW","ECOM_ADD_TO_CART","ECOM_PURCHASE","PRODUCT_VIEW","BaseLodgeIntent","FIRST_N_PAGES","SEEN_N_PAGES","seenByNPages","visitedNRecipes","regex","pages","regexTest","visitedNHelpArticles","AVERAGE_UNITS_PER_PURCHASE","SHOP_PAGE_URL","boughtOverAverage","hasSeenEarly","loopLength","viewedProducts","purchases","units","N_VIEWED_PRODUCTS","viewedProductsCount","madePurchase","interactedWithCart","broughtBySocial","introPage","queryString","userClassifier","UserClassifier","alreadySeen","alreadySeenProduct","salesforce_id","RecipeChef","CaringOwner","PowerBuyer","UnconfidentUser","InfluencedMogul","CT","lodge_user_classifier","searchWrapper","searchIcon","closeElem","searchInputs","closeSearch","openSearch","btn","searchInput","fireQueryToGTM","multiselect","buttons","image","normalizeComponent","scriptExports","functionalTemplate","injectStyles","moduleIdentifier","shadowMode","__VUE_SSR_CONTEXT__","_registeredComponents","_ssrRegister","shadowRoot","_injectStyles","originalRender","_h","$$a","$$el","$$c","checked","$$i","onEnterKeyUp","isFlexedColumn","button","onSelection","selections","preventDefault","onMultiselectFinish","nextWithData","choicesResults","hide","back","quizTaken","JSONQuizData","quizIsFinished","quizData","movement","choices","backgroundless","inSocialBar","toasted","toasterStatus","processing","stopPropagation","setStatus","iconStatus","screenreaderText","isBookmarkedRecipe","toasterMessages","_assertThisInitialized","ReferenceError","_inheritsLoose","subClass","superClass","_suppressOverwrites","_globalTimeline","_win","_coreInitted","_doc","_coreReady","_lastRenderedFrame","_quickTween","_tickerActive","_id","_req","_raf","_delta","_getTime","_lagThreshold","_adjustedLag","_startTime","_lastUpdate","_gap","_nextTime","_listeners","_tick","n1","easeOut","_config","autoSleep","force3D","nullTargetWarn","lineHeight","_defaults","overwrite","_bigNum","_tinyNum","_2PI","PI","_HALF_PI","_gsID","_sqrt","sqrt","_cos","cos","_sin","sin","_isString","_isFunction","_isNumber","_isUndefined","_isObject","_isNotFalse","_windowExists","_isFuncOrString","_isTypedArray","_isArray","_strictNumExp","_numExp","_numWithUnitExp","_complexStringNumExp","_relExp","_delimitedValueExp","_unitExp","_globals","_installScope","_install","_merge","gsap","suppress","_addGlobal","_emptyFunc","_reservedProps","_lazyTweens","_lazyLookup","_plugins","_effects","_nextGCFrame","_harnessPlugins","_callbackNames","_harness","targets","harnessPlugin","_gsap","harness","targetTest","GSCache","_getCache","_getProperty","_forEachName","_round","round","_roundPrecise","_arrayContainsAny","toSearch","toFind","_lazyRender","tween","_lazy","_lazySafeRender","animation","time","suppressEvents","_numericIfPossible","_passThrough","_setDefaults","_mergeDeep","_copyExcluding","excluding","_inheritDefaults","vars","excludeDuration","keyframes","inherit","_dp","_removeLinkedListItem","firstProp","lastProp","_prev","_next","_removeFromParent","onlyIfParentHasAutoRemove","autoRemoveChildren","_act","_uncache","_end","_dur","_start","_dirty","_recacheAncestors","totalDuration","_hasNoPausedAncestors","_ts","_elapsedCycleDuration","_repeat","_animationCycle","_tTime","_rDelay","tTime","cycleDuration","whole","_parentToChildTotalTime","parentTime","_tDur","_setEnd","abs","_rts","_alignPlayhead","totalTime","smoothChildTiming","_time","_postAddChecks","timeline","_initted","rawTime","_clamp","_zTime","_addToTimeline","skipChecks","_parsePosition","_delay","timeScale","sortBy","_addLinkedListItem","_sort","_isFromOrFromStart","_recent","_scrollTrigger","ScrollTrigger","_missingPlugin","_attemptInitTween","_initTween","_pt","_ticker","_parentPlayheadIsBeforeStart","_ref","_lock","_ref2","_setDuration","skipUncache","leavePlayhead","dur","totalProgress","_onUpdateTotalDuration","Timeline","_zeroPosition","endTime","percentAnimation","offset","isPercent","labels","recent","clippedDuration","_createTweenType","irVars","isLegacy","varsIndex","immediateRender","runBackwards","startAt","Tween","_conditionalReturn","getUnit","_slice","_isArrayLike","nonEmpty","_flatten","leaveStrings","accumulator","_accumulator","_wake","shuffle","distribute","each","ease","_parseEase","isDecimal","ratios","axis","ratioX","ratioY","center","edges","originX","originY","x","wrapAt","distances","grid","amount","_invertEase","_roundModifier","pow","snap","snapTo","radius","is2D","increment","roundingIncrement","returnFunction","_wrapArray","wrapper","_replaceRandom","nums","mapRange","inMin","inMax","outMin","outMax","inRange","outRange","_getLabelInDirection","fromTime","backward","distance","_callback","executeLazyFirst","callbackScope","_interrupt","scrollTrigger","kill","progress","_createPlugin","isFunc","Plugin","instanceDefaults","_renderPropTweens","_addPropTween","_killPropTweensOf","modifier","_addPluginModifier","rawVars","statics","getSetter","_getSetter","aliases","PropTween","_255","_colorLookup","aqua","lime","silver","black","maroon","teal","blue","navy","white","olive","yellow","orange","gray","purple","green","red","pink","cyan","transparent","_hue","m1","m2","splitColor","toHSL","forceAlpha","wasHSL","_colorOrderData","_colorExp","_formatColors","orderMatchData","shell","color","_hslExp","_colorStringFilter","combined","overlap","elapsed","manual","tick","deltaRatio","fps","wake","gsapVersions","GreenSockGlobals","sleep","cancelAnimationFrame","lagSmoothing","threshold","adjustedLag","_fps","_easeMap","_customEaseExp","_quotesExp","_parseObjectInString","parsedVal","_propagateYoyoEase","isYoyo","_first","yoyoEase","_yoyo","_ease","_yEase","defaultEase","_CE","_configEaseFromString","_insertEase","easeIn","easeInOut","lowercaseName","_easeInOutFromOut","_configElastic","amplitude","period","p1","p2","p3","asin","_configBack","overshoot","power","Linear","easeNone","none","SteppedEase","steps","immediateStart","Animation","repeatDelay","yoyo","_proto","startTime","_totalTime","_ptLookup","_pTime","ratio","iteration","_ps","paused","includeRepeats","wrapRepeats","globalTime","seek","includeDelay","play","reversed","pause","atTime","resume","invalidate","isActive","eventCallback","_onUpdate","onFulfilled","_then","_prom","_Animation","sortChildren","_proto2","fromTo","fromVars","toVars","delayedCall","staggerTo","stagger","onCompleteAll","onCompleteAllParams","onComplete","onCompleteParams","staggerFrom","staggerFromTo","prevPaused","pauseTween","prevStart","prevIteration","prevTime","tDur","crossingStart","rewinding","doesWrap","repeatRefresh","onRepeat","_hasPause","_forcing","_last","_findNextPauseTween","onUpdate","adjustedTime","_this2","addLabel","getChildren","tweens","timelines","ignoreBeforeTime","getById","animations","removeLabel","killTweensOf","_totalTime2","addPause","removePause","onlyActive","getTweensOf","_overwritingTween","parsedTargets","isGlobalTime","_targets","tweenTo","initted","tl","_vars","_onStart","onStart","onStartParams","tweenFromTo","fromPosition","toPosition","nextLabel","afterTime","previousLabel","beforeTime","currentLabel","shiftChildren","adjustLabels","includeLabels","updateRoot","_addComplexStringPropTween","stringFilter","funcParam","startNums","endNum","startNum","hasRandom","pt","_renderComplexString","matchIndex","fp","currentValue","parsedStart","_setterFuncWithParam","_setterFunc","_setterPlain","_renderBoolean","_renderPlain","_checkPlugin","ptLookup","_parseFuncOrString","_processVars","priority","cleanVars","hasPriority","gsData","harnessVars","overwritten","onUpdateParams","autoRevert","prevStartAt","_startAt","fullTargets","autoOverwrite","_overwrite","_op","_sortPropTweensByPriority","_onInit","_parseKeyframe","allProps","easeEach","_staggerTweenProps","_staggerPropsToSkip","_Animation2","skipInherit","_this3","curTarget","staggerFunc","staggerVarsToMerge","_this3$vars","kf","_proto3","prevRatio","_renderZeroDurationTween","overwrittenProps","curLookup","curOverwriteProps","killingTargets","propTweenLookup","firstPT","a1","a2","_arraysMatch","propertyAliases","_addAliasesToVars","onReverseComplete","onReverseCompleteParams","_setterAttribute","hasNonDependentRemaining","_setterWithModifier","mSet","mt","pt2","pr","renderer","TweenMax","TweenLite","TimelineLite","TimelineMax","registerPlugin","_len2","_key2","getProperty","unit","uncache","format","quickSetter","setters","isTweening","registerEffect","_ref3","effect","extendTimeline","pluginName","registerEase","parseEase","exportRoot","includeDelayedCalls","wrapYoyo","clamp","nativeElement","_len","functions","unitize","interpolate","mutate","interpolators","il","master","effects","ticker","globalTimeline","core","globals","getCache","suppressOverwrites","_getPluginPropTween","_buildModifierPlugin","_addModifiers","Power0","_docElement","_pluginInitted","_tempDiv","_recentSetterPlugin","_supports3D","Power1","_transformProps","Power2","Power3","Power4","Quad","Cubic","Quart","Quint","Strong","Elastic","Back","Bounce","Sine","Expo","Circ","_RAD2DEG","_DEG2RAD","_atan2","atan2","_capsExp","_horizontalExp","_complexExp","_propertyAliases","autoAlpha","scale","alpha","_renderCSSProp","_renderPropWithEnd","_renderCSSPropWithBeginning","_renderRoundedCSSProp","_renderNonTweeningValue","_renderNonTweeningValueOnlyAtEnd","_setterCSSStyle","_setterCSSProp","_setterTransform","_setterScale","scaleX","scaleY","_setterScaleWithRender","renderTransform","_setterTransformWithRender","_transformProp","_transformOriginProp","_getComputedProperty","skipPrefixFallback","cs","_checkPropPrefix","_prefixes","preferPrefix","_initCore","_getBBoxHack","swapIfPossible","bbox","ownerSVGElement","oldParent","oldSibling","oldCSS","getBBox","_gsapBBox","_getAttributeFallbacks","attributesArray","_getBBox","bounds","_isSVG","getCTM","_removeProperty","removeProperty","_addNonTweeningPT","beginning","onlySetAtEnd","_nonConvertibleUnits","deg","rad","turn","_convertToUnit","px","curValue","curUnit","horizontal","isRootSVG","measureProperty","toPixels","toPercent","_get","_parseTransform","origin","_firstTwoOnly","zOrigin","_specialProps","_tweenComplexCSSString","startValues","startValue","endValue","endUnit","startUnit","_keywordToPercent","_renderClearProps","clearTransforms","clearProps","_identity2DMatrix","_rotationalProperties","_isNullTransform","_getComputedTransformMatrixAsArray","matrixString","_getMatrix","force2D","addedToDOM","matrix","baseVal","consolidate","_applySVGOrigin","originIsAbsolute","smooth","matrixArray","pluginToAddPropTweensTo","determinant","xOriginOld","xOrigin","yOriginOld","yOrigin","xOffsetOld","xOffset","yOffsetOld","yOffset","tx","ty","originSplit","z","rotation","rotationX","rotationY","skewX","skewY","perspective","angle","a12","a22","t1","t2","t3","a13","a23","a33","a42","a43","a32","invertedScaleX","forceCSS","xPercent","yPercent","transformPerspective","_renderSVGTransforms","_renderCSSTransforms","_renderNon3DTransforms","_addPxTranslate","_zeroDeg","_zeroPx","_endParenthesis","use3D","a11","a21","tan","_addRotationalPropTween","direction","cap","finalValue","_assign","_addRawTransformPTs","endCache","startCache","side","positionAndScale","CSSPlugin","specialProp","isTransformRelated","transformPropTween","parseTransform","smoothOrigin","autoRound","checkPrefix","gsapWithCSS","ani","DEFAULT_EASE","START_OPACITY","opacity","FINISH_OPACITY","START_Y_OFFSET","FINISH_Y_OFFSET","ANIMATION_DEFAULTS","DEFAULT_TIME","DEFAULT_TIME_SHORT","DEFAULT_STAGGER","COLORS","brandPrimary","brandWhite","nav","opened","hasPromo","setupEvents","isMenuOpened","handleClickaway","dropdown","cart","contains","hamburger","toggleMobileMenu","link","toggleDropdowns","recalculate","mobileActiveClass","menuToggleAnimation","subItemsEl","targetParent","otherDropdowns","promoTopOffset","getOffsetForMenu","toggle","addOrRemove","outerWidth","maxHeight","aboveHeader","siteHeader","aboveHeaderRect","siteHeaderRect","animatedCover","allLinks","isRemoving","linksStartingX","linksFinishing","zIndex","borderWidth","activeDropdown","scroll","wizardIntroAnimation","actionBar","shown","resultsIntroAnimation","topChoice","topChoiceContent","alternativeDivs","resultsOutroAnimation","flexCard","validate","buttonDisabled","onClick","leftToChoose","$$v","disabledButton","nextPageHash","reflectionIsSupported","defineMetadata","getOwnMetadataKeys","forwardMetadata","propertyKey","metaKey","getOwnMetadata","$internalHooks","componentFactory","Component","originalInit","plainData","collectDataFromConstructor","__decorators__","superProto","Extended","Original","shouldIgnore","extendedDescriptor","superDescriptor","forwardStaticMembers","caller","registerHooks","reflectMetadataIsSupported","getMetadata","applyMetadata","Prop","k","AddAsyncUpdates","Helpers","dollars","toFixed","pluralize","updating","addToCart","account","showCartAfterUpdate","addGiftToCart","returnFocusTo","buttonOverride","AddToCart","freeProd","disabled","buttonText","features","updateActive","Page1","Page2","Page3","Page3B","Page3C","Page4","Page5","checkForTabDown","backButtonText","currentPage","currentPageComponent","handleWizardFocus","handleAccessibility","isReplaying","behavior","parseTree","newTree","getPreviousStep","goToPreviousStep","checkForAnsweredStep","checkForFilteredStep","moveToNextStep","goToNextStep","goToSpecificStep","goToEnd","nextIssueId","NodeWrap","choice","chosenIndex","answerOnly","noFocus","optionWidth","setChoice","date","debouncedAnswer","handleText","Question","DateInput","TextInput","nodesPerRow","w","nd","drupalRoot","selectedConcern","partsMissing","setConcern","backgroundImage","information","_extends","ownProp","deferred","recaptcha","grecaptcha","widgetId","assertLoaded","execute","checkRecaptchaLoad","vueRecaptchaApiLoaded","sitekey","theme","badge","tabindex","loadRecaptchaScript","recaptchaScriptId","recaptchaHost","language","getElementById","defer","$props","emitVerify","emitExpired","emitError","$widgetId","uploadProgress","fileListPreview","isUploading","maxImages","form","click","dropArea","removedFile","files","dataTransfer","handleFiles","previewFile","initializeProgress","progressBar","fileNumber","percent","validFile","reader","FileReader","readAsDataURL","onloadend","updateProgress","success","preventDefaults","uploadFiles","oldVal","highlight","unhighlight","handleDrop","openFileDialog","removeFile","submitFiles","updateNotes","emailError","zipError","findEnabled","findOrder","nameError","phoneError","intlPhone","issueProduct","updateAddressDetails","subhead","productName","productChoices","focusedIndex","showCustomProductForm","customProduct","customMaterial","chooseProduct","findProduct","go","isArrowKey","focusItem","selectHighlighted","ctrlKey","shiftKey","hideDropdown","startArrowKeys","productChoice","focusNext","focusPrevious","$$selectedVal","ProductChooser","productIssueQuantities","missingProductIndex","selectedProductIndex","prevIssues","updateProductIssueQuantity","missing","trackingNumbers","trackingNumber","inc","toggleProduct","selectedPartsIndices","handleOtherPart","handleMissingPart","clipboardCopied","clipboardTimeout","canCopyToClipboard","clipboard","writeText","copied","copyToClipboard","clipboardText","requestedRemedies","caseRecordTypeFilters","concernFilterKeys","objToHTML","orderInfo","issuesInfo","indent","nbsps","reload","part","caseNumber","RA","emailFormattedRequest","Start","MultiNode","Reason","SelectConcern","Information","PhotoUploader","ContactInformation","ProductFinder","OrderFinder","PartsMissing","Submit","End","onhashchange","setIssueUnsolved","setIssueSolved","sfraCartNumber","openMenu","cartNumber","newCartNumber","extra_small","small","wide","extra_wide","QuizApp","BookmarkApp","WizardApp","ProductHelpApp","CartIcon","resetShopSiteAccount","itemsTotalQuantity","totals","grandTotal"],"sourceRoot":""}