{"version":3,"sources":["webpack:///10.a960453caa80548c4a43.songbird.js","webpack:///./models/midasRequest.js?9175","webpack:///./utilities/storageUtility.js?f4f3","webpack:///./~/cookies-js/dist/cookies.js?2228","webpack:///./~/simplestorage.js/simpleStorage.min.js?a8c9","webpack:///./messages/init.js","webpack:///./constants/payments.js","webpack:///./utilities/supportedPaymentsUtility.js","webpack:///./messages/start.js","webpack:///./constants/responseValidationType.js","webpack:///./messages/validate.js","webpack:///./events/postMessageHandler.js","webpack:///./utilities/acsTimingUtility.js","webpack:///./messages/continue.js"],"names":["songbirdLoader","117","module","exports","__webpack_require__","MidasRequest","consumerSessionId","serverJWT","order","paymentType","this","ClientAgent","configs","getSystemConfig","client","ClientVersion","version","ConsumerSessionId","ServerJWT","undefined","OrderDetails","Consumer","BillingAddress","ShippingAddress","Account","Cart","Token","Authorization","Options","CCAExtension","Order","PaymentType","prototype","generateOrderRequest","BrowserPayload","Client","Agent","Version","generateGenericRequest","118","cache","cookieHelper","log","getLoggerInstance","storageHelper","localStorageAvailable","canUse","debug","cookiesEnabled","enabled","publicMethods","put","key","value","expiration","elapsedMillis","currentTime","Date","options","getTime","TTL","set","expires","storage","get","error","119","__WEBPACK_AMD_DEFINE_RESULT__","global","factory","window","document","Error","Cookies","arguments","length","_document","_cacheKeyPrefix","_maxExpireDate","defaults","path","secure","_cachedDocumentCookie","cookie","_renewCache","_cache","decodeURIComponent","_getExtendedOptions","_getExpiresDate","_generateCookieString","expire","domain","_isValidDate","date","Object","toString","call","isNaN","now","Infinity","replace","encodeURIComponent","cookieString","toUTCString","_getCacheFromString","documentCookie","cookieCache","cookiesArray","split","i","cookieKvp","_getKeyValuePairFromCookieString","separatorIndex","indexOf","decodedKey","substr","e","console","_areEnabled","testKey","areEnabled","cookiesExport","120","__WEBPACK_AMD_DEFINE_FACTORY__","a","b","p","j","d","g","addEventListener","persisted","c","attachEvent","localStorage","getItem","n","JSON","parse","o","f","setItem","stringify","k","String","h","clearTimeout","q","__simpleStorage_meta","keys","setTimeout","Math","min","splice","Number","hasOwnProperty","push","max","code","t","s","removeItem","number","u","name","l","r","message","m","v","status","deleteKey","hasKey","getTTL","setTTL","flush","index","storageSize","121","_","configManager","CONST_ERRORS","CONST_EVENTS","CONST_GENERAL","CONST_PAYMENTS","CorsClient","dfLibrary","deviceFingerprinterUtility","events","GeneralError","generalUtility","jwtUtility","logger","htmlUtility","passiveEvents","passive","RSVP","supportedPaymentsUtility","endpointMonitor","midasClient","midas","base","getMerchantConfig","timeout","captureXhr","midasPath","methods","process","info","merchantJwt","VALIDATION","JWT","MISSING","NUMBER","DESCRIPTION","CONSUMER_SESSION_ID_KEY","initRequest","orderObject","supportsAlternativePayments","getCurrentSupportedList","SupportsAlternativePayments","post","then","unpackResponseJwt","midasResponse","dfCompletionTimePromise","decodedObject","deviceFingerprinting","shouldRunFingerprinting","Payload","URLs","urls","DeviceFingerprint","Base","queryString","constructQueryParameterString","QueryParameters","browser","URLS","DEVICE_FINGERPRINTER","BROWSER_RENDER","profileBin","BIN_RENDER","HostedFields","hostedFields","optimizelyFlags","OptimizelyFlags","SongbirdPostMessageValidation","songbirdPostmessageValidation","profileOnInit","catch","warn","Promise","resolve","parseEnabledFeatures","initUtils","parsePayments","moduleState","publish","SETUP_COMPLETE","sessionId","modules","handleError","MIDAS","INIT","GENERAL","response","reject","moduleLoadingResults","initTimerStart","initTimer","payments","hasInitiatedPayments","EnabledCCA","promiseFactory","CCA","require","init","captureTiming","getCurrentScript","EnabledApplePay","InitiatedPayments","ApplePay","APPLE_PAY","EnabledDiscover","DISCOVER","EnabledHostedFields","HOSTED_FIELDS","EnabledPaypal","configurationData","Paypal","PAYPAL","EnabledVisaCheckout","VisaCheckout","VISACHECKOUT","enableAjaxLogging","initTimeout","allSettled","modulePromiseResults","finally","generateSetupCompleteObject","setup","eventCompleted","modulesLoaded","flushAll","payment","deferredCompletion","defer","startLoadTime","paymentLoadingTimeout","type","paymentLoadTimeout","subscribe","INTERNAL","BUTTON_LOADED","isLoaded","data","endLoadTime","promise","each","moduleReport","state","reason","loaded","122","WALLET","123","mergedGenericButtonConfigurations","genericButtonResults","specificPaymentOverridesResults","merchantOverrideConfigurations","buttonPaymentBrands","omit","toLowerCase","resultObject","cca","object","button","merge","lookForGenericButton","containerId","lookForSpecificButtons","lookForHostedFields","doesGenericDivExist","checkForButtonWithinDiv","configurationObject","keyValue","isEmpty","doesSpecificButtonDivExist","returnValue","formFields","missingElements","filter","minimumFields","requiredFieldKey","field","tagName","elementId","getElementById","124","CONST_RESPONSE_VALIDATION_TYPE","uiManager","paymentDetails","startCallback","responseValidationType","startRequest","FULL","rawResponseJwt","decodedResponse","NONE","CardinalJWT","parseResponse","rawJwt","parseError","loader","hide","START","SELECTED","125","126","responseMapper","validateCallback","validateCallbackResult","validateRequest","PaymentProcessorTransactionId","ProcessorPaymentType","parsedResponse","map","to","merchantResponse","VALIDATED","VALIDATE","FINISHED","127","CONST_MESSAGES","internalEvents","ServiceError","acsTimingUtility","receiveMessage","event","mappedResponse","requestObject","responseJwt","foundMidasDomain","find","postMessageDomains","origin","ErrorNumber","MALFORMED_JWT","ErrorDescription","plugin","close","jwtParseError","Type","HOSTED_FIELD_REQUEST_RECEIVED","CCA_REQUEST_RECEIVED","DF_REQUEST_RECEIVED","jsonParseError","endTiming","capture","getElapsed","getRedirects","bind","MESSAGE","128","numberOfRedirects","start","end","startTiming","loadHandler","129","continueCallback","deferred","continueRequest","CONTINUE"],"mappings":"AAAAA,gBAAgB,KAEVC,IACA,SAAUC,EAAQC,EAASC,GCDjC,QAAAC,GAAAC,EAAAC,EAAAC,EAAAC,GACAC,KAAAC,YAAAC,EAAAC,kBAAAC,OACAJ,KAAAK,cAAAH,EAAAC,kBAAAG,QACAN,KAAAO,kBAAAX,EACAI,KAAAQ,UAAAX,EAEA,OAAAC,GAAAW,SAAAX,EACAA,GACAY,gBACAC,UACAC,kBACAC,mBACAC,YAEAC,QACAC,SACAC,iBACAC,WACAC,iBAEGV,SAAAX,IACHA,EAAAY,aAAAZ,EAAAY,iBACAZ,EAAAa,SAAAb,EAAAa,aACAb,EAAAa,SAAAC,eAAAd,EAAAa,SAAAC,mBACAd,EAAAa,SAAAE,gBAAAf,EAAAa,SAAAE,oBACAf,EAAAa,SAAAG,QAAAhB,EAAAa,SAAAG,YACAhB,EAAAiB,KAAAjB,EAAAiB,SACAjB,EAAAkB,MAAAlB,EAAAkB,UACAlB,EAAAmB,cAAAnB,EAAAmB,kBACAnB,EAAAoB,QAAApB,EAAAoB,YACApB,EAAAqB,aAAArB,EAAAqB,kBAGAnB,KAAAoB,MAAAtB,EACAE,KAAAqB,YAAAtB,EApCA,GAAAG,GAAAR,EAAA,GAuCAC,GAAA2B,UAAAC,qBAAA,WACA,OACAC,gBACAH,YAAArB,KAAAqB,YACAD,MAAApB,KAAAoB,OAEAK,QACAC,MAAA1B,KAAAC,YACA0B,QAAA3B,KAAAK,eAEAE,kBAAAP,KAAAO,kBACAC,UAAAR,KAAAQ,YAIAb,EAAA2B,UAAAM,uBAAA,WACA,OACAH,QACAC,MAAA1B,KAAAC,YACA0B,QAAA3B,KAAAK,eAEAE,kBAAAP,KAAAO,kBACAC,UAAAR,KAAAQ,YAIAhB,EAAAC,QAAAE,GDUMkC,IACA,SAAUrC,EAAQC,EAASC,GE5EjC,GAAAoC,GAAApC,EAAA,GACAqC,EAAArC,EAAA,KACAsC,EAAAtC,EAAA,IAAAuC,kBAAA,uBACAC,EAAAxC,EAAA,IAGAe,UAAAqB,EAAAK,wBACAL,EAAAK,sBAAAD,EAAAE,SACAJ,EAAAK,MAAA,qBAAAP,EAAAK,yBAAA,+BAGA1B,SAAAqB,EAAAQ,iBACAR,EAAAQ,eAAAP,EAAAQ,QACAP,EAAAK,MAAA,gBAAAN,EAAAQ,QAAA,uBAIA,IAAAC,IAOAC,IAAA,SAAAC,EAAAC,EAAAC,GACA,GAEAC,GAFAC,EAAA,GAAAC,MACAC,IAGAlB,GAAAK,uBAEAS,IACAC,EAAAC,EAAAG,UAAAL,EAAAK,UACAD,GACAE,IAAAL,IAIAX,EAAAiB,IAAAT,EAAAC,EAAAK,IACKjB,EAAAQ,SAELK,IACAI,GACAI,QAAAR,IAIAb,EAAAoB,IAAAT,EAAAC,EAAAK,IAEAlB,EAAAuB,QAAAX,GAAAC,GAQAW,IAAA,SAAAZ,GACA,GAAAZ,EAAAK,sBACA,MAAAD,GAAAoB,IAAAZ,EACK,IAAAZ,EAAAQ,eACL,MAAAP,GAAAuB,IAAAZ,EAEA,KACA,MAAAZ,GAAAuB,QAAAX,GACO,MAAAa,GAEP,WADAvB,GAAAuB,MAAA,4CAAAA,KAOA/D,GAAAC,QAAA+C,GFkFMgB,IACA,SAAUhE,EAAQC,EAASC,GG5JjC,GAAA+D,IAMA,SAAAC,EAAAjD,GACA,YAEA,IAAAkD,GAAA,SAAAC,GACA,mBAAAA,GAAAC,SACA,SAAAC,OAAA,0DAGA,IAAAC,GAAA,SAAArB,EAAAC,EAAAK,GACA,WAAAgB,UAAAC,OACAF,EAAAT,IAAAZ,GAAAqB,EAAAZ,IAAAT,EAAAC,EAAAK,GAyIA,OArIAe,GAAAG,UAAAN,EAAAC,SAIAE,EAAAI,gBAAA,UAEAJ,EAAAK,eAAA,GAAArB,MAAA,iCAEAgB,EAAAM,UACAC,KAAA,IACAC,QAAA,GAGAR,EAAAT,IAAA,SAAAZ,GACAqB,EAAAS,wBAAAT,EAAAG,UAAAO,QACAV,EAAAW,aAGA,IAAA/B,GAAAoB,EAAAY,OAAAZ,EAAAI,gBAAAzB,EAEA,OAAAC,KAAAlC,IAAAmE,mBAAAjC,IAGAoB,EAAAZ,IAAA,SAAAT,EAAAC,EAAAK,GAMA,MALAA,GAAAe,EAAAc,oBAAA7B,GACAA,EAAAI,QAAAW,EAAAe,gBAAAnC,IAAAlC,GAAA,EAAAuC,EAAAI,SAEAW,EAAAG,UAAAO,OAAAV,EAAAgB,sBAAArC,EAAAC,EAAAK,GAEAe,GAGAA,EAAAiB,OAAA,SAAAtC,EAAAM,GACA,MAAAe,GAAAZ,IAAAT,EAAAjC,EAAAuC,IAGAe,EAAAc,oBAAA,SAAA7B,GACA,OACAsB,KAAAtB,KAAAsB,MAAAP,EAAAM,SAAAC,KACAW,OAAAjC,KAAAiC,QAAAlB,EAAAM,SAAAY,OACA7B,QAAAJ,KAAAI,SAAAW,EAAAM,SAAAjB,QACAmB,OAAAvB,KAAAuB,SAAA9D,EAAAuC,EAAAuB,OAAAR,EAAAM,SAAAE,SAIAR,EAAAmB,aAAA,SAAAC,GACA,wBAAAC,OAAA9D,UAAA+D,SAAAC,KAAAH,KAAAI,MAAAJ,EAAAlC,YAGAc,EAAAe,gBAAA,SAAA1B,EAAAoC,GAUA,GATAA,KAAA,GAAAzC,MAEA,gBAAAK,GACAA,MAAAqC,IACA1B,EAAAK,eAAA,GAAArB,MAAAyC,EAAAvC,UAAA,IAAAG,GACa,gBAAAA,KACbA,EAAA,GAAAL,MAAAK,IAGAA,IAAAW,EAAAmB,aAAA9B,GACA,SAAAU,OAAA,mEAGA,OAAAV,IAGAW,EAAAgB,sBAAA,SAAArC,EAAAC,EAAAK,GACAN,IAAAgD,QAAA,eAAAC,oBACAjD,IAAAgD,QAAA,aAAAA,QAAA,aACA/C,KAAA,IAAA+C,QAAA,yBAAAC,oBACA3C,OAEA,IAAA4C,GAAAlD,EAAA,IAAAC,CAMA,OALAiD,IAAA5C,EAAAsB,KAAA,SAA6CtB,EAAAsB,KAAA,GAC7CsB,GAAA5C,EAAAiC,OAAA,WAA+CjC,EAAAiC,OAAA,GAC/CW,GAAA5C,EAAAI,QAAA,YAAgDJ,EAAAI,QAAAyC,cAAA,GAChDD,GAAA5C,EAAAuB,OAAA,UAA+C,IAK/CR,EAAA+B,oBAAA,SAAAC,GAIA,OAHAC,MACAC,EAAAF,IAAAG,MAAA,SAEAC,EAAA,EAA2BA,EAAAF,EAAAhC,OAAyBkC,IAAA,CACpD,GAAAC,GAAArC,EAAAsC,iCAAAJ,EAAAE,GAEAH,GAAAjC,EAAAI,gBAAAiC,EAAA1D,OAAAjC,IACAuF,EAAAjC,EAAAI,gBAAAiC,EAAA1D,KAAA0D,EAAAzD,OAIA,MAAAqD,IAGAjC,EAAAsC,iCAAA,SAAAT,GAEA,GAAAU,GAAAV,EAAAW,QAAA,IAGAD,KAAA,EAAAV,EAAA3B,OAAAqC,CAEA,IACAE,GADA9D,EAAAkD,EAAAa,OAAA,EAAAH,EAEA,KACAE,EAAA5B,mBAAAlC,GACa,MAAAgE,GACbC,SAAA,kBAAAA,SAAApD,OACAoD,QAAApD,MAAA,qCAAAb,EAAA,IAAAgE,GAIA,OACAhE,IAAA8D,EACA7D,MAAAiD,EAAAa,OAAAH,EAAA,KAIAvC,EAAAW,YAAA,WACAX,EAAAY,OAAAZ,EAAA+B,oBAAA/B,EAAAG,UAAAO,QACAV,EAAAS,sBAAAT,EAAAG,UAAAO,QAGAV,EAAA6C,YAAA,WACA,GAAAC,GAAA,aACAC,EAAA,MAAA/C,EAAAZ,IAAA0D,EAAA,GAAAvD,IAAAuD,EAEA,OADA9C,GAAAiB,OAAA6B,GACAC,GAGA/C,EAAAxB,QAAAwB,EAAA6C,cAEA7C,GAEAgD,EAAArD,GAAA,gBAAAA,GAAAG,SAAAF,EAAAD,GAAAC,CAIAF,GAAA,WAA4B,MAAAsD,IAAwBzB,KAAA7F,EAAAC,EAAAD,EAAAD,KAAAiE,IAAAhD,IAAAjB,EAAAC,QAAAgE,KAYnD,mBAAAG,QAAA5D,KAAA4D,SHkKKoD,IACA,SAAUxH,EAAQC,EAASC,GI9UjC,GAAAuH,GAAAxD;CACA,SAAAyD,EAAAC,GAAe,YAAaF,GAAA,EAAAxD,EAAA,kBAAAwD,KAAA3B,KAAA7F,EAAAC,EAAAD,EAAAD,GAAAyH,IAAAxG,SAAAgD,IAAAjE,EAAAC,QAAAgE,KAAmHzD,KAAA,WAAiB,YAAa,SAAAkH,KAAaE,EAAAC,IAAAC,IAAAC,IAAAJ,IAAA,oBAAAvD,gBAAA4D,iBAAA,oBAAAN,GAA8FA,EAAAO,WAAAC,MAAiB,GAAAN,GAAA,EAAU,QAAAD,KAAa,oBAAAvD,eAAA4D,iBAAA,UAAAE,GAAA,GAAA7D,SAAA8D,YAAA,YAAAD,GAAwG,QAAAA,KAAa,IAAIJ,IAAI,MAAAJ,GAAS,YAAAE,GAAA,GAAkBG,IAAI,QAAAD,KAAa,GAAAJ,GAAAU,aAAAC,QAAA,gBAA4C,KAAIC,EAAAC,KAAAC,MAAAd,OAAoB,MAAAC,GAASW,KAAKG,EAAAC,IAAM,QAAAxB,KAAa,IAAIkB,aAAAO,QAAA,gBAAAJ,KAAAK,UAAAN,IAAAG,EAAAC,IAA8D,MAAAhB,GAAS,MAAAmB,GAAAnB,GAAY,SAAS,QAAAgB,KAAa,GAAAhB,GAAAU,aAAAC,QAAA,gBAA4C,OAAAX,GAAAoB,OAAApB,GAAAjD,OAAA,EAA4B,QAAAsD,KAAa,GAAAL,GAAAC,EAAAO,EAAAJ,EAAAY,EAAAK,EAAA,IAAAlB,EAAA,CAAwB,IAAAmB,aAAAC,GAAAX,KAAAY,sBAAAZ,EAAAY,qBAAAxF,IAAA,CAA0E,IAAAgE,GAAA,GAAAnE,MAAAmF,EAAAJ,EAAAY,qBAAAxF,IAAAyF,SAAArB,EAAAQ,EAAAY,qBAAAxF,IAAA8B,WAA6FmC,EAAA,EAAAO,EAAAQ,EAAAjE,OAAgByD,EAAAP,EAAIA,IAAA,CAAK,KAAAG,EAAAY,EAAAf,KAAAD,GAAA,CAAkBI,EAAAY,EAAAf,IAAAoB,MAAAjB,EAAAY,EAAAf,IAAuB,OAAME,UAAAS,GAAAI,EAAAf,UAAAG,GAAAY,EAAAf,IAAkCoB,IAAA,MAAAE,EAAAG,WAAArB,EAAAsB,KAAAC,IAAAP,EAAArB,EAAA,cAAAG,IAAAa,EAAAa,OAAA,EAAA1B,GAAAlB,IAAAO,MAAgF,QAAA6B,GAAArB,EAAAC,GAAgB,GAAAO,GAAAJ,EAAAZ,GAAA,GAAA3D,MAAAmF,GAAA,CAAyB,IAAAf,EAAA6B,OAAA7B,IAAA,MAAAA,EAAA,CAAyB,IAAAW,EAAAmB,eAAA/B,GAAA,QAAiC,IAAAY,EAAAY,uBAAAZ,EAAAY,yBAAqDZ,EAAAY,qBAAAxF,MAAA4E,EAAAY,qBAAAxF,KAA2D8B,UAAS2D,UAASb,EAAAY,qBAAAxF,IAAA8B,OAAAkC,GAAAR,EAAAS,EAAAW,EAAAY,qBAAAxF,IAAA8B,OAAAiE,eAAA/B,GAAA,IAAAQ,EAAA,EAAAJ,EAAAQ,EAAAY,qBAAAxF,IAAAyF,KAAA1E,OAAgJqD,EAAAI,EAAIA,IAAAI,EAAAY,qBAAAxF,IAAAyF,KAAAjB,KAAAR,GAAAY,EAAAY,qBAAAxF,IAAAyF,KAAAI,OAAArB,EAAsF,KAAAA,EAAA,EAAAJ,EAAAQ,EAAAY,qBAAAxF,IAAAyF,KAAA1E,OAAiDqD,EAAAI,EAAIA,IAAA,GAAAI,EAAAY,qBAAAxF,IAAA8B,OAAA8C,EAAAY,qBAAAxF,IAAAyF,KAAAjB,IAAAhB,EAAAS,EAAA,CAAkFW,EAAAY,qBAAAxF,IAAAyF,KAAAI,OAAArB,EAAA,EAAAR,GAAAgB,GAAA,CAAmD,OAAMA,GAAAJ,EAAAY,qBAAAxF,IAAAyF,KAAAO,KAAAhC,OAA2C,IAAAY,KAAAY,sBAAAZ,EAAAY,qBAAAxF,IAAA,CAA+D,GAAA4E,EAAAY,qBAAAxF,IAAA8B,OAAAiE,eAAA/B,GAAA,UAAAY,GAAAY,qBAAAxF,IAAA8B,OAAAkC,GAAAQ,EAAA,EAAAJ,EAAAQ,EAAAY,qBAAAxF,IAAAyF,KAAA1E,OAAoJqD,EAAAI,EAAIA,IAAA,GAAAI,EAAAY,qBAAAxF,IAAAyF,KAAAjB,KAAAR,EAAA,CAA+CY,EAAAY,qBAAAxF,IAAAyF,KAAAI,OAAArB,EAAA,EAA4C,OAAMvB,IAAI,MAAAqC,cAAAC,GAAAX,KAAAY,sBAAAZ,EAAAY,qBAAAxF,KAAA4E,EAAAY,qBAAAxF,IAAAyF,KAAA1E,SAAAwE,EAAAG,WAAArB,EAAAsB,KAAAC,IAAAD,KAAAM,IAAArB,EAAAY,qBAAAxF,IAAA8B,OAAA8C,EAAAY,qBAAAxF,IAAAyF,KAAA,IAAAjC,EAAA,oBAAoP,QAAAP,KAAa,GAAAe,GAAAC,GAAA,EAAAO,GAAA,CAAgB,KAAAI,MAAAY,qBAAA,MAAAvB,EAAwCW,GAAAY,qBAAAxF,MAAA4E,EAAAY,qBAAAxF,IAAAyF,KAAA1E,eAAA6D,GAAAY,qBAAAxF,IAAAiE,GAAA,EAA8G,KAAAD,IAAAY,GAAAY,qBAAA,GAAAZ,EAAAY,qBAAAO,eAAA/B,GAAA,CAA6EQ,GAAA,CAAK,OAAM,MAAAA,WAAAI,GAAAY,qBAAAvB,GAAA,GAAAA,EAAiD,QAAAE,KAAa,GAAAH,GAAAC,EAAA,CAAU,WAAAvD,OAAAgE,cAAA,iBAAAhE,QAAAgE,aAAA,KAAAV,GAAA,GAAApD,OAAA,4BAAAoD,EAAAkC,KAAAC,EAAAnC,CAA8H,KAAAtD,OAAAgE,aAAA,KAAAV,GAAA,GAAApD,OAAA,8BAAAoD,EAAAkC,KAAAE,EAAApC,CAAmF,KAAIC,EAAAvD,OAAAgE,aAAA3D,OAA6B,MAAAyD,GAAS,KAAAW,GAAAX,GAAW,IAAI9D,OAAAgE,aAAAO,QAAA,0BAAApF,KAAAyC,MAAAH,SAAA,KAAAzB,OAAAgE,aAAA2B,WAAA,2BAAyI,MAAA7B,GAAS,KAAAP,GAAAkB,EAAAX,IAAAR,EAAA,GAAApD,OAAA,4BAAAoD,EAAAkC,KAAAC,EAAAnC,GAAkE,SAAS,QAAAmB,GAAAnB,GAAc,GAAAC,EAAM,aAAAD,EAAAkC,MAAA,OAAAlC,EAAAkC,QAAA,qCAAA7C,QAAAW,EAAAsC,QAAA,GAAArC,EAAA,GAAArD,OAAA,+BAAAqD,EAAAiC,KAAAK,EAAAtC,GAAA,KAAAD,EAAAkC,MAAA,MAAAlC,EAAAkC,MAAAjC,EAAA,GAAArD,OAAA,4BAAAqD,EAAAiC,KAAAC,EAAAlC,GAAA,cAAAD,EAAAwC,MAAAvC,EAAA,GAAArD,OAAA,4BAAAqD,EAAAiC,KAAAC,EAAAlC,GAAAD,EAAiT,QAAAyC,GAAAzC,GAAc,IAAAA,EAAA,MAAA0C,GAAA,KAAA1C,CAAsB,QAAAA,EAAAkC,MAAe,IAAAE,GAAA,IAAAD,GAAA,IAAAI,GAAAG,EAAA1C,EAAAkC,IAA8B,MAAM,SAAAQ,EAAA1C,EAAAkC,MAAAlC,EAAAsC,QAAAtC,EAAA2C,SAAA3C,EAAAwC,KAA8C,MAAAxC,GAAS,GAAA4C,GAAA,QAAAhC,GAAA,EAAAG,EAAA,EAAAb,GAAA,EAAAqB,EAAA,KAAAmB,EAAA,KAAAN,EAAA,mBAAAD,EAAA,cAAAI,EAAA,mBAAqG,KAAIvC,IAAI,MAAA6C,GAASJ,EAAAI,GAAK,OAAOzJ,QAAAwJ,EAAAE,OAAAJ,EAAAxH,OAAA,WAAqC,aAAAwH,KAAAxC,GAAoBjE,IAAA,SAAA+D,EAAAC,EAAAO,GAAqB,4BAAAR,EAAA,QAAuC,KAAAY,EAAA,QAAe,uBAAAX,GAAA,MAAAnH,MAAAiK,UAAA/C,EAAkDQ,QAAQ,KAAIP,EAAAY,KAAAC,MAAAD,KAAAK,UAAAjB,IAAgC,MAAAG,GAAS,MAAAe,GAAAf,GAAY,MAAAQ,GAAAZ,GAAAC,EAAAoB,EAAArB,EAAAQ,EAAAxE,KAAA,GAAAwD,KAAgCwD,OAAA,SAAAhD,GAAoB,SAAAY,MAAAmB,eAAA/B,IAAA,yBAAAA,IAAgE5D,IAAA,SAAA4D,GAAiB,QAAAY,MAAAmB,eAAA/B,IAAA,yBAAAA,GAAAlH,KAAAmK,OAAAjD,GAAAY,EAAAZ,GAAA,SAAwF+C,UAAA,SAAA/C,GAAuB,SAAAY,GAAAZ,IAAAY,eAAAZ,GAAAqB,EAAArB,EAAA,GAAAR,MAA6C0D,OAAA,SAAAlD,EAAAC,GAAsB,QAAAW,IAAAS,EAAArB,EAAAC,GAAAT,MAAyByD,OAAA,SAAAjD,GAAoB,GAAAC,EAAM,UAAAW,MAAAmB,eAAA/B,MAAAY,EAAAY,sBAAAZ,EAAAY,qBAAAxF,KAAA4E,EAAAY,qBAAAxF,IAAA8B,QAAA8C,EAAAY,qBAAAxF,IAAA8B,OAAAiE,eAAA/B,IAAAC,EAAA0B,KAAAM,IAAArB,EAAAY,qBAAAxF,IAAA8B,OAAAkC,IAAA,GAAAnE,OAAA,KAAAoE,IAAA,SAAwPkD,MAAA,WAAkB,IAAAvC,EAAA,QAAeA,KAAK,KAAI,MAAAF,cAAA2B,WAAA,oBAAmD,MAAArC,GAAS,MAAAmB,GAAAnB,KAAaoD,MAAA,WAAkB,IAAAxC,EAAA,QAAe,IAAAZ,GAAAC,IAAW,KAAAD,IAAAY,KAAAmB,eAAA/B,IAAA,yBAAAA,GAAAC,EAAA+B,KAAAhC,EAAsE,OAAAC,IAASoD,YAAA,WAAwB,MAAAtC,QJoV31JuC,IACA,SAAUhL,EAAQC,EAASC,GKjVjC,GAAA+K,GAAA/K,EAAA,IACAoC,EAAApC,EAAA,GACAgL,EAAAhL,EAAA,IACAiL,EAAAjL,EAAA,IACAkL,EAAAlL,EAAA,IACAmL,EAAAnL,EAAA,IACAoL,EAAApL,EAAA,KACAqL,EAAArL,EAAA,IACAsL,EAAAtL,EAAA,IACAuL,EAAAvL,EAAA,IACAwL,EAAAxL,EAAA,IACAyL,EAAAzL,EAAA,IACA0L,EAAA1L,EAAA,IACA2L,EAAA3L,EAAA,IACA4L,EAAA5L,EAAA,IACAsC,EAAAsJ,EAAArJ,kBAAA,qBACAsJ,EAAA7L,EAAA,IACAC,EAAAD,EAAA,KACA8L,EAAAN,EAAAO,QACAC,EAAAhM,EAAA,IACA2D,EAAA3D,EAAA,KACAiM,EAAAjM,EAAA,IAEAA,GAAA,KACAA,EAAA,KACAA,EAAA,IAEA,IAAAkM,GAAAlM,EAAA,IACAmM,EAAA,GAAAd,GAAAL,EAAAvK,kBAAA2L,MAAAC,KAAA,eAAArB,EAAAsB,oBAAAC,QAAA,UAAAL,EAAAM,YACAC,EAAA,QAEAC,GACAC,QAAA,WACA,IAGA,GAFArK,EAAAsK,KAAA,+BAEAxK,EAAAyK,YA6FA,SAAApB,GAAAR,EAAA6B,WAAAC,IAAAC,QAAAC,OAAAhC,EAAA6B,WAAAC,IAAAC,QAAAE,YA5FA,IAAAhN,GAAAyD,EAAAC,IAAAuH,EAAAgC,0BAAA,KACAC,EAAA,GAAAnN,GAAAC,EAAAkC,EAAAyK,YAAAzK,EAAAiL,aAAAxL,uBACAyL,EAAArB,EAAAsB,yBAEAH,GAAAtL,eAAA0L,4BAAAF,EAEAnB,EAAAsB,KAAAhB,EAAAW,GACAM,KAAA/B,EAAAgC,mBACAD,KAAA,SAAAE,GACA,GAAAC,GAAA,IAoBA,KAlBAT,EAAAvM,mBAAA+M,EAAAE,cAAAjN,mBACAyB,EAAAK,MAAA,mCACAgB,EAAAZ,IAAAoI,EAAAgC,wBAAAS,EAAAE,cAAAjN,mBACAuB,EAAAlC,kBAAA0N,EAAAE,cAAAjN,kBACAuB,EAAA2L,qBAAAC,yBAAA,GACaZ,EAAAvM,oBAAA+M,EAAAE,cAAAjN,mBACbyB,EAAAK,MAAA,4CACAP,EAAAlC,oBAGAkC,EAAA2L,qBAAAC,yBAAA,IAEA1L,EAAAK,MAAA,wCACAgB,EAAAZ,IAAAoI,EAAAgC,wBAAAS,EAAAE,cAAAjN,mBACAuB,EAAAlC,kBAAA0N,EAAAE,cAAAjN,kBACAuB,EAAA2L,qBAAAC,yBAAA,GAGAJ,EAAAE,cAAAG,QAAAC,KAAA,CACA,GAAAC,GAAAP,EAAAE,cAAAG,QAAAC,IAEAC,GAAAC,oBACAhM,EAAA2L,qBAAAI,KAAA9B,KAAA8B,EAAAC,kBAAAC,KACAjM,EAAA2L,qBAAAI,KAAAG,YAAA/C,EAAAgD,8BAAAJ,EAAAC,kBAAAI,iBACApM,EAAA2L,qBAAAI,KAAAM,QAAArM,EAAA2L,qBAAAI,KAAA9B,KAAAlB,EAAAuD,KAAAC,qBAAAC,eAAAxM,EAAA2L,qBAAAI,KAAAG,YACAlM,EAAA2L,qBAAAI,KAAAU,WAAAzM,EAAA2L,qBAAAI,KAAA9B,KAAAlB,EAAAuD,KAAAC,qBAAAG,WAAA1M,EAAA2L,qBAAAI,KAAAG,aAGAH,EAAAY,eACA3M,EAAA+L,KAAAa,aAAAb,EAAAY,cAGA,GAAAE,GAAArB,EAAAE,cAAAG,QAAAiB,eACAnO,UAAAkO,EACA,iCAAAA,MAAAE,iCAAA,EAEA/M,EAAAgN,+BAAA,EAEA9M,EAAAK,MAAA,sDAGAL,EAAAK,MAAA,mCAIAP,EAAA2L,qBAAAC,yBACA1L,EAAAK,MAAA,+CACAkL,EAAAvC,EAAA+D,gBACAC,MAAA,WACAhN,EAAAiN,KAAA,oDAIA1B,EAAA,GAAA7B,GAAAwD,QAAA,SAAAC,GACAA,MAIAzE,EAAA0E,qBAAA9B,EAAAE,cAAAG,SAEA0B,EAAAC,cAAAhC,EAAAE,cAAAG,QAAAJ,GACAH,KAAA,SAAAmC,GACAvN,EAAAsK,KAAA,gDACAd,EAAAgE,QAAA5E,EAAA6E,gBACAC,UAAA5N,EAAAlC,kBACA+P,QAAAJ,MAGAP,MAAA,SAAAzL,GACAvB,EAAAuB,MAAA,sDAAAA,GACAiI,EAAAgE,QAAA5E,EAAA6E,gBACAC,UAAA5N,EAAAlC,kBACA+P,iBAIW,eAAApM,GACX6H,EAAAwE,YAAArM,EAAAoH,EAAAkF,MAAAC,KAAAnD,OAAAhC,EAAAkF,MAAAC,KAAAlD,eAMK,MAAArJ,GACL6H,EAAAwE,YAAArM,EAAAoH,EAAAoF,QAAApD,OAAAhC,EAAAoF,QAAAnD,gBAKAyC,GAOAC,cAAA,SAAAU,EAAAzC,GACA,UAAA7B,GAAAwD,QAAA,SAAAC,EAAAc,GACA,IACA,GAEAC,GAAAC,EAAAC,EAFAC,KACAC,GAAA,CAYA,IATA,qBAAAN,KACAM,GAAA,GAQA,cAAAN,MAAAO,cAAA,EACA,IACAF,EAAAnH,KAAAmG,EAAAmB,eAAA1F,EAAA2F,MACA/Q,EAAAgH,EAAA,YAAAgK,GACAhR,EAAA,KAAAiR,OAEA/E,EAAAgF,cAAArF,EAAAsF,sBAEW,MAAAtN,GACXvB,EAAAuB,MAAA,kBAAAuH,EAAA2F,IAAA,KAAAlN,GAIA,sBAAAyM,MAAAc,mBAAA,EACA,GAAArQ,SAAAuP,EAAAe,mBACA,eAAAf,GAAAe,mBAAAf,EAAAe,kBAAAC,mBAAA5L,QACA,IACAiL,EAAAnH,KAAAmG,EAAAmB,eAAA1F,EAAAmG,YACAvR,EAAAgH,EAAA,YAAAgK,GACAhR,EAAA,KAAAiR,KAAAX,EAAAe,kBAAAC,UAEApF,EAAAgF,cAAArF,EAAAsF,sBAEe,MAAAtN,GACfvB,EAAAuB,MAAA,kBAAAuH,EAAAmG,UAAA,KAAA1N,QAIAvB,GAAAuB,MAAA,qFAIA,uBAAAyM,MAAAkB,mBAAA,EACA,IACAb,EAAAnH,KAAAmG,EAAAmB,eAAA1F,EAAAqG,WACAzR,EAAAgH,EAAA,YAAAgK,GACAhR,EAAA,KAAAiR,OAEA/E,EAAAgF,cAAArF,EAAAsF,sBAEW,MAAAtN,GACXvB,EAAAuB,MAAA,kBAAAuH,EAAAqG,SAAA,KAAA5N,GAIA,0BAAAyM,MAAAoB,uBAAA,EACA,IACAf,EAAAnH,KAAAmG,EAAAmB,eAAA1F,EAAAuG,gBACA3R,EAAAgH,EAAA,YAAAgK,GACAhR,EAAA,KAAAiR,OAEA/E,EAAAgF,cAAArF,EAAAsF,sBAEW,MAAAtN,GACXvB,EAAAuB,MAAA,kBAAAuH,EAAAuG,cAAA,KAAA9N,GAIA,oBAAAyM,MAAAsB,iBAAA,GACA,GAAAC,EAEAjB,IAAA,UAAAN,GAAAe,oBACAQ,EAAAvB,EAAAe,kBAAAS,OAGA,KACAnB,EAAAnH,KAAAmG,EAAAmB,eAAA1F,EAAA2G,SACA/R,EAAAgH,EAAA,YAAAgK,GACAhR,EAAA,KAAAiR,KAAAY,GAEA3F,EAAAgF,cAAArF,EAAAsF,sBAEW,MAAAtN,GACXvB,EAAAuB,MAAA,kBAAAuH,EAAA2G,OAAA,KAAAlO,IAKA,0BAAAyM,MAAA0B,uBAAA,GAAApB,GACA,gBAAAN,GAAAe,mBAAA,gBAAAf,GAAAe,kBAAAY,aACA,IACAtB,EAAAnH,KAAAmG,EAAAmB,eAAA1F,EAAA8G,eACAlS,EAAAgH,EAAA,YAAAgK,GACAhR,EAAA,KAAAiR,KAAAX,EAAAe,kBAAAY,cAEA/F,EAAAgF,cAAArF,EAAAsF,sBAEa,MAAAtN,GACbvB,EAAAuB,MAAA,kBAAAuH,EAAA8G,aAAA,KAAArO,GAMAvB,EAAAK,MAAA,gBAAAgO,EAAApM,OAAA,6BAEAkM,EAAApN,KAAAyC,MACA4K,EAAAxH,WAAA,WACA0C,EAAAuG,kBAAAnH,EAAAvK,mBACA6B,EAAAuB,MAAA,0BACSmH,EAAAvK,kBAAA2R,aAETpG,EAAAqG,WAAA1B,GACAjD,KAAA,SAAA4E,GAKA,MAHA9B,GAAA8B,EAEAhQ,EAAAK,MAAA,sCAAAU,KAAAyC,MAAA2K,GAAA,OACA5C,IAEA0E,QAAA,WACA,IACA,GAAA1C,EAEA/G,cAAA4H,GACApO,EAAAK,MAAA,4CAAAU,KAAAyC,MAAA2K,GAAA,OAEAZ,EAAAF,EAAA6C,4BAAAhC,GAEApO,EAAAqQ,MAAAC,gBAAA,EACAtQ,EAAAqQ,MAAAE,cAAA9C,EAEAJ,EAAAI,GACa,MAAAhM,GACb0M,EAAA1M,GACa,QACbqI,EAAA0G,cAIO,MAAA/O,GACPvB,EAAAuB,MAAA,oDAAAA,GACA0M,EAAA1M,OAKAiN,eAAA,SAAA+B,GACA,GAAAC,GAAA9G,EAAA+G,QACAC,EAAA3P,KAAAyC,MACAmN,EAAA/J,WAAA,WACA5G,EAAAuB,MAAAgP,EAAA,yDACAC,EAAAvC,QACA2C,KAAAL,EACAhP,MAAA,yCAEOmH,EAAAvK,kBAAA0S,mBAqBP,OAlBA3H,GAAA4H,UAAAP,EAAA,IAAA3H,EAAAmI,SAAAC,cAAA,SAAAC,EAAAC,GACA,GAAAC,GAAApQ,KAAAyC,KACAxD,GAAAK,MAAA,YAAAkQ,EAAA,iBAAAY,EAAAT,GAAA,OACAlK,aAAAmK,GACAM,EACAT,EAAArD,SACAyD,KAAAL,EACAW,SAGAV,EAAAvC,QACA2C,KAAAL,EACAW,WAMAV,EAAAY,SAOAlB,4BAAA,SAAAhC,GACA,GAAAX,KAWA,OAVA9E,GAAA4I,KAAAnD,EAAA,SAAAoD,GACA,GAAA9T,IACAA,OAAA,cAAA8T,EAAAC,MAAAD,EAAA3Q,MAAAiQ,KAAAU,EAAAE,OAAAZ,KACAa,OAAA,cAAAH,EAAAC,MAEA9S,UAAA6S,EAAAJ,OACA1T,EAAA0T,KAAAI,EAAAJ,MAEA3D,EAAArG,KAAA1J,KAEA+P,GAIA/P,GAAAC,QAAA2M,GL4VMsH,IACA,SAAUlU,EAAQC,GMhsBxBD,EAAAC,SACAgR,IAAA,MACAU,SAAA,iBACAM,OAAA,SACAG,aAAA,eACA+B,OAAA,SACA1C,UAAA,WACAI,cAAA,iBNusBMuC,IACA,SAAUpU,EAAQC,EAASC,GO5sBjC,GAAA+K,GAAA/K,EAAA,IACAoC,EAAApC,EAAA,GACAoL,EAAApL,EAAA,KACAgL,EAAAhL,EAAA,IACAsC,EAAAtC,EAAA,IAAAuC,kBAAA,iCAEAO,GAKAyK,wBAAA,WACA,GAGA4G,GAAAC,EAAAC,EAHAC,KAEAC,EAAAxJ,EAAAyJ,KAAAxJ,EAAAvK,kBAAAkQ,UAAAvF,EAAA2F,IAAA0D,cAAArJ,EAAAuG,gBAEA+C,GACAC,KAAA,EAqBA,OAlBA5J,GAAA4I,KAAA3I,EAAAsB,oBAAA,SAAAsI,EAAA5R,GACAA,IAAAuR,IACA,UAAAK,IAAA,eAAAA,GAAAC,SACAP,EAAAtR,GAAA4R,KAMAT,EAAApJ,EAAA+J,SAAkD9J,EAAAvK,kBAAAoU,OAAA7J,EAAAsB,oBAAAuG,QAAAgC,QAElDT,EAAAtR,EAAAiS,qBAAAZ,EAAAa,YAAAT,GACAF,EAAAvR,EAAAmS,uBAAAX,GAEAI,EAAAtJ,EAAAuG,eAAA7O,EAAAoS,sBAEAR,EAAA3J,EAAA+J,MAAAJ,EAAAN,EAAAC,IAUAU,qBAAA,SAAAC,EAAAT,GACA,GAAAY,GAAArS,EAAAsS,wBAAAJ,GACAN,IAUA,OARA3J,GAAA4I,KAAAY,EAAA,SAAAc,EAAArS,GACA,GAAAsS,GAAAtS,EAAAyR,aACAC,GAAAY,GAAAH,EACA,QAAAE,KACAX,EAAAW,EAAAnC,MAAAiC,KAIAT,GAOAO,uBAAA,SAAAX,GACA,GAAAI,KAcA,OAZA3J,GAAAwK,QAAAjB,IACAvJ,EAAA4I,KAAAW,EAAA,SAAAe,EAAArS,GACA,GAAAsS,GAAAtS,EAAAyR,cACAe,EAAA1S,EAAAsS,wBAAAC,EAAAR,OAAAG,YAEAN,GAAAY,GAAAE,EACA,QAAAH,KACAX,EAAAW,EAAAnC,MAAAsC,KAKAd,GAMAQ,oBAAA,WACA,GAAAO,IAAA,CACA,IAAA1U,SAAAqB,EAAAsT,WAAA,CAEA,GAAAC,GAAA5K,EAAA6K,OAAA5K,EAAAvK,kBAAAkQ,SAAA3B,aAAA6G,cAAA,SAAAC,GACA,GAAAC,GAAA3T,EAAAsT,WAAAI,EACA,SAAA/U,SAAAgV,GAAA,WAAAA,IAAA,QAAAA,EAAAC,WAGA1T,EAAAsK,KAAA,6CAAAkJ,IACA,IAIA,KAAAH,EAAApR,SACAkR,GAAA,GAIA,MAAAA,IAOAL,wBAAA,SAAAa,GACA,cAAA9R,SAAA+R,eAAAD,IAIAnW,GAAAC,QAAA+C,GPqtBMqT,IACA,SAAUrW,EAAQC,EAASC,GQ10BjC,GAWA8C,GAXAV,EAAApC,EAAA,GACAgL,EAAAhL,EAAA,IACAqL,EAAArL,EAAA,IACAiL,EAAAjL,EAAA,IACAkL,EAAAlL,EAAA,IACAmL,EAAAnL,EAAA,IACAoW,EAAApW,EAAA,KACAwL,EAAAxL,EAAA,IACA0L,EAAA1L,EAAA,IACA2L,EAAA3L,EAAA,IACAsC,EAAAtC,EAAA,IAAAuC,kBAAA,sBAEAtC,EAAAD,EAAA,KACA2D,EAAA3D,EAAA,KACAqW,EAAArW,EAAA,IAEAkM,EAAAlM,EAAA,IACAmM,EAAA,GAAAd,GAAAL,EAAAvK,kBAAA2L,MAAAC,KAAA,eAAArB,EAAAsB,oBAAAC,QAAA,UAAAL,EAAAM,YACAC,EAAA,QAEA3J,IAQA6J,QAAA,SAAA2J,EAAAC,EAAAC,GAEA,IACAlU,EAAAsK,KAAA,+CAAA0J,EAAApD,KAAA,OAEA,IAAAuD,GAAA,GAAAxW,GAAA0D,EAAAC,IAAAuH,EAAAgC,yBAAA/K,EAAAyK,YAAAyJ,EAAA5U,MAAA4U,EAAApD,MAAArR,sBAMA,OAJAd,UAAAyV,IACAA,EAAAJ,EAAAM,MAGAvK,EAAAsB,KAAAhB,EAAAgK,GACA/I,KAAA,SAAAiJ,GACA,GAAAC,EACA,QAAAJ,GACA,QACA,IAAAJ,GAAAM,KACApU,EAAAK,MAAA,qDACAiU,EAAAjL,EAAAgC,kBAAAgJ,EACA,MACA,KAAAP,GAAAS,KACA,IACAvU,EAAAK,MAAA,oDACA5B,SAAA4V,GAAA5V,SAAA4V,EAAAG,YACAF,GACA9I,cAAAnC,EAAAoL,cAAAJ,EAAAG,aACAE,OAAAL,EAAAG,aAGAxU,EAAAK,MAAA,yDAEe,MAAAsU,GACf3U,EAAAsK,KAAA,iCAAAqK,IAMA,MAAAL,KAEAlJ,KAAA,SAAAE,GACAtL,EAAAsK,KAAA,yCAEAgB,EACA2I,GAAA,kBAAAA,GACAA,EAAA3I,GAEAtL,EAAAK,MAAA,4CAGAL,EAAAK,MAAA,iDAIA,eAAAkB,GACAwS,EAAAa,OAAA1L,OAAA2L,OACAzL,EAAAwE,YAAArM,EAAAoH,EAAAkF,MAAAiH,MAAAnK,OAAAhC,EAAAkF,MAAAiH,MAAAlK,eAGK,MAAArJ,GAEL,IACAwS,EAAAa,OAAA1L,OAAA2L,OACO,MAAAnQ,IAEP0E,EAAAwE,YAAArM,EAAAoH,EAAAoF,QAAApD,OAAAhC,EAAAoF,QAAAnD,gBAMA1B,EAAA4H,UAAAlI,EAAAmI,SAAAgE,SAAAvU,EAAA6J,SACA7M,EAAAC,QAAA+C,GRq1BMwU,IACA,SAAUxX,EAAQC,GS97BxBD,EAAAC,SAIA2W,KAAA,OAIAG,KAAA,STq8BMU,IACA,SAAUzX,EAAQC,EAASC,GU98BjC,GAAAoC,GAAApC,EAAA,GACAgL,EAAAhL,EAAA,IACAiL,EAAAjL,EAAA,IACAkL,EAAAlL,EAAA,IACAmL,EAAAnL,EAAA,IACAqL,EAAArL,EAAA,IACAwL,EAAAxL,EAAA,IACA0L,EAAA1L,EAAA,IACA2L,EAAA3L,EAAA,IACAsC,EAAAtC,EAAA,IAAAuC,kBAAA,yBACAtC,EAAAD,EAAA,KACA8L,EAAA9L,EAAA,IAAA+L,QACAyL,EAAAxX,EAAA,IACA2D,EAAA3D,EAAA,IAEAA,GAAA,IAEA,IAAAkM,GAAAlM,EAAA,IACAmM,EAAA,GAAAd,GAAAL,EAAAvK,kBAAA2L,MAAAC,KAAA,eAAArB,EAAAsB,oBAAAC,QAAA,UAAAL,EAAAM,YACAC,EAAA,YAEA3J,GAEA6J,QAAA,SAAA2J,EAAAmB,GACA,IACAnV,EAAAsK,KAAA,kDAAA0J,EAAApD,KAAA,OAEA,IACAwE,GADAC,EAAA,GAAA1X,GAAA0D,EAAAC,IAAAuH,EAAAgC,yBAAA/K,EAAAyK,YAAAyJ,EAAA5U,MAAA4U,EAAApD,MAAArR,sBAOA,OAJA8V,GAAA7V,eAAA8V,8BAAAtB,EAAAsB,8BAEAD,EAAA7V,eAAA+V,qBAAAvB,iBAEAnK,EAAAsB,KAAAhB,EAAAkL,GACAjK,KAAA/B,EAAAgC,mBACAD,KAAA,SAAAE,GAGA,GAFAtL,EAAAsK,KAAA,yCAEAgB,KAAAE,cAAAG,QAAA,CACA,GAAA6J,GAAAN,EAAAO,IAAA3L,MAAA4L,GAAAC,iBAAArK,EAAAE,cAAAG,QAEAwJ,IAAA,kBAAAA,IACAC,EAAAD,EAAAK,GACAhM,EAAAgE,QAAA5E,EAAAgN,UAAAR,EAAA9J,EAAAoJ,SAEA1U,EAAAK,MAAA,gDAGAL,GAAAK,MAAA,iDAIA,eAAAkB,GACA6H,EAAAwE,YAAArM,EAAAoH,EAAAkF,MAAAgI,SAAAlL,OAAAhC,EAAAkF,MAAAgI,SAAAjL,eAEK,MAAArJ,GACL6H,EAAAwE,YAAArM,EAAAoH,EAAAoF,QAAApD,OAAAhC,EAAAoF,QAAAnD,eAKA1B,GAAA4H,UAAAlI,EAAAmI,SAAA+E,SAAAtV,EAAA6J,SAEA7M,EAAAC,QAAA+C,GVo9BMuV,IACA,SAAUvY,EAAQC,EAASC,GWrhCjC,GAAA+K,GAAA/K,EAAA,IACAgL,EAAAhL,EAAA,IACAiL,EAAAjL,EAAA,IACAkL,EAAAlL,EAAA,IACAsY,EAAAtY,EAAA,IACAoC,EAAApC,EAAA,GACAuY,EAAAvY,EAAA,IACA6L,EAAA7L,EAAA,IACA2L,EAAA3L,EAAA,IACAsC,EAAAtC,EAAA,IAAAuC,kBAAA,kCACAmJ,EAAA1L,EAAA,IACA8L,EAAA9L,EAAA,IAAA+L,QACAyL,EAAAxX,EAAA,IACAwY,EAAAxY,EAAA,IACAqW,EAAArW,EAAA,IACAyY,EAAAzY,EAAA,KACAkM,EAAAlM,EAAA,IAEA8C,GACA4V,eAAA,SAAAC,GACA,GACA/B,GAAAgC,EAAAC,EADAC,EAAAH,EAAAnF,IAGA,KACA,GAAAuF,GAAAhO,EAAAiO,KAAAhO,EAAAvK,kBAAA2L,MAAA6M,mBAAA,SAAA1T,GACA,MAAAA,KAAAoT,EAAAO,QAGA,IAAAP,EAAAO,SAAAlO,EAAAvK,kBAAAkQ,SAAA3B,aAAAzJ,QAAAxE,SAAAgY,EAAA,CACA,IACA,GAAAD,EAAAvU,OAAA,EAOA,GAAAoU,EAAAnF,KAAA3M,QAAA,mBAEA,GADAgS,EAAAxQ,KAAAC,MAAAqQ,EAAAnF,QACAqF,EAAA/B,YAAAvS,OAAA,GAGe,CACfqU,EAAA,GAAAJ,GAAAK,GACAD,EAAAO,YAAAlO,EAAAmO,cAAAnM,OACA2L,EAAAS,iBAAApO,EAAAmO,cAAAlM,YACA4L,EAAA/X,MACA,KACAsV,EAAAiD,OAAA9N,OAAA+N,QACiB,MAAA1V,GACjBvB,EAAAK,MAAA,0BAAAkB,GAGA,WADAiI,GAAAgE,QAAA5E,EAAAgN,UAAAU,EAAAE,GAZAlC,EAAAjL,EAAArD,MAAAuQ,EAAA/B,aACAgC,EAAAD,EAAA/B,gBAgBAF,GAAAjL,EAAArD,MAAAqQ,EAAAnF,MAGS,MAAAgG,GACT,IAIA,GAFAX,EAAAxQ,KAAAC,MAAAqQ,EAAAnF,MAEAzS,SAAA8X,GAAA,eAAAA,IAAA,QAAAA,GAEA,OAAAA,EAAAY,MACA,kBAGA,WADAlB,GAAAzI,QAAA5E,EAAAmI,SAAAqG,+BAAA,EAAAb,EAEA,WAEA,WADAN,GAAAzI,QAAA5E,EAAAmI,SAAAsG,sBAAA,EAAAd,EAEA,UAEA,WADAN,GAAAzI,QAAA5E,EAAAmI,SAAAuG,qBAAA,EAAAf,EAEA,SAEA,WADAvW,GAAAuB,MAAA,yBAAAgV,EAAAY,KAAA,MAKW,MAAAI,GAEX,WADAvX,GAAAuB,MAAA,wCAAAgW,EAAA,cAAAlB,EAAAnF,KAAA,MAMA,IAEA,gBAAAoD,GAAA3I,UACA2I,EAAA3I,QAAA5F,KAAAC,MAAAsO,EAAA3I,UAGA3L,EAAAsK,KAAA,kCAAAvE,KAAAK,UAAAkO,EAAA,UAEA,KACAP,EAAAiD,OAAA9N,OAAA+N,QACW,MAAA1V,GACXvB,EAAAK,MAAA,qCAAAkB,GAEA+U,EAAApB,EAAAO,IAAA3L,MAAA4L,GAAAC,iBAAArB,EAAA3I,SACAwK,EAAAqB,YACA5N,EAAA6N,QAAA,aAAAtB,EAAAuB,cAAA,EAAAvB,EAAAwB,gBACS,MAAApW,GACTvB,EAAAK,MAAA,gBAAAkB,EAEA,KACA,GAAAiU,GAAAzP,KAAAC,MAAAwQ,EACA/X,UAAA+W,EAAAhB,cACAgB,EAAAzP,KAAAC,MAAAwP,EAAAhB,cAEA,WAAAgB,IAAA,eAAAA,KACAc,EAAA,GAAAJ,GAAAV,GACAgB,EAAA/X,OAEA,KACAsV,EAAAiD,OAAA9N,OAAA+N,QACe,MAAA1V,GACfvB,EAAAK,MAAA,qCAAAkB,IAIW,MAAAgW,GACXvX,EAAAuB,MAAA,4BAAAiV,EAAA,KAAAe,IAKA9Y,SAAA6X,EACA9M,EAAAgE,QAAA5E,EAAAgN,UAAAU,EAAAE,GACS1W,EAAAgN,+BACT1D,EAAAwE,YAAA,2BAAAjF,EAAAoF,QAAApD,OAAAhC,EAAAoF,QAAAnD,iBAGA5K,GAAAK,MAAA,mBAAAgW,EAAAO,OAAA,KAGK,MAAAlS,GAEL1E,EAAAK,MAAA,8CAAAqE,KAMA6E,GAAAqO,KAAA5B,EAAA6B,QAAAjW,OAAApB,EAAA4V,gBAEA5Y,EAAAC,QAAA+C,GX2hCMsX,IACA,SAAUta,EAAQC,GYnrCxB,GAAAsa,GACAC,EACAC,EACAzX,GAIA0X,YAAA,WACA1X,EAAAgX,YAEAO,EAAA,EACAC,EAAA,GAAAjX,MACAkX,EAAA,MAKAT,UAAA,WACAS,EAAA,GAAAlX,OAKAoX,YAAA,WACAJ,KAKAJ,aAAA,WACA,MAAAI,IAKAL,WAAA,WACA,MAAAO,GAAAD,GAIAxa,GAAAC,QAAA+C,GZyrCM4X,IACA,SAAU5a,EAAQC,EAASC,GaluCjC,GAAAoC,GAAApC,EAAA,GACAgL,EAAAhL,EAAA,IACAqL,EAAArL,EAAA,IACAiL,EAAAjL,EAAA,IACAkL,EAAAlL,EAAA,IACAmL,EAAAnL,EAAA,IACAwL,EAAAxL,EAAA,IACA0L,EAAA1L,EAAA,IACA2L,EAAA3L,EAAA,IACAsC,EAAAtC,EAAA,IAAAuC,kBAAA,yBACA2J,EAAAlM,EAAA,IACAmM,EAAA,GAAAd,GAAAL,EAAAvK,kBAAA2L,MAAAC,KAAA,eAAArB,EAAAsB,oBAAAC,QAAA,UAAAL,EAAAM,YACAC,EAAA,YACAxM,EAAAD,EAAA,KACAgM,EAAAhM,EAAA,IACA2D,EAAA3D,EAAA,KACAqW,EAAArW,EAAA,IAEA8C,GACA6J,QAAA,SAAA2J,EAAAqE,GACA,GAAAC,GAAA5O,EAAA+G,OAEA,KACAzQ,EAAAsK,KAAA,kDAAA0J,EAAApD,KAAA,OAEA,IAAA2H,GAAA,GAAA5a,GAAA0D,EAAAC,IAAAuH,EAAAgC,yBAAA/K,EAAAyK,YAAAyJ,EAAA5U,MAAA4U,EAAApD,MAAArR,sBAEAsK,GAAAsB,KAAAhB,EAAAoO,GACAnN,KAAA/B,EAAAgC,mBACAD,KAAA,SAAAE,GACAtL,EAAAsK,KAAA,4CAEAgB,EACA+M,GAAA,kBAAAA,IACAA,EAAA/M,GACAgN,EAAAnL,QAAA7B,KAEAtL,EAAAK,MAAA,yDACAiY,EAAAnL,QAAA7B,IAGAgN,EAAAnL,QAAA7B,KAIA,eAAA/J,GACAwS,EAAAa,OAAA1L,OAAA2L,OACAzL,EAAAwE,YAAArM,EAAAoH,EAAAkF,MAAA2K,SAAA7N,OAAAhC,EAAAkF,MAAA2K,SAAA5N,aACA0N,EAAArK,OAAA1M,KAGK,MAAAA,GAEL,IACAwS,EAAAa,OAAA1L,OAAA2L,OACAyD,EAAArK,OAAA1M,GACO,MAAAmD,IAEP0E,EAAAwE,YAAArM,EAAAoH,EAAAoF,QAAApD,OAAAhC,EAAAoF,QAAAnD,aAGA,MAAA0N,GAAAlH,SAIAlI,GAAA4H,UAAAlI,EAAAmI,SAAAyH,SAAAhY,EAAA6J,SACA7M,EAAAC,QAAA+C","file":"10.a960453caa80548c4a43.songbird.js","sourcesContent":["songbirdLoader([10],{\n\n/***/ 117:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar configs = __webpack_require__(24);\r\n\t\r\n\tfunction MidasRequest(consumerSessionId, serverJWT, order, paymentType) {\r\n\t this.ClientAgent = configs.getSystemConfig().client;\r\n\t this.ClientVersion = configs.getSystemConfig().version;\r\n\t this.ConsumerSessionId = consumerSessionId;\r\n\t this.ServerJWT = serverJWT;\r\n\t\r\n\t if (order === null || order === undefined) {\r\n\t order = {\r\n\t OrderDetails: {},\r\n\t Consumer: {\r\n\t BillingAddress: {},\r\n\t ShippingAddress: {},\r\n\t Account: {}\r\n\t },\r\n\t Cart: [],\r\n\t Token: {},\r\n\t Authorization: {},\r\n\t Options: {},\r\n\t CCAExtension: {}\r\n\t };\r\n\t } else if(order !== undefined){\r\n\t order.OrderDetails = order.OrderDetails || {};\r\n\t order.Consumer = order.Consumer || {};\r\n\t order.Consumer.BillingAddress = order.Consumer.BillingAddress || {};\r\n\t order.Consumer.ShippingAddress = order.Consumer.ShippingAddress || {};\r\n\t order.Consumer.Account = order.Consumer.Account || {};\r\n\t order.Cart = order.Cart || [];\r\n\t order.Token = order.Token || {};\r\n\t order.Authorization = order.Authorization || {};\r\n\t order.Options = order.Options || {};\r\n\t order.CCAExtension = order.CCAExtension || {};\r\n\t }\r\n\t\r\n\t this.Order = order;\r\n\t this.PaymentType = paymentType;\r\n\t}\r\n\t\r\n\tMidasRequest.prototype.generateOrderRequest = function () {\r\n\t return {\r\n\t BrowserPayload: {\r\n\t PaymentType: this.PaymentType,\r\n\t Order: this.Order,\r\n\t },\r\n\t Client: {\r\n\t Agent: this.ClientAgent,\r\n\t Version: this.ClientVersion,\r\n\t },\r\n\t ConsumerSessionId: this.ConsumerSessionId,\r\n\t ServerJWT: this.ServerJWT\r\n\t };\r\n\t};\r\n\t\r\n\tMidasRequest.prototype.generateGenericRequest = function () {\r\n\t return {\r\n\t Client: {\r\n\t Agent: this.ClientAgent,\r\n\t Version: this.ClientVersion,\r\n\t },\r\n\t ConsumerSessionId: this.ConsumerSessionId,\r\n\t ServerJWT: this.ServerJWT\r\n\t };\r\n\t};\r\n\t\r\n\tmodule.exports = MidasRequest;\r\n\n\n/***/ }),\n\n/***/ 118:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar cache = __webpack_require__(3),\r\n\t cookieHelper = __webpack_require__(119),\r\n\t log = __webpack_require__(15).getLoggerInstance('Base.StorageUtility'),\r\n\t storageHelper = __webpack_require__(120);\r\n\t\r\n\t// When we load the script we should evaluate the localstorage availablity immedately\r\n\tif (cache.localStorageAvailable === undefined) {\r\n\t cache.localStorageAvailable = storageHelper.canUse();\r\n\t log.debug(\"local storage is \" + (cache.localStorageAvailable === true ? \"available\" : \"unavailable\"));\r\n\t}\r\n\t\r\n\tif(cache.cookiesEnabled === undefined){\r\n\t cache.cookiesEnabled = cookieHelper.enabled;\r\n\t log.debug(\"Cookies are \" +(cookieHelper.enabled ? \"enabled\" : \"disabled\"));\r\n\t}\r\n\t\r\n\t// NEXTREV: Add option for if cookies are disabled. Most likely would only be in memory storage, but the issue needs to be considered more. \r\n\tvar publicMethods = {\r\n\t /**\r\n\t * Persist a KVP to storage that can be restored on a seperate page load\r\n\t * @param {string} key The key\r\n\t * @param {string} value The value\r\n\t * @param {Date=} expiration An optional date time the value should expire\r\n\t */\r\n\t put: function (key, value, expiration) {\r\n\t var currentTime = new Date(),\r\n\t options = {},\r\n\t elapsedMillis;\r\n\t\r\n\t if (cache.localStorageAvailable) {\r\n\t\r\n\t if (expiration) {\r\n\t elapsedMillis = currentTime.getTime() - expiration.getTime();\r\n\t options = {\r\n\t TTL: elapsedMillis\r\n\t };\r\n\t }\r\n\t\r\n\t storageHelper.set(key, value, options);\r\n\t } else if(cookieHelper.enabled){\r\n\t\r\n\t if (expiration) {\r\n\t options = {\r\n\t expires: expiration\r\n\t };\r\n\t }\r\n\t\r\n\t cookieHelper.set(key, value, options);\r\n\t } else {\r\n\t cache.storage[key] = value;\r\n\t }\r\n\t },\r\n\t /**\r\n\t * Get a KVP out of storage\r\n\t * @param {String} key The key to restore from storage\r\n\t * @return The value found mapped to the key in storage\r\n\t */\r\n\t get: function (key) {\r\n\t if (cache.localStorageAvailable) {\r\n\t return storageHelper.get(key);\r\n\t } else if(cache.cookiesEnabled){\r\n\t return cookieHelper.get(key);\r\n\t } else {\r\n\t try{\r\n\t return cache.storage[key]\r\n\t } catch(error){\r\n\t log.error('Failed to retrieve data from memory cache' + error);\r\n\t return undefined;\r\n\t } \r\n\t }\r\n\t }\r\n\t};\r\n\t\r\n\tmodule.exports = publicMethods;\n\n/***/ }),\n\n/***/ 119:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;/*\r\n\t * Cookies.js - 1.2.3\r\n\t * https://github.com/ScottHamper/Cookies\r\n\t *\r\n\t * This is free and unencumbered software released into the public domain.\r\n\t */\r\n\t(function (global, undefined) {\r\n\t 'use strict';\r\n\t\r\n\t var factory = function (window) {\r\n\t if (typeof window.document !== 'object') {\r\n\t throw new Error('Cookies.js requires a `window` with a `document` object');\r\n\t }\r\n\t\r\n\t var Cookies = function (key, value, options) {\r\n\t return arguments.length === 1 ?\r\n\t Cookies.get(key) : Cookies.set(key, value, options);\r\n\t };\r\n\t\r\n\t // Allows for setter injection in unit tests\r\n\t Cookies._document = window.document;\r\n\t\r\n\t // Used to ensure cookie keys do not collide with\r\n\t // built-in `Object` properties\r\n\t Cookies._cacheKeyPrefix = 'cookey.'; // Hurr hurr, :)\r\n\t \r\n\t Cookies._maxExpireDate = new Date('Fri, 31 Dec 9999 23:59:59 UTC');\r\n\t\r\n\t Cookies.defaults = {\r\n\t path: '/',\r\n\t secure: false\r\n\t };\r\n\t\r\n\t Cookies.get = function (key) {\r\n\t if (Cookies._cachedDocumentCookie !== Cookies._document.cookie) {\r\n\t Cookies._renewCache();\r\n\t }\r\n\t \r\n\t var value = Cookies._cache[Cookies._cacheKeyPrefix + key];\r\n\t\r\n\t return value === undefined ? undefined : decodeURIComponent(value);\r\n\t };\r\n\t\r\n\t Cookies.set = function (key, value, options) {\r\n\t options = Cookies._getExtendedOptions(options);\r\n\t options.expires = Cookies._getExpiresDate(value === undefined ? -1 : options.expires);\r\n\t\r\n\t Cookies._document.cookie = Cookies._generateCookieString(key, value, options);\r\n\t\r\n\t return Cookies;\r\n\t };\r\n\t\r\n\t Cookies.expire = function (key, options) {\r\n\t return Cookies.set(key, undefined, options);\r\n\t };\r\n\t\r\n\t Cookies._getExtendedOptions = function (options) {\r\n\t return {\r\n\t path: options && options.path || Cookies.defaults.path,\r\n\t domain: options && options.domain || Cookies.defaults.domain,\r\n\t expires: options && options.expires || Cookies.defaults.expires,\r\n\t secure: options && options.secure !== undefined ? options.secure : Cookies.defaults.secure\r\n\t };\r\n\t };\r\n\t\r\n\t Cookies._isValidDate = function (date) {\r\n\t return Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime());\r\n\t };\r\n\t\r\n\t Cookies._getExpiresDate = function (expires, now) {\r\n\t now = now || new Date();\r\n\t\r\n\t if (typeof expires === 'number') {\r\n\t expires = expires === Infinity ?\r\n\t Cookies._maxExpireDate : new Date(now.getTime() + expires * 1000);\r\n\t } else if (typeof expires === 'string') {\r\n\t expires = new Date(expires);\r\n\t }\r\n\t\r\n\t if (expires && !Cookies._isValidDate(expires)) {\r\n\t throw new Error('`expires` parameter cannot be converted to a valid Date instance');\r\n\t }\r\n\t\r\n\t return expires;\r\n\t };\r\n\t\r\n\t Cookies._generateCookieString = function (key, value, options) {\r\n\t key = key.replace(/[^#$&+\\^`|]/g, encodeURIComponent);\r\n\t key = key.replace(/\\(/g, '%28').replace(/\\)/g, '%29');\r\n\t value = (value + '').replace(/[^!#$&-+\\--:<-\\[\\]-~]/g, encodeURIComponent);\r\n\t options = options || {};\r\n\t\r\n\t var cookieString = key + '=' + value;\r\n\t cookieString += options.path ? ';path=' + options.path : '';\r\n\t cookieString += options.domain ? ';domain=' + options.domain : '';\r\n\t cookieString += options.expires ? ';expires=' + options.expires.toUTCString() : '';\r\n\t cookieString += options.secure ? ';secure' : '';\r\n\t\r\n\t return cookieString;\r\n\t };\r\n\t\r\n\t Cookies._getCacheFromString = function (documentCookie) {\r\n\t var cookieCache = {};\r\n\t var cookiesArray = documentCookie ? documentCookie.split('; ') : [];\r\n\t\r\n\t for (var i = 0; i < cookiesArray.length; i++) {\r\n\t var cookieKvp = Cookies._getKeyValuePairFromCookieString(cookiesArray[i]);\r\n\t\r\n\t if (cookieCache[Cookies._cacheKeyPrefix + cookieKvp.key] === undefined) {\r\n\t cookieCache[Cookies._cacheKeyPrefix + cookieKvp.key] = cookieKvp.value;\r\n\t }\r\n\t }\r\n\t\r\n\t return cookieCache;\r\n\t };\r\n\t\r\n\t Cookies._getKeyValuePairFromCookieString = function (cookieString) {\r\n\t // \"=\" is a valid character in a cookie value according to RFC6265, so cannot `split('=')`\r\n\t var separatorIndex = cookieString.indexOf('=');\r\n\t\r\n\t // IE omits the \"=\" when the cookie value is an empty string\r\n\t separatorIndex = separatorIndex < 0 ? cookieString.length : separatorIndex;\r\n\t\r\n\t var key = cookieString.substr(0, separatorIndex);\r\n\t var decodedKey;\r\n\t try {\r\n\t decodedKey = decodeURIComponent(key);\r\n\t } catch (e) {\r\n\t if (console && typeof console.error === 'function') {\r\n\t console.error('Could not decode cookie with key \"' + key + '\"', e);\r\n\t }\r\n\t }\r\n\t \r\n\t return {\r\n\t key: decodedKey,\r\n\t value: cookieString.substr(separatorIndex + 1) // Defer decoding value until accessed\r\n\t };\r\n\t };\r\n\t\r\n\t Cookies._renewCache = function () {\r\n\t Cookies._cache = Cookies._getCacheFromString(Cookies._document.cookie);\r\n\t Cookies._cachedDocumentCookie = Cookies._document.cookie;\r\n\t };\r\n\t\r\n\t Cookies._areEnabled = function () {\r\n\t var testKey = 'cookies.js';\r\n\t var areEnabled = Cookies.set(testKey, 1).get(testKey) === '1';\r\n\t Cookies.expire(testKey);\r\n\t return areEnabled;\r\n\t };\r\n\t\r\n\t Cookies.enabled = Cookies._areEnabled();\r\n\t\r\n\t return Cookies;\r\n\t };\r\n\t var cookiesExport = (global && typeof global.document === 'object') ? factory(global) : factory;\r\n\t\r\n\t // AMD support\r\n\t if (true) {\r\n\t !(__WEBPACK_AMD_DEFINE_RESULT__ = function () { return cookiesExport; }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\t // CommonJS/Node.js support\r\n\t } else if (typeof exports === 'object') {\r\n\t // Support Node.js specific `module.exports` (which can be a function)\r\n\t if (typeof module === 'object' && typeof module.exports === 'object') {\r\n\t exports = module.exports = cookiesExport;\r\n\t }\r\n\t // But always support CommonJS module 1.1.1 spec (`exports` cannot be a function)\r\n\t exports.Cookies = cookiesExport;\r\n\t } else {\r\n\t global.Cookies = cookiesExport;\r\n\t }\r\n\t})(typeof window === 'undefined' ? this : window);\n\n/***/ }),\n\n/***/ 120:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! simpleStorage v0.2.1, Unlicense 2016. https://github.com/andris9/simpleStorage */\n\t!function(a,b){\"use strict\"; true?!(__WEBPACK_AMD_DEFINE_FACTORY__ = (b), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)):\"undefined\"!=typeof exports?module.exports=b():a.simpleStorage=b()}(this,function(){\"use strict\";function a(){p=j(),d(),g(),b(),\"addEventListener\"in window&&window.addEventListener(\"pageshow\",function(a){a.persisted&&c()},!1),p=!0}function b(){\"addEventListener\"in window?window.addEventListener(\"storage\",c,!1):document.attachEvent(\"onstorage\",c)}function c(){try{d()}catch(a){return void(p=!1)}g()}function d(){var a=localStorage.getItem(\"simpleStorage\");try{n=JSON.parse(a)||{}}catch(b){n={}}o=f()}function e(){try{localStorage.setItem(\"simpleStorage\",JSON.stringify(n)),o=f()}catch(a){return k(a)}return!0}function f(){var a=localStorage.getItem(\"simpleStorage\");return a?String(a).length:0}function g(){var a,b,c,d,f,h=1/0,j=0;if(clearTimeout(q),n&&n.__simpleStorage_meta&&n.__simpleStorage_meta.TTL){for(a=+new Date,f=n.__simpleStorage_meta.TTL.keys||[],d=n.__simpleStorage_meta.TTL.expire||{},b=0,c=f.length;c>b;b++){if(!(d[f[b]]<=a)){d[f[b]]c;c++)n.__simpleStorage_meta.TTL.keys[c]===a&&n.__simpleStorage_meta.TTL.keys.splice(c);for(c=0,d=n.__simpleStorage_meta.TTL.keys.length;d>c;c++)if(n.__simpleStorage_meta.TTL.expire[n.__simpleStorage_meta.TTL.keys[c]]>e+b){n.__simpleStorage_meta.TTL.keys.splice(c,0,a),f=!0;break}f||n.__simpleStorage_meta.TTL.keys.push(a)}else if(n&&n.__simpleStorage_meta&&n.__simpleStorage_meta.TTL){if(n.__simpleStorage_meta.TTL.expire.hasOwnProperty(a))for(delete n.__simpleStorage_meta.TTL.expire[a],c=0,d=n.__simpleStorage_meta.TTL.keys.length;d>c;c++)if(n.__simpleStorage_meta.TTL.keys[c]===a){n.__simpleStorage_meta.TTL.keys.splice(c,1);break}i()}return clearTimeout(q),n&&n.__simpleStorage_meta&&n.__simpleStorage_meta.TTL&&n.__simpleStorage_meta.TTL.keys.length&&(q=setTimeout(g,Math.min(Math.max(n.__simpleStorage_meta.TTL.expire[n.__simpleStorage_meta.TTL.keys[0]]-e,0),2147483647))),!0}function i(){var a,b=!1,c=!1;if(!n||!n.__simpleStorage_meta)return b;n.__simpleStorage_meta.TTL&&!n.__simpleStorage_meta.TTL.keys.length&&(delete n.__simpleStorage_meta.TTL,b=!0);for(a in n.__simpleStorage_meta)if(n.__simpleStorage_meta.hasOwnProperty(a)){c=!0;break}return c||(delete n.__simpleStorage_meta,b=!0),b}function j(){var a,b=0;if(null===window.localStorage||\"unknown\"==typeof window.localStorage)throw a=new Error(\"localStorage is disabled\"),a.code=t,a;if(!window.localStorage)throw a=new Error(\"localStorage not supported\"),a.code=s,a;try{b=window.localStorage.length}catch(c){throw k(c)}try{window.localStorage.setItem(\"__simpleStorageInitTest\",Date.now().toString(16)),window.localStorage.removeItem(\"__simpleStorageInitTest\")}catch(c){throw b?k(c):(a=new Error(\"localStorage is disabled\"),a.code=t,a)}return!0}function k(a){var b;return 22===a.code||1014===a.code||[-2147024882,-2146828281,-21474675259].indexOf(a.number)>0?(b=new Error(\"localStorage quota exceeded\"),b.code=u,b):18===a.code||1e3===a.code?(b=new Error(\"localStorage is disabled\"),b.code=t,b):\"TypeError\"===a.name?(b=new Error(\"localStorage is disabled\"),b.code=t,b):a}function l(a){if(!a)return r=\"OK\",a;switch(a.code){case s:case t:case u:r=a.code;break;default:r=a.code||a.number||a.message||a.name}return a}var m=\"0.2.1\",n=!1,o=0,p=!1,q=null,r=\"OK\",s=\"LS_NOT_AVAILABLE\",t=\"LS_DISABLED\",u=\"LS_QUOTA_EXCEEDED\";try{a()}catch(v){l(v)}return{version:m,status:r,canUse:function(){return\"OK\"===r&&!!p},set:function(a,b,c){if(\"__simpleStorage_meta\"===a)return!1;if(!n)return!1;if(\"undefined\"==typeof b)return this.deleteKey(a);c=c||{};try{b=JSON.parse(JSON.stringify(b))}catch(d){return k(d)}return n[a]=b,h(a,c.TTL||0),e()},hasKey:function(a){return n&&n.hasOwnProperty(a)&&\"__simpleStorage_meta\"!==a?!0:!1},get:function(a){return n?n.hasOwnProperty(a)&&\"__simpleStorage_meta\"!==a&&this.getTTL(a)?n[a]:void 0:!1},deleteKey:function(a){return n&&a in n?(delete n[a],h(a,0),e()):!1},setTTL:function(a,b){return n?(h(a,b),e()):!1},getTTL:function(a){var b;return n&&n.hasOwnProperty(a)?n.__simpleStorage_meta&&n.__simpleStorage_meta.TTL&&n.__simpleStorage_meta.TTL.expire&&n.__simpleStorage_meta.TTL.expire.hasOwnProperty(a)?(b=Math.max(n.__simpleStorage_meta.TTL.expire[a]-+new Date||0,0),b||!1):1/0:!1},flush:function(){if(!n)return!1;n={};try{return localStorage.removeItem(\"simpleStorage\"),!0}catch(a){return k(a)}},index:function(){if(!n)return!1;var a,b=[];for(a in n)n.hasOwnProperty(a)&&\"__simpleStorage_meta\"!==a&&b.push(a);return b},storageSize:function(){return o}}});\n\n/***/ }),\n\n/***/ 121:\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/**\r\n\t * Message to get configured payment brands for a merchant. This message will\r\n\t * also generate the buttons when the merchant calls the renderButton().\r\n\t **/\r\n\t\r\n\tvar _ = __webpack_require__(12),\r\n\t cache = __webpack_require__(3),\r\n\t configManager = __webpack_require__(24),\r\n\t CONST_ERRORS = __webpack_require__(31),\r\n\t CONST_EVENTS = __webpack_require__(51),\r\n\t CONST_GENERAL = __webpack_require__(70),\r\n\t CONST_PAYMENTS = __webpack_require__(122),\r\n\t CorsClient = __webpack_require__(65),\r\n\t dfLibrary = __webpack_require__(59),\r\n\t deviceFingerprinterUtility = __webpack_require__(62),\r\n\t events = __webpack_require__(14),\r\n\t GeneralError = __webpack_require__(52),\r\n\t generalUtility = __webpack_require__(32),\r\n\t jwtUtility = __webpack_require__(71),\r\n\t logger = __webpack_require__(15),\r\n\t log = logger.getLoggerInstance('Base.Message.Init'),\r\n\t htmlUtility = __webpack_require__(67),\r\n\t MidasRequest = __webpack_require__(117),\r\n\t passiveEvents = events.passive,\r\n\t RSVP = __webpack_require__(18),\r\n\t storage = __webpack_require__(118),\r\n\t supportedPaymentsUtility = __webpack_require__(123);\r\n\t\r\n\t__webpack_require__(124);\r\n\t__webpack_require__(126);\r\n\t__webpack_require__(129);\r\n\t\r\n\tvar endpointMonitor = __webpack_require__(63),\r\n\t midasClient = new CorsClient(configManager.getSystemConfig().midas.base + 'Order/JWT', true, configManager.getMerchantConfig().timeout, null, null, endpointMonitor.captureXhr),\r\n\t midasPath = '/Init';\r\n\t\r\n\tvar methods = {\r\n\t process: function () {\r\n\t try {\r\n\t log.info('Processing Init message...');\r\n\t\r\n\t if (cache.merchantJwt) {\r\n\t var consumerSessionId = storage.get(CONST_GENERAL.CONSUMER_SESSION_ID_KEY) || null,\r\n\t initRequest = new MidasRequest(consumerSessionId, cache.merchantJwt, cache.orderObject).generateOrderRequest(),\r\n\t supportsAlternativePayments = supportedPaymentsUtility.getCurrentSupportedList();\r\n\t\r\n\t initRequest.BrowserPayload.SupportsAlternativePayments = supportsAlternativePayments;\r\n\t\r\n\t midasClient.post(midasPath, initRequest)\r\n\t .then(jwtUtility.unpackResponseJwt)\r\n\t .then(function (midasResponse) {\r\n\t var dfCompletionTimePromise = null;\r\n\t\r\n\t if (!initRequest.ConsumerSessionId && midasResponse.decodedObject.ConsumerSessionId) {\r\n\t log.debug('Starting new session with midas');\r\n\t storage.put(CONST_GENERAL.CONSUMER_SESSION_ID_KEY, midasResponse.decodedObject.ConsumerSessionId);\r\n\t cache.consumerSessionId = midasResponse.decodedObject.ConsumerSessionId;\r\n\t cache.deviceFingerprinting.shouldRunFingerprinting = true;\r\n\t } else if (initRequest.ConsumerSessionId === midasResponse.decodedObject.ConsumerSessionId) {\r\n\t log.debug('Resuming session found stored in browser');\r\n\t cache.consumerSessionId = consumerSessionId;\r\n\t // 2018-10-5 - Enabling DF on all requests as a work around for an issue with CruiseAPI, /Bin/Load, and associating ReferenceIds properly at DF.\r\n\t // Once this issue has been resolved we should remove this enabled flag\r\n\t cache.deviceFingerprinting.shouldRunFingerprinting = true;\r\n\t } else {\r\n\t log.debug('Received a new session Id from Midas');\r\n\t storage.put(CONST_GENERAL.CONSUMER_SESSION_ID_KEY, midasResponse.decodedObject.ConsumerSessionId);\r\n\t cache.consumerSessionId = midasResponse.decodedObject.ConsumerSessionId;\r\n\t cache.deviceFingerprinting.shouldRunFingerprinting = true;\r\n\t }\r\n\t\r\n\t if (midasResponse.decodedObject.Payload.URLs) {\r\n\t var urls = midasResponse.decodedObject.Payload.URLs;\r\n\t\r\n\t if (urls.DeviceFingerprint) {\r\n\t cache.deviceFingerprinting.urls.base = urls.DeviceFingerprint.Base;\r\n\t cache.deviceFingerprinting.urls.queryString = deviceFingerprinterUtility.constructQueryParameterString(urls.DeviceFingerprint.QueryParameters);\r\n\t cache.deviceFingerprinting.urls.browser = cache.deviceFingerprinting.urls.base + CONST_GENERAL.URLS.DEVICE_FINGERPRINTER.BROWSER_RENDER + cache.deviceFingerprinting.urls.queryString;\r\n\t cache.deviceFingerprinting.urls.profileBin = cache.deviceFingerprinting.urls.base + CONST_GENERAL.URLS.DEVICE_FINGERPRINTER.BIN_RENDER + cache.deviceFingerprinting.urls.queryString;\r\n\t }\r\n\t\r\n\t if (urls.HostedFields) {\r\n\t cache.urls.hostedFields = urls.HostedFields;\r\n\t }\r\n\t }\r\n\t var optimizelyFlags = midasResponse.decodedObject.Payload.OptimizelyFlags;\r\n\t if(optimizelyFlags !== undefined){\r\n\t if ('SongbirdPostMessageValidation' in optimizelyFlags && optimizelyFlags.SongbirdPostMessageValidation === true){\r\n\t\r\n\t cache.songbirdPostmessageValidation = true;\r\n\t } else{\r\n\t log.debug(\"Problem occurred while processing optimizely flags\")\r\n\t }\r\n\t } else {\r\n\t log.debug(\"Unable to load Optimizely flags\")\r\n\t }\r\n\t \r\n\t\r\n\t if (cache.deviceFingerprinting.shouldRunFingerprinting) {\r\n\t log.debug('Detected DF as enabled, starting collection');\r\n\t dfCompletionTimePromise = dfLibrary.profileOnInit()\r\n\t .catch(function () {\r\n\t log.warn(\"Profiling failure may impact CCA 2.0 features\");\r\n\t })\r\n\t } else {\r\n\t // Create an auto resolving promise to ensure we don't wait any additional time for DF\r\n\t dfCompletionTimePromise = new RSVP.Promise(function (resolve) {\r\n\t resolve();\r\n\t });\r\n\t }\r\n\t\r\n\t configManager.parseEnabledFeatures(midasResponse.decodedObject.Payload);\r\n\t\r\n\t initUtils.parsePayments(midasResponse.decodedObject.Payload, dfCompletionTimePromise)\r\n\t .then(function (moduleState) {\r\n\t log.info('All expected payments have finished loading.');\r\n\t passiveEvents.publish(CONST_EVENTS.SETUP_COMPLETE, {\r\n\t sessionId: cache.consumerSessionId,\r\n\t modules: moduleState\r\n\t });\r\n\t })\r\n\t .catch(function (error) {\r\n\t log.error(\"Exception while processing module loading results: \" + error);\r\n\t passiveEvents.publish(CONST_EVENTS.SETUP_COMPLETE, {\r\n\t sessionId: cache.consumerSessionId,\r\n\t modules: []\r\n\t });\r\n\t })\r\n\t\r\n\t })['catch'](function (error) {\r\n\t generalUtility.handleError(error, CONST_ERRORS.MIDAS.INIT.NUMBER, CONST_ERRORS.MIDAS.INIT.DESCRIPTION);\r\n\t });\r\n\t\r\n\t } else {\r\n\t throw new GeneralError(CONST_ERRORS.VALIDATION.JWT.MISSING.NUMBER, CONST_ERRORS.VALIDATION.JWT.MISSING.DESCRIPTION);\r\n\t }\r\n\t } catch (error) {\r\n\t generalUtility.handleError(error, CONST_ERRORS.GENERAL.NUMBER, CONST_ERRORS.GENERAL.DESCRIPTION);\r\n\t }\r\n\t }\r\n\t};\r\n\t\r\n\tvar initUtils = {\r\n\t /**\r\n\t * FUTUREREV: Refactor to reduce complexity\r\n\t * \r\n\t * I don't see an obvious way to reduce complexity of this section, due to this the ESLint rule is being disabled for this function.\r\n\t * We should try to solve this complexity issue in the future if we're able as it will only get more complex as we continue to add features to Songbird.\r\n\t */\r\n\t parsePayments: function (response, dfCompletionTimePromise) {\r\n\t return new RSVP.Promise(function (resolve, reject) { // eslint-disable-line complexity\r\n\t try {\r\n\t var payments = [],\r\n\t hasInitiatedPayments = false,\r\n\t moduleLoadingResults, initTimerStart, initTimer;\r\n\t\r\n\t if ('InitiatedPayments' in response) {\r\n\t hasInitiatedPayments = true;\r\n\t }\r\n\t\r\n\t\r\n\t // Bootstrap Payment Brands\r\n\t //\r\n\t // INSIGHT - We chunk each payment brand out into its own enclosed chunk to prevent downloading unncessary payment brands. We may want to re-think this solution as we add more payment brands, as it could result in a lot of extra HTTP requests\r\n\t\r\n\t if ('EnabledCCA' in response && response.EnabledCCA === true) {\r\n\t try {\r\n\t payments.push(initUtils.promiseFactory(CONST_PAYMENTS.CCA));\r\n\t __webpack_require__.e/* nsure */(11, function (require) {\r\n\t __webpack_require__(130).init();\r\n\t\r\n\t endpointMonitor.captureTiming(htmlUtility.getCurrentScript());\r\n\t });\r\n\t } catch (error) {\r\n\t log.error('failed to load ' + CONST_PAYMENTS.CCA + ': ' + error);\r\n\t }\r\n\t }\r\n\t\r\n\t if ('EnabledApplePay' in response && response.EnabledApplePay === true) {\r\n\t if (response.InitiatedPayments !== undefined) {\r\n\t if ('ApplePay' in response.InitiatedPayments && response.InitiatedPayments.ApplePay instanceof Object) {\r\n\t try {\r\n\t payments.push(initUtils.promiseFactory(CONST_PAYMENTS.APPLE_PAY));\r\n\t __webpack_require__.e/* nsure */(12, function (require) {\r\n\t __webpack_require__(136).init(response.InitiatedPayments.ApplePay);\r\n\t\r\n\t endpointMonitor.captureTiming(htmlUtility.getCurrentScript());\r\n\t });\r\n\t } catch (error) {\r\n\t log.error('failed to load ' + CONST_PAYMENTS.APPLE_PAY + ': ' + error);\r\n\t }\r\n\t }\r\n\t } else {\r\n\t log.error('Apple Pay marked as enabled, but no initialization data was found on Init response');\r\n\t }\r\n\t }\r\n\t\r\n\t if ('EnabledDiscover' in response && response.EnabledDiscover === true) {\r\n\t try {\r\n\t payments.push(initUtils.promiseFactory(CONST_PAYMENTS.DISCOVER));\r\n\t __webpack_require__.e/* nsure */(13, function (require) {\r\n\t __webpack_require__(143).init();\r\n\t\r\n\t endpointMonitor.captureTiming(htmlUtility.getCurrentScript());\r\n\t });\r\n\t } catch (error) {\r\n\t log.error('failed to load ' + CONST_PAYMENTS.DISCOVER + ': ' + error);\r\n\t }\r\n\t }\r\n\t\r\n\t if ('EnabledHostedFields' in response && response.EnabledHostedFields === true) {\r\n\t try {\r\n\t payments.push(initUtils.promiseFactory(CONST_PAYMENTS.HOSTED_FIELDS));\r\n\t __webpack_require__.e/* nsure */(14, function (require) {\r\n\t __webpack_require__(145).init();\r\n\t\r\n\t endpointMonitor.captureTiming(htmlUtility.getCurrentScript());\r\n\t });\r\n\t } catch (error) {\r\n\t log.error('failed to load ' + CONST_PAYMENTS.HOSTED_FIELDS + ': ' + error);\r\n\t }\r\n\t }\r\n\t\r\n\t if ('EnabledPaypal' in response && response.EnabledPaypal === true) {\r\n\t var configurationData;\r\n\t // INSIGHT - PayPal has a few processors you can transact through to add PayPal to your site. Depending on which the merchant is using there may or may not be a configuration object returned back\r\n\t if (hasInitiatedPayments && 'Paypal' in response.InitiatedPayments) {\r\n\t configurationData = response.InitiatedPayments.Paypal;\r\n\t }\r\n\t\r\n\t try {\r\n\t payments.push(initUtils.promiseFactory(CONST_PAYMENTS.PAYPAL));\r\n\t __webpack_require__.e/* nsure */(15, function (require) {\r\n\t __webpack_require__(148).init(configurationData);\r\n\t\r\n\t endpointMonitor.captureTiming(htmlUtility.getCurrentScript());\r\n\t });\r\n\t } catch (error) {\r\n\t log.error('failed to load ' + CONST_PAYMENTS.PAYPAL + ': ' + error);\r\n\t }\r\n\t\r\n\t }\r\n\t\r\n\t if ('EnabledVisaCheckout' in response && response.EnabledVisaCheckout === true && hasInitiatedPayments) {\r\n\t if ('VisaCheckout' in response.InitiatedPayments && typeof response.InitiatedPayments.VisaCheckout === 'object') {\r\n\t try {\r\n\t payments.push(initUtils.promiseFactory(CONST_PAYMENTS.VISACHECKOUT));\r\n\t __webpack_require__.e/* nsure */(16, function (require) {\r\n\t __webpack_require__(154).init(response.InitiatedPayments.VisaCheckout);\r\n\t\r\n\t endpointMonitor.captureTiming(htmlUtility.getCurrentScript());\r\n\t });\r\n\t } catch (error) {\r\n\t log.error('Failed to load ' + CONST_PAYMENTS.VISACHECKOUT + ': ' + error);\r\n\t }\r\n\t\r\n\t }\r\n\t }\r\n\t\r\n\t log.debug('Waiting for [' + payments.length + '] payment modules to load');\r\n\t\r\n\t initTimerStart = Date.now();\r\n\t initTimer = setTimeout(function () {\r\n\t logger.enableAjaxLogging(configManager.getSystemConfig());\r\n\t log.error('Init completed slowly');\r\n\t }, configManager.getSystemConfig().initTimeout);\r\n\t\r\n\t RSVP.allSettled(payments)\r\n\t .then(function (modulePromiseResults) {\r\n\t // Store the module load attempt promise results to a var so we can process it on the finally block\r\n\t moduleLoadingResults = modulePromiseResults;\r\n\t\r\n\t log.debug('All payment brands initalized in [' + (Date.now() - initTimerStart) + ']ms');\r\n\t return dfCompletionTimePromise;\r\n\t })\r\n\t .finally(function () {\r\n\t try {\r\n\t var moduleState;\r\n\t\r\n\t clearTimeout(initTimer);\r\n\t log.debug('DF and all payment brands completed in [' + (Date.now() - initTimerStart) + ']ms');\r\n\t\r\n\t moduleState = initUtils.generateSetupCompleteObject(moduleLoadingResults)\r\n\t\r\n\t cache.setup.eventCompleted = true;\r\n\t cache.setup.modulesLoaded = moduleState;\r\n\t\r\n\t resolve(moduleState);\r\n\t } catch (error) {\r\n\t reject(error);\r\n\t } finally {\r\n\t endpointMonitor.flushAll();\r\n\t }\r\n\t });\r\n\t\r\n\t } catch (error) {\r\n\t log.error('Failed while attempting to load payment modules: ' + error);\r\n\t reject(error);\r\n\t }\r\n\t })\r\n\t\r\n\t },\r\n\t promiseFactory: function (payment) {\r\n\t var deferredCompletion = RSVP.defer(),\r\n\t startLoadTime = Date.now(),\r\n\t paymentLoadingTimeout = setTimeout(function () {\r\n\t log.error(payment + ' took too long to initialize, skipping payment brand.')\r\n\t deferredCompletion.reject({\r\n\t type: payment,\r\n\t error: 'Payment took too long to initialize'\r\n\t })\r\n\t }, configManager.getSystemConfig().paymentLoadTimeout);\r\n\t\r\n\t // Subscribe to the internal event for the button loaded\r\n\t events.subscribe(payment + '.' + CONST_EVENTS.INTERNAL.BUTTON_LOADED, function (isLoaded, data) {\r\n\t var endLoadTime = Date.now();\r\n\t log.debug('Payment [' + payment + '] loaded in [' + (endLoadTime - startLoadTime) + ']ms')\r\n\t clearTimeout(paymentLoadingTimeout);\r\n\t if (isLoaded) {\r\n\t deferredCompletion.resolve({\r\n\t type: payment,\r\n\t data: data\r\n\t });\r\n\t } else {\r\n\t deferredCompletion.reject({\r\n\t type: payment,\r\n\t data: data\r\n\t });\r\n\t }\r\n\t });\r\n\t\r\n\t // Return a shell promise we can use to easily track when all buttons have finished loading\r\n\t return deferredCompletion.promise;\r\n\t },\r\n\t /**\r\n\t * Helper function to create the data object returned to the merchant on what modules were loaded\r\n\t * @param {object} moduleLoadingResults An array of promise results with the status of the module load in it\r\n\t * @returns {Array} An array of objects that defines what module was loaded and the state of the attempted load (success/failure)\r\n\t */\r\n\t generateSetupCompleteObject: function (moduleLoadingResults) {\r\n\t var moduleState = [];\r\n\t _.each(moduleLoadingResults, function (moduleReport) {\r\n\t var module = {\r\n\t module: moduleReport.state === 'fulfilled' ? moduleReport.value.type : moduleReport.reason.type,\r\n\t loaded: moduleReport.state === 'fulfilled' ? true : false\r\n\t };\r\n\t if (moduleReport.data !== undefined) {\r\n\t module.data = moduleReport.data;\r\n\t }\r\n\t moduleState.push(module);\r\n\t });\r\n\t return moduleState;\r\n\t }\r\n\t};\r\n\t\r\n\tmodule.exports = methods;\n\n/***/ }),\n\n/***/ 122:\n/***/ (function(module, exports) {\n\n\tmodule.exports = {\r\n\t\tCCA: 'CCA',\r\n\t\tDISCOVER: 'discoverWallet',\r\n\t\tPAYPAL:'paypal',\r\n\t\tVISACHECKOUT: 'visaCheckout',\r\n\t\tWALLET: 'wallet',\r\n\t\tAPPLE_PAY: 'applePay',\r\n\t\tHOSTED_FIELDS: 'hostedFields'\r\n\t};\n\n/***/ }),\n\n/***/ 123:\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/**\r\n\t * Simple set of utilities to determining what features are supported in the merchants current integration.\r\n\t */\r\n\tvar _ = __webpack_require__(12),\r\n\t cache = __webpack_require__(3),\r\n\t CONST_PAYMENTS = __webpack_require__(122),\r\n\t configManager = __webpack_require__(24),\r\n\t log = __webpack_require__(15).getLoggerInstance('Base.SupportedPaymentsUtility');\r\n\t\r\n\tvar publicMethods = {\r\n\t /**\r\n\t * Utility for determining what payment brands are supported by the merchants current integration\r\n\t * @returns {{paymentKey: boolean}} an object of KVPs of supported status\r\n\t */\r\n\t getCurrentSupportedList: function () {\r\n\t var merchantOverrideConfigurations = {},\r\n\t // INSIGHT - CCA is the execption, it should be considered to be always enabled\r\n\t buttonPaymentBrands = _.omit(configManager.getSystemConfig().payments, [CONST_PAYMENTS.CCA.toLowerCase(), CONST_PAYMENTS.HOSTED_FIELDS]),\r\n\t mergedGenericButtonConfigurations, genericButtonResults, specificPaymentOverridesResults,\r\n\t resultObject = {\r\n\t cca: true\r\n\t };\r\n\t\r\n\t _.each(configManager.getMerchantConfig(), function (object, key) {\r\n\t if (key in buttonPaymentBrands) {\r\n\t if ('button' in object && 'containerId' in object.button) {\r\n\t merchantOverrideConfigurations[key] = object;\r\n\t }\r\n\t }\r\n\t });\r\n\t\r\n\t // Merge System and Merchant configurations to determine if the merchant has overriden the default \r\n\t mergedGenericButtonConfigurations = _.merge({}, configManager.getSystemConfig().button, configManager.getMerchantConfig().payment.button);\r\n\t\r\n\t genericButtonResults = publicMethods.lookForGenericButton(mergedGenericButtonConfigurations.containerId, buttonPaymentBrands);\r\n\t specificPaymentOverridesResults = publicMethods.lookForSpecificButtons(merchantOverrideConfigurations);\r\n\t\r\n\t resultObject[CONST_PAYMENTS.HOSTED_FIELDS] = publicMethods.lookForHostedFields();\r\n\t\r\n\t resultObject = _.merge(resultObject, genericButtonResults, specificPaymentOverridesResults);\r\n\t\r\n\t return resultObject\r\n\t },\r\n\t /**\r\n\t * A helper to determine if a set of payment brands is supported by the current merchant configuration.\r\n\t * @param {string} containerId - The ID to use as the generic div to look inside for payment buttons\r\n\t * @param {Object} buttonPaymentBrands - An object containing the configurations for all payment brands that use payment buttons\r\n\t * @returns {Object} KVP of payment brands and their detected supported state\r\n\t */\r\n\t lookForGenericButton: function (containerId, buttonPaymentBrands) {\r\n\t var doesGenericDivExist = publicMethods.checkForButtonWithinDiv(containerId),\r\n\t resultObject = {};\r\n\t\r\n\t _.each(buttonPaymentBrands, function (configurationObject, key) {\r\n\t var keyValue = key.toLowerCase();\r\n\t resultObject[keyValue] = doesGenericDivExist;\r\n\t if ('type' in configurationObject) {\r\n\t resultObject[configurationObject.type] = doesGenericDivExist;\r\n\t }\r\n\t });\r\n\t\r\n\t return resultObject;\r\n\t },\r\n\t /**\r\n\t * Looks for specific payment brand override values\r\n\t * @param {Object}\r\n\t * @return {Object} KVP of payment brands and their supported state\r\n\t */\r\n\t lookForSpecificButtons: function (merchantOverrideConfigurations) {\r\n\t var resultObject = {};\r\n\t\r\n\t if (!_.isEmpty(merchantOverrideConfigurations)) {\r\n\t _.each(merchantOverrideConfigurations, function (configurationObject, key) {\r\n\t var keyValue = key.toLowerCase(),\r\n\t doesSpecificButtonDivExist = publicMethods.checkForButtonWithinDiv(configurationObject.button.containerId);\r\n\t\r\n\t resultObject[keyValue] = doesSpecificButtonDivExist;\r\n\t if ('type' in configurationObject) {\r\n\t resultObject[configurationObject.type] = doesSpecificButtonDivExist;\r\n\t }\r\n\t });\r\n\t }\r\n\t\r\n\t return resultObject;\r\n\t },\r\n\t /**\r\n\t * Checks for the minimal field set required for hosted fields, and ensures all elements are in fact DIVs\r\n\t * @returns {boolean} supported state flag\r\n\t */\r\n\t lookForHostedFields: function () {\r\n\t var returnValue = false;\r\n\t if (cache.formFields !== undefined) {\r\n\t \r\n\t var missingElements = _.filter(configManager.getSystemConfig().payments.hostedFields.minimumFields, function (requiredFieldKey) {\r\n\t var field = cache.formFields[requiredFieldKey];\r\n\t if (field !== undefined && 'tagName' in field && field.tagName === 'DIV') {\r\n\t return false;\r\n\t } else {\r\n\t log.info('Missing required field for Hosted Fields: ' + requiredFieldKey)\r\n\t return true;\r\n\t }\r\n\t });\r\n\t\r\n\t if(missingElements.length === 0){\r\n\t returnValue = true;\r\n\t }\r\n\t \r\n\t }\r\n\t return returnValue;\r\n\t },\r\n\t /**\r\n\t * Simple helper to determine if an element is found on the page or not\r\n\t * @param {string} elementId - The HTML id of the element you want to try and find\r\n\t * @returns {boolean} if the element was found or not\r\n\t */\r\n\t checkForButtonWithinDiv: function (elementId) {\r\n\t return document.getElementById(elementId) !== null;\r\n\t }\r\n\t}\r\n\t\r\n\tmodule.exports = publicMethods;\n\n/***/ }),\n\n/***/ 124:\n/***/ (function(module, exports, __webpack_require__) {\n\n\t/**\r\n\t* Message to initalize an order in Centinel. Most payment brands will not need the response\r\n\t* to this message. Some, like CCA, will, however.\r\n\t**/\r\n\tvar cache = __webpack_require__(3),\r\n\t configManager = __webpack_require__(24),\r\n\t CorsClient = __webpack_require__(65),\r\n\t CONST_ERRORS = __webpack_require__(31),\r\n\t CONST_EVENTS = __webpack_require__(51),\r\n\t CONST_GENERAL = __webpack_require__(70),\r\n\t CONST_RESPONSE_VALIDATION_TYPE = __webpack_require__(125),\r\n\t events = __webpack_require__(14),\r\n\t generalUtility = __webpack_require__(32),\r\n\t jwtUtility = __webpack_require__(71),\r\n\t log = __webpack_require__(15).getLoggerInstance('Base.Message.Start'),\r\n\t publicMethods,\r\n\t MidasRequest = __webpack_require__(117),\r\n\t storage = __webpack_require__(118),\r\n\t uiManager = __webpack_require__(75);\r\n\t\r\n\tvar endpointMonitor = __webpack_require__(63),\r\n\t midasClient = new CorsClient(configManager.getSystemConfig().midas.base + 'Order/JWT', true, configManager.getMerchantConfig().timeout, null, null, endpointMonitor.captureXhr),\r\n\t midasPath = '/Start';\r\n\t\r\n\tpublicMethods = {\r\n\t /**\r\n\t * Sends a /Start request to Centinel API\r\n\t * @param {Object} paymentDetails - The full request object that should be sent to Centinel API\r\n\t * @param {function=} startCallback - The function that should be called when the start request has been completed. Based off the responseValidationType, this maybe only when the response was sucessful\r\n\t * @param {string=} responseValidationType - A flag to indicate if the response should be fully validated. This field uses the constant file 'responseValidationType' as the type\r\n\t * @returns {PromiseLike} A promise that completes when the response has been returned. If full validation is on the response will automatically be feed into the generic handler and published to payments.validated.\r\n\t */\r\n\t process: function (paymentDetails, startCallback, responseValidationType) {\r\n\t\r\n\t try {\r\n\t log.info('Processing Start Message for payment brand [' + paymentDetails.type + ']...');\r\n\t\r\n\t var startRequest = new MidasRequest(storage.get(CONST_GENERAL.CONSUMER_SESSION_ID_KEY), cache.merchantJwt, paymentDetails.Order, paymentDetails.type).generateOrderRequest();\r\n\t\r\n\t if (responseValidationType === undefined) {\r\n\t responseValidationType = CONST_RESPONSE_VALIDATION_TYPE.FULL;\r\n\t }\r\n\t\r\n\t return midasClient.post(midasPath, startRequest)\r\n\t .then(function (rawResponseJwt) {\r\n\t var decodedResponse;\r\n\t switch (responseValidationType) {\r\n\t default:\r\n\t case CONST_RESPONSE_VALIDATION_TYPE.FULL:\r\n\t log.debug('using full response validation on /Start response');\r\n\t decodedResponse = jwtUtility.unpackResponseJwt(rawResponseJwt);\r\n\t break;\r\n\t case CONST_RESPONSE_VALIDATION_TYPE.NONE:\r\n\t try {\r\n\t log.debug('using low response validation on /Start response');\r\n\t if (rawResponseJwt !== undefined && rawResponseJwt.CardinalJWT !== undefined) {\r\n\t decodedResponse = {\r\n\t decodedObject: jwtUtility.parseResponse(rawResponseJwt.CardinalJWT),\r\n\t rawJwt: rawResponseJwt.CardinalJWT\r\n\t };\r\n\t } else {\r\n\t log.debug('Response is unrecognizable, unable to properly parse.');\r\n\t }\r\n\t } catch (parseError) {\r\n\t log.info(\"JWT parsing failed, moving on \" + parseError);\r\n\t }\r\n\t\r\n\t break;\r\n\t }\r\n\t\r\n\t return decodedResponse;\r\n\t })\r\n\t .then(function (midasResponse) {\r\n\t log.info('Start request completed successfully.');\r\n\t\r\n\t if (midasResponse) {\r\n\t if (startCallback && typeof startCallback === 'function') {\r\n\t startCallback(midasResponse);\r\n\t } else {\r\n\t log.debug('Invalid callback set, skipping callback.');\r\n\t }\r\n\t } else {\r\n\t log.debug('Response requires no additional processing.');\r\n\t }\r\n\t\r\n\t })\r\n\t ['catch'](function (error) {\r\n\t uiManager.loader.events.hide();\r\n\t generalUtility.handleError(error, CONST_ERRORS.MIDAS.START.NUMBER, CONST_ERRORS.MIDAS.START.DESCRIPTION);\r\n\t });\r\n\t\r\n\t } catch (error) {\r\n\t // Attempt to close the loader, but fail silently since we're unsure of the current state\r\n\t try {\r\n\t uiManager.loader.events.hide();\r\n\t } catch (e) { }\r\n\t\r\n\t generalUtility.handleError(error, CONST_ERRORS.GENERAL.NUMBER, CONST_ERRORS.GENERAL.DESCRIPTION);\r\n\t }\r\n\t }\r\n\t};\r\n\t\r\n\t// INSIGHT - The start message can be triggered by an internal event or by being directly required and triggered by function call.\r\n\tevents.subscribe(CONST_EVENTS.INTERNAL.SELECTED, publicMethods.process);\r\n\tmodule.exports = publicMethods;\r\n\n\n/***/ }),\n\n/***/ 125:\n/***/ (function(module, exports) {\n\n\tmodule.exports = {\r\n\t /**\r\n\t * Look for all types of errors and throw an exception when one is found. Exceptions are handled by the generalUtility.handleError\r\n\t */\r\n\t FULL: 'full',\r\n\t /**\r\n\t * Do no validation on the response. This is useful when a request is not required to be successful, like when pushing optional data to an endpoint or if a payment brand as an optional /Start message to Centinel API.\r\n\t */\r\n\t NONE: 'none'\r\n\t};\n\n/***/ }),\n\n/***/ 126:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar cache = __webpack_require__(3),\r\n\t configManager = __webpack_require__(24),\r\n\t CONST_ERRORS = __webpack_require__(31),\r\n\t CONST_EVENTS = __webpack_require__(51),\r\n\t CONST_GENERAL = __webpack_require__(70),\r\n\t CorsClient = __webpack_require__(65),\r\n\t events = __webpack_require__(14),\r\n\t generalUtility = __webpack_require__(32),\r\n\t jwtUtility = __webpack_require__(71),\r\n\t log = __webpack_require__(15).getLoggerInstance('Base.Message.Validate'),\r\n\t MidasRequest = __webpack_require__(117),\r\n\t passiveEvents = __webpack_require__(14).passive,\r\n\t responseMapper = __webpack_require__(41),\r\n\t storage = __webpack_require__(118);\r\n\t\r\n\t__webpack_require__(127);\r\n\t\r\n\tvar endpointMonitor = __webpack_require__(63),\r\n\t midasClient = new CorsClient(configManager.getSystemConfig().midas.base + 'Order/JWT', true, configManager.getMerchantConfig().timeout, null, null, endpointMonitor.captureXhr),\r\n\t midasPath = '/Validate';\r\n\t\r\n\tvar publicMethods = {\r\n\t // Validate requires a callback method to handle that response mapping from midas. We need to convert a payment response into a boolean success / failure result thats returned to the client.\r\n\t process: function (paymentDetails, validateCallback) {\r\n\t try {\r\n\t log.info('Processing Validate message for payment brand [' + paymentDetails.type + ']...');\r\n\t\r\n\t var validateRequest = new MidasRequest(storage.get(CONST_GENERAL.CONSUMER_SESSION_ID_KEY), cache.merchantJwt, paymentDetails.Order, paymentDetails.type).generateOrderRequest(),\r\n\t validateCallbackResult;\r\n\t\r\n\t validateRequest.BrowserPayload.PaymentProcessorTransactionId = paymentDetails.PaymentProcessorTransactionId;\r\n\t\r\n\t validateRequest.BrowserPayload.ProcessorPaymentType = paymentDetails.paymentDetails;\r\n\t\r\n\t return midasClient.post(midasPath, validateRequest)\r\n\t .then(jwtUtility.unpackResponseJwt)\r\n\t .then(function (midasResponse) {\r\n\t log.info('Posted Validate request successfully.');\r\n\t\r\n\t if (midasResponse && midasResponse.decodedObject.Payload) {\r\n\t var parsedResponse = responseMapper.map.midas.to.merchantResponse(midasResponse.decodedObject.Payload);\r\n\t\r\n\t if (validateCallback && typeof validateCallback === 'function') {\r\n\t validateCallbackResult = validateCallback(parsedResponse);\r\n\t passiveEvents.publish(CONST_EVENTS.VALIDATED, validateCallbackResult, midasResponse.rawJwt);\r\n\t } else {\r\n\t log.debug('Invalid callback set, skipping callback.');\r\n\t }\r\n\t } else {\r\n\t log.debug('Response requires no additional processing.');\r\n\t }\r\n\t\r\n\t })\r\n\t ['catch'](function (error) {\r\n\t generalUtility.handleError(error, CONST_ERRORS.MIDAS.VALIDATE.NUMBER, CONST_ERRORS.MIDAS.VALIDATE.DESCRIPTION);\r\n\t });\r\n\t } catch (error) {\r\n\t generalUtility.handleError(error, CONST_ERRORS.GENERAL.NUMBER, CONST_ERRORS.GENERAL.DESCRIPTION);\r\n\t }\r\n\t }\r\n\t};\r\n\t\r\n\tevents.subscribe(CONST_EVENTS.INTERNAL.FINISHED, publicMethods.process);\r\n\t\r\n\tmodule.exports = publicMethods;\n\n/***/ }),\n\n/***/ 127:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar _ = __webpack_require__(12),\r\n\t configManager = __webpack_require__(24),\r\n\t CONST_ERRORS = __webpack_require__(31),\r\n\t CONST_EVENTS = __webpack_require__(51),\r\n\t CONST_MESSAGES = __webpack_require__(61),\r\n\t cache = __webpack_require__(3),\r\n\t internalEvents = __webpack_require__(14),\r\n\t htmlUtility = __webpack_require__(67),\r\n\t jwtUtility = __webpack_require__(71),\r\n\t log = __webpack_require__(15).getLoggerInstance('Base.Events.PostMessageHandler'),\r\n\t generalUtility = __webpack_require__(32),\r\n\t passiveEvents = __webpack_require__(14).passive,\r\n\t responseMapper = __webpack_require__(41),\r\n\t ServiceError = __webpack_require__(54),\r\n\t uiManager = __webpack_require__(75),\r\n\t acsTimingUtility = __webpack_require__(128),\r\n\t endpointMonitor = __webpack_require__(63);\r\n\t\r\n\tvar publicMethods = {\r\n\t receiveMessage: function (event) {\r\n\t var responseJwt = event.data,\r\n\t decodedResponse, mappedResponse, requestObject;\r\n\t\r\n\t try {\r\n\t var foundMidasDomain = _.find(configManager.getSystemConfig().midas.postMessageDomains, function (domain) {\r\n\t return domain === event.origin;\r\n\t });\r\n\t\r\n\t if (event.origin === configManager.getSystemConfig().payments.hostedFields.domain || foundMidasDomain !== undefined) {\r\n\t try {\r\n\t if (responseJwt.length > 1) {\r\n\t /**\r\n\t * 08/2020 - We have changed the 3DS TermURL response generation to match the other JSON based response structures. \r\n\t * This has been done to allow the CruiseAPI intergration to filter out invalid PostMessages more accurately. However\r\n\t * the older alternative payment brands will retain the older response structure because CruiseAPI doesn't support them and\r\n\t * we are unlikely to continue supporting them long term (from lack of merchant interest).\r\n\t */\r\n\t if (event.data.indexOf('CardinalJWT') > -1) {\r\n\t requestObject = JSON.parse(event.data);\r\n\t if (requestObject.CardinalJWT.length > 0) {\r\n\t decodedResponse = jwtUtility.parse(requestObject.CardinalJWT);\r\n\t responseJwt = requestObject.CardinalJWT\r\n\t } else {\r\n\t mappedResponse = new ServiceError(requestObject);\r\n\t mappedResponse.ErrorNumber = CONST_ERRORS.MALFORMED_JWT.NUMBER\r\n\t mappedResponse.ErrorDescription = CONST_ERRORS.MALFORMED_JWT.DESCRIPTION\r\n\t responseJwt = undefined;\r\n\t try {\r\n\t uiManager.plugin.events.close();\r\n\t } catch (error) {\r\n\t log.debug(\"Error Processing plugin\", error)\r\n\t }\r\n\t passiveEvents.publish(CONST_EVENTS.VALIDATED, mappedResponse, responseJwt);\r\n\t return\r\n\t }\r\n\t } else {\r\n\t // Attempt to parse the data as a response from Midas\r\n\t decodedResponse = jwtUtility.parse(event.data);\r\n\t }\r\n\t }\r\n\t } catch (jwtParseError) {\r\n\t try {\r\n\t // Attempt to parse the data as a message from Hosted Fields\r\n\t requestObject = JSON.parse(event.data);\r\n\t\r\n\t if (requestObject !== undefined && 'MessageType' in requestObject && 'Type' in requestObject) {\r\n\t\r\n\t switch (requestObject.Type) {\r\n\t case \"HostedField\":\r\n\t // Request is formatted as hosted fields object\r\n\t internalEvents.publish(CONST_EVENTS.INTERNAL.HOSTED_FIELD_REQUEST_RECEIVED, false, requestObject);\r\n\t return;\r\n\t case \"CCA\":\r\n\t internalEvents.publish(CONST_EVENTS.INTERNAL.CCA_REQUEST_RECEIVED, false, requestObject);\r\n\t return;\r\n\t case \"DF\":\r\n\t internalEvents.publish(CONST_EVENTS.INTERNAL.DF_REQUEST_RECEIVED, false, requestObject);\r\n\t return;\r\n\t default:\r\n\t log.error('Unknown request type [' + requestObject.Type + ']');\r\n\t return;\r\n\t }\r\n\t\r\n\t }\r\n\t } catch (jsonParseError) {\r\n\t log.error(\"Failed to parse post message. Error [\" + jsonParseError + \"] Message [\" + event.data + \"]\");\r\n\t return;\r\n\t }\r\n\t\r\n\t }\r\n\t\r\n\t try {\r\n\t\r\n\t if (typeof decodedResponse.Payload === 'string') {\r\n\t decodedResponse.Payload = JSON.parse(decodedResponse.Payload);\r\n\t }\r\n\t\r\n\t log.info('Post Message message received: ' + JSON.stringify(decodedResponse, null, ' '));\r\n\t\r\n\t try {\r\n\t uiManager.plugin.events.close();\r\n\t } catch (error) {\r\n\t log.debug(\"Error Processing Ui Manager plugin\", error)\r\n\t }\r\n\t mappedResponse = responseMapper.map.midas.to.merchantResponse(decodedResponse.Payload);\r\n\t acsTimingUtility.endTiming();\r\n\t endpointMonitor.capture('Acs Timing', acsTimingUtility.getElapsed(), true, acsTimingUtility.getRedirects());\r\n\t } catch (error) {\r\n\t log.debug('Parse error: ', error);\r\n\t\r\n\t try {\r\n\t var parsedResponse = JSON.parse(responseJwt);\r\n\t if (parsedResponse.CardinalJWT !== undefined) {\r\n\t parsedResponse = JSON.parse(parsedResponse.CardinalJWT)\r\n\t }\r\n\t if (\"Message\" in parsedResponse && \"ErrorNumber\" in parsedResponse) {\r\n\t mappedResponse = new ServiceError(parsedResponse);\r\n\t responseJwt = undefined;\r\n\t }\r\n\t try {\r\n\t uiManager.plugin.events.close();\r\n\t } catch (error) {\r\n\t log.debug(\"Error Processing Ui Manager plugin\", error)\r\n\t }\r\n\t \r\n\t\r\n\t } catch (jsonParseError) {\r\n\t log.error(\"Unable to parse reponse [\" + responseJwt + \"] \" + jsonParseError);\r\n\t }\r\n\t\r\n\t }\r\n\t\r\n\t if (mappedResponse !== undefined) {\r\n\t passiveEvents.publish(CONST_EVENTS.VALIDATED, mappedResponse, responseJwt);\r\n\t } else if (!cache.songbirdPostmessageValidation) {\r\n\t generalUtility.handleError(\"Unable to parse response\", CONST_ERRORS.GENERAL.NUMBER, CONST_ERRORS.GENERAL.DESCRIPTION);\r\n\t }\r\n\t } else {\r\n\t log.debug('Invalid domain [' + event.origin + ']');\r\n\t }\r\n\t\r\n\t } catch (e) {\r\n\t // INSIGHT - We want to keep this at the debug level to reduce the noise level if we have a bug in the filter block. This handler maybe capturing post message events generated by other applications. Some applications maybe using post message as a heart beat so they may occur constantly.\r\n\t log.debug(\"Error while processing post message request\", e);\r\n\t }\r\n\t\r\n\t }\r\n\t};\r\n\t\r\n\thtmlUtility.bind(CONST_MESSAGES.MESSAGE, window, publicMethods.receiveMessage);\r\n\t\r\n\tmodule.exports = publicMethods;\n\n/***/ }),\n\n/***/ 128:\n/***/ (function(module, exports) {\n\n\tvar numberOfRedirects,\r\n\t start,\r\n\t end,\r\n\t publicMethods = {\r\n\t /**\r\n\t * Starts the Acs timing process\r\n\t */\r\n\t startTiming: function () {\r\n\t publicMethods.endTiming();\r\n\t\r\n\t numberOfRedirects = 0;\r\n\t start = new Date();\r\n\t end = null;\r\n\t },\r\n\t /**\r\n\t * Ends the currently started Acs timing process\r\n\t */\r\n\t endTiming: function () {\r\n\t end = new Date();\r\n\t },\r\n\t /**\r\n\t * Acs iframe onload event handler to capture the number of redirects\r\n\t */\r\n\t loadHandler: function () {\r\n\t numberOfRedirects++;\r\n\t },\r\n\t /**\r\n\t * @return {int} the number of redirects for the current timing process\r\n\t */\r\n\t getRedirects: function () {\r\n\t return numberOfRedirects;\r\n\t },\r\n\t /**\r\n\t * @return {int} Returns the elapsed timestamp in millseconds for the current timing process\r\n\t */\r\n\t getElapsed: function () {\r\n\t return end - start;\r\n\t }\r\n\t }\r\n\t\r\n\tmodule.exports = publicMethods;\n\n/***/ }),\n\n/***/ 129:\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar cache = __webpack_require__(3),\r\n\t configManager = __webpack_require__(24),\r\n\t CorsClient = __webpack_require__(65),\r\n\t CONST_ERRORS = __webpack_require__(31),\r\n\t CONST_EVENTS = __webpack_require__(51),\r\n\t CONST_GENERAL = __webpack_require__(70),\r\n\t events = __webpack_require__(14),\r\n\t generalUtility = __webpack_require__(32),\r\n\t jwtUtility = __webpack_require__(71),\r\n\t log = __webpack_require__(15).getLoggerInstance('Base.Message.Continue'),\r\n\t endpointMonitor = __webpack_require__(63),\r\n\t midasClient = new CorsClient(configManager.getSystemConfig().midas.base + 'Order/JWT', true, configManager.getMerchantConfig().timeout, null, null, endpointMonitor.captureXhr),\r\n\t midasPath = '/Continue',\r\n\t MidasRequest = __webpack_require__(117),\r\n\t RSVP = __webpack_require__(18),\r\n\t storage = __webpack_require__(118),\r\n\t uiManager = __webpack_require__(75);\r\n\t\r\n\tvar publicMethods = {\r\n\t process: function (paymentDetails, continueCallback) {\r\n\t var deferred = RSVP.defer();\r\n\t\r\n\t try {\r\n\t log.info('Processing Continue Message for payment brand [' + paymentDetails.type + ']...');\r\n\t\r\n\t var continueRequest = new MidasRequest(storage.get(CONST_GENERAL.CONSUMER_SESSION_ID_KEY), cache.merchantJwt, paymentDetails.Order, paymentDetails.type).generateOrderRequest();\r\n\t\r\n\t midasClient.post(midasPath, continueRequest)\r\n\t .then(jwtUtility.unpackResponseJwt)\r\n\t .then(function (midasResponse) {\r\n\t log.info('Continue request completed successfully.');\r\n\t\r\n\t if (midasResponse) {\r\n\t if (continueCallback && typeof continueCallback === 'function') {\r\n\t continueCallback(midasResponse);\r\n\t deferred.resolve(midasResponse);\r\n\t } else {\r\n\t log.debug('Invalid callback set, skipping callback for deferred.');\r\n\t deferred.resolve(midasResponse);\r\n\t }\r\n\t } else {\r\n\t deferred.resolve(midasResponse);\r\n\t }\r\n\t\r\n\t })\r\n\t ['catch'](function (error) {\r\n\t uiManager.loader.events.hide();\r\n\t generalUtility.handleError(error, CONST_ERRORS.MIDAS.CONTINUE.NUMBER, CONST_ERRORS.MIDAS.CONTINUE.DESCRIPTION);\r\n\t deferred.reject(error);\r\n\t });\r\n\t\r\n\t } catch (error) {\r\n\t // Attempt to close the loader, but fail silently since we're unsure of the current state\r\n\t try {\r\n\t uiManager.loader.events.hide();\r\n\t deferred.reject(error);\r\n\t } catch (e) { }\r\n\t\r\n\t generalUtility.handleError(error, CONST_ERRORS.GENERAL.NUMBER, CONST_ERRORS.GENERAL.DESCRIPTION);\r\n\t }\r\n\t\r\n\t return deferred.promise;\r\n\t }\r\n\t};\r\n\t\r\n\tevents.subscribe(CONST_EVENTS.INTERNAL.CONTINUE, publicMethods.process);\r\n\tmodule.exports = publicMethods;\r\n\n\n/***/ })\n\n});\n\n\n// WEBPACK FOOTER //\n// 10.a960453caa80548c4a43.songbird.js","var configs = require('../config/configManager');\r\n\r\nfunction MidasRequest(consumerSessionId, serverJWT, order, paymentType) {\r\n this.ClientAgent = configs.getSystemConfig().client;\r\n this.ClientVersion = configs.getSystemConfig().version;\r\n this.ConsumerSessionId = consumerSessionId;\r\n this.ServerJWT = serverJWT;\r\n\r\n if (order === null || order === undefined) {\r\n order = {\r\n OrderDetails: {},\r\n Consumer: {\r\n BillingAddress: {},\r\n ShippingAddress: {},\r\n Account: {}\r\n },\r\n Cart: [],\r\n Token: {},\r\n Authorization: {},\r\n Options: {},\r\n CCAExtension: {}\r\n };\r\n } else if(order !== undefined){\r\n order.OrderDetails = order.OrderDetails || {};\r\n order.Consumer = order.Consumer || {};\r\n order.Consumer.BillingAddress = order.Consumer.BillingAddress || {};\r\n order.Consumer.ShippingAddress = order.Consumer.ShippingAddress || {};\r\n order.Consumer.Account = order.Consumer.Account || {};\r\n order.Cart = order.Cart || [];\r\n order.Token = order.Token || {};\r\n order.Authorization = order.Authorization || {};\r\n order.Options = order.Options || {};\r\n order.CCAExtension = order.CCAExtension || {};\r\n }\r\n\r\n this.Order = order;\r\n this.PaymentType = paymentType;\r\n}\r\n\r\nMidasRequest.prototype.generateOrderRequest = function () {\r\n return {\r\n BrowserPayload: {\r\n PaymentType: this.PaymentType,\r\n Order: this.Order,\r\n },\r\n Client: {\r\n Agent: this.ClientAgent,\r\n Version: this.ClientVersion,\r\n },\r\n ConsumerSessionId: this.ConsumerSessionId,\r\n ServerJWT: this.ServerJWT\r\n };\r\n};\r\n\r\nMidasRequest.prototype.generateGenericRequest = function () {\r\n return {\r\n Client: {\r\n Agent: this.ClientAgent,\r\n Version: this.ClientVersion,\r\n },\r\n ConsumerSessionId: this.ConsumerSessionId,\r\n ServerJWT: this.ServerJWT\r\n };\r\n};\r\n\r\nmodule.exports = MidasRequest;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./models/midasRequest.js\n// module id = 117\n// module chunks = 9 10 17","var cache = require('../models/cache'),\r\n cookieHelper = require('cookies-js'),\r\n log = require(\"../libraries/logger\").getLoggerInstance('Base.StorageUtility'),\r\n storageHelper = require('simplestorage.js');\r\n\r\n// When we load the script we should evaluate the localstorage availablity immedately\r\nif (cache.localStorageAvailable === undefined) {\r\n cache.localStorageAvailable = storageHelper.canUse();\r\n log.debug(\"local storage is \" + (cache.localStorageAvailable === true ? \"available\" : \"unavailable\"));\r\n}\r\n\r\nif(cache.cookiesEnabled === undefined){\r\n cache.cookiesEnabled = cookieHelper.enabled;\r\n log.debug(\"Cookies are \" +(cookieHelper.enabled ? \"enabled\" : \"disabled\"));\r\n}\r\n\r\n// NEXTREV: Add option for if cookies are disabled. Most likely would only be in memory storage, but the issue needs to be considered more. \r\nvar publicMethods = {\r\n /**\r\n * Persist a KVP to storage that can be restored on a seperate page load\r\n * @param {string} key The key\r\n * @param {string} value The value\r\n * @param {Date=} expiration An optional date time the value should expire\r\n */\r\n put: function (key, value, expiration) {\r\n var currentTime = new Date(),\r\n options = {},\r\n elapsedMillis;\r\n\r\n if (cache.localStorageAvailable) {\r\n\r\n if (expiration) {\r\n elapsedMillis = currentTime.getTime() - expiration.getTime();\r\n options = {\r\n TTL: elapsedMillis\r\n };\r\n }\r\n\r\n storageHelper.set(key, value, options);\r\n } else if(cookieHelper.enabled){\r\n\r\n if (expiration) {\r\n options = {\r\n expires: expiration\r\n };\r\n }\r\n\r\n cookieHelper.set(key, value, options);\r\n } else {\r\n cache.storage[key] = value;\r\n }\r\n },\r\n /**\r\n * Get a KVP out of storage\r\n * @param {String} key The key to restore from storage\r\n * @return The value found mapped to the key in storage\r\n */\r\n get: function (key) {\r\n if (cache.localStorageAvailable) {\r\n return storageHelper.get(key);\r\n } else if(cache.cookiesEnabled){\r\n return cookieHelper.get(key);\r\n } else {\r\n try{\r\n return cache.storage[key]\r\n } catch(error){\r\n log.error('Failed to retrieve data from memory cache' + error);\r\n return undefined;\r\n } \r\n }\r\n }\r\n};\r\n\r\nmodule.exports = publicMethods;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./utilities/storageUtility.js\n// module id = 118\n// module chunks = 9 10","/*\r\n * Cookies.js - 1.2.3\r\n * https://github.com/ScottHamper/Cookies\r\n *\r\n * This is free and unencumbered software released into the public domain.\r\n */\r\n(function (global, undefined) {\r\n 'use strict';\r\n\r\n var factory = function (window) {\r\n if (typeof window.document !== 'object') {\r\n throw new Error('Cookies.js requires a `window` with a `document` object');\r\n }\r\n\r\n var Cookies = function (key, value, options) {\r\n return arguments.length === 1 ?\r\n Cookies.get(key) : Cookies.set(key, value, options);\r\n };\r\n\r\n // Allows for setter injection in unit tests\r\n Cookies._document = window.document;\r\n\r\n // Used to ensure cookie keys do not collide with\r\n // built-in `Object` properties\r\n Cookies._cacheKeyPrefix = 'cookey.'; // Hurr hurr, :)\r\n \r\n Cookies._maxExpireDate = new Date('Fri, 31 Dec 9999 23:59:59 UTC');\r\n\r\n Cookies.defaults = {\r\n path: '/',\r\n secure: false\r\n };\r\n\r\n Cookies.get = function (key) {\r\n if (Cookies._cachedDocumentCookie !== Cookies._document.cookie) {\r\n Cookies._renewCache();\r\n }\r\n \r\n var value = Cookies._cache[Cookies._cacheKeyPrefix + key];\r\n\r\n return value === undefined ? undefined : decodeURIComponent(value);\r\n };\r\n\r\n Cookies.set = function (key, value, options) {\r\n options = Cookies._getExtendedOptions(options);\r\n options.expires = Cookies._getExpiresDate(value === undefined ? -1 : options.expires);\r\n\r\n Cookies._document.cookie = Cookies._generateCookieString(key, value, options);\r\n\r\n return Cookies;\r\n };\r\n\r\n Cookies.expire = function (key, options) {\r\n return Cookies.set(key, undefined, options);\r\n };\r\n\r\n Cookies._getExtendedOptions = function (options) {\r\n return {\r\n path: options && options.path || Cookies.defaults.path,\r\n domain: options && options.domain || Cookies.defaults.domain,\r\n expires: options && options.expires || Cookies.defaults.expires,\r\n secure: options && options.secure !== undefined ? options.secure : Cookies.defaults.secure\r\n };\r\n };\r\n\r\n Cookies._isValidDate = function (date) {\r\n return Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime());\r\n };\r\n\r\n Cookies._getExpiresDate = function (expires, now) {\r\n now = now || new Date();\r\n\r\n if (typeof expires === 'number') {\r\n expires = expires === Infinity ?\r\n Cookies._maxExpireDate : new Date(now.getTime() + expires * 1000);\r\n } else if (typeof expires === 'string') {\r\n expires = new Date(expires);\r\n }\r\n\r\n if (expires && !Cookies._isValidDate(expires)) {\r\n throw new Error('`expires` parameter cannot be converted to a valid Date instance');\r\n }\r\n\r\n return expires;\r\n };\r\n\r\n Cookies._generateCookieString = function (key, value, options) {\r\n key = key.replace(/[^#$&+\\^`|]/g, encodeURIComponent);\r\n key = key.replace(/\\(/g, '%28').replace(/\\)/g, '%29');\r\n value = (value + '').replace(/[^!#$&-+\\--:<-\\[\\]-~]/g, encodeURIComponent);\r\n options = options || {};\r\n\r\n var cookieString = key + '=' + value;\r\n cookieString += options.path ? ';path=' + options.path : '';\r\n cookieString += options.domain ? ';domain=' + options.domain : '';\r\n cookieString += options.expires ? ';expires=' + options.expires.toUTCString() : '';\r\n cookieString += options.secure ? ';secure' : '';\r\n\r\n return cookieString;\r\n };\r\n\r\n Cookies._getCacheFromString = function (documentCookie) {\r\n var cookieCache = {};\r\n var cookiesArray = documentCookie ? documentCookie.split('; ') : [];\r\n\r\n for (var i = 0; i < cookiesArray.length; i++) {\r\n var cookieKvp = Cookies._getKeyValuePairFromCookieString(cookiesArray[i]);\r\n\r\n if (cookieCache[Cookies._cacheKeyPrefix + cookieKvp.key] === undefined) {\r\n cookieCache[Cookies._cacheKeyPrefix + cookieKvp.key] = cookieKvp.value;\r\n }\r\n }\r\n\r\n return cookieCache;\r\n };\r\n\r\n Cookies._getKeyValuePairFromCookieString = function (cookieString) {\r\n // \"=\" is a valid character in a cookie value according to RFC6265, so cannot `split('=')`\r\n var separatorIndex = cookieString.indexOf('=');\r\n\r\n // IE omits the \"=\" when the cookie value is an empty string\r\n separatorIndex = separatorIndex < 0 ? cookieString.length : separatorIndex;\r\n\r\n var key = cookieString.substr(0, separatorIndex);\r\n var decodedKey;\r\n try {\r\n decodedKey = decodeURIComponent(key);\r\n } catch (e) {\r\n if (console && typeof console.error === 'function') {\r\n console.error('Could not decode cookie with key \"' + key + '\"', e);\r\n }\r\n }\r\n \r\n return {\r\n key: decodedKey,\r\n value: cookieString.substr(separatorIndex + 1) // Defer decoding value until accessed\r\n };\r\n };\r\n\r\n Cookies._renewCache = function () {\r\n Cookies._cache = Cookies._getCacheFromString(Cookies._document.cookie);\r\n Cookies._cachedDocumentCookie = Cookies._document.cookie;\r\n };\r\n\r\n Cookies._areEnabled = function () {\r\n var testKey = 'cookies.js';\r\n var areEnabled = Cookies.set(testKey, 1).get(testKey) === '1';\r\n Cookies.expire(testKey);\r\n return areEnabled;\r\n };\r\n\r\n Cookies.enabled = Cookies._areEnabled();\r\n\r\n return Cookies;\r\n };\r\n var cookiesExport = (global && typeof global.document === 'object') ? factory(global) : factory;\r\n\r\n // AMD support\r\n if (typeof define === 'function' && define.amd) {\r\n define(function () { return cookiesExport; });\r\n // CommonJS/Node.js support\r\n } else if (typeof exports === 'object') {\r\n // Support Node.js specific `module.exports` (which can be a function)\r\n if (typeof module === 'object' && typeof module.exports === 'object') {\r\n exports = module.exports = cookiesExport;\r\n }\r\n // But always support CommonJS module 1.1.1 spec (`exports` cannot be a function)\r\n exports.Cookies = cookiesExport;\r\n } else {\r\n global.Cookies = cookiesExport;\r\n }\r\n})(typeof window === 'undefined' ? this : window);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/cookies-js/dist/cookies.js\n// module id = 119\n// module chunks = 9 10","/*! simpleStorage v0.2.1, Unlicense 2016. https://github.com/andris9/simpleStorage */\n!function(a,b){\"use strict\";\"function\"==typeof define&&define.amd?define(b):\"undefined\"!=typeof exports?module.exports=b():a.simpleStorage=b()}(this,function(){\"use strict\";function a(){p=j(),d(),g(),b(),\"addEventListener\"in window&&window.addEventListener(\"pageshow\",function(a){a.persisted&&c()},!1),p=!0}function b(){\"addEventListener\"in window?window.addEventListener(\"storage\",c,!1):document.attachEvent(\"onstorage\",c)}function c(){try{d()}catch(a){return void(p=!1)}g()}function d(){var a=localStorage.getItem(\"simpleStorage\");try{n=JSON.parse(a)||{}}catch(b){n={}}o=f()}function e(){try{localStorage.setItem(\"simpleStorage\",JSON.stringify(n)),o=f()}catch(a){return k(a)}return!0}function f(){var a=localStorage.getItem(\"simpleStorage\");return a?String(a).length:0}function g(){var a,b,c,d,f,h=1/0,j=0;if(clearTimeout(q),n&&n.__simpleStorage_meta&&n.__simpleStorage_meta.TTL){for(a=+new Date,f=n.__simpleStorage_meta.TTL.keys||[],d=n.__simpleStorage_meta.TTL.expire||{},b=0,c=f.length;c>b;b++){if(!(d[f[b]]<=a)){d[f[b]]c;c++)n.__simpleStorage_meta.TTL.keys[c]===a&&n.__simpleStorage_meta.TTL.keys.splice(c);for(c=0,d=n.__simpleStorage_meta.TTL.keys.length;d>c;c++)if(n.__simpleStorage_meta.TTL.expire[n.__simpleStorage_meta.TTL.keys[c]]>e+b){n.__simpleStorage_meta.TTL.keys.splice(c,0,a),f=!0;break}f||n.__simpleStorage_meta.TTL.keys.push(a)}else if(n&&n.__simpleStorage_meta&&n.__simpleStorage_meta.TTL){if(n.__simpleStorage_meta.TTL.expire.hasOwnProperty(a))for(delete n.__simpleStorage_meta.TTL.expire[a],c=0,d=n.__simpleStorage_meta.TTL.keys.length;d>c;c++)if(n.__simpleStorage_meta.TTL.keys[c]===a){n.__simpleStorage_meta.TTL.keys.splice(c,1);break}i()}return clearTimeout(q),n&&n.__simpleStorage_meta&&n.__simpleStorage_meta.TTL&&n.__simpleStorage_meta.TTL.keys.length&&(q=setTimeout(g,Math.min(Math.max(n.__simpleStorage_meta.TTL.expire[n.__simpleStorage_meta.TTL.keys[0]]-e,0),2147483647))),!0}function i(){var a,b=!1,c=!1;if(!n||!n.__simpleStorage_meta)return b;n.__simpleStorage_meta.TTL&&!n.__simpleStorage_meta.TTL.keys.length&&(delete n.__simpleStorage_meta.TTL,b=!0);for(a in n.__simpleStorage_meta)if(n.__simpleStorage_meta.hasOwnProperty(a)){c=!0;break}return c||(delete n.__simpleStorage_meta,b=!0),b}function j(){var a,b=0;if(null===window.localStorage||\"unknown\"==typeof window.localStorage)throw a=new Error(\"localStorage is disabled\"),a.code=t,a;if(!window.localStorage)throw a=new Error(\"localStorage not supported\"),a.code=s,a;try{b=window.localStorage.length}catch(c){throw k(c)}try{window.localStorage.setItem(\"__simpleStorageInitTest\",Date.now().toString(16)),window.localStorage.removeItem(\"__simpleStorageInitTest\")}catch(c){throw b?k(c):(a=new Error(\"localStorage is disabled\"),a.code=t,a)}return!0}function k(a){var b;return 22===a.code||1014===a.code||[-2147024882,-2146828281,-21474675259].indexOf(a.number)>0?(b=new Error(\"localStorage quota exceeded\"),b.code=u,b):18===a.code||1e3===a.code?(b=new Error(\"localStorage is disabled\"),b.code=t,b):\"TypeError\"===a.name?(b=new Error(\"localStorage is disabled\"),b.code=t,b):a}function l(a){if(!a)return r=\"OK\",a;switch(a.code){case s:case t:case u:r=a.code;break;default:r=a.code||a.number||a.message||a.name}return a}var m=\"0.2.1\",n=!1,o=0,p=!1,q=null,r=\"OK\",s=\"LS_NOT_AVAILABLE\",t=\"LS_DISABLED\",u=\"LS_QUOTA_EXCEEDED\";try{a()}catch(v){l(v)}return{version:m,status:r,canUse:function(){return\"OK\"===r&&!!p},set:function(a,b,c){if(\"__simpleStorage_meta\"===a)return!1;if(!n)return!1;if(\"undefined\"==typeof b)return this.deleteKey(a);c=c||{};try{b=JSON.parse(JSON.stringify(b))}catch(d){return k(d)}return n[a]=b,h(a,c.TTL||0),e()},hasKey:function(a){return n&&n.hasOwnProperty(a)&&\"__simpleStorage_meta\"!==a?!0:!1},get:function(a){return n?n.hasOwnProperty(a)&&\"__simpleStorage_meta\"!==a&&this.getTTL(a)?n[a]:void 0:!1},deleteKey:function(a){return n&&a in n?(delete n[a],h(a,0),e()):!1},setTTL:function(a,b){return n?(h(a,b),e()):!1},getTTL:function(a){var b;return n&&n.hasOwnProperty(a)?n.__simpleStorage_meta&&n.__simpleStorage_meta.TTL&&n.__simpleStorage_meta.TTL.expire&&n.__simpleStorage_meta.TTL.expire.hasOwnProperty(a)?(b=Math.max(n.__simpleStorage_meta.TTL.expire[a]-+new Date||0,0),b||!1):1/0:!1},flush:function(){if(!n)return!1;n={};try{return localStorage.removeItem(\"simpleStorage\"),!0}catch(a){return k(a)}},index:function(){if(!n)return!1;var a,b=[];for(a in n)n.hasOwnProperty(a)&&\"__simpleStorage_meta\"!==a&&b.push(a);return b},storageSize:function(){return o}}});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/simplestorage.js/simpleStorage.min.js\n// module id = 120\n// module chunks = 9 10","/**\r\n * Message to get configured payment brands for a merchant. This message will\r\n * also generate the buttons when the merchant calls the renderButton().\r\n **/\r\n\r\nvar _ = require('lodash'),\r\n cache = require('../models/cache'),\r\n configManager = require('../config/configManager'),\r\n CONST_ERRORS = require('../constants/errors'),\r\n CONST_EVENTS = require('../constants/events'),\r\n CONST_GENERAL = require('../constants/generalSettings'),\r\n CONST_PAYMENTS = require('../constants/payments'),\r\n CorsClient = require('../libraries/cors'),\r\n dfLibrary = require('../libraries/deviceFingerprinting'),\r\n deviceFingerprinterUtility = require('../utilities/deviceFingerprinterUtility'),\r\n events = require('../events/eventObserver'),\r\n GeneralError = require('../models/errors/generalError'),\r\n generalUtility = require('../utilities/generalUtility'),\r\n jwtUtility = require('../utilities/jwtUtility'),\r\n logger = require('../libraries/logger'),\r\n log = logger.getLoggerInstance('Base.Message.Init'),\r\n htmlUtility = require('../utilities/htmlUtility'),\r\n MidasRequest = require('../models/midasRequest'),\r\n passiveEvents = events.passive,\r\n RSVP = require('rsvp'),\r\n storage = require('../utilities/storageUtility'),\r\n supportedPaymentsUtility = require('../utilities/supportedPaymentsUtility');\r\n\r\nrequire('./start');\r\nrequire('./validate');\r\nrequire('./continue');\r\n\r\nvar endpointMonitor = require('../libraries/endpointMonitor'),\r\n midasClient = new CorsClient(configManager.getSystemConfig().midas.base + 'Order/JWT', true, configManager.getMerchantConfig().timeout, null, null, endpointMonitor.captureXhr),\r\n midasPath = '/Init';\r\n\r\nvar methods = {\r\n process: function () {\r\n try {\r\n log.info('Processing Init message...');\r\n\r\n if (cache.merchantJwt) {\r\n var consumerSessionId = storage.get(CONST_GENERAL.CONSUMER_SESSION_ID_KEY) || null,\r\n initRequest = new MidasRequest(consumerSessionId, cache.merchantJwt, cache.orderObject).generateOrderRequest(),\r\n supportsAlternativePayments = supportedPaymentsUtility.getCurrentSupportedList();\r\n\r\n initRequest.BrowserPayload.SupportsAlternativePayments = supportsAlternativePayments;\r\n\r\n midasClient.post(midasPath, initRequest)\r\n .then(jwtUtility.unpackResponseJwt)\r\n .then(function (midasResponse) {\r\n var dfCompletionTimePromise = null;\r\n\r\n if (!initRequest.ConsumerSessionId && midasResponse.decodedObject.ConsumerSessionId) {\r\n log.debug('Starting new session with midas');\r\n storage.put(CONST_GENERAL.CONSUMER_SESSION_ID_KEY, midasResponse.decodedObject.ConsumerSessionId);\r\n cache.consumerSessionId = midasResponse.decodedObject.ConsumerSessionId;\r\n cache.deviceFingerprinting.shouldRunFingerprinting = true;\r\n } else if (initRequest.ConsumerSessionId === midasResponse.decodedObject.ConsumerSessionId) {\r\n log.debug('Resuming session found stored in browser');\r\n cache.consumerSessionId = consumerSessionId;\r\n // 2018-10-5 - Enabling DF on all requests as a work around for an issue with CruiseAPI, /Bin/Load, and associating ReferenceIds properly at DF.\r\n // Once this issue has been resolved we should remove this enabled flag\r\n cache.deviceFingerprinting.shouldRunFingerprinting = true;\r\n } else {\r\n log.debug('Received a new session Id from Midas');\r\n storage.put(CONST_GENERAL.CONSUMER_SESSION_ID_KEY, midasResponse.decodedObject.ConsumerSessionId);\r\n cache.consumerSessionId = midasResponse.decodedObject.ConsumerSessionId;\r\n cache.deviceFingerprinting.shouldRunFingerprinting = true;\r\n }\r\n\r\n if (midasResponse.decodedObject.Payload.URLs) {\r\n var urls = midasResponse.decodedObject.Payload.URLs;\r\n\r\n if (urls.DeviceFingerprint) {\r\n cache.deviceFingerprinting.urls.base = urls.DeviceFingerprint.Base;\r\n cache.deviceFingerprinting.urls.queryString = deviceFingerprinterUtility.constructQueryParameterString(urls.DeviceFingerprint.QueryParameters);\r\n cache.deviceFingerprinting.urls.browser = cache.deviceFingerprinting.urls.base + CONST_GENERAL.URLS.DEVICE_FINGERPRINTER.BROWSER_RENDER + cache.deviceFingerprinting.urls.queryString;\r\n cache.deviceFingerprinting.urls.profileBin = cache.deviceFingerprinting.urls.base + CONST_GENERAL.URLS.DEVICE_FINGERPRINTER.BIN_RENDER + cache.deviceFingerprinting.urls.queryString;\r\n }\r\n\r\n if (urls.HostedFields) {\r\n cache.urls.hostedFields = urls.HostedFields;\r\n }\r\n }\r\n var optimizelyFlags = midasResponse.decodedObject.Payload.OptimizelyFlags;\r\n if(optimizelyFlags !== undefined){\r\n if ('SongbirdPostMessageValidation' in optimizelyFlags && optimizelyFlags.SongbirdPostMessageValidation === true){\r\n\r\n cache.songbirdPostmessageValidation = true;\r\n } else{\r\n log.debug(\"Problem occurred while processing optimizely flags\")\r\n }\r\n } else {\r\n log.debug(\"Unable to load Optimizely flags\")\r\n }\r\n \r\n\r\n if (cache.deviceFingerprinting.shouldRunFingerprinting) {\r\n log.debug('Detected DF as enabled, starting collection');\r\n dfCompletionTimePromise = dfLibrary.profileOnInit()\r\n .catch(function () {\r\n log.warn(\"Profiling failure may impact CCA 2.0 features\");\r\n })\r\n } else {\r\n // Create an auto resolving promise to ensure we don't wait any additional time for DF\r\n dfCompletionTimePromise = new RSVP.Promise(function (resolve) {\r\n resolve();\r\n });\r\n }\r\n\r\n configManager.parseEnabledFeatures(midasResponse.decodedObject.Payload);\r\n\r\n initUtils.parsePayments(midasResponse.decodedObject.Payload, dfCompletionTimePromise)\r\n .then(function (moduleState) {\r\n log.info('All expected payments have finished loading.');\r\n passiveEvents.publish(CONST_EVENTS.SETUP_COMPLETE, {\r\n sessionId: cache.consumerSessionId,\r\n modules: moduleState\r\n });\r\n })\r\n .catch(function (error) {\r\n log.error(\"Exception while processing module loading results: \" + error);\r\n passiveEvents.publish(CONST_EVENTS.SETUP_COMPLETE, {\r\n sessionId: cache.consumerSessionId,\r\n modules: []\r\n });\r\n })\r\n\r\n })['catch'](function (error) {\r\n generalUtility.handleError(error, CONST_ERRORS.MIDAS.INIT.NUMBER, CONST_ERRORS.MIDAS.INIT.DESCRIPTION);\r\n });\r\n\r\n } else {\r\n throw new GeneralError(CONST_ERRORS.VALIDATION.JWT.MISSING.NUMBER, CONST_ERRORS.VALIDATION.JWT.MISSING.DESCRIPTION);\r\n }\r\n } catch (error) {\r\n generalUtility.handleError(error, CONST_ERRORS.GENERAL.NUMBER, CONST_ERRORS.GENERAL.DESCRIPTION);\r\n }\r\n }\r\n};\r\n\r\nvar initUtils = {\r\n /**\r\n * FUTUREREV: Refactor to reduce complexity\r\n * \r\n * I don't see an obvious way to reduce complexity of this section, due to this the ESLint rule is being disabled for this function.\r\n * We should try to solve this complexity issue in the future if we're able as it will only get more complex as we continue to add features to Songbird.\r\n */\r\n parsePayments: function (response, dfCompletionTimePromise) {\r\n return new RSVP.Promise(function (resolve, reject) { // eslint-disable-line complexity\r\n try {\r\n var payments = [],\r\n hasInitiatedPayments = false,\r\n moduleLoadingResults, initTimerStart, initTimer;\r\n\r\n if ('InitiatedPayments' in response) {\r\n hasInitiatedPayments = true;\r\n }\r\n\r\n\r\n // Bootstrap Payment Brands\r\n //\r\n // INSIGHT - We chunk each payment brand out into its own enclosed chunk to prevent downloading unncessary payment brands. We may want to re-think this solution as we add more payment brands, as it could result in a lot of extra HTTP requests\r\n\r\n if ('EnabledCCA' in response && response.EnabledCCA === true) {\r\n try {\r\n payments.push(initUtils.promiseFactory(CONST_PAYMENTS.CCA));\r\n require.ensure([], function (require) {\r\n require('../payments/cca/cca').init();\r\n\r\n endpointMonitor.captureTiming(htmlUtility.getCurrentScript());\r\n }, 'Payment - CCA');\r\n } catch (error) {\r\n log.error('failed to load ' + CONST_PAYMENTS.CCA + ': ' + error);\r\n }\r\n }\r\n\r\n if ('EnabledApplePay' in response && response.EnabledApplePay === true) {\r\n if (response.InitiatedPayments !== undefined) {\r\n if ('ApplePay' in response.InitiatedPayments && response.InitiatedPayments.ApplePay instanceof Object) {\r\n try {\r\n payments.push(initUtils.promiseFactory(CONST_PAYMENTS.APPLE_PAY));\r\n require.ensure([], function (require) {\r\n require('../payments/applePay/applePay').init(response.InitiatedPayments.ApplePay);\r\n\r\n endpointMonitor.captureTiming(htmlUtility.getCurrentScript());\r\n }, 'Payment - Apple Pay');\r\n } catch (error) {\r\n log.error('failed to load ' + CONST_PAYMENTS.APPLE_PAY + ': ' + error);\r\n }\r\n }\r\n } else {\r\n log.error('Apple Pay marked as enabled, but no initialization data was found on Init response');\r\n }\r\n }\r\n\r\n if ('EnabledDiscover' in response && response.EnabledDiscover === true) {\r\n try {\r\n payments.push(initUtils.promiseFactory(CONST_PAYMENTS.DISCOVER));\r\n require.ensure([], function (require) {\r\n require('../payments/discoverWallet').init();\r\n\r\n endpointMonitor.captureTiming(htmlUtility.getCurrentScript());\r\n }, 'Payment - Discover Wallet');\r\n } catch (error) {\r\n log.error('failed to load ' + CONST_PAYMENTS.DISCOVER + ': ' + error);\r\n }\r\n }\r\n\r\n if ('EnabledHostedFields' in response && response.EnabledHostedFields === true) {\r\n try {\r\n payments.push(initUtils.promiseFactory(CONST_PAYMENTS.HOSTED_FIELDS));\r\n require.ensure([], function (require) {\r\n require('../payments/hostedFields').init();\r\n\r\n endpointMonitor.captureTiming(htmlUtility.getCurrentScript());\r\n }, 'Payment - Hosted Fields');\r\n } catch (error) {\r\n log.error('failed to load ' + CONST_PAYMENTS.HOSTED_FIELDS + ': ' + error);\r\n }\r\n }\r\n\r\n if ('EnabledPaypal' in response && response.EnabledPaypal === true) {\r\n var configurationData;\r\n // INSIGHT - PayPal has a few processors you can transact through to add PayPal to your site. Depending on which the merchant is using there may or may not be a configuration object returned back\r\n if (hasInitiatedPayments && 'Paypal' in response.InitiatedPayments) {\r\n configurationData = response.InitiatedPayments.Paypal;\r\n }\r\n\r\n try {\r\n payments.push(initUtils.promiseFactory(CONST_PAYMENTS.PAYPAL));\r\n require.ensure([], function (require) {\r\n require('../payments/paypal').init(configurationData);\r\n\r\n endpointMonitor.captureTiming(htmlUtility.getCurrentScript());\r\n }, 'Payment - PayPal');\r\n } catch (error) {\r\n log.error('failed to load ' + CONST_PAYMENTS.PAYPAL + ': ' + error);\r\n }\r\n\r\n }\r\n\r\n if ('EnabledVisaCheckout' in response && response.EnabledVisaCheckout === true && hasInitiatedPayments) {\r\n if ('VisaCheckout' in response.InitiatedPayments && typeof response.InitiatedPayments.VisaCheckout === 'object') {\r\n try {\r\n payments.push(initUtils.promiseFactory(CONST_PAYMENTS.VISACHECKOUT));\r\n require.ensure([], function (require) {\r\n require('../payments/visaCheckout').init(response.InitiatedPayments.VisaCheckout);\r\n\r\n endpointMonitor.captureTiming(htmlUtility.getCurrentScript());\r\n }, 'Payment - Visa Checkout');\r\n } catch (error) {\r\n log.error('Failed to load ' + CONST_PAYMENTS.VISACHECKOUT + ': ' + error);\r\n }\r\n\r\n }\r\n }\r\n\r\n log.debug('Waiting for [' + payments.length + '] payment modules to load');\r\n\r\n initTimerStart = Date.now();\r\n initTimer = setTimeout(function () {\r\n logger.enableAjaxLogging(configManager.getSystemConfig());\r\n log.error('Init completed slowly');\r\n }, configManager.getSystemConfig().initTimeout);\r\n\r\n RSVP.allSettled(payments)\r\n .then(function (modulePromiseResults) {\r\n // Store the module load attempt promise results to a var so we can process it on the finally block\r\n moduleLoadingResults = modulePromiseResults;\r\n\r\n log.debug('All payment brands initalized in [' + (Date.now() - initTimerStart) + ']ms');\r\n return dfCompletionTimePromise;\r\n })\r\n .finally(function () {\r\n try {\r\n var moduleState;\r\n\r\n clearTimeout(initTimer);\r\n log.debug('DF and all payment brands completed in [' + (Date.now() - initTimerStart) + ']ms');\r\n\r\n moduleState = initUtils.generateSetupCompleteObject(moduleLoadingResults)\r\n\r\n cache.setup.eventCompleted = true;\r\n cache.setup.modulesLoaded = moduleState;\r\n\r\n resolve(moduleState);\r\n } catch (error) {\r\n reject(error);\r\n } finally {\r\n endpointMonitor.flushAll();\r\n }\r\n });\r\n\r\n } catch (error) {\r\n log.error('Failed while attempting to load payment modules: ' + error);\r\n reject(error);\r\n }\r\n })\r\n\r\n },\r\n promiseFactory: function (payment) {\r\n var deferredCompletion = RSVP.defer(),\r\n startLoadTime = Date.now(),\r\n paymentLoadingTimeout = setTimeout(function () {\r\n log.error(payment + ' took too long to initialize, skipping payment brand.')\r\n deferredCompletion.reject({\r\n type: payment,\r\n error: 'Payment took too long to initialize'\r\n })\r\n }, configManager.getSystemConfig().paymentLoadTimeout);\r\n\r\n // Subscribe to the internal event for the button loaded\r\n events.subscribe(payment + '.' + CONST_EVENTS.INTERNAL.BUTTON_LOADED, function (isLoaded, data) {\r\n var endLoadTime = Date.now();\r\n log.debug('Payment [' + payment + '] loaded in [' + (endLoadTime - startLoadTime) + ']ms')\r\n clearTimeout(paymentLoadingTimeout);\r\n if (isLoaded) {\r\n deferredCompletion.resolve({\r\n type: payment,\r\n data: data\r\n });\r\n } else {\r\n deferredCompletion.reject({\r\n type: payment,\r\n data: data\r\n });\r\n }\r\n });\r\n\r\n // Return a shell promise we can use to easily track when all buttons have finished loading\r\n return deferredCompletion.promise;\r\n },\r\n /**\r\n * Helper function to create the data object returned to the merchant on what modules were loaded\r\n * @param {object} moduleLoadingResults An array of promise results with the status of the module load in it\r\n * @returns {Array} An array of objects that defines what module was loaded and the state of the attempted load (success/failure)\r\n */\r\n generateSetupCompleteObject: function (moduleLoadingResults) {\r\n var moduleState = [];\r\n _.each(moduleLoadingResults, function (moduleReport) {\r\n var module = {\r\n module: moduleReport.state === 'fulfilled' ? moduleReport.value.type : moduleReport.reason.type,\r\n loaded: moduleReport.state === 'fulfilled' ? true : false\r\n };\r\n if (moduleReport.data !== undefined) {\r\n module.data = moduleReport.data;\r\n }\r\n moduleState.push(module);\r\n });\r\n return moduleState;\r\n }\r\n};\r\n\r\nmodule.exports = methods;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./messages/init.js\n// module id = 121\n// module chunks = 10","module.exports = {\r\n\tCCA: 'CCA',\r\n\tDISCOVER: 'discoverWallet',\r\n\tPAYPAL:'paypal',\r\n\tVISACHECKOUT: 'visaCheckout',\r\n\tWALLET: 'wallet',\r\n\tAPPLE_PAY: 'applePay',\r\n\tHOSTED_FIELDS: 'hostedFields'\r\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./constants/payments.js\n// module id = 122\n// module chunks = 10","/**\r\n * Simple set of utilities to determining what features are supported in the merchants current integration.\r\n */\r\nvar _ = require('lodash'),\r\n cache = require('../models/cache'),\r\n CONST_PAYMENTS = require('../constants/payments'),\r\n configManager = require('../config/configManager'),\r\n log = require('../libraries/logger').getLoggerInstance('Base.SupportedPaymentsUtility');\r\n\r\nvar publicMethods = {\r\n /**\r\n * Utility for determining what payment brands are supported by the merchants current integration\r\n * @returns {{paymentKey: boolean}} an object of KVPs of supported status\r\n */\r\n getCurrentSupportedList: function () {\r\n var merchantOverrideConfigurations = {},\r\n // INSIGHT - CCA is the execption, it should be considered to be always enabled\r\n buttonPaymentBrands = _.omit(configManager.getSystemConfig().payments, [CONST_PAYMENTS.CCA.toLowerCase(), CONST_PAYMENTS.HOSTED_FIELDS]),\r\n mergedGenericButtonConfigurations, genericButtonResults, specificPaymentOverridesResults,\r\n resultObject = {\r\n cca: true\r\n };\r\n\r\n _.each(configManager.getMerchantConfig(), function (object, key) {\r\n if (key in buttonPaymentBrands) {\r\n if ('button' in object && 'containerId' in object.button) {\r\n merchantOverrideConfigurations[key] = object;\r\n }\r\n }\r\n });\r\n\r\n // Merge System and Merchant configurations to determine if the merchant has overriden the default \r\n mergedGenericButtonConfigurations = _.merge({}, configManager.getSystemConfig().button, configManager.getMerchantConfig().payment.button);\r\n\r\n genericButtonResults = publicMethods.lookForGenericButton(mergedGenericButtonConfigurations.containerId, buttonPaymentBrands);\r\n specificPaymentOverridesResults = publicMethods.lookForSpecificButtons(merchantOverrideConfigurations);\r\n\r\n resultObject[CONST_PAYMENTS.HOSTED_FIELDS] = publicMethods.lookForHostedFields();\r\n\r\n resultObject = _.merge(resultObject, genericButtonResults, specificPaymentOverridesResults);\r\n\r\n return resultObject\r\n },\r\n /**\r\n * A helper to determine if a set of payment brands is supported by the current merchant configuration.\r\n * @param {string} containerId - The ID to use as the generic div to look inside for payment buttons\r\n * @param {Object} buttonPaymentBrands - An object containing the configurations for all payment brands that use payment buttons\r\n * @returns {Object} KVP of payment brands and their detected supported state\r\n */\r\n lookForGenericButton: function (containerId, buttonPaymentBrands) {\r\n var doesGenericDivExist = publicMethods.checkForButtonWithinDiv(containerId),\r\n resultObject = {};\r\n\r\n _.each(buttonPaymentBrands, function (configurationObject, key) {\r\n var keyValue = key.toLowerCase();\r\n resultObject[keyValue] = doesGenericDivExist;\r\n if ('type' in configurationObject) {\r\n resultObject[configurationObject.type] = doesGenericDivExist;\r\n }\r\n });\r\n\r\n return resultObject;\r\n },\r\n /**\r\n * Looks for specific payment brand override values\r\n * @param {Object}\r\n * @return {Object} KVP of payment brands and their supported state\r\n */\r\n lookForSpecificButtons: function (merchantOverrideConfigurations) {\r\n var resultObject = {};\r\n\r\n if (!_.isEmpty(merchantOverrideConfigurations)) {\r\n _.each(merchantOverrideConfigurations, function (configurationObject, key) {\r\n var keyValue = key.toLowerCase(),\r\n doesSpecificButtonDivExist = publicMethods.checkForButtonWithinDiv(configurationObject.button.containerId);\r\n\r\n resultObject[keyValue] = doesSpecificButtonDivExist;\r\n if ('type' in configurationObject) {\r\n resultObject[configurationObject.type] = doesSpecificButtonDivExist;\r\n }\r\n });\r\n }\r\n\r\n return resultObject;\r\n },\r\n /**\r\n * Checks for the minimal field set required for hosted fields, and ensures all elements are in fact DIVs\r\n * @returns {boolean} supported state flag\r\n */\r\n lookForHostedFields: function () {\r\n var returnValue = false;\r\n if (cache.formFields !== undefined) {\r\n \r\n var missingElements = _.filter(configManager.getSystemConfig().payments.hostedFields.minimumFields, function (requiredFieldKey) {\r\n var field = cache.formFields[requiredFieldKey];\r\n if (field !== undefined && 'tagName' in field && field.tagName === 'DIV') {\r\n return false;\r\n } else {\r\n log.info('Missing required field for Hosted Fields: ' + requiredFieldKey)\r\n return true;\r\n }\r\n });\r\n\r\n if(missingElements.length === 0){\r\n returnValue = true;\r\n }\r\n \r\n }\r\n return returnValue;\r\n },\r\n /**\r\n * Simple helper to determine if an element is found on the page or not\r\n * @param {string} elementId - The HTML id of the element you want to try and find\r\n * @returns {boolean} if the element was found or not\r\n */\r\n checkForButtonWithinDiv: function (elementId) {\r\n return document.getElementById(elementId) !== null;\r\n }\r\n}\r\n\r\nmodule.exports = publicMethods;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./utilities/supportedPaymentsUtility.js\n// module id = 123\n// module chunks = 10","/**\r\n* Message to initalize an order in Centinel. Most payment brands will not need the response\r\n* to this message. Some, like CCA, will, however.\r\n**/\r\nvar cache = require('../models/cache'),\r\n configManager = require('../config/configManager'),\r\n CorsClient = require('../libraries/cors'),\r\n CONST_ERRORS = require('../constants/errors'),\r\n CONST_EVENTS = require('../constants/events'),\r\n CONST_GENERAL = require('../constants/generalSettings'),\r\n CONST_RESPONSE_VALIDATION_TYPE = require('../constants/responseValidationType'),\r\n events = require('../events/eventObserver'),\r\n generalUtility = require('../utilities/generalUtility'),\r\n jwtUtility = require('../utilities/jwtUtility'),\r\n log = require('../libraries/logger').getLoggerInstance('Base.Message.Start'),\r\n publicMethods,\r\n MidasRequest = require('../models/midasRequest'),\r\n storage = require('../utilities/storageUtility'),\r\n uiManager = require('../libraries/uiManager');\r\n\r\nvar endpointMonitor = require('../libraries/endpointMonitor'),\r\n midasClient = new CorsClient(configManager.getSystemConfig().midas.base + 'Order/JWT', true, configManager.getMerchantConfig().timeout, null, null, endpointMonitor.captureXhr),\r\n midasPath = '/Start';\r\n\r\npublicMethods = {\r\n /**\r\n * Sends a /Start request to Centinel API\r\n * @param {Object} paymentDetails - The full request object that should be sent to Centinel API\r\n * @param {function=} startCallback - The function that should be called when the start request has been completed. Based off the responseValidationType, this maybe only when the response was sucessful\r\n * @param {string=} responseValidationType - A flag to indicate if the response should be fully validated. This field uses the constant file 'responseValidationType' as the type\r\n * @returns {PromiseLike} A promise that completes when the response has been returned. If full validation is on the response will automatically be feed into the generic handler and published to payments.validated.\r\n */\r\n process: function (paymentDetails, startCallback, responseValidationType) {\r\n\r\n try {\r\n log.info('Processing Start Message for payment brand [' + paymentDetails.type + ']...');\r\n\r\n var startRequest = new MidasRequest(storage.get(CONST_GENERAL.CONSUMER_SESSION_ID_KEY), cache.merchantJwt, paymentDetails.Order, paymentDetails.type).generateOrderRequest();\r\n\r\n if (responseValidationType === undefined) {\r\n responseValidationType = CONST_RESPONSE_VALIDATION_TYPE.FULL;\r\n }\r\n\r\n return midasClient.post(midasPath, startRequest)\r\n .then(function (rawResponseJwt) {\r\n var decodedResponse;\r\n switch (responseValidationType) {\r\n default:\r\n case CONST_RESPONSE_VALIDATION_TYPE.FULL:\r\n log.debug('using full response validation on /Start response');\r\n decodedResponse = jwtUtility.unpackResponseJwt(rawResponseJwt);\r\n break;\r\n case CONST_RESPONSE_VALIDATION_TYPE.NONE:\r\n try {\r\n log.debug('using low response validation on /Start response');\r\n if (rawResponseJwt !== undefined && rawResponseJwt.CardinalJWT !== undefined) {\r\n decodedResponse = {\r\n decodedObject: jwtUtility.parseResponse(rawResponseJwt.CardinalJWT),\r\n rawJwt: rawResponseJwt.CardinalJWT\r\n };\r\n } else {\r\n log.debug('Response is unrecognizable, unable to properly parse.');\r\n }\r\n } catch (parseError) {\r\n log.info(\"JWT parsing failed, moving on \" + parseError);\r\n }\r\n\r\n break;\r\n }\r\n\r\n return decodedResponse;\r\n })\r\n .then(function (midasResponse) {\r\n log.info('Start request completed successfully.');\r\n\r\n if (midasResponse) {\r\n if (startCallback && typeof startCallback === 'function') {\r\n startCallback(midasResponse);\r\n } else {\r\n log.debug('Invalid callback set, skipping callback.');\r\n }\r\n } else {\r\n log.debug('Response requires no additional processing.');\r\n }\r\n\r\n })\r\n ['catch'](function (error) {\r\n uiManager.loader.events.hide();\r\n generalUtility.handleError(error, CONST_ERRORS.MIDAS.START.NUMBER, CONST_ERRORS.MIDAS.START.DESCRIPTION);\r\n });\r\n\r\n } catch (error) {\r\n // Attempt to close the loader, but fail silently since we're unsure of the current state\r\n try {\r\n uiManager.loader.events.hide();\r\n } catch (e) { }\r\n\r\n generalUtility.handleError(error, CONST_ERRORS.GENERAL.NUMBER, CONST_ERRORS.GENERAL.DESCRIPTION);\r\n }\r\n }\r\n};\r\n\r\n// INSIGHT - The start message can be triggered by an internal event or by being directly required and triggered by function call.\r\nevents.subscribe(CONST_EVENTS.INTERNAL.SELECTED, publicMethods.process);\r\nmodule.exports = publicMethods;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./messages/start.js\n// module id = 124\n// module chunks = 10","module.exports = {\r\n /**\r\n * Look for all types of errors and throw an exception when one is found. Exceptions are handled by the generalUtility.handleError\r\n */\r\n FULL: 'full',\r\n /**\r\n * Do no validation on the response. This is useful when a request is not required to be successful, like when pushing optional data to an endpoint or if a payment brand as an optional /Start message to Centinel API.\r\n */\r\n NONE: 'none'\r\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./constants/responseValidationType.js\n// module id = 125\n// module chunks = 10","var cache = require('../models/cache'),\r\n configManager = require('../config/configManager'),\r\n CONST_ERRORS = require('../constants/errors'),\r\n CONST_EVENTS = require('../constants/events'),\r\n CONST_GENERAL = require('../constants/generalSettings'),\r\n CorsClient = require('../libraries/cors'),\r\n events = require('../events/eventObserver'),\r\n generalUtility = require('../utilities/generalUtility'),\r\n jwtUtility = require('../utilities/jwtUtility'),\r\n log = require('../libraries/logger').getLoggerInstance('Base.Message.Validate'),\r\n MidasRequest = require('../models/midasRequest'),\r\n passiveEvents = require('../events/eventObserver').passive,\r\n responseMapper = require('../utilities/responseMapper'),\r\n storage = require('../utilities/storageUtility');\r\n\r\nrequire('../events/postMessageHandler');\r\n\r\nvar endpointMonitor = require('../libraries/endpointMonitor'),\r\n midasClient = new CorsClient(configManager.getSystemConfig().midas.base + 'Order/JWT', true, configManager.getMerchantConfig().timeout, null, null, endpointMonitor.captureXhr),\r\n midasPath = '/Validate';\r\n\r\nvar publicMethods = {\r\n // Validate requires a callback method to handle that response mapping from midas. We need to convert a payment response into a boolean success / failure result thats returned to the client.\r\n process: function (paymentDetails, validateCallback) {\r\n try {\r\n log.info('Processing Validate message for payment brand [' + paymentDetails.type + ']...');\r\n\r\n var validateRequest = new MidasRequest(storage.get(CONST_GENERAL.CONSUMER_SESSION_ID_KEY), cache.merchantJwt, paymentDetails.Order, paymentDetails.type).generateOrderRequest(),\r\n validateCallbackResult;\r\n\r\n validateRequest.BrowserPayload.PaymentProcessorTransactionId = paymentDetails.PaymentProcessorTransactionId;\r\n\r\n validateRequest.BrowserPayload.ProcessorPaymentType = paymentDetails.paymentDetails;\r\n\r\n return midasClient.post(midasPath, validateRequest)\r\n .then(jwtUtility.unpackResponseJwt)\r\n .then(function (midasResponse) {\r\n log.info('Posted Validate request successfully.');\r\n\r\n if (midasResponse && midasResponse.decodedObject.Payload) {\r\n var parsedResponse = responseMapper.map.midas.to.merchantResponse(midasResponse.decodedObject.Payload);\r\n\r\n if (validateCallback && typeof validateCallback === 'function') {\r\n validateCallbackResult = validateCallback(parsedResponse);\r\n passiveEvents.publish(CONST_EVENTS.VALIDATED, validateCallbackResult, midasResponse.rawJwt);\r\n } else {\r\n log.debug('Invalid callback set, skipping callback.');\r\n }\r\n } else {\r\n log.debug('Response requires no additional processing.');\r\n }\r\n\r\n })\r\n ['catch'](function (error) {\r\n generalUtility.handleError(error, CONST_ERRORS.MIDAS.VALIDATE.NUMBER, CONST_ERRORS.MIDAS.VALIDATE.DESCRIPTION);\r\n });\r\n } catch (error) {\r\n generalUtility.handleError(error, CONST_ERRORS.GENERAL.NUMBER, CONST_ERRORS.GENERAL.DESCRIPTION);\r\n }\r\n }\r\n};\r\n\r\nevents.subscribe(CONST_EVENTS.INTERNAL.FINISHED, publicMethods.process);\r\n\r\nmodule.exports = publicMethods;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./messages/validate.js\n// module id = 126\n// module chunks = 10","var _ = require('lodash'),\r\n configManager = require('../config/configManager'),\r\n CONST_ERRORS = require('../constants/errors'),\r\n CONST_EVENTS = require('../constants/events'),\r\n CONST_MESSAGES = require('../constants/messages'),\r\n cache = require('../models/cache'),\r\n internalEvents = require('./eventObserver'),\r\n htmlUtility = require('../utilities/htmlUtility'),\r\n jwtUtility = require('../utilities/jwtUtility'),\r\n log = require(\"../libraries/logger\").getLoggerInstance('Base.Events.PostMessageHandler'),\r\n generalUtility = require('../utilities/generalUtility'),\r\n passiveEvents = require('./eventObserver').passive,\r\n responseMapper = require('../utilities/responseMapper'),\r\n ServiceError = require('../models/errors/midas/serviceError'),\r\n uiManager = require('../libraries/uiManager'),\r\n acsTimingUtility = require('../utilities/acsTimingUtility'),\r\n endpointMonitor = require('../libraries/endpointMonitor');\r\n\r\nvar publicMethods = {\r\n receiveMessage: function (event) {\r\n var responseJwt = event.data,\r\n decodedResponse, mappedResponse, requestObject;\r\n\r\n try {\r\n var foundMidasDomain = _.find(configManager.getSystemConfig().midas.postMessageDomains, function (domain) {\r\n return domain === event.origin;\r\n });\r\n\r\n if (event.origin === configManager.getSystemConfig().payments.hostedFields.domain || foundMidasDomain !== undefined) {\r\n try {\r\n if (responseJwt.length > 1) {\r\n /**\r\n * 08/2020 - We have changed the 3DS TermURL response generation to match the other JSON based response structures. \r\n * This has been done to allow the CruiseAPI intergration to filter out invalid PostMessages more accurately. However\r\n * the older alternative payment brands will retain the older response structure because CruiseAPI doesn't support them and\r\n * we are unlikely to continue supporting them long term (from lack of merchant interest).\r\n */\r\n if (event.data.indexOf('CardinalJWT') > -1) {\r\n requestObject = JSON.parse(event.data);\r\n if (requestObject.CardinalJWT.length > 0) {\r\n decodedResponse = jwtUtility.parse(requestObject.CardinalJWT);\r\n responseJwt = requestObject.CardinalJWT\r\n } else {\r\n mappedResponse = new ServiceError(requestObject);\r\n mappedResponse.ErrorNumber = CONST_ERRORS.MALFORMED_JWT.NUMBER\r\n mappedResponse.ErrorDescription = CONST_ERRORS.MALFORMED_JWT.DESCRIPTION\r\n responseJwt = undefined;\r\n try {\r\n uiManager.plugin.events.close();\r\n } catch (error) {\r\n log.debug(\"Error Processing plugin\", error)\r\n }\r\n passiveEvents.publish(CONST_EVENTS.VALIDATED, mappedResponse, responseJwt);\r\n return\r\n }\r\n } else {\r\n // Attempt to parse the data as a response from Midas\r\n decodedResponse = jwtUtility.parse(event.data);\r\n }\r\n }\r\n } catch (jwtParseError) {\r\n try {\r\n // Attempt to parse the data as a message from Hosted Fields\r\n requestObject = JSON.parse(event.data);\r\n\r\n if (requestObject !== undefined && 'MessageType' in requestObject && 'Type' in requestObject) {\r\n\r\n switch (requestObject.Type) {\r\n case \"HostedField\":\r\n // Request is formatted as hosted fields object\r\n internalEvents.publish(CONST_EVENTS.INTERNAL.HOSTED_FIELD_REQUEST_RECEIVED, false, requestObject);\r\n return;\r\n case \"CCA\":\r\n internalEvents.publish(CONST_EVENTS.INTERNAL.CCA_REQUEST_RECEIVED, false, requestObject);\r\n return;\r\n case \"DF\":\r\n internalEvents.publish(CONST_EVENTS.INTERNAL.DF_REQUEST_RECEIVED, false, requestObject);\r\n return;\r\n default:\r\n log.error('Unknown request type [' + requestObject.Type + ']');\r\n return;\r\n }\r\n\r\n }\r\n } catch (jsonParseError) {\r\n log.error(\"Failed to parse post message. Error [\" + jsonParseError + \"] Message [\" + event.data + \"]\");\r\n return;\r\n }\r\n\r\n }\r\n\r\n try {\r\n\r\n if (typeof decodedResponse.Payload === 'string') {\r\n decodedResponse.Payload = JSON.parse(decodedResponse.Payload);\r\n }\r\n\r\n log.info('Post Message message received: ' + JSON.stringify(decodedResponse, null, ' '));\r\n\r\n try {\r\n uiManager.plugin.events.close();\r\n } catch (error) {\r\n log.debug(\"Error Processing Ui Manager plugin\", error)\r\n }\r\n mappedResponse = responseMapper.map.midas.to.merchantResponse(decodedResponse.Payload);\r\n acsTimingUtility.endTiming();\r\n endpointMonitor.capture('Acs Timing', acsTimingUtility.getElapsed(), true, acsTimingUtility.getRedirects());\r\n } catch (error) {\r\n log.debug('Parse error: ', error);\r\n\r\n try {\r\n var parsedResponse = JSON.parse(responseJwt);\r\n if (parsedResponse.CardinalJWT !== undefined) {\r\n parsedResponse = JSON.parse(parsedResponse.CardinalJWT)\r\n }\r\n if (\"Message\" in parsedResponse && \"ErrorNumber\" in parsedResponse) {\r\n mappedResponse = new ServiceError(parsedResponse);\r\n responseJwt = undefined;\r\n }\r\n try {\r\n uiManager.plugin.events.close();\r\n } catch (error) {\r\n log.debug(\"Error Processing Ui Manager plugin\", error)\r\n }\r\n \r\n\r\n } catch (jsonParseError) {\r\n log.error(\"Unable to parse reponse [\" + responseJwt + \"] \" + jsonParseError);\r\n }\r\n\r\n }\r\n\r\n if (mappedResponse !== undefined) {\r\n passiveEvents.publish(CONST_EVENTS.VALIDATED, mappedResponse, responseJwt);\r\n } else if (!cache.songbirdPostmessageValidation) {\r\n generalUtility.handleError(\"Unable to parse response\", CONST_ERRORS.GENERAL.NUMBER, CONST_ERRORS.GENERAL.DESCRIPTION);\r\n }\r\n } else {\r\n log.debug('Invalid domain [' + event.origin + ']');\r\n }\r\n\r\n } catch (e) {\r\n // INSIGHT - We want to keep this at the debug level to reduce the noise level if we have a bug in the filter block. This handler maybe capturing post message events generated by other applications. Some applications maybe using post message as a heart beat so they may occur constantly.\r\n log.debug(\"Error while processing post message request\", e);\r\n }\r\n\r\n }\r\n};\r\n\r\nhtmlUtility.bind(CONST_MESSAGES.MESSAGE, window, publicMethods.receiveMessage);\r\n\r\nmodule.exports = publicMethods;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./events/postMessageHandler.js\n// module id = 127\n// module chunks = 10","var numberOfRedirects,\r\n start,\r\n end,\r\n publicMethods = {\r\n /**\r\n * Starts the Acs timing process\r\n */\r\n startTiming: function () {\r\n publicMethods.endTiming();\r\n\r\n numberOfRedirects = 0;\r\n start = new Date();\r\n end = null;\r\n },\r\n /**\r\n * Ends the currently started Acs timing process\r\n */\r\n endTiming: function () {\r\n end = new Date();\r\n },\r\n /**\r\n * Acs iframe onload event handler to capture the number of redirects\r\n */\r\n loadHandler: function () {\r\n numberOfRedirects++;\r\n },\r\n /**\r\n * @return {int} the number of redirects for the current timing process\r\n */\r\n getRedirects: function () {\r\n return numberOfRedirects;\r\n },\r\n /**\r\n * @return {int} Returns the elapsed timestamp in millseconds for the current timing process\r\n */\r\n getElapsed: function () {\r\n return end - start;\r\n }\r\n }\r\n\r\nmodule.exports = publicMethods;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./utilities/acsTimingUtility.js\n// module id = 128\n// module chunks = 10","var cache = require('../models/cache'),\r\n configManager = require('../config/configManager'),\r\n CorsClient = require('../libraries/cors'),\r\n CONST_ERRORS = require('../constants/errors'),\r\n CONST_EVENTS = require('../constants/events'),\r\n CONST_GENERAL = require('../constants/generalSettings'),\r\n events = require('../events/eventObserver'),\r\n generalUtility = require('../utilities/generalUtility'),\r\n jwtUtility = require('../utilities/jwtUtility'),\r\n log = require('../libraries/logger').getLoggerInstance('Base.Message.Continue'),\r\n endpointMonitor = require('../libraries/endpointMonitor'),\r\n midasClient = new CorsClient(configManager.getSystemConfig().midas.base + 'Order/JWT', true, configManager.getMerchantConfig().timeout, null, null, endpointMonitor.captureXhr),\r\n midasPath = '/Continue',\r\n MidasRequest = require('../models/midasRequest'),\r\n RSVP = require('rsvp'),\r\n storage = require('../utilities/storageUtility'),\r\n uiManager = require('../libraries/uiManager');\r\n\r\nvar publicMethods = {\r\n process: function (paymentDetails, continueCallback) {\r\n var deferred = RSVP.defer();\r\n\r\n try {\r\n log.info('Processing Continue Message for payment brand [' + paymentDetails.type + ']...');\r\n\r\n var continueRequest = new MidasRequest(storage.get(CONST_GENERAL.CONSUMER_SESSION_ID_KEY), cache.merchantJwt, paymentDetails.Order, paymentDetails.type).generateOrderRequest();\r\n\r\n midasClient.post(midasPath, continueRequest)\r\n .then(jwtUtility.unpackResponseJwt)\r\n .then(function (midasResponse) {\r\n log.info('Continue request completed successfully.');\r\n\r\n if (midasResponse) {\r\n if (continueCallback && typeof continueCallback === 'function') {\r\n continueCallback(midasResponse);\r\n deferred.resolve(midasResponse);\r\n } else {\r\n log.debug('Invalid callback set, skipping callback for deferred.');\r\n deferred.resolve(midasResponse);\r\n }\r\n } else {\r\n deferred.resolve(midasResponse);\r\n }\r\n\r\n })\r\n ['catch'](function (error) {\r\n uiManager.loader.events.hide();\r\n generalUtility.handleError(error, CONST_ERRORS.MIDAS.CONTINUE.NUMBER, CONST_ERRORS.MIDAS.CONTINUE.DESCRIPTION);\r\n deferred.reject(error);\r\n });\r\n\r\n } catch (error) {\r\n // Attempt to close the loader, but fail silently since we're unsure of the current state\r\n try {\r\n uiManager.loader.events.hide();\r\n deferred.reject(error);\r\n } catch (e) { }\r\n\r\n generalUtility.handleError(error, CONST_ERRORS.GENERAL.NUMBER, CONST_ERRORS.GENERAL.DESCRIPTION);\r\n }\r\n\r\n return deferred.promise;\r\n }\r\n};\r\n\r\nevents.subscribe(CONST_EVENTS.INTERNAL.CONTINUE, publicMethods.process);\r\nmodule.exports = publicMethods;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./messages/continue.js\n// module id = 129\n// module chunks = 10"],"sourceRoot":""}