UNPKG

gedcom-ts

Version:

TypeScript GEDCOM toolkit for browser apps: import .ged/.zip, edit typed genealogy data, and export GEDCOM or GEDZIP.

2 lines (1 loc) 17.8 kB
var w=Object.defineProperty;var fe=Object.getOwnPropertyDescriptor;var Be=Object.getOwnPropertyNames;var Le=Object.prototype.hasOwnProperty;var D=(e,t)=>()=>(e&&(t=e(e=0)),t);var ye=(e,t)=>{for(var a in t)w(e,a,{get:t[a],enumerable:!0})},$e=(e,t,a,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let c of Be(t))!Le.call(e,c)&&c!==a&&w(e,c,{get:()=>t[c],enumerable:!(r=fe(t,c))||r.enumerable});return e};var ke=e=>$e(w({},"__esModule",{value:!0}),e);var _=D(()=>{});function X(e){function t(y){let p=y.trim();return!p||p===e.unknownDate?!1:H.test(p)||V.test(p)}function a(y){let p=y.trim();if(!p||p===e.unknownDate)return e.onUnknown;if(H.test(p))return e.inYear(p);let k=V.exec(p);if(k){let E=k[1].toLowerCase(),b=k[2];switch(E){case"bef":return e.beforeYear(b);case"aft":return e.afterYear(b);case"vers":case"circa":case"environ":case"about":case"abt":case"est":case"cal":return e.aboutYear(b);default:return e.inYear(b)}}return e.onFullDate(p)}function r(y,p){let k=y.trim(),E=p.trim();return e.lifeRange(k,E,t(k))}function c(y){let p=y.trim();return H.test(p)?e.seesDayInYear(p):t(p)?e.seesDayOnPhrase(a(p)):e.seesDayOnFullDate(p)}return{BOOKLET_UNKNOWN_DATE:e.unknownDate,isYearOnlyDate:t,onDate:a,lifeDateRange:r,seesDayOn:c}}var H,V,q=D(()=>{H=/^\d{3,4}$/,V=/^(vers|circa|environ|about|ABT|BEF|AFT|EST|CAL|INT|FROM|TO)\s+(\d{3,4})$/i});function De(e){return e.normalize("NFD").replace(/\p{M}/gu,"").toLowerCase()}function Ce(e){return be.has(De(e))}function Q(e,t){function a(B){let i=B.trim();if(!i)return null;let h=i.indexOf(", ");return h>=0?{city:i.slice(0,h).trim(),country:i.slice(h+2).trim(),raw:i}:Ce(i)?{city:null,country:i,raw:i}:{city:i,country:null,raw:i}}function r(B){let i=a(B);return i?i.city&&i.country?`${i.city}, ${t.countryPhrase(i.country)}`:i.city?i.city:i.country?t.countryPhrase(i.country):i.raw:""}function c(B,i){let h=r(i);if(!h)return"";let L=t.locationPhrase(h);return e.isYearOnlyDate(B)?`,${L}`:L}function y(B){let i=r(B);return i?t.locationPhrase(i):""}function p(B,i,h,L){let A=i.trim(),N=L.trim();return A&&A===N?{birth:"",death:c(h,N)}:{birth:c(B,A),death:c(h,N)}}function k(B,i){let h=r(B),L=r(i);if(!h&&!L)return"";if(h&&L&&h===L)return t.lifeRangeSame(h);if(h&&L)return t.lifeRangeFromTo(h,L);let A=h||L;return t.lifeRangeSingle(A)}function E(B,i){let h=e.onDate(B),L=i.trim();return h===e.onDate("")&&!L?null:L?h===e.onDate("")?y(L).trim()||null:`${h}${c(B,L)}`:h}function b(B){let i=B?.trim();return!i||i===e.onDate("")?"":` ${i}`}return{parsePlaceLabel:a,placeCore:r,afterDateLocation:c,atLocation:y,birthDeathLocationPhrases:p,lifeRangeLocation:k,marriageWhenWhere:E,embedMarriageWhenWhere:b}}var be,J=D(()=>{be=new Set(["france","germany","deutschland","spain","espana","italy","italia","belgium","switzerland","united kingdom","uk","england","scotland","ireland","portugal","netherlands","holland","luxembourg","austria","poland","russia","canada","united states","usa","morocco","algeria","tunisia","allemagne","espagne","italie","belgique","suisse","royaume-uni","angleterre","\xE9cosse","irlande","pays-bas","pologne","russie","\xE9tats-unis","maroc","alg\xE9rie","tunisie","nederland","polska","\xF6sterreich","schweiz","\u0645\u0635\u0631","\u05D9\u05E9\u05E8\u05D0\u05DC"].map(e=>e.normalize("NFD").replace(/\p{M}/gu,"").toLowerCase()))});function Z(e,t){let a=e.toLowerCase();return t.some(r=>a.startsWith(r.toLowerCase()))}function I(e,t,a){return Z(e,t)?` ${e}`:`${a}${e}`}function Y(e,t,a){return Z(e,t)?`, ${e}`:`,${a}${e}`}var ee=D(()=>{});function Ee(e){return e!=null&&Re.includes(e)}function P(e){return Ee(e)?e:"en"}var Re,T=D(()=>{Re=["en","fr","de","nl","es","zh","it","pt","pl","ar","he"]});function Ae(){let e=globalThis;return e[v]??(e[v]=new Map),e[v]}function M(e){let t=Ae().get(e);if(!t)throw new z(e);return t}var v,z,x=D(()=>{T();v="__GEDCOM_TS_BOOKLET_LOCALE_CACHE__";z=class extends Error{constructor(t){super(`Booklet locale "${t}" is not loaded. Call await ensureBookletLocale("${t}") before using sync booklet APIs.`),this.name="BookletLocaleNotLoadedError"}}});function Pe(e){return M(e).genderWords}function S(e,t){return Pe(P(t))[e]}function te(e,t){let a=P(t);if(a==="en")return"";if(a==="fr")return e>1?"s":"";let r=M(a).genderPhrases;return r&&!r.usesPluralS?"":e>1?"s":""}function oe(e,t){if(e<=0)return"";let a=P(t),r=M(a).genderPhrases?.recensedChildren(e);return r||(a==="en"?e===1?"1 child listed":`${e} children listed`:e===1?"1 enfant recens\xE9":`${e} enfants recens\xE9s`)}function ne(e,t){if(e<=0)return"";let a=P(t),r=M(a).genderPhrases?.otherUnions(e);return r||(a==="en"?e===1?"1 other union cited in the tree":`${e} other unions cited in the tree`:e===1?"1 autre union cit\xE9e dans l'arbre":`${e} autres unions cit\xE9es dans l'arbre`)}var ae=D(()=>{T();x()});function re(e){let t=P(e);return M(t).messages}var le=D(()=>{T();x();x()});function F(e,t=6,a){let r=re(a);if(e.length===0)return r.childrenNone;let c=e.map(y=>y.name);return c.length<=t?c.join(", "):`${c.slice(0,t).join(", ")} ${r.childrenMore(c.length-t)}`}var se=D(()=>{T();le()});function ie(e){return e.map(t=>t.trim()).filter(Boolean).map(t=>t.endsWith(".")?t:`${t}.`).join(" ")}function C(e){let t=e.map(r=>r.trim()).filter(Boolean);return t.length===0?"":`${t.map(r=>r.endsWith(".")?r.slice(0,-1):r).join(" ; ")}.`}function U(e){return e.trim().split(/\s+/)[0]??e}function g(e,t){return e[Math.abs(t)%e.length]}function K(e,t){switch(e.length){case 0:return"";case 1:return e[0];case 2:return`${e[0]} ${t} ${e[1]}`;default:return`${e.slice(0,-1).join(", ")} ${t} ${e.at(-1)}`}}function Ne(e){let t=e.key.match(/^gen-(\d+)$/);return t?{genNum:Number(t[1]),letter:null}:{genNum:0,letter:e.key.match(/^letter-(.+)$/)?.[1]??null}}function Oe(e){return e.includes("\u2014")?e.split("\u2014").pop()?.trim()??"":""}function ce(e,t,a){let r=a.dateModule,c=a.placeModule,y=a.unknownDates;function p(o){return o!==y&&o!=="Dates inconnues"}function k(o,s){if(o.parents.length===0)return null;let n=S(o.sex,e),l=o.parents.map(d=>d.name);return l.length===1?g(t.parentsSingle(l[0],n),s+3):g(t.parentsMultiple(K(l,t.listConjunction),n),s+3)}function E(o,s){if(s.marriageLabel)return s.marriageLabel;let n=o.events.find(l=>l.kind===String("MARR"));return n?c.marriageWhenWhere(n.date,n.place):null}function b(o,s,n){let l=S(o.sex,e),d=s.coParent.name,u=[],m=c.embedMarriageWhenWhere(E(o,s));if(m?u.push(g(t.unionWithMarriage(d,m),n+7)):u.push(g(t.unionWithoutMarriage(d,l),n+7)),s.children.length>0){let f=s.children.map($=>U($.name));f.length===1?u.push(g(t.unionOneChild(f[0],l),n+11)):u.push(g(t.unionManyChildren(K(f,t.listConjunction),l),n+11))}return C(u)}function B(o,s){let n=o.events.find(m=>m.kind===String("BIRT")),l=o.events.find(m=>m.kind===String("DEAT")),d=o.name,u=S(o.sex,e);if(n&&l){let m=r.onDate(n.date),f=r.onDate(l.date),$=c.birthDeathLocationPhrases(n.date,n.place,l.date,l.place),R=c.lifeRangeLocation(n.place,l.place),O=$.birth||c.afterDateLocation(n.date,n.place);return g(t.lifeBornAndDied(d,u,m,$.birth,f,$.death,r.lifeDateRange(n.date,l.date),R,r.seesDayOn(n.date),O),s)}if(n){let m=r.onDate(n.date),f=c.afterDateLocation(n.date,n.place);return g(t.lifeBirthOnly(d,u,m,f,r.seesDayOn(n.date)),s)}if(l){let m=r.onDate(l.date),f=c.afterDateLocation(l.date,l.place);return g(t.lifeDeathOnly(d,u,m,f),s+1)}return p(o.datesLabel)?g(t.lifeApproxDates(d,u,o.datesLabel),s+2):null}function i(o,s,n){let l=r.onDate(o.date),d=c.afterDateLocation(o.date,o.place),u=S(n,e);switch(o.kind){case"MARR":return g(t.eventMarriage(l,d),s);case"DIV":return t.eventDivorce(l,d);case"BAPM":case"CHR":return g(t.eventBaptism(l,d,u),s);case"BURI":return g(t.eventBurial(l,d),s);case"CREM":return t.eventCremation(l,d);case"OCCU":return t.eventOccupation(o.date,c.atLocation(o.place));default:return`${o.label.toLowerCase()} ${l}${d}`}}let h=new Set([String("BIRT"),String("DEAT"),String("MARR")]);function L(o,s){let n=[],l=0;for(let d of o.events){if(h.has(d.kind))continue;let u=i(d,s+l,o.sex);u&&n.push(u),l+=1}return n}function A(o){let s=o.entries.length,n=Oe(o.subtitle),{genNum:l,letter:d}=Ne(o),u=te(s,e);if(l>0){let f=l===1?t.chapterGen1(s,u):t.chapterGenN(l,s,u,n);return g(f,l)}let m=d??o.title;return g(t.chapterLetter(o.title,s,u,m,n),s)}function N(o,s){let n=o.familyId,l=o.partners[0]?.name??t.defaultAncestor,d=o.partners[1]?.name,u=o.children,m;if(d){let f=g(t.familyCouple(U(l),U(d),l,d),n),$=c.embedMarriageWhenWhere(o.marriageLabel),R=g($?t.familyUnionWithMarriage($):t.familyUnionWithoutMarriage,n+1);if(u.length===0)m=C([`${f} ${R}`,t.familyNoDescendants]);else if(u.length===1)m=C([`${f} ${R}`,g(t.familyOneChild(u[0].name),n+2)]);else if(s==="summary")m=C([`${f} ${R}`,t.familyNChildren(u.length,F(u,5,e))]);else{let O=u.map(W=>{let he=p(W.datesLabel)?` (${W.datesLabel})`:"";return`${W.name}${he}`});m=C([`${f} ${R}`,t.familyDescendantsList(K(O,t.listConjunction))])}}else m=ie([g(t.familyLoneFigure(U(l),l),n),o.marriageLabel?g(t.familyMarriageNoted(c.embedMarriageWhenWhere(o.marriageLabel)),n+1):"",u.length>0?g([...t.familyDescendantsNoted(F(u,5,e)),t.familyDescendantsRecensed(oe(u.length,e),F(u,5,e))],n+2):""]);return[m]}function me(o){let s=o.indi,n=[],l=B(o,s);if(l)n.push(l);else{let m=S(o.sex,e);n.push(g(t.personBranchPresent(o.name,m),s))}let d=k(o,s);d&&n.push(d),o.unions[0]&&(n.push(b(o,o.unions[0],s)),o.unions.length>1&&n.push(ne(o.unions.length-1,e)));let u=L(o,s);return u.length>0&&n.push(C(u.slice(0,2))),o.sosa!=null&&n.length>0&&n.push(`SOSA ${o.sosa}`),n.length<=1&&o.events.length===0&&o.unions.length===0?ie([t.personFewRecords(o.name),t.personResearchHint]):C(n)}function ge(o){let s=o.indi,n=[],l=[],d=B(o,s);d&&l.push(d);let u=k(o,s);u&&l.push(u);let m=L(o,s);if(m.length>0&&l.push(C(m)),l.length>0?n.push(C(l)):n.push(t.personPortraitIncomplete(o.name)),o.unions.length>0){let f=o.unions.map(($,R)=>b(o,$,s+20+R));n.push(g(t.personUnionSection(C(f)),s+5))}else{let f=o.events.filter($=>$.kind===String("MARR"));if(f.length>0){let $=f.map((R,O)=>i(R,s+30+O,o.sex));n.push(C($))}}return o.notesPreview&&n.push(g(t.personResearchNote(o.notesPreview),s+9)),n}return{buildChapterIntroNarrative:A,buildFamilyNarrative:N,buildPersonSummaryNarrative:me,buildPersonDetailedNarratives:ge}}var ue=D(()=>{_();ae();se()});var we={};ye(we,{default:()=>We});module.exports=ke(we);var Te,de,ve,xe,G,j,pe,Fe,Ue,Ge,We,_e=D(()=>{_();q();J();ee();ue();Te={BIRT:"Nascimento",DEAT:"Falecimento",MARR:"Casamento",DIV:"Div\xF3rcio",BAPM:"Batismo (BAPM)",CHR:"Batismo",BURI:"Sepultamento",CREM:"Crema\xE7\xE3o",EVEN:"Evento",OCCU:"Profiss\xE3o"},de={unknownDates:"Datas desconhecidas",unknownDate:"Data desconhecida",chapterUnknownDates:"Datas desconhecidas",generation1Title:"Gera\xE7\xE3o 1 \u2014 pessoa de refer\xEAncia",generationTitle:e=>`Gera\xE7\xE3o ${e}`,letterTitle:e=>`Letra ${e}`,chapterSubtitle:(e,t)=>`${e} pessoa(s) \u2014 ${t}`,chapterDateAbout:"cerca de",childrenNone:"nenhum filho registado",childrenMore:e=>`(+ ${e} mais)`,pagesEstimate:e=>`~${e} p\xE1ginas`,pagesEmpty:"\u2014",adviceDetailed120:"Com mais de 120 pessoas, o modo Resumo produz um documento muito mais leg\xEDvel e gera-se mais depressa.",adviceDetailed50:"Para al\xE9m de 50 pessoas, o modo Resumo continua recomendado para uma primeira leitura.",adviceSummary25:"Poucas pessoas: o modo Detalhado oferece uma bela ficha por p\xE1gina, ideal para impress\xE3o.",actTypeLabels:Te,spouseUnknown:"C\xF4njuge n\xE3o registado",timelineTitle:e=>`Linha do tempo cronol\xF3gica \u2014 ${e}`,timelineUnknownDates:"datas desconhecidas",pdf:{coverSubtitle:"Hist\xF3ria familiar a partir do seu ficheiro GEDCOM",referencePerson:e=>`Pessoa de refer\xEAncia (SOSA 1): ${e}`,personCount:e=>`${e} pessoa(s) neste livrete`,localNote:"Documento gerado localmente no seu navegador.",tocTitle:"\xCDndice",modeSummary:"Modo resumo - narrativas curtas",modeDetailed:"Modo detalhado - biografias alargadas",contentHeading:"Conte\xFAdo do livrete",introSummary:"Este livrete conta a sua \xE1rvore em prosa: nascimentos, uni\xF5es, descend\xEAncia e falecimentos reconstru\xEDdos a partir do GEDCOM. Cada cap\xEDtulo abre numa gera\xE7\xE3o ou letra, e desdobra vidas em narrativas curtas.",introDetailed:"Este livrete desenvolve cada figura como biografia narrativa, em sequ\xEAncia em cada cap\xEDtulo. Cada nova gera\xE7\xE3o come\xE7a numa p\xE1gina dedicada.",introSosa:"Os n\xFAmeros SOSA s\xE3o mencionados quando a numera\xE7\xE3o est\xE1 ativa. \xCDndice no final do documento.",familyHeading:e=>`A fam\xEDlia ${e}`,generationLabel:e=>`gera\xE7\xE3o ${e}`,pageFooter:e=>`P\xE1gina ${e}`},timeline:{legendBirth:"nascimento",legendDeath:"falecimento",legendMarriage:"casamento",overflow:e=>`+ ${e} mais nas p\xE1ginas seguintes`,continuation:"(linha do tempo continuada)"}},ve={F:{born:"nascida",died:"falecida",baptized:"batizada",present:"presente",linked:"unida",offspring:"filha",descendant:"descendente",childOf:"filha",parentOf:"m\xE3e"},M:{born:"nascido",died:"falecido",baptized:"batizado",present:"presente",linked:"unido",offspring:"filho",descendant:"descendente",childOf:"filho",parentOf:"pai"},U:{born:"nascido/a",died:"falecido/a",baptized:"batizado/a",present:"presente",linked:"unido/a",offspring:"filho/a",descendant:"descendente",childOf:"filho/a",parentOf:"progenitor"},X:{born:"nascido/a",died:"falecido/a",baptized:"batizado/a",present:"presente",linked:"unido/a",offspring:"filho/a",descendant:"descendente",childOf:"filho/a",parentOf:"progenitor"}},xe={usesPluralS:!1,recensedChildren:e=>e===1?"1 filho/a registado/a":`${e} filhos registados`,otherUnions:e=>e===1?"1 outra uni\xE3o citada na \xE1rvore":`${e} outras uni\xF5es citadas na \xE1rvore`},G=["em "],j=X({unknownDate:"Data desconhecida",onUnknown:"em data desconhecida",inYear:e=>`em ${e}`,beforeYear:e=>`antes de ${e}`,afterYear:e=>`depois de ${e}`,aboutYear:e=>`por volta de ${e}`,onFullDate:e=>`a ${e}`,lifeRange:(e,t)=>`De ${e} a ${t}`,seesDayInYear:e=>`nasce em ${e}`,seesDayOnPhrase:e=>`nasce ${e}`,seesDayOnFullDate:e=>`nasce a ${e}`}),pe=Q(j,{countryPrefixes:G,countryPhrase:e=>`em ${e}`,locationPhrase:e=>I(e,G," em "),lifeRangeSame:e=>Y(e,G," em "),lifeRangeFromTo:(e,t)=>`, de ${e} a ${t}`,lifeRangeSingle:e=>Y(e,G," em ")}),Fe={listConjunction:"e",defaultAncestor:"Um antepassado",parentsSingle:(e,t)=>[`filho/a de ${e}`,`${t.childOf} de ${e}`,`${t.descendant} de ${e}`],parentsMultiple:(e,t)=>[`${t.offspring} de ${e}`,`${t.descendant} de ${e}`,`filho/a de ${e}`],unionWithMarriage:(e,t)=>[`casa com ${e}${t}`,`une-se a ${e}${t}`,`casamento com ${e}${t}`],unionWithoutMarriage:(e,t)=>[`${t.linked} a ${e}`,`partilha a vida com ${e}`,`uni\xE3o registada com ${e}`],unionOneChild:(e,t)=>[`incluindo ${e}`,`com filho/a ${e}`,`${t.parentOf} de ${e}`],unionManyChildren:(e,t)=>[`incluindo os filhos ${e}`,`com descend\xEAncia ${e}`,`${t.parentOf} de ${e}`],lifeBornAndDied:(e,t,a,r,c,y,p,k,E,b)=>[`${e}, ${t.born} ${a}${r}, faleceu ${c}${y}`,`${p}${k}, ${e} marca esta linhagem`,`${e} ${E}${b} e faleceu ${c}${y}`],lifeBirthOnly:(e,t,a,r,c)=>[`${e}, ${t.born} ${a}${r}`,`Nascimento de ${e} ${a}${r}`,`${e} ${c}${r}`],lifeDeathOnly:(e,t,a,r)=>[`${e}, ${t.died} ${a}${r}`,`Falecimento de ${e} ${a}${r}`,`${e} faleceu ${a}${r}`],lifeApproxDates:(e,t,a)=>[`${e}, ${t.present} nos registos por volta de ${a}`,`Situa-se ${e} por volta de ${a}`,`${e} (${a})`],eventMarriage:(e,t)=>[`casamento celebrado ${e}${t}`,`uni\xE3o registada ${e}${t}`,`bodas celebradas ${e}${t}`,`une-se${e}${t}`],eventDivorce:(e,t)=>`div\xF3rcio registado ${e}${t}`,eventBaptism:(e,t,a)=>[`batismo ${e}${t}`,`${a.baptized} ${e}${t}`,`rito batismal ${e}${t}`],eventBurial:(e,t)=>[`enterro ${e}${t}`,`funeral ${e}${t}`,`sepultura ${e}${t}`],eventCremation:(e,t)=>`crema\xE7\xE3o registada ${e}${t}`,eventOccupation:(e,t)=>`profiss\xE3o anotada (${e})${t}`,chapterGen1:(e,t)=>[`Ponto de partida da narrativa: ${e} figura${t} na raiz da \xE1rvore.`,`Aqui come\xE7a a linhagem, com ${e} pessoa${t} de refer\xEAncia.`],chapterGenN:(e,t,a,r)=>[`Na gera\xE7\xE3o ${e}, ${t} antepassado${a} entram em cena.`,`Esta gera\xE7\xE3o inclui ${t} pessoa${a}${r?` (${r})`:""}.`,`${t} vida${a} cruzam-se nesta gera\xE7\xE3o${r?`, entre ${r}`:""}.`],chapterLetter:(e,t,a,r,c)=>[`${e}: ${t} retrato${a} a descobrir.`,`${t} pessoa${a} para a letra ${r}${c?` (${c})`:""}.`],familyCouple:(e,t,a,r)=>[`${e} e ${t}`,`O casal ${e} \u2013 ${t}`,`${a} e ${r}`],familyUnionWithMarriage:e=>[`unem-se${e}`,`casam${e}`,`celebram a sua uni\xE3o${e}`],familyUnionWithoutMarriage:["formam uma uni\xE3o","est\xE3o unidos nos registos","aparecem como c\xF4njuges"],familyNoDescendants:"sem descend\xEAncia registada no ficheiro",familyOneChild:e=>[`com filho/a ${e}`,`d\xE3o \xE0 luz ${e}`,`t\xEAm um filho/a, ${e}`],familyNChildren:(e,t)=>`${e} filhos: ${t}`,familyDescendantsList:e=>`descend\xEAncia: ${e}`,familyLoneFigure:(e,t)=>[`${e} ocupa um lugar central nesta linhagem`,`${t}, figura de refer\xEAncia neste cap\xEDtulo`],familyMarriageNoted:e=>[`casamento registado${e}`,`uni\xE3o anotada${e}`],familyDescendantsNoted:e=>[`descend\xEAncia: ${e}`],familyDescendantsRecensed:(e,t)=>`${e}: ${t}`,personBranchPresent:(e,t)=>[`${e}, ${t.present} neste ramo`,`${e} figura neste cap\xEDtulo`],personFewRecords:e=>`${e}: poucos registos por agora`,personResearchHint:"investiga\xE7\xF5es futuras poder\xE3o completar este retrato",personPortraitIncomplete:e=>`${e} \u2014 retrato ainda por completar nos arquivos.`,personUnionSection:e=>[e,`Lado familiar: ${e}`,`No plano conjugal: ${e}`],personResearchNote:e=>[`Nota de pesquisa: ${e}`,`Os arquivos indicam: ${e}`,`A reter: ${e}`]},Ue=ce("pt",Fe,{dateModule:j,placeModule:pe,unknownDates:de.unknownDates}),Ge={messages:de,genderWords:ve,genderPhrases:xe,dateModule:j,placeModule:pe,narrativeModule:Ue},We=Ge});_e();