// FOOTPASS · COFFRE-FORT · LABO · modèle, données & atomes
// Spec utilisateur : 1 ENTITÉ principale + 1 CATÉGORIE obligatoires par document ·
// les dossiers ne stockent rien (vues entité × catégorie) · droits Consulter /
// Signer / Partager / Exporter · écran d'arrivée = refuge (Suisse, inventaire scellé).

// ── Icônes locales (traits 1.3–1.6, cohérents HMI) ──
const CFI = {
  Chevron: ({ s = 15, c = 'currentColor', dir = 'l' }) => (
    <svg width={s} height={s} viewBox="0 0 14 14" fill="none" style={dir === 'l' ? { transform: 'rotate(180deg)' } : null}><path d="M5 2.8L9.4 7 5 11.2" stroke={c} strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round"></path></svg>
  ),
  Sun: ({ s = 17 }) => (<svg width={s} height={s} viewBox="0 0 18 18" fill="none" stroke="currentColor" strokeWidth="1.4" strokeLinecap="round"><circle cx="9" cy="9" r="3.6"></circle><path d="M9 1.6v1.9M9 14.5v1.9M1.6 9h1.9M14.5 9h1.9M3.8 3.8l1.3 1.3M12.9 12.9l1.3 1.3M14.2 3.8l-1.3 1.3M5.1 12.9l-1.3 1.3"></path></svg>),
  Moon: ({ s = 16 }) => (<svg width={s} height={s} viewBox="0 0 18 18" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinejoin="round"><path d="M15.4 11.2A6.8 6.8 0 016.8 2.6a6.8 6.8 0 108.6 8.6z"></path></svg>),
  Lock: ({ s = 15 }) => (<svg width={s} height={s} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"><rect x="3" y="7" width="10" height="6.6" rx="1.8"></rect><path d="M5.2 7V5.2a2.8 2.8 0 015.6 0V7"></path></svg>),
  Vault: ({ s = 34 }) => (<svg width={s} height={s} viewBox="0 0 18 18" fill="none" stroke="currentColor" strokeWidth="1.3"><rect x="2.2" y="2.8" width="13.6" height="11" rx="2.2"></rect><circle cx="9" cy="8.3" r="2.6" strokeWidth="1.2"></circle><path d="M9 6.6v1.7l1.2 1.2M5 16.2v-1.4M13 16.2v-1.4" strokeWidth="1.2" strokeLinecap="round"></path></svg>),
  FaceId: ({ s = 18 }) => (<svg width={s} height={s} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round"><path d="M3 8V6a3 3 0 013-3h2M16 3h2a3 3 0 013 3v2M21 16v2a3 3 0 01-3 3h-2M8 21H6a3 3 0 01-3-3v-2"></path><path d="M8.4 9.2v1.4M15.6 9.2v1.4M12 9.6v3.2a.9.9 0 01-.9.9M8.7 15.6a4.6 4.6 0 006.6 0"></path></svg>),
  Search: ({ s = 15 }) => (<svg width={s} height={s} viewBox="0 0 18 18" fill="none" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round"><circle cx="8" cy="8" r="6"></circle><path d="M12.5 12.5L16 16"></path></svg>),
  Stats: ({ s = 15 }) => (<svg width={s} height={s} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round"><path d="M3 10.5v2M8 6v6.5M13 3v9.5"></path></svg>),
  Plus: ({ s = 16 }) => (<svg width={s} height={s} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round"><path d="M8 3v10M3 8h10"></path></svg>),
  Check: ({ s = 12 }) => (<svg width={s} height={s} viewBox="0 0 12 12" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"><path d="M2 6.4L4.8 9 10 3.4"></path></svg>),
  Cross: ({ s = 26 }) => (<svg width={s} height={s} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round"><path d="M6 6l12 12M18 6L6 18"></path></svg>),
  Eye: ({ s = 14 }) => (<svg width={s} height={s} viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="1.3"><path d="M1.2 7S3.4 3.2 7 3.2 12.8 7 12.8 7 10.6 10.8 7 10.8 1.2 7 1.2 7z" strokeLinejoin="round"></path><circle cx="7" cy="7" r="1.8"></circle></svg>),
  Pen: ({ s = 13 }) => (<svg width={s} height={s} viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="1.3" strokeLinecap="round" strokeLinejoin="round"><path d="M2 11.4l.6-2.5 6.2-6.2a1.2 1.2 0 011.7 0l.2.2a1.2 1.2 0 010 1.7L4.5 10.8 2 11.4z"></path></svg>),
  Share: ({ s = 14 }) => (<svg width={s} height={s} viewBox="0 0 18 18" fill="none" stroke="currentColor" strokeWidth="1.4" strokeLinecap="round" strokeLinejoin="round"><circle cx="13.5" cy="4" r="2.2"></circle><circle cx="4.5" cy="9" r="2.2"></circle><circle cx="13.5" cy="14" r="2.2"></circle><path d="M6.4 8l5.2-3M6.4 10l5.2 3"></path></svg>),
  Wm: ({ s = 14 }) => (<svg width={s} height={s} viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="1.3" strokeLinecap="round" strokeLinejoin="round"><path d="M7 1.8v6.4M4.4 5.8L7 8.4l2.6-2.6"></path><path d="M2 10.6c.9.8 1.9.8 2.8 0s1.9-.8 2.8 0 1.9.8 2.8 0 1.3-.6 1.6-.3"></path></svg>),
  Ban: ({ s = 13 }) => (<svg width={s} height={s} viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="1.3"><circle cx="7" cy="7" r="5.4"></circle><path d="M3.2 3.2l7.6 7.6"></path></svg>),
  Doc: ({ s = 16 }) => (<svg width={s} height={s} viewBox="0 0 18 18" fill="none" stroke="currentColor" strokeWidth="1.4" strokeLinejoin="round"><path d="M5.4 2.5h5.8L14.6 6v9.5a1 1 0 01-1 1H5.4a1 1 0 01-1-1V3.5a1 1 0 011-1z"></path><path d="M6.8 9.4h4.4M6.8 12h3" strokeLinecap="round"></path><path d="M10.9 2.7V6h3.4"></path></svg>),
  Scale: ({ s = 16 }) => (<svg width={s} height={s} viewBox="0 0 18 18" fill="none" stroke="currentColor" strokeWidth="1.3" strokeLinecap="round" strokeLinejoin="round"><path d="M9 2.6v12.8M5.6 15.4h6.8M4 5l5-1.4L14 5"></path><path d="M4 5L2.2 9.4a2 2 0 003.6 0L4 5zM14 5l-1.8 4.4a2 2 0 003.6 0L14 5z"></path></svg>),
  Med: ({ s = 15 }) => (<svg width={s} height={s} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.4" strokeLinejoin="round"><path d="M6.4 2.4h3.2v4h4v3.2h-4v4H6.4v-4h-4V6.4h4v-4z"></path></svg>),
  Chart: ({ s = 15 }) => (<svg width={s} height={s} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.4" strokeLinecap="round" strokeLinejoin="round"><path d="M2.4 13.6V9.2M6.1 13.6V5.4M9.9 13.6V7.8M13.6 13.6V2.8"></path></svg>),
  Mega: ({ s = 15 }) => (<svg width={s} height={s} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.3" strokeLinecap="round" strokeLinejoin="round"><path d="M2.2 6.4v3.2l2.4.4 6.8 3V3l-6.8 3-2.4.4z"></path><path d="M13.6 6.2a2.4 2.4 0 010 3.6M5.4 10.4l.8 3.2h2"></path></svg>),
  FolderIc: ({ s = 15 }) => (<svg width={s} height={s} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.3" strokeLinejoin="round"><path d="M1.8 4.2a1.4 1.4 0 011.4-1.4h3l1.4 1.8h5.2a1.4 1.4 0 011.4 1.4v6a1.4 1.4 0 01-1.4 1.4H3.2a1.4 1.4 0 01-1.4-1.4v-7.8z"></path></svg>),
  Journal: ({ s = 14 }) => (<svg width={s} height={s} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.3" strokeLinecap="round" strokeLinejoin="round"><path d="M4 1.8h8.2a.8.8 0 01.8.8v10.8a.8.8 0 01-.8.8H4a1 1 0 01-1-1V2.8a1 1 0 011-1z"></path><path d="M5.6 5h5M5.6 7.6h5M5.6 10.2h3.2"></path></svg>),
  Swiss: ({ s = 14 }) => (<svg width={s} height={s} viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="1.2" strokeLinejoin="round"><path d="M7 1.4l4.8 1.6v3.4c0 3-2 5.2-4.8 6.2-2.8-1-4.8-3.2-4.8-6.2V3z"></path><path d="M7 4.6v4M5 6.6h4" strokeLinecap="round"></path></svg>),
  Import: ({ s = 15 }) => (<svg width={s} height={s} viewBox="0 0 16 16" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"><path d="M8 2.2v7.6M4.8 6.6L8 9.8l3.2-3.2M2.6 12.6h10.8"></path></svg>),
  Edit: ({ s = 13 }) => (<svg width={s} height={s} viewBox="0 0 14 14" fill="none" stroke="currentColor" strokeWidth="1.3" strokeLinecap="round" strokeLinejoin="round"><path d="M7.6 2.5H3.2a1 1 0 00-1 1v7.3a1 1 0 001 1h7.3a1 1 0 001-1V6.4"></path><path d="M10.9 1.8a1.2 1.2 0 011.7 1.7L7.3 8.8l-2.3.6.6-2.3 5.3-5.3z"></path></svg>),
};

// ── 5 catégories obligatoires (1 par document) ──
const CF_CATS = {
  jur:  { label: 'Juridique',     hue: 152, Icon: CFI.Scale },
  perf: { label: 'Performance',   hue: 235, Icon: CFI.Chart },
  med:  { label: 'Médical',       hue: 12,  Icon: CFI.Med },
  com:  { label: 'Communication', hue: 295, Icon: CFI.Mega },
  adm:  { label: 'Administratif', hue: 85,  Icon: CFI.FolderIc },
};
const cfCatColor = (k, a) => `oklch(0.62 0.11 ${(CF_CATS[k] || CF_CATS.jur).hue}${a ? ' / ' + a : ''})`;

// ── Entités principales (1 par document · les dossiers ne stockent rien) ──
const CF_ENT_ORDER = ['lucas', 'mathis', 'me'];
const cfEntLabel = (k) => k === 'me' ? 'Agence' : window.fpUpperLast((FP_PEERS[k] || {}).name || '');
const cfEntSub = (k) => k === 'me' ? 'Votre structure' : ((FP_PEERS[k] || {}).role + ' · ' + (FP_PEERS[k] || {}).org);

// ── 5 droits par personne et par document (jamais « au nom de » : la signature reste l'acte du titulaire) ──
// Réviser = refaire / mettre à jour le document (nouvelle version, l'originale reste au journal)
const CF_RIGHTS = [
  { k: 'view',   label: 'Consulter', Icon: CFI.Eye },
  { k: 'edit',   label: 'Réviser',   Icon: CFI.Edit },
  { k: 'sign',   label: 'Signer',    Icon: CFI.Pen },
  { k: 'share',  label: 'Partager',  Icon: CFI.Share },
  { k: 'export', label: 'Exporter',  Icon: CFI.Wm },
];

// ── Documents · 12 réels du monde FP (états : sign · review · signed · ok · expired · null) ──
const CF_DOCS_INIT = [
  { id: 'd4', title: 'Autorisation · co-représentation', ent: 'me', cat: 'jur', state: 'sign', meta: 'Votre signature attendue · Amadou Mbaye', size: '940 Ko', hash: 'C9A4 · 5510 · 8E3D · 70F1', access: [{ pid: 'amadou', rights: ['view', 'sign'] }] },
  { id: 'd2', title: 'Avenant v2.1 · prolongation', ent: 'lucas', cat: 'jur', state: 'review', meta: 'v2.1 · en relecture chez Sira Keïta', size: '860 Ko', hash: '7D02 · 13EA · F4B8 · 2261', access: [{ pid: 'sira', rights: ['view', 'edit', 'export'] }, { pid: 'lucas', rights: ['view'] }] },
  { id: 'd1', title: 'Contrat professionnel · AS Monaco', ent: 'lucas', cat: 'jur', state: 'signed', meta: 'Signé le 1 juil 2024 · valable → 30 juin 2027', size: '1,2 Mo', hash: 'A41F · 88C2 · 0B17 · 9C27', access: [{ pid: 'lucas', rights: ['view'] }, { pid: 'sira', rights: ['view', 'export'] }] },
  { id: 'd8', title: 'Autorisation de représentation · Lucas', ent: 'me', cat: 'jur', state: 'signed', meta: 'Signé · valable → 30 juin 2027', size: '780 Ko', hash: '61B7 · 4A02 · D9E4 · 1C55', access: [{ pid: 'lucas', rights: ['view'] }] },
  { id: 'd6', title: 'Contrat image · équipementier', ent: 'lucas', cat: 'com', state: 'signed', soon: 34, meta: 'Signé · expire le 15 août 2026', size: '720 Ko', hash: 'E833 · 06D1 · 4B92 · F507', access: [{ pid: 'lucas', rights: ['view'] }] },
  { id: 'd5', title: 'Premier contrat pro · FC Nantes U19', ent: 'mathis', cat: 'jur', state: 'signed', meta: 'Signé par 3 parties · 17 déc 2025', size: '1,5 Mo', hash: '5F28 · 91B4 · CC07 · 1A63', access: [{ pid: 'mathis', rights: ['view'] }, { pid: 'sira', rights: ['view'] }] },
  { id: 'd9', title: 'Clips & data · saison 25-26', ent: 'lucas', cat: 'perf', state: null, meta: '12 clips · ajoutés le 3 juil', size: '640 Mo', hash: 'B2C7 · 5E19 · 90AD · 44F2', access: [{ pid: 'david', rights: ['view'] }] },
  { id: 'd7', title: 'Rapport IRM · genou droit', ent: 'lucas', cat: 'med', state: null, meta: 'Novembre · vous et Lucas uniquement', size: '4,3 Mo', hash: '9C40 · D72E · 1185 · B36A', access: [{ pid: 'lucas', rights: ['view'] }], request: { org: 'AS Monaco', ask: 'Lecture du dossier médical · 30 jours' } },
  { id: 'd11', title: 'Bilan médical · sélection U19', ent: 'mathis', cat: 'med', state: null, meta: 'Reçu du FC Nantes · 2 juil', size: '1,1 Mo', hash: '48D0 · 27AC · 93F6 · E018', access: [] },
  { id: 'd10', title: 'Passeport · scan certifié', ent: 'lucas', cat: 'adm', state: 'ok', meta: 'Vérifié par Veriff · valable → 2031', size: '2,1 Mo', hash: '20E8 · B7C4 · 4419 · D5A0', access: [] },
  { id: 'd12', title: 'Facture commission · FC Nantes', ent: 'me', cat: 'adm', state: null, meta: 'Réglée le 5 juin', size: '210 Ko', hash: '77A1 · 30C9 · 5B62 · 98DE', access: [{ pid: 'sira', rights: ['view', 'export'] }] },
  { id: 'd3', title: 'Lettre d’intention · Real Madrid CF', ent: 'lucas', cat: 'jur', state: 'expired', meta: 'Reçue de David Martinez · offre échue le 27 juin', size: '640 Ko', hash: '3B61 · A0D9 · 27C5 · 88E2', access: [{ pid: 'sira', rights: ['view'] }] },
];

// ── Journal (extraits réels, jamais gonflés) ──
const CF_ACTIVITY = [
  { ent: 'lucas', who: 'sira', txt: 'a consulté l’avenant v2.1', when: 'hier · 18:42' },
  { ent: 'me', who: 'amadou', txt: 'a ouvert l’autorisation de co-représentation', when: '10 juil' },
  { ent: 'lucas', who: 'me', txt: 'avez exporté le contrat image · PDF filigrané', when: '9 juil' },
];
const CF_PROCESSED = [
  { id: 'p1', txt: 'Accès de Sira Keïta · avenant v2.1', sub: 'Accordé · Consulter + Exporter · 12 juin', okd: true },
  { id: 'p2', txt: 'FC Nantes · demande sur le bilan médical', sub: 'Refusée · 28 juin', okd: false },
];

const cfName = (pid) => pid === 'me' ? 'Vous' : window.fpUpperLast((FP_PEERS[pid] || {}).name || '');
const cfDeacc = (s) => String(s || '').normalize('NFD').replace(/[\u0300-\u036f]/g, '').toLowerCase();

// ── Atomes ──
const CfPill = ({ state }) => state === 'signed' ? <span className="cf-pill ok">Signé</span>
  : state === 'review' ? <span className="cf-pill review">Relecture</span>
  : state === 'sign' ? <span className="cf-pill sign">À signer</span>
  : state === 'ok' ? <span className="cf-pill ok">Vérifié</span>
  : state === 'expired' ? <span className="cf-pill exp">Expiré</span>
  : null;

const CfDocIcon = ({ cat, size = 36 }) => {
  const c = CF_CATS[cat] || CF_CATS.jur;
  return (
    <span className="cf-doc-ic" style={{ width: size, height: size, background: `oklch(0.6 0.09 ${c.hue} / 0.13)`, color: cfCatColor(cat) }}>
      <c.Icon s={Math.round(size * 0.44)} />
    </span>
  );
};

// Confidentialité affichée sur la carte · « Privé » n'est pas un état
const CfPrivacy = ({ access }) => access.length === 0 ? (
  <span className="cf2-priv"><CFI.Lock s={9} /> Vous seul</span>
) : (
  <span className="cf-avstack">
    {access.slice(0, 2).map((a) => { const p = FP_PEERS[a.pid]; return p ? <FPAvatar key={a.pid} size={18} initials={p.initials} src={p.photo} /> : null; })}
    {access.length > 2 ? <span className="cf-avmini">+{access.length - 2}</span> : null}
  </span>
);

const CfRightsIcons = ({ rights }) => (
  <span className="cf2-ricons">
    {CF_RIGHTS.filter((r) => rights.includes(r.k)).map((r) => <i key={r.k} title={r.label}><r.Icon s={11} /></i>)}
  </span>
);

// ── Découverte · les 4 principes du coffre ──
function CfIntro({ onDone }) {
  const P = [
    { n: '1', t: 'Une entité principale par document', d: 'Chaque document appartient à un joueur, un club, un projet · ou à votre agence. Toujours une seule.' },
    { n: '2', t: 'Une catégorie obligatoire', d: null },
    { n: '3', t: 'Les dossiers ne stockent rien', d: 'Ce sont des vues automatiques · par entité, par catégorie, par contexte. Aucun doublon, jamais.' },
    { n: '4', t: 'Chaque document gère ses accès', d: 'Qui peut consulter, signer, partager, exporter. Révocable en un geste, consigné au journal.' },
  ];
  return (
    <div className="cf2-intro">
      <span className="cf-seal cf2-glow"><CFI.Vault s={34} /></span>
      <h2>Bienvenue dans votre coffre-fort</h2>
      <p className="cf2-intro-sub">Un espace chiffré où chaque document se classe automatiquement.</p>
      {P.map((p) => (
        <div key={p.n} className="cf2-prin">
          <i>{p.n}</i>
          <span>
            <b>{p.t}</b>
            {p.d ? <em>{p.d}</em> : (
              <span className="cf2-prin-cats">
                {Object.keys(CF_CATS).map((k) => (
                  <span key={k} className="cf2-fam on" style={{ pointerEvents: 'none' }}><i style={{ background: cfCatColor(k) }}></i>{CF_CATS[k].label}</span>
                ))}
              </span>
            )}
          </span>
        </div>
      ))}
      <button className="cf-unlockbtn" onClick={onDone}>Continuer vers le coffre</button>
    </div>
  );
}

// ── Note de specs (colonne droite du labo) ──
function CfSpecs() {
  const sw = (c, name) => <span className="cfl-sw"><i style={{ background: c }}></i>{name}</span>;
  return (
    <div className="cfl-note">
      <div className="cfl-kicker">Labo · Coffre-fort</div>
      <h2>Un modèle simple : une entité, une catégorie, des droits</h2>
      <p className="cfl-lede">Chaque document appartient à <b>une entité</b> (Lucas, Mathis, l’agence…) et à <b>une catégorie</b> (Juridique · Performance · Médical · Communication · Administratif). Les dossiers ne stockent rien : ce sont des vues. Essayez : Face ID, un dossier, l’onglet Accès, la demande AS Monaco, les Tweaks.</p>

      <div className="cfl-sec">
        <div className="cfl-sec-h">Du mur froid au refuge</div>
        <p className="cfl-body">L’écran d’arrivée montre désormais <b>ce qui est protégé</b>, pas ce qui est interdit : inventaire scellé (titres et statuts visibles, contenu flouté), quatre garanties concrètes · AES-256, hébergé en Suisse (Zurich), vous seul + vos délégations, journal inviolable · et le contrôle visible. Aucun dark pattern : compteurs réels, zéro fausse urgence.</p>
      </div>

      <div className="cfl-sec">
        <div className="cfl-sec-h">Filtres coordonnés · même logique que Autorisations</div>
        <div className="cfl-row"><b>Onglets</b><span>Tous · À traiter · Accès · Expirés · compteurs réels</span></div>
        <div className="cfl-row"><b>Puces</b><span>5 catégories, pastilles couleur, re-clic = tout</span></div>
        <div className="cfl-row"><b>Dossiers</b><span>« Tous » groupé par entité · toucher une entité ouvre son dossier (vue, pas un stockage)</span></div>
        <div className="cfl-row"><b>Droits</b><span>Consulter · Signer · Partager · Exporter (filigrané) · par personne et par document · révocation en un geste</span></div>
      </div>

      <div className="cfl-sec">
        <div className="cfl-sec-h">Couleurs exactes</div>
        <div className="cfl-swatches">
          {sw('#00A37E', '#00A37E signal')}
          {sw('#0F0F10', '#0F0F10 encre')}
          {sw('#EAEAEA', '#EAEAEA blanc cassé')}
          {sw('#C9A24B', '#C9A24B or sceau')}
          {sw('#E2B248', '#E2B248 relecture')}
          {sw('#E08A3C', '#E08A3C à signer')}
        </div>
      </div>

      <div className="cfl-sec">
        <div className="cfl-sec-h">Échelle & géométrie</div>
        <div className="cfl-row"><b>Type (Inter)</b><span>24/800 titre · 16,5/700 sous-titre · 13,5–12,5/650 corps · 11–10,5/500 méta · 9,5/650 pastilles</span></div>
        <div className="cfl-row"><b>Rayons</b><span>26 feuille · 16 cartes · 12 icônes · 99 pastilles</span></div>
        <div className="cfl-row"><b>Or #C9A24B</b><span>sceau guilloché, garanties, sceaux d’inventaire · jamais en aplat</span></div>
        <div className="cfl-row"><b>Hébergement</b><span>« Hébergé en Suisse · Zurich » · jamais « Europe »</span></div>
      </div>
    </div>
  );
}

Object.assign(window, { CFI, CF_CATS, CF_ENT_ORDER, CF_RIGHTS, CF_DOCS_INIT, CF_ACTIVITY, CF_PROCESSED, cfCatColor, cfEntLabel, cfEntSub, cfName, cfDeacc, CfPill, CfDocIcon, CfPrivacy, CfRightsIcons, CfIntro, CfSpecs });
