{ "version": 3, "sources": ["../../../../src/assets/mcui-js/marketo/form-settings/form-experience/form-settings-keys.ts", "../../../../src/assets/mcui-js/marketo/form-settings/form-settings-factory.ts", "../../../../src/assets/mcui-js/widgetDataTs.ts", "../../../../node_modules/.pnpm/i18next-vue@2.2.1_i18next@22.5.1_vue@3.4.31_typescript@5.7.2_/node_modules/i18next-vue/dist/index.mjs", "../../../../src/assets/mcui-js/types-and-definitions/locale-defs/create/ISiteLocale.ts", "../../../../src/assets/mcui-js/types-and-definitions/locale-defs/create/createCountryLocale.ts", "../../../../src/assets/mcui-js/types-and-definitions/locale-defs/create/createLanguageLocale.ts", "../../../../src/assets/mcui-js/types-and-definitions/locale-defs/create/createLanguageCountryLocale.ts", "../../../../src/assets/mcui-js/types-and-definitions/locale-defs/create/createSiteLocale.ts", "../../../../src/assets/mcui-js/types-and-definitions/locale-defs/locale-settings.ts", "../../../../src/assets/mcui-js/types-and-definitions/locale-defs/props/SiteCountryCode.ts", "../../../../src/assets/mcui-js/types-and-definitions/locale-defs/props/ExtendedLocale.ts", "../../../../src/assets/mcui-js/types-and-definitions/locale-defs/props/GetSiteLocaleBy.ts", "../../../../src/assets/mcui-js/types-and-definitions/locale-defs/props/LocaleConvert.ts", "../../../../src/assets/mcui-js/types-and-definitions/locale-defs/props/CountryLocale.ts", "../../../../src/assets/mcui-js/types-and-definitions/locale-defs/props/LanguageCountryLocale.ts", "../../../../src/assets/mcui-js/types-and-definitions/locale-defs/props/LanguageLocale.ts", "../../../../src/assets/mcui-js/types-and-definitions/locale-defs/props/LocaleUrlPrefix.ts", "../../../../src/assets/mcui-js/types-and-definitions/locale-defs/Locales.ts", "../../../../src/assets/mcui-js/marketo/locale/settings/translation-namespaces.ts", "../../../../packages/util-vue/src/provide-inject.ts", "../../../../packages/util-vue/src/ref-utility-types.ts", "../../../../src/assets/mcui-js/marketo/composables/use-form-logger.ts", "../../../../src/assets/mcui-js/marketo/composables/use-site-language.ts", "../../../../src/assets/mcui-js/marketo/composables/use-form-settings.ts", "../../../../src/assets/mcui-js/marketo/composables/use-marketo-known-visitor-status.ts", "../../../../src/assets/mcui-js/marketo/form-logic/gating/FormOrFormExperienceType.ts", "../../../../src/assets/mcui-js/marketo/form-logic/gating/priority/get-highest-priority-gating-level.ts", "../../../../src/assets/mcui-js/marketo/form-logic/gating/get-gating-level-from-init-parameter-only.ts", "../../../../src/assets/mcui-js/marketo/form-logic/gating/get-gating-level-from-exp-settings-self-only.ts", "../../../../src/assets/mcui-js/marketo/form-logic/gating/get-resource-gating-level.ts", "../../../../src/assets/mcui-js/marketo/form-logic/gating/get-gating-level-from-resources-only.ts", "../../../../src/assets/mcui-js/marketo/form-logic/gating/get-gating-level-from-widget-data-only.ts", "../../../../src/assets/mcui-js/marketo/form-logic/gating/get-initial-gating-level.ts", "../../../../node_modules/.pnpm/typescript-cookie@1.0.6/node_modules/typescript-cookie/dist/typescript-cookie.mjs", "../../../../src/assets/mcui-js/marketo/form-logic/gating/user-gating-level-cookie-wrapper.ts", "../../../../src/assets/mcui-js/marketo/form-logic/gating/get-gating-state-from-dynamic-values.ts", "../../../../src/assets/mcui-js/marketo/composables/use-gating-level.ts", "../../../../node_modules/.pnpm/vue-demi@0.14.8_vue@3.4.31_typescript@5.7.2_/node_modules/vue-demi/lib/index.mjs", "../../../../node_modules/.pnpm/@vueuse+shared@10.11.0_vue@3.4.31_typescript@5.7.2_/node_modules/@vueuse/shared/index.mjs", "../../../../node_modules/.pnpm/@vueuse+core@10.11.0_vue@3.4.31_typescript@5.7.2_/node_modules/@vueuse/core/index.mjs", "../../../../src/assets/mcui-js/marketo/composables/use-form-events.ts", "../../../../src/assets/mcui-js/marketo/composables/use-eclipse-html-form-element.ts", "../../../../src/assets/mcui-js/marketo/composables/use-input-state.ts", "../../../../src/assets/mcui-js/marketo/composables/use-submit-state.ts", "../../../../src/assets/mcui-js/marketo/form-logic/loadMarketoScript.ts", "../../../../src/assets/mcui-js/marketo/composables/use-form-state.ts", "../../../../src/assets/mcui-js/marketo/composables/use-marketo-form-instance.ts", "../../../../src/assets/mcui-js/utils/loadScriptAsPromise.ts", "../../../../src/assets/mcui-js/utils/wait-for-element-as-promise.ts", "../../../../src/assets/mcui-js/marketo/composables/use-marketo-recaptcha.ts", "../../../../src/assets/mcui-js/marketo/composables/use-form-user-input-values.ts", "../../../../src/assets/mcui-js/marketo/composables/use-form-submit.ts", "../../../../src/assets/mcui-js/marketo/composables/use-blind-submit.ts", "../../../../src/assets/mcui-js/tracking/send-download-event.ts", "../../../../src/assets/mcui-js/marketo/composables/use-form-asset-download.ts", "../../../../src/assets/mcui-js/marketo/composables/use-translation.ts", "../../../../src/assets/mcui-js/tracking/data/cookie-persisted-value-getters.ts", "../../../../src/assets/mcui-js/tracking/page-data/initPageDataSettings.ts", "../../../../src/assets/mcui-js/tracking/page-data/getPageName.ts", "../../../../src/assets/mcui-js/utils/cookieUtils.ts", "../../../../src/assets/mcui-js/utils/queryParamUtils.ts", "../../../../src/assets/mcui-js/tracking/data/types-and-classes/CookiePersistedValue.ts", "../../../../src/assets/mcui-js/tracking/data/types-and-classes/CookiePersistedQueryStringValue.ts", "../../../../src/assets/mcui-js/tracking/data/types-and-classes/GenericCookiePersistedValue.ts", "../../../../src/assets/mcui-js/tracking/data/functions/getExternalReferrer.ts", "../../../../src/assets/mcui-js/tracking/data/functions/getGclid.ts", "../../../../src/assets/mcui-js/tracking/data/user-preference-value-getters.ts", "../../../../src/assets/mcui-js/tracking/onetrust/OptanonContentCookieTypes.ts", "../../../../packages/util-core/util-parse-and-convert/src/index.ts", "../../../../src/assets/mcui-js/tracking/onetrust/OneTrustCategoryIdToNameMapping.ts", "../../../../src/assets/mcui-js/tracking/onetrust/oneTrustLogger.ts", "../../../../src/assets/mcui-js/tracking/onetrust/readOneTrustCookie.ts", "../../../../src/assets/mcui-js/tracking/onetrust/getOneTrustValues.ts", "../../../../src/assets/mcui-js/tracking/data/ValueGetters.ts", "../../../../src/assets/mcui-js/marketo/form-logic/hiddenFieldValueBuilder.ts", "../../../../src/assets/mcui-js/marketo/composables/use-hidden-field-initializer.ts", "../../../../src/assets/mcui-js/marketo/types/definitions/inputs/marketo-input-meta.ts", "../../../../src/assets/mcui-js/marketo/composables/use-marketo-input-proxy/getRawInputElementValue.ts", "../../../../src/assets/mcui-js/utils/input-value-changed-listener.ts", "../../../../src/assets/mcui-js/types-and-definitions/forms/input-element.ts", "../../../../src/assets/mcui-js/marketo/composables/use-marketo-input-proxy/getInputElement.ts", "../../../../src/assets/mcui-js/marketo/composables/use-marketo-input-proxy/getMarketoInputElement.ts", "../../../../src/assets/mcui-js/marketo/composables/use-marketo-input-proxy/useMarketoFormInputElement.ts", "../../../../src/assets/mcui-js/marketo/composables/use-marketo-input-proxy/useMarketoInputProxy.ts", "../../../../src/assets/mcui-js/marketo/composables/use-marketo-input-proxy/getRawInputElementCheckedValue.ts", "../../../../src/assets/mcui-js/marketo/composables/use-marketo-hidden-inputs.ts", "../../../../src/assets/mcui-js/marketo/composables/use-inputs-meta-data.ts", "../../../../src/assets/mcui-js/marketo/composables/use-enabled-fields.ts", "../../../../src/assets/mcui-js/marketo/locale/translation-keys/country-option-keys.ts", "../../../../src/assets/mcui-js/tracking/region/GdprCountries.ts", "../../../../src/assets/mcui-js/marketo/models/PrivacyConsentState.ts", "../../../../src/assets/mcui-js/marketo/composables/use-privacy-consent-state.ts", "../../../../src/assets/mcui-js/marketo/form-logic/FormTrackingManager.ts", "../../../../src/assets/mcui-js/marketo/composables/use-form-tracking.ts", "../../../../src/assets/mcui-js/marketo/form-logic/FormAbandonmentManager.ts", "../../../../src/assets/mcui-js/marketo/composables/use-form-abandonment.ts", "../../../../src/assets/mcui-js/marketo/form-logic/genericEmailDomainBlockList.ts", "../../../../src/assets/mcui-js/marketo/form-logic/disposableEmailDomains.ts", "../../../../src/assets/mcui-js/marketo/composables/use-input-validation.ts", "../../../../src/assets/mcui-js/marketo/composables/use-abandonment-trigger.ts", "../../../../src/assets/mcui-js/marketo/composables/use-form-services.ts"], "sourcesContent": ["export const DocumentFormSettingsKey = [\r\n \"document\",\r\n \"document-landing-page\",\r\n \"post-event-assets\",\r\n \"ppc\",\r\n \"case-study\",\r\n \"digital-maturity-assessment\",\r\n] as const;\r\nexport type DocumentFormSettingsKey = (typeof DocumentFormSettingsKey)[number];\r\n\r\n\r\nexport const VideoFormSettingsKey = [\r\n \"video\",\r\n \"video-landing-page\",\r\n \"post-event-assets\",\r\n \"video-gated\",\r\n \"ppc-video\",\r\n] as const;\r\nexport type VideoFormSettingsKey = (typeof VideoFormSettingsKey)[number];\r\n\r\nexport const VideoGatedFormSettingsKey =[\r\n \"video-gated\",\r\n \"ppc-video\",\r\n \"video-landing-page\",\r\n]\r\nexport type VideoGatedFormSettingsKey = (typeof VideoGatedFormSettingsKey)[number];\r\n\r\nexport const CustomResourceFormSettingsKey = [\"qx-demo-video\"] as const;\r\nexport type CustomResourceFormSettingsKey = (typeof CustomResourceFormSettingsKey[number]);\r\n\r\n\r\nexport const ContactFormSettingsKey = [\r\n \"contact\",\r\n \"qx-roi\",\r\n \"mx-roi\",\r\n \"spark\",\r\n \"pricing\",\r\n \"subscription\",\r\n \"partner\",\r\n \"demo-request\",\r\n \"tradeshow-giveaway\",\r\n \"event-registration\",\r\n \"subprocessor-update-notification\",\r\n \"ppc-contact\",\r\n] as const;\r\nexport type ContactFormSettingsKey = (typeof ContactFormSettingsKey)[number];\r\n\r\nexport const MaturityFormKey = [\"digital-maturity-assessment\"] as const;\r\nexport type MaturityFormKey = (typeof MaturityFormKey)[number];\r\n\r\nexport const AnyFormSettingsKey = [\r\n ...DocumentFormSettingsKey,\r\n ...VideoFormSettingsKey,\r\n ...ContactFormSettingsKey,\r\n ...MaturityFormKey,\r\n ...CustomResourceFormSettingsKey\r\n] as const;\r\nexport type AnyFormSettingsKey = (typeof AnyFormSettingsKey)[number];\r\n\r\nexport type FormSettingsKeyToValueMapping = {\r\n readonly [key in AnyFormSettingsKey]: TMapping;\r\n};\r\n\r\n", "import type { ShallowMutable } from \"@mcwd/typescript-type-guards\";\r\nimport { AnyFormSettingsKey } from \"./form-experience/form-settings-keys.js\";\r\nimport { FormExperienceSettings, FormExperienceSettingsObject } from \"./form-experience/form-experience-settings.js\";\r\nexport * from \"./form-experience/form-experience-settings.js\";\r\n\r\nexport interface IGlobalFormSettings {\r\n readonly recaptchaSiteKey: string,\r\n readonly baseUrl: string;\r\n readonly munchkinId: string;\r\n}\r\nexport interface IFormSettings extends IGlobalFormSettings, FormExperienceSettings {}\r\n\r\nexport const MarketoBaseUrl = \"https://go.mastercontrol.com\" as const;\r\nexport const MarketoMunchkinId = \"327-YBX-036\" as const;\r\nconst recaptchaSiteKey = \"6LdMUTEiAAAAAN9mxESI45RKRQOrJHvwA4iRAkVS\" as const;\r\n\r\n\r\ntype FormSettingsType = {\r\n [Key in keyof typeof FormExperienceSettingsObject]: {\r\n recaptchaSiteKey: string;\r\n baseUrl: string;\r\n munchkinId: string;\r\n } & (typeof FormExperienceSettingsObject)[Key]\r\n};\r\n\r\ntype MutableFormSettingsType = ShallowMutable\r\n\r\nexport const FormSettingsObject = AnyFormSettingsKey.reduce(\r\n (\r\n result: Partial,\r\n formExperienceKey: AnyFormSettingsKey\r\n ) => {\r\n const formExperience = FormExperienceSettingsObject[formExperienceKey];\r\n (result[formExperienceKey] as FormSettingsType[typeof formExperienceKey]) = Object.freeze({\r\n recaptchaSiteKey: recaptchaSiteKey,\r\n baseUrl: MarketoBaseUrl,\r\n munchkinId: MarketoMunchkinId,\r\n ...formExperience,\r\n } as const satisfies FormSettingsType[typeof formExperienceKey]);\r\n return result;\r\n },\r\n {} satisfies Partial\r\n) as FormSettingsType;\r\n\r\nexport function getFormSettings (formExperienceKey: AnyFormSettingsKey) {\r\n if (AnyFormSettingsKey.includes(formExperienceKey) === false) {\r\n throw new Error(`Couldn't find form experience with key \"${formExperienceKey}\"`);\r\n }\r\n return FormSettingsObject[formExperienceKey] as TSettings;\r\n // const formExperience = FormExperienceSettingsObject[formExperienceKey];\r\n // return Object.freeze({\r\n // recaptchaSiteKey,\r\n // baseUrl: MarketoBaseUrl,\r\n // munchkinId: MarketoMunchkinId,\r\n // ... formExperience\r\n // });\r\n}\r\n\r\nexport function getFormClasses(formExperienceKey: AnyFormSettingsKey) {\r\n if (AnyFormSettingsKey.includes(formExperienceKey) === false) {\r\n throw new Error(`Couldn't find form experience with key \"${formExperienceKey}\"`);\r\n }\r\n const formExperience = FormExperienceSettingsObject[formExperienceKey];\r\n const { marketoFormSettingsKey } = formExperience;\r\n const modalFormClass = `mcui-modal-${formExperienceKey}-form` as const;\r\n const formSpecificRootClass = `mc-${formExperienceKey}-form` as const;\r\n const marketoFormClass = `marketo-${marketoFormSettingsKey}-form` as const;\r\n return { modalFormClass, formSpecificRootClass, marketoFormClass };\r\n}\r\n", "import {\r\n isArray,\r\n isArrayOfType,\r\n isBoolean,\r\n isNil,\r\n isObject,\r\n isString,\r\n type Nil,\r\n} from \"@mcwd/typescript-type-guards\";\r\nimport type { LanguageCountryLocale } from \"./types-and-definitions/locale-defs/Locales.js\";\r\nimport type { LinkDownloadType } from \"./tracking/LinkDownloadType.js\";\r\n\r\ninterface TypeCheckFnGeneric {\r\n (value: OrigType): value is T;\r\n}\r\n\r\ninterface TypeCheckFn extends TypeCheckFnGeneric {\r\n (value: unknown): value is T;\r\n} \r\n\r\ninterface TypeCheckFnGenericWithArgs {\r\n (value: OrigType, ...args: any[]): value is T;\r\n}\r\n\r\n\r\ninterface TypeCheckFnWithArgs extends TypeCheckFnGenericWithArgs {\r\n (value: unknown, ...args: any[]): value is T;\r\n}\r\n\r\ninterface TypeCheckFnWithSingleArg extends TypeCheckFnWithArgs {\r\n (value: unknown, arg1: A1, ...args: any[]): value is T;\r\n}\r\n\r\nfunction hasPropWithType(\r\n val: object,\r\n prop: TKey,\r\n typeCheckFn: TypeCheckFn\r\n): val is Record {\r\n return prop in val && typeCheckFn(val[prop as string]);\r\n}\r\n\r\nfunction hasOptionalPropWithType(\r\n val: object,\r\n prop: TKey,\r\n typeCheckFn: TypeCheckFn\r\n): val is Partial> {\r\n return !(prop in val) || typeCheckFn(val[prop as string]);\r\n}\r\n\r\nfunction checkConditionOrThrow(value: T, condition: ((val: T) => boolean), throwOnMissing: boolean, errorMessage: string): value is T2 {\r\n if (condition(value)) {\r\n return true;\r\n }\r\n else if (throwOnMissing) {\r\n throw new Error(errorMessage);\r\n }\r\n else return false;\r\n}\r\n\r\nfunction checkIsTypeOrThrow(value: T, condition: TypeCheckFnGeneric, throwOnMissing: boolean, errorMessage: string): value is T2 {\r\n return checkConditionOrThrow(value, condition, throwOnMissing, errorMessage);\r\n}\r\n\r\nfunction formatErrorMessage(messageLabel: string, ...errors: unknown[]) {\r\n const message = errors.map(err => {\r\n return ((err as Error)?.message ?? \"ERROR IS NULL\")\r\n ?.split('\\n')\r\n ?.map(e => ` ${e}`) // Indent\r\n .join('\\n');\r\n }).join(\"\\n\\n\"); // Double space between errors\r\n return `${messageLabel}: \\n${message}`;\r\n}\r\n\r\n\r\nconst InternalDataVersion = [\"Create\", \"Parse\", \"Final\"] as const;\r\ntype InternalDataVersion = (typeof InternalDataVersion)[number];\r\n\r\nconst UserDataVersion = [\"Create\", \"Final\"] as const satisfies readonly InternalDataVersion[];\r\ntype UserDataVersion = (typeof UserDataVersion)[number];\r\n\r\nexport const DataVersion = UserDataVersion;\r\nexport type DataVersion = UserDataVersion;\r\n\r\ninterface BaseResource {\r\n id: string;\r\n legacyId: string;\r\n salesforceOfferId?: string | Nil;\r\n title: string;\r\n gatingLevel: \"Full Gate\" | \"Partial Gate\" | \"Ungated\";\r\n language: \"en\" | Exclude\r\n}\r\n\r\nexport interface DocumentResource extends BaseResource {\r\n description?: string | Nil;\r\n docType: string;\r\n icon?: string | Nil;\r\n iconAltText?: string | Nil;\r\n thumbnail?: string | Nil;\r\n thumbnailAltText?: string | Nil;\r\n CoverImage?: string | Nil;\r\n AltText?: string | Nil;\r\n}\r\n\r\nexport interface VideoResource extends BaseResource {\r\n description: string,\r\n youTubeId: string;\r\n runtime?: string | Nil;\r\n}\r\n\r\nexport interface VideoResourceWithDocs extends BaseResource, VideoResource {\r\n documentList: DocumentResource[];\r\n}\r\n\r\nfunction isBaseResource(val: unknown, throwOnMissing = false): val is BaseResource {\r\n return (\r\n checkIsTypeOrThrow(val, isObject, throwOnMissing, `resource is not an object`) &&\r\n checkConditionOrThrow(val, x => hasPropWithType(x, \"id\", isString), throwOnMissing, `resource does not gave property 'id' of type string`) &&\r\n checkConditionOrThrow(val, x => {\r\n return hasOptionalPropWithType(x, \"legacyId\", isString) || hasOptionalPropWithType<\"legacyId\", Nil>(val, \"legacyId\", isNil);\r\n }, throwOnMissing, `resource does not have property 'legacyId' of type string | Nil`) &&\r\n checkConditionOrThrow(val, x => hasPropWithType(x, \"title\", isString), throwOnMissing, `resource does not have property 'title' of type string`) \r\n //checkConditionOrThrow(val, x => hasOptionalPropWithType(x, \"salesforceOfferId\", isString), throwOnMissing, `resource does not have property 'salesforceOfferId' of type string`)\r\n );\r\n}\r\n\r\nfunction isDocument(val: unknown, throwOnMissing = false): val is DocumentResource {\r\n try {\r\n return checkIsTypeOrThrow(val, ((x: unknown) => isBaseResource(x, throwOnMissing)) as TypeCheckFn, throwOnMissing, `document is not of type BaseResource`) &&\r\n checkConditionOrThrow(val, x => hasOptionalPropWithType(x, \"description\", (y => (isString(y) || isNil(y))) as TypeCheckFn), throwOnMissing, `document does not have property 'description' of type string | Nil`) &&\r\n checkConditionOrThrow(val, x => hasPropWithType(x, \"docType\", isString), throwOnMissing, `document does not have property 'docType' of type string`) &&\r\n checkConditionOrThrow(val, x => hasPropWithType(x, \"icon\", isString), throwOnMissing, `document does not have property 'icon' of type string`);\r\n }\r\n catch (err: unknown) {\r\n throw new Error(formatErrorMessage(\"isDocument\", err), { cause: err });\r\n }\r\n}\r\n\r\nfunction isVideoOnly(val: unknown): val is VideoResource {\r\n return isBaseResource(val) && hasPropWithType(val, \"youTubeId\", isString);\r\n}\r\n\r\nfunction isVideoWithDocs(val: unknown): val is VideoResourceWithDocs {\r\n return isVideoOnly(val) && hasPropWithType(val, \"documentList\", isDocumentArray);\r\n}\r\n\r\nexport function isDocumentArray(val: unknown): val is DocumentResource[] {\r\n return isArrayOfType(val, isDocument);\r\n}\r\n\r\nexport function isVideoArray(val: unknown): val is VideoResource[] {\r\n return isArrayOfType(val, isVideoOnly);\r\n}\r\n\r\nexport function isVideoWithDocsArray(val: unknown): val is VideoResourceWithDocs[] {\r\n return isArrayOfType(val, isVideoWithDocs);\r\n}\r\n\r\ninterface CreateDocumentObjectProperties {\r\n isFilteredOrChosen?: boolean;\r\n selectedListWillBeSingleDocument?: boolean;\r\n sourceList: DocumentResource[];\r\n}\r\n\r\ntype ParsedDocumentObjectProperties = Required;\r\n\r\ninterface CreateVideoObjectProperties {\r\n isFilteredOrChosen?: boolean;\r\n sourceList: TVideo[];\r\n}\r\n\r\ntype ParsedVideoObjectProperties = Required>;\r\n\r\ninterface SelectedSingleResource {\r\n selected: TResource;\r\n}\r\n\r\ninterface SelectedMultiResource {\r\n selected: TResource[];\r\n}\r\n\r\nfunction isCreateDocumentObjectProperties(val: unknown): val is CreateDocumentObjectProperties {\r\n return (\r\n isObject(val) &&\r\n hasOptionalPropWithType(val, \"isFilteredOrChosen\", isBoolean) &&\r\n hasOptionalPropWithType(val, \"selectedListWillBeSingleDocument\", isBoolean) &&\r\n hasPropWithType(val, \"sourceList\", isDocumentArray)\r\n );\r\n}\r\n\r\nfunction isParsedDocumentObjectProperties(\r\n val: unknown\r\n): val is ParsedDocumentObjectProperties {\r\n return (\r\n isObject(val) &&\r\n hasPropWithType(val, \"isFilteredOrChosen\", isBoolean) &&\r\n hasPropWithType(val, \"selectedListWillBeSingleDocument\", isBoolean) &&\r\n hasPropWithType(val, \"sourceList\", isDocumentArray)\r\n );\r\n}\r\n\r\nfunction isSelectedSingleResource<\r\n TResource extends DocumentResource | VideoResource | VideoResourceWithDocs\r\n>(\r\n val: unknown,\r\n typeCheckFn: TypeCheckFn\r\n): val is SelectedSingleResource {\r\n return isObject(val) && hasPropWithType(val, \"selected\", typeCheckFn);\r\n}\r\n\r\nfunction isSelectedMultiResource(\r\n val: unknown,\r\n typeCheckFn: TypeCheckFnWithSingleArg,\r\n throwOnMissing = false,\r\n): val is SelectedMultiResource {\r\n try {\r\n return checkIsTypeOrThrow(val, isObject, throwOnMissing, `selectedMultiResource<> is not an object`) &&\r\n checkConditionOrThrow(val, x => hasPropWithType(x, \"selected\", isArray), throwOnMissing, `selectedMultiResource<>.selected is not an array: ${JSON.stringify(val)}`) &&\r\n checkConditionOrThrow(\r\n val.selected,\r\n x => isArrayOfType(x, y => typeCheckFn(y, throwOnMissing)),\r\n throwOnMissing,\r\n `selectedMultiResource<>.selected is not of type TResource[]: ${JSON.stringify(val.selected)}`\r\n );\r\n }\r\n catch(err: unknown) {\r\n throw new Error(formatErrorMessage(\"isSelectedMultiResource\", err), { cause: err });\r\n }\r\n}\r\n\r\nfunction isCreateVideoObjectProperties(\r\n val: unknown\r\n): val is CreateVideoObjectProperties {\r\n return (\r\n isObject(val) &&\r\n hasOptionalPropWithType(val, \"isFilteredOrChosen\", isBoolean) &&\r\n hasPropWithType(val, \"sourceList\", isVideoArray)\r\n );\r\n}\r\n\r\nfunction isCreateVideoWithDocsObjectProperties(\r\n val: unknown\r\n): val is CreateVideoObjectProperties {\r\n return (\r\n isObject(val) &&\r\n hasOptionalPropWithType(val, \"isFilteredOrChosen\", isBoolean) &&\r\n hasPropWithType(val, \"sourceList\", isVideoWithDocsArray)\r\n );\r\n}\r\n\r\nfunction isParsedVideoObjectProperties(\r\n val: unknown\r\n): val is ParsedVideoObjectProperties {\r\n return (\r\n isObject(val) &&\r\n hasPropWithType(val, \"isFilteredOrChosen\", isBoolean) &&\r\n hasPropWithType(val, \"sourceList\", isVideoArray)\r\n );\r\n}\r\n\r\nfunction isParsedVideoWithDocsObjectProperties(\r\n val: unknown\r\n): val is ParsedVideoObjectProperties {\r\n return (\r\n isObject(val) &&\r\n hasPropWithType(val, \"isFilteredOrChosen\", isBoolean) &&\r\n hasPropWithType(val, \"sourceList\", isVideoWithDocsArray)\r\n );\r\n}\r\n\r\ninterface Widget {\r\n name: string;\r\n instanceId: string;\r\n variation?: string | Nil;\r\n}\r\n\r\nfunction isWidget(val: unknown): val is Widget {\r\n return (\r\n isObject(val) &&\r\n hasPropWithType(val, \"name\", isString) &&\r\n hasPropWithType(val, \"instanceId\", isString) &&\r\n (hasOptionalPropWithType(val, \"variation\", isString) || hasOptionalPropWithType(val, \"variation\", isNil))\r\n );\r\n}\r\n\r\nexport const FormSetupType = [\"ResourceForm\", \"VideoForm\", \"GatedVideoForm\", \"ContactForm\", \"PostEventForm\", \"MaturityForm\"] as const;\r\nexport type FormSetupType = (typeof FormSetupType)[number];\r\n\r\nexport const SetupType = [\"YouTube\", ...FormSetupType] as const;\r\nexport type SetupType = (typeof SetupType)[number];\r\n\r\nfunction isFormSetupType(val: unknown): val is FormSetupType {\r\n return isString(val) && FormSetupType.includes(val as FormSetupType);\r\n}\r\n\r\nfunction isSetupType(val: unknown): val is SetupType {\r\n return isString(val) && SetupType.includes(val as SetupType);\r\n}\r\n\r\ninterface CreateFormTrackingObject {\r\n usePageOfferId?: boolean | Nil;\r\n offerId?: string | Nil;\r\n ctaText?: string | Nil;\r\n ctaType?: string | Nil;\r\n}\r\n\r\nexport interface FinalFormTrackingObject {\r\n usePageOfferId: boolean;\r\n offerId?: string | Nil;\r\n ctaText?: string | Nil;\r\n ctaType?: LinkDownloadType | Nil;\r\n}\r\n\r\nfunction isCreateFormTrackingObject(\r\n val: unknown\r\n): val is CreateFormTrackingObject {\r\n return (\r\n isObject(val) &&\r\n (hasOptionalPropWithType(val, \"usePageOfferId\", isString) || hasOptionalPropWithType(val, \"usePageOfferId\", isNil)) &&\r\n (hasOptionalPropWithType(val, \"offerId\", isString) || hasOptionalPropWithType(val, \"offerId\", isNil)) &&\r\n (hasOptionalPropWithType(val, \"ctaText\", isString) || hasOptionalPropWithType(val, \"ctaText\", isNil)) &&\r\n (hasOptionalPropWithType(val, \"ctaType\", isString) || hasOptionalPropWithType(val, \"ctaType\", isNil))\r\n );\r\n}\r\n\r\nfunction isFinalFormTrackingObject(\r\n val: unknown,\r\n throwOnMissing = false\r\n): val is FinalFormTrackingObject {\r\n try {\r\n return checkIsTypeOrThrow(val, isObject, throwOnMissing, \"tracking value is not an object!\") &&\r\n checkConditionOrThrow(\r\n val,\r\n x => hasPropWithType(x, \"usePageOfferId\", isBoolean),\r\n throwOnMissing,\r\n `tracking.usePageOfferId is not of type boolean`\r\n ) &&\r\n checkConditionOrThrow(\r\n val,\r\n x => (hasOptionalPropWithType(x, \"offerId\", isString) || hasOptionalPropWithType(val, \"offerId\", isNil)),\r\n throwOnMissing,\r\n `tracking?.offerId is not of type string | Nil`\r\n )\r\n && (hasOptionalPropWithType(val, \"ctaText\", isString) || hasOptionalPropWithType(val, \"ctaText\", isNil))\r\n && (hasOptionalPropWithType(val, \"ctaType\", isString) || hasOptionalPropWithType(val, \"ctaType\", isNil));\r\n }\r\n catch(err: unknown) {\r\n throw new Error(formatErrorMessage(\"isFinalFormTrackingObject\", err), { cause: err });\r\n }\r\n}\r\n\r\ninterface BaseSetupObject {\r\n type: TSetupType;\r\n}\r\n\r\ntype BaseForm = {\r\n name: string\r\n}\r\n\r\nexport type BaseFormSetupObject<\r\n TDataVersion extends InternalDataVersion,\r\n TFormSetupType extends FormSetupType = FormSetupType,\r\n TFormObject extends BaseForm & Record = BaseForm & Record\r\n> = { type: TFormSetupType; form: TFormObject } & (TDataVersion extends \"Create\" ? { tracking?: CreateFormTrackingObject } : { tracking: FinalFormTrackingObject });\r\n\r\nexport type FormObjectWithDocument<\r\n TDataVersion extends InternalDataVersion,\r\n> = BaseForm & {\r\n document: TDataVersion extends \"Create\"\r\n ? CreateDocumentObjectProperties\r\n : TDataVersion extends \"Parse\"\r\n ? ParsedDocumentObjectProperties\r\n : TDataVersion extends \"Final\"\r\n ? SelectedMultiResource\r\n : never\r\n}\r\n\r\nexport interface FormObjectWithVideo<\r\n TDataVersion extends InternalDataVersion,\r\n TVideo extends VideoResource | VideoResourceWithDocs\r\n> extends BaseForm {\r\n video: TDataVersion extends \"Create\"\r\n ? CreateVideoObjectProperties\r\n : TDataVersion extends \"Parse\"\r\n ? ParsedVideoObjectProperties\r\n : TDataVersion extends \"Final\"\r\n ? SelectedSingleResource\r\n : never;\r\n}\r\n\r\ntype ResourceFormSetup = BaseFormSetupObject>;\r\ntype ContactFormSetup = BaseFormSetupObject;\r\nexport interface YouTubeSetup extends BaseSetupObject {\r\n type: \"YouTube\";\r\n youTubeId: string;\r\n}\r\n\r\nexport type CreateResourceFormSetup = ResourceFormSetup<\"Create\">;\r\ntype ParsedResourceFormSetup = ResourceFormSetup<\"Parse\">;\r\nexport type FinalResourceFormSetup = ResourceFormSetup<\"Final\">;\r\nfunction isBaseSetupObject(val: unknown): val is BaseSetupObject {\r\n return isObject(val) && hasPropWithType(val, \"type\", isSetupType);\r\n}\r\n\r\nfunction isBaseFormSetupObject(\r\n val: unknown,\r\n dataVersion: TDataVersion,\r\n throwOnMissing = false\r\n): val is BaseFormSetupObject {\r\n try {\r\n return (\r\n checkIsTypeOrThrow(\r\n val,\r\n isObject,\r\n throwOnMissing,\r\n \"setup is not an object!\"\r\n ) &&\r\n checkConditionOrThrow(\r\n val,\r\n (x) => hasPropWithType(x, \"type\", isFormSetupType),\r\n throwOnMissing,\r\n `setup does not have a property 'type' that matches a FormSetupType: ${FormSetupType.toString()}`\r\n ) &&\r\n (dataVersion === \"Create\"\r\n ? checkConditionOrThrow(\r\n val,\r\n (x) =>\r\n hasOptionalPropWithType(x, \"tracking\", isCreateFormTrackingObject),\r\n throwOnMissing,\r\n `setup does not have a property \"tracking\" of type CreateFormTrackingObject`\r\n )\r\n : checkConditionOrThrow(\r\n val,\r\n (x) => hasPropWithType(x, \"tracking\", isFinalFormTrackingObject),\r\n throwOnMissing,\r\n `setup does not have a property \"tracking\" of type FinalFormTrackingObject`\r\n )) &&\r\n checkConditionOrThrow(\r\n val,\r\n (x) => hasPropWithType(x, \"form\", isObject),\r\n throwOnMissing,\r\n `setup does not have a property \"form\" of type object`\r\n )\r\n );\r\n } catch (err: unknown) {\r\n throw new Error(formatErrorMessage(\"isBaseFormSetupObject\", err), { cause: err });\r\n }\r\n}\r\n\r\nexport function isYoutubeSetup(val: unknown, throwOnMissing = false): val is YouTubeSetup {\r\n try {\r\n return checkIsTypeOrThrow(val, isBaseSetupObject, throwOnMissing, `\"setup\" is not of type \"BaseSetupObject\"`) &&\r\n checkConditionOrThrow(val.type, x => x === \"YouTube\", throwOnMissing, \"type is not equal to 'YouTube'\") &&\r\n checkConditionOrThrow(val, x => hasPropWithType(x, \"youTubeId\", isString), throwOnMissing, \"setup does not have property 'youTubeId' of type string\");\r\n } catch (err: unknown) {\r\n throw new Error(formatErrorMessage(\"isYoutubeSetup\", err), { cause: err });\r\n }\r\n}\r\n\r\nfunction isFormObjectWithDocument(\r\n val: unknown,\r\n typeCheckFn: TypeCheckFn<\r\n TDataVersion extends \"Create\"\r\n ? CreateDocumentObjectProperties\r\n : TDataVersion extends \"Parse\"\r\n ? ParsedDocumentObjectProperties\r\n : TDataVersion extends \"Final\"\r\n ? SelectedMultiResource\r\n : never\r\n >\r\n): val is FormObjectWithDocument {\r\n return isObject(val) && hasPropWithType(val, \"document\", typeCheckFn);\r\n}\r\n\r\nfunction isFormObjectWithVideo<\r\n TDataVersion extends InternalDataVersion,\r\n TVideo extends VideoResource | VideoResourceWithDocs\r\n>(\r\n val: unknown,\r\n typeCheckFn: TypeCheckFn<\r\n TDataVersion extends \"Create\"\r\n ? CreateVideoObjectProperties\r\n : TDataVersion extends \"Parse\"\r\n ? ParsedVideoObjectProperties\r\n : TDataVersion extends \"Final\"\r\n ? SelectedSingleResource : never\r\n >\r\n): val is FormObjectWithVideo {\r\n return isObject(val) && hasPropWithType(val, \"video\", typeCheckFn);\r\n}\r\n\r\nfunction isCreateResourceFormSetup(\r\n val: unknown\r\n): val is CreateResourceFormSetup {\r\n return (\r\n isBaseFormSetupObject(val, \"Create\") &&\r\n val.type === \"ResourceForm\" &&\r\n isFormObjectWithDocument(val.form, isCreateDocumentObjectProperties)\r\n );\r\n}\r\n\r\nfunction isParsedResourceFormSetup(\r\n val: unknown\r\n): val is ParsedResourceFormSetup {\r\n return (\r\n isBaseFormSetupObject(val, \"Parse\") &&\r\n val.type === \"ResourceForm\" &&\r\n isFormObjectWithDocument(val.form, isParsedDocumentObjectProperties)\r\n );\r\n}\r\n\r\nfunction isFinalResourceFormSetup(val: unknown, throwOnMissing = false): val is FinalResourceFormSetup {\r\n try {\r\n return checkConditionOrThrow>(val, x => isBaseFormSetupObject<\"Final\">(x, \"Final\", throwOnMissing), throwOnMissing, `\"setup\" is not of type \"BaseFormSetupObject<'Final'>\"`) &&\r\n checkConditionOrThrow(val.type, x => x === \"ResourceForm\", throwOnMissing, \"type is not equal to 'ResourceForm'\") &&\r\n checkConditionOrThrow, BaseFormSetupObject<\"Final\"> & Record<\"form\", object>>(\r\n val,\r\n x => hasPropWithType(x, \"form\", isObject),\r\n throwOnMissing,\r\n \"setup does not have property 'form' of type object\"\r\n ) &&\r\n checkConditionOrThrow>(\r\n val.form,\r\n x => hasPropWithType(x, \"document\", (y => isSelectedMultiResource(y, isDocument, throwOnMissing)) as TypeCheckFn>),\r\n throwOnMissing,\r\n \"'setup.form' is not of type SelectedMultiResource\"\r\n );\r\n } catch (err: unknown) {\r\n throw new Error(formatErrorMessage(\"isFinalResourceFormSetup\", err), { cause: err });\r\n }\r\n\r\n}\r\n\r\nexport interface CreateVideoFormSetup extends BaseSetupObject, BaseFormSetupObject<\"Create\", \"VideoForm\", FormObjectWithVideo<\"Create\", VideoResourceWithDocs>> {\r\n type: \"VideoForm\";\r\n form: FormObjectWithVideo<\"Create\", VideoResourceWithDocs>;\r\n}\r\n\r\ninterface ParsedVideoFormSetup extends BaseSetupObject, BaseFormSetupObject<\"Parse\", \"VideoForm\", FormObjectWithVideo<\"Parse\", VideoResourceWithDocs>> {\r\n type: \"VideoForm\";\r\n form: FormObjectWithVideo<\"Parse\", VideoResourceWithDocs>;\r\n}\r\nexport interface FinalVideoFormSetup extends BaseSetupObject, BaseFormSetupObject<\"Final\", \"VideoForm\", FormObjectWithVideo<\"Final\", VideoResourceWithDocs>> {\r\n type: \"VideoForm\";\r\n form: FormObjectWithVideo<\"Final\", VideoResourceWithDocs> & FormObjectWithDocument<\"Final\">;\r\n}\r\n\r\nfunction isCreateVideoFormSetup(val: unknown): val is CreateVideoFormSetup {\r\n return (\r\n isBaseFormSetupObject(val, \"Create\") &&\r\n val.type === \"VideoForm\" &&\r\n hasPropWithType(val, \"form\", isObject) &&\r\n isFormObjectWithVideo(val.form, isCreateVideoWithDocsObjectProperties)\r\n );\r\n}\r\n\r\nfunction isParsedVideoFormSetup(val: unknown): val is ParsedVideoFormSetup {\r\n return (\r\n isBaseFormSetupObject(val, \"Parse\") &&\r\n val.type === \"VideoForm\" &&\r\n hasPropWithType(val, \"form\", isObject) &&\r\n isFormObjectWithVideo(val.form, isParsedVideoWithDocsObjectProperties)\r\n );\r\n}\r\n\r\n\r\nfunction isFinalVideoFormSetup(val: unknown, throwOnMissing = false): val is FinalVideoFormSetup {\r\n try {\r\n return checkConditionOrThrow>(\r\n val, x => isBaseFormSetupObject<\"Final\">(x, \"Final\", throwOnMissing), throwOnMissing, `\"setup\" is not of type \"BaseFormSetupObject<'Final'>\"`) &&\r\n checkConditionOrThrow(val.type, x => x === \"VideoForm\", throwOnMissing, \"type is not equal to 'VideoForm'\") &&\r\n checkConditionOrThrow, BaseFormSetupObject<\"Final\"> & Record<\"form\", object>>(\r\n val,\r\n x => hasPropWithType(x, \"form\", isObject),\r\n throwOnMissing,\r\n \"setup does not have property 'form' of type object\"\r\n ) &&\r\n checkConditionOrThrow>(\r\n val.form,\r\n x => hasPropWithType(x, \"document\", ((y: unknown) => isSelectedMultiResource(y, isDocument, throwOnMissing)) as TypeCheckFn>),\r\n throwOnMissing,\r\n `'setup.form' is not of type SelectedMultiResource`\r\n ) &&\r\n checkConditionOrThrow>(\r\n val.form, (x => {\r\n return isFormObjectWithVideo<\"Final\", VideoResourceWithDocs>(x, (y: unknown) => isSelectedSingleResource(y, isVideoWithDocs)); \r\n }),\r\n throwOnMissing,\r\n \"'setup.form' is not of type SelectedSingleResource\"\r\n );\r\n } catch (err: unknown) {\r\n throw new Error(formatErrorMessage(\"isFinalVideoFormSetup\", err), { cause: err });\r\n }\r\n}\r\nexport interface FinalPostEventFormSetup extends BaseSetupObject, BaseFormSetupObject<\"Final\", \"PostEventForm\", FormObjectWithVideo<\"Final\", VideoResource>> {\r\n type: \"PostEventForm\";\r\n form: FormObjectWithVideo<\"Final\", VideoResource> & FormObjectWithDocument<\"Final\">;\r\n gatingLevel: \"Full Gate\" | \"Partial Gate\" | \"Ungated\";\r\n}\r\nexport function isFinalPostEventFormSetup(val: unknown, throwOnMissing = false): val is FinalPostEventFormSetup {\r\n try {\r\n return checkConditionOrThrow>(\r\n val, x => isBaseFormSetupObject<\"Final\">(x, \"Final\", throwOnMissing), throwOnMissing, `\"setup\" is not of type \"BaseFormSetupObject<'Final'>\"`) &&\r\n checkConditionOrThrow(val.type, x => x === \"PostEventForm\", throwOnMissing, \"type is not equal to 'PostEventForm'\") &&\r\n checkConditionOrThrow, BaseFormSetupObject<\"Final\"> & Record<\"form\", object>>(\r\n val,\r\n x => hasPropWithType(x, \"form\", isObject),\r\n throwOnMissing,\r\n \"setup does not have property 'form' of type object\"\r\n ) &&\r\n checkConditionOrThrow | SelectedMultiResource>(\r\n val.form,\r\n x => {\r\n return hasPropWithType(\r\n x,\r\n \"document\",\r\n (y: unknown) => isSelectedMultiResource(y, isDocument, false)\r\n ) ||\r\n isFormObjectWithVideo<\"Final\", VideoResource>(\r\n x,\r\n (y: unknown): y is SelectedSingleResource => isSelectedSingleResource(y, isVideoOnly)\r\n );\r\n }, throwOnMissing,\r\n `'setup.form' is not of type SelectedMultiResource | SelectedMultiResource`\r\n );\r\n } catch (err: unknown) {\r\n throw new Error(formatErrorMessage(\"isFinalPostEventFormSetup\", err), { cause: err });\r\n }\r\n}\r\n\r\nexport interface CreateGatedVideoFormSetup extends BaseSetupObject, BaseFormSetupObject<\"Create\", \"GatedVideoForm\", FormObjectWithVideo<\"Create\", VideoResource>> {\r\n type: \"GatedVideoForm\";\r\n form: FormObjectWithVideo<\"Create\", VideoResource>;\r\n}\r\ninterface ParsedGatedVideoFormSetup extends BaseSetupObject, BaseFormSetupObject<\"Parse\", \"GatedVideoForm\", FormObjectWithVideo<\"Parse\", VideoResource>> {\r\n type: \"GatedVideoForm\";\r\n form: FormObjectWithVideo<\"Parse\", VideoResource>;\r\n}\r\nexport interface FinalGatedVideoFormSetup extends BaseSetupObject, BaseFormSetupObject<\"Final\", \"GatedVideoForm\", FormObjectWithVideo<\"Final\", VideoResource>> {\r\n type: \"GatedVideoForm\";\r\n form: FormObjectWithVideo<\"Final\", VideoResource>;\r\n}\r\n\r\nfunction isCreateGatedVideoFormSetup(\r\n val: unknown\r\n): val is CreateGatedVideoFormSetup {\r\n return (\r\n isBaseFormSetupObject(val, \"Create\") &&\r\n val.type === \"GatedVideoForm\" &&\r\n hasPropWithType(val, \"form\", isObject) &&\r\n isFormObjectWithVideo(val.form, isCreateVideoObjectProperties)\r\n );\r\n}\r\n\r\nfunction isParsedGatedVideoFormSetup(\r\n val: unknown\r\n): val is ParsedGatedVideoFormSetup {\r\n return (\r\n isBaseFormSetupObject(val, \"Create\") &&\r\n val.type === \"GatedVideoForm\" &&\r\n hasPropWithType(val, \"form\", isObject) &&\r\n isFormObjectWithVideo(val.form, isParsedVideoObjectProperties)\r\n );\r\n}\r\n\r\nfunction isFinalGatedVideoFormSetup(val: unknown, throwOnMissing = false): val is FinalGatedVideoFormSetup {\r\n try {\r\n return checkConditionOrThrow>(val, x => isBaseFormSetupObject<\"Final\">(x, \"Final\", throwOnMissing), throwOnMissing, `\"setup\" is not of type \"BaseFormSetupObject<'Final'>\"`) &&\r\n checkConditionOrThrow(val.type, x => x === \"GatedVideoForm\", throwOnMissing, \"type is not equal to 'GatedVideoForm'\") &&\r\n checkConditionOrThrow, BaseFormSetupObject<\"Final\"> & Record<\"form\", object>>(\r\n val,\r\n x => hasPropWithType(x, \"form\", isObject),\r\n throwOnMissing,\r\n \"setup does not have property 'form' of type object\"\r\n ) &&\r\n checkConditionOrThrow>(\r\n val.form, (x => {\r\n return isFormObjectWithVideo<\"Final\", VideoResource>(x, ((y) => isSelectedSingleResource(y, isVideoOnly)) as TypeCheckFn>); }),\r\n throwOnMissing,\r\n \"'setup.form' is not of type SelectedSingleResource\"\r\n );\r\n }\r\n catch (err: unknown) {\r\n throw new Error(formatErrorMessage(\"isFinalGatedVideoFormSetup\", err), { cause: err });\r\n }\r\n}\r\n\r\n\r\nexport type FinalContactFormSetup = ContactFormSetup<\"Final\">;\r\n\r\nfunction isFinalContactFormSetup(val: unknown, throwOnMissing = false): val is FinalContactFormSetup {\r\n return (\r\n isBaseFormSetupObject(val, \"Final\", throwOnMissing) &&\r\n val.type === \"ContactForm\" &&\r\n hasPropWithType(val, \"form\", isObject)\r\n );\r\n}\r\n\r\nexport type AnyCreateSetupObject =\r\n | YouTubeSetup\r\n | CreateResourceFormSetup\r\n | CreateVideoFormSetup\r\n | CreateGatedVideoFormSetup;\r\n\r\nexport type AnyParsedSetupObject =\r\n | YouTubeSetup\r\n | ParsedResourceFormSetup\r\n | ParsedVideoFormSetup\r\n | ParsedGatedVideoFormSetup;\r\n\r\nexport type AnyAppStateFinalSetupObject =\r\n | YouTubeSetup\r\n | FinalResourceFormSetup\r\n | FinalVideoFormSetup\r\n | FinalGatedVideoFormSetup\r\n | FinalPostEventFormSetup;\r\n\r\nexport type AnyOtherFinalSetupObject = FinalContactFormSetup;\r\n\r\nexport type AnyFormFinalSetupObject =\r\n | FinalResourceFormSetup\r\n | FinalVideoFormSetup\r\n | FinalGatedVideoFormSetup\r\n | FinalContactFormSetup\r\n | FinalPostEventFormSetup;\r\n\r\nexport function isAnyFormFinalSetupObject(value: unknown, throwOnMissing = false): value is AnyFormFinalSetupObject {\r\n try {\r\n if (checkConditionOrThrow(value, isObject, throwOnMissing, \"'setup' value is not an object\")) {\r\n const errors: unknown[] = [];\r\n try { if (isFinalResourceFormSetup(value, throwOnMissing)) { return true; } } catch (err: unknown) { errors.push(err); }\r\n try { if (isFinalVideoFormSetup(value, throwOnMissing)) { return true; } } catch (err: unknown) { errors.push(err); }\r\n try { if (isFinalGatedVideoFormSetup(value, throwOnMissing)) { return true; } } catch (err: unknown) { errors.push(err); }\r\n try { if (isFinalContactFormSetup(value, throwOnMissing)) { return true; } } catch (err: unknown) { errors.push(err); }\r\n try { if (isFinalPostEventFormSetup(value, throwOnMissing)) { return true; } } catch (err: unknown) { errors.push(err); }\r\n if (errors.length > 0 && throwOnMissing) {\r\n throw new Error(formatErrorMessage(\"setup is not of type 'AnyFormFinalSetupObject'\", ...errors), { cause: errors });\r\n }\r\n }\r\n return false;\r\n } catch (err: unknown) {\r\n throw new Error(formatErrorMessage(\"isAnyFormFinalSetupObject\", err), { cause: err });\r\n }\r\n}\r\n\r\nexport type CreateSingleSetupObject = SetupObjectTypes;\r\ntype ParsedSingleSetupObject = SetupObjectTypes; \r\nexport type FinalAppStateSingleSetupObject = SetupObjectTypes;\r\nexport type FinalOtherSingleSetupObject = SetupObjectTypes;\r\n\r\nfunction isCreateSingleSetupObject(value: unknown): value is CreateSingleSetupObject {\r\n return isBaseSetupObject(value) && (\r\n isYoutubeSetup(value) || isCreateResourceFormSetup(value) || isCreateVideoFormSetup(value) || isCreateGatedVideoFormSetup(value)\r\n );\r\n}\r\nfunction isParsedSingleSetupObject(value: unknown): value is ParsedSingleSetupObject {\r\n return isBaseSetupObject(value) && (\r\n isYoutubeSetup(value) || isParsedResourceFormSetup(value) || isParsedVideoFormSetup(value) || isParsedGatedVideoFormSetup(value)\r\n );\r\n}\r\n\r\nfunction isFinalAppStateSingleSetupObject(value: unknown, throwOnMissing = false): value is FinalAppStateSingleSetupObject {\r\n try {\r\n if (checkConditionOrThrow(value, isBaseSetupObject, throwOnMissing, \"'setup' value is not of type BaseSetupObject\")) {\r\n const errors: unknown[] = [];\r\n try { if (isYoutubeSetup(value, throwOnMissing)) { return true; } } catch (err: unknown) { errors.push(err); }\r\n try { if (isFinalResourceFormSetup(value, throwOnMissing)) { return true; } } catch (err: unknown) { errors.push(err); }\r\n try { if (isFinalVideoFormSetup(value, throwOnMissing)) { return true; } } catch (err: unknown) { errors.push(err); }\r\n try { if (isFinalGatedVideoFormSetup(value, throwOnMissing)) { return true; } } catch (err: unknown) { errors.push(err); }\r\n if (errors.length > 0 && throwOnMissing) {\r\n throw new Error(formatErrorMessage(\"setup is not of type 'FinalAppStateSingleSetupObject'\", errors), { cause: errors });\r\n }\r\n }\r\n return false;\r\n } catch (err: unknown) {\r\n throw new Error(formatErrorMessage(\"isFinalAppStateSingleSetupObject\", err), { cause: err });\r\n }\r\n}\r\n\r\nfunction isFinalOtherSingleSetupObject(value: unknown): value is FinalOtherSingleSetupObject {\r\n return isBaseSetupObject(value) && isFinalContactFormSetup(value);\r\n}\r\n\r\ninterface BaseMultiSetupObject extends BaseSetupObject {\r\n setupName: string;\r\n}\r\nfunction isBaseMultiSetupObject(value: unknown): value is BaseMultiSetupObject {\r\n return isBaseSetupObject(value) && hasPropWithType(value, \"setupName\", isString);\r\n}\r\n\r\nexport type CreateMultipleSetupObject = CreateSingleSetupObject> = BaseMultiSetupObject & TSetup;\r\ntype ParsedMultipleSetupObject = ParsedSingleSetupObject> = BaseMultiSetupObject & TSetup;\r\nexport type FinalMultipleSetupObject = FinalAppStateSingleSetupObject> = BaseMultiSetupObject & TSetup;\r\n\r\nfunction isCreateMultipleSetupObject(value: unknown): value is CreateMultipleSetupObject {\r\n return isBaseMultiSetupObject(value) && isCreateSingleSetupObject(value);\r\n}\r\nfunction isParsedMultipleSetupObject(value: unknown): value is ParsedMultipleSetupObject {\r\n return isBaseMultiSetupObject(value) && isParsedSingleSetupObject(value);\r\n}\r\nfunction isFinalMultipleSetupObject(value: unknown, throwOnMissing = false): value is FinalMultipleSetupObject {\r\n try {\r\n return isFinalAppStateSingleSetupObject(value, throwOnMissing) && isBaseMultiSetupObject(value);\r\n } catch (err: unknown) {\r\n throw new Error(formatErrorMessage(\"isFinalMultipleSetupObject\", err), { cause: err });\r\n }\r\n}\r\n\r\nexport interface CreateWidgetData {\r\n widget: Widget;\r\n setup:\r\n | (\r\n AllowSingleItemInSetup extends true\r\n ? CreateSingleSetupObject | [CreateSingleSetupObject]\r\n : [CreateSingleSetupObject] \r\n ) \r\n | [CreateMultipleSetupObject, ...CreateMultipleSetupObject[]];\r\n}\r\n\r\ninterface ParsedWidgetData {\r\n widget: Widget;\r\n setup: SingleItemSetup extends true\r\n ? (ParsedSingleSetupObject | ParsedMultipleSetupObject)\r\n : ([ParsedSingleSetupObject] | [ParsedMultipleSetupObject, ...ParsedMultipleSetupObject[]]);\r\n}\r\n\r\nexport interface FinalWidgetData {\r\n widget: Widget;\r\n setup: SetupObjectTypes extends AnyAppStateFinalSetupObject\r\n ? (FinalAppStateSingleSetupObject | FinalMultipleSetupObject)\r\n : (SetupObjectTypes extends AnyOtherFinalSetupObject? FinalOtherSingleSetupObject : never)\r\n}\r\n\r\nexport function isCreateWidgetData(value: unknown, allowSingleItemInSetup: AllowSingleItemInSetup): value is CreateWidgetData {\r\n return isObject(value) &&\r\n hasPropWithType(value, \"widget\", isWidget) &&\r\n hasPropWithType(value, \"setup\", (x => {\r\n return (allowSingleItemInSetup && isCreateSingleSetupObject(x)) || (\r\n isArray(x) &&\r\n x.length > 0 && (\r\n (x.length === 1 && isArrayOfType(x, isCreateSingleSetupObject)) ||\r\n isArrayOfType(x, isCreateMultipleSetupObject)\r\n )\r\n );\r\n }) as TypeCheckFn[\"setup\"]>);\r\n}\r\n\r\nfunction isParsedWidgetData(value: unknown, singleItemInSetup: SingleItemSetup): value is ParsedWidgetData {\r\n return isObject(value) &&\r\n hasPropWithType(value, \"widget\", isWidget) &&\r\n hasPropWithType(value, \"setup\", (x => {\r\n return (singleItemInSetup && isParsedSingleSetupObject(x)) || (\r\n isArray(x) && x.length > 0 && (\r\n (x.length === 1\r\n ? isArrayOfType(x, isParsedSingleSetupObject)\r\n : isArrayOfType(x, isParsedMultipleSetupObject)\r\n )\r\n ));\r\n }) as TypeCheckFn[\"setup\"]>);\r\n}\r\n\r\nfunction isObjectWithWidgetProp(value: object, throwOnMissing: boolean): value is object & Record<\"widget\", Widget> {\r\n return checkConditionOrThrow>(value, (x => hasPropWithType(x, \"widget\", isWidget)), throwOnMissing, \"'value.widget' is not a widget object: \" + JSON.stringify(value));\r\n}\r\n\r\nfunction isObjectWithFinalSetupProp(value: object, throwOnMissing = false): value is object & Record<\"setup\", AnyAppStateFinalSetupObject[] | AnyOtherFinalSetupObject[]> {\r\n try {\r\n if (\"setup\" in value) {\r\n if (isArray(value.setup)) {\r\n if (value.setup.length === 1) {\r\n return checkConditionOrThrow(\r\n value.setup,\r\n x => (isArrayOfType(x, y => isFinalAppStateSingleSetupObject(y, throwOnMissing)) || isArrayOfType(x, isFinalOtherSingleSetupObject)),\r\n throwOnMissing,\r\n \"'value.setup' is not an array of type AnyAppStateFinalSetupObject or AnyOtherFinalSetupObject: \" + JSON.stringify(value.setup)\r\n );\r\n }\r\n else {\r\n return checkConditionOrThrow(value.setup, (x => isArrayOfType(x, isFinalMultipleSetupObject)),\r\n throwOnMissing,\r\n \"'value.setup' is not an array of type FinalMultipleSetupObject: \" + JSON.stringify(value.setup)\r\n );\r\n }\r\n }\r\n else {\r\n return checkConditionOrThrow(\r\n value.setup,\r\n x => {\r\n return isFinalAppStateSingleSetupObject(x, throwOnMissing) || isFinalOtherSingleSetupObject(x);\r\n },\r\n throwOnMissing,\r\n \"'value.setup' is not an object of type AnyAppStateFinalSetupObject or AnyOtherFinalSetupObject: \" + JSON.stringify(value.setup)\r\n );\r\n }\r\n }\r\n else {\r\n throw new Error(\"'value.setup' is not defined\");\r\n }\r\n } catch (err: unknown) {\r\n throw new Error(formatErrorMessage(\"isObjectWithFinalSetupProp\", err), { cause: err });\r\n }\r\n\r\n}\r\n\r\nexport function isFinalWidgetData(value: unknown, throwOnMissing = false): value is FinalWidgetData {\r\n try {\r\n return checkIsTypeOrThrow(value, isObject, throwOnMissing, \"'value' is not an object.\") &&\r\n isObjectWithWidgetProp(value, throwOnMissing) &&\r\n isObjectWithFinalSetupProp(value, throwOnMissing);\r\n } catch (err: unknown) {\r\n throw new Error(formatErrorMessage(\"isFinalWidgetData\", err), { cause: err });\r\n }\r\n}\r\n\r\ntype SetupTypeToFinalSetupObject =\r\n TSetup extends \"YouTubeSetup\"\r\n ? YouTubeSetup\r\n : TSetup extends \"ResourceForm\"\r\n ? ResourceFormSetup<\"Final\">\r\n : TSetup extends \"VideoForm\"\r\n ? FinalVideoFormSetup\r\n : TSetup extends \"PostEventForm\"\r\n ? FinalPostEventFormSetup\r\n : TSetup extends \"GatedVideoForm\"\r\n ? FinalGatedVideoFormSetup\r\n : TSetup extends \"ContactForm\"\r\n ? ContactFormSetup<\"Final\">\r\n : never;\r\n\r\nexport type FormWidgetData = FinalWidgetData>;\r\nexport function isFormWidgetData(\r\n value: unknown,\r\n setupType?: TSetupType | TSetupType[],\r\n throwOnMissing = false\r\n): value is (typeof setupType extends Nil? FormWidgetData : FormWidgetData) {\r\n try {\r\n setupType ??= FormSetupType as unknown as TSetupType[];\r\n setupType = (isArray(setupType) ? setupType : [setupType]);\r\n return checkIsTypeOrThrow(value, isObject, throwOnMissing, \"'value' is not an object.\") &&\r\n isObjectWithWidgetProp(value, throwOnMissing) &&\r\n (\"setup\" in value) &&\r\n isAnyFormFinalSetupObject(value.setup, throwOnMissing) &&\r\n checkConditionOrThrow>(\r\n value.setup,\r\n (s) => (setupType as string[]).includes(s.type),\r\n throwOnMissing,\r\n `setup type of type ${value.setup.type} does not match any of the provided types in ${setupType.toString()}`\r\n );\r\n } catch (err: unknown) {\r\n throw new Error(formatErrorMessage(\"isFormWidgetData\", err), {cause: err });\r\n }\r\n}\r\n\r\nfunction assignDefaultValues(dataObj: CreateWidgetData) {\r\n dataObj.setup = isArray(dataObj.setup) ? dataObj.setup : [dataObj.setup];\r\n\r\n // Iterate through each setup object and assign default values\r\n dataObj.setup.forEach((setup) => {\r\n // Defaults for \"form\" property\r\n if (isBaseFormSetupObject(setup, \"Create\")) {\r\n const form = setup.form;\r\n // Defaults for \"document\" property\r\n if (isFormObjectWithDocument(form, isCreateDocumentObjectProperties)) {\r\n const document = form.document;\r\n // \"selectedListWillBeSingleDocument\" defaults to false unless sourceList contains only one document and sourceList is not being filtered\r\n document.selectedListWillBeSingleDocument ??=\r\n (document.sourceList || []).length === 1 &&\r\n document.isFilteredOrChosen !== true;\r\n // \"isFilteredOrChosen\" defaults to false\r\n document.isFilteredOrChosen ??= false;\r\n\r\n // \"description\" defaults to \"\" for all documents\r\n const sourceList = document.sourceList;\r\n sourceList.forEach((doc) => {\r\n doc.description = doc.description ?? \"\";\r\n });\r\n }\r\n\r\n // Defaults for \"video\" property\r\n\r\n if (isFormObjectWithVideo(form, isCreateVideoObjectProperties)) {\r\n const video = (form.video as CreateVideoObjectProperties);\r\n // \"isFilteredOrChosen\" defaults to false\r\n video.isFilteredOrChosen = video.isFilteredOrChosen ?? false;\r\n }\r\n\r\n if (isBaseFormSetupObject(setup, \"Create\")) {\r\n // Set the default \"tracking.usePageOfferId\" setting to false\r\n setup.tracking ??= { usePageOfferId: false };\r\n setup.tracking.usePageOfferId ??= false;\r\n }\r\n }\r\n });\r\n return dataObj as unknown as CreateWidgetData;\r\n}\r\n\r\nfunction removeUnwantedProps(setup: CreateSingleSetupObject) {\r\n if (isObject(setup) && [\"YouTube\", \"GatedVideoForm\"].includes(setup.type)) {\r\n if (hasPropWithType(setup, \"form\", isObject) && hasPropWithType(setup.form, \"video\", isObject)) {\r\n setup.form.video.sourceList.forEach((el) => {\r\n if (hasPropWithType(el, \"documentList\", isArray)) {\r\n delete (el as Partial).documentList;\r\n }\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst getModifiers = {\r\n setupName(widgetDataObj: ParsedWidgetData, setupName?: string): ParsedWidgetData {\r\n const { setup, ...remainingWidgetData } = widgetDataObj;\r\n\r\n if (setup.length === 1) {\r\n return { setup: setup[0], ...remainingWidgetData };\r\n } else {\r\n const setupItem = setup.find(\r\n (s) => (\"setupName\" in s) && s.setupName === setupName\r\n );\r\n if (isNil(setupItem)) {\r\n throw new Error(\"Couldn't find setupName: \" + (setupName ?? \"NULL\"));\r\n }\r\n return {\r\n setup: setupItem,\r\n ...remainingWidgetData,\r\n };\r\n }\r\n },\r\n videoSelector(widgetDataObj: ParsedWidgetData & Partial>, videoId: string) {\r\n const { setup, ...remainingWidgetData } = widgetDataObj;\r\n if (hasPropWithType(setup, \"form\", isObject) && isFormObjectWithVideo(setup.form, isParsedVideoObjectProperties)) {\r\n const { form, ...remainingSetup } = setup;\r\n const video = (form.video as ParsedVideoObjectProperties).sourceList.find((vid) => {\r\n return vid.id === videoId;\r\n }) as VideoResource | VideoResourceWithDocs | Nil;\r\n if (isNil(video)) {\r\n throw new Error(\"Could not find video with ID: \" + videoId);\r\n }\r\n (form.video as unknown as SelectedSingleResource).selected = video;\r\n if (\"documentList\" in video) {\r\n return {\r\n ...remainingWidgetData,\r\n setup: {\r\n ...remainingSetup,\r\n form: {\r\n ...form,\r\n document: { selected: video.documentList },\r\n },\r\n },\r\n };\r\n }\r\n return {\r\n ...remainingWidgetData,\r\n setup: { ...remainingSetup, form },\r\n };\r\n }\r\n return widgetDataObj;\r\n },\r\n documentSelector(widgetDataObj: ParsedWidgetData, documentIds: string[]) {\r\n if (\"form\" in widgetDataObj.setup && \"document\" in widgetDataObj.setup.form) {\r\n if (documentIds.length === 0) {\r\n ((widgetDataObj.setup as unknown as FinalResourceFormSetup).form.document).selected =\r\n [...(widgetDataObj.setup as unknown as ParsedResourceFormSetup).form.document.sourceList];\r\n } else {\r\n const documents = (widgetDataObj.setup as unknown as ParsedResourceFormSetup).form.document.sourceList.filter((doc) => {\r\n return documentIds.includes(doc.id);\r\n });\r\n (widgetDataObj.setup as unknown as FinalResourceFormSetup).form.document.selected = documents;\r\n }\r\n }\r\n return widgetDataObj;\r\n },\r\n\r\n cleanup(widgetDataObj: FinalWidgetData) {\r\n const setup = widgetDataObj.setup;\r\n\r\n if (isBaseFormSetupObject(setup, \"Parse\")) {\r\n const tracking = setup.tracking;\r\n if (tracking && \"usePageOfferId\" in tracking && tracking.usePageOfferId === true) {\r\n tracking.offerId = window.AppState.PageOfferId as string | Nil;\r\n }\r\n if (isParsedVideoFormSetup(setup) || isParsedGatedVideoFormSetup(setup)) {\r\n if (\"sourceList\" in setup.form.video) {\r\n if (\"selected\" in setup.form.video === false) {\r\n if ((setup.form.video as any).sourceList.length === 1) {\r\n (setup.form.video as unknown as SelectedSingleResource).selected = ((setup.form.video as any).sourceList[0] as (VideoResource | VideoResourceWithDocs));\r\n const selected = (setup.form.video as SelectedSingleResource).selected;\r\n const docList = \"documentList\" in selected ? selected.documentList : [];\r\n\r\n if (docList.length > 0) {\r\n (setup as FinalVideoFormSetup).form.document = { selected: docList };\r\n }\r\n }\r\n else {\r\n throw new Error(\"WidgetData.Get: Videos were not filtered, more than one is being returned.\");\r\n }\r\n }\r\n delete (setup.form.video as Partial>).sourceList;\r\n delete (setup.form.video as unknown as { documentList: any }).documentList;\r\n }\r\n if (\"offerId\" in tracking === false && isArray(setup.form.video.selected) === false) {\r\n tracking.offerId = setup.form.video.selected.salesforceOfferId;\r\n }\r\n delete setup.form.video.selected.salesforceOfferId;\r\n }\r\n else if (isParsedResourceFormSetup(setup)) {\r\n if (\"sourceList\" in setup.form.document) {\r\n if (\"selected\" in setup.form.document === false) {\r\n (setup.form.document as unknown as SelectedMultiResource).selected = [...((setup.form.document as any).sourceList as DocumentResource[])];\r\n }\r\n delete (setup.form.document as Partial).sourceList;\r\n }\r\n if (\"offerId\" in tracking === false && setup.form.document.selectedListWillBeSingleDocument) {\r\n tracking.offerId = setup.form.document.selected[0].salesforceOfferId;\r\n }\r\n delete (setup.form.document as Partial).selectedListWillBeSingleDocument;\r\n delete (setup.form.document as Partial).isFilteredOrChosen;\r\n // [setup.form.document.selected].flat().forEach((doc) => {\r\n // delete doc.salesforceOfferId;\r\n // });\r\n }\r\n }\r\n return setup as unknown as FinalWidgetData;\r\n },\r\n} as const;\r\n\r\ntype ModifierKeys = keyof typeof getModifiers;\r\n\r\nexport type ModifiersObj = {\r\n [K in ModifierKeys]?: Parameters[1] | undefined\r\n}\r\n\r\nconst rawDataArray: ParsedWidgetData[] = [];\r\n\r\nexport function AddWidgetData (widgetDataObj: CreateWidgetData) {\r\n if (isNil(widgetDataObj)) {\r\n console.error(\r\n \"WidgetData.Add: Main Parameter 'widgetDataObj' is not set.\"\r\n );\r\n return;\r\n }\r\n\r\n else if (isCreateWidgetData(widgetDataObj, true) === false) {\r\n throw new Error(\"WidgetData doesn't match the type definition\");\r\n }\r\n\r\n // Assign default values before checking for required props\r\n const parsed = assignDefaultValues(widgetDataObj);\r\n // Check top level widgetDataObj requirements are met\r\n if (hasPropWithType(parsed, \"setup\", isArray)) {\r\n parsed.setup.forEach((setup) => {\r\n if (hasPropWithType(setup, \"tracking\", isObject) && hasPropWithType(setup.tracking, \"salesforce\", isObject)) {\r\n setup.tracking = { ...setup.tracking.salesforce, ...setup.tracking };\r\n }\r\n removeUnwantedProps(setup);\r\n });\r\n }\r\n\r\n rawDataArray.push(parsed as ParsedWidgetData);\r\n\r\n if (isParsedWidgetData(parsed, false) === false) {\r\n throw new Error(\"Parsed widget data does not match the type definition.\");\r\n }\r\n}\r\n\r\nexport function GetWidgetData(widgetInstanceId: string, modifiersObj?: ModifiersObj | undefined): FinalWidgetData {\r\n modifiersObj = modifiersObj || {};\r\n const originalWidgetDataObj = rawDataArray.find(function (data) {\r\n return data.widget.instanceId === widgetInstanceId;\r\n });\r\n // Clone the widget data since we're making changes to the result\r\n const rawWidgetDataObj = JSON.parse(\r\n JSON.stringify(originalWidgetDataObj)\r\n ) as ParsedWidgetData;\r\n\r\n const widgetDataObj = getModifiers.setupName(rawWidgetDataObj, modifiersObj.setupName);\r\n if (hasPropWithType(modifiersObj, \"setupName\", isString)) {\r\n delete (modifiersObj as Partial).setupName;\r\n }\r\n\r\n // Iterate through passed modifiers\r\n if (isObject(modifiersObj)) {\r\n (Object.keys(modifiersObj) as ModifierKeys[]).forEach((key: ModifierKeys) => {\r\n if (key in getModifiers && modifiersObj && (isNil(modifiersObj?.[key]) === false)) {\r\n (getModifiers[key] as (...args: any[]) => void)(\r\n widgetDataObj,\r\n modifiersObj[key]\r\n );\r\n } else {\r\n console.error(\r\n `WidgetData.Get: getModifiers does not contain the key '${key}'`\r\n );\r\n }\r\n });\r\n }\r\n\r\n // Cleanup modifier\r\n getModifiers.cleanup(widgetDataObj as FinalWidgetData);\r\n\r\n if (isFinalWidgetData(widgetDataObj) === false) {\r\n throw new Error(\"WidgetData is not formatted correctly\");\r\n }\r\n\r\n return widgetDataObj as FinalWidgetData;\r\n}\r\n\r\nexport function GetRawWidgetData () {\r\n return rawDataArray;\r\n}\r\n\r\n\r\nexport interface IAppStateWidgetData {\r\n Add: typeof AddWidgetData;\r\n Get: typeof GetWidgetData;\r\n __getRawWidgetData: typeof GetRawWidgetData;\r\n}\r\n", "// index.ts\nimport { ref, getCurrentInstance, defineComponent } from \"vue\";\nvar slotPattern;\nfunction install(app, {\n i18next,\n rerenderOn = [\"languageChanged\", \"loaded\", \"added\", \"removed\"],\n slotStart = \"{\",\n slotEnd = \"}\"\n}) {\n const genericT = i18next.t.bind(i18next);\n const lastI18nChange = ref(new Date());\n const invalidate = () => lastI18nChange.value = new Date();\n const usingI18n = () => lastI18nChange.value;\n rerenderOn.forEach((event) => {\n var _a;\n switch (event) {\n case \"added\":\n case \"removed\":\n (_a = i18next.store) == null ? void 0 : _a.on(event, invalidate);\n break;\n default:\n i18next.on(event, invalidate);\n break;\n }\n });\n app.component(\"i18next\", TranslationComponent);\n app.mixin({\n beforeCreate() {\n var _a, _b;\n const options = this.$options;\n if (!options.__i18n && !options.i18nOptions) {\n this.__translate = void 0;\n return;\n }\n const name = this.$options.name;\n const rand = (Math.random() * 10 ** 8 | 0).toString();\n const localNs = [name, rand].filter((x) => !!x).join(\"-\");\n this.__bundles = [];\n const loadBundle = (bundle) => {\n Object.entries(bundle).forEach(([lng2, resources]) => {\n i18next.addResourceBundle(lng2, localNs, resources, true, false);\n this.__bundles.push([lng2, localNs]);\n });\n };\n (_a = options.__i18n) == null ? void 0 : _a.forEach((bundle) => {\n loadBundle(JSON.parse(bundle));\n });\n let { lng, ns, keyPrefix } = handleI18nOptions(options, loadBundle);\n if ((_b = this.__bundles) == null ? void 0 : _b.length) {\n ns = [localNs].concat(ns != null ? ns : []);\n }\n const t = getTranslationFunction(lng, ns);\n this.__translate = (key, options2) => {\n if (!keyPrefix || includesNs(key)) {\n return t(key, options2);\n } else {\n return t(keyPrefix + \".\" + key, options2);\n }\n };\n },\n unmounted() {\n var _a;\n (_a = this.__bundles) == null ? void 0 : _a.forEach(([lng, ns]) => i18next.removeResourceBundle(lng, ns));\n }\n });\n app.config.globalProperties.$t = function(key, options) {\n var _a;\n usingI18n();\n if (i18next.isInitialized) {\n return ((_a = this == null ? void 0 : this.__translate) != null ? _a : genericT)(key, options);\n } else {\n return key;\n }\n };\n app.config.globalProperties.$i18next = new Proxy(i18next, {\n get(target, prop) {\n usingI18n();\n return Reflect.get(target, prop);\n }\n });\n slotPattern = slotNamePattern(slotStart, slotEnd);\n function getTranslationFunction(lng, ns) {\n if (lng) {\n return i18next.getFixedT(lng, ns);\n } else if (ns) {\n return i18next.getFixedT(null, ns);\n } else {\n return genericT;\n }\n }\n function includesNs(key) {\n const nsSeparator = i18next.options.nsSeparator;\n return typeof nsSeparator === \"string\" && key.includes(nsSeparator);\n }\n function handleI18nOptions(options, loadBundle) {\n let lng;\n let ns;\n let keyPrefix;\n if (options.i18nOptions) {\n let messages;\n let namespaces;\n ({\n lng,\n namespaces = i18next.options.defaultNS,\n keyPrefix,\n messages\n } = options.i18nOptions);\n if (messages) {\n loadBundle(messages);\n }\n ns = typeof namespaces === \"string\" ? [namespaces] : namespaces;\n if (ns) {\n i18next.loadNamespaces(ns);\n }\n }\n return { lng, ns, keyPrefix };\n }\n}\nfunction useTranslation() {\n const instance = currentInstance();\n const globalProps = instance.appContext.config.globalProperties;\n return {\n i18next: globalProps.$i18next,\n t: globalProps.$t.bind(instance.proxy)\n };\n}\nfunction currentInstance() {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error(\"i18next-vue: No Vue instance in context. Make sure to register the i18next-vue plugin using app.use(...).\");\n }\n return instance;\n}\nfunction slotNamePattern(start, end) {\n const pattern = `${start}\\\\s*([a-z0-9\\\\-]+)\\\\s*${end}`;\n return new RegExp(pattern, \"gi\");\n}\nvar TranslationComponent = defineComponent({\n props: {\n \"translation\": {\n type: String,\n required: true\n }\n },\n setup(props, { slots }) {\n return () => {\n const translation = props.translation;\n const result = [];\n let match;\n let lastIndex = 0;\n while ((match = slotPattern.exec(translation)) !== null) {\n result.push(translation.substring(lastIndex, match.index));\n const slot = slots[match[1]];\n if (slot) {\n result.push(...slot());\n } else {\n result.push(match[0]);\n }\n lastIndex = slotPattern.lastIndex;\n }\n result.push(translation.substring(lastIndex));\n return result;\n };\n }\n});\nexport {\n TranslationComponent,\n install as default,\n useTranslation\n};\n", "import type { ExpandShallow } from \"@mcwd/typescript-type-guards\";\r\nimport type { ICountryLocale } from \"./ICountryLocale.js\";\r\nimport type { ILanguageCountryLocale } from \"./ILanguageCountryLocale.js\";\r\n\r\nexport type UrlPrefixType = [string] extends [TSiteCountryCode] ? string : (\"us\" extends TSiteCountryCode ? \"\" : `/${TSiteCountryCode}`);\r\n\r\nexport interface ISiteLocale<\r\n TSiteCountryCode extends string = string,\r\n TLanguageName extends string = string,\r\n TLanguageLocale extends string = string,\r\n TCountryName extends string = string,\r\n TCountryLocale extends string = string,\r\n TUrlPrefix extends UrlPrefixType = UrlPrefixType,\r\n TExtendedCountryLocales extends [] | [ICountryLocale, ...ICountryLocale[]] = [] | [ICountryLocale, ...ICountryLocale[]]\r\n> extends ILanguageCountryLocale {\r\n SiteCountryCode: TSiteCountryCode,\r\n SiteCountryCodeUppercase: Uppercase,\r\n UrlPrefix: TUrlPrefix,\r\n ExtendedCountryLocales: TExtendedCountryLocales\r\n}\r\n\r\nexport type ISiteLocaleWithExtendedCountryLocales<\r\n TSiteCountryCode extends string = string,\r\n TLanguageName extends string = string,\r\n TLanguageLocale extends string = string,\r\n TCountryName extends string = string,\r\n TCountryLocale extends string = string,\r\n TUrlPrefix extends UrlPrefixType = UrlPrefixType,\r\n TExtendedCountryLocales extends [ICountryLocale, ...ICountryLocale[]] = [ICountryLocale, ...ICountryLocale[]]\r\n> = ISiteLocale;\r\n\r\nexport function isSiteLocaleWithExtendedCountryLocales(value: ISiteLocale): value is ISiteLocaleWithExtendedCountryLocales {\r\n return (value.ExtendedCountryLocales.length > 0);\r\n}\r\n\r\n\r\n\r\nexport type ISiteLocaleKey = ExpandShallow;", "import type { ICountryLocale } from \"./ICountryLocale.js\";\r\n\r\nexport function createCountryLocale<\r\n const TCountryName extends string,\r\n const TCountryLocale extends string\r\n>({ countryName, countryLocale }: { countryName: TCountryName, countryLocale: TCountryLocale }) {\r\n const locale = {\r\n CountryName: countryName,\r\n CountryLocale: countryLocale,\r\n CountryLocaleUppercase: countryLocale.toUpperCase() as Uppercase,\r\n } as const satisfies ICountryLocale;\r\n Object.freeze(locale);\r\n\r\n return locale;\r\n}", "import type { ILanguageLocale } from \"./ILanguageLocale.js\";\r\n \r\nexport function createLanguageLocale<\r\n const TLanguageName extends string,\r\n const TLanguageLocale extends string\r\n>({ languageName, languageLocale }: { languageName: TLanguageName, languageLocale: TLanguageLocale }) {\r\n const locale = {\r\n LanguageName: languageName,\r\n LanguageLocale: languageLocale,\r\n LanguageLocaleUppercase: languageLocale.toUpperCase() as Uppercase,\r\n } as const satisfies ILanguageLocale;\r\n Object.freeze(locale);\r\n\r\n return locale;\r\n}", "import type { ILanguageCountryLocale } from \"./ILanguageCountryLocale.js\";\r\nimport { createCountryLocale } from \"./createCountryLocale.js\";\r\nimport { createLanguageLocale } from \"./createLanguageLocale.js\";\r\n\r\nexport function createLanguageCountryLocale<\r\n const TLanguageName extends string,\r\n const TCountryName extends string,\r\n const TLanguageLocale extends string,\r\n const TCountryLocale extends string\r\n>({\r\n languageName,\r\n countryName,\r\n languageLocale,\r\n countryLocale\r\n}: {\r\n languageName: TLanguageName,\r\n countryName: TCountryName,\r\n languageLocale: TLanguageLocale,\r\n countryLocale: TCountryLocale\r\n}) {\r\n const languageCountryLocale = `${languageLocale}-${countryLocale.toUpperCase() as Uppercase}` as const;\r\n const locale = {\r\n ...createLanguageLocale({ languageName, languageLocale }),\r\n ...createCountryLocale({ countryName, countryLocale }),\r\n LanguageCountryLocale: languageCountryLocale,\r\n LanguageCountryLocaleLowercase: (languageCountryLocale as string).toLowerCase() as `${Lowercase}-${Lowercase}`,\r\n LanguageCountryLocaleUppercase: (languageCountryLocale as string).toUpperCase() as `${Uppercase}-${Uppercase}`,\r\n } as const satisfies ILanguageCountryLocale;\r\n\r\n Object.freeze(locale);\r\n\r\n return locale;\r\n}", "import type { ICountryLocale } from \"./ICountryLocale.js\";\r\nimport type { ISiteLocale, UrlPrefixType } from \"./ISiteLocale.js\";\r\nimport { createLanguageCountryLocale } from \"./createLanguageCountryLocale.js\";\r\n\r\n\r\nexport function createSiteLocale<\r\n const TSiteCountryCode extends string,\r\n const TLanguageName extends string,\r\n const TLanguageLocale extends string,\r\n const TCountryName extends string,\r\n const TCountryLocale extends string,\r\n const TExtendedCountryLocales extends [] | [ICountryLocale, ...ICountryLocale[]]\r\n>({\r\n siteCountryCode,\r\n languageLocale,\r\n languageName,\r\n countryLocale,\r\n countryName,\r\n}:\r\n{\r\n siteCountryCode: TSiteCountryCode,\r\n languageLocale: TLanguageLocale,\r\n languageName: TLanguageName,\r\n countryLocale: TCountryLocale,\r\n countryName: TCountryName,\r\n}, ...extendedCountryLocales: TExtendedCountryLocales)\r\n{\r\n const urlPrefix = (\r\n siteCountryCode === \"us\"\r\n ? \"\"\r\n : `/${siteCountryCode}`\r\n ) as UrlPrefixType;\r\n\r\n type TUrlPrefix = typeof urlPrefix;\r\n\r\n\r\n Object.freeze(extendedCountryLocales);\r\n\r\n\r\n const siteLocale = {\r\n ...createLanguageCountryLocale({ languageName, languageLocale, countryName, countryLocale }),\r\n SiteCountryCode: siteCountryCode,\r\n SiteCountryCodeUppercase: siteCountryCode.toUpperCase() as Uppercase,\r\n UrlPrefix: urlPrefix,\r\n ExtendedCountryLocales: extendedCountryLocales\r\n } as const satisfies ISiteLocale<\r\n TSiteCountryCode,\r\n TLanguageName,\r\n TLanguageLocale,\r\n TCountryName,\r\n TCountryLocale,\r\n TUrlPrefix,\r\n TExtendedCountryLocales\r\n >;\r\n \r\n Object.freeze(siteLocale);\r\n return siteLocale;\r\n}", "import { isSiteLocaleWithExtendedCountryLocales, type ISiteLocale } from \"./create/ISiteLocale.js\";\r\nimport { createSiteLocale } from \"./create/createSiteLocale.js\";\r\nimport { createCountryLocale } from \"./create/createCountryLocale.js\";\r\n\r\nimport { convertArrayToPropIndexedObject, type ConvertArrayToPropIndexedObject } from \"@mcwd/typescript-type-guards\";\r\nimport type { BuildOnlyLocaleSettingsWithExtendedCountryLocales_Array } from \"./create/BuildOnlyLocaleSettingsWithExtendedCountryLocales_Array.js\";\r\n\r\nconst Additional_APAC = [\r\n createCountryLocale({ countryName: \"India\", countryLocale: \"in\" }),\r\n createCountryLocale({ countryName: \"Singapore\", countryLocale: \"sg\" }),\r\n createCountryLocale({ countryName: \"Malaysia\", countryLocale: \"my\" }),\r\n createCountryLocale({ countryName: \"Pakistan\", countryLocale: \"pk\" }),\r\n createCountryLocale({ countryName: \"Bangladesh\", countryLocale: \"bd\" }),\r\n createCountryLocale({ countryName: \"New Zealand\", countryLocale: \"nz\" }),\r\n createCountryLocale({ countryName: \"Vietnam\", countryLocale: \"vn\" }),\r\n createCountryLocale({ countryName: \"Thailand\", countryLocale: \"th\" }),\r\n] as const;\r\n\r\nconst Additional_EMEA = [\r\n createCountryLocale({ countryName: \"Germany\", countryLocale: \"de\" }),\r\n createCountryLocale({ countryName: \"Sweden\", countryLocale: \"se\" }),\r\n createCountryLocale({ countryName: \"Denmark\", countryLocale: \"dk\" }),\r\n createCountryLocale({ countryName: \"Belgium\", countryLocale: \"be\" }),\r\n createCountryLocale({ countryName: \"Ireland\", countryLocale: \"ie\" }),\r\n createCountryLocale({ countryName: \"Italy\", countryLocale: \"it\" }),\r\n createCountryLocale({ countryName: \"Spain\", countryLocale: \"es\" }),\r\n createCountryLocale({ countryName: \"Poland\", countryLocale: \"pl\" }),\r\n createCountryLocale({ countryName: \"Portugal\", countryLocale: \"pt\" }),\r\n createCountryLocale({ countryName: \"Austria\", countryLocale: \"at\" }),\r\n createCountryLocale({ countryName: \"Norway\", countryLocale: \"no\" }),\r\n createCountryLocale({ countryName: \"Romania\", countryLocale: \"ro\" }),\r\n createCountryLocale({ countryName: \"Greece\", countryLocale: \"gr\" }),\r\n createCountryLocale({ countryName: \"Hungary\", countryLocale: \"hu\" }),\r\n createCountryLocale({ countryName: \"Czechia\", countryLocale: \"cz\" }),\r\n createCountryLocale({ countryName: \"Luxembourg\", countryLocale: \"lu\" }),\r\n createCountryLocale({ countryName: \"Croatia\", countryLocale: \"hr\" }),\r\n createCountryLocale({ countryName: \"Malta\", countryLocale: \"mt\" }),\r\n createCountryLocale({ countryName: \"Slovakia\", countryLocale: \"sk\" }),\r\n] as const;\r\n\r\nexport const LocaleSettingsArray = [\r\n createSiteLocale({\r\n siteCountryCode: \"us\",\r\n languageName: \"English\",\r\n languageLocale: \"en\",\r\n countryName: \"United States\",\r\n countryLocale: \"us\",\r\n }),\r\n createSiteLocale({\r\n siteCountryCode: \"uk\",\r\n languageName: \"English\",\r\n languageLocale: \"en\",\r\n countryName: \"United Kingdom\",\r\n countryLocale: \"gb\",\r\n }, ...Additional_EMEA),\r\n createSiteLocale({\r\n siteCountryCode: \"au\",\r\n languageName: \"English\",\r\n languageLocale: \"en\",\r\n countryName: \"Australia\",\r\n countryLocale: \"au\",\r\n }, ...Additional_APAC),\r\n createSiteLocale({\r\n siteCountryCode: \"fr\",\r\n languageName: \"French\",\r\n languageLocale: \"fr\",\r\n countryName: \"France\",\r\n countryLocale: \"fr\",\r\n }),\r\n createSiteLocale({\r\n siteCountryCode: \"jp\",\r\n languageName: \"Japanese\",\r\n languageLocale: \"ja\",\r\n countryName: \"Japan\",\r\n countryLocale: \"jp\",\r\n }),\r\n createSiteLocale({\r\n siteCountryCode: \"kr\",\r\n languageName: \"Korean\",\r\n languageLocale: \"ko\",\r\n countryName: \"Korea\",\r\n countryLocale: \"kr\",\r\n }),\r\n createSiteLocale({\r\n siteCountryCode: \"cn\",\r\n languageName: \"Chinese (Simplified)\",\r\n languageLocale: \"zh\",\r\n countryName: \"China\",\r\n countryLocale: \"cn\",\r\n }),\r\n] as const satisfies ISiteLocale[];\r\n\r\nexport type LocaleSettingsArray = typeof LocaleSettingsArray;\r\n\r\n\r\nexport type SiteLocaleWithExtendedCountryLocaleArray = BuildOnlyLocaleSettingsWithExtendedCountryLocales_Array;\r\nexport const SiteLocaleWithExtendedCountryLocaleArray = LocaleSettingsArray.filter(isSiteLocaleWithExtendedCountryLocales) as SiteLocaleWithExtendedCountryLocaleArray;\r\n\r\n\r\nexport const SiteLocaleSettings = convertArrayToPropIndexedObject(LocaleSettingsArray, \"SiteCountryCode\");\r\nexport type SiteLocaleSettings = ConvertArrayToPropIndexedObject;\r\n\r\n\r\n\r\nObject.freeze(LocaleSettingsArray);\r\nObject.freeze(SiteLocaleSettings);\r\n", "import { mapArrayToProp } from \"@mcwd/typescript-type-guards\";\r\nimport { LocaleSettingsArray } from \"../locale-settings.js\";\r\n\r\n/**\r\n * The 2 letter country codes used on our site.\r\n */\r\nexport const SiteCountryCode = mapArrayToProp(LocaleSettingsArray, \"SiteCountryCode\");\r\nexport type SiteCountryCode = typeof SiteCountryCode[number];\r\n\r\n/**\r\n * The 2 letter country codes used on our site.\r\n */\r\nexport const SiteCountryCodeUppercase = mapArrayToProp(LocaleSettingsArray, \"SiteCountryCodeUppercase\");\r\nexport type SiteCountryCodeUppercase = typeof SiteCountryCodeUppercase[number];\r\n\r\n/**\r\n * The 2 letter country codes used on our site.\r\n */\r\nexport const SiteCountryCodeAnyCase = [...SiteCountryCode, ...SiteCountryCodeUppercase] as const;\r\nexport type SiteCountryCodeAnyCase = typeof SiteCountryCodeAnyCase[number];\r\n\r\nexport function isSiteCountryCode(value: unknown): value is SiteCountryCode {\r\n return (SiteCountryCode as readonly string[]).includes((value as string));\r\n}\r\n\r\nexport function isSiteCountryCodeUppercase(value: unknown): value is SiteCountryCodeUppercase {\r\n return (SiteCountryCodeUppercase as readonly string[]).includes((value as string));\r\n}", "import { convertArrayToPropIndexedObject, flatMapArrayToNestedProp, type ConvertArrayToPropIndexedObject, type FlatMapArrayToNestedProp } from \"@mcwd/typescript-type-guards\";\r\nimport { LocaleSettingsArray } from \"../locale-settings.js\";\r\n\r\n\r\nexport type ExtendedLocales = FlatMapArrayToNestedProp;\r\nexport const ExtendedLocales = flatMapArrayToNestedProp(LocaleSettingsArray, [\"ExtendedCountryLocales\"] as const);\r\n\r\nexport type ExtendedLocaleSettingsObject = ConvertArrayToPropIndexedObject;\r\nexport const ExtendedLocaleSettingsObject = convertArrayToPropIndexedObject(ExtendedLocales, \"CountryLocale\");\r\n\r\n\r\nexport type ExtendedLocaleCountry = ExtendedLocales[number][\"CountryLocale\"];\r\nexport const ExtendedLocaleCountry = flatMapArrayToNestedProp(ExtendedLocales, [\"CountryLocale\"]);\r\n\r\n\r\n// type buildExtendedLocaleOnlySplitObjects \r\n// = \r\n// type buildExtendedLocaleOnlySettings\r\n\r\nexport type ExtendedLocaleOnlySettings = FlatMapArrayToNestedProp;\r\nexport const ExtendedLocaleOnlySettings = flatMapArrayToNestedProp(LocaleSettingsArray, [\"ExtendedCountryLocales\"] as const);", "import { exhaustiveGuard, type ConvertArrayToDeepPropIndexedObject, type ConvertArrayToPropIndexedObject, type TryGetValue, type WithDefault } from \"@mcwd/typescript-type-guards\";\r\nimport { LocaleSettingsArray, SiteLocaleSettings, SiteLocaleWithExtendedCountryLocaleArray } from \"../locale-settings.js\";\r\nimport type { LanguageCountryLocaleAnyCase } from \"./LanguageCountryLocale.js\";\r\nimport { isSiteCountryCode, type SiteCountryCodeAnyCase } from \"./SiteCountryCode.js\";\r\nimport type { CountryLocale, CountryLocaleAnyCase } from \"./CountryLocale.js\";\r\nimport type { ILanguageCountryLocale } from \"../create/ILanguageCountryLocale.js\";\r\nimport type { ICountryLocale } from \"../create/ICountryLocale.js\";\r\nimport type { ILocaleArray } from \"../create/ILocaleArray.js\";\r\nimport { ExtendedLocaleSettingsObject, type ExtendedLocaleCountry } from \"./ExtendedLocale.js\";\r\nimport type { ISiteLocaleWithExtendedCountryLocales } from \"../create/ISiteLocale.js\";\r\n\r\n\r\ntype DefaultFromThrowIfMissing\r\n = WithDefault extends true\r\n ? never\r\n : null;\r\n\r\ntype SettingsIndexedByCountryLocale> = ConvertArrayToPropIndexedObject;\r\ntype SettingsIndexedByLanguageCountryLocale> = ConvertArrayToPropIndexedObject;\r\ntype SettingsIndexedByExtendedLocale = ConvertArrayToDeepPropIndexedObject;\r\n\r\nexport namespace GetLocale {\r\n\r\n export type byCountryLocale<\r\n TLocaleArray extends ILocaleArray,\r\n TCountryLocale extends TLocaleArray[number][\"CountryLocale\"] | TLocaleArray[number][\"CountryLocaleUppercase\"],\r\n TDefault = never\r\n > = TryGetValue, Lowercase, TDefault>;\r\n\r\n export function byCountryLocale<\r\n TLocaleArray extends ILocaleArray,\r\n TCountryLocale extends TLocaleArray[number][\"CountryLocale\"] | TLocaleArray[number][\"CountryLocaleUppercase\"],\r\n const TThrowIfMissing extends boolean | undefined\r\n >(\r\n localeArray: TLocaleArray,\r\n countryLocale: TCountryLocale,\r\n throwIfMissing?: TThrowIfMissing\r\n ): byCountryLocale>\r\n {\r\n type ThisReturnType = byCountryLocale>\r\n const countryLocaleLower = countryLocale.toLowerCase() as CountryLocale;\r\n const res = localeArray.find(el => el.CountryLocale === countryLocaleLower);\r\n if (res) {\r\n return res as ThisReturnType;\r\n }\r\n else if (throwIfMissing){\r\n throw new Error(`ERROR! Unexpected value for parameter 'countryLocale': ${countryLocale}`);\r\n }\r\n return null as ThisReturnType;\r\n }\r\n\r\n export type byLanguageCountryLocale<\r\n TLocaleArray extends ILocaleArray,\r\n TLanguageCountryLocale extends TLocaleArray[number][\"LanguageCountryLocale\"] | TLocaleArray[number][\"LanguageCountryLocaleUppercase\"] | TLocaleArray[number][\"LanguageCountryLocaleLowercase\"],\r\n TDefault = never\r\n > = TryGetValue, Lowercase, TDefault>;\r\n\r\n export function byLanguageCountryLocale<\r\n TLocaleArray extends ILocaleArray,\r\n TLanguageCountryLocale extends TLocaleArray[number][\"LanguageCountryLocale\"] | TLocaleArray[number][\"LanguageCountryLocaleUppercase\"] | TLocaleArray[number][\"LanguageCountryLocaleLowercase\"],\r\n const TThrowIfMissing extends boolean | undefined\r\n >(\r\n localeArray: TLocaleArray,\r\n languageCountryLocale: TLanguageCountryLocale,\r\n throwIfMissing?: TThrowIfMissing\r\n ): byLanguageCountryLocale> {\r\n type ThisReturnType = byLanguageCountryLocale>;\r\n const langCountryLocaleLower = languageCountryLocale.toLowerCase() as Lowercase;\r\n const res = localeArray.find(el => el.LanguageCountryLocaleLowercase === langCountryLocaleLower);\r\n if (res) {\r\n res as ThisReturnType;\r\n }\r\n else if (throwIfMissing) {\r\n throw new Error(`ERROR! Unexpected value for parameter 'languageCountryLocale': ${languageCountryLocale}`);\r\n }\r\n return null as ThisReturnType;\r\n }\r\n}\r\n\r\nexport namespace GetExtendedLocale {\r\n export type byCountryLocale\r\n = ExtendedLocaleSettingsObject[Lowercase] | TDefault;\r\n\r\n export function byCountryLocale<\r\n TExtendedCountryLocale extends ExtendedLocaleCountry | Uppercase,\r\n const TThrowIfMissing extends boolean | undefined\r\n >(\r\n extendedCountryLocale: TExtendedCountryLocale,\r\n throwIfMissing?: TThrowIfMissing\r\n ): byCountryLocale, DefaultFromThrowIfMissing> {\r\n type ThisReturnType = byCountryLocale, DefaultFromThrowIfMissing>\r\n const countryLocaleLower = extendedCountryLocale.toLowerCase() as ExtendedLocaleCountry;\r\n const res = ExtendedLocaleSettingsObject[countryLocaleLower];\r\n if (res) {\r\n return res as ThisReturnType;\r\n }\r\n else if (throwIfMissing) {\r\n throw new Error(`ERROR! Unexpected value for parameter 'countryLocale': ${extendedCountryLocale}`);\r\n }\r\n return null as ThisReturnType;\r\n }\r\n}\r\n\r\nexport namespace GetSiteLocale {\r\n\r\n export type bySiteCountryCode<\r\n TSiteCountryCode extends SiteCountryCodeAnyCase,\r\n TDefault = never\r\n > = SiteLocaleSettings[Lowercase] | TDefault;\r\n\r\n export function bySiteCountryCode<\r\n const TSiteCountryCode extends SiteCountryCodeAnyCase,\r\n const TThrowIfMissing extends boolean | undefined\r\n\r\n >(\r\n siteCountryCode: TSiteCountryCode,\r\n throwIfMissing?: TThrowIfMissing\r\n ): bySiteCountryCode> {\r\n type ThisReturnType = bySiteCountryCode>;\r\n const lowerCaseSiteCountryCode = siteCountryCode.toLowerCase() as Lowercase;\r\n if (isSiteCountryCode(lowerCaseSiteCountryCode)) {\r\n const result = SiteLocaleSettings[lowerCaseSiteCountryCode];\r\n if (result) {\r\n return result;\r\n }\r\n }\r\n else if (throwIfMissing) {\r\n // Needs to be in an else statement in order to use exhaustiveGuard\r\n exhaustiveGuard(lowerCaseSiteCountryCode, \"ERROR! Unexpected value for parameter 'siteCountryCode'\");\r\n }\r\n if (throwIfMissing) {\r\n // Runtime error\r\n throw new Error(`ERROR! Unexpected value for parameter 'siteCountryCode': \"${lowerCaseSiteCountryCode}\"`);\r\n }\r\n return null as ThisReturnType;\r\n }\r\n\r\n\r\n export type byLanguageCountryLocale<\r\n TLanguageCountryLocale extends LanguageCountryLocaleAnyCase,\r\n TDefault = never\r\n > = SettingsIndexedByLanguageCountryLocale[Lowercase] | TDefault;\r\n\r\n export function byLanguageCountryLocale<\r\n TLanguageCountryLocale extends LanguageCountryLocaleAnyCase,\r\n const TThrowIfMissing extends boolean | undefined\r\n >(\r\n languageCountryLocale: TLanguageCountryLocale,\r\n throwIfMissing?: TThrowIfMissing\r\n ): byLanguageCountryLocale> {\r\n type ThisReturnType = byLanguageCountryLocale>;\r\n const result = GetLocale.byLanguageCountryLocale(LocaleSettingsArray, languageCountryLocale);\r\n if (result) {\r\n return result as ThisReturnType;\r\n }\r\n if (throwIfMissing) {\r\n throw new Error(`ERROR! Unexpected value for parameter 'languageCountryLocale': \"${languageCountryLocale}\"`);\r\n }\r\n return null as ThisReturnType;\r\n }\r\n\r\n\r\n export type byCountryLocale<\r\n TCountryLocale extends CountryLocaleAnyCase,\r\n TDefault = never\r\n > = SettingsIndexedByCountryLocale[Lowercase] | TDefault;\r\n\r\n export function byCountryLocale<\r\n TCountryLocale extends CountryLocaleAnyCase,\r\n const TThrowIfMissing extends boolean | undefined\r\n >(\r\n countryLocale: TCountryLocale,\r\n throwIfMissing?: TThrowIfMissing\r\n ): byCountryLocale> {\r\n type ThisReturnType = byCountryLocale>;\r\n const countryLocaleLower = countryLocale.toLowerCase() as CountryLocale;\r\n const res = LocaleSettingsArray.find(el => el.CountryLocale === countryLocaleLower);\r\n\r\n if (res) {\r\n return res as ThisReturnType;\r\n }\r\n if (throwIfMissing) {\r\n throw new Error(`ERROR! Unexpected value for parameter 'countryLocale': ${countryLocale}`);\r\n }\r\n return null as ThisReturnType;\r\n }\r\n\r\n export type byExtendedCountryLocale<\r\n TExtendedCountryLocale extends\r\n | ExtendedLocaleCountry\r\n | Uppercase,\r\n TDefault = never,\r\n TSettingsObject extends SettingsIndexedByExtendedLocale = SettingsIndexedByExtendedLocale\r\n > = TSettingsObject[Lowercase] | TDefault\r\n\r\n\r\n export function byExtendedCountryLocale<\r\n TExtendedCountryLocale extends\r\n | ExtendedLocaleCountry\r\n | Uppercase,\r\n const TThrowIfMissing extends boolean | undefined\r\n >(\r\n extendedCountryLocale: TExtendedCountryLocale,\r\n throwIfMissing?: TThrowIfMissing\r\n ): byExtendedCountryLocale>\r\n {\r\n type ThisReturnType = byExtendedCountryLocale>;\r\n const extendedCountryLocaleLower = extendedCountryLocale.toLowerCase() as ExtendedLocaleCountry;\r\n const res = SiteLocaleWithExtendedCountryLocaleArray.find((siteLocale: ISiteLocaleWithExtendedCountryLocales) => {\r\n return siteLocale.ExtendedCountryLocales.findIndex((extendedLoc: ICountryLocale) => (extendedLoc.CountryLocale === extendedCountryLocaleLower)) > -1;\r\n });\r\n if (res) {\r\n return res as ThisReturnType;\r\n }\r\n if (throwIfMissing) {\r\n throw new Error(`ERROR! Unexpected value for parameter 'extendedCountryLocale': ${extendedCountryLocale}`);\r\n }\r\n return null as ThisReturnType;\r\n }\r\n}", "import type { LanguageCountryLocale, LanguageCountryLocaleAnyCase } from \"./LanguageCountryLocale.js\";\r\nimport { type SiteCountryCodeAnyCase } from \"./SiteCountryCode.js\";\r\nimport { GetSiteLocale } from \"./GetSiteLocaleBy.js\";\r\nimport type { ISiteLocale } from \"../create/ISiteLocale.js\";\r\nimport type { WithDefault } from \"@mcwd/typescript-type-guards\";\r\n\r\ntype DefaultFromThrowIfMissing\r\n = WithDefault extends true\r\n ? never\r\n : null;\r\n\r\nexport namespace LocaleConvert {\r\n export namespace FromSiteCountryCode {\r\n type GetLocaleProp<\r\n TSiteCountryCode extends SiteCountryCodeAnyCase,\r\n TProp extends keyof ISiteLocale,\r\n TDefault = never\r\n > = GetSiteLocale.bySiteCountryCode[TProp] | TDefault;\r\n \r\n export type ToUrlPrefix<\r\n TSiteCountryCode extends SiteCountryCodeAnyCase,\r\n TDefault = never\r\n > = GetLocaleProp;\r\n\r\n export function ToUrlPrefix<\r\n TSiteCountryCode extends SiteCountryCodeAnyCase,\r\n const TThrowIfMissing extends boolean | undefined\r\n >(\r\n siteCountryCode: TSiteCountryCode,\r\n throwIfMissing?: TThrowIfMissing\r\n ): ToUrlPrefix> {\r\n type ThisReturnType = ToUrlPrefix>;\r\n \r\n return GetSiteLocale.bySiteCountryCode(siteCountryCode, throwIfMissing)?.UrlPrefix as ThisReturnType;\r\n }\r\n\r\n export type ToLanguageCountryLocale<\r\n TSiteCountryCode extends SiteCountryCodeAnyCase,\r\n TDefault = never\r\n > = GetLocaleProp;\r\n\r\n export function ToLanguageCountryLocale<\r\n TSiteCountryCode extends SiteCountryCodeAnyCase,\r\n const TThrowIfMissing extends boolean | undefined\r\n >(\r\n siteCountryCode: TSiteCountryCode,\r\n throwIfMissing?: TThrowIfMissing\r\n ): ToLanguageCountryLocale> {\r\n type ThisReturnType = ToLanguageCountryLocale>;\r\n return GetSiteLocale.bySiteCountryCode(siteCountryCode, throwIfMissing)?.LanguageCountryLocale as ThisReturnType;\r\n }\r\n }\r\n\r\n export namespace FromLanguageCountry {\r\n type GetLocaleProp<\r\n TLocale extends LanguageCountryLocaleAnyCase,\r\n TProp extends keyof ISiteLocale,\r\n TDefault = never\r\n > = GetSiteLocale.byLanguageCountryLocale[TProp] | TDefault;\r\n\r\n export type ToUrlPrefix<\r\n TLocale extends LanguageCountryLocaleAnyCase,\r\n TDefault = never\r\n > = GetLocaleProp;\r\n\r\n export function ToUrlPrefix<\r\n TLocale extends LanguageCountryLocale,\r\n const TThrowIfMissing extends boolean | undefined\r\n >(\r\n locale: TLocale,\r\n throwIfMissing?: TThrowIfMissing\r\n ): ToUrlPrefix> {\r\n type ThisReturnType = ToUrlPrefix>;\r\n return GetSiteLocale.byLanguageCountryLocale(locale, throwIfMissing)?.UrlPrefix as ThisReturnType;\r\n }\r\n\r\n export type ToCountryLocale<\r\n TLocale extends LanguageCountryLocaleAnyCase,\r\n TDefault = never\r\n > = GetLocaleProp;\r\n\r\n export function ToCountryLocale<\r\n TLocale extends LanguageCountryLocale,\r\n TThrowIfMissing extends boolean | undefined\r\n >(\r\n locale: TLocale,\r\n throwIfMissing?: TThrowIfMissing\r\n ): ToCountryLocale> {\r\n type ThisReturnType = ToCountryLocale>;\r\n return GetSiteLocale.byLanguageCountryLocale(locale, throwIfMissing)?.CountryLocale as ThisReturnType;\r\n }\r\n }\r\n\r\n}\r\n", "import { mapArrayToProp } from \"@mcwd/typescript-type-guards\";\r\nimport { LocaleSettingsArray } from \"../locale-settings.js\";\r\n\r\n/**\r\n * A 2 letter country code `ISO 3166`\r\n */\r\nexport const CountryLocale = mapArrayToProp(LocaleSettingsArray, \"CountryLocale\");\r\nexport type CountryLocale = typeof CountryLocale[number];\r\n\r\n\r\n/**\r\n * A 2 letter country code `ISO 3166`\r\n */\r\nexport const CountryLocaleUpperCase = mapArrayToProp(LocaleSettingsArray, \"CountryLocaleUppercase\");\r\nexport type CountryLocaleUpperCase = typeof CountryLocaleUpperCase[number];\r\n\r\n\r\n/**\r\n * A 2 letter country code `ISO 3166`\r\n */\r\nexport const CountryLocaleAnyCase = [...CountryLocale, ...CountryLocaleUpperCase] as const;\r\nexport type CountryLocaleAnyCase = typeof CountryLocaleAnyCase[number];", "import { mapArrayToProp } from \"@mcwd/typescript-type-guards\";\r\nimport { LocaleSettingsArray } from \"../locale-settings.js\";\r\n\r\n/** \r\n * A 2 letter language code `ISO 639-2` seperated by a `-` and followed by an uppercase 2 letter country code `ISO 3166`\r\n * \r\n * Example: `en-US`: \r\n * - `en` 2 letter language code \r\n * - `US` 2 lettter country code \r\n */\r\nexport const LanguageCountryLocale = mapArrayToProp(LocaleSettingsArray, \"LanguageCountryLocale\");\r\nexport type LanguageCountryLocale = typeof LanguageCountryLocale[number];\r\n\r\nexport const LanguageCountryLocaleLowercase = mapArrayToProp(LocaleSettingsArray, \"LanguageCountryLocaleLowercase\");\r\nexport type LanguageCountryLocaleLowercase = typeof LanguageCountryLocaleLowercase[number];\r\n\r\nexport const LanguageCountryLocaleUppercase = mapArrayToProp(LocaleSettingsArray, \"LanguageCountryLocaleUppercase\");\r\nexport type LanguageCountryLocaleUppercase = typeof LanguageCountryLocaleUppercase[number];\r\n\r\nexport const LanguageCountryLocaleAnyCase = [...LanguageCountryLocale, ...LanguageCountryLocaleLowercase, ...LanguageCountryLocaleUppercase] as const;\r\nexport type LanguageCountryLocaleAnyCase = typeof LanguageCountryLocaleAnyCase[number];", "import { mapArrayToProp, uniqueTupleValues } from \"@mcwd/typescript-type-guards\";\r\nimport { LocaleSettingsArray } from \"../locale-settings.js\";\r\n\r\n/** 2 letter code representing a language name according to `ISO 639-2` */\r\nexport const LanguageLocale = uniqueTupleValues(mapArrayToProp(LocaleSettingsArray, \"LanguageLocale\"));\r\nexport type LanguageLocale = typeof LanguageLocale[number];\r\n\r\n/** 2 letter code representing a language name according to `ISO 639-2` */\r\nexport const LanguageLocaleUppercase = uniqueTupleValues(mapArrayToProp(LocaleSettingsArray, \"LanguageLocaleUppercase\"));\r\nexport type LanguageLocaleUppercase = typeof LanguageLocaleUppercase[number];\r\n\r\n/** 2 letter code representing a language name according to `ISO 639-2` */\r\nexport const LanguageLocaleAnyCase = [...LanguageLocale, ...LanguageLocaleUppercase] as const;\r\nexport type LanguageLocaleAnyCase = typeof LanguageLocaleAnyCase[number];", "import { mapArrayToProp } from \"@mcwd/typescript-type-guards\";\r\nimport { LocaleSettingsArray } from \"../locale-settings.js\";\r\n\r\nexport const LocaleUrlPrefix = mapArrayToProp(LocaleSettingsArray, \"UrlPrefix\");\r\nexport type LocaleUrlPrefix = typeof LocaleUrlPrefix[number];\r\n\r\n", "import { SiteLocaleSettings } from \"./locale-settings.js\";\r\nimport { GetExtendedLocale, GetSiteLocale } from \"./props/GetSiteLocaleBy.js\";\r\nexport * from \"./props/index.js\";\r\n\r\n\r\nconst SiteLocaleFunctions = {\r\n getBySiteCountryCode: GetSiteLocale.bySiteCountryCode,\r\n getByLanguageCountryLocale: GetSiteLocale.byLanguageCountryLocale,\r\n getByCountryLocale: GetSiteLocale.byCountryLocale,\r\n getByExtendedCountryLocale: GetSiteLocale.byExtendedCountryLocale,\r\n getExtendedCountryLocale: GetExtendedLocale.byCountryLocale\r\n};\r\n\r\ntype SiteLocaleFunctions = typeof SiteLocaleFunctions;\r\n\r\n\r\nexport const SiteLocale = {\r\n ...SiteLocaleSettings,\r\n ...SiteLocaleFunctions\r\n} as const satisfies (SiteLocaleSettings & SiteLocaleFunctions);", "import { createEnumFromKeys, type EnumFromKeys } from \"@mcwd/typescript-type-guards\";\r\n\r\nexport const TranslationNamespace = [\r\n \"company-sizes\",\r\n \"countries\",\r\n \"states\",\r\n \"departments\",\r\n \"submit-button-text\",\r\n \"form-labels\",\r\n \"form-validation\",\r\n \"industries\",\r\n \"main-solutions\",\r\n \"post-submit-text\",\r\n \"form-heading-text\",\r\n \"contact-post-submit\",\r\n \"custom-translations\",\r\n] as const;\r\nexport type TranslationNamespace = (typeof TranslationNamespace)[number];\r\n\r\nexport type TranslationNamespaceEnum = EnumFromKeys;\r\nexport const TranslationNamespaceEnum = createEnumFromKeys(TranslationNamespace, true);\r\n", "import { inject, type InjectionKey } from 'vue';\r\nimport { getCurrentInstance, type ComponentInternalInstance } from \"@vue/runtime-core\";\r\nimport { isArrayOfType, isNil, isObject, isString, isSymbol, isUndefined } from \"@mcwd/typescript-type-guards\";\r\n\r\n/**\r\n * An object representing a group of values to be returned by inject, with any string key as a friendly identifier.\r\n */\r\nexport type InjectionValuesRecord> = TInjectionValues;\r\n\r\nexport type AnyInjectionKeysRecord> = Record>> = TInjectionKeys; \r\n\r\n/**\r\n * An object representing a group of typed InjectionKeys to be used for provide and inject, with any string key as a friendly identifier.\r\n */\r\nexport type InjectionKeysRecord> = {\r\n [key in Extract, string>]: InjectionKey<\r\n TInjectionValues[key]\r\n >;\r\n};\r\n\r\ntype KeysRecord = {\r\n [key in TKeys]: symbol | key;\r\n};\r\n\r\nexport function CreateInjectionKeysRecord>>(\r\n keysRecord: KeysRecord\r\n): TInjectionKeysRecord {\r\n const keys = Object.keys(keysRecord) as (string & keyof TInjectionKeysRecord & keyof typeof keysRecord)[];\r\n for (const k of keys) {\r\n const keyValue = keysRecord[k];\r\n if (isString(keyValue)) {\r\n keysRecord[k] = Symbol(keyValue);\r\n }\r\n }\r\n return keysRecord as unknown as TInjectionKeysRecord;\r\n}\r\n\r\n\r\ntype ComponentInternalInstanceWithProvidedKey = ComponentInternalInstance & { provides: Record };\r\ntype SymbolType = ReturnType;\r\nfunction checkCurrentInstanceProvidesKey(vm: ComponentInternalInstance, key: (InjectionKey & symbol) | symbol): vm is ComponentInternalInstanceWithProvidedKey, T> {\r\n if (\"provides\" in vm && isObject(vm.provides)) {\r\n const keySymbol = key.valueOf();\r\n if (keySymbol in vm.provides) {\r\n const value = vm.provides[keySymbol] as T | undefined;\r\n return (!isUndefined(value));\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport function injectWithSelf(key: InjectionKey, defaultValue?: T | undefined): T | undefined {\r\n const vm = getCurrentInstance();\r\n if (isObject(vm)) {\r\n if (checkCurrentInstanceProvidesKey(vm, key.valueOf())) {\r\n return vm.provides[key.valueOf()];\r\n }\r\n else {\r\n return defaultValue;\r\n }\r\n } else {\r\n console.warn(\"Could not find current instance\");\r\n }\r\n if (!isUndefined(defaultValue)) {\r\n return inject(key, defaultValue);\r\n }\r\n return inject(key);\r\n}\r\n\r\nexport function checkValuesAlreadyProvided(injectionKeys: AnyInjectionKeysRecord);\r\nexport function checkValuesAlreadyProvided>(...injectionKeys: TInjectionKey[]);\r\nexport function checkValuesAlreadyProvided(...injectionKeys: ([InjectionKey, ...InjectionKey[]] | [AnyInjectionKeysRecord])) {\r\n const obj: InjectionKey | AnyInjectionKeysRecord = injectionKeys[0];\r\n if (isNil(obj)) {\r\n throw new Error(\"Expected at least one argument to checkValuesAlreadyProvided\");\r\n }\r\n\r\n if (!isSymbol(obj)) {\r\n injectionKeys = Object.values(obj) as [InjectionKey, ...InjectionKey[]];\r\n }\r\n\r\n if (isArrayOfType(injectionKeys, isSymbol)) {\r\n return (injectionKeys as symbol[]).every((k) => {\r\n const defaultVal = \"__ThisIsANULLINJECTIONVALUE___\";\r\n const val = injectWithSelf(k, defaultVal);\r\n return val !== defaultVal;\r\n });\r\n }\r\n else {\r\n throw new Error(\"Unexpected arguments supplied to checkValuesAlreadyProvided\");\r\n }\r\n}\r\n\r\nexport function injectRequiredWithSelf(key: InjectionKey): T {\r\n const value = injectWithSelf(key);\r\n if (isUndefined(value)) {\r\n throw new Error(`injection value for key [${key.toString()}] is undefined.`);\r\n }\r\n else {\r\n return value;\r\n }\r\n}", "import { isFunction } from \"@mcwd/typescript-type-guards\";\r\nimport { type Ref, type MaybeRefOrGetter, isRef, type Reactive, type ShallowReactive } from \"vue\";\r\n\r\n/* A regular value or a reference value */\r\nexport type MaybeRef = Ref | T;\r\n\r\n/** A reference or a getter */\r\nexport type RefOrGetter = Ref | (() => T);\r\n\r\nexport function isWatchable(value: MaybeRefOrGetter): value is RefOrGetter {\r\n return isRef(value) || isFunction(value);\r\n}\r\n\r\nexport type ReactiveOrShallowReactive> = Reactive | ShallowReactive;\r\nexport type MaybeReactive> = T | Reactive;\r\nexport type MaybeShallowReactive> = T | ShallowReactive;\r\nexport type MaybeReactiveOrShallowReactive> = T | Reactive | ShallowReactive;\r\n\r\nexport type UnwrapReactive>> =\r\n T extends ReactiveOrShallowReactive>\r\n ? U\r\n :\r\n T extends infer U extends Record\r\n ? U\r\n : never;", "import {\r\n type InjectionValuesRecord,\r\n type InjectionKeysRecord,\r\n CreateInjectionKeysRecord,\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided\r\n} from \"@mcwd/util-vue\";\r\nimport { type ILogger } from \"../../utils/Logger/ILogger.js\";\r\nimport { provide } from \"vue\";\r\nimport type { AnyFormSettingsKey } from \"../form-settings/form-experience/form-settings-keys.js\";\r\nimport { BaseFormLogger, SecondButtonDefaultStyle } from \"../base-form-logger.js\";\r\n\r\ntype UseFormLoggerInjectionValues = InjectionValuesRecord<{\r\n logger: ILogger,\r\n getVerboseLogger: (verboseDebugTag: string) => ILogger\r\n}>;\r\n\r\ntype UseFormLoggerInjectionKeys = InjectionKeysRecord;\r\n\r\nconst UseFormLoggerInjectionKeys = CreateInjectionKeysRecord({\r\n logger: \"logger\",\r\n getVerboseLogger: \"getVerboseLogger\"\r\n});\r\n\r\nexport function initFormLogger(formSettingsKey: AnyFormSettingsKey) {\r\n if (checkValuesAlreadyProvided(UseFormLoggerInjectionKeys)) {\r\n return;\r\n }\r\n const logger = BaseFormLogger.getChildLogger({\r\n tags: { category: \"Forms\" },\r\n prefixStrings: [formSettingsKey],\r\n prefixStyles: [SecondButtonDefaultStyle]\r\n });\r\n\r\n const getVerboseLogger = (verboseDebugTag: string) => {\r\n return logger.withTags({ verboseDebug: verboseDebugTag });\r\n };\r\n\r\n provide(UseFormLoggerInjectionKeys.logger, logger);\r\n provide(UseFormLoggerInjectionKeys.getVerboseLogger, getVerboseLogger);\r\n}\r\n\r\nexport function useFormLogger({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n try {\r\n callerLabel ??= \"useFormEvents\";\r\n const logger = injectRequiredWithSelf(UseFormLoggerInjectionKeys.logger);\r\n const getVerboseLogger = injectRequiredWithSelf(UseFormLoggerInjectionKeys.getVerboseLogger);\r\n return { logger, getVerboseLogger };\r\n }\r\n catch (err) {\r\n BaseFormLogger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n}", "import { provide } from \"vue\";\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionValuesRecord,\r\n type InjectionKeysRecord,\r\n} from \"@mcwd/util-vue\";\r\nimport { exhaustiveGuard } from \"@mcwd/typescript-type-guards\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\n\r\nimport { LocaleConvert, LocaleUrlPrefix, SiteCountryCode, isSiteCountryCode } from \"../../types-and-definitions/locale-defs/Locales.js\";\r\n\r\ntype UseSiteLanguageInjectionValues = InjectionValuesRecord<{\r\n siteCountryCode: SiteCountryCode;\r\n localeUrlPrefix: LocaleUrlPrefix;\r\n}>;\r\n\r\ntype UseSiteLanguageInjectionKeys = InjectionKeysRecord;\r\n\r\nconst UseSiteLanguageInjectionKeys = CreateInjectionKeysRecord({\r\n siteCountryCode: \"siteCountryCode\",\r\n localeUrlPrefix: \"localeUrlPrefix\"\r\n});\r\n\r\nexport function initSiteLanguage(siteCountryCode: SiteCountryCode) {\r\n if (checkValuesAlreadyProvided(UseSiteLanguageInjectionKeys)) {\r\n return;\r\n }\r\n if (isSiteCountryCode(siteCountryCode)){\r\n provide(UseSiteLanguageInjectionKeys.siteCountryCode, siteCountryCode);\r\n provide(UseSiteLanguageInjectionKeys.localeUrlPrefix, LocaleConvert.FromSiteCountryCode.ToUrlPrefix(siteCountryCode, true));\r\n }\r\n else {\r\n exhaustiveGuard(siteCountryCode);\r\n }\r\n}\r\n\r\nexport const useSiteLanguage = ({ callerLabel }: { callerLabel?: string | undefined } = {}) => {\r\n const { logger } = useFormLogger();\r\n try {\r\n const siteCountryCode = injectRequiredWithSelf(UseSiteLanguageInjectionKeys.siteCountryCode);\r\n const localeUrlPrefix = injectRequiredWithSelf(UseSiteLanguageInjectionKeys.localeUrlPrefix);\r\n return { siteCountryCode, localeUrlPrefix };\r\n } catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? \"unknown\"}`);\r\n throw err;\r\n }\r\n};\r\n", "import { provide } from 'vue';\r\n\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionKeysRecord,\r\n type InjectionValuesRecord\r\n} from \"@mcwd/util-vue\";\r\n\r\nimport { AnyFormSettingsKey } from '../form-settings/form-experience/form-settings-keys.js';\r\nimport {\r\n getFormSettings,\r\n getFormClasses,\r\n type IFormSettings,\r\n FormExperienceSettingsObject,\r\n} from \"../form-settings/form-settings-factory.js\"; \r\nimport type { MarketoFormSettingsKey, MarketoFormSettingsObject } from '../form-settings/marketo-form/marketo-form-setting.js';\r\n\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\n\r\n\r\ntype UseFormSettingsInjectionValues = InjectionValuesRecord<{\r\n FormSettings: Readonly;\r\n FormClasses: Readonly>;\r\n}>;\r\n\r\ntype UseFormSettingsInjectionKeys = InjectionKeysRecord;\r\n\r\nconst UseFormSettingsInjectionKeys = CreateInjectionKeysRecord({\r\n FormSettings: \"FormSettings\",\r\n FormClasses: \"FormClasses\",\r\n});\r\n\r\nexport function initFormSettings(formSettingsKey: AnyFormSettingsKey) {\r\n if (checkValuesAlreadyProvided(UseFormSettingsInjectionKeys)) {\r\n return;\r\n }\r\n const FormSettings = getFormSettings(formSettingsKey);\r\n const FormClasses = getFormClasses(formSettingsKey);\r\n\r\n provide(UseFormSettingsInjectionKeys.FormSettings, FormSettings);\r\n provide(UseFormSettingsInjectionKeys.FormClasses, FormClasses);\r\n}\r\n\r\ntype SettingsKeyType\r\n = TFormOrFormExperience extends \"MarketoForm\"\r\n ? Extract\r\n : TFormOrFormExperience extends \"FormExperience\"\r\n ? Extract\r\n : never;\r\nexport function useFormSettings<\r\n TFormOrFormExperience extends \"MarketoForm\" | \"FormExperience\" = \"FormExperience\",\r\n const TFormSettingsKey extends MarketoFormSettingsKey | AnyFormSettingsKey = \r\n TFormOrFormExperience extends \"MarketoForm\"\r\n ? MarketoFormSettingsKey\r\n : AnyFormSettingsKey\r\n> (\r\n { callerLabel }: { callerLabel?: string | undefined } = {}\r\n)\r\n{\r\n type FormSettingsType = TFormOrFormExperience extends \"FormExperience\"\r\n ? IFormSettings & (typeof FormExperienceSettingsObject)[SettingsKeyType<\"FormExperience\", TFormSettingsKey>]\r\n : TFormOrFormExperience extends \"MarketoForm\"\r\n ? IFormSettings & (typeof MarketoFormSettingsObject)[SettingsKeyType<\"MarketoForm\", TFormSettingsKey>]\r\n : never;\r\n \r\n const { logger } = useFormLogger();\r\n try {\r\n callerLabel ??= \"useFormSettings\";\r\n const formSettings = injectRequiredWithSelf(UseFormSettingsInjectionKeys.FormSettings);\r\n const FormSettings = formSettings as Readonly;\r\n const FormClasses = injectRequiredWithSelf(UseFormSettingsInjectionKeys.FormClasses);\r\n\r\n return {\r\n FormSettings,\r\n FormClasses,\r\n };\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n}", "import {\r\n computed,\r\n provide,\r\n type ComputedRef,\r\n shallowRef,\r\n} from \"vue\";\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionValuesRecord,\r\n type InjectionKeysRecord,\r\n} from \"@mcwd/util-vue\";\r\n\r\nimport { type Nil, isNil, isString } from '@mcwd/typescript-type-guards';\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\n\r\ntype UseKnownVisitorInjectionValues = InjectionValuesRecord<{\r\n isMarketoKnownVisitor: ComputedRef;\r\n initMarketoFormElement: (formElement: ComputedRef>) => void; \r\n}>;\r\n\r\ntype UseKnownVisitorInjectionKeys = InjectionKeysRecord;\r\n\r\nconst UseKnownVisitorInjectionKeys = CreateInjectionKeysRecord({\r\n isMarketoKnownVisitor: \"isMarketoKnownVisitor\",\r\n initMarketoFormElement: \"initMarketoFormElement\",\r\n});\r\n\r\nexport function initMarketoKnownVisitorState()\r\n{\r\n // To avoid circular dependencies, we provide the FormElement value later.\r\n const FormElementWrapper = shallowRef | Nil>>(null);\r\n const FormElement = computed(() => {\r\n if (isNil(FormElementWrapper.value)) {\r\n return null;\r\n }\r\n return FormElementWrapper.value.value;\r\n });\r\n if (checkValuesAlreadyProvided(UseKnownVisitorInjectionKeys)) {\r\n return;\r\n }\r\n\r\n const initMarketoFormElement = (formElement: ComputedRef | Nil>) => {\r\n FormElementWrapper.value = formElement;\r\n };\r\n\r\n const isMarketoKnownVisitor = computed(() => {\r\n if (isNil(FormElement.value)) {\r\n return null;\r\n }\r\n // In marketo, a known visitor is someone who has submitted a form before.\r\n // Marketo gives the option to show \"Custom HTML\" to known visitors.\r\n // This custom html is often called \"Known Visitor Html\" or KV HTML in the Marketo community.\r\n // This is a hidden input field we've set in the KV HTML to indicate that we know the current visitor\r\n const isKnownViewInput = FormElement.value.find(\r\n \"input[name='isKnownView']\"\r\n );\r\n let val =\r\n (isKnownViewInput.length === 1 ? isKnownViewInput.val() : null) ?? null;\r\n val = isString(val) ? val.trim() : val;\r\n return val === \"true\";\r\n });\r\n\r\n provide(UseKnownVisitorInjectionKeys.isMarketoKnownVisitor, isMarketoKnownVisitor);\r\n provide(UseKnownVisitorInjectionKeys.initMarketoFormElement, initMarketoFormElement);\r\n}\r\n\r\nexport const useMarketoKnownVisitorState = ({ callerLabel }: { callerLabel?: string | undefined } = {}) => {\r\n const { logger } = useFormLogger();\r\n try {\r\n const isMarketoKnownVisitor = injectRequiredWithSelf(UseKnownVisitorInjectionKeys.isMarketoKnownVisitor);\r\n const initMarketoFormElement = injectRequiredWithSelf(UseKnownVisitorInjectionKeys.initMarketoFormElement);\r\n return { isMarketoKnownVisitor, initMarketoFormElement };\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n};\r\n\r\n", "export const FormOrFormExperienceType = [ \"MarketoForm\", \"FormExperience\" ] as const;\r\nexport type FormOrFormExperienceType = typeof FormOrFormExperienceType[ number ];", "import type _jquery from \"jquery\";\r\nimport { exhaustiveGuard, isNotNil } from \"@mcwd/typescript-type-guards\";\r\nimport type { GatingState } from \"../../../types/definitions/gating/gating-state.js\";\r\nimport { GatingLevel, type GatingLevelFor } from \"../../../types/definitions/gating/gating-level.js\";\r\nimport { FormOrFormExperienceType } from \"../FormOrFormExperienceType.js\";\r\n\r\nfunction getHighestPriorityFormGatingLevel(\r\n gatingStates: readonly TGatingState[]\r\n): GatingLevel.MarketoForm | null \r\n{\r\n if (gatingStates.length === 0) {\r\n return null;\r\n }\r\n if (gatingStates.includes(\"FullGate\" as TGatingState)) {\r\n return \"FullGate\";\r\n }\r\n if (gatingStates.includes(\"PartialGate\" as TGatingState)) {\r\n return \"PartialGate\";\r\n }\r\n if (gatingStates.includes(\"NoGate\" as TGatingState) || gatingStates.includes(\"BlindSubmit\" as TGatingState)) {\r\n return null;\r\n }\r\n const gatingStatesStr = gatingStates.map((s: string) => `\"${s}\"`).join(\", \");\r\n throw new Error(`Unexpected GatingState.FormExperience types in [${gatingStatesStr}]`);\r\n}\r\n\r\nfunction getHighestPriorityExperienceGatingLevel(\r\n gatingStates: readonly TGatingState[]\r\n): GatingLevel.FormExperience | null\r\n{\r\n if (gatingStates.length === 0) {\r\n return null;\r\n }\r\n const highestGatingLevel = getHighestPriorityFormGatingLevel(gatingStates);\r\n if (isNotNil(highestGatingLevel)) {\r\n return highestGatingLevel;\r\n }\r\n if (gatingStates.includes(\"NoGate\" as TGatingState)) {\r\n return \"NoGate\";\r\n }\r\n const gatingStatesStr = gatingStates.map((s: string) => `\"${s}\"`).join(\", \");\r\n throw new Error(`Unexpected GatingState.FormExperience types in [${gatingStatesStr}]`);\r\n}\r\n\r\nexport function getHighestPriorityGatingLevel<\r\n TFormOrExperience extends FormOrFormExperienceType,\r\n TGatingState extends GatingState.FormExperience\r\n> (\r\n type: TFormOrExperience,\r\n gatingStates: readonly TGatingState[]\r\n): GatingLevelFor | null\r\n{\r\n type ThisReturnType = GatingLevelFor | null;\r\n\r\n switch (type) {\r\n case \"MarketoForm\":\r\n return getHighestPriorityFormGatingLevel(gatingStates) as ThisReturnType;\r\n case \"FormExperience\":\r\n return getHighestPriorityExperienceGatingLevel(gatingStates) as ThisReturnType;\r\n default:\r\n exhaustiveGuard(type);\r\n }\r\n}", "import { isNil, type Nil } from \"@mcwd/typescript-type-guards\";\r\nimport { GatingLevel, type GatingLevelFor } from \"../../types/definitions/gating/gating-level.js\";\r\nimport type { IFormSettings } from \"../../form-settings/form-settings-factory.js\";\r\nimport { getHighestPriorityGatingLevel } from \"./priority/get-highest-priority-gating-level.js\";\r\nimport type { AnyFormSettingsKey } from \"../../form-settings/form-experience/form-settings-keys.js\";\r\nimport type { FormOrFormExperienceType } from \"./FormOrFormExperienceType.js\";\r\n\r\n\r\n\r\nexport function getGatingLevelFromInitParameter(\r\n type: TFormOrExperience,\r\n formSettingsKey: AnyFormSettingsKey,\r\n settings: IFormSettings,\r\n gatingLevelCustom?: GatingLevel.FormExperience\r\n): GatingLevelFor | Nil\r\n{\r\n type ThisReturnType = ReturnType>;\r\n if (isNil(gatingLevelCustom)){\r\n return null;\r\n }\r\n if (settings.gateLevelSource.includes(\"InitParameter\")) {\r\n if (settings.allowedGatingStates.includes(gatingLevelCustom)) {\r\n if (gatingLevelCustom === \"NoGate\" && type === \"MarketoForm\") {\r\n const highestSettingsLevel = getHighestPriorityGatingLevel(type, settings.allowedGatingStates) as ThisReturnType;\r\n if (isNil(highestSettingsLevel)){\r\n throw new Error(`Property 'allowedGatingStates' for formSettingsKey \"${ settings.formSettingsKey }\" does not contain a valid GatingLevel value`);\r\n }\r\n return highestSettingsLevel;\r\n }\r\n return gatingLevelCustom as ThisReturnType;\r\n }\r\n const allowedValuesStr = settings.allowedGatingStates.map(s => `\"${s}\"`).join(\", \");\r\n throw new Error(`Form init parameter 'gatingLevelCustom' contains the value '${gatingLevelCustom}' which is not a valid gating level for formSettingsKey '${formSettingsKey}' which expects on of the following: ${allowedValuesStr}`);\r\n }\r\n throw new Error(`Form init parameter 'gatingLevelCustom' is not allowed for formSettingsKey '${formSettingsKey}' because the associated form experience settings do NOT contain \"InitParameter\" in the \"gateLevelSource\" array property.`);\r\n}\r\n", "import { type Nil } from \"@mcwd/typescript-type-guards\";\r\nimport { GatingLevel } from \"../../types/definitions/gating/gating-level.js\";\r\nimport type { IFormSettings } from \"../../form-settings/form-settings-factory.js\";\r\n\r\n\r\nexport function getGatingLevelFromSelf(settings: IFormSettings): GatingLevel.MarketoForm | Nil {\r\n const { gateLevelSource, defaultGateLevel } = settings;\r\n if (gateLevelSource.includes(\"Self\")) {\r\n return defaultGateLevel as \"FullGate\" | \"PartialGate\";\r\n }\r\n return null;\r\n}", "import { exhaustiveGuard, isStringLiteralOfType } from \"@mcwd/typescript-type-guards\";\r\nimport type { GatingLevel } from \"../../types/definitions/gating/gating-level.js\";\r\n\r\nexport function getResourceGatingLevel(resource: { gatingLevel: GatingLevel.Resource.Raw }): GatingLevel.Resource.Parsed {\r\n if (isStringLiteralOfType(resource.gatingLevel, [\"Full Gate\", \"FullGate\"])) {\r\n return \"FullGate\";\r\n }\r\n else if (isStringLiteralOfType(resource.gatingLevel, [\"Partial Gate\", \"PartialGate\"])) {\r\n return \"PartialGate\";\r\n }\r\n // Currently Resources are assigned the value \"Ungated\" when they should not be gated (aka the \"NoGate\" gatinglevel). \r\n // We just return \"NoGate\" here so we don't get this state confused with the \"BlindSubmit\" state or regular form completions which are also called \"Ungated\"\r\n // I've also added checks here for \"No Gate\" and \"No Gate\" in case we change the way these are assigned to resources in the near future.\r\n else if (isStringLiteralOfType(resource.gatingLevel, [\"Ungated\", \"No Gate\", \"NoGate\"])) {\r\n return \"NoGate\";\r\n }\r\n else {\r\n return exhaustiveGuard(resource.gatingLevel, \"Unexpected gating level assigned to resouce\");\r\n }\r\n}", "import { exhaustiveGuard, type Nil, isNotNil, isStringLiteralOfType } from \"@mcwd/typescript-type-guards\";\r\nimport type { IFormSettings } from \"../../form-settings/form-settings-factory.js\";\r\nimport { getHighestPriorityGatingLevel } from \"./priority/get-highest-priority-gating-level.js\";\r\nimport type { GatingLevel, GatingLevelFor } from \"../../types/definitions/gating/gating-level.js\";\r\nimport { FormOrFormExperienceType } from \"./FormOrFormExperienceType.js\";\r\nimport { getResourceGatingLevel } from \"./get-resource-gating-level.js\";\r\n\r\nexport function getGatingLevelFromResources(\r\n type: TFormOrExperience,\r\n settings: IFormSettings,\r\n resources: { gatingLevel: GatingLevel.Resource.Raw }[]\r\n): GatingLevelFor | Nil {\r\n type ThisReturnType = GatingLevelFor | Nil;\r\n if (resources.length === 0) {\r\n return null;\r\n }\r\n const { allowedGatingStates } = settings;\r\n const resourceGatingLevels = resources.map(r => getResourceGatingLevel(r));\r\n const filteredResourceGatingLevels = resourceGatingLevels.filter(rgl => isStringLiteralOfType(rgl, allowedGatingStates));\r\n const returnVal = getHighestPriorityGatingLevel(type, filteredResourceGatingLevels) as ThisReturnType;\r\n if (isNotNil(returnVal)) {\r\n return returnVal;\r\n }\r\n const highestSettingsLevel = getHighestPriorityGatingLevel(type, allowedGatingStates) as ThisReturnType;\r\n if (isNotNil(highestSettingsLevel)) {\r\n return highestSettingsLevel;\r\n }\r\n if (isStringLiteralOfType(type, FormOrFormExperienceType)) {\r\n throw new Error(`Property 'allowedGatingStates' for formSettingsKey \"${ settings.formSettingsKey }\" does not contain any valid values of type [GatingLevel.${ type }]`);\r\n }\r\n exhaustiveGuard(type);\r\n}\r\n", "import { exhaustiveGuard, isNil, isStringLiteralOfType, type Nil } from \"@mcwd/typescript-type-guards\";\r\nimport type { FormObjectWithDocument, FormObjectWithVideo, FormWidgetData, VideoResource, VideoResourceWithDocs } from \"../../../widgetDataTs.js\";\r\nimport { GatingLevel, type GatingLevelFor } from \"../../types/definitions/gating/gating-level.js\";\r\nimport type { IFormSettings } from \"../../form-settings/form-settings-factory.js\";\r\nimport { getGatingLevelFromResources } from \"./get-gating-level-from-resources-only.js\";\r\nimport type { AnyFormSettingsKey } from \"../../form-settings/form-experience/form-settings-keys.js\";\r\nimport { FormOrFormExperienceType } from \"./FormOrFormExperienceType.js\";\r\n\r\n\r\n// eslint-disable-next-line complexity\r\nexport function getGatingLevelFromWidgetData(\r\n type: TFormOrExperience,\r\n formSettingsKey: AnyFormSettingsKey,\r\n settings: IFormSettings,\r\n widgetData: FormWidgetData\r\n): GatingLevelFor | Nil \r\n{\r\n type ThisReturnType = GatingLevelFor | Nil;\r\n\r\n const { gateLevelSource, allowedGatingStates } = settings;\r\n\r\n const allowedFormGatingLevels = allowedGatingStates.filter(a => GatingLevel.MarketoForm.includes(a as GatingLevel.MarketoForm)) as GatingLevel.MarketoForm[]; \r\n\r\n const hasDocGatingSrc = gateLevelSource.includes(\"Document\");\r\n const hasVidGatingSrc = gateLevelSource.includes(\"Video\");\r\n const hasSetupGatingSrc = gateLevelSource.includes(\"WidgetDataSetup\");\r\n\r\n if (!hasDocGatingSrc && !hasVidGatingSrc && !hasSetupGatingSrc){\r\n return null;\r\n }\r\n\r\n let gatingResources: { gatingLevel: GatingLevel.Resource.Raw }[] = [];\r\n const form = widgetData.setup.form;\r\n if (hasDocGatingSrc && ('document' in form) && ('selected' in form.document)) {\r\n gatingResources = gatingResources.concat((form as FormObjectWithDocument<\"Final\">).document.selected);\r\n }\r\n if (hasVidGatingSrc && ('video' in form) && ('selected' in form.video)) {\r\n gatingResources = gatingResources.concat((form as FormObjectWithVideo<\"Final\", VideoResource | VideoResourceWithDocs>).video.selected);\r\n }\r\n if (hasSetupGatingSrc && (\"gatingLevel\" in widgetData.setup) && isStringLiteralOfType(widgetData.setup.gatingLevel, GatingLevel.Resource.Raw)) {\r\n gatingResources.push({ gatingLevel: widgetData.setup.gatingLevel });\r\n }\r\n\r\n let resourceGating: ThisReturnType = null;\r\n if (gatingResources.length > 0) {\r\n resourceGating = getGatingLevelFromResources(type, settings, gatingResources);\r\n }\r\n if (isNil(resourceGating)) {\r\n return null;\r\n }\r\n if (isStringLiteralOfType(type, FormOrFormExperienceType))\r\n {\r\n const allowedValues = (type === \"MarketoForm\") ? allowedFormGatingLevels : allowedGatingStates;\r\n if (allowedValues.includes(resourceGating as typeof allowedValues[ number ]))\r\n {\r\n return resourceGating;\r\n }\r\n throw new Error(`Resource Gating Level '${ resourceGating }' is an invalid [GatingLevel.${ type }] value for form experience '${ formSettingsKey }'`);\r\n }\r\n exhaustiveGuard(type);\r\n}", "import { isNotNil } from \"@mcwd/typescript-type-guards\";\r\nimport type { FormWidgetData } from \"../../../widgetDataTs.js\";\r\nimport { GatingLevel, type GatingLevelFor } from \"../../types/definitions/gating/gating-level.js\";\r\nimport type { IFormSettings } from \"../../form-settings/form-settings-factory.js\";\r\nimport type { AnyFormSettingsKey } from \"../../form-settings/form-experience/form-settings-keys.js\";\r\nimport { getGatingLevelFromInitParameter } from \"./get-gating-level-from-init-parameter-only.js\";\r\nimport { getGatingLevelFromSelf } from \"./get-gating-level-from-exp-settings-self-only.js\";\r\nimport { getGatingLevelFromWidgetData } from \"./get-gating-level-from-widget-data-only.js\";\r\nimport type { FormOrFormExperienceType } from \"./FormOrFormExperienceType.js\";\r\n\r\n// eslint-disable-next-line complexity\r\nexport function getInitialGatingLevel(\r\n type: TFormOrExperience,\r\n formSettingsKey: AnyFormSettingsKey,\r\n settings: IFormSettings,\r\n widgetData: FormWidgetData,\r\n gatingLevelCustom?: GatingLevel.FormExperience\r\n): GatingLevelFor {\r\n const { gateLevelSource } = settings;\r\n\r\n if (gateLevelSource.length === 0) {\r\n throw new Error(`Invalid form experience settings for formSettingsKey '${formSettingsKey}'. gateLevelSource array has zero elements!`);\r\n }\r\n const initParamGatingLevel = getGatingLevelFromInitParameter(type, formSettingsKey, settings, gatingLevelCustom);\r\n if (isNotNil(initParamGatingLevel)) {\r\n return initParamGatingLevel;\r\n }\r\n const selfGatingLevel = getGatingLevelFromSelf(settings);\r\n if (gateLevelSource.length === 1 && isNotNil(selfGatingLevel)) {\r\n return selfGatingLevel as GatingLevelFor;\r\n }\r\n\r\n const widgetDataGatingLevel = getGatingLevelFromWidgetData(type, formSettingsKey, settings, widgetData);\r\n\r\n if (isNotNil(widgetDataGatingLevel)) {\r\n return widgetDataGatingLevel;\r\n }\r\n if (isNotNil(selfGatingLevel)) {\r\n return selfGatingLevel as GatingLevelFor;\r\n }\r\n throw new Error(`${type} could not be determined for form experience \"${formSettingsKey}\"`);\r\n}", "/*! typescript-cookie v1.0.6 | MIT */\nvar index = /*#__PURE__*/Object.freeze({\n __proto__: null\n});\n\nconst encodeName = (name) => encodeURIComponent(name)\n .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n .replace(/[()]/g, escape);\nconst encodeValue = (value) => {\n return encodeURIComponent(value).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, decodeURIComponent);\n};\nconst decodeName = decodeURIComponent;\nconst decodeValue = (value) => {\n if (value[0] === '\"') {\n value = value.slice(1, -1);\n }\n return value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent);\n};\n\nfunction stringifyAttributes(attributes) {\n // Copy incoming attributes as to not alter the original object..\n attributes = Object.assign({}, attributes);\n if (typeof attributes.expires === 'number') {\n attributes.expires = new Date(Date.now() + attributes.expires * 864e5);\n }\n if (attributes.expires != null) {\n attributes.expires = attributes.expires.toUTCString();\n }\n return (Object.entries(attributes)\n .filter(([key, value]) => value != null && value !== false)\n // Considers RFC 6265 section 5.2:\n // ...\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n // Consume the characters of the unparsed-attributes up to,\n // not including, the first %x3B (\";\") character.\n // ...\n .map(([key, value]) => value === true ? `; ${key}` : `; ${key}=${value.split(';')[0]}`)\n .join(''));\n}\nfunction get(name, decodeValue, decodeName) {\n const scan = /(?:^|; )([^=]*)=([^;]*)/g;\n const jar = {};\n let match;\n while ((match = scan.exec(document.cookie)) != null) {\n try {\n const found = decodeName(match[1]);\n jar[found] = decodeValue(match[2], found);\n if (name === found) {\n break;\n }\n }\n catch (e) { }\n }\n return name != null ? jar[name] : jar;\n}\nconst DEFAULT_CODEC = Object.freeze({\n decodeName: decodeName,\n decodeValue: decodeValue,\n encodeName: encodeName,\n encodeValue: encodeValue\n});\nconst DEFAULT_ATTRIBUTES = Object.freeze({\n path: '/'\n});\nfunction setCookie(name, value, attributes = DEFAULT_ATTRIBUTES, { encodeValue: encodeValue$1 = encodeValue, encodeName: encodeName$1 = encodeName } = {}) {\n return (document.cookie = `${encodeName$1(name)}=${encodeValue$1(value, name)}${stringifyAttributes(attributes)}`);\n}\nfunction getCookie(name, { decodeValue: decodeValue$1 = decodeValue, decodeName: decodeName$1 = decodeName } = {}) {\n return get(name, decodeValue$1, decodeName$1);\n}\nfunction getCookies({ decodeValue: decodeValue$1 = decodeValue, decodeName: decodeName$1 = decodeName } = {}) {\n return get(undefined, decodeValue$1, decodeName$1);\n}\nfunction removeCookie(name, attributes = DEFAULT_ATTRIBUTES) {\n setCookie(name, '', Object.assign({}, attributes, {\n expires: -1\n }));\n}\n\nfunction init(converter, defaultAttributes) {\n const api = {\n set: function (name, value, attributes) {\n return setCookie(name, value, Object.assign({}, this.attributes, attributes), {\n encodeValue: this.converter.write\n });\n },\n get: function (name) {\n if (arguments.length === 0) {\n return getCookies(this.converter.read);\n }\n if (name == null) {\n return;\n }\n return getCookie(name, this.converter.read);\n },\n remove: function (name, attributes) {\n removeCookie(name, Object.assign({}, this.attributes, attributes));\n },\n withAttributes: function (attributes) {\n return init(this.converter, Object.assign({}, this.attributes, attributes));\n },\n withConverter: function (converter) {\n return init(Object.assign({}, this.converter, converter), this.attributes);\n }\n };\n const config = {\n attributes: { value: Object.freeze(defaultAttributes) },\n converter: { value: Object.freeze(converter) }\n };\n return Object.create(api, config);\n}\nvar compat = init({ read: DEFAULT_CODEC.decodeValue, write: DEFAULT_CODEC.encodeValue }, DEFAULT_ATTRIBUTES);\n\nexport { compat as Cookies, DEFAULT_ATTRIBUTES, DEFAULT_CODEC, index as Types, getCookie, getCookies, removeCookie, setCookie };\n", "import type _jquery from \"jquery\";\r\nimport { getCookie, setCookie } from \"typescript-cookie\";\r\nimport { isString } from \"@mcwd/typescript-type-guards\";\r\nimport { GatingLevel } from \"../../types/definitions/gating/gating-level.js\";\r\nimport { GatingState } from \"../../types/definitions/gating/gating-state.js\";\r\nimport { BaseFormLogger } from \"../../base-form-logger.js\";\r\n\r\nconst userGatingLevelCookieName = \"mc-form-gt-lvl\" as const;\r\nexport const UserGatingLevelCookieWrapper = {\r\n get GatingLevel(): GatingState.UserCookie {\r\n const val = getCookie(userGatingLevelCookieName);\r\n return isString(val) && GatingLevel.UserCookie.includes(val as GatingLevel.UserCookie)\r\n ? (val as GatingLevel.UserCookie)\r\n : \"NeedsForm\";\r\n },\r\n set GatingLevel(value: GatingLevel.UserCookie) {\r\n if (this.GatingLevel === \"FullGate\") {\r\n return;\r\n }\r\n if (isString(value) && GatingLevel.UserCookie.includes(value)) {\r\n let domain = window.location.hostname;\r\n if (domain.endsWith(\".mastercontrol.com\") === false) {\r\n if (domain !== \"localhost\") {\r\n BaseFormLogger.warn(\r\n `Unexpected domain when setting \"${userGatingLevelCookieName}\" cookie \"${domain}\"`\r\n );\r\n }\r\n domain = \"\";\r\n }\r\n setCookie(userGatingLevelCookieName, value, {\r\n ...(domain === \"\" ? {} : { domain }),\r\n expires: 45,\r\n sameSite: \"Strict\",\r\n path: \"/\"\r\n });\r\n }\r\n },\r\n};", "import type _jquery from \"jquery\";\r\nimport { exhaustiveGuard, isStringLiteralOfType, type Nil } from \"@mcwd/typescript-type-guards\";\r\nimport { GatingState, type GatingStateFor } from \"../../types/definitions/gating/gating-state.js\";\r\nimport { toValue, type MaybeRefOrGetter } from \"vue\";\r\nimport { GatingLevel, type GatingLevelFor } from \"../../types/definitions/gating/gating-level.js\";\r\nimport type { FormOrFormExperienceType } from \"./FormOrFormExperienceType.js\";\r\n\r\nfunction getGatingStateFromUserGatingCookie<\r\n TFormOrExperience extends FormOrFormExperienceType,\r\n TGatingState extends GatingState.FormExperience\r\n>({\r\n cookieStateValue,\r\n initialGatingLevel,\r\n allowedGatingStates: _allowedGatingStates\r\n}: {\r\n cookieStateValue: GatingState.UserCookie,\r\n initialGatingLevel: GatingLevelFor,\r\n allowedGatingStates: readonly TGatingState[]\r\n}): GatingStateFor \r\n{\r\n type ThisReturnType = ReturnType>;\r\n if (initialGatingLevel === \"NoGate\") {\r\n return \"NoGate\" as ThisReturnType;\r\n } \r\n if (isStringLiteralOfType(initialGatingLevel, GatingLevel.UserCookie)) {\r\n switch (cookieStateValue) {\r\n case \"NeedsForm\":\r\n return initialGatingLevel as ThisReturnType;\r\n case \"PartialGate\":\r\n return (initialGatingLevel === \"PartialGate\" ? \"BlindSubmit\" : initialGatingLevel) as ThisReturnType;\r\n case \"FullGate\":\r\n return \"BlindSubmit\" as ThisReturnType;\r\n default: exhaustiveGuard(cookieStateValue);\r\n }\r\n }\r\n exhaustiveGuard(initialGatingLevel);\r\n}\r\n\r\nexport function getGatingStateFromDynamicValues({\r\n type: _type,\r\n initialGatingLevel,\r\n isMarketoKnownVisitor,\r\n allowedGatingStates,\r\n cookieGatingLevelState\r\n}: {\r\n type: TFormOrExperience,\r\n isMarketoKnownVisitor: MaybeRefOrGetter,\r\n allowedGatingStates: TGatingState[] | readonly TGatingState[],\r\n cookieGatingLevelState: MaybeRefOrGetter,\r\n initialGatingLevel: GatingLevelFor\r\n}): GatingStateFor\r\n{\r\n const hasMarketoCookie = toValue(isMarketoKnownVisitor) === true;\r\n if (hasMarketoCookie && allowedGatingStates.includes(\"BlindSubmit\" as TGatingState)) {\r\n const cookieStateValue = toValue(cookieGatingLevelState);\r\n return getGatingStateFromUserGatingCookie({ cookieStateValue, initialGatingLevel, allowedGatingStates });\r\n }\r\n return initialGatingLevel;\r\n}", "import type _jquery from \"jquery\";\r\nimport { provide, computed, type ComputedRef } from \"vue\";\r\nimport { exhaustiveGuard, isNil, isStringLiteralOfType } from \"@mcwd/typescript-type-guards\";\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionKeysRecord,\r\n type InjectionValuesRecord\r\n} from \"@mcwd/util-vue\";\r\nimport { GatingLevel } from \"../types/definitions/gating/gating-level.js\";\r\nimport { GatingState } from \"../types/definitions/gating/gating-state.js\";\r\nimport type { FormWidgetData } from \"../../widgetDataTs.js\";\r\nimport { useFormSettings } from \"./use-form-settings.js\";\r\nimport { useMarketoKnownVisitorState } from \"./use-marketo-known-visitor-status.js\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\nimport type { AnyFormSettingsKey } from \"../form-settings/form-experience/form-settings-keys.js\";\r\nimport { getInitialGatingLevel } from \"../form-logic/gating/get-initial-gating-level.js\";\r\nimport { UserGatingLevelCookieWrapper } from \"../form-logic/gating/user-gating-level-cookie-wrapper.js\";\r\nimport { getGatingStateFromDynamicValues } from \"../form-logic/gating/get-gating-state-from-dynamic-values.js\";\r\n\r\ntype UseGatingLevelInjectionValues = InjectionValuesRecord<{\r\n CurrentMarketoFormGatingState: ComputedRef>>,\r\n CurrentFormExperienceGatingState: ComputedRef>,\r\n FormGatingLevel: Extract;\r\n FormExperienceGatingLevel: Extract,\r\n setCookieGatingLevelState(gatingLevel: Extract): void;\r\n}>;\r\ntype UseGatingLevelInjectionKeys = InjectionKeysRecord>;\r\n\r\nconst UseGatingLevelInjectionKeys = CreateInjectionKeysRecord({\r\n CurrentMarketoFormGatingState: \"CurrentMarketoFormGatingState\",\r\n CurrentFormExperienceGatingState: \"CurrentFormExperienceGatingState\",\r\n FormGatingLevel: \"FormGatingLevel\",\r\n FormExperienceGatingLevel: \"FormExperienceGatingLevel\",\r\n setCookieGatingLevelState: \"setCookieGatingLevelState\",\r\n});\r\n\r\n\r\ntype GatingLevelOptions = { widgetData: FormWidgetData, formSettingsKey: AnyFormSettingsKey, gatingLevelCustom?: (GatingLevel.FormExperience) | undefined };\r\n\r\n\r\nexport function initGatingLevel(options: GatingLevelOptions){\r\n if (checkValuesAlreadyProvided(UseGatingLevelInjectionKeys)) {\r\n return;\r\n }\r\n\r\n const { formSettingsKey, widgetData, gatingLevelCustom } = options;\r\n\r\n // const { logger } = useFormLogger();\r\n const { FormSettings } = useFormSettings({ callerLabel: \"initGatingLevel\" });\r\n const { allowedGatingStates, gatingCookiePermissions } = FormSettings;\r\n \r\n const initialMarketoFormGatingLevel = getInitialGatingLevel(\"MarketoForm\", formSettingsKey, FormSettings, widgetData, gatingLevelCustom);\r\n const initialFormExperienceGatingLevel = getInitialGatingLevel(\"FormExperience\", formSettingsKey, FormSettings, widgetData, gatingLevelCustom);\r\n\r\n if (isNil(initialMarketoFormGatingLevel) || allowedGatingStates.includes(initialFormExperienceGatingLevel) === false) {\r\n throw new Error(`Initial gating state \"${initialFormExperienceGatingLevel}\" does not exist in the allowedGatingStates: [${(allowedGatingStates).toString()}]`);\r\n }\r\n const { isMarketoKnownVisitor } = useMarketoKnownVisitorState({ callerLabel: \"initGatingLevel\" });\r\n const CookieGatingLevelState = computed(() => {\r\n if (gatingCookiePermissions.allowRead && isMarketoKnownVisitor.value === true) {\r\n const cookieGatingLevel = UserGatingLevelCookieWrapper.GatingLevel;\r\n switch (cookieGatingLevel) {\r\n case \"NeedsForm\": return \"NeedsForm\";\r\n case \"FullGate\": return isStringLiteralOfType(\"FullGate\", allowedGatingStates)? \"FullGate\" : \"NeedsForm\";\r\n case \"PartialGate\": return isStringLiteralOfType(\"PartialGate\", allowedGatingStates) ? \"PartialGate\" : \"NeedsForm\";\r\n default: exhaustiveGuard(cookieGatingLevel);\r\n }\r\n }\r\n return \"NeedsForm\";\r\n });\r\n\r\n function setCookieGatingLevelState(cookieGatingState: GatingLevel.UserCookie) {\r\n if (gatingCookiePermissions.allowWrite && GatingLevel.UserCookie.includes(cookieGatingState)) {\r\n UserGatingLevelCookieWrapper.GatingLevel = cookieGatingState;\r\n }\r\n }\r\n const CurrentMarketoFormGatingState = computed(() => {\r\n return getGatingStateFromDynamicValues({\r\n type: \"MarketoForm\",\r\n initialGatingLevel: initialMarketoFormGatingLevel,\r\n isMarketoKnownVisitor,\r\n allowedGatingStates,\r\n cookieGatingLevelState: CookieGatingLevelState\r\n });\r\n });\r\n\r\n const CurrentFormExperienceGatingState = computed(() => {\r\n return getGatingStateFromDynamicValues({\r\n type: \"FormExperience\",\r\n initialGatingLevel: initialFormExperienceGatingLevel,\r\n isMarketoKnownVisitor,\r\n allowedGatingStates,\r\n cookieGatingLevelState: CookieGatingLevelState\r\n });\r\n });\r\n\r\n provide(UseGatingLevelInjectionKeys.CurrentMarketoFormGatingState, CurrentMarketoFormGatingState);\r\n provide(UseGatingLevelInjectionKeys.CurrentFormExperienceGatingState, CurrentFormExperienceGatingState);\r\n provide(UseGatingLevelInjectionKeys.FormGatingLevel, initialMarketoFormGatingLevel);\r\n provide(UseGatingLevelInjectionKeys.FormExperienceGatingLevel, initialFormExperienceGatingLevel);\r\n provide(UseGatingLevelInjectionKeys.setCookieGatingLevelState, setCookieGatingLevelState);\r\n}\r\n\r\nexport function useGatingLevel({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger({ callerLabel: \"useGatingLevel\" });\r\n try {\r\n callerLabel ??= \"useGatingLevel\";\r\n const injectionKeys = UseGatingLevelInjectionKeys as UseGatingLevelInjectionKeys;\r\n const CurrentMarketoFormGatingState = injectRequiredWithSelf(injectionKeys.CurrentMarketoFormGatingState);\r\n const CurrentFormExperienceGatingState = injectRequiredWithSelf(injectionKeys.CurrentFormExperienceGatingState);\r\n const FormGatingLevel = injectRequiredWithSelf(injectionKeys.FormGatingLevel);\r\n const FormExperienceGatingLevel = injectRequiredWithSelf(injectionKeys.FormExperienceGatingLevel);\r\n const setCookieGatingLevelState = injectRequiredWithSelf(injectionKeys.setCookieGatingLevelState);\r\n return { CurrentMarketoFormGatingState, CurrentFormExperienceGatingState, FormGatingLevel, FormExperienceGatingLevel, setCookieGatingLevelState };\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n}", "import * as Vue from 'vue'\n\nvar isVue2 = false\nvar isVue3 = true\nvar Vue2 = undefined\n\nfunction install() {}\n\nexport function set(target, key, val) {\n if (Array.isArray(target)) {\n target.length = Math.max(target.length, key)\n target.splice(key, 1, val)\n return val\n }\n target[key] = val\n return val\n}\n\nexport function del(target, key) {\n if (Array.isArray(target)) {\n target.splice(key, 1)\n return\n }\n delete target[key]\n}\n\nexport * from 'vue'\nexport {\n Vue,\n Vue2,\n isVue2,\n isVue3,\n install,\n}\n", "import { shallowRef, watchEffect, readonly, ref, watch, customRef, getCurrentScope, onScopeDispose, effectScope, getCurrentInstance, provide, inject, isVue3, version, isRef, unref, computed, reactive, toRefs as toRefs$1, toRef as toRef$1, isVue2, set as set$1, onBeforeMount, nextTick, onBeforeUnmount, onMounted, onUnmounted, isReactive } from 'vue-demi';\n\nfunction computedEager(fn, options) {\n var _a;\n const result = shallowRef();\n watchEffect(() => {\n result.value = fn();\n }, {\n ...options,\n flush: (_a = options == null ? void 0 : options.flush) != null ? _a : \"sync\"\n });\n return readonly(result);\n}\n\nfunction computedWithControl(source, fn) {\n let v = void 0;\n let track;\n let trigger;\n const dirty = ref(true);\n const update = () => {\n dirty.value = true;\n trigger();\n };\n watch(source, update, { flush: \"sync\" });\n const get = typeof fn === \"function\" ? fn : fn.get;\n const set = typeof fn === \"function\" ? void 0 : fn.set;\n const result = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n if (dirty.value) {\n v = get();\n dirty.value = false;\n }\n track();\n return v;\n },\n set(v2) {\n set == null ? void 0 : set(v2);\n }\n };\n });\n if (Object.isExtensible(result))\n result.trigger = update;\n return result;\n}\n\nfunction tryOnScopeDispose(fn) {\n if (getCurrentScope()) {\n onScopeDispose(fn);\n return true;\n }\n return false;\n}\n\nfunction createEventHook() {\n const fns = /* @__PURE__ */ new Set();\n const off = (fn) => {\n fns.delete(fn);\n };\n const on = (fn) => {\n fns.add(fn);\n const offFn = () => off(fn);\n tryOnScopeDispose(offFn);\n return {\n off: offFn\n };\n };\n const trigger = (...args) => {\n return Promise.all(Array.from(fns).map((fn) => fn(...args)));\n };\n return {\n on,\n off,\n trigger\n };\n}\n\nfunction createGlobalState(stateFactory) {\n let initialized = false;\n let state;\n const scope = effectScope(true);\n return (...args) => {\n if (!initialized) {\n state = scope.run(() => stateFactory(...args));\n initialized = true;\n }\n return state;\n };\n}\n\nconst localProvidedStateMap = /* @__PURE__ */ new WeakMap();\n\nconst provideLocal = (key, value) => {\n var _a;\n const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n if (instance == null)\n throw new Error(\"provideLocal must be called in setup\");\n if (!localProvidedStateMap.has(instance))\n localProvidedStateMap.set(instance, /* @__PURE__ */ Object.create(null));\n const localProvidedState = localProvidedStateMap.get(instance);\n localProvidedState[key] = value;\n provide(key, value);\n};\n\nconst injectLocal = (...args) => {\n var _a;\n const key = args[0];\n const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n if (instance == null)\n throw new Error(\"injectLocal must be called in setup\");\n if (localProvidedStateMap.has(instance) && key in localProvidedStateMap.get(instance))\n return localProvidedStateMap.get(instance)[key];\n return inject(...args);\n};\n\nfunction createInjectionState(composable, options) {\n const key = (options == null ? void 0 : options.injectionKey) || Symbol(composable.name || \"InjectionState\");\n const defaultValue = options == null ? void 0 : options.defaultValue;\n const useProvidingState = (...args) => {\n const state = composable(...args);\n provideLocal(key, state);\n return state;\n };\n const useInjectedState = () => injectLocal(key, defaultValue);\n return [useProvidingState, useInjectedState];\n}\n\nfunction createSharedComposable(composable) {\n let subscribers = 0;\n let state;\n let scope;\n const dispose = () => {\n subscribers -= 1;\n if (scope && subscribers <= 0) {\n scope.stop();\n state = void 0;\n scope = void 0;\n }\n };\n return (...args) => {\n subscribers += 1;\n if (!state) {\n scope = effectScope(true);\n state = scope.run(() => composable(...args));\n }\n tryOnScopeDispose(dispose);\n return state;\n };\n}\n\nfunction extendRef(ref, extend, { enumerable = false, unwrap = true } = {}) {\n if (!isVue3 && !version.startsWith(\"2.7.\")) {\n if (process.env.NODE_ENV !== \"production\")\n throw new Error(\"[VueUse] extendRef only works in Vue 2.7 or above.\");\n return;\n }\n for (const [key, value] of Object.entries(extend)) {\n if (key === \"value\")\n continue;\n if (isRef(value) && unwrap) {\n Object.defineProperty(ref, key, {\n get() {\n return value.value;\n },\n set(v) {\n value.value = v;\n },\n enumerable\n });\n } else {\n Object.defineProperty(ref, key, { value, enumerable });\n }\n }\n return ref;\n}\n\nfunction get(obj, key) {\n if (key == null)\n return unref(obj);\n return unref(obj)[key];\n}\n\nfunction isDefined(v) {\n return unref(v) != null;\n}\n\nfunction makeDestructurable(obj, arr) {\n if (typeof Symbol !== \"undefined\") {\n const clone = { ...obj };\n Object.defineProperty(clone, Symbol.iterator, {\n enumerable: false,\n value() {\n let index = 0;\n return {\n next: () => ({\n value: arr[index++],\n done: index > arr.length\n })\n };\n }\n });\n return clone;\n } else {\n return Object.assign([...arr], obj);\n }\n}\n\nfunction toValue(r) {\n return typeof r === \"function\" ? r() : unref(r);\n}\nconst resolveUnref = toValue;\n\nfunction reactify(fn, options) {\n const unrefFn = (options == null ? void 0 : options.computedGetter) === false ? unref : toValue;\n return function(...args) {\n return computed(() => fn.apply(this, args.map((i) => unrefFn(i))));\n };\n}\n\nfunction reactifyObject(obj, optionsOrKeys = {}) {\n let keys = [];\n let options;\n if (Array.isArray(optionsOrKeys)) {\n keys = optionsOrKeys;\n } else {\n options = optionsOrKeys;\n const { includeOwnProperties = true } = optionsOrKeys;\n keys.push(...Object.keys(obj));\n if (includeOwnProperties)\n keys.push(...Object.getOwnPropertyNames(obj));\n }\n return Object.fromEntries(\n keys.map((key) => {\n const value = obj[key];\n return [\n key,\n typeof value === \"function\" ? reactify(value.bind(obj), options) : value\n ];\n })\n );\n}\n\nfunction toReactive(objectRef) {\n if (!isRef(objectRef))\n return reactive(objectRef);\n const proxy = new Proxy({}, {\n get(_, p, receiver) {\n return unref(Reflect.get(objectRef.value, p, receiver));\n },\n set(_, p, value) {\n if (isRef(objectRef.value[p]) && !isRef(value))\n objectRef.value[p].value = value;\n else\n objectRef.value[p] = value;\n return true;\n },\n deleteProperty(_, p) {\n return Reflect.deleteProperty(objectRef.value, p);\n },\n has(_, p) {\n return Reflect.has(objectRef.value, p);\n },\n ownKeys() {\n return Object.keys(objectRef.value);\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true\n };\n }\n });\n return reactive(proxy);\n}\n\nfunction reactiveComputed(fn) {\n return toReactive(computed(fn));\n}\n\nfunction reactiveOmit(obj, ...keys) {\n const flatKeys = keys.flat();\n const predicate = flatKeys[0];\n return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => !predicate(toValue(v), k))) : Object.fromEntries(Object.entries(toRefs$1(obj)).filter((e) => !flatKeys.includes(e[0]))));\n}\n\nconst isClient = typeof window !== \"undefined\" && typeof document !== \"undefined\";\nconst isWorker = typeof WorkerGlobalScope !== \"undefined\" && globalThis instanceof WorkerGlobalScope;\nconst isDef = (val) => typeof val !== \"undefined\";\nconst notNullish = (val) => val != null;\nconst assert = (condition, ...infos) => {\n if (!condition)\n console.warn(...infos);\n};\nconst toString = Object.prototype.toString;\nconst isObject = (val) => toString.call(val) === \"[object Object]\";\nconst now = () => Date.now();\nconst timestamp = () => +Date.now();\nconst clamp = (n, min, max) => Math.min(max, Math.max(min, n));\nconst noop = () => {\n};\nconst rand = (min, max) => {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\nconst hasOwn = (val, key) => Object.prototype.hasOwnProperty.call(val, key);\nconst isIOS = /* @__PURE__ */ getIsIOS();\nfunction getIsIOS() {\n var _a, _b;\n return isClient && ((_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.userAgent) && (/iP(?:ad|hone|od)/.test(window.navigator.userAgent) || ((_b = window == null ? void 0 : window.navigator) == null ? void 0 : _b.maxTouchPoints) > 2 && /iPad|Macintosh/.test(window == null ? void 0 : window.navigator.userAgent));\n}\n\nfunction createFilterWrapper(filter, fn) {\n function wrapper(...args) {\n return new Promise((resolve, reject) => {\n Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args })).then(resolve).catch(reject);\n });\n }\n return wrapper;\n}\nconst bypassFilter = (invoke) => {\n return invoke();\n};\nfunction debounceFilter(ms, options = {}) {\n let timer;\n let maxTimer;\n let lastRejector = noop;\n const _clearTimeout = (timer2) => {\n clearTimeout(timer2);\n lastRejector();\n lastRejector = noop;\n };\n const filter = (invoke) => {\n const duration = toValue(ms);\n const maxDuration = toValue(options.maxWait);\n if (timer)\n _clearTimeout(timer);\n if (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) {\n if (maxTimer) {\n _clearTimeout(maxTimer);\n maxTimer = null;\n }\n return Promise.resolve(invoke());\n }\n return new Promise((resolve, reject) => {\n lastRejector = options.rejectOnCancel ? reject : resolve;\n if (maxDuration && !maxTimer) {\n maxTimer = setTimeout(() => {\n if (timer)\n _clearTimeout(timer);\n maxTimer = null;\n resolve(invoke());\n }, maxDuration);\n }\n timer = setTimeout(() => {\n if (maxTimer)\n _clearTimeout(maxTimer);\n maxTimer = null;\n resolve(invoke());\n }, duration);\n });\n };\n return filter;\n}\nfunction throttleFilter(...args) {\n let lastExec = 0;\n let timer;\n let isLeading = true;\n let lastRejector = noop;\n let lastValue;\n let ms;\n let trailing;\n let leading;\n let rejectOnCancel;\n if (!isRef(args[0]) && typeof args[0] === \"object\")\n ({ delay: ms, trailing = true, leading = true, rejectOnCancel = false } = args[0]);\n else\n [ms, trailing = true, leading = true, rejectOnCancel = false] = args;\n const clear = () => {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n lastRejector();\n lastRejector = noop;\n }\n };\n const filter = (_invoke) => {\n const duration = toValue(ms);\n const elapsed = Date.now() - lastExec;\n const invoke = () => {\n return lastValue = _invoke();\n };\n clear();\n if (duration <= 0) {\n lastExec = Date.now();\n return invoke();\n }\n if (elapsed > duration && (leading || !isLeading)) {\n lastExec = Date.now();\n invoke();\n } else if (trailing) {\n lastValue = new Promise((resolve, reject) => {\n lastRejector = rejectOnCancel ? reject : resolve;\n timer = setTimeout(() => {\n lastExec = Date.now();\n isLeading = true;\n resolve(invoke());\n clear();\n }, Math.max(0, duration - elapsed));\n });\n }\n if (!leading && !timer)\n timer = setTimeout(() => isLeading = true, duration);\n isLeading = false;\n return lastValue;\n };\n return filter;\n}\nfunction pausableFilter(extendFilter = bypassFilter) {\n const isActive = ref(true);\n function pause() {\n isActive.value = false;\n }\n function resume() {\n isActive.value = true;\n }\n const eventFilter = (...args) => {\n if (isActive.value)\n extendFilter(...args);\n };\n return { isActive: readonly(isActive), pause, resume, eventFilter };\n}\n\nconst directiveHooks = {\n mounted: isVue3 ? \"mounted\" : \"inserted\",\n updated: isVue3 ? \"updated\" : \"componentUpdated\",\n unmounted: isVue3 ? \"unmounted\" : \"unbind\"\n};\n\nfunction cacheStringFunction(fn) {\n const cache = /* @__PURE__ */ Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n}\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, \"-$1\").toLowerCase());\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\n\nfunction promiseTimeout(ms, throwOnTimeout = false, reason = \"Timeout\") {\n return new Promise((resolve, reject) => {\n if (throwOnTimeout)\n setTimeout(() => reject(reason), ms);\n else\n setTimeout(resolve, ms);\n });\n}\nfunction identity(arg) {\n return arg;\n}\nfunction createSingletonPromise(fn) {\n let _promise;\n function wrapper() {\n if (!_promise)\n _promise = fn();\n return _promise;\n }\n wrapper.reset = async () => {\n const _prev = _promise;\n _promise = void 0;\n if (_prev)\n await _prev;\n };\n return wrapper;\n}\nfunction invoke(fn) {\n return fn();\n}\nfunction containsProp(obj, ...props) {\n return props.some((k) => k in obj);\n}\nfunction increaseWithUnit(target, delta) {\n var _a;\n if (typeof target === \"number\")\n return target + delta;\n const value = ((_a = target.match(/^-?\\d+\\.?\\d*/)) == null ? void 0 : _a[0]) || \"\";\n const unit = target.slice(value.length);\n const result = Number.parseFloat(value) + delta;\n if (Number.isNaN(result))\n return target;\n return result + unit;\n}\nfunction objectPick(obj, keys, omitUndefined = false) {\n return keys.reduce((n, k) => {\n if (k in obj) {\n if (!omitUndefined || obj[k] !== void 0)\n n[k] = obj[k];\n }\n return n;\n }, {});\n}\nfunction objectOmit(obj, keys, omitUndefined = false) {\n return Object.fromEntries(Object.entries(obj).filter(([key, value]) => {\n return (!omitUndefined || value !== void 0) && !keys.includes(key);\n }));\n}\nfunction objectEntries(obj) {\n return Object.entries(obj);\n}\nfunction getLifeCycleTarget(target) {\n return target || getCurrentInstance();\n}\n\nfunction toRef(...args) {\n if (args.length !== 1)\n return toRef$1(...args);\n const r = args[0];\n return typeof r === \"function\" ? readonly(customRef(() => ({ get: r, set: noop }))) : ref(r);\n}\nconst resolveRef = toRef;\n\nfunction reactivePick(obj, ...keys) {\n const flatKeys = keys.flat();\n const predicate = flatKeys[0];\n return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => predicate(toValue(v), k))) : Object.fromEntries(flatKeys.map((k) => [k, toRef(obj, k)])));\n}\n\nfunction refAutoReset(defaultValue, afterMs = 1e4) {\n return customRef((track, trigger) => {\n let value = toValue(defaultValue);\n let timer;\n const resetAfter = () => setTimeout(() => {\n value = toValue(defaultValue);\n trigger();\n }, toValue(afterMs));\n tryOnScopeDispose(() => {\n clearTimeout(timer);\n });\n return {\n get() {\n track();\n return value;\n },\n set(newValue) {\n value = newValue;\n trigger();\n clearTimeout(timer);\n timer = resetAfter();\n }\n };\n });\n}\n\nfunction useDebounceFn(fn, ms = 200, options = {}) {\n return createFilterWrapper(\n debounceFilter(ms, options),\n fn\n );\n}\n\nfunction refDebounced(value, ms = 200, options = {}) {\n const debounced = ref(value.value);\n const updater = useDebounceFn(() => {\n debounced.value = value.value;\n }, ms, options);\n watch(value, () => updater());\n return debounced;\n}\n\nfunction refDefault(source, defaultValue) {\n return computed({\n get() {\n var _a;\n return (_a = source.value) != null ? _a : defaultValue;\n },\n set(value) {\n source.value = value;\n }\n });\n}\n\nfunction useThrottleFn(fn, ms = 200, trailing = false, leading = true, rejectOnCancel = false) {\n return createFilterWrapper(\n throttleFilter(ms, trailing, leading, rejectOnCancel),\n fn\n );\n}\n\nfunction refThrottled(value, delay = 200, trailing = true, leading = true) {\n if (delay <= 0)\n return value;\n const throttled = ref(value.value);\n const updater = useThrottleFn(() => {\n throttled.value = value.value;\n }, delay, trailing, leading);\n watch(value, () => updater());\n return throttled;\n}\n\nfunction refWithControl(initial, options = {}) {\n let source = initial;\n let track;\n let trigger;\n const ref = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n return get();\n },\n set(v) {\n set(v);\n }\n };\n });\n function get(tracking = true) {\n if (tracking)\n track();\n return source;\n }\n function set(value, triggering = true) {\n var _a, _b;\n if (value === source)\n return;\n const old = source;\n if (((_a = options.onBeforeChange) == null ? void 0 : _a.call(options, value, old)) === false)\n return;\n source = value;\n (_b = options.onChanged) == null ? void 0 : _b.call(options, value, old);\n if (triggering)\n trigger();\n }\n const untrackedGet = () => get(false);\n const silentSet = (v) => set(v, false);\n const peek = () => get(false);\n const lay = (v) => set(v, false);\n return extendRef(\n ref,\n {\n get,\n set,\n untrackedGet,\n silentSet,\n peek,\n lay\n },\n { enumerable: true }\n );\n}\nconst controlledRef = refWithControl;\n\nfunction set(...args) {\n if (args.length === 2) {\n const [ref, value] = args;\n ref.value = value;\n }\n if (args.length === 3) {\n if (isVue2) {\n set$1(...args);\n } else {\n const [target, key, value] = args;\n target[key] = value;\n }\n }\n}\n\nfunction watchWithFilter(source, cb, options = {}) {\n const {\n eventFilter = bypassFilter,\n ...watchOptions\n } = options;\n return watch(\n source,\n createFilterWrapper(\n eventFilter,\n cb\n ),\n watchOptions\n );\n}\n\nfunction watchPausable(source, cb, options = {}) {\n const {\n eventFilter: filter,\n ...watchOptions\n } = options;\n const { eventFilter, pause, resume, isActive } = pausableFilter(filter);\n const stop = watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter\n }\n );\n return { stop, pause, resume, isActive };\n}\n\nfunction syncRef(left, right, ...[options]) {\n const {\n flush = \"sync\",\n deep = false,\n immediate = true,\n direction = \"both\",\n transform = {}\n } = options || {};\n const watchers = [];\n const transformLTR = \"ltr\" in transform && transform.ltr || ((v) => v);\n const transformRTL = \"rtl\" in transform && transform.rtl || ((v) => v);\n if (direction === \"both\" || direction === \"ltr\") {\n watchers.push(watchPausable(\n left,\n (newValue) => {\n watchers.forEach((w) => w.pause());\n right.value = transformLTR(newValue);\n watchers.forEach((w) => w.resume());\n },\n { flush, deep, immediate }\n ));\n }\n if (direction === \"both\" || direction === \"rtl\") {\n watchers.push(watchPausable(\n right,\n (newValue) => {\n watchers.forEach((w) => w.pause());\n left.value = transformRTL(newValue);\n watchers.forEach((w) => w.resume());\n },\n { flush, deep, immediate }\n ));\n }\n const stop = () => {\n watchers.forEach((w) => w.stop());\n };\n return stop;\n}\n\nfunction syncRefs(source, targets, options = {}) {\n const {\n flush = \"sync\",\n deep = false,\n immediate = true\n } = options;\n if (!Array.isArray(targets))\n targets = [targets];\n return watch(\n source,\n (newValue) => targets.forEach((target) => target.value = newValue),\n { flush, deep, immediate }\n );\n}\n\nfunction toRefs(objectRef, options = {}) {\n if (!isRef(objectRef))\n return toRefs$1(objectRef);\n const result = Array.isArray(objectRef.value) ? Array.from({ length: objectRef.value.length }) : {};\n for (const key in objectRef.value) {\n result[key] = customRef(() => ({\n get() {\n return objectRef.value[key];\n },\n set(v) {\n var _a;\n const replaceRef = (_a = toValue(options.replaceRef)) != null ? _a : true;\n if (replaceRef) {\n if (Array.isArray(objectRef.value)) {\n const copy = [...objectRef.value];\n copy[key] = v;\n objectRef.value = copy;\n } else {\n const newObject = { ...objectRef.value, [key]: v };\n Object.setPrototypeOf(newObject, Object.getPrototypeOf(objectRef.value));\n objectRef.value = newObject;\n }\n } else {\n objectRef.value[key] = v;\n }\n }\n }));\n }\n return result;\n}\n\nfunction tryOnBeforeMount(fn, sync = true, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onBeforeMount(fn, target);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnBeforeUnmount(fn, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onBeforeUnmount(fn, target);\n}\n\nfunction tryOnMounted(fn, sync = true, target) {\n const instance = getLifeCycleTarget();\n if (instance)\n onMounted(fn, target);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnUnmounted(fn, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onUnmounted(fn, target);\n}\n\nfunction createUntil(r, isNot = false) {\n function toMatch(condition, { flush = \"sync\", deep = false, timeout, throwOnTimeout } = {}) {\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch(\n r,\n (v) => {\n if (condition(v) !== isNot) {\n stop == null ? void 0 : stop();\n resolve(v);\n }\n },\n {\n flush,\n deep,\n immediate: true\n }\n );\n });\n const promises = [watcher];\n if (timeout != null) {\n promises.push(\n promiseTimeout(timeout, throwOnTimeout).then(() => toValue(r)).finally(() => stop == null ? void 0 : stop())\n );\n }\n return Promise.race(promises);\n }\n function toBe(value, options) {\n if (!isRef(value))\n return toMatch((v) => v === value, options);\n const { flush = \"sync\", deep = false, timeout, throwOnTimeout } = options != null ? options : {};\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch(\n [r, value],\n ([v1, v2]) => {\n if (isNot !== (v1 === v2)) {\n stop == null ? void 0 : stop();\n resolve(v1);\n }\n },\n {\n flush,\n deep,\n immediate: true\n }\n );\n });\n const promises = [watcher];\n if (timeout != null) {\n promises.push(\n promiseTimeout(timeout, throwOnTimeout).then(() => toValue(r)).finally(() => {\n stop == null ? void 0 : stop();\n return toValue(r);\n })\n );\n }\n return Promise.race(promises);\n }\n function toBeTruthy(options) {\n return toMatch((v) => Boolean(v), options);\n }\n function toBeNull(options) {\n return toBe(null, options);\n }\n function toBeUndefined(options) {\n return toBe(void 0, options);\n }\n function toBeNaN(options) {\n return toMatch(Number.isNaN, options);\n }\n function toContains(value, options) {\n return toMatch((v) => {\n const array = Array.from(v);\n return array.includes(value) || array.includes(toValue(value));\n }, options);\n }\n function changed(options) {\n return changedTimes(1, options);\n }\n function changedTimes(n = 1, options) {\n let count = -1;\n return toMatch(() => {\n count += 1;\n return count >= n;\n }, options);\n }\n if (Array.isArray(toValue(r))) {\n const instance = {\n toMatch,\n toContains,\n changed,\n changedTimes,\n get not() {\n return createUntil(r, !isNot);\n }\n };\n return instance;\n } else {\n const instance = {\n toMatch,\n toBe,\n toBeTruthy,\n toBeNull,\n toBeNaN,\n toBeUndefined,\n changed,\n changedTimes,\n get not() {\n return createUntil(r, !isNot);\n }\n };\n return instance;\n }\n}\nfunction until(r) {\n return createUntil(r);\n}\n\nfunction defaultComparator(value, othVal) {\n return value === othVal;\n}\nfunction useArrayDifference(...args) {\n var _a;\n const list = args[0];\n const values = args[1];\n let compareFn = (_a = args[2]) != null ? _a : defaultComparator;\n if (typeof compareFn === \"string\") {\n const key = compareFn;\n compareFn = (value, othVal) => value[key] === othVal[key];\n }\n return computed(() => toValue(list).filter((x) => toValue(values).findIndex((y) => compareFn(x, y)) === -1));\n}\n\nfunction useArrayEvery(list, fn) {\n return computed(() => toValue(list).every((element, index, array) => fn(toValue(element), index, array)));\n}\n\nfunction useArrayFilter(list, fn) {\n return computed(() => toValue(list).map((i) => toValue(i)).filter(fn));\n}\n\nfunction useArrayFind(list, fn) {\n return computed(() => toValue(\n toValue(list).find((element, index, array) => fn(toValue(element), index, array))\n ));\n}\n\nfunction useArrayFindIndex(list, fn) {\n return computed(() => toValue(list).findIndex((element, index, array) => fn(toValue(element), index, array)));\n}\n\nfunction findLast(arr, cb) {\n let index = arr.length;\n while (index-- > 0) {\n if (cb(arr[index], index, arr))\n return arr[index];\n }\n return void 0;\n}\nfunction useArrayFindLast(list, fn) {\n return computed(() => toValue(\n !Array.prototype.findLast ? findLast(toValue(list), (element, index, array) => fn(toValue(element), index, array)) : toValue(list).findLast((element, index, array) => fn(toValue(element), index, array))\n ));\n}\n\nfunction isArrayIncludesOptions(obj) {\n return isObject(obj) && containsProp(obj, \"formIndex\", \"comparator\");\n}\nfunction useArrayIncludes(...args) {\n var _a;\n const list = args[0];\n const value = args[1];\n let comparator = args[2];\n let formIndex = 0;\n if (isArrayIncludesOptions(comparator)) {\n formIndex = (_a = comparator.fromIndex) != null ? _a : 0;\n comparator = comparator.comparator;\n }\n if (typeof comparator === \"string\") {\n const key = comparator;\n comparator = (element, value2) => element[key] === toValue(value2);\n }\n comparator = comparator != null ? comparator : (element, value2) => element === toValue(value2);\n return computed(() => toValue(list).slice(formIndex).some((element, index, array) => comparator(\n toValue(element),\n toValue(value),\n index,\n toValue(array)\n )));\n}\n\nfunction useArrayJoin(list, separator) {\n return computed(() => toValue(list).map((i) => toValue(i)).join(toValue(separator)));\n}\n\nfunction useArrayMap(list, fn) {\n return computed(() => toValue(list).map((i) => toValue(i)).map(fn));\n}\n\nfunction useArrayReduce(list, reducer, ...args) {\n const reduceCallback = (sum, value, index) => reducer(toValue(sum), toValue(value), index);\n return computed(() => {\n const resolved = toValue(list);\n return args.length ? resolved.reduce(reduceCallback, toValue(args[0])) : resolved.reduce(reduceCallback);\n });\n}\n\nfunction useArraySome(list, fn) {\n return computed(() => toValue(list).some((element, index, array) => fn(toValue(element), index, array)));\n}\n\nfunction uniq(array) {\n return Array.from(new Set(array));\n}\nfunction uniqueElementsBy(array, fn) {\n return array.reduce((acc, v) => {\n if (!acc.some((x) => fn(v, x, array)))\n acc.push(v);\n return acc;\n }, []);\n}\nfunction useArrayUnique(list, compareFn) {\n return computed(() => {\n const resolvedList = toValue(list).map((element) => toValue(element));\n return compareFn ? uniqueElementsBy(resolvedList, compareFn) : uniq(resolvedList);\n });\n}\n\nfunction useCounter(initialValue = 0, options = {}) {\n let _initialValue = unref(initialValue);\n const count = ref(initialValue);\n const {\n max = Number.POSITIVE_INFINITY,\n min = Number.NEGATIVE_INFINITY\n } = options;\n const inc = (delta = 1) => count.value = Math.max(Math.min(max, count.value + delta), min);\n const dec = (delta = 1) => count.value = Math.min(Math.max(min, count.value - delta), max);\n const get = () => count.value;\n const set = (val) => count.value = Math.max(min, Math.min(max, val));\n const reset = (val = _initialValue) => {\n _initialValue = val;\n return set(val);\n };\n return { count, inc, dec, get, set, reset };\n}\n\nconst REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[T\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/i;\nconst REGEX_FORMAT = /[YMDHhms]o|\\[([^\\]]+)\\]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|SSS/g;\nfunction defaultMeridiem(hours, minutes, isLowercase, hasPeriod) {\n let m = hours < 12 ? \"AM\" : \"PM\";\n if (hasPeriod)\n m = m.split(\"\").reduce((acc, curr) => acc += `${curr}.`, \"\");\n return isLowercase ? m.toLowerCase() : m;\n}\nfunction formatOrdinal(num) {\n const suffixes = [\"th\", \"st\", \"nd\", \"rd\"];\n const v = num % 100;\n return num + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]);\n}\nfunction formatDate(date, formatStr, options = {}) {\n var _a;\n const years = date.getFullYear();\n const month = date.getMonth();\n const days = date.getDate();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n const milliseconds = date.getMilliseconds();\n const day = date.getDay();\n const meridiem = (_a = options.customMeridiem) != null ? _a : defaultMeridiem;\n const matches = {\n Yo: () => formatOrdinal(years),\n YY: () => String(years).slice(-2),\n YYYY: () => years,\n M: () => month + 1,\n Mo: () => formatOrdinal(month + 1),\n MM: () => `${month + 1}`.padStart(2, \"0\"),\n MMM: () => date.toLocaleDateString(options.locales, { month: \"short\" }),\n MMMM: () => date.toLocaleDateString(options.locales, { month: \"long\" }),\n D: () => String(days),\n Do: () => formatOrdinal(days),\n DD: () => `${days}`.padStart(2, \"0\"),\n H: () => String(hours),\n Ho: () => formatOrdinal(hours),\n HH: () => `${hours}`.padStart(2, \"0\"),\n h: () => `${hours % 12 || 12}`.padStart(1, \"0\"),\n ho: () => formatOrdinal(hours % 12 || 12),\n hh: () => `${hours % 12 || 12}`.padStart(2, \"0\"),\n m: () => String(minutes),\n mo: () => formatOrdinal(minutes),\n mm: () => `${minutes}`.padStart(2, \"0\"),\n s: () => String(seconds),\n so: () => formatOrdinal(seconds),\n ss: () => `${seconds}`.padStart(2, \"0\"),\n SSS: () => `${milliseconds}`.padStart(3, \"0\"),\n d: () => day,\n dd: () => date.toLocaleDateString(options.locales, { weekday: \"narrow\" }),\n ddd: () => date.toLocaleDateString(options.locales, { weekday: \"short\" }),\n dddd: () => date.toLocaleDateString(options.locales, { weekday: \"long\" }),\n A: () => meridiem(hours, minutes),\n AA: () => meridiem(hours, minutes, false, true),\n a: () => meridiem(hours, minutes, true),\n aa: () => meridiem(hours, minutes, true, true)\n };\n return formatStr.replace(REGEX_FORMAT, (match, $1) => {\n var _a2, _b;\n return (_b = $1 != null ? $1 : (_a2 = matches[match]) == null ? void 0 : _a2.call(matches)) != null ? _b : match;\n });\n}\nfunction normalizeDate(date) {\n if (date === null)\n return new Date(Number.NaN);\n if (date === void 0)\n return /* @__PURE__ */ new Date();\n if (date instanceof Date)\n return new Date(date);\n if (typeof date === \"string\" && !/Z$/i.test(date)) {\n const d = date.match(REGEX_PARSE);\n if (d) {\n const m = d[2] - 1 || 0;\n const ms = (d[7] || \"0\").substring(0, 3);\n return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n }\n }\n return new Date(date);\n}\nfunction useDateFormat(date, formatStr = \"HH:mm:ss\", options = {}) {\n return computed(() => formatDate(normalizeDate(toValue(date)), toValue(formatStr), options));\n}\n\nfunction useIntervalFn(cb, interval = 1e3, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n let timer = null;\n const isActive = ref(false);\n function clean() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n function pause() {\n isActive.value = false;\n clean();\n }\n function resume() {\n const intervalValue = toValue(interval);\n if (intervalValue <= 0)\n return;\n isActive.value = true;\n if (immediateCallback)\n cb();\n clean();\n timer = setInterval(cb, intervalValue);\n }\n if (immediate && isClient)\n resume();\n if (isRef(interval) || typeof interval === \"function\") {\n const stopWatch = watch(interval, () => {\n if (isActive.value && isClient)\n resume();\n });\n tryOnScopeDispose(stopWatch);\n }\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nfunction useInterval(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n immediate = true,\n callback\n } = options;\n const counter = ref(0);\n const update = () => counter.value += 1;\n const reset = () => {\n counter.value = 0;\n };\n const controls = useIntervalFn(\n callback ? () => {\n update();\n callback(counter.value);\n } : update,\n interval,\n { immediate }\n );\n if (exposeControls) {\n return {\n counter,\n reset,\n ...controls\n };\n } else {\n return counter;\n }\n}\n\nfunction useLastChanged(source, options = {}) {\n var _a;\n const ms = ref((_a = options.initialValue) != null ? _a : null);\n watch(\n source,\n () => ms.value = timestamp(),\n options\n );\n return ms;\n}\n\nfunction useTimeoutFn(cb, interval, options = {}) {\n const {\n immediate = true\n } = options;\n const isPending = ref(false);\n let timer = null;\n function clear() {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n }\n function stop() {\n isPending.value = false;\n clear();\n }\n function start(...args) {\n clear();\n isPending.value = true;\n timer = setTimeout(() => {\n isPending.value = false;\n timer = null;\n cb(...args);\n }, toValue(interval));\n }\n if (immediate) {\n isPending.value = true;\n if (isClient)\n start();\n }\n tryOnScopeDispose(stop);\n return {\n isPending: readonly(isPending),\n start,\n stop\n };\n}\n\nfunction useTimeout(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n callback\n } = options;\n const controls = useTimeoutFn(\n callback != null ? callback : noop,\n interval,\n options\n );\n const ready = computed(() => !controls.isPending.value);\n if (exposeControls) {\n return {\n ready,\n ...controls\n };\n } else {\n return ready;\n }\n}\n\nfunction useToNumber(value, options = {}) {\n const {\n method = \"parseFloat\",\n radix,\n nanToZero\n } = options;\n return computed(() => {\n let resolved = toValue(value);\n if (typeof resolved === \"string\")\n resolved = Number[method](resolved, radix);\n if (nanToZero && Number.isNaN(resolved))\n resolved = 0;\n return resolved;\n });\n}\n\nfunction useToString(value) {\n return computed(() => `${toValue(value)}`);\n}\n\nfunction useToggle(initialValue = false, options = {}) {\n const {\n truthyValue = true,\n falsyValue = false\n } = options;\n const valueIsRef = isRef(initialValue);\n const _value = ref(initialValue);\n function toggle(value) {\n if (arguments.length) {\n _value.value = value;\n return _value.value;\n } else {\n const truthy = toValue(truthyValue);\n _value.value = _value.value === truthy ? toValue(falsyValue) : truthy;\n return _value.value;\n }\n }\n if (valueIsRef)\n return toggle;\n else\n return [_value, toggle];\n}\n\nfunction watchArray(source, cb, options) {\n let oldList = (options == null ? void 0 : options.immediate) ? [] : [...source instanceof Function ? source() : Array.isArray(source) ? source : toValue(source)];\n return watch(source, (newList, _, onCleanup) => {\n const oldListRemains = Array.from({ length: oldList.length });\n const added = [];\n for (const obj of newList) {\n let found = false;\n for (let i = 0; i < oldList.length; i++) {\n if (!oldListRemains[i] && obj === oldList[i]) {\n oldListRemains[i] = true;\n found = true;\n break;\n }\n }\n if (!found)\n added.push(obj);\n }\n const removed = oldList.filter((_2, i) => !oldListRemains[i]);\n cb(newList, oldList, added, removed, onCleanup);\n oldList = [...newList];\n }, options);\n}\n\nfunction watchAtMost(source, cb, options) {\n const {\n count,\n ...watchOptions\n } = options;\n const current = ref(0);\n const stop = watchWithFilter(\n source,\n (...args) => {\n current.value += 1;\n if (current.value >= toValue(count))\n nextTick(() => stop());\n cb(...args);\n },\n watchOptions\n );\n return { count: current, stop };\n}\n\nfunction watchDebounced(source, cb, options = {}) {\n const {\n debounce = 0,\n maxWait = void 0,\n ...watchOptions\n } = options;\n return watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter: debounceFilter(debounce, { maxWait })\n }\n );\n}\n\nfunction watchDeep(source, cb, options) {\n return watch(\n source,\n cb,\n {\n ...options,\n deep: true\n }\n );\n}\n\nfunction watchIgnorable(source, cb, options = {}) {\n const {\n eventFilter = bypassFilter,\n ...watchOptions\n } = options;\n const filteredCb = createFilterWrapper(\n eventFilter,\n cb\n );\n let ignoreUpdates;\n let ignorePrevAsyncUpdates;\n let stop;\n if (watchOptions.flush === \"sync\") {\n const ignore = ref(false);\n ignorePrevAsyncUpdates = () => {\n };\n ignoreUpdates = (updater) => {\n ignore.value = true;\n updater();\n ignore.value = false;\n };\n stop = watch(\n source,\n (...args) => {\n if (!ignore.value)\n filteredCb(...args);\n },\n watchOptions\n );\n } else {\n const disposables = [];\n const ignoreCounter = ref(0);\n const syncCounter = ref(0);\n ignorePrevAsyncUpdates = () => {\n ignoreCounter.value = syncCounter.value;\n };\n disposables.push(\n watch(\n source,\n () => {\n syncCounter.value++;\n },\n { ...watchOptions, flush: \"sync\" }\n )\n );\n ignoreUpdates = (updater) => {\n const syncCounterPrev = syncCounter.value;\n updater();\n ignoreCounter.value += syncCounter.value - syncCounterPrev;\n };\n disposables.push(\n watch(\n source,\n (...args) => {\n const ignore = ignoreCounter.value > 0 && ignoreCounter.value === syncCounter.value;\n ignoreCounter.value = 0;\n syncCounter.value = 0;\n if (ignore)\n return;\n filteredCb(...args);\n },\n watchOptions\n )\n );\n stop = () => {\n disposables.forEach((fn) => fn());\n };\n }\n return { stop, ignoreUpdates, ignorePrevAsyncUpdates };\n}\n\nfunction watchImmediate(source, cb, options) {\n return watch(\n source,\n cb,\n {\n ...options,\n immediate: true\n }\n );\n}\n\nfunction watchOnce(source, cb, options) {\n const stop = watch(source, (...args) => {\n nextTick(() => stop());\n return cb(...args);\n }, options);\n return stop;\n}\n\nfunction watchThrottled(source, cb, options = {}) {\n const {\n throttle = 0,\n trailing = true,\n leading = true,\n ...watchOptions\n } = options;\n return watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter: throttleFilter(throttle, trailing, leading)\n }\n );\n}\n\nfunction watchTriggerable(source, cb, options = {}) {\n let cleanupFn;\n function onEffect() {\n if (!cleanupFn)\n return;\n const fn = cleanupFn;\n cleanupFn = void 0;\n fn();\n }\n function onCleanup(callback) {\n cleanupFn = callback;\n }\n const _cb = (value, oldValue) => {\n onEffect();\n return cb(value, oldValue, onCleanup);\n };\n const res = watchIgnorable(source, _cb, options);\n const { ignoreUpdates } = res;\n const trigger = () => {\n let res2;\n ignoreUpdates(() => {\n res2 = _cb(getWatchSources(source), getOldValue(source));\n });\n return res2;\n };\n return {\n ...res,\n trigger\n };\n}\nfunction getWatchSources(sources) {\n if (isReactive(sources))\n return sources;\n if (Array.isArray(sources))\n return sources.map((item) => toValue(item));\n return toValue(sources);\n}\nfunction getOldValue(source) {\n return Array.isArray(source) ? source.map(() => void 0) : void 0;\n}\n\nfunction whenever(source, cb, options) {\n const stop = watch(\n source,\n (v, ov, onInvalidate) => {\n if (v) {\n if (options == null ? void 0 : options.once)\n nextTick(() => stop());\n cb(v, ov, onInvalidate);\n }\n },\n {\n ...options,\n once: false\n }\n );\n return stop;\n}\n\nexport { assert, refAutoReset as autoResetRef, bypassFilter, camelize, clamp, computedEager, computedWithControl, containsProp, computedWithControl as controlledComputed, controlledRef, createEventHook, createFilterWrapper, createGlobalState, createInjectionState, reactify as createReactiveFn, createSharedComposable, createSingletonPromise, debounceFilter, refDebounced as debouncedRef, watchDebounced as debouncedWatch, directiveHooks, computedEager as eagerComputed, extendRef, formatDate, get, getLifeCycleTarget, hasOwn, hyphenate, identity, watchIgnorable as ignorableWatch, increaseWithUnit, injectLocal, invoke, isClient, isDef, isDefined, isIOS, isObject, isWorker, makeDestructurable, noop, normalizeDate, notNullish, now, objectEntries, objectOmit, objectPick, pausableFilter, watchPausable as pausableWatch, promiseTimeout, provideLocal, rand, reactify, reactifyObject, reactiveComputed, reactiveOmit, reactivePick, refAutoReset, refDebounced, refDefault, refThrottled, refWithControl, resolveRef, resolveUnref, set, syncRef, syncRefs, throttleFilter, refThrottled as throttledRef, watchThrottled as throttledWatch, timestamp, toReactive, toRef, toRefs, toValue, tryOnBeforeMount, tryOnBeforeUnmount, tryOnMounted, tryOnScopeDispose, tryOnUnmounted, until, useArrayDifference, useArrayEvery, useArrayFilter, useArrayFind, useArrayFindIndex, useArrayFindLast, useArrayIncludes, useArrayJoin, useArrayMap, useArrayReduce, useArraySome, useArrayUnique, useCounter, useDateFormat, refDebounced as useDebounce, useDebounceFn, useInterval, useIntervalFn, useLastChanged, refThrottled as useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useToNumber, useToString, useToggle, watchArray, watchAtMost, watchDebounced, watchDeep, watchIgnorable, watchImmediate, watchOnce, watchPausable, watchThrottled, watchTriggerable, watchWithFilter, whenever };\n", "import { noop, makeDestructurable, camelize, toValue, isClient, isObject, tryOnScopeDispose, isIOS, tryOnMounted, notNullish, objectOmit, promiseTimeout, until, increaseWithUnit, objectEntries, createSingletonPromise, useTimeoutFn, pausableWatch, toRef, createEventHook, computedWithControl, timestamp, pausableFilter, watchIgnorable, debounceFilter, createFilterWrapper, bypassFilter, toRefs, useIntervalFn, containsProp, hasOwn, throttleFilter, useDebounceFn, useThrottleFn, clamp, syncRef, objectPick, tryOnUnmounted, watchWithFilter, tryOnBeforeUnmount, identity, isDef, isWorker } from '@vueuse/shared';\nexport * from '@vueuse/shared';\nimport { isRef, ref, shallowRef, watchEffect, computed, inject, isVue3, version, defineComponent, h, TransitionGroup, shallowReactive, Fragment, watch, getCurrentInstance, customRef, onUpdated, onMounted, isVue2, readonly, nextTick, reactive, markRaw, unref, getCurrentScope, set, del, isReadonly, onBeforeUpdate } from 'vue-demi';\n\nfunction computedAsync(evaluationCallback, initialState, optionsOrRef) {\n let options;\n if (isRef(optionsOrRef)) {\n options = {\n evaluating: optionsOrRef\n };\n } else {\n options = optionsOrRef || {};\n }\n const {\n lazy = false,\n evaluating = void 0,\n shallow = true,\n onError = noop\n } = options;\n const started = ref(!lazy);\n const current = shallow ? shallowRef(initialState) : ref(initialState);\n let counter = 0;\n watchEffect(async (onInvalidate) => {\n if (!started.value)\n return;\n counter++;\n const counterAtBeginning = counter;\n let hasFinished = false;\n if (evaluating) {\n Promise.resolve().then(() => {\n evaluating.value = true;\n });\n }\n try {\n const result = await evaluationCallback((cancelCallback) => {\n onInvalidate(() => {\n if (evaluating)\n evaluating.value = false;\n if (!hasFinished)\n cancelCallback();\n });\n });\n if (counterAtBeginning === counter)\n current.value = result;\n } catch (e) {\n onError(e);\n } finally {\n if (evaluating && counterAtBeginning === counter)\n evaluating.value = false;\n hasFinished = true;\n }\n });\n if (lazy) {\n return computed(() => {\n started.value = true;\n return current.value;\n });\n } else {\n return current;\n }\n}\n\nfunction computedInject(key, options, defaultSource, treatDefaultAsFactory) {\n let source = inject(key);\n if (defaultSource)\n source = inject(key, defaultSource);\n if (treatDefaultAsFactory)\n source = inject(key, defaultSource, treatDefaultAsFactory);\n if (typeof options === \"function\") {\n return computed((ctx) => options(source, ctx));\n } else {\n return computed({\n get: (ctx) => options.get(source, ctx),\n set: options.set\n });\n }\n}\n\nfunction createReusableTemplate(options = {}) {\n if (!isVue3 && !version.startsWith(\"2.7.\")) {\n if (process.env.NODE_ENV !== \"production\")\n throw new Error(\"[VueUse] createReusableTemplate only works in Vue 2.7 or above.\");\n return;\n }\n const {\n inheritAttrs = true\n } = options;\n const render = shallowRef();\n const define = /* #__PURE__ */ defineComponent({\n setup(_, { slots }) {\n return () => {\n render.value = slots.default;\n };\n }\n });\n const reuse = /* #__PURE__ */ defineComponent({\n inheritAttrs,\n setup(_, { attrs, slots }) {\n return () => {\n var _a;\n if (!render.value && process.env.NODE_ENV !== \"production\")\n throw new Error(\"[VueUse] Failed to find the definition of reusable template\");\n const vnode = (_a = render.value) == null ? void 0 : _a.call(render, { ...keysToCamelKebabCase(attrs), $slots: slots });\n return inheritAttrs && (vnode == null ? void 0 : vnode.length) === 1 ? vnode[0] : vnode;\n };\n }\n });\n return makeDestructurable(\n { define, reuse },\n [define, reuse]\n );\n}\nfunction keysToCamelKebabCase(obj) {\n const newObj = {};\n for (const key in obj)\n newObj[camelize(key)] = obj[key];\n return newObj;\n}\n\nfunction createTemplatePromise(options = {}) {\n if (!isVue3) {\n if (process.env.NODE_ENV !== \"production\")\n throw new Error(\"[VueUse] createTemplatePromise only works in Vue 3 or above.\");\n return;\n }\n let index = 0;\n const instances = ref([]);\n function create(...args) {\n const props = shallowReactive({\n key: index++,\n args,\n promise: void 0,\n resolve: () => {\n },\n reject: () => {\n },\n isResolving: false,\n options\n });\n instances.value.push(props);\n props.promise = new Promise((_resolve, _reject) => {\n props.resolve = (v) => {\n props.isResolving = true;\n return _resolve(v);\n };\n props.reject = _reject;\n }).finally(() => {\n props.promise = void 0;\n const index2 = instances.value.indexOf(props);\n if (index2 !== -1)\n instances.value.splice(index2, 1);\n });\n return props.promise;\n }\n function start(...args) {\n if (options.singleton && instances.value.length > 0)\n return instances.value[0].promise;\n return create(...args);\n }\n const component = /* #__PURE__ */ defineComponent((_, { slots }) => {\n const renderList = () => instances.value.map((props) => {\n var _a;\n return h(Fragment, { key: props.key }, (_a = slots.default) == null ? void 0 : _a.call(slots, props));\n });\n if (options.transition)\n return () => h(TransitionGroup, options.transition, renderList);\n return renderList;\n });\n component.start = start;\n return component;\n}\n\nfunction createUnrefFn(fn) {\n return function(...args) {\n return fn.apply(this, args.map((i) => toValue(i)));\n };\n}\n\nfunction unrefElement(elRef) {\n var _a;\n const plain = toValue(elRef);\n return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;\n}\n\nconst defaultWindow = isClient ? window : void 0;\nconst defaultDocument = isClient ? window.document : void 0;\nconst defaultNavigator = isClient ? window.navigator : void 0;\nconst defaultLocation = isClient ? window.location : void 0;\n\nfunction useEventListener(...args) {\n let target;\n let events;\n let listeners;\n let options;\n if (typeof args[0] === \"string\" || Array.isArray(args[0])) {\n [events, listeners, options] = args;\n target = defaultWindow;\n } else {\n [target, events, listeners, options] = args;\n }\n if (!target)\n return noop;\n if (!Array.isArray(events))\n events = [events];\n if (!Array.isArray(listeners))\n listeners = [listeners];\n const cleanups = [];\n const cleanup = () => {\n cleanups.forEach((fn) => fn());\n cleanups.length = 0;\n };\n const register = (el, event, listener, options2) => {\n el.addEventListener(event, listener, options2);\n return () => el.removeEventListener(event, listener, options2);\n };\n const stopWatch = watch(\n () => [unrefElement(target), toValue(options)],\n ([el, options2]) => {\n cleanup();\n if (!el)\n return;\n const optionsClone = isObject(options2) ? { ...options2 } : options2;\n cleanups.push(\n ...events.flatMap((event) => {\n return listeners.map((listener) => register(el, event, listener, optionsClone));\n })\n );\n },\n { immediate: true, flush: \"post\" }\n );\n const stop = () => {\n stopWatch();\n cleanup();\n };\n tryOnScopeDispose(stop);\n return stop;\n}\n\nlet _iOSWorkaround = false;\nfunction onClickOutside(target, handler, options = {}) {\n const { window = defaultWindow, ignore = [], capture = true, detectIframe = false } = options;\n if (!window)\n return noop;\n if (isIOS && !_iOSWorkaround) {\n _iOSWorkaround = true;\n Array.from(window.document.body.children).forEach((el) => el.addEventListener(\"click\", noop));\n window.document.documentElement.addEventListener(\"click\", noop);\n }\n let shouldListen = true;\n const shouldIgnore = (event) => {\n return ignore.some((target2) => {\n if (typeof target2 === \"string\") {\n return Array.from(window.document.querySelectorAll(target2)).some((el) => el === event.target || event.composedPath().includes(el));\n } else {\n const el = unrefElement(target2);\n return el && (event.target === el || event.composedPath().includes(el));\n }\n });\n };\n const listener = (event) => {\n const el = unrefElement(target);\n if (!el || el === event.target || event.composedPath().includes(el))\n return;\n if (event.detail === 0)\n shouldListen = !shouldIgnore(event);\n if (!shouldListen) {\n shouldListen = true;\n return;\n }\n handler(event);\n };\n const cleanup = [\n useEventListener(window, \"click\", listener, { passive: true, capture }),\n useEventListener(window, \"pointerdown\", (e) => {\n const el = unrefElement(target);\n shouldListen = !shouldIgnore(e) && !!(el && !e.composedPath().includes(el));\n }, { passive: true }),\n detectIframe && useEventListener(window, \"blur\", (event) => {\n setTimeout(() => {\n var _a;\n const el = unrefElement(target);\n if (((_a = window.document.activeElement) == null ? void 0 : _a.tagName) === \"IFRAME\" && !(el == null ? void 0 : el.contains(window.document.activeElement))) {\n handler(event);\n }\n }, 0);\n })\n ].filter(Boolean);\n const stop = () => cleanup.forEach((fn) => fn());\n return stop;\n}\n\nfunction createKeyPredicate(keyFilter) {\n if (typeof keyFilter === \"function\")\n return keyFilter;\n else if (typeof keyFilter === \"string\")\n return (event) => event.key === keyFilter;\n else if (Array.isArray(keyFilter))\n return (event) => keyFilter.includes(event.key);\n return () => true;\n}\nfunction onKeyStroke(...args) {\n let key;\n let handler;\n let options = {};\n if (args.length === 3) {\n key = args[0];\n handler = args[1];\n options = args[2];\n } else if (args.length === 2) {\n if (typeof args[1] === \"object\") {\n key = true;\n handler = args[0];\n options = args[1];\n } else {\n key = args[0];\n handler = args[1];\n }\n } else {\n key = true;\n handler = args[0];\n }\n const {\n target = defaultWindow,\n eventName = \"keydown\",\n passive = false,\n dedupe = false\n } = options;\n const predicate = createKeyPredicate(key);\n const listener = (e) => {\n if (e.repeat && toValue(dedupe))\n return;\n if (predicate(e))\n handler(e);\n };\n return useEventListener(target, eventName, listener, passive);\n}\nfunction onKeyDown(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keydown\" });\n}\nfunction onKeyPressed(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keypress\" });\n}\nfunction onKeyUp(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keyup\" });\n}\n\nconst DEFAULT_DELAY = 500;\nconst DEFAULT_THRESHOLD = 10;\nfunction onLongPress(target, handler, options) {\n var _a, _b;\n const elementRef = computed(() => unrefElement(target));\n let timeout;\n let posStart;\n let startTimestamp;\n let hasLongPressed = false;\n function clear() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = void 0;\n }\n posStart = void 0;\n startTimestamp = void 0;\n hasLongPressed = false;\n }\n function onRelease(ev) {\n var _a2, _b2, _c;\n const [_startTimestamp, _posStart, _hasLongPressed] = [startTimestamp, posStart, hasLongPressed];\n clear();\n if (!(options == null ? void 0 : options.onMouseUp) || !_posStart || !_startTimestamp)\n return;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n const dx = ev.x - _posStart.x;\n const dy = ev.y - _posStart.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n options.onMouseUp(ev.timeStamp - _startTimestamp, distance, _hasLongPressed);\n }\n function onDown(ev) {\n var _a2, _b2, _c, _d;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n clear();\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n posStart = {\n x: ev.x,\n y: ev.y\n };\n startTimestamp = ev.timeStamp;\n timeout = setTimeout(\n () => {\n hasLongPressed = true;\n handler(ev);\n },\n (_d = options == null ? void 0 : options.delay) != null ? _d : DEFAULT_DELAY\n );\n }\n function onMove(ev) {\n var _a2, _b2, _c, _d;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n if (!posStart || (options == null ? void 0 : options.distanceThreshold) === false)\n return;\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n const dx = ev.x - posStart.x;\n const dy = ev.y - posStart.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (distance >= ((_d = options == null ? void 0 : options.distanceThreshold) != null ? _d : DEFAULT_THRESHOLD))\n clear();\n }\n const listenerOptions = {\n capture: (_a = options == null ? void 0 : options.modifiers) == null ? void 0 : _a.capture,\n once: (_b = options == null ? void 0 : options.modifiers) == null ? void 0 : _b.once\n };\n const cleanup = [\n useEventListener(elementRef, \"pointerdown\", onDown, listenerOptions),\n useEventListener(elementRef, \"pointermove\", onMove, listenerOptions),\n useEventListener(elementRef, [\"pointerup\", \"pointerleave\"], onRelease, listenerOptions)\n ];\n const stop = () => cleanup.forEach((fn) => fn());\n return stop;\n}\n\nfunction isFocusedElementEditable() {\n const { activeElement, body } = document;\n if (!activeElement)\n return false;\n if (activeElement === body)\n return false;\n switch (activeElement.tagName) {\n case \"INPUT\":\n case \"TEXTAREA\":\n return true;\n }\n return activeElement.hasAttribute(\"contenteditable\");\n}\nfunction isTypedCharValid({\n keyCode,\n metaKey,\n ctrlKey,\n altKey\n}) {\n if (metaKey || ctrlKey || altKey)\n return false;\n if (keyCode >= 48 && keyCode <= 57)\n return true;\n if (keyCode >= 65 && keyCode <= 90)\n return true;\n if (keyCode >= 97 && keyCode <= 122)\n return true;\n return false;\n}\nfunction onStartTyping(callback, options = {}) {\n const { document: document2 = defaultDocument } = options;\n const keydown = (event) => {\n !isFocusedElementEditable() && isTypedCharValid(event) && callback(event);\n };\n if (document2)\n useEventListener(document2, \"keydown\", keydown, { passive: true });\n}\n\nfunction templateRef(key, initialValue = null) {\n const instance = getCurrentInstance();\n let _trigger = () => {\n };\n const element = customRef((track, trigger) => {\n _trigger = trigger;\n return {\n get() {\n var _a, _b;\n track();\n return (_b = (_a = instance == null ? void 0 : instance.proxy) == null ? void 0 : _a.$refs[key]) != null ? _b : initialValue;\n },\n set() {\n }\n };\n });\n tryOnMounted(_trigger);\n onUpdated(_trigger);\n return element;\n}\n\nfunction useMounted() {\n const isMounted = ref(false);\n const instance = getCurrentInstance();\n if (instance) {\n onMounted(() => {\n isMounted.value = true;\n }, isVue2 ? void 0 : instance);\n }\n return isMounted;\n}\n\nfunction useSupported(callback) {\n const isMounted = useMounted();\n return computed(() => {\n isMounted.value;\n return Boolean(callback());\n });\n}\n\nfunction useMutationObserver(target, callback, options = {}) {\n const { window = defaultWindow, ...mutationOptions } = options;\n let observer;\n const isSupported = useSupported(() => window && \"MutationObserver\" in window);\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const targets = computed(() => {\n const value = toValue(target);\n const items = (Array.isArray(value) ? value : [value]).map(unrefElement).filter(notNullish);\n return new Set(items);\n });\n const stopWatch = watch(\n () => targets.value,\n (targets2) => {\n cleanup();\n if (isSupported.value && targets2.size) {\n observer = new MutationObserver(callback);\n targets2.forEach((el) => observer.observe(el, mutationOptions));\n }\n },\n { immediate: true, flush: \"post\" }\n );\n const takeRecords = () => {\n return observer == null ? void 0 : observer.takeRecords();\n };\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop,\n takeRecords\n };\n}\n\nfunction useActiveElement(options = {}) {\n var _a;\n const {\n window = defaultWindow,\n deep = true,\n triggerOnRemoval = false\n } = options;\n const document = (_a = options.document) != null ? _a : window == null ? void 0 : window.document;\n const getDeepActiveElement = () => {\n var _a2;\n let element = document == null ? void 0 : document.activeElement;\n if (deep) {\n while (element == null ? void 0 : element.shadowRoot)\n element = (_a2 = element == null ? void 0 : element.shadowRoot) == null ? void 0 : _a2.activeElement;\n }\n return element;\n };\n const activeElement = ref();\n const trigger = () => {\n activeElement.value = getDeepActiveElement();\n };\n if (window) {\n useEventListener(window, \"blur\", (event) => {\n if (event.relatedTarget !== null)\n return;\n trigger();\n }, true);\n useEventListener(window, \"focus\", trigger, true);\n }\n if (triggerOnRemoval) {\n useMutationObserver(document, (mutations) => {\n mutations.filter((m) => m.removedNodes.length).map((n) => Array.from(n.removedNodes)).flat().forEach((node) => {\n if (node === activeElement.value)\n trigger();\n });\n }, {\n childList: true,\n subtree: true\n });\n }\n trigger();\n return activeElement;\n}\n\nfunction useRafFn(fn, options = {}) {\n const {\n immediate = true,\n fpsLimit = void 0,\n window = defaultWindow\n } = options;\n const isActive = ref(false);\n const intervalLimit = fpsLimit ? 1e3 / fpsLimit : null;\n let previousFrameTimestamp = 0;\n let rafId = null;\n function loop(timestamp) {\n if (!isActive.value || !window)\n return;\n if (!previousFrameTimestamp)\n previousFrameTimestamp = timestamp;\n const delta = timestamp - previousFrameTimestamp;\n if (intervalLimit && delta < intervalLimit) {\n rafId = window.requestAnimationFrame(loop);\n return;\n }\n previousFrameTimestamp = timestamp;\n fn({ delta, timestamp });\n rafId = window.requestAnimationFrame(loop);\n }\n function resume() {\n if (!isActive.value && window) {\n isActive.value = true;\n previousFrameTimestamp = 0;\n rafId = window.requestAnimationFrame(loop);\n }\n }\n function pause() {\n isActive.value = false;\n if (rafId != null && window) {\n window.cancelAnimationFrame(rafId);\n rafId = null;\n }\n }\n if (immediate)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive: readonly(isActive),\n pause,\n resume\n };\n}\n\nfunction useAnimate(target, keyframes, options) {\n let config;\n let animateOptions;\n if (isObject(options)) {\n config = options;\n animateOptions = objectOmit(options, [\"window\", \"immediate\", \"commitStyles\", \"persist\", \"onReady\", \"onError\"]);\n } else {\n config = { duration: options };\n animateOptions = options;\n }\n const {\n window = defaultWindow,\n immediate = true,\n commitStyles,\n persist,\n playbackRate: _playbackRate = 1,\n onReady,\n onError = (e) => {\n console.error(e);\n }\n } = config;\n const isSupported = useSupported(() => window && HTMLElement && \"animate\" in HTMLElement.prototype);\n const animate = shallowRef(void 0);\n const store = shallowReactive({\n startTime: null,\n currentTime: null,\n timeline: null,\n playbackRate: _playbackRate,\n pending: false,\n playState: immediate ? \"idle\" : \"paused\",\n replaceState: \"active\"\n });\n const pending = computed(() => store.pending);\n const playState = computed(() => store.playState);\n const replaceState = computed(() => store.replaceState);\n const startTime = computed({\n get() {\n return store.startTime;\n },\n set(value) {\n store.startTime = value;\n if (animate.value)\n animate.value.startTime = value;\n }\n });\n const currentTime = computed({\n get() {\n return store.currentTime;\n },\n set(value) {\n store.currentTime = value;\n if (animate.value) {\n animate.value.currentTime = value;\n syncResume();\n }\n }\n });\n const timeline = computed({\n get() {\n return store.timeline;\n },\n set(value) {\n store.timeline = value;\n if (animate.value)\n animate.value.timeline = value;\n }\n });\n const playbackRate = computed({\n get() {\n return store.playbackRate;\n },\n set(value) {\n store.playbackRate = value;\n if (animate.value)\n animate.value.playbackRate = value;\n }\n });\n const play = () => {\n if (animate.value) {\n try {\n animate.value.play();\n syncResume();\n } catch (e) {\n syncPause();\n onError(e);\n }\n } else {\n update();\n }\n };\n const pause = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.pause();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n const reverse = () => {\n var _a;\n !animate.value && update();\n try {\n (_a = animate.value) == null ? void 0 : _a.reverse();\n syncResume();\n } catch (e) {\n syncPause();\n onError(e);\n }\n };\n const finish = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.finish();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n const cancel = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.cancel();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n watch(() => unrefElement(target), (el) => {\n el && update();\n });\n watch(() => keyframes, (value) => {\n !animate.value && update();\n if (!unrefElement(target) && animate.value) {\n animate.value.effect = new KeyframeEffect(\n unrefElement(target),\n toValue(value),\n animateOptions\n );\n }\n }, { deep: true });\n tryOnMounted(() => {\n nextTick(() => update(true));\n });\n tryOnScopeDispose(cancel);\n function update(init) {\n const el = unrefElement(target);\n if (!isSupported.value || !el)\n return;\n if (!animate.value)\n animate.value = el.animate(toValue(keyframes), animateOptions);\n if (persist)\n animate.value.persist();\n if (_playbackRate !== 1)\n animate.value.playbackRate = _playbackRate;\n if (init && !immediate)\n animate.value.pause();\n else\n syncResume();\n onReady == null ? void 0 : onReady(animate.value);\n }\n useEventListener(animate, [\"cancel\", \"finish\", \"remove\"], syncPause);\n useEventListener(animate, \"finish\", () => {\n var _a;\n if (commitStyles)\n (_a = animate.value) == null ? void 0 : _a.commitStyles();\n });\n const { resume: resumeRef, pause: pauseRef } = useRafFn(() => {\n if (!animate.value)\n return;\n store.pending = animate.value.pending;\n store.playState = animate.value.playState;\n store.replaceState = animate.value.replaceState;\n store.startTime = animate.value.startTime;\n store.currentTime = animate.value.currentTime;\n store.timeline = animate.value.timeline;\n store.playbackRate = animate.value.playbackRate;\n }, { immediate: false });\n function syncResume() {\n if (isSupported.value)\n resumeRef();\n }\n function syncPause() {\n if (isSupported.value && window)\n window.requestAnimationFrame(pauseRef);\n }\n return {\n isSupported,\n animate,\n // actions\n play,\n pause,\n reverse,\n finish,\n cancel,\n // state\n pending,\n playState,\n replaceState,\n startTime,\n currentTime,\n timeline,\n playbackRate\n };\n}\n\nfunction useAsyncQueue(tasks, options) {\n const {\n interrupt = true,\n onError = noop,\n onFinished = noop,\n signal\n } = options || {};\n const promiseState = {\n aborted: \"aborted\",\n fulfilled: \"fulfilled\",\n pending: \"pending\",\n rejected: \"rejected\"\n };\n const initialResult = Array.from(Array.from({ length: tasks.length }), () => ({ state: promiseState.pending, data: null }));\n const result = reactive(initialResult);\n const activeIndex = ref(-1);\n if (!tasks || tasks.length === 0) {\n onFinished();\n return {\n activeIndex,\n result\n };\n }\n function updateResult(state, res) {\n activeIndex.value++;\n result[activeIndex.value].data = res;\n result[activeIndex.value].state = state;\n }\n tasks.reduce((prev, curr) => {\n return prev.then((prevRes) => {\n var _a;\n if (signal == null ? void 0 : signal.aborted) {\n updateResult(promiseState.aborted, new Error(\"aborted\"));\n return;\n }\n if (((_a = result[activeIndex.value]) == null ? void 0 : _a.state) === promiseState.rejected && interrupt) {\n onFinished();\n return;\n }\n const done = curr(prevRes).then((currentRes) => {\n updateResult(promiseState.fulfilled, currentRes);\n activeIndex.value === tasks.length - 1 && onFinished();\n return currentRes;\n });\n if (!signal)\n return done;\n return Promise.race([done, whenAborted(signal)]);\n }).catch((e) => {\n if (signal == null ? void 0 : signal.aborted) {\n updateResult(promiseState.aborted, e);\n return e;\n }\n updateResult(promiseState.rejected, e);\n onError();\n return e;\n });\n }, Promise.resolve());\n return {\n activeIndex,\n result\n };\n}\nfunction whenAborted(signal) {\n return new Promise((resolve, reject) => {\n const error = new Error(\"aborted\");\n if (signal.aborted)\n reject(error);\n else\n signal.addEventListener(\"abort\", () => reject(error), { once: true });\n });\n}\n\nfunction useAsyncState(promise, initialState, options) {\n const {\n immediate = true,\n delay = 0,\n onError = noop,\n onSuccess = noop,\n resetOnExecute = true,\n shallow = true,\n throwError\n } = options != null ? options : {};\n const state = shallow ? shallowRef(initialState) : ref(initialState);\n const isReady = ref(false);\n const isLoading = ref(false);\n const error = shallowRef(void 0);\n async function execute(delay2 = 0, ...args) {\n if (resetOnExecute)\n state.value = initialState;\n error.value = void 0;\n isReady.value = false;\n isLoading.value = true;\n if (delay2 > 0)\n await promiseTimeout(delay2);\n const _promise = typeof promise === \"function\" ? promise(...args) : promise;\n try {\n const data = await _promise;\n state.value = data;\n isReady.value = true;\n onSuccess(data);\n } catch (e) {\n error.value = e;\n onError(e);\n if (throwError)\n throw e;\n } finally {\n isLoading.value = false;\n }\n return state.value;\n }\n if (immediate)\n execute(delay);\n const shell = {\n state,\n isReady,\n isLoading,\n error,\n execute\n };\n function waitUntilIsLoaded() {\n return new Promise((resolve, reject) => {\n until(isLoading).toBe(false).then(() => resolve(shell)).catch(reject);\n });\n }\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilIsLoaded().then(onFulfilled, onRejected);\n }\n };\n}\n\nconst defaults = {\n array: (v) => JSON.stringify(v),\n object: (v) => JSON.stringify(v),\n set: (v) => JSON.stringify(Array.from(v)),\n map: (v) => JSON.stringify(Object.fromEntries(v)),\n null: () => \"\"\n};\nfunction getDefaultSerialization(target) {\n if (!target)\n return defaults.null;\n if (target instanceof Map)\n return defaults.map;\n else if (target instanceof Set)\n return defaults.set;\n else if (Array.isArray(target))\n return defaults.array;\n else\n return defaults.object;\n}\n\nfunction useBase64(target, options) {\n const base64 = ref(\"\");\n const promise = ref();\n function execute() {\n if (!isClient)\n return;\n promise.value = new Promise((resolve, reject) => {\n try {\n const _target = toValue(target);\n if (_target == null) {\n resolve(\"\");\n } else if (typeof _target === \"string\") {\n resolve(blobToBase64(new Blob([_target], { type: \"text/plain\" })));\n } else if (_target instanceof Blob) {\n resolve(blobToBase64(_target));\n } else if (_target instanceof ArrayBuffer) {\n resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target))));\n } else if (_target instanceof HTMLCanvasElement) {\n resolve(_target.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n } else if (_target instanceof HTMLImageElement) {\n const img = _target.cloneNode(false);\n img.crossOrigin = \"Anonymous\";\n imgLoaded(img).then(() => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n resolve(canvas.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n }).catch(reject);\n } else if (typeof _target === \"object\") {\n const _serializeFn = (options == null ? void 0 : options.serializer) || getDefaultSerialization(_target);\n const serialized = _serializeFn(_target);\n return resolve(blobToBase64(new Blob([serialized], { type: \"application/json\" })));\n } else {\n reject(new Error(\"target is unsupported types\"));\n }\n } catch (error) {\n reject(error);\n }\n });\n promise.value.then((res) => base64.value = res);\n return promise.value;\n }\n if (isRef(target) || typeof target === \"function\")\n watch(target, execute, { immediate: true });\n else\n execute();\n return {\n base64,\n promise,\n execute\n };\n}\nfunction imgLoaded(img) {\n return new Promise((resolve, reject) => {\n if (!img.complete) {\n img.onload = () => {\n resolve();\n };\n img.onerror = reject;\n } else {\n resolve();\n }\n });\n}\nfunction blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const fr = new FileReader();\n fr.onload = (e) => {\n resolve(e.target.result);\n };\n fr.onerror = reject;\n fr.readAsDataURL(blob);\n });\n}\n\nfunction useBattery(options = {}) {\n const { navigator = defaultNavigator } = options;\n const events = [\"chargingchange\", \"chargingtimechange\", \"dischargingtimechange\", \"levelchange\"];\n const isSupported = useSupported(() => navigator && \"getBattery\" in navigator && typeof navigator.getBattery === \"function\");\n const charging = ref(false);\n const chargingTime = ref(0);\n const dischargingTime = ref(0);\n const level = ref(1);\n let battery;\n function updateBatteryInfo() {\n charging.value = this.charging;\n chargingTime.value = this.chargingTime || 0;\n dischargingTime.value = this.dischargingTime || 0;\n level.value = this.level;\n }\n if (isSupported.value) {\n navigator.getBattery().then((_battery) => {\n battery = _battery;\n updateBatteryInfo.call(battery);\n useEventListener(battery, events, updateBatteryInfo, { passive: true });\n });\n }\n return {\n isSupported,\n charging,\n chargingTime,\n dischargingTime,\n level\n };\n}\n\nfunction useBluetooth(options) {\n let {\n acceptAllDevices = false\n } = options || {};\n const {\n filters = void 0,\n optionalServices = void 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = useSupported(() => navigator && \"bluetooth\" in navigator);\n const device = shallowRef(void 0);\n const error = shallowRef(null);\n watch(device, () => {\n connectToBluetoothGATTServer();\n });\n async function requestDevice() {\n if (!isSupported.value)\n return;\n error.value = null;\n if (filters && filters.length > 0)\n acceptAllDevices = false;\n try {\n device.value = await (navigator == null ? void 0 : navigator.bluetooth.requestDevice({\n acceptAllDevices,\n filters,\n optionalServices\n }));\n } catch (err) {\n error.value = err;\n }\n }\n const server = ref();\n const isConnected = computed(() => {\n var _a;\n return ((_a = server.value) == null ? void 0 : _a.connected) || false;\n });\n async function connectToBluetoothGATTServer() {\n error.value = null;\n if (device.value && device.value.gatt) {\n device.value.addEventListener(\"gattserverdisconnected\", () => {\n });\n try {\n server.value = await device.value.gatt.connect();\n } catch (err) {\n error.value = err;\n }\n }\n }\n tryOnMounted(() => {\n var _a;\n if (device.value)\n (_a = device.value.gatt) == null ? void 0 : _a.connect();\n });\n tryOnScopeDispose(() => {\n var _a;\n if (device.value)\n (_a = device.value.gatt) == null ? void 0 : _a.disconnect();\n });\n return {\n isSupported,\n isConnected,\n // Device:\n device,\n requestDevice,\n // Server:\n server,\n // Errors:\n error\n };\n}\n\nfunction useMediaQuery(query, options = {}) {\n const { window = defaultWindow } = options;\n const isSupported = useSupported(() => window && \"matchMedia\" in window && typeof window.matchMedia === \"function\");\n let mediaQuery;\n const matches = ref(false);\n const handler = (event) => {\n matches.value = event.matches;\n };\n const cleanup = () => {\n if (!mediaQuery)\n return;\n if (\"removeEventListener\" in mediaQuery)\n mediaQuery.removeEventListener(\"change\", handler);\n else\n mediaQuery.removeListener(handler);\n };\n const stopWatch = watchEffect(() => {\n if (!isSupported.value)\n return;\n cleanup();\n mediaQuery = window.matchMedia(toValue(query));\n if (\"addEventListener\" in mediaQuery)\n mediaQuery.addEventListener(\"change\", handler);\n else\n mediaQuery.addListener(handler);\n matches.value = mediaQuery.matches;\n });\n tryOnScopeDispose(() => {\n stopWatch();\n cleanup();\n mediaQuery = void 0;\n });\n return matches;\n}\n\nconst breakpointsTailwind = {\n \"sm\": 640,\n \"md\": 768,\n \"lg\": 1024,\n \"xl\": 1280,\n \"2xl\": 1536\n};\nconst breakpointsBootstrapV5 = {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1400\n};\nconst breakpointsVuetifyV2 = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1264,\n xl: 1904\n};\nconst breakpointsVuetifyV3 = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1920,\n xxl: 2560\n};\nconst breakpointsVuetify = breakpointsVuetifyV2;\nconst breakpointsAntDesign = {\n xs: 480,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1600\n};\nconst breakpointsQuasar = {\n xs: 0,\n sm: 600,\n md: 1024,\n lg: 1440,\n xl: 1920\n};\nconst breakpointsSematic = {\n mobileS: 320,\n mobileM: 375,\n mobileL: 425,\n tablet: 768,\n laptop: 1024,\n laptopL: 1440,\n desktop4K: 2560\n};\nconst breakpointsMasterCss = {\n \"3xs\": 360,\n \"2xs\": 480,\n \"xs\": 600,\n \"sm\": 768,\n \"md\": 1024,\n \"lg\": 1280,\n \"xl\": 1440,\n \"2xl\": 1600,\n \"3xl\": 1920,\n \"4xl\": 2560\n};\nconst breakpointsPrimeFlex = {\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200\n};\n\nfunction useBreakpoints(breakpoints, options = {}) {\n function getValue(k, delta) {\n let v = toValue(breakpoints[toValue(k)]);\n if (delta != null)\n v = increaseWithUnit(v, delta);\n if (typeof v === \"number\")\n v = `${v}px`;\n return v;\n }\n const { window = defaultWindow, strategy = \"min-width\" } = options;\n function match(query) {\n if (!window)\n return false;\n return window.matchMedia(query).matches;\n }\n const greaterOrEqual = (k) => {\n return useMediaQuery(() => `(min-width: ${getValue(k)})`, options);\n };\n const smallerOrEqual = (k) => {\n return useMediaQuery(() => `(max-width: ${getValue(k)})`, options);\n };\n const shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => {\n Object.defineProperty(shortcuts, k, {\n get: () => strategy === \"min-width\" ? greaterOrEqual(k) : smallerOrEqual(k),\n enumerable: true,\n configurable: true\n });\n return shortcuts;\n }, {});\n function current() {\n const points = Object.keys(breakpoints).map((i) => [i, greaterOrEqual(i)]);\n return computed(() => points.filter(([, v]) => v.value).map(([k]) => k));\n }\n return Object.assign(shortcutMethods, {\n greaterOrEqual,\n smallerOrEqual,\n greater(k) {\n return useMediaQuery(() => `(min-width: ${getValue(k, 0.1)})`, options);\n },\n smaller(k) {\n return useMediaQuery(() => `(max-width: ${getValue(k, -0.1)})`, options);\n },\n between(a, b) {\n return useMediaQuery(() => `(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`, options);\n },\n isGreater(k) {\n return match(`(min-width: ${getValue(k, 0.1)})`);\n },\n isGreaterOrEqual(k) {\n return match(`(min-width: ${getValue(k)})`);\n },\n isSmaller(k) {\n return match(`(max-width: ${getValue(k, -0.1)})`);\n },\n isSmallerOrEqual(k) {\n return match(`(max-width: ${getValue(k)})`);\n },\n isInBetween(a, b) {\n return match(`(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`);\n },\n current,\n active() {\n const bps = current();\n return computed(() => bps.value.length === 0 ? \"\" : bps.value.at(-1));\n }\n });\n}\n\nfunction useBroadcastChannel(options) {\n const {\n name,\n window = defaultWindow\n } = options;\n const isSupported = useSupported(() => window && \"BroadcastChannel\" in window);\n const isClosed = ref(false);\n const channel = ref();\n const data = ref();\n const error = shallowRef(null);\n const post = (data2) => {\n if (channel.value)\n channel.value.postMessage(data2);\n };\n const close = () => {\n if (channel.value)\n channel.value.close();\n isClosed.value = true;\n };\n if (isSupported.value) {\n tryOnMounted(() => {\n error.value = null;\n channel.value = new BroadcastChannel(name);\n channel.value.addEventListener(\"message\", (e) => {\n data.value = e.data;\n }, { passive: true });\n channel.value.addEventListener(\"messageerror\", (e) => {\n error.value = e;\n }, { passive: true });\n channel.value.addEventListener(\"close\", () => {\n isClosed.value = true;\n });\n });\n }\n tryOnScopeDispose(() => {\n close();\n });\n return {\n isSupported,\n channel,\n data,\n post,\n close,\n error,\n isClosed\n };\n}\n\nconst WRITABLE_PROPERTIES = [\n \"hash\",\n \"host\",\n \"hostname\",\n \"href\",\n \"pathname\",\n \"port\",\n \"protocol\",\n \"search\"\n];\nfunction useBrowserLocation(options = {}) {\n const { window = defaultWindow } = options;\n const refs = Object.fromEntries(\n WRITABLE_PROPERTIES.map((key) => [key, ref()])\n );\n for (const [key, ref2] of objectEntries(refs)) {\n watch(ref2, (value) => {\n if (!(window == null ? void 0 : window.location) || window.location[key] === value)\n return;\n window.location[key] = value;\n });\n }\n const buildState = (trigger) => {\n var _a;\n const { state: state2, length } = (window == null ? void 0 : window.history) || {};\n const { origin } = (window == null ? void 0 : window.location) || {};\n for (const key of WRITABLE_PROPERTIES)\n refs[key].value = (_a = window == null ? void 0 : window.location) == null ? void 0 : _a[key];\n return reactive({\n trigger,\n state: state2,\n length,\n origin,\n ...refs\n });\n };\n const state = ref(buildState(\"load\"));\n if (window) {\n useEventListener(window, \"popstate\", () => state.value = buildState(\"popstate\"), { passive: true });\n useEventListener(window, \"hashchange\", () => state.value = buildState(\"hashchange\"), { passive: true });\n }\n return state;\n}\n\nfunction useCached(refValue, comparator = (a, b) => a === b, watchOptions) {\n const cachedValue = ref(refValue.value);\n watch(() => refValue.value, (value) => {\n if (!comparator(value, cachedValue.value))\n cachedValue.value = value;\n }, watchOptions);\n return cachedValue;\n}\n\nfunction usePermission(permissionDesc, options = {}) {\n const {\n controls = false,\n navigator = defaultNavigator\n } = options;\n const isSupported = useSupported(() => navigator && \"permissions\" in navigator);\n let permissionStatus;\n const desc = typeof permissionDesc === \"string\" ? { name: permissionDesc } : permissionDesc;\n const state = ref();\n const onChange = () => {\n if (permissionStatus)\n state.value = permissionStatus.state;\n };\n const query = createSingletonPromise(async () => {\n if (!isSupported.value)\n return;\n if (!permissionStatus) {\n try {\n permissionStatus = await navigator.permissions.query(desc);\n useEventListener(permissionStatus, \"change\", onChange);\n onChange();\n } catch (e) {\n state.value = \"prompt\";\n }\n }\n return permissionStatus;\n });\n query();\n if (controls) {\n return {\n state,\n isSupported,\n query\n };\n } else {\n return state;\n }\n}\n\nfunction useClipboard(options = {}) {\n const {\n navigator = defaultNavigator,\n read = false,\n source,\n copiedDuring = 1500,\n legacy = false\n } = options;\n const isClipboardApiSupported = useSupported(() => navigator && \"clipboard\" in navigator);\n const permissionRead = usePermission(\"clipboard-read\");\n const permissionWrite = usePermission(\"clipboard-write\");\n const isSupported = computed(() => isClipboardApiSupported.value || legacy);\n const text = ref(\"\");\n const copied = ref(false);\n const timeout = useTimeoutFn(() => copied.value = false, copiedDuring);\n function updateText() {\n if (isClipboardApiSupported.value && isAllowed(permissionRead.value)) {\n navigator.clipboard.readText().then((value) => {\n text.value = value;\n });\n } else {\n text.value = legacyRead();\n }\n }\n if (isSupported.value && read)\n useEventListener([\"copy\", \"cut\"], updateText);\n async function copy(value = toValue(source)) {\n if (isSupported.value && value != null) {\n if (isClipboardApiSupported.value && isAllowed(permissionWrite.value))\n await navigator.clipboard.writeText(value);\n else\n legacyCopy(value);\n text.value = value;\n copied.value = true;\n timeout.start();\n }\n }\n function legacyCopy(value) {\n const ta = document.createElement(\"textarea\");\n ta.value = value != null ? value : \"\";\n ta.style.position = \"absolute\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n ta.remove();\n }\n function legacyRead() {\n var _a, _b, _c;\n return (_c = (_b = (_a = document == null ? void 0 : document.getSelection) == null ? void 0 : _a.call(document)) == null ? void 0 : _b.toString()) != null ? _c : \"\";\n }\n function isAllowed(status) {\n return status === \"granted\" || status === \"prompt\";\n }\n return {\n isSupported,\n text,\n copied,\n copy\n };\n}\n\nfunction useClipboardItems(options = {}) {\n const {\n navigator = defaultNavigator,\n read = false,\n source,\n copiedDuring = 1500\n } = options;\n const isSupported = useSupported(() => navigator && \"clipboard\" in navigator);\n const content = ref([]);\n const copied = ref(false);\n const timeout = useTimeoutFn(() => copied.value = false, copiedDuring);\n function updateContent() {\n if (isSupported.value) {\n navigator.clipboard.read().then((items) => {\n content.value = items;\n });\n }\n }\n if (isSupported.value && read)\n useEventListener([\"copy\", \"cut\"], updateContent);\n async function copy(value = toValue(source)) {\n if (isSupported.value && value != null) {\n await navigator.clipboard.write(value);\n content.value = value;\n copied.value = true;\n timeout.start();\n }\n }\n return {\n isSupported,\n content,\n copied,\n copy\n };\n}\n\nfunction cloneFnJSON(source) {\n return JSON.parse(JSON.stringify(source));\n}\nfunction useCloned(source, options = {}) {\n const cloned = ref({});\n const {\n manual,\n clone = cloneFnJSON,\n // watch options\n deep = true,\n immediate = true\n } = options;\n function sync() {\n cloned.value = clone(toValue(source));\n }\n if (!manual && (isRef(source) || typeof source === \"function\")) {\n watch(source, sync, {\n ...options,\n deep,\n immediate\n });\n } else {\n sync();\n }\n return { cloned, sync };\n}\n\nconst _global = typeof globalThis !== \"undefined\" ? globalThis : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : {};\nconst globalKey = \"__vueuse_ssr_handlers__\";\nconst handlers = /* @__PURE__ */ getHandlers();\nfunction getHandlers() {\n if (!(globalKey in _global))\n _global[globalKey] = _global[globalKey] || {};\n return _global[globalKey];\n}\nfunction getSSRHandler(key, fallback) {\n return handlers[key] || fallback;\n}\nfunction setSSRHandler(key, fn) {\n handlers[key] = fn;\n}\n\nfunction guessSerializerType(rawInit) {\n return rawInit == null ? \"any\" : rawInit instanceof Set ? \"set\" : rawInit instanceof Map ? \"map\" : rawInit instanceof Date ? \"date\" : typeof rawInit === \"boolean\" ? \"boolean\" : typeof rawInit === \"string\" ? \"string\" : typeof rawInit === \"object\" ? \"object\" : !Number.isNaN(rawInit) ? \"number\" : \"any\";\n}\n\nconst StorageSerializers = {\n boolean: {\n read: (v) => v === \"true\",\n write: (v) => String(v)\n },\n object: {\n read: (v) => JSON.parse(v),\n write: (v) => JSON.stringify(v)\n },\n number: {\n read: (v) => Number.parseFloat(v),\n write: (v) => String(v)\n },\n any: {\n read: (v) => v,\n write: (v) => String(v)\n },\n string: {\n read: (v) => v,\n write: (v) => String(v)\n },\n map: {\n read: (v) => new Map(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v.entries()))\n },\n set: {\n read: (v) => new Set(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v))\n },\n date: {\n read: (v) => new Date(v),\n write: (v) => v.toISOString()\n }\n};\nconst customStorageEventName = \"vueuse-storage\";\nfunction useStorage(key, defaults, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n mergeDefaults = false,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n },\n initOnMounted\n } = options;\n const data = (shallow ? shallowRef : ref)(typeof defaults === \"function\" ? defaults() : defaults);\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorage\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n if (!storage)\n return data;\n const rawInit = toValue(defaults);\n const type = guessSerializerType(rawInit);\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n const { pause: pauseWatch, resume: resumeWatch } = pausableWatch(\n data,\n () => write(data.value),\n { flush, deep, eventFilter }\n );\n if (window && listenToStorageChanges) {\n tryOnMounted(() => {\n useEventListener(window, \"storage\", update);\n useEventListener(window, customStorageEventName, updateFromCustomEvent);\n if (initOnMounted)\n update();\n });\n }\n if (!initOnMounted)\n update();\n function dispatchWriteEvent(oldValue, newValue) {\n if (window) {\n window.dispatchEvent(new CustomEvent(customStorageEventName, {\n detail: {\n key,\n oldValue,\n newValue,\n storageArea: storage\n }\n }));\n }\n }\n function write(v) {\n try {\n const oldValue = storage.getItem(key);\n if (v == null) {\n dispatchWriteEvent(oldValue, null);\n storage.removeItem(key);\n } else {\n const serialized = serializer.write(v);\n if (oldValue !== serialized) {\n storage.setItem(key, serialized);\n dispatchWriteEvent(oldValue, serialized);\n }\n }\n } catch (e) {\n onError(e);\n }\n }\n function read(event) {\n const rawValue = event ? event.newValue : storage.getItem(key);\n if (rawValue == null) {\n if (writeDefaults && rawInit != null)\n storage.setItem(key, serializer.write(rawInit));\n return rawInit;\n } else if (!event && mergeDefaults) {\n const value = serializer.read(rawValue);\n if (typeof mergeDefaults === \"function\")\n return mergeDefaults(value, rawInit);\n else if (type === \"object\" && !Array.isArray(value))\n return { ...rawInit, ...value };\n return value;\n } else if (typeof rawValue !== \"string\") {\n return rawValue;\n } else {\n return serializer.read(rawValue);\n }\n }\n function update(event) {\n if (event && event.storageArea !== storage)\n return;\n if (event && event.key == null) {\n data.value = rawInit;\n return;\n }\n if (event && event.key !== key)\n return;\n pauseWatch();\n try {\n if ((event == null ? void 0 : event.newValue) !== serializer.write(data.value))\n data.value = read(event);\n } catch (e) {\n onError(e);\n } finally {\n if (event)\n nextTick(resumeWatch);\n else\n resumeWatch();\n }\n }\n function updateFromCustomEvent(event) {\n update(event.detail);\n }\n return data;\n}\n\nfunction usePreferredDark(options) {\n return useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n}\n\nfunction useColorMode(options = {}) {\n const {\n selector = \"html\",\n attribute = \"class\",\n initialValue = \"auto\",\n window = defaultWindow,\n storage,\n storageKey = \"vueuse-color-scheme\",\n listenToStorageChanges = true,\n storageRef,\n emitAuto,\n disableTransition = true\n } = options;\n const modes = {\n auto: \"\",\n light: \"light\",\n dark: \"dark\",\n ...options.modes || {}\n };\n const preferredDark = usePreferredDark({ window });\n const system = computed(() => preferredDark.value ? \"dark\" : \"light\");\n const store = storageRef || (storageKey == null ? toRef(initialValue) : useStorage(storageKey, initialValue, storage, { window, listenToStorageChanges }));\n const state = computed(() => store.value === \"auto\" ? system.value : store.value);\n const updateHTMLAttrs = getSSRHandler(\n \"updateHTMLAttrs\",\n (selector2, attribute2, value) => {\n const el = typeof selector2 === \"string\" ? window == null ? void 0 : window.document.querySelector(selector2) : unrefElement(selector2);\n if (!el)\n return;\n let style;\n if (disableTransition) {\n style = window.document.createElement(\"style\");\n const styleString = \"*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}\";\n style.appendChild(document.createTextNode(styleString));\n window.document.head.appendChild(style);\n }\n if (attribute2 === \"class\") {\n const current = value.split(/\\s/g);\n Object.values(modes).flatMap((i) => (i || \"\").split(/\\s/g)).filter(Boolean).forEach((v) => {\n if (current.includes(v))\n el.classList.add(v);\n else\n el.classList.remove(v);\n });\n } else {\n el.setAttribute(attribute2, value);\n }\n if (disableTransition) {\n window.getComputedStyle(style).opacity;\n document.head.removeChild(style);\n }\n }\n );\n function defaultOnChanged(mode) {\n var _a;\n updateHTMLAttrs(selector, attribute, (_a = modes[mode]) != null ? _a : mode);\n }\n function onChanged(mode) {\n if (options.onChanged)\n options.onChanged(mode, defaultOnChanged);\n else\n defaultOnChanged(mode);\n }\n watch(state, onChanged, { flush: \"post\", immediate: true });\n tryOnMounted(() => onChanged(state.value));\n const auto = computed({\n get() {\n return emitAuto ? store.value : state.value;\n },\n set(v) {\n store.value = v;\n }\n });\n try {\n return Object.assign(auto, { store, system, state });\n } catch (e) {\n return auto;\n }\n}\n\nfunction useConfirmDialog(revealed = ref(false)) {\n const confirmHook = createEventHook();\n const cancelHook = createEventHook();\n const revealHook = createEventHook();\n let _resolve = noop;\n const reveal = (data) => {\n revealHook.trigger(data);\n revealed.value = true;\n return new Promise((resolve) => {\n _resolve = resolve;\n });\n };\n const confirm = (data) => {\n revealed.value = false;\n confirmHook.trigger(data);\n _resolve({ data, isCanceled: false });\n };\n const cancel = (data) => {\n revealed.value = false;\n cancelHook.trigger(data);\n _resolve({ data, isCanceled: true });\n };\n return {\n isRevealed: computed(() => revealed.value),\n reveal,\n confirm,\n cancel,\n onReveal: revealHook.on,\n onConfirm: confirmHook.on,\n onCancel: cancelHook.on\n };\n}\n\nfunction useCssVar(prop, target, options = {}) {\n const { window = defaultWindow, initialValue = \"\", observe = false } = options;\n const variable = ref(initialValue);\n const elRef = computed(() => {\n var _a;\n return unrefElement(target) || ((_a = window == null ? void 0 : window.document) == null ? void 0 : _a.documentElement);\n });\n function updateCssVar() {\n var _a;\n const key = toValue(prop);\n const el = toValue(elRef);\n if (el && window) {\n const value = (_a = window.getComputedStyle(el).getPropertyValue(key)) == null ? void 0 : _a.trim();\n variable.value = value || initialValue;\n }\n }\n if (observe) {\n useMutationObserver(elRef, updateCssVar, {\n attributeFilter: [\"style\", \"class\"],\n window\n });\n }\n watch(\n [elRef, () => toValue(prop)],\n updateCssVar,\n { immediate: true }\n );\n watch(\n variable,\n (val) => {\n var _a;\n if ((_a = elRef.value) == null ? void 0 : _a.style)\n elRef.value.style.setProperty(toValue(prop), val);\n }\n );\n return variable;\n}\n\nfunction useCurrentElement(rootComponent) {\n const vm = getCurrentInstance();\n const currentElement = computedWithControl(\n () => null,\n () => rootComponent ? unrefElement(rootComponent) : vm.proxy.$el\n );\n onUpdated(currentElement.trigger);\n onMounted(currentElement.trigger);\n return currentElement;\n}\n\nfunction useCycleList(list, options) {\n const state = shallowRef(getInitialValue());\n const listRef = toRef(list);\n const index = computed({\n get() {\n var _a;\n const targetList = listRef.value;\n let index2 = (options == null ? void 0 : options.getIndexOf) ? options.getIndexOf(state.value, targetList) : targetList.indexOf(state.value);\n if (index2 < 0)\n index2 = (_a = options == null ? void 0 : options.fallbackIndex) != null ? _a : 0;\n return index2;\n },\n set(v) {\n set(v);\n }\n });\n function set(i) {\n const targetList = listRef.value;\n const length = targetList.length;\n const index2 = (i % length + length) % length;\n const value = targetList[index2];\n state.value = value;\n return value;\n }\n function shift(delta = 1) {\n return set(index.value + delta);\n }\n function next(n = 1) {\n return shift(n);\n }\n function prev(n = 1) {\n return shift(-n);\n }\n function getInitialValue() {\n var _a, _b;\n return (_b = toValue((_a = options == null ? void 0 : options.initialValue) != null ? _a : toValue(list)[0])) != null ? _b : void 0;\n }\n watch(listRef, () => set(index.value));\n return {\n state,\n index,\n next,\n prev,\n go: set\n };\n}\n\nfunction useDark(options = {}) {\n const {\n valueDark = \"dark\",\n valueLight = \"\",\n window = defaultWindow\n } = options;\n const mode = useColorMode({\n ...options,\n onChanged: (mode2, defaultHandler) => {\n var _a;\n if (options.onChanged)\n (_a = options.onChanged) == null ? void 0 : _a.call(options, mode2 === \"dark\", defaultHandler, mode2);\n else\n defaultHandler(mode2);\n },\n modes: {\n dark: valueDark,\n light: valueLight\n }\n });\n const system = computed(() => {\n if (mode.system) {\n return mode.system.value;\n } else {\n const preferredDark = usePreferredDark({ window });\n return preferredDark.value ? \"dark\" : \"light\";\n }\n });\n const isDark = computed({\n get() {\n return mode.value === \"dark\";\n },\n set(v) {\n const modeVal = v ? \"dark\" : \"light\";\n if (system.value === modeVal)\n mode.value = \"auto\";\n else\n mode.value = modeVal;\n }\n });\n return isDark;\n}\n\nfunction fnBypass(v) {\n return v;\n}\nfunction fnSetSource(source, value) {\n return source.value = value;\n}\nfunction defaultDump(clone) {\n return clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\nfunction defaultParse(clone) {\n return clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\nfunction useManualRefHistory(source, options = {}) {\n const {\n clone = false,\n dump = defaultDump(clone),\n parse = defaultParse(clone),\n setSource = fnSetSource\n } = options;\n function _createHistoryRecord() {\n return markRaw({\n snapshot: dump(source.value),\n timestamp: timestamp()\n });\n }\n const last = ref(_createHistoryRecord());\n const undoStack = ref([]);\n const redoStack = ref([]);\n const _setSource = (record) => {\n setSource(source, parse(record.snapshot));\n last.value = record;\n };\n const commit = () => {\n undoStack.value.unshift(last.value);\n last.value = _createHistoryRecord();\n if (options.capacity && undoStack.value.length > options.capacity)\n undoStack.value.splice(options.capacity, Number.POSITIVE_INFINITY);\n if (redoStack.value.length)\n redoStack.value.splice(0, redoStack.value.length);\n };\n const clear = () => {\n undoStack.value.splice(0, undoStack.value.length);\n redoStack.value.splice(0, redoStack.value.length);\n };\n const undo = () => {\n const state = undoStack.value.shift();\n if (state) {\n redoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const redo = () => {\n const state = redoStack.value.shift();\n if (state) {\n undoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const reset = () => {\n _setSource(last.value);\n };\n const history = computed(() => [last.value, ...undoStack.value]);\n const canUndo = computed(() => undoStack.value.length > 0);\n const canRedo = computed(() => redoStack.value.length > 0);\n return {\n source,\n undoStack,\n redoStack,\n last,\n history,\n canUndo,\n canRedo,\n clear,\n commit,\n reset,\n undo,\n redo\n };\n}\n\nfunction useRefHistory(source, options = {}) {\n const {\n deep = false,\n flush = \"pre\",\n eventFilter\n } = options;\n const {\n eventFilter: composedFilter,\n pause,\n resume: resumeTracking,\n isActive: isTracking\n } = pausableFilter(eventFilter);\n const {\n ignoreUpdates,\n ignorePrevAsyncUpdates,\n stop\n } = watchIgnorable(\n source,\n commit,\n { deep, flush, eventFilter: composedFilter }\n );\n function setSource(source2, value) {\n ignorePrevAsyncUpdates();\n ignoreUpdates(() => {\n source2.value = value;\n });\n }\n const manualHistory = useManualRefHistory(source, { ...options, clone: options.clone || deep, setSource });\n const { clear, commit: manualCommit } = manualHistory;\n function commit() {\n ignorePrevAsyncUpdates();\n manualCommit();\n }\n function resume(commitNow) {\n resumeTracking();\n if (commitNow)\n commit();\n }\n function batch(fn) {\n let canceled = false;\n const cancel = () => canceled = true;\n ignoreUpdates(() => {\n fn(cancel);\n });\n if (!canceled)\n commit();\n }\n function dispose() {\n stop();\n clear();\n }\n return {\n ...manualHistory,\n isTracking,\n pause,\n resume,\n commit,\n batch,\n dispose\n };\n}\n\nfunction useDebouncedRefHistory(source, options = {}) {\n const filter = options.debounce ? debounceFilter(options.debounce) : void 0;\n const history = useRefHistory(source, { ...options, eventFilter: filter });\n return {\n ...history\n };\n}\n\nfunction useDeviceMotion(options = {}) {\n const {\n window = defaultWindow,\n eventFilter = bypassFilter\n } = options;\n const acceleration = ref({ x: null, y: null, z: null });\n const rotationRate = ref({ alpha: null, beta: null, gamma: null });\n const interval = ref(0);\n const accelerationIncludingGravity = ref({\n x: null,\n y: null,\n z: null\n });\n if (window) {\n const onDeviceMotion = createFilterWrapper(\n eventFilter,\n (event) => {\n acceleration.value = event.acceleration;\n accelerationIncludingGravity.value = event.accelerationIncludingGravity;\n rotationRate.value = event.rotationRate;\n interval.value = event.interval;\n }\n );\n useEventListener(window, \"devicemotion\", onDeviceMotion);\n }\n return {\n acceleration,\n accelerationIncludingGravity,\n rotationRate,\n interval\n };\n}\n\nfunction useDeviceOrientation(options = {}) {\n const { window = defaultWindow } = options;\n const isSupported = useSupported(() => window && \"DeviceOrientationEvent\" in window);\n const isAbsolute = ref(false);\n const alpha = ref(null);\n const beta = ref(null);\n const gamma = ref(null);\n if (window && isSupported.value) {\n useEventListener(window, \"deviceorientation\", (event) => {\n isAbsolute.value = event.absolute;\n alpha.value = event.alpha;\n beta.value = event.beta;\n gamma.value = event.gamma;\n });\n }\n return {\n isSupported,\n isAbsolute,\n alpha,\n beta,\n gamma\n };\n}\n\nfunction useDevicePixelRatio(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const pixelRatio = ref(1);\n if (window) {\n let observe2 = function() {\n pixelRatio.value = window.devicePixelRatio;\n cleanup2();\n media = window.matchMedia(`(resolution: ${pixelRatio.value}dppx)`);\n media.addEventListener(\"change\", observe2, { once: true });\n }, cleanup2 = function() {\n media == null ? void 0 : media.removeEventListener(\"change\", observe2);\n };\n let media;\n observe2();\n tryOnScopeDispose(cleanup2);\n }\n return { pixelRatio };\n}\n\nfunction useDevicesList(options = {}) {\n const {\n navigator = defaultNavigator,\n requestPermissions = false,\n constraints = { audio: true, video: true },\n onUpdated\n } = options;\n const devices = ref([]);\n const videoInputs = computed(() => devices.value.filter((i) => i.kind === \"videoinput\"));\n const audioInputs = computed(() => devices.value.filter((i) => i.kind === \"audioinput\"));\n const audioOutputs = computed(() => devices.value.filter((i) => i.kind === \"audiooutput\"));\n const isSupported = useSupported(() => navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices);\n const permissionGranted = ref(false);\n let stream;\n async function update() {\n if (!isSupported.value)\n return;\n devices.value = await navigator.mediaDevices.enumerateDevices();\n onUpdated == null ? void 0 : onUpdated(devices.value);\n if (stream) {\n stream.getTracks().forEach((t) => t.stop());\n stream = null;\n }\n }\n async function ensurePermissions() {\n if (!isSupported.value)\n return false;\n if (permissionGranted.value)\n return true;\n const { state, query } = usePermission(\"camera\", { controls: true });\n await query();\n if (state.value !== \"granted\") {\n stream = await navigator.mediaDevices.getUserMedia(constraints);\n update();\n permissionGranted.value = true;\n } else {\n permissionGranted.value = true;\n }\n return permissionGranted.value;\n }\n if (isSupported.value) {\n if (requestPermissions)\n ensurePermissions();\n useEventListener(navigator.mediaDevices, \"devicechange\", update);\n update();\n }\n return {\n devices,\n ensurePermissions,\n permissionGranted,\n videoInputs,\n audioInputs,\n audioOutputs,\n isSupported\n };\n}\n\nfunction useDisplayMedia(options = {}) {\n var _a;\n const enabled = ref((_a = options.enabled) != null ? _a : false);\n const video = options.video;\n const audio = options.audio;\n const { navigator = defaultNavigator } = options;\n const isSupported = useSupported(() => {\n var _a2;\n return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getDisplayMedia;\n });\n const constraint = { audio, video };\n const stream = shallowRef();\n async function _start() {\n var _a2;\n if (!isSupported.value || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getDisplayMedia(constraint);\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.addEventListener(\"ended\", stop));\n return stream.value;\n }\n async function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n watch(\n enabled,\n (v) => {\n if (v)\n _start();\n else\n _stop();\n },\n { immediate: true }\n );\n return {\n isSupported,\n stream,\n start,\n stop,\n enabled\n };\n}\n\nfunction useDocumentVisibility(options = {}) {\n const { document = defaultDocument } = options;\n if (!document)\n return ref(\"visible\");\n const visibility = ref(document.visibilityState);\n useEventListener(document, \"visibilitychange\", () => {\n visibility.value = document.visibilityState;\n });\n return visibility;\n}\n\nfunction useDraggable(target, options = {}) {\n var _a, _b;\n const {\n pointerTypes,\n preventDefault,\n stopPropagation,\n exact,\n onMove,\n onEnd,\n onStart,\n initialValue,\n axis = \"both\",\n draggingElement = defaultWindow,\n containerElement,\n handle: draggingHandle = target\n } = options;\n const position = ref(\n (_a = toValue(initialValue)) != null ? _a : { x: 0, y: 0 }\n );\n const pressedDelta = ref();\n const filterEvent = (e) => {\n if (pointerTypes)\n return pointerTypes.includes(e.pointerType);\n return true;\n };\n const handleEvent = (e) => {\n if (toValue(preventDefault))\n e.preventDefault();\n if (toValue(stopPropagation))\n e.stopPropagation();\n };\n const start = (e) => {\n var _a2;\n if (e.button !== 0)\n return;\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (toValue(exact) && e.target !== toValue(target))\n return;\n const container = toValue(containerElement);\n const containerRect = (_a2 = container == null ? void 0 : container.getBoundingClientRect) == null ? void 0 : _a2.call(container);\n const targetRect = toValue(target).getBoundingClientRect();\n const pos = {\n x: e.clientX - (container ? targetRect.left - containerRect.left + container.scrollLeft : targetRect.left),\n y: e.clientY - (container ? targetRect.top - containerRect.top + container.scrollTop : targetRect.top)\n };\n if ((onStart == null ? void 0 : onStart(pos, e)) === false)\n return;\n pressedDelta.value = pos;\n handleEvent(e);\n };\n const move = (e) => {\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n const container = toValue(containerElement);\n const targetRect = toValue(target).getBoundingClientRect();\n let { x, y } = position.value;\n if (axis === \"x\" || axis === \"both\") {\n x = e.clientX - pressedDelta.value.x;\n if (container)\n x = Math.min(Math.max(0, x), container.scrollWidth - targetRect.width);\n }\n if (axis === \"y\" || axis === \"both\") {\n y = e.clientY - pressedDelta.value.y;\n if (container)\n y = Math.min(Math.max(0, y), container.scrollHeight - targetRect.height);\n }\n position.value = {\n x,\n y\n };\n onMove == null ? void 0 : onMove(position.value, e);\n handleEvent(e);\n };\n const end = (e) => {\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n pressedDelta.value = void 0;\n onEnd == null ? void 0 : onEnd(position.value, e);\n handleEvent(e);\n };\n if (isClient) {\n const config = { capture: (_b = options.capture) != null ? _b : true };\n useEventListener(draggingHandle, \"pointerdown\", start, config);\n useEventListener(draggingElement, \"pointermove\", move, config);\n useEventListener(draggingElement, \"pointerup\", end, config);\n }\n return {\n ...toRefs(position),\n position,\n isDragging: computed(() => !!pressedDelta.value),\n style: computed(\n () => `left:${position.value.x}px;top:${position.value.y}px;`\n )\n };\n}\n\nfunction useDropZone(target, options = {}) {\n const isOverDropZone = ref(false);\n const files = shallowRef(null);\n let counter = 0;\n let isDataTypeIncluded = true;\n if (isClient) {\n const _options = typeof options === \"function\" ? { onDrop: options } : options;\n const getFiles = (event) => {\n var _a, _b;\n const list = Array.from((_b = (_a = event.dataTransfer) == null ? void 0 : _a.files) != null ? _b : []);\n return files.value = list.length === 0 ? null : list;\n };\n useEventListener(target, \"dragenter\", (event) => {\n var _a, _b;\n const types = Array.from(((_a = event == null ? void 0 : event.dataTransfer) == null ? void 0 : _a.items) || []).map((i) => i.kind === \"file\" ? i.type : null).filter(notNullish);\n if (_options.dataTypes && event.dataTransfer) {\n const dataTypes = unref(_options.dataTypes);\n isDataTypeIncluded = typeof dataTypes === \"function\" ? dataTypes(types) : dataTypes ? dataTypes.some((item) => types.includes(item)) : true;\n if (!isDataTypeIncluded)\n return;\n }\n event.preventDefault();\n counter += 1;\n isOverDropZone.value = true;\n (_b = _options.onEnter) == null ? void 0 : _b.call(_options, getFiles(event), event);\n });\n useEventListener(target, \"dragover\", (event) => {\n var _a;\n if (!isDataTypeIncluded)\n return;\n event.preventDefault();\n (_a = _options.onOver) == null ? void 0 : _a.call(_options, getFiles(event), event);\n });\n useEventListener(target, \"dragleave\", (event) => {\n var _a;\n if (!isDataTypeIncluded)\n return;\n event.preventDefault();\n counter -= 1;\n if (counter === 0)\n isOverDropZone.value = false;\n (_a = _options.onLeave) == null ? void 0 : _a.call(_options, getFiles(event), event);\n });\n useEventListener(target, \"drop\", (event) => {\n var _a;\n event.preventDefault();\n counter = 0;\n isOverDropZone.value = false;\n (_a = _options.onDrop) == null ? void 0 : _a.call(_options, getFiles(event), event);\n });\n }\n return {\n files,\n isOverDropZone\n };\n}\n\nfunction useResizeObserver(target, callback, options = {}) {\n const { window = defaultWindow, ...observerOptions } = options;\n let observer;\n const isSupported = useSupported(() => window && \"ResizeObserver\" in window);\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const targets = computed(() => Array.isArray(target) ? target.map((el) => unrefElement(el)) : [unrefElement(target)]);\n const stopWatch = watch(\n targets,\n (els) => {\n cleanup();\n if (isSupported.value && window) {\n observer = new ResizeObserver(callback);\n for (const _el of els)\n _el && observer.observe(_el, observerOptions);\n }\n },\n { immediate: true, flush: \"post\" }\n );\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop\n };\n}\n\nfunction useElementBounding(target, options = {}) {\n const {\n reset = true,\n windowResize = true,\n windowScroll = true,\n immediate = true\n } = options;\n const height = ref(0);\n const bottom = ref(0);\n const left = ref(0);\n const right = ref(0);\n const top = ref(0);\n const width = ref(0);\n const x = ref(0);\n const y = ref(0);\n function update() {\n const el = unrefElement(target);\n if (!el) {\n if (reset) {\n height.value = 0;\n bottom.value = 0;\n left.value = 0;\n right.value = 0;\n top.value = 0;\n width.value = 0;\n x.value = 0;\n y.value = 0;\n }\n return;\n }\n const rect = el.getBoundingClientRect();\n height.value = rect.height;\n bottom.value = rect.bottom;\n left.value = rect.left;\n right.value = rect.right;\n top.value = rect.top;\n width.value = rect.width;\n x.value = rect.x;\n y.value = rect.y;\n }\n useResizeObserver(target, update);\n watch(() => unrefElement(target), (ele) => !ele && update());\n useMutationObserver(target, update, {\n attributeFilter: [\"style\", \"class\"]\n });\n if (windowScroll)\n useEventListener(\"scroll\", update, { capture: true, passive: true });\n if (windowResize)\n useEventListener(\"resize\", update, { passive: true });\n tryOnMounted(() => {\n if (immediate)\n update();\n });\n return {\n height,\n bottom,\n left,\n right,\n top,\n width,\n x,\n y,\n update\n };\n}\n\nfunction useElementByPoint(options) {\n const {\n x,\n y,\n document = defaultDocument,\n multiple,\n interval = \"requestAnimationFrame\",\n immediate = true\n } = options;\n const isSupported = useSupported(() => {\n if (toValue(multiple))\n return document && \"elementsFromPoint\" in document;\n return document && \"elementFromPoint\" in document;\n });\n const element = ref(null);\n const cb = () => {\n var _a, _b;\n element.value = toValue(multiple) ? (_a = document == null ? void 0 : document.elementsFromPoint(toValue(x), toValue(y))) != null ? _a : [] : (_b = document == null ? void 0 : document.elementFromPoint(toValue(x), toValue(y))) != null ? _b : null;\n };\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });\n return {\n isSupported,\n element,\n ...controls\n };\n}\n\nfunction useElementHover(el, options = {}) {\n const {\n delayEnter = 0,\n delayLeave = 0,\n window = defaultWindow\n } = options;\n const isHovered = ref(false);\n let timer;\n const toggle = (entering) => {\n const delay = entering ? delayEnter : delayLeave;\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n }\n if (delay)\n timer = setTimeout(() => isHovered.value = entering, delay);\n else\n isHovered.value = entering;\n };\n if (!window)\n return isHovered;\n useEventListener(el, \"mouseenter\", () => toggle(true), { passive: true });\n useEventListener(el, \"mouseleave\", () => toggle(false), { passive: true });\n return isHovered;\n}\n\nfunction useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) {\n const { window = defaultWindow, box = \"content-box\" } = options;\n const isSVG = computed(() => {\n var _a, _b;\n return (_b = (_a = unrefElement(target)) == null ? void 0 : _a.namespaceURI) == null ? void 0 : _b.includes(\"svg\");\n });\n const width = ref(initialSize.width);\n const height = ref(initialSize.height);\n const { stop: stop1 } = useResizeObserver(\n target,\n ([entry]) => {\n const boxSize = box === \"border-box\" ? entry.borderBoxSize : box === \"content-box\" ? entry.contentBoxSize : entry.devicePixelContentBoxSize;\n if (window && isSVG.value) {\n const $elem = unrefElement(target);\n if ($elem) {\n const rect = $elem.getBoundingClientRect();\n width.value = rect.width;\n height.value = rect.height;\n }\n } else {\n if (boxSize) {\n const formatBoxSize = Array.isArray(boxSize) ? boxSize : [boxSize];\n width.value = formatBoxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0);\n height.value = formatBoxSize.reduce((acc, { blockSize }) => acc + blockSize, 0);\n } else {\n width.value = entry.contentRect.width;\n height.value = entry.contentRect.height;\n }\n }\n },\n options\n );\n tryOnMounted(() => {\n const ele = unrefElement(target);\n if (ele) {\n width.value = \"offsetWidth\" in ele ? ele.offsetWidth : initialSize.width;\n height.value = \"offsetHeight\" in ele ? ele.offsetHeight : initialSize.height;\n }\n });\n const stop2 = watch(\n () => unrefElement(target),\n (ele) => {\n width.value = ele ? initialSize.width : 0;\n height.value = ele ? initialSize.height : 0;\n }\n );\n function stop() {\n stop1();\n stop2();\n }\n return {\n width,\n height,\n stop\n };\n}\n\nfunction useIntersectionObserver(target, callback, options = {}) {\n const {\n root,\n rootMargin = \"0px\",\n threshold = 0.1,\n window = defaultWindow,\n immediate = true\n } = options;\n const isSupported = useSupported(() => window && \"IntersectionObserver\" in window);\n const targets = computed(() => {\n const _target = toValue(target);\n return (Array.isArray(_target) ? _target : [_target]).map(unrefElement).filter(notNullish);\n });\n let cleanup = noop;\n const isActive = ref(immediate);\n const stopWatch = isSupported.value ? watch(\n () => [targets.value, unrefElement(root), isActive.value],\n ([targets2, root2]) => {\n cleanup();\n if (!isActive.value)\n return;\n if (!targets2.length)\n return;\n const observer = new IntersectionObserver(\n callback,\n {\n root: unrefElement(root2),\n rootMargin,\n threshold\n }\n );\n targets2.forEach((el) => el && observer.observe(el));\n cleanup = () => {\n observer.disconnect();\n cleanup = noop;\n };\n },\n { immediate, flush: \"post\" }\n ) : noop;\n const stop = () => {\n cleanup();\n stopWatch();\n isActive.value = false;\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n isActive,\n pause() {\n cleanup();\n isActive.value = false;\n },\n resume() {\n isActive.value = true;\n },\n stop\n };\n}\n\nfunction useElementVisibility(element, options = {}) {\n const { window = defaultWindow, scrollTarget, threshold = 0 } = options;\n const elementIsVisible = ref(false);\n useIntersectionObserver(\n element,\n (intersectionObserverEntries) => {\n let isIntersecting = elementIsVisible.value;\n let latestTime = 0;\n for (const entry of intersectionObserverEntries) {\n if (entry.time >= latestTime) {\n latestTime = entry.time;\n isIntersecting = entry.isIntersecting;\n }\n }\n elementIsVisible.value = isIntersecting;\n },\n {\n root: scrollTarget,\n window,\n threshold\n }\n );\n return elementIsVisible;\n}\n\nconst events = /* @__PURE__ */ new Map();\n\nfunction useEventBus(key) {\n const scope = getCurrentScope();\n function on(listener) {\n var _a;\n const listeners = events.get(key) || /* @__PURE__ */ new Set();\n listeners.add(listener);\n events.set(key, listeners);\n const _off = () => off(listener);\n (_a = scope == null ? void 0 : scope.cleanups) == null ? void 0 : _a.push(_off);\n return _off;\n }\n function once(listener) {\n function _listener(...args) {\n off(_listener);\n listener(...args);\n }\n return on(_listener);\n }\n function off(listener) {\n const listeners = events.get(key);\n if (!listeners)\n return;\n listeners.delete(listener);\n if (!listeners.size)\n reset();\n }\n function reset() {\n events.delete(key);\n }\n function emit(event, payload) {\n var _a;\n (_a = events.get(key)) == null ? void 0 : _a.forEach((v) => v(event, payload));\n }\n return { on, once, off, emit, reset };\n}\n\nfunction resolveNestedOptions$1(options) {\n if (options === true)\n return {};\n return options;\n}\nfunction useEventSource(url, events = [], options = {}) {\n const event = ref(null);\n const data = ref(null);\n const status = ref(\"CONNECTING\");\n const eventSource = ref(null);\n const error = shallowRef(null);\n const urlRef = toRef(url);\n const lastEventId = shallowRef(null);\n let explicitlyClosed = false;\n let retried = 0;\n const {\n withCredentials = false,\n immediate = true\n } = options;\n const close = () => {\n if (isClient && eventSource.value) {\n eventSource.value.close();\n eventSource.value = null;\n status.value = \"CLOSED\";\n explicitlyClosed = true;\n }\n };\n const _init = () => {\n if (explicitlyClosed || typeof urlRef.value === \"undefined\")\n return;\n const es = new EventSource(urlRef.value, { withCredentials });\n status.value = \"CONNECTING\";\n eventSource.value = es;\n es.onopen = () => {\n status.value = \"OPEN\";\n error.value = null;\n };\n es.onerror = (e) => {\n status.value = \"CLOSED\";\n error.value = e;\n if (es.readyState === 2 && !explicitlyClosed && options.autoReconnect) {\n es.close();\n const {\n retries = -1,\n delay = 1e3,\n onFailed\n } = resolveNestedOptions$1(options.autoReconnect);\n retried += 1;\n if (typeof retries === \"number\" && (retries < 0 || retried < retries))\n setTimeout(_init, delay);\n else if (typeof retries === \"function\" && retries())\n setTimeout(_init, delay);\n else\n onFailed == null ? void 0 : onFailed();\n }\n };\n es.onmessage = (e) => {\n event.value = null;\n data.value = e.data;\n lastEventId.value = e.lastEventId;\n };\n for (const event_name of events) {\n useEventListener(es, event_name, (e) => {\n event.value = event_name;\n data.value = e.data || null;\n });\n }\n };\n const open = () => {\n if (!isClient)\n return;\n close();\n explicitlyClosed = false;\n retried = 0;\n _init();\n };\n if (immediate)\n watch(urlRef, open, { immediate: true });\n tryOnScopeDispose(close);\n return {\n eventSource,\n event,\n data,\n status,\n error,\n open,\n close,\n lastEventId\n };\n}\n\nfunction useEyeDropper(options = {}) {\n const { initialValue = \"\" } = options;\n const isSupported = useSupported(() => typeof window !== \"undefined\" && \"EyeDropper\" in window);\n const sRGBHex = ref(initialValue);\n async function open(openOptions) {\n if (!isSupported.value)\n return;\n const eyeDropper = new window.EyeDropper();\n const result = await eyeDropper.open(openOptions);\n sRGBHex.value = result.sRGBHex;\n return result;\n }\n return { isSupported, sRGBHex, open };\n}\n\nfunction useFavicon(newIcon = null, options = {}) {\n const {\n baseUrl = \"\",\n rel = \"icon\",\n document = defaultDocument\n } = options;\n const favicon = toRef(newIcon);\n const applyIcon = (icon) => {\n const elements = document == null ? void 0 : document.head.querySelectorAll(`link[rel*=\"${rel}\"]`);\n if (!elements || elements.length === 0) {\n const link = document == null ? void 0 : document.createElement(\"link\");\n if (link) {\n link.rel = rel;\n link.href = `${baseUrl}${icon}`;\n link.type = `image/${icon.split(\".\").pop()}`;\n document == null ? void 0 : document.head.append(link);\n }\n return;\n }\n elements == null ? void 0 : elements.forEach((el) => el.href = `${baseUrl}${icon}`);\n };\n watch(\n favicon,\n (i, o) => {\n if (typeof i === \"string\" && i !== o)\n applyIcon(i);\n },\n { immediate: true }\n );\n return favicon;\n}\n\nconst payloadMapping = {\n json: \"application/json\",\n text: \"text/plain\"\n};\nfunction isFetchOptions(obj) {\n return obj && containsProp(obj, \"immediate\", \"refetch\", \"initialData\", \"timeout\", \"beforeFetch\", \"afterFetch\", \"onFetchError\", \"fetch\", \"updateDataOnError\");\n}\nconst reAbsolute = /^(?:[a-z][a-z\\d+\\-.]*:)?\\/\\//i;\nfunction isAbsoluteURL(url) {\n return reAbsolute.test(url);\n}\nfunction headersToObject(headers) {\n if (typeof Headers !== \"undefined\" && headers instanceof Headers)\n return Object.fromEntries(headers.entries());\n return headers;\n}\nfunction combineCallbacks(combination, ...callbacks) {\n if (combination === \"overwrite\") {\n return async (ctx) => {\n const callback = callbacks[callbacks.length - 1];\n if (callback)\n return { ...ctx, ...await callback(ctx) };\n return ctx;\n };\n } else {\n return async (ctx) => {\n for (const callback of callbacks) {\n if (callback)\n ctx = { ...ctx, ...await callback(ctx) };\n }\n return ctx;\n };\n }\n}\nfunction createFetch(config = {}) {\n const _combination = config.combination || \"chain\";\n const _options = config.options || {};\n const _fetchOptions = config.fetchOptions || {};\n function useFactoryFetch(url, ...args) {\n const computedUrl = computed(() => {\n const baseUrl = toValue(config.baseUrl);\n const targetUrl = toValue(url);\n return baseUrl && !isAbsoluteURL(targetUrl) ? joinPaths(baseUrl, targetUrl) : targetUrl;\n });\n let options = _options;\n let fetchOptions = _fetchOptions;\n if (args.length > 0) {\n if (isFetchOptions(args[0])) {\n options = {\n ...options,\n ...args[0],\n beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[0].beforeFetch),\n afterFetch: combineCallbacks(_combination, _options.afterFetch, args[0].afterFetch),\n onFetchError: combineCallbacks(_combination, _options.onFetchError, args[0].onFetchError)\n };\n } else {\n fetchOptions = {\n ...fetchOptions,\n ...args[0],\n headers: {\n ...headersToObject(fetchOptions.headers) || {},\n ...headersToObject(args[0].headers) || {}\n }\n };\n }\n }\n if (args.length > 1 && isFetchOptions(args[1])) {\n options = {\n ...options,\n ...args[1],\n beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[1].beforeFetch),\n afterFetch: combineCallbacks(_combination, _options.afterFetch, args[1].afterFetch),\n onFetchError: combineCallbacks(_combination, _options.onFetchError, args[1].onFetchError)\n };\n }\n return useFetch(computedUrl, fetchOptions, options);\n }\n return useFactoryFetch;\n}\nfunction useFetch(url, ...args) {\n var _a;\n const supportsAbort = typeof AbortController === \"function\";\n let fetchOptions = {};\n let options = {\n immediate: true,\n refetch: false,\n timeout: 0,\n updateDataOnError: false\n };\n const config = {\n method: \"GET\",\n type: \"text\",\n payload: void 0\n };\n if (args.length > 0) {\n if (isFetchOptions(args[0]))\n options = { ...options, ...args[0] };\n else\n fetchOptions = args[0];\n }\n if (args.length > 1) {\n if (isFetchOptions(args[1]))\n options = { ...options, ...args[1] };\n }\n const {\n fetch = (_a = defaultWindow) == null ? void 0 : _a.fetch,\n initialData,\n timeout\n } = options;\n const responseEvent = createEventHook();\n const errorEvent = createEventHook();\n const finallyEvent = createEventHook();\n const isFinished = ref(false);\n const isFetching = ref(false);\n const aborted = ref(false);\n const statusCode = ref(null);\n const response = shallowRef(null);\n const error = shallowRef(null);\n const data = shallowRef(initialData || null);\n const canAbort = computed(() => supportsAbort && isFetching.value);\n let controller;\n let timer;\n const abort = () => {\n if (supportsAbort) {\n controller == null ? void 0 : controller.abort();\n controller = new AbortController();\n controller.signal.onabort = () => aborted.value = true;\n fetchOptions = {\n ...fetchOptions,\n signal: controller.signal\n };\n }\n };\n const loading = (isLoading) => {\n isFetching.value = isLoading;\n isFinished.value = !isLoading;\n };\n if (timeout)\n timer = useTimeoutFn(abort, timeout, { immediate: false });\n let executeCounter = 0;\n const execute = async (throwOnFailed = false) => {\n var _a2, _b;\n abort();\n loading(true);\n error.value = null;\n statusCode.value = null;\n aborted.value = false;\n executeCounter += 1;\n const currentExecuteCounter = executeCounter;\n const defaultFetchOptions = {\n method: config.method,\n headers: {}\n };\n if (config.payload) {\n const headers = headersToObject(defaultFetchOptions.headers);\n const payload = toValue(config.payload);\n if (!config.payloadType && payload && Object.getPrototypeOf(payload) === Object.prototype && !(payload instanceof FormData))\n config.payloadType = \"json\";\n if (config.payloadType)\n headers[\"Content-Type\"] = (_a2 = payloadMapping[config.payloadType]) != null ? _a2 : config.payloadType;\n defaultFetchOptions.body = config.payloadType === \"json\" ? JSON.stringify(payload) : payload;\n }\n let isCanceled = false;\n const context = {\n url: toValue(url),\n options: {\n ...defaultFetchOptions,\n ...fetchOptions\n },\n cancel: () => {\n isCanceled = true;\n }\n };\n if (options.beforeFetch)\n Object.assign(context, await options.beforeFetch(context));\n if (isCanceled || !fetch) {\n loading(false);\n return Promise.resolve(null);\n }\n let responseData = null;\n if (timer)\n timer.start();\n return fetch(\n context.url,\n {\n ...defaultFetchOptions,\n ...context.options,\n headers: {\n ...headersToObject(defaultFetchOptions.headers),\n ...headersToObject((_b = context.options) == null ? void 0 : _b.headers)\n }\n }\n ).then(async (fetchResponse) => {\n response.value = fetchResponse;\n statusCode.value = fetchResponse.status;\n responseData = await fetchResponse.clone()[config.type]();\n if (!fetchResponse.ok) {\n data.value = initialData || null;\n throw new Error(fetchResponse.statusText);\n }\n if (options.afterFetch) {\n ({ data: responseData } = await options.afterFetch({\n data: responseData,\n response: fetchResponse\n }));\n }\n data.value = responseData;\n responseEvent.trigger(fetchResponse);\n return fetchResponse;\n }).catch(async (fetchError) => {\n let errorData = fetchError.message || fetchError.name;\n if (options.onFetchError) {\n ({ error: errorData, data: responseData } = await options.onFetchError({\n data: responseData,\n error: fetchError,\n response: response.value\n }));\n }\n error.value = errorData;\n if (options.updateDataOnError)\n data.value = responseData;\n errorEvent.trigger(fetchError);\n if (throwOnFailed)\n throw fetchError;\n return null;\n }).finally(() => {\n if (currentExecuteCounter === executeCounter)\n loading(false);\n if (timer)\n timer.stop();\n finallyEvent.trigger(null);\n });\n };\n const refetch = toRef(options.refetch);\n watch(\n [\n refetch,\n toRef(url)\n ],\n ([refetch2]) => refetch2 && execute(),\n { deep: true }\n );\n const shell = {\n isFinished: readonly(isFinished),\n isFetching: readonly(isFetching),\n statusCode,\n response,\n error,\n data,\n canAbort,\n aborted,\n abort,\n execute,\n onFetchResponse: responseEvent.on,\n onFetchError: errorEvent.on,\n onFetchFinally: finallyEvent.on,\n // method\n get: setMethod(\"GET\"),\n put: setMethod(\"PUT\"),\n post: setMethod(\"POST\"),\n delete: setMethod(\"DELETE\"),\n patch: setMethod(\"PATCH\"),\n head: setMethod(\"HEAD\"),\n options: setMethod(\"OPTIONS\"),\n // type\n json: setType(\"json\"),\n text: setType(\"text\"),\n blob: setType(\"blob\"),\n arrayBuffer: setType(\"arrayBuffer\"),\n formData: setType(\"formData\")\n };\n function setMethod(method) {\n return (payload, payloadType) => {\n if (!isFetching.value) {\n config.method = method;\n config.payload = payload;\n config.payloadType = payloadType;\n if (isRef(config.payload)) {\n watch(\n [\n refetch,\n toRef(config.payload)\n ],\n ([refetch2]) => refetch2 && execute(),\n { deep: true }\n );\n }\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n }\n return void 0;\n };\n }\n function waitUntilFinished() {\n return new Promise((resolve, reject) => {\n until(isFinished).toBe(true).then(() => resolve(shell)).catch((error2) => reject(error2));\n });\n }\n function setType(type) {\n return () => {\n if (!isFetching.value) {\n config.type = type;\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n }\n return void 0;\n };\n }\n if (options.immediate)\n Promise.resolve().then(() => execute());\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n}\nfunction joinPaths(start, end) {\n if (!start.endsWith(\"/\") && !end.startsWith(\"/\"))\n return `${start}/${end}`;\n return `${start}${end}`;\n}\n\nconst DEFAULT_OPTIONS = {\n multiple: true,\n accept: \"*\",\n reset: false,\n directory: false\n};\nfunction useFileDialog(options = {}) {\n const {\n document = defaultDocument\n } = options;\n const files = ref(null);\n const { on: onChange, trigger } = createEventHook();\n let input;\n if (document) {\n input = document.createElement(\"input\");\n input.type = \"file\";\n input.onchange = (event) => {\n const result = event.target;\n files.value = result.files;\n trigger(files.value);\n };\n }\n const reset = () => {\n files.value = null;\n if (input && input.value) {\n input.value = \"\";\n trigger(null);\n }\n };\n const open = (localOptions) => {\n if (!input)\n return;\n const _options = {\n ...DEFAULT_OPTIONS,\n ...options,\n ...localOptions\n };\n input.multiple = _options.multiple;\n input.accept = _options.accept;\n input.webkitdirectory = _options.directory;\n if (hasOwn(_options, \"capture\"))\n input.capture = _options.capture;\n if (_options.reset)\n reset();\n input.click();\n };\n return {\n files: readonly(files),\n open,\n reset,\n onChange\n };\n}\n\nfunction useFileSystemAccess(options = {}) {\n const {\n window: _window = defaultWindow,\n dataType = \"Text\"\n } = options;\n const window = _window;\n const isSupported = useSupported(() => window && \"showSaveFilePicker\" in window && \"showOpenFilePicker\" in window);\n const fileHandle = ref();\n const data = ref();\n const file = ref();\n const fileName = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.name) != null ? _b : \"\";\n });\n const fileMIME = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.type) != null ? _b : \"\";\n });\n const fileSize = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.size) != null ? _b : 0;\n });\n const fileLastModified = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.lastModified) != null ? _b : 0;\n });\n async function open(_options = {}) {\n if (!isSupported.value)\n return;\n const [handle] = await window.showOpenFilePicker({ ...toValue(options), ..._options });\n fileHandle.value = handle;\n await updateData();\n }\n async function create(_options = {}) {\n if (!isSupported.value)\n return;\n fileHandle.value = await window.showSaveFilePicker({ ...options, ..._options });\n data.value = void 0;\n await updateData();\n }\n async function save(_options = {}) {\n if (!isSupported.value)\n return;\n if (!fileHandle.value)\n return saveAs(_options);\n if (data.value) {\n const writableStream = await fileHandle.value.createWritable();\n await writableStream.write(data.value);\n await writableStream.close();\n }\n await updateFile();\n }\n async function saveAs(_options = {}) {\n if (!isSupported.value)\n return;\n fileHandle.value = await window.showSaveFilePicker({ ...options, ..._options });\n if (data.value) {\n const writableStream = await fileHandle.value.createWritable();\n await writableStream.write(data.value);\n await writableStream.close();\n }\n await updateFile();\n }\n async function updateFile() {\n var _a;\n file.value = await ((_a = fileHandle.value) == null ? void 0 : _a.getFile());\n }\n async function updateData() {\n var _a, _b;\n await updateFile();\n const type = toValue(dataType);\n if (type === \"Text\")\n data.value = await ((_a = file.value) == null ? void 0 : _a.text());\n else if (type === \"ArrayBuffer\")\n data.value = await ((_b = file.value) == null ? void 0 : _b.arrayBuffer());\n else if (type === \"Blob\")\n data.value = file.value;\n }\n watch(() => toValue(dataType), updateData);\n return {\n isSupported,\n data,\n file,\n fileName,\n fileMIME,\n fileSize,\n fileLastModified,\n open,\n create,\n save,\n saveAs,\n updateData\n };\n}\n\nfunction useFocus(target, options = {}) {\n const { initialValue = false, focusVisible = false, preventScroll = false } = options;\n const innerFocused = ref(false);\n const targetElement = computed(() => unrefElement(target));\n useEventListener(targetElement, \"focus\", (event) => {\n var _a, _b;\n if (!focusVisible || ((_b = (_a = event.target).matches) == null ? void 0 : _b.call(_a, \":focus-visible\")))\n innerFocused.value = true;\n });\n useEventListener(targetElement, \"blur\", () => innerFocused.value = false);\n const focused = computed({\n get: () => innerFocused.value,\n set(value) {\n var _a, _b;\n if (!value && innerFocused.value)\n (_a = targetElement.value) == null ? void 0 : _a.blur();\n else if (value && !innerFocused.value)\n (_b = targetElement.value) == null ? void 0 : _b.focus({ preventScroll });\n }\n });\n watch(\n targetElement,\n () => {\n focused.value = initialValue;\n },\n { immediate: true, flush: \"post\" }\n );\n return { focused };\n}\n\nfunction useFocusWithin(target, options = {}) {\n const activeElement = useActiveElement(options);\n const targetElement = computed(() => unrefElement(target));\n const focused = computed(() => targetElement.value && activeElement.value ? targetElement.value.contains(activeElement.value) : false);\n return { focused };\n}\n\nfunction useFps(options) {\n var _a;\n const fps = ref(0);\n if (typeof performance === \"undefined\")\n return fps;\n const every = (_a = options == null ? void 0 : options.every) != null ? _a : 10;\n let last = performance.now();\n let ticks = 0;\n useRafFn(() => {\n ticks += 1;\n if (ticks >= every) {\n const now = performance.now();\n const diff = now - last;\n fps.value = Math.round(1e3 / (diff / ticks));\n last = now;\n ticks = 0;\n }\n });\n return fps;\n}\n\nconst eventHandlers = [\n \"fullscreenchange\",\n \"webkitfullscreenchange\",\n \"webkitendfullscreen\",\n \"mozfullscreenchange\",\n \"MSFullscreenChange\"\n];\nfunction useFullscreen(target, options = {}) {\n const {\n document = defaultDocument,\n autoExit = false\n } = options;\n const targetRef = computed(() => {\n var _a;\n return (_a = unrefElement(target)) != null ? _a : document == null ? void 0 : document.querySelector(\"html\");\n });\n const isFullscreen = ref(false);\n const requestMethod = computed(() => {\n return [\n \"requestFullscreen\",\n \"webkitRequestFullscreen\",\n \"webkitEnterFullscreen\",\n \"webkitEnterFullScreen\",\n \"webkitRequestFullScreen\",\n \"mozRequestFullScreen\",\n \"msRequestFullscreen\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const exitMethod = computed(() => {\n return [\n \"exitFullscreen\",\n \"webkitExitFullscreen\",\n \"webkitExitFullScreen\",\n \"webkitCancelFullScreen\",\n \"mozCancelFullScreen\",\n \"msExitFullscreen\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const fullscreenEnabled = computed(() => {\n return [\n \"fullScreen\",\n \"webkitIsFullScreen\",\n \"webkitDisplayingFullscreen\",\n \"mozFullScreen\",\n \"msFullscreenElement\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const fullscreenElementMethod = [\n \"fullscreenElement\",\n \"webkitFullscreenElement\",\n \"mozFullScreenElement\",\n \"msFullscreenElement\"\n ].find((m) => document && m in document);\n const isSupported = useSupported(() => targetRef.value && document && requestMethod.value !== void 0 && exitMethod.value !== void 0 && fullscreenEnabled.value !== void 0);\n const isCurrentElementFullScreen = () => {\n if (fullscreenElementMethod)\n return (document == null ? void 0 : document[fullscreenElementMethod]) === targetRef.value;\n return false;\n };\n const isElementFullScreen = () => {\n if (fullscreenEnabled.value) {\n if (document && document[fullscreenEnabled.value] != null) {\n return document[fullscreenEnabled.value];\n } else {\n const target2 = targetRef.value;\n if ((target2 == null ? void 0 : target2[fullscreenEnabled.value]) != null) {\n return Boolean(target2[fullscreenEnabled.value]);\n }\n }\n }\n return false;\n };\n async function exit() {\n if (!isSupported.value || !isFullscreen.value)\n return;\n if (exitMethod.value) {\n if ((document == null ? void 0 : document[exitMethod.value]) != null) {\n await document[exitMethod.value]();\n } else {\n const target2 = targetRef.value;\n if ((target2 == null ? void 0 : target2[exitMethod.value]) != null)\n await target2[exitMethod.value]();\n }\n }\n isFullscreen.value = false;\n }\n async function enter() {\n if (!isSupported.value || isFullscreen.value)\n return;\n if (isElementFullScreen())\n await exit();\n const target2 = targetRef.value;\n if (requestMethod.value && (target2 == null ? void 0 : target2[requestMethod.value]) != null) {\n await target2[requestMethod.value]();\n isFullscreen.value = true;\n }\n }\n async function toggle() {\n await (isFullscreen.value ? exit() : enter());\n }\n const handlerCallback = () => {\n const isElementFullScreenValue = isElementFullScreen();\n if (!isElementFullScreenValue || isElementFullScreenValue && isCurrentElementFullScreen())\n isFullscreen.value = isElementFullScreenValue;\n };\n useEventListener(document, eventHandlers, handlerCallback, false);\n useEventListener(() => unrefElement(targetRef), eventHandlers, handlerCallback, false);\n if (autoExit)\n tryOnScopeDispose(exit);\n return {\n isSupported,\n isFullscreen,\n enter,\n exit,\n toggle\n };\n}\n\nfunction mapGamepadToXbox360Controller(gamepad) {\n return computed(() => {\n if (gamepad.value) {\n return {\n buttons: {\n a: gamepad.value.buttons[0],\n b: gamepad.value.buttons[1],\n x: gamepad.value.buttons[2],\n y: gamepad.value.buttons[3]\n },\n bumper: {\n left: gamepad.value.buttons[4],\n right: gamepad.value.buttons[5]\n },\n triggers: {\n left: gamepad.value.buttons[6],\n right: gamepad.value.buttons[7]\n },\n stick: {\n left: {\n horizontal: gamepad.value.axes[0],\n vertical: gamepad.value.axes[1],\n button: gamepad.value.buttons[10]\n },\n right: {\n horizontal: gamepad.value.axes[2],\n vertical: gamepad.value.axes[3],\n button: gamepad.value.buttons[11]\n }\n },\n dpad: {\n up: gamepad.value.buttons[12],\n down: gamepad.value.buttons[13],\n left: gamepad.value.buttons[14],\n right: gamepad.value.buttons[15]\n },\n back: gamepad.value.buttons[8],\n start: gamepad.value.buttons[9]\n };\n }\n return null;\n });\n}\nfunction useGamepad(options = {}) {\n const {\n navigator = defaultNavigator\n } = options;\n const isSupported = useSupported(() => navigator && \"getGamepads\" in navigator);\n const gamepads = ref([]);\n const onConnectedHook = createEventHook();\n const onDisconnectedHook = createEventHook();\n const stateFromGamepad = (gamepad) => {\n const hapticActuators = [];\n const vibrationActuator = \"vibrationActuator\" in gamepad ? gamepad.vibrationActuator : null;\n if (vibrationActuator)\n hapticActuators.push(vibrationActuator);\n if (gamepad.hapticActuators)\n hapticActuators.push(...gamepad.hapticActuators);\n return {\n id: gamepad.id,\n index: gamepad.index,\n connected: gamepad.connected,\n mapping: gamepad.mapping,\n timestamp: gamepad.timestamp,\n vibrationActuator: gamepad.vibrationActuator,\n hapticActuators,\n axes: gamepad.axes.map((axes) => axes),\n buttons: gamepad.buttons.map((button) => ({ pressed: button.pressed, touched: button.touched, value: button.value }))\n };\n };\n const updateGamepadState = () => {\n const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n for (const gamepad of _gamepads) {\n if (gamepad && gamepads.value[gamepad.index])\n gamepads.value[gamepad.index] = stateFromGamepad(gamepad);\n }\n };\n const { isActive, pause, resume } = useRafFn(updateGamepadState);\n const onGamepadConnected = (gamepad) => {\n if (!gamepads.value.some(({ index }) => index === gamepad.index)) {\n gamepads.value.push(stateFromGamepad(gamepad));\n onConnectedHook.trigger(gamepad.index);\n }\n resume();\n };\n const onGamepadDisconnected = (gamepad) => {\n gamepads.value = gamepads.value.filter((x) => x.index !== gamepad.index);\n onDisconnectedHook.trigger(gamepad.index);\n };\n useEventListener(\"gamepadconnected\", (e) => onGamepadConnected(e.gamepad));\n useEventListener(\"gamepaddisconnected\", (e) => onGamepadDisconnected(e.gamepad));\n tryOnMounted(() => {\n const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n for (const gamepad of _gamepads) {\n if (gamepad && gamepads.value[gamepad.index])\n onGamepadConnected(gamepad);\n }\n });\n pause();\n return {\n isSupported,\n onConnected: onConnectedHook.on,\n onDisconnected: onDisconnectedHook.on,\n gamepads,\n pause,\n resume,\n isActive\n };\n}\n\nfunction useGeolocation(options = {}) {\n const {\n enableHighAccuracy = true,\n maximumAge = 3e4,\n timeout = 27e3,\n navigator = defaultNavigator,\n immediate = true\n } = options;\n const isSupported = useSupported(() => navigator && \"geolocation\" in navigator);\n const locatedAt = ref(null);\n const error = shallowRef(null);\n const coords = ref({\n accuracy: 0,\n latitude: Number.POSITIVE_INFINITY,\n longitude: Number.POSITIVE_INFINITY,\n altitude: null,\n altitudeAccuracy: null,\n heading: null,\n speed: null\n });\n function updatePosition(position) {\n locatedAt.value = position.timestamp;\n coords.value = position.coords;\n error.value = null;\n }\n let watcher;\n function resume() {\n if (isSupported.value) {\n watcher = navigator.geolocation.watchPosition(\n updatePosition,\n (err) => error.value = err,\n {\n enableHighAccuracy,\n maximumAge,\n timeout\n }\n );\n }\n }\n if (immediate)\n resume();\n function pause() {\n if (watcher && navigator)\n navigator.geolocation.clearWatch(watcher);\n }\n tryOnScopeDispose(() => {\n pause();\n });\n return {\n isSupported,\n coords,\n locatedAt,\n error,\n resume,\n pause\n };\n}\n\nconst defaultEvents$1 = [\"mousemove\", \"mousedown\", \"resize\", \"keydown\", \"touchstart\", \"wheel\"];\nconst oneMinute = 6e4;\nfunction useIdle(timeout = oneMinute, options = {}) {\n const {\n initialState = false,\n listenForVisibilityChange = true,\n events = defaultEvents$1,\n window = defaultWindow,\n eventFilter = throttleFilter(50)\n } = options;\n const idle = ref(initialState);\n const lastActive = ref(timestamp());\n let timer;\n const reset = () => {\n idle.value = false;\n clearTimeout(timer);\n timer = setTimeout(() => idle.value = true, timeout);\n };\n const onEvent = createFilterWrapper(\n eventFilter,\n () => {\n lastActive.value = timestamp();\n reset();\n }\n );\n if (window) {\n const document = window.document;\n for (const event of events)\n useEventListener(window, event, onEvent, { passive: true });\n if (listenForVisibilityChange) {\n useEventListener(document, \"visibilitychange\", () => {\n if (!document.hidden)\n onEvent();\n });\n }\n reset();\n }\n return {\n idle,\n lastActive,\n reset\n };\n}\n\nasync function loadImage(options) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const { src, srcset, sizes, class: clazz, loading, crossorigin, referrerPolicy } = options;\n img.src = src;\n if (srcset)\n img.srcset = srcset;\n if (sizes)\n img.sizes = sizes;\n if (clazz)\n img.className = clazz;\n if (loading)\n img.loading = loading;\n if (crossorigin)\n img.crossOrigin = crossorigin;\n if (referrerPolicy)\n img.referrerPolicy = referrerPolicy;\n img.onload = () => resolve(img);\n img.onerror = reject;\n });\n}\nfunction useImage(options, asyncStateOptions = {}) {\n const state = useAsyncState(\n () => loadImage(toValue(options)),\n void 0,\n {\n resetOnExecute: true,\n ...asyncStateOptions\n }\n );\n watch(\n () => toValue(options),\n () => state.execute(asyncStateOptions.delay),\n { deep: true }\n );\n return state;\n}\n\nconst ARRIVED_STATE_THRESHOLD_PIXELS = 1;\nfunction useScroll(element, options = {}) {\n const {\n throttle = 0,\n idle = 200,\n onStop = noop,\n onScroll = noop,\n offset = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n },\n eventListenerOptions = {\n capture: false,\n passive: true\n },\n behavior = \"auto\",\n window = defaultWindow,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const internalX = ref(0);\n const internalY = ref(0);\n const x = computed({\n get() {\n return internalX.value;\n },\n set(x2) {\n scrollTo(x2, void 0);\n }\n });\n const y = computed({\n get() {\n return internalY.value;\n },\n set(y2) {\n scrollTo(void 0, y2);\n }\n });\n function scrollTo(_x, _y) {\n var _a, _b, _c, _d;\n if (!window)\n return;\n const _element = toValue(element);\n if (!_element)\n return;\n (_c = _element instanceof Document ? window.document.body : _element) == null ? void 0 : _c.scrollTo({\n top: (_a = toValue(_y)) != null ? _a : y.value,\n left: (_b = toValue(_x)) != null ? _b : x.value,\n behavior: toValue(behavior)\n });\n const scrollContainer = ((_d = _element == null ? void 0 : _element.document) == null ? void 0 : _d.documentElement) || (_element == null ? void 0 : _element.documentElement) || _element;\n if (x != null)\n internalX.value = scrollContainer.scrollLeft;\n if (y != null)\n internalY.value = scrollContainer.scrollTop;\n }\n const isScrolling = ref(false);\n const arrivedState = reactive({\n left: true,\n right: false,\n top: true,\n bottom: false\n });\n const directions = reactive({\n left: false,\n right: false,\n top: false,\n bottom: false\n });\n const onScrollEnd = (e) => {\n if (!isScrolling.value)\n return;\n isScrolling.value = false;\n directions.left = false;\n directions.right = false;\n directions.top = false;\n directions.bottom = false;\n onStop(e);\n };\n const onScrollEndDebounced = useDebounceFn(onScrollEnd, throttle + idle);\n const setArrivedState = (target) => {\n var _a;\n if (!window)\n return;\n const el = ((_a = target == null ? void 0 : target.document) == null ? void 0 : _a.documentElement) || (target == null ? void 0 : target.documentElement) || unrefElement(target);\n const { display, flexDirection } = getComputedStyle(el);\n const scrollLeft = el.scrollLeft;\n directions.left = scrollLeft < internalX.value;\n directions.right = scrollLeft > internalX.value;\n const left = Math.abs(scrollLeft) <= (offset.left || 0);\n const right = Math.abs(scrollLeft) + el.clientWidth >= el.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n if (display === \"flex\" && flexDirection === \"row-reverse\") {\n arrivedState.left = right;\n arrivedState.right = left;\n } else {\n arrivedState.left = left;\n arrivedState.right = right;\n }\n internalX.value = scrollLeft;\n let scrollTop = el.scrollTop;\n if (target === window.document && !scrollTop)\n scrollTop = window.document.body.scrollTop;\n directions.top = scrollTop < internalY.value;\n directions.bottom = scrollTop > internalY.value;\n const top = Math.abs(scrollTop) <= (offset.top || 0);\n const bottom = Math.abs(scrollTop) + el.clientHeight >= el.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n if (display === \"flex\" && flexDirection === \"column-reverse\") {\n arrivedState.top = bottom;\n arrivedState.bottom = top;\n } else {\n arrivedState.top = top;\n arrivedState.bottom = bottom;\n }\n internalY.value = scrollTop;\n };\n const onScrollHandler = (e) => {\n var _a;\n if (!window)\n return;\n const eventTarget = (_a = e.target.documentElement) != null ? _a : e.target;\n setArrivedState(eventTarget);\n isScrolling.value = true;\n onScrollEndDebounced(e);\n onScroll(e);\n };\n useEventListener(\n element,\n \"scroll\",\n throttle ? useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler,\n eventListenerOptions\n );\n tryOnMounted(() => {\n try {\n const _element = toValue(element);\n if (!_element)\n return;\n setArrivedState(_element);\n } catch (e) {\n onError(e);\n }\n });\n useEventListener(\n element,\n \"scrollend\",\n onScrollEnd,\n eventListenerOptions\n );\n return {\n x,\n y,\n isScrolling,\n arrivedState,\n directions,\n measure() {\n const _element = toValue(element);\n if (window && _element)\n setArrivedState(_element);\n }\n };\n}\n\nfunction resolveElement(el) {\n if (typeof Window !== \"undefined\" && el instanceof Window)\n return el.document.documentElement;\n if (typeof Document !== \"undefined\" && el instanceof Document)\n return el.documentElement;\n return el;\n}\n\nfunction useInfiniteScroll(element, onLoadMore, options = {}) {\n var _a;\n const {\n direction = \"bottom\",\n interval = 100,\n canLoadMore = () => true\n } = options;\n const state = reactive(useScroll(\n element,\n {\n ...options,\n offset: {\n [direction]: (_a = options.distance) != null ? _a : 0,\n ...options.offset\n }\n }\n ));\n const promise = ref();\n const isLoading = computed(() => !!promise.value);\n const observedElement = computed(() => {\n return resolveElement(toValue(element));\n });\n const isElementVisible = useElementVisibility(observedElement);\n function checkAndLoad() {\n state.measure();\n if (!observedElement.value || !isElementVisible.value || !canLoadMore(observedElement.value))\n return;\n const { scrollHeight, clientHeight, scrollWidth, clientWidth } = observedElement.value;\n const isNarrower = direction === \"bottom\" || direction === \"top\" ? scrollHeight <= clientHeight : scrollWidth <= clientWidth;\n if (state.arrivedState[direction] || isNarrower) {\n if (!promise.value) {\n promise.value = Promise.all([\n onLoadMore(state),\n new Promise((resolve) => setTimeout(resolve, interval))\n ]).finally(() => {\n promise.value = null;\n nextTick(() => checkAndLoad());\n });\n }\n }\n }\n watch(\n () => [state.arrivedState[direction], isElementVisible.value],\n checkAndLoad,\n { immediate: true }\n );\n return {\n isLoading\n };\n}\n\nconst defaultEvents = [\"mousedown\", \"mouseup\", \"keydown\", \"keyup\"];\nfunction useKeyModifier(modifier, options = {}) {\n const {\n events = defaultEvents,\n document = defaultDocument,\n initial = null\n } = options;\n const state = ref(initial);\n if (document) {\n events.forEach((listenerEvent) => {\n useEventListener(document, listenerEvent, (evt) => {\n if (typeof evt.getModifierState === \"function\")\n state.value = evt.getModifierState(modifier);\n });\n });\n }\n return state;\n}\n\nfunction useLocalStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.localStorage, options);\n}\n\nconst DefaultMagicKeysAliasMap = {\n ctrl: \"control\",\n command: \"meta\",\n cmd: \"meta\",\n option: \"alt\",\n up: \"arrowup\",\n down: \"arrowdown\",\n left: \"arrowleft\",\n right: \"arrowright\"\n};\n\nfunction useMagicKeys(options = {}) {\n const {\n reactive: useReactive = false,\n target = defaultWindow,\n aliasMap = DefaultMagicKeysAliasMap,\n passive = true,\n onEventFired = noop\n } = options;\n const current = reactive(/* @__PURE__ */ new Set());\n const obj = {\n toJSON() {\n return {};\n },\n current\n };\n const refs = useReactive ? reactive(obj) : obj;\n const metaDeps = /* @__PURE__ */ new Set();\n const usedKeys = /* @__PURE__ */ new Set();\n function setRefs(key, value) {\n if (key in refs) {\n if (useReactive)\n refs[key] = value;\n else\n refs[key].value = value;\n }\n }\n function reset() {\n current.clear();\n for (const key of usedKeys)\n setRefs(key, false);\n }\n function updateRefs(e, value) {\n var _a, _b;\n const key = (_a = e.key) == null ? void 0 : _a.toLowerCase();\n const code = (_b = e.code) == null ? void 0 : _b.toLowerCase();\n const values = [code, key].filter(Boolean);\n if (key) {\n if (value)\n current.add(key);\n else\n current.delete(key);\n }\n for (const key2 of values) {\n usedKeys.add(key2);\n setRefs(key2, value);\n }\n if (key === \"meta\" && !value) {\n metaDeps.forEach((key2) => {\n current.delete(key2);\n setRefs(key2, false);\n });\n metaDeps.clear();\n } else if (typeof e.getModifierState === \"function\" && e.getModifierState(\"Meta\") && value) {\n [...current, ...values].forEach((key2) => metaDeps.add(key2));\n }\n }\n useEventListener(target, \"keydown\", (e) => {\n updateRefs(e, true);\n return onEventFired(e);\n }, { passive });\n useEventListener(target, \"keyup\", (e) => {\n updateRefs(e, false);\n return onEventFired(e);\n }, { passive });\n useEventListener(\"blur\", reset, { passive: true });\n useEventListener(\"focus\", reset, { passive: true });\n const proxy = new Proxy(\n refs,\n {\n get(target2, prop, rec) {\n if (typeof prop !== \"string\")\n return Reflect.get(target2, prop, rec);\n prop = prop.toLowerCase();\n if (prop in aliasMap)\n prop = aliasMap[prop];\n if (!(prop in refs)) {\n if (/[+_-]/.test(prop)) {\n const keys = prop.split(/[+_-]/g).map((i) => i.trim());\n refs[prop] = computed(() => keys.every((key) => toValue(proxy[key])));\n } else {\n refs[prop] = ref(false);\n }\n }\n const r = Reflect.get(target2, prop, rec);\n return useReactive ? toValue(r) : r;\n }\n }\n );\n return proxy;\n}\n\nfunction usingElRef(source, cb) {\n if (toValue(source))\n cb(toValue(source));\n}\nfunction timeRangeToArray(timeRanges) {\n let ranges = [];\n for (let i = 0; i < timeRanges.length; ++i)\n ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];\n return ranges;\n}\nfunction tracksToArray(tracks) {\n return Array.from(tracks).map(({ label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }, id) => ({ id, label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }));\n}\nconst defaultOptions = {\n src: \"\",\n tracks: []\n};\nfunction useMediaControls(target, options = {}) {\n target = toRef(target);\n options = {\n ...defaultOptions,\n ...options\n };\n const {\n document = defaultDocument\n } = options;\n const currentTime = ref(0);\n const duration = ref(0);\n const seeking = ref(false);\n const volume = ref(1);\n const waiting = ref(false);\n const ended = ref(false);\n const playing = ref(false);\n const rate = ref(1);\n const stalled = ref(false);\n const buffered = ref([]);\n const tracks = ref([]);\n const selectedTrack = ref(-1);\n const isPictureInPicture = ref(false);\n const muted = ref(false);\n const supportsPictureInPicture = document && \"pictureInPictureEnabled\" in document;\n const sourceErrorEvent = createEventHook();\n const disableTrack = (track) => {\n usingElRef(target, (el) => {\n if (track) {\n const id = typeof track === \"number\" ? track : track.id;\n el.textTracks[id].mode = \"disabled\";\n } else {\n for (let i = 0; i < el.textTracks.length; ++i)\n el.textTracks[i].mode = \"disabled\";\n }\n selectedTrack.value = -1;\n });\n };\n const enableTrack = (track, disableTracks = true) => {\n usingElRef(target, (el) => {\n const id = typeof track === \"number\" ? track : track.id;\n if (disableTracks)\n disableTrack();\n el.textTracks[id].mode = \"showing\";\n selectedTrack.value = id;\n });\n };\n const togglePictureInPicture = () => {\n return new Promise((resolve, reject) => {\n usingElRef(target, async (el) => {\n if (supportsPictureInPicture) {\n if (!isPictureInPicture.value) {\n el.requestPictureInPicture().then(resolve).catch(reject);\n } else {\n document.exitPictureInPicture().then(resolve).catch(reject);\n }\n }\n });\n });\n };\n watchEffect(() => {\n if (!document)\n return;\n const el = toValue(target);\n if (!el)\n return;\n const src = toValue(options.src);\n let sources = [];\n if (!src)\n return;\n if (typeof src === \"string\")\n sources = [{ src }];\n else if (Array.isArray(src))\n sources = src;\n else if (isObject(src))\n sources = [src];\n el.querySelectorAll(\"source\").forEach((e) => {\n e.removeEventListener(\"error\", sourceErrorEvent.trigger);\n e.remove();\n });\n sources.forEach(({ src: src2, type }) => {\n const source = document.createElement(\"source\");\n source.setAttribute(\"src\", src2);\n source.setAttribute(\"type\", type || \"\");\n source.addEventListener(\"error\", sourceErrorEvent.trigger);\n el.appendChild(source);\n });\n el.load();\n });\n tryOnScopeDispose(() => {\n const el = toValue(target);\n if (!el)\n return;\n el.querySelectorAll(\"source\").forEach((e) => e.removeEventListener(\"error\", sourceErrorEvent.trigger));\n });\n watch([target, volume], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.volume = volume.value;\n });\n watch([target, muted], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.muted = muted.value;\n });\n watch([target, rate], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.playbackRate = rate.value;\n });\n watchEffect(() => {\n if (!document)\n return;\n const textTracks = toValue(options.tracks);\n const el = toValue(target);\n if (!textTracks || !textTracks.length || !el)\n return;\n el.querySelectorAll(\"track\").forEach((e) => e.remove());\n textTracks.forEach(({ default: isDefault, kind, label, src, srcLang }, i) => {\n const track = document.createElement(\"track\");\n track.default = isDefault || false;\n track.kind = kind;\n track.label = label;\n track.src = src;\n track.srclang = srcLang;\n if (track.default)\n selectedTrack.value = i;\n el.appendChild(track);\n });\n });\n const { ignoreUpdates: ignoreCurrentTimeUpdates } = watchIgnorable(currentTime, (time) => {\n const el = toValue(target);\n if (!el)\n return;\n el.currentTime = time;\n });\n const { ignoreUpdates: ignorePlayingUpdates } = watchIgnorable(playing, (isPlaying) => {\n const el = toValue(target);\n if (!el)\n return;\n isPlaying ? el.play() : el.pause();\n });\n useEventListener(target, \"timeupdate\", () => ignoreCurrentTimeUpdates(() => currentTime.value = toValue(target).currentTime));\n useEventListener(target, \"durationchange\", () => duration.value = toValue(target).duration);\n useEventListener(target, \"progress\", () => buffered.value = timeRangeToArray(toValue(target).buffered));\n useEventListener(target, \"seeking\", () => seeking.value = true);\n useEventListener(target, \"seeked\", () => seeking.value = false);\n useEventListener(target, [\"waiting\", \"loadstart\"], () => {\n waiting.value = true;\n ignorePlayingUpdates(() => playing.value = false);\n });\n useEventListener(target, \"loadeddata\", () => waiting.value = false);\n useEventListener(target, \"playing\", () => {\n waiting.value = false;\n ended.value = false;\n ignorePlayingUpdates(() => playing.value = true);\n });\n useEventListener(target, \"ratechange\", () => rate.value = toValue(target).playbackRate);\n useEventListener(target, \"stalled\", () => stalled.value = true);\n useEventListener(target, \"ended\", () => ended.value = true);\n useEventListener(target, \"pause\", () => ignorePlayingUpdates(() => playing.value = false));\n useEventListener(target, \"play\", () => ignorePlayingUpdates(() => playing.value = true));\n useEventListener(target, \"enterpictureinpicture\", () => isPictureInPicture.value = true);\n useEventListener(target, \"leavepictureinpicture\", () => isPictureInPicture.value = false);\n useEventListener(target, \"volumechange\", () => {\n const el = toValue(target);\n if (!el)\n return;\n volume.value = el.volume;\n muted.value = el.muted;\n });\n const listeners = [];\n const stop = watch([target], () => {\n const el = toValue(target);\n if (!el)\n return;\n stop();\n listeners[0] = useEventListener(el.textTracks, \"addtrack\", () => tracks.value = tracksToArray(el.textTracks));\n listeners[1] = useEventListener(el.textTracks, \"removetrack\", () => tracks.value = tracksToArray(el.textTracks));\n listeners[2] = useEventListener(el.textTracks, \"change\", () => tracks.value = tracksToArray(el.textTracks));\n });\n tryOnScopeDispose(() => listeners.forEach((listener) => listener()));\n return {\n currentTime,\n duration,\n waiting,\n seeking,\n ended,\n stalled,\n buffered,\n playing,\n rate,\n // Volume\n volume,\n muted,\n // Tracks\n tracks,\n selectedTrack,\n enableTrack,\n disableTrack,\n // Picture in Picture\n supportsPictureInPicture,\n togglePictureInPicture,\n isPictureInPicture,\n // Events\n onSourceError: sourceErrorEvent.on\n };\n}\n\nfunction getMapVue2Compat() {\n const data = shallowReactive({});\n return {\n get: (key) => data[key],\n set: (key, value) => set(data, key, value),\n has: (key) => hasOwn(data, key),\n delete: (key) => del(data, key),\n clear: () => {\n Object.keys(data).forEach((key) => {\n del(data, key);\n });\n }\n };\n}\nfunction useMemoize(resolver, options) {\n const initCache = () => {\n if (options == null ? void 0 : options.cache)\n return shallowReactive(options.cache);\n if (isVue2)\n return getMapVue2Compat();\n return shallowReactive(/* @__PURE__ */ new Map());\n };\n const cache = initCache();\n const generateKey = (...args) => (options == null ? void 0 : options.getKey) ? options.getKey(...args) : JSON.stringify(args);\n const _loadData = (key, ...args) => {\n cache.set(key, resolver(...args));\n return cache.get(key);\n };\n const loadData = (...args) => _loadData(generateKey(...args), ...args);\n const deleteData = (...args) => {\n cache.delete(generateKey(...args));\n };\n const clearData = () => {\n cache.clear();\n };\n const memoized = (...args) => {\n const key = generateKey(...args);\n if (cache.has(key))\n return cache.get(key);\n return _loadData(key, ...args);\n };\n memoized.load = loadData;\n memoized.delete = deleteData;\n memoized.clear = clearData;\n memoized.generateKey = generateKey;\n memoized.cache = cache;\n return memoized;\n}\n\nfunction useMemory(options = {}) {\n const memory = ref();\n const isSupported = useSupported(() => typeof performance !== \"undefined\" && \"memory\" in performance);\n if (isSupported.value) {\n const { interval = 1e3 } = options;\n useIntervalFn(() => {\n memory.value = performance.memory;\n }, interval, { immediate: options.immediate, immediateCallback: options.immediateCallback });\n }\n return { isSupported, memory };\n}\n\nconst UseMouseBuiltinExtractors = {\n page: (event) => [event.pageX, event.pageY],\n client: (event) => [event.clientX, event.clientY],\n screen: (event) => [event.screenX, event.screenY],\n movement: (event) => event instanceof Touch ? null : [event.movementX, event.movementY]\n};\nfunction useMouse(options = {}) {\n const {\n type = \"page\",\n touch = true,\n resetOnTouchEnds = false,\n initialValue = { x: 0, y: 0 },\n window = defaultWindow,\n target = window,\n scroll = true,\n eventFilter\n } = options;\n let _prevMouseEvent = null;\n const x = ref(initialValue.x);\n const y = ref(initialValue.y);\n const sourceType = ref(null);\n const extractor = typeof type === \"function\" ? type : UseMouseBuiltinExtractors[type];\n const mouseHandler = (event) => {\n const result = extractor(event);\n _prevMouseEvent = event;\n if (result) {\n [x.value, y.value] = result;\n sourceType.value = \"mouse\";\n }\n };\n const touchHandler = (event) => {\n if (event.touches.length > 0) {\n const result = extractor(event.touches[0]);\n if (result) {\n [x.value, y.value] = result;\n sourceType.value = \"touch\";\n }\n }\n };\n const scrollHandler = () => {\n if (!_prevMouseEvent || !window)\n return;\n const pos = extractor(_prevMouseEvent);\n if (_prevMouseEvent instanceof MouseEvent && pos) {\n x.value = pos[0] + window.scrollX;\n y.value = pos[1] + window.scrollY;\n }\n };\n const reset = () => {\n x.value = initialValue.x;\n y.value = initialValue.y;\n };\n const mouseHandlerWrapper = eventFilter ? (event) => eventFilter(() => mouseHandler(event), {}) : (event) => mouseHandler(event);\n const touchHandlerWrapper = eventFilter ? (event) => eventFilter(() => touchHandler(event), {}) : (event) => touchHandler(event);\n const scrollHandlerWrapper = eventFilter ? () => eventFilter(() => scrollHandler(), {}) : () => scrollHandler();\n if (target) {\n const listenerOptions = { passive: true };\n useEventListener(target, [\"mousemove\", \"dragover\"], mouseHandlerWrapper, listenerOptions);\n if (touch && type !== \"movement\") {\n useEventListener(target, [\"touchstart\", \"touchmove\"], touchHandlerWrapper, listenerOptions);\n if (resetOnTouchEnds)\n useEventListener(target, \"touchend\", reset, listenerOptions);\n }\n if (scroll && type === \"page\")\n useEventListener(window, \"scroll\", scrollHandlerWrapper, { passive: true });\n }\n return {\n x,\n y,\n sourceType\n };\n}\n\nfunction useMouseInElement(target, options = {}) {\n const {\n handleOutside = true,\n window = defaultWindow\n } = options;\n const type = options.type || \"page\";\n const { x, y, sourceType } = useMouse(options);\n const targetRef = ref(target != null ? target : window == null ? void 0 : window.document.body);\n const elementX = ref(0);\n const elementY = ref(0);\n const elementPositionX = ref(0);\n const elementPositionY = ref(0);\n const elementHeight = ref(0);\n const elementWidth = ref(0);\n const isOutside = ref(true);\n let stop = () => {\n };\n if (window) {\n stop = watch(\n [targetRef, x, y],\n () => {\n const el = unrefElement(targetRef);\n if (!el)\n return;\n const {\n left,\n top,\n width,\n height\n } = el.getBoundingClientRect();\n elementPositionX.value = left + (type === \"page\" ? window.pageXOffset : 0);\n elementPositionY.value = top + (type === \"page\" ? window.pageYOffset : 0);\n elementHeight.value = height;\n elementWidth.value = width;\n const elX = x.value - elementPositionX.value;\n const elY = y.value - elementPositionY.value;\n isOutside.value = width === 0 || height === 0 || elX < 0 || elY < 0 || elX > width || elY > height;\n if (handleOutside || !isOutside.value) {\n elementX.value = elX;\n elementY.value = elY;\n }\n },\n { immediate: true }\n );\n useEventListener(document, \"mouseleave\", () => {\n isOutside.value = true;\n });\n }\n return {\n x,\n y,\n sourceType,\n elementX,\n elementY,\n elementPositionX,\n elementPositionY,\n elementHeight,\n elementWidth,\n isOutside,\n stop\n };\n}\n\nfunction useMousePressed(options = {}) {\n const {\n touch = true,\n drag = true,\n capture = false,\n initialValue = false,\n window = defaultWindow\n } = options;\n const pressed = ref(initialValue);\n const sourceType = ref(null);\n if (!window) {\n return {\n pressed,\n sourceType\n };\n }\n const onPressed = (srcType) => () => {\n pressed.value = true;\n sourceType.value = srcType;\n };\n const onReleased = () => {\n pressed.value = false;\n sourceType.value = null;\n };\n const target = computed(() => unrefElement(options.target) || window);\n useEventListener(target, \"mousedown\", onPressed(\"mouse\"), { passive: true, capture });\n useEventListener(window, \"mouseleave\", onReleased, { passive: true, capture });\n useEventListener(window, \"mouseup\", onReleased, { passive: true, capture });\n if (drag) {\n useEventListener(target, \"dragstart\", onPressed(\"mouse\"), { passive: true, capture });\n useEventListener(window, \"drop\", onReleased, { passive: true, capture });\n useEventListener(window, \"dragend\", onReleased, { passive: true, capture });\n }\n if (touch) {\n useEventListener(target, \"touchstart\", onPressed(\"touch\"), { passive: true, capture });\n useEventListener(window, \"touchend\", onReleased, { passive: true, capture });\n useEventListener(window, \"touchcancel\", onReleased, { passive: true, capture });\n }\n return {\n pressed,\n sourceType\n };\n}\n\nfunction useNavigatorLanguage(options = {}) {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = useSupported(() => navigator && \"language\" in navigator);\n const language = ref(navigator == null ? void 0 : navigator.language);\n useEventListener(window, \"languagechange\", () => {\n if (navigator)\n language.value = navigator.language;\n });\n return {\n isSupported,\n language\n };\n}\n\nfunction useNetwork(options = {}) {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = useSupported(() => navigator && \"connection\" in navigator);\n const isOnline = ref(true);\n const saveData = ref(false);\n const offlineAt = ref(void 0);\n const onlineAt = ref(void 0);\n const downlink = ref(void 0);\n const downlinkMax = ref(void 0);\n const rtt = ref(void 0);\n const effectiveType = ref(void 0);\n const type = ref(\"unknown\");\n const connection = isSupported.value && navigator.connection;\n function updateNetworkInformation() {\n if (!navigator)\n return;\n isOnline.value = navigator.onLine;\n offlineAt.value = isOnline.value ? void 0 : Date.now();\n onlineAt.value = isOnline.value ? Date.now() : void 0;\n if (connection) {\n downlink.value = connection.downlink;\n downlinkMax.value = connection.downlinkMax;\n effectiveType.value = connection.effectiveType;\n rtt.value = connection.rtt;\n saveData.value = connection.saveData;\n type.value = connection.type;\n }\n }\n if (window) {\n useEventListener(window, \"offline\", () => {\n isOnline.value = false;\n offlineAt.value = Date.now();\n });\n useEventListener(window, \"online\", () => {\n isOnline.value = true;\n onlineAt.value = Date.now();\n });\n }\n if (connection)\n useEventListener(connection, \"change\", updateNetworkInformation, false);\n updateNetworkInformation();\n return {\n isSupported,\n isOnline,\n saveData,\n offlineAt,\n onlineAt,\n downlink,\n downlinkMax,\n effectiveType,\n rtt,\n type\n };\n}\n\nfunction useNow(options = {}) {\n const {\n controls: exposeControls = false,\n interval = \"requestAnimationFrame\"\n } = options;\n const now = ref(/* @__PURE__ */ new Date());\n const update = () => now.value = /* @__PURE__ */ new Date();\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(update, { immediate: true }) : useIntervalFn(update, interval, { immediate: true });\n if (exposeControls) {\n return {\n now,\n ...controls\n };\n } else {\n return now;\n }\n}\n\nfunction useObjectUrl(object) {\n const url = ref();\n const release = () => {\n if (url.value)\n URL.revokeObjectURL(url.value);\n url.value = void 0;\n };\n watch(\n () => toValue(object),\n (newObject) => {\n release();\n if (newObject)\n url.value = URL.createObjectURL(newObject);\n },\n { immediate: true }\n );\n tryOnScopeDispose(release);\n return readonly(url);\n}\n\nfunction useClamp(value, min, max) {\n if (typeof value === \"function\" || isReadonly(value))\n return computed(() => clamp(toValue(value), toValue(min), toValue(max)));\n const _value = ref(value);\n return computed({\n get() {\n return _value.value = clamp(_value.value, toValue(min), toValue(max));\n },\n set(value2) {\n _value.value = clamp(value2, toValue(min), toValue(max));\n }\n });\n}\n\nfunction useOffsetPagination(options) {\n const {\n total = Number.POSITIVE_INFINITY,\n pageSize = 10,\n page = 1,\n onPageChange = noop,\n onPageSizeChange = noop,\n onPageCountChange = noop\n } = options;\n const currentPageSize = useClamp(pageSize, 1, Number.POSITIVE_INFINITY);\n const pageCount = computed(() => Math.max(\n 1,\n Math.ceil(toValue(total) / toValue(currentPageSize))\n ));\n const currentPage = useClamp(page, 1, pageCount);\n const isFirstPage = computed(() => currentPage.value === 1);\n const isLastPage = computed(() => currentPage.value === pageCount.value);\n if (isRef(page)) {\n syncRef(page, currentPage, {\n direction: isReadonly(page) ? \"ltr\" : \"both\"\n });\n }\n if (isRef(pageSize)) {\n syncRef(pageSize, currentPageSize, {\n direction: isReadonly(pageSize) ? \"ltr\" : \"both\"\n });\n }\n function prev() {\n currentPage.value--;\n }\n function next() {\n currentPage.value++;\n }\n const returnValue = {\n currentPage,\n currentPageSize,\n pageCount,\n isFirstPage,\n isLastPage,\n prev,\n next\n };\n watch(currentPage, () => {\n onPageChange(reactive(returnValue));\n });\n watch(currentPageSize, () => {\n onPageSizeChange(reactive(returnValue));\n });\n watch(pageCount, () => {\n onPageCountChange(reactive(returnValue));\n });\n return returnValue;\n}\n\nfunction useOnline(options = {}) {\n const { isOnline } = useNetwork(options);\n return isOnline;\n}\n\nfunction usePageLeave(options = {}) {\n const { window = defaultWindow } = options;\n const isLeft = ref(false);\n const handler = (event) => {\n if (!window)\n return;\n event = event || window.event;\n const from = event.relatedTarget || event.toElement;\n isLeft.value = !from;\n };\n if (window) {\n useEventListener(window, \"mouseout\", handler, { passive: true });\n useEventListener(window.document, \"mouseleave\", handler, { passive: true });\n useEventListener(window.document, \"mouseenter\", handler, { passive: true });\n }\n return isLeft;\n}\n\nfunction useScreenOrientation(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const isSupported = useSupported(() => window && \"screen\" in window && \"orientation\" in window.screen);\n const screenOrientation = isSupported.value ? window.screen.orientation : {};\n const orientation = ref(screenOrientation.type);\n const angle = ref(screenOrientation.angle || 0);\n if (isSupported.value) {\n useEventListener(window, \"orientationchange\", () => {\n orientation.value = screenOrientation.type;\n angle.value = screenOrientation.angle;\n });\n }\n const lockOrientation = (type) => {\n if (isSupported.value && typeof screenOrientation.lock === \"function\")\n return screenOrientation.lock(type);\n return Promise.reject(new Error(\"Not supported\"));\n };\n const unlockOrientation = () => {\n if (isSupported.value && typeof screenOrientation.unlock === \"function\")\n screenOrientation.unlock();\n };\n return {\n isSupported,\n orientation,\n angle,\n lockOrientation,\n unlockOrientation\n };\n}\n\nfunction useParallax(target, options = {}) {\n const {\n deviceOrientationTiltAdjust = (i) => i,\n deviceOrientationRollAdjust = (i) => i,\n mouseTiltAdjust = (i) => i,\n mouseRollAdjust = (i) => i,\n window = defaultWindow\n } = options;\n const orientation = reactive(useDeviceOrientation({ window }));\n const screenOrientation = reactive(useScreenOrientation({ window }));\n const {\n elementX: x,\n elementY: y,\n elementWidth: width,\n elementHeight: height\n } = useMouseInElement(target, { handleOutside: false, window });\n const source = computed(() => {\n if (orientation.isSupported && (orientation.alpha != null && orientation.alpha !== 0 || orientation.gamma != null && orientation.gamma !== 0)) {\n return \"deviceOrientation\";\n }\n return \"mouse\";\n });\n const roll = computed(() => {\n if (source.value === \"deviceOrientation\") {\n let value;\n switch (screenOrientation.orientation) {\n case \"landscape-primary\":\n value = orientation.gamma / 90;\n break;\n case \"landscape-secondary\":\n value = -orientation.gamma / 90;\n break;\n case \"portrait-primary\":\n value = -orientation.beta / 90;\n break;\n case \"portrait-secondary\":\n value = orientation.beta / 90;\n break;\n default:\n value = -orientation.beta / 90;\n }\n return deviceOrientationRollAdjust(value);\n } else {\n const value = -(y.value - height.value / 2) / height.value;\n return mouseRollAdjust(value);\n }\n });\n const tilt = computed(() => {\n if (source.value === \"deviceOrientation\") {\n let value;\n switch (screenOrientation.orientation) {\n case \"landscape-primary\":\n value = orientation.beta / 90;\n break;\n case \"landscape-secondary\":\n value = -orientation.beta / 90;\n break;\n case \"portrait-primary\":\n value = orientation.gamma / 90;\n break;\n case \"portrait-secondary\":\n value = -orientation.gamma / 90;\n break;\n default:\n value = orientation.gamma / 90;\n }\n return deviceOrientationTiltAdjust(value);\n } else {\n const value = (x.value - width.value / 2) / width.value;\n return mouseTiltAdjust(value);\n }\n });\n return { roll, tilt, source };\n}\n\nfunction useParentElement(element = useCurrentElement()) {\n const parentElement = shallowRef();\n const update = () => {\n const el = unrefElement(element);\n if (el)\n parentElement.value = el.parentElement;\n };\n tryOnMounted(update);\n watch(() => toValue(element), update);\n return parentElement;\n}\n\nfunction usePerformanceObserver(options, callback) {\n const {\n window = defaultWindow,\n immediate = true,\n ...performanceOptions\n } = options;\n const isSupported = useSupported(() => window && \"PerformanceObserver\" in window);\n let observer;\n const stop = () => {\n observer == null ? void 0 : observer.disconnect();\n };\n const start = () => {\n if (isSupported.value) {\n stop();\n observer = new PerformanceObserver(callback);\n observer.observe(performanceOptions);\n }\n };\n tryOnScopeDispose(stop);\n if (immediate)\n start();\n return {\n isSupported,\n start,\n stop\n };\n}\n\nconst defaultState = {\n x: 0,\n y: 0,\n pointerId: 0,\n pressure: 0,\n tiltX: 0,\n tiltY: 0,\n width: 0,\n height: 0,\n twist: 0,\n pointerType: null\n};\nconst keys = /* @__PURE__ */ Object.keys(defaultState);\nfunction usePointer(options = {}) {\n const {\n target = defaultWindow\n } = options;\n const isInside = ref(false);\n const state = ref(options.initialValue || {});\n Object.assign(state.value, defaultState, state.value);\n const handler = (event) => {\n isInside.value = true;\n if (options.pointerTypes && !options.pointerTypes.includes(event.pointerType))\n return;\n state.value = objectPick(event, keys, false);\n };\n if (target) {\n const listenerOptions = { passive: true };\n useEventListener(target, [\"pointerdown\", \"pointermove\", \"pointerup\"], handler, listenerOptions);\n useEventListener(target, \"pointerleave\", () => isInside.value = false, listenerOptions);\n }\n return {\n ...toRefs(state),\n isInside\n };\n}\n\nfunction usePointerLock(target, options = {}) {\n const { document = defaultDocument } = options;\n const isSupported = useSupported(() => document && \"pointerLockElement\" in document);\n const element = ref();\n const triggerElement = ref();\n let targetElement;\n if (isSupported.value) {\n useEventListener(document, \"pointerlockchange\", () => {\n var _a;\n const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;\n if (targetElement && currentElement === targetElement) {\n element.value = document.pointerLockElement;\n if (!element.value)\n targetElement = triggerElement.value = null;\n }\n });\n useEventListener(document, \"pointerlockerror\", () => {\n var _a;\n const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;\n if (targetElement && currentElement === targetElement) {\n const action = document.pointerLockElement ? \"release\" : \"acquire\";\n throw new Error(`Failed to ${action} pointer lock.`);\n }\n });\n }\n async function lock(e) {\n var _a;\n if (!isSupported.value)\n throw new Error(\"Pointer Lock API is not supported by your browser.\");\n triggerElement.value = e instanceof Event ? e.currentTarget : null;\n targetElement = e instanceof Event ? (_a = unrefElement(target)) != null ? _a : triggerElement.value : unrefElement(e);\n if (!targetElement)\n throw new Error(\"Target element undefined.\");\n targetElement.requestPointerLock();\n return await until(element).toBe(targetElement);\n }\n async function unlock() {\n if (!element.value)\n return false;\n document.exitPointerLock();\n await until(element).toBeNull();\n return true;\n }\n return {\n isSupported,\n element,\n triggerElement,\n lock,\n unlock\n };\n}\n\nfunction usePointerSwipe(target, options = {}) {\n const targetRef = toRef(target);\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart,\n disableTextSelect = false\n } = options;\n const posStart = reactive({ x: 0, y: 0 });\n const updatePosStart = (x, y) => {\n posStart.x = x;\n posStart.y = y;\n };\n const posEnd = reactive({ x: 0, y: 0 });\n const updatePosEnd = (x, y) => {\n posEnd.x = x;\n posEnd.y = y;\n };\n const distanceX = computed(() => posStart.x - posEnd.x);\n const distanceY = computed(() => posStart.y - posEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(distanceX.value), abs(distanceY.value)) >= threshold);\n const isSwiping = ref(false);\n const isPointerDown = ref(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return \"none\";\n if (abs(distanceX.value) > abs(distanceY.value)) {\n return distanceX.value > 0 ? \"left\" : \"right\";\n } else {\n return distanceY.value > 0 ? \"up\" : \"down\";\n }\n });\n const eventIsAllowed = (e) => {\n var _a, _b, _c;\n const isReleasingButton = e.buttons === 0;\n const isPrimaryButton = e.buttons === 1;\n return (_c = (_b = (_a = options.pointerTypes) == null ? void 0 : _a.includes(e.pointerType)) != null ? _b : isReleasingButton || isPrimaryButton) != null ? _c : true;\n };\n const stops = [\n useEventListener(target, \"pointerdown\", (e) => {\n if (!eventIsAllowed(e))\n return;\n isPointerDown.value = true;\n const eventTarget = e.target;\n eventTarget == null ? void 0 : eventTarget.setPointerCapture(e.pointerId);\n const { clientX: x, clientY: y } = e;\n updatePosStart(x, y);\n updatePosEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }),\n useEventListener(target, \"pointermove\", (e) => {\n if (!eventIsAllowed(e))\n return;\n if (!isPointerDown.value)\n return;\n const { clientX: x, clientY: y } = e;\n updatePosEnd(x, y);\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }),\n useEventListener(target, \"pointerup\", (e) => {\n if (!eventIsAllowed(e))\n return;\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isPointerDown.value = false;\n isSwiping.value = false;\n })\n ];\n tryOnMounted(() => {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty(\"touch-action\", \"none\");\n if (disableTextSelect) {\n (_d = (_c = targetRef.value) == null ? void 0 : _c.style) == null ? void 0 : _d.setProperty(\"-webkit-user-select\", \"none\");\n (_f = (_e = targetRef.value) == null ? void 0 : _e.style) == null ? void 0 : _f.setProperty(\"-ms-user-select\", \"none\");\n (_h = (_g = targetRef.value) == null ? void 0 : _g.style) == null ? void 0 : _h.setProperty(\"user-select\", \"none\");\n }\n });\n const stop = () => stops.forEach((s) => s());\n return {\n isSwiping: readonly(isSwiping),\n direction: readonly(direction),\n posStart: readonly(posStart),\n posEnd: readonly(posEnd),\n distanceX,\n distanceY,\n stop\n };\n}\n\nfunction usePreferredColorScheme(options) {\n const isLight = useMediaQuery(\"(prefers-color-scheme: light)\", options);\n const isDark = useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n return computed(() => {\n if (isDark.value)\n return \"dark\";\n if (isLight.value)\n return \"light\";\n return \"no-preference\";\n });\n}\n\nfunction usePreferredContrast(options) {\n const isMore = useMediaQuery(\"(prefers-contrast: more)\", options);\n const isLess = useMediaQuery(\"(prefers-contrast: less)\", options);\n const isCustom = useMediaQuery(\"(prefers-contrast: custom)\", options);\n return computed(() => {\n if (isMore.value)\n return \"more\";\n if (isLess.value)\n return \"less\";\n if (isCustom.value)\n return \"custom\";\n return \"no-preference\";\n });\n}\n\nfunction usePreferredLanguages(options = {}) {\n const { window = defaultWindow } = options;\n if (!window)\n return ref([\"en\"]);\n const navigator = window.navigator;\n const value = ref(navigator.languages);\n useEventListener(window, \"languagechange\", () => {\n value.value = navigator.languages;\n });\n return value;\n}\n\nfunction usePreferredReducedMotion(options) {\n const isReduced = useMediaQuery(\"(prefers-reduced-motion: reduce)\", options);\n return computed(() => {\n if (isReduced.value)\n return \"reduce\";\n return \"no-preference\";\n });\n}\n\nfunction usePrevious(value, initialValue) {\n const previous = shallowRef(initialValue);\n watch(\n toRef(value),\n (_, oldValue) => {\n previous.value = oldValue;\n },\n { flush: \"sync\" }\n );\n return readonly(previous);\n}\n\nconst topVarName = \"--vueuse-safe-area-top\";\nconst rightVarName = \"--vueuse-safe-area-right\";\nconst bottomVarName = \"--vueuse-safe-area-bottom\";\nconst leftVarName = \"--vueuse-safe-area-left\";\nfunction useScreenSafeArea() {\n const top = ref(\"\");\n const right = ref(\"\");\n const bottom = ref(\"\");\n const left = ref(\"\");\n if (isClient) {\n const topCssVar = useCssVar(topVarName);\n const rightCssVar = useCssVar(rightVarName);\n const bottomCssVar = useCssVar(bottomVarName);\n const leftCssVar = useCssVar(leftVarName);\n topCssVar.value = \"env(safe-area-inset-top, 0px)\";\n rightCssVar.value = \"env(safe-area-inset-right, 0px)\";\n bottomCssVar.value = \"env(safe-area-inset-bottom, 0px)\";\n leftCssVar.value = \"env(safe-area-inset-left, 0px)\";\n update();\n useEventListener(\"resize\", useDebounceFn(update));\n }\n function update() {\n top.value = getValue(topVarName);\n right.value = getValue(rightVarName);\n bottom.value = getValue(bottomVarName);\n left.value = getValue(leftVarName);\n }\n return {\n top,\n right,\n bottom,\n left,\n update\n };\n}\nfunction getValue(position) {\n return getComputedStyle(document.documentElement).getPropertyValue(position);\n}\n\nfunction useScriptTag(src, onLoaded = noop, options = {}) {\n const {\n immediate = true,\n manual = false,\n type = \"text/javascript\",\n async = true,\n crossOrigin,\n referrerPolicy,\n noModule,\n defer,\n document = defaultDocument,\n attrs = {}\n } = options;\n const scriptTag = ref(null);\n let _promise = null;\n const loadScript = (waitForScriptLoad) => new Promise((resolve, reject) => {\n const resolveWithElement = (el2) => {\n scriptTag.value = el2;\n resolve(el2);\n return el2;\n };\n if (!document) {\n resolve(false);\n return;\n }\n let shouldAppend = false;\n let el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n if (!el) {\n el = document.createElement(\"script\");\n el.type = type;\n el.async = async;\n el.src = toValue(src);\n if (defer)\n el.defer = defer;\n if (crossOrigin)\n el.crossOrigin = crossOrigin;\n if (noModule)\n el.noModule = noModule;\n if (referrerPolicy)\n el.referrerPolicy = referrerPolicy;\n Object.entries(attrs).forEach(([name, value]) => el == null ? void 0 : el.setAttribute(name, value));\n shouldAppend = true;\n } else if (el.hasAttribute(\"data-loaded\")) {\n resolveWithElement(el);\n }\n el.addEventListener(\"error\", (event) => reject(event));\n el.addEventListener(\"abort\", (event) => reject(event));\n el.addEventListener(\"load\", () => {\n el.setAttribute(\"data-loaded\", \"true\");\n onLoaded(el);\n resolveWithElement(el);\n });\n if (shouldAppend)\n el = document.head.appendChild(el);\n if (!waitForScriptLoad)\n resolveWithElement(el);\n });\n const load = (waitForScriptLoad = true) => {\n if (!_promise)\n _promise = loadScript(waitForScriptLoad);\n return _promise;\n };\n const unload = () => {\n if (!document)\n return;\n _promise = null;\n if (scriptTag.value)\n scriptTag.value = null;\n const el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n if (el)\n document.head.removeChild(el);\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnUnmounted(unload);\n return { scriptTag, load, unload };\n}\n\nfunction checkOverflowScroll(ele) {\n const style = window.getComputedStyle(ele);\n if (style.overflowX === \"scroll\" || style.overflowY === \"scroll\" || style.overflowX === \"auto\" && ele.clientWidth < ele.scrollWidth || style.overflowY === \"auto\" && ele.clientHeight < ele.scrollHeight) {\n return true;\n } else {\n const parent = ele.parentNode;\n if (!parent || parent.tagName === \"BODY\")\n return false;\n return checkOverflowScroll(parent);\n }\n}\nfunction preventDefault(rawEvent) {\n const e = rawEvent || window.event;\n const _target = e.target;\n if (checkOverflowScroll(_target))\n return false;\n if (e.touches.length > 1)\n return true;\n if (e.preventDefault)\n e.preventDefault();\n return false;\n}\nconst elInitialOverflow = /* @__PURE__ */ new WeakMap();\nfunction useScrollLock(element, initialState = false) {\n const isLocked = ref(initialState);\n let stopTouchMoveListener = null;\n let initialOverflow = \"\";\n watch(toRef(element), (el) => {\n const target = resolveElement(toValue(el));\n if (target) {\n const ele = target;\n if (!elInitialOverflow.get(ele))\n elInitialOverflow.set(ele, ele.style.overflow);\n if (ele.style.overflow !== \"hidden\")\n initialOverflow = ele.style.overflow;\n if (ele.style.overflow === \"hidden\")\n return isLocked.value = true;\n if (isLocked.value)\n return ele.style.overflow = \"hidden\";\n }\n }, {\n immediate: true\n });\n const lock = () => {\n const el = resolveElement(toValue(element));\n if (!el || isLocked.value)\n return;\n if (isIOS) {\n stopTouchMoveListener = useEventListener(\n el,\n \"touchmove\",\n (e) => {\n preventDefault(e);\n },\n { passive: false }\n );\n }\n el.style.overflow = \"hidden\";\n isLocked.value = true;\n };\n const unlock = () => {\n const el = resolveElement(toValue(element));\n if (!el || !isLocked.value)\n return;\n isIOS && (stopTouchMoveListener == null ? void 0 : stopTouchMoveListener());\n el.style.overflow = initialOverflow;\n elInitialOverflow.delete(el);\n isLocked.value = false;\n };\n tryOnScopeDispose(unlock);\n return computed({\n get() {\n return isLocked.value;\n },\n set(v) {\n if (v)\n lock();\n else unlock();\n }\n });\n}\n\nfunction useSessionStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.sessionStorage, options);\n}\n\nfunction useShare(shareOptions = {}, options = {}) {\n const { navigator = defaultNavigator } = options;\n const _navigator = navigator;\n const isSupported = useSupported(() => _navigator && \"canShare\" in _navigator);\n const share = async (overrideOptions = {}) => {\n if (isSupported.value) {\n const data = {\n ...toValue(shareOptions),\n ...toValue(overrideOptions)\n };\n let granted = true;\n if (data.files && _navigator.canShare)\n granted = _navigator.canShare({ files: data.files });\n if (granted)\n return _navigator.share(data);\n }\n };\n return {\n isSupported,\n share\n };\n}\n\nconst defaultSortFn = (source, compareFn) => source.sort(compareFn);\nconst defaultCompare = (a, b) => a - b;\nfunction useSorted(...args) {\n var _a, _b, _c, _d;\n const [source] = args;\n let compareFn = defaultCompare;\n let options = {};\n if (args.length === 2) {\n if (typeof args[1] === \"object\") {\n options = args[1];\n compareFn = (_a = options.compareFn) != null ? _a : defaultCompare;\n } else {\n compareFn = (_b = args[1]) != null ? _b : defaultCompare;\n }\n } else if (args.length > 2) {\n compareFn = (_c = args[1]) != null ? _c : defaultCompare;\n options = (_d = args[2]) != null ? _d : {};\n }\n const {\n dirty = false,\n sortFn = defaultSortFn\n } = options;\n if (!dirty)\n return computed(() => sortFn([...toValue(source)], compareFn));\n watchEffect(() => {\n const result = sortFn(toValue(source), compareFn);\n if (isRef(source))\n source.value = result;\n else\n source.splice(0, source.length, ...result);\n });\n return source;\n}\n\nfunction useSpeechRecognition(options = {}) {\n const {\n interimResults = true,\n continuous = true,\n window = defaultWindow\n } = options;\n const lang = toRef(options.lang || \"en-US\");\n const isListening = ref(false);\n const isFinal = ref(false);\n const result = ref(\"\");\n const error = shallowRef(void 0);\n const toggle = (value = !isListening.value) => {\n isListening.value = value;\n };\n const start = () => {\n isListening.value = true;\n };\n const stop = () => {\n isListening.value = false;\n };\n const SpeechRecognition = window && (window.SpeechRecognition || window.webkitSpeechRecognition);\n const isSupported = useSupported(() => SpeechRecognition);\n let recognition;\n if (isSupported.value) {\n recognition = new SpeechRecognition();\n recognition.continuous = continuous;\n recognition.interimResults = interimResults;\n recognition.lang = toValue(lang);\n recognition.onstart = () => {\n isFinal.value = false;\n };\n watch(lang, (lang2) => {\n if (recognition && !isListening.value)\n recognition.lang = lang2;\n });\n recognition.onresult = (event) => {\n const currentResult = event.results[event.resultIndex];\n const { transcript } = currentResult[0];\n isFinal.value = currentResult.isFinal;\n result.value = transcript;\n error.value = void 0;\n };\n recognition.onerror = (event) => {\n error.value = event;\n };\n recognition.onend = () => {\n isListening.value = false;\n recognition.lang = toValue(lang);\n };\n watch(isListening, () => {\n if (isListening.value)\n recognition.start();\n else\n recognition.stop();\n });\n }\n tryOnScopeDispose(() => {\n isListening.value = false;\n });\n return {\n isSupported,\n isListening,\n isFinal,\n recognition,\n result,\n error,\n toggle,\n start,\n stop\n };\n}\n\nfunction useSpeechSynthesis(text, options = {}) {\n const {\n pitch = 1,\n rate = 1,\n volume = 1,\n window = defaultWindow\n } = options;\n const synth = window && window.speechSynthesis;\n const isSupported = useSupported(() => synth);\n const isPlaying = ref(false);\n const status = ref(\"init\");\n const spokenText = toRef(text || \"\");\n const lang = toRef(options.lang || \"en-US\");\n const error = shallowRef(void 0);\n const toggle = (value = !isPlaying.value) => {\n isPlaying.value = value;\n };\n const bindEventsForUtterance = (utterance2) => {\n utterance2.lang = toValue(lang);\n utterance2.voice = toValue(options.voice) || null;\n utterance2.pitch = toValue(pitch);\n utterance2.rate = toValue(rate);\n utterance2.volume = volume;\n utterance2.onstart = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onpause = () => {\n isPlaying.value = false;\n status.value = \"pause\";\n };\n utterance2.onresume = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onend = () => {\n isPlaying.value = false;\n status.value = \"end\";\n };\n utterance2.onerror = (event) => {\n error.value = event;\n };\n };\n const utterance = computed(() => {\n isPlaying.value = false;\n status.value = \"init\";\n const newUtterance = new SpeechSynthesisUtterance(spokenText.value);\n bindEventsForUtterance(newUtterance);\n return newUtterance;\n });\n const speak = () => {\n synth.cancel();\n utterance && synth.speak(utterance.value);\n };\n const stop = () => {\n synth.cancel();\n isPlaying.value = false;\n };\n if (isSupported.value) {\n bindEventsForUtterance(utterance.value);\n watch(lang, (lang2) => {\n if (utterance.value && !isPlaying.value)\n utterance.value.lang = lang2;\n });\n if (options.voice) {\n watch(options.voice, () => {\n synth.cancel();\n });\n }\n watch(isPlaying, () => {\n if (isPlaying.value)\n synth.resume();\n else\n synth.pause();\n });\n }\n tryOnScopeDispose(() => {\n isPlaying.value = false;\n });\n return {\n isSupported,\n isPlaying,\n status,\n utterance,\n error,\n stop,\n toggle,\n speak\n };\n}\n\nfunction useStepper(steps, initialStep) {\n const stepsRef = ref(steps);\n const stepNames = computed(() => Array.isArray(stepsRef.value) ? stepsRef.value : Object.keys(stepsRef.value));\n const index = ref(stepNames.value.indexOf(initialStep != null ? initialStep : stepNames.value[0]));\n const current = computed(() => at(index.value));\n const isFirst = computed(() => index.value === 0);\n const isLast = computed(() => index.value === stepNames.value.length - 1);\n const next = computed(() => stepNames.value[index.value + 1]);\n const previous = computed(() => stepNames.value[index.value - 1]);\n function at(index2) {\n if (Array.isArray(stepsRef.value))\n return stepsRef.value[index2];\n return stepsRef.value[stepNames.value[index2]];\n }\n function get(step) {\n if (!stepNames.value.includes(step))\n return;\n return at(stepNames.value.indexOf(step));\n }\n function goTo(step) {\n if (stepNames.value.includes(step))\n index.value = stepNames.value.indexOf(step);\n }\n function goToNext() {\n if (isLast.value)\n return;\n index.value++;\n }\n function goToPrevious() {\n if (isFirst.value)\n return;\n index.value--;\n }\n function goBackTo(step) {\n if (isAfter(step))\n goTo(step);\n }\n function isNext(step) {\n return stepNames.value.indexOf(step) === index.value + 1;\n }\n function isPrevious(step) {\n return stepNames.value.indexOf(step) === index.value - 1;\n }\n function isCurrent(step) {\n return stepNames.value.indexOf(step) === index.value;\n }\n function isBefore(step) {\n return index.value < stepNames.value.indexOf(step);\n }\n function isAfter(step) {\n return index.value > stepNames.value.indexOf(step);\n }\n return {\n steps: stepsRef,\n stepNames,\n index,\n current,\n next,\n previous,\n isFirst,\n isLast,\n at,\n get,\n goTo,\n goToNext,\n goToPrevious,\n goBackTo,\n isNext,\n isPrevious,\n isCurrent,\n isBefore,\n isAfter\n };\n}\n\nfunction useStorageAsync(key, initialValue, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n mergeDefaults = false,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const rawInit = toValue(initialValue);\n const type = guessSerializerType(rawInit);\n const data = (shallow ? shallowRef : ref)(initialValue);\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorageAsync\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n async function read(event) {\n if (!storage || event && event.key !== key)\n return;\n try {\n const rawValue = event ? event.newValue : await storage.getItem(key);\n if (rawValue == null) {\n data.value = rawInit;\n if (writeDefaults && rawInit !== null)\n await storage.setItem(key, await serializer.write(rawInit));\n } else if (mergeDefaults) {\n const value = await serializer.read(rawValue);\n if (typeof mergeDefaults === \"function\")\n data.value = mergeDefaults(value, rawInit);\n else if (type === \"object\" && !Array.isArray(value))\n data.value = { ...rawInit, ...value };\n else data.value = value;\n } else {\n data.value = await serializer.read(rawValue);\n }\n } catch (e) {\n onError(e);\n }\n }\n read();\n if (window && listenToStorageChanges)\n useEventListener(window, \"storage\", (e) => Promise.resolve().then(() => read(e)));\n if (storage) {\n watchWithFilter(\n data,\n async () => {\n try {\n if (data.value == null)\n await storage.removeItem(key);\n else\n await storage.setItem(key, await serializer.write(data.value));\n } catch (e) {\n onError(e);\n }\n },\n {\n flush,\n deep,\n eventFilter\n }\n );\n }\n return data;\n}\n\nlet _id = 0;\nfunction useStyleTag(css, options = {}) {\n const isLoaded = ref(false);\n const {\n document = defaultDocument,\n immediate = true,\n manual = false,\n id = `vueuse_styletag_${++_id}`\n } = options;\n const cssRef = ref(css);\n let stop = () => {\n };\n const load = () => {\n if (!document)\n return;\n const el = document.getElementById(id) || document.createElement(\"style\");\n if (!el.isConnected) {\n el.id = id;\n if (options.media)\n el.media = options.media;\n document.head.appendChild(el);\n }\n if (isLoaded.value)\n return;\n stop = watch(\n cssRef,\n (value) => {\n el.textContent = value;\n },\n { immediate: true }\n );\n isLoaded.value = true;\n };\n const unload = () => {\n if (!document || !isLoaded.value)\n return;\n stop();\n document.head.removeChild(document.getElementById(id));\n isLoaded.value = false;\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnScopeDispose(unload);\n return {\n id,\n css: cssRef,\n unload,\n load,\n isLoaded: readonly(isLoaded)\n };\n}\n\nfunction useSwipe(target, options = {}) {\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart,\n passive = true,\n window = defaultWindow\n } = options;\n const coordsStart = reactive({ x: 0, y: 0 });\n const coordsEnd = reactive({ x: 0, y: 0 });\n const diffX = computed(() => coordsStart.x - coordsEnd.x);\n const diffY = computed(() => coordsStart.y - coordsEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold);\n const isSwiping = ref(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return \"none\";\n if (abs(diffX.value) > abs(diffY.value)) {\n return diffX.value > 0 ? \"left\" : \"right\";\n } else {\n return diffY.value > 0 ? \"up\" : \"down\";\n }\n });\n const getTouchEventCoords = (e) => [e.touches[0].clientX, e.touches[0].clientY];\n const updateCoordsStart = (x, y) => {\n coordsStart.x = x;\n coordsStart.y = y;\n };\n const updateCoordsEnd = (x, y) => {\n coordsEnd.x = x;\n coordsEnd.y = y;\n };\n let listenerOptions;\n const isPassiveEventSupported = checkPassiveEventSupport(window == null ? void 0 : window.document);\n if (!passive)\n listenerOptions = isPassiveEventSupported ? { passive: false, capture: true } : { capture: true };\n else\n listenerOptions = isPassiveEventSupported ? { passive: true } : { capture: false };\n const onTouchEnd = (e) => {\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isSwiping.value = false;\n };\n const stops = [\n useEventListener(target, \"touchstart\", (e) => {\n if (e.touches.length !== 1)\n return;\n if (listenerOptions.capture && !listenerOptions.passive)\n e.preventDefault();\n const [x, y] = getTouchEventCoords(e);\n updateCoordsStart(x, y);\n updateCoordsEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }, listenerOptions),\n useEventListener(target, \"touchmove\", (e) => {\n if (e.touches.length !== 1)\n return;\n const [x, y] = getTouchEventCoords(e);\n updateCoordsEnd(x, y);\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }, listenerOptions),\n useEventListener(target, [\"touchend\", \"touchcancel\"], onTouchEnd, listenerOptions)\n ];\n const stop = () => stops.forEach((s) => s());\n return {\n isPassiveEventSupported,\n isSwiping,\n direction,\n coordsStart,\n coordsEnd,\n lengthX: diffX,\n lengthY: diffY,\n stop\n };\n}\nfunction checkPassiveEventSupport(document) {\n if (!document)\n return false;\n let supportsPassive = false;\n const optionsBlock = {\n get passive() {\n supportsPassive = true;\n return false;\n }\n };\n document.addEventListener(\"x\", noop, optionsBlock);\n document.removeEventListener(\"x\", noop);\n return supportsPassive;\n}\n\nfunction useTemplateRefsList() {\n const refs = ref([]);\n refs.value.set = (el) => {\n if (el)\n refs.value.push(el);\n };\n onBeforeUpdate(() => {\n refs.value.length = 0;\n });\n return refs;\n}\n\nfunction useTextDirection(options = {}) {\n const {\n document = defaultDocument,\n selector = \"html\",\n observe = false,\n initialValue = \"ltr\"\n } = options;\n function getValue() {\n var _a, _b;\n return (_b = (_a = document == null ? void 0 : document.querySelector(selector)) == null ? void 0 : _a.getAttribute(\"dir\")) != null ? _b : initialValue;\n }\n const dir = ref(getValue());\n tryOnMounted(() => dir.value = getValue());\n if (observe && document) {\n useMutationObserver(\n document.querySelector(selector),\n () => dir.value = getValue(),\n { attributes: true }\n );\n }\n return computed({\n get() {\n return dir.value;\n },\n set(v) {\n var _a, _b;\n dir.value = v;\n if (!document)\n return;\n if (dir.value)\n (_a = document.querySelector(selector)) == null ? void 0 : _a.setAttribute(\"dir\", dir.value);\n else\n (_b = document.querySelector(selector)) == null ? void 0 : _b.removeAttribute(\"dir\");\n }\n });\n}\n\nfunction getRangesFromSelection(selection) {\n var _a;\n const rangeCount = (_a = selection.rangeCount) != null ? _a : 0;\n return Array.from({ length: rangeCount }, (_, i) => selection.getRangeAt(i));\n}\nfunction useTextSelection(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const selection = ref(null);\n const text = computed(() => {\n var _a, _b;\n return (_b = (_a = selection.value) == null ? void 0 : _a.toString()) != null ? _b : \"\";\n });\n const ranges = computed(() => selection.value ? getRangesFromSelection(selection.value) : []);\n const rects = computed(() => ranges.value.map((range) => range.getBoundingClientRect()));\n function onSelectionChange() {\n selection.value = null;\n if (window)\n selection.value = window.getSelection();\n }\n if (window)\n useEventListener(window.document, \"selectionchange\", onSelectionChange);\n return {\n text,\n rects,\n ranges,\n selection\n };\n}\n\nfunction useTextareaAutosize(options) {\n var _a;\n const textarea = ref(options == null ? void 0 : options.element);\n const input = ref(options == null ? void 0 : options.input);\n const styleProp = (_a = options == null ? void 0 : options.styleProp) != null ? _a : \"height\";\n const textareaScrollHeight = ref(1);\n function triggerResize() {\n var _a2;\n if (!textarea.value)\n return;\n let height = \"\";\n textarea.value.style[styleProp] = \"1px\";\n textareaScrollHeight.value = (_a2 = textarea.value) == null ? void 0 : _a2.scrollHeight;\n if (options == null ? void 0 : options.styleTarget)\n toValue(options.styleTarget).style[styleProp] = `${textareaScrollHeight.value}px`;\n else\n height = `${textareaScrollHeight.value}px`;\n textarea.value.style[styleProp] = height;\n }\n watch([input, textarea], () => nextTick(triggerResize), { immediate: true });\n watch(textareaScrollHeight, () => {\n var _a2;\n return (_a2 = options == null ? void 0 : options.onResize) == null ? void 0 : _a2.call(options);\n });\n useResizeObserver(textarea, () => triggerResize());\n if (options == null ? void 0 : options.watch)\n watch(options.watch, triggerResize, { immediate: true, deep: true });\n return {\n textarea,\n input,\n triggerResize\n };\n}\n\nfunction useThrottledRefHistory(source, options = {}) {\n const { throttle = 200, trailing = true } = options;\n const filter = throttleFilter(throttle, trailing);\n const history = useRefHistory(source, { ...options, eventFilter: filter });\n return {\n ...history\n };\n}\n\nconst DEFAULT_UNITS = [\n { max: 6e4, value: 1e3, name: \"second\" },\n { max: 276e4, value: 6e4, name: \"minute\" },\n { max: 72e6, value: 36e5, name: \"hour\" },\n { max: 5184e5, value: 864e5, name: \"day\" },\n { max: 24192e5, value: 6048e5, name: \"week\" },\n { max: 28512e6, value: 2592e6, name: \"month\" },\n { max: Number.POSITIVE_INFINITY, value: 31536e6, name: \"year\" }\n];\nconst DEFAULT_MESSAGES = {\n justNow: \"just now\",\n past: (n) => n.match(/\\d/) ? `${n} ago` : n,\n future: (n) => n.match(/\\d/) ? `in ${n}` : n,\n month: (n, past) => n === 1 ? past ? \"last month\" : \"next month\" : `${n} month${n > 1 ? \"s\" : \"\"}`,\n year: (n, past) => n === 1 ? past ? \"last year\" : \"next year\" : `${n} year${n > 1 ? \"s\" : \"\"}`,\n day: (n, past) => n === 1 ? past ? \"yesterday\" : \"tomorrow\" : `${n} day${n > 1 ? \"s\" : \"\"}`,\n week: (n, past) => n === 1 ? past ? \"last week\" : \"next week\" : `${n} week${n > 1 ? \"s\" : \"\"}`,\n hour: (n) => `${n} hour${n > 1 ? \"s\" : \"\"}`,\n minute: (n) => `${n} minute${n > 1 ? \"s\" : \"\"}`,\n second: (n) => `${n} second${n > 1 ? \"s\" : \"\"}`,\n invalid: \"\"\n};\nfunction DEFAULT_FORMATTER(date) {\n return date.toISOString().slice(0, 10);\n}\nfunction useTimeAgo(time, options = {}) {\n const {\n controls: exposeControls = false,\n updateInterval = 3e4\n } = options;\n const { now, ...controls } = useNow({ interval: updateInterval, controls: true });\n const timeAgo = computed(() => formatTimeAgo(new Date(toValue(time)), options, toValue(now)));\n if (exposeControls) {\n return {\n timeAgo,\n ...controls\n };\n } else {\n return timeAgo;\n }\n}\nfunction formatTimeAgo(from, options = {}, now = Date.now()) {\n var _a;\n const {\n max,\n messages = DEFAULT_MESSAGES,\n fullDateFormatter = DEFAULT_FORMATTER,\n units = DEFAULT_UNITS,\n showSecond = false,\n rounding = \"round\"\n } = options;\n const roundFn = typeof rounding === \"number\" ? (n) => +n.toFixed(rounding) : Math[rounding];\n const diff = +now - +from;\n const absDiff = Math.abs(diff);\n function getValue(diff2, unit) {\n return roundFn(Math.abs(diff2) / unit.value);\n }\n function format(diff2, unit) {\n const val = getValue(diff2, unit);\n const past = diff2 > 0;\n const str = applyFormat(unit.name, val, past);\n return applyFormat(past ? \"past\" : \"future\", str, past);\n }\n function applyFormat(name, val, isPast) {\n const formatter = messages[name];\n if (typeof formatter === \"function\")\n return formatter(val, isPast);\n return formatter.replace(\"{0}\", val.toString());\n }\n if (absDiff < 6e4 && !showSecond)\n return messages.justNow;\n if (typeof max === \"number\" && absDiff > max)\n return fullDateFormatter(new Date(from));\n if (typeof max === \"string\") {\n const unitMax = (_a = units.find((i) => i.name === max)) == null ? void 0 : _a.max;\n if (unitMax && absDiff > unitMax)\n return fullDateFormatter(new Date(from));\n }\n for (const [idx, unit] of units.entries()) {\n const val = getValue(diff, unit);\n if (val <= 0 && units[idx - 1])\n return format(diff, units[idx - 1]);\n if (absDiff < unit.max)\n return format(diff, unit);\n }\n return messages.invalid;\n}\n\nfunction useTimeoutPoll(fn, interval, timeoutPollOptions) {\n const { start } = useTimeoutFn(loop, interval, { immediate: false });\n const isActive = ref(false);\n async function loop() {\n if (!isActive.value)\n return;\n await fn();\n start();\n }\n function resume() {\n if (!isActive.value) {\n isActive.value = true;\n loop();\n }\n }\n function pause() {\n isActive.value = false;\n }\n if (timeoutPollOptions == null ? void 0 : timeoutPollOptions.immediate)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nfunction useTimestamp(options = {}) {\n const {\n controls: exposeControls = false,\n offset = 0,\n immediate = true,\n interval = \"requestAnimationFrame\",\n callback\n } = options;\n const ts = ref(timestamp() + offset);\n const update = () => ts.value = timestamp() + offset;\n const cb = callback ? () => {\n update();\n callback(ts.value);\n } : update;\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });\n if (exposeControls) {\n return {\n timestamp: ts,\n ...controls\n };\n } else {\n return ts;\n }\n}\n\nfunction useTitle(newTitle = null, options = {}) {\n var _a, _b, _c;\n const {\n document = defaultDocument,\n restoreOnUnmount = (t) => t\n } = options;\n const originalTitle = (_a = document == null ? void 0 : document.title) != null ? _a : \"\";\n const title = toRef((_b = newTitle != null ? newTitle : document == null ? void 0 : document.title) != null ? _b : null);\n const isReadonly = newTitle && typeof newTitle === \"function\";\n function format(t) {\n if (!(\"titleTemplate\" in options))\n return t;\n const template = options.titleTemplate || \"%s\";\n return typeof template === \"function\" ? template(t) : toValue(template).replace(/%s/g, t);\n }\n watch(\n title,\n (t, o) => {\n if (t !== o && document)\n document.title = format(typeof t === \"string\" ? t : \"\");\n },\n { immediate: true }\n );\n if (options.observe && !options.titleTemplate && document && !isReadonly) {\n useMutationObserver(\n (_c = document.head) == null ? void 0 : _c.querySelector(\"title\"),\n () => {\n if (document && document.title !== title.value)\n title.value = format(document.title);\n },\n { childList: true }\n );\n }\n tryOnBeforeUnmount(() => {\n if (restoreOnUnmount) {\n const restoredTitle = restoreOnUnmount(originalTitle, title.value || \"\");\n if (restoredTitle != null && document)\n document.title = restoredTitle;\n }\n });\n return title;\n}\n\nconst _TransitionPresets = {\n easeInSine: [0.12, 0, 0.39, 0],\n easeOutSine: [0.61, 1, 0.88, 1],\n easeInOutSine: [0.37, 0, 0.63, 1],\n easeInQuad: [0.11, 0, 0.5, 0],\n easeOutQuad: [0.5, 1, 0.89, 1],\n easeInOutQuad: [0.45, 0, 0.55, 1],\n easeInCubic: [0.32, 0, 0.67, 0],\n easeOutCubic: [0.33, 1, 0.68, 1],\n easeInOutCubic: [0.65, 0, 0.35, 1],\n easeInQuart: [0.5, 0, 0.75, 0],\n easeOutQuart: [0.25, 1, 0.5, 1],\n easeInOutQuart: [0.76, 0, 0.24, 1],\n easeInQuint: [0.64, 0, 0.78, 0],\n easeOutQuint: [0.22, 1, 0.36, 1],\n easeInOutQuint: [0.83, 0, 0.17, 1],\n easeInExpo: [0.7, 0, 0.84, 0],\n easeOutExpo: [0.16, 1, 0.3, 1],\n easeInOutExpo: [0.87, 0, 0.13, 1],\n easeInCirc: [0.55, 0, 1, 0.45],\n easeOutCirc: [0, 0.55, 0.45, 1],\n easeInOutCirc: [0.85, 0, 0.15, 1],\n easeInBack: [0.36, 0, 0.66, -0.56],\n easeOutBack: [0.34, 1.56, 0.64, 1],\n easeInOutBack: [0.68, -0.6, 0.32, 1.6]\n};\nconst TransitionPresets = /* @__PURE__ */ Object.assign({}, { linear: identity }, _TransitionPresets);\nfunction createEasingFunction([p0, p1, p2, p3]) {\n const a = (a1, a2) => 1 - 3 * a2 + 3 * a1;\n const b = (a1, a2) => 3 * a2 - 6 * a1;\n const c = (a1) => 3 * a1;\n const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t;\n const getSlope = (t, a1, a2) => 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1);\n const getTforX = (x) => {\n let aGuessT = x;\n for (let i = 0; i < 4; ++i) {\n const currentSlope = getSlope(aGuessT, p0, p2);\n if (currentSlope === 0)\n return aGuessT;\n const currentX = calcBezier(aGuessT, p0, p2) - x;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n };\n return (x) => p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3);\n}\nfunction lerp(a, b, alpha) {\n return a + alpha * (b - a);\n}\nfunction toVec(t) {\n return (typeof t === \"number\" ? [t] : t) || [];\n}\nfunction executeTransition(source, from, to, options = {}) {\n var _a, _b;\n const fromVal = toValue(from);\n const toVal = toValue(to);\n const v1 = toVec(fromVal);\n const v2 = toVec(toVal);\n const duration = (_a = toValue(options.duration)) != null ? _a : 1e3;\n const startedAt = Date.now();\n const endAt = Date.now() + duration;\n const trans = typeof options.transition === \"function\" ? options.transition : (_b = toValue(options.transition)) != null ? _b : identity;\n const ease = typeof trans === \"function\" ? trans : createEasingFunction(trans);\n return new Promise((resolve) => {\n source.value = fromVal;\n const tick = () => {\n var _a2;\n if ((_a2 = options.abort) == null ? void 0 : _a2.call(options)) {\n resolve();\n return;\n }\n const now = Date.now();\n const alpha = ease((now - startedAt) / duration);\n const arr = toVec(source.value).map((n, i) => lerp(v1[i], v2[i], alpha));\n if (Array.isArray(source.value))\n source.value = arr.map((n, i) => {\n var _a3, _b2;\n return lerp((_a3 = v1[i]) != null ? _a3 : 0, (_b2 = v2[i]) != null ? _b2 : 0, alpha);\n });\n else if (typeof source.value === \"number\")\n source.value = arr[0];\n if (now < endAt) {\n requestAnimationFrame(tick);\n } else {\n source.value = toVal;\n resolve();\n }\n };\n tick();\n });\n}\nfunction useTransition(source, options = {}) {\n let currentId = 0;\n const sourceVal = () => {\n const v = toValue(source);\n return typeof v === \"number\" ? v : v.map(toValue);\n };\n const outputRef = ref(sourceVal());\n watch(sourceVal, async (to) => {\n var _a, _b;\n if (toValue(options.disabled))\n return;\n const id = ++currentId;\n if (options.delay)\n await promiseTimeout(toValue(options.delay));\n if (id !== currentId)\n return;\n const toVal = Array.isArray(to) ? to.map(toValue) : toValue(to);\n (_a = options.onStarted) == null ? void 0 : _a.call(options);\n await executeTransition(outputRef, outputRef.value, toVal, {\n ...options,\n abort: () => {\n var _a2;\n return id !== currentId || ((_a2 = options.abort) == null ? void 0 : _a2.call(options));\n }\n });\n (_b = options.onFinished) == null ? void 0 : _b.call(options);\n }, { deep: true });\n watch(() => toValue(options.disabled), (disabled) => {\n if (disabled) {\n currentId++;\n outputRef.value = sourceVal();\n }\n });\n tryOnScopeDispose(() => {\n currentId++;\n });\n return computed(() => toValue(options.disabled) ? sourceVal() : outputRef.value);\n}\n\nfunction useUrlSearchParams(mode = \"history\", options = {}) {\n const {\n initialValue = {},\n removeNullishValues = true,\n removeFalsyValues = false,\n write: enableWrite = true,\n window = defaultWindow\n } = options;\n if (!window)\n return reactive(initialValue);\n const state = reactive({});\n function getRawParams() {\n if (mode === \"history\") {\n return window.location.search || \"\";\n } else if (mode === \"hash\") {\n const hash = window.location.hash || \"\";\n const index = hash.indexOf(\"?\");\n return index > 0 ? hash.slice(index) : \"\";\n } else {\n return (window.location.hash || \"\").replace(/^#/, \"\");\n }\n }\n function constructQuery(params) {\n const stringified = params.toString();\n if (mode === \"history\")\n return `${stringified ? `?${stringified}` : \"\"}${window.location.hash || \"\"}`;\n if (mode === \"hash-params\")\n return `${window.location.search || \"\"}${stringified ? `#${stringified}` : \"\"}`;\n const hash = window.location.hash || \"#\";\n const index = hash.indexOf(\"?\");\n if (index > 0)\n return `${hash.slice(0, index)}${stringified ? `?${stringified}` : \"\"}`;\n return `${hash}${stringified ? `?${stringified}` : \"\"}`;\n }\n function read() {\n return new URLSearchParams(getRawParams());\n }\n function updateState(params) {\n const unusedKeys = new Set(Object.keys(state));\n for (const key of params.keys()) {\n const paramsForKey = params.getAll(key);\n state[key] = paramsForKey.length > 1 ? paramsForKey : params.get(key) || \"\";\n unusedKeys.delete(key);\n }\n Array.from(unusedKeys).forEach((key) => delete state[key]);\n }\n const { pause, resume } = pausableWatch(\n state,\n () => {\n const params = new URLSearchParams(\"\");\n Object.keys(state).forEach((key) => {\n const mapEntry = state[key];\n if (Array.isArray(mapEntry))\n mapEntry.forEach((value) => params.append(key, value));\n else if (removeNullishValues && mapEntry == null)\n params.delete(key);\n else if (removeFalsyValues && !mapEntry)\n params.delete(key);\n else\n params.set(key, mapEntry);\n });\n write(params);\n },\n { deep: true }\n );\n function write(params, shouldUpdate) {\n pause();\n if (shouldUpdate)\n updateState(params);\n window.history.replaceState(\n window.history.state,\n window.document.title,\n window.location.pathname + constructQuery(params)\n );\n resume();\n }\n function onChanged() {\n if (!enableWrite)\n return;\n write(read(), true);\n }\n useEventListener(window, \"popstate\", onChanged, false);\n if (mode !== \"history\")\n useEventListener(window, \"hashchange\", onChanged, false);\n const initial = read();\n if (initial.keys().next().value)\n updateState(initial);\n else\n Object.assign(state, initialValue);\n return state;\n}\n\nfunction useUserMedia(options = {}) {\n var _a, _b;\n const enabled = ref((_a = options.enabled) != null ? _a : false);\n const autoSwitch = ref((_b = options.autoSwitch) != null ? _b : true);\n const constraints = ref(options.constraints);\n const { navigator = defaultNavigator } = options;\n const isSupported = useSupported(() => {\n var _a2;\n return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getUserMedia;\n });\n const stream = shallowRef();\n function getDeviceOptions(type) {\n switch (type) {\n case \"video\": {\n if (constraints.value)\n return constraints.value.video || false;\n break;\n }\n case \"audio\": {\n if (constraints.value)\n return constraints.value.audio || false;\n break;\n }\n }\n }\n async function _start() {\n if (!isSupported.value || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getUserMedia({\n video: getDeviceOptions(\"video\"),\n audio: getDeviceOptions(\"audio\")\n });\n return stream.value;\n }\n function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n async function restart() {\n _stop();\n return await start();\n }\n watch(\n enabled,\n (v) => {\n if (v)\n _start();\n else _stop();\n },\n { immediate: true }\n );\n watch(\n constraints,\n () => {\n if (autoSwitch.value && stream.value)\n restart();\n },\n { immediate: true }\n );\n tryOnScopeDispose(() => {\n stop();\n });\n return {\n isSupported,\n stream,\n start,\n stop,\n restart,\n constraints,\n enabled,\n autoSwitch\n };\n}\n\nfunction useVModel(props, key, emit, options = {}) {\n var _a, _b, _c, _d, _e;\n const {\n clone = false,\n passive = false,\n eventName,\n deep = false,\n defaultValue,\n shouldEmit\n } = options;\n const vm = getCurrentInstance();\n const _emit = emit || (vm == null ? void 0 : vm.emit) || ((_a = vm == null ? void 0 : vm.$emit) == null ? void 0 : _a.bind(vm)) || ((_c = (_b = vm == null ? void 0 : vm.proxy) == null ? void 0 : _b.$emit) == null ? void 0 : _c.bind(vm == null ? void 0 : vm.proxy));\n let event = eventName;\n if (!key) {\n if (isVue2) {\n const modelOptions = (_e = (_d = vm == null ? void 0 : vm.proxy) == null ? void 0 : _d.$options) == null ? void 0 : _e.model;\n key = (modelOptions == null ? void 0 : modelOptions.value) || \"value\";\n if (!eventName)\n event = (modelOptions == null ? void 0 : modelOptions.event) || \"input\";\n } else {\n key = \"modelValue\";\n }\n }\n event = event || `update:${key.toString()}`;\n const cloneFn = (val) => !clone ? val : typeof clone === \"function\" ? clone(val) : cloneFnJSON(val);\n const getValue = () => isDef(props[key]) ? cloneFn(props[key]) : defaultValue;\n const triggerEmit = (value) => {\n if (shouldEmit) {\n if (shouldEmit(value))\n _emit(event, value);\n } else {\n _emit(event, value);\n }\n };\n if (passive) {\n const initialValue = getValue();\n const proxy = ref(initialValue);\n let isUpdating = false;\n watch(\n () => props[key],\n (v) => {\n if (!isUpdating) {\n isUpdating = true;\n proxy.value = cloneFn(v);\n nextTick(() => isUpdating = false);\n }\n }\n );\n watch(\n proxy,\n (v) => {\n if (!isUpdating && (v !== props[key] || deep))\n triggerEmit(v);\n },\n { deep }\n );\n return proxy;\n } else {\n return computed({\n get() {\n return getValue();\n },\n set(value) {\n triggerEmit(value);\n }\n });\n }\n}\n\nfunction useVModels(props, emit, options = {}) {\n const ret = {};\n for (const key in props) {\n ret[key] = useVModel(\n props,\n key,\n emit,\n options\n );\n }\n return ret;\n}\n\nfunction useVibrate(options) {\n const {\n pattern = [],\n interval = 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = useSupported(() => typeof navigator !== \"undefined\" && \"vibrate\" in navigator);\n const patternRef = toRef(pattern);\n let intervalControls;\n const vibrate = (pattern2 = patternRef.value) => {\n if (isSupported.value)\n navigator.vibrate(pattern2);\n };\n const stop = () => {\n if (isSupported.value)\n navigator.vibrate(0);\n intervalControls == null ? void 0 : intervalControls.pause();\n };\n if (interval > 0) {\n intervalControls = useIntervalFn(\n vibrate,\n interval,\n {\n immediate: false,\n immediateCallback: false\n }\n );\n }\n return {\n isSupported,\n pattern,\n intervalControls,\n vibrate,\n stop\n };\n}\n\nfunction useVirtualList(list, options) {\n const { containerStyle, wrapperProps, scrollTo, calculateRange, currentList, containerRef } = \"itemHeight\" in options ? useVerticalVirtualList(options, list) : useHorizontalVirtualList(options, list);\n return {\n list: currentList,\n scrollTo,\n containerProps: {\n ref: containerRef,\n onScroll: () => {\n calculateRange();\n },\n style: containerStyle\n },\n wrapperProps\n };\n}\nfunction useVirtualListResources(list) {\n const containerRef = ref(null);\n const size = useElementSize(containerRef);\n const currentList = ref([]);\n const source = shallowRef(list);\n const state = ref({ start: 0, end: 10 });\n return { state, source, currentList, size, containerRef };\n}\nfunction createGetViewCapacity(state, source, itemSize) {\n return (containerSize) => {\n if (typeof itemSize === \"number\")\n return Math.ceil(containerSize / itemSize);\n const { start = 0 } = state.value;\n let sum = 0;\n let capacity = 0;\n for (let i = start; i < source.value.length; i++) {\n const size = itemSize(i);\n sum += size;\n capacity = i;\n if (sum > containerSize)\n break;\n }\n return capacity - start;\n };\n}\nfunction createGetOffset(source, itemSize) {\n return (scrollDirection) => {\n if (typeof itemSize === \"number\")\n return Math.floor(scrollDirection / itemSize) + 1;\n let sum = 0;\n let offset = 0;\n for (let i = 0; i < source.value.length; i++) {\n const size = itemSize(i);\n sum += size;\n if (sum >= scrollDirection) {\n offset = i;\n break;\n }\n }\n return offset + 1;\n };\n}\nfunction createCalculateRange(type, overscan, getOffset, getViewCapacity, { containerRef, state, currentList, source }) {\n return () => {\n const element = containerRef.value;\n if (element) {\n const offset = getOffset(type === \"vertical\" ? element.scrollTop : element.scrollLeft);\n const viewCapacity = getViewCapacity(type === \"vertical\" ? element.clientHeight : element.clientWidth);\n const from = offset - overscan;\n const to = offset + viewCapacity + overscan;\n state.value = {\n start: from < 0 ? 0 : from,\n end: to > source.value.length ? source.value.length : to\n };\n currentList.value = source.value.slice(state.value.start, state.value.end).map((ele, index) => ({\n data: ele,\n index: index + state.value.start\n }));\n }\n };\n}\nfunction createGetDistance(itemSize, source) {\n return (index) => {\n if (typeof itemSize === \"number\") {\n const size2 = index * itemSize;\n return size2;\n }\n const size = source.value.slice(0, index).reduce((sum, _, i) => sum + itemSize(i), 0);\n return size;\n };\n}\nfunction useWatchForSizes(size, list, containerRef, calculateRange) {\n watch([size.width, size.height, list, containerRef], () => {\n calculateRange();\n });\n}\nfunction createComputedTotalSize(itemSize, source) {\n return computed(() => {\n if (typeof itemSize === \"number\")\n return source.value.length * itemSize;\n return source.value.reduce((sum, _, index) => sum + itemSize(index), 0);\n });\n}\nconst scrollToDictionaryForElementScrollKey = {\n horizontal: \"scrollLeft\",\n vertical: \"scrollTop\"\n};\nfunction createScrollTo(type, calculateRange, getDistance, containerRef) {\n return (index) => {\n if (containerRef.value) {\n containerRef.value[scrollToDictionaryForElementScrollKey[type]] = getDistance(index);\n calculateRange();\n }\n };\n}\nfunction useHorizontalVirtualList(options, list) {\n const resources = useVirtualListResources(list);\n const { state, source, currentList, size, containerRef } = resources;\n const containerStyle = { overflowX: \"auto\" };\n const { itemWidth, overscan = 5 } = options;\n const getViewCapacity = createGetViewCapacity(state, source, itemWidth);\n const getOffset = createGetOffset(source, itemWidth);\n const calculateRange = createCalculateRange(\"horizontal\", overscan, getOffset, getViewCapacity, resources);\n const getDistanceLeft = createGetDistance(itemWidth, source);\n const offsetLeft = computed(() => getDistanceLeft(state.value.start));\n const totalWidth = createComputedTotalSize(itemWidth, source);\n useWatchForSizes(size, list, containerRef, calculateRange);\n const scrollTo = createScrollTo(\"horizontal\", calculateRange, getDistanceLeft, containerRef);\n const wrapperProps = computed(() => {\n return {\n style: {\n height: \"100%\",\n width: `${totalWidth.value - offsetLeft.value}px`,\n marginLeft: `${offsetLeft.value}px`,\n display: \"flex\"\n }\n };\n });\n return {\n scrollTo,\n calculateRange,\n wrapperProps,\n containerStyle,\n currentList,\n containerRef\n };\n}\nfunction useVerticalVirtualList(options, list) {\n const resources = useVirtualListResources(list);\n const { state, source, currentList, size, containerRef } = resources;\n const containerStyle = { overflowY: \"auto\" };\n const { itemHeight, overscan = 5 } = options;\n const getViewCapacity = createGetViewCapacity(state, source, itemHeight);\n const getOffset = createGetOffset(source, itemHeight);\n const calculateRange = createCalculateRange(\"vertical\", overscan, getOffset, getViewCapacity, resources);\n const getDistanceTop = createGetDistance(itemHeight, source);\n const offsetTop = computed(() => getDistanceTop(state.value.start));\n const totalHeight = createComputedTotalSize(itemHeight, source);\n useWatchForSizes(size, list, containerRef, calculateRange);\n const scrollTo = createScrollTo(\"vertical\", calculateRange, getDistanceTop, containerRef);\n const wrapperProps = computed(() => {\n return {\n style: {\n width: \"100%\",\n height: `${totalHeight.value - offsetTop.value}px`,\n marginTop: `${offsetTop.value}px`\n }\n };\n });\n return {\n calculateRange,\n scrollTo,\n containerStyle,\n wrapperProps,\n currentList,\n containerRef\n };\n}\n\nfunction useWakeLock(options = {}) {\n const {\n navigator = defaultNavigator,\n document = defaultDocument\n } = options;\n let wakeLock;\n const isSupported = useSupported(() => navigator && \"wakeLock\" in navigator);\n const isActive = ref(false);\n async function onVisibilityChange() {\n if (!isSupported.value || !wakeLock)\n return;\n if (document && document.visibilityState === \"visible\")\n wakeLock = await navigator.wakeLock.request(\"screen\");\n isActive.value = !wakeLock.released;\n }\n if (document)\n useEventListener(document, \"visibilitychange\", onVisibilityChange, { passive: true });\n async function request(type) {\n if (!isSupported.value)\n return;\n wakeLock = await navigator.wakeLock.request(type);\n isActive.value = !wakeLock.released;\n }\n async function release() {\n if (!isSupported.value || !wakeLock)\n return;\n await wakeLock.release();\n isActive.value = !wakeLock.released;\n wakeLock = null;\n }\n return {\n isSupported,\n isActive,\n request,\n release\n };\n}\n\nfunction useWebNotification(options = {}) {\n const {\n window = defaultWindow,\n requestPermissions: _requestForPermissions = true\n } = options;\n const defaultWebNotificationOptions = options;\n const isSupported = useSupported(() => {\n if (!window || !(\"Notification\" in window))\n return false;\n try {\n new Notification(\"\");\n } catch (e) {\n return false;\n }\n return true;\n });\n const permissionGranted = ref(isSupported.value && \"permission\" in Notification && Notification.permission === \"granted\");\n const notification = ref(null);\n const ensurePermissions = async () => {\n if (!isSupported.value)\n return;\n if (!permissionGranted.value && Notification.permission !== \"denied\") {\n const result = await Notification.requestPermission();\n if (result === \"granted\")\n permissionGranted.value = true;\n }\n return permissionGranted.value;\n };\n const { on: onClick, trigger: clickTrigger } = createEventHook();\n const { on: onShow, trigger: showTrigger } = createEventHook();\n const { on: onError, trigger: errorTrigger } = createEventHook();\n const { on: onClose, trigger: closeTrigger } = createEventHook();\n const show = async (overrides) => {\n if (!isSupported.value || !permissionGranted.value)\n return;\n const options2 = Object.assign({}, defaultWebNotificationOptions, overrides);\n notification.value = new Notification(options2.title || \"\", options2);\n notification.value.onclick = clickTrigger;\n notification.value.onshow = showTrigger;\n notification.value.onerror = errorTrigger;\n notification.value.onclose = closeTrigger;\n return notification.value;\n };\n const close = () => {\n if (notification.value)\n notification.value.close();\n notification.value = null;\n };\n if (_requestForPermissions)\n tryOnMounted(ensurePermissions);\n tryOnScopeDispose(close);\n if (isSupported.value && window) {\n const document = window.document;\n useEventListener(document, \"visibilitychange\", (e) => {\n e.preventDefault();\n if (document.visibilityState === \"visible\") {\n close();\n }\n });\n }\n return {\n isSupported,\n notification,\n ensurePermissions,\n permissionGranted,\n show,\n close,\n onClick,\n onShow,\n onError,\n onClose\n };\n}\n\nconst DEFAULT_PING_MESSAGE = \"ping\";\nfunction resolveNestedOptions(options) {\n if (options === true)\n return {};\n return options;\n}\nfunction useWebSocket(url, options = {}) {\n const {\n onConnected,\n onDisconnected,\n onError,\n onMessage,\n immediate = true,\n autoClose = true,\n protocols = []\n } = options;\n const data = ref(null);\n const status = ref(\"CLOSED\");\n const wsRef = ref();\n const urlRef = toRef(url);\n let heartbeatPause;\n let heartbeatResume;\n let explicitlyClosed = false;\n let retried = 0;\n let bufferedData = [];\n let pongTimeoutWait;\n const _sendBuffer = () => {\n if (bufferedData.length && wsRef.value && status.value === \"OPEN\") {\n for (const buffer of bufferedData)\n wsRef.value.send(buffer);\n bufferedData = [];\n }\n };\n const resetHeartbeat = () => {\n clearTimeout(pongTimeoutWait);\n pongTimeoutWait = void 0;\n };\n const close = (code = 1e3, reason) => {\n if (!isClient || !wsRef.value)\n return;\n explicitlyClosed = true;\n resetHeartbeat();\n heartbeatPause == null ? void 0 : heartbeatPause();\n wsRef.value.close(code, reason);\n wsRef.value = void 0;\n };\n const send = (data2, useBuffer = true) => {\n if (!wsRef.value || status.value !== \"OPEN\") {\n if (useBuffer)\n bufferedData.push(data2);\n return false;\n }\n _sendBuffer();\n wsRef.value.send(data2);\n return true;\n };\n const _init = () => {\n if (explicitlyClosed || typeof urlRef.value === \"undefined\")\n return;\n const ws = new WebSocket(urlRef.value, protocols);\n wsRef.value = ws;\n status.value = \"CONNECTING\";\n ws.onopen = () => {\n status.value = \"OPEN\";\n onConnected == null ? void 0 : onConnected(ws);\n heartbeatResume == null ? void 0 : heartbeatResume();\n _sendBuffer();\n };\n ws.onclose = (ev) => {\n status.value = \"CLOSED\";\n onDisconnected == null ? void 0 : onDisconnected(ws, ev);\n if (!explicitlyClosed && options.autoReconnect) {\n const {\n retries = -1,\n delay = 1e3,\n onFailed\n } = resolveNestedOptions(options.autoReconnect);\n retried += 1;\n if (typeof retries === \"number\" && (retries < 0 || retried < retries))\n setTimeout(_init, delay);\n else if (typeof retries === \"function\" && retries())\n setTimeout(_init, delay);\n else\n onFailed == null ? void 0 : onFailed();\n }\n };\n ws.onerror = (e) => {\n onError == null ? void 0 : onError(ws, e);\n };\n ws.onmessage = (e) => {\n if (options.heartbeat) {\n resetHeartbeat();\n const {\n message = DEFAULT_PING_MESSAGE\n } = resolveNestedOptions(options.heartbeat);\n if (e.data === message)\n return;\n }\n data.value = e.data;\n onMessage == null ? void 0 : onMessage(ws, e);\n };\n };\n if (options.heartbeat) {\n const {\n message = DEFAULT_PING_MESSAGE,\n interval = 1e3,\n pongTimeout = 1e3\n } = resolveNestedOptions(options.heartbeat);\n const { pause, resume } = useIntervalFn(\n () => {\n send(message, false);\n if (pongTimeoutWait != null)\n return;\n pongTimeoutWait = setTimeout(() => {\n close();\n explicitlyClosed = false;\n }, pongTimeout);\n },\n interval,\n { immediate: false }\n );\n heartbeatPause = pause;\n heartbeatResume = resume;\n }\n if (autoClose) {\n if (isClient)\n useEventListener(\"beforeunload\", () => close());\n tryOnScopeDispose(close);\n }\n const open = () => {\n if (!isClient && !isWorker)\n return;\n close();\n explicitlyClosed = false;\n retried = 0;\n _init();\n };\n if (immediate)\n open();\n watch(urlRef, open);\n return {\n data,\n status,\n close,\n send,\n open,\n ws: wsRef\n };\n}\n\nfunction useWebWorker(arg0, workerOptions, options) {\n const {\n window = defaultWindow\n } = options != null ? options : {};\n const data = ref(null);\n const worker = shallowRef();\n const post = (...args) => {\n if (!worker.value)\n return;\n worker.value.postMessage(...args);\n };\n const terminate = function terminate2() {\n if (!worker.value)\n return;\n worker.value.terminate();\n };\n if (window) {\n if (typeof arg0 === \"string\")\n worker.value = new Worker(arg0, workerOptions);\n else if (typeof arg0 === \"function\")\n worker.value = arg0();\n else\n worker.value = arg0;\n worker.value.onmessage = (e) => {\n data.value = e.data;\n };\n tryOnScopeDispose(() => {\n if (worker.value)\n worker.value.terminate();\n });\n }\n return {\n data,\n post,\n terminate,\n worker\n };\n}\n\nfunction jobRunner(userFunc) {\n return (e) => {\n const userFuncArgs = e.data[0];\n return Promise.resolve(userFunc.apply(void 0, userFuncArgs)).then((result) => {\n postMessage([\"SUCCESS\", result]);\n }).catch((error) => {\n postMessage([\"ERROR\", error]);\n });\n };\n}\n\nfunction depsParser(deps, localDeps) {\n if (deps.length === 0 && localDeps.length === 0)\n return \"\";\n const depsString = deps.map((dep) => `'${dep}'`).toString();\n const depsFunctionString = localDeps.filter((dep) => typeof dep === \"function\").map((fn) => {\n const str = fn.toString();\n if (str.trim().startsWith(\"function\")) {\n return str;\n } else {\n const name = fn.name;\n return `const ${name} = ${str}`;\n }\n }).join(\";\");\n const importString = `importScripts(${depsString});`;\n return `${depsString.trim() === \"\" ? \"\" : importString} ${depsFunctionString}`;\n}\n\nfunction createWorkerBlobUrl(fn, deps, localDeps) {\n const blobCode = `${depsParser(deps, localDeps)}; onmessage=(${jobRunner})(${fn})`;\n const blob = new Blob([blobCode], { type: \"text/javascript\" });\n const url = URL.createObjectURL(blob);\n return url;\n}\n\nfunction useWebWorkerFn(fn, options = {}) {\n const {\n dependencies = [],\n localDependencies = [],\n timeout,\n window = defaultWindow\n } = options;\n const worker = ref();\n const workerStatus = ref(\"PENDING\");\n const promise = ref({});\n const timeoutId = ref();\n const workerTerminate = (status = \"PENDING\") => {\n if (worker.value && worker.value._url && window) {\n worker.value.terminate();\n URL.revokeObjectURL(worker.value._url);\n promise.value = {};\n worker.value = void 0;\n window.clearTimeout(timeoutId.value);\n workerStatus.value = status;\n }\n };\n workerTerminate();\n tryOnScopeDispose(workerTerminate);\n const generateWorker = () => {\n const blobUrl = createWorkerBlobUrl(fn, dependencies, localDependencies);\n const newWorker = new Worker(blobUrl);\n newWorker._url = blobUrl;\n newWorker.onmessage = (e) => {\n const { resolve = () => {\n }, reject = () => {\n } } = promise.value;\n const [status, result] = e.data;\n switch (status) {\n case \"SUCCESS\":\n resolve(result);\n workerTerminate(status);\n break;\n default:\n reject(result);\n workerTerminate(\"ERROR\");\n break;\n }\n };\n newWorker.onerror = (e) => {\n const { reject = () => {\n } } = promise.value;\n e.preventDefault();\n reject(e);\n workerTerminate(\"ERROR\");\n };\n if (timeout) {\n timeoutId.value = setTimeout(\n () => workerTerminate(\"TIMEOUT_EXPIRED\"),\n timeout\n );\n }\n return newWorker;\n };\n const callWorker = (...fnArgs) => new Promise((resolve, reject) => {\n promise.value = {\n resolve,\n reject\n };\n worker.value && worker.value.postMessage([[...fnArgs]]);\n workerStatus.value = \"RUNNING\";\n });\n const workerFn = (...fnArgs) => {\n if (workerStatus.value === \"RUNNING\") {\n console.error(\n \"[useWebWorkerFn] You can only run one instance of the worker at a time.\"\n );\n return Promise.reject();\n }\n worker.value = generateWorker();\n return callWorker(...fnArgs);\n };\n return {\n workerFn,\n workerStatus,\n workerTerminate\n };\n}\n\nfunction useWindowFocus(options = {}) {\n const { window = defaultWindow } = options;\n if (!window)\n return ref(false);\n const focused = ref(window.document.hasFocus());\n useEventListener(window, \"blur\", () => {\n focused.value = false;\n });\n useEventListener(window, \"focus\", () => {\n focused.value = true;\n });\n return focused;\n}\n\nfunction useWindowScroll(options = {}) {\n const { window = defaultWindow, behavior = \"auto\" } = options;\n if (!window) {\n return {\n x: ref(0),\n y: ref(0)\n };\n }\n const internalX = ref(window.scrollX);\n const internalY = ref(window.scrollY);\n const x = computed({\n get() {\n return internalX.value;\n },\n set(x2) {\n scrollTo({ left: x2, behavior });\n }\n });\n const y = computed({\n get() {\n return internalY.value;\n },\n set(y2) {\n scrollTo({ top: y2, behavior });\n }\n });\n useEventListener(\n window,\n \"scroll\",\n () => {\n internalX.value = window.scrollX;\n internalY.value = window.scrollY;\n },\n {\n capture: false,\n passive: true\n }\n );\n return { x, y };\n}\n\nfunction useWindowSize(options = {}) {\n const {\n window = defaultWindow,\n initialWidth = Number.POSITIVE_INFINITY,\n initialHeight = Number.POSITIVE_INFINITY,\n listenOrientation = true,\n includeScrollbar = true\n } = options;\n const width = ref(initialWidth);\n const height = ref(initialHeight);\n const update = () => {\n if (window) {\n if (includeScrollbar) {\n width.value = window.innerWidth;\n height.value = window.innerHeight;\n } else {\n width.value = window.document.documentElement.clientWidth;\n height.value = window.document.documentElement.clientHeight;\n }\n }\n };\n update();\n tryOnMounted(update);\n useEventListener(\"resize\", update, { passive: true });\n if (listenOrientation) {\n const matches = useMediaQuery(\"(orientation: portrait)\");\n watch(matches, () => update());\n }\n return { width, height };\n}\n\nexport { DefaultMagicKeysAliasMap, StorageSerializers, TransitionPresets, computedAsync as asyncComputed, breakpointsAntDesign, breakpointsBootstrapV5, breakpointsMasterCss, breakpointsPrimeFlex, breakpointsQuasar, breakpointsSematic, breakpointsTailwind, breakpointsVuetify, breakpointsVuetifyV2, breakpointsVuetifyV3, cloneFnJSON, computedAsync, computedInject, createFetch, createReusableTemplate, createTemplatePromise, createUnrefFn, customStorageEventName, defaultDocument, defaultLocation, defaultNavigator, defaultWindow, executeTransition, formatTimeAgo, getSSRHandler, mapGamepadToXbox360Controller, onClickOutside, onKeyDown, onKeyPressed, onKeyStroke, onKeyUp, onLongPress, onStartTyping, setSSRHandler, templateRef, unrefElement, useActiveElement, useAnimate, useAsyncQueue, useAsyncState, useBase64, useBattery, useBluetooth, useBreakpoints, useBroadcastChannel, useBrowserLocation, useCached, useClipboard, useClipboardItems, useCloned, useColorMode, useConfirmDialog, useCssVar, useCurrentElement, useCycleList, useDark, useDebouncedRefHistory, useDeviceMotion, useDeviceOrientation, useDevicePixelRatio, useDevicesList, useDisplayMedia, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementByPoint, useElementHover, useElementSize, useElementVisibility, useEventBus, useEventListener, useEventSource, useEyeDropper, useFavicon, useFetch, useFileDialog, useFileSystemAccess, useFocus, useFocusWithin, useFps, useFullscreen, useGamepad, useGeolocation, useIdle, useImage, useInfiniteScroll, useIntersectionObserver, useKeyModifier, useLocalStorage, useMagicKeys, useManualRefHistory, useMediaControls, useMediaQuery, useMemoize, useMemory, useMounted, useMouse, useMouseInElement, useMousePressed, useMutationObserver, useNavigatorLanguage, useNetwork, useNow, useObjectUrl, useOffsetPagination, useOnline, usePageLeave, useParallax, useParentElement, usePerformanceObserver, usePermission, usePointer, usePointerLock, usePointerSwipe, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePreferredLanguages, usePreferredReducedMotion, usePrevious, useRafFn, useRefHistory, useResizeObserver, useScreenOrientation, useScreenSafeArea, useScriptTag, useScroll, useScrollLock, useSessionStorage, useShare, useSorted, useSpeechRecognition, useSpeechSynthesis, useStepper, useStorage, useStorageAsync, useStyleTag, useSupported, useSwipe, useTemplateRefsList, useTextDirection, useTextSelection, useTextareaAutosize, useThrottledRefHistory, useTimeAgo, useTimeoutPoll, useTimestamp, useTitle, useTransition, useUrlSearchParams, useUserMedia, useVModel, useVModels, useVibrate, useVirtualList, useWakeLock, useWebNotification, useWebSocket, useWebWorker, useWebWorkerFn, useWindowFocus, useWindowScroll, useWindowSize };\n", "import { createEventHook, type EventHook, type EventHookOff, type EventHookOn } from \"@vueuse/core\";\r\nimport { provide } from \"vue\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\nimport type { GatingState } from \"../types/definitions/gating/gating-state.js\";\r\nimport {\r\n type InjectionValuesRecord,\r\n type InjectionKeysRecord,\r\n CreateInjectionKeysRecord,\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided\r\n} from \"@mcwd/util-vue\";\r\n\r\ntype EventHookFnParams = { eventName: EventName };\r\n\r\nexport type FormEventHooks = {\r\n marketoSetup: EventHook<{ eventName: \"marketoSetup\" }>;\r\n ready: EventHook<{ eventName: \"ready\" }>;\r\n userFirstInteraction: EventHook<{ eventName: \"userFirstInteraction\" }>,\r\n validationErrorOnSubmit: EventHook<{ eventName: \"validationErrorOnSubmit\" }>\r\n marketoValidation: EventHook<{ eventName: \"marketoValidation\"; marketoIsValid: boolean }>;\r\n submit: EventHook<{ eventName: \"submit\" }>;\r\n completed: EventHook<{\r\n eventName: \"completed\";\r\n gatingState: GatingState.MarketoForm;\r\n }>;\r\n modalClosed: EventHook<{\r\n eventName: \"modalClosed\";\r\n }>;\r\n formAbandonment: EventHook<{\r\n eventName: \"formAbandonment\"\r\n }>\r\n};\r\n\r\nexport type FormEventNames = keyof FormEventHooks;\r\n\r\ntype InferEventHook = T extends EventHook ? EventHook : never;\r\n\r\ntype InferEventHookParams =\r\n [InferEventHook] extends [never]\r\n ? never\r\n : (\r\n TFnType extends \"on\"\r\n ? Parameters[\"on\"]>[0]\r\n : \r\n TFnType extends \"off\"\r\n ? Parameters[\"off\"]>[0]\r\n : never\r\n );\r\n\r\ntype UseMarketoFormEventInjectionValues = InjectionValuesRecord<{\r\n useFormEventsValue: Readonly;\r\n onEvent: (eventName: EventName, callback: InferEventHookParams<\"on\", FormEventHooks[EventName]> ) => ReturnType;\r\n offEvent: (eventName: EventName, callback: InferEventHookParams<\"off\", FormEventHooks[EventName]>) => ReturnType;\r\n}>;\r\n\r\nexport type OnEventFn = UseMarketoFormEventInjectionValues[\"onEvent\"];\r\nexport type OffEventFn = UseMarketoFormEventInjectionValues[\"offEvent\"];\r\n\r\ntype UseMarketoFormEventInjectionKeys = InjectionKeysRecord;\r\n\r\nconst UseMarketoFormEventInjectionKeys = CreateInjectionKeysRecord({\r\n useFormEventsValue: \"useFormEventsValue\",\r\n onEvent: \"onEvent\",\r\n offEvent: \"offEvent\"\r\n});\r\n\r\nexport function initMarketoFormEvents() {\r\n if (checkValuesAlreadyProvided(UseMarketoFormEventInjectionKeys)) {\r\n return;\r\n }\r\n const marketoSetup = createEventHook>();\r\n const ready = createEventHook>();\r\n const userFirstInteraction = createEventHook>();\r\n const validationErrorOnSubmit = createEventHook>();\r\n const marketoValidation = createEventHook & { marketoIsValid: boolean }>();\r\n const submit = createEventHook>();\r\n const completed = createEventHook & { gatingState: GatingState.MarketoForm }>();\r\n const modalClosed = createEventHook>();\r\n const formAbandonment = createEventHook>();\r\n\r\n const formEventHooks: FormEventHooks = Object.freeze({\r\n marketoSetup,\r\n ready,\r\n userFirstInteraction,\r\n validationErrorOnSubmit,\r\n marketoValidation,\r\n submit,\r\n completed,\r\n modalClosed,\r\n formAbandonment\r\n });\r\n \r\n const { logger } = useFormLogger();\r\n\r\n const onEvent: UseMarketoFormEventInjectionValues[ \"onEvent\" ] = (\r\n eventName: EventName,\r\n callback: InferEventHookParams<\"on\", FormEventHooks[ EventName ]>\r\n ): ReturnType =>\r\n {\r\n logger.debug(`Calling onEvent(\"${eventName}\", callback: ${callback.toString()}`);\r\n return formEventHooks[eventName].on(callback as any);\r\n };\r\n\r\n const offEvent: UseMarketoFormEventInjectionValues[ \"offEvent\" ] = (\r\n eventName: EventName,\r\n callback: InferEventHookParams<\"off\", FormEventHooks[ EventName ]>\r\n ) =>\r\n {\r\n logger.debug(`Calling offEvent(\"${eventName}\", callback: ${callback.toString()}`);\r\n return formEventHooks[eventName].off(callback as any);\r\n };\r\n\r\n provide(UseMarketoFormEventInjectionKeys.useFormEventsValue, formEventHooks);\r\n\r\n provide(UseMarketoFormEventInjectionKeys.onEvent, onEvent);\r\n provide(UseMarketoFormEventInjectionKeys.offEvent, offEvent);\r\n}\r\n\r\nexport function useFormEvents({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger();\r\n try {\r\n callerLabel ??= \"useFormEvents\";\r\n const useFormEventsValue = injectRequiredWithSelf(UseMarketoFormEventInjectionKeys.useFormEventsValue);\r\n const onEvent = injectRequiredWithSelf(UseMarketoFormEventInjectionKeys.onEvent);\r\n const offEvent = injectRequiredWithSelf(UseMarketoFormEventInjectionKeys.offEvent);\r\n return Object.freeze({ ...useFormEventsValue, onEvent, offEvent });\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n}", "import { ref, provide, type MaybeRefOrGetter } from 'vue';\r\nimport {\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionValuesRecord,\r\n type InjectionKeysRecord,\r\n injectRequiredWithSelf\r\n} from \"@mcwd/util-vue\";\r\nimport { type Nil } from '@mcwd/typescript-type-guards';\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\n\r\ntype UseEclipseHtmlFormElementInjectionValues = InjectionValuesRecord<{\r\n EclipseHtmlFormElement: MaybeRefOrGetter;\r\n setEclipseHtmlFormElement: (formEl: HTMLFormElement) => void;\r\n}>;\r\n\r\ntype UseEclipseHtmlFormElementInjectionKeys = InjectionKeysRecord;\r\n\r\nconst UseEclipseHtmlFormElementInjectionKeys = CreateInjectionKeysRecord({\r\n EclipseHtmlFormElement: \"EclipseHtmlFormElement\",\r\n setEclipseHtmlFormElement: \"setEclipseHtmlFormElement\"\r\n});\r\n\r\n\r\nexport function initEclipseHtmlFormElement()\r\n{\r\n if (checkValuesAlreadyProvided(UseEclipseHtmlFormElementInjectionKeys)) {\r\n return;\r\n }\r\n const EclipseHtmlFormElement = ref(null);\r\n const setEclipseHtmlFormElement = (formEl: HTMLFormElement) => {\r\n EclipseHtmlFormElement.value = formEl;\r\n };\r\n provide(UseEclipseHtmlFormElementInjectionKeys.EclipseHtmlFormElement, () => EclipseHtmlFormElement.value);\r\n provide(UseEclipseHtmlFormElementInjectionKeys.setEclipseHtmlFormElement, setEclipseHtmlFormElement);\r\n}\r\n\r\nexport const useEclipseHtmlFormElement = ({ callerLabel }: { callerLabel?: string | undefined } = {}) => {\r\n const { logger } = useFormLogger();\r\n try {\r\n const EclipseHtmlFormElement = injectRequiredWithSelf(UseEclipseHtmlFormElementInjectionKeys.EclipseHtmlFormElement);\r\n const setEclipseHtmlFormElement = injectRequiredWithSelf(UseEclipseHtmlFormElementInjectionKeys.setEclipseHtmlFormElement);\r\n return {EclipseHtmlFormElement, setEclipseHtmlFormElement};\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n};", "import type {} from \"jquery\";\r\nimport {\r\n type MaybeRef,\r\n type MaybeRefOrGetter,\r\n type Reactive,\r\n computed,\r\n isReactive,\r\n provide,\r\n reactive,\r\n ref,\r\n toValue,\r\n unref,\r\n watch,\r\n} from \"vue\";\r\n\r\nimport { isAnyHTMLInputElementType, isFunction, isNil, isString, type Nil } from \"@mcwd/typescript-type-guards\";\r\n\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionValuesRecord,\r\n type InjectionKeysRecord,\r\n type MaybeReactive,\r\n type UnwrapReactive\r\n} from \"@mcwd/util-vue\";\r\n //import { logReactiveChanges } from \"@mcwd/util-vue\";\r\n\r\nimport { useActiveElement } from \"@vueuse/core\";\r\nimport { useGatingLevel } from \"./use-gating-level.js\";\r\nimport { useFormEvents } from \"./use-form-events.js\";\r\nimport { useEclipseHtmlFormElement } from \"./use-eclipse-html-form-element.js\";\r\nimport type { ILogger } from \"../../utils/Logger/ILogger.js\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\nimport type { ValidationOutput, ValidatorFn } from \"./use-input-validation.js\";\r\n\r\nconst activeElement = useActiveElement();\r\nexport interface InputState {\r\n inputValue: any;\r\n inputName: string;\r\n required: MaybeRefOrGetter;\r\n active: boolean;\r\n touched: boolean;\r\n done: boolean;\r\n hasError: boolean;\r\n showError: boolean;\r\n isEmpty: boolean;\r\n validationCheck: ValidationOutput;\r\n}\r\nexport type InputStateKey = keyof InputState;\r\n\r\nfunction isActiveElementMatch(formElement: HTMLFormElement, htmlElement: HTMLElement, inputName: string, activeInputVerboseLogger: ILogger) {\r\n if (!isAnyHTMLInputElementType(htmlElement)) {\r\n activeInputVerboseLogger.debug(\"Is not an input element, not an active element match\", { formElement, htmlElement, inputName });\r\n return false;\r\n }\r\n if (!formElement.contains(htmlElement)) {\r\n activeInputVerboseLogger.debug(\"Is not contained in the form element, not an active element match\", { formElement, htmlElement, inputName });\r\n return false;\r\n }\r\n\r\n if (htmlElement.getAttribute(\"data-active-element-match-name\") === inputName) {\r\n activeInputVerboseLogger.debug(\"Is an active element match, data attr matches\", { formElement, htmlElement, inputName });\r\n return true;\r\n }\r\n else if (htmlElement.id === inputName) {\r\n activeInputVerboseLogger.debug(\"Is an active element match, id matches\", { formElement, htmlElement, inputName });\r\n return true;\r\n }\r\n else if (htmlElement.name === inputName) {\r\n activeInputVerboseLogger.debug(\"Is an active element match, name matches\", { formElement, htmlElement, inputName });\r\n return true;\r\n }\r\n else {\r\n activeInputVerboseLogger.debug(\"Is not an active element match, name does not match\", { formElement, htmlElement, inputName });\r\n return false;\r\n }\r\n}\r\n\r\ntype NewInputStateArgs = {\r\n formElement: MaybeRefOrGetter;\r\n formValues: Reactive>;\r\n inputName: TEnabledFormField;\r\n required: MaybeRefOrGetter;\r\n validator?: MaybeRef;\r\n logger: ILogger\r\n};\r\n\r\n\r\nfunction newInputState({\r\n formElement,\r\n formValues,\r\n inputName,\r\n required,\r\n validator,\r\n logger\r\n}: NewInputStateArgs): InputState {\r\n if (isReactive(formValues) === false) {\r\n throw new Error(`formValues is not reactive`);\r\n }\r\n\r\n const inputValue = computed(() => {\r\n return formValues[inputName];\r\n });\r\n\r\n const activeInputVerboseLogger = logger.withTags({ \"verboseDebug\": \"activeInput\" });\r\n const active = computed(() => {\r\n const formEl = toValue(formElement);\r\n if (isNil(activeElement.value) || isNil(formEl)) {\r\n return false;\r\n }\r\n return isActiveElementMatch(formEl, activeElement.value, inputName, activeInputVerboseLogger);\r\n });\r\n\r\n const touched = ref(false);\r\n\r\n watch(\r\n () => active.value,\r\n (isActive) => {\r\n if (isActive) {\r\n touched.value = true;\r\n }\r\n }\r\n );\r\n\r\n watch(\r\n () => inputValue.value,\r\n (value, prevValue) => {\r\n if (value !== prevValue) {\r\n touched.value = true;\r\n }\r\n }\r\n );\r\n\r\n const isEmpty = computed(() => {\r\n return (\r\n isNil(inputValue.value) ||\r\n (isString(inputValue.value) && inputValue.value.trim() === \"\")\r\n );\r\n });\r\n\r\n const hasRequiredError = computed(() => {\r\n return (toValue(required) === true && isEmpty.value);\r\n });\r\n\r\n const validatorFn = unref(validator);\r\n const validationCheck = computed(() => {\r\n if(isFunction(validatorFn)){\r\n const validationResults = validatorFn(inputValue.value);\r\n return validationResults;\r\n }\r\n return { isValid: true };\r\n });\r\n\r\n const hasValidatorError = computed(()=>{\r\n return !validationCheck.value.isValid;\r\n });\r\n\r\n const hasError = computed(() => {\r\n return hasRequiredError.value || hasValidatorError.value;\r\n });\r\n\r\n const errorVisibilityWithoutActiveCheck = computed(() => {\r\n if (hasError.value === false) {\r\n return false;\r\n }\r\n\r\n if(touched.value) {\r\n return true;\r\n } else {\r\n if(!hasValidatorError.value) {\r\n return isEmpty.value === false;\r\n } else {\r\n return false;\r\n }\r\n }\r\n });\r\n\r\n const errorVisibilityForInactiveInput = computed(() => {\r\n if (active.value === true) {\r\n return false;\r\n }\r\n return errorVisibilityWithoutActiveCheck.value;\r\n });\r\n const wasAlreadyDisplayingError = ref(false);\r\n\r\n watch(\r\n () => errorVisibilityForInactiveInput.value,\r\n (currentInactiveVisibility, prevInactiveVisibility) => {\r\n wasAlreadyDisplayingError.value = prevInactiveVisibility;\r\n }\r\n );\r\n\r\n const errorVisibilityForActiveOrInactiveInput = computed(() => {\r\n // If input is active and was already displaying an error, keep displaying it if the error condition still exists\r\n // If the error was not visible before the input became active, don't start showing it now.\r\n if (active.value === true && wasAlreadyDisplayingError.value === true) {\r\n return errorVisibilityWithoutActiveCheck.value;\r\n }\r\n // Otherwise, follow the logic for an inactive input.\r\n else {\r\n return errorVisibilityForInactiveInput.value;\r\n }\r\n });\r\n\r\n const done = computed(() => {\r\n if (hasError.value === false && toValue(required) === false) {\r\n return false;\r\n } else {\r\n return hasError.value === false;\r\n }\r\n });\r\n\r\n // logReactiveChanges(inputValue, \"inputValue\", `${inputName}: `);\r\n // logReactiveChanges(active, \"active\", `${inputName}: `);\r\n // logReactiveChanges(done, \"done\", `${inputName}: `);\r\n // logReactiveChanges(hasError, \"hasError\", `${inputName}: `);\r\n // logReactiveChanges(\r\n // errorVisibilityForActiveOrInactiveInput,\r\n // \"showError\",\r\n // `${inputName}: `\r\n // );\r\n // logReactiveChanges(touched, \"touched\", `${inputName}: `);\r\n return reactive({\r\n inputValue,\r\n inputName,\r\n required,\r\n active,\r\n done,\r\n isEmpty,\r\n hasError,\r\n wasAlreadyDisplayingError,\r\n validationCheck,\r\n hasRequiredError,\r\n errorVisibilityWithoutActiveCheck,\r\n errorVisibilityForInactiveInput,\r\n errorVisibilityForActiveOrInactiveInput,\r\n touched,\r\n showError: errorVisibilityForActiveOrInactiveInput,\r\n });\r\n}\r\n\r\nexport type InputStateOption = {\r\n required: MaybeRefOrGetter;\r\n validator?: MaybeRef; \r\n};\r\n\r\ntype UseInputStateInjectionValues =\r\n InjectionValuesRecord<{\r\n inputStates: Record;\r\n setInputStates(\r\n inputValues: MaybeReactive>,\r\n inputStateOptions: Record\r\n );\r\n watchForFirstUserInteraction(inputStatesObj: Record): void\r\n }>;\r\n\r\ntype UseInputStateInjectionKeys = InjectionKeysRecord>;\r\n\r\nconst UseInputStateInjectionKeys = CreateInjectionKeysRecord({\r\n inputStates: \"inputStates\",\r\n setInputStates: \"setInputStates\",\r\n watchForFirstUserInteraction: \"watchForFirstUserInteraction\"\r\n});\r\n\r\n\r\nexport function initInputState() {\r\n if (checkValuesAlreadyProvided(UseInputStateInjectionKeys)) {\r\n return;\r\n }\r\n const { logger } = useFormLogger();\r\n\r\n const inputStates = reactive({} as Record);\r\n\r\n const { EclipseHtmlFormElement } = useEclipseHtmlFormElement({ callerLabel: \"use-input-states\" });\r\n function setInputStates<\r\n TEnabledFormField extends string,\r\n TInputValues extends MaybeReactive>\r\n >(\r\n inputValues: TInputValues,\r\n inputStateOptions: Record\r\n ) \r\n {\r\n let reactiveInputValues: Reactive;\r\n if (isReactive(inputValues)) {\r\n reactiveInputValues = inputValues as UnwrapReactive;\r\n }\r\n else {\r\n const { CurrentMarketoFormGatingState } = useGatingLevel({\r\n callerLabel: \"setInputState\",\r\n });\r\n if (CurrentMarketoFormGatingState.value === \"BlindSubmit\") {\r\n reactiveInputValues = reactive((inputValues ?? {}) as Record);\r\n } else {\r\n throw new Error(`inputValues is not reactive`);\r\n }\r\n }\r\n\r\n for (const key of Object.keys(inputStates)) {\r\n delete inputStates[key];\r\n }\r\n\r\n const EnabledFormFields = Object.keys(\r\n inputStateOptions\r\n ) as TEnabledFormField[];\r\n\r\n for (const field of EnabledFormFields) {\r\n inputStates[field] = newInputState({\r\n logger,\r\n formElement: EclipseHtmlFormElement,\r\n formValues: reactiveInputValues,\r\n inputName: field,\r\n ...inputStateOptions[field],\r\n });\r\n }\r\n }\r\n\r\n function watchForFirstUserInteraction(inputStatesObj: Record) {\r\n const inputStatesKeys = computed(() => {\r\n return Object.keys(inputStatesObj);\r\n });\r\n const anyInputActive = computed(() => {\r\n return inputStatesKeys.value\r\n .map(key => inputStatesObj[key].active)\r\n .filter(a => a === true)\r\n .length > 0;\r\n });\r\n const { userFirstInteraction } = useFormEvents({ callerLabel: \"use-input-state\" });\r\n const removeWatcher = watch(() => anyInputActive.value, (anyActive) => {\r\n if (anyActive) {\r\n removeWatcher();\r\n userFirstInteraction.trigger({ eventName: \"userFirstInteraction\" }).catch((e) =>logger.error(e));\r\n }\r\n });\r\n }\r\n\r\n watchForFirstUserInteraction(inputStates);\r\n\r\n provide(UseInputStateInjectionKeys.inputStates, inputStates);\r\n provide(UseInputStateInjectionKeys.setInputStates, setInputStates);\r\n provide(UseInputStateInjectionKeys.watchForFirstUserInteraction, watchForFirstUserInteraction);\r\n}\r\nexport function useInputState ({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger({ callerLabel: \"useInputState\" });\r\n try {\r\n const inputStates = injectRequiredWithSelf(\r\n UseInputStateInjectionKeys.inputStates as UseInputStateInjectionKeys[\"inputStates\"]\r\n );\r\n const setInputStates = injectRequiredWithSelf(\r\n UseInputStateInjectionKeys.setInputStates as UseInputStateInjectionKeys[\"setInputStates\"]\r\n );\r\n\r\n return { inputStates, setInputStates };\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? \"unknown\"}`);\r\n throw err;\r\n }\r\n}\r\n", "import { computed, reactive } from \"vue\";\r\nimport { useInputState } from \"./use-input-state.js\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\nexport interface SubmitStateTotals {\r\n totalRequired: number;\r\n totalDone: number;\r\n totalErrors: number;\r\n}\r\nexport type SubmitStateTotalsKey = {\r\n [K in keyof SubmitStateTotals]: K;\r\n}[keyof SubmitStateTotals];\r\n\r\nexport interface SubmitState extends SubmitStateTotals {\r\n requiredFields: string[];\r\n doneFields: string[];\r\n fieldsWithErrors: string[];\r\n fieldsWithVisibleErrors: string[];\r\n totalDoneRequired: boolean;\r\n submitReadyBool: boolean;\r\n setAllFieldsTouched: () => void;\r\n}\r\nexport type SubmitStateKey = { [K in keyof SubmitState]: K }[keyof SubmitState];\r\n\r\nexport function useSubmitState({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger();\r\n try {\r\n callerLabel ??= \"useSubmitState\";\r\n const { inputStates } = useInputState({ callerLabel });\r\n\r\n const InputStateKeysRef = computed(() => {\r\n return Object.keys(inputStates) as TEnabledFormField[];\r\n });\r\n\r\n const setAllFieldsTouched = () => {\r\n InputStateKeysRef.value.forEach((key) => {\r\n inputStates[key].touched = true;\r\n });\r\n };\r\n\r\n const requiredFields = computed(() => {\r\n //return filterByProp(inputStates, InputStateKeysRef.value, \"required\");\r\n return InputStateKeysRef.value.filter((k) => inputStates[k].required);\r\n });\r\n const doneFields = computed(() => {\r\n //return filterByProp(inputStates, InputStateKeysRef.value, \"done\");\r\n return InputStateKeysRef.value.filter((k) => inputStates[k].done);\r\n });\r\n\r\n const fieldsWithErrors = computed(() => {\r\n //return filterByProp(inputStates, InputStateKeysRef.value, \"hasError\");\r\n return InputStateKeysRef.value.filter((k) => inputStates[k].hasError);\r\n });\r\n\r\n const fieldsWithVisibleErrors = computed(() => {\r\n //return filterByProp(inputStates, InputStateKeysRef.value, \"showError\");\r\n return InputStateKeysRef.value.filter((k) => inputStates[k].showError);\r\n });\r\n\r\n const totalRequired = computed(() => {\r\n return requiredFields.value.length;\r\n });\r\n const totalDone = computed(() => {\r\n return doneFields.value.length;\r\n });\r\n const totalErrors = computed(() => {\r\n return fieldsWithErrors.value.length;\r\n });\r\n const totalDoneRequired = computed(() => {\r\n return totalDone.value >= totalRequired.value;\r\n });\r\n const submitReadyBool = computed(() => {\r\n const done = totalDoneRequired.value;\r\n const noErrors = totalErrors.value === 0;\r\n const isReady = done && noErrors;\r\n if (!isReady) {\r\n logger.warn(\"error detected in submitState\");\r\n }\r\n return isReady;\r\n });\r\n\r\n return {\r\n submitState: reactive({\r\n requiredFields,\r\n doneFields,\r\n fieldsWithErrors,\r\n fieldsWithVisibleErrors,\r\n totalRequired,\r\n totalDone,\r\n totalErrors,\r\n totalDoneRequired,\r\n submitReadyBool,\r\n setAllFieldsTouched,\r\n }),\r\n };\r\n } catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? \"unknown\"}`);\r\n throw err;\r\n }\r\n}\r\n", "import type { default as _jquery } from \"jquery\";\r\nimport { BaseFormLogger as logger } from \"../base-form-logger.js\";\r\n\r\nlet loadScriptPromise: Promise | null = null;\r\n// Adding window var to trigger error message\r\ndeclare global {\r\n\tinterface Window { formLoadError: boolean; }\r\n}\r\nwindow.formLoadError = window.formLoadError || false;\r\n\r\nexport function loadMarketoScript() {\r\n\tif (loadScriptPromise === null) {\r\n\t\tloadScriptPromise = new Promise((accept, reject) => {\r\n\t\t\tlogger.debug(\"loadMarketoScript START\");\r\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n\t\t\t$.getScript(\"https://go.mastercontrol.com/js/forms2/js/forms2.min.js\")\r\n\t\t\t\t.done(function (_script, _textStatus) {\r\n\t\t\t\t\tlogger.debug(\"loadMarketoScript COMPLETE\");\r\n\t\t\t\t\taccept(true);\r\n\t\t\t\t})\r\n\t\t\t\t.fail(function (_jqxhr, _settings, exception) {\r\n\t\t\t\t\tlogger.debug(\"loadMarketoScript FAIL\");\r\n\t\t\t\t\twindow.formLoadError = true;\r\n\t\t\t\t\tlogger.error(exception);\r\n\t\t\t\t\treject(exception);\r\n\t\t\t\t});\r\n\t\t});\r\n\t}\r\n\treturn loadScriptPromise;\r\n}\r\n", "import type _jquery from \"jquery\";\r\nimport { provide, type DeepReadonly, type Ref, ref, readonly } from \"vue\";\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionKeysRecord,\r\n type InjectionValuesRecord,\r\n} from \"@mcwd/util-vue\";\r\nimport { exhaustiveGuard } from \"@mcwd/typescript-type-guards\";\r\nimport { MarketoFormState } from \"../types/definitions/marketo-form-state.js\";\r\nimport { useGatingLevel } from \"./use-gating-level.js\";\r\nimport { useFormEvents } from \"./use-form-events.js\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\n\r\nexport const SetFormStateValue = [\r\n \"BeforeLoad\",\r\n \"Loading\",\r\n \"Setup\",\r\n \"Ready\",\r\n \"Complete\"\r\n] as const satisfies readonly (Exclude | \"Ready\" | \"Complete\")[];\r\n\r\nexport type SetFormStateValue = (typeof SetFormStateValue)[number];\r\n\r\n\r\ntype UseFormStateInjectionValues = InjectionValuesRecord<{\r\n FormState: DeepReadonly>;\r\n setFormState(value: SetFormStateValue): Promise;\r\n}>;\r\n\r\ntype UseFormStateInjectionKeys =\r\n InjectionKeysRecord;\r\n\r\nconst UseFormStateInjectionKeys = CreateInjectionKeysRecord({\r\n FormState: \"FormState\",\r\n setFormState: \"setFormState\",\r\n});\r\n\r\nfunction getValidBeforeStates(state: MarketoFormState): MarketoFormState[] {\r\n switch (state) {\r\n case \"BeforeLoad\": return [\"BeforeLoad\"];\r\n case \"Loading\": return [\"BeforeLoad\"];\r\n case \"Setup\": return [\"Loading\"];\r\n case \"RegularForm\": return [\"Setup\"];\r\n case \"BlindForm\": return [\"Setup\", \"RegularForm\", \"BlindForm\"];\r\n case \"RegularFormComplete\": return [\"RegularForm\"];\r\n default: exhaustiveGuard(state);\r\n }\r\n}\r\n\r\n\r\nexport function initFormState() {\r\n if (checkValuesAlreadyProvided(UseFormStateInjectionKeys)) {\r\n return;\r\n }\r\n const FormState = ref(\"BeforeLoad\");\r\n const { CurrentMarketoFormGatingState } = useGatingLevel({callerLabel: \"initFormState\"});\r\n const events = useFormEvents({ callerLabel: \"initFormState\" });\r\n async function setFormState(value: SetFormStateValue) {\r\n if (value === \"Ready\") {\r\n await events.ready.trigger({ eventName: \"ready\" });\r\n }\r\n else if (value === \"Complete\") {\r\n await events.completed.trigger({ eventName: \"completed\", gatingState: CurrentMarketoFormGatingState.value });\r\n }\r\n else if (value === \"BeforeLoad\" || value === \"Loading\" || value === \"Setup\") {\r\n // Do nothing.\r\n }\r\n else {\r\n exhaustiveGuard(value);\r\n }\r\n let state: MarketoFormState;\r\n // We transform \"Ready\" and \"Complete\" into more specific values depending on the Gating State\r\n \r\n if (CurrentMarketoFormGatingState.value === \"BlindSubmit\") {\r\n // The blind form is never complete, since a user could click multiple downloads\r\n if (value === \"Ready\" || value === \"Complete\") {\r\n state = \"BlindForm\";\r\n }\r\n else {\r\n state = value;\r\n }\r\n }\r\n else if (CurrentMarketoFormGatingState.value === \"FullGate\" || CurrentMarketoFormGatingState.value === \"PartialGate\") {\r\n if (value === \"Ready\") {\r\n state = \"RegularForm\";\r\n }\r\n else if (value === \"Complete\") {\r\n state = \"RegularFormComplete\";\r\n }\r\n else {\r\n state = value;\r\n }\r\n }\r\n else {\r\n exhaustiveGuard(CurrentMarketoFormGatingState.value);\r\n }\r\n\r\n const validStates = getValidBeforeStates(state);\r\n if (validStates.includes(FormState.value)) {\r\n FormState.value = state;\r\n } else {\r\n throw new Error(\r\n `Invalid Form State \"${state}\" following \"${FormState.value}\"`\r\n );\r\n }\r\n }\r\n provide(UseFormStateInjectionKeys.FormState, readonly(FormState));\r\n provide(UseFormStateInjectionKeys.setFormState, setFormState);\r\n}\r\n\r\nexport function useFormState ({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger();\r\n try {\r\n callerLabel ??= \"useFormState\";\r\n const FormState = injectRequiredWithSelf(UseFormStateInjectionKeys.FormState);\r\n const setFormState = injectRequiredWithSelf(UseFormStateInjectionKeys.setFormState);\r\n return {\r\n FormState,\r\n // Create a new function to wrap the original one and pass the currentGatingState value into the second param.\r\n setFormState\r\n };\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n}\r\n", "import { ref, computed, provide, type Ref, type ComputedRef, type DeepReadonly } from 'vue';\r\nimport {\r\n injectWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionValuesRecord,\r\n type InjectionKeysRecord\r\n} from \"@mcwd/util-vue\";\r\nimport { isObject, type Nil, isNil } from '@mcwd/typescript-type-guards';\r\nimport type { MktoFormObj } from \"../types/Marketo.js\";\r\nimport { loadMarketoScript } from \"../form-logic/loadMarketoScript.js\";\r\nimport { useFormState } from \"./use-form-state.js\";\r\nimport { useFormSettings } from \"./use-form-settings.js\";\r\nimport { useFormEvents } from \"./use-form-events.js\";\r\nimport { useMarketoKnownVisitorState } from './use-marketo-known-visitor-status.js';\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\n\r\nlet formCounter = 0;\r\n\r\ntype UseMarketoInjectionValues = InjectionValuesRecord<{\r\n UniqInstanceId: number;\r\n MarketoFormObj: DeepReadonly>;\r\n MarketoFormHtmlElement: ComputedRef | Nil>;\r\n SubmitMarketoForm: () => void;\r\n LoadForm: () => Promise;\r\n isMarketoFormValid: () => boolean | null;\r\n}>;\r\n\r\ntype UseMarketoInjectionKeys = InjectionKeysRecord;\r\n\r\nconst UseMarketoInjectionKeys = CreateInjectionKeysRecord({\r\n UniqInstanceId: \"UniqInstanceId\",\r\n MarketoFormObj: \"MarketoFormObj\",\r\n MarketoFormHtmlElement: \"MarketoFormHtmlElement\",\r\n SubmitMarketoForm: \"SubmitMarketoForm\",\r\n LoadForm: \"LoadForm\",\r\n isMarketoFormValid: \"isMarketoFormValid\"\r\n});\r\n\r\n\r\nexport function initMarketoForm()\r\n{\r\n if (checkValuesAlreadyProvided(UseMarketoInjectionKeys)) {\r\n return;\r\n }\r\n const { logger, getVerboseLogger } = useFormLogger();\r\n\r\n const verboseLogger = getVerboseLogger(\"initMarketoForm\");\r\n verboseLogger.debug(\"initMarketoForm START\");\r\n\r\n const uniqInstanceId = formCounter++;\r\n\r\n loadMarketoScript()\r\n .catch((err) => {\r\n logger.error(err);\r\n throw err;\r\n });\r\n\r\n const events = useFormEvents({ callerLabel: \"initMarketoForm\" });\r\n\r\n const { FormSettings } = useFormSettings({ callerLabel: \"initMarketoForm\" });\r\n const MarketoFormObj = ref(null);\r\n provide(UseMarketoInjectionKeys.MarketoFormObj, MarketoFormObj);\r\n const MarketoFormHtmlElement = computed | Nil>(() => {\r\n const mktoFormElemResult = MarketoFormObj.value?.getFormElem();\r\n if (isNil(mktoFormElemResult)) {\r\n return null;\r\n }\r\n else {\r\n const allFormElements = ([] as HTMLFormElement[]).slice.call(mktoFormElemResult);\r\n const filteredElems = allFormElements.filter(el => $(el).attr(\"data-uniq-instance-id\")?.trim() === uniqInstanceId.toString());\r\n\r\n if (filteredElems.length === 0) {\r\n return null;\r\n }\r\n else if (filteredElems.length === 1) {\r\n return $(filteredElems[0]);\r\n }\r\n else {\r\n throw new Error(`Unexpected number of form elements with 'data-uniq-instance-id'='${uniqInstanceId}'`);\r\n }\r\n }\r\n });\r\n provide(UseMarketoInjectionKeys.MarketoFormHtmlElement, MarketoFormHtmlElement);\r\n\r\n const { initMarketoFormElement } = useMarketoKnownVisitorState();\r\n initMarketoFormElement(MarketoFormHtmlElement);\r\n\r\n const { setFormState } = useFormState({ callerLabel: \"initMarketoForm\" });\r\n\r\n async function setupFormMktoCallback(mktoFormObj: MktoFormObj) {\r\n verboseLogger.debug(\"setupFormMktoCallback START\");\r\n // Initialize the MarketoFormObj ref\r\n MarketoFormObj.value = mktoFormObj;\r\n\r\n await setFormState(\"Setup\");\r\n\r\n const formEl = mktoFormObj.getFormElem();\r\n formEl.removeAttr(\"id\");\r\n\r\n // ---------------- Set handlers for marketo events ----------------\r\n\r\n mktoFormObj.onSuccess((/*_values, _followUpUrl*/) => {\r\n // events.completed.trigger is already called in setFormState;\r\n setFormState(\"Complete\").catch((err) => logger.error(err));\r\n // Return false to prevent the submission handler from taking the lead to the follow up url\r\n return false;\r\n });\r\n\r\n mktoFormObj.onValidate((marketoFormValid: boolean) => {\r\n events.marketoValidation\r\n .trigger({\r\n eventName: \"marketoValidation\",\r\n marketoIsValid: marketoFormValid,\r\n })\r\n .catch((err) => logger.error(err));\r\n });\r\n mktoFormObj.onSubmit(() => {\r\n events.submit.trigger({ eventName: \"submit\" }).catch(err => logger.error(err));\r\n });\r\n\r\n await events.marketoSetup.trigger({ eventName: \"marketoSetup\" });\r\n\r\n // events.ready.trigger is already called in setFormState;\r\n await setFormState(\"Ready\");\r\n }\r\n\r\n let loadFormPromise: Promise;\r\n\r\n const LoadForm = (): Promise => {\r\n if (isNil(loadFormPromise)) {\r\n loadFormPromise = new Promise((resolve, reject) => {\r\n verboseLogger.debug(\"LoadForm START\");\r\n loadMarketoScript()\r\n .catch((err) => reject(err))\r\n .then(() => {\r\n return setFormState(\"Loading\");\r\n }).then(() => {\r\n MktoForms2.loadForm(FormSettings.baseUrl, FormSettings.munchkinId, FormSettings.formId, (mktoFormObj) => {\r\n setupFormMktoCallback(mktoFormObj).then(() => {\r\n verboseLogger.debug(\"LoadForm END\");\r\n resolve();\r\n }).catch(err => {\r\n reject(err);\r\n });\r\n });\r\n }).catch((err) => reject(err));\r\n });\r\n }\r\n return loadFormPromise;\r\n };\r\n\r\n const SubmitMarketoForm = () => {\r\n const formEl = MarketoFormObj.value?.getFormElem();\r\n if (isObject(formEl)) {\r\n const mktoSubmitButton = formEl.find(\".mktoButton[type='submit']\");\r\n if (mktoSubmitButton.length > 0) {\r\n if (mktoSubmitButton.length > 1) {\r\n logger.error(\"Unexpected number of .mktoButton[type='submit']\");\r\n }\r\n else {\r\n mktoSubmitButton.trigger(\"click\");\r\n }\r\n }\r\n }\r\n };\r\n\r\n const checkMarketoFormValid = (): boolean | null => {\r\n if (MarketoFormObj.value === null) {\r\n return null;\r\n }\r\n return MarketoFormObj.value.submittable();\r\n };\r\n \r\n provide(UseMarketoInjectionKeys.LoadForm, LoadForm);\r\n provide(UseMarketoInjectionKeys.SubmitMarketoForm, SubmitMarketoForm);\r\n provide(UseMarketoInjectionKeys.isMarketoFormValid, checkMarketoFormValid);\r\n provide(UseMarketoInjectionKeys.UniqInstanceId, uniqInstanceId);\r\n}\r\n\r\nfunction getNilObjPropNames(obj: Record) {\r\n return Object.keys(obj).filter(k => isNil(obj[k]));\r\n}\r\n\r\nfunction injectOrError(keysToInject: TKeyToInject[]): { [key in TKeyToInject]: UseMarketoInjectionValues[key] } { \r\n type TReturn = { [key in TKeyToInject]: UseMarketoInjectionValues[key] };\r\n\r\n const injectedValues: Partial = {};\r\n\r\n for (const key of keysToInject) {\r\n injectedValues[key] = injectWithSelf(UseMarketoInjectionKeys[key]);\r\n }\r\n const nilVariableNames = getNilObjPropNames(injectedValues);\r\n\r\n if (nilVariableNames.length > 0) {\r\n throw new Error(`Form has not been initialized. Undefined variables: ${nilVariableNames.toString()}`);\r\n }\r\n\r\n return injectedValues as TReturn;\r\n}\r\n\r\nexport const useMarketoForm = ({ callerLabel }: { callerLabel?: string | undefined } = {}) => {\r\n const { logger } = useFormLogger({ callerLabel: \"useMarketoForm\" });\r\n try {\r\n return injectOrError([\r\n \"LoadForm\",\r\n \"UniqInstanceId\",\r\n ]);\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n};\r\n\r\nexport const useMarketoFormInternals = ({ callerLabel }: { callerLabel?: string | undefined } = {}) => {\r\n const { logger } = useFormLogger({ callerLabel: \"useMarketoFormInternals\" });\r\n try {\r\n return injectOrError([\r\n \"MarketoFormObj\",\r\n \"MarketoFormHtmlElement\",\r\n \"SubmitMarketoForm\",\r\n \"UniqInstanceId\",\r\n ]);\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n};", "/**\r\n * Load script tag and resolve as a promise\r\n */\r\n\r\nimport { isString } from \"@mcwd/typescript-type-guards\";\r\n\r\n// this function will work cross-browser for loading scripts asynchronously\r\nexport function loadScriptAsPromise(\r\n srcOrOptions: string | { src: string, async?: boolean, crossOrigin?: string }\r\n): Promise {\r\n const { src, async = true, crossOrigin = null } = isString(srcOrOptions) ? { src: srcOrOptions } : srcOrOptions;\r\n return new Promise((resolve: (val: HTMLScriptElement) => void, reject: (reason: any) => void) => {\r\n const s: HTMLScriptElement = document.createElement(\"script\");\r\n s.type = \"text/javascript\";\r\n s.src = src;\r\n s.async = async;\r\n if (crossOrigin) { s.crossOrigin = crossOrigin; }\r\n s.onerror = reject;\r\n s.onload = () => {\r\n resolve(s);\r\n };\r\n const scripts = document.getElementsByTagName(\"script\");\r\n if (scripts.length > 0) {\r\n const firstScript = scripts[0];\r\n if (firstScript.parentElement) {\r\n firstScript.parentElement.insertBefore(s, firstScript);\r\n return;\r\n }\r\n }\r\n document.head.appendChild(s);\r\n });\r\n}\r\n", "import { isNil, isString, type Nil } from \"@mcwd/typescript-type-guards\";\r\n\r\nexport type HTMLElementFindFn = (parent: ParentNode) => (Element | Nil);\r\n\r\n\r\nfunction WaitForElementWithSelectorFn(\r\n selectorFn: HTMLElementFindFn,\r\n parentElement: ParentNode = document,\r\n maxRetries: number,\r\n pollIntervalInMs: number\r\n): Promise {\r\n return new Promise((resolve, reject) => {\r\n if (maxRetries < 0) {\r\n reject(new Error(\"WaitForElementAsPromise: maxRetries is less than zero!\"));\r\n }\r\n if (pollIntervalInMs < 0) {\r\n reject(new Error(\"WaitForElementAsPromise: pollIntervalInMs is less than zero!\"));\r\n }\r\n let retries = 0;\r\n const waitForEl = () => {\r\n const el = selectorFn(parentElement);\r\n if (! isNil(el)) {\r\n resolve(el);\r\n }\r\n if (retries < maxRetries) {\r\n retries++;\r\n setTimeout(waitForEl, pollIntervalInMs);\r\n }\r\n else {\r\n reject(new Error(\"WaitForElementAsPromise: Element not found!\"));\r\n }\r\n };\r\n waitForEl();\r\n });\r\n}\r\n\r\nexport async function WaitForElementAsPromise(\r\n elementSelector: string | HTMLElementFindFn,\r\n parentElement: ParentNode = document,\r\n maxRetries?: number,\r\n pollIntervalInMs?: number\r\n): Promise {\r\n maxRetries ??= 10;\r\n pollIntervalInMs ??= 500;\r\n if (isString(elementSelector)) {\r\n const selector = elementSelector;\r\n elementSelector = (parent: ParentNode) => parent.querySelector(selector);\r\n }\r\n return await WaitForElementWithSelectorFn(elementSelector, parentElement, maxRetries, pollIntervalInMs);\r\n}\r\n", "import {\r\n ref,\r\n onMounted,\r\n onUnmounted,\r\n provide,\r\n type Ref,\r\n type InjectionKey,\r\n} from \"vue\";\r\n\r\nimport { checkValuesAlreadyProvided, injectRequiredWithSelf } from \"@mcwd/util-vue\";\r\n\r\nimport { useMarketoFormInternals } from \"./use-marketo-form-instance.js\";\r\nimport { useFormEvents } from \"./use-form-events.js\";\r\nimport { useFormSettings } from \"./use-form-settings.js\";\r\nimport { isNil, isString, type Nil } from \"@mcwd/typescript-type-guards\";\r\n\r\nimport type { MktoFormObj, MktoFormObjWithUndocumentedExtras } from \"../types/Marketo.js\";\r\n\r\nimport type {} from \"../types/recaptcha.js\";\r\nimport { loadScriptAsPromise } from \"../../utils/loadScriptAsPromise.js\";\r\nimport { WaitForElementAsPromise } from \"../../utils/wait-for-element-as-promise.js\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\nimport type { ILogger } from \"../../utils/Logger/ILogger.js\";\r\n\r\n\r\n\r\ninterface UseMarketoRecaptchaInjectionValues {\r\n setRecaptchaToken: () => Promise\r\n}\r\n\r\ntype UseMarketoRecaptchaInjectionKeys = {\r\n [key in keyof UseMarketoRecaptchaInjectionValues]: InjectionKey<\r\n UseMarketoRecaptchaInjectionValues[key]\r\n >;\r\n};\r\n\r\nconst UseMarketoRecaptchaInjectionKeys: UseMarketoRecaptchaInjectionKeys = {\r\n setRecaptchaToken: Symbol(\"setRecaptchaToken\"),\r\n};\r\n\r\nfunction initSetupRecaptcha() {\r\n const { logger } = useFormLogger();\r\n let loadRecaptchaPromise: Promise | Nil = null;\r\n // Load Recaptcha\r\n return (siteKey: string, scriptTagRef: Ref) => {\r\n loadRecaptchaPromise ??= new Promise((resolve, reject) => {\r\n loadScriptAsPromise(\"https://www.google.com/recaptcha/api.js?render=\" + siteKey)\r\n .then((scriptTag: HTMLScriptElement) => {\r\n scriptTagRef.value = scriptTag;\r\n window.grecaptcha.ready(() => {\r\n resolve();\r\n });\r\n })\r\n .catch((event) => reject(event));\r\n // eslint-disable-next-line @typescript-eslint/unbound-method\r\n }).catch(logger.error);\r\n return loadRecaptchaPromise;\r\n };\r\n}\r\n\r\nfunction setMarketoCaptchaToken(token: string, marketoFormObj: MktoFormObjWithUndocumentedExtras, formEl: JQuery, logger: ILogger) {\r\n logger.debug(\"setMarketoCaptchaToken\");\r\n // try to set token using Marketo code and then setting it on error\r\n try {\r\n marketoFormObj.setCaptchaValue(token);\r\n return Promise.resolve(token);\r\n }\r\n catch (error) {\r\n marketoFormObj.addHiddenFields({\r\n captchaToken: token,\r\n });\r\n return WaitForElementAsPromise(\"*[name=captchaToken]\", formEl.get(0))\r\n .then(tokenField => {\r\n const val = $(tokenField).val();\r\n if (isString(val) && val.trim().length > 0) {\r\n return val;\r\n }\r\n else {\r\n throw new Error(\"recaptcha input not found\");\r\n }\r\n })\r\n .catch(err => {\r\n logger.error(err);\r\n throw new Error(\"recaptcha input not found\");\r\n });\r\n }\r\n}\r\n\r\nasync function grecaptchaExecSubmit(siteKey: string, marketoFormObj: MktoFormObj, formEl: JQuery, logger: ILogger): Promise {\r\n logger.debug(\"grecaptchaExecSubmit\");\r\n return await window.grecaptcha\r\n .execute(siteKey, { action: \"submit\" })\r\n .then((token: string) => {\r\n return setMarketoCaptchaToken(token, marketoFormObj as MktoFormObjWithUndocumentedExtras, formEl, logger);\r\n });\r\n}\r\n\r\nfunction initExecReCaptcha(setupRecaptcha: ReturnType, logger: ILogger) {\r\n return async (siteKey: string, marketoFormObj: MktoFormObj, formEl: JQuery, scriptTagRef: Ref) => {\r\n await setupRecaptcha(siteKey, scriptTagRef);\r\n return new Promise((resolve, _reject) => {\r\n logger.debug(\"setupRecaptcha\");\r\n window.grecaptcha.ready(() => {\r\n grecaptchaExecSubmit(siteKey, marketoFormObj, formEl, logger)\r\n .then(token => {\r\n if (isString(token) && token.length > 0) {\r\n resolve();\r\n }\r\n })\r\n .catch((err: unknown)=> {\r\n err = err ?? \"Error in grecaptchaExecSubmit\";\r\n logger.error(err);\r\n throw err;\r\n });\r\n });\r\n });\r\n };\r\n}\r\n\r\nexport function initMarketoRecaptcha() {\r\n if (checkValuesAlreadyProvided(UseMarketoRecaptchaInjectionKeys)) {\r\n return;\r\n }\r\n\r\n const { logger, getVerboseLogger } = useFormLogger({ callerLabel: \"initMarketoFormRecaptcha\" });\r\n const verboseLogger = getVerboseLogger(\"initMarketoRecaptcha\");\r\n verboseLogger.debug(\"START initMarketoRecaptcha\");\r\n // Load Recaptcha\r\n const setupRecaptcha = initSetupRecaptcha();\r\n\r\n // load and use reCAPTCHA\r\n const execReCaptcha = initExecReCaptcha(setupRecaptcha, logger);\r\n\r\n const scriptTagRef: Ref = ref(null);\r\n\r\n const { MarketoFormObj, MarketoFormHtmlElement } = useMarketoFormInternals({ callerLabel: \"iniMarketoRecaptcha\" });\r\n const { FormSettings } = useFormSettings({ callerLabel: \"iniMarketoRecaptcha\" });\r\n\r\n const setRecaptchaToken = async () => {\r\n if (isNil(FormSettings)) {\r\n throw new Error(\"FormSettings is null\");\r\n }\r\n if (isNil(MarketoFormObj.value)) {\r\n throw new Error(\"MarketoFormObj is null.\");\r\n }\r\n if (isNil(MarketoFormHtmlElement.value)) {\r\n throw new Error(\"MarketoFormHtmlElement is null.\");\r\n }\r\n return await execReCaptcha(\r\n FormSettings.recaptchaSiteKey,\r\n MarketoFormObj.value,\r\n MarketoFormHtmlElement.value,\r\n scriptTagRef\r\n );\r\n };\r\n\r\n\r\n verboseLogger.debug(\"PROVIDE setRecaptchaToken\");\r\n provide(UseMarketoRecaptchaInjectionKeys.setRecaptchaToken, setRecaptchaToken);\r\n\r\n const events = useFormEvents({ callerLabel: \"iniMarketoRecaptcha\" });\r\n\r\n\r\n onMounted(() => {\r\n events.marketoSetup.on(() => {\r\n setupRecaptcha(FormSettings.recaptchaSiteKey, scriptTagRef).catch(\r\n // eslint-disable-next-line @typescript-eslint/unbound-method\r\n logger.error\r\n );\r\n });\r\n });\r\n\r\n onUnmounted(() => {\r\n if (scriptTagRef.value) {\r\n const parent = scriptTagRef.value?.parentElement;\r\n if (parent) {\r\n parent.removeChild(scriptTagRef.value);\r\n scriptTagRef.value = null;\r\n }\r\n }\r\n });\r\n\r\n verboseLogger.debug(\"END initMarketoRecaptcha\");\r\n}\r\n\r\nexport function useMarketoRecaptcha({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger({ callerLabel: \"useMarketoRecaptcha\" });\r\n try {\r\n callerLabel ??= \"useMarketoRecaptcha\";\r\n const setRecaptchaToken = injectRequiredWithSelf(UseMarketoRecaptchaInjectionKeys.setRecaptchaToken);\r\n return { setRecaptchaToken };\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n}", "import type _jquery from \"jquery\";\r\nimport { computed, provide, reactive } from \"vue\";\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionKeysRecord,\r\n type InjectionValuesRecord\r\n} from \"@mcwd/util-vue\";\r\n\r\nimport { useFormSettings } from \"./use-form-settings.js\";\r\nimport { useGatingLevel } from \"./use-gating-level.js\";\r\nimport { UserMarketoInputName, type MarketoVals } from \"../types/definitions/inputs/marketo-input-names-and-values.js\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\n\r\ntype UseFormUserInputValuesInjectionValues = Record> = InjectionValuesRecord<{\r\n userInputValues: TInputValues,\r\n setFormUserInputValuesFromSettings(): void\r\n}>;\r\n\r\ntype UseFormUserInputValuesInjectionKeys<\r\n TEnabledFields extends string = string,\r\n TInputValues extends Record = Record\r\n> = InjectionKeysRecord>;\r\n\r\nconst UseFormUserInputValuesInjectionKeys = CreateInjectionKeysRecord({\r\n userInputValues: \"userInputValues\",\r\n setFormUserInputValuesFromSettings: \"setFormUserInputValuesFromSettings\",\r\n});\r\n\r\n\r\nexport function initFormUserInputValues(){\r\n if (checkValuesAlreadyProvided(UseFormUserInputValuesInjectionKeys)) {\r\n return;\r\n }\r\n\r\n const { FormSettings } = useFormSettings({ callerLabel: \"setFormUserInputValuesFromSettings\" });\r\n const { CurrentMarketoFormGatingState } = useGatingLevel({ callerLabel: \"setFormUserInputValuesFromSettings\" });\r\n\r\n const enabledFields = computed(() => {\r\n const enabledFieldsObj = FormSettings.enabledFields;\r\n\r\n const curGatingState = CurrentMarketoFormGatingState.value;\r\n if (curGatingState in enabledFieldsObj) {\r\n return enabledFieldsObj[curGatingState as keyof (typeof enabledFieldsObj)];\r\n }\r\n else {\r\n throw new Error(\r\n `${curGatingState} does not exist for formExperience '${FormSettings.formSettingsKey}'`\r\n );\r\n }\r\n });\r\n\r\n const userInputValues = reactive({});\r\n\r\n const enabledUserFields = computed(() => {\r\n return enabledFields.value\r\n .filter(f => (UserMarketoInputName as readonly string[])\r\n .includes(f)) as Extract<(typeof enabledFields.value)[number], UserMarketoInputName>[];\r\n });\r\n\r\n function setFormUserInputValuesFromSettings() {\r\n type AnyEnabledUserField = (typeof enabledUserFields.value)[number];\r\n type UserMarketoValues = { [Key in AnyEnabledUserField]: Required[Key] };\r\n\r\n for (const key of Object.keys(userInputValues)) {\r\n delete userInputValues[key];\r\n }\r\n\r\n for (const prop of enabledUserFields.value) {\r\n userInputValues[prop] = null as UserMarketoValues[typeof prop];\r\n }\r\n }\r\n\r\n provide(UseFormUserInputValuesInjectionKeys.userInputValues, userInputValues);\r\n provide(UseFormUserInputValuesInjectionKeys.setFormUserInputValuesFromSettings, setFormUserInputValuesFromSettings);\r\n}\r\n\r\nexport function useFormUserInputValues<\r\n TEnabledFields extends string, TInputValues extends Record\r\n>({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger();\r\n try {\r\n callerLabel ??= \"useFormUserInputValues\";\r\n const userInputValues = injectRequiredWithSelf(\r\n UseFormUserInputValuesInjectionKeys.userInputValues as UseFormUserInputValuesInjectionKeys[\"userInputValues\"]\r\n );\r\n const setFormUserInputValuesFromSettings = injectRequiredWithSelf(UseFormUserInputValuesInjectionKeys.setFormUserInputValuesFromSettings);\r\n return { userInputValues, setFormUserInputValuesFromSettings };\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n}", "import type _jquery from \"jquery\";\r\nimport { provide, ref } from \"vue\";\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionKeysRecord,\r\n type InjectionValuesRecord\r\n} from \"@mcwd/util-vue\";\r\n//import { useMarketoForm } from \"./use-marketo-form-instance.js\";\r\nimport { isNil } from \"@mcwd/typescript-type-guards\";\r\n\r\nimport { useInputState } from \"./use-input-state.js\";\r\nimport { useSubmitState } from \"./use-submit-state.js\";\r\nimport { useFormSettings } from \"./use-form-settings.js\";\r\nimport { useMarketoFormInternals } from \"./use-marketo-form-instance.js\";\r\nimport { useMarketoRecaptcha } from \"./use-marketo-recaptcha.js\";\r\nimport { useGatingLevel } from \"./use-gating-level.js\";\r\nimport { useFormUserInputValues } from \"./use-form-user-input-values.js\";\r\nimport { useFormEvents } from \"./use-form-events.js\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\n\r\nexport interface FormSubmitState {\r\n isFormSubmitted?: boolean\r\n}\r\n\r\nexport const formSubmitBool = ref(false);\r\n\r\ntype UseFormSubmitInjectionValues = InjectionValuesRecord<{\r\n submitForm: () => void;\r\n errorCheck(): void;\r\n}>;\r\n\r\ntype UseFormSubmitInjectionKeys = InjectionKeysRecord;\r\n\r\nconst UseFormSubmitInjectionKeys = CreateInjectionKeysRecord({\r\n submitForm: \"submitForm\",\r\n errorCheck: \"errorCheck\",\r\n});\r\n\r\n\r\nexport function initFormSubmit() {\r\n if (checkValuesAlreadyProvided(UseFormSubmitInjectionKeys)) {\r\n return;\r\n }\r\n const { logger } = useFormLogger();\r\n\r\n const { CurrentMarketoFormGatingState } = useGatingLevel({ callerLabel: \"initFormSubmit\" });\r\n const { FormSettings } = useFormSettings({ callerLabel: \"initFormSubmit\" });\r\n const { SubmitMarketoForm } = useMarketoFormInternals({ callerLabel: \"initFormSubmit\" });\r\n const { inputStates } = useInputState({ callerLabel: \"initFormSubmit\" });\r\n const { submitState } = useSubmitState({ callerLabel: \"initFormSubmit\" });\r\n const { userInputValues } = useFormUserInputValues({ callerLabel: \"iniFormSubmit\" });\r\n\r\n const { setRecaptchaToken } = useMarketoRecaptcha({ callerLabel: \"initFormSubmit\" });\r\n const { validationErrorOnSubmit } = useFormEvents({ callerLabel: \"initFormSubmit\" });\r\n\r\n const userValuesIsEmpty = () => {\r\n return isNil(userInputValues) || Object.keys(userInputValues).length === 0;\r\n };\r\n\r\n // Stop the modal from closing if submit button was clicked\r\n function submitModalHold(holdFormSubmit: boolean) {\r\n formSubmitBool.value = holdFormSubmit;\r\n }\r\n\r\n function submitForm() {\r\n logger.info(\"calling submit form\");\r\n if (userValuesIsEmpty() && CurrentMarketoFormGatingState.value !== \"BlindSubmit\") {\r\n logger.warn(\"User provided FormValues is Nil in a Gated form\");\r\n return;\r\n }\r\n submitState.setAllFieldsTouched();\r\n\r\n const visibleErrors = submitState.fieldsWithVisibleErrors;\r\n if (visibleErrors.length > 0) {\r\n // eslint-disable-next-line @typescript-eslint/unbound-method\r\n validationErrorOnSubmit.trigger({ eventName: \"validationErrorOnSubmit\" }).catch(logger.error);\r\n }\r\n\r\n if (!submitState.submitReadyBool) {\r\n return;\r\n }\r\n\r\n if (FormSettings.hasRecaptcha) {\r\n submitModalHold(true);\r\n setRecaptchaToken()\r\n .then(SubmitMarketoForm)\r\n .then(() => {\r\n logger.info(\"Form Submitted\");\r\n })\r\n .catch((err) => logger.error(err));\r\n } else {\r\n submitModalHold(true);\r\n SubmitMarketoForm();\r\n logger.info(\"Form Submitted\");\r\n }\r\n if (formSubmitBool.value) {\r\n setTimeout(() => {\r\n submitModalHold(false);\r\n }, 1000);\r\n }\r\n }\r\n\r\n // If user hovers over button before form complete\r\n function doneCheck() {\r\n if (userValuesIsEmpty() && CurrentMarketoFormGatingState.value === \"BlindSubmit\") {\r\n return;\r\n }\r\n const requiredCount = submitState.totalRequired;\r\n const doneCount = submitState.totalDone;\r\n logger.debug({ doneCount, requiredCount });\r\n logger.debug({ \"Done Fields\": submitState.doneFields });\r\n logger.debug({ \"Required Fields\": submitState.requiredFields });\r\n }\r\n\r\n function checkValueIsEmpty(value: unknown) {\r\n return isNil(value) || (value === \"\");\r\n }\r\n\r\n // Checks if there are any errors before submit\r\n function errorCheck() {\r\n if (userValuesIsEmpty()) {\r\n if (CurrentMarketoFormGatingState.value === \"BlindSubmit\") {\r\n return;\r\n } else {\r\n logger.warn(\"User provided FormValues is Nil in a Gated form\");\r\n return;\r\n }\r\n }\r\n doneCheck();\r\n type InputStateKey = keyof typeof inputStates;\r\n const inputStateKeys = Object.keys(inputStates) as InputStateKey[];\r\n\r\n inputStateKeys.forEach((key) => {\r\n const isRequired = inputStates[key].required === true;\r\n // if required then check for empty value in the formValues\r\n if (isRequired && checkValueIsEmpty(userInputValues[key])) {\r\n logger.info(`Required value \"${key}\" is empty`);\r\n }\r\n });\r\n }\r\n\r\n provide(UseFormSubmitInjectionKeys.submitForm, submitForm);\r\n provide(UseFormSubmitInjectionKeys.errorCheck, errorCheck);\r\n}\r\n\r\nexport function useFormSubmit({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger({ callerLabel: \"useFormSubmit\" });\r\n try {\r\n callerLabel ??= \"useFormSubmit\";\r\n const submitForm = injectRequiredWithSelf(UseFormSubmitInjectionKeys.submitForm);\r\n const errorCheck = injectRequiredWithSelf(UseFormSubmitInjectionKeys.errorCheck);\r\n if (isNil(submitForm)) {\r\n throw new Error(\"submitForm is Nil\");\r\n }\r\n if (isNil(errorCheck)) {\r\n throw new Error(\"errorCheck is Nil\");\r\n }\r\n return { submitForm, errorCheck };\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n}\r\n", "import { provide, computed, type ComputedRef } from \"vue\";\r\n\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionKeysRecord,\r\n type InjectionValuesRecord\r\n} from \"@mcwd/util-vue\";\r\n\r\nimport { useFormSettings } from './use-form-settings.js';\r\nimport { useGatingLevel } from './use-gating-level.js';\r\nimport { useFormSubmit } from './use-form-submit.js';\r\n\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\n\r\ntype UseBlindSubmitInjectionValues = InjectionValuesRecord<{\r\n blindSubmitEnabled: boolean;\r\n isBlindSubmitForm: ComputedRef;\r\n submitBlindFormIfEnabled: () => void;\r\n}>;\r\n\r\ntype UseBlindSubmitInjectionKeys = InjectionKeysRecord;\r\n\r\nconst UseBlindSubmitInjectionKeys = CreateInjectionKeysRecord({\r\n blindSubmitEnabled: \"blindSubmitEnabled\",\r\n isBlindSubmitForm: \"isBlindSubmitForm\",\r\n submitBlindFormIfEnabled: \"submitBlindFormIfEnabled\",\r\n});\r\n\r\n\r\nexport function initBlindSubmit() {\r\n if (checkValuesAlreadyProvided(UseBlindSubmitInjectionKeys)) {\r\n return;\r\n }\r\n const { FormSettings } = useFormSettings({ callerLabel: \"use-blind-submit\" });\r\n const blindSubmitEnabled = FormSettings.allowedGatingStates.includes(\"BlindSubmit\");\r\n const { CurrentFormExperienceGatingState } = useGatingLevel({ callerLabel: \"use-blind-submit\" });\r\n\r\n const isBlindSubmitForm = computed(() => {\r\n return blindSubmitEnabled && CurrentFormExperienceGatingState.value === \"BlindSubmit\";\r\n });\r\n\r\n const { submitForm, errorCheck } = useFormSubmit({ callerLabel: \"blind-submit\" });\r\n\r\n const blindFormSettingsCheck = () => {\r\n if (!blindSubmitEnabled) {\r\n throw new Error(\r\n `Blind Submit does not exist for formExperience '${FormSettings.formSettingsKey}'`\r\n );\r\n }\r\n if (isBlindSubmitForm.value === false) {\r\n throw new Error(`Form is not in the BlindSubmit gating state. FormSettingsKey: ${FormSettings.formSettingsKey}`);\r\n }\r\n };\r\n const { logger } = useFormLogger();\r\n\r\n const submitBlindForm = () => {\r\n try {\r\n blindFormSettingsCheck();\r\n errorCheck();\r\n submitForm();\r\n }\r\n catch (err) {\r\n logger.error(`Error in submitBlindForm. Did you mean to use submitBlindFormIfEnabled?`);\r\n throw err;\r\n }\r\n };\r\n\r\n const submitBlindFormIfEnabled = () => {\r\n if (isBlindSubmitForm.value) {\r\n submitBlindForm();\r\n }\r\n };\r\n provide(UseBlindSubmitInjectionKeys.blindSubmitEnabled, false);\r\n provide(UseBlindSubmitInjectionKeys.isBlindSubmitForm, isBlindSubmitForm);\r\n provide(UseBlindSubmitInjectionKeys.submitBlindFormIfEnabled, submitBlindFormIfEnabled);\r\n}\r\n\r\nexport function useBlindSubmit() {\r\n const blindSubmitEnabled = injectRequiredWithSelf(UseBlindSubmitInjectionKeys.blindSubmitEnabled);\r\n const isBlindSubmitForm = injectRequiredWithSelf(UseBlindSubmitInjectionKeys.isBlindSubmitForm);\r\n const submitBlindFormIfEnabled = injectRequiredWithSelf(UseBlindSubmitInjectionKeys.submitBlindFormIfEnabled); \r\n return {\r\n blindSubmitEnabled,\r\n isBlindSubmitForm,\r\n submitBlindFormIfEnabled,\r\n };\r\n}", "import { isNil, type Nil } from \"@mcwd/typescript-type-guards\";\r\nimport type { DocumentResource } from \"../widgetDataTs.js\";\r\nimport type { LinkDownloadType } from \"./LinkDownloadType.js\";\r\nimport type { TagManagerEvent } from \"./TagManager/Wrapper/TagManagerWrapper.js\";\r\n\r\ninterface DownloadEventCta {\r\n ctaText: string,\r\n /** The type of link click */\r\n ctaType: LinkDownloadType\r\n}\r\n\r\ninterface DownloadEventAsset {\r\n assetId: string,\r\n assetTitle: string,\r\n assetType: string\r\n}\r\n\r\nexport interface SendDownloadEventArgs extends DownloadEventCta, DownloadEventAsset { }\r\nexport interface SendDownloadEventDocumentResourceArgs extends DownloadEventCta {\r\n asset: DocumentResource\r\n}\r\n\r\ninterface DownloadEventObj extends TagManagerEvent {\r\n event: \"download\";\r\n ctaText: string | Nil; // data-download-cta-text\r\n ctaType: LinkDownloadType; // data-download-cta-type\r\n assetId: string;\r\n assetType: string;\r\n assetTitle: string;\r\n}\r\n\r\nexport function sendDownloadEvent(sendDownloadEventArgs: SendDownloadEventDocumentResourceArgs);\r\nexport function sendDownloadEvent(sendDownloadEventArgs: SendDownloadEventArgs);\r\nexport function sendDownloadEvent(sendDownloadEventArgs: SendDownloadEventDocumentResourceArgs | SendDownloadEventArgs) {\r\n const { ctaText, ctaType } = sendDownloadEventArgs;\r\n const { asset } = (\"asset\" in sendDownloadEventArgs) ? sendDownloadEventArgs : { asset: null };\r\n const { assetId, assetType, assetTitle } = isNil(asset)\r\n ? sendDownloadEventArgs as SendDownloadEventArgs\r\n : { assetId: asset.legacyId, assetType: asset.docType, assetTitle: asset.title };\r\n\r\n window.McTagManager.sendEvent({\r\n event: \"download\",\r\n ctaText, // data-download-cta-text\r\n ctaType, // data-download-cta-type\r\n assetId,\r\n assetType,\r\n assetTitle\r\n } satisfies DownloadEventObj);\r\n}", "import { provide } from \"vue\";\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionKeysRecord,\r\n type InjectionValuesRecord,\r\n} from \"@mcwd/util-vue\";\r\nimport { useBlindSubmit } from './use-blind-submit.js';\r\nimport type { LinkDownloadType } from '../../tracking/LinkDownloadType.js';\r\nimport { sendDownloadEvent } from '../../tracking/send-download-event.js';\r\nimport type { DocumentResource } from '../../widgetDataTs.js';\r\n\r\ntype DownloadResourceArgs = {\r\n asset: DocumentResource;\r\n ctaType: LinkDownloadType;\r\n ctaText: string;\r\n allowBlindSubmit?: boolean\r\n}\r\n\r\ntype UseFormAssetDownloadInjectionValues = InjectionValuesRecord<{\r\n downloadResourceTracking: (args: DownloadResourceArgs) => void\r\n}>;\r\n\r\ntype UseFormAssetDownloadInjectionKeys =\r\n InjectionKeysRecord;\r\n\r\nconst UseFormAssetDownloadInjectionKeys = CreateInjectionKeysRecord({\r\n downloadResourceTracking: \"downloadResourceTracking\"\r\n});\r\n\r\nexport function initFormAssetDownloads() {\r\n if (checkValuesAlreadyProvided(UseFormAssetDownloadInjectionKeys)) {\r\n return;\r\n }\r\n const { submitBlindFormIfEnabled } = useBlindSubmit();\r\n\r\n const downloadResourceTracking = ({ asset, ctaType, ctaText, allowBlindSubmit = true }: DownloadResourceArgs) => {\r\n sendDownloadEvent({ asset, ctaType, ctaText });\r\n if (allowBlindSubmit) {\r\n submitBlindFormIfEnabled();\r\n }\r\n };\r\n\r\n \r\n provide(\r\n UseFormAssetDownloadInjectionKeys.downloadResourceTracking,\r\n downloadResourceTracking\r\n );\r\n}\r\n\r\nexport function useFormAssetDownload() {\r\n const downloadResourceTracking = injectRequiredWithSelf(\r\n UseFormAssetDownloadInjectionKeys.downloadResourceTracking\r\n );\r\n\r\n return { downloadResourceTracking };\r\n}\r\n", "import { provide } from 'vue';\r\nimport type { TOptionsBase, i18n } from 'i18next';\r\nimport { useTranslation as useI18nextVueTranslation } from \"i18next-vue\";\r\nimport {\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionKeysRecord,\r\n type InjectionValuesRecord,\r\n injectRequiredWithSelf\r\n} from \"@mcwd/util-vue\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\nimport type { PartialWithNil } from '@mcwd/typescript-type-guards';\r\n\r\nexport type TranslateOptions = PartialWithNil;\r\nexport type TranslateFunction = (key: string, options?: TranslateOptions | string | undefined) => string;\r\n\r\ntype UseTranslationInjectionValues = InjectionValuesRecord<{\r\n i18next: i18n;\r\n translate: TranslateFunction;\r\n}>;\r\n\r\ntype UseTranslationInjectionKeys = InjectionKeysRecord;\r\n\r\nconst UseTranslationInjectionKeys = CreateInjectionKeysRecord({\r\n i18next: \"i18next\",\r\n translate: \"translate\"\r\n});\r\n\r\n\r\nexport function initUseTranslation()\r\n{\r\n if (checkValuesAlreadyProvided(UseTranslationInjectionKeys)) {\r\n return;\r\n }\r\n const {i18next, t: translate } = useI18nextVueTranslation();\r\n provide(UseTranslationInjectionKeys.i18next, i18next);\r\n provide(UseTranslationInjectionKeys.translate, (translate as TranslateFunction));\r\n}\r\n\r\n\r\nexport function useTranslation ({ callerLabel }: { callerLabel?: string | undefined; } = {}): { i18next: i18n; translate: TranslateFunction; } {\r\n const { logger } = useFormLogger();\r\n try\r\n {\r\n const i18next = injectRequiredWithSelf(UseTranslationInjectionKeys.i18next);\r\n const translate = injectRequiredWithSelf(UseTranslationInjectionKeys.translate);\r\n return { i18next, translate };\r\n }\r\n catch (err)\r\n {\r\n logger.error(`InjectionError from ${ callerLabel ?? 'unknown' }`);\r\n throw err;\r\n }\r\n}", "import { isString, type Nil } from \"@mcwd/typescript-type-guards\";\r\nimport { getPageName } from \"../page-data/getPageName.js\";\r\nimport { CookiePersistedQueryStringValue } from \"./types-and-classes/CookiePersistedQueryStringValue.js\";\r\nimport { GenericCookiePersistedValue } from \"./types-and-classes/GenericCookiePersistedValue.js\";\r\nimport { getExternalReferrer, getExternalReferrerDomainOnly } from \"./functions/getExternalReferrer.js\";\r\nimport { getGclidQueryParameter } from \"./functions/getGclid.js\";\r\n\r\nexport const UtmCampaign = new CookiePersistedQueryStringValue({ queryName: \"utm_campaign\", cookieName: \"utm_campaign\" });\r\nexport const UtmMedium = new CookiePersistedQueryStringValue({ queryName: \"utm_medium\", cookieName: \"utm_medium\" });\r\nexport const UtmSource = new CookiePersistedQueryStringValue({ queryName: \"utm_source\", cookieName: \"utm_source\" });\r\n\r\nexport const EntryPage = new GenericCookiePersistedValue({\r\n cookieName: \"ENTRYPAGE\",\r\n readCookieBeforeCalculating: true,\r\n valueGetter: () => document.location.pathname,\r\n defaultValue: \"\"\r\n});\r\n\r\nexport const ExternalReferrer = new GenericCookiePersistedValue({\r\n cookieName: 'source_string',\r\n readCookieBeforeCalculating: false,\r\n valueGetter: getExternalReferrer,\r\n defaultValue: \"\"\r\n});\r\n\r\nexport const ExternalReferrerDomainOnly = new GenericCookiePersistedValue({\r\n cookieName: ExternalReferrer.CookieName,\r\n readCookieBeforeCalculating: false,\r\n valueGetter: getExternalReferrerDomainOnly,\r\n defaultValue: \"\"\r\n});\r\n\r\nexport const Gclid = new GenericCookiePersistedValue({\r\n cookieName: 'gclid',\r\n readCookieBeforeCalculating: false,\r\n cookieReadOptions: {\r\n parse: (value) => {\r\n try {\r\n const val = JSON.parse(value.trim()) as unknown;\r\n return (isString(val) && val.trim() !== \"\") ? val.trim() : null;\r\n }\r\n catch {\r\n return \"\";\r\n }\r\n }\r\n },\r\n valueGetter: getGclidQueryParameter,\r\n defaultValue: \"\"\r\n});\r\n\r\nexport const PageName = new GenericCookiePersistedValue({\r\n cookieName: 'PAGENAME',\r\n readCookieBeforeCalculating: false,\r\n valueGetter: getPageName,\r\n defaultValue: \"\"\r\n});", "import type { Nil } from \"@mcwd/typescript-type-guards\";\r\nimport { getMcUrlData, type McUrlData } from \"./McUrlData.js\";\r\n\r\nexport interface PageDataSettings {\r\n Server: string;\r\n UrlPrefixesToRemove: string[];\r\n SfTemplateName: string | Nil;\r\n UrlData: McUrlData\r\n}\r\n\r\n/** Get variable from window object so we have a singleton. Otherwise each time a split bundle is imported, another version is created */\r\nexport const PageDataSettings: PageDataSettings = ((window as any).PageDataSettings as Nil | PageDataSettings) ?? {\r\n Server: \"\",\r\n UrlPrefixesToRemove: [],\r\n SfTemplateName: window.AppState.SfTemplateName,\r\n UrlData: {} as McUrlData\r\n};\r\n\r\n/** Save to window object so we have a singleton. Otherwise each time a split bundle is imported, another version is created */\r\nif ((\"PageDataSettings\" in window) === false) {\r\n Object.defineProperty(window, \"PageDataSettings\", { value: PageDataSettings, writable: false });\r\n}\r\n\r\n\r\nexport function initPageDataSettings({ server, urlPrefixesToRemove }: { server: string, urlPrefixesToRemove: string[] }) {\r\n PageDataSettings.Server = server;\r\n PageDataSettings.UrlPrefixesToRemove = urlPrefixesToRemove;\r\n PageDataSettings.UrlData = getMcUrlData({urlPrefixesToRemove});\r\n}", "import { PageDataSettings } from \"./initPageDataSettings.js\";\r\n\r\nexport function getPageName() {\r\n const { Server, UrlData } = PageDataSettings;\r\n return `${Server}/${(UrlData.PagePath === \"\" ? \"home\" : UrlData.PagePath)}`;\r\n}", "import { isBoolean, isEmptyString, isFunction, isNil, isNumber, isString, type Nil } from \"@mcwd/typescript-type-guards\";\r\nimport { \r\n getCookie as libGetCookie, \r\n setCookie as libSetCookie, \r\n removeCookie as libRemoveCookie,\r\n type Types as CookieTypes\r\n} from \"typescript-cookie\";\r\n\r\n\r\nexport type CookieValueType = string | number | boolean | object;\r\n\r\nexport type CookieSameSite = Exclude;\r\n\r\n/** \r\n * The attributes that can be set on a browser cookie \r\n * @property {string?} path\r\n * @property {string?} domain\r\n * @property {(number | Date)?} expires\r\n * @property {CookieSameSite?} sameSite\r\n * @property {boolean?} sameSite\r\n */\r\nexport interface CookieAttributes extends CookieTypes.CookieAttributes {\r\n sameSite?: CookieSameSite;\r\n}\r\n\r\nfunction getAttributesWithDefaults(attributes?: CookieAttributes){\r\n // Set defaults\r\n attributes ??= {};\r\n attributes.domain ??= window.location.host.replace(/^localhost:\\d+$/, \"localhost\");\r\n attributes.path ??= \"/\";\r\n return attributes;\r\n}\r\n\r\n/**\r\n * Deletes the specified browser cookie\r\n * @param {string} name - the name of the cookie to delete\r\n * @param {CookieAttributes?} attributes - the cookie attributes to use for deletion. These must match what was used to set the cookie except \"expires\"\r\n */\r\nexport function removeCookie(name: string, attributes?: CookieAttributes | undefined) {\r\n return libRemoveCookie(name, getAttributesWithDefaults(attributes));\r\n}\r\n\r\nexport type ParseCookieOpt = boolean | ((value: string) => T | Nil);\r\n\r\nexport type CookieReadOptions = {\r\n defaultValue?: (T | Nil),\r\n parse?: (((value: string) => T | Nil) | Nil) | boolean\r\n};\r\n\r\n/**\r\n * Get the value of the specified browser cookie\r\n * @param {string} name: the cookie name to get\r\n * @param {object?} options\r\n * @param {any} options.defaultValue: a default value when the actual value is null or undefined.\r\n * @param {boolean} options.parse: whether or not to JSON.parse the value before returning.\r\n */\r\nexport function getCookie(name: string, options: CookieReadOptions = {}): T | Nil {\r\n const { defaultValue, parse } = options;\r\n\r\n const strValue: string | undefined = libGetCookie(name)?.trim();\r\n if (isNil(strValue) || isEmptyString(strValue)){\r\n return defaultValue;\r\n }\r\n else if (isBoolean(parse)) {\r\n try {\r\n return (JSON.parse(strValue) as T | Nil) ?? defaultValue;\r\n }\r\n catch (err) {\r\n console.log(err);\r\n }\r\n }\r\n else if (isFunction(parse)) {\r\n return parse(strValue) ?? defaultValue;\r\n }\r\n return strValue as T;\r\n}\r\n\r\n/**\r\n * Sets the specified browser cookie value\r\n * @param {string} name - the name of the cookie to delete\r\n * @param {CookieAttributes?} attributes - the cookie attributes to use for deletion. These must match what was used to set the cookie except \"expires\"\r\n */\r\nexport function setCookie(\r\n name: string, \r\n value: T, \r\n attributes?: CookieAttributes\r\n) {\r\n if (isNil(value)){\r\n return removeCookie(name, attributes);\r\n }\r\n else if (isString(value) || isBoolean(value) || isNumber(value)) {\r\n return libSetCookie(name, value, getAttributesWithDefaults(attributes));\r\n }\r\n else {\r\n return libSetCookie(name, JSON.stringify(value), getAttributesWithDefaults(attributes));\r\n }\r\n}", "import { isFunction, isString, type Nil } from \"@mcwd/typescript-type-guards\";\r\n\r\nexport type QueryParamParseFn = (val: string) => (T | undefined);\r\n\r\nexport function getQueryParameter (key: string): string | Nil;\r\nexport function getQueryParameter (\r\n key: string, { defaultValue }: { defaultValue: TDefault }\r\n): string | TDefault;\r\nexport function getQueryParameter (\r\n key: string, { parse }: { parse: QueryParamParseFn }\r\n): TParse | string | Nil;\r\nexport function getQueryParameter (\r\n key: string,\r\n { defaultValue, parse }: { defaultValue: TDefault, parse: QueryParamParseFn }\r\n): TParse | string | TDefault;\r\nexport function getQueryParameter(\r\n key: string,\r\n { defaultValue, parse }: { defaultValue?: TDefault; parse?: QueryParamParseFn } = {}\r\n): TParse | string | TDefault | Nil\r\n{\r\n type ThisReturnType = TParse | string | TDefault | Nil;\r\n const searchParams = new URLSearchParams(window.location.search);\r\n const value = searchParams.get(key)?.trim();\r\n\r\n let returnVal: ThisReturnType;\r\n if (isFunction(parse) && isString(value)) {\r\n try {\r\n returnVal = parse(value);\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n }\r\n else {\r\n returnVal = value as ThisReturnType;\r\n }\r\n return (returnVal ?? defaultValue);\r\n}", "import { getCookie, type CookieReadOptions, type CookieValueType } from \"../../../utils/cookieUtils.js\";\r\nimport { defaultIfNilOrWhiteSpace, isUndefined, type Nil } from \"@mcwd/typescript-type-guards\";\r\nimport { type IValueGetter } from \"./IValueGetter.js\";\r\n\r\nexport abstract class CookiePersistedValue implements IValueGetter {\r\n protected __value: T | Nil;\r\n protected __readCookieBeforeCalculating: boolean;\r\n #cookieName: string;\r\n #cookieReadOptions: CookieReadOptions | Nil;\r\n #defaultValue: TDefault;\r\n constructor({ cookieName, cookieReadOptions = null, readCookieBeforeCalculating, defaultValue }: ({ cookieName: string, cookieReadOptions?: CookieReadOptions | Nil, readCookieBeforeCalculating: boolean, defaultValue: TDefault })) {\r\n this.#cookieName = cookieName;\r\n this.#cookieReadOptions = cookieReadOptions;\r\n this.__value = null;\r\n this.__readCookieBeforeCalculating = readCookieBeforeCalculating;\r\n this.#defaultValue = defaultValue;\r\n }\r\n\r\n get CookieName() {\r\n return this.#cookieName;\r\n }\r\n\r\n getValueFromCookie() {\r\n return getCookie(this.#cookieName, this.#cookieReadOptions ?? undefined);\r\n }\r\n\r\n get defaultValueIfEmpty() {\r\n return this.#defaultValue;\r\n }\r\n\r\n abstract calculateValue(): TCalculate;\r\n\r\n protected getAllValueGetters(): Array<({ getter: () => T | Nil }) | { getter: () => TCalculate } | { defaultValue: TDefault }> {\r\n const defaultValueOrEmptyArray = ((isUndefined(this.#defaultValue) === false) ? [{ defaultValue: this.#defaultValue }] : []);\r\n const calculatedGetter = { getter: () => this.calculateValue() };\r\n const cookieGetter = { getter: () => this.getValueFromCookie() };\r\n if (this.__readCookieBeforeCalculating) {\r\n return [ cookieGetter, calculatedGetter, ... defaultValueOrEmptyArray ];\r\n }\r\n else {\r\n return [ calculatedGetter, cookieGetter, ... defaultValueOrEmptyArray ];\r\n }\r\n }\r\n\r\n get value(): TCalculate extends Nil ? (TDefault extends undefined ? TCalculate : TDefault) : TCalculate {\r\n const val = defaultIfNilOrWhiteSpace(\r\n this.__value,\r\n ... this.getAllValueGetters()\r\n );\r\n this.__value = val;\r\n return val as (TCalculate extends Nil ? (TDefault extends undefined ? TCalculate : TDefault) : TCalculate);\r\n }\r\n}", "import { type CookieReadOptions } from \"../../../utils/cookieUtils.js\";\r\nimport { getQueryParameter } from \"../../../utils/queryParamUtils.js\";\r\nimport { type Nil } from \"@mcwd/typescript-type-guards\";\r\n\r\nimport { CookiePersistedValue } from \"./CookiePersistedValue.js\";\r\n\r\n\r\nexport class CookiePersistedQueryStringValue extends CookiePersistedValue {\r\n #queryName: string;\r\n constructor({ queryName, cookieName, cookieReadOptions = null, defaultValue = \"\" }: ({ queryName: string, cookieName: string, cookieReadOptions?: CookieReadOptions | Nil, defaultValue?: string })) {\r\n super({ cookieName, cookieReadOptions, readCookieBeforeCalculating: false, defaultValue: defaultValue ?? \"\" });\r\n this.#queryName = queryName;\r\n }\r\n\r\n get QueryName() {\r\n return this.#queryName;\r\n }\r\n\r\n getValueFromQuery(): string | Nil {\r\n return getQueryParameter(this.#queryName);\r\n }\r\n\r\n override calculateValue(): string | Nil {\r\n return this.getValueFromQuery();\r\n }\r\n}", "import { type CookieReadOptions, type CookieValueType } from \"../../../utils/cookieUtils.js\";\r\nimport { type Nil } from \"@mcwd/typescript-type-guards\";\r\n\r\nimport { CookiePersistedValue } from \"./CookiePersistedValue.js\";\r\n\r\nexport class GenericCookiePersistedValue extends CookiePersistedValue {\r\n #valueGetter: () => TCalculate;\r\n constructor({ cookieName, cookieReadOptions = null, valueGetter, readCookieBeforeCalculating, defaultValue }: ({ cookieName: string, cookieReadOptions?: CookieReadOptions | Nil, valueGetter: () => TCalculate, readCookieBeforeCalculating: boolean, defaultValue: TDefault })) {\r\n super({ cookieName, cookieReadOptions, readCookieBeforeCalculating, defaultValue });\r\n this.#valueGetter = valueGetter;\r\n }\r\n\r\n getValueFromGetterFn(): TCalculate {\r\n return this.#valueGetter();\r\n }\r\n\r\n override calculateValue(): TCalculate {\r\n return this.getValueFromGetterFn();\r\n }\r\n}", "import { isFunction } from \"@mcwd/typescript-type-guards\";\r\n\r\nexport function getExternalReferrer () {\r\n const [{ referrer = \"\" }, { protocol, host }] = [document, location];\r\n const referrerIsExternalDomain = (referrer !== \"\") && referrer.indexOf(protocol + \"//\" + host) !== 0;\r\n return referrerIsExternalDomain ? referrer : \"\";\r\n}\r\n\r\nexport function getExternalReferrerDomainOnly () {\r\n const referrer = getExternalReferrer();\r\n if (referrer === \"\") {\r\n return \"\";\r\n }\r\n\r\n if (URL && (\"canParse\" in URL) && isFunction(URL.canParse) && URL.canParse(referrer)) {\r\n return (new URL(referrer)).origin;\r\n }\r\n else {\r\n try { return new URL(referrer).origin; }\r\n catch { /* do nothing */ }\r\n }\r\n return \"\";\r\n}", "import { type Nil } from \"@mcwd/typescript-type-guards\";\r\nimport { getQueryParameter } from \"../../../utils/queryParamUtils.js\";\r\n\r\nexport function getGclidQueryParameter(): string | Nil {\r\n const gclsrcParam = getQueryParameter('gclsrc');\r\n const isGclsrcValid = !gclsrcParam || gclsrcParam.indexOf('aw') !== -1;\r\n if (!isGclsrcValid) {\r\n return null;\r\n }\r\n return getQueryParameter('gclid');\r\n}\r\n", "import { defaultIfNilOrWhiteSpace, isObject, isString, type Nil } from \"@mcwd/typescript-type-guards\";\r\nimport { CountryLocale, ExtendedLocaleCountry, LanguageCountryLocale, SiteLocale } from \"../../types-and-definitions/locale-defs/Locales.js\";\r\nimport { type IValueGetter } from \"./types-and-classes/IValueGetter.js\";\r\n\r\nimport { getGeoLocationDataSync } from \"../onetrust/getOneTrustValues.js\";\r\n\r\ntype GeoLocationData = { countryCode: string, stateCode?: string | Nil };\r\n\r\nexport const GeoLocation = {\r\n get defaultValueIfEmpty() {\r\n return null;\r\n },\r\n calculateValue(): GeoLocationData | Nil {\r\n const otGeoLocData = getGeoLocationDataSync();\r\n const countryCode = otGeoLocData?.countryCode?.trim()?.toUpperCase();\r\n const stateCode = otGeoLocData?.stateCode?.trim()?.toUpperCase();\r\n if (isString(countryCode) && countryCode !== \"\") {\r\n if (isString(stateCode) && stateCode !== \"\") {\r\n return { countryCode, stateCode };\r\n }\r\n else {\r\n return { countryCode };\r\n }\r\n }\r\n else {\r\n return null;\r\n }\r\n },\r\n get value() {\r\n return defaultIfNilOrWhiteSpace(\r\n this.calculateValue(),\r\n { defaultValue: this.defaultValueIfEmpty }\r\n );\r\n }\r\n} as const satisfies IValueGetter;\r\n\r\nexport const BrowserPreferredLanguage = {\r\n get defaultValueIfEmpty() {\r\n return null;\r\n },\r\n calculateValue(): LanguageCountryLocale | Nil {\r\n const acceptedLangs = LanguageCountryLocale;\r\n if (\"languages\" in navigator) {\r\n const langs = navigator.languages.filter(l => {\r\n return (acceptedLangs as readonly string[]).includes(l);\r\n });\r\n // If matching multiple languages, no inference can be made, so only return a value if a single language is matched.\r\n if (langs.length === 1) {\r\n return langs.shift() as LanguageCountryLocale;\r\n }\r\n }\r\n // Return the primary language if it matches\r\n if (\"language\" in navigator && (acceptedLangs as readonly string[]).includes(navigator.language)) {\r\n return navigator.language as LanguageCountryLocale;\r\n }\r\n return null;\r\n },\r\n get value() {\r\n return defaultIfNilOrWhiteSpace(\r\n this.calculateValue(),\r\n { defaultValue: this.defaultValueIfEmpty }\r\n );\r\n }\r\n} as const satisfies IValueGetter;\r\n\r\n\r\n\r\nexport const InferredSiteLang = {\r\n get defaultValueIfEmpty() {\r\n return null;\r\n },\r\n\r\n calculateFromOtGeoQuerystring() {\r\n let otgeo = (new URLSearchParams(window.location.search)).get(\"otgeo\");\r\n if (isString(otgeo)) {\r\n otgeo = (otgeo.toLowerCase() === \"uk\" ? \"gb\" : otgeo);\r\n let sLocale = SiteLocale.getByCountryLocale(otgeo as CountryLocale);\r\n sLocale ??= SiteLocale.getByExtendedCountryLocale(otgeo as ExtendedLocaleCountry);\r\n if (isObject(sLocale)) {\r\n return sLocale.LanguageCountryLocale;\r\n }\r\n }\r\n return null;\r\n },\r\n calculateFromGeoLocation() {\r\n const geoLocation = GeoLocation.value;\r\n if (isObject(geoLocation) && isString(geoLocation.countryCode) && geoLocation.countryCode.trim() !== \"\") {\r\n const sLocale = SiteLocale.getByCountryLocale(geoLocation.countryCode as CountryLocale);\r\n if (isObject(sLocale)) {\r\n return sLocale.LanguageCountryLocale;\r\n }\r\n }\r\n return null;\r\n },\r\n calculateFromGeoLocationExtendedRegion() {\r\n const geoLocation = GeoLocation.value;\r\n if (isObject(geoLocation) && isString(geoLocation.countryCode) && geoLocation.countryCode.trim() !== \"\") {\r\n return SiteLocale.getByExtendedCountryLocale(geoLocation.countryCode as ExtendedLocaleCountry)?.LanguageCountryLocale ?? null;\r\n }\r\n return null;\r\n },\r\n calculateFromBrowserLanguage(): LanguageCountryLocale | Nil {\r\n return BrowserPreferredLanguage.value;\r\n },\r\n calculateValue(): LanguageCountryLocale | Nil {\r\n return defaultIfNilOrWhiteSpace(\r\n this.calculateFromOtGeoQuerystring(),\r\n { getter: () => this.calculateFromGeoLocation() },\r\n { getter: () => this.calculateFromBrowserLanguage() },\r\n { getter: () => this.calculateFromGeoLocationExtendedRegion() }\r\n );\r\n },\r\n get value() {\r\n return defaultIfNilOrWhiteSpace(\r\n this.calculateValue(),\r\n { defaultValue: this.defaultValueIfEmpty }\r\n );\r\n }\r\n} as const satisfies {\r\n calculateFromOtGeoQuerystring(): LanguageCountryLocale | Nil;\r\n calculateFromGeoLocation(): LanguageCountryLocale | Nil;\r\n calculateFromGeoLocationExtendedRegion(): LanguageCountryLocale | Nil;\r\n calculateFromBrowserLanguage(): LanguageCountryLocale | Nil;\r\n} & IValueGetter;\r\n", "import type { Nil } from \"@mcwd/typescript-type-guards\";\r\n\r\nexport interface OneTrustGroupData {\r\n id: string;\r\n name?: string | Nil;\r\n enabled?: boolean | Nil;\r\n}\r\nexport interface OptanonConsentCookieObject {\r\n isGpcEnabled?: boolean | Nil;\r\n datestamp?: Date | Nil;\r\n version?: string | Nil;\r\n browserGpcFlag?: boolean | Nil;\r\n isIABGlobal?: boolean | Nil;\r\n hosts?: string | Nil;\r\n consentId?: string | Nil;\r\n interactionCount?: number | Nil;\r\n landingPath?: string | Nil;\r\n GPPCookiesCount?: number | Nil;\r\n groups?: OneTrustGroupData[] | Nil;\r\n AwaitingReconsent?: boolean | Nil; \r\n geolocation?: { countryCode?: string | Nil, stateCode?: string | Nil } | Nil;\r\n}\r\n\r\nexport const OptanonConsentCookieProp = [\r\n 'isGpcEnabled', 'datestamp', 'version', 'browserGpcFlag', 'isIABGlobal', 'hosts', 'consentId', 'interactionCount', 'landingPath', 'GPPCookiesCount', 'groups', 'AwaitingReconsent', 'geolocation'\r\n] as const satisfies readonly (keyof OptanonConsentCookieObject)[]; \r\n\r\nexport type OptanonConsentCookieProp = typeof OptanonConsentCookieProp[number];", "import { isBoolean, isNil, isNumber, isString, type Nil } from \"@mcwd/typescript-type-guards\";\r\n\r\n\r\nexport function parseBool(value: unknown, { parseFromNumber = false } = {}): boolean | null {\r\n if (isNil(value)) {\r\n return null;\r\n }\r\n if (isBoolean(value)) return value;\r\n if (isString(value)) {\r\n if (/^true|false$/i.test(value)) return /^true$/i.test(value);\r\n if (/^0|1$/.test(value)) {\r\n value = parseInt(value);\r\n }\r\n }\r\n if (parseFromNumber && isNumber(value) && (value === 0 || value === 1)) {\r\n return value === 1;\r\n }\r\n return null;\r\n}\r\n\r\n\r\nexport function parseNumber(value: unknown, { parseFromBoolean = false } = {}): number | Nil {\r\n if (isNil(value) || isNumber(value)) {\r\n return value;\r\n }\r\n if (isString(value)) {\r\n const val = Number(value);\r\n if (!Number.isNaN(val)) {\r\n return val;\r\n }\r\n value = parseFromBoolean ? parseBool(value) : value;\r\n }\r\n if (parseFromBoolean && isBoolean(value)) {\r\n return Number(value);\r\n }\r\n return null;\r\n}", "import { createReverseObjectMap, type ReverseObjectMap } from \"@mcwd/typescript-type-guards\";\r\n\r\nconst onetrust_category_id_to_name_mapping = {\r\n \"C0001\": \"Strictly Necessary\",\r\n \"C0002\": \"Performance\",\r\n \"C0003\": \"Functional\",\r\n \"C0004\": \"Targeting\",\r\n \"C0005\": \"Social Media\"\r\n} as const;\r\n\r\ntype onetrust_category_id_to_name_mapping = typeof onetrust_category_id_to_name_mapping;\r\ntype onetrust_category_name_to_id_mapping = ReverseObjectMap;\r\n\r\nconst onetrust_category_name_to_id_mapping = createReverseObjectMap(onetrust_category_id_to_name_mapping) as onetrust_category_name_to_id_mapping;\r\n\r\ntype onetrust_category_id = keyof onetrust_category_id_to_name_mapping;\r\ntype onetrust_category_name = onetrust_category_id_to_name_mapping[onetrust_category_id];\r\n\r\n\r\nconst onetrust_category_id = Object.keys(onetrust_category_id_to_name_mapping) as onetrust_category_id[];\r\nconst onetrust_category_name = Object.values(onetrust_category_id_to_name_mapping) as onetrust_category_name[];\r\n\r\n\r\n\r\nObject.freeze(onetrust_category_id_to_name_mapping);\r\nObject.freeze(onetrust_category_name_to_id_mapping);\r\nObject.freeze(onetrust_category_id);\r\nObject.freeze(onetrust_category_name);\r\n\r\n\r\nexport type OneTrustCategoryIdToNameMapping = typeof onetrust_category_id_to_name_mapping;\r\nexport const OneTrustCategoryIdToNameMapping = onetrust_category_id_to_name_mapping;\r\n\r\nexport type OneTrustCategoryNameToIdMapping = typeof onetrust_category_name_to_id_mapping;\r\nexport const OneTrustCategoryNameToIdMapping = onetrust_category_name_to_id_mapping;\r\n\r\nexport type OneTrustCategoryId = keyof OneTrustCategoryIdToNameMapping;\r\nexport const OneTrustCategoryId = onetrust_category_id;\r\n\r\nexport type OneTrustCategoryName = OneTrustCategoryIdToNameMapping[OneTrustCategoryId]; \r\nexport const OneTrustCategoryName = onetrust_category_name as OneTrustCategoryName[];\r\n\r\nexport type OneTrustCategoryLabels = `${OneTrustCategoryName} Cookies`;\r\nexport const OneTrustCategoryLabels = Object.freeze(OneTrustCategoryName.map(n => `${n} Cookies`)) as OneTrustCategoryLabels[];", "import { addLoggerFilterOverride } from \"../../utils/Logger/LoggerTags.js\";\r\nimport { Logger } from \"../../utils/Logger/Logger.js\";\r\n\r\nconst logger_otLabelBackgroundColor = \"#8C7284\";\r\n\r\nexport const OneTrustVerboseTag = \"OneTrustConsent\";\r\n\r\nexport const onetrustLogger = new Logger({\r\n tags: { category: \"OneTrust\" },\r\n prefixStrings: [\"OneTrust\"],\r\n prefixStyles: [Logger.StylePresets.ButtonLabel({ 'background-color': logger_otLabelBackgroundColor })]\r\n});\r\n\r\nexport const onetrustVerboseLogger = onetrustLogger.withTags({ verboseDebug: OneTrustVerboseTag });\r\n\r\n\r\naddLoggerFilterOverride({\r\n verboseDebug: [OneTrustVerboseTag]\r\n}, false);", "import { getCookie, removeCookie } from \"../../utils/cookieUtils.js\";\r\nimport { isArray, isNil, isNotNil, isObject, isString, type Nil, type PartialWithNil } from '@mcwd/typescript-type-guards';\r\nimport { OptanonConsentCookieProp, type OneTrustGroupData, type OptanonConsentCookieObject } from \"./OptanonContentCookieTypes.js\";\r\nimport { parseBool, parseNumber } from \"@mcwd/util-parse-and-convert\";\r\nimport { OneTrustCategoryId, OneTrustCategoryIdToNameMapping, OneTrustCategoryName } from \"./OneTrustCategoryIdToNameMapping.js\";\r\nimport { onetrustLogger as logger, onetrustVerboseLogger as verboseLogger } from \"./oneTrustLogger.js\";\r\n\r\n(window as any).getCookie = getCookie;\r\n(window as any).removeCookie = removeCookie;\r\n\r\nfunction parseCookieAsObject(cookieStr: string | Nil) {\r\n if (isNil(cookieStr) || cookieStr?.trim().length === 0) {\r\n return null;\r\n }\r\n const entries = cookieStr.split(\"&\").map(kv => kv.split('=')) as ([string, string])[];\r\n return (entries.length > 0) ? Object.fromEntries(entries) as Record : null;\r\n}\r\n\r\nfunction parseOneTrustGroups(groupsStr: string | Nil, suppressMissingCategoryError = false): OneTrustGroupData[] | Nil {\r\n if (isNil(groupsStr)) {\r\n return null;\r\n }\r\n const splitGroups: [string, string][] = groupsStr.split(\",\").map(c => c.split(\":\") as [string, string]);\r\n const groupsObj = splitGroups.map(([id, enabled]) => {\r\n if (!(suppressMissingCategoryError) && !(OneTrustCategoryId as readonly string[]).includes(id)) {\r\n logger.error(`Unknown OneTrust Category '${id}'`);\r\n }\r\n const name = (id in OneTrustCategoryIdToNameMapping) ? OneTrustCategoryIdToNameMapping[id] as OneTrustCategoryName : null;\r\n return { id, name, enabled: parseBool(enabled, { parseFromNumber: true }) }; \r\n });\r\n return groupsObj;\r\n}\r\n\r\nfunction parseGeoLocation(geoLocationString: string | Nil): { countryCode?: string | Nil, stateCode?: string | Nil } | Nil {\r\n if (!isString(geoLocationString)) {\r\n return null;\r\n }\r\n const geo = geoLocationString.replace(/;$/, \"\").split(\";\").map(s => s.trim());\r\n if (geo.length === 0 || (geo.length === 1 && geo[0] === \"\") || (geo.length === 2 && geo[0] === \"\" && geo[1] === \"\")) {\r\n return null;\r\n }\r\n else {\r\n return { countryCode: geo[0], stateCode: geo[1] };\r\n }\r\n}\r\n\r\nfunction parseOptanonCookieValue(\r\n key: TKey,\r\n cookieObj: Record\r\n): OptanonConsentCookieObject[TKey] | Nil {\r\n type ThisReturnType = OptanonConsentCookieObject[TKey] | Nil;\r\n const curStrVal: string = cookieObj[key];\r\n if (!OptanonConsentCookieProp.includes(key)) {\r\n return curStrVal as OptanonConsentCookieObject[TKey] | Nil;\r\n }\r\n if (isString(curStrVal) && curStrVal.trim().length !== 0) {\r\n switch (key) {\r\n case \"isGpcEnabled\": return parseBool(curStrVal) as ThisReturnType;\r\n case \"datestamp\": return new Date(curStrVal.replace(/\\+/g, \" \")) as ThisReturnType;\r\n case \"version\": return curStrVal as ThisReturnType;\r\n case \"browserGpcFlag\": return parseNumber(curStrVal) as ThisReturnType;\r\n case \"isIABGlobal\": return parseBool(curStrVal) as ThisReturnType;\r\n case \"consentId\": return curStrVal as ThisReturnType;\r\n case \"interactionCount\": return parseNumber(curStrVal) as ThisReturnType;\r\n case \"landingPath\": return curStrVal as ThisReturnType;\r\n case \"GPPCookiesCount\": return parseNumber(curStrVal) as ThisReturnType;\r\n case \"groups\": return parseOneTrustGroups(curStrVal) as ThisReturnType;\r\n case \"AwaitingReconsent\": return parseBool(curStrVal) as ThisReturnType;\r\n case \"geolocation\": return parseGeoLocation(curStrVal) as ThisReturnType;\r\n case \"hosts\": return curStrVal as ThisReturnType;\r\n default:\r\n logger.warn(`Unexpected property '${key as string}' in OptanonConsent`);\r\n return curStrVal as ThisReturnType;\r\n }\r\n }\r\n return null;\r\n}\r\nfunction parseOptanonConsentCookieObject(simpleCookieObj: Record | Nil) {\r\n try {\r\n if (isNil(simpleCookieObj)) {\r\n return null;\r\n }\r\n const oneTrustObj = {} as PartialWithNil;\r\n for (const k of Object.keys(simpleCookieObj) as OptanonConsentCookieProp[]) {\r\n const curVal = parseOptanonCookieValue(k, simpleCookieObj);\r\n if (isNotNil(curVal)) {\r\n (oneTrustObj as any)[k] = curVal;\r\n }\r\n }\r\n return (Object.keys(oneTrustObj).length > 0 ? oneTrustObj : null) as OptanonConsentCookieObject | Nil;\r\n }\r\n catch (err) {\r\n logger.error(err);\r\n return null;\r\n }\r\n}\r\n\r\nasync function getHashFromStr(value: string | Nil) {\r\n try {\r\n if (isNil(value)) {\r\n return value;\r\n }\r\n const uftEncodedVal = new TextEncoder().encode(value);\r\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", uftEncodedVal);\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n const hashAsHex = hashArray\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\");\r\n return hashAsHex;\r\n }\r\n catch (err) {\r\n logger.error(err);\r\n return null;\r\n }\r\n}\r\n\r\nconst PreviousOptanonCookieVal = {\r\n asString: null as string | Nil,\r\n asObject: null as OptanonConsentCookieObject | Nil,\r\n asHash: null as string | Nil\r\n};\r\n\r\nfunction removeOldVersionCookies() {\r\n for (const cookieName of [\"OptanonConsent\", \"OptanonAlertBoxClosed\"]) {\r\n removeCookie(cookieName);\r\n const rootCookieOpts = { domain: \".mastercontrol.com\", path: \"/\", sameSite: \"Lax\" as const};\r\n const otherCookieOpts = {\r\n path: \"/\",\r\n sameSite: \"Lax\" as const,\r\n ...(/^[a-z_-]+.mastercontrol.com/.test(window.location.host) ? { domain: window.location.host } : {})\r\n };\r\n for (const cookieOpts of [rootCookieOpts, otherCookieOpts]) {\r\n if (isNotNil(getCookie(cookieName))) {\r\n removeCookie(cookieName, cookieOpts);\r\n }\r\n }\r\n if (isNotNil(getCookie(cookieName))) {\r\n logger.error(`Could not fully remove old ${cookieName} cookie`);\r\n }\r\n }\r\n}\r\n\r\nfunction checkCookieInvalid(simpleCookieObj: Record): boolean {\r\n if (isString(simpleCookieObj.version) && simpleCookieObj.version.trim() === \"6.7.0\") {\r\n return true;\r\n }\r\n else {\r\n const groups = parseOneTrustGroups(simpleCookieObj.groups, true);\r\n const hasNoKnownGroups = isArray(groups) && groups.length > 0 && groups.filter(g => isNil(g.name)).length === groups.length;\r\n return hasNoKnownGroups;\r\n }\r\n}\r\n\r\nasync function updatePreviousOptanonCookieVal({ asString, asHash, asObject }: { asString: string | Nil, asHash?: string | Nil, asObject: OptanonConsentCookieObject | Nil }) {\r\n PreviousOptanonCookieVal.asString = asString;\r\n PreviousOptanonCookieVal.asObject = asObject;\r\n if (isNil(asHash) && isString(asString) && asString !== \"\") {\r\n asHash = await getHashFromStr(asString);\r\n }\r\n PreviousOptanonCookieVal.asHash = asHash;\r\n}\r\n\r\nexport async function readOneTrustCookie() {\r\n let oneTrustCookieStr = getCookie(\"OptanonConsent\")?.trim() ?? null;\r\n let newHash = await getHashFromStr(oneTrustCookieStr);\r\n if (isNotNil(PreviousOptanonCookieVal.asHash) && PreviousOptanonCookieVal.asHash === newHash && isNotNil(PreviousOptanonCookieVal.asString) && isNotNil(PreviousOptanonCookieVal.asObject)) {\r\n return PreviousOptanonCookieVal.asObject;\r\n }\r\n let simpleCookieObj = parseCookieAsObject(oneTrustCookieStr);\r\n if (isObject(simpleCookieObj) && checkCookieInvalid(simpleCookieObj) === true) {\r\n removeOldVersionCookies();\r\n oneTrustCookieStr = null;\r\n simpleCookieObj = null;\r\n newHash = null;\r\n }\r\n const optanonConsentCookieObject = parseOptanonConsentCookieObject(simpleCookieObj);\r\n await updatePreviousOptanonCookieVal({ asString: oneTrustCookieStr, asObject: optanonConsentCookieObject, asHash: newHash });\r\n verboseLogger.debug(\"OptanonConsent value: \", optanonConsentCookieObject);\r\n return optanonConsentCookieObject;\r\n}\r\n\r\nexport function readOneTrustCookieSync() {\r\n const oneTrustCookieStr = getCookie(\"OptanonConsent\")?.trim() ?? null;\r\n if (isNotNil(PreviousOptanonCookieVal.asString)\r\n && isNotNil(PreviousOptanonCookieVal.asObject)\r\n && oneTrustCookieStr === PreviousOptanonCookieVal.asString) {\r\n return PreviousOptanonCookieVal.asObject;\r\n }\r\n const simpleCookieObj = parseCookieAsObject(oneTrustCookieStr);\r\n if (isObject(simpleCookieObj) && checkCookieInvalid(simpleCookieObj) === true) {\r\n removeOldVersionCookies();\r\n updatePreviousOptanonCookieVal({\r\n asString: null,\r\n asObject: null,\r\n asHash: null\r\n }).catch(e => logger.error(e));\r\n return null;\r\n }\r\n const optanonConsentCookieObject = parseOptanonConsentCookieObject(simpleCookieObj);\r\n getHashFromStr(oneTrustCookieStr).then(async newHash => {\r\n return updatePreviousOptanonCookieVal({ asString: oneTrustCookieStr, asObject: optanonConsentCookieObject, asHash: newHash });\r\n }).catch(err => logger.error(err));\r\n verboseLogger.debug(\"OptanonConsent value: \", optanonConsentCookieObject);\r\n return optanonConsentCookieObject;\r\n}", "import { isArray, isNil, isObject, isString, type Nil } from \"@mcwd/typescript-type-guards\";\r\nimport { readOneTrustCookie, readOneTrustCookieSync } from \"./readOneTrustCookie.js\";\r\nimport { OneTrustCategoryId, OneTrustCategoryIdToNameMapping } from \"./OneTrustCategoryIdToNameMapping.js\";\r\nimport type { OneTrustGroupData, OptanonConsentCookieObject } from \"./OptanonContentCookieTypes.js\";\r\nimport type { CookieGroupOTMeta, GoogleConsentOTMeta } from \"./OneTrust.js\";\r\n\r\nimport { onetrustVerboseLogger as verboseLogger } from \"./oneTrustLogger.js\";\r\n\r\nfunction parseOnetrustActiveGroups(activeGroupsStr: string): OneTrustGroupData[] | Nil {\r\n if (!isString(activeGroupsStr)) {\r\n return null;\r\n }\r\n const activeGroupsList = activeGroupsStr.replace(/^,/, \"\").replace(/,$/, \"\").split(/,/);\r\n\r\n const groupsArr: OneTrustGroupData[] = [];\r\n\r\n for (const id of OneTrustCategoryId) {\r\n const name = OneTrustCategoryIdToNameMapping[id];\r\n groupsArr.push({ id, name, enabled: activeGroupsList.includes(id) });\r\n }\r\n\r\n const groupsNotInMapping = activeGroupsList.filter(g => (OneTrustCategoryId as readonly string[]).includes(g) === false);\r\n for (const unknownId of groupsNotInMapping) {\r\n groupsArr.push({ id: unknownId, enabled: true });\r\n }\r\n return groupsArr;\r\n}\r\n\r\nfunction getOneTrustActiveGroups(): OneTrustGroupData[] | Nil {\r\n const activeGroups = window.OnetrustActiveGroups;\r\n if (isString(activeGroups)) {\r\n const groupsVal = parseOnetrustActiveGroups(activeGroups);\r\n if (isArray(groupsVal)) {\r\n return groupsVal;\r\n }\r\n }\r\n else {\r\n verboseLogger.debug(\"OnetrustActiveGroups not set\");\r\n }\r\n return null;\r\n}\r\n\r\nexport interface OneTrustValues extends OptanonConsentCookieObject {\r\n ConsentModel?: { Name?: 'notice only' | 'opt-in' | 'opt-out' | 'implied consent' | 'custom' | unknown } | Nil;\r\n GoogleConsent?: GoogleConsentOTMeta | Nil;\r\n GroupsMeta?: CookieGroupOTMeta[] | Nil;\r\n IsBannerLoaded?: boolean | Nil;\r\n IsConsentLoggingEnabled?: boolean | Nil;\r\n IsIABEnabled?: boolean | Nil;\r\n Language?: { Culture: string } | Nil;\r\n NoBanner?: boolean | Nil;\r\n}\r\n\r\nfunction getOneTrustSdkGeolocation(): OneTrustValues[\"geolocation\"] {\r\n const oneTrustSdk = window.OneTrust;\r\n\r\n if (isObject(oneTrustSdk)) {\r\n const geoResp = oneTrustSdk.geolocationResponse;\r\n if (isObject(geoResp) && isString(geoResp.countryCode) && geoResp.countryCode.trim() !== \"\") {\r\n return geoResp;\r\n }\r\n else {\r\n const geo = oneTrustSdk.getGeolocationData?.();\r\n if (isObject(geo) && isString(geo.country) && geo.country.trim().length > 0) {\r\n return { countryCode: geo.country, stateCode: geo.state };\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction getOneTrustSdkValues(): OneTrustValues | Nil {\r\n const oneTrustSdk = window.OneTrust;\r\n const otValues: OneTrustValues | Nil = {};\r\n \r\n const otActiveGroups = getOneTrustActiveGroups();\r\n if (isArray(otActiveGroups)) {\r\n otValues.groups = otActiveGroups;\r\n }\r\n\r\n if (isObject(oneTrustSdk)) {\r\n const geoResp = getOneTrustSdkGeolocation();\r\n if (isObject(geoResp)) {\r\n otValues.geolocation = geoResp;\r\n }\r\n const domainData = oneTrustSdk.GetDomainData?.();\r\n if (isObject(domainData)) {\r\n const { ConsentModel, GoogleConsent, Groups, IsBannerLoaded, IsConsentLoggingEnabled, IsIABEnabled, Language, NoBanner } = domainData;\r\n Object.assign(otValues, { ConsentModel, GoogleConsent, GroupsMeta: Groups, IsBannerLoaded, IsConsentLoggingEnabled, IsIABEnabled, Language, NoBanner });\r\n }\r\n }\r\n return (Object.keys(otValues).length === 0) ? null : otValues;\r\n}\r\n\r\n\r\n\r\nexport async function getOneTrustValues() {\r\n const optanonCookieValues = await readOneTrustCookie();\r\n const otSdkVals = getOneTrustSdkValues();\r\n\r\n if (isNil(otSdkVals)) {\r\n if (isNil(optanonCookieValues)) {\r\n return null;\r\n }\r\n return { ... optanonCookieValues };\r\n }\r\n if (isArray(otSdkVals.groups)) {\r\n verboseLogger.debug(\"Use updated ot sdk groups value: \", { cookie: optanonCookieValues?.groups, sdk: otSdkVals.groups });\r\n }\r\n else {\r\n verboseLogger.debug(\"Use original optanon cookie groups value: \", { cookie: optanonCookieValues?.groups });\r\n }\r\n verboseLogger.debug(\"Merge cookie and updated ot sdk values: \", { cookie: optanonCookieValues, sdk: otSdkVals });\r\n return { ...(optanonCookieValues ?? {}), ... otSdkVals };\r\n}\r\n\r\nexport function getGeoLocationDataSync() {\r\n const sdkGeo = getOneTrustSdkGeolocation();\r\n if (isObject(sdkGeo)) {\r\n return sdkGeo;\r\n }\r\n else {\r\n const optanonCookieValues = readOneTrustCookieSync();\r\n if (isObject(optanonCookieValues)\r\n && isObject(optanonCookieValues.geolocation)\r\n && isString(optanonCookieValues.geolocation.countryCode)\r\n && (optanonCookieValues.geolocation.countryCode.trim() !== \"\"))\r\n {\r\n return optanonCookieValues.geolocation as { countryCode: string, stateCode?: string | Nil };\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nObject.assign(window, {\r\n getOneTrustActiveGroups,\r\n parseOnetrustActiveGroups,\r\n readOneTrustCookie,\r\n getOneTrustSdkValues,\r\n getOneTrustValues\r\n});", "import * as _CookieValueGetters from \"./cookie-persisted-value-getters.js\";\r\nimport * as _UserPreferenceValueGetters from \"./user-preference-value-getters.js\";\r\n\r\nconst CookieValueGetters = { ..._CookieValueGetters };\r\ntype CookieValueGetters = typeof CookieValueGetters;\r\n\r\nconst UserPreferenceValueGetters = { ..._UserPreferenceValueGetters };\r\ntype UserPreferenceValueGetters = typeof UserPreferenceValueGetters; \r\n\r\nexport const ValueGetters = Object.freeze({\r\n ...CookieValueGetters,\r\n ...UserPreferenceValueGetters\r\n});\r\n\r\n(window as any).__Mc_ValueGetters = ValueGetters;", "import { isNil, isObject, isString, type Nil, type PartialWithNil } from \"@mcwd/typescript-type-guards\";\r\nimport type {\r\n FormWidgetData,\r\n FinalFormTrackingObject,\r\n FormSetupType,\r\n FormObjectWithVideo,\r\n FormObjectWithDocument,\r\n VideoResource,\r\n VideoResourceWithDocs,\r\n AnyFormFinalSetupObject,\r\n} from \"../../widgetDataTs.js\";\r\n\r\nimport { ValueGetters } from \"../../tracking/data/ValueGetters.js\";\r\n\r\nimport { DocumentFormSettingsKey, VideoGatedFormSettingsKey, type AnyFormSettingsKey } from \"../form-settings/form-experience/form-settings-keys.js\";\r\nimport { toValue, ref, computed, watch } from \"vue\";\r\nimport type { MaybeRefOrGetter, ComputedRef, Ref } from \"vue\";\r\n\r\nimport { isWatchable, type RefOrGetter } from \"@mcwd/util-vue\";\r\nimport { HiddenMarketoInputName, type HiddenMarketoInputType } from \"../types/definitions/inputs/marketo-input-names-and-values.js\";\r\nimport { useGatingLevel } from \"../composables/use-gating-level.js\";\r\nimport type { SiteCountryCode, SiteCountryCodeUppercase, LocaleUrlPrefix } from \"../../types-and-definitions/locale-defs/Locales.js\";\r\nimport { useFormLogger } from \"../composables/use-form-logger.js\";\r\nimport type { ILogger } from \"../../utils/Logger/ILogger.js\";\r\nimport type { GatingLevel } from \"../types/definitions/gating/gating-level.js\";\r\nimport type { GatingState } from \"../types/definitions/gating/gating-state.js\";\r\n\r\n// To map the campaignCode\r\nconst utmCampaignMap = {\r\n direct: \"7013x000001xxxDAAQ\",\r\n referral: \"7013x000001xxxIAAQ\",\r\n organicSearch: \"7013x000001xxx8AAA\",\r\n pr: \"7013x000001y8XfAAI\",\r\n social: {\r\n linkedin: \"7013x000002dd4HAAQ\",\r\n facebook: \"7013x000002dd4MAAQ\",\r\n twitter: \"7013x000002dd4RAAQ\",\r\n youtube: \"7013x000002dfbAAAQ\",\r\n },\r\n} as const;\r\n\r\ntype SocialMediaKeys = keyof typeof utmCampaignMap.social;\r\nconst SocialMediaKeys = Object.keys(utmCampaignMap.social) as SocialMediaKeys[];\r\n\r\n\r\n// To test if a useragent string is a mobile device\r\nconst isMobileRegex1 =\r\n /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i;\r\nconst isMobileRegex2 =\r\n // eslint-disable-next-line no-useless-escape\r\n /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i;\r\n\r\n// To test if the cookie source string is one of these search engines\r\nconst top5SearchEngineRegex = /(google|bing|yahoo|baidu|duckduckgo)/i;\r\n\r\n\r\n// To test if the cookie source string matches one of the PR domains\r\nconst prDomainRegex =\r\n /((qualitydigest|ien|contractpharma|pharmtech|qualitymag|mddionline|mytechmagazine|mbtmag|mpo-mag|odtmag|industrytoday|cannibisequipmentnews|massdevice|biopharminternational|medicaldesignbriefs|globenewswire)\\.com)|(manufacturing\\.net)/i;\r\n\r\nexport class HiddenFieldValueBuilder {\r\n hiddenFieldValuesObject: Ref>;\r\n widgetData: RefOrGetter;\r\n widgetSetup: ComputedRef;\r\n widgetTracking: ComputedRef;\r\n\r\n selectedVideo: ComputedRef;\r\n leadSource: string | Nil;\r\n formSettingsKey: AnyFormSettingsKey;\r\n\r\n initialFormGatingLevel: GatingLevel.MarketoForm;\r\n initialFormExperienceGatingLevel: GatingLevel.FormExperience;\r\n formGatingState: MaybeRefOrGetter;\r\n experienceGatingState: MaybeRefOrGetter;\r\n\r\n formTrackingName: Ref;\r\n siteCountryCode: SiteCountryCode;\r\n localeUrlPrefix: LocaleUrlPrefix;\r\n\r\n customDocumentDownloadURL?: string | undefined;\r\n\r\n #logger: ILogger;\r\n\r\n constructor({\r\n formSettingsKey,\r\n widgetData,\r\n leadSource,\r\n formTrackingName,\r\n siteCountryCode,\r\n localeUrlPrefix,\r\n customDocumentDownloadURL\r\n }: {\r\n formSettingsKey: AnyFormSettingsKey;\r\n widgetData: MaybeRefOrGetter;\r\n leadSource: string | Nil;\r\n formTrackingName: string;\r\n siteCountryCode: SiteCountryCode;\r\n localeUrlPrefix: LocaleUrlPrefix;\r\n customDocumentDownloadURL?: string | undefined;\r\n }) {\r\n const { logger } = useFormLogger();\r\n this.#logger = logger;\r\n // Set values from params\r\n this.formSettingsKey = formSettingsKey;\r\n this.widgetData = isWatchable(widgetData) ? widgetData : ref(widgetData);\r\n this.widgetSetup = computed(() => {\r\n return toValue(this.widgetData).setup;\r\n });\r\n this.widgetTracking = computed(() => {\r\n return \"tracking\" in this.widgetSetup.value\r\n ? this.widgetSetup.value.tracking\r\n : null;\r\n });\r\n this.selectedVideo = computed(() => {\r\n if (\"form\" in this.widgetSetup.value) {\r\n const form = this.widgetSetup.value.form;\r\n if (\"video\" in form) {\r\n return (form as FormObjectWithVideo<\"Final\", VideoResource>).video.selected;\r\n }\r\n }\r\n return null;\r\n });\r\n this.leadSource = leadSource;\r\n\r\n const { FormGatingLevel, FormExperienceGatingLevel, CurrentFormExperienceGatingState, CurrentMarketoFormGatingState } = useGatingLevel({ callerLabel: \"hiddenFieldValueBuilder\" });\r\n\r\n this.initialFormGatingLevel = FormGatingLevel;\r\n this.initialFormExperienceGatingLevel = FormExperienceGatingLevel;\r\n this.formGatingState = CurrentMarketoFormGatingState;\r\n this.experienceGatingState = CurrentFormExperienceGatingState;\r\n\r\n this.formTrackingName = ref(formTrackingName);\r\n\r\n this.siteCountryCode = siteCountryCode;\r\n this.localeUrlPrefix = localeUrlPrefix;\r\n\r\n this.customDocumentDownloadURL = customDocumentDownloadURL;\r\n this.hiddenFieldValuesObject = ref({});\r\n \r\n watch(\r\n [() => toValue(this.widgetData), () => toValue(this.linkAttributionCampaign), () => toValue(this.cookieSourceString)],\r\n () => {\r\n const prevValue = this.hiddenFieldValuesObject.value;\r\n const newValue = this.#getValues();\r\n\r\n if (isNil(prevValue) && (isNil(newValue) || Object.keys(newValue).length === 0)) {\r\n return;\r\n }\r\n if (this.#checkValuesEqual(newValue, prevValue) === false) { \r\n this.#logger.table(newValue);\r\n this.hiddenFieldValuesObject.value = newValue;\r\n }\r\n },\r\n { immediate: true }\r\n );\r\n }\r\n\r\n #checkValuesEqual(newValue: PartialWithNil, prevValue: PartialWithNil) {\r\n const newKeys = Object.keys(newValue) as (keyof typeof newValue)[];\r\n const prevKeys = Object.keys(prevValue) as (keyof typeof prevValue)[];\r\n if (newKeys.length !== prevKeys.length) {\r\n return false;\r\n }\r\n newKeys.sort();\r\n prevKeys.sort();\r\n const allKeysEqual = newKeys.every((key, idx) => (key === prevKeys[idx]));\r\n if (allKeysEqual) {\r\n return newKeys.every(key => {\r\n const nVal = newValue[key];\r\n const pVal = prevValue[key];\r\n return nVal === pVal;\r\n });\r\n }\r\n return false;\r\n }\r\n\r\n get linkAttributionCampaign(): string {\r\n return ValueGetters.UtmCampaign.value;\r\n }\r\n get cookieSourceString(): string {\r\n return ValueGetters.ExternalReferrer.value;\r\n }\r\n\r\n // Test the cookie source string with regex\r\n get isPrDomain(): boolean {\r\n return prDomainRegex.test(this.cookieSourceString);\r\n }\r\n get isTop5Search(): boolean {\r\n return top5SearchEngineRegex.test(this.cookieSourceString);\r\n }\r\n get isSocialMedia(): boolean {\r\n return SocialMediaKeys.filter((val) =>\r\n this.cookieSourceString.includes(val as string)\r\n ).length > 0;\r\n }\r\n get SocialMediaName(): SocialMediaKeys | Nil {\r\n const names = SocialMediaKeys.filter((val) =>\r\n this.cookieSourceString.includes(val as string)\r\n );\r\n if (names.length > 0) {\r\n return names[0];\r\n }\r\n return null;\r\n }\r\n\r\n // Return the campaign code based on a variety of criteria\r\n get campaignCode(): string {\r\n // Hierarchy: utm_campaign > source_string (any value) > direct\r\n\r\n // utm_campaign (30 days)\r\n if (this.linkAttributionCampaign !== \"\") {\r\n return this.linkAttributionCampaign;\r\n }\r\n // document.referrer stored in source_string cookie (30 days)\r\n else if (this.cookieSourceString === \"\") {\r\n return utmCampaignMap.direct;\r\n }\r\n else {\r\n if (this.isTop5Search) {\r\n return utmCampaignMap.organicSearch;\r\n }\r\n else if (this.isPrDomain) {\r\n return utmCampaignMap.pr;\r\n }\r\n else if (isString(this.SocialMediaName)) {\r\n return (utmCampaignMap.social[this.SocialMediaName]);\r\n }\r\n else {\r\n return utmCampaignMap.referral;\r\n }\r\n }\r\n }\r\n\r\n // Pull values from widgetData\r\n get offerId(): string {\r\n return this.widgetTracking.value?.offerId ?? \"\";\r\n }\r\n\r\n get setupType(): FormSetupType | \"\" {\r\n const setup = this.widgetSetup.value;\r\n return \"form\" in setup ? setup.type : \"\";\r\n }\r\n get selectedDocuments() {\r\n const setup = this.widgetSetup.value;\r\n if (\"form\" in setup) {\r\n const form = setup.form;\r\n if (\"document\" in form) {\r\n const docForm = form as FormObjectWithDocument<\"Final\">;\r\n const doc = docForm.document;\r\n return doc.selected;\r\n }\r\n }\r\n return [];\r\n }\r\n\r\n // Check to see if the form contains a video or documents\r\n get formHasVideo(): boolean {\r\n return isObject(this.selectedVideo.value);\r\n }\r\n get formHasDocuments(): boolean {\r\n return this.selectedDocuments?.length > 0;\r\n }\r\n\r\n // Check the userAgent to see if it is a mobile device: https://stackoverflow.com/questions/11381673/detecting-a-mobile-browser AND http://detectmobilebrowsers.com/mobile\r\n get isMobileDevice(): boolean {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n const userAgent =\r\n (navigator.userAgent ||\r\n navigator.vendor ||\r\n (window as { opera?: string }).opera) ??\r\n \"\";\r\n return (\r\n isMobileRegex1.test(userAgent) ||\r\n isMobileRegex2.test(userAgent.substring(0, 4))\r\n );\r\n }\r\n\r\n // pageName is assigned to Source_String__c, but to avoid confusion with all the other \"source string\" variables, lets refer to it with the original name until we build the parameters object.\r\n get pageName(): string {\r\n return ValueGetters.PageName.value;\r\n }\r\n\r\n get source__c(): string {\r\n return ValueGetters.UtmSource.value;\r\n }\r\n get medium__c(): string {\r\n return ValueGetters.UtmMedium.value;\r\n }\r\n\r\n get sourceWebsite() {\r\n return `mastercontrol.com ${this.siteCountryCode.toUpperCase()}`;\r\n }\r\n\r\n get gclid(): string {\r\n return ValueGetters.Gclid.value;\r\n }\r\n\r\n get documentTitle(): string {\r\n if (this.formHasDocuments === true && this.selectedDocuments.length === 1) {\r\n return this.selectedDocuments[0].title;\r\n } else if(toValue(this.widgetData).setup.tracking.usePageOfferId){\r\n return \"our content\";\r\n } \r\n else {\r\n return \"\";\r\n }\r\n }\r\n\r\n get documentDownloadUrl(): string {\r\n if(VideoGatedFormSettingsKey.includes(this.formSettingsKey as VideoGatedFormSettingsKey)){\r\n if(this.formHasVideo && this.selectedVideo && this.selectedVideo.value){\r\n const GatedVideoLegacyId = this.selectedVideo.value.legacyId;\r\n return `https://www.mastercontrol.com${this.localeUrlPrefix}/resources/download/?vl=${GatedVideoLegacyId}`;\r\n }\r\n }\r\n if(isString(this.customDocumentDownloadURL)){\r\n return this.customDocumentDownloadURL;\r\n }\r\n if (this.formHasDocuments === false) return \"\";\r\n const documentIds = this.selectedDocuments\r\n .map((item) => item.legacyId)\r\n .join(\",\");\r\n return `https://www.mastercontrol.com${this.localeUrlPrefix}/resources/download/?dl=${documentIds}`;\r\n }\r\n\r\n get roiCalcUrlQueryString(): string | null {\r\n return (this.formSettingsKey === \"qx-roi\" || this.formSettingsKey === \"mx-roi\") ? document.location.search : null;\r\n }\r\n get multiDocSelectorFormFill(): boolean {\r\n if(toValue(this.widgetData).setup.tracking.usePageOfferId) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n get videoTitle(): string{\r\n if(this.formHasVideo && this.selectedVideo && this.selectedVideo.value){\r\n return this.selectedVideo.value.title;\r\n }\r\n return \"\";\r\n }\r\n get getLastOfferName(): string {\r\n if(DocumentFormSettingsKey.includes(this.formSettingsKey as DocumentFormSettingsKey) || this.formSettingsKey === \"video\"){\r\n return this.documentTitle;\r\n }\r\n if(VideoGatedFormSettingsKey.includes(this.formSettingsKey as VideoGatedFormSettingsKey)){\r\n return this.videoTitle;\r\n }\r\n\r\n return \"\";\r\n }\r\n #getValues(): PartialWithNil {\r\n const langCode = this.siteCountryCode.toUpperCase() as SiteCountryCodeUppercase;\r\n const val: PartialWithNil = {\r\n FormName: this.formTrackingName.value,\r\n SiteLanguageCode: langCode,\r\n Website_Language_Code__c: langCode,\r\n Last_Offer_Campaign__c: this.offerId,\r\n source: this.leadSource,\r\n Campaign__c: this.campaignCode,\r\n Medium__c: this.medium__c,\r\n Source__c: this.source__c,\r\n Mobile__c: this.isMobileDevice,\r\n Source_Website: this.sourceWebsite,\r\n Source_String__c: this.pageName,\r\n Last_Offer_Name__c: this.getLastOfferName,\r\n GCLID__c: this.gclid,\r\n initialFormGatingLevel: this.initialFormGatingLevel,\r\n initialFormExperienceGatingLevel: this.initialFormExperienceGatingLevel,\r\n experienceGatingState: toValue(this.experienceGatingState),\r\n formGatingState: toValue(this.formGatingState),\r\n documentDownloadURL: this.documentDownloadUrl,\r\n roi_querystring__c_contact: this.roiCalcUrlQueryString,\r\n multiDocSelectorFormFill: this.multiDocSelectorFormFill,\r\n };\r\n\r\n const emptyProps = (Object.keys(val as object) as HiddenMarketoInputName[]).filter((key) => {\r\n return isNil(val) || isNil(val[key]) || val[key] === \"\";\r\n });\r\n\r\n for (const prop of emptyProps) {\r\n delete val[prop];\r\n }\r\n return val;\r\n }\r\n}", "import { provide, toValue } from \"vue\";\r\n\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionValuesRecord,\r\n type InjectionKeysRecord\r\n} from \"@mcwd/util-vue\";\r\n\r\nimport { useMarketoFormInternals } from \"./use-marketo-form-instance.js\";\r\nimport { isNil } from \"@mcwd/typescript-type-guards\";\r\n\r\nimport { type FormWidgetData } from \"../../widgetDataTs.js\";\r\n\r\nimport { HiddenFieldValueBuilder } from \"../form-logic/hiddenFieldValueBuilder.js\";\r\nimport type { AnyFormSettingsKey } from \"../form-settings/form-experience/form-settings-keys.js\";\r\nimport { useFormSettings } from \"./use-form-settings.js\";\r\nimport { useSiteLanguage } from \"./use-site-language.js\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\n\r\n\r\ntype UseHiddenFieldInitializerInjectionValues = InjectionValuesRecord<{\r\n setHiddenFields: () => void;\r\n hiddenFieldValueBuilder: HiddenFieldValueBuilder;\r\n}>;\r\n\r\ntype UseHiddenFieldInitializerInjectionKeys = InjectionKeysRecord;\r\n\r\nconst UseHiddenFieldInitializerInjectionKeys = CreateInjectionKeysRecord({\r\n setHiddenFields: \"setHiddenFields\",\r\n hiddenFieldValueBuilder: \"hiddenFieldValueBuilder\",\r\n});\r\n\r\nexport function initHiddenFieldInitializer(options: {\r\n formSettingsKey: AnyFormSettingsKey;\r\n widgetData: FormWidgetData,\r\n leadSource?: string;\r\n customDocumentDownloadURL?: string | undefined\r\n}) {\r\n if (checkValuesAlreadyProvided(UseHiddenFieldInitializerInjectionKeys)) {\r\n return;\r\n }\r\n const widgetData = options.widgetData;\r\n const leadSource = options.leadSource;\r\n const formSettingsKey = options.formSettingsKey;\r\n\r\n const { FormSettings } = useFormSettings({ callerLabel: \"hiddenFieldsInitializer\" });\r\n const { siteCountryCode, localeUrlPrefix } = useSiteLanguage({ callerLabel: \"use-hidden-field-initializer\" });\r\n\r\n const customDocumentDownloadURL = options.customDocumentDownloadURL;\r\n const hiddenFieldValueBuilder = new HiddenFieldValueBuilder({\r\n widgetData,\r\n leadSource,\r\n formSettingsKey,\r\n formTrackingName: FormSettings.formTrackingName,\r\n siteCountryCode,\r\n localeUrlPrefix,\r\n customDocumentDownloadURL\r\n });\r\n provide(\r\n UseHiddenFieldInitializerInjectionKeys.hiddenFieldValueBuilder,\r\n hiddenFieldValueBuilder\r\n );\r\n}\r\n\r\nexport function useHiddenFieldInitializer({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger();\r\n try {\r\n callerLabel ??= \"useHiddenFieldInitializer\";\r\n const { MarketoFormObj } = useMarketoFormInternals({ callerLabel });\r\n\r\n const hiddenFieldValueBuilder = injectRequiredWithSelf(UseHiddenFieldInitializerInjectionKeys.hiddenFieldValueBuilder);\r\n\r\n return Object.freeze({\r\n hiddenFieldValueBuilder,\r\n setHiddenFields() {\r\n if (isNil(MarketoFormObj.value)) {\r\n throw new Error(\"MarketoFormObj is Nil!\");\r\n }\r\n const values = toValue(hiddenFieldValueBuilder.hiddenFieldValuesObject);\r\n MarketoFormObj.value.setValues(values);\r\n }\r\n });\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n}", "import type { ValueOf, WithDefault } from \"@mcwd/typescript-type-guards\";\r\nimport type { HtmlInputTypeName } from \"../../../../types-and-definitions/forms/input-element.js\";\r\nimport type { Marketo_InputMeta } from \"./form-input-meta.js\";\r\nimport { UserMarketoInputName, type HiddenMarketoInputName } from \"./marketo-input-names-and-values.js\";\r\n\r\ntype GetInputMetaTypeFromInputName =\r\n TInputName extends UserMarketoInputName \r\n ? Marketo_InputMeta.UserInput\r\n :\r\n TInputName extends HiddenMarketoInputName\r\n ? Marketo_InputMeta.HiddenInput\r\n : never;\r\n\r\ntype MarketoInputMetaType = {\r\n [key in TInputName]: GetInputMetaTypeFromInputName\r\n}\r\n\r\n\r\nfunction createMarketoUserInputMeta<\r\n const TType extends Exclude,\r\n const TMktoName extends UserMarketoInputName\r\n> (\r\n { type, marketoName }: { type: TType, marketoName: TMktoName }\r\n): { readonly type: TType, readonly marketoType: TType, readonly marketoName: TMktoName, readonly name: `eclipse_${ TMktoName }`, readonly isMarketoInput: true };\r\nfunction createMarketoUserInputMeta<\r\n const TType extends Exclude,\r\n const TMktoName extends UserMarketoInputName,\r\n const TMktoType extends HtmlInputTypeName\r\n>(\r\n { type, marketoName, marketoType }: { type: TType, marketoName: TMktoName, marketoType: TMktoType }\r\n): { readonly type: TType, readonly marketoType: TMktoType, readonly marketoName: TMktoName, readonly name: `eclipse_${ TMktoName }`, readonly isMarketoInput: true };\r\nfunction createMarketoUserInputMeta<\r\n const TType extends Exclude,\r\n const TMktoName extends UserMarketoInputName,\r\n const TMktoType extends HtmlInputTypeName | undefined = undefined,\r\n>({ type, marketoName, marketoType }: { type: TType, marketoName: TMktoName, marketoType?: TMktoType })\r\n{\r\n const mktoType = (marketoType ?? type) as WithDefault;\r\n return {\r\n name: `eclipse_${marketoName}` as const,\r\n marketoName,\r\n type,\r\n marketoType: mktoType,\r\n isMarketoInput: true\r\n } as const satisfies Marketo_InputMeta.UserInput>\r\n}\r\n\r\nfunction createMarketoHiddenInputMeta (\r\n { marketoName }: { marketoName: TMktoName }\r\n): { readonly type: \"hidden\", readonly marketoType: \"hidden\", readonly marketoName: TMktoName, readonly name: `eclipse_${ TMktoName }`, readonly isMarketoInput: true }\r\n{\r\n return {\r\n name: `eclipse_${marketoName}` as const,\r\n marketoName,\r\n type: \"hidden\",\r\n marketoType: \"hidden\",\r\n isMarketoInput: true\r\n } as const satisfies Marketo_InputMeta.HiddenInput\r\n}\r\n\r\nexport const MarketoUserInputMetaObject = {\r\n FirstName: createMarketoUserInputMeta({\r\n marketoName: \"FirstName\",\r\n type: \"text\"\r\n }),\r\n LastName: createMarketoUserInputMeta({\r\n marketoName: \"LastName\",\r\n type: \"text\"\r\n }),\r\n Email: createMarketoUserInputMeta({\r\n marketoName: \"Email\",\r\n type: \"email\"\r\n }),\r\n Country: createMarketoUserInputMeta({\r\n marketoName: \"Country\",\r\n type: \"select\"\r\n }),\r\n State: createMarketoUserInputMeta({\r\n marketoName: \"State\",\r\n type: \"select\"\r\n }),\r\n Phone: createMarketoUserInputMeta({\r\n marketoName: \"Phone\",\r\n type: \"tel\"\r\n }),\r\n Company: createMarketoUserInputMeta({\r\n marketoName: \"Company\",\r\n type: \"text\"\r\n }),\r\n Tier__c: createMarketoUserInputMeta({\r\n marketoName: \"Tier__c\",\r\n type: \"select\"\r\n }),\r\n Industry: createMarketoUserInputMeta({\r\n marketoName: \"Industry\",\r\n type: \"select\"\r\n }),\r\n Department__c: createMarketoUserInputMeta({\r\n marketoName: \"Department__c\",\r\n type: \"select\"\r\n }),\r\n Email_Opt_In__c: createMarketoUserInputMeta({\r\n marketoName: \"Email_Opt_In__c\",\r\n type: \"checkbox\"\r\n }),\r\n contactRequested: createMarketoUserInputMeta({\r\n marketoName: \"contactRequested\",\r\n type: \"checkbox\"\r\n }),\r\n Webform_Comments_recent_value__c: createMarketoUserInputMeta({\r\n marketoName: \"Webform_Comments_recent_value__c\",\r\n type: \"textarea\"\r\n }),\r\n Latest_Solution_Interest__c: createMarketoUserInputMeta({\r\n marketoName: \"Latest_Solution_Interest__c\",\r\n type: \"select\"\r\n }),\r\n Partner_Opt_in_Processing__c: createMarketoUserInputMeta({\r\n marketoName: \"Partner_Opt_in_Processing__c\",\r\n type: \"checkbox\"\r\n })\r\n} as const satisfies MarketoInputMetaType;\r\n\r\nexport type MarketoUserInputMetaObject = typeof MarketoUserInputMetaObject;\r\n\r\nexport type MarketoUserInputMeta = MarketoUserInputMetaObject[MarketoInputName];\r\n\r\nexport const MarketoHiddenInputMeta = {\r\n SiteLanguageCode: createMarketoHiddenInputMeta({ marketoName: \"SiteLanguageCode\" }),\r\n FormName: createMarketoHiddenInputMeta({ marketoName: \"FormName\" }),\r\n source: createMarketoHiddenInputMeta({ marketoName: \"source\" }),\r\n Source_String__c: createMarketoHiddenInputMeta({ marketoName: \"Source_String__c\" }),\r\n Source_Website: createMarketoHiddenInputMeta({ marketoName: \"Source_Website\" }),\r\n Medium__c: createMarketoHiddenInputMeta({ marketoName: \"Medium__c\" }),\r\n Campaign__c: createMarketoHiddenInputMeta({ marketoName: \"Campaign__c\" }),\r\n Source__c: createMarketoHiddenInputMeta({ marketoName: \"Source__c\" }),\r\n Last_Offer_Campaign__c: createMarketoHiddenInputMeta({ marketoName: \"Last_Offer_Campaign__c\" }),\r\n Last_Offer_Name__c: createMarketoHiddenInputMeta({ marketoName: \"Last_Offer_Name__c\" }),\r\n documentDownloadURL: createMarketoHiddenInputMeta({ marketoName: \"documentDownloadURL\" }),\r\n Website_Language_Code__c: createMarketoHiddenInputMeta({ marketoName: \"Website_Language_Code__c\" }),\r\n GCLID__c: createMarketoHiddenInputMeta({ marketoName: \"GCLID__c\" }),\r\n Mobile__c: createMarketoHiddenInputMeta({ marketoName: \"Mobile__c\" }),\r\n roi_querystring__c_contact: createMarketoHiddenInputMeta({ marketoName: \"roi_querystring__c_contact\" }),\r\n initialFormGatingLevel: createMarketoHiddenInputMeta({ marketoName: \"initialFormGatingLevel\" }),\r\n initialFormExperienceGatingLevel: createMarketoHiddenInputMeta({ marketoName: \"initialFormExperienceGatingLevel\" }),\r\n formGatingState: createMarketoHiddenInputMeta({ marketoName: \"formGatingState\" }),\r\n experienceGatingState: createMarketoHiddenInputMeta({ marketoName: \"experienceGatingState\" }),\r\n multiDocSelectorFormFill: createMarketoHiddenInputMeta({ marketoName: \"multiDocSelectorFormFill\" }),\r\n} as const satisfies MarketoInputMetaType;\r\n\r\nexport type MarketoHiddenInputMeta = typeof MarketoHiddenInputMeta;\r\n\r\nexport const MarketoAllInputMeta = {\r\n ... MarketoUserInputMetaObject,\r\n ... MarketoHiddenInputMeta\r\n} as const as (MarketoUserInputMetaObject & MarketoHiddenInputMeta);\r\n\r\nexport type MarketoAllInputMeta = typeof MarketoAllInputMeta;\r\n\r\nexport type MarketoAllInputMetaBy =\r\n ValueOf<{ [ K in TInputName ]: MarketoAllInputMeta[ TInputName ] }>;", "import { isString, type AnyHTMLInputElementType } from \"@mcwd/typescript-type-guards\";\r\n\r\nexport type RawInputElementValue =\r\n T extends HTMLInputElement\r\n ? string | number | null\r\n :\r\n T extends HTMLSelectElement\r\n ? string | string[]\r\n :\r\n T extends HTMLTextAreaElement\r\n ? (string | null)\r\n : never;\r\n\r\nexport function getRawInputElementValue<\r\n TInput extends AnyHTMLInputElementType\r\n> (\r\n mktoInput: TInput\r\n): RawInputElementValue{\r\n type ThisReturnType = RawInputElementValue;\r\n let val = $(mktoInput).val() ?? null;\r\n val = isString(val) && val.trim().length === 0 ? null : val;\r\n return val as ThisReturnType;\r\n}\r\n", "import { type AnyHTMLInputElementType, isString } from \"@mcwd/typescript-type-guards\";\r\n\r\nconst InputValueChangeEventName = \"inputValueChange\" as const;\r\n\r\nconst dataInputValueChangeListenerIdAttr = \"data-input-value-change-listener-id\" as const;\r\n\r\nconst inputValueChangeEvent = new Event(InputValueChangeEventName);\r\nconst trackedInputs = new Map();\r\n\r\nfunction removeInputChangeListener(elementOrGuid: AnyHTMLInputElementType | string) {\r\n const inputGuid = isString(elementOrGuid) ? elementOrGuid : elementOrGuid.getAttribute(dataInputValueChangeListenerIdAttr) ?? \"\";\r\n if (inputGuid !== \"\") {\r\n const intervalVal = trackedInputs.get(inputGuid) ?? null;\r\n if (intervalVal !== null) {\r\n clearInterval(intervalVal);\r\n trackedInputs.delete(inputGuid);\r\n }\r\n }\r\n}\r\n\r\nfunction registerInputChangeListener (element: AnyHTMLInputElementType): string {\r\n let prevVal = element.value;\r\n\r\n const inputGuid = \"GUID-\" + crypto.randomUUID();\r\n\r\n element.setAttribute(dataInputValueChangeListenerIdAttr, inputGuid);\r\n trackedInputs.set(inputGuid, setInterval(function () {\r\n if (document.querySelectorAll(`[${dataInputValueChangeListenerIdAttr}='${inputGuid}']`).length === 0) {\r\n //remove listener, if the element no longer exists\r\n removeInputChangeListener(inputGuid);\r\n }\r\n else {\r\n const newVal = element.value;\r\n if (newVal !== prevVal) {\r\n prevVal = newVal;\r\n element.setAttribute(\"value\", newVal);\r\n element.dispatchEvent(inputValueChangeEvent);\r\n }\r\n }\r\n }, 100));\r\n return inputGuid;\r\n}\r\n\r\nexport const inputValueChangedListener = {\r\n addInput: registerInputChangeListener,\r\n removeInput: removeInputChangeListener,\r\n eventName: InputValueChangeEventName\r\n};\r\n\r\n// //example\r\n// inputValueChangedListener.addInput(document.getElementById(\"test\") as AnyHTMLInputElementType); //init observer\r\n// document.getElementById(\"test\")?.addEventListener(inputValueChangedListener.eventName, function (this: AnyHTMLInputElementType) {\r\n// console.log(\"element has new value: \" + this.value);\r\n// });", "import { excludeFrom } from \"@mcwd/typescript-type-guards\";\r\nexport const FormInputTagName = [\"input\", \"select\", \"textarea\"] as const;\r\nexport type FormInputTagName = (typeof FormInputTagName)[number];\r\n\r\nexport const HTMLInputElementTypeAttributeValue = [\r\n \"checkbox\",\r\n \"color\",\r\n \"date\",\r\n \"datetime-local\",\r\n \"email\",\r\n \"file\",\r\n \"hidden\",\r\n \"month\",\r\n \"number\",\r\n \"password\",\r\n \"radio\",\r\n \"range\",\r\n \"search\",\r\n \"submit\",\r\n \"tel\",\r\n \"text\",\r\n \"time\",\r\n \"url\",\r\n \"week\",\r\n] as const;\r\n\r\nexport type HTMLInputElementTypeAttributeValue = (typeof HTMLInputElementTypeAttributeValue)[number];\r\n\r\n\r\nexport const HtmlInputTypeName = [\r\n ...excludeFrom(FormInputTagName, \"input\"),\r\n ...HTMLInputElementTypeAttributeValue\r\n] as const;\r\n\r\nexport type HtmlInputTypeName = typeof HtmlInputTypeName[ number ];\r\n\r\nexport type HtmlInputTypeNameToHTMLElement =\r\n TType extends \"select\"\r\n ? HTMLSelectElement\r\n :\r\n TType extends \"textarea\"\r\n ? HTMLTextAreaElement\r\n :\r\n TType extends HTMLInputElementTypeAttributeValue | \"input\"\r\n ? HTMLInputElement\r\n : never;", "import { type AnyHTMLInputElementType, isStringLiteralOfType, exhaustiveGuard } from \"@mcwd/typescript-type-guards\";\r\nimport { FormInputTagName, HTMLInputElementTypeAttributeValue, type HtmlInputTypeName, type HtmlInputTypeNameToHTMLElement } from \"../../../types-and-definitions/forms/input-element.js\";\r\n\r\nfunction isAnyInputElement (value: HTMLElement): value is AnyHTMLInputElementType {\r\n return value.matches(\"input,select,textarea\");\r\n}\r\n\r\ntype GetSelectorFromInputType = \r\n T extends FormInputTagName\r\n ? T\r\n :\r\n T extends HTMLInputElementTypeAttributeValue\r\n ? `input[type=${T}]`\r\n : never;\r\n\r\nfunction getSelectorFromInputType(\r\n inputType: TInputType\r\n): GetSelectorFromInputType\r\n{\r\n type ThisReturnType = GetSelectorFromInputType;\r\n if (isStringLiteralOfType(inputType, FormInputTagName)){\r\n return inputType as ThisReturnType;\r\n }\r\n else if (isStringLiteralOfType(inputType, HTMLInputElementTypeAttributeValue)){\r\n return `input[type='${ inputType }']` as ThisReturnType;\r\n }\r\n exhaustiveGuard(inputType);\r\n}\r\n\r\nexport function getInputElementArray ({\r\n selector, inputType, parentNode = window.document, allowHiddenInputDefault\r\n}: {\r\n selector: string;\r\n inputType: TInputType;\r\n parentNode: ParentNode;\r\n allowHiddenInputDefault?: TAllowHiddenInputDefault\r\n}): (HtmlInputTypeNameToHTMLElement | ([TAllowHiddenInputDefault] extends [true]? HTMLInputElement : never))[]\r\n{\r\n type ThisReturnType = HtmlInputTypeNameToHTMLElement[];\r\n\r\n const allInputsWithSelector : AnyHTMLInputElementType[] = [ ...parentNode.querySelectorAll(selector) ].filter(isAnyInputElement);\r\n\r\n const expectedMatchingInputSelector = getSelectorFromInputType(inputType);\r\n\r\n const inputsWithInputType: (HtmlInputTypeNameToHTMLElement | ([ TAllowHiddenInputDefault ] extends [ true ] ? HTMLInputElement : never))[] = [];\r\n const inputsNotMatchingType: AnyHTMLInputElementType[] = [];\r\n\r\n for (const el of allInputsWithSelector){\r\n if (el.matches(expectedMatchingInputSelector)){\r\n inputsWithInputType.push(el as HtmlInputTypeNameToHTMLElement);\r\n }\r\n else if (allowHiddenInputDefault !== false)\r\n {\r\n inputsWithInputType.push(el as ([ TAllowHiddenInputDefault ] extends [ true ] ? HTMLInputElement : never));\r\n }\r\n else {\r\n inputsNotMatchingType.push(el);\r\n }\r\n }\r\n if (inputsNotMatchingType.length > 0){\r\n const errors = inputsNotMatchingType.map(el => {\r\n return new Error(`Input element with selector '${ selector }' does not match the expected type '${inputType}'! Type: '${ Object.prototype.toString.call(el) }'`, { cause: el });\r\n });\r\n if (errors.length === 1){\r\n throw errors[0];\r\n }\r\n else {\r\n throw new AggregateError(errors, `Unexpected input types encountered!`);\r\n }\r\n }\r\n\r\n return inputsWithInputType as ThisReturnType;\r\n}\r\n\r\n\r\nexport function getInputElement ({\r\n selector, inputType, parentNode = window.document, allowHiddenInputDefault\r\n}: {\r\n selector: string;\r\n inputType: TInputType;\r\n parentNode: ParentNode;\r\n allowHiddenInputDefault?: TAllowHiddenInputDefault;\r\n}): HtmlInputTypeNameToHTMLElement | null\r\n{\r\n type ThisReturnType = HtmlInputTypeNameToHTMLElement | null;\r\n const matchingInputElements = getInputElementArray({ selector, inputType, parentNode, allowHiddenInputDefault: allowHiddenInputDefault !== false });\r\n\r\n if (matchingInputElements.length === 0) {\r\n return null;\r\n }\r\n if (matchingInputElements.length > 1) {\r\n throw new Error(`Found too many inputs elements matching the selector '${selector}'`, { cause: matchingInputElements });\r\n }\r\n\r\n return matchingInputElements[ 0 ] as ThisReturnType;\r\n}", "import type { ILogger } from \"../../../utils/Logger/ILogger.js\";\r\nimport { MarketoAllInputMeta } from \"../../types/definitions/inputs/marketo-input-meta.js\";\r\nimport type { AnyMarketoInputName } from \"../../types/definitions/inputs/marketo-input-names-and-values.js\";\r\nimport { getInputElement } from \"./getInputElement.js\";\r\nimport type { MarketoInputNameToHTMLElement, MarketoInputTypeByName } from \"./MarketoInputNameToHTMLElement.js\";\r\n\r\nexport function getMarketoInputElement (\r\n marketoFormHtmlElement: HTMLFormElement,\r\n inputName: TInputName,\r\n logger: ILogger\r\n): MarketoInputNameToHTMLElement | null\r\n{\r\n type TInputType = MarketoInputNameToHTMLElement;\r\n type TMarketoInputType = MarketoInputTypeByName;\r\n const expectedMarketoType = MarketoAllInputMeta[ inputName ][ \"marketoType\" ] as TMarketoInputType;\r\n\r\n let inputEl: TInputType | null;\r\n try\r\n {\r\n inputEl = getInputElement({\r\n selector: `#${ inputName },*[name=\"${ inputName }\"]`,\r\n inputType: expectedMarketoType,\r\n parentNode: marketoFormHtmlElement\r\n });\r\n if (inputEl == null)\r\n {\r\n return null;\r\n }\r\n\r\n }\r\n catch (err)\r\n {\r\n logger.error(`Error encountered while trying to get Marketo input element with name '${ inputName }'`, err);\r\n throw new Error(`Error encountered while trying to get Marketo input element with name '${ inputName }'`, { cause: err });\r\n }\r\n const isMarketoField = inputEl.matches(\".mktoField\");\r\n if (isMarketoField === false)\r\n {\r\n logger.warn(`Input ${ inputName } does not have class .mktoField`);\r\n }\r\n return inputEl as TInputType | null;\r\n}\r\n", "import type { default as _jQuery } from \"jquery\";\r\nimport { watchEffect, computed } from 'vue';\r\nimport { type Nil, isNil, exhaustiveGuard, isString, isBoolean, isStringLiteralOfType } from '@mcwd/typescript-type-guards';\r\nimport { inputValueChangedListener } from \"../../../utils/input-value-changed-listener.js\";\r\nimport { AnyMarketoInputName } from \"../../types/definitions/inputs/marketo-input-names-and-values.js\";\r\nimport { useMarketoFormInternals } from \"../use-marketo-form-instance.js\";\r\nimport { useEventListener, computedWithControl } from \"@vueuse/core\";\r\nimport { useFormState } from \"../use-form-state.js\";\r\nimport { useFormLogger } from \"../use-form-logger.js\";\r\nimport { getMarketoInputElement } from \"./getMarketoInputElement.js\";\r\nimport type { MarketoInputNameToHTMLElement } from \"./MarketoInputNameToHTMLElement.js\";\r\n\r\nexport function useMarketoFormInputElement<\r\n TInputName extends AnyMarketoInputName,\r\n TInputElement extends MarketoInputNameToHTMLElement,\r\n TValue extends string | string[] | number | boolean | Nil\r\n> ({\r\n inputName,\r\n initialValue,\r\n callerLabel,\r\n getValue,\r\n}: {\r\n inputName: TInputName;\r\n initialValue: TValue | null;\r\n getValue: (el: TInputElement) => TValue;\r\n callerLabel?: string | undefined;\r\n})\r\n{\r\n const { logger } = useFormLogger({ callerLabel: \"useMarketoFormInputElement\" });\r\n const { MarketoFormObj, MarketoFormHtmlElement } = useMarketoFormInternals({\r\n callerLabel,\r\n });\r\n const { FormState } = useFormState({ callerLabel });\r\n\r\n initialValue = isString(initialValue) && initialValue.trim() === \"\" ? null : initialValue;\r\n const inputElement = computed(() => {\r\n if (isNil(MarketoFormObj.value)){\r\n return null;\r\n }\r\n const $mktoFormJqueryEl = MarketoFormHtmlElement.value;\r\n if (isNil($mktoFormJqueryEl) || $mktoFormJqueryEl.length === 0) {\r\n return null;\r\n }\r\n const formState = FormState.value;\r\n if (isStringLiteralOfType(formState, [\"BeforeLoad\", \"Loading\", \"RegularFormComplete\"])) {\r\n return null;\r\n }\r\n if (isStringLiteralOfType(formState, [\"Setup\", \"RegularForm\", \"BlindForm\"])) {\r\n let el = getMarketoInputElement($mktoFormJqueryEl.get(0), inputName, logger);\r\n if (el === null) {\r\n MarketoFormObj.value?.addHiddenFields({ [inputName]: \"\" });\r\n el = getMarketoInputElement($mktoFormJqueryEl.get(0), inputName, logger);\r\n }\r\n return el as TInputElement | Nil;\r\n } else {\r\n exhaustiveGuard(formState);\r\n }\r\n });\r\n\r\n const setInputVal = (\r\n mktoInput: TInputElement | Nil,\r\n value: string | string[] | number | boolean | Nil\r\n ) => {\r\n if (isNil(mktoInput)) {\r\n return;\r\n }\r\n value = isString(value) && value.trim().length === 0 ? null : value;\r\n const elVal = getValue(mktoInput);\r\n if (value !== elVal) {\r\n if (isBoolean(value)) {\r\n if (\r\n mktoInput instanceof HTMLInputElement &&\r\n mktoInput.type === \"checkbox\"\r\n ) {\r\n $(mktoInput).prop(\"checked\", value);\r\n } else {\r\n $(mktoInput).val(value.toString());\r\n }\r\n } else {\r\n $(mktoInput).val(value ?? \"\");\r\n }\r\n }\r\n };\r\n\r\n const inputValue = computedWithControl(() => inputElement.value, {\r\n get() {\r\n return isNil(inputElement.value)? null : getValue(inputElement.value);\r\n },\r\n set(value: string | string[] | number | boolean | Nil) {\r\n const mktoInput = inputElement.value;\r\n if (isNil(mktoInput)) {\r\n return;\r\n }\r\n const elVal = getValue(mktoInput);\r\n const newVal = (isString(value) && value.trim() === \"\") ? null : value ?? null;\r\n if (newVal === elVal) {\r\n return;\r\n }\r\n setInputVal(mktoInput, newVal);\r\n },\r\n });\r\n\r\n const onInputChange = () => {\r\n inputValue.trigger();\r\n };\r\n\r\n let inputValueInitialized = false;\r\n let inputValueChangedListenerId = \"\";\r\n useEventListener(\r\n inputElement,\r\n inputValueChangedListener.eventName,\r\n onInputChange\r\n );\r\n\r\n watchEffect(() => {\r\n const mktoInput = inputElement.value;\r\n if (isNil(mktoInput)) {\r\n if (inputValueChangedListenerId !== \"\") {\r\n inputValueChangedListener.removeInput(inputValueChangedListenerId);\r\n inputValueChangedListenerId = \"\";\r\n }\r\n return;\r\n }\r\n\r\n if (inputValueChangedListenerId === \"\") {\r\n inputValueChangedListenerId = inputValueChangedListener.addInput(mktoInput);\r\n }\r\n\r\n if (inputValueInitialized === false) {\r\n if (!isNil(initialValue)) {\r\n let elValue = $(mktoInput).val() ?? null;\r\n if (isString(elValue) && elValue.trim() === \"\") {\r\n elValue = null;\r\n }\r\n // TODO: Make sure that we want to keep initial values that marketo provides.\r\n if (elValue === \"\" || isNil(elValue)) {\r\n inputValue.value = initialValue;\r\n }\r\n }\r\n inputValueInitialized = true;\r\n }\r\n });\r\n return { inputElement, inputValue };\r\n}", "import type { default as _jQuery } from \"jquery\";\r\nimport { type Ref, watch, type ComputedRef } from 'vue';\r\nimport { type Nil, isString } from '@mcwd/typescript-type-guards';\r\nimport { AnyMarketoInputName } from \"../../types/definitions/inputs/marketo-input-names-and-values.js\";\r\nimport { useFormLogger } from \"../use-form-logger.js\";\r\nimport { MarketoAllInputMeta } from \"../../types/definitions/inputs/marketo-input-meta.js\";\r\nimport type { HtmlInputTypeNameToHTMLElement } from \"../../../types-and-definitions/forms/input-element.js\";\r\nimport { getRawInputElementValue, type RawInputElementValue } from \"./getRawInputElementValue.js\";\r\nimport type { MarketoInputNameToHTMLElement } from \"./MarketoInputNameToHTMLElement.js\";\r\nimport { useMarketoFormInputElement } from \"./useMarketoFormInputElement.js\";\r\n\r\nexport function useMarketoInputProxy<\r\n TInputName extends AnyMarketoInputName,\r\n TValue extends RawInputElementValue>\r\n> ({\r\n inputName,\r\n proxyInputValue,\r\n callerLabel\r\n}: {\r\n inputName: TInputName;\r\n proxyInputValue: Extract, Ref>>>,\r\n callerLabel?: string | undefined;\r\n});\r\n\r\nexport function useMarketoInputProxy<\r\n TInputName extends AnyMarketoInputName,\r\n TValue extends string | string[] | number | boolean | Nil\r\n> ({\r\n inputName,\r\n proxyInputValue,\r\n callerLabel,\r\n getValue\r\n}: {\r\n inputName: TInputName;\r\n proxyInputValue: Ref;\r\n getValue: (inputEl: MarketoInputNameToHTMLElement) => TValue;\r\n callerLabel?: string | undefined;\r\n});\r\n\r\nexport function useMarketoInputProxy<\r\n TInputName extends AnyMarketoInputName,\r\n TValue extends string | string[] | number | boolean | Nil\r\n>({\r\n inputName,\r\n proxyInputValue,\r\n getValue,\r\n callerLabel\r\n}: {\r\n inputName: TInputName;\r\n proxyInputValue: Ref;\r\n getValue?: (inputEl: MarketoInputNameToHTMLElement) => NoInfer;\r\n callerLabel?: string | undefined;\r\n}) {\r\n type TypeName = MarketoAllInputMeta[ TInputName ][ \"type\" ];\r\n type TInputElement = HtmlInputTypeNameToHTMLElement;\r\n type ValueGetterFn = (el: TInputElement) => TValue;\r\n type ThisReturnType = { inputElement: ComputedRef, proxyInputValue: Ref };\r\n\r\n const { logger } = useFormLogger({ callerLabel: \"useMarketoFormInputProxy\" });\r\n const definedGetValueFn: ValueGetterFn = getValue ?? (\r\n el => (getRawInputElementValue(el) as unknown as TValue)\r\n );\r\n\r\n try {\r\n callerLabel ??= \"useMarketoInputProxy\";\r\n const initialValue =\r\n isString(proxyInputValue.value) && proxyInputValue.value.trim() === \"\"\r\n ? null\r\n : proxyInputValue.value;\r\n const { inputElement, inputValue } = useMarketoFormInputElement({\r\n inputName,\r\n initialValue,\r\n callerLabel,\r\n getValue: definedGetValueFn\r\n });\r\n watch(\r\n () => proxyInputValue.value,\r\n (value) => {\r\n const val = isString(value) && value.trim() === \"\" ? null : value;\r\n inputValue.value = val;\r\n }\r\n );\r\n return { inputElement, proxyInputValue } as ThisReturnType;\r\n } catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? \"unknown\"}`);\r\n throw err;\r\n }\r\n}", "import type { AnyHTMLInputElementType } from \"@mcwd/typescript-type-guards\";\r\n\r\n\r\nexport const getRawInputElementCheckedValue = (mktoInput: AnyHTMLInputElementType) =>\r\n{\r\n return $(mktoInput).prop(\"checked\") === true;\r\n};\r\n", "import type _jquery from \"jquery\";\r\nimport { provide, reactive, ref, type InjectionKey, type Ref } from \"vue\";\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionKeysRecord,\r\n type InjectionValuesRecord,\r\n} from \"@mcwd/util-vue\";\r\n\r\nimport { useMarketoInputProxy } from \"./use-marketo-input-proxy/index.js\";\r\nimport { MarketoAllInputMeta } from \"../types/definitions/inputs/marketo-input-meta.js\";\r\nimport { type MarketoVals, HiddenMarketoInputName } from '../types/definitions/inputs/marketo-input-names-and-values.js';\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\n\r\ntype MarketoHiddenInputValues = {\r\n [Key in EnabledHiddenField]: Required[Key]\r\n};\r\ntype MarketoHiddenFieldRefValues = {\r\n [Key in EnabledHiddenField]: Ref[Key]>\r\n};\r\n\r\ntype UseMarketoHiddenInputsInjectionValues<\r\n EnabledHiddenField extends HiddenMarketoInputName = HiddenMarketoInputName\r\n> = InjectionValuesRecord<{\r\n MarketoHiddenInputValues: MarketoHiddenInputValues\r\n}>;\r\n\r\ntype UseMarketoHiddenInputsInjectionKeys<\r\n EnabledHiddenField extends HiddenMarketoInputName = HiddenMarketoInputName\r\n> = InjectionKeysRecord>;\r\n\r\nconst UseMarketoHiddenInputsInjectionKeys = CreateInjectionKeysRecord({\r\n MarketoHiddenInputValues: \"MarketoHiddenInputValues\",\r\n});\r\n\r\n\r\nexport function initMarketoHiddenInputs(enabledHiddenFields: readonly EnabledHiddenField[]) {\r\n if (checkValuesAlreadyProvided(UseMarketoHiddenInputsInjectionKeys)) {\r\n return;\r\n }\r\n\r\n const HiddenInputsMeta = Object.fromEntries(\r\n enabledHiddenFields.map((field) => [field, MarketoAllInputMeta[field]])\r\n ) as Pick;\r\n\r\n const marketoHiddenInputValues = reactive(\r\n enabledHiddenFields.reduce(\r\n (result: Record>, currentKey: EnabledHiddenField) => {\r\n const proxyModelValue = ref[typeof currentKey]>(null);\r\n useMarketoInputProxy({\r\n inputName: HiddenInputsMeta[currentKey].marketoName,\r\n proxyInputValue: proxyModelValue,\r\n callerLabel: \"initMarketoHiddenInputs\"\r\n });\r\n result[currentKey] = proxyModelValue;\r\n return result;\r\n },\r\n {} as Record\r\n ) as MarketoHiddenFieldRefValues\r\n ) as MarketoHiddenInputValues;\r\n\r\n provide(\r\n UseMarketoHiddenInputsInjectionKeys.MarketoHiddenInputValues as\r\n UseMarketoHiddenInputsInjectionKeys[\"MarketoHiddenInputValues\"],\r\n marketoHiddenInputValues\r\n );\r\n}\r\n\r\nexport function useMarketoHiddenInputs ({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger({ callerLabel: \"useMarketoHiddenInputs\"});\r\n try {\r\n const marketoHiddenInputValues = injectRequiredWithSelf(UseMarketoHiddenInputsInjectionKeys.MarketoHiddenInputValues as InjectionKey>);\r\n return { marketoHiddenInputValues };\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n}", "import type _jquery from \"jquery\";\r\nimport { provide } from \"vue\";\r\nimport { exhaustiveGuard } from \"@mcwd/typescript-type-guards\";\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionKeysRecord,\r\n type InjectionValuesRecord\r\n} from \"@mcwd/util-vue\";\r\nimport type { IFormSettings } from \"../form-settings/form-settings-factory.js\";\r\nimport type { AnyMarketoInputName } from \"../types/definitions/inputs/marketo-input-names-and-values.js\";\r\nimport { MarketoAllInputMeta } from \"../types/definitions/inputs/marketo-input-meta.js\";\r\nimport { MarketoFormSettingsObject } from \"../form-settings/marketo-form/marketo-form-setting.js\";\r\nimport { useGatingLevel } from \"./use-gating-level.js\";\r\nimport { useFormSettings } from \"./use-form-settings.js\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\nimport type { GatingState } from \"../types/definitions/gating/gating-state.js\";\r\n\r\ntype InputsMetaInjectionValues = InjectionValuesRecord<{\r\n FormInputsMeta: Pick;\r\n}>;\r\ntype InputsMetaInjectionKeys = InjectionKeysRecord>;\r\n\r\nconst InputsMetaInjectionKeys = CreateInjectionKeysRecord>({\r\n FormInputsMeta: \"FormInputsMeta\",\r\n});\r\n\r\nfunction getEnabledFields(formSettings: IFormSettings, currentGatingState: GatingState.MarketoForm) {\r\n const marketoFormSettings = MarketoFormSettingsObject[formSettings.marketoFormSettingsKey];\r\n const enabledFieldsObj = marketoFormSettings.enabledFields;\r\n switch (currentGatingState) {\r\n case \"BlindSubmit\": return (\"BlindSubmit\" in enabledFieldsObj) ? enabledFieldsObj.BlindSubmit : [];\r\n case \"PartialGate\": return (\"PartialGate\" in enabledFieldsObj) ? enabledFieldsObj.PartialGate : [];\r\n case \"FullGate\": return (\"FullGate\" in enabledFieldsObj) ? enabledFieldsObj.FullGate : [];\r\n default: exhaustiveGuard(currentGatingState);\r\n }\r\n}\r\n\r\nexport function initInputsMetaData() {\r\n if (checkValuesAlreadyProvided(InputsMetaInjectionKeys)) {\r\n return;\r\n }\r\n\r\n const { FormSettings } = useFormSettings({ callerLabel: \"initInputsMetaData\" });\r\n const { CurrentMarketoFormGatingState } = useGatingLevel({ callerLabel: \"initInputsMetaData\" });\r\n \r\n const enabledFields = getEnabledFields(FormSettings as IFormSettings, CurrentMarketoFormGatingState.value);\r\n\r\n type EnabledField = typeof enabledFields[number];\r\n const FormInputsMeta = Object.fromEntries(\r\n enabledFields.map((field) => [field, MarketoAllInputMeta[field]] as const)\r\n ) as Pick;\r\n\r\n provide(InputsMetaInjectionKeys.FormInputsMeta as InputsMetaInjectionKeys[\"FormInputsMeta\"], FormInputsMeta);\r\n}\r\n\r\nexport function useInputsMetaData ({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger();\r\n try {\r\n callerLabel ??= \"useInputsMetaData\";\r\n const { FormSettings } = useFormSettings({ callerLabel });\r\n const { CurrentMarketoFormGatingState } = useGatingLevel({ callerLabel });\r\n const enabledFields = getEnabledFields(FormSettings as IFormSettings, CurrentMarketoFormGatingState.value);\r\n\r\n type EnabledField = typeof enabledFields[number];\r\n\r\n const FormInputsMeta = injectRequiredWithSelf(InputsMetaInjectionKeys.FormInputsMeta as InputsMetaInjectionKeys[\"FormInputsMeta\"]);\r\n return { FormInputsMeta };\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n}", "import type _jquery from \"jquery\";\r\nimport { computed, provide, type ComputedRef, type DeepReadonly, readonly } from \"vue\";\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionKeysRecord,\r\n type InjectionValuesRecord\r\n} from \"@mcwd/util-vue\";\r\n\r\nimport { useFormSettings } from \"./use-form-settings.js\";\r\nimport { useGatingLevel } from \"./use-gating-level.js\";\r\nimport { UserMarketoInputName, HiddenMarketoInputName, AnyMarketoInputName } from \"../types/definitions/inputs/marketo-input-names-and-values.js\";\r\nimport { isStringArray } from \"@mcwd/typescript-type-guards\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\nimport type { GatingState } from \"../types/definitions/gating/gating-state.js\";\r\n\r\ntype UseEnabledFieldsInjectionValues<\r\n TEnabledUserField extends string = string,\r\n TEnabledHiddenField extends string = string\r\n> = InjectionValuesRecord<{\r\n allEnabledFields: DeepReadonly>>,\r\n enabledUserFields: DeepReadonly>>,\r\n enabledHiddenFields: DeepReadonly>>\r\n}>;\r\n\r\ntype UseEnabledFieldsInjectionKeys<\r\n TEnabledUserField extends string = string,\r\n TEnabledHiddenField extends string = string\r\n> = InjectionKeysRecord>;\r\n\r\nconst UseEnabledFieldsInjectionKeys = CreateInjectionKeysRecord({\r\n allEnabledFields: \"allEnabledFields\",\r\n enabledUserFields: \"enabledUserFields\",\r\n enabledHiddenFields: \"enabledHiddenFields\",\r\n});\r\n\r\n\r\nexport function initEnabledFields(){\r\n if (checkValuesAlreadyProvided(UseEnabledFieldsInjectionKeys)) {\r\n return;\r\n }\r\n const { FormSettings } = useFormSettings({ callerLabel: \"setFormUserInputValuesFromSettings\" });\r\n const { CurrentMarketoFormGatingState } = useGatingLevel({ callerLabel: \"setFormUserInputValuesFromSettings\" });\r\n\r\n const enabledFieldsObj = FormSettings.enabledFields as unknown as { [key in GatingState.MarketoForm]?: AnyMarketoInputName };\r\n\r\n const allEnabledFields = computed(() => {\r\n const gatingLevel = CurrentMarketoFormGatingState.value;\r\n if (gatingLevel in enabledFieldsObj) {\r\n const fields = enabledFieldsObj[gatingLevel];\r\n if (isStringArray(fields)) {\r\n return fields as AnyMarketoInputName[];\r\n }\r\n }\r\n throw new Error(\r\n `Gating State for \"${gatingLevel}\" does not exist in the enabled fields object for formExperience '${FormSettings.formSettingsKey}'`\r\n );\r\n });\r\n\r\n const enabledUserFields = computed(() => {\r\n return allEnabledFields.value.filter(f =>\r\n (UserMarketoInputName as readonly string[]).includes(f)\r\n ) as UserMarketoInputName[];\r\n });\r\n\r\n const enabledHiddenFields = computed(() => {\r\n return allEnabledFields.value.filter(f =>\r\n (HiddenMarketoInputName as readonly string[]).includes(f)\r\n ) as HiddenMarketoInputName[];\r\n });\r\n\r\n provide(UseEnabledFieldsInjectionKeys.allEnabledFields, readonly(allEnabledFields));\r\n provide(UseEnabledFieldsInjectionKeys.enabledUserFields, readonly(enabledUserFields));\r\n provide(UseEnabledFieldsInjectionKeys.enabledHiddenFields, readonly(enabledHiddenFields));\r\n}\r\n\r\nexport function useEnabledFields({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger();\r\n try {\r\n callerLabel ??= \"useEnabledFields\";\r\n\r\n const allEnabledFields = injectRequiredWithSelf(\r\n UseEnabledFieldsInjectionKeys.allEnabledFields as UseEnabledFieldsInjectionKeys<\r\n Extract,\r\n Extract\r\n >[\"allEnabledFields\"]\r\n );\r\n const enabledUserFields = injectRequiredWithSelf(\r\n UseEnabledFieldsInjectionKeys.enabledUserFields as UseEnabledFieldsInjectionKeys<\r\n Extract,\r\n Extract\r\n >[\"enabledUserFields\"]\r\n );\r\n const enabledHiddenFields = injectRequiredWithSelf(\r\n UseEnabledFieldsInjectionKeys.enabledHiddenFields as UseEnabledFieldsInjectionKeys<\r\n Extract,\r\n Extract\r\n >[\"enabledHiddenFields\"]\r\n );\r\n return {\r\n allEnabledFields,\r\n enabledUserFields,\r\n enabledHiddenFields\r\n };\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n}", "export const CountryOptionKey = [\r\n \"United States\",\r\n \"United Kingdom\",\r\n \"Canada\",\r\n \"Afghanistan\",\r\n \"Aland Islands\",\r\n \"Albania\",\r\n \"Algeria\",\r\n \"American Samoa\",\r\n \"Andorra\",\r\n \"Angola\",\r\n \"Anguilla\",\r\n \"Antarctica\",\r\n \"Antigua and Barbuda\",\r\n \"Argentina\",\r\n \"Armenia\",\r\n \"Aruba\",\r\n \"Australia\",\r\n \"Austria\",\r\n \"Azerbaijan\",\r\n \"Bahamas\",\r\n \"Bahrain\",\r\n \"Bangladesh\",\r\n \"Barbados\",\r\n \"Belarus\",\r\n \"Belgium\",\r\n \"Belize\",\r\n \"Benin\",\r\n \"Bermuda\",\r\n \"Bhutan\",\r\n \"Bolivia, Plurinational State of\",\r\n \"Bonaire, Sint Eustatius and Saba\",\r\n \"Bosnia and Herzegovina\",\r\n \"Botswana\",\r\n \"Bouvet Island\",\r\n \"Brazil\",\r\n \"British Indian Ocean Territory\",\r\n \"Brunei Darussalam\",\r\n \"Bulgaria\",\r\n \"Burkina Faso\",\r\n \"Burundi\",\r\n \"Cambodia\",\r\n \"Cameroon\",\r\n \"Cape Verde\",\r\n \"Cayman Islands\",\r\n \"Central African Republic\",\r\n \"Chad\",\r\n \"Chile\",\r\n \"China\",\r\n \"Christmas Island\",\r\n \"Cocos (Keeling) Islands\",\r\n \"Colombia\",\r\n \"Comoros\",\r\n \"Congo\",\r\n \"Congo, Democratic Republic\",\r\n \"Cook Islands\",\r\n \"Costa Rica\",\r\n \"Cote d'Ivoire\",\r\n \"Croatia\",\r\n \"Cuba\",\r\n \"Cura\u00E7ao\",\r\n \"Cyprus\",\r\n \"Czech Republic\",\r\n \"Denmark\",\r\n \"Djibouti\",\r\n \"Dominica\",\r\n \"Dominican Republic\",\r\n \"East Timor\",\r\n \"Ecuador\",\r\n \"Egypt\",\r\n \"El Salvador\",\r\n \"Equatorial Guinea\",\r\n \"Eritrea\",\r\n \"Estonia\",\r\n \"Ethiopia\",\r\n \"Falkland Islands (Malvinas)\",\r\n \"Faroe Islands\",\r\n \"Fiji\",\r\n \"Finland\",\r\n \"France\",\r\n \"French Guiana\",\r\n \"French Polynesia\",\r\n \"French Southern Territories\",\r\n \"Gabon\",\r\n \"Gambia\",\r\n \"Georgia\",\r\n \"Germany\",\r\n \"Ghana\",\r\n \"Gibraltar\",\r\n \"Greece\",\r\n \"Greenland\",\r\n \"Grenada\",\r\n \"Guadeloupe\",\r\n \"Guam\",\r\n \"Guatemala\",\r\n \"Guernsey\",\r\n \"Guinea\",\r\n \"Guinea-Bissau\",\r\n \"Guyana\",\r\n \"Haiti\",\r\n \"Heard Island and McDonald Islands\",\r\n \"Holy See (Vatican City State)\",\r\n \"Honduras\",\r\n \"Hong Kong\",\r\n \"Hungary\",\r\n \"Iceland\",\r\n \"India\",\r\n \"Indonesia\",\r\n \"Iran, Islamic Republic of\",\r\n \"Iraq\",\r\n \"Ireland\",\r\n \"Isle of Man\",\r\n \"Israel\",\r\n \"Italy\",\r\n \"Jamaica\",\r\n \"Japan\",\r\n \"Jersey\",\r\n \"Jordan\",\r\n \"Kazakhstan\",\r\n \"Kenya\",\r\n \"Kiribati\",\r\n \"Korea, Democratic People's Rep\",\r\n \"Korea, Republic of\",\r\n \"Kuwait\",\r\n \"Kyrgyzstan\",\r\n \"Lao People's Democratic Republic\",\r\n \"Latvia\",\r\n \"Lebanon\",\r\n \"Lesotho\",\r\n \"Liberia\",\r\n \"Libyan Arab Jamahiriya\",\r\n \"Liechtenstein\",\r\n \"Lithuania\",\r\n \"Luxembourg\",\r\n \"Macau\",\r\n \"Macedonia, former Yugoslav Rep\",\r\n \"Madagascar\",\r\n \"Malawi\",\r\n \"Malaysia\",\r\n \"Maldives\",\r\n \"Mali\",\r\n \"Malta\",\r\n \"Marshall Islands\",\r\n \"Martinique\",\r\n \"Mauritania\",\r\n \"Mauritius\",\r\n \"Mayotte\",\r\n \"Mexico\",\r\n \"Micronesia, Federated States of\",\r\n \"Moldova, Republic of\",\r\n \"Monaco\",\r\n \"Mongolia\",\r\n \"Montenegro\",\r\n \"Montserrat\",\r\n \"Morocco\",\r\n \"Mozambique\",\r\n \"Myanmar\",\r\n \"Namibia\",\r\n \"Nauru\",\r\n \"Nepal\",\r\n \"Netherlands\",\r\n \"Netherlands Antilles\",\r\n \"New Caledonia\",\r\n \"New Zealand\",\r\n \"Nicaragua\",\r\n \"Niger\",\r\n \"Nigeria\",\r\n \"Niue\",\r\n \"Norfolk Island\",\r\n \"Northern Mariana Islands\",\r\n \"Norway\",\r\n \"Oman\",\r\n \"Pakistan\",\r\n \"Palau\",\r\n \"Palestinian Territory, Occupied\",\r\n \"Panama\",\r\n \"Papua New Guinea\",\r\n \"Paraguay\",\r\n \"Philippines\",\r\n \"Pitcairn\",\r\n \"Poland\",\r\n \"Portugal\",\r\n \"Puerto Rico\",\r\n \"Qatar\",\r\n \"Reunion\",\r\n \"Romania\",\r\n \"Russian Federation\",\r\n \"Rwanda\",\r\n \"Saint Barth\u00E9lemy\",\r\n \"Saint Kitts and Nevis\",\r\n \"Saint Lucia\",\r\n \"Saint Martin (French part)\",\r\n \"Saint Pierre and Miquelon\",\r\n \"Saint Vincent and the Grenadines\",\r\n \"Samoa\",\r\n \"San Marino\",\r\n \"Sao Tome and Principe\",\r\n \"Saudi Arabia\",\r\n \"Senegal\",\r\n \"Serbia\",\r\n \"Serbia and Montenegro\",\r\n \"Seychelles\",\r\n \"Sierra Leone\",\r\n \"Singapore\",\r\n \"Sint Maarten (Dutch part)\",\r\n \"Slovakia\",\r\n \"Slovenia\",\r\n \"Solomon Islands\",\r\n \"Somalia\",\r\n \"South Africa\",\r\n \"South Georgia/South Sandwich\",\r\n \"South Sudan\",\r\n \"Spain\",\r\n \"Sri Lanka\",\r\n \"St Helena, Ascension, Tristan\",\r\n \"Sudan\",\r\n \"Suriname\",\r\n \"Svalbard and Jan Mayen\",\r\n \"Swaziland\",\r\n \"Sweden\",\r\n \"Switzerland\",\r\n \"Syrian Arab Republic\",\r\n \"Taiwan\",\r\n \"Tajikistan\",\r\n \"Tanzania, United Republic of\",\r\n \"Thailand\",\r\n \"Timor-Leste\",\r\n \"Togo\",\r\n \"Tokelau\",\r\n \"Tonga\",\r\n \"Trinidad and Tobago\",\r\n \"Tunisia\",\r\n \"Turkey\",\r\n \"Turkmenistan\",\r\n \"Turks and Caicos Islands\",\r\n \"Tuvalu\",\r\n \"Uganda\",\r\n \"Ukraine\",\r\n \"United Arab Emirates\",\r\n \"Uruguay\",\r\n \"US Minor Outlying Islands\",\r\n \"Uzbekistan\",\r\n \"Vanuatu\",\r\n \"Venezuela, Bolivarian Republic of\",\r\n \"Viet Nam\",\r\n \"Virgin Islands (U.S.)\",\r\n \"Virgin Islands, British\",\r\n \"Wallis and Futuna\",\r\n \"Western Sahara\",\r\n \"Yemen\",\r\n \"Zambia\",\r\n \"Zimbabwe\",\r\n] as const satisfies readonly string[];\r\n\r\nexport type CountryOptionKey = typeof CountryOptionKey[number];\r\n\r\nexport type CountryOptionsObject = {\r\n readonly [Key in CountryOptionKey]: string\r\n};", "const gdpr_countries = [\r\n { name: \"Austria\", code: 'AT' },\r\n { name: \"Belgium\", code: 'BE' },\r\n { name: \"Bulgaria\", code: 'BG' },\r\n { name: \"Croatia\", code: 'HR' },\r\n { name: \"Cyprus\", code: 'CY' },\r\n { name: \"Czech Republic\", code: 'CZ' },\r\n { name: \"Denmark\", code: 'DK' },\r\n { name: \"Estonia\", code: 'EE' },\r\n { name: \"Finland\", code: 'FI' },\r\n { name: \"France\", code: 'FR' },\r\n { name: \"Germany\", code: 'DE' },\r\n { name: \"Greece\", code: 'GR' },\r\n { name: \"Hungary\", code: 'HU' },\r\n { name: \"Iceland\", code: 'IS' },\r\n { name: \"Ireland\", code: 'IE' },\r\n { name: \"Italy\", code: 'IT' },\r\n { name: \"Latvia\", code: 'LV' },\r\n { name: \"Liechtenstein\", code: 'LI' },\r\n { name: \"Lithuania\", code: 'LT' },\r\n { name: \"Luxembourg\", code: 'LU' },\r\n { name: \"Malta\", code: 'MT' },\r\n { name: \"Netherlands\", code: 'NL' },\r\n { name: \"Norway\", code: 'NO' },\r\n { name: \"Poland\", code: 'PL' },\r\n { name: \"Portugal\", code: 'PT' },\r\n { name: \"Romania\", code: 'RO' },\r\n { name: \"Slovakia\", code: 'SK' },\r\n { name: \"Slovenia\", code: 'SI' },\r\n { name: \"Spain\", code: 'ES' },\r\n { name: \"Sweden\", code: 'SE' },\r\n { name: \"United Kingdom\", code: 'GB' }\r\n] as const;\r\n\r\nconst gdpr_country_name = gdpr_countries.map(c => c.name);\r\nconst gdpr_country_code = gdpr_countries.map(c => c.code);\r\n\r\nObject.freeze(gdpr_countries);\r\nObject.freeze(gdpr_country_name);\r\nObject.freeze(gdpr_country_code);\r\n\r\nexport const GdprCountries = gdpr_countries;\r\nexport type GdprCountries = typeof gdpr_countries[number];\r\n\r\nexport type GdprCountryName = typeof gdpr_country_name[number];\r\nexport const GdprCountryName = gdpr_country_name;\r\n\r\nexport type GdprCountryCode = typeof gdpr_country_code[number];\r\nexport const GdprCountryCode = gdpr_country_code;", "import { computed, ref, type ComputedRef, toValue } from \"vue\";\r\n\r\nimport type { UserMarketoInputName } from \"../types/definitions/inputs/marketo-input-names-and-values.js\";\r\nimport { CountryOptionKey } from \"../locale/translation-keys/country-option-keys.js\";\r\nimport { SiteCountryCode } from \"../../types-and-definitions/locale-defs/Locales.js\";\r\nimport { exhaustiveGuard, isNil, isNotNil, isObject, isString, type Nil } from \"@mcwd/typescript-type-guards\";\r\nimport { GdprCountryName } from \"../../tracking/region/GdprCountries.js\";\r\nimport { useEventListener } from \"@vueuse/core\";\r\nimport { getOneTrustValues } from \"../../tracking/onetrust/getOneTrustValues.js\";\r\nimport { type ILogger } from \"../../utils/Logger/ILogger.js\";\r\nimport type { RefOrGetter } from \"@mcwd/util-vue\";\r\n\r\nconst GdprCountry = GdprCountryName satisfies readonly CountryOptionKey[];\r\ntype GdprCountry = typeof GdprCountry[number];\r\n\r\nfunction isGdprCountry(value: unknown): value is GdprCountry {\r\n return isString(value) && ((GdprCountry as readonly string[]).includes(value));\r\n}\r\n\r\nconst GdprSiteLanguage = [ \"uk\", \"fr\" ] as const satisfies readonly SiteCountryCode[];\r\ntype GdprSiteLanguage = (typeof GdprSiteLanguage[number]);\r\n\r\nfunction isGdprSiteLanguage(value: unknown): value is GdprSiteLanguage {\r\n return isString(value) && ((GdprSiteLanguage as readonly string[]).includes(value));\r\n}\r\n\r\ntype NoRuleSiteLanguage = Exclude;\r\nconst NoRuleSiteLanguage = Object.freeze(SiteCountryCode.filter(lang => (isGdprSiteLanguage(lang) === false))) as readonly NoRuleSiteLanguage[];\r\n\r\nfunction isNoRuleSiteLanguage(value: unknown): value is NoRuleSiteLanguage {\r\n return isString(value) && ((NoRuleSiteLanguage as readonly string[]).includes(value));\r\n}\r\n\r\nconst PrivacyRule = ['gdpr'] as const;\r\ntype PrivacyRule = (typeof PrivacyRule)[number];\r\n\r\nexport class PrivacyConsentState = Record> {\r\n\r\n constructor({ siteCountryCode, userInputValues, logger }: { siteCountryCode: SiteCountryCode, userInputValues: RefOrGetter, logger: ILogger }) {\r\n this.#logger = logger;\r\n this.#userInputValues = userInputValues;\r\n\r\n this.#defs = Object.freeze({\r\n COUNTRY_MKTO_NAME: \"Country\",\r\n SITE_COUNTRY_CODE: siteCountryCode,\r\n });\r\n\r\n useEventListener(window, 'OneTrustGroupsUpdated', () => {\r\n this.#logger.debug(\"Event: OneTrustGroupsUpdated\");\r\n this.#updateOneTrustGeoLocationData().catch(console.error);\r\n });\r\n this.#updateOneTrustGeoLocationData().catch(console.error);\r\n }\r\n\r\n async #updateOneTrustGeoLocationData() {\r\n const otValues = await getOneTrustValues();\r\n this.#logger.debug(\"Event: OneTrustGroupsUpdated\", { otValues });\r\n if (isObject(otValues) && isObject(otValues.geolocation) && isString(otValues.geolocation.countryCode)) {\r\n this.#onetrustGeolocation.value = { countryCode: otValues.geolocation.countryCode, stateCode: otValues.geolocation.stateCode };\r\n }\r\n else {\r\n this.#onetrustGeolocation.value = null;\r\n }\r\n }\r\n\r\n #defs: Readonly<{\r\n COUNTRY_MKTO_NAME: UserMarketoInputName<\"Country\">;\r\n SITE_COUNTRY_CODE: SiteCountryCode;\r\n }>;\r\n\r\n #userInputValues: RefOrGetter;\r\n #logger: ILogger;\r\n #country = computed(() => {\r\n if (isNil(this.#defs)) {\r\n return null;\r\n }\r\n const userValues: Record | Nil = toValue(this.#userInputValues);\r\n if (this.#defs.COUNTRY_MKTO_NAME in userValues) {\r\n\r\n const country: CountryOptionKey | Nil = (userValues?.[this.#defs.COUNTRY_MKTO_NAME]) as CountryOptionKey | Nil;\r\n\r\n if (isString(country) && country.trim() !== \"\") {\r\n if (CountryOptionKey.includes(country) === false) {\r\n this.#logger.warn(`Unexpected value in Country field: \"${country}\"`);\r\n }\r\n return country;\r\n }\r\n }\r\n return null;\r\n });\r\n\r\n #onetrustGeolocation = ref<{ countryCode: string; stateCode?: string | Nil } | Nil>(null);\r\n\r\n #privacyRuleFromCountryInput = computed(() => {\r\n if (isNotNil(this.#country.value)) {\r\n if (isGdprCountry(this.#country.value)) {\r\n return \"gdpr\";\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n return null;\r\n });\r\n\r\n #privacyRuleFromSiteLang = computed(() => {\r\n if (isString(this.#defs?.SITE_COUNTRY_CODE)) {\r\n if (isGdprSiteLanguage(this.#defs.SITE_COUNTRY_CODE)) {\r\n return \"gdpr\";\r\n }\r\n else if (isNoRuleSiteLanguage(this.#defs.SITE_COUNTRY_CODE)) {\r\n return null;\r\n }\r\n else {\r\n return exhaustiveGuard(this.#defs.SITE_COUNTRY_CODE);\r\n }\r\n }\r\n return null;\r\n });\r\n\r\n #privacyRuleFromOneTrust = computed(() => {\r\n \r\n if (isObject(this.#onetrustGeolocation.value) && isString(this.#onetrustGeolocation.value.countryCode)) {\r\n if (this.#onetrustGeolocation.value.countryCode === \"gb\" || GdprSiteLanguage.includes(this.#onetrustGeolocation.value.countryCode as GdprSiteLanguage)) {\r\n return \"gdpr\";\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n return null;\r\n });\r\n\r\n #activePrivacyRule = computed(() => {\r\n \r\n const countryInputRule = this.#privacyRuleFromCountryInput.value;\r\n const onetrustRule = this.#privacyRuleFromOneTrust.value;\r\n const siteLangRule = this.#privacyRuleFromSiteLang.value;\r\n\r\n let activeRuleSource: \"country input\" | \"onetrust geo\" | \"site locale\" | Nil = null;\r\n if (isNotNil(countryInputRule)) activeRuleSource = \"country input\";\r\n else if (isNotNil(onetrustRule)) activeRuleSource = \"onetrust geo\";\r\n else if (isNotNil(siteLangRule)) activeRuleSource = \"site locale\";\r\n\r\n const activeRule = countryInputRule ?? onetrustRule ?? siteLangRule;\r\n\r\n this.#logger.debug(\"Active Privacy Rule: \", { countryInput: countryInputRule, onetrust: onetrustRule, siteLocale: siteLangRule, activeRule, activeRuleSource });\r\n\r\n return activeRule;\r\n });\r\n\r\n #consentRequired = computed(() => {\r\n const activePrivacyRule = this.#activePrivacyRule.value;\r\n return (isNotNil(activePrivacyRule));\r\n });\r\n\r\n \r\n\r\n get activePrivacyRule(): ComputedRef {\r\n return this.#activePrivacyRule;\r\n }\r\n\r\n get consentRequired(): ComputedRef {\r\n return this.#consentRequired;\r\n }\r\n}", "import { provide } from \"vue\";\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionKeysRecord,\r\n type InjectionValuesRecord,\r\n} from \"@mcwd/util-vue\";\r\n\r\nimport { useFormUserInputValues } from \"./use-form-user-input-values.js\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\nimport { PrivacyConsentState } from \"../models/PrivacyConsentState.js\";\r\nimport { useSiteLanguage } from \"./use-site-language.js\";\r\n\r\ntype UsePrivacyConsentStateInjectionValues = InjectionValuesRecord<{\r\n privacyConsentState: PrivacyConsentState\r\n}>;\r\ntype UsePrivacyConsentStateInjectionKeys = InjectionKeysRecord< UsePrivacyConsentStateInjectionValues>;\r\nconst UsePrivacyConsentStateInjectionKeys = CreateInjectionKeysRecord< UsePrivacyConsentStateInjectionKeys>({\r\n privacyConsentState: \"privacyConsentState\",\r\n});\r\n\r\n\r\n\r\nexport function initPrivacyConsentState() {\r\n if (checkValuesAlreadyProvided(UsePrivacyConsentStateInjectionKeys)) {\r\n return;\r\n }\r\n const { logger } = useFormLogger({ callerLabel: \"initPrivacyConsentState\" });\r\n const { siteCountryCode } = useSiteLanguage({ callerLabel: \"initPrivacyConsentState\" });\r\n const { userInputValues } = useFormUserInputValues({ callerLabel: \"initPrivacyConsentState\" });\r\n const privacyConsentState = new PrivacyConsentState({ siteCountryCode, userInputValues: () => userInputValues, logger });\r\n\r\n provide( UsePrivacyConsentStateInjectionKeys.privacyConsentState, privacyConsentState);\r\n}\r\n\r\nexport function usePrivacyConsentState({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger({ callerLabel: \"usePrivacyConsentState\" });\r\n try {\r\n callerLabel ??= \"usePrivacyConsentState\";\r\n\r\n const privacyConsentState = injectRequiredWithSelf( UsePrivacyConsentStateInjectionKeys.privacyConsentState);\r\n return { privacyConsentState };\r\n } catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? \"unknown\"}`);\r\n throw err;\r\n }\r\n}\r\n", "import type { DocumentResource, FormWidgetData, VideoResource, VideoResourceWithDocs } from \"../../widgetDataTs.js\";\r\nimport type { FormTrackingName } from \"../form-settings/form-experience/form-experience-settings.js\";\r\nimport { type Nil, type PartialWithNil } from \"@mcwd/typescript-type-guards\";\r\nimport type { MaybeRefOrGetter } from \"vue\";\r\nimport { toValue } from \"vue\";\r\nimport type { HiddenMarketoInputType } from \"../types/definitions/inputs/marketo-input-names-and-values.js\";\r\nimport type { TagManagerEvent } from \"../../tracking/TagManager/Wrapper/TagManagerWrapper.js\";\r\nimport { useFormLogger } from \"../composables/use-form-logger.js\";\r\nimport type { ILogger } from \"../../utils/Logger/ILogger.js\";\r\nimport type { GatingState } from \"../types/definitions/gating/gating-state.js\";\r\nimport { useFormSettings } from \"../composables/use-form-settings.js\";\r\nimport type { IFormSettings } from \"../form-settings/form-settings-factory.js\";\r\n/**\r\n * \r\n * - FormModalOpen: Triggers only when the form is in a modal. Triggers when the modal first opens. \r\n * - FormStart: Triggers when a user first interacts with a form field.\r\n * - FormComplete: Triggers when a regular form is completed successfully\r\n * - UngatedFormComplete: Triggers when a blind form is completed successfully\r\n * - FormError: Triggers when a form validation error occurs.\r\n */\r\nconst FormEvents = [\r\n \"FormModalOpen\",\r\n \"FormStart\",\r\n \"FormComplete\",\r\n \"UngatedFormComplete\",\r\n \"FormError\"\r\n] as const;\r\ntype FormEvents = typeof FormEvents[number];\r\n\r\ninterface FormEventObject extends TagManagerEvent {\r\n event: FormEvents;\r\n formName: FormTrackingName;\r\n widgetName: string;\r\n widgetVariation: string;\r\n gatingState: GatingState.MarketoForm;\r\n videoId?: string | Nil;\r\n videoTitle?: string | Nil;\r\n documentIds?: string[] | Nil;\r\n documentTitles?: string[] | Nil;\r\n offerId?: string | Nil;\r\n tacticId?: string | Nil;\r\n}\r\ndeclare var Munchkin: any;\r\nexport class FormTrackingManager {\r\n formTrackingName: FormTrackingName;\r\n hiddenFieldValuesObject: MaybeRefOrGetter>;\r\n isInModal: MaybeRefOrGetter;\r\n widgetData: MaybeRefOrGetter;\r\n gatingState: MaybeRefOrGetter;\r\n formSettings: IFormSettings;\r\n\r\n #logger: ILogger;\r\n constructor({\r\n formTrackingName,\r\n hiddenFieldValuesObject,\r\n isInModal,\r\n widgetData,\r\n gatingState,\r\n }: {\r\n formTrackingName: FormTrackingName;\r\n hiddenFieldValuesObject: MaybeRefOrGetter>;\r\n isInModal?: MaybeRefOrGetter | Nil;\r\n widgetData: MaybeRefOrGetter;\r\n gatingState: MaybeRefOrGetter;\r\n }) {\r\n const { logger } = useFormLogger();\r\n const { FormSettings } = useFormSettings();\r\n this.#logger = logger;\r\n this.formSettings = FormSettings;\r\n this.isInModal = isInModal ?? false;\r\n this.formTrackingName = formTrackingName;\r\n this.widgetData = widgetData;\r\n this.hiddenFieldValuesObject = hiddenFieldValuesObject;\r\n this.gatingState = gatingState;\r\n }\r\n\r\n get setupForm() {\r\n return toValue(this.widgetData).setup.form;\r\n }\r\n\r\n get formName() {\r\n return this.formTrackingName;\r\n }\r\n\r\n // widget name, which defaults to the form name when not provided\r\n get widgetName() {\r\n return toValue(this.widgetData).widget.name ?? this.formTrackingName;\r\n }\r\n\r\n get widgetVariation() {\r\n return toValue(this.widgetData).widget.variation ?? \"\";\r\n }\r\n\r\n get video() {\r\n return \"video\" in this.setupForm\r\n ? (this.setupForm.video.selected as VideoResource | VideoResourceWithDocs)\r\n : null;\r\n }\r\n\r\n get documents() {\r\n if ((\"document\" in this.setupForm)) {\r\n return (this.setupForm.document.selected ?? null) as DocumentResource[] | null;\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n get offerId() {\r\n return toValue(this.widgetData)?.setup?.tracking?.offerId ?? null;\r\n }\r\n get widgetType() {\r\n return toValue(this.widgetData).widget.variation ?? null;\r\n }\r\n\r\n #createEventObject(event: FormEvents): FormEventObject {\r\n const { video, documents, offerId } = this;\r\n const hiddenFields = toValue(this.hiddenFieldValuesObject);\r\n const tacticId = hiddenFields?.Campaign__c ?? null;\r\n const eventObj: FormEventObject = {\r\n event,\r\n formName: this.formName,\r\n widgetName: this.widgetName,\r\n widgetVariation: this.widgetVariation,\r\n gatingState: toValue(this.gatingState),\r\n videoId: video?.legacyId,\r\n videoTitle: video?.title,\r\n documentIds: documents?.map((d) => d.legacyId),\r\n documentTitles: documents?.map(d => d.title),\r\n offerId,\r\n tacticId\r\n };\r\n return eventObj;\r\n }\r\n\r\n sendEvent(eventName: FormEvents) {\r\n this.#logger.log(\"About to send event: \", eventName);\r\n window.McTagManager.sendEvent(this.#createEventObject(eventName));\r\n }\r\n\r\n #onAnyFormComplete() {\r\n if (this.formSettings.formSettingsKey === \"document\") {\r\n if (this.documents !== null && (this.documents.length > 0 && toValue(this.widgetData).setup.tracking.usePageOfferId === true)) {\r\n const offerIds = this.documents.map(d => d.salesforceOfferId);\r\n try {\r\n if (typeof Munchkin !== 'undefined') {\r\n for (const id of offerIds) {\r\n if (id) {\r\n Munchkin.munchkinFunction('clickLink', {\r\n 'href': `https://www.mastercontrol.com/multi-doc-selector/${id}`\r\n });\r\n }\r\n }\r\n } else {\r\n throw new Error(\"Munchkin code did not load in.\")\r\n }\r\n } catch(error) {\r\n this.#logger.error(error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n #formOpenHasTriggered = false;\r\n FormOpen() {\r\n // Prevent form open tracking from triggering more than once\r\n if (this.#formOpenHasTriggered !== true) {\r\n this.#formOpenHasTriggered = true;\r\n if (this.isInModal) {\r\n this.sendEvent(\"FormModalOpen\");\r\n }\r\n }\r\n }\r\n\r\n #formUserStartHasTriggered = false;\r\n FormUserStart() {\r\n // Prevent form user start tracking from triggering more than once\r\n if (this.#formUserStartHasTriggered !== true) {\r\n this.#formUserStartHasTriggered = true;\r\n this.sendEvent(\"FormStart\");\r\n }\r\n }\r\n\r\n #formCompleteHasTriggered = false;\r\n FormComplete() {\r\n // Prevent form complete tracking from triggering more than once\r\n if (this.#formCompleteHasTriggered !== true) {\r\n // If the form is prefilled, and a user just presses the submit button, it may not fire the start event, so handle it here before completion\r\n if (this.#formUserStartHasTriggered !== true) {\r\n this.FormUserStart();\r\n }\r\n this.#formCompleteHasTriggered = true;\r\n //should only trigger for multi doc selectors\r\n this.#onAnyFormComplete();\r\n this.sendEvent(\"FormComplete\");\r\n }\r\n }\r\n\r\n #ungatedFormCompleteHasTriggered = false;\r\n /** Ungated Form Complete (aka blind submit) */\r\n UngatedFormComplete() {\r\n // Prevent ungated form complete tracking from triggering more than once\r\n if (this.#ungatedFormCompleteHasTriggered !== true) {\r\n this.#ungatedFormCompleteHasTriggered = true;\r\n this.#onAnyFormComplete();\r\n this.sendEvent(\"UngatedFormComplete\");\r\n }\r\n }\r\n\r\n #formValidationErrorHasTriggered = false;\r\n FormValidationError() {\r\n // Prevent form validation error tracking from triggering more than once\r\n if (this.#formValidationErrorHasTriggered !== true) {\r\n this.#formValidationErrorHasTriggered = true;\r\n this.sendEvent(\"FormError\");\r\n }\r\n }\r\n}\r\n", "import type _jquery from \"jquery\";\r\nimport { provide, type MaybeRefOrGetter } from \"vue\";\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionKeysRecord,\r\n type InjectionValuesRecord,\r\n} from \"@mcwd/util-vue\";\r\nimport type { FormWidgetData } from \"../../widgetDataTs.js\";\r\nimport { useGatingLevel } from \"./use-gating-level.js\";\r\nimport { useFormEvents } from \"./use-form-events.js\";\r\nimport { useHiddenFieldInitializer } from \"./use-hidden-field-initializer.js\";\r\nimport { FormTrackingManager } from \"../form-logic/FormTrackingManager.js\";\r\nimport type { FormTrackingName } from \"../form-settings/form-experience/form-experience-settings.js\";\r\nimport { exhaustiveGuard, type Nil } from \"@mcwd/typescript-type-guards\";\r\nimport { toValue } from \"vue\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\n\r\n\r\ntype UseFormTrackingInjectionValues = InjectionValuesRecord<{\r\n trackingManager: FormTrackingManager\r\n}>;\r\n\r\ntype UseFormTrackingInjectionKeys = InjectionKeysRecord;\r\n\r\nconst UseFormTrackingInjectionKeys = CreateInjectionKeysRecord({\r\n trackingManager: \"trackingManager\"\r\n});\r\n\r\n\r\nexport function initFormTracking({ formTrackingName, isInModal, widgetData }: { \r\n formTrackingName: FormTrackingName;\r\n widgetData: MaybeRefOrGetter;\r\n isInModal: MaybeRefOrGetter | Nil;\r\n}) {\r\n if (checkValuesAlreadyProvided(UseFormTrackingInjectionKeys)) {\r\n return;\r\n }\r\n\r\n const { hiddenFieldValueBuilder } = useHiddenFieldInitializer({ callerLabel: \"initFormTracking\" });\r\n const { CurrentMarketoFormGatingState } = useGatingLevel({\r\n callerLabel: \"initFormTracking\",\r\n });\r\n\r\n const trackingManager = new FormTrackingManager({\r\n formTrackingName,\r\n widgetData,\r\n gatingState: CurrentMarketoFormGatingState,\r\n hiddenFieldValuesObject: hiddenFieldValueBuilder.hiddenFieldValuesObject,\r\n isInModal\r\n });\r\n\r\n const events = useFormEvents({ callerLabel: \"initFormTracking\" });\r\n\r\n if (toValue(trackingManager.isInModal)) {\r\n trackingManager.FormOpen();\r\n }\r\n\r\n events.completed.on(({ gatingState }) => {\r\n if (gatingState === \"BlindSubmit\") {\r\n trackingManager.UngatedFormComplete();\r\n }\r\n else if (gatingState === \"FullGate\" || gatingState === \"PartialGate\") {\r\n trackingManager.FormComplete();\r\n }\r\n else {\r\n exhaustiveGuard(gatingState);\r\n }\r\n });\r\n\r\n const userFirstInteractionHandler = () => {\r\n events.userFirstInteraction.off(userFirstInteractionHandler);\r\n trackingManager.FormUserStart();\r\n };\r\n events.userFirstInteraction.on(userFirstInteractionHandler);\r\n\r\n events.validationErrorOnSubmit.on(() => {\r\n trackingManager.FormValidationError();\r\n });\r\n\r\n provide(UseFormTrackingInjectionKeys.trackingManager, trackingManager);\r\n}\r\n\r\nexport function useFormTracking({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger();\r\n try {\r\n callerLabel ??= \"useFormTracking\";\r\n\r\n const trackingManager = injectRequiredWithSelf(UseFormTrackingInjectionKeys.trackingManager);\r\n return { trackingManager };\r\n } catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? \"unknown\"}`);\r\n throw err;\r\n }\r\n}\r\n", "import { useFormEvents } from \"../composables/use-form-events.js\";\r\nimport { type InputState } from \"../composables/use-input-state.js\";\r\nimport type { FormTrackingName } from \"../form-settings/form-experience/form-experience-settings.js\";\r\nimport type { GatingState } from \"../types/definitions/gating/gating-state.js\";\r\nimport { type MaybeRefOrGetter, watch } from \"vue\";\r\nimport { useFormLogger } from \"../composables/use-form-logger.js\";\r\nimport type { ILogger } from \"../../utils/Logger/ILogger.js\";\r\nimport { toValue } from \"vue\";\r\nimport type { FormWidgetData } from \"../../widgetDataTs.js\";\r\nimport type { HiddenMarketoInputType } from \"../types/definitions/inputs/marketo-input-names-and-values.js\";\r\nimport { type PartialWithNil } from \"@mcwd/typescript-type-guards\";\r\n\r\n\r\n//model used to send data to TagManager\r\ninterface AbandonmentData {\r\n event: string;\r\n formName: FormTrackingName;\r\n widgetName: string;\r\n widgetVariation: string;\r\n gatingState: GatingState.MarketoForm;\r\n isInModal: boolean;\r\n fieldInteractionOrder: string;\r\n fieldsWithError: string;\r\n touchedFieldsNoValue: string;\r\n emptyFields: string;\r\n validationErrors: string;\r\n offerId: string | null;\r\n tacticId: string;\r\n}\r\n/**\r\n * Classs to help track form abandonment and send data to GA4\r\n */\r\nexport class FormAbandonmentManager {\r\n\r\n InputState: Record;\r\n FieldInteractionOrder: Set; // sets dont allow duplicates\r\n TouchedFieldsNoValue: Array;\r\n EmptyFields: Array;\r\n ValidationErrors: Array;\r\n FieldsWithError: Array;\r\n FormName: FormTrackingName;\r\n GatingState: GatingState.MarketoForm;\r\n IsInModal: MaybeRefOrGetter;\r\n widgetData: FormWidgetData;\r\n tactic: string;\r\n #logger: ILogger;\r\n\r\n //initiate class data and field interaction order tracking\r\n constructor({\r\n formName,\r\n gatingState,\r\n isInModal,\r\n inputStates,\r\n widgetData,\r\n hiddenFieldValue\r\n }: {\r\n formName: FormTrackingName;\r\n gatingState: GatingState.MarketoForm;\r\n isInModal: MaybeRefOrGetter;\r\n inputStates: Record;\r\n widgetData: FormWidgetData;\r\n hiddenFieldValue: MaybeRefOrGetter>;\r\n }) {\r\n const { logger } = useFormLogger();\r\n this.#logger = logger;\r\n this.InputState = inputStates;\r\n this.FormName = formName;\r\n this.GatingState = gatingState;\r\n this.IsInModal = isInModal;\r\n this.tactic = toValue(hiddenFieldValue).Campaign__c ?? \"\";\r\n this.widgetData = widgetData;\r\n this.FieldInteractionOrder = new Set();\r\n this.TouchedFieldsNoValue = [];\r\n this.ValidationErrors = [];\r\n this.FieldsWithError = [];\r\n this.EmptyFields = [];\r\n this.#trackFieldsFill();\r\n }\r\n /**\r\n * Tracks field interaction based on user click\r\n */\r\n #trackFieldsFill() {\r\n const events = useFormEvents();\r\n //wait till the form is set up\r\n events.ready.on(({ eventName }) => {\r\n //deep watch the InputState\r\n const removeWatcher = watch(() => this.InputState, (newValue) => {\r\n for (const key in newValue) {\r\n //if a field is active then add to order\r\n if (newValue[key].active) {\r\n //track active field\r\n this.FieldInteractionOrder.add(key);\r\n }\r\n }\r\n //once all the fields have been active remove watcher\r\n if (this.FieldInteractionOrder.size == Object.keys(this.InputState).length) removeWatcher();\r\n }, { deep: true })\r\n });\r\n }\r\n /**\r\n * Gets the widget name that initiated the form\r\n */\r\n get widgetName() {\r\n return toValue(this.widgetData).widget.name ?? \"\";\r\n }\r\n /**\r\n * Gets the widget variation which initiated the form\r\n */\r\n get widgetVariation() {\r\n return toValue(this.widgetData).widget.variation ?? \"\";\r\n }\r\n /**\r\n * \r\n */\r\n get OfferId() {\r\n return toValue(this.widgetData).setup.tracking.offerId ?? \"\";\r\n }\r\n captureLastInputState(){\r\n for (const key in this.InputState) { \r\n const FormField = this.InputState[key];\r\n if(FormField.isEmpty){\r\n //get the field with has been touched but left empty\r\n if(FormField.touched && this.FieldInteractionOrder.has(key))\r\n this.TouchedFieldsNoValue.push(key);\r\n else // non touched empty fields\r\n this.EmptyFields.push(key);\r\n }\r\n //get all validation error at the time of abandonment\r\n var { isValid, ValidationType } = FormField.validationCheck;\r\n if (!isValid && ValidationType) {\r\n this.ValidationErrors.push(ValidationType);\r\n }\r\n //get all the fields that has an error at abandonment\r\n if(FormField.showError){\r\n this.FieldsWithError.push(key);\r\n }\r\n }\r\n }\r\n /**\r\n * Parse inputState obj into a model that can be send to GA4\r\n */\r\n #createObj(): AbandonmentData {\r\n // final obj that gets sent to GA4\r\n const abandonmentData: AbandonmentData = {\r\n event: \"FormAbandonment\",\r\n formName: this.FormName,\r\n widgetName: this.widgetName,\r\n widgetVariation: this.widgetVariation,\r\n gatingState: this.GatingState,\r\n offerId: this.OfferId,\r\n tacticId: this.tactic,\r\n isInModal: this.IsInModal as boolean,\r\n fieldInteractionOrder: Array.from(this.FieldInteractionOrder).join(\",\"),\r\n fieldsWithError: this.FieldsWithError.join(\",\"),\r\n touchedFieldsNoValue: this.TouchedFieldsNoValue.join(\",\"),\r\n validationErrors: this.ValidationErrors.join(\",\"),\r\n emptyFields: this.EmptyFields.join(\",\"),\r\n };\r\n\r\n return abandonmentData;\r\n }\r\n /**\r\n * Sends data to the dataLayer for GA4\r\n */\r\n sendAbandonmentData() {\r\n try {\r\n var FormAbandonmentObj = this.#createObj();\r\n this.#logger.debug(\"About to send Form Abandonment event\", FormAbandonmentObj);\r\n window.McTagManager.sendEvent(FormAbandonmentObj);\r\n }\r\n catch (err) {\r\n this.#logger.error(`Failed to send Form Abandonment data: ${err}`)\r\n }\r\n }\r\n}", "import type _jquery from \"jquery\";\r\nimport { provide, type MaybeRefOrGetter } from \"vue\";\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionKeysRecord,\r\n type InjectionValuesRecord,\r\n} from \"@mcwd/util-vue\";\r\nimport { useGatingLevel } from \"./use-gating-level.js\";\r\nimport type { FormTrackingName } from \"../form-settings/form-experience/form-experience-settings.js\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\nimport { useFormEvents } from \"./use-form-events.js\";\r\nimport { FormAbandonmentManager } from \"../form-logic/FormAbandonmentManager.js\";\r\nimport type { InputState } from \"./use-input-state.js\";\r\nimport type { FormWidgetData } from \"../../widgetDataTs.js\";\r\nimport { useHiddenFieldInitializer } from \"./use-hidden-field-initializer.js\";\r\n\r\n\r\ntype UseFormAbandonmentInjectionValues = InjectionValuesRecord<{\r\n abandonmentManager: FormAbandonmentManager\r\n}>;\r\n\r\ntype UseFormAbandonmentInjectionKeys = InjectionKeysRecord;\r\n\r\nconst UseFormAbandonmentInjectionKeys = CreateInjectionKeysRecord({\r\n abandonmentManager: \"abandonmentManager\"\r\n});\r\n/**\r\n * Initiates the class Manager that handles Form abandonment logic\r\n */\r\nexport function initFormAbandonmentManager({ formName, isInModal, inputStates, widgetData }: {\r\n formName: FormTrackingName;\r\n isInModal: MaybeRefOrGetter;\r\n inputStates: Record;\r\n widgetData: FormWidgetData,\r\n}) {\r\n\r\n if (checkValuesAlreadyProvided(UseFormAbandonmentInjectionKeys)) {\r\n return;\r\n }\r\n const { CurrentMarketoFormGatingState } = useGatingLevel({\r\n callerLabel: \"initFormAbandonmentManager\",\r\n });\r\n const { hiddenFieldValueBuilder } = useHiddenFieldInitializer({ callerLabel: \"initFormAbandonmentManager\" });\r\n // Creates the Form Abandonment Class\r\n // starts tracking field history\r\n const abandonmentManager = new FormAbandonmentManager({\r\n formName,\r\n gatingState: CurrentMarketoFormGatingState.value,\r\n isInModal,\r\n inputStates,\r\n widgetData,\r\n hiddenFieldValue: hiddenFieldValueBuilder.hiddenFieldValuesObject\r\n });\r\n const events = useFormEvents({ callerLabel: \"initFormTracking\" });\r\n //const { logger } = useFormLogger();\r\n\r\n const formAbandonmentHandler = ()=>{\r\n events.formAbandonment.off(formAbandonmentHandler);\r\n abandonmentManager.captureLastInputState();\r\n abandonmentManager.sendAbandonmentData();\r\n }\r\n // when the form abandonment event is triggers than we collect and parsed\r\n // all the data to send to GA4\r\n events.formAbandonment.on(formAbandonmentHandler);\r\n\r\n provide(UseFormAbandonmentInjectionKeys.abandonmentManager, abandonmentManager);\r\n}\r\n/**\r\n * Most likely not necessary to use since all of this logic takes place at the end of \r\n * the forms lifecycle but some of the data that is recorded might be useful\r\n * in other places.\r\n */\r\nexport function useFormAbandonmentManager({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger();\r\n try {\r\n callerLabel ??= \"FormAbandonmentManager\";\r\n\r\n const abandonmentManager = injectRequiredWithSelf(UseFormAbandonmentInjectionKeys.abandonmentManager);\r\n return { abandonmentManager };\r\n } catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? \"unknown\"}`);\r\n throw err;\r\n }\r\n}", "const genericEmailDomainsBlocklist: Array = [\r\n \"0-mail.com\",\r\n \"007addict.com\",\r\n \"020.co.uk\",\r\n \"027168.com\",\r\n \"0815.ru\",\r\n \"0815.su\",\r\n \"0clickemail.com\",\r\n \"0sg.net\",\r\n \"0wnd.net\",\r\n \"0wnd.org\",\r\n \"1033edge.com\",\r\n \"10mail.org\",\r\n \"10minutemail.co.za\",\r\n \"10minutemail.com\",\r\n \"11mail.com\",\r\n \"123-m.com\",\r\n \"123.com\",\r\n \"123box.net\",\r\n \"123india.com\",\r\n \"123mail.cl\",\r\n \"123mail.org\",\r\n \"123qwe.co.uk\",\r\n \"126.com\",\r\n \"126.net\",\r\n \"138mail.com\",\r\n \"139.com\",\r\n \"150mail.com\",\r\n \"150ml.com\",\r\n \"15meg4free.com\",\r\n \"163.com\",\r\n \"16mail.com\",\r\n \"188.com\",\r\n \"189.cn\",\r\n \"1auto.com\",\r\n \"1ce.us\",\r\n \"1chuan.com\",\r\n \"1colony.com\",\r\n \"1coolplace.com\",\r\n \"1email.eu\",\r\n \"1freeemail.com\",\r\n \"1fsdfdsfsdf.tk\",\r\n \"1funplace.com\",\r\n \"1internetdrive.com\",\r\n \"1mail.ml\",\r\n \"1mail.net\",\r\n \"1me.net\",\r\n \"1mum.com\",\r\n \"1musicrow.com\",\r\n \"1netdrive.com\",\r\n \"1nsyncfan.com\",\r\n \"1pad.de\",\r\n \"1under.com\",\r\n \"1webave.com\",\r\n \"1webhighway.com\",\r\n \"1zhuan.com\",\r\n \"2-mail.com\",\r\n \"20email.eu\",\r\n \"20mail.in\",\r\n \"20mail.it\",\r\n \"20minutemail.com\",\r\n \"212.com\",\r\n \"21cn.com\",\r\n \"247emails.com\",\r\n \"24horas.com\",\r\n \"2911.net\",\r\n \"2980.com\",\r\n \"2bmail.co.uk\",\r\n \"2coolforyou.net\",\r\n \"2d2i.com\",\r\n \"2die4.com\",\r\n \"2fdgdfgdfgdf.tk\",\r\n \"2hotforyou.net\",\r\n \"2mydns.com\",\r\n \"2net.us\",\r\n \"2prong.com\",\r\n \"2trom.com\",\r\n \"3000.it\",\r\n \"30minutemail.com\",\r\n \"30minutesmail.com\",\r\n \"3126.com\",\r\n \"321media.com\",\r\n \"33mail.com\",\r\n \"360.ru\",\r\n \"37.com\",\r\n \"3ammagazine.com\",\r\n \"3dmail.com\",\r\n \"3email.com\",\r\n \"3g.ua\",\r\n \"3mail.ga\",\r\n \"3trtretgfrfe.tk\",\r\n \"3xl.net\",\r\n \"444.net\",\r\n \"4email.com\",\r\n \"4email.net\",\r\n \"4gfdsgfdgfd.tk\",\r\n \"4mg.com\",\r\n \"4newyork.com\",\r\n \"4warding.com\",\r\n \"4warding.net\",\r\n \"4warding.org\",\r\n \"4x4fan.com\",\r\n \"4x4man.com\",\r\n \"50mail.com\",\r\n \"5fm.za.com\",\r\n \"5ghgfhfghfgh.tk\",\r\n \"5iron.com\",\r\n \"5star.com\",\r\n \"60minutemail.com\",\r\n \"6hjgjhgkilkj.tk\",\r\n \"6ip.us\",\r\n \"6mail.cf\",\r\n \"6paq.com\",\r\n \"702mail.co.za\",\r\n \"74.ru\",\r\n \"7mail.ga\",\r\n \"7mail.ml\",\r\n \"7tags.com\",\r\n \"88.am\",\r\n \"8848.net\",\r\n \"888.nu\",\r\n \"8mail.ga\",\r\n \"8mail.ml\",\r\n \"97rock.com\",\r\n \"99experts.com\",\r\n \"9ox.net\",\r\n \"a-bc.net\",\r\n \"a-player.org\",\r\n \"a2z4u.net\",\r\n \"a45.in\",\r\n \"aaamail.zzn.com\",\r\n \"aahlife.com\",\r\n \"aamail.net\",\r\n \"aapt.net.au\",\r\n \"aaronkwok.net\",\r\n \"abbeyroadlondon.co.uk\",\r\n \"abcflash.net\",\r\n \"abdulnour.com\",\r\n \"aberystwyth.com\",\r\n \"abolition-now.com\",\r\n \"about.com\",\r\n \"absolutevitality.com\",\r\n \"abusemail.de\",\r\n \"abv.bg\",\r\n \"abwesend.de\",\r\n \"abyssmail.com\",\r\n \"ac20mail.in\",\r\n \"academycougars.com\",\r\n \"acceso.or.cr\",\r\n \"access4less.net\",\r\n \"accessgcc.com\",\r\n \"accountant.com\",\r\n \"acdcfan.com\",\r\n \"acdczone.com\",\r\n \"ace-of-base.com\",\r\n \"acmecity.com\",\r\n \"acmemail.net\",\r\n \"acninc.net\",\r\n \"acrobatmail.com\",\r\n \"activatormail.com\",\r\n \"activist.com\",\r\n \"adam.com.au\",\r\n \"add3000.pp.ua\",\r\n \"addcom.de\",\r\n \"address.com\",\r\n \"adelphia.net\",\r\n \"adexec.com\",\r\n \"adfarrow.com\",\r\n \"adinet.com.uy\",\r\n \"adios.net\",\r\n \"admin.in.th\",\r\n \"administrativos.com\",\r\n \"adoption.com\",\r\n \"ados.fr\",\r\n \"adrenalinefreak.com\",\r\n \"adres.nl\",\r\n \"advalvas.be\",\r\n \"advantimo.com\",\r\n \"aeiou.pt\",\r\n \"aemail4u.com\",\r\n \"aeneasmail.com\",\r\n \"afreeinternet.com\",\r\n \"africa-11.com\",\r\n \"africamail.com\",\r\n \"africamel.net\",\r\n \"africanpartnersonline.com\",\r\n \"afrobacon.com\",\r\n \"ag.us.to\",\r\n \"agedmail.com\",\r\n \"agelessemail.com\",\r\n \"agoodmail.com\",\r\n \"ahaa.dk\",\r\n \"ahk.jp\",\r\n \"aichi.com\",\r\n \"aim.com\",\r\n \"aircraftmail.com\",\r\n \"airforce.net\",\r\n \"airforceemail.com\",\r\n \"airpost.net\",\r\n \"aiutamici.com\",\r\n \"ajacied.com\",\r\n \"ajaxapp.net\",\r\n \"ak47.hu\",\r\n \"aknet.kg\",\r\n \"akphantom.com\",\r\n \"albawaba.com\",\r\n \"alecsmail.com\",\r\n \"alex4all.com\",\r\n \"alexandria.cc\",\r\n \"algeria.com\",\r\n \"algeriamail.com\",\r\n \"alhilal.net\",\r\n \"alibaba.com\",\r\n \"alice.it\",\r\n \"aliceadsl.fr\",\r\n \"aliceinchainsmail.com\",\r\n \"alivance.com\",\r\n \"alive.cz\",\r\n \"aliyun.com\",\r\n \"allergist.com\",\r\n \"allmail.net\",\r\n \"alloymail.com\",\r\n \"allracing.com\",\r\n \"allsaintsfan.com\",\r\n \"alltel.net\",\r\n \"alpenjodel.de\",\r\n \"alphafrau.de\",\r\n \"alskens.dk\",\r\n \"altavista.com\",\r\n \"altavista.net\",\r\n \"altavista.se\",\r\n \"alternativagratis.com\",\r\n \"alumni.com\",\r\n \"alumnidirector.com\",\r\n \"alvilag.hu\",\r\n \"ama-trade.de\",\r\n \"amail.com\",\r\n \"amazonses.com\",\r\n \"amele.com\",\r\n \"america.hm\",\r\n \"ameritech.net\",\r\n \"amilegit.com\",\r\n \"amiri.net\",\r\n \"amiriindustries.com\",\r\n \"amnetsal.com\",\r\n \"amorki.pl\",\r\n \"amrer.net\",\r\n \"amuro.net\",\r\n \"amuromail.com\",\r\n \"ananzi.co.za\",\r\n \"ancestry.com\",\r\n \"andreabocellimail.com\",\r\n \"andylau.net\",\r\n \"anfmail.com\",\r\n \"angelfan.com\",\r\n \"angelfire.com\",\r\n \"angelic.com\",\r\n \"animail.net\",\r\n \"animal.net\",\r\n \"animalhouse.com\",\r\n \"animalwoman.net\",\r\n \"anjungcafe.com\",\r\n \"anniefans.com\",\r\n \"annsmail.com\",\r\n \"ano-mail.net\",\r\n \"anonmails.de\",\r\n \"anonymbox.com\",\r\n \"anonymous.to\",\r\n \"anote.com\",\r\n \"another.com\",\r\n \"anotherdomaincyka.tk\",\r\n \"anotherwin95.com\",\r\n \"anti-ignorance.net\",\r\n \"anti-social.com\",\r\n \"antichef.com\",\r\n \"antichef.net\",\r\n \"antiqueemail.com\",\r\n \"antireg.ru\",\r\n \"antisocial.com\",\r\n \"antispam.de\",\r\n \"antispam24.de\",\r\n \"antispammail.de\",\r\n \"antongijsen.com\",\r\n \"antwerpen.com\",\r\n \"anymoment.com\",\r\n \"anytimenow.com\",\r\n \"aol.co.uk\",\r\n \"aol.com\",\r\n \"aol.de\",\r\n \"aol.fr\",\r\n \"aol.it\",\r\n \"aol.jp\",\r\n \"aon.at\",\r\n \"apexmail.com\",\r\n \"apmail.com\",\r\n \"apollo.lv\",\r\n \"aport.ru\",\r\n \"aport2000.ru\",\r\n \"apple.sib.ru\",\r\n \"appraiser.net\",\r\n \"approvers.net\",\r\n \"aquaticmail.net\",\r\n \"arabia.com\",\r\n \"arabtop.net\",\r\n \"arcademaster.com\",\r\n \"archaeologist.com\",\r\n \"archerymail.com\",\r\n \"arcor.de\",\r\n \"arcotronics.bg\",\r\n \"arcticmail.com\",\r\n \"argentina.com\",\r\n \"arhaelogist.com\",\r\n \"aristotle.org\",\r\n \"army.net\",\r\n \"armyspy.com\",\r\n \"arnet.com.ar\",\r\n \"art-en-ligne.pro\",\r\n \"artistemail.com\",\r\n \"artlover.com\",\r\n \"artlover.com.au\",\r\n \"artman-conception.com\",\r\n \"as-if.com\",\r\n \"asdasd.nl\",\r\n \"asean-mail\",\r\n \"asean-mail.com\",\r\n \"asheville.com\",\r\n \"asia-links.com\",\r\n \"asia-mail.com\",\r\n \"asia.com\",\r\n \"asiafind.com\",\r\n \"asianavenue.com\",\r\n \"asiancityweb.com\",\r\n \"asiansonly.net\",\r\n \"asianwired.net\",\r\n \"asiapoint.net\",\r\n \"askaclub.ru\",\r\n \"ass.pp.ua\",\r\n \"assala.com\",\r\n \"assamesemail.com\",\r\n \"astroboymail.com\",\r\n \"astrolover.com\",\r\n \"astrosfan.com\",\r\n \"astrosfan.net\",\r\n \"asurfer.com\",\r\n \"atheist.com\",\r\n \"athenachu.net\",\r\n \"atina.cl\",\r\n \"atl.lv\",\r\n \"atlas.cz\",\r\n \"atlaswebmail.com\",\r\n \"atlink.com\",\r\n \"atmc.net\",\r\n \"ato.check.com\",\r\n \"atozasia.com\",\r\n \"atrus.ru\",\r\n \"att.net\",\r\n \"attglobal.net\",\r\n \"attymail.com\",\r\n \"au.ru\",\r\n \"auctioneer.net\",\r\n \"aufeminin.com\",\r\n \"aus-city.com\",\r\n \"ausi.com\",\r\n \"aussiemail.com.au\",\r\n \"austin.rr.com\",\r\n \"australia.edu\",\r\n \"australiamail.com\",\r\n \"austrosearch.net\",\r\n \"autoescuelanerja.com\",\r\n \"autograf.pl\",\r\n \"automail.ru\",\r\n \"automotiveauthority.com\",\r\n \"autorambler.ru\",\r\n \"aver.com\",\r\n \"avh.hu\",\r\n \"avia-tonic.fr\",\r\n \"avtoritet.ru\",\r\n \"awayonvacation.com\",\r\n \"awholelotofamechi.com\",\r\n \"awsom.net\",\r\n \"axoskate.com\",\r\n \"ayna.com\",\r\n \"azazazatashkent.tk\",\r\n \"azimiweb.com\",\r\n \"azmeil.tk\",\r\n \"bachelorboy.com\",\r\n \"bachelorgal.com\",\r\n \"backfliper.com\",\r\n \"backpackers.com\",\r\n \"backstreet-boys.com\",\r\n \"backstreetboysclub.com\",\r\n \"backtothefuturefans.com\",\r\n \"backwards.com\",\r\n \"badtzmail.com\",\r\n \"bagherpour.com\",\r\n \"bahrainmail.com\",\r\n \"bakpaka.com\",\r\n \"bakpaka.net\",\r\n \"baldmama.de\",\r\n \"baldpapa.de\",\r\n \"ballerstatus.net\",\r\n \"ballyfinance.com\",\r\n \"balochistan.org\",\r\n \"baluch.com\",\r\n \"bangkok.com\",\r\n \"bangkok2000.com\",\r\n \"bannertown.net\",\r\n \"baptistmail.com\",\r\n \"baptized.com\",\r\n \"barcelona.com\",\r\n \"bareed.ws\",\r\n \"barid.com\",\r\n \"barlick.net\",\r\n \"bartender.net\",\r\n \"baseball-email.com\",\r\n \"baseballmail.com\",\r\n \"basketballmail.com\",\r\n \"batuta.net\",\r\n \"baudoinconsulting.com\",\r\n \"baxomale.ht.cx\",\r\n \"bboy.com\",\r\n \"bboy.zzn.com\",\r\n \"bcvibes.com\",\r\n \"beddly.com\",\r\n \"beeebank.com\",\r\n \"beefmilk.com\",\r\n \"beenhad.com\",\r\n \"beep.ru\",\r\n \"beer.com\",\r\n \"beerandremotes.com\",\r\n \"beethoven.com\",\r\n \"beirut.com\",\r\n \"belice.com\",\r\n \"belizehome.com\",\r\n \"belizemail.net\",\r\n \"belizeweb.com\",\r\n \"bell.net\",\r\n \"bellair.net\",\r\n \"bellsouth.net\",\r\n \"berkscounty.com\",\r\n \"berlin.com\",\r\n \"berlin.de\",\r\n \"berlinexpo.de\",\r\n \"bestmail.us\",\r\n \"betriebsdirektor.de\",\r\n \"bettergolf.net\",\r\n \"bharatmail.com\",\r\n \"big1.us\",\r\n \"big5mail.com\",\r\n \"bigassweb.com\",\r\n \"bigblue.net.au\",\r\n \"bigboab.com\",\r\n \"bigfoot.com\",\r\n \"bigfoot.de\",\r\n \"bigger.com\",\r\n \"biggerbadder.com\",\r\n \"bigmailbox.com\",\r\n \"bigmir.net\",\r\n \"bigpond.au\",\r\n \"bigpond.com\",\r\n \"bigpond.com.au\",\r\n \"bigpond.net\",\r\n \"bigpond.net.au\",\r\n \"bigramp.com\",\r\n \"bigstring.com\",\r\n \"bikemechanics.com\",\r\n \"bikeracer.com\",\r\n \"bikeracers.net\",\r\n \"bikerider.com\",\r\n \"billsfan.com\",\r\n \"billsfan.net\",\r\n \"bimamail.com\",\r\n \"bimla.net\",\r\n \"bin-wieder-da.de\",\r\n \"binkmail.com\",\r\n \"bio-muesli.info\",\r\n \"bio-muesli.net\",\r\n \"biologyfan.com\",\r\n \"birdfanatic.com\",\r\n \"birdlover.com\",\r\n \"birdowner.net\",\r\n \"bisons.com\",\r\n \"bitmail.com\",\r\n \"bitpage.net\",\r\n \"bizhosting.com\",\r\n \"bk.ru\",\r\n \"bkkmail.com\",\r\n \"bla-bla.com\",\r\n \"blackburnfans.com\",\r\n \"blackburnmail.com\",\r\n \"blackplanet.com\",\r\n \"blader.com\",\r\n \"bladesmail.net\",\r\n \"blazemail.com\",\r\n \"bleib-bei-mir.de\",\r\n \"blink182.net\",\r\n \"blockfilter.com\",\r\n \"blogmyway.org\",\r\n \"blondandeasy.com\",\r\n \"bluebottle.com\",\r\n \"bluehyppo.com\",\r\n \"bluemail.ch\",\r\n \"bluemail.dk\",\r\n \"bluesfan.com\",\r\n \"bluewin.ch\",\r\n \"blueyonder.co.uk\",\r\n \"blumail.org\",\r\n \"blushmail.com\",\r\n \"blutig.me\",\r\n \"bmlsports.net\",\r\n \"boardermail.com\",\r\n \"boarderzone.com\",\r\n \"boatracers.com\",\r\n \"bobmail.info\",\r\n \"bodhi.lawlita.com\",\r\n \"bofthew.com\",\r\n \"bol.com.br\",\r\n \"bolando.com\",\r\n \"bollywoodz.com\",\r\n \"bolt.com\",\r\n \"boltonfans.com\",\r\n \"bombdiggity.com\",\r\n \"bonbon.net\",\r\n \"boom.com\",\r\n \"bootmail.com\",\r\n \"bootybay.de\",\r\n \"bornagain.com\",\r\n \"bornnaked.com\",\r\n \"bossofthemoss.com\",\r\n \"bostonoffice.com\",\r\n \"boun.cr\",\r\n \"bounce.net\",\r\n \"bounces.amazon.com\",\r\n \"bouncr.com\",\r\n \"box.az\",\r\n \"box.ua\",\r\n \"boxbg.com\",\r\n \"boxemail.com\",\r\n \"boxformail.in\",\r\n \"boxfrog.com\",\r\n \"boximail.com\",\r\n \"boyzoneclub.com\",\r\n \"bradfordfans.com\",\r\n \"brasilia.net\",\r\n \"bratan.ru\",\r\n \"brazilmail.com\",\r\n \"brazilmail.com.br\",\r\n \"breadtimes.press\",\r\n \"breakthru.com\",\r\n \"breathe.com\",\r\n \"brefmail.com\",\r\n \"brennendesreich.de\",\r\n \"bresnan.net\",\r\n \"brestonline.com\",\r\n \"brew-master.com\",\r\n \"brew-meister.com\",\r\n \"brfree.com.br\",\r\n \"briefemail.com\",\r\n \"bright.net\",\r\n \"britneyclub.com\",\r\n \"brittonsign.com\",\r\n \"broadcast.net\",\r\n \"broadwaybuff.com\",\r\n \"broadwaylove.com\",\r\n \"brokeandhappy.com\",\r\n \"brokenvalve.com\",\r\n \"brujula.net\",\r\n \"brunetka.ru\",\r\n \"brusseler.com\",\r\n \"bsdmail.com\",\r\n \"bsnow.net\",\r\n \"bspamfree.org\",\r\n \"bt.com\",\r\n \"btcc.org\",\r\n \"btcmail.pw\",\r\n \"btconnect.co.uk\",\r\n \"btconnect.com\",\r\n \"btinternet.com\",\r\n \"btopenworld.co.uk\",\r\n \"buerotiger.de\",\r\n \"buffymail.com\",\r\n \"bugmenot.com\",\r\n \"bulgaria.com\",\r\n \"bullsfan.com\",\r\n \"bullsgame.com\",\r\n \"bumerang.ro\",\r\n \"bumpymail.com\",\r\n \"bumrap.com\",\r\n \"bund.us\",\r\n \"bunita.net\",\r\n \"bunko.com\",\r\n \"burnthespam.info\",\r\n \"burntmail.com\",\r\n \"burstmail.info\",\r\n \"buryfans.com\",\r\n \"bushemail.com\",\r\n \"business-man.com\",\r\n \"businessman.net\",\r\n \"businessweekmail.com\",\r\n \"bust.com\",\r\n \"busta-rhymes.com\",\r\n \"busymail.com\",\r\n \"busymail.com.com\",\r\n \"busymail.comhomeart.com\",\r\n \"butch-femme.net\",\r\n \"butovo.net\",\r\n \"buyersusa.com\",\r\n \"buymoreplays.com\",\r\n \"buzy.com\",\r\n \"bvimailbox.com\",\r\n \"byke.com\",\r\n \"byom.de\",\r\n \"byteme.com\",\r\n \"c2.hu\",\r\n \"c2i.net\",\r\n \"c3.hu\",\r\n \"c4.com\",\r\n \"c51vsgq.com\",\r\n \"cabacabana.com\",\r\n \"cable.comcast.com\",\r\n \"cableone.net\",\r\n \"caere.it\",\r\n \"cairomail.com\",\r\n \"calcuttaads.com\",\r\n \"calendar-server.bounces.google.com\",\r\n \"calidifontain.be\",\r\n \"californiamail.com\",\r\n \"callnetuk.com\",\r\n \"callsign.net\",\r\n \"caltanet.it\",\r\n \"camidge.com\",\r\n \"canada-11.com\",\r\n \"canada.com\",\r\n \"canadianmail.com\",\r\n \"canoemail.com\",\r\n \"cantv.net\",\r\n \"canwetalk.com\",\r\n \"caramail.com\",\r\n \"card.zp.ua\",\r\n \"care2.com\",\r\n \"careceo.com\",\r\n \"careerbuildermail.com\",\r\n \"carioca.net\",\r\n \"cartelera.org\",\r\n \"cartestraina.ro\",\r\n \"casablancaresort.com\",\r\n \"casema.nl\",\r\n \"cash4u.com\",\r\n \"cashette.com\",\r\n \"casino.com\",\r\n \"casualdx.com\",\r\n \"cataloniamail.com\",\r\n \"cataz.com\",\r\n \"catcha.com\",\r\n \"catchamail.com\",\r\n \"catemail.com\",\r\n \"catholic.org\",\r\n \"catlover.com\",\r\n \"catsrule.garfield.com\",\r\n \"ccnmail.com\",\r\n \"cd2.com\",\r\n \"cek.pm\",\r\n \"celineclub.com\",\r\n \"celtic.com\",\r\n \"center-mail.de\",\r\n \"centermail.at\",\r\n \"centermail.com\",\r\n \"centermail.de\",\r\n \"centermail.info\",\r\n \"centermail.net\",\r\n \"centoper.it\",\r\n \"centralpets.com\",\r\n \"centrum.cz\",\r\n \"centrum.sk\",\r\n \"centurylink.net\",\r\n \"centurytel.net\",\r\n \"certifiedmail.com\",\r\n \"cfl.rr.com\",\r\n \"cgac.es\",\r\n \"cghost.s-a-d.de\",\r\n \"chacuo.net\",\r\n \"chaiyo.com\",\r\n \"chaiyomail.com\",\r\n \"chalkmail.net\",\r\n \"chammy.info\",\r\n \"chance2mail.com\",\r\n \"chandrasekar.net\",\r\n \"channelonetv.com\",\r\n \"charityemail.com\",\r\n \"charmedmail.com\",\r\n \"charter.com\",\r\n \"charter.net\",\r\n \"chat.ru\",\r\n \"chatlane.ru\",\r\n \"chattown.com\",\r\n \"chauhanweb.com\",\r\n \"cheatmail.de\",\r\n \"chechnya.conf.work\",\r\n \"check.com\",\r\n \"check.com12\",\r\n \"check1check.com\",\r\n \"cheeb.com\",\r\n \"cheerful.com\",\r\n \"chef.net\",\r\n \"chefmail.com\",\r\n \"chek.com\",\r\n \"chello.nl\",\r\n \"chemist.com\",\r\n \"chequemail.com\",\r\n \"cheshiremail.com\",\r\n \"cheyenneweb.com\",\r\n \"chez.com\",\r\n \"chickmail.com\",\r\n \"chil-e.com\",\r\n \"childrens.md\",\r\n \"childsavetrust.org\",\r\n \"china.com\",\r\n \"china.net.vg\",\r\n \"chinalook.com\",\r\n \"chinamail.com\",\r\n \"chinesecool.com\",\r\n \"chirk.com\",\r\n \"chocaholic.com.au\",\r\n \"chocofan.com\",\r\n \"chogmail.com\",\r\n \"choicemail1.com\",\r\n \"chong-mail.com\",\r\n \"chong-mail.net\",\r\n \"christianmail.net\",\r\n \"chronicspender.com\",\r\n \"churchusa.com\",\r\n \"cia-agent.com\",\r\n \"cia.hu\",\r\n \"ciaoweb.it\",\r\n \"cicciociccio.com\",\r\n \"cincinow.net\",\r\n \"cirquefans.com\",\r\n \"citeweb.net\",\r\n \"citiz.net\",\r\n \"citlink.net\",\r\n \"city-of-bath.org\",\r\n \"city-of-birmingham.com\",\r\n \"city-of-brighton.org\",\r\n \"city-of-cambridge.com\",\r\n \"city-of-coventry.com\",\r\n \"city-of-edinburgh.com\",\r\n \"city-of-lichfield.com\",\r\n \"city-of-lincoln.com\",\r\n \"city-of-liverpool.com\",\r\n \"city-of-manchester.com\",\r\n \"city-of-nottingham.com\",\r\n \"city-of-oxford.com\",\r\n \"city-of-swansea.com\",\r\n \"city-of-westminster.com\",\r\n \"city-of-westminster.net\",\r\n \"city-of-york.net\",\r\n \"city2city.com\",\r\n \"citynetusa.com\",\r\n \"cityofcardiff.net\",\r\n \"cityoflondon.org\",\r\n \"ciudad.com.ar\",\r\n \"ckaazaza.tk\",\r\n \"claramail.com\",\r\n \"classicalfan.com\",\r\n \"classicmail.co.za\",\r\n \"clear.net.nz\",\r\n \"clearwire.net\",\r\n \"clerk.com\",\r\n \"clickforadate.com\",\r\n \"cliffhanger.com\",\r\n \"clixser.com\",\r\n \"close2you.ne\",\r\n \"close2you.net\",\r\n \"clrmail.com\",\r\n \"club-internet.fr\",\r\n \"club4x4.net\",\r\n \"clubalfa.com\",\r\n \"clubbers.net\",\r\n \"clubducati.com\",\r\n \"clubhonda.net\",\r\n \"clubmember.org\",\r\n \"clubnetnoir.com\",\r\n \"clubvdo.net\",\r\n \"cluemail.com\",\r\n \"cmail.net\",\r\n \"cmail.org\",\r\n \"cmail.ru\",\r\n \"cmpmail.com\",\r\n \"cmpnetmail.com\",\r\n \"cnegal.com\",\r\n \"cnnsimail.com\",\r\n \"cntv.cn\",\r\n \"codec.ro\",\r\n \"codec.ro.ro\",\r\n \"codec.roemail.ro\",\r\n \"coder.hu\",\r\n \"coid.biz\",\r\n \"coldemail.info\",\r\n \"coldmail.com\",\r\n \"collectiblesuperstore.com\",\r\n \"collector.org\",\r\n \"collegebeat.com\",\r\n \"collegeclub.com\",\r\n \"collegemail.com\",\r\n \"colleges.com\",\r\n \"columbus.rr.com\",\r\n \"columbusrr.com\",\r\n \"columnist.com\",\r\n \"comast.com\",\r\n \"comast.net\",\r\n \"comcast.com\",\r\n \"comcast.net\",\r\n \"comic.com\",\r\n \"communityconnect.com\",\r\n \"complxmind.com\",\r\n \"comporium.net\",\r\n \"comprendemail.com\",\r\n \"compuserve.com\",\r\n \"computer-expert.net\",\r\n \"computer-freak.com\",\r\n \"computer4u.com\",\r\n \"computerconfused.com\",\r\n \"computermail.net\",\r\n \"computernaked.com\",\r\n \"conexcol.com\",\r\n \"cong.ru\",\r\n \"conk.com\",\r\n \"connect4free.net\",\r\n \"connectbox.com\",\r\n \"conok.com\",\r\n \"consultant.com\",\r\n \"consumerriot.com\",\r\n \"contractor.net\",\r\n \"contrasto.cu.cc\",\r\n \"cookiemonster.com\",\r\n \"cool.br\",\r\n \"cool.fr.nf\",\r\n \"coole-files.de\",\r\n \"coolgoose.ca\",\r\n \"coolgoose.com\",\r\n \"coolkiwi.com\",\r\n \"coollist.com\",\r\n \"coolmail.com\",\r\n \"coolmail.net\",\r\n \"coolrio.com\",\r\n \"coolsend.com\",\r\n \"coolsite.net\",\r\n \"cooooool.com\",\r\n \"cooperation.net\",\r\n \"cooperationtogo.net\",\r\n \"copacabana.com\",\r\n \"copper.net\",\r\n \"copticmail.com\",\r\n \"cornells.com\",\r\n \"cornerpub.com\",\r\n \"corporatedirtbag.com\",\r\n \"correo.terra.com.gt\",\r\n \"corrsfan.com\",\r\n \"cortinet.com\",\r\n \"cosmo.com\",\r\n \"cotas.net\",\r\n \"counsellor.com\",\r\n \"countrylover.com\",\r\n \"courriel.fr.nf\",\r\n \"courrieltemporaire.com\",\r\n \"cox.com\",\r\n \"cox.net\",\r\n \"coxinet.net\",\r\n \"cpaonline.net\",\r\n \"cracker.hu\",\r\n \"craftemail.com\",\r\n \"crapmail.org\",\r\n \"crazedanddazed.com\",\r\n \"crazy.ru\",\r\n \"crazymailing.com\",\r\n \"crazysexycool.com\",\r\n \"crewstart.com\",\r\n \"cristianemail.com\",\r\n \"critterpost.com\",\r\n \"croeso.com\",\r\n \"crosshairs.com\",\r\n \"crosswinds.net\",\r\n \"crunkmail.com\",\r\n \"crwmail.com\",\r\n \"cry4helponline.com\",\r\n \"cryingmail.com\",\r\n \"cs.com\",\r\n \"csinibaba.hu\",\r\n \"cubiclink.com\",\r\n \"cuemail.com\",\r\n \"cumbriamail.com\",\r\n \"curio-city.com\",\r\n \"curryworld.de\",\r\n \"curtsmail.com\",\r\n \"cust.in\",\r\n \"cute-girl.com\",\r\n \"cuteandcuddly.com\",\r\n \"cutekittens.com\",\r\n \"cutey.com\",\r\n \"cuvox.de\",\r\n \"cww.de\",\r\n \"cyber-africa.net\",\r\n \"cyber-innovation.club\",\r\n \"cyber-matrix.com\",\r\n \"cyber-phone.eu\",\r\n \"cyber-wizard.com\",\r\n \"cyber4all.com\",\r\n \"cyberbabies.com\",\r\n \"cybercafemaui.com\",\r\n \"cybercity-online.net\",\r\n \"cyberdude.com\",\r\n \"cyberforeplay.net\",\r\n \"cybergal.com\",\r\n \"cybergrrl.com\",\r\n \"cyberinbox.com\",\r\n \"cyberleports.com\",\r\n \"cybermail.net\",\r\n \"cybernet.it\",\r\n \"cyberservices.com\",\r\n \"cyberspace-asia.com\",\r\n \"cybertrains.org\",\r\n \"cyclefanz.com\",\r\n \"cymail.net\",\r\n \"cynetcity.com\",\r\n \"d3p.dk\",\r\n \"dabsol.net\",\r\n \"dacoolest.com\",\r\n \"dadacasa.com\",\r\n \"daha.com\",\r\n \"dailypioneer.com\",\r\n \"dallas.theboys.com\",\r\n \"dallasmail.com\",\r\n \"dandikmail.com\",\r\n \"dangerous-minds.com\",\r\n \"dansegulvet.com\",\r\n \"dasdasdascyka.tk\",\r\n \"data54.com\",\r\n \"date.by\",\r\n \"daum.net\",\r\n \"davegracey.com\",\r\n \"dawnsonmail.com\",\r\n \"dawsonmail.com\",\r\n \"dayrep.com\",\r\n \"dazedandconfused.com\",\r\n \"dbzmail.com\",\r\n \"dcemail.com\",\r\n \"dcsi.net\",\r\n \"ddns.org\",\r\n \"deadaddress.com\",\r\n \"deadlymob.org\",\r\n \"deadspam.com\",\r\n \"deafemail.net\",\r\n \"deagot.com\",\r\n \"deal-maker.com\",\r\n \"dearriba.com\",\r\n \"death-star.com\",\r\n \"deepseafisherman.net\",\r\n \"deforestationsucks.com\",\r\n \"degoo.com\",\r\n \"dejanews.com\",\r\n \"delikkt.de\",\r\n \"deliveryman.com\",\r\n \"deneg.net\",\r\n \"depechemode.com\",\r\n \"deseretmail.com\",\r\n \"desertmail.com\",\r\n \"desertonline.com\",\r\n \"desertsaintsmail.com\",\r\n \"desilota.com\",\r\n \"deskmail.com\",\r\n \"deskpilot.com\",\r\n \"despam.it\",\r\n \"despammed.com\",\r\n \"destin.com\",\r\n \"detik.com\",\r\n \"deutschland-net.com\",\r\n \"devnullmail.com\",\r\n \"devotedcouples.com\",\r\n \"dezigner.ru\",\r\n \"dfgh.net\",\r\n \"dfwatson.com\",\r\n \"dglnet.com.br\",\r\n \"dgoh.org\",\r\n \"di-ve.com\",\r\n \"diamondemail.com\",\r\n \"didamail.com\",\r\n \"die-besten-bilder.de\",\r\n \"die-genossen.de\",\r\n \"die-optimisten.de\",\r\n \"die-optimisten.net\",\r\n \"die.life\",\r\n \"diehardmail.com\",\r\n \"diemailbox.de\",\r\n \"digibel.be\",\r\n \"digital-filestore.de\",\r\n \"digitalforeplay.net\",\r\n \"digitalsanctuary.com\",\r\n \"digosnet.com\",\r\n \"dingbone.com\",\r\n \"diplomats.com\",\r\n \"directbox.com\",\r\n \"director-general.com\",\r\n \"diri.com\",\r\n \"dirtracer.com\",\r\n \"dirtracers.com\",\r\n \"discard.email\",\r\n \"discard.ga\",\r\n \"discard.gq\",\r\n \"discardmail.com\",\r\n \"discardmail.de\",\r\n \"disciples.com\",\r\n \"discofan.com\",\r\n \"discovery.com\",\r\n \"discoverymail.com\",\r\n \"discoverymail.net\",\r\n \"disign-concept.eu\",\r\n \"disign-revelation.com\",\r\n \"disinfo.net\",\r\n \"dispomail.eu\",\r\n \"disposable.com\",\r\n \"disposableaddress.com\",\r\n \"disposableemailaddresses.com\",\r\n \"disposableinbox.com\",\r\n \"dispose.it\",\r\n \"dispostable.com\",\r\n \"divismail.ru\",\r\n \"divorcedandhappy.com\",\r\n \"dm.w3internet.co.uk\",\r\n \"dmailman.com\",\r\n \"dmitrovka.net\",\r\n \"dmitry.ru\",\r\n \"dnainternet.net\",\r\n \"dnsmadeeasy.com\",\r\n \"doar.net\",\r\n \"doclist.bounces.google.com\",\r\n \"docmail.cz\",\r\n \"docs.google.com\",\r\n \"doctor.com\",\r\n \"dodgeit.com\",\r\n \"dodgit.com\",\r\n \"dodgit.org\",\r\n \"dodo.com.au\",\r\n \"dodsi.com\",\r\n \"dog.com\",\r\n \"dogit.com\",\r\n \"doglover.com\",\r\n \"dogmail.co.uk\",\r\n \"dogsnob.net\",\r\n \"doityourself.com\",\r\n \"domforfb1.tk\",\r\n \"domforfb2.tk\",\r\n \"domforfb3.tk\",\r\n \"domforfb4.tk\",\r\n \"domforfb5.tk\",\r\n \"domforfb6.tk\",\r\n \"domforfb7.tk\",\r\n \"domforfb8.tk\",\r\n \"domozmail.com\",\r\n \"doneasy.com\",\r\n \"donegal.net\",\r\n \"donemail.ru\",\r\n \"donjuan.com\",\r\n \"dontgotmail.com\",\r\n \"dontmesswithtexas.com\",\r\n \"dontreg.com\",\r\n \"dontsendmespam.de\",\r\n \"doramail.com\",\r\n \"dostmail.com\",\r\n \"dotcom.fr\",\r\n \"dotmsg.com\",\r\n \"dotnow.com\",\r\n \"dott.it\",\r\n \"download-privat.de\",\r\n \"dplanet.ch\",\r\n \"dr.com\",\r\n \"dragoncon.net\",\r\n \"dragracer.com\",\r\n \"drdrb.net\",\r\n \"drivehq.com\",\r\n \"dropmail.me\",\r\n \"dropzone.com\",\r\n \"drotposta.hu\",\r\n \"dubaimail.com\",\r\n \"dublin.com\",\r\n \"dublin.ie\",\r\n \"dump-email.info\",\r\n \"dumpandjunk.com\",\r\n \"dumpmail.com\",\r\n \"dumpmail.de\",\r\n \"dumpyemail.com\",\r\n \"dunlopdriver.com\",\r\n \"dunloprider.com\",\r\n \"duno.com\",\r\n \"duskmail.com\",\r\n \"dustdevil.com\",\r\n \"dutchmail.com\",\r\n \"dvd-fan.net\",\r\n \"dwp.net\",\r\n \"dygo.com\",\r\n \"dynamitemail.com\",\r\n \"dyndns.org\",\r\n \"e-apollo.lv\",\r\n \"e-hkma.com\",\r\n \"e-mail.com\",\r\n \"e-mail.com.tr\",\r\n \"e-mail.dk\",\r\n \"e-mail.org\",\r\n \"e-mail.ru\",\r\n \"e-mail.ua\",\r\n \"e-mailanywhere.com\",\r\n \"e-mails.ru\",\r\n \"e-tapaal.com\",\r\n \"e-webtec.com\",\r\n \"e4ward.com\",\r\n \"earthalliance.com\",\r\n \"earthcam.net\",\r\n \"earthdome.com\",\r\n \"earthling.net\",\r\n \"earthlink.net\",\r\n \"earthonline.net\",\r\n \"eastcoast.co.za\",\r\n \"eastlink.ca\",\r\n \"eastmail.com\",\r\n \"eastrolog.com\",\r\n \"easy.com\",\r\n \"easy.to\",\r\n \"easypeasy.com\",\r\n \"easypost.com\",\r\n \"easytrashmail.com\",\r\n \"eatmydirt.com\",\r\n \"ebprofits.net\",\r\n \"ec.rr.com\",\r\n \"ecardmail.com\",\r\n \"ecbsolutions.net\",\r\n \"echina.com\",\r\n \"ecolo-online.fr\",\r\n \"ecompare.com\",\r\n \"edmail.com\",\r\n \"ednatx.com\",\r\n \"edtnmail.com\",\r\n \"educacao.te.pt\",\r\n \"educastmail.com\",\r\n \"eelmail.com\",\r\n \"ehmail.com\",\r\n \"einmalmail.de\",\r\n \"einrot.com\",\r\n \"einrot.de\",\r\n \"eintagsmail.de\",\r\n \"eircom.net\",\r\n \"ekidz.com.au\",\r\n \"elisanet.fi\",\r\n \"elitemail.org\",\r\n \"elsitio.com\",\r\n \"eltimon.com\",\r\n \"elvis.com\",\r\n \"elvisfan.com\",\r\n \"email-fake.gq\",\r\n \"email-london.co.uk\",\r\n \"email-value.com\",\r\n \"email.biz\",\r\n \"email.cbes.net\",\r\n \"email.com\",\r\n \"email.cz\",\r\n \"email.ee\",\r\n \"email.it\",\r\n \"email.nu\",\r\n \"email.org\",\r\n \"email.ro\",\r\n \"email.ru\",\r\n \"email.si\",\r\n \"email.su\",\r\n \"email.ua\",\r\n \"email.women.com\",\r\n \"email2me.com\",\r\n \"email2me.net\",\r\n \"email4u.info\",\r\n \"email60.com\",\r\n \"emailacc.com\",\r\n \"emailaccount.com\",\r\n \"emailaddresses.com\",\r\n \"emailage.ga\",\r\n \"emailage.gq\",\r\n \"emailasso.net\",\r\n \"emailchoice.com\",\r\n \"emailcorner.net\",\r\n \"emailem.com\",\r\n \"emailengine.net\",\r\n \"emailengine.org\",\r\n \"emailer.hubspot.com\",\r\n \"emailforyou.net\",\r\n \"emailgaul.com\",\r\n \"emailgo.de\",\r\n \"emailgroups.net\",\r\n \"emailias.com\",\r\n \"emailinfive.com\",\r\n \"emailit.com\",\r\n \"emaillime.com\",\r\n \"emailmiser.com\",\r\n \"emailoregon.com\",\r\n \"emailpinoy.com\",\r\n \"emailplanet.com\",\r\n \"emailplus.org\",\r\n \"emailproxsy.com\",\r\n \"emails.ga\",\r\n \"emails.incisivemedia.com\",\r\n \"emails.ru\",\r\n \"emailsensei.com\",\r\n \"emailservice.com\",\r\n \"emailsydney.com\",\r\n \"emailtemporanea.com\",\r\n \"emailtemporanea.net\",\r\n \"emailtemporar.ro\",\r\n \"emailtemporario.com.br\",\r\n \"emailthe.net\",\r\n \"emailtmp.com\",\r\n \"emailto.de\",\r\n \"emailuser.net\",\r\n \"emailwarden.com\",\r\n \"emailx.at.hm\",\r\n \"emailx.net\",\r\n \"emailxfer.com\",\r\n \"emailz.ga\",\r\n \"emailz.gq\",\r\n \"emale.ru\",\r\n \"ematic.com\",\r\n \"embarqmail.com\",\r\n \"emeil.in\",\r\n \"emeil.ir\",\r\n \"emil.com\",\r\n \"eml.cc\",\r\n \"eml.pp.ua\",\r\n \"empereur.com\",\r\n \"emptymail.com\",\r\n \"emumail.com\",\r\n \"emz.net\",\r\n \"end-war.com\",\r\n \"enel.net\",\r\n \"enelpunto.net\",\r\n \"engineer.com\",\r\n \"england.com\",\r\n \"england.edu\",\r\n \"englandmail.com\",\r\n \"epage.ru\",\r\n \"epatra.com\",\r\n \"ephemail.net\",\r\n \"epiqmail.com\",\r\n \"epix.net\",\r\n \"epomail.com\",\r\n \"epost.de\",\r\n \"eposta.hu\",\r\n \"eprompter.com\",\r\n \"eqqu.com\",\r\n \"eramail.co.za\",\r\n \"eresmas.com\",\r\n \"eriga.lv\",\r\n \"ero-tube.org\",\r\n \"eshche.net\",\r\n \"esmailweb.net\",\r\n \"estranet.it\",\r\n \"ethos.st\",\r\n \"etoast.com\",\r\n \"etrademail.com\",\r\n \"etranquil.com\",\r\n \"etranquil.net\",\r\n \"eudoramail.com\",\r\n \"europamel.net\",\r\n \"europe.com\",\r\n \"europemail.com\",\r\n \"euroseek.com\",\r\n \"eurosport.com\",\r\n \"evafan.com\",\r\n \"evertonfans.com\",\r\n \"every1.net\",\r\n \"everyday.com.kh\",\r\n \"everymail.net\",\r\n \"everyone.net\",\r\n \"everytg.ml\",\r\n \"evopo.com\",\r\n \"examnotes.net\",\r\n \"excite.co.jp\",\r\n \"excite.co.uk\",\r\n \"excite.com\",\r\n \"excite.it\",\r\n \"execs.com\",\r\n \"execs2k.com\",\r\n \"executivemail.co.za\",\r\n \"exemail.com.au\",\r\n \"exg6.exghost.com\",\r\n \"explodemail.com\",\r\n \"express.net.ua\",\r\n \"expressasia.com\",\r\n \"extenda.net\",\r\n \"extended.com\",\r\n \"extremail.ru\",\r\n \"eyepaste.com\",\r\n \"eyou.com\",\r\n \"ezagenda.com\",\r\n \"ezcybersearch.com\",\r\n \"ezmail.egine.com\",\r\n \"ezmail.ru\",\r\n \"ezrs.com\",\r\n \"f-m.fm\",\r\n \"f1fans.net\",\r\n \"fabfacelift.com\",\r\n \"facebook-email.ga\",\r\n \"facebook.com\",\r\n \"facebookmail.com\",\r\n \"facebookmail.gq\",\r\n \"fadrasha.net\",\r\n \"fadrasha.org\",\r\n \"fahr-zur-hoelle.org\",\r\n \"fake-email.pp.ua\",\r\n \"fake-mail.cf\",\r\n \"fake-mail.ga\",\r\n \"fake-mail.ml\",\r\n \"fakeinbox.com\",\r\n \"fakeinformation.com\",\r\n \"fakemailz.com\",\r\n \"falseaddress.com\",\r\n \"fan.com\",\r\n \"fan.theboys.com\",\r\n \"fannclub.com\",\r\n \"fansonlymail.com\",\r\n \"fansworldwide.de\",\r\n \"fantasticmail.com\",\r\n \"fantasymail.de\",\r\n \"farang.net\",\r\n \"farifluset.mailexpire.com\",\r\n \"faroweb.com\",\r\n \"fast-email.com\",\r\n \"fast-mail.fr\",\r\n \"fast-mail.org\",\r\n \"fastacura.com\",\r\n \"fastchevy.com\",\r\n \"fastchrysler.com\",\r\n \"fastem.com\",\r\n \"fastemail.us\",\r\n \"fastemailer.com\",\r\n \"fastemailextractor.net\",\r\n \"fastermail.com\",\r\n \"fastest.cc\",\r\n \"fastimap.com\",\r\n \"fastkawasaki.com\",\r\n \"fastmail.ca\",\r\n \"fastmail.cn\",\r\n \"fastmail.co.uk\",\r\n \"fastmail.com\",\r\n \"fastmail.com.au\",\r\n \"fastmail.es\",\r\n \"fastmail.fm\",\r\n \"fastmail.gr\",\r\n \"fastmail.im\",\r\n \"fastmail.in\",\r\n \"fastmail.jp\",\r\n \"fastmail.mx\",\r\n \"fastmail.net\",\r\n \"fastmail.nl\",\r\n \"fastmail.se\",\r\n \"fastmail.to\",\r\n \"fastmail.tw\",\r\n \"fastmail.us\",\r\n \"fastmailbox.net\",\r\n \"fastmazda.com\",\r\n \"fastmessaging.com\",\r\n \"fastmitsubishi.com\",\r\n \"fastnissan.com\",\r\n \"fastservice.com\",\r\n \"fastsubaru.com\",\r\n \"fastsuzuki.com\",\r\n \"fasttoyota.com\",\r\n \"fastyamaha.com\",\r\n \"fatcock.net\",\r\n \"fatflap.com\",\r\n \"fathersrightsne.org\",\r\n \"fatyachts.com\",\r\n \"fax.ru\",\r\n \"fbi-agent.com\",\r\n \"fbi.hu\",\r\n \"fdfdsfds.com\",\r\n \"fea.st\",\r\n \"federalcontractors.com\",\r\n \"feinripptraeger.de\",\r\n \"felicity.com\",\r\n \"felicitymail.com\",\r\n \"female.ru\",\r\n \"femenino.com\",\r\n \"fepg.net\",\r\n \"fetchmail.co.uk\",\r\n \"fetchmail.com\",\r\n \"fettabernett.de\",\r\n \"feyenoorder.com\",\r\n \"ffanet.com\",\r\n \"fiberia.com\",\r\n \"fibertel.com.ar\",\r\n \"ficken.de\",\r\n \"fificorp.com\",\r\n \"fificorp.net\",\r\n \"fightallspam.com\",\r\n \"filipinolinks.com\",\r\n \"filzmail.com\",\r\n \"financefan.net\",\r\n \"financemail.net\",\r\n \"financier.com\",\r\n \"findfo.com\",\r\n \"findhere.com\",\r\n \"findmail.com\",\r\n \"findmemail.com\",\r\n \"finebody.com\",\r\n \"fineemail.com\",\r\n \"finfin.com\",\r\n \"finklfan.com\",\r\n \"fire-brigade.com\",\r\n \"fireman.net\",\r\n \"fishburne.org\",\r\n \"fishfuse.com\",\r\n \"fivemail.de\",\r\n \"fixmail.tk\",\r\n \"fizmail.com\",\r\n \"flashbox.5july.org\",\r\n \"flashemail.com\",\r\n \"flashmail.com\",\r\n \"flashmail.net\",\r\n \"fleckens.hu\",\r\n \"flipcode.com\",\r\n \"floridaemail.net\",\r\n \"flytecrew.com\",\r\n \"fmail.co.uk\",\r\n \"fmailbox.com\",\r\n \"fmgirl.com\",\r\n \"fmguy.com\",\r\n \"fnbmail.co.za\",\r\n \"fnmail.com\",\r\n \"folkfan.com\",\r\n \"foodmail.com\",\r\n \"footard.com\",\r\n \"football.theboys.com\",\r\n \"footballmail.com\",\r\n \"foothills.net\",\r\n \"for-president.com\",\r\n \"force9.co.uk\",\r\n \"forfree.at\",\r\n \"forgetmail.com\",\r\n \"fornow.eu\",\r\n \"forpresident.com\",\r\n \"fortuncity.com\",\r\n \"fortunecity.com\",\r\n \"forum.dk\",\r\n \"fossefans.com\",\r\n \"foxmail.com\",\r\n \"fr33mail.info\",\r\n \"francefans.com\",\r\n \"francemel.fr\",\r\n \"frapmail.com\",\r\n \"free-email.ga\",\r\n \"free-online.net\",\r\n \"free-org.com\",\r\n \"free.com.pe\",\r\n \"free.fr\",\r\n \"freeaccess.nl\",\r\n \"freeaccount.com\",\r\n \"freeandsingle.com\",\r\n \"freebox.com\",\r\n \"freedom.usa.com\",\r\n \"freedomlover.com\",\r\n \"freefanmail.com\",\r\n \"freegates.be\",\r\n \"freeghana.com\",\r\n \"freelance-france.eu\",\r\n \"freeler.nl\",\r\n \"freemail.bozz.com\",\r\n \"freemail.c3.hu\",\r\n \"freemail.com.au\",\r\n \"freemail.com.pk\",\r\n \"freemail.de\",\r\n \"freemail.et\",\r\n \"freemail.gr\",\r\n \"freemail.hu\",\r\n \"freemail.it\",\r\n \"freemail.lt\",\r\n \"freemail.ms\",\r\n \"freemail.nl\",\r\n \"freemail.org.mk\",\r\n \"freemail.ru\",\r\n \"freemails.ga\",\r\n \"freemeil.gq\",\r\n \"freenet.de\",\r\n \"freenet.kg\",\r\n \"freeola.com\",\r\n \"freeola.net\",\r\n \"freeproblem.com\",\r\n \"freesbee.fr\",\r\n \"freeserve.co.uk\",\r\n \"freeservers.com\",\r\n \"freestamp.com\",\r\n \"freestart.hu\",\r\n \"freesurf.fr\",\r\n \"freesurf.nl\",\r\n \"freeuk.com\",\r\n \"freeuk.net\",\r\n \"freeukisp.co.uk\",\r\n \"freeweb.org\",\r\n \"freewebemail.com\",\r\n \"freeyellow.com\",\r\n \"freezone.co.uk\",\r\n \"fresnomail.com\",\r\n \"freudenkinder.de\",\r\n \"freundin.ru\",\r\n \"friction.net\",\r\n \"friendlydevices.com\",\r\n \"friendlymail.co.uk\",\r\n \"friends-cafe.com\",\r\n \"friendsfan.com\",\r\n \"from-africa.com\",\r\n \"from-america.com\",\r\n \"from-argentina.com\",\r\n \"from-asia.com\",\r\n \"from-australia.com\",\r\n \"from-belgium.com\",\r\n \"from-brazil.com\",\r\n \"from-canada.com\",\r\n \"from-china.net\",\r\n \"from-england.com\",\r\n \"from-europe.com\",\r\n \"from-france.net\",\r\n \"from-germany.net\",\r\n \"from-holland.com\",\r\n \"from-israel.com\",\r\n \"from-italy.net\",\r\n \"from-japan.net\",\r\n \"from-korea.com\",\r\n \"from-mexico.com\",\r\n \"from-outerspace.com\",\r\n \"from-russia.com\",\r\n \"from-spain.net\",\r\n \"fromalabama.com\",\r\n \"fromalaska.com\",\r\n \"fromarizona.com\",\r\n \"fromarkansas.com\",\r\n \"fromcalifornia.com\",\r\n \"fromcolorado.com\",\r\n \"fromconnecticut.com\",\r\n \"fromdelaware.com\",\r\n \"fromflorida.net\",\r\n \"fromgeorgia.com\",\r\n \"fromhawaii.net\",\r\n \"fromidaho.com\",\r\n \"fromillinois.com\",\r\n \"fromindiana.com\",\r\n \"frominter.net\",\r\n \"fromiowa.com\",\r\n \"fromjupiter.com\",\r\n \"fromkansas.com\",\r\n \"fromkentucky.com\",\r\n \"fromlouisiana.com\",\r\n \"frommaine.net\",\r\n \"frommaryland.com\",\r\n \"frommassachusetts.com\",\r\n \"frommiami.com\",\r\n \"frommichigan.com\",\r\n \"fromminnesota.com\",\r\n \"frommississippi.com\",\r\n \"frommissouri.com\",\r\n \"frommontana.com\",\r\n \"fromnebraska.com\",\r\n \"fromnevada.com\",\r\n \"fromnewhampshire.com\",\r\n \"fromnewjersey.com\",\r\n \"fromnewmexico.com\",\r\n \"fromnewyork.net\",\r\n \"fromnorthcarolina.com\",\r\n \"fromnorthdakota.com\",\r\n \"fromohio.com\",\r\n \"fromoklahoma.com\",\r\n \"fromoregon.net\",\r\n \"frompennsylvania.com\",\r\n \"fromrhodeisland.com\",\r\n \"fromru.com\",\r\n \"fromru.ru\",\r\n \"fromsouthcarolina.com\",\r\n \"fromsouthdakota.com\",\r\n \"fromtennessee.com\",\r\n \"fromtexas.com\",\r\n \"fromthestates.com\",\r\n \"fromutah.com\",\r\n \"fromvermont.com\",\r\n \"fromvirginia.com\",\r\n \"fromwashington.com\",\r\n \"fromwashingtondc.com\",\r\n \"fromwestvirginia.com\",\r\n \"fromwisconsin.com\",\r\n \"fromwyoming.com\",\r\n \"front.ru\",\r\n \"frontier.com\",\r\n \"frontiernet.net\",\r\n \"frostbyte.uk.net\",\r\n \"fsmail.net\",\r\n \"ftc-i.net\",\r\n \"ftml.net\",\r\n \"fuckingduh.com\",\r\n \"fudgerub.com\",\r\n \"fullmail.com\",\r\n \"funiran.com\",\r\n \"funkfan.com\",\r\n \"funky4.com\",\r\n \"fuorissimo.com\",\r\n \"furnitureprovider.com\",\r\n \"fuse.net\",\r\n \"fusemail.com\",\r\n \"fut.es\",\r\n \"fux0ringduh.com\",\r\n \"fwnb.com\",\r\n \"fxsmails.com\",\r\n \"fyii.de\",\r\n \"galamb.net\",\r\n \"galaxy5.com\",\r\n \"galaxyhit.com\",\r\n \"gamebox.com\",\r\n \"gamebox.net\",\r\n \"gamegeek.com\",\r\n \"games.com\",\r\n \"gamespotmail.com\",\r\n \"gamil.com\",\r\n \"gamil.com.au\",\r\n \"gamno.config.work\",\r\n \"garbage.com\",\r\n \"gardener.com\",\r\n \"garliclife.com\",\r\n \"gatwickemail.com\",\r\n \"gawab.com\",\r\n \"gay.com\",\r\n \"gaybrighton.co.uk\",\r\n \"gaza.net\",\r\n \"gazeta.pl\",\r\n \"gazibooks.com\",\r\n \"gci.net\",\r\n \"gdi.net\",\r\n \"gee-wiz.com\",\r\n \"geecities.com\",\r\n \"geek.com\",\r\n \"geek.hu\",\r\n \"geeklife.com\",\r\n \"gehensiemirnichtaufdensack.de\",\r\n \"gelitik.in\",\r\n \"gencmail.com\",\r\n \"general-hospital.com\",\r\n \"gentlemansclub.de\",\r\n \"genxemail.com\",\r\n \"geocities.com\",\r\n \"geography.net\",\r\n \"geologist.com\",\r\n \"geopia.com\",\r\n \"germanymail.com\",\r\n \"get.pp.ua\",\r\n \"get1mail.com\",\r\n \"get2mail.fr\",\r\n \"getairmail.cf\",\r\n \"getairmail.com\",\r\n \"getairmail.ga\",\r\n \"getairmail.gq\",\r\n \"getmails.eu\",\r\n \"getonemail.com\",\r\n \"getonemail.net\",\r\n \"gfxartist.ru\",\r\n \"gh2000.com\",\r\n \"ghanamail.com\",\r\n \"ghostmail.com\",\r\n \"ghosttexter.de\",\r\n \"giantmail.de\",\r\n \"giantsfan.com\",\r\n \"giga4u.de\",\r\n \"gigileung.org\",\r\n \"girl4god.com\",\r\n \"girlsundertheinfluence.com\",\r\n \"gishpuppy.com\",\r\n \"givepeaceachance.com\",\r\n \"glay.org\",\r\n \"glendale.net\",\r\n \"globalfree.it\",\r\n \"globalpagan.com\",\r\n \"globalsite.com.br\",\r\n \"globetrotter.net\",\r\n \"globo.com\",\r\n \"globomail.com\",\r\n \"gmail.co.za\",\r\n \"gmail.com\",\r\n \"gmail.com.au\",\r\n \"gmail.com.br\",\r\n \"gmail.ru\",\r\n \"gmial.com\",\r\n \"gmx.at\",\r\n \"gmx.ch\",\r\n \"gmx.co.uk\",\r\n \"gmx.com\",\r\n \"gmx.de\",\r\n \"gmx.fr\",\r\n \"gmx.li\",\r\n \"gmx.net\",\r\n \"gmx.us\",\r\n \"gnwmail.com\",\r\n \"go.com\",\r\n \"go.ro\",\r\n \"go.ru\",\r\n \"go2.com.py\",\r\n \"go2net.com\",\r\n \"go4.it\",\r\n \"gobrainstorm.net\",\r\n \"gocollege.com\",\r\n \"gocubs.com\",\r\n \"godmail.dk\",\r\n \"goemailgo.com\",\r\n \"gofree.co.uk\",\r\n \"gol.com\",\r\n \"goldenmail.ru\",\r\n \"goldmail.ru\",\r\n \"goldtoolbox.com\",\r\n \"golfemail.com\",\r\n \"golfilla.info\",\r\n \"golfmail.be\",\r\n \"gonavy.net\",\r\n \"gonuts4free.com\",\r\n \"goodnewsmail.com\",\r\n \"goodstick.com\",\r\n \"google.com\",\r\n \"googlegroups.com\",\r\n \"googlemail.com\",\r\n \"goosemoose.com\",\r\n \"goplay.com\",\r\n \"gorillaswithdirtyarmpits.com\",\r\n \"gorontalo.net\",\r\n \"gospelfan.com\",\r\n \"gothere.uk.com\",\r\n \"gotmail.com\",\r\n \"gotmail.net\",\r\n \"gotmail.org\",\r\n \"gotomy.com\",\r\n \"gotti.otherinbox.com\",\r\n \"govolsfan.com\",\r\n \"gportal.hu\",\r\n \"grabmail.com\",\r\n \"graduate.org\",\r\n \"graffiti.net\",\r\n \"gramszu.net\",\r\n \"grandmamail.com\",\r\n \"grandmasmail.com\",\r\n \"graphic-designer.com\",\r\n \"grapplers.com\",\r\n \"gratisweb.com\",\r\n \"great-host.in\",\r\n \"greenmail.net\",\r\n \"greensloth.com\",\r\n \"groupmail.com\",\r\n \"grr.la\",\r\n \"grungecafe.com\",\r\n \"gsrv.co.uk\",\r\n \"gtemail.net\",\r\n \"gtmc.net\",\r\n \"gtwaddress.com\",\r\n \"gua.net\",\r\n \"guerillamail.biz\",\r\n \"guerillamail.com\",\r\n \"guerrillamail.biz\",\r\n \"guerrillamail.com\",\r\n \"guerrillamail.de\",\r\n \"guerrillamail.info\",\r\n \"guerrillamail.net\",\r\n \"guerrillamail.org\",\r\n \"guerrillamailblock.com\",\r\n \"guessmail.com\",\r\n \"guju.net\",\r\n \"gurlmail.com\",\r\n \"gustr.com\",\r\n \"guy.com\",\r\n \"guy2.com\",\r\n \"guyanafriends.com\",\r\n \"gwhsgeckos.com\",\r\n \"gyorsposta.com\",\r\n \"gyorsposta.hu\",\r\n \"h-mail.us\",\r\n \"hab-verschlafen.de\",\r\n \"hablas.com\",\r\n \"habmalnefrage.de\",\r\n \"hacccc.com\",\r\n \"hackermail.com\",\r\n \"hackermail.net\",\r\n \"hailmail.net\",\r\n \"hairdresser.com\",\r\n \"hairdresser.net\",\r\n \"haltospam.com\",\r\n \"hamptonroads.com\",\r\n \"handbag.com\",\r\n \"handleit.com\",\r\n \"hang-ten.com\",\r\n \"hangglidemail.com\",\r\n \"hanmail.net\",\r\n \"happemail.com\",\r\n \"happycounsel.com\",\r\n \"happypuppy.com\",\r\n \"harakirimail.com\",\r\n \"haramamba.ru\",\r\n \"hardcorefreak.com\",\r\n \"hardyoungbabes.com\",\r\n \"hartbot.de\",\r\n \"hat-geld.de\",\r\n \"hatespam.org\",\r\n \"hawaii.rr.com\",\r\n \"hawaiiantel.net\",\r\n \"headbone.com\",\r\n \"healthemail.net\",\r\n \"heartthrob.com\",\r\n \"heavynoize.net\",\r\n \"heerschap.com\",\r\n \"heesun.net\",\r\n \"hehe.com\",\r\n \"hello.hu\",\r\n \"hello.net.au\",\r\n \"hello.to\",\r\n \"hellokitty.com\",\r\n \"helter-skelter.com\",\r\n \"hempseed.com\",\r\n \"herediano.com\",\r\n \"heremail.com\",\r\n \"herono1.com\",\r\n \"herp.in\",\r\n \"herr-der-mails.de\",\r\n \"hetnet.nl\",\r\n \"hewgen.ru\",\r\n \"hey.to\",\r\n \"hhdevel.com\",\r\n \"hideakifan.com\",\r\n \"hidemail.de\",\r\n \"hidzz.com\",\r\n \"highmilton.com\",\r\n \"highquality.com\",\r\n \"highveldmail.co.za\",\r\n \"hilarious.com\",\r\n \"hinduhome.com\",\r\n \"hingis.org\",\r\n \"hiphopfan.com\",\r\n \"hispavista.com\",\r\n \"hitmail.com\",\r\n \"hitmanrecords.com\",\r\n \"hitthe.net\",\r\n \"hkg.net\",\r\n \"hkstarphoto.com\",\r\n \"hmamail.com\",\r\n \"hochsitze.com\",\r\n \"hockeymail.com\",\r\n \"hollywoodkids.com\",\r\n \"home-email.com\",\r\n \"home.de\",\r\n \"home.nl\",\r\n \"home.no.net\",\r\n \"home.ro\",\r\n \"home.se\",\r\n \"homeart.com\",\r\n \"homelocator.com\",\r\n \"homemail.com\",\r\n \"homenetmail.com\",\r\n \"homeonthethrone.com\",\r\n \"homestead.com\",\r\n \"homeworkcentral.com\",\r\n \"honduras.com\",\r\n \"hongkong.com\",\r\n \"hookup.net\",\r\n \"hoopsmail.com\",\r\n \"hopemail.biz\",\r\n \"horrormail.com\",\r\n \"host-it.com.sg\",\r\n \"hot-mail.gq\",\r\n \"hot-shop.com\",\r\n \"hot-shot.com\",\r\n \"hot.ee\",\r\n \"hotbot.com\",\r\n \"hotbox.ru\",\r\n \"hotbrev.com\",\r\n \"hotcoolmail.com\",\r\n \"hotepmail.com\",\r\n \"hotfire.net\",\r\n \"hotletter.com\",\r\n \"hotlinemail.com\",\r\n \"hotmail.be\",\r\n \"hotmail.ca\",\r\n \"hotmail.ch\",\r\n \"hotmail.co\",\r\n \"hotmail.co.il\",\r\n \"hotmail.co.jp\",\r\n \"hotmail.co.nz\",\r\n \"hotmail.co.uk\",\r\n \"hotmail.co.za\",\r\n \"hotmail.com\",\r\n \"hotmail.com.ar\",\r\n \"hotmail.com.au\",\r\n \"hotmail.com.br\",\r\n \"hotmail.com.mx\",\r\n \"hotmail.com.tr\",\r\n \"hotmail.de\",\r\n \"hotmail.es\",\r\n \"hotmail.fi\",\r\n \"hotmail.fr\",\r\n \"hotmail.it\",\r\n \"hotmail.kg\",\r\n \"hotmail.kz\",\r\n \"hotmail.my\",\r\n \"hotmail.nl\",\r\n \"hotmail.ro\",\r\n \"hotmail.roor\",\r\n \"hotmail.ru\",\r\n \"hotpop.com\",\r\n \"hotpop3.com\",\r\n \"hotvoice.com\",\r\n \"housefan.com\",\r\n \"housefancom\",\r\n \"housemail.com\",\r\n \"hsuchi.net\",\r\n \"html.tou.com\",\r\n \"hu2.ru\",\r\n \"hughes.net\",\r\n \"hulapla.de\",\r\n \"humanoid.net\",\r\n \"humanux.com\",\r\n \"humn.ws.gy\",\r\n \"humour.com\",\r\n \"hunsa.com\",\r\n \"hurting.com\",\r\n \"hush.com\",\r\n \"hushmail.com\",\r\n \"hypernautica.com\",\r\n \"i-connect.com\",\r\n \"i-france.com\",\r\n \"i-love-cats.com\",\r\n \"i-mail.com.au\",\r\n \"i-mailbox.net\",\r\n \"i-p.com\",\r\n \"i.am\",\r\n \"i.am.to\",\r\n \"i.amhey.to\",\r\n \"i.ua\",\r\n \"i12.com\",\r\n \"i2828.com\",\r\n \"i2pmail.org\",\r\n \"iam4msu.com\",\r\n \"iamawoman.com\",\r\n \"iamfinallyonline.com\",\r\n \"iamwaiting.com\",\r\n \"iamwasted.com\",\r\n \"iamyours.com\",\r\n \"icestorm.com\",\r\n \"ich-bin-verrueckt-nach-dir.de\",\r\n \"ich-will-net.de\",\r\n \"icloud.com\",\r\n \"icmsconsultants.com\",\r\n \"icq.com\",\r\n \"icqmail.com\",\r\n \"icrazy.com\",\r\n \"icu.md\",\r\n \"id-base.com\",\r\n \"id.ru\",\r\n \"ididitmyway.com\",\r\n \"idigjesus.com\",\r\n \"idirect.com\",\r\n \"ieatspam.eu\",\r\n \"ieatspam.info\",\r\n \"ieh-mail.de\",\r\n \"iespana.es\",\r\n \"ifoward.com\",\r\n \"ig.com.br\",\r\n \"ignazio.it\",\r\n \"ignmail.com\",\r\n \"ihateclowns.com\",\r\n \"ihateyoualot.info\",\r\n \"iheartspam.org\",\r\n \"iinet.net.au\",\r\n \"ijustdontcare.com\",\r\n \"ikbenspamvrij.nl\",\r\n \"ilkposta.com\",\r\n \"ilovechocolate.com\",\r\n \"ilovegiraffes.net\",\r\n \"ilovejesus.com\",\r\n \"ilovelionking.com\",\r\n \"ilovepokemonmail.com\",\r\n \"ilovethemovies.com\",\r\n \"ilovetocollect.net\",\r\n \"ilse.nl\",\r\n \"imaginemail.com\",\r\n \"imail.org\",\r\n \"imail.ru\",\r\n \"imailbox.com\",\r\n \"imails.info\",\r\n \"imap-mail.com\",\r\n \"imap.cc\",\r\n \"imapmail.org\",\r\n \"imel.org\",\r\n \"imgof.com\",\r\n \"imgv.de\",\r\n \"immo-gerance.info\",\r\n \"imneverwrong.com\",\r\n \"imposter.co.uk\",\r\n \"imstations.com\",\r\n \"imstressed.com\",\r\n \"imtoosexy.com\",\r\n \"in-box.net\",\r\n \"in2jesus.com\",\r\n \"iname.com\",\r\n \"inbax.tk\",\r\n \"inbound.plus\",\r\n \"inbox.com\",\r\n \"inbox.lv\",\r\n \"inbox.net\",\r\n \"inbox.ru\",\r\n \"inbox.si\",\r\n \"inboxalias.com\",\r\n \"inboxclean.com\",\r\n \"inboxclean.org\",\r\n \"incamail.com\",\r\n \"includingarabia.com\",\r\n \"incredimail.com\",\r\n \"indeedemail.com\",\r\n \"index.ua\",\r\n \"indexa.fr\",\r\n \"india.com\",\r\n \"indiatimes.com\",\r\n \"indo-mail.com\",\r\n \"indocities.com\",\r\n \"indomail.com\",\r\n \"indosat.net.id\",\r\n \"indus.ru\",\r\n \"indyracers.com\",\r\n \"inerted.com\",\r\n \"inet.com\",\r\n \"inet.net.au\",\r\n \"info-media.de\",\r\n \"info-radio.ml\",\r\n \"info.com\",\r\n \"info66.com\",\r\n \"infoapex.com\",\r\n \"infocom.zp.ua\",\r\n \"infohq.com\",\r\n \"infomail.es\",\r\n \"infomart.or.jp\",\r\n \"informaticos.com\",\r\n \"infospacemail.com\",\r\n \"infovia.com.ar\",\r\n \"inicia.es\",\r\n \"inmail.sk\",\r\n \"inmail24.com\",\r\n \"inmano.com\",\r\n \"inmynetwork.tk\",\r\n \"innocent.com\",\r\n \"inonesearch.com\",\r\n \"inorbit.com\",\r\n \"inoutbox.com\",\r\n \"insidebaltimore.net\",\r\n \"insight.rr.com\",\r\n \"inspectorjavert.com\",\r\n \"instant-mail.de\",\r\n \"instantemailaddress.com\",\r\n \"instantmail.fr\",\r\n \"instruction.com\",\r\n \"instructor.net\",\r\n \"insurer.com\",\r\n \"interburp.com\",\r\n \"interfree.it\",\r\n \"interia.pl\",\r\n \"interlap.com.ar\",\r\n \"intermail.co.il\",\r\n \"internet-club.com\",\r\n \"internet-e-mail.com\",\r\n \"internet-mail.org\",\r\n \"internet-police.com\",\r\n \"internetbiz.com\",\r\n \"internetdrive.com\",\r\n \"internetegypt.com\",\r\n \"internetemails.net\",\r\n \"internetmailing.net\",\r\n \"internode.on.net\",\r\n \"invalid.com\",\r\n \"investormail.com\",\r\n \"inwind.it\",\r\n \"iobox.com\",\r\n \"iobox.fi\",\r\n \"iol.it\",\r\n \"iol.pt\",\r\n \"iowaemail.com\",\r\n \"ip3.com\",\r\n \"ip4.pp.ua\",\r\n \"ip6.li\",\r\n \"ip6.pp.ua\",\r\n \"ipdeer.com\",\r\n \"ipex.ru\",\r\n \"ipoo.org\",\r\n \"iportalexpress.com\",\r\n \"iprimus.com.au\",\r\n \"iqemail.com\",\r\n \"irangate.net\",\r\n \"iraqmail.com\",\r\n \"ireland.com\",\r\n \"irelandmail.com\",\r\n \"irish2me.com\",\r\n \"irj.hu\",\r\n \"iroid.com\",\r\n \"iscooler.com\",\r\n \"isellcars.com\",\r\n \"iservejesus.com\",\r\n \"islamonline.net\",\r\n \"islandemail.net\",\r\n \"isleuthmail.com\",\r\n \"ismart.net\",\r\n \"isonfire.com\",\r\n \"isp9.net\",\r\n \"israelmail.com\",\r\n \"ist-allein.info\",\r\n \"ist-einmalig.de\",\r\n \"ist-ganz-allein.de\",\r\n \"ist-willig.de\",\r\n \"italymail.com\",\r\n \"itelefonica.com.br\",\r\n \"itloox.com\",\r\n \"itmom.com\",\r\n \"ivebeenframed.com\",\r\n \"ivillage.com\",\r\n \"iwan-fals.com\",\r\n \"iwi.net\",\r\n \"iwmail.com\",\r\n \"iwon.com\",\r\n \"izadpanah.com\",\r\n \"jabble.com\",\r\n \"jahoopa.com\",\r\n \"jakuza.hu\",\r\n \"japan.com\",\r\n \"jaydemail.com\",\r\n \"jazzandjava.com\",\r\n \"jazzfan.com\",\r\n \"jazzgame.com\",\r\n \"je-recycle.info\",\r\n \"jeanvaljean.com\",\r\n \"jerusalemmail.com\",\r\n \"jesusanswers.com\",\r\n \"jet-renovation.fr\",\r\n \"jetable.com\",\r\n \"jetable.de\",\r\n \"jetable.fr.nf\",\r\n \"jetable.net\",\r\n \"jetable.org\",\r\n \"jetable.pp.ua\",\r\n \"jetemail.net\",\r\n \"jewishmail.com\",\r\n \"jfkislanders.com\",\r\n \"jiffypc.company.com\",\r\n \"jingjo.net\",\r\n \"jippii.fi\",\r\n \"jmail.co.za\",\r\n \"jnxjn.com\",\r\n \"job4u.com\",\r\n \"jobbikszimpatizans.hu\",\r\n \"joelonsoftware.com\",\r\n \"joinme.com\",\r\n \"jojomail.com\",\r\n \"jokes.com\",\r\n \"jordanmail.com\",\r\n \"journalist.com\",\r\n \"jourrapide.com\",\r\n \"jovem.te.pt\",\r\n \"joymail.com\",\r\n \"jpopmail.com\",\r\n \"jsrsolutions.com\",\r\n \"jubiimail.dk\",\r\n \"jump.com\",\r\n \"jumpy.it\",\r\n \"juniormail.com\",\r\n \"junk1e.com\",\r\n \"junkmail.com\",\r\n \"junkmail.gq\",\r\n \"juno.com\",\r\n \"justemail.net\",\r\n \"justicemail.com\",\r\n \"justmail.de\",\r\n \"justmailz.com\",\r\n \"justmarriedmail.com\",\r\n \"jwspamspy \",\r\n \"k.ro\",\r\n \"kaazoo.com\",\r\n \"kabissa.org\",\r\n \"kaduku.net\",\r\n \"kaffeeschluerfer.com\",\r\n \"kaffeeschluerfer.de\",\r\n \"kaixo.com\",\r\n \"kalpoint.com\",\r\n \"kansascity.com\",\r\n \"kapoorweb.com\",\r\n \"karachian.com\",\r\n \"karachioye.com\",\r\n \"karbasi.com\",\r\n \"kasmail.com\",\r\n \"kaspop.com\",\r\n \"katamail.com\",\r\n \"kayafmmail.co.za\",\r\n \"kbjrmail.com\",\r\n \"kcks.com\",\r\n \"kebi.com\",\r\n \"keftamail.com\",\r\n \"keg-party.com\",\r\n \"keinpardon.de\",\r\n \"keko.com.ar\",\r\n \"kellychen.com\",\r\n \"keptprivate.com\",\r\n \"keromail.com\",\r\n \"kewpee.com\",\r\n \"keyemail.com\",\r\n \"kgb.hu\",\r\n \"khosropour.com\",\r\n \"kichimail.com\",\r\n \"kickassmail.com\",\r\n \"killamail.com\",\r\n \"killergreenmail.com\",\r\n \"killermail.com\",\r\n \"killmail.com\",\r\n \"killmail.net\",\r\n \"kimo.com\",\r\n \"kimsdisk.com\",\r\n \"kinglibrary.net\",\r\n \"kinki-kids.com\",\r\n \"kismail.ru\",\r\n \"kissfans.com\",\r\n \"kitemail.com\",\r\n \"kittymail.com\",\r\n \"kitznet.at\",\r\n \"kiwibox.com\",\r\n \"kiwitown.com\",\r\n \"klassmaster.com\",\r\n \"klassmaster.net\",\r\n \"klzlk.com\",\r\n \"km.ru\",\r\n \"kmail.com.au\",\r\n \"knol-power.nl\",\r\n \"koko.com\",\r\n \"kolumbus.fi\",\r\n \"kommespaeter.de\",\r\n \"konkovo.net\",\r\n \"konsul.ru\",\r\n \"konx.com\",\r\n \"korea.com\",\r\n \"koreamail.com\",\r\n \"kosino.net\",\r\n \"koszmail.pl\",\r\n \"kozmail.com\",\r\n \"kpnmail.nl\",\r\n \"kreditor.ru\",\r\n \"krim.ws\",\r\n \"krongthip.com\",\r\n \"krovatka.net\",\r\n \"krunis.com\",\r\n \"ksanmail.com\",\r\n \"ksee24mail.com\",\r\n \"kube93mail.com\",\r\n \"kukamail.com\",\r\n \"kulturbetrieb.info\",\r\n \"kumarweb.com\",\r\n \"kurzepost.de\",\r\n \"kuwait-mail.com\",\r\n \"kuzminki.net\",\r\n \"kyokodate.com\",\r\n \"kyokofukada.net\",\r\n \"l33r.eu\",\r\n \"la.com\",\r\n \"labetteraverouge.at\",\r\n \"lackmail.ru\",\r\n \"ladyfire.com\",\r\n \"ladymail.cz\",\r\n \"lagerlouts.com\",\r\n \"lags.us\",\r\n \"lahoreoye.com\",\r\n \"lakmail.com\",\r\n \"lamer.hu\",\r\n \"land.ru\",\r\n \"langoo.com\",\r\n \"lankamail.com\",\r\n \"laoeq.com\",\r\n \"laposte.net\",\r\n \"lass-es-geschehen.de\",\r\n \"last-chance.pro\",\r\n \"lastmail.co\",\r\n \"latemodels.com\",\r\n \"latinmail.com\",\r\n \"latino.com\",\r\n \"lavabit.com\",\r\n \"lavache.com\",\r\n \"law.com\",\r\n \"lawlita.com\",\r\n \"lawyer.com\",\r\n \"lazyinbox.com\",\r\n \"learn2compute.net\",\r\n \"lebanonatlas.com\",\r\n \"leeching.net\",\r\n \"leehom.net\",\r\n \"lefortovo.net\",\r\n \"legalactions.com\",\r\n \"legalrc.loan\",\r\n \"legislator.com\",\r\n \"legistrator.com\",\r\n \"lenta.ru\",\r\n \"leonlai.net\",\r\n \"letsgomets.net\",\r\n \"letterbox.com\",\r\n \"letterboxes.org\",\r\n \"letthemeatspam.com\",\r\n \"levele.com\",\r\n \"levele.hu\",\r\n \"lex.bg\",\r\n \"lexis-nexis-mail.com\",\r\n \"lhsdv.com\",\r\n \"lianozovo.net\",\r\n \"libero.it\",\r\n \"liberomail.com\",\r\n \"lick101.com\",\r\n \"liebt-dich.info\",\r\n \"lifebyfood.com\",\r\n \"link2mail.net\",\r\n \"linkmaster.com\",\r\n \"linktrader.com\",\r\n \"linuxfreemail.com\",\r\n \"linuxmail.org\",\r\n \"lionsfan.com.au\",\r\n \"liontrucks.com\",\r\n \"liquidinformation.net\",\r\n \"lissamail.com\",\r\n \"list.ru\",\r\n \"listomail.com\",\r\n \"litedrop.com\",\r\n \"literaturelover.com\",\r\n \"littleapple.com\",\r\n \"littleblueroom.com\",\r\n \"live.at\",\r\n \"live.be\",\r\n \"live.ca\",\r\n \"live.cl\",\r\n \"live.cn\",\r\n \"live.co.uk\",\r\n \"live.co.za\",\r\n \"live.com\",\r\n \"live.com.ar\",\r\n \"live.com.au\",\r\n \"live.com.mx\",\r\n \"live.com.my\",\r\n \"live.com.pt\",\r\n \"live.com.sg\",\r\n \"live.de\",\r\n \"live.dk\",\r\n \"live.fr\",\r\n \"live.hk\",\r\n \"live.ie\",\r\n \"live.in\",\r\n \"live.it\",\r\n \"live.jp\",\r\n \"live.nl\",\r\n \"live.no\",\r\n \"live.ru\",\r\n \"live.se\",\r\n \"liveradio.tk\",\r\n \"liverpoolfans.com\",\r\n \"ljiljan.com\",\r\n \"llandudno.com\",\r\n \"llangollen.com\",\r\n \"lmxmail.sk\",\r\n \"lobbyist.com\",\r\n \"localbar.com\",\r\n \"localgenius.com\",\r\n \"locos.com\",\r\n \"login-email.ga\",\r\n \"loh.pp.ua\",\r\n \"lol.ovpn.to\",\r\n \"lolfreak.net\",\r\n \"lolito.tk\",\r\n \"lolnetwork.net\",\r\n \"london.com\",\r\n \"loobie.com\",\r\n \"looksmart.co.uk\",\r\n \"looksmart.com\",\r\n \"looksmart.com.au\",\r\n \"lookugly.com\",\r\n \"lopezclub.com\",\r\n \"lortemail.dk\",\r\n \"louiskoo.com\",\r\n \"lov.ru\",\r\n \"love.com\",\r\n \"love.cz\",\r\n \"loveable.com\",\r\n \"lovecat.com\",\r\n \"lovefall.ml\",\r\n \"lovefootball.com\",\r\n \"loveforlostcats.com\",\r\n \"lovelygirl.net\",\r\n \"lovemail.com\",\r\n \"lover-boy.com\",\r\n \"lovergirl.com\",\r\n \"lovesea.gq\",\r\n \"lovethebroncos.com\",\r\n \"lovethecowboys.com\",\r\n \"lovetocook.net\",\r\n \"lovetohike.com\",\r\n \"loveyouforever.de\",\r\n \"lovingjesus.com\",\r\n \"lowandslow.com\",\r\n \"lr7.us\",\r\n \"lr78.com\",\r\n \"lroid.com\",\r\n \"lubovnik.ru\",\r\n \"lukop.dk\",\r\n \"luso.pt\",\r\n \"luukku.com\",\r\n \"luv2.us\",\r\n \"luvrhino.com\",\r\n \"lvie.com.sg\",\r\n \"lvwebmail.com\",\r\n \"lycos.co.uk\",\r\n \"lycos.com\",\r\n \"lycos.es\",\r\n \"lycos.it\",\r\n \"lycos.ne.jp\",\r\n \"lycos.ru\",\r\n \"lycosemail.com\",\r\n \"lycosmail.com\",\r\n \"m-a-i-l.com\",\r\n \"m-hmail.com\",\r\n \"m21.cc\",\r\n \"m4.org\",\r\n \"m4ilweb.info\",\r\n \"mac.com\",\r\n \"macbox.com\",\r\n \"macbox.ru\",\r\n \"macfreak.com\",\r\n \"machinecandy.com\",\r\n \"macmail.com\",\r\n \"macr2.com\",\r\n \"mad.scientist.com\",\r\n \"madcrazy.com\",\r\n \"madcreations.com\",\r\n \"madonnafan.com\",\r\n \"madrid.com\",\r\n \"maennerversteherin.com\",\r\n \"maennerversteherin.de\",\r\n \"maffia.hu\",\r\n \"magicmail.co.za\",\r\n \"mahmoodweb.com\",\r\n \"mail-awu.de\",\r\n \"mail-box.cz\",\r\n \"mail-center.com\",\r\n \"mail-central.com\",\r\n \"mail-easy.fr\",\r\n \"mail-filter.com\",\r\n \"mail-me.com\",\r\n \"mail-page.com\",\r\n \"mail-temporaire.fr\",\r\n \"mail-tester.com\",\r\n \"mail.austria.com\",\r\n \"mail.az\",\r\n \"mail.be\",\r\n \"mail.bg\",\r\n \"mail.bulgaria.com\",\r\n \"mail.by\",\r\n \"mail.byte.it\",\r\n \"mail.co.za\",\r\n \"mail.com\",\r\n \"mail.com.tr\",\r\n \"mail.ee\",\r\n \"mail.entrepeneurmag.com\",\r\n \"mail.freetown.com\",\r\n \"mail.gr\",\r\n \"mail.hitthebeach.com\",\r\n \"mail.htl22.at\",\r\n \"mail.kmsp.com\",\r\n \"mail.md\",\r\n \"mail.mezimages.net\",\r\n \"mail.misterpinball.de\",\r\n \"mail.nu\",\r\n \"mail.org.uk\",\r\n \"mail.pf\",\r\n \"mail.pharmacy.com\",\r\n \"mail.pt\",\r\n \"mail.r-o-o-t.com\",\r\n \"mail.ru\",\r\n \"mail.salu.net\",\r\n \"mail.sisna.com\",\r\n \"mail.spaceports.com\",\r\n \"mail.svenz.eu\",\r\n \"mail.theboys.com\",\r\n \"mail.usa.com\",\r\n \"mail.vasarhely.hu\",\r\n \"mail.vu\",\r\n \"mail.wtf\",\r\n \"mail.zp.ua\",\r\n \"mail114.net\",\r\n \"mail15.com\",\r\n \"mail1a.de\",\r\n \"mail1st.com\",\r\n \"mail2007.com\",\r\n \"mail21.cc\",\r\n \"mail2aaron.com\",\r\n \"mail2abby.com\",\r\n \"mail2abc.com\",\r\n \"mail2actor.com\",\r\n \"mail2admiral.com\",\r\n \"mail2adorable.com\",\r\n \"mail2adoration.com\",\r\n \"mail2adore.com\",\r\n \"mail2adventure.com\",\r\n \"mail2aeolus.com\",\r\n \"mail2aether.com\",\r\n \"mail2affection.com\",\r\n \"mail2afghanistan.com\",\r\n \"mail2africa.com\",\r\n \"mail2agent.com\",\r\n \"mail2aha.com\",\r\n \"mail2ahoy.com\",\r\n \"mail2aim.com\",\r\n \"mail2air.com\",\r\n \"mail2airbag.com\",\r\n \"mail2airforce.com\",\r\n \"mail2airport.com\",\r\n \"mail2alabama.com\",\r\n \"mail2alan.com\",\r\n \"mail2alaska.com\",\r\n \"mail2albania.com\",\r\n \"mail2alcoholic.com\",\r\n \"mail2alec.com\",\r\n \"mail2alexa.com\",\r\n \"mail2algeria.com\",\r\n \"mail2alicia.com\",\r\n \"mail2alien.com\",\r\n \"mail2allan.com\",\r\n \"mail2allen.com\",\r\n \"mail2allison.com\",\r\n \"mail2alpha.com\",\r\n \"mail2alyssa.com\",\r\n \"mail2amanda.com\",\r\n \"mail2amazing.com\",\r\n \"mail2amber.com\",\r\n \"mail2america.com\",\r\n \"mail2american.com\",\r\n \"mail2andorra.com\",\r\n \"mail2andrea.com\",\r\n \"mail2andy.com\",\r\n \"mail2anesthesiologist.com\",\r\n \"mail2angela.com\",\r\n \"mail2angola.com\",\r\n \"mail2ann.com\",\r\n \"mail2anna.com\",\r\n \"mail2anne.com\",\r\n \"mail2anthony.com\",\r\n \"mail2anything.com\",\r\n \"mail2aphrodite.com\",\r\n \"mail2apollo.com\",\r\n \"mail2april.com\",\r\n \"mail2aquarius.com\",\r\n \"mail2arabia.com\",\r\n \"mail2arabic.com\",\r\n \"mail2architect.com\",\r\n \"mail2ares.com\",\r\n \"mail2argentina.com\",\r\n \"mail2aries.com\",\r\n \"mail2arizona.com\",\r\n \"mail2arkansas.com\",\r\n \"mail2armenia.com\",\r\n \"mail2army.com\",\r\n \"mail2arnold.com\",\r\n \"mail2art.com\",\r\n \"mail2artemus.com\",\r\n \"mail2arthur.com\",\r\n \"mail2artist.com\",\r\n \"mail2ashley.com\",\r\n \"mail2ask.com\",\r\n \"mail2astronomer.com\",\r\n \"mail2athena.com\",\r\n \"mail2athlete.com\",\r\n \"mail2atlas.com\",\r\n \"mail2atom.com\",\r\n \"mail2attitude.com\",\r\n \"mail2auction.com\",\r\n \"mail2aunt.com\",\r\n \"mail2australia.com\",\r\n \"mail2austria.com\",\r\n \"mail2azerbaijan.com\",\r\n \"mail2baby.com\",\r\n \"mail2bahamas.com\",\r\n \"mail2bahrain.com\",\r\n \"mail2ballerina.com\",\r\n \"mail2ballplayer.com\",\r\n \"mail2band.com\",\r\n \"mail2bangladesh.com\",\r\n \"mail2bank.com\",\r\n \"mail2banker.com\",\r\n \"mail2bankrupt.com\",\r\n \"mail2baptist.com\",\r\n \"mail2bar.com\",\r\n \"mail2barbados.com\",\r\n \"mail2barbara.com\",\r\n \"mail2barter.com\",\r\n \"mail2basketball.com\",\r\n \"mail2batter.com\",\r\n \"mail2beach.com\",\r\n \"mail2beast.com\",\r\n \"mail2beatles.com\",\r\n \"mail2beauty.com\",\r\n \"mail2becky.com\",\r\n \"mail2beijing.com\",\r\n \"mail2belgium.com\",\r\n \"mail2belize.com\",\r\n \"mail2ben.com\",\r\n \"mail2bernard.com\",\r\n \"mail2beth.com\",\r\n \"mail2betty.com\",\r\n \"mail2beverly.com\",\r\n \"mail2beyond.com\",\r\n \"mail2biker.com\",\r\n \"mail2bill.com\",\r\n \"mail2billionaire.com\",\r\n \"mail2billy.com\",\r\n \"mail2bio.com\",\r\n \"mail2biologist.com\",\r\n \"mail2black.com\",\r\n \"mail2blackbelt.com\",\r\n \"mail2blake.com\",\r\n \"mail2blind.com\",\r\n \"mail2blonde.com\",\r\n \"mail2blues.com\",\r\n \"mail2bob.com\",\r\n \"mail2bobby.com\",\r\n \"mail2bolivia.com\",\r\n \"mail2bombay.com\",\r\n \"mail2bonn.com\",\r\n \"mail2bookmark.com\",\r\n \"mail2boreas.com\",\r\n \"mail2bosnia.com\",\r\n \"mail2boston.com\",\r\n \"mail2botswana.com\",\r\n \"mail2bradley.com\",\r\n \"mail2brazil.com\",\r\n \"mail2breakfast.com\",\r\n \"mail2brian.com\",\r\n \"mail2bride.com\",\r\n \"mail2brittany.com\",\r\n \"mail2broker.com\",\r\n \"mail2brook.com\",\r\n \"mail2bruce.com\",\r\n \"mail2brunei.com\",\r\n \"mail2brunette.com\",\r\n \"mail2brussels.com\",\r\n \"mail2bryan.com\",\r\n \"mail2bug.com\",\r\n \"mail2bulgaria.com\",\r\n \"mail2business.com\",\r\n \"mail2buy.com\",\r\n \"mail2ca.com\",\r\n \"mail2california.com\",\r\n \"mail2calvin.com\",\r\n \"mail2cambodia.com\",\r\n \"mail2cameroon.com\",\r\n \"mail2canada.com\",\r\n \"mail2cancer.com\",\r\n \"mail2capeverde.com\",\r\n \"mail2capricorn.com\",\r\n \"mail2cardinal.com\",\r\n \"mail2cardiologist.com\",\r\n \"mail2care.com\",\r\n \"mail2caroline.com\",\r\n \"mail2carolyn.com\",\r\n \"mail2casey.com\",\r\n \"mail2cat.com\",\r\n \"mail2caterer.com\",\r\n \"mail2cathy.com\",\r\n \"mail2catlover.com\",\r\n \"mail2catwalk.com\",\r\n \"mail2cell.com\",\r\n \"mail2chad.com\",\r\n \"mail2champaign.com\",\r\n \"mail2charles.com\",\r\n \"mail2chef.com\",\r\n \"mail2chemist.com\",\r\n \"mail2cherry.com\",\r\n \"mail2chicago.com\",\r\n \"mail2chile.com\",\r\n \"mail2china.com\",\r\n \"mail2chinese.com\",\r\n \"mail2chocolate.com\",\r\n \"mail2christian.com\",\r\n \"mail2christie.com\",\r\n \"mail2christmas.com\",\r\n \"mail2christy.com\",\r\n \"mail2chuck.com\",\r\n \"mail2cindy.com\",\r\n \"mail2clark.com\",\r\n \"mail2classifieds.com\",\r\n \"mail2claude.com\",\r\n \"mail2cliff.com\",\r\n \"mail2clinic.com\",\r\n \"mail2clint.com\",\r\n \"mail2close.com\",\r\n \"mail2club.com\",\r\n \"mail2coach.com\",\r\n \"mail2coastguard.com\",\r\n \"mail2colin.com\",\r\n \"mail2college.com\",\r\n \"mail2colombia.com\",\r\n \"mail2color.com\",\r\n \"mail2colorado.com\",\r\n \"mail2columbia.com\",\r\n \"mail2comedian.com\",\r\n \"mail2composer.com\",\r\n \"mail2computer.com\",\r\n \"mail2computers.com\",\r\n \"mail2concert.com\",\r\n \"mail2congo.com\",\r\n \"mail2connect.com\",\r\n \"mail2connecticut.com\",\r\n \"mail2consultant.com\",\r\n \"mail2convict.com\",\r\n \"mail2cook.com\",\r\n \"mail2cool.com\",\r\n \"mail2cory.com\",\r\n \"mail2costarica.com\",\r\n \"mail2country.com\",\r\n \"mail2courtney.com\",\r\n \"mail2cowboy.com\",\r\n \"mail2cowgirl.com\",\r\n \"mail2craig.com\",\r\n \"mail2crave.com\",\r\n \"mail2crazy.com\",\r\n \"mail2create.com\",\r\n \"mail2croatia.com\",\r\n \"mail2cry.com\",\r\n \"mail2crystal.com\",\r\n \"mail2cuba.com\",\r\n \"mail2culture.com\",\r\n \"mail2curt.com\",\r\n \"mail2customs.com\",\r\n \"mail2cute.com\",\r\n \"mail2cutey.com\",\r\n \"mail2cynthia.com\",\r\n \"mail2cyprus.com\",\r\n \"mail2czechrepublic.com\",\r\n \"mail2dad.com\",\r\n \"mail2dale.com\",\r\n \"mail2dallas.com\",\r\n \"mail2dan.com\",\r\n \"mail2dana.com\",\r\n \"mail2dance.com\",\r\n \"mail2dancer.com\",\r\n \"mail2danielle.com\",\r\n \"mail2danny.com\",\r\n \"mail2darlene.com\",\r\n \"mail2darling.com\",\r\n \"mail2darren.com\",\r\n \"mail2daughter.com\",\r\n \"mail2dave.com\",\r\n \"mail2dawn.com\",\r\n \"mail2dc.com\",\r\n \"mail2dealer.com\",\r\n \"mail2deanna.com\",\r\n \"mail2dearest.com\",\r\n \"mail2debbie.com\",\r\n \"mail2debby.com\",\r\n \"mail2deer.com\",\r\n \"mail2delaware.com\",\r\n \"mail2delicious.com\",\r\n \"mail2demeter.com\",\r\n \"mail2democrat.com\",\r\n \"mail2denise.com\",\r\n \"mail2denmark.com\",\r\n \"mail2dennis.com\",\r\n \"mail2dentist.com\",\r\n \"mail2derek.com\",\r\n \"mail2desert.com\",\r\n \"mail2devoted.com\",\r\n \"mail2devotion.com\",\r\n \"mail2diamond.com\",\r\n \"mail2diana.com\",\r\n \"mail2diane.com\",\r\n \"mail2diehard.com\",\r\n \"mail2dilemma.com\",\r\n \"mail2dillon.com\",\r\n \"mail2dinner.com\",\r\n \"mail2dinosaur.com\",\r\n \"mail2dionysos.com\",\r\n \"mail2diplomat.com\",\r\n \"mail2director.com\",\r\n \"mail2dirk.com\",\r\n \"mail2disco.com\",\r\n \"mail2dive.com\",\r\n \"mail2diver.com\",\r\n \"mail2divorced.com\",\r\n \"mail2djibouti.com\",\r\n \"mail2doctor.com\",\r\n \"mail2doglover.com\",\r\n \"mail2dominic.com\",\r\n \"mail2dominica.com\",\r\n \"mail2dominicanrepublic.com\",\r\n \"mail2don.com\",\r\n \"mail2donald.com\",\r\n \"mail2donna.com\",\r\n \"mail2doris.com\",\r\n \"mail2dorothy.com\",\r\n \"mail2doug.com\",\r\n \"mail2dough.com\",\r\n \"mail2douglas.com\",\r\n \"mail2dow.com\",\r\n \"mail2downtown.com\",\r\n \"mail2dream.com\",\r\n \"mail2dreamer.com\",\r\n \"mail2dude.com\",\r\n \"mail2dustin.com\",\r\n \"mail2dyke.com\",\r\n \"mail2dylan.com\",\r\n \"mail2earl.com\",\r\n \"mail2earth.com\",\r\n \"mail2eastend.com\",\r\n \"mail2eat.com\",\r\n \"mail2economist.com\",\r\n \"mail2ecuador.com\",\r\n \"mail2eddie.com\",\r\n \"mail2edgar.com\",\r\n \"mail2edwin.com\",\r\n \"mail2egypt.com\",\r\n \"mail2electron.com\",\r\n \"mail2eli.com\",\r\n \"mail2elizabeth.com\",\r\n \"mail2ellen.com\",\r\n \"mail2elliot.com\",\r\n \"mail2elsalvador.com\",\r\n \"mail2elvis.com\",\r\n \"mail2emergency.com\",\r\n \"mail2emily.com\",\r\n \"mail2engineer.com\",\r\n \"mail2english.com\",\r\n \"mail2environmentalist.com\",\r\n \"mail2eos.com\",\r\n \"mail2eric.com\",\r\n \"mail2erica.com\",\r\n \"mail2erin.com\",\r\n \"mail2erinyes.com\",\r\n \"mail2eris.com\",\r\n \"mail2eritrea.com\",\r\n \"mail2ernie.com\",\r\n \"mail2eros.com\",\r\n \"mail2estonia.com\",\r\n \"mail2ethan.com\",\r\n \"mail2ethiopia.com\",\r\n \"mail2eu.com\",\r\n \"mail2europe.com\",\r\n \"mail2eurus.com\",\r\n \"mail2eva.com\",\r\n \"mail2evan.com\",\r\n \"mail2evelyn.com\",\r\n \"mail2everything.com\",\r\n \"mail2exciting.com\",\r\n \"mail2expert.com\",\r\n \"mail2fairy.com\",\r\n \"mail2faith.com\",\r\n \"mail2fanatic.com\",\r\n \"mail2fancy.com\",\r\n \"mail2fantasy.com\",\r\n \"mail2farm.com\",\r\n \"mail2farmer.com\",\r\n \"mail2fashion.com\",\r\n \"mail2fat.com\",\r\n \"mail2feeling.com\",\r\n \"mail2female.com\",\r\n \"mail2fever.com\",\r\n \"mail2fighter.com\",\r\n \"mail2fiji.com\",\r\n \"mail2filmfestival.com\",\r\n \"mail2films.com\",\r\n \"mail2finance.com\",\r\n \"mail2finland.com\",\r\n \"mail2fireman.com\",\r\n \"mail2firm.com\",\r\n \"mail2fisherman.com\",\r\n \"mail2flexible.com\",\r\n \"mail2florence.com\",\r\n \"mail2florida.com\",\r\n \"mail2floyd.com\",\r\n \"mail2fly.com\",\r\n \"mail2fond.com\",\r\n \"mail2fondness.com\",\r\n \"mail2football.com\",\r\n \"mail2footballfan.com\",\r\n \"mail2found.com\",\r\n \"mail2france.com\",\r\n \"mail2frank.com\",\r\n \"mail2frankfurt.com\",\r\n \"mail2franklin.com\",\r\n \"mail2fred.com\",\r\n \"mail2freddie.com\",\r\n \"mail2free.com\",\r\n \"mail2freedom.com\",\r\n \"mail2french.com\",\r\n \"mail2freudian.com\",\r\n \"mail2friendship.com\",\r\n \"mail2from.com\",\r\n \"mail2fun.com\",\r\n \"mail2gabon.com\",\r\n \"mail2gabriel.com\",\r\n \"mail2gail.com\",\r\n \"mail2galaxy.com\",\r\n \"mail2gambia.com\",\r\n \"mail2games.com\",\r\n \"mail2gary.com\",\r\n \"mail2gavin.com\",\r\n \"mail2gemini.com\",\r\n \"mail2gene.com\",\r\n \"mail2genes.com\",\r\n \"mail2geneva.com\",\r\n \"mail2george.com\",\r\n \"mail2georgia.com\",\r\n \"mail2gerald.com\",\r\n \"mail2german.com\",\r\n \"mail2germany.com\",\r\n \"mail2ghana.com\",\r\n \"mail2gilbert.com\",\r\n \"mail2gina.com\",\r\n \"mail2girl.com\",\r\n \"mail2glen.com\",\r\n \"mail2gloria.com\",\r\n \"mail2goddess.com\",\r\n \"mail2gold.com\",\r\n \"mail2golfclub.com\",\r\n \"mail2golfer.com\",\r\n \"mail2gordon.com\",\r\n \"mail2government.com\",\r\n \"mail2grab.com\",\r\n \"mail2grace.com\",\r\n \"mail2graham.com\",\r\n \"mail2grandma.com\",\r\n \"mail2grandpa.com\",\r\n \"mail2grant.com\",\r\n \"mail2greece.com\",\r\n \"mail2green.com\",\r\n \"mail2greg.com\",\r\n \"mail2grenada.com\",\r\n \"mail2gsm.com\",\r\n \"mail2guard.com\",\r\n \"mail2guatemala.com\",\r\n \"mail2guy.com\",\r\n \"mail2hades.com\",\r\n \"mail2haiti.com\",\r\n \"mail2hal.com\",\r\n \"mail2handhelds.com\",\r\n \"mail2hank.com\",\r\n \"mail2hannah.com\",\r\n \"mail2harold.com\",\r\n \"mail2harry.com\",\r\n \"mail2hawaii.com\",\r\n \"mail2headhunter.com\",\r\n \"mail2heal.com\",\r\n \"mail2heather.com\",\r\n \"mail2heaven.com\",\r\n \"mail2hebe.com\",\r\n \"mail2hecate.com\",\r\n \"mail2heidi.com\",\r\n \"mail2helen.com\",\r\n \"mail2hell.com\",\r\n \"mail2help.com\",\r\n \"mail2helpdesk.com\",\r\n \"mail2henry.com\",\r\n \"mail2hephaestus.com\",\r\n \"mail2hera.com\",\r\n \"mail2hercules.com\",\r\n \"mail2herman.com\",\r\n \"mail2hermes.com\",\r\n \"mail2hespera.com\",\r\n \"mail2hestia.com\",\r\n \"mail2highschool.com\",\r\n \"mail2hindu.com\",\r\n \"mail2hip.com\",\r\n \"mail2hiphop.com\",\r\n \"mail2holland.com\",\r\n \"mail2holly.com\",\r\n \"mail2hollywood.com\",\r\n \"mail2homer.com\",\r\n \"mail2honduras.com\",\r\n \"mail2honey.com\",\r\n \"mail2hongkong.com\",\r\n \"mail2hope.com\",\r\n \"mail2horse.com\",\r\n \"mail2hot.com\",\r\n \"mail2hotel.com\",\r\n \"mail2houston.com\",\r\n \"mail2howard.com\",\r\n \"mail2hugh.com\",\r\n \"mail2human.com\",\r\n \"mail2hungary.com\",\r\n \"mail2hungry.com\",\r\n \"mail2hygeia.com\",\r\n \"mail2hyperspace.com\",\r\n \"mail2hypnos.com\",\r\n \"mail2ian.com\",\r\n \"mail2ice-cream.com\",\r\n \"mail2iceland.com\",\r\n \"mail2idaho.com\",\r\n \"mail2idontknow.com\",\r\n \"mail2illinois.com\",\r\n \"mail2imam.com\",\r\n \"mail2in.com\",\r\n \"mail2india.com\",\r\n \"mail2indian.com\",\r\n \"mail2indiana.com\",\r\n \"mail2indonesia.com\",\r\n \"mail2infinity.com\",\r\n \"mail2intense.com\",\r\n \"mail2iowa.com\",\r\n \"mail2iran.com\",\r\n \"mail2iraq.com\",\r\n \"mail2ireland.com\",\r\n \"mail2irene.com\",\r\n \"mail2iris.com\",\r\n \"mail2irresistible.com\",\r\n \"mail2irving.com\",\r\n \"mail2irwin.com\",\r\n \"mail2isaac.com\",\r\n \"mail2israel.com\",\r\n \"mail2italian.com\",\r\n \"mail2italy.com\",\r\n \"mail2jackie.com\",\r\n \"mail2jacob.com\",\r\n \"mail2jail.com\",\r\n \"mail2jaime.com\",\r\n \"mail2jake.com\",\r\n \"mail2jamaica.com\",\r\n \"mail2james.com\",\r\n \"mail2jamie.com\",\r\n \"mail2jan.com\",\r\n \"mail2jane.com\",\r\n \"mail2janet.com\",\r\n \"mail2janice.com\",\r\n \"mail2japan.com\",\r\n \"mail2japanese.com\",\r\n \"mail2jasmine.com\",\r\n \"mail2jason.com\",\r\n \"mail2java.com\",\r\n \"mail2jay.com\",\r\n \"mail2jazz.com\",\r\n \"mail2jed.com\",\r\n \"mail2jeffrey.com\",\r\n \"mail2jennifer.com\",\r\n \"mail2jenny.com\",\r\n \"mail2jeremy.com\",\r\n \"mail2jerry.com\",\r\n \"mail2jessica.com\",\r\n \"mail2jessie.com\",\r\n \"mail2jesus.com\",\r\n \"mail2jew.com\",\r\n \"mail2jeweler.com\",\r\n \"mail2jim.com\",\r\n \"mail2jimmy.com\",\r\n \"mail2joan.com\",\r\n \"mail2joann.com\",\r\n \"mail2joanna.com\",\r\n \"mail2jody.com\",\r\n \"mail2joe.com\",\r\n \"mail2joel.com\",\r\n \"mail2joey.com\",\r\n \"mail2john.com\",\r\n \"mail2join.com\",\r\n \"mail2jon.com\",\r\n \"mail2jonathan.com\",\r\n \"mail2jones.com\",\r\n \"mail2jordan.com\",\r\n \"mail2joseph.com\",\r\n \"mail2josh.com\",\r\n \"mail2joy.com\",\r\n \"mail2juan.com\",\r\n \"mail2judge.com\",\r\n \"mail2judy.com\",\r\n \"mail2juggler.com\",\r\n \"mail2julian.com\",\r\n \"mail2julie.com\",\r\n \"mail2jumbo.com\",\r\n \"mail2junk.com\",\r\n \"mail2justin.com\",\r\n \"mail2justme.com\",\r\n \"mail2k.ru\",\r\n \"mail2kansas.com\",\r\n \"mail2karate.com\",\r\n \"mail2karen.com\",\r\n \"mail2karl.com\",\r\n \"mail2karma.com\",\r\n \"mail2kathleen.com\",\r\n \"mail2kathy.com\",\r\n \"mail2katie.com\",\r\n \"mail2kay.com\",\r\n \"mail2kazakhstan.com\",\r\n \"mail2keen.com\",\r\n \"mail2keith.com\",\r\n \"mail2kelly.com\",\r\n \"mail2kelsey.com\",\r\n \"mail2ken.com\",\r\n \"mail2kendall.com\",\r\n \"mail2kennedy.com\",\r\n \"mail2kenneth.com\",\r\n \"mail2kenny.com\",\r\n \"mail2kentucky.com\",\r\n \"mail2kenya.com\",\r\n \"mail2kerry.com\",\r\n \"mail2kevin.com\",\r\n \"mail2kim.com\",\r\n \"mail2kimberly.com\",\r\n \"mail2king.com\",\r\n \"mail2kirk.com\",\r\n \"mail2kiss.com\",\r\n \"mail2kosher.com\",\r\n \"mail2kristin.com\",\r\n \"mail2kurt.com\",\r\n \"mail2kuwait.com\",\r\n \"mail2kyle.com\",\r\n \"mail2kyrgyzstan.com\",\r\n \"mail2la.com\",\r\n \"mail2lacrosse.com\",\r\n \"mail2lance.com\",\r\n \"mail2lao.com\",\r\n \"mail2larry.com\",\r\n \"mail2latvia.com\",\r\n \"mail2laugh.com\",\r\n \"mail2laura.com\",\r\n \"mail2lauren.com\",\r\n \"mail2laurie.com\",\r\n \"mail2lawrence.com\",\r\n \"mail2lawyer.com\",\r\n \"mail2lebanon.com\",\r\n \"mail2lee.com\",\r\n \"mail2leo.com\",\r\n \"mail2leon.com\",\r\n \"mail2leonard.com\",\r\n \"mail2leone.com\",\r\n \"mail2leslie.com\",\r\n \"mail2letter.com\",\r\n \"mail2liberia.com\",\r\n \"mail2libertarian.com\",\r\n \"mail2libra.com\",\r\n \"mail2libya.com\",\r\n \"mail2liechtenstein.com\",\r\n \"mail2life.com\",\r\n \"mail2linda.com\",\r\n \"mail2linux.com\",\r\n \"mail2lionel.com\",\r\n \"mail2lipstick.com\",\r\n \"mail2liquid.com\",\r\n \"mail2lisa.com\",\r\n \"mail2lithuania.com\",\r\n \"mail2litigator.com\",\r\n \"mail2liz.com\",\r\n \"mail2lloyd.com\",\r\n \"mail2lois.com\",\r\n \"mail2lola.com\",\r\n \"mail2london.com\",\r\n \"mail2looking.com\",\r\n \"mail2lori.com\",\r\n \"mail2lost.com\",\r\n \"mail2lou.com\",\r\n \"mail2louis.com\",\r\n \"mail2louisiana.com\",\r\n \"mail2lovable.com\",\r\n \"mail2love.com\",\r\n \"mail2lucky.com\",\r\n \"mail2lucy.com\",\r\n \"mail2lunch.com\",\r\n \"mail2lust.com\",\r\n \"mail2luxembourg.com\",\r\n \"mail2luxury.com\",\r\n \"mail2lyle.com\",\r\n \"mail2lynn.com\",\r\n \"mail2madagascar.com\",\r\n \"mail2madison.com\",\r\n \"mail2madrid.com\",\r\n \"mail2maggie.com\",\r\n \"mail2mail4.com\",\r\n \"mail2maine.com\",\r\n \"mail2malawi.com\",\r\n \"mail2malaysia.com\",\r\n \"mail2maldives.com\",\r\n \"mail2mali.com\",\r\n \"mail2malta.com\",\r\n \"mail2mambo.com\",\r\n \"mail2man.com\",\r\n \"mail2mandy.com\",\r\n \"mail2manhunter.com\",\r\n \"mail2mankind.com\",\r\n \"mail2many.com\",\r\n \"mail2marc.com\",\r\n \"mail2marcia.com\",\r\n \"mail2margaret.com\",\r\n \"mail2margie.com\",\r\n \"mail2marhaba.com\",\r\n \"mail2maria.com\",\r\n \"mail2marilyn.com\",\r\n \"mail2marines.com\",\r\n \"mail2mark.com\",\r\n \"mail2marriage.com\",\r\n \"mail2married.com\",\r\n \"mail2marries.com\",\r\n \"mail2mars.com\",\r\n \"mail2marsha.com\",\r\n \"mail2marshallislands.com\",\r\n \"mail2martha.com\",\r\n \"mail2martin.com\",\r\n \"mail2marty.com\",\r\n \"mail2marvin.com\",\r\n \"mail2mary.com\",\r\n \"mail2maryland.com\",\r\n \"mail2mason.com\",\r\n \"mail2massachusetts.com\",\r\n \"mail2matt.com\",\r\n \"mail2matthew.com\",\r\n \"mail2maurice.com\",\r\n \"mail2mauritania.com\",\r\n \"mail2mauritius.com\",\r\n \"mail2max.com\",\r\n \"mail2maxwell.com\",\r\n \"mail2maybe.com\",\r\n \"mail2mba.com\",\r\n \"mail2me4u.com\",\r\n \"mail2mechanic.com\",\r\n \"mail2medieval.com\",\r\n \"mail2megan.com\",\r\n \"mail2mel.com\",\r\n \"mail2melanie.com\",\r\n \"mail2melissa.com\",\r\n \"mail2melody.com\",\r\n \"mail2member.com\",\r\n \"mail2memphis.com\",\r\n \"mail2methodist.com\",\r\n \"mail2mexican.com\",\r\n \"mail2mexico.com\",\r\n \"mail2mgz.com\",\r\n \"mail2miami.com\",\r\n \"mail2michael.com\",\r\n \"mail2michelle.com\",\r\n \"mail2michigan.com\",\r\n \"mail2mike.com\",\r\n \"mail2milan.com\",\r\n \"mail2milano.com\",\r\n \"mail2mildred.com\",\r\n \"mail2milkyway.com\",\r\n \"mail2millennium.com\",\r\n \"mail2millionaire.com\",\r\n \"mail2milton.com\",\r\n \"mail2mime.com\",\r\n \"mail2mindreader.com\",\r\n \"mail2mini.com\",\r\n \"mail2minister.com\",\r\n \"mail2minneapolis.com\",\r\n \"mail2minnesota.com\",\r\n \"mail2miracle.com\",\r\n \"mail2missionary.com\",\r\n \"mail2mississippi.com\",\r\n \"mail2missouri.com\",\r\n \"mail2mitch.com\",\r\n \"mail2model.com\",\r\n \"mail2moldova.commail2molly.com\",\r\n \"mail2mom.com\",\r\n \"mail2monaco.com\",\r\n \"mail2money.com\",\r\n \"mail2mongolia.com\",\r\n \"mail2monica.com\",\r\n \"mail2montana.com\",\r\n \"mail2monty.com\",\r\n \"mail2moon.com\",\r\n \"mail2morocco.com\",\r\n \"mail2morpheus.com\",\r\n \"mail2mors.com\",\r\n \"mail2moscow.com\",\r\n \"mail2moslem.com\",\r\n \"mail2mouseketeer.com\",\r\n \"mail2movies.com\",\r\n \"mail2mozambique.com\",\r\n \"mail2mp3.com\",\r\n \"mail2mrright.com\",\r\n \"mail2msright.com\",\r\n \"mail2museum.com\",\r\n \"mail2music.com\",\r\n \"mail2musician.com\",\r\n \"mail2muslim.com\",\r\n \"mail2my.com\",\r\n \"mail2myboat.com\",\r\n \"mail2mycar.com\",\r\n \"mail2mycell.com\",\r\n \"mail2mygsm.com\",\r\n \"mail2mylaptop.com\",\r\n \"mail2mymac.com\",\r\n \"mail2mypager.com\",\r\n \"mail2mypalm.com\",\r\n \"mail2mypc.com\",\r\n \"mail2myphone.com\",\r\n \"mail2myplane.com\",\r\n \"mail2namibia.com\",\r\n \"mail2nancy.com\",\r\n \"mail2nasdaq.com\",\r\n \"mail2nathan.com\",\r\n \"mail2nauru.com\",\r\n \"mail2navy.com\",\r\n \"mail2neal.com\",\r\n \"mail2nebraska.com\",\r\n \"mail2ned.com\",\r\n \"mail2neil.com\",\r\n \"mail2nelson.com\",\r\n \"mail2nemesis.com\",\r\n \"mail2nepal.com\",\r\n \"mail2netherlands.com\",\r\n \"mail2network.com\",\r\n \"mail2nevada.com\",\r\n \"mail2newhampshire.com\",\r\n \"mail2newjersey.com\",\r\n \"mail2newmexico.com\",\r\n \"mail2newyork.com\",\r\n \"mail2newzealand.com\",\r\n \"mail2nicaragua.com\",\r\n \"mail2nick.com\",\r\n \"mail2nicole.com\",\r\n \"mail2niger.com\",\r\n \"mail2nigeria.com\",\r\n \"mail2nike.com\",\r\n \"mail2no.com\",\r\n \"mail2noah.com\",\r\n \"mail2noel.com\",\r\n \"mail2noelle.com\",\r\n \"mail2normal.com\",\r\n \"mail2norman.com\",\r\n \"mail2northamerica.com\",\r\n \"mail2northcarolina.com\",\r\n \"mail2northdakota.com\",\r\n \"mail2northpole.com\",\r\n \"mail2norway.com\",\r\n \"mail2notus.com\",\r\n \"mail2noway.com\",\r\n \"mail2nowhere.com\",\r\n \"mail2nuclear.com\",\r\n \"mail2nun.com\",\r\n \"mail2ny.com\",\r\n \"mail2oasis.com\",\r\n \"mail2oceanographer.com\",\r\n \"mail2ohio.com\",\r\n \"mail2ok.com\",\r\n \"mail2oklahoma.com\",\r\n \"mail2oliver.com\",\r\n \"mail2oman.com\",\r\n \"mail2one.com\",\r\n \"mail2onfire.com\",\r\n \"mail2online.com\",\r\n \"mail2oops.com\",\r\n \"mail2open.com\",\r\n \"mail2ophthalmologist.com\",\r\n \"mail2optometrist.com\",\r\n \"mail2oregon.com\",\r\n \"mail2oscars.com\",\r\n \"mail2oslo.com\",\r\n \"mail2painter.com\",\r\n \"mail2pakistan.com\",\r\n \"mail2palau.com\",\r\n \"mail2pan.com\",\r\n \"mail2panama.com\",\r\n \"mail2paraguay.com\",\r\n \"mail2paralegal.com\",\r\n \"mail2paris.com\",\r\n \"mail2park.com\",\r\n \"mail2parker.com\",\r\n \"mail2party.com\",\r\n \"mail2passion.com\",\r\n \"mail2pat.com\",\r\n \"mail2patricia.com\",\r\n \"mail2patrick.com\",\r\n \"mail2patty.com\",\r\n \"mail2paul.com\",\r\n \"mail2paula.com\",\r\n \"mail2pay.com\",\r\n \"mail2peace.com\",\r\n \"mail2pediatrician.com\",\r\n \"mail2peggy.com\",\r\n \"mail2pennsylvania.com\",\r\n \"mail2perry.com\",\r\n \"mail2persephone.com\",\r\n \"mail2persian.com\",\r\n \"mail2peru.com\",\r\n \"mail2pete.com\",\r\n \"mail2peter.com\",\r\n \"mail2pharmacist.com\",\r\n \"mail2phil.com\",\r\n \"mail2philippines.com\",\r\n \"mail2phoenix.com\",\r\n \"mail2phonecall.com\",\r\n \"mail2phyllis.com\",\r\n \"mail2pickup.com\",\r\n \"mail2pilot.com\",\r\n \"mail2pisces.com\",\r\n \"mail2planet.com\",\r\n \"mail2platinum.com\",\r\n \"mail2plato.com\",\r\n \"mail2pluto.com\",\r\n \"mail2pm.com\",\r\n \"mail2podiatrist.com\",\r\n \"mail2poet.com\",\r\n \"mail2poland.com\",\r\n \"mail2policeman.com\",\r\n \"mail2policewoman.com\",\r\n \"mail2politician.com\",\r\n \"mail2pop.com\",\r\n \"mail2pope.com\",\r\n \"mail2popular.com\",\r\n \"mail2portugal.com\",\r\n \"mail2poseidon.com\",\r\n \"mail2potatohead.com\",\r\n \"mail2power.com\",\r\n \"mail2presbyterian.com\",\r\n \"mail2president.com\",\r\n \"mail2priest.com\",\r\n \"mail2prince.com\",\r\n \"mail2princess.com\",\r\n \"mail2producer.com\",\r\n \"mail2professor.com\",\r\n \"mail2protect.com\",\r\n \"mail2psychiatrist.com\",\r\n \"mail2psycho.com\",\r\n \"mail2psychologist.com\",\r\n \"mail2qatar.com\",\r\n \"mail2queen.com\",\r\n \"mail2rabbi.com\",\r\n \"mail2race.com\",\r\n \"mail2racer.com\",\r\n \"mail2rachel.com\",\r\n \"mail2rage.com\",\r\n \"mail2rainmaker.com\",\r\n \"mail2ralph.com\",\r\n \"mail2randy.com\",\r\n \"mail2rap.com\",\r\n \"mail2rare.com\",\r\n \"mail2rave.com\",\r\n \"mail2ray.com\",\r\n \"mail2raymond.com\",\r\n \"mail2realtor.com\",\r\n \"mail2rebecca.com\",\r\n \"mail2recruiter.com\",\r\n \"mail2recycle.com\",\r\n \"mail2redhead.com\",\r\n \"mail2reed.com\",\r\n \"mail2reggie.com\",\r\n \"mail2register.com\",\r\n \"mail2rent.com\",\r\n \"mail2republican.com\",\r\n \"mail2resort.com\",\r\n \"mail2rex.com\",\r\n \"mail2rhodeisland.com\",\r\n \"mail2rich.com\",\r\n \"mail2richard.com\",\r\n \"mail2ricky.com\",\r\n \"mail2ride.com\",\r\n \"mail2riley.com\",\r\n \"mail2rita.com\",\r\n \"mail2rob.com\",\r\n \"mail2robert.com\",\r\n \"mail2roberta.com\",\r\n \"mail2robin.com\",\r\n \"mail2rock.com\",\r\n \"mail2rocker.com\",\r\n \"mail2rod.com\",\r\n \"mail2rodney.com\",\r\n \"mail2romania.com\",\r\n \"mail2rome.com\",\r\n \"mail2ron.com\",\r\n \"mail2ronald.com\",\r\n \"mail2ronnie.com\",\r\n \"mail2rose.com\",\r\n \"mail2rosie.com\",\r\n \"mail2roy.com\",\r\n \"mail2rss.org\",\r\n \"mail2rudy.com\",\r\n \"mail2rugby.com\",\r\n \"mail2runner.com\",\r\n \"mail2russell.com\",\r\n \"mail2russia.com\",\r\n \"mail2russian.com\",\r\n \"mail2rusty.com\",\r\n \"mail2ruth.com\",\r\n \"mail2rwanda.com\",\r\n \"mail2ryan.com\",\r\n \"mail2sa.com\",\r\n \"mail2sabrina.com\",\r\n \"mail2safe.com\",\r\n \"mail2sagittarius.com\",\r\n \"mail2sail.com\",\r\n \"mail2sailor.com\",\r\n \"mail2sal.com\",\r\n \"mail2salaam.com\",\r\n \"mail2sam.com\",\r\n \"mail2samantha.com\",\r\n \"mail2samoa.com\",\r\n \"mail2samurai.com\",\r\n \"mail2sandra.com\",\r\n \"mail2sandy.com\",\r\n \"mail2sanfrancisco.com\",\r\n \"mail2sanmarino.com\",\r\n \"mail2santa.com\",\r\n \"mail2sara.com\",\r\n \"mail2sarah.com\",\r\n \"mail2sat.com\",\r\n \"mail2saturn.com\",\r\n \"mail2saudi.com\",\r\n \"mail2saudiarabia.com\",\r\n \"mail2save.com\",\r\n \"mail2savings.com\",\r\n \"mail2school.com\",\r\n \"mail2scientist.com\",\r\n \"mail2scorpio.com\",\r\n \"mail2scott.com\",\r\n \"mail2sean.com\",\r\n \"mail2search.com\",\r\n \"mail2seattle.com\",\r\n \"mail2secretagent.com\",\r\n \"mail2senate.com\",\r\n \"mail2senegal.com\",\r\n \"mail2sensual.com\",\r\n \"mail2seth.com\",\r\n \"mail2sevenseas.com\",\r\n \"mail2sexy.com\",\r\n \"mail2seychelles.com\",\r\n \"mail2shane.com\",\r\n \"mail2sharon.com\",\r\n \"mail2shawn.com\",\r\n \"mail2ship.com\",\r\n \"mail2shirley.com\",\r\n \"mail2shoot.com\",\r\n \"mail2shuttle.com\",\r\n \"mail2sierraleone.com\",\r\n \"mail2simon.com\",\r\n \"mail2singapore.com\",\r\n \"mail2single.com\",\r\n \"mail2site.com\",\r\n \"mail2skater.com\",\r\n \"mail2skier.com\",\r\n \"mail2sky.com\",\r\n \"mail2sleek.com\",\r\n \"mail2slim.com\",\r\n \"mail2slovakia.com\",\r\n \"mail2slovenia.com\",\r\n \"mail2smile.com\",\r\n \"mail2smith.com\",\r\n \"mail2smooth.com\",\r\n \"mail2soccer.com\",\r\n \"mail2soccerfan.com\",\r\n \"mail2socialist.com\",\r\n \"mail2soldier.com\",\r\n \"mail2somalia.com\",\r\n \"mail2son.com\",\r\n \"mail2song.com\",\r\n \"mail2sos.com\",\r\n \"mail2sound.com\",\r\n \"mail2southafrica.com\",\r\n \"mail2southamerica.com\",\r\n \"mail2southcarolina.com\",\r\n \"mail2southdakota.com\",\r\n \"mail2southkorea.com\",\r\n \"mail2southpole.com\",\r\n \"mail2spain.com\",\r\n \"mail2spanish.com\",\r\n \"mail2spare.com\",\r\n \"mail2spectrum.com\",\r\n \"mail2splash.com\",\r\n \"mail2sponsor.com\",\r\n \"mail2sports.com\",\r\n \"mail2srilanka.com\",\r\n \"mail2stacy.com\",\r\n \"mail2stan.com\",\r\n \"mail2stanley.com\",\r\n \"mail2star.com\",\r\n \"mail2state.com\",\r\n \"mail2stephanie.com\",\r\n \"mail2steve.com\",\r\n \"mail2steven.com\",\r\n \"mail2stewart.com\",\r\n \"mail2stlouis.com\",\r\n \"mail2stock.com\",\r\n \"mail2stockholm.com\",\r\n \"mail2stockmarket.com\",\r\n \"mail2storage.com\",\r\n \"mail2store.com\",\r\n \"mail2strong.com\",\r\n \"mail2student.com\",\r\n \"mail2studio.com\",\r\n \"mail2studio54.com\",\r\n \"mail2stuntman.com\",\r\n \"mail2subscribe.com\",\r\n \"mail2sudan.com\",\r\n \"mail2superstar.com\",\r\n \"mail2surfer.com\",\r\n \"mail2suriname.com\",\r\n \"mail2susan.com\",\r\n \"mail2suzie.com\",\r\n \"mail2swaziland.com\",\r\n \"mail2sweden.com\",\r\n \"mail2sweetheart.com\",\r\n \"mail2swim.com\",\r\n \"mail2swimmer.com\",\r\n \"mail2swiss.com\",\r\n \"mail2switzerland.com\",\r\n \"mail2sydney.com\",\r\n \"mail2sylvia.com\",\r\n \"mail2syria.com\",\r\n \"mail2taboo.com\",\r\n \"mail2taiwan.com\",\r\n \"mail2tajikistan.com\",\r\n \"mail2tammy.com\",\r\n \"mail2tango.com\",\r\n \"mail2tanya.com\",\r\n \"mail2tanzania.com\",\r\n \"mail2tara.com\",\r\n \"mail2taurus.com\",\r\n \"mail2taxi.com\",\r\n \"mail2taxidermist.com\",\r\n \"mail2taylor.com\",\r\n \"mail2taz.com\",\r\n \"mail2teacher.com\",\r\n \"mail2technician.com\",\r\n \"mail2ted.com\",\r\n \"mail2telephone.com\",\r\n \"mail2teletubbie.com\",\r\n \"mail2tenderness.com\",\r\n \"mail2tennessee.com\",\r\n \"mail2tennis.com\",\r\n \"mail2tennisfan.com\",\r\n \"mail2terri.com\",\r\n \"mail2terry.com\",\r\n \"mail2test.com\",\r\n \"mail2texas.com\",\r\n \"mail2thailand.com\",\r\n \"mail2therapy.com\",\r\n \"mail2think.com\",\r\n \"mail2tickets.com\",\r\n \"mail2tiffany.com\",\r\n \"mail2tim.com\",\r\n \"mail2time.com\",\r\n \"mail2timothy.com\",\r\n \"mail2tina.com\",\r\n \"mail2titanic.com\",\r\n \"mail2toby.com\",\r\n \"mail2todd.com\",\r\n \"mail2togo.com\",\r\n \"mail2tom.com\",\r\n \"mail2tommy.com\",\r\n \"mail2tonga.com\",\r\n \"mail2tony.com\",\r\n \"mail2touch.com\",\r\n \"mail2tourist.com\",\r\n \"mail2tracey.com\",\r\n \"mail2tracy.com\",\r\n \"mail2tramp.com\",\r\n \"mail2travel.com\",\r\n \"mail2traveler.com\",\r\n \"mail2travis.com\",\r\n \"mail2trekkie.com\",\r\n \"mail2trex.com\",\r\n \"mail2triallawyer.com\",\r\n \"mail2trick.com\",\r\n \"mail2trillionaire.com\",\r\n \"mail2troy.com\",\r\n \"mail2truck.com\",\r\n \"mail2trump.com\",\r\n \"mail2try.com\",\r\n \"mail2tunisia.com\",\r\n \"mail2turbo.com\",\r\n \"mail2turkey.com\",\r\n \"mail2turkmenistan.com\",\r\n \"mail2tv.com\",\r\n \"mail2tycoon.com\",\r\n \"mail2tyler.com\",\r\n \"mail2u4me.com\",\r\n \"mail2uae.com\",\r\n \"mail2uganda.com\",\r\n \"mail2uk.com\",\r\n \"mail2ukraine.com\",\r\n \"mail2uncle.com\",\r\n \"mail2unsubscribe.com\",\r\n \"mail2uptown.com\",\r\n \"mail2uruguay.com\",\r\n \"mail2usa.com\",\r\n \"mail2utah.com\",\r\n \"mail2uzbekistan.com\",\r\n \"mail2v.com\",\r\n \"mail2vacation.com\",\r\n \"mail2valentines.com\",\r\n \"mail2valerie.com\",\r\n \"mail2valley.com\",\r\n \"mail2vamoose.com\",\r\n \"mail2vanessa.com\",\r\n \"mail2vanuatu.com\",\r\n \"mail2venezuela.com\",\r\n \"mail2venous.com\",\r\n \"mail2venus.com\",\r\n \"mail2vermont.com\",\r\n \"mail2vickie.com\",\r\n \"mail2victor.com\",\r\n \"mail2victoria.com\",\r\n \"mail2vienna.com\",\r\n \"mail2vietnam.com\",\r\n \"mail2vince.com\",\r\n \"mail2virginia.com\",\r\n \"mail2virgo.com\",\r\n \"mail2visionary.com\",\r\n \"mail2vodka.com\",\r\n \"mail2volleyball.com\",\r\n \"mail2waiter.com\",\r\n \"mail2wallstreet.com\",\r\n \"mail2wally.com\",\r\n \"mail2walter.com\",\r\n \"mail2warren.com\",\r\n \"mail2washington.com\",\r\n \"mail2wave.com\",\r\n \"mail2way.com\",\r\n \"mail2waycool.com\",\r\n \"mail2wayne.com\",\r\n \"mail2webmaster.com\",\r\n \"mail2webtop.com\",\r\n \"mail2webtv.com\",\r\n \"mail2weird.com\",\r\n \"mail2wendell.com\",\r\n \"mail2wendy.com\",\r\n \"mail2westend.com\",\r\n \"mail2westvirginia.com\",\r\n \"mail2whether.com\",\r\n \"mail2whip.com\",\r\n \"mail2white.com\",\r\n \"mail2whitehouse.com\",\r\n \"mail2whitney.com\",\r\n \"mail2why.com\",\r\n \"mail2wilbur.com\",\r\n \"mail2wild.com\",\r\n \"mail2willard.com\",\r\n \"mail2willie.com\",\r\n \"mail2wine.com\",\r\n \"mail2winner.com\",\r\n \"mail2wired.com\",\r\n \"mail2wisconsin.com\",\r\n \"mail2woman.com\",\r\n \"mail2wonder.com\",\r\n \"mail2world.com\",\r\n \"mail2worship.com\",\r\n \"mail2wow.com\",\r\n \"mail2www.com\",\r\n \"mail2wyoming.com\",\r\n \"mail2xfiles.com\",\r\n \"mail2xox.com\",\r\n \"mail2yachtclub.com\",\r\n \"mail2yahalla.com\",\r\n \"mail2yemen.com\",\r\n \"mail2yes.com\",\r\n \"mail2yugoslavia.com\",\r\n \"mail2zack.com\",\r\n \"mail2zambia.com\",\r\n \"mail2zenith.com\",\r\n \"mail2zephir.com\",\r\n \"mail2zeus.com\",\r\n \"mail2zipper.com\",\r\n \"mail2zoo.com\",\r\n \"mail2zoologist.com\",\r\n \"mail2zurich.com\",\r\n \"mail3000.com\",\r\n \"mail333.com\",\r\n \"mail4trash.com\",\r\n \"mail4u.info\",\r\n \"mail8.com\",\r\n \"mailandftp.com\",\r\n \"mailandnews.com\",\r\n \"mailas.com\",\r\n \"mailasia.com\",\r\n \"mailbidon.com\",\r\n \"mailbiz.biz\",\r\n \"mailblocks.com\",\r\n \"mailbolt.com\",\r\n \"mailbomb.net\",\r\n \"mailboom.com\",\r\n \"mailbox.as\",\r\n \"mailbox.co.za\",\r\n \"mailbox.gr\",\r\n \"mailbox.hu\",\r\n \"mailbox72.biz\",\r\n \"mailbox80.biz\",\r\n \"mailbr.com.br\",\r\n \"mailbucket.org\",\r\n \"mailc.net\",\r\n \"mailcan.com\",\r\n \"mailcat.biz\",\r\n \"mailcatch.com\",\r\n \"mailcc.com\",\r\n \"mailchoose.co\",\r\n \"mailcity.com\",\r\n \"mailclub.fr\",\r\n \"mailclub.net\",\r\n \"mailde.de\",\r\n \"mailde.info\",\r\n \"maildrop.cc\",\r\n \"maildrop.gq\",\r\n \"maildx.com\",\r\n \"mailed.ro\",\r\n \"maileimer.de\",\r\n \"mailexcite.com\",\r\n \"mailexpire.com\",\r\n \"mailfa.tk\",\r\n \"mailfly.com\",\r\n \"mailforce.net\",\r\n \"mailforspam.com\",\r\n \"mailfree.gq\",\r\n \"mailfreeonline.com\",\r\n \"mailfreeway.com\",\r\n \"mailfs.com\",\r\n \"mailftp.com\",\r\n \"mailgate.gr\",\r\n \"mailgate.ru\",\r\n \"mailgenie.net\",\r\n \"mailguard.me\",\r\n \"mailhaven.com\",\r\n \"mailhood.com\",\r\n \"mailimate.com\",\r\n \"mailin8r.com\",\r\n \"mailinatar.com\",\r\n \"mailinater.com\",\r\n \"mailinator.com\",\r\n \"mailinator.net\",\r\n \"mailinator.org\",\r\n \"mailinator.us\",\r\n \"mailinator2.com\",\r\n \"mailinblack.com\",\r\n \"mailincubator.com\",\r\n \"mailingaddress.org\",\r\n \"mailingweb.com\",\r\n \"mailisent.com\",\r\n \"mailismagic.com\",\r\n \"mailite.com\",\r\n \"mailmate.com\",\r\n \"mailme.dk\",\r\n \"mailme.gq\",\r\n \"mailme.ir\",\r\n \"mailme.lv\",\r\n \"mailme24.com\",\r\n \"mailmetrash.com\",\r\n \"mailmight.com\",\r\n \"mailmij.nl\",\r\n \"mailmoat.com\",\r\n \"mailms.com\",\r\n \"mailnator.com\",\r\n \"mailnesia.com\",\r\n \"mailnew.com\",\r\n \"mailnull.com\",\r\n \"mailops.com\",\r\n \"mailorg.org\",\r\n \"mailoye.com\",\r\n \"mailpanda.com\",\r\n \"mailpick.biz\",\r\n \"mailpokemon.com\",\r\n \"mailpost.zzn.com\",\r\n \"mailpride.com\",\r\n \"mailproxsy.com\",\r\n \"mailpuppy.com\",\r\n \"mailquack.com\",\r\n \"mailrock.biz\",\r\n \"mailroom.com\",\r\n \"mailru.com\",\r\n \"mailsac.com\",\r\n \"mailscrap.com\",\r\n \"mailseal.de\",\r\n \"mailsent.net\",\r\n \"mailserver.ru\",\r\n \"mailservice.ms\",\r\n \"mailshell.com\",\r\n \"mailshuttle.com\",\r\n \"mailsiphon.com\",\r\n \"mailslapping.com\",\r\n \"mailsnare.net\",\r\n \"mailstart.com\",\r\n \"mailstartplus.com\",\r\n \"mailsurf.com\",\r\n \"mailtag.com\",\r\n \"mailtemp.info\",\r\n \"mailto.de\",\r\n \"mailtome.de\",\r\n \"mailtothis.com\",\r\n \"mailtrash.net\",\r\n \"mailtv.net\",\r\n \"mailtv.tv\",\r\n \"mailueberfall.de\",\r\n \"mailup.net\",\r\n \"mailwire.com\",\r\n \"mailworks.org\",\r\n \"mailzi.ru\",\r\n \"mailzilla.com\",\r\n \"mailzilla.org\",\r\n \"makemetheking.com\",\r\n \"maktoob.com\",\r\n \"malayalamtelevision.net\",\r\n \"malayalapathram.com\",\r\n \"male.ru\",\r\n \"maltesemail.com\",\r\n \"mamber.net\",\r\n \"manager.de\",\r\n \"manager.in.th\",\r\n \"mancity.net\",\r\n \"manlymail.net\",\r\n \"mantrafreenet.com\",\r\n \"mantramail.com\",\r\n \"mantraonline.com\",\r\n \"manutdfans.com\",\r\n \"manybrain.com\",\r\n \"marchmail.com\",\r\n \"marfino.net\",\r\n \"margarita.ru\",\r\n \"mariah-carey.ml.org\",\r\n \"mariahc.com\",\r\n \"marijuana.com\",\r\n \"marijuana.nl\",\r\n \"marketing.lu\",\r\n \"marketingfanatic.com\",\r\n \"marketweighton.com\",\r\n \"married-not.com\",\r\n \"marriedandlovingit.com\",\r\n \"marry.ru\",\r\n \"marsattack.com\",\r\n \"martindalemail.com\",\r\n \"martinguerre.net\",\r\n \"mash4077.com\",\r\n \"masrawy.com\",\r\n \"matmail.com\",\r\n \"mauimail.com\",\r\n \"mauritius.com\",\r\n \"maximumedge.com\",\r\n \"maxleft.com\",\r\n \"maxmail.co.uk\",\r\n \"mayaple.ru\",\r\n \"mbox.com.au\",\r\n \"mbx.cc\",\r\n \"mchsi.com\",\r\n \"mcrmail.com\",\r\n \"me-mail.hu\",\r\n \"me.com\",\r\n \"meanpeoplesuck.com\",\r\n \"meatismurder.net\",\r\n \"medical.net.au\",\r\n \"medmail.com\",\r\n \"medscape.com\",\r\n \"meetingmall.com\",\r\n \"mega.zik.dj\",\r\n \"megago.com\",\r\n \"megamail.pt\",\r\n \"megapoint.com\",\r\n \"mehrani.com\",\r\n \"mehtaweb.com\",\r\n \"meine-dateien.info\",\r\n \"meine-diashow.de\",\r\n \"meine-fotos.info\",\r\n \"meine-urlaubsfotos.de\",\r\n \"meinspamschutz.de\",\r\n \"mekhong.com\",\r\n \"melodymail.com\",\r\n \"meloo.com\",\r\n \"meltmail.com\",\r\n \"members.student.com\",\r\n \"menja.net\",\r\n \"merda.flu.cc\",\r\n \"merda.igg.biz\",\r\n \"merda.nut.cc\",\r\n \"merda.usa.cc\",\r\n \"merseymail.com\",\r\n \"mesra.net\",\r\n \"message.hu\",\r\n \"message.myspace.com\",\r\n \"messagebeamer.de\",\r\n \"messages.to\",\r\n \"messagez.com\",\r\n \"metacrawler.com\",\r\n \"metalfan.com\",\r\n \"metaping.com\",\r\n \"metta.lk\",\r\n \"mexicomail.com\",\r\n \"mezimages.net\",\r\n \"mfsa.ru\",\r\n \"miatadriver.com\",\r\n \"mierdamail.com\",\r\n \"miesto.sk\",\r\n \"mighty.co.za\",\r\n \"migmail.net\",\r\n \"migmail.pl\",\r\n \"migumail.com\",\r\n \"miho-nakayama.com\",\r\n \"mikrotamanet.com\",\r\n \"millionaireintraining.com\",\r\n \"millionairemail.com\",\r\n \"milmail.com\",\r\n \"milmail.com15\",\r\n \"mindless.com\",\r\n \"mindspring.com\",\r\n \"minermail.com\",\r\n \"mini-mail.com\",\r\n \"minister.com\",\r\n \"ministry-of-silly-walks.de\",\r\n \"mintemail.com\",\r\n \"misery.net\",\r\n \"misterpinball.de\",\r\n \"mit.tc\",\r\n \"mittalweb.com\",\r\n \"mixmail.com\",\r\n \"mjfrogmail.com\",\r\n \"ml1.net\",\r\n \"mlanime.com\",\r\n \"mlb.bounce.ed10.net\",\r\n \"mm.st\",\r\n \"mmail.com\",\r\n \"mns.ru\",\r\n \"mo3gov.net\",\r\n \"moakt.com\",\r\n \"mobico.ru\",\r\n \"mobilbatam.com\",\r\n \"mobileninja.co.uk\",\r\n \"mochamail.com\",\r\n \"modemnet.net\",\r\n \"modernenglish.com\",\r\n \"modomail.com\",\r\n \"mohammed.com\",\r\n \"mohmal.com\",\r\n \"moldova.cc\",\r\n \"moldova.com\",\r\n \"moldovacc.com\",\r\n \"mom-mail.com\",\r\n \"momslife.com\",\r\n \"moncourrier.fr.nf\",\r\n \"monemail.com\",\r\n \"monemail.fr.nf\",\r\n \"money.net\",\r\n \"mongol.net\",\r\n \"monmail.fr.nf\",\r\n \"monsieurcinema.com\",\r\n \"montevideo.com.uy\",\r\n \"monumentmail.com\",\r\n \"moomia.com\",\r\n \"moonman.com\",\r\n \"moose-mail.com\",\r\n \"mor19.uu.gl\",\r\n \"mortaza.com\",\r\n \"mosaicfx.com\",\r\n \"moscowmail.com\",\r\n \"mosk.ru\",\r\n \"most-wanted.com\",\r\n \"mostlysunny.com\",\r\n \"motorcyclefan.net\",\r\n \"motormania.com\",\r\n \"movemail.com\",\r\n \"movieemail.net\",\r\n \"movieluver.com\",\r\n \"mox.pp.ua\",\r\n \"mozartmail.com\",\r\n \"mozhno.net\",\r\n \"mp3haze.com\",\r\n \"mp4.it\",\r\n \"mr-potatohead.com\",\r\n \"mrpost.com\",\r\n \"mrspender.com\",\r\n \"mscold.com\",\r\n \"msgbox.com\",\r\n \"msn.cn\",\r\n \"msn.com\",\r\n \"msn.nl\",\r\n \"msx.ru\",\r\n \"mt2009.com\",\r\n \"mt2014.com\",\r\n \"mt2015.com\",\r\n \"mt2016.com\",\r\n \"mttestdriver.com\",\r\n \"muehlacker.tk\",\r\n \"multiplechoices\",\r\n \"mundomail.net\",\r\n \"munich.com\",\r\n \"music.com\",\r\n \"music.com19\",\r\n \"music.maigate.ru\",\r\n \"musician.com\",\r\n \"musician.org\",\r\n \"musicscene.org\",\r\n \"muskelshirt.de\",\r\n \"muslim.com\",\r\n \"muslimemail.com\",\r\n \"muslimsonline.com\",\r\n \"mutantweb.com\",\r\n \"mvrht.com\",\r\n \"my.com\",\r\n \"my10minutemail.com\",\r\n \"my180s.com\",\r\n \"mybox.it\",\r\n \"mycabin.com\",\r\n \"mycampus.com\",\r\n \"mycard.net.ua\",\r\n \"mycity.com\",\r\n \"mycleaninbox.net\",\r\n \"mycool.com\",\r\n \"mydomain.com\",\r\n \"mydotcomaddress.com\",\r\n \"myfairpoint.net\",\r\n \"myfamily.com\",\r\n \"myfastmail.com\",\r\n \"myfunnymail.com\",\r\n \"mygo.com\",\r\n \"myiris.com\",\r\n \"myjazzmail.com\",\r\n \"mymac.ru\",\r\n \"mymacmail.com\",\r\n \"mymail-in.net\",\r\n \"mymail.ro\",\r\n \"mynamedot.com\",\r\n \"mynet.com\",\r\n \"mynetaddress.com\",\r\n \"mynetstore.de\",\r\n \"myotw.net\",\r\n \"myownemail.com\",\r\n \"myownfriends.com\",\r\n \"mypacks.net\",\r\n \"mypad.com\",\r\n \"mypartyclip.de\",\r\n \"mypersonalemail.com\",\r\n \"myphantomemail.com\",\r\n \"myplace.com\",\r\n \"myrambler.ru\",\r\n \"myrealbox.com\",\r\n \"myremarq.com\",\r\n \"mysamp.de\",\r\n \"myself.com\",\r\n \"myspaceinc.net\",\r\n \"myspamless.com\",\r\n \"mystupidjob.com\",\r\n \"mytemp.email\",\r\n \"mytempemail.com\",\r\n \"mytempmail.com\",\r\n \"mythirdage.com\",\r\n \"mytrashmail.com\",\r\n \"myway.com\",\r\n \"myworldmail.com\",\r\n \"n2.com\",\r\n \"n2baseball.com\",\r\n \"n2business.com\",\r\n \"n2mail.com\",\r\n \"n2soccer.com\",\r\n \"n2software.com\",\r\n \"nabc.biz\",\r\n \"nabuma.com\",\r\n \"nafe.com\",\r\n \"nagarealm.com\",\r\n \"nagpal.net\",\r\n \"nakedgreens.com\",\r\n \"name.com\",\r\n \"nameplanet.com\",\r\n \"nanaseaikawa.com\",\r\n \"nandomail.com\",\r\n \"naplesnews.net\",\r\n \"naseej.com\",\r\n \"nate.com\",\r\n \"nativestar.net\",\r\n \"nativeweb.net\",\r\n \"naui.net\",\r\n \"naver.com\",\r\n \"navigator.lv\",\r\n \"navy.org\",\r\n \"naz.com\",\r\n \"nc.rr.com\",\r\n \"nc.ru\",\r\n \"nchoicemail.com\",\r\n \"neeva.net\",\r\n \"nekto.com\",\r\n \"nekto.net\",\r\n \"nekto.ru\",\r\n \"nemra1.com\",\r\n \"nenter.com\",\r\n \"neo.rr.com\",\r\n \"neomailbox.com\",\r\n \"nepwk.com\",\r\n \"nervhq.org\",\r\n \"nervmich.net\",\r\n \"nervtmich.net\",\r\n \"net-c.be\",\r\n \"net-c.ca\",\r\n \"net-c.cat\",\r\n \"net-c.com\",\r\n \"net-c.es\",\r\n \"net-c.fr\",\r\n \"net-c.it\",\r\n \"net-c.lu\",\r\n \"net-c.nl\",\r\n \"net-c.pl\",\r\n \"net-pager.net\",\r\n \"net-shopping.com\",\r\n \"net.tf\",\r\n \"net4b.pt\",\r\n \"net4you.at\",\r\n \"netaddres.ru\",\r\n \"netaddress.ru\",\r\n \"netbounce.com\",\r\n \"netbroadcaster.com\",\r\n \"netby.dk\",\r\n \"netc.eu\",\r\n \"netc.fr\",\r\n \"netc.it\",\r\n \"netc.lu\",\r\n \"netc.pl\",\r\n \"netcenter-vn.net\",\r\n \"netcity.ru\",\r\n \"netcmail.com\",\r\n \"netcourrier.com\",\r\n \"netexecutive.com\",\r\n \"netexpressway.com\",\r\n \"netfirms.com\",\r\n \"netgenie.com\",\r\n \"netian.com\",\r\n \"netizen.com.ar\",\r\n \"netkushi.com\",\r\n \"netlane.com\",\r\n \"netlimit.com\",\r\n \"netmail.kg\",\r\n \"netmails.com\",\r\n \"netmails.net\",\r\n \"netman.ru\",\r\n \"netmanor.com\",\r\n \"netmongol.com\",\r\n \"netnet.com.sg\",\r\n \"netnoir.net\",\r\n \"netpiper.com\",\r\n \"netposta.net\",\r\n \"netradiomail.com\",\r\n \"netralink.com\",\r\n \"netscape.net\",\r\n \"netscapeonline.co.uk\",\r\n \"netspace.net.au\",\r\n \"netspeedway.com\",\r\n \"netsquare.com\",\r\n \"netster.com\",\r\n \"nettaxi.com\",\r\n \"nettemail.com\",\r\n \"netterchef.de\",\r\n \"netti.fi\",\r\n \"netvigator.com\",\r\n \"netzero.com\",\r\n \"netzero.net\",\r\n \"netzidiot.de\",\r\n \"netzoola.com\",\r\n \"neue-dateien.de\",\r\n \"neuf.fr\",\r\n \"neuro.md\",\r\n \"neustreet.com\",\r\n \"neverbox.com\",\r\n \"newap.ru\",\r\n \"newarbat.net\",\r\n \"newmail.com\",\r\n \"newmail.net\",\r\n \"newmail.ru\",\r\n \"newsboysmail.com\",\r\n \"newyork.com\",\r\n \"newyorkcity.com\",\r\n \"nextmail.ru\",\r\n \"nexxmail.com\",\r\n \"nfmail.com\",\r\n \"ngs.ru\",\r\n \"nhmail.com\",\r\n \"nice-4u.com\",\r\n \"nicebush.com\",\r\n \"nicegal.com\",\r\n \"nicholastse.net\",\r\n \"nicolastse.com\",\r\n \"niepodam.pl\",\r\n \"nightimeuk.com\",\r\n \"nightmail.com\",\r\n \"nightmail.ru\",\r\n \"nikopage.com\",\r\n \"nikulino.net\",\r\n \"nimail.com\",\r\n \"nincsmail.hu\",\r\n \"ninfan.com\",\r\n \"nirvanafan.com\",\r\n \"nm.ru\",\r\n \"nmail.cf\",\r\n \"nnh.com\",\r\n \"nnov.ru\",\r\n \"no-spam.ws\",\r\n \"no4ma.ru\",\r\n \"noavar.com\",\r\n \"noblepioneer.com\",\r\n \"nogmailspam.info\",\r\n \"nomail.pw\",\r\n \"nomail.xl.cx\",\r\n \"nomail2me.com\",\r\n \"nomorespamemails.com\",\r\n \"nonpartisan.com\",\r\n \"nonspam.eu\",\r\n \"nonspammer.de\",\r\n \"nonstopcinema.com\",\r\n \"norika-fujiwara.com\",\r\n \"norikomail.com\",\r\n \"northgates.net\",\r\n \"nospam.ze.tc\",\r\n \"nospam4.us\",\r\n \"nospamfor.us\",\r\n \"nospammail.net\",\r\n \"nospamthanks.info\",\r\n \"notmailinator.com\",\r\n \"notsharingmy.info\",\r\n \"notyouagain.com\",\r\n \"novogireevo.net\",\r\n \"novokosino.net\",\r\n \"nowhere.org\",\r\n \"nowmymail.com\",\r\n \"ntelos.net\",\r\n \"ntlhelp.net\",\r\n \"ntlworld.com\",\r\n \"ntscan.com\",\r\n \"null.net\",\r\n \"nullbox.info\",\r\n \"numep.ru\",\r\n \"nur-fuer-spam.de\",\r\n \"nurfuerspam.de\",\r\n \"nus.edu.sg\",\r\n \"nuvse.com\",\r\n \"nwldx.com\",\r\n \"nxt.ru\",\r\n \"ny.com\",\r\n \"nybce.com\",\r\n \"nybella.com\",\r\n \"nyc.com\",\r\n \"nycmail.com\",\r\n \"nz11.com\",\r\n \"nzoomail.com\",\r\n \"o-tay.com\",\r\n \"o2.co.uk\",\r\n \"o2.pl\",\r\n \"oaklandas-fan.com\",\r\n \"oath.com\",\r\n \"objectmail.com\",\r\n \"obobbo.com\",\r\n \"oceanfree.net\",\r\n \"ochakovo.net\",\r\n \"odaymail.com\",\r\n \"oddpost.com\",\r\n \"odmail.com\",\r\n \"odnorazovoe.ru\",\r\n \"office-dateien.de\",\r\n \"office-email.com\",\r\n \"officedomain.com\",\r\n \"offroadwarrior.com\",\r\n \"oi.com.br\",\r\n \"oicexchange.com\",\r\n \"oikrach.com\",\r\n \"ok.kz\",\r\n \"ok.net\",\r\n \"ok.ru\",\r\n \"okbank.com\",\r\n \"okhuman.com\",\r\n \"okmad.com\",\r\n \"okmagic.com\",\r\n \"okname.net\",\r\n \"okuk.com\",\r\n \"oldbuthealthy.com\",\r\n \"oldies1041.com\",\r\n \"oldies104mail.com\",\r\n \"ole.com\",\r\n \"olemail.com\",\r\n \"oligarh.ru\",\r\n \"olympist.net\",\r\n \"olypmall.ru\",\r\n \"omaninfo.com\",\r\n \"omen.ru\",\r\n \"ondikoi.com\",\r\n \"onebox.com\",\r\n \"onenet.com.ar\",\r\n \"oneoffemail.com\",\r\n \"oneoffmail.com\",\r\n \"onet.com.pl\",\r\n \"onet.eu\",\r\n \"onet.pl\",\r\n \"onewaymail.com\",\r\n \"oninet.pt\",\r\n \"onlatedotcom.info\",\r\n \"online.de\",\r\n \"online.ie\",\r\n \"online.ms\",\r\n \"online.nl\",\r\n \"online.ru\",\r\n \"onlinecasinogamblings.com\",\r\n \"onlinewiz.com\",\r\n \"onmicrosoft.com\",\r\n \"onmilwaukee.com\",\r\n \"onobox.com\",\r\n \"onvillage.com\",\r\n \"oopi.org\",\r\n \"op.pl\",\r\n \"opayq.com\",\r\n \"opendiary.com\",\r\n \"openmailbox.org\",\r\n \"operafan.com\",\r\n \"operamail.com\",\r\n \"opoczta.pl\",\r\n \"optician.com\",\r\n \"optonline.net\",\r\n \"optusnet.com.au\",\r\n \"orange.fr\",\r\n \"orange.net\",\r\n \"orbitel.bg\",\r\n \"ordinaryamerican.net\",\r\n \"orgmail.net\",\r\n \"orthodontist.net\",\r\n \"osite.com.br\",\r\n \"oso.com\",\r\n \"otakumail.com\",\r\n \"otherinbox.com\",\r\n \"our-computer.com\",\r\n \"our-office.com\",\r\n \"our.st\",\r\n \"ourbrisbane.com\",\r\n \"ourklips.com\",\r\n \"ournet.md\",\r\n \"outel.com\",\r\n \"outgun.com\",\r\n \"outlawspam.com\",\r\n \"outlook.at\",\r\n \"outlook.be\",\r\n \"outlook.cl\",\r\n \"outlook.co.id\",\r\n \"outlook.co.il\",\r\n \"outlook.co.nz\",\r\n \"outlook.co.th\",\r\n \"outlook.com\",\r\n \"outlook.com.au\",\r\n \"outlook.com.br\",\r\n \"outlook.com.gr\",\r\n \"outlook.com.pe\",\r\n \"outlook.com.tr\",\r\n \"outlook.com.vn\",\r\n \"outlook.cz\",\r\n \"outlook.de\",\r\n \"outlook.dk\",\r\n \"outlook.es\",\r\n \"outlook.fr\",\r\n \"outlook.hu\",\r\n \"outlook.ie\",\r\n \"outlook.in\",\r\n \"outlook.it\",\r\n \"outlook.jp\",\r\n \"outlook.kr\",\r\n \"outlook.lv\",\r\n \"outlook.my\",\r\n \"outlook.nl\",\r\n \"outlook.ph\",\r\n \"outlook.pt\",\r\n \"outlook.sa\",\r\n \"outlook.sg\",\r\n \"outlook.sk\",\r\n \"outloook.com\",\r\n \"over-the-rainbow.com\",\r\n \"ovi.com\",\r\n \"ovpn.to\",\r\n \"owlpic.com\",\r\n \"ownmail.net\",\r\n \"ozbytes.net.au\",\r\n \"ozemail.com.au\",\r\n \"ozz.ru\",\r\n \"pacbell.net\",\r\n \"pacific-ocean.com\",\r\n \"pacific-re.com\",\r\n \"pacificwest.com\",\r\n \"packersfan.com\",\r\n \"pagina.de\",\r\n \"pagons.org\",\r\n \"paidforsurf.com\",\r\n \"pakistanmail.com\",\r\n \"pakistanoye.com\",\r\n \"palestinemail.com\",\r\n \"pancakemail.com\",\r\n \"pandawa.com\",\r\n \"pandora.be\",\r\n \"paradiseemail.com\",\r\n \"paris.com\",\r\n \"parkjiyoon.com\",\r\n \"parrot.com\",\r\n \"parsmail.com\",\r\n \"partlycloudy.com\",\r\n \"partybombe.de\",\r\n \"partyheld.de\",\r\n \"partynight.at\",\r\n \"parvazi.com\",\r\n \"passwordmail.com\",\r\n \"pathfindermail.com\",\r\n \"patmail.com\",\r\n \"patra.net\",\r\n \"pconnections.net\",\r\n \"pcpostal.com\",\r\n \"pcsrock.com\",\r\n \"pcusers.otherinbox.com\",\r\n \"peachworld.com\",\r\n \"pechkin.ru\",\r\n \"pediatrician.com\",\r\n \"pekklemail.com\",\r\n \"pemail.net\",\r\n \"penpen.com\",\r\n \"peoplepc.com\",\r\n \"peopleweb.com\",\r\n \"pepbot.com\",\r\n \"perfectmail.com\",\r\n \"perovo.net\",\r\n \"perso.be\",\r\n \"personal.ro\",\r\n \"personales.com\",\r\n \"petlover.com\",\r\n \"petml.com\",\r\n \"petr.ru\",\r\n \"pettypool.com\",\r\n \"pezeshkpour.com\",\r\n \"pfui.ru\",\r\n \"phayze.com\",\r\n \"phone.net\",\r\n \"photo-impact.eu\",\r\n \"photographer.net\",\r\n \"phpbb.uu.gl\",\r\n \"phreaker.net\",\r\n \"phus8kajuspa.cu.cc\",\r\n \"physicist.net\",\r\n \"pianomail.com\",\r\n \"pickupman.com\",\r\n \"picusnet.com\",\r\n \"piercedallover.com\",\r\n \"pigeonportal.com\",\r\n \"pigmail.net\",\r\n \"pigpig.net\",\r\n \"pilotemail.com\",\r\n \"pimagop.com\",\r\n \"pinoymail.com\",\r\n \"piracha.net\",\r\n \"pisem.net\",\r\n \"pjjkp.com\",\r\n \"planet-mail.com\",\r\n \"planet.nl\",\r\n \"planetaccess.com\",\r\n \"planetall.com\",\r\n \"planetarymotion.net\",\r\n \"planetdirect.com\",\r\n \"planetearthinter.net\",\r\n \"planetmail.com\",\r\n \"planetmail.net\",\r\n \"planetout.com\",\r\n \"plasa.com\",\r\n \"playersodds.com\",\r\n \"playful.com\",\r\n \"playstation.sony.com\",\r\n \"plexolan.de\",\r\n \"pluno.com\",\r\n \"plus.com\",\r\n \"plus.google.com\",\r\n \"plusmail.com.br\",\r\n \"pmail.net\",\r\n \"pobox.com\",\r\n \"pobox.hu\",\r\n \"pobox.ru\",\r\n \"pobox.sk\",\r\n \"pochta.by\",\r\n \"pochta.ru\",\r\n \"pochta.ws\",\r\n \"pochtamt.ru\",\r\n \"poczta.fm\",\r\n \"poczta.onet.pl\",\r\n \"poetic.com\",\r\n \"pokemail.net\",\r\n \"pokemonpost.com\",\r\n \"pokepost.com\",\r\n \"polandmail.com\",\r\n \"polbox.com\",\r\n \"policeoffice.com\",\r\n \"politician.com\",\r\n \"politikerclub.de\",\r\n \"polizisten-duzer.de\",\r\n \"polyfaust.com\",\r\n \"poofy.org\",\r\n \"poohfan.com\",\r\n \"pookmail.com\",\r\n \"pool-sharks.com\",\r\n \"poond.com\",\r\n \"poopaloop.com\",\r\n \"pop3.ru\",\r\n \"popaccount.com\",\r\n \"popmail.com\",\r\n \"popsmail.com\",\r\n \"popstar.com\",\r\n \"populus.net\",\r\n \"portableoffice.com\",\r\n \"portugalmail.com\",\r\n \"portugalmail.pt\",\r\n \"portugalnet.com\",\r\n \"positive-thinking.com\",\r\n \"post.com\",\r\n \"post.cz\",\r\n \"post.sk\",\r\n \"posta.net\",\r\n \"posta.ro\",\r\n \"posta.rosativa.ro.org\",\r\n \"postaccesslite.com\",\r\n \"postafiok.hu\",\r\n \"postafree.com\",\r\n \"postaweb.com\",\r\n \"poste.it\",\r\n \"postfach.cc\",\r\n \"postinbox.com\",\r\n \"postino.ch\",\r\n \"postino.it\",\r\n \"postmark.net\",\r\n \"postmaster.co.uk\",\r\n \"postmaster.twitter.com\",\r\n \"postpro.net\",\r\n \"pousa.com\",\r\n \"powerdivas.com\",\r\n \"powerfan.com\",\r\n \"pp.inet.fi\",\r\n \"praize.com\",\r\n \"pray247.com\",\r\n \"predprinimatel.ru\",\r\n \"premium-mail.fr\",\r\n \"premiumproducts.com\",\r\n \"premiumservice.com\",\r\n \"prepodavatel.ru\",\r\n \"presidency.com\",\r\n \"presnya.net\",\r\n \"press.co.jp\",\r\n \"prettierthanher.com\",\r\n \"priest.com\",\r\n \"primposta.com\",\r\n \"primposta.hu\",\r\n \"printesamargareta.ro\",\r\n \"privacy.net\",\r\n \"privatdemail.net\",\r\n \"privy-mail.com\",\r\n \"privymail.de\",\r\n \"pro.hu\",\r\n \"probemail.com\",\r\n \"prodigy.net\",\r\n \"prodigy.net.mx\",\r\n \"professor.ru\",\r\n \"progetplus.it\",\r\n \"programist.ru\",\r\n \"programmer.net\",\r\n \"programozo.hu\",\r\n \"proinbox.com\",\r\n \"project2k.com\",\r\n \"prokuratura.ru\",\r\n \"prolaunch.com\",\r\n \"promessage.com\",\r\n \"prontomail.com\",\r\n \"prontomail.compopulus.net\",\r\n \"protestant.com\",\r\n \"protonmail.com\",\r\n \"proxymail.eu\",\r\n \"prtnx.com\",\r\n \"prydirect.info\",\r\n \"psv-supporter.com\",\r\n \"ptd.net\",\r\n \"public-files.de\",\r\n \"public.usa.com\",\r\n \"publicist.com\",\r\n \"pulp-fiction.com\",\r\n \"punkass.com\",\r\n \"puppy.com.my\",\r\n \"purinmail.com\",\r\n \"purpleturtle.com\",\r\n \"put2.net\",\r\n \"putthisinyourspamdatabase.com\",\r\n \"pwrby.com\",\r\n \"q.com\",\r\n \"qatar.io\",\r\n \"qatarmail.com\",\r\n \"qdice.com\",\r\n \"qip.ru\",\r\n \"qmail.com\",\r\n \"qprfans.com\",\r\n \"qq.com\",\r\n \"qrio.com\",\r\n \"quackquack.com\",\r\n \"quake.ru\",\r\n \"quakemail.com\",\r\n \"qualityservice.com\",\r\n \"quantentunnel.de\",\r\n \"qudsmail.com\",\r\n \"quepasa.com\",\r\n \"quickhosts.com\",\r\n \"quickinbox.com\",\r\n \"quickmail.nl\",\r\n \"quickmail.ru\",\r\n \"quicknet.nl\",\r\n \"quickwebmail.com\",\r\n \"quiklinks.com\",\r\n \"quikmail.com\",\r\n \"qv7.info\",\r\n \"qwest.net\",\r\n \"qwestoffice.net\",\r\n \"r-o-o-t.com\",\r\n \"r7.com\",\r\n \"raakim.com\",\r\n \"racedriver.com\",\r\n \"racefanz.com\",\r\n \"racingfan.com.au\",\r\n \"racingmail.com\",\r\n \"radicalz.com\",\r\n \"radiku.ye.vc\",\r\n \"radiologist.net\",\r\n \"ragingbull.com\",\r\n \"ralib.com\",\r\n \"rambler.ru\",\r\n \"ranmamail.com\",\r\n \"rastogi.net\",\r\n \"ratt-n-roll.com\",\r\n \"rattle-snake.com\",\r\n \"raubtierbaendiger.de\",\r\n \"ravearena.com\",\r\n \"ravefan.com\",\r\n \"ravemail.co.za\",\r\n \"ravemail.com\",\r\n \"razormail.com\",\r\n \"rccgmail.org\",\r\n \"rcn.com\",\r\n \"rcpt.at\",\r\n \"realemail.net\",\r\n \"realestatemail.net\",\r\n \"reality-concept.club\",\r\n \"reallyfast.biz\",\r\n \"reallyfast.info\",\r\n \"reallymymail.com\",\r\n \"realradiomail.com\",\r\n \"realtyagent.com\",\r\n \"realtyalerts.ca\",\r\n \"reborn.com\",\r\n \"recode.me\",\r\n \"reconmail.com\",\r\n \"recursor.net\",\r\n \"recycledmail.com\",\r\n \"recycler.com\",\r\n \"recyclermail.com\",\r\n \"rediff.com\",\r\n \"rediffmail.com\",\r\n \"rediffmailpro.com\",\r\n \"rednecks.com\",\r\n \"redseven.de\",\r\n \"redsfans.com\",\r\n \"redwhitearmy.com\",\r\n \"regbypass.com\",\r\n \"reggaefan.com\",\r\n \"reggafan.com\",\r\n \"regiononline.com\",\r\n \"registerednurses.com\",\r\n \"regspaces.tk\",\r\n \"reincarnate.com\",\r\n \"relia.com\",\r\n \"reliable-mail.com\",\r\n \"religious.com\",\r\n \"remail.ga\",\r\n \"renren.com\",\r\n \"repairman.com\",\r\n \"reply.hu\",\r\n \"reply.ticketmaster.com\",\r\n \"represantive.com\",\r\n \"representative.com\",\r\n \"rescueteam.com\",\r\n \"resgedvgfed.tk\",\r\n \"resource.calendar.google.com\",\r\n \"resumemail.com\",\r\n \"retailfan.com\",\r\n \"rexian.com\",\r\n \"rezai.com\",\r\n \"rhyta.com\",\r\n \"richmondhill.com\",\r\n \"rickymail.com\",\r\n \"rin.ru\",\r\n \"ring.by\",\r\n \"riopreto.com.br\",\r\n \"rklips.com\",\r\n \"rmqkr.net\",\r\n \"rn.com\",\r\n \"ro.ru\",\r\n \"roadrunner.com\",\r\n \"roanokemail.com\",\r\n \"rock.com\",\r\n \"rocketmail.com\",\r\n \"rocketship.com\",\r\n \"rockfan.com\",\r\n \"rodrun.com\",\r\n \"rogers.com\",\r\n \"rojname.com\",\r\n \"rol.ro\",\r\n \"rome.com\",\r\n \"romymichele.com\",\r\n \"roosh.com\",\r\n \"rootprompt.org\",\r\n \"rotfl.com\",\r\n \"roughnet.com\",\r\n \"royal.net\",\r\n \"rpharmacist.com\",\r\n \"rr.com\",\r\n \"rrohio.com\",\r\n \"rsub.com\",\r\n \"rt.nl\",\r\n \"rtrtr.com\",\r\n \"ru.ru\",\r\n \"rubyridge.com\",\r\n \"runbox.com\",\r\n \"rushpost.com\",\r\n \"ruttolibero.com\",\r\n \"rvshop.com\",\r\n \"rxdoc.biz\",\r\n \"s-mail.com\",\r\n \"s0ny.net\",\r\n \"sabreshockey.com\",\r\n \"sacbeemail.com\",\r\n \"saeuferleber.de\",\r\n \"safarimail.com\",\r\n \"safe-mail.net\",\r\n \"safersignup.de\",\r\n \"safetymail.info\",\r\n \"safetypost.de\",\r\n \"safrica.com\",\r\n \"sagra.lu\",\r\n \"sagra.lu.lu\",\r\n \"sagra.lumarketing.lu\",\r\n \"sags-per-mail.de\",\r\n \"sailormoon.com\",\r\n \"saint-mike.org\",\r\n \"saintly.com\",\r\n \"saintmail.net\",\r\n \"sale-sale-sale.com\",\r\n \"salehi.net\",\r\n \"salesperson.net\",\r\n \"samerica.com\",\r\n \"samilan.net\",\r\n \"samiznaetekogo.net\",\r\n \"sammimail.com\",\r\n \"sanchezsharks.com\",\r\n \"sandelf.de\",\r\n \"sanfranmail.com\",\r\n \"sanook.com\",\r\n \"sanriotown.com\",\r\n \"santanmail.com\",\r\n \"sapo.pt\",\r\n \"sativa.ro.org\",\r\n \"saturnfans.com\",\r\n \"saturnperformance.com\",\r\n \"saudia.com\",\r\n \"savecougars.com\",\r\n \"savelife.ml\",\r\n \"saveowls.com\",\r\n \"sayhi.net\",\r\n \"saynotospams.com\",\r\n \"sbcglbal.net\",\r\n \"sbcglobal.com\",\r\n \"sbcglobal.net\",\r\n \"scandalmail.com\",\r\n \"scanova.in\",\r\n \"scanova.io\",\r\n \"scarlet.nl\",\r\n \"scfn.net\",\r\n \"schafmail.de\",\r\n \"schizo.com\",\r\n \"schmusemail.de\",\r\n \"schoolemail.com\",\r\n \"schoolmail.com\",\r\n \"schoolsucks.com\",\r\n \"schreib-doch-mal-wieder.de\",\r\n \"schrott-email.de\",\r\n \"schweiz.org\",\r\n \"sci.fi\",\r\n \"science.com.au\",\r\n \"scientist.com\",\r\n \"scifianime.com\",\r\n \"scotland.com\",\r\n \"scotlandmail.com\",\r\n \"scottishmail.co.uk\",\r\n \"scottishtories.com\",\r\n \"scottsboro.org\",\r\n \"scrapbookscrapbook.com\",\r\n \"scubadiving.com\",\r\n \"seanet.com\",\r\n \"search.ua\",\r\n \"search417.com\",\r\n \"searchwales.com\",\r\n \"sebil.com\",\r\n \"seckinmail.com\",\r\n \"secret-police.com\",\r\n \"secretarias.com\",\r\n \"secretary.net\",\r\n \"secretemail.de\",\r\n \"secretservices.net\",\r\n \"secure-mail.biz\",\r\n \"secure-mail.cc\",\r\n \"seductive.com\",\r\n \"seekstoyboy.com\",\r\n \"seguros.com.br\",\r\n \"sekomaonline.com\",\r\n \"selfdestructingmail.com\",\r\n \"sellingspree.com\",\r\n \"send.hu\",\r\n \"sendmail.ru\",\r\n \"sendme.cz\",\r\n \"sendspamhere.com\",\r\n \"senseless-entertainment.com\",\r\n \"sent.as\",\r\n \"sent.at\",\r\n \"sent.com\",\r\n \"sentrismail.com\",\r\n \"serga.com.ar\",\r\n \"servemymail.com\",\r\n \"servermaps.net\",\r\n \"services391.com\",\r\n \"sesmail.com\",\r\n \"sexmagnet.com\",\r\n \"seznam.cz\",\r\n \"sfr.fr\",\r\n \"shahweb.net\",\r\n \"shaniastuff.com\",\r\n \"shared-files.de\",\r\n \"sharedmailbox.org\",\r\n \"sharewaredevelopers.com\",\r\n \"sharklasers.com\",\r\n \"sharmaweb.com\",\r\n \"shaw.ca\",\r\n \"she.com\",\r\n \"shellov.net\",\r\n \"shieldedmail.com\",\r\n \"shieldemail.com\",\r\n \"shiftmail.com\",\r\n \"shinedyoureyes.com\",\r\n \"shitaway.cf\",\r\n \"shitaway.cu.cc\",\r\n \"shitaway.ga\",\r\n \"shitaway.gq\",\r\n \"shitaway.ml\",\r\n \"shitaway.tk\",\r\n \"shitaway.usa.cc\",\r\n \"shitmail.de\",\r\n \"shitmail.me\",\r\n \"shitmail.org\",\r\n \"shitware.nl\",\r\n \"shmeriously.com\",\r\n \"shockinmytown.cu.cc\",\r\n \"shootmail.com\",\r\n \"shortmail.com\",\r\n \"shortmail.net\",\r\n \"shotgun.hu\",\r\n \"showfans.com\",\r\n \"showslow.de\",\r\n \"shqiptar.eu\",\r\n \"shuf.com\",\r\n \"sialkotcity.com\",\r\n \"sialkotian.com\",\r\n \"sialkotoye.com\",\r\n \"sibmail.com\",\r\n \"sify.com\",\r\n \"sigaret.net\",\r\n \"sika3.com\",\r\n \"silkroad.net\",\r\n \"simbamail.fm\",\r\n \"sina.cn\",\r\n \"sina.com\",\r\n \"sinamail.com\",\r\n \"singapore.com\",\r\n \"singles4jesus.com\",\r\n \"singmail.com\",\r\n \"singnet.com.sg\",\r\n \"singpost.com\",\r\n \"sinnlos-mail.de\",\r\n \"sirindia.com\",\r\n \"siteposter.net\",\r\n \"skafan.com\",\r\n \"skeefmail.com\",\r\n \"skim.com\",\r\n \"skizo.hu\",\r\n \"skrx.tk\",\r\n \"skunkbox.com\",\r\n \"sky.com\",\r\n \"skynet.be\",\r\n \"slamdunkfan.com\",\r\n \"slapsfromlastnight.com\",\r\n \"slaskpost.se\",\r\n \"slave-auctions.net\",\r\n \"slickriffs.co.uk\",\r\n \"slingshot.com\",\r\n \"slippery.email\",\r\n \"slipry.net\",\r\n \"slo.net\",\r\n \"slotter.com\",\r\n \"sm.westchestergov.com\",\r\n \"smap.4nmv.ru\",\r\n \"smapxsmap.net\",\r\n \"smashmail.de\",\r\n \"smellfear.com\",\r\n \"smellrear.com\",\r\n \"smileyface.comsmithemail.net\",\r\n \"sminkymail.com\",\r\n \"smoothmail.com\",\r\n \"sms.at\",\r\n \"smtp.ru\",\r\n \"snail-mail.net\",\r\n \"snail-mail.ney\",\r\n \"snakebite.com\",\r\n \"snakemail.com\",\r\n \"sndt.net\",\r\n \"sneakemail.com\",\r\n \"sneakmail.de\",\r\n \"snet.net\",\r\n \"sniper.hu\",\r\n \"snkmail.com\",\r\n \"snoopymail.com\",\r\n \"snowboarding.com\",\r\n \"snowdonia.net\",\r\n \"so-simple.org\",\r\n \"socamail.com\",\r\n \"socceraccess.com\",\r\n \"socceramerica.net\",\r\n \"soccermail.com\",\r\n \"soccermomz.com\",\r\n \"social-mailer.tk\",\r\n \"socialworker.net\",\r\n \"sociologist.com\",\r\n \"sofimail.com\",\r\n \"sofort-mail.de\",\r\n \"sofortmail.de\",\r\n \"softhome.net\",\r\n \"sogetthis.com\",\r\n \"sogou.com\",\r\n \"sohu.com\",\r\n \"sokolniki.net\",\r\n \"sol.dk\",\r\n \"solar-impact.pro\",\r\n \"solcon.nl\",\r\n \"soldier.hu\",\r\n \"solution4u.com\",\r\n \"solvemail.info\",\r\n \"songwriter.net\",\r\n \"sonnenkinder.org\",\r\n \"soodomail.com\",\r\n \"soodonims.com\",\r\n \"soon.com\",\r\n \"soulfoodcookbook.com\",\r\n \"soundofmusicfans.com\",\r\n \"southparkmail.com\",\r\n \"sovsem.net\",\r\n \"sp.nl\",\r\n \"space-bank.com\",\r\n \"space-man.com\",\r\n \"space-ship.com\",\r\n \"space-travel.com\",\r\n \"space.com\",\r\n \"spaceart.com\",\r\n \"spacebank.com\",\r\n \"spacemart.com\",\r\n \"spacetowns.com\",\r\n \"spacewar.com\",\r\n \"spainmail.com\",\r\n \"spam.2012-2016.ru\",\r\n \"spam4.me\",\r\n \"spamail.de\",\r\n \"spamarrest.com\",\r\n \"spamavert.com\",\r\n \"spambob.com\",\r\n \"spambob.net\",\r\n \"spambob.org\",\r\n \"spambog.com\",\r\n \"spambog.de\",\r\n \"spambog.net\",\r\n \"spambog.ru\",\r\n \"spambooger.com\",\r\n \"spambox.info\",\r\n \"spambox.us\",\r\n \"spamcannon.com\",\r\n \"spamcannon.net\",\r\n \"spamcero.com\",\r\n \"spamcon.org\",\r\n \"spamcorptastic.com\",\r\n \"spamcowboy.com\",\r\n \"spamcowboy.net\",\r\n \"spamcowboy.org\",\r\n \"spamday.com\",\r\n \"spamdecoy.net\",\r\n \"spameater.com\",\r\n \"spameater.org\",\r\n \"spamex.com\",\r\n \"spamfree.eu\",\r\n \"spamfree24.com\",\r\n \"spamfree24.de\",\r\n \"spamfree24.info\",\r\n \"spamfree24.net\",\r\n \"spamfree24.org\",\r\n \"spamgoes.in\",\r\n \"spamgourmet.com\",\r\n \"spamgourmet.net\",\r\n \"spamgourmet.org\",\r\n \"spamherelots.com\",\r\n \"spamhereplease.com\",\r\n \"spamhole.com\",\r\n \"spamify.com\",\r\n \"spaminator.de\",\r\n \"spamkill.info\",\r\n \"spaml.com\",\r\n \"spaml.de\",\r\n \"spammotel.com\",\r\n \"spamobox.com\",\r\n \"spamoff.de\",\r\n \"spamslicer.com\",\r\n \"spamspot.com\",\r\n \"spamstack.net\",\r\n \"spamthis.co.uk\",\r\n \"spamtroll.net\",\r\n \"spankthedonkey.com\",\r\n \"spartapiet.com\",\r\n \"spazmail.com\",\r\n \"speed.1s.fr\",\r\n \"speedemail.net\",\r\n \"speedpost.net\",\r\n \"speedrules.com\",\r\n \"speedrulz.com\",\r\n \"speedy.com.ar\",\r\n \"speedymail.org\",\r\n \"sperke.net\",\r\n \"spils.com\",\r\n \"spinfinder.com\",\r\n \"spiritseekers.com\",\r\n \"spl.at\",\r\n \"spoko.pl\",\r\n \"spoofmail.de\",\r\n \"sportemail.com\",\r\n \"sportmail.ru\",\r\n \"sportsmail.com\",\r\n \"sporttruckdriver.com\",\r\n \"spray.no\",\r\n \"spray.se\",\r\n \"spybox.de\",\r\n \"spymac.com\",\r\n \"sraka.xyz\",\r\n \"srilankan.net\",\r\n \"ssl-mail.com\",\r\n \"st-davids.net\",\r\n \"stade.fr\",\r\n \"stalag13.com\",\r\n \"standalone.net\",\r\n \"starbuzz.com\",\r\n \"stargateradio.com\",\r\n \"starmail.com\",\r\n \"starmail.org\",\r\n \"starmedia.com\",\r\n \"starplace.com\",\r\n \"starspath.com\",\r\n \"start.com.au\",\r\n \"starting-point.com\",\r\n \"startkeys.com\",\r\n \"startrekmail.com\",\r\n \"starwars-fans.com\",\r\n \"stealthmail.com\",\r\n \"stillchronic.com\",\r\n \"stinkefinger.net\",\r\n \"stipte.nl\",\r\n \"stockracer.com\",\r\n \"stockstorm.com\",\r\n \"stoned.com\",\r\n \"stones.com\",\r\n \"stop-my-spam.pp.ua\",\r\n \"stopdropandroll.com\",\r\n \"storksite.com\",\r\n \"streber24.de\",\r\n \"streetwisemail.com\",\r\n \"stribmail.com\",\r\n \"strompost.com\",\r\n \"strongguy.com\",\r\n \"student.su\",\r\n \"studentcenter.org\",\r\n \"stuffmail.de\",\r\n \"subnetwork.com\",\r\n \"subram.com\",\r\n \"sudanmail.net\",\r\n \"sudolife.me\",\r\n \"sudolife.net\",\r\n \"sudomail.biz\",\r\n \"sudomail.com\",\r\n \"sudomail.net\",\r\n \"sudoverse.com\",\r\n \"sudoverse.net\",\r\n \"sudoweb.net\",\r\n \"sudoworld.com\",\r\n \"sudoworld.net\",\r\n \"sueddeutsche.de\",\r\n \"suhabi.com\",\r\n \"suisse.org\",\r\n \"sukhumvit.net\",\r\n \"sul.com.br\",\r\n \"sunmail1.com\",\r\n \"sunpoint.net\",\r\n \"sunrise-sunset.com\",\r\n \"sunsgame.com\",\r\n \"sunumail.sn\",\r\n \"suomi24.fi\",\r\n \"super-auswahl.de\",\r\n \"superdada.com\",\r\n \"supereva.it\",\r\n \"supergreatmail.com\",\r\n \"supermail.ru\",\r\n \"supermailer.jp\",\r\n \"superman.ru\",\r\n \"superposta.com\",\r\n \"superrito.com\",\r\n \"superstachel.de\",\r\n \"surat.com\",\r\n \"suremail.info\",\r\n \"surf3.net\",\r\n \"surfree.com\",\r\n \"surfsupnet.net\",\r\n \"surfy.net\",\r\n \"surgical.net\",\r\n \"surimail.com\",\r\n \"survivormail.com\",\r\n \"susi.ml\",\r\n \"sviblovo.net\",\r\n \"svk.jp\",\r\n \"swbell.net\",\r\n \"sweb.cz\",\r\n \"swedenmail.com\",\r\n \"sweetville.net\",\r\n \"sweetxxx.de\",\r\n \"swift-mail.com\",\r\n \"swiftdesk.com\",\r\n \"swingeasyhithard.com\",\r\n \"swingfan.com\",\r\n \"swipermail.zzn.com\",\r\n \"swirve.com\",\r\n \"swissinfo.org\",\r\n \"swissmail.com\",\r\n \"swissmail.net\",\r\n \"switchboardmail.com\",\r\n \"switzerland.org\",\r\n \"sx172.com\",\r\n \"sympatico.ca\",\r\n \"syom.com\",\r\n \"syriamail.com\",\r\n \"t-online.de\",\r\n \"t.psh.me\",\r\n \"t2mail.com\",\r\n \"tafmail.com\",\r\n \"takoe.com\",\r\n \"takoe.net\",\r\n \"takuyakimura.com\",\r\n \"talk21.com\",\r\n \"talkcity.com\",\r\n \"talkinator.com\",\r\n \"talktalk.co.uk\",\r\n \"tamb.ru\",\r\n \"tamil.com\",\r\n \"tampabay.rr.com\",\r\n \"tangmonkey.com\",\r\n \"tankpolice.com\",\r\n \"taotaotano.com\",\r\n \"tatanova.com\",\r\n \"tattooedallover.com\",\r\n \"tattoofanatic.com\",\r\n \"tbwt.com\",\r\n \"tcc.on.ca\",\r\n \"tds.net\",\r\n \"teacher.com\",\r\n \"teachermail.net\",\r\n \"teachers.org\",\r\n \"teamdiscovery.com\",\r\n \"teamtulsa.net\",\r\n \"tech-center.com\",\r\n \"tech4peace.org\",\r\n \"techemail.com\",\r\n \"techie.com\",\r\n \"technisamail.co.za\",\r\n \"technologist.com\",\r\n \"technologyandstocks.com\",\r\n \"techpointer.com\",\r\n \"techscout.com\",\r\n \"techseek.com\",\r\n \"techsniper.com\",\r\n \"techspot.com\",\r\n \"teenagedirtbag.com\",\r\n \"teewars.org\",\r\n \"tele2.nl\",\r\n \"telebot.com\",\r\n \"telebot.net\",\r\n \"telefonica.net\",\r\n \"teleline.es\",\r\n \"telenet.be\",\r\n \"telepac.pt\",\r\n \"telerymd.com\",\r\n \"teleserve.dynip.com\",\r\n \"teletu.it\",\r\n \"teleworm.com\",\r\n \"teleworm.us\",\r\n \"telfort.nl\",\r\n \"telfortglasvezel.nl\",\r\n \"telinco.net\",\r\n \"telkom.net\",\r\n \"telpage.net\",\r\n \"telstra.com\",\r\n \"telstra.com.au\",\r\n \"temp-mail.com\",\r\n \"temp-mail.de\",\r\n \"temp-mail.org\",\r\n \"temp-mail.ru\",\r\n \"temp.headstrong.de\",\r\n \"tempail.com\",\r\n \"tempe-mail.com\",\r\n \"tempemail.biz\",\r\n \"tempemail.co.za\",\r\n \"tempemail.com\",\r\n \"tempemail.net\",\r\n \"tempinbox.co.uk\",\r\n \"tempinbox.com\",\r\n \"tempmail.eu\",\r\n \"tempmail.it\",\r\n \"tempmail.us\",\r\n \"tempmail2.com\",\r\n \"tempmaildemo.com\",\r\n \"tempmailer.com\",\r\n \"tempmailer.de\",\r\n \"tempomail.fr\",\r\n \"temporarioemail.com.br\",\r\n \"temporaryemail.net\",\r\n \"temporaryemail.us\",\r\n \"temporaryforwarding.com\",\r\n \"temporaryinbox.com\",\r\n \"temporarymailaddress.com\",\r\n \"tempthe.net\",\r\n \"tempymail.com\",\r\n \"temtulsa.net\",\r\n \"tenchiclub.com\",\r\n \"tenderkiss.com\",\r\n \"tennismail.com\",\r\n \"terminverpennt.de\",\r\n \"terra.cl\",\r\n \"terra.com\",\r\n \"terra.com.ar\",\r\n \"terra.com.br\",\r\n \"terra.com.pe\",\r\n \"terra.es\",\r\n \"test.com\",\r\n \"test.de\",\r\n \"tfanus.com.er\",\r\n \"tfbnw.net\",\r\n \"tfz.net\",\r\n \"tgasa.ru\",\r\n \"tgma.ru\",\r\n \"tgngu.ru\",\r\n \"tgu.ru\",\r\n \"thai.com\",\r\n \"thaimail.com\",\r\n \"thaimail.net\",\r\n \"thanksnospam.info\",\r\n \"thankyou2010.com\",\r\n \"thc.st\",\r\n \"the-african.com\",\r\n \"the-airforce.com\",\r\n \"the-aliens.com\",\r\n \"the-american.com\",\r\n \"the-animal.com\",\r\n \"the-army.com\",\r\n \"the-astronaut.com\",\r\n \"the-beauty.com\",\r\n \"the-big-apple.com\",\r\n \"the-biker.com\",\r\n \"the-boss.com\",\r\n \"the-brazilian.com\",\r\n \"the-canadian.com\",\r\n \"the-canuck.com\",\r\n \"the-captain.com\",\r\n \"the-chinese.com\",\r\n \"the-country.com\",\r\n \"the-cowboy.com\",\r\n \"the-davis-home.com\",\r\n \"the-dutchman.com\",\r\n \"the-eagles.com\",\r\n \"the-englishman.com\",\r\n \"the-fastest.net\",\r\n \"the-fool.com\",\r\n \"the-frenchman.com\",\r\n \"the-galaxy.net\",\r\n \"the-genius.com\",\r\n \"the-gentleman.com\",\r\n \"the-german.com\",\r\n \"the-gremlin.com\",\r\n \"the-hooligan.com\",\r\n \"the-italian.com\",\r\n \"the-japanese.com\",\r\n \"the-lair.com\",\r\n \"the-madman.com\",\r\n \"the-mailinglist.com\",\r\n \"the-marine.com\",\r\n \"the-master.com\",\r\n \"the-mexican.com\",\r\n \"the-ministry.com\",\r\n \"the-monkey.com\",\r\n \"the-newsletter.net\",\r\n \"the-pentagon.com\",\r\n \"the-police.com\",\r\n \"the-prayer.com\",\r\n \"the-professional.com\",\r\n \"the-quickest.com\",\r\n \"the-russian.com\",\r\n \"the-seasiders.com\",\r\n \"the-snake.com\",\r\n \"the-spaceman.com\",\r\n \"the-stock-market.com\",\r\n \"the-student.net\",\r\n \"the-whitehouse.net\",\r\n \"the-wild-west.com\",\r\n \"the18th.com\",\r\n \"thecoolguy.com\",\r\n \"thecriminals.com\",\r\n \"thedoghousemail.com\",\r\n \"thedorm.com\",\r\n \"theend.hu\",\r\n \"theglobe.com\",\r\n \"thegolfcourse.com\",\r\n \"thegooner.com\",\r\n \"theheadoffice.com\",\r\n \"theinternetemail.com\",\r\n \"thelanddownunder.com\",\r\n \"thelimestones.com\",\r\n \"themail.com\",\r\n \"themillionare.net\",\r\n \"theoffice.net\",\r\n \"theplate.com\",\r\n \"thepokerface.com\",\r\n \"thepostmaster.net\",\r\n \"theraces.com\",\r\n \"theracetrack.com\",\r\n \"therapist.net\",\r\n \"thereisnogod.com\",\r\n \"thesimpsonsfans.com\",\r\n \"thestreetfighter.com\",\r\n \"theteebox.com\",\r\n \"thewatercooler.com\",\r\n \"thewebpros.co.uk\",\r\n \"thewizzard.com\",\r\n \"thewizzkid.com\",\r\n \"thexyz.ca\",\r\n \"thexyz.cn\",\r\n \"thexyz.com\",\r\n \"thexyz.es\",\r\n \"thexyz.fr\",\r\n \"thexyz.in\",\r\n \"thexyz.mobi\",\r\n \"thexyz.net\",\r\n \"thexyz.org\",\r\n \"theyourpc.com\",\r\n \"thezhangs.net\",\r\n \"thirdage.com\",\r\n \"thisgirl.com\",\r\n \"thisisnotmyrealemail.com\",\r\n \"thismail.net\",\r\n \"thoic.com\",\r\n \"thraml.com\",\r\n \"thrott.com\",\r\n \"throwam.com\",\r\n \"throwawayemailaddress.com\",\r\n \"thundermail.com\",\r\n \"tibetemail.com\",\r\n \"tidni.com\",\r\n \"tilien.com\",\r\n \"timein.net\",\r\n \"timormail.com\",\r\n \"tin.it\",\r\n \"tipsandadvice.com\",\r\n \"tiran.ru\",\r\n \"tiscali.at\",\r\n \"tiscali.be\",\r\n \"tiscali.co.uk\",\r\n \"tiscali.it\",\r\n \"tiscali.lu\",\r\n \"tiscali.se\",\r\n \"tittbit.in\",\r\n \"tizi.com\",\r\n \"tkcity.com\",\r\n \"tlcfan.com\",\r\n \"tmail.ws\",\r\n \"tmailinator.com\",\r\n \"tmicha.net\",\r\n \"toast.com\",\r\n \"toke.com\",\r\n \"tokyo.com\",\r\n \"tom.com\",\r\n \"toolsource.com\",\r\n \"toomail.biz\",\r\n \"toothfairy.com\",\r\n \"topchat.com\",\r\n \"topgamers.co.uk\",\r\n \"topletter.com\",\r\n \"topmail-files.de\",\r\n \"topmail.com.ar\",\r\n \"topranklist.de\",\r\n \"topsurf.com\",\r\n \"topteam.bg\",\r\n \"toquedequeda.com\",\r\n \"torba.com\",\r\n \"torchmail.com\",\r\n \"torontomail.com\",\r\n \"tortenboxer.de\",\r\n \"totalmail.com\",\r\n \"totalmail.de\",\r\n \"totalmusic.net\",\r\n \"totalsurf.com\",\r\n \"toughguy.net\",\r\n \"townisp.com\",\r\n \"tpg.com.au\",\r\n \"tradermail.info\",\r\n \"trainspottingfan.com\",\r\n \"trash-amil.com\",\r\n \"trash-mail.at\",\r\n \"trash-mail.com\",\r\n \"trash-mail.de\",\r\n \"trash-mail.ga\",\r\n \"trash-mail.ml\",\r\n \"trash2009.com\",\r\n \"trash2010.com\",\r\n \"trash2011.com\",\r\n \"trashdevil.com\",\r\n \"trashdevil.de\",\r\n \"trashemail.de\",\r\n \"trashmail.at\",\r\n \"trashmail.com\",\r\n \"trashmail.de\",\r\n \"trashmail.me\",\r\n \"trashmail.net\",\r\n \"trashmail.org\",\r\n \"trashmailer.com\",\r\n \"trashymail.com\",\r\n \"trashymail.net\",\r\n \"travel.li\",\r\n \"trayna.com\",\r\n \"trbvm.com\",\r\n \"trbvn.com\",\r\n \"trevas.net\",\r\n \"trialbytrivia.com\",\r\n \"trialmail.de\",\r\n \"trickmail.net\",\r\n \"trillianpro.com\",\r\n \"trimix.cn\",\r\n \"tritium.net\",\r\n \"trjam.net\",\r\n \"trmailbox.com\",\r\n \"tropicalstorm.com\",\r\n \"truckeremail.net\",\r\n \"truckers.com\",\r\n \"truckerz.com\",\r\n \"truckracer.com\",\r\n \"truckracers.com\",\r\n \"trust-me.com\",\r\n \"truth247.com\",\r\n \"truthmail.com\",\r\n \"tsamail.co.za\",\r\n \"ttml.co.in\",\r\n \"tulipsmail.net\",\r\n \"tunisiamail.com\",\r\n \"turboprinz.de\",\r\n \"turboprinzessin.de\",\r\n \"turkey.com\",\r\n \"turual.com\",\r\n \"tushino.net\",\r\n \"tut.by\",\r\n \"tutanota.com\",\r\n \"tvcablenet.be\",\r\n \"tverskie.net\",\r\n \"tverskoe.net\",\r\n \"tvnet.lv\",\r\n \"tvstar.com\",\r\n \"twc.com\",\r\n \"twcny.com\",\r\n \"twentylove.com\",\r\n \"twinmail.de\",\r\n \"twinstarsmail.com\",\r\n \"tx.rr.com\",\r\n \"tycoonmail.com\",\r\n \"tyldd.com\",\r\n \"typemail.com\",\r\n \"tyt.by\",\r\n \"u14269.ml\",\r\n \"u2club.com\",\r\n \"ua.fm\",\r\n \"uae.ac\",\r\n \"uaemail.com\",\r\n \"ubbi.com\",\r\n \"ubbi.com.br\",\r\n \"uboot.com\",\r\n \"uggsrock.com\",\r\n \"uk2.net\",\r\n \"uk2k.com\",\r\n \"uk2net.com\",\r\n \"uk7.net\",\r\n \"uk8.net\",\r\n \"ukbuilder.com\",\r\n \"ukcool.com\",\r\n \"ukdreamcast.com\",\r\n \"ukmail.org\",\r\n \"ukmax.com\",\r\n \"ukr.net\",\r\n \"ukrpost.net\",\r\n \"ukrtop.com\",\r\n \"uku.co.uk\",\r\n \"ultapulta.com\",\r\n \"ultimatelimos.com\",\r\n \"ultrapostman.com\",\r\n \"umail.net\",\r\n \"ummah.org\",\r\n \"umpire.com\",\r\n \"unbounded.com\",\r\n \"underwriters.com\",\r\n \"unforgettable.com\",\r\n \"uni.de\",\r\n \"uni.de.de\",\r\n \"uni.demailto.de\",\r\n \"unican.es\",\r\n \"unihome.com\",\r\n \"universal.pt\",\r\n \"uno.ee\",\r\n \"uno.it\",\r\n \"unofree.it\",\r\n \"unomail.com\",\r\n \"unterderbruecke.de\",\r\n \"uogtritons.com\",\r\n \"uol.com.ar\",\r\n \"uol.com.br\",\r\n \"uol.com.co\",\r\n \"uol.com.mx\",\r\n \"uol.com.ve\",\r\n \"uole.com\",\r\n \"uole.com.ve\",\r\n \"uolmail.com\",\r\n \"uomail.com\",\r\n \"upc.nl\",\r\n \"upcmail.nl\",\r\n \"upf.org\",\r\n \"upliftnow.com\",\r\n \"uplipht.com\",\r\n \"uraniomail.com\",\r\n \"ureach.com\",\r\n \"urgentmail.biz\",\r\n \"uroid.com\",\r\n \"us.af\",\r\n \"usa.com\",\r\n \"usa.net\",\r\n \"usaaccess.net\",\r\n \"usako.net\",\r\n \"usanetmail.com\",\r\n \"used-product.fr\",\r\n \"userbeam.com\",\r\n \"usermail.com\",\r\n \"username.e4ward.com\",\r\n \"userzap.com\",\r\n \"usma.net\",\r\n \"usmc.net\",\r\n \"uswestmail.net\",\r\n \"uymail.com\",\r\n \"uyuyuy.com\",\r\n \"uzhe.net\",\r\n \"v-sexi.com\",\r\n \"v8email.com\",\r\n \"vaasfc4.tk\",\r\n \"vahoo.com\",\r\n \"valemail.net\",\r\n \"valudeal.net\",\r\n \"vampirehunter.com\",\r\n \"varbizmail.com\",\r\n \"vcmail.com\",\r\n \"velnet.co.uk\",\r\n \"velnet.com\",\r\n \"velocall.com\",\r\n \"veloxmail.com.br\",\r\n \"venompen.com\",\r\n \"verizon.net\",\r\n \"verizonmail.com\",\r\n \"verlass-mich-nicht.de\",\r\n \"versatel.nl\",\r\n \"verticalheaven.com\",\r\n \"veryfast.biz\",\r\n \"veryrealemail.com\",\r\n \"veryspeedy.net\",\r\n \"vfemail.net\",\r\n \"vickaentb.tk\",\r\n \"videotron.ca\",\r\n \"viditag.com\",\r\n \"viewcastmedia.com\",\r\n \"viewcastmedia.net\",\r\n \"vinbazar.com\",\r\n \"violinmakers.co.uk\",\r\n \"vip.126.com\",\r\n \"vip.21cn.com\",\r\n \"vip.citiz.net\",\r\n \"vip.gr\",\r\n \"vip.onet.pl\",\r\n \"vip.qq.com\",\r\n \"vip.sina.com\",\r\n \"vipmail.ru\",\r\n \"viralplays.com\",\r\n \"virgilio.it\",\r\n \"virgin.net\",\r\n \"virginbroadband.com.au\",\r\n \"virginmedia.com\",\r\n \"virtual-mail.com\",\r\n \"virtualactive.com\",\r\n \"virtualguam.com\",\r\n \"virtualmail.com\",\r\n \"visitmail.com\",\r\n \"visitweb.com\",\r\n \"visto.com\",\r\n \"visualcities.com\",\r\n \"vivavelocity.com\",\r\n \"vivianhsu.net\",\r\n \"viwanet.ru\",\r\n \"vjmail.com\",\r\n \"vjtimail.com\",\r\n \"vkcode.ru\",\r\n \"vlcity.ru\",\r\n \"vlmail.com\",\r\n \"vnet.citiz.net\",\r\n \"vnn.vn\",\r\n \"vnukovo.net\",\r\n \"vodafone.nl\",\r\n \"vodafonethuis.nl\",\r\n \"voila.fr\",\r\n \"volcanomail.com\",\r\n \"vollbio.de\",\r\n \"volloeko.de\",\r\n \"vomoto.com\",\r\n \"voo.be\",\r\n \"vorsicht-bissig.de\",\r\n \"vorsicht-scharf.de\",\r\n \"vote-democrats.com\",\r\n \"vote-hillary.com\",\r\n \"vote-republicans.com\",\r\n \"vote4gop.org\",\r\n \"votenet.com\",\r\n \"vovan.ru\",\r\n \"vp.pl\",\r\n \"vpn.st\",\r\n \"vr9.com\",\r\n \"vsimcard.com\",\r\n \"vubby.com\",\r\n \"vyhino.net\",\r\n \"w3.to\",\r\n \"wahoye.com\",\r\n \"walala.org\",\r\n \"wales2000.net\",\r\n \"walkmail.net\",\r\n \"walkmail.ru\",\r\n \"walla.co.il\",\r\n \"wam.co.za\",\r\n \"wanaboo.com\",\r\n \"wanadoo.co.uk\",\r\n \"wanadoo.es\",\r\n \"wanadoo.fr\",\r\n \"wapda.com\",\r\n \"war-im-urlaub.de\",\r\n \"warmmail.com\",\r\n \"warpmail.net\",\r\n \"warrior.hu\",\r\n \"wasteland.rfc822.org\",\r\n \"watchmail.com\",\r\n \"waumail.com\",\r\n \"wazabi.club\",\r\n \"wbdet.com\",\r\n \"wearab.net\",\r\n \"web-contact.info\",\r\n \"web-emailbox.eu\",\r\n \"web-ideal.fr\",\r\n \"web-mail.com.ar\",\r\n \"web-mail.pp.ua\",\r\n \"web-police.com\",\r\n \"web.de\",\r\n \"webaddressbook.com\",\r\n \"webadicta.org\",\r\n \"webave.com\",\r\n \"webbworks.com\",\r\n \"webcammail.com\",\r\n \"webcity.ca\",\r\n \"webcontact-france.eu\",\r\n \"webdream.com\",\r\n \"webemail.me\",\r\n \"webemaillist.com\",\r\n \"webinbox.com\",\r\n \"webindia123.com\",\r\n \"webjump.com\",\r\n \"webm4il.info\",\r\n \"webmail.bellsouth.net\",\r\n \"webmail.blue\",\r\n \"webmail.co.yu\",\r\n \"webmail.co.za\",\r\n \"webmail.fish\",\r\n \"webmail.hu\",\r\n \"webmail.lawyer\",\r\n \"webmail.ru\",\r\n \"webmail.wiki\",\r\n \"webmails.com\",\r\n \"webmailv.com\",\r\n \"webname.com\",\r\n \"webprogramming.com\",\r\n \"webskulker.com\",\r\n \"webstation.com\",\r\n \"websurfer.co.za\",\r\n \"webtopmail.com\",\r\n \"webtribe.net\",\r\n \"webuser.in\",\r\n \"wee.my\",\r\n \"weedmail.com\",\r\n \"weekmail.com\",\r\n \"weekonline.com\",\r\n \"wefjo.grn.cc\",\r\n \"weg-werf-email.de\",\r\n \"wegas.ru\",\r\n \"wegwerf-emails.de\",\r\n \"wegwerfadresse.de\",\r\n \"wegwerfemail.com\",\r\n \"wegwerfemail.de\",\r\n \"wegwerfmail.de\",\r\n \"wegwerfmail.info\",\r\n \"wegwerfmail.net\",\r\n \"wegwerfmail.org\",\r\n \"wegwerpmailadres.nl\",\r\n \"wehshee.com\",\r\n \"weibsvolk.de\",\r\n \"weibsvolk.org\",\r\n \"weinenvorglueck.de\",\r\n \"welsh-lady.com\",\r\n \"wesleymail.com\",\r\n \"westnet.com\",\r\n \"westnet.com.au\",\r\n \"wetrainbayarea.com\",\r\n \"wfgdfhj.tk\",\r\n \"wh4f.org\",\r\n \"whale-mail.com\",\r\n \"whartontx.com\",\r\n \"whatiaas.com\",\r\n \"whatpaas.com\",\r\n \"wheelweb.com\",\r\n \"whipmail.com\",\r\n \"whoever.com\",\r\n \"wholefitness.com\",\r\n \"whoopymail.com\",\r\n \"whtjddn.33mail.com\",\r\n \"whyspam.me\",\r\n \"wickedmail.com\",\r\n \"wickmail.net\",\r\n \"wideopenwest.com\",\r\n \"wildmail.com\",\r\n \"wilemail.com\",\r\n \"will-hier-weg.de\",\r\n \"willhackforfood.biz\",\r\n \"willselfdestruct.com\",\r\n \"windowslive.com\",\r\n \"windrivers.net\",\r\n \"windstream.com\",\r\n \"windstream.net\",\r\n \"winemaven.info\",\r\n \"wingnutz.com\",\r\n \"winmail.com.au\",\r\n \"winning.com\",\r\n \"winrz.com\",\r\n \"wir-haben-nachwuchs.de\",\r\n \"wir-sind-cool.org\",\r\n \"wirsindcool.de\",\r\n \"witty.com\",\r\n \"wiz.cc\",\r\n \"wkbwmail.com\",\r\n \"wmail.cf\",\r\n \"wo.com.cn\",\r\n \"woh.rr.com\",\r\n \"wolf-web.com\",\r\n \"wolke7.net\",\r\n \"wollan.info\",\r\n \"wombles.com\",\r\n \"women-at-work.org\",\r\n \"women-only.net\",\r\n \"wonder-net.com\",\r\n \"wongfaye.com\",\r\n \"wooow.it\",\r\n \"work4teens.com\",\r\n \"worker.com\",\r\n \"workmail.co.za\",\r\n \"workmail.com\",\r\n \"worldbreak.com\",\r\n \"worldemail.com\",\r\n \"worldmailer.com\",\r\n \"worldnet.att.net\",\r\n \"wormseo.cn\",\r\n \"wosaddict.com\",\r\n \"wouldilie.com\",\r\n \"wovz.cu.cc\",\r\n \"wow.com\",\r\n \"wowgirl.com\",\r\n \"wowmail.com\",\r\n \"wowway.com\",\r\n \"wp.pl\",\r\n \"wptamail.com\",\r\n \"wrestlingpages.com\",\r\n \"wrexham.net\",\r\n \"writeme.com\",\r\n \"writemeback.com\",\r\n \"writeremail.com\",\r\n \"wronghead.com\",\r\n \"wrongmail.com\",\r\n \"wtvhmail.com\",\r\n \"wwdg.com\",\r\n \"www.com\",\r\n \"www.e4ward.com\",\r\n \"www.mailinator.com\",\r\n \"www2000.net\",\r\n \"wwwnew.eu\",\r\n \"wx88.net\",\r\n \"wxs.net\",\r\n \"wyrm.supernews.com\",\r\n \"x-mail.net\",\r\n \"x-networks.net\",\r\n \"x.ip6.li\",\r\n \"x5g.com\",\r\n \"xagloo.com\",\r\n \"xaker.ru\",\r\n \"xd.ae\",\r\n \"xemaps.com\",\r\n \"xents.com\",\r\n \"xing886.uu.gl\",\r\n \"xmail.com\",\r\n \"xmaily.com\",\r\n \"xmastime.com\",\r\n \"xmenfans.com\",\r\n \"xms.nl\",\r\n \"xmsg.com\",\r\n \"xoom.com\",\r\n \"xoommail.com\",\r\n \"xoxox.cc\",\r\n \"xoxy.net\",\r\n \"xpectmore.com\",\r\n \"xpressmail.zzn.com\",\r\n \"xs4all.nl\",\r\n \"xsecurity.org\",\r\n \"xsmail.com\",\r\n \"xtra.co.nz\",\r\n \"xtram.com\",\r\n \"xuno.com\",\r\n \"xww.ro\",\r\n \"xy9ce.tk\",\r\n \"xyz.am\",\r\n \"xyzfree.net\",\r\n \"xzapmail.com\",\r\n \"y7mail.com\",\r\n \"ya.ru\",\r\n \"yada-yada.com\",\r\n \"yaho.com\",\r\n \"yahoo.ae\",\r\n \"yahoo.at\",\r\n \"yahoo.be\",\r\n \"yahoo.ca\",\r\n \"yahoo.ch\",\r\n \"yahoo.cn\",\r\n \"yahoo.co\",\r\n \"yahoo.co.id\",\r\n \"yahoo.co.il\",\r\n \"yahoo.co.in\",\r\n \"yahoo.co.jp\",\r\n \"yahoo.co.kr\",\r\n \"yahoo.co.nz\",\r\n \"yahoo.co.th\",\r\n \"yahoo.co.uk\",\r\n \"yahoo.co.za\",\r\n \"yahoo.com\",\r\n \"yahoo.com.ar\",\r\n \"yahoo.com.au\",\r\n \"yahoo.com.br\",\r\n \"yahoo.com.cn\",\r\n \"yahoo.com.co\",\r\n \"yahoo.com.hk\",\r\n \"yahoo.com.is\",\r\n \"yahoo.com.mx\",\r\n \"yahoo.com.my\",\r\n \"yahoo.com.ph\",\r\n \"yahoo.com.ru\",\r\n \"yahoo.com.sg\",\r\n \"yahoo.com.tr\",\r\n \"yahoo.com.tw\",\r\n \"yahoo.com.vn\",\r\n \"yahoo.cz\",\r\n \"yahoo.de\",\r\n \"yahoo.dk\",\r\n \"yahoo.es\",\r\n \"yahoo.fi\",\r\n \"yahoo.fr\",\r\n \"yahoo.gr\",\r\n \"yahoo.hu\",\r\n \"yahoo.ie\",\r\n \"yahoo.in\",\r\n \"yahoo.it\",\r\n \"yahoo.jp\",\r\n \"yahoo.net\",\r\n \"yahoo.nl\",\r\n \"yahoo.no\",\r\n \"yahoo.pl\",\r\n \"yahoo.pt\",\r\n \"yahoo.ro\",\r\n \"yahoo.ru\",\r\n \"yahoo.se\",\r\n \"yahoofs.com\",\r\n \"yahoomail.com\",\r\n \"yalla.com\",\r\n \"yalla.com.lb\",\r\n \"yalook.com\",\r\n \"yam.com\",\r\n \"yandex.com\",\r\n \"yandex.mail\",\r\n \"yandex.pl\",\r\n \"yandex.ru\",\r\n \"yandex.ua\",\r\n \"yapost.com\",\r\n \"yapped.net\",\r\n \"yawmail.com\",\r\n \"yclub.com\",\r\n \"yeah.net\",\r\n \"yebox.com\",\r\n \"yeehaa.com\",\r\n \"yehaa.com\",\r\n \"yehey.com\",\r\n \"yemenmail.com\",\r\n \"yep.it\",\r\n \"yepmail.net\",\r\n \"yert.ye.vc\",\r\n \"yesbox.net\",\r\n \"yesey.net\",\r\n \"yeswebmaster.com\",\r\n \"ygm.com\",\r\n \"yifan.net\",\r\n \"ymail.com\",\r\n \"ynnmail.com\",\r\n \"yogamaven.com\",\r\n \"yogotemail.com\",\r\n \"yomail.info\",\r\n \"yopmail.com\",\r\n \"yopmail.fr\",\r\n \"yopmail.net\",\r\n \"yopmail.org\",\r\n \"yopmail.pp.ua\",\r\n \"yopolis.com\",\r\n \"yopweb.com\",\r\n \"youareadork.com\",\r\n \"youmailr.com\",\r\n \"youpy.com\",\r\n \"your-house.com\",\r\n \"your-mail.com\",\r\n \"yourdomain.com\",\r\n \"yourinbox.com\",\r\n \"yourlifesucks.cu.cc\",\r\n \"yourlover.net\",\r\n \"yourname.ddns.org\",\r\n \"yourname.freeservers.com\",\r\n \"yournightmare.com\",\r\n \"yours.com\",\r\n \"yourssincerely.com\",\r\n \"yoursubdomain.findhere.com\",\r\n \"yoursubdomain.zzn.com\",\r\n \"yourteacher.net\",\r\n \"yourwap.com\",\r\n \"youthfire.com\",\r\n \"youthpost.com\",\r\n \"youvegotmail.net\",\r\n \"yuuhuu.net\",\r\n \"yuurok.com\",\r\n \"yyhmail.com\",\r\n \"z1p.biz\",\r\n \"z6.com\",\r\n \"z9mail.com\",\r\n \"za.com\",\r\n \"zahadum.com\",\r\n \"zaktouni.fr\",\r\n \"zcities.com\",\r\n \"zdnetmail.com\",\r\n \"zdorovja.net\",\r\n \"zeeks.com\",\r\n \"zeepost.nl\",\r\n \"zehnminuten.de\",\r\n \"zehnminutenmail.de\",\r\n \"zensearch.com\",\r\n \"zensearch.net\",\r\n \"zerocrime.org\",\r\n \"zetmail.com\",\r\n \"zhaowei.net\",\r\n \"zhouemail.510520.org\",\r\n \"ziggo.nl\",\r\n \"zing.vn\",\r\n \"zionweb.org\",\r\n \"zip.net\",\r\n \"zipido.com\",\r\n \"ziplip.com\",\r\n \"zipmail.com\",\r\n \"zipmail.com.br\",\r\n \"zipmax.com\",\r\n \"zippymail.info\",\r\n \"zmail.pt\",\r\n \"zmail.ru\",\r\n \"zoemail.com\",\r\n \"zoemail.net\",\r\n \"zoemail.org\",\r\n \"zoho.com\",\r\n \"zohomail.com\",\r\n \"zomg.info\",\r\n \"zonai.com\",\r\n \"zoneview.net\",\r\n \"zonnet.nl\",\r\n \"zooglemail.com\",\r\n \"zoominternet.net\",\r\n \"zubee.com\",\r\n \"zuvio.com\",\r\n \"zuzzurello.com\",\r\n \"zvmail.com\",\r\n \"zwallet.com\",\r\n \"zweb.in\",\r\n \"zxcv.com\",\r\n \"zxcvbnm.com\",\r\n \"zybermail.com\",\r\n \"zydecofan.com\",\r\n \"zzn.com\",\r\n \"zzom.co.uk\",\r\n \"zzz.com\"\r\n];\r\nexport default genericEmailDomainsBlocklist;", "const disposableEmailDomains: Array = [\r\n \"123.com\",\r\n \"aol.comom\",\r\n \"b.com\",\r\n \"byom.de\",\r\n \"chfinancialservices.xyz\",\r\n \"comast.com\",\r\n \"digdig.org\",\r\n \"exdonuts.com\",\r\n \"f5.si\",\r\n \"fuck.com\",\r\n \"gamil.com\",\r\n \"gay.com\",\r\n \"gmail.com69\",\r\n \"gmail.com786\",\r\n \"gmail.comcom\",\r\n \"gmail.come\",\r\n \"gmail.comiokaygoodthanku.keepitthere.com\",\r\n \"gmail.coml\",\r\n \"gmail.comm\",\r\n \"gmail.comsh\",\r\n \"gmail.comtheatre\",\r\n \"gmial.com\",\r\n \"goatmail.uk\",\r\n \"heisei.be\",\r\n \"honeys.be\",\r\n \"hotmail.coms\",\r\n \"hotmail.con\",\r\n \"hotsoup.be\",\r\n \"ianapromotions.xyz\",\r\n \"instaddr.ch\",\r\n \"instaddr.win\",\r\n \"jourrapide.com\",\r\n \"kpay.be\",\r\n \"kpost.be\",\r\n \"lwcss.org\",\r\n \"macr2.com\",\r\n \"magim.be\",\r\n \"magim.com\",\r\n \"mail.be\",\r\n \"mail.beximtex.com\",\r\n \"mail.bg\",\r\n \"mail.com\",\r\n \"mail.com.ph\",\r\n \"mail.ru\",\r\n \"mail2greg.com\",\r\n \"mailcatch.com\",\r\n \"mailcity.com\",\r\n \"maildrop.cc\",\r\n \"mailinato.com\",\r\n \"mailinator.com\",\r\n \"me.comm\",\r\n \"merry.pink\",\r\n \"mhailinator.com\",\r\n \"mirai.re\",\r\n \"monemail.com\",\r\n \"mscdirect.com\",\r\n \"mt2015.com\",\r\n \"necrotribe.biz\",\r\n \"null.net\",\r\n \"nycmail.com\",\r\n \"opayq.com\",\r\n \"partyheld.de\",\r\n \"peterpan.com\",\r\n \"pokemail.net\",\r\n \"poopaloop.com\",\r\n \"pp.inet.fi\",\r\n \"quicksend.ch\",\r\n \"rhyta.com\",\r\n \"sakajdkjad.com\",\r\n \"sendnow.win\",\r\n \"sharklasers.com\",\r\n \"shaw.cakohlweg\",\r\n \"sika3.com\",\r\n \"snakebite.com\",\r\n \"spamgourmet.com\",\r\n \"sudomail.com\",\r\n \"teachers.org\",\r\n \"teleworm.com\",\r\n \"teleworm.us\",\r\n \"test.de\",\r\n \"thedoghousemail.com\",\r\n \"throwam.com\",\r\n \"tradesco.cf\",\r\n \"trbvm.com\",\r\n \"tyldd.com\",\r\n \"uma3.be\",\r\n \"us.af.mil\",\r\n \"usako.net\",\r\n \"vomoto.com\",\r\n \"y7mail.com\",\r\n \"ya.ru\",\r\n \"yaho.com\",\r\n \"yaho.como.cpm\",\r\n \"yahoo.com.com\",\r\n \"yahoo.con\",\r\n \"yahoo.fryyy\",\r\n \"yahoomail.com\",\r\n \"yohoo.com\",\r\n \"yopmail.com\",\r\n \"yopmail.fr\",\r\n \"yopmail.net\",\r\n \"zipmail.com.br\",\r\n \"zippymail.info\"\r\n];\r\nexport default disposableEmailDomains;", "import { isNil, isString } from \"@mcwd/typescript-type-guards\";\r\nimport genericEmailDomainsBlocklist from \"../form-logic/genericEmailDomainBlockList.js\";\r\nimport disposableEmailDomains from \"../form-logic/disposableEmailDomains.js\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionValuesRecord,\r\n type InjectionKeysRecord,\r\n} from \"@mcwd/util-vue\";\r\nimport { provide } from \"vue\";\r\n\r\n// Message for each validation type\r\ntype CheckType = \"Disposible Domain\" | \"Generic Domain\" | \"Email Format\" | \"Not String\" | \"Phone Format\" | \"Identical Digits\";\r\n//return obj for each validation function\r\nexport interface ValidationOutput {\r\n isValid: boolean;\r\n ValidationType?: CheckType;\r\n}\r\n//validation function type\r\nexport type ValidatorFn = (value: unknown) => ValidationOutput;\r\n\r\n//type ValidatorFn = (value: unknown) => boolean;\r\ntype UseValidationInjectionValues = InjectionValuesRecord<{\r\n validateEmail: ValidatorFn;\r\n validateDisposableEmailDomains: ValidatorFn;\r\n validateGenericBusinessEmail: ValidatorFn;\r\n validatePhoneNumber: ValidatorFn;\r\n}>;\r\n\r\ntype UseValidationInjectionKeys = InjectionKeysRecord;\r\n\r\nconst UseValidationInjectionKeys = CreateInjectionKeysRecord({\r\n validateEmail: 'validateEmail',\r\n validateDisposableEmailDomains: 'validateDisposableEmailDomains',\r\n validateGenericBusinessEmail: 'validateGenericBusinessEmail',\r\n validatePhoneNumber: 'validatePhoneNumber',\r\n});\r\n\r\nexport function initValidations() {\r\n const { logger } = useFormLogger();\r\n\r\n if (checkValuesAlreadyProvided(UseValidationInjectionKeys)) {\r\n return;\r\n }\r\n // Validate email address\r\n function validateEmail(value: unknown): ValidationOutput {\r\n if (!isString(value)) {\r\n return { isValid: false };\r\n }\r\n const matchValidEmail = value\r\n .toLowerCase()\r\n .match(\r\n /^([\\w\\d._\\-#])+@([\\w\\d._\\-#]+[.][\\w\\d._\\-#]+)+$/\r\n );\r\n const isValid = !isNil(matchValidEmail);\r\n return { isValid, ValidationType: \"Email Format\" };\r\n }\r\n //helper function for email validation\r\n function isInBlockedList(nums: string[], target: string): boolean {\r\n let left = 0;\r\n let right: number = nums.length - 1;\r\n\r\n while (left <= right) {\r\n const mid: number = Math.floor((left + right) / 2);\r\n\r\n if (nums[mid] === target) return true;\r\n if (target < nums[mid]) right = mid - 1;\r\n else left = mid + 1;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function validateDisposableEmailDomains(value: unknown): ValidationOutput {\r\n if (!isString(value)) {\r\n return { isValid: false };\r\n }\r\n\r\n const isEmailFormatValid = validateEmail(value).isValid;\r\n if (!isEmailFormatValid) {\r\n return { isValid: false, ValidationType: \"Email Format\" };\r\n }\r\n\r\n const startOfDomain = value.indexOf(\"@\") + 1;\r\n const domain = value.substring(startOfDomain).toLowerCase();\r\n\r\n const validateDisposableDomain = !isInBlockedList(disposableEmailDomains, domain);\r\n return { isValid: validateDisposableDomain, ValidationType: \"Disposible Domain\" };\r\n }\r\n\r\n function validateGenericBusinessEmail(value: unknown): ValidationOutput {\r\n if (!isString(value)) {\r\n return { isValid: false };\r\n }\r\n const isEmailFormatValid = validateEmail(value).isValid;\r\n if (!isEmailFormatValid) {\r\n return { isValid: false, ValidationType: \"Email Format\" };\r\n }\r\n\r\n var validateDisposableDomain = validateDisposableEmailDomains(value);\r\n if (!validateDisposableDomain.isValid) {\r\n return { isValid: false, ValidationType: \"Disposible Domain\" };\r\n }\r\n const startOfDomain = value.indexOf(\"@\") + 1;\r\n const domain = value.substring(startOfDomain).toLowerCase();\r\n const validateGenericDomain = !isInBlockedList(genericEmailDomainsBlocklist, domain);\r\n return { isValid: validateGenericDomain, ValidationType: \"Generic Domain\" };\r\n }\r\n\r\n function validatePhoneNumber(value: unknown): ValidationOutput {\r\n if (!isString(value)) {\r\n logger.debug(\"Phone Number value is not a string.\");\r\n return { isValid: false };\r\n }\r\n //strips out non digit characters\r\n var OnlyDigits = value.match(/\\d/g)?.join(\"\");\r\n // if phone number is undefined or not long enough its not valid\r\n if (!OnlyDigits || (OnlyDigits && OnlyDigits.length < 8)) {\r\n logger.debug(\"Phone Number does not meet length requirements.\");\r\n return { isValid: false, ValidationType: \"Phone Format\" };\r\n }\r\n //Prevents digits being in ascending/decending order\r\n //Matches zero or one occurrence of each digit \r\n var checkDigitOrder = /^(9?8?7?6?5?4?3?2?1?0?|0?1?2?3?4?5?6?7?8?9?)$/;\r\n if (checkDigitOrder.test(OnlyDigits)) {\r\n logger.debug(\"Phone Number is not valid.\");\r\n return { isValid: false, ValidationType: \"Phone Format\" };\r\n }\r\n if (OnlyDigits && OnlyDigits.split('').every(digit => digit === OnlyDigits![0])) {\r\n logger.debug(\"Phone Number has all identical digits.\");\r\n return { isValid: false, ValidationType: \"Identical Digits\" };\r\n }\r\n logger.debug(\"Phone Number is Valid\");\r\n return { isValid: true };\r\n }\r\n\r\n provide(UseValidationInjectionKeys.validateDisposableEmailDomains, validateDisposableEmailDomains);\r\n provide(UseValidationInjectionKeys.validateEmail, validateEmail);\r\n provide(UseValidationInjectionKeys.validateGenericBusinessEmail, validateGenericBusinessEmail);\r\n provide(UseValidationInjectionKeys.validatePhoneNumber, validatePhoneNumber);\r\n}\r\n\r\nexport const useValidations = ({ callerLabel }: { callerLabel?: string } = {}) => {\r\n const { logger } = useFormLogger();\r\n try {\r\n const validateDisposableEmailDomains = injectRequiredWithSelf(UseValidationInjectionKeys.validateDisposableEmailDomains);\r\n const validateEmail = injectRequiredWithSelf(UseValidationInjectionKeys.validateEmail);\r\n const validateGenericBusinessEmail = injectRequiredWithSelf(UseValidationInjectionKeys.validateGenericBusinessEmail);\r\n const validatePhoneNumber = injectRequiredWithSelf(UseValidationInjectionKeys.validatePhoneNumber);\r\n return { validateDisposableEmailDomains, validateEmail, validateGenericBusinessEmail, validatePhoneNumber };\r\n } catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? \"unknown\"}`);\r\n throw err;\r\n }\r\n};\r\n", "import type _jquery from \"jquery\";\r\nimport { provide } from \"vue\";\r\nimport {\r\n injectRequiredWithSelf,\r\n checkValuesAlreadyProvided,\r\n CreateInjectionKeysRecord,\r\n type InjectionKeysRecord,\r\n type InjectionValuesRecord,\r\n} from \"@mcwd/util-vue\";\r\nimport { useFormLogger } from \"./use-form-logger.js\";\r\nimport { useFormEvents } from \"./use-form-events.js\";\r\nimport { useFormState } from \"./use-form-state.js\";\r\nimport { useGatingLevel } from \"./use-gating-level.js\";\r\ntype UseAbandonmentTriggerInjectionValues = InjectionValuesRecord<{\r\n beforeUnloadListener: () => void,\r\n modalAbandonmentListener: () => void,\r\n}>;\r\n\r\ntype UseAbandonmentTriggerInjectionKeys = InjectionKeysRecord;\r\n\r\nconst UseAbandonmentTriggerInjectionKeys = CreateInjectionKeysRecord({\r\n beforeUnloadListener: \"beforeUnloadListener\",\r\n modalAbandonmentListener: \"modalAbandonmentListener\"\r\n});\r\n/**\r\n * Provide the abandonment listeners, you have to still call the individual functions\r\n */\r\nexport function initAbandonmentListeners() {\r\n\r\n if (checkValuesAlreadyProvided(UseAbandonmentTriggerInjectionKeys)) {\r\n return;\r\n }\r\n const { logger } = useFormLogger({ callerLabel: \"initBeforeUnloadScript\" });\r\n const { FormState } = useFormState({ callerLabel: \"initBeforeUnloadScript\" });\r\n const { formAbandonment, modalClosed, userFirstInteraction } = useFormEvents({ callerLabel: \"initBeforeUnloadScript\" });\r\n const { CurrentFormExperienceGatingState } = useGatingLevel({\r\n callerLabel: \"initFormAbandonmentManager\",\r\n });\r\n /**\r\n * Triggers form abandonment event if form is not submitted and user is leaving the page\r\n */\r\n function initBeforeUnloadScript() {\r\n var userFirstInteractionValue = false;\r\n userFirstInteraction.on(() => {\r\n userFirstInteractionValue = true;\r\n })\r\n const beforeUnloadHandler = () => {\r\n if (FormState.value == \"RegularForm\" && CurrentFormExperienceGatingState.value != \"NoGate\" && userFirstInteractionValue) {\r\n formAbandonment.trigger({ eventName: \"formAbandonment\" });\r\n }\r\n };\r\n window.addEventListener('beforeunload', beforeUnloadHandler);\r\n logger.debug(\"BeforeUnload script initiated.\")\r\n }\r\n\r\n /**\r\n * Triggers form abandonment event if the form is not submitted and the user closes the modal\r\n */\r\n function initModalAbandonmentListner() {\r\n modalClosed.on(() => {\r\n if (FormState.value == \"RegularForm\" && CurrentFormExperienceGatingState.value != \"NoGate\") {\r\n formAbandonment.trigger({ eventName: \"formAbandonment\" });\r\n }\r\n });\r\n logger.debug(\"ModelCloseListener initiated.\")\r\n }\r\n\r\n provide(UseAbandonmentTriggerInjectionKeys.beforeUnloadListener, initBeforeUnloadScript);\r\n provide(UseAbandonmentTriggerInjectionKeys.modalAbandonmentListener, initModalAbandonmentListner);\r\n\r\n}\r\n/**\r\n * Calls the two functins that listen for form abandonment\r\n */\r\nexport function useAbandonmentListeners({ callerLabel }: { callerLabel?: string | undefined } = {}) {\r\n const { logger } = useFormLogger();\r\n try {\r\n\r\n callerLabel ??= \"AbandonmentListeners\";\r\n\r\n const beforeUnloadListener = injectRequiredWithSelf(UseAbandonmentTriggerInjectionKeys.beforeUnloadListener);\r\n const modalAbandonmentListener = injectRequiredWithSelf(UseAbandonmentTriggerInjectionKeys.modalAbandonmentListener);\r\n beforeUnloadListener();\r\n modalAbandonmentListener();\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? \"unknown\"}`);\r\n throw err;\r\n }\r\n}", "import { watch } from 'vue';\r\nimport { AnyFormSettingsKey } from '../form-settings/form-experience/form-settings-keys.js';\r\nimport { initFormState, useFormState } from \"./use-form-state.js\";\r\nimport { initMarketoFormEvents, useFormEvents } from './use-form-events.js';\r\nimport { initMarketoForm, useMarketoForm, useMarketoFormInternals } from \"./use-marketo-form-instance.js\";\r\nimport { initEclipseHtmlFormElement } from \"./use-eclipse-html-form-element.js\";\r\nimport { initMarketoRecaptcha } from \"./use-marketo-recaptcha.js\";\r\nimport { initHiddenFieldInitializer, useHiddenFieldInitializer } from \"./use-hidden-field-initializer.js\";\r\nimport type { FormWidgetData } from \"../../widgetDataTs.js\";\r\nimport { initGatingLevel, useGatingLevel } from './use-gating-level.js';\r\nimport type { MarketoFormState } from '../types/definitions/marketo-form-state.js';\r\nimport { HiddenMarketoInputName } from '../types/definitions/inputs/marketo-input-names-and-values.js';\r\nimport { initMarketoHiddenInputs } from './use-marketo-hidden-inputs.js';\r\nimport { initInputsMetaData } from \"./use-inputs-meta-data.js\";\r\nimport { initFormSettings, useFormSettings } from \"./use-form-settings.js\";\r\nimport { initMarketoKnownVisitorState } from './use-marketo-known-visitor-status.js';\r\nimport { initBlindSubmit } from './use-blind-submit.js';\r\nimport { initInputState, useInputState } from './use-input-state.js';\r\nimport { initEnabledFields } from './use-enabled-fields.js';\r\nimport { type MarketoFormSettingsKey } from '../form-settings/marketo-form/marketo-form-setting.js';\r\nimport { initFormSubmit } from './use-form-submit.js';\r\nimport { initFormUserInputValues, useFormUserInputValues } from \"./use-form-user-input-values.js\";\r\nimport { initPrivacyConsentState } from './use-privacy-consent-state.js';\r\nimport { initFormAssetDownloads } from './use-form-asset-download.js';\r\nimport { initFormTracking, useFormTracking } from './use-form-tracking.js';\r\nimport { initFormAbandonmentManager } from './use-form-abandonment.js';\r\nimport type { SiteCountryCode } from '../../types-and-definitions/locale-defs/Locales.js';\r\nimport { initSiteLanguage } from \"./use-site-language.js\";\r\nimport { initFormLogger, useFormLogger } from './use-form-logger.js';\r\nimport { isNil } from '@mcwd/typescript-type-guards';\r\nimport type { GatingLevel } from '../types/definitions/gating/gating-level.js';\r\nimport { initUseTranslation } from './use-translation.js';\r\nimport { initValidations } from './use-input-validation.js';\r\nimport { initAbandonmentListeners, useAbandonmentListeners } from './use-abandonment-trigger.js';\r\n\r\nexport { useFormSettings } from \"./use-form-settings.js\";\r\nexport { useFormState } from \"./use-form-state.js\";\r\nexport { useMarketoForm, useMarketoFormInternals } from \"./use-marketo-form-instance.js\";\r\nexport { useEclipseHtmlFormElement } from \"./use-eclipse-html-form-element.js\";\r\nexport { useMarketoRecaptcha } from \"./use-marketo-recaptcha.js\";\r\nexport { useGatingLevel } from \"./use-gating-level.js\";\r\nexport { useInputsMetaData } from \"./use-inputs-meta-data.js\";\r\nexport { useInputState, type InputStateOption } from \"./use-input-state.js\";\r\nexport { useSubmitState } from \"./use-submit-state.js\";\r\nexport { useFormSubmit } from \"./use-form-submit.js\";\r\nexport { useBlindSubmit } from \"./use-blind-submit.js\";\r\nexport { useSiteLanguage } from \"./use-site-language.js\";\r\nexport { useTranslation } from \"./use-translation.js\";\r\n\r\nexport { type InputState } from \"./use-input-state.js\";\r\nexport { type SubmitState, type SubmitStateKey } from \"./use-submit-state.js\";\r\n\r\n\r\nexport interface InitFormServicesOptions {\r\n formSettingsKey: AnyFormSettingsKey;\r\n widgetData: FormWidgetData,\r\n isInModal: boolean,\r\n lang: SiteCountryCode\r\n customData?: Record | undefined;\r\n gatingLevelCustom?: GatingLevel.FormExperience\r\n}\r\n\r\n\r\nexport function initFormServices({ formSettingsKey, widgetData, isInModal, lang, customData, gatingLevelCustom }: InitFormServicesOptions) {\r\n initFormLogger(formSettingsKey);\r\n const { logger } = useFormLogger({ callerLabel: \"initFormServices\"});\r\n logger.time(\"initFormServices\");\r\n initSiteLanguage(lang);\r\n initValidations();\r\n initFormSettings(formSettingsKey);\r\n initUseTranslation();\r\n initMarketoKnownVisitorState();\r\n initMarketoFormEvents();\r\n initEclipseHtmlFormElement();\r\n const { FormSettings } = useFormSettings({ callerLabel: \"initFormServices\" });\r\n initGatingLevel({ widgetData, formSettingsKey, gatingLevelCustom });\r\n initFormState();\r\n initEnabledFields();\r\n initFormUserInputValues();\r\n initPrivacyConsentState();\r\n initInputState();\r\n initMarketoForm();\r\n initMarketoRecaptcha();\r\n initFormSubmit();\r\n initBlindSubmit();\r\n initFormAssetDownloads();\r\n initAbandonmentListeners();\r\n\r\n initHiddenFieldInitializer({\r\n formSettingsKey,\r\n widgetData,\r\n leadSource: \"Website\",\r\n customDocumentDownloadURL: customData?.customDocumentDownloadURL as string | undefined,\r\n });\r\n initFormTracking({ formTrackingName: FormSettings.formTrackingName, widgetData, isInModal });\r\n\r\n initInputsMetaData();\r\n\r\n const { FormState } = useFormState({ callerLabel: \"initFormServices\" });\r\n const events = useFormEvents({ callerLabel: \"initFormServices\" });\r\n\r\n watch(\r\n () => FormState.value,\r\n (newState: MarketoFormState, prevState: MarketoFormState) => {\r\n logger.debug(`Form State Changed: { newState: \"${newState}\", prevState: \"${prevState}\" }`);\r\n }\r\n );\r\n\r\n const { LoadForm } = useMarketoForm({ callerLabel: \"initFormServices\" });\r\n\r\n LoadForm().catch((err) => logger.error(err));\r\n\r\n const { setHiddenFields, hiddenFieldValueBuilder } = useHiddenFieldInitializer({ callerLabel: \"initFormServices\" });\r\n const { setCookieGatingLevelState, FormGatingLevel } = useGatingLevel({ callerLabel: \"initFormServices\" });\r\n\r\n initMarketoHiddenInputs(HiddenMarketoInputName);\r\n\r\n (Object.keys(events) as (keyof typeof events)[])\r\n .filter((key) => key !== \"marketoValidation\")\r\n .forEach((key) => {\r\n const eventHook = events[key];\r\n if (!(\"on\" in eventHook)) {\r\n return;\r\n }\r\n eventHook.on(({ eventName }: { eventName: string }) => {\r\n logger.debug(`FormEvent: ${eventName}`);\r\n });\r\n });\r\n\r\n events.marketoValidation.on(({ eventName, marketoIsValid }) => {\r\n logger.debug(`FormEvent: ${eventName}(mktoIsValid=\"${marketoIsValid.toString()}`);\r\n });\r\n\r\n const { setInputStates, inputStates } = useInputState();\r\n const { setFormUserInputValuesFromSettings, userInputValues } = useFormUserInputValues();\r\n\r\n useFormTracking({ callerLabel: \"use-form-services\" });\r\n\r\n events.marketoSetup.on(() => {\r\n setHiddenFields();\r\n });\r\n\r\n watch(() => FormState.value, (val) => {\r\n if (val === \"BlindForm\") {\r\n logger.log(\"Reset values for blind form\");\r\n setFormUserInputValuesFromSettings();\r\n setInputStates(userInputValues, {});\r\n setHiddenFields();\r\n }\r\n });\r\n\r\n const { MarketoFormHtmlElement } = useMarketoFormInternals({ callerLabel: \"initFormServices\" });\r\n\r\n watch(() => hiddenFieldValueBuilder.hiddenFieldValuesObject.value, () => {\r\n if (isNil(MarketoFormHtmlElement.value) === false) {\r\n setHiddenFields();\r\n }\r\n });\r\n\r\n events.completed.on(() => {\r\n if (FormSettings.gatingCookiePermissions.allowWrite) {\r\n setCookieGatingLevelState(FormGatingLevel);\r\n }\r\n });\r\n\r\n // All form abandonment logic\r\n initFormAbandonmentManager({ formName: FormSettings.formTrackingName, isInModal, inputStates, widgetData });\r\n \r\n useAbandonmentListeners({ callerLabel: \"initFormServices\" });\r\n logger.timeEnd(\"initFormServices\");\r\n}\r\n\r\nexport function useFormServices<\r\n TFormOrFormExperience extends \"MarketoForm\" | \"FormExperience\" = \"FormExperience\",\r\n const TFormSettingsKey extends MarketoFormSettingsKey | AnyFormSettingsKey =\r\n TFormOrFormExperience extends \"MarketoForm\" \r\n ? MarketoFormSettingsKey \r\n : AnyFormSettingsKey\r\n> ({ callerLabel }: { callerLabel?: string | undefined } = {})\r\n{\r\n const { logger } = useFormLogger({ callerLabel: \"useFormServices\" });\r\n try {\r\n callerLabel ??= \"useFormServices\";\r\n const { FormSettings, FormClasses } = useFormSettings({ callerLabel });\r\n const { FormState } = useFormState({ callerLabel });\r\n const { \r\n CurrentMarketoFormGatingState,\r\n CurrentFormExperienceGatingState,\r\n FormGatingLevel,\r\n FormExperienceGatingLevel\r\n } = useGatingLevel({ callerLabel });\r\n const { UniqInstanceId } = useMarketoForm({ callerLabel });\r\n\r\n return {\r\n FormSettings,\r\n FormClasses,\r\n FormState,\r\n FormGatingLevel,\r\n FormExperienceGatingLevel,\r\n CurrentMarketoFormGatingState,\r\n CurrentFormExperienceGatingState,\r\n UniqInstanceId\r\n };\r\n }\r\n catch (err) {\r\n logger.error(`InjectionError from ${callerLabel ?? 'unknown'}`);\r\n throw err;\r\n }\r\n}"], "mappings": "0hBAAO,IAAMA,GAA0B,CACrC,WACA,wBACA,oBACA,MACA,aACA,6BACF,EAIaC,GAAuB,CAClC,QACA,qBACA,oBACA,cACA,WACF,EAGaC,GAA2B,CACtC,cACA,YACA,oBACF,EAGaC,GAAgC,CAAC,eAAe,EAIhDC,GAAyB,CACpC,UACA,SACA,SACA,QACA,UACA,eACA,UACA,eACA,qBACA,qBACA,mCACA,aACF,EAGaC,GAAkB,CAAC,6BAA6B,EAGhDC,GAAqB,CAChC,GAAGN,GACH,GAAGC,GACH,GAAGG,GACH,GAAGC,GACH,GAAGF,EACL,EC5CO,IAAMI,GAAiB,+BACjBC,GAAoB,cAC3BC,GAAmB,2CAaZC,GAAqBC,GAAmB,OACnD,CACEC,EACAC,IACG,CACH,IAAMC,EAAiBC,GAA6BF,CAAiB,EACrE,OAACD,EAAOC,CAAiB,EAAmD,OAAO,OAAO,CACxF,iBAAkBJ,GAClB,QAASF,GACT,WAAYC,GACZ,GAAGM,CACL,CAA+D,EACxDF,CACT,EACA,CAAC,CACH,EAEO,SAASI,GAAkJH,EAAuC,CACvM,GAAIF,GAAmB,SAASE,CAAiB,IAAM,GACrD,MAAM,IAAI,MAAM,2CAA2CA,CAAiB,GAAG,EAEjF,OAAOH,GAAmBG,CAAiB,CAQ7C,CAEO,SAASI,GAAeJ,EAAuC,CACpE,GAAIF,GAAmB,SAASE,CAAiB,IAAM,GACrD,MAAM,IAAI,MAAM,2CAA2CA,CAAiB,GAAG,EAEjF,IAAMC,EAAiBC,GAA6BF,CAAiB,EAC/D,CAAE,uBAAAK,CAAuB,EAAIJ,EAC7BK,EAAiB,cAAcN,CAAiB,QAChDO,EAAwB,MAAMP,CAAiB,QAC/CQ,EAAmB,WAAWH,CAAsB,QAC1D,MAAO,CAAE,eAAAC,EAAgB,sBAAAC,EAAuB,iBAAAC,CAAiB,CACnE,CCnCA,SAASC,EACPC,EACAC,EACAC,EACwB,CACxB,OAAOD,KAAQD,GAAOE,EAAYF,EAAIC,CAAc,CAAC,CACvD,CAEA,SAASE,EACPH,EACAC,EACAC,EACiC,CACjC,MAAO,EAAED,KAAQD,IAAQE,EAAYF,EAAIC,CAAc,CAAC,CAC1D,CAEA,SAASG,EAAuCC,EAAUC,EAAkCC,EAAyBC,EAAmC,CACtJ,GAAIF,EAAUD,CAAK,EACjB,MAAO,GAEJ,GAAIE,EACP,MAAM,IAAI,MAAMC,CAAY,EAEzB,MAAO,EACd,CAEA,SAASC,GAAoCJ,EAAUC,EAAsCC,EAAyBC,EAAmC,CACvJ,OAAOJ,EAA6BC,EAAOC,EAAWC,EAAgBC,CAAY,CACpF,CAEA,SAASE,EAAmBC,KAAyBC,EAAmB,CACtE,IAAMC,EAAUD,EAAO,IAAIE,IAChBA,GAAe,SAAW,kBAC/B,MAAM;AAAA,CAAI,GACV,IAAIC,GAAK,KAAKA,CAAC,EAAE,EAClB,KAAK;AAAA,CAAI,CACb,EAAE,KAAK;AAAA;AAAA,CAAM,EACd,MAAO,GAAGJ,CAAY;AAAA,EAAOE,CAAO,EACtC,CA0CA,SAASG,GAAeC,EAAcC,EAAiB,GAA4B,CACjF,OACEC,GAAmBF,EAAKG,EAAUF,EAAgB,2BAA2B,GAC7EG,EAAsBJ,EAAKK,GAAKC,EAAgBD,EAAG,KAAME,CAAQ,EAAGN,EAAgB,qDAAqD,GACzIG,EAAsBJ,EAAKK,GAClBG,EAAwBH,EAAG,WAAYE,CAAQ,GAAKC,EAAyCR,EAAK,WAAYS,CAAK,EACzHR,EAAgB,iEAAiE,GACpFG,EAAsBJ,EAAKK,GAAKC,EAAgBD,EAAG,QAASE,CAAQ,EAAGN,EAAgB,wDAAwD,CAGnJ,CAEA,SAASS,GAAWV,EAAcC,EAAiB,GAAgC,CACjF,GAAI,CACF,OAAOC,GAAmBF,EAAOK,GAAeN,GAAeM,EAAGJ,CAAc,EAAiCA,EAAgB,sCAAsC,GACrKG,EAAsBJ,EAAKK,GAAKG,EAAwBH,EAAG,cAAgBM,GAAMJ,EAASI,CAAC,GAAKF,EAAME,CAAC,CAAgC,EAAGV,EAAgB,oEAAoE,GAC9NG,EAAsBJ,EAAKK,GAAKC,EAAgBD,EAAG,UAAWE,CAAQ,EAAGN,EAAgB,0DAA0D,GACnJG,EAAsBJ,EAAKK,GAAKC,EAAgBD,EAAG,OAAQE,CAAQ,EAAGN,EAAgB,uDAAuD,CACjJ,OACOW,EAAc,CACnB,MAAM,IAAI,MAAMC,EAAmB,aAAcD,CAAG,EAAG,CAAE,MAAOA,CAAI,CAAC,CACvE,CACF,CAEA,SAASE,GAAYd,EAAoC,CACvD,OAAOD,GAAeC,CAAG,GAAKM,EAAgBN,EAAK,YAAaO,CAAQ,CAC1E,CAEA,SAASQ,GAAgBf,EAA4C,CACnE,OAAOc,GAAYd,CAAG,GAAKM,EAAgBN,EAAK,eAAgBgB,EAAe,CACjF,CAEO,SAASA,GAAgBhB,EAAyC,CACvE,OAAOiB,GAAgCjB,EAAKU,EAAU,CACxD,CAEO,SAASQ,GAAalB,EAAsC,CACjE,OAAOiB,GAA6BjB,EAAKc,EAAW,CACtD,CAEO,SAASK,GAAqBnB,EAA8C,CACjF,OAAOiB,GAAqCjB,EAAKe,EAAe,CAClE,CA6CA,SAASK,GAGPC,EACAC,EAC0C,CAC1C,OAAOC,EAASF,CAAG,GAAKG,EAAgBH,EAAK,WAAYC,CAAW,CACtE,CAEA,SAASG,GACPJ,EACAC,EACAI,EAAiB,GACwB,CACzC,GAAI,CACF,OAAOC,GAAmBN,EAAKE,EAAUG,EAAgB,0CAA0C,GACjGE,EAAuDP,EAAKQ,GAAKL,EAAgBK,EAAG,WAAYC,EAAO,EAAGJ,EAAgB,qDAAqD,KAAK,UAAUL,CAAG,CAAC,EAAE,GACpMO,EACEP,EAAI,SACJQ,GAAKE,GAAyBF,EAAGG,GAAKV,EAAYU,EAAGN,CAAc,CAAC,EACpEA,EACA,gEAAgE,KAAK,UAAUL,EAAI,QAAQ,CAAC,EAC9F,CACJ,OACMY,EAAc,CAClB,MAAM,IAAI,MAAMC,EAAmB,0BAA2BD,CAAG,EAAG,CAAE,MAAOA,CAAI,CAAC,CACpF,CACF,CAgDA,SAASE,GAASC,EAA6B,CAC7C,OACEC,EAASD,CAAG,GACZE,EAAgBF,EAAK,OAAQG,CAAQ,GACrCD,EAAgBF,EAAK,aAAcG,CAAQ,IAC1CC,EAAwBJ,EAAK,YAAaG,CAAQ,GAAKC,EAAwBJ,EAAK,YAAaK,CAAK,EAE3G,CAEO,IAAMC,GAAgB,CAAC,eAAgB,YAAa,iBAAkB,cAAe,gBAAiB,cAAc,EAG9GC,GAAY,CAAC,UAAW,GAAGD,EAAa,EAGrD,SAASE,GAAgBR,EAAoC,CAC3D,OAAOG,EAASH,CAAG,GAAKM,GAAc,SAASN,CAAoB,CACrE,CAoBA,SAASS,GACPC,EACiC,CACjC,OACEC,EAASD,CAAG,IACXE,EAAwBF,EAAK,iBAAkBG,CAAQ,GAAKD,EAAwBF,EAAK,iBAAkBI,CAAK,KAChHF,EAAwBF,EAAK,UAAWG,CAAQ,GAAKD,EAAwBF,EAAK,UAAWI,CAAK,KAClGF,EAAwBF,EAAK,UAAWG,CAAQ,GAAKD,EAAwBF,EAAK,UAAWI,CAAK,KAClGF,EAAwBF,EAAK,UAAWG,CAAQ,GAAKD,EAAwBF,EAAK,UAAWI,CAAK,EAEvG,CAEA,SAASC,GACPL,EACAM,EAAiB,GACe,CAChC,GAAI,CACF,OAAOC,GAAmBP,EAAKC,EAAUK,EAAgB,kCAAkC,GACzFE,EACER,EACAS,GAAKC,EAAgBD,EAAG,iBAAkBE,EAAS,EACnDL,EACA,gDACF,GACAE,EACER,EACAS,GAAMP,EAAwBO,EAAG,UAAWN,CAAQ,GAAKD,EAAwBF,EAAK,UAAWI,CAAK,EACtGE,EACA,+CACF,IACIJ,EAAwBF,EAAK,UAAWG,CAAQ,GAAKD,EAAwBF,EAAK,UAAWI,CAAK,KAClGF,EAAwBF,EAAK,UAAWG,CAAQ,GAAKD,EAAwBF,EAAK,UAAWI,CAAK,EAC1G,OACMQ,EAAc,CAClB,MAAM,IAAI,MAAMC,EAAmB,4BAA6BD,CAAG,EAAG,CAAE,MAAOA,CAAI,CAAC,CACtF,CACF,CAuDA,SAASE,GACPC,EACAC,EACAC,EAAiB,GACyB,CAC1C,GAAI,CACF,OACEC,GACEH,EACAI,EACAF,EACA,yBACF,GACAG,EACEL,EACCM,GAAMC,EAAgBD,EAAG,OAAQE,EAAe,EACjDN,EACA,uEAAuEO,GAAc,SAAS,CAAC,EACjG,IACCR,IAAgB,SACbI,EACEL,EACCM,GACCI,EAAwBJ,EAAG,WAAYK,EAA0B,EACnET,EACA,4EACF,EACAG,EACEL,EACCM,GAAMC,EAAgBD,EAAG,WAAYM,EAAyB,EAC/DV,EACA,2EACF,IACJG,EACEL,EACCM,GAAMC,EAAgBD,EAAG,OAAQF,CAAQ,EAC1CF,EACA,sDACF,CAEJ,OAASW,EAAc,CACrB,MAAM,IAAI,MAAMC,EAAmB,wBAAyBD,CAAG,EAAG,CAAE,MAAOA,CAAI,CAAC,CAClF,CACF,CA2BA,SAASE,GAIPC,EACAC,EAQkD,CAClD,OAAOC,EAASF,CAAG,GAAKG,EAAgBH,EAAK,QAASC,CAAW,CACnE,CAsBA,SAASG,GAAyBC,EAAcC,EAAiB,GAAsC,CACrG,GAAI,CACF,OAAOC,EAA6DF,EAAKG,GAAKC,GAA+BD,EAAG,QAASF,CAAc,EAAGA,EAAgB,uDAAuD,GAC/MC,EAAsBF,EAAI,KAAMG,GAAKA,IAAM,eAAgBF,EAAgB,qCAAqC,GAChHC,EACEF,EACAG,GAAKE,EAAgBF,EAAG,OAAQG,CAAQ,EACxCL,EACA,oDACF,GACAC,EACEF,EAAI,KACJG,GAAKE,EAAgBF,EAAG,WAAaI,GAAKC,GAA0CD,EAAGE,GAAYR,CAAc,CAA0D,EAC3KA,EACA,qEACF,CACJ,OAASS,EAAc,CACrB,MAAM,IAAI,MAAMC,EAAmB,2BAA4BD,CAAG,EAAG,CAAE,MAAOA,CAAI,CAAC,CACrF,CAEF,CAmCA,SAASE,GAAsBC,EAAcC,EAAiB,GAAmC,CAC/F,GAAI,CACF,OAAOC,EACHF,EAAKG,GAAKC,GAA+BD,EAAG,QAASF,CAAc,EAAGA,EAAgB,uDAAuD,GAC/IC,EAAsBF,EAAI,KAAMG,GAAKA,IAAM,YAAaF,EAAgB,kCAAkC,GAC1GC,EACEF,EACAG,GAAKE,EAAgBF,EAAG,OAAQG,CAAQ,EACxCL,EACA,oDACF,GACAC,EACEF,EAAI,KACJG,GAAKE,EAAgBF,EAAG,WAAcI,GAAeC,GAA0CD,EAAGE,GAAYR,CAAc,CAA0D,EACtLA,EACA,qEACF,GACAC,EACEF,EAAI,KAAOG,GACFO,GAAsDP,EAAKI,GAAeI,GAAgDJ,EAAGK,EAAe,CAAC,EAEtJX,EACA,2EACF,CACJ,OAASY,EAAc,CACrB,MAAM,IAAI,MAAMC,EAAmB,wBAAyBD,CAAG,EAAG,CAAE,MAAOA,CAAI,CAAC,CAClF,CACF,CAMO,SAASE,GAA0Bf,EAAcC,EAAiB,GAAuC,CAC9G,GAAI,CACF,OAAOC,EACLF,EAAKG,GAAKC,GAA+BD,EAAG,QAASF,CAAc,EAAGA,EAAgB,uDAAuD,GAC7IC,EAAsBF,EAAI,KAAMG,GAAKA,IAAM,gBAAiBF,EAAgB,sCAAsC,GAClHC,EACEF,EACAG,GAAKE,EAAgBF,EAAG,OAAQG,CAAQ,EACxCL,EACA,oDACF,GACAC,EACEF,EAAI,KACJG,GACSE,EACLF,EACA,WACCI,GAAeC,GAA0CD,EAAGE,GAAY,EAAK,CAChF,GACAC,GACEP,EACCI,GAA2DI,GAAwCJ,EAAGS,EAAW,CACpH,EACCf,EACH,4GACF,CACJ,OAASY,EAAc,CACrB,MAAM,IAAI,MAAMC,EAAmB,4BAA6BD,CAAG,EAAG,CAAE,MAAOA,CAAI,CAAC,CACtF,CACF,CAqCA,SAASI,GAA2BC,EAAcC,EAAiB,GAAwC,CACzG,GAAI,CACF,OAAOC,EAA6DF,EAAKG,GAAKC,GAA+BD,EAAG,QAASF,CAAc,EAAGA,EAAgB,uDAAuD,GAC/MC,EAAsBF,EAAI,KAAMG,GAAKA,IAAM,iBAAkBF,EAAgB,uCAAuC,GACpHC,EACEF,EACAG,GAAKE,EAAgBF,EAAG,OAAQG,CAAQ,EACxCL,EACA,oDACF,GACAC,EACEF,EAAI,KAAOG,GACFI,GAA8CJ,EAAKK,GAAMC,GAAwCD,EAAGE,EAAW,CAAwD,EAChLT,EACA,mEACF,CACJ,OACOU,EAAc,CACnB,MAAM,IAAI,MAAMC,EAAmB,6BAA8BD,CAAG,EAAG,CAAE,MAAOA,CAAI,CAAC,CACvF,CACF,CAKA,SAASE,GAAwBb,EAAcC,EAAiB,GAAqC,CACnG,OACEG,GAAsBJ,EAAK,QAASC,CAAc,GAClDD,EAAI,OAAS,eACbK,EAAgBL,EAAK,OAAQM,CAAQ,CAEzC,CA8BO,SAASQ,GAA0BC,EAAiBd,EAAiB,GAAyC,CACnH,GAAI,CACF,GAAIC,EAAsBa,EAAOT,EAAUL,EAAgB,gCAAgC,EAAG,CAC5F,IAAMe,EAAoB,CAAC,EAC3B,GAAI,CAAE,GAAIC,GAAyBF,EAAOd,CAAc,EAAK,MAAO,EAAQ,OAASU,EAAc,CAAEK,EAAO,KAAKL,CAAG,CAAG,CACvH,GAAI,CAAE,GAAIO,GAAsBH,EAAOd,CAAc,EAAK,MAAO,EAAQ,OAASU,EAAc,CAAEK,EAAO,KAAKL,CAAG,CAAG,CACpH,GAAI,CAAE,GAAIZ,GAA2BgB,EAAOd,CAAc,EAAK,MAAO,EAAQ,OAASU,EAAc,CAAEK,EAAO,KAAKL,CAAG,CAAG,CACzH,GAAI,CAAE,GAAIE,GAAwBE,EAAOd,CAAc,EAAK,MAAO,EAAQ,OAASU,EAAc,CAAEK,EAAO,KAAKL,CAAG,CAAG,CACtH,GAAI,CAAE,GAAIQ,GAA0BJ,EAAOd,CAAc,EAAK,MAAO,EAAQ,OAASU,EAAc,CAAEK,EAAO,KAAKL,CAAG,CAAG,CACxH,GAAIK,EAAO,OAAS,GAAKf,EACvB,MAAM,IAAI,MAAMW,EAAmB,iDAAkD,GAAGI,CAAM,EAAG,CAAE,MAAOA,CAAO,CAAC,CAEtH,CACA,MAAO,EACT,OAASL,EAAc,CACrB,MAAM,IAAI,MAAMC,EAAmB,4BAA6BD,CAAG,EAAG,CAAE,MAAOA,CAAI,CAAC,CACtF,CACF,CAsHA,SAASS,GAAuBC,EAAeC,EAAqE,CAClH,OAAOC,EAAiEF,EAAQG,GAAKC,EAAgBD,EAAG,SAAUE,EAAQ,EAAIJ,EAAgB,0CAA4C,KAAK,UAAUD,CAAK,CAAC,CACjN,CAmEO,SAASM,GACdC,EACAC,EACAC,EAAiB,GACqE,CACtF,GAAI,CACF,OAAAD,IAAcE,GACdF,EAAaG,GAAQH,CAAS,EAAIA,EAAY,CAACA,CAAS,EACjDI,GAAmBL,EAAOM,EAAUJ,EAAgB,2BAA2B,GACpFK,GAAuBP,EAAOE,CAAc,GAC3C,UAAWF,GACZQ,GAA0BR,EAAM,MAAOE,CAAc,GACrDO,EACET,EAAM,MACLU,GAAOT,EAAuB,SAASS,EAAE,IAAI,EAC9CR,EACA,sBAAsBF,EAAM,MAAM,IAAI,gDAAgDC,EAAU,SAAS,CAAC,EAC5G,CACJ,OAASU,EAAc,CACrB,MAAM,IAAI,MAAMC,EAAmB,mBAAoBD,CAAG,EAAG,CAAC,MAAOA,CAAI,CAAC,CAC5E,CACF,CCp7BA,IAAIE,GACJ,SAASC,GAAQC,EAAK,CACpB,QAAAC,EACA,WAAAC,EAAa,CAAC,kBAAmB,SAAU,QAAS,SAAS,EAC7D,UAAAC,EAAY,IACZ,QAAAC,EAAU,GACZ,EAAG,CACD,IAAMC,EAAWJ,EAAQ,EAAE,KAAKA,CAAO,EACjCK,EAAiBC,EAAI,IAAI,IAAM,EAC/BC,EAAa,IAAMF,EAAe,MAAQ,IAAI,KAC9CG,EAAY,IAAMH,EAAe,MACvCJ,EAAW,QAASQ,GAAU,CAC5B,IAAIC,EACJ,OAAQD,EAAO,CACb,IAAK,QACL,IAAK,WACFC,EAAKV,EAAQ,QAAU,MAAgBU,EAAG,GAAGD,EAAOF,CAAU,EAC/D,MACF,QACEP,EAAQ,GAAGS,EAAOF,CAAU,EAC5B,KACJ,CACF,CAAC,EACDR,EAAI,UAAU,UAAWY,EAAoB,EAC7CZ,EAAI,MAAM,CACR,cAAe,CACb,IAAIW,EAAIE,EACR,IAAMC,EAAU,KAAK,SACrB,GAAI,CAACA,EAAQ,QAAU,CAACA,EAAQ,YAAa,CAC3C,KAAK,YAAc,OACnB,MACF,CACA,IAAMC,EAAO,KAAK,SAAS,KACrBC,GAAQ,KAAK,OAAO,EAAI,IAAM,EAAI,GAAG,SAAS,EAC9CC,EAAU,CAACF,EAAMC,CAAI,EAAE,OAAQE,GAAM,CAAC,CAACA,CAAC,EAAE,KAAK,GAAG,EACxD,KAAK,UAAY,CAAC,EAClB,IAAMC,EAAcC,GAAW,CAC7B,OAAO,QAAQA,CAAM,EAAE,QAAQ,CAAC,CAACC,GAAMC,EAAS,IAAM,CACpDrB,EAAQ,kBAAkBoB,GAAMJ,EAASK,GAAW,GAAM,EAAK,EAC/D,KAAK,UAAU,KAAK,CAACD,GAAMJ,CAAO,CAAC,CACrC,CAAC,CACH,GACCN,EAAKG,EAAQ,SAAW,MAAgBH,EAAG,QAASS,GAAW,CAC9DD,EAAW,KAAK,MAAMC,CAAM,CAAC,CAC/B,CAAC,EACD,GAAI,CAAE,IAAAG,GAAK,GAAAC,EAAI,UAAAC,CAAU,EAAIC,EAAkBZ,EAASK,CAAU,GAC7DN,EAAK,KAAK,YAAc,MAAgBA,EAAG,SAC9CW,EAAK,CAACP,CAAO,EAAE,OAAOO,GAAkB,CAAC,CAAC,GAE5C,IAAMG,EAAIC,EAAuBL,GAAKC,CAAE,EACxC,KAAK,YAAc,CAACK,EAAKC,KACnB,CAACL,GAAaM,EAAWF,CAAG,EACvBF,EAAEE,EAAKC,EAAQ,EAEfH,EAAEF,EAAY,IAAMI,EAAKC,EAAQ,CAG9C,EACA,WAAY,CACV,IAAInB,GACHA,EAAK,KAAK,YAAc,MAAgBA,EAAG,QAAQ,CAAC,CAACY,EAAKC,CAAE,IAAMvB,EAAQ,qBAAqBsB,EAAKC,CAAE,CAAC,CAC1G,CACF,CAAC,EACDxB,EAAI,OAAO,iBAAiB,GAAK,SAAS6B,EAAKf,EAAS,CACtD,IAAIH,EAEJ,OADAF,EAAU,EACNR,EAAQ,gBACDU,EAAK,MAAQ,KAAO,OAAS,KAAK,cAAgB,KAAOA,EAAKN,GAAUwB,EAAKf,CAAO,EAEtFe,CAEX,EACA7B,EAAI,OAAO,iBAAiB,SAAW,IAAI,MAAMC,EAAS,CACxD,IAAI+B,EAAQC,EAAM,CAChB,OAAAxB,EAAU,EACH,QAAQ,IAAIuB,EAAQC,CAAI,CACjC,CACF,CAAC,EACDnC,GAAcoC,GAAgB/B,EAAWC,CAAO,EAChD,SAASwB,EAAuBL,EAAKC,EAAI,CACvC,OAAID,EACKtB,EAAQ,UAAUsB,EAAKC,CAAE,EACvBA,EACFvB,EAAQ,UAAU,KAAMuB,CAAE,EAE1BnB,CAEX,CACA,SAAS0B,EAAWF,EAAK,CACvB,IAAMM,EAAclC,EAAQ,QAAQ,YACpC,OAAO,OAAOkC,GAAgB,UAAYN,EAAI,SAASM,CAAW,CACpE,CACA,SAAST,EAAkBZ,EAASK,EAAY,CAC9C,IAAII,EACAC,EACAC,EACJ,GAAIX,EAAQ,YAAa,CACvB,IAAIsB,EACAC,GACH,CACC,IAAAd,EACA,WAAAc,EAAapC,EAAQ,QAAQ,UAC7B,UAAAwB,EACA,SAAAW,CACF,EAAItB,EAAQ,aACRsB,GACFjB,EAAWiB,CAAQ,EAErBZ,EAAK,OAAOa,GAAe,SAAW,CAACA,CAAU,EAAIA,EACjDb,GACFvB,EAAQ,eAAeuB,CAAE,CAE7B,CACA,MAAO,CAAE,IAAAD,EAAK,GAAAC,EAAI,UAAAC,CAAU,CAC9B,CACF,CACA,SAASa,IAAiB,CACxB,IAAMC,EAAWC,GAAgB,EAC3BC,EAAcF,EAAS,WAAW,OAAO,iBAC/C,MAAO,CACL,QAASE,EAAY,SACrB,EAAGA,EAAY,GAAG,KAAKF,EAAS,KAAK,CACvC,CACF,CACA,SAASC,IAAkB,CACzB,IAAMD,EAAWG,GAAmB,EACpC,GAAI,CAACH,EACH,MAAM,IAAI,MAAM,2GAA2G,EAE7H,OAAOA,CACT,CACA,SAASL,GAAgBS,EAAOC,EAAK,CACnC,IAAMC,EAAU,GAAGF,CAAK,yBAAyBC,CAAG,GACpD,OAAO,IAAI,OAAOC,EAAS,IAAI,CACjC,CACA,IAAIjC,GAAuBkC,GAAgB,CACzC,MAAO,CACL,YAAe,CACb,KAAM,OACN,SAAU,EACZ,CACF,EACA,MAAMC,EAAO,CAAE,MAAAC,CAAM,EAAG,CACtB,MAAO,IAAM,CACX,IAAMC,EAAcF,EAAM,YACpBG,EAAS,CAAC,EACZC,EACAC,EAAY,EAChB,MAAQD,EAAQrD,GAAY,KAAKmD,CAAW,KAAO,MAAM,CACvDC,EAAO,KAAKD,EAAY,UAAUG,EAAWD,EAAM,KAAK,CAAC,EACzD,IAAME,EAAOL,EAAMG,EAAM,CAAC,CAAC,EACvBE,EACFH,EAAO,KAAK,GAAGG,EAAK,CAAC,EAErBH,EAAO,KAAKC,EAAM,CAAC,CAAC,EAEtBC,EAAYtD,GAAY,SAC1B,CACA,OAAAoD,EAAO,KAAKD,EAAY,UAAUG,CAAS,CAAC,EACrCF,CACT,CACF,CACF,CAAC,ECrIM,SAASI,GAAuCC,EAAoE,CACzH,OAAQA,EAAM,uBAAuB,OAAS,CAChD,CC/BO,SAASC,EAGd,CAAE,YAAAC,EAAa,cAAAC,CAAc,EAAiE,CAC9F,IAAMC,EAAS,CACb,YAAaF,EACb,cAAeC,EACf,uBAAwBA,EAAc,YAAY,CACpD,EACA,cAAO,OAAOC,CAAM,EAEbA,CACT,CCZO,SAASC,GAGd,CAAE,aAAAC,EAAc,eAAAC,CAAe,EAAqE,CACpG,IAAMC,EAAS,CACb,aAAcF,EACd,eAAgBC,EAChB,wBAAyBA,EAAe,YAAY,CACtD,EACA,cAAO,OAAOC,CAAM,EAEbA,CACT,CCVO,SAASC,GAKd,CACA,aAAAC,EACA,YAAAC,EACA,eAAAC,EACA,cAAAC,CACF,EAKG,CACD,IAAMC,EAAwB,GAAGF,CAAc,IAAIC,EAAc,YAAY,CAA8B,GACrGE,EAAS,CACb,GAAGC,GAAqB,CAAE,aAAAN,EAAc,eAAAE,CAAe,CAAC,EACxD,GAAGK,EAAoB,CAAE,YAAAN,EAAa,cAAAE,CAAc,CAAC,EACrD,sBAAuBC,EACvB,+BAAiCA,EAAiC,YAAY,EAC9E,+BAAiCA,EAAiC,YAAY,CAChF,EAEA,cAAO,OAAOC,CAAM,EAEbA,CACT,CC3BO,SAASG,GAOd,CACA,gBAAAC,EACA,eAAAC,EACA,aAAAC,EACA,cAAAC,EACA,YAAAC,CACF,KAOMC,EACN,CACE,IAAMC,EACJN,IAAoB,KAChB,GACA,IAAIA,CAAe,GAMzB,OAAO,OAAOK,CAAsB,EAGpC,IAAME,EAAa,CACjB,GAAGC,GAA4B,CAAE,aAAAN,EAAc,eAAAD,EAAgB,YAAAG,EAAa,cAAAD,CAAc,CAAC,EAC3F,gBAAiBH,EACjB,yBAA0BA,EAAgB,YAAY,EACtD,UAAWM,EACX,uBAAwBD,CAC1B,EAUA,cAAO,OAAOE,CAAU,EACjBA,CACT,CClDA,IAAME,GAAkB,CACtBC,EAAoB,CAAE,YAAa,QAAS,cAAe,IAAK,CAAC,EACjEA,EAAoB,CAAE,YAAa,YAAa,cAAe,IAAK,CAAC,EACrEA,EAAoB,CAAE,YAAa,WAAY,cAAe,IAAK,CAAC,EACpEA,EAAoB,CAAE,YAAa,WAAY,cAAe,IAAK,CAAC,EACpEA,EAAoB,CAAE,YAAa,aAAc,cAAe,IAAK,CAAC,EACtEA,EAAoB,CAAE,YAAa,cAAe,cAAe,IAAK,CAAC,EACvEA,EAAoB,CAAE,YAAa,UAAW,cAAe,IAAK,CAAC,EACnEA,EAAoB,CAAE,YAAa,WAAY,cAAe,IAAK,CAAC,CACtE,EAEMC,GAAkB,CACtBD,EAAoB,CAAE,YAAa,UAAW,cAAe,IAAK,CAAC,EACnEA,EAAoB,CAAE,YAAa,SAAU,cAAe,IAAK,CAAC,EAClEA,EAAoB,CAAE,YAAa,UAAW,cAAe,IAAK,CAAC,EACnEA,EAAoB,CAAE,YAAa,UAAW,cAAe,IAAK,CAAC,EACnEA,EAAoB,CAAE,YAAa,UAAW,cAAe,IAAK,CAAC,EACnEA,EAAoB,CAAE,YAAa,QAAS,cAAe,IAAK,CAAC,EACjEA,EAAoB,CAAE,YAAa,QAAS,cAAe,IAAK,CAAC,EACjEA,EAAoB,CAAE,YAAa,SAAU,cAAe,IAAK,CAAC,EAClEA,EAAoB,CAAE,YAAa,WAAY,cAAe,IAAK,CAAC,EACpEA,EAAoB,CAAE,YAAa,UAAW,cAAe,IAAK,CAAC,EACnEA,EAAoB,CAAE,YAAa,SAAU,cAAe,IAAK,CAAC,EAClEA,EAAoB,CAAE,YAAa,UAAW,cAAe,IAAK,CAAC,EACnEA,EAAoB,CAAE,YAAa,SAAU,cAAe,IAAK,CAAC,EAClEA,EAAoB,CAAE,YAAa,UAAW,cAAe,IAAK,CAAC,EACnEA,EAAoB,CAAE,YAAa,UAAW,cAAe,IAAK,CAAC,EACnEA,EAAoB,CAAE,YAAa,aAAc,cAAe,IAAK,CAAC,EACtEA,EAAoB,CAAE,YAAa,UAAW,cAAe,IAAK,CAAC,EACnEA,EAAoB,CAAE,YAAa,QAAS,cAAe,IAAK,CAAC,EACjEA,EAAoB,CAAE,YAAa,WAAY,cAAe,IAAK,CAAC,CACtE,EAEaE,EAAsB,CACjCC,GAAiB,CACf,gBAAiB,KACjB,aAAc,UACd,eAAgB,KAChB,YAAa,gBACb,cAAe,IACjB,CAAC,EACDA,GAAiB,CACf,gBAAiB,KACjB,aAAc,UACd,eAAgB,KAChB,YAAa,iBACb,cAAe,IACjB,EAAG,GAAGF,EAAe,EACrBE,GAAiB,CACf,gBAAiB,KACjB,aAAc,UACd,eAAgB,KAChB,YAAa,YACb,cAAe,IACjB,EAAG,GAAGJ,EAAe,EACrBI,GAAiB,CACf,gBAAiB,KACjB,aAAc,SACd,eAAgB,KAChB,YAAa,SACb,cAAe,IACjB,CAAC,EACDA,GAAiB,CACf,gBAAiB,KACjB,aAAc,WACd,eAAgB,KAChB,YAAa,QACb,cAAe,IACjB,CAAC,EACDA,GAAiB,CACf,gBAAiB,KACjB,aAAc,SACd,eAAgB,KAChB,YAAa,QACb,cAAe,IACjB,CAAC,EACDA,GAAiB,CACf,gBAAiB,KACjB,aAAc,uBACd,eAAgB,KAChB,YAAa,QACb,cAAe,IACjB,CAAC,CACH,EAMaC,GAA2CF,EAAoB,OAAOG,EAAsC,EAG5GC,GAAqBC,GAAgCL,EAAqB,iBAAiB,EAKxG,OAAO,OAAOA,CAAmB,EACjC,OAAO,OAAOI,EAAkB,ECnGzB,IAAME,GAAkBC,EAAeC,EAAqB,iBAAiB,EAMvEC,GAA2BF,EAAeC,EAAqB,0BAA0B,EAMzFE,GAAyB,CAAC,GAAGJ,GAAiB,GAAGG,EAAwB,EAG/E,SAASE,GAAkBC,EAA0C,CAC1E,OAAQN,GAAsC,SAAUM,CAAgB,CAC1E,CClBO,IAAMC,GAAkBC,GAAyBC,EAAqB,CAAC,wBAAwB,CAAU,EAGnGC,GAA+BC,GAAgCJ,GAAiB,eAAe,EAI/FK,GAAwBJ,GAAyBD,GAAiB,CAAC,eAAe,CAAC,EAQnFM,GAA6BL,GAAyBC,EAAqB,CAAC,wBAAwB,CAAU,ECCpH,IAAUK,OAAV,CAQE,SAASC,EAKdC,EACAC,EACAC,EAEF,CAEE,IAAMC,EAAqBF,EAAc,YAAY,EAC/CG,EAAMJ,EAAY,KAAKK,GAAMA,EAAG,gBAAkBF,CAAkB,EAC1E,GAAIC,EACF,OAAOA,EAEJ,GAAIF,EACP,MAAM,IAAI,MAAM,0DAA0DD,CAAa,EAAE,EAE3F,OAAO,IACT,CApBOH,EAAS,gBAAAC,EA4BT,SAASO,EAKdN,EACAO,EACAL,EAC2G,CAE3G,IAAMM,EAAyBD,EAAsB,YAAY,EAC3DH,EAAMJ,EAAY,KAAKK,GAAMA,EAAG,iCAAmCG,CAAsB,EAC/F,GAAI,CAAAJ,GAGC,GAAIF,EACP,MAAM,IAAI,MAAM,kEAAkEK,CAAqB,EAAE,EAE3G,OAAO,IACT,CAnBOT,EAAS,wBAAAQ,IApCDR,KAAA,IA0DV,IAAUW,OAAV,CAIE,SAASV,EAIdW,EACAR,EACgG,CAEhG,IAAMC,EAAqBO,EAAsB,YAAY,EACvDN,EAAMO,GAA6BR,CAAkB,EAC3D,GAAIC,EACF,OAAOA,EAEJ,GAAIF,EACP,MAAM,IAAI,MAAM,0DAA0DQ,CAAqB,EAAE,EAEnG,OAAO,IACT,CAjBOD,EAAS,gBAAAV,IAJDU,KAAA,IAwBV,IAAUG,MAAV,CAOE,SAASC,EAKdC,EACAZ,EACiF,CAEjF,IAAMa,EAA2BD,EAAgB,YAAY,EAC7D,GAAIE,GAAkBD,CAAwB,EAAG,CAC/C,IAAME,EAASC,GAAmBH,CAAwB,EAC1D,GAAIE,EACF,OAAOA,CAEX,MACSf,GAEPiB,EAAgBJ,EAA0B,yDAAyD,EAErG,GAAIb,EAEF,MAAM,IAAI,MAAM,6DAA6Da,CAAwB,GAAG,EAE1G,OAAO,IACT,CAzBOH,EAAS,kBAAAC,EAiCT,SAASP,EAIdC,EACAL,EAC6F,CAE7F,IAAMe,EAASnB,GAAU,wBAAwBsB,EAAqBb,CAAqB,EAC3F,GAAIU,EACF,OAAOA,EAET,GAAIf,EACF,MAAM,IAAI,MAAM,mEAAmEK,CAAqB,GAAG,EAE7G,OAAO,IACT,CAhBOK,EAAS,wBAAAN,EAwBT,SAASP,EAIdE,EACAC,EAC6E,CAE7E,IAAMC,EAAqBF,EAAc,YAAY,EAC/CG,EAAMgB,EAAoB,KAAKf,GAAMA,EAAG,gBAAkBF,CAAkB,EAElF,GAAIC,EACF,OAAOA,EAET,GAAIF,EACF,MAAM,IAAI,MAAM,0DAA0DD,CAAa,EAAE,EAE3F,OAAO,IACT,CAlBOW,EAAS,gBAAAb,EA6BT,SAASsB,EAMZX,EACAR,EAEJ,CAEE,IAAMoB,EAA6BZ,EAAsB,YAAY,EAC/DN,EAAMmB,GAAyC,KAAMC,GAClDA,EAAW,uBAAuB,UAAWC,GAAiCA,EAAY,gBAAkBH,CAA2B,EAAI,EACnJ,EACD,GAAIlB,EACF,OAAOA,EAET,GAAIF,EACF,MAAM,IAAI,MAAM,kEAAkEQ,CAAqB,EAAE,EAE3G,OAAO,IACT,CAtBOE,EAAS,wBAAAS,IA7FDT,IAAA,IC5FV,IAAUc,OAAV,CACE,IAAUC,MAAV,CAYE,SAASC,EAIdC,EACAC,EAC2E,CAG3E,OAAOC,EAAc,kBAAkBF,EAAiBC,CAAc,GAAG,SAC3E,CAVOH,EAAS,YAAAC,EAiBT,SAASI,EAIdH,EACAC,EACuF,CAEvF,OAAOC,EAAc,kBAAkBF,EAAiBC,CAAc,GAAG,qBAC3E,CATOH,EAAS,wBAAAK,IA7BDL,EAAAD,EAAA,0BAyCV,IAAUO,MAAV,CAYE,SAASL,EAIdM,EACAJ,EACkE,CAElE,OAAOC,EAAc,wBAAwBG,EAAQJ,CAAc,GAAG,SACxE,CATOG,EAAS,YAAAL,EAgBT,SAASO,EAIdD,EACAJ,EACsE,CAEtE,OAAOC,EAAc,wBAAwBG,EAAQJ,CAAc,GAAG,aACxE,CATOG,EAAS,gBAAAE,IA5BDF,EAAAP,EAAA,4BA1CFA,KAAA,ICLV,IAAMU,GAAgBC,EAAeC,EAAqB,eAAe,EAOnEC,GAAyBF,EAAeC,EAAqB,wBAAwB,EAOrFE,GAAuB,CAAC,GAAGJ,GAAe,GAAGG,EAAsB,ECVzE,IAAME,GAAwBC,EAAeC,EAAqB,uBAAuB,EAGnFC,GAAiCF,EAAeC,EAAqB,gCAAgC,EAGrGE,GAAiCH,EAAeC,EAAqB,gCAAgC,EAGrGG,GAA+B,CAAC,GAAGL,GAAuB,GAAGG,GAAgC,GAAGC,EAA8B,ECfpI,IAAME,GAAiBC,GAAkBC,EAAeC,EAAqB,gBAAgB,CAAC,EAIxFC,GAA0BH,GAAkBC,EAAeC,EAAqB,yBAAyB,CAAC,EAI1GE,GAAwB,CAAC,GAAGL,GAAgB,GAAGI,EAAuB,ECT5E,IAAME,GAAkBC,EAAeC,EAAqB,WAAW,ECE9E,IAAMC,GAAsB,CAC1B,qBAAsBC,EAAc,kBACpC,2BAA4BA,EAAc,wBAC1C,mBAAoBA,EAAc,gBAClC,2BAA4BA,EAAc,wBAC1C,yBAA0BC,GAAkB,eAC9C,EAKaC,GAAa,CACxB,GAAGC,GACH,GAAGJ,EACL,ECjBO,IAAMK,GAAuB,CAClC,gBACA,YACA,SACA,cACA,qBACA,cACA,kBACA,aACA,iBACA,mBACA,oBACA,sBACA,qBACF,EAIaC,GAA2BC,GAAmBF,GAAsB,EAAI,ECI9E,SAASG,EACdC,EACsB,CACtB,IAAMC,EAAO,OAAO,KAAKD,CAAU,EACnC,QAAWE,KAAKD,EAAM,CACpB,IAAME,EAAWH,EAAWE,CAAC,EACzBE,EAASD,CAAQ,IACnBH,EAAWE,CAAC,EAAI,OAAOC,CAAQ,EAEnC,CACA,OAAOH,CACT,CAKA,SAASK,GAAmCC,EAA+BC,EAAqH,CAC9L,GAAI,aAAcD,GAAME,EAASF,EAAG,QAAQ,EAAG,CAC7C,IAAMG,EAAYF,EAAI,QAAQ,EAC9B,GAAIE,KAAaH,EAAG,SAAU,CAC5B,IAAMI,EAAQJ,EAAG,SAASG,CAAS,EACnC,MAAQ,CAACE,GAAYD,CAAK,CAC5B,CACF,CACA,MAAO,EACT,CAEO,SAASE,GAAkBL,EAAsBM,EAA6C,CACnG,IAAMP,EAAKQ,GAAmB,EAC9B,OAAIN,EAASF,CAAE,EACTD,GAAmCC,EAAIC,EAAI,QAAQ,CAAC,EAC/CD,EAAG,SAASC,EAAI,QAAQ,CAAC,EAGzBM,GAGT,QAAQ,KAAK,iCAAiC,EAE3CF,GAAYE,CAAY,EAGtBE,GAAUR,CAAG,EAFXQ,GAAUR,EAAKM,CAAY,EAGtC,CAIO,SAASG,KAA8BC,EAAiG,CAC7I,IAAMC,EAAsDD,EAAc,CAAC,EAC3E,GAAIE,EAAMD,CAAG,EACX,MAAM,IAAI,MAAM,8DAA8D,EAOhF,GAJKE,GAASF,CAAG,IACfD,EAAgB,OAAO,OAAOC,CAAG,GAG/BG,GAAcJ,EAAeG,EAAQ,EACvC,OAAQH,EAA2B,MAAOf,GAAM,CAC9C,IAAMoB,EAAa,iCAEnB,OADYV,GAAwBV,EAAGoB,CAAU,IAClCA,CACjB,CAAC,EAGD,MAAM,IAAI,MAAM,6DAA6D,CAEjF,CAEO,SAASC,EAA0BhB,EAAyB,CACjE,IAAMG,EAAQE,GAAkBL,CAAG,EACnC,GAAII,GAAYD,CAAK,EACnB,MAAM,IAAI,MAAM,4BAA4BH,EAAI,SAAS,CAAA,iBAAkB,EAG3E,OAAOG,CAEX,CC5FO,SAASc,GAAeC,EAAqD,CAClF,OAAOC,GAAMD,CAAK,GAAKE,GAAWF,CAAK,CACzC,CCQA,IAAMG,GAA6BC,EAAsD,CACvF,OAAQ,SACR,iBAAkB,kBACpB,CAAC,EAEM,SAASC,GAAeC,EAAqC,CAClE,GAAIC,EAA2BJ,EAA0B,EACvD,OAEF,IAAMK,EAASC,GAAe,eAAe,CAC3C,KAAM,CAAE,SAAU,OAAQ,EAC1B,cAAe,CAACH,CAAe,EAC/B,aAAc,CAACI,EAAwB,CACzC,CAAC,EAEKC,EAAoBC,GACjBJ,EAAO,SAAS,CAAE,aAAcI,CAAgB,CAAC,EAG1DC,EAAQV,GAA2B,OAAQK,CAAM,EACjDK,EAAQV,GAA2B,iBAAkBQ,CAAgB,CACvE,CAEO,SAASG,EAAc,CAAE,YAAAC,CAAY,EAA0C,CAAC,EAAG,CACxF,GAAI,CACFA,IAAgB,gBAChB,IAAMP,EAASQ,EAAuBb,GAA2B,MAAM,EACjEQ,EAAmBK,EAAuBb,GAA2B,gBAAgB,EAC3F,MAAO,CAAE,OAAAK,EAAQ,iBAAAG,CAAiB,CACpC,OACOM,EAAK,CACV,MAAAR,GAAe,MAAM,uBAAuBM,GAAe,SAAS,EAAE,EAChEE,CACR,CACF,CCjCA,IAAMC,GAA+BC,EAAwD,CAC3F,gBAAiB,kBACjB,gBAAiB,iBACnB,CAAC,EAEM,SAASC,GAAiBC,EAAkC,CAC7DC,EAA2BJ,EAA4B,IAGvDK,GAAkBF,CAAe,GACnCG,EAAQN,GAA6B,gBAAiBG,CAAe,EACrEG,EAAQN,GAA6B,gBAAiBO,GAAc,oBAAoB,YAAYJ,EAAiB,EAAI,CAAC,GAG1HK,EAAgBL,CAAe,EAEnC,CAEO,IAAMM,GAAkB,CAAC,CAAE,YAAAC,CAAY,EAA0C,CAAC,IAAM,CAC7F,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,EACjC,GAAI,CACF,IAAMT,EAAkBU,EAAuBb,GAA6B,eAAe,EACrFc,EAAkBD,EAAuBb,GAA6B,eAAe,EAC3F,MAAO,CAAE,gBAAAG,EAAiB,gBAAAW,CAAgB,CAC5C,OAASC,EAAK,CACZ,MAAAJ,EAAO,MAAM,uBAAuBD,GAAe,SAAS,EAAE,EACxDK,CACR,CACF,ECnBA,IAAMC,GAA+BC,EAAwD,CAC3F,aAAc,eACd,YAAa,aACf,CAAC,EAEM,SAASC,GAAiBC,EAAqC,CACpE,GAAIC,EAA2BJ,EAA4B,EACzD,OAEF,IAAMK,EAAeC,GAA+BH,CAAe,EAC7DI,EAAcC,GAAeL,CAAe,EAElDM,EAAQT,GAA6B,aAAcK,CAAY,EAC/DI,EAAQT,GAA6B,YAAaO,CAAW,CAC/D,CAQO,SAASG,EAOd,CAAE,YAAAC,CAAY,EAA0C,CAAC,EAE3D,CAOE,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,EACjC,GAAI,CACFF,IAAgB,kBAEhB,IAAMN,EADeS,EAAuEd,GAA6B,YAAY,EAE/HO,EAAcO,EAAsEd,GAA6B,WAAW,EAElI,MAAO,CACL,aAAAK,EACA,YAAAE,CACF,CACF,OACOQ,EAAK,CACV,MAAAH,EAAO,MAAM,uBAAuBD,GAAe,SAAS,EAAE,EACxDI,CACR,CACF,CC3DA,IAAMC,GAA+BC,EAAwD,CAC3F,sBAAuB,wBACvB,uBAAwB,wBAC1B,CAAC,EAEM,SAASC,IAChB,CAEE,IAAMC,EAAqBC,GAA6D,IAAI,EACtFC,EAAcC,EAAS,IACvBC,EAAMJ,EAAmB,KAAK,EACzB,KAEFA,EAAmB,MAAM,KACjC,EACD,GAAIK,EAA2BR,EAA4B,EACzD,OAGF,IAAMS,EAA0BC,GAA4D,CAC1FP,EAAmB,MAAQO,CAC7B,EAEMC,EAAwBL,EAAwB,IAAM,CAC1D,GAAIC,EAAMF,EAAY,KAAK,EACzB,OAAO,KAMT,IAAMO,EAAmBP,EAAY,MAAM,KACvC,2BACF,EACEQ,GACDD,EAAiB,SAAW,EAAIA,EAAiB,IAAI,EAAI,OAAS,KACrE,OAAAC,EAAMC,EAASD,CAAG,EAAIA,EAAI,KAAK,EAAIA,EAC5BA,IAAQ,MACjB,CAAC,EAEDE,EAAQf,GAA6B,sBAAuBW,CAAqB,EACjFI,EAAQf,GAA6B,uBAAwBS,CAAsB,CACrF,CAEO,IAAMO,GAA8B,CAAC,CAAE,YAAAC,CAAY,EAA0C,CAAC,IAAM,CACzG,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,EACjC,GAAI,CACF,IAAMR,EAAwBS,EAAuBpB,GAA6B,qBAAqB,EACjGS,EAAyBW,EAAuBpB,GAA6B,sBAAsB,EACzG,MAAO,CAAE,sBAAAW,EAAuB,uBAAAF,CAAuB,CACzD,OACOY,EAAK,CACV,MAAAH,EAAO,MAAM,uBAAuBD,GAAe,SAAS,EAAE,EACxDI,CACR,CACF,EC/EO,IAAMC,GAA2B,CAAE,cAAe,gBAAiB,ECM1E,SAASC,GACPC,EAEF,CACE,GAAIA,EAAa,SAAW,EAC1B,OAAO,KAET,GAAIA,EAAa,SAAS,UAA0B,EAClD,MAAO,WAET,GAAIA,EAAa,SAAS,aAA6B,EACrD,MAAO,cAET,GAAIA,EAAa,SAAS,QAAwB,GAAKA,EAAa,SAAS,aAA6B,EACxG,OAAO,KAET,IAAMC,EAAkBD,EAAa,IAAKE,GAAc,IAAIA,CAAC,GAAG,EAAE,KAAK,IAAI,EAC3E,MAAM,IAAI,MAAM,mDAAmDD,CAAe,GAAG,CACvF,CAEA,SAASE,GACPH,EAEF,CACE,GAAIA,EAAa,SAAW,EAC1B,OAAO,KAET,IAAMI,EAAqBL,GAAkCC,CAAY,EACzE,GAAIK,EAASD,CAAkB,EAC7B,OAAOA,EAET,GAAIJ,EAAa,SAAS,QAAwB,EAChD,MAAO,SAET,IAAMC,EAAkBD,EAAa,IAAKE,GAAc,IAAIA,CAAC,GAAG,EAAE,KAAK,IAAI,EAC3E,MAAM,IAAI,MAAM,mDAAmDD,CAAe,GAAG,CACvF,CAEO,SAASK,GAIdC,EACAP,EAEF,CAGE,OAAQO,EAAM,CACZ,IAAK,cACH,OAAOR,GAAkCC,CAAY,EACvD,IAAK,iBACH,OAAOG,GAAwCH,CAAY,EAC7D,QACEQ,EAAgBD,CAAI,CACxB,CACF,CCrDO,SAASE,GACdC,EACAC,EACAC,EACAC,EAEF,CAEE,GAAIC,EAAMD,CAAiB,EACzB,OAAO,KAET,GAAID,EAAS,gBAAgB,SAAS,eAAe,EAAG,CACtD,GAAIA,EAAS,oBAAoB,SAASC,CAAiB,EAAG,CAC5D,GAAIA,IAAsB,UAAYH,IAAS,cAAe,CAC5D,IAAMK,EAAuBC,GAA8BN,EAAME,EAAS,mBAAmB,EAC7F,GAAIE,EAAMC,CAAoB,EAC5B,MAAM,IAAI,MAAM,uDAAwDH,EAAS,eAAgB,8CAA8C,EAEjJ,OAAOG,CACT,CACA,OAAOF,CACT,CACA,IAAMI,EAAmBL,EAAS,oBAAoB,IAAIM,GAAK,IAAIA,CAAC,GAAG,EAAE,KAAK,IAAI,EAClF,MAAM,IAAI,MAAM,+DAA+DL,CAAiB,4DAA4DF,CAAe,wCAAwCM,CAAgB,EAAE,CACvO,CACA,MAAM,IAAI,MAAM,+EAA+EN,CAAe,2HAA2H,CAC3O,CC9BO,SAASQ,GAAuBC,EAAwD,CAC7F,GAAM,CAAE,gBAAAC,EAAiB,iBAAAC,CAAiB,EAAIF,EAC9C,OAAIC,EAAgB,SAAS,MAAM,EAC1BC,EAEF,IACT,CCRO,SAASC,GAAuBC,EAAkF,CACvH,OAAIC,EAAsBD,EAAS,YAAa,CAAC,YAAa,UAAU,CAAC,EAChE,WAEAC,EAAsBD,EAAS,YAAa,CAAC,eAAgB,aAAa,CAAC,EAC3E,cAKAC,EAAsBD,EAAS,YAAa,CAAC,UAAW,UAAW,QAAQ,CAAC,EAC5E,SAGAE,EAAgBF,EAAS,YAAa,6CAA6C,CAE9F,CCZO,SAASG,GACdC,EACAC,EACAC,EAC0C,CAE1C,GAAIA,EAAU,SAAW,EACvB,OAAO,KAET,GAAM,CAAE,oBAAAC,CAAoB,EAAIF,EAE1BG,EADuBF,EAAU,IAAIG,GAAKC,GAAuBD,CAAC,CAAC,EACf,OAAOE,GAAOC,EAAsBD,EAAKJ,CAAmB,CAAC,EACjHM,EAAYC,GAA8BV,EAAMI,CAA4B,EAClF,GAAIO,EAASF,CAAS,EACpB,OAAOA,EAET,IAAMG,EAAuBF,GAA8BV,EAAMG,CAAmB,EACpF,GAAIQ,EAASC,CAAoB,EAC/B,OAAOA,EAET,GAAIJ,EAAsBR,EAAMa,EAAwB,EACtD,MAAM,IAAI,MAAM,uDAAwDZ,EAAS,eAAgB,4DAA6DD,CAAK,GAAG,EAExKc,EAAgBd,CAAI,CACtB,CCrBO,SAASe,GACdC,EACAC,EACAC,EACAC,EAEF,CAGE,GAAM,CAAE,gBAAAC,EAAiB,oBAAAC,CAAoB,EAAIH,EAE3CI,EAA0BD,EAAoB,OAAOE,GAAKC,GAAY,YAAY,SAASD,CAA4B,CAAC,EAExHE,EAAkBL,EAAgB,SAAS,UAAU,EACrDM,EAAkBN,EAAgB,SAAS,OAAO,EAClDO,EAAoBP,EAAgB,SAAS,iBAAiB,EAEpE,GAAI,CAACK,GAAmB,CAACC,GAAmB,CAACC,EAC3C,OAAO,KAGT,IAAIC,EAA+D,CAAC,EAC9DC,EAAOV,EAAW,MAAM,KAC1BM,GAAoB,aAAcI,GAAU,aAAcA,EAAK,WAC/DD,EAAkBA,EAAgB,OAAQC,EAAyC,SAAS,QAAQ,GAEpGH,GAAoB,UAAWG,GAAU,aAAcA,EAAK,QAC5DD,EAAkBA,EAAgB,OAAQC,EAA6E,MAAM,QAAQ,GAErIF,GAAsB,gBAAiBR,EAAW,OAAUW,EAAsBX,EAAW,MAAM,YAAaK,GAAY,SAAS,GAAG,GAC1II,EAAgB,KAAK,CAAE,YAAaT,EAAW,MAAM,WAAY,CAAC,EAGpE,IAAIY,EAAiC,KAIrC,GAHIH,EAAgB,OAAS,IAC3BG,EAAiBC,GAA4BhB,EAAME,EAAUU,CAAe,GAE1EK,EAAMF,CAAc,EACtB,OAAO,KAET,GAAID,EAAsBd,EAAMkB,EAAwB,EACxD,CAEE,IADuBlB,IAAS,cAAiBM,EAA0BD,GACzD,SAASU,CAAgD,EAEzE,OAAOA,EAET,MAAM,IAAI,MAAM,0BAA2BA,CAAe,gCAAiCf,CAAK,gCAAiCC,CAAgB,GAAG,CACtJ,CACAkB,EAAgBnB,CAAI,CACtB,CCjDO,SAASoB,GACdC,EACAC,EACAC,EACAC,EACAC,EACmC,CACnC,GAAM,CAAE,gBAAAC,CAAgB,EAAIH,EAE5B,GAAIG,EAAgB,SAAW,EAC7B,MAAM,IAAI,MAAM,yDAAyDJ,CAAe,6CAA6C,EAEvI,IAAMK,EAAuBC,GAAgCP,EAAMC,EAAiBC,EAAUE,CAAiB,EAC/G,GAAII,EAASF,CAAoB,EAC/B,OAAOA,EAET,IAAMG,EAAkBC,GAAuBR,CAAQ,EACvD,GAAIG,EAAgB,SAAW,GAAKG,EAASC,CAAe,EAC1D,OAAOA,EAGT,IAAME,EAAwBC,GAA6BZ,EAAMC,EAAiBC,EAAUC,CAAU,EAEtG,GAAIK,EAASG,CAAqB,EAChC,OAAOA,EAET,GAAIH,EAASC,CAAe,EAC1B,OAAOA,EAET,MAAM,IAAI,MAAM,GAAGT,CAAI,iDAAiDC,CAAe,GAAG,CAC5F,CCpCA,IAAMY,GAAcC,GAAS,mBAAmBA,CAAI,EAC/C,QAAQ,uBAAwB,kBAAkB,EAClD,QAAQ,QAAS,MAAM,EACtBC,GAAeC,GACV,mBAAmBA,CAAK,EAAE,QAAQ,2CAA4C,kBAAkB,EAErGC,GAAa,mBACbC,GAAeF,IACbA,EAAM,CAAC,IAAM,MACbA,EAAQA,EAAM,MAAM,EAAG,EAAE,GAEtBA,EAAM,QAAQ,mBAAoB,kBAAkB,GAG/D,SAASG,GAAoBC,EAAY,CAErC,OAAAA,EAAa,OAAO,OAAO,CAAC,EAAGA,CAAU,EACrC,OAAOA,EAAW,SAAY,WAC9BA,EAAW,QAAU,IAAI,KAAK,KAAK,IAAI,EAAIA,EAAW,QAAU,KAAK,GAErEA,EAAW,SAAW,OACtBA,EAAW,QAAUA,EAAW,QAAQ,YAAY,GAEhD,OAAO,QAAQA,CAAU,EAC5B,OAAO,CAAC,CAACC,EAAKL,CAAK,IAAMA,GAAS,MAAQA,IAAU,EAAK,EAQzD,IAAI,CAAC,CAACK,EAAKL,CAAK,IAAMA,IAAU,GAAO,KAAKK,CAAG,GAAK,KAAKA,CAAG,IAAIL,EAAM,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,EACrF,KAAK,EAAE,CAChB,CACA,SAASM,GAAIR,EAAMI,EAAaD,EAAY,CACxC,IAAMM,EAAO,2BACPC,EAAM,CAAC,EACTC,EACJ,MAAQA,EAAQF,EAAK,KAAK,SAAS,MAAM,IAAM,MAC3C,GAAI,CACA,IAAMG,EAAQT,EAAWQ,EAAM,CAAC,CAAC,EAEjC,GADAD,EAAIE,CAAK,EAAIR,EAAYO,EAAM,CAAC,EAAGC,CAAK,EACpCZ,IAASY,EACT,KAER,MACU,CAAE,CAEhB,OAAOZ,GAAQ,KAAOU,EAAIV,CAAI,EAAIU,CACtC,CACA,IAAMG,GAAgB,OAAO,OAAO,CAChC,WAAYV,GACZ,YAAaC,GACb,WAAYL,GACZ,YAAaE,EACjB,CAAC,EACKa,GAAqB,OAAO,OAAO,CACrC,KAAM,GACV,CAAC,EACD,SAASC,GAAUf,EAAME,EAAOI,EAAaQ,GAAoB,CAAE,YAAaE,EAAgBf,GAAa,WAAYgB,EAAelB,EAAW,EAAI,CAAC,EAAG,CACvJ,OAAQ,SAAS,OAAS,GAAGkB,EAAajB,CAAI,CAAC,IAAIgB,EAAcd,EAAOF,CAAI,CAAC,GAAGK,GAAoBC,CAAU,CAAC,EACnH,CACA,SAASY,GAAUlB,EAAM,CAAE,YAAamB,EAAgBf,GAAa,WAAYgB,EAAejB,EAAW,EAAI,CAAC,EAAG,CAC/G,OAAOK,GAAIR,EAAMmB,EAAeC,CAAY,CAChD,CACA,SAASC,GAAW,CAAE,YAAaF,EAAgBf,GAAa,WAAYgB,EAAejB,EAAW,EAAI,CAAC,EAAG,CAC1G,OAAOK,GAAI,OAAWW,EAAeC,CAAY,CACrD,CACA,SAASE,GAAatB,EAAMM,EAAaQ,GAAoB,CACzDC,GAAUf,EAAM,GAAI,OAAO,OAAO,CAAC,EAAGM,EAAY,CAC9C,QAAS,EACb,CAAC,CAAC,CACN,CAEA,SAASiB,GAAKC,EAAWC,EAAmB,CACxC,IAAMC,EAAM,CACR,IAAK,SAAU1B,EAAME,EAAOI,EAAY,CACpC,OAAOS,GAAUf,EAAME,EAAO,OAAO,OAAO,CAAC,EAAG,KAAK,WAAYI,CAAU,EAAG,CAC1E,YAAa,KAAK,UAAU,KAChC,CAAC,CACL,EACA,IAAK,SAAUN,EAAM,CACjB,GAAI,UAAU,SAAW,EACrB,OAAOqB,GAAW,KAAK,UAAU,IAAI,EAEzC,GAAIrB,GAAQ,KAGZ,OAAOkB,GAAUlB,EAAM,KAAK,UAAU,IAAI,CAC9C,EACA,OAAQ,SAAUA,EAAMM,EAAY,CAChCgB,GAAatB,EAAM,OAAO,OAAO,CAAC,EAAG,KAAK,WAAYM,CAAU,CAAC,CACrE,EACA,eAAgB,SAAUA,EAAY,CAClC,OAAOiB,GAAK,KAAK,UAAW,OAAO,OAAO,CAAC,EAAG,KAAK,WAAYjB,CAAU,CAAC,CAC9E,EACA,cAAe,SAAUkB,EAAW,CAChC,OAAOD,GAAK,OAAO,OAAO,CAAC,EAAG,KAAK,UAAWC,CAAS,EAAG,KAAK,UAAU,CAC7E,CACJ,EACMG,EAAS,CACX,WAAY,CAAE,MAAO,OAAO,OAAOF,CAAiB,CAAE,EACtD,UAAW,CAAE,MAAO,OAAO,OAAOD,CAAS,CAAE,CACjD,EACA,OAAO,OAAO,OAAOE,EAAKC,CAAM,CACpC,CACA,IAAIC,GAASL,GAAK,CAAE,KAAMV,GAAc,YAAa,MAAOA,GAAc,WAAY,EAAGC,EAAkB,ECzG3G,IAAMe,GAA4B,iBACrBC,GAA+B,CAC1C,IAAI,aAAsC,CACxC,IAAMC,EAAMC,GAAUH,EAAyB,EAC/C,OAAOI,EAASF,CAAG,GAAKG,GAAY,WAAW,SAASH,CAA6B,EAChFA,EACD,WACN,EACA,IAAI,YAAYI,EAA+B,CAC7C,GAAI,KAAK,cAAgB,YAGrBF,EAASE,CAAK,GAAKD,GAAY,WAAW,SAASC,CAAK,EAAG,CAC7D,IAAIC,EAAS,OAAO,SAAS,SACzBA,EAAO,SAAS,oBAAoB,IAAM,KACxCA,IAAW,aACbC,GAAe,KACb,mCAAmCR,EAAyB,aAAaO,CAAM,GACjF,EAEFA,EAAS,IAEXE,GAAUT,GAA2BM,EAAO,CAC1C,GAAIC,IAAW,GAAK,CAAC,EAAI,CAAE,OAAAA,CAAO,EAClC,QAAS,GACT,SAAU,SACV,KAAM,GACR,CAAC,CACH,CACF,CACF,EC9BA,SAASG,GAGP,CACA,iBAAAC,EACA,mBAAAC,EACA,oBAAqBC,CACvB,EAKA,CAEE,GAAID,IAAuB,SACzB,MAAO,SAET,GAAIE,EAAsBF,EAAoBG,GAAY,UAAU,EAClE,OAAQJ,EAAkB,CACxB,IAAK,YACH,OAAOC,EACT,IAAK,cACH,OAAQA,IAAuB,cAAgB,cAAgBA,EACjE,IAAK,WACH,MAAO,cACT,QAASI,EAAgBL,CAAgB,CAC3C,CAEFK,EAAgBJ,CAAkB,CACpC,CAEO,SAASK,GAAqI,CACnJ,KAAMC,EACN,mBAAAN,EACA,sBAAAO,EACA,oBAAAC,EACA,uBAAAC,CACF,EAOA,CAEE,GADyBC,EAAQH,CAAqB,IAAM,IACpCC,EAAoB,SAAS,aAA6B,EAAG,CACnF,IAAMT,EAAmBW,EAAQD,CAAsB,EACvD,OAAOX,GAAmC,CAAE,iBAAAC,EAAkB,mBAAAC,EAAoB,oBAAAQ,CAAoB,CAAC,CACzG,CACA,OAAOR,CACT,CC5BA,IAAMW,GAA8BC,EAAuD,CACzF,8BAA+B,gCAC/B,iCAAkC,mCAClC,gBAAiB,kBACjB,0BAA2B,4BAC3B,0BAA2B,2BAC7B,CAAC,EAMM,SAASC,GAAgBC,EAA4B,CAC1D,GAAIC,EAA2BJ,EAA2B,EACxD,OAGF,GAAM,CAAE,gBAAAK,EAAiB,WAAAC,EAAY,kBAAAC,CAAkB,EAAIJ,EAGrD,CAAE,aAAAK,CAAa,EAAIC,EAAgB,CAAE,YAAa,iBAAkB,CAAC,EACrE,CAAE,oBAAAC,EAAqB,wBAAAC,CAAwB,EAAIH,EAEnDI,EAAgCC,GAAsB,cAAeR,EAAiBG,EAAcF,EAAYC,CAAiB,EACjIO,EAAmCD,GAAsB,iBAAkBR,EAAiBG,EAAcF,EAAYC,CAAiB,EAE7I,GAAIQ,EAAMH,CAA6B,GAAKF,EAAoB,SAASI,CAAgC,IAAM,GAC7G,MAAM,IAAI,MAAM,yBAAyBA,CAAgC,iDAAkDJ,EAAqB,SAAS,CAAC,GAAG,EAE/J,GAAM,CAAE,sBAAAM,CAAsB,EAAIC,GAA4B,CAAE,YAAa,iBAAkB,CAAC,EAC1FC,EAAyBC,EAAS,IAAM,CAC5C,GAAIR,EAAwB,WAAaK,EAAsB,QAAU,GAAM,CAC7E,IAAMI,EAAoBC,GAA6B,YACvD,OAAQD,EAAmB,CACzB,IAAK,YAAa,MAAO,YACzB,IAAK,WAAY,OAAOE,EAAsB,WAAYZ,CAAmB,EAAG,WAAa,YAC7F,IAAK,cAAe,OAAOY,EAAsB,cAAeZ,CAAmB,EAAI,cAAgB,YACvG,QAASa,EAAgBH,CAAiB,CAC5C,CACF,CACA,MAAO,WACT,CAAC,EAED,SAASI,EAA0BC,EAA2C,CACxEd,EAAwB,YAAce,GAAY,WAAW,SAASD,CAAiB,IACzFJ,GAA6B,YAAcI,EAE/C,CACA,IAAME,EAAgCR,EAAkC,IAC/DS,GAAgC,CACrC,KAAM,cACN,mBAAoBhB,EACpB,sBAAAI,EACA,oBAAAN,EACA,uBAAwBQ,CAC1B,CAAC,CACF,EAEKW,EAAmCV,EAAqC,IACrES,GAAgC,CACrC,KAAM,iBACN,mBAAoBd,EACpB,sBAAAE,EACA,oBAAAN,EACA,uBAAwBQ,CAC1B,CAAC,CACF,EAEDY,EAAQ9B,GAA4B,8BAA+B2B,CAA6B,EAChGG,EAAQ9B,GAA4B,iCAAkC6B,CAAgC,EACtGC,EAAQ9B,GAA4B,gBAAiBY,CAA6B,EAClFkB,EAAQ9B,GAA4B,0BAA2Bc,CAAgC,EAC/FgB,EAAQ9B,GAA4B,0BAA2BwB,CAAyB,CAC1F,CAEO,SAASO,EAAoG,CAAE,YAAAC,CAAY,EAA0C,CAAC,EAAG,CAC9K,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,CAAE,YAAa,gBAAiB,CAAC,EAClE,GAAI,CACFF,IAAgB,iBAChB,IAAMG,EAAgBnC,GAChB2B,EAAgCS,EAAuBD,EAAc,6BAA6B,EAClGN,EAAmCO,EAAuBD,EAAc,gCAAgC,EACxGE,EAAkBD,EAAuBD,EAAc,eAAe,EACtEG,EAA4BF,EAAuBD,EAAc,yBAAyB,EAC1FX,EAA4BY,EAAuBD,EAAc,yBAAyB,EAChG,MAAO,CAAE,8BAAAR,EAA+B,iCAAAE,EAAkC,gBAAAQ,EAAiB,0BAAAC,EAA2B,0BAAAd,CAA0B,CAClJ,OACOe,EAAK,CACV,MAAAN,EAAO,MAAM,uBAAuBD,GAAe,SAAS,EAAE,EACxDO,CACR,CACF,CCvHA,IAAIC,GAAS,GCYb,SAASC,GAAoBC,EAAQC,EAAI,CACvC,IAAIC,EACAC,EACAC,EACEC,EAAQC,EAAI,EAAI,EAChBC,EAAS,IAAM,CACnBF,EAAM,MAAQ,GACdD,EAAQ,CACV,EACAI,EAAMR,EAAQO,EAAQ,CAAE,MAAO,MAAO,CAAC,EACvC,IAAME,EAAM,OAAOR,GAAO,WAAaA,EAAKA,EAAG,IACzCS,EAAM,OAAOT,GAAO,WAAa,OAASA,EAAG,IAC7CU,EAASC,GAAU,CAACC,EAAQC,KAChCX,EAAQU,EACRT,EAAUU,EACH,CACL,KAAM,CACJ,OAAIT,EAAM,QACRH,EAAIO,EAAI,EACRJ,EAAM,MAAQ,IAEhBF,EAAM,EACCD,CACT,EACA,IAAIa,EAAI,CACiBL,IAAIK,CAAE,CAC/B,CACF,EACD,EACD,OAAI,OAAO,aAAaJ,CAAM,IAC5BA,EAAO,QAAUJ,GACZI,CACT,CAEA,SAASK,GAAkBf,EAAI,CAC7B,OAAIgB,GAAgB,GAClBC,GAAejB,CAAE,EACV,IAEF,EACT,CAEA,SAASkB,IAAkB,CACzB,IAAMC,EAAsB,IAAI,IAC1BC,EAAOpB,GAAO,CAClBmB,EAAI,OAAOnB,CAAE,CACf,EAYA,MAAO,CACL,GAZUA,GAAO,CACjBmB,EAAI,IAAInB,CAAE,EACV,IAAMqB,EAAQ,IAAMD,EAAIpB,CAAE,EAC1B,OAAAe,GAAkBM,CAAK,EAChB,CACL,IAAKA,CACP,CACF,EAME,IAAAD,EACA,QANc,IAAIE,IACX,QAAQ,IAAI,MAAM,KAAKH,CAAG,EAAE,IAAKnB,GAAOA,EAAG,GAAGsB,CAAI,CAAC,CAAC,CAM7D,CACF,CAoIA,SAASC,GAAQC,EAAG,CAClB,OAAO,OAAOA,GAAM,WAAaA,EAAE,EAAIC,GAAMD,CAAC,CAChD,CA4EA,IAAME,GAAW,OAAO,OAAW,KAAe,OAAO,SAAa,IAChEC,GAAW,OAAO,kBAAsB,KAAe,sBAAsB,kBAC7EC,GAASC,GAAQ,OAAOA,EAAQ,IAChCC,GAAcD,GAAQA,GAAO,KAKnC,IAAME,GAAW,OAAO,UAAU,SAC5BC,GAAYC,GAAQF,GAAS,KAAKE,CAAG,IAAM,kBAIjD,IAAMC,GAAO,IAAM,CACnB,EA4IA,SAASC,GAAoBC,EAAI,CAC/B,IAAMC,EAAwB,OAAO,OAAO,IAAI,EAChD,OAAQC,GACMD,EAAMC,CAAG,IACND,EAAMC,CAAG,EAAIF,EAAGE,CAAG,EAEtC,CACA,IAAMC,GAAc,aACdC,GAAYL,GAAqBG,GAAQA,EAAI,QAAQC,GAAa,KAAK,EAAE,YAAY,CAAC,EACtFE,GAAa,SACbC,GAAWP,GAAqBG,GAC7BA,EAAI,QAAQG,GAAY,CAACE,EAAGC,IAAMA,EAAIA,EAAE,YAAY,EAAI,EAAE,CAClE,EA0HD,SAASC,GAAWC,EAAQC,EAAc,CACxC,OAAOC,EAAS,CACd,KAAM,CACJ,IAAIC,EACJ,OAAQA,EAAKH,EAAO,QAAU,KAAOG,EAAKF,CAC5C,EACA,IAAIG,EAAO,CACTJ,EAAO,MAAQI,CACjB,CACF,CAAC,CACH,CCvZA,SAASC,GAAaC,EAAO,CAC3B,IAAIC,EACJ,IAAMC,EAAQC,GAAQH,CAAK,EAC3B,OAAQC,EAA8BC,GAAM,MAAQ,KAAOD,EAAKC,CAClE,CAEA,IAAME,GAAgBC,GAAW,OAAS,OACpCC,GAAkBD,GAAW,OAAO,SAAW,OAC/CE,GAAmBF,GAAW,OAAO,UAAY,OACjDG,GAAkBH,GAAW,OAAO,SAAW,OAErD,SAASI,MAAoBC,EAAM,CACjC,IAAIC,EACAC,EACAC,EACAC,EAOJ,GANI,OAAOJ,EAAK,CAAC,GAAM,UAAY,MAAM,QAAQA,EAAK,CAAC,CAAC,GACtD,CAACE,EAAQC,EAAWC,CAAO,EAAIJ,EAC/BC,EAASP,IAET,CAACO,EAAQC,EAAQC,EAAWC,CAAO,EAAIJ,EAErC,CAACC,EACH,OAAOI,GACJ,MAAM,QAAQH,CAAM,IACvBA,EAAS,CAACA,CAAM,GACb,MAAM,QAAQC,CAAS,IAC1BA,EAAY,CAACA,CAAS,GACxB,IAAMG,EAAW,CAAC,EACZC,EAAU,IAAM,CACpBD,EAAS,QAASE,GAAOA,EAAG,CAAC,EAC7BF,EAAS,OAAS,CACpB,EACMG,EAAW,CAACC,EAAIC,EAAOC,EAAUC,KACrCH,EAAG,iBAAiBC,EAAOC,EAAUC,CAAQ,EACtC,IAAMH,EAAG,oBAAoBC,EAAOC,EAAUC,CAAQ,GAEzDC,EAAYC,EAChB,IAAM,CAAC1B,GAAaY,CAAM,EAAGR,GAAQW,CAAO,CAAC,EAC7C,CAAC,CAACM,EAAIG,CAAQ,IAAM,CAElB,GADAN,EAAQ,EACJ,CAACG,EACH,OACF,IAAMM,EAAeC,GAASJ,CAAQ,EAAI,CAAE,GAAGA,CAAS,EAAIA,EAC5DP,EAAS,KACP,GAAGJ,EAAO,QAASS,GACVR,EAAU,IAAKS,GAAaH,EAASC,EAAIC,EAAOC,EAAUI,CAAY,CAAC,CAC/E,CACH,CACF,EACA,CAAE,UAAW,GAAM,MAAO,MAAO,CACnC,EACME,EAAO,IAAM,CACjBJ,EAAU,EACVP,EAAQ,CACV,EACA,OAAAY,GAAkBD,CAAI,EACfA,CACT,CA+PA,SAASE,IAAa,CACpB,IAAMC,EAAYC,EAAI,EAAK,EACrBC,EAAWC,GAAmB,EACpC,OAAID,GACFE,GAAU,IAAM,CACdJ,EAAU,MAAQ,EACpB,EAAGK,GAAS,OAASH,CAAQ,EAExBF,CACT,CAEA,SAASM,GAAaC,EAAU,CAC9B,IAAMP,EAAYD,GAAW,EAC7B,OAAOS,EAAS,KACdR,EAAU,MACH,EAAQO,EAAS,EACzB,CACH,CAEA,SAASE,GAAoBC,EAAQH,EAAUI,EAAU,CAAC,EAAG,CAC3D,GAAM,CAAE,OAAAC,EAASC,GAAe,GAAGC,CAAgB,EAAIH,EACnDI,EACEC,EAAcV,GAAa,IAAMM,GAAU,qBAAsBA,CAAM,EACvEK,EAAU,IAAM,CAChBF,IACFA,EAAS,WAAW,EACpBA,EAAW,OAEf,EACMG,EAAUV,EAAS,IAAM,CAC7B,IAAMW,EAAQC,GAAQV,CAAM,EACtBW,GAAS,MAAM,QAAQF,CAAK,EAAIA,EAAQ,CAACA,CAAK,GAAG,IAAIG,EAAY,EAAE,OAAOC,EAAU,EAC1F,OAAO,IAAI,IAAIF,CAAK,CACtB,CAAC,EACKG,EAAYC,EAChB,IAAMP,EAAQ,MACbQ,GAAa,CACZT,EAAQ,EACJD,EAAY,OAASU,EAAS,OAChCX,EAAW,IAAI,iBAAiBR,CAAQ,EACxCmB,EAAS,QAASC,GAAOZ,EAAS,QAAQY,EAAIb,CAAe,CAAC,EAElE,EACA,CAAE,UAAW,GAAM,MAAO,MAAO,CACnC,EACMc,EAAc,IACiBb,GAAS,YAAY,EAEpDc,EAAO,IAAM,CACjBZ,EAAQ,EACRO,EAAU,CACZ,EACA,OAAAM,GAAkBD,CAAI,EACf,CACL,YAAAb,EACA,KAAAa,EACA,YAAAD,CACF,CACF,CAEA,SAASG,GAAiBpB,EAAU,CAAC,EAAG,CACtC,IAAIqB,EACJ,GAAM,CACJ,OAAApB,EAASC,GACT,KAAAoB,EAAO,GACP,iBAAAC,EAAmB,EACrB,EAAIvB,EACEwB,GAAYH,EAAKrB,EAAQ,WAAa,KAAOqB,EAA+BpB,GAAO,SACnFwB,EAAuB,IAAM,CACjC,IAAIC,EACJ,IAAIC,EAAsCH,GAAS,cACnD,GAAIF,EACF,KAAkCK,GAAQ,YACxCA,GAAWD,EAAiCC,GAAQ,aAAe,KAAO,OAASD,EAAI,cAE3F,OAAOC,CACT,EACMC,EAAgBtC,EAAI,EACpBuC,EAAU,IAAM,CACpBD,EAAc,MAAQH,EAAqB,CAC7C,EACA,OAAIxB,IACF6B,GAAiB7B,EAAQ,OAAS8B,GAAU,CACtCA,EAAM,gBAAkB,MAE5BF,EAAQ,CACV,EAAG,EAAI,EACPC,GAAiB7B,EAAQ,QAAS4B,EAAS,EAAI,GAE7CN,GACFzB,GAAoB0B,EAAWQ,GAAc,CAC3CA,EAAU,OAAQC,GAAMA,EAAE,aAAa,MAAM,EAAE,IAAKC,GAAM,MAAM,KAAKA,EAAE,YAAY,CAAC,EAAE,KAAK,EAAE,QAASC,GAAS,CACzGA,IAASP,EAAc,OACzBC,EAAQ,CACZ,CAAC,CACH,EAAG,CACD,UAAW,GACX,QAAS,EACX,CAAC,EAEHA,EAAQ,EACDD,CACT,CA0+BA,SAASQ,GAAYC,EAAQ,CAC3B,OAAO,KAAK,MAAM,KAAK,UAAUA,CAAM,CAAC,CAC1C,CAu/IA,IAAMC,GAAgB,CACpB,CAAE,IAAK,IAAK,MAAO,IAAK,KAAM,QAAS,EACvC,CAAE,IAAK,MAAO,MAAO,IAAK,KAAM,QAAS,EACzC,CAAE,IAAK,KAAM,MAAO,KAAM,KAAM,MAAO,EACvC,CAAE,IAAK,OAAQ,MAAO,MAAO,KAAM,KAAM,EACzC,CAAE,IAAK,QAAS,MAAO,OAAQ,KAAM,MAAO,EAC5C,CAAE,IAAK,QAAS,MAAO,OAAQ,KAAM,OAAQ,EAC7C,CAAE,IAAK,OAAO,kBAAmB,MAAO,QAAS,KAAM,MAAO,CAChE,EAmeA,SAASC,GAAUC,EAAOC,EAAKC,EAAMC,EAAU,CAAC,EAAG,CACjD,IAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EACpB,GAAM,CACJ,MAAAC,EAAQ,GACR,QAAAC,EAAU,GACV,UAAAC,EACA,KAAAC,EAAO,GACP,aAAAC,EACA,WAAAC,CACF,EAAIX,EACEY,EAAKC,GAAmB,EACxBC,EAAQf,GAA+Ba,GAAG,QAAWX,EAA2BW,GAAG,QAAU,KAAO,OAASX,EAAG,KAAKW,CAAE,MAAQT,GAAMD,EAA2BU,GAAG,QAAU,KAAO,OAASV,EAAG,QAAU,KAAO,OAASC,EAAG,KAA2BS,GAAG,KAAK,GAClQG,EAAQP,EACZ,GAAI,CAACV,EACH,GAAIkB,GAAQ,CACV,IAAMC,GAAgBZ,GAAMD,EAA2BQ,GAAG,QAAU,KAAO,OAASR,EAAG,WAAa,KAAO,OAASC,EAAG,MACvHP,EAAuCmB,GAAa,OAAU,QACzDT,IACHO,EAAyCE,GAAa,OAAU,QACpE,MACEnB,EAAM,aAGViB,EAAQA,GAAS,UAAUjB,EAAI,SAAS,CAAC,GACzC,IAAMoB,EAAWC,GAASb,EAAc,OAAOA,GAAU,WAAaA,EAAMa,CAAG,EAAIC,GAAYD,CAAG,EAAhEA,EAC5BE,GAAW,IAAMC,GAAMzB,EAAMC,CAAG,CAAC,EAAIoB,EAAQrB,EAAMC,CAAG,CAAC,EAAIY,EAC3Da,EAAeC,GAAU,CACzBb,EACEA,EAAWa,CAAK,GAClBV,EAAMC,EAAOS,CAAK,EAEpBV,EAAMC,EAAOS,CAAK,CAEtB,EACA,GAAIjB,EAAS,CACX,IAAMkB,EAAeJ,GAAS,EACxBK,EAAQC,EAAIF,CAAY,EAC1BG,EAAa,GACjB,OAAAC,EACE,IAAMhC,EAAMC,CAAG,EACdgC,IAAM,CACAF,IACHA,EAAa,GACbF,EAAM,MAAQR,EAAQY,EAAC,EACvBC,GAAS,IAAMH,EAAa,EAAK,EAErC,CACF,EACAC,EACEH,EACCI,IAAM,CACD,CAACF,IAAeE,KAAMjC,EAAMC,CAAG,GAAKW,IACtCc,EAAYO,EAAC,CACjB,EACA,CAAE,KAAArB,CAAK,CACT,EACOiB,CACT,KACE,QAAOM,EAAS,CACd,KAAM,CACJ,OAAOX,GAAS,CAClB,EACA,IAAIG,EAAO,CACTD,EAAYC,CAAK,CACnB,CACF,CAAC,CAEL,CCtiNA,IAAMS,GAAmCC,EAA4D,CACnG,mBAAoB,qBACpB,QAAS,UACT,SAAU,UACZ,CAAC,EAEM,SAASC,IAAwB,CACtC,GAAIC,EAA2BH,EAAgC,EAC7D,OAEF,IAAMI,EAAeC,GAAmD,EAClEC,EAAQD,GAA4C,EACpDE,EAAuBF,GAA2D,EAClFG,EAA0BH,GAA8D,EACxFI,EAAoBJ,GAAsF,EAC1GK,EAASL,GAA6C,EACtDM,EAAYN,GAA2F,EACvGO,EAAcP,GAAkD,EAChEQ,EAAkBR,GAAsD,EAExES,EAAiC,OAAO,OAAO,CACnD,aAAAV,EACA,MAAAE,EACA,qBAAAC,EACA,wBAAAC,EACA,kBAAAC,EACA,OAAAC,EACA,UAAAC,EACA,YAAAC,EACA,gBAAAC,CACF,CAAC,EAEK,CAAE,OAAAE,CAAO,EAAIC,EAAc,EAE3BC,EAA2D,CAC/DC,EACAC,KAGAJ,EAAO,MAAM,oBAAoBG,CAAS,gBAAgBC,EAAS,SAAS,CAAC,EAAE,EACxEL,EAAeI,CAAS,EAAE,GAAGC,CAAe,GAG/CC,EAA6D,CACjEF,EACAC,KAGAJ,EAAO,MAAM,qBAAqBG,CAAS,gBAAgBC,EAAS,SAAS,CAAC,EAAE,EACzEL,EAAeI,CAAS,EAAE,IAAIC,CAAe,GAGtDE,EAAQrB,GAAiC,mBAAoBc,CAAc,EAE3EO,EAAQrB,GAAiC,QAASiB,CAAO,EACzDI,EAAQrB,GAAiC,SAAUoB,CAAQ,CAC7D,CAEO,SAASE,EAAc,CAAE,YAAAC,CAAY,EAA0C,CAAC,EAAG,CACxF,GAAM,CAAE,OAAAR,CAAO,EAAIC,EAAc,EACjC,GAAI,CACFO,IAAgB,gBAChB,IAAMC,EAAqBC,EAAuBzB,GAAiC,kBAAkB,EAC/FiB,EAAUQ,EAAuBzB,GAAiC,OAAO,EACzEoB,EAAWK,EAAuBzB,GAAiC,QAAQ,EACjF,OAAO,OAAO,OAAO,CAAE,GAAGwB,EAAoB,QAAAP,EAAS,SAAAG,CAAS,CAAC,CACnE,OACOM,EAAK,CACV,MAAAX,EAAO,MAAM,uBAAuBQ,GAAe,SAAS,EAAE,EACxDG,CACR,CACF,CCjHA,IAAMC,GAAyCC,EAAkE,CAC/G,uBAAwB,yBACxB,0BAA2B,2BAC7B,CAAC,EAGM,SAASC,IAChB,CACE,GAAIC,EAA2BH,EAAsC,EACnE,OAEF,IAAMI,EAAyBC,EAA2B,IAAI,EACxDC,EAA6BC,GAA4B,CAC7DH,EAAuB,MAAQG,CACjC,EACAC,EAAQR,GAAuC,uBAAwB,IAAMI,EAAuB,KAAK,EACzGI,EAAQR,GAAuC,0BAA2BM,CAAyB,CACrG,CAEO,IAAMG,GAA4B,CAAC,CAAE,YAAAC,CAAY,EAA0C,CAAC,IAAM,CACvG,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,EACjC,GAAI,CACF,IAAMR,EAAyBS,EAAuBb,GAAuC,sBAAsB,EAC7GM,EAA4BO,EAAuBb,GAAuC,yBAAyB,EACzH,MAAO,CAAC,uBAAAI,EAAwB,0BAAAE,CAAyB,CAC3D,OACOQ,EAAK,CACV,MAAAH,EAAO,MAAM,uBAAuBD,GAAe,SAAS,EAAE,EACxDI,CACR,CACF,ECZA,IAAMC,GAAgBC,GAAiB,EAevC,SAASC,GAAqBC,EAA8BC,EAA0BC,EAAmBC,EAAmC,CAC1I,OAAKC,GAA0BH,CAAW,EAIrCD,EAAY,SAASC,CAAW,EAKjCA,EAAY,aAAa,gCAAgC,IAAMC,GACjEC,EAAyB,MAAM,gDAAiD,CAAE,YAAAH,EAAa,YAAAC,EAAa,UAAAC,CAAU,CAAC,EAChH,IAEAD,EAAY,KAAOC,GAC1BC,EAAyB,MAAM,yCAA0C,CAAE,YAAAH,EAAa,YAAAC,EAAa,UAAAC,CAAU,CAAC,EACzG,IAEAD,EAAY,OAASC,GAC5BC,EAAyB,MAAM,2CAA4C,CAAE,YAAAH,EAAa,YAAAC,EAAa,UAAAC,CAAU,CAAC,EAC3G,KAGPC,EAAyB,MAAM,sDAAuD,CAAE,YAAAH,EAAa,YAAAC,EAAa,UAAAC,CAAU,CAAC,EACtH,KAlBPC,EAAyB,MAAM,oEAAqE,CAAE,YAAAH,EAAa,YAAAC,EAAa,UAAAC,CAAU,CAAC,EACpI,KALPC,EAAyB,MAAM,uDAAwD,CAAE,YAAAH,EAAa,YAAAC,EAAa,UAAAC,CAAU,CAAC,EACvH,GAuBX,CAYA,SAASG,GAAgD,CACvD,YAAAL,EACA,WAAAM,EACA,UAAAJ,EACA,SAAAK,EACA,UAAAC,EACA,OAAAC,CACF,EAAqD,CACnD,GAAIC,GAAWJ,CAAU,IAAM,GAC7B,MAAM,IAAI,MAAM,4BAA4B,EAG9C,IAAMK,EAAaC,EAAS,IACnBN,EAAWJ,CAAS,CAC5B,EAEKC,EAA2BM,EAAO,SAAS,CAAE,aAAgB,aAAc,CAAC,EAC5EI,EAASD,EAAS,IAAM,CAC5B,IAAME,EAASC,EAAQf,CAAW,EAClC,OAAIgB,EAAMnB,GAAc,KAAK,GAAKmB,EAAMF,CAAM,EACrC,GAEFf,GAAqBe,EAAQjB,GAAc,MAAOK,EAAWC,CAAwB,CAC9F,CAAC,EAEKc,EAAUC,EAAa,EAAK,EAElCC,EACE,IAAMN,EAAO,MACZO,GAAa,CACRA,IACFH,EAAQ,MAAQ,GAEpB,CACF,EAEAE,EACE,IAAMR,EAAW,MACjB,CAACU,EAAOC,IAAc,CAChBD,IAAUC,IACZL,EAAQ,MAAQ,GAEpB,CACF,EAEA,IAAMM,EAAUX,EAAS,IAErBI,EAAML,EAAW,KAAK,GACrBa,EAASb,EAAW,KAAK,GAAKA,EAAW,MAAM,KAAK,IAAM,EAE9D,EAEKc,EAAmBb,EAAS,IACxBG,EAAQR,CAAQ,IAAM,IAAQgB,EAAQ,KAC/C,EAEKG,EAAcC,GAAMnB,CAAS,EAC7BoB,EAAkBhB,EAA2B,IAC9CiB,GAAWH,CAAW,EACGA,EAAYf,EAAW,KAAK,EAGjD,CAAE,QAAS,EAAK,CACxB,EAEKmB,EAAoBlB,EAAkB,IACnC,CAACgB,EAAgB,MAAM,OAC/B,EAEKG,EAAWnB,EAAS,IACjBa,EAAiB,OAASK,EAAkB,KACpD,EAEKE,EAAoCpB,EAAS,IAC7CmB,EAAS,QAAU,GACd,GAGNd,EAAQ,MACF,GAEHa,EAAkB,MAGb,GAFAP,EAAQ,QAAU,EAK9B,EAEKU,EAAkCrB,EAAS,IAC3CC,EAAO,QAAU,GACZ,GAEFmB,EAAkC,KAC1C,EACKE,EAA4BhB,EAAa,EAAK,EAEpDC,EACE,IAAMc,EAAgC,MACtC,CAACE,EAA2BC,IAA2B,CACrDF,EAA0B,MAAQE,CACpC,CACF,EAEA,IAAMC,GAA0CzB,EAAS,IAGnDC,EAAO,QAAU,IAAQqB,EAA0B,QAAU,GACxDF,EAAkC,MAIlCC,EAAgC,KAE1C,EAEKK,EAAO1B,EAAS,IAChBmB,EAAS,QAAU,IAAShB,EAAQR,CAAQ,IAAM,GAC7C,GAEAwB,EAAS,QAAU,EAE7B,EAYD,OAAOQ,EAAS,CACd,WAAA5B,EACA,UAAAT,EACA,SAAAK,EACA,OAAAM,EACA,KAAAyB,EACA,QAAAf,EACA,SAAAQ,EACA,0BAAAG,EACA,gBAAAN,EACA,iBAAAH,EACA,kCAAAO,EACA,gCAAAC,EACA,wCAAAI,GACA,QAAApB,EACA,UAAWoB,EACb,CAAC,CACH,CAmBA,IAAMG,GAA6BC,EAAsD,CACvF,YAAa,cACb,eAAgB,iBAChB,6BAA8B,8BAChC,CAAC,EAGM,SAASC,IAAiB,CAC/B,GAAIC,EAA2BH,EAA0B,EACvD,OAEF,GAAM,CAAE,OAAA/B,CAAO,EAAImC,EAAc,EAE3BC,EAAcN,EAAS,CAAC,CAA+B,EAEvD,CAAE,uBAAAO,CAAuB,EAAIC,GAA0B,CAAE,YAAa,kBAAmB,CAAC,EAChG,SAASC,EAIPC,EACAC,EAEF,CACE,IAAIC,EACJ,GAAIzC,GAAWuC,CAAW,EACxBE,EAAsBF,MAEnB,CACH,GAAM,CAAE,8BAAAG,CAA8B,EAAIC,EAAe,CACvD,YAAa,eACf,CAAC,EACD,GAAID,EAA8B,QAAU,cAC1CD,EAAsBZ,EAAUU,GAAe,CAAC,CAAwC,MAExF,OAAM,IAAI,MAAM,6BAA6B,CAEjD,CAEA,QAAWK,KAAO,OAAO,KAAKT,CAAW,EACvC,OAAOA,EAAYS,CAAG,EAGxB,IAAMC,EAAoB,OAAO,KAC/BL,CACF,EAEA,QAAWM,KAASD,EAClBV,EAAYW,CAAK,EAAInD,GAAc,CACjC,OAAAI,EACA,YAAaqC,EACb,WAAYK,EACZ,UAAWK,EACX,GAAGN,EAAkBM,CAAK,CAC5B,CAAC,CAEL,CAEA,SAASC,EAA6BC,EAA4C,CAChF,IAAMC,EAAkB/C,EAAS,IACxB,OAAO,KAAK8C,CAAc,CAClC,EACKE,EAAiBhD,EAAS,IACvB+C,EAAgB,MACpB,IAAIL,GAAOI,EAAeJ,CAAG,EAAE,MAAM,EACrC,OAAOO,GAAKA,IAAM,EAAI,EACtB,OAAS,CACb,EACK,CAAE,qBAAAC,CAAqB,EAAIC,EAAc,CAAE,YAAa,iBAAkB,CAAC,EAC3EC,EAAgB7C,EAAM,IAAMyC,EAAe,MAAQK,GAAc,CACjEA,IACFD,EAAc,EACdF,EAAqB,QAAQ,CAAE,UAAW,sBAAuB,CAAC,EAAE,MAAOI,GAAKzD,EAAO,MAAMyD,CAAC,CAAC,EAEnG,CAAC,CACH,CAEAT,EAA6BZ,CAAW,EAExCsB,EAAQ3B,GAA2B,YAAaK,CAAW,EAC3DsB,EAAQ3B,GAA2B,eAAgBQ,CAAc,EACjEmB,EAAQ3B,GAA2B,6BAA8BiB,CAA4B,CAC/F,CACO,SAASW,GAAiD,CAAE,YAAAC,CAAY,EAA0C,CAAC,EAAG,CAC3H,GAAM,CAAE,OAAA5D,CAAO,EAAImC,EAAc,CAAE,YAAa,eAAgB,CAAC,EACjE,GAAI,CACF,IAAMC,EAAcyB,EAClB9B,GAA2B,WAC7B,EACMQ,EAAiBsB,EACrB9B,GAA2B,cAC7B,EAEA,MAAO,CAAE,YAAAK,EAAa,eAAAG,CAAe,CACvC,OACOuB,EAAK,CACV,MAAA9D,EAAO,MAAM,uBAAuB4D,GAAe,SAAS,EAAE,EACxDE,CACR,CACF,CC/UO,SAASC,GAAiD,CAAE,YAAAC,CAAY,EAA0C,CAAC,EAAG,CAC3H,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,EACjC,GAAI,CACFF,IAAgB,iBAChB,GAAM,CAAE,YAAAG,CAAY,EAAIC,GAAiC,CAAE,YAAAJ,CAAY,CAAC,EAElEK,EAAoBC,EAAS,IAC1B,OAAO,KAAKH,CAAW,CAC/B,EAEKI,EAAsB,IAAM,CAChCF,EAAkB,MAAM,QAASG,GAAQ,CACvCL,EAAYK,CAAG,EAAE,QAAU,EAC7B,CAAC,CACH,EAEMC,EAAiBH,EAA8B,IAE5CD,EAAkB,MAAM,OAAQK,GAAMP,EAAYO,CAAC,EAAE,QAAQ,CACrE,EACKC,EAAaL,EAA8B,IAExCD,EAAkB,MAAM,OAAQK,GAAMP,EAAYO,CAAC,EAAE,IAAI,CACjE,EAEKE,EAAmBN,EAA8B,IAE9CD,EAAkB,MAAM,OAAQK,GAAMP,EAAYO,CAAC,EAAE,QAAQ,CACrE,EAEKG,EAA0BP,EAA8B,IAErDD,EAAkB,MAAM,OAAQK,GAAMP,EAAYO,CAAC,EAAE,SAAS,CACtE,EAEKI,EAAgBR,EAAS,IACtBG,EAAe,MAAM,MAC7B,EACKM,EAAYT,EAAS,IAClBK,EAAW,MAAM,MACzB,EACKK,EAAcV,EAAS,IACpBM,EAAiB,MAAM,MAC/B,EACKK,EAAoBX,EAAS,IAC1BS,EAAU,OAASD,EAAc,KACzC,EACKI,EAAkBZ,EAAS,IAAM,CACrC,IAAMa,EAAOF,EAAkB,MACzBG,EAAWJ,EAAY,QAAU,EACjCK,EAAUF,GAAQC,EACxB,OAAKC,GACHpB,EAAO,KAAK,+BAA+B,EAEtCoB,CACT,CAAC,EAED,MAAO,CACL,YAAaC,EAAS,CACpB,eAAAb,EACA,WAAAE,EACA,iBAAAC,EACA,wBAAAC,EACA,cAAAC,EACA,UAAAC,EACA,YAAAC,EACA,kBAAAC,EACA,gBAAAC,EACA,oBAAAX,CACF,CAAC,CACH,CACF,OAASgB,EAAK,CACZ,MAAAtB,EAAO,MAAM,uBAAuBD,GAAe,SAAS,EAAE,EACxDuB,CACR,CACF,CC/FA,IAAIC,GAA0C,KAK9C,OAAO,cAAgB,OAAO,eAAiB,GAExC,SAASC,IAAoB,CACnC,OAAID,KAAsB,OACzBA,GAAoB,IAAI,QAAQ,CAACE,EAAQC,IAAW,CACnDC,GAAO,MAAM,yBAAyB,EAEtC,EAAE,UAAU,yDAAyD,EACnE,KAAK,SAAUC,EAASC,EAAa,CACrCF,GAAO,MAAM,4BAA4B,EACzCF,EAAO,EAAI,CACZ,CAAC,EACA,KAAK,SAAUK,EAAQC,EAAWC,EAAW,CAC7CL,GAAO,MAAM,wBAAwB,EACrC,OAAO,cAAgB,GACvBA,GAAO,MAAMK,CAAS,EACtBN,EAAOM,CAAS,CACjB,CAAC,CACH,CAAC,GAEKT,EACR,CCKA,IAAMU,GAA4BC,EAAqD,CACrF,UAAW,YACX,aAAc,cAChB,CAAC,EAED,SAASC,GAAqBC,EAA6C,CACzE,OAAQA,EAAO,CACb,IAAK,aAAc,MAAO,CAAC,YAAY,EACvC,IAAK,UAAW,MAAO,CAAC,YAAY,EACpC,IAAK,QAAS,MAAO,CAAC,SAAS,EAC/B,IAAK,cAAe,MAAO,CAAC,OAAO,EACnC,IAAK,YAAa,MAAO,CAAC,QAAS,cAAe,WAAW,EAC7D,IAAK,sBAAuB,MAAO,CAAC,aAAa,EACjD,QAASC,EAAgBD,CAAK,CAChC,CACF,CAGO,SAASE,IAAgB,CAC9B,GAAIC,EAA2BN,EAAyB,EACtD,OAEF,IAAMO,EAAYC,EAAsB,YAAY,EAC9C,CAAE,8BAAAC,CAA8B,EAAIC,EAAe,CAAC,YAAa,eAAe,CAAC,EACjFC,EAASC,EAAc,CAAE,YAAa,eAAgB,CAAC,EAC7D,eAAeC,EAAaC,EAA0B,CAChDA,IAAU,QACZ,MAAMH,EAAO,MAAM,QAAQ,CAAE,UAAW,OAAQ,CAAC,EAE1CG,IAAU,WACjB,MAAMH,EAAO,UAAU,QAAQ,CAAE,UAAW,YAAa,YAAaF,EAA8B,KAAM,CAAC,EAEpGK,IAAU,cAAgBA,IAAU,WAAaA,IAAU,SAIlEV,EAAgBU,CAAK,EAEvB,IAAIX,EA4BJ,GAzBIM,EAA8B,QAAU,cAEtCK,IAAU,SAAWA,IAAU,WACjCX,EAAQ,YAGRA,EAAQW,EAGHL,EAA8B,QAAU,YAAcA,EAA8B,QAAU,cACjGK,IAAU,QACZX,EAAQ,cAEDW,IAAU,WACjBX,EAAQ,sBAGRA,EAAQW,EAIVV,EAAgBK,EAA8B,KAAK,EAGjCP,GAAqBC,CAAK,EAC9B,SAASI,EAAU,KAAK,EACtCA,EAAU,MAAQJ,MAElB,OAAM,IAAI,MACR,uBAAuBA,CAAK,gBAAgBI,EAAU,KAAK,GAC7D,CAEJ,CACAQ,EAAQf,GAA0B,UAAWgB,GAAST,CAAS,CAAC,EAChEQ,EAAQf,GAA0B,aAAca,CAAY,CAC9D,CAEO,SAASI,GAAc,CAAE,YAAAC,CAAY,EAA0C,CAAC,EAAG,CACxF,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,EACjC,GAAI,CACFF,IAAgB,eAChB,IAAMX,EAAYc,EAAuBrB,GAA0B,SAAS,EACtEa,EAAeQ,EAAuBrB,GAA0B,YAAY,EAClF,MAAO,CACL,UAAAO,EAEA,aAAAM,CACF,CACF,OACOS,EAAK,CACV,MAAAH,EAAO,MAAM,uBAAuBD,GAAe,SAAS,EAAE,EACxDI,CACR,CACF,CC/GA,IAAIC,GAAc,EAaZC,GAA0BC,EAAmD,CACjF,eAAgB,iBAChB,eAAgB,iBAChB,uBAAwB,yBACxB,kBAAmB,oBACnB,SAAU,WACV,mBAAoB,oBACtB,CAAC,EAGM,SAASC,IAChB,CACE,GAAIC,EAA2BH,EAAuB,EACpD,OAEF,GAAM,CAAE,OAAAI,EAAQ,iBAAAC,CAAiB,EAAIC,EAAc,EAE7CC,EAAgBF,EAAiB,iBAAiB,EACxDE,EAAc,MAAM,uBAAuB,EAE3C,IAAMC,EAAiBT,KAEvBU,GAAkB,EACf,MAAOC,GAAQ,CACd,MAAAN,EAAO,MAAMM,CAAG,EACVA,CACR,CAAC,EAEH,IAAMC,EAASC,EAAc,CAAE,YAAa,iBAAkB,CAAC,EAEzD,CAAE,aAAAC,CAAa,EAAIC,EAAgB,CAAE,YAAa,iBAAkB,CAAC,EACrEC,EAAiBC,EAAwB,IAAI,EACnDC,EAAQjB,GAAwB,eAAgBe,CAAc,EAC9D,IAAMG,EAAyBC,EAAwC,IAAM,CAC3E,IAAMC,EAAqBL,EAAe,OAAO,YAAY,EAC7D,GAAIM,EAAMD,CAAkB,EAC1B,OAAO,KAEJ,CAEH,IAAME,EADmB,CAAC,EAAwB,MAAM,KAAKF,CAAkB,EACzC,OAAOG,GAAM,EAAEA,CAAE,EAAE,KAAK,uBAAuB,GAAG,KAAK,IAAMf,EAAe,SAAS,CAAC,EAE5H,GAAIc,EAAc,SAAW,EAC3B,OAAO,KAEJ,GAAIA,EAAc,SAAW,EAChC,OAAO,EAAmBA,EAAc,CAAC,CAAC,EAG1C,MAAM,IAAI,MAAM,oEAAoEd,CAAc,GAAG,CAEzG,CACF,CAAC,EACDS,EAAQjB,GAAwB,uBAAwBkB,CAAsB,EAE9E,GAAM,CAAE,uBAAAM,CAAuB,EAAIC,GAA4B,EAC/DD,EAAuBN,CAAsB,EAE7C,GAAM,CAAE,aAAAQ,CAAa,EAAIC,GAAa,CAAE,YAAa,iBAAkB,CAAC,EAExE,eAAeC,EAAsBC,EAA0B,CAC7DtB,EAAc,MAAM,6BAA6B,EAEjDQ,EAAe,MAAQc,EAEvB,MAAMH,EAAa,OAAO,EAEXG,EAAY,YAAY,EAChC,WAAW,IAAI,EAItBA,EAAY,UAAU,KAEpBH,EAAa,UAAU,EAAE,MAAOhB,GAAQN,EAAO,MAAMM,CAAG,CAAC,EAElD,GACR,EAEDmB,EAAY,WAAYC,GAA8B,CACpDnB,EAAO,kBACJ,QAAQ,CACP,UAAW,oBACX,eAAgBmB,CAClB,CAAC,EACA,MAAOpB,GAAQN,EAAO,MAAMM,CAAG,CAAC,CACrC,CAAC,EACDmB,EAAY,SAAS,IAAM,CACzBlB,EAAO,OAAO,QAAQ,CAAE,UAAW,QAAS,CAAC,EAAE,MAAMD,GAAON,EAAO,MAAMM,CAAG,CAAC,CAC/E,CAAC,EAED,MAAMC,EAAO,aAAa,QAAQ,CAAE,UAAW,cAAe,CAAC,EAG/D,MAAMe,EAAa,OAAO,CAC5B,CAEA,IAAIK,EAEEC,EAAW,KACXX,EAAMU,CAAe,IACvBA,EAAkB,IAAI,QAAQ,CAACE,EAASC,IAAW,CACjD3B,EAAc,MAAM,gBAAgB,EACpCE,GAAkB,EACf,MAAOC,GAAQwB,EAAOxB,CAAG,CAAC,EAC1B,KAAK,IACGgB,EAAa,SAAS,CAC9B,EAAE,KAAK,IAAM,CACZ,WAAW,SAASb,EAAa,QAASA,EAAa,WAAYA,EAAa,OAASgB,GAAgB,CACvGD,EAAsBC,CAAW,EAAE,KAAK,IAAM,CAC5CtB,EAAc,MAAM,cAAc,EAClC0B,EAAQ,CACV,CAAC,EAAE,MAAMvB,GAAO,CACdwB,EAAOxB,CAAG,CACZ,CAAC,CACH,CAAC,CACH,CAAC,EAAE,MAAOA,GAAQwB,EAAOxB,CAAG,CAAC,CACjC,CAAC,GAEIqB,GAGHI,EAAoB,IAAM,CAC9B,IAAMC,EAASrB,EAAe,OAAO,YAAY,EACjD,GAAIsB,EAASD,CAAM,EAAG,CACpB,IAAME,EAAmBF,EAAO,KAAK,4BAA4B,EAC7DE,EAAiB,OAAS,IACxBA,EAAiB,OAAS,EAC5BlC,EAAO,MAAM,iDAAiD,EAG9DkC,EAAiB,QAAQ,OAAO,EAGtC,CACF,EAEMC,EAAwB,IACxBxB,EAAe,QAAU,KACpB,KAEFA,EAAe,MAAM,YAAY,EAG1CE,EAAQjB,GAAwB,SAAUgC,CAAQ,EAClDf,EAAQjB,GAAwB,kBAAmBmC,CAAiB,EACpElB,EAAQjB,GAAwB,mBAAoBuC,CAAqB,EACzEtB,EAAQjB,GAAwB,eAAgBQ,CAAc,CAChE,CAEA,SAASgC,GAAmBC,EAA8B,CACxD,OAAO,OAAO,KAAKA,CAAG,EAAE,OAAOC,GAAKrB,EAAMoB,EAAIC,CAAC,CAAC,CAAC,CACnD,CAEA,SAASC,GAAoEC,EAAyF,CAGpK,IAAMC,EAAmC,CAAC,EAE1C,QAAWC,KAAOF,EAChBC,EAAeC,CAAG,EAAIC,GAAe/C,GAAwB8C,CAAG,CAAC,EAEnE,IAAME,EAAmBR,GAAmBK,CAAc,EAE1D,GAAIG,EAAiB,OAAS,EAC5B,MAAM,IAAI,MAAM,wDAAwDA,EAAiB,SAAS,CAAC,EAAE,EAGvG,OAAOH,CACT,CAEO,IAAMI,GAAiB,CAAC,CAAE,YAAAC,CAAY,EAA0C,CAAC,IAAM,CAC5F,GAAM,CAAE,OAAA9C,CAAO,EAAIE,EAAc,CAAE,YAAa,gBAAiB,CAAC,EAClE,GAAI,CACF,OAAOqC,GAAc,CACnB,WACA,gBACF,CAAC,CACH,OACOjC,EAAK,CACV,MAAAN,EAAO,MAAM,uBAAuB8C,GAAe,SAAS,EAAE,EACxDxC,CACR,CACF,EAEayC,GAA0B,CAAC,CAAE,YAAAD,CAAY,EAA0C,CAAC,IAAM,CACrG,GAAM,CAAE,OAAA9C,CAAO,EAAIE,EAAc,CAAE,YAAa,yBAA0B,CAAC,EAC3E,GAAI,CACF,OAAOqC,GAAc,CACnB,iBACA,yBACA,oBACA,gBACF,CAAC,CACH,OACOjC,EAAK,CACV,MAAAN,EAAO,MAAM,uBAAuB8C,GAAe,SAAS,EAAE,EACxDxC,CACR,CACF,EC9NO,SAAS0C,GACdC,EAC4B,CAC5B,GAAM,CAAE,IAAAC,EAAK,MAAAC,EAAQ,GAAM,YAAAC,EAAc,IAAK,EAAIC,EAASJ,CAAY,EAAI,CAAE,IAAKA,CAAa,EAAIA,EACnG,OAAO,IAAI,QAA2B,CAACK,EAA2CC,IAAkC,CAClH,IAAMC,EAAuB,SAAS,cAAc,QAAQ,EAC5DA,EAAE,KAAO,kBACTA,EAAE,IAAMN,EACRM,EAAE,MAAQL,EACNC,IAAeI,EAAE,YAAcJ,GACnCI,EAAE,QAAUD,EACZC,EAAE,OAAS,IAAM,CACfF,EAAQE,CAAC,CACX,EACA,IAAMC,EAAU,SAAS,qBAAqB,QAAQ,EACtD,GAAIA,EAAQ,OAAS,EAAG,CACtB,IAAMC,EAAcD,EAAQ,CAAC,EAC7B,GAAIC,EAAY,cAAe,CAC7BA,EAAY,cAAc,aAAaF,EAAGE,CAAW,EACrD,MACF,CACF,CACA,SAAS,KAAK,YAAYF,CAAC,CAC7B,CAAC,CACH,CC1BA,SAASG,GACPC,EACAC,EAA4B,SAC5BC,EACAC,EACkB,CAClB,OAAO,IAAI,QAAiB,CAACC,EAASC,IAAW,CAC3CH,EAAa,GACfG,EAAO,IAAI,MAAM,wDAAwD,CAAC,EAExEF,EAAmB,GACrBE,EAAO,IAAI,MAAM,8DAA8D,CAAC,EAElF,IAAIC,EAAU,EACRC,EAAY,IAAM,CACtB,IAAMC,EAAKR,EAAWC,CAAa,EAC7BQ,EAAMD,CAAE,GACZJ,EAAQI,CAAE,EAERF,EAAUJ,GACZI,IACA,WAAWC,EAAWJ,CAAgB,GAGtCE,EAAO,IAAI,MAAM,6CAA6C,CAAC,CAEnE,EACAE,EAAU,CACZ,CAAC,CACH,CAEA,eAAsBG,GACpBC,EACAV,EAA4B,SAC5BC,EACAC,EACkB,CAGlB,GAFAD,IAAe,GACfC,IAAqB,IACjBS,EAASD,CAAe,EAAG,CAC7B,IAAME,EAAWF,EACjBA,EAAmBG,GAAuBA,EAAO,cAAuBD,CAAQ,CAClF,CACA,OAAO,MAAMd,GAA6BY,EAAiBV,EAAeC,EAAYC,CAAgB,CACxG,CCbA,IAAMY,GAAqE,CACzE,kBAAmB,OAAO,mBAAmB,CAC/C,EAEA,SAASC,IAAqB,CAC5B,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,EAC7BC,EAA4C,KAEhD,MAAO,CAACC,EAAiBC,KACvBF,IAAyB,IAAI,QAAc,CAACG,EAASC,IAAW,CAC9DC,GAAoB,kDAAoDJ,CAAO,EAC5E,KAAMK,GAAiC,CACtCJ,EAAa,MAAQI,EACrB,OAAO,WAAW,MAAM,IAAM,CAC5BH,EAAQ,CACV,CAAC,CACH,CAAC,EACA,MAAOI,GAAUH,EAAOG,CAAK,CAAC,CAEnC,CAAC,EAAE,MAAMT,EAAO,KAAK,EACdE,EAEX,CAEA,SAASQ,GAAuBC,EAAeC,EAAmDC,EAAiCb,EAAiB,CAClJA,EAAO,MAAM,wBAAwB,EAErC,GAAI,CACF,OAAAY,EAAe,gBAAgBD,CAAK,EAC7B,QAAQ,QAAQA,CAAK,CAC9B,MACc,CACZ,OAAAC,EAAe,gBAAgB,CAC7B,aAAcD,CAChB,CAAC,EACMG,GAA0C,uBAAwBD,EAAO,IAAI,CAAC,CAAC,EACnF,KAAKE,GAAc,CAClB,IAAMC,EAAM,EAAED,CAAU,EAAE,IAAI,EAC9B,GAAIE,EAASD,CAAG,GAAKA,EAAI,KAAK,EAAE,OAAS,EACvC,OAAOA,EAGP,MAAM,IAAI,MAAM,2BAA2B,CAE/C,CAAC,EACA,MAAME,GAAO,CACZ,MAAAlB,EAAO,MAAMkB,CAAG,EACV,IAAI,MAAM,2BAA2B,CAC7C,CAAC,CACL,CACF,CAEA,eAAeC,GAAqBhB,EAAiBS,EAA6BC,EAAiCb,EAAmC,CACpJ,OAAAA,EAAO,MAAM,sBAAsB,EAC5B,MAAM,OAAO,WACjB,QAAQG,EAAS,CAAE,OAAQ,QAAS,CAAC,EACrC,KAAMQ,GACED,GAAuBC,EAAOC,EAAqDC,EAAQb,CAAM,CACzG,CACL,CAEA,SAASoB,GAAkBC,EAAuDrB,EAAiB,CACjG,MAAO,OAAOG,EAAiBS,EAA6BC,EAAiCT,KAC3F,MAAMiB,EAAelB,EAASC,CAAY,EACnC,IAAI,QAAc,CAACC,EAASiB,IAAY,CAC7CtB,EAAO,MAAM,gBAAgB,EAC7B,OAAO,WAAW,MAAM,IAAM,CAC5BmB,GAAqBhB,EAASS,EAAgBC,EAAQb,CAAM,EACzD,KAAKW,GAAS,CACTM,EAASN,CAAK,GAAKA,EAAM,OAAS,GACpCN,EAAQ,CAEZ,CAAC,EACA,MAAOa,GAAgB,CACtB,MAAAA,EAAMA,GAAO,gCACblB,EAAO,MAAMkB,CAAG,EACVA,CACR,CAAC,CACL,CAAC,CACH,CAAC,EAEL,CAEO,SAASK,IAAuB,CACrC,GAAIC,EAA2B1B,EAAgC,EAC7D,OAGF,GAAM,CAAE,OAAAE,EAAQ,iBAAAyB,CAAiB,EAAIxB,EAAc,CAAE,YAAa,0BAA2B,CAAC,EACxFyB,EAAgBD,EAAiB,sBAAsB,EAC7DC,EAAc,MAAM,4BAA4B,EAEhD,IAAML,EAAiBtB,GAAmB,EAGpC4B,EAAgBP,GAAkBC,EAAgBrB,CAAM,EAExDI,EAA6CwB,EAAI,IAAI,EAErD,CAAE,eAAAC,EAAgB,uBAAAC,CAAuB,EAAIC,GAAwB,CAAE,YAAa,qBAAsB,CAAC,EAC3G,CAAE,aAAAC,CAAa,EAAIC,EAAgB,CAAE,YAAa,qBAAsB,CAAC,EAEzEC,EAAoB,SAAY,CACpC,GAAIC,EAAMH,CAAY,EACpB,MAAM,IAAI,MAAM,sBAAsB,EAExC,GAAIG,EAAMN,EAAe,KAAK,EAC5B,MAAM,IAAI,MAAM,yBAAyB,EAE3C,GAAIM,EAAML,EAAuB,KAAK,EACpC,MAAM,IAAI,MAAM,iCAAiC,EAEnD,OAAO,MAAMH,EACXK,EAAa,iBACbH,EAAe,MACfC,EAAuB,MACvB1B,CACF,CACF,EAGAsB,EAAc,MAAM,2BAA2B,EAC/CU,EAAQtC,GAAiC,kBAAmBoC,CAAiB,EAE7E,IAAMG,EAASC,EAAc,CAAE,YAAa,qBAAsB,CAAC,EAGnEC,GAAU,IAAM,CACdF,EAAO,aAAa,GAAG,IAAM,CAC3BhB,EAAeW,EAAa,iBAAkB5B,CAAY,EAAE,MAE1DJ,EAAO,KACT,CACF,CAAC,CACH,CAAC,EAEDwC,GAAY,IAAM,CAChB,GAAIpC,EAAa,MAAO,CACtB,IAAMqC,EAASrC,EAAa,OAAO,cAC/BqC,IACFA,EAAO,YAAYrC,EAAa,KAAK,EACrCA,EAAa,MAAQ,KAEzB,CACF,CAAC,EAEDsB,EAAc,MAAM,0BAA0B,CAChD,CAEO,SAASgB,GAAoB,CAAE,YAAAC,CAAY,EAA0C,CAAC,EAAG,CAC9F,GAAM,CAAE,OAAA3C,CAAO,EAAIC,EAAc,CAAE,YAAa,qBAAsB,CAAC,EACvE,GAAI,CACF,OAAA0C,IAAgB,sBAET,CAAE,kBADiBC,EAAuB9C,GAAiC,iBAAiB,CACxE,CAC7B,OACOoB,EAAK,CACV,MAAAlB,EAAO,MAAM,uBAAuB2C,GAAe,SAAS,EAAE,EACxDzB,CACR,CACF,CC3KA,IAAM2B,GAAsCC,EAA+D,CACzG,gBAAiB,kBACjB,mCAAoC,oCACtC,CAAC,EAGM,SAASC,IAAyB,CACvC,GAAIC,EAA2BH,EAAmC,EAChE,OAGF,GAAM,CAAE,aAAAI,CAAa,EAAIC,EAAgB,CAAE,YAAa,oCAAqC,CAAC,EACxF,CAAE,8BAAAC,CAA8B,EAAIC,EAAe,CAAE,YAAa,oCAAqC,CAAC,EAExGC,EAAgBC,EAAS,IAAM,CACnC,IAAMC,EAAmBN,EAAa,cAEhCO,EAAiBL,EAA8B,MACrD,GAAIK,KAAkBD,EACpB,OAAOA,EAAiBC,CAAiD,EAGzE,MAAM,IAAI,MACR,GAAGA,CAAc,uCAAuCP,EAAa,eAAe,GACtF,CAEJ,CAAC,EAEKQ,EAAkBC,EAAS,CAAC,CAAC,EAE7BC,EAAoBL,EAAS,IAC1BD,EAAc,MAClB,OAAOO,GAAMC,GACb,SAASD,CAAC,CAAC,CACf,EAED,SAASE,GAAqC,CAI5C,QAAWC,KAAO,OAAO,KAAKN,CAAe,EAC3C,OAAOA,EAAgBM,CAAG,EAG5B,QAAWC,KAAQL,EAAkB,MACnCF,EAAgBO,CAAI,EAAI,IAE5B,CAEAC,EAAQpB,GAAoC,gBAAiBY,CAAe,EAC5EQ,EAAQpB,GAAoC,mCAAoCiB,CAAkC,CACpH,CAEO,SAASI,GAEd,CAAE,YAAAC,CAAY,EAA0C,CAAC,EAAG,CAC1D,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,EACnC,GAAI,CACFF,IAAgB,yBAChB,IAAMV,EAAkBa,EACtBzB,GAAoC,eACtC,EACMiB,EAAqCQ,EAAuBzB,GAAoC,kCAAkC,EACxI,MAAO,CAAE,gBAAAY,EAAiB,mCAAAK,CAAmC,CAC/D,OACOS,EAAK,CACV,MAAAH,EAAO,MAAM,uBAAuBD,GAAe,SAAS,EAAE,EACxDI,CACR,CACF,CCpEO,IAAMC,GAAiBC,EAAI,EAAK,EASjCC,GAA6BC,EAAsD,CACvF,WAAY,aACZ,WAAY,YACd,CAAC,EAGM,SAASC,IAA+C,CAC7D,GAAIC,EAA2BH,EAA0B,EACvD,OAEF,GAAM,CAAE,OAAAI,CAAO,EAAIC,EAAc,EAE3B,CAAE,8BAAAC,CAA8B,EAAIC,EAAe,CAAE,YAAa,gBAAiB,CAAC,EACpF,CAAE,aAAAC,CAAa,EAAIC,EAAgB,CAAE,YAAa,gBAAiB,CAAC,EACpE,CAAE,kBAAAC,CAAkB,EAAIC,GAAwB,CAAE,YAAa,gBAAiB,CAAC,EACjF,CAAE,YAAAC,CAAY,EAAIC,GAA6B,CAAE,YAAa,gBAAiB,CAAC,EAChF,CAAE,YAAAC,CAAY,EAAIC,GAAe,CAAE,YAAa,gBAAiB,CAAC,EAClE,CAAE,gBAAAC,CAAgB,EAAIC,GAAuB,CAAE,YAAa,eAAgB,CAAC,EAE7E,CAAE,kBAAAC,CAAkB,EAAIC,GAAoB,CAAE,YAAa,gBAAiB,CAAC,EAC7E,CAAE,wBAAAC,CAAwB,EAAIC,EAAc,CAAE,YAAa,gBAAiB,CAAC,EAE7EC,EAAoB,IACjBC,EAAMP,CAAe,GAAK,OAAO,KAAKA,CAAe,EAAE,SAAW,EAI3E,SAASQ,EAAgBC,EAAyB,CAChD3B,GAAe,MAAQ2B,CACzB,CAEA,SAASC,GAAa,CAEpB,GADAtB,EAAO,KAAK,qBAAqB,EAC7BkB,EAAkB,GAAKhB,EAA8B,QAAU,cAAe,CAChFF,EAAO,KAAK,iDAAiD,EAC7D,MACF,CACAU,EAAY,oBAAoB,EAEVA,EAAY,wBAChB,OAAS,GAEzBM,EAAwB,QAAQ,CAAE,UAAW,yBAA0B,CAAC,EAAE,MAAMhB,EAAO,KAAK,EAGzFU,EAAY,kBAIbN,EAAa,cACfgB,EAAgB,EAAI,EACpBN,EAAkB,EACf,KAAKR,CAAiB,EACtB,KAAK,IAAM,CACVN,EAAO,KAAK,gBAAgB,CAC9B,CAAC,EACA,MAAOuB,GAAQvB,EAAO,MAAMuB,CAAG,CAAC,IAEnCH,EAAgB,EAAI,EACpBd,EAAkB,EAClBN,EAAO,KAAK,gBAAgB,GAE1BN,GAAe,OACjB,WAAW,IAAM,CACf0B,EAAgB,EAAK,CACvB,EAAG,GAAI,EAEX,CAGA,SAASI,GAAY,CACnB,GAAIN,EAAkB,GAAKhB,EAA8B,QAAU,cACjE,OAEF,IAAMuB,EAAgBf,EAAY,cAC5BgB,EAAYhB,EAAY,UAC9BV,EAAO,MAAM,CAAE,UAAA0B,EAAW,cAAAD,CAAc,CAAC,EACzCzB,EAAO,MAAM,CAAE,cAAeU,EAAY,UAAW,CAAC,EACtDV,EAAO,MAAM,CAAE,kBAAmBU,EAAY,cAAe,CAAC,CAChE,CAEA,SAASiB,EAAkBC,EAAgB,CACzC,OAAOT,EAAMS,CAAK,GAAMA,IAAU,EACpC,CAGA,SAASC,GAAa,CACpB,GAAIX,EAAkB,EAAG,CACvB,GAAIhB,EAA8B,QAAU,cAC1C,OAEAF,EAAO,KAAK,iDAAiD,EAC7D,MAEJ,CACAwB,EAAU,EAEa,OAAO,KAAKhB,CAAW,EAE/B,QAASsB,GAAQ,CACXtB,EAAYsB,CAAG,EAAE,WAAa,IAE/BH,EAAkBf,EAAgBkB,CAAG,CAAC,GACtD9B,EAAO,KAAK,mBAAmB8B,CAAG,YAAY,CAElD,CAAC,CACH,CAEAC,EAAQnC,GAA2B,WAAY0B,CAAU,EACzDS,EAAQnC,GAA2B,WAAYiC,CAAU,CAC3D,CAEO,SAASG,GAAc,CAAE,YAAAC,CAAY,EAA0C,CAAC,EAAG,CACxF,GAAM,CAAE,OAAAjC,CAAO,EAAIC,EAAc,CAAE,YAAa,eAAgB,CAAC,EACjE,GAAI,CACFgC,IAAgB,gBAChB,IAAMX,EAAaY,EAAuBtC,GAA2B,UAAU,EACzEiC,EAAaK,EAAuBtC,GAA2B,UAAU,EAC/E,GAAIuB,EAAMG,CAAU,EAClB,MAAM,IAAI,MAAM,mBAAmB,EAErC,GAAIH,EAAMU,CAAU,EAClB,MAAM,IAAI,MAAM,mBAAmB,EAErC,MAAO,CAAE,WAAAP,EAAY,WAAAO,CAAW,CAClC,OACON,EAAK,CACV,MAAAvB,EAAO,MAAM,uBAAuBiC,GAAe,SAAS,EAAE,EACxDV,CACR,CACF,CC7IA,IAAMY,GAA8BC,EAAuD,CACzF,mBAAoB,qBACpB,kBAAmB,oBACnB,yBAA0B,0BAC5B,CAAC,EAGM,SAASC,IAAkB,CAChC,GAAIC,EAA2BH,EAA2B,EACxD,OAEF,GAAM,CAAE,aAAAI,CAAa,EAAIC,EAAgB,CAAE,YAAa,kBAAmB,CAAC,EACtEC,EAAqBF,EAAa,oBAAoB,SAAS,aAAa,EAC5E,CAAE,iCAAAG,CAAiC,EAAIC,EAAe,CAAE,YAAa,kBAAmB,CAAC,EAEzFC,EAAoBC,EAAS,IAC1BJ,GAAsBC,EAAiC,QAAU,aACzE,EAEK,CAAE,WAAAI,EAAY,WAAAC,CAAW,EAAIC,GAAc,CAAE,YAAa,cAAe,CAAC,EAE1EC,EAAyB,IAAM,CACnC,GAAI,CAACR,EACH,MAAM,IAAI,MACR,mDAAmDF,EAAa,eAAe,GACjF,EAEF,GAAIK,EAAkB,QAAU,GAC9B,MAAM,IAAI,MAAM,iEAAiEL,EAAa,eAAe,EAAE,CAEnH,EACQ,CAAE,OAAAW,CAAO,EAAIC,EAAc,EAE7BC,EAAkB,IAAM,CAC5B,GAAI,CACFH,EAAuB,EACvBF,EAAW,EACXD,EAAW,CACb,OACOO,EAAK,CACV,MAAAH,EAAO,MAAM,yEAAyE,EAChFG,CACR,CACF,EAEMC,EAA2B,IAAM,CACjCV,EAAkB,OACpBQ,EAAgB,CAEpB,EACAG,EAAQpB,GAA4B,mBAAoB,EAAK,EAC7DoB,EAAQpB,GAA4B,kBAAmBS,CAAiB,EACxEW,EAAQpB,GAA4B,yBAA0BmB,CAAwB,CACxF,CAEO,SAASE,IAAiB,CAC/B,IAAMf,EAAqBgB,EAAuBtB,GAA4B,kBAAkB,EAC1FS,EAAoBa,EAAuBtB,GAA4B,iBAAiB,EACxFmB,EAA2BG,EAAuBtB,GAA4B,wBAAwB,EAC5G,MAAO,CACL,mBAAAM,EACA,kBAAAG,EACA,yBAAAU,CACF,CACF,CCvDO,SAASI,GAAkBC,EAAsF,CACtH,GAAM,CAAE,QAAAC,EAAS,QAAAC,CAAQ,EAAIF,EACvB,CAAE,MAAAG,CAAM,EAAK,UAAWH,EAAyBA,EAAwB,CAAE,MAAO,IAAK,EACvF,CAAE,QAAAI,EAAS,UAAAC,EAAW,WAAAC,CAAW,EAAIC,EAAMJ,CAAK,EAClDH,EACA,CAAE,QAASG,EAAM,SAAU,UAAWA,EAAM,QAAS,WAAYA,EAAM,KAAM,EAEjF,OAAO,aAAa,UAAU,CAC5B,MAAO,WACP,QAAAF,EACA,QAAAC,EACA,QAAAE,EACA,UAAAC,EACA,WAAAC,CACF,CAA4B,CAC9B,CCrBA,IAAME,GAAoCC,EAA6D,CACrG,yBAA0B,0BAC5B,CAAC,EAEM,SAASC,IAAyB,CACvC,GAAIC,EAA2BH,EAAiC,EAC9D,OAEF,GAAM,CAAE,yBAAAI,CAAyB,EAAIC,GAAe,EAE9CC,EAA2B,CAAC,CAAE,MAAAC,EAAO,QAAAC,EAAS,QAAAC,EAAS,iBAAAC,EAAmB,EAAK,IAA4B,CAC/GC,GAAkB,CAAE,MAAAJ,EAAO,QAAAC,EAAS,QAAAC,CAAQ,CAAC,EACzCC,GACFN,EAAyB,CAE7B,EAGAQ,EACEZ,GAAkC,yBAClCM,CACF,CACF,CAEO,SAASO,IAAuB,CAKrC,MAAO,CAAE,yBAJwBC,EAC/Bd,GAAkC,wBACpC,CAEkC,CACpC,CClCA,IAAMe,GAA8BC,EAAuD,CACzF,QAAS,UACT,UAAW,WACb,CAAC,EAGM,SAASC,IAChB,CACE,GAAIC,EAA2BH,EAA2B,EACxD,OAEF,GAAM,CAAC,QAAAI,EAASC,CAAa,EAAIC,GAAyB,EAC1DC,EAAQP,GAA4B,QAASI,CAAO,EACpDG,EAAQP,GAA4B,UAAYK,CAA+B,CACjF,CAGO,SAASC,GAAgB,CAAE,YAAAE,CAAY,EAA2C,CAAC,EAAqD,CAC7I,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,EACjC,GACA,CACE,IAAMN,EAAUO,EAAuBX,GAA4B,OAAO,EACpEK,EAAYM,EAAuBX,GAA4B,SAAS,EAC9E,MAAO,CAAE,QAAAI,EAAS,UAAAC,CAAU,CAC9B,OACOO,EACP,CACE,MAAAH,EAAO,MAAM,uBAAwBD,GAAe,SAAU,EAAE,EAC1DI,CACR,CACF,CCrDA,IAAAC,GAAA,GAAAC,GAAAD,GAAA,eAAAE,GAAA,qBAAAC,GAAA,+BAAAC,GAAA,UAAAC,GAAA,aAAAC,GAAA,gBAAAC,GAAA,cAAAC,GAAA,cAAAC,KCWO,IAAMC,GAAuC,OAAe,kBAAgD,CACjH,OAAQ,GACR,oBAAqB,CAAC,EACtB,eAAgB,OAAO,SAAS,eAChC,QAAS,CAAC,CACZ,EAGK,qBAAsB,QACzB,OAAO,eAAe,OAAQ,mBAAoB,CAAE,MAAOA,GAAkB,SAAU,EAAM,CAAC,EClBzF,SAASC,IAAc,CAC5B,GAAM,CAAE,OAAAC,EAAQ,QAAAC,CAAQ,EAAIC,GAC5B,MAAO,GAAGF,CAAM,IAAKC,EAAQ,WAAa,GAAK,OAASA,EAAQ,QAAS,EAC3E,CCoBA,SAASE,GAA0BC,EAA8B,CAE/D,OAAAA,IAAe,CAAC,EAChBA,EAAW,SAAW,OAAO,SAAS,KAAK,QAAQ,kBAAmB,WAAW,EACjFA,EAAW,OAAS,IACbA,CACT,CAOO,SAASC,GAAaC,EAAcF,EAA2C,CACpF,OAAOC,GAAgBC,EAAMH,GAA0BC,CAAU,CAAC,CACpE,CAgBO,SAASG,GAA8CD,EAAcE,EAAgC,CAAC,EAAY,CACvH,GAAM,CAAE,aAAAC,EAAc,MAAAC,CAAM,EAAIF,EAE1BG,EAA+BJ,GAAaD,CAAI,GAAG,KAAK,EAC9D,GAAIM,EAAMD,CAAQ,GAAKE,GAAcF,CAAQ,EAC3C,OAAOF,EAEJ,GAAIK,GAAUJ,CAAK,EACtB,GAAI,CACF,OAAQ,KAAK,MAAMC,CAAQ,GAAiBF,CAC9C,OACOM,EAAK,CACV,QAAQ,IAAIA,CAAG,CACjB,SAEOC,GAAWN,CAAK,EACvB,OAAOA,EAAMC,CAAQ,GAAKF,EAE5B,OAAOE,CACT,CC5DO,SAASM,GACdC,EACA,CAAE,aAAAC,EAAc,MAAAC,CAAM,EAAoE,CAAC,EAE7F,CAGE,IAAMC,EADe,IAAI,gBAAgB,OAAO,SAAS,MAAM,EACpC,IAAIH,CAAG,GAAG,KAAK,EAEtCI,EACJ,GAAIC,GAAWH,CAAK,GAAKI,EAASH,CAAK,EACrC,GAAI,CACFC,EAAYF,EAAMC,CAAK,CACzB,OAASI,EAAG,CACV,QAAQ,KAAKA,CAAC,CAChB,MAGAH,EAAYD,EAEd,OAAQC,GAAaH,CACvB,CChCO,IAAeO,GAAf,KAA+M,CAC1M,QACA,8BACVC,GACAC,GACAC,GACA,YAAY,CAAE,WAAAC,EAAY,kBAAAC,EAAoB,KAAM,4BAAAC,EAA6B,aAAAC,CAAa,EAA2I,CACvO,KAAKN,GAAcG,EACnB,KAAKF,GAAqBG,EAC1B,KAAK,QAAU,KACf,KAAK,8BAAgCC,EACrC,KAAKH,GAAgBI,CACvB,CAEA,IAAI,YAAa,CACf,OAAO,KAAKN,EACd,CAEA,oBAAqB,CACnB,OAAOO,GAAa,KAAKP,GAAa,KAAKC,IAAsB,MAAS,CAC5E,CAEA,IAAI,qBAAsB,CACxB,OAAO,KAAKC,EACd,CAIU,oBAAqH,CAC7H,IAAMM,EAA6BC,GAAY,KAAKP,EAAa,IAAM,GAAS,CAAC,CAAE,aAAc,KAAKA,EAAc,CAAC,EAAI,CAAC,EACpHQ,EAAmB,CAAE,OAAQ,IAAM,KAAK,eAAe,CAAE,EACzDC,EAAe,CAAE,OAAQ,IAAM,KAAK,mBAAmB,CAAE,EAC/D,OAAI,KAAK,8BACA,CAAEA,EAAcD,EAAkB,GAAIF,CAAyB,EAG/D,CAAEE,EAAkBC,EAAc,GAAIH,CAAyB,CAE1E,CAEA,IAAI,OAAoG,CACtG,IAAMI,EAAMC,GACV,KAAK,QACL,GAAI,KAAK,mBAAmB,CAC9B,EACA,YAAK,QAAUD,EACRA,CACT,CACF,EC7CO,IAAME,GAAN,cAA8CC,EAAmD,CACtGC,GACA,YAAY,CAAE,UAAAC,EAAW,WAAAC,EAAY,kBAAAC,EAAoB,KAAM,aAAAC,EAAe,EAAG,EAA4H,CAC3M,MAAM,CAAE,WAAAF,EAAY,kBAAAC,EAAmB,4BAA6B,GAAO,aAAcC,GAAgB,EAAG,CAAC,EAC7G,KAAKJ,GAAaC,CACpB,CAEA,IAAI,WAAY,CACd,OAAO,KAAKD,EACd,CAEA,mBAAkC,CAChC,OAAOK,GAAkB,KAAKL,EAAU,CAC1C,CAES,gBAA+B,CACtC,OAAO,KAAK,kBAAkB,CAChC,CACF,ECpBO,IAAMM,GAAN,cAAmKC,EAA8C,CACtNC,GACA,YAAY,CAAE,WAAAC,EAAY,kBAAAC,EAAoB,KAAM,YAAAC,EAAa,4BAAAC,EAA6B,aAAAC,CAAa,EAA0K,CACnR,MAAM,CAAE,WAAAJ,EAAY,kBAAAC,EAAmB,4BAAAE,EAA6B,aAAAC,CAAa,CAAC,EAClF,KAAKL,GAAeG,CACtB,CAEA,sBAAmC,CACjC,OAAO,KAAKH,GAAa,CAC3B,CAES,gBAA6B,CACpC,OAAO,KAAK,qBAAqB,CACnC,CACF,ECjBO,SAASM,IAAuB,CACrC,GAAM,CAAC,CAAE,SAAAC,EAAW,EAAG,EAAG,CAAE,SAAAC,EAAU,KAAAC,CAAK,CAAC,EAAI,CAAC,SAAU,QAAQ,EAEnE,OADkCF,IAAa,IAAOA,EAAS,QAAQC,EAAW,KAAOC,CAAI,IAAM,EACjEF,EAAW,EAC/C,CAEO,SAASG,IAAiC,CAC/C,IAAMH,EAAWD,GAAoB,EACrC,GAAIC,IAAa,GACf,MAAO,GAGT,GAAI,KAAQ,aAAc,KAAQI,GAAW,IAAI,QAAQ,GAAK,IAAI,SAASJ,CAAQ,EACjF,OAAQ,IAAI,IAAIA,CAAQ,EAAG,OAG3B,GAAI,CAAE,OAAO,IAAI,IAAIA,CAAQ,EAAE,MAAQ,MACjC,CAAmB,CAE3B,MAAO,EACT,CCnBO,SAASK,IAAuC,CACrD,IAAMC,EAAcC,GAAkB,QAAQ,EAE9C,MADsB,CAACD,GAAeA,EAAY,QAAQ,IAAI,IAAM,GAI7DC,GAAkB,OAAO,EAFvB,IAGX,CTHO,IAAMC,GAAc,IAAIC,GAAgC,CAAE,UAAW,eAAgB,WAAY,cAAe,CAAC,EAC3GC,GAAY,IAAID,GAAgC,CAAE,UAAW,aAAc,WAAY,YAAa,CAAC,EACrGE,GAAY,IAAIF,GAAgC,CAAE,UAAW,aAAc,WAAY,YAAa,CAAC,EAErGG,GAAY,IAAIC,GAAoD,CAC/E,WAAY,YACZ,4BAA6B,GAC7B,YAAa,IAAM,SAAS,SAAS,SACrC,aAAc,EAChB,CAAC,EAEYC,GAAmB,IAAID,GAA4B,CAC9D,WAAY,gBACZ,4BAA6B,GAC7B,YAAaE,GACb,aAAc,EAChB,CAAC,EAEYC,GAA6B,IAAIH,GAA4B,CACxE,WAAYC,GAAiB,WAC7B,4BAA6B,GAC7B,YAAaG,GACb,aAAc,EAChB,CAAC,EAEYC,GAAQ,IAAIL,GAA0D,CACjF,WAAY,QACZ,4BAA6B,GAC7B,kBAAmB,CACjB,MAAQM,GAAU,CAChB,GAAI,CACF,IAAMC,EAAM,KAAK,MAAMD,EAAM,KAAK,CAAC,EACnC,OAAQE,EAASD,CAAG,GAAKA,EAAI,KAAK,IAAM,GAAMA,EAAI,KAAK,EAAI,IAC7D,MACM,CACJ,MAAO,EACT,CACF,CACF,EACA,YAAaE,GACb,aAAc,EAChB,CAAC,EAEYC,GAAW,IAAIV,GAAoD,CAC9E,WAAY,WACZ,4BAA6B,GAC7B,YAAaW,GACb,aAAc,EAChB,CAAC,EUvDD,IAAAC,GAAA,GAAAC,GAAAD,GAAA,8BAAAE,GAAA,gBAAAC,GAAA,qBAAAC,KCuBO,IAAMC,GAA2B,CACtC,eAAgB,YAAa,UAAW,iBAAkB,cAAe,QAAS,YAAa,mBAAoB,cAAe,kBAAmB,SAAU,oBAAqB,aACtL,ECtBO,SAASC,GAAUC,EAAgB,CAAE,gBAAAC,EAAkB,EAAM,EAAI,CAAC,EAAmB,CAC1F,GAAIC,EAAMF,CAAK,EACb,OAAO,KAET,GAAIG,GAAUH,CAAK,EAAG,OAAOA,EAC7B,GAAII,EAASJ,CAAK,EAAG,CACnB,GAAI,gBAAgB,KAAKA,CAAK,EAAG,MAAO,UAAU,KAAKA,CAAK,EACxD,QAAQ,KAAKA,CAAK,IACpBA,EAAQ,SAASA,CAAK,EAE1B,CACA,OAAIC,GAAmBI,GAASL,CAAK,IAAMA,IAAU,GAAKA,IAAU,GAC3DA,IAAU,EAEZ,IACT,CAGO,SAASM,GAAYN,EAAgB,CAAE,iBAAAO,EAAmB,EAAM,EAAI,CAAC,EAAiB,CAC3F,GAAIL,EAAMF,CAAK,GAAKK,GAASL,CAAK,EAChC,OAAOA,EAET,GAAII,EAASJ,CAAK,EAAG,CACnB,IAAMQ,EAAM,OAAOR,CAAK,EACxB,GAAI,CAAC,OAAO,MAAMQ,CAAG,EACnB,OAAOA,EAETR,EAAQO,EAAmBR,GAAUC,CAAK,EAAIA,CAChD,CACA,OAAIO,GAAoBJ,GAAUH,CAAK,EAC9B,OAAOA,CAAK,EAEd,IACT,CClCA,IAAMS,GAAuC,CAC3C,MAAS,qBACT,MAAS,cACT,MAAS,aACT,MAAS,YACT,MAAS,cACX,EAKMC,GAAuCC,GAAuBF,EAAoC,EAMlGG,GAAuB,OAAO,KAAKH,EAAoC,EACvEI,GAAyB,OAAO,OAAOJ,EAAoC,EAIjF,OAAO,OAAOA,EAAoC,EAClD,OAAO,OAAOC,EAAoC,EAClD,OAAO,OAAOE,EAAoB,EAClC,OAAO,OAAOC,EAAsB,EAI7B,IAAMC,GAAkCL,GAMxC,IAAMM,GAAqBC,GAGrBC,GAAuBC,GAGvBC,GAAyB,OAAO,OAAOF,GAAqB,IAAIG,GAAK,GAAGA,CAAC,UAAU,CAAC,ECxCjG,IAAMC,GAAgC,UAEzBC,GAAqB,kBAErBC,GAAiB,IAAIC,GAAO,CACvC,KAAM,CAAE,SAAU,UAAW,EAC7B,cAAe,CAAC,UAAU,EAC1B,aAAc,CAACA,GAAO,aAAa,YAAY,CAAE,mBAAoBH,EAA8B,CAAC,CAAC,CACvG,CAAC,EAEYI,GAAwBF,GAAe,SAAS,CAAE,aAAcD,EAAmB,CAAC,EAGjGI,GAAwB,CACtB,aAAc,CAACJ,EAAkB,CACnC,EAAG,EAAK,ECXP,OAAe,UAAYK,GAC3B,OAAe,aAAeC,GAE/B,SAASC,GAAoBC,EAAyB,CACpD,GAAIC,EAAMD,CAAS,GAAKA,GAAW,KAAK,EAAE,SAAW,EACnD,OAAO,KAET,IAAME,EAAUF,EAAU,MAAM,GAAG,EAAE,IAAIG,GAAMA,EAAG,MAAM,GAAG,CAAC,EAC5D,OAAQD,EAAQ,OAAS,EAAK,OAAO,YAAYA,CAAO,EAA8B,IACxF,CAEA,SAASE,GAAoBC,EAAyBC,EAA+B,GAAkC,CACrH,OAAIL,EAAMI,CAAS,EACV,KAE+BA,EAAU,MAAM,GAAG,EAAE,IAAIE,GAAKA,EAAE,MAAM,GAAG,CAAqB,EACxE,IAAI,CAAC,CAACC,EAAIC,CAAO,IAAM,CAC/C,CAAEH,GAAiC,CAAEI,GAAyC,SAASF,CAAE,GAC3FG,GAAO,MAAM,8BAA8BH,CAAE,GAAG,EAElD,IAAMI,EAAQJ,KAAMK,GAAmCA,GAAgCL,CAAE,EAA4B,KACrH,MAAO,CAAE,GAAAA,EAAI,KAAAI,EAAM,QAASE,GAAUL,EAAS,CAAE,gBAAiB,EAAK,CAAC,CAAE,CAC5E,CAAC,CAEH,CAEA,SAASM,GAAiBC,EAAiG,CACzH,GAAI,CAACC,EAASD,CAAiB,EAC7B,OAAO,KAET,IAAME,EAAMF,EAAkB,QAAQ,KAAM,EAAE,EAAE,MAAM,GAAG,EAAE,IAAIG,GAAKA,EAAE,KAAK,CAAC,EAC5E,OAAID,EAAI,SAAW,GAAMA,EAAI,SAAW,GAAKA,EAAI,CAAC,IAAM,IAAQA,EAAI,SAAW,GAAKA,EAAI,CAAC,IAAM,IAAMA,EAAI,CAAC,IAAM,GACvG,KAGA,CAAE,YAAaA,EAAI,CAAC,EAAG,UAAWA,EAAI,CAAC,CAAE,CAEpD,CAEA,SAASE,GACPC,EACAC,EACwC,CAExC,IAAMC,EAAoBD,EAAUD,CAAG,EACvC,GAAI,CAACG,GAAyB,SAASH,CAAG,EACxC,OAAOE,EAET,GAAIN,EAASM,CAAS,GAAKA,EAAU,KAAK,EAAE,SAAW,EACrD,OAAQF,EAAK,CACX,IAAK,eAAgB,OAAOP,GAAUS,CAAS,EAC/C,IAAK,YAAa,OAAO,IAAI,KAAKA,EAAU,QAAQ,MAAO,GAAG,CAAC,EAC/D,IAAK,UAAW,OAAOA,EACvB,IAAK,iBAAkB,OAAOE,GAAYF,CAAS,EACnD,IAAK,cAAe,OAAOT,GAAUS,CAAS,EAC9C,IAAK,YAAa,OAAOA,EACzB,IAAK,mBAAoB,OAAOE,GAAYF,CAAS,EACrD,IAAK,cAAe,OAAOA,EAC3B,IAAK,kBAAmB,OAAOE,GAAYF,CAAS,EACpD,IAAK,SAAU,OAAOnB,GAAoBmB,CAAS,EACnD,IAAK,oBAAqB,OAAOT,GAAUS,CAAS,EACpD,IAAK,cAAe,OAAOR,GAAiBQ,CAAS,EACrD,IAAK,QAAS,OAAOA,EACrB,QACE,OAAAZ,GAAO,KAAK,wBAAwBU,CAAa,qBAAqB,EAC/DE,CACX,CAEF,OAAO,IACT,CACA,SAASG,GAAgCC,EAA+C,CACtF,GAAI,CACF,GAAI1B,EAAM0B,CAAe,EACvB,OAAO,KAET,IAAMC,EAAc,CAAC,EACrB,QAAWC,KAAK,OAAO,KAAKF,CAAe,EAAiC,CAC1E,IAAMG,EAASV,GAAwBS,EAAGF,CAAe,EACrDI,EAASD,CAAM,IAChBF,EAAoBC,CAAC,EAAIC,EAE9B,CACA,OAAQ,OAAO,KAAKF,CAAW,EAAE,OAAS,EAAIA,EAAc,IAC9D,OACOI,EAAK,CACV,OAAArB,GAAO,MAAMqB,CAAG,EACT,IACT,CACF,CAEA,eAAeC,GAAeC,EAAqB,CACjD,GAAI,CACF,GAAIjC,EAAMiC,CAAK,EACb,OAAOA,EAET,IAAMC,EAAgB,IAAI,YAAY,EAAE,OAAOD,CAAK,EAC9CE,EAAa,MAAM,OAAO,OAAO,OAAO,UAAWD,CAAa,EAKtE,OAJkB,MAAM,KAAK,IAAI,WAAWC,CAAU,CAAC,EAEpD,IAAKC,GAAMA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAC1C,KAAK,EAAE,CAEZ,OACOL,EAAK,CACV,OAAArB,GAAO,MAAMqB,CAAG,EACT,IACT,CACF,CAEA,IAAMM,EAA2B,CAC/B,SAAU,KACV,SAAU,KACV,OAAQ,IACV,EAEA,SAASC,IAA0B,CACjC,QAAWC,IAAc,CAAC,iBAAkB,uBAAuB,EAAG,CACpE1C,GAAa0C,CAAU,EACvB,IAAMC,EAAiB,CAAE,OAAQ,qBAAsB,KAAM,IAAK,SAAU,KAAc,EACpFC,EAAkB,CACtB,KAAM,IACN,SAAU,MACV,GAAI,8BAA8B,KAAK,OAAO,SAAS,IAAI,EAAI,CAAE,OAAQ,OAAO,SAAS,IAAK,EAAI,CAAC,CACrG,EACA,QAAWC,IAAc,CAACF,EAAgBC,CAAe,EACnDX,EAASlC,GAAU2C,CAAU,CAAC,GAChC1C,GAAa0C,EAAYG,CAAU,EAGnCZ,EAASlC,GAAU2C,CAAU,CAAC,GAChC7B,GAAO,MAAM,8BAA8B6B,CAAU,SAAS,CAElE,CACF,CAEA,SAASI,GAAmBjB,EAAkD,CAC5E,GAAIV,EAASU,EAAgB,OAAO,GAAKA,EAAgB,QAAQ,KAAK,IAAM,QAC1E,MAAO,GAEJ,CACH,IAAMkB,EAASzC,GAAoBuB,EAAgB,OAAQ,EAAI,EAE/D,OADyBmB,GAAQD,CAAM,GAAKA,EAAO,OAAS,GAAKA,EAAO,OAAOE,GAAK9C,EAAM8C,EAAE,IAAI,CAAC,EAAE,SAAWF,EAAO,MAEvH,CACF,CAEA,eAAeG,GAA+B,CAAE,SAAAC,EAAU,OAAAC,EAAQ,SAAAC,CAAS,EAAkG,CAC3Kb,EAAyB,SAAWW,EACpCX,EAAyB,SAAWa,EAChClD,EAAMiD,CAAM,GAAKjC,EAASgC,CAAQ,GAAKA,IAAa,KACtDC,EAAS,MAAMjB,GAAegB,CAAQ,GAExCX,EAAyB,OAASY,CACpC,CAEA,eAAsBE,IAAqB,CACzC,IAAIC,EAAoBxD,GAAU,gBAAgB,GAAG,KAAK,GAAK,KAC3DyD,EAAU,MAAMrB,GAAeoB,CAAiB,EACpD,GAAItB,EAASO,EAAyB,MAAM,GAAKA,EAAyB,SAAWgB,GAAWvB,EAASO,EAAyB,QAAQ,GAAKP,EAASO,EAAyB,QAAQ,EACvL,OAAOA,EAAyB,SAElC,IAAIX,EAAkB5B,GAAoBsD,CAAiB,EACvDE,EAAS5B,CAAe,GAAKiB,GAAmBjB,CAAe,IAAM,KACvEY,GAAwB,EACxBc,EAAoB,KACpB1B,EAAkB,KAClB2B,EAAU,MAEZ,IAAME,EAA6B9B,GAAgCC,CAAe,EAClF,aAAMqB,GAA+B,CAAE,SAAUK,EAAmB,SAAUG,EAA4B,OAAQF,CAAQ,CAAC,EAC3HG,GAAc,MAAM,yBAA0BD,CAA0B,EACjEA,CACT,CAEO,SAASE,IAAyB,CACvC,IAAML,EAAoBxD,GAAU,gBAAgB,GAAG,KAAK,GAAK,KACjE,GAAIkC,EAASO,EAAyB,QAAQ,GACzCP,EAASO,EAAyB,QAAQ,GAC1Ce,IAAsBf,EAAyB,SAClD,OAAOA,EAAyB,SAElC,IAAMX,EAAkB5B,GAAoBsD,CAAiB,EAC7D,GAAIE,EAAS5B,CAAe,GAAKiB,GAAmBjB,CAAe,IAAM,GACvE,OAAAY,GAAwB,EACxBS,GAA+B,CAC7B,SAAU,KACV,SAAU,KACV,OAAQ,IACV,CAAC,EAAE,MAAMW,GAAKhD,GAAO,MAAMgD,CAAC,CAAC,EACtB,KAET,IAAMH,EAA6B9B,GAAgCC,CAAe,EAClF,OAAAM,GAAeoB,CAAiB,EAAE,KAAK,MAAMC,GACpCN,GAA+B,CAAE,SAAUK,EAAmB,SAAUG,EAA4B,OAAQF,CAAQ,CAAC,CAC7H,EAAE,MAAMtB,GAAOrB,GAAO,MAAMqB,CAAG,CAAC,EACjCyB,GAAc,MAAM,yBAA0BD,CAA0B,EACjEA,CACT,CCpMA,SAASI,GAA0BC,EAAoD,CACrF,GAAI,CAACC,EAASD,CAAe,EAC3B,OAAO,KAET,IAAME,EAAmBF,EAAgB,QAAQ,KAAM,EAAE,EAAE,QAAQ,KAAM,EAAE,EAAE,MAAM,GAAG,EAEhFG,EAAiC,CAAC,EAExC,QAAWC,KAAMC,GAAoB,CACnC,IAAMC,EAAOC,GAAgCH,CAAE,EAC/CD,EAAU,KAAK,CAAE,GAAAC,EAAI,KAAAE,EAAM,QAASJ,EAAiB,SAASE,CAAE,CAAE,CAAC,CACrE,CAEA,IAAMI,EAAqBN,EAAiB,OAAOO,GAAMJ,GAAyC,SAASI,CAAC,IAAM,EAAK,EACvH,QAAWC,KAAaF,EACtBL,EAAU,KAAK,CAAE,GAAIO,EAAW,QAAS,EAAK,CAAC,EAEjD,OAAOP,CACT,CAEA,SAASQ,IAAqD,CAC5D,IAAMC,EAAe,OAAO,qBAC5B,GAAIX,EAASW,CAAY,EAAG,CAC1B,IAAMC,EAAYd,GAA0Ba,CAAY,EACxD,GAAIE,GAAQD,CAAS,EACnB,OAAOA,CAEX,MAEEE,GAAc,MAAM,8BAA8B,EAEpD,OAAO,IACT,CAaA,SAASC,IAA2D,CAClE,IAAMC,EAAc,OAAO,SAE3B,GAAIC,EAASD,CAAW,EAAG,CACzB,IAAME,EAAUF,EAAY,oBAC5B,GAAIC,EAASC,CAAO,GAAKlB,EAASkB,EAAQ,WAAW,GAAKA,EAAQ,YAAY,KAAK,IAAM,GACvF,OAAOA,EAEJ,CACH,IAAMC,EAAMH,EAAY,qBAAqB,EAC7C,GAAIC,EAASE,CAAG,GAAKnB,EAASmB,EAAI,OAAO,GAAKA,EAAI,QAAQ,KAAK,EAAE,OAAS,EACxE,MAAO,CAAE,YAAaA,EAAI,QAAS,UAAWA,EAAI,KAAM,CAE5D,CACF,CACA,OAAO,IACT,CAEA,SAASC,IAA6C,CACpD,IAAMJ,EAAc,OAAO,SACrBK,EAAiC,CAAC,EAElCC,EAAiBZ,GAAwB,EAK/C,GAJIG,GAAQS,CAAc,IACxBD,EAAS,OAASC,GAGhBL,EAASD,CAAW,EAAG,CACzB,IAAME,EAAUH,GAA0B,EACtCE,EAASC,CAAO,IAClBG,EAAS,YAAcH,GAEzB,IAAMK,EAAaP,EAAY,gBAAgB,EAC/C,GAAIC,EAASM,CAAU,EAAG,CACxB,GAAM,CAAE,aAAAC,EAAc,cAAAC,EAAe,OAAAC,EAAQ,eAAAC,EAAgB,wBAAAC,EAAyB,aAAAC,EAAc,SAAAC,EAAU,SAAAC,CAAS,EAAIR,EAC3H,OAAO,OAAuCF,EAAU,CAAE,aAAAG,EAAc,cAAAC,EAAe,WAAYC,EAAQ,eAAAC,EAAgB,wBAAAC,EAAyB,aAAAC,EAAc,SAAAC,EAAU,SAAAC,CAAS,CAAC,CACxL,CACF,CACA,OAAQ,OAAO,KAAKV,CAAQ,EAAE,SAAW,EAAK,KAAOA,CACvD,CAIA,eAAsBW,IAAoB,CACxC,IAAMC,EAAsB,MAAMC,GAAmB,EAC/CC,EAAYf,GAAqB,EAEvC,OAAIgB,EAAMD,CAAS,EACbC,EAAMH,CAAmB,EACpB,KAEF,CAAE,GAAIA,CAAoB,GAE/BpB,GAAQsB,EAAU,MAAM,EAC1BrB,GAAc,MAAM,oCAAqC,CAAE,OAAQmB,GAAqB,OAAQ,IAAKE,EAAU,MAAO,CAAC,EAGvHrB,GAAc,MAAM,6CAA8C,CAAE,OAAQmB,GAAqB,MAAO,CAAC,EAE3GnB,GAAc,MAAM,2CAA4C,CAAE,OAAQmB,EAAqB,IAAKE,CAAU,CAAC,EACxG,CAAE,GAAIF,GAAuB,CAAC,EAAI,GAAIE,CAAU,EACzD,CAEO,SAASE,IAAyB,CACvC,IAAMC,EAASvB,GAA0B,EACzC,GAAIE,EAASqB,CAAM,EACjB,OAAOA,EAEJ,CACH,IAAML,EAAsBM,GAAuB,EACnD,GAAItB,EAASgB,CAAmB,GAC3BhB,EAASgB,EAAoB,WAAW,GACxCjC,EAASiC,EAAoB,YAAY,WAAW,GACnDA,EAAoB,YAAY,YAAY,KAAK,IAAM,GAE3D,OAAOA,EAAoB,WAE/B,CACA,OAAO,IACT,CAEA,OAAO,OAAO,OAAQ,CACpB,wBAAAvB,GACA,0BAAAZ,GACA,mBAAAoC,GACA,qBAAAd,GACA,kBAAAY,EACF,CAAC,ENpIM,IAAMQ,GAAc,CACzB,IAAI,qBAAsB,CACxB,OAAO,IACT,EACA,gBAAwC,CACtC,IAAMC,EAAeC,GAAuB,EACtCC,EAAcF,GAAc,aAAa,KAAK,GAAG,YAAY,EAC7DG,EAAYH,GAAc,WAAW,KAAK,GAAG,YAAY,EAC/D,OAAII,EAASF,CAAW,GAAKA,IAAgB,GACvCE,EAASD,CAAS,GAAKA,IAAc,GAChC,CAAE,YAAAD,EAAa,UAAAC,CAAU,EAGzB,CAAE,YAAAD,CAAY,EAIhB,IAEX,EACA,IAAI,OAAQ,CACV,OAAOG,GACL,KAAK,eAAe,EACpB,CAAE,aAAc,KAAK,mBAAoB,CAC3C,CACF,CACF,EAEaC,GAA2B,CACtC,IAAI,qBAAsB,CACxB,OAAO,IACT,EACA,gBAA8C,CAC5C,IAAMC,EAAgBC,GACtB,GAAI,cAAe,UAAW,CAC5B,IAAMC,EAAQ,UAAU,UAAU,OAAOC,GAC/BH,EAAoC,SAASG,CAAC,CACvD,EAED,GAAID,EAAM,SAAW,EACnB,OAAOA,EAAM,MAAM,CAEvB,CAEA,MAAI,aAAc,WAAcF,EAAoC,SAAS,UAAU,QAAQ,EACtF,UAAU,SAEZ,IACT,EACA,IAAI,OAAQ,CACV,OAAOF,GACL,KAAK,eAAe,EACpB,CAAE,aAAc,KAAK,mBAAoB,CAC3C,CACF,CACF,EAIaM,GAAoB,CAC/B,IAAI,qBAAsB,CACxB,OAAO,IACT,EAEA,+BAAgC,CAC9B,IAAIC,EAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAG,IAAI,OAAO,EACrE,GAAIR,EAASQ,CAAK,EAAG,CACnBA,EAASA,EAAM,YAAY,IAAM,KAAO,KAAOA,EAC/C,IAAIC,EAAUC,GAAW,mBAAmBF,CAAsB,EAElE,GADAC,IAAYC,GAAW,2BAA2BF,CAA8B,EAC5EG,EAASF,CAAO,EAClB,OAAOA,EAAQ,qBAEnB,CACA,OAAO,IACT,EACA,0BAA2B,CACzB,IAAMG,EAAcjB,GAAY,MAChC,GAAIgB,EAASC,CAAW,GAAKZ,EAASY,EAAY,WAAW,GAAKA,EAAY,YAAY,KAAK,IAAM,GAAI,CACvG,IAAMH,EAAUC,GAAW,mBAAmBE,EAAY,WAA4B,EACtF,GAAID,EAASF,CAAO,EAClB,OAAOA,EAAQ,qBAEnB,CACA,OAAO,IACT,EACA,wCAAyC,CACvC,IAAMG,EAAcjB,GAAY,MAChC,OAAIgB,EAASC,CAAW,GAAKZ,EAASY,EAAY,WAAW,GAAKA,EAAY,YAAY,KAAK,IAAM,GAC5FF,GAAW,2BAA2BE,EAAY,WAAoC,GAAG,uBAAyB,KAEpH,IACT,EACA,8BAA4D,CAC1D,OAAOV,GAAyB,KAClC,EACA,gBAA8C,CAC5C,OAAOD,GACL,KAAK,8BAA8B,EACnC,CAAE,OAAQ,IAAM,KAAK,yBAAyB,CAAE,EAChD,CAAE,OAAQ,IAAM,KAAK,6BAA6B,CAAE,EACpD,CAAE,OAAQ,IAAM,KAAK,uCAAuC,CAAE,CAChE,CACF,EACA,IAAI,OAAQ,CACV,OAAOA,GACL,KAAK,eAAe,EACpB,CAAE,aAAc,KAAK,mBAAoB,CAC3C,CACF,CACF,EOnHA,IAAMY,GAAqB,CAAE,GAAGC,EAAoB,EAG9CC,GAA6B,CAAE,GAAGC,EAA4B,EAGvDC,GAAe,OAAO,OAAO,CACxC,GAAGJ,GACH,GAAGE,EACL,CAAC,EAEA,OAAe,kBAAoBE,GCcpC,IAAMC,GAAiB,CACrB,OAAQ,qBACR,SAAU,qBACV,cAAe,qBACf,GAAI,qBACJ,OAAQ,CACN,SAAU,qBACV,SAAU,qBACV,QAAS,qBACT,QAAS,oBACX,CACF,EAGMC,GAAkB,OAAO,KAAKD,GAAe,MAAM,EAInDE,GACJ,2TACIC,GAEJ,0kDAGIC,GAAwB,wCAIxBC,GACJ,8OAEWC,GAAN,KAA8B,CACnC,wBACA,WACA,YACA,eAEA,cACA,WACA,gBAEA,uBACA,iCACA,gBACA,sBAEA,iBACA,gBACA,gBAEA,0BAEAC,GAEA,YAAY,CACV,gBAAAC,EACA,WAAAC,EACA,WAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,0BAAAC,CACF,EAQG,CACD,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,EACjC,KAAKT,GAAUQ,EAEf,KAAK,gBAAkBP,EACvB,KAAK,WAAaS,GAAYR,CAAU,EAAIA,EAAaS,EAAIT,CAAU,EACvE,KAAK,YAAcU,EAAS,IACnBC,EAAQ,KAAK,UAAU,EAAE,KACjC,EACD,KAAK,eAAiBD,EAAS,IACtB,aAAc,KAAK,YAAY,MAClC,KAAK,YAAY,MAAM,SACvB,IACL,EACD,KAAK,cAAgBA,EAAS,IAAM,CAClC,GAAI,SAAU,KAAK,YAAY,MAAO,CACpC,IAAME,EAAO,KAAK,YAAY,MAAM,KACpC,GAAI,UAAWA,EACb,OAAQA,EAAqD,MAAM,QAEvE,CACA,OAAO,IACT,CAAC,EACD,KAAK,WAAaX,EAElB,GAAM,CAAE,gBAAAY,EAAiB,0BAAAC,EAA2B,iCAAAC,EAAkC,8BAAAC,CAA8B,EAAIC,EAAe,CAAE,YAAa,yBAA0B,CAAC,EAEjL,KAAK,uBAAyBJ,EAC9B,KAAK,iCAAmCC,EACxC,KAAK,gBAAkBE,EACvB,KAAK,sBAAwBD,EAE7B,KAAK,iBAAmBN,EAAIP,CAAgB,EAE5C,KAAK,gBAAkBC,EACvB,KAAK,gBAAkBC,EAEvB,KAAK,0BAA4BC,EACjC,KAAK,wBAA0BI,EAAI,CAAC,CAAC,EAErCS,EACE,CAAC,IAAMP,EAAQ,KAAK,UAAU,EAAG,IAAMA,EAAQ,KAAK,uBAAuB,EAAG,IAAMA,EAAQ,KAAK,kBAAkB,CAAC,EACpH,IAAM,CACJ,IAAMQ,EAAY,KAAK,wBAAwB,MACzCC,EAAW,KAAKC,GAAW,EAE7BC,EAAMH,CAAS,IAAMG,EAAMF,CAAQ,GAAK,OAAO,KAAKA,CAAQ,EAAE,SAAW,IAGzE,KAAKG,GAAkBH,EAAUD,CAAS,IAAM,KAClD,KAAKrB,GAAQ,MAAMsB,CAAQ,EAC3B,KAAK,wBAAwB,MAAQA,EAEzC,EACA,CAAE,UAAW,EAAK,CACpB,CACF,CAEAG,GAAkBH,EAAkDD,EAAmD,CACrH,IAAMK,EAAU,OAAO,KAAKJ,CAAQ,EAC9BK,EAAW,OAAO,KAAKN,CAAS,EACtC,OAAIK,EAAQ,SAAWC,EAAS,OACvB,IAETD,EAAQ,KAAK,EACbC,EAAS,KAAK,EACOD,EAAQ,MAAM,CAACE,EAAKC,IAASD,IAAQD,EAASE,CAAG,CAAE,EAE/DH,EAAQ,MAAME,GAAO,CAC1B,IAAME,EAAOR,EAASM,CAAG,EACnBG,EAAOV,EAAUO,CAAG,EAC1B,OAAOE,IAASC,CAClB,CAAC,EAEI,GACT,CAEA,IAAI,yBAAkC,CACpC,OAAOC,GAAa,YAAY,KAClC,CACA,IAAI,oBAA6B,CAC/B,OAAOA,GAAa,iBAAiB,KACvC,CAGA,IAAI,YAAsB,CACxB,OAAOlC,GAAc,KAAK,KAAK,kBAAkB,CACnD,CACA,IAAI,cAAwB,CAC1B,OAAOD,GAAsB,KAAK,KAAK,kBAAkB,CAC3D,CACA,IAAI,eAAyB,CAC3B,OAAOH,GAAgB,OAAQuC,GAC7B,KAAK,mBAAmB,SAASA,CAAa,CAChD,EAAE,OAAS,CACb,CACA,IAAI,iBAAyC,CAC3C,IAAMC,EAAQxC,GAAgB,OAAQuC,GACpC,KAAK,mBAAmB,SAASA,CAAa,CAChD,EACA,OAAIC,EAAM,OAAS,EACVA,EAAM,CAAC,EAET,IACT,CAGA,IAAI,cAAuB,CAIzB,OAAI,KAAK,0BAA4B,GAC5B,KAAK,wBAGL,KAAK,qBAAuB,GAC5BzC,GAAe,OAGlB,KAAK,aACAA,GAAe,cAEf,KAAK,WACLA,GAAe,GAEf0C,EAAS,KAAK,eAAe,EAC5B1C,GAAe,OAAO,KAAK,eAAe,EAG3CA,GAAe,QAG5B,CAGA,IAAI,SAAkB,CACpB,OAAO,KAAK,eAAe,OAAO,SAAW,EAC/C,CAEA,IAAI,WAAgC,CAClC,IAAM2C,EAAQ,KAAK,YAAY,MAC/B,MAAO,SAAUA,EAAQA,EAAM,KAAO,EACxC,CACA,IAAI,mBAAoB,CACtB,IAAMA,EAAQ,KAAK,YAAY,MAC/B,GAAI,SAAUA,EAAO,CACnB,IAAMtB,EAAOsB,EAAM,KACnB,GAAI,aAActB,EAGhB,OAFgBA,EACI,SACT,QAEf,CACA,MAAO,CAAC,CACV,CAGA,IAAI,cAAwB,CAC1B,OAAOuB,EAAS,KAAK,cAAc,KAAK,CAC1C,CACA,IAAI,kBAA4B,CAC9B,OAAO,KAAK,mBAAmB,OAAS,CAC1C,CAGA,IAAI,gBAA0B,CAE5B,IAAMC,GACH,UAAU,WACT,UAAU,QACT,OAA8B,QACjC,GACF,OACE3C,GAAe,KAAK2C,CAAS,GAC7B1C,GAAe,KAAK0C,EAAU,UAAU,EAAG,CAAC,CAAC,CAEjD,CAGA,IAAI,UAAmB,CACrB,OAAON,GAAa,SAAS,KAC/B,CAEA,IAAI,WAAoB,CACtB,OAAOA,GAAa,UAAU,KAChC,CACA,IAAI,WAAoB,CACtB,OAAOA,GAAa,UAAU,KAChC,CAEA,IAAI,eAAgB,CAClB,MAAO,qBAAqB,KAAK,gBAAgB,YAAY,CAAC,EAChE,CAEA,IAAI,OAAgB,CAClB,OAAOA,GAAa,MAAM,KAC5B,CAEA,IAAI,eAAwB,CAC1B,OAAI,KAAK,mBAAqB,IAAQ,KAAK,kBAAkB,SAAW,EAC/D,KAAK,kBAAkB,CAAC,EAAE,MACzBnB,EAAQ,KAAK,UAAU,EAAE,MAAM,SAAS,eACzC,cAGA,EAEX,CAEA,IAAI,qBAA8B,CAChC,GAAG0B,GAA0B,SAAS,KAAK,eAA4C,GAClF,KAAK,cAAgB,KAAK,eAAiB,KAAK,cAAc,MAAM,CACrE,IAAMC,EAAqB,KAAK,cAAc,MAAM,SACpD,MAAO,gCAAgC,KAAK,eAAe,2BAA2BA,CAAkB,EAC1G,CAEF,GAAGL,EAAS,KAAK,yBAAyB,EACxC,OAAO,KAAK,0BAEd,GAAI,KAAK,mBAAqB,GAAO,MAAO,GAC5C,IAAMM,EAAc,KAAK,kBACtB,IAAKC,GAASA,EAAK,QAAQ,EAC3B,KAAK,GAAG,EACX,MAAO,gCAAgC,KAAK,eAAe,2BAA2BD,CAAW,EACnG,CAEA,IAAI,uBAAuC,CACzC,OAAQ,KAAK,kBAAoB,UAAY,KAAK,kBAAoB,SAAY,SAAS,SAAS,OAAS,IAC/G,CACA,IAAI,0BAAoC,CACtC,MAAG,EAAA5B,EAAQ,KAAK,UAAU,EAAE,MAAM,SAAS,cAI7C,CACA,IAAI,YAAoB,CACtB,OAAG,KAAK,cAAgB,KAAK,eAAiB,KAAK,cAAc,MACxD,KAAK,cAAc,MAAM,MAE3B,EACT,CACA,IAAI,kBAA2B,CAC7B,OAAG8B,GAAwB,SAAS,KAAK,eAA0C,GAAK,KAAK,kBAAoB,QACxG,KAAK,cAEXJ,GAA0B,SAAS,KAAK,eAA4C,EAC9E,KAAK,WAGP,EACT,CACAhB,IAAqD,CACnD,IAAMqB,EAAW,KAAK,gBAAgB,YAAY,EAC5CX,EAA8C,CAClD,SAAU,KAAK,iBAAiB,MAChC,iBAAkBW,EAClB,yBAA0BA,EAC1B,uBAAwB,KAAK,QAC7B,OAAQ,KAAK,WACb,YAAa,KAAK,aAClB,UAAW,KAAK,UAChB,UAAW,KAAK,UAChB,UAAW,KAAK,eAChB,eAAgB,KAAK,cACrB,iBAAkB,KAAK,SACvB,mBAAoB,KAAK,iBACzB,SAAU,KAAK,MACf,uBAAwB,KAAK,uBAC7B,iCAAkC,KAAK,iCACvC,sBAAuB/B,EAAQ,KAAK,qBAAqB,EACzD,gBAAiBA,EAAQ,KAAK,eAAe,EAC7C,oBAAqB,KAAK,oBAC1B,2BAA4B,KAAK,sBACjC,yBAA0B,KAAK,wBACjC,EAEMgC,EAAc,OAAO,KAAKZ,CAAa,EAA+B,OAAQL,GAC3EJ,EAAMS,CAAG,GAAKT,EAAMS,EAAIL,CAAG,CAAC,GAAKK,EAAIL,CAAG,IAAM,EACtD,EAED,QAAWkB,KAAQD,EACjB,OAAOZ,EAAIa,CAAI,EAEjB,OAAOb,CACT,CACF,ECnWA,IAAMc,GAAyCC,EAAkE,CAC/G,gBAAiB,kBACjB,wBAAyB,yBAC3B,CAAC,EAEM,SAASC,GAA2BC,EAKxC,CACD,GAAIC,EAA2BJ,EAAsC,EACnE,OAEF,IAAMK,EAAaF,EAAQ,WACrBG,EAAaH,EAAQ,WACrBI,EAAkBJ,EAAQ,gBAE1B,CAAE,aAAAK,CAAa,EAAIC,EAAgB,CAAE,YAAa,yBAA0B,CAAC,EAC7E,CAAE,gBAAAC,EAAiB,gBAAAC,CAAgB,EAAIC,GAAgB,CAAE,YAAa,8BAA+B,CAAC,EAEtGC,EAA4BV,EAAQ,0BACpCW,EAA0B,IAAIC,GAAwB,CAC1D,WAAAV,EACA,WAAAC,EACA,gBAAAC,EACA,iBAAkBC,EAAa,iBAC/B,gBAAAE,EACA,gBAAAC,EACA,0BAAAE,CACF,CAAC,EACDG,EACEhB,GAAuC,wBACvCc,CACF,CACF,CAEO,SAASG,GAA0B,CAAE,YAAAC,CAAY,EAA0C,CAAC,EAAG,CACpG,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,EACjC,GAAI,CACFF,IAAgB,4BAChB,GAAM,CAAE,eAAAG,CAAe,EAAIC,GAAwB,CAAE,YAAAJ,CAAY,CAAC,EAE5DJ,EAA0BS,EAAuBvB,GAAuC,uBAAuB,EAErH,OAAO,OAAO,OAAO,CACnB,wBAAAc,EACA,iBAAkB,CAChB,GAAIU,EAAMH,EAAe,KAAK,EAC5B,MAAM,IAAI,MAAM,wBAAwB,EAE1C,IAAMI,EAASC,EAAQZ,EAAwB,uBAAuB,EACtEO,EAAe,MAAM,UAAUI,CAAM,CACvC,CACF,CAAC,CACH,OACOE,EAAK,CACV,MAAAR,EAAO,MAAM,uBAAuBD,GAAe,SAAS,EAAE,EACxDS,CACR,CACF,CC1DA,SAASC,EAIP,CAAE,KAAAC,EAAM,YAAAC,EAAa,YAAAC,CAAY,EACnC,CACE,IAAMC,EAAYD,GAAeF,EACjC,MAAO,CACL,KAAM,WAAWC,CAAW,GAC5B,YAAAA,EACA,KAAAD,EACA,YAAaG,EACb,eAAgB,EAClB,CACF,CAEA,SAASC,EACP,CAAE,YAAAH,CAAY,EAEhB,CACE,MAAO,CACL,KAAM,WAAWA,CAAW,GAC5B,YAAAA,EACA,KAAM,SACN,YAAa,SACb,eAAgB,EAClB,CACF,CAEO,IAAMI,GAA6B,CACxC,UAAWN,EAA2B,CACpC,YAAa,YACb,KAAM,MACR,CAAC,EACD,SAAUA,EAA2B,CACnC,YAAa,WACb,KAAM,MACR,CAAC,EACD,MAAOA,EAA2B,CAChC,YAAa,QACb,KAAM,OACR,CAAC,EACD,QAASA,EAA2B,CAClC,YAAa,UACb,KAAM,QACR,CAAC,EACD,MAAOA,EAA2B,CAChC,YAAa,QACb,KAAM,QACR,CAAC,EACD,MAAOA,EAA2B,CAChC,YAAa,QACb,KAAM,KACR,CAAC,EACD,QAASA,EAA2B,CAClC,YAAa,UACb,KAAM,MACR,CAAC,EACD,QAASA,EAA2B,CAClC,YAAa,UACb,KAAM,QACR,CAAC,EACD,SAAUA,EAA2B,CACnC,YAAa,WACb,KAAM,QACR,CAAC,EACD,cAAeA,EAA2B,CACxC,YAAa,gBACb,KAAM,QACR,CAAC,EACD,gBAAiBA,EAA2B,CAC1C,YAAa,kBACb,KAAM,UACR,CAAC,EACD,iBAAkBA,EAA2B,CAC3C,YAAa,mBACb,KAAM,UACR,CAAC,EACD,iCAAkCA,EAA2B,CAC3D,YAAa,mCACb,KAAM,UACR,CAAC,EACD,4BAA6BA,EAA2B,CACtD,YAAa,8BACb,KAAM,QACR,CAAC,EACD,6BAA8BA,EAA2B,CACvD,YAAa,+BACb,KAAM,UACR,CAAC,CACH,EAMaO,GAAyB,CACpC,iBAAkBF,EAA6B,CAAE,YAAa,kBAAmB,CAAC,EAClF,SAAUA,EAA6B,CAAE,YAAa,UAAW,CAAC,EAClE,OAAQA,EAA6B,CAAE,YAAa,QAAS,CAAC,EAC9D,iBAAkBA,EAA6B,CAAE,YAAa,kBAAmB,CAAC,EAClF,eAAgBA,EAA6B,CAAE,YAAa,gBAAiB,CAAC,EAC9E,UAAWA,EAA6B,CAAE,YAAa,WAAY,CAAC,EACpE,YAAaA,EAA6B,CAAE,YAAa,aAAc,CAAC,EACxE,UAAWA,EAA6B,CAAE,YAAa,WAAY,CAAC,EACpE,uBAAwBA,EAA6B,CAAE,YAAa,wBAAyB,CAAC,EAC9F,mBAAoBA,EAA6B,CAAE,YAAa,oBAAqB,CAAC,EACtF,oBAAqBA,EAA6B,CAAE,YAAa,qBAAsB,CAAC,EACxF,yBAA0BA,EAA6B,CAAE,YAAa,0BAA2B,CAAC,EAClG,SAAUA,EAA6B,CAAE,YAAa,UAAW,CAAC,EAClE,UAAWA,EAA6B,CAAE,YAAa,WAAY,CAAC,EACpE,2BAA4BA,EAA6B,CAAE,YAAa,4BAA6B,CAAC,EACtG,uBAAwBA,EAA6B,CAAE,YAAa,wBAAyB,CAAC,EAC9F,iCAAkCA,EAA6B,CAAE,YAAa,kCAAmC,CAAC,EAClH,gBAAiBA,EAA6B,CAAE,YAAa,iBAAkB,CAAC,EAChF,sBAAuBA,EAA6B,CAAE,YAAa,uBAAwB,CAAC,EAC5F,yBAA0BA,EAA6B,CAAE,YAAa,0BAA2B,CAAC,CACpG,EAIaG,GAAsB,CACjC,GAAIF,GACJ,GAAIC,EACN,EC9IO,SAASE,GAGdC,EAC6B,CAE7B,IAAIC,EAAM,EAAED,CAAS,EAAE,IAAI,GAAK,KAChC,OAAAC,EAAMC,EAASD,CAAG,GAAKA,EAAI,KAAK,EAAE,SAAW,EAAI,KAAOA,EACjDA,CACT,CCpBA,IAAME,GAA4B,mBAE5BC,GAAqC,sCAErCC,GAAwB,IAAI,MAAMF,EAAyB,EAC3DG,GAAgB,IAAI,IAE1B,SAASC,GAA0BC,EAAiD,CAClF,IAAMC,EAAYC,EAASF,CAAa,EAAIA,EAAgBA,EAAc,aAAaJ,EAAkC,GAAK,GAC9H,GAAIK,IAAc,GAAI,CACpB,IAAME,EAAcL,GAAc,IAAIG,CAAS,GAAK,KAChDE,IAAgB,OAClB,cAAcA,CAAW,EACzBL,GAAc,OAAOG,CAAS,EAElC,CACF,CAEA,SAASG,GAA6BC,EAA0C,CAC9E,IAAIC,EAAUD,EAAQ,MAEhBJ,EAAY,QAAU,OAAO,WAAW,EAE9C,OAAAI,EAAQ,aAAaT,GAAoCK,CAAS,EAClEH,GAAc,IAAIG,EAAW,YAAY,UAAY,CACnD,GAAI,SAAS,iBAAiB,IAAIL,EAAkC,KAAKK,CAAS,IAAI,EAAE,SAAW,EAEjGF,GAA0BE,CAAS,MAEhC,CACH,IAAMM,EAASF,EAAQ,MACnBE,IAAWD,IACbA,EAAUC,EACVF,EAAQ,aAAa,QAASE,CAAM,EACpCF,EAAQ,cAAcR,EAAqB,EAE/C,CACF,EAAG,GAAG,CAAC,EACAI,CACT,CAEO,IAAMO,GAA4B,CACvC,SAAUJ,GACV,YAAaL,GACb,UAAWJ,EACb,EC9CO,IAAMc,GAAmB,CAAC,QAAS,SAAU,UAAU,EAGjDC,GAAqC,CAChD,WACA,QACA,OACA,iBACA,QACA,OACA,SACA,QACA,SACA,WACA,QACA,QACA,SACA,SACA,MACA,OACA,OACA,MACA,MACF,EAKaC,GAAoB,CAC/B,GAAGC,GAAYH,GAAkB,OAAO,EACxC,GAAGC,EACL,EC7BA,SAASG,GAAmBC,EAAsD,CAChF,OAAOA,EAAM,QAAQ,uBAAuB,CAC9C,CAUA,SAASC,GACPC,EAEF,CAEE,GAAIC,EAAsBD,EAAWE,EAAgB,EACnD,OAAOF,EAEJ,GAAIC,EAAsBD,EAAWG,EAAkC,EAC1E,MAAO,eAAgBH,CAAU,KAEnCI,EAAgBJ,CAAS,CAC3B,CAEO,SAASK,GAAsI,CACpJ,SAAAC,EAAU,UAAAN,EAAW,WAAAO,EAAa,OAAO,SAAU,wBAAAC,CACrD,EAMA,CAGE,IAAMC,EAAoD,CAAE,GAAGF,EAAW,iBAA8BD,CAAQ,CAAE,EAAE,OAAOT,EAAiB,EAEtIa,EAAgCX,GAAyBC,CAAS,EAElEW,EAAmJ,CAAC,EACpJC,EAAmD,CAAC,EAE1D,QAAWC,KAAMJ,EACXI,EAAG,QAAQH,CAA6B,GAGnCF,IAA4B,GAFnCG,EAAoB,KAAKE,CAAgD,EAOzED,EAAsB,KAAKC,CAAE,EAGjC,GAAID,EAAsB,OAAS,EAAE,CACnC,IAAME,EAASF,EAAsB,IAAIC,GAChC,IAAI,MAAM,gCAAiCP,CAAS,uCAAuCN,CAAS,aAAc,OAAO,UAAU,SAAS,KAAKa,CAAE,CAAE,IAAK,CAAE,MAAOA,CAAG,CAAC,CAC/K,EACD,MAAIC,EAAO,SAAW,EACdA,EAAO,CAAC,EAGR,IAAI,eAAeA,EAAQ,qCAAqC,CAE1E,CAEA,OAAOH,CACT,CAGO,SAASI,GAAiI,CAC/I,SAAAT,EAAU,UAAAN,EAAW,WAAAO,EAAa,OAAO,SAAU,wBAAAC,CACrD,EAMA,CAEE,IAAMQ,EAAwBX,GAAqB,CAAE,SAAAC,EAAU,UAAAN,EAAW,WAAAO,EAAY,wBAAyBC,IAA4B,EAAM,CAAC,EAElJ,GAAIQ,EAAsB,SAAW,EACnC,OAAO,KAET,GAAIA,EAAsB,OAAS,EACjC,MAAM,IAAI,MAAM,yDAAyDV,CAAQ,IAAK,CAAE,MAAOU,CAAsB,CAAC,EAGxH,OAAOA,EAAuB,CAAE,CAClC,CCzFO,SAASC,GACdC,EACAC,EACAC,EAEF,CAGE,IAAMC,EAAsBC,GAAqBH,CAAU,EAAG,YAE1DI,EACJ,GACA,CAME,GALAA,EAAUC,GAAgB,CACxB,SAAU,IAAKL,CAAU,YAAaA,CAAU,KAChD,UAAWE,EACX,WAAYH,CACd,CAAC,EACGK,GAAW,KAEb,OAAO,IAGX,OACOE,EACP,CACE,MAAAL,EAAO,MAAM,0EAA2ED,CAAU,IAAKM,CAAG,EACpG,IAAI,MAAM,0EAA2EN,CAAU,IAAK,CAAE,MAAOM,CAAI,CAAC,CAC1H,CAEA,OADuBF,EAAQ,QAAQ,YAAY,IAC5B,IAErBH,EAAO,KAAK,SAAUD,CAAU,iCAAiC,EAE5DI,CACT,CC7BO,SAASG,GAIb,CACD,UAAAC,EACA,aAAAC,EACA,YAAAC,EACA,SAAAC,CACF,EAMA,CACE,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,CAAE,YAAa,4BAA6B,CAAC,EACxE,CAAE,eAAAC,EAAgB,uBAAAC,CAAuB,EAAIC,GAAwB,CACzE,YAAAN,CACF,CAAC,EACK,CAAE,UAAAO,CAAU,EAAIC,GAAa,CAAE,YAAAR,CAAY,CAAC,EAElDD,EAAeU,EAASV,CAAY,GAAKA,EAAa,KAAK,IAAM,GAAK,KAAOA,EAC7E,IAAMW,EAAeC,EAA8B,IAAM,CACvD,GAAIC,EAAMR,EAAe,KAAK,EAC5B,OAAO,KAET,IAAMS,EAAoBR,EAAuB,MACjD,GAAIO,EAAMC,CAAiB,GAAKA,EAAkB,SAAW,EAC3D,OAAO,KAET,IAAMC,EAAYP,EAAU,MAC5B,GAAIQ,EAAsBD,EAAW,CAAC,aAAc,UAAW,qBAAqB,CAAC,EACnF,OAAO,KAET,GAAIC,EAAsBD,EAAW,CAAC,QAAS,cAAe,WAAW,CAAC,EAAG,CAC3E,IAAIE,EAAKC,GAAuBJ,EAAkB,IAAI,CAAC,EAAGf,EAAWI,CAAM,EAC3E,OAAIc,IAAO,OACTZ,EAAe,OAAO,gBAAgB,CAAE,CAACN,CAAS,EAAG,EAAG,CAAC,EACzDkB,EAAKC,GAAuBJ,EAAkB,IAAI,CAAC,EAAGf,EAAWI,CAAM,GAElEc,CACT,MACEE,EAAgBJ,CAAS,CAE7B,CAAC,EAEKK,EAAc,CAClBC,EACAC,IACG,CACH,GAAIT,EAAMQ,CAAS,EACjB,OAEFC,EAAQZ,EAASY,CAAK,GAAKA,EAAM,KAAK,EAAE,SAAW,EAAI,KAAOA,EAC9D,IAAMC,EAAQrB,EAASmB,CAAS,EAC5BC,IAAUC,IACRC,GAAUF,CAAK,EAEfD,aAAqB,kBACrBA,EAAU,OAAS,WAEnB,EAAEA,CAAS,EAAE,KAAK,UAAWC,CAAK,EAElC,EAAED,CAAS,EAAE,IAAIC,EAAM,SAAS,CAAC,EAGnC,EAAED,CAAS,EAAE,IAAIC,GAAS,EAAE,EAGlC,EAEMG,EAAaC,GAAoB,IAAMf,EAAa,MAAO,CAC/D,KAAM,CACJ,OAAOE,EAAMF,EAAa,KAAK,EAAG,KAAOT,EAASS,EAAa,KAAK,CACtE,EACA,IAAIW,EAAmD,CACrD,IAAMD,EAAYV,EAAa,MAC/B,GAAIE,EAAMQ,CAAS,EACjB,OAEF,IAAME,EAAQrB,EAASmB,CAAS,EAC1BM,EAAUjB,EAASY,CAAK,GAAKA,EAAM,KAAK,IAAM,GAAM,KAAOA,GAAS,KACtEK,IAAWJ,GAGfH,EAAYC,EAAWM,CAAM,CAC/B,CACF,CAAC,EAEKC,EAAgB,IAAM,CAC1BH,EAAW,QAAQ,CACrB,EAEII,EAAwB,GACxBC,EAA8B,GAClC,OAAAC,GACEpB,EACAqB,GAA0B,UAC1BJ,CACF,EAEAK,GAAY,IAAM,CAChB,IAAMZ,EAAYV,EAAa,MAC/B,GAAIE,EAAMQ,CAAS,EAAG,CAChBS,IAAgC,KAClCE,GAA0B,YAAYF,CAA2B,EACjEA,EAA8B,IAEhC,MACF,CAMA,GAJIA,IAAgC,KAClCA,EAA8BE,GAA0B,SAASX,CAAS,GAGxEQ,IAA0B,GAAO,CACnC,GAAI,CAAChB,EAAMb,CAAY,EAAG,CACxB,IAAIkC,EAAU,EAAEb,CAAS,EAAE,IAAI,GAAK,KAChCX,EAASwB,CAAO,GAAKA,EAAQ,KAAK,IAAM,KAC1CA,EAAU,OAGRA,IAAY,IAAMrB,EAAMqB,CAAO,KACjCT,EAAW,MAAQzB,EAEvB,CACA6B,EAAwB,EAC1B,CACF,CAAC,EACM,CAAE,aAAAlB,EAAc,WAAAc,CAAW,CACpC,CCxGO,SAASU,GAGd,CACA,UAAAC,EACA,gBAAAC,EACA,SAAAC,EACA,YAAAC,CACF,EAKG,CAMD,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,CAAE,YAAa,0BAA2B,CAAC,EACtEC,EAAmCJ,IACvCK,GAAOC,GAAwBD,CAAE,GAGnC,GAAI,CACFJ,IAAgB,uBAChB,IAAMM,EACJC,EAAST,EAAgB,KAAK,GAAKA,EAAgB,MAAM,KAAK,IAAM,GAChE,KACAA,EAAgB,MAChB,CAAE,aAAAU,EAAc,WAAAC,CAAW,EAAIC,GAA2B,CAC9D,UAAAb,EACA,aAAAS,EACA,YAAAN,EACA,SAAUG,CACZ,CAAC,EACD,OAAAQ,EACE,IAAMb,EAAgB,MACrBc,GAAU,CACT,IAAMC,EAAMN,EAASK,CAAK,GAAKA,EAAM,KAAK,IAAM,GAAK,KAAOA,EAC5DH,EAAW,MAAQI,CACrB,CACF,EACO,CAAE,aAAAL,EAAc,gBAAAV,CAAgB,CACzC,OAASgB,EAAK,CACZ,MAAAb,EAAO,MAAM,uBAAuBD,GAAe,SAAS,EAAE,EACxDc,CACR,CACF,CCpFO,IAAMC,GAAkCC,GAEtC,EAAEA,CAAS,EAAE,KAAK,SAAS,IAAM,GC2B1C,IAAMC,GAAsCC,EAA+D,CACzG,yBAA0B,0BAC5B,CAAC,EAGM,SAASC,GAA2EC,EAAoD,CAC7I,GAAIC,EAA2BJ,EAAmC,EAChE,OAGF,IAAMK,EAAmB,OAAO,YAC9BF,EAAoB,IAAKG,GAAU,CAACA,EAAOC,GAAoBD,CAAK,CAAC,CAAC,CACxE,EAEME,EAA2BC,EAC/BN,EAAoB,OAClB,CAACO,EAA8CC,IAAmC,CAChF,IAAMC,EAAkBC,EAAqE,IAAI,EACjG,OAAAC,GAAqB,CACnB,UAAWT,EAAiBM,CAAU,EAAE,YACxC,gBAAiBC,EACjB,YAAa,yBACf,CAAC,EACDF,EAAOC,CAAU,EAAIC,EACdF,CACT,EACA,CAAC,CACH,CACF,EAEAK,EACEf,GAAoC,yBAEpCQ,CACF,CACF,CC3CA,IAAMQ,GAA0BC,EAAwE,CACtG,eAAgB,gBAClB,CAAC,EAED,SAASC,GAAiBC,EAA6BC,EAA6C,CAElG,IAAMC,EADsBC,GAA0BH,EAAa,sBAAsB,EAC5C,cAC7C,OAAQC,EAAoB,CAC1B,IAAK,cAAe,MAAQ,gBAAiBC,EAAoBA,EAAiB,YAAc,CAAC,EACjG,IAAK,cAAe,MAAQ,gBAAiBA,EAAoBA,EAAiB,YAAc,CAAC,EACjG,IAAK,WAAY,MAAQ,aAAcA,EAAoBA,EAAiB,SAAW,CAAC,EACxF,QAASE,EAAgBH,CAAkB,CAC7C,CACF,CAEO,SAASI,IAAqB,CACnC,GAAIC,EAA2BT,EAAuB,EACpD,OAGF,GAAM,CAAE,aAAAU,CAAa,EAAIC,EAAgB,CAAE,YAAa,oBAAqB,CAAC,EACxE,CAAE,8BAAAC,CAA8B,EAAIC,EAAe,CAAE,YAAa,oBAAqB,CAAC,EAExFC,EAAgBZ,GAAiBQ,EAA+BE,EAA8B,KAAK,EAGnGG,EAAiB,OAAO,YAC5BD,EAAc,IAAKE,GAAU,CAACA,EAAOC,GAAoBD,CAAK,CAAC,CAAU,CAC3E,EAEAE,EAAQlB,GAAwB,eAA2Ee,CAAc,CAC3H,CAEO,SAASI,GAAmB,CAAE,YAAAC,CAAY,EAA0C,CAAC,EAAG,CAC7F,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,EACjC,GAAI,CACFF,IAAgB,oBAChB,GAAM,CAAE,aAAAV,CAAa,EAAIC,EAAgB,CAAE,YAAAS,CAAY,CAAC,EAClD,CAAE,8BAAAR,CAA8B,EAAIC,EAAe,CAAE,YAAAO,CAAY,CAAC,EAClEN,EAAgBZ,GAAiBQ,EAA+BE,EAA8B,KAAK,EAKzG,MAAO,CAAE,eADcW,EAAuBvB,GAAwB,cAAyE,CACvH,CAC1B,OACOwB,EAAK,CACV,MAAAH,EAAO,MAAM,uBAAuBD,GAAe,SAAS,EAAE,EACxDI,CACR,CACF,CC3CA,IAAMC,GAAgCC,EAAyD,CAC7F,iBAAkB,mBAClB,kBAAmB,oBACnB,oBAAqB,qBACvB,CAAC,EAGM,SAASC,IAAmB,CACjC,GAAIC,EAA2BH,EAA6B,EAC1D,OAEF,GAAM,CAAE,aAAAI,CAAa,EAAIC,EAAgB,CAAE,YAAa,oCAAqC,CAAC,EACxF,CAAE,8BAAAC,CAA8B,EAAIC,EAAe,CAAE,YAAa,oCAAqC,CAAC,EAExGC,EAAmBJ,EAAa,cAEhCK,EAAmBC,EAAS,IAAM,CACtC,IAAMC,EAAcL,EAA8B,MAClD,GAAIK,KAAeH,EAAkB,CACnC,IAAMI,EAASJ,EAAiBG,CAAW,EAC3C,GAAIE,GAAcD,CAAM,EACtB,OAAOA,CAEX,CACA,MAAM,IAAI,MACR,qBAAqBD,CAAW,qEAAqEP,EAAa,eAAe,GACnI,CACF,CAAC,EAEKU,EAAoBJ,EAAiC,IAClDD,EAAiB,MAAM,OAAOM,GAClCC,GAA2C,SAASD,CAAC,CACxD,CACD,EAEKE,EAAsBP,EAAmC,IACtDD,EAAiB,MAAM,OAAOM,GAClCG,GAA6C,SAASH,CAAC,CAC1D,CACD,EAEDI,EAAQnB,GAA8B,iBAAkBoB,GAASX,CAAgB,CAAC,EAClFU,EAAQnB,GAA8B,kBAAmBoB,GAASN,CAAiB,CAAC,EACpFK,EAAQnB,GAA8B,oBAAqBoB,GAASH,CAAmB,CAAC,CAC1F,CC3EO,IAAMI,GAAmB,CAC9B,gBACA,iBACA,SACA,cACA,gBACA,UACA,UACA,iBACA,UACA,SACA,WACA,aACA,sBACA,YACA,UACA,QACA,YACA,UACA,aACA,UACA,UACA,aACA,WACA,UACA,UACA,SACA,QACA,UACA,SACA,kCACA,mCACA,yBACA,WACA,gBACA,SACA,iCACA,oBACA,WACA,eACA,UACA,WACA,WACA,aACA,iBACA,2BACA,OACA,QACA,QACA,mBACA,0BACA,WACA,UACA,QACA,6BACA,eACA,aACA,gBACA,UACA,OACA,aACA,SACA,iBACA,UACA,WACA,WACA,qBACA,aACA,UACA,QACA,cACA,oBACA,UACA,UACA,WACA,8BACA,gBACA,OACA,UACA,SACA,gBACA,mBACA,8BACA,QACA,SACA,UACA,UACA,QACA,YACA,SACA,YACA,UACA,aACA,OACA,YACA,WACA,SACA,gBACA,SACA,QACA,oCACA,gCACA,WACA,YACA,UACA,UACA,QACA,YACA,4BACA,OACA,UACA,cACA,SACA,QACA,UACA,QACA,SACA,SACA,aACA,QACA,WACA,iCACA,qBACA,SACA,aACA,mCACA,SACA,UACA,UACA,UACA,yBACA,gBACA,YACA,aACA,QACA,iCACA,aACA,SACA,WACA,WACA,OACA,QACA,mBACA,aACA,aACA,YACA,UACA,SACA,kCACA,uBACA,SACA,WACA,aACA,aACA,UACA,aACA,UACA,UACA,QACA,QACA,cACA,uBACA,gBACA,cACA,YACA,QACA,UACA,OACA,iBACA,2BACA,SACA,OACA,WACA,QACA,kCACA,SACA,mBACA,WACA,cACA,WACA,SACA,WACA,cACA,QACA,UACA,UACA,qBACA,SACA,sBACA,wBACA,cACA,6BACA,4BACA,mCACA,QACA,aACA,wBACA,eACA,UACA,SACA,wBACA,aACA,eACA,YACA,4BACA,WACA,WACA,kBACA,UACA,eACA,+BACA,cACA,QACA,YACA,gCACA,QACA,WACA,yBACA,YACA,SACA,cACA,uBACA,SACA,aACA,+BACA,WACA,cACA,OACA,UACA,QACA,sBACA,UACA,SACA,eACA,2BACA,SACA,SACA,UACA,uBACA,UACA,4BACA,aACA,UACA,oCACA,WACA,wBACA,0BACA,oBACA,iBACA,QACA,SACA,UACF,EC5PA,IAAMC,GAAiB,CACrB,CAAE,KAAM,UAAW,KAAM,IAAK,EAC9B,CAAE,KAAM,UAAW,KAAM,IAAK,EAC9B,CAAE,KAAM,WAAY,KAAM,IAAK,EAC/B,CAAE,KAAM,UAAW,KAAM,IAAK,EAC9B,CAAE,KAAM,SAAU,KAAM,IAAK,EAC7B,CAAE,KAAM,iBAAkB,KAAM,IAAK,EACrC,CAAE,KAAM,UAAW,KAAM,IAAK,EAC9B,CAAE,KAAM,UAAW,KAAM,IAAK,EAC9B,CAAE,KAAM,UAAW,KAAM,IAAK,EAC9B,CAAE,KAAM,SAAU,KAAM,IAAK,EAC7B,CAAE,KAAM,UAAW,KAAM,IAAK,EAC9B,CAAE,KAAM,SAAU,KAAM,IAAK,EAC7B,CAAE,KAAM,UAAW,KAAM,IAAK,EAC9B,CAAE,KAAM,UAAW,KAAM,IAAK,EAC9B,CAAE,KAAM,UAAW,KAAM,IAAK,EAC9B,CAAE,KAAM,QAAS,KAAM,IAAK,EAC5B,CAAE,KAAM,SAAU,KAAM,IAAK,EAC7B,CAAE,KAAM,gBAAiB,KAAM,IAAK,EACpC,CAAE,KAAM,YAAa,KAAM,IAAK,EAChC,CAAE,KAAM,aAAc,KAAM,IAAK,EACjC,CAAE,KAAM,QAAS,KAAM,IAAK,EAC5B,CAAE,KAAM,cAAe,KAAM,IAAK,EAClC,CAAE,KAAM,SAAU,KAAM,IAAK,EAC7B,CAAE,KAAM,SAAU,KAAM,IAAK,EAC7B,CAAE,KAAM,WAAY,KAAM,IAAK,EAC/B,CAAE,KAAM,UAAW,KAAM,IAAK,EAC9B,CAAE,KAAM,WAAY,KAAM,IAAK,EAC/B,CAAE,KAAM,WAAY,KAAM,IAAK,EAC/B,CAAE,KAAM,QAAS,KAAM,IAAK,EAC5B,CAAE,KAAM,SAAU,KAAM,IAAK,EAC7B,CAAE,KAAM,iBAAkB,KAAM,IAAK,CACvC,EAEMC,GAAoBD,GAAe,IAAIE,GAAKA,EAAE,IAAI,EAClDC,GAAoBH,GAAe,IAAIE,GAAKA,EAAE,IAAI,EAExD,OAAO,OAAOF,EAAc,EAC5B,OAAO,OAAOC,EAAiB,EAC/B,OAAO,OAAOE,EAAiB,EAMxB,IAAMC,GAAkBC,GCjC/B,IAAMC,GAAcC,GAGpB,SAASC,GAAcC,EAAsC,CAC3D,OAAOC,EAASD,CAAK,GAAOH,GAAkC,SAASG,CAAK,CAC9E,CAEA,IAAME,GAAmB,CAAE,KAAM,IAAK,EAGtC,SAASC,GAAmBH,EAA2C,CACrE,OAAOC,EAASD,CAAK,GAAOE,GAAuC,SAASF,CAAK,CACnF,CAGA,IAAMI,GAAqB,OAAO,OAAOC,GAAgB,OAAOC,GAASH,GAAmBG,CAAI,IAAM,EAAM,CAAC,EAE7G,SAASC,GAAqBP,EAA6C,CACzE,OAAOC,EAASD,CAAK,GAAOI,GAAyC,SAASJ,CAAK,CACrF,CAKO,IAAMQ,GAAN,KAAkJ,CAEvJ,YAAY,CAAE,gBAAAC,EAAiB,gBAAAC,EAAiB,OAAAC,CAAO,EAAsG,CAC3J,KAAKC,GAAUD,EACf,KAAKE,GAAmBH,EAExB,KAAKI,GAAQ,OAAO,OAAO,CACzB,kBAAmB,UACnB,kBAAmBL,CACrB,CAAC,EAEDM,GAAiB,OAAQ,wBAAyB,IAAM,CACtD,KAAKH,GAAQ,MAAM,8BAA8B,EACjD,KAAKI,GAA+B,EAAE,MAAM,QAAQ,KAAK,CAC3D,CAAC,EACD,KAAKA,GAA+B,EAAE,MAAM,QAAQ,KAAK,CAC3D,CAEA,KAAMA,IAAiC,CACrC,IAAMC,EAAW,MAAMC,GAAkB,EACzC,KAAKN,GAAQ,MAAM,+BAAgC,CAAE,SAAAK,CAAS,CAAC,EAC3DE,EAASF,CAAQ,GAAKE,EAASF,EAAS,WAAW,GAAKG,EAASH,EAAS,YAAY,WAAW,EACnG,KAAKI,GAAqB,MAAQ,CAAE,YAAaJ,EAAS,YAAY,YAAa,UAAWA,EAAS,YAAY,SAAU,EAG7H,KAAKI,GAAqB,MAAQ,IAEtC,CAEAP,GAKAD,GACAD,GACAU,GAAWC,EAAiC,IAAM,CAChD,GAAIC,EAAM,KAAKV,EAAK,EAClB,OAAO,KAET,IAAMW,EAAwCC,EAAQ,KAAKb,EAAgB,EAC3E,GAAI,KAAKC,GAAM,qBAAqBW,EAAY,CAE9C,IAAME,EAAmCF,IAAa,KAAKX,GAAM,iBAAiB,EAElF,GAAIM,EAASO,CAAO,GAAKA,EAAQ,KAAK,IAAM,GAC1C,OAAIC,GAAiB,SAASD,CAAO,IAAM,IACzC,KAAKf,GAAQ,KAAK,uCAAuCe,CAAO,GAAG,EAE9DA,CAEX,CACA,OAAO,IACT,CAAC,EAEDN,GAAuBQ,EAA6D,IAAI,EAExFC,GAA+BP,EAA4B,IACrDQ,EAAS,KAAKT,GAAS,KAAK,GAC1BU,GAAc,KAAKV,GAAS,KAAK,EAC5B,OAMJ,IACR,EAEDW,GAA2BV,EAA4B,IACjDH,EAAS,KAAKN,IAAO,iBAAiB,EACpCoB,GAAmB,KAAKpB,GAAM,iBAAiB,EAC1C,OAEAqB,GAAqB,KAAKrB,GAAM,iBAAiB,EACjD,KAGAsB,EAAgB,KAAKtB,GAAM,iBAAiB,EAGhD,IACR,EAEDuB,GAA2Bd,EAA4B,IAEjDJ,EAAS,KAAKE,GAAqB,KAAK,GAAKD,EAAS,KAAKC,GAAqB,MAAM,WAAW,IAC/F,KAAKA,GAAqB,MAAM,cAAgB,MAAQiB,GAAiB,SAAS,KAAKjB,GAAqB,MAAM,WAA+B,GAC5I,OAMJ,IACR,EAEDkB,GAAqBhB,EAA4B,IAAM,CAErD,IAAMiB,EAAmB,KAAKV,GAA6B,MACrDW,EAAe,KAAKJ,GAAyB,MAC7CK,EAAe,KAAKT,GAAyB,MAE/CU,EAA2E,KAC3EZ,EAASS,CAAgB,EAAGG,EAAmB,gBAC1CZ,EAASU,CAAY,EAAGE,EAAmB,eAC3CZ,EAASW,CAAY,IAAGC,EAAmB,eAEpD,IAAMC,EAAaJ,GAAoBC,GAAgBC,EAEvD,YAAK9B,GAAQ,MAAM,wBAAyB,CAAE,aAAc4B,EAAkB,SAAUC,EAAc,WAAYC,EAAc,WAAAE,EAAY,iBAAAD,CAAiB,CAAC,EAEvJC,CACT,CAAC,EAEDC,GAAmBtB,EAAkB,IAAM,CACzC,IAAMuB,EAAoB,KAAKP,GAAmB,MAClD,OAAQR,EAASe,CAAiB,CACpC,CAAC,EAID,IAAI,mBAAoD,CACtD,OAAO,KAAKP,EACd,CAEA,IAAI,iBAAwC,CAC1C,OAAO,KAAKM,EACd,CACF,ECnJA,IAAOE,GAAsCC,EAAgE,CAC3G,oBAAqB,qBACvB,CAAC,EAIM,SAASC,IAA0B,CACxC,GAAIC,EAA2BH,EAAmC,EAChE,OAEF,GAAM,CAAE,OAAAI,CAAO,EAAIC,EAAc,CAAE,YAAa,yBAA0B,CAAC,EACrE,CAAE,gBAAAC,CAAgB,EAAIC,GAAgB,CAAE,YAAa,yBAA0B,CAAC,EAChF,CAAE,gBAAAC,CAAgB,EAAIC,GAAuB,CAAE,YAAa,yBAA0B,CAAC,EACvFC,EAAsB,IAAIC,GAAoB,CAAE,gBAAAL,EAAiB,gBAAiB,IAAME,EAAiB,OAAAJ,CAAO,CAAC,EAEvHQ,EAASZ,GAAoC,oBAAqBU,CAAmB,CACvF,CAEO,SAASG,GAAuB,CAAE,YAAAC,CAAY,EAA0C,CAAC,EAAG,CACjG,GAAM,CAAE,OAAAV,CAAO,EAAIC,EAAc,CAAE,YAAa,wBAAyB,CAAC,EAC1E,GAAI,CACF,OAAAS,IAAgB,yBAGT,CAAE,oBADmBC,EAAwBf,GAAoC,mBAAmB,CAC9E,CAC/B,OAASgB,EAAK,CACZ,MAAAZ,EAAO,MAAM,uBAAuBU,GAAe,SAAS,EAAE,EACxDE,CACR,CACF,CCJO,IAAMC,GAAN,KAA0B,CAC/B,iBACA,wBACA,UACA,WACA,YACA,aAEAC,GACA,YAAY,CACV,iBAAAC,EACA,wBAAAC,EACA,UAAAC,EACA,WAAAC,EACA,YAAAC,CACF,EAMG,CACD,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,EAC3B,CAAE,aAAAC,CAAa,EAAIC,EAAgB,EACzC,KAAKT,GAAUM,EACf,KAAK,aAAeE,EACpB,KAAK,UAAYL,GAAa,GAC9B,KAAK,iBAAmBF,EACxB,KAAK,WAAaG,EAClB,KAAK,wBAA0BF,EAC/B,KAAK,YAAcG,CACrB,CAEA,IAAI,WAAY,CACd,OAAOK,EAAQ,KAAK,UAAU,EAAE,MAAM,IACxC,CAEA,IAAI,UAAW,CACb,OAAO,KAAK,gBACd,CAGA,IAAI,YAAa,CACf,OAAOA,EAAQ,KAAK,UAAU,EAAE,OAAO,MAAQ,KAAK,gBACtD,CAEA,IAAI,iBAAkB,CACpB,OAAOA,EAAQ,KAAK,UAAU,EAAE,OAAO,WAAa,EACtD,CAEA,IAAI,OAAQ,CACV,MAAO,UAAW,KAAK,UAClB,KAAK,UAAU,MAAM,SACtB,IACN,CAEA,IAAI,WAAY,CACd,MAAK,aAAc,KAAK,UACd,KAAK,UAAU,SAAS,UAAY,KAGrC,IAEX,CAEA,IAAI,SAAU,CACZ,OAAOA,EAAQ,KAAK,UAAU,GAAG,OAAO,UAAU,SAAW,IAC/D,CACA,IAAI,YAAa,CACf,OAAOA,EAAQ,KAAK,UAAU,EAAE,OAAO,WAAa,IACtD,CAEAC,GAAmBC,EAAoC,CACrD,GAAM,CAAE,MAAAC,EAAO,UAAAC,EAAW,QAAAC,CAAQ,EAAI,KAEhCC,EADeN,EAAQ,KAAK,uBAAuB,GAC1B,aAAe,KAc9C,MAbkC,CAChC,MAAAE,EACA,SAAU,KAAK,SACf,WAAY,KAAK,WACjB,gBAAiB,KAAK,gBACtB,YAAaF,EAAQ,KAAK,WAAW,EACrC,QAASG,GAAO,SAChB,WAAYA,GAAO,MACnB,YAAaC,GAAW,IAAKG,GAAMA,EAAE,QAAQ,EAC7C,eAAgBH,GAAW,IAAIG,GAAKA,EAAE,KAAK,EAC3C,QAAAF,EACA,SAAAC,CACF,CAEF,CAEA,UAAUE,EAAuB,CAC/B,KAAKlB,GAAQ,IAAI,wBAAyBkB,CAAS,EACnD,OAAO,aAAa,UAAU,KAAKP,GAAmBO,CAAS,CAAC,CAClE,CAEAC,IAAqB,CACnB,GAAI,KAAK,aAAa,kBAAoB,YACpC,KAAK,YAAc,MAAS,KAAK,UAAU,OAAS,GAAKT,EAAQ,KAAK,UAAU,EAAE,MAAM,SAAS,iBAAmB,GAAO,CAC7H,IAAMU,EAAW,KAAK,UAAU,IAAIH,GAAKA,EAAE,iBAAiB,EAC5D,GAAI,CACF,GAAI,OAAO,SAAa,IACtB,QAAWI,KAAMD,EACXC,GACF,SAAS,iBAAiB,YAAa,CACrC,KAAQ,oDAAoDA,CAAE,EAChE,CAAC,MAIL,OAAM,IAAI,MAAM,gCAAgC,CAEpD,OAAQC,EAAO,CACb,KAAKtB,GAAQ,MAAMsB,CAAK,CAC1B,CACF,CAEJ,CAEAC,GAAwB,GACxB,UAAW,CAEL,KAAKA,KAA0B,KACjC,KAAKA,GAAwB,GACzB,KAAK,WACP,KAAK,UAAU,eAAe,EAGpC,CAEAC,GAA6B,GAC7B,eAAgB,CAEV,KAAKA,KAA+B,KACtC,KAAKA,GAA6B,GAClC,KAAK,UAAU,WAAW,EAE9B,CAEAC,GAA4B,GAC5B,cAAe,CAET,KAAKA,KAA8B,KAEjC,KAAKD,KAA+B,IACtC,KAAK,cAAc,EAErB,KAAKC,GAA4B,GAEjC,KAAKN,GAAmB,EACxB,KAAK,UAAU,cAAc,EAEjC,CAEAO,GAAmC,GAEnC,qBAAsB,CAEhB,KAAKA,KAAqC,KAC5C,KAAKA,GAAmC,GACxC,KAAKP,GAAmB,EACxB,KAAK,UAAU,qBAAqB,EAExC,CAEAQ,GAAmC,GACnC,qBAAsB,CAEhB,KAAKA,KAAqC,KAC5C,KAAKA,GAAmC,GACxC,KAAK,UAAU,WAAW,EAE9B,CACF,EC/LA,IAAMC,GAA+BC,EAAwD,CAC3F,gBAAiB,iBACnB,CAAC,EAGM,SAASC,GAAiB,CAAE,iBAAAC,EAAkB,UAAAC,EAAW,WAAAC,CAAW,EAIxE,CACD,GAAIC,EAA2BN,EAA4B,EACzD,OAGF,GAAM,CAAE,wBAAAO,CAAwB,EAAIC,GAA0B,CAAE,YAAa,kBAAmB,CAAC,EAC3F,CAAE,8BAAAC,CAA8B,EAAIC,EAAe,CACvD,YAAa,kBACf,CAAC,EAEKC,EAAkB,IAAIC,GAAoB,CAC9C,iBAAAT,EACA,WAAAE,EACA,YAAaI,EACb,wBAAyBF,EAAwB,wBACjD,UAAAH,CACF,CAAC,EAEKS,EAASC,EAAc,CAAE,YAAa,kBAAmB,CAAC,EAE5DC,EAAQJ,EAAgB,SAAS,GACnCA,EAAgB,SAAS,EAG3BE,EAAO,UAAU,GAAG,CAAC,CAAE,YAAAG,CAAY,IAAM,CACnCA,IAAgB,cAClBL,EAAgB,oBAAoB,EAE7BK,IAAgB,YAAcA,IAAgB,cACrDL,EAAgB,aAAa,EAG7BM,EAAgBD,CAAW,CAE/B,CAAC,EAED,IAAME,EAA8B,IAAM,CACxCL,EAAO,qBAAqB,IAAIK,CAA2B,EAC3DP,EAAgB,cAAc,CAChC,EACAE,EAAO,qBAAqB,GAAGK,CAA2B,EAE1DL,EAAO,wBAAwB,GAAG,IAAM,CACtCF,EAAgB,oBAAoB,CACtC,CAAC,EAEDQ,EAAQnB,GAA6B,gBAAiBW,CAAe,CACvE,CAEO,SAASS,GAAgB,CAAE,YAAAC,CAAY,EAA0C,CAAC,EAAG,CAC1F,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,EACjC,GAAI,CACF,OAAAF,IAAgB,kBAGT,CAAE,gBADeG,EAAuBxB,GAA6B,eAAe,CAClE,CAC3B,OAASyB,EAAK,CACZ,MAAAH,EAAO,MAAM,uBAAuBD,GAAe,SAAS,EAAE,EACxDI,CACR,CACF,CC/DO,IAAMC,GAAN,KAA6B,CAElC,WACA,sBACA,qBACA,YACA,iBACA,gBACA,SACA,YACA,UACA,WACA,OACAC,GAGA,YAAY,CACV,SAAAC,EACA,YAAAC,EACA,UAAAC,EACA,YAAAC,EACA,WAAAC,EACA,iBAAAC,CACF,EAOG,CACD,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAc,EACjC,KAAKR,GAAUO,EACf,KAAK,WAAaH,EAClB,KAAK,SAAWH,EAChB,KAAK,YAAcC,EACnB,KAAK,UAAYC,EACjB,KAAK,OAASM,EAAQH,CAAgB,EAAE,aAAe,GACvD,KAAK,WAAaD,EAClB,KAAK,sBAAwB,IAAI,IACjC,KAAK,qBAAuB,CAAC,EAC7B,KAAK,iBAAmB,CAAC,EACzB,KAAK,gBAAkB,CAAC,EACxB,KAAK,YAAc,CAAC,EACpB,KAAKK,GAAiB,CACxB,CAIAA,IAAmB,CACFC,EAAc,EAEtB,MAAM,GAAG,CAAC,CAAE,UAAAC,CAAU,IAAM,CAEjC,IAAMC,EAAgBC,EAAM,IAAM,KAAK,WAAaC,GAAa,CAC/D,QAAWC,KAAOD,EAEZA,EAASC,CAAG,EAAE,QAEhB,KAAK,sBAAsB,IAAIA,CAAG,EAIlC,KAAK,sBAAsB,MAAQ,OAAO,KAAK,KAAK,UAAU,EAAE,QAAQH,EAAc,CAC5F,EAAG,CAAE,KAAM,EAAK,CAAC,CACnB,CAAC,CACH,CAIA,IAAI,YAAa,CACf,OAAOJ,EAAQ,KAAK,UAAU,EAAE,OAAO,MAAQ,EACjD,CAIA,IAAI,iBAAkB,CACpB,OAAOA,EAAQ,KAAK,UAAU,EAAE,OAAO,WAAa,EACtD,CAIA,IAAI,SAAU,CACZ,OAAOA,EAAQ,KAAK,UAAU,EAAE,MAAM,SAAS,SAAW,EAC5D,CACA,uBAAuB,CACrB,QAAWO,KAAO,KAAK,WAAY,CACjC,IAAMC,EAAY,KAAK,WAAWD,CAAG,EAClCC,EAAU,UAERA,EAAU,SAAW,KAAK,sBAAsB,IAAID,CAAG,EACxD,KAAK,qBAAqB,KAAKA,CAAG,EAElC,KAAK,YAAY,KAAKA,CAAG,GAG7B,GAAI,CAAE,QAAAE,EAAS,eAAAC,CAAe,EAAIF,EAAU,gBACxC,CAACC,GAAWC,GACd,KAAK,iBAAiB,KAAKA,CAAc,EAGxCF,EAAU,WACX,KAAK,gBAAgB,KAAKD,CAAG,CAEjC,CACF,CAIAI,IAA8B,CAkB5B,MAhByC,CACvC,MAAO,kBACP,SAAU,KAAK,SACf,WAAY,KAAK,WACjB,gBAAiB,KAAK,gBACtB,YAAa,KAAK,YAClB,QAAS,KAAK,QACd,SAAU,KAAK,OACf,UAAW,KAAK,UAChB,sBAAuB,MAAM,KAAK,KAAK,qBAAqB,EAAE,KAAK,GAAG,EACtE,gBAAiB,KAAK,gBAAgB,KAAK,GAAG,EAC9C,qBAAsB,KAAK,qBAAqB,KAAK,GAAG,EACxD,iBAAkB,KAAK,iBAAiB,KAAK,GAAG,EAChD,YAAa,KAAK,YAAY,KAAK,GAAG,CACxC,CAGF,CAIA,qBAAsB,CACpB,GAAI,CACF,IAAIC,EAAqB,KAAKD,GAAW,EACzC,KAAKpB,GAAQ,MAAM,uCAAwCqB,CAAkB,EAC7E,OAAO,aAAa,UAAUA,CAAkB,CAClD,OACOC,EAAK,CACV,KAAKtB,GAAQ,MAAM,yCAAyCsB,CAAG,EAAE,CACnE,CACF,CACF,ECrJA,IAAMC,GAAkCC,EAA2D,CACjG,mBAAoB,oBACtB,CAAC,EAIM,SAASC,GAA2B,CAAE,SAAAC,EAAU,UAAAC,EAAW,YAAAC,EAAa,WAAAC,CAAW,EAKvF,CAED,GAAIC,EAA2BP,EAA+B,EAC5D,OAEF,GAAM,CAAE,8BAAAQ,CAA8B,EAAIC,EAAe,CACvD,YAAa,4BACf,CAAC,EACK,CAAE,wBAAAC,CAAwB,EAAIC,GAA0B,CAAE,YAAa,4BAA6B,CAAC,EAGrGC,EAAqB,IAAIC,GAAuB,CACpD,SAAAV,EACA,YAAaK,EAA8B,MAC3C,UAAAJ,EACA,YAAAC,EACA,WAAAC,EACA,iBAAkBI,EAAwB,uBAC5C,CAAC,EACKI,EAASC,EAAc,CAAE,YAAa,kBAAmB,CAAC,EAG1DC,EAAyB,IAAI,CACjCF,EAAO,gBAAgB,IAAIE,CAAsB,EACjDJ,EAAmB,sBAAsB,EACzCA,EAAmB,oBAAoB,CACzC,EAGAE,EAAO,gBAAgB,GAAGE,CAAsB,EAEhDC,EAAQjB,GAAgC,mBAAoBY,CAAkB,CAChF,CCpEA,IAAMM,GAA8C,CAClD,aACA,gBACA,YACA,aACA,UACA,UACA,kBACA,UACA,WACA,WACA,eACA,aACA,qBACA,mBACA,aACA,YACA,UACA,aACA,eACA,aACA,cACA,eACA,UACA,UACA,cACA,UACA,cACA,YACA,iBACA,UACA,aACA,UACA,SACA,YACA,SACA,aACA,cACA,iBACA,YACA,iBACA,iBACA,gBACA,qBACA,WACA,YACA,UACA,WACA,gBACA,gBACA,gBACA,UACA,aACA,cACA,kBACA,aACA,aACA,aACA,YACA,YACA,mBACA,UACA,WACA,gBACA,cACA,WACA,WACA,eACA,kBACA,WACA,YACA,kBACA,iBACA,aACA,UACA,aACA,YACA,UACA,mBACA,oBACA,WACA,eACA,aACA,SACA,SACA,kBACA,aACA,aACA,QACA,WACA,kBACA,UACA,UACA,aACA,aACA,iBACA,UACA,eACA,eACA,eACA,eACA,aACA,aACA,aACA,aACA,kBACA,YACA,YACA,mBACA,kBACA,SACA,WACA,WACA,gBACA,QACA,WACA,WACA,YACA,QACA,WACA,SACA,WACA,WACA,aACA,gBACA,UACA,WACA,eACA,YACA,SACA,kBACA,cACA,aACA,cACA,gBACA,wBACA,eACA,gBACA,kBACA,oBACA,YACA,uBACA,eACA,SACA,cACA,gBACA,cACA,qBACA,eACA,kBACA,gBACA,iBACA,cACA,eACA,kBACA,eACA,eACA,aACA,kBACA,oBACA,eACA,cACA,gBACA,YACA,cACA,eACA,aACA,eACA,gBACA,YACA,cACA,sBACA,eACA,UACA,sBACA,WACA,cACA,gBACA,WACA,eACA,iBACA,oBACA,gBACA,iBACA,gBACA,4BACA,gBACA,WACA,eACA,mBACA,gBACA,UACA,SACA,YACA,UACA,mBACA,eACA,oBACA,cACA,gBACA,cACA,cACA,UACA,WACA,gBACA,eACA,gBACA,eACA,gBACA,cACA,kBACA,cACA,cACA,WACA,eACA,wBACA,eACA,WACA,aACA,gBACA,cACA,gBACA,gBACA,mBACA,aACA,gBACA,eACA,aACA,gBACA,gBACA,eACA,wBACA,aACA,qBACA,aACA,eACA,YACA,gBACA,YACA,aACA,gBACA,eACA,YACA,sBACA,eACA,YACA,YACA,YACA,gBACA,eACA,eACA,wBACA,cACA,cACA,eACA,gBACA,cACA,cACA,aACA,kBACA,kBACA,iBACA,gBACA,eACA,eACA,eACA,gBACA,eACA,YACA,cACA,uBACA,mBACA,qBACA,kBACA,eACA,eACA,mBACA,aACA,iBACA,cACA,gBACA,kBACA,kBACA,gBACA,gBACA,iBACA,YACA,UACA,SACA,SACA,SACA,SACA,SACA,eACA,aACA,YACA,WACA,eACA,eACA,gBACA,gBACA,kBACA,aACA,cACA,mBACA,oBACA,kBACA,WACA,iBACA,iBACA,gBACA,kBACA,gBACA,WACA,cACA,eACA,mBACA,kBACA,eACA,kBACA,wBACA,YACA,YACA,aACA,iBACA,gBACA,iBACA,gBACA,WACA,eACA,kBACA,mBACA,iBACA,iBACA,gBACA,cACA,YACA,aACA,mBACA,mBACA,iBACA,gBACA,gBACA,cACA,cACA,gBACA,WACA,SACA,WACA,mBACA,aACA,WACA,gBACA,eACA,WACA,UACA,gBACA,eACA,QACA,iBACA,gBACA,eACA,WACA,oBACA,gBACA,gBACA,oBACA,mBACA,uBACA,cACA,cACA,0BACA,iBACA,WACA,SACA,gBACA,eACA,qBACA,wBACA,YACA,eACA,WACA,qBACA,eACA,YACA,kBACA,kBACA,iBACA,kBACA,sBACA,yBACA,0BACA,gBACA,gBACA,iBACA,kBACA,cACA,cACA,cACA,cACA,mBACA,mBACA,kBACA,aACA,cACA,kBACA,iBACA,kBACA,eACA,gBACA,YACA,YACA,cACA,gBACA,qBACA,mBACA,qBACA,aACA,wBACA,iBACA,WACA,eACA,cACA,aACA,eACA,eACA,cACA,UACA,WACA,qBACA,gBACA,aACA,aACA,iBACA,iBACA,gBACA,WACA,cACA,gBACA,kBACA,aACA,YACA,gBACA,cACA,sBACA,iBACA,iBACA,UACA,eACA,gBACA,iBACA,cACA,cACA,aACA,aACA,mBACA,iBACA,aACA,aACA,cACA,iBACA,cACA,iBACA,cACA,gBACA,oBACA,gBACA,iBACA,gBACA,eACA,eACA,eACA,YACA,mBACA,eACA,kBACA,iBACA,iBACA,kBACA,gBACA,gBACA,aACA,cACA,cACA,iBACA,QACA,cACA,cACA,oBACA,oBACA,kBACA,aACA,iBACA,gBACA,mBACA,eACA,kBACA,gBACA,mBACA,iBACA,gBACA,cACA,cACA,eACA,aACA,mBACA,cACA,gBACA,YACA,gBACA,kBACA,kBACA,iBACA,eACA,oBACA,cACA,aACA,cACA,iBACA,WACA,iBACA,kBACA,aACA,WACA,eACA,cACA,gBACA,gBACA,oBACA,mBACA,UACA,aACA,qBACA,aACA,SACA,SACA,YACA,eACA,gBACA,cACA,eACA,kBACA,mBACA,eACA,YACA,iBACA,oBACA,mBACA,gBACA,cACA,eACA,qBACA,cACA,kBACA,kBACA,mBACA,gBACA,iBACA,aACA,kBACA,kBACA,gBACA,mBACA,mBACA,oBACA,kBACA,cACA,cACA,gBACA,cACA,YACA,gBACA,SACA,WACA,aACA,kBACA,gBACA,iBACA,oBACA,gBACA,gBACA,eACA,eACA,eACA,gBACA,cACA,gBACA,aACA,UACA,aACA,YACA,mBACA,gBACA,iBACA,eACA,gBACA,mBACA,kBACA,uBACA,WACA,mBACA,eACA,mBACA,0BACA,kBACA,aACA,gBACA,mBACA,WACA,iBACA,WACA,UACA,aACA,QACA,UACA,QACA,SACA,cACA,iBACA,oBACA,eACA,WACA,gBACA,kBACA,qCACA,mBACA,qBACA,gBACA,eACA,cACA,cACA,gBACA,aACA,mBACA,gBACA,YACA,gBACA,eACA,aACA,YACA,cACA,wBACA,cACA,gBACA,kBACA,uBACA,YACA,aACA,eACA,aACA,eACA,oBACA,YACA,aACA,iBACA,eACA,eACA,eACA,wBACA,cACA,UACA,SACA,iBACA,aACA,iBACA,gBACA,iBACA,gBACA,kBACA,iBACA,cACA,kBACA,aACA,aACA,kBACA,iBACA,oBACA,aACA,UACA,kBACA,aACA,aACA,iBACA,gBACA,cACA,kBACA,mBACA,mBACA,mBACA,kBACA,cACA,cACA,UACA,cACA,eACA,iBACA,eACA,qBACA,YACA,cACA,kBACA,YACA,eACA,WACA,eACA,WACA,YACA,cACA,iBACA,mBACA,kBACA,WACA,gBACA,aACA,eACA,qBACA,YACA,eACA,gBACA,gBACA,kBACA,YACA,oBACA,eACA,eACA,kBACA,iBACA,iBACA,oBACA,qBACA,gBACA,gBACA,SACA,aACA,mBACA,eACA,iBACA,cACA,YACA,cACA,mBACA,yBACA,uBACA,wBACA,uBACA,wBACA,wBACA,sBACA,wBACA,yBACA,yBACA,qBACA,sBACA,0BACA,0BACA,mBACA,gBACA,iBACA,oBACA,mBACA,gBACA,cACA,gBACA,mBACA,oBACA,eACA,gBACA,YACA,oBACA,kBACA,cACA,eACA,gBACA,cACA,mBACA,cACA,eACA,eACA,iBACA,gBACA,iBACA,kBACA,cACA,eACA,YACA,YACA,WACA,cACA,iBACA,aACA,gBACA,UACA,WACA,cACA,mBACA,WACA,WACA,iBACA,eACA,4BACA,gBACA,kBACA,kBACA,kBACA,eACA,kBACA,iBACA,gBACA,aACA,aACA,cACA,cACA,YACA,uBACA,iBACA,gBACA,oBACA,iBACA,sBACA,qBACA,iBACA,uBACA,mBACA,oBACA,eACA,UACA,WACA,mBACA,iBACA,YACA,iBACA,mBACA,iBACA,kBACA,oBACA,UACA,aACA,iBACA,eACA,gBACA,eACA,eACA,eACA,eACA,cACA,eACA,eACA,eACA,kBACA,sBACA,iBACA,aACA,iBACA,eACA,gBACA,uBACA,sBACA,eACA,eACA,YACA,YACA,iBACA,mBACA,iBACA,yBACA,UACA,UACA,cACA,gBACA,aACA,iBACA,eACA,qBACA,WACA,mBACA,oBACA,gBACA,oBACA,kBACA,aACA,iBACA,iBACA,gBACA,cACA,qBACA,iBACA,SACA,eACA,gBACA,cACA,kBACA,iBACA,gBACA,gBACA,UACA,gBACA,oBACA,kBACA,YACA,WACA,SACA,mBACA,wBACA,mBACA,iBACA,mBACA,gBACA,kBACA,oBACA,uBACA,gBACA,oBACA,eACA,gBACA,iBACA,mBACA,gBACA,cACA,oBACA,sBACA,kBACA,gBACA,aACA,gBACA,SACA,aACA,gBACA,eACA,WACA,mBACA,qBACA,iBACA,iBACA,sBACA,kBACA,mBACA,aACA,UACA,WACA,iBACA,kBACA,iBACA,aACA,uBACA,cACA,cACA,WACA,WACA,kBACA,gBACA,eACA,gBACA,aACA,iBACA,eACA,iBACA,uBACA,yBACA,YACA,eACA,aACA,kBACA,YACA,kBACA,kBACA,iBACA,mBACA,uBACA,eACA,eACA,gBACA,YACA,gBACA,aACA,YACA,sBACA,kBACA,qBACA,cACA,WACA,eACA,gBACA,WACA,YACA,mBACA,eACA,uBACA,kBACA,oBACA,qBACA,WACA,kBACA,gBACA,aACA,uBACA,sBACA,uBACA,eACA,eACA,gBACA,gBACA,uBACA,WACA,gBACA,iBACA,gBACA,aACA,aACA,kBACA,iBACA,gBACA,eACA,gBACA,oBACA,oBACA,oBACA,wBACA,cACA,eACA,iBACA,wBACA,+BACA,sBACA,aACA,kBACA,eACA,uBACA,sBACA,eACA,gBACA,YACA,kBACA,kBACA,WACA,6BACA,aACA,kBACA,aACA,cACA,aACA,aACA,cACA,YACA,UACA,YACA,eACA,gBACA,cACA,mBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,gBACA,cACA,cACA,cACA,cACA,kBACA,wBACA,cACA,oBACA,eACA,eACA,YACA,aACA,aACA,UACA,qBACA,aACA,SACA,gBACA,gBACA,YACA,cACA,cACA,eACA,eACA,gBACA,aACA,YACA,kBACA,kBACA,eACA,cACA,iBACA,mBACA,kBACA,WACA,eACA,gBACA,gBACA,cACA,UACA,WACA,mBACA,aACA,cACA,aACA,aACA,gBACA,YACA,aACA,YACA,YACA,qBACA,aACA,eACA,eACA,aACA,oBACA,eACA,gBACA,gBACA,gBACA,kBACA,kBACA,cACA,eACA,gBACA,WACA,UACA,gBACA,eACA,oBACA,gBACA,gBACA,YACA,gBACA,mBACA,aACA,kBACA,eACA,aACA,aACA,eACA,iBACA,kBACA,cACA,aACA,gBACA,aACA,YACA,iBACA,aACA,eACA,cACA,gBACA,cACA,cACA,YACA,eACA,gBACA,qBACA,kBACA,YACA,iBACA,YACA,WACA,WACA,WACA,WACA,YACA,WACA,WACA,WACA,WACA,WACA,kBACA,eACA,eACA,eACA,cACA,eACA,mBACA,qBACA,cACA,cACA,gBACA,kBACA,kBACA,cACA,kBACA,kBACA,sBACA,kBACA,gBACA,aACA,kBACA,eACA,kBACA,cACA,gBACA,iBACA,kBACA,iBACA,kBACA,gBACA,kBACA,YACA,2BACA,YACA,kBACA,mBACA,kBACA,sBACA,sBACA,mBACA,yBACA,eACA,eACA,aACA,gBACA,kBACA,eACA,aACA,gBACA,YACA,YACA,WACA,aACA,iBACA,WACA,WACA,WACA,SACA,YACA,eACA,gBACA,cACA,UACA,cACA,WACA,gBACA,eACA,cACA,cACA,kBACA,WACA,aACA,eACA,eACA,WACA,cACA,WACA,YACA,gBACA,WACA,gBACA,cACA,WACA,eACA,aACA,gBACA,cACA,WACA,aACA,iBACA,gBACA,gBACA,iBACA,gBACA,aACA,iBACA,eACA,gBACA,aACA,kBACA,aACA,kBACA,gBACA,eACA,aACA,YACA,gBACA,eACA,eACA,aACA,YACA,YACA,cACA,sBACA,iBACA,mBACA,kBACA,iBACA,kBACA,cACA,eACA,eACA,eACA,WACA,eACA,oBACA,mBACA,YACA,WACA,SACA,aACA,kBACA,oBACA,eACA,mBACA,kBACA,eACA,eACA,sBACA,mBACA,eACA,eACA,eACA,gBACA,sBACA,gBACA,mBACA,UACA,kBACA,eACA,mBACA,mBACA,oBACA,iBACA,aACA,4BACA,cACA,iBACA,eACA,gBACA,gBACA,gBACA,mBACA,aACA,eACA,kBACA,yBACA,iBACA,aACA,eACA,mBACA,cACA,cACA,iBACA,eACA,kBACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,eACA,cACA,cACA,cACA,cACA,cACA,kBACA,gBACA,oBACA,qBACA,iBACA,kBACA,iBACA,iBACA,iBACA,iBACA,cACA,cACA,sBACA,gBACA,SACA,gBACA,SACA,eACA,SACA,yBACA,qBACA,eACA,mBACA,YACA,eACA,WACA,kBACA,gBACA,kBACA,kBACA,aACA,cACA,kBACA,YACA,eACA,eACA,mBACA,oBACA,eACA,iBACA,kBACA,gBACA,aACA,eACA,eACA,iBACA,eACA,gBACA,aACA,eACA,mBACA,cACA,gBACA,eACA,cACA,aACA,cACA,qBACA,iBACA,gBACA,gBACA,cACA,eACA,mBACA,gBACA,cACA,eACA,aACA,YACA,gBACA,aACA,cACA,eACA,cACA,uBACA,mBACA,gBACA,oBACA,eACA,aACA,iBACA,YACA,mBACA,iBACA,kBACA,WACA,gBACA,cACA,gBACA,iBACA,eACA,eACA,gBACA,kBACA,eACA,cACA,UACA,gBACA,kBACA,oBACA,cACA,kBACA,mBACA,kBACA,eACA,gBACA,sBACA,aACA,oBACA,iBACA,kBACA,kBACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,kBACA,cACA,eACA,cACA,aACA,aACA,cACA,cACA,kBACA,cACA,kBACA,kBACA,gBACA,eACA,cACA,cACA,aACA,aACA,kBACA,cACA,mBACA,iBACA,iBACA,iBACA,mBACA,cACA,eACA,sBACA,qBACA,mBACA,iBACA,kBACA,mBACA,qBACA,gBACA,qBACA,mBACA,kBACA,kBACA,iBACA,mBACA,kBACA,kBACA,mBACA,mBACA,kBACA,iBACA,iBACA,iBACA,kBACA,sBACA,kBACA,iBACA,kBACA,iBACA,kBACA,mBACA,qBACA,mBACA,sBACA,mBACA,kBACA,kBACA,iBACA,gBACA,mBACA,kBACA,gBACA,eACA,kBACA,iBACA,mBACA,oBACA,gBACA,mBACA,wBACA,gBACA,mBACA,oBACA,sBACA,mBACA,kBACA,mBACA,iBACA,uBACA,oBACA,oBACA,kBACA,wBACA,sBACA,eACA,mBACA,iBACA,uBACA,sBACA,aACA,YACA,wBACA,sBACA,oBACA,gBACA,oBACA,eACA,kBACA,mBACA,qBACA,uBACA,uBACA,oBACA,kBACA,WACA,eACA,kBACA,mBACA,aACA,YACA,WACA,iBACA,eACA,eACA,cACA,cACA,aACA,iBACA,wBACA,WACA,eACA,SACA,kBACA,WACA,eACA,UACA,aACA,cACA,gBACA,cACA,cACA,eACA,YACA,mBACA,YACA,eACA,oBACA,cACA,eACA,iBACA,mBACA,YACA,UACA,oBACA,WACA,YACA,gBACA,UACA,UACA,cACA,gBACA,WACA,UACA,eACA,gCACA,aACA,eACA,uBACA,oBACA,gBACA,gBACA,gBACA,gBACA,aACA,kBACA,YACA,eACA,cACA,gBACA,iBACA,gBACA,gBACA,cACA,iBACA,iBACA,eACA,aACA,gBACA,gBACA,iBACA,eACA,gBACA,YACA,gBACA,eACA,6BACA,gBACA,uBACA,WACA,eACA,gBACA,kBACA,oBACA,mBACA,YACA,gBACA,cACA,YACA,eACA,eACA,WACA,YACA,SACA,SACA,YACA,UACA,SACA,SACA,SACA,UACA,SACA,cACA,SACA,QACA,QACA,aACA,aACA,SACA,mBACA,gBACA,aACA,aACA,gBACA,eACA,UACA,gBACA,cACA,kBACA,gBACA,gBACA,cACA,aACA,kBACA,mBACA,gBACA,aACA,mBACA,iBACA,iBACA,aACA,+BACA,gBACA,gBACA,iBACA,cACA,cACA,cACA,aACA,uBACA,gBACA,aACA,eACA,eACA,eACA,cACA,kBACA,mBACA,uBACA,gBACA,gBACA,gBACA,gBACA,iBACA,gBACA,SACA,iBACA,aACA,cACA,WACA,iBACA,UACA,mBACA,mBACA,oBACA,oBACA,mBACA,qBACA,oBACA,oBACA,yBACA,gBACA,WACA,eACA,YACA,UACA,WACA,oBACA,iBACA,iBACA,gBACA,YACA,qBACA,aACA,mBACA,aACA,iBACA,iBACA,eACA,kBACA,kBACA,gBACA,mBACA,cACA,eACA,eACA,oBACA,cACA,gBACA,mBACA,iBACA,mBACA,eACA,oBACA,qBACA,aACA,cACA,eACA,gBACA,kBACA,eACA,kBACA,iBACA,iBACA,gBACA,aACA,WACA,WACA,eACA,WACA,iBACA,qBACA,eACA,gBACA,eACA,cACA,UACA,oBACA,YACA,YACA,SACA,cACA,iBACA,cACA,YACA,iBACA,kBACA,qBACA,gBACA,gBACA,aACA,gBACA,iBACA,cACA,oBACA,aACA,UACA,kBACA,cACA,gBACA,iBACA,oBACA,iBACA,UACA,UACA,cACA,UACA,UACA,cACA,kBACA,eACA,kBACA,sBACA,gBACA,sBACA,eACA,eACA,aACA,gBACA,eACA,iBACA,iBACA,cACA,eACA,eACA,SACA,aACA,YACA,cACA,kBACA,gBACA,cACA,gBACA,kBACA,aACA,aACA,aACA,aACA,gBACA,gBACA,gBACA,gBACA,gBACA,cACA,iBACA,iBACA,iBACA,iBACA,iBACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,eACA,aACA,aACA,cACA,eACA,eACA,cACA,gBACA,aACA,eACA,SACA,aACA,aACA,eACA,cACA,aACA,aACA,YACA,cACA,WACA,eACA,mBACA,gBACA,eACA,kBACA,gBACA,gBACA,UACA,OACA,UACA,aACA,OACA,UACA,YACA,cACA,cACA,gBACA,uBACA,iBACA,gBACA,eACA,eACA,gCACA,kBACA,aACA,sBACA,UACA,cACA,aACA,SACA,cACA,QACA,kBACA,gBACA,cACA,cACA,gBACA,cACA,aACA,cACA,YACA,aACA,cACA,kBACA,oBACA,iBACA,eACA,oBACA,mBACA,eACA,qBACA,oBACA,iBACA,oBACA,uBACA,qBACA,qBACA,UACA,kBACA,YACA,WACA,eACA,cACA,gBACA,UACA,eACA,WACA,YACA,UACA,oBACA,mBACA,iBACA,iBACA,iBACA,gBACA,aACA,eACA,YACA,WACA,eACA,YACA,WACA,YACA,WACA,WACA,iBACA,iBACA,iBACA,eACA,sBACA,kBACA,kBACA,WACA,YACA,YACA,iBACA,gBACA,iBACA,eACA,iBACA,WACA,iBACA,cACA,WACA,cACA,gBACA,gBACA,WACA,aACA,eACA,gBACA,aACA,cACA,iBACA,mBACA,oBACA,iBACA,YACA,YACA,eACA,aACA,iBACA,eACA,kBACA,cACA,eACA,sBACA,iBACA,sBACA,kBACA,0BACA,iBACA,kBACA,iBACA,cACA,gBACA,eACA,aACA,kBACA,kBACA,oBACA,sBACA,oBACA,sBACA,kBACA,oBACA,oBACA,qBACA,sBACA,mBACA,cACA,mBACA,YACA,YACA,WACA,SACA,SACA,gBACA,UACA,YACA,SACA,YACA,aACA,UACA,WACA,qBACA,iBACA,cACA,eACA,eACA,cACA,kBACA,eACA,SACA,YACA,eACA,gBACA,kBACA,kBACA,kBACA,kBACA,aACA,eACA,WACA,iBACA,kBACA,kBACA,qBACA,gBACA,gBACA,qBACA,aACA,YACA,oBACA,eACA,gBACA,UACA,aACA,WACA,gBACA,aACA,cACA,YACA,YACA,gBACA,kBACA,cACA,eACA,kBACA,kBACA,oBACA,mBACA,oBACA,cACA,aACA,gBACA,cACA,cACA,gBACA,eACA,iBACA,mBACA,sBACA,aACA,YACA,cACA,YACA,YACA,wBACA,qBACA,aACA,eACA,YACA,iBACA,iBACA,iBACA,cACA,cACA,eACA,mBACA,eACA,WACA,WACA,iBACA,aACA,eACA,cACA,WACA,gBACA,kBACA,cACA,gBACA,sBACA,aACA,OACA,aACA,cACA,aACA,uBACA,sBACA,YACA,eACA,iBACA,gBACA,gBACA,iBACA,cACA,cACA,aACA,eACA,mBACA,eACA,WACA,WACA,gBACA,gBACA,gBACA,cACA,gBACA,kBACA,eACA,aACA,eACA,SACA,iBACA,gBACA,kBACA,gBACA,sBACA,iBACA,eACA,eACA,WACA,eACA,kBACA,iBACA,aACA,eACA,eACA,gBACA,aACA,cACA,eACA,kBACA,kBACA,YACA,QACA,eACA,gBACA,WACA,cACA,kBACA,cACA,YACA,WACA,YACA,gBACA,aACA,cACA,cACA,aACA,cACA,UACA,gBACA,eACA,aACA,eACA,iBACA,iBACA,eACA,qBACA,eACA,eACA,kBACA,eACA,gBACA,kBACA,UACA,SACA,sBACA,cACA,eACA,cACA,iBACA,UACA,gBACA,cACA,WACA,UACA,aACA,gBACA,YACA,cACA,uBACA,kBACA,cACA,iBACA,gBACA,aACA,cACA,cACA,UACA,cACA,aACA,gBACA,oBACA,mBACA,eACA,aACA,gBACA,mBACA,eACA,iBACA,kBACA,WACA,cACA,iBACA,gBACA,kBACA,qBACA,aACA,YACA,SACA,uBACA,YACA,gBACA,YACA,iBACA,cACA,kBACA,iBACA,gBACA,iBACA,iBACA,oBACA,gBACA,kBACA,iBACA,wBACA,gBACA,UACA,gBACA,eACA,sBACA,kBACA,qBACA,UACA,UACA,UACA,UACA,UACA,aACA,aACA,WACA,cACA,cACA,cACA,cACA,cACA,cACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,eACA,oBACA,cACA,gBACA,iBACA,aACA,eACA,eACA,kBACA,YACA,iBACA,YACA,cACA,eACA,YACA,iBACA,aACA,aACA,kBACA,gBACA,mBACA,eACA,gBACA,eACA,eACA,SACA,WACA,UACA,eACA,cACA,cACA,mBACA,sBACA,iBACA,eACA,gBACA,gBACA,aACA,qBACA,qBACA,iBACA,iBACA,oBACA,kBACA,iBACA,SACA,WACA,YACA,cACA,WACA,UACA,aACA,UACA,eACA,cACA,gBACA,cACA,YACA,WACA,WACA,cACA,WACA,iBACA,gBACA,cACA,cACA,SACA,SACA,eACA,UACA,aACA,YACA,eACA,mBACA,cACA,YACA,oBACA,eACA,mBACA,iBACA,aACA,yBACA,wBACA,YACA,kBACA,iBACA,cACA,cACA,kBACA,mBACA,eACA,kBACA,cACA,gBACA,qBACA,kBACA,mBACA,UACA,UACA,UACA,oBACA,UACA,eACA,aACA,WACA,cACA,UACA,0BACA,oBACA,UACA,uBACA,gBACA,gBACA,UACA,qBACA,wBACA,UACA,cACA,UACA,oBACA,UACA,mBACA,UACA,gBACA,iBACA,sBACA,gBACA,mBACA,eACA,oBACA,UACA,WACA,aACA,cACA,aACA,YACA,cACA,eACA,YACA,iBACA,gBACA,eACA,iBACA,mBACA,oBACA,qBACA,iBACA,qBACA,kBACA,kBACA,qBACA,uBACA,kBACA,iBACA,eACA,gBACA,eACA,eACA,kBACA,oBACA,mBACA,mBACA,gBACA,kBACA,mBACA,qBACA,gBACA,iBACA,mBACA,kBACA,iBACA,iBACA,iBACA,mBACA,iBACA,kBACA,kBACA,mBACA,iBACA,mBACA,oBACA,mBACA,kBACA,gBACA,4BACA,kBACA,kBACA,eACA,gBACA,gBACA,mBACA,oBACA,qBACA,kBACA,iBACA,oBACA,kBACA,kBACA,qBACA,gBACA,qBACA,iBACA,mBACA,oBACA,mBACA,gBACA,kBACA,eACA,mBACA,kBACA,kBACA,kBACA,eACA,sBACA,kBACA,mBACA,iBACA,gBACA,oBACA,mBACA,gBACA,qBACA,mBACA,sBACA,gBACA,mBACA,mBACA,qBACA,sBACA,gBACA,sBACA,gBACA,kBACA,oBACA,mBACA,eACA,oBACA,mBACA,kBACA,sBACA,kBACA,iBACA,iBACA,mBACA,kBACA,iBACA,mBACA,mBACA,kBACA,eACA,mBACA,gBACA,iBACA,mBACA,kBACA,iBACA,gBACA,uBACA,iBACA,eACA,qBACA,iBACA,qBACA,iBACA,iBACA,kBACA,iBACA,eACA,iBACA,mBACA,kBACA,gBACA,oBACA,kBACA,kBACA,kBACA,oBACA,mBACA,kBACA,qBACA,iBACA,iBACA,oBACA,kBACA,iBACA,iBACA,kBACA,oBACA,oBACA,iBACA,eACA,oBACA,oBACA,eACA,cACA,sBACA,kBACA,oBACA,oBACA,kBACA,kBACA,qBACA,qBACA,oBACA,wBACA,gBACA,oBACA,mBACA,iBACA,eACA,mBACA,iBACA,oBACA,mBACA,gBACA,gBACA,qBACA,mBACA,gBACA,mBACA,kBACA,mBACA,iBACA,iBACA,mBACA,qBACA,qBACA,oBACA,qBACA,mBACA,iBACA,iBACA,iBACA,uBACA,kBACA,iBACA,kBACA,iBACA,iBACA,gBACA,iBACA,sBACA,iBACA,mBACA,oBACA,iBACA,oBACA,oBACA,oBACA,oBACA,oBACA,qBACA,mBACA,iBACA,mBACA,uBACA,sBACA,mBACA,gBACA,gBACA,gBACA,qBACA,mBACA,oBACA,kBACA,mBACA,iBACA,iBACA,iBACA,kBACA,mBACA,eACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,iBACA,mBACA,kBACA,yBACA,eACA,gBACA,kBACA,eACA,gBACA,iBACA,kBACA,oBACA,iBACA,mBACA,mBACA,kBACA,oBACA,gBACA,gBACA,cACA,kBACA,kBACA,mBACA,kBACA,iBACA,gBACA,oBACA,qBACA,mBACA,oBACA,kBACA,mBACA,kBACA,mBACA,iBACA,kBACA,mBACA,oBACA,mBACA,iBACA,iBACA,mBACA,mBACA,kBACA,kBACA,oBACA,oBACA,oBACA,oBACA,gBACA,iBACA,gBACA,iBACA,oBACA,oBACA,kBACA,oBACA,mBACA,oBACA,6BACA,eACA,kBACA,iBACA,iBACA,mBACA,gBACA,iBACA,mBACA,eACA,oBACA,iBACA,mBACA,gBACA,kBACA,gBACA,iBACA,gBACA,iBACA,mBACA,eACA,qBACA,mBACA,iBACA,iBACA,iBACA,iBACA,oBACA,eACA,qBACA,iBACA,kBACA,sBACA,iBACA,qBACA,iBACA,oBACA,mBACA,4BACA,eACA,gBACA,iBACA,gBACA,mBACA,gBACA,mBACA,iBACA,gBACA,mBACA,iBACA,oBACA,cACA,kBACA,iBACA,eACA,gBACA,kBACA,sBACA,oBACA,kBACA,iBACA,iBACA,mBACA,iBACA,mBACA,gBACA,kBACA,mBACA,eACA,mBACA,kBACA,iBACA,mBACA,gBACA,wBACA,iBACA,mBACA,mBACA,mBACA,gBACA,qBACA,oBACA,oBACA,mBACA,iBACA,eACA,gBACA,oBACA,oBACA,uBACA,iBACA,kBACA,iBACA,qBACA,oBACA,gBACA,mBACA,gBACA,mBACA,kBACA,oBACA,sBACA,gBACA,eACA,iBACA,mBACA,gBACA,kBACA,kBACA,iBACA,gBACA,iBACA,kBACA,gBACA,iBACA,kBACA,kBACA,mBACA,kBACA,kBACA,mBACA,iBACA,mBACA,gBACA,gBACA,gBACA,kBACA,mBACA,gBACA,oBACA,kBACA,kBACA,sBACA,gBACA,iBACA,kBACA,mBACA,mBACA,iBACA,kBACA,iBACA,gBACA,mBACA,eACA,iBACA,qBACA,eACA,iBACA,iBACA,eACA,qBACA,gBACA,kBACA,kBACA,iBACA,kBACA,sBACA,gBACA,mBACA,kBACA,gBACA,kBACA,iBACA,iBACA,gBACA,gBACA,oBACA,iBACA,sBACA,gBACA,oBACA,kBACA,kBACA,mBACA,kBACA,sBACA,iBACA,eACA,kBACA,mBACA,iBACA,qBACA,iBACA,oBACA,iBACA,oBACA,gBACA,iBACA,eACA,iBACA,mBACA,kBACA,gBACA,iBACA,mBACA,kBACA,kBACA,sBACA,kBACA,eACA,qBACA,mBACA,iBACA,qBACA,oBACA,gBACA,cACA,iBACA,kBACA,mBACA,qBACA,oBACA,mBACA,gBACA,gBACA,gBACA,mBACA,iBACA,gBACA,wBACA,kBACA,iBACA,iBACA,kBACA,mBACA,iBACA,kBACA,iBACA,gBACA,iBACA,gBACA,mBACA,iBACA,iBACA,eACA,gBACA,iBACA,kBACA,iBACA,oBACA,mBACA,iBACA,gBACA,eACA,gBACA,eACA,mBACA,oBACA,iBACA,kBACA,iBACA,mBACA,kBACA,iBACA,eACA,mBACA,eACA,iBACA,gBACA,iBACA,kBACA,gBACA,eACA,gBACA,gBACA,gBACA,gBACA,eACA,oBACA,iBACA,kBACA,kBACA,gBACA,eACA,gBACA,iBACA,gBACA,mBACA,kBACA,iBACA,iBACA,gBACA,kBACA,kBACA,YACA,kBACA,kBACA,iBACA,gBACA,iBACA,oBACA,iBACA,iBACA,eACA,sBACA,gBACA,iBACA,iBACA,kBACA,eACA,mBACA,mBACA,mBACA,iBACA,oBACA,iBACA,iBACA,iBACA,eACA,oBACA,gBACA,gBACA,gBACA,kBACA,mBACA,gBACA,kBACA,gBACA,sBACA,cACA,oBACA,iBACA,eACA,iBACA,kBACA,iBACA,iBACA,kBACA,kBACA,oBACA,kBACA,mBACA,eACA,eACA,gBACA,mBACA,iBACA,kBACA,kBACA,mBACA,uBACA,iBACA,iBACA,yBACA,gBACA,iBACA,iBACA,kBACA,oBACA,kBACA,gBACA,qBACA,qBACA,eACA,iBACA,gBACA,gBACA,kBACA,mBACA,gBACA,gBACA,eACA,iBACA,qBACA,mBACA,gBACA,iBACA,gBACA,iBACA,gBACA,sBACA,kBACA,gBACA,gBACA,sBACA,mBACA,kBACA,kBACA,iBACA,iBACA,kBACA,oBACA,oBACA,gBACA,iBACA,iBACA,eACA,iBACA,qBACA,mBACA,gBACA,gBACA,kBACA,oBACA,kBACA,mBACA,iBACA,mBACA,mBACA,gBACA,oBACA,mBACA,mBACA,gBACA,kBACA,2BACA,kBACA,kBACA,iBACA,kBACA,gBACA,oBACA,iBACA,yBACA,gBACA,mBACA,mBACA,sBACA,qBACA,eACA,mBACA,iBACA,eACA,gBACA,oBACA,oBACA,iBACA,eACA,mBACA,mBACA,kBACA,kBACA,mBACA,qBACA,mBACA,kBACA,eACA,iBACA,mBACA,oBACA,oBACA,gBACA,iBACA,kBACA,mBACA,oBACA,sBACA,uBACA,kBACA,gBACA,sBACA,gBACA,oBACA,uBACA,qBACA,mBACA,sBACA,uBACA,oBACA,iBACA,iBACA,iCACA,eACA,kBACA,iBACA,oBACA,kBACA,mBACA,iBACA,gBACA,mBACA,oBACA,gBACA,kBACA,kBACA,uBACA,kBACA,sBACA,eACA,mBACA,mBACA,kBACA,iBACA,oBACA,kBACA,cACA,kBACA,iBACA,kBACA,iBACA,oBACA,iBACA,mBACA,kBACA,gBACA,mBACA,mBACA,mBACA,iBACA,kBACA,kBACA,iBACA,gBACA,gBACA,oBACA,eACA,gBACA,kBACA,mBACA,iBACA,uBACA,mBACA,kBACA,wBACA,qBACA,qBACA,mBACA,sBACA,qBACA,gBACA,kBACA,iBACA,mBACA,gBACA,cACA,gBACA,gBACA,kBACA,kBACA,kBACA,wBACA,yBACA,uBACA,qBACA,kBACA,iBACA,iBACA,mBACA,mBACA,eACA,cACA,iBACA,yBACA,gBACA,cACA,oBACA,kBACA,gBACA,eACA,kBACA,kBACA,gBACA,gBACA,2BACA,uBACA,kBACA,kBACA,gBACA,mBACA,oBACA,iBACA,eACA,kBACA,oBACA,qBACA,iBACA,gBACA,kBACA,iBACA,mBACA,eACA,oBACA,mBACA,iBACA,gBACA,iBACA,eACA,iBACA,wBACA,iBACA,wBACA,iBACA,sBACA,mBACA,gBACA,gBACA,iBACA,sBACA,gBACA,uBACA,mBACA,qBACA,mBACA,kBACA,iBACA,kBACA,kBACA,oBACA,iBACA,iBACA,cACA,sBACA,gBACA,kBACA,qBACA,uBACA,sBACA,eACA,gBACA,mBACA,oBACA,oBACA,sBACA,iBACA,wBACA,qBACA,kBACA,kBACA,oBACA,oBACA,qBACA,mBACA,wBACA,kBACA,wBACA,iBACA,iBACA,iBACA,gBACA,iBACA,kBACA,gBACA,qBACA,iBACA,iBACA,eACA,gBACA,gBACA,eACA,mBACA,mBACA,mBACA,qBACA,mBACA,mBACA,gBACA,kBACA,oBACA,gBACA,sBACA,kBACA,eACA,uBACA,gBACA,mBACA,iBACA,gBACA,iBACA,gBACA,eACA,kBACA,mBACA,iBACA,gBACA,kBACA,eACA,kBACA,mBACA,gBACA,eACA,kBACA,kBACA,gBACA,iBACA,eACA,eACA,gBACA,iBACA,kBACA,mBACA,kBACA,mBACA,iBACA,gBACA,kBACA,gBACA,cACA,mBACA,gBACA,uBACA,gBACA,kBACA,eACA,kBACA,eACA,oBACA,iBACA,mBACA,kBACA,iBACA,wBACA,qBACA,iBACA,gBACA,iBACA,eACA,kBACA,iBACA,uBACA,gBACA,mBACA,kBACA,qBACA,mBACA,iBACA,gBACA,kBACA,mBACA,uBACA,kBACA,mBACA,mBACA,gBACA,qBACA,gBACA,sBACA,iBACA,kBACA,iBACA,gBACA,mBACA,iBACA,mBACA,uBACA,iBACA,qBACA,kBACA,gBACA,kBACA,iBACA,eACA,iBACA,gBACA,oBACA,oBACA,iBACA,iBACA,kBACA,kBACA,qBACA,qBACA,mBACA,mBACA,eACA,gBACA,eACA,iBACA,uBACA,wBACA,yBACA,uBACA,sBACA,qBACA,iBACA,mBACA,iBACA,oBACA,kBACA,mBACA,kBACA,oBACA,iBACA,gBACA,mBACA,gBACA,iBACA,qBACA,iBACA,kBACA,mBACA,mBACA,iBACA,qBACA,uBACA,mBACA,iBACA,kBACA,mBACA,kBACA,oBACA,oBACA,qBACA,iBACA,qBACA,kBACA,oBACA,iBACA,iBACA,qBACA,kBACA,sBACA,gBACA,mBACA,iBACA,uBACA,kBACA,kBACA,iBACA,iBACA,kBACA,sBACA,iBACA,iBACA,iBACA,oBACA,gBACA,kBACA,gBACA,uBACA,kBACA,eACA,mBACA,sBACA,eACA,qBACA,sBACA,sBACA,qBACA,kBACA,qBACA,iBACA,iBACA,gBACA,iBACA,oBACA,mBACA,iBACA,mBACA,mBACA,eACA,gBACA,mBACA,gBACA,mBACA,gBACA,gBACA,gBACA,eACA,iBACA,iBACA,gBACA,iBACA,mBACA,kBACA,iBACA,iBACA,kBACA,oBACA,kBACA,mBACA,gBACA,uBACA,iBACA,wBACA,gBACA,iBACA,iBACA,eACA,mBACA,iBACA,kBACA,wBACA,cACA,kBACA,iBACA,gBACA,eACA,kBACA,cACA,mBACA,iBACA,uBACA,kBACA,mBACA,eACA,gBACA,sBACA,aACA,oBACA,sBACA,mBACA,kBACA,mBACA,mBACA,mBACA,qBACA,kBACA,iBACA,mBACA,kBACA,kBACA,oBACA,kBACA,mBACA,iBACA,oBACA,iBACA,qBACA,iBACA,sBACA,kBACA,sBACA,iBACA,kBACA,kBACA,sBACA,gBACA,eACA,mBACA,iBACA,qBACA,kBACA,iBACA,iBACA,mBACA,iBACA,mBACA,wBACA,mBACA,gBACA,iBACA,sBACA,mBACA,eACA,kBACA,gBACA,mBACA,kBACA,gBACA,kBACA,iBACA,qBACA,iBACA,kBACA,iBACA,mBACA,eACA,eACA,mBACA,kBACA,eACA,qBACA,mBACA,iBACA,eACA,sBACA,gBACA,kBACA,kBACA,kBACA,gBACA,kBACA,eACA,qBACA,kBACA,eACA,cACA,iBACA,cACA,YACA,iBACA,kBACA,aACA,eACA,gBACA,cACA,iBACA,eACA,eACA,eACA,aACA,gBACA,aACA,aACA,gBACA,gBACA,gBACA,iBACA,YACA,cACA,cACA,gBACA,aACA,gBACA,eACA,cACA,eACA,YACA,cACA,cACA,cACA,aACA,YACA,eACA,iBACA,iBACA,YACA,cACA,gBACA,kBACA,cACA,qBACA,kBACA,aACA,cACA,cACA,cACA,gBACA,eACA,gBACA,eACA,gBACA,eACA,iBACA,iBACA,iBACA,iBACA,iBACA,gBACA,kBACA,kBACA,oBACA,qBACA,iBACA,gBACA,kBACA,cACA,eACA,YACA,YACA,YACA,YACA,eACA,kBACA,gBACA,aACA,eACA,aACA,gBACA,gBACA,cACA,eACA,cACA,cACA,cACA,gBACA,eACA,kBACA,mBACA,gBACA,iBACA,gBACA,gBACA,eACA,eACA,aACA,cACA,gBACA,cACA,eACA,gBACA,iBACA,gBACA,kBACA,iBACA,mBACA,gBACA,gBACA,oBACA,eACA,cACA,gBACA,YACA,cACA,iBACA,gBACA,aACA,YACA,mBACA,aACA,eACA,gBACA,YACA,gBACA,gBACA,oBACA,cACA,0BACA,sBACA,UACA,kBACA,aACA,aACA,gBACA,cACA,gBACA,oBACA,iBACA,mBACA,iBACA,gBACA,gBACA,cACA,eACA,sBACA,cACA,gBACA,eACA,eACA,uBACA,qBACA,kBACA,yBACA,WACA,iBACA,qBACA,mBACA,eACA,cACA,cACA,eACA,gBACA,kBACA,cACA,gBACA,aACA,cACA,SACA,YACA,cACA,aACA,SACA,qBACA,mBACA,iBACA,cACA,eACA,kBACA,cACA,aACA,cACA,gBACA,cACA,eACA,qBACA,mBACA,mBACA,wBACA,oBACA,cACA,iBACA,YACA,eACA,sBACA,YACA,eACA,gBACA,eACA,eACA,iBACA,YACA,aACA,sBACA,mBACA,cACA,eACA,kBACA,eACA,eACA,WACA,iBACA,gBACA,UACA,kBACA,iBACA,YACA,eACA,cACA,aACA,eACA,oBACA,mBACA,4BACA,sBACA,cACA,gBACA,eACA,iBACA,gBACA,gBACA,eACA,6BACA,gBACA,aACA,mBACA,SACA,gBACA,cACA,iBACA,UACA,cACA,sBACA,QACA,YACA,SACA,aACA,YACA,YACA,iBACA,oBACA,gBACA,eACA,oBACA,eACA,eACA,aACA,aACA,cACA,gBACA,eACA,eACA,oBACA,eACA,iBACA,YACA,aACA,gBACA,qBACA,oBACA,mBACA,aACA,cACA,iBACA,cACA,cACA,eACA,iBACA,UACA,kBACA,kBACA,oBACA,iBACA,eACA,iBACA,iBACA,YACA,iBACA,aACA,cACA,SACA,oBACA,aACA,gBACA,aACA,aACA,SACA,UACA,SACA,SACA,aACA,aACA,aACA,aACA,mBACA,gBACA,kBACA,gBACA,aACA,YACA,cACA,mBACA,eACA,eACA,iBACA,iBACA,aACA,kBACA,oBACA,gBACA,YACA,SACA,qBACA,aACA,WACA,cACA,eACA,gBACA,aACA,mBACA,aACA,eACA,sBACA,kBACA,eACA,iBACA,kBACA,WACA,aACA,iBACA,WACA,gBACA,gBACA,YACA,gBACA,YACA,mBACA,gBACA,YACA,iBACA,mBACA,cACA,YACA,iBACA,sBACA,qBACA,cACA,eACA,gBACA,eACA,YACA,aACA,iBACA,iBACA,kBACA,eACA,kBACA,iBACA,iBACA,kBACA,YACA,kBACA,SACA,iBACA,iBACA,aACA,eACA,iBACA,WACA,aACA,WACA,gBACA,aACA,kBACA,WACA,iBACA,mBACA,gBACA,iBACA,aACA,WACA,iBACA,gBACA,WACA,YACA,eACA,WACA,UACA,YACA,QACA,kBACA,YACA,YACA,YACA,WACA,aACA,aACA,aACA,iBACA,YACA,aACA,eACA,gBACA,WACA,WACA,YACA,YACA,WACA,WACA,WACA,WACA,WACA,WACA,gBACA,mBACA,SACA,WACA,aACA,eACA,gBACA,gBACA,qBACA,WACA,UACA,UACA,UACA,UACA,UACA,mBACA,aACA,eACA,kBACA,mBACA,oBACA,eACA,eACA,aACA,iBACA,eACA,cACA,eACA,aACA,eACA,eACA,YACA,eACA,gBACA,gBACA,cACA,eACA,eACA,mBACA,gBACA,eACA,uBACA,kBACA,kBACA,gBACA,cACA,cACA,gBACA,gBACA,WACA,iBACA,cACA,cACA,eACA,eACA,kBACA,UACA,WACA,gBACA,eACA,WACA,eACA,cACA,cACA,aACA,mBACA,cACA,kBACA,cACA,eACA,aACA,SACA,aACA,cACA,eACA,cACA,kBACA,iBACA,cACA,iBACA,gBACA,eACA,eACA,eACA,aACA,eACA,aACA,iBACA,QACA,WACA,UACA,UACA,aACA,WACA,aACA,mBACA,mBACA,YACA,eACA,gBACA,uBACA,kBACA,aACA,gBACA,oBACA,sBACA,iBACA,iBACA,eACA,aACA,eACA,iBACA,oBACA,oBACA,oBACA,kBACA,kBACA,iBACA,cACA,gBACA,aACA,cACA,eACA,aACA,WACA,eACA,WACA,mBACA,iBACA,aACA,YACA,YACA,SACA,SACA,YACA,cACA,UACA,cACA,WACA,eACA,YACA,WACA,QACA,oBACA,WACA,iBACA,aACA,gBACA,eACA,eACA,cACA,aACA,iBACA,oBACA,mBACA,mBACA,qBACA,YACA,kBACA,cACA,QACA,SACA,QACA,aACA,cACA,YACA,cACA,aACA,WACA,oBACA,iBACA,oBACA,UACA,cACA,aACA,eACA,cACA,eACA,UACA,cACA,aACA,gBACA,kBACA,iBACA,cACA,UACA,UACA,iBACA,YACA,oBACA,YACA,YACA,YACA,YACA,YACA,4BACA,gBACA,kBACA,kBACA,aACA,gBACA,WACA,QACA,YACA,gBACA,kBACA,eACA,gBACA,aACA,eACA,gBACA,kBACA,YACA,aACA,aACA,uBACA,cACA,mBACA,eACA,UACA,gBACA,iBACA,mBACA,iBACA,SACA,kBACA,eACA,YACA,YACA,aACA,iBACA,aACA,aACA,aACA,gBACA,gBACA,gBACA,gBACA,cACA,iBACA,iBACA,iBACA,iBACA,iBACA,iBACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,aACA,eACA,uBACA,UACA,UACA,aACA,cACA,iBACA,iBACA,SACA,cACA,oBACA,iBACA,kBACA,iBACA,YACA,aACA,kBACA,mBACA,kBACA,oBACA,kBACA,cACA,aACA,oBACA,YACA,iBACA,aACA,eACA,mBACA,gBACA,eACA,gBACA,cACA,mBACA,qBACA,cACA,YACA,mBACA,eACA,cACA,yBACA,iBACA,aACA,mBACA,iBACA,aACA,aACA,eACA,gBACA,aACA,kBACA,aACA,WACA,cACA,iBACA,eACA,YACA,UACA,gBACA,kBACA,UACA,aACA,YACA,kBACA,mBACA,cACA,eACA,qBACA,gBACA,gBACA,gBACA,eACA,qBACA,mBACA,cACA,aACA,iBACA,cACA,gBACA,cACA,YACA,YACA,kBACA,YACA,mBACA,gBACA,sBACA,mBACA,uBACA,iBACA,iBACA,gBACA,YACA,kBACA,cACA,uBACA,cACA,YACA,WACA,kBACA,kBACA,YACA,YACA,WACA,WACA,WACA,YACA,YACA,YACA,cACA,YACA,iBACA,aACA,eACA,kBACA,eACA,iBACA,aACA,mBACA,iBACA,mBACA,sBACA,gBACA,YACA,cACA,eACA,kBACA,YACA,gBACA,UACA,iBACA,cACA,eACA,cACA,cACA,qBACA,mBACA,kBACA,kBACA,wBACA,WACA,UACA,UACA,YACA,WACA,wBACA,qBACA,eACA,gBACA,eACA,WACA,cACA,gBACA,aACA,aACA,eACA,mBACA,yBACA,cACA,YACA,iBACA,eACA,aACA,aACA,cACA,oBACA,kBACA,sBACA,qBACA,kBACA,iBACA,cACA,cACA,sBACA,aACA,gBACA,eACA,uBACA,cACA,mBACA,iBACA,eACA,SACA,gBACA,cACA,iBACA,eACA,gBACA,gBACA,iBACA,gBACA,eACA,gBACA,iBACA,gBACA,iBACA,iBACA,4BACA,iBACA,iBACA,eACA,YACA,iBACA,oBACA,UACA,kBACA,iBACA,gBACA,mBACA,cACA,eACA,gBACA,mBACA,WACA,gCACA,YACA,QACA,WACA,gBACA,YACA,SACA,YACA,cACA,SACA,WACA,iBACA,WACA,gBACA,qBACA,mBACA,eACA,cACA,iBACA,iBACA,eACA,eACA,cACA,mBACA,gBACA,eACA,WACA,YACA,kBACA,cACA,SACA,aACA,iBACA,eACA,mBACA,iBACA,eACA,eACA,kBACA,iBACA,YACA,aACA,gBACA,cACA,kBACA,mBACA,uBACA,gBACA,cACA,iBACA,eACA,gBACA,eACA,UACA,UACA,gBACA,qBACA,uBACA,iBACA,kBACA,mBACA,oBACA,kBACA,kBACA,aACA,YACA,gBACA,eACA,mBACA,eACA,mBACA,aACA,iBACA,oBACA,eACA,cACA,eACA,mBACA,gBACA,gBACA,eACA,mBACA,uBACA,eACA,kBACA,YACA,oBACA,gBACA,YACA,aACA,gBACA,WACA,yBACA,mBACA,qBACA,iBACA,iBACA,+BACA,iBACA,gBACA,aACA,YACA,YACA,mBACA,gBACA,SACA,UACA,kBACA,aACA,YACA,SACA,QACA,iBACA,kBACA,WACA,iBACA,iBACA,cACA,aACA,aACA,cACA,SACA,WACA,kBACA,YACA,iBACA,YACA,eACA,YACA,kBACA,SACA,aACA,WACA,QACA,YACA,QACA,gBACA,aACA,eACA,kBACA,aACA,YACA,aACA,WACA,mBACA,iBACA,kBACA,iBACA,gBACA,iBACA,kBACA,gBACA,cACA,WACA,cACA,uBACA,mBACA,iBACA,iBACA,cACA,gBACA,qBACA,aACA,kBACA,eACA,cACA,qBACA,gBACA,oBACA,aACA,kBACA,aACA,iBACA,iBACA,UACA,gBACA,iBACA,wBACA,aACA,kBACA,cACA,eACA,YACA,mBACA,eACA,gBACA,gBACA,kBACA,aACA,aACA,aACA,WACA,eACA,aACA,iBACA,kBACA,iBACA,kBACA,6BACA,mBACA,cACA,SACA,iBACA,gBACA,iBACA,eACA,mBACA,qBACA,qBACA,iBACA,yBACA,kBACA,aACA,YACA,gBACA,kBACA,YACA,iBACA,oBACA,kBACA,gBACA,iBACA,qBACA,kBACA,iBACA,gBACA,kBACA,iBACA,mBACA,0BACA,mBACA,UACA,cACA,YACA,mBACA,8BACA,UACA,UACA,WACA,kBACA,eACA,kBACA,iBACA,kBACA,cACA,gBACA,YACA,SACA,cACA,kBACA,kBACA,oBACA,0BACA,kBACA,gBACA,UACA,UACA,cACA,mBACA,kBACA,gBACA,qBACA,cACA,iBACA,cACA,cACA,cACA,cACA,kBACA,cACA,cACA,eACA,cACA,kBACA,sBACA,gBACA,gBACA,gBACA,aACA,eACA,cACA,cACA,WACA,kBACA,iBACA,iBACA,cACA,WACA,cACA,YACA,eACA,eACA,UACA,WACA,eACA,gBACA,oBACA,eACA,iBACA,eACA,kBACA,eACA,iBACA,aACA,gBACA,WACA,WACA,UACA,eACA,UACA,YACA,kBACA,yBACA,eACA,qBACA,mBACA,gBACA,iBACA,aACA,UACA,cACA,wBACA,eACA,gBACA,eACA,gBACA,gBACA,+BACA,iBACA,iBACA,SACA,UACA,iBACA,iBACA,gBACA,gBACA,WACA,iBACA,eACA,WACA,YACA,cACA,iBACA,mBACA,gBACA,gBACA,eACA,mBACA,oBACA,iBACA,iBACA,mBACA,mBACA,kBACA,eACA,iBACA,gBACA,eACA,gBACA,YACA,WACA,gBACA,SACA,mBACA,YACA,aACA,iBACA,iBACA,iBACA,mBACA,gBACA,gBACA,WACA,uBACA,uBACA,oBACA,aACA,QACA,iBACA,gBACA,iBACA,mBACA,YACA,eACA,gBACA,gBACA,iBACA,eACA,gBACA,oBACA,WACA,aACA,iBACA,gBACA,cACA,cACA,cACA,cACA,aACA,cACA,aACA,iBACA,eACA,aACA,iBACA,iBACA,eACA,cACA,qBACA,iBACA,iBACA,iBACA,cACA,gBACA,gBACA,gBACA,aACA,cACA,iBACA,gBACA,kBACA,iBACA,iBACA,cACA,kBACA,kBACA,kBACA,mBACA,qBACA,eACA,cACA,gBACA,gBACA,YACA,WACA,gBACA,eACA,aACA,iBACA,eACA,gBACA,iBACA,gBACA,qBACA,iBACA,eACA,cACA,iBACA,gBACA,iBACA,gBACA,gBACA,iBACA,aACA,YACA,iBACA,oBACA,SACA,WACA,eACA,iBACA,eACA,iBACA,uBACA,WACA,WACA,YACA,aACA,YACA,gBACA,eACA,gBACA,WACA,eACA,iBACA,eACA,oBACA,eACA,eACA,gBACA,gBACA,gBACA,eACA,qBACA,gBACA,mBACA,oBACA,kBACA,mBACA,mBACA,YACA,iBACA,iBACA,aACA,aACA,qBACA,sBACA,gBACA,eACA,qBACA,gBACA,gBACA,gBACA,aACA,oBACA,eACA,iBACA,aACA,gBACA,cACA,eACA,eACA,eACA,eACA,gBACA,gBACA,cACA,gBACA,gBACA,kBACA,aACA,aACA,gBACA,aACA,eACA,eACA,qBACA,eACA,cACA,aACA,mBACA,gBACA,cACA,qBACA,eACA,iBACA,cACA,iBACA,gBACA,kBACA,YACA,gBACA,YACA,cACA,iBACA,YACA,eACA,eACA,mBACA,UACA,eACA,SACA,aACA,UACA,iBACA,iBACA,cACA,iBACA,gBACA,uBACA,eACA,qBACA,aACA,gBACA,gBACA,gBACA,sBACA,kBACA,YACA,eACA,WACA,gBACA,cACA,WACA,aACA,cACA,YACA,YACA,mBACA,aACA,eACA,iBACA,iBACA,UACA,YACA,kBACA,iBACA,iBACA,iBACA,eACA,sBACA,oBACA,WACA,YACA,UACA,cACA,kBACA,eACA,oBACA,gBACA,kBACA,iBACA,gBACA,aACA,qBACA,mBACA,0BACA,kBACA,gBACA,eACA,iBACA,eACA,qBACA,cACA,WACA,cACA,cACA,iBACA,cACA,aACA,aACA,eACA,sBACA,YACA,eACA,cACA,aACA,sBACA,cACA,aACA,cACA,cACA,iBACA,gBACA,eACA,gBACA,eACA,qBACA,cACA,iBACA,gBACA,kBACA,gBACA,gBACA,kBACA,gBACA,cACA,cACA,cACA,gBACA,mBACA,iBACA,gBACA,eACA,yBACA,qBACA,oBACA,0BACA,qBACA,2BACA,cACA,gBACA,eACA,iBACA,iBACA,iBACA,oBACA,WACA,YACA,eACA,eACA,eACA,WACA,WACA,UACA,gBACA,YACA,UACA,WACA,UACA,WACA,SACA,WACA,eACA,eACA,oBACA,mBACA,SACA,kBACA,mBACA,iBACA,mBACA,iBACA,eACA,oBACA,iBACA,oBACA,gBACA,eACA,oBACA,mBACA,iBACA,kBACA,kBACA,kBACA,iBACA,qBACA,mBACA,iBACA,qBACA,kBACA,eACA,oBACA,iBACA,iBACA,oBACA,iBACA,kBACA,mBACA,kBACA,mBACA,eACA,iBACA,sBACA,iBACA,iBACA,kBACA,mBACA,iBACA,qBACA,mBACA,iBACA,iBACA,uBACA,mBACA,kBACA,oBACA,gBACA,mBACA,uBACA,kBACA,qBACA,oBACA,cACA,iBACA,mBACA,sBACA,cACA,YACA,eACA,oBACA,gBACA,oBACA,uBACA,uBACA,oBACA,cACA,oBACA,gBACA,eACA,mBACA,oBACA,eACA,mBACA,gBACA,mBACA,sBACA,uBACA,gBACA,qBACA,mBACA,iBACA,iBACA,YACA,YACA,aACA,YACA,YACA,YACA,cACA,aACA,aACA,gBACA,gBACA,eACA,eACA,2BACA,eACA,YACA,aACA,aACA,cACA,4BACA,kBACA,iBACA,YACA,aACA,aACA,gBACA,SACA,oBACA,WACA,aACA,aACA,gBACA,aACA,aACA,aACA,aACA,WACA,aACA,aACA,WACA,kBACA,aACA,YACA,WACA,YACA,UACA,iBACA,cACA,iBACA,cACA,kBACA,gBACA,mBACA,iBACA,iBACA,cACA,aACA,mBACA,YACA,gBACA,kBACA,iBACA,gBACA,eACA,iBACA,gBACA,eACA,cACA,aACA,kBACA,uBACA,iBACA,gBACA,iBACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,iBACA,gBACA,gBACA,eACA,gBACA,eACA,eACA,gBACA,gBACA,kBACA,iBACA,iBACA,YACA,aACA,YACA,YACA,aACA,oBACA,eACA,gBACA,kBACA,YACA,cACA,YACA,gBACA,oBACA,mBACA,eACA,eACA,iBACA,kBACA,eACA,eACA,gBACA,gBACA,aACA,iBACA,kBACA,gBACA,qBACA,aACA,aACA,cACA,SACA,eACA,gBACA,eACA,eACA,WACA,aACA,UACA,YACA,iBACA,cACA,oBACA,YACA,iBACA,YACA,eACA,SACA,YACA,aACA,QACA,SACA,cACA,WACA,cACA,YACA,eACA,UACA,WACA,aACA,UACA,UACA,gBACA,aACA,kBACA,aACA,YACA,UACA,cACA,aACA,YACA,gBACA,oBACA,mBACA,YACA,YACA,aACA,gBACA,mBACA,oBACA,SACA,YACA,kBACA,YACA,cACA,eACA,SACA,SACA,aACA,cACA,qBACA,iBACA,aACA,aACA,aACA,aACA,aACA,WACA,cACA,cACA,aACA,SACA,aACA,UACA,gBACA,cACA,iBACA,aACA,iBACA,YACA,QACA,UACA,UACA,gBACA,YACA,iBACA,kBACA,eACA,eACA,sBACA,cACA,WACA,WACA,iBACA,aACA,aACA,WACA,aACA,cACA,aACA,YACA,eACA,eACA,oBACA,iBACA,aACA,eACA,aACA,eACA,mBACA,eACA,cACA,kBACA,wBACA,cACA,qBACA,eACA,oBACA,iBACA,cACA,eACA,eACA,cACA,oBACA,oBACA,eACA,qBACA,cACA,eACA,gBACA,SACA,cACA,aACA,eACA,aACA,iBACA,cACA,aACA,yBACA,kBACA,mBACA,oBACA,kBACA,kBACA,gBACA,eACA,YACA,mBACA,mBACA,gBACA,aACA,aACA,eACA,YACA,YACA,aACA,iBACA,SACA,cACA,cACA,mBACA,WACA,kBACA,aACA,cACA,aACA,SACA,qBACA,qBACA,qBACA,mBACA,uBACA,eACA,cACA,WACA,QACA,SACA,UACA,eACA,YACA,aACA,QACA,aACA,aACA,gBACA,eACA,cACA,cACA,YACA,cACA,gBACA,aACA,aACA,YACA,mBACA,eACA,eACA,aACA,uBACA,gBACA,cACA,cACA,YACA,aACA,mBACA,kBACA,eACA,kBACA,iBACA,iBACA,SACA,qBACA,gBACA,aACA,gBACA,iBACA,aACA,uBACA,eACA,cACA,mBACA,eACA,kBACA,cACA,eACA,wBACA,eACA,gBACA,gBACA,eACA,aACA,iBACA,aACA,eACA,eACA,eACA,cACA,qBACA,iBACA,iBACA,kBACA,iBACA,eACA,aACA,SACA,eACA,eACA,iBACA,eACA,oBACA,WACA,oBACA,oBACA,mBACA,kBACA,iBACA,mBACA,kBACA,kBACA,sBACA,cACA,eACA,gBACA,qBACA,iBACA,iBACA,cACA,iBACA,qBACA,aACA,WACA,iBACA,gBACA,eACA,eACA,eACA,eACA,cACA,mBACA,iBACA,qBACA,aACA,iBACA,eACA,mBACA,eACA,eACA,mBACA,sBACA,uBACA,kBACA,iBACA,iBACA,iBACA,iBACA,eACA,iBACA,cACA,YACA,yBACA,oBACA,iBACA,YACA,SACA,eACA,WACA,YACA,aACA,eACA,aACA,cACA,cACA,oBACA,iBACA,iBACA,eACA,WACA,iBACA,aACA,iBACA,eACA,iBACA,iBACA,kBACA,mBACA,aACA,gBACA,gBACA,aACA,UACA,cACA,cACA,aACA,QACA,eACA,qBACA,cACA,cACA,kBACA,kBACA,gBACA,gBACA,eACA,WACA,UACA,iBACA,qBACA,cACA,YACA,WACA,UACA,qBACA,aACA,iBACA,WACA,UACA,aACA,WACA,QACA,aACA,YACA,gBACA,YACA,aACA,eACA,eACA,SACA,WACA,WACA,eACA,WACA,WACA,gBACA,qBACA,YACA,gBACA,aACA,aACA,YACA,WACA,SACA,WACA,SACA,cACA,eACA,aACA,QACA,gBACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,cACA,YACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,YACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,cACA,gBACA,YACA,eACA,aACA,UACA,aACA,cACA,YACA,YACA,YACA,aACA,aACA,cACA,YACA,WACA,YACA,aACA,YACA,YACA,gBACA,SACA,cACA,aACA,aACA,YACA,mBACA,UACA,YACA,YACA,cACA,gBACA,iBACA,cACA,cACA,aACA,cACA,cACA,gBACA,cACA,aACA,kBACA,eACA,YACA,iBACA,gBACA,iBACA,gBACA,sBACA,gBACA,oBACA,2BACA,oBACA,YACA,qBACA,6BACA,wBACA,kBACA,cACA,gBACA,gBACA,mBACA,aACA,aACA,cACA,UACA,SACA,aACA,SACA,cACA,cACA,cACA,gBACA,eACA,YACA,aACA,iBACA,qBACA,gBACA,gBACA,gBACA,cACA,cACA,uBACA,WACA,UACA,cACA,UACA,aACA,aACA,cACA,iBACA,aACA,iBACA,WACA,WACA,cACA,cACA,cACA,WACA,eACA,YACA,YACA,eACA,YACA,iBACA,mBACA,YACA,YACA,iBACA,aACA,cACA,UACA,WACA,cACA,gBACA,gBACA,UACA,aACA,SACF,EACOC,GAAQD,GCz+Lf,IAAME,GAAwC,CAC1C,UACA,YACA,QACA,UACA,0BACA,aACA,aACA,eACA,QACA,WACA,YACA,UACA,cACA,eACA,eACA,aACA,2CACA,aACA,aACA,cACA,mBACA,YACA,cACA,YACA,YACA,eACA,cACA,aACA,qBACA,cACA,eACA,iBACA,UACA,WACA,YACA,YACA,WACA,YACA,UACA,oBACA,UACA,WACA,cACA,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", "names": ["DocumentFormSettingsKey", "VideoFormSettingsKey", "VideoGatedFormSettingsKey", "CustomResourceFormSettingsKey", "ContactFormSettingsKey", "MaturityFormKey", "AnyFormSettingsKey", "MarketoBaseUrl", "MarketoMunchkinId", "recaptchaSiteKey", "FormSettingsObject", "AnyFormSettingsKey", "result", "formExperienceKey", "formExperience", "FormExperienceSettingsObject", "getFormSettings", "getFormClasses", "marketoFormSettingsKey", "modalFormClass", "formSpecificRootClass", "marketoFormClass", "hasPropWithType", "val", "prop", "typeCheckFn", "hasOptionalPropWithType", "checkConditionOrThrow", "value", "condition", "throwOnMissing", "errorMessage", "checkIsTypeOrThrow", "formatErrorMessage", "messageLabel", "errors", "message", "err", "e", "isBaseResource", "val", "throwOnMissing", "checkIsTypeOrThrow", "isObject", "checkConditionOrThrow", "x", "hasPropWithType", "isString", "hasOptionalPropWithType", "isNil", "isDocument", "y", "err", "formatErrorMessage", "isVideoOnly", "isVideoWithDocs", "isDocumentArray", "isArrayOfType", "isVideoArray", "isVideoWithDocsArray", "isSelectedSingleResource", "val", "typeCheckFn", "isObject", "hasPropWithType", "isSelectedMultiResource", "throwOnMissing", "checkIsTypeOrThrow", "checkConditionOrThrow", "x", "isArray", "isArrayOfType", "y", "err", "formatErrorMessage", "isWidget", "val", "isObject", "hasPropWithType", "isString", "hasOptionalPropWithType", "isNil", "FormSetupType", "SetupType", "isFormSetupType", "isCreateFormTrackingObject", "val", "isObject", "hasOptionalPropWithType", "isString", "isNil", "isFinalFormTrackingObject", "throwOnMissing", "checkIsTypeOrThrow", "checkConditionOrThrow", "x", "hasPropWithType", "isBoolean", "err", "formatErrorMessage", "isBaseFormSetupObject", "val", "dataVersion", "throwOnMissing", "checkIsTypeOrThrow", "isObject", "checkConditionOrThrow", "x", "hasPropWithType", "isFormSetupType", "FormSetupType", "hasOptionalPropWithType", "isCreateFormTrackingObject", "isFinalFormTrackingObject", "err", "formatErrorMessage", "isFormObjectWithVideo", "val", "typeCheckFn", "isObject", "hasPropWithType", "isFinalResourceFormSetup", "val", "throwOnMissing", "checkConditionOrThrow", "x", "isBaseFormSetupObject", "hasPropWithType", "isObject", "y", "isSelectedMultiResource", "isDocument", "err", "formatErrorMessage", "isFinalVideoFormSetup", "val", "throwOnMissing", "checkConditionOrThrow", "x", "isBaseFormSetupObject", "hasPropWithType", "isObject", "y", "isSelectedMultiResource", "isDocument", "isFormObjectWithVideo", "isSelectedSingleResource", "isVideoWithDocs", "err", "formatErrorMessage", "isFinalPostEventFormSetup", "isVideoOnly", "isFinalGatedVideoFormSetup", "val", "throwOnMissing", "checkConditionOrThrow", "x", "isBaseFormSetupObject", "hasPropWithType", "isObject", "isFormObjectWithVideo", "y", "isSelectedSingleResource", "isVideoOnly", "err", "formatErrorMessage", "isFinalContactFormSetup", "isAnyFormFinalSetupObject", "value", "errors", "isFinalResourceFormSetup", "isFinalVideoFormSetup", "isFinalPostEventFormSetup", "isObjectWithWidgetProp", "value", "throwOnMissing", "checkConditionOrThrow", "x", "hasPropWithType", "isWidget", "isFormWidgetData", "value", "setupType", "throwOnMissing", "FormSetupType", "isArray", "checkIsTypeOrThrow", "isObject", "isObjectWithWidgetProp", "isAnyFormFinalSetupObject", "checkConditionOrThrow", "s", "err", "formatErrorMessage", "slotPattern", "install", "app", "i18next", "rerenderOn", "slotStart", "slotEnd", "genericT", "lastI18nChange", "ref", "invalidate", "usingI18n", "event", "_a", "TranslationComponent", "_b", "options", "name", "rand", "localNs", "x", "loadBundle", "bundle", "lng2", "resources", "lng", "ns", "keyPrefix", "handleI18nOptions", "t", "getTranslationFunction", "key", "options2", "includesNs", "target", "prop", "slotNamePattern", "nsSeparator", "messages", "namespaces", "useTranslation", "instance", "currentInstance", "globalProps", "getCurrentInstance", "start", "end", "pattern", "defineComponent", "props", "slots", "translation", "result", "match", "lastIndex", "slot", "isSiteLocaleWithExtendedCountryLocales", "value", "createCountryLocale", "countryName", "countryLocale", "locale", "createLanguageLocale", "languageName", "languageLocale", "locale", "createLanguageCountryLocale", "languageName", "countryName", "languageLocale", "countryLocale", "languageCountryLocale", "locale", "createLanguageLocale", "createCountryLocale", "createSiteLocale", "siteCountryCode", "languageLocale", "languageName", "countryLocale", "countryName", "extendedCountryLocales", "urlPrefix", "siteLocale", "createLanguageCountryLocale", "Additional_APAC", "createCountryLocale", "Additional_EMEA", "LocaleSettingsArray", "createSiteLocale", "SiteLocaleWithExtendedCountryLocaleArray", "isSiteLocaleWithExtendedCountryLocales", "SiteLocaleSettings", "convertArrayToPropIndexedObject", "SiteCountryCode", "mapArrayToProp", "LocaleSettingsArray", "SiteCountryCodeUppercase", "SiteCountryCodeAnyCase", "isSiteCountryCode", "value", "ExtendedLocales", "flatMapArrayToNestedProp", "LocaleSettingsArray", "ExtendedLocaleSettingsObject", "convertArrayToPropIndexedObject", "ExtendedLocaleCountry", "ExtendedLocaleOnlySettings", "GetLocale", "byCountryLocale", "localeArray", "countryLocale", "throwIfMissing", "countryLocaleLower", "res", "el", "byLanguageCountryLocale", "languageCountryLocale", "langCountryLocaleLower", "GetExtendedLocale", "extendedCountryLocale", "ExtendedLocaleSettingsObject", "GetSiteLocale", "bySiteCountryCode", "siteCountryCode", "lowerCaseSiteCountryCode", "isSiteCountryCode", "result", "SiteLocaleSettings", "exhaustiveGuard", "LocaleSettingsArray", "byExtendedCountryLocale", "extendedCountryLocaleLower", "SiteLocaleWithExtendedCountryLocaleArray", "siteLocale", "extendedLoc", "LocaleConvert", "FromSiteCountryCode", "ToUrlPrefix", "siteCountryCode", "throwIfMissing", "GetSiteLocale", "ToLanguageCountryLocale", "FromLanguageCountry", "locale", "ToCountryLocale", "CountryLocale", "mapArrayToProp", "LocaleSettingsArray", "CountryLocaleUpperCase", "CountryLocaleAnyCase", "LanguageCountryLocale", "mapArrayToProp", "LocaleSettingsArray", "LanguageCountryLocaleLowercase", "LanguageCountryLocaleUppercase", "LanguageCountryLocaleAnyCase", "LanguageLocale", "uniqueTupleValues", "mapArrayToProp", "LocaleSettingsArray", "LanguageLocaleUppercase", "LanguageLocaleAnyCase", "LocaleUrlPrefix", "mapArrayToProp", "LocaleSettingsArray", "SiteLocaleFunctions", "GetSiteLocale", "GetExtendedLocale", "SiteLocale", "SiteLocaleSettings", "TranslationNamespace", "TranslationNamespaceEnum", "createEnumFromKeys", "CreateInjectionKeysRecord", "keysRecord", "keys", "k", "keyValue", "isString", "checkCurrentInstanceProvidesKey", "vm", "key", "isObject", "keySymbol", "value", "isUndefined", "injectWithSelf", "defaultValue", "getCurrentInstance", "inject", "checkValuesAlreadyProvided", "injectionKeys", "obj", "isNil", "isSymbol", "isArrayOfType", "defaultVal", "injectRequiredWithSelf", "isWatchable", "value", "isRef", "isFunction", "UseFormLoggerInjectionKeys", "CreateInjectionKeysRecord", "initFormLogger", "formSettingsKey", "checkValuesAlreadyProvided", "logger", "BaseFormLogger", "SecondButtonDefaultStyle", "getVerboseLogger", "verboseDebugTag", "provide", "useFormLogger", "callerLabel", "injectRequiredWithSelf", "err", "UseSiteLanguageInjectionKeys", "CreateInjectionKeysRecord", "initSiteLanguage", "siteCountryCode", "checkValuesAlreadyProvided", "isSiteCountryCode", "provide", "LocaleConvert", "exhaustiveGuard", "useSiteLanguage", "callerLabel", "logger", "useFormLogger", "injectRequiredWithSelf", "localeUrlPrefix", "err", "UseFormSettingsInjectionKeys", "CreateInjectionKeysRecord", "initFormSettings", "formSettingsKey", "checkValuesAlreadyProvided", "FormSettings", "getFormSettings", "FormClasses", "getFormClasses", "provide", "useFormSettings", "callerLabel", "logger", "useFormLogger", "injectRequiredWithSelf", "err", "UseKnownVisitorInjectionKeys", "CreateInjectionKeysRecord", "initMarketoKnownVisitorState", "FormElementWrapper", "shallowRef", "FormElement", "computed", "isNil", "checkValuesAlreadyProvided", "initMarketoFormElement", "formElement", "isMarketoKnownVisitor", "isKnownViewInput", "val", "isString", "provide", "useMarketoKnownVisitorState", "callerLabel", "logger", "useFormLogger", "injectRequiredWithSelf", "err", "FormOrFormExperienceType", "getHighestPriorityFormGatingLevel", "gatingStates", "gatingStatesStr", "s", "getHighestPriorityExperienceGatingLevel", "highestGatingLevel", "isNotNil", "getHighestPriorityGatingLevel", "type", "exhaustiveGuard", "getGatingLevelFromInitParameter", "type", "formSettingsKey", "settings", "gatingLevelCustom", "isNil", "highestSettingsLevel", "getHighestPriorityGatingLevel", "allowedValuesStr", "s", "getGatingLevelFromSelf", "settings", "gateLevelSource", "defaultGateLevel", "getResourceGatingLevel", "resource", "isStringLiteralOfType", "exhaustiveGuard", "getGatingLevelFromResources", "type", "settings", "resources", "allowedGatingStates", "filteredResourceGatingLevels", "r", "getResourceGatingLevel", "rgl", "isStringLiteralOfType", "returnVal", "getHighestPriorityGatingLevel", "isNotNil", "highestSettingsLevel", "FormOrFormExperienceType", "exhaustiveGuard", "getGatingLevelFromWidgetData", "type", "formSettingsKey", "settings", "widgetData", "gateLevelSource", "allowedGatingStates", "allowedFormGatingLevels", "a", "GatingLevel", "hasDocGatingSrc", "hasVidGatingSrc", "hasSetupGatingSrc", "gatingResources", "form", "isStringLiteralOfType", "resourceGating", "getGatingLevelFromResources", "isNil", "FormOrFormExperienceType", "exhaustiveGuard", "getInitialGatingLevel", "type", "formSettingsKey", "settings", "widgetData", "gatingLevelCustom", "gateLevelSource", "initParamGatingLevel", "getGatingLevelFromInitParameter", "isNotNil", "selfGatingLevel", "getGatingLevelFromSelf", "widgetDataGatingLevel", "getGatingLevelFromWidgetData", "encodeName", "name", "encodeValue", "value", "decodeName", "decodeValue", "stringifyAttributes", "attributes", "key", "get", "scan", "jar", "match", "found", "DEFAULT_CODEC", "DEFAULT_ATTRIBUTES", "setCookie", "encodeValue$1", "encodeName$1", "getCookie", "decodeValue$1", "decodeName$1", "getCookies", "removeCookie", "init", "converter", "defaultAttributes", "api", "config", "compat", "userGatingLevelCookieName", "UserGatingLevelCookieWrapper", "val", "getCookie", "isString", "GatingLevel", "value", "domain", "BaseFormLogger", "setCookie", "getGatingStateFromUserGatingCookie", "cookieStateValue", "initialGatingLevel", "_allowedGatingStates", "isStringLiteralOfType", "GatingLevel", "exhaustiveGuard", "getGatingStateFromDynamicValues", "_type", "isMarketoKnownVisitor", "allowedGatingStates", "cookieGatingLevelState", "toValue", "UseGatingLevelInjectionKeys", "CreateInjectionKeysRecord", "initGatingLevel", "options", "checkValuesAlreadyProvided", "formSettingsKey", "widgetData", "gatingLevelCustom", "FormSettings", "useFormSettings", "allowedGatingStates", "gatingCookiePermissions", "initialMarketoFormGatingLevel", "getInitialGatingLevel", "initialFormExperienceGatingLevel", "isNil", "isMarketoKnownVisitor", "useMarketoKnownVisitorState", "CookieGatingLevelState", "computed", "cookieGatingLevel", "UserGatingLevelCookieWrapper", "isStringLiteralOfType", "exhaustiveGuard", "setCookieGatingLevelState", "cookieGatingState", "GatingLevel", "CurrentMarketoFormGatingState", "getGatingStateFromDynamicValues", "CurrentFormExperienceGatingState", "provide", "useGatingLevel", "callerLabel", "logger", "useFormLogger", "injectionKeys", "injectRequiredWithSelf", "FormGatingLevel", "FormExperienceGatingLevel", "err", "isVue2", "computedWithControl", "source", "fn", "v", "track", "trigger", "dirty", "ref", "update", "watch", "get", "set", "result", "customRef", "_track", "_trigger", "v2", "tryOnScopeDispose", "getCurrentScope", "onScopeDispose", "createEventHook", "fns", "off", "offFn", "args", "toValue", "r", "unref", "isClient", "isWorker", "isDef", "val", "notNullish", "toString", "isObject", "val", "noop", "cacheStringFunction", "fn", "cache", "str", "hyphenateRE", "hyphenate", "camelizeRE", "camelize", "_", "c", "refDefault", "source", "defaultValue", "computed", "_a", "value", "unrefElement", "elRef", "_a", "plain", "toValue", "defaultWindow", "isClient", "defaultDocument", "defaultNavigator", "defaultLocation", "useEventListener", "args", "target", "events", "listeners", "options", "noop", "cleanups", "cleanup", "fn", "register", "el", "event", "listener", "options2", "stopWatch", "watch", "optionsClone", "isObject", "stop", "tryOnScopeDispose", "useMounted", "isMounted", "ref", "instance", "getCurrentInstance", "onMounted", "isVue2", "useSupported", "callback", "computed", "useMutationObserver", "target", "options", "window", "defaultWindow", "mutationOptions", "observer", "isSupported", "cleanup", "targets", "value", "toValue", "items", "unrefElement", "notNullish", "stopWatch", "watch", "targets2", "el", "takeRecords", "stop", "tryOnScopeDispose", "useActiveElement", "_a", "deep", "triggerOnRemoval", "document", "getDeepActiveElement", "_a2", "element", "activeElement", "trigger", "useEventListener", "event", "mutations", "m", "n", "node", "cloneFnJSON", "source", "DEFAULT_UNITS", "useVModel", "props", "key", "emit", "options", "_a", "_b", "_c", "_d", "_e", "clone", "passive", "eventName", "deep", "defaultValue", "shouldEmit", "vm", "getCurrentInstance", "_emit", "event", "isVue2", "modelOptions", "cloneFn", "val", "cloneFnJSON", "getValue", "isDef", "triggerEmit", "value", "initialValue", "proxy", "ref", "isUpdating", "watch", "v", "nextTick", "computed", "UseMarketoFormEventInjectionKeys", "CreateInjectionKeysRecord", "initMarketoFormEvents", "checkValuesAlreadyProvided", "marketoSetup", "createEventHook", "ready", "userFirstInteraction", "validationErrorOnSubmit", "marketoValidation", "submit", "completed", "modalClosed", "formAbandonment", "formEventHooks", "logger", "useFormLogger", "onEvent", "eventName", "callback", "offEvent", "provide", "useFormEvents", "callerLabel", "useFormEventsValue", "injectRequiredWithSelf", "err", "UseEclipseHtmlFormElementInjectionKeys", "CreateInjectionKeysRecord", "initEclipseHtmlFormElement", "checkValuesAlreadyProvided", "EclipseHtmlFormElement", "ref", "setEclipseHtmlFormElement", "formEl", "provide", "useEclipseHtmlFormElement", "callerLabel", "logger", "useFormLogger", "injectRequiredWithSelf", "err", "activeElement", "useActiveElement", "isActiveElementMatch", "formElement", "htmlElement", "inputName", "activeInputVerboseLogger", "isAnyHTMLInputElementType", "newInputState", "formValues", "required", "validator", "logger", "isReactive", "inputValue", "computed", "active", "formEl", "toValue", "isNil", "touched", "ref", "watch", "isActive", "value", "prevValue", "isEmpty", "isString", "hasRequiredError", "validatorFn", "unref", "validationCheck", "isFunction", "hasValidatorError", "hasError", "errorVisibilityWithoutActiveCheck", "errorVisibilityForInactiveInput", "wasAlreadyDisplayingError", "currentInactiveVisibility", "prevInactiveVisibility", "errorVisibilityForActiveOrInactiveInput", "done", "reactive", "UseInputStateInjectionKeys", "CreateInjectionKeysRecord", "initInputState", "checkValuesAlreadyProvided", "useFormLogger", "inputStates", "EclipseHtmlFormElement", "useEclipseHtmlFormElement", "setInputStates", "inputValues", "inputStateOptions", "reactiveInputValues", "CurrentMarketoFormGatingState", "useGatingLevel", "key", "EnabledFormFields", "field", "watchForFirstUserInteraction", "inputStatesObj", "inputStatesKeys", "anyInputActive", "a", "userFirstInteraction", "useFormEvents", "removeWatcher", "anyActive", "e", "provide", "useInputState", "callerLabel", "injectRequiredWithSelf", "err", "useSubmitState", "callerLabel", "logger", "useFormLogger", "inputStates", "useInputState", "InputStateKeysRef", "computed", "setAllFieldsTouched", "key", "requiredFields", "k", "doneFields", "fieldsWithErrors", "fieldsWithVisibleErrors", "totalRequired", "totalDone", "totalErrors", "totalDoneRequired", "submitReadyBool", "done", "noErrors", "isReady", "reactive", "err", "loadScriptPromise", "loadMarketoScript", "accept", "reject", "BaseFormLogger", "_script", "_textStatus", "_jqxhr", "_settings", "exception", "UseFormStateInjectionKeys", "CreateInjectionKeysRecord", "getValidBeforeStates", "state", "exhaustiveGuard", "initFormState", "checkValuesAlreadyProvided", "FormState", "ref", "CurrentMarketoFormGatingState", "useGatingLevel", "events", "useFormEvents", "setFormState", "value", "provide", "readonly", "useFormState", "callerLabel", "logger", "useFormLogger", "injectRequiredWithSelf", "err", "formCounter", "UseMarketoInjectionKeys", "CreateInjectionKeysRecord", "initMarketoForm", "checkValuesAlreadyProvided", "logger", "getVerboseLogger", "useFormLogger", "verboseLogger", "uniqInstanceId", "loadMarketoScript", "err", "events", "useFormEvents", "FormSettings", "useFormSettings", "MarketoFormObj", "ref", "provide", "MarketoFormHtmlElement", "computed", "mktoFormElemResult", "isNil", "filteredElems", "el", "initMarketoFormElement", "useMarketoKnownVisitorState", "setFormState", "useFormState", "setupFormMktoCallback", "mktoFormObj", "marketoFormValid", "loadFormPromise", "LoadForm", "resolve", "reject", "SubmitMarketoForm", "formEl", "isObject", "mktoSubmitButton", "checkMarketoFormValid", "getNilObjPropNames", "obj", "k", "injectOrError", "keysToInject", "injectedValues", "key", "injectWithSelf", "nilVariableNames", "useMarketoForm", "callerLabel", "useMarketoFormInternals", "loadScriptAsPromise", "srcOrOptions", "src", "async", "crossOrigin", "isString", "resolve", "reject", "s", "scripts", "firstScript", "WaitForElementWithSelectorFn", "selectorFn", "parentElement", "maxRetries", "pollIntervalInMs", "resolve", "reject", "retries", "waitForEl", "el", "isNil", "WaitForElementAsPromise", "elementSelector", "isString", "selector", "parent", "UseMarketoRecaptchaInjectionKeys", "initSetupRecaptcha", "logger", "useFormLogger", "loadRecaptchaPromise", "siteKey", "scriptTagRef", "resolve", "reject", "loadScriptAsPromise", "scriptTag", "event", "setMarketoCaptchaToken", "token", "marketoFormObj", "formEl", "WaitForElementAsPromise", "tokenField", "val", "isString", "err", "grecaptchaExecSubmit", "initExecReCaptcha", "setupRecaptcha", "_reject", "initMarketoRecaptcha", "checkValuesAlreadyProvided", "getVerboseLogger", "verboseLogger", "execReCaptcha", "ref", "MarketoFormObj", "MarketoFormHtmlElement", "useMarketoFormInternals", "FormSettings", "useFormSettings", "setRecaptchaToken", "isNil", "provide", "events", "useFormEvents", "onMounted", "onUnmounted", "parent", "useMarketoRecaptcha", "callerLabel", "injectRequiredWithSelf", "UseFormUserInputValuesInjectionKeys", "CreateInjectionKeysRecord", "initFormUserInputValues", "checkValuesAlreadyProvided", "FormSettings", "useFormSettings", "CurrentMarketoFormGatingState", "useGatingLevel", "enabledFields", "computed", "enabledFieldsObj", "curGatingState", "userInputValues", "reactive", "enabledUserFields", "f", "UserMarketoInputName", "setFormUserInputValuesFromSettings", "key", "prop", "provide", "useFormUserInputValues", "callerLabel", "logger", "useFormLogger", "injectRequiredWithSelf", "err", "formSubmitBool", "ref", "UseFormSubmitInjectionKeys", "CreateInjectionKeysRecord", "initFormSubmit", "checkValuesAlreadyProvided", "logger", "useFormLogger", "CurrentMarketoFormGatingState", "useGatingLevel", "FormSettings", "useFormSettings", "SubmitMarketoForm", "useMarketoFormInternals", "inputStates", "useInputState", "submitState", "useSubmitState", "userInputValues", "useFormUserInputValues", "setRecaptchaToken", "useMarketoRecaptcha", "validationErrorOnSubmit", "useFormEvents", "userValuesIsEmpty", "isNil", "submitModalHold", "holdFormSubmit", "submitForm", "err", "doneCheck", "requiredCount", "doneCount", "checkValueIsEmpty", "value", "errorCheck", "key", "provide", "useFormSubmit", "callerLabel", "injectRequiredWithSelf", "UseBlindSubmitInjectionKeys", "CreateInjectionKeysRecord", "initBlindSubmit", "checkValuesAlreadyProvided", "FormSettings", "useFormSettings", "blindSubmitEnabled", "CurrentFormExperienceGatingState", "useGatingLevel", "isBlindSubmitForm", "computed", "submitForm", "errorCheck", "useFormSubmit", "blindFormSettingsCheck", "logger", "useFormLogger", "submitBlindForm", "err", "submitBlindFormIfEnabled", "provide", "useBlindSubmit", "injectRequiredWithSelf", "sendDownloadEvent", "sendDownloadEventArgs", "ctaText", "ctaType", "asset", "assetId", "assetType", "assetTitle", "isNil", "UseFormAssetDownloadInjectionKeys", "CreateInjectionKeysRecord", "initFormAssetDownloads", "checkValuesAlreadyProvided", "submitBlindFormIfEnabled", "useBlindSubmit", "downloadResourceTracking", "asset", "ctaType", "ctaText", "allowBlindSubmit", "sendDownloadEvent", "provide", "useFormAssetDownload", "injectRequiredWithSelf", "UseTranslationInjectionKeys", "CreateInjectionKeysRecord", "initUseTranslation", "checkValuesAlreadyProvided", "i18next", "translate", "useTranslation", "provide", "callerLabel", "logger", "useFormLogger", "injectRequiredWithSelf", "err", "cookie_persisted_value_getters_exports", "__export", "EntryPage", "ExternalReferrer", "ExternalReferrerDomainOnly", "Gclid", "PageName", "UtmCampaign", "UtmMedium", "UtmSource", "PageDataSettings", "getPageName", "Server", "UrlData", "PageDataSettings", "getAttributesWithDefaults", "attributes", "removeCookie", "name", "getCookie", "options", "defaultValue", "parse", "strValue", "isNil", "isEmptyString", "isBoolean", "err", "isFunction", "getQueryParameter", "key", "defaultValue", "parse", "value", "returnVal", "isFunction", "isString", "e", "CookiePersistedValue", "#cookieName", "#cookieReadOptions", "#defaultValue", "cookieName", "cookieReadOptions", "readCookieBeforeCalculating", "defaultValue", "getCookie", "defaultValueOrEmptyArray", "isUndefined", "calculatedGetter", "cookieGetter", "val", "defaultIfNilOrWhiteSpace", "CookiePersistedQueryStringValue", "CookiePersistedValue", "#queryName", "queryName", "cookieName", "cookieReadOptions", "defaultValue", "getQueryParameter", "GenericCookiePersistedValue", "CookiePersistedValue", "#valueGetter", "cookieName", "cookieReadOptions", "valueGetter", "readCookieBeforeCalculating", "defaultValue", "getExternalReferrer", "referrer", "protocol", "host", "getExternalReferrerDomainOnly", "isFunction", "getGclidQueryParameter", "gclsrcParam", "getQueryParameter", "UtmCampaign", "CookiePersistedQueryStringValue", "UtmMedium", "UtmSource", "EntryPage", "GenericCookiePersistedValue", "ExternalReferrer", "getExternalReferrer", "ExternalReferrerDomainOnly", "getExternalReferrerDomainOnly", "Gclid", "value", "val", "isString", "getGclidQueryParameter", "PageName", "getPageName", "user_preference_value_getters_exports", "__export", "BrowserPreferredLanguage", "GeoLocation", "InferredSiteLang", "OptanonConsentCookieProp", "parseBool", "value", "parseFromNumber", "isNil", "isBoolean", "isString", "isNumber", "parseNumber", "parseFromBoolean", "val", "onetrust_category_id_to_name_mapping", "onetrust_category_name_to_id_mapping", "createReverseObjectMap", "onetrust_category_id", "onetrust_category_name", "OneTrustCategoryIdToNameMapping", "OneTrustCategoryId", "onetrust_category_id", "OneTrustCategoryName", "onetrust_category_name", "OneTrustCategoryLabels", "n", "logger_otLabelBackgroundColor", "OneTrustVerboseTag", "onetrustLogger", "Logger", "onetrustVerboseLogger", "addLoggerFilterOverride", "getCookie", "removeCookie", "parseCookieAsObject", "cookieStr", "isNil", "entries", "kv", "parseOneTrustGroups", "groupsStr", "suppressMissingCategoryError", "c", "id", "enabled", "OneTrustCategoryId", "onetrustLogger", "name", "OneTrustCategoryIdToNameMapping", "parseBool", "parseGeoLocation", "geoLocationString", "isString", "geo", "s", "parseOptanonCookieValue", "key", "cookieObj", "curStrVal", "OptanonConsentCookieProp", "parseNumber", "parseOptanonConsentCookieObject", "simpleCookieObj", "oneTrustObj", "k", "curVal", "isNotNil", "err", "getHashFromStr", "value", "uftEncodedVal", "hashBuffer", "b", "PreviousOptanonCookieVal", "removeOldVersionCookies", "cookieName", "rootCookieOpts", "otherCookieOpts", "cookieOpts", "checkCookieInvalid", "groups", "isArray", "g", "updatePreviousOptanonCookieVal", "asString", "asHash", "asObject", "readOneTrustCookie", "oneTrustCookieStr", "newHash", "isObject", "optanonConsentCookieObject", "onetrustVerboseLogger", "readOneTrustCookieSync", "e", "parseOnetrustActiveGroups", "activeGroupsStr", "isString", "activeGroupsList", "groupsArr", "id", "OneTrustCategoryId", "name", "OneTrustCategoryIdToNameMapping", "groupsNotInMapping", "g", "unknownId", "getOneTrustActiveGroups", "activeGroups", "groupsVal", "isArray", "onetrustVerboseLogger", "getOneTrustSdkGeolocation", "oneTrustSdk", "isObject", "geoResp", "geo", "getOneTrustSdkValues", "otValues", "otActiveGroups", "domainData", "ConsentModel", "GoogleConsent", "Groups", "IsBannerLoaded", "IsConsentLoggingEnabled", "IsIABEnabled", "Language", "NoBanner", "getOneTrustValues", "optanonCookieValues", "readOneTrustCookie", "otSdkVals", "isNil", "getGeoLocationDataSync", "sdkGeo", "readOneTrustCookieSync", "GeoLocation", "otGeoLocData", "getGeoLocationDataSync", "countryCode", "stateCode", "isString", "defaultIfNilOrWhiteSpace", "BrowserPreferredLanguage", "acceptedLangs", "LanguageCountryLocale", "langs", "l", "InferredSiteLang", "otgeo", "sLocale", "SiteLocale", "isObject", "geoLocation", "CookieValueGetters", "cookie_persisted_value_getters_exports", "UserPreferenceValueGetters", "user_preference_value_getters_exports", "ValueGetters", "utmCampaignMap", "SocialMediaKeys", "isMobileRegex1", "isMobileRegex2", "top5SearchEngineRegex", "prDomainRegex", "HiddenFieldValueBuilder", "#logger", "formSettingsKey", "widgetData", "leadSource", "formTrackingName", "siteCountryCode", "localeUrlPrefix", "customDocumentDownloadURL", "logger", "useFormLogger", "isWatchable", "ref", "computed", "toValue", "form", "FormGatingLevel", "FormExperienceGatingLevel", "CurrentFormExperienceGatingState", "CurrentMarketoFormGatingState", "useGatingLevel", "watch", "prevValue", "newValue", "#getValues", "isNil", "#checkValuesEqual", "newKeys", "prevKeys", "key", "idx", "nVal", "pVal", "ValueGetters", "val", "names", "isString", "setup", "isObject", "userAgent", "VideoGatedFormSettingsKey", "GatedVideoLegacyId", "documentIds", "item", "DocumentFormSettingsKey", "langCode", "emptyProps", "prop", "UseHiddenFieldInitializerInjectionKeys", "CreateInjectionKeysRecord", "initHiddenFieldInitializer", "options", "checkValuesAlreadyProvided", "widgetData", "leadSource", "formSettingsKey", "FormSettings", "useFormSettings", "siteCountryCode", "localeUrlPrefix", "useSiteLanguage", "customDocumentDownloadURL", "hiddenFieldValueBuilder", "HiddenFieldValueBuilder", "provide", "useHiddenFieldInitializer", "callerLabel", "logger", "useFormLogger", "MarketoFormObj", "useMarketoFormInternals", "injectRequiredWithSelf", "isNil", "values", "toValue", "err", "createMarketoUserInputMeta", "type", "marketoName", "marketoType", "mktoType", "createMarketoHiddenInputMeta", "MarketoUserInputMetaObject", "MarketoHiddenInputMeta", "MarketoAllInputMeta", "getRawInputElementValue", "mktoInput", "val", "isString", "InputValueChangeEventName", "dataInputValueChangeListenerIdAttr", "inputValueChangeEvent", "trackedInputs", "removeInputChangeListener", "elementOrGuid", "inputGuid", "isString", "intervalVal", "registerInputChangeListener", "element", "prevVal", "newVal", "inputValueChangedListener", "FormInputTagName", "HTMLInputElementTypeAttributeValue", "HtmlInputTypeName", "excludeFrom", "isAnyInputElement", "value", "getSelectorFromInputType", "inputType", "isStringLiteralOfType", "FormInputTagName", "HTMLInputElementTypeAttributeValue", "exhaustiveGuard", "getInputElementArray", "selector", "parentNode", "allowHiddenInputDefault", "allInputsWithSelector", "expectedMatchingInputSelector", "inputsWithInputType", "inputsNotMatchingType", "el", "errors", "getInputElement", "matchingInputElements", "getMarketoInputElement", "marketoFormHtmlElement", "inputName", "logger", "expectedMarketoType", "MarketoAllInputMeta", "inputEl", "getInputElement", "err", "useMarketoFormInputElement", "inputName", "initialValue", "callerLabel", "getValue", "logger", "useFormLogger", "MarketoFormObj", "MarketoFormHtmlElement", "useMarketoFormInternals", "FormState", "useFormState", "isString", "inputElement", "computed", "isNil", "$mktoFormJqueryEl", "formState", "isStringLiteralOfType", "el", "getMarketoInputElement", "exhaustiveGuard", "setInputVal", "mktoInput", "value", "elVal", "isBoolean", "inputValue", "computedWithControl", "newVal", "onInputChange", "inputValueInitialized", "inputValueChangedListenerId", "useEventListener", "inputValueChangedListener", "watchEffect", "elValue", "useMarketoInputProxy", "inputName", "proxyInputValue", "getValue", "callerLabel", "logger", "useFormLogger", "definedGetValueFn", "el", "getRawInputElementValue", "initialValue", "isString", "inputElement", "inputValue", "useMarketoFormInputElement", "watch", "value", "val", "err", "getRawInputElementCheckedValue", "mktoInput", "UseMarketoHiddenInputsInjectionKeys", "CreateInjectionKeysRecord", "initMarketoHiddenInputs", "enabledHiddenFields", "checkValuesAlreadyProvided", "HiddenInputsMeta", "field", "MarketoAllInputMeta", "marketoHiddenInputValues", "reactive", "result", "currentKey", "proxyModelValue", "ref", "useMarketoInputProxy", "provide", "InputsMetaInjectionKeys", "CreateInjectionKeysRecord", "getEnabledFields", "formSettings", "currentGatingState", "enabledFieldsObj", "MarketoFormSettingsObject", "exhaustiveGuard", "initInputsMetaData", "checkValuesAlreadyProvided", "FormSettings", "useFormSettings", "CurrentMarketoFormGatingState", "useGatingLevel", "enabledFields", "FormInputsMeta", "field", "MarketoAllInputMeta", "provide", "useInputsMetaData", "callerLabel", "logger", "useFormLogger", "injectRequiredWithSelf", "err", "UseEnabledFieldsInjectionKeys", "CreateInjectionKeysRecord", "initEnabledFields", "checkValuesAlreadyProvided", "FormSettings", "useFormSettings", "CurrentMarketoFormGatingState", "useGatingLevel", "enabledFieldsObj", "allEnabledFields", "computed", "gatingLevel", "fields", "isStringArray", "enabledUserFields", "f", "UserMarketoInputName", "enabledHiddenFields", "HiddenMarketoInputName", "provide", "readonly", "CountryOptionKey", "gdpr_countries", "gdpr_country_name", "c", "gdpr_country_code", "GdprCountryName", "gdpr_country_name", "GdprCountry", "GdprCountryName", "isGdprCountry", "value", "isString", "GdprSiteLanguage", "isGdprSiteLanguage", "NoRuleSiteLanguage", "SiteCountryCode", "lang", "isNoRuleSiteLanguage", "PrivacyConsentState", "siteCountryCode", "userInputValues", "logger", "#logger", "#userInputValues", "#defs", "useEventListener", "#updateOneTrustGeoLocationData", "otValues", "getOneTrustValues", "isObject", "isString", "#onetrustGeolocation", "#country", "computed", "isNil", "userValues", "toValue", "country", "CountryOptionKey", "ref", "#privacyRuleFromCountryInput", "isNotNil", "isGdprCountry", "#privacyRuleFromSiteLang", "isGdprSiteLanguage", "isNoRuleSiteLanguage", "exhaustiveGuard", "#privacyRuleFromOneTrust", "GdprSiteLanguage", "#activePrivacyRule", "countryInputRule", "onetrustRule", "siteLangRule", "activeRuleSource", "activeRule", "#consentRequired", "activePrivacyRule", "UsePrivacyConsentStateInjectionKeys", "CreateInjectionKeysRecord", "initPrivacyConsentState", "checkValuesAlreadyProvided", "logger", "useFormLogger", "siteCountryCode", "useSiteLanguage", "userInputValues", "useFormUserInputValues", "privacyConsentState", "PrivacyConsentState", "provide", "usePrivacyConsentState", "callerLabel", "injectRequiredWithSelf", "err", "FormTrackingManager", "#logger", "formTrackingName", "hiddenFieldValuesObject", "isInModal", "widgetData", "gatingState", "logger", "useFormLogger", "FormSettings", "useFormSettings", "toValue", "#createEventObject", "event", "video", "documents", "offerId", "tacticId", "d", "eventName", "#onAnyFormComplete", "offerIds", "id", "error", "#formOpenHasTriggered", "#formUserStartHasTriggered", "#formCompleteHasTriggered", "#ungatedFormCompleteHasTriggered", "#formValidationErrorHasTriggered", "UseFormTrackingInjectionKeys", "CreateInjectionKeysRecord", "initFormTracking", "formTrackingName", "isInModal", "widgetData", "checkValuesAlreadyProvided", "hiddenFieldValueBuilder", "useHiddenFieldInitializer", "CurrentMarketoFormGatingState", "useGatingLevel", "trackingManager", "FormTrackingManager", "events", "useFormEvents", "toValue", "gatingState", "exhaustiveGuard", "userFirstInteractionHandler", "provide", "useFormTracking", "callerLabel", "logger", "useFormLogger", "injectRequiredWithSelf", "err", "FormAbandonmentManager", "#logger", "formName", "gatingState", "isInModal", "inputStates", "widgetData", "hiddenFieldValue", "logger", "useFormLogger", "toValue", "#trackFieldsFill", "useFormEvents", "eventName", "removeWatcher", "watch", "newValue", "key", "FormField", "isValid", "ValidationType", "#createObj", "FormAbandonmentObj", "err", "UseFormAbandonmentInjectionKeys", "CreateInjectionKeysRecord", "initFormAbandonmentManager", "formName", "isInModal", "inputStates", "widgetData", "checkValuesAlreadyProvided", "CurrentMarketoFormGatingState", "useGatingLevel", "hiddenFieldValueBuilder", "useHiddenFieldInitializer", "abandonmentManager", "FormAbandonmentManager", "events", "useFormEvents", "formAbandonmentHandler", "provide", "genericEmailDomainsBlocklist", "genericEmailDomainBlockList_default", "disposableEmailDomains", "disposableEmailDomains_default", "UseValidationInjectionKeys", "CreateInjectionKeysRecord", "initValidations", "logger", "useFormLogger", "checkValuesAlreadyProvided", "validateEmail", "value", "isString", "matchValidEmail", "isNil", "isInBlockedList", "nums", "target", "left", "right", "mid", "validateDisposableEmailDomains", "startOfDomain", "domain", "disposableEmailDomains_default", "validateGenericBusinessEmail", "validateDisposableDomain", "genericEmailDomainBlockList_default", "validatePhoneNumber", "OnlyDigits", "checkDigitOrder", "digit", "provide", "useValidations", "callerLabel", "injectRequiredWithSelf", "err", "UseAbandonmentTriggerInjectionKeys", "CreateInjectionKeysRecord", "initAbandonmentListeners", "checkValuesAlreadyProvided", "logger", "useFormLogger", "FormState", "useFormState", "formAbandonment", "modalClosed", "userFirstInteraction", "useFormEvents", "CurrentFormExperienceGatingState", "useGatingLevel", "initBeforeUnloadScript", "userFirstInteractionValue", "beforeUnloadHandler", "initModalAbandonmentListner", "provide", "useAbandonmentListeners", "callerLabel", "beforeUnloadListener", "injectRequiredWithSelf", "modalAbandonmentListener", "err", "initFormServices", "formSettingsKey", "widgetData", "isInModal", "lang", "customData", "gatingLevelCustom", "initFormLogger", "logger", "useFormLogger", "initSiteLanguage", "initValidations", "initFormSettings", "initUseTranslation", "initMarketoKnownVisitorState", "initMarketoFormEvents", "initEclipseHtmlFormElement", "FormSettings", "useFormSettings", "initGatingLevel", "initFormState", "initEnabledFields", "initFormUserInputValues", "initPrivacyConsentState", "initInputState", "initMarketoForm", "initMarketoRecaptcha", "initFormSubmit", "initBlindSubmit", "initFormAssetDownloads", "initAbandonmentListeners", "initHiddenFieldInitializer", "initFormTracking", "initInputsMetaData", "FormState", "useFormState", "events", "useFormEvents", "watch", "newState", "prevState", "LoadForm", "useMarketoForm", "err", "setHiddenFields", "hiddenFieldValueBuilder", "useHiddenFieldInitializer", "setCookieGatingLevelState", "FormGatingLevel", "useGatingLevel", "initMarketoHiddenInputs", "HiddenMarketoInputName", "key", "eventHook", "eventName", "marketoIsValid", "setInputStates", "inputStates", "useInputState", "setFormUserInputValuesFromSettings", "userInputValues", "useFormUserInputValues", "useFormTracking", "val", "MarketoFormHtmlElement", "useMarketoFormInternals", "isNil", "initFormAbandonmentManager", "useAbandonmentListeners", "useFormServices", "callerLabel", "FormClasses", "CurrentMarketoFormGatingState", "CurrentFormExperienceGatingState", "FormExperienceGatingLevel", "UniqInstanceId"] }