@yamlresume/core 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +790 -2909
- package/dist/index.js +478 -100
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/array.ts","../src/utils/object.ts","../src/utils/date.ts","../src/utils/string.ts","../src/utils/tex.ts","../src/compiler/codegen/latex.ts","../src/compiler/parser/markdown.ts","../src/errors/error.ts","../src/models/country.ts","../src/models/resume.ts","../src/translations/options.ts","../src/translations/template.ts","../src/preprocess/transform.ts","../src/renderer/base.ts","../src/renderer/latex/preamble.ts","../src/renderer/latex/moderncv.ts","../src/renderer/markdown/renderer.ts","../src/renderer/resume.ts","../src/schema/primitives.ts","../src/schema/utils.ts","../src/schema/content/awards.ts","../src/schema/content/basics.ts","../src/schema/content/certificates.ts","../src/schema/content/education.ts","../src/schema/content/interests.ts","../src/schema/content/languages.ts","../src/schema/content/location.ts","../src/schema/content/profiles.ts","../src/schema/content/projects.ts","../src/schema/content/publications.ts","../src/schema/content/references.ts","../src/schema/content/skills.ts","../src/schema/content/volunteer.ts","../src/schema/content/work.ts","../src/schema/content/content.ts","../src/schema/layouts/latex.ts","../src/schema/layouts/margins.ts","../src/schema/layouts/page.ts","../src/schema/layouts/sections.ts","../src/schema/layouts/template.ts","../src/schema/layouts/typography.ts","../src/schema/layouts/layouts.ts","../src/schema/locale/locale.ts","../src/schema/resume.ts"],"names":["mergeArrayWithOrder","customOrder","defaultOrder","validItems","deduplicatedCustomOrder","seen","item","remainingItems","isEmptyValue","value","removeKeysFromObject","obj","keysToRemove","transform","result","key","isObject","collectAllKeys","keys","visited","parseDate","dateStr","date","localizeDate","language","options","dateObj","getDateRange","startDate","endDate","ONE_DAY","nowInUTCSeconds","epochSecondsToLocaleDateString","epochTime","locale","milliSecondsToSeconds","ms","isEmptyString","showIf","predicate","content","showIfNotEmpty","joinNonEmptyString","codes","separator","code","toCodeBlock","lang","escapeLatex","rawEscapeLatex","LatexCodeGenerator","node","context","nodeToTeX","bulletListNodeToTeX","docNodeToTeX","listItemNodeToTeX","orderedListNodeToTeX","paragraphNodeToTeX","textNodeToTeX","fragmentToTeX","itemContent","escapedText","text","mark","applyMarkToText","fragment","MarkdownParser","input","ast","unified","remarkParse","marks","child","boldMark","processChildrenWithMarks","italicMark","linkMark","children","transformedNodes","ErrorCategory","ErrorType","YAMLResumeError","params","error","message","_","COUNTRY_OPTIONS","EnglishCountryNames","SimplifiedChineseCountryNames","TraditionalChineseCountryHKNames","TraditionalChineseCountryTWNames","SpanishCountryNames","FrenchCountryNames","NorwegianCountryNames","DEGREE_OPTIONS","FLUENCY_OPTIONS","FONT_SIZE_OPTIONS","FONTSPEC_NUMBERS_OPTIONS","LANGUAGE_OPTIONS","LEVEL_OPTIONS","LOCALE_LANGUAGE_OPTIONS","NETWORK_OPTIONS","SECTION_IDS","ORDERABLE_SECTION_IDS","DEFAULT_SECTIONS_ORDER","LATEX_TEMPLATE_OPTIONS","getLatexTemplateDetail","template","templateDetails","RESUME_SECTION_ITEMS","DEFAULT_RESUME_CONTENT","FILLED_RESUME_CONTENT","DEFAULT_TOP_BOTTOM_MARGIN","DEFAULT_LEFT_RIGHT_MARGIN","MARGIN_OPTIONS","getLocaleLanguageDetail","localeLanguage","localeLanguageDetails","DEFAULT_MARKDOWN_LAYOUT","DEFAULT_LATEX_LAYOUT","DEFAULT_RESUME_LAYOUTS","DEFAULT_RESUME_LOCALE","DEFAULT_RESUME","FILLED_RESUME","getOptionTranslation","category","option","get","PUNCTUATIONS","TERMS","getTemplateTranslations","replaceBlankLinesWithPercent","normalizeResumeContentSections","resume","clonedResume","cloneDeep","normalizedResumeContent","resumeWithDefaults","sectionKey","sectionValue","propKey","transformResumeValues","transformResumeSectionValues","index","transformResumeSectionComputedValues","sectionResumeComputed","sectionResumeItem","transformEducationCourses","transformEducationDegreeAreaAndScore","colon","comma","score","degree","transformKeywords","section","isArray","transformDate","transformEndDate","transformLanguage","transformLocation","address","city","region","postalCode","country","fullAddress","transformBasicsUrl","basicsLink","transformProfileUrls","getFaIcon","network","capitalize","transformSkills","level","transformProfileLinks","link","transformSectionNames","layoutIndex","_summaryParser","translations","sectionName","sectionId","sectionAlias","transformSummary","summaryParser","layout","typographyContext","summary","transformResumeContent","tranformFunc","transformResumeLocaleWithDefaultValues","transformResumeLayoutsWithDefaultValues","normalizedLayouts","merge","transformResumeLayoutLaTeX","numbers","transformResumeLayout","transformFunc","transformResume","Renderer","order","sectionRenderers","renderedSections","rendered","normalizeUnit","ModerncvBase","style","fontSize","page","margins","showPageNumbers","t","b","l","r","linuxLibertineFont","linuxLibertineOFont","name","headline","phone","email","urls","sectionNames","education","terms","dateRange","degreeAreaAndScore","courses","institution","url","work","keywords","position","languages","fluency","skills","awards","awarder","title","certificates","issuer","publications","releaseDate","publisher","references","relationship","description","organization","ModerncvBankingRenderer","ModerncvCasualRenderer","ModerncvClassicRenderer","MarkdownRenderer","contactInfo","profiles","profileLinks","username","projects","interests","volunteer","sections","LATEX_RESUME_RENDERER_MAP","getResumeRenderer","optionSchemaMessage","messagePrefix","optionSchema","z","issue","startCase","SizedStringSchema","min","max","CountryOptionSchema","DateSchema","ctx","DegreeOptionSchema","EmailSchema","FluencyOptionSchema","FontspecNumbersOptionSchema","FontSizeOptionSchema","KeywordsSchema","LanguageOptionSchema","LocaleLanguageOptionSchema","LevelOptionSchema","NameSchema","NetworkOptionSchema","phoneNumberRegex","PhoneSchema","SummarySchema","OrganizationSchema","TemplateOptionSchema","UrlSchema","nullifySchema","schema","nullishMeta","AwarderSchema","TitleSchema","AwardItemSchema","AwardsSchema","HeadlineSchema","BasicsItemSchema","BasicsSchema","IssuerSchema","CertificateItemSchema","CertificatesSchema","AreaSchema","CoursesSchema","InstitutionSchema","ScoreSchema","EducationItemSchema","EducationSchema","InterestNameSchema","InterestItemSchema","InterestsSchema","LanguageItemSchema","LanguagesSchema","CitySchema","AddressSchema","PostalCodeSchema","RegionSchema","LocationItemSchema","LocationSchema","UsernameSchema","ProfileItemSchema","ProfilesSchema","ProjectNameSchema","ProjectDescriptionSchema","ProjectItemSchema","ProjectsSchema","PublicationNameSchema","PublisherSchema","PublicationItemSchema","PublicationsSchema","ReferenceNameSchema","RelationshipSchema","ReferenceItemSchema","ReferencesSchema","SkillNameSchema","SkillItemSchema","SkillsSchema","VolunteerOrganizationSchema","VolunteerPositionSchema","VolunteerItemSchema","VolunteerSchema","CompanyNameSchema","PositionSchema","WorkItemSchema","WorkSchema","ContentSchema","LatexSchema","marginSizeSchemaMessage","MarginSizeSchema","MarginsSchema","ShowPageNumbersSchema","PageSchema","AliasNameSchema","AliasesSchema","OrderSchema","SectionsSchema","TemplateSchema","TypographyLinksSchema","TypographySchema","LatexLayoutSchema","MarkdownLayoutSchema","LayoutsSchema","LocaleSchema","ResumeSchema"],"mappings":"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AAA,CACA,OAAA,CACA,YACA,SAAA,CACA,YAAA,CACA,SAAA,CACA,YAAA,CACA,UAAA,CACA,SAAA,CACA,UACA,QAAA,CACA,OAAA,CACA,UACA,QAAA,CACA,SAAA,CACA,mCACA,wBAAA,CACA,UAAA,CACA,eAAA,CACA,QAAA,CACA,gCAAA,CACA,QAAA,CACA,WACA,cAAA,CACA,SAAA,CACA,WACA,UAAA,CACA,QAAA,CACA,aACA,gBAAA,CACA,0BAAA,CACA,MAAA,CACA,OAAA,CACA,OAAA,CACA,kBAAA,CACA,0BACA,UAAA,CACA,SAAA,CACA,OAAA,CACA,cAAA,CACA,YAAA,CACA,6BAAA,CACA,UACA,MAAA,CACA,YAAA,CACA,QAAA,CACA,gBAAA,CACA,kCAAA,CACA,SAAA,CACA,WACA,UAAA,CACA,oBAAA,CACA,aACA,SAAA,CACA,OAAA,CACA,cACA,mBAAA,CACA,SAAA,CACA,SAAA,CACA,UAAA,CACA,kBAAA,CACA,eAAA,CACA,eACA,SAAA,CACA,QAAA,CACA,eAAA,CACA,kBAAA,CACA,6BAAA,CACA,OAAA,CACA,aACA,SAAA,CACA,SAAA,CACA,OAAA,CACA,WAAA,CACA,QAAA,CACA,WAAA,CACA,UACA,YAAA,CACA,MAAA,CACA,YACA,uBAAA,CACA,QAAA,CACA,gBACA,QAAA,CACA,OAAA,CACA,mCAAA,CACA,UAAA,CACA,WAAA,CACA,SAAA,CACA,UACA,OAAA,CACA,WAAA,CACA,MAAA,CACA,MAAA,CACA,SAAA,CACA,QAAA,CACA,QACA,SAAA,CACA,OAAA,CACA,QAAA,CACA,QAAA,CACA,YAAA,CACA,OAAA,CACA,WACA,QAAA,CACA,QAAA,CACA,aACA,MAAA,CACA,QAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,OAAA,CACA,eAAA,CACA,WAAA,CACA,YAAA,CACA,QACA,YAAA,CACA,QAAA,CACA,WACA,UAAA,CACA,MAAA,CACA,QACA,eAAA,CACA,kBAAA,CACA,YAAA,CACA,YAAA,CACA,WAAA,CACA,SAAA,CACA,SACA,YAAA,CACA,SAAA,CACA,SACA,UAAA,CACA,YAAA,CACA,aACA,SAAA,CACA,YAAA,CACA,SAAA,CACA,SAAA,CACA,OAAA,CACA,OAAA,CACA,cACA,eAAA,CACA,aAAA,CACA,WAAA,CACA,OAAA,CACA,SAAA,CACA,MAAA,CACA,iBACA,aAAA,CACA,iBAAA,CACA,0BAAA,CACA,QAAA,CACA,MAAA,CACA,UAAA,CACA,QACA,gCAAA,CACA,QAAA,CACA,mBACA,UAAA,CACA,MAAA,CACA,cACA,iBAAA,CACA,QAAA,CACA,UAAA,CACA,aAAA,CACA,OAAA,CACA,SAAA,CACA,UACA,QAAA,CACA,QAAA,CACA,cAAA,CACA,uBAAA,CACA,aAAA,CACA,2BAAA,CACA,mCACA,kBAAA,CACA,4BAAA,CACA,OAAA,CACA,YAAA,CACA,uBAAA,CACA,cAAA,CACA,UACA,QAAA,CACA,YAAA,CACA,eACA,WAAA,CACA,2BAAA,CACA,WACA,UAAA,CACA,iBAAA,CACA,SAAA,CACA,cAAA,CACA,eAAA,CACA,aAAA,CACA,cACA,OAAA,CACA,WAAA,CACA,OAAA,CACA,UAAA,CACA,gCAAA,CACA,WAAA,CACA,SACA,aAAA,CACA,OAAA,CACA,QAAA,CACA,YAAA,CACA,UAAA,CACA,UAAA,CACA,cACA,MAAA,CACA,SAAA,CACA,QACA,qBAAA,CACA,SAAA,CACA,SACA,cAAA,CACA,0BAAA,CACA,QAAA,CACA,QAAA,CACA,SAAA,CACA,sBAAA,CACA,iBACA,eAAA,CACA,sCAAA,CACA,UACA,YAAA,CACA,SAAA,CACA,gCACA,WAAA,CACA,SAAA,CACA,0BAAA,CACA,qBAAA,CACA,2BAAA,CACA,gBAAA,CACA,QACA,QAAA,CACA,UACF,EAMaC,EAAAA,CAA+C,CAC1D,YAAa,aAAA,CACb,eAAA,CAAiB,eAAA,CACjB,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,UACT,gBAAA,CAAkB,gBAAA,CAClB,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,QAAA,CACR,SAAU,UAAA,CACV,UAAA,CAAY,YAAA,CACZ,qBAAA,CAAuB,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CAC7B,wBAAA,CACA,8BACA,kCAAA,CACA,+BAAA,CACA,iCACF,CAAA,CAGaC,EAAAA,CAAoB,CAAC,OAAQ,MAAA,CAAQ,MAAM,CAAA,CAG3CC,EAAAA,CAA2B,CAAC,QAAA,CAAU,WAAY,MAAM,CAAA,CASxDC,EAAAA,CAAmB,CAC9B,WAAA,CACA,UAAA,CACA,UACA,QAAA,CACA,aAAA,CACA,aACA,SAAA,CACA,UAAA,CACA,YACA,SAAA,CACA,WAAA,CACA,SAAA,CACA,SAAA,CACA,UAAA,CACA,OAAA,CACA,SACA,OAAA,CACA,SAAA,CACA,UAAA,CACA,OAAA,CACA,UAAA,CACA,SAAA,CACA,SACA,QAAA,CACA,OAAA,CACA,UAAA,CACA,OAAA,CACA,QAAA,CACA,OAAA,CACA,YACA,WAAA,CACA,MAAA,CACA,aACA,OAAA,CACA,SAAA,CACA,WACA,UAAA,CACA,QAAA,CACA,OAAA,CACA,QAAA,CACA,QAAA,CACA,SAAA,CACA,aACA,OAAA,CACA,UAAA,CACA,SAAA,CACA,QAAA,CACA,WAAA,CACA,OAAA,CACA,SACA,QAAA,CACA,YAAA,CACA,UAAA,CACA,SAAA,CACA,SAAA,CACA,OAAA,CACA,UACA,QAAA,CACA,SAAA,CACA,SACA,SAAA,CACA,WAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,OAAA,CACA,QAAA,CACA,MAAA,CACA,SAAA,CACA,YACA,MAAA,CACA,OAAA,CACA,aACA,QAAA,CACA,MACF,EAOaC,EAAAA,CAAgB,CAC3B,QAAA,CACA,UAAA,CACA,cAAA,CACA,UAAA,CACA,SACA,QACF,CAAA,CAOaC,GAA0B,CACrC,IAAA,CACA,UACA,YAAA,CACA,YAAA,CACA,IAAA,CACA,IAAA,CACA,IACF,CAAA,CAKaC,GAAkB,CAC7B,SAAA,CACA,UAAA,CACA,UAAA,CACA,QAAA,CACA,QAAA,CACA,YACA,MAAA,CACA,UAAA,CACA,QAAA,CACA,WAAA,CACA,QAAA,CACA,UAAA,CACA,iBACA,UAAA,CACA,QAAA,CACA,SACA,SAAA,CACA,OAAA,CACA,QACA,Q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","file":"index.js","sourcesContent":["/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * Generic function to merge custom order with default order.\n *\n * Items specified in customOrder will have higher priority and appear first\n * in the result. Remaining items will follow in the default order.\n *\n * Duplicate items in customOrder will be deduplicated (first occurrence kept).\n * Items in customOrder that are not in defaultOrder will be ignored.\n *\n * @param customOrder - Array of items with custom priority order\n * @param defaultOrder - Array of items in default order\n * @returns Merged order array\n */\nexport function mergeArrayWithOrder<T>(\n customOrder: T[] | undefined | null,\n defaultOrder: T[]\n): T[] {\n if (!customOrder || customOrder.length === 0) {\n return defaultOrder\n }\n\n // create a set of valid items from defaultOrder for fast lookup\n const validItems = new Set(defaultOrder)\n\n // filter and deduplicate custom order (keep first occurrence, ignore invalid\n // items)\n const deduplicatedCustomOrder: T[] = []\n const seen = new Set<T>()\n\n for (const item of customOrder) {\n // only include items that exist in defaultOrder and haven't been seen\n // before\n if (validItems.has(item) && !seen.has(item)) {\n deduplicatedCustomOrder.push(item)\n seen.add(item)\n }\n }\n\n // get remaining items that are not in custom order\n const remainingItems = defaultOrder.filter((item) => !seen.has(item))\n\n // return deduplicated custom items first, followed by remaining items in\n // default order\n return [...deduplicatedCustomOrder, ...remainingItems]\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { isObject, transform } from 'lodash-es'\n\n/**\n * Check if a value is empty\n *\n * Empty values include `undefined`, `null`, empty object and empty string\n *\n * @param value - value to check\n * @returns True if value is empty, false otherwise\n *\n * @see {@link https://stackoverflow.com/a/43233163}\n */\nexport function isEmptyValue(value: undefined | null | object | string) {\n return (\n value === undefined ||\n value === null ||\n (typeof value === 'object' && Object.keys(value).length === 0) ||\n (typeof value === 'string' && value.trim().length === 0)\n )\n}\n\n/**\n * Remove keys from an object by their names\n *\n * @param obj - The object to remove keys from\n * @param keysToRemove - The keys to remove\n * @returns The object with the specified keys removed\n */\nexport function removeKeysFromObject<T extends object>(\n obj: T,\n keysToRemove: (string | number | symbol)[]\n): T {\n return transform(\n obj,\n (result, value: unknown, key: number | string | symbol) => {\n if (keysToRemove.includes(key)) return\n\n result[key] = isObject(value)\n ? removeKeysFromObject(value, keysToRemove)\n : value\n }\n )\n}\n\n/**\n * Tree walker function to collect all possible keys from an object recursively\n *\n * This function traverses an object tree and collects all property keys at any\n * depth. It handles arrays, nested objects, and prevents infinite loops from\n * circular references.\n *\n * @param obj - The object to walk through\n * @param keys - Set to collect all keys (optional, used for recursion)\n * @param visited - Set to track visited objects to prevent circular references\n * (optional, used for recursion)\n * @returns Set containing all keys found in the object tree\n *\n * @example\n * ```typescript\n * const obj = {\n * a: 1,\n * b: {\n * c: 2,\n * d: [{ e: 3 }]\n * }\n * }\n * const keys = collectAllKeys(obj)\n * // keys will contain: Set(['a', 'b', 'c', 'd', 'e'])\n * ```\n */\nexport function collectAllKeys(\n obj: unknown,\n keys: Set<string | number | symbol> = new Set(),\n visited: WeakSet<object> = new WeakSet()\n): Set<string | number | symbol> {\n if (obj === null || obj === undefined) {\n return keys\n }\n\n if (typeof obj === 'object') {\n // Prevent circular references\n if (visited.has(obj as object)) {\n return keys\n }\n visited.add(obj as object)\n\n if (Array.isArray(obj)) {\n // For arrays, collect keys from each element\n obj.forEach((item) => {\n collectAllKeys(item, keys, visited)\n })\n } else {\n // For objects, collect all property keys and recurse into values\n Object.keys(obj).forEach((key) => {\n keys.add(key)\n collectAllKeys((obj as Record<string, unknown>)[key], keys, visited)\n })\n }\n }\n\n return keys\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { LocaleLanguage } from '@/models'\nimport { isEmptyValue } from './object'\n\n/**\n * Parse date from a string\n *\n * @param dateStr - date string, `null` or `undefined`\n * @returns Date object if parse success, otherwise `null`\n */\nexport function parseDate(dateStr: string | undefined | null): Date | null {\n if (isEmptyValue(dateStr)) return null\n\n try {\n const date = new Date(dateStr)\n // MDN says that date parsing may return NaN or raise exceptions, ref:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_date\n return Number.isNaN(date.getTime()) ? null : date\n } catch (_e) {\n return null\n }\n}\n\n/**\n * Localize a date string to a specific language.\n *\n * @param date - The date string to localize.\n * @param language - The language to localize the date string to.\n * @returns The localized date string.\n */\nexport function localizeDate(\n date: string,\n language: LocaleLanguage | string\n): string {\n if (date === '') {\n return ''\n }\n\n // for resumes, we only care about the year and month\n const options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n }\n\n const dateObj = new Date(date)\n\n // if the date is invalid, return the original date string\n if (Number.isNaN(dateObj.getTime())) {\n return date\n }\n\n return dateObj.toLocaleDateString(\n isEmptyValue(language) ? 'en' : language,\n options\n )\n}\n\n/**\n * Get the date range for a given start and end date.\n *\n * @param startDate - The start date.\n * @param endDate - The end date.\n * @param language - The language to localize the date string to.\n * @returns The date range.\n */\nexport function getDateRange(\n startDate: string,\n endDate: string,\n language: LocaleLanguage\n): string {\n if (!startDate) {\n return ''\n }\n\n if (!endDate) {\n switch (language) {\n case 'zh-hans':\n case 'zh-hant-hk':\n case 'zh-hant-tw':\n return `${localizeDate(startDate, language)}至今`\n case 'es':\n return `${localizeDate(startDate, language)} hasta la fecha`\n case 'no':\n return `${localizeDate(startDate, language)}–Nå`\n default:\n // by default we return English's \"Present\" if language is not supported\n return `${localizeDate(startDate, language)}–Present`\n }\n }\n\n // Please note that we use en-dash instead of hyphen as the date separator\n return `${localizeDate(startDate, language)}–${localizeDate(\n endDate,\n language\n )}`\n}\n\n/**\n * The number of seconds in one day\n */\nexport const ONE_DAY = 24 * 60 * 60\n\n/**\n * Get the current time in UTC seconds\n *\n * @returns The current time in UTC seconds\n */\nexport function nowInUTCSeconds(): number {\n return Math.floor(Date.now() / 1000)\n}\n\n/**\n * Generate a local date string without timestamp for a epoch time in seconds\n *\n * @param epochTime - epoch time in seconds\n * @param locale - locale for the date string\n * @returns - a human readable date string\n */\nexport function epochSecondsToLocaleDateString(\n epochTime: number,\n locale = 'en-US'\n) {\n return new Date(epochTime * 1000).toLocaleDateString(locale, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n })\n}\n\n/**\n * Convert milliseconds to seconds\n */\nexport function milliSecondsToSeconds(ms: number) {\n return Math.floor(ms / 1000)\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { isEmptyValue } from './object'\n\n/**\n * Check if a string is empty or only contains whitespace\n *\n * @param value - string to check\n * @returns True if string is empty or only contains whitespace, false otherwise\n */\nexport function isEmptyString(value: string) {\n return typeof value === 'string' && value.trim().length === 0\n}\n\n/**\n * Show content if predicate is true\n *\n * @param predicate - The predicate to check\n * @param content - The content to show\n * @returns The content if predicate is true, empty string otherwise\n */\nexport function showIf(predicate: boolean, content: string) {\n return predicate ? content : ''\n}\n\n/**\n * Show content if value is not empty\n *\n * @param value - The value to check (undefined, null, object, or string)\n * @param content - The content to show\n * @returns The content if value is not empty, empty string otherwise\n */\nexport function showIfNotEmpty(\n value: undefined | null | object | string,\n content: string\n) {\n return showIf(!isEmptyValue(value), content)\n}\n\n/**\n * Join an array of strings , but only if the string is not empty\n *\n * @param codes - The array of strings to join\n * @param separator - The separator to join the strings with\n * @returns The joined string\n */\nexport function joinNonEmptyString(\n codes: string[],\n separator = '\\n\\n'\n): string {\n return codes.filter((code) => !isEmptyString(code)).join(separator)\n}\n\n/**\n * Convert a string to a code block in markdown format\n *\n * @param code - The string to convert\n * @param lang - The language of the code block\n * @returns The code block\n */\nexport function toCodeBlock(code?: string, lang?: string): string {\n if (isEmptyValue(code)) {\n return ''\n }\n\n return `\\`\\`\\`${lang || ''}\\n${code}\\n\\`\\`\\``\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport rawEscapeLatex from 'escape-latex'\n\nimport { isEmptyValue } from './object'\n\n/**\n * A wrapper around the escape-latex that handles null and undefined values.\n *\n * @param value - value to be escaped\n * @returns escaped value\n */\nexport function escapeLatex(value: string | null | undefined) {\n if (isEmptyValue(value)) {\n return value\n }\n\n return rawEscapeLatex(value)\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type {\n BulletListNode,\n DocNode,\n Fragment,\n ListItemNode,\n Mark,\n Node,\n OrderedListNode,\n ParagraphNode,\n TextNode,\n} from '@/compiler/ast'\nimport { escapeLatex } from '@/utils'\nimport type { CodeGenerationContext, CodeGenerator } from './interface'\n\n/**\n * Generate LaTeX code from a Node.\n *\n * This class implements the `CodeGenerator` interface and provides a method\n * to convert an AST node into its corresponding LaTeX code.\n *\n * @see {@link CodeGenerator}\n */\nexport class LatexCodeGenerator implements CodeGenerator {\n /**\n * Generate LaTeX code from an AST node.\n *\n * @param node - The AST node to generate LaTeX code from.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\n generate(node: Node, context?: CodeGenerationContext): string {\n return nodeToTeX(node, context)\n }\n}\n\n/**\n * Convert an AST node to its corresponding LaTeX code.\n *\n * @param node - The AST node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nexport function nodeToTeX(node: Node, context?: CodeGenerationContext): string {\n switch (node.type) {\n case 'bulletList':\n return bulletListNodeToTeX(node, context)\n case 'doc':\n return docNodeToTeX(node, context)\n case 'listItem':\n return listItemNodeToTeX(node, context)\n case 'orderedList':\n return orderedListNodeToTeX(node, context)\n case 'paragraph':\n return paragraphNodeToTeX(node, context)\n case 'text':\n return textNodeToTeX(node, context)\n }\n}\n\n/**\n * Convert a bullet list node to its corresponding LaTeX code.\n *\n * @param node - The bullet list node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nfunction bulletListNodeToTeX(\n node: BulletListNode,\n context?: CodeGenerationContext\n): string {\n return `\\\\begin{itemize}\\n${fragmentToTeX(node.content, context)}\\\\end{itemize}\\n`\n}\n\n/**\n * Convert a document node to its corresponding LaTeX code.\n *\n * @param node - The document node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nfunction docNodeToTeX(node: DocNode, context?: CodeGenerationContext): string {\n return fragmentToTeX(node.content, context)\n}\n\n/**\n * Convert a list item node to its corresponding LaTeX code.\n *\n * @param node - The list item node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nfunction listItemNodeToTeX(\n node: ListItemNode,\n context?: CodeGenerationContext\n): string {\n const itemContent = fragmentToTeX(node.content, context)\n // Here we made some special handling to make the output with more prettier\n if (itemContent.includes('\\n\\n')) {\n return `\\\\item ${itemContent.replace('\\n\\n', '\\n')}`\n }\n return `\\\\item ${itemContent}`\n}\n\n/**\n * Convert an ordered list node to its corresponding LaTeX code.\n *\n * @param node - The ordered list node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nfunction orderedListNodeToTeX(\n node: OrderedListNode,\n context?: CodeGenerationContext\n): string {\n return `\\\\begin{enumerate}\\n${fragmentToTeX(node.content, context)}\\\\end{enumerate}\\n`\n}\n\n/**\n * Convert a paragraph node to its corresponding LaTeX code.\n *\n * @param node - The paragraph node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nfunction paragraphNodeToTeX(\n node: ParagraphNode,\n context?: CodeGenerationContext\n): string {\n if (node.content === undefined || node.content.length === 0) {\n return '\\n'\n }\n\n // We need to output two new lines to make the paragraph a real paagraph in\n // LaTeX. However if the paragraph is empty, we just output one new line,\n // check the `if` above.\n return `${fragmentToTeX(node.content, context)}\\n\\n`\n}\n\n/**\n * Convert a text node to its corresponding LaTeX code.\n *\n * @param node - The text node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nfunction textNodeToTeX(\n node: TextNode,\n context?: CodeGenerationContext\n): string {\n const escapedText = escapeLatex(node.text)\n\n if (node.marks === undefined) {\n return escapedText\n }\n\n return node.marks.reduce(\n (text, mark) => applyMarkToText(text, mark, context),\n escapedText\n )\n}\n\n/**\n * Apply a mark to a text.\n *\n * @param text - The text to apply the mark to.\n * @param mark - The mark to apply.\n * @param context - Optional context containing layout settings.\n */\nfunction applyMarkToText(\n text: string,\n mark: Mark,\n context?: CodeGenerationContext\n) {\n switch (mark.type) {\n case 'bold':\n return `\\\\textbf{${text}}`\n case 'italic':\n return `\\\\textit{${text}}`\n case 'link': {\n const shouldUnderline = context?.typography?.links?.underline ?? false\n if (shouldUnderline) {\n return `\\\\href{${mark.attrs.href}}{\\\\underline{${text}}}`\n }\n return `\\\\href{${mark.attrs.href}}{${text}}`\n }\n }\n}\n\n/**\n * Convert a fragment to its corresponding LaTeX code.\n *\n * @param fragment - The fragment to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nfunction fragmentToTeX(\n fragment: Fragment,\n context?: CodeGenerationContext\n): string {\n if (fragment === undefined) {\n return ''\n }\n return fragment.map((node) => nodeToTeX(node, context)).join('')\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Root, RootContent } from 'mdast'\nimport remarkParse from 'remark-parse'\nimport { unified } from 'unified'\n\nimport type { BoldMark, ItalicMark, LinkMark, Mark, Node } from '@/compiler/ast'\nimport type { Parser } from './interface'\n\n/**\n * Parse markdown to ast node\n *\n * Under the hood this class first parse the markdown to mdast and then\n * transform the mdast to ast node.\n *\n * @see {@link Parser}\n */\nexport class MarkdownParser implements Parser {\n /**\n * Parse markdown to ast node\n *\n * @param input - The markdown input to parse\n * @returns The ast node\n */\n parse(input: string): Node {\n const ast = unified().use(remarkParse).parse(input)\n return transform(ast)\n }\n}\n\n/**\n * Transforms an mdast node (or content) into ast node(s).\n *\n * This is a recursive descent tree walker that traverses the mdast node and\n * transforms it into a ast node representation. It accumulates formatting marks\n * (like bold, italic) as it descends.\n *\n * @param ast - The mdast node (Root or RootContent) to transform.\n * @param marks - The formatting marks accumulated from parent nodes to apply.\n * Defaults to an empty array.\n * @returns The corresponding ast node, an array of ast nodes (for nodes\n * that expand like emphasis/strong), or `null` if the mdast node type isn't\n * handled.\n */\nfunction transform(ast: Root | RootContent, marks: Mark[] = []) {\n switch (ast.type) {\n case 'root':\n return {\n type: 'doc',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n\n case 'paragraph':\n return {\n type: 'paragraph',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n\n // Text nodes get all accumulated marks applied\n case 'text':\n return {\n type: 'text',\n text: ast.value,\n ...(marks.length > 0 && {\n marks: marks,\n }),\n }\n\n // For text nodes with marks, we accumulate the mark and pass it down to\n // children\n case 'strong': {\n const boldMark: BoldMark = { type: 'bold' }\n return processChildrenWithMarks(ast.children, [...marks, boldMark])\n }\n\n case 'emphasis': {\n const italicMark: ItalicMark = { type: 'italic' }\n return processChildrenWithMarks(ast.children, [...marks, italicMark])\n }\n\n case 'link': {\n const linkMark: LinkMark = {\n type: 'link',\n attrs: {\n href: ast.url,\n target: null,\n class: null,\n },\n }\n return processChildrenWithMarks(ast.children, [...marks, linkMark])\n }\n\n case 'listItem':\n return {\n type: 'listItem',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n\n case 'list':\n return {\n type: ast.ordered ? 'orderedList' : 'bulletList',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n }\n\n return null\n}\n\n/**\n * Process children with accumulated marks\n *\n * This function processes the children of a node with accumulated marks and\n * returns a flat array of transformed nodes.\n *\n * @param children - The children of the node to process.\n * @param marks - The accumulated marks to apply to the node.\n * @returns The transformed ast node if only one results from the children,\n * otherwise an array of the transformed ast nodes.\n */\nfunction processChildrenWithMarks(children: RootContent[], marks: Mark[]) {\n // Transform each child with the accumulated marks\n const transformedNodes = children\n .map((child) => transform(child, marks))\n .filter(Boolean)\n\n // If only one node is returned (common case), return it directly\n if (transformedNodes.length === 1) {\n return transformedNodes[0]\n }\n\n // If multiple nodes (e.g., complex formatting spanning multiple text nodes),\n // return them all to be added to parent's content\n return transformedNodes\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { joinNonEmptyString } from '@/utils'\n\n/**\n * Error categories using bitwise flags\n *\n * First 3 bits for category, last 5 bits for specific errors, total range:\n * 0-255 (8 bits), that is also the range of errno accepted by `process.exit`\n *\n * For now we have 3 categories of errors:\n *\n * - File related errors\n * - Format parsing errors\n * - LaTeX related errors\n */\nexport const ErrorCategory = {\n FILE: 0x00, // 00000000\n FORMAT: 0x20, // 00100000\n LATEX: 0x40, // 01000000\n} as const\n\n/**\n * Enum of error codes for YAMLResumeError.\n *\n * Error codes are used to identify specific errors and can be used to\n * internationalize error messages.\n */\nexport const ErrorType = {\n // File related errors (0x00 - 0x1F)\n FILE_NOT_FOUND: {\n code: 'FILE_NOT_FOUND',\n errno: ErrorCategory.FILE | 0x01,\n message: 'Resume not found: {path}',\n path: '',\n },\n FILE_READ_ERROR: {\n code: 'FILE_READ_ERROR',\n errno: ErrorCategory.FILE | 0x02,\n message: 'Failed to read resume file: {path}',\n path: '',\n },\n FILE_WRITE_ERROR: {\n code: 'FILE_WRITE_ERROR',\n errno: ErrorCategory.FILE | 0x03,\n message: 'Failed to write file: {path}',\n path: '',\n },\n FILE_CONFLICT: {\n code: 'FILE_CONFLICT',\n errno: ErrorCategory.FILE | 0x04,\n message: joinNonEmptyString(\n [\n 'File already exists: {path}.',\n 'Please choose a different filename or remove the existing file.',\n ],\n ' '\n ),\n path: '',\n },\n INVALID_EXTNAME: {\n code: 'INVALID_EXTNAME',\n errno: ErrorCategory.FILE | 0x05,\n message: joinNonEmptyString(\n [\n 'Invalid file extension: {extname}.',\n 'Supported formats are: yaml, yml, json.',\n ],\n ' '\n ),\n extname: '',\n },\n\n // Format parsing errors (0x20 - 0x3F)\n INVALID_YAML: {\n code: 'INVALID_YAML',\n errno: ErrorCategory.FORMAT | 0x01,\n message: 'Invalid YAML format: {error}',\n error: '',\n },\n INVALID_JSON: {\n code: 'INVALID_JSON',\n errno: ErrorCategory.FORMAT | 0x02,\n message: 'Invalid JSON format: {error}',\n error: '',\n },\n\n // LaTeX related errors (0x40 - 0x5F)\n LATEX_NOT_FOUND: {\n code: 'LATEX_NOT_FOUND',\n errno: ErrorCategory.LATEX | 0x01,\n message:\n 'LaTeX compiler not found. Please install either xelatex or tectonic',\n },\n LATEX_COMPILE_ERROR: {\n code: 'LATEX_COMPILE_ERROR',\n errno: ErrorCategory.LATEX | 0x02,\n message: 'LaTeX compilation failed: {error}',\n error: '',\n },\n} as const\n\n/**\n * Helper functions for working with error numbers\n */\nexport const ErrorUtils = {\n /**\n * Get the category of an error number\n *\n * @param errno - The error number\n * @returns The category name or undefined if not found\n */\n getCategory(errno: number): keyof typeof ErrorCategory | undefined {\n const category = errno & 0x60 // 01100000\n return Object.entries(ErrorCategory).find(\n ([_, value]) => value === category\n )?.[0] as keyof typeof ErrorCategory\n },\n\n /**\n * Get the subcategory (specific error) of an error number\n *\n * @param errno - The error number\n * @returns The subcategory number\n */\n getSubcategory(errno: number): number {\n return errno & 0x1f // 00011111\n },\n\n /**\n * Check if an error number belongs to a specific category\n * @param errno - The error number\n * @param category - The category to check\n * @returns True if the error belongs to the category\n */\n isCategory(errno: number, category: keyof typeof ErrorCategory): boolean {\n return (errno & 0x60) === ErrorCategory[category]\n },\n} as const\n\n/**\n * Type for the error code.\n */\nexport type ErrorCodeType = keyof typeof ErrorType\n\n/**\n * Type for the error message parameters.\n */\nexport type ErrorMessageParams = {\n [K in ErrorCodeType]: {\n [P in keyof (typeof ErrorType)[K] as P extends 'message' | 'code' | 'errno'\n ? never\n : P]: string\n }\n}\n\n/**\n * Custom error class for YAMLResume errors.\n */\nexport class YAMLResumeError<T extends ErrorCodeType> extends Error {\n public errno: number\n\n /**\n * Constructor for YAMLResumeError.\n *\n * @param code - The error code.\n * @param params - The error message parameters.\n */\n constructor(\n public code: T,\n params: ErrorMessageParams[T]\n ) {\n const error = ErrorType[code]\n const template = error.message\n const message = template.replace(\n /\\{(\\w+)\\}/g,\n // Use type assertion for safer access, especially if params can be {}\n (_, key) => (params as Record<string, string>)[key] || ''\n )\n super(message)\n this.name = 'YAMLResumeError'\n this.errno = error.errno // Set errno from the definition\n }\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Country } from '@/models'\n\n/**\n * All possible countries and regions in the world.\n */\nexport const COUNTRY_OPTIONS = [\n 'Afghanistan',\n 'Aland Islands',\n 'Albania',\n 'Algeria',\n 'American Samoa',\n 'Andorra',\n 'Angola',\n 'Anguilla',\n 'Antarctica',\n 'Antigua And Barbuda',\n 'Argentina',\n 'Armenia',\n 'Aruba',\n 'Australia',\n 'Austria',\n 'Azerbaijan',\n 'Bahrain',\n 'Bangladesh',\n 'Barbados',\n 'Belarus',\n 'Belgium',\n 'Belize',\n 'Benin',\n 'Bermuda',\n 'Bhutan',\n 'Bolivia',\n 'Bonaire, Sint Eustatius and Saba',\n 'Bosnia and Herzegovina',\n 'Botswana',\n 'Bouvet Island',\n 'Brazil',\n 'British Indian Ocean Territory',\n 'Brunei',\n 'Bulgaria',\n 'Burkina Faso',\n 'Burundi',\n 'Cambodia',\n 'Cameroon',\n 'Canada',\n 'Cape Verde',\n 'Cayman Islands',\n 'Central African Republic',\n 'Chad',\n 'Chile',\n 'China',\n 'Christmas Island',\n 'Cocos (Keeling) Islands',\n 'Colombia',\n 'Comoros',\n 'Congo',\n 'Cook Islands',\n 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\",\n 'Croatia',\n 'Cuba',\n 'Curaçao',\n 'Cyprus',\n 'Czech Republic',\n 'Democratic Republic of the Congo',\n 'Denmark',\n 'Djibouti',\n 'Dominica',\n 'Dominican Republic',\n 'East Timor',\n 'Ecuador',\n 'Egypt',\n 'El Salvador',\n 'Equatorial Guinea',\n 'Eritrea',\n 'Estonia',\n 'Ethiopia',\n 'Falkland Islands',\n 'Faroe Islands',\n 'Fiji Islands',\n 'Finland',\n 'France',\n 'French Guiana',\n 'French Polynesia',\n 'French Southern Territories',\n 'Gabon',\n 'Gambia The',\n 'Georgia',\n 'Germany',\n 'Ghana',\n 'Gibraltar',\n 'Greece',\n 'Greenland',\n 'Grenada',\n 'Guadeloupe',\n 'Guam',\n 'Guatemala',\n 'Guernsey and Alderney',\n 'Guinea',\n 'Guinea-Bissau',\n 'Guyana',\n 'Haiti',\n 'Heard Island and McDonald Islands',\n 'Honduras',\n 'Hong Kong',\n 'Hungary',\n 'Iceland',\n 'India',\n 'Indonesia',\n 'Iran',\n 'Iraq',\n 'Ireland',\n 'Israel',\n 'Italy',\n 'Jamaica',\n 'Japan',\n 'Jersey',\n 'Jordan',\n 'Kazakhstan',\n 'Kenya',\n 'Kiribati',\n 'Kosovo',\n 'Kuwait',\n 'Kyrgyzstan',\n 'Laos',\n 'Latvia',\n 'Lebanon',\n 'Lesotho',\n 'Liberia',\n 'Libya',\n 'Liechtenstein',\n 'Lithuania',\n 'Luxembourg',\n 'Macau',\n 'Madagascar',\n 'Malawi',\n 'Malaysia',\n 'Maldives',\n 'Mali',\n 'Malta',\n 'Man (Isle of)',\n 'Marshall Islands',\n 'Martinique',\n 'Mauritania',\n 'Mauritius',\n 'Mayotte',\n 'Mexico',\n 'Micronesia',\n 'Moldova',\n 'Monaco',\n 'Mongolia',\n 'Montenegro',\n 'Montserrat',\n 'Morocco',\n 'Mozambique',\n 'Myanmar',\n 'Namibia',\n 'Nauru',\n 'Nepal',\n 'Netherlands',\n 'New Caledonia',\n 'New Zealand',\n 'Nicaragua',\n 'Niger',\n 'Nigeria',\n 'Niue',\n 'Norfolk Island',\n 'North Korea',\n 'North Macedonia',\n 'Northern Mariana Islands',\n 'Norway',\n 'Oman',\n 'Pakistan',\n 'Palau',\n 'Palestinian Territory Occupied',\n 'Panama',\n 'Papua new Guinea',\n 'Paraguay',\n 'Peru',\n 'Philippines',\n 'Pitcairn Island',\n 'Poland',\n 'Portugal',\n 'Puerto Rico',\n 'Qatar',\n 'Reunion',\n 'Romania',\n 'Russia',\n 'Rwanda',\n 'Saint Helena',\n 'Saint Kitts And Nevis',\n 'Saint Lucia',\n 'Saint Pierre and Miquelon',\n 'Saint Vincent And The Grenadines',\n 'Saint-Barthelemy',\n 'Saint-Martin (French part)',\n 'Samoa',\n 'San Marino',\n 'Sao Tome and Principe',\n 'Saudi Arabia',\n 'Senegal',\n 'Serbia',\n 'Seychelles',\n 'Sierra Leone',\n 'Singapore',\n 'Sint Maarten (Dutch part)',\n 'Slovakia',\n 'Slovenia',\n 'Solomon Islands',\n 'Somalia',\n 'South Africa',\n 'South Georgia',\n 'South Korea',\n 'South Sudan',\n 'Spain',\n 'Sri Lanka',\n 'Sudan',\n 'Suriname',\n 'Svalbard And Jan Mayen Islands',\n 'Swaziland',\n 'Sweden',\n 'Switzerland',\n 'Syria',\n 'Taiwan',\n 'Tajikistan',\n 'Tanzania',\n 'Thailand',\n 'The Bahamas',\n 'Togo',\n 'Tokelau',\n 'Tonga',\n 'Trinidad And Tobago',\n 'Tunisia',\n 'Turkey',\n 'Turkmenistan',\n 'Turks And Caicos Islands',\n 'Tuvalu',\n 'Uganda',\n 'Ukraine',\n 'United Arab Emirates',\n 'United Kingdom',\n 'United States',\n 'United States Minor Outlying Islands',\n 'Uruguay',\n 'Uzbekistan',\n 'Vanuatu',\n 'Vatican City State (Holy See)',\n 'Venezuela',\n 'Vietnam',\n 'Virgin Islands (British)',\n 'Virgin Islands (US)',\n 'Wallis And Futuna Islands',\n 'Western Sahara',\n 'Yemen',\n 'Zambia',\n 'Zimbabwe',\n] as const\n\n/**\n * Represents all possible countries & regions with their corresponding English\n * names.\n */\nexport const EnglishCountryNames: Record<Country, string> = {\n Afghanistan: 'Afghanistan',\n 'Aland Islands': 'Aland Islands',\n Albania: 'Albania',\n Algeria: 'Algeria',\n 'American Samoa': 'American Samoa',\n Andorra: 'Andorra',\n Angola: 'Angola',\n Anguilla: 'Anguilla',\n Antarctica: 'Antarctica',\n 'Antigua And Barbuda': 'Antigua And Barbuda',\n Argentina: 'Argentina',\n Armenia: 'Armenia',\n Aruba: 'Aruba',\n Australia: 'Australia',\n Austria: 'Austria',\n Azerbaijan: 'Azerbaijan',\n Bahrain: 'Bahrain',\n Bangladesh: 'Bangladesh',\n Barbados: 'Barbados',\n Belarus: 'Belarus',\n Belgium: 'Belgium',\n Belize: 'Belize',\n Benin: 'Benin',\n Bermuda: 'Bermuda',\n Bhutan: 'Bhutan',\n Bolivia: 'Bolivia',\n 'Bonaire, Sint Eustatius and Saba': 'Bonaire',\n 'Bosnia and Herzegovina': 'Bosnia and Herzegovina',\n Botswana: 'Botswana',\n 'Bouvet Island': 'Bouvet Island',\n Brazil: 'Brazil',\n 'British Indian Ocean Territory': 'British Indian Ocean Territory',\n Brunei: 'Brunei',\n Bulgaria: 'Bulgaria',\n 'Burkina Faso': 'Burkina Faso',\n Burundi: 'Burundi',\n Cambodia: 'Cambodia',\n Cameroon: 'Cameroon',\n Canada: 'Canada',\n 'Cape Verde': 'Cape Verde',\n 'Cayman Islands': 'Cayman Islands',\n 'Central African Republic': 'Central African Republic',\n Chad: 'Chad',\n Chile: 'Chile',\n China: 'China',\n 'Christmas Island': 'Christmas Island',\n 'Cocos (Keeling) Islands': 'Cocos (Keeling) Islands',\n Colombia: 'Colombia',\n Comoros: 'Comoros',\n Congo: 'Congo',\n 'Cook Islands': 'Cook Islands',\n 'Costa Rica': 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\": \"Cote D'Ivoire (Ivory Coast)\",\n Croatia: 'Croatia',\n Cuba: 'Cuba',\n Curaçao: 'Curaçao',\n Cyprus: 'Cyprus',\n 'Czech Republic': 'Czech Republic',\n 'Democratic Republic of the Congo': 'Democratic Republic of the Congo',\n Denmark: 'Denmark',\n Djibouti: 'Djibouti',\n Dominica: 'Dominica',\n 'Dominican Republic': 'Dominican Republic',\n 'East Timor': 'East Timor',\n Ecuador: 'Ecuador',\n Egypt: 'Egypt',\n 'El Salvador': 'El Salvador',\n 'Equatorial Guinea': 'Equatorial Guinea',\n Eritrea: 'Eritrea',\n Estonia: 'Estonia',\n Ethiopia: 'Ethiopia',\n 'Falkland Islands': 'Falkland Islands',\n 'Faroe Islands': 'Faroe Islands',\n 'Fiji Islands': 'Fiji Islands',\n Finland: 'Finland',\n France: 'France',\n 'French Guiana': 'French Guiana',\n 'French Polynesia': 'French Polynesia',\n 'French Southern Territories': 'French Southern Territories',\n Gabon: 'Gabon',\n 'Gambia The': 'Gambia The',\n Georgia: 'Georgia',\n Germany: 'Germany',\n Ghana: 'Ghana',\n Gibraltar: 'Gibraltar',\n Greece: 'Greece',\n Greenland: 'Greenland',\n Grenada: 'Grenada',\n Guadeloupe: 'Guadeloupe',\n Guam: 'Guam',\n Guatemala: 'Guatemala',\n 'Guernsey and Alderney': 'Guernsey and Alderney',\n Guinea: 'Guinea',\n 'Guinea-Bissau': 'Guinea-Bissau',\n Guyana: 'Guyana',\n Haiti: 'Haiti',\n 'Heard Island and McDonald Islands': 'Heard Island and McDonald Islands',\n Honduras: 'Honduras',\n 'Hong Kong': 'Hong Kong',\n Hungary: 'Hungary',\n Iceland: 'Iceland',\n India: 'India',\n Indonesia: 'Indonesia',\n Iran: 'Iran',\n Iraq: 'Iraq',\n Ireland: 'Ireland',\n Israel: 'Israel',\n Italy: 'Italy',\n Jamaica: 'Jamaica',\n Japan: 'Japan',\n Jersey: 'Jersey',\n Jordan: 'Jordan',\n Kazakhstan: 'Kazakhstan',\n Kenya: 'Kenya',\n Kiribati: 'Kiribati',\n Kosovo: 'Kosovo',\n Kuwait: 'Kuwait',\n Kyrgyzstan: 'Kyrgyzstan',\n Laos: 'Laos',\n Latvia: 'Latvia',\n Lebanon: 'Lebanon',\n Lesotho: 'Lesotho',\n Liberia: 'Liberia',\n Libya: 'Libya',\n Liechtenstein: 'Liechtenstein',\n Lithuania: 'Lithuania',\n Luxembourg: 'Luxembourg',\n Macau: 'Macau',\n Madagascar: 'Madagascar',\n Malawi: 'Malawi',\n Malaysia: 'Malaysia',\n Maldives: 'Maldives',\n Mali: 'Mali',\n Malta: 'Malta',\n 'Man (Isle of)': 'Man (Isle of)',\n 'Marshall Islands': 'Marshall Islands',\n Martinique: 'Martinique',\n Mauritania: 'Mauritania',\n Mauritius: 'Mauritius',\n Mayotte: 'Mayotte',\n Mexico: 'Mexico',\n Micronesia: 'Micronesia',\n Moldova: 'Moldova',\n Monaco: 'Monaco',\n Mongolia: 'Mongolia',\n Montenegro: 'Montenegro',\n Montserrat: 'Montserrat',\n Morocco: 'Morocco',\n Mozambique: 'Mozambique',\n Myanmar: 'Myanmar',\n Namibia: 'Namibia',\n Nauru: 'Nauru',\n Nepal: 'Nepal',\n Netherlands: 'Netherlands',\n 'New Caledonia': 'New Caledonia',\n 'New Zealand': 'New Zealand',\n Nicaragua: 'Nicaragua',\n Niger: 'Niger',\n Nigeria: 'Nigeria',\n Niue: 'Niue',\n 'Norfolk Island': 'Norfolk Island',\n 'North Korea': 'North Korea',\n 'North Macedonia': 'North Macedonia',\n 'Northern Mariana Islands': 'Northern Mariana Islands',\n Norway: 'Norway',\n Oman: 'Oman',\n Pakistan: 'Pakistan',\n Palau: 'Palau',\n 'Palestinian Territory Occupied': 'Palestinian Territory Occupied',\n Panama: 'Panama',\n 'Papua new Guinea': 'Papua new Guinea',\n Paraguay: 'Paraguay',\n Peru: 'Peru',\n Philippines: 'Philippines',\n 'Pitcairn Island': 'Pitcairn Island',\n Poland: 'Poland',\n Portugal: 'Portugal',\n 'Puerto Rico': 'Puerto Rico',\n Qatar: 'Qatar',\n Reunion: 'Reunion',\n Romania: 'Romania',\n Russia: 'Russia',\n Rwanda: 'Rwanda',\n 'Saint Helena': 'Saint Helena',\n 'Saint Kitts And Nevis': 'Saint Kitts And Nevis',\n 'Saint Lucia': 'Saint Lucia',\n 'Saint Pierre and Miquelon': 'Saint Pierre and Miquelon',\n 'Saint Vincent And The Grenadines': 'Saint Vincent And The Grenadines',\n 'Saint-Barthelemy': 'Saint-Barthelemy',\n 'Saint-Martin (French part)': 'Saint-Martin (French part)',\n Samoa: 'Samoa',\n 'San Marino': 'San Marino',\n 'Sao Tome and Principe': 'Sao Tome and Principe',\n 'Saudi Arabia': 'Saudi Arabia',\n Senegal: 'Senegal',\n Serbia: 'Serbia',\n Seychelles: 'Seychelles',\n 'Sierra Leone': 'Sierra Leone',\n Singapore: 'Singapore',\n 'Sint Maarten (Dutch part)': 'Sint Maarten (Dutch part)',\n Slovakia: 'Slovakia',\n Slovenia: 'Slovenia',\n 'Solomon Islands': 'Solomon Islands',\n Somalia: 'Somalia',\n 'South Africa': 'South Africa',\n 'South Georgia': 'South Georgia',\n 'South Korea': 'South Korea',\n 'South Sudan': 'South Sudan',\n Spain: 'Spain',\n 'Sri Lanka': 'Sri Lanka',\n Sudan: 'Sudan',\n Suriname: 'Suriname',\n 'Svalbard And Jan Mayen Islands': 'Svalbard And Jan Mayen Islands',\n Swaziland: 'Swaziland',\n Sweden: 'Sweden',\n Switzerland: 'Switzerland',\n Syria: 'Syria',\n Taiwan: 'Taiwan',\n Tajikistan: 'Tajikistan',\n Tanzania: 'Tanzania',\n Thailand: 'Thailand',\n 'The Bahamas': 'The Bahamas',\n Togo: 'Togo',\n Tokelau: 'Tokelau',\n Tonga: 'Tonga',\n 'Trinidad And Tobago': 'Trinidad And Tobago',\n Tunisia: 'Tunisia',\n Turkey: 'Turkey',\n Turkmenistan: 'Turkmenistan',\n 'Turks And Caicos Islands': 'Turks And Caicos Islands',\n Tuvalu: 'Tuvalu',\n Uganda: 'Uganda',\n Ukraine: 'Ukraine',\n 'United Arab Emirates': 'United Arab Emirates',\n 'United Kingdom': 'United Kingdom',\n 'United States': 'United States',\n 'United States Minor Outlying Islands':\n 'United States Minor Outlying Islands',\n Uruguay: 'Uruguay',\n Uzbekistan: 'Uzbekistan',\n Vanuatu: 'Vanuatu',\n 'Vatican City State (Holy See)': 'Vatican City State (Holy See)',\n Venezuela: 'Venezuela',\n Vietnam: 'Vietnam',\n 'Virgin Islands (British)': 'Virgin Islands (British)',\n 'Virgin Islands (US)': 'Virgin Islands (US)',\n 'Wallis And Futuna Islands': 'Wallis And Futuna Islands',\n 'Western Sahara': 'Western Sahara',\n Yemen: 'Yemen',\n Zambia: 'Zambia',\n Zimbabwe: 'Zimbabwe',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Simplified Chinese names.\n */\nexport const SimplifiedChineseCountryNames: Record<Country, string> = {\n Afghanistan: '阿富汗',\n 'Aland Islands': '奥兰群岛',\n Albania: '阿尔巴尼亚',\n Algeria: '阿尔及利亚',\n 'American Samoa': '美属萨摩亚',\n Andorra: '安道尔',\n Angola: '安哥拉',\n Anguilla: '安圭拉',\n Antarctica: '南极洲',\n 'Antigua And Barbuda': '安提瓜和巴布达',\n Argentina: '阿根廷',\n Armenia: '亚美尼亚',\n Aruba: '阿鲁巴',\n Australia: '澳大利亚',\n Austria: '奥地利',\n Azerbaijan: '阿塞拜疆',\n Bahrain: '巴林',\n Bangladesh: '孟加拉',\n Barbados: '巴巴多斯',\n Belarus: '白俄罗斯',\n Belgium: '比利时',\n Belize: '伯利兹',\n Benin: '贝宁',\n Bermuda: '百慕大',\n Bhutan: '不丹',\n Bolivia: '玻利维亚',\n 'Bonaire, Sint Eustatius and Saba': '博内尔岛、圣尤斯特歇斯和萨巴岛',\n 'Bosnia and Herzegovina': '波斯尼亚和黑塞哥维那',\n Botswana: '博茨瓦纳',\n 'Bouvet Island': '布维岛',\n Brazil: '巴西',\n 'British Indian Ocean Territory': '英属印度洋领地',\n Brunei: '文莱',\n Bulgaria: '保加利亚',\n 'Burkina Faso': '布基纳法索',\n Burundi: '布隆迪',\n Cambodia: '柬埔寨',\n Cameroon: '喀麦隆',\n Canada: '加拿大',\n 'Cape Verde': '佛得角',\n 'Cayman Islands': '开曼群岛',\n 'Central African Republic': '中非',\n Chad: '乍得',\n Chile: '智利',\n China: '中国',\n 'Christmas Island': '圣诞岛',\n 'Cocos (Keeling) Islands': '科科斯(基林)群岛',\n Colombia: '哥伦比亚',\n Comoros: '科摩罗',\n Congo: '刚果',\n 'Cook Islands': '库克群岛',\n 'Costa Rica': '哥斯达黎加',\n \"Cote D'Ivoire (Ivory Coast)\": '科特迪瓦',\n Croatia: '克罗地亚',\n Cuba: '古巴',\n Curaçao: '库拉索',\n Cyprus: '塞浦路斯',\n 'Czech Republic': '捷克',\n 'Democratic Republic of the Congo': '刚果(金)',\n Denmark: '丹麦',\n Djibouti: '吉布提',\n Dominica: '多米尼加',\n 'Dominican Republic': '多明尼加共和国',\n 'East Timor': '东帝汶',\n Ecuador: '厄瓜多尔',\n Egypt: '埃及',\n 'El Salvador': '萨尔瓦多',\n 'Equatorial Guinea': '赤道几内亚',\n Eritrea: '厄立特里亚',\n Estonia: '爱沙尼亚',\n Ethiopia: '埃塞俄比亚',\n 'Falkland Islands': '福克兰群岛',\n 'Faroe Islands': '法罗群岛',\n 'Fiji Islands': '斐济',\n Finland: '芬兰',\n France: '法国',\n 'French Guiana': '法属圭亚那',\n 'French Polynesia': '法属波利尼西亚',\n 'French Southern Territories': '法属南部领地',\n Gabon: '加蓬',\n 'Gambia The': '冈比亚',\n Georgia: '格鲁吉亚',\n Germany: '德国',\n Ghana: '加纳',\n Gibraltar: '直布罗陀',\n Greece: '希腊',\n Greenland: '格陵兰岛',\n Grenada: '格林纳达',\n Guadeloupe: '瓜德罗普岛',\n Guam: '关岛',\n Guatemala: '危地马拉',\n 'Guernsey and Alderney': '根西岛',\n Guinea: '几内亚',\n 'Guinea-Bissau': '几内亚比绍',\n Guyana: '圭亚那',\n Haiti: '海地',\n 'Heard Island and McDonald Islands': '赫德·唐纳岛及麦唐纳岛',\n Honduras: '洪都拉斯',\n 'Hong Kong': '中国香港',\n Hungary: '匈牙利',\n Iceland: '冰岛',\n India: '印度',\n Indonesia: '印度尼西亚',\n Iran: '伊朗',\n Iraq: '伊拉克',\n Ireland: '爱尔兰',\n Israel: '以色列',\n Italy: '意大利',\n Jamaica: '牙买加',\n Japan: '日本',\n Jersey: '泽西岛',\n Jordan: '约旦',\n Kazakhstan: '哈萨克斯坦',\n Kenya: '肯尼亚',\n Kiribati: '基里巴斯',\n Kosovo: '科索沃',\n Kuwait: '科威特',\n Kyrgyzstan: '吉尔吉斯斯坦',\n Laos: '寮人民民主共和国',\n Latvia: '拉脱维亚',\n Lebanon: '黎巴嫩',\n Lesotho: '莱索托',\n Liberia: '利比里亚',\n Libya: '利比亚',\n Liechtenstein: '列支敦士登',\n Lithuania: '立陶宛',\n Luxembourg: '卢森堡',\n Macau: '中国澳门',\n Madagascar: '马达加斯加',\n Malawi: '马拉维',\n Malaysia: '马来西亚',\n Maldives: '马尔代夫',\n Mali: '马里',\n Malta: '马耳他',\n 'Man (Isle of)': '马恩岛',\n 'Marshall Islands': '马绍尔群岛',\n Martinique: '马提尼克岛',\n Mauritania: '毛里塔尼亚',\n Mauritius: '毛里求斯',\n Mayotte: '马约特',\n Mexico: '墨西哥',\n Micronesia: '密克罗尼西亚',\n Moldova: '摩尔多瓦',\n Monaco: '摩纳哥',\n Mongolia: '蒙古',\n Montenegro: '黑山',\n Montserrat: '蒙特塞拉特',\n Morocco: '摩洛哥',\n Mozambique: '莫桑比克',\n Myanmar: '缅甸',\n Namibia: '纳米比亚',\n Nauru: '瑙鲁',\n Nepal: '尼泊尔',\n Netherlands: '荷兰',\n 'New Caledonia': '新喀里多尼亚',\n 'New Zealand': '新西兰',\n Nicaragua: '尼加拉瓜',\n Niger: '尼日尔',\n Nigeria: '尼日利亚',\n Niue: '纽埃',\n 'Norfolk Island': '诺福克岛',\n 'North Korea': '朝鲜',\n 'North Macedonia': '北馬其頓',\n 'Northern Mariana Islands': '北马里亚纳群岛',\n Norway: '挪威',\n Oman: '阿曼',\n Pakistan: '巴基斯坦',\n Palau: '帕劳',\n 'Palestinian Territory Occupied': '巴勒斯坦',\n Panama: '巴拿马',\n 'Papua new Guinea': '巴布亚新几内亚',\n Paraguay: '巴拉圭',\n Peru: '秘鲁',\n Philippines: '菲律宾',\n 'Pitcairn Island': '皮特凯恩群岛',\n Poland: '波兰',\n Portugal: '葡萄牙',\n 'Puerto Rico': '波多黎各',\n Qatar: '卡塔尔',\n Reunion: '留尼汪岛',\n Romania: '罗马尼亚',\n Russia: '俄罗斯联邦',\n Rwanda: '卢旺达',\n 'Saint Helena': '圣赫勒拿',\n 'Saint Kitts And Nevis': '圣基茨和尼维斯',\n 'Saint Lucia': '圣卢西亚',\n 'Saint Pierre and Miquelon': '圣皮埃尔和密克隆',\n 'Saint Vincent And The Grenadines': '圣文森特和格林纳丁斯',\n 'Saint-Barthelemy': '圣巴泰勒米',\n 'Saint-Martin (French part)': '密克罗尼西亞',\n Samoa: '萨摩亚',\n 'San Marino': '圣马力诺',\n 'Sao Tome and Principe': '圣多美和普林西比',\n 'Saudi Arabia': '沙特阿拉伯',\n Senegal: '塞内加尔',\n Serbia: '塞尔维亚',\n Seychelles: '塞舌尔',\n 'Sierra Leone': '塞拉利昂',\n Singapore: '新加坡',\n 'Sint Maarten (Dutch part)': '圣马丁岛(荷兰部分)',\n Slovakia: '斯洛伐克',\n Slovenia: '斯洛文尼亚',\n 'Solomon Islands': '所罗门群岛',\n Somalia: '索马里',\n 'South Africa': '南非',\n 'South Georgia': '南乔治亚',\n 'South Korea': '韩国',\n 'South Sudan': '南苏丹',\n Spain: '西班牙',\n 'Sri Lanka': '斯里兰卡',\n Sudan: '苏丹',\n Suriname: '苏里南',\n 'Svalbard And Jan Mayen Islands': '斯瓦尔巴和扬马延群岛',\n Swaziland: '斯威士兰',\n Sweden: '瑞典',\n Switzerland: '瑞士',\n Syria: '叙利亚',\n Taiwan: '中国台湾',\n Tajikistan: '塔吉克斯坦',\n Tanzania: '坦桑尼亚',\n Thailand: '泰国',\n 'The Bahamas': '巴哈马',\n Togo: '多哥',\n Tokelau: '托克劳',\n Tonga: '汤加',\n 'Trinidad And Tobago': '特立尼达和多巴哥',\n Tunisia: '突尼斯',\n Turkey: '土耳其',\n Turkmenistan: '土库曼斯坦',\n 'Turks And Caicos Islands': '特克斯和凯科斯群岛',\n Tuvalu: '图瓦卢',\n Uganda: '乌干达',\n Ukraine: '乌克兰',\n 'United Arab Emirates': '阿拉伯联合酋长国',\n 'United Kingdom': '英国',\n 'United States': '美国',\n 'United States Minor Outlying Islands': '美国本土外小岛屿',\n Uruguay: '乌拉圭',\n Uzbekistan: '乌兹别克斯坦',\n Vanuatu: '瓦努阿图',\n 'Vatican City State (Holy See)': '梵蒂冈',\n Venezuela: '委内瑞拉',\n Vietnam: '越南',\n 'Virgin Islands (British)': '圣文森特和格林纳丁斯',\n 'Virgin Islands (US)': '维尔京群岛(美国)',\n 'Wallis And Futuna Islands': '瓦利斯群岛和富图纳群岛',\n 'Western Sahara': '西撒哈拉',\n Yemen: '也门',\n Zambia: '赞比亚',\n Zimbabwe: '津巴布韦',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Traditional Chinese HK names.\n */\nexport const TraditionalChineseCountryHKNames: Record<Country, string> = {\n Afghanistan: '阿富汗',\n 'Aland Islands': '奧蘭羣島',\n Albania: '阿爾巴尼亞',\n Algeria: '阿爾及利亞',\n 'American Samoa': '美屬薩摩亞',\n Andorra: '安道爾',\n Angola: '安哥拉',\n Anguilla: '安圭拉',\n Antarctica: '南極洲',\n 'Antigua And Barbuda': '安提瓜和巴布達',\n Argentina: '阿根廷',\n Armenia: '亞美尼亞',\n Aruba: '阿魯巴',\n Australia: '澳大利亞',\n Austria: '奧地利',\n Azerbaijan: '阿塞拜疆',\n Bahrain: '巴林',\n Bangladesh: '孟加拉',\n Barbados: '巴巴多斯',\n Belarus: '白俄羅斯',\n Belgium: '比利時',\n Belize: '伯利茲',\n Benin: '貝寧',\n Bermuda: '百慕大',\n Bhutan: '不丹',\n Bolivia: '玻利維亞',\n 'Bonaire, Sint Eustatius and Saba': '博內爾島、聖尤斯特歇斯和薩巴島',\n 'Bosnia and Herzegovina': '波斯尼亞和黑塞哥維那',\n Botswana: '博茨瓦納',\n 'Bouvet Island': '布維島',\n Brazil: '巴西',\n 'British Indian Ocean Territory': '英屬印度洋領地',\n Brunei: '文萊',\n Bulgaria: '保加利亞',\n 'Burkina Faso': '布基納法索',\n Burundi: '布隆迪',\n Cambodia: '柬埔寨',\n Cameroon: '喀麥隆',\n Canada: '加拿大',\n 'Cape Verde': '佛得角',\n 'Cayman Islands': '開曼羣島',\n 'Central African Republic': '中非',\n Chad: '乍得',\n Chile: '智利',\n China: '中國',\n 'Christmas Island': '聖誕島',\n 'Cocos (Keeling) Islands': '科科斯(基林)羣島',\n Colombia: '哥倫比亞',\n Comoros: '科摩羅',\n Congo: '剛果',\n 'Cook Islands': '庫克羣島',\n 'Costa Rica': '哥斯達黎加',\n \"Cote D'Ivoire (Ivory Coast)\": '科特迪瓦',\n Croatia: '克羅地亞',\n Cuba: '古巴',\n Curaçao: '庫拉索',\n Cyprus: '塞浦路斯',\n 'Czech Republic': '捷克',\n 'Democratic Republic of the Congo': '剛果(金)',\n Denmark: '丹麥',\n Djibouti: '吉布提',\n Dominica: '多米尼加',\n 'Dominican Republic': '多明尼加共和國',\n 'East Timor': '東帝汶',\n Ecuador: '厄瓜多爾',\n Egypt: '埃及',\n 'El Salvador': '薩爾瓦多',\n 'Equatorial Guinea': '赤道幾內亞',\n Eritrea: '厄立特里亞',\n Estonia: '愛沙尼亞',\n Ethiopia: '埃塞俄比亞',\n 'Falkland Islands': '福克蘭羣島',\n 'Faroe Islands': '法羅羣島',\n 'Fiji Islands': '斐濟',\n Finland: '芬蘭',\n France: '法國',\n 'French Guiana': '法屬圭亞那',\n 'French Polynesia': '法屬波利尼西亞',\n 'French Southern Territories': '法屬南部領地',\n Gabon: '加蓬',\n 'Gambia The': '岡比亞',\n Georgia: '格魯吉亞',\n Germany: '德國',\n Ghana: '加納',\n Gibraltar: '直布羅陀',\n Greece: '希臘',\n Greenland: '格陵蘭島',\n Grenada: '格林納達',\n Guadeloupe: '瓜德羅普島',\n Guam: '關島',\n Guatemala: '危地馬拉',\n 'Guernsey and Alderney': '根西島',\n Guinea: '幾內亞',\n 'Guinea-Bissau': '幾內亞比紹',\n Guyana: '圭亞那',\n Haiti: '海地',\n 'Heard Island and McDonald Islands': '赫德·唐納島及麥唐納島',\n Honduras: '洪都拉斯',\n 'Hong Kong': '中國香港',\n Hungary: '匈牙利',\n Iceland: '冰島',\n India: '印度',\n Indonesia: '印度尼西亞',\n Iran: '伊朗',\n Iraq: '伊拉克',\n Ireland: '愛爾蘭',\n Israel: '以色列',\n Italy: '意大利',\n Jamaica: '牙買加',\n Japan: '日本',\n Jersey: '澤西島',\n Jordan: '約旦',\n Kazakhstan: '哈薩克斯坦',\n Kenya: '肯尼亞',\n Kiribati: '基里巴斯',\n Kosovo: '科索沃',\n Kuwait: '科威特',\n Kyrgyzstan: '吉爾吉斯斯坦',\n Laos: '寮人民民主共和國',\n Latvia: '拉脫維亞',\n Lebanon: '黎巴嫩',\n Lesotho: '萊索托',\n Liberia: '利比里亞',\n Libya: '利比亞',\n Liechtenstein: '列支敦士登',\n Lithuania: '立陶宛',\n Luxembourg: '盧森堡',\n Macau: '中國澳門',\n Madagascar: '馬達加斯加',\n Malawi: '馬拉維',\n Malaysia: '馬來西亞',\n Maldives: '馬爾代夫',\n Mali: '馬裏',\n Malta: '馬耳他',\n 'Man (Isle of)': '馬恩島',\n 'Marshall Islands': '馬紹爾羣島',\n Martinique: '馬提尼克島',\n Mauritania: '毛里塔尼亞',\n Mauritius: '毛里求斯',\n Mayotte: '馬約特',\n Mexico: '墨西哥',\n Micronesia: '密克羅尼西亞',\n Moldova: '摩爾多瓦',\n Monaco: '摩納哥',\n Mongolia: '蒙古',\n Montenegro: '黑山',\n Montserrat: '蒙特塞拉特',\n Morocco: '摩洛哥',\n Mozambique: '莫桑比克',\n Myanmar: '緬甸',\n Namibia: '納米比亞',\n Nauru: '瑙魯',\n Nepal: '尼泊爾',\n Netherlands: '荷蘭',\n 'New Caledonia': '新喀里多尼亞',\n 'New Zealand': '新西蘭',\n Nicaragua: '尼加拉瓜',\n Niger: '尼日爾',\n Nigeria: '尼日利亞',\n Niue: '紐埃',\n 'Norfolk Island': '諾福克島',\n 'North Korea': '朝鮮',\n 'North Macedonia': '北馬其頓',\n 'Northern Mariana Islands': '北马里亞納羣島',\n Norway: '挪威',\n Oman: '阿曼',\n Pakistan: '巴基斯坦',\n Palau: '帕勞',\n 'Palestinian Territory Occupied': '巴勒斯坦',\n Panama: '巴拿馬',\n 'Papua new Guinea': '巴布亞新幾內亞',\n Paraguay: '巴拉圭',\n Peru: '祕魯',\n Philippines: '菲律賓',\n 'Pitcairn Island': '皮特凱恩羣島',\n Poland: '波蘭',\n Portugal: '葡萄牙',\n 'Puerto Rico': '波多黎各',\n Qatar: '卡塔爾',\n Reunion: '留尼汪島',\n Romania: '羅馬尼亞',\n Russia: '俄羅斯聯邦',\n Rwanda: '盧旺達',\n 'Saint Helena': '聖赫勒拿',\n 'Saint Kitts And Nevis': '聖基茨和尼維斯',\n 'Saint Lucia': '聖盧西亞',\n 'Saint Pierre and Miquelon': '聖皮埃爾和密克隆',\n 'Saint Vincent And The Grenadines': '聖文森特和格林納丁斯',\n 'Saint-Barthelemy': '聖巴泰勒米',\n 'Saint-Martin (French part)': '密克羅尼西亞',\n Samoa: '薩摩亞',\n 'San Marino': '聖馬力諾',\n 'Sao Tome and Principe': '聖多美和普林西比',\n 'Saudi Arabia': '沙特阿拉伯',\n Senegal: '塞內加爾',\n Serbia: '塞爾維亞',\n Seychelles: '塞舌爾',\n 'Sierra Leone': '塞拉利昂',\n Singapore: '新加坡',\n 'Sint Maarten (Dutch part)': '聖馬丁島(荷蘭部分)',\n Slovakia: '斯洛伐克',\n Slovenia: '斯洛文尼亞',\n 'Solomon Islands': '所羅門羣島',\n Somalia: '索馬里',\n 'South Africa': '南非',\n 'South Georgia': '南喬治亞',\n 'South Korea': '韓國',\n 'South Sudan': '南蘇丹',\n Spain: '西班牙',\n 'Sri Lanka': '斯里蘭卡',\n Sudan: '蘇丹',\n Suriname: '蘇利南',\n 'Svalbard And Jan Mayen Islands': '斯瓦爾巴和揚馬延羣島',\n Swaziland: '斯威士蘭',\n Sweden: '瑞典',\n Switzerland: '瑞士',\n Syria: '敘利亞',\n Taiwan: '中國臺灣',\n Tajikistan: '塔吉克斯坦',\n Tanzania: '坦桑尼亞',\n Thailand: '泰國',\n 'The Bahamas': '巴哈馬',\n Togo: '多哥',\n Tokelau: '托克勞',\n Tonga: '湯加',\n 'Trinidad And Tobago': '特立尼達和多巴哥',\n Tunisia: '突尼斯',\n Turkey: '土耳其',\n Turkmenistan: '土庫曼斯坦',\n 'Turks And Caicos Islands': '特克斯和凱科斯羣島',\n Tuvalu: '圖瓦盧',\n Uganda: '烏干達',\n Ukraine: '烏克蘭',\n 'United Arab Emirates': '阿拉伯聯合酋長國',\n 'United Kingdom': '英國',\n 'United States': '美國',\n 'United States Minor Outlying Islands': '美國本土外小島嶼',\n Uruguay: '烏拉圭',\n Uzbekistan: '烏茲別克斯坦',\n Vanuatu: '瓦努阿圖',\n 'Vatican City State (Holy See)': '梵蒂岡',\n Venezuela: '委內瑞拉',\n Vietnam: '越南',\n 'Virgin Islands (British)': '聖文森特和格林納丁斯',\n 'Virgin Islands (US)': '維爾京羣島(美國)',\n 'Wallis And Futuna Islands': '瓦利斯羣島和富圖納羣島',\n 'Western Sahara': '西撒哈拉',\n Yemen: '也門',\n Zambia: '贊比亞',\n Zimbabwe: '津巴布韋',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Traditional Chinese TW names.\n */\nexport const TraditionalChineseCountryTWNames: Record<Country, string> = {\n Afghanistan: '阿富汗',\n 'Aland Islands': '奧蘭群島',\n Albania: '阿爾巴尼亞',\n Algeria: '阿爾及利亞',\n 'American Samoa': '美屬薩摩亞',\n Andorra: '安道爾',\n Angola: '安哥拉',\n Anguilla: '安圭拉',\n Antarctica: '南極洲',\n 'Antigua And Barbuda': '安地卡及巴布達',\n Argentina: '阿根廷',\n Armenia: '亞美尼亞',\n Aruba: '阿魯巴',\n Australia: '澳大利亞',\n Austria: '奧地利',\n Azerbaijan: '亞塞拜然',\n Bahrain: '巴林',\n Bangladesh: '孟加拉',\n Barbados: '巴貝多',\n Belarus: '白俄羅斯',\n Belgium: '比利時',\n Belize: '貝里斯',\n Benin: '貝南',\n Bermuda: '百慕大',\n Bhutan: '不丹',\n Bolivia: '玻利維亞',\n 'Bonaire, Sint Eustatius and Saba': '博內爾島、聖尤斯特歇斯和薩巴島',\n 'Bosnia and Herzegovina': '波斯尼亞和黑塞哥維那',\n Botswana: '波札那',\n 'Bouvet Island': '布維島',\n Brazil: '巴西',\n 'British Indian Ocean Territory': '英屬印度洋領地',\n Brunei: '汶萊',\n Bulgaria: '保加利亞',\n 'Burkina Faso': '布吉納法索',\n Burundi: '蒲隆地',\n Cambodia: '柬埔寨',\n Cameroon: '喀麥隆',\n Canada: '加拿大',\n 'Cape Verde': '維德角',\n 'Cayman Islands': '開曼群島',\n 'Central African Republic': '中非',\n Chad: '查德',\n Chile: '智利',\n China: '中國',\n 'Christmas Island': '聖誕島',\n 'Cocos (Keeling) Islands': '科科斯(基林)群島',\n Colombia: '哥倫比亞',\n Comoros: '葛摩',\n Congo: '剛果',\n 'Cook Islands': '庫克群島',\n 'Costa Rica': '哥斯大黎加',\n \"Cote D'Ivoire (Ivory Coast)\": '象牙海岸',\n Croatia: '克羅埃西亞',\n Cuba: '古巴',\n Curaçao: '庫拉索',\n Cyprus: '塞普勒斯',\n 'Czech Republic': '捷克',\n 'Democratic Republic of the Congo': '剛果(金)',\n Denmark: '丹麥',\n Djibouti: '吉布提',\n Dominica: '多明尼加',\n 'Dominican Republic': '多明尼加共和國',\n 'East Timor': '東帝汶',\n Ecuador: '厄瓜多',\n Egypt: '埃及',\n 'El Salvador': '薩爾瓦多',\n 'Equatorial Guinea': '赤道幾內亞',\n Eritrea: '厄利垂亞',\n Estonia: '愛沙尼亞',\n Ethiopia: '衣索比亞',\n 'Falkland Islands': '福克蘭羣島',\n 'Faroe Islands': '法羅群島',\n 'Fiji Islands': '斐濟',\n Finland: '芬蘭',\n France: '法國',\n 'French Guiana': '法屬蓋亞那',\n 'French Polynesia': '法屬波利尼西亞',\n 'French Southern Territories': '法屬南部領地',\n Gabon: '加彭',\n 'Gambia The': '甘比亞',\n Georgia: '喬治亞',\n Germany: '德國',\n Ghana: '迦納',\n Gibraltar: '直布羅陀',\n Greece: '希臘',\n Greenland: '格陵蘭島',\n Grenada: '格瑞那達',\n Guadeloupe: '瓜德羅普島',\n Guam: '關島',\n Guatemala: '瓜地馬拉',\n 'Guernsey and Alderney': '根西島',\n Guinea: '幾內亞',\n 'Guinea-Bissau': '幾內亞比索',\n Guyana: '蓋亞那',\n Haiti: '海地',\n 'Heard Island and McDonald Islands': '赫德·唐納島及麥唐納島',\n Honduras: '宏都拉斯',\n 'Hong Kong': '中國香港',\n Hungary: '匈牙利',\n Iceland: '冰島',\n India: '印度',\n Indonesia: '印度尼西亞',\n Iran: '伊朗',\n Iraq: '伊拉克',\n Ireland: '愛爾蘭',\n Israel: '以色列',\n Italy: '義大利',\n Jamaica: '牙買加',\n Japan: '日本',\n Jersey: '澤西島',\n Jordan: '約旦',\n Kazakhstan: '哈薩克',\n Kenya: '肯亞',\n Kiribati: '吉里巴斯',\n Kosovo: '科索沃',\n Kuwait: '科威特',\n Kyrgyzstan: '吉爾吉斯斯坦',\n Laos: '寮人民民主共和國',\n Latvia: '拉脫維亞',\n Lebanon: '黎巴嫩',\n Lesotho: '賴索托',\n Liberia: '賴比瑞亞',\n Libya: '利比亞',\n Liechtenstein: '列支敦斯登',\n Lithuania: '立陶宛',\n Luxembourg: '盧森堡',\n Macau: '中國澳門',\n Madagascar: '馬達加斯加',\n Malawi: '馬拉維',\n Malaysia: '馬來西亞',\n Maldives: '馬爾地夫',\n Mali: '馬裡',\n Malta: '馬耳他',\n 'Man (Isle of)': '馬恩島',\n 'Marshall Islands': '馬紹爾羣島',\n Martinique: '馬提尼克島',\n Mauritania: '茅利塔尼亞',\n Mauritius: '模里西斯',\n Mayotte: '馬約特',\n Mexico: '墨西哥',\n Micronesia: '密克羅尼西亞',\n Moldova: '摩爾多瓦',\n Monaco: '摩納哥',\n Mongolia: '蒙古',\n Montenegro: '黑山',\n Montserrat: '蒙特塞拉特',\n Morocco: '摩洛哥',\n Mozambique: '莫三比克',\n Myanmar: '緬甸',\n Namibia: '奈米比亞',\n Nauru: '諾魯',\n Nepal: '尼泊爾',\n Netherlands: '荷蘭',\n 'New Caledonia': '新喀里多尼亞',\n 'New Zealand': '紐西蘭',\n Nicaragua: '尼加拉瓜',\n Niger: '尼日',\n Nigeria: '奈及利亞',\n Niue: '紐埃',\n 'Norfolk Island': '諾福克島',\n 'North Korea': '朝鮮',\n 'North Macedonia': '北馬其頓',\n 'Northern Mariana Islands': '北马里亞納羣島',\n Norway: '挪威',\n Oman: '阿曼',\n Pakistan: '巴基斯坦',\n Palau: '帛琉',\n 'Palestinian Territory Occupied': '巴勒斯坦',\n Panama: '巴拿馬',\n 'Papua new Guinea': '巴布亞紐幾內亞',\n Paraguay: '巴拉圭',\n Peru: '秘魯',\n Philippines: '菲律賓',\n 'Pitcairn Island': '皮特凱恩羣島',\n Poland: '波蘭',\n Portugal: '葡萄牙',\n 'Puerto Rico': '波多黎各',\n Qatar: '卡達',\n Reunion: '留尼汪島',\n Romania: '羅馬尼亞',\n Russia: '俄羅斯聯邦',\n Rwanda: '盧安達',\n 'Saint Helena': '聖赫勒拿',\n 'Saint Kitts And Nevis': '聖克里斯多福及尼維斯',\n 'Saint Lucia': '聖露西亞',\n 'Saint Pierre and Miquelon': '聖皮埃爾和密克隆',\n 'Saint Vincent And The Grenadines': '聖文森及格瑞那丁',\n 'Saint-Barthelemy': '聖巴泰勒米',\n 'Saint-Martin (French part)': '密克羅尼西亞',\n Samoa: '薩摩亞',\n 'San Marino': '聖馬力諾',\n 'Sao Tome and Principe': '聖多美和普林西比',\n 'Saudi Arabia': '沙烏地阿拉伯',\n Senegal: '塞內加爾',\n Serbia: '塞爾維亞',\n Seychelles: '塞舌爾',\n 'Sierra Leone': '獅子山',\n Singapore: '新加坡',\n 'Sint Maarten (Dutch part)': '聖馬丁島(荷蘭部分)',\n Slovakia: '斯洛伐克',\n Slovenia: '斯洛維尼亞',\n 'Solomon Islands': '索羅門羣島',\n Somalia: '索馬利亞',\n 'South Africa': '南非',\n 'South Georgia': '南喬治亞',\n 'South Korea': '韓國',\n 'South Sudan': '南蘇丹',\n Spain: '西班牙',\n 'Sri Lanka': '斯里蘭卡',\n Sudan: '蘇丹',\n Suriname: '蘇利南',\n 'Svalbard And Jan Mayen Islands': '斯瓦爾巴和揚馬延羣島',\n Swaziland: '史瓦濟蘭',\n Sweden: '瑞典',\n Switzerland: '瑞士',\n Syria: '敘利亞',\n Taiwan: '中國臺灣',\n Tajikistan: '塔吉克',\n Tanzania: '坦尚尼亞',\n Thailand: '泰國',\n 'The Bahamas': '巴哈馬',\n Togo: '多哥',\n Tokelau: '托克勞',\n Tonga: '湯加',\n 'Trinidad And Tobago': '千里達及托巴哥',\n Tunisia: '突尼西亞',\n Turkey: '土耳其',\n Turkmenistan: '土庫曼',\n 'Turks And Caicos Islands': '特克斯和凱科斯羣島',\n Tuvalu: '吐瓦魯',\n Uganda: '烏干達',\n Ukraine: '烏克蘭',\n 'United Arab Emirates': '阿拉伯聯合大公國',\n 'United Kingdom': '英國',\n 'United States': '美國',\n 'United States Minor Outlying Islands': '美國本土外小島嶼',\n Uruguay: '烏拉圭',\n Uzbekistan: '烏茲別克',\n Vanuatu: '萬那杜',\n 'Vatican City State (Holy See)': '梵蒂岡',\n Venezuela: '委內瑞拉',\n Vietnam: '越南',\n 'Virgin Islands (British)': '聖文森及格瑞那丁',\n 'Virgin Islands (US)': '維爾京羣島(美國)',\n 'Wallis And Futuna Islands': '瓦利斯羣島和富圖納羣島',\n 'Western Sahara': '西撒哈拉',\n Yemen: '葉門',\n Zambia: '尚比亞',\n Zimbabwe: '辛巴威',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Spanish names.\n */\nexport const SpanishCountryNames: Record<Country, string> = {\n Afghanistan: 'Afganistán',\n 'Aland Islands': 'Islas Åland',\n Albania: 'Albania',\n Algeria: 'Argelia',\n 'American Samoa': 'Samoa Americana',\n Andorra: 'Andorra',\n Angola: 'Angola',\n Anguilla: 'Anguila',\n Antarctica: 'Antártida',\n 'Antigua And Barbuda': 'Antigua y Barbuda',\n Argentina: 'Argentina',\n Armenia: 'Armenia',\n Aruba: 'Aruba',\n Australia: 'Australia',\n Austria: 'Austria',\n Azerbaijan: 'Azerbaiyán',\n Bahrain: 'Baréin',\n Bangladesh: 'Bangladés',\n Barbados: 'Barbados',\n Belarus: 'Bielorrusia',\n Belgium: 'Bélgica',\n Belize: 'Belice',\n Benin: 'Benín',\n Bermuda: 'Bermudas',\n Bhutan: 'Bután',\n Bolivia: 'Bolivia',\n 'Bonaire, Sint Eustatius and Saba': 'Bonaire, San Eustaquio y Saba',\n 'Bosnia and Herzegovina': 'Bosnia y Herzegovina',\n Botswana: 'Botsuana',\n 'Bouvet Island': 'Isla Bouvet',\n Brazil: 'Brasil',\n 'British Indian Ocean Territory': 'Territorio Británico del Océano Índico',\n Brunei: 'Brunéi',\n Bulgaria: 'Bulgaria',\n 'Burkina Faso': 'Burkina Faso',\n Burundi: 'Burundi',\n Cambodia: 'Camboya',\n Cameroon: 'Camerún',\n Canada: 'Canadá',\n 'Cape Verde': 'Cabo Verde',\n 'Cayman Islands': 'Islas Caimán',\n 'Central African Republic': 'República Centroafricana',\n Chad: 'Chad',\n Chile: 'Chile',\n China: 'China',\n 'Christmas Island': 'Isla de Navidad',\n 'Cocos (Keeling) Islands': 'Islas Cocos',\n Colombia: 'Colombia',\n Comoros: 'Comoras',\n Congo: 'Congo',\n 'Cook Islands': 'Islas Cook',\n 'Costa Rica': 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\": 'Costa de Marfil',\n Croatia: 'Croacia',\n Cuba: 'Cuba',\n Curaçao: 'Curazao',\n Cyprus: 'Chipre',\n 'Czech Republic': 'República Checa',\n 'Democratic Republic of the Congo': 'República Democrática del Congo',\n Denmark: 'Dinamarca',\n Djibouti: 'Yibuti',\n Dominica: 'Dominica',\n 'Dominican Republic': 'República Dominicana',\n 'East Timor': 'Timor Oriental',\n Ecuador: 'Ecuador',\n Egypt: 'Egipto',\n 'El Salvador': 'El Salvador',\n 'Equatorial Guinea': 'Guinea Ecuatorial',\n Eritrea: 'Eritrea',\n Estonia: 'Estonia',\n Ethiopia: 'Etiopía',\n 'Falkland Islands': 'Islas Malvinas',\n 'Faroe Islands': 'Islas Feroe',\n 'Fiji Islands': 'Fiyi',\n Finland: 'Finlandia',\n France: 'Francia',\n 'French Guiana': 'Guayana Francesa',\n 'French Polynesia': 'Polinesia Francesa',\n 'French Southern Territories': 'Tierras Australes y Antárticas Francesas',\n Gabon: 'Gabón',\n 'Gambia The': 'Gambia',\n Georgia: 'Georgia',\n Germany: 'Alemania',\n Ghana: 'Ghana',\n Gibraltar: 'Gibraltar',\n Greece: 'Grecia',\n Greenland: 'Groenlandia',\n Grenada: 'Granada',\n Guadeloupe: 'Guadalupe',\n Guam: 'Guam',\n Guatemala: 'Guatemala',\n 'Guernsey and Alderney': 'Guernsey y Alderney',\n Guinea: 'Guinea',\n 'Guinea-Bissau': 'Guinea-Bisáu',\n Guyana: 'Guyana',\n Haiti: 'Haití',\n 'Heard Island and McDonald Islands': 'Islas Heard y McDonald',\n Honduras: 'Honduras',\n 'Hong Kong': 'Hong Kong',\n Hungary: 'Hungría',\n Iceland: 'Islandia',\n India: 'India',\n Indonesia: 'Indonesia',\n Iran: 'Irán',\n Iraq: 'Irak',\n Ireland: 'Irlanda',\n Israel: 'Israel',\n Italy: 'Italia',\n Jamaica: 'Jamaica',\n Japan: 'Japón',\n Jersey: 'Jersey',\n Jordan: 'Jordania',\n Kazakhstan: 'Kazajistán',\n Kenya: 'Kenia',\n Kiribati: 'Kiribati',\n Kosovo: 'Kosovo',\n Kuwait: 'Kuwait',\n Kyrgyzstan: 'Kirguistán',\n Laos: 'Laos',\n Latvia: 'Letonia',\n Lebanon: 'Líbano',\n Lesotho: 'Lesoto',\n Liberia: 'Liberia',\n Libya: 'Libia',\n Liechtenstein: 'Liechtenstein',\n Lithuania: 'Lituania',\n Luxembourg: 'Luxemburgo',\n Macau: 'Macao',\n Madagascar: 'Madagascar',\n Malawi: 'Malaui',\n Malaysia: 'Malasia',\n Maldives: 'Maldivas',\n Mali: 'Malí',\n Malta: 'Malta',\n 'Man (Isle of)': 'Isla de Man',\n 'Marshall Islands': 'Islas Marshall',\n Martinique: 'Martinica',\n Mauritania: 'Mauritania',\n Mauritius: 'Mauricio',\n Mayotte: 'Mayotte',\n Mexico: 'México',\n Micronesia: 'Micronesia',\n Moldova: 'Moldavia',\n Monaco: 'Mónaco',\n Mongolia: 'Mongolia',\n Montenegro: 'Montenegro',\n Montserrat: 'Montserrat',\n Morocco: 'Marruecos',\n Mozambique: 'Mozambique',\n Myanmar: 'Myanmar',\n Namibia: 'Namibia',\n Nauru: 'Nauru',\n Nepal: 'Nepal',\n Netherlands: 'Países Bajos',\n 'New Caledonia': 'Nueva Caledonia',\n 'New Zealand': 'Nueva Zelanda',\n Nicaragua: 'Nicaragua',\n Niger: 'Níger',\n Nigeria: 'Nigeria',\n Niue: 'Niue',\n 'Norfolk Island': 'Isla Norfolk',\n 'North Korea': 'Corea del Norte',\n 'North Macedonia': 'Macedonia del Norte',\n 'Northern Mariana Islands': 'Islas Marianas del Norte',\n Norway: 'Noruega',\n Oman: 'Omán',\n Pakistan: 'Pakistán',\n Palau: 'Palaos',\n 'Palestinian Territory Occupied': 'Territorio Palestino Ocupado',\n Panama: 'Panamá',\n 'Papua new Guinea': 'Papúa Nueva Guinea',\n Paraguay: 'Paraguay',\n Peru: 'Perú',\n Philippines: 'Filipinas',\n 'Pitcairn Island': 'Islas Pitcairn',\n Poland: 'Polonia',\n Portugal: 'Portugal',\n 'Puerto Rico': 'Puerto Rico',\n Qatar: 'Catar',\n Reunion: 'Reunión',\n Romania: 'Rumania',\n Russia: 'Rusia',\n Rwanda: 'Ruanda',\n 'Saint Helena': 'Santa Elena',\n 'Saint Kitts And Nevis': 'San Cristóbal y Nieves',\n 'Saint Lucia': 'Santa Lucía',\n 'Saint Pierre and Miquelon': 'San Pedro y Miquelón',\n 'Saint Vincent And The Grenadines': 'San Vicente y las Granadinas',\n 'Saint-Barthelemy': 'San Bartolomé',\n 'Saint-Martin (French part)': 'San Martín (parte francesa)',\n Samoa: 'Samoa',\n 'San Marino': 'San Marino',\n 'Sao Tome and Principe': 'Santo Tomé y Príncipe',\n 'Saudi Arabia': 'Arabia Saudita',\n Senegal: 'Senegal',\n Serbia: 'Serbia',\n Seychelles: 'Seychelles',\n 'Sierra Leone': 'Sierra Leona',\n Singapore: 'Singapur',\n 'Sint Maarten (Dutch part)': 'San Martín (parte neerlandesa)',\n Slovakia: 'Eslovaquia',\n Slovenia: 'Eslovenia',\n 'Solomon Islands': 'Islas Salomón',\n Somalia: 'Somalia',\n 'South Africa': 'Sudáfrica',\n 'South Georgia': 'Georgia del Sur',\n 'South Korea': 'Corea del Sur',\n 'South Sudan': 'Sudán del Sur',\n Spain: 'España',\n 'Sri Lanka': 'Sri Lanka',\n Sudan: 'Sudán',\n Suriname: 'Surinam',\n 'Svalbard And Jan Mayen Islands': 'Svalbard y Jan Mayen',\n Swaziland: 'Suazilandia',\n Sweden: 'Suecia',\n Switzerland: 'Suiza',\n Syria: 'Siria',\n Taiwan: 'Taiwán',\n Tajikistan: 'Tayikistán',\n Tanzania: 'Tanzania',\n Thailand: 'Tailandia',\n 'The Bahamas': 'Bahamas',\n Togo: 'Togo',\n Tokelau: 'Tokelau',\n Tonga: 'Tonga',\n 'Trinidad And Tobago': 'Trinidad y Tobago',\n Tunisia: 'Túnez',\n Turkey: 'Turquía',\n Turkmenistan: 'Turkmenistán',\n 'Turks And Caicos Islands': 'Islas Turcas y Caicos',\n Tuvalu: 'Tuvalu',\n Uganda: 'Uganda',\n Ukraine: 'Ucrania',\n 'United Arab Emirates': 'Emiratos Árabes Unidos',\n 'United Kingdom': 'Reino Unido',\n 'United States': 'Estados Unidos',\n 'United States Minor Outlying Islands':\n 'Islas Ultramarinas Menores de Estados Unidos',\n Uruguay: 'Uruguay',\n Uzbekistan: 'Uzbekistán',\n Vanuatu: 'Vanuatu',\n 'Vatican City State (Holy See)': 'Ciudad del Vaticano',\n Venezuela: 'Venezuela',\n Vietnam: 'Vietnam',\n 'Virgin Islands (British)': 'Islas Vírgenes Británicas',\n 'Virgin Islands (US)': 'Islas Vírgenes de los Estados Unidos',\n 'Wallis And Futuna Islands': 'Wallis y Futuna',\n 'Western Sahara': 'Sahara Occidental',\n Yemen: 'Yemen',\n Zambia: 'Zambia',\n Zimbabwe: 'Zimbabue',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * French names.\n */\nexport const FrenchCountryNames: Record<Country, string> = {\n Afghanistan: 'Afghanistan',\n 'Aland Islands': 'Îles Åland',\n Albania: 'Albanie',\n Algeria: 'Algérie',\n 'American Samoa': 'Samoa américaines',\n Andorra: 'Andorre',\n Angola: 'Angola',\n Anguilla: 'Anguilla',\n Antarctica: 'Antarctique',\n 'Antigua And Barbuda': 'Antigua-et-Barbuda',\n Argentina: 'Argentine',\n Armenia: 'Arménie',\n Aruba: 'Aruba',\n Australia: 'Australie',\n Austria: 'Autriche',\n Azerbaijan: 'Azerbaïdjan',\n Bahrain: 'Bahreïn',\n Bangladesh: 'Bangladesh',\n Barbados: 'Barbade',\n Belarus: 'Biélorussie',\n Belgium: 'Belgique',\n Belize: 'Belize',\n Benin: 'Bénin',\n Bermuda: 'Bermudes',\n Bhutan: 'Bhoutan',\n Bolivia: 'Bolivie',\n 'Bonaire, Sint Eustatius and Saba': 'Bonaire, Saint-Eustache et Saba',\n 'Bosnia and Herzegovina': 'Bosnie-Herzégovine',\n Botswana: 'Botswana',\n 'Bouvet Island': 'Île Bouvet',\n Brazil: 'Brésil',\n 'British Indian Ocean Territory': \"Territoire britannique de l'océan Indien\",\n Brunei: 'Brunéi',\n Bulgaria: 'Bulgarie',\n 'Burkina Faso': 'Burkina Faso',\n Burundi: 'Burundi',\n Cambodia: 'Cambodge',\n Cameroon: 'Cameroun',\n Canada: 'Canada',\n 'Cape Verde': 'Cap-Vert',\n 'Cayman Islands': 'Îles Caïmans',\n 'Central African Republic': 'République centrafricaine',\n Chad: 'Tchad',\n Chile: 'Chili',\n China: 'Chine',\n 'Christmas Island': 'Île Christmas',\n 'Cocos (Keeling) Islands': 'Îles Cocos (Keeling)',\n Colombia: 'Colombie',\n Comoros: 'Comores',\n Congo: 'Congo',\n 'Cook Islands': 'Îles Cook',\n 'Costa Rica': 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\": \"Côte d'Ivoire\",\n Croatia: 'Croatie',\n Cuba: 'Cuba',\n Curaçao: 'Curaçao',\n Cyprus: 'Chypre',\n 'Czech Republic': 'République tchèque',\n 'Democratic Republic of the Congo': 'République démocratique du Congo',\n Denmark: 'Danemark',\n Djibouti: 'Djibouti',\n Dominica: 'Dominique',\n 'Dominican Republic': 'République dominicaine',\n 'East Timor': 'Timor oriental',\n Ecuador: 'Équateur',\n Egypt: 'Égypte',\n 'El Salvador': 'Salvador',\n 'Equatorial Guinea': 'Guinée équatoriale',\n Eritrea: 'Érythrée',\n Estonia: 'Estonie',\n Ethiopia: 'Éthiopie',\n 'Falkland Islands': 'Îles Malouines',\n 'Faroe Islands': 'Îles Féroé',\n 'Fiji Islands': 'Fidji',\n Finland: 'Finlande',\n France: 'France',\n 'French Guiana': 'Guyane française',\n 'French Polynesia': 'Polynésie française',\n 'French Southern Territories': 'Terres australes françaises',\n Gabon: 'Gabon',\n 'Gambia The': 'Gambie',\n Georgia: 'Géorgie',\n Germany: 'Allemagne',\n Ghana: 'Ghana',\n Gibraltar: 'Gibraltar',\n Greece: 'Grèce',\n Greenland: 'Groenland',\n Grenada: 'Grenade',\n Guadeloupe: 'Guadeloupe',\n Guam: 'Guam',\n Guatemala: 'Guatemala',\n 'Guernsey and Alderney': 'Guernesey et Alderney',\n Guinea: 'Guinée',\n 'Guinea-Bissau': 'Guinée-Bissau',\n Guyana: 'Guyana',\n Haiti: 'Haïti',\n 'Heard Island and McDonald Islands': 'Îles Heard-et-MacDonald',\n Honduras: 'Honduras',\n 'Hong Kong': 'Hong Kong',\n Hungary: 'Hongrie',\n Iceland: 'Islande',\n India: 'Inde',\n Indonesia: 'Indonésie',\n Iran: 'Iran',\n Iraq: 'Irak',\n Ireland: 'Irlande',\n Israel: 'Israël',\n Italy: 'Italie',\n Jamaica: 'Jamaïque',\n Japan: 'Japon',\n Jersey: 'Jersey',\n Jordan: 'Jordanie',\n Kazakhstan: 'Kazakhstan',\n Kenya: 'Kenya',\n Kiribati: 'Kiribati',\n Kosovo: 'Kosovo',\n Kuwait: 'Koweït',\n Kyrgyzstan: 'Kirghizistan',\n Laos: 'Laos',\n Latvia: 'Lettonie',\n Lebanon: 'Liban',\n Lesotho: 'Lesotho',\n Liberia: 'Libéria',\n Libya: 'Libye',\n Liechtenstein: 'Liechtenstein',\n Lithuania: 'Lituanie',\n Luxembourg: 'Luxembourg',\n Macau: 'Macao',\n Madagascar: 'Madagascar',\n 'Marshall Islands': 'Îles Marshall',\n Malawi: 'Malawi',\n Malaysia: 'Malaisie',\n Maldives: 'Maldives',\n Mali: 'Mali',\n Malta: 'Malte',\n 'Man (Isle of)': 'Île de Man',\n Martinique: 'Martinique',\n Mauritania: 'Mauritanie',\n Mauritius: 'Maurice',\n Mayotte: 'Mayotte',\n Mexico: 'Mexique',\n Micronesia: 'Micronésie',\n Moldova: 'Moldavie',\n Monaco: 'Monaco',\n Mongolia: 'Mongolie',\n Montenegro: 'Monténégro',\n Montserrat: 'Montserrat',\n Morocco: 'Maroc',\n Mozambique: 'Mozambique',\n Myanmar: 'Myanmar',\n Namibia: 'Namibie',\n Nauru: 'Nauru',\n Nepal: 'Népal',\n Netherlands: 'Pays-Bas',\n 'New Caledonia': 'Nouvelle-Calédonie',\n 'New Zealand': 'Nouvelle-Zélande',\n Nicaragua: 'Nicaragua',\n Niger: 'Niger',\n Nigeria: 'Nigéria',\n Niue: 'Niue',\n 'Norfolk Island': 'Île Norfolk',\n 'North Korea': 'Corée du Nord',\n 'North Macedonia': 'Macédoine du Nord',\n 'Northern Mariana Islands': 'Îles Mariannes du Nord',\n Norway: 'Norvège',\n Oman: 'Oman',\n Pakistan: 'Pakistan',\n Palau: 'Palaos',\n 'Palestinian Territory Occupied': 'Palestine',\n Panama: 'Panama',\n 'Papua new Guinea': 'Papouasie-Nouvelle-Guinée',\n Paraguay: 'Paraguay',\n Peru: 'Pérou',\n Philippines: 'Philippines',\n 'Pitcairn Island': 'Îles Pitcairn',\n Poland: 'Pologne',\n Portugal: 'Portugal',\n 'Puerto Rico': 'Porto Rico',\n Qatar: 'Qatar',\n Reunion: 'La Réunion',\n Romania: 'Roumanie',\n Russia: 'Russie',\n Rwanda: 'Rwanda',\n 'Saint-Barthelemy': 'Saint-Barthélemy',\n 'Saint Helena': 'Sainte-Hélène',\n 'Saint Kitts And Nevis': 'Saint-Christophe-et-Niévès',\n 'Saint Lucia': 'Sainte-Lucie',\n 'Saint-Martin (French part)': 'Saint-Martin',\n 'Saint Pierre and Miquelon': 'Saint-Pierre-et-Miquelon',\n 'Saint Vincent And The Grenadines': 'Saint-Vincent-et-les-Grenadines',\n Samoa: 'Samoa',\n 'San Marino': 'Saint-Marin',\n 'Sao Tome and Principe': 'Sao Tomé-et-Principe',\n 'Saudi Arabia': 'Arabie saoudite',\n Senegal: 'Sénégal',\n Serbia: 'Serbie',\n Seychelles: 'Seychelles',\n 'Sierra Leone': 'Sierra Leone',\n Singapore: 'Singapour',\n 'Sint Maarten (Dutch part)': 'Saint-Martin',\n Slovakia: 'Slovaquie',\n Slovenia: 'Slovénie',\n 'Solomon Islands': 'Îles Salomon',\n Somalia: 'Somalie',\n 'South Africa': 'Afrique du Sud',\n 'South Georgia': 'Géorgie du Sud-et-les Îles Sandwich du Sud',\n 'South Korea': 'Corée du Sud',\n 'South Sudan': 'Soudan du Sud',\n Spain: 'Espagne',\n 'Sri Lanka': 'Sri Lanka',\n Sudan: 'Soudan',\n Suriname: 'Suriname',\n 'Svalbard And Jan Mayen Islands': 'Svalbard et Jan Mayen',\n Swaziland: 'Swaziland',\n Sweden: 'Suède',\n Switzerland: 'Suisse',\n Syria: 'Syrie',\n Taiwan: 'Taïwan',\n Tajikistan: 'Tadjikistan',\n Tanzania: 'Tanzanie',\n Thailand: 'Thaïlande',\n 'The Bahamas': 'Bahamas',\n Togo: 'Togo',\n Tokelau: 'Tokelau',\n Tonga: 'Tonga',\n 'Trinidad And Tobago': 'Trinité-et-Tobago',\n Tunisia: 'Tunisie',\n Turkey: 'Turquie',\n Turkmenistan: 'Turkménistan',\n 'Turks And Caicos Islands': 'Îles Turques-et-Caïques',\n Tuvalu: 'Tuvalu',\n Uganda: 'Ouganda',\n Ukraine: 'Ukraine',\n 'United Arab Emirates': 'Émirats arabes unis',\n 'United Kingdom': 'Royaume-Uni',\n 'United States': 'États-Unis',\n 'United States Minor Outlying Islands':\n 'Îles mineures éloignées des États-Unis',\n Uruguay: 'Uruguay',\n Uzbekistan: 'Ouzbékistan',\n Vanuatu: 'Vanuatu',\n 'Vatican City State (Holy See)': 'Vatican',\n Venezuela: 'Venezuela',\n Vietnam: 'Viêt Nam',\n 'Virgin Islands (British)': 'Îles Vierges britanniques',\n 'Virgin Islands (US)': 'Îles Vierges américaines',\n 'Wallis And Futuna Islands': 'Wallis-et-Futuna',\n 'Western Sahara': 'Sahara occidental',\n Yemen: 'Yémen',\n Zambia: 'Zambie',\n Zimbabwe: 'Zimbabwe',\n}\n\nexport const NorwegianCountryNames: Record<Country, string> = {\n Afghanistan: 'Afghanistan',\n 'Aland Islands': 'Åland',\n Albania: 'Albania',\n Algeria: 'Algerie',\n 'American Samoa': 'Amerikansk Samoa',\n Andorra: 'Andorra',\n Angola: 'Angola',\n Anguilla: 'Anguilla',\n Antarctica: 'Antarktis',\n 'Antigua And Barbuda': 'Antigua og Barbuda',\n Argentina: 'Argentina',\n Armenia: 'Armenia',\n Aruba: 'Aruba',\n Australia: 'Australia',\n Austria: 'Østerrike',\n Azerbaijan: 'Aserbajdsjan',\n Bahrain: 'Bahrain',\n Bangladesh: 'Bangladesh',\n Barbados: 'Barbados',\n Belarus: 'Belarus',\n Belgium: 'Belgia',\n Belize: 'Belize',\n Benin: 'Benin',\n Bermuda: 'Bermuda',\n Bhutan: 'Bhutan',\n Bolivia: 'Bolivia',\n 'Bonaire, Sint Eustatius and Saba': 'Bonaire, Sint Eustatius og Saba',\n 'Bosnia and Herzegovina': 'Bosnia-Hercegovina',\n Botswana: 'Botswana',\n 'Bouvet Island': 'Bouvetøya',\n Brazil: 'Brasil',\n 'British Indian Ocean Territory': 'Det britiske territoriet i Indiahavet',\n Brunei: 'Brunei',\n Bulgaria: 'Bulgaria',\n 'Burkina Faso': 'Burkina Faso',\n Burundi: 'Burundi',\n Cambodia: 'Kambodsja',\n Cameroon: 'Kamerun',\n Canada: 'Canada',\n 'Cape Verde': 'Kapp Verde',\n 'Cayman Islands': 'Caymanøyene',\n 'Central African Republic': 'Den sentralafrikanske republikk',\n Chad: 'Tsjad',\n Chile: 'Chile',\n China: 'Kina',\n 'Christmas Island': 'Christmasøya',\n 'Cocos (Keeling) Islands': 'Kokosøyene (Keelingøyene)',\n Colombia: 'Colombia',\n Comoros: 'Komorene',\n Congo: 'Kongo',\n 'Cook Islands': 'Cookøyene',\n 'Costa Rica': 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\": 'Elfenbenskysten',\n Croatia: 'Kroatia',\n Cuba: 'Cuba',\n Curaçao: 'Curaçao',\n Cyprus: 'Kypros',\n 'Czech Republic': 'Tsjekkia',\n 'Democratic Republic of the Congo': 'Den demokratiske republikken Kongo',\n Denmark: 'Danmark',\n Djibouti: 'Djibouti',\n Dominica: 'Dominica',\n 'Dominican Republic': 'Den dominikanske republikk',\n 'East Timor': 'Øst-Timor',\n Ecuador: 'Ecuador',\n Egypt: 'Egypt',\n 'El Salvador': 'El Salvador',\n 'Equatorial Guinea': 'Ekvatorial-Guinea',\n Eritrea: 'Eritrea',\n Estonia: 'Estland',\n Ethiopia: 'Etiopia',\n 'Falkland Islands': 'Falklandsøyene',\n 'Faroe Islands': 'Færøyene',\n 'Fiji Islands': 'Fijiøyene',\n Finland: 'Finland',\n France: 'Frankrike',\n 'French Guiana': 'Fransk Guyana',\n 'French Polynesia': 'Fransk Polynesia',\n 'French Southern Territories': 'Franske sørlige territorier',\n Gabon: 'Gabon',\n 'Gambia The': 'Gambia',\n Georgia: 'Georgia',\n Germany: 'Tyskland',\n Ghana: 'Ghana',\n Gibraltar: 'Gibraltar',\n Greece: 'Hellas',\n Greenland: 'Grønland',\n Grenada: 'Grenada',\n Guadeloupe: 'Guadeloupe',\n Guam: 'Guam',\n Guatemala: 'Guatemala',\n 'Guernsey and Alderney': 'Guernsey og Alderney',\n Guinea: 'Guinea',\n 'Guinea-Bissau': 'Guinea-Bissau',\n Guyana: 'Guyana',\n Haiti: 'Haiti',\n 'Heard Island and McDonald Islands': 'Heard- og McDonaldøyene',\n Honduras: 'Honduras',\n 'Hong Kong': 'Hong Kong',\n Hungary: 'Ungarn',\n Iceland: 'Island',\n India: 'India',\n Indonesia: 'Indonesia',\n Iran: 'Iran',\n Iraq: 'Irak',\n Ireland: 'Irland',\n Israel: 'Israel',\n Italy: 'Italia',\n Jamaica: 'Jamaica',\n Japan: 'Japan',\n Jersey: 'Jersey',\n Jordan: 'Jordan',\n Kazakhstan: 'Kasakhstan',\n Kenya: 'Kenya',\n Kiribati: 'Kiribati',\n Kosovo: 'Kosovo',\n Kuwait: 'Kuwait',\n Kyrgyzstan: 'Kirgisistan',\n Laos: 'Laos',\n Latvia: 'Latvia',\n Lebanon: 'Libanon',\n Lesotho: 'Lesotho',\n Liberia: 'Liberia',\n Libya: 'Libya',\n Liechtenstein: 'Liechtenstein',\n Lithuania: 'Litauen',\n Luxembourg: 'Luxembourg',\n Macau: 'Macau',\n Madagascar: 'Madagaskar',\n Malawi: 'Malawi',\n Malaysia: 'Malaysia',\n Maldives: 'Maldivene',\n Mali: 'Mali',\n Malta: 'Malta',\n 'Man (Isle of)': 'Man (Isle of)',\n 'Marshall Islands': 'Marshalløyene',\n Martinique: 'Martinique',\n Mauritania: 'Mauritania',\n Mauritius: 'Mauritius',\n Mayotte: 'Mayotte',\n Mexico: 'Mexico',\n Micronesia: 'Mikronesia',\n Moldova: 'Moldova',\n Monaco: 'Monaco',\n Mongolia: 'Mongolia',\n Montenegro: 'Montenegro',\n Montserrat: 'Montserrat',\n Morocco: 'Marokko',\n Mozambique: 'Mosambik',\n Myanmar: 'Myanmar',\n Namibia: 'Namibia',\n Nauru: 'Nauru',\n Nepal: 'Nepal',\n Netherlands: 'Nederland',\n 'New Caledonia': 'Ny-Caledonia',\n 'New Zealand': 'New Zealand',\n Nicaragua: 'Nicaragua',\n Niger: 'Niger',\n Nigeria: 'Nigeria',\n Niue: 'Niue',\n 'Norfolk Island': 'Norfolkøya',\n 'North Korea': 'Nord-Korea',\n 'North Macedonia': 'Nord-Makedonia',\n 'Northern Mariana Islands': 'Nord-Marianene',\n Norway: 'Norge',\n Oman: 'Oman',\n Pakistan: 'Pakistan',\n Palau: 'Palau',\n 'Palestinian Territory Occupied': 'Palestinsk okkupert område',\n Panama: 'Panama',\n 'Papua new Guinea': 'Papua Ny-Guinea',\n Paraguay: 'Paraguay',\n Peru: 'Peru',\n Philippines: 'Filippinene',\n 'Pitcairn Island': 'Pitcairnøyene',\n Poland: 'Polen',\n Portugal: 'Portugal',\n 'Puerto Rico': 'Puerto Rico',\n Qatar: 'Qatar',\n Reunion: 'Réunion',\n Romania: 'Romania',\n Russia: 'Russland',\n Rwanda: 'Rwanda',\n 'Saint Helena': 'Sankt Helena',\n 'Saint Kitts And Nevis': 'Saint Kitts og Nevis',\n 'Saint Lucia': 'Saint Lucia',\n 'Saint Pierre and Miquelon': 'Saint-Pierre og Miquelon',\n 'Saint Vincent And The Grenadines': 'Saint Vincent og Grenadinene',\n 'Saint-Barthelemy': 'Saint-Barthélemy',\n 'Saint-Martin (French part)': 'Saint-Martin (fransk del)',\n Samoa: 'Samoa',\n 'San Marino': 'San Marino',\n 'Sao Tome and Principe': 'São Tomé og Príncipe',\n 'Saudi Arabia': 'Saudi-Arabia',\n Senegal: 'Senegal',\n Serbia: 'Serbia',\n Seychelles: 'Seychellene',\n 'Sierra Leone': 'Sierra Leone',\n Singapore: 'Singapore',\n 'Sint Maarten (Dutch part)': 'Sint Maarten (nederlandsk del)',\n Slovakia: 'Slovakia',\n Slovenia: 'Slovenia',\n 'Solomon Islands': 'Salomonøyene',\n Somalia: 'Somalia',\n 'South Africa': 'Sør-Afrika',\n 'South Georgia': 'Sør-Georgia',\n 'South Korea': 'Sør-Korea',\n 'South Sudan': 'Sør-Sudan',\n Spain: 'Spania',\n 'Sri Lanka': 'Sri Lanka',\n Sudan: 'Sudan',\n Suriname: 'Surinam',\n 'Svalbard And Jan Mayen Islands': 'Svalbard og Jan Mayen',\n Swaziland: 'Swaziland',\n Sweden: 'Sverige',\n Switzerland: 'Sveits',\n Syria: 'Syria',\n Taiwan: 'Taiwan',\n Tajikistan: 'Tadsjikistan',\n Tanzania: 'Tanzania',\n Thailand: 'Thailand',\n 'The Bahamas': 'Bahamas',\n Togo: 'Togo',\n Tokelau: 'Tokelau',\n Tonga: 'Tonga',\n 'Trinidad And Tobago': 'Trinidad og Tobago',\n Tunisia: 'Tunisia',\n Turkey: 'Tyrkia',\n Turkmenistan: 'Turkmenistan',\n 'Turks And Caicos Islands': 'Turks- og Caicosøyene',\n Tuvalu: 'Tuvalu',\n Uganda: 'Uganda',\n Ukraine: 'Ukraina',\n 'United Arab Emirates': 'De forente arabiske emirater',\n 'United Kingdom': 'Storbritannia',\n 'United States': 'USA',\n 'United States Minor Outlying Islands': 'USAs ytre småøyer',\n Uruguay: 'Uruguay',\n Uzbekistan: 'Usbekistan',\n Vanuatu: 'Vanuatu',\n 'Vatican City State (Holy See)': 'Vatikanstaten (Den hellige stol)',\n Venezuela: 'Venezuela',\n Vietnam: 'Vietnam',\n 'Virgin Islands (British)': 'Jomfruøyene (britiske)',\n 'Virgin Islands (US)': 'Jomfruøyene (USA)',\n 'Wallis And Futuna Islands': 'Wallis- og Futunaøyene',\n 'Western Sahara': 'Vest-Sahara',\n Yemen: 'Jemen',\n Zambia: 'Zambia',\n Zimbabwe: 'Zimbabwe',\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type {\n LatexLayout,\n LatexTemplate,\n LocaleLanguage,\n MarkdownLayout,\n OrderableSectionID,\n Resume,\n ResumeContent,\n ResumeLayoutEngine,\n ResumeLayouts,\n ResumeLocale,\n ResumeItem as ResumeSectionItem,\n} from './types'\n\n/**\n * Defines all possible degrees.\n */\nexport const DEGREE_OPTIONS = [\n 'Middle School',\n 'High School',\n 'Diploma',\n 'Associate',\n 'Bachelor',\n 'Master',\n 'Doctor',\n] as const\n\n/**\n * Defines language fluency levels.\n *\n * Based on the Interagency Language Roundtable (ILR) scale.\n */\nexport const FLUENCY_OPTIONS = [\n 'Elementary Proficiency',\n 'Limited Working Proficiency',\n 'Minimum Professional Proficiency',\n 'Full Professional Proficiency',\n 'Native or Bilingual Proficiency',\n] as const\n\n/** The options for the font size. */\nexport const FONT_SIZE_OPTIONS = ['10pt', '11pt', '12pt'] as const\n\n/** The options for the font spec numbers style. */\nexport const FONTSPEC_NUMBERS_OPTIONS = ['Lining', 'OldStyle', 'Auto'] as const\n\n/**\n * Defines common world languages.\n *\n * This list contains the most used languages in the world.\n *\n * TODO: allow users to add their own languages\n */\nexport const LANGUAGE_OPTIONS = [\n 'Afrikaans',\n 'Albanian',\n 'Amharic',\n 'Arabic',\n 'Azerbaijani',\n 'Belarusian',\n 'Bengali',\n 'Bhojpuri',\n 'Bulgarian',\n 'Burmese',\n 'Cantonese',\n 'Catalan',\n 'Chinese',\n 'Croatian',\n 'Czech',\n 'Danish',\n 'Dutch',\n 'English',\n 'Estonian',\n 'Farsi',\n 'Filipino',\n 'Finnish',\n 'French',\n 'German',\n 'Greek',\n 'Gujarati',\n 'Hausa',\n 'Hebrew',\n 'Hindi',\n 'Hungarian',\n 'Icelandic',\n 'Igbo',\n 'Indonesian',\n 'Irish',\n 'Italian',\n 'Japanese',\n 'Javanese',\n 'Kazakh',\n 'Khmer',\n 'Korean',\n 'Lahnda',\n 'Latvian',\n 'Lithuanian',\n 'Malay',\n 'Mandarin',\n 'Marathi',\n 'Nepali',\n 'Norwegian',\n 'Oromo',\n 'Pashto',\n 'Polish',\n 'Portuguese',\n 'Romanian',\n 'Russian',\n 'Serbian',\n 'Shona',\n 'Sinhala',\n 'Slovak',\n 'Slovene',\n 'Somali',\n 'Spanish',\n 'Sundanese',\n 'Swahili',\n 'Swedish',\n 'Tagalog',\n 'Tamil',\n 'Telugu',\n 'Thai',\n 'Turkish',\n 'Ukrainian',\n 'Urdu',\n 'Uzbek',\n 'Vietnamese',\n 'Yoruba',\n 'Zulu',\n] as const\n\n/**\n * Defines skill proficiency levels.\n *\n * Based on common industry standards for skill assessment.\n */\nexport const LEVEL_OPTIONS = [\n 'Novice',\n 'Beginner',\n 'Intermediate',\n 'Advanced',\n 'Expert',\n 'Master',\n] as const\n\n/**\n * Defines supported languages for UI display and template translation.\n *\n * @see {@link https://en.wikipedia.org/wiki/IETF_language_tag}\n */\nexport const LOCALE_LANGUAGE_OPTIONS = [\n 'en',\n 'zh-hans',\n 'zh-hant-hk',\n 'zh-hant-tw',\n 'es',\n 'fr',\n 'no',\n] as const\n\n/**\n * Defines network options.\n */\nexport const NETWORK_OPTIONS = [\n 'Behance',\n 'Dribbble',\n 'Facebook',\n 'GitHub',\n 'Gitlab',\n 'Instagram',\n 'Line',\n 'LinkedIn',\n 'Medium',\n 'Pinterest',\n 'Reddit',\n 'Snapchat',\n 'Stack Overflow',\n 'Telegram',\n 'TikTok',\n 'Twitch',\n 'Twitter',\n 'Vimeo',\n 'Weibo',\n 'WeChat',\n 'WhatsApp',\n 'YouTube',\n 'Zhihu',\n] as const\n\n/**\n * All valid top-level sections in the resume.\n * */\nexport const SECTION_IDS = [\n 'basics',\n 'location',\n 'profiles',\n 'education',\n 'work',\n 'volunteer',\n 'awards',\n 'certificates',\n 'publications',\n 'skills',\n 'languages',\n 'interests',\n 'references',\n 'projects',\n] as const\n\n/**\n * All valid top-level sections in the resume that can be re-ordered.\n *\n * `location` and `profiles` are excluded as these are not real sections, i.e,\n * they are always rendered as part of the \"core\" information at the start of a\n * resume, not rendered as normal sections\n */\nexport const ORDERABLE_SECTION_IDS = [\n 'basics',\n 'education',\n 'work',\n 'volunteer',\n 'awards',\n 'certificates',\n 'publications',\n 'skills',\n 'languages',\n 'interests',\n 'references',\n 'projects',\n] as const\n\n/**\n * Default order for sections in the resume output.\n *\n * Sections not specified in custom order will follow this order.\n */\nexport const DEFAULT_SECTIONS_ORDER: OrderableSectionID[] = [\n 'basics',\n 'education',\n 'work',\n 'languages',\n 'skills',\n 'awards',\n 'certificates',\n 'publications',\n 'references',\n 'projects',\n 'interests',\n 'volunteer',\n]\n\n/** Defines identifiers for the available resume templates. */\nexport const LATEX_TEMPLATE_OPTIONS = [\n 'moderncv-banking',\n 'moderncv-casual',\n 'moderncv-classic',\n] as const\n\n/**\n * Get the detail of the given LaTeX template.\n *\n * @param template - The template to get the detail for.\n * @returns The detail of the template.\n */\nexport function getLatexTemplateDetail(template: LatexTemplate) {\n const templateDetails: Record<\n LatexTemplate,\n { engine: ResumeLayoutEngine; name: string; description: string }\n > = {\n 'moderncv-banking': {\n engine: 'latex',\n name: 'ModernCV Banking',\n description: 'ModernCV template with banking style',\n },\n 'moderncv-casual': {\n engine: 'latex',\n name: 'ModernCV Casual',\n description: 'ModernCV template with casual style',\n },\n 'moderncv-classic': {\n engine: 'latex',\n name: 'ModernCV Classic',\n description: 'ModernCV template with classic style',\n },\n }\n\n if (template in templateDetails) {\n return {\n id: template,\n ...templateDetails[template],\n }\n }\n\n throw new Error(`Invalid template option: ${template}`)\n}\n\n/** Provides default, empty item structures for each resume section type. */\nexport const RESUME_SECTION_ITEMS: ResumeSectionItem = {\n award: {\n awarder: '',\n date: '',\n summary: '',\n title: '',\n },\n basics: {\n email: '',\n headline: '',\n name: '',\n phone: '',\n summary: '',\n url: '',\n },\n certificate: {\n date: '',\n issuer: '',\n name: '',\n url: '',\n },\n education: {\n area: '',\n courses: [],\n endDate: '',\n summary: '',\n institution: '',\n score: '',\n startDate: '',\n degree: null,\n url: '',\n },\n interest: {\n keywords: [],\n name: '',\n },\n language: {\n fluency: null,\n language: null,\n keywords: [],\n },\n location: {\n address: '',\n city: '',\n country: null,\n postalCode: '',\n region: '',\n },\n profile: {\n network: null,\n url: '',\n username: '',\n },\n project: {\n description: '',\n endDate: '',\n summary: '',\n keywords: [],\n name: '',\n startDate: '',\n url: '',\n },\n publication: {\n name: '',\n publisher: '',\n releaseDate: '',\n summary: '',\n url: '',\n },\n reference: {\n email: '',\n name: '',\n phone: '',\n relationship: '',\n summary: '',\n },\n skill: {\n keywords: [],\n level: undefined,\n name: '',\n },\n volunteer: {\n endDate: '',\n organization: '',\n position: '',\n startDate: '',\n summary: '',\n url: '',\n },\n work: {\n name: '',\n endDate: '',\n position: '',\n startDate: '',\n keywords: [],\n summary: '',\n url: '',\n },\n}\n\n/**\n * Default content structure for a new resume, containing empty or minimal\n * sections.\n */\nexport const DEFAULT_RESUME_CONTENT: ResumeContent = {\n awards: [],\n basics: RESUME_SECTION_ITEMS.basics,\n certificates: [],\n education: [RESUME_SECTION_ITEMS.education],\n interests: [],\n languages: [RESUME_SECTION_ITEMS.language],\n location: RESUME_SECTION_ITEMS.location,\n profiles: [RESUME_SECTION_ITEMS.profile],\n projects: [],\n publications: [],\n references: [],\n skills: [RESUME_SECTION_ITEMS.skill],\n volunteer: [],\n work: [RESUME_SECTION_ITEMS.work],\n}\n\n/**\n * Resume content structure containing one example item for each section.\n *\n * Useful for testing transformations and rendering.\n */\nexport const FILLED_RESUME_CONTENT: ResumeContent = {\n awards: [RESUME_SECTION_ITEMS.award],\n basics: RESUME_SECTION_ITEMS.basics,\n certificates: [RESUME_SECTION_ITEMS.certificate],\n education: [RESUME_SECTION_ITEMS.education],\n interests: [RESUME_SECTION_ITEMS.interest],\n languages: [RESUME_SECTION_ITEMS.language],\n location: RESUME_SECTION_ITEMS.location,\n profiles: [RESUME_SECTION_ITEMS.profile],\n projects: [RESUME_SECTION_ITEMS.project],\n publications: [RESUME_SECTION_ITEMS.publication],\n references: [RESUME_SECTION_ITEMS.reference],\n skills: [RESUME_SECTION_ITEMS.skill],\n volunteer: [RESUME_SECTION_ITEMS.volunteer],\n work: [RESUME_SECTION_ITEMS.work],\n}\n\n/** Default top/bottom margin value. */\nconst DEFAULT_TOP_BOTTOM_MARGIN = '2.5cm'\n/** Default left/right margin value. */\nconst DEFAULT_LEFT_RIGHT_MARGIN = '1.5cm'\n\n/** Available margin size options for resume layout. */\nexport const MARGIN_OPTIONS = [\n DEFAULT_LEFT_RIGHT_MARGIN,\n '1.75cm',\n '2.0cm',\n '2.25cm',\n DEFAULT_TOP_BOTTOM_MARGIN,\n]\n\n/**\n * Get the language code and name of the given locale language.\n *\n * @param localeLanguage The locale language to get the name for.\n * @returns The language code and name of the given locale language.\n */\nexport function getLocaleLanguageDetail(localeLanguage: LocaleLanguage) {\n const localeLanguageDetails: Record<LocaleLanguage, string> = {\n en: 'English',\n 'zh-hans': 'Simplified Chinese',\n 'zh-hant-hk': 'Traditional Chinese (Hong Kong)',\n 'zh-hant-tw': 'Traditional Chinese (Taiwan)',\n es: 'Spanish',\n fr: 'French',\n no: 'Norwegian',\n }\n\n if (localeLanguage in localeLanguageDetails) {\n return {\n localeLanguage,\n name: localeLanguageDetails[localeLanguage],\n }\n }\n\n throw new Error(`Invalid locale language: ${localeLanguage}`)\n}\n\n/** Default Markdown layout configuration. */\nexport const DEFAULT_MARKDOWN_LAYOUT: MarkdownLayout = {\n engine: 'markdown',\n}\n\n/** Default LaTeX layout configuration for the new layouts array. */\nexport const DEFAULT_LATEX_LAYOUT: LatexLayout = {\n engine: 'latex',\n template: 'moderncv-banking',\n advanced: {\n fontspec: {\n numbers: 'Auto',\n },\n },\n page: {\n margins: {\n top: DEFAULT_TOP_BOTTOM_MARGIN,\n bottom: DEFAULT_TOP_BOTTOM_MARGIN,\n left: DEFAULT_LEFT_RIGHT_MARGIN,\n right: DEFAULT_LEFT_RIGHT_MARGIN,\n },\n showPageNumbers: false,\n },\n typography: {\n fontSize: FONT_SIZE_OPTIONS[0],\n },\n}\n\n/** Default layouts configuration. */\nexport const DEFAULT_RESUME_LAYOUTS: ResumeLayouts = [\n DEFAULT_LATEX_LAYOUT,\n DEFAULT_MARKDOWN_LAYOUT,\n]\n\n/** Default locale configuration. */\nexport const DEFAULT_RESUME_LOCALE: ResumeLocale = {\n language: 'en',\n}\n\n/** Default value when user creates a new `Resume` object. */\nexport const DEFAULT_RESUME: Resume = {\n content: DEFAULT_RESUME_CONTENT,\n locale: DEFAULT_RESUME_LOCALE,\n layouts: DEFAULT_RESUME_LAYOUTS,\n}\n\n/**\n * Default value when user wants to use a filled resume.\n *\n * This is useful for testing transformations and rendering.\n */\nexport const FILLED_RESUME: Resume = {\n content: FILLED_RESUME_CONTENT,\n locale: DEFAULT_RESUME_LOCALE,\n layouts: DEFAULT_RESUME_LAYOUTS,\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { get } from 'lodash-es'\n\nimport type {\n Country,\n Degree,\n Fluency,\n Language,\n Level,\n LocaleLanguage,\n SectionID,\n} from '@/models'\n\nimport {\n EnglishCountryNames,\n FrenchCountryNames,\n NorwegianCountryNames,\n SimplifiedChineseCountryNames,\n SpanishCountryNames,\n TraditionalChineseCountryHKNames,\n TraditionalChineseCountryTWNames,\n} from '@/models'\n\n/** Defines the structure for translated terms for a single language. */\ntype OptionTranslation = {\n /** Translations for country names. */\n countries: Record<Country, string>\n /** Translations for degree types. */\n degrees: Record<Degree, string>\n /** Translations for language fluency levels. */\n fluency: Record<Fluency, string>\n /** Translations for language names. */\n languages: Record<Language, string>\n /** Translations for resume section titles. */\n sections: Record<SectionID, string>\n /** Translations for skill proficiency levels. */\n skills: Record<Level, string>\n}\n\ntype OptionCategory = keyof OptionTranslation\n\n/** The structure containing translations for all supported languages. */\ntype OptionsTranslations = Record<LocaleLanguage, OptionTranslation>\n\n/**\n * Retrieves the translated terms for a specific locale language.\n *\n * Includes translations for degrees, languages, fluencies, countries, section\n * titles, levels, and other specific terms.\n *\n * @param language - The desired locale language. If undefined, defaults to\n * English.\n * @returns An object containing the translated terms for the specified\n * language.\n */\nexport function getOptionTranslation<K extends OptionCategory>(\n language: LocaleLanguage,\n category: K,\n option: keyof OptionTranslation[K]\n): string {\n const optionsTranslations: OptionsTranslations = {\n en: {\n countries: EnglishCountryNames,\n degrees: {\n 'Middle School': 'Middle School',\n 'High School': 'High School',\n Diploma: 'Diploma',\n Associate: 'Associate',\n Bachelor: 'Bachelor',\n Master: 'Master',\n Doctor: 'Doctor',\n },\n fluency: {\n 'Elementary Proficiency': 'Elementary Proficiency',\n 'Limited Working Proficiency': 'Limited Working Proficiency',\n 'Minimum Professional Proficiency': 'Minimum Professional Proficiency',\n 'Full Professional Proficiency': 'Full Professional Proficiency',\n 'Native or Bilingual Proficiency': 'Native or Bilingual Proficiency',\n },\n languages: {\n Afrikaans: 'Afrikaans',\n Albanian: 'Albanian',\n Amharic: 'Amharic',\n Arabic: 'Arabic',\n Azerbaijani: 'Azerbaijani',\n Belarusian: 'Belarusian',\n Bengali: 'Bengali',\n Bhojpuri: 'Bhojpuri',\n Bulgarian: 'Bulgarian',\n Burmese: 'Burmese',\n Cantonese: 'Cantonese',\n Catalan: 'Catalan',\n Chinese: 'Chinese',\n Croatian: 'Croatian',\n Czech: 'Czech',\n Danish: 'Danish',\n Dutch: 'Dutch',\n English: 'English',\n Estonian: 'Estonian',\n Farsi: 'Farsi',\n Filipino: 'Filipino',\n Finnish: 'Finnish',\n French: 'French',\n German: 'German',\n Greek: 'Greek',\n Gujarati: 'Gujarati',\n Hausa: 'Hausa',\n Hebrew: 'Hebrew',\n Hindi: 'Hindi',\n Hungarian: 'Hungarian',\n Icelandic: 'Icelandic',\n Igbo: 'Igbo',\n Indonesian: 'Indonesian',\n Irish: 'Irish',\n Italian: 'Italian',\n Japanese: 'Japanese',\n Javanese: 'Javanese',\n Kazakh: 'Kazakh',\n Khmer: 'Khmer',\n Korean: 'Korean',\n Lahnda: 'Lahnda',\n Latvian: 'Latvian',\n Lithuanian: 'Lithuanian',\n Malay: 'Malay',\n Mandarin: 'Mandarin',\n Marathi: 'Marathi',\n Nepali: 'Nepali',\n Norwegian: 'Norwegian',\n Oromo: 'Oromo',\n Pashto: 'Pashto',\n Polish: 'Polish',\n Portuguese: 'Portuguese',\n Romanian: 'Romanian',\n Russian: 'Russian',\n Serbian: 'Serbian',\n Shona: 'Shona',\n Sinhala: 'Sinhala',\n Slovak: 'Slovak',\n Slovene: 'Slovene',\n Somali: 'Somali',\n Spanish: 'Spanish',\n Sundanese: 'Sundanese',\n Swahili: 'Swahili',\n Swedish: 'Swedish',\n Tagalog: 'Tagalog',\n Tamil: 'Tamil',\n Telugu: 'Telugu',\n Thai: 'Thai',\n Turkish: 'Turkish',\n Ukrainian: 'Ukrainian',\n Urdu: 'Urdu',\n Uzbek: 'Uzbek',\n Vietnamese: 'Vietnamese',\n Yoruba: 'Yoruba',\n Zulu: 'Zulu',\n },\n sections: {\n awards: 'Awards',\n basics: 'Basics',\n certificates: 'Certificates',\n education: 'Education',\n interests: 'Interests',\n languages: 'Languages',\n location: 'Location',\n profiles: 'Profiles',\n projects: 'Projects',\n publications: 'Publications',\n references: 'References',\n skills: 'Skills',\n volunteer: 'Volunteer',\n work: 'Work',\n },\n skills: {\n Novice: 'Novice',\n Beginner: 'Beginner',\n Intermediate: 'Intermediate',\n Advanced: 'Advanced',\n Expert: 'Expert',\n Master: 'Master',\n },\n },\n 'zh-hans': {\n countries: SimplifiedChineseCountryNames,\n degrees: {\n 'Middle School': '初中',\n 'High School': '高中',\n Diploma: '专科',\n Associate: '副学士',\n Bachelor: '学士',\n Master: '硕士',\n Doctor: '博士',\n },\n fluency: {\n 'Elementary Proficiency': '初级水平',\n 'Limited Working Proficiency': '有限工作水平',\n 'Minimum Professional Proficiency': '最低专业水平',\n 'Full Professional Proficiency': '完全专业水平',\n 'Native or Bilingual Proficiency': '母语或双语水平',\n },\n languages: {\n Afrikaans: '南非语',\n Albanian: '阿尔巴尼亚语',\n Amharic: '阿姆哈拉语',\n Arabic: '阿拉伯语',\n Azerbaijani: '阿塞拜疆语',\n Belarusian: '白俄罗斯语',\n Bengali: '孟加拉语',\n Bhojpuri: '博杰普尔语',\n Bulgarian: '保加利亚语',\n Burmese: '缅甸语',\n Cantonese: '粤语',\n Catalan: '加泰罗尼亚语',\n Chinese: '中文',\n Croatian: '克罗地亚语',\n Czech: '捷克语',\n Danish: '丹麦语',\n Dutch: '荷兰语',\n English: '英语',\n Estonian: '爱沙尼亚语',\n Farsi: '波斯语',\n Filipino: '菲律宾语',\n Finnish: '芬兰语',\n French: '法语',\n German: '德语',\n Greek: '希腊语',\n Gujarati: '古吉拉特语',\n Hausa: '豪萨语',\n Hebrew: '希伯来语',\n Hindi: '印地语',\n Hungarian: '匈牙利语',\n Icelandic: '冰岛语',\n Igbo: '伊博语',\n Indonesian: '印度尼西亚语',\n Irish: '爱尔兰语',\n Italian: '意大利语',\n Japanese: '日语',\n Javanese: '爪哇语',\n Kazakh: '哈萨克语',\n Khmer: '高棉语',\n Korean: '韩语',\n Lahnda: '拉亨达语',\n Latvian: '拉脱维亚语',\n Lithuanian: '立陶宛语',\n Malay: '马来语',\n Mandarin: '普通话',\n Marathi: '马拉地语',\n Nepali: '尼泊尔语',\n Norwegian: '挪威语',\n Oromo: '奥罗莫语',\n Pashto: '普什图语',\n Polish: '波兰语',\n Portuguese: '葡萄牙语',\n Romanian: '罗马尼亚语',\n Russian: '俄语',\n Serbian: '塞尔维亚语',\n Shona: '绍纳语',\n Sinhala: '僧伽罗语',\n Slovak: '斯洛伐克语',\n Slovene: '斯洛文尼亚语',\n Somali: '索马里语',\n Spanish: '西班牙语',\n Sundanese: '巽他语',\n Swahili: '斯瓦希里语',\n Swedish: '瑞典语',\n Tagalog: '他加禄语',\n Tamil: '泰米尔语',\n Telugu: '泰卢固语',\n Thai: '泰语',\n Turkish: '土耳其语',\n Ukrainian: '乌克兰语',\n Urdu: '乌尔都语',\n Uzbek: '乌兹别克语',\n Vietnamese: '越南语',\n Yoruba: '约鲁巴语',\n Zulu: '祖鲁语',\n },\n sections: {\n awards: '荣誉',\n basics: '简介',\n certificates: '证书',\n education: '教育背景',\n interests: '兴趣爱好',\n languages: '语言',\n location: '位置',\n profiles: '个人主页',\n projects: '项目',\n publications: '出版刊物',\n references: '引荐',\n skills: '专业技能',\n volunteer: '志愿服务',\n work: '工作经历',\n },\n skills: {\n Novice: '新手',\n Beginner: '初级',\n Intermediate: '中级',\n Advanced: '高级',\n Expert: '专家',\n Master: '大师',\n },\n },\n 'zh-hant-hk': {\n countries: TraditionalChineseCountryHKNames,\n degrees: {\n 'Middle School': '初中',\n 'High School': '高中',\n Diploma: '專科',\n Associate: '副學士',\n Bachelor: '學士',\n Master: '碩士',\n Doctor: '博士',\n },\n fluency: {\n 'Elementary Proficiency': '初級水平',\n 'Limited Working Proficiency': '有限工作水平',\n 'Minimum Professional Proficiency': '最低專業水平',\n 'Full Professional Proficiency': '完全專業水平',\n 'Native or Bilingual Proficiency': '母語或雙語水平',\n },\n languages: {\n Afrikaans: '南非語',\n Albanian: '阿爾巴尼亞語',\n Amharic: '阿姆哈拉語',\n Arabic: '阿拉伯語',\n Azerbaijani: '阿塞拜疆語',\n Belarusian: '白俄羅斯語',\n Bengali: '孟加拉語',\n Bhojpuri: '博傑普爾語',\n Bulgarian: '保加利亞語',\n Burmese: '緬甸語',\n Cantonese: '粵語',\n Catalan: '加泰羅尼亞語',\n Chinese: '中文',\n Croatian: '克羅地亞語',\n Czech: '捷克語',\n Danish: '丹麥語',\n Dutch: '荷蘭語',\n English: '英語',\n Estonian: '愛沙尼亞語',\n Farsi: '波斯語',\n Filipino: '菲律賓語',\n Finnish: '芬蘭語',\n French: '法語',\n German: '德語',\n Greek: '希臘語',\n Gujarati: '古吉拉特語',\n Hausa: '豪薩語',\n Hebrew: '希伯來語',\n Hindi: '印地語',\n Hungarian: '匈牙利語',\n Icelandic: '冰島語',\n Igbo: '伊博語',\n Indonesian: '印度尼西亞語',\n Irish: '愛爾蘭語',\n Italian: '意大利語',\n Japanese: '日語',\n Javanese: '爪哇語',\n Kazakh: '哈薩克語',\n Khmer: '高棉語',\n Korean: '韓語',\n Lahnda: '拉亨達語',\n Latvian: '拉脫維亞語',\n Lithuanian: '立陶宛語',\n Malay: '馬來語',\n Mandarin: '普通話',\n Marathi: '馬拉地語',\n Nepali: '尼泊爾語',\n Norwegian: '挪威語',\n Oromo: '奧羅莫語',\n Pashto: '普什圖語',\n Polish: '波蘭語',\n Portuguese: '葡萄牙語',\n Romanian: '羅馬尼亞語',\n Russian: '俄語',\n Serbian: '塞爾維亞語',\n Shona: '紹納語',\n Sinhala: '僧伽羅語',\n Slovak: '斯洛伐克語',\n Slovene: '斯洛維尼亞語',\n Somali: '索馬里語',\n Spanish: '西班牙語',\n Sundanese: '巽他語',\n Swahili: '斯瓦希里語',\n Swedish: '瑞典語',\n Tagalog: '他加祿語',\n Tamil: '泰米爾語',\n Telugu: '泰盧固語',\n Thai: '泰語',\n Turkish: '土耳其語',\n Ukrainian: '烏克蘭語',\n Urdu: '烏爾都語',\n Uzbek: '烏茲別克語',\n Vietnamese: '越南語',\n Yoruba: '約魯巴語',\n Zulu: '祖魯語',\n },\n sections: {\n awards: '榮譽',\n basics: '簡介',\n certificates: '證書',\n education: '教育背景',\n interests: '興趣愛好',\n languages: '語言',\n location: '位置',\n profiles: '個人主頁',\n projects: '項目',\n publications: '出版刊物',\n references: '引薦',\n skills: '專業技能',\n volunteer: '志願服務',\n work: '工作經歷',\n },\n skills: {\n Novice: '新手',\n Beginner: '初級',\n Intermediate: '中級',\n Advanced: '高級',\n Expert: '專家',\n Master: '大師',\n },\n },\n 'zh-hant-tw': {\n countries: TraditionalChineseCountryTWNames,\n degrees: {\n 'Middle School': '初中',\n 'High School': '高中',\n Diploma: '專科',\n Associate: '副學士',\n Bachelor: '學士',\n Master: '碩士',\n Doctor: '博士',\n },\n fluency: {\n 'Elementary Proficiency': '初級水平',\n 'Limited Working Proficiency': '有限工作水平',\n 'Minimum Professional Proficiency': '最低專業水平',\n 'Full Professional Proficiency': '完全專業水平',\n 'Native or Bilingual Proficiency': '母語或雙語水平',\n },\n languages: {\n Afrikaans: '南非語',\n Albanian: '阿爾巴尼亞語',\n Amharic: '阿姆哈拉語',\n Arabic: '阿拉伯語',\n Azerbaijani: '阿塞拜疆語',\n Belarusian: '白俄羅斯語',\n Bengali: '孟加拉語',\n Bhojpuri: '博傑普爾語',\n Bulgarian: '保加利亞語',\n Burmese: '緬甸語',\n Cantonese: '粵語',\n Catalan: '加泰羅尼亞語',\n Chinese: '中文',\n Croatian: '克羅地亞語',\n Czech: '捷克語',\n Danish: '丹麥語',\n Dutch: '荷蘭語',\n English: '英語',\n Estonian: '愛沙尼亞語',\n Farsi: '波斯語',\n Filipino: '菲律賓語',\n Finnish: '芬蘭語',\n French: '法語',\n German: '德語',\n Greek: '希臘語',\n Gujarati: '古吉拉特語',\n Hausa: '豪薩語',\n Hebrew: '希伯來語',\n Hindi: '印地語',\n Hungarian: '匈牙利語',\n Icelandic: '冰島語',\n Igbo: '伊博語',\n Indonesian: '印度尼西亞語',\n Irish: '愛爾蘭語',\n Italian: '意大利語',\n Japanese: '日語',\n Javanese: '爪哇語',\n Kazakh: '哈薩克語',\n Khmer: '高棉語',\n Korean: '韓語',\n Lahnda: '拉亨達語',\n Latvian: '拉脫維亞語',\n Lithuanian: '立陶宛語',\n Malay: '馬來語',\n Mandarin: '普通話',\n Marathi: '馬拉地語',\n Nepali: '尼泊爾語',\n Norwegian: '挪威語',\n Oromo: '奧羅莫語',\n Pashto: '普什圖語',\n Polish: '波蘭語',\n Portuguese: '葡萄牙語',\n Romanian: '羅馬尼亞語',\n Russian: '俄語',\n Serbian: '塞爾維亞語',\n Shona: '紹納語',\n Sinhala: '僧伽羅語',\n Slovak: '斯洛伐克語',\n Slovene: '斯洛維尼亞語',\n Somali: '索馬里語',\n Spanish: '西班牙語',\n Sundanese: '巽他語',\n Swahili: '斯瓦希里語',\n Swedish: '瑞典語',\n Tagalog: '他加祿語',\n Tamil: '泰米爾語',\n Telugu: '泰盧固語',\n Thai: '泰語',\n Turkish: '土耳其語',\n Ukrainian: '烏克蘭語',\n Urdu: '烏爾都語',\n Uzbek: '烏茲別克語',\n Vietnamese: '越南語',\n Yoruba: '約魯巴語',\n Zulu: '祖魯語',\n },\n sections: {\n awards: '榮譽',\n basics: '簡介',\n certificates: '證書',\n education: '教育背景',\n interests: '興趣愛好',\n languages: '語言',\n location: '位置',\n profiles: '個人主頁',\n projects: '項目',\n publications: '出版刊物',\n references: '引薦',\n skills: '專業技能',\n volunteer: '志願服務',\n work: '工作經歷',\n },\n skills: {\n Novice: '新手',\n Beginner: '初級',\n Intermediate: '中級',\n Advanced: '高級',\n Expert: '專家',\n Master: '大師',\n },\n },\n es: {\n countries: SpanishCountryNames,\n degrees: {\n 'Middle School': 'Escuela secundaria',\n 'High School': 'Título de secundaria',\n Diploma: 'Diploma',\n Associate: 'Grado de asociado',\n Bachelor: 'Licenciatura',\n Master: 'Maestría',\n Doctor: 'Doctorado',\n },\n fluency: {\n 'Elementary Proficiency': 'Competencia elemental',\n 'Limited Working Proficiency': 'Competencia limitada de trabajo',\n 'Minimum Professional Proficiency':\n 'Competencia profesional de trabajo',\n 'Full Professional Proficiency': 'Competencia profesional plena',\n 'Native or Bilingual Proficiency': 'Competencia nativa o bilingüe',\n },\n languages: {\n Afrikaans: 'Afrikáns',\n Albanian: 'Albanés',\n Amharic: 'Amárico',\n Arabic: 'Árabe',\n Azerbaijani: 'Azerbaiyano',\n Belarusian: 'Bielorruso',\n Bengali: 'Bengalí',\n Bhojpuri: 'Bhojpuri',\n Bulgarian: 'Búlgaro',\n Burmese: 'Birmano',\n Cantonese: 'Cantonés',\n Catalan: 'Catalán',\n Chinese: 'Chino',\n Croatian: 'Croata',\n Czech: 'Checo',\n Danish: 'Danés',\n Dutch: 'Neerlandés',\n English: 'Inglés',\n Estonian: 'Estonio',\n Farsi: 'Persa',\n Filipino: 'Filipino',\n Finnish: 'Finlandés',\n French: 'Francés',\n German: 'Alemán',\n Greek: 'Griego',\n Gujarati: 'Gujarati',\n Hausa: 'Hausa',\n Hebrew: 'Hebreo',\n Hindi: 'Hindi',\n Hungarian: 'Húngaro',\n Icelandic: 'Islandés',\n Igbo: 'Igbo',\n Indonesian: 'Indonesio',\n Irish: 'Irlandés',\n Italian: 'Italiano',\n Japanese: 'Japonés',\n Javanese: 'Javanés',\n Kazakh: 'Kazajo',\n Khmer: 'Jemer',\n Korean: 'Coreano',\n Lahnda: 'Lahnda',\n Latvian: 'Letón',\n Lithuanian: 'Lituano',\n Malay: 'Malayo',\n Mandarin: 'Mandarín',\n Marathi: 'Marathi',\n Nepali: 'Nepalí',\n Norwegian: 'Noruego',\n Oromo: 'Oromo',\n Pashto: 'Pastún',\n Polish: 'Polaco',\n Portuguese: 'Portugués',\n Romanian: 'Rumano',\n Russian: 'Ruso',\n Serbian: 'Serbio',\n Shona: 'Shona',\n Sinhala: 'Cingalés',\n Slovak: 'Eslovaco',\n Slovene: 'Esloveno',\n Somali: 'Somalí',\n Spanish: 'Español',\n Sundanese: 'Sundanés',\n Swahili: 'Swahili',\n Swedish: 'Sueco',\n Tagalog: 'Tagalo',\n Tamil: 'Tamil',\n Telugu: 'Telugu',\n Thai: 'Tailandés',\n Turkish: 'Turco',\n Ukrainian: 'Ucraniano',\n Urdu: 'Urdu',\n Uzbek: 'Uzbeko',\n Vietnamese: 'Vietnamita',\n Yoruba: 'Yoruba',\n Zulu: 'Zulú',\n },\n sections: {\n awards: 'Premios',\n basics: 'Información básica',\n certificates: 'Certificados',\n education: 'Educación',\n interests: 'Intereses',\n languages: 'Idiomas',\n location: 'Ubicación',\n profiles: 'Perfiles',\n projects: 'Proyectos',\n publications: 'Publicaciones',\n references: 'Referencias',\n skills: 'Competencias',\n volunteer: 'Voluntariado',\n work: 'Experiencia laboral',\n },\n skills: {\n Novice: 'Novato',\n Beginner: 'Principiante',\n Intermediate: 'Intermedio',\n Advanced: 'Avanzado',\n Expert: 'Experto',\n Master: 'Maestro',\n },\n },\n fr: {\n countries: FrenchCountryNames,\n degrees: {\n 'Middle School': 'Collège',\n 'High School': 'Lycée',\n Diploma: 'Diplôme',\n Associate: 'Diplôme universitaire de technologie',\n Bachelor: 'Licence',\n Master: 'Master',\n Doctor: 'Doctorat',\n },\n languages: {\n Afrikaans: 'Afrikaans',\n Albanian: 'Albanais',\n Amharic: 'Amharique',\n Arabic: 'Arabe',\n Azerbaijani: 'Azéri',\n Belarusian: 'Biélorusse',\n Bengali: 'Bengali',\n Bhojpuri: 'Bhojpuri',\n Bulgarian: 'Bulgare',\n Burmese: 'Birman',\n Cantonese: 'Cantonais',\n Catalan: 'Catalan',\n Chinese: 'Chinois',\n Croatian: 'Croate',\n Czech: 'Tchèque',\n Danish: 'Danois',\n Dutch: 'Néerlandais',\n English: 'Anglais',\n Estonian: 'Estonien',\n Farsi: 'Persan',\n Filipino: 'Filipino',\n Finnish: 'Finnois',\n French: 'Français',\n German: 'Allemand',\n Greek: 'Grec',\n Gujarati: 'Gujarati',\n Hausa: 'Haoussa',\n Hebrew: 'Hébreu',\n Hindi: 'Hindi',\n Hungarian: 'Hongrois',\n Icelandic: 'Islandais',\n Igbo: 'Igbo',\n Indonesian: 'Indonésien',\n Irish: 'Irlandais',\n Italian: 'Italien',\n Japanese: 'Japonais',\n Javanese: 'Javanais',\n Kazakh: 'Kazakh',\n Khmer: 'Khmer',\n Korean: 'Coréen',\n Lahnda: 'Lahnda',\n Latvian: 'Letton',\n Lithuanian: 'Lituanien',\n Malay: 'Malais',\n Mandarin: 'Mandarin',\n Marathi: 'Marathi',\n Nepali: 'Népalais',\n Norwegian: 'Norvégien',\n Oromo: 'Oromo',\n Pashto: 'Pachto',\n Polish: 'Polonais',\n Portuguese: 'Portugais',\n Romanian: 'Roumain',\n Russian: 'Russe',\n Serbian: 'Serbe',\n Shona: 'Shona',\n Sinhala: 'Cingalais',\n Slovak: 'Slovaque',\n Slovene: 'Slovène',\n Somali: 'Somali',\n Spanish: 'Espagnol',\n Sundanese: 'Soundanais',\n Swahili: 'Swahili',\n Swedish: 'Suédois',\n Tagalog: 'Tagalog',\n Tamil: 'Tamoul',\n Telugu: 'Telugu',\n Thai: 'Thaï',\n Turkish: 'Turc',\n Ukrainian: 'Ukrainien',\n Urdu: 'Ourdou',\n Uzbek: 'Ouzbek',\n Vietnamese: 'Vietnamien',\n Yoruba: 'Yoruba',\n Zulu: 'Zoulou',\n },\n fluency: {\n 'Elementary Proficiency': 'Niveau élémentaire',\n 'Limited Working Proficiency': 'Niveau de travail limité',\n 'Minimum Professional Proficiency': 'Niveau professionnel minimum',\n 'Full Professional Proficiency': 'Niveau professionnel complet',\n 'Native or Bilingual Proficiency': 'Niveau natif ou bilingue',\n },\n sections: {\n awards: 'Récompenses',\n basics: 'Informations de base',\n certificates: 'Certificats',\n education: 'Formation',\n interests: \"Centres d'intérêt\",\n languages: 'Langues',\n location: 'Localisation',\n profiles: 'Profils',\n projects: 'Projets',\n publications: 'Publications',\n references: 'Références',\n skills: 'Compétences',\n volunteer: 'Bénévolat',\n work: 'Expérience professionnelle',\n },\n skills: {\n Novice: 'Novice',\n Beginner: 'Débutant',\n Intermediate: 'Intermédiaire',\n Advanced: 'Avancé',\n Expert: 'Expert',\n Master: 'Maître',\n },\n },\n no: {\n countries: NorwegianCountryNames,\n degrees: {\n 'Middle School': 'Ungdomsskole',\n 'High School': 'Videregående skole',\n Diploma: 'Fagbrev',\n Associate: 'Associate',\n Bachelor: 'Bachelor',\n Master: 'Master',\n Doctor: 'Doktor',\n },\n languages: {\n Afrikaans: 'Afrikaans',\n Albanian: 'Albansk',\n Amharic: 'Amharisk',\n Arabic: 'Arabisk',\n Azerbaijani: 'Aserbajdsjansk',\n Belarusian: 'Belarusisk',\n Bengali: 'Bengali',\n Bhojpuri: 'Bhojpuri',\n Bulgarian: 'Bulgarsk',\n Burmese: 'Burmesisk',\n Cantonese: 'Kantonesisk',\n Catalan: 'Katalansk',\n Chinese: 'Kinesisk',\n Croatian: 'Kroatisk',\n Czech: 'Tsjekkisk',\n Danish: 'Dansk',\n Dutch: 'Nederlandsk',\n English: 'Engelsk',\n Estonian: 'Estisk',\n Farsi: 'Farsi',\n Filipino: 'Filippinsk',\n Finnish: 'Finsk',\n French: 'Fransk',\n German: 'Tysk',\n Greek: 'Gresk',\n Gujarati: 'Gujarati',\n Hausa: 'Hausa',\n Hebrew: 'Hebraisk',\n Hindi: 'Hindi',\n Hungarian: 'Ungarsk',\n Icelandic: 'Islandsk',\n Igbo: 'Igbo',\n Indonesian: 'Indonesisk',\n Irish: 'Irsk',\n Italian: 'Italiensk',\n Japanese: 'Japansk',\n Javanese: 'Javanesisk',\n Kazakh: 'Kasakhisk',\n Khmer: 'Khmer',\n Korean: 'Koreansk',\n Lahnda: 'Lahnda',\n Latvian: 'Latvisk',\n Lithuanian: 'Litauisk',\n Malay: 'Malayisk',\n Mandarin: 'Mandarin',\n Marathi: 'Marathi',\n Nepali: 'Nepali',\n Norwegian: 'Norsk',\n Oromo: 'Oromo',\n Pashto: 'Pashto',\n Polish: 'Polsk',\n Portuguese: 'Portugisisk',\n Romanian: 'Rumensk',\n Russian: 'Russisk',\n Serbian: 'Serbisk',\n Shona: 'Shona',\n Sinhala: 'Singalesisk',\n Slovak: 'Slovakisk',\n Slovene: 'Slovensk',\n Somali: 'Somali',\n Spanish: 'Spansk',\n Sundanese: 'Sundanesisk',\n Swahili: 'Swahili',\n Swedish: 'Svensk',\n Tagalog: 'Tagalog',\n Tamil: 'Tamil',\n Telugu: 'Telugu',\n Thai: 'Thai',\n Turkish: 'Tyrkisk',\n Ukrainian: 'Ukrainsk',\n Urdu: 'Urdu',\n Uzbek: 'Usbekisk',\n Vietnamese: 'Vietnamesisk',\n Yoruba: 'Yoruba',\n Zulu: 'Zulu',\n },\n fluency: {\n 'Elementary Proficiency': 'Grunnleggende nivå',\n 'Limited Working Proficiency': 'Begrenset arbeidskunnskap',\n 'Minimum Professional Proficiency': 'Minimum profesjonelt nivå',\n 'Full Professional Proficiency': 'Fullt profesjonelt nivå',\n 'Native or Bilingual Proficiency': 'Morsmål eller tospråklig nivå',\n },\n sections: {\n awards: 'Utmerkelser',\n basics: 'Grunnleggende informasjon',\n certificates: 'Sertifikater',\n education: 'Utdanning',\n interests: 'Interesser',\n languages: 'Språk',\n location: 'Plassering',\n profiles: 'Profiler',\n projects: 'Prosjekter',\n publications: 'Publikasjoner',\n references: 'Referanser',\n skills: 'Ferdigheter',\n volunteer: 'Frivillig arbeid',\n work: 'Arbeidserfaring',\n },\n skills: {\n Novice: 'Nybegynner',\n Beginner: 'Begynner',\n Intermediate: 'Viderekommen',\n Advanced: 'Avansert',\n Expert: 'Ekspert',\n Master: 'Mester',\n },\n },\n }\n\n return get(\n optionsTranslations,\n [language, category, option],\n option\n ) as string\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { LocaleLanguage } from '@/models'\nimport { isEmptyValue } from '@/utils'\n\n/** Specific punctuation types used for formatting within templates. */\nexport const PUNCTUATIONS = ['comma', 'colon', 'separator'] as const\n\n/** The type of punctuation. */\nexport type Punctuation = (typeof PUNCTUATIONS)[number]\n\n/** Specific terms used within the template structure that need translation. */\nexport const TERMS = ['courses', 'keywords', 'score'] as const\n\n/** The type of term. */\nexport type Term = (typeof TERMS)[number]\n\n/** The structure for template-specific translations (punctuations and terms) */\ntype TemplateTranslationValue = {\n /** Translations for punctuation types defined in `Punctuation`. */\n punctuations: Record<Punctuation, string>\n /** Translations for template terms defined in `Term`. */\n terms: Record<Term, string>\n}\n\n/** The overall structure containing template-specific translations for all\n * supported languages. */\ntype TemplateTranslation = Record<LocaleLanguage, TemplateTranslationValue>\n\n/**\n * Retrieves template-specific translations (punctuations and terms) for a given\n * locale language.\n *\n * @param language - The desired locale language. If undefined, defaults to\n * English.\n * @returns An object containing the translated punctuations and terms for the\n * specified language.\n */\nexport function getTemplateTranslations(\n language?: LocaleLanguage\n): TemplateTranslationValue {\n const templateTranslation: TemplateTranslation = {\n en: {\n punctuations: {\n comma: ', ',\n colon: ': ',\n separator: ', ',\n },\n terms: {\n courses: 'Courses',\n keywords: 'Keywords',\n score: 'Score',\n },\n },\n 'zh-hans': {\n punctuations: {\n comma: ',',\n colon: ':',\n separator: '、',\n },\n terms: {\n courses: '课程',\n keywords: '关键字',\n score: '成绩',\n },\n },\n 'zh-hant-hk': {\n punctuations: {\n comma: ',',\n colon: ':',\n separator: '、',\n },\n terms: {\n courses: '課程',\n keywords: '關鍵字',\n score: '成績',\n },\n },\n 'zh-hant-tw': {\n punctuations: {\n comma: ',',\n colon: ':',\n separator: '、',\n },\n terms: {\n courses: '課程',\n keywords: '關鍵字',\n score: '成績',\n },\n },\n es: {\n punctuations: {\n comma: ', ',\n colon: ': ',\n separator: ', ',\n },\n terms: {\n courses: 'Cursos',\n keywords: 'Palabras clave',\n score: 'Puntuación',\n },\n },\n fr: {\n punctuations: {\n comma: ', ',\n colon: ' : ',\n separator: ', ',\n },\n terms: {\n courses: 'Cours',\n keywords: 'Mots-clés',\n score: 'Score',\n },\n },\n no: {\n punctuations: {\n comma: ', ',\n colon: ': ',\n separator: ', ',\n },\n terms: {\n courses: 'Kurs',\n keywords: 'Nøkkelord',\n score: 'Poeng',\n },\n },\n }\n\n return templateTranslation[isEmptyValue(language) ? 'en' : language]\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { capitalize, cloneDeep, isArray, merge } from 'lodash-es'\n\nimport { LatexCodeGenerator, type Parser } from '@/compiler'\nimport {\n DEFAULT_LATEX_LAYOUT,\n DEFAULT_MARKDOWN_LAYOUT,\n DEFAULT_RESUME_LAYOUTS,\n DEFAULT_RESUME_LOCALE,\n FILLED_RESUME_CONTENT,\n type ProfileItem,\n type Resume,\n type SectionID,\n} from '@/models'\nimport { getOptionTranslation, getTemplateTranslations } from '@/translations'\nimport {\n escapeLatex,\n getDateRange,\n isEmptyValue,\n joinNonEmptyString,\n localizeDate,\n showIf,\n} from '@/utils'\n\n/**\n * Replaces consecutive blank lines with a single LaTeX comment character (`%`).\n *\n * Useful for preventing LaTeX errors in environments sensitive to blank lines.\n *\n * @param content - The input string content.\n * @returns The processed string with blank lines replaced.\n */\nexport function replaceBlankLinesWithPercent(content: string): string {\n // if content only contains a newline character, we return an empty string\n if (content === '\\n') {\n return ''\n }\n\n return content.replace(/(^[ \\t]*\\n)/gm, '%\\n')\n}\n\n/**\n * Merges the provided resume content with default content values, ensuring\n * all necessary content properties are set.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n */\nexport function normalizeResumeContentSections(resume: Resume): Resume {\n const clonedResume = cloneDeep(resume)\n\n Object.keys(FILLED_RESUME_CONTENT).forEach((key) => {\n switch (key) {\n case 'basics':\n if (isEmptyValue(clonedResume.content[key])) {\n clonedResume.content.basics = FILLED_RESUME_CONTENT.basics\n }\n break\n case 'location':\n if (isEmptyValue(clonedResume.content[key])) {\n clonedResume.content.location = FILLED_RESUME_CONTENT.location\n }\n break\n default:\n if (isEmptyValue(clonedResume.content[key])) {\n clonedResume.content[key] = []\n }\n break\n }\n })\n\n return clonedResume\n}\n\n/**\n * Normalizes resume content by replacing null and undefined with `\"\"`\n *\n * 1. call `normalizeResumeContentSections` to ensure all sections exist\n * 2. iterate through all sections to ensure no null or undefined values exist\n *\n * @param resume - The resume object to normalize.\n * @returns The normalized resume object.\n */\nexport function normalizedResumeContent(resume: Resume): Resume {\n // First, apply default values to ensure all sections exist\n const resumeWithDefaults = normalizeResumeContentSections(resume)\n\n // Handle basics and location sections (these are objects, not arrays)\n Object.entries(resumeWithDefaults.content).forEach(\n ([sectionKey, sectionValue]) => {\n switch (sectionKey) {\n case 'computed':\n break\n case 'basics':\n case 'location':\n // for basics and location, iterate through all keys\n Object.keys(FILLED_RESUME_CONTENT[sectionKey]).forEach((propKey) => {\n if (\n sectionValue[propKey] === null ||\n sectionValue[propKey] === undefined\n ) {\n sectionValue[propKey] = ''\n }\n })\n break\n default:\n // For other sections (arrays), iterate through each element\n if (Array.isArray(sectionValue)) {\n sectionValue.forEach((item) => {\n if (item && typeof item === 'object') {\n Object.keys(FILLED_RESUME_CONTENT[sectionKey][0]).forEach(\n (propKey) => {\n if (item[propKey] === null || item[propKey] === undefined) {\n switch (propKey) {\n // for courses and keywords, we set them to empty array\n case 'courses':\n case 'keywords':\n item[propKey] = []\n break\n default:\n item[propKey] = ''\n }\n }\n }\n )\n }\n })\n }\n }\n }\n )\n\n return resumeWithDefaults\n}\n\n/**\n * Iterates through all resume content sections and applies `escapeLatex` to\n * relevant string fields and array elements using helper functions.\n *\n * @param resume - The resume object to process.\n * @returns The processed resume object.\n * @remarks Modifies the `resume.content` object and its children directly.\n */\nexport function transformResumeValues(resume: Resume): Resume {\n Object.entries(resume.content).forEach(([key, value]) => {\n // only resume.basics and resume.location are objects, others are all arrays\n if (key === 'basics' || key === 'location') {\n transformResumeSectionValues(value)\n } else if (key === 'computed') {\n // `computed` object will be handled separately\n // for now, `transformSocialLinks` will handle it\n return\n } else {\n resume.content[key].forEach((_, index: number) => {\n transformResumeSectionValues(value[index])\n })\n }\n })\n\n return resume\n}\n\n/**\n * Transform all values in `computed` field with `escapeLatex`.\n */\nfunction transformResumeSectionComputedValues(sectionResumeComputed: {\n [key: string]: string\n}): void {\n Object.entries(sectionResumeComputed).forEach(([key, value]) => {\n sectionResumeComputed[key] = escapeLatex(value)\n })\n}\n\n/**\n * Transform all the values in `sectionResumeItem` with `escapeLatex`\n *\n * @param sectionResumeItem - a dictionary object in a resume section, for\n * 'basics` and 'locations', it would be `resume.basics` and `resume.location`\n * respectively, for other sections, it would be `resume.education[0]`,\n * `resume.projects[0]` etc.\n */\n// biome-ignore lint/complexity/noBannedTypes: ignore\nfunction transformResumeSectionValues(sectionResumeItem: Object): void {\n Object.entries(sectionResumeItem).forEach(([key, value]) => {\n if (key === 'summary') {\n // we will handle the `summary` field in a `textNodeToTeX` function\n // separately\n return\n }\n\n if (key === 'computed') {\n // deal with `computed` field separately\n transformResumeSectionComputedValues(value)\n return\n }\n\n if (['courses', 'keywords'].includes(key)) {\n sectionResumeItem[key] = (value as string[]).map((item) => {\n return escapeLatex(item)\n })\n\n return\n }\n\n sectionResumeItem[key] = escapeLatex(value)\n })\n}\n\n/**\n * Transforms the `courses` array in the education section into a single,\n * formatted string stored in `computed.courses`.\n *\n * Uses locale-specific separators and newlines for readability.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.education` items in place.\n */\nexport function transformEducationCourses(resume: Resume): Resume {\n const {\n punctuations: { separator },\n } = getTemplateTranslations(resume.locale?.language)\n\n resume.content.education.forEach((item, index: number) => {\n if (!isEmptyValue(item.courses)) {\n resume.content.education[index].computed = {\n ...resume.content.education[index].computed,\n courses: (item.courses as string[]).join(`${separator}`),\n }\n }\n })\n\n return resume\n}\n\n/**\n * Combines `degree`, `area`, and `score` from education items into\n * a formatted string stored in `computed.degreeAreaAndScore`.\n *\n * Uses locale-specific terms and punctuation.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.education` items in place.\n */\nexport function transformEducationDegreeAreaAndScore(resume: Resume): Resume {\n const {\n punctuations: { colon, comma },\n } = getTemplateTranslations(resume.locale?.language)\n\n const {\n terms: { score },\n } = getTemplateTranslations(resume.locale?.language)\n\n resume.content.education.forEach((item) => {\n const degree = getOptionTranslation(\n resume.locale?.language,\n 'degrees',\n item.degree\n )\n\n item.computed = {\n ...item.computed,\n degreeAreaAndScore: [\n degree,\n item.area,\n showIf(!isEmptyValue(item.score), `${score}${colon}${item.score}`),\n ]\n .filter((value) => !isEmptyValue(value))\n .join(comma),\n }\n })\n\n return resume\n}\n\n/**\n * Transforms `keywords` arrays in various sections (interests, languages, etc.)\n * into a single, formatted string stored in `computed.keywords`.\n *\n * Uses locale-specific separators.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies items within relevant sections (`interests`, `languages`,\n * etc.) in place.\n */\nexport function transformKeywords(resume: Resume): Resume {\n const {\n punctuations: { separator },\n } = getTemplateTranslations(resume.locale?.language)\n\n for (const section of [\n 'interests',\n 'languages',\n 'projects',\n 'skills',\n 'work',\n ]) {\n resume.content[section].forEach(\n (item: { keywords: string[] }, index: number) => {\n if (isArray(item.keywords) && item.keywords.length > 0) {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n // keywords are generally shorter than courses, so we only use\n // separator without newlines to separate them\n keywords: item.keywords.join(`${separator}`),\n }\n } else {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n keywords: '',\n }\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Transforms various date fields (`date`, `releaseDate`, `startDate`,\n * `endDate`) across multiple sections into a localized format (e.g., \"Month\n * Year\") and calculates date ranges.\n *\n * Stores results in the respective `computed` objects.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies items within relevant sections in place.\n */\nexport function transformDate(resume: Resume): Resume {\n for (const section of ['awards', 'certificates']) {\n resume.content[section].forEach((item: { date: string }, index: number) => {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n date: localizeDate(item.date, resume.locale?.language),\n }\n })\n }\n\n for (const section of ['publications']) {\n resume.content[section].forEach(\n (item: { releaseDate: string }, index: number) => {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n releaseDate: localizeDate(item.releaseDate, resume.locale?.language),\n }\n }\n )\n }\n\n for (const section of ['education', 'projects', 'volunteer', 'work']) {\n resume.content[section].forEach(\n (item: { startDate: string; endDate: string }, index: number) => {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n startDate: localizeDate(item.startDate, resume.locale?.language),\n }\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n endDate: localizeDate(item.endDate, resume.locale?.language),\n }\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n dateRange: getDateRange(\n item.startDate,\n item.endDate,\n resume.locale?.language\n ),\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Replaces empty `endDate` values in relevant sections with the string\n * \"Present\".\n *\n * Updates the `computed.endDate` field.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies items within relevant sections (`education`, `projects`,\n * etc.) in place. Should run after `transformDate`.\n */\nexport function transformEndDate(resume: Resume): Resume {\n for (const section of ['education', 'projects', 'volunteer', 'work']) {\n resume.content[section].forEach(\n (item: { endDate: string }, index: number) => {\n if (isEmptyValue(item.endDate)) {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n endDate: 'Present',\n }\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Translates `language` and `fluency` values in the languages section\n * based on the selected locale.\n * Stores results in `computed.language` and `computed.fluency`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.languages` items in place.\n */\nexport function transformLanguage(resume: Resume): Resume {\n resume.content.languages.forEach((item) => {\n item.computed = {\n ...item.computed,\n language: getOptionTranslation(\n resume.locale?.language,\n 'languages',\n item.language\n ),\n fluency: getOptionTranslation(\n resume.locale?.language,\n 'fluency',\n item.fluency\n ),\n }\n })\n\n return resume\n}\n\n/**\n * Combines address components (`address`, `city`, `region`, `country`,\n * `postalCode`) into a locale-aware formatted address string stored in\n * `computed.fullAddress`.\n *\n * Also computes intermediate components like `postalCodeAndAddress` and\n * `regionAndCountry`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.location` in place.\n */\nexport function transformLocation(resume: Resume): Resume {\n const {\n punctuations: { comma },\n } = getTemplateTranslations(resume.locale?.language)\n\n const {\n content: {\n location: { address, city, region, postalCode },\n },\n } = resume\n\n const country = getOptionTranslation(\n resume.locale?.language,\n 'countries',\n resume.content.location.country\n )\n\n switch (resume.locale?.language) {\n case 'zh-hans':\n case 'zh-hant-hk':\n case 'zh-hant-tw': {\n // For Chinese, the address format is most generic to more specific, i.e,\n // Country > Region > City > Address\n const fullAddress = joinNonEmptyString(\n [country, region, city, address, postalCode].filter(\n (value) => !isEmptyValue(value)\n ),\n comma\n )\n\n resume.content.location.computed = {\n ...resume.content.location.computed,\n fullAddress,\n }\n\n break\n }\n default: {\n const fullAddress = joinNonEmptyString(\n [address, city, region, country, postalCode].filter(\n (value) => !isEmptyValue(value)\n ),\n comma\n )\n\n resume.content.location.computed = {\n ...resume.content.location.computed,\n fullAddress,\n }\n\n break\n }\n }\n\n return resume\n}\n\n/**\n * Transforms the `basics.url` field into a LaTeX `\\href` command with a link\n * icon, stored in `computed.url`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.basics.computed` in place.\n */\nexport function transformBasicsUrl(resume: Resume): Resume {\n // `basics.url` is not a mandatory field, so we have to check if it is empty\n const basicsLink = isEmptyValue(resume.content.basics.url)\n ? ''\n : `{\\\\small \\\\faLink}\\\\ \\\\href{${resume.content.basics.url}}{${resume.content.basics.url}}`\n\n resume.content.basics.computed = {\n ...resume.content.basics.computed,\n url: basicsLink,\n }\n\n return resume\n}\n\n/**\n * Transforms profile URLs into LaTeX `\\href` commands with appropriate\n * FontAwesome icons based on the network name.\n *\n * Stores the result in `computed.url` for each profile item.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.profiles` items in place.\n */\nexport function transformProfileUrls(resume: Resume): Resume {\n // In general, to get the fontawesome5 symbol for a given network, we can\n // simply use the following use `capitalise(network)` as the icon name, though\n // there are some exceptions such as WeChat and `Stack Overflow`\n const getFaIcon = (network: string): string => {\n switch (network) {\n case 'Stack Overflow':\n return '\\\\faStackOverflow'\n case 'WeChat':\n return '\\\\faWeixin'\n default:\n return `\\\\fa${capitalize(network)}`\n }\n }\n\n resume.content.profiles.forEach((item: ProfileItem, index: number) => {\n resume.content.profiles[index].computed = {\n ...resume.content.profiles[index].computed,\n url:\n isEmptyValue(item.username) || isEmptyValue(item.network)\n ? ''\n : `{\\\\small ${getFaIcon(item.network)}}\\\\ \\\\href{${item.url}}{@${\n item.username\n }}`,\n }\n })\n\n return resume\n}\n\n/**\n * Translates skill proficiency levels based on the selected locale.\n *\n * Stores the translated string in `computed.level`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.skills` items in place.\n */\nexport function transformSkills(resume: Resume): Resume {\n resume.content.skills.forEach((item) => {\n const level = getOptionTranslation(\n resume.locale?.language,\n 'skills',\n item.level\n )\n\n item.computed = {\n ...item.computed,\n level: showIf(!isEmptyValue(item.level), level),\n }\n })\n\n return resume\n}\n\n/**\n * Collects URLs from `basics` and `profiles` sections, formats them as LaTeX\n * links (requires `transformBasicsUrl` and `transformProfileUrls` to be run\n * first),\n *\n * Join them into a single string stored in `resume.content.computed.urls`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.computed`.\n */\nexport function transformProfileLinks(resume: Resume): Resume {\n transformBasicsUrl(resume)\n transformProfileUrls(resume)\n\n resume.content.computed = {\n ...resume.content.computed,\n urls: [\n resume.content.basics.computed.url,\n ...resume.content.profiles.map((item) => item.computed.url),\n ]\n // here we filter out empty values is the processed link is still empty\n .filter((link) => !isEmptyValue(link))\n // we use 4 lefet spaces, a dot and 4 right spaces to separate links, just\n // to align with default moderncv style\n .join(' {} {} {} • {} {} {} \\n'),\n }\n\n return resume\n}\n\n/**\n * Translates standard section titles (like \"Education\", \"Work\") based on the\n * selected locale, with support for section aliases.\n *\n * Stores the translations in `resume.content.computed.sectionNames`. Section\n * aliases in `layout.sections.alias` will override default translations.\n *\n * @param resume - The resume object.\n * @param layoutIndex - The index of the selected layout to pull section aliases\n * from.\n * @param _summaryParser - Unused parser kept for API consistency.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.computed`.\n */\nexport function transformSectionNames(\n resume: Resume,\n layoutIndex: number,\n _summaryParser: Parser\n): Resume {\n resume.content.computed = {\n ...resume.content.computed,\n sectionNames: Object.keys(resume.content).reduce(\n (translations, sectionName) => {\n if (sectionName === 'computed') {\n return translations\n }\n\n const sectionId = sectionName as SectionID\n\n // Check if there's an alias for this section in the first layout\n const sectionAlias =\n resume.layouts?.[layoutIndex]?.sections?.aliases?.[sectionId]\n\n // Use the alias if provided, otherwise use default translation\n translations[sectionName] =\n sectionAlias ||\n getOptionTranslation(resume.locale?.language, 'sections', sectionId)\n\n return translations\n },\n {}\n ),\n }\n\n return resume\n}\n\n/**\n * Parses the `summary` field in various sections and converts it into LaTeX\n * code using the provided parser and generator.\n *\n * Stores the result in the corresponding `computed.summary` field, replacing blank lines.\n *\n * @param resume - The resume object.\n * @param layoutIndex - The index of the selected layout to pull typography\n * overrides from.\n * @param summaryParser - The parser instance (e.g., `MarkdownParser`)\n * @returns The transformed resume object.\n * @remarks Modifies `computed.summary` within `basics` and items in sections\n * like `education`, `work`, etc.\n */\nexport function transformSummary(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser\n): Resume {\n const layout = resume.layouts?.[layoutIndex]\n\n if (layout?.engine === 'markdown') {\n return resume\n }\n\n const typographyContext = {\n typography: layout?.typography,\n }\n\n resume.content.basics.computed = {\n ...resume.content.basics.computed,\n summary: replaceBlankLinesWithPercent(\n new LatexCodeGenerator()\n .generate(\n summaryParser.parse(resume.content.basics.summary),\n typographyContext\n )\n .trim()\n ),\n }\n\n for (const section of [\n 'awards',\n 'education',\n 'projects',\n 'publications',\n 'references',\n 'volunteer',\n 'work',\n ]) {\n resume.content[section].forEach(\n (item: { summary: string }, index: number) => {\n const summary = new LatexCodeGenerator().generate(\n summaryParser.parse(item.summary),\n typographyContext\n )\n if (summary) {\n // The reason we need to replace blank lines with percent is that, the\n // argument of `\\cventry` command in LaTeX's moderncv package do not\n // support consecutive blank lines. It will report ugly errors like:\n // `Paragraph ended before \\cventry was complete.`, thus we have to\n // replace all blank lines in `\\cventry`'s argument with a percent sign.\n // Ref:\n // - https://www.reddit.com/r/LaTeX/comments/2szgdi/odd_error_using_extra_line_breaks_in_argument_of/cnudnos/\n //\n // BTW, debugging LaTeX's error with its arcane messages is really a\n // boring, dirty and meaningless job.\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n summary: replaceBlankLinesWithPercent(summary.trim()),\n }\n } else {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n summary: '',\n }\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Applies a series of transformations to the main content of the resume.\n *\n * This includes escaping values, formatting lists (courses, keywords),\n * processing dates, translating terms, handling URLs, and parsing summaries.\n *\n * The order of internal transformations is important.\n *\n * @param resume - The resume object to transform.\n * @param layoutIndex - The index of the selected layout.\n * @param summaryParser - The parser for handling summary fields.\n * @returns The transformed resume object.\n * @remarks Modifies the `resume.content` object and its children in place.\n */\nexport function transformResumeContent(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser\n): Resume {\n return [\n // The order of the following functions matters, `transformResumeValues`\n // should be called first to process all leaf values properly with LaTeX\n // special characters escaped,\n normalizedResumeContent,\n transformResumeValues,\n transformEducationCourses,\n transformEducationDegreeAreaAndScore,\n transformDate,\n transformEndDate,\n transformKeywords,\n transformLanguage,\n transformLocation,\n transformSkills,\n transformProfileLinks,\n transformSummary,\n transformSectionNames,\n ].reduce(\n (resume, tranformFunc) => tranformFunc(resume, layoutIndex, summaryParser),\n resume\n )\n}\n\n/**\n * Merges the provided resume layout and locale configuration with default\n * values, ensuring all necessary properties are set.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.layouts` and `resume.locale` in place.\n */\nexport function transformResumeLocaleWithDefaultValues(resume: Resume): Resume {\n if (resume.locale) {\n return resume\n }\n\n return {\n ...resume,\n locale: cloneDeep(DEFAULT_RESUME_LOCALE),\n }\n}\n\n/**\n * Ensures the resume has layouts configuration by applying defaults when absent.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n */\nexport function transformResumeLayoutsWithDefaultValues(\n resume: Resume\n): Resume {\n if (resume.layouts && resume.layouts.length > 0) {\n const normalizedLayouts = resume.layouts.map((layout) => {\n switch (layout.engine) {\n case 'markdown':\n return merge(cloneDeep(DEFAULT_MARKDOWN_LAYOUT), layout)\n case 'latex':\n return merge(cloneDeep(DEFAULT_LATEX_LAYOUT), layout)\n default:\n return layout\n }\n })\n\n return {\n ...resume,\n layouts: normalizedLayouts,\n }\n }\n\n return {\n ...resume,\n layouts: cloneDeep(DEFAULT_RESUME_LAYOUTS),\n }\n}\n\n/**\n * Adjusts the resume's LaTeX settings, specifically the number style\n * (`Lining` or `OldStyle`), based on the selected locale language.\n *\n * Sets Lining for CJK languages, OldStyle otherwise, if not explicitly defined.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies LaTeX layouts' `advanced.fontspec` in place.\n */\nexport function transformResumeLayoutLaTeX(resume: Resume): Resume {\n if (!resume.layouts) {\n return resume\n }\n\n resume.layouts = resume.layouts.map((layout) => {\n // Only transform LaTeX layouts\n if (layout.engine !== 'latex') {\n return layout\n }\n\n // Skip if numbers is already explicitly set to a non-Auto value\n if (\n layout.advanced?.fontspec?.numbers !== undefined &&\n layout.advanced?.fontspec?.numbers !== 'Auto'\n ) {\n return layout\n }\n\n // Determine the number style based on locale\n const numbers =\n resume.locale?.language === 'zh-hans' ||\n resume.locale?.language === 'zh-hant-hk' ||\n resume.locale?.language === 'zh-hant-tw'\n ? 'Lining'\n : 'OldStyle'\n\n return {\n ...layout,\n advanced: {\n ...layout.advanced,\n fontspec: {\n ...layout.advanced?.fontspec,\n numbers,\n },\n },\n }\n })\n\n return resume\n}\n\n/**\n * Merges the provided resume layout configuration with default layout values,\n * ensuring all necessary layout properties are set.\n *\n * Also applies locale-based typography adjustments via\n * `transformResumeLayoutLaTeX`.\n *\n * @param resume - The resume object containing the layout to transform.\n * @returns The resume object with its layout transformed.\n * @remarks The `layout` property of the returned resume object is a new object\n * resulting from the merge. Modifies `resume.layout.typography` via helper.\n */\nexport function transformResumeLayout(resume: Resume): Resume {\n return [\n transformResumeLocaleWithDefaultValues,\n transformResumeLayoutsWithDefaultValues,\n transformResumeLayoutLaTeX,\n ].reduce((resume, transformFunc) => transformFunc(resume), resume)\n}\n\n/**\n * Applies all necessary transformations to a resume object in preparation for\n * rendering.\n *\n * This includes content processing, layout merging/adjustments, and environment\n * setup.\n *\n * The order of transformations is: content, layout, environment.\n *\n * @param resume - The original resume object.\n * @param layoutIndex - The index of the selected layout.\n * @param summaryParser - The parser instance for handling summary fields.\n * @returns A new, transformed resume object ready for rendering.\n * @remarks This function operates on and returns a deep clone of the original\n * resume.\n */\nexport function transformResume(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser\n): Resume {\n return [transformResumeLayout, transformResumeContent].reduce(\n (resume, tranformFunc) => tranformFunc(resume, layoutIndex, summaryParser),\n cloneDeep(resume)\n )\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { OrderableSectionID, Resume } from '@/models'\nimport { DEFAULT_SECTIONS_ORDER } from '@/models'\nimport { joinNonEmptyString, mergeArrayWithOrder } from '@/utils'\n\n/**\n * Abstract class for rendering resumes in TeX format.\n *\n * TeXRenderer provides the base functionality for converting Resume objects\n * into TeX documents. It follows a specific rendering order for resume\n * sections:\n *\n * 1. Core information (basics, location, profiles)\n * 2. Education and career (education, work)\n * 3. Languages and skills\n * 4. Paper works (awards, certificates, publications)\n * 5. Persons and projects (references, projects)\n * 6. Non-essential information (interests, volunteer)\n */\nabstract class Renderer {\n resume: Resume\n layoutIndex: number\n\n /**\n * Constructor for the Renderer class.\n *\n * @param resume - The resume to render.\n * @param layoutIndex - The index of the selected layout.\n */\n constructor(resume: Resume, layoutIndex: number) {\n this.resume = resume\n this.layoutIndex = layoutIndex\n }\n\n /**\n * Render the preamble of the TeX document.\n *\n * @returns {string} The preamble of the TeX document.\n */\n abstract renderPreamble(): string\n\n /**\n * Render the basics section of the resume.\n *\n * @returns {string} The rendered basics section\n */\n abstract renderBasics(): string\n\n /**\n * Render the summary section of the resume.\n *\n * This method handles rendering the summary text stored in\n * resume.content.basics.summary. The summary is rendered separately from\n * other basic information since it may need to appear in a different location\n * in the output document depending on the template.\n *\n * @returns {string} The rendered summary section\n */\n abstract renderSummary(): string\n\n /**\n * Render the location section of the resume.\n *\n * @returns {string} The rendered location section\n */\n abstract renderLocation(): string\n\n /**\n * Render the profiles section of the resume.\n *\n * @returns {string} The rendered profiles section\n */\n abstract renderProfiles(): string\n\n // education and career\n /**\n * Render the education section of the resume.\n *\n * @returns {string} The rendered education section\n */\n abstract renderEducation(): string\n\n /**\n * Render the work section of the resume.\n *\n * @returns {string} The rendered work section\n */\n abstract renderWork(): string\n\n // languages and skills\n /**\n * Render the languages section of the resume.\n *\n * @returns {string} The rendered languages section\n */\n abstract renderLanguages(): string\n\n /**\n * Render the skills section of the resume.\n *\n * @returns {string} The rendered skills section\n */\n abstract renderSkills(): string\n\n // paper works\n /**\n * Render the awards section of the resume.\n *\n * @returns {string} The rendered awards section\n */\n abstract renderAwards(): string\n\n /**\n * Render the certificates section of the resume.\n *\n * @returns {string} The rendered certificates section\n */\n abstract renderCertificates(): string\n\n /**\n * Render the publications section of the resume.\n *\n * @returns {string} The rendered publications section\n */\n abstract renderPublications(): string\n\n // persons and projects\n /**\n * Render the references section of the resume.\n *\n * @returns {string} The rendered references section\n */\n abstract renderReferences(): string\n\n /**\n * Render the projects section of the resume.\n *\n * @returns {string} The rendered projects section\n */\n abstract renderProjects(): string\n\n // non-essential information\n /**\n * Render the interests section of the resume.\n *\n * @returns {string} The rendered interests section\n */\n abstract renderInterests(): string\n\n /**\n * Render the volunteer section of the resume.\n *\n * @returns {string} The rendered volunteer section\n */\n abstract renderVolunteer(): string\n\n /**\n * Render the resume.\n *\n * @returns {string} The rendered resume\n */\n abstract render(): string\n\n /**\n * Render sections in the specified order.\n *\n * @returns {string} The rendered sections in the specified order\n */\n protected renderOrderedSections(): string {\n const customOrder = this.resume.layouts?.[this.layoutIndex]?.sections?.order\n const order = mergeArrayWithOrder(customOrder, DEFAULT_SECTIONS_ORDER)\n\n const sectionRenderers: Record<OrderableSectionID, () => string> = {\n basics: () => this.renderSummary(),\n education: () => this.renderEducation(),\n work: () => this.renderWork(),\n languages: () => this.renderLanguages(),\n skills: () => this.renderSkills(),\n awards: () => this.renderAwards(),\n certificates: () => this.renderCertificates(),\n publications: () => this.renderPublications(),\n references: () => this.renderReferences(),\n projects: () => this.renderProjects(),\n interests: () => this.renderInterests(),\n volunteer: () => this.renderVolunteer(),\n }\n\n const renderedSections = order\n .map((sectionId) => sectionRenderers[sectionId]())\n .filter((rendered) => rendered.trim() !== '')\n\n return joinNonEmptyString(renderedSections)\n }\n}\n\nexport { Renderer }\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * The options for the document class.\n *\n * For now we only support `moderncv` document class.\n */\nexport const DOCUMENT_CLASS_OPTIONS = ['moderncv'] as const\n\n/** The type of document class. */\nexport type DocumentClass = (typeof DOCUMENT_CLASS_OPTIONS)[number]\n\n/**\n * The style options for the moderncv document class.\n *\n * These styles control the visual appearance and layout of the CV. There're\n * actually 5 styles in moderncv package, but only 3 are supported in this\n * project, `fancy` and `oldstyle` is pretty buggy and not working well.\n *\n * - `banking` - a modern, professional style with a banking/financial aesthetic\n * - `classic` - a traditional CV style with a clean, formal layout\n * - `casual` - a more relaxed style while maintaining professionalism\n *\n * @see {@link https://github.com/yamlresume/community/issues/117}\n */\nexport const MODERNCV_STYLE_OPTIONS = ['banking', 'classic', 'casual'] as const\n\n/** The type of moderncv style. */\nexport type ModerncvStyle = (typeof MODERNCV_STYLE_OPTIONS)[number]\n\n/**\n * Normalize a unit string\n *\n * Convert unit string with format of \"<number> <unit>\" to \"<number><unit>\" by\n * removing spaces, for example: \"10 mm\" -> \"10mm\"\n *\n * @param value The unit string to normalize\n * @returns The normalized string with spaces removed between number and unit\n */\nexport function normalizeUnit(value: string): string {\n return value.replace(/\\s+/g, '')\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Parser } from '@/compiler'\nimport { MarkdownParser } from '@/compiler'\nimport type { LatexLayout, Resume } from '@/models'\nimport { transformResume } from '@/preprocess'\nimport { getTemplateTranslations } from '@/translations'\nimport {\n isEmptyValue,\n joinNonEmptyString,\n showIf,\n showIfNotEmpty,\n} from '@/utils'\nimport { Renderer } from '../base'\nimport { type ModerncvStyle, normalizeUnit } from './preamble'\n\n/**\n * Base class for moderncv renderers.\n */\nclass ModerncvBase extends Renderer {\n style: ModerncvStyle\n\n /**\n * Constructor for the ModerncvBase class.\n *\n * @param resume - The resume object\n * @param style - The moderncv style\n * @param layoutIndex - The index of the selected layout to use.\n * @param summaryParser - The summary parser used to parse summary field in\n * various sections.\n */\n constructor(\n resume: Resume,\n style: ModerncvStyle,\n layoutIndex: number,\n summaryParser: Parser\n ) {\n super(transformResume(resume, layoutIndex, summaryParser), layoutIndex)\n this.style = style\n }\n\n /**\n * Check if the resume is a CJK resume.\n */\n private isCJKResume(): boolean {\n return ['zh-hans', 'zh-hant-hk', 'zh-hant-tw'].includes(\n this.resume.locale?.language\n )\n }\n\n /**\n * Render the document class configuration.\n */\n private renderDocumentClassConfig(): string {\n const layout = this.resume.layouts?.[this.layoutIndex]\n\n const fontSize = (layout as LatexLayout)?.typography?.fontSize\n\n return `\\\\documentclass[a4paper, serif, ${normalizeUnit(\n fontSize\n )}]{moderncv}`\n }\n\n /**\n * Override the moderncv commands for CJK resumes\n */\n private renderModerncvOverride(): string {\n const {\n punctuations: { colon },\n } = getTemplateTranslations(this.resume.locale?.language)\n\n if (!this.isCJKResume()) {\n return ''\n }\n\n switch (this.style) {\n case 'banking':\n return `% renew moderncv command to adapt for CJK colon\n\\\\renewcommand*{\\\\cvitem}[3][.25em]{%\n \\\\ifstrempty{#2}{}{\\\\hintstyle{#2}${colon}}{#3}%\n \\\\par\\\\addvspace{#1}}\n\n\\\\renewcommand*{\\\\cvitemwithcomment}[4][.25em]{%\n \\\\savebox{\\\\cvitemwithcommentmainbox}{\\\\ifstrempty{#2}{}{\\\\hintstyle{#2}${colon}}#3}%\n \\\\setlength{\\\\cvitemwithcommentmainlength}{\\\\widthof{\\\\usebox{\\\\cvitemwithcommentmainbox}}}%\n \\\\setlength{\\\\cvitemwithcommentcommentlength}{\\\\maincolumnwidth-\\\\separatorcolumnwidth-\\\\cvitemwithcommentmainlength}%\n \\\\begin{minipage}[t]{\\\\cvitemwithcommentmainlength}\\\\usebox{\\\\cvitemwithcommentmainbox}\\\\end{minipage}%\n \\\\hfill% fill of \\\\separatorcolumnwidth\n \\\\begin{minipage}[t]{\\\\cvitemwithcommentcommentlength}\\\\raggedleft\\\\small\\\\itshape#4\\\\end{minipage}%\n \\\\par\\\\addvspace{#1}}`\n\n case 'casual':\n case 'classic':\n return ''\n }\n }\n\n /**\n * Render the moderncv configuration.\n */\n private renderModerncvConfig(): string {\n return joinNonEmptyString([\n `%% moderncv\n% style and color\n\\\\moderncvstyle{${this.style}}\n\\\\moderncvcolor{black}\n\n% needed by moderncv for showing icons\n\\\\usepackage{fontawesome5}`,\n this.renderModerncvOverride(),\n ])\n }\n\n /**\n * Render the layout configuration.\n */\n private renderLayoutConfig(): string {\n const layout = this.resume.layouts?.[this.layoutIndex]\n\n const page = (layout as LatexLayout)?.page\n\n const margins = page?.margins\n const showPageNumbers = page?.showPageNumbers\n\n const t = normalizeUnit(margins?.top)\n const b = normalizeUnit(margins?.bottom)\n const l = normalizeUnit(margins?.left)\n const r = normalizeUnit(margins?.right)\n\n return joinNonEmptyString(\n [\n `%% page layout/margins\n\\\\usepackage[top=${t}, bottom=${b}, left=${l}, right=${r}]{geometry}`,\n showIf(!showPageNumbers, '\\\\nopagenumbers{}'),\n ],\n '\\n'\n )\n }\n\n /**\n * Render the LaTeX packages for CJK support\n */\n private renderCTeXConfig(): string {\n return `%% CTeX\n% CJK support, used to show CJK characters in the resume\n%\n% - fontset=none: disable builtin fontset but instead set the CJK font manually\n% - heading=false: disable ctex heading\n% - punct=kaiming: use kaiming punctuations styles for CJK\n% - scheme=plain: use plain scheme, do not override \\`\\\\normalsize\\` font size\n% - space=auto: space settings for CJK characters\n%\n% ref:\n% - http://ctan.mirrorcatalogs.com/language/chinese/ctex/ctex.pdf\n\\\\usepackage[UTF8, heading=false, punct=kaiming, scheme=plain, space=auto]{ctex}\n\n\\\\IfFontExistsTF{Noto Serif CJK SC}{\n \\\\setCJKmainfont{Noto Serif CJK SC}\n}{}\n\\\\IfFontExistsTF{Noto Sans CJK SC}{\n \\\\setCJKsansfont{Noto Sans CJK SC}\n}{}`\n }\n\n /**\n * Render the LaTeX packages for Spanish support\n */\n private renderBabelConfig(): string {\n switch (this.resume.locale?.language) {\n case 'es':\n return `%% Babel config for Spanish language\n% \\`\\\\usepackage[spanish]{babel}\\` has some conflicting issues with moderncv\n% so we have to use enable the following options to make it work\n%\n% ref:\n% - https://tex.stackexchange.com/a/140161/36007\n\\\\usepackage[spanish,es-lcroman]{babel}`\n case 'fr':\n return `%% Babel config for French language\n% ref:\n% - https://latex3.github.io/babel/guides/locale-french.html\n\\\\usepackage[french]{babel}`\n case 'no':\n return `%% Babel config for Norwegian language\n% ref:\n% - https://latex3.github.io/babel/guides/locale-norwegian.html\n\\\\usepackage[norsk]{babel}`\n default:\n return ''\n }\n }\n\n /**\n * Render the LaTeX packages for fontspec support\n */\n private renderFontspecConfig(): string {\n const layout = this.resume.layouts?.[this.layoutIndex]\n\n const numbers = (layout as LatexLayout)?.advanced?.fontspec?.numbers\n\n const linuxLibertineFont = 'Linux Libertine'\n const linuxLibertineOFont = 'Linux Libertine O'\n\n return `%% fontspec\n\\\\usepackage{fontspec}\n\n\\\\IfFontExistsTF{${linuxLibertineFont}}{\n \\\\setmainfont[${joinNonEmptyString(\n [\n 'Ligatures={TeX, Common}',\n `Numbers=${numbers}`,\n showIf(this.isCJKResume(), `ItalicFont=${linuxLibertineFont}`),\n ],\n ', '\n )}]{${linuxLibertineFont}}\n}{}\n\\\\IfFontExistsTF{${linuxLibertineOFont}}{\n \\\\setmainfont[${joinNonEmptyString(\n [\n 'Ligatures={TeX, Common}',\n `Numbers=${numbers}`,\n showIf(this.isCJKResume(), `ItalicFont=${linuxLibertineOFont}`),\n ],\n ', '\n )}]{${linuxLibertineOFont}}\n}{}`\n }\n\n /**\n * Render the preamble for the resume.\n *\n * @returns The LaTeX code for the preamble\n */\n renderPreamble(): string {\n if (this.resume.layouts?.[this.layoutIndex]?.engine !== 'latex') {\n return ''\n }\n\n return joinNonEmptyString([\n // document class\n this.renderDocumentClassConfig(),\n this.renderModerncvConfig(),\n\n // layout\n this.renderLayoutConfig(),\n\n // language specific\n this.renderBabelConfig(),\n\n // fontspec\n // note that loading order of fontspec and babel packages matters here\n // babel package should be loaded before fontspec package, otherwise\n // Spanish resumes cannot render correct font styles in my testing,\n // reason still unknown though\n this.renderFontspecConfig(),\n\n // CTeX for CJK\n // CTeX needs to load after fontspec because we use `\\IfFontExistsTF` to\n // set the CJK font manually if the required Google Noto font exists\n this.renderCTeXConfig(),\n ])\n }\n\n /**\n * Render the basics section of the resume.\n *\n * @returns The LaTeX code for the basics section\n */\n renderBasics(): string {\n const {\n content: {\n basics: { name, headline, phone, email },\n },\n } = this.resume\n\n return joinNonEmptyString(\n [\n // note that we have to show `\\\\name{}{}` here no matter whether name is\n // empty or not, moderncv requires this otherwise if there is no\n // `\\\\name{}{}``, moderncv will throw an error.\n `\\\\name{${name}}{}`,\n showIfNotEmpty(headline, `\\\\title{${headline}}`),\n showIfNotEmpty(phone, `\\\\phone[mobile]{${phone}}`),\n showIfNotEmpty(email, `\\\\email{${email}}`),\n ],\n '\\n'\n )\n }\n\n /**\n * Render the location section of the resume.\n *\n * @returns The LaTeX code for the location section\n */\n renderLocation(): string {\n const {\n content: {\n location: {\n computed: { fullAddress },\n },\n },\n } = this.resume\n\n return showIfNotEmpty(fullAddress, `\\\\address{${fullAddress}}{}{}`)\n }\n\n /**\n * Render the profiles section of the resume.\n *\n * @returns The LaTeX code for the profiles section\n */\n renderProfiles(): string {\n const {\n content: {\n computed: { urls },\n },\n } = this.resume\n\n return showIfNotEmpty(urls, `\\\\extrainfo{${urls}}`)\n }\n\n /**\n * Render the summary section of the resume.\n *\n * @returns The LaTeX code for the summary section\n */\n renderSummary(): string {\n const {\n content: {\n basics: {\n computed: { summary },\n },\n computed: { sectionNames },\n },\n } = this.resume\n\n return `${showIfNotEmpty(\n summary,\n `\\\\section{${sectionNames.basics}}\n\n\\\\cvline{}{${summary}}`\n )}`\n }\n\n /**\n * Render the education section of the resume.\n *\n * @returns The LaTeX code for the education section\n */\n renderEducation(): string {\n const {\n content: {\n computed: { sectionNames },\n education,\n },\n locale,\n } = this.resume\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n if (!education.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.education}}\n\n${education\n .map(\n ({\n computed: { startDate, dateRange, degreeAreaAndScore, summary, courses },\n institution,\n url,\n }) => `\\\\cventry{${showIfNotEmpty(startDate, dateRange)}}\n {${degreeAreaAndScore}}\n {${institution}}\n {${showIfNotEmpty(url, `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyValue(summary) || !isEmptyValue(courses),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyValue(courses),\n `\\\\textbf{${terms.courses}}${colon}${courses}`\n ),\n ],\n '\\n'\n )}`\n )}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the work section of the resume.\n *\n * @returns The LaTeX code for the work section\n */\n renderWork(): string {\n const { content, locale } = this.resume\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n if (!content.work.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.work}}\n\n${content.work\n .map((work) => {\n const {\n computed: { startDate, dateRange, summary, keywords },\n name,\n position,\n url,\n } = work\n\n return `\\\\cventry{${showIfNotEmpty(startDate, dateRange)}}\n {${position}}\n {${name}}\n {${showIfNotEmpty(url, `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyValue(summary) || !isEmptyValue(keywords),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyValue(keywords),\n `\\\\textbf{${terms.keywords}}${colon}${keywords}`\n ),\n ],\n '\\n'\n )}`\n )}}`\n })\n .join('\\n\\n')}`\n }\n\n /**\n * Render the languages section of the resume.\n *\n * @returns The LaTeX code for the languages section\n */\n renderLanguages(): string {\n const {\n content: {\n computed: { sectionNames },\n languages,\n },\n locale,\n } = this.resume\n\n if (!languages.length) {\n return ''\n }\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n return `\\\\section{${sectionNames.languages}}\n\n${languages\n .map(\n ({ computed: { language, fluency, keywords } }) =>\n `\\\\cvline{${language}}{${fluency}${showIfNotEmpty(\n keywords,\n ` \\\\hfill \\\\textbf{${terms.keywords}}${colon}${keywords}`\n )}}`\n )\n .join('\\n')}`\n }\n\n /**\n * Render the skills section of the resume.\n *\n * @returns The LaTeX code for the skills section\n */\n renderSkills(): string {\n const {\n content: {\n computed: { sectionNames },\n skills,\n },\n locale,\n } = this.resume\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n if (!skills.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.skills}}\n\n${skills\n .map(\n ({ name, computed: { level, keywords } }) =>\n `\\\\cvline{${name}}{${level}${showIfNotEmpty(\n keywords,\n ` \\\\hfill \\\\textbf{${terms.keywords}}${colon}${keywords}`\n )}}`\n )\n .join('\\n')}`\n }\n\n /**\n * Render the awards section of the resume.\n *\n * @returns The LaTeX code for the awards section\n */\n renderAwards(): string {\n const {\n content: {\n computed: { sectionNames },\n awards,\n },\n } = this.resume\n\n if (!awards.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.awards}}\n\n${awards\n .map(\n ({ computed: { date, summary }, awarder, title }) => `\\\\cventry{${date}}\n {${awarder}}\n {${title}}\n {}\n {}\n {${summary}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the certificates section of the resume.\n *\n * @returns The LaTeX code for the certificates section\n */\n renderCertificates(): string {\n const {\n content: {\n computed: { sectionNames },\n certificates,\n },\n } = this.resume\n\n if (!certificates.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.certificates}}\n\n${certificates\n .map(\n ({ computed: { date }, issuer, name, url }) => `\\\\cventry{${date}}\n {${issuer}}\n {${name}}\n {${showIfNotEmpty(url, `\\\\href{${url}}{${url}}`)}}\n {}\n {}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the publications section of the resume.\n *\n * @returns The LaTeX code for the publications section\n */\n renderPublications(): string {\n const {\n content: {\n computed: { sectionNames },\n publications,\n },\n } = this.resume\n\n if (!publications.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.publications}}\n\n${publications\n .map(\n ({\n computed: { releaseDate, summary },\n name,\n publisher,\n url,\n }) => `\\\\cventry{${releaseDate}}\n {${name}}\n {${publisher}}\n {${showIfNotEmpty(url, `\\\\href{${url}}{${url}}`)}}\n {}\n {${summary}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the references section of the resume.\n *\n * @returns The LaTeX code for the references section\n */\n renderReferences(): string {\n const {\n content: {\n computed: { sectionNames },\n references,\n },\n } = this.resume\n\n if (!references.length) {\n return ''\n }\n\n switch (this.style) {\n case 'banking':\n return `\\\\section{${sectionNames.references}}\n\n${references\n .map(\n ({\n email,\n relationship,\n name,\n phone,\n computed: { summary },\n }) => `\\\\cventry{\\\\emaillink[${email}]{${email}}}\n {${relationship}}\n {${name}}\n {${phone}}\n {}\n {${summary}}`\n )\n .join('\\n\\n')}`\n\n case 'casual':\n case 'classic':\n // Note that for casual and classic styles, the position of `email` and\n // `name` is reversed with banking style. The first parameter of\n // `\\cventry` will be put on the left side, and generally the `name` can\n // be hyphenated while `email`s are generally longer and cannot be\n // hyphenated. So if email is too long, the visually result would be\n // pretty as it will overlap with the right side text.\n return `\\\\section{${sectionNames.references}}\n\n${references\n .map(\n ({\n email,\n relationship,\n name,\n phone,\n computed: { summary },\n }) => `\\\\cventry{${name}}\n {${relationship}}\n {\\\\emaillink[${email}]{${email}}}\n {${phone}}\n {}\n {${showIfNotEmpty(summary, summary)}}`\n )\n .join('\\n\\n')}`\n }\n }\n\n /**\n * Render the projects section of the resume.\n *\n * @returns The LaTeX code for the projects section\n */\n renderProjects(): string {\n const { content } = this.resume\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(this.resume.locale?.language)\n\n if (!content.projects.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.projects}}\n\n${content.projects\n .map(\n ({\n name,\n description,\n url,\n computed: { dateRange, startDate, summary, keywords },\n }) => `\\\\cventry{${showIfNotEmpty(startDate, dateRange)}}\n {${description}}\n {${name}}\n {${showIfNotEmpty(url, `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyValue(summary) || !isEmptyValue(keywords),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyValue(keywords),\n `\\\\textbf{${terms.keywords}}${colon}${keywords}`\n ),\n ],\n '\\n'\n )}`\n )}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the interests section of the resume.\n *\n * @returns The LaTeX code for the interests section\n */\n renderInterests(): string {\n const { content } = this.resume\n\n if (!content.interests.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.interests}}\n\n${content.interests\n .map(({ name, computed: { keywords } }) => `\\\\cvline{${name}}{${keywords}}`)\n .join('\\n')}`\n }\n\n /**\n * Render the volunteer section of the resume.\n *\n * @returns The LaTeX code for the volunteer section\n */\n renderVolunteer(): string {\n const { content } = this.resume\n\n if (!content.volunteer.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.volunteer}}\n\n${content.volunteer\n .map(\n ({\n position,\n organization,\n url,\n computed: { startDate, dateRange, summary },\n }) => `\\\\cventry{${showIfNotEmpty(startDate, dateRange)}}\n {${position}}\n {${organization}}\n {${showIfNotEmpty(url, `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIfNotEmpty(summary, summary)}}\n `\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the resume.\n *\n * @returns The LaTeX code for the resume\n */\n render(): string {\n return this.generateTeX()\n }\n\n /**\n * Generate the LaTeX code for the resume.\n *\n * @returns The LaTeX code for the resume\n */\n private generateTeX(): string {\n return `${joinNonEmptyString([\n this.renderPreamble(),\n this.renderBasics(),\n this.renderLocation(),\n this.renderProfiles(),\n ])}\n\n\\\\begin{document}\n\n\\\\maketitle\n\n${this.renderOrderedSections()}\n\\\\end{document}`\n }\n}\n\n/**\n * Renderer for the banking style of moderncv.\n */\nclass ModerncvBankingRenderer extends ModerncvBase {\n /**\n * Create moderncv renderer with banking style.\n *\n * @param resume - The resume object to render.\n * @param layoutIndex - The index of the selected layout to use.\n * @param summaryParser - Optional parser for summary fields (defaults to markdown).\n */\n constructor(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser = new MarkdownParser()\n ) {\n super(resume, 'banking', layoutIndex, summaryParser)\n }\n}\n\n/**\n * Renderer for the casual style of moderncv.\n */\nclass ModerncvCasualRenderer extends ModerncvBase {\n /**\n * Create a moderncv renderer with casual style.\n *\n * @param resume - The resume object to render.\n * @param layoutIndex - The index of the selected layout to use.\n * @param summaryParser - Optional parser for summary fields (defaults to markdown).\n */\n constructor(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser = new MarkdownParser()\n ) {\n super(resume, 'casual', layoutIndex, summaryParser)\n }\n}\n\n/**\n * Renderer for the classic style of moderncv.\n */\nclass ModerncvClassicRenderer extends ModerncvBase {\n /**\n * Create moderncv renderer with classic style.\n *\n * @param resume - The resume object to render.\n * @param layoutIndex - The index of the selected layout to use.\n * @param summaryParser - Optional parser for summary fields (defaults to markdown).\n */\n constructor(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser = new MarkdownParser()\n ) {\n super(resume, 'classic', layoutIndex, summaryParser)\n }\n}\n\nexport {\n ModerncvBase,\n ModerncvBankingRenderer,\n ModerncvCasualRenderer,\n ModerncvClassicRenderer,\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Parser } from '@/compiler'\nimport { MarkdownParser } from '@/compiler'\nimport type { Resume } from '@/models'\nimport { transformResume } from '@/preprocess'\nimport { getTemplateTranslations } from '@/translations'\nimport { isEmptyValue, joinNonEmptyString, showIfNotEmpty } from '@/utils'\nimport { Renderer } from '../base'\n\n/**\n * Markdown renderer for generating markdown documents from resume data.\n */\nexport class MarkdownRenderer extends Renderer {\n /**\n * Constructor for the MarkdownRenderer class.\n *\n * @param resume - The resume object\n * @param layoutIndex - The index of the selected layout to use.\n * @param summaryParser - The summary parser used to parse summary field in\n * various sections.\n */\n constructor(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser = new MarkdownParser()\n ) {\n super(transformResume(resume, layoutIndex, summaryParser), layoutIndex)\n }\n\n /**\n * Render the preamble of the markdown document.\n *\n * Please note that markdown output do not need a preamble.\n *\n * @returns {string} The preamble of the markdown document.\n */\n renderPreamble(): string {\n return ''\n }\n\n /**\n * Render the basics section of the resume.\n *\n * @returns {string} The rendered basics section\n */\n renderBasics(): string {\n const {\n content: {\n basics: { name, headline, email, phone, url },\n },\n locale,\n } = this.resume\n\n const {\n punctuations: { colon },\n } = getTemplateTranslations(locale?.language)\n\n const contactInfo = joinNonEmptyString(\n [\n showIfNotEmpty(email, `- Email${colon}${email}`),\n showIfNotEmpty(phone, `- Phone${colon}${phone}`),\n showIfNotEmpty(url, `- URL${colon}${url}`),\n ],\n '\\n'\n )\n\n return joinNonEmptyString([\n showIfNotEmpty(name, `# ${name}`),\n showIfNotEmpty(headline, `Headline${colon}${headline}`),\n showIfNotEmpty(contactInfo, contactInfo),\n ])\n }\n\n /**\n * Render the summary section of the resume.\n *\n * @returns {string} The rendered summary section\n */\n renderSummary(): string {\n const {\n content: {\n basics: { summary },\n computed: { sectionNames },\n },\n } = this.resume\n\n return showIfNotEmpty(\n summary,\n joinNonEmptyString([`## ${sectionNames.basics}`, summary])\n )\n }\n\n /**\n * Render the location section of the resume.\n *\n * @returns {string} The rendered location section\n */\n renderLocation(): string {\n const {\n content: {\n location: {\n computed: { fullAddress },\n },\n computed: { sectionNames },\n },\n locale,\n } = this.resume\n\n const {\n punctuations: { colon },\n } = getTemplateTranslations(locale?.language)\n\n return showIfNotEmpty(\n fullAddress,\n `${sectionNames.location}${colon}${fullAddress}`\n )\n }\n\n /**\n * Render the profiles section of the resume.\n *\n * @returns {string} The rendered profiles section\n */\n renderProfiles(): string {\n const {\n content: {\n computed: { sectionNames },\n profiles,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(profiles)) return ''\n\n const {\n punctuations: { colon },\n } = getTemplateTranslations(locale?.language)\n\n const profileLinks = profiles\n .map(({ network, url, username }) => {\n if (isEmptyValue(url)) {\n return `- ${network}${colon}@${username}`\n }\n\n return `- ${network}${colon}[@${username}](${url})`\n })\n .join('\\n')\n\n return `${sectionNames.profiles}${colon}\\n${profileLinks}`\n }\n\n /**\n * Render the education section of the resume.\n *\n * @returns {string} The rendered education section\n */\n renderEducation(): string {\n const {\n content: {\n computed: { sectionNames },\n education,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(education)) return ''\n\n const {\n punctuations: { colon, comma },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.education}\n\n${education\n .map(\n ({\n computed: { courses, dateRange, degreeAreaAndScore, startDate },\n institution,\n summary,\n url,\n }) => {\n return joinNonEmptyString([\n `### ${institution}`,\n joinNonEmptyString(\n [degreeAreaAndScore, showIfNotEmpty(startDate, dateRange)],\n comma\n ),\n showIfNotEmpty(url, `URL${colon}${url}`),\n showIfNotEmpty(courses, `${terms.courses}${colon}${courses}`),\n showIfNotEmpty(summary, `Summary${colon}\\n${summary}`),\n ])\n }\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the work section of the resume.\n *\n * @returns {string} The rendered work section\n */\n renderWork(): string {\n const {\n content: {\n computed: { sectionNames },\n work,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(work)) return ''\n\n const {\n punctuations: { colon, comma },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.work}\n\n${work\n .map(\n ({\n computed: { dateRange, keywords, startDate },\n name,\n position,\n summary,\n url,\n }) => {\n return joinNonEmptyString([\n `### ${position}`,\n joinNonEmptyString([name, showIfNotEmpty(startDate, dateRange)], comma),\n showIfNotEmpty(url, `URL${colon}${url}`),\n showIfNotEmpty(keywords, `${terms.keywords}${colon}${keywords}`),\n showIfNotEmpty(summary, `Summary${colon}\\n${summary}`),\n ])\n }\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the languages section of the resume.\n *\n * @returns {string} The rendered languages section\n */\n renderLanguages(): string {\n const {\n content: {\n computed: { sectionNames },\n languages,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(languages)) return ''\n\n const {\n punctuations: { colon, comma },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.languages}\n\n${languages\n .map(({ computed: { language, fluency, keywords } }) => {\n return `- ${language}${colon}${fluency}${showIfNotEmpty(\n keywords,\n `${comma}${terms.keywords}${colon}${keywords}`\n )}`\n })\n .join('\\n')}`\n }\n\n /**\n * Render the skills section of the resume.\n *\n * @returns {string} The rendered skills section\n */\n renderSkills(): string {\n const {\n content: {\n computed: { sectionNames },\n skills,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(skills)) return ''\n\n const {\n punctuations: { colon, comma },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.skills}\n\n${skills\n .map(({ name, computed: { level, keywords } }) => {\n return `- ${name}${colon}${level}${showIfNotEmpty(\n keywords,\n `${comma}${terms.keywords}${colon}${keywords}`\n )}`\n })\n .join('\\n')}`\n }\n\n /**\n * Render the awards section of the resume.\n *\n * @returns {string} The rendered awards section\n */\n renderAwards(): string {\n const {\n content: {\n computed: { sectionNames },\n awards,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(awards)) return ''\n\n const {\n punctuations: { colon, comma },\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.awards}\n\n${awards\n .map(({ computed: { date }, awarder, title, summary }) => {\n return joinNonEmptyString([\n `### ${title}`,\n joinNonEmptyString([awarder, date], comma),\n showIfNotEmpty(summary, `Summary${colon}\\n${summary}`),\n ])\n })\n .join('\\n')}`\n }\n\n /**\n * Render the certificates section of the resume.\n *\n * @returns {string} The rendered certificates section\n */\n renderCertificates(): string {\n const {\n content: {\n computed: { sectionNames },\n certificates,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(certificates)) return ''\n\n const {\n punctuations: { comma },\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.certificates}\n\n${certificates\n .map(({ computed: { date }, issuer, name, url }) => {\n return joinNonEmptyString([\n `### ${name}`,\n joinNonEmptyString([issuer, date], comma),\n showIfNotEmpty(url, `URL: ${url}`),\n ])\n })\n .join('\\n')}`\n }\n\n /**\n * Render the publications section of the resume.\n *\n * @returns {string} The rendered publications section\n */\n renderPublications(): string {\n const {\n content: {\n computed: { sectionNames },\n publications,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(publications)) return ''\n\n const {\n punctuations: { colon, comma },\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.publications}\n\n${publications\n .map(({ computed: { releaseDate }, name, publisher, summary, url }) => {\n return joinNonEmptyString([\n `### ${name}`,\n joinNonEmptyString([publisher, releaseDate], comma),\n showIfNotEmpty(url, `URL${colon}${url}`),\n showIfNotEmpty(summary, `Summary${colon}\\n${summary}`),\n ])\n })\n .join('\\n\\n')}`\n }\n\n /**\n * Render the references section of the resume.\n *\n * @returns {string} The rendered references section\n */\n renderReferences(): string {\n const {\n content: {\n computed: { sectionNames },\n references,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(references)) return ''\n\n const {\n punctuations: { colon, comma },\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.references}\n\n${references\n .map(({ email, name, phone, relationship, summary }) => {\n return joinNonEmptyString([\n `### ${name}`,\n joinNonEmptyString([relationship, email, phone], comma),\n showIfNotEmpty(summary, `Summary${colon}\\n${summary}`),\n ])\n })\n .join('\\n\\n')}`\n }\n\n /**\n * Render the projects section of the resume.\n *\n * @returns {string} The rendered projects section\n */\n renderProjects(): string {\n const {\n content: {\n computed: { sectionNames },\n projects,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(projects)) return ''\n\n const {\n punctuations: { colon, comma },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.projects}\n\n${projects\n .map(\n ({\n computed: { dateRange, keywords, startDate },\n name,\n summary,\n description,\n url,\n }) => {\n return joinNonEmptyString([\n `### ${name}`,\n joinNonEmptyString(\n [description, showIfNotEmpty(startDate, dateRange)],\n comma\n ),\n showIfNotEmpty(url, `URL${colon}${url}`),\n showIfNotEmpty(keywords, `${terms.keywords}${colon}${keywords}`),\n showIfNotEmpty(summary, `Summary${colon}\\n${summary}`),\n ])\n }\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the interests section of the resume.\n *\n * @returns {string} The rendered interests section\n */\n renderInterests(): string {\n const {\n content: {\n computed: { sectionNames },\n interests,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(interests)) return ''\n\n const {\n punctuations: { colon },\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.interests}\n\n${interests\n .map(\n ({ name, computed: { keywords } }) =>\n `- ${joinNonEmptyString([name, keywords], colon)}`\n )\n .join('\\n')}`\n }\n\n /**\n * Render the volunteer section of the resume.\n *\n * @returns {string} The rendered volunteer section\n */\n renderVolunteer(): string {\n const {\n content: {\n computed: { sectionNames },\n volunteer,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(volunteer)) return ''\n\n const {\n punctuations: { colon, comma },\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.volunteer}\n\n${volunteer\n .map(\n ({\n computed: { dateRange, startDate },\n position,\n organization,\n summary,\n url,\n }) => {\n return joinNonEmptyString([\n `### ${organization}`,\n joinNonEmptyString(\n [position, showIfNotEmpty(startDate, dateRange)],\n comma\n ),\n showIfNotEmpty(url, `URL${colon}${url}`),\n showIfNotEmpty(summary, `Summary${colon}\\n${summary}`),\n ])\n }\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the complete markdown resume.\n *\n * @returns {string} The rendered markdown resume\n */\n render(): string {\n const sections = [\n this.renderBasics(),\n this.renderLocation(),\n this.renderProfiles(),\n this.renderOrderedSections(),\n ]\n\n return joinNonEmptyString(sections, '\\n\\n')\n }\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { get } from 'lodash-es'\n\nimport type { Parser } from '@/compiler'\nimport { MarkdownParser } from '@/compiler'\nimport type { Resume } from '@/models'\nimport type { Renderer } from './base'\nimport {\n ModerncvBankingRenderer,\n ModerncvCasualRenderer,\n ModerncvClassicRenderer,\n} from './latex/moderncv'\nimport { MarkdownRenderer } from './markdown'\n\nconst LATEX_RESUME_RENDERER_MAP = {\n 'moderncv-banking': ModerncvBankingRenderer,\n 'moderncv-classic': ModerncvClassicRenderer,\n 'moderncv-casual': ModerncvCasualRenderer,\n}\n\n/**\n * Get the appropriate resume renderer based on the provided resume layout.\n *\n * @param {number} layoutIndex - The index of the layout to use.\n * @param {Parser} summaryParser - The parser instance for the summary field.\n * Default to `MarkdownParser` if not provided.\n * @returns {Renderer} The renderer instance for the specified template.\n */\nexport function getResumeRenderer(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser = new MarkdownParser()\n): Renderer {\n const layout = resume.layouts?.[layoutIndex]\n\n if (!layout) {\n throw new Error(\n `Layout not found in resume.layouts at index: ${layoutIndex}.`\n )\n }\n\n switch (layout.engine) {\n case 'markdown':\n return new MarkdownRenderer(resume, layoutIndex, summaryParser)\n case 'latex': {\n const template = layout.template\n\n // default to use moderncv banking style if template is not specified\n if (!template) {\n return new ModerncvBankingRenderer(\n resume as Resume,\n layoutIndex,\n summaryParser\n )\n }\n\n return new (get(\n LATEX_RESUME_RENDERER_MAP,\n template,\n ModerncvBankingRenderer\n ))(resume as Resume, layoutIndex, summaryParser)\n }\n default:\n // @ts-ignore\n throw new Error(`Unknown engine: ${layout.engine}`)\n }\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { startCase } from 'lodash-es'\nimport { z } from 'zod'\n\nimport {\n COUNTRY_OPTIONS,\n DEGREE_OPTIONS,\n FLUENCY_OPTIONS,\n FONT_SIZE_OPTIONS,\n FONTSPEC_NUMBERS_OPTIONS,\n LANGUAGE_OPTIONS,\n LATEX_TEMPLATE_OPTIONS,\n LEVEL_OPTIONS,\n LOCALE_LANGUAGE_OPTIONS,\n NETWORK_OPTIONS,\n type ORDERABLE_SECTION_IDS,\n} from '@/models'\nimport { joinNonEmptyString } from '@/utils'\n\n/**\n * A type for all options.\n */\ntype Options =\n | typeof COUNTRY_OPTIONS\n | typeof DEGREE_OPTIONS\n | typeof FONTSPEC_NUMBERS_OPTIONS\n | typeof FONT_SIZE_OPTIONS\n | typeof FLUENCY_OPTIONS\n | typeof LANGUAGE_OPTIONS\n | typeof LOCALE_LANGUAGE_OPTIONS\n | typeof LEVEL_OPTIONS\n | typeof NETWORK_OPTIONS\n | typeof LATEX_TEMPLATE_OPTIONS\n | typeof ORDERABLE_SECTION_IDS\n\n/**\n * Creates an error message for an optionSchema\n *\n * @param options - The options to create a message for.\n * @param messagePrefix - The message prefix to use for the message.\n * @returns A message for an option schema.\n */\nexport function optionSchemaMessage(options: Options, messagePrefix: string) {\n return joinNonEmptyString(\n [\n `${messagePrefix} option is invalid,`,\n 'it must be one of the following:',\n `[${options.map((option) => `\"${option}\"`).join(', ')}].`,\n ],\n ' '\n )\n}\n\n/**\n * Creates a zod schema for an option.\n *\n * @param options - The options to create a schema for.\n * @param messagePrefix - The message to use for the schema.\n * @returns A Zod schema for an option.\n */\nexport function optionSchema(options: Options, messagePrefix: string) {\n return z\n .enum(options, {\n error: (issue) => {\n if (issue.input === undefined) {\n return {\n message: `${messagePrefix} option is required.`,\n }\n }\n\n return {\n message: optionSchemaMessage(options, messagePrefix),\n }\n },\n })\n .meta({\n title: `${startCase(messagePrefix)} Option`,\n description: `A predefined option from the available ${messagePrefix} choices.`,\n })\n}\n\n/**\n * Creates a zod schema for a string with a minimum and maximum length.\n *\n * @param name - The name of the string.\n * @param min - The minimum length of the string.\n * @param max - The maximum length of the string.\n * @returns A Zod schema for a string with a minimum and maximum length.\n */\nexport const SizedStringSchema = (name: string, min: number, max: number) => {\n return z\n .string({ message: `${name} is required.` })\n .min(min, { message: `${name} should be ${min} characters or more.` })\n .max(max, { message: `${name} should be ${max} characters or less.` })\n}\n\n/**\n * A zod schema for a country option.\n */\nexport const CountryOptionSchema = optionSchema(COUNTRY_OPTIONS, 'country')\n\n/**\n * Creates a zod schema for a date string.\n *\n * A valid date string must be able to be parsed by `Date.parse`.\n *\n * @param date - The name of the date.\n * @returns A Zod schema for a date string.\n */\nexport function DateSchema(date: string) {\n return SizedStringSchema(date, 4, 32)\n .check((ctx) => {\n if (ctx.value.length < 4) {\n ctx.issues = [\n {\n code: 'too_small',\n input: ctx.value,\n minimum: 4,\n message: `${date} should be 4 characters or more.`,\n origin: 'string',\n },\n ]\n\n return\n }\n\n if (ctx.value.length > 32) {\n ctx.issues = [\n {\n code: 'too_big',\n input: ctx.value,\n maximum: 32,\n message: `${date} should be 32 characters or less.`,\n origin: 'string',\n },\n ]\n\n return\n }\n\n if (!Date.parse(ctx.value)) {\n ctx.issues = [\n {\n code: 'invalid_value',\n input: ctx.value,\n message: `${date} is invalid.`,\n origin: 'string',\n values: [ctx.value],\n },\n ]\n }\n })\n .meta({\n title: startCase(date),\n description: 'A valid date string that can be parsed by `Date.parse`.',\n examples: [\n '2025-01-01',\n 'Jul 2025',\n 'July 3, 2025',\n '2025-02-02T00:00:03.123Z',\n ],\n })\n}\n\n/**\n * A zod schema for a degree option.\n */\nexport const DegreeOptionSchema = optionSchema(DEGREE_OPTIONS, 'degree')\n\n/**\n * An email schema used by various sections.\n */\nexport const EmailSchema = z.email({ message: 'email is invalid.' }).meta({\n id: 'email',\n title: 'Email',\n description: 'A valid email address.',\n examples: [\n 'hi@ppresume.com',\n 'first.last@company.org',\n 'test+tag@domain.co.uk',\n ],\n})\n\n/**\n * A zod schema for a language fluency option.\n */\nexport const FluencyOptionSchema = optionSchema(FLUENCY_OPTIONS, 'fluency')\n\n/**\n * A zod schema for a font spec numbers style.\n */\nexport const FontspecNumbersOptionSchema = optionSchema(\n FONTSPEC_NUMBERS_OPTIONS,\n 'fontspec numbers'\n)\n\n/**\n * A zod schema for fontSize option in layout.\n */\nexport const FontSizeOptionSchema = optionSchema(FONT_SIZE_OPTIONS, 'font size')\n\n/**\n * A zod schema for a keywords array.\n */\nexport const KeywordsSchema = z\n .array(SizedStringSchema('keyword', 1, 32))\n .meta({\n id: 'keywords',\n title: 'Keywords',\n description: 'An array of keyword, each between 1 and 32 characters.',\n examples: [\n ['Javascript', 'React', 'Typescript'],\n ['Design', 'UI', 'UX'],\n ['Python', 'Data Science'],\n ],\n })\n\n/**\n * A zod schema for a language.\n */\nexport const LanguageOptionSchema = optionSchema(LANGUAGE_OPTIONS, 'language')\n\n/**\n * A zod schema for a locale language option.\n */\nexport const LocaleLanguageOptionSchema = optionSchema(\n LOCALE_LANGUAGE_OPTIONS,\n 'locale language'\n)\n\n/**\n * A zod schema for a level option.\n */\nexport const LevelOptionSchema = optionSchema(LEVEL_OPTIONS, 'level')\n\n/**\n * Creates a zod schema for a name.\n *\n * @param name - The name of the string.\n * @returns A Zod schema for a name string.\n */\nexport const NameSchema = (name: string) =>\n SizedStringSchema(name, 2, 128).meta({\n title: startCase(name),\n description: `A ${name} between 2 and 128 characters.`,\n examples: ['Andy Dufresne', 'Xiao Hanyu', 'Jane Smith', 'Dr. Robert John'],\n })\n\n/**\n * A zod schema for a network.\n */\nexport const NetworkOptionSchema = optionSchema(NETWORK_OPTIONS, 'network')\n\n/**\n * A regex for a phone number.\n */\nconst phoneNumberRegex = /^[+]?[(]?[0-9\\s-]{1,15}[)]?[0-9\\s-]{1,15}$/im\n\n/**\n * A zod schema for a phone number.\n */\nexport const PhoneSchema = z\n .string()\n .regex(phoneNumberRegex, {\n message: 'phone number may be invalid.',\n })\n .meta({\n id: 'phone',\n title: 'Phone',\n description: joinNonEmptyString(\n [\n 'A valid phone number that may include',\n 'country code, parentheses, spaces, and hyphens.',\n ],\n ' '\n ),\n examples: ['555-123-4567', '+44 20 7946 0958', '(555) 123-4567'],\n })\n\n/**\n * A zod schema for a summary.\n */\nexport const SummarySchema = SizedStringSchema('summary', 16, 1024).meta({\n id: 'summary',\n title: 'Summary',\n description: 'A summary text between 16 and 1024 characters.',\n examples: [\n 'Experienced software engineer with 5+ years in full-stack development.',\n joinNonEmptyString(\n [\n 'Creative designer passionate about',\n 'user experience and modern design principles.',\n ],\n ' '\n ),\n joinNonEmptyString(\n [\n 'Dedicated project manager with proven track record of',\n 'delivering complex projects on time and budget.',\n ],\n ' '\n ),\n ],\n})\n\n/**\n * Creates a zod schema for an organization.\n *\n * @param name - The name of the organization.\n * @returns A Zod schema for an organization.\n */\nexport const OrganizationSchema = (name: string) =>\n SizedStringSchema(name, 2, 128).meta({\n title: startCase(name),\n description: 'An organization name between 2 and 128 characters.',\n examples: [\n 'Google Inc.',\n 'Microsoft Corporation',\n 'Startup XYZ',\n 'Non-Profit Organization',\n ],\n })\n\n/**\n * A zod schema for a template option.\n */\nexport const TemplateOptionSchema = optionSchema(\n LATEX_TEMPLATE_OPTIONS,\n 'template'\n)\n\n/**\n * A zod schema for a url.\n */\nexport const UrlSchema = z\n .url({ message: 'URL is invalid.' })\n .max(256, { message: 'URL should be 256 characters or less.' })\n .meta({\n id: 'url',\n title: 'URL',\n description: 'A valid URL with maximum length of 256 characters.',\n examples: [\n 'https://yamlresume.dev',\n 'https://ppresume.com',\n 'https://github.com/yamlresume/yamlresume',\n 'https://linkedin.com/in/xiaohanyu1988',\n 'https://www.example.com',\n ],\n })\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { z } from 'zod'\n\n/**\n * Returns a nullish schema with the same metadata as the original schema.\n *\n * Why we need this?\n *\n * By default Zod's `nullish` method will generate a `anyOf` JSON schema, with\n * the second branch being `{ type: null }`, therefore, if users set `null` to a\n * field in the YAML file, when hover over the field in VSCode, there will be no\n * metadata for the field at all.\n *\n * Here we generate a new metadata for the nullish schema, so no matter whether\n * the field is set to `null` or not, the metadata will always be the same.\n *\n * @param schema - The zod schema to make nullish.\n * @returns A nullish schema with the same metadata as the original schema.\n */\nexport function nullifySchema<T>(schema: z.ZodType<T>) {\n const nullishMeta = {\n title: `[optional] ${schema.meta().title}`,\n description: `${schema.meta().description.replace(/\\.$/, '')} or \\`null\\`.`,\n examples: schema.meta().examples,\n }\n\n return schema.meta(nullishMeta).nullish().meta(nullishMeta)\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n NameSchema,\n OrganizationSchema,\n SummarySchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for the awarder of an award.\n */\nexport const AwarderSchema = OrganizationSchema('awarder').meta({\n title: 'Awarder',\n description: 'The organization or institution that presented the award.',\n examples: ['Academy Awards', 'Tech Conference', 'Microsoft Scholarship'],\n})\n\n/**\n * A zod schema for the title of an award.\n */\nexport const TitleSchema = NameSchema('title').meta({\n title: 'Title',\n description: 'The title of the award.',\n examples: [\"Dean's List\", 'Outstanding Student', 'Best Supporting Engineer'],\n})\n\n/**\n * A zod schema for an award item.\n */\nexport const AwardItemSchema = z.object({\n // required fields\n awarder: AwarderSchema,\n title: TitleSchema,\n\n // optional fields\n date: nullifySchema(DateSchema('date')),\n summary: nullifySchema(SummarySchema),\n})\n\n/**\n * A zod schema for awards.\n */\nexport const AwardsSchema = z.object({\n awards: z\n .array(AwardItemSchema)\n .nullish()\n .meta({\n title: 'Awards',\n description: joinNonEmptyString(\n [\n 'The awards section contains your achievements and recognitions,',\n 'including awards, honors, and special acknowledgments.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n EmailSchema,\n NameSchema,\n PhoneSchema,\n SizedStringSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a headline.\n */\nexport const HeadlineSchema = SizedStringSchema('headline', 2, 128).meta({\n title: 'Headline',\n description: 'A short and catchy headline for your resume.',\n examples: [\n 'Full-stack software engineer',\n 'Data Scientist with a passion for Machine Learning',\n 'Product Manager driving innovation',\n ],\n})\n\n/**\n * A zod schema for a basics item.\n */\nexport const BasicsItemSchema = z.object(\n {\n // required fields\n name: NameSchema('name').describe('Your personal name.'),\n\n // optional fields\n email: nullifySchema(EmailSchema),\n headline: nullifySchema(HeadlineSchema),\n phone: nullifySchema(PhoneSchema),\n summary: nullifySchema(SummarySchema),\n url: nullifySchema(UrlSchema),\n },\n {\n error: (issue) => {\n if (issue.input === undefined) {\n return {\n message: 'basics is required.',\n }\n }\n\n return {\n message: issue.message,\n }\n },\n }\n)\n\n/**\n * A zod schema for basics.\n */\nexport const BasicsSchema = z.object({\n basics: BasicsItemSchema.meta({\n title: 'Basics',\n description: joinNonEmptyString(\n [\n 'The basics section contains your personal information,',\n 'such as your name, email, phone number, and a brief summary.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n NameSchema,\n OrganizationSchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for the issuer of a certificate.\n */\nexport const IssuerSchema = OrganizationSchema('issuer').meta({\n title: 'Issuer',\n description: 'The organization that issued the certificate.',\n examples: ['AWS', 'Microsoft', 'Coursera', 'Google Cloud'],\n})\n\n/**\n * A zod schema for a certificate item.\n */\nexport const CertificateItemSchema = z.object({\n // required fields\n issuer: IssuerSchema,\n name: NameSchema('name').describe('The name of the certificate.'),\n\n // optional fields\n date: nullifySchema(DateSchema('date')),\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for certificates.\n */\nexport const CertificatesSchema = z.object({\n certificates: z\n .array(CertificateItemSchema)\n .nullish()\n .meta({\n title: 'Certificates',\n description: joinNonEmptyString(\n [\n 'The certificates section contains your professional certifications,',\n 'including training programs and industry-recognized credentials.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n DegreeOptionSchema,\n OrganizationSchema,\n SizedStringSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for an area of study.\n */\nexport const AreaSchema = SizedStringSchema('area', 2, 64).meta({\n title: 'Area',\n description: 'Your field of study or major.',\n examples: [\n 'Computer Science',\n 'Business Administration',\n 'Engineering',\n 'Arts',\n ],\n})\n\n/**\n * A zod schema for courses.\n */\nexport const CoursesSchema = z\n .array(SizedStringSchema('courses', 2, 128))\n .meta({\n title: 'Courses',\n description: 'A list of relevant courses you have taken.',\n examples: [\n ['Data Structures', 'Algorithms', 'Database Systems'],\n ['Marketing', 'Finance', 'Operations Management'],\n ['Calculus', 'Physics', 'Chemistry'],\n ],\n })\n\n/**\n * A zod schema for an institution.\n */\nexport const InstitutionSchema = OrganizationSchema('institution').meta({\n title: 'Institution',\n description: 'The institution that awarded the degree.',\n examples: [\n 'University of California, Los Angeles',\n 'Harvard University',\n 'Zhejiang University',\n ],\n})\n\n/**\n * A zod schema for a score.\n */\nexport const ScoreSchema = SizedStringSchema('score', 2, 32).meta({\n title: 'Score',\n description: 'Your GPA, grade, or other academic score.',\n examples: ['3.8', '3.8/4.0', 'A+', '95%', 'First Class Honours'],\n})\n\n/**\n * A zod schema for an education item.\n */\nexport const EducationItemSchema = z.object({\n // required fields\n area: AreaSchema,\n institution: InstitutionSchema,\n degree: DegreeOptionSchema,\n startDate: DateSchema('startDate'),\n\n // optional fields\n courses: nullifySchema(CoursesSchema),\n endDate: nullifySchema(DateSchema('endDate')),\n summary: nullifySchema(SummarySchema),\n score: nullifySchema(ScoreSchema),\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for education.\n */\nexport const EducationSchema = z.object({\n education: z\n .array(EducationItemSchema, {\n error: (issue) => {\n if (issue.input === undefined) {\n return {\n message: 'education is required.',\n }\n }\n\n return {\n message: issue.message,\n }\n },\n })\n .meta({\n title: 'Education',\n description: joinNonEmptyString(\n [\n 'The education section contains your academic background,',\n 'including degrees, institutions, and relevant coursework.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { KeywordsSchema, NameSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for an interest name.\n */\nexport const InterestNameSchema = NameSchema('name').describe(\n 'The name of the interest.'\n)\n\n/**\n * A zod schema for an interest item.\n */\nexport const InterestItemSchema = z.object({\n // required fields\n name: InterestNameSchema,\n\n // optional fields\n keywords: nullifySchema(KeywordsSchema),\n})\n\n/**\n * A zod schema for interests.\n */\nexport const InterestsSchema = z.object({\n interests: z\n .array(InterestItemSchema)\n .nullish()\n .meta({\n title: 'Interests',\n description: joinNonEmptyString(\n [\n 'The interests section contains your personal interests and hobbies,',\n 'including activities and topics you are passionate about.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n FluencyOptionSchema,\n KeywordsSchema,\n LanguageOptionSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a language item.\n */\nexport const LanguageItemSchema = z.object({\n // required fields\n fluency: FluencyOptionSchema,\n language: LanguageOptionSchema,\n\n // optional fields\n keywords: nullifySchema(KeywordsSchema),\n})\n\n/**\n * A zod schema for languages.\n */\nexport const LanguagesSchema = z.object({\n languages: z\n .array(LanguageItemSchema)\n .nullish()\n .meta({\n title: 'Languages',\n description: joinNonEmptyString(\n [\n 'The languages section contains your language proficiencies,',\n 'including fluency levels and related skills.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { CountryOptionSchema, SizedStringSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a city.\n */\nexport const CitySchema = SizedStringSchema('city', 2, 64).meta({\n title: 'City',\n description: 'The city where you are located.',\n examples: ['San Francisco', 'New York', 'London', 'Tokyo'],\n})\n\n/**\n * A zod schema for an address.\n */\nexport const AddressSchema = SizedStringSchema('address', 4, 256).meta({\n title: 'Address',\n description: 'Your full address including street, apartment, etc.',\n examples: [\n '123 Main Street, Apt 4B',\n '456 Oak Avenue',\n '789 Pine Road, Suite 100',\n ],\n})\n\n/**\n * A zod schema for a postal code.\n */\nexport const PostalCodeSchema = SizedStringSchema('postalCode', 2, 16).meta({\n title: 'Postal Code',\n description: 'Your postal or ZIP code.',\n examples: ['94102', '10001', 'SW1A 1AA', '100-0001'],\n})\n\n/**\n * A zod schema for a region.\n */\nexport const RegionSchema = SizedStringSchema('region', 2, 64).meta({\n title: 'Region',\n description: 'Your state, province, or region.',\n examples: ['California', 'New York', 'England', 'Tokyo'],\n})\n\n/**\n * A zod schema for a location item.\n */\nexport const LocationItemSchema = z.object({\n // required fields\n city: CitySchema,\n\n // optional fields\n address: nullifySchema(AddressSchema),\n country: nullifySchema(CountryOptionSchema),\n postalCode: nullifySchema(PostalCodeSchema),\n region: nullifySchema(RegionSchema),\n})\n\n/**\n * A zod schema for location.\n */\nexport const LocationSchema = z.object({\n location: LocationItemSchema.nullish().meta({\n title: 'Location',\n description: joinNonEmptyString(\n [\n 'The location section contains your geographical information,',\n 'such as city, address, country, and postal code.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n NetworkOptionSchema,\n SizedStringSchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a username.\n */\nexport const UsernameSchema = SizedStringSchema('username', 2, 64).meta({\n title: 'Username',\n description: 'Your username or handle on the social network.',\n examples: ['john_doe', 'jane.smith', 'dev_engineer', 'designer_123'],\n})\n\n/**\n * A zod schema for a profile item.\n */\nexport const ProfileItemSchema = z.object({\n // required fields\n network: NetworkOptionSchema,\n username: UsernameSchema,\n\n // optional fields\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for profiles.\n */\nexport const ProfilesSchema = z.object({\n profiles: z\n .array(ProfileItemSchema)\n .nullish()\n .meta({\n title: 'Profiles',\n description: joinNonEmptyString(\n [\n 'The profiles section contains your online presence,',\n 'including social media and professional network profiles.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n KeywordsSchema,\n NameSchema,\n SizedStringSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a project name.\n */\nexport const ProjectNameSchema = NameSchema('name').describe(\n 'The name of the project.'\n)\n\n/**\n * A zod schema for a project description.\n */\nexport const ProjectDescriptionSchema = SizedStringSchema(\n 'description',\n 4,\n 128\n).meta({\n title: 'Description',\n description: 'A detailed description of the project and your role.',\n examples: [\n 'Led development of a full-stack web application',\n 'Designed and implemented REST API endpoints',\n 'Managed team of 5 developers for mobile app development',\n ],\n})\n\n/**\n * A zod schema for a project item.\n */\nexport const ProjectItemSchema = z.object({\n // required fields\n name: ProjectNameSchema,\n startDate: DateSchema('startDate'),\n summary: SummarySchema,\n\n // optional fields\n description: nullifySchema(ProjectDescriptionSchema),\n endDate: nullifySchema(DateSchema('endDate')),\n keywords: nullifySchema(KeywordsSchema),\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for projects.\n */\nexport const ProjectsSchema = z.object({\n projects: z\n .array(ProjectItemSchema)\n .nullish()\n .meta({\n title: 'Projects',\n description: joinNonEmptyString(\n [\n 'The projects section contains your personal and professional projects,',\n 'including technical details, timelines, and outcomes.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n NameSchema,\n OrganizationSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a publication name.\n */\nexport const PublicationNameSchema = NameSchema('name').describe(\n 'The name of the publication.'\n)\n\n/**\n * A zod schema for a publisher.\n */\nexport const PublisherSchema = OrganizationSchema('publisher').meta({\n title: 'Publisher',\n description: 'The organization that published the work.',\n examples: ['ACM', 'IEEE', 'Springer', 'Nature Publishing Group'],\n})\n\n/**\n * A zod schema for a publication item.\n */\nexport const PublicationItemSchema = z.object({\n // required fields\n name: PublicationNameSchema,\n publisher: PublisherSchema,\n\n // optional fields\n releaseDate: nullifySchema(DateSchema('Release date')),\n summary: nullifySchema(SummarySchema),\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for publications.\n */\nexport const PublicationsSchema = z.object({\n publications: z\n .array(PublicationItemSchema)\n .nullish()\n .meta({\n title: 'Publications',\n description: joinNonEmptyString(\n [\n 'The publications section contains your academic and professional publications,',\n 'including papers, articles, and research works.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n EmailSchema,\n NameSchema,\n PhoneSchema,\n SizedStringSchema,\n SummarySchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a reference name.\n */\nexport const ReferenceNameSchema = NameSchema('name').describe(\n 'The name of the reference.'\n)\n\n/**\n * A zod schema for a relationship.\n */\nexport const RelationshipSchema = SizedStringSchema(\n 'relationship',\n 2,\n 128\n).meta({\n title: 'Relationship',\n description: 'Your professional relationship with the reference.',\n examples: ['Former Manager', 'Colleague', 'Professor', 'Client'],\n})\n\n/**\n * A zod schema for a reference item.\n */\nexport const ReferenceItemSchema = z.object({\n // required fields\n name: ReferenceNameSchema,\n summary: SummarySchema,\n\n // optional fields\n email: nullifySchema(EmailSchema),\n phone: nullifySchema(PhoneSchema),\n relationship: nullifySchema(RelationshipSchema),\n})\n\n/**\n * A zod schema for references.\n */\nexport const ReferencesSchema = z.object({\n references: z\n .array(ReferenceItemSchema)\n .nullish()\n .meta({\n title: 'References',\n description: joinNonEmptyString(\n [\n 'The references section contains your professional references,',\n 'including contact information and relationships.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { KeywordsSchema, LevelOptionSchema, NameSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a skill name.\n */\nexport const SkillNameSchema = NameSchema('name').describe(\n 'The name of the skill.'\n)\n\n/**\n * A zod schema for a skill item.\n */\nexport const SkillItemSchema = z.object({\n // required fields\n level: LevelOptionSchema,\n name: SkillNameSchema,\n\n // optional fields\n keywords: nullifySchema(KeywordsSchema),\n})\n\n/**\n * A zod schema for skills.\n */\nexport const SkillsSchema = z.object({\n skills: z\n .array(SkillItemSchema)\n .nullish()\n .meta({\n title: 'Skills',\n description: joinNonEmptyString(\n [\n 'The skills section contains your technical and professional skills,',\n 'including proficiency levels and related keywords.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n OrganizationSchema,\n SizedStringSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a volunteer organization.\n */\nexport const VolunteerOrganizationSchema = OrganizationSchema(\n 'organization'\n).meta({\n title: 'Organization',\n description: 'The organization where you volunteered.',\n examples: [\n 'Red Cross',\n 'Habitat for Humanity',\n 'Local Food Bank',\n 'Animal Shelter',\n ],\n})\n\n/**\n * A zod schema for a volunteer position.\n */\nexport const VolunteerPositionSchema = SizedStringSchema(\n 'position',\n 2,\n 64\n).meta({\n title: 'Position',\n description: 'Your role or position in the volunteer organization.',\n examples: ['Event Coordinator', 'Tutor', 'Fundraiser', 'Board Member'],\n})\n\n/**\n * A zod schema for a volunteer item.\n */\nexport const VolunteerItemSchema = z.object({\n // required fields\n organization: VolunteerOrganizationSchema,\n position: VolunteerPositionSchema,\n startDate: DateSchema('startDate'),\n summary: SummarySchema,\n\n // optional fields\n endDate: nullifySchema(DateSchema('endDate')),\n url: nullifySchema(UrlSchema),\n})\n/**\n * A zod schema for volunteer.\n */\nexport const VolunteerSchema = z.object({\n volunteer: z\n .array(VolunteerItemSchema)\n .nullish()\n .meta({\n title: 'Volunteer',\n description: joinNonEmptyString(\n [\n 'The volunteer section contains your community service and volunteer work,',\n 'including organizations, roles, and contributions.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n KeywordsSchema,\n OrganizationSchema,\n SizedStringSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a company name.\n */\nexport const CompanyNameSchema = OrganizationSchema('name').meta({\n title: 'Name',\n description: 'The name of the company or organization you worked for.',\n examples: ['Google', 'Microsoft', 'Apple', 'Amazon'],\n})\n\n/**\n * A zod schema for a position.\n */\nexport const PositionSchema = SizedStringSchema('position', 2, 64).meta({\n title: 'Position',\n description: 'Your job title or position at the company.',\n examples: [\n 'Software Engineer',\n 'Product Manager',\n 'Data Scientist',\n 'UX Designer',\n ],\n})\n\n/**\n * A zod schema for a work item.\n */\nexport const WorkItemSchema = z.object({\n // required fields\n name: CompanyNameSchema,\n position: PositionSchema,\n startDate: DateSchema('startDate'),\n summary: SummarySchema,\n\n // optional fields\n endDate: nullifySchema(DateSchema('endDate')),\n keywords: nullifySchema(KeywordsSchema),\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for work.\n */\nexport const WorkSchema = z.object({\n work: z\n .array(WorkItemSchema)\n .nullish()\n .meta({\n title: 'Work',\n description: joinNonEmptyString(\n [\n 'The work section contains your professional experience,',\n 'including job titles, companies, and responsibilities.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { AwardsSchema } from './awards'\nimport { BasicsSchema } from './basics'\nimport { CertificatesSchema } from './certificates'\nimport { EducationSchema } from './education'\nimport { InterestsSchema } from './interests'\nimport { LanguagesSchema } from './languages'\nimport { LocationSchema } from './location'\nimport { ProfilesSchema } from './profiles'\nimport { ProjectsSchema } from './projects'\nimport { PublicationsSchema } from './publications'\nimport { ReferencesSchema } from './references'\nimport { SkillsSchema } from './skills'\nimport { VolunteerSchema } from './volunteer'\nimport { WorkSchema } from './work'\n\n/**\n * A zod schema for a resume, merging all section schemas.\n */\nexport const ContentSchema = z.object({\n content: z.object(\n {\n // required sections\n ...BasicsSchema.shape,\n ...EducationSchema.shape,\n\n // optional sections\n ...AwardsSchema.shape,\n ...CertificatesSchema.shape,\n ...InterestsSchema.shape,\n ...LanguagesSchema.shape,\n ...LocationSchema.shape,\n ...ProfilesSchema.shape,\n ...ProjectsSchema.shape,\n ...PublicationsSchema.shape,\n ...ReferencesSchema.shape,\n ...SkillsSchema.shape,\n ...VolunteerSchema.shape,\n ...WorkSchema.shape,\n },\n {\n error: (issue) => {\n if (issue.input === undefined) {\n return {\n message: 'content is required.',\n }\n }\n\n return {\n message: issue.message,\n }\n },\n }\n ),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { FontspecNumbersOptionSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for validating LaTeX configuration.\n *\n * Validates LaTeX-specific settings including font specification\n * options like number styling.\n */\nexport const LatexSchema = z.object({\n advanced: z\n .object({\n fontspec: z\n .object({\n numbers: nullifySchema(FontspecNumbersOptionSchema),\n })\n .nullish(),\n })\n .nullish()\n .meta({\n title: 'Advanced',\n description: joinNonEmptyString(\n [\n 'The Advanced section contains advanced latex settings,',\n 'including fontspec package configurations.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { startCase } from 'lodash-es'\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { SizedStringSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\ntype Position = 'top' | 'bottom' | 'left' | 'right'\n\n/**\n * Creates an error message for a marginSizeSchema\n *\n * @param options - The options to create a message for.\n * @param messagePrefix - The message prefix to use for the message.\n * @returns A message for an option schema.\n */\nexport function marginSizeSchemaMessage(position: Position) {\n return joinNonEmptyString(\n [\n `invalid ${position} margin size,`,\n `${position} margin must be a positive number followed by`,\n `\"cm\", \"pt\" or \"in\", eg: \"2.5cm\", \"1in\", \"72pt\"`,\n ],\n ' '\n )\n}\n\n/**\n * Creates a zod schema for a margin size.\n *\n * Accepts positive numbers followed by valid units: cm, pt, or in\n * Examples: \"2.5cm\", \"1in\", \"72pt\"\n */\nexport function MarginSizeSchema(position: Position) {\n // We could simply use `z.string()` here with a custom check, but we use\n // `SizedStringSchema` in order to get best JSON Schema capabilities.\n return (\n SizedStringSchema(`${position} margin`, 2, 32)\n // Please note that here we added a custom check, inside which we will\n // override `ctx.issues`, therefore marginSizeSchema will always return one\n // and only one precise issue if the value is not valid.\n .check((ctx) => {\n if (ctx.value.length < 2) {\n ctx.issues = [\n {\n code: 'too_small',\n input: ctx.value,\n minimum: 2,\n message: `${position} margin should be 2 characters or more.`,\n origin: 'string',\n },\n ]\n\n return\n }\n\n if (ctx.value.length > 32) {\n ctx.issues = [\n {\n code: 'too_big',\n input: ctx.value,\n maximum: 32,\n message: `${position} margin should be 32 characters or less.`,\n origin: 'string',\n },\n ]\n\n return\n }\n\n if (!ctx.value.match(/^\\d+(\\.\\d+)?(cm|pt|in)$/)) {\n ctx.issues = [\n {\n code: 'invalid_value',\n input: ctx.value,\n message: marginSizeSchemaMessage(position),\n origin: 'string',\n values: [ctx.value],\n },\n ]\n }\n })\n .meta({\n title: startCase(`${position} margin size`),\n description: joinNonEmptyString(\n [\n 'A positive number followed by valid units: cm, pt, or in.',\n 'Examples: \"2.5cm\", \"1in\", \"72pt\".',\n ],\n ' '\n ),\n examples: ['2.5cm', '1in', '72pt', '0.5cm', '12pt'],\n })\n )\n}\n\n/**\n * A zod schema for validating margin configuration.\n *\n * Validates that all margin fields (top, bottom, left, right) are strings\n * representing valid CSS length values (e.g., \"1cm\", \"10pt\").\n */\nexport const MarginsSchema = z.object({\n margins: z\n .object({\n top: nullifySchema(MarginSizeSchema('top')),\n bottom: nullifySchema(MarginSizeSchema('bottom')),\n left: nullifySchema(MarginSizeSchema('left')),\n right: nullifySchema(MarginSizeSchema('right')),\n })\n .nullish()\n .meta({\n title: 'Margins',\n description: joinNonEmptyString(\n [\n 'The margins section contains page margin settings,',\n 'including top, bottom, left, and right margins.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { nullifySchema } from '../utils'\nimport { MarginsSchema } from './margins'\n\n/**\n * A zod schema for the show page numbers setting.\n */\nexport const ShowPageNumbersSchema = z.boolean().meta({\n title: 'Show Page Numbers',\n description: 'Whether to show page numbers on the page.',\n})\n\n/**\n * A zod schema for validating page configuration.\n *\n * Validates page-related settings such as whether to show page numbers and margins.\n */\nexport const PageSchema = z.object({\n page: z\n .object({\n showPageNumbers: nullifySchema(ShowPageNumbersSchema),\n ...MarginsSchema.shape,\n })\n .nullish()\n .meta({\n title: 'Page',\n description: joinNonEmptyString(\n [\n 'The page section contains page display settings,',\n 'including whether to show page numbers and margins.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { ORDERABLE_SECTION_IDS } from '@/models'\nimport { optionSchema, SizedStringSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for an alias name.\n *\n * @param section - The name of the section to create an alias for.\n * @returns A zod schema for an alias name.\n */\nexport function AliasNameSchema(section: string) {\n return SizedStringSchema(`${section} alias`, 2, 128).meta({\n title: section,\n description: `The name of the alias for ${section} section.`,\n })\n}\n\n/**\n * A zod schema for section aliases configuration.\n */\nexport const AliasesSchema = z.object({\n aliases: z\n .object({\n basics: nullifySchema(AliasNameSchema('basics')),\n education: nullifySchema(AliasNameSchema('education')),\n work: nullifySchema(AliasNameSchema('work')),\n volunteer: nullifySchema(AliasNameSchema('volunteer')),\n awards: nullifySchema(AliasNameSchema('awards')),\n certificates: nullifySchema(AliasNameSchema('certificates')),\n publications: nullifySchema(AliasNameSchema('publications')),\n skills: nullifySchema(AliasNameSchema('skills')),\n languages: nullifySchema(AliasNameSchema('languages')),\n interests: nullifySchema(AliasNameSchema('interests')),\n references: nullifySchema(AliasNameSchema('references')),\n projects: nullifySchema(AliasNameSchema('projects')),\n })\n .nullish()\n .meta({\n title: 'Aliases',\n description: 'Section alias customization settings.',\n }),\n})\n\n/**\n * A zod schema for section order configuration.\n */\nexport const OrderSchema = z.object({\n order: z\n .array(optionSchema(ORDERABLE_SECTION_IDS, 'section'))\n .nullish()\n .meta({\n title: 'Order',\n description: 'Custom order for sections in the final output.',\n }),\n})\n\n/**\n * A zod schema for section alias configuration.\n */\nexport const SectionsSchema = z.object({\n sections: z\n .object({\n ...AliasesSchema.shape,\n ...OrderSchema.shape,\n })\n .nullish()\n .meta({\n title: 'Sections',\n description: 'Section customization settings.',\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { TemplateOptionSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for validating template configuration.\n *\n * Validates that the template field contains a valid template option.\n */\nexport const TemplateSchema = z.object({\n template: nullifySchema(TemplateOptionSchema).meta({\n title: 'Template',\n description: joinNonEmptyString(\n [\n 'The template section contains the resume template selection,',\n 'determining the overall visual style and layout.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { FontSizeOptionSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for link styling settings.\n */\nconst TypographyLinksSchema = z.object({\n links: z\n .object({\n underline: z\n .boolean()\n .default(false)\n .meta({\n title: 'Underline Links',\n description: 'Whether to underline links in the document.',\n examples: [false, true],\n }),\n })\n .nullish()\n .meta({\n title: 'Typography Links',\n description: 'Link styling settings for typography.',\n }),\n})\n\n/**\n * A zod schema for typography settings.\n */\nexport const TypographySchema = z.object({\n typography: z\n .object({\n fontSize: nullifySchema(FontSizeOptionSchema),\n ...TypographyLinksSchema.shape,\n })\n .nullish()\n .meta({\n title: 'Typography',\n description: joinNonEmptyString(\n [\n 'The typography section contains font settings,',\n 'including font size options and link styling.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { LatexSchema } from './latex'\nimport { PageSchema } from './page'\nimport { SectionsSchema } from './sections'\nimport { TemplateSchema } from './template'\nimport { TypographySchema } from './typography'\n\n/**\n * A zod schema that combines all layout-related configurations.\n *\n * This schema validates the entire layout object by intersecting all individual\n * schemas (template, typography, locale, and page) to ensure a\n * complete and valid layout configuration.\n */\n// Engine-specific schemas\nconst LatexLayoutSchema = z\n .object({\n engine: z.literal('latex'),\n ...PageSchema.shape,\n ...SectionsSchema.shape,\n ...TemplateSchema.shape,\n ...TypographySchema.shape,\n ...LatexSchema.shape,\n })\n .meta({ title: 'LaTeX Engine Layout' })\n\nconst MarkdownLayoutSchema = z\n .object({\n engine: z.literal('markdown'),\n ...SectionsSchema.shape,\n })\n .meta({ title: 'Markdown Engine Layout' })\n\nexport const LayoutsSchema = z.object({\n layouts: z\n .array(\n z.discriminatedUnion('engine', [LatexLayoutSchema, MarkdownLayoutSchema])\n )\n .nullish()\n .meta({\n title: 'Layouts',\n description: joinNonEmptyString(\n [\n 'Multiple output layouts configuration as a discriminated union array,',\n 'supporting engines like \"latex\" and \"markdown\".',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { LocaleLanguageOptionSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for validating locale configuration.\n *\n * Validates that the language field contains a supported locale language\n * option.\n */\nexport const LocaleSchema = z.object({\n locale: z\n .object({\n language: nullifySchema(LocaleLanguageOptionSchema),\n })\n .nullish()\n .meta({\n title: 'Locale',\n description: joinNonEmptyString(\n [\n 'Top-level locale language settings,',\n 'determining the language used for the resume.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { ContentSchema } from './content'\nimport { LayoutsSchema } from './layouts'\nimport { LocaleSchema } from './locale'\n\n/**\n * A zod schema for a yaml resume.\n */\nexport const ResumeSchema = z\n .object({\n ...ContentSchema.shape,\n ...LocaleSchema.shape,\n ...LayoutsSchema.shape,\n })\n .meta({\n $id: 'https://yamlresume.dev/schema.json',\n title: 'YAMLResume Schema',\n description: 'JSON Schema for YAMLResume resume format.',\n version: '0.8.0',\n license: 'MIT',\n keywords: [\n 'Resume',\n 'CV',\n 'YAML',\n 'LaTeX',\n 'PDF',\n 'YAMLResume',\n 'Markdown',\n ],\n })\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/array.ts","../src/utils/object.ts","../src/utils/date.ts","../src/utils/string.ts","../src/compiler/codegen/html.ts","../src/compiler/codegen/latex.ts","../src/compiler/parser/markdown.ts","../src/errors/error.ts","../src/models/country.ts","../src/models/options.ts","../src/models/resume.ts","../src/translations/options.ts","../src/translations/template.ts","../src/preprocess/transform.ts","../src/renderer/base.ts","../src/renderer/html/styles/calm.css","../src/renderer/html/styles/reset.css","../src/renderer/html/renderer.ts","../src/renderer/latex/preamble.ts","../src/renderer/latex/moderncv.ts","../src/renderer/markdown/renderer.ts","../src/renderer/resume.ts","../src/schema/primitives.ts","../src/schema/utils.ts","../src/schema/content/awards.ts","../src/schema/content/basics.ts","../src/schema/content/certificates.ts","../src/schema/content/education.ts","../src/schema/content/interests.ts","../src/schema/content/languages.ts","../src/schema/content/location.ts","../src/schema/content/profiles.ts","../src/schema/content/projects.ts","../src/schema/content/publications.ts","../src/schema/content/references.ts","../src/schema/content/skills.ts","../src/schema/content/volunteer.ts","../src/schema/content/work.ts","../src/schema/content/content.ts","../src/schema/layouts/common/margins.ts","../src/schema/layouts/common/sections.ts","../src/schema/layouts/html/template.ts","../src/schema/layouts/html/typography.ts","../src/schema/layouts/html/index.ts","../src/schema/layouts/latex/advanced.ts","../src/schema/layouts/latex/page.ts","../src/schema/layouts/latex/template.ts","../src/schema/layouts/latex/typography.ts","../src/schema/layouts/latex/index.ts","../src/schema/layouts/markdown/index.ts","../src/schema/layouts/layouts.ts","../src/schema/locale/locale.ts","../src/schema/resume.ts"],"names":["mergeArrayWithOrder","customOrder","defaultOrder","validItems","deduplicatedCustomOrder","seen","item","remainingItems","isEmptyValue","value","removeKeysFromObject","obj","keysToRemove","transform","result","key","isObject","collectAllKeys","keys","visited","parseDate","dateStr","date","localizeDate","language","options","dateObj","getDateRange","startDate","endDate","ONE_DAY","nowInUTCSeconds","epochSecondsToLocaleDateString","epochTime","locale","milliSecondsToSeconds","ms","escapeHtml","text","map","m","escapeLatex","rawEscapeLatex","isEmptyString","showIf","predicate","content","showIfNotEmpty","joinNonEmptyString","codes","separator","code","toCodeBlock","lang","HtmlCodeGenerator","node","context","nodeToHTML","bulletListNodeToHTML","docNodeToHTML","listItemNodeToHTML","orderedListNodeToHTML","paragraphNodeToHTML","textNodeToHTML","fragmentToHTML","escapedText","mark","applyMarkToText","_context","href","target","className","fragment","LatexCodeGenerator","nodeToTeX","bulletListNodeToTeX","docNodeToTeX","listItemNodeToTeX","orderedListNodeToTeX","paragraphNodeToTeX","textNodeToTeX","fragmentToTeX","itemContent","MarkdownParser","input","ast","unified","remarkParse","marks","child","boldMark","processChildrenWithMarks","italicMark","linkMark","children","transformedNodes","ErrorCategory","ErrorType","YAMLResumeError","params","error","message","_","COUNTRY_OPTIONS","EnglishCountryNames","SimplifiedChineseCountryNames","TraditionalChineseCountryHKNames","TraditionalChineseCountryTWNames","SpanishCountryNames","FrenchCountryNames","NorwegianCountryNames","DEGREE_OPTIONS","FLUENCY_OPTIONS","LATEX_FONT_SIZE_OPTIONS","HTML_FONT_SIZE_OPTIONS","HTML_TEMPLATE_OPTIONS","LATEX_FONTSPEC_NUMBERS_OPTIONS","LATEX_TEMPLATE_OPTIONS","LANGUAGE_OPTIONS","LEVEL_OPTIONS","LOCALE_LANGUAGE_OPTIONS","NETWORK_OPTIONS","SECTION_IDS","ORDERABLE_SECTION_IDS","DEFAULT_SECTIONS_ORDER","getLatexTemplateDetail","template","templateDetails","getHtmlTemplateDetail","RESUME_SECTION_ITEMS","DEFAULT_RESUME_CONTENT","FILLED_RESUME_CONTENT","DEFAULT_TOP_BOTTOM_MARGIN","DEFAULT_LEFT_RIGHT_MARGIN","MARGIN_OPTIONS","getLocaleLanguageDetail","localeLanguage","localeLanguageDetails","DEFAULT_HTML_LAYOUT","DEFAULT_MARKDOWN_LAYOUT","DEFAULT_LATEX_LAYOUT","DEFAULT_RESUME_LAYOUTS","DEFAULT_RESUME_LOCALE","DEFAULT_RESUME","FILLED_RESUME","getOptionTranslation","category","option","get","PUNCTUATIONS","TERMS","getTemplateTranslations","replaceBlankLinesWithPercent","normalizeResumeContentSections","resume","clonedResume","cloneDeep","normalizedResumeContent","resumeWithDefaults","sectionKey","sectionValue","propKey","transformResumeValues","escapeFunc","transformResumeSectionValues","index","transformResumeSectionComputedValues","sectionResumeComputed","sectionResumeItem","transformEducationCourses","transformEducationDegreeAreaAndScore","colon","comma","score","degree","transformKeywords","section","isArray","transformDate","transformEndDate","transformLanguage","transformLocation","address","city","region","postalCode","country","fullAddress","transformBasicsUrl","basicsLink","transformProfileUrls","getFaIcon","network","capitalize","transformSkills","level","transformProfileLinks","link","transformSectionNames","layoutIndex","_summaryParser","translations","sectionName","sectionId","sectionAlias","transformSummary","summaryParser","layout","typographyContext","codeGenerator","processOutput","output","summary","transformResumeContent","tranformFunc","transformResumeLocaleWithDefaultValues","transformResumeLayoutsWithDefaultValues","normalizedLayouts","merge","transformResumeLayoutLaTeX","numbers","transformResumeLayout","transformFunc","transformResume","Renderer","order","sectionRenderers","renderedSections","rendered","calm_default","reset_default","HtmlRenderer","fontSize","trimCss","css","name","headline","email","phone","url","contactItems","sectionNames","profiles","username","education","terms","educationEntries","institution","dateRange","courses","degreeAreaAndScore","institutionTitle","work","workEntries","position","keywords","organizationTitle","languages","languageItems","fluency","skills","skillItems","awards","awardEntries","awarder","title","certificates","certificateEntries","issuer","publications","publicationEntries","publisher","releaseDate","publicationTitle","references","referenceEntries","relationship","referenceTitle","projects","projectEntries","description","projectTitle","interests","interestItems","volunteer","volunteerEntries","organization","beautify","normalizeUnit","ModerncvBase","style","page","margins","showPageNumbers","t","b","r","linuxLibertineFont","linuxLibertineOFont","urls","ModerncvBankingRenderer","ModerncvCasualRenderer","ModerncvClassicRenderer","MarkdownRenderer","contactInfo","profileLinks","sections","LATEX_RESUME_RENDERER_MAP","getResumeRenderer","optionSchemaMessage","messagePrefix","optionSchema","z","issue","startCase","SizedStringSchema","min","max","CountryOptionSchema","DateSchema","ctx","DegreeOptionSchema","EmailSchema","FluencyOptionSchema","FontspecNumbersOptionSchema","FontSizeOptionSchema","HtmlFontSizeOptionSchema","HtmlTemplateOptionSchema","KeywordsSchema","LanguageOptionSchema","LatexTemplateOptionSchema","LocaleLanguageOptionSchema","LevelOptionSchema","NameSchema","NetworkOptionSchema","phoneNumberRegex","PhoneSchema","SummarySchema","OrganizationSchema","UrlSchema","nullifySchema","schema","nullishMeta","AwarderSchema","TitleSchema","AwardItemSchema","AwardsSchema","HeadlineSchema","BasicsItemSchema","BasicsSchema","IssuerSchema","CertificateItemSchema","CertificatesSchema","AreaSchema","CoursesSchema","InstitutionSchema","ScoreSchema","EducationItemSchema","EducationSchema","InterestNameSchema","InterestItemSchema","InterestsSchema","LanguageItemSchema","LanguagesSchema","CitySchema","AddressSchema","PostalCodeSchema","RegionSchema","LocationItemSchema","LocationSchema","UsernameSchema","ProfileItemSchema","ProfilesSchema","ProjectNameSchema","ProjectDescriptionSchema","ProjectItemSchema","ProjectsSchema","PublicationNameSchema","PublisherSchema","PublicationItemSchema","PublicationsSchema","ReferenceNameSchema","RelationshipSchema","ReferenceItemSchema","ReferencesSchema","SkillNameSchema","SkillItemSchema","SkillsSchema","VolunteerOrganizationSchema","VolunteerPositionSchema","VolunteerItemSchema","VolunteerSchema","CompanyNameSchema","PositionSchema","WorkItemSchema","WorkSchema","ContentSchema","marginSizeSchemaMessage","MarginSizeSchema","MarginsSchema","AliasNameSchema","AliasesSchema","OrderSchema","SectionsSchema","HtmlTemplateSchema","HtmlTypographySchema","HtmlLayoutSchema","LatexAdvancedSchema","ShowPageNumbersSchema","LatexPageSchema","LatexTemplateSchema","LinksSchema","LatexTypographySchema","LatexLayoutSchema","MarkdownLayoutSchema","LayoutsSchema","LocaleSchema","ResumeSchema"],"mappings":"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AAlD,CAAAA,CAWP,IAAA,CAAK,KAAO,iBAAA,CACZ,IAAA,CAAK,MAAQiD,CAAAA,CAAM,MACrB,CAtBO,KAuBT,EChLO,IAAMG,GAAkB,CAC7B,aAAA,CACA,eAAA,CACA,SAAA,CACA,SAAA,CACA,gBAAA,CACA,UACA,QAAA,CACA,UAAA,CACA,YAAA,CACA,qBAAA,CACA,WAAA,CACA,SAAA,CACA,QACA,WAAA,CACA,SAAA,CACA,aACA,SAAA,CACA,YAAA,CACA,WACA,SAAA,CACA,SAAA,CACA,QAAA,CACA,OAAA,CACA,SAAA,CACA,QAAA,CACA,UACA,kCAAA,CACA,wBAAA,CACA,UAAA,CACA,eAAA,CACA,QAAA,CACA,gCAAA,CACA,SACA,UAAA,CACA,cAAA,CACA,SAAA,CACA,UAAA,CACA,UAAA,CACA,QAAA,CACA,aACA,gBAAA,CACA,0BAAA,CACA,OACA,OAAA,CACA,OAAA,CACA,mBACA,yBAAA,CACA,UAAA,CACA,SAAA,CACA,OAAA,CACA,cAAA,CACA,YAAA,CACA,8BACA,SAAA,CACA,MAAA,CACA,YAAA,CACA,QAAA,CACA,gBAAA,CACA,kCAAA,CACA,UACA,UAAA,CACA,UAAA,CACA,oBAAA,CACA,YAAA,CACA,SAAA,CACA,OAAA,CACA,cACA,mBAAA,CACA,SAAA,CACA,UACA,UAAA,CACA,kBAAA,CACA,gBACA,cAAA,CACA,SAAA,CACA,QAAA,CACA,eAAA,CACA,kBAAA,CACA,6BAAA,CACA,QACA,YAAA,CACA,SAAA,CACA,SAAA,CACA,OAAA,CACA,WAAA,CACA,QAAA,CACA,YACA,SAAA,CACA,YAAA,CACA,MAAA,CACA,WAAA,CACA,uBAAA,CACA,QAAA,CACA,gBACA,QAAA,CACA,OAAA,CACA,oCACA,UAAA,CACA,WAAA,CACA,UACA,SAAA,CACA,OAAA,CACA,WAAA,CACA,MAAA,CACA,MAAA,CACA,SAAA,CACA,SACA,OAAA,CACA,SAAA,CACA,OAAA,CACA,QAAA,CACA,QAAA,CACA,YAAA,CACA,QACA,UAAA,CACA,QAAA,CACA,QAAA,CACA,YAAA,CACA,MAAA,CACA,QAAA,CACA,UACA,SAAA,CACA,SAAA,CACA,QACA,eAAA,CACA,WAAA,CACA,aACA,OAAA,CACA,YAAA,CACA,QAAA,CACA,UAAA,CACA,UAAA,CACA,MAAA,CACA,QACA,eAAA,CACA,kBAAA,CACA,YAAA,CACA,YAAA,CACA,WAAA,CACA,SAAA,CACA,SACA,YAAA,CACA,SAAA,CACA,QAAA,CACA,UAAA,CACA,YAAA,CACA,YAAA,CACA,UACA,YAAA,CACA,SAAA,CACA,UACA,OAAA,CACA,OAAA,CACA,cACA,eAAA,CACA,aAAA,CACA,WAAA,CACA,OAAA,CACA,SAAA,CACA,MAAA,CACA,iBACA,aAAA,CACA,iBAAA,CACA,0BAAA,CACA,QAAA,CACA,MAAA,CACA,UAAA,CACA,QACA,gCAAA,CACA,QAAA,CACA,kBAAA,CACA,UAAA,CACA,MAAA,CACA,aAAA,CACA,kBACA,QAAA,CACA,UAAA,CACA,cACA,OAAA,CACA,SAAA,CACA,UACA,QAAA,CACA,QAAA,CACA,cAAA,CACA,uBAAA,CACA,aAAA,CACA,2BAAA,CACA,mCACA,kBAAA,CACA,4BAAA,CACA,OAAA,CACA,YAAA,CACA,uBAAA,CACA,cAAA,CACA,UACA,QAAA,CACA,YAAA,CACA,cAAA,CACA,WAAA,CACA,2BAAA,CACA,UAAA,CACA,WACA,iBAAA,CACA,SAAA,CACA,eACA,eAAA,CACA,aAAA,CACA,cACA,OAAA,CACA,WAAA,CACA,OAAA,CACA,UAAA,CACA,gCAAA,CACA,WAAA,CACA,SACA,aAAA,CACA,OAAA,CACA,QAAA,CACA,YAAA,CACA,UAAA,CACA,UAAA,CACA,cACA,MAAA,CACA,SAAA,CACA,OAAA,CACA,qBAAA,CACA,SAAA,CACA,QAAA,CACA,eACA,0BAAA,CACA,QAAA,CACA,SACA,SAAA,CACA,sBAAA,CACA,iBACA,eAAA,CACA,sCAAA,CACA,SAAA,CACA,YAAA,CACA,SAAA,CACA,+BAAA,CACA,YACA,SAAA,CACA,0BAAA,CACA,qBAAA,CACA,2BAAA,CACA,gBAAA,CACA,OAAA,CACA,SACA,UACF,CAAA,CAMaC,EAAAA,CAA+C,CAC1D,WAAA,CAAa,aAAA,CACb,gBAAiB,eAAA,CACjB,OAAA,CAAS,UACT,OAAA,CAAS,SAAA,CACT,iBAAkB,gBAAA,CAClB,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,WACV,UAAA,CAAY,YAAA,CACZ,qBAAA,CAAuB,qBAAA,CACvB,SAAA,CAAW,WAAA,CACX,QAAS,SAAA,CACT,KAAA,CAAO,OAAA,CACP,SAAA,CAAW,WAAA,CACX,OAAA,CAAS,UACT,UAAA,CAAY,YAAA,CACZ,QAAS,SAAA,CACT,UAAA,CAAY,aACZ,QAAA,CAAU,UAAA,CACV,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,SAAA,CACT,OAAQ,QAAA,CACR,KAAA,CAAO,OAAA,CACP,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,SACR,OAAA,CAAS,SAAA,CACT,kCAAA,CAAoC,SAAA,CACpC,wBAAA,CAA0B,wBAAA,CAC1B,SAAU,UAAA,CACV,eAAA,CAAiB,eAAA,CACjB,MAAA,CAAQ,QAAA,CACR,gCAAA,CAAkC,iCAClC,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,UAAA,CACV,cAAA,CAAgB,cAAA,CAChB,QAAS,SAAA,CACT,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,UAAA,CACV,MAAA,CAAQ,SACR,YAAA,CAAc,YAAA,CACd,gBAAA,CAAkB,gBAAA,CAClB,0BAAA,CAA4B,0BAAA,CAC5B,KAAM,MAAA,CACN,KAAA,CAAO,QACP,KAAA,CAAO,OAAA,CACP,mBAAoB,kBAAA,CACpB,yBAAA,CAA2B,yBAAA,CAC3B,QAAA,CAAU,UAAA,CACV,OAAA,CAAS,UACT,KAAA,CAAO,OAAA,CACP,cAAA,CAAgB,cAAA,CAChB,YAAA,CAAc,YAAA,CACd,8BAA+B,6BAAA,CAC/B,OAAA,CAAS,SAAA,CACT,IAAA,CAAM,MAAA,CACN,YAAA,CAAS,aACT,MAAA,CAAQ,QAAA,CACR,iBAAkB,gBAAA,CAClB,kCAAA,CAAoC,mCACpC,OAAA,CAAS,SAAA,CACT,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,UAAA,CACV,qBAAsB,oBAAA,CACtB,YAAA,CAAc,YAAA,CACd,OAAA,CAAS,SAAA,CACT,KAAA,CAAO,QACP,aAAA,CAAe,aAAA,CACf,mBAAA,CAAqB,mBAAA,CACrB,OAAA,CAAS,SAAA,CACT,QAAS,SAAA,CACT,QAAA,CAAU,WACV,kBAAA,CAAoB,kBAAA,CACpB,gBAAiB,eAAA,CACjB,cAAA,CAAgB,cAAA,CAChB,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,SACR,eAAA,CAAiB,eAAA,CACjB,kBAAA,CAAoB,kBAAA,CACpB,6BAAA,CAA+B,6BAAA,CAC/B,MAAO,OAAA,CACP,YAAA,CAAc,YAAA,CACd,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,UACT,KAAA,CAAO,OAAA,CACP,UAAW,WAAA,CACX,MAAA,CAAQ,SACR,SAAA,CAAW,WAAA,CACX,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,YAAA,CACZ,KAAM,MAAA,CACN,SAAA,CAAW,WAAA,CACX,uBAAA,CAAyB,uBAAA,CACzB,MAAA,CAAQ,SACR,eAAA,CAAiB,eAAA,CACjB,MAAA,CAAQ,QAAA,CACR,KAAA,CAAO,OAAA,CACP,oCAAqC,mCAAA,CACrC,QAAA,CAAU,WACV,WAAA,CAAa,WAAA,CACb,QAAS,SAAA,CACT,OAAA,CAAS,SAAA,CACT,KAAA,CAAO,OAAA,CACP,SAAA,CAAW,YACX,IAAA,CAAM,MAAA,CACN,IAAA,CAAM,MAAA,CACN,OAAA,CAAS,SAAA,CACT,OAAQ,QAAA,CACR,KAAA,CAAO,OAAA,CACP,OAAA,CAAS,SAAA,CACT,KAAA,CAAO,QACP,MAAA,CAAQ,QAAA,CACR,OAAQ,QAAA,CACR,UAAA,CAAY,aACZ,KAAA,CAAO,OAAA,CACP,QAAA,CAAU,UAAA,CACV,MAAA,CAAQ,QAAA,CACR,OAAQ,QAAA,CACR,UAAA,CAAY,YAAA,CACZ,IAAA,CAAM,MAAA,CACN,MAAA,CAAQ,SACR,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,SAAA,CACT,MAAO,OAAA,CACP,aAAA,CAAe,gBACf,SAAA,CAAW,WAAA,CACX,WAAY,YAAA,CACZ,KAAA,CAAO,OAAA,CACP,UAAA,CAAY,YAAA,CACZ,MAAA,CAAQ,SACR,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,UAAA,CACV,IAAA,CAAM,MAAA,CACN,MAAO,OAAA,CACP,eAAA,CAAiB,eAAA,CACjB,kBAAA,CAAoB,kBAAA,CACpB,UAAA,CAAY,aACZ,UAAA,CAAY,YAAA,CACZ,UAAW,WAAA,CACX,OAAA,CAAS,UACT,MAAA,CAAQ,QAAA,CACR,UAAA,CAAY,YAAA,CACZ,OAAA,CAAS,SAAA,CACT,OAAQ,QAAA,CACR,QAAA,CAAU,UAAA,CACV,UAAA,CAAY,YAAA,CACZ,UAAA,CAAY,aACZ,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,YAAA,CACZ,OAAA,CAAS,SAAA,CACT,QAAS,SAAA,CACT,KAAA,CAAO,QACP,KAAA,CAAO,OAAA,CACP,YAAa,aAAA,CACb,eAAA,CAAiB,eAAA,CACjB,aAAA,CAAe,aAAA,CACf,SAAA,CAAW,YACX,KAAA,CAAO,OAAA,CACP,OAAA,CAAS,SAAA,CACT,IAAA,CAAM,MAAA,CACN,iBAAkB,gBAAA,CAClB,aAAA,CAAe,aAAA,CACf,iBAAA,CAAmB,iBAAA,CACnB,0BAAA,CAA4B,2BAC5B,MAAA,CAAQ,QAAA,CACR,KAAM,MAAA,CACN,QAAA,CAAU,WACV,KAAA,CAAO,OAAA,CACP,gCAAA,CAAkC,gCAAA,CAClC,MAAA,CAAQ,QAAA,CACR,mBAAoB,kBAAA,CACpB,QAAA,CAAU,UAAA,CACV,IAAA,CAAM,MAAA,CACN,WAAA,CAAa,cACb,iBAAA,CAAmB,iBAAA,CACnB,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,UAAA,CACV,cAAe,aAAA,CACf,KAAA,CAAO,QACP,OAAA,CAAS,SAAA,CACT,QAAS,SAAA,CACT,MAAA,CAAQ,QAAA,CACR,MAAA,CAAQ,QAAA,CACR,cAAA,CAAgB,eAChB,uBAAA,CAAyB,uBAAA,CACzB,aAAA,CAAe,aAAA,CACf,2BAAA,CAA6B,2BAAA,CAC7B,mCAAoC,kCAAA,CACpC,kBAAA,CAAoB,kBAAA,CACpB,4BAAA,CAA8B,4BAAA,CAC9B,KAAA,CAAO,QACP,YAAA,CAAc,YAAA,CACd,wBAAyB,uBAAA,CACzB,cAAA,CAAgB,eAChB,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,QAAA,CACR,UAAA,CAAY,YAAA,CACZ,eAAgB,cAAA,CAChB,SAAA,CAAW,WAAA,CACX,2BAAA,CAA6B,2BAAA,CAC7B,QAAA,CAAU,WACV,QAAA,CAAU,UAAA,CACV,iBAAA,CAAmB,iBAAA,CACnB,OAAA,CAAS,SAAA,CACT,eAAgB,cAAA,CAChB,eAAA,CAAiB,gBACjB,aAAA,CAAe,aAAA,CACf,cAAe,aAAA,CACf,KAAA,CAAO,OAAA,CACP,WAAA,CAAa,WAAA,CACb,KAAA,CAAO,QACP,QAAA,CAAU,UAAA,CACV,gCAAA,CAAkC,gCAAA,CAClC,SAAA,CAAW,WAAA,CACX,OAAQ,QAAA,CACR,WAAA,CAAa,aAAA,CACb,KAAA,CAAO,OAAA,CACP,MAAA,CAAQ,SACR,UAAA,CAAY,YAAA,CACZ,SAAU,UAAA,CACV,QAAA,CAAU,WACV,aAAA,CAAe,aAAA,CACf,IAAA,CAAM,MAAA,CACN,OAAA,CAAS,SAAA,CACT,MAAO,OAAA,CACP,qBAAA,CAAuB,qBAAA,CACvB,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,SACR,YAAA,CAAc,cAAA,CACd,0BAAA,CAA4B,0BAAA,CAC5B,MAAA,CAAQ,QAAA,CACR,OAAQ,QAAA,CACR,OAAA,CAAS,UACT,sBAAA,CAAwB,sBAAA,CACxB,iBAAkB,gBAAA,CAClB,eAAA,CAAiB,eAAA,CACjB,sCAAA,CACE,sCAAA,CACF,OAAA,CAAS,UACT,UAAA,CAAY,YAAA,CACZ,OAAA,CAAS,SAAA,CACT,+BAAA,CAAiC,+BAAA,CACjC,UAAW,WAAA,CACX,OAAA,CAAS,SAAA,CACT,0BAAA,CAA4B,0BAAA,CAC5B,qBAAA,CAAuB,sBACvB,2BAAA,CAA6B,2BAAA,CAC7B,gBAAA,CAAkB,gBAAA,CAClB,KAAA,CAAO,OAAA,CACP,OAAQ,QAAA,CACR,QAAA,CAAU,UACZ,CAAA,CAMaC,EAAAA,CAAyD,CACpE,YAAa,oBAAA,CACb,eAAA,CAAiB,0BAAA,CACjB,OAAA,CAAS,gCAAA,CACT,OAAA,CAAS,iCACT,gBAAA,CAAkB,gCAAA,CAClB,OAAA,CAAS,oBAAA,CACT,MAAA,CAAQ,oBAAA,CACR,SAAU,oBAAA,CACV,UAAA,CAAY,qBACZ,qBAAA,CAAuB,4CAAA,CACvB,UAAW,oBAAA,CACX,OAAA,CAAS,0BAAA,CACT,KAAA,CAAO,oBAAA,CACP,SAAA,CAAW,2BACX,OAAA,CAAS,oBAAA,CACT,UAAA,CAAY,0BAAA,CACZ,OAAA,CAAS,cAAA,CACT,WAAY,oBAAA,CACZ,QAAA,CAAU,0BAAA,CACV,OAAA,CAAS,0BAAA,CACT,OAAA,CAAS,qBACT,MAAA,CAAQ,oBAAA,CACR,MAAO,cAAA,CACP,OAAA,CAAS,qBACT,MAAA,CAAQ,cAAA,CACR,OAAA,CAAS,0BAAA,CACT,kCAAA,CAAoC,4FAAA,CACpC,yBAA0B,8DAAA,CAC1B,QAAA,CAAU,0BAAA,CACV,eAAA,CAAiB,oBAAA,CACjB,MAAA,CAAQ,eACR,gCAAA,CAAkC,4CAAA,CAClC,MAAA,CAAQ,cAAA,CACR,QAAA,CAAU,0BAAA,CACV,eAAgB,gCAAA,CAChB,OAAA,CAAS,qBACT,QAAA,CAAU,oBAAA,CACV,SAAU,oBAAA,CACV,MAAA,CAAQ,oBAAA,CACR,YAAA,CAAc,oBAAA,CACd,gBAAA,CAAkB,2BAClB,0BAAA,CAA4B,cAAA,CAC5B,IAAA,CAAM,cAAA,CACN,KAAA,CAAO,cAAA,CACP,MAAO,cAAA,CACP,kBAAA,CAAoB,oBAAA,CACpB,yBAAA,CAA2B,wDAAA,CAC3B,QAAA,CAAU,2BACV,OAAA,CAAS,oBAAA,CACT,MAAO,cAAA,CACP,cAAA,CAAgB,2BAChB,YAAA,CAAc,gCAAA,CACd,6BAAA,CAA+B,0BAAA,CAC/B,OAAA,CAAS,0BAAA,CACT,KAAM,cAAA,CACN,YAAA,CAAS,oBAAA,CACT,MAAA,CAAQ,0BAAA,CACR,gBAAA,CAAkB,eAClB,kCAAA,CAAoC,gCAAA,CACpC,OAAA,CAAS,cAAA,CACT,QAAA,CAAU,oBAAA,CACV,SAAU,0BAAA,CACV,oBAAA,CAAsB,6CACtB,YAAA,CAAc,oBAAA,CACd,QAAS,0BAAA,CACT,KAAA,CAAO,cAAA,CACP,aAAA,CAAe,0BAAA,CACf,mBAAA,CAAqB,iCACrB,OAAA,CAAS,gCAAA,CACT,OAAA,CAAS,0BAAA,CACT,QAAA,CAAU,gCAAA,CACV,mBAAoB,gCAAA,CACpB,eAAA,CAAiB,0BAAA,CACjB,cAAA,CAAgB,cAAA,CAChB,OAAA,CAAS,eACT,MAAA,CAAQ,cAAA,CACR,gBAAiB,gCAAA,CACjB,kBAAA,CAAoB,6CACpB,6BAAA,CAA+B,sCAAA,CAC/B,KAAA,CAAO,cAAA,CACP,YAAA,CAAc,oBAAA,CACd,QAAS,0BAAA,CACT,OAAA,CAAS,cAAA,CACT,KAAA,CAAO,cAAA,CACP,SAAA,CAAW,2BACX,MAAA,CAAQ,cAAA,CACR,SAAA,CAAW,0BAAA,CACX,OAAA,CAAS,0BAAA,CACT,WAAY,gCAAA,CACZ,IAAA,CAAM,eACN,SAAA,CAAW,0BAAA,CACX,wBAAyB,oBAAA,CACzB,MAAA,CAAQ,oBAAA,CACR,eAAA,CAAiB,gCAAA,CACjB,MAAA,CAAQ,qBACR,KAAA,CAAO,cAAA,CACP,mCAAA,CAAqC,kEAAA,CACrC,QAAA,CAAU,0BAAA,CACV,YAAa,0BAAA,CACb,OAAA,CAAS,oBAAA,CACT,OAAA,CAAS,cAAA,CACT,KAAA,CAAO,eACP,SAAA,CAAW,gCAAA,CACX,KAAM,cAAA,CACN,IAAA,CAAM,qBACN,OAAA,CAAS,oBAAA,CACT,MAAA,CAAQ,oBAAA,CACR,KAAA,CAAO,oBAAA,CACP,QAAS,oBAAA,CACT,KAAA,CAAO,cAAA,CACP,MAAA,CAAQ,oBAAA,CACR,MAAA,CAAQ,eACR,UAAA,CAAY,gCAAA,CACZ,KAAA,CAAO,oBAAA,CACP,QAAA,CAAU,0BAAA,CACV,OAAQ,oBAAA,CACR,MAAA,CAAQ,qBACR,UAAA,CAAY,sCAAA,CACZ,KAAM,kDAAA,CACN,MAAA,CAAQ,0BAAA,CACR,OAAA,CAAS,oBAAA,CACT,OAAA,CAAS,qBACT,OAAA,CAAS,0BAAA,CACT,KAAA,CAAO,oBAAA,CACP,aAAA,CAAe,gCAAA,CACf,UAAW,oBAAA,CACX,UAAA,CAAY,oBAAA,CACZ,KAAA,CAAO,0BAAA,CACP,UAAA,CAAY,iCACZ,MAAA,CAAQ,oBAAA,CACR,SAAU,0BAAA,CACV,QAAA,CAAU,2BACV,IAAA,CAAM,cAAA,CACN,KAAA,CAAO,oBAAA,CACP,eAAA,CAAiB,oBAAA,CACjB,mBAAoB,gCAAA,CACpB,UAAA,CAAY,gCAAA,CACZ,UAAA,CAAY,gCAAA,CACZ,SAAA,CAAW,2BACX,OAAA,CAAS,oBAAA,CACT,MAAA,CAAQ,oBAAA,CACR,UAAA,CAAY,sCAAA,CACZ,QAAS,0BAAA,CACT,MAAA,CAAQ,qBACR,QAAA,CAAU,cAAA,CACV,WAAY,cAAA,CACZ,UAAA,CAAY,gCAAA,CACZ,OAAA,CAAS,oBAAA,CACT,UAAA,CAAY,2BACZ,OAAA,CAAS,cAAA,CACT,OAAA,CAAS,0BAAA,CACT,KAAA,CAAO,cAAA,CACP,MAAO,oBAAA,CACP,WAAA,CAAa,cAAA,CACb,eAAA,CAAiB,sCAAA,CACjB,aAAA,CAAe,qBACf,SAAA,CAAW,0BAAA,CACX,MAAO,oBAAA,CACP,OAAA,CAAS,2BACT,IAAA,CAAM,cAAA,CACN,gBAAA,CAAkB,0BAAA,CAClB,aAAA,CAAe,cAAA,CACf,kBAAmB,0BAAA,CACnB,0BAAA,CAA4B,4CAAA,CAC5B,MAAA,CAAQ,cAAA,CACR,IAAA,CAAM,eACN,QAAA,CAAU,0BAAA,CACV,KAAA,CAAO,cAAA,CACP,gCAAA,CAAkC,0BAAA,CAClC,OAAQ,oBAAA,CACR,kBAAA,CAAoB,6CACpB,QAAA,CAAU,oBAAA,CACV,KAAM,cAAA,CACN,WAAA,CAAa,oBAAA,CACb,iBAAA,CAAmB,sCAAA,CACnB,MAAA,CAAQ,eACR,QAAA,CAAU,oBAAA,CACV,aAAA,CAAe,0BAAA,CACf,KAAA,CAAO,oBAAA,CACP,QAAS,0BAAA,CACT,OAAA,CAAS,0BAAA,CACT,MAAA,CAAQ,gCAAA,CACR,MAAA,CAAQ,qBACR,cAAA,CAAgB,0BAAA,CAChB,wBAAyB,4CAAA,CACzB,aAAA,CAAe,2BACf,2BAAA,CAA6B,kDAAA,CAC7B,kCAAA,CAAoC,8DAAA,CACpC,kBAAA,CAAoB,gCAAA,CACpB,6BAA8B,sCAAA,CAC9B,KAAA,CAAO,oBAAA,CACP,YAAA,CAAc,0BAAA,CACd,uBAAA,CAAyB,mDACzB,cAAA,CAAgB,gCAAA,CAChB,OAAA,CAAS,0BAAA,CACT,MAAA,CAAQ,0BAAA,CACR,WAAY,oBAAA,CACZ,cAAA,CAAgB,2BAChB,SAAA,CAAW,oBAAA,CACX,4BAA6B,8DAAA,CAC7B,QAAA,CAAU,0BAAA,CACV,QAAA,CAAU,gCAAA,CACV,iBAAA,CAAmB,iCACnB,OAAA,CAAS,oBAAA,CACT,cAAA,CAAgB,cAAA,CAChB,eAAA,CAAiB,0BAAA,CACjB,cAAe,cAAA,CACf,aAAA,CAAe,oBAAA,CACf,KAAA,CAAO,oBAAA,CACP,WAAA,CAAa,2BACb,KAAA,CAAO,cAAA,CACP,QAAA,CAAU,oBAAA,CACV,gCAAA,CAAkC,8DAAA,CAClC,UAAW,0BAAA,CACX,MAAA,CAAQ,cAAA,CACR,WAAA,CAAa,cAAA,CACb,KAAA,CAAO,qBACP,MAAA,CAAQ,0BAAA,CACR,UAAA,CAAY,gCAAA,CACZ,QAAA,CAAU,0BAAA,CACV,SAAU,cAAA,CACV,aAAA,CAAe,oBAAA,CACf,IAAA,CAAM,cAAA,CACN,OAAA,CAAS,qBACT,KAAA,CAAO,cAAA,CACP,sBAAuB,kDAAA,CACvB,OAAA,CAAS,qBACT,MAAA,CAAQ,oBAAA,CACR,YAAA,CAAc,gCAAA,CACd,0BAAA,CAA4B,wDAAA,CAC5B,OAAQ,oBAAA,CACR,MAAA,CAAQ,oBAAA,CACR,OAAA,CAAS,oBAAA,CACT,sBAAA,CAAwB,mDACxB,gBAAA,CAAkB,cAAA,CAClB,eAAA,CAAiB,cAAA,CACjB,sCAAA,CAAwC,kDAAA,CACxC,QAAS,oBAAA,CACT,UAAA,CAAY,uCACZ,OAAA,CAAS,0BAAA,CACT,gCAAiC,oBAAA,CACjC,SAAA,CAAW,0BAAA,CACX,OAAA,CAAS,cAAA,CACT,0BAAA,CAA4B,+DAC5B,qBAAA,CAAuB,wDAAA,CACvB,2BAAA,CAA6B,oEAAA,CAC7B,gBAAA,CAAkB,0BAAA,CAClB,MAAO,cAAA,CACP,MAAA,CAAQ,oBAAA,CACR,QAAA,CAAU,0BACZ,CAAA,CAMaC,GAA4D,CACvE,WAAA,CAAa,qBACb,eAAA,CAAiB,0BAAA,CACjB,QAAS,gCAAA,CACT,OAAA,CAAS,gCAAA,CACT,gBAAA,CAAkB,gCAAA,CAClB,OAAA,CAAS,qBACT,MAAA,CAAQ,oBAAA,CACR,QAAA,CAAU,oBAAA,CACV,UAAA,CAAY,oBAAA,CACZ,sBAAuB,4CAAA,CACvB,SAAA,CAAW,oBAAA,CACX,OAAA,CAAS,0BAAA,CACT,KAAA,CAAO,qBACP,SAAA,CAAW,0BAAA,CACX,QAAS,oBAAA,CACT,UAAA,CAAY,2BACZ,OAAA,CAAS,cAAA,CACT,UAAA,CAAY,oBAAA,CACZ,QAAA,CAAU,0BAAA,CACV,QAAS,0BAAA,CACT,OAAA,CAAS,oBAAA,CACT,MAAA,CAAQ,oBAAA,CACR,KAAA,CAAO,eACP,OAAA,CAAS,oBAAA,CACT,MAAA,CAAQ,cAAA,CACR,OAAA,CAAS,0BAAA,CACT,mCAAoC,4FAAA,CACpC,wBAAA,CAA0B,+DAC1B,QAAA,CAAU,0BAAA,CACV,gBAAiB,oBAAA,CACjB,MAAA,CAAQ,cAAA,CACR,gCAAA,CAAkC,4CAAA,CAClC,MAAA,CAAQ,eACR,QAAA,CAAU,0BAAA,CACV,cAAA,CAAgB,gCAAA,CAChB,OAAA,CAAS,oBAAA,CACT,SAAU,oBAAA,CACV,QAAA,CAAU,oBAAA,CACV,MAAA,CAAQ,oBAAA,CACR,YAAA,CAAc,qBACd,gBAAA,CAAkB,0BAAA,CAClB,2BAA4B,cAAA,CAC5B,IAAA,CAAM,eACN,KAAA,CAAO,cAAA,CACP,KAAA,CAAO,cAAA,CACP,kBAAA,CAAoB,oBAAA,CACpB,0BAA2B,wDAAA,CAC3B,QAAA,CAAU,0BAAA,CACV,OAAA,CAAS,oBAAA,CACT,KAAA,CAAO,eACP,cAAA,CAAgB,0BAAA,CAChB,YAAA,CAAc,gCAAA,CACd,6BAAA,CAA+B,0BAAA,CAC/B,QAAS,0BAAA,CACT,IAAA,CAAM,eACN,YAAA,CAAS,oBAAA,CACT,OAAQ,0BAAA,CACR,gBAAA,CAAkB,cAAA,CAClB,kCAAA,CAAoC,gCAAA,CACpC,OAAA,CAAS,eACT,QAAA,CAAU,oBAAA,CACV,QAAA,CAAU,0BAAA,CACV,oBAAA,CAAsB,4CAAA,CACtB,aAAc,oBAAA,CACd,OAAA,CAAS,0BAAA,CACT,KAAA,CAAO,cAAA,CACP,aAAA,CAAe,2BACf,mBAAA,CAAqB,gCAAA,CACrB,QAAS,gCAAA,CACT,OAAA,CAAS,2BACT,QAAA,CAAU,gCAAA,CACV,kBAAA,CAAoB,gCAAA,CACpB,eAAA,CAAiB,0BAAA,CACjB,eAAgB,cAAA,CAChB,OAAA,CAAS,cAAA,CACT,MAAA,CAAQ,cAAA,CACR,eAAA,CAAiB,iCACjB,kBAAA,CAAoB,4CAAA,CACpB,6BAAA,CAA+B,sCAAA,CAC/B,KAAA,CAAO,cAAA,CACP,aAAc,oBAAA,CACd,OAAA,CAAS,2BACT,OAAA,CAAS,cAAA,CACT,MAAO,cAAA,CACP,SAAA,CAAW,0BAAA,CACX,MAAA,CAAQ,cAAA,CACR,SAAA,CAAW,2BACX,OAAA,CAAS,0BAAA,CACT,UAAA,CAAY,gCAAA,CACZ,IAAA,CAAM,cAAA,CACN,UAAW,0BAAA,CACX,uBAAA,CAAyB,oBAAA,CACzB,MAAA,CAAQ,oBAAA,CACR,eAAA,CAAiB,iCACjB,MAAA,CAAQ,oBAAA,CACR,MAAO,cAAA,CACP,mCAAA,CAAqC,mEACrC,QAAA,CAAU,0BAAA,CACV,WAAA,CAAa,0BAAA,CACb,OAAA,CAAS,oBAAA,CACT,QAAS,cAAA,CACT,KAAA,CAAO,cAAA,CACP,SAAA,CAAW,gCAAA,CACX,IAAA,CAAM,eACN,IAAA,CAAM,oBAAA,CACN,OAAA,CAAS,oBAAA,CACT,MAAA,CAAQ,oBAAA,CACR,MAAO,oBAAA,CACP,OAAA,CAAS,qBACT,KAAA,CAAO,cAAA,CACP,OAAQ,oBAAA,CACR,MAAA,CAAQ,cAAA,CACR,UAAA,CAAY,gCAAA,CACZ,KAAA,CAAO,qBACP,QAAA,CAAU,0BAAA,CACV,MAAA,CAAQ,oBAAA,CACR,MAAA,CAAQ,oBAAA,CACR,WAAY,sCAAA,CACZ,IAAA,CAAM,kDAAA,CACN,MAAA,CAAQ,0BAAA,CACR,OAAA,CAAS,qBACT,OAAA,CAAS,oBAAA,CACT,QAAS,0BAAA,CACT,KAAA,CAAO,qBACP,aAAA,CAAe,gCAAA,CACf,SAAA,CAAW,oBAAA,CACX,UAAA,CAAY,oBAAA,CACZ,MAAO,0BAAA,CACP,UAAA,CAAY,gCAAA,CACZ,MAAA,CAAQ,oBAAA,CACR,QAAA,CAAU,2BACV,QAAA,CAAU,0BAAA,CACV,IAAA,CAAM,cAAA,CACN,KAAA,CAAO,oBAAA,CACP,gBAAiB,oBAAA,CACjB,kBAAA,CAAoB,iCACpB,UAAA,CAAY,gCAAA,CACZ,WAAY,gCAAA,CACZ,SAAA,CAAW,0BAAA,CACX,OAAA,CAAS,oBAAA,CACT,MAAA,CAAQ,qBACR,UAAA,CAAY,sCAAA,CACZ,OAAA,CAAS,0BAAA,CACT,MAAA,CAAQ,oBAAA,CACR,SAAU,cAAA,CACV,UAAA,CAAY,cAAA,CACZ,UAAA,CAAY,gCAAA,CACZ,OAAA,CAAS,qBACT,UAAA,CAAY,0BAAA,CACZ,QAAS,cAAA,CACT,OAAA,CAAS,2BACT,KAAA,CAAO,cAAA,CACP,KAAA,CAAO,oBAAA,CACP,WAAA,CAAa,cAAA,CACb,gBAAiB,sCAAA,CACjB,aAAA,CAAe,oBAAA,CACf,SAAA,CAAW,0BAAA,CACX,KAAA,CAAO,qBACP,OAAA,CAAS,0BAAA,CACT,IAAA,CAAM,cAAA,CACN,gBAAA,CAAkB,0BAAA,CAClB,cAAe,cAAA,CACf,iBAAA,CAAmB,2BACnB,0BAAA,CAA4B,4CAAA,CAC5B,OAAQ,cAAA,CACR,IAAA,CAAM,cAAA,CACN,QAAA,CAAU,0BAAA,CACV,KAAA,CAAO,eACP,gCAAA,CAAkC,0BAAA,CAClC,MAAA,CAAQ,oBAAA,CACR,kBAAA,CAAoB,4CAAA,CACpB,SAAU,oBAAA,CACV,IAAA,CAAM,cAAA,CACN,WAAA,CAAa,oBAAA,CACb,iBAAA,CAAmB,uCACnB,MAAA,CAAQ,cAAA,CACR,QAAA,CAAU,oBAAA,CACV,aAAA,CAAe,0BAAA,CACf,MAAO,oBAAA,CACP,OAAA,CAAS,0BAAA,CACT,OAAA,CAAS,0BAAA,CACT,MAAA,CAAQ,iCACR,MAAA,CAAQ,oBAAA,CACR,cAAA,CAAgB,0BAAA,CAChB,uBAAA,CAAyB,4CAAA,CACzB,cAAe,0BAAA,CACf,2BAAA,CAA6B,kDAAA,CAC7B,kCAAA,CAAoC,8DAAA,CACpC,kBAAA,CAAoB,iCACpB,4BAAA,CAA8B,sCAAA,CAC9B,MAAO,oBAAA,CACP,YAAA,CAAc,2BACd,uBAAA,CAAyB,kDAAA,CACzB,cAAA,CAAgB,gCAAA,CAChB,OAAA,CAAS,0BAAA,CACT,OAAQ,0BAAA,CACR,UAAA,CAAY,oBAAA,CACZ,cAAA,CAAgB,0BAAA,CAChB,SAAA,CAAW,qBACX,2BAAA,CAA6B,8DAAA,CAC7B,QAAA,CAAU,0BAAA,CACV,QAAA,CAAU,gCAAA,CACV,kBAAmB,gCAAA,CACnB,OAAA,CAAS,qBACT,cAAA,CAAgB,cAAA,CAChB,gBAAiB,0BAAA,CACjB,aAAA,CAAe,cAAA,CACf,aAAA,CAAe,oBAAA,CACf,KAAA,CAAO,qBACP,WAAA,CAAa,0BAAA,CACb,KAAA,CAAO,cAAA,CACP,QAAA,CAAU,oBAAA,CACV,iCAAkC,8DAAA,CAClC,SAAA,CAAW,0BAAA,CACX,MAAA,CAAQ,cAAA,CACR,WAAA,CAAa,eACb,KAAA,CAAO,oBAAA,CACP,OAAQ,0BAAA,CACR,UAAA,CAAY,iCACZ,QAAA,CAAU,0BAAA,CACV,QAAA,CAAU,cAAA,CACV,aAAA,CAAe,oBAAA,CACf,KAAM,cAAA,CACN,OAAA,CAAS,oBAAA,CACT,KAAA,CAAO,cAAA,CACP,qBAAA,CAAuB,mDACvB,OAAA,CAAS,oBAAA,CACT,MAAA,CAAQ,oBAAA,CACR,YAAA,CAAc,gCAAA,CACd,2BAA4B,wDAAA,CAC5B,MAAA,CAAQ,qBACR,MAAA,CAAQ,oBAAA,CACR,QAAS,oBAAA,CACT,sBAAA,CAAwB,kDAAA,CACxB,gBAAA,CAAkB,cAAA,CAClB,eAAA,CAAiB,eACjB,sCAAA,CAAwC,kDAAA,CACxC,OAAA,CAAS,oBAAA,CACT,UAAA,CAAY,sCAAA,CACZ,QAAS,0BAAA,CACT,+BAAA,CAAiC,oBAAA,CACjC,SAAA,CAAW,0BAAA,CACX,OAAA,CAAS,eACT,0BAAA,CAA4B,8DAAA,CAC5B,sBAAuB,wDAAA,CACvB,2BAAA,CAA6B,qEAC7B,gBAAA,CAAkB,0BAAA,CAClB,KAAA,CAAO,cAAA,CACP,MAAA,CAAQ,oBAAA,CACR,SAAU,0BACZ,CAAA,CAMaC,EAAAA,CAA4D,CACvE,WAAA,CAAa,oBAAA,CACb,gBAAiB,0BAAA,CACjB,OAAA,CAAS,gCAAA,CACT,OAAA,CAAS,gCAAA,CACT,gBAAA,CAAkB,iCAClB,OAAA,CAAS,oBAAA,CACT,OAAQ,oBAAA,CACR,QAAA,CAAU,qBACV,UAAA,CAAY,oBAAA,CACZ,qBAAA,CAAuB,4CAAA,CACvB,SAAA,CAAW,oBAAA,CACX,QAAS,0BAAA,CACT,KAAA,CAAO,oBAAA,CACP,SAAA,CAAW,0BAAA,CACX,OAAA,CAAS,qBACT,UAAA,CAAY,0BAAA,CACZ,OAAA,CAAS,cAAA,CACT,UAAA,CAAY,oBAAA,CACZ,SAAU,oBAAA,CACV,OAAA,CAAS,2BACT,OAAA,CAAS,oBAAA,CACT,OAAQ,oBAAA,CACR,KAAA,CAAO,cAAA,CACP,OAAA,CAAS,oBAAA,CACT,MAAA,CAAQ,eACR,OAAA,CAAS,0BAAA,CACT,kCAAA,CAAoC,4FAAA,CACpC,wBAAA,CAA0B,8DAAA,CAC1B,SAAU,oBAAA,CACV,eAAA,CAAiB,oBAAA,CACjB,MAAA,CAAQ,cAAA,CACR,gCAAA,CAAkC,6CAClC,MAAA,CAAQ,cAAA,CACR,SAAU,0BAAA,CACV,cAAA,CAAgB,iCAChB,OAAA,CAAS,oBAAA,CACT,QAAA,CAAU,oBAAA,CACV,QAAA,CAAU,oBAAA,CACV,OAAQ,oBAAA,CACR,YAAA,CAAc,oBAAA,CACd,gBAAA,CAAkB,0BAAA,CAClB,0BAAA,CAA4B,eAC5B,IAAA,CAAM,cAAA,CACN,KAAA,CAAO,cAAA,CACP,KAAA,CAAO,cAAA,CACP,mBAAoB,oBAAA,CACpB,yBAAA,CAA2B,yDAC3B,QAAA,CAAU,0BAAA,CACV,QAAS,cAAA,CACT,KAAA,CAAO,cAAA,CACP,cAAA,CAAgB,0BAAA,CAChB,YAAA,CAAc,iCACd,6BAAA,CAA+B,0BAAA,CAC/B,OAAA,CAAS,gCAAA,CACT,IAAA,CAAM,cAAA,CACN,aAAS,oBAAA,CACT,MAAA,CAAQ,0BAAA,CACR,gBAAA,CAAkB,cAAA,CAClB,kCAAA,CAAoC,iCACpC,OAAA,CAAS,cAAA,CACT,SAAU,oBAAA,CACV,QAAA,CAAU,2BACV,oBAAA,CAAsB,4CAAA,CACtB,YAAA,CAAc,oBAAA,CACd,OAAA,CAAS,oBAAA,CACT,MAAO,cAAA,CACP,aAAA,CAAe,0BAAA,CACf,mBAAA,CAAqB,gCAAA,CACrB,OAAA,CAAS,2BACT,OAAA,CAAS,0BAAA,CACT,QAAA,CAAU,0BAAA,CACV,kBAAA,CAAoB,gCAAA,CACpB,gBAAiB,0BAAA,CACjB,cAAA,CAAgB,eAChB,OAAA,CAAS,cAAA,CACT,OAAQ,cAAA,CACR,eAAA,CAAiB,gCAAA,CACjB,kBAAA,CAAoB,4CAAA,CACpB,6BAAA,CAA+B,uCAC/B,KAAA,CAAO,cAAA,CACP,YAAA,CAAc,oBAAA,CACd,OAAA,CAAS,oBAAA,CACT,QAAS,cAAA,CACT,KAAA,CAAO,cAAA,CACP,SAAA,CAAW,0BAAA,CACX,MAAA,CAAQ,eACR,SAAA,CAAW,0BAAA,CACX,QAAS,0BAAA,CACT,UAAA,CAAY,iCACZ,IAAA,CAAM,cAAA,CACN,SAAA,CAAW,0BAAA,CACX,uBAAA,CAAyB,oBAAA,CACzB,OAAQ,oBAAA,CACR,eAAA,CAAiB,gCAAA,CACjB,MAAA,CAAQ,oBAAA,CACR,KAAA,CAAO,eACP,mCAAA,CAAqC,kEAAA,CACrC,QAAA,CAAU,0BAAA,CACV,WAAA,CAAa,0BAAA,CACb,QAAS,oBAAA,CACT,OAAA,CAAS,eACT,KAAA,CAAO,cAAA,CACP,UAAW,gCAAA,CACX,IAAA,CAAM,cAAA,CACN,IAAA,CAAM,oBAAA,CACN,OAAA,CAAS,qBACT,MAAA,CAAQ,oBAAA,CACR,KAAA,CAAO,oBAAA,CACP,OAAA,CAAS,oBAAA,CACT,MAAO,cAAA,CACP,MAAA,CAAQ,oBAAA,CACR,MAAA,CAAQ,cAAA,CACR,UAAA,CAAY,qBACZ,KAAA,CAAO,cAAA,CACP,SAAU,0BAAA,CACV,MAAA,CAAQ,qBACR,MAAA,CAAQ,oBAAA,CACR,UAAA,CAAY,sCAAA,CACZ,IAAA,CAAM,kDAAA,CACN,OAAQ,0BAAA,CACR,OAAA,CAAS,oBAAA,CACT,OAAA,CAAS,oBAAA,CACT,OAAA,CAAS,2BACT,KAAA,CAAO,oBAAA,CACP,aAAA,CAAe,gCAAA,CACf,SAAA,CAAW,oBAAA,CACX,WAAY,oBAAA,CACZ,KAAA,CAAO,2BACP,UAAA,CAAY,gCAAA,CACZ,OAAQ,oBAAA,CACR,QAAA,CAAU,0BAAA,CACV,QAAA,CAAU,0BAAA,CACV,IAAA,CAAM,eACN,KAAA,CAAO,oBAAA,CACP,eAAA,CAAiB,oBAAA,CACjB,kBAAA,CAAoB,gCAAA,CACpB,WAAY,gCAAA,CACZ,UAAA,CAAY,gCAAA,CACZ,SAAA,CAAW,0BAAA,CACX,OAAA,CAAS,qBACT,MAAA,CAAQ,oBAAA,CACR,UAAA,CAAY,sCAAA,CACZ,OAAA,CAAS,0BAAA,CACT,OAAQ,oBAAA,CACR,QAAA,CAAU,cAAA,CACV,UAAA,CAAY,cAAA,CACZ,UAAA,CAAY,iCACZ,OAAA,CAAS,oBAAA,CACT,UAAA,CAAY,0BAAA,CACZ,OAAA,CAAS,cAAA,CACT,QAAS,0BAAA,CACT,KAAA,CAAO,cAAA,CACP,KAAA,CAAO,oBAAA,CACP,WAAA,CAAa,eACb,eAAA,CAAiB,sCAAA,CACjB,cAAe,oBAAA,CACf,SAAA,CAAW,2BACX,KAAA,CAAO,cAAA,CACP,OAAA,CAAS,0BAAA,CACT,IAAA,CAAM,cAAA,CACN,iBAAkB,0BAAA,CAClB,aAAA,CAAe,cAAA,CACf,iBAAA,CAAmB,0BAAA,CACnB,0BAAA,CAA4B,6CAC5B,MAAA,CAAQ,cAAA,CACR,IAAA,CAAM,cAAA,CACN,QAAA,CAAU,0BAAA,CACV,MAAO,cAAA,CACP,gCAAA,CAAkC,2BAClC,MAAA,CAAQ,oBAAA,CACR,mBAAoB,4CAAA,CACpB,QAAA,CAAU,oBAAA,CACV,IAAA,CAAM,cAAA,CACN,WAAA,CAAa,qBACb,iBAAA,CAAmB,sCAAA,CACnB,MAAA,CAAQ,cAAA,CACR,QAAA,CAAU,oBAAA,CACV,cAAe,0BAAA,CACf,KAAA,CAAO,cAAA,CACP,OAAA,CAAS,0BAAA,CACT,OAAA,CAAS,2BACT,MAAA,CAAQ,gCAAA,CACR,OAAQ,oBAAA,CACR,cAAA,CAAgB,2BAChB,uBAAA,CAAyB,8DAAA,CACzB,aAAA,CAAe,0BAAA,CACf,2BAAA,CAA6B,kDAAA,CAC7B,mCAAoC,kDAAA,CACpC,kBAAA,CAAoB,gCAAA,CACpB,4BAAA,CAA8B,sCAAA,CAC9B,KAAA,CAAO,qBACP,YAAA,CAAc,0BAAA,CACd,uBAAA,CAAyB,kDAAA,CACzB,cAAA,CAAgB,sCAAA,CAChB,QAAS,0BAAA,CACT,MAAA,CAAQ,2BACR,UAAA,CAAY,oBAAA,CACZ,eAAgB,oBAAA,CAChB,SAAA,CAAW,oBAAA,CACX,2BAAA,CAA6B,8DAAA,CAC7B,QAAA,CAAU,2BACV,QAAA,CAAU,gCAAA,CACV,iBAAA,CAAmB,gCAAA,CACnB,OAAA,CAAS,0BAAA,CACT,eAAgB,cAAA,CAChB,eAAA,CAAiB,0BAAA,CACjB,aAAA,CAAe,cAAA,CACf,aAAA,CAAe,qBACf,KAAA,CAAO,oBAAA,CACP,YAAa,0BAAA,CACb,KAAA,CAAO,eACP,QAAA,CAAU,oBAAA,CACV,gCAAA,CAAkC,8DAAA,CAClC,SAAA,CAAW,0BAAA,CACX,OAAQ,cAAA,CACR,WAAA,CAAa,cAAA,CACb,KAAA,CAAO,oBAAA,CACP,MAAA,CAAQ,2BACR,UAAA,CAAY,oBAAA,CACZ,QAAA,CAAU,0BAAA,CACV,QAAA,CAAU,cAAA,CACV,cAAe,oBAAA,CACf,IAAA,CAAM,eACN,OAAA,CAAS,oBAAA,CACT,MAAO,cAAA,CACP,qBAAA,CAAuB,4CAAA,CACvB,OAAA,CAAS,0BAAA,CACT,MAAA,CAAQ,qBACR,YAAA,CAAc,oBAAA,CACd,0BAAA,CAA4B,wDAAA,CAC5B,MAAA,CAAQ,oBAAA,CACR,OAAQ,oBAAA,CACR,OAAA,CAAS,oBAAA,CACT,sBAAA,CAAwB,kDAAA,CACxB,gBAAA,CAAkB,eAClB,eAAA,CAAiB,cAAA,CACjB,uCAAwC,kDAAA,CACxC,OAAA,CAAS,qBACT,UAAA,CAAY,0BAAA,CACZ,OAAA,CAAS,oBAAA,CACT,+BAAA,CAAiC,oBAAA,CACjC,UAAW,0BAAA,CACX,OAAA,CAAS,cAAA,CACT,0BAAA,CAA4B,kDAAA,CAC5B,qBAAA,CAAuB,yDACvB,2BAAA,CAA6B,oEAAA,CAC7B,gBAAA,CAAkB,0BAAA,CAClB,KAAA,CAAO,cAAA,CACP,OAAQ,oBAAA,CACR,QAAA,CAAU,oBACZ,CAAA,CAMaC,EAAAA,CAA+C,CAC1D,WAAA,CAAa,eAAA,CACb,eAAA,CAAiB,gBAAA,CACjB,OAAA,CAAS,SAAA,CACT,QAAS,SAAA,CACT,gBAAA,CAAkB,iBAAA,CAClB,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,SACR,QAAA,CAAU,SAAA,CACV,UAAA,CAAY,cAAA,CACZ,qBAAA,CAAuB,mBAAA,CACvB,UAAW,WAAA,CACX,OAAA,CAAS,UACT,KAAA,CAAO,OAAA,CACP,UAAW,WAAA,CACX,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,eAAA,CACZ,OAAA,CAAS,YACT,UAAA,CAAY,cAAA,CACZ,QAAA,CAAU,UAAA,CACV,OAAA,CAAS,aAAA,CACT,QAAS,YAAA,CACT,MAAA,CAAQ,QAAA,CACR,KAAA,CAAO,UAAA,CACP,OAAA,CAAS,WACT,MAAA,CAAQ,UAAA,CACR,QAAS,SAAA,CACT,kCAAA,CAAoC,gCACpC,wBAAA,CAA0B,sBAAA,CAC1B,QAAA,CAAU,UAAA,CACV,eAAA,CAAiB,aAAA,CACjB,OAAQ,QAAA,CACR,gCAAA,CAAkC,iDAAA,CAClC,MAAA,CAAQ,WAAA,CACR,QAAA,CAAU,WACV,cAAA,CAAgB,cAAA,CAChB,OAAA,CAAS,SAAA,CACT,QAAA,CAAU,SAAA,CACV,SAAU,YAAA,CACV,MAAA,CAAQ,YACR,YAAA,CAAc,YAAA,CACd,iBAAkB,iBAAA,CAClB,0BAAA,CAA4B,6BAAA,CAC5B,IAAA,CAAM,MAAA,CACN,KAAA,CAAO,QACP,KAAA,CAAO,OAAA,CACP,kBAAA,CAAoB,iBAAA,CACpB,yBAAA,CAA2B,aAAA,CAC3B,SAAU,UAAA,CACV,OAAA,CAAS,SAAA,CACT,KAAA,CAAO,OAAA,CACP,cAAA,CAAgB,aAChB,YAAA,CAAc,YAAA,CACd,8BAA+B,iBAAA,CAC/B,OAAA,CAAS,UACT,IAAA,CAAM,MAAA,CACN,YAAA,CAAS,SAAA,CACT,MAAA,CAAQ,QAAA,CACR,iBAAkB,oBAAA,CAClB,kCAAA,CAAoC,uCAAA,CACpC,OAAA,CAAS,WAAA,CACT,QAAA,CAAU,SACV,QAAA,CAAU,UAAA,CACV,oBAAA,CAAsB,yBAAA,CACtB,YAAA,CAAc,gBAAA,CACd,QAAS,SAAA,CACT,KAAA,CAAO,SACP,aAAA,CAAe,aAAA,CACf,oBAAqB,mBAAA,CACrB,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,SAAA,CACT,QAAA,CAAU,aACV,kBAAA,CAAoB,gBAAA,CACpB,eAAA,CAAiB,aAAA,CACjB,cAAA,CAAgB,MAAA,CAChB,QAAS,WAAA,CACT,MAAA,CAAQ,SAAA,CACR,eAAA,CAAiB,kBAAA,CACjB,kBAAA,CAAoB,qBACpB,6BAAA,CAA+B,6CAAA,CAC/B,MAAO,UAAA,CACP,YAAA,CAAc,SACd,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,UAAA,CACT,KAAA,CAAO,OAAA,CACP,UAAW,WAAA,CACX,MAAA,CAAQ,QAAA,CACR,SAAA,CAAW,aAAA,CACX,OAAA,CAAS,UACT,UAAA,CAAY,WAAA,CACZ,IAAA,CAAM,MAAA,CACN,SAAA,CAAW,WAAA,CACX,wBAAyB,qBAAA,CACzB,MAAA,CAAQ,SACR,eAAA,CAAiB,iBAAA,CACjB,OAAQ,QAAA,CACR,KAAA,CAAO,UAAA,CACP,mCAAA,CAAqC,wBAAA,CACrC,QAAA,CAAU,WACV,WAAA,CAAa,WAAA,CACb,OAAA,CAAS,YAAA,CACT,OAAA,CAAS,UAAA,CACT,MAAO,OAAA,CACP,SAAA,CAAW,WAAA,CACX,IAAA,CAAM,SAAA,CACN,IAAA,CAAM,OACN,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,QAAA,CACR,KAAA,CAAO,QAAA,CACP,QAAS,SAAA,CACT,KAAA,CAAO,UAAA,CACP,MAAA,CAAQ,QAAA,CACR,MAAA,CAAQ,WACR,UAAA,CAAY,eAAA,CACZ,KAAA,CAAO,OAAA,CACP,QAAA,CAAU,UAAA,CACV,OAAQ,QAAA,CACR,MAAA,CAAQ,QAAA,CACR,UAAA,CAAY,eAAA,CACZ,IAAA,CAAM,OACN,MAAA,CAAQ,SAAA,CACR,QAAS,WAAA,CACT,OAAA,CAAS,SACT,OAAA,CAAS,SAAA,CACT,KAAA,CAAO,OAAA,CACP,aAAA,CAAe,eAAA,CACf,UAAW,UAAA,CACX,UAAA,CAAY,YAAA,CACZ,KAAA,CAAO,OAAA,CACP,UAAA,CAAY,aACZ,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,SAAA,CACV,QAAA,CAAU,UAAA,CACV,KAAM,SAAA,CACN,KAAA,CAAO,QACP,eAAA,CAAiB,aAAA,CACjB,mBAAoB,gBAAA,CACpB,UAAA,CAAY,WAAA,CACZ,UAAA,CAAY,YAAA,CACZ,SAAA,CAAW,WACX,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,WAAA,CACR,UAAA,CAAY,YAAA,CACZ,QAAS,UAAA,CACT,MAAA,CAAQ,WAAA,CACR,QAAA,CAAU,UAAA,CACV,UAAA,CAAY,aACZ,UAAA,CAAY,YAAA,CACZ,QAAS,WAAA,CACT,UAAA,CAAY,aACZ,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,SAAA,CACT,KAAA,CAAO,OAAA,CACP,MAAO,OAAA,CACP,WAAA,CAAa,iBAAA,CACb,eAAA,CAAiB,iBAAA,CACjB,aAAA,CAAe,gBACf,SAAA,CAAW,WAAA,CACX,KAAA,CAAO,UAAA,CACP,OAAA,CAAS,SAAA,CACT,KAAM,MAAA,CACN,gBAAA,CAAkB,eAClB,aAAA,CAAe,iBAAA,CACf,kBAAmB,qBAAA,CACnB,0BAAA,CAA4B,0BAAA,CAC5B,MAAA,CAAQ,SAAA,CACR,IAAA,CAAM,UACN,QAAA,CAAU,aAAA,CACV,KAAA,CAAO,QAAA,CACP,gCAAA,CAAkC,8BAAA,CAClC,OAAQ,WAAA,CACR,kBAAA,CAAoB,uBAAA,CACpB,QAAA,CAAU,UAAA,CACV,IAAA,CAAM,UACN,WAAA,CAAa,WAAA,CACb,kBAAmB,gBAAA,CACnB,MAAA,CAAQ,UACR,QAAA,CAAU,UAAA,CACV,aAAA,CAAe,aAAA,CACf,KAAA,CAAO,OAAA,CACP,QAAS,YAAA,CACT,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,OAAA,CACR,MAAA,CAAQ,SACR,cAAA,CAAgB,aAAA,CAChB,uBAAA,CAAyB,2BAAA,CACzB,aAAA,CAAe,gBAAA,CACf,4BAA6B,yBAAA,CAC7B,kCAAA,CAAoC,+BACpC,kBAAA,CAAoB,kBAAA,CACpB,6BAA8B,gCAAA,CAC9B,KAAA,CAAO,OAAA,CACP,YAAA,CAAc,YAAA,CACd,uBAAA,CAAyB,8BACzB,cAAA,CAAgB,gBAAA,CAChB,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,QAAA,CACR,WAAY,YAAA,CACZ,cAAA,CAAgB,cAAA,CAChB,SAAA,CAAW,UAAA,CACX,2BAAA,CAA6B,oCAC7B,QAAA,CAAU,YAAA,CACV,SAAU,WAAA,CACV,iBAAA,CAAmB,mBACnB,OAAA,CAAS,SAAA,CACT,cAAA,CAAgB,cAAA,CAChB,eAAA,CAAiB,iBAAA,CACjB,cAAe,eAAA,CACf,aAAA,CAAe,kBAAA,CACf,KAAA,CAAO,WAAA,CACP,WAAA,CAAa,YACb,KAAA,CAAO,UAAA,CACP,QAAA,CAAU,SAAA,CACV,gCAAA,CAAkC,sBAAA,CAClC,UAAW,aAAA,CACX,MAAA,CAAQ,SACR,WAAA,CAAa,OAAA,CACb,MAAO,OAAA,CACP,MAAA,CAAQ,WAAA,CACR,UAAA,CAAY,eAAA,CACZ,QAAA,CAAU,WACV,QAAA,CAAU,WAAA,CACV,aAAA,CAAe,SAAA,CACf,IAAA,CAAM,MAAA,CACN,QAAS,SAAA,CACT,KAAA,CAAO,OAAA,CACP,qBAAA,CAAuB,mBAAA,CACvB,OAAA,CAAS,WACT,MAAA,CAAQ,YAAA,CACR,aAAc,iBAAA,CACd,0BAAA,CAA4B,wBAC5B,MAAA,CAAQ,QAAA,CACR,MAAA,CAAQ,QAAA,CACR,OAAA,CAAS,SAAA,CACT,uBAAwB,2BAAA,CACxB,gBAAA,CAAkB,aAAA,CAClB,eAAA,CAAiB,gBAAA,CACjB,sCAAA,CACE,+CACF,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,eAAA,CACZ,OAAA,CAAS,SAAA,CACT,gCAAiC,qBAAA,CACjC,SAAA,CAAW,YACX,OAAA,CAAS,SAAA,CACT,2BAA4B,iCAAA,CAC5B,qBAAA,CAAuB,yCAAA,CACvB,2BAAA,CAA6B,iBAAA,CAC7B,gBAAA,CAAkB,oBAClB,KAAA,CAAO,OAAA,CACP,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,UACZ,EAMaC,EAAAA,CAA8C,CACzD,WAAA,CAAa,aAAA,CACb,eAAA,CAAiB,kBAAA,CACjB,QAAS,SAAA,CACT,OAAA,CAAS,aACT,gBAAA,CAAkB,sBAAA,CAClB,QAAS,SAAA,CACT,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,UAAA,CACV,UAAA,CAAY,cACZ,qBAAA,CAAuB,oBAAA,CACvB,SAAA,CAAW,WAAA,CACX,OAAA,CAAS,YAAA,CACT,MAAO,OAAA,CACP,SAAA,CAAW,WAAA,CACX,OAAA,CAAS,UAAA,CACT,UAAA,CAAY,iBACZ,OAAA,CAAS,YAAA,CACT,WAAY,YAAA,CACZ,QAAA,CAAU,UACV,OAAA,CAAS,gBAAA,CACT,OAAA,CAAS,UAAA,CACT,MAAA,CAAQ,QAAA,CACR,MAAO,UAAA,CACP,OAAA,CAAS,UAAA,CACT,MAAA,CAAQ,SAAA,CACR,OAAA,CAAS,UACT,kCAAA,CAAoC,iCAAA,CACpC,wBAAA,CAA0B,uBAAA,CAC1B,QAAA,CAAU,UAAA,CACV,gBAAiB,eAAA,CACjB,MAAA,CAAQ,YACR,gCAAA,CAAkC,6CAAA,CAClC,OAAQ,WAAA,CACR,QAAA,CAAU,UAAA,CACV,cAAA,CAAgB,cAAA,CAChB,OAAA,CAAS,UACT,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,UAAA,CACV,MAAA,CAAQ,QAAA,CACR,aAAc,UAAA,CACd,gBAAA,CAAkB,oBAAA,CAClB,0BAAA,CAA4B,8BAAA,CAC5B,IAAA,CAAM,QACN,KAAA,CAAO,OAAA,CACP,MAAO,OAAA,CACP,kBAAA,CAAoB,mBACpB,yBAAA,CAA2B,yBAAA,CAC3B,QAAA,CAAU,UAAA,CACV,OAAA,CAAS,SAAA,CACT,MAAO,OAAA,CACP,cAAA,CAAgB,cAAA,CAChB,YAAA,CAAc,YAAA,CACd,6BAAA,CAA+B,mBAC/B,OAAA,CAAS,SAAA,CACT,IAAA,CAAM,MAAA,CACN,YAAA,CAAS,YAAA,CACT,OAAQ,QAAA,CACR,gBAAA,CAAkB,2BAClB,kCAAA,CAAoC,wCAAA,CACpC,QAAS,UAAA,CACT,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,WAAA,CACV,oBAAA,CAAsB,4BACtB,YAAA,CAAc,gBAAA,CACd,OAAA,CAAS,aAAA,CACT,KAAA,CAAO,WAAA,CACP,cAAe,UAAA,CACf,mBAAA,CAAqB,0BAAA,CACrB,OAAA,CAAS,gBAAA,CACT,OAAA,CAAS,UACT,QAAA,CAAU,aAAA,CACV,kBAAA,CAAoB,mBAAA,CACpB,eAAA,CAAiB,qBAAA,CACjB,eAAgB,OAAA,CAChB,OAAA,CAAS,UAAA,CACT,MAAA,CAAQ,QAAA,CACR,eAAA,CAAiB,sBACjB,kBAAA,CAAoB,2BAAA,CACpB,6BAAA,CAA+B,gCAAA,CAC/B,KAAA,CAAO,OAAA,CACP,aAAc,QAAA,CACd,OAAA,CAAS,YAAA,CACT,OAAA,CAAS,WAAA,CACT,KAAA,CAAO,QACP,SAAA,CAAW,WAAA,CACX,OAAQ,UAAA,CACR,SAAA,CAAW,YACX,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,YAAA,CACZ,IAAA,CAAM,MAAA,CACN,UAAW,WAAA,CACX,uBAAA,CAAyB,uBAAA,CACzB,MAAA,CAAQ,WAAA,CACR,eAAA,CAAiB,mBACjB,MAAA,CAAQ,QAAA,CACR,KAAA,CAAO,UAAA,CACP,mCAAA,CAAqC,4BAAA,CACrC,SAAU,UAAA,CACV,WAAA,CAAa,YACb,OAAA,CAAS,SAAA,CACT,QAAS,SAAA,CACT,KAAA,CAAO,MAAA,CACP,SAAA,CAAW,cAAA,CACX,IAAA,CAAM,OACN,IAAA,CAAM,MAAA,CACN,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,WAAA,CACR,MAAO,QAAA,CACP,OAAA,CAAS,aAAA,CACT,KAAA,CAAO,OAAA,CACP,MAAA,CAAQ,SACR,MAAA,CAAQ,UAAA,CACR,WAAY,YAAA,CACZ,KAAA,CAAO,QACP,QAAA,CAAU,UAAA,CACV,MAAA,CAAQ,QAAA,CACR,MAAA,CAAQ,WAAA,CACR,WAAY,cAAA,CACZ,IAAA,CAAM,MAAA,CACN,MAAA,CAAQ,UAAA,CACR,OAAA,CAAS,QACT,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,YAAA,CACT,KAAA,CAAO,OAAA,CACP,cAAe,eAAA,CACf,SAAA,CAAW,WACX,UAAA,CAAY,YAAA,CACZ,MAAO,OAAA,CACP,UAAA,CAAY,YAAA,CACZ,kBAAA,CAAoB,kBAAA,CACpB,MAAA,CAAQ,SACR,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,UAAA,CACV,IAAA,CAAM,MAAA,CACN,MAAO,OAAA,CACP,eAAA,CAAiB,eAAA,CACjB,UAAA,CAAY,YAAA,CACZ,UAAA,CAAY,aACZ,SAAA,CAAW,SAAA,CACX,QAAS,SAAA,CACT,MAAA,CAAQ,UACR,UAAA,CAAY,eAAA,CACZ,OAAA,CAAS,UAAA,CACT,MAAA,CAAQ,QAAA,CACR,SAAU,UAAA,CACV,UAAA,CAAY,kBAAA,CACZ,UAAA,CAAY,YAAA,CACZ,OAAA,CAAS,QACT,UAAA,CAAY,YAAA,CACZ,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,SAAA,CACT,MAAO,OAAA,CACP,KAAA,CAAO,WACP,WAAA,CAAa,UAAA,CACb,gBAAiB,uBAAA,CACjB,aAAA,CAAe,qBAAA,CACf,SAAA,CAAW,WAAA,CACX,KAAA,CAAO,QACP,OAAA,CAAS,YAAA,CACT,IAAA,CAAM,MAAA,CACN,gBAAA,CAAkB,gBAAA,CAClB,cAAe,kBAAA,CACf,iBAAA,CAAmB,sBAAA,CACnB,0BAAA,CAA4B,2BAAA,CAC5B,MAAA,CAAQ,aACR,IAAA,CAAM,MAAA,CACN,SAAU,UAAA,CACV,KAAA,CAAO,SACP,gCAAA,CAAkC,WAAA,CAClC,MAAA,CAAQ,QAAA,CACR,kBAAA,CAAoB,8BAAA,CACpB,SAAU,UAAA,CACV,IAAA,CAAM,UAAA,CACN,WAAA,CAAa,aAAA,CACb,iBAAA,CAAmB,mBACnB,MAAA,CAAQ,SAAA,CACR,QAAA,CAAU,UAAA,CACV,aAAA,CAAe,YAAA,CACf,MAAO,OAAA,CACP,OAAA,CAAS,gBACT,OAAA,CAAS,UAAA,CACT,OAAQ,QAAA,CACR,MAAA,CAAQ,QAAA,CACR,kBAAA,CAAoB,qBAAA,CACpB,cAAA,CAAgB,sBAChB,uBAAA,CAAyB,kCAAA,CACzB,aAAA,CAAe,cAAA,CACf,4BAAA,CAA8B,cAAA,CAC9B,4BAA6B,0BAAA,CAC7B,kCAAA,CAAoC,iCAAA,CACpC,KAAA,CAAO,OAAA,CACP,YAAA,CAAc,cACd,uBAAA,CAAyB,yBAAA,CACzB,eAAgB,iBAAA,CAChB,OAAA,CAAS,gBACT,MAAA,CAAQ,QAAA,CACR,UAAA,CAAY,YAAA,CACZ,cAAA,CAAgB,cAAA,CAChB,UAAW,WAAA,CACX,2BAAA,CAA6B,cAAA,CAC7B,QAAA,CAAU,WAAA,CACV,QAAA,CAAU,cACV,iBAAA,CAAmB,iBAAA,CACnB,OAAA,CAAS,SAAA,CACT,cAAA,CAAgB,gBAAA,CAChB,gBAAiB,kDAAA,CACjB,aAAA,CAAe,kBACf,aAAA,CAAe,eAAA,CACf,MAAO,SAAA,CACP,WAAA,CAAa,WAAA,CACb,KAAA,CAAO,QAAA,CACP,QAAA,CAAU,WACV,gCAAA,CAAkC,uBAAA,CAClC,SAAA,CAAW,WAAA,CACX,MAAA,CAAQ,UAAA,CACR,YAAa,QAAA,CACb,KAAA,CAAO,OAAA,CACP,MAAA,CAAQ,WAAA,CACR,UAAA,CAAY,cACZ,QAAA,CAAU,UAAA,CACV,SAAU,cAAA,CACV,aAAA,CAAe,UACf,IAAA,CAAM,MAAA,CACN,OAAA,CAAS,SAAA,CACT,KAAA,CAAO,OAAA,CACP,sBAAuB,sBAAA,CACvB,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,SAAA,CACR,YAAA,CAAc,kBACd,0BAAA,CAA4B,+BAAA,CAC5B,MAAA,CAAQ,QAAA,CACR,MAAA,CAAQ,SAAA,CACR,QAAS,SAAA,CACT,sBAAA,CAAwB,yBACxB,gBAAA,CAAkB,aAAA,CAClB,gBAAiB,eAAA,CACjB,sCAAA,CACE,oDAAA,CACF,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,iBACZ,OAAA,CAAS,SAAA,CACT,+BAAA,CAAiC,SAAA,CACjC,SAAA,CAAW,WAAA,CACX,QAAS,aAAA,CACT,0BAAA,CAA4B,8BAAA,CAC5B,qBAAA,CAAuB,gCAAA,CACvB,2BAAA,CAA6B,mBAC7B,gBAAA,CAAkB,mBAAA,CAClB,MAAO,UAAA,CACP,MAAA,CAAQ,SACR,QAAA,CAAU,UACZ,CAAA,CAEaC,EAAAA,CAAiD,CAC5D,WAAA,CAAa,cACb,eAAA,CAAiB,UAAA,CACjB,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,SAAA,CACT,iBAAkB,kBAAA,CAClB,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,WACV,UAAA,CAAY,WAAA,CACZ,sBAAuB,oBAAA,CACvB,SAAA,CAAW,YACX,OAAA,CAAS,SAAA,CACT,KAAA,CAAO,OAAA,CACP,SAAA,CAAW,WAAA,CACX,QAAS,cAAA,CACT,UAAA,CAAY,cAAA,CACZ,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,aACZ,QAAA,CAAU,UAAA,CACV,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,QAAA,CACT,OAAQ,QAAA,CACR,KAAA,CAAO,QACP,OAAA,CAAS,SAAA,CACT,OAAQ,QAAA,CACR,OAAA,CAAS,SAAA,CACT,kCAAA,CAAoC,iCAAA,CACpC,wBAAA,CAA0B,qBAC1B,QAAA,CAAU,UAAA,CACV,eAAA,CAAiB,cAAA,CACjB,MAAA,CAAQ,QAAA,CACR,iCAAkC,uCAAA,CAClC,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,UAAA,CACV,cAAA,CAAgB,eAChB,OAAA,CAAS,SAAA,CACT,SAAU,WAAA,CACV,QAAA,CAAU,UACV,MAAA,CAAQ,QAAA,CACR,YAAA,CAAc,YAAA,CACd,gBAAA,CAAkB,gBAAA,CAClB,2BAA4B,iCAAA,CAC5B,IAAA,CAAM,OAAA,CACN,KAAA,CAAO,OAAA,CACP,KAAA,CAAO,OACP,kBAAA,CAAoB,iBAAA,CACpB,yBAAA,CAA2B,iCAAA,CAC3B,QAAA,CAAU,UAAA,CACV,QAAS,UAAA,CACT,KAAA,CAAO,QACP,cAAA,CAAgB,cAAA,CAChB,aAAc,YAAA,CACd,6BAAA,CAA+B,iBAAA,CAC/B,OAAA,CAAS,SAAA,CACT,IAAA,CAAM,OACN,YAAA,CAAS,YAAA,CACT,MAAA,CAAQ,QAAA,CACR,gBAAA,CAAkB,UAAA,CAClB,mCAAoC,oCAAA,CACpC,OAAA,CAAS,SAAA,CACT,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,WACV,oBAAA,CAAsB,4BAAA,CACtB,aAAc,cAAA,CACd,OAAA,CAAS,UACT,KAAA,CAAO,OAAA,CACP,aAAA,CAAe,aAAA,CACf,mBAAA,CAAqB,mBAAA,CACrB,QAAS,SAAA,CACT,OAAA,CAAS,SAAA,CACT,QAAA,CAAU,SAAA,CACV,kBAAA,CAAoB,oBACpB,eAAA,CAAiB,gBAAA,CACjB,cAAA,CAAgB,cAAA,CAChB,OAAA,CAAS,SAAA,CACT,OAAQ,WAAA,CACR,eAAA,CAAiB,gBACjB,kBAAA,CAAoB,kBAAA,CACpB,8BAA+B,gCAAA,CAC/B,KAAA,CAAO,OAAA,CACP,YAAA,CAAc,QAAA,CACd,OAAA,CAAS,UACT,OAAA,CAAS,UAAA,CACT,KAAA,CAAO,OAAA,CACP,SAAA,CAAW,WAAA,CACX,OAAQ,QAAA,CACR,SAAA,CAAW,aAAA,CACX,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,aACZ,IAAA,CAAM,MAAA,CACN,UAAW,WAAA,CACX,uBAAA,CAAyB,uBACzB,MAAA,CAAQ,QAAA,CACR,eAAA,CAAiB,eAAA,CACjB,MAAA,CAAQ,QAAA,CACR,MAAO,OAAA,CACP,mCAAA,CAAqC,4BAAA,CACrC,QAAA,CAAU,UAAA,CACV,WAAA,CAAa,YACb,OAAA,CAAS,QAAA,CACT,OAAA,CAAS,QAAA,CACT,KAAA,CAAO,OAAA,CACP,UAAW,WAAA,CACX,IAAA,CAAM,OACN,IAAA,CAAM,MAAA,CACN,QAAS,QAAA,CACT,MAAA,CAAQ,QAAA,CACR,KAAA,CAAO,QAAA,CACP,OAAA,CAAS,UACT,KAAA,CAAO,OAAA,CACP,MAAA,CAAQ,QAAA,CACR,MAAA,CAAQ,QAAA,CACR,WAAY,YAAA,CACZ,KAAA,CAAO,OAAA,CACP,QAAA,CAAU,UAAA,CACV,MAAA,CAAQ,SACR,MAAA,CAAQ,QAAA,CACR,WAAY,aAAA,CACZ,IAAA,CAAM,OACN,MAAA,CAAQ,QAAA,CACR,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,SAAA,CACT,QAAS,SAAA,CACT,KAAA,CAAO,OAAA,CACP,aAAA,CAAe,eAAA,CACf,SAAA,CAAW,UACX,UAAA,CAAY,YAAA,CACZ,KAAA,CAAO,OAAA,CACP,UAAA,CAAY,YAAA,CACZ,OAAQ,QAAA,CACR,QAAA,CAAU,WACV,QAAA,CAAU,WAAA,CACV,KAAM,MAAA,CACN,KAAA,CAAO,OAAA,CACP,eAAA,CAAiB,eAAA,CACjB,kBAAA,CAAoB,mBACpB,UAAA,CAAY,YAAA,CACZ,UAAA,CAAY,YAAA,CACZ,SAAA,CAAW,WAAA,CACX,QAAS,SAAA,CACT,MAAA,CAAQ,QAAA,CACR,UAAA,CAAY,YAAA,CACZ,OAAA,CAAS,UACT,MAAA,CAAQ,QAAA,CACR,SAAU,UAAA,CACV,UAAA,CAAY,aACZ,UAAA,CAAY,YAAA,CACZ,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,UAAA,CACZ,QAAS,SAAA,CACT,OAAA,CAAS,SAAA,CACT,KAAA,CAAO,OAAA,CACP,KAAA,CAAO,QACP,WAAA,CAAa,WAAA,CACb,eAAA,CAAiB,cAAA,CACjB,aAAA,CAAe,aAAA,CACf,UAAW,WAAA,CACX,KAAA,CAAO,QACP,OAAA,CAAS,SAAA,CACT,KAAM,MAAA,CACN,gBAAA,CAAkB,eAAA,CAClB,aAAA,CAAe,YAAA,CACf,iBAAA,CAAmB,iBACnB,0BAAA,CAA4B,gBAAA,CAC5B,MAAA,CAAQ,OAAA,CACR,IAAA,CAAM,MAAA,CACN,SAAU,UAAA,CACV,KAAA,CAAO,OAAA,CACP,gCAAA,CAAkC,+BAAA,CAClC,MAAA,CAAQ,SACR,kBAAA,CAAoB,iBAAA,CACpB,SAAU,UAAA,CACV,IAAA,CAAM,OACN,WAAA,CAAa,aAAA,CACb,iBAAA,CAAmB,kBAAA,CACnB,MAAA,CAAQ,OAAA,CACR,SAAU,UAAA,CACV,aAAA,CAAe,aAAA,CACf,KAAA,CAAO,OAAA,CACP,OAAA,CAAS,aACT,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,UAAA,CACR,MAAA,CAAQ,QAAA,CACR,eAAgB,cAAA,CAChB,uBAAA,CAAyB,uBACzB,aAAA,CAAe,aAAA,CACf,4BAA6B,0BAAA,CAC7B,kCAAA,CAAoC,8BAAA,CACpC,kBAAA,CAAoB,qBAAA,CACpB,4BAAA,CAA8B,4BAC9B,KAAA,CAAO,OAAA,CACP,YAAA,CAAc,YAAA,CACd,uBAAA,CAAyB,+BAAA,CACzB,eAAgB,cAAA,CAChB,OAAA,CAAS,SAAA,CACT,MAAA,CAAQ,QAAA,CACR,UAAA,CAAY,cACZ,cAAA,CAAgB,cAAA,CAChB,UAAW,WAAA,CACX,2BAAA,CAA6B,iCAC7B,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,UAAA,CACV,iBAAA,CAAmB,iBAAA,CACnB,QAAS,SAAA,CACT,cAAA,CAAgB,eAAA,CAChB,eAAA,CAAiB,gBAAA,CACjB,aAAA,CAAe,eACf,aAAA,CAAe,cAAA,CACf,KAAA,CAAO,QAAA,CACP,WAAA,CAAa,WAAA,CACb,MAAO,OAAA,CACP,QAAA,CAAU,UACV,gCAAA,CAAkC,uBAAA,CAClC,UAAW,WAAA,CACX,MAAA,CAAQ,SAAA,CACR,WAAA,CAAa,QAAA,CACb,KAAA,CAAO,QACP,MAAA,CAAQ,QAAA,CACR,UAAA,CAAY,cAAA,CACZ,QAAA,CAAU,UAAA,CACV,SAAU,UAAA,CACV,aAAA,CAAe,SAAA,CACf,IAAA,CAAM,MAAA,CACN,OAAA,CAAS,UACT,KAAA,CAAO,OAAA,CACP,sBAAuB,oBAAA,CACvB,OAAA,CAAS,UACT,MAAA,CAAQ,QAAA,CACR,YAAA,CAAc,cAAA,CACd,0BAAA,CAA4B,0BAAA,CAC5B,OAAQ,QAAA,CACR,MAAA,CAAQ,QAAA,CACR,OAAA,CAAS,SAAA,CACT,sBAAA,CAAwB,+BACxB,gBAAA,CAAkB,eAAA,CAClB,eAAA,CAAiB,KAAA,CACjB,sCAAA,CAAwC,yBAAA,CACxC,QAAS,SAAA,CACT,UAAA,CAAY,aACZ,OAAA,CAAS,SAAA,CACT,gCAAiC,kCAAA,CACjC,SAAA,CAAW,WAAA,CACX,OAAA,CAAS,SAAA,CACT,0BAAA,CAA4B,4BAC5B,qBAAA,CAAuB,sBAAA,CACvB,2BAAA,CAA6B,2BAAA,CAC7B,gBAAA,CAAkB,aAAA,CAClB,MAAO,OAAA,CACP,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,UACZ,MCngEaC,EAAAA,CAAiB,CAC5B,eAAA,CACA,aAAA,CACA,SAAA,CACA,WAAA,CACA,WACA,QAAA,CACA,QACF,CAAA,CAOaC,EAAAA,CAAkB,CAC7B,wBAAA,CACA,8BACA,kCAAA,CACA,+BAAA,CACA,iCACF,CAAA,CAGaC,EAAAA,CAA0B,CAAC,OAAQ,MAAA,CAAQ,MAAM,CAAA,CAGjDC,EAAAA,CAAyB,CACpC,MAAA,CACA,OACA,MAAA,CACA,MAAA,CACA,OACA,MAAA,CACA,MAAA,CACA,OACA,MAAA,CACA,MAAA,CACA,MAAA,CACA,MAAA,CACA,MAAA,CACA,MAAA,CACA,MACF,CAAA,CAGaC,EAAAA,CAAwB,CAAC,MAAM,CAAA,CAG/BC,EAAAA,CAAiC,CAC5C,QAAA,CACA,UAAA,CACA,MACF,CAAA,CAGaC,EAAAA,CAAyB,CACpC,mBACA,iBAAA,CACA,kBACF,EASaC,EAAAA,CAAmB,CAC9B,YACA,UAAA,CACA,SAAA,CACA,QAAA,CACA,aAAA,CACA,YAAA,CACA,SAAA,CACA,WACA,WAAA,CACA,SAAA,CACA,WAAA,CACA,SAAA,CACA,SAAA,CACA,UAAA,CACA,QACA,QAAA,CACA,OAAA,CACA,SAAA,CACA,UAAA,CACA,OAAA,CACA,UAAA,CACA,UACA,QAAA,CACA,QAAA,CACA,QACA,UAAA,CACA,OAAA,CACA,SACA,OAAA,CACA,WAAA,CACA,WAAA,CACA,MAAA,CACA,YAAA,CACA,OAAA,CACA,UACA,UAAA,CACA,UAAA,CACA,QAAA,CACA,OAAA,CACA,QAAA,CACA,QAAA,CACA,UACA,YAAA,CACA,OAAA,CACA,UAAA,CACA,SAAA,CACA,QAAA,CACA,WAAA,CACA,QACA,QAAA,CACA,QAAA,CACA,aACA,UAAA,CACA,SAAA,CACA,UACA,OAAA,CACA,SAAA,CACA,QAAA,CACA,SAAA,CACA,QAAA,CACA,SAAA,CACA,YACA,SAAA,CACA,SAAA,CACA,SAAA,CACA,OAAA,CACA,QAAA,CACA,MAAA,CACA,UACA,WAAA,CACA,MAAA,CACA,OAAA,CACA,YAAA,CACA,QAAA,CACA,MACF,EAOaC,EAAAA,CAAgB,CAC3B,SACA,UAAA,CACA,cAAA,CACA,WACA,QAAA,CACA,QACF,CAAA,CAOaC,EAAAA,CAA0B,CACrC,IAAA,CACA,UACA,YAAA,CACA,YAAA,CACA,IAAA,CACA,IAAA,CACA,IACF,CAAA,CAKaC,GAAkB,CAC7B,SAAA,CACA,UAAA,CACA,UAAA,CACA,QAAA,CACA,QAAA,CACA,YACA,MAAA,CACA,UAAA,CACA,SACA,WAAA,CACA,QAAA,CACA,WACA,gBAAA,CACA,UAAA,CACA,QAAA,CACA,QAAA,CACA,SAAA,CACA,OAAA,CACA,QACA,QAAA,CACA,UAAA,CACA,SAAA,CACA,OACF,EC1LO,IAAMC,GAAc,CACzB,QAAA,CACA,UAAA,CACA,UAAA,CACA,WAAA,CACA,MAAA,CACA,YACA,QAAA,CACA,cAAA,CACA,eACA,QAAA,CACA,WAAA,CACA,YACA,YAAA,CACA,UACF,CAAA,CASaC,EAAAA,CAAwB,CACnC,QAAA,CACA,YACA,MAAA,CACA,WAAA,CACA,QAAA,CACA,cAAA,CACA,cAAA,CACA,QAAA,CACA,YACA,WAAA,CACA,YAAA,CACA,UACF,CAAA,CAOaC,EAAAA,CAA+C,CAC1D,SACA,WAAA,CACA,MAAA,CACA,YACA,QAAA,CACA,QAAA,CACA,eACA,cAAA,CACA,YAAA,CACA,UAAA,CACA,WAAA,CACA,WACF,EAQO,SAASC,EAAAA,CAAuBC,CAAAA,CAAyB,CAC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","file":"index.js","sourcesContent":["/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * Generic function to merge custom order with default order.\n *\n * Items specified in customOrder will have higher priority and appear first\n * in the result. Remaining items will follow in the default order.\n *\n * Duplicate items in customOrder will be deduplicated (first occurrence kept).\n * Items in customOrder that are not in defaultOrder will be ignored.\n *\n * @param customOrder - Array of items with custom priority order\n * @param defaultOrder - Array of items in default order\n * @returns Merged order array\n */\nexport function mergeArrayWithOrder<T>(\n customOrder: T[] | undefined | null,\n defaultOrder: T[]\n): T[] {\n if (!customOrder || customOrder.length === 0) {\n return defaultOrder\n }\n\n // create a set of valid items from defaultOrder for fast lookup\n const validItems = new Set(defaultOrder)\n\n // filter and deduplicate custom order (keep first occurrence, ignore invalid\n // items)\n const deduplicatedCustomOrder: T[] = []\n const seen = new Set<T>()\n\n for (const item of customOrder) {\n // only include items that exist in defaultOrder and haven't been seen\n // before\n if (validItems.has(item) && !seen.has(item)) {\n deduplicatedCustomOrder.push(item)\n seen.add(item)\n }\n }\n\n // get remaining items that are not in custom order\n const remainingItems = defaultOrder.filter((item) => !seen.has(item))\n\n // return deduplicated custom items first, followed by remaining items in\n // default order\n return [...deduplicatedCustomOrder, ...remainingItems]\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { isObject, transform } from 'lodash-es'\n\n/**\n * Check if a value is empty\n *\n * Empty values include `undefined`, `null`, empty object and empty string\n *\n * @param value - value to check\n * @returns True if value is empty, false otherwise\n *\n * @see {@link https://stackoverflow.com/a/43233163}\n */\nexport function isEmptyValue(value: undefined | null | object | string) {\n return (\n value === undefined ||\n value === null ||\n (typeof value === 'object' && Object.keys(value).length === 0) ||\n (typeof value === 'string' && value.trim().length === 0)\n )\n}\n\n/**\n * Remove keys from an object by their names\n *\n * @param obj - The object to remove keys from\n * @param keysToRemove - The keys to remove\n * @returns The object with the specified keys removed\n */\nexport function removeKeysFromObject<T extends object>(\n obj: T,\n keysToRemove: (string | number | symbol)[]\n): T {\n return transform(\n obj,\n (result, value: unknown, key: number | string | symbol) => {\n if (keysToRemove.includes(key)) return\n\n result[key] = isObject(value)\n ? removeKeysFromObject(value, keysToRemove)\n : value\n }\n )\n}\n\n/**\n * Tree walker function to collect all possible keys from an object recursively\n *\n * This function traverses an object tree and collects all property keys at any\n * depth. It handles arrays, nested objects, and prevents infinite loops from\n * circular references.\n *\n * @param obj - The object to walk through\n * @param keys - Set to collect all keys (optional, used for recursion)\n * @param visited - Set to track visited objects to prevent circular references\n * (optional, used for recursion)\n * @returns Set containing all keys found in the object tree\n *\n * @example\n * ```typescript\n * const obj = {\n * a: 1,\n * b: {\n * c: 2,\n * d: [{ e: 3 }]\n * }\n * }\n * const keys = collectAllKeys(obj)\n * // keys will contain: Set(['a', 'b', 'c', 'd', 'e'])\n * ```\n */\nexport function collectAllKeys(\n obj: unknown,\n keys: Set<string | number | symbol> = new Set(),\n visited: WeakSet<object> = new WeakSet()\n): Set<string | number | symbol> {\n if (obj === null || obj === undefined) {\n return keys\n }\n\n if (typeof obj === 'object') {\n // Prevent circular references\n if (visited.has(obj as object)) {\n return keys\n }\n visited.add(obj as object)\n\n if (Array.isArray(obj)) {\n // For arrays, collect keys from each element\n obj.forEach((item) => {\n collectAllKeys(item, keys, visited)\n })\n } else {\n // For objects, collect all property keys and recurse into values\n Object.keys(obj).forEach((key) => {\n keys.add(key)\n collectAllKeys((obj as Record<string, unknown>)[key], keys, visited)\n })\n }\n }\n\n return keys\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { LocaleLanguage } from '@/models'\nimport { isEmptyValue } from './object'\n\n/**\n * Parse date from a string\n *\n * @param dateStr - date string, `null` or `undefined`\n * @returns Date object if parse success, otherwise `null`\n */\nexport function parseDate(dateStr: string | undefined | null): Date | null {\n if (isEmptyValue(dateStr)) return null\n\n try {\n const date = new Date(dateStr)\n // MDN says that date parsing may return NaN or raise exceptions, ref:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_date\n return Number.isNaN(date.getTime()) ? null : date\n } catch (_e) {\n return null\n }\n}\n\n/**\n * Localize a date string to a specific language.\n *\n * @param date - The date string to localize.\n * @param language - The language to localize the date string to.\n * @returns The localized date string.\n */\nexport function localizeDate(\n date: string,\n language: LocaleLanguage | string\n): string {\n if (date === '') {\n return ''\n }\n\n // for resumes, we only care about the year and month\n const options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n }\n\n const dateObj = new Date(date)\n\n // if the date is invalid, return the original date string\n if (Number.isNaN(dateObj.getTime())) {\n return date\n }\n\n return dateObj.toLocaleDateString(\n isEmptyValue(language) ? 'en' : language,\n options\n )\n}\n\n/**\n * Get the date range for a given start and end date.\n *\n * @param startDate - The start date.\n * @param endDate - The end date.\n * @param language - The language to localize the date string to.\n * @returns The date range.\n */\nexport function getDateRange(\n startDate: string,\n endDate: string,\n language: LocaleLanguage\n): string {\n if (!startDate) {\n return ''\n }\n\n if (!endDate) {\n switch (language) {\n case 'zh-hans':\n case 'zh-hant-hk':\n case 'zh-hant-tw':\n return `${localizeDate(startDate, language)}至今`\n case 'es':\n return `${localizeDate(startDate, language)} hasta la fecha`\n case 'no':\n return `${localizeDate(startDate, language)}–Nå`\n default:\n // by default we return English's \"Present\" if language is not supported\n return `${localizeDate(startDate, language)}–Present`\n }\n }\n\n // Please note that we use en-dash instead of hyphen as the date separator\n return `${localizeDate(startDate, language)}–${localizeDate(\n endDate,\n language\n )}`\n}\n\n/**\n * The number of seconds in one day\n */\nexport const ONE_DAY = 24 * 60 * 60\n\n/**\n * Get the current time in UTC seconds\n *\n * @returns The current time in UTC seconds\n */\nexport function nowInUTCSeconds(): number {\n return Math.floor(Date.now() / 1000)\n}\n\n/**\n * Generate a local date string without timestamp for a epoch time in seconds\n *\n * @param epochTime - epoch time in seconds\n * @param locale - locale for the date string\n * @returns - a human readable date string\n */\nexport function epochSecondsToLocaleDateString(\n epochTime: number,\n locale = 'en-US'\n) {\n return new Date(epochTime * 1000).toLocaleDateString(locale, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n })\n}\n\n/**\n * Convert milliseconds to seconds\n */\nexport function milliSecondsToSeconds(ms: number) {\n return Math.floor(ms / 1000)\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport rawEscapeLatex from 'escape-latex'\nimport { isEmptyValue } from './object'\n\n/**\n * Escape HTML entities in text.\n *\n * @param text - The text to escape.\n * @returns The escaped text.\n */\nexport function escapeHtml(text: string): string {\n const map: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n }\n\n return text.replace(/[&<>\"']/g, (m) => map[m])\n}\n\n/**\n * A wrapper around the escape-latex that handles null and undefined values.\n *\n * @param value - value to be escaped\n * @returns escaped value\n */\nexport function escapeLatex(value: string | null | undefined) {\n if (isEmptyValue(value)) {\n return value\n }\n\n return rawEscapeLatex(value)\n}\n\n/**\n * Check if a string is empty or only contains whitespace\n *\n * @param value - string to check\n * @returns True if string is empty or only contains whitespace, false otherwise\n */\nexport function isEmptyString(value: string) {\n return typeof value === 'string' && value.trim().length === 0\n}\n\n/**\n * Show content if predicate is true\n *\n * @param predicate - The predicate to check\n * @param content - The content to show\n * @returns The content if predicate is true, empty string otherwise\n */\nexport function showIf(predicate: boolean, content: string) {\n return predicate ? content : ''\n}\n\n/**\n * Show content if value is not empty\n *\n * @param value - The value to check (undefined, null, object, or string)\n * @param content - The content to show\n * @returns The content if value is not empty, empty string otherwise\n */\nexport function showIfNotEmpty(\n value: undefined | null | object | string,\n content: string\n) {\n return showIf(!isEmptyValue(value), content)\n}\n\n/**\n * Join an array of strings , but only if the string is not empty\n *\n * @param codes - The array of strings to join\n * @param separator - The separator to join the strings with\n * @returns The joined string\n */\nexport function joinNonEmptyString(\n codes: string[],\n separator = '\\n\\n'\n): string {\n return codes.filter((code) => !isEmptyString(code)).join(separator)\n}\n\n/**\n * Convert a string to a code block in markdown format\n *\n * @param code - The string to convert\n * @param lang - The language of the code block\n * @returns The code block\n */\nexport function toCodeBlock(code?: string, lang?: string): string {\n if (isEmptyValue(code)) {\n return ''\n }\n\n return `\\`\\`\\`${lang || ''}\\n${code}\\n\\`\\`\\``\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type {\n BulletListNode,\n DocNode,\n Fragment,\n ListItemNode,\n Mark,\n Node,\n OrderedListNode,\n ParagraphNode,\n TextNode,\n} from '@/compiler/ast'\nimport { escapeHtml } from '@/utils'\nimport type { CodeGenerationContext, CodeGenerator } from './interface'\n\n/**\n * Generate HTML code from a Node.\n *\n * This class implements the `CodeGenerator` interface and provides a method\n * to convert an AST node into its corresponding HTML code.\n *\n * @see {@link CodeGenerator}\n */\nexport class HtmlCodeGenerator implements CodeGenerator {\n /**\n * Generate HTML code from an AST node.\n *\n * @param node - The AST node to generate HTML code from.\n * @param context - Optional context containing layout settings.\n * @returns The generated HTML code.\n */\n generate(node: Node, context?: CodeGenerationContext): string {\n return nodeToHTML(node, context)\n }\n}\n\n/**\n * Convert an AST node to its corresponding HTML code.\n *\n * @param node - The AST node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated HTML code.\n */\nexport function nodeToHTML(\n node: Node,\n context?: CodeGenerationContext\n): string {\n switch (node.type) {\n case 'bulletList':\n return bulletListNodeToHTML(node, context)\n case 'doc':\n return docNodeToHTML(node, context)\n case 'listItem':\n return listItemNodeToHTML(node, context)\n case 'orderedList':\n return orderedListNodeToHTML(node, context)\n case 'paragraph':\n return paragraphNodeToHTML(node, context)\n case 'text':\n return textNodeToHTML(node, context)\n }\n}\n\n/**\n * Convert a bullet list node to its corresponding HTML code.\n *\n * @param node - The bullet list node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated HTML code.\n */\nfunction bulletListNodeToHTML(\n node: BulletListNode,\n context?: CodeGenerationContext\n): string {\n return `<ul>${fragmentToHTML(node.content, context)}</ul>`\n}\n\n/**\n * Convert a document node to its corresponding HTML code.\n *\n * @param node - The document node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated HTML code.\n */\nfunction docNodeToHTML(node: DocNode, context?: CodeGenerationContext): string {\n return fragmentToHTML(node.content, context)\n}\n\n/**\n * Convert a list item node to its corresponding HTML code.\n *\n * @param node - The list item node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated HTML code.\n */\nfunction listItemNodeToHTML(\n node: ListItemNode,\n context?: CodeGenerationContext\n): string {\n return `<li>${fragmentToHTML(node.content, context)}</li>`\n}\n\n/**\n * Convert an ordered list node to its corresponding HTML code.\n *\n * @param node - The ordered list node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated HTML code.\n */\nfunction orderedListNodeToHTML(\n node: OrderedListNode,\n context?: CodeGenerationContext\n): string {\n return `<ol>${fragmentToHTML(node.content, context)}</ol>`\n}\n\n/**\n * Convert a paragraph node to its corresponding HTML code.\n *\n * @param node - The paragraph node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated HTML code.\n */\nfunction paragraphNodeToHTML(\n node: ParagraphNode,\n context?: CodeGenerationContext\n): string {\n if (node.content === undefined || node.content.length === 0) {\n return '<p></p>'\n }\n\n return `<p>${fragmentToHTML(node.content, context)}</p>`\n}\n\n/**\n * Convert a text node to its corresponding HTML code.\n *\n * @param node - The text node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated HTML code.\n */\nfunction textNodeToHTML(\n node: TextNode,\n context?: CodeGenerationContext\n): string {\n // Escape HTML entities\n const escapedText = escapeHtml(node.text)\n\n if (node.marks === undefined) {\n return escapedText\n }\n\n return node.marks.reduce(\n (text, mark) => applyMarkToText(text, mark, context),\n escapedText\n )\n}\n\n/**\n * Apply a mark to a text.\n *\n * @param text - The text to apply the mark to.\n * @param mark - The mark to apply.\n * @param context - Optional context containing layout settings.\n */\nfunction applyMarkToText(\n text: string,\n mark: Mark,\n _context?: CodeGenerationContext\n) {\n switch (mark.type) {\n case 'bold':\n return `<strong>${text}</strong>`\n case 'italic':\n return `<em>${text}</em>`\n case 'link': {\n const href = mark.attrs?.href || '#'\n const target = mark.attrs?.target\n ? ` target=\"${escapeHtml(mark.attrs.target)}\"`\n : ''\n const className = mark.attrs?.class\n ? ` class=\"${escapeHtml(mark.attrs.class)}\"`\n : ''\n\n return `<a href=\"${escapeHtml(href)}\"${target}${className}>${text}</a>`\n }\n }\n}\n\n/**\n * Convert a fragment to its corresponding HTML code.\n *\n * @param fragment - The fragment to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated HTML code.\n */\nfunction fragmentToHTML(\n fragment: Fragment,\n context?: CodeGenerationContext\n): string {\n if (fragment === undefined) {\n return ''\n }\n return fragment.map((node) => nodeToHTML(node, context)).join('')\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type {\n BulletListNode,\n DocNode,\n Fragment,\n ListItemNode,\n Mark,\n Node,\n OrderedListNode,\n ParagraphNode,\n TextNode,\n} from '@/compiler/ast'\nimport type { LatexLayout } from '@/models'\nimport { escapeLatex } from '@/utils'\nimport type { CodeGenerationContext, CodeGenerator } from './interface'\n\n/**\n * Generate LaTeX code from a Node.\n *\n * This class implements the `CodeGenerator` interface and provides a method\n * to convert an AST node into its corresponding LaTeX code.\n *\n * @see {@link CodeGenerator}\n */\nexport class LatexCodeGenerator implements CodeGenerator {\n /**\n * Generate LaTeX code from an AST node.\n *\n * @param node - The AST node to generate LaTeX code from.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\n generate(node: Node, context?: CodeGenerationContext): string {\n return nodeToTeX(node, context)\n }\n}\n\n/**\n * Convert an AST node to its corresponding LaTeX code.\n *\n * @param node - The AST node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nexport function nodeToTeX(node: Node, context?: CodeGenerationContext): string {\n switch (node.type) {\n case 'bulletList':\n return bulletListNodeToTeX(node, context)\n case 'doc':\n return docNodeToTeX(node, context)\n case 'listItem':\n return listItemNodeToTeX(node, context)\n case 'orderedList':\n return orderedListNodeToTeX(node, context)\n case 'paragraph':\n return paragraphNodeToTeX(node, context)\n case 'text':\n return textNodeToTeX(node, context)\n }\n}\n\n/**\n * Convert a bullet list node to its corresponding LaTeX code.\n *\n * @param node - The bullet list node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nfunction bulletListNodeToTeX(\n node: BulletListNode,\n context?: CodeGenerationContext\n): string {\n return `\\\\begin{itemize}\\n${fragmentToTeX(node.content, context)}\\\\end{itemize}\\n`\n}\n\n/**\n * Convert a document node to its corresponding LaTeX code.\n *\n * @param node - The document node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nfunction docNodeToTeX(node: DocNode, context?: CodeGenerationContext): string {\n return fragmentToTeX(node.content, context)\n}\n\n/**\n * Convert a list item node to its corresponding LaTeX code.\n *\n * @param node - The list item node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nfunction listItemNodeToTeX(\n node: ListItemNode,\n context?: CodeGenerationContext\n): string {\n const itemContent = fragmentToTeX(node.content, context)\n // Here we made some special handling to make the output with more prettier\n if (itemContent.includes('\\n\\n')) {\n return `\\\\item ${itemContent.replace('\\n\\n', '\\n')}`\n }\n return `\\\\item ${itemContent}`\n}\n\n/**\n * Convert an ordered list node to its corresponding LaTeX code.\n *\n * @param node - The ordered list node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nfunction orderedListNodeToTeX(\n node: OrderedListNode,\n context?: CodeGenerationContext\n): string {\n return `\\\\begin{enumerate}\\n${fragmentToTeX(node.content, context)}\\\\end{enumerate}\\n`\n}\n\n/**\n * Convert a paragraph node to its corresponding LaTeX code.\n *\n * @param node - The paragraph node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nfunction paragraphNodeToTeX(\n node: ParagraphNode,\n context?: CodeGenerationContext\n): string {\n if (node.content === undefined || node.content.length === 0) {\n return '\\n'\n }\n\n // We need to output two new lines to make the paragraph a real paagraph in\n // LaTeX. However if the paragraph is empty, we just output one new line,\n // check the `if` above.\n return `${fragmentToTeX(node.content, context)}\\n\\n`\n}\n\n/**\n * Convert a text node to its corresponding LaTeX code.\n *\n * @param node - The text node to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nfunction textNodeToTeX(\n node: TextNode,\n context?: CodeGenerationContext\n): string {\n const escapedText = escapeLatex(node.text)\n\n if (node.marks === undefined) {\n return escapedText\n }\n\n return node.marks.reduce(\n (text, mark) => applyMarkToText(text, mark, context),\n escapedText\n )\n}\n\n/**\n * Apply a mark to a text.\n *\n * @param text - The text to apply the mark to.\n * @param mark - The mark to apply.\n * @param context - Optional context containing layout settings.\n */\nfunction applyMarkToText(\n text: string,\n mark: Mark,\n context?: CodeGenerationContext\n) {\n switch (mark.type) {\n case 'bold':\n return `\\\\textbf{${text}}`\n case 'italic':\n return `\\\\textit{${text}}`\n case 'link': {\n const shouldUnderline =\n (context?.typography as LatexLayout['typography'])?.links?.underline ??\n false\n if (shouldUnderline) {\n return `\\\\href{${mark.attrs.href}}{\\\\underline{${text}}}`\n }\n return `\\\\href{${mark.attrs.href}}{${text}}`\n }\n }\n}\n\n/**\n * Convert a fragment to its corresponding LaTeX code.\n *\n * @param fragment - The fragment to convert.\n * @param context - Optional context containing layout settings.\n * @returns The generated LaTeX code.\n */\nfunction fragmentToTeX(\n fragment: Fragment,\n context?: CodeGenerationContext\n): string {\n if (fragment === undefined) {\n return ''\n }\n return fragment.map((node) => nodeToTeX(node, context)).join('')\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Root, RootContent } from 'mdast'\nimport remarkParse from 'remark-parse'\nimport { unified } from 'unified'\n\nimport type { BoldMark, ItalicMark, LinkMark, Mark, Node } from '@/compiler/ast'\nimport type { Parser } from './interface'\n\n/**\n * Parse markdown to ast node\n *\n * Under the hood this class first parse the markdown to mdast and then\n * transform the mdast to ast node.\n *\n * @see {@link Parser}\n */\nexport class MarkdownParser implements Parser {\n /**\n * Parse markdown to ast node\n *\n * @param input - The markdown input to parse\n * @returns The ast node\n */\n parse(input: string): Node {\n const ast = unified().use(remarkParse).parse(input)\n return transform(ast)\n }\n}\n\n/**\n * Transforms an mdast node (or content) into ast node(s).\n *\n * This is a recursive descent tree walker that traverses the mdast node and\n * transforms it into a ast node representation. It accumulates formatting marks\n * (like bold, italic) as it descends.\n *\n * @param ast - The mdast node (Root or RootContent) to transform.\n * @param marks - The formatting marks accumulated from parent nodes to apply.\n * Defaults to an empty array.\n * @returns The corresponding ast node, an array of ast nodes (for nodes\n * that expand like emphasis/strong), or `null` if the mdast node type isn't\n * handled.\n */\nfunction transform(ast: Root | RootContent, marks: Mark[] = []) {\n switch (ast.type) {\n case 'root':\n return {\n type: 'doc',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n\n case 'paragraph':\n return {\n type: 'paragraph',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n\n // Text nodes get all accumulated marks applied\n case 'text':\n return {\n type: 'text',\n text: ast.value,\n ...(marks.length > 0 && {\n marks: marks,\n }),\n }\n\n // For text nodes with marks, we accumulate the mark and pass it down to\n // children\n case 'strong': {\n const boldMark: BoldMark = { type: 'bold' }\n return processChildrenWithMarks(ast.children, [...marks, boldMark])\n }\n\n case 'emphasis': {\n const italicMark: ItalicMark = { type: 'italic' }\n return processChildrenWithMarks(ast.children, [...marks, italicMark])\n }\n\n case 'link': {\n const linkMark: LinkMark = {\n type: 'link',\n attrs: {\n href: ast.url,\n target: null,\n class: null,\n },\n }\n return processChildrenWithMarks(ast.children, [...marks, linkMark])\n }\n\n case 'listItem':\n return {\n type: 'listItem',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n\n case 'list':\n return {\n type: ast.ordered ? 'orderedList' : 'bulletList',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n }\n\n return null\n}\n\n/**\n * Process children with accumulated marks\n *\n * This function processes the children of a node with accumulated marks and\n * returns a flat array of transformed nodes.\n *\n * @param children - The children of the node to process.\n * @param marks - The accumulated marks to apply to the node.\n * @returns The transformed ast node if only one results from the children,\n * otherwise an array of the transformed ast nodes.\n */\nfunction processChildrenWithMarks(children: RootContent[], marks: Mark[]) {\n // Transform each child with the accumulated marks\n const transformedNodes = children\n .map((child) => transform(child, marks))\n .filter(Boolean)\n\n // If only one node is returned (common case), return it directly\n if (transformedNodes.length === 1) {\n return transformedNodes[0]\n }\n\n // If multiple nodes (e.g., complex formatting spanning multiple text nodes),\n // return them all to be added to parent's content\n return transformedNodes\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { joinNonEmptyString } from '@/utils'\n\n/**\n * Error categories using bitwise flags\n *\n * First 3 bits for category, last 5 bits for specific errors, total range:\n * 0-255 (8 bits), that is also the range of errno accepted by `process.exit`\n *\n * For now we have 3 categories of errors:\n *\n * - File related errors\n * - Format parsing errors\n * - LaTeX related errors\n */\nexport const ErrorCategory = {\n FILE: 0x00, // 00000000\n FORMAT: 0x20, // 00100000\n LATEX: 0x40, // 01000000\n} as const\n\n/**\n * Enum of error codes for YAMLResumeError.\n *\n * Error codes are used to identify specific errors and can be used to\n * internationalize error messages.\n */\nexport const ErrorType = {\n // File related errors (0x00 - 0x1F)\n FILE_NOT_FOUND: {\n code: 'FILE_NOT_FOUND',\n errno: ErrorCategory.FILE | 0x01,\n message: 'Resume not found: {path}',\n path: '',\n },\n FILE_READ_ERROR: {\n code: 'FILE_READ_ERROR',\n errno: ErrorCategory.FILE | 0x02,\n message: 'Failed to read resume file: {path}',\n path: '',\n },\n FILE_WRITE_ERROR: {\n code: 'FILE_WRITE_ERROR',\n errno: ErrorCategory.FILE | 0x03,\n message: 'Failed to write file: {path}',\n path: '',\n },\n FILE_CONFLICT: {\n code: 'FILE_CONFLICT',\n errno: ErrorCategory.FILE | 0x04,\n message: joinNonEmptyString(\n [\n 'File already exists: {path}.',\n 'Please choose a different filename or remove the existing file.',\n ],\n ' '\n ),\n path: '',\n },\n INVALID_EXTNAME: {\n code: 'INVALID_EXTNAME',\n errno: ErrorCategory.FILE | 0x05,\n message: joinNonEmptyString(\n [\n 'Invalid file extension: {extname}.',\n 'Supported formats are: yaml, yml, json.',\n ],\n ' '\n ),\n extname: '',\n },\n\n // Format parsing errors (0x20 - 0x3F)\n INVALID_YAML: {\n code: 'INVALID_YAML',\n errno: ErrorCategory.FORMAT | 0x01,\n message: 'Invalid YAML format: {error}',\n error: '',\n },\n INVALID_JSON: {\n code: 'INVALID_JSON',\n errno: ErrorCategory.FORMAT | 0x02,\n message: 'Invalid JSON format: {error}',\n error: '',\n },\n\n // LaTeX related errors (0x40 - 0x5F)\n LATEX_NOT_FOUND: {\n code: 'LATEX_NOT_FOUND',\n errno: ErrorCategory.LATEX | 0x01,\n message:\n 'LaTeX compiler not found. Please install either xelatex or tectonic',\n },\n LATEX_COMPILE_ERROR: {\n code: 'LATEX_COMPILE_ERROR',\n errno: ErrorCategory.LATEX | 0x02,\n message: 'LaTeX compilation failed: {error}',\n error: '',\n },\n} as const\n\n/**\n * Helper functions for working with error numbers\n */\nexport const ErrorUtils = {\n /**\n * Get the category of an error number\n *\n * @param errno - The error number\n * @returns The category name or undefined if not found\n */\n getCategory(errno: number): keyof typeof ErrorCategory | undefined {\n const category = errno & 0x60 // 01100000\n return Object.entries(ErrorCategory).find(\n ([_, value]) => value === category\n )?.[0] as keyof typeof ErrorCategory\n },\n\n /**\n * Get the subcategory (specific error) of an error number\n *\n * @param errno - The error number\n * @returns The subcategory number\n */\n getSubcategory(errno: number): number {\n return errno & 0x1f // 00011111\n },\n\n /**\n * Check if an error number belongs to a specific category\n * @param errno - The error number\n * @param category - The category to check\n * @returns True if the error belongs to the category\n */\n isCategory(errno: number, category: keyof typeof ErrorCategory): boolean {\n return (errno & 0x60) === ErrorCategory[category]\n },\n} as const\n\n/**\n * Type for the error code.\n */\nexport type ErrorCodeType = keyof typeof ErrorType\n\n/**\n * Type for the error message parameters.\n */\nexport type ErrorMessageParams = {\n [K in ErrorCodeType]: {\n [P in keyof (typeof ErrorType)[K] as P extends 'message' | 'code' | 'errno'\n ? never\n : P]: string\n }\n}\n\n/**\n * Custom error class for YAMLResume errors.\n */\nexport class YAMLResumeError<T extends ErrorCodeType> extends Error {\n public errno: number\n\n /**\n * Constructor for YAMLResumeError.\n *\n * @param code - The error code.\n * @param params - The error message parameters.\n */\n constructor(\n public code: T,\n params: ErrorMessageParams[T]\n ) {\n const error = ErrorType[code]\n const template = error.message\n const message = template.replace(\n /\\{(\\w+)\\}/g,\n // Use type assertion for safer access, especially if params can be {}\n (_, key) => (params as Record<string, string>)[key] || ''\n )\n super(message)\n this.name = 'YAMLResumeError'\n this.errno = error.errno // Set errno from the definition\n }\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Country } from '@/models'\n\n/**\n * All possible countries and regions in the world.\n */\nexport const COUNTRY_OPTIONS = [\n 'Afghanistan',\n 'Aland Islands',\n 'Albania',\n 'Algeria',\n 'American Samoa',\n 'Andorra',\n 'Angola',\n 'Anguilla',\n 'Antarctica',\n 'Antigua And Barbuda',\n 'Argentina',\n 'Armenia',\n 'Aruba',\n 'Australia',\n 'Austria',\n 'Azerbaijan',\n 'Bahrain',\n 'Bangladesh',\n 'Barbados',\n 'Belarus',\n 'Belgium',\n 'Belize',\n 'Benin',\n 'Bermuda',\n 'Bhutan',\n 'Bolivia',\n 'Bonaire, Sint Eustatius and Saba',\n 'Bosnia and Herzegovina',\n 'Botswana',\n 'Bouvet Island',\n 'Brazil',\n 'British Indian Ocean Territory',\n 'Brunei',\n 'Bulgaria',\n 'Burkina Faso',\n 'Burundi',\n 'Cambodia',\n 'Cameroon',\n 'Canada',\n 'Cape Verde',\n 'Cayman Islands',\n 'Central African Republic',\n 'Chad',\n 'Chile',\n 'China',\n 'Christmas Island',\n 'Cocos (Keeling) Islands',\n 'Colombia',\n 'Comoros',\n 'Congo',\n 'Cook Islands',\n 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\",\n 'Croatia',\n 'Cuba',\n 'Curaçao',\n 'Cyprus',\n 'Czech Republic',\n 'Democratic Republic of the Congo',\n 'Denmark',\n 'Djibouti',\n 'Dominica',\n 'Dominican Republic',\n 'East Timor',\n 'Ecuador',\n 'Egypt',\n 'El Salvador',\n 'Equatorial Guinea',\n 'Eritrea',\n 'Estonia',\n 'Ethiopia',\n 'Falkland Islands',\n 'Faroe Islands',\n 'Fiji Islands',\n 'Finland',\n 'France',\n 'French Guiana',\n 'French Polynesia',\n 'French Southern Territories',\n 'Gabon',\n 'Gambia The',\n 'Georgia',\n 'Germany',\n 'Ghana',\n 'Gibraltar',\n 'Greece',\n 'Greenland',\n 'Grenada',\n 'Guadeloupe',\n 'Guam',\n 'Guatemala',\n 'Guernsey and Alderney',\n 'Guinea',\n 'Guinea-Bissau',\n 'Guyana',\n 'Haiti',\n 'Heard Island and McDonald Islands',\n 'Honduras',\n 'Hong Kong',\n 'Hungary',\n 'Iceland',\n 'India',\n 'Indonesia',\n 'Iran',\n 'Iraq',\n 'Ireland',\n 'Israel',\n 'Italy',\n 'Jamaica',\n 'Japan',\n 'Jersey',\n 'Jordan',\n 'Kazakhstan',\n 'Kenya',\n 'Kiribati',\n 'Kosovo',\n 'Kuwait',\n 'Kyrgyzstan',\n 'Laos',\n 'Latvia',\n 'Lebanon',\n 'Lesotho',\n 'Liberia',\n 'Libya',\n 'Liechtenstein',\n 'Lithuania',\n 'Luxembourg',\n 'Macau',\n 'Madagascar',\n 'Malawi',\n 'Malaysia',\n 'Maldives',\n 'Mali',\n 'Malta',\n 'Man (Isle of)',\n 'Marshall Islands',\n 'Martinique',\n 'Mauritania',\n 'Mauritius',\n 'Mayotte',\n 'Mexico',\n 'Micronesia',\n 'Moldova',\n 'Monaco',\n 'Mongolia',\n 'Montenegro',\n 'Montserrat',\n 'Morocco',\n 'Mozambique',\n 'Myanmar',\n 'Namibia',\n 'Nauru',\n 'Nepal',\n 'Netherlands',\n 'New Caledonia',\n 'New Zealand',\n 'Nicaragua',\n 'Niger',\n 'Nigeria',\n 'Niue',\n 'Norfolk Island',\n 'North Korea',\n 'North Macedonia',\n 'Northern Mariana Islands',\n 'Norway',\n 'Oman',\n 'Pakistan',\n 'Palau',\n 'Palestinian Territory Occupied',\n 'Panama',\n 'Papua new Guinea',\n 'Paraguay',\n 'Peru',\n 'Philippines',\n 'Pitcairn Island',\n 'Poland',\n 'Portugal',\n 'Puerto Rico',\n 'Qatar',\n 'Reunion',\n 'Romania',\n 'Russia',\n 'Rwanda',\n 'Saint Helena',\n 'Saint Kitts And Nevis',\n 'Saint Lucia',\n 'Saint Pierre and Miquelon',\n 'Saint Vincent And The Grenadines',\n 'Saint-Barthelemy',\n 'Saint-Martin (French part)',\n 'Samoa',\n 'San Marino',\n 'Sao Tome and Principe',\n 'Saudi Arabia',\n 'Senegal',\n 'Serbia',\n 'Seychelles',\n 'Sierra Leone',\n 'Singapore',\n 'Sint Maarten (Dutch part)',\n 'Slovakia',\n 'Slovenia',\n 'Solomon Islands',\n 'Somalia',\n 'South Africa',\n 'South Georgia',\n 'South Korea',\n 'South Sudan',\n 'Spain',\n 'Sri Lanka',\n 'Sudan',\n 'Suriname',\n 'Svalbard And Jan Mayen Islands',\n 'Swaziland',\n 'Sweden',\n 'Switzerland',\n 'Syria',\n 'Taiwan',\n 'Tajikistan',\n 'Tanzania',\n 'Thailand',\n 'The Bahamas',\n 'Togo',\n 'Tokelau',\n 'Tonga',\n 'Trinidad And Tobago',\n 'Tunisia',\n 'Turkey',\n 'Turkmenistan',\n 'Turks And Caicos Islands',\n 'Tuvalu',\n 'Uganda',\n 'Ukraine',\n 'United Arab Emirates',\n 'United Kingdom',\n 'United States',\n 'United States Minor Outlying Islands',\n 'Uruguay',\n 'Uzbekistan',\n 'Vanuatu',\n 'Vatican City State (Holy See)',\n 'Venezuela',\n 'Vietnam',\n 'Virgin Islands (British)',\n 'Virgin Islands (US)',\n 'Wallis And Futuna Islands',\n 'Western Sahara',\n 'Yemen',\n 'Zambia',\n 'Zimbabwe',\n] as const\n\n/**\n * Represents all possible countries & regions with their corresponding English\n * names.\n */\nexport const EnglishCountryNames: Record<Country, string> = {\n Afghanistan: 'Afghanistan',\n 'Aland Islands': 'Aland Islands',\n Albania: 'Albania',\n Algeria: 'Algeria',\n 'American Samoa': 'American Samoa',\n Andorra: 'Andorra',\n Angola: 'Angola',\n Anguilla: 'Anguilla',\n Antarctica: 'Antarctica',\n 'Antigua And Barbuda': 'Antigua And Barbuda',\n Argentina: 'Argentina',\n Armenia: 'Armenia',\n Aruba: 'Aruba',\n Australia: 'Australia',\n Austria: 'Austria',\n Azerbaijan: 'Azerbaijan',\n Bahrain: 'Bahrain',\n Bangladesh: 'Bangladesh',\n Barbados: 'Barbados',\n Belarus: 'Belarus',\n Belgium: 'Belgium',\n Belize: 'Belize',\n Benin: 'Benin',\n Bermuda: 'Bermuda',\n Bhutan: 'Bhutan',\n Bolivia: 'Bolivia',\n 'Bonaire, Sint Eustatius and Saba': 'Bonaire',\n 'Bosnia and Herzegovina': 'Bosnia and Herzegovina',\n Botswana: 'Botswana',\n 'Bouvet Island': 'Bouvet Island',\n Brazil: 'Brazil',\n 'British Indian Ocean Territory': 'British Indian Ocean Territory',\n Brunei: 'Brunei',\n Bulgaria: 'Bulgaria',\n 'Burkina Faso': 'Burkina Faso',\n Burundi: 'Burundi',\n Cambodia: 'Cambodia',\n Cameroon: 'Cameroon',\n Canada: 'Canada',\n 'Cape Verde': 'Cape Verde',\n 'Cayman Islands': 'Cayman Islands',\n 'Central African Republic': 'Central African Republic',\n Chad: 'Chad',\n Chile: 'Chile',\n China: 'China',\n 'Christmas Island': 'Christmas Island',\n 'Cocos (Keeling) Islands': 'Cocos (Keeling) Islands',\n Colombia: 'Colombia',\n Comoros: 'Comoros',\n Congo: 'Congo',\n 'Cook Islands': 'Cook Islands',\n 'Costa Rica': 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\": \"Cote D'Ivoire (Ivory Coast)\",\n Croatia: 'Croatia',\n Cuba: 'Cuba',\n Curaçao: 'Curaçao',\n Cyprus: 'Cyprus',\n 'Czech Republic': 'Czech Republic',\n 'Democratic Republic of the Congo': 'Democratic Republic of the Congo',\n Denmark: 'Denmark',\n Djibouti: 'Djibouti',\n Dominica: 'Dominica',\n 'Dominican Republic': 'Dominican Republic',\n 'East Timor': 'East Timor',\n Ecuador: 'Ecuador',\n Egypt: 'Egypt',\n 'El Salvador': 'El Salvador',\n 'Equatorial Guinea': 'Equatorial Guinea',\n Eritrea: 'Eritrea',\n Estonia: 'Estonia',\n Ethiopia: 'Ethiopia',\n 'Falkland Islands': 'Falkland Islands',\n 'Faroe Islands': 'Faroe Islands',\n 'Fiji Islands': 'Fiji Islands',\n Finland: 'Finland',\n France: 'France',\n 'French Guiana': 'French Guiana',\n 'French Polynesia': 'French Polynesia',\n 'French Southern Territories': 'French Southern Territories',\n Gabon: 'Gabon',\n 'Gambia The': 'Gambia The',\n Georgia: 'Georgia',\n Germany: 'Germany',\n Ghana: 'Ghana',\n Gibraltar: 'Gibraltar',\n Greece: 'Greece',\n Greenland: 'Greenland',\n Grenada: 'Grenada',\n Guadeloupe: 'Guadeloupe',\n Guam: 'Guam',\n Guatemala: 'Guatemala',\n 'Guernsey and Alderney': 'Guernsey and Alderney',\n Guinea: 'Guinea',\n 'Guinea-Bissau': 'Guinea-Bissau',\n Guyana: 'Guyana',\n Haiti: 'Haiti',\n 'Heard Island and McDonald Islands': 'Heard Island and McDonald Islands',\n Honduras: 'Honduras',\n 'Hong Kong': 'Hong Kong',\n Hungary: 'Hungary',\n Iceland: 'Iceland',\n India: 'India',\n Indonesia: 'Indonesia',\n Iran: 'Iran',\n Iraq: 'Iraq',\n Ireland: 'Ireland',\n Israel: 'Israel',\n Italy: 'Italy',\n Jamaica: 'Jamaica',\n Japan: 'Japan',\n Jersey: 'Jersey',\n Jordan: 'Jordan',\n Kazakhstan: 'Kazakhstan',\n Kenya: 'Kenya',\n Kiribati: 'Kiribati',\n Kosovo: 'Kosovo',\n Kuwait: 'Kuwait',\n Kyrgyzstan: 'Kyrgyzstan',\n Laos: 'Laos',\n Latvia: 'Latvia',\n Lebanon: 'Lebanon',\n Lesotho: 'Lesotho',\n Liberia: 'Liberia',\n Libya: 'Libya',\n Liechtenstein: 'Liechtenstein',\n Lithuania: 'Lithuania',\n Luxembourg: 'Luxembourg',\n Macau: 'Macau',\n Madagascar: 'Madagascar',\n Malawi: 'Malawi',\n Malaysia: 'Malaysia',\n Maldives: 'Maldives',\n Mali: 'Mali',\n Malta: 'Malta',\n 'Man (Isle of)': 'Man (Isle of)',\n 'Marshall Islands': 'Marshall Islands',\n Martinique: 'Martinique',\n Mauritania: 'Mauritania',\n Mauritius: 'Mauritius',\n Mayotte: 'Mayotte',\n Mexico: 'Mexico',\n Micronesia: 'Micronesia',\n Moldova: 'Moldova',\n Monaco: 'Monaco',\n Mongolia: 'Mongolia',\n Montenegro: 'Montenegro',\n Montserrat: 'Montserrat',\n Morocco: 'Morocco',\n Mozambique: 'Mozambique',\n Myanmar: 'Myanmar',\n Namibia: 'Namibia',\n Nauru: 'Nauru',\n Nepal: 'Nepal',\n Netherlands: 'Netherlands',\n 'New Caledonia': 'New Caledonia',\n 'New Zealand': 'New Zealand',\n Nicaragua: 'Nicaragua',\n Niger: 'Niger',\n Nigeria: 'Nigeria',\n Niue: 'Niue',\n 'Norfolk Island': 'Norfolk Island',\n 'North Korea': 'North Korea',\n 'North Macedonia': 'North Macedonia',\n 'Northern Mariana Islands': 'Northern Mariana Islands',\n Norway: 'Norway',\n Oman: 'Oman',\n Pakistan: 'Pakistan',\n Palau: 'Palau',\n 'Palestinian Territory Occupied': 'Palestinian Territory Occupied',\n Panama: 'Panama',\n 'Papua new Guinea': 'Papua new Guinea',\n Paraguay: 'Paraguay',\n Peru: 'Peru',\n Philippines: 'Philippines',\n 'Pitcairn Island': 'Pitcairn Island',\n Poland: 'Poland',\n Portugal: 'Portugal',\n 'Puerto Rico': 'Puerto Rico',\n Qatar: 'Qatar',\n Reunion: 'Reunion',\n Romania: 'Romania',\n Russia: 'Russia',\n Rwanda: 'Rwanda',\n 'Saint Helena': 'Saint Helena',\n 'Saint Kitts And Nevis': 'Saint Kitts And Nevis',\n 'Saint Lucia': 'Saint Lucia',\n 'Saint Pierre and Miquelon': 'Saint Pierre and Miquelon',\n 'Saint Vincent And The Grenadines': 'Saint Vincent And The Grenadines',\n 'Saint-Barthelemy': 'Saint-Barthelemy',\n 'Saint-Martin (French part)': 'Saint-Martin (French part)',\n Samoa: 'Samoa',\n 'San Marino': 'San Marino',\n 'Sao Tome and Principe': 'Sao Tome and Principe',\n 'Saudi Arabia': 'Saudi Arabia',\n Senegal: 'Senegal',\n Serbia: 'Serbia',\n Seychelles: 'Seychelles',\n 'Sierra Leone': 'Sierra Leone',\n Singapore: 'Singapore',\n 'Sint Maarten (Dutch part)': 'Sint Maarten (Dutch part)',\n Slovakia: 'Slovakia',\n Slovenia: 'Slovenia',\n 'Solomon Islands': 'Solomon Islands',\n Somalia: 'Somalia',\n 'South Africa': 'South Africa',\n 'South Georgia': 'South Georgia',\n 'South Korea': 'South Korea',\n 'South Sudan': 'South Sudan',\n Spain: 'Spain',\n 'Sri Lanka': 'Sri Lanka',\n Sudan: 'Sudan',\n Suriname: 'Suriname',\n 'Svalbard And Jan Mayen Islands': 'Svalbard And Jan Mayen Islands',\n Swaziland: 'Swaziland',\n Sweden: 'Sweden',\n Switzerland: 'Switzerland',\n Syria: 'Syria',\n Taiwan: 'Taiwan',\n Tajikistan: 'Tajikistan',\n Tanzania: 'Tanzania',\n Thailand: 'Thailand',\n 'The Bahamas': 'The Bahamas',\n Togo: 'Togo',\n Tokelau: 'Tokelau',\n Tonga: 'Tonga',\n 'Trinidad And Tobago': 'Trinidad And Tobago',\n Tunisia: 'Tunisia',\n Turkey: 'Turkey',\n Turkmenistan: 'Turkmenistan',\n 'Turks And Caicos Islands': 'Turks And Caicos Islands',\n Tuvalu: 'Tuvalu',\n Uganda: 'Uganda',\n Ukraine: 'Ukraine',\n 'United Arab Emirates': 'United Arab Emirates',\n 'United Kingdom': 'United Kingdom',\n 'United States': 'United States',\n 'United States Minor Outlying Islands':\n 'United States Minor Outlying Islands',\n Uruguay: 'Uruguay',\n Uzbekistan: 'Uzbekistan',\n Vanuatu: 'Vanuatu',\n 'Vatican City State (Holy See)': 'Vatican City State (Holy See)',\n Venezuela: 'Venezuela',\n Vietnam: 'Vietnam',\n 'Virgin Islands (British)': 'Virgin Islands (British)',\n 'Virgin Islands (US)': 'Virgin Islands (US)',\n 'Wallis And Futuna Islands': 'Wallis And Futuna Islands',\n 'Western Sahara': 'Western Sahara',\n Yemen: 'Yemen',\n Zambia: 'Zambia',\n Zimbabwe: 'Zimbabwe',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Simplified Chinese names.\n */\nexport const SimplifiedChineseCountryNames: Record<Country, string> = {\n Afghanistan: '阿富汗',\n 'Aland Islands': '奥兰群岛',\n Albania: '阿尔巴尼亚',\n Algeria: '阿尔及利亚',\n 'American Samoa': '美属萨摩亚',\n Andorra: '安道尔',\n Angola: '安哥拉',\n Anguilla: '安圭拉',\n Antarctica: '南极洲',\n 'Antigua And Barbuda': '安提瓜和巴布达',\n Argentina: '阿根廷',\n Armenia: '亚美尼亚',\n Aruba: '阿鲁巴',\n Australia: '澳大利亚',\n Austria: '奥地利',\n Azerbaijan: '阿塞拜疆',\n Bahrain: '巴林',\n Bangladesh: '孟加拉',\n Barbados: '巴巴多斯',\n Belarus: '白俄罗斯',\n Belgium: '比利时',\n Belize: '伯利兹',\n Benin: '贝宁',\n Bermuda: '百慕大',\n Bhutan: '不丹',\n Bolivia: '玻利维亚',\n 'Bonaire, Sint Eustatius and Saba': '博内尔岛、圣尤斯特歇斯和萨巴岛',\n 'Bosnia and Herzegovina': '波斯尼亚和黑塞哥维那',\n Botswana: '博茨瓦纳',\n 'Bouvet Island': '布维岛',\n Brazil: '巴西',\n 'British Indian Ocean Territory': '英属印度洋领地',\n Brunei: '文莱',\n Bulgaria: '保加利亚',\n 'Burkina Faso': '布基纳法索',\n Burundi: '布隆迪',\n Cambodia: '柬埔寨',\n Cameroon: '喀麦隆',\n Canada: '加拿大',\n 'Cape Verde': '佛得角',\n 'Cayman Islands': '开曼群岛',\n 'Central African Republic': '中非',\n Chad: '乍得',\n Chile: '智利',\n China: '中国',\n 'Christmas Island': '圣诞岛',\n 'Cocos (Keeling) Islands': '科科斯(基林)群岛',\n Colombia: '哥伦比亚',\n Comoros: '科摩罗',\n Congo: '刚果',\n 'Cook Islands': '库克群岛',\n 'Costa Rica': '哥斯达黎加',\n \"Cote D'Ivoire (Ivory Coast)\": '科特迪瓦',\n Croatia: '克罗地亚',\n Cuba: '古巴',\n Curaçao: '库拉索',\n Cyprus: '塞浦路斯',\n 'Czech Republic': '捷克',\n 'Democratic Republic of the Congo': '刚果(金)',\n Denmark: '丹麦',\n Djibouti: '吉布提',\n Dominica: '多米尼加',\n 'Dominican Republic': '多明尼加共和国',\n 'East Timor': '东帝汶',\n Ecuador: '厄瓜多尔',\n Egypt: '埃及',\n 'El Salvador': '萨尔瓦多',\n 'Equatorial Guinea': '赤道几内亚',\n Eritrea: '厄立特里亚',\n Estonia: '爱沙尼亚',\n Ethiopia: '埃塞俄比亚',\n 'Falkland Islands': '福克兰群岛',\n 'Faroe Islands': '法罗群岛',\n 'Fiji Islands': '斐济',\n Finland: '芬兰',\n France: '法国',\n 'French Guiana': '法属圭亚那',\n 'French Polynesia': '法属波利尼西亚',\n 'French Southern Territories': '法属南部领地',\n Gabon: '加蓬',\n 'Gambia The': '冈比亚',\n Georgia: '格鲁吉亚',\n Germany: '德国',\n Ghana: '加纳',\n Gibraltar: '直布罗陀',\n Greece: '希腊',\n Greenland: '格陵兰岛',\n Grenada: '格林纳达',\n Guadeloupe: '瓜德罗普岛',\n Guam: '关岛',\n Guatemala: '危地马拉',\n 'Guernsey and Alderney': '根西岛',\n Guinea: '几内亚',\n 'Guinea-Bissau': '几内亚比绍',\n Guyana: '圭亚那',\n Haiti: '海地',\n 'Heard Island and McDonald Islands': '赫德·唐纳岛及麦唐纳岛',\n Honduras: '洪都拉斯',\n 'Hong Kong': '中国香港',\n Hungary: '匈牙利',\n Iceland: '冰岛',\n India: '印度',\n Indonesia: '印度尼西亚',\n Iran: '伊朗',\n Iraq: '伊拉克',\n Ireland: '爱尔兰',\n Israel: '以色列',\n Italy: '意大利',\n Jamaica: '牙买加',\n Japan: '日本',\n Jersey: '泽西岛',\n Jordan: '约旦',\n Kazakhstan: '哈萨克斯坦',\n Kenya: '肯尼亚',\n Kiribati: '基里巴斯',\n Kosovo: '科索沃',\n Kuwait: '科威特',\n Kyrgyzstan: '吉尔吉斯斯坦',\n Laos: '寮人民民主共和国',\n Latvia: '拉脱维亚',\n Lebanon: '黎巴嫩',\n Lesotho: '莱索托',\n Liberia: '利比里亚',\n Libya: '利比亚',\n Liechtenstein: '列支敦士登',\n Lithuania: '立陶宛',\n Luxembourg: '卢森堡',\n Macau: '中国澳门',\n Madagascar: '马达加斯加',\n Malawi: '马拉维',\n Malaysia: '马来西亚',\n Maldives: '马尔代夫',\n Mali: '马里',\n Malta: '马耳他',\n 'Man (Isle of)': '马恩岛',\n 'Marshall Islands': '马绍尔群岛',\n Martinique: '马提尼克岛',\n Mauritania: '毛里塔尼亚',\n Mauritius: '毛里求斯',\n Mayotte: '马约特',\n Mexico: '墨西哥',\n Micronesia: '密克罗尼西亚',\n Moldova: '摩尔多瓦',\n Monaco: '摩纳哥',\n Mongolia: '蒙古',\n Montenegro: '黑山',\n Montserrat: '蒙特塞拉特',\n Morocco: '摩洛哥',\n Mozambique: '莫桑比克',\n Myanmar: '缅甸',\n Namibia: '纳米比亚',\n Nauru: '瑙鲁',\n Nepal: '尼泊尔',\n Netherlands: '荷兰',\n 'New Caledonia': '新喀里多尼亚',\n 'New Zealand': '新西兰',\n Nicaragua: '尼加拉瓜',\n Niger: '尼日尔',\n Nigeria: '尼日利亚',\n Niue: '纽埃',\n 'Norfolk Island': '诺福克岛',\n 'North Korea': '朝鲜',\n 'North Macedonia': '北馬其頓',\n 'Northern Mariana Islands': '北马里亚纳群岛',\n Norway: '挪威',\n Oman: '阿曼',\n Pakistan: '巴基斯坦',\n Palau: '帕劳',\n 'Palestinian Territory Occupied': '巴勒斯坦',\n Panama: '巴拿马',\n 'Papua new Guinea': '巴布亚新几内亚',\n Paraguay: '巴拉圭',\n Peru: '秘鲁',\n Philippines: '菲律宾',\n 'Pitcairn Island': '皮特凯恩群岛',\n Poland: '波兰',\n Portugal: '葡萄牙',\n 'Puerto Rico': '波多黎各',\n Qatar: '卡塔尔',\n Reunion: '留尼汪岛',\n Romania: '罗马尼亚',\n Russia: '俄罗斯联邦',\n Rwanda: '卢旺达',\n 'Saint Helena': '圣赫勒拿',\n 'Saint Kitts And Nevis': '圣基茨和尼维斯',\n 'Saint Lucia': '圣卢西亚',\n 'Saint Pierre and Miquelon': '圣皮埃尔和密克隆',\n 'Saint Vincent And The Grenadines': '圣文森特和格林纳丁斯',\n 'Saint-Barthelemy': '圣巴泰勒米',\n 'Saint-Martin (French part)': '密克罗尼西亞',\n Samoa: '萨摩亚',\n 'San Marino': '圣马力诺',\n 'Sao Tome and Principe': '圣多美和普林西比',\n 'Saudi Arabia': '沙特阿拉伯',\n Senegal: '塞内加尔',\n Serbia: '塞尔维亚',\n Seychelles: '塞舌尔',\n 'Sierra Leone': '塞拉利昂',\n Singapore: '新加坡',\n 'Sint Maarten (Dutch part)': '圣马丁岛(荷兰部分)',\n Slovakia: '斯洛伐克',\n Slovenia: '斯洛文尼亚',\n 'Solomon Islands': '所罗门群岛',\n Somalia: '索马里',\n 'South Africa': '南非',\n 'South Georgia': '南乔治亚',\n 'South Korea': '韩国',\n 'South Sudan': '南苏丹',\n Spain: '西班牙',\n 'Sri Lanka': '斯里兰卡',\n Sudan: '苏丹',\n Suriname: '苏里南',\n 'Svalbard And Jan Mayen Islands': '斯瓦尔巴和扬马延群岛',\n Swaziland: '斯威士兰',\n Sweden: '瑞典',\n Switzerland: '瑞士',\n Syria: '叙利亚',\n Taiwan: '中国台湾',\n Tajikistan: '塔吉克斯坦',\n Tanzania: '坦桑尼亚',\n Thailand: '泰国',\n 'The Bahamas': '巴哈马',\n Togo: '多哥',\n Tokelau: '托克劳',\n Tonga: '汤加',\n 'Trinidad And Tobago': '特立尼达和多巴哥',\n Tunisia: '突尼斯',\n Turkey: '土耳其',\n Turkmenistan: '土库曼斯坦',\n 'Turks And Caicos Islands': '特克斯和凯科斯群岛',\n Tuvalu: '图瓦卢',\n Uganda: '乌干达',\n Ukraine: '乌克兰',\n 'United Arab Emirates': '阿拉伯联合酋长国',\n 'United Kingdom': '英国',\n 'United States': '美国',\n 'United States Minor Outlying Islands': '美国本土外小岛屿',\n Uruguay: '乌拉圭',\n Uzbekistan: '乌兹别克斯坦',\n Vanuatu: '瓦努阿图',\n 'Vatican City State (Holy See)': '梵蒂冈',\n Venezuela: '委内瑞拉',\n Vietnam: '越南',\n 'Virgin Islands (British)': '圣文森特和格林纳丁斯',\n 'Virgin Islands (US)': '维尔京群岛(美国)',\n 'Wallis And Futuna Islands': '瓦利斯群岛和富图纳群岛',\n 'Western Sahara': '西撒哈拉',\n Yemen: '也门',\n Zambia: '赞比亚',\n Zimbabwe: '津巴布韦',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Traditional Chinese HK names.\n */\nexport const TraditionalChineseCountryHKNames: Record<Country, string> = {\n Afghanistan: '阿富汗',\n 'Aland Islands': '奧蘭羣島',\n Albania: '阿爾巴尼亞',\n Algeria: '阿爾及利亞',\n 'American Samoa': '美屬薩摩亞',\n Andorra: '安道爾',\n Angola: '安哥拉',\n Anguilla: '安圭拉',\n Antarctica: '南極洲',\n 'Antigua And Barbuda': '安提瓜和巴布達',\n Argentina: '阿根廷',\n Armenia: '亞美尼亞',\n Aruba: '阿魯巴',\n Australia: '澳大利亞',\n Austria: '奧地利',\n Azerbaijan: '阿塞拜疆',\n Bahrain: '巴林',\n Bangladesh: '孟加拉',\n Barbados: '巴巴多斯',\n Belarus: '白俄羅斯',\n Belgium: '比利時',\n Belize: '伯利茲',\n Benin: '貝寧',\n Bermuda: '百慕大',\n Bhutan: '不丹',\n Bolivia: '玻利維亞',\n 'Bonaire, Sint Eustatius and Saba': '博內爾島、聖尤斯特歇斯和薩巴島',\n 'Bosnia and Herzegovina': '波斯尼亞和黑塞哥維那',\n Botswana: '博茨瓦納',\n 'Bouvet Island': '布維島',\n Brazil: '巴西',\n 'British Indian Ocean Territory': '英屬印度洋領地',\n Brunei: '文萊',\n Bulgaria: '保加利亞',\n 'Burkina Faso': '布基納法索',\n Burundi: '布隆迪',\n Cambodia: '柬埔寨',\n Cameroon: '喀麥隆',\n Canada: '加拿大',\n 'Cape Verde': '佛得角',\n 'Cayman Islands': '開曼羣島',\n 'Central African Republic': '中非',\n Chad: '乍得',\n Chile: '智利',\n China: '中國',\n 'Christmas Island': '聖誕島',\n 'Cocos (Keeling) Islands': '科科斯(基林)羣島',\n Colombia: '哥倫比亞',\n Comoros: '科摩羅',\n Congo: '剛果',\n 'Cook Islands': '庫克羣島',\n 'Costa Rica': '哥斯達黎加',\n \"Cote D'Ivoire (Ivory Coast)\": '科特迪瓦',\n Croatia: '克羅地亞',\n Cuba: '古巴',\n Curaçao: '庫拉索',\n Cyprus: '塞浦路斯',\n 'Czech Republic': '捷克',\n 'Democratic Republic of the Congo': '剛果(金)',\n Denmark: '丹麥',\n Djibouti: '吉布提',\n Dominica: '多米尼加',\n 'Dominican Republic': '多明尼加共和國',\n 'East Timor': '東帝汶',\n Ecuador: '厄瓜多爾',\n Egypt: '埃及',\n 'El Salvador': '薩爾瓦多',\n 'Equatorial Guinea': '赤道幾內亞',\n Eritrea: '厄立特里亞',\n Estonia: '愛沙尼亞',\n Ethiopia: '埃塞俄比亞',\n 'Falkland Islands': '福克蘭羣島',\n 'Faroe Islands': '法羅羣島',\n 'Fiji Islands': '斐濟',\n Finland: '芬蘭',\n France: '法國',\n 'French Guiana': '法屬圭亞那',\n 'French Polynesia': '法屬波利尼西亞',\n 'French Southern Territories': '法屬南部領地',\n Gabon: '加蓬',\n 'Gambia The': '岡比亞',\n Georgia: '格魯吉亞',\n Germany: '德國',\n Ghana: '加納',\n Gibraltar: '直布羅陀',\n Greece: '希臘',\n Greenland: '格陵蘭島',\n Grenada: '格林納達',\n Guadeloupe: '瓜德羅普島',\n Guam: '關島',\n Guatemala: '危地馬拉',\n 'Guernsey and Alderney': '根西島',\n Guinea: '幾內亞',\n 'Guinea-Bissau': '幾內亞比紹',\n Guyana: '圭亞那',\n Haiti: '海地',\n 'Heard Island and McDonald Islands': '赫德·唐納島及麥唐納島',\n Honduras: '洪都拉斯',\n 'Hong Kong': '中國香港',\n Hungary: '匈牙利',\n Iceland: '冰島',\n India: '印度',\n Indonesia: '印度尼西亞',\n Iran: '伊朗',\n Iraq: '伊拉克',\n Ireland: '愛爾蘭',\n Israel: '以色列',\n Italy: '意大利',\n Jamaica: '牙買加',\n Japan: '日本',\n Jersey: '澤西島',\n Jordan: '約旦',\n Kazakhstan: '哈薩克斯坦',\n Kenya: '肯尼亞',\n Kiribati: '基里巴斯',\n Kosovo: '科索沃',\n Kuwait: '科威特',\n Kyrgyzstan: '吉爾吉斯斯坦',\n Laos: '寮人民民主共和國',\n Latvia: '拉脫維亞',\n Lebanon: '黎巴嫩',\n Lesotho: '萊索托',\n Liberia: '利比里亞',\n Libya: '利比亞',\n Liechtenstein: '列支敦士登',\n Lithuania: '立陶宛',\n Luxembourg: '盧森堡',\n Macau: '中國澳門',\n Madagascar: '馬達加斯加',\n Malawi: '馬拉維',\n Malaysia: '馬來西亞',\n Maldives: '馬爾代夫',\n Mali: '馬裏',\n Malta: '馬耳他',\n 'Man (Isle of)': '馬恩島',\n 'Marshall Islands': '馬紹爾羣島',\n Martinique: '馬提尼克島',\n Mauritania: '毛里塔尼亞',\n Mauritius: '毛里求斯',\n Mayotte: '馬約特',\n Mexico: '墨西哥',\n Micronesia: '密克羅尼西亞',\n Moldova: '摩爾多瓦',\n Monaco: '摩納哥',\n Mongolia: '蒙古',\n Montenegro: '黑山',\n Montserrat: '蒙特塞拉特',\n Morocco: '摩洛哥',\n Mozambique: '莫桑比克',\n Myanmar: '緬甸',\n Namibia: '納米比亞',\n Nauru: '瑙魯',\n Nepal: '尼泊爾',\n Netherlands: '荷蘭',\n 'New Caledonia': '新喀里多尼亞',\n 'New Zealand': '新西蘭',\n Nicaragua: '尼加拉瓜',\n Niger: '尼日爾',\n Nigeria: '尼日利亞',\n Niue: '紐埃',\n 'Norfolk Island': '諾福克島',\n 'North Korea': '朝鮮',\n 'North Macedonia': '北馬其頓',\n 'Northern Mariana Islands': '北马里亞納羣島',\n Norway: '挪威',\n Oman: '阿曼',\n Pakistan: '巴基斯坦',\n Palau: '帕勞',\n 'Palestinian Territory Occupied': '巴勒斯坦',\n Panama: '巴拿馬',\n 'Papua new Guinea': '巴布亞新幾內亞',\n Paraguay: '巴拉圭',\n Peru: '祕魯',\n Philippines: '菲律賓',\n 'Pitcairn Island': '皮特凱恩羣島',\n Poland: '波蘭',\n Portugal: '葡萄牙',\n 'Puerto Rico': '波多黎各',\n Qatar: '卡塔爾',\n Reunion: '留尼汪島',\n Romania: '羅馬尼亞',\n Russia: '俄羅斯聯邦',\n Rwanda: '盧旺達',\n 'Saint Helena': '聖赫勒拿',\n 'Saint Kitts And Nevis': '聖基茨和尼維斯',\n 'Saint Lucia': '聖盧西亞',\n 'Saint Pierre and Miquelon': '聖皮埃爾和密克隆',\n 'Saint Vincent And The Grenadines': '聖文森特和格林納丁斯',\n 'Saint-Barthelemy': '聖巴泰勒米',\n 'Saint-Martin (French part)': '密克羅尼西亞',\n Samoa: '薩摩亞',\n 'San Marino': '聖馬力諾',\n 'Sao Tome and Principe': '聖多美和普林西比',\n 'Saudi Arabia': '沙特阿拉伯',\n Senegal: '塞內加爾',\n Serbia: '塞爾維亞',\n Seychelles: '塞舌爾',\n 'Sierra Leone': '塞拉利昂',\n Singapore: '新加坡',\n 'Sint Maarten (Dutch part)': '聖馬丁島(荷蘭部分)',\n Slovakia: '斯洛伐克',\n Slovenia: '斯洛文尼亞',\n 'Solomon Islands': '所羅門羣島',\n Somalia: '索馬里',\n 'South Africa': '南非',\n 'South Georgia': '南喬治亞',\n 'South Korea': '韓國',\n 'South Sudan': '南蘇丹',\n Spain: '西班牙',\n 'Sri Lanka': '斯里蘭卡',\n Sudan: '蘇丹',\n Suriname: '蘇利南',\n 'Svalbard And Jan Mayen Islands': '斯瓦爾巴和揚馬延羣島',\n Swaziland: '斯威士蘭',\n Sweden: '瑞典',\n Switzerland: '瑞士',\n Syria: '敘利亞',\n Taiwan: '中國臺灣',\n Tajikistan: '塔吉克斯坦',\n Tanzania: '坦桑尼亞',\n Thailand: '泰國',\n 'The Bahamas': '巴哈馬',\n Togo: '多哥',\n Tokelau: '托克勞',\n Tonga: '湯加',\n 'Trinidad And Tobago': '特立尼達和多巴哥',\n Tunisia: '突尼斯',\n Turkey: '土耳其',\n Turkmenistan: '土庫曼斯坦',\n 'Turks And Caicos Islands': '特克斯和凱科斯羣島',\n Tuvalu: '圖瓦盧',\n Uganda: '烏干達',\n Ukraine: '烏克蘭',\n 'United Arab Emirates': '阿拉伯聯合酋長國',\n 'United Kingdom': '英國',\n 'United States': '美國',\n 'United States Minor Outlying Islands': '美國本土外小島嶼',\n Uruguay: '烏拉圭',\n Uzbekistan: '烏茲別克斯坦',\n Vanuatu: '瓦努阿圖',\n 'Vatican City State (Holy See)': '梵蒂岡',\n Venezuela: '委內瑞拉',\n Vietnam: '越南',\n 'Virgin Islands (British)': '聖文森特和格林納丁斯',\n 'Virgin Islands (US)': '維爾京羣島(美國)',\n 'Wallis And Futuna Islands': '瓦利斯羣島和富圖納羣島',\n 'Western Sahara': '西撒哈拉',\n Yemen: '也門',\n Zambia: '贊比亞',\n Zimbabwe: '津巴布韋',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Traditional Chinese TW names.\n */\nexport const TraditionalChineseCountryTWNames: Record<Country, string> = {\n Afghanistan: '阿富汗',\n 'Aland Islands': '奧蘭群島',\n Albania: '阿爾巴尼亞',\n Algeria: '阿爾及利亞',\n 'American Samoa': '美屬薩摩亞',\n Andorra: '安道爾',\n Angola: '安哥拉',\n Anguilla: '安圭拉',\n Antarctica: '南極洲',\n 'Antigua And Barbuda': '安地卡及巴布達',\n Argentina: '阿根廷',\n Armenia: '亞美尼亞',\n Aruba: '阿魯巴',\n Australia: '澳大利亞',\n Austria: '奧地利',\n Azerbaijan: '亞塞拜然',\n Bahrain: '巴林',\n Bangladesh: '孟加拉',\n Barbados: '巴貝多',\n Belarus: '白俄羅斯',\n Belgium: '比利時',\n Belize: '貝里斯',\n Benin: '貝南',\n Bermuda: '百慕大',\n Bhutan: '不丹',\n Bolivia: '玻利維亞',\n 'Bonaire, Sint Eustatius and Saba': '博內爾島、聖尤斯特歇斯和薩巴島',\n 'Bosnia and Herzegovina': '波斯尼亞和黑塞哥維那',\n Botswana: '波札那',\n 'Bouvet Island': '布維島',\n Brazil: '巴西',\n 'British Indian Ocean Territory': '英屬印度洋領地',\n Brunei: '汶萊',\n Bulgaria: '保加利亞',\n 'Burkina Faso': '布吉納法索',\n Burundi: '蒲隆地',\n Cambodia: '柬埔寨',\n Cameroon: '喀麥隆',\n Canada: '加拿大',\n 'Cape Verde': '維德角',\n 'Cayman Islands': '開曼群島',\n 'Central African Republic': '中非',\n Chad: '查德',\n Chile: '智利',\n China: '中國',\n 'Christmas Island': '聖誕島',\n 'Cocos (Keeling) Islands': '科科斯(基林)群島',\n Colombia: '哥倫比亞',\n Comoros: '葛摩',\n Congo: '剛果',\n 'Cook Islands': '庫克群島',\n 'Costa Rica': '哥斯大黎加',\n \"Cote D'Ivoire (Ivory Coast)\": '象牙海岸',\n Croatia: '克羅埃西亞',\n Cuba: '古巴',\n Curaçao: '庫拉索',\n Cyprus: '塞普勒斯',\n 'Czech Republic': '捷克',\n 'Democratic Republic of the Congo': '剛果(金)',\n Denmark: '丹麥',\n Djibouti: '吉布提',\n Dominica: '多明尼加',\n 'Dominican Republic': '多明尼加共和國',\n 'East Timor': '東帝汶',\n Ecuador: '厄瓜多',\n Egypt: '埃及',\n 'El Salvador': '薩爾瓦多',\n 'Equatorial Guinea': '赤道幾內亞',\n Eritrea: '厄利垂亞',\n Estonia: '愛沙尼亞',\n Ethiopia: '衣索比亞',\n 'Falkland Islands': '福克蘭羣島',\n 'Faroe Islands': '法羅群島',\n 'Fiji Islands': '斐濟',\n Finland: '芬蘭',\n France: '法國',\n 'French Guiana': '法屬蓋亞那',\n 'French Polynesia': '法屬波利尼西亞',\n 'French Southern Territories': '法屬南部領地',\n Gabon: '加彭',\n 'Gambia The': '甘比亞',\n Georgia: '喬治亞',\n Germany: '德國',\n Ghana: '迦納',\n Gibraltar: '直布羅陀',\n Greece: '希臘',\n Greenland: '格陵蘭島',\n Grenada: '格瑞那達',\n Guadeloupe: '瓜德羅普島',\n Guam: '關島',\n Guatemala: '瓜地馬拉',\n 'Guernsey and Alderney': '根西島',\n Guinea: '幾內亞',\n 'Guinea-Bissau': '幾內亞比索',\n Guyana: '蓋亞那',\n Haiti: '海地',\n 'Heard Island and McDonald Islands': '赫德·唐納島及麥唐納島',\n Honduras: '宏都拉斯',\n 'Hong Kong': '中國香港',\n Hungary: '匈牙利',\n Iceland: '冰島',\n India: '印度',\n Indonesia: '印度尼西亞',\n Iran: '伊朗',\n Iraq: '伊拉克',\n Ireland: '愛爾蘭',\n Israel: '以色列',\n Italy: '義大利',\n Jamaica: '牙買加',\n Japan: '日本',\n Jersey: '澤西島',\n Jordan: '約旦',\n Kazakhstan: '哈薩克',\n Kenya: '肯亞',\n Kiribati: '吉里巴斯',\n Kosovo: '科索沃',\n Kuwait: '科威特',\n Kyrgyzstan: '吉爾吉斯斯坦',\n Laos: '寮人民民主共和國',\n Latvia: '拉脫維亞',\n Lebanon: '黎巴嫩',\n Lesotho: '賴索托',\n Liberia: '賴比瑞亞',\n Libya: '利比亞',\n Liechtenstein: '列支敦斯登',\n Lithuania: '立陶宛',\n Luxembourg: '盧森堡',\n Macau: '中國澳門',\n Madagascar: '馬達加斯加',\n Malawi: '馬拉維',\n Malaysia: '馬來西亞',\n Maldives: '馬爾地夫',\n Mali: '馬裡',\n Malta: '馬耳他',\n 'Man (Isle of)': '馬恩島',\n 'Marshall Islands': '馬紹爾羣島',\n Martinique: '馬提尼克島',\n Mauritania: '茅利塔尼亞',\n Mauritius: '模里西斯',\n Mayotte: '馬約特',\n Mexico: '墨西哥',\n Micronesia: '密克羅尼西亞',\n Moldova: '摩爾多瓦',\n Monaco: '摩納哥',\n Mongolia: '蒙古',\n Montenegro: '黑山',\n Montserrat: '蒙特塞拉特',\n Morocco: '摩洛哥',\n Mozambique: '莫三比克',\n Myanmar: '緬甸',\n Namibia: '奈米比亞',\n Nauru: '諾魯',\n Nepal: '尼泊爾',\n Netherlands: '荷蘭',\n 'New Caledonia': '新喀里多尼亞',\n 'New Zealand': '紐西蘭',\n Nicaragua: '尼加拉瓜',\n Niger: '尼日',\n Nigeria: '奈及利亞',\n Niue: '紐埃',\n 'Norfolk Island': '諾福克島',\n 'North Korea': '朝鮮',\n 'North Macedonia': '北馬其頓',\n 'Northern Mariana Islands': '北马里亞納羣島',\n Norway: '挪威',\n Oman: '阿曼',\n Pakistan: '巴基斯坦',\n Palau: '帛琉',\n 'Palestinian Territory Occupied': '巴勒斯坦',\n Panama: '巴拿馬',\n 'Papua new Guinea': '巴布亞紐幾內亞',\n Paraguay: '巴拉圭',\n Peru: '秘魯',\n Philippines: '菲律賓',\n 'Pitcairn Island': '皮特凱恩羣島',\n Poland: '波蘭',\n Portugal: '葡萄牙',\n 'Puerto Rico': '波多黎各',\n Qatar: '卡達',\n Reunion: '留尼汪島',\n Romania: '羅馬尼亞',\n Russia: '俄羅斯聯邦',\n Rwanda: '盧安達',\n 'Saint Helena': '聖赫勒拿',\n 'Saint Kitts And Nevis': '聖克里斯多福及尼維斯',\n 'Saint Lucia': '聖露西亞',\n 'Saint Pierre and Miquelon': '聖皮埃爾和密克隆',\n 'Saint Vincent And The Grenadines': '聖文森及格瑞那丁',\n 'Saint-Barthelemy': '聖巴泰勒米',\n 'Saint-Martin (French part)': '密克羅尼西亞',\n Samoa: '薩摩亞',\n 'San Marino': '聖馬力諾',\n 'Sao Tome and Principe': '聖多美和普林西比',\n 'Saudi Arabia': '沙烏地阿拉伯',\n Senegal: '塞內加爾',\n Serbia: '塞爾維亞',\n Seychelles: '塞舌爾',\n 'Sierra Leone': '獅子山',\n Singapore: '新加坡',\n 'Sint Maarten (Dutch part)': '聖馬丁島(荷蘭部分)',\n Slovakia: '斯洛伐克',\n Slovenia: '斯洛維尼亞',\n 'Solomon Islands': '索羅門羣島',\n Somalia: '索馬利亞',\n 'South Africa': '南非',\n 'South Georgia': '南喬治亞',\n 'South Korea': '韓國',\n 'South Sudan': '南蘇丹',\n Spain: '西班牙',\n 'Sri Lanka': '斯里蘭卡',\n Sudan: '蘇丹',\n Suriname: '蘇利南',\n 'Svalbard And Jan Mayen Islands': '斯瓦爾巴和揚馬延羣島',\n Swaziland: '史瓦濟蘭',\n Sweden: '瑞典',\n Switzerland: '瑞士',\n Syria: '敘利亞',\n Taiwan: '中國臺灣',\n Tajikistan: '塔吉克',\n Tanzania: '坦尚尼亞',\n Thailand: '泰國',\n 'The Bahamas': '巴哈馬',\n Togo: '多哥',\n Tokelau: '托克勞',\n Tonga: '湯加',\n 'Trinidad And Tobago': '千里達及托巴哥',\n Tunisia: '突尼西亞',\n Turkey: '土耳其',\n Turkmenistan: '土庫曼',\n 'Turks And Caicos Islands': '特克斯和凱科斯羣島',\n Tuvalu: '吐瓦魯',\n Uganda: '烏干達',\n Ukraine: '烏克蘭',\n 'United Arab Emirates': '阿拉伯聯合大公國',\n 'United Kingdom': '英國',\n 'United States': '美國',\n 'United States Minor Outlying Islands': '美國本土外小島嶼',\n Uruguay: '烏拉圭',\n Uzbekistan: '烏茲別克',\n Vanuatu: '萬那杜',\n 'Vatican City State (Holy See)': '梵蒂岡',\n Venezuela: '委內瑞拉',\n Vietnam: '越南',\n 'Virgin Islands (British)': '聖文森及格瑞那丁',\n 'Virgin Islands (US)': '維爾京羣島(美國)',\n 'Wallis And Futuna Islands': '瓦利斯羣島和富圖納羣島',\n 'Western Sahara': '西撒哈拉',\n Yemen: '葉門',\n Zambia: '尚比亞',\n Zimbabwe: '辛巴威',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Spanish names.\n */\nexport const SpanishCountryNames: Record<Country, string> = {\n Afghanistan: 'Afganistán',\n 'Aland Islands': 'Islas Åland',\n Albania: 'Albania',\n Algeria: 'Argelia',\n 'American Samoa': 'Samoa Americana',\n Andorra: 'Andorra',\n Angola: 'Angola',\n Anguilla: 'Anguila',\n Antarctica: 'Antártida',\n 'Antigua And Barbuda': 'Antigua y Barbuda',\n Argentina: 'Argentina',\n Armenia: 'Armenia',\n Aruba: 'Aruba',\n Australia: 'Australia',\n Austria: 'Austria',\n Azerbaijan: 'Azerbaiyán',\n Bahrain: 'Baréin',\n Bangladesh: 'Bangladés',\n Barbados: 'Barbados',\n Belarus: 'Bielorrusia',\n Belgium: 'Bélgica',\n Belize: 'Belice',\n Benin: 'Benín',\n Bermuda: 'Bermudas',\n Bhutan: 'Bután',\n Bolivia: 'Bolivia',\n 'Bonaire, Sint Eustatius and Saba': 'Bonaire, San Eustaquio y Saba',\n 'Bosnia and Herzegovina': 'Bosnia y Herzegovina',\n Botswana: 'Botsuana',\n 'Bouvet Island': 'Isla Bouvet',\n Brazil: 'Brasil',\n 'British Indian Ocean Territory': 'Territorio Británico del Océano Índico',\n Brunei: 'Brunéi',\n Bulgaria: 'Bulgaria',\n 'Burkina Faso': 'Burkina Faso',\n Burundi: 'Burundi',\n Cambodia: 'Camboya',\n Cameroon: 'Camerún',\n Canada: 'Canadá',\n 'Cape Verde': 'Cabo Verde',\n 'Cayman Islands': 'Islas Caimán',\n 'Central African Republic': 'República Centroafricana',\n Chad: 'Chad',\n Chile: 'Chile',\n China: 'China',\n 'Christmas Island': 'Isla de Navidad',\n 'Cocos (Keeling) Islands': 'Islas Cocos',\n Colombia: 'Colombia',\n Comoros: 'Comoras',\n Congo: 'Congo',\n 'Cook Islands': 'Islas Cook',\n 'Costa Rica': 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\": 'Costa de Marfil',\n Croatia: 'Croacia',\n Cuba: 'Cuba',\n Curaçao: 'Curazao',\n Cyprus: 'Chipre',\n 'Czech Republic': 'República Checa',\n 'Democratic Republic of the Congo': 'República Democrática del Congo',\n Denmark: 'Dinamarca',\n Djibouti: 'Yibuti',\n Dominica: 'Dominica',\n 'Dominican Republic': 'República Dominicana',\n 'East Timor': 'Timor Oriental',\n Ecuador: 'Ecuador',\n Egypt: 'Egipto',\n 'El Salvador': 'El Salvador',\n 'Equatorial Guinea': 'Guinea Ecuatorial',\n Eritrea: 'Eritrea',\n Estonia: 'Estonia',\n Ethiopia: 'Etiopía',\n 'Falkland Islands': 'Islas Malvinas',\n 'Faroe Islands': 'Islas Feroe',\n 'Fiji Islands': 'Fiyi',\n Finland: 'Finlandia',\n France: 'Francia',\n 'French Guiana': 'Guayana Francesa',\n 'French Polynesia': 'Polinesia Francesa',\n 'French Southern Territories': 'Tierras Australes y Antárticas Francesas',\n Gabon: 'Gabón',\n 'Gambia The': 'Gambia',\n Georgia: 'Georgia',\n Germany: 'Alemania',\n Ghana: 'Ghana',\n Gibraltar: 'Gibraltar',\n Greece: 'Grecia',\n Greenland: 'Groenlandia',\n Grenada: 'Granada',\n Guadeloupe: 'Guadalupe',\n Guam: 'Guam',\n Guatemala: 'Guatemala',\n 'Guernsey and Alderney': 'Guernsey y Alderney',\n Guinea: 'Guinea',\n 'Guinea-Bissau': 'Guinea-Bisáu',\n Guyana: 'Guyana',\n Haiti: 'Haití',\n 'Heard Island and McDonald Islands': 'Islas Heard y McDonald',\n Honduras: 'Honduras',\n 'Hong Kong': 'Hong Kong',\n Hungary: 'Hungría',\n Iceland: 'Islandia',\n India: 'India',\n Indonesia: 'Indonesia',\n Iran: 'Irán',\n Iraq: 'Irak',\n Ireland: 'Irlanda',\n Israel: 'Israel',\n Italy: 'Italia',\n Jamaica: 'Jamaica',\n Japan: 'Japón',\n Jersey: 'Jersey',\n Jordan: 'Jordania',\n Kazakhstan: 'Kazajistán',\n Kenya: 'Kenia',\n Kiribati: 'Kiribati',\n Kosovo: 'Kosovo',\n Kuwait: 'Kuwait',\n Kyrgyzstan: 'Kirguistán',\n Laos: 'Laos',\n Latvia: 'Letonia',\n Lebanon: 'Líbano',\n Lesotho: 'Lesoto',\n Liberia: 'Liberia',\n Libya: 'Libia',\n Liechtenstein: 'Liechtenstein',\n Lithuania: 'Lituania',\n Luxembourg: 'Luxemburgo',\n Macau: 'Macao',\n Madagascar: 'Madagascar',\n Malawi: 'Malaui',\n Malaysia: 'Malasia',\n Maldives: 'Maldivas',\n Mali: 'Malí',\n Malta: 'Malta',\n 'Man (Isle of)': 'Isla de Man',\n 'Marshall Islands': 'Islas Marshall',\n Martinique: 'Martinica',\n Mauritania: 'Mauritania',\n Mauritius: 'Mauricio',\n Mayotte: 'Mayotte',\n Mexico: 'México',\n Micronesia: 'Micronesia',\n Moldova: 'Moldavia',\n Monaco: 'Mónaco',\n Mongolia: 'Mongolia',\n Montenegro: 'Montenegro',\n Montserrat: 'Montserrat',\n Morocco: 'Marruecos',\n Mozambique: 'Mozambique',\n Myanmar: 'Myanmar',\n Namibia: 'Namibia',\n Nauru: 'Nauru',\n Nepal: 'Nepal',\n Netherlands: 'Países Bajos',\n 'New Caledonia': 'Nueva Caledonia',\n 'New Zealand': 'Nueva Zelanda',\n Nicaragua: 'Nicaragua',\n Niger: 'Níger',\n Nigeria: 'Nigeria',\n Niue: 'Niue',\n 'Norfolk Island': 'Isla Norfolk',\n 'North Korea': 'Corea del Norte',\n 'North Macedonia': 'Macedonia del Norte',\n 'Northern Mariana Islands': 'Islas Marianas del Norte',\n Norway: 'Noruega',\n Oman: 'Omán',\n Pakistan: 'Pakistán',\n Palau: 'Palaos',\n 'Palestinian Territory Occupied': 'Territorio Palestino Ocupado',\n Panama: 'Panamá',\n 'Papua new Guinea': 'Papúa Nueva Guinea',\n Paraguay: 'Paraguay',\n Peru: 'Perú',\n Philippines: 'Filipinas',\n 'Pitcairn Island': 'Islas Pitcairn',\n Poland: 'Polonia',\n Portugal: 'Portugal',\n 'Puerto Rico': 'Puerto Rico',\n Qatar: 'Catar',\n Reunion: 'Reunión',\n Romania: 'Rumania',\n Russia: 'Rusia',\n Rwanda: 'Ruanda',\n 'Saint Helena': 'Santa Elena',\n 'Saint Kitts And Nevis': 'San Cristóbal y Nieves',\n 'Saint Lucia': 'Santa Lucía',\n 'Saint Pierre and Miquelon': 'San Pedro y Miquelón',\n 'Saint Vincent And The Grenadines': 'San Vicente y las Granadinas',\n 'Saint-Barthelemy': 'San Bartolomé',\n 'Saint-Martin (French part)': 'San Martín (parte francesa)',\n Samoa: 'Samoa',\n 'San Marino': 'San Marino',\n 'Sao Tome and Principe': 'Santo Tomé y Príncipe',\n 'Saudi Arabia': 'Arabia Saudita',\n Senegal: 'Senegal',\n Serbia: 'Serbia',\n Seychelles: 'Seychelles',\n 'Sierra Leone': 'Sierra Leona',\n Singapore: 'Singapur',\n 'Sint Maarten (Dutch part)': 'San Martín (parte neerlandesa)',\n Slovakia: 'Eslovaquia',\n Slovenia: 'Eslovenia',\n 'Solomon Islands': 'Islas Salomón',\n Somalia: 'Somalia',\n 'South Africa': 'Sudáfrica',\n 'South Georgia': 'Georgia del Sur',\n 'South Korea': 'Corea del Sur',\n 'South Sudan': 'Sudán del Sur',\n Spain: 'España',\n 'Sri Lanka': 'Sri Lanka',\n Sudan: 'Sudán',\n Suriname: 'Surinam',\n 'Svalbard And Jan Mayen Islands': 'Svalbard y Jan Mayen',\n Swaziland: 'Suazilandia',\n Sweden: 'Suecia',\n Switzerland: 'Suiza',\n Syria: 'Siria',\n Taiwan: 'Taiwán',\n Tajikistan: 'Tayikistán',\n Tanzania: 'Tanzania',\n Thailand: 'Tailandia',\n 'The Bahamas': 'Bahamas',\n Togo: 'Togo',\n Tokelau: 'Tokelau',\n Tonga: 'Tonga',\n 'Trinidad And Tobago': 'Trinidad y Tobago',\n Tunisia: 'Túnez',\n Turkey: 'Turquía',\n Turkmenistan: 'Turkmenistán',\n 'Turks And Caicos Islands': 'Islas Turcas y Caicos',\n Tuvalu: 'Tuvalu',\n Uganda: 'Uganda',\n Ukraine: 'Ucrania',\n 'United Arab Emirates': 'Emiratos Árabes Unidos',\n 'United Kingdom': 'Reino Unido',\n 'United States': 'Estados Unidos',\n 'United States Minor Outlying Islands':\n 'Islas Ultramarinas Menores de Estados Unidos',\n Uruguay: 'Uruguay',\n Uzbekistan: 'Uzbekistán',\n Vanuatu: 'Vanuatu',\n 'Vatican City State (Holy See)': 'Ciudad del Vaticano',\n Venezuela: 'Venezuela',\n Vietnam: 'Vietnam',\n 'Virgin Islands (British)': 'Islas Vírgenes Británicas',\n 'Virgin Islands (US)': 'Islas Vírgenes de los Estados Unidos',\n 'Wallis And Futuna Islands': 'Wallis y Futuna',\n 'Western Sahara': 'Sahara Occidental',\n Yemen: 'Yemen',\n Zambia: 'Zambia',\n Zimbabwe: 'Zimbabue',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * French names.\n */\nexport const FrenchCountryNames: Record<Country, string> = {\n Afghanistan: 'Afghanistan',\n 'Aland Islands': 'Îles Åland',\n Albania: 'Albanie',\n Algeria: 'Algérie',\n 'American Samoa': 'Samoa américaines',\n Andorra: 'Andorre',\n Angola: 'Angola',\n Anguilla: 'Anguilla',\n Antarctica: 'Antarctique',\n 'Antigua And Barbuda': 'Antigua-et-Barbuda',\n Argentina: 'Argentine',\n Armenia: 'Arménie',\n Aruba: 'Aruba',\n Australia: 'Australie',\n Austria: 'Autriche',\n Azerbaijan: 'Azerbaïdjan',\n Bahrain: 'Bahreïn',\n Bangladesh: 'Bangladesh',\n Barbados: 'Barbade',\n Belarus: 'Biélorussie',\n Belgium: 'Belgique',\n Belize: 'Belize',\n Benin: 'Bénin',\n Bermuda: 'Bermudes',\n Bhutan: 'Bhoutan',\n Bolivia: 'Bolivie',\n 'Bonaire, Sint Eustatius and Saba': 'Bonaire, Saint-Eustache et Saba',\n 'Bosnia and Herzegovina': 'Bosnie-Herzégovine',\n Botswana: 'Botswana',\n 'Bouvet Island': 'Île Bouvet',\n Brazil: 'Brésil',\n 'British Indian Ocean Territory': \"Territoire britannique de l'océan Indien\",\n Brunei: 'Brunéi',\n Bulgaria: 'Bulgarie',\n 'Burkina Faso': 'Burkina Faso',\n Burundi: 'Burundi',\n Cambodia: 'Cambodge',\n Cameroon: 'Cameroun',\n Canada: 'Canada',\n 'Cape Verde': 'Cap-Vert',\n 'Cayman Islands': 'Îles Caïmans',\n 'Central African Republic': 'République centrafricaine',\n Chad: 'Tchad',\n Chile: 'Chili',\n China: 'Chine',\n 'Christmas Island': 'Île Christmas',\n 'Cocos (Keeling) Islands': 'Îles Cocos (Keeling)',\n Colombia: 'Colombie',\n Comoros: 'Comores',\n Congo: 'Congo',\n 'Cook Islands': 'Îles Cook',\n 'Costa Rica': 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\": \"Côte d'Ivoire\",\n Croatia: 'Croatie',\n Cuba: 'Cuba',\n Curaçao: 'Curaçao',\n Cyprus: 'Chypre',\n 'Czech Republic': 'République tchèque',\n 'Democratic Republic of the Congo': 'République démocratique du Congo',\n Denmark: 'Danemark',\n Djibouti: 'Djibouti',\n Dominica: 'Dominique',\n 'Dominican Republic': 'République dominicaine',\n 'East Timor': 'Timor oriental',\n Ecuador: 'Équateur',\n Egypt: 'Égypte',\n 'El Salvador': 'Salvador',\n 'Equatorial Guinea': 'Guinée équatoriale',\n Eritrea: 'Érythrée',\n Estonia: 'Estonie',\n Ethiopia: 'Éthiopie',\n 'Falkland Islands': 'Îles Malouines',\n 'Faroe Islands': 'Îles Féroé',\n 'Fiji Islands': 'Fidji',\n Finland: 'Finlande',\n France: 'France',\n 'French Guiana': 'Guyane française',\n 'French Polynesia': 'Polynésie française',\n 'French Southern Territories': 'Terres australes françaises',\n Gabon: 'Gabon',\n 'Gambia The': 'Gambie',\n Georgia: 'Géorgie',\n Germany: 'Allemagne',\n Ghana: 'Ghana',\n Gibraltar: 'Gibraltar',\n Greece: 'Grèce',\n Greenland: 'Groenland',\n Grenada: 'Grenade',\n Guadeloupe: 'Guadeloupe',\n Guam: 'Guam',\n Guatemala: 'Guatemala',\n 'Guernsey and Alderney': 'Guernesey et Alderney',\n Guinea: 'Guinée',\n 'Guinea-Bissau': 'Guinée-Bissau',\n Guyana: 'Guyana',\n Haiti: 'Haïti',\n 'Heard Island and McDonald Islands': 'Îles Heard-et-MacDonald',\n Honduras: 'Honduras',\n 'Hong Kong': 'Hong Kong',\n Hungary: 'Hongrie',\n Iceland: 'Islande',\n India: 'Inde',\n Indonesia: 'Indonésie',\n Iran: 'Iran',\n Iraq: 'Irak',\n Ireland: 'Irlande',\n Israel: 'Israël',\n Italy: 'Italie',\n Jamaica: 'Jamaïque',\n Japan: 'Japon',\n Jersey: 'Jersey',\n Jordan: 'Jordanie',\n Kazakhstan: 'Kazakhstan',\n Kenya: 'Kenya',\n Kiribati: 'Kiribati',\n Kosovo: 'Kosovo',\n Kuwait: 'Koweït',\n Kyrgyzstan: 'Kirghizistan',\n Laos: 'Laos',\n Latvia: 'Lettonie',\n Lebanon: 'Liban',\n Lesotho: 'Lesotho',\n Liberia: 'Libéria',\n Libya: 'Libye',\n Liechtenstein: 'Liechtenstein',\n Lithuania: 'Lituanie',\n Luxembourg: 'Luxembourg',\n Macau: 'Macao',\n Madagascar: 'Madagascar',\n 'Marshall Islands': 'Îles Marshall',\n Malawi: 'Malawi',\n Malaysia: 'Malaisie',\n Maldives: 'Maldives',\n Mali: 'Mali',\n Malta: 'Malte',\n 'Man (Isle of)': 'Île de Man',\n Martinique: 'Martinique',\n Mauritania: 'Mauritanie',\n Mauritius: 'Maurice',\n Mayotte: 'Mayotte',\n Mexico: 'Mexique',\n Micronesia: 'Micronésie',\n Moldova: 'Moldavie',\n Monaco: 'Monaco',\n Mongolia: 'Mongolie',\n Montenegro: 'Monténégro',\n Montserrat: 'Montserrat',\n Morocco: 'Maroc',\n Mozambique: 'Mozambique',\n Myanmar: 'Myanmar',\n Namibia: 'Namibie',\n Nauru: 'Nauru',\n Nepal: 'Népal',\n Netherlands: 'Pays-Bas',\n 'New Caledonia': 'Nouvelle-Calédonie',\n 'New Zealand': 'Nouvelle-Zélande',\n Nicaragua: 'Nicaragua',\n Niger: 'Niger',\n Nigeria: 'Nigéria',\n Niue: 'Niue',\n 'Norfolk Island': 'Île Norfolk',\n 'North Korea': 'Corée du Nord',\n 'North Macedonia': 'Macédoine du Nord',\n 'Northern Mariana Islands': 'Îles Mariannes du Nord',\n Norway: 'Norvège',\n Oman: 'Oman',\n Pakistan: 'Pakistan',\n Palau: 'Palaos',\n 'Palestinian Territory Occupied': 'Palestine',\n Panama: 'Panama',\n 'Papua new Guinea': 'Papouasie-Nouvelle-Guinée',\n Paraguay: 'Paraguay',\n Peru: 'Pérou',\n Philippines: 'Philippines',\n 'Pitcairn Island': 'Îles Pitcairn',\n Poland: 'Pologne',\n Portugal: 'Portugal',\n 'Puerto Rico': 'Porto Rico',\n Qatar: 'Qatar',\n Reunion: 'La Réunion',\n Romania: 'Roumanie',\n Russia: 'Russie',\n Rwanda: 'Rwanda',\n 'Saint-Barthelemy': 'Saint-Barthélemy',\n 'Saint Helena': 'Sainte-Hélène',\n 'Saint Kitts And Nevis': 'Saint-Christophe-et-Niévès',\n 'Saint Lucia': 'Sainte-Lucie',\n 'Saint-Martin (French part)': 'Saint-Martin',\n 'Saint Pierre and Miquelon': 'Saint-Pierre-et-Miquelon',\n 'Saint Vincent And The Grenadines': 'Saint-Vincent-et-les-Grenadines',\n Samoa: 'Samoa',\n 'San Marino': 'Saint-Marin',\n 'Sao Tome and Principe': 'Sao Tomé-et-Principe',\n 'Saudi Arabia': 'Arabie saoudite',\n Senegal: 'Sénégal',\n Serbia: 'Serbie',\n Seychelles: 'Seychelles',\n 'Sierra Leone': 'Sierra Leone',\n Singapore: 'Singapour',\n 'Sint Maarten (Dutch part)': 'Saint-Martin',\n Slovakia: 'Slovaquie',\n Slovenia: 'Slovénie',\n 'Solomon Islands': 'Îles Salomon',\n Somalia: 'Somalie',\n 'South Africa': 'Afrique du Sud',\n 'South Georgia': 'Géorgie du Sud-et-les Îles Sandwich du Sud',\n 'South Korea': 'Corée du Sud',\n 'South Sudan': 'Soudan du Sud',\n Spain: 'Espagne',\n 'Sri Lanka': 'Sri Lanka',\n Sudan: 'Soudan',\n Suriname: 'Suriname',\n 'Svalbard And Jan Mayen Islands': 'Svalbard et Jan Mayen',\n Swaziland: 'Swaziland',\n Sweden: 'Suède',\n Switzerland: 'Suisse',\n Syria: 'Syrie',\n Taiwan: 'Taïwan',\n Tajikistan: 'Tadjikistan',\n Tanzania: 'Tanzanie',\n Thailand: 'Thaïlande',\n 'The Bahamas': 'Bahamas',\n Togo: 'Togo',\n Tokelau: 'Tokelau',\n Tonga: 'Tonga',\n 'Trinidad And Tobago': 'Trinité-et-Tobago',\n Tunisia: 'Tunisie',\n Turkey: 'Turquie',\n Turkmenistan: 'Turkménistan',\n 'Turks And Caicos Islands': 'Îles Turques-et-Caïques',\n Tuvalu: 'Tuvalu',\n Uganda: 'Ouganda',\n Ukraine: 'Ukraine',\n 'United Arab Emirates': 'Émirats arabes unis',\n 'United Kingdom': 'Royaume-Uni',\n 'United States': 'États-Unis',\n 'United States Minor Outlying Islands':\n 'Îles mineures éloignées des États-Unis',\n Uruguay: 'Uruguay',\n Uzbekistan: 'Ouzbékistan',\n Vanuatu: 'Vanuatu',\n 'Vatican City State (Holy See)': 'Vatican',\n Venezuela: 'Venezuela',\n Vietnam: 'Viêt Nam',\n 'Virgin Islands (British)': 'Îles Vierges britanniques',\n 'Virgin Islands (US)': 'Îles Vierges américaines',\n 'Wallis And Futuna Islands': 'Wallis-et-Futuna',\n 'Western Sahara': 'Sahara occidental',\n Yemen: 'Yémen',\n Zambia: 'Zambie',\n Zimbabwe: 'Zimbabwe',\n}\n\nexport const NorwegianCountryNames: Record<Country, string> = {\n Afghanistan: 'Afghanistan',\n 'Aland Islands': 'Åland',\n Albania: 'Albania',\n Algeria: 'Algerie',\n 'American Samoa': 'Amerikansk Samoa',\n Andorra: 'Andorra',\n Angola: 'Angola',\n Anguilla: 'Anguilla',\n Antarctica: 'Antarktis',\n 'Antigua And Barbuda': 'Antigua og Barbuda',\n Argentina: 'Argentina',\n Armenia: 'Armenia',\n Aruba: 'Aruba',\n Australia: 'Australia',\n Austria: 'Østerrike',\n Azerbaijan: 'Aserbajdsjan',\n Bahrain: 'Bahrain',\n Bangladesh: 'Bangladesh',\n Barbados: 'Barbados',\n Belarus: 'Belarus',\n Belgium: 'Belgia',\n Belize: 'Belize',\n Benin: 'Benin',\n Bermuda: 'Bermuda',\n Bhutan: 'Bhutan',\n Bolivia: 'Bolivia',\n 'Bonaire, Sint Eustatius and Saba': 'Bonaire, Sint Eustatius og Saba',\n 'Bosnia and Herzegovina': 'Bosnia-Hercegovina',\n Botswana: 'Botswana',\n 'Bouvet Island': 'Bouvetøya',\n Brazil: 'Brasil',\n 'British Indian Ocean Territory': 'Det britiske territoriet i Indiahavet',\n Brunei: 'Brunei',\n Bulgaria: 'Bulgaria',\n 'Burkina Faso': 'Burkina Faso',\n Burundi: 'Burundi',\n Cambodia: 'Kambodsja',\n Cameroon: 'Kamerun',\n Canada: 'Canada',\n 'Cape Verde': 'Kapp Verde',\n 'Cayman Islands': 'Caymanøyene',\n 'Central African Republic': 'Den sentralafrikanske republikk',\n Chad: 'Tsjad',\n Chile: 'Chile',\n China: 'Kina',\n 'Christmas Island': 'Christmasøya',\n 'Cocos (Keeling) Islands': 'Kokosøyene (Keelingøyene)',\n Colombia: 'Colombia',\n Comoros: 'Komorene',\n Congo: 'Kongo',\n 'Cook Islands': 'Cookøyene',\n 'Costa Rica': 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\": 'Elfenbenskysten',\n Croatia: 'Kroatia',\n Cuba: 'Cuba',\n Curaçao: 'Curaçao',\n Cyprus: 'Kypros',\n 'Czech Republic': 'Tsjekkia',\n 'Democratic Republic of the Congo': 'Den demokratiske republikken Kongo',\n Denmark: 'Danmark',\n Djibouti: 'Djibouti',\n Dominica: 'Dominica',\n 'Dominican Republic': 'Den dominikanske republikk',\n 'East Timor': 'Øst-Timor',\n Ecuador: 'Ecuador',\n Egypt: 'Egypt',\n 'El Salvador': 'El Salvador',\n 'Equatorial Guinea': 'Ekvatorial-Guinea',\n Eritrea: 'Eritrea',\n Estonia: 'Estland',\n Ethiopia: 'Etiopia',\n 'Falkland Islands': 'Falklandsøyene',\n 'Faroe Islands': 'Færøyene',\n 'Fiji Islands': 'Fijiøyene',\n Finland: 'Finland',\n France: 'Frankrike',\n 'French Guiana': 'Fransk Guyana',\n 'French Polynesia': 'Fransk Polynesia',\n 'French Southern Territories': 'Franske sørlige territorier',\n Gabon: 'Gabon',\n 'Gambia The': 'Gambia',\n Georgia: 'Georgia',\n Germany: 'Tyskland',\n Ghana: 'Ghana',\n Gibraltar: 'Gibraltar',\n Greece: 'Hellas',\n Greenland: 'Grønland',\n Grenada: 'Grenada',\n Guadeloupe: 'Guadeloupe',\n Guam: 'Guam',\n Guatemala: 'Guatemala',\n 'Guernsey and Alderney': 'Guernsey og Alderney',\n Guinea: 'Guinea',\n 'Guinea-Bissau': 'Guinea-Bissau',\n Guyana: 'Guyana',\n Haiti: 'Haiti',\n 'Heard Island and McDonald Islands': 'Heard- og McDonaldøyene',\n Honduras: 'Honduras',\n 'Hong Kong': 'Hong Kong',\n Hungary: 'Ungarn',\n Iceland: 'Island',\n India: 'India',\n Indonesia: 'Indonesia',\n Iran: 'Iran',\n Iraq: 'Irak',\n Ireland: 'Irland',\n Israel: 'Israel',\n Italy: 'Italia',\n Jamaica: 'Jamaica',\n Japan: 'Japan',\n Jersey: 'Jersey',\n Jordan: 'Jordan',\n Kazakhstan: 'Kasakhstan',\n Kenya: 'Kenya',\n Kiribati: 'Kiribati',\n Kosovo: 'Kosovo',\n Kuwait: 'Kuwait',\n Kyrgyzstan: 'Kirgisistan',\n Laos: 'Laos',\n Latvia: 'Latvia',\n Lebanon: 'Libanon',\n Lesotho: 'Lesotho',\n Liberia: 'Liberia',\n Libya: 'Libya',\n Liechtenstein: 'Liechtenstein',\n Lithuania: 'Litauen',\n Luxembourg: 'Luxembourg',\n Macau: 'Macau',\n Madagascar: 'Madagaskar',\n Malawi: 'Malawi',\n Malaysia: 'Malaysia',\n Maldives: 'Maldivene',\n Mali: 'Mali',\n Malta: 'Malta',\n 'Man (Isle of)': 'Man (Isle of)',\n 'Marshall Islands': 'Marshalløyene',\n Martinique: 'Martinique',\n Mauritania: 'Mauritania',\n Mauritius: 'Mauritius',\n Mayotte: 'Mayotte',\n Mexico: 'Mexico',\n Micronesia: 'Mikronesia',\n Moldova: 'Moldova',\n Monaco: 'Monaco',\n Mongolia: 'Mongolia',\n Montenegro: 'Montenegro',\n Montserrat: 'Montserrat',\n Morocco: 'Marokko',\n Mozambique: 'Mosambik',\n Myanmar: 'Myanmar',\n Namibia: 'Namibia',\n Nauru: 'Nauru',\n Nepal: 'Nepal',\n Netherlands: 'Nederland',\n 'New Caledonia': 'Ny-Caledonia',\n 'New Zealand': 'New Zealand',\n Nicaragua: 'Nicaragua',\n Niger: 'Niger',\n Nigeria: 'Nigeria',\n Niue: 'Niue',\n 'Norfolk Island': 'Norfolkøya',\n 'North Korea': 'Nord-Korea',\n 'North Macedonia': 'Nord-Makedonia',\n 'Northern Mariana Islands': 'Nord-Marianene',\n Norway: 'Norge',\n Oman: 'Oman',\n Pakistan: 'Pakistan',\n Palau: 'Palau',\n 'Palestinian Territory Occupied': 'Palestinsk okkupert område',\n Panama: 'Panama',\n 'Papua new Guinea': 'Papua Ny-Guinea',\n Paraguay: 'Paraguay',\n Peru: 'Peru',\n Philippines: 'Filippinene',\n 'Pitcairn Island': 'Pitcairnøyene',\n Poland: 'Polen',\n Portugal: 'Portugal',\n 'Puerto Rico': 'Puerto Rico',\n Qatar: 'Qatar',\n Reunion: 'Réunion',\n Romania: 'Romania',\n Russia: 'Russland',\n Rwanda: 'Rwanda',\n 'Saint Helena': 'Sankt Helena',\n 'Saint Kitts And Nevis': 'Saint Kitts og Nevis',\n 'Saint Lucia': 'Saint Lucia',\n 'Saint Pierre and Miquelon': 'Saint-Pierre og Miquelon',\n 'Saint Vincent And The Grenadines': 'Saint Vincent og Grenadinene',\n 'Saint-Barthelemy': 'Saint-Barthélemy',\n 'Saint-Martin (French part)': 'Saint-Martin (fransk del)',\n Samoa: 'Samoa',\n 'San Marino': 'San Marino',\n 'Sao Tome and Principe': 'São Tomé og Príncipe',\n 'Saudi Arabia': 'Saudi-Arabia',\n Senegal: 'Senegal',\n Serbia: 'Serbia',\n Seychelles: 'Seychellene',\n 'Sierra Leone': 'Sierra Leone',\n Singapore: 'Singapore',\n 'Sint Maarten (Dutch part)': 'Sint Maarten (nederlandsk del)',\n Slovakia: 'Slovakia',\n Slovenia: 'Slovenia',\n 'Solomon Islands': 'Salomonøyene',\n Somalia: 'Somalia',\n 'South Africa': 'Sør-Afrika',\n 'South Georgia': 'Sør-Georgia',\n 'South Korea': 'Sør-Korea',\n 'South Sudan': 'Sør-Sudan',\n Spain: 'Spania',\n 'Sri Lanka': 'Sri Lanka',\n Sudan: 'Sudan',\n Suriname: 'Surinam',\n 'Svalbard And Jan Mayen Islands': 'Svalbard og Jan Mayen',\n Swaziland: 'Swaziland',\n Sweden: 'Sverige',\n Switzerland: 'Sveits',\n Syria: 'Syria',\n Taiwan: 'Taiwan',\n Tajikistan: 'Tadsjikistan',\n Tanzania: 'Tanzania',\n Thailand: 'Thailand',\n 'The Bahamas': 'Bahamas',\n Togo: 'Togo',\n Tokelau: 'Tokelau',\n Tonga: 'Tonga',\n 'Trinidad And Tobago': 'Trinidad og Tobago',\n Tunisia: 'Tunisia',\n Turkey: 'Tyrkia',\n Turkmenistan: 'Turkmenistan',\n 'Turks And Caicos Islands': 'Turks- og Caicosøyene',\n Tuvalu: 'Tuvalu',\n Uganda: 'Uganda',\n Ukraine: 'Ukraina',\n 'United Arab Emirates': 'De forente arabiske emirater',\n 'United Kingdom': 'Storbritannia',\n 'United States': 'USA',\n 'United States Minor Outlying Islands': 'USAs ytre småøyer',\n Uruguay: 'Uruguay',\n Uzbekistan: 'Usbekistan',\n Vanuatu: 'Vanuatu',\n 'Vatican City State (Holy See)': 'Vatikanstaten (Den hellige stol)',\n Venezuela: 'Venezuela',\n Vietnam: 'Vietnam',\n 'Virgin Islands (British)': 'Jomfruøyene (britiske)',\n 'Virgin Islands (US)': 'Jomfruøyene (USA)',\n 'Wallis And Futuna Islands': 'Wallis- og Futunaøyene',\n 'Western Sahara': 'Vest-Sahara',\n Yemen: 'Jemen',\n Zambia: 'Zambia',\n Zimbabwe: 'Zimbabwe',\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * Defines all possible degrees.\n */\nexport const DEGREE_OPTIONS = [\n 'Middle School',\n 'High School',\n 'Diploma',\n 'Associate',\n 'Bachelor',\n 'Master',\n 'Doctor',\n] as const\n\n/**\n * Defines language fluency levels.\n *\n * Based on the Interagency Language Roundtable (ILR) scale.\n */\nexport const FLUENCY_OPTIONS = [\n 'Elementary Proficiency',\n 'Limited Working Proficiency',\n 'Minimum Professional Proficiency',\n 'Full Professional Proficiency',\n 'Native or Bilingual Proficiency',\n] as const\n\n/** The options for the latex layout font size. */\nexport const LATEX_FONT_SIZE_OPTIONS = ['10pt', '11pt', '12pt'] as const\n\n/** The options for the HTML layout font size. */\nexport const HTML_FONT_SIZE_OPTIONS = [\n '10px',\n '11px',\n '12px',\n '13px',\n '14px',\n '15px',\n '16px',\n '17px',\n '18px',\n '19px',\n '20px',\n '21px',\n '22px',\n '23px',\n '24px',\n] as const\n\n/** Defines identifiers for the available HTML layout templates. */\nexport const HTML_TEMPLATE_OPTIONS = ['calm'] as const\n\n/** The options for the latex layout fontspec numbers style. */\nexport const LATEX_FONTSPEC_NUMBERS_OPTIONS = [\n 'Lining',\n 'OldStyle',\n 'Auto',\n] as const\n\n/** Defines identifiers for the available latex layout templates. */\nexport const LATEX_TEMPLATE_OPTIONS = [\n 'moderncv-banking',\n 'moderncv-casual',\n 'moderncv-classic',\n] as const\n\n/**\n * Defines common world languages.\n *\n * This list contains the most used languages in the world.\n *\n * TODO: allow users to add their own languages\n */\nexport const LANGUAGE_OPTIONS = [\n 'Afrikaans',\n 'Albanian',\n 'Amharic',\n 'Arabic',\n 'Azerbaijani',\n 'Belarusian',\n 'Bengali',\n 'Bhojpuri',\n 'Bulgarian',\n 'Burmese',\n 'Cantonese',\n 'Catalan',\n 'Chinese',\n 'Croatian',\n 'Czech',\n 'Danish',\n 'Dutch',\n 'English',\n 'Estonian',\n 'Farsi',\n 'Filipino',\n 'Finnish',\n 'French',\n 'German',\n 'Greek',\n 'Gujarati',\n 'Hausa',\n 'Hebrew',\n 'Hindi',\n 'Hungarian',\n 'Icelandic',\n 'Igbo',\n 'Indonesian',\n 'Irish',\n 'Italian',\n 'Japanese',\n 'Javanese',\n 'Kazakh',\n 'Khmer',\n 'Korean',\n 'Lahnda',\n 'Latvian',\n 'Lithuanian',\n 'Malay',\n 'Mandarin',\n 'Marathi',\n 'Nepali',\n 'Norwegian',\n 'Oromo',\n 'Pashto',\n 'Polish',\n 'Portuguese',\n 'Romanian',\n 'Russian',\n 'Serbian',\n 'Shona',\n 'Sinhala',\n 'Slovak',\n 'Slovene',\n 'Somali',\n 'Spanish',\n 'Sundanese',\n 'Swahili',\n 'Swedish',\n 'Tagalog',\n 'Tamil',\n 'Telugu',\n 'Thai',\n 'Turkish',\n 'Ukrainian',\n 'Urdu',\n 'Uzbek',\n 'Vietnamese',\n 'Yoruba',\n 'Zulu',\n] as const\n\n/**\n * Defines skill proficiency levels.\n *\n * Based on common industry standards for skill assessment.\n */\nexport const LEVEL_OPTIONS = [\n 'Novice',\n 'Beginner',\n 'Intermediate',\n 'Advanced',\n 'Expert',\n 'Master',\n] as const\n\n/**\n * Defines supported languages for UI display and template translation.\n *\n * @see {@link https://en.wikipedia.org/wiki/IETF_language_tag}\n */\nexport const LOCALE_LANGUAGE_OPTIONS = [\n 'en',\n 'zh-hans',\n 'zh-hant-hk',\n 'zh-hant-tw',\n 'es',\n 'fr',\n 'no',\n] as const\n\n/**\n * Defines network options.\n */\nexport const NETWORK_OPTIONS = [\n 'Behance',\n 'Dribbble',\n 'Facebook',\n 'GitHub',\n 'Gitlab',\n 'Instagram',\n 'Line',\n 'LinkedIn',\n 'Medium',\n 'Pinterest',\n 'Reddit',\n 'Snapchat',\n 'Stack Overflow',\n 'Telegram',\n 'TikTok',\n 'Twitch',\n 'Twitter',\n 'Vimeo',\n 'Weibo',\n 'WeChat',\n 'WhatsApp',\n 'YouTube',\n 'Zhihu',\n] as const\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { LATEX_FONT_SIZE_OPTIONS } from './options'\nimport type {\n Content,\n HtmlLayout,\n HtmlTemplate,\n LatexLayout,\n LatexTemplate,\n LayoutEngine,\n Layouts,\n Locale,\n LocaleLanguage,\n MarkdownLayout,\n OrderableSectionID,\n Resume,\n ResumeItem,\n} from './types'\n\n/**\n * All valid top-level sections in the resume.\n */\nexport const SECTION_IDS = [\n 'basics',\n 'location',\n 'profiles',\n 'education',\n 'work',\n 'volunteer',\n 'awards',\n 'certificates',\n 'publications',\n 'skills',\n 'languages',\n 'interests',\n 'references',\n 'projects',\n] as const\n\n/**\n * All valid top-level sections in the resume that can be re-ordered.\n *\n * `location` and `profiles` are excluded as these are not real sections, i.e,\n * they are always rendered as part of the \"core\" information at the start of a\n * resume, not rendered as normal sections\n */\nexport const ORDERABLE_SECTION_IDS = [\n 'basics',\n 'education',\n 'work',\n 'volunteer',\n 'awards',\n 'certificates',\n 'publications',\n 'skills',\n 'languages',\n 'interests',\n 'references',\n 'projects',\n] as const\n\n/**\n * Default order for sections in the resume output.\n *\n * Sections not specified in custom order will follow this order.\n */\nexport const DEFAULT_SECTIONS_ORDER: OrderableSectionID[] = [\n 'basics',\n 'education',\n 'work',\n 'languages',\n 'skills',\n 'awards',\n 'certificates',\n 'publications',\n 'references',\n 'projects',\n 'interests',\n 'volunteer',\n]\n\n/**\n * Get the detail of the given LaTeX template.\n *\n * @param template - The template to get the detail for.\n * @returns The detail of the template.\n */\nexport function getLatexTemplateDetail(template: LatexTemplate) {\n const templateDetails: Record<\n LatexTemplate,\n { engine: LayoutEngine; name: string; description: string }\n > = {\n 'moderncv-banking': {\n engine: 'latex',\n name: 'ModernCV Banking',\n description: 'ModernCV template with banking style',\n },\n 'moderncv-casual': {\n engine: 'latex',\n name: 'ModernCV Casual',\n description: 'ModernCV template with casual style',\n },\n 'moderncv-classic': {\n engine: 'latex',\n name: 'ModernCV Classic',\n description: 'ModernCV template with classic style',\n },\n }\n\n if (template in templateDetails) {\n return {\n id: template,\n ...templateDetails[template],\n }\n }\n\n throw new Error(`Invalid template option: ${template}`)\n}\n\n/**\n * Get the detail of the given HTML template.\n *\n * @param template - The template to get the detail for.\n * @returns The detail of the template.\n */\nexport function getHtmlTemplateDetail(template: HtmlTemplate) {\n const templateDetails: Record<\n HtmlTemplate,\n { engine: LayoutEngine; name: string; description: string }\n > = {\n calm: {\n engine: 'html',\n name: 'Calm',\n description: 'A dedicated Calm HTML template, suitable for all.',\n },\n }\n\n if (template in templateDetails) {\n return {\n id: template,\n ...templateDetails[template],\n }\n }\n\n throw new Error(`Invalid template option: ${template}`)\n}\n\n/** Provides default, empty item structures for each resume section type. */\nexport const RESUME_SECTION_ITEMS: ResumeItem = {\n award: {\n awarder: '',\n date: '',\n summary: '',\n title: '',\n },\n basics: {\n email: '',\n headline: '',\n name: '',\n phone: '',\n summary: '',\n url: '',\n },\n certificate: {\n date: '',\n issuer: '',\n name: '',\n url: '',\n },\n education: {\n area: '',\n courses: [],\n endDate: '',\n summary: '',\n institution: '',\n score: '',\n startDate: '',\n degree: null,\n url: '',\n },\n interest: {\n keywords: [],\n name: '',\n },\n language: {\n fluency: null,\n language: null,\n keywords: [],\n },\n location: {\n address: '',\n city: '',\n country: null,\n postalCode: '',\n region: '',\n },\n profile: {\n network: null,\n url: '',\n username: '',\n },\n project: {\n description: '',\n endDate: '',\n summary: '',\n keywords: [],\n name: '',\n startDate: '',\n url: '',\n },\n publication: {\n name: '',\n publisher: '',\n releaseDate: '',\n summary: '',\n url: '',\n },\n reference: {\n email: '',\n name: '',\n phone: '',\n relationship: '',\n summary: '',\n },\n skill: {\n keywords: [],\n level: undefined,\n name: '',\n },\n volunteer: {\n endDate: '',\n organization: '',\n position: '',\n startDate: '',\n summary: '',\n url: '',\n },\n work: {\n name: '',\n endDate: '',\n position: '',\n startDate: '',\n keywords: [],\n summary: '',\n url: '',\n },\n}\n\n/**\n * Default content structure for a new resume, containing empty or minimal\n * sections.\n */\nexport const DEFAULT_RESUME_CONTENT: Content = {\n awards: [],\n basics: RESUME_SECTION_ITEMS.basics,\n certificates: [],\n education: [RESUME_SECTION_ITEMS.education],\n interests: [],\n languages: [RESUME_SECTION_ITEMS.language],\n location: RESUME_SECTION_ITEMS.location,\n profiles: [RESUME_SECTION_ITEMS.profile],\n projects: [],\n publications: [],\n references: [],\n skills: [RESUME_SECTION_ITEMS.skill],\n volunteer: [],\n work: [RESUME_SECTION_ITEMS.work],\n}\n\n/**\n * Resume content structure containing one example item for each section.\n *\n * Useful for testing transformations and rendering.\n */\nexport const FILLED_RESUME_CONTENT: Content = {\n awards: [RESUME_SECTION_ITEMS.award],\n basics: RESUME_SECTION_ITEMS.basics,\n certificates: [RESUME_SECTION_ITEMS.certificate],\n education: [RESUME_SECTION_ITEMS.education],\n interests: [RESUME_SECTION_ITEMS.interest],\n languages: [RESUME_SECTION_ITEMS.language],\n location: RESUME_SECTION_ITEMS.location,\n profiles: [RESUME_SECTION_ITEMS.profile],\n projects: [RESUME_SECTION_ITEMS.project],\n publications: [RESUME_SECTION_ITEMS.publication],\n references: [RESUME_SECTION_ITEMS.reference],\n skills: [RESUME_SECTION_ITEMS.skill],\n volunteer: [RESUME_SECTION_ITEMS.volunteer],\n work: [RESUME_SECTION_ITEMS.work],\n}\n\n/** Default top/bottom margin value. */\nconst DEFAULT_TOP_BOTTOM_MARGIN = '2.5cm'\n/** Default left/right margin value. */\nconst DEFAULT_LEFT_RIGHT_MARGIN = '1.5cm'\n\n/** Available margin size options for resume layout. */\nexport const MARGIN_OPTIONS = [\n DEFAULT_LEFT_RIGHT_MARGIN,\n '1.75cm',\n '2.0cm',\n '2.25cm',\n DEFAULT_TOP_BOTTOM_MARGIN,\n]\n\n/**\n * Get the language code and name of the given locale language.\n *\n * @param localeLanguage The locale language to get the name for.\n * @returns The language code and name of the given locale language.\n */\nexport function getLocaleLanguageDetail(localeLanguage: LocaleLanguage) {\n const localeLanguageDetails: Record<LocaleLanguage, string> = {\n en: 'English',\n 'zh-hans': 'Simplified Chinese',\n 'zh-hant-hk': 'Traditional Chinese (Hong Kong)',\n 'zh-hant-tw': 'Traditional Chinese (Taiwan)',\n es: 'Spanish',\n fr: 'French',\n no: 'Norwegian',\n }\n\n if (localeLanguage in localeLanguageDetails) {\n return {\n localeLanguage,\n name: localeLanguageDetails[localeLanguage],\n }\n }\n\n throw new Error(`Invalid locale language: ${localeLanguage}`)\n}\n\n/** Default HTML layout configuration. */\nexport const DEFAULT_HTML_LAYOUT: HtmlLayout = {\n engine: 'html',\n template: 'calm',\n typography: {\n fontSize: '16px',\n },\n}\n\n/** Default Markdown layout configuration. */\nexport const DEFAULT_MARKDOWN_LAYOUT: MarkdownLayout = {\n engine: 'markdown',\n}\n\n/** Default LaTeX layout configuration for the new layouts array. */\nexport const DEFAULT_LATEX_LAYOUT: LatexLayout = {\n engine: 'latex',\n template: 'moderncv-banking',\n advanced: {\n fontspec: {\n numbers: 'Auto',\n },\n },\n page: {\n margins: {\n top: DEFAULT_TOP_BOTTOM_MARGIN,\n bottom: DEFAULT_TOP_BOTTOM_MARGIN,\n left: DEFAULT_LEFT_RIGHT_MARGIN,\n right: DEFAULT_LEFT_RIGHT_MARGIN,\n },\n showPageNumbers: false,\n },\n typography: {\n fontSize: LATEX_FONT_SIZE_OPTIONS[0],\n },\n}\n\n/** Default layouts configuration. */\nexport const DEFAULT_RESUME_LAYOUTS: Layouts = [\n DEFAULT_LATEX_LAYOUT,\n DEFAULT_MARKDOWN_LAYOUT,\n DEFAULT_HTML_LAYOUT,\n]\n\n/** Default locale configuration. */\nexport const DEFAULT_RESUME_LOCALE: Locale = {\n language: 'en',\n}\n\n/** Default value when user creates a new `Resume` object. */\nexport const DEFAULT_RESUME: Resume = {\n content: DEFAULT_RESUME_CONTENT,\n locale: DEFAULT_RESUME_LOCALE,\n layouts: DEFAULT_RESUME_LAYOUTS,\n}\n\n/**\n * Default value when user wants to use a filled resume.\n *\n * This is useful for testing transformations and rendering.\n */\nexport const FILLED_RESUME: Resume = {\n content: FILLED_RESUME_CONTENT,\n locale: DEFAULT_RESUME_LOCALE,\n layouts: DEFAULT_RESUME_LAYOUTS,\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { get } from 'lodash-es'\n\nimport type {\n Country,\n Degree,\n Fluency,\n Language,\n Level,\n LocaleLanguage,\n SectionID,\n} from '@/models'\n\nimport {\n EnglishCountryNames,\n FrenchCountryNames,\n NorwegianCountryNames,\n SimplifiedChineseCountryNames,\n SpanishCountryNames,\n TraditionalChineseCountryHKNames,\n TraditionalChineseCountryTWNames,\n} from '@/models'\n\n/** Defines the structure for translated terms for a single language. */\ntype OptionTranslation = {\n /** Translations for country names. */\n countries: Record<Country, string>\n /** Translations for degree types. */\n degrees: Record<Degree, string>\n /** Translations for language fluency levels. */\n fluency: Record<Fluency, string>\n /** Translations for language names. */\n languages: Record<Language, string>\n /** Translations for resume section titles. */\n sections: Record<SectionID, string>\n /** Translations for skill proficiency levels. */\n skills: Record<Level, string>\n}\n\ntype OptionCategory = keyof OptionTranslation\n\n/** The structure containing translations for all supported languages. */\ntype OptionsTranslations = Record<LocaleLanguage, OptionTranslation>\n\n/**\n * Retrieves the translated terms for a specific locale language.\n *\n * Includes translations for degrees, languages, fluencies, countries, section\n * titles, levels, and other specific terms.\n *\n * @param language - The desired locale language. If undefined, defaults to\n * English.\n * @returns An object containing the translated terms for the specified\n * language.\n */\nexport function getOptionTranslation<K extends OptionCategory>(\n language: LocaleLanguage,\n category: K,\n option: keyof OptionTranslation[K]\n): string {\n const optionsTranslations: OptionsTranslations = {\n en: {\n countries: EnglishCountryNames,\n degrees: {\n 'Middle School': 'Middle School',\n 'High School': 'High School',\n Diploma: 'Diploma',\n Associate: 'Associate',\n Bachelor: 'Bachelor',\n Master: 'Master',\n Doctor: 'Doctor',\n },\n fluency: {\n 'Elementary Proficiency': 'Elementary Proficiency',\n 'Limited Working Proficiency': 'Limited Working Proficiency',\n 'Minimum Professional Proficiency': 'Minimum Professional Proficiency',\n 'Full Professional Proficiency': 'Full Professional Proficiency',\n 'Native or Bilingual Proficiency': 'Native or Bilingual Proficiency',\n },\n languages: {\n Afrikaans: 'Afrikaans',\n Albanian: 'Albanian',\n Amharic: 'Amharic',\n Arabic: 'Arabic',\n Azerbaijani: 'Azerbaijani',\n Belarusian: 'Belarusian',\n Bengali: 'Bengali',\n Bhojpuri: 'Bhojpuri',\n Bulgarian: 'Bulgarian',\n Burmese: 'Burmese',\n Cantonese: 'Cantonese',\n Catalan: 'Catalan',\n Chinese: 'Chinese',\n Croatian: 'Croatian',\n Czech: 'Czech',\n Danish: 'Danish',\n Dutch: 'Dutch',\n English: 'English',\n Estonian: 'Estonian',\n Farsi: 'Farsi',\n Filipino: 'Filipino',\n Finnish: 'Finnish',\n French: 'French',\n German: 'German',\n Greek: 'Greek',\n Gujarati: 'Gujarati',\n Hausa: 'Hausa',\n Hebrew: 'Hebrew',\n Hindi: 'Hindi',\n Hungarian: 'Hungarian',\n Icelandic: 'Icelandic',\n Igbo: 'Igbo',\n Indonesian: 'Indonesian',\n Irish: 'Irish',\n Italian: 'Italian',\n Japanese: 'Japanese',\n Javanese: 'Javanese',\n Kazakh: 'Kazakh',\n Khmer: 'Khmer',\n Korean: 'Korean',\n Lahnda: 'Lahnda',\n Latvian: 'Latvian',\n Lithuanian: 'Lithuanian',\n Malay: 'Malay',\n Mandarin: 'Mandarin',\n Marathi: 'Marathi',\n Nepali: 'Nepali',\n Norwegian: 'Norwegian',\n Oromo: 'Oromo',\n Pashto: 'Pashto',\n Polish: 'Polish',\n Portuguese: 'Portuguese',\n Romanian: 'Romanian',\n Russian: 'Russian',\n Serbian: 'Serbian',\n Shona: 'Shona',\n Sinhala: 'Sinhala',\n Slovak: 'Slovak',\n Slovene: 'Slovene',\n Somali: 'Somali',\n Spanish: 'Spanish',\n Sundanese: 'Sundanese',\n Swahili: 'Swahili',\n Swedish: 'Swedish',\n Tagalog: 'Tagalog',\n Tamil: 'Tamil',\n Telugu: 'Telugu',\n Thai: 'Thai',\n Turkish: 'Turkish',\n Ukrainian: 'Ukrainian',\n Urdu: 'Urdu',\n Uzbek: 'Uzbek',\n Vietnamese: 'Vietnamese',\n Yoruba: 'Yoruba',\n Zulu: 'Zulu',\n },\n sections: {\n awards: 'Awards',\n basics: 'Basics',\n certificates: 'Certificates',\n education: 'Education',\n interests: 'Interests',\n languages: 'Languages',\n location: 'Location',\n profiles: 'Profiles',\n projects: 'Projects',\n publications: 'Publications',\n references: 'References',\n skills: 'Skills',\n volunteer: 'Volunteer',\n work: 'Work',\n },\n skills: {\n Novice: 'Novice',\n Beginner: 'Beginner',\n Intermediate: 'Intermediate',\n Advanced: 'Advanced',\n Expert: 'Expert',\n Master: 'Master',\n },\n },\n 'zh-hans': {\n countries: SimplifiedChineseCountryNames,\n degrees: {\n 'Middle School': '初中',\n 'High School': '高中',\n Diploma: '专科',\n Associate: '副学士',\n Bachelor: '学士',\n Master: '硕士',\n Doctor: '博士',\n },\n fluency: {\n 'Elementary Proficiency': '初级水平',\n 'Limited Working Proficiency': '有限工作水平',\n 'Minimum Professional Proficiency': '最低专业水平',\n 'Full Professional Proficiency': '完全专业水平',\n 'Native or Bilingual Proficiency': '母语或双语水平',\n },\n languages: {\n Afrikaans: '南非语',\n Albanian: '阿尔巴尼亚语',\n Amharic: '阿姆哈拉语',\n Arabic: '阿拉伯语',\n Azerbaijani: '阿塞拜疆语',\n Belarusian: '白俄罗斯语',\n Bengali: '孟加拉语',\n Bhojpuri: '博杰普尔语',\n Bulgarian: '保加利亚语',\n Burmese: '缅甸语',\n Cantonese: '粤语',\n Catalan: '加泰罗尼亚语',\n Chinese: '中文',\n Croatian: '克罗地亚语',\n Czech: '捷克语',\n Danish: '丹麦语',\n Dutch: '荷兰语',\n English: '英语',\n Estonian: '爱沙尼亚语',\n Farsi: '波斯语',\n Filipino: '菲律宾语',\n Finnish: '芬兰语',\n French: '法语',\n German: '德语',\n Greek: '希腊语',\n Gujarati: '古吉拉特语',\n Hausa: '豪萨语',\n Hebrew: '希伯来语',\n Hindi: '印地语',\n Hungarian: '匈牙利语',\n Icelandic: '冰岛语',\n Igbo: '伊博语',\n Indonesian: '印度尼西亚语',\n Irish: '爱尔兰语',\n Italian: '意大利语',\n Japanese: '日语',\n Javanese: '爪哇语',\n Kazakh: '哈萨克语',\n Khmer: '高棉语',\n Korean: '韩语',\n Lahnda: '拉亨达语',\n Latvian: '拉脱维亚语',\n Lithuanian: '立陶宛语',\n Malay: '马来语',\n Mandarin: '普通话',\n Marathi: '马拉地语',\n Nepali: '尼泊尔语',\n Norwegian: '挪威语',\n Oromo: '奥罗莫语',\n Pashto: '普什图语',\n Polish: '波兰语',\n Portuguese: '葡萄牙语',\n Romanian: '罗马尼亚语',\n Russian: '俄语',\n Serbian: '塞尔维亚语',\n Shona: '绍纳语',\n Sinhala: '僧伽罗语',\n Slovak: '斯洛伐克语',\n Slovene: '斯洛文尼亚语',\n Somali: '索马里语',\n Spanish: '西班牙语',\n Sundanese: '巽他语',\n Swahili: '斯瓦希里语',\n Swedish: '瑞典语',\n Tagalog: '他加禄语',\n Tamil: '泰米尔语',\n Telugu: '泰卢固语',\n Thai: '泰语',\n Turkish: '土耳其语',\n Ukrainian: '乌克兰语',\n Urdu: '乌尔都语',\n Uzbek: '乌兹别克语',\n Vietnamese: '越南语',\n Yoruba: '约鲁巴语',\n Zulu: '祖鲁语',\n },\n sections: {\n awards: '荣誉',\n basics: '简介',\n certificates: '证书',\n education: '教育背景',\n interests: '兴趣爱好',\n languages: '语言',\n location: '位置',\n profiles: '个人主页',\n projects: '项目',\n publications: '出版刊物',\n references: '引荐',\n skills: '专业技能',\n volunteer: '志愿服务',\n work: '工作经历',\n },\n skills: {\n Novice: '新手',\n Beginner: '初级',\n Intermediate: '中级',\n Advanced: '高级',\n Expert: '专家',\n Master: '大师',\n },\n },\n 'zh-hant-hk': {\n countries: TraditionalChineseCountryHKNames,\n degrees: {\n 'Middle School': '初中',\n 'High School': '高中',\n Diploma: '專科',\n Associate: '副學士',\n Bachelor: '學士',\n Master: '碩士',\n Doctor: '博士',\n },\n fluency: {\n 'Elementary Proficiency': '初級水平',\n 'Limited Working Proficiency': '有限工作水平',\n 'Minimum Professional Proficiency': '最低專業水平',\n 'Full Professional Proficiency': '完全專業水平',\n 'Native or Bilingual Proficiency': '母語或雙語水平',\n },\n languages: {\n Afrikaans: '南非語',\n Albanian: '阿爾巴尼亞語',\n Amharic: '阿姆哈拉語',\n Arabic: '阿拉伯語',\n Azerbaijani: '阿塞拜疆語',\n Belarusian: '白俄羅斯語',\n Bengali: '孟加拉語',\n Bhojpuri: '博傑普爾語',\n Bulgarian: '保加利亞語',\n Burmese: '緬甸語',\n Cantonese: '粵語',\n Catalan: '加泰羅尼亞語',\n Chinese: '中文',\n Croatian: '克羅地亞語',\n Czech: '捷克語',\n Danish: '丹麥語',\n Dutch: '荷蘭語',\n English: '英語',\n Estonian: '愛沙尼亞語',\n Farsi: '波斯語',\n Filipino: '菲律賓語',\n Finnish: '芬蘭語',\n French: '法語',\n German: '德語',\n Greek: '希臘語',\n Gujarati: '古吉拉特語',\n Hausa: '豪薩語',\n Hebrew: '希伯來語',\n Hindi: '印地語',\n Hungarian: '匈牙利語',\n Icelandic: '冰島語',\n Igbo: '伊博語',\n Indonesian: '印度尼西亞語',\n Irish: '愛爾蘭語',\n Italian: '意大利語',\n Japanese: '日語',\n Javanese: '爪哇語',\n Kazakh: '哈薩克語',\n Khmer: '高棉語',\n Korean: '韓語',\n Lahnda: '拉亨達語',\n Latvian: '拉脫維亞語',\n Lithuanian: '立陶宛語',\n Malay: '馬來語',\n Mandarin: '普通話',\n Marathi: '馬拉地語',\n Nepali: '尼泊爾語',\n Norwegian: '挪威語',\n Oromo: '奧羅莫語',\n Pashto: '普什圖語',\n Polish: '波蘭語',\n Portuguese: '葡萄牙語',\n Romanian: '羅馬尼亞語',\n Russian: '俄語',\n Serbian: '塞爾維亞語',\n Shona: '紹納語',\n Sinhala: '僧伽羅語',\n Slovak: '斯洛伐克語',\n Slovene: '斯洛維尼亞語',\n Somali: '索馬里語',\n Spanish: '西班牙語',\n Sundanese: '巽他語',\n Swahili: '斯瓦希里語',\n Swedish: '瑞典語',\n Tagalog: '他加祿語',\n Tamil: '泰米爾語',\n Telugu: '泰盧固語',\n Thai: '泰語',\n Turkish: '土耳其語',\n Ukrainian: '烏克蘭語',\n Urdu: '烏爾都語',\n Uzbek: '烏茲別克語',\n Vietnamese: '越南語',\n Yoruba: '約魯巴語',\n Zulu: '祖魯語',\n },\n sections: {\n awards: '榮譽',\n basics: '簡介',\n certificates: '證書',\n education: '教育背景',\n interests: '興趣愛好',\n languages: '語言',\n location: '位置',\n profiles: '個人主頁',\n projects: '項目',\n publications: '出版刊物',\n references: '引薦',\n skills: '專業技能',\n volunteer: '志願服務',\n work: '工作經歷',\n },\n skills: {\n Novice: '新手',\n Beginner: '初級',\n Intermediate: '中級',\n Advanced: '高級',\n Expert: '專家',\n Master: '大師',\n },\n },\n 'zh-hant-tw': {\n countries: TraditionalChineseCountryTWNames,\n degrees: {\n 'Middle School': '初中',\n 'High School': '高中',\n Diploma: '專科',\n Associate: '副學士',\n Bachelor: '學士',\n Master: '碩士',\n Doctor: '博士',\n },\n fluency: {\n 'Elementary Proficiency': '初級水平',\n 'Limited Working Proficiency': '有限工作水平',\n 'Minimum Professional Proficiency': '最低專業水平',\n 'Full Professional Proficiency': '完全專業水平',\n 'Native or Bilingual Proficiency': '母語或雙語水平',\n },\n languages: {\n Afrikaans: '南非語',\n Albanian: '阿爾巴尼亞語',\n Amharic: '阿姆哈拉語',\n Arabic: '阿拉伯語',\n Azerbaijani: '阿塞拜疆語',\n Belarusian: '白俄羅斯語',\n Bengali: '孟加拉語',\n Bhojpuri: '博傑普爾語',\n Bulgarian: '保加利亞語',\n Burmese: '緬甸語',\n Cantonese: '粵語',\n Catalan: '加泰羅尼亞語',\n Chinese: '中文',\n Croatian: '克羅地亞語',\n Czech: '捷克語',\n Danish: '丹麥語',\n Dutch: '荷蘭語',\n English: '英語',\n Estonian: '愛沙尼亞語',\n Farsi: '波斯語',\n Filipino: '菲律賓語',\n Finnish: '芬蘭語',\n French: '法語',\n German: '德語',\n Greek: '希臘語',\n Gujarati: '古吉拉特語',\n Hausa: '豪薩語',\n Hebrew: '希伯來語',\n Hindi: '印地語',\n Hungarian: '匈牙利語',\n Icelandic: '冰島語',\n Igbo: '伊博語',\n Indonesian: '印度尼西亞語',\n Irish: '愛爾蘭語',\n Italian: '意大利語',\n Japanese: '日語',\n Javanese: '爪哇語',\n Kazakh: '哈薩克語',\n Khmer: '高棉語',\n Korean: '韓語',\n Lahnda: '拉亨達語',\n Latvian: '拉脫維亞語',\n Lithuanian: '立陶宛語',\n Malay: '馬來語',\n Mandarin: '普通話',\n Marathi: '馬拉地語',\n Nepali: '尼泊爾語',\n Norwegian: '挪威語',\n Oromo: '奧羅莫語',\n Pashto: '普什圖語',\n Polish: '波蘭語',\n Portuguese: '葡萄牙語',\n Romanian: '羅馬尼亞語',\n Russian: '俄語',\n Serbian: '塞爾維亞語',\n Shona: '紹納語',\n Sinhala: '僧伽羅語',\n Slovak: '斯洛伐克語',\n Slovene: '斯洛維尼亞語',\n Somali: '索馬里語',\n Spanish: '西班牙語',\n Sundanese: '巽他語',\n Swahili: '斯瓦希里語',\n Swedish: '瑞典語',\n Tagalog: '他加祿語',\n Tamil: '泰米爾語',\n Telugu: '泰盧固語',\n Thai: '泰語',\n Turkish: '土耳其語',\n Ukrainian: '烏克蘭語',\n Urdu: '烏爾都語',\n Uzbek: '烏茲別克語',\n Vietnamese: '越南語',\n Yoruba: '約魯巴語',\n Zulu: '祖魯語',\n },\n sections: {\n awards: '榮譽',\n basics: '簡介',\n certificates: '證書',\n education: '教育背景',\n interests: '興趣愛好',\n languages: '語言',\n location: '位置',\n profiles: '個人主頁',\n projects: '項目',\n publications: '出版刊物',\n references: '引薦',\n skills: '專業技能',\n volunteer: '志願服務',\n work: '工作經歷',\n },\n skills: {\n Novice: '新手',\n Beginner: '初級',\n Intermediate: '中級',\n Advanced: '高級',\n Expert: '專家',\n Master: '大師',\n },\n },\n es: {\n countries: SpanishCountryNames,\n degrees: {\n 'Middle School': 'Escuela secundaria',\n 'High School': 'Título de secundaria',\n Diploma: 'Diploma',\n Associate: 'Grado de asociado',\n Bachelor: 'Licenciatura',\n Master: 'Maestría',\n Doctor: 'Doctorado',\n },\n fluency: {\n 'Elementary Proficiency': 'Competencia elemental',\n 'Limited Working Proficiency': 'Competencia limitada de trabajo',\n 'Minimum Professional Proficiency':\n 'Competencia profesional de trabajo',\n 'Full Professional Proficiency': 'Competencia profesional plena',\n 'Native or Bilingual Proficiency': 'Competencia nativa o bilingüe',\n },\n languages: {\n Afrikaans: 'Afrikáns',\n Albanian: 'Albanés',\n Amharic: 'Amárico',\n Arabic: 'Árabe',\n Azerbaijani: 'Azerbaiyano',\n Belarusian: 'Bielorruso',\n Bengali: 'Bengalí',\n Bhojpuri: 'Bhojpuri',\n Bulgarian: 'Búlgaro',\n Burmese: 'Birmano',\n Cantonese: 'Cantonés',\n Catalan: 'Catalán',\n Chinese: 'Chino',\n Croatian: 'Croata',\n Czech: 'Checo',\n Danish: 'Danés',\n Dutch: 'Neerlandés',\n English: 'Inglés',\n Estonian: 'Estonio',\n Farsi: 'Persa',\n Filipino: 'Filipino',\n Finnish: 'Finlandés',\n French: 'Francés',\n German: 'Alemán',\n Greek: 'Griego',\n Gujarati: 'Gujarati',\n Hausa: 'Hausa',\n Hebrew: 'Hebreo',\n Hindi: 'Hindi',\n Hungarian: 'Húngaro',\n Icelandic: 'Islandés',\n Igbo: 'Igbo',\n Indonesian: 'Indonesio',\n Irish: 'Irlandés',\n Italian: 'Italiano',\n Japanese: 'Japonés',\n Javanese: 'Javanés',\n Kazakh: 'Kazajo',\n Khmer: 'Jemer',\n Korean: 'Coreano',\n Lahnda: 'Lahnda',\n Latvian: 'Letón',\n Lithuanian: 'Lituano',\n Malay: 'Malayo',\n Mandarin: 'Mandarín',\n Marathi: 'Marathi',\n Nepali: 'Nepalí',\n Norwegian: 'Noruego',\n Oromo: 'Oromo',\n Pashto: 'Pastún',\n Polish: 'Polaco',\n Portuguese: 'Portugués',\n Romanian: 'Rumano',\n Russian: 'Ruso',\n Serbian: 'Serbio',\n Shona: 'Shona',\n Sinhala: 'Cingalés',\n Slovak: 'Eslovaco',\n Slovene: 'Esloveno',\n Somali: 'Somalí',\n Spanish: 'Español',\n Sundanese: 'Sundanés',\n Swahili: 'Swahili',\n Swedish: 'Sueco',\n Tagalog: 'Tagalo',\n Tamil: 'Tamil',\n Telugu: 'Telugu',\n Thai: 'Tailandés',\n Turkish: 'Turco',\n Ukrainian: 'Ucraniano',\n Urdu: 'Urdu',\n Uzbek: 'Uzbeko',\n Vietnamese: 'Vietnamita',\n Yoruba: 'Yoruba',\n Zulu: 'Zulú',\n },\n sections: {\n awards: 'Premios',\n basics: 'Información básica',\n certificates: 'Certificados',\n education: 'Educación',\n interests: 'Intereses',\n languages: 'Idiomas',\n location: 'Ubicación',\n profiles: 'Perfiles',\n projects: 'Proyectos',\n publications: 'Publicaciones',\n references: 'Referencias',\n skills: 'Competencias',\n volunteer: 'Voluntariado',\n work: 'Experiencia laboral',\n },\n skills: {\n Novice: 'Novato',\n Beginner: 'Principiante',\n Intermediate: 'Intermedio',\n Advanced: 'Avanzado',\n Expert: 'Experto',\n Master: 'Maestro',\n },\n },\n fr: {\n countries: FrenchCountryNames,\n degrees: {\n 'Middle School': 'Collège',\n 'High School': 'Lycée',\n Diploma: 'Diplôme',\n Associate: 'Diplôme universitaire de technologie',\n Bachelor: 'Licence',\n Master: 'Master',\n Doctor: 'Doctorat',\n },\n languages: {\n Afrikaans: 'Afrikaans',\n Albanian: 'Albanais',\n Amharic: 'Amharique',\n Arabic: 'Arabe',\n Azerbaijani: 'Azéri',\n Belarusian: 'Biélorusse',\n Bengali: 'Bengali',\n Bhojpuri: 'Bhojpuri',\n Bulgarian: 'Bulgare',\n Burmese: 'Birman',\n Cantonese: 'Cantonais',\n Catalan: 'Catalan',\n Chinese: 'Chinois',\n Croatian: 'Croate',\n Czech: 'Tchèque',\n Danish: 'Danois',\n Dutch: 'Néerlandais',\n English: 'Anglais',\n Estonian: 'Estonien',\n Farsi: 'Persan',\n Filipino: 'Filipino',\n Finnish: 'Finnois',\n French: 'Français',\n German: 'Allemand',\n Greek: 'Grec',\n Gujarati: 'Gujarati',\n Hausa: 'Haoussa',\n Hebrew: 'Hébreu',\n Hindi: 'Hindi',\n Hungarian: 'Hongrois',\n Icelandic: 'Islandais',\n Igbo: 'Igbo',\n Indonesian: 'Indonésien',\n Irish: 'Irlandais',\n Italian: 'Italien',\n Japanese: 'Japonais',\n Javanese: 'Javanais',\n Kazakh: 'Kazakh',\n Khmer: 'Khmer',\n Korean: 'Coréen',\n Lahnda: 'Lahnda',\n Latvian: 'Letton',\n Lithuanian: 'Lituanien',\n Malay: 'Malais',\n Mandarin: 'Mandarin',\n Marathi: 'Marathi',\n Nepali: 'Népalais',\n Norwegian: 'Norvégien',\n Oromo: 'Oromo',\n Pashto: 'Pachto',\n Polish: 'Polonais',\n Portuguese: 'Portugais',\n Romanian: 'Roumain',\n Russian: 'Russe',\n Serbian: 'Serbe',\n Shona: 'Shona',\n Sinhala: 'Cingalais',\n Slovak: 'Slovaque',\n Slovene: 'Slovène',\n Somali: 'Somali',\n Spanish: 'Espagnol',\n Sundanese: 'Soundanais',\n Swahili: 'Swahili',\n Swedish: 'Suédois',\n Tagalog: 'Tagalog',\n Tamil: 'Tamoul',\n Telugu: 'Telugu',\n Thai: 'Thaï',\n Turkish: 'Turc',\n Ukrainian: 'Ukrainien',\n Urdu: 'Ourdou',\n Uzbek: 'Ouzbek',\n Vietnamese: 'Vietnamien',\n Yoruba: 'Yoruba',\n Zulu: 'Zoulou',\n },\n fluency: {\n 'Elementary Proficiency': 'Niveau élémentaire',\n 'Limited Working Proficiency': 'Niveau de travail limité',\n 'Minimum Professional Proficiency': 'Niveau professionnel minimum',\n 'Full Professional Proficiency': 'Niveau professionnel complet',\n 'Native or Bilingual Proficiency': 'Niveau natif ou bilingue',\n },\n sections: {\n awards: 'Récompenses',\n basics: 'Informations de base',\n certificates: 'Certificats',\n education: 'Formation',\n interests: \"Centres d'intérêt\",\n languages: 'Langues',\n location: 'Localisation',\n profiles: 'Profils',\n projects: 'Projets',\n publications: 'Publications',\n references: 'Références',\n skills: 'Compétences',\n volunteer: 'Bénévolat',\n work: 'Expérience professionnelle',\n },\n skills: {\n Novice: 'Novice',\n Beginner: 'Débutant',\n Intermediate: 'Intermédiaire',\n Advanced: 'Avancé',\n Expert: 'Expert',\n Master: 'Maître',\n },\n },\n no: {\n countries: NorwegianCountryNames,\n degrees: {\n 'Middle School': 'Ungdomsskole',\n 'High School': 'Videregående skole',\n Diploma: 'Fagbrev',\n Associate: 'Associate',\n Bachelor: 'Bachelor',\n Master: 'Master',\n Doctor: 'Doktor',\n },\n languages: {\n Afrikaans: 'Afrikaans',\n Albanian: 'Albansk',\n Amharic: 'Amharisk',\n Arabic: 'Arabisk',\n Azerbaijani: 'Aserbajdsjansk',\n Belarusian: 'Belarusisk',\n Bengali: 'Bengali',\n Bhojpuri: 'Bhojpuri',\n Bulgarian: 'Bulgarsk',\n Burmese: 'Burmesisk',\n Cantonese: 'Kantonesisk',\n Catalan: 'Katalansk',\n Chinese: 'Kinesisk',\n Croatian: 'Kroatisk',\n Czech: 'Tsjekkisk',\n Danish: 'Dansk',\n Dutch: 'Nederlandsk',\n English: 'Engelsk',\n Estonian: 'Estisk',\n Farsi: 'Farsi',\n Filipino: 'Filippinsk',\n Finnish: 'Finsk',\n French: 'Fransk',\n German: 'Tysk',\n Greek: 'Gresk',\n Gujarati: 'Gujarati',\n Hausa: 'Hausa',\n Hebrew: 'Hebraisk',\n Hindi: 'Hindi',\n Hungarian: 'Ungarsk',\n Icelandic: 'Islandsk',\n Igbo: 'Igbo',\n Indonesian: 'Indonesisk',\n Irish: 'Irsk',\n Italian: 'Italiensk',\n Japanese: 'Japansk',\n Javanese: 'Javanesisk',\n Kazakh: 'Kasakhisk',\n Khmer: 'Khmer',\n Korean: 'Koreansk',\n Lahnda: 'Lahnda',\n Latvian: 'Latvisk',\n Lithuanian: 'Litauisk',\n Malay: 'Malayisk',\n Mandarin: 'Mandarin',\n Marathi: 'Marathi',\n Nepali: 'Nepali',\n Norwegian: 'Norsk',\n Oromo: 'Oromo',\n Pashto: 'Pashto',\n Polish: 'Polsk',\n Portuguese: 'Portugisisk',\n Romanian: 'Rumensk',\n Russian: 'Russisk',\n Serbian: 'Serbisk',\n Shona: 'Shona',\n Sinhala: 'Singalesisk',\n Slovak: 'Slovakisk',\n Slovene: 'Slovensk',\n Somali: 'Somali',\n Spanish: 'Spansk',\n Sundanese: 'Sundanesisk',\n Swahili: 'Swahili',\n Swedish: 'Svensk',\n Tagalog: 'Tagalog',\n Tamil: 'Tamil',\n Telugu: 'Telugu',\n Thai: 'Thai',\n Turkish: 'Tyrkisk',\n Ukrainian: 'Ukrainsk',\n Urdu: 'Urdu',\n Uzbek: 'Usbekisk',\n Vietnamese: 'Vietnamesisk',\n Yoruba: 'Yoruba',\n Zulu: 'Zulu',\n },\n fluency: {\n 'Elementary Proficiency': 'Grunnleggende nivå',\n 'Limited Working Proficiency': 'Begrenset arbeidskunnskap',\n 'Minimum Professional Proficiency': 'Minimum profesjonelt nivå',\n 'Full Professional Proficiency': 'Fullt profesjonelt nivå',\n 'Native or Bilingual Proficiency': 'Morsmål eller tospråklig nivå',\n },\n sections: {\n awards: 'Utmerkelser',\n basics: 'Grunnleggende informasjon',\n certificates: 'Sertifikater',\n education: 'Utdanning',\n interests: 'Interesser',\n languages: 'Språk',\n location: 'Plassering',\n profiles: 'Profiler',\n projects: 'Prosjekter',\n publications: 'Publikasjoner',\n references: 'Referanser',\n skills: 'Ferdigheter',\n volunteer: 'Frivillig arbeid',\n work: 'Arbeidserfaring',\n },\n skills: {\n Novice: 'Nybegynner',\n Beginner: 'Begynner',\n Intermediate: 'Viderekommen',\n Advanced: 'Avansert',\n Expert: 'Ekspert',\n Master: 'Mester',\n },\n },\n }\n\n return get(\n optionsTranslations,\n [language, category, option],\n option\n ) as string\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { LocaleLanguage } from '@/models'\nimport { isEmptyValue } from '@/utils'\n\n/** Specific punctuation types used for formatting within templates. */\nexport const PUNCTUATIONS = ['comma', 'colon', 'separator'] as const\n\n/** The type of punctuation. */\nexport type Punctuation = (typeof PUNCTUATIONS)[number]\n\n/** Specific terms used within the template structure that need translation. */\nexport const TERMS = ['courses', 'keywords', 'score'] as const\n\n/** The type of term. */\nexport type Term = (typeof TERMS)[number]\n\n/** The structure for template-specific translations (punctuations and terms) */\ntype TemplateTranslationValue = {\n /** Translations for punctuation types defined in `Punctuation`. */\n punctuations: Record<Punctuation, string>\n /** Translations for template terms defined in `Term`. */\n terms: Record<Term, string>\n}\n\n/** The overall structure containing template-specific translations for all\n * supported languages. */\ntype TemplateTranslation = Record<LocaleLanguage, TemplateTranslationValue>\n\n/**\n * Retrieves template-specific translations (punctuations and terms) for a given\n * locale language.\n *\n * @param language - The desired locale language. If undefined, defaults to\n * English.\n * @returns An object containing the translated punctuations and terms for the\n * specified language.\n */\nexport function getTemplateTranslations(\n language?: LocaleLanguage\n): TemplateTranslationValue {\n const templateTranslation: TemplateTranslation = {\n en: {\n punctuations: {\n comma: ', ',\n colon: ': ',\n separator: ', ',\n },\n terms: {\n courses: 'Courses',\n keywords: 'Keywords',\n score: 'Score',\n },\n },\n 'zh-hans': {\n punctuations: {\n comma: ',',\n colon: ':',\n separator: '、',\n },\n terms: {\n courses: '课程',\n keywords: '关键字',\n score: '成绩',\n },\n },\n 'zh-hant-hk': {\n punctuations: {\n comma: ',',\n colon: ':',\n separator: '、',\n },\n terms: {\n courses: '課程',\n keywords: '關鍵字',\n score: '成績',\n },\n },\n 'zh-hant-tw': {\n punctuations: {\n comma: ',',\n colon: ':',\n separator: '、',\n },\n terms: {\n courses: '課程',\n keywords: '關鍵字',\n score: '成績',\n },\n },\n es: {\n punctuations: {\n comma: ', ',\n colon: ': ',\n separator: ', ',\n },\n terms: {\n courses: 'Cursos',\n keywords: 'Palabras clave',\n score: 'Puntuación',\n },\n },\n fr: {\n punctuations: {\n comma: ', ',\n colon: ' : ',\n separator: ', ',\n },\n terms: {\n courses: 'Cours',\n keywords: 'Mots-clés',\n score: 'Score',\n },\n },\n no: {\n punctuations: {\n comma: ', ',\n colon: ': ',\n separator: ', ',\n },\n terms: {\n courses: 'Kurs',\n keywords: 'Nøkkelord',\n score: 'Poeng',\n },\n },\n }\n\n return templateTranslation[isEmptyValue(language) ? 'en' : language]\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { capitalize, cloneDeep, isArray, merge } from 'lodash-es'\n\nimport { HtmlCodeGenerator, LatexCodeGenerator, type Parser } from '@/compiler'\nimport {\n DEFAULT_HTML_LAYOUT,\n DEFAULT_LATEX_LAYOUT,\n DEFAULT_MARKDOWN_LAYOUT,\n DEFAULT_RESUME_LAYOUTS,\n DEFAULT_RESUME_LOCALE,\n FILLED_RESUME_CONTENT,\n type Resume,\n type SectionID,\n} from '@/models'\nimport { getOptionTranslation, getTemplateTranslations } from '@/translations'\nimport {\n getDateRange,\n isEmptyValue,\n joinNonEmptyString,\n localizeDate,\n showIf,\n} from '@/utils'\n\n/**\n * Replaces consecutive blank lines with a single LaTeX comment character (`%`).\n *\n * Useful for preventing LaTeX errors in environments sensitive to blank lines.\n *\n * @param content - The input string content.\n * @returns The processed string with blank lines replaced.\n */\nexport function replaceBlankLinesWithPercent(content: string): string {\n // if content only contains a newline character, we return an empty string\n if (content === '\\n') {\n return ''\n }\n\n return content.replace(/(^[ \\t]*\\n)/gm, '%\\n')\n}\n\n/**\n * Merges the provided resume content with default content values, ensuring\n * all necessary content properties are set.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n */\nexport function normalizeResumeContentSections(resume: Resume): Resume {\n const clonedResume = cloneDeep(resume)\n\n Object.keys(FILLED_RESUME_CONTENT).forEach((key) => {\n switch (key) {\n case 'basics':\n if (isEmptyValue(clonedResume.content[key])) {\n clonedResume.content.basics = FILLED_RESUME_CONTENT.basics\n }\n break\n case 'location':\n if (isEmptyValue(clonedResume.content[key])) {\n clonedResume.content.location = FILLED_RESUME_CONTENT.location\n }\n break\n default:\n if (isEmptyValue(clonedResume.content[key])) {\n clonedResume.content[key] = []\n }\n break\n }\n })\n\n return clonedResume\n}\n\n/**\n * Normalizes resume content by replacing null and undefined with `\"\"`\n *\n * 1. call `normalizeResumeContentSections` to ensure all sections exist\n * 2. iterate through all sections to ensure no null or undefined values exist\n *\n * @param resume - The resume object to normalize.\n * @returns The normalized resume object.\n */\nexport function normalizedResumeContent(resume: Resume): Resume {\n // First, apply default values to ensure all sections exist\n const resumeWithDefaults = normalizeResumeContentSections(resume)\n\n // Handle basics and location sections (these are objects, not arrays)\n Object.entries(resumeWithDefaults.content).forEach(\n ([sectionKey, sectionValue]) => {\n switch (sectionKey) {\n case 'computed':\n break\n case 'basics':\n case 'location':\n // for basics and location, iterate through all keys\n Object.keys(FILLED_RESUME_CONTENT[sectionKey]).forEach((propKey) => {\n if (\n sectionValue[propKey] === null ||\n sectionValue[propKey] === undefined\n ) {\n sectionValue[propKey] = ''\n }\n })\n break\n default:\n // For other sections (arrays), iterate through each element\n if (Array.isArray(sectionValue)) {\n sectionValue.forEach((item) => {\n if (item && typeof item === 'object') {\n Object.keys(FILLED_RESUME_CONTENT[sectionKey][0]).forEach(\n (propKey) => {\n if (item[propKey] === null || item[propKey] === undefined) {\n switch (propKey) {\n // for courses and keywords, we set them to empty array\n case 'courses':\n case 'keywords':\n item[propKey] = []\n break\n default:\n item[propKey] = ''\n }\n }\n }\n )\n }\n })\n }\n }\n }\n )\n\n return resumeWithDefaults\n}\n\n/**\n * Iterates through all resume content sections and applies `escapeFunc` to\n * relevant string fields and array elements using helper functions.\n *\n * @param resume - The resume object to process.\n * @returns The processed resume object.\n * @remarks Modifies the `resume.content` object and its children directly.\n */\nexport function transformResumeValues(\n resume: Resume,\n escapeFunc: (input: string) => string\n): Resume {\n Object.entries(resume.content).forEach(([key, value]) => {\n // only resume.basics and resume.location are objects, others are all arrays\n if (key === 'basics' || key === 'location') {\n transformResumeSectionValues(value as Record<string, unknown>, escapeFunc)\n } else if (key === 'computed') {\n // `computed` object will be handled separately\n // for now, `transformSocialLinks` will handle it\n return\n } else {\n resume.content[key].forEach((_, index: number) => {\n transformResumeSectionValues(\n value[index] as Record<string, unknown>,\n escapeFunc\n )\n })\n }\n })\n\n return resume\n}\n\n/**\n * Transform all values in `computed` field with `escapeFunc`.\n */\nfunction transformResumeSectionComputedValues(\n sectionResumeComputed: {\n [key: string]: string\n },\n escapeFunc: (input: string) => string\n): void {\n Object.entries(sectionResumeComputed).forEach(([key, value]) => {\n sectionResumeComputed[key] = escapeFunc(value)\n })\n}\n\n/**\n * Transform all the values in `sectionResumeItem` with `escapeFunc`\n *\n * @param sectionResumeItem - a dictionary object in a resume section, for\n * 'basics` and 'locations', it would be `resume.basics` and `resume.location`\n * respectively, for other sections, it would be `resume.education[0]`,\n * `resume.projects[0]` etc.\n */\nfunction transformResumeSectionValues(\n sectionResumeItem: Record<string, unknown>,\n escapeFunc: (input: string) => string\n): void {\n Object.entries(sectionResumeItem).forEach(([key, value]) => {\n if (key === 'summary') {\n // we will handle the `summary` field in a `textNodeToTeX` function\n // separately\n return\n }\n\n if (key === 'computed') {\n // deal with `computed` field separately\n transformResumeSectionComputedValues(\n value as { [key: string]: string },\n escapeFunc\n )\n return\n }\n\n if (['courses', 'keywords'].includes(key)) {\n sectionResumeItem[key] = (value as string[]).map((item) => {\n return escapeFunc(item)\n })\n\n return\n }\n\n sectionResumeItem[key] = escapeFunc(value as string)\n })\n}\n\n/**\n * Transforms the `courses` array in the education section into a single,\n * formatted string stored in `computed.courses`.\n *\n * Uses locale-specific separators and newlines for readability.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.education` items in place.\n */\nexport function transformEducationCourses(resume: Resume): Resume {\n const {\n punctuations: { separator },\n } = getTemplateTranslations(resume.locale?.language)\n\n resume.content.education.forEach((item, index: number) => {\n if (!isEmptyValue(item.courses)) {\n resume.content.education[index].computed = {\n ...resume.content.education[index].computed,\n courses: (item.courses as string[]).join(`${separator}`),\n }\n }\n })\n\n return resume\n}\n\n/**\n * Combines `degree`, `area`, and `score` from education items into\n * a formatted string stored in `computed.degreeAreaAndScore`.\n *\n * Uses locale-specific terms and punctuation.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.education` items in place.\n */\nexport function transformEducationDegreeAreaAndScore(resume: Resume): Resume {\n const {\n punctuations: { colon, comma },\n } = getTemplateTranslations(resume.locale?.language)\n\n const {\n terms: { score },\n } = getTemplateTranslations(resume.locale?.language)\n\n resume.content.education.forEach((item) => {\n const degree = getOptionTranslation(\n resume.locale?.language,\n 'degrees',\n item.degree\n )\n\n item.computed = {\n ...item.computed,\n degreeAreaAndScore: [\n degree,\n item.area,\n showIf(!isEmptyValue(item.score), `${score}${colon}${item.score}`),\n ]\n .filter((value) => !isEmptyValue(value))\n .join(comma),\n }\n })\n\n return resume\n}\n\n/**\n * Transforms `keywords` arrays in various sections (interests, languages, etc.)\n * into a single, formatted string stored in `computed.keywords`.\n *\n * Uses locale-specific separators.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies items within relevant sections (`interests`, `languages`,\n * etc.) in place.\n */\nexport function transformKeywords(resume: Resume): Resume {\n const {\n punctuations: { separator },\n } = getTemplateTranslations(resume.locale?.language)\n\n for (const section of [\n 'interests',\n 'languages',\n 'projects',\n 'skills',\n 'work',\n ]) {\n resume.content[section].forEach(\n (item: { keywords: string[] }, index: number) => {\n if (isArray(item.keywords) && item.keywords.length > 0) {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n // keywords are generally shorter than courses, so we only use\n // separator without newlines to separate them\n keywords: item.keywords.join(`${separator}`),\n }\n } else {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n keywords: '',\n }\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Transforms various date fields (`date`, `releaseDate`, `startDate`,\n * `endDate`) across multiple sections into a localized format (e.g., \"Month\n * Year\") and calculates date ranges.\n *\n * Stores results in the respective `computed` objects.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies items within relevant sections in place.\n */\nexport function transformDate(resume: Resume): Resume {\n for (const section of ['awards', 'certificates']) {\n resume.content[section].forEach((item: { date: string }, index: number) => {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n date: localizeDate(item.date, resume.locale?.language),\n }\n })\n }\n\n for (const section of ['publications']) {\n resume.content[section].forEach(\n (item: { releaseDate: string }, index: number) => {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n releaseDate: localizeDate(item.releaseDate, resume.locale?.language),\n }\n }\n )\n }\n\n for (const section of ['education', 'projects', 'volunteer', 'work']) {\n resume.content[section].forEach(\n (item: { startDate: string; endDate: string }, index: number) => {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n startDate: localizeDate(item.startDate, resume.locale?.language),\n }\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n endDate: localizeDate(item.endDate, resume.locale?.language),\n }\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n dateRange: getDateRange(\n item.startDate,\n item.endDate,\n resume.locale?.language\n ),\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Replaces empty `endDate` values in relevant sections with the string\n * \"Present\".\n *\n * Updates the `computed.endDate` field.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies items within relevant sections (`education`, `projects`,\n * etc.) in place. Should run after `transformDate`.\n */\nexport function transformEndDate(resume: Resume): Resume {\n for (const section of ['education', 'projects', 'volunteer', 'work']) {\n resume.content[section].forEach(\n (item: { endDate: string }, index: number) => {\n if (isEmptyValue(item.endDate)) {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n endDate: 'Present',\n }\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Translates `language` and `fluency` values in the languages section\n * based on the selected locale.\n * Stores results in `computed.language` and `computed.fluency`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.languages` items in place.\n */\nexport function transformLanguage(resume: Resume): Resume {\n resume.content.languages.forEach((item) => {\n item.computed = {\n ...item.computed,\n language: getOptionTranslation(\n resume.locale?.language,\n 'languages',\n item.language\n ),\n fluency: getOptionTranslation(\n resume.locale?.language,\n 'fluency',\n item.fluency\n ),\n }\n })\n\n return resume\n}\n\n/**\n * Combines address components (`address`, `city`, `region`, `country`,\n * `postalCode`) into a locale-aware formatted address string stored in\n * `computed.fullAddress`.\n *\n * Also computes intermediate components like `postalCodeAndAddress` and\n * `regionAndCountry`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.location` in place.\n */\nexport function transformLocation(resume: Resume): Resume {\n const {\n punctuations: { comma },\n } = getTemplateTranslations(resume.locale?.language)\n\n const {\n content: {\n location: { address, city, region, postalCode },\n },\n } = resume\n\n const country = getOptionTranslation(\n resume.locale?.language,\n 'countries',\n resume.content.location.country\n )\n\n switch (resume.locale?.language) {\n case 'zh-hans':\n case 'zh-hant-hk':\n case 'zh-hant-tw': {\n // For Chinese, the address format is most generic to more specific, i.e,\n // Country > Region > City > Address\n const fullAddress = joinNonEmptyString(\n [country, region, city, address, postalCode].filter(\n (value) => !isEmptyValue(value)\n ),\n comma\n )\n\n resume.content.location.computed = {\n ...resume.content.location.computed,\n fullAddress,\n }\n\n break\n }\n default: {\n const fullAddress = joinNonEmptyString(\n [address, city, region, country, postalCode].filter(\n (value) => !isEmptyValue(value)\n ),\n comma\n )\n\n resume.content.location.computed = {\n ...resume.content.location.computed,\n fullAddress,\n }\n\n break\n }\n }\n\n return resume\n}\n\n/**\n * Transforms the `basics.url` field into a LaTeX `\\href` command with a link\n * icon, stored in `computed.url`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.basics.computed` in place.\n */\nexport function transformBasicsUrl(resume: Resume): Resume {\n // `basics.url` is not a mandatory field, so we have to check if it is empty\n const basicsLink = isEmptyValue(resume.content.basics.url)\n ? ''\n : `{\\\\small \\\\faLink}\\\\ \\\\href{${resume.content.basics.url}}{${resume.content.basics.url}}`\n\n resume.content.basics.computed = {\n ...resume.content.basics.computed,\n url: basicsLink,\n }\n\n return resume\n}\n\n/**\n * Transforms profile URLs into LaTeX `\\href` commands with appropriate\n * FontAwesome icons based on the network name.\n *\n * Stores the result in `computed.url` for each profile item.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.profiles` items in place.\n */\nexport function transformProfileUrls(resume: Resume): Resume {\n // In general, to get the fontawesome5 symbol for a given network, we can\n // simply use the following use `capitalise(network)` as the icon name, though\n // there are some exceptions such as WeChat and `Stack Overflow`\n const getFaIcon = (network: string): string => {\n switch (network) {\n case 'Stack Overflow':\n return '\\\\faStackOverflow'\n case 'WeChat':\n return '\\\\faWeixin'\n default:\n return `\\\\fa${capitalize(network)}`\n }\n }\n\n resume.content.profiles.forEach((item, index: number) => {\n resume.content.profiles[index].computed = {\n ...resume.content.profiles[index].computed,\n url:\n isEmptyValue(item.username) || isEmptyValue(item.network)\n ? ''\n : `{\\\\small ${getFaIcon(item.network)}}\\\\ \\\\href{${item.url}}{@${\n item.username\n }}`,\n }\n })\n\n return resume\n}\n\n/**\n * Translates skill proficiency levels based on the selected locale.\n *\n * Stores the translated string in `computed.level`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.skills` items in place.\n */\nexport function transformSkills(resume: Resume): Resume {\n resume.content.skills.forEach((item) => {\n const level = getOptionTranslation(\n resume.locale?.language,\n 'skills',\n item.level\n )\n\n item.computed = {\n ...item.computed,\n level: showIf(!isEmptyValue(item.level), level),\n }\n })\n\n return resume\n}\n\n/**\n * Collects URLs from `basics` and `profiles` sections, formats them as LaTeX\n * links (requires `transformBasicsUrl` and `transformProfileUrls` to be run\n * first),\n *\n * Join them into a single string stored in `resume.content.computed.urls`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.computed`.\n */\nexport function transformProfileLinks(resume: Resume): Resume {\n transformBasicsUrl(resume)\n transformProfileUrls(resume)\n\n resume.content.computed = {\n ...resume.content.computed,\n urls: [\n resume.content.basics.computed.url,\n ...resume.content.profiles.map((item) => item.computed.url),\n ]\n // here we filter out empty values is the processed link is still empty\n .filter((link) => !isEmptyValue(link))\n // we use 4 lefet spaces, a dot and 4 right spaces to separate links, just\n // to align with default moderncv style\n .join(' {} {} {} • {} {} {} \\n'),\n }\n\n return resume\n}\n\n/**\n * Translates standard section titles (like \"Education\", \"Work\") based on the\n * selected locale, with support for section aliases.\n *\n * Stores the translations in `resume.content.computed.sectionNames`. Section\n * aliases in `layout.sections.alias` will override default translations.\n *\n * @param resume - The resume object.\n * @param layoutIndex - The index of the selected layout to pull section aliases\n * from.\n * @param _summaryParser - Unused parser kept for API consistency.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.computed`.\n */\nexport function transformSectionNames(\n resume: Resume,\n layoutIndex: number,\n _summaryParser: Parser\n): Resume {\n resume.content.computed = {\n ...resume.content.computed,\n sectionNames: Object.keys(resume.content).reduce(\n (translations, sectionName) => {\n if (sectionName === 'computed') {\n return translations\n }\n\n const sectionId = sectionName as SectionID\n\n // Check if there's an alias for this section in the first layout\n const sectionAlias =\n resume.layouts?.[layoutIndex]?.sections?.aliases?.[sectionId]\n\n // Use the alias if provided, otherwise use default translation\n translations[sectionName] =\n sectionAlias ||\n getOptionTranslation(resume.locale?.language, 'sections', sectionId)\n\n return translations\n },\n {}\n ),\n }\n\n return resume\n}\n\n/**\n * Parses the `summary` field in various sections and converts it into LaTeX\n * code using the provided parser and generator.\n *\n * Stores the result in the corresponding `computed.summary` field, replacing blank lines.\n *\n * @param resume - The resume object.\n * @param layoutIndex - The index of the selected layout to pull typography\n * overrides from.\n * @param summaryParser - The parser instance (e.g., `MarkdownParser`)\n * @returns The transformed resume object.\n * @remarks Modifies `computed.summary` within `basics` and items in sections\n * like `education`, `work`, etc.\n */\nexport function transformSummary(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser\n): Resume {\n const layout = resume.layouts?.[layoutIndex]\n\n if (layout?.engine === 'markdown') {\n return resume\n }\n\n const typographyContext = {\n typography: layout?.typography,\n }\n\n // Choose the appropriate code generator based on the layout engine\n let codeGenerator: LatexCodeGenerator | HtmlCodeGenerator\n let processOutput = (output: string) => output.trim()\n\n switch (layout?.engine) {\n case 'latex':\n codeGenerator = new LatexCodeGenerator()\n processOutput = (output: string) =>\n replaceBlankLinesWithPercent(output.trim())\n break\n case 'html':\n codeGenerator = new HtmlCodeGenerator()\n break\n }\n\n resume.content.basics.computed = {\n ...resume.content.basics.computed,\n summary: processOutput(\n codeGenerator.generate(\n summaryParser.parse(resume.content.basics.summary),\n typographyContext\n )\n ),\n }\n\n for (const section of [\n 'awards',\n 'education',\n 'projects',\n 'publications',\n 'references',\n 'volunteer',\n 'work',\n ]) {\n resume.content[section].forEach(\n (item: { summary: string }, index: number) => {\n const summary = codeGenerator.generate(\n summaryParser.parse(item.summary),\n typographyContext\n )\n if (summary) {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n summary: processOutput(summary),\n }\n } else {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n summary: '',\n }\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Applies a series of transformations to the main content of the resume.\n *\n * This includes escaping values, formatting lists (courses, keywords),\n * processing dates, translating terms, handling URLs, and parsing summaries.\n *\n * The order of internal transformations is important.\n *\n * @param resume - The resume object to transform.\n * @param layoutIndex - The index of the selected layout.\n * @param summaryParser - The parser for handling summary fields.\n * @param escapeFunc - The function to escape string values\n * @returns The transformed resume object.\n * @remarks Modifies the `resume.content` object and its children in place.\n */\nexport function transformResumeContent(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser,\n escapeFunc: (input: string) => string\n): Resume {\n return [\n // The order of the following functions matters, `transformResumeValues`\n // should be called first to process all leaf values properly with LaTeX\n // special characters escaped,\n normalizedResumeContent,\n (resume: Resume) => transformResumeValues(resume, escapeFunc),\n transformEducationCourses,\n transformEducationDegreeAreaAndScore,\n transformDate,\n transformEndDate,\n transformKeywords,\n transformLanguage,\n transformLocation,\n transformSkills,\n transformProfileLinks,\n transformSummary,\n transformSectionNames,\n ].reduce(\n (resume, tranformFunc) => tranformFunc(resume, layoutIndex, summaryParser),\n resume\n )\n}\n\n/**\n * Merges the provided resume layout and locale configuration with default\n * values, ensuring all necessary properties are set.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.layouts` and `resume.locale` in place.\n */\nexport function transformResumeLocaleWithDefaultValues(resume: Resume): Resume {\n if (resume.locale) {\n return resume\n }\n\n return {\n ...resume,\n locale: cloneDeep(DEFAULT_RESUME_LOCALE),\n }\n}\n\n/**\n * Ensures the resume has layouts configuration by applying defaults when absent.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n */\nexport function transformResumeLayoutsWithDefaultValues(\n resume: Resume\n): Resume {\n if (resume.layouts && resume.layouts.length > 0) {\n const normalizedLayouts = resume.layouts.map((layout) => {\n switch (layout.engine) {\n case 'markdown':\n return merge(cloneDeep(DEFAULT_MARKDOWN_LAYOUT), layout)\n case 'latex':\n return merge(cloneDeep(DEFAULT_LATEX_LAYOUT), layout)\n case 'html':\n return merge(cloneDeep(DEFAULT_HTML_LAYOUT), layout)\n default:\n return layout\n }\n })\n\n return {\n ...resume,\n layouts: normalizedLayouts,\n }\n }\n\n return {\n ...resume,\n layouts: cloneDeep(DEFAULT_RESUME_LAYOUTS),\n }\n}\n\n/**\n * Adjusts the resume's LaTeX settings, specifically the number style\n * (`Lining` or `OldStyle`), based on the selected locale language.\n *\n * Sets Lining for CJK languages, OldStyle otherwise, if not explicitly defined.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies LaTeX layouts' `advanced.fontspec` in place.\n */\nexport function transformResumeLayoutLaTeX(resume: Resume): Resume {\n if (!resume.layouts) {\n return resume\n }\n\n resume.layouts = resume.layouts.map((layout) => {\n // Only transform LaTeX layouts\n if (layout.engine !== 'latex') {\n return layout\n }\n\n // Skip if numbers is already explicitly set to a non-Auto value\n if (\n layout.advanced?.fontspec?.numbers !== undefined &&\n layout.advanced?.fontspec?.numbers !== 'Auto'\n ) {\n return layout\n }\n\n // Determine the number style based on locale\n const numbers =\n resume.locale?.language === 'zh-hans' ||\n resume.locale?.language === 'zh-hant-hk' ||\n resume.locale?.language === 'zh-hant-tw'\n ? 'Lining'\n : 'OldStyle'\n\n return {\n ...layout,\n advanced: {\n ...layout.advanced,\n fontspec: {\n ...layout.advanced?.fontspec,\n numbers,\n },\n },\n }\n })\n\n return resume\n}\n\n/**\n * Merges the provided resume layout configuration with default layout values,\n * ensuring all necessary layout properties are set.\n *\n * Also applies locale-based typography adjustments via\n * `transformResumeLayoutLaTeX`.\n *\n * @param resume - The resume object containing the layout to transform.\n * @returns The resume object with its layout transformed.\n * @remarks The `layout` property of the returned resume object is a new object\n * resulting from the merge. Modifies `resume.layout.typography` via helper.\n */\nexport function transformResumeLayout(resume: Resume): Resume {\n return [\n transformResumeLocaleWithDefaultValues,\n transformResumeLayoutsWithDefaultValues,\n transformResumeLayoutLaTeX,\n ].reduce((resume, transformFunc) => transformFunc(resume), resume)\n}\n\n/**\n * Applies all necessary transformations to a resume object in preparation for\n * rendering.\n *\n * This includes content processing, layout merging/adjustments, and environment\n * setup.\n *\n * The order of transformations is: content, layout, environment.\n *\n * @param resume - The original resume object.\n * @param layoutIndex - The index of the selected layout.\n * @param summaryParser - The parser instance for handling summary fields.\n * @param escapeFunc - The function to escape string values, i.e, `escapeLatex`\n * or `escapeHtml`\n * @returns A new, transformed resume object ready for rendering.\n * @remarks This function operates on and returns a deep clone of the original\n * resume.\n */\nexport function transformResume(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser,\n escapeFunc: (input: string) => string\n): Resume {\n return [transformResumeLayout, transformResumeContent].reduce(\n (resume, tranformFunc) =>\n tranformFunc(resume, layoutIndex, summaryParser, escapeFunc),\n cloneDeep(resume)\n )\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { OrderableSectionID, Resume } from '@/models'\nimport { DEFAULT_SECTIONS_ORDER } from '@/models'\nimport { joinNonEmptyString, mergeArrayWithOrder } from '@/utils'\n\n/**\n * Abstract class for rendering resumes to various format.\n *\n * The renderer will render the resume to different formats such as HTML,\n * Markdown, and LaTeX based on the selected layout.\n *\n * You should not use this class directly, instead, use the `getResumeRenderer`\n * function to get the appropriate renderer for the given resume layout.\n *\n * By default, the renderer will render the resume in the following order:\n *\n * 1. Core information (basics, location, profiles)\n * 2. Education and career (education, work)\n * 3. Languages and skills\n * 4. Paper works (awards, certificates, publications)\n * 5. Persons and projects (references, projects)\n * 6. Non-essential information (interests, volunteer)\n */\nabstract class Renderer {\n resume: Resume\n layoutIndex: number\n\n /**\n * Constructor for the Renderer class.\n *\n * @param resume - The resume to render.\n * @param layoutIndex - The index of the selected layout.\n */\n constructor(resume: Resume, layoutIndex: number) {\n this.resume = resume\n this.layoutIndex = layoutIndex\n }\n\n /**\n * Render the preamble of the TeX document.\n *\n * @returns {string} The preamble of the TeX document.\n */\n abstract renderPreamble(): string\n\n /**\n * Render the basics section of the resume.\n *\n * @returns {string} The rendered basics section\n */\n abstract renderBasics(): string\n\n /**\n * Render the summary section of the resume.\n *\n * This method handles rendering the summary text stored in\n * resume.content.basics.summary. The summary is rendered separately from\n * other basic information since it may need to appear in a different location\n * in the output document depending on the template.\n *\n * @returns {string} The rendered summary section\n */\n abstract renderSummary(): string\n\n /**\n * Render the location section of the resume.\n *\n * @returns {string} The rendered location section\n */\n abstract renderLocation(): string\n\n /**\n * Render the profiles section of the resume.\n *\n * @returns {string} The rendered profiles section\n */\n abstract renderProfiles(): string\n\n // education and career\n /**\n * Render the education section of the resume.\n *\n * @returns {string} The rendered education section\n */\n abstract renderEducation(): string\n\n /**\n * Render the work section of the resume.\n *\n * @returns {string} The rendered work section\n */\n abstract renderWork(): string\n\n // languages and skills\n /**\n * Render the languages section of the resume.\n *\n * @returns {string} The rendered languages section\n */\n abstract renderLanguages(): string\n\n /**\n * Render the skills section of the resume.\n *\n * @returns {string} The rendered skills section\n */\n abstract renderSkills(): string\n\n // paper works\n /**\n * Render the awards section of the resume.\n *\n * @returns {string} The rendered awards section\n */\n abstract renderAwards(): string\n\n /**\n * Render the certificates section of the resume.\n *\n * @returns {string} The rendered certificates section\n */\n abstract renderCertificates(): string\n\n /**\n * Render the publications section of the resume.\n *\n * @returns {string} The rendered publications section\n */\n abstract renderPublications(): string\n\n // persons and projects\n /**\n * Render the references section of the resume.\n *\n * @returns {string} The rendered references section\n */\n abstract renderReferences(): string\n\n /**\n * Render the projects section of the resume.\n *\n * @returns {string} The rendered projects section\n */\n abstract renderProjects(): string\n\n // non-essential information\n /**\n * Render the interests section of the resume.\n *\n * @returns {string} The rendered interests section\n */\n abstract renderInterests(): string\n\n /**\n * Render the volunteer section of the resume.\n *\n * @returns {string} The rendered volunteer section\n */\n abstract renderVolunteer(): string\n\n /**\n * Render the resume.\n *\n * @returns {string} The rendered resume\n */\n abstract render(): string\n\n /**\n * Render sections in the specified order.\n *\n * @returns {string} The rendered sections in the specified order\n */\n protected renderOrderedSections(): string {\n const customOrder = this.resume.layouts?.[this.layoutIndex]?.sections?.order\n const order = mergeArrayWithOrder(customOrder, DEFAULT_SECTIONS_ORDER)\n\n const sectionRenderers: Record<OrderableSectionID, () => string> = {\n basics: () => this.renderSummary(),\n education: () => this.renderEducation(),\n work: () => this.renderWork(),\n languages: () => this.renderLanguages(),\n skills: () => this.renderSkills(),\n awards: () => this.renderAwards(),\n certificates: () => this.renderCertificates(),\n publications: () => this.renderPublications(),\n references: () => this.renderReferences(),\n projects: () => this.renderProjects(),\n interests: () => this.renderInterests(),\n volunteer: () => this.renderVolunteer(),\n }\n\n const renderedSections = order\n .map((sectionId) => sectionRenderers[sectionId]())\n .filter((rendered) => rendered.trim() !== '')\n\n return joinNonEmptyString(renderedSections)\n }\n}\n\nexport { Renderer }\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n:root {\n --border-color: #d0d0d0;\n\n /* text colors */\n --text-color-primary: #000000;\n --text-color-secondary: #333333;\n\n /* spacing */\n --spacing-xss: 2px;\n --spacing-xs: 4px;\n --spacing-sm: 8px;\n --spacing-md: 12px;\n --spacing-lg: 16px;\n --spacing-xl: 24px;\n --spacing-xxl: 40px;\n --spacing-xxxl: 80px;\n\n /* font sizes */\n --font-size-xs: 0.8rem;\n --font-size-sm: 0.9rem;\n --font-size-md: 1rem;\n --font-size-lg: 1.1rem;\n --font-size-xl: 1.25rem;\n --font-size-xxl: 2.5rem;\n\n /* line heights */\n --line-height-base: 1.5;\n --line-height-tight: 1.375;\n\n /* layout */\n --page-max-width: 900px;\n}\n\nhtml {\n font-size: var(--text-font-size);\n}\n\nbody {\n /* font & text */\n color: var(--text-color-primary);\n font-family:\n -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu,\n Cantarell, sans-serif;\n /* this variable is defined by `typography.fontSize` in resume html layout */\n text-autospace: normal;\n\n /* layout */\n line-height: var(--line-height-base);\n max-width: var(--page-max-width);\n margin: 0 auto;\n padding: var(--spacing-xxxl) var(--spacing-xxl);\n}\n\n/* header */\n.resume-header {\n margin-bottom: var(--spacing-xxl);\n text-align: center;\n}\n\n.resume-name {\n font-size: var(--font-size-xxl);\n font-weight: 600;\n margin-bottom: var(--spacing-sm);\n}\n\n.resume-headline {\n font-size: var(--font-size-lg);\n margin-bottom: var(--spacing-md);\n}\n\n/* contact info */\n.resume-contact-info {\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n column-gap: var(--spacing-lg);\n row-gap: var(--spacing-xs);\n margin-top: var(--spacing-sm);\n}\n\n.resume-icon {\n margin-right: var(--spacing-sm);\n vertical-align: middle;\n}\n\n/* links: modern typographic style */\na {\n color: var(--text-color-primary);\n text-decoration: underline;\n text-decoration-color: var(--border-color);\n text-underline-offset: 3px;\n text-decoration-thickness: 1px;\n text-decoration-skip-ink: auto;\n transition: text-decoration-color 0.2s;\n}\n\na:hover {\n text-decoration-color: var(--text-color-primary);\n}\n\n/* sections */\n.resume-section {\n margin-bottom: var(--spacing-xl);\n}\n\n.resume-section-title {\n font-size: var(--font-size-xl);\n font-weight: 500;\n margin-bottom: var(--spacing-md);\n border-bottom: 1px solid var(--border-color);\n padding-bottom: var(--spacing-xs);\n}\n\n/* entries */\n.resume-entry {\n margin-bottom: var(--spacing-lg);\n}\n\n.resume-entry:last-child {\n margin-bottom: 0;\n}\n\n.resume-entry-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: var(--spacing-xs);\n}\n\n.resume-entry-title {\n font-weight: 500;\n margin-bottom: var(--spacing-xss);\n}\n\n.resume-entry-summary p,\n.resume-summary-content p {\n margin-bottom: var(--spacing-xs);\n}\n\n/* lists */\n.resume-entry-summary ul,\n.resume-entry-summary ol,\n.resume-summary-content ul,\n.resume-summary-content ol {\n padding-left: var(--spacing-lg);\n list-style-type: circle;\n}\n\n.resume-entry-summary li,\n.resume-summary-content li {\n line-height: var(--line-height-tight);\n}\n\n/* labeled lists (courses, keywords, etc.) */\n.resume-labeled-list span {\n font-weight: 500;\n}\n\n/* skills grid */\n.resume-skill-item,\n.resume-language-item {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n margin-bottom: var(--spacing-xs);\n}\n\n.resume-skill-name,\n.resume-language-name {\n font-weight: 500;\n}\n\n.resume-skill-level,\n.resume-language-fluency {\n font-weight: 400;\n}\n\n/* mobile */\n@media (max-width: 768px) {\n body {\n padding: var(--spacing-xl);\n }\n\n .resume-header {\n margin-bottom: var(--spacing-xl);\n }\n\n .resume-contact-info {\n flex-direction: column;\n align-items: center;\n }\n\n .resume-entry-header {\n flex-wrap: wrap;\n }\n\n .resume-skill-item,\n .resume-language-item {\n flex-direction: column;\n align-items: flex-start;\n }\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* Modified from: https://www.joshwcomeau.com/css/custom-css-reset/ */\n\n/* 1. Use a more-intuitive box-sizing model */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/* 2. Remove default margin */\n*:not(dialog) {\n margin: 0;\n}\n\nbody {\n /* 3. Improve text rendering */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport beautify from 'js-beautify'\n\nimport type { Parser } from '@/compiler'\nimport { MarkdownParser } from '@/compiler'\nimport type { HtmlLayout, Resume } from '@/models'\nimport { DEFAULT_RESUME_LOCALE } from '@/models'\nimport { transformResume } from '@/preprocess'\nimport { getTemplateTranslations } from '@/translations'\nimport {\n escapeHtml,\n isEmptyValue,\n joinNonEmptyString,\n showIfNotEmpty,\n} from '@/utils'\nimport { Renderer } from '../base'\nimport calm from './styles/calm.css'\nimport reset from './styles/reset.css'\n\n/**\n * HTML renderer for generating HTML5 documents from resume data.\n */\nexport class HtmlRenderer extends Renderer {\n /**\n * Constructor for the HtmlRenderer class.\n *\n * @param resume - The resume object\n * @param layoutIndex - The index of the selected layout to use.\n * @param summaryParser - The summary parser used to parse summary field in\n * various sections.\n */\n constructor(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser = new MarkdownParser()\n ) {\n super(\n transformResume(resume, layoutIndex, summaryParser, escapeHtml),\n layoutIndex\n )\n }\n\n /**\n * Get the CSS styles for the HTML document.\n *\n * @returns {string} The CSS styles\n */\n private getStyles(): string {\n const layout = this.resume.layouts?.[this.layoutIndex] as HtmlLayout\n const fontSize = layout?.typography?.fontSize || '16px' // default to 16px\n const trimCss = (css: string) => css.replace(/^\\/\\*[\\s\\S]*?\\*\\//, '').trim()\n\n return `<style>\n:root {\n --text-font-size: ${fontSize};\n}\n${trimCss(reset)}\n${trimCss(calm)}\n</style>`\n }\n\n /**\n * Render the preamble of the HTML document.\n *\n * @returns {string} The preamble of the HTML document.\n */\n renderPreamble(): string {\n const name = this.resume.content?.basics?.name\n const title = name ? `${name} Resume` : 'YAMLResume'\n\n return `<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<meta name=\"generator\" content=\"YAMLResume (https://yamlresume.dev)\">\n<title>${title}</title>\n${this.getStyles()}\n</head>\n`\n }\n\n /**\n * Render the basics section of the resume.\n *\n * @returns {string} The rendered basics section\n */\n renderBasics(): string {\n const {\n content: {\n basics: { name, headline, email, phone, url },\n },\n } = this.resume\n\n const contactItems = joinNonEmptyString(\n [\n showIfNotEmpty(\n email,\n joinNonEmptyString(\n [\n '<span class=\"resume-contact-item\">',\n `<span class=\"resume-icon\">📧</span>`,\n `<a href=\"mailto:${email}\" class=\"resume-contact-link\">`,\n email,\n '</a>',\n '</span>',\n ],\n ''\n )\n ),\n showIfNotEmpty(\n phone,\n joinNonEmptyString(\n [\n '<span class=\"resume-contact-item\">',\n `<span class=\"resume-icon\">📞</span>${phone}</span>`,\n ],\n ''\n )\n ),\n showIfNotEmpty(\n url,\n joinNonEmptyString(\n [\n '<span class=\"resume-contact-item\">',\n `<span class=\"resume-icon\">🔗</span>`,\n `<a href=\"${url}\" class=\"resume-contact-link\">${url}</a>`,\n '</span>',\n ],\n ''\n )\n ),\n ],\n '\\n'\n )\n\n return joinNonEmptyString(\n [\n showIfNotEmpty(name, `<h1 class=\"resume-name\">${name}</h1>`),\n showIfNotEmpty(headline, `<p class=\"resume-headline\">${headline}</p>`),\n showIfNotEmpty(\n contactItems,\n `<div class=\"resume-contact-info\">\n ${contactItems}\n </div>`\n ),\n ],\n '\\n'\n )\n }\n\n /**\n * Render the summary section of the resume.\n *\n * @returns {string} The rendered summary section\n */\n renderSummary(): string {\n const {\n content: {\n basics: {\n computed: { summary },\n },\n computed: { sectionNames },\n },\n } = this.resume\n\n if (isEmptyValue(summary)) {\n return ''\n }\n\n return `<section class=\"resume-section\" data-section=\"summary\">\n <h2 class=\"resume-section-title\">${sectionNames.basics}</h2>\n <div class=\"resume-section-content\">\n <div class=\"resume-summary-content\">${summary}</div>\n </div>\n </section>`\n }\n\n /**\n * Render the location section of the resume.\n *\n * Note: Location is handled in renderBasics() for HTML output.\n *\n * @returns {string} Empty string as location is included in basics\n */\n renderLocation(): string {\n const {\n content: {\n location: {\n computed: { fullAddress },\n },\n },\n } = this.resume\n\n return showIfNotEmpty(\n fullAddress,\n `<div class=\"resume-contact-info resume-location-info\">\n <span class=\"resume-contact-item\"><span class=\"resume-icon\">📍</span>${\n fullAddress\n }</span>\n </div>`\n )\n }\n\n /**\n * Render the profiles section of the resume.\n *\n * Note: Profiles are handled in renderBasics() for HTML output.\n *\n * @returns {string} Empty string as profiles are included in basics\n */\n renderProfiles(): string {\n const {\n content: { profiles },\n } = this.resume\n\n if (isEmptyValue(profiles)) return ''\n\n const profileItems = profiles\n .map(({ network, url, username }) => {\n if (isEmptyValue(url)) {\n return joinNonEmptyString(\n [\n '<span class=\"resume-contact-item\">',\n `${network}: @${username}`,\n '</span>',\n ],\n ''\n )\n }\n\n return joinNonEmptyString(\n [\n '<span class=\"resume-contact-item\">',\n `${network}: `,\n `<a href=\"${url}\" class=\"resume-contact-link\">${\n username || url\n }</a>`,\n '</span>',\n ],\n ''\n )\n })\n .filter((item) => !isEmptyValue(item))\n\n return `<div class=\"resume-contact-info resume-profiles-info\">\n ${profileItems.join('\\n')}\n </div>`\n }\n\n /**\n * Render the education section of the resume.\n *\n * @returns {string} The rendered education section\n */\n renderEducation(): string {\n const {\n content: {\n education,\n computed: { sectionNames },\n },\n locale,\n } = this.resume\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n if (isEmptyValue(education)) {\n return ''\n }\n\n const educationEntries = education.map(\n ({\n url,\n institution,\n computed: { dateRange, summary, courses, degreeAreaAndScore },\n }) => {\n const institutionTitle = url\n ? `<a href=\"${url}\">${institution}</a>`\n : institution\n\n return joinNonEmptyString(\n [\n '<div class=\"resume-entry\">',\n '<div class=\"resume-entry-header\">',\n '<div>',\n showIfNotEmpty(\n institution,\n `<div class=\"resume-entry-title\">${institutionTitle}</div>`\n ),\n showIfNotEmpty(\n degreeAreaAndScore,\n `<div class=\"resume-entry-organization\">${degreeAreaAndScore}</div>`\n ),\n '</div>',\n showIfNotEmpty(\n dateRange,\n `<div class=\"resume-entry-date\">${dateRange}</div>`\n ),\n '</div>',\n showIfNotEmpty(\n summary,\n `<div class=\"resume-entry-summary\">${summary}</div>`\n ),\n showIfNotEmpty(\n courses,\n `<div class=\"resume-labeled-list\"><span>${\n terms.courses\n }</span>${colon}${courses}</div>`\n ),\n '</div>',\n ],\n ''\n )\n }\n )\n\n return `<section class=\"resume-section\" data-section=\"education\">\n <h2 class=\"resume-section-title\">${sectionNames.education}</h2>\n <div class=\"resume-section-content\">\n ${educationEntries.join('\\n')}\n </div>\n </section>`\n }\n\n /**\n * Render the work section of the resume.\n *\n * @returns {string} The rendered work section\n */\n renderWork(): string {\n const {\n content: {\n work,\n computed: { sectionNames },\n },\n locale,\n } = this.resume\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n if (isEmptyValue(work)) {\n return ''\n }\n\n const workEntries = work.map(\n ({\n name,\n position,\n url,\n computed: { dateRange, summary, keywords } = {},\n }) => {\n const organizationTitle = url ? `<a href=\"${url}\">${name}</a>` : name\n\n return joinNonEmptyString(\n [\n '<div class=\"resume-entry\">',\n '<div class=\"resume-entry-header\">',\n '<div>',\n showIfNotEmpty(\n name,\n `<div class=\"resume-entry-title\">${organizationTitle}</div>`\n ),\n showIfNotEmpty(\n position,\n `<div class=\"resume-entry-organization\">${position}</div>`\n ),\n '</div>',\n showIfNotEmpty(\n dateRange,\n `<div class=\"resume-entry-date\">${dateRange}</div>`\n ),\n '</div>',\n showIfNotEmpty(\n summary,\n `<div class=\"resume-entry-summary\">${summary}</div>`\n ),\n showIfNotEmpty(\n keywords,\n `<div class=\"resume-labeled-list\"><span>${\n terms.keywords\n }</span>${colon}${keywords}</div>`\n ),\n '</div>',\n ],\n ''\n )\n }\n )\n\n return `<section class=\"resume-section\" data-section=\"work\">\n <h2 class=\"resume-section-title\">${sectionNames.work}</h2>\n <div class=\"resume-section-content\">\n ${workEntries.join('\\n')}\n </div>\n </section>`\n }\n\n /**\n * Render the languages section of the resume.\n *\n * @returns {string} The rendered languages section\n */\n renderLanguages(): string {\n const {\n content: {\n languages,\n computed: { sectionNames },\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(languages)) {\n return ''\n }\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n const languageItems = languages.map(\n ({ computed: { language, fluency, keywords } }) =>\n joinNonEmptyString(\n [\n '<div class=\"resume-language-item\">',\n `<div class=\"resume-language-name\">${language}${showIfNotEmpty(\n fluency,\n `<span class=\"resume-language-fluency\">${colon}${fluency}</span>`\n )}</div>`,\n showIfNotEmpty(\n keywords,\n `<div><div class=\"resume-labeled-list\"><span>${\n terms.keywords\n }</span>${colon}${keywords}</div></div>`\n ),\n '</div>',\n ],\n '\\n'\n )\n )\n\n return `<section class=\"resume-section\" data-section=\"languages\">\n <h2 class=\"resume-section-title\">${sectionNames.languages}</h2>\n <div class=\"resume-section-content\">\n <div class=\"resume-languages-list\">\n ${languageItems.join('\\n')}\n </div>\n </div>\n </section>`\n }\n\n /**\n * Render the skills section of the resume.\n *\n * @returns {string} The rendered skills section\n */\n renderSkills(): string {\n const {\n content: {\n skills,\n computed: { sectionNames },\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(skills)) {\n return ''\n }\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n const skillItems = skills.map(({ name, computed: { level, keywords } }) =>\n joinNonEmptyString(\n [\n '<div class=\"resume-skill-item\">',\n `<div class=\"resume-skill-name\">${name}${showIfNotEmpty(\n level,\n `<span class=\"resume-skill-level\">${colon}${level}</span>`\n )}</div>`,\n showIfNotEmpty(\n keywords,\n joinNonEmptyString(\n [\n '<div><div class=\"resume-labeled-list\"><span>',\n `${terms.keywords}</span>${colon}${keywords}</div></div>`,\n ],\n ''\n )\n ),\n '</div>',\n ],\n '\\n'\n )\n )\n\n return `<section class=\"resume-section\" data-section=\"skills\">\n <h2 class=\"resume-section-title\">${sectionNames.skills}</h2>\n <div class=\"resume-section-content\">\n ${skillItems.join('\\n')}\n </div>\n </section>`\n }\n\n /**\n * Render the awards section of the resume.\n *\n * @returns {string} The rendered awards section\n */\n renderAwards(): string {\n const {\n content: {\n awards,\n computed: { sectionNames },\n },\n } = this.resume\n\n if (isEmptyValue(awards)) {\n return ''\n }\n\n const awardEntries = awards.map(\n ({ awarder, title, computed: { date, summary } }) => {\n return joinNonEmptyString(\n [\n '<div class=\"resume-entry\">',\n '<div class=\"resume-entry-header\">',\n '<div>',\n showIfNotEmpty(\n title,\n `<div class=\"resume-entry-title\">${title}</div>`\n ),\n showIfNotEmpty(\n awarder,\n `<div class=\"resume-entry-organization\">${awarder}</div>`\n ),\n '</div>',\n showIfNotEmpty(\n date,\n `<div class=\"resume-entry-date\">${date}</div>`\n ),\n '</div>',\n showIfNotEmpty(\n summary,\n `<div class=\"resume-entry-summary\">${summary}</div>`\n ),\n '</div>',\n ],\n ''\n )\n }\n )\n\n return `<section class=\"resume-section\" data-section=\"awards\">\n <h2 class=\"resume-section-title\">${sectionNames.awards}</h2>\n <div class=\"resume-section-content\">\n ${awardEntries.join('\\n')}\n </div>\n </section>`\n }\n\n /**\n * Render the certificates section of the resume.\n *\n * @returns {string} The rendered certificates section\n */\n renderCertificates(): string {\n const {\n content: {\n certificates,\n computed: { sectionNames },\n },\n } = this.resume\n\n if (isEmptyValue(certificates)) {\n return ''\n }\n\n const certificateEntries = certificates.map(\n ({ name, url, issuer, computed: { date } }) => {\n return joinNonEmptyString(\n [\n '<div class=\"resume-entry\">',\n '<div class=\"resume-entry-header\">',\n '<div>',\n showIfNotEmpty(\n name,\n `<div class=\"resume-entry-title\">${\n url ? `<a href=\"${url}\">${name}</a>` : name\n }</div>`\n ),\n showIfNotEmpty(\n issuer,\n `<div class=\"resume-entry-organization\">${issuer}</div>`\n ),\n '</div>',\n showIfNotEmpty(\n date,\n `<div class=\"resume-entry-date\">${date}</div>`\n ),\n '</div>',\n '</div>',\n ],\n ''\n )\n }\n )\n\n return `<section class=\"resume-section\" data-section=\"certificates\">\n <h2 class=\"resume-section-title\">${sectionNames.certificates}</h2>\n <div class=\"resume-section-content\">\n ${certificateEntries.join('\\n')}\n </div>\n </section>`\n }\n\n /**\n * Render the publications section of the resume.\n *\n * @returns {string} The rendered publications section\n */\n renderPublications(): string {\n const {\n content: {\n publications,\n computed: { sectionNames },\n },\n } = this.resume\n\n if (isEmptyValue(publications)) {\n return ''\n }\n\n const publicationEntries = publications.map(\n ({ name, publisher, url, computed: { releaseDate, summary } = {} }) => {\n const publicationTitle = url ? `<a href=\"${url}\">${name}</a>` : name\n\n return joinNonEmptyString(\n [\n '<div class=\"resume-entry\">',\n '<div class=\"resume-entry-header\">',\n '<div>',\n showIfNotEmpty(\n name,\n `<div class=\"resume-entry-title\">${publicationTitle}</div>`\n ),\n showIfNotEmpty(\n publisher,\n `<div class=\"resume-entry-organization\">${publisher}</div>`\n ),\n '</div>',\n showIfNotEmpty(\n releaseDate,\n `<div class=\"resume-entry-date\">${releaseDate}</div>`\n ),\n '</div>',\n showIfNotEmpty(\n summary,\n `<div class=\"resume-entry-summary\">${summary}</div>`\n ),\n '</div>',\n ],\n ''\n )\n }\n )\n\n return `<section class=\"resume-section\" data-section=\"publications\">\n <h2 class=\"resume-section-title\">${sectionNames.publications}</h2>\n <div class=\"resume-section-content\">\n ${publicationEntries.join('\\n')}\n </div>\n </section>`\n }\n\n /**\n * Render the references section of the resume.\n *\n * @returns {string} The rendered references section\n */\n renderReferences(): string {\n const {\n content: {\n references,\n computed: { sectionNames },\n },\n } = this.resume\n\n if (isEmptyValue(references)) {\n return ''\n }\n\n const referenceEntries = references.map(\n ({ name, relationship, phone, email, computed: { summary } = {} }) => {\n const referenceTitle = email\n ? `<a href=\"mailto:${email}\">${name}</a>`\n : name\n\n return joinNonEmptyString(\n [\n '<div class=\"resume-entry\">',\n '<div class=\"resume-entry-header\">',\n '<div>',\n showIfNotEmpty(\n name,\n `<div class=\"resume-entry-title\">${referenceTitle}</div>`\n ),\n showIfNotEmpty(\n relationship,\n `<div class=\"resume-entry-organization\">${relationship}</div>`\n ),\n '</div>',\n showIfNotEmpty(phone, `<div>${phone}</div>`),\n '</div>',\n showIfNotEmpty(\n summary,\n `<div class=\"resume-entry-summary\">${summary}</div>`\n ),\n '</div>',\n ],\n ''\n )\n }\n )\n\n return `<section class=\"resume-section\" data-section=\"references\">\n <h2 class=\"resume-section-title\">${sectionNames.references}</h2>\n <div class=\"resume-section-content\">\n ${referenceEntries.join('\\n')}\n </div>\n </section>`\n }\n\n /**\n * Render the projects section of the resume.\n *\n * @returns {string} The rendered projects section\n */\n renderProjects(): string {\n const {\n content: {\n projects,\n computed: { sectionNames },\n },\n locale,\n } = this.resume\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n if (isEmptyValue(projects)) {\n return ''\n }\n\n const projectEntries = projects.map(\n ({\n name,\n description,\n url,\n computed: { dateRange, summary, keywords } = {},\n }) => {\n const projectTitle = url ? `<a href=\"${url}\">${name}</a>` : name\n\n return joinNonEmptyString(\n [\n '<div class=\"resume-entry\">',\n '<div class=\"resume-entry-header\">',\n '<div>',\n showIfNotEmpty(\n name,\n `<div class=\"resume-entry-title\">${projectTitle}</div>`\n ),\n showIfNotEmpty(\n description,\n `<div class=\"resume-entry-description\">${description}</div>`\n ),\n '</div>',\n showIfNotEmpty(\n dateRange,\n `<div class=\"resume-entry-date\">${dateRange}</div>`\n ),\n '</div>',\n showIfNotEmpty(\n summary,\n `<div class=\"resume-entry-summary\">${summary}</div>`\n ),\n showIfNotEmpty(\n keywords,\n `<div class=\"resume-labeled-list\"><span>${\n terms.keywords\n }</span>${colon} ${keywords}</div>`\n ),\n '</div>',\n ],\n ''\n )\n }\n )\n\n return `<section class=\"resume-section\" data-section=\"projects\">\n <h2 class=\"resume-section-title\">${sectionNames.projects}</h2>\n <div class=\"resume-section-content\">\n ${projectEntries.join('\\n')}\n </div>\n </section>`\n }\n\n /**\n * Render the interests section of the resume.\n *\n * @returns {string} The rendered interests section\n */\n renderInterests(): string {\n const {\n content: {\n interests,\n computed: { sectionNames },\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(interests)) {\n return ''\n }\n\n const {\n punctuations: { colon },\n } = getTemplateTranslations(locale?.language)\n\n const interestItems = interests.map(({ name, computed: { keywords } }) =>\n joinNonEmptyString(\n [\n '<div class=\"resume-interest-item\">',\n `<span class=\"resume-interest-name\">${name}</span>`,\n showIfNotEmpty(keywords, `${colon}${keywords}`),\n '</div>',\n ],\n ''\n )\n )\n\n return `<section class=\"resume-section\" data-section=\"interests\">\n <h2 class=\"resume-section-title\">${sectionNames.interests}</h2>\n <div class=\"resume-section-content\">\n ${interestItems.join('\\n')}\n </div>\n </section>`\n }\n\n /**\n * Render the volunteer section of the resume.\n *\n * @returns {string} The rendered volunteer section\n */\n renderVolunteer(): string {\n const {\n content: {\n volunteer,\n computed: { sectionNames },\n },\n } = this.resume\n\n if (isEmptyValue(volunteer)) {\n return ''\n }\n\n const volunteerEntries = volunteer.map(\n ({\n organization,\n position,\n url,\n computed: { dateRange, summary } = {},\n }) => {\n const organizationTitle = url\n ? `<a href=\"${url}\">${organization}</a>`\n : organization\n\n return joinNonEmptyString(\n [\n '<div class=\"resume-entry\">',\n '<div class=\"resume-entry-header\">',\n '<div>',\n showIfNotEmpty(\n organization,\n `<div class=\"resume-entry-title\">${organizationTitle}</div>`\n ),\n showIfNotEmpty(\n position,\n `<div class=\"resume-entry-organization\">${position}</div>`\n ),\n '</div>',\n showIfNotEmpty(\n dateRange,\n `<div class=\"resume-entry-date\">${dateRange}</div>`\n ),\n '</div>',\n showIfNotEmpty(\n summary,\n `<div class=\"resume-entry-summary\">${summary}</div>`\n ),\n '</div>',\n ],\n ''\n )\n }\n )\n\n return `<section class=\"resume-section\" data-section=\"volunteer\">\n <h2 class=\"resume-section-title\">${sectionNames.volunteer}</h2>\n <div class=\"resume-section-content\">\n ${volunteerEntries.join('\\n')}\n </div>\n </section>`\n }\n\n /**\n * Render the complete HTML resume.\n *\n * @returns {string} The rendered HTML resume\n */\n render(): string {\n const lang = this.resume.locale?.language || DEFAULT_RESUME_LOCALE.language\n\n return beautify.html(\n `<!DOCTYPE html>\n<html lang=\"${lang}\">\n ${this.renderPreamble()}\n <body>\n <header class=\"resume-header\">\n ${this.renderBasics()}\n ${this.renderLocation()}\n ${this.renderProfiles()}\n </header>\n ${this.renderOrderedSections()}\n </body>\n</html>\n`,\n {\n indent_size: 2,\n }\n )\n }\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * The options for the document class.\n *\n * For now we only support `moderncv` document class.\n */\nexport const DOCUMENT_CLASS_OPTIONS = ['moderncv'] as const\n\n/** The type of document class. */\nexport type DocumentClass = (typeof DOCUMENT_CLASS_OPTIONS)[number]\n\n/**\n * The style options for the moderncv document class.\n *\n * These styles control the visual appearance and layout of the CV. There're\n * actually 5 styles in moderncv package, but only 3 are supported in this\n * project, `fancy` and `oldstyle` is pretty buggy and not working well.\n *\n * - `banking` - a modern, professional style with a banking/financial aesthetic\n * - `classic` - a traditional CV style with a clean, formal layout\n * - `casual` - a more relaxed style while maintaining professionalism\n *\n * @see {@link https://github.com/yamlresume/community/issues/117}\n */\nexport const MODERNCV_STYLE_OPTIONS = ['banking', 'classic', 'casual'] as const\n\n/** The type of moderncv style. */\nexport type ModerncvStyle = (typeof MODERNCV_STYLE_OPTIONS)[number]\n\n/**\n * Normalize a unit string\n *\n * Convert unit string with format of \"<number> <unit>\" to \"<number><unit>\" by\n * removing spaces, for example: \"10 mm\" -> \"10mm\"\n *\n * @param value The unit string to normalize\n * @returns The normalized string with spaces removed between number and unit\n */\nexport function normalizeUnit(value: string): string {\n return value.replace(/\\s+/g, '')\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Parser } from '@/compiler'\nimport { MarkdownParser } from '@/compiler'\nimport type { LatexLayout, Resume } from '@/models'\nimport { transformResume } from '@/preprocess'\nimport { getTemplateTranslations } from '@/translations'\nimport {\n escapeLatex,\n isEmptyValue,\n joinNonEmptyString,\n showIf,\n showIfNotEmpty,\n} from '@/utils'\nimport { Renderer } from '../base'\nimport { type ModerncvStyle, normalizeUnit } from './preamble'\n\n/**\n * Base class for moderncv renderers.\n */\nclass ModerncvBase extends Renderer {\n style: ModerncvStyle\n\n /**\n * Constructor for the ModerncvBase class.\n *\n * @param resume - The resume object\n * @param style - The moderncv style\n * @param layoutIndex - The index of the selected layout to use.\n * @param summaryParser - The summary parser used to parse summary field in\n * various sections.\n */\n constructor(\n resume: Resume,\n style: ModerncvStyle,\n layoutIndex: number,\n summaryParser: Parser\n ) {\n super(\n transformResume(resume, layoutIndex, summaryParser, escapeLatex),\n layoutIndex\n )\n this.style = style\n }\n\n /**\n * Check if the resume is a CJK resume.\n */\n private isCJKResume(): boolean {\n return ['zh-hans', 'zh-hant-hk', 'zh-hant-tw'].includes(\n this.resume.locale?.language\n )\n }\n\n /**\n * Render the document class configuration.\n */\n private renderDocumentClassConfig(): string {\n const layout = this.resume.layouts?.[this.layoutIndex]\n\n const fontSize = (layout as LatexLayout)?.typography?.fontSize\n\n return `\\\\documentclass[a4paper, serif, ${normalizeUnit(\n fontSize\n )}]{moderncv}`\n }\n\n /**\n * Override the moderncv commands for CJK resumes\n */\n private renderModerncvOverride(): string {\n const {\n punctuations: { colon },\n } = getTemplateTranslations(this.resume.locale?.language)\n\n if (!this.isCJKResume()) {\n return ''\n }\n\n switch (this.style) {\n case 'banking':\n return `% renew moderncv command to adapt for CJK colon\n\\\\renewcommand*{\\\\cvitem}[3][.25em]{%\n \\\\ifstrempty{#2}{}{\\\\hintstyle{#2}${colon}}{#3}%\n \\\\par\\\\addvspace{#1}}\n\n\\\\renewcommand*{\\\\cvitemwithcomment}[4][.25em]{%\n \\\\savebox{\\\\cvitemwithcommentmainbox}{\\\\ifstrempty{#2}{}{\\\\hintstyle{#2}${colon}}#3}%\n \\\\setlength{\\\\cvitemwithcommentmainlength}{\\\\widthof{\\\\usebox{\\\\cvitemwithcommentmainbox}}}%\n \\\\setlength{\\\\cvitemwithcommentcommentlength}{\\\\maincolumnwidth-\\\\separatorcolumnwidth-\\\\cvitemwithcommentmainlength}%\n \\\\begin{minipage}[t]{\\\\cvitemwithcommentmainlength}\\\\usebox{\\\\cvitemwithcommentmainbox}\\\\end{minipage}%\n \\\\hfill% fill of \\\\separatorcolumnwidth\n \\\\begin{minipage}[t]{\\\\cvitemwithcommentcommentlength}\\\\raggedleft\\\\small\\\\itshape#4\\\\end{minipage}%\n \\\\par\\\\addvspace{#1}}`\n\n case 'casual':\n case 'classic':\n return ''\n }\n }\n\n /**\n * Render the moderncv configuration.\n */\n private renderModerncvConfig(): string {\n return joinNonEmptyString([\n `%% moderncv\n% style and color\n\\\\moderncvstyle{${this.style}}\n\\\\moderncvcolor{black}\n\n% needed by moderncv for showing icons\n\\\\usepackage{fontawesome5}`,\n this.renderModerncvOverride(),\n ])\n }\n\n /**\n * Render the layout configuration.\n */\n private renderLayoutConfig(): string {\n const layout = this.resume.layouts?.[this.layoutIndex]\n\n const page = (layout as LatexLayout)?.page\n\n const margins = page?.margins\n const showPageNumbers = page?.showPageNumbers\n\n const t = normalizeUnit(margins?.top)\n const b = normalizeUnit(margins?.bottom)\n const l = normalizeUnit(margins?.left)\n const r = normalizeUnit(margins?.right)\n\n return joinNonEmptyString(\n [\n `%% page layout/margins\n\\\\usepackage[top=${t}, bottom=${b}, left=${l}, right=${r}]{geometry}`,\n showIf(!showPageNumbers, '\\\\nopagenumbers{}'),\n ],\n '\\n'\n )\n }\n\n /**\n * Render the LaTeX packages for CJK support\n */\n private renderCTeXConfig(): string {\n return `%% CTeX\n% CJK support, used to show CJK characters in the resume\n%\n% - fontset=none: disable builtin fontset but instead set the CJK font manually\n% - heading=false: disable ctex heading\n% - punct=kaiming: use kaiming punctuations styles for CJK\n% - scheme=plain: use plain scheme, do not override \\`\\\\normalsize\\` font size\n% - space=auto: space settings for CJK characters\n%\n% ref:\n% - http://ctan.mirrorcatalogs.com/language/chinese/ctex/ctex.pdf\n\\\\usepackage[UTF8, heading=false, punct=kaiming, scheme=plain, space=auto]{ctex}\n\n\\\\IfFontExistsTF{Noto Serif CJK SC}{\n \\\\setCJKmainfont{Noto Serif CJK SC}\n}{}\n\\\\IfFontExistsTF{Noto Sans CJK SC}{\n \\\\setCJKsansfont{Noto Sans CJK SC}\n}{}`\n }\n\n /**\n * Render the LaTeX packages for Spanish support\n */\n private renderBabelConfig(): string {\n switch (this.resume.locale?.language) {\n case 'es':\n return `%% Babel config for Spanish language\n% \\`\\\\usepackage[spanish]{babel}\\` has some conflicting issues with moderncv\n% so we have to use enable the following options to make it work\n%\n% ref:\n% - https://tex.stackexchange.com/a/140161/36007\n\\\\usepackage[spanish,es-lcroman]{babel}`\n case 'fr':\n return `%% Babel config for French language\n% ref:\n% - https://latex3.github.io/babel/guides/locale-french.html\n\\\\usepackage[french]{babel}`\n case 'no':\n return `%% Babel config for Norwegian language\n% ref:\n% - https://latex3.github.io/babel/guides/locale-norwegian.html\n\\\\usepackage[norsk]{babel}`\n default:\n return ''\n }\n }\n\n /**\n * Render the LaTeX packages for fontspec support\n */\n private renderFontspecConfig(): string {\n const layout = this.resume.layouts?.[this.layoutIndex]\n\n const numbers = (layout as LatexLayout)?.advanced?.fontspec?.numbers\n\n const linuxLibertineFont = 'Linux Libertine'\n const linuxLibertineOFont = 'Linux Libertine O'\n\n return `%% fontspec\n\\\\usepackage{fontspec}\n\n\\\\IfFontExistsTF{${linuxLibertineFont}}{\n \\\\setmainfont[${joinNonEmptyString(\n [\n 'Ligatures={TeX, Common}',\n `Numbers=${numbers}`,\n showIf(this.isCJKResume(), `ItalicFont=${linuxLibertineFont}`),\n ],\n ', '\n )}]{${linuxLibertineFont}}\n}{}\n\\\\IfFontExistsTF{${linuxLibertineOFont}}{\n \\\\setmainfont[${joinNonEmptyString(\n [\n 'Ligatures={TeX, Common}',\n `Numbers=${numbers}`,\n showIf(this.isCJKResume(), `ItalicFont=${linuxLibertineOFont}`),\n ],\n ', '\n )}]{${linuxLibertineOFont}}\n}{}`\n }\n\n /**\n * Render the preamble for the resume.\n *\n * @returns The LaTeX code for the preamble\n */\n renderPreamble(): string {\n if (this.resume.layouts?.[this.layoutIndex]?.engine !== 'latex') {\n return ''\n }\n\n return joinNonEmptyString([\n // document class\n this.renderDocumentClassConfig(),\n this.renderModerncvConfig(),\n\n // layout\n this.renderLayoutConfig(),\n\n // language specific\n this.renderBabelConfig(),\n\n // fontspec\n // note that loading order of fontspec and babel packages matters here\n // babel package should be loaded before fontspec package, otherwise\n // Spanish resumes cannot render correct font styles in my testing,\n // reason still unknown though\n this.renderFontspecConfig(),\n\n // CTeX for CJK\n // CTeX needs to load after fontspec because we use `\\IfFontExistsTF` to\n // set the CJK font manually if the required Google Noto font exists\n this.renderCTeXConfig(),\n ])\n }\n\n /**\n * Render the basics section of the resume.\n *\n * @returns The LaTeX code for the basics section\n */\n renderBasics(): string {\n const {\n content: {\n basics: { name, headline, phone, email },\n },\n } = this.resume\n\n return joinNonEmptyString(\n [\n // note that we have to show `\\\\name{}{}` here no matter whether name is\n // empty or not, moderncv requires this otherwise if there is no\n // `\\\\name{}{}``, moderncv will throw an error.\n `\\\\name{${name}}{}`,\n showIfNotEmpty(headline, `\\\\title{${headline}}`),\n showIfNotEmpty(phone, `\\\\phone[mobile]{${phone}}`),\n showIfNotEmpty(email, `\\\\email{${email}}`),\n ],\n '\\n'\n )\n }\n\n /**\n * Render the location section of the resume.\n *\n * @returns The LaTeX code for the location section\n */\n renderLocation(): string {\n const {\n content: {\n location: {\n computed: { fullAddress },\n },\n },\n } = this.resume\n\n return showIfNotEmpty(fullAddress, `\\\\address{${fullAddress}}{}{}`)\n }\n\n /**\n * Render the profiles section of the resume.\n *\n * @returns The LaTeX code for the profiles section\n */\n renderProfiles(): string {\n const {\n content: {\n computed: { urls },\n },\n } = this.resume\n\n return showIfNotEmpty(urls, `\\\\extrainfo{${urls}}`)\n }\n\n /**\n * Render the summary section of the resume.\n *\n * @returns The LaTeX code for the summary section\n */\n renderSummary(): string {\n const {\n content: {\n basics: {\n computed: { summary },\n },\n computed: { sectionNames },\n },\n } = this.resume\n\n return `${showIfNotEmpty(\n summary,\n `\\\\section{${sectionNames.basics}}\n\n\\\\cvline{}{${summary}}`\n )}`\n }\n\n /**\n * Render the education section of the resume.\n *\n * @returns The LaTeX code for the education section\n */\n renderEducation(): string {\n const {\n content: {\n computed: { sectionNames },\n education,\n },\n locale,\n } = this.resume\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n if (!education.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.education}}\n\n${education\n .map(\n ({\n computed: { startDate, dateRange, degreeAreaAndScore, summary, courses },\n institution,\n url,\n }) => `\\\\cventry{${showIfNotEmpty(startDate, dateRange)}}\n {${degreeAreaAndScore}}\n {${institution}}\n {${showIfNotEmpty(url, `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyValue(summary) || !isEmptyValue(courses),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyValue(courses),\n `\\\\textbf{${terms.courses}}${colon}${courses}`\n ),\n ],\n '\\n'\n )}`\n )}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the work section of the resume.\n *\n * @returns The LaTeX code for the work section\n */\n renderWork(): string {\n const { content, locale } = this.resume\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n if (!content.work.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.work}}\n\n${content.work\n .map((work) => {\n const {\n computed: { startDate, dateRange, summary, keywords },\n name,\n position,\n url,\n } = work\n\n return `\\\\cventry{${showIfNotEmpty(startDate, dateRange)}}\n {${position}}\n {${name}}\n {${showIfNotEmpty(url, `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyValue(summary) || !isEmptyValue(keywords),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyValue(keywords),\n `\\\\textbf{${terms.keywords}}${colon}${keywords}`\n ),\n ],\n '\\n'\n )}`\n )}}`\n })\n .join('\\n\\n')}`\n }\n\n /**\n * Render the languages section of the resume.\n *\n * @returns The LaTeX code for the languages section\n */\n renderLanguages(): string {\n const {\n content: {\n computed: { sectionNames },\n languages,\n },\n locale,\n } = this.resume\n\n if (!languages.length) {\n return ''\n }\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n return `\\\\section{${sectionNames.languages}}\n\n${languages\n .map(\n ({ computed: { language, fluency, keywords } }) =>\n `\\\\cvline{${language}}{${fluency}${showIfNotEmpty(\n keywords,\n ` \\\\hfill \\\\textbf{${terms.keywords}}${colon}${keywords}`\n )}}`\n )\n .join('\\n')}`\n }\n\n /**\n * Render the skills section of the resume.\n *\n * @returns The LaTeX code for the skills section\n */\n renderSkills(): string {\n const {\n content: {\n computed: { sectionNames },\n skills,\n },\n locale,\n } = this.resume\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n if (!skills.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.skills}}\n\n${skills\n .map(\n ({ name, computed: { level, keywords } }) =>\n `\\\\cvline{${name}}{${level}${showIfNotEmpty(\n keywords,\n ` \\\\hfill \\\\textbf{${terms.keywords}}${colon}${keywords}`\n )}}`\n )\n .join('\\n')}`\n }\n\n /**\n * Render the awards section of the resume.\n *\n * @returns The LaTeX code for the awards section\n */\n renderAwards(): string {\n const {\n content: {\n computed: { sectionNames },\n awards,\n },\n } = this.resume\n\n if (!awards.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.awards}}\n\n${awards\n .map(\n ({ computed: { date, summary }, awarder, title }) => `\\\\cventry{${date}}\n {${awarder}}\n {${title}}\n {}\n {}\n {${summary}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the certificates section of the resume.\n *\n * @returns The LaTeX code for the certificates section\n */\n renderCertificates(): string {\n const {\n content: {\n computed: { sectionNames },\n certificates,\n },\n } = this.resume\n\n if (!certificates.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.certificates}}\n\n${certificates\n .map(\n ({ computed: { date }, issuer, name, url }) => `\\\\cventry{${date}}\n {${issuer}}\n {${name}}\n {${showIfNotEmpty(url, `\\\\href{${url}}{${url}}`)}}\n {}\n {}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the publications section of the resume.\n *\n * @returns The LaTeX code for the publications section\n */\n renderPublications(): string {\n const {\n content: {\n computed: { sectionNames },\n publications,\n },\n } = this.resume\n\n if (!publications.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.publications}}\n\n${publications\n .map(\n ({\n computed: { releaseDate, summary },\n name,\n publisher,\n url,\n }) => `\\\\cventry{${releaseDate}}\n {${name}}\n {${publisher}}\n {${showIfNotEmpty(url, `\\\\href{${url}}{${url}}`)}}\n {}\n {${summary}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the references section of the resume.\n *\n * @returns The LaTeX code for the references section\n */\n renderReferences(): string {\n const {\n content: {\n computed: { sectionNames },\n references,\n },\n } = this.resume\n\n if (!references.length) {\n return ''\n }\n\n switch (this.style) {\n case 'banking':\n return `\\\\section{${sectionNames.references}}\n\n${references\n .map(\n ({\n email,\n relationship,\n name,\n phone,\n computed: { summary },\n }) => `\\\\cventry{\\\\emaillink[${email}]{${email}}}\n {${relationship}}\n {${name}}\n {${phone}}\n {}\n {${summary}}`\n )\n .join('\\n\\n')}`\n\n case 'casual':\n case 'classic':\n // Note that for casual and classic styles, the position of `email` and\n // `name` is reversed with banking style. The first parameter of\n // `\\cventry` will be put on the left side, and generally the `name` can\n // be hyphenated while `email`s are generally longer and cannot be\n // hyphenated. So if email is too long, the visually result would be\n // pretty as it will overlap with the right side text.\n return `\\\\section{${sectionNames.references}}\n\n${references\n .map(\n ({\n email,\n relationship,\n name,\n phone,\n computed: { summary },\n }) => `\\\\cventry{${name}}\n {${relationship}}\n {\\\\emaillink[${email}]{${email}}}\n {${phone}}\n {}\n {${showIfNotEmpty(summary, summary)}}`\n )\n .join('\\n\\n')}`\n }\n }\n\n /**\n * Render the projects section of the resume.\n *\n * @returns The LaTeX code for the projects section\n */\n renderProjects(): string {\n const { content } = this.resume\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(this.resume.locale?.language)\n\n if (!content.projects.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.projects}}\n\n${content.projects\n .map(\n ({\n name,\n description,\n url,\n computed: { dateRange, startDate, summary, keywords },\n }) => `\\\\cventry{${showIfNotEmpty(startDate, dateRange)}}\n {${description}}\n {${name}}\n {${showIfNotEmpty(url, `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyValue(summary) || !isEmptyValue(keywords),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyValue(keywords),\n `\\\\textbf{${terms.keywords}}${colon}${keywords}`\n ),\n ],\n '\\n'\n )}`\n )}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the interests section of the resume.\n *\n * @returns The LaTeX code for the interests section\n */\n renderInterests(): string {\n const { content } = this.resume\n\n if (!content.interests.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.interests}}\n\n${content.interests\n .map(({ name, computed: { keywords } }) => `\\\\cvline{${name}}{${keywords}}`)\n .join('\\n')}`\n }\n\n /**\n * Render the volunteer section of the resume.\n *\n * @returns The LaTeX code for the volunteer section\n */\n renderVolunteer(): string {\n const { content } = this.resume\n\n if (!content.volunteer.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.volunteer}}\n\n${content.volunteer\n .map(\n ({\n position,\n organization,\n url,\n computed: { startDate, dateRange, summary },\n }) => `\\\\cventry{${showIfNotEmpty(startDate, dateRange)}}\n {${position}}\n {${organization}}\n {${showIfNotEmpty(url, `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIfNotEmpty(summary, summary)}}\n `\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the resume.\n *\n * @returns The LaTeX code for the resume\n */\n render(): string {\n return this.generateTeX()\n }\n\n /**\n * Generate the LaTeX code for the resume.\n *\n * @returns The LaTeX code for the resume\n */\n private generateTeX(): string {\n return `${joinNonEmptyString([\n this.renderPreamble(),\n this.renderBasics(),\n this.renderLocation(),\n this.renderProfiles(),\n ])}\n\n\\\\begin{document}\n\n\\\\maketitle\n\n${this.renderOrderedSections()}\n\\\\end{document}`\n }\n}\n\n/**\n * Renderer for the banking style of moderncv.\n */\nclass ModerncvBankingRenderer extends ModerncvBase {\n /**\n * Create moderncv renderer with banking style.\n *\n * @param resume - The resume object to render.\n * @param layoutIndex - The index of the selected layout to use.\n * @param summaryParser - Optional parser for summary fields (defaults to markdown).\n */\n constructor(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser = new MarkdownParser()\n ) {\n super(resume, 'banking', layoutIndex, summaryParser)\n }\n}\n\n/**\n * Renderer for the casual style of moderncv.\n */\nclass ModerncvCasualRenderer extends ModerncvBase {\n /**\n * Create a moderncv renderer with casual style.\n *\n * @param resume - The resume object to render.\n * @param layoutIndex - The index of the selected layout to use.\n * @param summaryParser - Optional parser for summary fields (defaults to markdown).\n */\n constructor(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser = new MarkdownParser()\n ) {\n super(resume, 'casual', layoutIndex, summaryParser)\n }\n}\n\n/**\n * Renderer for the classic style of moderncv.\n */\nclass ModerncvClassicRenderer extends ModerncvBase {\n /**\n * Create moderncv renderer with classic style.\n *\n * @param resume - The resume object to render.\n * @param layoutIndex - The index of the selected layout to use.\n * @param summaryParser - Optional parser for summary fields (defaults to markdown).\n */\n constructor(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser = new MarkdownParser()\n ) {\n super(resume, 'classic', layoutIndex, summaryParser)\n }\n}\n\nexport {\n ModerncvBase,\n ModerncvBankingRenderer,\n ModerncvCasualRenderer,\n ModerncvClassicRenderer,\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Parser } from '@/compiler'\nimport { MarkdownParser } from '@/compiler'\nimport type { Resume } from '@/models'\nimport { transformResume } from '@/preprocess'\nimport { getTemplateTranslations } from '@/translations'\nimport { isEmptyValue, joinNonEmptyString, showIfNotEmpty } from '@/utils'\nimport { Renderer } from '../base'\n\n/**\n * Markdown renderer for generating markdown documents from resume data.\n */\nexport class MarkdownRenderer extends Renderer {\n /**\n * Constructor for the MarkdownRenderer class.\n *\n * @param resume - The resume object\n * @param layoutIndex - The index of the selected layout to use.\n * @param summaryParser - The summary parser used to parse summary field in\n * various sections.\n */\n constructor(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser = new MarkdownParser()\n ) {\n super(\n transformResume(resume, layoutIndex, summaryParser, (input) => input),\n layoutIndex\n )\n }\n\n /**\n * Render the preamble of the markdown document.\n *\n * Please note that markdown output do not need a preamble.\n *\n * @returns {string} The preamble of the markdown document.\n */\n renderPreamble(): string {\n return ''\n }\n\n /**\n * Render the basics section of the resume.\n *\n * @returns {string} The rendered basics section\n */\n renderBasics(): string {\n const {\n content: {\n basics: { name, headline, email, phone, url },\n },\n locale,\n } = this.resume\n\n const {\n punctuations: { colon },\n } = getTemplateTranslations(locale?.language)\n\n const contactInfo = joinNonEmptyString(\n [\n showIfNotEmpty(email, `- Email${colon}${email}`),\n showIfNotEmpty(phone, `- Phone${colon}${phone}`),\n showIfNotEmpty(url, `- URL${colon}${url}`),\n ],\n '\\n'\n )\n\n return joinNonEmptyString([\n showIfNotEmpty(name, `# ${name}`),\n showIfNotEmpty(headline, `Headline${colon}${headline}`),\n showIfNotEmpty(contactInfo, contactInfo),\n ])\n }\n\n /**\n * Render the summary section of the resume.\n *\n * @returns {string} The rendered summary section\n */\n renderSummary(): string {\n const {\n content: {\n basics: { summary },\n computed: { sectionNames },\n },\n } = this.resume\n\n return showIfNotEmpty(\n summary,\n joinNonEmptyString([`## ${sectionNames.basics}`, summary])\n )\n }\n\n /**\n * Render the location section of the resume.\n *\n * @returns {string} The rendered location section\n */\n renderLocation(): string {\n const {\n content: {\n location: {\n computed: { fullAddress },\n },\n computed: { sectionNames },\n },\n locale,\n } = this.resume\n\n const {\n punctuations: { colon },\n } = getTemplateTranslations(locale?.language)\n\n return showIfNotEmpty(\n fullAddress,\n `${sectionNames.location}${colon}${fullAddress}`\n )\n }\n\n /**\n * Render the profiles section of the resume.\n *\n * @returns {string} The rendered profiles section\n */\n renderProfiles(): string {\n const {\n content: {\n computed: { sectionNames },\n profiles,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(profiles)) return ''\n\n const {\n punctuations: { colon },\n } = getTemplateTranslations(locale?.language)\n\n const profileLinks = profiles\n .map(({ network, url, username }) => {\n if (isEmptyValue(url)) {\n return `- ${network}${colon}@${username}`\n }\n\n return `- ${network}${colon}[@${username}](${url})`\n })\n .join('\\n')\n\n return `${sectionNames.profiles}${colon}\\n${profileLinks}`\n }\n\n /**\n * Render the education section of the resume.\n *\n * @returns {string} The rendered education section\n */\n renderEducation(): string {\n const {\n content: {\n computed: { sectionNames },\n education,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(education)) return ''\n\n const {\n punctuations: { colon, comma },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.education}\n\n${education\n .map(\n ({\n computed: { courses, dateRange, degreeAreaAndScore, startDate },\n institution,\n summary,\n url,\n }) => {\n return joinNonEmptyString([\n `### ${institution}`,\n joinNonEmptyString(\n [degreeAreaAndScore, showIfNotEmpty(startDate, dateRange)],\n comma\n ),\n showIfNotEmpty(url, `URL${colon}${url}`),\n showIfNotEmpty(courses, `${terms.courses}${colon}${courses}`),\n showIfNotEmpty(summary, `Summary${colon}\\n${summary}`),\n ])\n }\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the work section of the resume.\n *\n * @returns {string} The rendered work section\n */\n renderWork(): string {\n const {\n content: {\n computed: { sectionNames },\n work,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(work)) return ''\n\n const {\n punctuations: { colon, comma },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.work}\n\n${work\n .map(\n ({\n computed: { dateRange, keywords, startDate },\n name,\n position,\n summary,\n url,\n }) => {\n return joinNonEmptyString([\n `### ${position}`,\n joinNonEmptyString([name, showIfNotEmpty(startDate, dateRange)], comma),\n showIfNotEmpty(url, `URL${colon}${url}`),\n showIfNotEmpty(keywords, `${terms.keywords}${colon}${keywords}`),\n showIfNotEmpty(summary, `Summary${colon}\\n${summary}`),\n ])\n }\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the languages section of the resume.\n *\n * @returns {string} The rendered languages section\n */\n renderLanguages(): string {\n const {\n content: {\n computed: { sectionNames },\n languages,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(languages)) return ''\n\n const {\n punctuations: { colon, comma },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.languages}\n\n${languages\n .map(({ computed: { language, fluency, keywords } }) => {\n return `- ${language}${colon}${fluency}${showIfNotEmpty(\n keywords,\n `${comma}${terms.keywords}${colon}${keywords}`\n )}`\n })\n .join('\\n')}`\n }\n\n /**\n * Render the skills section of the resume.\n *\n * @returns {string} The rendered skills section\n */\n renderSkills(): string {\n const {\n content: {\n computed: { sectionNames },\n skills,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(skills)) return ''\n\n const {\n punctuations: { colon, comma },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.skills}\n\n${skills\n .map(({ name, computed: { level, keywords } }) => {\n return `- ${name}${colon}${level}${showIfNotEmpty(\n keywords,\n `${comma}${terms.keywords}${colon}${keywords}`\n )}`\n })\n .join('\\n')}`\n }\n\n /**\n * Render the awards section of the resume.\n *\n * @returns {string} The rendered awards section\n */\n renderAwards(): string {\n const {\n content: {\n computed: { sectionNames },\n awards,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(awards)) return ''\n\n const {\n punctuations: { colon, comma },\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.awards}\n\n${awards\n .map(({ computed: { date }, awarder, title, summary }) => {\n return joinNonEmptyString([\n `### ${title}`,\n joinNonEmptyString([awarder, date], comma),\n showIfNotEmpty(summary, `Summary${colon}\\n${summary}`),\n ])\n })\n .join('\\n')}`\n }\n\n /**\n * Render the certificates section of the resume.\n *\n * @returns {string} The rendered certificates section\n */\n renderCertificates(): string {\n const {\n content: {\n computed: { sectionNames },\n certificates,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(certificates)) return ''\n\n const {\n punctuations: { comma },\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.certificates}\n\n${certificates\n .map(({ computed: { date }, issuer, name, url }) => {\n return joinNonEmptyString([\n `### ${name}`,\n joinNonEmptyString([issuer, date], comma),\n showIfNotEmpty(url, `URL: ${url}`),\n ])\n })\n .join('\\n')}`\n }\n\n /**\n * Render the publications section of the resume.\n *\n * @returns {string} The rendered publications section\n */\n renderPublications(): string {\n const {\n content: {\n computed: { sectionNames },\n publications,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(publications)) return ''\n\n const {\n punctuations: { colon, comma },\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.publications}\n\n${publications\n .map(({ computed: { releaseDate }, name, publisher, summary, url }) => {\n return joinNonEmptyString([\n `### ${name}`,\n joinNonEmptyString([publisher, releaseDate], comma),\n showIfNotEmpty(url, `URL${colon}${url}`),\n showIfNotEmpty(summary, `Summary${colon}\\n${summary}`),\n ])\n })\n .join('\\n\\n')}`\n }\n\n /**\n * Render the references section of the resume.\n *\n * @returns {string} The rendered references section\n */\n renderReferences(): string {\n const {\n content: {\n computed: { sectionNames },\n references,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(references)) return ''\n\n const {\n punctuations: { colon, comma },\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.references}\n\n${references\n .map(({ email, name, phone, relationship, summary }) => {\n return joinNonEmptyString([\n `### ${name}`,\n joinNonEmptyString([relationship, email, phone], comma),\n showIfNotEmpty(summary, `Summary${colon}\\n${summary}`),\n ])\n })\n .join('\\n\\n')}`\n }\n\n /**\n * Render the projects section of the resume.\n *\n * @returns {string} The rendered projects section\n */\n renderProjects(): string {\n const {\n content: {\n computed: { sectionNames },\n projects,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(projects)) return ''\n\n const {\n punctuations: { colon, comma },\n terms,\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.projects}\n\n${projects\n .map(\n ({\n computed: { dateRange, keywords, startDate },\n name,\n summary,\n description,\n url,\n }) => {\n return joinNonEmptyString([\n `### ${name}`,\n joinNonEmptyString(\n [description, showIfNotEmpty(startDate, dateRange)],\n comma\n ),\n showIfNotEmpty(url, `URL${colon}${url}`),\n showIfNotEmpty(keywords, `${terms.keywords}${colon}${keywords}`),\n showIfNotEmpty(summary, `Summary${colon}\\n${summary}`),\n ])\n }\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the interests section of the resume.\n *\n * @returns {string} The rendered interests section\n */\n renderInterests(): string {\n const {\n content: {\n computed: { sectionNames },\n interests,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(interests)) return ''\n\n const {\n punctuations: { colon },\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.interests}\n\n${interests\n .map(\n ({ name, computed: { keywords } }) =>\n `- ${joinNonEmptyString([name, keywords], colon)}`\n )\n .join('\\n')}`\n }\n\n /**\n * Render the volunteer section of the resume.\n *\n * @returns {string} The rendered volunteer section\n */\n renderVolunteer(): string {\n const {\n content: {\n computed: { sectionNames },\n volunteer,\n },\n locale,\n } = this.resume\n\n if (isEmptyValue(volunteer)) return ''\n\n const {\n punctuations: { colon, comma },\n } = getTemplateTranslations(locale?.language)\n\n return `## ${sectionNames.volunteer}\n\n${volunteer\n .map(\n ({\n computed: { dateRange, startDate },\n position,\n organization,\n summary,\n url,\n }) => {\n return joinNonEmptyString([\n `### ${organization}`,\n joinNonEmptyString(\n [position, showIfNotEmpty(startDate, dateRange)],\n comma\n ),\n showIfNotEmpty(url, `URL${colon}${url}`),\n showIfNotEmpty(summary, `Summary${colon}\\n${summary}`),\n ])\n }\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the complete markdown resume.\n *\n * @returns {string} The rendered markdown resume\n */\n render(): string {\n const sections = [\n this.renderBasics(),\n this.renderLocation(),\n this.renderProfiles(),\n this.renderOrderedSections(),\n ]\n\n return joinNonEmptyString(sections, '\\n\\n')\n }\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { get } from 'lodash-es'\n\nimport type { Parser } from '@/compiler'\nimport { MarkdownParser } from '@/compiler'\nimport type { Resume } from '@/models'\nimport type { Renderer } from './base'\nimport { HtmlRenderer } from './html'\nimport {\n ModerncvBankingRenderer,\n ModerncvCasualRenderer,\n ModerncvClassicRenderer,\n} from './latex/moderncv'\nimport { MarkdownRenderer } from './markdown'\n\nconst LATEX_RESUME_RENDERER_MAP = {\n 'moderncv-banking': ModerncvBankingRenderer,\n 'moderncv-classic': ModerncvClassicRenderer,\n 'moderncv-casual': ModerncvCasualRenderer,\n}\n\n/**\n * Get the appropriate resume renderer based on the provided resume layout.\n *\n * @param {number} layoutIndex - The index of the layout to use.\n * @param {Parser} summaryParser - The parser instance for the summary field.\n * Default to `MarkdownParser` if not provided.\n * @returns {Renderer} The renderer instance for the specified template.\n */\nexport function getResumeRenderer(\n resume: Resume,\n layoutIndex: number,\n summaryParser: Parser = new MarkdownParser()\n): Renderer {\n const layout = resume.layouts?.[layoutIndex]\n\n if (!layout) {\n throw new Error(\n `Layout not found in resume.layouts at index: ${layoutIndex}.`\n )\n }\n\n if (!layout.engine) {\n throw new Error(`Layout engine not found at index: ${layoutIndex}.`)\n }\n\n switch (layout.engine) {\n case 'html':\n return new HtmlRenderer(resume, layoutIndex, summaryParser)\n case 'markdown':\n return new MarkdownRenderer(resume, layoutIndex, summaryParser)\n case 'latex': {\n const template = layout.template\n\n // default to use moderncv banking style if template is not specified\n if (!template) {\n return new ModerncvBankingRenderer(\n resume as Resume,\n layoutIndex,\n summaryParser\n )\n }\n\n return new (get(\n LATEX_RESUME_RENDERER_MAP,\n template,\n ModerncvBankingRenderer\n ))(resume as Resume, layoutIndex, summaryParser)\n }\n default:\n // @ts-ignore\n throw new Error(`Unknown engine: ${layout.engine}`)\n }\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { startCase } from 'lodash-es'\nimport { z } from 'zod'\n\nimport {\n COUNTRY_OPTIONS,\n DEGREE_OPTIONS,\n FLUENCY_OPTIONS,\n HTML_FONT_SIZE_OPTIONS,\n HTML_TEMPLATE_OPTIONS,\n LANGUAGE_OPTIONS,\n LATEX_FONT_SIZE_OPTIONS,\n LATEX_FONTSPEC_NUMBERS_OPTIONS,\n LATEX_TEMPLATE_OPTIONS,\n LEVEL_OPTIONS,\n LOCALE_LANGUAGE_OPTIONS,\n NETWORK_OPTIONS,\n type ORDERABLE_SECTION_IDS,\n} from '@/models'\nimport { joinNonEmptyString } from '@/utils'\n\n/**\n * A type for all options.\n */\ntype Options =\n | typeof COUNTRY_OPTIONS\n | typeof DEGREE_OPTIONS\n | typeof HTML_FONT_SIZE_OPTIONS\n | typeof HTML_TEMPLATE_OPTIONS\n | typeof LATEX_FONTSPEC_NUMBERS_OPTIONS\n | typeof LATEX_FONT_SIZE_OPTIONS\n | typeof LATEX_TEMPLATE_OPTIONS\n | typeof FLUENCY_OPTIONS\n | typeof LANGUAGE_OPTIONS\n | typeof LOCALE_LANGUAGE_OPTIONS\n | typeof LEVEL_OPTIONS\n | typeof NETWORK_OPTIONS\n | typeof ORDERABLE_SECTION_IDS\n\n/**\n * Creates an error message for an optionSchema\n *\n * @param options - The options to create a message for.\n * @param messagePrefix - The message prefix to use for the message.\n * @returns A message for an option schema.\n */\nexport function optionSchemaMessage(options: Options, messagePrefix: string) {\n return joinNonEmptyString(\n [\n `${messagePrefix} option is invalid,`,\n 'it must be one of the following:',\n `[${options.map((option) => `\"${option}\"`).join(', ')}].`,\n ],\n ' '\n )\n}\n\n/**\n * Creates a zod schema for an option.\n *\n * @param options - The options to create a schema for.\n * @param messagePrefix - The message to use for the schema.\n * @returns A Zod schema for an option.\n */\nexport function optionSchema<T extends Options>(\n options: T,\n messagePrefix: string\n) {\n return z\n .enum(options, {\n error: (issue) => {\n if (issue.input === undefined) {\n return {\n message: `${messagePrefix} option is required.`,\n }\n }\n\n return {\n message: optionSchemaMessage(options, messagePrefix),\n }\n },\n })\n .meta({\n title: `${startCase(messagePrefix)} Option`,\n description: `A predefined option from the available ${messagePrefix} choices.`,\n })\n}\n\n/**\n * Creates a zod schema for a string with a minimum and maximum length.\n *\n * @param name - The name of the string.\n * @param min - The minimum length of the string.\n * @param max - The maximum length of the string.\n * @returns A Zod schema for a string with a minimum and maximum length.\n */\nexport const SizedStringSchema = (name: string, min: number, max: number) => {\n return z\n .string({ message: `${name} is required.` })\n .min(min, { message: `${name} should be ${min} characters or more.` })\n .max(max, { message: `${name} should be ${max} characters or less.` })\n}\n\n/**\n * A zod schema for a country option.\n */\nexport const CountryOptionSchema = optionSchema(COUNTRY_OPTIONS, 'country')\n\n/**\n * Creates a zod schema for a date string.\n *\n * A valid date string must be able to be parsed by `Date.parse`.\n *\n * @param date - The name of the date.\n * @returns A Zod schema for a date string.\n */\nexport function DateSchema(date: string) {\n return SizedStringSchema(date, 4, 32)\n .check((ctx) => {\n if (ctx.value.length < 4) {\n ctx.issues = [\n {\n code: 'too_small',\n input: ctx.value,\n minimum: 4,\n message: `${date} should be 4 characters or more.`,\n origin: 'string',\n },\n ]\n\n return\n }\n\n if (ctx.value.length > 32) {\n ctx.issues = [\n {\n code: 'too_big',\n input: ctx.value,\n maximum: 32,\n message: `${date} should be 32 characters or less.`,\n origin: 'string',\n },\n ]\n\n return\n }\n\n if (!Date.parse(ctx.value)) {\n ctx.issues = [\n {\n code: 'invalid_value',\n input: ctx.value,\n message: `${date} is invalid.`,\n origin: 'string',\n values: [ctx.value],\n },\n ]\n }\n })\n .meta({\n title: startCase(date),\n description: 'A valid date string that can be parsed by `Date.parse`.',\n examples: [\n '2025-01-01',\n 'Jul 2025',\n 'July 3, 2025',\n '2025-02-02T00:00:03.123Z',\n ],\n })\n}\n\n/**\n * A zod schema for a degree option.\n */\nexport const DegreeOptionSchema = optionSchema(DEGREE_OPTIONS, 'degree')\n\n/**\n * An email schema used by various sections.\n */\nexport const EmailSchema = z.email({ message: 'email is invalid.' }).meta({\n id: 'email',\n title: 'Email',\n description: 'A valid email address.',\n examples: [\n 'hi@ppresume.com',\n 'first.last@company.org',\n 'test+tag@domain.co.uk',\n ],\n})\n\n/**\n * A zod schema for a language fluency option.\n */\nexport const FluencyOptionSchema = optionSchema(FLUENCY_OPTIONS, 'fluency')\n\n/**\n * A zod schema for a font spec numbers style.\n */\nexport const FontspecNumbersOptionSchema = optionSchema(\n LATEX_FONTSPEC_NUMBERS_OPTIONS,\n 'LaTeX fontspec numbers'\n)\n\n/**\n * A zod schema for fontSize option in layout.\n */\nexport const FontSizeOptionSchema = optionSchema(\n LATEX_FONT_SIZE_OPTIONS,\n 'LaTeX font size'\n)\n\n/**\n * A zod schema for HTML fontSize option in layout.\n */\nexport const HtmlFontSizeOptionSchema = optionSchema(\n HTML_FONT_SIZE_OPTIONS,\n 'HTML font size'\n)\n\n/**\n * A zod schema for an HTML template option.\n */\nexport const HtmlTemplateOptionSchema = optionSchema(\n HTML_TEMPLATE_OPTIONS,\n 'HTML template'\n)\n\n/**\n * A zod schema for a keywords array.\n */\nexport const KeywordsSchema = z\n .array(SizedStringSchema('keyword', 1, 32))\n .meta({\n id: 'keywords',\n title: 'Keywords',\n description: 'An array of keyword, each between 1 and 32 characters.',\n examples: [\n ['Javascript', 'React', 'Typescript'],\n ['Design', 'UI', 'UX'],\n ['Python', 'Data Science'],\n ],\n })\n\n/**\n * A zod schema for a language.\n */\nexport const LanguageOptionSchema = optionSchema(LANGUAGE_OPTIONS, 'language')\n\n/**\n * A zod schema for a template option.\n */\nexport const LatexTemplateOptionSchema = optionSchema(\n LATEX_TEMPLATE_OPTIONS,\n 'LaTeX template'\n)\n\n/**\n * A zod schema for a locale language option.\n */\nexport const LocaleLanguageOptionSchema = optionSchema(\n LOCALE_LANGUAGE_OPTIONS,\n 'locale language'\n)\n\n/**\n * A zod schema for a level option.\n */\nexport const LevelOptionSchema = optionSchema(LEVEL_OPTIONS, 'level')\n\n/**\n * Creates a zod schema for a name.\n *\n * @param name - The name of the string.\n * @returns A Zod schema for a name string.\n */\nexport const NameSchema = (name: string) =>\n SizedStringSchema(name, 2, 128).meta({\n title: startCase(name),\n description: `A ${name} between 2 and 128 characters.`,\n examples: ['Andy Dufresne', 'Xiao Hanyu', 'Jane Smith', 'Dr. Robert John'],\n })\n\n/**\n * A zod schema for a network.\n */\nexport const NetworkOptionSchema = optionSchema(NETWORK_OPTIONS, 'network')\n\n/**\n * A regex for a phone number.\n */\nconst phoneNumberRegex = /^[+]?[(]?[0-9\\s-]{1,15}[)]?[0-9\\s-]{1,15}$/im\n\n/**\n * A zod schema for a phone number.\n */\nexport const PhoneSchema = z\n .string()\n .regex(phoneNumberRegex, {\n message: 'phone number may be invalid.',\n })\n .meta({\n id: 'phone',\n title: 'Phone',\n description: joinNonEmptyString(\n [\n 'A valid phone number that may include',\n 'country code, parentheses, spaces, and hyphens.',\n ],\n ' '\n ),\n examples: ['555-123-4567', '+44 20 7946 0958', '(555) 123-4567'],\n })\n\n/**\n * A zod schema for a summary.\n */\nexport const SummarySchema = SizedStringSchema('summary', 16, 1024).meta({\n id: 'summary',\n title: 'Summary',\n description: 'A summary text between 16 and 1024 characters.',\n examples: [\n 'Experienced software engineer with 5+ years in full-stack development.',\n joinNonEmptyString(\n [\n 'Creative designer passionate about',\n 'user experience and modern design principles.',\n ],\n ' '\n ),\n joinNonEmptyString(\n [\n 'Dedicated project manager with proven track record of',\n 'delivering complex projects on time and budget.',\n ],\n ' '\n ),\n ],\n})\n\n/**\n * Creates a zod schema for an organization.\n *\n * @param name - The name of the organization.\n * @returns A Zod schema for an organization.\n */\nexport const OrganizationSchema = (name: string) =>\n SizedStringSchema(name, 2, 128).meta({\n title: startCase(name),\n description: 'An organization name between 2 and 128 characters.',\n examples: [\n 'Google Inc.',\n 'Microsoft Corporation',\n 'Startup XYZ',\n 'Non-Profit Organization',\n ],\n })\n\n/**\n * A zod schema for a url.\n */\nexport const UrlSchema = z\n .url({ message: 'URL is invalid.' })\n .max(256, { message: 'URL should be 256 characters or less.' })\n .meta({\n id: 'url',\n title: 'URL',\n description: 'A valid URL with maximum length of 256 characters.',\n examples: [\n 'https://yamlresume.dev',\n 'https://ppresume.com',\n 'https://github.com/yamlresume/yamlresume',\n 'https://linkedin.com/in/xiaohanyu1988',\n 'https://www.example.com',\n ],\n })\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { z } from 'zod'\n\n/**\n * Returns a nullish schema with the same metadata as the original schema.\n *\n * Why we need this?\n *\n * By default Zod's `nullish` method will generate a `anyOf` JSON schema, with\n * the second branch being `{ type: null }`, therefore, if users set `null` to a\n * field in the YAML file, when hover over the field in VSCode, there will be no\n * metadata for the field at all.\n *\n * Here we generate a new metadata for the nullish schema, so no matter whether\n * the field is set to `null` or not, the metadata will always be the same.\n *\n * @param schema - The zod schema to make nullish.\n * @returns A nullish schema with the same metadata as the original schema.\n */\nexport function nullifySchema<T>(schema: z.ZodType<T>) {\n const nullishMeta = {\n title: `[optional] ${schema.meta().title}`,\n description: `${schema.meta().description.replace(/\\.$/, '')} or \\`null\\`.`,\n examples: schema.meta().examples,\n }\n\n return schema.meta(nullishMeta).nullish().meta(nullishMeta)\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n NameSchema,\n OrganizationSchema,\n SummarySchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for the awarder of an award.\n */\nexport const AwarderSchema = OrganizationSchema('awarder').meta({\n title: 'Awarder',\n description: 'The organization or institution that presented the award.',\n examples: ['Academy Awards', 'Tech Conference', 'Microsoft Scholarship'],\n})\n\n/**\n * A zod schema for the title of an award.\n */\nexport const TitleSchema = NameSchema('title').meta({\n title: 'Title',\n description: 'The title of the award.',\n examples: [\"Dean's List\", 'Outstanding Student', 'Best Supporting Engineer'],\n})\n\n/**\n * A zod schema for an award item.\n */\nexport const AwardItemSchema = z.object({\n // required fields\n awarder: AwarderSchema,\n title: TitleSchema,\n\n // optional fields\n date: nullifySchema(DateSchema('date')),\n summary: nullifySchema(SummarySchema),\n})\n\n/**\n * A zod schema for awards.\n */\nexport const AwardsSchema = z.object({\n awards: z\n .array(AwardItemSchema)\n .nullish()\n .meta({\n title: 'Awards',\n description: joinNonEmptyString(\n [\n 'The awards section contains your achievements and recognitions,',\n 'including awards, honors, and special acknowledgments.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n EmailSchema,\n NameSchema,\n PhoneSchema,\n SizedStringSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a headline.\n */\nexport const HeadlineSchema = SizedStringSchema('headline', 2, 128).meta({\n title: 'Headline',\n description: 'A short and catchy headline for your resume.',\n examples: [\n 'Full-stack software engineer',\n 'Data Scientist with a passion for Machine Learning',\n 'Product Manager driving innovation',\n ],\n})\n\n/**\n * A zod schema for a basics item.\n */\nexport const BasicsItemSchema = z.object(\n {\n // required fields\n name: NameSchema('name').describe('Your personal name.'),\n\n // optional fields\n email: nullifySchema(EmailSchema),\n headline: nullifySchema(HeadlineSchema),\n phone: nullifySchema(PhoneSchema),\n summary: nullifySchema(SummarySchema),\n url: nullifySchema(UrlSchema),\n },\n {\n error: (issue) => {\n if (issue.input === undefined) {\n return {\n message: 'basics is required.',\n }\n }\n\n return {\n message: issue.message,\n }\n },\n }\n)\n\n/**\n * A zod schema for basics.\n */\nexport const BasicsSchema = z.object({\n basics: BasicsItemSchema.meta({\n title: 'Basics',\n description: joinNonEmptyString(\n [\n 'The basics section contains your personal information,',\n 'such as your name, email, phone number, and a brief summary.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n NameSchema,\n OrganizationSchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for the issuer of a certificate.\n */\nexport const IssuerSchema = OrganizationSchema('issuer').meta({\n title: 'Issuer',\n description: 'The organization that issued the certificate.',\n examples: ['AWS', 'Microsoft', 'Coursera', 'Google Cloud'],\n})\n\n/**\n * A zod schema for a certificate item.\n */\nexport const CertificateItemSchema = z.object({\n // required fields\n issuer: IssuerSchema,\n name: NameSchema('name').describe('The name of the certificate.'),\n\n // optional fields\n date: nullifySchema(DateSchema('date')),\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for certificates.\n */\nexport const CertificatesSchema = z.object({\n certificates: z\n .array(CertificateItemSchema)\n .nullish()\n .meta({\n title: 'Certificates',\n description: joinNonEmptyString(\n [\n 'The certificates section contains your professional certifications,',\n 'including training programs and industry-recognized credentials.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n DegreeOptionSchema,\n OrganizationSchema,\n SizedStringSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for an area of study.\n */\nexport const AreaSchema = SizedStringSchema('area', 2, 64).meta({\n title: 'Area',\n description: 'Your field of study or major.',\n examples: [\n 'Computer Science',\n 'Business Administration',\n 'Engineering',\n 'Arts',\n ],\n})\n\n/**\n * A zod schema for courses.\n */\nexport const CoursesSchema = z\n .array(SizedStringSchema('courses', 2, 128))\n .meta({\n title: 'Courses',\n description: 'A list of relevant courses you have taken.',\n examples: [\n ['Data Structures', 'Algorithms', 'Database Systems'],\n ['Marketing', 'Finance', 'Operations Management'],\n ['Calculus', 'Physics', 'Chemistry'],\n ],\n })\n\n/**\n * A zod schema for an institution.\n */\nexport const InstitutionSchema = OrganizationSchema('institution').meta({\n title: 'Institution',\n description: 'The institution that awarded the degree.',\n examples: [\n 'University of California, Los Angeles',\n 'Harvard University',\n 'Zhejiang University',\n ],\n})\n\n/**\n * A zod schema for a score.\n */\nexport const ScoreSchema = SizedStringSchema('score', 2, 32).meta({\n title: 'Score',\n description: 'Your GPA, grade, or other academic score.',\n examples: ['3.8', '3.8/4.0', 'A+', '95%', 'First Class Honours'],\n})\n\n/**\n * A zod schema for an education item.\n */\nexport const EducationItemSchema = z.object({\n // required fields\n area: AreaSchema,\n institution: InstitutionSchema,\n degree: DegreeOptionSchema,\n startDate: DateSchema('startDate'),\n\n // optional fields\n courses: nullifySchema(CoursesSchema),\n endDate: nullifySchema(DateSchema('endDate')),\n summary: nullifySchema(SummarySchema),\n score: nullifySchema(ScoreSchema),\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for education.\n */\nexport const EducationSchema = z.object({\n education: z\n .array(EducationItemSchema, {\n error: (issue) => {\n if (issue.input === undefined) {\n return {\n message: 'education is required.',\n }\n }\n\n return {\n message: issue.message,\n }\n },\n })\n .meta({\n title: 'Education',\n description: joinNonEmptyString(\n [\n 'The education section contains your academic background,',\n 'including degrees, institutions, and relevant coursework.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { KeywordsSchema, NameSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for an interest name.\n */\nexport const InterestNameSchema = NameSchema('name').describe(\n 'The name of the interest.'\n)\n\n/**\n * A zod schema for an interest item.\n */\nexport const InterestItemSchema = z.object({\n // required fields\n name: InterestNameSchema,\n\n // optional fields\n keywords: nullifySchema(KeywordsSchema),\n})\n\n/**\n * A zod schema for interests.\n */\nexport const InterestsSchema = z.object({\n interests: z\n .array(InterestItemSchema)\n .nullish()\n .meta({\n title: 'Interests',\n description: joinNonEmptyString(\n [\n 'The interests section contains your personal interests and hobbies,',\n 'including activities and topics you are passionate about.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n FluencyOptionSchema,\n KeywordsSchema,\n LanguageOptionSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a language item.\n */\nexport const LanguageItemSchema = z.object({\n // required fields\n fluency: FluencyOptionSchema,\n language: LanguageOptionSchema,\n\n // optional fields\n keywords: nullifySchema(KeywordsSchema),\n})\n\n/**\n * A zod schema for languages.\n */\nexport const LanguagesSchema = z.object({\n languages: z\n .array(LanguageItemSchema)\n .nullish()\n .meta({\n title: 'Languages',\n description: joinNonEmptyString(\n [\n 'The languages section contains your language proficiencies,',\n 'including fluency levels and related skills.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { CountryOptionSchema, SizedStringSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a city.\n */\nexport const CitySchema = SizedStringSchema('city', 2, 64).meta({\n title: 'City',\n description: 'The city where you are located.',\n examples: ['San Francisco', 'New York', 'London', 'Tokyo'],\n})\n\n/**\n * A zod schema for an address.\n */\nexport const AddressSchema = SizedStringSchema('address', 4, 256).meta({\n title: 'Address',\n description: 'Your full address including street, apartment, etc.',\n examples: [\n '123 Main Street, Apt 4B',\n '456 Oak Avenue',\n '789 Pine Road, Suite 100',\n ],\n})\n\n/**\n * A zod schema for a postal code.\n */\nexport const PostalCodeSchema = SizedStringSchema('postalCode', 2, 16).meta({\n title: 'Postal Code',\n description: 'Your postal or ZIP code.',\n examples: ['94102', '10001', 'SW1A 1AA', '100-0001'],\n})\n\n/**\n * A zod schema for a region.\n */\nexport const RegionSchema = SizedStringSchema('region', 2, 64).meta({\n title: 'Region',\n description: 'Your state, province, or region.',\n examples: ['California', 'New York', 'England', 'Tokyo'],\n})\n\n/**\n * A zod schema for a location item.\n */\nexport const LocationItemSchema = z.object({\n // required fields\n city: CitySchema,\n\n // optional fields\n address: nullifySchema(AddressSchema),\n country: nullifySchema(CountryOptionSchema),\n postalCode: nullifySchema(PostalCodeSchema),\n region: nullifySchema(RegionSchema),\n})\n\n/**\n * A zod schema for location.\n */\nexport const LocationSchema = z.object({\n location: LocationItemSchema.nullish().meta({\n title: 'Location',\n description: joinNonEmptyString(\n [\n 'The location section contains your geographical information,',\n 'such as city, address, country, and postal code.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n NetworkOptionSchema,\n SizedStringSchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a username.\n */\nexport const UsernameSchema = SizedStringSchema('username', 2, 64).meta({\n title: 'Username',\n description: 'Your username or handle on the social network.',\n examples: ['john_doe', 'jane.smith', 'dev_engineer', 'designer_123'],\n})\n\n/**\n * A zod schema for a profile item.\n */\nexport const ProfileItemSchema = z.object({\n // required fields\n network: NetworkOptionSchema,\n username: UsernameSchema,\n\n // optional fields\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for profiles.\n */\nexport const ProfilesSchema = z.object({\n profiles: z\n .array(ProfileItemSchema)\n .nullish()\n .meta({\n title: 'Profiles',\n description: joinNonEmptyString(\n [\n 'The profiles section contains your online presence,',\n 'including social media and professional network profiles.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n KeywordsSchema,\n NameSchema,\n SizedStringSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a project name.\n */\nexport const ProjectNameSchema = NameSchema('name').describe(\n 'The name of the project.'\n)\n\n/**\n * A zod schema for a project description.\n */\nexport const ProjectDescriptionSchema = SizedStringSchema(\n 'description',\n 4,\n 128\n).meta({\n title: 'Description',\n description: 'A detailed description of the project and your role.',\n examples: [\n 'Led development of a full-stack web application',\n 'Designed and implemented REST API endpoints',\n 'Managed team of 5 developers for mobile app development',\n ],\n})\n\n/**\n * A zod schema for a project item.\n */\nexport const ProjectItemSchema = z.object({\n // required fields\n name: ProjectNameSchema,\n startDate: DateSchema('startDate'),\n summary: SummarySchema,\n\n // optional fields\n description: nullifySchema(ProjectDescriptionSchema),\n endDate: nullifySchema(DateSchema('endDate')),\n keywords: nullifySchema(KeywordsSchema),\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for projects.\n */\nexport const ProjectsSchema = z.object({\n projects: z\n .array(ProjectItemSchema)\n .nullish()\n .meta({\n title: 'Projects',\n description: joinNonEmptyString(\n [\n 'The projects section contains your personal and professional projects,',\n 'including technical details, timelines, and outcomes.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n NameSchema,\n OrganizationSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a publication name.\n */\nexport const PublicationNameSchema = NameSchema('name').describe(\n 'The name of the publication.'\n)\n\n/**\n * A zod schema for a publisher.\n */\nexport const PublisherSchema = OrganizationSchema('publisher').meta({\n title: 'Publisher',\n description: 'The organization that published the work.',\n examples: ['ACM', 'IEEE', 'Springer', 'Nature Publishing Group'],\n})\n\n/**\n * A zod schema for a publication item.\n */\nexport const PublicationItemSchema = z.object({\n // required fields\n name: PublicationNameSchema,\n publisher: PublisherSchema,\n\n // optional fields\n releaseDate: nullifySchema(DateSchema('Release date')),\n summary: nullifySchema(SummarySchema),\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for publications.\n */\nexport const PublicationsSchema = z.object({\n publications: z\n .array(PublicationItemSchema)\n .nullish()\n .meta({\n title: 'Publications',\n description: joinNonEmptyString(\n [\n 'The publications section contains your academic and professional publications,',\n 'including papers, articles, and research works.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n EmailSchema,\n NameSchema,\n PhoneSchema,\n SizedStringSchema,\n SummarySchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a reference name.\n */\nexport const ReferenceNameSchema = NameSchema('name').describe(\n 'The name of the reference.'\n)\n\n/**\n * A zod schema for a relationship.\n */\nexport const RelationshipSchema = SizedStringSchema(\n 'relationship',\n 2,\n 128\n).meta({\n title: 'Relationship',\n description: 'Your professional relationship with the reference.',\n examples: ['Former Manager', 'Colleague', 'Professor', 'Client'],\n})\n\n/**\n * A zod schema for a reference item.\n */\nexport const ReferenceItemSchema = z.object({\n // required fields\n name: ReferenceNameSchema,\n summary: SummarySchema,\n\n // optional fields\n email: nullifySchema(EmailSchema),\n phone: nullifySchema(PhoneSchema),\n relationship: nullifySchema(RelationshipSchema),\n})\n\n/**\n * A zod schema for references.\n */\nexport const ReferencesSchema = z.object({\n references: z\n .array(ReferenceItemSchema)\n .nullish()\n .meta({\n title: 'References',\n description: joinNonEmptyString(\n [\n 'The references section contains your professional references,',\n 'including contact information and relationships.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { KeywordsSchema, LevelOptionSchema, NameSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a skill name.\n */\nexport const SkillNameSchema = NameSchema('name').describe(\n 'The name of the skill.'\n)\n\n/**\n * A zod schema for a skill item.\n */\nexport const SkillItemSchema = z.object({\n // required fields\n level: LevelOptionSchema,\n name: SkillNameSchema,\n\n // optional fields\n keywords: nullifySchema(KeywordsSchema),\n})\n\n/**\n * A zod schema for skills.\n */\nexport const SkillsSchema = z.object({\n skills: z\n .array(SkillItemSchema)\n .nullish()\n .meta({\n title: 'Skills',\n description: joinNonEmptyString(\n [\n 'The skills section contains your technical and professional skills,',\n 'including proficiency levels and related keywords.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n OrganizationSchema,\n SizedStringSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a volunteer organization.\n */\nexport const VolunteerOrganizationSchema = OrganizationSchema(\n 'organization'\n).meta({\n title: 'Organization',\n description: 'The organization where you volunteered.',\n examples: [\n 'Red Cross',\n 'Habitat for Humanity',\n 'Local Food Bank',\n 'Animal Shelter',\n ],\n})\n\n/**\n * A zod schema for a volunteer position.\n */\nexport const VolunteerPositionSchema = SizedStringSchema(\n 'position',\n 2,\n 64\n).meta({\n title: 'Position',\n description: 'Your role or position in the volunteer organization.',\n examples: ['Event Coordinator', 'Tutor', 'Fundraiser', 'Board Member'],\n})\n\n/**\n * A zod schema for a volunteer item.\n */\nexport const VolunteerItemSchema = z.object({\n // required fields\n organization: VolunteerOrganizationSchema,\n position: VolunteerPositionSchema,\n startDate: DateSchema('startDate'),\n summary: SummarySchema,\n\n // optional fields\n endDate: nullifySchema(DateSchema('endDate')),\n url: nullifySchema(UrlSchema),\n})\n/**\n * A zod schema for volunteer.\n */\nexport const VolunteerSchema = z.object({\n volunteer: z\n .array(VolunteerItemSchema)\n .nullish()\n .meta({\n title: 'Volunteer',\n description: joinNonEmptyString(\n [\n 'The volunteer section contains your community service and volunteer work,',\n 'including organizations, roles, and contributions.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n KeywordsSchema,\n OrganizationSchema,\n SizedStringSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a company name.\n */\nexport const CompanyNameSchema = OrganizationSchema('name').meta({\n title: 'Name',\n description: 'The name of the company or organization you worked for.',\n examples: ['Google', 'Microsoft', 'Apple', 'Amazon'],\n})\n\n/**\n * A zod schema for a position.\n */\nexport const PositionSchema = SizedStringSchema('position', 2, 64).meta({\n title: 'Position',\n description: 'Your job title or position at the company.',\n examples: [\n 'Software Engineer',\n 'Product Manager',\n 'Data Scientist',\n 'UX Designer',\n ],\n})\n\n/**\n * A zod schema for a work item.\n */\nexport const WorkItemSchema = z.object({\n // required fields\n name: CompanyNameSchema,\n position: PositionSchema,\n startDate: DateSchema('startDate'),\n summary: SummarySchema,\n\n // optional fields\n endDate: nullifySchema(DateSchema('endDate')),\n keywords: nullifySchema(KeywordsSchema),\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for work.\n */\nexport const WorkSchema = z.object({\n work: z\n .array(WorkItemSchema)\n .nullish()\n .meta({\n title: 'Work',\n description: joinNonEmptyString(\n [\n 'The work section contains your professional experience,',\n 'including job titles, companies, and responsibilities.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod'\n\nimport { AwardsSchema } from './awards'\nimport { BasicsSchema } from './basics'\nimport { CertificatesSchema } from './certificates'\nimport { EducationSchema } from './education'\nimport { InterestsSchema } from './interests'\nimport { LanguagesSchema } from './languages'\nimport { LocationSchema } from './location'\nimport { ProfilesSchema } from './profiles'\nimport { ProjectsSchema } from './projects'\nimport { PublicationsSchema } from './publications'\nimport { ReferencesSchema } from './references'\nimport { SkillsSchema } from './skills'\nimport { VolunteerSchema } from './volunteer'\nimport { WorkSchema } from './work'\n\n/**\n * A zod schema for a resume, merging all section schemas.\n */\nexport const ContentSchema = z.object({\n content: z.object(\n {\n // required sections\n ...BasicsSchema.shape,\n ...EducationSchema.shape,\n\n // optional sections\n ...AwardsSchema.shape,\n ...CertificatesSchema.shape,\n ...InterestsSchema.shape,\n ...LanguagesSchema.shape,\n ...LocationSchema.shape,\n ...ProfilesSchema.shape,\n ...ProjectsSchema.shape,\n ...PublicationsSchema.shape,\n ...ReferencesSchema.shape,\n ...SkillsSchema.shape,\n ...VolunteerSchema.shape,\n ...WorkSchema.shape,\n },\n {\n error: (issue) => {\n if (issue.input === undefined) {\n return {\n message: 'content is required.',\n }\n }\n\n return {\n message: issue.message,\n }\n },\n }\n ),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { startCase } from 'lodash-es'\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { SizedStringSchema } from '../../primitives'\nimport { nullifySchema } from '../../utils'\n\ntype Position = 'top' | 'bottom' | 'left' | 'right'\n\n/**\n * Creates an error message for a marginSizeSchema\n *\n * @param options - The options to create a message for.\n * @param messagePrefix - The message prefix to use for the message.\n * @returns A message for an option schema.\n */\nexport function marginSizeSchemaMessage(position: Position) {\n return joinNonEmptyString(\n [\n `invalid ${position} margin size,`,\n `${position} margin must be a positive number followed by`,\n `\"cm\", \"pt\" or \"in\", eg: \"2.5cm\", \"1in\", \"72pt\"`,\n ],\n ' '\n )\n}\n\n/**\n * Creates a zod schema for a margin size.\n *\n * Accepts positive numbers followed by valid units: cm, pt, or in\n * Examples: \"2.5cm\", \"1in\", \"72pt\"\n */\nexport function MarginSizeSchema(position: Position) {\n // We could simply use `z.string()` here with a custom check, but we use\n // `SizedStringSchema` in order to get best JSON Schema capabilities.\n return (\n SizedStringSchema(`${position} margin`, 2, 32)\n // Please note that here we added a custom check, inside which we will\n // override `ctx.issues`, therefore marginSizeSchema will always return one\n // and only one precise issue if the value is not valid.\n .check((ctx) => {\n if (ctx.value.length < 2) {\n ctx.issues = [\n {\n code: 'too_small',\n input: ctx.value,\n minimum: 2,\n message: `${position} margin should be 2 characters or more.`,\n origin: 'string',\n },\n ]\n\n return\n }\n\n if (ctx.value.length > 32) {\n ctx.issues = [\n {\n code: 'too_big',\n input: ctx.value,\n maximum: 32,\n message: `${position} margin should be 32 characters or less.`,\n origin: 'string',\n },\n ]\n\n return\n }\n\n if (!ctx.value.match(/^\\d+(\\.\\d+)?(cm|pt|in)$/)) {\n ctx.issues = [\n {\n code: 'invalid_value',\n input: ctx.value,\n message: marginSizeSchemaMessage(position),\n origin: 'string',\n values: [ctx.value],\n },\n ]\n }\n })\n .meta({\n title: startCase(`${position} margin size`),\n description: joinNonEmptyString(\n [\n 'A positive number followed by valid units: cm, pt, or in.',\n 'Examples: \"2.5cm\", \"1in\", \"72pt\".',\n ],\n ' '\n ),\n examples: ['2.5cm', '1in', '72pt', '0.5cm', '12pt'],\n })\n )\n}\n\n/**\n * A zod schema for validating margin configuration.\n *\n * Validates that all margin fields (top, bottom, left, right) are strings\n * representing valid CSS length values (e.g., \"1cm\", \"10pt\").\n */\nexport const MarginsSchema = z.object({\n margins: z\n .object({\n top: nullifySchema(MarginSizeSchema('top')),\n bottom: nullifySchema(MarginSizeSchema('bottom')),\n left: nullifySchema(MarginSizeSchema('left')),\n right: nullifySchema(MarginSizeSchema('right')),\n })\n .nullish()\n .meta({\n title: 'Margins',\n description: joinNonEmptyString(\n [\n 'The margins section contains page margin settings,',\n 'including top, bottom, left, and right margins.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { ORDERABLE_SECTION_IDS } from '@/models'\nimport { optionSchema, SizedStringSchema } from '../../primitives'\nimport { nullifySchema } from '../../utils'\n\n/**\n * A zod schema for an alias name.\n *\n * @param section - The name of the section to create an alias for.\n * @returns A zod schema for an alias name.\n */\nexport function AliasNameSchema(section: string) {\n return SizedStringSchema(`${section} alias`, 2, 128).meta({\n title: section,\n description: `The name of the alias for ${section} section.`,\n })\n}\n\n/**\n * A zod schema for section aliases configuration.\n */\nexport const AliasesSchema = z.object({\n aliases: z\n .object({\n basics: nullifySchema(AliasNameSchema('basics')),\n education: nullifySchema(AliasNameSchema('education')),\n work: nullifySchema(AliasNameSchema('work')),\n volunteer: nullifySchema(AliasNameSchema('volunteer')),\n awards: nullifySchema(AliasNameSchema('awards')),\n certificates: nullifySchema(AliasNameSchema('certificates')),\n publications: nullifySchema(AliasNameSchema('publications')),\n skills: nullifySchema(AliasNameSchema('skills')),\n languages: nullifySchema(AliasNameSchema('languages')),\n interests: nullifySchema(AliasNameSchema('interests')),\n references: nullifySchema(AliasNameSchema('references')),\n projects: nullifySchema(AliasNameSchema('projects')),\n })\n .nullish()\n .meta({\n title: 'Aliases',\n description: 'Section alias customization settings.',\n }),\n})\n\n/**\n * A zod schema for section order configuration.\n */\nexport const OrderSchema = z.object({\n order: z\n .array(optionSchema(ORDERABLE_SECTION_IDS, 'section'))\n .nullish()\n .meta({\n title: 'Order',\n description: 'Custom order for sections in the final output.',\n }),\n})\n\n/**\n * A zod schema for section alias configuration.\n */\nexport const SectionsSchema = z.object({\n sections: z\n .object({\n ...AliasesSchema.shape,\n ...OrderSchema.shape,\n })\n .nullish()\n .meta({\n title: 'Sections',\n description: 'Section customization settings.',\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { HtmlTemplateOptionSchema } from '../../primitives'\nimport { nullifySchema } from '../../utils'\n\n/**\n * A zod schema for validating HTML template configuration.\n *\n * Validates that the template field contains a valid HTML template option.\n */\nexport const HtmlTemplateSchema = z.object({\n template: nullifySchema(HtmlTemplateOptionSchema).meta({\n title: 'Template',\n description: joinNonEmptyString(\n [\n 'The template section contains the resume template selection,',\n 'determining the overall visual style and layout.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { HtmlFontSizeOptionSchema } from '../../primitives'\nimport { nullifySchema } from '../../utils'\n\n/**\n * A zod schema for typography settings.\n */\nexport const HtmlTypographySchema = z.object({\n typography: z\n .object({\n fontSize: nullifySchema(HtmlFontSizeOptionSchema),\n })\n .nullish()\n .meta({\n title: 'Typography',\n description: joinNonEmptyString(\n [\n 'The typography section contains font settings,',\n 'including font size options for HTML output.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { SectionsSchema } from '../common'\nimport { HtmlTemplateSchema } from './template'\nimport { HtmlTypographySchema } from './typography'\n\n/**\n * A zod schema that combines all HTML layout-related configurations.\n *\n * This schema validates the entire HTML layout object by intersecting all individual\n * schemas (template, typography, and sections) to ensure a\n * complete and valid layout configuration.\n */\nexport const HtmlLayoutSchema = z\n .object({\n engine: z.literal('html'),\n ...HtmlTemplateSchema.shape,\n ...HtmlTypographySchema.shape,\n ...SectionsSchema.shape,\n })\n .meta({ title: 'HTML Engine Layout' })\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { FontspecNumbersOptionSchema } from '../../primitives'\nimport { nullifySchema } from '../../utils'\n\n/**\n * A zod schema for validating some advanced latex configuration.\n *\n * Validates some advanced latex settings including font specification options\n * like number styling.\n */\nexport const LatexAdvancedSchema = z.object({\n advanced: z\n .object({\n fontspec: z\n .object({\n numbers: nullifySchema(FontspecNumbersOptionSchema),\n })\n .nullish(),\n })\n .nullish()\n .meta({\n title: 'Advanced',\n description: joinNonEmptyString(\n [\n 'The Advanced section contains advanced latex settings,',\n 'including fontspec package configurations.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { nullifySchema } from '../../utils'\nimport { MarginsSchema } from '../common/margins'\n\n/**\n * A zod schema for the show page numbers setting.\n */\nexport const ShowPageNumbersSchema = z.boolean().meta({\n title: 'Show Page Numbers',\n description: 'Whether to show page numbers on the page.',\n})\n\n/**\n * A zod schema for validating page configuration.\n *\n * Validates page-related settings such as whether to show page numbers and margins.\n */\nexport const LatexPageSchema = z.object({\n page: z\n .object({\n showPageNumbers: nullifySchema(ShowPageNumbersSchema),\n ...MarginsSchema.shape,\n })\n .nullish()\n .meta({\n title: 'Page',\n description: joinNonEmptyString(\n [\n 'The page section contains page display settings,',\n 'including whether to show page numbers and margins.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { LatexTemplateOptionSchema } from '../../primitives'\nimport { nullifySchema } from '../../utils'\n\n/**\n * A zod schema for validating latex template configuration.\n *\n * Validates that the template field contains a valid latex template option.\n */\nexport const LatexTemplateSchema = z.object({\n template: nullifySchema(LatexTemplateOptionSchema).meta({\n title: 'Template',\n description: joinNonEmptyString(\n [\n 'The template section contains the resume template selection,',\n 'determining the overall visual style and layout.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { FontSizeOptionSchema } from '../../primitives'\nimport { nullifySchema } from '../../utils'\n\n/**\n * A zod schema for link styling settings.\n */\nconst LinksSchema = z.object({\n links: z\n .object({\n underline: z\n .boolean()\n .default(false)\n .meta({\n title: 'Underline Links',\n description: 'Whether to underline links in the document.',\n examples: [false, true],\n }),\n })\n .nullish()\n .meta({\n title: 'Typography Links',\n description: 'Link styling settings for typography.',\n }),\n})\n\n/**\n * A zod schema for typography settings.\n */\nexport const LatexTypographySchema = z.object({\n typography: z\n .object({\n fontSize: nullifySchema(FontSizeOptionSchema),\n ...LinksSchema.shape,\n })\n .nullish()\n .meta({\n title: 'Typography',\n description: joinNonEmptyString(\n [\n 'The typography section contains font settings,',\n 'including font size options and link styling.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { SectionsSchema } from '../common'\nimport { LatexAdvancedSchema } from './advanced'\nimport { LatexPageSchema } from './page'\nimport { LatexTemplateSchema } from './template'\nimport { LatexTypographySchema } from './typography'\n\n/**\n * A zod schema that combines all layout-related configurations.\n *\n * This schema validates the entire layout object by intersecting all individual\n * schemas (template, typography, locale, and page) to ensure a\n * complete and valid layout configuration.\n */\nexport const LatexLayoutSchema = z\n .object({\n engine: z.literal('latex'),\n ...LatexPageSchema.shape,\n ...LatexTemplateSchema.shape,\n ...LatexTypographySchema.shape,\n ...LatexAdvancedSchema.shape,\n ...SectionsSchema.shape,\n })\n .meta({ title: 'LaTeX Engine Layout' })\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { SectionsSchema } from '../common'\n\n/**\n * A zod schema that combines all layout-related configurations.\n *\n * This schema validates the entire layout object by intersecting all individual\n * schemas (template, typography, locale, and page) to ensure a\n * complete and valid layout configuration.\n */\nexport const MarkdownLayoutSchema = z\n .object({\n engine: z.literal('markdown'),\n ...SectionsSchema.shape,\n })\n .meta({ title: 'Markdown Engine Layout' })\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { HtmlLayoutSchema } from './html/'\nimport { LatexLayoutSchema } from './latex/'\nimport { MarkdownLayoutSchema } from './markdown/'\n\n/**\n * A zod schema that combines all layout-related configurations.\n */\nexport const LayoutsSchema = z.object({\n layouts: z\n .array(\n z.discriminatedUnion('engine', [\n HtmlLayoutSchema,\n LatexLayoutSchema,\n MarkdownLayoutSchema,\n ])\n )\n .nullish()\n .meta({\n title: 'Layouts',\n description: joinNonEmptyString(\n [\n 'Multiple output layouts configuration as a discriminated union array,',\n 'supporting engines like \"latex\", \"markdown\", and \"html\".',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { LocaleLanguageOptionSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for validating locale configuration.\n *\n * Validates that the language field contains a supported locale language\n * option.\n */\nexport const LocaleSchema = z.object({\n locale: z\n .object({\n language: nullifySchema(LocaleLanguageOptionSchema),\n })\n .nullish()\n .meta({\n title: 'Locale',\n description: joinNonEmptyString(\n [\n 'Top-level locale language settings,',\n 'determining the language used for the resume.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod'\n\nimport { ContentSchema } from './content'\nimport { LayoutsSchema } from './layouts'\nimport { LocaleSchema } from './locale'\n\n/**\n * A zod schema for a yaml resume.\n */\nexport const ResumeSchema = z\n .object({\n ...ContentSchema.shape,\n ...LocaleSchema.shape,\n ...LayoutsSchema.shape,\n })\n .meta({\n $id: 'https://yamlresume.dev/schema.json',\n title: 'YAMLResume Schema',\n description: 'JSON Schema for YAMLResume resume format.',\n version: '0.8.0',\n license: 'MIT',\n keywords: [\n 'Resume',\n 'CV',\n 'YAML',\n 'LaTeX',\n 'PDF',\n 'YAMLResume',\n 'Markdown',\n ],\n })\n"]}
|