{"version":3,"sources":["components/shared/Column/Column.tsx","components/shared/Grid/Grid.tsx","components/shared/Container/Container.tsx","components/template/BaseLayout.tsx","icons/components/ArrowDown.tsx","icons/components/ArrowLongDown.tsx","icons/components/Check.tsx","icons/components/Info.tsx","icons/components/LoaderDots.tsx","icons/components/Stripe.tsx","utils/classnames.ts","store/stepper/StepperContext.tsx","utils/hooks/use-stepper.ts","components/shared/Button/Button.tsx","services/HTTPClient.ts","services/index.ts","services/apiUrls.ts","utils/dates.ts","utils/formatting.ts","components/features/RefinanceStepper/formItems.ts","store/refinance/RefinanceContext.tsx","utils/general.ts","components/shared/Stepper/Stepper.tsx","utils/hooks/use-media.ts","components/shared/Input/Input.tsx","components/shared/InputHolder/InputHolder.tsx","components/shared/Select/Select.tsx","services/environment.ts","utils/validations.ts","components/shared/Text/Text.tsx","components/shared/Radio/Radio.tsx","components/features/MortgagePart/MortgagePart.tsx","components/features/MortgagePartInterest/MortgagePartInterest.tsx","components/features/RefinanceStepper/RefinanceStepper.tsx","components/features/RefinanceStepper/steps/Step-1.tsx","components/features/RefinanceStepper/steps/Step-2.tsx","components/features/RefinanceStepper/steps/Step-3.tsx","components/features/RefinanceStepper/steps/Step-4.tsx","components/features/RefinanceCta/RefinanceCta.tsx","utils/assetPrefix.ts","components/features/RefinanceResult/RefinanceResult.tsx","components/shared/Loader/Loader.tsx","pages/home.tsx","serviceWorker.ts","index.tsx"],"names":["breakpoints","createClasses","prefix","cols","reduce","classes","col","i","push","Column","extraClass","children","pull","pre","post","join","className","Grid","Container","BaseLayout","id","role","ArrowDownIcon","props","viewBox","fill","xmlns","d","ArrowLongDownIcon","stroke","CheckIcon","InfoIcon","LoaderDotsIcon","style","margin","background","preserveAspectRatio","display","transform","r","attributeName","type","begin","calcMode","keySplines","values","keyTimes","dur","repeatCount","StripeIcon","x","y","width","height","rx","parseClassFromArg","arg","classToAppend","Array","isArray","length","classNames","objPrototype","Object","prototype","toString","key","hasOwnProperty","call","classNameArgs","classAttr","parsed","defaultStepperState","steps","currentStep","reducer","state","action","payload","map","content","isActive","isTouched","isValid","StepperContext","createContext","dispatch","context","StepperProvider","useReducer","Provider","value","useStepper","useContext","Error","setCurrentStep","useCallback","setSteps","setStepActive","setStepValid","setStepTouched","Button","variant","url","label","extraClasses","disabled","isLoading","onClick","rest","href","HTTPGetClient","baseUrl","config","method","this","endpoint","request","data","defaultConfig","headers","Accept","body","JSON","stringify","fetch","then","response","a","json","ok","Promise","reject","API","version","hostname","window","location","api","indexOf","getApiUrl","parseDate","date","parse","Date","convertDateObject","displayFormat","format","convertToFirstOfTheNextMonth","dateString","getDate","setDate","addMonths","numberToCurrency","number","Intl","NumberFormat","currency","maximumFractionDigits","minimumFractionDigits","currencyToNumber","mustBeNumber","log","formattedValue","replaceAll","parseFloat","Math","round","toFixed","percentageToFloat","formItems","general","remainingTotalMortgageAmount","interestBase","step1","housePrice","countMortgageParts","tooltips","step2","mortgageParts","mortgagePart","mortgageType","mortgageTermYears","mortgageTermStart","currentInterestRate","interestRateFixedFor","interestRateFixedUntil","mortgageAmountStartFixedInterestRate","isThePenaltyAmountKnown","penaltyAmount","penaltyFreePayOffPercentage","comparativeInterest","newInterest","toolTips","mortgageTerm","interestRateFixed","step3","costs","administration","taxation","notary","mortgageWithNhg","nhg","step4","interest","lowestInterest","customInterest","preferredInterestAndPeriod","FormContext","React","form","remainingMortgage","updateForm","items","setRemainingMortgage","setIsLoading","updateData","FormProvider","useState","setForm","setNhg","setData","useEffect","getDebugData","get","res","info","parseSearchQuery","searchString","result","entriesIterator","URLSearchParams","entries","from","forEach","param","scrollToTopCalculator","extraCheck","yOffset","element","document","querySelector","getBoundingClientRect","top","pageYOffset","scrollTo","behavior","StepperStep","StepperContent","StepperHeader","title","completedText","mediaMatches","mediaQuery","isSsr","matchMedia","matches","setMatches","useLayoutEffect","mediaQueryList","listener","e","addListener","removeListener","useMediaQuery","Check","ArrowDown","Stripe","StepperSubmit","isValidated","isLastStep","onStepChange","setNextStep","setTimeout","ArrowLongDown","Stepper","defaultUrl","previousButtonTexts","defaultPreviousText","activeStep","formContext","hasCurrentStep","stepperSteps","Children","toArray","step","Input","name","defaultValue","placeholder","register","validation","hasError","viewValue","setType","$event","target","replace","htmlFor","onFocus","getType","autoComplete","onKeyDown","includes","preventDefault","onBlur","event","InputHolder","isCentered","isFlexWrap","tooltip","showToolTip","setShowToolTip","Info","dangerouslySetInnerHTML","__html","InputHolderItem","isSmall","isFullWidth","isFlexBasis","Select","defaultOption","options","hasValue","option","isLocal","isValidDate","isNaN","getTime","getDefaultValue","environment","getMortgageForm","mortgage","humanReadable","isWholeNumber","isPercentage","test","Text","Component","as","Radio","checked","defaultChecked","MortgagePart","errors","part","getValues","setError","clearErrors","rvpEndDateError","setRvpEndDateError","mortgageTermStartError","setMortgageTermStartError","showExtraFields","setShowExtraFields","getFormName","fireError","errorMsg","required","validate","notAPercentage","v","min","max","notWholeNumber","correctStartDate","mortgageTermEndDate","addYears","isBefore","isAfter","validateMortgageTermStartDate","correctEndDate","parseInt","interestRateFixedFrom","subYears","addDays","maxDate","validateRvpEndDate","onChange","currentTarget","MortgagePartInterest","setValue","showExtraField","setShowExtraField","remainingMortgagePart","setRemainingMortgagePart","interests","setInterests","percentage","isNhg","p","getMarketValuePercentage","marketValuePercentage","remainingYears","durationTerm","resFiltered","filter","index","period","ceil","indexOfLastItem","interestRate","shouldDirty","shouldValidate","residualDebt","durationTermString","endDate","parseISO","component","useForm","mode","defaultValues","search","handleSubmit","formState","setCompletedText","onSubmit","shouldUnregister","getValuesFormMortgagePart","formData","postData","referenceDate","marketValue","term","closed","mortgageInterest","durationRvp","loanBeginRvp","endRvp","getPostDataRemainingMortgage","totalResidualDebt","catch","error","existingBuilding","transferCost","cost","advice","withNhg","penaltyInterestKnown","penaltyInterestAmount","penaltyFreePercentage","getPostData","RefinanceStepper","RefinanceCta","isMobile","src","alt","process","RefinanceResult","explanation","monthlyPayment","old","new","total","penaltyInterest","transfer","benefit","abs","paidOffPeriod","months","formatDuration","intervalToDuration","start","end","locale","nl","getFormattedDuration","Loader","LoaderDots","Home","hidden","Boolean","match","ReactDOM","render","StrictMode","getElementById","navigator","serviceWorker","ready","registration","unregister","console","message"],"mappings":"mNAEMA,EAAwB,CAAC,KAAM,KAAM,KAAM,KAAM,OAEjDC,EAAgB,SAACC,EAAgBC,GACnC,OAAOA,EAAKC,QAAO,SAACC,EAAmBC,EAAKC,GAGxC,OAFAF,EAAQG,KAAW,IAAND,EAAA,UAAaL,EAAb,YAAuBI,GAAvB,UAAkCJ,EAAlC,YAA4CI,EAA5C,aAAoDN,EAAYO,KAEtEF,IACR,KAYMI,EAA0C,SAAC,GAQjD,IAAD,IAPFC,kBAOE,MAPW,GAOX,EANFC,EAME,EANFA,SAME,IALFR,YAKE,MALK,GAKL,MAJFK,YAIE,MAJK,GAIL,MAHFI,YAGE,MAHK,GAGL,MAFFC,WAEE,MAFI,GAEJ,MADFC,YACE,MADK,GACL,EACIT,EAAkB,sBACjBJ,EAAc,QAASE,IADN,YAEjBF,EAAc,SAAUO,IAFP,YAGjBP,EAAc,SAAUW,IAHP,YAIjBX,EAAc,QAASY,IAJN,YAKjBZ,EAAc,SAAUa,KAC7BC,KAAK,KAEP,OAAO,yBAAKC,UAAS,UAAKX,EAAL,YAAgBK,IAAeC,IChC3CM,EAAyC,SAAC,GAAD,QAAGP,kBAAH,MAAgB,GAAhB,EAAoBC,EAApB,EAAoBA,SAApB,OAClD,yBAAKK,UAAS,iBAAYN,IAAeC,ICDhCO,EAAmD,SAAC,GAAD,QAAGR,kBAAH,MAAgB,GAAhB,EAAoBC,EAApB,EAAoBA,SAApB,OAC5D,yBAAKK,UAAS,sBAAiBN,IAAeC,ICA3C,SAASQ,EAAT,GAAoD,IAA9BR,EAA6B,EAA7BA,SACzB,OACI,kBAAC,WAAD,KACI,0BAAMS,GAAG,UAAUC,KAAK,OAAOL,UAAU,wBACrC,kBAAC,EAAD,KAAYL,K,WCMbW,EAXO,SAACC,GACnB,OACI,uCAAKC,QAAQ,WAAWC,KAAK,OAAOC,MAAM,8BAAiCH,GACvE,0BACII,EAAE,6NACFF,KAAK,mBCONG,EAZW,SAACL,GACvB,OACI,uCAAKC,QAAQ,YAAYC,KAAK,OAAOC,MAAM,8BAAiCH,GACxE,0BACII,EAAE,oeACFF,KAAK,eACLI,OAAO,mBCKRC,EAXG,SAACP,GACf,OACI,uCAAKC,QAAQ,YAAYC,KAAK,OAAOC,MAAM,8BAAiCH,GACxE,0BACII,EAAE,oQACFF,KAAK,cCONM,EAZE,SAACR,GACd,OACI,uCAAKG,MAAM,6BAA6BF,QAAQ,aAAgBD,GAC5D,0BAAMI,EAAE,gBAAgBF,KAAK,SAC7B,0BACIE,EAAE,mGACFF,KAAK,cCuDNO,EA7DQ,SAACT,GACpB,OACI,uCACIG,MAAM,6BACNO,MAAO,CACHC,OAAQ,OACRC,WAAY,OAEhBX,QAAQ,cACRY,oBAAoB,WACpBC,QAAQ,SACJd,GACJ,uBAAGe,UAAU,oBACT,4BAAQC,EAAG,EAAGd,KAAK,UAAUa,UAAU,iBACnC,sCACIE,cAAc,YACdC,KAAK,QACLC,MAAM,UACNC,SAAS,SACTC,WAAW,0BACXC,OAAO,QACPC,SAAS,UACTC,IAAI,KACJC,YAAY,iBAIxB,uBAAGV,UAAU,oBACT,4BAAQC,EAAG,EAAGd,KAAK,UAAUa,UAAU,gBACnC,sCACIE,cAAc,YACdC,KAAK,QACLC,MAAM,SACNC,SAAS,SACTC,WAAW,0BACXC,OAAO,QACPC,SAAS,UACTC,IAAI,KACJC,YAAY,iBAIxB,uBAAGV,UAAU,oBACT,4BAAQC,EAAG,EAAGd,KAAK,UAAUa,UAAU,iBACnC,sCACIE,cAAc,YACdC,KAAK,QACLC,MAAM,UACNC,SAAS,SACTC,WAAW,0BACXC,OAAO,QACPC,SAAS,UACTC,IAAI,KACJC,YAAY,mBC7CrBC,EARI,SAAC1B,GAChB,OACI,uCAAKC,QAAQ,WAAWC,KAAK,OAAOC,MAAM,8BAAiCH,GACvE,0BAAM2B,EAAG,KAAOC,EAAG,KAAOC,MAAO,GAAIC,OAAQ,EAAGC,GAAI,IAAK7B,KAAK,WCSpE8B,EAAoB,SAACC,GACvB,IAAIC,EAAgB,GAEpB,GAAID,EACA,GAAIE,MAAMC,QAAQH,GACVA,EAAII,SACJH,EAAgBI,EAAU,WAAV,cAAcL,UAE/B,GAAmB,kBAARA,EAAkB,CAChC,IAAMM,EAAeC,OAAOC,UAE5B,GAAIF,EAAaG,WAAaT,EAAIS,SAC9BR,EAAgBD,EAAIS,gBAKpB,IAAK,IAAMC,KAAOV,EACVM,EAAaK,eAAeC,KAAKZ,EAAKU,IAAQV,EAAIU,KAClDT,IAAkBA,EAAgB,IAAM,IAAMS,QAK1DT,GAAiBD,EAIzB,OAAOC,GASI,SAASI,IAAoD,IAAD,uBAArCQ,EAAqC,yBAArCA,EAAqC,gBACvE,OAAOA,EAAcjE,QAAe,SAACkE,EAAWd,GAC5C,IAAMe,EAAShB,EAAkBC,GACjC,OAAOc,GAAaC,GAAUD,EAAY,IAAM,IAAMC,EAAS,MAChE,I,WCzDA,IA+BMC,EAAiC,CAC1CC,MAAO,GACPC,YAAa,GAGJC,EAAU,WAA0D,IAAzDC,EAAwD,uDAAhDJ,EAAqBK,EAA2B,uCACpEJ,EAAUG,EAAVH,MACAhC,EAAkBoC,EAAlBpC,KAAMqC,EAAYD,EAAZC,QAEd,OAAQrC,GACJ,IAxCwB,mBAyCpB,OAAO,2BACAmC,GADP,IAEIF,YAAaI,EAASJ,YACtBD,MACIA,GACAA,EAAMM,KAAI,SAACC,EAASzE,GAAV,OACNA,IAAMuE,EAASJ,YAAf,2BACWM,GADX,IACoBC,UAAU,EAAMC,WAAW,IACzCF,OAGtB,IAnDuB,kBAoDnB,OAAO,2BACAJ,GADP,IAEIH,MACIA,GACAA,EAAMM,KAAI,SAACC,EAASzE,GAAV,OACNA,IAAMuE,EAASJ,YAAf,2BAEaM,GAFb,IAGUC,UAAiB,OAAPH,QAAO,IAAPA,OAAA,EAAAA,EAASG,YAAY,IAEnCD,OAItB,IAjEsB,iBAkElB,OAAO,2BACAJ,GADP,IAEIH,MACIA,GACAA,EAAMM,KAAI,SAACC,EAASzE,GAAV,OACNA,IAAMuE,EAASJ,YAAf,2BAEaM,GAFb,IAGUG,SAAgB,OAAPL,QAAO,IAAPA,OAAA,EAAAA,EAASK,WAAW,IAEjCH,OAG1B,IA9E4B,mBA+E1B,OAAO,2BACFJ,GADL,IAEIH,MACEA,GACEA,EAAMM,KAAI,SAACC,EAASzE,GAAV,OACRA,IAAMuE,EAASJ,YAAf,2BAEKM,GAFL,IAGEE,WAAkB,OAAPJ,QAAO,IAAPA,OAAA,EAAAA,EAASI,aAAa,IAEhCF,OAGX,IAhGiB,YAiGb,OAAO,2BACAJ,GADP,IAEIH,MAAOK,EAASL,QAGxB,QACI,OAAOG,IAINQ,EAAiBC,wBAA2B,CACrDT,MAAOJ,EACPc,SAAU,SAACC,OAMFC,EAA4B,SAAC,GAAkB,IAAhB7E,EAAe,EAAfA,SACxC,EAA0B8E,qBAAWd,EAASH,GAA9C,mBAAOI,EAAP,KAAcU,EAAd,KAEA,OACI,kBAACF,EAAeM,SAAhB,CAAyBC,MAAO,CAAEf,QAAOU,aAAa3E,IChHjDiF,EAAa,WACtB,MAA4BC,qBAAWT,GAA/BR,EAAR,EAAQA,MAAOU,EAAf,EAAeA,SACPZ,EAAuBE,EAAvBF,YAAaD,EAAUG,EAAVH,MAErB,IAAKW,EACD,MAAM,IAAIU,MAAM,oDAGpB,IAAMC,EAAiBC,uBACnB,SAACtB,GAAD,OACIY,EAAS,CAAE7C,KDhBS,mBCgBeqC,QAAS,CAAEJ,cAAaD,MAAOG,EAAMH,WAC5E,CAACa,EAAUV,EAAMH,QAmCrB,MAAO,CACHwB,SAjCaD,uBACb,SAACvB,GAAD,OAAWa,EAAS,CAAE7C,KDtBL,YCsBsBqC,QAAS,CAAEL,aAClD,CAACa,IAgCDZ,cACAwB,cA9BkBF,uBAClB,SAACtB,EAAaO,GAAd,OACIK,EAAS,CACL7C,KD3Be,kBC4BfqC,QAAS,CAAEJ,cAAaD,MAAOG,EAAMH,MAAOQ,gBAEpD,CAACK,EAAUV,EAAMH,QAyBjB0B,aAtBiBH,uBACjB,SAACtB,EAAaS,GAAd,OACIG,EAAS,CACL7C,KDnCc,iBCoCdqC,QAAS,CAAEJ,cAAaD,MAAOG,EAAMH,MAAOU,eAEpD,CAACG,EAAUV,EAAMH,QAiBrB2B,eAdqBJ,uBACtB,SAACtB,EAAaQ,GAAd,OACCI,EAAS,CACR7C,KD3C2B,mBC4C3BqC,QAAS,CAAEJ,cAAaD,MAAOG,EAAMH,MAAOS,iBAE9C,CAACI,EAAUV,EAAMH,QASZA,QACAsB,mB,oFCjDKM,EAAyC,SAAC,GAShD,IAAD,IARFC,eAQE,MARQ,GAQR,MAPFC,WAOE,MAPI,KAOJ,EANFC,EAME,EANFA,MACAC,EAKE,EALFA,aAKE,IAJFC,gBAIE,SAHFC,EAGE,EAHFA,UAGE,IAFFC,eAEE,MAFQ,aAER,EADCC,EACD,iBACIxG,EAAUwD,EACZ,CACI,YAAa,EACb,6BAA0C,aAAZyC,EAC9B,8BAA2C,cAAZA,EAC/B,0BAAuC,UAAZA,EAC3B,mBAAoBI,EACpB,qBAAsBC,GAE1BF,GAGJ,OACI,kBAAC,WAAD,MACMF,GACE,0CAAQvF,UAAWX,GAAawG,EAAhC,CAAsCD,QAASA,EAASF,SAAUA,IAC7DF,GAAS,0BAAMxF,UAAU,mBAAmBwF,IAGpDD,GACG,qCAAGO,KAAMP,EAAKvF,UAAWX,GAAawG,EAAtC,CAA4CD,QAASA,IAChDJ,GAAS,0BAAMxF,UAAU,mBAAmBwF,M,uCCvC5CO,E,WAOjB,cAA+C,IAAjCC,EAAgC,EAAhCA,QAAgC,yBAN9CC,OAAsB,CAClBC,OAAQ,OAKkC,KAF9CF,QAAU,IAGNG,KAAKH,QAAUA,E,uCAGnB,SAAaI,GAA6C,IAA3BH,EAA0B,uDAAJ,GACjD,OAAOE,KAAKE,QAAWD,EAAhB,2BAA+BD,KAAKF,QAAWA,M,kBAG1D,SAAuBG,EAAkBE,GACrC,IAAMC,EAAgB,CAClBL,OAAQ,OACRM,QAAS,CACLC,OAAQ,mBACR,eAAgB,oBAGpBC,KAAMC,KAAKC,UAAUN,IAEzB,OAAOH,KAAKE,QAAWD,EAAUG,K,qBAGrC,SAAyBH,EAAkBH,GACvC,OAAOY,MAAM,GAAD,OAAIV,KAAKH,QAAT,YAAoBI,GAAYH,GAAQa,KAA7C,uCAAkD,WAAOC,GAAP,eAAAC,EAAA,sEAClCD,EAASE,OADyB,UAC/CX,EAD+C,QAEjDS,EAASG,GAFwC,yCAG1CZ,GAH0C,gCAK1Ca,QAAQC,OAAOd,IAL2B,2CAAlD,2D,KC/BFe,EAAM,IAAItB,EAAc,CAAEC,QCHd,SAACsB,GACtB,IAAQC,EAAaC,OAAOC,SAApBF,SACJG,EAAkB,IAAZJ,EAAgB,4BAA8B,+BAkBxD,OAhBqC,IAAjCC,EAASI,QAAQ,aACjBD,EAAkB,IAAZJ,EAAgB,4BAA8B,yCAGtB,IAA9BC,EAASI,QAAQ,UACjBD,EAAkB,IAAZJ,EAAgB,gCAAkC,sCAG3B,IAA7BC,EAASI,QAAQ,SACjBD,EAAkB,IAAZJ,EAAgB,+BAAiC,qCAGpB,IAAnCC,EAASI,QAAQ,eACjBD,EAAkB,IAAZJ,EAAgB,4BAA8B,oCAGjDI,EDjBqCE,CAAU,K,GAClC,IAAI7B,EAAc,CAAEC,QAAS,uD,sEEQ9C,SAAS6B,EAAUC,GACzB,OAAOC,YAAMD,EAAM,aAAc,IAAIE,MAG/B,SAASC,EAAkBH,EAAYI,GAC7C,OAAOC,YAAOL,EAAOI,EAAiB,aAAe,cAG/C,SAASE,EAA6BC,GAC5C,IAAIP,EAAOD,EAAUQ,GACrB,OAAIC,YAAQR,GAAQ,EAEZS,YAAQC,YAAUV,EAAM,GAAI,GAG7BA,EC3BD,IAAMW,EAAmB,SAACC,EAA4BP,GACzD,OAAIO,IAAWP,EACL,UAAN,OAAYO,GACLA,GAAUP,EACD,IAAIQ,KAAKC,aAAa,QAAS,CAC3C3H,MAAO,WACP4H,SAAU,MACVC,sBAAuB,EAC7BC,sBAAuB,IAEJZ,OAAOO,GAGvB,IAGIM,EAAmB,SAACrE,EAAesE,EAAwBC,GACvE,GAAqB,kBAAVvE,EAAoB,OAAOA,EACtC,GAAIsE,IAAiBtE,EAAO,OAAO,EACnC,IAAIwE,EAAkC,GACtC,OAAIxE,GAGHwE,GADAA,GADAA,EAAiBxE,EAAMyE,WAAW,SAAK,KACPA,WAAW,MAAM,KACjBA,WAAW,MAAO,IAClDD,EAAiBE,WAAWF,GACzBG,KAAKC,MAAMJ,KAAoBA,IACjCA,EAAiBA,EAAeK,QAAQ,IAKlCF,KAAKC,MAAMJ,IAEX,IAIIM,EAAoB,SAAC9E,GACjC,IAAIwE,EAAiBxE,EAAMyE,WAAW,IAAK,IAE3C,OADAD,EAAiBA,EAAeC,WAAW,IAAK,KACzCC,WAAWF,IClCNO,GAAY,CACxBC,QAAS,CACRC,6BAA8B,+BAC9BC,aAAc,gBAEfC,MAAO,CACNC,WAAY,aACZC,mBAAoB,qBACpBC,SAAU,CACTD,mBAAoB,uPAGtBE,MAAO,CACNC,cAAe,gBACfC,aAAc,CACbC,aAAc,eACdC,kBAAmB,oBACnBC,kBAAmB,oBACnBC,oBAAqB,sBACrBC,qBAAsB,uBACtBC,uBAAwB,yBACxBC,qCAAsC,uCAEtCC,wBAAyB,0BACzBC,cAAe,gBACfC,4BAA6B,8BAC7BC,oBAAqB,sBACrBC,YAAa,eAEdC,SAAU,CACTC,aAAc,uIACdV,oBAAqB,qEACrBW,kBAAmB,kUACnBR,qCAAsC,wFACtCC,wBAAyB,4wBACzBC,cAAe,4RACfC,4BAA6B,kIAC7BC,oBAAqB,isCAGvBK,MAAO,CACNC,MAAO,CACNC,eAAgB,iBAChBC,SAAU,WACVC,OAAQ,UAETC,gBAAiB,kBACjBR,SAAU,CACTK,eAAgB,yLAChBC,SAAU,8FACVC,OAAQ,qKACRE,IAAK,sgBAGPC,MAAO,CACNC,SAAU,WACVC,eAAgB,iBAChBC,eAAgB,iBAChBb,SAAU,CACTc,2BAA4B,kQA0ExB,ICtHMC,GAAcC,IAAM5H,cAAgC,CAChE6H,KAAM,GACNR,IAAK,KACLS,kBAAmB,KACnBxG,WAAW,EACXW,KAAM,KACN8F,WAAY,SAACC,KACbC,qBAAsB,SAAChG,KACvBiG,aAAc,SAAC3I,KACf4I,WAAY,SAAClG,GAAD,OAAoC,QAGpCmG,GAAyB,SAAC,GAAgB,IAAf9M,EAAc,EAAdA,SAEvC,EAAwB+M,mBAAS,IAAjC,mBAAOR,EAAP,KAAaS,EAAb,KACA,EAAsBD,mBAA6B,MAAnD,mBAAOhB,EAAP,KAAYkB,EAAZ,KACA,EAAkDF,mBAA2C,MAA7F,mBAAOP,EAAP,KAA0BG,EAA1B,KACA,EAAkCI,oBAAS,GAA3C,mBAAO/G,EAAP,KAAkB4G,EAAlB,KACA,EAAwBG,mBAAmC,MAA3D,mBAAOpG,EAAP,KAAauG,EAAb,KASA,SAAST,EAAWC,GAEnBM,EAAQ,2BACJT,GACAG,IAUL,OApBAS,qBAAU,WACTV,EDgG0B,WAAO,IAAD,MACjC,OAAO,EAAP,iBACE1C,GAAUI,MAAMC,WAAc,MADhC,cAEEL,GAAUI,MAAME,mBAAsB,GAFxC,cAGEN,GAAUQ,MAAMC,cAAgB,qBAE9BT,GAAUQ,MAAME,aAAaC,aAAe,GAFd,cAG9BX,GAAUQ,MAAME,aAAaE,kBAAoB,IAHnB,cAI9BZ,GAAUQ,MAAME,aAAaG,kBAAoB,cAJnB,cAK9Bb,GAAUQ,MAAME,aAAaI,oBAAsB,OALrB,cAM9Bd,GAAUQ,MAAME,aAAaK,qBAAuB,IANtB,cAO9Bf,GAAUQ,MAAME,aAAaM,uBAAyB,cAPxB,cAQ9BhB,GAAUQ,MAAME,aAAaO,qCAAuC,OARtC,cAU9BjB,GAAUQ,MAAME,aAAaQ,wBAA0B,QAVzB,cAW9BlB,GAAUQ,MAAME,aAAaS,cAAgB,KAXf,cAY9BnB,GAAUQ,MAAME,aAAaY,YAAc,QAZb,cAa9BtB,GAAUQ,MAAME,aAAaU,4BAA8B,MAb7B,cAc9BpB,GAAUQ,MAAME,aAAaW,oBAAsB,OAdrB,uBAiB9BrB,GAAUQ,MAAME,aAAaC,aAAe,GAjBd,cAkB9BX,GAAUQ,MAAME,aAAaE,kBAAoB,IAlBnB,cAmB9BZ,GAAUQ,MAAME,aAAaG,kBAAoB,cAnBnB,cAoB9Bb,GAAUQ,MAAME,aAAaI,oBAAsB,OApBrB,cAqB9Bd,GAAUQ,MAAME,aAAaK,qBAAuB,IArBtB,cAsB9Bf,GAAUQ,MAAME,aAAaM,uBAAyB,aAtBxB,cAuB9BhB,GAAUQ,MAAME,aAAaO,qCAAuC,OAvBtC,cAyB9BjB,GAAUQ,MAAME,aAAaQ,wBAA0B,QAzBzB,cA0B9BlB,GAAUQ,MAAME,aAAaS,cAAgB,KA1Bf,cA2B9BnB,GAAUQ,MAAME,aAAaY,YAAc,QA3Bb,cA4B9BtB,GAAUQ,MAAME,aAAaU,4BAA8B,MA5B7B,cA6B9BpB,GAAUQ,MAAME,aAAaW,oBAAsB,OA7BrB,KAHlC,cAiDErB,GAAU0B,MAAMC,MAAMC,eAAiB,MAjDzC,cAkDE5B,GAAU0B,MAAMC,MAAME,SAAW,KAlDnC,cAmDE7B,GAAU0B,MAAMC,MAAMG,OAAS,KAnDjC,cAoDE9B,GAAU0B,MAAMK,iBAAkB,GApDpC,ECjGYsB,IACX1F,EAAI2F,IAAiB,OAAOlG,MAAK,SAACmG,GAAD,OAASL,EAAOK,QAE/C,CAACL,IAiBH,kBAACZ,GAAYtH,SAAb,CACCC,MAAO,CACNgB,YACAuG,OACA5F,OACAoF,MACAS,oBACAG,uBACAF,aACAG,eACAC,WAfH,SAAoBU,GACVL,EAARK,EAAgB,eAAIA,GAAiB,SAgBpCvN,ICrESwN,GAAmB,SAACC,GAChC,IAAMC,EAAwB,GACxBC,EAAkB,IAAIC,gBAAgBH,GAAcI,UAQ1D,OAPgB9K,MAAM+K,KAAKH,GAEnBI,SAAQ,SAACC,GACfN,EAAOM,EAAM,IAAMA,EAAM,MAIpBN,GAIKO,GAAwB,WAAiC,IAAhCC,IAA+B,yDAE9DC,GAAW,IACXC,EAAUC,SAASC,cAA8B,yBACvD,GAAIF,GAAWF,EAAY,CAC1B,IAAM1L,EAAI4L,EAAQG,wBAAwBC,IAAM3G,OAAO4G,YAAcN,EACrEtG,OAAO6G,SAAS,CAACF,IAAKhM,EAAGmM,SAAU,aCVxBC,GAA8C,SAAC,GAAsB,IAApB5O,EAAmB,EAAnBA,SAAUS,EAAS,EAATA,GAEpE,EADkBwE,IAAVnB,MACuCrD,GAAvC6D,EAAR,EAAQA,SAAUC,EAAlB,EAAkBA,UACZ7E,EAAUwD,EAAW,gBAAiB,CACxC,2BAA4BoB,EAC5B,0BAHJ,EAA6BE,QAIzB,4BAA6BD,IAGjC,OAAO,yBAAKlE,UAAWX,GAAUM,IAGxB6O,GAAoC,SAAC,GAAD,IAAG7O,EAAH,EAAGA,SAAH,OAC7C,yBAAKK,UAAU,yBAAyBL,IAG/B8O,GAIR,SAAC,GAAkC,IAAhCrO,EAA+B,EAA/BA,GAAIsO,EAA2B,EAA3BA,MAAOC,EAAoB,EAApBA,cAEf,EADkB/J,IAAVnB,MACuCrD,GAAvC6D,EAAR,EAAQA,SAAUC,EAAlB,EAAkBA,UAAWC,EAA7B,EAA6BA,QACrBe,EAAkBN,IAAlBM,cACJ0J,ECtCO,SAAuBC,GAClC,IAAMC,EAA0B,qBAAXtH,OAErB,EAA8BkF,oBAAS,kBACnCoC,GAAgBtH,OAAOuH,WAAWF,GAAYG,WADlD,mBAAOA,EAAP,KAAgBC,EAAhB,KAYA,OATAC,2BAAgB,WACZ,IAAIJ,EAAJ,CAGA,IAAMK,EAAiB3H,OAAOuH,WAAWF,GACnCO,EAAW,SAACC,GAAD,OAAYJ,EAAWI,EAAEL,UAE1C,OADAG,EAAeG,YAAYF,GACpB,kBAAMD,EAAeI,eAAeH,OAC5C,CAACN,EAAOD,IACJG,EDuBYQ,CDpCQ,uBCqC3B,OACD,yBACCxP,UAAU,4DACV4F,QAAS,WACHgJ,GACJ1J,EAAc9E,GAAK6D,KAGrB,yBAAKjE,UAAU,wBACH,0BAAMA,UAAU,2BACZ,kBAACyP,EAAD,CAAOpN,OAAQ,GAAID,MAAO,MAEzC,0BAAMpC,UAAU,uBAAuB0O,IAGxC,yBAAK1O,UAAU,wBACb2O,GAAiBzK,GAAaC,GAC9B,0BAAMnE,UAAU,iCAAiC2O,IAGhD1K,GAAYC,GAAaC,IAC1B,4BACCnE,UAAS,+BACPiE,EAA0C,GAA/B,8BAEbyK,MAAQzK,EAAsB,UAAX,WACjBA,GAAY,kBAACyL,EAAD,CAAWtN,MAAO,GAAIC,OAAQ,IAC3C4B,GAAY,kBAAC0L,EAAD,CAAQvN,MAAO,GAAIC,OAAQ,QAQlCuN,GAOR,SAAC,GAAuE,IAArEC,EAAoE,EAApEA,YAAazP,EAAuD,EAAvDA,GAAIkF,EAAmD,EAAnDA,QAASwK,EAA0C,EAA1CA,WAAYnK,EAA8B,EAA9BA,UAAWoK,EAAmB,EAAnBA,aACrD,EAAwDnL,IAAhDG,EAAR,EAAQA,eAAgBG,EAAxB,EAAwBA,cAAeC,EAAvC,EAAuCA,aAEvC,SAAS6K,IACL7K,EAAa/E,GAAI,GACZ0P,GAAY/K,EAAe3E,EAAK,GACrC8E,EAAc9E,GAAI,GACd2P,GAAcA,IAGtB,OACI,kBAAC,WAAD,KACiB,YAAZzK,GACG,yBAAKtF,UAAU,qEACX,kBAAC,EAAD,CACIwF,MAAM,wBACNF,QAAQ,WACRI,UAAWmK,EACXjK,QAASoK,EACTrK,UAAWA,MAIrBL,GACE,yBAAKtF,UAAU,+BACrB,0BAAMA,UAAU,sBAAhB,aACU,4BACIyB,KAAK,SACLzB,UAAU,6CACV0F,UAAWmK,EACXjK,QAAS,kBAAMqK,YAAW,kBAAMD,SAChC,kBAACE,EAAD,CAAe9N,MAAO,GAAIC,OAAQ,SAQ7C8N,GAKR,SAAC,GAAoF,IAAlFxQ,EAAiF,EAAjFA,SAAUyQ,EAAuE,EAAvEA,WAAiCC,GAAsC,EAA3DC,oBAA2D,EAAtCD,qBAAqBE,EAAiB,EAAjBA,WACpE,EAAwE3L,IAAhEK,EAAR,EAAQA,SAAUxB,EAAlB,EAAkBA,MAAOC,EAAzB,EAAyBA,YAAaqB,EAAtC,EAAsCA,eAAgBG,EAAtD,EAAsDA,cAElDsL,EAAc3L,qBAAWmH,IACvByE,EAAiB/M,GAA+B,IAAhBA,EA2BtC,OAdAoJ,qBAAU,WACN,IAAM4D,EAAezE,IAAM0E,SAASC,QAAQjR,GAAUoE,KAAI,SAAC8M,GACvD,OAAO,2BACAA,EAAKtQ,OADZ,IAEI4D,SAAS,EACTF,SAAUsM,EAAaA,IAAeM,EAAKtQ,MAAMH,GAAKsD,IAAgBmN,EAAKtQ,MAAMH,GACjF8D,UAAWqM,EACLA,IAAeM,EAAKtQ,MAAMH,GAC1BsD,IAAgBmN,EAAKtQ,MAAMH,QAGzC6E,EAASyL,KACV,IAGC,yBAAK1Q,UAAU,aACX,yBAAKA,UAAU,sBACVyD,EAAMb,OAAS,GACZa,EAAMM,KAAI,SAAC8M,EAAM3N,GAAP,OACN,0BACIA,IAAKA,EACLlD,UAAS,kCACL6Q,EAAK3M,UAAY,oCAAsC,UAI3E,yBAAKlE,UAAU,oBAClByQ,GAAkB/M,EACb,4BAAQ1D,UAAU,uBAAuB4F,QAvCnD,WACI,GAAIlC,GAA+B,IAAhBA,EAAmB,CAClC,IAAMtD,EAAKsD,EAAc,EACzBwB,EAAcxB,GAAa,GAC3BqB,EAAe3E,GACrBoQ,EAAYhE,WAAW,WAEjBhF,OAAOC,SAAS3B,KAAOsK,IAiCf,0BAAMpQ,UAAU,6BACZ,kBAACkQ,EAAD,CAAe9N,MAAO,MAErCiO,EAAoB3M,EAAc,IACjB,KAETD,EAAMb,OAAS,GAAKjD,K,SElKxBmR,GAAuC,SAAC,GAU9C,IATHtL,EASE,EATFA,MACAuL,EAQE,EARFA,KACAC,EAOE,EAPFA,aACA5Q,EAME,EANFA,GACA6Q,EAKE,EALFA,YACAC,EAIE,EAJFA,SACAC,EAGE,EAHFA,WACAC,EAEE,EAFFA,SAEE,IADF3P,YACE,MADK,OACL,EACD4P,EAAyCL,EA6B7C,SAASM,EAAQC,EAAa9P,EAA0BoC,GAC1C,aAATpC,IAEF4P,EADc,SAAXxN,EACS0N,EAAOC,OAAO7M,MAEdqE,EAAiBuI,EAAOC,OAAO7M,OAG5C4M,EAAOC,OAAO/P,KAAkB,UAAXoC,EAAqB,SAAW,OACrD0N,EAAOC,OAAO7M,MAAmB,SAAXd,EAAqBwN,EAAa,UAAOA,EAAUpO,WAAWwO,QAAQ,0BAA2B,OAAS,KAAOJ,GAG3H,eAAT5P,IACH4P,EAAYE,EAAOC,OAAO7M,MAQ1B4M,EAAOC,OAAO7M,MAAmB,SAAXd,EAAqBwN,EAAD,UAAiBA,EAAjB,KAAgC,KAAOA,EAAUI,QAAQ,IAAK,KAIvG,OACD,yBAAKzR,UAAS,kBAAaoR,EAAW,mBAAqB,KACzD5L,GACC,2BAAOxF,UAAU,eAAe0R,QAAStR,GACtCoF,GAIL,yCACExF,UAAS,qCAAgCyB,GACzCkQ,QAAS,SAAAtC,GAAC,OAAIiC,EAAQjC,EAAE5N,EAAM,UAC9BA,KA/DL,SAAiBA,GAChB,MAAa,aAATA,GAAgC,eAATA,EACnB,OAGDA,GAAc,OA0DXmQ,CAAQnQ,GACdoQ,aAAc,MACdzR,GAAIA,EACJ0R,UA1DL,SAAiBP,GAIhB,GAAa,aAAT9P,EAAqB,CACH,CAAC,IAAK,IAAK,KACfsQ,SAASR,EAAOrO,MAChCqO,EAAOS,iBAIT,GAAa,eAATvQ,EAAuB,CACP,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAI,IAAK,IAAK,IAAK,IAAK,YAAa,OACvEsQ,SAASR,EAAOrO,MAC/BqO,EAAOS,mBA6CLf,YAAaA,EACbD,aAAcA,GACVE,EAASH,EAAD,YAAC,eAAUI,GAA0B,IAAO,CAACc,OAAQ,SAACC,GAAD,OAAeZ,EAAQY,EAAMzQ,EAAM,gBC/F7F0Q,GAAmG,SAAC,GAK1G,IAJHxS,EAIE,EAJFA,SACAyS,EAGE,EAHFA,WACFC,EAEI,EAFJA,WACAC,EACI,EADJA,QAEQjT,EAAUwD,EAAW,iBAAkB,CACzC,yBAA0BuP,EAC9B,0BAA2BC,GAAcC,IAE3C,EAAsC5F,oBAAS,GAA/C,mBAAO6F,EAAP,KAAoBC,EAApB,KAEE,OAAO,yBAAKxS,UAAWX,GACvBM,EACA2S,GACA,kBAAC,WAAD,KACC,0BAAMtS,UAAS,+BACd,uBAAG4F,QAAS,kBAAM4M,GAAgBD,KAAc,kBAACE,EAAD,CAAUrQ,MAAO,GAAIC,OAAQ,QAI/EkQ,GAAeD,GACf,yBAAKtS,UAAU,iCAAiC0S,wBAAyB,CAACC,OAAQL,OAMzEM,GAAyG,SAAC,GAKhH,IAJHjT,EAIE,EAJFA,SACAkT,EAGE,EAHFA,QACFC,EAEI,EAFJA,YACAC,EACI,EADJA,YAEE,OACI,yBAAK/S,UAAS,6BAAwB8S,EAAc,iCAAmC,GAAzE,YAA+ED,EAAU,4BAA8B,GAAvH,YAA6HE,EAAc,iCAAmC,KACvLpT,ICrBAqT,GAAS,SAAC,GASH,IARhBxN,EAQe,EARfA,MACApF,EAOe,EAPfA,GACA6S,EAMe,EANfA,cACAC,EAKe,EALfA,QACAnC,EAIe,EAJfA,KACAG,EAGe,EAHfA,SACAC,EAEe,EAFfA,WAEe,IADfxM,aACe,MADP,GACO,EACTwO,EAA4B,kBAAVxO,GAAgC,KAAVA,EAC9C,OACI,yBAAK3E,UAAU,qCACX,yBAAKA,UAAU,mBACX,2BAAOA,UAAU,gBAAgB0R,QAAStR,GACrCoF,GAEL,yBAAKxF,UAAU,yBACX,0CACII,GAAIA,EACJJ,UAAU,gBACV+Q,KAAMA,GACFG,EAASH,EAAMI,GAA0B,IAJjD,CAKIH,aAAcrM,IACbsO,IAAkBE,GACf,4BAAQxO,MAAOsO,EAAevN,UAAQ,GACjCuN,GAIRC,GACGA,EAAQnP,KAAI,SAACqP,GAAD,OACR,4BAAQzO,MAAOyO,EAAOzO,MAAOzB,KAAK,OAACkQ,QAAD,IAACA,OAAD,EAACA,EAAQlQ,KAAOkQ,EAAOlQ,IAAMkQ,EAAOzO,OACjEyO,EAAOrC,cCjD7BrJ,GAFH,CAAE2L,SAA4C,IADrC7L,OAAOC,SAApBF,SACwBI,QAAQ,cCI3B2L,GAAc,SAAC3O,GAE1B,OAAIkD,EAAUlD,aAAkBqD,OAASuL,MAAM1L,EAAUlD,GAAO6O,YAOrDC,GAAkB,SAAC5R,EAA8BqB,GAC7D,GAAIrB,GAAU6R,GAAYL,QACzB,OAAOxR,EAAOqB,IAIHyQ,GAAkB,SAACC,EAAkBC,GACjD,IAAIpS,EAAO,GACX,OAAQmS,GACP,KAAK,EACJnS,EAASoS,EAA0C,0BAAzB,uBAC1B,MACD,KAAK,EACJpS,EAASoS,EAA+C,4BAA9B,4BAC1B,MACD,KAAK,EACJpS,EAASoS,EAAwC,qBAAvB,qBAC1B,MACD,QACCpS,EAAO,4BAIT,OAAOA,GAgBKqS,GAAgB,SAACnP,GAC7B,OAAOA,EAAQ,IAAM,GAIToP,GAAe,SAACpP,GAC5B,MAAO,+CAA+CqP,KAAKrP,ICrD/CsP,GAAqC,SAAC1T,GAC/C,IAAY2T,EAAmC3T,EAAvC4T,GAAenU,EAAwBO,EAAxBP,UAAWL,EAAaY,EAAbZ,SAClC,OAAO,kBAACuU,EAAD,CAAWlU,UAAWA,GAAYL,ICKhCyU,GAAuC,SAAC,GAS9C,IARHhU,EAQE,EARFA,GACA2Q,EAOE,EAPFA,KAOE,IANFsD,eAME,SALFrD,EAKE,EALFA,aACAxL,EAIE,EAJFA,MACA0L,EAGE,EAHFA,SACAC,EAEE,EAFFA,WACAC,EACE,EADFA,SAEA,OACI,yBAAKpR,UAAS,kBAAaoR,EAAW,mBAAqB,KACvD,yCACIpR,UAAU,eACVI,GAAIA,GACA8Q,EAASH,EAAMI,GAA0B,IAHjD,CAIImD,eAAgBD,EAChBrD,aAAcA,EACdvP,KAAK,QACbpB,KAAM,gBAEF,2BAAOL,UAAU,eAAe0R,QAAStR,GACpCoF,K,6CCrBJ+O,GAOY,SAAC,GAAwE,IAAvErD,EAAsE,EAAtEA,SAAUsD,EAA4D,EAA5DA,OAAQC,EAAoD,EAApDA,KAAMC,EAA8C,EAA9CA,UAAWC,EAAmC,EAAnCA,SAAUC,EAAyB,EAAzBA,YAAa/S,EAAY,EAAZA,OACpF,EAA8C6K,mBAAS,IAAvD,mBAAOmI,EAAP,KAAwBC,EAAxB,KACA,EAA4DpI,mBAAS,IAArE,mBAAOqI,EAAP,KAA+BC,EAA/B,KACA,EAA8CtI,mBAC6C,mBAAlF+G,GAAgB5R,EAAQ6H,GAAUQ,MAAME,aAAaQ,2BACwB,IAAlF6I,GAAgB5R,EAAQ6H,GAAUQ,MAAME,aAAaQ,0BAFzD,mBAAOqK,EAAP,KAAwBC,EAAxB,KAIQhJ,EAASrH,qBAAWmH,IAApBE,KAER,SAASiJ,EAAYpE,GACpB,MAAM,GAAN,OAAUrH,GAAUQ,MAAMC,cAA1B,YAA2CsK,EAA3C,YAAmD1D,GAGpD,SAASK,EAASL,GACjB,GAAqD,qBAA1CyD,EAAO9K,GAAUQ,MAAMC,gBAC0B,qBAAhDqK,EAAO9K,GAAUQ,MAAMC,eAAesK,GAChD,OAAOD,EAAO9K,GAAUQ,MAAMC,eAAesK,GAAM1D,GAKtD,SAASqE,EAAUC,EAAkB5T,GAGpC,MAFU,0BAATA,EAAoCuT,EAA0BK,GAAYP,EAAmBO,GAC9FV,EAASQ,EAAsB,0BAAT1T,EAAoCiI,GAAUQ,MAAME,aAAaG,kBAAoBb,GAAUQ,MAAME,aAAaM,0BACjI,EA8ER,OACC,kBAAC,WAAD,KACEwB,EAAKxC,GAAUI,MAAME,oBAAsB,GACvC,kBAAC,GAAD,CACAmK,GAAG,MADH,wBAC0BM,EAAO,IAEtC,yBAAKzU,UAAU,uBACf,kBAAC,GAAD,CAAasS,QAAS5I,GAAUQ,MAAMe,SAAST,qBAC9C,kBAAC,GAAD,KACC,kBAAC,GAAD,CACChF,MAAM,iBACNuL,KAAMoE,EAAYzL,GAAUQ,MAAME,aAAaC,cAC/CjK,GAAI+U,EAAYzL,GAAUQ,MAAME,aAAaC,cAC7C6G,SAAUA,EACVvM,MAAO8O,GAAgB5R,EAAQ6H,GAAUQ,MAAME,aAAaC,cAC5D8G,WAAY,CAAEmE,UAAU,GACxBpC,QAAS,CACR,CACCnC,KAAM,0BACNpM,MAAO,GAER,CACCoM,KAAM,4BACNpM,MAAO,GAER,CACCoM,KAAM,qBACNpM,MAAO,OAKX,kBAAC,GAAD,KACC,kBAAC,GAAD,CACCa,MAAM,0BACNuL,KAAMoE,EAAYzL,GAAUQ,MAAME,aAAaI,qBAC/CpK,GAAI+U,EAAYzL,GAAUQ,MAAME,aAAaI,qBAC7C/I,KAAK,aACL2P,SAAUA,EAAS1H,GAAUQ,MAAME,aAAaI,qBAChDyG,YAAY,OACZC,SAAUA,EACVF,aAAcyC,GAAgB5R,EAAQ6H,GAAUQ,MAAME,aAAaI,qBACnE2G,WAAY,CAAEmE,UAAU,EAAMC,SAAU,CACtCC,eAAgB,SAACC,GAAD,OAAe1B,GAAa0B,QAI9CrE,EAAS1H,GAAUQ,MAAME,aAAaI,sBACtC,0BAAMxK,UAAU,eAAhB,8BAIH,kBAAC,GAAD,CAAasS,QAAS5I,GAAUQ,MAAMe,SAASC,cAC9C,kBAAC,GAAD,KACC,kBAAC,GAAD,CACC1F,MAAM,6BACNuL,KAAMoE,EAAYzL,GAAUQ,MAAME,aAAaE,mBAC/ClK,GAAI+U,EAAYzL,GAAUQ,MAAME,aAAaE,mBAC7C7I,KAAK,SACL2P,SAAUA,EAAS1H,GAAUQ,MAAME,aAAaE,mBAChD2G,YAAY,KACZC,SAAUA,EACVF,aAAc,GACdG,WAAY,CAAEmE,UAAU,EAAMI,IAAK,EAAGC,IAAK,GAAIJ,SAAU,CACvDK,eAAgB,SAACH,GAAD,OAAe3B,GAAc2B,QAI/CrE,EAAS1H,GAAUQ,MAAME,aAAaE,oBACtC,0BAAMtK,UAAU,eAAhB,6BAGF,kBAAC,GAAD,KACE,kBAAC,GAAD,CACCwF,MAAM,SACN/D,KAAM,OACNsP,KAAMoE,EAAYzL,GAAUQ,MAAME,aAAaG,mBAC/CnK,GAAI+U,EAAYzL,GAAUQ,MAAME,aAAaG,mBAC7C6G,SAAUA,EAAS1H,GAAUQ,MAAME,aAAaG,mBAChD0G,YAAY,aACZC,SAAUA,EACVF,aAAcyC,GAAgB5R,EAAQ6H,GAAUQ,MAAME,aAAaG,mBACnE4G,WAAY,CAAEmE,UAAU,EAAMC,SAAU,CAEtCM,iBAAkB,SAACJ,GAAD,OA3J1B,SAAuClL,GAEtC,IAAK+I,GAAY/I,GAChB,OAAO6K,EAAU,wBAAyB,yBAI3C,IAAM9K,EAAoBoK,EAAUS,EAAYzL,GAAUQ,MAAME,aAAaE,oBAC7E,GAAIA,EAAmB,CACtB,IAAMwL,EAAsBC,aAASlO,EAAU0C,GAAoBD,GACnE,GAAI0L,aAASF,EAAqB,IAAI9N,MACrC,OAAOoN,EAAU,kCAAD,OAAmCnN,EAAkB,IAAID,MAAQ,IAAS,yBAK5F,OAAIiO,aAAQpO,EAAU0C,GAAoB,IAAIvC,OAC7C2M,EAASQ,EAAYzL,GAAUQ,MAAME,aAAaG,oBAC3C6K,EAAU,kCAAD,OAAmCnN,EAAkB,IAAID,MAAQ,IAAS,2BAG3F4M,EAAYO,EAAYzL,GAAUQ,MAAME,aAAaG,qBAC9C,GAqIiC2L,CAA8BT,QAIlErE,EAAS1H,GAAUQ,MAAME,aAAaG,oBACtC,0BAAMvK,UAAU,eAAe+U,KAIlC,kBAAC,GAAD,CAAazC,QAAS5I,GAAUQ,MAAMe,SAASE,mBAC9C,kBAAC,GAAD,KACC,kBAAC,GAAD,CACC3F,MAAM,mCACNuL,KAAMoE,EAAYzL,GAAUQ,MAAME,aAAaK,sBAC/CrK,GAAI+U,EAAYzL,GAAUQ,MAAME,aAAaK,sBAC7ChJ,KAAK,SACL2P,SAAUA,EAAS1H,GAAUQ,MAAME,aAAaK,sBAChDwG,YAAY,KACZC,SAAUA,EACVF,aAAc,GACdG,WAAY,CAACmE,UAAU,EAAMI,IAAK,EAAGC,IAAK,GAAIJ,SAAU,CACtDK,eAAgB,SAACH,GAAD,OAAe3B,GAAc2B,QAI/CrE,EAAS1H,GAAUQ,MAAME,aAAaK,uBACtC,0BAAMzK,UAAU,eAAhB,6BAGF,kBAAC,GAAD,KACC,kBAAC,GAAD,CACCwF,MAAM,OACN/D,KAAM,OACNsP,KAAMoE,EAAYzL,GAAUQ,MAAME,aAAaM,wBAC/CtK,GAAI+U,EAAYzL,GAAUQ,MAAME,aAAaM,wBAC7C0G,SAAUA,EAAS1H,GAAUQ,MAAME,aAAaM,wBAChDuG,YAAY,aACZC,SAAUA,EACVF,aAAcyC,GAAgB5R,EAAQ6H,GAAUQ,MAAME,aAAaM,wBACnEyG,WAAY,CAAEmE,UAAU,EAAMC,SAAU,CAEtCY,eAAgB,SAACV,GAAD,OAvKvB,SAA4B/K,GAC3B,IAAMH,EAA4BmK,EAAUS,EAAYzL,GAAUQ,MAAME,aAAaG,oBAC/ED,EAAoBoK,EAAUS,EAAYzL,GAAUQ,MAAME,aAAaE,oBACvEG,EAA+B2L,SAAS1B,EAAUS,EAAYzL,GAAUQ,MAAME,aAAaK,wBAGjG,IAAK6I,GAAY5I,GAChB,OAAO0K,EAAU,wBAAyB,cAI3C,GAAIY,aAASnO,EAAU6C,GAAyB,IAAI1C,MACnD,OAAOoN,EAAU,sCAAuC,cAIzD,GAAI7K,GAAqBD,EAAmB,CAC3C,IAAMwL,EAAsBC,aAASlO,EAAU0C,GAAoBD,GACnE,GAAI0L,aAASF,EAAqBjO,EAAU6C,IAC3C,OAAO0K,EAAU,kCAAD,OAAmCnN,EAAkB6N,GAAqB,IAAQ,cAKpG,GAAIvL,GAAqBE,EAAuB,CAC/C,IAAM4L,EAAwBC,aAASzO,EAAU6C,GAAyBD,GAC1E,IAAKwL,aAAQM,aAAQF,EAAsB,GAAIxO,EAAU0C,IACxD,OAAO6K,EAAU,kCAAD,OAAmCnN,EAAkBoO,GAAuB,IAAS,cAIvG,GAAI5L,EAAsB,CACzB,IAAM+L,EAAUT,aAAS,IAAI/N,KAAQyC,GACrC,GAAIwL,aAAQpO,EAAU6C,GAAyB8L,GAC9C,OAAOpB,EAAU,+BAAD,OAAgCnN,EAAkBuO,GAAS,IAAS,cAKtF,OADA5B,EAAYO,EAAYzL,GAAUQ,MAAME,aAAaM,0BAC9C,EAgI8B+L,CAAmBhB,QAIpDrE,EAAS1H,GAAUQ,MAAME,aAAaM,yBACtC,0BAAM1K,UAAU,eAAe6U,KAIlC,kBAAC,GAAD,CAAavC,QAAS5I,GAAUQ,MAAMe,SAASN,sCAC9C,kBAAC,GAAD,CAAiBmI,aAAa,GAC7B,kBAAC,GAAD,CACCtN,MAAM,oEACNuL,KAAMoE,EAAYzL,GAAUQ,MAAME,aAAaO,sCAC/CvK,GAAI+U,EAAYzL,GAAUQ,MAAME,aAAaO,sCAC7CyG,SAAUA,EAAS1H,GAAUQ,MAAME,aAAaO,sCAChDlJ,KAAK,WACLwP,YAAY,SACZC,SAAUA,EACVF,aAAcyC,GAAgB5R,EAAQ6H,GAAUQ,MAAME,aAAaO,sCACnEwG,WAAY,CAACmE,UAAU,EAAMI,IAAK,KAElCtE,EAAS1H,GAAUQ,MAAME,aAAaO,uCACtC,0BAAM3K,UAAU,eAAhB,iFAIH,kBAAC,GAAD,CAAaqS,YAAY,EAAMC,QAAS5I,GAAUQ,MAAMe,SAASL,yBAC/D,kBAAC,GAAD,CAAiBmI,aAAa,GAC7B,2BAAO/S,UAAU,eAAe0R,QAAQ,mDAAxC,sDAID,kBAAC,GAAD,CAAiBmB,SAAS,GACzB,kBAAC,GAAD,CACCrN,MAAM,KACN6O,QAAmG,mBAAlFZ,GAAgB5R,EAAQ6H,GAAUQ,MAAME,aAAaQ,2BACe,IAAlF6I,GAAgB5R,EAAQ6H,GAAUQ,MAAME,aAAaQ,yBACxDmG,KAAMoE,EAAYzL,GAAUQ,MAAME,aAAaQ,yBAC/CxK,GAAE,UAAK+U,EAAYzL,GAAUQ,MAAME,aAAaQ,yBAA9C,MACFoG,aAAc,OACdE,SAAUA,EACVC,WAAY,CACXuF,SAAU,SAACrH,GAAD,OACT6F,EAA6C,UAA1B7F,EAAEsH,cAAchS,YAIvC,kBAAC,GAAD,CAAiBkO,SAAS,GACzB,kBAAC,GAAD,CACCrN,MAAM,MACN6O,QAAmG,mBAAlFZ,GAAgB5R,EAAQ6H,GAAUQ,MAAME,aAAaQ,2BACe,IAAlF6I,GAAgB5R,EAAQ6H,GAAUQ,MAAME,aAAaQ,yBACxDmG,KAAMoE,EAAYzL,GAAUQ,MAAME,aAAaQ,yBAC/CxK,GAAE,UAAK+U,EAAYzL,GAAUQ,MAAME,aAAaQ,yBAA9C,MACFoG,aAAc,QACdE,SAAUA,OAKZ+D,GACD,kBAAC,GAAD,CAAa3C,QAAS5I,GAAUQ,MAAMe,SAASJ,eAC9C,kBAAC,GAAD,CAAiBiI,aAAa,GAC7B,kBAAC,GAAD,CACAtN,MAAM,qBACNuL,KAAMoE,EAAYzL,GAAUQ,MAAME,aAAaS,eAC/CzK,GAAI+U,EAAYzL,GAAUQ,MAAME,aAAaS,eAC7CuG,SAAUA,EAAS1H,GAAUQ,MAAME,aAAaS,eAChDpJ,KAAK,WACLwP,YAAY,SACZC,SAAUA,EACJF,aAAcyC,GAAgB5R,EAAQ6H,GAAUQ,MAAME,aAAaS,eACnEsG,WAAY,CAACmE,UAAU,KAE5BlE,EAAS1H,GAAUQ,MAAME,aAAaS,gBACtC,0BAAM7K,UAAU,eAAhB,kCAKHiV,GACA,kBAAC,GAAD,CAAa3C,QAAS5I,GAAUQ,MAAMe,SAASF,qBAC9C,kBAAC,GAAD,KACC,kBAAC,GAAD,CACAvF,MAAM,wCACNuL,KAAMoE,EAAYzL,GAAUQ,MAAME,aAAaU,6BAC/C1K,GAAI+U,EAAYzL,GAAUQ,MAAME,aAAaU,6BAC7CsG,SAAUA,EAAS1H,GAAUQ,MAAME,aAAaU,6BAC1CrJ,KAAK,aACXwP,YAAY,MACZC,SAAUA,EACJF,aAAcyC,GAAgB5R,EAAQ6H,GAAUQ,MAAME,aAAaU,6BACnEqG,WAAY,CAAEmE,UAAU,EAAMI,IAAK,EAAGH,SAAU,CACpDK,eAAgB,SAACH,GAAD,OAAe3B,GAAc2B,QAI9CrE,EAAS1H,GAAUQ,MAAME,aAAaU,8BACtC,0BAAM9K,UAAU,eAAhB,qDAGG,kBAAC,GAAD,KACE,kBAAC,GAAD,CACAwF,MAAM,sBACNuL,KAAMoE,EAAYzL,GAAUQ,MAAME,aAAaW,qBAC/C3K,GAAI+U,EAAYzL,GAAUQ,MAAME,aAAaW,qBAC7CqG,SAAUA,EAAS1H,GAAUQ,MAAME,aAAaW,qBAChDtJ,KAAK,aACLwP,YAAY,OACZC,SAAUA,EACVF,aAAcyC,GAAgB5R,EAAQ6H,GAAUQ,MAAME,aAAaW,qBACnEoG,WAAY,CAACmE,UAAU,EAAMC,SAAU,CAC3CC,eAAgB,SAACC,GAAD,OAAe1B,GAAa0B,QAI7CrE,EAAS1H,GAAUQ,MAAME,aAAaW,sBACtC,0BAAM/K,UAAU,eAAhB,6C,SC7VM4W,GAC8F,SAAC,GAAgD,IAA/C1F,EAA8C,EAA9CA,SAAUsD,EAAoC,EAApCA,OAAQC,EAA4B,EAA5BA,KAAM5S,EAAsB,EAAtBA,OAAQgV,EAAc,EAAdA,SAE5I,EAA4CnK,oBAAS,GAArD,mBAAOoK,EAAP,KAAuBC,EAAvB,KACA,EAA0DrK,mBAAuC,MAAjG,mBAAOsK,EAAP,KAA8BC,EAA9B,KACA,EAAkCvK,mBAAyB,IAA3D,mBAAOwK,EAAP,KAAkBC,EAAlB,KACA,EAAkDtS,qBAAWmH,IAArDE,EAAR,EAAQA,KAAMC,EAAd,EAAcA,kBAAmBI,EAAjC,EAAiCA,aAEzB9I,EADUoB,qBAAWT,GAArBR,MACAH,MA8CR,SAAS0R,EAAYpE,GACpB,MAAM,GAAN,OAAUrH,GAAUiC,MAAMC,SAA1B,YAAsC6I,EAAtC,YAA8C1D,GA7C/CjE,qBAAU,YACLX,GAAsB1I,EAAM,GAAGQ,UAAaR,EAAM,GAAGQ,UAAaR,EAAM,GAAGQ,WAAYR,EAAM,GAAGQ,WACnGsI,GAAa,GACb0K,EAAyB9K,EAAkBhC,cAAcsK,IACzDpN,EAAI2F,IAAJ,0DJSqC,SAACoK,EAAgCC,GACxE,GAAIA,EAAO,OAAO,EAElB,GAAID,EAAY,CACf,IAAME,EAAIhO,KAAKC,MAAM6N,GACrB,OAAIE,EAAI,GAAW,IACfA,EAAI,GAAW,GACZ,GAGR,OAAQ,EInBuEC,CAAwB,OAACpL,QAAD,IAACA,OAAD,EAACA,EAAmBqL,sBAAuBtL,EAAKxC,GAAU0B,MAAMK,kBAArK,0BAAwMkI,GAAgByC,SAASvU,EAAO6H,GAAUQ,MAAME,aAAaC,gBAArQ,uBACEvD,MAAK,SAACmG,GAEN,IAAMwK,EAAiBtL,EAAkBhC,cAAcsK,GAAMiD,aAAe,GACtEC,EAAc1K,EAAI2K,QAAO,SAACrW,EAAGsW,GAClC,OAAOtW,EAAEuW,OAASxO,KAAKyO,KAAKN,MAIvBO,EAAkB/K,EAAItF,QAAQgQ,EAAYA,EAAY/U,OAAS,IAEjEqK,EAAIrK,OAASoV,EAAkB,GAClCL,EAAYnY,KAAKyN,EAAI+K,EAAkB,IAGxC,IAAId,EAA4B,GAEhCS,EAAYjK,SAAQ,SAACnM,EAAGsW,GAAJ,OAAcX,EAAU1X,KAAK,CAChDuR,KAAK,GAAD,QdLwBpM,EcKDpD,EAAE0W,adJ3BtT,EAAM1B,WAAWwO,QAAQ,IAAK,McI5B,eAA6ClQ,EAAEuW,OAAS,EAAX,UAAkBvW,EAAEuW,OAApB,iCACjDnT,MAAOpD,EAAE0W,aACT/U,IAAI,GAAD,OAAKuR,EAAL,YAAaoD,EAAb,YAAsBtW,EAAE0W,gBdPA,IAACtT,KcU7BuS,EAAU1X,KAAK,CACduR,KAAM,eACNpM,MAAO,mBAGRwS,EAAaD,GACb3K,GAAa,SAGd,CAACJ,EAAmB1I,EAAOgR,EAAMvI,EAAMrK,EAAQ0K,IAElDO,qBAAU,WACLoK,EAAUtU,QACbiU,EAAS,GAAD,OAAInN,GAAUiC,MAAMC,SAApB,YAAgC6I,EAAhC,YAAwC/K,GAAUiC,MAAME,gBAAkBqL,EAAU,GAAGvS,MAAO,CAACuT,aAAa,EAAMC,gBAAgB,MAEzI,CAACjB,EAAWL,EAAUpC,IAYzB,IAAoBpK,EAAsBM,EAA8CJ,EAA2B6N,EAAsBC,EAA4BC,EASrK,OACC,kBAAC,WAAD,KACEtB,GACE,kBAAC,GAAD,CAAa1E,SAZEjI,EAajBsJ,GAAgByC,SAASvU,EAAO6H,GAAUQ,MAAME,aAAaC,gBAAgB,GAbtCM,EAcvC9I,EAAO6H,GAAUQ,MAAME,aAAaO,sCAdiDJ,EAerF1I,EAAO6H,GAAUQ,MAAME,aAAaG,mBAf4E6N,EAgBhHpB,EAAsBoB,aAhBgHC,EAiBtIrB,EAAsBqB,mBAjB4IC,EAkBlKtB,EAAsBsB,QAjBjB5O,GAAUiC,MAAMV,SAASc,2BAC9B0F,QAAQ,kBAAmBpH,GAC3BoH,QAAQ,0CAA2ChJ,EAAiBkC,GAAsC,IAC1G8G,QAAQ,uBAAwBlH,GAChCkH,QAAQ,kBAAmBhJ,EAAiB2P,GAAc,IAC1D3G,QAAQ,wBAAyB4G,GACjC5G,QAAQ,aAAcxJ,EAAkBsQ,aAASD,IAAU,MAYvD,kBAAC,GAAD,CAAiBxF,aAAa,GAC5B,kBAAC,GAAD,CACAtN,MAAK,iCAA4BmO,GAAgByC,SAASvU,EAAO6H,GAAUQ,MAAME,aAAaC,gBAAgB,GAAzG,gBAAsH5B,EAAgB,OAACuO,QAAD,IAACA,OAAD,EAACA,EAAuBoB,cAAc,GAA5K,KACLrH,KAAMoE,EAAYzL,GAAUiC,MAAME,gBAClCzL,GAAI+U,EAAYzL,GAAUiC,MAAME,gBAChCqF,SAAUA,EACVC,WAAY,CAChBmE,UAAU,EACVoB,SAAU,SAACrH,GAAD,OACT0H,EAA4C,mBAA1B1H,EAAEsH,cAAchS,SAE/BuO,QAASgE,MAKfJ,GACE,kBAAC,GAAD,KACE,kBAAC,GAAD,KACE,kBAAC,GAAD,CACAtR,MAAM,iBACNuL,KAAMoE,EAAYzL,GAAUiC,MAAMG,gBAClC1L,GAAI+U,EAAYzL,GAAUiC,MAAMG,gBAChCrK,KAAK,aACL2P,SAjDT,SAAkBL,GACjB,GAAkC,qBAAvByD,EAAM,SAChB,OAAOA,EAAM,SAAaC,GAAM1D,GA+CfK,CAAS1H,GAAUiC,MAAMG,gBACnCmF,YAAY,OACZC,SAAUA,EACVC,WAAY,CAACmE,UAAU,EAAMC,SAAU,CAC1CC,eAAgB,SAACC,GAAD,OAAe1B,GAAa0B,QAI7CjB,EAAO9K,GAAUiC,MAAMG,iBACvB,0BAAM9L,UAAU,eAAhB,gCC3HFyD,GAAsB,CACzB,CACC+U,UCCsD,SAAC,GAAU,IAATpY,EAAQ,EAARA,GAGzD,EAIIqY,aAAQ,CAACC,KAAM,WAAYC,cAAc,eAC3CjP,GAAUI,MAAMC,WAActB,EAAiB0E,GAAiB3F,OAAOC,SAASmR,QAAjC,mBAAiF,MAJjI1H,EADD,EACCA,SACA2H,EAFD,EAECA,aAFD,IAGCC,UAAYtE,EAHb,EAGaA,OAAQrQ,EAHrB,EAGqBA,QAKrB,EAA0CuI,mBAAS,IAAnD,mBAAOiC,EAAP,KAAsBoK,EAAtB,KACA,EAA6BlU,qBAAWmH,IAAhCI,EAAR,EAAQA,WAAYF,EAApB,EAAoBA,KACpB,EAAuDtH,IAAhDQ,EAAP,EAAOA,eAAgBD,EAAvB,EAAuBA,aAAcD,EAArC,EAAqCA,cAsBrC,OAPA4H,qBAAU,WACTmD,YAAW,WACVrC,GAA4F,qBAA/DT,GAAiB3F,OAAOC,SAASmR,QAAjC,qBAC3B,OAED,IAGF,kBAAC,WAAD,KACC,kBAAC,GAAD,CAAelK,MAAM,mBAAmBtO,GAAIA,EAAIuO,cAAeA,IAE/D,kBAAC,GAAD,KACC,0BAAMqK,SAAUH,GA1BF,SAACvS,GACjBA,EAAKoD,GAAUI,MAAMC,YAAcf,EAAiB1C,EAAKoD,GAAUI,MAAMC,aACzEzD,EAAKoD,GAAUI,MAAME,oBAAsBoM,SAAS9P,EAAKoD,GAAUI,MAAME,qBACzEoC,EAAW9F,GACXyS,EAAiBtQ,EAAiB2N,SAAS9P,EAAKoD,GAAUI,MAAMC,cAAc,IAC9E3E,EAAe,GAAG,GAClBD,EAAa,GAAG,GAChBD,EAAc,GAAG,GACjBE,EAAe,GAAG,GAClBD,EAAa,GAAG,GAChBD,EAAc,GAAG,GACjB0I,SAgBG,kBAAC,GAAD,KACC,kBAAC,GAAD,CAAiBkF,aAAa,GAC7B,kBAAC,GAAD,CACCtN,MAAM,+CACNuL,KAAMrH,GAAUI,MAAMC,WACtB3J,GAAIsJ,GAAUI,MAAMC,WACpBtI,KAAK,WACL2P,SAAUoD,EAAO9K,GAAUI,MAAMC,YACjCkH,YAAY,SACZD,aAAcyC,GAAgBvH,EAAMxC,GAAUI,MAAMC,YACpDmH,SAAUA,EACVC,WAAY,CAACmE,UAAU,KAEvBd,EAAO9K,GAAUI,MAAMC,aACvB,0BAAM/J,UAAU,eAAhB,8FAAyH,uBAAG8F,KAAM,qEAAsE0L,OAAQ,UAAvF,QAAzH,uBAIH,kBAAC,GAAD,CAAac,QAAS5I,GAAUI,MAAMG,SAASD,oBAC9C,kBAAC,GAAD,CAAiB8I,aAAa,GAC7B,kBAAC,GAAD,CACCtN,MAAM,yBACNuL,KAAMrH,GAAUI,MAAME,mBACtB5J,GAAIsJ,GAAUI,MAAME,mBACpBkH,SAAUA,EACVvM,MAAO8O,GAAgBvH,EAAMxC,GAAUI,MAAME,oBAC7CmH,WAAY,CAAEmE,UAAU,GACxBpC,QAAS,CACR,CACCnC,KAAM,SACNpM,MAAO,GAER,CACCoM,KAAM,UACNpM,MAAO,GAER,CACCoM,KAAM,UACNpM,MAAO,QAMZ,kBAAC,GAAD,CAAevE,GAAIA,EAAIyP,YAAa1L,SDpFxC,CACCqU,UEJsD,SAAC,GAAU,IAATpY,EAAQ,EAARA,GACzD,EAOIqY,aAAQ,CACXC,KAAM,SACNC,cAAe,GAGfM,kBAAkB,IAXlB/H,EADD,EACCA,SACA2H,EAFD,EAECA,aACAnE,EAHD,EAGCA,UACAC,EAJD,EAICA,SACAC,EALD,EAKCA,YALD,IAMCkE,UAAYtE,EANb,EAMaA,OAAQrQ,EANrB,EAMqBA,QASrB,EAA0CuI,mBAAS,IAAnD,mBAAOiC,EAAP,KAAsBoK,EAAtB,KACA,EAAgElU,qBAAWmH,IAAnEI,EAAR,EAAQA,WAAYF,EAApB,EAAoBA,KAAMI,EAA1B,EAA0BA,qBAAsBC,EAAhD,EAAgDA,aAuB1C2M,EAA4B,SAACzE,GAClC,GAAmD,qBAAxCvI,EAAKxC,GAAUQ,MAAMC,eAC/B,OAAO+B,EAAKxC,GAAUQ,MAAMC,eAAesK,IAI7C,OACC,kBAAC,WAAD,KACC,kBAAC,GAAD,CAAe/F,MAAM,oBAAoBtO,GAAIA,EAAIuO,cAAeA,IAChE,kBAAC,GAAD,KACC,0BAAMqK,SAAUH,GA/BF,SAACvS,GAEjB,IAAM6S,EAAQ,2BACVjN,GACA5F,GAGJiG,GAAa,GACblF,EAAIvH,KAAgC,wChByE/B,SAAsCoM,GAE5C,IAAIkN,EAAqC,CACxCC,cAAepR,EAAkB,IAAID,MACrCsR,YAAalD,SAASlK,EAAKxC,GAAUI,MAAMC,aAC3CK,aAAc,IAoBf,OAjBA8B,EAAKxC,GAAUQ,MAAMC,eAAeuD,SAAQ,SAACtD,EAAmByN,GAG9D,IAAIpD,EAAO,CACVvI,KAAMkK,SAAShM,EAAaV,GAAUQ,MAAME,aAAaC,eACzDkP,KAA+E,GAAzEnD,SAAShM,EAAaV,GAAUQ,MAAME,aAAaE,oBACzDkP,OAAQvR,EAAkBG,EAA6BgC,EAAaV,GAAUQ,MAAME,aAAaG,qBACjGkP,iBAAkBhQ,EAAkBW,EAAaV,GAAUQ,MAAME,aAAaI,sBAC9EkP,YAAatD,SAAShM,EAAaV,GAAUQ,MAAME,aAAaK,uBAChEkP,aAAcvD,SAAShM,EAAaV,GAAUQ,MAAME,aAAaO,uCACjEiP,OAAQ3R,EAAkBG,EAA6BgC,EAAaV,GAAUQ,MAAME,aAAaM,2BAGlG0O,EAAShP,aAAa5K,KAAKiV,MAItB2E,EgBlGuES,CAA6BV,IACxGrS,MAAK,SAACmG,GACNX,EAAqBW,GACrB8L,EAAiBtQ,EAAiBwE,EAAI6M,mBAAmB,IACzD1N,EAAW9F,GACXiG,GAAa,GACbqB,QAEAmM,OAAM,SAACC,GACPzN,GAAa,UAeX,YAAI7J,MAAMwJ,EAAKxC,GAAUI,MAAME,sBAAsBjG,KAAI,SAAC7B,EAAG3C,GAAJ,OACzD,kBAAC,GAAD,CACC2R,SAAUA,EACVsD,OAAQA,EACRC,KAAMlV,EACNoV,SAAUA,EACVC,YAAaA,EACbF,UAAWA,EACX7S,OAAQqX,EAA0B3Z,GAClC2D,IAAK3D,OAEP,kBAAC,GAAD,CAAea,GAAIA,EAAIyP,YAAa1L,SFxDxC,CACCqU,UGLsD,SAAC,GAAU,IAATpY,EAAQ,EAARA,GACzD,EAIIqY,aAAQ,CAACC,KAAM,aAHlBxH,EADD,EACCA,SACA2H,EAFD,EAECA,aAFD,IAGCC,UAAYtE,EAHb,EAGaA,OAAQrQ,EAHrB,EAGqBA,QAGrB,EAA0CuI,mBAAS,IAAnD,mBAAOiC,EAAP,KAAsBoK,EAAtB,KACA,EAAwBrM,oBAAS,GAAjC,mBAAO2K,EAAP,KAAczK,EAAd,KACA,EAAqD/H,qBAAWmH,IAAxDI,EAAR,EAAQA,WAAkBV,GAA1B,EAAoBQ,KAApB,EAA0BR,KAAKS,EAA/B,EAA+BA,kBAE/BW,qBAAU,WACLpB,GAAOS,GACVS,GAAU,OAAHlB,QAAG,IAAHA,OAAA,EAAAA,EAAKuO,kBAAmB9N,EAAkB2N,qBAEhD,CAACpO,EAAKS,IAeT,OACC,kBAAC,WAAD,KACE,kBAAC,GAAD,CAAeuC,MAAM,kBAAkBtO,GAAIA,EAAIuO,cAAeA,IAC9D,kBAAC,GAAD,KACC,kBAAC,GAAD,CAAMwF,GAAG,MAAT,wCAAgD1L,EAAgB,OAAC0D,QAAD,IAACA,OAAD,EAACA,EAAmB2N,mBAAmB,GAAvG,MACA,0BAAMd,SAAUH,GAjBH,SAACvS,GAEjBA,EAAKoD,GAAU0B,MAAMC,MAAMC,gBAAkBtC,EAAiB1C,EAAKoD,GAAU0B,MAAMC,MAAMC,iBACzFhF,EAAKoD,GAAU0B,MAAMC,MAAME,UAAYvC,EAAiB1C,EAAKoD,GAAU0B,MAAMC,MAAME,WACnFjF,EAAKoD,GAAU0B,MAAMC,MAAMG,QAAUxC,EAAiB1C,EAAKoD,GAAU0B,MAAMC,MAAMG,SACjFlF,EAAKoD,GAAU0B,MAAMK,mBAAoB4L,GAAmD,SAA1C/Q,EAAKoD,GAAU0B,MAAMK,iBAEvEsN,EAAiBtQ,EAAkBnC,EAAKoD,GAAU0B,MAAMC,MAAMC,gBAAkBhF,EAAKoD,GAAU0B,MAAMC,MAAME,UAAYjF,EAAKoD,GAAU0B,MAAMC,MAAMG,SAAU,IAC5JY,EAAW9F,GACXsH,SASI,kBAAC,GAAD,CAAa0E,QAAS5I,GAAU0B,MAAMH,SAASK,gBAC9C,kBAAC,GAAD,CAAiBwH,aAAa,GAC7B,kBAAC,GAAD,CACCtN,MAAM,iCACNuL,KAAMrH,GAAU0B,MAAMC,MAAMC,eAC5BlL,GAAIsJ,GAAU0B,MAAMC,MAAMC,eAC1B7J,KAAK,WACL2P,SAAUoD,EAAO9K,GAAU0B,MAAMC,MAAMC,gBACvC2F,YAAY,SACZD,aAAY,eACZE,SAAUA,EACVC,WAAY,CAACmE,UAAU,KAEvBd,EAAO9K,GAAU0B,MAAMC,MAAMC,iBAC7B,0BAAMtL,UAAU,eAAhB,6CAIH,kBAAC,GAAD,CAAasS,QAAS5I,GAAU0B,MAAMH,SAASM,UAC9C,kBAAC,GAAD,CAAiBuH,aAAa,GAC7B,kBAAC,GAAD,CACCtN,MAAM,iBACNuL,KAAMrH,GAAU0B,MAAMC,MAAME,SAC5BnL,GAAIsJ,GAAU0B,MAAMC,MAAME,SAC1B9J,KAAK,WACL2P,SAAUoD,EAAO9K,GAAU0B,MAAMC,MAAME,UACvC0F,YAAY,SACZD,aAAY,aACZE,SAAUA,EACVC,WAAY,CAACmE,UAAU,KAEvBd,EAAO9K,GAAU0B,MAAMC,MAAME,WAC7B,0BAAMvL,UAAU,eAAhB,6BAIH,kBAAC,GAAD,CAAasS,QAAS5I,GAAU0B,MAAMH,SAASO,QAC9C,kBAAC,GAAD,CAAiBsH,aAAa,GAC7B,kBAAC,GAAD,CACCtN,MAAM,iBACNuL,KAAMrH,GAAU0B,MAAMC,MAAMG,OAC5BpL,GAAIsJ,GAAU0B,MAAMC,MAAMG,OAC1B/J,KAAK,WACL2P,SAAUoD,EAAO9K,GAAU0B,MAAMC,MAAMG,QACvCyF,YAAY,SACZD,aAAY,aACZE,SAAUA,EACVC,WAAY,CAACmE,UAAU,KAEvBd,EAAO9K,GAAU0B,MAAMC,MAAMG,SAC7B,0BAAMxL,UAAU,eAAhB,6BAIFqX,GACD,kBAAC,GAAD,CAAahF,YAAY,EAAMC,QAAS5I,GAAU0B,MAAMH,SAASS,KAChE,kBAAC,GAAD,CAAiBqH,aAAa,GAC7B,2BAAO/S,UAAU,eAAe0R,QAAQ,mDAAxC,wBAGD,kBAAC,GAAD,CAAiBmB,SAAS,GACzB,kBAAC,GAAD,CACArN,MAAM,KACN6O,SAAS,EACTtD,KAAMrH,GAAU0B,MAAMK,gBACtBrL,GAAE,UAAKsJ,GAAU0B,MAAMK,gBAArB,MACFuF,aAAc,OACdE,SAAUA,KAGX,kBAAC,GAAD,CAAiB2B,SAAS,GACzB,kBAAC,GAAD,CACArN,MAAM,MACN6O,SAAS,EACTtD,KAAMrH,GAAU0B,MAAMK,gBACtBrL,GAAE,UAAKsJ,GAAU0B,MAAMK,gBAArB,MACFuF,aAAc,QACdE,SAAUA,MAKZ,kBAAC,GAAD,CAAe9Q,GAAIA,EAAIyP,YAAa1L,SH/GzC,CACCqU,UIVsD,SAAC,GAAU,IAATpY,EAAQ,EAARA,GACzD,EAKIqY,aAAQ,CAACC,KAAM,aAJlBxH,EADD,EACCA,SACA2H,EAFD,EAECA,aACAhC,EAHD,EAGCA,SAHD,IAICiC,UAAYtE,EAJb,EAIaA,OAAQrQ,EAJrB,EAIqBA,QAGrB,EAA0CuI,mBAAS,IAAnD,mBAAOiC,EAAP,KAAsBoK,EAAtB,KACA,EAAqDlU,qBAAWmH,IAAzDI,EAAP,EAAOA,WAAYI,EAAnB,EAAmBA,WAAYN,EAA/B,EAA+BA,KAAMK,EAArC,EAAqCA,aA8B/B2M,EAA4B,SAACzE,GAClC,GAAmD,qBAAxCvI,EAAKxC,GAAUQ,MAAMC,eAC/B,OAAO+B,EAAKxC,GAAUQ,MAAMC,eAAesK,IAI7C,OACC,kBAAC,WAAD,KACC,kBAAC,GAAD,CAAe/F,MAAM,mBAAmBtO,GAAIA,EAAIuO,cAAeA,IAC/D,kBAAC,GAAD,KACC,kBAAC,GAAD,CAAMwF,GAAG,MAAT,iFACA,0BAAM6E,SAAUH,GAvCF,SAACvS,GAEjB8F,EAAW9F,GACXyS,EAAiB,iBACjBxM,GAAa,GAEb,IAAM4M,EAAQ,2BACVjN,GACA5F,GAKJe,EAAIvH,KAAwB,uClBmCH,SAACwG,GAE3B,IAAI8S,EAA6B,CAEhCc,aAAc,EACdC,KAAM,CACLC,OAAQ9T,EAAKoD,GAAU0B,MAAMC,MAAMC,gBACnCC,SAAUjF,EAAKoD,GAAU0B,MAAMC,MAAME,UACrCC,OAAQlF,EAAKoD,GAAU0B,MAAMC,MAAMG,SAEpC6O,QAAS/T,EAAKoD,GAAU0B,MAAMK,iBAC9BrB,aAAc,IA2Bf,OAvBA9D,EAAKoD,GAAUQ,MAAMC,eAAeuD,SAAQ,SAACtD,EAAmByN,GAE/D,GAAIvR,EAAKoD,GAAUI,MAAME,qBAAwB6N,EAAQ,EAAI,CAC5D,IAAIpD,EAAO,CACVvI,KAAMkK,SAAShM,EAAaV,GAAUQ,MAAME,aAAaC,eACzDkP,KAA+E,GAAzEnD,SAAShM,EAAaV,GAAUQ,MAAME,aAAaE,oBACzDkP,OAAQvR,EAAkBG,EAA6BgC,EAAaV,GAAUQ,MAAME,aAAaG,qBACjGkP,iBAAkBhQ,EAAkBW,EAAaV,GAAUQ,MAAME,aAAaI,sBAC9EkP,YAAatD,SAAShM,EAAaV,GAAUQ,MAAME,aAAaK,uBAChEmP,OAAQ3R,EAAkBG,EAA6BgC,EAAaV,GAAUQ,MAAME,aAAaM,0BACjGiP,aAAcvD,SAAShM,EAAaV,GAAUQ,MAAME,aAAaO,uCACjE2P,qBAA6F,SAAvElQ,EAAaV,GAAUQ,MAAME,aAAaQ,yBAChE2P,sBAA+F,SAAvEnQ,EAAaV,GAAUQ,MAAME,aAAaQ,yBAAuCwL,SAAShM,EAAaV,GAAUQ,MAAME,aAAaS,gBAAkB,EAC9K2P,sBAA+F,UAAvEpQ,EAAaV,GAAUQ,MAAME,aAAaQ,yBAAwCnB,EAAkBW,EAAaV,GAAUQ,MAAME,aAAaU,8BAAgC,EACtMC,oBAA6F,UAAvEX,EAAaV,GAAUQ,MAAME,aAAaQ,yBAAwCnB,EAAkBW,EAAaV,GAAUQ,MAAME,aAAaW,sBAAwB,EAC5LC,YAAc1E,EAAKoD,GAAUiC,MAAMC,UAAUiM,GAAOnO,GAAUiC,MAAMG,gBAAmBrC,EAAkBnD,EAAKoD,GAAUiC,MAAMC,UAAUiM,GAAOnO,GAAUiC,MAAMG,iBAAmBxF,EAAKoD,GAAUiC,MAAMC,UAAUiM,GAAOnO,GAAUiC,MAAME,iBAGzOuN,EAAShP,aAAa5K,KAAKiV,OAKtB2E,EkBzE8DqB,CAAYtB,IAC9ErS,MAAK,SAACmG,GACNT,EAAWS,GACXV,GAAa,GACbqB,QAEAmM,OAAM,SAACC,GAEPzN,GAAa,UAmBX,YAAI7J,MAAMwJ,EAAKxC,GAAUI,MAAME,sBAAsBjG,KAAI,SAAC7B,EAAG3C,GAAJ,OACzD,kBAAC,GAAD,CACC2R,SAAUA,EACVsD,OAAQA,EACRC,KAAMlV,EACNsX,SAAUA,EACVhV,OAAQqX,EAA0B3Z,GAClC2D,IAAK3D,OAEP,kBAAC,GAAD,CAAe+F,QAAS,UAAWlF,GAAIA,EAAIyP,YAAa1L,UJ7ChDuW,GAAmB,WAC/B,OACC,kBAAC,GAAD,CACCtK,WAAY,4BACZE,oBAAoB,QACpBD,oBAAqB,CAAC,mBAAoB,oBAAqB,kBAAmB,qBACjF5M,IACAA,GAAMM,KAAI,SAAC8M,EAAM3N,GAAP,OACT,kBAAC,GAAD,CAAa9C,GAAI8C,EAAKA,IAAKA,GAC1B,kBAAC2N,EAAK2H,UAAN,CAAgBpY,GAAI8C,UK9BbyX,GAAe,SAAC,GAAyC,EAAvCC,SAAwC,IAEnE,EAgBI,CACNC,IAAK,kBACLC,IAAK,6BAlBKA,EAAR,EAAQA,IAAKD,EAAb,EAAaA,IAEb,OACI,yBACI7a,UAAS,mBACT,kBAAC,GAAD,CAAMmU,GAAG,MAAT,0CAGN,kBAAC,GAAD,CAAMA,GAAG,KAAT,kTAEM,yBAAKnU,UAAU,yBAAyB8a,IAAKA,EAAKD,IAAG,UCjBtCE,oBDiBsC,OAAmBF,OEP7E,IAAMG,GAAkE,SAAC,GAAY,IAAX1U,EAAU,EAAVA,KAChF,EAAwC1B,IAAjCG,EAAP,EAAOA,eAAgBG,EAAvB,EAAuBA,cAEjBsL,EAAc3L,qBAAWmH,IAQzBiP,EACL,kBAAC,WAAD,mCAAsCxS,EAAiBnC,EAAK4U,eAAeC,KAAK,GAAhF,6BAAgH,gCAAS1S,EAAiBnC,EAAK4U,eAAeE,KAAK,IAAnK,gDAAgO3S,EAAiBnC,EAAK6T,KAAKkB,OAAO,GAAlQ,mBAAyR5S,EAAiBnC,EAAK6T,KAAKmB,iBAAiB,GAArU,8CAAuX7S,EAAiBnC,EAAK6T,KAAKoB,UAAU,GAA5Z,qBAEKlO,EACL,kBAAC,WAAD,uBAAyB,0BAAMrN,UAAYsG,EAAK4U,eAAeM,SAAW,EAAK,gBAAkB,mBAAqBlV,EAAK4U,eAAeM,SAAW,EAAK,UAAY,SAAtK,QACD,OACC,kBAAC,WAAD,KACElV,GACD,yBAAKtG,UAAU,sBACd,4BAAQA,UAAU,uBAAuB4F,QAfjB,WAC1B4K,EAAYhE,WAAW,MACvBzH,EAAe,GACfG,EAAc,GAAG,KAaC,0BAAMlF,UAAU,6BACZ,kBAACkQ,EAAD,CAAe9N,MAAO,MAF1C,eAMA,yBAAKpC,UAAU,oEACd,yBAAKA,UAAU,yBACd,yBAAKA,UAAU,+BACd,kBAAC,GAAD,CAAMmU,GAAG,MAAM9G,GACf,kBAAC,GAAD,CAAM8G,GAAG,MAAM1L,EAAiBa,KAAKmS,IAAInV,EAAK4U,eAAeM,UAAU,IACvE,2BAAIP,GACJ,0BAAMjb,UAAU,wBAAqD,IAA7BsG,EAAK6T,KAAKuB,cAAX,qFACvC,kBAAC,GAAD,CAAMvH,GAAG,KAAKnU,WAAyC,IAA7BsG,EAAK6T,KAAKuB,cAAyB,gBAAkB,oBAAkD,IAA7BpV,EAAK6T,KAAKuB,cAAX,gBvBbnG,SAA8BC,GACpC,GAAIA,EACH,OAAOC,YAAeC,YAAmB,CACxCC,MAAO,IAAI9T,KACX+T,IAAKvT,YAAU,IAAIR,KAAQ2T,KACxB,CAAEK,OAAQC,IAAI9T,OAAQ,CAAC,QAAS,YuBQyH+T,CAAqB5V,EAAK6T,KAAKuB,gBACvL,8WACA,0BAAM1b,UAAW,SAAUI,GAAI,aAAckG,EAAK6T,KAAKuB,kBAK1D,yBAAK1b,UAAU,2BACd,kBAAC,GAAD,CAAMmU,GAAG,KAAT,2XAGiO,uBAAGrO,KAAM,+DAAT,0BAHjO,2DAKA,kBAAC,EAAD,CAAQR,QAAQ,WAAWE,MAAM,iBAC7BD,IAAG,kBCnDC4W,GAAuF,SAAC,GAAmB,IAAjBxW,EAAgB,EAAhBA,UACnG,OACI,yBAAK3F,UAAS,yBAAoB2F,EAAY,qBAAuB,KACjE,yBAAK3F,UAAU,iBACX,kBAAC,GAAD,CAAMmU,GAAG,MAAT,uCAEA,yBAAKnU,UAAU,gBACX,kBAACyP,EAAD,CAAOrN,MAAO,GAAIC,OAAQ,KAD9B,qBAKA,kBAAC+Z,EAAD,CAAgBha,MAAO,IAAKC,OAAQ,SCNvCga,GAAO,WACnB,MAA4BxX,qBAAWmH,IAA/B1F,EAAR,EAAQA,KAAMX,EAAd,EAAcA,UACX,OACI,kBAACxF,EAAD,KACI,kBAAC,EAAD,KACL,kBAAC,EAAD,CAAQhB,KAAM,CAAC,GAAI,KAAM,KAAM,IAC9B,kBAAC,GAAD,OAED,kBAAC,EAAD,CAAQA,KAAM,CAAC,GAAI,KAAM,KAAM,IAC7BmH,EAAO,kBAAC,GAAD,CAAiBA,KAAMA,IAAW,KAC1C,yBAAKgW,SAAUhW,GACf,kBAAC,GAAD,QAGD,kBAAC,GAAD,CAAQX,UAAWA,OCbN4W,QACW,cAA7B/U,OAAOC,SAASF,UAEe,UAA7BC,OAAOC,SAASF,UAEhBC,OAAOC,SAASF,SAASiV,MACvB,2D,MCRNC,IAASC,OACL,kBAAC,IAAMC,WAAP,KACI,kBAAC,EAAD,KACH,kBAAC,GAAD,KACO,kBAAC,GAAD,SAIR3O,SAAS4O,eAAe,SDyHtB,kBAAmBC,WACrBA,UAAUC,cAAcC,MACrBjW,MAAK,SAAAkW,GACJA,EAAaC,gBAEdlD,OAAM,SAAAC,GACLkD,QAAQlD,MAAMA,EAAMmD,c","file":"static/js/main.chunk.js","sourcesContent":["import React, { FunctionComponent } from 'react';\n\nconst breakpoints: string[] = ['xs', 'sm', 'md', 'lg', 'xlg'];\n\nconst createClasses = (prefix: string, cols: (number | null)[]) => {\n return cols.reduce((classes: string[], col, i) => {\n classes.push(i === 0 ? `${prefix}-${col}` : `${prefix}-${col}--${breakpoints[i]}`);\n\n return classes;\n }, []);\n};\n\ninterface ColInterface {\n extraClass?: string;\n cols?: (number | null)[];\n push?: (number | null)[];\n pull?: (number | null)[];\n pre?: (number | null)[];\n post?: (number | null)[];\n}\n\nexport const Column: FunctionComponent = ({\n extraClass = '',\n children,\n cols = [],\n push = [],\n pull = [],\n pre = [],\n post = [],\n}) => {\n const classes: string = [\n ...createClasses('o-col', cols),\n ...createClasses('u-push', push),\n ...createClasses('u-pull', pull),\n ...createClasses('u-pre', pre),\n ...createClasses('u-post', post),\n ].join(' ');\n\n return
{children}
;\n};\n","import React, { FunctionComponent } from 'react';\n\ninterface GridInterface {\n extraClass?: string;\n}\n\nexport const Grid: FunctionComponent = ({ extraClass = '', children }) => (\n
{children}
\n);\n","import React, { FunctionComponent } from 'react';\n\ninterface ContainerInterface {\n extraClass?: string;\n}\n\nexport const Container: FunctionComponent = ({ extraClass = '', children }) => (\n
{children}
\n);\n","import React, { ReactNode, Fragment } from 'react';\nimport { Container } from '../shared/Container';\n\ninterface BaseLayoutProps {\n children?: ReactNode;\n}\n\nexport function BaseLayout({ children }: BaseLayoutProps) {\n return (\n \n
\n {children}\n
\n
\n );\n}\n","import React from 'react';\ninterface IconProps {\n width?: number;\n height?: number;\n}\n\nconst ArrowDownIcon = (props: IconProps) => {\n return (\n \n \n \n );\n};\n\nexport default ArrowDownIcon;\n","import React from 'react';\ninterface IconProps {\n width?: number;\n height?: number;\n}\n\nconst ArrowLongDownIcon = (props: IconProps) => {\n return (\n \n \n \n );\n};\n\nexport default ArrowLongDownIcon;\n","import React from 'react';\ninterface IconProps {\n width?: number;\n height?: number;\n}\n\nconst CheckIcon = (props: IconProps) => {\n return (\n \n \n \n );\n};\n\nexport default CheckIcon;\n","import React from 'react';\ninterface IconProps {\n width?: number;\n height?: number;\n}\n\nconst InfoIcon = (props: IconProps) => {\n return (\n \n \n \n \n );\n};\n\nexport default InfoIcon;\n","import React from 'react';\ninterface IconProps {\n width?: number;\n height?: number;\n}\n\nconst LoaderDotsIcon = (props: IconProps) => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default LoaderDotsIcon;\n","import React from 'react';\ninterface IconProps {\n width?: number;\n height?: number;\n}\n\nconst StripeIcon = (props: IconProps) => {\n return (\n \n \n \n );\n};\n\nexport default StripeIcon;\n","export type ClassDictionary = Record;\n\nexport type ClassValue =\n | string\n | number\n | boolean\n | undefined\n | null\n | ClassDictionary\n | ClassValue[];\n\n/**\n * Parses a class value from a single mixed-type argument.\n *\n * @param {*} arg The argument to parse.\n * @returns {string} The value to append to the class attribute value.\n * @ignore\n */\nconst parseClassFromArg = (arg: ClassValue): string => {\n let classToAppend = '';\n\n if (arg) {\n if (Array.isArray(arg)) {\n if (arg.length) {\n classToAppend = classNames(...arg);\n }\n } else if (typeof arg === 'object') {\n const objPrototype = Object.prototype;\n\n if (objPrototype.toString !== arg.toString) {\n classToAppend = arg.toString();\n } else {\n // using `for...in` over `Object.keys()` and string append over\n // template literals for improved performance\n // eslint-disable-next-line no-restricted-syntax\n for (const key in arg) {\n if (objPrototype.hasOwnProperty.call(arg, key) && arg[key]) {\n classToAppend += (classToAppend ? ' ' : '') + key;\n }\n }\n }\n } else {\n classToAppend += arg;\n }\n }\n\n return classToAppend;\n};\n\n/**\n * Reduces a list of arguments into a single class attribute value.\n *\n * @param {...*} classNameArgs A list of mixed-type arguments to reduce.\n * @returns {string} A class attribute value.\n */\nexport default function classNames(...classNameArgs: ClassValue[]): string {\n return classNameArgs.reduce((classAttr, arg) => {\n const parsed = parseClassFromArg(arg);\n return classAttr + (parsed ? (classAttr ? ' ' : '') + parsed : '');\n }, '');\n}\n","import React, { createContext, useReducer } from 'react';\n\nexport const SET_STEPS = 'SET_STEPS';\nexport const SET_CURRENT_STEP = 'SET_CURRENT_STEP';\nexport const SET_STEP_ACTIVE = 'SET_STEP_ACTIVE';\nexport const SET_STEP_VALID = 'SET_STEP_VALID';\nexport const SET_STEP_TOUCHED = 'SET_STEP_TOUCHED';\n\ninterface StepperPayload {\n type: 'SET_STEPS' | 'SET_CURRENT_STEP' | 'SET_STEP_ACTIVE' | 'SET_STEP_VALID' | 'SET_STEP_TOUCHED';\n payload?: StepState;\n}\n\ntype Step = {\n isActive: boolean;\n isTouched: boolean;\n isValid: boolean;\n};\n\ninterface StepState {\n steps: Step[];\n currentStep?: number;\n validationId?: number;\n isActive?: boolean;\n isValid?: boolean;\n\t\tisTouched?: boolean;\n}\n\ninterface StepContext {\n state: StepState;\n dispatch: (context: StepperPayload) => void;\n}\n\nexport const defaultStepperState: StepState = {\n steps: [],\n currentStep: 0,\n};\n\nexport const reducer = (state = defaultStepperState, action: StepperPayload) => {\n const { steps } = state;\n const { type, payload } = action;\n\n switch (type) {\n case SET_CURRENT_STEP:\n return {\n ...state,\n currentStep: payload!.currentStep,\n steps:\n steps &&\n steps.map((content, i) =>\n i === payload!.currentStep\n ? { ...content, isActive: true, isTouched: true }\n : content,\n ),\n };\n case SET_STEP_ACTIVE:\n return {\n ...state,\n steps:\n steps &&\n steps.map((content, i) =>\n i === payload!.currentStep\n ? {\n ...content,\n isActive: payload?.isActive || false,\n }\n : content,\n ),\n };\n\n case SET_STEP_VALID:\n return {\n ...state,\n steps:\n steps &&\n steps.map((content, i) =>\n i === payload!.currentStep\n ? {\n ...content,\n isValid: payload?.isValid || false,\n }\n : content,\n ),\n };\n\t\t\t\tcase SET_STEP_TOUCHED:\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\t\t\tsteps:\n\t\t\t\t\t\t\t\t\t\t\t\tsteps &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsteps.map((content, i) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ti === payload!.currentStep\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t...content,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisTouched: payload?.isTouched || false,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: content,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t};\n case SET_STEPS:\n return {\n ...state,\n steps: payload!.steps,\n };\n\n default:\n return state;\n }\n};\n\nexport const StepperContext = createContext({\n state: defaultStepperState,\n dispatch: (context) => {},\n});\n\n// dispatch({ type: SET_STEPS, payload: { steps } })\n// state\n\nexport const StepperProvider: React.FC = ({ children }) => {\n const [state, dispatch] = useReducer(reducer, defaultStepperState);\n\n return (\n {children}\n );\n};\n","import { SET_STEP_TOUCHED, SET_STEP_VALID } from './../../store/stepper/StepperContext';\nimport { useCallback, useContext } from 'react';\nimport {\n SET_CURRENT_STEP,\n SET_STEPS,\n SET_STEP_ACTIVE,\n StepperContext,\n} from '../../store/stepper/StepperContext';\n\nexport const useStepper = () => {\n const { state, dispatch } = useContext(StepperContext);\n const { currentStep, steps } = state;\n\n if (!StepperContext) {\n throw new Error('useStepper should be used inside StepperProvider');\n }\n\n const setCurrentStep = useCallback(\n (currentStep) =>\n dispatch({ type: SET_CURRENT_STEP, payload: { currentStep, steps: state.steps } }),\n [dispatch, state.steps],\n );\n\n const setSteps = useCallback(\n (steps) => dispatch({ type: SET_STEPS, payload: { steps } }),\n [dispatch],\n );\n\n const setStepActive = useCallback(\n (currentStep, isActive) =>\n dispatch({\n type: SET_STEP_ACTIVE,\n payload: { currentStep, steps: state.steps, isActive },\n }),\n [dispatch, state.steps],\n );\n\n const setStepValid = useCallback(\n (currentStep, isValid) =>\n dispatch({\n type: SET_STEP_VALID,\n payload: { currentStep, steps: state.steps, isValid },\n }),\n [dispatch, state.steps],\n );\n\n\t\tconst setStepTouched = useCallback(\n\t\t\t(currentStep, isTouched) =>\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: SET_STEP_TOUCHED,\n\t\t\t\t\tpayload: { currentStep, steps: state.steps, isTouched },\n\t\t\t\t}),\n\t\t\t[dispatch, state.steps],\n\t\t);\n\n return {\n setSteps,\n currentStep,\n setStepActive,\n setStepValid,\n\t\t\t\tsetStepTouched,\n steps,\n setCurrentStep,\n };\n};\n","import React, { FunctionComponent, Fragment } from 'react';\nimport classNames from '../../../utils/classnames';\n\nexport interface ButtonProps {\n variant?: 'tertiary' | 'ghost' | 'secondary';\n isLoading?: boolean;\n extraClasses?: string;\n url?: string;\n label?: string;\n disabled?: boolean;\n onClick?: (e?: any) => void;\n}\n\nexport const Button: FunctionComponent = ({\n variant = '',\n url = null,\n label,\n extraClasses,\n disabled = false,\n isLoading,\n onClick = () => {},\n ...rest\n}) => {\n const classes = classNames(\n {\n 'c-button' : true,\n 'c-button-variant--tertiary': variant === 'tertiary',\n 'c-button-variant--secondary': variant === 'secondary',\n 'c-button-variant--ghost': variant === 'ghost',\n 'button--disabled': disabled,\n 'button--is-loading': isLoading,\n },\n extraClasses,\n );\n\n return (\n \n {!url && (\n \n )}\n {url && (\n \n {label && {label}}\n \n )}\n \n );\n};\n","/**\n * Simple HTTPGet client wrapped around window.fetch\n * @export\n * @class HTTPGetClient\n */\nexport default class HTTPGetClient {\n config: RequestInit = {\n method: 'GET',\n };\n\n baseUrl = '/';\n\n constructor({ baseUrl }: { baseUrl: string }) {\n this.baseUrl = baseUrl;\n }\n\n get(endpoint: string, config: RequestInit = {}) {\n return this.request(endpoint, { ...this.config, ...config });\n }\n\n post(endpoint: string, data: D) {\n const defaultConfig = {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n\n body: JSON.stringify(data),\n };\n return this.request(endpoint, defaultConfig);\n }\n\n private request(endpoint: string, config: RequestInit) {\n return fetch(`${this.baseUrl}/${endpoint}`, config).then(async (response) => {\n const data = await response.json();\n if (response.ok) {\n return data as T;\n } else {\n return Promise.reject(data);\n }\n });\n }\n}\n","import { getApiUrl } from './apiUrls';\nimport HTTPGetClient from './HTTPClient';\n\nexport const API = new HTTPGetClient({ baseUrl: getApiUrl(2) });\nexport const API_MOCK = new HTTPGetClient({ baseUrl: 'http://localhost:3000/oversluitentool/assets/json/' });\n","export const getApiUrl = (version: number) => {\n const { hostname } = window.location;\n let api = version !== 2 ? 'https://api.hypotheker.nl' : 'https://api.hypotheker.nl/v2';\n\n if (hostname.indexOf('staging') !== -1) {\n api = version !== 2 ? 'https://api.hypotheker.nl' : 'https://staging-api.hypotheker.nl/v2';\n }\n\n if (hostname.indexOf('test') !== -1) {\n api = version !== 2 ? 'https://testapi.hypotheker.nl' : 'https://test-api.hypotheker.nl/v2';\n }\n\n if (hostname.indexOf('acc') !== -1) {\n api = version !== 2 ? 'https://acpapi.hypotheker.nl' : 'https://acc-api.hypotheker.nl/v2';\n }\n\n if (hostname.indexOf('localhost') !== -1) {\n api = version !== 2 ? 'https://api.hypotheker.nl' : 'https://acc-api.hypotheker.nl/v2';\n }\n\n return api;\n};\n","import { format, parse, getDate, addMonths, setDate, intervalToDuration, formatDuration } from 'date-fns';\nimport { nl } from 'date-fns/locale'\n\n/*export function getDate(date?: string) {\n const today = date ? new Date(date) : new Date();\n return `${today.getDate()}-${today.getMonth() + 1}-${today.getFullYear()}`;\n}*/\n\nexport function convertDateString(date: string, formatString = 'dd-MM-yyyy', exportFormatString = 'yyyy-MM-dd') {\n\treturn format(parse(date, formatString, new Date()), exportFormatString);\n}\n\nexport function parseDate(date: string): Date {\n\treturn parse(date, 'yyyy-MM-dd', new Date());\n}\n\nexport function convertDateObject(date: Date, displayFormat?: boolean) {\n\treturn format(date, (displayFormat) ? 'dd-MM-yyyy' : 'yyyy-MM-dd');\n}\n\nexport function convertToFirstOfTheNextMonth(dateString: string): Date {\n\tlet date = parseDate(dateString);\n\tif (getDate(date) > 1) {\n\t\t// add one month & set to first of the month\n\t\treturn setDate(addMonths(date, 1) ,1);\n\t}\n\n\treturn date;\n}\n\nexport function getFormattedDuration(months: number) {\n\tif (months) {\n\t\treturn formatDuration(intervalToDuration({\n\t\t\tstart: new Date(),\n\t\t\tend: addMonths(new Date(), months)\n\t\t}), { locale: nl, format: ['years', 'months']})\n\t}\n}\n\n//getDate(date)\n","export const numberToCurrency = (number: number | undefined, format: boolean) : string => {\n if (number && !format) {\n return `€ ${number}`;\n } else if (number && format) {\n var formatter = new Intl.NumberFormat('nl-NL', {\n style: 'currency',\n currency: 'EUR',\n maximumFractionDigits: 0,\n\t\t\t\t\t\tminimumFractionDigits: 0\n });\n return formatter.format(number);\n }\n\n\t\treturn '';\n};\n\nexport const currencyToNumber = (value: string, mustBeNumber?: boolean, log?: boolean): number | string => {\n\tif (typeof value === 'number') return value;\n\tif (mustBeNumber && !value) return 0;\n\tlet formattedValue: number | string = '';\n\tif (value) {\n\t\tformattedValue = value.replaceAll(\"€\", \"\");\n\t\tformattedValue = formattedValue.replaceAll(/\\./g,'');\n\t\tformattedValue = formattedValue.replaceAll(/\\s/g, '');\n\t\tformattedValue = parseFloat(formattedValue as string);\n\t\tif(Math.round(formattedValue) !== formattedValue) {\n\t\t\tformattedValue = formattedValue.toFixed(2);\n\t\t}\n\t\tif (log) {\n\t\t\t//console.log(formattedValue)\n\t\t}\n\t\treturn Math.round(formattedValue as number);\n\t} else {\n\t\treturn '';\n\t}\n};\n\nexport const percentageToFloat = (value: string): number => {\n\tlet formattedValue = value.replaceAll(\"%\", \"\");\n\tformattedValue = formattedValue.replaceAll(\",\", \".\")\n\treturn parseFloat(formattedValue);\n}\n\n\nexport const floatToPercentage = (value: number): string => {\n\treturn value.toString().replace(\".\", \",\");\n}\n","import { FormItem } from '../../../store/refinance/RefinanceContext';\nimport { RefinanceRequest } from '../../../models/RefinanceRequest';\nimport { convertDateObject, convertToFirstOfTheNextMonth } from '../../../utils/dates';\nimport { RemainingMortgageRequest } from '../../../models/RemainingMortgageRequest';\nimport { percentageToFloat } from '../../../utils/formatting';\n\nexport const formItems = {\n\tgeneral: {\n\t\tremainingTotalMortgageAmount: 'remainingTotalMortgageAmount',\n\t\tinterestBase: 'interestBase',\n\t},\n\tstep1: {\n\t\thousePrice: 'housePrice',\n\t\tcountMortgageParts: 'countMortgageParts',\n\t\ttooltips: {\n\t\t\tcountMortgageParts: 'Een hypotheek kan uit meerdere delen bestaan, bijvoorbeeld een annuïteitenhypotheek met een aflossingsvrij deel. Elk deel kan een andere rente, rentevastperiode en/of looptijd hebben. Geef hier aan uit hoeveel delen jouw hypotheek bestaat.'\n\t\t}\n\t},\n\tstep2: {\n\t\tmortgageParts: 'mortgageParts',\n\t\tmortgagePart: {\n\t\t\tmortgageType: 'mortgageType',\n\t\t\tmortgageTermYears: 'mortgageTermYears',\n\t\t\tmortgageTermStart: 'mortgageTermStart',\n\t\t\tcurrentInterestRate: 'currentInterestRate',\n\t\t\tinterestRateFixedFor: 'interestRateFixedFor',\n\t\t\tinterestRateFixedUntil: 'interestRateFixedUntil',\n\t\t\tmortgageAmountStartFixedInterestRate: 'mortgageAmountStartFixedInterestRate',\n\t\t\t//mortgageAmountRemaining: 'mortgageAmountRemaining',\n\t\t\tisThePenaltyAmountKnown: 'isThePenaltyAmountKnown',\n\t\t\tpenaltyAmount: 'penaltyAmount',\n\t\t\tpenaltyFreePayOffPercentage: 'penaltyFreePayOffPercentage',\n\t\t\tcomparativeInterest: 'comparativeInterest',\n\t\t\tnewInterest: 'newInterest',\n\t\t},\n\t\ttoolTips: {\n\t\t\tmortgageTerm: 'Wat is de looptijd (de periode waarin je de hypotheek moet afbetalen) van de hypotheek en op welke datum is de hypotheek afgesloten?',\n\t\t\tcurrentInterestRate: 'Wat is de hypotheekrente die je nu betaalt voor dit hypotheekdeel?',\n\t\t\tinterestRateFixed: '

Voor hoe lang is de huidige hypotheekrente vastgezet en wanneer eindigt deze rentevastperiode? De resterende rentevaste periode heeft invloed op de hoogte van de oversluitkosten. Lees hier meer.

',\n\t\t\tmortgageAmountStartFixedInterestRate: 'Wat was de hoogte van dit hypotheekdeel bij de start van de huidige rentevastperiode?',\n\t\t\tisThePenaltyAmountKnown: '

Als je eerder dan afgesproken je hypotheek aflost dan moet je misschien een vergoeding betalen voor vervroegd aflossen. Dit wordt ook wel boeterente genoemd. Deze vergoeding vraag je op bij je huidige hypotheekverstrekker. Lees meer over hoe de boeterente wordt berekend.
 
Kies \\'ja\\' als je de te betalen vergoeding (boeterente) weet. Je kunt deze dan hieronder invullen.
Kies \\'nee\\' als je de vergoeding niet weet. Vul dan hieronder extra gegevens in zodat er een indicatie van de vergoeding berekend kan worden volgens de rekenregels van de AFM.
NB De berekening gaat er vanuit dat er sindsdien geen extra aflossingen zijn gedaan.

',\n\t\t\tpenaltyAmount: 'Bij steeds meer hypotheekverstrekkers kun je de vergoeding (boeterente) zelf online berekenen. Anders kun je deze bij hen opvragen. Lees hier meer over boeterente.',\n\t\t\tpenaltyFreePayOffPercentage: 'Elk jaar mag je een bepaald bedrag zonder kosten extra aflossen. Hoeveel dit is staat in je hypotheekcontract. Vaak is dit 10%.',\n\t\t\tcomparativeInterest: '

De vergelijkingsrente is de rente die je hypotheekverstrekker moet gebruiken voor het berekenen van de boeterente. Je kunt de rente als volgt vinden:

  1. Ga naar de pagina met actuele hypotheekrentes.
  2. Kies bij \\'Hypotheekvorm\\' voor de vorm van je huidige hypotheek.
  3. Kies bij \\'Rentevaste periode\\' voor de periode die groter of gelijk is aan jouw resterende rentevaste periode.
  4. Kies bij \\'Rentetarief\\' voor NHG als je een NHG-hypotheek hebt. Heb je geen NHG-hypotheek, kies dan voor het percentage dat het beste de verhouding tussen de hoogte van je oorspronkelijke hypotheek en de waarde van je woning (op het moment van afsluiten van de hypotheek) weergeeft.
  5. Kies bij \\'Type bouw\\' voor Bestaande bouw.
  6. Zoek in de tabel jouw hypotheekverstrekker en soort hypotheek op.
  7. Dit is de rente die je kunt gebruiken als vergelijkingsrente.

Let op: heb je bij het afsluiten een korting of een opslag gekregen op de hypotheekrente? Dan mag je deze korting ook toepassen op de vergelijkingsrente. Individuele (onderhandelde) kortingen mogen niet worden toegepast.

'\n\t\t}\n\t},\n\tstep3: {\n\t\tcosts: {\n\t\t\tadministration: 'administration',\n\t\t\ttaxation: 'taxation',\n\t\t\tnotary: 'notary',\n\t\t},\n\t\tmortgageWithNhg: 'mortgageWithNhg',\n\t\ttoolTips: {\n\t\t\tadministration: 'De advies- en bemiddelingskosten betaal je aan je financieel adviseur voor het oversluiten van de hypotheek. De kosten hiervoor liggen meestal tussen de € 2.500 en € 3.500.',\n\t\t\ttaxation: 'De taxatiekosten liggen vaak tussen de 0,1 en 0,2 procent van de marktwaarde van de woning.',\n\t\t\tnotary: 'De gemiddelde kosten voor de notaris zijn € 700. De werkelijke kosten kunnen afwijken, vraag daarom altijd een offerte aan bij verschillende notariskantoren.',\n\t\t\tnhg: 'De Nationale Hypotheek Garantie (NHG) is een garantie op hypotheken tot 450.000 euro. Sluit je een NHG-hypotheek af, dan leen je verantwoord en betaalbaar. Met een NHG-hypotheek loop je als woningeigenaar minder risico en profiteer je van een rentekorting.'\n\t\t}\n\t},\n\tstep4: {\n\t\tinterest: 'interest',\n\t\tlowestInterest: 'lowestInterest',\n\t\tcustomInterest: 'customInterest',\n\t\ttoolTips: {\n\t\t\tpreferredInterestAndPeriod: '

Kies de rentevastperiode en bijbehorende rente voor de {mortgageType} van {mortgageAmountStartFixedInterestRate}, afgesloten op {mortgageTermStart}.
De resterende lening is nu {residualDebt}, deze loopt nog {durationTermString} tot {endDate}.

'\n\t\t}\n\t}\n};\n\nexport const getPostData = (data: FormItem): RefinanceRequest => {\n\t//console.log(data)\n\tlet postData: RefinanceRequest = {\n\t\t// transferDate: \"2022-05-25T09:23:42.263Z\",\n\t\ttransferCost: 0,\n\t\tcost: {\n\t\t\tadvice: data[formItems.step3.costs.administration],\n\t\t\ttaxation: data[formItems.step3.costs.taxation],\n\t\t\tnotary: data[formItems.step3.costs.notary],\n\t\t\t},\n\t\twithNhg: data[formItems.step3.mortgageWithNhg],\n\t\tmortgagePart: []\n\t}\n\n\t//console.log(data[formItems.step2.mortgageParts])\n\tdata[formItems.step2.mortgageParts].forEach((mortgagePart: any, index: number) => {\n\n\t\tif (data[formItems.step1.countMortgageParts] >= (index + 1)) {\n\t\t\tlet part = {\n\t\t\t\tform: parseInt(mortgagePart[formItems.step2.mortgagePart.mortgageType]),\n\t\t\t\tterm: parseInt(mortgagePart[formItems.step2.mortgagePart.mortgageTermYears]) * 12,\n\t\t\t\tclosed: convertDateObject(convertToFirstOfTheNextMonth(mortgagePart[formItems.step2.mortgagePart.mortgageTermStart])),\n\t\t\t\tmortgageInterest: percentageToFloat(mortgagePart[formItems.step2.mortgagePart.currentInterestRate]),\n\t\t\t\tdurationRvp: parseInt(mortgagePart[formItems.step2.mortgagePart.interestRateFixedFor]),\n\t\t\t\tendRvp: convertDateObject(convertToFirstOfTheNextMonth(mortgagePart[formItems.step2.mortgagePart.interestRateFixedUntil])),\n\t\t\t\tloanBeginRvp: parseInt(mortgagePart[formItems.step2.mortgagePart.mortgageAmountStartFixedInterestRate]),\n\t\t\t\tpenaltyInterestKnown: mortgagePart[formItems.step2.mortgagePart.isThePenaltyAmountKnown] === \"true\",\n\t\t\t\tpenaltyInterestAmount: (mortgagePart[formItems.step2.mortgagePart.isThePenaltyAmountKnown] === \"true\") ? parseInt(mortgagePart[formItems.step2.mortgagePart.penaltyAmount]) : 0,\n\t\t\t\tpenaltyFreePercentage: (mortgagePart[formItems.step2.mortgagePart.isThePenaltyAmountKnown] === \"false\") ? percentageToFloat(mortgagePart[formItems.step2.mortgagePart.penaltyFreePayOffPercentage]) : 0,\n\t\t\t\tcomparativeInterest: (mortgagePart[formItems.step2.mortgagePart.isThePenaltyAmountKnown] === \"false\") ? percentageToFloat(mortgagePart[formItems.step2.mortgagePart.comparativeInterest]) : 0,\n\t\t\t\tnewInterest: (data[formItems.step4.interest][index][formItems.step4.customInterest]) ? percentageToFloat(data[formItems.step4.interest][index][formItems.step4.customInterest]) : data[formItems.step4.interest][index][formItems.step4.lowestInterest]\n\t\t\t};\n\n\t\t\tpostData.mortgagePart.push(part);\n\t\t}\n\t})\n\n\n\treturn postData;\n};\n\nexport function getPostDataRemainingMortgage(form: FormItem): RemainingMortgageRequest {\n\t//console.log(form);\n\tlet postData: RemainingMortgageRequest = {\n\t\treferenceDate: convertDateObject(new Date()),\n\t\tmarketValue: parseInt(form[formItems.step1.housePrice]),\n\t\tmortgagePart: []\n\t}\n\n\tform[formItems.step2.mortgageParts].forEach((mortgagePart: any, index: number) => {\n\t\t//console.log(index < form[formItems.step1.countMortgageParts], form[formItems.step1.countMortgageParts], index);\n\t\t//if (index < form[formItems.step1.countMortgageParts] ) {\n\t\t\tlet part = {\n\t\t\t\tform: parseInt(mortgagePart[formItems.step2.mortgagePart.mortgageType]),\n\t\t\t\tterm: parseInt(mortgagePart[formItems.step2.mortgagePart.mortgageTermYears]) * 12,\n\t\t\t\tclosed: convertDateObject(convertToFirstOfTheNextMonth(mortgagePart[formItems.step2.mortgagePart.mortgageTermStart])),\n\t\t\t\tmortgageInterest: percentageToFloat(mortgagePart[formItems.step2.mortgagePart.currentInterestRate]),\n\t\t\t\tdurationRvp: parseInt(mortgagePart[formItems.step2.mortgagePart.interestRateFixedFor]),\n\t\t\t\tloanBeginRvp: parseInt(mortgagePart[formItems.step2.mortgagePart.mortgageAmountStartFixedInterestRate]),\n\t\t\t\tendRvp: convertDateObject(convertToFirstOfTheNextMonth(mortgagePart[formItems.step2.mortgagePart.interestRateFixedUntil]))\n\t\t\t};\n\n\t\t\tpostData.mortgagePart.push(part);\n\t\t//}\n\t});\n\n\treturn postData;\n}\n\nexport const getDebugData = () => {\n\treturn {\n\t\t[formItems.step1.housePrice] : 250000,\n\t\t[formItems.step1.countMortgageParts] : 2,\n\t\t[formItems.step2.mortgageParts]: [\n\t\t\t{\n\t\t\t\t[formItems.step2.mortgagePart.mortgageType]: 9, // 4 - lin, 9 - ann, 6 - afl\n\t\t\t\t[formItems.step2.mortgagePart.mortgageTermYears]: 30,\n\t\t\t\t[formItems.step2.mortgagePart.mortgageTermStart]: '2016-04-01',\n\t\t\t\t[formItems.step2.mortgagePart.currentInterestRate]: '2,1',\n\t\t\t\t[formItems.step2.mortgagePart.interestRateFixedFor]: 10,\n\t\t\t\t[formItems.step2.mortgagePart.interestRateFixedUntil]: '2026-04-01',\n\t\t\t\t[formItems.step2.mortgagePart.mortgageAmountStartFixedInterestRate]: 126000,\n\t\t\t\t//[formItems.step2.mortgagePart.mortgageAmountRemaining]: 280000,\n\t\t\t\t[formItems.step2.mortgagePart.isThePenaltyAmountKnown]: \"true\",\n\t\t\t\t[formItems.step2.mortgagePart.penaltyAmount]: 10000,\n\t\t\t\t[formItems.step2.mortgagePart.newInterest]: '1,85', // var, 5, 10\n\t\t\t\t[formItems.step2.mortgagePart.penaltyFreePayOffPercentage]: '10',\n\t\t\t\t[formItems.step2.mortgagePart.comparativeInterest]: '1,8',\n\t\t\t},\n\t\t\t{\n\t\t\t\t[formItems.step2.mortgagePart.mortgageType]: 9, // 4 - lin, 9 - ann, 6 - afl\n\t\t\t\t[formItems.step2.mortgagePart.mortgageTermYears]: 30,\n\t\t\t\t[formItems.step2.mortgagePart.mortgageTermStart]: '01-04-2016',\n\t\t\t\t[formItems.step2.mortgagePart.currentInterestRate]: '2,1',\n\t\t\t\t[formItems.step2.mortgagePart.interestRateFixedFor]: 10,\n\t\t\t\t[formItems.step2.mortgagePart.interestRateFixedUntil]: '1-04-2026',\n\t\t\t\t[formItems.step2.mortgagePart.mortgageAmountStartFixedInterestRate]: 126000,\n\t\t\t\t//[formItems.step2.mortgagePart.mortgageAmountRemaining]: 280000,\n\t\t\t\t[formItems.step2.mortgagePart.isThePenaltyAmountKnown]: \"true\",\n\t\t\t\t[formItems.step2.mortgagePart.penaltyAmount]: 100000,\n\t\t\t\t[formItems.step2.mortgagePart.newInterest]: '1,85', // var, 5, 10\n\t\t\t\t[formItems.step2.mortgagePart.penaltyFreePayOffPercentage]: '10',\n\t\t\t\t[formItems.step2.mortgagePart.comparativeInterest]: '1,8',\n\t\t\t},\n\t\t\t/*{\n\t\t\t\t[formItems.step2.mortgagePart.mortgageType]: 9, // lin, ann, afl\n\t\t\t\t[formItems.step2.mortgagePart.mortgageTermYears]: 30,\n\t\t\t\t[formItems.step2.mortgagePart.mortgageTermStart]: '01-05-2005',\n\t\t\t\t[formItems.step2.mortgagePart.currentInterestRate]: 2.7,\n\t\t\t\t[formItems.step2.mortgagePart.interestRateFixedFor]: 10,\n\t\t\t\t[formItems.step2.mortgagePart.interestRateFixedUntil]: '01-05-2028',\n\t\t\t\t[formItems.step2.mortgagePart.mortgageAmountStartFixedInterestRate]: 50000,\n\t\t\t\t//[formItems.step2.mortgagePart.mortgageAmountRemaining]: 30000,\n\t\t\t\t[formItems.step2.mortgagePart.isThePenaltyAmountKnown]: false,\n\t\t\t\t[formItems.step2.mortgagePart.penaltyFreePayOffPercentage]: 15,\n\t\t\t\t[formItems.step2.mortgagePart.comparativeInterest]: 3.4,\n\t\t\t\t[formItems.step2.mortgagePart.newInterest]: 2.4, // var 5, 10, 15\n\t\t\t},*/\n\t\t],\n\t\t[formItems.step3.costs.administration]: 2990,\n\t\t[formItems.step3.costs.taxation]: 495,\n\t\t[formItems.step3.costs.notary]: 700,\n\t\t[formItems.step3.mortgageWithNhg]: false\n\t}\n}\n","import React, { useEffect, useState } from 'react';\nimport { API } from '../../services';\nimport { NhgResponse } from '../../models/NhgResponse';\nimport { RemainingMortgageResponse } from '../../models/RemainingMortgageResponse';\nimport { RefinanceResponse } from '../../models/RefinanceReponse';\nimport { getDebugData } from '../../components/features/RefinanceStepper/formItems';\n\nexport type FormItem = { [key: string]: any };\n\ninterface FormContextProps {\n\tform: FormItem;\n\tisLoading: boolean;\n\tdata: RefinanceResponse | null;\n\tnhg: NhgResponse | null;\n\tremainingMortgage: RemainingMortgageResponse | null;\n\tupdateForm: (items: FormItem) => void;\n\tsetRemainingMortgage: (data: RemainingMortgageResponse) => void;\n\tsetIsLoading: (state: boolean) => void;\n\tupdateData: (data: RefinanceResponse | null) => void;\n}\n\nexport const FormContext = React.createContext({\n\tform: {},\n\tnhg: null,\n\tremainingMortgage: null,\n\tisLoading: false,\n\tdata: null,\n\tupdateForm: (items: FormItem) => {},\n\tsetRemainingMortgage: (data: RemainingMortgageResponse | null) => {},\n\tsetIsLoading: (state: boolean) => {},\n\tupdateData: (data: RefinanceResponse | null) => null,\n});\n\nexport const FormProvider: React.FC = ({children}) => {\n\n\tconst [form, setForm] = useState({});\n\tconst [nhg, setNhg] = useState(null);\n\tconst [remainingMortgage, setRemainingMortgage] = useState(null);\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [data, setData] = useState(null);\n\n\t// debug\n\tuseEffect(() => {\n\t\tupdateForm(getDebugData())\n\t\tAPI.get('nhg').then((res) => setNhg(res))\n\t\t//API_MOCK.get('result.json').then((res) => setData(res))\n\t}, [setNhg])\n\n\tfunction updateForm(items: FormItem) {\n\n\t\tsetForm({\n\t\t\t...form,\n\t\t\t...items,\n\t\t});\n\n\t\t//console.log(form, items);\n\t}\n\n\tfunction updateData(info: RefinanceResponse | null) {\n\t\t(info) ? setData({...info}) : setData(null)\n\t}\n\n\treturn (\n\t\t\n\t\t\t{children}\n\t\t\n\t);\n};\n","interface RequestParams {\n\t[key: string]: string\n}\n\nexport const mainMediaMobile = \"(max-width: 1024px)\";\n\nexport const parseSearchQuery = (searchString: string): RequestParams => {\n\tconst result: RequestParams = {};\n\tconst entriesIterator = new URLSearchParams(searchString).entries();\n\tconst entries = Array.from(entriesIterator);\n\n\tentries.forEach((param) => {\n\t\t\tresult[param[0]] = param[1];\n\t\t}\n\t);\n\n\treturn result;\n};\n\n\nexport const scrollToTopCalculator = (extraCheck: boolean = true) => {\n\n\tconst yOffset = -200;\n\tconst element = document.querySelector('.refinance-calculator');\n\tif (element && extraCheck) {\n\t\tconst y = element.getBoundingClientRect().top + window.pageYOffset + yOffset;\n\t\twindow.scrollTo({top: y, behavior: 'smooth'});\n\t}\n}\n","import React, { FunctionComponent, useEffect, Fragment, useContext } from 'react';\nimport { ArrowDown, ArrowLongDown, Check, Stripe } from '../../../icons/components';\nimport classNames from '../../../utils/classnames';\nimport { useStepper } from '../../../utils/hooks';\n//import useMediaQuery from '../../../utils/hooks/use-media';\nimport { Button } from '../Button';\nimport { FormContext } from '../../../store/refinance/RefinanceContext';\nimport useMediaQuery from '../../../utils/hooks/use-media';\nimport { mainMediaMobile } from '../../../utils/general';\n\ninterface StepperStep {\n id: number;\n}\n\n\n\nexport const StepperStep: FunctionComponent = ({ children, id }) => {\n const { steps } = useStepper();\n const { isActive, isTouched, isValid } = steps[id];\n const classes = classNames('stepper__step', {\n 'stepper__step--is-active': isActive,\n 'stepper__step--is-valid': isValid,\n 'stepper__step--is-touched': isTouched,\n });\n\n return
{children}
;\n};\n\nexport const StepperContent: FunctionComponent = ({ children }) => (\n
{children}
\n);\n\nexport const StepperHeader: FunctionComponent<{\n id: number;\n title: string;\n completedText?: string;\n}> = ({ id, title, completedText }) => {\n const { steps } = useStepper();\n const { isActive, isTouched, isValid } = steps[id];\n const { setStepActive } = useStepper();\n\t\tconst mediaMatches = useMediaQuery(mainMediaMobile);\n return (\n\t\t\t {\n\t\t\t\t\tif (!mediaMatches) {\n\t\t\t\t\t\tsetStepActive(id, !isActive);\n\t\t\t\t\t}\n\t\t\t\t}}>\n\t\t\t\t
\n \n \n \n\t\t\t\t\t{title}\n\t\t\t\t
\n\n\t\t\t\t
\n\t\t\t\t\t{completedText && isTouched && isValid && (\n\t\t\t\t\t\t{completedText}\n\t\t\t\t\t)}\n\n\t\t\t\t\t{(isActive || isTouched || isValid) && (\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t{!isActive && }\n\t\t\t\t\t\t\t{isActive && }\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t
\n\t\t\t\n );\n};\n\nexport const StepperSubmit: FunctionComponent<{\n isValidated?: boolean;\n id: number;\n variant?: 'primary';\n isLastStep?: boolean;\n isLoading?: boolean;\n onStepChange?: () => void;\n}> = ({ isValidated, id, variant, isLastStep, isLoading, onStepChange }) => {\n const { setCurrentStep, setStepActive, setStepValid } = useStepper();\n\n function setNextStep() {\n setStepValid(id, true);\n if (!isLastStep) setCurrentStep(id + 1);\n setStepActive(id, false);\n if (onStepChange) onStepChange();\n }\n\n return (\n \n {variant === 'primary' && (\n
\n \n
\n )}\n {!variant && (\n
\n\t\t\t\t\t\t\t\t\t\tGa verder\n setTimeout(() => setNextStep()) }>\n \n \n
\n )}\n
\n );\n};\n\nexport const Stepper: FunctionComponent<{\n defaultUrl: string;\n previousButtonTexts: string[];\n defaultPreviousText: string;\n activeStep?: number;\n}> = ({ children, defaultUrl, defaultPreviousText, previousButtonTexts, activeStep }) => {\n const { setSteps, steps, currentStep, setCurrentStep, setStepActive } = useStepper();\n //const isScreenTabletAndLower = useMediaQuery('(max-width: 63.96875em)');\n\t\tconst formContext = useContext(FormContext);\n const hasCurrentStep = currentStep && currentStep !== 0;\n\n function handleBackClick() {\n if (currentStep && currentStep !== 0) {\n const id = currentStep - 1;\n setStepActive(currentStep, false);\n setCurrentStep(id);\n\t\t\t\t\t\tformContext.updateData(null)\n } else {\n window.location.href = defaultUrl;\n }\n }\n\n useEffect(() => {\n const stepperSteps = React.Children.toArray(children).map((step: any) => {\n return {\n ...step.props,\n isValid: false,\n isActive: activeStep ? activeStep === step.props.id : currentStep === step.props.id,\n isTouched: activeStep\n ? activeStep === step.props.id\n : currentStep === step.props.id,\n };\n });\n setSteps(stepperSteps);\n }, []); // eslint-disable-line\n\n return (\n
\n
\n {steps.length > 0 &&\n steps.map((step, key) => (\n \n ))}\n
\n
\n\t\t\t\t\t\t\t{(hasCurrentStep && currentStep) ?\n : null\n\t\t\t\t\t\t\t}\n {steps.length > 0 && children}\n
\n
\n );\n};\n","import { useLayoutEffect, useState } from 'react';\n\nexport default function useMediaQuery(mediaQuery: string) {\n const isSsr = typeof window === 'undefined';\n\n const [matches, setMatches] = useState(() =>\n isSsr ? false : window.matchMedia(mediaQuery).matches,\n );\n useLayoutEffect(() => {\n if (isSsr) {\n return;\n }\n const mediaQueryList = window.matchMedia(mediaQuery);\n const listener = (e: any) => setMatches(e.matches);\n mediaQueryList.addListener(listener);\n return () => mediaQueryList.removeListener(listener);\n }, [isSsr, mediaQuery]);\n return matches;\n}\n","import React, { FunctionComponent } from 'react';\nimport { currencyToNumber } from '../../../utils/formatting';\n\ntype InputType = 'text' | 'percentage' | 'number' | 'currency' | 'date';\n\ninterface InputProps {\n label?: string;\n name: string;\n defaultValue?: any;\n id: string;\n placeholder?: string;\n register: any;\n validation?: any;\n hasError?: any;\n type?: InputType;\n}\n\nexport const Input: FunctionComponent = ({\n label,\n name,\n defaultValue,\n id,\n placeholder,\n register,\n validation,\n hasError,\n type = 'text',\n}) => {\n\tlet viewValue: string | number | undefined = defaultValue;\n\n\tfunction getType(type: InputType) {\n\t\tif (type === \"currency\" || type === \"percentage\") {\n\t\t\treturn \"text\";\n\t\t}\n\n\t\treturn type ? type : \"text\";\n\t}\n\n\tfunction keyDown($event: KeyboardEvent) {\n\n\t\t//const target: HTMLInputElement = $event.target as HTMLInputElement;\n\n\t\tif (type === 'currency') {\n\t\t\tconst invalidChars = [\"-\", \"+\", \"e\"];\n\t\t\tif (invalidChars.includes($event.key)) {\n\t\t\t\t$event.preventDefault();\n\t\t\t}\n\t\t}\n\n\t\tif (type === 'percentage') {\n\t\t\tconst validChars = [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\",\"8\", \"9\", \"0\", \",\", \"Backspace\", \"Tab\"];\n\t\t\tif (!validChars.includes($event.key)) {\n\t\t\t\t$event.preventDefault();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setType($event: any, type: string | undefined, action: string) {\n\t\tif (type === \"currency\") {\n\t\t\tif (action === \"blur\") {\n\t\t\t\tviewValue = $event.target.value as string\n\t\t\t} else {\n\t\t\t\tviewValue = currencyToNumber($event.target.value as string) as number | string;\n\t\t\t}\n\n\t\t\t$event.target.type = action === \"focus\" ? \"number\" : \"text\";\n\t\t\t$event.target.value = action === \"blur\" ? (viewValue) ? \"€ \" + viewValue.toString().replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1.') : null : viewValue;\n\t\t}\n\n\t\tif (type === \"percentage\") {\n\t\t\tviewValue = $event.target.value as string\n\t\t\t/*if (action === \"blur\") {\n\n\t\t\t} else {\n\t\t\t\tviewValue = percentageToNumber($event.target.value as string) as number | string;\n\t\t\t}*/\n\n\t\t\t//$event.target.type = action === \"focus\" ? \"number\" : \"text\";\n\t\t\t$event.target.value = action === \"blur\" ? (viewValue) ? `${viewValue}%` : null : viewValue.replace('%', '');\n\t\t}\n\n\t}\n return (\n\t\t\t
\n\t\t\t\t{label && (\n\t\t\t\t\t\t\n\t\t\t\t)}\n\n\t\t\t\t setType(e,type, 'focus')}\n\t\t\t\t\t\ttype={getType(type)}\n\t\t\t\t\t\tautoComplete={\"off\"}\n\t\t\t\t\t\tid={id}\n\t\t\t\t\t\tonKeyDown={keyDown}\n\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\tdefaultValue={defaultValue}\n\t\t\t\t\t\t{...register(name, {...validation ? validation : {}, ...{onBlur: (event:any) => setType(event,type, 'blur')}})}\n\t\t\t\t/>\n\t\t\t
\n );\n};\n","import React, { Fragment, FunctionComponent, useState } from 'react';\nimport classNames from '../../../utils/classnames';\nimport InfoIcon from '../../../icons/components/Info';\n\nexport const InputHolder: FunctionComponent<{ isCentered?: boolean, isFlexWrap?: boolean, tooltip?: string }> = ({\n children,\n isCentered,\n\t\tisFlexWrap,\n\t\ttooltip\n}) => {\n const classes = classNames('c-input-holder', {\n 'input-holder--centered': isCentered,\n\t\t\t\t'input-holder--flex-wrap': isFlexWrap || tooltip,\n });\n\t\tconst [showToolTip, setShowToolTip] = useState(false);\n\n return
\n\t\t\t{children}\n\t\t\t{tooltip && (\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t

setShowToolTip(!showToolTip)}>

\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t)}\n\t\t\t{showToolTip && tooltip && (\n\t\t\t\t
\n\t\t\t)}\n\n\t\t
;\n};\n\nexport const InputHolderItem: FunctionComponent<{ isSmall?: boolean, isFullWidth?: boolean, isFlexBasis?:boolean }> = ({\n children,\n isSmall,\n\t\tisFullWidth,\n\t\tisFlexBasis,\n}) => {\n return (\n
\n {children}\n
\n );\n};\n","import React from 'react';\n\nexport interface SelectOption {\n value: string | number;\n name: string | undefined;\n\t\tkey?: string;\n}\n\nexport interface SelectProps {\n label: string;\n id?: string;\n defaultOption?: string;\n options?: SelectOption[];\n name: string;\n value?: string;\n register: any;\n validation?: any;\n}\n\nexport const Select = ({\n label,\n id,\n defaultOption,\n options,\n name,\n register,\n validation,\n value = '',\n}: SelectProps) => {\n const hasValue = typeof value === 'string' && value !== '';\n return (\n
\n
\n \n
\n \n {defaultOption && !hasValue && (\n \n )}\n\n {options &&\n options.map((option) => (\n \n ))}\n \n\t\t\t\t\t\t\t\t\t{/*\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
\n\t\t\t\t\t\t\t\t\t*/}\n
\n
\n
\n );\n};\n","const { hostname } = window.location;\nconst api = { isLocal: hostname.indexOf('localhost') !== -1 }\n\nexport default api;\n","import environment from '../services/environment';\nimport { FormItem } from '../store/refinance/RefinanceContext';\nimport { parseDate } from './dates';\n\nexport const isNumber = (value: any) => !isNaN(Number(value));\nexport const isValidDate = (value: any) => {\n\t//if (/^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\\d{4}$/.test(value)) {\n\t\tif (parseDate(value) instanceof Date && !isNaN(parseDate(value).getTime())) {\n\t\t\treturn true;\n\t\t}\n\t//}\n\treturn false;\n}\n\nexport const getDefaultValue = (values: FormItem | undefined, key: string): any => {\n\tif (values && environment.isLocal) {\n\t\treturn values[key];\n\t}\n}\n\nexport const getMortgageForm = (mortgage: number, humanReadable?: boolean): string => {\n\tlet type = '';\n\tswitch (mortgage) {\n\t\tcase 4:\n\t\t\ttype = (!humanReadable) ? 'Annuiteitenhypotheek' : 'Annuïteitenhypotheek'\n\t\t\tbreak;\n\t\tcase 6:\n\t\t\ttype = (!humanReadable) ? 'Aflossingsvrije_hypotheek' : 'Aflossingsvrije hypotheek';\n\t\t\tbreak;\n\t\tcase 9:\n\t\t\ttype = (!humanReadable) ? 'Lineaire_hypotheek' : 'Lineaire hypotheek';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\ttype = 'Aflossingsvrije_hypotheek';\n\t\t\tbreak;\n\t}\n\n\treturn type;\n}\n\nexport const getMarketValuePercentage = (percentage: number | undefined, isNhg: boolean): number => {\n\tif (isNhg) return 0;\n\n\tif (percentage) {\n\t\tconst p = Math.round(percentage);\n\t\tif (p > 80) return 100;\n\t\tif (p > 60) return 80;\n\t\treturn 60;\n\t}\n\n\treturn 0;\n}\n\nexport const isWholeNumber = (value: number) => {\n\treturn value % 1 === 0\n}\n\n\nexport const isPercentage = (value: string) => {\n\treturn /(^100([.]0{1,2})?)$|(^\\d{1,2}([,]\\d{1,2})?)$/.test(value);\n}\n","import React, { FunctionComponent } from 'react';\n\ninterface TextProps {\n\t\tclassName?: string,\n as: 'h1' | 'h2' | 'h3' | 'p';\n}\nexport const Text: FunctionComponent = (props) => {\n const { as: Component, className, children } = props;\n return {children};\n};\n","import React, { FunctionComponent } from 'react';\n\ninterface RadioProps {\n label: string;\n name: string;\n checked?: boolean;\n defaultValue?: any;\n id: string;\n register: any;\n validation?: any;\n hasError?: boolean;\n}\n\nexport const Radio: FunctionComponent = ({\n id,\n name,\n checked = false,\n defaultValue,\n label,\n register,\n validation,\n hasError,\n}) => {\n return (\n
\n \n \n
\n );\n};\n","import React, { Fragment, FunctionComponent, useContext, useState } from 'react';\nimport { UseFormRegister } from 'react-hook-form/dist/types/form';\nimport { InputHolder, InputHolderItem } from '../../shared/InputHolder';\nimport { Input } from '../../shared/Input';\nimport { formItems } from '../RefinanceStepper/formItems';\nimport { FieldErrors } from 'react-hook-form/dist/types/errors';\nimport { Select } from '../../shared/Select';\nimport { getDefaultValue, isPercentage, isValidDate, isWholeNumber } from '../../../utils/validations';\nimport { Text } from '../../shared/Text';\nimport { Radio } from '../../shared/Radio';\nimport { convertDateObject, parseDate } from '../../../utils/dates';\nimport { addDays, addYears, isAfter, isBefore, subYears } from 'date-fns';\nimport { FormContext, FormItem } from '../../../store/refinance/RefinanceContext';\n\nexport const MortgagePart: FunctionComponent<{\n\tregister: UseFormRegister,\n\terrors: FieldErrors,\n\tpart: number,\n\tgetValues: any,\n\tsetError: any,\n\tclearErrors: any,\n\tvalues?: FormItem }> = ({register, errors, part, getValues, setError, clearErrors, values}) => {\n\tconst [rvpEndDateError, setRvpEndDateError] = useState('');\n\tconst [mortgageTermStartError, setMortgageTermStartError] = useState('');\n\tconst [showExtraFields, setShowExtraFields] = useState(\n\t\t(typeof getDefaultValue(values, formItems.step2.mortgagePart.isThePenaltyAmountKnown) === 'boolean')\n\t\t\t? getDefaultValue(values, formItems.step2.mortgagePart.isThePenaltyAmountKnown) === false : false);\n\n\tconst { form } = useContext(FormContext);\n\n\tfunction getFormName(name: string): string {\n\t\treturn `${formItems.step2.mortgageParts}.${part}.${name}`\n\t}\n\n\tfunction hasError(name: string) {\n\t\tif (typeof errors[formItems.step2.mortgageParts] !== 'undefined') {\n\t\t\tif (typeof errors[formItems.step2.mortgageParts][part] !== 'undefined') {\n\t\t\t\treturn errors[formItems.step2.mortgageParts][part][name];\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction fireError(errorMsg: string, type: 'MortgageTermStartDate' | 'RvpEndDate') {\n\t\t(type === 'MortgageTermStartDate') ? setMortgageTermStartError(errorMsg) : setRvpEndDateError(errorMsg);\n\t\tsetError(getFormName((type === 'MortgageTermStartDate') ? formItems.step2.mortgagePart.mortgageTermStart : formItems.step2.mortgagePart.interestRateFixedUntil));\n\t\treturn false;\n\t}\n\n\t/**\n\t * Validate mortgageTermStart\n\t * @param mortgageTermStart\n\t */\n\tfunction validateMortgageTermStartDate(mortgageTermStart: string) {\n\t\t// check if date is not valid\n\t\tif (!isValidDate(mortgageTermStart)) {\n\t\t\treturn fireError(`datum is niet correct`, 'MortgageTermStartDate');\n\t\t}\n\n\t\t// check if mortgage is already paid off -> 30, 15-05-1981\n\t\tconst mortgageTermYears = getValues(getFormName(formItems.step2.mortgagePart.mortgageTermYears));\n\t\tif (mortgageTermYears) {\n\t\t\tconst mortgageTermEndDate = addYears(parseDate(mortgageTermStart), mortgageTermYears);\n\t\t\tif (isBefore(mortgageTermEndDate, new Date())) {\n\t\t\t\treturn fireError(`de hypotheek is al afgelost op ${convertDateObject(new Date(), true)}`, 'MortgageTermStartDate');\n\t\t\t}\n\t\t}\n\n\t\t// check if mortgage start in the future -> 30, 15-05-2058\n\t\tif (isAfter(parseDate(mortgageTermStart), new Date())) {\n\t\t\tsetError(getFormName(formItems.step2.mortgagePart.mortgageTermStart))\n\t\t\treturn fireError(`de hypotheek loopt nog niet op ${convertDateObject(new Date(), true)}`, 'MortgageTermStartDate');\n\t\t}\n\n\t\tclearErrors(getFormName(formItems.step2.mortgagePart.mortgageTermStart))\n\t\treturn true;\n\t}\n\n\t/**\n\t * Validate validateRvpEndDate\n\t * @param interestRateFixedUntil\n\t */\n\tfunction validateRvpEndDate(interestRateFixedUntil: string) {\n\t\tconst mortgageTermStart: string = getValues(getFormName(formItems.step2.mortgagePart.mortgageTermStart));\n\t\tconst mortgageTermYears = getValues(getFormName(formItems.step2.mortgagePart.mortgageTermYears));\n\t\tconst interestRateFixedFor: number = parseInt(getValues(getFormName(formItems.step2.mortgagePart.interestRateFixedFor)));\n\n\t\t// check if is a valid date\n\t\tif (!isValidDate(interestRateFixedUntil)) {\n\t\t\treturn fireError(`datum is niet correct`, 'RvpEndDate');\n\t\t}\n\n\t\t// check that rvp has not already ended -> 30, 16-05-2002 // 10, 27-09-2018\n\t\tif (isBefore(parseDate(interestRateFixedUntil), new Date())) {\n\t\t\treturn fireError(`De rentevastperiode is al afgelopen`, 'RvpEndDate');\n\t\t}\n\n\t\t// check if the mortgage is already paid off -> 30, 16-05-2002 // 10, 27-09-2056\n\t\tif (mortgageTermStart && mortgageTermYears) {\n\t\t\tconst mortgageTermEndDate = addYears(parseDate(mortgageTermStart), mortgageTermYears);\n\t\t\tif (isBefore(mortgageTermEndDate, parseDate(interestRateFixedUntil))) {\n\t\t\t\treturn fireError(`De hypotheek is al afgelost op ${convertDateObject(mortgageTermEndDate, true)}`,'RvpEndDate');\n\t\t\t}\n\t\t}\n\n\t\t// check if the morgage has not started yet - > 30, 16-5-2022 // 10, 17-09-2028\n\t\tif (mortgageTermStart && interestRateFixedFor ) {\n\t\t\tconst interestRateFixedFrom = subYears(parseDate(interestRateFixedUntil), interestRateFixedFor);\n\t\t\tif (!isAfter(addDays(interestRateFixedFrom,1), parseDate(mortgageTermStart))) {\n\t\t\t\treturn fireError(`De hypotheek loopt nog niet op ${convertDateObject(interestRateFixedFrom, true)}`, 'RvpEndDate');\n\t\t\t}\n\t\t}\n\n\t\tif (interestRateFixedFor) {\n\t\t\tconst maxDate = addYears(new Date(), interestRateFixedFor);\n\t\t\tif (isAfter(parseDate(interestRateFixedUntil), maxDate)) {\n\t\t\t\treturn fireError(`De rentevastperiode ligt na ${convertDateObject(maxDate, true)}`, 'RvpEndDate');\n\t\t\t}\n\t\t}\n\n\t\tclearErrors(getFormName(formItems.step2.mortgagePart.interestRateFixedUntil))\n\t\treturn true;\n\t}\n\n\treturn (\n\t\t\n\t\t\t{form[formItems.step1.countMortgageParts] > 1 &&\n {`Hypotheekdeel ${part + 1}`}\n\t\t\t}\n\t\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t isPercentage(v)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{hasError(formItems.step2.mortgagePart.currentInterestRate) && (\n\t\t\t\t\t\tVul een geldige rente in\n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t isWholeNumber(v)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{hasError(formItems.step2.mortgagePart.mortgageTermYears) && (\n\t\t\t\t\t\tVul de looptijd in jaren\n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\t isValidDate(v),\n\t\t\t\t\t\t\t\t\tcorrectStartDate: (v: string) => validateMortgageTermStartDate(v)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t{hasError(formItems.step2.mortgagePart.mortgageTermStart) && (\n\t\t\t\t\t\t{mortgageTermStartError}\n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t isWholeNumber(v)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{hasError(formItems.step2.mortgagePart.interestRateFixedFor) && (\n\t\t\t\t\t\tVul de looptijd in jaren\n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t isValidDate(v),\n\t\t\t\t\t\t\t\tcorrectEndDate: (v: string) => validateRvpEndDate(v)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{hasError(formItems.step2.mortgagePart.interestRateFixedUntil) && (\n\t\t\t\t\t\t{rvpEndDateError}\n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{hasError(formItems.step2.mortgagePart.mortgageAmountStartFixedInterestRate) && (\n\t\t\t\t\t\tVul hoogte in van hypotheek(deel) bij start van de huidige rentevastperiode\n\t\t\t\t\t)}\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tsetShowExtraFields(e.currentTarget.value === 'false'),\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\n\t\t\t\n\t\t\t{!showExtraFields &&\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{hasError(formItems.step2.mortgagePart.penaltyAmount) && (\n\t\t\t\t\t\t\tVul hoogte in van boeterente\n\t\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t}\n\t\t\t{showExtraFields &&\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t isWholeNumber(v)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{hasError(formItems.step2.mortgagePart.penaltyFreePayOffPercentage) && (\n\t\t\t\t\t\t\tVul hoogte in van percentage kostenloos aflossen\n\t\t\t\t\t\t)}\n\t\t\t\t\t\n \n isPercentage(v)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n />\n\t\t\t\t\t\t{hasError(formItems.step2.mortgagePart.comparativeInterest) && (\n\t\t\t\t\t\t\tVul hoogte in van vergelijkingsrente\n\t\t\t\t\t\t)}\n \n\t\t\t\t\n\t\t\t}\n\t\t\t
\n\t\t
\n\t)\n}\n","import React, { Fragment, FunctionComponent, useContext, useEffect, useState } from 'react';\nimport { UseFormRegister } from 'react-hook-form/dist/types/form';\nimport { FieldErrors } from 'react-hook-form/dist/types/errors';\nimport { InputHolder, InputHolderItem } from '../../shared/InputHolder';\nimport { formItems } from '../RefinanceStepper/formItems';\nimport { Select, SelectOption } from '../../shared/Select';\nimport { Input } from '../../shared/Input';\nimport { API } from '../../../services';\nimport { InterestResponse } from '../../../models/InterestResponse';\nimport { getMarketValuePercentage, getMortgageForm, isPercentage } from '../../../utils/validations';\nimport { FormContext } from '../../../store/refinance/RefinanceContext';\nimport { RemainingMortgagePart } from '../../../models/RemainingMortgageResponse';\nimport { floatToPercentage, numberToCurrency } from '../../../utils/formatting';\nimport { StepperContext } from '../../../store/stepper/StepperContext';\nimport { convertDateObject } from '../../../utils/dates';\nimport { parseISO } from 'date-fns';\n\nexport const MortgagePartInterest: FunctionComponent<{\n\tregister: UseFormRegister, errors: FieldErrors, part: number, values?: any, setValue: any }> = ({register, errors, part, values, setValue}) => {\n\n\tconst [showExtraField, setShowExtraField] = useState(false);\n\tconst [remainingMortgagePart, setRemainingMortgagePart] = useState(null);//{ residualDebt: 0, endDate: '', durationTermString: '', durationTerm: 0 });\n\tconst [interests, setInterests] = useState([]);\n\tconst { form, remainingMortgage, setIsLoading } = useContext(FormContext);\n\tconst { state } = useContext(StepperContext);\n\tconst { steps } = state;\n\n\tuseEffect(() => {\n\t\tif (remainingMortgage && !steps[0].isActive && !steps[1].isActive && !steps[2].isActive && steps[3].isActive) {\n\t\t\tsetIsLoading(true);\n\t\t\tsetRemainingMortgagePart(remainingMortgage.mortgageParts[part])\n\t\t\tAPI.get(`interestrates/getlowestinterestrates?RenteBasis=${getMarketValuePercentage(remainingMortgage?.marketValuePercentage, form[formItems.step3.mortgageWithNhg])}&HypotheekVorm=${getMortgageForm(parseInt(values[formItems.step2.mortgagePart.mortgageType]))}&IsNieuwbouw=false`)\n\t\t\t\t.then((res) => {\n\n\t\t\t\t\tconst remainingYears = remainingMortgage.mortgageParts[part].durationTerm / 12;\n\t\t\t\t\tconst resFiltered = res.filter((r, index) => {\n\t\t\t\t\t\treturn r.period < Math.ceil(remainingYears)\n\t\t\t\t\t});\n\n\t\t\t\t\t// find index of last item of the resFiltered\n\t\t\t\t\tconst indexOfLastItem = res.indexOf(resFiltered[resFiltered.length - 1]);\n\t\t\t\t\t// make sure the last item if the resFiltered was not the last item in the res object\n\t\t\t\t\tif (res.length > indexOfLastItem + 1) {\n\t\t\t\t\t\tresFiltered.push(res[indexOfLastItem + 1])\n\t\t\t\t\t}\n\n\t\t\t\t\tlet interests: SelectOption[] = [];\n\n\t\t\t\t\tresFiltered.forEach((r, index) => interests.push({\n\t\t\t\t\t\tname: `${floatToPercentage(r.interestRate)}% - ${r.period > 0 ? `${r.period} jaar vast` : `variabele rente` }`,\n\t\t\t\t\t\tvalue: r.interestRate,\n\t\t\t\t\t\tkey: `${part}-${index}-${r.interestRate}`\n\t\t\t\t\t}));\n\n\t\t\t\t\tinterests.push({\n\t\t\t\t\t\tname: 'andere rente',\n\t\t\t\t\t\tvalue: 'OTHER_INTEREST',\n\t\t\t\t\t});\n\n\t\t\t\t\tsetInterests(interests);\n\t\t\t\t\tsetIsLoading(false);\n\t\t\t})\n\t\t}\n\t}, [remainingMortgage, steps, part, form, values, setIsLoading])\n\n\tuseEffect(() => {\n\t\tif (interests.length) {\n\t\t\tsetValue(`${formItems.step4.interest}.${part}.${formItems.step4.lowestInterest}`, interests[0].value, {shouldDirty: true, shouldValidate: true})\n\t\t}\n\t}, [interests, setValue, part])\n\n\tfunction getFormName(name: string): string {\n\t\treturn `${formItems.step4.interest}.${part}.${name}`\n\t}\n\n\tfunction hasError(name: string) {\n\t\tif (typeof errors[`mortgage`] !== 'undefined') {\n\t\t\treturn errors[`mortgage`][part][name];\n\t\t}\n\t}\n\n\tconst getToolTip = (mortgageType: string, mortgageAmountStartFixedInterestRate: number, mortgageTermStart: string, residualDebt: number, durationTermString: string, endDate: string) => {\n\t\treturn formItems.step4.toolTips.preferredInterestAndPeriod\n\t\t\t.replace(/{mortgageType}/g, mortgageType)\n\t\t\t.replace(/{mortgageAmountStartFixedInterestRate}/g, numberToCurrency(mortgageAmountStartFixedInterestRate, true))\n\t\t\t.replace(/{mortgageTermStart}/g, mortgageTermStart)\n\t\t\t.replace(/{residualDebt}/g, numberToCurrency(residualDebt, true))\n\t\t\t.replace(/{durationTermString}/g, durationTermString)\n\t\t\t.replace(/{endDate}/g, convertDateObject(parseISO(endDate), true))\n\t}\n\treturn (\n\t\t\n\t\t\t{remainingMortgagePart &&\n \n \n \n\t\t\t\t\t\t\tsetShowExtraField(e.currentTarget.value === 'OTHER_INTEREST'),\n\t\t\t\t\t}}\n options={interests}\n />\n \n \n\t\t\t}\n\t\t\t{showExtraField &&\n \n \n isPercentage(v)\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n />\n\t\t\t\t\t{errors[formItems.step4.customInterest] && (\n\t\t\t\t\t\tVul de looptijd in jaren\n\t\t\t\t\t)}\n \n \n\t\t\t}\n\t\t\n\t)\n}\n","import React, { FunctionComponent } from 'react';\nimport { Stepper, StepperStep } from '../../shared/Stepper';\nimport { Step1, Step2 } from './steps';\nimport { Step3 } from './steps/Step-3';\nimport { Step4 } from './steps/Step-4';\n\ninterface StepsArray {\n\tcomponent: FunctionComponent<{ id: number }>;\n}\n\nlet steps: StepsArray[] = [\n\t{\n\t\tcomponent: Step1,\n\t},\n\t{\n\t\tcomponent: Step2,\n\t},\n\t{\n\t\tcomponent: Step3,\n\t},\n\t{\n\t\tcomponent: Step4,\n\t},\n];\n\n\nexport const RefinanceStepper = () => {\n\treturn (\n\t\t\n\t\t\t{steps &&\n\t\t\t\tsteps.map((step, key) => (\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t))}\n\n\t\t\n\t);\n};\n","import React, { Fragment, FunctionComponent, useContext, useEffect, useState } from 'react';\nimport { StepperContent, StepperHeader, StepperSubmit } from '../../../shared/Stepper';\nimport { useForm } from 'react-hook-form';\nimport { Input } from '../../../shared/Input';\nimport { formItems } from '../formItems';\nimport { InputHolder, InputHolderItem } from '../../../shared/InputHolder';\nimport { FormContext } from '../../../../store/refinance/RefinanceContext';\nimport { currencyToNumber, numberToCurrency } from '../../../../utils/formatting';\nimport { Select } from '../../../shared/Select';\nimport { getDefaultValue } from '../../../../utils/validations';\nimport { useStepper } from '../../../../utils';\nimport { parseSearchQuery, scrollToTopCalculator } from '../../../../utils/general';\n\nexport const Step1: FunctionComponent<{ id: number }> = ({id}) => {\n\n\n\tconst {\n\t\tregister,\n\t\thandleSubmit,\n\t\tformState: {errors, isValid},\n\t} = useForm({mode: 'onChange', defaultValues: {\n\t\t[formItems.step1.housePrice] : numberToCurrency(parseSearchQuery(window.location.search)[`rt-marktwaarde`] as unknown as number, true),\n\t\t}});\n\n\tconst [completedText, setCompletedText] = useState('');\n\tconst { updateForm, form } = useContext(FormContext);\n\tconst {setStepTouched, setStepValid, setStepActive } = useStepper();\n\tconst onSubmit = (data: any) => {\n\t\tdata[formItems.step1.housePrice] = currencyToNumber(data[formItems.step1.housePrice]);\n\t\tdata[formItems.step1.countMortgageParts] = parseInt(data[formItems.step1.countMortgageParts]);\n\t\tupdateForm(data);\n\t\tsetCompletedText(numberToCurrency(parseInt(data[formItems.step1.housePrice]), true));\n\t\tsetStepTouched(2, false);\n\t\tsetStepValid(2, false);\n\t\tsetStepActive(2, false);\n\t\tsetStepTouched(3, false);\n\t\tsetStepValid(3, false);\n\t\tsetStepActive(3, false);\n\t\tscrollToTopCalculator();\n\t};\n\n\tuseEffect(() => {\n\t\tsetTimeout(() => {\n\t\t\tscrollToTopCalculator(typeof parseSearchQuery(window.location.search)[`rt-marktwaarde`] !== 'undefined');\n\t\t}, 500)\n\t\t//scrollTo();\n\t}, [])\n\n\treturn (\n\t\t\n\t\t\t\n\n\t\t\t\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t{errors[formItems.step1.housePrice] && (\n\t\t\t\t\t\t\t\tVul hier de geschatte huidige marktwaarde van de woning in. Weet je deze niet? Bereken dan hier je woningwaarde.\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t
\n\t);\n};\n","import React, { Fragment, FunctionComponent, useContext, useState } from 'react';\nimport { StepperContent, StepperHeader, StepperSubmit } from '../../../shared/Stepper';\nimport { FormContext } from '../../../../store/refinance/RefinanceContext';\nimport { formItems, getPostDataRemainingMortgage } from '../formItems';\nimport { useForm } from 'react-hook-form';\nimport { MortgagePart } from '../../MortgagePart';\nimport { API } from '../../../../services';\nimport { RemainingMortgageResponse } from '../../../../models/RemainingMortgageResponse';\nimport { numberToCurrency } from '../../../../utils/formatting';\nimport { scrollToTopCalculator } from '../../../../utils/general';\n\nexport const Step2: FunctionComponent<{ id: number }> = ({id}) => {\n\tconst {\n\t\tregister,\n\t\thandleSubmit,\n\t\tgetValues,\n\t\tsetError,\n\t\tclearErrors,\n\t\tformState: {errors, isValid},\n\t} = useForm({\n\t\tmode: 'onBlur',\n\t\tdefaultValues: {\n\t\t\t//[formItems.salesCosts] : '',\n\t\t},\n\t\tshouldUnregister: true\n\t});\n\n\tconst [completedText, setCompletedText] = useState('');\n\tconst { updateForm, form, setRemainingMortgage, setIsLoading} = useContext(FormContext);\n\n\tconst onSubmit = (data: any) => {\n\n\t\tconst formData = {\n\t\t\t...form,\n\t\t\t...data,\n\t\t};\n\n\t\tsetIsLoading(true)\n\t\tAPI.post('calculator/calculateremainingmortgage', getPostDataRemainingMortgage(formData))\n\t\t\t.then((res) => {\n\t\t\t\tsetRemainingMortgage(res);\n\t\t\t\tsetCompletedText(numberToCurrency(res.totalResidualDebt, true));\n\t\t\t\tupdateForm(data);\n\t\t\t\tsetIsLoading(false);\n\t\t\t\tscrollToTopCalculator();\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tsetIsLoading(false);\n\t\t\t});\n\t};\n\n\tconst getValuesFormMortgagePart = (part: number) => {\n\t\tif (typeof form[formItems.step2.mortgageParts] !== 'undefined') {\n\t\t\treturn form[formItems.step2.mortgageParts][part]\n\t\t}\n\t}\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t
\n\t\t\t\t\t{[...Array(form[formItems.step1.countMortgageParts])].map((x, i) =>\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t
\n\t);\n};\n","import React, { Fragment, FunctionComponent, useContext, useEffect, useState } from 'react';\n\nimport { Text } from '../../../shared/Text';\nimport { StepperContent, StepperHeader, StepperSubmit } from '../../../shared/Stepper';\nimport { useForm } from 'react-hook-form';\nimport { Input } from '../../../shared/Input';\nimport { formItems } from '../formItems';\nimport { InputHolder, InputHolderItem } from '../../../shared/InputHolder';\nimport { FormContext } from '../../../../store/refinance/RefinanceContext';\nimport { currencyToNumber, numberToCurrency } from '../../../../utils/formatting';\nimport { Radio } from '../../../shared/Radio';\nimport { scrollToTopCalculator } from '../../../../utils/general';\n\nexport const Step3: FunctionComponent<{ id: number }> = ({id}) => {\n\tconst {\n\t\tregister,\n\t\thandleSubmit,\n\t\tformState: {errors, isValid},\n\t} = useForm({mode: 'onChange'});\n\n\tconst [completedText, setCompletedText] = useState('');\n\tconst [isNhg, setNhg] = useState(false);\n\tconst { updateForm, form, nhg, remainingMortgage } = useContext(FormContext);\n\n\tuseEffect(() => {\n\t\tif (nhg && remainingMortgage) {\n\t\t\tsetNhg(nhg?.existingBuilding > remainingMortgage.totalResidualDebt);\n\t\t}\n\t}, [nhg, remainingMortgage])\n\n\n\tconst onSubmit = (data: any) => {\n\n\t\tdata[formItems.step3.costs.administration] = currencyToNumber(data[formItems.step3.costs.administration]);\n\t\tdata[formItems.step3.costs.taxation] = currencyToNumber(data[formItems.step3.costs.taxation]);\n\t\tdata[formItems.step3.costs.notary] = currencyToNumber(data[formItems.step3.costs.notary]);\n\t\tdata[formItems.step3.mortgageWithNhg] = (isNhg) ? data[formItems.step3.mortgageWithNhg] === \"true\" : false;\n\n\t\tsetCompletedText(numberToCurrency((data[formItems.step3.costs.administration] + data[formItems.step3.costs.taxation] + data[formItems.step3.costs.notary]), true));\n\t\tupdateForm(data);\n\t\tscrollToTopCalculator();\n\t};\n\n\treturn (\n\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t{`De resterende hypotheek is nu ${numberToCurrency(remainingMortgage?.totalResidualDebt, true)}.`}\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{errors[formItems.step3.costs.administration] && (\n\t\t\t\t\t\t\t\t\tVul de advies- en bemiddelingskosten in\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{errors[formItems.step3.costs.taxation] && (\n\t\t\t\t\t\t\t\t\tVul de taxatiekosten in\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{errors[formItems.step3.costs.notary] && (\n\t\t\t\t\t\t\t\t\tVul de notariskosten in\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{isNhg &&\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t
\n\t);\n};\n","import React, { Fragment, FunctionComponent, useContext, useState } from 'react';\nimport { Text } from '../../../shared/Text';\nimport { StepperContent, StepperHeader, StepperSubmit } from '../../../shared/Stepper';\nimport { useForm } from 'react-hook-form';\nimport { formItems, getPostData } from '../formItems';\nimport { FormContext } from '../../../../store/refinance/RefinanceContext';\nimport { API } from '../../../../services';\nimport { RefinanceResponse } from '../../../../models/RefinanceReponse';\nimport { MortgagePartInterest } from '../../MortgagePartInterest';\nimport { scrollToTopCalculator } from '../../../../utils/general';\n\nexport const Step4: FunctionComponent<{ id: number }> = ({id}) => {\n\tconst {\n\t\tregister,\n\t\thandleSubmit,\n\t\tsetValue,\n\t\tformState: {errors, isValid},\n\t} = useForm({mode: 'onChange'});\n\n\tconst [completedText, setCompletedText] = useState('');\n\tconst {updateForm, updateData, form, setIsLoading} = useContext(FormContext);\n\n\tconst onSubmit = (data: any) => {\n\n\t\tupdateForm(data);\n\t\tsetCompletedText('rente gekozen');\n\t\tsetIsLoading(true);\n\n\t\tconst formData = {\n\t\t\t...form,\n\t\t\t...data,\n\t\t};\n\n\n\t\t//API.post('calculator/calculatemortgagetransfer', getPostData(formData))\n\t\tAPI.post('calculator/calculatemortgagetransfer', getPostData(formData))\n\t\t\t.then((res) => {\n\t\t\t\tupdateData(res);\n\t\t\t\tsetIsLoading(false);\n\t\t\t\tscrollToTopCalculator();\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\t//console.log(error);\n\t\t\t\tsetIsLoading(false);\n\t\t\t});\n\t\t// format form data to match API\n\t\t// do api call etcetc\n\t};\n\n\n\tconst getValuesFormMortgagePart = (part: number) => {\n\t\tif (typeof form[formItems.step2.mortgageParts] !== 'undefined') {\n\t\t\treturn form[formItems.step2.mortgageParts][part]\n\t\t}\n\t}\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\tJe kunt hieronder een keuze maken voor een nieuwe rente en rentevaste periode\n\t\t\t\t
\n\t\t\t\t\t{[...Array(form[formItems.step1.countMortgageParts])].map((x, i) =>\n\t\t\t\t\t\t\n\t\t\t\t\t)}\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t
\n\t);\n};\n","import React from 'react';\nimport { assetPrefix } from '../../../utils/assetPrefix';\n\nimport { Text } from '../../shared/Text';\n\nexport const RefinanceCta = ({ isMobile }: { isMobile?: boolean }) => {\n\n const { alt, src } = getImageProps();\n\n return (\n \n \n\t\t\t\t\t\t\tBereken wat je per maand kunt besparen\n \n\t\t\t\t\t\t\n\t\t\t\t\t\t\tDeze berekening is een hulpmiddel om inzicht te geven in de mogelijkheden en geeft een eerste indicatie of oversluiten voordelig zou kunnen zijn. Voor een volledig beeld of oversluiten voor jou mogelijk is en lonend kan zijn, adviseren we om altijd een gesprek met jouw hypotheekadviseur in te plannen.\n {alt}\n \n );\n};\n\nfunction getImageProps(): { src: string; alt: string } {\n\treturn {\n\t\tsrc: '/assets/img.png',\n\t\talt: 'Overwaarde huis berekenen',\n\t};\n}\n","export const assetPrefix = process.env.PUBLIC_URL;\n","import React, { FunctionComponent, Fragment, useContext } from 'react';\nimport { FormContext } from '../../../store/refinance/RefinanceContext';\nimport { useStepper } from '../../../utils';\nimport { numberToCurrency } from '../../../utils/formatting';\nimport { Button } from '../../shared/Button';\nimport { Text } from '../../shared/Text';\nimport { ArrowLongDown } from '../../../icons/components';\nimport { RefinanceResponse } from '../../../models/RefinanceReponse';\nimport { getFormattedDuration } from '../../../utils/dates';\n\nexport const RefinanceResult: FunctionComponent<{ data: RefinanceResponse }> = ({data}) => {\n\tconst {setCurrentStep, setStepActive} = useStepper();\n\n\tconst formContext = useContext(FormContext);\n\n\tconst setFirstStepActive = () => {\n\t\tformContext.updateData(null)\n\t\tsetCurrentStep(3);\n\t\tsetStepActive(3, true);\n\t};\n\n\tconst explanation =\n\t\tDe bruto maandlasten waren {numberToCurrency(data.monthlyPayment.old, true)} en worden na oversluiten {numberToCurrency(data.monthlyPayment.new, true)}. De totale kosten voor het oversluiten zijn {numberToCurrency(data.cost.total, true)}, bestaande uit {numberToCurrency(data.cost.penaltyInterest, true)} vergoeding voor het vervroegd aflossen en {numberToCurrency(data.cost.transfer, true)} oversluitkosten.\n\n\tconst result =\n\t\tDe maandlasten {(data.monthlyPayment.benefit <= 0) ? 'stijgen' : 'dalen'} met\n\treturn (\n\t\t\n\t\t\t{data &&\n\t\t\t
\n\t\t\t\t\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t{result}\n\t\t\t\t\t\t\t{numberToCurrency(Math.abs(data.monthlyPayment.benefit), true)}\n\t\t\t\t\t\t\t

{explanation}

\n\t\t\t\t\t\t\t{(data.cost.paidOffPeriod === -1) ? `Terugverdienen van de totale kosten is` : `De totale kosten worden terugverdiend in`}\n\t\t\t\t\t\t\t{(data.cost.paidOffPeriod === -1) ? `niet haalbaar` : getFormattedDuration(data.cost.paidOffPeriod)}\n\t\t\t\t\t\t\t

Het is belangrijk om een geschikte rentevaste periode te kiezen, die passend is bij de oversluitkosten en jouw persoonlijke situatie. De kosten die je maakt voor het oversluiten moeten minimaal kunnen worden terugverdiend in de nieuwe rentevaste periode. Wij raden daarom altijd aan om je te laten adviseren door een hypotheekadviseur.

\n\t\t\t\t\t\t\t{data.cost.paidOffPeriod}\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\n\t\t\t\t
\n\t\t\t\t\t\n Wil je een deskundig en persoonlijk advies bij het oversluiten van je hypotheek?\n Maak een afspraak op een vestiging van De Hypotheker bij jou in de buurt.\n De eerste afspraak is voor onze rekening. Je kunt van deze berekening gebruik maken als je een annuïteiten-, lineaire of aflossingsvrije hypotheek (of hypotheekdeel) hebt. Heb je een ander type hypotheek, maak dan een vrijblijvende afspraak om te kijken of oversluiten ook voor jou voordelig is.\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t\t}\n\t\t
\n\t);\n};\n","import React, { FunctionComponent } from 'react';\nimport { Check } from '../../../icons/components';\nimport LoaderDotsIcon from '../../../icons/components/LoaderDots';\n\nimport { Text } from '../Text';\n\nexport const Loader: FunctionComponent<{ isLoading: boolean, title?: string, subTitle?: string }> = ({ isLoading }) => {\n return (\n
\n
\n We zijn de kosten aan het berekenen\n\n
\n \n Een moment geduld\n
\n\n \n
\n
\n );\n};\n","import React, { useContext } from 'react';\nimport { Column } from '../components/shared/Column';\nimport { Grid } from '../components/shared/Grid';\n\nimport { BaseLayout } from '../components/template/BaseLayout';\nimport { RefinanceStepper } from '../components/features/RefinanceStepper';\nimport { RefinanceCta } from '../components/features/RefinanceCta';\nimport { FormContext } from '../store/refinance/RefinanceContext';\nimport { RefinanceResult } from '../components/features/RefinanceResult';\nimport { Loader } from '../components/shared/Loader';\n\nexport const Home = () => {\n\tconst { data, isLoading } = useContext(FormContext);\n return (\n \n \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{data ? : null }\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n \n \n );\n};\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n process.env.PUBLIC_URL,\n window.location.href\n );\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Home } from './pages/home';\n\nimport * as serviceWorker from './serviceWorker';\nimport { StepperProvider } from './store/stepper/StepperContext';\nimport { FormProvider } from './store/refinance/RefinanceContext';\n\nimport './styles/main.scss';\n\nReactDOM.render(\n \n \n\t\t\t\t\t\n \n\t\t\t\t\t\n \n ,\n document.getElementById('root'),\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}