<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://nodocentral.org/d/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nodo+Central</id>
	<title>Nodo Central - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="https://nodocentral.org/d/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nodo+Central"/>
	<link rel="alternate" type="text/html" href="https://nodocentral.org/docs/Especial:Contribuciones/Nodo_Central"/>
	<updated>2026-06-27T06:25:35Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Archivo:Estructura_multinivel_de_la_red_interoperable.svg&amp;diff=337</id>
		<title>Archivo:Estructura multinivel de la red interoperable.svg</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Archivo:Estructura_multinivel_de_la_red_interoperable.svg&amp;diff=337"/>
		<updated>2026-06-14T06:18:17Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: Trabajo propio subido con el Asistente de subidas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{es|1=Diagrama de la estructura multinivel de la red de recaudo interoperable del Estado de Jalisco.}}&lt;br /&gt;
|date=2020-10-08&lt;br /&gt;
|source={{own}}&lt;br /&gt;
|author=[[User:Nodo Central|Nodo Central]]&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{self|cc-zero}}&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Manual_de_especificaciones_t%C3%A9cnicas_para_el_sistema_interoperable_de_pago_electr%C3%B3nico_del_estado_de_Jalisco&amp;diff=336</id>
		<title>Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Manual_de_especificaciones_t%C3%A9cnicas_para_el_sistema_interoperable_de_pago_electr%C3%B3nico_del_estado_de_Jalisco&amp;diff=336"/>
		<updated>2026-06-14T06:17:37Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: Versión parcial del manual&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;El &#039;&#039;&#039;manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco&#039;&#039;&#039; define la arquitectura utilizada por la red de recaudo interoperable del transporte público estatal. Este artículo presenta una versión revisada, corregida y actualizada de la última especificación pública disponible.&lt;br /&gt;
&lt;br /&gt;
El manual establece los requisitos para la interoperabilidad entre emisores de tarjetas, distribuidores de productos tarifarios, prestadores de servicio y demás participantes de la red. Asimismo, describe la estructura de datos almacenada en los medios de pago basados en tecnología [[MIFARE DESFire|MIFARE DESFire EV1/EV2]], los mecanismos de seguridad criptográfica empleados, el uso de [[Módulo de acceso seguro|módulos de acceso seguro (SAM)]], los productos tarifarios soportados y los procedimientos operativos necesarios para la emisión, distribución, recarga, validación y administración de los medios de pago.&lt;br /&gt;
&lt;br /&gt;
Además de servir como referencia documental, esta edición incorpora correcciones de formato, aclaraciones técnicas, referencias cruzadas y observaciones derivadas del análisis de la implementación real del sistema interoperable de Jalisco.&lt;br /&gt;
&lt;br /&gt;
== Introducción ==&lt;br /&gt;
Este artículo contiene la definición técnica que reglamenta la tecnología utilizada en el Estado de Jalisco para la implementación de un modelo de interoperabilidad en sistemas de recaudo. En él se definen la tecnología de los medios de pago, la estructura de la información almacenada en dichos medios, las reglas para su utilización y los protocolos de comunicación entre los actores que participan en la red interoperable de Jalisco.&lt;br /&gt;
&lt;br /&gt;
=== Glosario ===&lt;br /&gt;
&lt;br /&gt;
; AES&lt;br /&gt;
: &#039;&#039;Advanced Encryption Standard&#039;&#039; (Estándar Avanzado de Cifrado).&lt;br /&gt;
&lt;br /&gt;
; AID&lt;br /&gt;
: Identificador de aplicación en el medio de pago.&lt;br /&gt;
&lt;br /&gt;
; Aplicación&lt;br /&gt;
: Estructura de datos dentro de un medio de pago que define archivos, codificaciones y reglas de uso.&lt;br /&gt;
&lt;br /&gt;
; Cámara de compensación&lt;br /&gt;
: Sistema de control y compensación encargado de la liquidación y distribución de las operaciones derivadas de las transacciones diarias efectuadas por el pago de tarifas dentro de la red interoperable.&lt;br /&gt;
&lt;br /&gt;
; DF&lt;br /&gt;
: &#039;&#039;Dedicated File&#039;&#039;, archivo contenedor de otros archivos DF o EF.&lt;br /&gt;
&lt;br /&gt;
; EF&lt;br /&gt;
: &#039;&#039;Elementary File&#039;&#039;, archivo destinado al almacenamiento de datos. No posee sucesores y sus atributos de seguridad pueden asignarse individualmente.&lt;br /&gt;
&lt;br /&gt;
; Evento&lt;br /&gt;
: Operación básica efectuada sobre la aplicación interoperable.&lt;br /&gt;
&lt;br /&gt;
; LAM&lt;br /&gt;
: Lista de Acción para Medios de Pago Interoperables.&lt;br /&gt;
&lt;br /&gt;
; LAP_R&lt;br /&gt;
: Lista de Acción para Productos en Dispositivos de Recarga.&lt;br /&gt;
&lt;br /&gt;
; LAP_V&lt;br /&gt;
: Lista de Acción para Productos en Dispositivos de Validación.&lt;br /&gt;
&lt;br /&gt;
; Llave&lt;br /&gt;
: Secreto compartido entre varios elementos de un sistema utilizado para efectuar operaciones de seguridad.&lt;br /&gt;
&lt;br /&gt;
; Medio de pago&lt;br /&gt;
: Instrumento electrónico mediante el cual un usuario puede acceder al servicio de transporte público realizando el pago correspondiente dentro de la red interoperable.&lt;br /&gt;
&lt;br /&gt;
; Operación&lt;br /&gt;
: Acción llevada a cabo por un usuario o una entidad que produce uno o varios eventos.&lt;br /&gt;
&lt;br /&gt;
; Producto&lt;br /&gt;
: Conjunto de reglas comerciales almacenadas en un medio de pago cuya ejecución permite la prestación de un servicio.&lt;br /&gt;
&lt;br /&gt;
; SAM&lt;br /&gt;
: Módulo de acceso seguro. Se utiliza para almacenar llaves criptográficas, realizar operaciones criptográficas con los medios de pago y facilitar la comunicación segura entre terminales y sistemas centrales.&lt;br /&gt;
&lt;br /&gt;
; Tarifa&lt;br /&gt;
: Unidades de valor descontadas de un producto durante una transacción de validación. Estas unidades son determinadas según las condiciones aplicables a cada usuario.&lt;br /&gt;
&lt;br /&gt;
; Usuario&lt;br /&gt;
: Persona que utiliza el sistema integrado de recaudo.&lt;br /&gt;
&lt;br /&gt;
; Validación&lt;br /&gt;
: Uso de un producto para acceder a un servicio.&lt;br /&gt;
&lt;br /&gt;
; Viaje&lt;br /&gt;
: Conjunto de validaciones que transportan al usuario desde el inicio hasta el final de su recorrido.&lt;br /&gt;
&lt;br /&gt;
; Ventana de transbordo&lt;br /&gt;
: Período durante el cual se cumplen todas las condiciones temporales y operativas necesarias para recibir el beneficio de una tarifa de transbordo durante un viaje.&lt;br /&gt;
&lt;br /&gt;
=== Representación de los datos ===&lt;br /&gt;
La información numérica consignada en este documento se expresa en formato hexadecimal cuando el dato incluye el prefijo &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;. Cuando el dato ocupa más de dos bytes, su representación utiliza el orden de bytes &#039;&#039;Big-Endian&#039;&#039;. Los valores expresados en formato decimal no incluyen ningún prefijo.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Decimal&lt;br /&gt;
!Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
|651316845&lt;br /&gt;
|&amp;lt;code&amp;gt;0x26D24E6D&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Algunos datos definidos en esta especificación tienen una longitud en bits que no corresponde a un múltiplo de ocho. En estos casos se agregan ceros a la izquierda hasta completar un número entero de bytes. Este procedimiento permite representar todos los datos de forma alineada a nivel de byte.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Dato&lt;br /&gt;
!Tamaño (bits)&lt;br /&gt;
!Tamaño (bytes)&lt;br /&gt;
!Valor (hex)&lt;br /&gt;
|-&lt;br /&gt;
|6333&lt;br /&gt;
|13&lt;br /&gt;
|2&lt;br /&gt;
|0x18BD&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Especificaciones de la tarjeta MIFARE DESFire EV1 y EV2 ===&lt;br /&gt;
El modelo de datos descrito en este documento está basado en las tarjetas [[MIFARE DESFire|MIFARE DESFire EV1]] y [[MIFARE DESFire|MIFARE DESFire EV2]]. Ambas tecnologías son compatibles con las cuatro partes del estándar ISO/IEC 14443A para tarjetas inteligentes sin contacto.&lt;br /&gt;
&lt;br /&gt;
MIFARE DESFire EV2 incluye un modo de compatibilidad con versiones anteriores de MIFARE DESFire EV1 y D40. Este es el modo de operación utilizado por la aplicación interoperable descrita en esta especificación.&lt;br /&gt;
&lt;br /&gt;
Entre las funcionalidades proporcionadas por la plataforma MIFARE DESFire se encuentran:&lt;br /&gt;
&lt;br /&gt;
* Comunicación segura entre medios de pago y lectores.&lt;br /&gt;
* Manejo de colisiones para múltiples tarjetas presentes simultáneamente en el campo de lectura.&lt;br /&gt;
* Protección de integridad frente a interrupciones durante operaciones de escritura.&lt;br /&gt;
* Transmisión de datos orientada a archivos.&lt;br /&gt;
* Control de acceso basado en llaves criptográficas de aplicación.&lt;br /&gt;
&lt;br /&gt;
La tecnología también incorpora características basadas en estándares abiertos:&lt;br /&gt;
&lt;br /&gt;
* Nombres de archivo basados en ISO 7816.&lt;br /&gt;
* Esquemas de seguridad basados en AES o 3DES.&lt;br /&gt;
* Comandos de administración de archivos compatibles con ISO 7816-4.&lt;br /&gt;
&lt;br /&gt;
Un medio de pago MIFARE DESFire puede almacenar hasta 28 aplicaciones o directorios, identificados mediante un &#039;&#039;Application Identifier&#039;&#039; (AID) de tres bytes y un identificador de archivo ISO de dos bytes.&lt;br /&gt;
&lt;br /&gt;
Cada aplicación puede contener hasta 32 archivos elementales y almacenar de forma segura hasta 14 llaves criptográficas numeradas del 0 al 13, además de los estados especiales &#039;&#039;free&#039;&#039; y &#039;&#039;never&#039;&#039;. La llave número 0 corresponde a la llave maestra de la aplicación.&lt;br /&gt;
&lt;br /&gt;
Los archivos elementales pueden ser de los siguientes tipos:&lt;br /&gt;
&lt;br /&gt;
* Archivos estándar.&lt;br /&gt;
* Archivos con respaldo (&#039;&#039;backup&#039;&#039;).&lt;br /&gt;
* Archivos de valor.&lt;br /&gt;
* Archivos de registro lineal.&lt;br /&gt;
* Archivos de registro cíclico.&lt;br /&gt;
&lt;br /&gt;
Todo medio de pago MIFARE DESFire incluye además un directorio maestro que contiene una llave maestra denominada &#039;&#039;PICC Key&#039;&#039;. La autenticación mediante esta llave permite crear o eliminar aplicaciones y borrar completamente el contenido del medio de pago.&lt;br /&gt;
&lt;br /&gt;
== Interoperabilidad ==&lt;br /&gt;
El modelo de interoperabilidad está basado en el &#039;&#039;estándar ISO 24014, parte 1&#039;&#039;. Una red interoperable se define como un sistema en el que existe un conjunto mínimo de medios de pago aceptados por múltiples prestadores de servicio, independientemente del emisor de dichos medios.&lt;br /&gt;
&lt;br /&gt;
=== Actores de la red interoperable ===&lt;br /&gt;
Siguiendo el modelo definido, pueden existir los siguientes actores dentro de la red interoperable:&lt;br /&gt;
&lt;br /&gt;
; Comité rector&lt;br /&gt;
: Entidad encargada de emitir y actualizar las reglas técnicas y comerciales de la red interoperable, supervisar su cumplimiento, adherir o retirar entidades participantes y supervisar la operación de la cámara de compensación. Cumple el papel de propietario de la aplicación interoperable.&lt;br /&gt;
&lt;br /&gt;
; Comité técnico&lt;br /&gt;
: Entidad encargada de supervisar la calidad de servicio que deben cumplir los actores del entorno interoperable, definir políticas y condiciones de servicio, establecer mecanismos de sanción, instruir al fiduciario sobre la administración de los recursos del fideicomiso maestro y vigilar el cumplimiento de sus fines.&lt;br /&gt;
&lt;br /&gt;
; Cámara de compensación&lt;br /&gt;
: Entidad encargada de interconectar a todas las entidades de la red interoperable. Realiza la recolección de información transaccional y genera las órdenes de pago necesarias para la compensación y liquidación entre participantes.&lt;br /&gt;
&lt;br /&gt;
; Emisores de medios de pago&lt;br /&gt;
: Entidades autorizadas por el comité rector para fabricar, programar y emitir medios de pago que contengan la aplicación interoperable descrita en esta especificación.&lt;br /&gt;
&lt;br /&gt;
; Distribuidores de productos&lt;br /&gt;
: Entidades autorizadas por el comité rector para almacenar productos dentro de los medios de pago interoperables y efectuar operaciones de distribución y recarga de dichos productos.&lt;br /&gt;
&lt;br /&gt;
; Prestadores de servicio&lt;br /&gt;
: Entidades autorizadas por el comité rector para utilizar productos durante transacciones de validación con el fin de prestar servicios dentro de la red interoperable.&lt;br /&gt;
&lt;br /&gt;
=== Especificaciones de la red interoperable ===&lt;br /&gt;
La red interoperable debe cumplir, como mínimo, con las siguientes características:&lt;br /&gt;
&lt;br /&gt;
* Permitir la existencia de múltiples emisores de medios de pago.&lt;br /&gt;
* Permitir que los medios de pago almacenen múltiples productos destinados al acceso a servicios.&lt;br /&gt;
* Permitir la existencia de múltiples distribuidores de productos.&lt;br /&gt;
* Mantener independencia entre la emisión de un medio de pago y la distribución de los productos que este puede almacenar.&lt;br /&gt;
* Definir una estructura de datos común para los medios de pago, denominada &#039;&#039;aplicación interoperable&#039;&#039;.&lt;br /&gt;
* Definir de forma común los productos que pueden ser ofrecidos dentro de la red interoperable.&lt;br /&gt;
* Permitir que los usuarios realicen validaciones en toda la red interoperable conforme a las reglas establecidas por el comité rector.&lt;br /&gt;
* Permitir que los usuarios realicen recargas de productos mediante distribuidores autorizados.&lt;br /&gt;
&lt;br /&gt;
=== Certificaciones de operadores tecnológicos para incorporación al SIR ===&lt;br /&gt;
Para integrarse a la red interoperable es necesario cumplir los requisitos establecidos en el Manual de Procesos y aprobar las pruebas de certificación correspondientes a los niveles 0–1 y 3–4.&lt;br /&gt;
&lt;br /&gt;
=== Alcances mínimos de equipos y servicios prestados por el operador tecnológico a cada EUR ===&lt;br /&gt;
Las especificaciones técnicas de hardware y software que deben suministrar los operadores tecnológicos para cada Entidad Usuaria de Recaudo (EUR), incluyendo EUR Tren, EUR Masivo y EUR Colectivo, se encuentran definidas en el &#039;&#039;Catálogo de Especificaciones Técnicas por EUR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Dicho catálogo se actualiza periódicamente y la versión más reciente publicada es la que debe considerarse vigente.&lt;br /&gt;
&lt;br /&gt;
== Tipos de productos ==&lt;br /&gt;
Los medios de pago deben tener la capacidad de almacenar, como mínimo, cuatro productos: un monedero, un producto de viaje a crédito, y dos productos de boletos para descuento.&lt;br /&gt;
&lt;br /&gt;
Cada producto debe ser único dentro del medio de pago, por lo que únicamente puede existir una instancia de cada uno con la excepción de los boletos para descuento, en cuyo caso solo se pueden cargar dos únicamente con los identificadores distintos asignados descritos en la [[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco#Aplicación interoperable en medios de pago MIFARE DESFire|aplicación interoperable]].&lt;br /&gt;
&lt;br /&gt;
=== Producto Monedero ===&lt;br /&gt;
El producto Monedero permite realizar validaciones para el pago de un pasaje.&lt;br /&gt;
&lt;br /&gt;
Este producto almacena un valor positivo equivalente a la cantidad de dinero recargada por el usuario en dispositivos autorizados de la red interoperable. Dicho valor se actualiza descontando los importes correspondientes a las transacciones de pago realizadas.&lt;br /&gt;
&lt;br /&gt;
La cantidad máxima que puede almacenar este producto está limitada por los parámetros definidos por la administración del sistema interoperable.&lt;br /&gt;
&lt;br /&gt;
El producto Monedero puede utilizarse conjuntamente con el producto Crédito para completar el pago de una tarifa cuando el saldo disponible sea insuficiente, siempre que dicha funcionalidad se encuentre habilitada y el producto Crédito esté presente en el medio de pago.&lt;br /&gt;
&lt;br /&gt;
Su valor mínimo es cero.&lt;br /&gt;
&lt;br /&gt;
=== Validación a crédito ===&lt;br /&gt;
El producto Crédito permite realizar una validación aun cuando el valor disponible para el pago sea inferior a la tarifa aplicable.&lt;br /&gt;
&lt;br /&gt;
Este producto almacena un valor que se vuelve negativo cuando es utilizado durante una transacción de validación. Dicho saldo negativo regresa a cero cuando es cubierto mediante una operación de recarga.&lt;br /&gt;
&lt;br /&gt;
La funcionalidad de validación a crédito opera conjuntamente con el producto Monedero y únicamente puede utilizarse cuando las reglas de operación del sistema permitan su aplicación.&lt;br /&gt;
&lt;br /&gt;
Durante una recarga del producto Monedero, el pago del saldo pendiente del producto Crédito tiene prioridad. Una vez cubierto el saldo negativo, el valor restante de la recarga se agrega al Monedero.&lt;br /&gt;
&lt;br /&gt;
=== Boletos para descuento ===&lt;br /&gt;
El producto Boletos para descuento, abreviado como BPD, almacena una cantidad de viajes disponibles en su respectivo archivo de valor.&lt;br /&gt;
&lt;br /&gt;
Las reglas del producto pueden restringir su utilización según diversos criterios, incluyendo:&lt;br /&gt;
&lt;br /&gt;
* Día de la semana.&lt;br /&gt;
* Horario de uso.&lt;br /&gt;
* Número máximo de viajes permitidos por día.&lt;br /&gt;
&lt;br /&gt;
La prioridad de este producto es superior a la del Monedero y al producto Crédito. Por lo tanto, cuando el producto esté activo, existan viajes disponibles y se cumplan las condiciones de uso establecidas, el sistema debe utilizar el producto BPD o BPD2 de forma preferente durante una validación.&lt;br /&gt;
&lt;br /&gt;
== Modelo de seguridad ==&lt;br /&gt;
El modelo de seguridad definido para la comunicación entre los medios de pago &#039;&#039;(nivel 0)&#039;&#039; y los lectores de medios de pago &#039;&#039;(nivel 1)&#039;&#039; está basado en criptografía simétrica. En este esquema, ambos dispositivos comparten un secreto denominado &#039;&#039;llave&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
La tecnología [[MIFARE DESFire|MIFARE DESFire EV1]] y [[MIFARE DESFire|MIFARE DESFire EV2]] define los mecanismos necesarios para garantizar la confidencialidad e integridad de la información intercambiada. Asimismo, incorpora un protocolo de autenticación mutua que permite verificar la autenticidad tanto del medio de pago como del lector.&lt;br /&gt;
&lt;br /&gt;
El almacenamiento y uso de las llaves por parte de los lectores debe realizarse mediante [[Módulo de acceso seguro|módulos de acceso seguro (SAM)]]. Estos dispositivos se comunican con los lectores y ejecutan funciones críticas de seguridad, entre ellas:&lt;br /&gt;
&lt;br /&gt;
* Autenticación mutua con el medio de pago.&lt;br /&gt;
* Generación y verificación de códigos de autenticación de mensajes (MAC).&lt;br /&gt;
* Cifrado y descifrado de información.&lt;br /&gt;
&lt;br /&gt;
Esta especificación exige el uso del algoritmo de cifrado por bloques AES definido por el estándar &#039;&#039;Advanced Encryption Standard&#039;&#039; (AES). En consecuencia, toda comunicación entre un módulo SAM y un medio de pago debe utilizar AES con claves de 128 bits.&lt;br /&gt;
&lt;br /&gt;
Las operaciones de seguridad derivadas del uso de AES-128 deben seguir las especificaciones definidas por MIFARE DESFire EV1. Adicionalmente, las llaves almacenadas en los medios de pago deben ser diversificadas de forma que cada una sea única dentro de toda la red interoperable.&lt;br /&gt;
&lt;br /&gt;
== Diversificación de llaves ==&lt;br /&gt;
Todas las llaves almacenadas en los medios de pago deben ser diversificadas. Esto significa que cada llave presente en una tarjeta debe derivarse a partir de una llave maestra almacenada en un [[módulo de acceso seguro]], mediante una función de diversificación criptográfica.&lt;br /&gt;
&lt;br /&gt;
La función de diversificación utilizada debe ser CMAC, de acuerdo con las recomendaciones para llaves AES-128 definidas por NXP.&lt;br /&gt;
&lt;br /&gt;
Los datos utilizados durante el proceso de diversificación están compuestos por los siguientes elementos:&lt;br /&gt;
&lt;br /&gt;
* Identificador único del medio de pago (UID).&lt;br /&gt;
* Identificador de la aplicación donde se almacena la llave (ID_App).&lt;br /&gt;
* Identificador del sistema interoperable (ID_Sistema).&lt;br /&gt;
&lt;br /&gt;
La generación de una llave diversificada se realiza mediante el cálculo de un CMAC utilizando:&lt;br /&gt;
&lt;br /&gt;
* Una llave maestra &#039;&#039;Mk&#039;&#039; almacenada en el módulo SAM.&lt;br /&gt;
* Los datos de diversificación definidos para el medio de pago.&lt;br /&gt;
&lt;br /&gt;
La llave diversificada resultante, denominada &#039;&#039;Ck&#039;&#039;, debe ser única para cada medio de pago de la red interoperable.&lt;br /&gt;
&lt;br /&gt;
Los datos de diversificación se construyen utilizando la siguiente secuencia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0x01 || UID || ID_App || ID_Sistema&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donde:&lt;br /&gt;
&lt;br /&gt;
; UID&lt;br /&gt;
: Identificador único del medio de pago.&lt;br /&gt;
&lt;br /&gt;
; ID_App&lt;br /&gt;
: Identificador de la aplicación en la que se encuentra la llave. Para el directorio raíz este valor es &amp;lt;code&amp;gt;0x000000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; ID_Sistema&lt;br /&gt;
: Valor asignado al sistema interoperable del Estado de Jalisco.&lt;br /&gt;
&lt;br /&gt;
El resultado del cálculo CMAC corresponde a la llave diversificada que será utilizada por la aplicación o archivo correspondiente dentro del medio de pago.&lt;br /&gt;
[[Archivo:Función_de_diversificación_de_llaves.svg|centro|600x600px|Función de diversificación de llaves]]&lt;br /&gt;
&lt;br /&gt;
== Aplicación interoperable en medios de pago MIFARE DESFire ==&lt;br /&gt;
La aplicación interoperable define la organización de directorios, archivos, llaves criptográficas y estructuras de datos necesarias para la prestación de servicios dentro de la red interoperable de transporte público del Estado de Jalisco. Asimismo, establece la forma en que deben almacenarse los productos tarifarios, los eventos de uso, la información del usuario y los parámetros operativos requeridos para la operación del sistema.&lt;br /&gt;
&lt;br /&gt;
Las definiciones presentadas en este capítulo se basan en las capacidades de almacenamiento y seguridad ofrecidas por la plataforma [[MIFARE DESFire|MIFARE DESFire EV1]], así como en los estándares BS EN 1545 para sistemas de recaudo en transporte público.&lt;br /&gt;
&lt;br /&gt;
=== Estructura general de archivos ===&lt;br /&gt;
La estructura interoperable de Jalisco está compuesta por dos aplicaciones:&lt;br /&gt;
&lt;br /&gt;
; Directorio raíz del medio de pago&lt;br /&gt;
: El directorio raíz está presente de forma obligatoria en todos los medios de pago MIFARE DESFire y es seleccionado automáticamente cuando la tarjeta es energizada. Contiene la llave maestra de la tarjeta y controla operaciones administrativas de alto nivel, incluyendo la creación y eliminación de aplicaciones.&lt;br /&gt;
&lt;br /&gt;
; Directorio Jalisco_DF&lt;br /&gt;
: &#039;&#039;Jalisco_DF&#039;&#039; constituye la aplicación interoperable utilizada por la red de recaudo del Estado de Jalisco. Este directorio almacena toda la información necesaria para la emisión, distribución, validación y administración de productos dentro del sistema interoperable.&lt;br /&gt;
&lt;br /&gt;
La aplicación interoperable corresponde a un directorio que contiene los archivos requeridos para la operación del sistema de recaudo.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:center;&amp;quot; |Aplicación (AID)&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; |Archivo / Llave&lt;br /&gt;
! style=&amp;quot;text-align:center;&amp;quot; |File ID&lt;br /&gt;
! style=&amp;quot;text-align:center;&amp;quot; |Tipo&lt;br /&gt;
! style=&amp;quot;text-align:center;&amp;quot; |Presencia&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Directorio raíz&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0x000000&amp;lt;/code&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Llave DESFire#Llave maestra PICC|Llave maestra]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |—&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Llave DESFire|Llave]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Llave maestra de la tarjeta. Controla la creación y eliminación de aplicaciones y permite el acceso administrativo al medio de pago.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;22&amp;quot; style=&amp;quot;text-align:center;&amp;quot; |Jalisco_DF&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0x484000&amp;lt;/code&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Llave DESFire#Llaves de aplicación|Llaves de aplicación]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |—&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Llave DESFire|Llave]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Conjunto de llaves criptográficas utilizadas por la aplicación interoperable para autenticación y control de acceso.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Emisión EF|Emisión_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo estándar DESFire|Estándar]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Información invariable relacionada con la emisión e identificación del medio de pago.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Entorno EF|Entorno_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo estándar DESFire|Estándar]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Parámetros generales de la aplicación interoperable y de la red en la que el medio de pago es aceptado.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Usuario EF|Usuario_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x03&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo estándar DESFire|Estándar]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Información del titular del medio de pago y del perfil tarifario asociado, cuando aplique.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Funcionario EF|Funcionario_EF]]&lt;br /&gt;
|&amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
|[[Archivo con respaldo DESFire|Backup]]&lt;br /&gt;
|Opcional&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Información propietaria asociada a medios de pago de funcionarios.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/EstadoAplicación EF|EstadoAplicación_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x04&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo con respaldo DESFire|Backup]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Estado operativo de la aplicación interoperable y contadores asociados a su ciclo de vida.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/ListaProductos EF|ListaProductos_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x05&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo con respaldo DESFire|Backup]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Inventario de productos presentes en el medio de pago y punteros a sus archivos asociados.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Eventos EF|Eventos_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x06&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo de registro cíclico DESFire|Cíclico]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Historial cíclico de eventos registrados por operaciones como emisión, distribución, recarga, validación y devolución.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Monedero&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Contrato(Producto) EF|ContratoMonedero_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x07&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo estándar DESFire|Estándar]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Contrato asociado al producto Monedero.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Servicio(Producto) EF|ServicioMonedero_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo con respaldo DESFire|Backup]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Estado operativo e información dinámica del producto Monedero.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Valor(Producto) EF|ValorMonedero_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x09&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo de valor DESFire|Valor]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Saldo disponible del producto Monedero.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Crédito&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Contrato(Producto) EF|ContratoCrédito_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x0A&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo estándar DESFire|Estándar]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Opcional&lt;br /&gt;
|Contrato asociado al producto Crédito.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Servicio(Producto) EF|ServicioCrédito_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x0B&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo con respaldo DESFire|Backup]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Opcional&lt;br /&gt;
|Estado operativo e información dinámica del producto Crédito.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Valor(Producto) EF|ValorCrédito_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x0C&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo de valor DESFire|Valor]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Opcional&lt;br /&gt;
|Valor negativo o saldo pendiente utilizado por el producto Crédito.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |BPD&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Contrato(Producto) EF|ContratoBPD_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x0D&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo estándar DESFire|Estándar]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Condicional&lt;br /&gt;
|Contrato asociado al producto BPD.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Servicio(Producto) EF|ServicioBPD_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x0E&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo con respaldo DESFire|Backup]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Condicional&lt;br /&gt;
|Estado operativo e información dinámica del producto BPD.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Valor(Producto) EF|ValorBPD_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x0F&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo de valor DESFire|Valor]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Condicional&lt;br /&gt;
|Cantidad de viajes disponibles del producto BPD.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |BPD2&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Contrato(Producto) EF|ContratoBPD2_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x12&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo estándar DESFire|Estándar]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Condicional&lt;br /&gt;
|Contrato asociado al producto BPD2.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Servicio(Producto) EF|ServicioBPD2_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x13&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo con respaldo DESFire|Backup]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Condicional&lt;br /&gt;
|Estado operativo e información dinámica del producto BPD2.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Valor(Producto) EF|ValorBPD2_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x14&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo de valor DESFire|Valor]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Condicional&lt;br /&gt;
|Cantidad de viajes disponibles del producto BPD2.&lt;br /&gt;
|}&lt;br /&gt;
Los archivos del producto Monedero son requeridos en toda tarjeta operativa. El producto Crédito es opcional. Para boletos de descuento, debe existir al menos una familia de archivos BPD; normalmente se utiliza BPD como producto principal y BPD2 como variante adicional o alternativa.&lt;br /&gt;
&lt;br /&gt;
== Ciclos de vida ==&lt;br /&gt;
La vida de la aplicación interoperable y de los productos almacenados en ella puede describirse mediante un conjunto de estados que determinan las funcionalidades disponibles en un momento determinado. Este conjunto de estados se denomina &#039;&#039;ciclo de vida&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
La aplicación interoperable posee un ciclo de vida propio que controla el estado global del medio de pago. Adicionalmente, cada producto almacenado en la aplicación dispone de un ciclo de vida independiente que determina sus capacidades de uso de forma individual.&lt;br /&gt;
&lt;br /&gt;
=== Ciclo de vida de la aplicación interoperable ===&lt;br /&gt;
El ciclo de vida de la aplicación interoperable consiste en un conjunto de estados mutuamente excluyentes que describen las capacidades de la aplicación en un momento determinado. El estado actual se almacena en el campo &amp;lt;code&amp;gt;EstadoAplicación_EF.EstadoAplicación&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
La siguiente figura describe las transiciones posibles entre los estados de la aplicación interoperable.&lt;br /&gt;
[[Archivo:Ciclo_de_vida_de_la_aplicación_interoperable.svg|centro|600x600px|Ciclo de vida de la aplicación interoperable]]&lt;br /&gt;
&lt;br /&gt;
; Inicializada&lt;br /&gt;
: Es el estado inicial de la aplicación interoperable. Se alcanza una vez que el medio de pago ha sido preparado mediante el proceso de inicialización. Este procedimiento debe realizarse en un entorno seguro por una entidad autorizada. Los medios de pago en este estado no pueden utilizarse en la red interoperable.&lt;br /&gt;
&lt;br /&gt;
; Activada&lt;br /&gt;
: Estado operativo normal de la aplicación interoperable. Un medio de pago activado puede utilizarse dentro de la red interoperable y acceder a todas las funcionalidades permitidas por los productos almacenados en él.&lt;br /&gt;
&lt;br /&gt;
; Bloqueada&lt;br /&gt;
: Estado utilizado cuando el medio de pago ha sido restringido temporalmente. Mientras la aplicación permanezca bloqueada, no podrá utilizarse en la red interoperable. Una vez eliminado el motivo del bloqueo, la aplicación puede regresar al estado &#039;&#039;Activada&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
; Desactivada&lt;br /&gt;
: Estado final de la aplicación interoperable. Una aplicación desactivada no puede utilizarse nuevamente ni regresar a otro estado del ciclo de vida.&lt;br /&gt;
&lt;br /&gt;
=== Ciclo de vida de los productos ===&lt;br /&gt;
Cada producto almacenado en un medio de pago posee su propio ciclo de vida. Este ciclo consiste en un conjunto de estados mutuamente excluyentes que describen las funcionalidades disponibles para el producto en un momento determinado.&lt;br /&gt;
&lt;br /&gt;
El estado actual de cada producto se almacena en el campo &amp;lt;code&amp;gt;Servicio(Producto)_EF.EstadoProducto&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
La siguiente figura describe las transiciones posibles entre los estados de un producto.&lt;br /&gt;
[[Archivo:Ciclo_de_vida_de_un_producto.svg|centro|600x600px|Ciclo de vida de un producto]]&lt;br /&gt;
&lt;br /&gt;
; Inicializado&lt;br /&gt;
: Estado alcanzado cuando la aplicación interoperable ha sido inicializada y se han creado los archivos correspondientes al producto. En este punto los archivos aún no contienen información válida y las llaves definitivas del producto no han sido cargadas.&lt;br /&gt;
&lt;br /&gt;
; Activado&lt;br /&gt;
: Estado operativo normal del producto. Los archivos &amp;lt;code&amp;gt;Contrato(Producto)_EF&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Servicio(Producto)_EF&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;Valor(Producto)_EF&amp;lt;/code&amp;gt; deben haber sido inicializados correctamente y las llaves correspondientes deben encontrarse cargadas. Un producto activado puede utilizarse dentro de la red interoperable.&lt;br /&gt;
&lt;br /&gt;
; Suspendido&lt;br /&gt;
: Estado utilizado cuando el emisor del producto determina que este no debe utilizarse temporalmente. Mientras permanezca suspendido, el producto no podrá emplearse para acceder a servicios. Una vez corregida la causa de la suspensión, el emisor puede reactivarlo y devolverlo al estado &#039;&#039;Activado&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Instrucciones de uso de la aplicación interoperable en medios de pago ==&lt;br /&gt;
&lt;br /&gt;
== Modelo interoperable de flujo de datos ==&lt;br /&gt;
En una red interoperable, el flujo de información ocurre entre diferentes niveles según la estructura de la red. Esta estructura se compone generalmente de los siguientes niveles:&lt;br /&gt;
&lt;br /&gt;
; Nivel 0&lt;br /&gt;
: Medios de pago que contienen la aplicación interoperable.&lt;br /&gt;
&lt;br /&gt;
; Nivel 1&lt;br /&gt;
: Dispositivos lectores de medios de pago. Incluye validadores, dispositivos de emisión de medios de pago y dispositivos de recarga de productos.&lt;br /&gt;
&lt;br /&gt;
; Nivel 2&lt;br /&gt;
: Dispositivos concentradores de transacciones que interconectan los dispositivos de nivel 1 con un sistema central de nivel 3.&lt;br /&gt;
&lt;br /&gt;
; Nivel 3&lt;br /&gt;
: Infraestructura centralizada que administra y gestiona la información generada o destinada a los niveles inferiores. Este nivel es administrado por la entidad propietaria de los dispositivos de nivel 1 y nivel 2 a los que se encuentra conectado.&lt;br /&gt;
&lt;br /&gt;
; Nivel 4&lt;br /&gt;
: Cámara de compensación. Es el nivel más alto de la red interoperable. En este nivel se recolecta la información de la red y se realiza el intercambio de información entre las entidades participantes. Este nivel es supervisado por el comité correspondiente para regular la red interoperable.&lt;br /&gt;
&lt;br /&gt;
Para garantizar la interoperabilidad, las interacciones entre los diferentes niveles deben encontrarse estandarizadas conforme a esta especificación. Sin embargo, debido a la naturaleza jerárquica de la red, únicamente se requiere que sean interoperables los flujos de información ubicados en los extremos de la jerarquía:&lt;br /&gt;
&lt;br /&gt;
* La información almacenada en el nivel 0 e intercambiada con el nivel 1.&lt;br /&gt;
* La información intercambiada entre el nivel 3 y el nivel 4.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Estructura_multinivel_de_la_red_interoperable.svg|centro|800x800px|Estructura multinivel de la red interoperable]]&lt;br /&gt;
&lt;br /&gt;
== Flujo de datos de eventos ==&lt;br /&gt;
&lt;br /&gt;
== Casos de uso de medios de pago ==&lt;br /&gt;
&lt;br /&gt;
== Seguridad en el envío de eventos ==&lt;br /&gt;
&lt;br /&gt;
== Especificación de los módulos de acceso seguro (SAM) ==&lt;br /&gt;
&lt;br /&gt;
== Resumen de los datos que deben ser asignados por el Registrar ==&lt;br /&gt;
&lt;br /&gt;
== Referencias ==&lt;br /&gt;
{{Listaref}}&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Archivo:Ciclo_de_vida_de_un_producto.svg&amp;diff=335</id>
		<title>Archivo:Ciclo de vida de un producto.svg</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Archivo:Ciclo_de_vida_de_un_producto.svg&amp;diff=335"/>
		<updated>2026-06-14T05:08:58Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: Trabajo propio subido con el Asistente de subidas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{es|1=Diagrama del ciclo de vida de un producto de un medio de pago del sistema de recaudo interoperable del Estado de Jalisco}}&lt;br /&gt;
|date=2020-08-10&lt;br /&gt;
|source={{own}}&lt;br /&gt;
|author=[[User:Nodo Central|Nodo Central]]&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{self|cc-zero}}&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Archivo:Ciclo_de_vida_de_la_aplicaci%C3%B3n_interoperable.svg&amp;diff=334</id>
		<title>Archivo:Ciclo de vida de la aplicación interoperable.svg</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Archivo:Ciclo_de_vida_de_la_aplicaci%C3%B3n_interoperable.svg&amp;diff=334"/>
		<updated>2026-06-14T05:07:46Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: Trabajo propio subido con el Asistente de subidas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{es|1=Diagrama del ciclo de vida de la aplicación interoperable del sistema de recaudo interoperable del Estado de Jalisco.}}&lt;br /&gt;
|date=2020-08-10&lt;br /&gt;
|source={{own}}&lt;br /&gt;
|author=[[User:Nodo Central|Nodo Central]]&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{self|cc-zero}}&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Riesgoso&amp;diff=333</id>
		<title>Plantilla:Riesgoso</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Riesgoso&amp;diff=333"/>
		<updated>2026-06-14T04:13:00Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Aviso&lt;br /&gt;
| tipo = serio&lt;br /&gt;
| imagen = Gnome-emblem-important.svg&lt;br /&gt;
| encabezado = Esta plantilla se transcluye en muchas páginas ([https://tools.wmflabs.org/templatecount/index.php?lang=es&amp;amp;namespace={{NAMESPACENUMBER:{{FULLPAGENAME}}}}&amp;amp;name={{urlencode:{{BASEPAGENAME}}}} aproximadamente {{{nombre}}}]).&lt;br /&gt;
| texto = Como incluso las ediciones triviales podrían causar una carga innecesaria en el servidor, por favor, pruebe los cambios en su zona de pruebas. Las pruebas pueden ser añadidas por los bibliotecarios en una sola edición.&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentación}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Listaref/doc/estilolista/n%C3%BAcleo&amp;diff=331</id>
		<title>Plantilla:Listaref/doc/estilolista/núcleo</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Listaref/doc/estilolista/n%C3%BAcleo&amp;diff=331"/>
		<updated>2026-06-14T04:13:00Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Subpágina de documentación}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;table-layout:fixed; width:12em; float:left; margin:2px;&amp;quot;&lt;br /&gt;
!{{{type|}}}{{{ref|}}}&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ol style=&amp;quot;list-style:{{{type|}}}&amp;quot;&amp;gt;&amp;lt;li&amp;gt;text&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;text&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;text&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;text&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;  style=&amp;quot;table-layout:fixed; width:50em; float:left; margin:2px; text-align:center; font-size:90%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Internet Explorer&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Firefox&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Safari&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Chrome&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | Opera&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;!---IE---&amp;gt;&lt;br /&gt;
| 6&lt;br /&gt;
| 7&lt;br /&gt;
| 8&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
&amp;lt;!---FF---&amp;gt;&lt;br /&gt;
| 3&lt;br /&gt;
| 4&lt;br /&gt;
| 5&lt;br /&gt;
&amp;lt;!---S---&amp;gt;&lt;br /&gt;
| 4&lt;br /&gt;
| 5&lt;br /&gt;
&amp;lt;!---C---&amp;gt;&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
&amp;lt;!---O---&amp;gt;&lt;br /&gt;
| 10&lt;br /&gt;
| 11&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| {{{{{ie6|yes}}}}}&lt;br /&gt;
| {{{{{ie7|yes}}}}}&lt;br /&gt;
| {{{{{ie8|yes}}}}}&lt;br /&gt;
| {{{{{ie9|yes}}}}}&lt;br /&gt;
| {{{{{ie10|yes}}}}}&lt;br /&gt;
| {{{{{ff3|yes}}}}}&lt;br /&gt;
| {{{{{ff4|yes}}}}}&lt;br /&gt;
| {{{{{ff5|yes}}}}}&lt;br /&gt;
| {{{{{s4|yes}}}}}&lt;br /&gt;
| {{{{{s5|yes}}}}}&lt;br /&gt;
| {{{{{c9|yes}}}}}&lt;br /&gt;
| {{{{{c10|yes}}}}}&lt;br /&gt;
| {{{{{c11|yes}}}}}&lt;br /&gt;
| {{{{{c12|yes}}}}}&lt;br /&gt;
| {{{{{o10|yes}}}}}&lt;br /&gt;
| {{{{{o11|yes}}}}}&lt;br /&gt;
| {{{{{o12|yes}}}}}&lt;br /&gt;
|}&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Categoría:Wikipedia:Plantillas de apoyo]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Listaref/doc/estilolista&amp;diff=329</id>
		<title>Plantilla:Listaref/doc/estilolista</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Listaref/doc/estilolista&amp;diff=329"/>
		<updated>2026-06-14T04:12:59Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;;CSS2.1 &amp;lt;code&amp;gt;list-style-type&amp;lt;/code&amp;gt; values&lt;br /&gt;
&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=none&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=disc&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=circle&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=square&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=decimal&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=decimal-leading-zero&lt;br /&gt;
|ie6=no&lt;br /&gt;
|ie7=no&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=lower-roman&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=upper-roman&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=lower-alpha&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=upper-alpha&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=lower-greek&lt;br /&gt;
|ie6=no&lt;br /&gt;
|ie7=no&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=armenian&lt;br /&gt;
|ie6=no&lt;br /&gt;
|ie7=no&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=georgian&lt;br /&gt;
|ie6=no&lt;br /&gt;
|ie7=no&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;CSS2 &amp;lt;code&amp;gt;list-style-type&amp;lt;/code&amp;gt; values dropped in CSS2.1 but still supported by some browsers&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=hebrew&lt;br /&gt;
|ie6=no&lt;br /&gt;
|ie7=no&lt;br /&gt;
|ie8=no&lt;br /&gt;
|ie9=no&lt;br /&gt;
|ie10=no&lt;br /&gt;
|o10=no&lt;br /&gt;
|o11=no&lt;br /&gt;
|o12=no&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=cjk-ideographic&lt;br /&gt;
|ie6=no&lt;br /&gt;
|ie7=no&lt;br /&gt;
|ie8=no&lt;br /&gt;
|ie9=no&lt;br /&gt;
|ie10=no&lt;br /&gt;
|o10=no&lt;br /&gt;
|o11=no&lt;br /&gt;
|o12=no&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=hiragana&lt;br /&gt;
|ie6=no&lt;br /&gt;
|ie7=no&lt;br /&gt;
|ie8=no&lt;br /&gt;
|ie9=no&lt;br /&gt;
|ie10=no&lt;br /&gt;
|o10=no&lt;br /&gt;
|o11=no&lt;br /&gt;
|o12=no&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=katakana&lt;br /&gt;
|ie6=no&lt;br /&gt;
|ie7=no&lt;br /&gt;
|ie8=no&lt;br /&gt;
|ie9=no&lt;br /&gt;
|ie10=no&lt;br /&gt;
|o10=no&lt;br /&gt;
|o11=no&lt;br /&gt;
|o12=no&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=hiragana-iroha&lt;br /&gt;
|ie6=no&lt;br /&gt;
|ie7=no&lt;br /&gt;
|ie8=no&lt;br /&gt;
|ie9=no&lt;br /&gt;
|ie10=no&lt;br /&gt;
|o10=no&lt;br /&gt;
|o11=no&lt;br /&gt;
|o12=no&lt;br /&gt;
}}&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=katakana-iroha&lt;br /&gt;
|ie6=no&lt;br /&gt;
|ie7=no&lt;br /&gt;
|ie8=no&lt;br /&gt;
|ie9=no&lt;br /&gt;
|ie10=no&lt;br /&gt;
|o10=no&lt;br /&gt;
|o11=no&lt;br /&gt;
|o12=no&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;CSS3 &amp;lt;code&amp;gt;list-style-type&amp;lt;/code&amp;gt; values (incomplete)&lt;br /&gt;
&lt;br /&gt;
CSS3 adds hundreds of new values, most not yet supported by major browsers&lt;br /&gt;
&lt;br /&gt;
{{Listaref/doc/estilolista/núcleo&lt;br /&gt;
|type=upper-greek&lt;br /&gt;
|ie6=no&lt;br /&gt;
|ie7=no&lt;br /&gt;
|ff3=no&lt;br /&gt;
|ff4=no&lt;br /&gt;
|ff5=no&lt;br /&gt;
|s4=no&lt;br /&gt;
|c4=no&lt;br /&gt;
|o10=no&lt;br /&gt;
|o11=no&lt;br /&gt;
|o12=no&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;[[Categoría:Wikipedia:Plantillas de apoyo]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Listaref/doc&amp;diff=327</id>
		<title>Plantilla:Listaref/doc</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Listaref/doc&amp;diff=327"/>
		<updated>2026-06-14T04:12:59Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Subpágina de documentación}}&lt;br /&gt;
{{riesgoso|nombre=1&amp;amp;nbsp;700&amp;amp;nbsp;000}}&lt;br /&gt;
=== Uso ===&lt;br /&gt;
&amp;lt;pre&amp;gt;{{listaref|2|ancho=600px|refs=|grupo=|estilolista=}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donde «2» corresponde al número de columnas y «xxx» es el ancho mínimo de cada columna.&lt;br /&gt;
&lt;br /&gt;
=== Parámetros ===&lt;br /&gt;
Todos los parámetros son opcionales.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;1&#039;&#039;&#039;: número de columnas. El número de columnas solo se aplica si la anchura del navegador lo permite. Es decir, si &amp;lt;code&amp;gt;n=2&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;ancho=600px&amp;lt;/code&amp;gt;, la plantilla generará dos columnas cuando la anchura de la ventana del navegador sea superior a 1200 píxeles, y solo una única columna cuando la anchura sea inferior. &#039;&#039;&#039;No se recomienda más de 2 columnas&#039;&#039;&#039;. Las listas con números superiores suelen resultar más largas y entrecortar varias veces una misma referencia.&lt;br /&gt;
* &#039;&#039;&#039;ancho&#039;&#039;&#039;: ancho de las columnas.&lt;br /&gt;
* &#039;&#039;&#039;refs&#039;&#039;&#039;: dentro de las referencias se coloca:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{listaref|grupo=&amp;quot;nombre del grupo&amp;quot;|refs=&lt;br /&gt;
&amp;lt;ref name=&amp;quot;nombre1&amp;quot;&amp;gt;contenido1&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;nombre2&amp;quot;&amp;gt;contenido2&amp;lt;/ref&amp;gt;&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Así, estas referencias pueden ser invocadas en el artículo como:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;ref group=&amp;quot;nombre_del_grupo&amp;quot; name=&amp;quot;nombre1&amp;quot; /&amp;gt;&amp;lt;ref group=&amp;quot;nombre_del_grupo&amp;quot; name=&amp;quot;nombre2&amp;quot; /&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;estilolista&#039;&#039;&#039;: permite especificar el estilo de las viñetas de las referencias. Haz clic en [mostrar] en el cuadro que se muestra a continuación para ver una tabla con las viñetas disponibles y su compatibilidad con los distintos navegadores.&lt;br /&gt;
&lt;br /&gt;
{{Lista desplegable&lt;br /&gt;
|título=Tipos de estilos de lista&lt;br /&gt;
|título_estilo=width: 60%; margin: 0.5em; background:#DDE; text-align: center;&lt;br /&gt;
|1={{Listaref/doc/estilolista}}}}&lt;br /&gt;
&lt;br /&gt;
=== Referencias por grupo ===&lt;br /&gt;
El sistema de notas al pie permite la separación de las referencias en grupos. Los grupos permiten tener separadas las notas de las referencias, entre otros usos.&lt;br /&gt;
&lt;br /&gt;
El formato general para una etiqueta de referencia de grupo es:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;ref group=&amp;quot;nombre del grupo&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
y para la plantilla de lista de referencias:&lt;br /&gt;
&lt;br /&gt;
: {{ep|listaref|2=grupo=&amp;quot;nombre del grupo&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
:Donde &amp;lt;nombre del grupo&amp;gt; es el identificador del grupo, como por ejemplo «nota», «n.» o cualquier otro nombre.&lt;br /&gt;
&lt;br /&gt;
=== Ejemplo sencillo de referencias por grupo ===&lt;br /&gt;
El código siguiente muestra un ejemplo sencillo de cómo deben colocarse en el código de un texto las llamadas a la orden &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;ref group=nota&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; para que funcionen correctamente:&lt;br /&gt;
{|class=&amp;quot;wikitable mw-collapsible&amp;quot; width=80%&lt;br /&gt;
!Código:&lt;br /&gt;
!Resultado:&lt;br /&gt;
|-&lt;br /&gt;
|width=50%|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
==Ejemplo sencillo de cómo colocar notas==&lt;br /&gt;
La primera nota la voy a introducir aquí.&amp;lt;ref group=nota&amp;gt;Esta es la primera nota, en efecto.&amp;lt;/ref&amp;gt; Luego sigo escribiendo, y un poco más adelante, coloco la segunda nota.&amp;lt;ref group=nota&amp;gt;Esta es la segunda nota, no falla.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora, en vez de notas, voy a llamarlas aclaraciones.&amp;lt;ref group=aclar.&amp;gt;Esta es la primera aclaración, en efecto.&amp;lt;/ref&amp;gt; Y por si no queda claro, se introduce otra aclaración más.&amp;lt;ref group=aclar.&amp;gt;Esta es la segunda aclaración, inexorablemente.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por último, pongo una tercera nota.&amp;lt;ref group=nota&amp;gt;Esta es la tercera nota, la última.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al final del artículo, debe ponerse la llamada a las anotaciones que se hayan hecho. &lt;br /&gt;
&lt;br /&gt;
== Notas ==&lt;br /&gt;
{{listaref|group=nota}}&lt;br /&gt;
&lt;br /&gt;
== Aclaraciones ==&lt;br /&gt;
{{listaref|group=aclar.}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|width=50% style=&amp;quot;font-size:99%;line-height:99%;&amp;quot; valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:-1%;font-family:Linux Libertine;font-size:160%;&amp;quot;&amp;gt;Ejemplo sencillo de cómo colocar notas&amp;lt;/span&amp;gt; [&amp;lt;small&amp;gt;&amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt; editar código · editar &amp;lt;/span&amp;gt;&amp;lt;/small&amp;gt;]&lt;br /&gt;
----&lt;br /&gt;
La primera nota la voy a introducir aquí.&amp;lt;sup&amp;gt;&amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;nota 1&amp;lt;/span&amp;gt;&amp;lt;/sup&amp;gt; Luego sigo escribiendo, y un poco más adelante, coloco la segunda nota.&amp;lt;sup&amp;gt;&amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;nota 2&amp;lt;/span&amp;gt;&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ahora, en vez de notas, voy a llamarlas aclaraciones.&amp;lt;sup&amp;gt;&amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;aclar. 1&amp;lt;/span&amp;gt;&amp;lt;/sup&amp;gt; Y por si no queda claro, se introduce otra aclaración más.&amp;lt;sup&amp;gt;&amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;aclar. 2&amp;lt;/span&amp;gt;&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por último, pongo una tercera nota.&amp;lt;sup&amp;gt;&amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;nota 3&amp;lt;/span&amp;gt;&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al final del artículo, debe ponerse la llamada a las anotaciones que se hayan hecho.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:-1%;font-family:Linux Libertine;font-size:160%;&amp;quot;&amp;gt;Notas&amp;lt;/span&amp;gt; [&amp;lt;small&amp;gt;&amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt; editar código · editar &amp;lt;/span&amp;gt;&amp;lt;/small&amp;gt;]&lt;br /&gt;
----&lt;br /&gt;
:1. &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;↑&amp;lt;/span&amp;gt; Esta es la primera nota, en efecto.&lt;br /&gt;
:2. &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;↑&amp;lt;/span&amp;gt; Esta es la segunda nota, no falla.&lt;br /&gt;
:3. &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;↑&amp;lt;/span&amp;gt; Esta es la tercera nota, la última.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:-1%;font-family:Linux Libertine;font-size:160%;&amp;quot;&amp;gt;Aclaraciones&amp;lt;/span&amp;gt; [&amp;lt;small&amp;gt;&amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt; editar código · editar &amp;lt;/span&amp;gt;&amp;lt;/small&amp;gt;]&lt;br /&gt;
----&lt;br /&gt;
:1. &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;↑&amp;lt;/span&amp;gt; Esta es la primera aclaración, en efecto.&lt;br /&gt;
:2. &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;↑&amp;lt;/span&amp;gt; Esta es la segunda aclaración, inexorablemente.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=2|(&#039;&#039;&#039;&#039;&#039;NOTA:&#039;&#039;&#039; en una página normal, los enlaces de color azul funcionarían normalmente; en este caso, solo sirven como una imagen del resultado que se debe obtener)&#039;&#039;&lt;br /&gt;
(&#039;&#039;&#039;&#039;&#039;NOTA:&#039;&#039;&#039; si la página contiene también referencias &#039;&#039;normales&#039;&#039;, el comando {{ep|listaref}} debe &#039;&#039;&#039;COLOCARSE POR DELANTE&#039;&#039;&#039; de &amp;lt;nowiki&amp;gt;{{listaref|group=nota}}&amp;lt;/nowiki&amp;gt; )&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Detalles técnicos ===&lt;br /&gt;
Las columnas múltiples se generan mediante las propiedades del módulo CSS Multi-column Layout, parte de las especificaciones de CSS. Este módulo está ampliamente soportado por los principales navegadores modernos, por lo que las páginas que utilicen estas propiedades pueden mostrar contenido distribuido en varias columnas cuando el navegador es compatible.&amp;lt;ref&amp;gt;{{cita web|url=https://caniuse.com/multicolumn|título=CSS Multi-column Layout – Can I Use|fechaacceso=5 de diciembre de 2025}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{cita web|url=https://www.w3.org/TR/css-multicol-1/|título=CSS Multi-column Layout Module Level 1|editorial=W3C|fechaacceso=5 de diciembre de 2025}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Véase también ===&lt;br /&gt;
* [[Wikipedia:Referencias]]&lt;br /&gt;
* [[Plantilla:Harvnp|Harvnp]], sistema de citas de Harvard&lt;br /&gt;
&lt;br /&gt;
=== Referencias ===&lt;br /&gt;
{{listaref}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Categoría:Wikipedia:Plantillas de listas]]&lt;br /&gt;
[[Categoría:Wikipedia:Plantillas de referencias]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Número de columnas. El número de columnas solo se aplica si la anchura del navegador lo permite. No se recomienda más de 2 columnas.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;,&lt;br /&gt;
			&amp;quot;default&amp;quot;: &amp;quot;2&amp;quot;,&lt;br /&gt;
			&amp;quot;suggested&amp;quot;: true&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;ancho&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;colwidth&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Ancho de las columnas. Puede ser en [[píxel|píxeles]] (600px) o ems (30em).&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;600px&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;number&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;estilolista&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;liststyle&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Permite especificar el estilo de las viñetas de las referencias. Ver la documentación para todas las posibilidades.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;none, disc, circle, square, decimal, lower-roman...&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;grupo&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;group&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Permite la separación de las referencias en grupos. Hay que incluir las comillas.&amp;quot;,&lt;br /&gt;
			&amp;quot;example&amp;quot;: &amp;quot;\&amp;quot;nota\&amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;refs&amp;quot;: {&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Dentro de las referencias se coloca: &amp;lt;ref name=\&amp;quot;nombre1\&amp;quot;&amp;gt;contenido1&amp;lt;/ref&amp;gt;; &amp;lt;ref name=\&amp;quot;nombre2\&amp;quot;&amp;gt;contenido2&amp;lt;/ref&amp;gt;...&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;unbalanced-wikitext&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;ancho&amp;quot;,&lt;br /&gt;
		&amp;quot;refs&amp;quot;,&lt;br /&gt;
		&amp;quot;grupo&amp;quot;,&lt;br /&gt;
		&amp;quot;estilolista&amp;quot;&lt;br /&gt;
	],&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;inline&amp;quot;,&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Esta plantilla se utiliza para poder visualizar las referencias colocadas en el artículo.&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Yes&amp;diff=325</id>
		<title>Plantilla:Yes</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Yes&amp;diff=325"/>
		<updated>2026-06-14T04:12:59Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Plantilla:Sí]]&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:S%C3%AD&amp;diff=323</id>
		<title>Plantilla:Sí</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:S%C3%AD&amp;diff=323"/>
		<updated>2026-06-14T04:12:58Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Archivo:Yes_check.svg|{{{2|15px}}}|link=|Sí]]&amp;amp;nbsp;&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;{{{1|{{leng|1=es|2=Sí|3=Yes}}}}}&amp;lt;/span&amp;gt;&amp;lt;noinclude&amp;gt;{{documentación}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Documentaci%C3%B3n/caja_final&amp;diff=321</id>
		<title>Plantilla:Documentación/caja final</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Documentaci%C3%B3n/caja_final&amp;diff=321"/>
		<updated>2026-06-14T04:12:58Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;template-documentation&amp;quot; style=&amp;quot;font-style: italic&amp;quot;&amp;gt;{{#ifexist:{{{1|{{FULLPAGENAME}}/doc}}}|Esta documentación está [[Wikipedia:Transclusión|transcluida]] desde [[{{{1|{{FULLPAGENAME}}/doc}}}]].&amp;lt;br /&amp;gt;}} {{#ifeq: {{SUBPAGENAME}} | zona de pruebas | | Los editores pueden experimentar en la {{#ifexist: {{FULLPAGENAME}}/zona de pruebas | [[{{FULLPAGENAME}}/zona de pruebas|zona de pruebas]] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;&amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{FULLPAGENAME}}/zona de pruebas | action=edit }} editar])&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt; | zona de pruebas &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;&amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{FULLPAGENAME}}/zona de pruebas | action=edit&amp;amp;preload=Plantilla:Documentación/precarga-zona_de_pruebas }} crear])&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt; }} y en los {{#ifexist: {{FULLPAGENAME}}/casos de prueba | [[{{FULLPAGENAME}}/casos de prueba|casos de prueba]] &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;&amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{FULLPAGENAME}}/casos de prueba | action=edit }} editar])&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt; | casos de prueba &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;&amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{FULLPAGENAME}}/casos de prueba | action=edit&amp;amp;preload=Plantilla:Documentación/precarga-casos_de_prueba }} crear])&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt;}} {{#switch: {{SUBJECTSPACE}} | {{ns:828}} = del módulo | #default = de la plantilla}}.&amp;lt;br /&amp;gt;}} Por favor, añade las categorías en la subpágina de documentación. [[Special:PrefixIndex/{{{template page|{{FULLPAGENAME}}}}}/|Subpáginas de {{#switch: {{SUBJECTSPACE}} | {{ns:828}} = este módulo | #default = esta plantilla}}]].&amp;lt;/div&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;!-- Cierre de Plantilla:Documentación/caja_inicial --&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Subp%C3%A1gina_de_documentaci%C3%B3n&amp;diff=319</id>
		<title>Plantilla:Subpágina de documentación</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Subp%C3%A1gina_de_documentaci%C3%B3n&amp;diff=319"/>
		<updated>2026-06-14T04:12:57Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;__NOTOC__{{#ifeq: {{lc:{{SUBPAGENAME}}}} | doc&lt;br /&gt;
| &amp;lt;!-- Página de documentación --&amp;gt;&amp;lt;/includeonly&amp;gt;{{Aviso&lt;br /&gt;
| imagen = Commons-emblem-doc.svg&lt;br /&gt;
| encabezado = Esta es la subpágina de documentación para [[{{NAMESPACE}}:{{{1|{{BASEPAGENAME}}}}}]].&lt;br /&gt;
| texto = Contiene información de uso, [[Ayuda:Categoría|categorías]] y otros contenidos que no forman parte {{#switch:{{NAMESPACE}}|Plantilla=de la plantilla original|{{ns:828}}=del módulo|de la página original}}.&lt;br /&gt;
}}[[Categoría:Wikipedia:Indicaciones para el uso de {{#switch:{{NAMESPACE}}|{{ns:Module}}=módulo|#default=plantillas}}&amp;lt;noinclude&amp;gt;| &amp;lt;/noinclude&amp;gt;]]&amp;lt;includeonly&amp;gt;{{#ifexist:{{NAMESPACE}}:{{{1|{{BASEPAGENAME}}}}}||[[Categoría:Wikipedia:Documentaciones sin {{#switch:{{NAMESPACE}}|{{ns:Module}}=módulo|#default=plantilla}}]]}}&lt;br /&gt;
| &amp;lt;!-- Si no está en una subpágina /doc, no hacer nada --&amp;gt;&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentación}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Historial&amp;diff=317</id>
		<title>Plantilla:Historial</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Historial&amp;diff=317"/>
		<updated>2026-06-14T04:12:57Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[//es.wikipedia.org/w/index.php?title={{urlencode:{{{1|PAGENAMEE}}}}}&amp;amp;action=history {{{2|historial}}}]&amp;lt;/span&amp;gt;&amp;lt;noinclude&amp;gt;{{documentación}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Documentaci%C3%B3n/caja_inicial&amp;diff=315</id>
		<title>Plantilla:Documentación/caja inicial</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Documentaci%C3%B3n/caja_inicial&amp;diff=315"/>
		<updated>2026-06-14T04:12:57Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
  Formato de la caja de color&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;template-documentation&amp;quot; class=&amp;quot;template-documentation&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
  Título de la caja:&lt;br /&gt;
--&amp;gt;{{#ifeq: {{{título|¬}}} | &amp;lt;!-- «título=», definido pero vacío --&amp;gt;&lt;br /&gt;
| &amp;lt;!--sin título --&amp;gt;&lt;br /&gt;
| &amp;lt;div style=&amp;quot;padding-bottom: 3px; border-bottom: 1px solid #aaa; margin-bottom: 1ex;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;{{#if: {{{estilo-título|}}}&lt;br /&gt;
  | {{{estilo-título|}}}&lt;br /&gt;
  | {{#switch: {{SUBJECTSPACE}}&lt;br /&gt;
    | {{ns:10}} | {{ns:828}} = font-weight: bold; font-size: 125%&lt;br /&gt;
    | #default = font-size: 150%&lt;br /&gt;
    }}&lt;br /&gt;
  }}&amp;quot;&amp;gt;{{#if: {{{título|}}}&lt;br /&gt;
        | {{{título}}}&lt;br /&gt;
        | {{#switch: {{SUBJECTSPACE}}&lt;br /&gt;
            | {{ns:6}} = Resumen&lt;br /&gt;
            | {{ns:10}} = [[Archivo:Documentation-plain.svg|50px|link=|alt=Icono de documentación de plantilla]] Documentación de la plantilla&lt;br /&gt;
            | {{ns:828}} = [[Archivo:Documentation-plain.svg|50px|link=|alt=Icono de documentación de módulo]] Documentación del módulo&lt;br /&gt;
            | #default = Documentación&lt;br /&gt;
          }}&lt;br /&gt;
      }}&amp;lt;/span&amp;gt;{{&lt;br /&gt;
  #if: {{{contenido|}}}&lt;br /&gt;
  |&lt;br /&gt;
  &amp;lt;span class=&amp;quot;mw-editsection-like plainlinks&amp;quot; id=&amp;quot;doc_editlinks&amp;quot;&amp;gt;&lt;br /&gt;
{{{contenido}}}&amp;lt;/span&amp;gt;&lt;br /&gt;
  | &amp;lt;!--Enlaces en el encabezamiento [ver][editar][historial]... o [crear]--&amp;gt;&lt;br /&gt;
    &amp;lt;span class=&amp;quot;mw-editsection-like plainlinks&amp;quot; id=&amp;quot;doc_editlinks&amp;quot;&amp;gt;{{&lt;br /&gt;
    #ifexist:{{{1|{{FULLPAGENAME}}/doc}}}&lt;br /&gt;
    | [[{{fullurl:{{{1|{{FULLPAGENAME}}/doc}}}}} ver]] [{{editar|{{{1|{{FULLPAGENAME}}/doc}}}}}] [{{historial|{{{1|{{FULLPAGENAME}}/doc}}}}}] [{{purgar|página={{{1|{{FULLPAGENAME}}/doc}}}}}]&lt;br /&gt;
    | &amp;lt;!-- No existe la página de documentación --&amp;gt;&lt;br /&gt;
      [[{{fullurl:{{{1|{{FULLPAGENAME}}/doc}}}|action=edit&amp;amp;preload={{#switch: {{SUBJECTSPACE}}&amp;lt;!-- &lt;br /&gt;
               --&amp;gt;| {{ns:828}} = {{urlencode:Plantilla:Documentación/precarga módulo}}&amp;lt;!-- Precarga para módulos Lua&lt;br /&gt;
               --&amp;gt;| #default = {{urlencode:Plantilla:Documentación/precarga}}&amp;lt;!-- Precarga para plantillas y pseudoplantillas&lt;br /&gt;
           --&amp;gt;}} }} crear]]}}&amp;lt;/span&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&amp;lt;!-- final de la caja --&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta subplantilla de {{ep|documentación}} genera el formato de la caja de color con un título y enlaces en el encabezado en la página de documentación.&lt;br /&gt;
&lt;br /&gt;
[[Categoría:Wikipedia:Plantillas de apoyo]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Documentaci%C3%B3n&amp;diff=313</id>
		<title>Plantilla:Documentación</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Documentaci%C3%B3n&amp;diff=313"/>
		<updated>2026-06-14T04:12:56Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{Documentación/caja inicial|{{{1|{{FULLPAGENAME}}/doc}}}}}&lt;br /&gt;
{{#ifexist: {{{1|{{FULLPAGENAME}}/doc}}}&lt;br /&gt;
  | __NOEDITSECTION__{{ {{{1|{{FULLPAGENAME}}/doc}}}|ns:0 }}&lt;br /&gt;
  | {{documentación deficiente|0}}&lt;br /&gt;
}}&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Documentación/caja final|{{{1|{{FULLPAGENAME}}/doc}}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{documentación}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Editar&amp;diff=311</id>
		<title>Plantilla:Editar</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Editar&amp;diff=311"/>
		<updated>2026-06-14T04:12:56Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;plainlinks noprint&amp;quot;&amp;gt;[{{SERVER}}{{localurl:{{{1|{{FULLPAGENAME}}}}}|{{#if:{{{visual|}}}|ve}}action=edit{{{3|}}}{{#if:{{{intro|}}}|&amp;amp;editintro={{{intro}}}}}}} {{#if:{{{2|}}}|{{{2}}}|{{#ifeq:{{int:edit}}|Editar|editar|{{int:edit}}}}}}]&amp;lt;/span&amp;gt;&amp;lt;noinclude&amp;gt;{{documentación}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Purgar&amp;diff=309</id>
		<title>Plantilla:Purgar</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Purgar&amp;diff=309"/>
		<updated>2026-06-14T04:12:56Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;noprint plainlinks purgelink&amp;quot;&amp;gt;[{{fullurl:{{{página|{{{page|{{FULLPAGENAME}}}}}}}}|action=purge}} &amp;lt;span title=&amp;quot;Purga esta página&amp;quot;&amp;gt;{{{1|{{leng|1=es|2=purgar|3=purge}}}}}&amp;lt;/span&amp;gt;]&amp;lt;/span&amp;gt;&amp;lt;noinclude&amp;gt;{{documentación}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Clear&amp;diff=307</id>
		<title>Plantilla:Clear</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Clear&amp;diff=307"/>
		<updated>2026-06-14T04:12:56Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;clear: {{{1|both}}};&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;noinclude&amp;gt;{{documentación}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:No&amp;diff=305</id>
		<title>Plantilla:No</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:No&amp;diff=305"/>
		<updated>2026-06-14T04:12:56Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Archivo:X mark.svg|{{{2|15px}}}|link=|No]]&amp;amp;nbsp;&amp;lt;span style=&amp;quot;font-weight: bold;&amp;quot;&amp;gt;{{{1|No}}}&amp;lt;/span&amp;gt;&amp;lt;noinclude&amp;gt;{{documentación}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Ep&amp;diff=303</id>
		<title>Plantilla:Ep</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Ep&amp;diff=303"/>
		<updated>2026-06-14T04:12:56Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code&amp;gt;{{[[{{#switch: {{NAMESPACE:{{{1|{{FULLPAGENAME}}}}}}}&lt;br /&gt;
          | {{ns:0}}  = Plantilla:{{{1|{{FULLPAGENAME}}}}}{{!}}{{{1|{{FULLPAGENAME}}}}}&lt;br /&gt;
          | {{ns:10}} = {{{1|{{FULLPAGENAME}}}}}{{!}}{{PAGENAME:{{{1|{{FULLPAGENAME}}}}}}}&lt;br /&gt;
          | #default  = {{{1|{{FULLPAGENAME}}}}}&lt;br /&gt;
        }}]]&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{2|}}}|&amp;amp;#124;{{{2}}}}}{{#if:{{{3|}}}|&amp;amp;#124;{{{3}}}}}{{#if:{{{4|}}}|&amp;amp;#124;{{{4}}}}}{{#if:{{{5|}}}|&amp;amp;#124;{{{5}}}}}{{#if:{{{6|}}}|&amp;amp;#124;{{{6}}}}}{{#if:{{{7|}}}|&amp;amp;#124;{{{7}}}}}{{#if:{{{8|}}}|&amp;amp;#124;{{{8}}}}}{{#if:{{{9|}}}|&amp;amp;#124;{{{9}}}}}}}&amp;lt;/code&amp;gt;&amp;lt;noinclude&amp;gt;{{documentación}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Leng&amp;diff=301</id>
		<title>Plantilla:Leng</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Leng&amp;diff=301"/>
		<updated>2026-06-14T04:12:56Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#switch:{{uc:{{{1|}}}}}&lt;br /&gt;
|ESP=&lt;br /&gt;
 {{#switch:{{USERLANGUAGE}}&lt;br /&gt;
 |es|ca|an|gl|eu={{{2|}}}&lt;br /&gt;
 |#default={{{3|}}}&lt;br /&gt;
 }}&lt;br /&gt;
|#default=&lt;br /&gt;
 {{#ifeq:{{lc:{{USERLANGUAGE}}}}|{{lc:{{{1|}}}}}&lt;br /&gt;
 |&amp;lt;span lang=&amp;quot;{{lc:{{{1|}}}}}&amp;quot; xml:lang=&amp;quot;{{lc:{{{1|}}}}}&amp;quot;&amp;gt;{{{2|}}}&amp;lt;/span&amp;gt;&lt;br /&gt;
 |{{{3|}}}&lt;br /&gt;
 }}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentación}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=M%C3%B3dulo:Identificadores&amp;diff=299</id>
		<title>Módulo:Identificadores</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=M%C3%B3dulo:Identificadores&amp;diff=299"/>
		<updated>2026-06-14T04:12:56Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
ISBN-10 and ISSN validator code calculates checksum across all isbn/issn digits including the check digit. ISBN-13 is checked in checkisbn().&lt;br /&gt;
If the number is valid the result will be 0. Before calling this function, issbn/issn must be checked for length and stripped of dashes,&lt;br /&gt;
spaces and other non-isxn characters.&lt;br /&gt;
]]&lt;br /&gt;
-- Función traída de en:Module:Citation/CS1&lt;br /&gt;
&lt;br /&gt;
function p.esValidoISXN (isxn_str, len)&lt;br /&gt;
	local temp = 0;&lt;br /&gt;
	isxn_str = { isxn_str:byte(1, len) };	-- make a table of bytes&lt;br /&gt;
	len = len+1;							-- adjust to be a loop counter&lt;br /&gt;
	for i, v in ipairs( isxn_str ) do		-- loop through all of the bytes and calculate the checksum&lt;br /&gt;
		if v == string.byte( &amp;quot;X&amp;quot; ) then		-- if checkdigit is X&lt;br /&gt;
			temp = temp + 10*( len - i );	-- it represents 10 decimal&lt;br /&gt;
		else&lt;br /&gt;
			temp = temp + tonumber( string.char(v) )*(len-i);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return temp % 11 == 0;					-- returns true if calculation result is zero&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Adaptación de la función checkisbn de en:Module:Citation/CS1&lt;br /&gt;
function p.esValidoISBN(isbn)&lt;br /&gt;
	-- El isbn solo contiene números, guiones, espacios en blanco y el dígito de &lt;br /&gt;
	-- control X.&lt;br /&gt;
	&lt;br /&gt;
	if not isbn or isbn:match(&amp;quot;[^%s-0-9X]&amp;quot;)  then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Eliminar los guiones y espacios en blanco&lt;br /&gt;
	&lt;br /&gt;
	isbn = isbn:gsub( &amp;quot;-&amp;quot;, &amp;quot;&amp;quot; ):gsub( &amp;quot; &amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
	local longitud = isbn:len()&lt;br /&gt;
 &lt;br /&gt;
	if longitud == 10 then&lt;br /&gt;
		-- La X solo puede ir al final.&lt;br /&gt;
		if not isbn:match( &amp;quot;^%d*X?$&amp;quot; ) then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		return p.esValidoISXN(isbn, 10);&lt;br /&gt;
	elseif longitud == 13 then -- isbn13&lt;br /&gt;
		local temp = 0;&lt;br /&gt;
		-- Debe comenzar por 978 o 979&lt;br /&gt;
		if not isbn:match( &amp;quot;^97[89]%d*$&amp;quot; ) then &lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Comprobar el dígito de control&lt;br /&gt;
		isbn = { isbn:byte(1, longitud) };&lt;br /&gt;
		for i, v in ipairs( isbn ) do&lt;br /&gt;
			temp = temp + (3 - 2*(i % 2)) * tonumber( string.char(v) );&lt;br /&gt;
		end&lt;br /&gt;
		return temp % 10 == 0;&lt;br /&gt;
	else&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Función que devuelve un enlace al ISBN si es correcto y si no (por ejemplo si&lt;br /&gt;
-- ya está enlazado) lo devuelve sin más.&lt;br /&gt;
-- Por defecto no se incluye el literal ISBN delante.&lt;br /&gt;
&lt;br /&gt;
function p.enlazarISBN(isbn, opciones)&lt;br /&gt;
    if p.esValidoISBN(isbn) then&lt;br /&gt;
        return &#039;[[Especial:FuentesDeLibros/&#039; .. isbn .. &#039;|&#039; .. isbn .. &#039;]]&#039;&lt;br /&gt;
    else&lt;br /&gt;
    	return isbn&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.enlazarOCLC(oclc, opciones)&lt;br /&gt;
    if tonumber(oclc) then&lt;br /&gt;
        return &#039;[http://www.worldcat.org/oclc/&#039; .. oclc .. &#039; &#039; .. oclc .. &#039;]&#039;&lt;br /&gt;
    else&lt;br /&gt;
    	return oclc&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=M%C3%B3dulo:Citas/Validaci%C3%B3nFechas&amp;diff=297</id>
		<title>Módulo:Citas/ValidaciónFechas</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=M%C3%B3dulo:Citas/Validaci%C3%B3nFechas&amp;diff=297"/>
		<updated>2026-06-14T04:12:56Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- returns a number according to the month in a date: 1 for January, etc.  Capitalization and spelling must be correct. If not a valid month, returns 0&lt;br /&gt;
function get_month_number (month)&lt;br /&gt;
local long_months = {[&#039;January&#039;]=1, [&#039;February&#039;]=2, [&#039;March&#039;]=3, [&#039;April&#039;]=4, [&#039;May&#039;]=5, [&#039;June&#039;]=6, [&#039;July&#039;]=7, [&#039;August&#039;]=8, [&#039;September&#039;]=9, [&#039;October&#039;]=10, [&#039;November&#039;]=11, [&#039;December&#039;]=12};&lt;br /&gt;
local short_months = {[&#039;Jan&#039;]=1, [&#039;Feb&#039;]=2, [&#039;Mar&#039;]=3, [&#039;Apr&#039;]=4, [&#039;May&#039;]=5, [&#039;Jun&#039;]=6, [&#039;Jul&#039;]=7, [&#039;Aug&#039;]=8, [&#039;Sep&#039;]=9, [&#039;Oct&#039;]=10, [&#039;Nov&#039;]=11, [&#039;Dec&#039;]=12};&lt;br /&gt;
local temp;&lt;br /&gt;
	temp=long_months[month];&lt;br /&gt;
	if temp then return temp; end				-- if month is the long-form name&lt;br /&gt;
	temp=short_months[month];&lt;br /&gt;
	if temp then return temp; end				-- if month is the short-form name&lt;br /&gt;
	return 0;									-- misspelled, improper case, or not a month name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- returns a number according to the sequence of seasons in a year: 1 for Winter, etc.  Capitalization and spelling must be correct. If not a valid season, returns 0&lt;br /&gt;
function get_season_number (season)&lt;br /&gt;
local season_list = {[&#039;Winter&#039;]=1, [&#039;Spring&#039;]=2, [&#039;Summer&#039;]=3, [&#039;Fall&#039;]=4, [&#039;Autumn&#039;]=4}&lt;br /&gt;
local temp;&lt;br /&gt;
	temp=season_list[season];&lt;br /&gt;
	if temp then return temp; end				-- if season is a valid name return its number&lt;br /&gt;
	return 0;									-- misspelled, improper case, or not a season name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--returns true if month or season is valid (properly spelled, capitalized, abbreviated)&lt;br /&gt;
function is_valid_month_or_season (month_season)&lt;br /&gt;
	if 0 == get_month_number (month_season) then		-- if month text isn&#039;t one of the twelve months, might be a season&lt;br /&gt;
		if 0 == get_season_number (month_season) then	-- not a month, is it a season?&lt;br /&gt;
			return false;								-- return false not a month or one of the five seasons&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Function gets current year from the server and compares it to year from a citation parameter.  Years more than one year in the future are not acceptable.&lt;br /&gt;
function is_valid_year(year)&lt;br /&gt;
	if not is_set(year_limit) then&lt;br /&gt;
		year_limit = tonumber(os.date(&amp;quot;%Y&amp;quot;))+1;	-- global variable so we only have to fetch it once (os.date(&amp;quot;Y&amp;quot;) no longer works?)&lt;br /&gt;
	end&lt;br /&gt;
	return tonumber(year) &amp;lt;= year_limit;			-- false if year is in the future more than one year&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Returns true if day is less than or equal to the number of days in month and year is no farther into the future than next year; else returns false.&lt;br /&gt;
&lt;br /&gt;
Assumes Julian calendar prior to year 1582 and Gregorian calendar thereafter. Accounts for Julian calendar leap years before 1582 and Gregorian leap years after 1582.&lt;br /&gt;
Where the two calendars overlap (1582 to approximately 1923) dates are assumed to be Gregorian.&lt;br /&gt;
]]&lt;br /&gt;
function is_valid_date (year, month, day)&lt;br /&gt;
local days_in_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};&lt;br /&gt;
local month_length;&lt;br /&gt;
	if not is_valid_year(year) then	-- no farther into the future than next year&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if (2==month) then							-- if February&lt;br /&gt;
		month_length = 28;						-- then 28 days unless&lt;br /&gt;
		if 1582 &amp;gt; tonumber(year) then			-- Julian calendar&lt;br /&gt;
			if 0==(year%4) then&lt;br /&gt;
				month_length = 29;&lt;br /&gt;
			end&lt;br /&gt;
		else									-- Gregorian calendar&lt;br /&gt;
			if (0==(year%4) and (0~=(year%100) or 0==(year%400))) then	-- is a leap year?&lt;br /&gt;
				month_length = 29;				-- if leap year then 29 days in February&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		month_length=days_in_month[month];&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if tonumber (day) &amp;gt; month_length then&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	return true;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Check a pair of months or seasons to see if both are valid members of a month or season pair.&lt;br /&gt;
&lt;br /&gt;
Month pairs are expected to be left to right, earliest to latest in time.  Similarly, seasons are also left to right, earliest to latest in time.  There is&lt;br /&gt;
an oddity with seasons.  Winter is assigned a value of 1, spring 2, ..., fall and autumn 4.  Because winter can follow fall/autumn at the end of a calender year, a special test&lt;br /&gt;
is made to see if |date=Fall-Winter yyyy (4-1) is the date.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
function is_valid_month_season_range(range_start, range_end)&lt;br /&gt;
	local range_start_number = get_month_number (range_start);&lt;br /&gt;
	&lt;br /&gt;
	if 0 == range_start_number then								-- is this a month range?&lt;br /&gt;
		local range_start_number = get_season_number (range_start);		-- not a month; is it a season? get start season number&lt;br /&gt;
		local range_end_number = get_season_number (range_end);			-- get end season number&lt;br /&gt;
&lt;br /&gt;
		if 0 ~= range_start_number then							-- is start of range a season?&lt;br /&gt;
			if range_start_number &amp;lt; range_end_number then		-- range_start is a season&lt;br /&gt;
				return true;									-- return true when range_end is also a season and follows start season; else false&lt;br /&gt;
			end&lt;br /&gt;
			if 4 == range_start_number and 1 == range_end_number then	-- special case when range is Fall-Winter or Autumn-Winter&lt;br /&gt;
				return true;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false;		-- range_start is not a month or a season; or range_start is a season and range_end is not; or improper season sequence&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local range_end_number = get_month_number (range_end);		-- get end month number&lt;br /&gt;
	if range_start_number &amp;lt; range_end_number then				-- range_start is a month; does range_start precede range_end?&lt;br /&gt;
		return true;											-- if yes, return true&lt;br /&gt;
	end&lt;br /&gt;
	return false;												-- range_start month number is greater than or equal to range end number; or range end isn&#039;t a month&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Check date format to see that it is one of the formats approved by WP:DATESNO or WP:DATERANGE. Exception: only allowed range separator is endash.&lt;br /&gt;
Additionally, check the date to see that it is a real date: no 31 in 30-day months; no 29 February when not a leap year.  Months, both long-form and three&lt;br /&gt;
character abbreviations, and seasons must be spelled correctly. Future years beyond next year are not allowed.&lt;br /&gt;
&lt;br /&gt;
If the date fails the fomat tests, this function returns false and does not return values for anchor_year and COinS_date.  When this happens, the date parameter is&lt;br /&gt;
used in the COinS metadata and the CITEREF identifier gets its year from the year parameter if present otherwise CITEREF does not get a date value.&lt;br /&gt;
&lt;br /&gt;
Inputs:&lt;br /&gt;
	date_string - date string from date-holding parameters (date, year, accessdate, embargo, archivedate, etc)&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
	false if date string is not a real date; else&lt;br /&gt;
	true, anchor_year, COinS_date&lt;br /&gt;
		anchor_year can be used in CITEREF anchors&lt;br /&gt;
		COinS_date is date_string without anchor_year disambiguator if any&lt;br /&gt;
]]&lt;br /&gt;
function check_date (date_string)&lt;br /&gt;
	local year;			-- assume that year2, months, and days are not used;&lt;br /&gt;
	local year2=0;		-- second year in a year range&lt;br /&gt;
	local month=0;&lt;br /&gt;
	local month2=0;		-- second month in a month range&lt;br /&gt;
	local day=0;&lt;br /&gt;
	local day2=0;		-- second day in a day range&lt;br /&gt;
	local anchor_year;&lt;br /&gt;
	local coins_date;&lt;br /&gt;
&lt;br /&gt;
	if date_string:match(&amp;quot;^%d%d%d%d%-%d%d%-%d%d$&amp;quot;) then										-- year-initial numerical year month day format&lt;br /&gt;
		year, month, day=string.match(date_string, &amp;quot;(%d%d%d%d)%-(%d%d)%-(%d%d)&amp;quot;);&lt;br /&gt;
		month=tonumber(month);&lt;br /&gt;
		if 12 &amp;lt; month or 1 &amp;gt; month or 1583 &amp;gt; tonumber(year) then return false; end			-- month number not valid or not Gregorian calendar&lt;br /&gt;
		anchor_year = year;&lt;br /&gt;
&lt;br /&gt;
	elseif date_string:match(&amp;quot;^%a+ +[1-9]%d?, +[1-9]%d%d%d%a?$&amp;quot;) then						-- month-initial: month day, year&lt;br /&gt;
		month, day, anchor_year, year=string.match(date_string, &amp;quot;(%a+)%s*(%d%d?),%s*((%d%d%d%d)%a?)&amp;quot;);&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		if 0 == month then return false; end												-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
				&lt;br /&gt;
	elseif date_string:match(&amp;quot;^%a+ +[1-9]%d?–[1-9]%d?, +[1-9]%d%d%d%a?$&amp;quot;) then				-- month-initial day range: month day–day, year; days are separated by endash&lt;br /&gt;
		month, day, day2, anchor_year, year=string.match(date_string, &amp;quot;(%a+) +(%d%d?)–(%d%d?), +((%d%d%d%d)%a?)&amp;quot;);&lt;br /&gt;
		if tonumber(day) &amp;gt;= tonumber(day2) then return false; end							-- date range order is left to right: earlier to later; dates may not be the same;&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		if 0 == month then return false; end												-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
&lt;br /&gt;
	elseif date_string:match(&amp;quot;^[1-9]%d? +%a+ +[1-9]%d%d%d%a?$&amp;quot;) then						-- day-initial: day month year&lt;br /&gt;
		day, month, anchor_year, year=string.match(date_string, &amp;quot;(%d%d*)%s*(%a+)%s*((%d%d%d%d)%a?)&amp;quot;);&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		if 0 == month then return false; end												-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
&lt;br /&gt;
	elseif date_string:match(&amp;quot;^[1-9]%d?–[1-9]%d? +%a+ +[1-9]%d%d%d%a?$&amp;quot;) then				-- day-range-initial: day–day month year; days are separated by endash&lt;br /&gt;
		day, day2, month, anchor_year, year=string.match(date_string, &amp;quot;(%d%d?)–(%d%d?) +(%a+) +((%d%d%d%d)%a?)&amp;quot;);&lt;br /&gt;
		if tonumber(day) &amp;gt;= tonumber(day2) then return false; end							-- date range order is left to right: earlier to later; dates may not be the same;&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		if 0 == month then return false; end												-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
&lt;br /&gt;
	elseif date_string:match(&amp;quot;^[1-9]%d? +%a+ – [1-9]%d? +%a+ +[1-9]%d%d%d%a?$&amp;quot;) then		-- day initial month-day-range: day month - day month year; uses spaced endash&lt;br /&gt;
		day, month, day2, month2, anchor_year, year=date_string:match(&amp;quot;(%d%d?) +(%a+) – (%d%d?) +(%a+) +((%d%d%d%d)%a?)&amp;quot;);&lt;br /&gt;
		if (not is_valid_month_season_range(month, month2)) or not is_valid_year(year) then return false; end	-- date range order is left to right: earlier to later;&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		month2 = get_month_number (month2);&lt;br /&gt;
&lt;br /&gt;
	elseif date_string:match(&amp;quot;^%a+ +[1-9]%d? – %a+ +[1-9]%d?, +[1-9]%d%d%d%a?$&amp;quot;) then		-- month initial month-day-range: month day – month day, year;  uses spaced endash&lt;br /&gt;
		month, day, month2, day2, anchor_year, year=date_string:match(&amp;quot;(%a+) +(%d%d?) – (%a+) +(%d%d?), +((%d%d%d%d)%a?)&amp;quot;);&lt;br /&gt;
		if (not is_valid_month_season_range(month, month2)) or not is_valid_year(year) then return false; end&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		month2 = get_month_number (month2);&lt;br /&gt;
&lt;br /&gt;
	elseif date_string:match(&amp;quot;^Winter +[1-9]%d%d%d–[1-9]%d%d%d%a?$&amp;quot;) then					-- special case Winter year-year; year separated with unspaced endash&lt;br /&gt;
		year, anchor_year, year2=date_string:match(&amp;quot;Winter +(%d%d%d%d)–((%d%d%d%d)%a?)&amp;quot;);&lt;br /&gt;
		anchor_year=year..&#039;–&#039;..anchor_year;													-- assemble anchor_year from both years&lt;br /&gt;
		if 1 ~= tonumber(year2) - tonumber(year) then return false; end						-- must be sequential years, left to right, earlier to later&lt;br /&gt;
		if not is_valid_year(year2) then return false; end									-- no year farther in the future than next year&lt;br /&gt;
&lt;br /&gt;
	elseif date_string:match(&amp;quot;^%a+ +[1-9]%d%d%d% – %a+ +[1-9]%d%d%d%a?$&amp;quot;) then				-- month/season year - month/season year; separated by spaced endash&lt;br /&gt;
		month, year, month2, anchor_year, year2=date_string:match(&amp;quot;(%a+) +(%d%d%d%d) – (%a+) +((%d%d%d%d)%a?)&amp;quot;);&lt;br /&gt;
		anchor_year=year..&#039;–&#039;..anchor_year;													-- assemble anchor_year from both years&lt;br /&gt;
		if tonumber(year) &amp;gt;= tonumber(year2) then return false; end							-- left to right, earlier to later, not the same&lt;br /&gt;
		if not is_valid_year(year2) then return false; end									-- no year farther in the future than next year&lt;br /&gt;
		if not((0 ~= get_month_number(month) and 0 ~= get_month_number(month2)) or 			-- both must be month year or season year, not mixed&lt;br /&gt;
			(0 ~= get_season_number(month) and 0 ~= get_season_number(month2))) then return false; end&lt;br /&gt;
&lt;br /&gt;
	elseif date_string:match (&amp;quot;^%a+–%a+ +[1-9]%d%d%d%a?$&amp;quot;) then								-- month/season range year; months separated by endash &lt;br /&gt;
		month, month2, anchor_year, year=date_string:match (&amp;quot;(%a+)–(%a+)%s*((%d%d%d%d)%a?)&amp;quot;);&lt;br /&gt;
		if (not is_valid_month_season_range(month, month2)) or (not is_valid_year(year)) then&lt;br /&gt;
			return false;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
	elseif date_string:match(&amp;quot;^%a+ +%d%d%d%d%a?$&amp;quot;) then							-- month/season year&lt;br /&gt;
		month, anchor_year, year=date_string:match(&amp;quot;(%a+)%s*((%d%d%d%d)%a?)&amp;quot;);&lt;br /&gt;
		if not is_valid_year(year) then return false; end&lt;br /&gt;
		if not is_valid_month_or_season (month) then return false; end&lt;br /&gt;
&lt;br /&gt;
	elseif date_string:match(&amp;quot;^[1-9]%d%d%d?–[1-9]%d%d%d?%a?$&amp;quot;) then				-- Year range: YYY-YYY or YYY-YYYY or YYYY–YYYY; separated by unspaced endash; 100-9999&lt;br /&gt;
		year, anchor_year, year2=date_string:match(&amp;quot;(%d%d%d%d?)–((%d%d%d%d?)%a?)&amp;quot;);&lt;br /&gt;
		anchor_year=year..&#039;–&#039;..anchor_year;										-- assemble anchor year from both years&lt;br /&gt;
		if tonumber(year) &amp;gt;= tonumber(year2) then return false; end				-- left to right, earlier to later, not the same&lt;br /&gt;
		if not is_valid_year(year2) then return false; end						-- no year farther in the future than next year&lt;br /&gt;
&lt;br /&gt;
	elseif date_string:match(&amp;quot;^[1-9]%d%d%d–%d%d%a?$&amp;quot;) then						-- Year range: YYYY–YY; separated by unspaced endash&lt;br /&gt;
		local century;&lt;br /&gt;
		year, century, anchor_year, year2=date_string:match(&amp;quot;((%d%d)%d%d)–((%d%d)%a?)&amp;quot;);&lt;br /&gt;
		anchor_year=year..&#039;–&#039;..anchor_year;										-- assemble anchor year from both years&lt;br /&gt;
		if 13 &amp;gt; tonumber(year2) then return false; end							-- don&#039;t allow 2003-05 which might be May 2003&lt;br /&gt;
		year2 = century..year2;													-- add the century to year2 for comparisons&lt;br /&gt;
		if tonumber(year) &amp;gt;= tonumber(year2) then return false; end				-- left to right, earlier to later, not the same&lt;br /&gt;
		if not is_valid_year(year2) then return false; end						-- no year farther in the future than next year&lt;br /&gt;
&lt;br /&gt;
	elseif date_string:match(&amp;quot;^[1-9]%d%d%d?%a?$&amp;quot;) then							-- year; here accept either YYY or YYYY&lt;br /&gt;
		anchor_year, year=date_string:match(&amp;quot;((%d%d%d%d?)%a?)&amp;quot;);&lt;br /&gt;
		if false == is_valid_year(year) then&lt;br /&gt;
			return false;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	else&lt;br /&gt;
		return false;											-- date format not one of the MOS:DATE approved formats&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result=true;											-- check whole dates for validity; assume true because not all dates will go through this test&lt;br /&gt;
	if 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 == day2 then		-- YMD (simple whole date)&lt;br /&gt;
		result=is_valid_date(year,month,day);&lt;br /&gt;
&lt;br /&gt;
	elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 ~= day2 then	-- YMD-d (day range)&lt;br /&gt;
		result=is_valid_date(year,month,day);&lt;br /&gt;
		result=result and is_valid_date(year,month,day2);&lt;br /&gt;
&lt;br /&gt;
	elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 ~= month2 and 0 ~= day2 then	-- YMD-md (day month range)&lt;br /&gt;
		result=is_valid_date(year,month,day);&lt;br /&gt;
		result=result and is_valid_date(year,month2,day2);&lt;br /&gt;
&lt;br /&gt;
	elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 ~= year2 and 0 ~= month2 and 0 ~= day2 then	-- YMD-ymd (day month year range)&lt;br /&gt;
		result=is_valid_date(year,month,day);&lt;br /&gt;
		result=result and is_valid_date(year2,month2,day2);&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if false == result then return false; end&lt;br /&gt;
																-- if here, then date_string is valid; get coins_date from date_string (leave CITEREF disambiguator) ...&lt;br /&gt;
	coins_date=date_string:match(&amp;quot;^(.+%d)%a?$&amp;quot;);				-- last character of valid disambiguatable date is always a digit&lt;br /&gt;
	coins_date= mw.ustring.gsub(coins_date, &amp;quot;–&amp;quot;, &amp;quot;-&amp;quot; );			-- ... and replace any ndash with a hyphen&lt;br /&gt;
	&lt;br /&gt;
	return true, anchor_year, coins_date;						-- format is good and date string represents a real date&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Cycle the date-holding parameters in passed table date_parameters_list through check_date() to check compliance with MOS:DATE. For all valid dates, check_date() returns&lt;br /&gt;
true. The |date= parameter test is unique, it is the only date holding parameter from which values for anchor_year (used in CITEREF identifiers) and COinS_date (used in&lt;br /&gt;
the COinS metadata) are derived.  The |date= parameter is the only date-holding parameter that is allowed to contain the no-date keywords &amp;quot;n.d.&amp;quot; or &amp;quot;nd&amp;quot; (without quotes).&lt;br /&gt;
&lt;br /&gt;
Unlike most error messages created in this module, only one error message is created by this function. Because all of the date holding parameters are processed serially,&lt;br /&gt;
a single error message is created as the dates are tested.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
function p.dates(date_parameters_list)&lt;br /&gt;
	local anchor_year;		-- will return as nil if the date being tested is not |date=&lt;br /&gt;
	local COinS_date;		-- will return as nil if the date being tested is not |date=&lt;br /&gt;
	local error_message =&amp;quot;&amp;quot;;&lt;br /&gt;
	local good_date=false;&lt;br /&gt;
	&lt;br /&gt;
	for k, v in pairs(date_parameters_list) do										-- for each date-holding parameter in the list&lt;br /&gt;
		if is_set(v) then															-- if the parameter has a value&lt;br /&gt;
			if v:match(&amp;quot;^c%. [1-9]%d%d%d?%a?$&amp;quot;) then								-- special case for c. year or with or without CITEREF disambiguator - only |date= and |year=&lt;br /&gt;
				local year = v:match(&amp;quot;c%. ([1-9]%d%d%d?)%a?&amp;quot;);						-- get the year portion so it can be tested&lt;br /&gt;
				if &#039;date&#039;==k then&lt;br /&gt;
					anchor_year, COinS_date = v:match(&amp;quot;((c%. [1-9]%d%d%d?)%a?)&amp;quot;);	-- anchor year and COinS_date only from |date= parameter&lt;br /&gt;
					good_date = is_valid_year(year);&lt;br /&gt;
				elseif &#039;year&#039;==k then&lt;br /&gt;
					good_date = is_valid_year(year);&lt;br /&gt;
				end&lt;br /&gt;
			elseif &#039;date&#039;==k then													-- if the parameter is |date=&lt;br /&gt;
				if v:match(&amp;quot;n%.d%.%a?&amp;quot;) then										-- if |date=n.d. with or without a CITEREF disambiguator&lt;br /&gt;
					good_date, anchor_year, COinS_date = true, v:match(&amp;quot;((n%.d%.)%a?)&amp;quot;);	--&amp;quot;n.d.&amp;quot;; no error when date parameter is set to no date&lt;br /&gt;
				elseif v:match(&amp;quot;nd%a?$&amp;quot;) then										-- if |date=nd with or without a CITEREF disambiguator&lt;br /&gt;
					good_date, anchor_year, COinS_date = true, v:match(&amp;quot;((nd)%a?)&amp;quot;);	--&amp;quot;nd&amp;quot;;	no error when date parameter is set to no date&lt;br /&gt;
				else&lt;br /&gt;
					good_date, anchor_year, COinS_date = check_date (v);			-- go test the date&lt;br /&gt;
				end&lt;br /&gt;
			else																	-- any other date-holding parameter&lt;br /&gt;
				good_date = check_date (v);											-- go test the date&lt;br /&gt;
			end&lt;br /&gt;
			if false==good_date then												-- assemble one error message so we don&#039;t add the tracking category multiple times&lt;br /&gt;
				if is_set(error_message) then										-- once we&#039;ve added the first portion of the error message ...&lt;br /&gt;
					error_message=error_message .. &amp;quot;, &amp;quot;;							-- ... add a comma space separator&lt;br /&gt;
				end&lt;br /&gt;
				error_message=error_message .. &amp;quot;&amp;amp;#124;&amp;quot; .. k .. &amp;quot;=&amp;quot;;				-- add the failed parameter&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return anchor_year, COinS_date, error_message;		-- and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=M%C3%B3dulo:Citas/Whitelist&amp;diff=295</id>
		<title>Módulo:Citas/Whitelist</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=M%C3%B3dulo:Citas/Whitelist&amp;diff=295"/>
		<updated>2026-06-14T04:12:55Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
Because a steady-state signal conveys no useful information, whitelist.basic_arguments[] list items now can have three values:&lt;br /&gt;
	true - these parameters are valid and supported parameters&lt;br /&gt;
	false - these parameters are deprecated but still supported&lt;br /&gt;
	nil - these parameters are no longer supported (when setting a parameter to nil, leave a comment stating the reasons for invalidating the parameter)&lt;br /&gt;
]]&lt;br /&gt;
whitelist = {&lt;br /&gt;
&lt;br /&gt;
basic_arguments = {&lt;br /&gt;
--  Argumentos permitidos en español no numerados. Algunos de ellos también se usan en inglés.&lt;br /&gt;
    [&#039;1&#039;]            = true,&lt;br /&gt;
    [&#039;agencia&#039;]      = true,&lt;br /&gt;
    [&#039;ampersand&#039;]    = true,&lt;br /&gt;
    [&#039;año&#039;]          = true,&lt;br /&gt;
    [&#039;año-original&#039;] = true,&lt;br /&gt;
    [&#039;añoacceso&#039;]    = true,&lt;br /&gt;
    [&#039;apellido&#039;]     = true,&lt;br /&gt;
    [&#039;apellidos&#039;]    = true,&lt;br /&gt;
    [&#039;apellido-editor&#039;]= true,        &lt;br /&gt;
    [&#039;apellidos-editor&#039;]= true,    &lt;br /&gt;
    [&#039;artículo&#039;]     = true,&lt;br /&gt;
    [&#039;autor&#039;]        = true,&lt;br /&gt;
    [&#039;autores&#039;]      = true,    &lt;br /&gt;
    [&#039;bibcode&#039;]      = true,&lt;br /&gt;
    [&#039;BIBCODE&#039;]      = true,    &lt;br /&gt;
    [&#039;capítulo&#039;]     = true,    &lt;br /&gt;
    [&#039;capítulo-trad&#039;]= true,&lt;br /&gt;
    [&#039;cita&#039;]         = true,&lt;br /&gt;
    [&#039;cita-trad&#039;]    = true,&lt;br /&gt;
    [&#039;ciudad&#039;]       = true,    &lt;br /&gt;
    [&#039;colección&#039;]    = true, -- Inexistente en la plantilla original. Añadido como sinónimo de serie.&lt;br /&gt;
    [&#039;conferencia&#039;]  = true,        &lt;br /&gt;
    [&#039;diccionario&#039;]  = true,    &lt;br /&gt;
    [&#039;doi&#039;]          = true,&lt;br /&gt;
    [&#039;DOI&#039;]          = true,    &lt;br /&gt;
    [&#039;edición&#039;]      = true,    &lt;br /&gt;
    [&#039;editor&#039;]       = true,    &lt;br /&gt;
    [&#039;editorial&#039;]    = true,&lt;br /&gt;
    [&#039;eissn&#039;]        = true,&lt;br /&gt;
	[&#039;EISSN&#039;]        = true,&lt;br /&gt;
    [&#039;en&#039;]           = true,    &lt;br /&gt;
    [&#039;enciclopedia&#039;] = true,    &lt;br /&gt;
    [&#039;enlace-autor&#039;] = true,&lt;br /&gt;
    [&#039;enlaceautor&#039;]  = true,    &lt;br /&gt;
    [&#039;enlaceeditor&#039;]  = true,&lt;br /&gt;
    [&#039;enlace-editor&#039;]= true,  &lt;br /&gt;
    [&#039;enlace-pasaje&#039;] = true,&lt;br /&gt;
	[&#039;entrevistador&#039;] = true,					--cite interview    &lt;br /&gt;
    [&#039;extra&#039;]        = true, -- Inexistente en la plantilla original&lt;br /&gt;
    [&#039;fecha&#039;]        = true,&lt;br /&gt;
    [&#039;fecha-acceso&#039;]  = true,&lt;br /&gt;
    [&#039;fecha-doi-roto&#039;]= true,        &lt;br /&gt;
    [&#039;fechaprofano&#039;]  = true,                &lt;br /&gt;
    [&#039;fecha-publicación&#039;]= true,&lt;br /&gt;
    [&#039;fecharesumen&#039;] = true,            &lt;br /&gt;
    [&#039;fecha-resumen&#039;]= true,        &lt;br /&gt;
    [&#039;fechaacceso&#039;]  = true,&lt;br /&gt;
    [&#039;fechaarchivo&#039;] = true,&lt;br /&gt;
    [&#039;formato&#039;]      = true,&lt;br /&gt;
    [&#039;fuenteresumen&#039;]= true,    &lt;br /&gt;
    [&#039;fuenteprofano&#039;]= true,        &lt;br /&gt;
    [&#039;grado&#039;]        = true,    -- Para tesis&lt;br /&gt;
    [&#039;hdl&#039;]          = true,&lt;br /&gt;
	[&#039;HDL&#039;]          = true,&lt;br /&gt;
	[&#039;hdl-access&#039;]   = true,&lt;br /&gt;
    [&#039;id&#039;]           = true,&lt;br /&gt;
    [&#039;ID&#039;]           = true,    &lt;br /&gt;
    [&#039;idioma&#039;]       = true,&lt;br /&gt;
    [&#039;isbn&#039;]         = true,&lt;br /&gt;
    [&#039;ISBN&#039;]         = true,&lt;br /&gt;
    [&#039;isbn13&#039;]       = true,&lt;br /&gt;
    [&#039;ISBN13&#039;]       = true,&lt;br /&gt;
    [&#039;issn&#039;]         = true,&lt;br /&gt;
    [&#039;ISSN&#039;]         = true,    &lt;br /&gt;
    [&#039;localización&#039;] = true,&lt;br /&gt;
    [&#039;lugar&#039;]        = true,&lt;br /&gt;
    [&#039;lugar-publicación&#039;]= true,    &lt;br /&gt;
    [&#039;máscaraautor&#039;] = true,&lt;br /&gt;
    [&#039;máscara-autor&#039;]= true,&lt;br /&gt;
    [&#039;medio&#039;]        = true,&lt;br /&gt;
    [&#039;nombre&#039;]       = true,&lt;br /&gt;
    [&#039;nombre-editor&#039;]= true,    &lt;br /&gt;
    [&#039;nombres&#039;]      = true,   &lt;br /&gt;
    [&#039;número&#039;]       = true,  &lt;br /&gt;
    [&#039;número-autores&#039;]= true,&lt;br /&gt;
    [&#039;número-editores&#039;]= true,&lt;br /&gt;
    [&#039;obra&#039;]          = true,    &lt;br /&gt;
    [&#039;oclc&#039;]          = true,&lt;br /&gt;
    [&#039;OCLC&#039;]          = true,&lt;br /&gt;
    [&#039;ol&#039;]            = true,&lt;br /&gt;
    [&#039;OL&#039;]            = true,    &lt;br /&gt;
    [&#039;otros&#039;]         = true,    &lt;br /&gt;
    [&#039;página&#039;]        = true,&lt;br /&gt;
    [&#039;páginas&#039;]       = true,&lt;br /&gt;
    [&#039;pasaje&#039;]        = true,&lt;br /&gt;
    [&#039;periódico&#039;]     = true,    &lt;br /&gt;
    [&#039;persona&#039;]       = true,&lt;br /&gt;
    [&#039;personas&#039;]      = true,&lt;br /&gt;
    [&#039;publicación&#039;]   = true,        &lt;br /&gt;
    [&#039;pub-periódica&#039;] = true,&lt;br /&gt;
    [&#039;puntofinal&#039;]    = true,&lt;br /&gt;
    [&#039;registro&#039;]	  = true,&lt;br /&gt;
    [&#039;requiereregistro&#039;]  = true,    &lt;br /&gt;
    [&#039;requiere-registro&#039;]  = true,    &lt;br /&gt;
    [&#039;resumen&#039;]       = true,        &lt;br /&gt;
    [&#039;resumenprofano&#039;]= true,        &lt;br /&gt;
    [&#039;revista&#039;]       = true,    &lt;br /&gt;
    [&#039;s2cid&#039;]         = true,&lt;br /&gt;
    [&#039;separador&#039;]     = true,    &lt;br /&gt;
    [&#039;separador-autores&#039;]= true,    &lt;br /&gt;
    [&#039;separador-nombres&#039;]= true,        &lt;br /&gt;
    [&#039;serie&#039;]        = true,&lt;br /&gt;
    [&#039;sined&#039;]        = true, -- Inexistente en la plantilla original    &lt;br /&gt;
    [&#039;sinpp&#039;]        = true,&lt;br /&gt;
    [&#039;sitio web&#039;]     = true,&lt;br /&gt;
    [&#039;sitioweb&#039;]     = true,&lt;br /&gt;
    [&#039;suscripción&#039;]  = true,    &lt;br /&gt;
    [&#039;temporada&#039;]  = true,    &lt;br /&gt;
    [&#039;tiempo&#039;]       = true,&lt;br /&gt;
    [&#039;tipo&#039;]         = true,    &lt;br /&gt;
	[&#039;título&#039;]       = true,&lt;br /&gt;
	[&#039;títulolibro&#039;]  = true,	&lt;br /&gt;
    [&#039;trad-título&#039;]  = true,&lt;br /&gt;
    [&#039;título_trad&#039;]   = true,&lt;br /&gt;
    [&#039;títulotrad&#039;]   = true,&lt;br /&gt;
	[&#039;título-trad&#039;]  = true,&lt;br /&gt;
	[&#039;traductor&#039;]    = true,&lt;br /&gt;
	[&#039;traductores&#039;]  = true,&lt;br /&gt;
    [&#039;ubicación&#039;]    = true,	&lt;br /&gt;
    [&#039;ubicación-publicación&#039;]= true,    &lt;br /&gt;
    [&#039;url&#039;]          = true,&lt;br /&gt;
    [&#039;URL&#039;]          = true,	&lt;br /&gt;
	[&#039;urlarchivo&#039;]   = true,&lt;br /&gt;
	[&#039;url-acceso&#039;]   = true,&lt;br /&gt;
    [&#039;url-capítulo&#039;] = true,&lt;br /&gt;
    [&#039;urlcapítulo&#039;]  = true,&lt;br /&gt;
    [&#039;urlconferencia&#039;]  = true,    &lt;br /&gt;
    [&#039;urlmuerta&#039;]    = true,&lt;br /&gt;
    [&#039;url-pasaje&#039;]   = true,&lt;br /&gt;
	[&#039;versión&#039;]      = true,&lt;br /&gt;
	[&#039;volumen&#039;]      = true,&lt;br /&gt;
	[&#039;wikidata&#039;]     = true,&lt;br /&gt;
	&lt;br /&gt;
-- Parámetros obsoletos	(con false)&lt;br /&gt;
    [&#039;añoacceso&#039;]    = false,&lt;br /&gt;
    [&#039;coautor&#039;]      = false,   &lt;br /&gt;
    [&#039;coautores&#039;]    = false,   &lt;br /&gt;
    [&#039;día&#039;]          = false, &lt;br /&gt;
    [&#039;mes&#039;]          = false,    &lt;br /&gt;
    [&#039;mesacceso&#039;]    = false,    &lt;br /&gt;
    [&#039;accessmonth&#039;]  = false,        &lt;br /&gt;
    [&#039;accessyear&#039;]   = false,    &lt;br /&gt;
&lt;br /&gt;
-- Parámetros en inglés&lt;br /&gt;
	&lt;br /&gt;
    [&#039;accessdate&#039;] = true,&lt;br /&gt;
    [&#039;access-date&#039;] = true,&lt;br /&gt;
    [&#039;agency&#039;] = true,&lt;br /&gt;
    [&#039;airdate&#039;] = true,&lt;br /&gt;
    [&#039;albumlink&#039;] = false,			-- deprecated; set to nil after 1 October 2014; a unique alias of titlelink used by old cite AV media notes&lt;br /&gt;
    [&#039;albumtype&#039;] = nil,			-- controled inappropriate functionality in the old cite AV media notes&lt;br /&gt;
    [&#039;archivedate&#039;] = true,&lt;br /&gt;
    [&#039;archive-date&#039;] = true,&lt;br /&gt;
    [&#039;archiveurl&#039;] = true,&lt;br /&gt;
    [&#039;archive-url&#039;] = true,&lt;br /&gt;
    [&#039;article&#039;] = true,&lt;br /&gt;
    [&#039;artist&#039;] = false,				-- deprecated; set to nil after 1 October 2014; a unique alias of others used by old cite AV media notes&lt;br /&gt;
    [&#039;bandname&#039;] = false, -- Obsoleto. Remplazado por artist que será remplazado creo que por others.&lt;br /&gt;
    [&#039;arxiv&#039;] = true,&lt;br /&gt;
    [&#039;ARXIV&#039;] = true,&lt;br /&gt;
    [&#039;at&#039;] = true,&lt;br /&gt;
    [&#039;author&#039;] = true,&lt;br /&gt;
    [&#039;Author&#039;] = true,&lt;br /&gt;
    [&#039;author-first&#039;] = true,&lt;br /&gt;
    [&#039;authorformat&#039;] = true,&lt;br /&gt;
    [&#039;author-format&#039;] = true,&lt;br /&gt;
    [&#039;author-last&#039;] = true,&lt;br /&gt;
    [&#039;authorlink&#039;] = true,&lt;br /&gt;
    [&#039;author-link&#039;] = true,&lt;br /&gt;
    [&#039;authormask&#039;] = true,&lt;br /&gt;
    [&#039;author-mask&#039;] = true,&lt;br /&gt;
    [&#039;author-name-separator&#039;] = true,&lt;br /&gt;
    [&#039;authors&#039;] = true,&lt;br /&gt;
    [&#039;author-separator&#039;] = true,&lt;br /&gt;
    [&#039;booktitle&#039;] = true,&lt;br /&gt;
	[&#039;book-title&#039;] = true,    &lt;br /&gt;
	[&#039;callsign&#039;]=true,					-- cite interview&lt;br /&gt;
    [&#039;cartography&#039;] = true,&lt;br /&gt;
    [&#039;chapter&#039;] = true,&lt;br /&gt;
    [&#039;chapterlink&#039;] = true,&lt;br /&gt;
    [&#039;chapterurl&#039;] = true,&lt;br /&gt;
    [&#039;chapter-url&#039;] = true,&lt;br /&gt;
	[&#039;city&#039;]=true,						-- cite interview&lt;br /&gt;
    [&#039;coauthor&#039;] = false,&lt;br /&gt;
    [&#039;coauthors&#039;] = false,&lt;br /&gt;
    [&#039;cointerviewers&#039;] = false,			-- cite interview&lt;br /&gt;
    [&#039;conference&#039;] = true,&lt;br /&gt;
    [&#039;conferenceurl&#039;] = true,&lt;br /&gt;
    [&#039;conference-url&#039;] = true,&lt;br /&gt;
    [&#039;contribution&#039;] = true,&lt;br /&gt;
    [&#039;contributionurl&#039;] = true,&lt;br /&gt;
    [&#039;contribution-url&#039;] = true,&lt;br /&gt;
    [&#039;date&#039;] = true,&lt;br /&gt;
    [&#039;day&#039;] = false,&lt;br /&gt;
    [&#039;dead-url&#039;] = true,&lt;br /&gt;
    [&#039;deadurl&#039;] = true,&lt;br /&gt;
    [&#039;degree&#039;] = true,&lt;br /&gt;
    [&#039;department&#039;] = true,&lt;br /&gt;
    [&#039;dictionary&#039;] = true,&lt;br /&gt;
    [&#039;director&#039;] = false,				-- deprecated; set to nil after 1 October 2014; a unique alias of author used by old cite DVD-notes&lt;br /&gt;
    [&#039;displayauthors&#039;] = true,&lt;br /&gt;
    [&#039;display-authors&#039;] = true,&lt;br /&gt;
    [&#039;displayeditors&#039;] = true,&lt;br /&gt;
    [&#039;display-editors&#039;] = true,&lt;br /&gt;
    [&#039;docket&#039;] = true,&lt;br /&gt;
    [&#039;DoiBroken&#039;] = true,&lt;br /&gt;
    [&#039;doi_brokendate&#039;] = true,&lt;br /&gt;
    [&#039;doi_inactivedate&#039;] = true,&lt;br /&gt;
    [&#039;edition&#039;] = true,&lt;br /&gt;
    [&#039;Editor&#039;] = true,&lt;br /&gt;
    [&#039;editor-first&#039;] = true,&lt;br /&gt;
    [&#039;editorformat&#039;] = true,&lt;br /&gt;
    [&#039;editor-format&#039;] = true,&lt;br /&gt;
    [&#039;EditorGiven&#039;] = true,&lt;br /&gt;
    [&#039;editor-last&#039;] = true,&lt;br /&gt;
    [&#039;editorlink&#039;] = true,&lt;br /&gt;
    [&#039;editor-link&#039;] = true,&lt;br /&gt;
    [&#039;editormask&#039;] = true,&lt;br /&gt;
    [&#039;editor-mask&#039;] = true,&lt;br /&gt;
    [&#039;editor-name-separator&#039;] = true,&lt;br /&gt;
    [&#039;editors&#039;] = true,&lt;br /&gt;
    [&#039;editor-separator&#039;] = true,&lt;br /&gt;
    [&#039;EditorSurname&#039;] = true,&lt;br /&gt;
    [&#039;embargo&#039;] = true,&lt;br /&gt;
    [&#039;Embargo&#039;] = true,&lt;br /&gt;
    [&#039;encyclopaedia&#039;] = true,&lt;br /&gt;
    [&#039;encyclopedia&#039;] = true,&lt;br /&gt;
    [&#039;entry&#039;] = true,&lt;br /&gt;
    [&#039;episodelink&#039;] = true,&lt;br /&gt;
    [&#039;event&#039;] = true,&lt;br /&gt;
    [&#039;eventurl&#039;] = true,&lt;br /&gt;
    [&#039;first&#039;] = true,&lt;br /&gt;
    [&#039;format&#039;] = true,&lt;br /&gt;
    [&#039;given&#039;] = true,&lt;br /&gt;
    [&#039;host&#039;] = true,&lt;br /&gt;
    [&#039;ignoreisbnerror&#039;] = true,&lt;br /&gt;
    [&#039;ignore-isbn-error&#039;] = true,&lt;br /&gt;
    [&#039;in&#039;] = true,&lt;br /&gt;
    [&#039;inset&#039;] = true,&lt;br /&gt;
    [&#039;institution&#039;] = true,&lt;br /&gt;
	[&#039;interviewer&#039;] = true,					--cite interview&lt;br /&gt;
    [&#039;issue&#039;] = true,&lt;br /&gt;
    [&#039;jfm&#039;] = true,&lt;br /&gt;
    [&#039;JFM&#039;] = true,&lt;br /&gt;
    [&#039;journal&#039;] = true,&lt;br /&gt;
    [&#039;jstor&#039;] = true,&lt;br /&gt;
    [&#039;JSTOR&#039;] = true,&lt;br /&gt;
    [&#039;language&#039;] = true,&lt;br /&gt;
    [&#039;last&#039;] = true,&lt;br /&gt;
    [&#039;lastauthoramp&#039;] = true,&lt;br /&gt;
    [&#039;laydate&#039;] = true,&lt;br /&gt;
    [&#039;laysource&#039;] = true,&lt;br /&gt;
    [&#039;laysummary&#039;] = true,&lt;br /&gt;
    [&#039;layurl&#039;] = true,&lt;br /&gt;
    [&#039;lccn&#039;] = true,&lt;br /&gt;
    [&#039;LCCN&#039;] = true,&lt;br /&gt;
    [&#039;location&#039;] = true,&lt;br /&gt;
    [&#039;magazine&#039;] = true,&lt;br /&gt;
    [&#039;medium&#039;] = true,&lt;br /&gt;
    [&#039;minutes&#039;] = true,&lt;br /&gt;
    [&#039;month&#039;] = false,&lt;br /&gt;
    [&#039;mr&#039;] = true,&lt;br /&gt;
    [&#039;MR&#039;] = true,&lt;br /&gt;
    [&#039;name-separator&#039;] = true,&lt;br /&gt;
    [&#039;network&#039;] = true,&lt;br /&gt;
    [&#039;newspaper&#039;] = true,&lt;br /&gt;
    [&#039;nocat&#039;] = true,&lt;br /&gt;
    [&#039;nopp&#039;] = true,&lt;br /&gt;
    [&#039;notestitle&#039;] = false,					-- deprecated; set to nil after 1 October 2014; a unique alias of chapter used by old cite AV media notes&lt;br /&gt;
    [&#039;notracking&#039;] = true,&lt;br /&gt;
    [&#039;no-tracking&#039;] = true,&lt;br /&gt;
    [&#039;number&#039;] = true,&lt;br /&gt;
    [&#039;origyear&#039;] = true,&lt;br /&gt;
    [&#039;osti&#039;] = true,&lt;br /&gt;
    [&#039;OSTI&#039;] = true,&lt;br /&gt;
    [&#039;others&#039;] = true,&lt;br /&gt;
    [&#039;p&#039;] = true,&lt;br /&gt;
    [&#039;page&#039;] = true,&lt;br /&gt;
    [&#039;pages&#039;] = true,&lt;br /&gt;
    [&#039;people&#039;] = true,&lt;br /&gt;
    [&#039;periodical&#039;] = true,&lt;br /&gt;
    [&#039;place&#039;] = true,&lt;br /&gt;
    [&#039;pmc&#039;] = true,&lt;br /&gt;
    [&#039;PMC&#039;] = true,&lt;br /&gt;
    [&#039;pmid&#039;] = true,&lt;br /&gt;
    [&#039;PMID&#039;] = true,&lt;br /&gt;
    [&#039;postscript&#039;] = true,&lt;br /&gt;
    [&#039;pp&#039;] = true,&lt;br /&gt;
    [&#039;PPPrefix&#039;] = true,&lt;br /&gt;
    [&#039;PPrefix&#039;] = true,&lt;br /&gt;
	[&#039;program&#039;]=true,				-- cite interview&lt;br /&gt;
    [&#039;publicationdate&#039;] = true,&lt;br /&gt;
    [&#039;publication-date&#039;] = true,&lt;br /&gt;
    [&#039;publicationplace&#039;] = true,&lt;br /&gt;
    [&#039;publication-place&#039;] = true,&lt;br /&gt;
    [&#039;publisher&#039;] = true,&lt;br /&gt;
    [&#039;publisherid&#039;] = false,			-- deprecated; set to nil after 1 October 2014; a unique alias of others used by old cite AV media notes and old cite DVD-notes&lt;br /&gt;
    [&#039;quotation&#039;] = true,&lt;br /&gt;
    [&#039;quote&#039;] = true,&lt;br /&gt;
    [&#039;ref&#039;] = true,&lt;br /&gt;
    [&#039;Ref&#039;] = true,&lt;br /&gt;
    [&#039;registration&#039;] = true,&lt;br /&gt;
    [&#039;rfc&#039;] = true,&lt;br /&gt;
    [&#039;RFC&#039;] = true,&lt;br /&gt;
    [&#039;scale&#039;] = true,&lt;br /&gt;
    [&#039;season&#039;] = true,&lt;br /&gt;
    [&#039;section&#039;] = true,&lt;br /&gt;
    [&#039;sectionurl&#039;] = true,&lt;br /&gt;
    [&#039;separator&#039;] = true,&lt;br /&gt;
    [&#039;series&#039;] = true,&lt;br /&gt;
    [&#039;serieslink&#039;] = true,&lt;br /&gt;
    [&#039;seriesno&#039;] = true,&lt;br /&gt;
    [&#039;seriesnumber&#039;] = true,&lt;br /&gt;
    [&#039;series-separator&#039;] = true,&lt;br /&gt;
    [&#039;ssrn&#039;] = true,&lt;br /&gt;
    [&#039;SSRN&#039;] = true,&lt;br /&gt;
    [&#039;station&#039;] = true,&lt;br /&gt;
    [&#039;subject&#039;] = true,&lt;br /&gt;
    [&#039;subjectlink&#039;] = true,&lt;br /&gt;
    [&#039;subscription&#039;] = true,&lt;br /&gt;
    [&#039;surname&#039;] = true,&lt;br /&gt;
    [&#039;template doc demo&#039;] = true,&lt;br /&gt;
    [&#039;time&#039;] = true,&lt;br /&gt;
    [&#039;timecaption&#039;] = true,&lt;br /&gt;
    [&#039;title&#039;] = true,&lt;br /&gt;
    [&#039;titlelink&#039;] = true,&lt;br /&gt;
    [&#039;titleyear&#039;] = false,			-- deprecated; set to nil after 1 October 2014; a unique alias of origyear used by old cite DVD-notes&lt;br /&gt;
    [&#039;trans_chapter&#039;] = true,&lt;br /&gt;
    [&#039;trans-chapter&#039;] = true,&lt;br /&gt;
    [&#039;transcript&#039;] = true,&lt;br /&gt;
    [&#039;transcripturl&#039;] = true,&lt;br /&gt;
    [&#039;transcript-url&#039;] = true,&lt;br /&gt;
    [&#039;trans_quote&#039;] = true,&lt;br /&gt;
    [&#039;trans-quote&#039;] = true,&lt;br /&gt;
    [&#039;trans_title&#039;] = true,&lt;br /&gt;
    [&#039;trans-title&#039;] = true,&lt;br /&gt;
    [&#039;type&#039;] = true,&lt;br /&gt;
    [&#039;url-access&#039;] = true,&lt;br /&gt;
    [&#039;version&#039;] = true,&lt;br /&gt;
    [&#039;via&#039;] = true,&lt;br /&gt;
    [&#039;volume&#039;] = true,&lt;br /&gt;
    [&#039;website&#039;] = true,&lt;br /&gt;
    [&#039;work&#039;] = true,&lt;br /&gt;
    [&#039;year&#039;] = true,&lt;br /&gt;
    [&#039;zbl&#039;] = true,&lt;br /&gt;
    [&#039;ZBL&#039;] = true,&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
numbered_arguments = {&lt;br /&gt;
    [&#039;máscaraautor#&#039;]    = true,&lt;br /&gt;
    [&#039;máscara-autor#&#039;]   = true,	&lt;br /&gt;
    [&#039;apellidos#&#039;]       = true,&lt;br /&gt;
    [&#039;apellido#&#039;]        = true,  -- Por apellido1&lt;br /&gt;
    [&#039;apellido-editor#&#039;] = true,      &lt;br /&gt;
    [&#039;apellidos-editor#&#039;]= true,      &lt;br /&gt;
    [&#039;autor#&#039;]           = true,&lt;br /&gt;
    [&#039;editor#&#039;]          = true,    &lt;br /&gt;
    [&#039;enlaceautor#&#039;]     = true,&lt;br /&gt;
    [&#039;enlace-autor#&#039;]    = true,            &lt;br /&gt;
    [&#039;enlace-editor#&#039;]   = true,        &lt;br /&gt;
    [&#039;nombre#&#039;]          = true,&lt;br /&gt;
    [&#039;nombre-editor#&#039;]   = true,&lt;br /&gt;
    [&#039;nombres#&#039;]         = true,&lt;br /&gt;
&lt;br /&gt;
--  Parámetros en inglés&lt;br /&gt;
    [&#039;author#&#039;] = true,&lt;br /&gt;
    [&#039;Author#&#039;] = true,&lt;br /&gt;
    [&#039;author-first#&#039;] = true,&lt;br /&gt;
    [&#039;author#-first&#039;] = true,&lt;br /&gt;
    [&#039;author-last#&#039;] = true,&lt;br /&gt;
    [&#039;author#-last&#039;] = true,&lt;br /&gt;
    [&#039;author-link#&#039;] = true,&lt;br /&gt;
    [&#039;author#link&#039;] = true,&lt;br /&gt;
    [&#039;author#-link&#039;] = true,&lt;br /&gt;
    [&#039;authorlink#&#039;] = true,&lt;br /&gt;
    [&#039;author-mask#&#039;] = true,&lt;br /&gt;
    [&#039;author#mask&#039;] = true,&lt;br /&gt;
    [&#039;author#-mask&#039;] = true,&lt;br /&gt;
    [&#039;authormask#&#039;] = true,&lt;br /&gt;
    [&#039;authors#&#039;] = true,&lt;br /&gt;
    [&#039;Editor#&#039;] = true,&lt;br /&gt;
    [&#039;editor-first#&#039;] = true,&lt;br /&gt;
    [&#039;editor#-first&#039;] = true,&lt;br /&gt;
    [&#039;editor-given#&#039;] = true,&lt;br /&gt;
    [&#039;EditorGiven#&#039;] = true,&lt;br /&gt;
    [&#039;editor-last#&#039;] = true,&lt;br /&gt;
    [&#039;editor#-last&#039;] = true,&lt;br /&gt;
    [&#039;editor-link#&#039;] = true,&lt;br /&gt;
    [&#039;editor#link&#039;] = true,&lt;br /&gt;
    [&#039;editor#-link&#039;] = true,&lt;br /&gt;
    [&#039;editorlink#&#039;] = true,&lt;br /&gt;
    [&#039;editor-mask#&#039;] = true,&lt;br /&gt;
    [&#039;editor#mask&#039;] = true,&lt;br /&gt;
    [&#039;editor#-mask&#039;] = true,&lt;br /&gt;
    [&#039;editormask#&#039;] = true,&lt;br /&gt;
    [&#039;editors#&#039;] = true,&lt;br /&gt;
    [&#039;editor-surname#&#039;] = true,&lt;br /&gt;
    [&#039;EditorSurname#&#039;] = true,&lt;br /&gt;
    [&#039;first#&#039;] = true,&lt;br /&gt;
    [&#039;given#&#039;] = true,&lt;br /&gt;
    [&#039;last#&#039;] = true,&lt;br /&gt;
    [&#039;subject#&#039;] = true,&lt;br /&gt;
    [&#039;subjectlink#&#039;] = true,&lt;br /&gt;
    [&#039;surname#&#039;] = true,&lt;br /&gt;
},&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
return whitelist;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=M%C3%B3dulo:Citas/Configuraci%C3%B3n&amp;diff=293</id>
		<title>Módulo:Citas/Configuración</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=M%C3%B3dulo:Citas/Configuraci%C3%B3n&amp;diff=293"/>
		<updated>2026-06-14T04:12:55Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;citation_config = {};&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
List of namespaces that should not be included in citation&lt;br /&gt;
error categories.  Same as setting notracking = true by default&lt;br /&gt;
&lt;br /&gt;
Note: Namespace names should use underscores instead of spaces.de&lt;br /&gt;
&lt;br /&gt;
citation_config.uncategorized_namespaces = { &#039;User&#039;,  &#039;Talk&#039;, &#039;User_talk&#039;, &#039;Wikipedia_talk&#039;, &#039;File_talk&#039;, &#039;Template_talk&#039;,&lt;br /&gt;
	&#039;Help_talk&#039;, &#039;Category_talk&#039;, &#039;Portal_talk&#039;, &#039;Book_talk&#039;, &#039;Draft&#039;, &#039;Draft_talk&#039;, &#039;Education_Program_talk&#039;, &lt;br /&gt;
	&#039;Module_talk&#039;, &#039;MediaWiki_talk&#039; };&lt;br /&gt;
]]&lt;br /&gt;
citation_config.uncategorized_namespaces = { &#039;Usuario&#039;, &#039;Usuaria&#039;, &#039;Discusión&#039;, &#039;Usuario_discusión&#039;, &#039;Usuario_Discusión&#039;,&#039;Usuaria_Discusión&#039;, &#039;Usuaria_discusión&#039;, &#039;Wikipedia_discusión&#039;, &#039;Archivo_discusión&#039;, &lt;br /&gt;
	&#039;Plantilla_discusión&#039;,	&#039;Ayuda_discusión&#039;, &#039;Categoría_discusión&#039;, &#039;Portal_Discusión&#039;, &#039;Book_talk&#039;, &#039;Draft&#039;, &#039;Draft_talk&#039;, &#039;Education_Program_talk&#039;, &lt;br /&gt;
	&#039;Módulo_discusión&#039;, &#039;MediaWiki_discusión&#039;, &#039;Wikipedia&#039;, &#039;Wikiproyecto&#039;, &#039;Wikiproyecto_discusión&#039; };&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Translation table&lt;br /&gt;
&lt;br /&gt;
The following contains fixed text that may be output as part of a citation.&lt;br /&gt;
This is separated from the main body to aid in future translations of this&lt;br /&gt;
module.&lt;br /&gt;
]]&lt;br /&gt;
citation_config.messages = {&lt;br /&gt;
  [&#039;published&#039;]         = &#039;publicado el $1&#039;,     --&#039;published $1&#039;,&lt;br /&gt;
  [&#039;lay summary&#039;]       = &#039;Resumen divulgativo&#039;, --&#039;Lay summary&#039;,&lt;br /&gt;
  [&#039;retrieved&#039;]         = &#039;Consultado el $1&#039;,    --&#039;Retrieved $1&#039;,&lt;br /&gt;
  [&#039;inactive&#039;]          = &#039;inactivo&#039;,            --&#039;inactive&#039;,&lt;br /&gt;
  [&#039;archived-dead&#039;]     = &#039;Archivado desde $1 el $2&#039;,-- &#039;Archived from $1 on $2&#039;,&lt;br /&gt;
  [&#039;archived-not-dead&#039;] = &#039;$1 desde el original el $2&#039;, --&#039;$1 from the original on $2&#039;,&lt;br /&gt;
  [&#039;archived-missing&#039;]  = &#039;Archivado desde el original$1 el $2&#039;, --&#039;Archived from the original$1 on $2&#039;,&lt;br /&gt;
  [&#039;archived&#039;]          = &#039;Archivado&#039;, --&#039;Archived&#039;,&lt;br /&gt;
  [&#039;original&#039;]         = &#039;el original&#039;, --&#039;the original&#039;,&lt;br /&gt;
  [&#039;editor&#039;]      = &#039;ed.&#039;,&lt;br /&gt;
  [&#039;editors&#039;]     = &#039;eds.&#039;, &lt;br /&gt;
  [&#039;edition&#039;]     = &#039;($1 edición)&#039;,  --&#039;($1 ed.)&#039;, &lt;br /&gt;
  [&#039;interview&#039;] = &#039;Entrevista con $1&#039;,	&lt;br /&gt;
  [&#039;sin edición&#039;] = &#039;($1)&#039;,  -- No existe en la Wikipedia inglesa&lt;br /&gt;
  [&#039;episode&#039;] = &#039;episode&#039;,&lt;br /&gt;
  [&#039;season&#039;] = &#039;season&#039;, &lt;br /&gt;
  [&#039;series&#039;] = &#039;series&#039;,&lt;br /&gt;
  [&#039;cartography&#039;] = &#039;Cartography by $1&#039;,&lt;br /&gt;
  [&#039;section&#039;] = &#039;Section $1&#039;,&lt;br /&gt;
  [&#039;inset&#039;] = &#039;$1 inset&#039;,&lt;br /&gt;
  [&#039;traductor&#039;]   = &#039;($1, trad.)&#039;,&lt;br /&gt;
  [&#039;traductores&#039;] = &#039;($1, trads.)&#039;,&lt;br /&gt;
  [&#039;written&#039;] = &#039;Escrito en $1&#039;, --&#039;Written at $1&#039;,&lt;br /&gt;
  [&#039;in&#039;] = &#039;En&#039;, --&#039;In&#039;,&lt;br /&gt;
  [&#039;et al&#039;] = &amp;quot;&#039;&#039;et al.&#039;&#039;&amp;quot;, -- &#039;et al.&#039;, l&lt;br /&gt;
  &lt;br /&gt;
  [&#039;subscription&#039;] = &#039;&amp;lt;span style=&amp;quot;font-size:0.95em; font-size:90%; color:var(--color-subtle, #555 )&amp;quot;&amp;gt;(requiere suscripción)&amp;lt;/span&amp;gt;&#039; ..&lt;br /&gt;
  	&#039;[[Categoría:Wikipedia:Páginas con referencias que requieren suscripción]]&#039;,&lt;br /&gt;
&lt;br /&gt;
  [&#039;registration&#039;] = &#039;&amp;lt;span style=&amp;quot;font-size:0.95em; font-size:90%; color:var(--color-subtle, #555 )&amp;quot;&amp;gt;(requiere registro)&amp;lt;/span&amp;gt;&#039; ..&lt;br /&gt;
  	&#039;[[Categoría:Wikipedia:Páginas con referencias que requieren registro]]&#039;,&lt;br /&gt;
  &lt;br /&gt;
  [&#039;language&#039;] = &#039;&amp;lt;span style=&amp;quot;color:var(--color-subtle, #555 );&amp;quot;&amp;gt;(en $1)&amp;lt;/span&amp;gt;&#039;, -- &#039;(in $1)&#039;, &lt;br /&gt;
  [&#039;format&#039;]   = &#039;&amp;lt;span style=&amp;quot;color:var(--color-subtle, #555 );&amp;quot;&amp;gt;($1)&amp;lt;/span&amp;gt;&#039;,    -- No existe en la Wikipedia inglesa&lt;br /&gt;
  [&#039;via&#039;] = &amp;quot; &amp;amp;ndash; vía $1&amp;quot;,&lt;br /&gt;
  [&#039;event&#039;] = &#039;Escena en&#039;, --&#039;Event occurs at&#039;,&lt;br /&gt;
  [&#039;minutes&#039;] = &#039;minutes in&#039;, &lt;br /&gt;
  [&#039;id&#039;]       = &#039;&amp;lt;small&amp;gt;$1&amp;lt;/small&amp;gt;&#039;, -- Nuevo. No existe en la plantilla original&lt;br /&gt;
&lt;br /&gt;
  [&#039;quoted-title&#039;]       = &#039;«$1»&#039;, --&#039;&amp;quot;$1&amp;quot;&#039;,&lt;br /&gt;
  [&#039;italic-title&#039;]       = &amp;quot;&#039;&#039;$1&#039;&#039;&amp;quot;,&lt;br /&gt;
  [&#039;trans-quoted-title&#039;] = &amp;quot;&amp;amp;#91;$1&amp;amp;#93;&amp;quot;,&lt;br /&gt;
  [&#039;trans-italic-title&#039;] = &amp;quot;&amp;amp;#91;&#039;&#039;$1&#039;&#039;&amp;amp;#93;&amp;quot;,&lt;br /&gt;
  [&#039;quoted-text&#039;]        = &#039;«$1»&#039;, -- &#039;&amp;quot;$1&amp;quot;&#039;,&lt;br /&gt;
&lt;br /&gt;
  [&#039;parameter&#039;] = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;$1=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
  [&#039;parameter-separator&#039;] = &#039;, &#039;,&lt;br /&gt;
  [&#039;parameter-final-separator&#039;] = &#039;, y &#039;, -- &#039;, and &#039;,&lt;br /&gt;
  [&#039;parameter-pair-separator&#039;] = &#039; y &#039;, -- &#039; and &#039;,&lt;br /&gt;
&lt;br /&gt;
  -- Error output&lt;br /&gt;
  [&#039;hidden-error&#039;]  = &#039;&amp;lt;span style=&amp;quot;display:none;font-size:100%&amp;quot; class=&amp;quot;error citation-comment&amp;quot;&amp;gt;$1&amp;lt;/span&amp;gt;&#039;,&lt;br /&gt;
  [&#039;visible-error&#039;] = &#039;&amp;lt;span style=&amp;quot;font-size:100%&amp;quot; class=&amp;quot;error citation-comment&amp;quot;&amp;gt;$1&amp;lt;/span&amp;gt;&#039;,&lt;br /&gt;
  &lt;br /&gt;
  -- Determines the location of the help page&lt;br /&gt;
  [&#039;help page link&#039;] = &#039;Ayuda:Errores en las referencias&#039;, --&#039;Help:CS1 errors&#039;,&lt;br /&gt;
  [&#039;help page label&#039;] = &#039;ayuda&#039;, --&#039;help&#039;,&lt;br /&gt;
  &lt;br /&gt;
  -- Internal errors (should only occur if configuration is bad)&lt;br /&gt;
  [&#039;undefined_error&#039;] = &#039;Called with an undefined error condition&#039;,&lt;br /&gt;
  [&#039;unknown_manual_ID&#039;] = &#039;Unrecognized manual ID mode&#039;,&lt;br /&gt;
  [&#039;unknown_ID_mode&#039;] = &#039;Unrecognized ID mode&#039;,&lt;br /&gt;
  [&#039;unknown_argument_map&#039;] = &#039;Argument map not defined for this variable&#039;,&lt;br /&gt;
  [&#039;bare_url_no_origin&#039;] = &#039;Bare url found but origin indicator is nil or empty&#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Aliases table for commonly passed parameters&lt;br /&gt;
citation_config.aliases = {&lt;br /&gt;
    [&#039;AccessDate&#039;]  = {&#039;fechaacceso&#039;, &#039;fecha-acceso&#039;, &#039;accessdate&#039;, &#039;access-date&#039;}, --{&#039;accessdate&#039;, &#039;accessyear&#039;},&lt;br /&gt;
    [&#039;AñoAcceso&#039;]   = {&#039;añoacceso&#039;, &#039;accessyear&#039;}, -- Inexistente en la plantilla original&lt;br /&gt;
    [&#039;Agency&#039;]      = {&#039;agencia&#039;, &#039;agency&#039;},&lt;br /&gt;
    [&#039;AirDate&#039;]     = &#039;airdate&#039;,&lt;br /&gt;
    [&#039;ArchiveDate&#039;] = {&#039;fechaarchivo&#039;, &#039;archive-date&#039;, &#039;archivedate&#039; },&lt;br /&gt;
    [&#039;ArchiveURL&#039;]  = {&#039;urlarchivo&#039;, &#039;archive-url&#039;, &#039;archiveurl&#039; },&lt;br /&gt;
    [&#039;At&#039;]          = {&#039;en&#039;, &#039;at&#039;},&lt;br /&gt;
    [&#039;Authors&#039;]      = {&#039;autores&#039;, &#039;persona&#039;, &#039;personas&#039;, &#039;authors&#039;, &#039;people&#039;, &#039;host&#039;},&lt;br /&gt;
    [&#039;AuthorFormat&#039;] = {&amp;quot;author-format&amp;quot;, &amp;quot;authorformat&amp;quot; },&lt;br /&gt;
    [&#039;AuthorSeparator&#039;] = {&#039;separador-autores&#039;, &#039;author-separator&#039;},&lt;br /&gt;
    [&#039;AuthorNameSeparator&#039;] = {&#039;separador-nombres&#039;, &#039;author-name-separator&#039;},&lt;br /&gt;
	[&#039;BookTitle&#039;] = {&#039;book-title&#039;, &#039;booktitle&#039;, &#039;títulolibro&#039;},&lt;br /&gt;
	[&#039;Callsign&#039;] = &#039;callsign&#039;,							-- cite interview&lt;br /&gt;
    [&#039;Cartography&#039;] = &#039;cartography&#039;,&lt;br /&gt;
    [&#039;Chapter&#039;] = {&#039;capítulo&#039;, &#039;artículo&#039;, &#039;chapter&#039;, &#039;contribution&#039;, &#039;entry&#039;, &#039;article&#039;, &#039;section&#039;, &#039;notestitle&#039;},		-- notestitle is deprecated used by old cite AV media notes; remove after 1 October 2014;&lt;br /&gt;
    [&#039;ChapterLink&#039;] = &#039;chapterlink&#039;,&lt;br /&gt;
    [&#039;ChapterURL&#039;] = {&#039;url-capítulo&#039;, &#039;urlcapítulo&#039;, &#039;chapter-url&#039;, &#039;chapterurl&#039;, &#039;contribution-url&#039;, &#039;contributionurl&#039;, &#039;sectionurl&#039; },&lt;br /&gt;
	[&#039;City&#039;] = &#039;city&#039;,									-- cite interview&lt;br /&gt;
    [&#039;Coauthors&#039;] = {&#039;coautores&#039;, &#039;coautor&#039;, &#039;coauthors&#039;, &#039;coauthor&#039; },&lt;br /&gt;
    [&#039;Cointerviewers&#039;] = {&#039;coentrevistadores&#039;, &#039;cointerviewers&#039;},				-- cite interview&lt;br /&gt;
    [&#039;Conference&#039;] = {&#039;conference&#039;, &#039;event&#039;, &#039;conferencia&#039; },&lt;br /&gt;
	[&#039;ConferenceURL&#039;] = {&#039;conference-url&#039;, &#039;conferenceurl&#039;, &#039;event-url&#039;, &#039;eventurl&#039;, &#039;urlconferencia&#039;},&lt;br /&gt;
    [&#039;Date&#039;] = {&#039;fecha&#039;,&#039;date&#039;},&lt;br /&gt;
    [&#039;Day&#039;] = {&#039;día&#039;, &#039;day&#039;},&lt;br /&gt;
    [&#039;DeadURL&#039;] = {&#039;deadurl&#039;,&#039;urlmuerta&#039;},&lt;br /&gt;
    [&#039;Degree&#039;] = {&#039;degree&#039;, &#039;grado&#039;},&lt;br /&gt;
    [&#039;DisplayAuthors&#039;] = {&amp;quot;número-autores&amp;quot;, &amp;quot;display-authors&amp;quot;, &amp;quot;displayauthors&amp;quot;},&lt;br /&gt;
    [&#039;DisplayEditors&#039;] = {&amp;quot;número-editores&amp;quot;, &amp;quot;display-editors&amp;quot;, &amp;quot;displayeditors&amp;quot;},&lt;br /&gt;
    [&#039;Docket&#039;] = &#039;docket&#039;,&lt;br /&gt;
    [&#039;DoiBroken&#039;] = {&#039;fecha-doi-roto&#039;, &#039;doi_inactivedate&#039;, &#039;doi_brokendate&#039;, &#039;DoiBroken&#039;, &#039;doi-broken-date&#039;},&lt;br /&gt;
    [&#039;Edition&#039;] = {&#039;edición&#039;, &#039;edition&#039;},&lt;br /&gt;
    [&#039;Editors&#039;] = &#039;editors&#039;,&lt;br /&gt;
    [&#039;EditorFormat&#039;] = {&amp;quot;editor-format&amp;quot;, &amp;quot;editorformat&amp;quot; },&lt;br /&gt;
    [&#039;EditorSeparator&#039;] = &#039;editor-separator&#039;,&lt;br /&gt;
    [&#039;EditorNameSeparator&#039;] = &#039;editor-name-separator&#039;,&lt;br /&gt;
    [&#039;Embargo&#039;] = {&#039;Embargo&#039;, &#039;embargo&#039;},&lt;br /&gt;
    [&#039;Extra&#039;]   = &#039;extra&#039;, -- Inexistente en la plantilla original    &lt;br /&gt;
    [&#039;Format&#039;]  = {&#039;formato&#039;, &#039;format&#039;},&lt;br /&gt;
    [&#039;ID&#039;] = {&#039;id&#039;, &#039;ID&#039;, &#039;publisherid&#039;},				-- publisherid is deprecated; used by old cite AV media notes and old cite DVD notes; remove after 1 October 2014;&lt;br /&gt;
    [&#039;IgnoreISBN&#039;] = {&#039;ignore-isbn-error&#039;, &#039;ignoreisbnerror&#039;},&lt;br /&gt;
    [&#039;Inset&#039;] = &#039;inset&#039;,&lt;br /&gt;
    [&#039;Interviewer&#039;] = {&#039;entrevistador&#039;, &#039;interviewer&#039;},					-- cite interview&lt;br /&gt;
    [&#039;Issue&#039;] = {&#039;número&#039;, &#039;issue&#039;, &#039;number&#039;},&lt;br /&gt;
    [&#039;Language&#039;] = {&#039;idioma&#039;, &#039;language&#039;, &#039;in&#039;},&lt;br /&gt;
    [&#039;LastAuthorAmp&#039;] = {&#039;ampersand&#039;, &#039;lastauthoramp&#039;, &#039;last-author-amp&#039;},&lt;br /&gt;
    [&#039;LayDate&#039;] = {&#039;fecharesumen&#039;, &#039;fecha-resumen&#039;, &#039;fechaprofano&#039;, &#039;laydate&#039;},&lt;br /&gt;
    [&#039;LaySource&#039;] = {&#039;fuenteresumen&#039;, &#039;fuenteprofano&#039;, &#039;laysource&#039;},&lt;br /&gt;
    [&#039;LayURL&#039;] = {&#039;resumen&#039;, &#039;resumenprofano&#039;, &#039;layurl&#039;, &#039;laysummary&#039;},&lt;br /&gt;
    [&#039;MesAcceso&#039;]  = {&#039;mesacceso&#039;, &#039;accessmonth&#039;}, -- Inexistente en la plantilla original&lt;br /&gt;
    [&#039;Minutes&#039;] = &#039;minutes&#039;,&lt;br /&gt;
    [&#039;Month&#039;] = {&#039;mes&#039;, &#039;month&#039;},&lt;br /&gt;
    [&#039;NameSeparator&#039;] = &#039;name-separator&#039;,&lt;br /&gt;
    [&#039;Network&#039;] = &#039;network&#039;,&lt;br /&gt;
    [&#039;NoPP&#039;] = {&#039;sinpp&#039;, &#039;nopp&#039;},&lt;br /&gt;
    [&#039;NoTracking&#039;] = {&amp;quot;template doc demo&amp;quot;, &#039;nocat&#039;, &lt;br /&gt;
        &#039;notracking&#039;, &amp;quot;no-tracking&amp;quot;},&lt;br /&gt;
    [&#039;OrigYear&#039;] = {&#039;año-original&#039;, &#039;origyear&#039;, &#039;titleyear&#039;},			-- titleyear is deprecated; used in old cite DVD notes; remove after 1 October 2014&lt;br /&gt;
    [&#039;Others&#039;] = {&#039;otros&#039;, &#039;others&#039;, &#039;artist&#039;, &#039;director&#039;, &#039;bandname&#039;},	-- artist and director are deprecated; used in old cite AV media notes and old cite DVD notes; remove after 1 October 2014&lt;br /&gt;
                                                                        -- bandname ya es obsoleto en la wikipedia inglesa.&lt;br /&gt;
    [&#039;Page&#039;] = {&#039;página&#039;, &#039;p&#039;, &#039;page&#039;},&lt;br /&gt;
    [&#039;Pages&#039;] = {&#039;páginas&#039;, &#039;pp&#039;, &#039;pages&#039;},&lt;br /&gt;
    [&#039;Passage&#039;] = &#039;pasaje&#039;,&lt;br /&gt;
    [&#039;PassageURL&#039;] = {&#039;enlace-pasaje&#039;, &#039;url-pasaje&#039;},&lt;br /&gt;
    [&#039;Periodical&#039;] = {&#039;publicación&#039;, &#039;pub-periódica&#039;, &#039;periódico&#039;, &#039;revista&#039;, &#039;obra&#039;, &#039;journal&#039;, &#039;newspaper&#039;, &#039;magazine&#039;, &#039;work&#039;,&lt;br /&gt;
        &#039;website&#039;, &#039;sitioweb&#039;, &#039;sitio web&#039;, &#039;periodical&#039;, &#039;enciclopedia&#039;, &#039;encyclopedia&#039;, &#039;encyclopaedia&#039;, &#039;diccionario&#039;, &#039;dictionary&#039;},&lt;br /&gt;
    [&#039;Place&#039;] = {&#039;lugar&#039;, &#039;localización&#039;, &#039;ubicación&#039;, &#039;ciudad&#039;, &#039;place&#039;, &#039;location&#039;},&lt;br /&gt;
    [&#039;PPrefix&#039;] = &#039;PPrefix&#039;,&lt;br /&gt;
    [&#039;PPPrefix&#039;] = &#039;PPPrefix&#039;,&lt;br /&gt;
	[&#039;Program&#039;] = &#039;program&#039;,							-- cite interview&lt;br /&gt;
    [&#039;PostScript&#039;] = {&#039;puntofinal&#039;, &#039;postscript&#039;},&lt;br /&gt;
    [&#039;PublicationDate&#039;] = {&#039;fecha-publicación&#039;, &#039;publicationdate&#039;, &#039;publication-date&#039; },&lt;br /&gt;
    [&#039;PublicationPlace&#039;] = {&#039;lugar-publicación&#039;, &#039;ubicación-publicación&#039;, &#039;publication-place&#039;, &#039;publicationplace&#039; },&lt;br /&gt;
    [&#039;PublisherName&#039;] = {&#039;editorial&#039;, &#039;publisher&#039;, &#039;distributor&#039;, &#039;institution&#039;},&lt;br /&gt;
    [&#039;Quote&#039;] = {&#039;cita&#039;, &#039;quote&#039;, &#039;quotation&#039;},&lt;br /&gt;
    [&#039;Ref&#039;] = {&#039;ref&#039;, &#039;Ref&#039;},&lt;br /&gt;
    [&#039;RegistrationRequired&#039;] = {&#039;registration&#039;, &#039;requiere-registro&#039;, &#039;requiereregistro&#039;, &#039;registro&#039;},&lt;br /&gt;
    [&#039;Scale&#039;] = &#039;scale&#039;,&lt;br /&gt;
    [&#039;Section&#039;] = &#039;section&#039;,&lt;br /&gt;
    [&#039;Season&#039;] = {&#039;season&#039;, &#039;temporada&#039;},&lt;br /&gt;
    [&#039;Separator&#039;] = {&#039;separador&#039;, &#039;separator&#039;},&lt;br /&gt;
    [&#039;Series&#039;] = {&#039;serie&#039;, &#039;versión&#039;, &#039;colección&#039;, &#039;series&#039;, &#039;version&#039;},&lt;br /&gt;
    [&#039;SeriesSeparator&#039;] = &#039;series-separator&#039;,&lt;br /&gt;
    [&#039;SeriesLink&#039;] = &#039;serieslink&#039;,&lt;br /&gt;
    [&#039;SeriesNumber&#039;] = {&#039;seriesnumber&#039;, &#039;seriesno&#039;},&lt;br /&gt;
    [&#039;SinEd&#039;]   = &#039;sined&#039;, -- Inexistente en la plantilla original        &lt;br /&gt;
    [&#039;Station&#039;] = &#039;station&#039;,&lt;br /&gt;
    [&#039;SubscriptionRequired&#039;] = {&#039;suscripción&#039;, &#039;subscription&#039;},&lt;br /&gt;
    [&#039;Time&#039;] = {&#039;tiempo&#039;, &#039;time&#039;},&lt;br /&gt;
    [&#039;TimeCaption&#039;] = &#039;timecaption&#039;,&lt;br /&gt;
    [&#039;Texto1&#039;] = 1,&lt;br /&gt;
    [&#039;Title&#039;] = {&#039;título&#039;, &#039;title&#039;}, -- No pongo titre&lt;br /&gt;
    [&#039;TitleLink&#039;] = {&#039;titlelink&#039;, &#039;episodelink&#039;, &#039;albumlink&#039; },		-- albumlink is deprecated; used by old cite AV media notes; remove after 1 October 2014&lt;br /&gt;
    [&#039;TitleNote&#039;] = &#039;department&#039;,&lt;br /&gt;
    [&#039;TitleType&#039;] = {&#039;tipo&#039;, &#039;medio&#039;, &#039;type&#039;, &#039;medium&#039;},&lt;br /&gt;
    [&#039;Traductor&#039;] = &#039;traductor&#039;,&lt;br /&gt;
    [&#039;Traductores&#039;] = &#039;traductores&#039;,&lt;br /&gt;
    [&#039;TransChapter&#039;] = {&#039;capítulo-trad&#039;,&#039;capítulotrad&#039;, &#039;trans-chapter&#039;, &#039;trans_chapter&#039; },&lt;br /&gt;
    [&#039;Transcript&#039;] = &#039;transcript&#039;,&lt;br /&gt;
    [&#039;TranscriptURL&#039;] = {&#039;transcript-url&#039;, &#039;transcripturl&#039;},&lt;br /&gt;
    [&#039;TransQuote&#039;] = {&#039;cita-trad&#039;, &#039;citatrad&#039;, &#039;trans-quote&#039;, &#039;trans_quote&#039; },&lt;br /&gt;
    [&#039;TransTitle&#039;] = {&#039;trad-título&#039;, &#039;títulotrad&#039;, &#039;título_trad&#039;, &#039;título-trad&#039;, &#039;trans-title&#039;, &#039;trans_title&#039; },&lt;br /&gt;
    [&#039;URL&#039;] = {&#039;url&#039;, &#039;URL&#039;},&lt;br /&gt;
    [&#039;UrlAccess&#039;] = {&#039;url-acceso&#039;, &#039;url-access&#039;},&lt;br /&gt;
    [&#039;Via&#039;] = &#039;via&#039;,&lt;br /&gt;
    [&#039;Volume&#039;] = {&#039;volumen&#039;, &#039;volume&#039;},&lt;br /&gt;
    [&#039;Year&#039;] = {&#039;año&#039;, &#039;year&#039;},&lt;br /&gt;
&lt;br /&gt;
    [&#039;AuthorList-First&#039;] = {&amp;quot;nombre#&amp;quot;, &amp;quot;nombres#&amp;quot;, &amp;quot;author#-first&amp;quot;, &amp;quot;author-first#&amp;quot;,&lt;br /&gt;
        &amp;quot;first#&amp;quot;, &amp;quot;given#&amp;quot;},&lt;br /&gt;
    [&#039;AuthorList-Last&#039;] = {&amp;quot;apellido#&amp;quot;, &amp;quot;apellidos#&amp;quot;, &amp;quot;autor#&amp;quot;, &amp;quot;author#-last&amp;quot;, &amp;quot;author-last#&amp;quot;, &lt;br /&gt;
        &amp;quot;last#&amp;quot;, &amp;quot;surname#&amp;quot;, &amp;quot;Author#&amp;quot;, &amp;quot;author#&amp;quot;, &amp;quot;authors#&amp;quot;, &amp;quot;subject#&amp;quot;},&lt;br /&gt;
    [&#039;AuthorList-Link&#039;] = {&amp;quot;enlace-autor#&amp;quot;, &amp;quot;enlaceautor#&amp;quot;, &amp;quot;author#-link&amp;quot;, &amp;quot;author-link#&amp;quot;, &lt;br /&gt;
        &amp;quot;author#link&amp;quot;, &amp;quot;authorlink#&amp;quot;, &amp;quot;subjectlink#&amp;quot;, &amp;quot;subject-link#&amp;quot;},&lt;br /&gt;
    [&#039;AuthorList-Mask&#039;] = {&amp;quot;máscara-autor#&amp;quot;,&amp;quot;máscaraautor#&amp;quot;,&amp;quot;author#-mask&amp;quot;, &amp;quot;author-mask#&amp;quot;, &lt;br /&gt;
        &amp;quot;author#mask&amp;quot;, &amp;quot;authormask#&amp;quot;},&lt;br /&gt;
    &lt;br /&gt;
    [&#039;EditorList-First&#039;] = {&amp;quot;nombre-editor#&amp;quot;, &amp;quot;editor#-first&amp;quot;, &lt;br /&gt;
        &amp;quot;editor-first#&amp;quot;, &amp;quot;editor-given#&amp;quot;, &amp;quot;EditorGiven#&amp;quot;},&lt;br /&gt;
    [&#039;EditorList-Last&#039;] = {&amp;quot;apellido-editor#&amp;quot;, &amp;quot;apellidos-editor#&amp;quot;, &amp;quot;editor#-last&amp;quot;, &amp;quot;editor-last#&amp;quot;,&lt;br /&gt;
        &amp;quot;editor-surname#&amp;quot;, &amp;quot;EditorSurname#&amp;quot;, &amp;quot;Editor#&amp;quot;, &amp;quot;editor#&amp;quot;, &amp;quot;editors#&amp;quot;},&lt;br /&gt;
    [&#039;EditorList-Link&#039;] = {&amp;quot;enlace-editor#&amp;quot;, &amp;quot;enlaceeditor#&amp;quot;, &amp;quot;editor#-link&amp;quot;, &amp;quot;editor-link#&amp;quot;, &lt;br /&gt;
        &amp;quot;editor#link&amp;quot;, &amp;quot;editorlink#&amp;quot;},&lt;br /&gt;
    [&#039;EditorList-Mask&#039;] = {&amp;quot;editor#-mask&amp;quot;, &amp;quot;editor-mask#&amp;quot;, &lt;br /&gt;
        &amp;quot;editor#mask&amp;quot;, &amp;quot;editormask#&amp;quot;},&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
citation_config.parametros_a_implementar={ --No aparece en la Wikipedia inglesa&lt;br /&gt;
	[&#039;urltrad&#039;]=true,&lt;br /&gt;
	[&#039;script-title&#039;]=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Default parameter values&lt;br /&gt;
citation_config.defaults = {&lt;br /&gt;
    [&#039;DeadURL&#039;] = &#039;yes&#039;,&lt;br /&gt;
    [&#039;AuthorSeparator&#039;] = &#039;;&#039;,  -- Por comprobar si poner &amp;amp;#059;&amp;amp;#32; ¿No hace falta poner el espacio?&lt;br /&gt;
    [&#039;EditorSeparator&#039;] = &#039;;&#039;,&lt;br /&gt;
    [&#039;NameSeparator&#039;] = &#039;,&#039;,    -- Por comprobar &amp;amp;#32;&lt;br /&gt;
    [&#039;PPrefix&#039;] = &amp;quot;p.&amp;amp;nbsp;&amp;quot;,&lt;br /&gt;
    [&#039;PPPrefix&#039;] = &amp;quot;pp.&amp;amp;nbsp;&amp;quot;,    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Error condition table&lt;br /&gt;
&lt;br /&gt;
The following contains a list of IDs for various error conditions defined in the &lt;br /&gt;
code.  For each ID, we specify a text message to display, an error category to&lt;br /&gt;
include, and whether the error message should be wrapped as a hidden comment.&lt;br /&gt;
&lt;br /&gt;
Anchor changes require identical changes to matching anchor in Help:CS1 errors&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
citation_config.error_conditions = {&lt;br /&gt;
	accessdate_missing_url = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;fechaacceso=&amp;lt;/code&amp;gt; requiere &amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt;&#039;, --&#039;&amp;lt;code&amp;gt;&amp;amp;#124;accessdate=&amp;lt;/code&amp;gt; requires &amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;accessdate_missing_url&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias sin URL y con fecha de acceso&#039;, --&#039;Pages using citations with accessdate and no URL&#039;,&lt;br /&gt;
		hidden = true },&lt;br /&gt;
	archive_missing_date = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;urlarchivo=&amp;lt;/code&amp;gt; requiere &amp;lt;code&amp;gt;&amp;amp;#124;fechaarchivo=&amp;lt;/code&amp;gt;&#039;, --&#039;&amp;lt;code&amp;gt;&amp;amp;#124;archiveurl=&amp;lt;/code&amp;gt; requires &amp;lt;code&amp;gt;&amp;amp;#124;archivedate=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;archive_missing_date&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias sin fechaarchivo y con urlarchivo&#039;, --&#039;Pages with archiveurl citation errors&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	archive_missing_url = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;urlarchivo=&amp;lt;/code&amp;gt; requiere &amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt;&#039;, --&#039;&amp;lt;code&amp;gt;&amp;amp;#124;archiveurl=&amp;lt;/code&amp;gt; requires &amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;archive_missing_url&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias sin URL y con urlarchivo&#039;, --&#039;Pages with archiveurl citation errors&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_authorlink = {&lt;br /&gt;
		message = &#039;Comprueba el valor del &amp;lt;code&amp;gt;&amp;amp;#124;enlaceautor=&amp;lt;/code&amp;gt;&#039;, -- &#039;Check &amp;lt;code&amp;gt;&amp;amp;#124;authorlink=&amp;lt;/code&amp;gt; value&#039;,&lt;br /&gt;
		anchor = &#039;bad_authorlink&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias con enlaceautor incorrecto&#039;, -- &#039;CS1 errors: authorlink&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_date = {&lt;br /&gt;
		message = &#039;Check date values in: &amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;bad_date&#039;,&lt;br /&gt;
		category = &#039;CS1 errors: dates&#039;,&lt;br /&gt;
		hidden = true },&lt;br /&gt;
	bad_doi = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;doi=&amp;lt;/code&amp;gt; incorrecto&#039;,--&#039;Check &amp;lt;code&amp;gt;&amp;amp;#124;doi=&amp;lt;/code&amp;gt; value&#039;,&lt;br /&gt;
		anchor = &#039;bad_doi&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con DOI incorrectos&#039;, --&#039;Pages with DOI errors&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_hdl = {&lt;br /&gt;
		message = &#039;Check &amp;lt;code class=&amp;quot;cs1-code&amp;quot;&amp;gt;&amp;amp;#124;hdl=&amp;lt;/code&amp;gt; value&#039;,&lt;br /&gt;
		anchor = &#039;bad_hdl&#039;,&lt;br /&gt;
		category = &#039;CS1 errors: HDL&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_isbn = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;isbn=&amp;lt;/code&amp;gt; incorrecto&#039;, --&#039;Check &amp;lt;code&amp;gt;&amp;amp;#124;isbn=&amp;lt;/code&amp;gt; value&#039;,&lt;br /&gt;
		anchor = &#039;bad_isbn&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con ISBN incorrectos&#039;, --&#039;Pages with ISBN errors&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_issn = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;issn=&amp;lt;/code&amp;gt; incorrecto&#039;,--&#039;Check &amp;lt;code&amp;gt;&amp;amp;#124;issn=&amp;lt;/code&amp;gt; value&#039;,&lt;br /&gt;
		anchor = &#039;bad_issn&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con ISSN incorrectos&#039;, --&#039;CS1 errors: ISSN&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_lccn = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;lccn=&amp;lt;/code&amp;gt; incorrecto&#039;, --&#039;Check &amp;lt;code&amp;gt;&amp;amp;#124;lccn=&amp;lt;/code&amp;gt; value&#039;,&lt;br /&gt;
		anchor = &#039;bad_lccn&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con LCCN incorrectos&#039;, --&#039;CS1 errors: LCCN&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_ol = {&lt;br /&gt;
		message = &#039;Check &amp;lt;code&amp;gt;&amp;amp;#124;ol=&amp;lt;/code&amp;gt; value&#039;,&lt;br /&gt;
		anchor = &#039;bad_ol&#039;,&lt;br /&gt;
		category = &#039;Pages with OL errors&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_pmc = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;pmc=&amp;lt;/code&amp;gt; incorrecto&#039;, --&#039;Check &amp;lt;code&amp;gt;&amp;amp;#124;pmc=&amp;lt;/code&amp;gt; value&#039;,&lt;br /&gt;
		anchor = &#039;bad_pmc&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con PMC incorrectos&#039;, --&#039;CS1 errors: PMC&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_pmid = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;pmid=&amp;lt;/code&amp;gt; incorrecto&#039;, --&#039;Check &amp;lt;code&amp;gt;&amp;amp;#124;pmid=&amp;lt;/code&amp;gt; value&#039;,&lt;br /&gt;
		anchor = &#039;bad_pmid&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con PMID incorrectos&#039;, -- &#039;CS1 errors: PMID&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_url = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt; incorrecta&#039;, --&#039;Check &amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt; scheme&#039;,&lt;br /&gt;
		anchor = &#039;bad_url&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con URL incorrectas&#039;, --&#039;Pages with URL errors&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	bad_url_autorreferencia = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt; incorrecta con autorreferencia&#039;,&lt;br /&gt;
		anchor = &#039;bad_url_autorreferencia&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con autorreferencias&#039;,&lt;br /&gt;
		hidden = false },		&lt;br /&gt;
	bare_url_missing_title = {&lt;br /&gt;
		message = &#039;$1 sin título&#039;,          --&#039;$1 missing title&#039;,&lt;br /&gt;
		anchor = &#039;bare_url_missing_title&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias sin título y con URL&#039;, -- &#039;Pages with citations having bare URLs&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	citation_missing_title = {&lt;br /&gt;
		message = &#039;Falta el &amp;lt;code&amp;gt;&amp;amp;#124;título=&amp;lt;/code&amp;gt;&#039;, --&#039;Missing or empty &amp;lt;code&amp;gt;&amp;amp;#124;title=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;citation_missing_title&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias sin título&#039;, --&#039;Pages with citations lacking titles&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	cite_web_url = {											-- this error applies to cite web and to cite podcast&lt;br /&gt;
		message = &#039;Falta la &amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt;&#039;, --&#039;Missing or empty &amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;cite_web_url&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias web sin URL&#039;, --&#039;Pages using web citations with no URL&#039;,&lt;br /&gt;
		hidden = true },&lt;br /&gt;
	coauthors_missing_author = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;coautores=&amp;lt;/code&amp;gt; requiere &amp;lt;code&amp;gt;&amp;amp;#124;autor=&amp;lt;/code&amp;gt;&#039;, --&#039;&amp;lt;code&amp;gt;&amp;amp;#124;coauthors=&amp;lt;/code&amp;gt; requires &amp;lt;code&amp;gt;&amp;amp;#124;author=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;coauthors_missing_author&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias sin autor y con coautores&#039;, --&#039;CS1 errors: coauthors without author&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	deprecated_params = {&lt;br /&gt;
		message = &#039;La referencia utiliza el parámetro obsoleto &amp;lt;code&amp;gt;&amp;amp;#124;$1=&amp;lt;/code&amp;gt;&#039;, --&#039;Cite uses deprecated parameters&#039;,&lt;br /&gt;
		anchor = &#039;deprecated_params&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias con parámetros obsoletos&#039;, -- &#039;Pages containing cite templates with deprecated parameters&#039;,&lt;br /&gt;
		hidden = true },&lt;br /&gt;
	empty_citation = {&lt;br /&gt;
		message = &#039;Referencia vacía&#039;, &#039;Empty citation&#039;, --&#039;Empty citation&#039;,&lt;br /&gt;
		anchor = &#039;empty_citation&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias vacías&#039;, --&#039;Pages with empty citations&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	extra_pages = {&lt;br /&gt;
		message = &#039;Extra &amp;lt;code&amp;gt;&amp;amp;#124;páginas=&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;amp;#124;en=&amp;lt;/code&amp;gt;&#039;, --&#039;Extra &amp;lt;code&amp;gt;&amp;amp;#124;pages=&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;amp;#124;at=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;extra_pages&#039;,&lt;br /&gt;
		category = &#039;Pages with citations using conflicting page specifications&#039;, --&#039;Pages with citations using conflicting page specifications&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	format_missing_url = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;formato=&amp;lt;/code&amp;gt; requiere &amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt;&#039;, --&#039;&amp;lt;code&amp;gt;&amp;amp;#124;format=&amp;lt;/code&amp;gt; requires &amp;lt;code&amp;gt;&amp;amp;#124;url=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;format_missing_url&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias sin URL y con formato&#039;, --&#039;Pages using citations with format and no URL&#039;,&lt;br /&gt;
		hidden = true },&lt;br /&gt;
	implict_etal_author = {&lt;br /&gt;
		message = &#039;Se sugiere usar &amp;lt;code&amp;gt;&amp;amp;#124;número-autores=&amp;lt;/code&amp;gt;&#039;, --&#039;&amp;lt;code&amp;gt;&amp;amp;#124;displayauthors=&amp;lt;/code&amp;gt; suggested&#039;,&lt;br /&gt;
		anchor = &#039;displayauthors&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias con et al. implícito en los autores&#039;, --&#039;Pages using citations with old-style implicit et al.&#039;,&lt;br /&gt;
		hidden = true },&lt;br /&gt;
	implict_etal_editor = {&lt;br /&gt;
		message = &#039;Se sugiere usar &amp;lt;code&amp;gt;&amp;amp;#124;número-editores=&amp;lt;/code&amp;gt;&#039;, --&#039;&amp;lt;code&amp;gt;&amp;amp;#124;displayeditors=&amp;lt;/code&amp;gt; suggested&#039;, --&#039;&amp;lt;code&amp;gt;&amp;amp;#124;displayeditors=&amp;lt;/code&amp;gt; suggested&#039;,&lt;br /&gt;
		anchor = &#039;displayeditors&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias con et al. implícito en los editores&#039;, --&#039;Pages using citations with old-style implicit et al. in editors&#039;,&lt;br /&gt;
		hidden = true },&lt;br /&gt;
	parameter_ignored = {&lt;br /&gt;
		message = &#039;Parámetro desconocido &amp;lt;code&amp;gt;&amp;amp;#124;$1=&amp;lt;/code&amp;gt; ignorado&#039;,&lt;br /&gt;
		anchor = &#039;parameter_ignored&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias con parámetros desconocidos&#039;, --&#039;Pages with citations using unsupported parameters&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	parameter_ignored_suggest = {&lt;br /&gt;
		message = &#039;Parámetro desconocido &amp;lt;code&amp;gt;&amp;amp;#124;$1=&amp;lt;/code&amp;gt; ignorado (se sugiere &amp;lt;code&amp;gt;&amp;amp;#124;$2=&amp;lt;/code&amp;gt;)&#039;, --&#039;Unknown parameter &amp;lt;code&amp;gt;&amp;amp;#124;$1=&amp;lt;/code&amp;gt; ignored (&amp;lt;code&amp;gt;&amp;amp;#124;$2=&amp;lt;/code&amp;gt; suggested)&#039;,&lt;br /&gt;
		anchor = &#039;parameter_ignored_suggest&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias con parámetros sugeridos&#039;, --&#039;Pages with citations using unsupported parameters&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
&lt;br /&gt;
    -- Pendiente implementar los parámetros urltrad de la cita web (No existe en la Wikipedia inglesa) y script-title.&lt;br /&gt;
	parametro_por_implementar = {&lt;br /&gt;
		message = &#039;Parámetro desconocido &amp;lt;code&amp;gt;&amp;amp;#124;$1=&amp;lt;/code&amp;gt; ignorado&#039;,&lt;br /&gt;
		anchor = &#039;parametro_por_implementar&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias con parámetros por implementar&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	&lt;br /&gt;
	redundant_parameters = {&lt;br /&gt;
		message = &#039;$1 redundantes&#039;, --&#039;More than one of $1 specified&#039;,&lt;br /&gt;
		anchor = &#039;redundant_parameters&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias con parámetros redundantes&#039;, --&#039;Pages with citations having redundant parameters&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	text_ignored = {&lt;br /&gt;
		message = &#039;Texto «$1» ignorado&#039;, --&#039;Text &amp;quot;$1&amp;quot; ignored&#039;,&lt;br /&gt;
		anchor = &#039;text_ignored&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias con parámetros sin nombre&#039;, -- &#039;Pages with citations using unnamed parameters&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	trans_missing_chapter = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;capítulo-trad=&amp;lt;/code&amp;gt; requiere &amp;lt;code&amp;gt;&amp;amp;#124;capítulo=&amp;lt;/code&amp;gt;&#039;, --&#039;&amp;lt;code&amp;gt;&amp;amp;#124;trans_chapter=&amp;lt;/code&amp;gt; requires &amp;lt;code&amp;gt;&amp;amp;#124;chapter=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;trans_missing_chapter&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias con términos traducidos sin el original&#039;, --&#039;Pages with citations using translated terms without the original&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	trans_missing_title = {&lt;br /&gt;
		message = &#039;&amp;lt;code&amp;gt;&amp;amp;#124;título-trad=&amp;lt;/code&amp;gt; requiere &amp;lt;code&amp;gt;&amp;amp;#124;título=&amp;lt;/code&amp;gt;&#039;,--&#039;&amp;lt;code&amp;gt;&amp;amp;#124;trans_title=&amp;lt;/code&amp;gt; requires &amp;lt;code&amp;gt;&amp;amp;#124;title=&amp;lt;/code&amp;gt;&#039;,&lt;br /&gt;
		anchor = &#039;trans_missing_title&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias con términos traducidos sin el original&#039;, --&#039;Pages with citations using translated terms without the original&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	wikilink_in_url = {&lt;br /&gt;
		message = &#039;Wikienlace dentro del título de la URL&#039;, -- &#039;Wikilink embedded in URL title&#039;,&lt;br /&gt;
		anchor = &#039;wikilink_in_url&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias con wikienlaces dentro del título de la URL&#039;, -- &#039;Pages with citations having wikilinks embedded in URL titles&#039;,&lt;br /&gt;
		hidden = false },&lt;br /&gt;
	url_sugerida = {	-- Se aplica cuando está informado el campo 1 con una url y la cita no tiene informada la url.&lt;br /&gt;
		message = &#039;Texto «$1» ignorado (se sugiere &amp;lt;code&amp;gt;&amp;amp;#124;$2=&amp;lt;/code&amp;gt;)&#039;,&lt;br /&gt;
		anchor = &#039;url_sugerida&#039;,&lt;br /&gt;
		category = &#039;Wikipedia:Páginas con referencias con parámetros sugeridos (URL)&#039;,&lt;br /&gt;
		hidden = false },	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
citation_config.id_handlers = {&lt;br /&gt;
    [&#039;ARXIV&#039;] = {&lt;br /&gt;
        parameters = {&#039;arxiv&#039;, &#039;ARXIV&#039;}, &lt;br /&gt;
        link = &#039;arXiv&#039;,&lt;br /&gt;
        label = &#039;arXiv&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;//arxiv.org/abs/&#039;, -- protocol relative tested 2013-09-04&lt;br /&gt;
        encode = false,&lt;br /&gt;
        COinS = &#039;info:arxiv&#039;,&lt;br /&gt;
        separator = &#039;:&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;BIBCODE&#039;] = {&lt;br /&gt;
        parameters = {&#039;bibcode&#039;, &#039;BIBCODE&#039;}, &lt;br /&gt;
        link = &#039;Bibcode&#039;,&lt;br /&gt;
        label = &#039;Bibcode&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;http://adsabs.harvard.edu/abs/&#039;,&lt;br /&gt;
        encode = false,&lt;br /&gt;
        COinS = &#039;info:bibcode&#039;,&lt;br /&gt;
        separator = &#039;:&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;DOI&#039;] = {&lt;br /&gt;
        parameters = { &#039;doi&#039;, &#039;DOI&#039; },&lt;br /&gt;
        link = &#039;Digital object identifier&#039;,&lt;br /&gt;
        label = &#039;doi&#039;,&lt;br /&gt;
        mode = &#039;manual&#039;,&lt;br /&gt;
        prefix = &#039;http://dx.doi.org/&#039;,&lt;br /&gt;
        COinS = &#039;info:doi&#039;,&lt;br /&gt;
        separator = &#039;:&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;EISSN&#039;] = {&lt;br /&gt;
		parameters = {&#039;eissn&#039;, &#039;EISSN&#039;},&lt;br /&gt;
		link = &#039;International Standard Serial Number#Electronic ISSN&#039;,&lt;br /&gt;
		redirect = &#039;eISSN (identifier)&#039;,&lt;br /&gt;
		q = &#039;Q46339674&#039;,&lt;br /&gt;
		label = &#039;eISSN&#039;,&lt;br /&gt;
        mode = &#039;manual&#039;,&lt;br /&gt;
		prefix = &#039;//www.worldcat.org/issn/&#039;,&lt;br /&gt;
		COinS = &#039;rft.eissn&#039;,&lt;br /&gt;
		encode = false,&lt;br /&gt;
		separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		},&lt;br /&gt;
	[&#039;HDL&#039;] = {&lt;br /&gt;
		parameters = { &#039;hdl&#039;, &#039;HDL&#039; },&lt;br /&gt;
		link = &#039;Handle System&#039;,&lt;br /&gt;
		redirect = &#039;hdl (identifier)&#039;,&lt;br /&gt;
		q = &#039;Q3126718&#039;,&lt;br /&gt;
		mode = &#039;external&#039;,&lt;br /&gt;
		label = &#039;hdl&#039;,&lt;br /&gt;
		prefix = &#039;//hdl.handle.net/&#039;,&lt;br /&gt;
		COinS = &#039;info:hdl&#039;,&lt;br /&gt;
		separator = &#039;:&#039;,&lt;br /&gt;
		encode = true,&lt;br /&gt;
		custom_access = &#039;hdl-access&#039;,&lt;br /&gt;
		},&lt;br /&gt;
    [&#039;ISBN&#039;] = {&lt;br /&gt;
        parameters = {&#039;isbn&#039;, &#039;ISBN&#039;, &#039;isbn13&#039;, &#039;ISBN13&#039;}, &lt;br /&gt;
        link = &#039;ISBN&#039;, --&#039;International Standard Book Number&#039;,&lt;br /&gt;
        label = &#039;ISBN&#039;,&lt;br /&gt;
        mode = &#039;manual&#039;,&lt;br /&gt;
        prefix = &#039;Special:BookSources/&#039;,&lt;br /&gt;
        COinS = &#039;rft.isbn&#039;,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;ISSN&#039;] = {&lt;br /&gt;
        parameters = {&#039;issn&#039;, &#039;ISSN&#039;}, &lt;br /&gt;
        link = &#039;ISSN&#039;, --&#039;International Standard Serial Number&#039;,&lt;br /&gt;
        label = &#039;ISSN&#039;,&lt;br /&gt;
        mode = &#039;manual&#039;,&lt;br /&gt;
        prefix = &#039;//portal.issn.org/resource/ISSN/&#039;,&lt;br /&gt;
        COinS = &#039;rft.issn&#039;,&lt;br /&gt;
        encode = false,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;JFM&#039;] = {&lt;br /&gt;
        parameters = {&#039;jfm&#039;, &#039;JFM&#039;}, &lt;br /&gt;
        link = &#039;Jahrbuch über die Fortschritte der Mathematik&#039;,&lt;br /&gt;
        label = &#039;JFM&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;http://www.zentralblatt-math.org/zmath/en/search/?format=complete&amp;amp;q=an:&#039;,&lt;br /&gt;
        COinS = &#039;rft.jfm&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;JSTOR&#039;] = {&lt;br /&gt;
        parameters = {&#039;jstor&#039;, &#039;JSTOR&#039;}, &lt;br /&gt;
        link = &#039;JSTOR&#039;,&lt;br /&gt;
        label = &#039;JSTOR&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;//www.jstor.org/stable/&#039;, -- protocol relative tested 2013-09-04&lt;br /&gt;
        COinS = &#039;rft.jstor&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;LCCN&#039;] = {&lt;br /&gt;
        parameters = {&#039;LCCN&#039;, &#039;lccn&#039;}, &lt;br /&gt;
        link = &#039;Library of Congress Control Number&#039;,&lt;br /&gt;
        label = &#039;LCCN&#039;,&lt;br /&gt;
        mode = &#039;manual&#039;,&lt;br /&gt;
        prefix = &#039;http://lccn.loc.gov/&#039;,&lt;br /&gt;
        COinS = &#039;rft.lccn&#039;,&lt;br /&gt;
        encode = false,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;MR&#039;] = {&lt;br /&gt;
        parameters = {&#039;MR&#039;, &#039;mr&#039;}, &lt;br /&gt;
        link = &#039;Mathematical Reviews&#039;,&lt;br /&gt;
        label = &#039;MR&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;//www.ams.org/mathscinet-getitem?mr=&#039;, -- protocol relative tested 2013-09-04&lt;br /&gt;
        COinS = &#039;rft.mr&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;OCLC&#039;] = {&lt;br /&gt;
        parameters = {&#039;OCLC&#039;, &#039;oclc&#039;}, &lt;br /&gt;
        link = &#039;OCLC&#039;, --&#039;Online Computer Library Center&#039;,&lt;br /&gt;
        label = &#039;OCLC&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;//www.worldcat.org/oclc/&#039;,&lt;br /&gt;
        COinS = &#039;info:oclcnum&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;OL&#039;] = {&lt;br /&gt;
        parameters = { &#039;ol&#039;, &#039;OL&#039; },&lt;br /&gt;
        link = &#039;Open Library&#039;,&lt;br /&gt;
        label = &#039;OL&#039;,&lt;br /&gt;
        mode = &#039;manual&#039;,&lt;br /&gt;
        COinS = &#039;info:olnum&#039;,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;OSTI&#039;] = {&lt;br /&gt;
        parameters = {&#039;OSTI&#039;, &#039;osti&#039;}, &lt;br /&gt;
        link = &#039;Office of Scientific and Technical Information&#039;,&lt;br /&gt;
        label = &#039;OSTI&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;//www.osti.gov/energycitations/product.biblio.jsp?osti_id=&#039;, -- protocol relative tested 2013-09-04&lt;br /&gt;
        COinS = &#039;info:osti&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;PMC&#039;] = {&lt;br /&gt;
        parameters = {&#039;PMC&#039;, &#039;pmc&#039;}, &lt;br /&gt;
        link = &#039;PubMed Central&#039;,&lt;br /&gt;
        label = &#039;PMC&#039;,&lt;br /&gt;
        mode = &#039;manual&#039;,		-- changed to support unlinking of PMC identifier when article is embargoed&lt;br /&gt;
        prefix = &#039;//www.ncbi.nlm.nih.gov/pmc/articles/PMC&#039;, &lt;br /&gt;
        suffix = &amp;quot; &amp;quot;,&lt;br /&gt;
        COinS = &#039;info:pmc&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;PMID&#039;] = {&lt;br /&gt;
        parameters = {&#039;PMID&#039;, &#039;pmid&#039;}, &lt;br /&gt;
        link = &#039;PubMed Identifier&#039;,&lt;br /&gt;
        label = &#039;PMID&#039;,&lt;br /&gt;
        mode = &#039;manual&#039;,		-- changed from external manual to support PMID validation&lt;br /&gt;
        prefix = &#039;//www.ncbi.nlm.nih.gov/pubmed/&#039;,&lt;br /&gt;
        COinS = &#039;info:pmid&#039;,&lt;br /&gt;
        encode = false,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;RFC&#039;] = {&lt;br /&gt;
        parameters = {&#039;RFC&#039;, &#039;rfc&#039;}, &lt;br /&gt;
        link = &#039;Request for Comments&#039;,&lt;br /&gt;
        label = &#039;RFC&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;//tools.ietf.org/html/rfc&#039;,&lt;br /&gt;
        COinS = &#039;info:rfc&#039;,&lt;br /&gt;
        encode = false,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
	[&#039;S2CID&#039;] = {&lt;br /&gt;
		parameters = {&#039;s2cid&#039;, &#039;S2CID&#039;},&lt;br /&gt;
		link = &#039;Semantic Scholar&#039;,&lt;br /&gt;
		label = &#039;S2CID&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
		prefix = &#039;https://api.semanticscholar.org/CorpusID:&#039;,&lt;br /&gt;
		COinS = &#039;pre&#039;,															-- use prefix value&lt;br /&gt;
		encode = false,&lt;br /&gt;
		separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
	},&lt;br /&gt;
    [&#039;SSRN&#039;] = {&lt;br /&gt;
        parameters = {&#039;SSRN&#039;, &#039;ssrn&#039;}, &lt;br /&gt;
        link = &#039;Social Science Research Network&#039;,&lt;br /&gt;
        label = &#039;SSRN&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;//ssrn.com/abstract=&#039;, -- protocol relative tested 2013-09-04&lt;br /&gt;
        COinS = &#039;info:ssrn&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;ZBL&#039;] = {&lt;br /&gt;
        parameters = {&#039;ZBL&#039;, &#039;zbl&#039;}, &lt;br /&gt;
        link = &#039;Zentralblatt MATH&#039;,&lt;br /&gt;
        label = &#039;Zbl&#039;,&lt;br /&gt;
        mode = &#039;external&#039;,&lt;br /&gt;
        prefix = &#039;http://www.zentralblatt-math.org/zmath/en/search/?format=complete&amp;amp;q=an:&#039;,&lt;br /&gt;
        COinS = &#039;info:zbl&#039;,&lt;br /&gt;
        encode = true,&lt;br /&gt;
        separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    },&lt;br /&gt;
    [&#039;WIKIDATA&#039;] = {&lt;br /&gt;
    	parameters = {&#039;wikidata&#039;},&lt;br /&gt;
    	link = &#039;Wikidata&#039;,&lt;br /&gt;
    	label = &#039;Wikidata&#039;,&lt;br /&gt;
    	mode = &#039;internal&#039;,&lt;br /&gt;
    	prefix = &#039;:d:&#039;,&lt;br /&gt;
    	COinS = &#039;&#039;, -- ?&lt;br /&gt;
    	encode = false,&lt;br /&gt;
    	separator = &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return citation_config;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=M%C3%B3dulo:Date&amp;diff=291</id>
		<title>Módulo:Date</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=M%C3%B3dulo:Date&amp;diff=291"/>
		<updated>2026-06-14T04:12:55Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Date functions for use by other modules.&lt;br /&gt;
-- I18N and time zones are not supported.&lt;br /&gt;
&lt;br /&gt;
local MINUS = &#039;−&#039;  -- Unicode U+2212 MINUS SIGN&lt;br /&gt;
local floor = math.floor&lt;br /&gt;
&lt;br /&gt;
local Date, DateDiff, diffmt  -- forward declarations&lt;br /&gt;
local uniq = { &#039;unique identifier&#039; }&lt;br /&gt;
&lt;br /&gt;
local function is_date(t)&lt;br /&gt;
	-- The system used to make a date read-only means there is no unique&lt;br /&gt;
	-- metatable that is conveniently accessible to check.&lt;br /&gt;
	return type(t) == &#039;table&#039; and t._id == uniq&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function is_diff(t)&lt;br /&gt;
	return type(t) == &#039;table&#039; and getmetatable(t) == diffmt&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function _list_join(list, sep)&lt;br /&gt;
	return table.concat(list, sep)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function collection()&lt;br /&gt;
	-- Return a table to hold items.&lt;br /&gt;
	return {&lt;br /&gt;
		n = 0,&lt;br /&gt;
		add = function (self, item)&lt;br /&gt;
			self.n = self.n + 1&lt;br /&gt;
			self[self.n] = item&lt;br /&gt;
		end,&lt;br /&gt;
		join = _list_join,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function strip_to_nil(text)&lt;br /&gt;
	-- If text is a string, return its trimmed content, or nil if empty.&lt;br /&gt;
	-- Otherwise return text (convenient when Date fields are provided from&lt;br /&gt;
	-- another module which may pass a string, a number, or another type).&lt;br /&gt;
	if type(text) == &#039;string&#039; then&lt;br /&gt;
		text = text:match(&#039;(%S.-)%s*$&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function is_leap_year(year, calname)&lt;br /&gt;
	-- Return true if year is a leap year.&lt;br /&gt;
	if calname == &#039;Julian&#039; then&lt;br /&gt;
		return year % 4 == 0&lt;br /&gt;
	end&lt;br /&gt;
	return (year % 4 == 0 and year % 100 ~= 0) or year % 400 == 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function days_in_month(year, month, calname)&lt;br /&gt;
	-- Return number of days (1..31) in given month (1..12).&lt;br /&gt;
	if month == 2 and is_leap_year(year, calname) then&lt;br /&gt;
		return 29&lt;br /&gt;
	end&lt;br /&gt;
	return ({ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 })[month]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function h_m_s(time)&lt;br /&gt;
	-- Return hour, minute, second extracted from fraction of a day.&lt;br /&gt;
	time = floor(time * 24 * 3600 + 0.5)  -- number of seconds&lt;br /&gt;
	local second = time % 60&lt;br /&gt;
	time = floor(time / 60)&lt;br /&gt;
	return floor(time / 60), time % 60, second&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hms(date)&lt;br /&gt;
	-- Return fraction of a day from date&#039;s time, where (0 &amp;lt;= fraction &amp;lt; 1)&lt;br /&gt;
	-- if the values are valid, but could be anything if outside range.&lt;br /&gt;
	return (date.hour + (date.minute + date.second / 60) / 60) / 24&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function julian_date(date)&lt;br /&gt;
	-- Return jd, jdz from a Julian or Gregorian calendar date where&lt;br /&gt;
	--   jd = Julian date and its fractional part is zero at noon&lt;br /&gt;
	--   jdz = same, but assume time is 00:00:00 if no time given&lt;br /&gt;
	-- http://www.tondering.dk/claus/cal/julperiod.php#formula&lt;br /&gt;
	-- Testing shows this works for all dates from year -9999 to 9999!&lt;br /&gt;
	-- JDN 0 is the 24-hour period starting at noon UTC on Monday&lt;br /&gt;
	--    1 January 4713 BC  = (-4712, 1, 1)   Julian calendar&lt;br /&gt;
	--   24 November 4714 BC = (-4713, 11, 24) Gregorian calendar&lt;br /&gt;
	local offset&lt;br /&gt;
	local a = floor((14 - date.month)/12)&lt;br /&gt;
	local y = date.year + 4800 - a&lt;br /&gt;
	if date.calendar == &#039;Julian&#039; then&lt;br /&gt;
		offset = floor(y/4) - 32083&lt;br /&gt;
	else&lt;br /&gt;
		offset = floor(y/4) - floor(y/100) + floor(y/400) - 32045&lt;br /&gt;
	end&lt;br /&gt;
	local m = date.month + 12*a - 3&lt;br /&gt;
	local jd = date.day + floor((153*m + 2)/5) + 365*y + offset&lt;br /&gt;
	if date.hastime then&lt;br /&gt;
		jd = jd + hms(date) - 0.5&lt;br /&gt;
		return jd, jd&lt;br /&gt;
	end&lt;br /&gt;
	return jd, jd - 0.5&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function set_date_from_jd(date)&lt;br /&gt;
	-- Set the fields of table date from its Julian date field.&lt;br /&gt;
	-- Return true if date is valid.&lt;br /&gt;
	-- http://www.tondering.dk/claus/cal/julperiod.php#formula&lt;br /&gt;
	-- This handles the proleptic Julian and Gregorian calendars.&lt;br /&gt;
	-- Negative Julian dates are not defined but they work.&lt;br /&gt;
	local calname = date.calendar&lt;br /&gt;
	local low, high  -- min/max limits for date ranges −9999-01-01 to 9999-12-31&lt;br /&gt;
	if calname == &#039;Gregorian&#039; then&lt;br /&gt;
		low, high = -1930999.5, 5373484.49999&lt;br /&gt;
	elseif calname == &#039;Julian&#039; then&lt;br /&gt;
		low, high = -1931076.5, 5373557.49999&lt;br /&gt;
	else&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	local jd = date.jd&lt;br /&gt;
	if not (type(jd) == &#039;number&#039; and low &amp;lt;= jd and jd &amp;lt;= high) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	local jdn = floor(jd)&lt;br /&gt;
	if date.hastime then&lt;br /&gt;
		local time = jd - jdn  -- 0 &amp;lt;= time &amp;lt; 1&lt;br /&gt;
		if time &amp;gt;= 0.5 then    -- if at or after midnight of next day&lt;br /&gt;
			jdn = jdn + 1&lt;br /&gt;
			time = time - 0.5&lt;br /&gt;
		else&lt;br /&gt;
			time = time + 0.5&lt;br /&gt;
		end&lt;br /&gt;
		date.hour, date.minute, date.second = h_m_s(time)&lt;br /&gt;
	else&lt;br /&gt;
		date.second = 0&lt;br /&gt;
		date.minute = 0&lt;br /&gt;
		date.hour = 0&lt;br /&gt;
	end&lt;br /&gt;
	local b, c&lt;br /&gt;
	if calname == &#039;Julian&#039; then&lt;br /&gt;
		b = 0&lt;br /&gt;
		c = jdn + 32082&lt;br /&gt;
	else  -- Gregorian&lt;br /&gt;
		local a = jdn + 32044&lt;br /&gt;
		b = floor((4*a + 3)/146097)&lt;br /&gt;
		c = a - floor(146097*b/4)&lt;br /&gt;
	end&lt;br /&gt;
	local d = floor((4*c + 3)/1461)&lt;br /&gt;
	local e = c - floor(1461*d/4)&lt;br /&gt;
	local m = floor((5*e + 2)/153)&lt;br /&gt;
	date.day = e - floor((153*m + 2)/5) + 1&lt;br /&gt;
	date.month = m + 3 - 12*floor(m/10)&lt;br /&gt;
	date.year = 100*b + d - 4800 + floor(m/10)&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fix_numbers(numbers, y, m, d, H, M, S, partial, hastime, calendar)&lt;br /&gt;
	-- Put the result of normalizing the given values in table numbers.&lt;br /&gt;
	-- The result will have valid m, d values if y is valid; caller checks y.&lt;br /&gt;
	-- The logic of PHP mktime is followed where m or d can be zero to mean&lt;br /&gt;
	-- the previous unit, and -1 is the one before that, etc.&lt;br /&gt;
	-- Positive values carry forward.&lt;br /&gt;
	local date&lt;br /&gt;
	if not (1 &amp;lt;= m and m &amp;lt;= 12) then&lt;br /&gt;
		date = Date(y, 1, 1)&lt;br /&gt;
		if not date then return end&lt;br /&gt;
		date = date + ((m - 1) .. &#039;m&#039;)&lt;br /&gt;
		y, m = date.year, date.month&lt;br /&gt;
	end&lt;br /&gt;
	local days_hms&lt;br /&gt;
	if not partial then&lt;br /&gt;
		if hastime and H and M and S then&lt;br /&gt;
			if not (0 &amp;lt;= H and H &amp;lt;= 23 and&lt;br /&gt;
					0 &amp;lt;= M and M &amp;lt;= 59 and&lt;br /&gt;
					0 &amp;lt;= S and S &amp;lt;= 59) then&lt;br /&gt;
				days_hms = hms({ hour = H, minute = M, second = S })&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if days_hms or not (1 &amp;lt;= d and d &amp;lt;= days_in_month(y, m, calendar)) then&lt;br /&gt;
			date = date or Date(y, m, 1)&lt;br /&gt;
			if not date then return end&lt;br /&gt;
			date = date + (d - 1 + (days_hms or 0))&lt;br /&gt;
			y, m, d = date.year, date.month, date.day&lt;br /&gt;
			if days_hms then&lt;br /&gt;
				H, M, S = date.hour, date.minute, date.second&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	numbers.year = y&lt;br /&gt;
	numbers.month = m&lt;br /&gt;
	numbers.day = d&lt;br /&gt;
	if days_hms then&lt;br /&gt;
		-- Don&#039;t set H unless it was valid because a valid H will set hastime.&lt;br /&gt;
		numbers.hour = H&lt;br /&gt;
		numbers.minute = M&lt;br /&gt;
		numbers.second = S&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function set_date_from_numbers(date, numbers, options)&lt;br /&gt;
	-- Set the fields of table date from numeric values.&lt;br /&gt;
	-- Return true if date is valid.&lt;br /&gt;
	if type(numbers) ~= &#039;table&#039; then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	local y = numbers.year   or date.year&lt;br /&gt;
	local m = numbers.month  or date.month&lt;br /&gt;
	local d = numbers.day    or date.day&lt;br /&gt;
	local H = numbers.hour&lt;br /&gt;
	local M = numbers.minute or date.minute or 0&lt;br /&gt;
	local S = numbers.second or date.second or 0&lt;br /&gt;
	local need_fix&lt;br /&gt;
	if y and m and d then&lt;br /&gt;
		date.partial = nil&lt;br /&gt;
		if not (-9999 &amp;lt;= y and y &amp;lt;= 9999 and&lt;br /&gt;
			1 &amp;lt;= m and m &amp;lt;= 12 and&lt;br /&gt;
			1 &amp;lt;= d and d &amp;lt;= days_in_month(y, m, date.calendar)) then&lt;br /&gt;
				if not date.want_fix then&lt;br /&gt;
					return&lt;br /&gt;
				end&lt;br /&gt;
				need_fix = true&lt;br /&gt;
		end&lt;br /&gt;
	elseif y and date.partial then&lt;br /&gt;
		if d or not (-9999 &amp;lt;= y and y &amp;lt;= 9999) then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		if m and not (1 &amp;lt;= m and m &amp;lt;= 12) then&lt;br /&gt;
			if not date.want_fix then&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
			need_fix = true&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	if date.partial then&lt;br /&gt;
		H = nil  -- ignore any time&lt;br /&gt;
		M = nil&lt;br /&gt;
		S = nil&lt;br /&gt;
	else&lt;br /&gt;
		if H then&lt;br /&gt;
			-- It is not possible to set M or S without also setting H.&lt;br /&gt;
			date.hastime = true&lt;br /&gt;
		else&lt;br /&gt;
			H = 0&lt;br /&gt;
		end&lt;br /&gt;
		if not (0 &amp;lt;= H and H &amp;lt;= 23 and&lt;br /&gt;
				0 &amp;lt;= M and M &amp;lt;= 59 and&lt;br /&gt;
				0 &amp;lt;= S and S &amp;lt;= 59) then&lt;br /&gt;
			if date.want_fix then&lt;br /&gt;
				need_fix = true&lt;br /&gt;
			else&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	date.want_fix = nil&lt;br /&gt;
	if need_fix then&lt;br /&gt;
		fix_numbers(numbers, y, m, d, H, M, S, date.partial, date.hastime, date.calendar)&lt;br /&gt;
		return set_date_from_numbers(date, numbers, options)&lt;br /&gt;
	end&lt;br /&gt;
	date.year = y    -- -9999 to 9999 (&#039;n BC&#039; → year = 1 - n)&lt;br /&gt;
	date.month = m   -- 1 to 12 (may be nil if partial)&lt;br /&gt;
	date.day = d     -- 1 to 31 (* = nil if partial)&lt;br /&gt;
	date.hour = H    -- 0 to 59 (*)&lt;br /&gt;
	date.minute = M  -- 0 to 59 (*)&lt;br /&gt;
	date.second = S  -- 0 to 59 (*)&lt;br /&gt;
	if type(options) == &#039;table&#039; then&lt;br /&gt;
		for _, k in ipairs({ &#039;am&#039;, &#039;era&#039;, &#039;format&#039; }) do&lt;br /&gt;
			if options[k] then&lt;br /&gt;
				date.options[k] = options[k]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_option_table(options1, options2)&lt;br /&gt;
	-- If options1 is a string, return a table with its settings, or&lt;br /&gt;
	-- if it is a table, use its settings.&lt;br /&gt;
	-- Missing options are set from table options2 or defaults.&lt;br /&gt;
	-- If a default is used, a flag is set so caller knows the value was not intentionally set.&lt;br /&gt;
	-- Valid option settings are:&lt;br /&gt;
	-- am: &#039;am&#039;, &#039;a.m.&#039;, &#039;AM&#039;, &#039;A.M.&#039;&lt;br /&gt;
	--     &#039;pm&#039;, &#039;p.m.&#039;, &#039;PM&#039;, &#039;P.M.&#039; (each has same meaning as corresponding item above)&lt;br /&gt;
	-- era: &#039;BCMINUS&#039;, &#039;BCNEGATIVE&#039;, &#039;BC&#039;, &#039;B.C.&#039;, &#039;BCE&#039;, &#039;B.C.E.&#039;, &#039;AD&#039;, &#039;A.D.&#039;, &#039;CE&#039;, &#039;C.E.&#039;&lt;br /&gt;
	-- Option am = &#039;am&#039; does not mean the hour is AM; it means &#039;am&#039; or &#039;pm&#039; is used, depending on the hour,&lt;br /&gt;
	--    and am = &#039;pm&#039; has the same meaning.&lt;br /&gt;
	-- Similarly, era = &#039;BC&#039; means &#039;BC&#039; is used if year &amp;lt;= 0.&lt;br /&gt;
	-- BCMINUS displays a MINUS if year &amp;lt; 0 and the display format does not include %{era}.&lt;br /&gt;
	-- BCNEGATIVE is similar but displays a hyphen.&lt;br /&gt;
	local result = { bydefault = {} }&lt;br /&gt;
	if type(options1) == &#039;table&#039; then&lt;br /&gt;
		result.am = options1.am&lt;br /&gt;
		result.era = options1.era&lt;br /&gt;
	elseif type(options1) == &#039;string&#039; then&lt;br /&gt;
		-- Example: &#039;am:AM era:BC&#039; or &#039;am=AM era=BC&#039;.&lt;br /&gt;
		for item in options1:gmatch(&#039;%S+&#039;) do&lt;br /&gt;
			local lhs, rhs = item:match(&#039;^(%w+)[:=](.+)$&#039;)&lt;br /&gt;
			if lhs then&lt;br /&gt;
				result[lhs] = rhs&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	options2 = type(options2) == &#039;table&#039; and options2 or {}&lt;br /&gt;
	local defaults = { am = &#039;am&#039;, era = &#039;a. C.&#039; }&lt;br /&gt;
	for k, v in pairs(defaults) do&lt;br /&gt;
		if not result[k] then&lt;br /&gt;
			if options2[k] then&lt;br /&gt;
				result[k] = options2[k]&lt;br /&gt;
			else&lt;br /&gt;
				result[k] = v&lt;br /&gt;
				result.bydefault[k] = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local ampm_options = {&lt;br /&gt;
	-- lhs = input text accepted as an am/pm option&lt;br /&gt;
	-- rhs = code used internally&lt;br /&gt;
	[&#039;am&#039;]   = &#039;am&#039;,&lt;br /&gt;
	[&#039;AM&#039;]   = &#039;AM&#039;,&lt;br /&gt;
	[&#039;a.m.&#039;] = &#039;a.m.&#039;,&lt;br /&gt;
	[&#039;A.M.&#039;] = &#039;A.M.&#039;,&lt;br /&gt;
	[&#039;pm&#039;]   = &#039;am&#039;,  -- same as am&lt;br /&gt;
	[&#039;PM&#039;]   = &#039;AM&#039;,&lt;br /&gt;
	[&#039;p.m.&#039;] = &#039;a.m.&#039;,&lt;br /&gt;
	[&#039;P.M.&#039;] = &#039;A.M.&#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local era_text = {&lt;br /&gt;
	-- Text for displaying an era with a positive year (after adjusting&lt;br /&gt;
	-- by replacing year with 1 - year if date.year &amp;lt;= 0).&lt;br /&gt;
	-- options.era = { year&amp;lt;=0 , year&amp;gt;0 }&lt;br /&gt;
	[&#039;BCMINUS&#039;]    = { &#039;BC&#039;    , &#039;&#039;    , isbc = true, sign = MINUS },&lt;br /&gt;
	[&#039;BCNEGATIVE&#039;] = { &#039;BC&#039;    , &#039;&#039;    , isbc = true, sign = &#039;-&#039;   },&lt;br /&gt;
	[&#039;BC&#039;]         = { &#039;BC&#039;    , &#039;&#039;    , isbc = true },&lt;br /&gt;
	[&#039;B.C.&#039;]       = { &#039;B.C.&#039;  , &#039;&#039;    , isbc = true },&lt;br /&gt;
	[&#039;BCE&#039;]        = { &#039;BCE&#039;   , &#039;&#039;    , isbc = true },&lt;br /&gt;
	[&#039;B.C.E.&#039;]     = { &#039;B.C.E.&#039;, &#039;&#039;    , isbc = true },&lt;br /&gt;
	[&#039;AD&#039;]         = { &#039;BC&#039;    , &#039;AD&#039;   },&lt;br /&gt;
	[&#039;A.D.&#039;]       = { &#039;B.C.&#039;  , &#039;A.D.&#039; },&lt;br /&gt;
	[&#039;CE&#039;]         = { &#039;BCE&#039;   , &#039;CE&#039;   },&lt;br /&gt;
	[&#039;C.E.&#039;]       = { &#039;B.C.E.&#039;, &#039;C.E.&#039; },&lt;br /&gt;
	--ABREVIATURAS EN ESPAÑOL--&lt;br /&gt;
	[&#039;a. C.&#039;]         = { &#039;a. C.&#039;       , &#039;&#039;    , isbc = true },  --antes de Cristo&lt;br /&gt;
	[&#039;a. de C.&#039;]      = { &#039;a. de C.&#039;    , &#039;&#039;    , isbc = true },  --antes de Cristo&lt;br /&gt;
	[&#039;a. de J. C.&#039;]   = { &#039;a. de J. C.&#039; , &#039;&#039;    , isbc = true },  --antes de Jesucristo&lt;br /&gt;
	[&#039;a. J. C.&#039;]      = { &#039;a. J. C.&#039;    , &#039;&#039;    , isbc = true },  --antes de Jesucristo&lt;br /&gt;
	[&#039;AEC&#039;]           = { &#039;AEC&#039;         , &#039;&#039;    , isbc = true },  --antes de la era común&lt;br /&gt;
	[&#039;a. e. c.&#039;]      = { &#039;a. e. c.&#039;    , &#039;&#039;    , isbc = true },  --antes de la era común&lt;br /&gt;
	[&#039;a. n. e.&#039;]      = { &#039;a. n. e.&#039;    , &#039;&#039;    , isbc = true },  --antes de nuestra era&lt;br /&gt;
	[&#039;a. e. v.&#039;]      = { &#039;a. e. v.&#039;    , &#039;&#039;    , isbc = true },  --antes de la era vulgar&lt;br /&gt;
	[&#039;d. C.&#039;]         = { &#039;a. C.&#039;       , &#039;d. C.&#039; },              --después de Cristo&lt;br /&gt;
	[&#039;d. de C.&#039;]      = { &#039;a. de C.&#039;    , &#039;d. de C.&#039; },           --después de Cristo&lt;br /&gt;
	[&#039;d. de J. C.&#039;]   = { &#039;a. de J. C.&#039; , &#039;d. de J. C.&#039; },        --después de Jesucristo&lt;br /&gt;
	[&#039;d. J. C.&#039;]      = { &#039;a. J. C.&#039;    , &#039;d. J. C.&#039; },           --después de Jesucristo&lt;br /&gt;
	[&#039;EC&#039;]            = { &#039;AEC&#039;         , &#039;EC&#039; },                 --era común&lt;br /&gt;
	[&#039;e. c.&#039;]         = { &#039;a. e. c.&#039;    , &#039;e. c.&#039; },              --era común&lt;br /&gt;
	[&#039;n. e.&#039;]         = { &#039;a. n. e.&#039;    , &#039;n. e.&#039; },              --nuestra era&lt;br /&gt;
	[&#039;e. v.&#039;]         = { &#039;a. e. v.&#039;    , &#039;e. v.&#039; },              --era vulgar&lt;br /&gt;
	[&#039;A. D.&#039;]         = { &#039;a. C.&#039;       , &#039;A. D.&#039; },              --anno Domini&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function get_era_for_year(era, year)&lt;br /&gt;
	return (era_text[era] or era_text[&#039;a. C.&#039;])[year &amp;gt; 0 and 2 or 1]:gsub(&amp;quot; &amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot;) or &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function strftime(date, format, options)&lt;br /&gt;
	-- Return date formatted as a string using codes similar to those&lt;br /&gt;
	-- in the C strftime library function.&lt;br /&gt;
	local sformat = string.format&lt;br /&gt;
	local shortcuts = {&lt;br /&gt;
		[&#039;%c&#039;] = &#039;%-I:%M %p %-d de %B de %-Y %{era}&#039;,  -- date and time: 2:30 pm 1 de abril de 2016&lt;br /&gt;
		[&#039;%C&#039;] = &#039;%-d de %B de %-Y, %H:%M:%S&#039;,	   -- date and time: 1 de abril de 2016, 14:30&lt;br /&gt;
		[&#039;%x&#039;] = &#039;%-d de %B de %-Y %{era}&#039;,            -- date:          1 de abril de 2016&lt;br /&gt;
		[&#039;%X&#039;] = &#039;%-I:%M %p&#039;,                          -- time:          2:30 pm&lt;br /&gt;
	}&lt;br /&gt;
	if shortcuts[format] then&lt;br /&gt;
		format = shortcuts[format]&lt;br /&gt;
	end&lt;br /&gt;
	local codes = {&lt;br /&gt;
		a = { field = &#039;dayabbr&#039; },&lt;br /&gt;
		A = { field = &#039;dayname&#039; },&lt;br /&gt;
		b = { field = &#039;monthabbr&#039; },&lt;br /&gt;
		B = { field = &#039;monthname&#039; },&lt;br /&gt;
		u = { fmt = &#039;%d&#039;  , field = &#039;dowiso&#039; },&lt;br /&gt;
		w = { fmt = &#039;%d&#039;  , field = &#039;dow&#039; },&lt;br /&gt;
		d = { fmt = &#039;%02d&#039;, fmt2 = &#039;%d&#039;, field = &#039;day&#039; },&lt;br /&gt;
		m = { fmt = &#039;%02d&#039;, fmt2 = &#039;%d&#039;, field = &#039;month&#039; },&lt;br /&gt;
		Y = { fmt = &#039;%04d&#039;, fmt2 = &#039;%d&#039;, field = &#039;year&#039; },&lt;br /&gt;
		H = { fmt = &#039;%02d&#039;, fmt2 = &#039;%d&#039;, field = &#039;hour&#039; },&lt;br /&gt;
		M = { fmt = &#039;%02d&#039;, fmt2 = &#039;%d&#039;, field = &#039;minute&#039; },&lt;br /&gt;
		S = { fmt = &#039;%02d&#039;, fmt2 = &#039;%d&#039;, field = &#039;second&#039; },&lt;br /&gt;
		j = { fmt = &#039;%03d&#039;, fmt2 = &#039;%d&#039;, field = &#039;dayofyear&#039; },&lt;br /&gt;
		I = { fmt = &#039;%02d&#039;, fmt2 = &#039;%d&#039;, field = &#039;hour&#039;, special = &#039;hour12&#039; },&lt;br /&gt;
		p = { field = &#039;hour&#039;, special = &#039;am&#039; },&lt;br /&gt;
	}&lt;br /&gt;
	options = make_option_table(options, date.options)&lt;br /&gt;
	local amopt = options.am&lt;br /&gt;
	local eraopt = options.era&lt;br /&gt;
	local function replace_code(spaces, modifier, id)&lt;br /&gt;
		local code = codes[id]&lt;br /&gt;
		if code then&lt;br /&gt;
			local fmt = code.fmt&lt;br /&gt;
			if modifier == &#039;-&#039; and code.fmt2 then&lt;br /&gt;
				fmt = code.fmt2&lt;br /&gt;
			end&lt;br /&gt;
			local value = date[code.field]&lt;br /&gt;
			if not value then&lt;br /&gt;
				return nil  -- an undefined field in a partial date&lt;br /&gt;
			end&lt;br /&gt;
			local special = code.special&lt;br /&gt;
			if special then&lt;br /&gt;
				if special == &#039;hour12&#039; then&lt;br /&gt;
					value = value % 12&lt;br /&gt;
					value = value == 0 and 12 or value&lt;br /&gt;
				elseif special == &#039;am&#039; then&lt;br /&gt;
					local ap = ({&lt;br /&gt;
						[&#039;a.m.&#039;] = { &#039;a.m.&#039;, &#039;p.m.&#039; },&lt;br /&gt;
						[&#039;AM&#039;] = { &#039;AM&#039;, &#039;PM&#039; },&lt;br /&gt;
						[&#039;A.M.&#039;] = { &#039;A.M.&#039;, &#039;P.M.&#039; },&lt;br /&gt;
					})[ampm_options[amopt]] or { &#039;am&#039;, &#039;pm&#039; }&lt;br /&gt;
					return (spaces == &#039;&#039; and &#039;&#039; or &#039;&amp;amp;nbsp;&#039;) .. (value &amp;lt; 12 and ap[1] or ap[2])&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if code.field == &#039;year&#039; then&lt;br /&gt;
				local sign = (era_text[eraopt] or {}).sign&lt;br /&gt;
				if not sign or format:find(&#039;%{era}&#039;, 1, true) then&lt;br /&gt;
					sign = &#039;&#039;&lt;br /&gt;
					if value &amp;lt;= 0 then&lt;br /&gt;
						value = 1 - value&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					if value &amp;gt;= 0 then&lt;br /&gt;
						sign = &#039;&#039;&lt;br /&gt;
					else&lt;br /&gt;
						value = -value&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				return spaces .. sign .. sformat(fmt, value)&lt;br /&gt;
			end&lt;br /&gt;
			return spaces .. (fmt and sformat(fmt, value) or value)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local function replace_property(spaces, id)&lt;br /&gt;
		if id == &#039;era&#039; then&lt;br /&gt;
			-- Special case so can use local era option.&lt;br /&gt;
			local result = get_era_for_year(eraopt, date.year)&lt;br /&gt;
			if result == &#039;&#039; then&lt;br /&gt;
				return &#039;&#039;&lt;br /&gt;
			end&lt;br /&gt;
			return (spaces == &#039;&#039; and &#039;&#039; or &#039;&amp;amp;nbsp;&#039;) .. result&lt;br /&gt;
		end&lt;br /&gt;
		local result = date[id]&lt;br /&gt;
		if type(result) == &#039;string&#039; then&lt;br /&gt;
			return spaces .. result&lt;br /&gt;
		end&lt;br /&gt;
		if type(result) == &#039;number&#039; then&lt;br /&gt;
			return  spaces .. tostring(result)&lt;br /&gt;
		end&lt;br /&gt;
		if type(result) == &#039;boolean&#039; then&lt;br /&gt;
			return  spaces .. (result and &#039;1&#039; or &#039;0&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		-- This occurs if id is an undefined field in a partial date, or is the name of a function.&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local PERCENT = &#039;\127PERCENT\127&#039;&lt;br /&gt;
	return (format&lt;br /&gt;
		:gsub(&#039;%%%%&#039;, PERCENT)&lt;br /&gt;
		:gsub(&#039;(%s*)%%{(%w+)}&#039;, replace_property)&lt;br /&gt;
		:gsub(&#039;(%s*)%%(%-?)(%a)&#039;, replace_code)&lt;br /&gt;
		:gsub(PERCENT, &#039;%%&#039;)&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function _date_text(date, fmt, options)&lt;br /&gt;
	-- Return a formatted string representing the given date.&lt;br /&gt;
	if not is_date(date) then&lt;br /&gt;
		error(&#039;date:text: need a date (use &amp;quot;date:text()&amp;quot; with a colon)&#039;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	if type(fmt) == &#039;string&#039; and fmt:match(&#039;%S&#039;) then&lt;br /&gt;
		if fmt:find(&#039;%&#039;, 1, true) then&lt;br /&gt;
			return strftime(date, fmt, options)&lt;br /&gt;
		end&lt;br /&gt;
	elseif date.partial then&lt;br /&gt;
		fmt = date.month and &#039;my&#039; or &#039;y&#039;&lt;br /&gt;
	else&lt;br /&gt;
		fmt = &#039;dmy&#039;&lt;br /&gt;
		if date.hastime then&lt;br /&gt;
			fmt = (date.second &amp;gt; 0 and &#039;hms &#039; or &#039;hm &#039;) .. fmt&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local function bad_format()&lt;br /&gt;
		-- For consistency with other format processing, return given format&lt;br /&gt;
		-- (or cleaned format if original was not a string) if invalid.&lt;br /&gt;
		return mw.text.nowiki(fmt)&lt;br /&gt;
	end&lt;br /&gt;
	if date.partial then&lt;br /&gt;
		-- Ignore days in standard formats like &#039;ymd&#039;.&lt;br /&gt;
		if fmt == &#039;ym&#039; or fmt == &#039;ymd&#039; then&lt;br /&gt;
			fmt = date.month and &#039;%Y-%m %{era}&#039; or &#039;%Y %{era}&#039;&lt;br /&gt;
		elseif fmt == &#039;my&#039; or fmt == &#039;dmy&#039; or fmt == &#039;mdy&#039; then&lt;br /&gt;
			fmt = date.month and &#039;%B %-Y %{era}&#039; or &#039;%-Y %{era}&#039;&lt;br /&gt;
		elseif fmt == &#039;y&#039; then&lt;br /&gt;
			fmt = date.month and &#039;%-Y %{era}&#039; or &#039;%-Y %{era}&#039;&lt;br /&gt;
		else&lt;br /&gt;
			return bad_format()&lt;br /&gt;
		end&lt;br /&gt;
		return strftime(date, fmt, options)&lt;br /&gt;
	end&lt;br /&gt;
	local function hm_fmt()&lt;br /&gt;
		local plain = make_option_table(options, date.options).bydefault.am&lt;br /&gt;
		return plain and &#039;%H:%M&#039; or &#039;%-I:%M %p&#039;&lt;br /&gt;
	end&lt;br /&gt;
	local need_time = date.hastime&lt;br /&gt;
	local t = collection()&lt;br /&gt;
	for item in fmt:gmatch(&#039;%S+&#039;) do&lt;br /&gt;
		local f&lt;br /&gt;
		if item == &#039;hm&#039; then&lt;br /&gt;
			f = hm_fmt()&lt;br /&gt;
			need_time = false&lt;br /&gt;
		elseif item == &#039;hms&#039; then&lt;br /&gt;
			f = &#039;%H:%M:%S&#039;&lt;br /&gt;
			need_time = false&lt;br /&gt;
		elseif item == &#039;ymd&#039; then&lt;br /&gt;
			f = &#039;%Y-%m-%d %{era}&#039;&lt;br /&gt;
		elseif item == &#039;mdy&#039; then&lt;br /&gt;
			f = &#039;%B %-d, %-Y %{era}&#039;&lt;br /&gt;
		elseif item == &#039;dmy&#039; then&lt;br /&gt;
			f = &#039;%-d de %B de %-Y %{era}&#039;&lt;br /&gt;
		else&lt;br /&gt;
			return bad_format()&lt;br /&gt;
		end&lt;br /&gt;
		t:add(f)&lt;br /&gt;
	end&lt;br /&gt;
	fmt = t:join(&#039; &#039;)&lt;br /&gt;
	if need_time then&lt;br /&gt;
		fmt = hm_fmt() .. &#039; &#039; .. fmt&lt;br /&gt;
	end&lt;br /&gt;
	return strftime(date, fmt, options)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local day_info = {&lt;br /&gt;
	-- 0=Sun to 6=Sat&lt;br /&gt;
	[0] = { &#039;do&#039;, &#039;domingo&#039; },&lt;br /&gt;
	{ &#039;lu&#039;, &#039;lunes&#039; },&lt;br /&gt;
	{ &#039;ma&#039;, &#039;martes&#039; },&lt;br /&gt;
	{ &#039;mi&#039;, &#039;miércoles&#039; },&lt;br /&gt;
	{ &#039;ju&#039;, &#039;jueves&#039; },&lt;br /&gt;
	{ &#039;vi&#039;, &#039;viernes&#039; },&lt;br /&gt;
	{ &#039;sa&#039;, &#039;sábado&#039; },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local month_info = {&lt;br /&gt;
	-- 1=Jan to 12=Dec&lt;br /&gt;
	{ &#039;ene&#039;, &#039;enero&#039; },&lt;br /&gt;
	{ &#039;feb&#039;, &#039;febrero&#039; },&lt;br /&gt;
	{ &#039;mar&#039;, &#039;marzo&#039; },&lt;br /&gt;
	{ &#039;abr&#039;, &#039;abril&#039; },&lt;br /&gt;
	{ &#039;may&#039;, &#039;mayo&#039; },&lt;br /&gt;
	{ &#039;jun&#039;, &#039;junio&#039; },&lt;br /&gt;
	{ &#039;jul&#039;, &#039;julio&#039; },&lt;br /&gt;
	{ &#039;ago&#039;, &#039;agosto&#039; },&lt;br /&gt;
	{ &#039;sep&#039;, &#039;septiembre&#039; },&lt;br /&gt;
	{ &#039;oct&#039;, &#039;octubre&#039; },&lt;br /&gt;
	{ &#039;nov&#039;, &#039;noviembre&#039; },&lt;br /&gt;
	{ &#039;dic&#039;, &#039;diciembre&#039; },&lt;br /&gt;
}&lt;br /&gt;
for k,v in pairs(month_info) do month_info[ v[1] ], month_info[ v[2] ] = v, v end&lt;br /&gt;
&lt;br /&gt;
local function name_to_number(text, translate)&lt;br /&gt;
	if type(text) == &#039;string&#039; then&lt;br /&gt;
		return translate[&#039;xx&#039; .. text:lower():gsub(&#039;é&#039;, &#039;e&#039;):gsub(&#039;á&#039;, &#039;a&#039;)]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function day_number(text)&lt;br /&gt;
	return name_to_number(text, {&lt;br /&gt;
		xxdo = 0, xxdomingo = 0, &lt;br /&gt;
		xxlu = 1, xxlunes = 1, xxlune = 1,&lt;br /&gt;
		xxma = 2, xxmartes = 2, xxmarte = 2,&lt;br /&gt;
		xxmi = 3, xxmiercoles = 3, xxmiercole = 3,&lt;br /&gt;
		xxju = 4, xxjueves = 4, xxjueve = 4,&lt;br /&gt;
		xxvi = 5, xxviernes = 5, xxvierne = 5,&lt;br /&gt;
		xxsat = 6, xxsabado = 6&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function month_number(text)&lt;br /&gt;
	return name_to_number(text, {&lt;br /&gt;
		xxene = 1, xxenero = 1,&lt;br /&gt;
		xxfeb = 2, xxfebrero = 2,&lt;br /&gt;
		xxmar = 3, xxmarzo = 3,&lt;br /&gt;
		xxabr = 4, xxabril = 4,&lt;br /&gt;
		xxmay = 5, xxmayo = 5,&lt;br /&gt;
		xxjun = 6, xxjunio = 6,&lt;br /&gt;
		xxjul = 7, xxjulio = 7,&lt;br /&gt;
		xxago = 8, xxagosto = 8,&lt;br /&gt;
		xxsep = 9, xxseptiembre = 9, xxsept = 9,&lt;br /&gt;
		xxoct = 10, xxoctubre = 10,&lt;br /&gt;
		xxnov = 11, xxnoviembre = 11,&lt;br /&gt;
		xxdic = 12, xxdiciembre = 12,&lt;br /&gt;
	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function _list_text(list, fmt)&lt;br /&gt;
	-- Return a list of formatted strings from a list of dates.&lt;br /&gt;
	if not type(list) == &#039;table&#039; then&lt;br /&gt;
		error(&#039;date:list:text: need &amp;quot;list:text()&amp;quot; with a colon&#039;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	local result = { join = _list_join }&lt;br /&gt;
	for i, date in ipairs(list) do&lt;br /&gt;
		result[i] = date:text(fmt)&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function _date_list(date, spec)&lt;br /&gt;
	-- Return a possibly empty numbered table of dates meeting the specification.&lt;br /&gt;
	-- Dates in the list are in ascending order (oldest date first).&lt;br /&gt;
	-- The spec should be a string of form &amp;quot;&amp;lt;count&amp;gt; &amp;lt;day&amp;gt; &amp;lt;op&amp;gt;&amp;quot;&lt;br /&gt;
	-- where each item is optional and&lt;br /&gt;
	--   count = number of items wanted in list&lt;br /&gt;
	--   day = abbreviation or name such as Mon or Monday&lt;br /&gt;
	--   op = &amp;gt;, &amp;gt;=, &amp;lt;, &amp;lt;= (default is &amp;gt; meaning after date)&lt;br /&gt;
	-- If no count is given, the list is for the specified days in date&#039;s month.&lt;br /&gt;
	-- The default day is date&#039;s day.&lt;br /&gt;
	-- The spec can also be a positive or negative number:&lt;br /&gt;
	--   -5 is equivalent to &#039;5 &amp;lt;&#039;&lt;br /&gt;
	--   5  is equivalent to &#039;5&#039; which is &#039;5 &amp;gt;&#039;&lt;br /&gt;
	if not is_date(date) then&lt;br /&gt;
		error(&#039;date:list: need a date (use &amp;quot;date:list()&amp;quot; with a colon)&#039;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	local list = { text = _list_text }&lt;br /&gt;
	if date.partial then&lt;br /&gt;
		return list&lt;br /&gt;
	end&lt;br /&gt;
	local count, offset, operation&lt;br /&gt;
	local ops = {&lt;br /&gt;
		[&#039;&amp;gt;=&#039;] = { before = false, include = true  },&lt;br /&gt;
		[&#039;&amp;gt;&#039;]  = { before = false, include = false },&lt;br /&gt;
		[&#039;&amp;lt;=&#039;] = { before = true , include = true  },&lt;br /&gt;
		[&#039;&amp;lt;&#039;]  = { before = true , include = false },&lt;br /&gt;
	}&lt;br /&gt;
	if spec then&lt;br /&gt;
		if type(spec) == &#039;number&#039; then&lt;br /&gt;
			count = floor(spec + 0.5)&lt;br /&gt;
			if count &amp;lt; 0 then&lt;br /&gt;
				count = -count&lt;br /&gt;
				operation = ops[&#039;&amp;lt;&#039;]&lt;br /&gt;
			end&lt;br /&gt;
		elseif type(spec) == &#039;string&#039; then&lt;br /&gt;
			local num, day, op = spec:match(&#039;^%s*(%d*)%s*(%a*)%s*([&amp;lt;&amp;gt;=]*)%s*$&#039;)&lt;br /&gt;
			if not num then&lt;br /&gt;
				return list&lt;br /&gt;
			end&lt;br /&gt;
			if num ~= &#039;&#039; then&lt;br /&gt;
				count = tonumber(num)&lt;br /&gt;
			end&lt;br /&gt;
			if day ~= &#039;&#039; then&lt;br /&gt;
				local dow = day_number(day:gsub(&#039;[sS]$&#039;, &#039;&#039;))  -- accept plural days&lt;br /&gt;
				if not dow then&lt;br /&gt;
					return list&lt;br /&gt;
				end&lt;br /&gt;
				offset = dow - date.dow&lt;br /&gt;
			end&lt;br /&gt;
			operation = ops[op]&lt;br /&gt;
		else&lt;br /&gt;
			return list&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	offset = offset or 0&lt;br /&gt;
	operation = operation or ops[&#039;&amp;gt;&#039;]&lt;br /&gt;
	local datefrom, dayfirst, daylast&lt;br /&gt;
	if operation.before then&lt;br /&gt;
		if offset &amp;gt; 0 or (offset == 0 and not operation.include) then&lt;br /&gt;
			offset = offset - 7&lt;br /&gt;
		end&lt;br /&gt;
		if count then&lt;br /&gt;
			if count &amp;gt; 1 then&lt;br /&gt;
				offset = offset - 7*(count - 1)&lt;br /&gt;
			end&lt;br /&gt;
			datefrom = date + offset&lt;br /&gt;
		else&lt;br /&gt;
			daylast = date.day + offset&lt;br /&gt;
			dayfirst = daylast % 7&lt;br /&gt;
			if dayfirst == 0 then&lt;br /&gt;
				dayfirst = 7&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if offset &amp;lt; 0 or (offset == 0 and not operation.include) then&lt;br /&gt;
			offset = offset + 7&lt;br /&gt;
		end&lt;br /&gt;
		if count then&lt;br /&gt;
			datefrom = date + offset&lt;br /&gt;
		else&lt;br /&gt;
			dayfirst = date.day + offset&lt;br /&gt;
			daylast = date.monthdays&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not count then&lt;br /&gt;
		if daylast &amp;lt; dayfirst then&lt;br /&gt;
			return list&lt;br /&gt;
		end&lt;br /&gt;
		count = floor((daylast - dayfirst)/7) + 1&lt;br /&gt;
		datefrom = Date(date, {day = dayfirst})&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, count do&lt;br /&gt;
		if not datefrom then break end  -- exceeds date limits&lt;br /&gt;
		list[i] = datefrom&lt;br /&gt;
		datefrom = datefrom + 7&lt;br /&gt;
	end&lt;br /&gt;
	return list&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Cache the current date/time (UTC). Avoid `current.min` or `current.sec` in articles!&lt;br /&gt;
-- This returns an empty object with a per-field lazy getter optimization. https://phabricator.wikimedia.org/T416616&lt;br /&gt;
local current = os.date(&#039;!*t&#039;)&lt;br /&gt;
&lt;br /&gt;
local function extract_date(newdate, text)&lt;br /&gt;
	-- Parse the date/time in text and return n, o where&lt;br /&gt;
	--   n = table of numbers with date/time fields&lt;br /&gt;
	--   o = table of options for AM/PM or AD/BC or format, if any&lt;br /&gt;
	-- or return nothing if date is known to be invalid.&lt;br /&gt;
	-- Caller determines if the values in n are valid.&lt;br /&gt;
	-- A year must be positive (&#039;1&#039; to &#039;9999&#039;); use &#039;BC&#039; for BC.&lt;br /&gt;
	-- In a y-m-d string, the year must be four digits to avoid ambiguity&lt;br /&gt;
	-- (&#039;0001&#039; to &#039;9999&#039;). The only way to enter year &amp;lt;= 0 is by specifying&lt;br /&gt;
	-- the date as three numeric parameters like ymd Date(-1, 1, 1).&lt;br /&gt;
	-- Dates of form d/m/y, m/d/y, y/m/d are [partially] rejected as potentially ambiguous.&lt;br /&gt;
	local date, options = {}, {}&lt;br /&gt;
	if text:sub(-1) == &#039;Z&#039; then&lt;br /&gt;
		-- Extract date/time from a Wikidata timestamp.&lt;br /&gt;
		-- The year can be 1 to 16 digits but this module handles 1 to 4 digits only.&lt;br /&gt;
		-- Examples: &#039;+2016-06-21T14:30:00Z&#039;, &#039;-0000000180-00-00T00:00:00Z&#039;.&lt;br /&gt;
		local sign, y, m, d, H, M, S = text:match(&#039;^([+%-])(%d+)%-(%d%d)%-(%d%d)T(%d%d):(%d%d):(%d%d)Z$&#039;)&lt;br /&gt;
		if sign then&lt;br /&gt;
			y = tonumber(y)&lt;br /&gt;
			if sign == &#039;-&#039; and y &amp;gt; 0 then&lt;br /&gt;
				y = -y&lt;br /&gt;
			end&lt;br /&gt;
			if y &amp;lt;= 0 then&lt;br /&gt;
				options.era = &#039;a. C.&#039; -- Sets the era when the year is negative on the timestamp&lt;br /&gt;
			end&lt;br /&gt;
			date.year = y&lt;br /&gt;
			m = tonumber(m)&lt;br /&gt;
			d = tonumber(d)&lt;br /&gt;
			H = tonumber(H)&lt;br /&gt;
			M = tonumber(M)&lt;br /&gt;
			S = tonumber(S)&lt;br /&gt;
			if m == 0 then&lt;br /&gt;
				newdate.partial = true&lt;br /&gt;
				return date, options&lt;br /&gt;
			end&lt;br /&gt;
			date.month = m&lt;br /&gt;
			if d == 0 then&lt;br /&gt;
				newdate.partial = true&lt;br /&gt;
				return date, options&lt;br /&gt;
			end&lt;br /&gt;
			date.day = d&lt;br /&gt;
			if H &amp;gt; 0 or M &amp;gt; 0 or S &amp;gt; 0 then&lt;br /&gt;
				date.hour = H&lt;br /&gt;
				date.minute = M&lt;br /&gt;
				date.second = S&lt;br /&gt;
			end&lt;br /&gt;
			return date, options&lt;br /&gt;
		end&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local a, b, c = text:match(&#039;^(%d+)[-./](%d+)[-./](%d+)$&#039;)&lt;br /&gt;
	if a --[[ and b and c --]] then&lt;br /&gt;
		a = tonumber(a)&lt;br /&gt;
		b = tonumber(b)&lt;br /&gt;
		c = tonumber(c)&lt;br /&gt;
		--[[ -- use extract_ymd for this&lt;br /&gt;
		if a &amp;gt; 31 and m &amp;lt;= 12 and c &amp;gt; 12 then&lt;br /&gt;
			date.year, date.month, date.day = a, b, c&lt;br /&gt;
			options.format = &#039;ymd&#039;&lt;br /&gt;
			newdate.partial = true&lt;br /&gt;
			return date, options&lt;br /&gt;
		else--]]&lt;br /&gt;
		if a &amp;gt; 12 and b &amp;lt;= 12 and c &amp;gt; 31 then&lt;br /&gt;
			date.year, date.month, date.day = c, b, a&lt;br /&gt;
			options.format = &#039;dmy&#039;&lt;br /&gt;
			newdate.partial = true&lt;br /&gt;
			return date, options&lt;br /&gt;
		elseif a &amp;lt;= 12 and b &amp;gt; 12 and c &amp;gt; 31 then&lt;br /&gt;
			date.year, date.month, date.day = c, a, b&lt;br /&gt;
			options.format = &#039;mdy&#039;&lt;br /&gt;
			newdate.partial = true&lt;br /&gt;
			return date, options&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function extract_ymd(item)&lt;br /&gt;
		-- Called when no day or month has been set.&lt;br /&gt;
		local y, m, d = item:match(&#039;^(%d%d%d%d)[-./](%w+)[-./](%d%d?)$&#039;)&lt;br /&gt;
		if y then&lt;br /&gt;
			if date.year then&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
			if m:match(&#039;^%d%d?$&#039;) then&lt;br /&gt;
				m = tonumber(m)&lt;br /&gt;
			else&lt;br /&gt;
				m = month_number(m)&lt;br /&gt;
			end&lt;br /&gt;
			if m then&lt;br /&gt;
				date.year = tonumber(y)&lt;br /&gt;
				date.month = m&lt;br /&gt;
				date.day = tonumber(d)&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local function extract_day_or_year(item)&lt;br /&gt;
		-- Called when a day would be valid, or&lt;br /&gt;
		-- when a year would be valid if no year has been set and partial is set.&lt;br /&gt;
		local number, suffix = item:match(&#039;^(%d%d?%d?%d?)(.*)$&#039;)&lt;br /&gt;
		if number then&lt;br /&gt;
			local n = tonumber(number)&lt;br /&gt;
			if #number &amp;lt;= 2 and n &amp;lt;= 31 then&lt;br /&gt;
				suffix = suffix:lower()&lt;br /&gt;
				if suffix == &#039;&#039; or suffix == &#039;st&#039; or suffix == &#039;nd&#039; or suffix == &#039;rd&#039; or suffix == &#039;th&#039; then&lt;br /&gt;
					date.day = n&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			elseif suffix == &#039;&#039; and newdate.partial and not date.year then&lt;br /&gt;
				date.year = n&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local function extract_month(item)&lt;br /&gt;
		-- A month must be given as a name or abbreviation; a number could be ambiguous.&lt;br /&gt;
		local m = month_number(item)&lt;br /&gt;
		if m then&lt;br /&gt;
			date.month = m&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local function extract_time(item)&lt;br /&gt;
		local h, m, s = item:match(&#039;^(%d%d?):(%d%d)(:?%d*)$&#039;)&lt;br /&gt;
		if date.hour or not h then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		if s ~= &#039;&#039; then&lt;br /&gt;
			s = s:match(&#039;^:(%d%d)$&#039;)&lt;br /&gt;
			if not s then&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		date.hour = tonumber(h)&lt;br /&gt;
		date.minute = tonumber(m)&lt;br /&gt;
		date.second = tonumber(s)  -- nil if empty string&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	local item_count = 0&lt;br /&gt;
	local index_time&lt;br /&gt;
	local function set_ampm(item)&lt;br /&gt;
		local H = date.hour&lt;br /&gt;
		if H and not options.am and index_time + 1 == item_count then&lt;br /&gt;
			options.am = ampm_options[item]  -- caller checked this is not nil&lt;br /&gt;
			if item:match(&#039;^[Aa]&#039;) then&lt;br /&gt;
				if not (1 &amp;lt;= H and H &amp;lt;= 12) then&lt;br /&gt;
					return&lt;br /&gt;
				end&lt;br /&gt;
				if H == 12 then&lt;br /&gt;
					date.hour = 0&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				if not (1 &amp;lt;= H and H &amp;lt;= 23) then&lt;br /&gt;
					return&lt;br /&gt;
				end&lt;br /&gt;
				if H &amp;lt;= 11 then&lt;br /&gt;
					date.hour = H + 12&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
    --Filtrar abreviaturas de era&lt;br /&gt;
	for key,value in pairs(era_text) do&lt;br /&gt;
		if string.find(text, key) ~= nil then&lt;br /&gt;
			options.era = key&lt;br /&gt;
			text = string.gsub(text, key, &#039;&#039;)&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for item in text:gsub(&#039;,&#039;, &#039; &#039;):gsub(&#039;del?&#039;, &#039;&#039;):gsub(&#039;&amp;amp;nbsp;&#039;, &#039; &#039;):gmatch(&#039;%S+&#039;) do&lt;br /&gt;
		item_count = item_count + 1&lt;br /&gt;
		if era_text[item] then&lt;br /&gt;
			-- Era is accepted in peculiar places.&lt;br /&gt;
			if options.era then&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
			options.era = item&lt;br /&gt;
		elseif ampm_options[item] then&lt;br /&gt;
			if not set_ampm(item) then&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
		elseif item:find(&#039;:&#039;, 1, true) then&lt;br /&gt;
			if not extract_time(item) then&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
			index_time = item_count&lt;br /&gt;
		elseif date.day and date.month then&lt;br /&gt;
			if date.year then&lt;br /&gt;
				return  -- should be nothing more so item is invalid&lt;br /&gt;
			end&lt;br /&gt;
			if not item:match(&#039;^(%d%d?%d?%d?)$&#039;) then&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
			date.year = tonumber(item)&lt;br /&gt;
		elseif day_number(item) then&lt;br /&gt;
		    --catch month day case&lt;br /&gt;
		elseif date.day then&lt;br /&gt;
			if not extract_month(item) then&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
		elseif date.month then&lt;br /&gt;
			if not extract_day_or_year(item) then&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
		elseif extract_month(item) then&lt;br /&gt;
			options.format = &#039;mdy&#039;&lt;br /&gt;
		elseif extract_ymd(item) then&lt;br /&gt;
			options.format = &#039;ymd&#039;&lt;br /&gt;
		elseif extract_day_or_year(item) then&lt;br /&gt;
			if date.day then&lt;br /&gt;
				options.format = &#039;dmy&#039;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			--return  not return if item not recognized&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not date.year or date.year == 0 then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	local era = era_text[options.era]&lt;br /&gt;
	if era and era.isbc then&lt;br /&gt;
		date.year = 1 - date.year&lt;br /&gt;
	end&lt;br /&gt;
	return date, options&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function autofill(date1, date2)&lt;br /&gt;
	-- Fill any missing month or day in each date using the&lt;br /&gt;
	-- corresponding component from the other date, if present,&lt;br /&gt;
	-- or with 1 if both dates are missing the month or day.&lt;br /&gt;
	-- This gives a good result for calculating the difference&lt;br /&gt;
	-- between two partial dates when no range is wanted.&lt;br /&gt;
	-- Return filled date1, date2 (two full dates).&lt;br /&gt;
	local function filled(a, b)&lt;br /&gt;
		local fillmonth, fillday&lt;br /&gt;
		if not a.month then&lt;br /&gt;
			fillmonth = b.month or 1&lt;br /&gt;
		end&lt;br /&gt;
		if not a.day then&lt;br /&gt;
			fillday = b.day or 1&lt;br /&gt;
		end&lt;br /&gt;
		if fillmonth or fillday then  -- need to create a new date&lt;br /&gt;
			if (fillmonth or a.month) == 2 and (fillday or a.day) == 29 then&lt;br /&gt;
				-- Avoid invalid date, for example with {{age|2013|29 Feb 2016}} or {{age|Feb 2013|29 Jan 2015}}.&lt;br /&gt;
				if not is_leap_year(a.year, a.calendar) then&lt;br /&gt;
					fillday = 28&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			a = Date(a, { month = fillmonth, day = fillday })&lt;br /&gt;
		end&lt;br /&gt;
		return a&lt;br /&gt;
	end&lt;br /&gt;
	return filled(date1, date2), filled(date2, date1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function date_add_sub(lhs, rhs, is_sub)&lt;br /&gt;
	-- Return a new date from calculating (lhs + rhs) or (lhs - rhs),&lt;br /&gt;
	-- or return nothing if invalid.&lt;br /&gt;
	-- The result is nil if the calculated date exceeds allowable limits.&lt;br /&gt;
	-- Caller ensures that lhs is a date; its properties are copied for the new date.&lt;br /&gt;
	if lhs.partial then&lt;br /&gt;
		-- Adding to a partial is not supported.&lt;br /&gt;
		-- Can subtract a date or partial from a partial, but this is not called for that.&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	local function is_prefix(text, word, minlen)&lt;br /&gt;
		local n = #text&lt;br /&gt;
		return (minlen or 1) &amp;lt;= n and n &amp;lt;= #word and text == word:sub(1, n)&lt;br /&gt;
	end&lt;br /&gt;
	local function do_days(n)&lt;br /&gt;
		local forcetime, jd&lt;br /&gt;
		if floor(n) == n then&lt;br /&gt;
			jd = lhs.jd&lt;br /&gt;
		else&lt;br /&gt;
			forcetime = not lhs.hastime&lt;br /&gt;
			jd = lhs.jdz&lt;br /&gt;
		end&lt;br /&gt;
		jd = jd + (is_sub and -n or n)&lt;br /&gt;
		if forcetime then&lt;br /&gt;
			jd = tostring(jd)&lt;br /&gt;
			if not jd:find(&#039;.&#039;, 1, true) then&lt;br /&gt;
				jd = jd .. &#039;.0&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return Date(lhs, &#039;juliandate&#039;, jd)&lt;br /&gt;
	end&lt;br /&gt;
	if type(rhs) == &#039;number&#039; then&lt;br /&gt;
		-- Add/subtract days, including fractional days.&lt;br /&gt;
		return do_days(rhs)&lt;br /&gt;
	end&lt;br /&gt;
	if type(rhs) == &#039;string&#039; then&lt;br /&gt;
		-- rhs is a single component like &#039;26m&#039; or &#039;26 months&#039; (with optional sign).&lt;br /&gt;
		-- Fractions like &#039;3.25d&#039; are accepted for the units which are handled as days.&lt;br /&gt;
		local sign, numstr, id = rhs:match(&#039;^%s*([+-]?)([%d%.]+)%s*(%a+)$&#039;)&lt;br /&gt;
		if sign then&lt;br /&gt;
			if sign == &#039;-&#039; then&lt;br /&gt;
				is_sub = not (is_sub and true or false)&lt;br /&gt;
			end&lt;br /&gt;
			local y, m, days&lt;br /&gt;
			local num = tonumber(numstr)&lt;br /&gt;
			if not num then&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
			id = id:lower()&lt;br /&gt;
			if is_prefix(id, &#039;years&#039;) then&lt;br /&gt;
				y = num&lt;br /&gt;
				m = 0&lt;br /&gt;
			elseif is_prefix(id, &#039;months&#039;) then&lt;br /&gt;
				y = floor(num / 12)&lt;br /&gt;
				m = num % 12&lt;br /&gt;
			elseif is_prefix(id, &#039;weeks&#039;) then&lt;br /&gt;
				days = num * 7&lt;br /&gt;
			elseif is_prefix(id, &#039;days&#039;) then&lt;br /&gt;
				days = num&lt;br /&gt;
			elseif is_prefix(id, &#039;hours&#039;) then&lt;br /&gt;
				days = num / 24&lt;br /&gt;
			elseif is_prefix(id, &#039;minutes&#039;, 3) then&lt;br /&gt;
				days = num / (24 * 60)&lt;br /&gt;
			elseif is_prefix(id, &#039;seconds&#039;) then&lt;br /&gt;
				days = num / (24 * 3600)&lt;br /&gt;
			else&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
			if days then&lt;br /&gt;
				return do_days(days)&lt;br /&gt;
			end&lt;br /&gt;
			if numstr:find(&#039;.&#039;, 1, true) then&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
			if is_sub then&lt;br /&gt;
				y = -y&lt;br /&gt;
				m = -m&lt;br /&gt;
			end&lt;br /&gt;
			assert(-11 &amp;lt;= m and m &amp;lt;= 11)&lt;br /&gt;
			y = lhs.year + y&lt;br /&gt;
			m = lhs.month + m&lt;br /&gt;
			if m &amp;gt; 12 then&lt;br /&gt;
				y = y + 1&lt;br /&gt;
				m = m - 12&lt;br /&gt;
			elseif m &amp;lt; 1 then&lt;br /&gt;
				y = y - 1&lt;br /&gt;
				m = m + 12&lt;br /&gt;
			end&lt;br /&gt;
			local d = math.min(lhs.day, days_in_month(y, m, lhs.calendar))&lt;br /&gt;
			return Date(lhs, y, m, d)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if is_diff(rhs) then&lt;br /&gt;
		local days = rhs.age_days&lt;br /&gt;
		if (is_sub or false) ~= (rhs.isnegative or false) then&lt;br /&gt;
			days = -days&lt;br /&gt;
		end&lt;br /&gt;
		return lhs + days&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local full_date_only = {&lt;br /&gt;
	dayabbr = true,&lt;br /&gt;
	dayname = true,&lt;br /&gt;
	dow = true,&lt;br /&gt;
	dayofweek = true,&lt;br /&gt;
	dowiso = true,&lt;br /&gt;
	dayofweekiso = true,&lt;br /&gt;
	dayofyear = true,&lt;br /&gt;
	gsd = true,&lt;br /&gt;
	juliandate = true,&lt;br /&gt;
	jd = true,&lt;br /&gt;
	jdz = true,&lt;br /&gt;
	jdnoon = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Metatable for a date&#039;s calculated fields.&lt;br /&gt;
local datemt = {&lt;br /&gt;
	__index = function (self, key)&lt;br /&gt;
		if rawget(self, &#039;partial&#039;) then&lt;br /&gt;
			if full_date_only[key] then return end&lt;br /&gt;
			if key == &#039;monthabbr&#039; or key == &#039;monthdays&#039; or key == &#039;monthname&#039; then&lt;br /&gt;
				if not self.month then return end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local value&lt;br /&gt;
		if key == &#039;dayabbr&#039; then&lt;br /&gt;
			value = day_info[self.dow][1]&lt;br /&gt;
		elseif key == &#039;dayname&#039; then&lt;br /&gt;
			value = day_info[self.dow][2]&lt;br /&gt;
		elseif key == &#039;dow&#039; then&lt;br /&gt;
			value = (self.jdnoon + 1) % 7  -- day-of-week 0=Sun to 6=Sat&lt;br /&gt;
		elseif key == &#039;dayofweek&#039; then&lt;br /&gt;
			value = self.dow&lt;br /&gt;
		elseif key == &#039;dowiso&#039; then&lt;br /&gt;
			value = (self.jdnoon % 7) + 1  -- ISO day-of-week 1=Mon to 7=Sun&lt;br /&gt;
		elseif key == &#039;dayofweekiso&#039; then&lt;br /&gt;
			value = self.dowiso&lt;br /&gt;
		elseif key == &#039;dayofyear&#039; then&lt;br /&gt;
			local first = Date(self.year, 1, 1, self.calendar).jdnoon&lt;br /&gt;
			value = self.jdnoon - first + 1  -- day-of-year 1 to 366&lt;br /&gt;
		elseif key == &#039;era&#039; then&lt;br /&gt;
			-- Era text (never a negative sign) from year and options.&lt;br /&gt;
			value = get_era_for_year(self.options.era, self.year)&lt;br /&gt;
		elseif key == &#039;format&#039; then&lt;br /&gt;
			value = self.options.format or &#039;dmy&#039;&lt;br /&gt;
		elseif key == &#039;gsd&#039; then&lt;br /&gt;
			-- GSD = 1 from 00:00:00 to 23:59:59 on 1 January 1 AD Gregorian calendar,&lt;br /&gt;
			-- which is from jd 1721425.5 to 1721426.49999.&lt;br /&gt;
			value = floor(self.jd - 1721424.5)&lt;br /&gt;
		elseif key == &#039;juliandate&#039; or key == &#039;jd&#039; or key == &#039;jdz&#039; then&lt;br /&gt;
			local jd, jdz = julian_date(self)&lt;br /&gt;
			rawset(self, &#039;juliandate&#039;, jd)&lt;br /&gt;
			rawset(self, &#039;jd&#039;, jd)&lt;br /&gt;
			rawset(self, &#039;jdz&#039;, jdz)&lt;br /&gt;
			return key == &#039;jdz&#039; and jdz or jd&lt;br /&gt;
		elseif key == &#039;jdnoon&#039; then&lt;br /&gt;
			-- Julian date at noon (an integer) on the calendar day when jd occurs.&lt;br /&gt;
			value = floor(self.jd + 0.5)&lt;br /&gt;
		elseif key == &#039;isleapyear&#039; then&lt;br /&gt;
			value = is_leap_year(self.year, self.calendar)&lt;br /&gt;
		elseif key == &#039;monthabbr&#039; then&lt;br /&gt;
			value = month_info[self.month][1]&lt;br /&gt;
		elseif key == &#039;monthdays&#039; then&lt;br /&gt;
			value = days_in_month(self.year, self.month, self.calendar)&lt;br /&gt;
		elseif key == &#039;monthname&#039; then&lt;br /&gt;
			value = month_info[self.month][2]&lt;br /&gt;
		end&lt;br /&gt;
		if value ~= nil then&lt;br /&gt;
			rawset(self, key, value)&lt;br /&gt;
			return value&lt;br /&gt;
		end&lt;br /&gt;
	end,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Date operators.&lt;br /&gt;
local function mt_date_add(lhs, rhs)&lt;br /&gt;
	if not is_date(lhs) then&lt;br /&gt;
		lhs, rhs = rhs, lhs  -- put date on left (it must be a date for this to have been called)&lt;br /&gt;
	end&lt;br /&gt;
	return date_add_sub(lhs, rhs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function mt_date_sub(lhs, rhs)&lt;br /&gt;
	if is_date(lhs) then&lt;br /&gt;
		if is_date(rhs) then&lt;br /&gt;
			return DateDiff(lhs, rhs)&lt;br /&gt;
		end&lt;br /&gt;
		return date_add_sub(lhs, rhs, true)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function mt_date_concat(lhs, rhs)&lt;br /&gt;
	return tostring(lhs) .. tostring(rhs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function mt_date_tostring(self)&lt;br /&gt;
	return self:text()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function mt_date_eq(lhs, rhs)&lt;br /&gt;
	-- Return true if dates identify same date/time where, for example,&lt;br /&gt;
	-- Date(-4712, 1, 1, &#039;Julian&#039;) == Date(-4713, 11, 24, &#039;Gregorian&#039;) is true.&lt;br /&gt;
	-- This is called only if lhs and rhs have the same type and the same metamethod.&lt;br /&gt;
	if lhs.partial or rhs.partial then&lt;br /&gt;
		-- One date is partial; the other is a partial or a full date.&lt;br /&gt;
		-- The months may both be nil, but must be the same.&lt;br /&gt;
		return lhs.year == rhs.year and lhs.month == rhs.month and lhs.calendar == rhs.calendar&lt;br /&gt;
	end&lt;br /&gt;
	return lhs.jdz == rhs.jdz&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function mt_date_lt(lhs, rhs)&lt;br /&gt;
	-- Return true if lhs &amp;lt; rhs, for example,&lt;br /&gt;
	-- Date(&#039;1 Jan 2016&#039;) &amp;lt; Date(&#039;06:00 1 Jan 2016&#039;) is true.&lt;br /&gt;
	-- This is called only if lhs and rhs have the same type and the same metamethod.&lt;br /&gt;
	if lhs.partial or rhs.partial then&lt;br /&gt;
		-- One date is partial; the other is a partial or a full date.&lt;br /&gt;
		if lhs.calendar ~= rhs.calendar then&lt;br /&gt;
			return lhs.calendar == &#039;Julian&#039;&lt;br /&gt;
		end&lt;br /&gt;
		if lhs.partial then&lt;br /&gt;
			lhs = lhs.partial.first&lt;br /&gt;
		end&lt;br /&gt;
		if rhs.partial then&lt;br /&gt;
			rhs = rhs.partial.first&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return lhs.jdz &amp;lt; rhs.jdz&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ Examples of syntax to construct a date:&lt;br /&gt;
Date(y, m, d, &#039;julian&#039;)             default calendar is &#039;gregorian&#039;&lt;br /&gt;
Date(y, m, d, H, M, S, &#039;julian&#039;)&lt;br /&gt;
Date(&#039;juliandate&#039;, jd, &#039;julian&#039;)    if jd contains &amp;quot;.&amp;quot; text output includes H:M:S&lt;br /&gt;
Date(&#039;currentdate&#039;)&lt;br /&gt;
Date(&#039;currentdatetime&#039;)&lt;br /&gt;
Date(&#039;1 April 1995&#039;, &#039;julian&#039;)      parse date from text&lt;br /&gt;
Date(&#039;1 April 1995 AD&#039;, &#039;julian&#039;)   using an era sets a flag to do the same for output&lt;br /&gt;
Date(&#039;04:30:59 1 April 1995&#039;, &#039;julian&#039;)&lt;br /&gt;
Date(date)                          copy of an existing date&lt;br /&gt;
Date(date, t)                       same, updated with y,m,d,H,M,S fields from table t&lt;br /&gt;
Date(t)                       		date with y,m,d,H,M,S fields from table t&lt;br /&gt;
]]&lt;br /&gt;
function Date(...)  -- for forward declaration above&lt;br /&gt;
	-- Return a table holding a date assuming a uniform calendar always applies&lt;br /&gt;
	-- (proleptic Gregorian calendar or proleptic Julian calendar), or&lt;br /&gt;
	-- return nothing if date is invalid.&lt;br /&gt;
	-- A partial date has a valid year, however its month may be nil, and&lt;br /&gt;
	-- its day and time fields are nil.&lt;br /&gt;
	-- Field partial is set to false (if a full date) or a table (if a partial date).&lt;br /&gt;
	local calendars = { julian = &#039;Julian&#039;, gregorian = &#039;Gregorian&#039; }&lt;br /&gt;
	local newdate = {&lt;br /&gt;
		_id = uniq,&lt;br /&gt;
		calendar = &#039;Gregorian&#039;,  -- default is Gregorian calendar&lt;br /&gt;
		hastime = false,  -- true if input sets a time&lt;br /&gt;
		hour = 0,  -- always set hour/minute/second so don&#039;t have to handle nil&lt;br /&gt;
		minute = 0,&lt;br /&gt;
		second = 0,&lt;br /&gt;
		options = {},&lt;br /&gt;
		list = _date_list,&lt;br /&gt;
		subtract = function (self, rhs, options)&lt;br /&gt;
			return DateDiff(self, rhs, options)&lt;br /&gt;
		end,&lt;br /&gt;
		text = _date_text,&lt;br /&gt;
	}&lt;br /&gt;
	local argtype, datetext, is_copy, jd_number, tnums&lt;br /&gt;
	local numindex = 0&lt;br /&gt;
	local numfields = { &#039;year&#039;, &#039;month&#039;, &#039;day&#039;, &#039;hour&#039;, &#039;minute&#039;, &#039;second&#039; }&lt;br /&gt;
	local numbers = {}&lt;br /&gt;
	for _, v in ipairs({...}) do&lt;br /&gt;
		v = strip_to_nil(v)&lt;br /&gt;
		local vlower = type(v) == &#039;string&#039; and v:lower() or nil&lt;br /&gt;
		if v == nil then&lt;br /&gt;
			-- Ignore empty arguments after stripping so modules can directly pass template parameters.&lt;br /&gt;
		elseif calendars[vlower] then&lt;br /&gt;
			newdate.calendar = calendars[vlower]&lt;br /&gt;
		elseif vlower == &#039;partial&#039; then&lt;br /&gt;
			newdate.partial = true&lt;br /&gt;
		elseif vlower == &#039;fix&#039; then&lt;br /&gt;
			newdate.want_fix = true&lt;br /&gt;
		elseif is_date(v) then&lt;br /&gt;
			-- Copy existing date (items can be overridden by other arguments).&lt;br /&gt;
			if is_copy or tnums then&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
			is_copy = true&lt;br /&gt;
			newdate.calendar = v.calendar&lt;br /&gt;
			newdate.partial = v.partial&lt;br /&gt;
			newdate.hastime = v.hastime&lt;br /&gt;
			newdate.options = v.options&lt;br /&gt;
			newdate.year = v.year&lt;br /&gt;
			newdate.month = v.month&lt;br /&gt;
			newdate.day = v.day&lt;br /&gt;
			newdate.hour = v.hour&lt;br /&gt;
			newdate.minute = v.minute&lt;br /&gt;
			newdate.second = v.second&lt;br /&gt;
		elseif type(v) == &#039;table&#039; then&lt;br /&gt;
			if tnums then&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
			tnums = {}&lt;br /&gt;
			local tfields = { year=1, month=1, day=1, hour=2, minute=2, second=2 }&lt;br /&gt;
			for tk, tv in pairs(v) do&lt;br /&gt;
				if tfields[tk] then&lt;br /&gt;
					tnums[tk] = tonumber(tv)&lt;br /&gt;
				end&lt;br /&gt;
				if tfields[tk] == 2 then&lt;br /&gt;
					newdate.hastime = true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			local num = tonumber(v)&lt;br /&gt;
			if not num and argtype == &#039;setdate&#039; and numindex == 1 then&lt;br /&gt;
				num = month_number(v)&lt;br /&gt;
			end&lt;br /&gt;
			if num then&lt;br /&gt;
				if not argtype then&lt;br /&gt;
					argtype = &#039;setdate&#039;&lt;br /&gt;
				end&lt;br /&gt;
				if argtype == &#039;setdate&#039; and numindex &amp;lt; 6 then&lt;br /&gt;
					numindex = numindex + 1&lt;br /&gt;
					numbers[numfields[numindex]] = num&lt;br /&gt;
				elseif argtype == &#039;juliandate&#039; and not jd_number then&lt;br /&gt;
					jd_number = num&lt;br /&gt;
					if type(v) == &#039;string&#039; then&lt;br /&gt;
						if v:find(&#039;.&#039;, 1, true) then&lt;br /&gt;
							newdate.hastime = true&lt;br /&gt;
						end&lt;br /&gt;
					elseif num ~= floor(num) then&lt;br /&gt;
						-- The given value was a number. The time will be used&lt;br /&gt;
						-- if the fractional part is nonzero.&lt;br /&gt;
						newdate.hastime = true&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					return&lt;br /&gt;
				end&lt;br /&gt;
			elseif argtype then&lt;br /&gt;
				return&lt;br /&gt;
			elseif type(v) == &#039;string&#039; then&lt;br /&gt;
				if v == &#039;currentdate&#039; or v == &#039;currentdatetime&#039; or v == &#039;juliandate&#039; then&lt;br /&gt;
					argtype = v&lt;br /&gt;
				else&lt;br /&gt;
					argtype = &#039;datetext&#039;&lt;br /&gt;
					datetext = v&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				return&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if argtype == &#039;datetext&#039; then&lt;br /&gt;
		if tnums or not set_date_from_numbers(newdate, extract_date(newdate, datetext)) then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
	elseif argtype == &#039;juliandate&#039; then&lt;br /&gt;
		newdate.partial = nil&lt;br /&gt;
		newdate.jd = jd_number&lt;br /&gt;
		if not set_date_from_jd(newdate) then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
	elseif argtype == &#039;currentdate&#039; or argtype == &#039;currentdatetime&#039; then&lt;br /&gt;
		newdate.partial = nil&lt;br /&gt;
		newdate.year = current.year&lt;br /&gt;
		newdate.month = current.month&lt;br /&gt;
		newdate.day = current.day&lt;br /&gt;
		if argtype == &#039;currentdatetime&#039; then&lt;br /&gt;
			newdate.hour = current.hour&lt;br /&gt;
			newdate.minute = current.min&lt;br /&gt;
			newdate.second = current.sec&lt;br /&gt;
			newdate.hastime = true&lt;br /&gt;
		end&lt;br /&gt;
		newdate.calendar = &#039;Gregorian&#039;  -- ignore any given calendar name&lt;br /&gt;
	elseif argtype == &#039;setdate&#039; then&lt;br /&gt;
		if tnums or not set_date_from_numbers(newdate, numbers) then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
	elseif not (is_copy or tnums) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	if tnums then&lt;br /&gt;
		newdate.jd = nil  -- force recalculation in case jd was set before changes from tnums&lt;br /&gt;
		if not set_date_from_numbers(newdate, tnums) then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if newdate.partial then&lt;br /&gt;
		local year = newdate.year&lt;br /&gt;
		local month = newdate.month&lt;br /&gt;
		local first = Date(year, month or 1, 1, newdate.calendar)&lt;br /&gt;
		month = month or 12&lt;br /&gt;
		local last = Date(year, month, days_in_month(year, month), newdate.calendar)&lt;br /&gt;
		newdate.partial = { first = first, last = last }&lt;br /&gt;
	else&lt;br /&gt;
		newdate.partial = false  -- avoid index lookup&lt;br /&gt;
	end&lt;br /&gt;
	setmetatable(newdate, datemt)&lt;br /&gt;
	local readonly = {}&lt;br /&gt;
	local mt = {&lt;br /&gt;
		__index = newdate,&lt;br /&gt;
		__newindex = function(t, k, v) error(&#039;date.&#039; .. tostring(k) .. &#039; is read-only&#039;, 2) end,&lt;br /&gt;
		__add = mt_date_add,&lt;br /&gt;
		__sub = mt_date_sub,&lt;br /&gt;
		__concat = mt_date_concat,&lt;br /&gt;
		__tostring = mt_date_tostring,&lt;br /&gt;
		__eq = mt_date_eq,&lt;br /&gt;
		__lt = mt_date_lt,&lt;br /&gt;
	}&lt;br /&gt;
	return setmetatable(readonly, mt)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function _diff_age(diff, code, options)&lt;br /&gt;
	-- Return a tuple of integer values from diff as specified by code, except that&lt;br /&gt;
	-- each integer may be a list of two integers for a diff with a partial date, or&lt;br /&gt;
	-- return nil if the code is not supported.&lt;br /&gt;
	-- If want round, the least significant unit is rounded to nearest whole unit.&lt;br /&gt;
	-- For a duration, an extra day is added.&lt;br /&gt;
	local wantround, wantduration, wantrange&lt;br /&gt;
	if type(options) == &#039;table&#039; then&lt;br /&gt;
		wantround = options.round&lt;br /&gt;
		wantduration = options.duration&lt;br /&gt;
		wantrange = options.range&lt;br /&gt;
	else&lt;br /&gt;
		wantround = options&lt;br /&gt;
	end&lt;br /&gt;
	if not is_diff(diff) then&lt;br /&gt;
		local f = wantduration and &#039;duration&#039; or &#039;age&#039;&lt;br /&gt;
		error(f .. &#039;: need a date difference (use &amp;quot;diff:&#039; .. f .. &#039;()&amp;quot; with a colon)&#039;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	if diff.partial then&lt;br /&gt;
		-- Ignore wantround, wantduration.&lt;br /&gt;
		local function choose(v)&lt;br /&gt;
			if type(v) == &#039;table&#039; then&lt;br /&gt;
				if not wantrange or v[1] == v[2] then&lt;br /&gt;
					-- Example: Date(&#039;partial&#039;, 2005) - Date(&#039;partial&#039;, 2001) gives&lt;br /&gt;
					-- diff.years = { 3, 4 } to show the range of possible results.&lt;br /&gt;
					-- If do not want a range, choose the second value as more expected.&lt;br /&gt;
					return v[2]&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			return v&lt;br /&gt;
		end&lt;br /&gt;
		if code == &#039;ym&#039; or code == &#039;ymd&#039; then&lt;br /&gt;
			if not wantrange and diff.iszero then&lt;br /&gt;
				-- This avoids an unexpected result such as&lt;br /&gt;
				-- Date(&#039;partial&#039;, 2001) - Date(&#039;partial&#039;, 2001)&lt;br /&gt;
				-- giving diff = { years = 0, months = { 0, 11 } }&lt;br /&gt;
				-- which would be reported as 0 years and 11 months.&lt;br /&gt;
				return 0, 0&lt;br /&gt;
			end&lt;br /&gt;
			return choose(diff.partial.years), choose(diff.partial.months)&lt;br /&gt;
		end&lt;br /&gt;
		if code == &#039;y&#039; then&lt;br /&gt;
			return choose(diff.partial.years)&lt;br /&gt;
		end&lt;br /&gt;
		if code == &#039;m&#039; or code == &#039;w&#039; or code == &#039;d&#039; then&lt;br /&gt;
			return choose({ diff.partial.mindiff:age(code), diff.partial.maxdiff:age(code) })&lt;br /&gt;
		end&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local extra_days = wantduration and 1 or 0&lt;br /&gt;
	if code == &#039;wd&#039; or code == &#039;w&#039; or code == &#039;d&#039; then&lt;br /&gt;
		local offset = wantround and 0.5 or 0&lt;br /&gt;
		local days = diff.age_days + extra_days&lt;br /&gt;
		if code == &#039;wd&#039; or code == &#039;d&#039; then&lt;br /&gt;
			days = floor(days + offset)&lt;br /&gt;
			if code == &#039;d&#039; then&lt;br /&gt;
				return days&lt;br /&gt;
			end&lt;br /&gt;
			return floor(days/7), days % 7&lt;br /&gt;
		end&lt;br /&gt;
		return floor(days/7 + offset)&lt;br /&gt;
	end&lt;br /&gt;
	local H, M, S = diff.hours, diff.minutes, diff.seconds&lt;br /&gt;
	if code == &#039;dh&#039; or code == &#039;dhm&#039; or code == &#039;dhms&#039; or code == &#039;h&#039; or code == &#039;hm&#039; or code == &#039;hms&#039; then&lt;br /&gt;
		local days = floor(diff.age_days + extra_days)&lt;br /&gt;
		local inc_hour&lt;br /&gt;
		if wantround then&lt;br /&gt;
			if code == &#039;dh&#039; or code == &#039;h&#039; then&lt;br /&gt;
				if M &amp;gt;= 30 then&lt;br /&gt;
					inc_hour = true&lt;br /&gt;
				end&lt;br /&gt;
			elseif code == &#039;dhm&#039; or code == &#039;hm&#039; then&lt;br /&gt;
				if S &amp;gt;= 30 then&lt;br /&gt;
					M = M + 1&lt;br /&gt;
					if M &amp;gt;= 60 then&lt;br /&gt;
						M = 0&lt;br /&gt;
						inc_hour = true&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				-- Nothing needed because S is an integer.&lt;br /&gt;
			end&lt;br /&gt;
			if inc_hour then&lt;br /&gt;
				H = H + 1&lt;br /&gt;
				if H &amp;gt;= 24 then&lt;br /&gt;
					H = 0&lt;br /&gt;
					days = days + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if code == &#039;dh&#039; or code == &#039;dhm&#039; or code == &#039;dhms&#039; then&lt;br /&gt;
			if code == &#039;dh&#039; then&lt;br /&gt;
				return days, H&lt;br /&gt;
			elseif code == &#039;dhm&#039; then&lt;br /&gt;
				return days, H, M&lt;br /&gt;
			else&lt;br /&gt;
				return days, H, M, S&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local hours = days * 24 + H&lt;br /&gt;
		if code == &#039;h&#039; then&lt;br /&gt;
			return hours&lt;br /&gt;
		elseif code == &#039;hm&#039; then&lt;br /&gt;
			return hours, M&lt;br /&gt;
		end&lt;br /&gt;
		return hours, M, S&lt;br /&gt;
	end&lt;br /&gt;
	if wantround then&lt;br /&gt;
		local inc_hour&lt;br /&gt;
		if code == &#039;ymdh&#039; or code == &#039;ymwdh&#039; then&lt;br /&gt;
			if M &amp;gt;= 30 then&lt;br /&gt;
				inc_hour = true&lt;br /&gt;
			end&lt;br /&gt;
		elseif code == &#039;ymdhm&#039; or code == &#039;ymwdhm&#039; then&lt;br /&gt;
			if S &amp;gt;= 30 then&lt;br /&gt;
				M = M + 1&lt;br /&gt;
				if M &amp;gt;= 60 then&lt;br /&gt;
					M = 0&lt;br /&gt;
					inc_hour = true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		elseif code == &#039;ymd&#039; or code == &#039;ymwd&#039; or code == &#039;yd&#039; or code == &#039;md&#039; then&lt;br /&gt;
			if H &amp;gt;= 12 then&lt;br /&gt;
				extra_days = extra_days + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if inc_hour then&lt;br /&gt;
			H = H + 1&lt;br /&gt;
			if H &amp;gt;= 24 then&lt;br /&gt;
				H = 0&lt;br /&gt;
				extra_days = extra_days + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local y, m, d = diff.years, diff.months, diff.days&lt;br /&gt;
	if extra_days &amp;gt; 0 then&lt;br /&gt;
		d = d + extra_days&lt;br /&gt;
		if d &amp;gt; 28 or code == &#039;yd&#039; then&lt;br /&gt;
			-- Recalculate in case have passed a month.&lt;br /&gt;
			diff = diff.date1 + extra_days - diff.date2&lt;br /&gt;
			y, m, d = diff.years, diff.months, diff.days&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if code == &#039;ymd&#039; then&lt;br /&gt;
		return y, m, d&lt;br /&gt;
	elseif code == &#039;yd&#039; then&lt;br /&gt;
		if y &amp;gt; 0 then&lt;br /&gt;
			-- It is known that diff.date1 &amp;gt; diff.date2.&lt;br /&gt;
			diff = diff.date1 - (diff.date2 + (y .. &#039;y&#039;))&lt;br /&gt;
		end&lt;br /&gt;
		return y, floor(diff.age_days)&lt;br /&gt;
	elseif code == &#039;md&#039; then&lt;br /&gt;
		return y * 12 + m, d&lt;br /&gt;
	elseif code == &#039;ym&#039; or code == &#039;m&#039; then&lt;br /&gt;
		if wantround then&lt;br /&gt;
			if d &amp;gt;= 16 then&lt;br /&gt;
				m = m + 1&lt;br /&gt;
				if m &amp;gt;= 12 then&lt;br /&gt;
					m = 0&lt;br /&gt;
					y = y + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if code == &#039;ym&#039; then&lt;br /&gt;
			return y, m&lt;br /&gt;
		end&lt;br /&gt;
		return y * 12 + m&lt;br /&gt;
	elseif code == &#039;ymw&#039; then&lt;br /&gt;
		local weeks = floor(d/7)&lt;br /&gt;
		if wantround then&lt;br /&gt;
			local days = d % 7&lt;br /&gt;
			if days &amp;gt; 3 or (days == 3 and H &amp;gt;= 12) then&lt;br /&gt;
				weeks = weeks + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return y, m, weeks&lt;br /&gt;
	elseif code == &#039;ymwd&#039; then&lt;br /&gt;
		return y, m, floor(d/7), d % 7&lt;br /&gt;
	elseif code == &#039;ymdh&#039; then&lt;br /&gt;
		return y, m, d, H&lt;br /&gt;
	elseif code == &#039;ymwdh&#039; then&lt;br /&gt;
		return y, m, floor(d/7), d % 7, H&lt;br /&gt;
	elseif code == &#039;ymdhm&#039; then&lt;br /&gt;
		return y, m, d, H, M&lt;br /&gt;
	elseif code == &#039;ymwdhm&#039; then&lt;br /&gt;
		return y, m, floor(d/7), d % 7, H, M&lt;br /&gt;
	end&lt;br /&gt;
	if code == &#039;y&#039; then&lt;br /&gt;
		if wantround and m &amp;gt;= 6 then&lt;br /&gt;
			y = y + 1&lt;br /&gt;
		end&lt;br /&gt;
		return y&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function _diff_duration(diff, code, options)&lt;br /&gt;
	if type(options) ~= &#039;table&#039; then&lt;br /&gt;
		options = { round = options }&lt;br /&gt;
	end&lt;br /&gt;
	options.duration = true&lt;br /&gt;
	return _diff_age(diff, code, options)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Metatable for some operations on date differences.&lt;br /&gt;
diffmt = {  -- for forward declaration above&lt;br /&gt;
	__concat = function (lhs, rhs)&lt;br /&gt;
		return tostring(lhs) .. tostring(rhs)&lt;br /&gt;
	end,&lt;br /&gt;
	__tostring = function (self)&lt;br /&gt;
		return tostring(self.age_days)&lt;br /&gt;
	end,&lt;br /&gt;
	__index = function (self, key)&lt;br /&gt;
		local value&lt;br /&gt;
		if key == &#039;age_days&#039; then&lt;br /&gt;
			if rawget(self, &#039;partial&#039;) then&lt;br /&gt;
				local function jdz(date)&lt;br /&gt;
					return (date.partial and date.partial.first or date).jdz&lt;br /&gt;
				end&lt;br /&gt;
				value = jdz(self.date1) - jdz(self.date2)&lt;br /&gt;
			else&lt;br /&gt;
				value = self.date1.jdz - self.date2.jdz&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if value ~= nil then&lt;br /&gt;
			rawset(self, key, value)&lt;br /&gt;
			return value&lt;br /&gt;
		end&lt;br /&gt;
	end,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function DateDiff(date1, date2, options)  -- for forward declaration above&lt;br /&gt;
	-- Return a table with the difference between two dates (date1 - date2).&lt;br /&gt;
	-- The difference is negative if date1 is older than date2.&lt;br /&gt;
	-- Return nothing if invalid.&lt;br /&gt;
	-- If d = date1 - date2 then&lt;br /&gt;
	--     date1 = date2 + d&lt;br /&gt;
	-- If date1 &amp;gt;= date2 and the dates have no H:M:S time specified then&lt;br /&gt;
	--     date1 = date2 + (d.years..&#039;y&#039;) + (d.months..&#039;m&#039;) + d.days&lt;br /&gt;
	-- where the larger time units are added first.&lt;br /&gt;
	-- The result of Date(2015,1,x) + &#039;1m&#039; is Date(2015,2,28) for&lt;br /&gt;
	-- x = 28, 29, 30, 31. That means, for example,&lt;br /&gt;
	--     d = Date(2015,3,3) - Date(2015,1,31)&lt;br /&gt;
	-- gives d.years, d.months, d.days = 0, 1, 3 (excluding date1).&lt;br /&gt;
	if not (is_date(date1) and is_date(date2) and date1.calendar == date2.calendar) then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	local wantfill&lt;br /&gt;
	if type(options) == &#039;table&#039; then&lt;br /&gt;
		wantfill = options.fill&lt;br /&gt;
	end&lt;br /&gt;
	local isnegative = false&lt;br /&gt;
	local iszero = false&lt;br /&gt;
	if date1 &amp;lt; date2 then&lt;br /&gt;
		isnegative = true&lt;br /&gt;
		date1, date2 = date2, date1&lt;br /&gt;
	elseif date1 == date2 then&lt;br /&gt;
		iszero = true&lt;br /&gt;
	end&lt;br /&gt;
	-- It is known that date1 &amp;gt;= date2 (period is from date2 to date1).&lt;br /&gt;
	if date1.partial or date2.partial then&lt;br /&gt;
		-- Two partial dates might have timelines:&lt;br /&gt;
		---------------------A=================B--- date1 is from A to B inclusive&lt;br /&gt;
		--------C=======D-------------------------- date2 is from C to D inclusive&lt;br /&gt;
		-- date1 &amp;gt; date2 iff A &amp;gt; C (date1.partial.first &amp;gt; date2.partial.first)&lt;br /&gt;
		-- The periods can overlap (&#039;April 2001&#039; - &#039;2001&#039;):&lt;br /&gt;
		-------------A===B------------------------- A=2001-04-01  B=2001-04-30&lt;br /&gt;
		--------C=====================D------------ C=2001-01-01  D=2001-12-31&lt;br /&gt;
		if wantfill then&lt;br /&gt;
			date1, date2 = autofill(date1, date2)&lt;br /&gt;
		else&lt;br /&gt;
			local function zdiff(date1, date2)&lt;br /&gt;
				local diff = date1 - date2&lt;br /&gt;
				if diff.isnegative then&lt;br /&gt;
					return date1 - date1  -- a valid diff in case we call its methods&lt;br /&gt;
				end&lt;br /&gt;
				return diff&lt;br /&gt;
			end&lt;br /&gt;
			local function getdate(date, which)&lt;br /&gt;
				return date.partial and date.partial[which] or date&lt;br /&gt;
			end&lt;br /&gt;
			local maxdiff = zdiff(getdate(date1, &#039;last&#039;), getdate(date2, &#039;first&#039;))&lt;br /&gt;
			local mindiff = zdiff(getdate(date1, &#039;first&#039;), getdate(date2, &#039;last&#039;))&lt;br /&gt;
			local years, months&lt;br /&gt;
			if maxdiff.years == mindiff.years then&lt;br /&gt;
				years = maxdiff.years&lt;br /&gt;
				if maxdiff.months == mindiff.months then&lt;br /&gt;
					months = maxdiff.months&lt;br /&gt;
				else&lt;br /&gt;
					months = { mindiff.months, maxdiff.months }&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				years = { mindiff.years, maxdiff.years }&lt;br /&gt;
			end&lt;br /&gt;
			return setmetatable({&lt;br /&gt;
				date1 = date1,&lt;br /&gt;
				date2 = date2,&lt;br /&gt;
				partial = {&lt;br /&gt;
					years = years,&lt;br /&gt;
					months = months,&lt;br /&gt;
					maxdiff = maxdiff,&lt;br /&gt;
					mindiff = mindiff,&lt;br /&gt;
				},&lt;br /&gt;
				isnegative = isnegative,&lt;br /&gt;
				iszero = iszero,&lt;br /&gt;
				age = _diff_age,&lt;br /&gt;
				duration = _diff_duration,&lt;br /&gt;
			}, diffmt)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local y1, m1 = date1.year, date1.month&lt;br /&gt;
	local y2, m2 = date2.year, date2.month&lt;br /&gt;
	local years = y1 - y2&lt;br /&gt;
	local months = m1 - m2&lt;br /&gt;
	local d1 = date1.day + hms(date1)&lt;br /&gt;
	local d2 = date2.day + hms(date2)&lt;br /&gt;
	local days, time&lt;br /&gt;
	if d1 &amp;gt;= d2 then&lt;br /&gt;
		days = d1 - d2&lt;br /&gt;
	else&lt;br /&gt;
		months = months - 1&lt;br /&gt;
		-- Get days in previous month (before the &amp;quot;to&amp;quot; date) given December has 31 days.&lt;br /&gt;
		local dpm = m1 &amp;gt; 1 and days_in_month(y1, m1 - 1, date1.calendar) or 31&lt;br /&gt;
		if d2 &amp;gt;= dpm then&lt;br /&gt;
			days = d1 - hms(date2)&lt;br /&gt;
		else&lt;br /&gt;
			days = dpm - d2 + d1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if months &amp;lt; 0 then&lt;br /&gt;
		years = years - 1&lt;br /&gt;
		months = months + 12&lt;br /&gt;
	end&lt;br /&gt;
	days, time = math.modf(days)&lt;br /&gt;
	local H, M, S = h_m_s(time)&lt;br /&gt;
	return setmetatable({&lt;br /&gt;
		date1 = date1,&lt;br /&gt;
		date2 = date2,&lt;br /&gt;
		partial = false,  -- avoid index lookup&lt;br /&gt;
		years = years,&lt;br /&gt;
		months = months,&lt;br /&gt;
		days = days,&lt;br /&gt;
		hours = H,&lt;br /&gt;
		minutes = M,&lt;br /&gt;
		seconds = S,&lt;br /&gt;
		isnegative = isnegative,&lt;br /&gt;
		iszero = iszero,&lt;br /&gt;
		age = _diff_age,&lt;br /&gt;
		duration = _diff_duration,&lt;br /&gt;
	}, diffmt)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local z = {&lt;br /&gt;
	_current = current,&lt;br /&gt;
	_Date = Date,&lt;br /&gt;
	_days_in_month = days_in_month,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Aqui comienzas las funciones adaptadas de [[Módulo:Fecha]] --&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function z.fechaActual()&lt;br /&gt;
	local d = os.date(&#039;!*t&#039;)&lt;br /&gt;
	&lt;br /&gt;
	local fecha = {}&lt;br /&gt;
	fecha.anyo    = d.year&lt;br /&gt;
	fecha.mes     = d.month&lt;br /&gt;
	fecha.dia     = d.day&lt;br /&gt;
	fecha.hora    = d.hour&lt;br /&gt;
	fecha.minuto  = d.min&lt;br /&gt;
	fecha.segundo = d.sec&lt;br /&gt;
		&lt;br /&gt;
	return fecha&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function validar(fecha)&lt;br /&gt;
	fecha.anyo    = tonumber(fecha.anyo)&lt;br /&gt;
	fecha.mes     = tonumber(fecha.mes)&lt;br /&gt;
	fecha.dia     = tonumber(fecha.dia)&lt;br /&gt;
	fecha.hora    = tonumber(fecha.hora)&lt;br /&gt;
	fecha.minuto  = tonumber(fecha.minuto)&lt;br /&gt;
	fecha.segundo = tonumber(fecha.segundo)&lt;br /&gt;
	&lt;br /&gt;
	-- Falta validar que es una fecha válida&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function z.edad(fecha1, fecha2)&lt;br /&gt;
	--Función que devuelve la edad en años entre dos fechas&lt;br /&gt;
	&lt;br /&gt;
	--Se supone que las fechas se han validado previamente.&lt;br /&gt;
	&lt;br /&gt;
	if not fecha1 then&lt;br /&gt;
		return -- falta devolver un error&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not fecha2 then&lt;br /&gt;
		fecha2=z.fechaActual()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local anyos = fecha2.anyo - fecha1.anyo&lt;br /&gt;
	&lt;br /&gt;
	--if true then return require(&#039;Módulo:Tablas&#039;).tostring(fecha2) end&lt;br /&gt;
	&lt;br /&gt;
	if fecha2.mes &amp;lt; fecha1.mes or&lt;br /&gt;
	   (fecha2.mes == fecha1.mes and fecha2.dia &amp;lt; fecha1.dia) then&lt;br /&gt;
	   	anyos = anyos - 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if anyos &amp;lt; 0 then&lt;br /&gt;
		return -- falta devolver error&lt;br /&gt;
	elseif anyos == 0 then&lt;br /&gt;
		return &#039;menos de un año&#039;&lt;br /&gt;
	elseif anyos == 1 then&lt;br /&gt;
		return &#039;un año&#039;&lt;br /&gt;
	else&lt;br /&gt;
		return anyos .. &#039; años&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function z.llamadaDesdeUnaPlantilla(frame)&lt;br /&gt;
	function obtenerFecha(dia, mes, anyo)&lt;br /&gt;
		local resultado={}&lt;br /&gt;
	&lt;br /&gt;
		if dia then&lt;br /&gt;
			resultado.dia  = dia&lt;br /&gt;
			resultado.mes  = mes&lt;br /&gt;
			resultado.anyo = anyo&lt;br /&gt;
			&lt;br /&gt;
			validar(resultado)&lt;br /&gt;
			&lt;br /&gt;
			return resultado&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	&lt;br /&gt;
	local funcion = z[args[1]]&lt;br /&gt;
	local fecha1  = obtenerFecha(args[2], args[3], args[4])&lt;br /&gt;
	local fecha2  = obtenerFecha(args[5], args[6], args[7])&lt;br /&gt;
&lt;br /&gt;
	return funcion(fecha1, fecha2)&lt;br /&gt;
end&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
-- Aqui comienzas las funciones adaptadas de [[Módulo:Fechas]] --&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
-----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function z.NombreDelMes(mes)&lt;br /&gt;
  -- Función que devuelve el nombre del mes, donde mes es un número entre 1 y 12. &lt;br /&gt;
  -- Si no es así se devuelve el valor de mes.&lt;br /&gt;
  -- Por ejemplo, 2  --&amp;gt; febrero&lt;br /&gt;
  --              02 --&amp;gt; febrero&lt;br /&gt;
  --              abril --&amp;gt; abril&lt;br /&gt;
  --              MAYO --&amp;gt; MAYO&lt;br /&gt;
   return month_info[tonumber(mes)][2] or mes&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function z.Fecha(frame)&lt;br /&gt;
    -- Función que formatea una fecha&lt;br /&gt;
    -- El único parámetro obligatorio es el año o 3.&lt;br /&gt;
    -- Obtener los argumentos con los que se llama a la función&lt;br /&gt;
&lt;br /&gt;
    local argumentos = {}&lt;br /&gt;
    local parent = {}&lt;br /&gt;
    if frame == mw.getCurrentFrame() then&lt;br /&gt;
        if   frame.args[3]  or frame.args[&amp;quot;año&amp;quot;]  then&lt;br /&gt;
    	    argumentos = frame.args&lt;br /&gt;
        else &lt;br /&gt;
    	    parent = frame:getParent()&lt;br /&gt;
            argumentos = parent.args&lt;br /&gt;
        end &lt;br /&gt;
    else&lt;br /&gt;
        argumentos = frame&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local enlace = argumentos[&amp;quot;enlace&amp;quot;] ~= &amp;quot;no&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    -- Obtener el día, el nombre del mes y el año incluyendo para los años negativos a.d.&lt;br /&gt;
    local dia = argumentos[&amp;quot;día&amp;quot;] or argumentos[1] or &#039;&#039;    &lt;br /&gt;
    local mes = argumentos[&amp;quot;mes&amp;quot;] or argumentos[2] or &#039;&#039; &lt;br /&gt;
    local anyo=tonumber(argumentos[&amp;quot;año&amp;quot;] or argumentos[3]) or 0&lt;br /&gt;
	&lt;br /&gt;
    dia = (dia ~=&#039;&#039;) and (tonumber(dia) or dia) or dia -- Eliminar ceros a la izquierda del día.&lt;br /&gt;
    mes = (mes~=&#039;&#039;) and ((month_info[mes] and month_info[mes][2]) or month_info[tonumber(mes)][2] or mes) or mes -- Extraer nombre del mes&lt;br /&gt;
    anyo = (anyo&amp;lt;0) and (-anyo .. &#039; a. C.&#039;) or anyo&lt;br /&gt;
    &lt;br /&gt;
    local calendario = (argumentos[&amp;quot;calendario&amp;quot;] == &#039;juliano&#039;) and (&#039;&amp;lt;sup&amp;gt;[[Calendario juliano|jul.]]&amp;lt;/sup&amp;gt;&#039;) or &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    -- Formatear la fecha dependiendo de si el día, el mes o el año están informados&lt;br /&gt;
	local out = &#039;&#039;&lt;br /&gt;
	&lt;br /&gt;
	if anyo ~= 0 then&lt;br /&gt;
		out = enlace and (out .. &#039;[[&#039; .. anyo .. &#039;]]&#039;) or tostring(anyo)&lt;br /&gt;
		if mes~=&#039;&#039; then&lt;br /&gt;
			if argumentos[&amp;quot;mayúscula&amp;quot;] == &#039;sí&#039; then&lt;br /&gt;
				mes = mw.language.new(&#039;es&#039;):ucfirst(mes)&lt;br /&gt;
			end&lt;br /&gt;
			out = enlace and (mes .. &#039;]] de &#039; .. out) or (mes .. &#039; de &#039; .. out)&lt;br /&gt;
			if dia ~=&#039;&#039; then&lt;br /&gt;
				out = enlace and (&#039;[[&#039; .. dia .. &#039; de &#039; .. out .. calendario) or (dia .. &#039; de &#039; .. out .. calendario)&lt;br /&gt;
			else&lt;br /&gt;
				out = enlace and (&#039;[[&#039; .. out) or out&lt;br /&gt;
			end	&lt;br /&gt;
		end&lt;br /&gt;
	 end&lt;br /&gt;
	return out&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 function z.Numerica(frame)&lt;br /&gt;
	local d = Date(frame.args[1])&lt;br /&gt;
    local err = &#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Cadena de fecha no válida&amp;lt;/strong&amp;gt;&#039;&lt;br /&gt;
	return (d == nil) and err or d:text(&#039;%Y%m%d&#039;)&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
return z&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=M%C3%B3dulo:Citas&amp;diff=289</id>
		<title>Módulo:Citas</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=M%C3%B3dulo:Citas&amp;diff=289"/>
		<updated>2026-06-14T04:12:55Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local z = {&lt;br /&gt;
    error_categories = {};&lt;br /&gt;
    error_ids = {};&lt;br /&gt;
    message_tail = {};&lt;br /&gt;
}&lt;br /&gt;
-- Include translation message hooks, ID and error handling configuration settings.&lt;br /&gt;
--local cfg = mw.loadData( &#039;Mdódulo:Citas/Configuración/pruebas&#039; );&lt;br /&gt;
&lt;br /&gt;
-- Contains a list of all recognized parameters&lt;br /&gt;
--local whitelist = mw.loadData( &#039;Módulo:Citas/Whitelist/pruebas&#039; );&lt;br /&gt;
--local dates = require(&#039;Módulo:Citas/ValidaciónFechas/pruebas&#039;).dates		-- location of date validation code&lt;br /&gt;
&lt;br /&gt;
--Módulo para formatear las fechas&lt;br /&gt;
local DateModule = require(&#039;Módulo:Date&#039;)._Date &lt;br /&gt;
&lt;br /&gt;
-- Whether variable is set or not&lt;br /&gt;
function is_set( var )&lt;br /&gt;
    return not (var == nil or var == &#039;&#039;);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- First set variable or nil if none&lt;br /&gt;
function first_set(...)&lt;br /&gt;
    local list = {...};&lt;br /&gt;
    for _, var in pairs(list) do&lt;br /&gt;
        if is_set( var ) then&lt;br /&gt;
            return var;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Whether needle is in haystack&lt;br /&gt;
function inArray( needle, haystack )&lt;br /&gt;
    if needle == nil then&lt;br /&gt;
        return false;&lt;br /&gt;
    end&lt;br /&gt;
    for n,v in ipairs( haystack ) do&lt;br /&gt;
        if v == needle then&lt;br /&gt;
            return n;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return false;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Formatea una fecha para que se devuelva de la siguiente forma: &amp;quot;1 de enero de 2020&amp;quot;&lt;br /&gt;
Formats a date so it is returned as follows: &amp;quot;1 de enero de 2020&amp;quot;&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
function format_date(date_string)&lt;br /&gt;
	function dateFormatter(text)&lt;br /&gt;
		return DateModule(text):text(&#039;%-d de %B de %-Y&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local stat, res = pcall(dateFormatter, date_string)&lt;br /&gt;
	&lt;br /&gt;
	if stat then&lt;br /&gt;
      return res&lt;br /&gt;
    else&lt;br /&gt;
      return date_string&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Categorize and emit an error message when the citation contains one or more deprecated parameters.  Because deprecated parameters (currently |day=, |month=,&lt;br /&gt;
|coauthor=, and |coauthors=) aren&#039;t related to each other and because these parameters may be concatenated into the variables used by |date= and |author#= (and aliases)&lt;br /&gt;
details of which parameter caused the error message are not provided.  Only one error message is emitted regarless of the number of deprecated parameters in the citation.&lt;br /&gt;
]]&lt;br /&gt;
function deprecated_parameter( name )&lt;br /&gt;
--		table.insert( z.message_tail, { seterror( &#039;deprecated_params&#039;, {error_message}, true ) } );		-- add error message&lt;br /&gt;
		table.insert( z.message_tail, { seterror( &#039;deprecated_params&#039;, { name }, true ) } );		-- add error message&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Populates numbered arguments in a message string using an argument table.&lt;br /&gt;
function substitute( msg, args )&lt;br /&gt;
--	return args and tostring( mw.message.newRawMessage( msg, args ) ) or msg;&lt;br /&gt;
	return args and mw.message.newRawMessage( msg, args ):plain() or msg;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Apply kerning to open the space between the quote mark provided by the Module and a leading or trailing quote mark contained in a |title= or |chapter= parameter&#039;s value.&lt;br /&gt;
This function will positive kern  either single or double quotes:&lt;br /&gt;
	&amp;quot;&#039;Unkerned title with leading and trailing single quote marks&#039;&amp;quot;&lt;br /&gt;
	&amp;quot; &#039;Kerned title with leading and trailing single quote marks&#039; &amp;quot; (in real life the kerning isn&#039;t as wide as this example)&lt;br /&gt;
]]&lt;br /&gt;
function kern_quotes (str)&lt;br /&gt;
	local left=&#039;&amp;lt;span style=&amp;quot;padding-left:0.2em;&amp;quot;&amp;gt;%1&amp;lt;/span&amp;gt;&#039;;		-- spacing to use when title contains leading single or double quote mark&lt;br /&gt;
	local right=&#039;&amp;lt;span style=&amp;quot;padding-right:0.2em;&amp;quot;&amp;gt;%1&amp;lt;/span&amp;gt;&#039;;		-- spacing to use when title contains trailing single or double quote mark&lt;br /&gt;
	&lt;br /&gt;
	if  str:match (&amp;quot;^[\&amp;quot;\&#039;][^\&#039;]&amp;quot;) then&lt;br /&gt;
		str = string.gsub( str, &amp;quot;^[\&amp;quot;\&#039;]&amp;quot;, left, 1 );				-- replace (captured) leading single or double quote with left-side &amp;lt;span&amp;gt;&lt;br /&gt;
	end&lt;br /&gt;
	if str:match (&amp;quot;[^\&#039;][\&amp;quot;\&#039;]$&amp;quot;) then&lt;br /&gt;
		str = string.gsub( str, &amp;quot;[\&amp;quot;\&#039;]$&amp;quot;, right, 1 );			-- replace (captured) trailing single or double quote with right-side &amp;lt;span&amp;gt;&lt;br /&gt;
	end&lt;br /&gt;
	return str;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Wraps a string using a message_list configuration taking one argument&lt;br /&gt;
function wrap( key, str, lower )&lt;br /&gt;
    if not is_set( str ) then&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    elseif inArray( key, { &#039;italic-title&#039;, &#039;trans-italic-title&#039; } ) then&lt;br /&gt;
        str = safeforitalics( str );&lt;br /&gt;
    end&lt;br /&gt;
    if lower == true then&lt;br /&gt;
        return substitute( cfg.messages[key]:lower(), {str} );&lt;br /&gt;
    else&lt;br /&gt;
        return substitute( cfg.messages[key], {str} );&lt;br /&gt;
    end        &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Argument wrapper.  This function provides support for argument &lt;br /&gt;
mapping defined in the configuration file so that multiple names&lt;br /&gt;
can be transparently aliased to single internal variable.&lt;br /&gt;
]]&lt;br /&gt;
function argument_wrapper( args )&lt;br /&gt;
    local origin = {};&lt;br /&gt;
    &lt;br /&gt;
    return setmetatable({&lt;br /&gt;
        ORIGIN = function( self, k )&lt;br /&gt;
            local dummy = self[k]; --force the variable to be loaded.&lt;br /&gt;
            return origin[k];&lt;br /&gt;
        end&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
        __index = function ( tbl, k )&lt;br /&gt;
            if origin[k] ~= nil then&lt;br /&gt;
                return nil;&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            local args, list, v = args, cfg.aliases[k];&lt;br /&gt;
            &lt;br /&gt;
            if type( list ) == &#039;table&#039; then&lt;br /&gt;
                v, origin[k] = selectone( args, list, &#039;redundant_parameters&#039; );&lt;br /&gt;
                if origin[k] == nil then&lt;br /&gt;
                    origin[k] = &#039;&#039;; -- Empty string, not nil&lt;br /&gt;
                end&lt;br /&gt;
            elseif list ~= nil then&lt;br /&gt;
                v, origin[k] = args[list], list;&lt;br /&gt;
            else&lt;br /&gt;
                -- maybe let through instead of raising an error?&lt;br /&gt;
                -- v, origin[k] = args[k], k;&lt;br /&gt;
                error( cfg.messages[&#039;unknown_argument_map&#039;] );&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            -- Empty strings, not nil;&lt;br /&gt;
            if v == nil then&lt;br /&gt;
                v = cfg.defaults[k] or &#039;&#039;;&lt;br /&gt;
                origin[k] = &#039;&#039;;&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            tbl = rawset( tbl, k, v );&lt;br /&gt;
            return v;&lt;br /&gt;
        end,&lt;br /&gt;
    });&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Looks for a parameter&#039;s name in the whitelist.&lt;br /&gt;
&lt;br /&gt;
Parameters in the whitelist can have three values:&lt;br /&gt;
	true - active, supported parameters&lt;br /&gt;
	false - deprecated, supported parameters&lt;br /&gt;
	nil - unsupported parameters&lt;br /&gt;
]]&lt;br /&gt;
function validate( name )&lt;br /&gt;
	local name = tostring( name );&lt;br /&gt;
	local state = whitelist.basic_arguments[ name ];&lt;br /&gt;
	&lt;br /&gt;
	-- Normal arguments&lt;br /&gt;
	if true == state then return true; end		-- valid actively supported parameter&lt;br /&gt;
	if false == state then&lt;br /&gt;
		deprecated_parameter ( name );			-- parameter is deprecated but still supported&lt;br /&gt;
		return true;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Arguments with numbers in them&lt;br /&gt;
	name = name:gsub( &amp;quot;%d+&amp;quot;, &amp;quot;#&amp;quot; );				-- replace digit(s) with # (last25 becomes last#&lt;br /&gt;
	state = whitelist.numbered_arguments[ name ];&lt;br /&gt;
	if true == state then return true; end		-- valid actively supported parameter&lt;br /&gt;
	if false == state then&lt;br /&gt;
		deprecated_parameter ( name );			-- parameter is deprecated but still supported&lt;br /&gt;
		return true;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return false;								-- Not supported because not found or name is set to nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats a comment for error trapping&lt;br /&gt;
function errorcomment( content, hidden )&lt;br /&gt;
    return wrap( hidden and &#039;hidden-error&#039; or &#039;visible-error&#039;, content );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Sets an error condition and returns the appropriate error message.  The actual placement&lt;br /&gt;
of the error message in the output is the responsibility of the calling function.&lt;br /&gt;
]]&lt;br /&gt;
function seterror( error_id, arguments, raw, prefix, suffix )&lt;br /&gt;
    local error_state = cfg.error_conditions[ error_id ];&lt;br /&gt;
    &lt;br /&gt;
    prefix = prefix or &amp;quot;&amp;quot;;&lt;br /&gt;
    suffix = suffix or &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    if error_state == nil then&lt;br /&gt;
        error( cfg.messages[&#039;undefined_error&#039;] );&lt;br /&gt;
    elseif is_set( error_state.category ) then&lt;br /&gt;
        table.insert( z.error_categories, error_state.category );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local message = substitute( error_state.message, arguments );&lt;br /&gt;
    &lt;br /&gt;
    message = message .. &amp;quot; ([[&amp;quot; .. cfg.messages[&#039;help page link&#039;] .. &lt;br /&gt;
        &amp;quot;#&amp;quot; .. error_state.anchor .. &amp;quot;|&amp;quot; ..&lt;br /&gt;
        cfg.messages[&#039;help page label&#039;] .. &amp;quot;]])&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    z.error_ids[ error_id ] = true;&lt;br /&gt;
    if inArray( error_id, { &#039;bare_url_missing_title&#039;, &#039;trans_missing_title&#039; } )&lt;br /&gt;
            and z.error_ids[&#039;citation_missing_title&#039;] then&lt;br /&gt;
        return &#039;&#039;, false;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    message = table.concat({ prefix, message, suffix });&lt;br /&gt;
    &lt;br /&gt;
    if raw == true then&lt;br /&gt;
        return message, error_state.hidden;&lt;br /&gt;
    end        &lt;br /&gt;
        &lt;br /&gt;
    return errorcomment( message, error_state.hidden );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats a wiki style external link&lt;br /&gt;
function externallinkid(options)&lt;br /&gt;
    local url_string = options.id;&lt;br /&gt;
    if options.encode == true or options.encode == nil then&lt;br /&gt;
        url_string = mw.uri.encode( url_string );&lt;br /&gt;
    end&lt;br /&gt;
    return wrap( &#039;id&#039;, internallink(options.link, options.label) ..&lt;br /&gt;
        (options.separator or &amp;quot;&amp;amp;nbsp;&amp;quot;) .. mw.ustring.format( &#039;[%s%s%s %s]&#039;, &lt;br /&gt;
        options.prefix, url_string, options.suffix or &amp;quot;&amp;quot;,&lt;br /&gt;
        mw.text.nowiki(options.id)&lt;br /&gt;
    ));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats a wiki style internal link&lt;br /&gt;
function internallinkid(options)&lt;br /&gt;
    return wrap( &#039;id&#039;, internallink(options.link, options.label) ..&lt;br /&gt;
        (options.separator or &amp;quot;&amp;amp;nbsp;&amp;quot;) .. mw.ustring.format( &#039;[[%s%s%s|%s]]&#039;,&lt;br /&gt;
        options.prefix, options.id, options.suffix or &amp;quot;&amp;quot;,&lt;br /&gt;
        mw.text.nowiki(options.id)&lt;br /&gt;
    ));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Format an internal link, if link is really set&lt;br /&gt;
function internallink( link, label )&lt;br /&gt;
	if link and link ~= &#039;&#039; then&lt;br /&gt;
		return mw.ustring.format( &#039;[[%s|%s]]&#039;, link, label )&lt;br /&gt;
	else&lt;br /&gt;
		return label&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Format an external link with error checking&lt;br /&gt;
function externallink( URL, label, source )&lt;br /&gt;
    local error_str = &amp;quot;&amp;quot;;&lt;br /&gt;
    if not is_set( label ) then&lt;br /&gt;
        label = URL;&lt;br /&gt;
        if is_set( source ) then&lt;br /&gt;
            error_str = seterror( &#039;bare_url_missing_title&#039;, { wrap( &#039;parameter&#039;, source ) }, false, &amp;quot; &amp;quot; );&lt;br /&gt;
        else&lt;br /&gt;
            error( cfg.messages[&amp;quot;bare_url_no_origin&amp;quot;] );&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not checkurl( URL ) then&lt;br /&gt;
        error_str = seterror( &#039;bad_url&#039;, {}, false, &amp;quot; &amp;quot; ) .. error_str;&lt;br /&gt;
    elseif mw.title.getCurrentTitle():inNamespaces(0, 100, 104) and&lt;br /&gt;
    	not mw.title.getCurrentTitle().text:match(&#039;Wikipedia&#039;) and&lt;br /&gt;
    	URL:match(&#039;//[%a%.%-]+%.wikipedia%.org&#039;) then&lt;br /&gt;
    	error_str = seterror( &#039;bad_url_autorreferencia&#039;, {}, false, &amp;quot; &amp;quot; ) .. error_str;&lt;br /&gt;
    end&lt;br /&gt;
    return table.concat({ &amp;quot;[&amp;quot;, URL, &amp;quot; &amp;quot;, safeforurl( label ), &amp;quot;]&amp;quot;, error_str });&lt;br /&gt;
end&lt;br /&gt;
--[[--------------------------&amp;lt; N O R M A L I Z E _ L C C N &amp;gt;--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
lccn normalization (http://www.loc.gov/marc/lccn-namespace.html#normalization)&lt;br /&gt;
1. Remove all blanks.&lt;br /&gt;
2. If there is a forward slash (/) in the string, remove it, and remove all characters to the right of the forward slash.&lt;br /&gt;
3. If there is a hyphen in the string:&lt;br /&gt;
	a. Remove it.&lt;br /&gt;
	b. Inspect the substring following (to the right of) the (removed) hyphen. Then (and assuming that steps 1 and 2 have been carried out):&lt;br /&gt;
		1. All these characters should be digits, and there should be six or less. (not done in this function)&lt;br /&gt;
		2. If the length of the substring is less than 6, left-fill the substring with zeroes until the length is six.&lt;br /&gt;
&lt;br /&gt;
Returns a normalized lccn for lccn() to validate.  There is no error checking (step 3.b.1) performed in this function.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function normalize_lccn (lccn)&lt;br /&gt;
	lccn = lccn:gsub (&amp;quot;%s&amp;quot;, &amp;quot;&amp;quot;);									-- 1. strip whitespace&lt;br /&gt;
&lt;br /&gt;
	if nil ~= string.find (lccn,&#039;/&#039;) then&lt;br /&gt;
		lccn = lccn:match (&amp;quot;(.-)/&amp;quot;);								-- 2. remove forward slash and all character to the right of it&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local prefix&lt;br /&gt;
	local suffix&lt;br /&gt;
	prefix, suffix = lccn:match (&amp;quot;(.+)%-(.+)&amp;quot;);						-- 3.a remove hyphen by splitting the string into prefix and suffix&lt;br /&gt;
&lt;br /&gt;
	if nil ~= suffix then											-- if there was a hyphen&lt;br /&gt;
		suffix=string.rep(&amp;quot;0&amp;quot;, 6-string.len (suffix)) .. suffix;	-- 3.b.2 left fill the suffix with 0s if suffix length less than 6&lt;br /&gt;
		lccn=prefix..suffix;										-- reassemble the lccn&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return lccn;&lt;br /&gt;
	end&lt;br /&gt;
--[[&lt;br /&gt;
Format LCCN link and do simple error checking.  LCCN is a character string 8-12 characters long. The length of the LCCN dictates the character type of the first 1-3 characters; the&lt;br /&gt;
rightmost eight are always digits. http://info-uri.info/registry/OAIHandler?verb=GetRecord&amp;amp;metadataPrefix=reg&amp;amp;identifier=info:lccn/&lt;br /&gt;
&lt;br /&gt;
length = 8 then all digits&lt;br /&gt;
length = 9 then lccn[1] is alpha&lt;br /&gt;
length = 10 then lccn[1] and lccn[2] are both alpha or both digits&lt;br /&gt;
length = 11 then lccn[1] is alpha, lccn[2] and lccn[3] are both alpha or both digits&lt;br /&gt;
length = 12 then lccn[1] and lccn[2] are both alpha&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
function lccn(id)&lt;br /&gt;
	local handler = cfg.id_handlers[&#039;LCCN&#039;];&lt;br /&gt;
	local err_cat =  &#039;&#039;;								-- presume that LCCN is valid&lt;br /&gt;
&lt;br /&gt;
	id = normalize_lccn (id);&lt;br /&gt;
	&lt;br /&gt;
	local len = id:len();								-- get the length of the lccn&lt;br /&gt;
&lt;br /&gt;
	if 8 == len then&lt;br /&gt;
		if id:match(&amp;quot;[^%d]&amp;quot;) then						-- if LCCN has anything but digits (nil if only digits)&lt;br /&gt;
			err_cat = &#039; &#039; .. seterror( &#039;bad_lccn&#039; );	-- set an error message&lt;br /&gt;
		end&lt;br /&gt;
	elseif 9 == len then								-- LCCN should be adddddddd&lt;br /&gt;
		if nil == id:match(&amp;quot;%a%d%d%d%d%d%d%d%d&amp;quot;) then			-- does it match our pattern?&lt;br /&gt;
			err_cat = &#039; &#039; .. seterror( &#039;bad_lccn&#039; );	-- set an error message&lt;br /&gt;
		end&lt;br /&gt;
	elseif 10 == len then								-- LCCN should be aadddddddd or dddddddddd&lt;br /&gt;
		if id:match(&amp;quot;[^%d]&amp;quot;) then							-- if LCCN has anything but digits (nil if only digits) ...&lt;br /&gt;
			if nil == id:match(&amp;quot;^%a%a%d%d%d%d%d%d%d%d&amp;quot;) then	-- ... see if it matches our pattern&lt;br /&gt;
				err_cat = &#039; &#039; .. seterror( &#039;bad_lccn&#039; );	-- no match, set an error message&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	elseif 11 == len then								-- LCCN should be aaadddddddd or adddddddddd&lt;br /&gt;
		if not (id:match(&amp;quot;^%a%a%a%d%d%d%d%d%d%d%d&amp;quot;) or id:match(&amp;quot;^%a%d%d%d%d%d%d%d%d%d%d&amp;quot;)) then	-- see if it matches one of our patterns&lt;br /&gt;
			err_cat = &#039; &#039; .. seterror( &#039;bad_lccn&#039; );	-- no match, set an error message&lt;br /&gt;
		end&lt;br /&gt;
	elseif 12 == len then								-- LCCN should be aadddddddddd&lt;br /&gt;
		if not id:match(&amp;quot;^%a%a%d%d%d%d%d%d%d%d%d%d&amp;quot;) then	-- see if it matches our pattern&lt;br /&gt;
			err_cat = &#039; &#039; .. seterror( &#039;bad_lccn&#039; );	-- no match, set an error message&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		err_cat = &#039; &#039; .. seterror( &#039;bad_lccn&#039; );		-- wrong length, set an error message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return externallinkid({link = handler.link, label = handler.label,&lt;br /&gt;
			prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode}) .. err_cat;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Format PMID and do simple error checking.  PMIDs are sequential numbers beginning at 1 and counting up.  This code checks the PMID to see that it&lt;br /&gt;
contains only digits and is less than test_limit; the value in local variable test_limit will need to be updated periodically as more PMIDs are issued.&lt;br /&gt;
]]&lt;br /&gt;
function pmid(id)&lt;br /&gt;
	local test_limit = 45000000;						-- update this value as PMIDs approach&lt;br /&gt;
	local handler = cfg.id_handlers[&#039;PMID&#039;];&lt;br /&gt;
	local err_cat =  &#039;&#039;;								-- presume that PMID is valid&lt;br /&gt;
	&lt;br /&gt;
	if id:match(&amp;quot;[^%d]&amp;quot;) then							-- if PMID has anything but digits&lt;br /&gt;
		err_cat = &#039; &#039; .. seterror( &#039;bad_pmid&#039; );		-- set an error message&lt;br /&gt;
	else												-- PMID is only digits&lt;br /&gt;
		local id_num = tonumber(id);					-- convert id to a number for range testing&lt;br /&gt;
		if 1 &amp;gt; id_num or test_limit &amp;lt; id_num then		-- if PMID is outside test limit boundaries&lt;br /&gt;
			err_cat = &#039; &#039; .. seterror( &#039;bad_pmid&#039; );	-- set an error message&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return externallinkid({link = handler.link, label = handler.label,&lt;br /&gt;
			prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode}) .. err_cat;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Determines if a PMC identifier&#039;s online version is embargoed. Compares the date in |embargo= against today&#039;s date.  If embargo date is&lt;br /&gt;
in the future, returns true; otherwse, returns false because the embargo has expired or |embargo= not set in this cite.&lt;br /&gt;
]]&lt;br /&gt;
function is_embargoed(embargo)&lt;br /&gt;
	if is_set(embargo) then&lt;br /&gt;
		local lang = mw.getContentLanguage();&lt;br /&gt;
		local good1, embargo_date, good2, todays_date;&lt;br /&gt;
		good1, embargo_date = pcall( lang.formatDate, lang, &#039;U&#039;, embargo );&lt;br /&gt;
		good2, todays_date = pcall( lang.formatDate, lang, &#039;U&#039; );&lt;br /&gt;
	&lt;br /&gt;
		if good1 and good2 and tonumber( embargo_date ) &amp;gt;= tonumber( todays_date ) then	--is embargo date is in the future?&lt;br /&gt;
			return true;	-- still embargoed&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false;			-- embargo expired or |embargo= not set&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Format a PMC, do simple error checking, and check for embargoed articles.&lt;br /&gt;
&lt;br /&gt;
The embargo parameter takes a date for a value. If the embargo date is in the future&lt;br /&gt;
the PMC identifier will not be linked to the article.  If the embargo specifies a date in the past, or if it is empty or omitted, then&lt;br /&gt;
the PMC identifier is linked to the article through the link at cfg.id_handlers[&#039;PMC&#039;].prefix.&lt;br /&gt;
&lt;br /&gt;
PMCs are sequential numbers beginning at 1 and counting up.  This code checks the PMC to see that it contains only digits and is less&lt;br /&gt;
than test_limit; the value in local variable test_limit will need to be updated periodically as more PMCs are issued.&lt;br /&gt;
]]&lt;br /&gt;
function pmc(id, embargo)&lt;br /&gt;
	local test_limit = 16000000;							-- update this value as PMCs approach&lt;br /&gt;
	local handler = cfg.id_handlers[&#039;PMC&#039;];&lt;br /&gt;
	local err_cat =  &#039;&#039;;								-- presume that PMC is valid&lt;br /&gt;
    &lt;br /&gt;
	local text;&lt;br /&gt;
&lt;br /&gt;
	if id:match(&amp;quot;^PMC%d&amp;quot;) then&lt;br /&gt;
		id = id:sub(4, j)								-- remove &#039;PMC&#039; preffix if given&lt;br /&gt;
	end&lt;br /&gt;
	if id:match(&amp;quot;[^%d]&amp;quot;) then							-- if PMC has anything but digits&lt;br /&gt;
		err_cat = &#039; &#039; .. seterror( &#039;bad_pmc&#039; );			-- set an error message&lt;br /&gt;
	else												-- PMC is only digits&lt;br /&gt;
		local id_num = tonumber(id);					-- convert id to a number for range testing&lt;br /&gt;
		if 1 &amp;gt; id_num or test_limit &amp;lt; id_num then		-- if PMC is outside test limit boundaries&lt;br /&gt;
			err_cat = &#039; &#039; .. seterror( &#039;bad_pmc&#039; );		-- set an error message&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if is_embargoed(embargo) then&lt;br /&gt;
		text=&amp;quot;[[&amp;quot; .. handler.link .. &amp;quot;|&amp;quot; .. handler.label .. &amp;quot;]]:&amp;quot; .. handler.separator .. id .. err_cat;	--still embargoed so no external link&lt;br /&gt;
	else&lt;br /&gt;
		text = externallinkid({link = handler.link, label = handler.label,			--no embargo date, ok to link to article&lt;br /&gt;
			prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode}) .. err_cat;&lt;br /&gt;
	end&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats a DOI and checks for DOI errors.&lt;br /&gt;
&lt;br /&gt;
-- DOI names contain two parts: prefix and suffix separated by a forward slash.&lt;br /&gt;
--  Prefix: directory indicator &#039;10.&#039; followed by a registrant code&lt;br /&gt;
--  Suffix: character string of any length chosen by the registrant&lt;br /&gt;
&lt;br /&gt;
-- This function checks a DOI name for: prefix/suffix.  If the doi name contains spaces or endashes,&lt;br /&gt;
-- or, if it ends with a period or a comma, this function will emit a bad_doi error message.&lt;br /&gt;
&lt;br /&gt;
-- DOI names are case-insensitive and can incorporate any printable Unicode characters so the test for spaces, endash,&lt;br /&gt;
-- and terminal punctuation may not be technically correct but it appears, that in practice these characters are rarely if ever used in doi names.&lt;br /&gt;
&lt;br /&gt;
function doi(id, inactive)&lt;br /&gt;
    local cat = &amp;quot;&amp;quot;&lt;br /&gt;
    local handler = cfg.id_handlers[&#039;DOI&#039;];&lt;br /&gt;
    &lt;br /&gt;
    local text;&lt;br /&gt;
	if is_set(inactive) then&lt;br /&gt;
		local inactive_year = inactive:match(&amp;quot;%d%d%d%d&amp;quot;) or &#039;&#039;;		-- try to get the year portion from the inactive date&lt;br /&gt;
		text = &amp;quot;[[&amp;quot; .. handler.link .. &amp;quot;|&amp;quot; .. handler.label .. &amp;quot;]]:&amp;quot; .. id;&lt;br /&gt;
		if is_set(inactive_year) then&lt;br /&gt;
			table.insert( z.error_categories, &amp;quot;Wikipedia:Páginas con DOI inactivos desde &amp;quot; .. inactive_year );&lt;br /&gt;
		else&lt;br /&gt;
			table.insert( z.error_categories, &amp;quot;Wikipedia:Páginas con DOI inactivos&amp;quot; );	-- when inactive doesn&#039;t contain a recognizable year&lt;br /&gt;
		end&lt;br /&gt;
		inactive = &amp;quot; (&amp;quot; .. cfg.messages[&#039;inactive&#039;] .. &amp;quot; &amp;quot; .. inactive .. &amp;quot;)&amp;quot; &lt;br /&gt;
	else &lt;br /&gt;
		text = externallinkid({link = handler.link, label = handler.label,&lt;br /&gt;
			prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode})&lt;br /&gt;
		inactive = &amp;quot;&amp;quot; &lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if nil == id:match(&amp;quot;^10%.[^%s–]-/[^%s–]-[^%.,]$&amp;quot;) then	-- doi must begin with &#039;10.&#039;, must contain a fwd slash, must not contain spaces or endashes, and must not end with period or comma&lt;br /&gt;
		cat = &#039; &#039; .. seterror( &#039;bad_doi&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	return text .. inactive .. cat &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats an OpenLibrary link, and checks for associated errors.&lt;br /&gt;
function openlibrary(id)&lt;br /&gt;
    local code = id:sub(-1,-1)&lt;br /&gt;
    local handler = cfg.id_handlers[&#039;OL&#039;];&lt;br /&gt;
    if ( code == &amp;quot;A&amp;quot; ) then&lt;br /&gt;
        return externallinkid({link=handler.link, label=handler.label,&lt;br /&gt;
            prefix=&amp;quot;http://openlibrary.org/authors/OL&amp;quot;,id=id, separator=handler.separator,&lt;br /&gt;
            encode = handler.encode})&lt;br /&gt;
    elseif ( code == &amp;quot;M&amp;quot; ) then&lt;br /&gt;
        return externallinkid({link=handler.link, label=handler.label,&lt;br /&gt;
            prefix=&amp;quot;http://openlibrary.org/books/OL&amp;quot;,id=id, separator=handler.separator,&lt;br /&gt;
            encode = handler.encode})&lt;br /&gt;
    elseif ( code == &amp;quot;W&amp;quot; ) then&lt;br /&gt;
        return externallinkid({link=handler.link, label=handler.label,&lt;br /&gt;
            prefix= &amp;quot;http://openlibrary.org/works/OL&amp;quot;,id=id, separator=handler.separator,&lt;br /&gt;
            encode = handler.encode})&lt;br /&gt;
    else&lt;br /&gt;
        return externallinkid({link=handler.link, label=handler.label,&lt;br /&gt;
            prefix= &amp;quot;http://openlibrary.org/OL&amp;quot;,id=id, separator=handler.separator,&lt;br /&gt;
            encode = handler.encode}) .. &lt;br /&gt;
            &#039; &#039; .. seterror( &#039;bad_ol&#039; );&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Validate and format an issn.  This code fixes the case where an editor has included an ISSN in the citation but has separated the two groups of four&lt;br /&gt;
digits with a space.  When that condition occurred, the resulting link looked like this:&lt;br /&gt;
&lt;br /&gt;
	|issn=0819 4327 gives: [http://www.worldcat.org/issn/0819 4327 0819 4327]  -- can&#039;t have spaces in an external link&lt;br /&gt;
	&lt;br /&gt;
This code now prevents that by inserting a hyphen at the issn midpoint.  It also validates the issn for length and makes sure that the checkdigit agrees&lt;br /&gt;
with the calculated value.  Incorrect length (8 digits), characters other than 0-9 and X, or checkdigit / calculated value mismatch will all cause a check issn&lt;br /&gt;
error message.  The issn is always displayed with a hyphen, even if the issn was given as a single group of 8 digits.&lt;br /&gt;
]]&lt;br /&gt;
function issn(id, id_handler)&lt;br /&gt;
	local ModuloIdentificadores = require(&#039;Módulo:Identificadores&#039;)	&lt;br /&gt;
	local issn_copy = id;		-- save a copy of unadulterated issn; use this version for display if issn does not validate&lt;br /&gt;
	local handler = cfg.id_handlers[id_handler];&lt;br /&gt;
	local text;&lt;br /&gt;
	local valid_issn = true;&lt;br /&gt;
&lt;br /&gt;
	id=id:gsub( &amp;quot;[%s-–]&amp;quot;, &amp;quot;&amp;quot; );									-- strip spaces, hyphens, and ndashes from the issn&lt;br /&gt;
&lt;br /&gt;
	if 8 ~= id:len() or nil == id:match( &amp;quot;^%d*X?$&amp;quot; ) then		-- validate the issn: 8 didgits long, containing only 0-9 or X in the last position&lt;br /&gt;
		valid_issn=false;										-- wrong length or improper character&lt;br /&gt;
	else&lt;br /&gt;
		valid_issn=ModuloIdentificadores.esValidoISXN(id, 8);	-- validate issn&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if true == valid_issn then&lt;br /&gt;
		id = string.sub( id, 1, 4 ) .. &amp;quot;-&amp;quot; .. string.sub( id, 5 );	-- if valid, display correctly formatted version&lt;br /&gt;
	else&lt;br /&gt;
		id = issn_copy;											-- if not valid, use the show the invalid issn with error message&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	text = externallinkid({link = handler.link, label = handler.label,&lt;br /&gt;
		prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode})&lt;br /&gt;
 &lt;br /&gt;
	if false == valid_issn then&lt;br /&gt;
		text = text .. &#039; &#039; .. seterror( &#039;bad_issn&#039; )			-- add an error message if the issn is invalid&lt;br /&gt;
	end &lt;br /&gt;
	&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
This function sets default title types (equivalent to the citation including |type=&amp;lt;default value&amp;gt;) for those citations that have defaults.&lt;br /&gt;
Also handles the special case where it is desireable to omit the title type from the rendered citation (|type=none).&lt;br /&gt;
]]&lt;br /&gt;
function set_titletype(cite_class, title_type)&lt;br /&gt;
	if is_set(title_type) then&lt;br /&gt;
		if &amp;quot;none&amp;quot; == title_type then&lt;br /&gt;
			title_type = &amp;quot;&amp;quot;;					-- if |type=none then type parameter not displayed&lt;br /&gt;
		end&lt;br /&gt;
		return title_type;						-- if |type= has been set to any other value use that value&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
--	if &amp;quot;AV media notes&amp;quot; == cite_class or &amp;quot;DVD notes&amp;quot; == cite_class then		-- if this citation is cite AV media notes or cite DVD notes&lt;br /&gt;
	if &amp;quot;notas audiovisual&amp;quot; == cite_class or &amp;quot;notas de DVD&amp;quot; == cite_class then		-- if this citation is cite AV media notes or cite DVD notes		&lt;br /&gt;
		return &amp;quot;Media notes&amp;quot;;					-- display AV media notes / DVD media notes annotation -- Falta traducir&lt;br /&gt;
&lt;br /&gt;
	elseif &amp;quot;podcast&amp;quot; == cite_class then			-- if this citation is cite podcast&lt;br /&gt;
		return &amp;quot;Podcast&amp;quot;;						-- display podcast annotation&lt;br /&gt;
&lt;br /&gt;
	elseif &amp;quot;pressrelease&amp;quot; == cite_class then	-- if this citation is cite press release&lt;br /&gt;
		return &amp;quot;Press release&amp;quot;;					-- display press release annotation&lt;br /&gt;
&lt;br /&gt;
	elseif &amp;quot;techreport&amp;quot; == cite_class then		-- if this citation is cite techreport&lt;br /&gt;
		return &amp;quot;Technical report&amp;quot;;				-- display techreport annotation&lt;br /&gt;
		&lt;br /&gt;
	elseif &amp;quot;tesis&amp;quot; == cite_class then			-- if this citation is cite thesis (degree option handled after this function returns)&lt;br /&gt;
			return &amp;quot;Tesis&amp;quot;;			 			-- display simple thesis annotation (without |degree= modification)			&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Determines whether a URL string is valid&lt;br /&gt;
&lt;br /&gt;
At present the only check is whether the string appears to &lt;br /&gt;
be prefixed with a URI scheme.  It is not determined whether &lt;br /&gt;
the URI scheme is valid or whether the URL is otherwise well &lt;br /&gt;
formed.&lt;br /&gt;
]]&lt;br /&gt;
function checkurl( url_str )&lt;br /&gt;
    -- Protocol-relative or URL scheme&lt;br /&gt;
    return url_str:sub(1,2) == &amp;quot;//&amp;quot; or url_str:match( &amp;quot;^[^/]*:&amp;quot; ) ~= nil;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Removes irrelevant text and dashes from ISBN number&lt;br /&gt;
-- Similar to that used for Special:BookSources&lt;br /&gt;
function cleanisbn( isbn_str )&lt;br /&gt;
    return isbn_str:gsub( &amp;quot;[^-0-9X]&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Extract page numbers from external wikilinks in any of the |page=, |pages=, or |at= parameters for use in COinS.&lt;br /&gt;
function get_coins_pages (pages)&lt;br /&gt;
	if not is_set (pages) then return pages; end			-- if no page numbers then we&#039;re done&lt;br /&gt;
	&lt;br /&gt;
    while true do&lt;br /&gt;
    	local urlPattern = &amp;quot;%[%w*:?//[^ ]+%s+([%w%d].*)%]&amp;quot;&lt;br /&gt;
		local urlMatch = pages:match(urlPattern); -- pattern is the opening bracket, the url and following space(s): &amp;quot;[url &amp;quot;&lt;br /&gt;
		if nil == urlMatch then break; end					-- no more urls&lt;br /&gt;
		pages = pages:gsub(urlPattern, &amp;quot;%1&amp;quot;);					-- remove as many instances of pattern as possible&lt;br /&gt;
	end&lt;br /&gt;
	pages = pages:gsub(&amp;quot;[%[%]]&amp;quot;, &amp;quot;&amp;quot;);						-- remove the brackets&lt;br /&gt;
	pages = pages:gsub(&amp;quot;–&amp;quot;, &amp;quot;-&amp;quot; );							-- replace endashes with hyphens&lt;br /&gt;
	pages = pages:gsub(&amp;quot;&amp;amp;%w+;&amp;quot;, &amp;quot;-&amp;quot; );						-- and replace html entities (&amp;amp;ndash; etc) with hyphens; do we need to replace numerical entities like &amp;amp;#32; and the like?&lt;br /&gt;
	return pages;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Gets the display text for a wikilink like [[A|B]] or [[B]] gives B&lt;br /&gt;
function removewikilink( str )&lt;br /&gt;
    return (str:gsub( &amp;quot;%[%[([^%[%]]*)%]%]&amp;quot;, function(l)&lt;br /&gt;
        return l:gsub( &amp;quot;^[^|]*|(.*)$&amp;quot;, &amp;quot;%1&amp;quot; ):gsub(&amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;);&lt;br /&gt;
    end));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Escape sequences for content that will be used for URL descriptions&lt;br /&gt;
function safeforurl( str )&lt;br /&gt;
    if str:match( &amp;quot;%[%[.-%]%]&amp;quot; ) ~= nil then &lt;br /&gt;
        table.insert( z.message_tail, { seterror( &#039;wikilink_in_url&#039;, {}, true ) } );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return str:gsub( &#039;[%[%]\n]&#039;, {    &lt;br /&gt;
        [&#039;[&#039;] = &#039;&amp;amp;#91;&#039;,&lt;br /&gt;
        [&#039;]&#039;] = &#039;&amp;amp;#93;&#039;,&lt;br /&gt;
        [&#039;\n&#039;] = &#039; &#039; } );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Convierte un guión largo (signo de negativo) en un guión corto.&lt;br /&gt;
function dashtohyphen( str )&lt;br /&gt;
    if not is_set(str) or str:match( &amp;quot;[%[%]{}&amp;lt;&amp;gt;]&amp;quot; ) ~= nil then&lt;br /&gt;
        return str;&lt;br /&gt;
    end    &lt;br /&gt;
    return str:gsub( &#039;–&#039;, &#039;-&#039; );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Protects a string that will be wrapped in wiki italic markup &#039;&#039; ... &#039;&#039;&lt;br /&gt;
function safeforitalics( str )&lt;br /&gt;
    --[[ Note: We can not use &amp;lt;i&amp;gt; for italics, as the expected behavior for&lt;br /&gt;
    italics specified by &#039;&#039;...&#039;&#039; in the title is that they will be inverted&lt;br /&gt;
    (i.e. unitalicized) in the resulting references.  In addition, &amp;lt;i&amp;gt; and &#039;&#039;&lt;br /&gt;
    tend to interact poorly under Mediawiki&#039;s HTML tidy. ]]&lt;br /&gt;
    &lt;br /&gt;
    if not is_set(str) then&lt;br /&gt;
        return str;&lt;br /&gt;
    else&lt;br /&gt;
        if str:sub(1,1) == &amp;quot;&#039;&amp;quot; then str = &amp;quot;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;quot; .. str; end&lt;br /&gt;
        if str:sub(-1,-1) == &amp;quot;&#039;&amp;quot; then str = str .. &amp;quot;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;; end&lt;br /&gt;
        &lt;br /&gt;
        -- Remove newlines as they break italics.&lt;br /&gt;
        return str:gsub( &#039;\n&#039;, &#039; &#039; );&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Joins a sequence of strings together while checking for duplicate separation&lt;br /&gt;
characters.&lt;br /&gt;
]]&lt;br /&gt;
function safejoin( tbl, duplicate_char )&lt;br /&gt;
    --[[&lt;br /&gt;
    Note: we use string functions here, rather than ustring functions.&lt;br /&gt;
    &lt;br /&gt;
    This has considerably faster performance and should work correctly as &lt;br /&gt;
    long as the duplicate_char is strict ASCII.  The strings&lt;br /&gt;
    in tbl may be ASCII or UTF8.&lt;br /&gt;
    ]]&lt;br /&gt;
    &lt;br /&gt;
    local str = &#039;&#039;;&lt;br /&gt;
    local comp = &#039;&#039;;&lt;br /&gt;
    local end_chr = &#039;&#039;;&lt;br /&gt;
    local trim;&lt;br /&gt;
    for _, value in ipairs( tbl ) do&lt;br /&gt;
        if value == nil then value = &#039;&#039;; end&lt;br /&gt;
        &lt;br /&gt;
        if str == &#039;&#039; then&lt;br /&gt;
            str = value;&lt;br /&gt;
        elseif value ~= &#039;&#039; then&lt;br /&gt;
            if value:sub(1,1) == &#039;&amp;lt;&#039; then&lt;br /&gt;
                -- Special case of values enclosed in spans and other markup.&lt;br /&gt;
                comp = value:gsub( &amp;quot;%b&amp;lt;&amp;gt;&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;
            else&lt;br /&gt;
                comp = value;&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            if comp:sub(1,1) == duplicate_char then&lt;br /&gt;
                trim = false;&lt;br /&gt;
                end_chr = str:sub(-1,-1);&lt;br /&gt;
                -- str = str .. &amp;quot;&amp;lt;HERE(enchr=&amp;quot; .. end_chr.. &amp;quot;)&amp;quot;&lt;br /&gt;
                if end_chr == duplicate_char then&lt;br /&gt;
                    str = str:sub(1,-2);&lt;br /&gt;
                elseif end_chr == &amp;quot;&#039;&amp;quot; then&lt;br /&gt;
                    if str:sub(-3,-1) == duplicate_char .. &amp;quot;&#039;&#039;&amp;quot; then&lt;br /&gt;
                        str = str:sub(1, -4) .. &amp;quot;&#039;&#039;&amp;quot;;&lt;br /&gt;
                    elseif str:sub(-5,-1) == duplicate_char .. &amp;quot;]]&#039;&#039;&amp;quot; then&lt;br /&gt;
                        trim = true;&lt;br /&gt;
                    elseif str:sub(-4,-1) == duplicate_char .. &amp;quot;]&#039;&#039;&amp;quot; then&lt;br /&gt;
                        trim = true;&lt;br /&gt;
                    end&lt;br /&gt;
                elseif end_chr == &amp;quot;]&amp;quot; then&lt;br /&gt;
                    if str:sub(-3,-1) == duplicate_char .. &amp;quot;]]&amp;quot; then&lt;br /&gt;
                        trim = true;&lt;br /&gt;
                    elseif str:sub(-2,-1) == duplicate_char .. &amp;quot;]&amp;quot; then&lt;br /&gt;
                        trim = true;&lt;br /&gt;
                    end&lt;br /&gt;
                elseif end_chr == &amp;quot; &amp;quot; then&lt;br /&gt;
                    if str:sub(-2,-1) == duplicate_char .. &amp;quot; &amp;quot; then&lt;br /&gt;
                        str = str:sub(1,-3);&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                if trim then&lt;br /&gt;
                    if value ~= comp then &lt;br /&gt;
                        local dup2 = duplicate_char;&lt;br /&gt;
                        if dup2:match( &amp;quot;%A&amp;quot; ) then dup2 = &amp;quot;%&amp;quot; .. dup2; end&lt;br /&gt;
                        &lt;br /&gt;
                        value = value:gsub( &amp;quot;(%b&amp;lt;&amp;gt;)&amp;quot; .. dup2, &amp;quot;%1&amp;quot;, 1 )&lt;br /&gt;
                    else&lt;br /&gt;
                        value = value:sub( 2, -1 );&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            str = str .. value;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return str;&lt;br /&gt;
end  &lt;br /&gt;
&lt;br /&gt;
-- Attempts to convert names to initials.&lt;br /&gt;
function reducetoinitials(first)&lt;br /&gt;
    local initials = {}&lt;br /&gt;
    for word in string.gmatch(first, &amp;quot;%S+&amp;quot;) do&lt;br /&gt;
        table.insert(initials, string.sub(word,1,1)) -- Vancouver format does not include full stops.&lt;br /&gt;
    end&lt;br /&gt;
    return table.concat(initials) -- Vancouver format does not include spaces.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formats a list of people (e.g. authors / editors) &lt;br /&gt;
function listpeople(control, people)&lt;br /&gt;
    local sep = control.sep;&lt;br /&gt;
    local namesep = control.namesep&lt;br /&gt;
    local format = control.format&lt;br /&gt;
    local maximum = control.maximum&lt;br /&gt;
    local lastauthoramp = control.lastauthoramp;&lt;br /&gt;
    local text = {}&lt;br /&gt;
    local etal = false;&lt;br /&gt;
    &lt;br /&gt;
    if sep:sub(-1,-1) ~= &amp;quot; &amp;quot; then sep = sep .. &amp;quot; &amp;quot; end&lt;br /&gt;
    if maximum ~= nil and maximum &amp;lt; 1 then return &amp;quot;&amp;quot;, 0; end&lt;br /&gt;
    &lt;br /&gt;
    for i,person in ipairs(people) do&lt;br /&gt;
        if is_set(person.last) then&lt;br /&gt;
            local mask = person.mask&lt;br /&gt;
            local one&lt;br /&gt;
            local sep_one = sep;&lt;br /&gt;
            if maximum ~= nil and i &amp;gt; maximum then&lt;br /&gt;
                etal = true;&lt;br /&gt;
                break;&lt;br /&gt;
            elseif (mask ~= nil) then&lt;br /&gt;
                local n = tonumber(mask)&lt;br /&gt;
                if (n ~= nil) then&lt;br /&gt;
                    one = string.rep(&amp;quot;&amp;amp;mdash;&amp;quot;,n)&lt;br /&gt;
                else&lt;br /&gt;
                    one = mask;&lt;br /&gt;
                    sep_one = &amp;quot; &amp;quot;;&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                one = person.last&lt;br /&gt;
                local first = person.first&lt;br /&gt;
                if is_set(first) then &lt;br /&gt;
                    if ( &amp;quot;vanc&amp;quot; == format ) then first = reducetoinitials(first) end&lt;br /&gt;
                    one = one .. namesep .. first &lt;br /&gt;
                end&lt;br /&gt;
                if is_set(person.link) then one = &amp;quot;[[&amp;quot; .. person.link .. &amp;quot;|&amp;quot; .. one .. &amp;quot;]]&amp;quot; end&lt;br /&gt;
                if is_set(person.link) and nil ~= person.link:find(&amp;quot;//&amp;quot;) then one = one .. &amp;quot; &amp;quot; .. seterror( &#039;bad_authorlink&#039; ) end	-- check for url in author link;&lt;br /&gt;
            end&lt;br /&gt;
            table.insert( text, one )&lt;br /&gt;
            table.insert( text, sep_one )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local count = #text / 2;&lt;br /&gt;
    if count &amp;gt; 0 then &lt;br /&gt;
        if count &amp;gt; 1 and is_set(lastauthoramp) and not etal then&lt;br /&gt;
            text[#text-2] = &amp;quot; &amp;amp; &amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        text[#text] = nil; &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local result = table.concat(text) -- construct list&lt;br /&gt;
    if etal then &lt;br /&gt;
        local etal_text = cfg.messages[&#039;et al&#039;];&lt;br /&gt;
        result = result .. &amp;quot; &amp;quot; .. etal_text;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- if necessary wrap result in &amp;lt;span&amp;gt; tag to format in Small Caps&lt;br /&gt;
    if ( &amp;quot;scap&amp;quot; == format ) then result = &lt;br /&gt;
        &#039;&amp;lt;span class=&amp;quot;smallcaps&amp;quot; style=&amp;quot;font-variant:small-caps&amp;quot;&amp;gt;&#039; .. result .. &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    end &lt;br /&gt;
    return result, count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Generates a CITEREF anchor ID.&lt;br /&gt;
function anchorid( options )&lt;br /&gt;
    return &amp;quot;CITAREF&amp;quot; .. table.concat( options ); --return &amp;quot;CITEREF&amp;quot; .. table.concat( options );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Gets name list from the input arguments&lt;br /&gt;
function extractnames(args, list_name)&lt;br /&gt;
    local names = {};&lt;br /&gt;
    local i = 1;&lt;br /&gt;
    local last;&lt;br /&gt;
    &lt;br /&gt;
    while true do&lt;br /&gt;
        last = selectone( args, cfg.aliases[list_name .. &#039;-Last&#039;], &#039;redundant_parameters&#039;, i );&lt;br /&gt;
        if not is_set(last) then&lt;br /&gt;
            -- just in case someone passed in an empty parameter&lt;br /&gt;
            break;&lt;br /&gt;
        end&lt;br /&gt;
        names[i] = {&lt;br /&gt;
            last = last,&lt;br /&gt;
            first = selectone( args, cfg.aliases[list_name .. &#039;-First&#039;], &#039;redundant_parameters&#039;, i ),&lt;br /&gt;
            link = selectone( args, cfg.aliases[list_name .. &#039;-Link&#039;], &#039;redundant_parameters&#039;, i ),&lt;br /&gt;
            mask = selectone( args, cfg.aliases[list_name .. &#039;-Mask&#039;], &#039;redundant_parameters&#039;, i )&lt;br /&gt;
        };&lt;br /&gt;
        i = i + 1;&lt;br /&gt;
    end&lt;br /&gt;
    return names;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Populates ID table from arguments using configuration settings&lt;br /&gt;
function extractids( args )&lt;br /&gt;
    local id_list = {};&lt;br /&gt;
    for k, v in pairs( cfg.id_handlers ) do    &lt;br /&gt;
        v = selectone( args, v.parameters, &#039;redundant_parameters&#039; );&lt;br /&gt;
        if is_set(v) then id_list[k] = v; end&lt;br /&gt;
    end&lt;br /&gt;
    return id_list;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Takes a table of IDs and turns it into a table of formatted ID outputs.&lt;br /&gt;
function buildidlist( id_list, options )&lt;br /&gt;
    local new_list, handler = {};&lt;br /&gt;
    &lt;br /&gt;
    function fallback(k) return { __index = function(t,i) return cfg.id_handlers[k][i] end } end;&lt;br /&gt;
    &lt;br /&gt;
    for k, v in pairs( id_list ) do&lt;br /&gt;
        -- fallback to read-only cfg&lt;br /&gt;
        handler = setmetatable( { [&#039;id&#039;] = v }, fallback(k) );&lt;br /&gt;
        &lt;br /&gt;
        if handler.mode == &#039;external&#039; then&lt;br /&gt;
            table.insert( new_list, {handler.label, externallinkid( handler ) } );&lt;br /&gt;
        elseif handler.mode == &#039;internal&#039; then&lt;br /&gt;
            table.insert( new_list, {handler.label, internallinkid( handler ) } );&lt;br /&gt;
        elseif handler.mode ~= &#039;manual&#039; then&lt;br /&gt;
            error( cfg.messages[&#039;unknown_ID_mode&#039;] );&lt;br /&gt;
        elseif k == &#039;DOI&#039; then&lt;br /&gt;
            table.insert( new_list, {handler.label, doi( v, options.DoiBroken ) } );&lt;br /&gt;
        elseif k == &#039;LCCN&#039; then&lt;br /&gt;
            table.insert( new_list, {handler.label, lccn( v ) } );&lt;br /&gt;
        elseif k == &#039;OL&#039; then&lt;br /&gt;
            table.insert( new_list, {handler.label, openlibrary( v ) } );&lt;br /&gt;
        elseif k == &#039;PMC&#039; then&lt;br /&gt;
            table.insert( new_list, {handler.label, pmc( v, options.Embargo ) } );&lt;br /&gt;
        elseif k == &#039;PMID&#039; then&lt;br /&gt;
            table.insert( new_list, {handler.label, pmid( v ) } );&lt;br /&gt;
        elseif k == &#039;ISSN&#039; then&lt;br /&gt;
        	table.insert( new_list, {handler.label, issn( v:upper(), k ) } );&lt;br /&gt;
        elseif k == &#039;EISSN&#039; then&lt;br /&gt;
        	table.insert( new_list, {handler.label, issn( v:upper(), k ) } );&lt;br /&gt;
        elseif k == &#039;ISBN&#039; then&lt;br /&gt;
            --local ISBN = internallinkid( handler );&lt;br /&gt;
            --if not checkisbn( v ) and not is_set(options.IgnoreISBN) then&lt;br /&gt;
            --    ISBN = ISBN .. seterror( &#039;bad_isbn&#039;, {}, false, &amp;quot; &amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;
            --end        	&lt;br /&gt;
        	local ISBN&lt;br /&gt;
        	if options.ISBNCorrecto or options.ISBNSugerido or is_set(options.IgnoreISBN) then&lt;br /&gt;
        		ISBN = internallinkid( handler );&lt;br /&gt;
        	else -- ISBN incorrecto.&lt;br /&gt;
      			ISBN = internallinkid( handler ) .. seterror( &#039;bad_isbn&#039;, {}, false, &amp;quot; &amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;
        	end&lt;br /&gt;
            table.insert( new_list, {handler.label, ISBN } );&lt;br /&gt;
        else&lt;br /&gt;
            error( cfg.messages[&#039;unknown_manual_ID&#039;] );&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    function comp( a, b )	-- used in following table.sort()&lt;br /&gt;
        return a[1] &amp;lt; b[1];&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    table.sort( new_list, comp );&lt;br /&gt;
    for k, v in ipairs( new_list ) do&lt;br /&gt;
        new_list[k] = v[2];&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return new_list;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CorregirISBN(ISBNIncorrecto)&lt;br /&gt;
	local ModuloIdentificadores = require(&#039;Módulo:Identificadores&#039;)	&lt;br /&gt;
	local ISBNCorregido&lt;br /&gt;
	&lt;br /&gt;
--  Convertir mayúsculas	&lt;br /&gt;
	ISBNCorregido = ISBNIncorrecto:upper()&lt;br /&gt;
&lt;br /&gt;
--  Corregir guiones&lt;br /&gt;
	ISBNCorregido = ISBNCorregido:gsub(&amp;quot;%–&amp;quot;,&amp;quot;-&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
--  Eliminar ISBN del principio&lt;br /&gt;
    ISBNCorregido =ISBNCorregido:match(&amp;quot;ISBN (.*)&amp;quot;) or ISBNCorregido;&lt;br /&gt;
	&lt;br /&gt;
--  Eliminar separadores como &amp;quot;.&amp;quot; y &amp;quot;,&amp;quot; del final&lt;br /&gt;
	ISBNCorregido = ISBNCorregido:gsub(&amp;quot;[%.,]&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	if ModuloIdentificadores.esValidoISBN(ISBNCorregido) then &lt;br /&gt;
		return ISBNCorregido&lt;br /&gt;
	end	&lt;br /&gt;
&lt;br /&gt;
--  Ver si se trata de un ISBN de 13	&lt;br /&gt;
	local ISBNCorregidoSin978&lt;br /&gt;
	ISBNCorregidoSin978 = ISBNCorregido:match(&amp;quot;^978[%s-]*(.*)&amp;quot;)&lt;br /&gt;
	if ISBNCorregidoSin978 and ModuloIdentificadores.esValidoISBN(ISBNCorregidoSin978) then&lt;br /&gt;
--  	&amp;quot;978&amp;quot; + ISBN10&lt;br /&gt;
		return ISBNCorregidoSin978&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
--	ISBN de 13 al que se ha quitado 978	&lt;br /&gt;
	if ModuloIdentificadores.esValidoISBN(&#039;978&#039;..ISBNCorregido) then &lt;br /&gt;
		if ISBNCorregido:match(&#039;-&#039;) then &lt;br /&gt;
			return &#039;978-&#039; .. ISBNCorregido&lt;br /&gt;
		elseif ISBNCorregido:match(&#039; &#039;) then &lt;br /&gt;
			return &#039;978 &#039; .. ISBNCorregido&lt;br /&gt;
		else&lt;br /&gt;
			return &#039;978&#039; .. ISBNCorregido&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
--  13 ISBN o 13: ISBN&lt;br /&gt;
	local ISBNCorregidoSi13&lt;br /&gt;
	ISBNCorregidoSin13 = ISBNCorregido:match(&amp;quot;^13:?[%s]+(.*)&amp;quot;)&lt;br /&gt;
	if ISBNCorregidoSin13 and ModuloIdentificadores.esValidoISBN(ISBNCorregidoSin13) then &lt;br /&gt;
		return ISBNCorregidoSin13&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CorregirISBNs(ISBNIncorrecto1, ISBNIncorrecto2)&lt;br /&gt;
-- Tomar aquel de los dos ISBNs correctos si uno de ellos es un ISBN10 y el&lt;br /&gt;
-- otro el correspondiente ISBN13&lt;br /&gt;
&lt;br /&gt;
	local ISBN1Corregido = CorregirISBN(ISBNIncorrecto1)&lt;br /&gt;
	local ISBN2Corregido = CorregirISBN(ISBNIncorrecto2)&lt;br /&gt;
	&lt;br /&gt;
	if ISBN1Corregido and ISBN2Corregido then&lt;br /&gt;
--  	Ambos son correctos.&lt;br /&gt;
		if ISBN1Corregido == ISBN2Corregido then&lt;br /&gt;
--			Ambos son iguales (tras corregirse)&lt;br /&gt;
			return ISBN1Corregido&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
--		Ver si uno de ellos es un ISBN10 y el otro un ISBN13	&lt;br /&gt;
		local ISBNSinDigitoControl&lt;br /&gt;
		ISBNSinDigitoControl = ISBN1Corregido:match(&amp;quot;(.*).&amp;quot;)&lt;br /&gt;
		if ISBNSinDigitoControl and ISBN2Corregido:match(&amp;quot;978[%s-]*&amp;quot; .. ISBNSinDigitoControl) then&lt;br /&gt;
			return ISBN2Corregido&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		ISBNSinDigitoControl = ISBN2Corregido:match(&amp;quot;(.*).&amp;quot;)&lt;br /&gt;
		if ISBNSinDigitoControl and ISBN1Corregido:match(&amp;quot;978[%s-]*&amp;quot; .. ISBNSinDigitoControl) then&lt;br /&gt;
			return ISBN1Corregido&lt;br /&gt;
		end		&lt;br /&gt;
		&lt;br /&gt;
	elseif ISBN1Corregido then&lt;br /&gt;
		return ISBN1Corregido&lt;br /&gt;
	elseif ISBN2Corregido then&lt;br /&gt;
		return ISBN1Corregido&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function SugerirISBN(ISBNIncorrecto)&lt;br /&gt;
	local ISBNSugerido&lt;br /&gt;
&lt;br /&gt;
--  Ejemplos: &lt;br /&gt;
--      0 88254 165 x 					--&amp;gt; 0 88254 165 X&lt;br /&gt;
--      0-7153-5734-4.  				--&amp;gt; 0-7153-5734-4&lt;br /&gt;
--      0–313–31807–7 					--&amp;gt; 0-313-31807-7&lt;br /&gt;
--		ISBN(13): 9788495379092 &lt;br /&gt;
--  	978-0-7432-9302-0 y 0-7432-9302-0&lt;br /&gt;
--		9788430948949 8430948945 &lt;br /&gt;
--		8496702057 9788496702059&lt;br /&gt;
--		0198152213, 978019815221&lt;br /&gt;
--		13 978-0-511-41399-5 &lt;br /&gt;
--		13: 9788432238406&lt;br /&gt;
&lt;br /&gt;
--  ISBN con caracteres incorrectos.&lt;br /&gt;
	ISBNSugerido=CorregirISBN(ISBNIncorrecto)&lt;br /&gt;
	if ISBNSugerido then &lt;br /&gt;
		return ISBNSugerido&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
--  ISBN10, ISBN13 o ISBN13, ISBN10&lt;br /&gt;
	local ISBN1, ISBN2&lt;br /&gt;
	ISBN1, ISBN2 = ISBNIncorrecto:match(&amp;quot;(.*),%s*(.*)&amp;quot;)&lt;br /&gt;
	if is_set(ISBN1) and is_set(ISBN2) then&lt;br /&gt;
		ISBNSugerido = 	CorregirISBNs(ISBN1, ISBN2)&lt;br /&gt;
		&lt;br /&gt;
		if ISBNSugerido then&lt;br /&gt;
			return ISBNSugerido&lt;br /&gt;
		end &lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
--  ISBN10 y ISBN13 o ISBN13 y ISBN10&lt;br /&gt;
	ISBN1, ISBN2 = ISBNIncorrecto:match(&amp;quot;(.*)%s+y%s+(.*)&amp;quot;)&lt;br /&gt;
	if is_set(ISBN1) and is_set(ISBN2) then&lt;br /&gt;
		ISBNSugerido = 	CorregirISBNs(ISBN1, ISBN2)&lt;br /&gt;
		&lt;br /&gt;
		if ISBNSugerido then&lt;br /&gt;
			return ISBNSugerido&lt;br /&gt;
		end &lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
--  ISBN10 ISBN13 o ISBN13 ISBN10&lt;br /&gt;
	ISBN1, ISBN2 = ISBNIncorrecto:match(&amp;quot;(.*)%s+(.*)&amp;quot;)&lt;br /&gt;
	if is_set(ISBN1) and is_set(ISBN2) then&lt;br /&gt;
		ISBNSugerido = 	CorregirISBNs(ISBN1, ISBN2)&lt;br /&gt;
		&lt;br /&gt;
		if ISBNSugerido then&lt;br /&gt;
			return ISBNSugerido&lt;br /&gt;
		end &lt;br /&gt;
	end	&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
-- Chooses one matching parameter from a list of parameters to consider&lt;br /&gt;
-- Generates an error if more than one match is present.&lt;br /&gt;
function selectone( args, possible, error_condition, index )&lt;br /&gt;
    local value = nil;&lt;br /&gt;
    local selected = &#039;&#039;;&lt;br /&gt;
    local error_list = {};&lt;br /&gt;
    &lt;br /&gt;
    if index ~= nil then index = tostring(index); end&lt;br /&gt;
    &lt;br /&gt;
    -- Handle special case of &amp;quot;#&amp;quot; replaced by empty string&lt;br /&gt;
    if index == &#039;1&#039; then&lt;br /&gt;
        for _, v in ipairs( possible ) do&lt;br /&gt;
            v = v:gsub( &amp;quot;#&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;
            if is_set(args[v]) then&lt;br /&gt;
                if value ~= nil and selected ~= v then&lt;br /&gt;
                    table.insert( error_list, v );&lt;br /&gt;
                else&lt;br /&gt;
                    value = args[v];&lt;br /&gt;
                    selected = v;&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end        &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    for _, v in ipairs( possible ) do&lt;br /&gt;
        if index ~= nil then&lt;br /&gt;
            v = v:gsub( &amp;quot;#&amp;quot;, index );&lt;br /&gt;
        end&lt;br /&gt;
        if is_set(args[v]) then&lt;br /&gt;
            if value ~= nil and selected ~=  v then&lt;br /&gt;
                table.insert( error_list, v );&lt;br /&gt;
            else&lt;br /&gt;
                value = args[v];&lt;br /&gt;
                selected = v;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if #error_list &amp;gt; 0 then&lt;br /&gt;
        local error_str = &amp;quot;&amp;quot;;&lt;br /&gt;
        for _, k in ipairs( error_list ) do&lt;br /&gt;
            if error_str ~= &amp;quot;&amp;quot; then error_str = error_str .. cfg.messages[&#039;parameter-separator&#039;] end&lt;br /&gt;
            error_str = error_str .. wrap( &#039;parameter&#039;, k );&lt;br /&gt;
        end&lt;br /&gt;
        if #error_list &amp;gt; 1 then&lt;br /&gt;
            error_str = error_str .. cfg.messages[&#039;parameter-final-separator&#039;];&lt;br /&gt;
        else&lt;br /&gt;
            error_str = error_str .. cfg.messages[&#039;parameter-pair-separator&#039;];&lt;br /&gt;
        end&lt;br /&gt;
        error_str = error_str .. wrap( &#039;parameter&#039;, selected );&lt;br /&gt;
        table.insert( z.message_tail, { seterror( error_condition, {error_str}, true ) } );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return value, selected;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- COinS metadata (see &amp;lt;http://ocoins.info/&amp;gt;) allows automated tools to parse&lt;br /&gt;
-- the citation information.&lt;br /&gt;
function COinS(data)&lt;br /&gt;
    if &#039;table&#039; ~= type(data) or nil == next(data) then&lt;br /&gt;
        return &#039;&#039;;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local ctx_ver = &amp;quot;Z39.88-2004&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    -- treat table strictly as an array with only set values.&lt;br /&gt;
    local OCinSoutput = setmetatable( {}, {&lt;br /&gt;
        __newindex = function(self, key, value)&lt;br /&gt;
            if is_set(value) then&lt;br /&gt;
                rawset( self, #self+1, table.concat{ key, &#039;=&#039;, mw.uri.encode( removewikilink( value ) ) } );&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    });&lt;br /&gt;
    &lt;br /&gt;
    if is_set(data.Chapter) then&lt;br /&gt;
        OCinSoutput.rft_val_fmt = &amp;quot;info:ofi/fmt:kev:mtx:book&amp;quot;;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;bookitem&amp;quot;;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.btitle&amp;quot;] = data.Chapter;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.atitle&amp;quot;] = data.Title;&lt;br /&gt;
    elseif is_set(data.Periodical) then&lt;br /&gt;
        OCinSoutput.rft_val_fmt = &amp;quot;info:ofi/fmt:kev:mtx:journal&amp;quot;;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;article&amp;quot;;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.jtitle&amp;quot;] = data.Periodical;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.atitle&amp;quot;] = data.Title;&lt;br /&gt;
    else&lt;br /&gt;
        OCinSoutput.rft_val_fmt = &amp;quot;info:ofi/fmt:kev:mtx:book&amp;quot;;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;book&amp;quot;&lt;br /&gt;
        OCinSoutput[&amp;quot;rft.btitle&amp;quot;] = data.Title;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    OCinSoutput[&amp;quot;rft.place&amp;quot;] = data.PublicationPlace;&lt;br /&gt;
    OCinSoutput[&amp;quot;rft.date&amp;quot;] = data.Date;&lt;br /&gt;
    OCinSoutput[&amp;quot;rft.series&amp;quot;] = data.Series;&lt;br /&gt;
    OCinSoutput[&amp;quot;rft.volume&amp;quot;] = data.Volume;&lt;br /&gt;
    OCinSoutput[&amp;quot;rft.issue&amp;quot;] = data.Issue;&lt;br /&gt;
    OCinSoutput[&amp;quot;rft.pages&amp;quot;] = data.Pages;&lt;br /&gt;
    OCinSoutput[&amp;quot;rft.edition&amp;quot;] = data.Edition;&lt;br /&gt;
    OCinSoutput[&amp;quot;rft.pub&amp;quot;] = data.PublisherName;&lt;br /&gt;
    &lt;br /&gt;
    for k, v in pairs( data.ID_list ) do&lt;br /&gt;
        local id, value = cfg.id_handlers[k].COinS;&lt;br /&gt;
        if k == &#039;ISBN&#039; then value = cleanisbn( v ); else value = v; end&lt;br /&gt;
        if string.sub( id or &amp;quot;&amp;quot;, 1, 4 ) == &#039;info&#039; then&lt;br /&gt;
            OCinSoutput[&amp;quot;rft_id&amp;quot;] = table.concat{ id, &amp;quot;/&amp;quot;, v };&lt;br /&gt;
        else&lt;br /&gt;
            OCinSoutput[ id ] = value;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local last, first;&lt;br /&gt;
    for k, v in ipairs( data.Authors ) do&lt;br /&gt;
        last, first = v.last, v.first;&lt;br /&gt;
        if k == 1 then&lt;br /&gt;
            if is_set(last) then&lt;br /&gt;
                OCinSoutput[&amp;quot;rft.aulast&amp;quot;] = last;&lt;br /&gt;
            end&lt;br /&gt;
            if is_set(first) then &lt;br /&gt;
                OCinSoutput[&amp;quot;rft.aufirst&amp;quot;] = first;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if is_set(last) and is_set(first) then&lt;br /&gt;
            OCinSoutput[&amp;quot;rft.au&amp;quot;] = table.concat{ last, &amp;quot;, &amp;quot;, first };&lt;br /&gt;
        elseif is_set(last) then&lt;br /&gt;
            OCinSoutput[&amp;quot;rft.au&amp;quot;] = last;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    OCinSoutput.rft_id = data.URL;&lt;br /&gt;
    OCinSoutput.rfr_id = table.concat{ &amp;quot;info:sid/&amp;quot;, mw.site.server:match( &amp;quot;[^/]*$&amp;quot; ), &amp;quot;:&amp;quot;, data.RawPage };&lt;br /&gt;
    OCinSoutput = setmetatable( OCinSoutput, nil );&lt;br /&gt;
    &lt;br /&gt;
    -- sort with version string always first, and combine.&lt;br /&gt;
    table.sort( OCinSoutput );&lt;br /&gt;
    table.insert( OCinSoutput, 1, &amp;quot;ctx_ver=&amp;quot; .. ctx_ver );  -- such as &amp;quot;Z39.88-2004&amp;quot;&lt;br /&gt;
    return table.concat(OCinSoutput, &amp;quot;&amp;amp;&amp;quot;);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
This is the main function doing the majority of the citation&lt;br /&gt;
formatting.&lt;br /&gt;
]]&lt;br /&gt;
function citation0( config, args)&lt;br /&gt;
	local ModuloIdentificadores = require(&#039;Módulo:Identificadores&#039;)	&lt;br /&gt;
    --[[ &lt;br /&gt;
    Load Input Parameters&lt;br /&gt;
    The argment_wrapper facillitates the mapping of multiple&lt;br /&gt;
    aliases to single internal variable.&lt;br /&gt;
    ]]&lt;br /&gt;
    local A = argument_wrapper( args );&lt;br /&gt;
&lt;br /&gt;
    local i &lt;br /&gt;
    local PPrefix = A[&#039;PPrefix&#039;]&lt;br /&gt;
    local PPPrefix = A[&#039;PPPrefix&#039;]&lt;br /&gt;
    if is_set( A[&#039;NoPP&#039;] ) then PPPrefix = &amp;quot;&amp;quot; PPrefix = &amp;quot;&amp;quot; end&lt;br /&gt;
    &lt;br /&gt;
    -- Pick out the relevant fields from the arguments.  Different citation templates&lt;br /&gt;
    -- define different field names for the same underlying things.    &lt;br /&gt;
    local Authors = A[&#039;Authors&#039;];&lt;br /&gt;
    local a = extractnames( args, &#039;AuthorList&#039; );&lt;br /&gt;
&lt;br /&gt;
    local Coauthors = A[&#039;Coauthors&#039;];&lt;br /&gt;
    &lt;br /&gt;
    local Editors = A[&#039;Editors&#039;];&lt;br /&gt;
    local e = extractnames( args, &#039;EditorList&#039; );&lt;br /&gt;
&lt;br /&gt;
    local Year = A[&#039;Year&#039;];&lt;br /&gt;
    local wYear=Year;&lt;br /&gt;
    local PublicationDate = A[&#039;PublicationDate&#039;];&lt;br /&gt;
    local OrigYear = A[&#039;OrigYear&#039;];&lt;br /&gt;
    local Date = A[&#039;Date&#039;];&lt;br /&gt;
    local wfecha = Date;&lt;br /&gt;
    local LayDate = A[&#039;LayDate&#039;];&lt;br /&gt;
    ------------------------------------------------- Get title data&lt;br /&gt;
    local Title = A[&#039;Title&#039;];&lt;br /&gt;
    local BookTitle = A[&#039;BookTitle&#039;];&lt;br /&gt;
    local Conference = A[&#039;Conference&#039;];&lt;br /&gt;
    local TransTitle = A[&#039;TransTitle&#039;];&lt;br /&gt;
    local TitleNote = A[&#039;TitleNote&#039;];&lt;br /&gt;
    local TitleLink = A[&#039;TitleLink&#039;];&lt;br /&gt;
    local Chapter = A[&#039;Chapter&#039;];&lt;br /&gt;
    local ChapterLink = A[&#039;ChapterLink&#039;];&lt;br /&gt;
    local TransChapter = A[&#039;TransChapter&#039;];&lt;br /&gt;
    local TitleType = A[&#039;TitleType&#039;];&lt;br /&gt;
    local Degree = A[&#039;Degree&#039;];&lt;br /&gt;
    local Docket = A[&#039;Docket&#039;];&lt;br /&gt;
    local ArchiveURL = A[&#039;ArchiveURL&#039;];&lt;br /&gt;
    local URL = A[&#039;URL&#039;]&lt;br /&gt;
    local URLorigin = A:ORIGIN(&#039;URL&#039;);&lt;br /&gt;
    local ChapterURL = A[&#039;ChapterURL&#039;];&lt;br /&gt;
    local ChapterURLorigin = A:ORIGIN(&#039;ChapterURL&#039;);&lt;br /&gt;
    local ConferenceURL = A[&#039;ConferenceURL&#039;];&lt;br /&gt;
    local ConferenceURLorigin = A:ORIGIN(&#039;ConferenceURL&#039;);&lt;br /&gt;
    local SinURL     = false;&lt;br /&gt;
    local Periodical = A[&#039;Periodical&#039;];&lt;br /&gt;
&lt;br /&gt;
	local Series = A[&#039;Series&#039;];&lt;br /&gt;
    local Volume = A[&#039;Volume&#039;];&lt;br /&gt;
    local Issue = A[&#039;Issue&#039;];&lt;br /&gt;
    local Position = &#039;&#039;;&lt;br /&gt;
    local Page = A[&#039;Page&#039;];&lt;br /&gt;
    local Pages = dashtohyphen( A[&#039;Pages&#039;] );	&lt;br /&gt;
    local At = A[&#039;At&#039;];&lt;br /&gt;
    local Others = A[&#039;Others&#039;];&lt;br /&gt;
    local Edition = A[&#039;Edition&#039;];&lt;br /&gt;
    local PublicationPlace = A[&#039;PublicationPlace&#039;]&lt;br /&gt;
    local Place = A[&#039;Place&#039;];&lt;br /&gt;
    local Passage = A[&#039;Passage&#039;];&lt;br /&gt;
    local PassageURL = A[&#039;PassageURL&#039;];&lt;br /&gt;
    &lt;br /&gt;
    local PublisherName = A[&#039;PublisherName&#039;];&lt;br /&gt;
    local UrlAccess = A[&#039;UrlAccess&#039;];&lt;br /&gt;
    local RegistrationRequired = A[&#039;RegistrationRequired&#039;];&lt;br /&gt;
    local SubscriptionRequired = A[&#039;SubscriptionRequired&#039;];&lt;br /&gt;
    local Via = A[&#039;Via&#039;];&lt;br /&gt;
    local AccessDate = A[&#039;AccessDate&#039;];&lt;br /&gt;
    local MesAcceso  = A[&#039;MesAcceso&#039;]; -- Inexistente en la plantilla original&lt;br /&gt;
    local AnyoAcceso  = A[&#039;AñoAcceso&#039;]; -- Inexistente en la plantilla original&lt;br /&gt;
    local ArchiveDate = A[&#039;ArchiveDate&#039;];&lt;br /&gt;
    local Agency = A[&#039;Agency&#039;];&lt;br /&gt;
    local DeadURL = A[&#039;DeadURL&#039;]&lt;br /&gt;
    local Language = A[&#039;Language&#039;];&lt;br /&gt;
    local Format = A[&#039;Format&#039;];&lt;br /&gt;
    local Ref = A[&#039;Ref&#039;];&lt;br /&gt;
	local DoiBroken = A[&#039;DoiBroken&#039;];&lt;br /&gt;
	local ID = A[&#039;ID&#039;];&lt;br /&gt;
    local IgnoreISBN = A[&#039;IgnoreISBN&#039;];&lt;br /&gt;
    local Embargo = A[&#039;Embargo&#039;];&lt;br /&gt;
    local Texto1  = A[&#039;Texto1&#039;]&lt;br /&gt;
    local ID_list = extractids( args );&lt;br /&gt;
    local ISBNCorrecto = false;&lt;br /&gt;
    local ISBNSugerido;&lt;br /&gt;
&lt;br /&gt;
    if is_set (ID_list[&#039;ISBN&#039;]) and not is_set (IgnoreISBN)  then&lt;br /&gt;
    	if ModuloIdentificadores.esValidoISBN(ID_list[&#039;ISBN&#039;]) then &lt;br /&gt;
    		ISBNCorrecto= true&lt;br /&gt;
    	else&lt;br /&gt;
    		ISBNSugerido = SugerirISBN(ID_list[&#039;ISBN&#039;])&lt;br /&gt;
    		if ISBNSugerido then&lt;br /&gt;
    			ID_list[&#039;ISBN&#039;] = ISBNSugerido&lt;br /&gt;
    		end&lt;br /&gt;
    	end&lt;br /&gt;
    end&lt;br /&gt;
    local Lista_Identificadores_Formateados={} -- Lista de identificadores con enlaces y en su caso con  los errores&lt;br /&gt;
    &lt;br /&gt;
    local Quote = A[&#039;Quote&#039;];&lt;br /&gt;
    local TransQuote = A[&#039;TransQuote&#039;];&lt;br /&gt;
	local PostScript = A[&#039;PostScript&#039;];&lt;br /&gt;
&lt;br /&gt;
    local LayURL = A[&#039;LayURL&#039;];&lt;br /&gt;
    local LaySource = A[&#039;LaySource&#039;];&lt;br /&gt;
    local Transcript = A[&#039;Transcript&#039;];&lt;br /&gt;
    local TranscriptURL = A[&#039;TranscriptURL&#039;] &lt;br /&gt;
    local TranscriptURLorigin = A:ORIGIN(&#039;TranscriptURL&#039;);&lt;br /&gt;
    local sepc = A[&#039;Separator&#039;];&lt;br /&gt;
&lt;br /&gt;
    local LastAuthorAmp = A[&#039;LastAuthorAmp&#039;];&lt;br /&gt;
    local no_tracking_cats = A[&#039;NoTracking&#039;];&lt;br /&gt;
&lt;br /&gt;
--these are used by cite interview&lt;br /&gt;
	local Callsign = A[&#039;Callsign&#039;];&lt;br /&gt;
	local City = A[&#039;City&#039;];&lt;br /&gt;
	local Cointerviewers = A[&#039;Cointerviewers&#039;];			-- deprecated&lt;br /&gt;
	local Interviewer = A[&#039;Interviewer&#039;];				-- deprecated&lt;br /&gt;
	local Program = A[&#039;Program&#039;];&lt;br /&gt;
&lt;br /&gt;
--Parámetros que no se utilizan en la plantilla inglesa&lt;br /&gt;
	local SinEd = A[&#039;SinEd&#039;]&lt;br /&gt;
	local Extra = A[&#039;Extra&#039;]&lt;br /&gt;
	local Traductor   = A[&#039;Traductor&#039;]&lt;br /&gt;
	local Traductores = A[&#039;Traductores&#039;]&lt;br /&gt;
&lt;br /&gt;
--local variables that are not cs1 parameters&lt;br /&gt;
    local page_type;									-- is this needed?  Doesn&#039;t appear to be used anywhere;&lt;br /&gt;
    local use_lowercase&lt;br /&gt;
    local this_page = mw.title.getCurrentTitle();		--Also used for COinS and for language&lt;br /&gt;
--	local anchor_year;									-- used in the CITEREF identifier&lt;br /&gt;
	local COinS_date;									-- used in the COinS metadata&lt;br /&gt;
&lt;br /&gt;
--check this page to see if it is in one of the namespaces that cs1 is not supposed to add to the error categories.&lt;br /&gt;
	if not is_set(no_tracking_cats) then				-- ignore if we are already not going to categorize this page&lt;br /&gt;
		for k, v in pairs( cfg.uncategorized_namespaces ) do	-- otherwise, spin through the list of namespaces we don&#039;t include in error categories&lt;br /&gt;
			if this_page.nsText == v then				-- if we find one&lt;br /&gt;
				no_tracking_cats = &amp;quot;true&amp;quot;;				-- set no_trackin_cats&lt;br /&gt;
				break;									-- and we&#039;re done&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
-- check for extra |page=, |pages= or |at= parameters. &lt;br /&gt;
    if is_set(Page) then&lt;br /&gt;
--      La categoría de la plantilla inglesa es intraducible. Utilizo otro error similar.&lt;br /&gt;
&lt;br /&gt;
        --if is_set(Pages) or is_set(At) then&lt;br /&gt;
        --    Page = Page .. &amp;quot; &amp;quot; .. seterror(&#039;extra_pages&#039;);	-- add error message&lt;br /&gt;
        --    Pages = &#039;&#039;;										-- unset the others&lt;br /&gt;
        --    At = &#039;&#039;;&lt;br /&gt;
        --end&lt;br /&gt;
        if is_set(Pages) then&lt;br /&gt;
            Page = Page .. &amp;quot; &amp;quot; .. seterror(&#039;redundant_parameters&#039;, &#039;&amp;lt;code&amp;gt;&amp;amp;#124;página=&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;&amp;amp;#124;páginas=&amp;lt;/code&amp;gt;&#039;);&lt;br /&gt;
            Pages = &#039;&#039;;										-- unset the others&lt;br /&gt;
            At = &#039;&#039;;&lt;br /&gt;
        	Passage = &#039;&#039;;&lt;br /&gt;
        elseif is_set(At) then&lt;br /&gt;
            Page = Page .. &amp;quot; &amp;quot; .. seterror(&#039;redundant_parameters&#039;, &#039;&amp;lt;code&amp;gt;&amp;amp;#124;página=&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;&amp;amp;#124;en=&amp;lt;/code&amp;gt;&#039;);&lt;br /&gt;
            Pages = &#039;&#039;;										-- unset the others&lt;br /&gt;
            At = &#039;&#039;;&lt;br /&gt;
        	Passage = &#039;&#039;;&lt;br /&gt;
        elseif is_set(Passage) then&lt;br /&gt;
            Page = Page .. &amp;quot; &amp;quot; .. seterror(&#039;redundant_parameters&#039;, &#039;&amp;lt;code&amp;gt;&amp;amp;#124;página=&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;&amp;amp;#124;pasaje=&amp;lt;/code&amp;gt;&#039;);&lt;br /&gt;
            Pages = &#039;&#039;;										-- unset the others&lt;br /&gt;
            At = &#039;&#039;;&lt;br /&gt;
        	Passage = &#039;&#039;;&lt;br /&gt;
        end&lt;br /&gt;
    elseif is_set(Pages) then&lt;br /&gt;
        if is_set(At) then&lt;br /&gt;
            -- Pages = Pages .. &amp;quot; &amp;quot; .. seterror(&#039;extra_pages&#039;);	-- add error messages&lt;br /&gt;
            Pages = Pages .. &amp;quot; &amp;quot; .. seterror(&#039;redundant_parameters&#039;, &#039;&amp;lt;code&amp;gt;&amp;amp;#124;páginas=&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;&amp;amp;#124;en=&amp;lt;/code&amp;gt;&#039;);&lt;br /&gt;
            At = &#039;&#039;;&lt;br /&gt;
        	Passage = &#039;&#039;;&lt;br /&gt;
        elseif is_set(Passage) then&lt;br /&gt;
            Pages = Pages .. &amp;quot; &amp;quot; .. seterror(&#039;redundant_parameters&#039;, &#039;&amp;lt;code&amp;gt;&amp;amp;#124;páginas=&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;&amp;amp;#124;pasaje=&amp;lt;/code&amp;gt;&#039;);&lt;br /&gt;
            At = &#039;&#039;;&lt;br /&gt;
        	Passage = &#039;&#039;;&lt;br /&gt;
        end&lt;br /&gt;
    elseif is_set(At) then&lt;br /&gt;
    	if is_set(Passage) then&lt;br /&gt;
            At = At .. &amp;quot; &amp;quot; .. seterror(&#039;redundant_parameters&#039;, &#039;&amp;lt;code&amp;gt;&amp;amp;#124;en=&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;&amp;amp;#124;pasaje=&amp;lt;/code&amp;gt;&#039;);&lt;br /&gt;
        	Passage = &#039;&#039;;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
-- both |publication-place= and |place= (|location=) allowed if different&lt;br /&gt;
    if not is_set(PublicationPlace) and is_set(Place) then&lt;br /&gt;
        PublicationPlace = Place;							-- promote |place= (|location=) to |publication-place&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if PublicationPlace == Place then Place = &#039;&#039;; end		-- don&#039;t need both if they are the same&lt;br /&gt;
    &lt;br /&gt;
--[[&lt;br /&gt;
Parameter remapping for cite encyclopedia:&lt;br /&gt;
When the citation has these parameters:&lt;br /&gt;
	|encyclopedia and |title then map |title to |article and |encyclopedia to |title&lt;br /&gt;
	|encyclopedia and |article then map |encyclopedia to |title&lt;br /&gt;
	|encyclopedia then map |encyclopedia to |title&lt;br /&gt;
&lt;br /&gt;
	|trans_title maps to |trans_chapter when |title is re-mapped&lt;br /&gt;
&lt;br /&gt;
All other combinations of |encyclopedia, |title, and |article are not modified&lt;br /&gt;
]]&lt;br /&gt;
--	if ( config.ClaseCita == &amp;quot;encyclopaedia&amp;quot; ) then&lt;br /&gt;
	if ( config.ClaseCita == &amp;quot;enciclopedia&amp;quot; ) then		&lt;br /&gt;
		if is_set(Periodical) then					-- Periodical is set when |encyclopedia is set&lt;br /&gt;
			if is_set(Title) then&lt;br /&gt;
				if not is_set(Chapter) then&lt;br /&gt;
					Chapter = Title;				-- |encyclopedia and |title are set so map |title to |article and |encyclopedia to |title&lt;br /&gt;
					TransChapter = TransTitle;&lt;br /&gt;
					Title = Periodical;&lt;br /&gt;
					Periodical = &#039;&#039;;				-- redundant so unset&lt;br /&gt;
					TransTitle = &#039;&#039;;				-- redundant so unset&lt;br /&gt;
				end&lt;br /&gt;
			else									-- |title not set&lt;br /&gt;
				Title = Periodical;					-- |encyclopedia set and |article set or not set so map |encyclopedia to |title&lt;br /&gt;
				Periodical = &#039;&#039;;					-- redundant so unset&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
--special cases for classic book&lt;br /&gt;
	if config.ClaseCita == &#039;libro&#039; and is_set(Passage) then&lt;br /&gt;
		if is_set(PassageURL) then&lt;br /&gt;
			Passage = externallink( PassageURL, Passage )&lt;br /&gt;
		end&lt;br /&gt;
		if not is_set (sepc) then&lt;br /&gt;
			sepc = &#039; &#039;;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		Passage = &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
--special cases for citation.&lt;br /&gt;
	if (config.ClaseCita == &amp;quot;citation&amp;quot;) then		-- for citation templates&lt;br /&gt;
		if not is_set (sepc) then						-- if |separator= is not set&lt;br /&gt;
			sepc = &#039;,&#039;;									-- set citation separator to its default (comma)&lt;br /&gt;
		end&lt;br /&gt;
	else												-- not a citation template&lt;br /&gt;
		if not is_set (sepc) then						-- if |separator= has not been set&lt;br /&gt;
			sepc = &#039;.&#039;;									-- set cite xxx separator to its default (period)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not is_set (Ref) then						-- if |ref= is not set&lt;br /&gt;
		-- if inArray(config.ClaseCita, {&amp;quot;citation&amp;quot;, &amp;quot;libro&amp;quot;, &amp;quot;publicación&amp;quot;, &amp;quot;web&amp;quot;}) then		-- for citation templates&lt;br /&gt;
-- En la Wikipedia inglesa solo se usan citas Harvard para la clase citation	&lt;br /&gt;
-- Quedan habilitadas las citas Harvard para cualquier clase que contenga algún autor o editor&lt;br /&gt;
		if  #a &amp;gt; 0 or #e &amp;gt; 0 then&lt;br /&gt;
			Ref = &amp;quot;harv&amp;quot;;								-- set default |ref=harv&lt;br /&gt;
		end&lt;br /&gt;
	end	&lt;br /&gt;
&lt;br /&gt;
-- check for specital case where |separator=none&lt;br /&gt;
	if &#039;none&#039; == sepc:lower() then						-- if |separator=none&lt;br /&gt;
		sepc = &#039;&#039;;										-- then set it to a empty string&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	use_lowercase = ( sepc ~= &#039;.&#039; );&lt;br /&gt;
	&lt;br /&gt;
    Others = is_set(Others) and (sepc .. &amp;quot; &amp;quot; .. Others) or &amp;quot;&amp;quot;;	&lt;br /&gt;
&lt;br /&gt;
-- Special case for cite techreport.&lt;br /&gt;
	if (config.ClaseCita == &amp;quot;techreport&amp;quot;) then	-- special case for cite techreport&lt;br /&gt;
		if is_set(Issue) then						-- cite techreport uses &#039;number&#039;, which other citations aliase to &#039;issue&#039;&lt;br /&gt;
			if not is_set(ID) then					-- can we use ID for the &amp;quot;number&amp;quot;?&lt;br /&gt;
				ID = Issue;							-- yes, use it&lt;br /&gt;
				Issue = &amp;quot;&amp;quot;;							-- unset Issue so that &amp;quot;number&amp;quot; isn&#039;t duplicated in the rendered citation or COinS metadata&lt;br /&gt;
			else									-- can&#039;t use ID so emit error message&lt;br /&gt;
				ID = ID .. &amp;quot; &amp;quot; .. seterror(&#039;redundant_parameters&#039;, &#039;&amp;lt;code&amp;gt;&amp;amp;#124;id=&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;amp;#124;number=&amp;lt;/code&amp;gt;&#039;);&lt;br /&gt;
			end&lt;br /&gt;
		end	&lt;br /&gt;
-- special case for cite interview&lt;br /&gt;
	elseif (config.ClaseCita == &amp;quot;entrevista&amp;quot;) then&lt;br /&gt;
		if is_set(Program) then&lt;br /&gt;
			ID = &#039; &#039; .. Program;&lt;br /&gt;
		end&lt;br /&gt;
		if is_set(Callsign) then&lt;br /&gt;
			if is_set(ID) then&lt;br /&gt;
				ID = ID .. sepc .. &#039; &#039; .. Callsign;&lt;br /&gt;
			else&lt;br /&gt;
				ID = &#039; &#039; .. Callsign;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if is_set(City) then&lt;br /&gt;
			if is_set(ID) then&lt;br /&gt;
				ID = ID .. sepc .. &#039; &#039; .. City;&lt;br /&gt;
			else&lt;br /&gt;
				ID = &#039; &#039; .. City;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if is_set(Interviewer) then&lt;br /&gt;
			if is_set(TitleType) then&lt;br /&gt;
				Others = sepc .. &#039; &#039; .. TitleType .. &#039; con &#039; .. Interviewer  -- &#039; &#039; .. TitleType .. &#039; con &#039; .. Interviewer;&lt;br /&gt;
				TitleType = &#039;&#039;;&lt;br /&gt;
			else&lt;br /&gt;
				Others = sepc .. &#039; &#039; .. wrap(&#039;interview&#039;, Interviewer, use_lowercase) .. Others  -- &#039; &#039; .. &#039;Entrevista con &#039; .. Interviewer;&lt;br /&gt;
			end&lt;br /&gt;
			if is_set(Cointerviewers) then&lt;br /&gt;
				Others = Others .. sepc .. &#039; &#039; .. Cointerviewers;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			Others = Others .. sepc .. &#039; (Entrevista)&#039; --&#039;(Interview)&#039;;&lt;br /&gt;
		end&lt;br /&gt;
	elseif is_set(ID) then&lt;br /&gt;
	   ID = wrap( &#039;id&#039;, ID)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
--Account for the oddity that is {{cite journal}} with |pmc= set and |url= not set&lt;br /&gt;
--	if config.ClaseCita == &amp;quot;journal&amp;quot; and not is_set(URL) and is_set(ID_list[&#039;PMC&#039;]) then&lt;br /&gt;
	if config.ClaseCita == &amp;quot;publicación&amp;quot; and not is_set(URL) and is_set(ID_list[&#039;PMC&#039;]) then&lt;br /&gt;
		if not is_embargoed(Embargo) then&lt;br /&gt;
			URL=cfg.id_handlers[&#039;PMC&#039;].prefix .. ID_list[&#039;PMC&#039;];	-- set url to be the same as the PMC external link if not embargoed&lt;br /&gt;
			URLorigin = cfg.id_handlers[&#039;PMC&#039;].parameters[1];		-- set URLorigin to parameter name for use in error message if citation is missing a |title=&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    if is_set(Texto1) and Texto1:match(&amp;quot;%S+&amp;quot;) then&lt;br /&gt;
        -- Informar la URL con el valor del campo 1 en su caso    	&lt;br /&gt;
    	if config.ClaseCita == &amp;quot;web&amp;quot; and not is_set(URL) and checkurl(Texto1) then&lt;br /&gt;
       	    table.insert( z.message_tail, { seterror( &#039;url_sugerida&#039;, {Texto1, &#039;url&#039;}, true ) } )&lt;br /&gt;
    	    --URL    = Texto1   Utilizar URL como texto.&lt;br /&gt;
    	else&lt;br /&gt;
    		table.insert( z.message_tail, { seterror( &#039;text_ignored&#039;, {Texto1}, true ) } )&lt;br /&gt;
    	end&lt;br /&gt;
    end&lt;br /&gt;
	&lt;br /&gt;
-- Account for the oddity that is {{cite conference}}, before generation of COinS data.&lt;br /&gt;
--TODO: if this is only for {{cite conference}}, shouldn&#039;t we be checking? (if config.ClaseCita==&#039;conference&#039; then ...)&lt;br /&gt;
    &lt;br /&gt;
	if &#039;conferencia&#039; == config.ClaseCita then&lt;br /&gt;
		if is_set(BookTitle) then&lt;br /&gt;
			Chapter = Title;&lt;br /&gt;
--			ChapterLink = TitleLink;											-- |chapterlink= is deprecated&lt;br /&gt;
			ChapterURL = URL;&lt;br /&gt;
			ChapterUrlAccess = UrlAccess;&lt;br /&gt;
			ChapterURLorigin = URLorigin;&lt;br /&gt;
			URLorigin = &#039;&#039;;&lt;br /&gt;
			ChapterFormat = Format;&lt;br /&gt;
			TransChapter = TransTitle;&lt;br /&gt;
			Title = BookTitle;&lt;br /&gt;
			Format = &#039;&#039;;&lt;br /&gt;
--			TitleLink = &#039;&#039;;&lt;br /&gt;
			TransTitle = &#039;&#039;;&lt;br /&gt;
			URL = &#039;&#039;;&lt;br /&gt;
		end&lt;br /&gt;
	elseif &#039;speech&#039; ~= config.ClaseCita then&lt;br /&gt;
		Conference = &#039;&#039;;														-- not cite conference or cite speech so make sure this is empty string&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
-- Account for the oddity that is {{cite episode}}, before generation of COinS data.&lt;br /&gt;
--[[	-- {{cite episode}} is not currently supported by this module&lt;br /&gt;
	if config.ClaseCita == &amp;quot;episode&amp;quot; then&lt;br /&gt;
		local AirDate = A[&#039;AirDate&#039;];&lt;br /&gt;
		local SeriesLink = A[&#039;SeriesLink&#039;];&lt;br /&gt;
		local Season = A[&#039;Season&#039;];&lt;br /&gt;
		local SeriesNumber = A[&#039;SeriesNumber&#039;];&lt;br /&gt;
		local Network = A[&#039;Network&#039;];&lt;br /&gt;
		local Station = A[&#039;Station&#039;];&lt;br /&gt;
		local s, n = {}, {};&lt;br /&gt;
		local Sep = (first_set(A[&amp;quot;SeriesSeparator&amp;quot;], A[&amp;quot;Separator&amp;quot;]) or &amp;quot;&amp;quot;) .. &amp;quot; &amp;quot;;&lt;br /&gt;
		&lt;br /&gt;
		if is_set(Issue) then table.insert(s, cfg.messages[&amp;quot;episode&amp;quot;] .. &amp;quot; &amp;quot; .. Issue); Issue = &#039;&#039;; end&lt;br /&gt;
		if is_set(Season) then table.insert(s, cfg.messages[&amp;quot;season&amp;quot;] .. &amp;quot; &amp;quot; .. Season); end&lt;br /&gt;
		if is_set(SeriesNumber) then table.insert(s, cfg.messages[&amp;quot;series&amp;quot;] .. &amp;quot; &amp;quot; .. SeriesNumber); end&lt;br /&gt;
		if is_set(Network) then table.insert(n, Network); end&lt;br /&gt;
		if is_set(Station) then table.insert(n, Station); end&lt;br /&gt;
		&lt;br /&gt;
		Date = Date or AirDate;&lt;br /&gt;
		Chapter = Title;&lt;br /&gt;
		ChapterLink = TitleLink;&lt;br /&gt;
		TransChapter = TransTitle;&lt;br /&gt;
		Title = Series;&lt;br /&gt;
		TitleLink = SeriesLink;&lt;br /&gt;
		TransTitle = &#039;&#039;;&lt;br /&gt;
		&lt;br /&gt;
		Series = table.concat(s, Sep);&lt;br /&gt;
		ID = table.concat(n, Sep);&lt;br /&gt;
	end&lt;br /&gt;
-- end of {{cite episode}} stuff]]&lt;br /&gt;
&lt;br /&gt;
-- legacy: promote concatenation of |day=, |month=, and |year= to Date if Date not set; or, promote PublicationDate to Date if neither Date nor Year are set.&lt;br /&gt;
	if not is_set(Date) then&lt;br /&gt;
		Date = Year;						-- promote Year to Date&lt;br /&gt;
		Year = nil;							-- make nil so Year as empty string isn&#039;t used for CITEREF&lt;br /&gt;
		if is_set(Date) then&lt;br /&gt;
			local Month = A[&#039;Month&#039;];&lt;br /&gt;
			if is_set(Month) then&lt;br /&gt;
				Date = Month .. &amp;quot; de &amp;quot; .. Date; --Month .. &amp;quot; &amp;quot; .. Date;&lt;br /&gt;
				local Day = A[&#039;Day&#039;]&lt;br /&gt;
				if is_set(Day) then Date = Day .. &amp;quot; de &amp;quot; .. Date end --if is_set(Day) then Date = Day .. &amp;quot; &amp;quot; .. Date end&lt;br /&gt;
			end&lt;br /&gt;
		elseif is_set(PublicationDate) then	-- use PublicationDate when |date= and |year= are not set&lt;br /&gt;
			Date = PublicationDate;			-- promonte PublicationDate to Date&lt;br /&gt;
			PublicationDate = &#039;&#039;;			-- unset, no longer needed&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if PublicationDate == Date then PublicationDate = &#039;&#039;; end	-- if PublicationDate is same as Date, don&#039;t display in rendered citation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Go test all of the date-holding parameters for valid MOS:DATE format and make sure that dates are real dates. This must be done before we do COinS because here is where&lt;br /&gt;
we get the date used in the metadata.&lt;br /&gt;
&lt;br /&gt;
Date validation supporting code is in Módulo:Citas/ValidaciónFechas&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	anchor_year, COinS_date, error_message = dates({[&#039;accessdate&#039;]=AccessDate, [&#039;airdate&#039;]=AirDate, [&#039;archivedate&#039;]=ArchiveDate, [&#039;date&#039;]=Date, [&#039;doi_brokendate&#039;]=DoiBroken,&lt;br /&gt;
		[&#039;embargo&#039;]=Embargo, [&#039;laydate&#039;]=LayDate, [&#039;publicationdate&#039;]=PublicationDate, [&#039;year&#039;]=Year});&lt;br /&gt;
	if is_set(error_message) then&lt;br /&gt;
		table.insert( z.message_tail, { seterror( &#039;bad_date&#039;, {error_message}, true ) } );	-- add this error message&lt;br /&gt;
	end&lt;br /&gt;
]]&lt;br /&gt;
-- At this point fields may be nil if they weren&#039;t specified in the template use.  We can use that fact.&lt;br /&gt;
&lt;br /&gt;
    -- COinS metadata (see &amp;lt;http://ocoins.info/&amp;gt;) for&lt;br /&gt;
    -- automated parsing of citation information.&lt;br /&gt;
    local OCinSoutput = COinS{&lt;br /&gt;
        [&#039;Periodical&#039;] = Periodical,&lt;br /&gt;
        [&#039;Chapter&#039;] = Chapter,&lt;br /&gt;
        [&#039;Title&#039;] = Title,&lt;br /&gt;
        [&#039;PublicationPlace&#039;] = PublicationPlace,&lt;br /&gt;
        [&#039;Date&#039;] = first_set(COinS_date, Date),		-- COinS_date has correctly formatted date if Date is valid; any reason to keep Date here?  Should we be including invalid dates in metadata?&lt;br /&gt;
        [&#039;Series&#039;] = Series,&lt;br /&gt;
        [&#039;Volume&#039;] = Volume,&lt;br /&gt;
        [&#039;Issue&#039;] = Issue,&lt;br /&gt;
        [&#039;Pages&#039;] = get_coins_pages (first_set(Page, Pages, At)),	-- pages stripped of external links&lt;br /&gt;
        [&#039;Edition&#039;] = Edition,&lt;br /&gt;
        [&#039;PublisherName&#039;] = PublisherName,&lt;br /&gt;
        [&#039;URL&#039;] = first_set( URL, ChapterURL ),&lt;br /&gt;
        [&#039;Authors&#039;] = a,&lt;br /&gt;
        [&#039;ID_list&#039;] = ID_list,&lt;br /&gt;
        [&#039;RawPage&#039;] = this_page.prefixedText,&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    if is_set(Periodical) and not is_set(Chapter) and is_set(Title) then&lt;br /&gt;
        Chapter = Title;&lt;br /&gt;
        ChapterLink = TitleLink;&lt;br /&gt;
        TransChapter = TransTitle;&lt;br /&gt;
        Title = &#039;&#039;;&lt;br /&gt;
        TitleLink = &#039;&#039;;&lt;br /&gt;
        TransTitle = &#039;&#039;;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Now perform various field substitutions.&lt;br /&gt;
    -- We also add leading spaces and surrounding markup and punctuation to the&lt;br /&gt;
    -- various parts of the citation, but only when they are non-nil.&lt;br /&gt;
    if not is_set(Authors) then&lt;br /&gt;
        local Maximum = tonumber( A[&#039;DisplayAuthors&#039;] );&lt;br /&gt;
        &lt;br /&gt;
        -- Preserve old-style implicit et al.&lt;br /&gt;
        if not is_set(Maximum) and #a == 9 then &lt;br /&gt;
            Maximum = 8;&lt;br /&gt;
            table.insert( z.message_tail, { seterror(&#039;implict_etal_author&#039;, {}, true ) } );&lt;br /&gt;
        elseif not is_set(Maximum) then&lt;br /&gt;
            Maximum = #a + 1;&lt;br /&gt;
        end&lt;br /&gt;
            &lt;br /&gt;
        local control = { &lt;br /&gt;
            sep = A[&amp;quot;AuthorSeparator&amp;quot;] .. &amp;quot; &amp;quot;,&lt;br /&gt;
            namesep = (first_set(A[&amp;quot;AuthorNameSeparator&amp;quot;], A[&amp;quot;NameSeparator&amp;quot;]) or &amp;quot;&amp;quot;) .. &amp;quot; &amp;quot;,&lt;br /&gt;
            format = A[&amp;quot;AuthorFormat&amp;quot;],&lt;br /&gt;
            maximum = Maximum,&lt;br /&gt;
            lastauthoramp = LastAuthorAmp&lt;br /&gt;
        };&lt;br /&gt;
        &lt;br /&gt;
        -- If the coauthor field is also used, prevent ampersand and et al. formatting.&lt;br /&gt;
        if is_set(Coauthors) then&lt;br /&gt;
            control.lastauthoramp = nil;&lt;br /&gt;
            control.maximum = #a + 1;&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        Authors = listpeople(control, a) &lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	if not is_set(Authors) and is_set(Coauthors) then	-- coauthors aren&#039;t displayed if one of authors=, authorn=, or lastn= isn&#039;t specified&lt;br /&gt;
		table.insert( z.message_tail, { seterror(&#039;coauthors_missing_author&#039;, {}, true) } );	-- emit error message&lt;br /&gt;
		&lt;br /&gt;
		-- Utilizo temporalmente los coautores como autores.&lt;br /&gt;
		Authors = Coauthors&lt;br /&gt;
		Coauthors = nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    local EditorCount&lt;br /&gt;
    if not is_set(Editors) then&lt;br /&gt;
        local Maximum = tonumber( A[&#039;DisplayEditors&#039;] );&lt;br /&gt;
        -- Preserve old-style implicit et al.&lt;br /&gt;
        if not is_set(Maximum) and #e == 4 then &lt;br /&gt;
            Maximum = 3;&lt;br /&gt;
            table.insert( z.message_tail, { seterror(&#039;implict_etal_editor&#039;, {}, true) } );&lt;br /&gt;
        elseif not is_set(Maximum) then&lt;br /&gt;
            Maximum = #e + 1;&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        local control = { &lt;br /&gt;
            sep = A[&amp;quot;EditorSeparator&amp;quot;] .. &amp;quot; &amp;quot;,&lt;br /&gt;
            namesep = (first_set(A[&amp;quot;EditorNameSeparator&amp;quot;], A[&amp;quot;NameSeparator&amp;quot;]) or &amp;quot;&amp;quot;) .. &amp;quot; &amp;quot;,&lt;br /&gt;
            format = A[&#039;EditorFormat&#039;],&lt;br /&gt;
            maximum = Maximum,&lt;br /&gt;
            lastauthoramp = LastAuthorAmp&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        Editors, EditorCount = listpeople(control, e);&lt;br /&gt;
    else&lt;br /&gt;
        EditorCount = 1;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local Cartography = &amp;quot;&amp;quot;;&lt;br /&gt;
    local Scale = &amp;quot;&amp;quot;;&lt;br /&gt;
    if config.ClaseCita == &amp;quot;map&amp;quot; then&lt;br /&gt;
        if not is_set( Authors ) and is_set( PublisherName ) then&lt;br /&gt;
            Authors = PublisherName;&lt;br /&gt;
            PublisherName = &amp;quot;&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        Cartography = A[&#039;Cartography&#039;];&lt;br /&gt;
        if is_set( Cartography ) then&lt;br /&gt;
            Cartography = sepc .. &amp;quot; &amp;quot; .. wrap( &#039;cartography&#039;, Cartography, use_lowercase );&lt;br /&gt;
        end        &lt;br /&gt;
        Scale = A[&#039;Scale&#039;];&lt;br /&gt;
        if is_set( Scale ) then&lt;br /&gt;
            Scale = sepc .. &amp;quot; &amp;quot; .. Scale;&lt;br /&gt;
        end        &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if  not is_set(URL) and&lt;br /&gt;
        not is_set(ChapterURL) and&lt;br /&gt;
        not is_set(ArchiveURL) and&lt;br /&gt;
        not is_set(ConferenceURL) and&lt;br /&gt;
        not is_set(TranscriptURL) then&lt;br /&gt;
        &lt;br /&gt;
        sinURL = true&lt;br /&gt;
        &lt;br /&gt;
        -- Test if cite web or cite podcast |url= is missing or empty &lt;br /&gt;
		if inArray(config.ClaseCita, {&amp;quot;web&amp;quot;,&amp;quot;podcast&amp;quot;}) then	&lt;br /&gt;
			table.insert( z.message_tail, { seterror( &#039;cite_web_url&#039;, {}, true ) } );&lt;br /&gt;
		end&lt;br /&gt;
        &lt;br /&gt;
        -- Test if format is given without giving a URL&lt;br /&gt;
        if is_set(Format) then&lt;br /&gt;
            Format = Format .. seterror( &#039;format_missing_url&#039; );&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Test if citation has no title&lt;br /&gt;
    if  not is_set(Chapter) and&lt;br /&gt;
        not is_set(Title) and&lt;br /&gt;
        not is_set(Periodical) and&lt;br /&gt;
        not is_set(Conference) and&lt;br /&gt;
        not is_set(TransTitle) and&lt;br /&gt;
        not is_set(TransChapter) and&lt;br /&gt;
        not is_set(Passage) then&lt;br /&gt;
        table.insert( z.message_tail, { seterror( &#039;citation_missing_title&#039;, {}, true ) } );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    Format = is_set(Format) and &amp;quot; &amp;quot; .. wrap( &#039;format&#039;, Format ) or &amp;quot;&amp;quot;; --is_set(Format) and &amp;quot; (&amp;quot; .. Format .. &amp;quot;)&amp;quot; or &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    local OriginalURL = URL&lt;br /&gt;
    DeadURL = DeadURL:lower();&lt;br /&gt;
    if is_set( ArchiveURL ) then&lt;br /&gt;
        if ( DeadURL ~= &amp;quot;no&amp;quot; ) then&lt;br /&gt;
            URL = ArchiveURL&lt;br /&gt;
            URLorigin = A:ORIGIN(&#039;ArchiveURL&#039;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Format chapter / article title&lt;br /&gt;
    if is_set(Chapter) and is_set(ChapterLink) then &lt;br /&gt;
        Chapter = &amp;quot;[[&amp;quot; .. ChapterLink .. &amp;quot;|&amp;quot; .. Chapter .. &amp;quot;]]&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if is_set(Periodical) and is_set(Title) then&lt;br /&gt;
        Chapter = wrap( &#039;italic-title&#039;, Chapter );&lt;br /&gt;
        TransChapter = wrap( &#039;trans-italic-title&#039;, TransChapter );&lt;br /&gt;
    else&lt;br /&gt;
		Chapter = kern_quotes (Chapter);				-- if necessary, separate chapter title&#039;s leading and trailing quote marks from Module provided quote marks&lt;br /&gt;
        Chapter = wrap( &#039;quoted-title&#039;, Chapter );&lt;br /&gt;
        TransChapter = wrap( &#039;trans-quoted-title&#039;, TransChapter );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local TransError = &amp;quot;&amp;quot;&lt;br /&gt;
    if is_set(TransChapter) then&lt;br /&gt;
        if not is_set(Chapter) then&lt;br /&gt;
            TransError = &amp;quot; &amp;quot; .. seterror( &#039;trans_missing_chapter&#039; );&lt;br /&gt;
        else&lt;br /&gt;
            TransChapter = &amp;quot; &amp;quot; .. TransChapter;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    Chapter = Chapter .. TransChapter;&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Chapter) then&lt;br /&gt;
        if not is_set(ChapterLink) then&lt;br /&gt;
            if is_set(ChapterURL) then&lt;br /&gt;
                Chapter = externallink( ChapterURL, Chapter ) .. TransError;&lt;br /&gt;
                if not is_set(URL) then&lt;br /&gt;
                    Chapter = Chapter .. Format;&lt;br /&gt;
                    Format = &amp;quot;&amp;quot;;&lt;br /&gt;
                end&lt;br /&gt;
            elseif is_set(URL) then &lt;br /&gt;
                Chapter = externallink( URL, Chapter ) .. TransError .. Format;&lt;br /&gt;
                URL = &amp;quot;&amp;quot;;&lt;br /&gt;
                Format = &amp;quot;&amp;quot;;&lt;br /&gt;
            else&lt;br /&gt;
                Chapter = Chapter .. TransError;&lt;br /&gt;
            end            &lt;br /&gt;
        elseif is_set(ChapterURL) then&lt;br /&gt;
            Chapter = Chapter .. &amp;quot; &amp;quot; .. externallink( ChapterURL, nil, ChapterURLorigin ) .. &lt;br /&gt;
                TransError;&lt;br /&gt;
        else&lt;br /&gt;
            Chapter = Chapter .. TransError;&lt;br /&gt;
        end&lt;br /&gt;
        Chapter = Chapter .. sepc .. &amp;quot; &amp;quot; -- with end-space&lt;br /&gt;
    elseif is_set(ChapterURL) then&lt;br /&gt;
        Chapter = &amp;quot; &amp;quot; .. externallink( ChapterURL, nil, ChapterURLorigin ) .. sepc .. &amp;quot; &amp;quot;;&lt;br /&gt;
    end        &lt;br /&gt;
    &lt;br /&gt;
    -- Format main title.&lt;br /&gt;
    if is_set(TitleLink) and is_set(Title) then&lt;br /&gt;
        Title = &amp;quot;[[&amp;quot; .. TitleLink .. &amp;quot;|&amp;quot; .. Title .. &amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Traductor) and is_set(Traductores) then&lt;br /&gt;
    	Traductor = &amp;quot; &amp;quot; .. wrap( &#039;traductores&#039;, Traductores) .. &amp;quot; &amp;quot; .. seterror(&#039;redundant_parameters&#039;, &#039;&amp;lt;code&amp;gt;&amp;amp;#124;traductor=&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;&amp;amp;#124;traductores=&amp;lt;/code&amp;gt;&#039;)&lt;br /&gt;
    elseif is_set(Traductor) then&lt;br /&gt;
    	Traductor = &amp;quot; &amp;quot; .. wrap( &#039;traductor&#039;, Traductor)&lt;br /&gt;
    elseif is_set(Traductores) then&lt;br /&gt;
    	Traductor = &amp;quot; &amp;quot; .. wrap( &#039;traductores&#039;, Traductores)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    Traductores = &#039;&#039;&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Periodical) then&lt;br /&gt;
		Title = kern_quotes (Title);				-- if necessary, separate title&#039;s leading and trailing quote marks from Module provided quote marks&lt;br /&gt;
        Title = wrap( &#039;quoted-title&#039;, Title );&lt;br /&gt;
        TransTitle = wrap( &#039;trans-quoted-title&#039;, TransTitle );&lt;br /&gt;
--  elseif inArray(config.ClaseCita, {&amp;quot;web&amp;quot;,&amp;quot;news&amp;quot;,&amp;quot;pressrelease&amp;quot;,&amp;quot;conference&amp;quot;,&amp;quot;podcast&amp;quot;}) and&lt;br /&gt;
    elseif inArray(config.ClaseCita, {&amp;quot;web&amp;quot;,&amp;quot;noticia&amp;quot;,&amp;quot;pressrelease&amp;quot;,&amp;quot;conference&amp;quot;,&amp;quot;podcast&amp;quot;}) and    	&lt;br /&gt;
            not is_set(Chapter) then&lt;br /&gt;
		Title = kern_quotes (Title);				-- if necessary, separate title&#039;s leading and trailing quote marks from Module provided quote marks&lt;br /&gt;
        Title = wrap( &#039;quoted-title&#039;, Title );&lt;br /&gt;
        TransTitle = wrap( &#039;trans-quoted-title&#039;, TransTitle );&lt;br /&gt;
    else&lt;br /&gt;
        Title = wrap( &#039;italic-title&#039;, Title );&lt;br /&gt;
        TransTitle = wrap( &#039;trans-italic-title&#039;, TransTitle );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    TransError = &amp;quot;&amp;quot;;&lt;br /&gt;
    if is_set(TransTitle) then&lt;br /&gt;
        if not is_set(Title) then&lt;br /&gt;
            TransError = &amp;quot; &amp;quot; .. seterror( &#039;trans_missing_title&#039; );&lt;br /&gt;
        else&lt;br /&gt;
            TransTitle = &amp;quot; &amp;quot; .. TransTitle;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    Title = Title .. Traductor .. TransTitle;&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Title) then&lt;br /&gt;
        if not is_set(TitleLink) and is_set(URL) then &lt;br /&gt;
            Title = externallink( URL, Title, URL_origin, UrlAccess ) .. TransError .. Format       &lt;br /&gt;
            URL = &amp;quot;&amp;quot;;&lt;br /&gt;
            TieneURL = true;&lt;br /&gt;
            Format = &amp;quot;&amp;quot;;&lt;br /&gt;
        else&lt;br /&gt;
            Title = Title .. TransError;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Place) then&lt;br /&gt;
        Place = &amp;quot; &amp;quot; .. wrap( &#039;written&#039;, Place, use_lowercase ) .. sepc .. &amp;quot; &amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Conference) then&lt;br /&gt;
        if is_set(ConferenceURL) then&lt;br /&gt;
            Conference = externallink( ConferenceURL, Conference );&lt;br /&gt;
        end&lt;br /&gt;
        Conference = sepc .. &amp;quot; &amp;quot; .. Conference&lt;br /&gt;
    elseif is_set(ConferenceURL) then&lt;br /&gt;
        Conference = sepc .. &amp;quot; &amp;quot; .. externallink( ConferenceURL, nil, ConferenceURLorigin );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not is_set(Position) then&lt;br /&gt;
        local Minutes = A[&#039;Minutes&#039;];&lt;br /&gt;
        if is_set(Minutes) then&lt;br /&gt;
            Position = &amp;quot; &amp;quot; .. Minutes .. &amp;quot; &amp;quot; .. cfg.messages[&#039;minutes&#039;];&lt;br /&gt;
        else&lt;br /&gt;
            local Time = A[&#039;Time&#039;];&lt;br /&gt;
            if is_set(Time) then&lt;br /&gt;
                local TimeCaption = A[&#039;TimeCaption&#039;]&lt;br /&gt;
                if not is_set(TimeCaption) then&lt;br /&gt;
                    TimeCaption = cfg.messages[&#039;event&#039;];&lt;br /&gt;
                    if sepc ~= &#039;.&#039; then&lt;br /&gt;
                        TimeCaption = TimeCaption:lower();&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                Position = &amp;quot; &amp;quot; .. TimeCaption .. &amp;quot; &amp;quot; .. Time;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        Position = &amp;quot; &amp;quot; .. Position;&lt;br /&gt;
        At = &#039;&#039;;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not is_set(Page) then&lt;br /&gt;
        if is_set(Pages) then&lt;br /&gt;
            if is_set(Periodical) and&lt;br /&gt;
--              not inArray(config.ClaseCita, {&amp;quot;encyclopaedia&amp;quot;,&amp;quot;web&amp;quot;,&amp;quot;book&amp;quot;,&amp;quot;news&amp;quot;,&amp;quot;podcast&amp;quot;}) then&lt;br /&gt;
                not inArray(config.ClaseCita, {&amp;quot;enciclopedia&amp;quot;,&amp;quot;web&amp;quot;,&amp;quot;libro&amp;quot;,&amp;quot;noticia&amp;quot;,&amp;quot;podcast&amp;quot;}) then&lt;br /&gt;
                Pages = &amp;quot;: &amp;quot; .. Pages;&lt;br /&gt;
            elseif tonumber(Pages) ~= nil then&lt;br /&gt;
                Pages = sepc ..&amp;quot; &amp;quot; .. PPrefix .. Pages;&lt;br /&gt;
            else&lt;br /&gt;
                Pages = sepc ..&amp;quot; &amp;quot; .. PPPrefix .. Pages;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        if is_set(Periodical) and&lt;br /&gt;
--          not inArray(config.ClaseCita, {&amp;quot;encyclopaedia&amp;quot;,&amp;quot;web&amp;quot;,&amp;quot;book&amp;quot;,&amp;quot;news&amp;quot;,&amp;quot;podcast&amp;quot;}) then&lt;br /&gt;
            not inArray(config.ClaseCita, {&amp;quot;enciclopedia&amp;quot;,&amp;quot;web&amp;quot;,&amp;quot;libro&amp;quot;,&amp;quot;noticia&amp;quot;,&amp;quot;podcast&amp;quot;}) then            	&lt;br /&gt;
            Page = &amp;quot;: &amp;quot; .. Page;&lt;br /&gt;
        else&lt;br /&gt;
            Page = sepc ..&amp;quot; &amp;quot; .. PPrefix .. Page;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    At = is_set(At) and (sepc .. &amp;quot; &amp;quot; .. At) or &amp;quot;&amp;quot;;&lt;br /&gt;
    Passage = is_set(Passage) and (sepc .. &amp;quot; &amp;quot; .. Passage) or &amp;quot;&amp;quot;;&lt;br /&gt;
    Position = is_set(Position) and (sepc .. &amp;quot; &amp;quot; .. Position) or &amp;quot;&amp;quot;;&lt;br /&gt;
    if config.ClaseCita == &#039;map&#039; then&lt;br /&gt;
        local Section = A[&#039;Section&#039;];&lt;br /&gt;
        local Inset = A[&#039;Inset&#039;];&lt;br /&gt;
        if first_set( Pages, Page, At ) ~= nil or sepc ~= &#039;.&#039; then&lt;br /&gt;
            if is_set( Section ) then&lt;br /&gt;
                Section = &amp;quot;, &amp;quot; .. wrap( &#039;section&#039;, Section, true );&lt;br /&gt;
            end&lt;br /&gt;
            if is_set( Inset ) then&lt;br /&gt;
                Inset = &amp;quot;, &amp;quot; .. wrap( &#039;inset&#039;, Inset, true );&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            if is_set( Section ) then&lt;br /&gt;
                Section = sepc .. &amp;quot; &amp;quot; .. wrap( &#039;section&#039;, Section, use_lowercase );&lt;br /&gt;
                if is_set( Inset ) then&lt;br /&gt;
                    Inset = &amp;quot;, &amp;quot; .. wrap( &#039;inset&#039;, Inset, true );&lt;br /&gt;
                end&lt;br /&gt;
            elseif is_set( Inset ) then&lt;br /&gt;
                Inset = sepc .. &amp;quot; &amp;quot; .. wrap( &#039;inset&#039;, Inset, use_lowercase );&lt;br /&gt;
            end            &lt;br /&gt;
        end            &lt;br /&gt;
        At = At .. Section .. Inset;        &lt;br /&gt;
    end    &lt;br /&gt;
&lt;br /&gt;
	--[[Look in the list of iso639-1 language codes to see if the value provided in the language parameter matches one of them.  If a match is found, &lt;br /&gt;
	use that value; if not, then use the value that was provided with the language parameter.&lt;br /&gt;
	&lt;br /&gt;
	Categories are assigned in a manner similar to the {{xx icon}} templates - categorizes only mainspace citations and only when the language code is not &#039;en&#039; (English).&lt;br /&gt;
	]]&lt;br /&gt;
	&lt;br /&gt;
	if is_set (Language) then&lt;br /&gt;
		-- Poner en minúsculas el primer caracter del idioma si está en mayúsculas&lt;br /&gt;
		Language = Language:gsub(&amp;quot;^%u&amp;quot;, string.lower)&lt;br /&gt;
&lt;br /&gt;
		if Language == &#039;español&#039; or Language == &#039;castellano&#039; or Language == &#039;es&#039; or Language:match(&#039;^es%-.*&#039;) then&lt;br /&gt;
			Language=&amp;quot;&amp;quot;;	-- No mostrar el idioma español&lt;br /&gt;
		else&lt;br /&gt;
			local name = mw.language.fetchLanguageName( Language:lower(), &amp;quot;es&amp;quot; );	-- experiment: this seems to return correct ISO 639-1 language names&lt;br /&gt;
		&lt;br /&gt;
			if is_set (name) then&lt;br /&gt;
				Language=&amp;quot; &amp;quot; .. wrap( &#039;language&#039;, name );&lt;br /&gt;
			else&lt;br /&gt;
				Language=&amp;quot; &amp;quot; .. wrap( &#039;language&#039;, Language );	-- no match, use parameter&#039;s value&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	else&lt;br /&gt;
		Language=&amp;quot;&amp;quot;;	-- Asegurarnos de que el idioma no es nulo.&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
-- handle type parameter for those CS1 citations that have default values&lt;br /&gt;
&lt;br /&gt;
--	if inArray(config.ClaseCita, {&amp;quot;AV media notes&amp;quot;, &amp;quot;DVD notes&amp;quot;, &amp;quot;podcast&amp;quot;, &amp;quot;pressrelease&amp;quot;, &amp;quot;techreport&amp;quot;, &amp;quot;thesis&amp;quot;}) then&lt;br /&gt;
	if inArray(config.ClaseCita, {&amp;quot;notas audiovisual&amp;quot;, &amp;quot;notas de DVD&amp;quot;, &amp;quot;podcast&amp;quot;, &amp;quot;pressrelease&amp;quot;, &amp;quot;techreport&amp;quot;, &amp;quot;tesis&amp;quot;}) then		&lt;br /&gt;
		TitleType = set_titletype (config.ClaseCita, TitleType);&lt;br /&gt;
		if is_set(Degree) and &amp;quot;Tesis&amp;quot; == TitleType then	-- special case for cite thesis&lt;br /&gt;
			TitleType = &amp;quot;Tesis de &amp;quot; .. Degree;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if is_set(TitleType) then					-- if type parameter is specified&lt;br /&gt;
		TitleType = &amp;quot; (&amp;quot; .. TitleType .. &amp;quot;)&amp;quot;;	-- display it in parentheses&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	TitleNote = is_set(TitleNote) and (sepc .. &amp;quot; &amp;quot; .. TitleNote) or &amp;quot;&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	if is_set(Edition) then&lt;br /&gt;
		if is_set(SinEd) then -- No existe el parámetro en el módulo de la wikipedia inglesa.&lt;br /&gt;
			Edition = &amp;quot; &amp;quot; .. wrap( &#039;sin edición&#039;, Edition ) -- No existe el parámetro en el módulo de la wikipedia inglesa.&lt;br /&gt;
		else&lt;br /&gt;
			Edition = &amp;quot; &amp;quot; .. wrap( &#039;edition&#039;, Edition )&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		Edition = &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
    Issue = is_set(Issue) and (&amp;quot; (&amp;quot; .. Issue .. &amp;quot;)&amp;quot;) or &amp;quot;&amp;quot;;&lt;br /&gt;
    Series = is_set(Series) and (sepc .. &amp;quot; &amp;quot; .. Series) or &amp;quot;&amp;quot;;&lt;br /&gt;
    OrigYear = is_set(OrigYear) and (&amp;quot; [&amp;amp;#8203;&amp;quot; .. OrigYear .. &amp;quot;&amp;amp;#8203;]&amp;quot;) or &amp;quot;&amp;quot;; -- zero-width space, para no generar enlaces&lt;br /&gt;
    Agency = is_set(Agency) and (sepc .. &amp;quot; &amp;quot; .. Agency) or &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if is_set(Volume) then&lt;br /&gt;
        if Volume:match (&#039;^%d+$&#039;) or Volume:match (&#039;^[MDCLXVI]+$&#039;) -- negrita solamente si el capítulo está reflejado como cifra decimal o números romanos&lt;br /&gt;
          then Volume = &amp;quot; &amp;lt;b&amp;gt;&amp;quot; .. dashtohyphen(Volume) .. &amp;quot;&amp;lt;/b&amp;gt;&amp;quot;;&lt;br /&gt;
          else Volume = sepc ..&amp;quot; &amp;quot; .. Volume;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
--[[ This code commented out while discussion continues until after week of 2014-03-23 live module update;&lt;br /&gt;
    if is_set(Volume) then&lt;br /&gt;
        if ( mw.ustring.len(Volume) &amp;gt; 4 )&lt;br /&gt;
          then Volume = sepc .. &amp;quot; &amp;quot; .. Volume;&lt;br /&gt;
          else&lt;br /&gt;
              Volume = &amp;quot; &amp;lt;b&amp;gt;&amp;quot; .. hyphentodash(Volume) .. &amp;quot;&amp;lt;/b&amp;gt;&amp;quot;;&lt;br /&gt;
              if is_set(Series) then Volume = sepc .. Volume;&lt;br /&gt;
              end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
]]    &lt;br /&gt;
    ------------------------------------ totally unrelated data&lt;br /&gt;
    --[[ Loosely mimic {{subscription required}} template; Via parameter identifies a delivery source that is not the publisher; these sources often, but not always, exist&lt;br /&gt;
    behind a registration or paywall.  So here, we&#039;ve chosen to decouple via from subscription (via has never been part of the registration required template).&lt;br /&gt;
    &lt;br /&gt;
    Subscription implies paywall; Registration does not.  If both are used in a citation, the subscription required link note is displayed. There are no error messages for this condition.&lt;br /&gt;
    ]]&lt;br /&gt;
    if is_set(Via) then&lt;br /&gt;
        Via = &amp;quot; &amp;quot; .. wrap( &#039;via&#039;, Via );&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	if UrlAccess == &#039;registration&#039; then&lt;br /&gt;
		RegistrationRequired = true&lt;br /&gt;
	end&lt;br /&gt;
	if is_set(SubscriptionRequired) then&lt;br /&gt;
        SubscriptionRequired = sepc .. &amp;quot; &amp;quot; .. cfg.messages[&#039;subscription&#039;]; --here when &#039;via&#039; parameter not used but &#039;subscription&#039; is&lt;br /&gt;
    elseif is_set(RegistrationRequired) then&lt;br /&gt;
        SubscriptionRequired = sepc .. &amp;quot; &amp;quot; .. cfg.messages[&#039;registration&#039;]; --here when &#039;via&#039; and &#039;subscription&#039; parameters not used but &#039;registration&#039; is&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
--  if is_set(AccessDate) then&lt;br /&gt;
    if is_set(AccessDate)  or is_set(AnyoAcceso) then&lt;br /&gt;
        -- Test if accessdate is given without giving a URL&lt;br /&gt;
        if  sinURL then&lt;br /&gt;
            table.insert( z.message_tail, { seterror( &#039;accessdate_missing_url&#039;, {}, true ) } );&lt;br /&gt;
           	AccessDate = &#039;&#039;;&lt;br /&gt;
        else&lt;br /&gt;
        	if is_set(AccessDate) then&lt;br /&gt;
				if is_set(MesAcceso) and is_set(AnyoAcceso) then&lt;br /&gt;
					AccessDate = AccessDate .. seterror(&#039;redundant_parameters&#039;, &#039;&amp;lt;code&amp;gt;&amp;amp;#124;fechaacceso=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;#124;añoacceso=&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;&amp;amp;#124;mesacceso=&amp;lt;/code&amp;gt;&#039;)&lt;br /&gt;
				elseif is_set(MesAcceso) then&lt;br /&gt;
					AccessDate = AccessDate .. seterror(&#039;redundant_parameters&#039;, &#039;&amp;lt;code&amp;gt;&amp;amp;#124;fechaacceso=&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;&amp;amp;#124;mesacceso=&amp;lt;/code&amp;gt;&#039;)&lt;br /&gt;
				elseif is_set(AnyoAcceso) then&lt;br /&gt;
					if string.find(AccessDate, &#039;%sde%s&#039;) then&lt;br /&gt;
						AccessDate = AccessDate .. &#039; de &#039; .. AnyoAcceso&lt;br /&gt;
				    else&lt;br /&gt;
						AccessDate = AccessDate .. seterror(&#039;redundant_parameters&#039;, &#039;&amp;lt;code&amp;gt;&amp;amp;#124;fechaacceso=&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;&amp;amp;#124;Añoacceso=&amp;lt;/code&amp;gt;&#039;);&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
        	elseif is_set(MesAcceso) then &lt;br /&gt;
        		AccessDate = MesAcceso .. &#039; de &#039; .. AnyoAcceso&lt;br /&gt;
        	else &lt;br /&gt;
        		AccessDate = AnyoAcceso&lt;br /&gt;
        	end&lt;br /&gt;
            local retrv_text = &amp;quot; &amp;quot; .. cfg.messages[&#039;retrieved&#039;]&lt;br /&gt;
            if (sepc ~= &amp;quot;.&amp;quot;) then retrv_text = retrv_text:lower() end&lt;br /&gt;
            AccessDate = &#039;&amp;lt;span class=&amp;quot;reference-accessdate&amp;quot;&amp;gt;&#039; .. sepc&lt;br /&gt;
              .. substitute( retrv_text, {format_date(AccessDate)} ) .. &#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
        end &lt;br /&gt;
    elseif is_set(MesAcceso) then &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if is_set(ID) then ID = sepc ..&amp;quot; &amp;quot;.. ID; end&lt;br /&gt;
   	if &amp;quot;tesis&amp;quot; == config.ClaseCita and is_set(Docket) then&lt;br /&gt;
		ID = sepc ..&amp;quot; Docket &amp;quot;.. Docket .. ID;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
   Lista_Identificadores_Formateados = buildidlist( ID_list, {DoiBroken = DoiBroken, IgnoreISBN = IgnoreISBN, Embargo=Embargo, ISBNCorrecto = ISBNCorrecto, ISBNSugerido = ISBNSugerido} );&lt;br /&gt;
	&lt;br /&gt;
    if is_set(URL) then&lt;br /&gt;
        URL = &amp;quot; &amp;quot; .. externallink( URL, nil, URLorigin, UrlAccess );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
-- Set postscript default.&lt;br /&gt;
	if not is_set (PostScript) then						-- if |postscript= has not been set (Postscript is nil which is the default for {{citation}}) and&lt;br /&gt;
		if (config.ClaseCita ~= &amp;quot;citation&amp;quot;) then	-- this template is not a citation template&lt;br /&gt;
			PostScript = &#039;.&#039;;							-- must be a cite xxx template so set postscript to default (period)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if PostScript:lower() == &#039;none&#039; then			-- if |postscript=none then&lt;br /&gt;
			PostScript = &#039;&#039;;							-- no postscript&lt;br /&gt;
		end&lt;br /&gt;
	end    &lt;br /&gt;
&lt;br /&gt;
    if is_set(Quote) or is_set(TransQuote) then&lt;br /&gt;
    	-- Eliminar comillas de Quote&lt;br /&gt;
        if (Quote:sub(1,1) == &#039;&amp;quot;&#039; and Quote:sub(-1,-1) == &#039;&amp;quot;&#039;) or&lt;br /&gt;
           (Quote:sub(1,1) == &#039;«&#039; and Quote:sub(-1,-1) == &#039;»&#039;) then&lt;br /&gt;
            Quote = Quote:sub(2,-2);&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        -- No añadir el punto final a la cita si el campo Quote ya incluye un punto&lt;br /&gt;
        if Quote:sub(-1,-1) == &#039;.&#039; or Quote:sub(-1,-1) == &#039;?&#039; or&lt;br /&gt;
           Quote:sub(-1,-1) == &#039;!&#039; then&lt;br /&gt;
           PostScript = &amp;quot;&amp;quot;&lt;br /&gt;
           end&lt;br /&gt;
           &lt;br /&gt;
        -- Eliminar comillas de TransQuote&lt;br /&gt;
        if (TransQuote:sub(1, 1) == &#039;&amp;quot;&#039; and TransQuote:sub(-1, -1) == &#039;&amp;quot;&#039;) or&lt;br /&gt;
           (Quote:sub(1,1) == &#039;«&#039; and Quote:sub(-1,-1) == &#039;»&#039;) then&lt;br /&gt;
			TransQuote = TransQuote:sub(2, -2);&lt;br /&gt;
			end&lt;br /&gt;
        &lt;br /&gt;
        -- No añadir el punto final a la cita si el campo TransQuote ya incluye un punto&lt;br /&gt;
        if TransQuote:sub(-1,-1) == &#039;.&#039; or TransQuote:sub(-1,-1) == &#039;?&#039; or&lt;br /&gt;
           TransQuote:sub(-1,-1) == &#039;!&#039; then&lt;br /&gt;
           PostScript = &amp;quot;&amp;quot;&lt;br /&gt;
           end&lt;br /&gt;
		if TransQuote and TransQuote ~= &#039;&#039; then&lt;br /&gt;
           Quote = Quote .. &amp;quot; &amp;quot; .. wrap( &#039;trans-quoted-title&#039;, TransQuote );&lt;br /&gt;
           TransQuote = wrap( &#039;trans-quoted-title&#039;, TransQuote );&lt;br /&gt;
		end&lt;br /&gt;
        Quote = sepc ..&amp;quot; &amp;quot; .. wrap( &#039;quoted-text&#039;, Quote ); &lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local Archived&lt;br /&gt;
    if is_set(ArchiveURL) then&lt;br /&gt;
        if not is_set(ArchiveDate) then&lt;br /&gt;
            ArchiveDate = seterror(&#039;archive_missing_date&#039;);&lt;br /&gt;
        else&lt;br /&gt;
        	ArchiveDate = format_date(ArchiveDate)&lt;br /&gt;
        end&lt;br /&gt;
        if &amp;quot;no&amp;quot; == DeadURL then&lt;br /&gt;
            local arch_text = cfg.messages[&#039;archived&#039;];&lt;br /&gt;
            if sepc ~= &amp;quot;.&amp;quot; then arch_text = arch_text:lower() end&lt;br /&gt;
            Archived = sepc .. &amp;quot; &amp;quot; .. substitute( cfg.messages[&#039;archived-not-dead&#039;],&lt;br /&gt;
                { externallink( ArchiveURL, arch_text ), ArchiveDate } );&lt;br /&gt;
            if not is_set(OriginalURL) then&lt;br /&gt;
                Archived = Archived .. &amp;quot; &amp;quot; .. seterror(&#039;archive_missing_url&#039;);                               &lt;br /&gt;
            end&lt;br /&gt;
        elseif is_set(OriginalURL) then&lt;br /&gt;
            local arch_text = cfg.messages[&#039;archived-dead&#039;];&lt;br /&gt;
            if sepc ~= &amp;quot;.&amp;quot; then arch_text = arch_text:lower() end&lt;br /&gt;
            Archived = sepc .. &amp;quot; &amp;quot; .. substitute( arch_text,&lt;br /&gt;
                { externallink( OriginalURL, cfg.messages[&#039;original&#039;] ), ArchiveDate } );&lt;br /&gt;
        else&lt;br /&gt;
            local arch_text = cfg.messages[&#039;archived-missing&#039;];&lt;br /&gt;
            if sepc ~= &amp;quot;.&amp;quot; then arch_text = arch_text:lower() end&lt;br /&gt;
            Archived = sepc .. &amp;quot; &amp;quot; .. substitute( arch_text, &lt;br /&gt;
                { seterror(&#039;archive_missing_url&#039;), ArchiveDate } );&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        Archived = &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local Lay&lt;br /&gt;
    if is_set(LayURL) then&lt;br /&gt;
        if is_set(LayDate) then LayDate = &amp;quot; (&amp;quot; .. format_date(LayDate) .. &amp;quot;)&amp;quot; end&lt;br /&gt;
        if is_set(LaySource) then &lt;br /&gt;
            LaySource = &amp;quot; &amp;amp;ndash; &#039;&#039;&amp;quot; .. safeforitalics(LaySource) .. &amp;quot;&#039;&#039;&amp;quot;;&lt;br /&gt;
        else&lt;br /&gt;
            LaySource = &amp;quot;&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if sepc == &#039;.&#039; then&lt;br /&gt;
            Lay = sepc .. &amp;quot; &amp;quot; .. externallink( LayURL, cfg.messages[&#039;lay summary&#039;] ) .. LaySource .. LayDate&lt;br /&gt;
        else&lt;br /&gt;
            Lay = sepc .. &amp;quot; &amp;quot; .. externallink( LayURL, cfg.messages[&#039;lay summary&#039;]:lower() ) .. LaySource .. LayDate&lt;br /&gt;
        end            &lt;br /&gt;
    else&lt;br /&gt;
        Lay = &amp;quot;&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Transcript) then&lt;br /&gt;
        if is_set(TranscriptURL) then Transcript = externallink( TranscriptURL, Transcript ); end&lt;br /&gt;
    elseif is_set(TranscriptURL) then&lt;br /&gt;
        Transcript = externallink( TranscriptURL, nil, TranscriptURLorigin );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local Publisher;&lt;br /&gt;
    if is_set(Periodical) and&lt;br /&gt;
--      not inArray(config.ClaseCita, {&amp;quot;encyclopaedia&amp;quot;,&amp;quot;web&amp;quot;,&amp;quot;pressrelease&amp;quot;,&amp;quot;podcast&amp;quot;}) then&lt;br /&gt;
        not inArray(config.ClaseCita, {&amp;quot;enciclopedia&amp;quot;,&amp;quot;web&amp;quot;,&amp;quot;pressrelease&amp;quot;,&amp;quot;podcast&amp;quot;}) then        	&lt;br /&gt;
        if is_set(PublisherName) then&lt;br /&gt;
            if is_set(PublicationPlace) then&lt;br /&gt;
                Publisher = PublicationPlace .. &amp;quot;: &amp;quot; .. PublisherName;&lt;br /&gt;
            else&lt;br /&gt;
                Publisher = PublisherName;  &lt;br /&gt;
            end&lt;br /&gt;
        elseif is_set(PublicationPlace) then&lt;br /&gt;
            Publisher= PublicationPlace;&lt;br /&gt;
        else &lt;br /&gt;
            Publisher = &amp;quot;&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if is_set(PublicationDate) then&lt;br /&gt;
            if is_set(Publisher) then&lt;br /&gt;
                Publisher = Publisher .. &amp;quot;, &amp;quot; .. wrap( &#039;published&#039;, PublicationDate );&lt;br /&gt;
            else&lt;br /&gt;
                Publisher = PublicationDate;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if is_set(Publisher) then&lt;br /&gt;
            Publisher = &amp;quot; (&amp;quot; .. Publisher .. &amp;quot;)&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        if is_set(PublicationDate) then&lt;br /&gt;
            PublicationDate = &amp;quot; (&amp;quot; .. wrap( &#039;published&#039;, format_date(PublicationDate) ) .. &amp;quot;)&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if is_set(PublisherName) then&lt;br /&gt;
            if is_set(PublicationPlace) then&lt;br /&gt;
                Publisher = sepc .. &amp;quot; &amp;quot; .. PublicationPlace .. &amp;quot;: &amp;quot; .. PublisherName .. PublicationDate;&lt;br /&gt;
            else&lt;br /&gt;
                Publisher = sepc .. &amp;quot; &amp;quot; .. PublisherName .. PublicationDate;  &lt;br /&gt;
            end            &lt;br /&gt;
        elseif is_set(PublicationPlace) then &lt;br /&gt;
            Publisher= sepc .. &amp;quot; &amp;quot; .. PublicationPlace .. PublicationDate;&lt;br /&gt;
        else &lt;br /&gt;
            Publisher = PublicationDate;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Several of the above rely upon detecting this as nil, so do it last.&lt;br /&gt;
    if is_set(Periodical) then&lt;br /&gt;
        if is_set(Title) or is_set(TitleNote) then &lt;br /&gt;
            Periodical = sepc .. &amp;quot; &amp;quot; .. wrap( &#039;italic-title&#039;, Periodical ) &lt;br /&gt;
        else &lt;br /&gt;
            Periodical = wrap( &#039;italic-title&#039;, Periodical )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Handle the oddity that is cite speech.  This code overrides whatever may be the value assigned to TitleNote (through |department=) and forces it to be &amp;quot; (Speech)&amp;quot; so that&lt;br /&gt;
the annotation directly follows the |title= parameter value in the citation rather than the |event= parameter value (if provided).&lt;br /&gt;
]]&lt;br /&gt;
	if &amp;quot;speech&amp;quot; == config.ClaseCita then				-- cite speech only&lt;br /&gt;
		TitleNote = &amp;quot; (Speech)&amp;quot;;							-- annotate the citation&lt;br /&gt;
		if is_set (Periodical) then							-- if Periodical, perhaps because of an included |website= or |journal= parameter &lt;br /&gt;
			if is_set (Conference) then						-- and if |event= is set&lt;br /&gt;
				Conference = Conference .. sepc .. &amp;quot; &amp;quot;;		-- then add appropriate punctuation to the end of the Conference variable before rendering&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    -- Piece all bits together at last.  Here, all should be non-nil.&lt;br /&gt;
    -- We build things this way because it is more efficient in LUA&lt;br /&gt;
    -- not to keep reassigning to the same string variable over and over.&lt;br /&gt;
&lt;br /&gt;
    local tcommon&lt;br /&gt;
--  if inArray(config.ClaseCita, {&amp;quot;journal&amp;quot;,&amp;quot;citation&amp;quot;}) and is_set(Periodical) then&lt;br /&gt;
    if inArray(config.ClaseCita, {&amp;quot;publicación&amp;quot;,&amp;quot;citation&amp;quot;}) and is_set(Periodical) then&lt;br /&gt;
        if is_set(Others) then Others = Others .. sepc .. &amp;quot; &amp;quot; end&lt;br /&gt;
        tcommon = safejoin( {Others, Title, TitleNote, Conference, Periodical, Format, TitleType, Scale, Series, &lt;br /&gt;
            Language, Cartography, Edition, Publisher, Agency, Volume, Issue}, sepc );&lt;br /&gt;
    else &lt;br /&gt;
        tcommon = safejoin( {Title, TitleNote, Conference, Periodical, Format, TitleType, Scale, Series, Language, &lt;br /&gt;
            Volume, Issue, Others, Cartography, Edition, Publisher, Agency}, sepc );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if #Lista_Identificadores_Formateados &amp;gt; 0 then&lt;br /&gt;
        Lista_Identificadores_Formateados = safejoin( { sepc .. &amp;quot; &amp;quot;,  table.concat( Lista_Identificadores_Formateados, sepc .. &amp;quot; &amp;quot; ), ID }, sepc );&lt;br /&gt;
    else&lt;br /&gt;
        Lista_Identificadores_Formateados = ID;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local idcommon = safejoin( { Lista_Identificadores_Formateados, URL, Archived, AccessDate, Via, SubscriptionRequired, Lay, Quote }, sepc );&lt;br /&gt;
    local text;&lt;br /&gt;
    local pgtext = Position .. Page .. Pages .. At .. Passage;&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Authors) then&lt;br /&gt;
        if is_set(Coauthors) then&lt;br /&gt;
            Authors = Authors .. A[&#039;AuthorSeparator&#039;] .. &amp;quot; &amp;quot; .. Coauthors&lt;br /&gt;
        end&lt;br /&gt;
        if is_set(Date) then&lt;br /&gt;
            Date = &amp;quot; (&amp;quot;..format_date(Date)..&amp;quot;)&amp;quot; .. OrigYear .. sepc .. &amp;quot; &amp;quot;&lt;br /&gt;
        elseif string.sub(Authors,-1,-1) == sepc then&lt;br /&gt;
            Authors = Authors .. &amp;quot; &amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            Authors = Authors .. sepc .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if is_set(Editors) then&lt;br /&gt;
            local in_text = &amp;quot; &amp;quot;;&lt;br /&gt;
            local post_text = &amp;quot;&amp;quot;;&lt;br /&gt;
			if is_set(Chapter) then&lt;br /&gt;
				in_text = in_text .. cfg.messages[&#039;in&#039;] .. &amp;quot; &amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
            if EditorCount &amp;lt;= 1 then&lt;br /&gt;
                post_text = &amp;quot;, &amp;quot; .. cfg.messages[&#039;editor&#039;];&lt;br /&gt;
            else&lt;br /&gt;
                post_text = &amp;quot;, &amp;quot; .. cfg.messages[&#039;editors&#039;];&lt;br /&gt;
            end&lt;br /&gt;
			if (sepc ~= &#039;.&#039;) then in_text = in_text:lower() end&lt;br /&gt;
            Editors = in_text .. Editors .. post_text;&lt;br /&gt;
            if (string.sub(Editors,-1,-1) == sepc)&lt;br /&gt;
                then Editors = Editors .. &amp;quot; &amp;quot;&lt;br /&gt;
                else Editors = Editors .. sepc .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        text = safejoin( {Authors, Date, Chapter, Place, Editors, tcommon }, sepc );&lt;br /&gt;
        text = safejoin( {text, pgtext, idcommon}, sepc );&lt;br /&gt;
    elseif is_set(Editors) then&lt;br /&gt;
        if is_set(Date) then&lt;br /&gt;
            if EditorCount &amp;lt;= 1 then&lt;br /&gt;
                Editors = Editors .. &amp;quot;, &amp;quot; .. cfg.messages[&#039;editor&#039;];&lt;br /&gt;
            else&lt;br /&gt;
                Editors = Editors .. &amp;quot;, &amp;quot; .. cfg.messages[&#039;editors&#039;];&lt;br /&gt;
            end&lt;br /&gt;
            Date = &amp;quot; (&amp;quot; .. format_date(Date) ..&amp;quot;)&amp;quot; .. OrigYear .. sepc .. &amp;quot; &amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            if EditorCount &amp;lt;= 1 then&lt;br /&gt;
                Editors = Editors .. &amp;quot; (&amp;quot; .. cfg.messages[&#039;editor&#039;] .. &amp;quot;)&amp;quot; .. sepc .. &amp;quot; &amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                Editors = Editors .. &amp;quot; (&amp;quot; .. cfg.messages[&#039;editors&#039;] .. &amp;quot;)&amp;quot; .. sepc .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        text = safejoin( {Editors, Date, Chapter, Place, tcommon}, sepc );&lt;br /&gt;
        text = safejoin( {text, pgtext, idcommon}, sepc );&lt;br /&gt;
    else&lt;br /&gt;
        if is_set(Date) then&lt;br /&gt;
            if ( string.sub(tcommon,-1,-1) ~= sepc )&lt;br /&gt;
              then Date = sepc ..&amp;quot; &amp;quot; .. format_date(Date) .. OrigYear&lt;br /&gt;
              else Date = &amp;quot; &amp;quot; .. format_date(Date) .. OrigYear&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
--      if config.ClaseCita==&amp;quot;journal&amp;quot; and is_set(Periodical) then&lt;br /&gt;
        if config.ClaseCita==&amp;quot;publicación&amp;quot; and is_set(Periodical) then        	&lt;br /&gt;
            text = safejoin( {Chapter, Place, tcommon}, sepc );&lt;br /&gt;
            text = safejoin( {text, pgtext, Date, idcommon}, sepc );&lt;br /&gt;
        else&lt;br /&gt;
            text = safejoin( {Chapter, Place, tcommon, Date}, sepc );&lt;br /&gt;
            text = safejoin( {text, pgtext, idcommon}, sepc );&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
	if is_set(PostScript) and PostScript ~= sepc then&lt;br /&gt;
		text = safejoin( {text, sepc}, sepc );  --Deals with italics, spaces, etc.&lt;br /&gt;
		text = text:sub(1,-sepc:len()-1);&lt;br /&gt;
--		text = text:sub(1,-2);	--Remove final separator (assumes that sepc is only one character)&lt;br /&gt;
	end    &lt;br /&gt;
    &lt;br /&gt;
    text = safejoin( {text, PostScript}, sepc );&lt;br /&gt;
&lt;br /&gt;
    -- Now enclose the whole thing in a &amp;lt;span/&amp;gt; element&lt;br /&gt;
    local options = {};&lt;br /&gt;
    &lt;br /&gt;
    if is_set(config.ClaseCita) and config.ClaseCita ~= &amp;quot;citation&amp;quot; then&lt;br /&gt;
        options.class = &amp;quot;citation &amp;quot; .. config.ClaseCita;&lt;br /&gt;
    else&lt;br /&gt;
        options.class = &amp;quot;citation&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if is_set(Ref) and Ref:lower() ~= &amp;quot;none&amp;quot; then&lt;br /&gt;
        local id = Ref&lt;br /&gt;
        if ( &amp;quot;harv&amp;quot; == Ref ) then&lt;br /&gt;
            local names = {} --table of last names &amp;amp; year&lt;br /&gt;
            if #a &amp;gt; 0 then&lt;br /&gt;
                for i,v in ipairs(a) do &lt;br /&gt;
                    names[i] = v.last &lt;br /&gt;
                    if i == 4 then break end&lt;br /&gt;
                end&lt;br /&gt;
            elseif #e &amp;gt; 0 then&lt;br /&gt;
                for i,v in ipairs(e) do &lt;br /&gt;
                    names[i] = v.last &lt;br /&gt;
                    if i == 4 then break end                &lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
--			names[ #names + 1 ] = first_set(Year, anchor_year);	-- Year first for legacy citations&lt;br /&gt;
--			names[ #names + 1 ] = first_set(Year, &#039;&#039;);	-- Year first for legacy citations&lt;br /&gt;
			names[ #names + 1 ] = first_set(wYear, wfecha, &#039;&#039;);	-- Year first for legacy citations&lt;br /&gt;
            id = anchorid(names)&lt;br /&gt;
        end&lt;br /&gt;
        options.id = id;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if string.len(text:gsub(&amp;quot;&amp;lt;span[^&amp;gt;/]*&amp;gt;.-&amp;lt;/span&amp;gt;&amp;quot;, &amp;quot;&amp;quot;):gsub(&amp;quot;%b&amp;lt;&amp;gt;&amp;quot;,&amp;quot;&amp;quot;)) &amp;lt;= 2 then&lt;br /&gt;
        z.error_categories = {};&lt;br /&gt;
        text = seterror(&#039;empty_citation&#039;);&lt;br /&gt;
        z.message_tail = {};&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if is_set(options.id) then &lt;br /&gt;
        text = &#039;&amp;lt;span id=&amp;quot;&#039; .. mw.uri.anchorEncode(options.id) ..&#039;&amp;quot; class=&amp;quot;&#039; .. mw.text.nowiki(options.class) .. &#039;&amp;quot;&amp;gt;&#039; .. text .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
    else&lt;br /&gt;
        text = &#039;&amp;lt;span class=&amp;quot;&#039; .. mw.text.nowiki(options.class) .. &#039;&amp;quot;&amp;gt;&#039; .. text .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;;&lt;br /&gt;
    end        &lt;br /&gt;
&lt;br /&gt;
    local empty_span = &#039;&amp;lt;span style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    &lt;br /&gt;
    -- Note: Using display: none on then COinS span breaks some clients.&lt;br /&gt;
    local OCinS = &#039;&amp;lt;span title=&amp;quot;&#039; .. OCinSoutput .. &#039;&amp;quot; class=&amp;quot;Z3988&amp;quot;&amp;gt;&#039; .. empty_span .. &#039;&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
    text = text .. OCinS;&lt;br /&gt;
    &lt;br /&gt;
    if #z.message_tail ~= 0 then&lt;br /&gt;
        text = text .. &amp;quot; &amp;quot;;&lt;br /&gt;
        for i,v in ipairs( z.message_tail ) do&lt;br /&gt;
            if is_set(v[1]) then&lt;br /&gt;
                if i == #z.message_tail then&lt;br /&gt;
                    text = text .. errorcomment( v[1], v[2] );&lt;br /&gt;
                else&lt;br /&gt;
                    text = text .. errorcomment( v[1] .. &amp;quot;; &amp;quot;, v[2] );&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    no_tracking_cats = no_tracking_cats:lower();&lt;br /&gt;
    if inArray(no_tracking_cats, {&amp;quot;&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;false&amp;quot;, &amp;quot;n&amp;quot;}) then&lt;br /&gt;
        for _, v in ipairs( z.error_categories ) do&lt;br /&gt;
            text = text .. &#039;[[Category:&#039; .. v ..&#039;]]&#039;;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	-- [[:mw:Help:Reference Previews]]&lt;br /&gt;
	-- [[:mw:WMDE Technical Wishes/ReferencePreviews]]&lt;br /&gt;
	local citeClassMap = {&lt;br /&gt;
		[&amp;quot;libro&amp;quot;] 			= &amp;quot;book&amp;quot;,&lt;br /&gt;
		[&amp;quot;publicación&amp;quot;] 	= &amp;quot;journal&amp;quot;,&lt;br /&gt;
		[&amp;quot;noticia&amp;quot;] 		= &amp;quot;news&amp;quot;,&lt;br /&gt;
		[&amp;quot;web&amp;quot;] 			= &amp;quot;web&amp;quot;,&lt;br /&gt;
		[&amp;quot;nota&amp;quot;] 			= &amp;quot;note&amp;quot;,&lt;br /&gt;
			-- NOTE: there is no way to detect &#039;&amp;lt;ref group=&amp;quot;note&amp;quot;&amp;gt;&#039;&#039; outside of the cite&lt;br /&gt;
			-- -- [[:mw:WMDE_Technical_Wishes/ReferencePreviews#What_do_I_do_when_the_footnote_in_the_popup_isn&#039;t_a_reference_but_a_note?]]&lt;br /&gt;
		[&amp;quot;#default&amp;quot;] 		= &amp;quot;citation&amp;quot;&lt;br /&gt;
			-- -- &amp;quot;conferencia&amp;quot;, &amp;quot;enciclopedia&amp;quot;, &amp;quot;entrevista&amp;quot;, &amp;quot;episode&amp;quot;, &amp;quot;map&amp;quot;,&lt;br /&gt;
			-- -- &amp;quot;notas de DVD&amp;quot;, &amp;quot;podcast&amp;quot;, &amp;quot;pressrelease&amp;quot;, &amp;quot;speech&amp;quot;, &amp;quot;techreport&amp;quot;, &amp;quot;tesis&amp;quot;, ...&lt;br /&gt;
	}&lt;br /&gt;
	if citeClassMap[ config.ClaseCita ] then -- nevermind, ignore detault&lt;br /&gt;
		text = &#039;&amp;lt;cite class=&amp;quot;&#039; .. (citeClassMap[ config.ClaseCita ] or config.ClaseCita[ &amp;quot;#default&amp;quot; ]) .. &#039;&amp;quot;&amp;gt;&amp;lt;/cite&amp;gt;&#039; .. text;&lt;br /&gt;
			-- not wrapped because of default italics style for cite&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- This is used by templates such as {{cite book}} to create the actual citation text.&lt;br /&gt;
function z.cita(frame)&lt;br /&gt;
    local pframe = frame:getParent()&lt;br /&gt;
    &lt;br /&gt;
    if nil ~= string.find( frame:getTitle(), &#039;sandbox&#039;, 1, true ) then				-- did the {{#invoke:}} use sandbox version?&lt;br /&gt;
    	cfg       = mw.loadData(&#039;Módulo:Citas/Configuración/pruebas&#039; );	-- load sandbox versions of Configuration and Whitelist and ...&lt;br /&gt;
    	whitelist = mw.loadData(&#039;Módulo:Citas/Whitelist/pruebas&#039; );&lt;br /&gt;
    	dates     = require    (&#039;Módulo:Citas/ValidaciónFechas/pruebas&#039;).dates	-- ... sandbox version of date validation code&lt;br /&gt;
    else																	-- otherwise&lt;br /&gt;
    	cfg       = mw.loadData(&#039;Módulo:Citas/Configuración&#039; );			-- load live versions of Configuration and Whitelist and ...&lt;br /&gt;
    	whitelist = mw.loadData(&#039;Módulo:Citas/Whitelist&#039; );&lt;br /&gt;
    	dates     = require    (&#039;Módulo:Citas/ValidaciónFechas&#039;).dates		-- ... live version of date validation code&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
    local args = {};&lt;br /&gt;
    &lt;br /&gt;
    local suggestions = {};&lt;br /&gt;
    local error_text, error_state;&lt;br /&gt;
&lt;br /&gt;
    local config = {};&lt;br /&gt;
    for k, v in pairs( frame.args ) do&lt;br /&gt;
        config[k] = v;&lt;br /&gt;
        args[k] = v;       &lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for k, v in pairs( pframe.args ) do&lt;br /&gt;
        if v ~= &#039;&#039; then&lt;br /&gt;
            if not validate( k ) then            &lt;br /&gt;
                error_text = &amp;quot;&amp;quot;;&lt;br /&gt;
                if type( k ) ~= &#039;string&#039; then&lt;br /&gt;
                    -- Exclude empty numbered parameters&lt;br /&gt;
                    if v:match(&amp;quot;%S+&amp;quot;) ~= nil then&lt;br /&gt;
                        error_text, error_state = seterror( &#039;text_ignored&#039;, {v}, true );&lt;br /&gt;
                    end&lt;br /&gt;
                elseif validate( k:lower() ) then &lt;br /&gt;
                    error_text, error_state = seterror( &#039;parameter_ignored_suggest&#039;, {k, k:lower()}, true );&lt;br /&gt;
                else&lt;br /&gt;
&lt;br /&gt;
                    if #suggestions == 0 then&lt;br /&gt;
                        suggestions = mw.loadData( &#039;Módulo:Citas/Sugerencias&#039; );&lt;br /&gt;
                    end&lt;br /&gt;
                    if suggestions[ k:lower() ] ~= nil then&lt;br /&gt;
                        error_text, error_state = seterror( &#039;parameter_ignored_suggest&#039;, {k, suggestions[ k:lower() ]}, true );&lt;br /&gt;
                    elseif cfg.parametros_a_implementar[k:lower()] then &lt;br /&gt;
                    	error_text, error_state = seterror( &#039;parametro_por_implementar&#039;, {k}, true );&lt;br /&gt;
                    else&lt;br /&gt;
                        error_text, error_state = seterror( &#039;parameter_ignored&#039;, {k}, true );&lt;br /&gt;
                  end&lt;br /&gt;
                end                  &lt;br /&gt;
                if error_text ~= &#039;&#039; then&lt;br /&gt;
                    table.insert( z.message_tail, {error_text, error_state} );&lt;br /&gt;
                end                &lt;br /&gt;
            end&lt;br /&gt;
            args[k] = v;&lt;br /&gt;
        elseif args[k] ~= nil or (k == &#039;postscript&#039;) then&lt;br /&gt;
            args[k] = v;&lt;br /&gt;
        end        &lt;br /&gt;
    end    &lt;br /&gt;
    &lt;br /&gt;
    return citation0( config, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return z&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Cita_web&amp;diff=287</id>
		<title>Plantilla:Cita web</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Cita_web&amp;diff=287"/>
		<updated>2026-06-14T04:12:55Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Citas | cita|ClaseCita=web}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{documentación}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Lista_desplegable&amp;diff=285</id>
		<title>Plantilla:Lista desplegable</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Lista_desplegable&amp;diff=285"/>
		<updated>2026-06-14T04:12:55Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;font-size:95%;{{#if:{{{marco_estilo|}}}&lt;br /&gt;
|{{{marco_estilo|}}}&lt;br /&gt;
|border:none; padding: 0;&lt;br /&gt;
}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;{{#if:{{{título_estilo|}}}|{{{título_estilo|}}}|width:100%; font-weight:bold&amp;quot; align=&amp;quot;left}}&amp;quot;&amp;gt;{{#if:{{{título|}}}{{{title|}}}&lt;br /&gt;
|{{{título|}}}{{{title|}}}&lt;br /&gt;
|Ver lista&lt;br /&gt;
}}&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;{{#if:{{{lista_estilo|}}}&lt;br /&gt;
|{{{lista_estilo|}}}&lt;br /&gt;
|text-align:left;&lt;br /&gt;
}}&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{texto|}}}  |{{{texto|}}}}}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{1|}}}  |{{{1|}}}        }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{2|}}}  |&amp;lt;br /&amp;gt;{{{2|}}}  }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{3|}}}  |&amp;lt;br /&amp;gt;{{{3|}}}  }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{4|}}}  |&amp;lt;br /&amp;gt;{{{4|}}}  }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{5|}}}  |&amp;lt;br /&amp;gt;{{{5|}}}  }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{6|}}}  |&amp;lt;br /&amp;gt;{{{6|}}}  }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{7|}}}  |&amp;lt;br /&amp;gt;{{{7|}}}  }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{8|}}}  |&amp;lt;br /&amp;gt;{{{8|}}}  }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{9|}}}  |&amp;lt;br /&amp;gt;{{{9|}}}  }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{10|}}} |&amp;lt;br /&amp;gt;{{{10|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{11|}}} |&amp;lt;br /&amp;gt;{{{11|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{12|}}} |&amp;lt;br /&amp;gt;{{{12|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{13|}}} |&amp;lt;br /&amp;gt;{{{13|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{14|}}} |&amp;lt;br /&amp;gt;{{{14|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{15|}}} |&amp;lt;br /&amp;gt;{{{15|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{16|}}} |&amp;lt;br /&amp;gt;{{{16|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{17|}}} |&amp;lt;br /&amp;gt;{{{17|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{18|}}} |&amp;lt;br /&amp;gt;{{{18|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{19|}}} |&amp;lt;br /&amp;gt;{{{19|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{20|}}} |&amp;lt;br /&amp;gt;{{{20|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{21|}}} |&amp;lt;br /&amp;gt;{{{21|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{22|}}} |&amp;lt;br /&amp;gt;{{{22|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{23|}}} |&amp;lt;br /&amp;gt;{{{23|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{24|}}} |&amp;lt;br /&amp;gt;{{{24|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{25|}}} |&amp;lt;br /&amp;gt;{{{25|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{26|}}} |&amp;lt;br /&amp;gt;{{{26|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{27|}}} |&amp;lt;br /&amp;gt;{{{27|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{28|}}} |&amp;lt;br /&amp;gt;{{{28|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{29|}}} |&amp;lt;br /&amp;gt;{{{29|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{30|}}} |&amp;lt;br /&amp;gt;{{{30|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{31|}}} |&amp;lt;br /&amp;gt;{{{31|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{32|}}} |&amp;lt;br /&amp;gt;{{{32|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{33|}}} |&amp;lt;br /&amp;gt;{{{33|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{34|}}} |&amp;lt;br /&amp;gt;{{{34|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{35|}}} |&amp;lt;br /&amp;gt;{{{35|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{36|}}} |&amp;lt;br /&amp;gt;{{{36|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{37|}}} |&amp;lt;br /&amp;gt;{{{37|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{38|}}} |&amp;lt;br /&amp;gt;{{{38|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{39|}}} |&amp;lt;br /&amp;gt;{{{39|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{40|}}} |&amp;lt;br /&amp;gt;{{{40|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{41|}}} |&amp;lt;br /&amp;gt;{{{41|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{42|}}} |&amp;lt;br /&amp;gt;{{{42|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{43|}}} |&amp;lt;br /&amp;gt;{{{43|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{44|}}} |&amp;lt;br /&amp;gt;{{{44|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{45|}}} |&amp;lt;br /&amp;gt;{{{45|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{46|}}} |&amp;lt;br /&amp;gt;{{{46|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{47|}}} |&amp;lt;br /&amp;gt;{{{47|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{48|}}} |&amp;lt;br /&amp;gt;{{{48|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{49|}}} |&amp;lt;br /&amp;gt;{{{49|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{50|}}} |&amp;lt;br /&amp;gt;{{{50|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{51|}}} |&amp;lt;br /&amp;gt;{{{51|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{52|}}} |&amp;lt;br /&amp;gt;{{{52|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{53|}}} |&amp;lt;br /&amp;gt;{{{53|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{54|}}} |&amp;lt;br /&amp;gt;{{{54|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{55|}}} |&amp;lt;br /&amp;gt;{{{55|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{56|}}} |&amp;lt;br /&amp;gt;{{{56|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{57|}}} |&amp;lt;br /&amp;gt;{{{57|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{58|}}} |&amp;lt;br /&amp;gt;{{{58|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{59|}}} |&amp;lt;br /&amp;gt;{{{59|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{60|}}} |&amp;lt;br /&amp;gt;{{{60|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{61|}}} |&amp;lt;br /&amp;gt;{{{61|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{62|}}} |&amp;lt;br /&amp;gt;{{{62|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{63|}}} |&amp;lt;br /&amp;gt;{{{63|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{64|}}} |&amp;lt;br /&amp;gt;{{{64|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{65|}}} |&amp;lt;br /&amp;gt;{{{65|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{66|}}} |&amp;lt;br /&amp;gt;{{{66|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{67|}}} |&amp;lt;br /&amp;gt;{{{67|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{68|}}} |&amp;lt;br /&amp;gt;{{{68|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{69|}}} |&amp;lt;br /&amp;gt;{{{69|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{70|}}} |&amp;lt;br /&amp;gt;{{{70|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{71|}}} |&amp;lt;br /&amp;gt;{{{71|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{72|}}} |&amp;lt;br /&amp;gt;{{{72|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{73|}}} |&amp;lt;br /&amp;gt;{{{73|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{74|}}} |&amp;lt;br /&amp;gt;{{{74|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{75|}}} |&amp;lt;br /&amp;gt;{{{75|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{76|}}} |&amp;lt;br /&amp;gt;{{{76|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{77|}}} |&amp;lt;br /&amp;gt;{{{77|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{78|}}} |&amp;lt;br /&amp;gt;{{{78|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{79|}}} |&amp;lt;br /&amp;gt;{{{79|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{80|}}} |&amp;lt;br /&amp;gt;{{{80|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{81|}}} |&amp;lt;br /&amp;gt;{{{81|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{82|}}} |&amp;lt;br /&amp;gt;{{{82|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{83|}}} |&amp;lt;br /&amp;gt;{{{83|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{84|}}} |&amp;lt;br /&amp;gt;{{{84|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{85|}}} |&amp;lt;br /&amp;gt;{{{85|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{86|}}} |&amp;lt;br /&amp;gt;{{{86|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{87|}}} |&amp;lt;br /&amp;gt;{{{87|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{88|}}} |&amp;lt;br /&amp;gt;{{{88|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{89|}}} |&amp;lt;br /&amp;gt;{{{89|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{90|}}} |&amp;lt;br /&amp;gt;{{{90|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{91|}}} |&amp;lt;br /&amp;gt;{{{91|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{92|}}} |&amp;lt;br /&amp;gt;{{{92|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{93|}}} |&amp;lt;br /&amp;gt;{{{93|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{94|}}} |&amp;lt;br /&amp;gt;{{{94|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{95|}}} |&amp;lt;br /&amp;gt;{{{95|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{96|}}} |&amp;lt;br /&amp;gt;{{{96|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{97|}}} |&amp;lt;br /&amp;gt;{{{97|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{98|}}} |&amp;lt;br /&amp;gt;{{{98|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{99|}}} |&amp;lt;br /&amp;gt;{{{99|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{100|}}} |&amp;lt;br /&amp;gt;{{{100|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{101|}}} |&amp;lt;br /&amp;gt;{{{101|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{102|}}} |&amp;lt;br /&amp;gt;{{{102|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{103|}}} |&amp;lt;br /&amp;gt;{{{103|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{104|}}} |&amp;lt;br /&amp;gt;{{{104|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{105|}}} |&amp;lt;br /&amp;gt;{{{105|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{106|}}} |&amp;lt;br /&amp;gt;{{{106|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{107|}}} |&amp;lt;br /&amp;gt;{{{107|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{108|}}} |&amp;lt;br /&amp;gt;{{{108|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{109|}}} |&amp;lt;br /&amp;gt;{{{109|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{110|}}} |&amp;lt;br /&amp;gt;{{{100|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{111|}}} |&amp;lt;br /&amp;gt;{{{111|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{112|}}} |&amp;lt;br /&amp;gt;{{{112|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{113|}}} |&amp;lt;br /&amp;gt;{{{113|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{114|}}} |&amp;lt;br /&amp;gt;{{{114|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{115|}}} |&amp;lt;br /&amp;gt;{{{115|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{116|}}} |&amp;lt;br /&amp;gt;{{{116|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{117|}}} |&amp;lt;br /&amp;gt;{{{117|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{118|}}} |&amp;lt;br /&amp;gt;{{{118|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{119|}}} |&amp;lt;br /&amp;gt;{{{119|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{120|}}} |&amp;lt;br /&amp;gt;{{{120|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{121|}}} |&amp;lt;br /&amp;gt;{{{121|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{122|}}} |&amp;lt;br /&amp;gt;{{{122|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{123|}}} |&amp;lt;br /&amp;gt;{{{123|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{124|}}} |&amp;lt;br /&amp;gt;{{{124|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{125|}}} |&amp;lt;br /&amp;gt;{{{125|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{126|}}} |&amp;lt;br /&amp;gt;{{{126|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{127|}}} |&amp;lt;br /&amp;gt;{{{127|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{128|}}} |&amp;lt;br /&amp;gt;{{{128|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{129|}}} |&amp;lt;br /&amp;gt;{{{129|}}} }}&amp;lt;!--&lt;br /&gt;
     --&amp;gt;{{#if:{{{130|}}} |&amp;lt;br /&amp;gt;{{{130|}}} }}&amp;lt;!--&lt;br /&gt;
 --&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;noinclude&amp;gt;{{documentación}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Aviso&amp;diff=283</id>
		<title>Plantilla:Aviso</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Aviso&amp;diff=283"/>
		<updated>2026-06-14T04:12:55Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table style=&amp;quot;{{{estilo|}}}&amp;quot; class=&amp;quot;noprint plainlinks ambox {{#switch:{{{tipo|}}}&lt;br /&gt;
  | protección | gris     = ambox-protection&lt;br /&gt;
  | serio      | rojo     = ambox-serious&lt;br /&gt;
  | contenido  | naranja  = ambox-content&lt;br /&gt;
  | estilo     | amarillo = ambox-style&lt;br /&gt;
  | fusionar   | morado   = ambox-merge&lt;br /&gt;
  | desarrollo | verde    = ambox-growth&lt;br /&gt;
  | aviso      | azul     = ambox-notice&lt;br /&gt;
  | #default   = ambox-notice&lt;br /&gt;
}} {{{clase|}}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;ambox-image&amp;quot; width=&amp;quot;40&amp;quot;&amp;gt;&lt;br /&gt;
{{#ifeq:{{{imagen}}}|ninguna&lt;br /&gt;
  | &amp;lt;!-- No hay celda con imagen; celda vacía necesaria para que la celda de texto tenga anchura 100% --&amp;gt;&lt;br /&gt;
  | {{#switch:{{{imagen|{{{tipo|}}}}}}&lt;br /&gt;
    | protección | gris     = [[Archivo:Commons-emblem-padlock.svg|40px|class=notpageimage noviewer|enlace=|alt=]]&lt;br /&gt;
    | serio      | rojo     = [[Archivo:Commons-emblem-hand.svg|40px|class=notpageimage noviewer|alt=]]&lt;br /&gt;
    | contenido  | naranja  = [[Archivo:Commons-emblem-issue.svg|40px|class=notpageimage noviewer|enlace=|alt=]]&lt;br /&gt;
    | estilo     | amarillo = [[Archivo:Commons-emblem-copyedit.svg|40px|class=notpageimage noviewer|enlace=|alt=]]&lt;br /&gt;
    | fusionar   | morado   = [[Archivo:Commons-emblem-merge.svg|40px|class=notpageimage noviewer|enlace=|alt=]]&lt;br /&gt;
    | desarrollo | verde    = [[Archivo:Commons-emblem-success.svg|40px|class=notpageimage noviewer|enlace=|alt=]]&lt;br /&gt;
    | aviso      | azul     = [[Archivo:Commons-emblem-notice.svg|40px|class=notpageimage noviewer|enlace=|alt=]]&lt;br /&gt;
    | vacío                 = [[Archivo:No image.svg|class=notpageimage noviewer|enlace=|alt=]]&lt;br /&gt;
    | #default              = {{#if:{{{imagen|}}}|{{#ifexist:Media:{{{imagen}}}|&lt;br /&gt;
      [[Archivo:{{{imagen}}}|x40px|class=notpageimage noviewer|alt=]]|{{{imagen}}}}}|&lt;br /&gt;
      {{{imagen|[[Archivo:Commons-emblem-notice.svg|40px|class=notpageimage noviewer|enlace=|alt=]]}}}&lt;br /&gt;
    }}&lt;br /&gt;
  }}&lt;br /&gt;
}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;ambox-text&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;ambox-text-div&amp;quot;&amp;gt;{{#if:{{{encabezado|{{{2|}}}}}}|&amp;lt;strong&amp;gt;{{{encabezado|{{{1}}}}}}&amp;lt;/strong&amp;gt; {{#if:{{{contenido|{{{texto|{{{2|}}}}}}}}}|&amp;lt;span class=&amp;quot;hide-when-compact&amp;quot;&amp;gt;{{{contenido|{{{texto|{{{2}}}}}}}}}&amp;lt;/span&amp;gt;}}|{{{contenido|{{{texto|{{{1|No has escrito ningún aviso}}}}}}}}}}}&amp;lt;/div&amp;gt;{{#if:{{{pie|}}}|&amp;lt;div class=&amp;quot;hide-when-compact&amp;quot;&amp;gt;&amp;lt;small&amp;gt;{{{pie}}}&amp;lt;/small&amp;gt;&amp;lt;/div&amp;gt;}}&amp;lt;/td&amp;gt;{{#if:{{{imagen derecha|}}}|&amp;lt;td class=&amp;quot;hide-when-compact ambox-imageright&amp;quot;&amp;gt;{{#ifexist:Media:{{{imagen derecha}}}|[[Archivo:{{{imagen derecha}}}|x40px|class=notpageimage noviewer|alt=]]|{{{imagen derecha}}}}}&amp;lt;/td&amp;gt;}}&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;lt;includeonly&amp;gt;{{#ifeq:{{SUBPAGENAME}}|doc||{{#ifeq:{{NAMESPACE}}|{{ns:10}}&lt;br /&gt;
| [[{{#switch:{{{tipo|}}}&lt;br /&gt;
  | protección = Categoría:Wikipedia:Plantillas de protección&lt;br /&gt;
  | serio      = Categoría:Wikipedia:Plantillas críticas de mantenimiento&lt;br /&gt;
  | contenido  = Categoría:Wikipedia:Plantillas de contenido&lt;br /&gt;
  | estilo     = Categoría:Wikipedia:Plantillas de estilo&lt;br /&gt;
  | fusionar   = Categoría:Wikipedia:Plantillas de fusiones&lt;br /&gt;
  | desarrollo = Categoría:Wikipedia:Plantillas de desarrollo&lt;br /&gt;
  | aviso      = Categoría:Wikipedia:Plantillas de avisos&lt;br /&gt;
  | #default   = Categoría:Wikipedia:Plantillas de avisos&lt;br /&gt;
  }}]]&lt;br /&gt;
}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentación}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Listaref&amp;diff=281</id>
		<title>Plantilla:Listaref</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Listaref&amp;diff=281"/>
		<updated>2026-06-14T04:12:54Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: 1 revisión importada&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;listaref&amp;quot; style=&amp;quot;&amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{#if: {{{ancho|{{{colwidth|}}}}}}&lt;br /&gt;
    | -moz-column-width: {{{ancho{{{colwidth|}}}}}}; -webkit-column-width: {{{ancho{{{colwidth|}}}}}}; column-width: {{{ancho{{{colwidth|}}}}}};&lt;br /&gt;
    | {{#if: {{{1|}}}&lt;br /&gt;
      | -moz-column-count:{{{1}}}; -webkit-column-count:{{{1}}}; column-count:{{{1}}};&lt;br /&gt;
      }}&lt;br /&gt;
    }} list-style-type: &amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{{estilolista|{{{liststyle|{{#switch: {{{grupo|{{{group|}}}}}}&lt;br /&gt;
    | upper-alpha&lt;br /&gt;
    | upper-roman&lt;br /&gt;
    | lower-alpha&lt;br /&gt;
    | lower-greek&lt;br /&gt;
    | lower-roman = {{{grupo|{{{group}}}}}}&lt;br /&gt;
    | #default = decimal}}}}}}}};&amp;quot;&amp;gt;{{#tag:references|{{{refs|}}}|group={{{grupo|{{{group|}}}}}}}}&amp;lt;/div&amp;gt;&amp;lt;noinclude&amp;gt;{{documentación}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Manual_de_especificaciones_t%C3%A9cnicas_para_el_sistema_interoperable_de_pago_electr%C3%B3nico_del_estado_de_Jalisco&amp;diff=279</id>
		<title>Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Manual_de_especificaciones_t%C3%A9cnicas_para_el_sistema_interoperable_de_pago_electr%C3%B3nico_del_estado_de_Jalisco&amp;diff=279"/>
		<updated>2026-06-14T04:00:54Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: Intento de unir todo #1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;El &#039;&#039;&#039;manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco&#039;&#039;&#039; define la arquitectura utilizada por la red de recaudo interoperable del transporte público estatal. Este artículo presenta una versión revisada, corregida y actualizada de la última especificación pública disponible.&lt;br /&gt;
&lt;br /&gt;
El manual establece los requisitos para la interoperabilidad entre emisores de tarjetas, distribuidores de productos tarifarios, prestadores de servicio y demás participantes de la red. Asimismo, describe la estructura de datos almacenada en los medios de pago basados en tecnología [[MIFARE DESFire|MIFARE DESFire EV1/EV2]], los mecanismos de seguridad criptográfica empleados, el uso de [[Módulo de acceso seguro|módulos de acceso seguro (SAM)]], los productos tarifarios soportados y los procedimientos operativos necesarios para la emisión, distribución, recarga, validación y administración de los medios de pago.&lt;br /&gt;
&lt;br /&gt;
Además de servir como referencia documental, esta edición incorpora correcciones de formato, aclaraciones técnicas, referencias cruzadas y observaciones derivadas del análisis de la implementación real del sistema interoperable de Jalisco.&lt;br /&gt;
&lt;br /&gt;
== Contenido ==&lt;br /&gt;
&lt;br /&gt;
* [[/Introducción|1 Introducción]]&lt;br /&gt;
* [[/Interoperabilidad|2 Interoperabilidad]]&lt;br /&gt;
* [[/Tipos de productos|3 Tipos de productos]]&lt;br /&gt;
* [[/Modelo de seguridad|4 Modelo de seguridad en nivel 0-1]]&lt;br /&gt;
* [[/Diversificación de llaves|5 Diversificación de llaves]]&lt;br /&gt;
* [[/Aplicación interoperable en medios de pago MIFARE DESFire|6 Aplicación interoperable en medios de pago MIFARE DESFire EV1]]&lt;br /&gt;
* [[/Ciclos de vida|7 Ciclos de vida]]&lt;br /&gt;
* [[/Instrucciones de uso de la aplicación interoperable en medios de pago|8 Instrucciones de uso de la aplicación interoperable en medios de pago]]&lt;br /&gt;
* [[/Modelo interoperable de flujo de datos|9 Modelo interoperable de flujo de datos]]&lt;br /&gt;
* [[/Flujo de datos de eventos|10 Flujo de datos de eventos]]&lt;br /&gt;
* [[/Casos de uso de medios de pago|11 Casos de uso de medios de pago]]&lt;br /&gt;
* [[/Seguridad en el envío de eventos|12 Seguridad en el envío de eventos]]&lt;br /&gt;
* [[/Especificación de los módulos de acceso seguro|13 Especificación de los módulos de acceso seguro (SAM)]]&lt;br /&gt;
* [[/Resumen de los datos que deben ser asignados por el Registrar|14 Resumen de los datos que deben ser asignados por el Registrar]]&lt;br /&gt;
&lt;br /&gt;
== Introducción ==&lt;br /&gt;
Este artículo contiene la definición técnica que reglamenta la tecnología utilizada en el Estado de Jalisco para la implementación de un modelo de interoperabilidad en sistemas de recaudo. En él se definen la tecnología de los medios de pago, la estructura de la información almacenada en dichos medios, las reglas para su utilización y los protocolos de comunicación entre los actores que participan en la red interoperable de Jalisco.&lt;br /&gt;
&lt;br /&gt;
=== Glosario ===&lt;br /&gt;
&lt;br /&gt;
; AES&lt;br /&gt;
: &#039;&#039;Advanced Encryption Standard&#039;&#039; (Estándar Avanzado de Cifrado).&lt;br /&gt;
&lt;br /&gt;
; AID&lt;br /&gt;
: Identificador de aplicación en el medio de pago.&lt;br /&gt;
&lt;br /&gt;
; Aplicación&lt;br /&gt;
: Estructura de datos dentro de un medio de pago que define archivos, codificaciones y reglas de uso.&lt;br /&gt;
&lt;br /&gt;
; Cámara de compensación&lt;br /&gt;
: Sistema de control y compensación encargado de la liquidación y distribución de las operaciones derivadas de las transacciones diarias efectuadas por el pago de tarifas dentro de la red interoperable.&lt;br /&gt;
&lt;br /&gt;
; DF&lt;br /&gt;
: &#039;&#039;Dedicated File&#039;&#039;, archivo contenedor de otros archivos DF o EF.&lt;br /&gt;
&lt;br /&gt;
; EF&lt;br /&gt;
: &#039;&#039;Elementary File&#039;&#039;, archivo destinado al almacenamiento de datos. No posee sucesores y sus atributos de seguridad pueden asignarse individualmente.&lt;br /&gt;
&lt;br /&gt;
; Evento&lt;br /&gt;
: Operación básica efectuada sobre la aplicación interoperable.&lt;br /&gt;
&lt;br /&gt;
; LAM&lt;br /&gt;
: Lista de Acción para Medios de Pago Interoperables.&lt;br /&gt;
&lt;br /&gt;
; LAP_R&lt;br /&gt;
: Lista de Acción para Productos en Dispositivos de Recarga.&lt;br /&gt;
&lt;br /&gt;
; LAP_V&lt;br /&gt;
: Lista de Acción para Productos en Dispositivos de Validación.&lt;br /&gt;
&lt;br /&gt;
; Llave&lt;br /&gt;
: Secreto compartido entre varios elementos de un sistema utilizado para efectuar operaciones de seguridad.&lt;br /&gt;
&lt;br /&gt;
; Medio de pago&lt;br /&gt;
: Instrumento electrónico mediante el cual un usuario puede acceder al servicio de transporte público realizando el pago correspondiente dentro de la red interoperable.&lt;br /&gt;
&lt;br /&gt;
; Operación&lt;br /&gt;
: Acción llevada a cabo por un usuario o una entidad que produce uno o varios eventos.&lt;br /&gt;
&lt;br /&gt;
; Producto&lt;br /&gt;
: Conjunto de reglas comerciales almacenadas en un medio de pago cuya ejecución permite la prestación de un servicio.&lt;br /&gt;
&lt;br /&gt;
; SAM&lt;br /&gt;
: Módulo de acceso seguro. Se utiliza para almacenar llaves criptográficas, realizar operaciones criptográficas con los medios de pago y facilitar la comunicación segura entre terminales y sistemas centrales.&lt;br /&gt;
&lt;br /&gt;
; Tarifa&lt;br /&gt;
: Unidades de valor descontadas de un producto durante una transacción de validación. Estas unidades son determinadas según las condiciones aplicables a cada usuario.&lt;br /&gt;
&lt;br /&gt;
; Usuario&lt;br /&gt;
: Persona que utiliza el sistema integrado de recaudo.&lt;br /&gt;
&lt;br /&gt;
; Validación&lt;br /&gt;
: Uso de un producto para acceder a un servicio.&lt;br /&gt;
&lt;br /&gt;
; Viaje&lt;br /&gt;
: Conjunto de validaciones que transportan al usuario desde el inicio hasta el final de su recorrido.&lt;br /&gt;
&lt;br /&gt;
; Ventana de transbordo&lt;br /&gt;
: Período durante el cual se cumplen todas las condiciones temporales y operativas necesarias para recibir el beneficio de una tarifa de transbordo durante un viaje.&lt;br /&gt;
&lt;br /&gt;
=== Representación de los datos ===&lt;br /&gt;
La información numérica consignada en este documento se expresa en formato hexadecimal cuando el dato incluye el prefijo &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt;. Cuando el dato ocupa más de dos bytes, su representación utiliza el orden de bytes &#039;&#039;Big-Endian&#039;&#039;. Los valores expresados en formato decimal no incluyen ningún prefijo.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Decimal&lt;br /&gt;
!Hexadecimal&lt;br /&gt;
|-&lt;br /&gt;
|651316845&lt;br /&gt;
|&amp;lt;code&amp;gt;0x26D24E6D&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Algunos datos definidos en esta especificación tienen una longitud en bits que no corresponde a un múltiplo de ocho. En estos casos se agregan ceros a la izquierda hasta completar un número entero de bytes. Este procedimiento permite representar todos los datos de forma alineada a nivel de byte.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Dato&lt;br /&gt;
!Tamaño (bits)&lt;br /&gt;
!Tamaño (bytes)&lt;br /&gt;
!Valor (hex)&lt;br /&gt;
|-&lt;br /&gt;
|6333&lt;br /&gt;
|13&lt;br /&gt;
|2&lt;br /&gt;
|0x18BD&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Especificaciones de la tarjeta MIFARE DESFire EV1 y EV2 ===&lt;br /&gt;
El modelo de datos descrito en este documento está basado en las tarjetas [[MIFARE DESFire|MIFARE DESFire EV1]] y [[MIFARE DESFire|MIFARE DESFire EV2]]. Ambas tecnologías son compatibles con las cuatro partes del estándar ISO/IEC 14443A para tarjetas inteligentes sin contacto.&lt;br /&gt;
&lt;br /&gt;
MIFARE DESFire EV2 incluye un modo de compatibilidad con versiones anteriores de MIFARE DESFire EV1 y D40. Este es el modo de operación utilizado por la aplicación interoperable descrita en esta especificación.&lt;br /&gt;
&lt;br /&gt;
Entre las funcionalidades proporcionadas por la plataforma MIFARE DESFire se encuentran:&lt;br /&gt;
&lt;br /&gt;
* Comunicación segura entre medios de pago y lectores.&lt;br /&gt;
* Manejo de colisiones para múltiples tarjetas presentes simultáneamente en el campo de lectura.&lt;br /&gt;
* Protección de integridad frente a interrupciones durante operaciones de escritura.&lt;br /&gt;
* Transmisión de datos orientada a archivos.&lt;br /&gt;
* Control de acceso basado en llaves criptográficas de aplicación.&lt;br /&gt;
&lt;br /&gt;
La tecnología también incorpora características basadas en estándares abiertos:&lt;br /&gt;
&lt;br /&gt;
* Nombres de archivo basados en ISO 7816.&lt;br /&gt;
* Esquemas de seguridad basados en AES o 3DES.&lt;br /&gt;
* Comandos de administración de archivos compatibles con ISO 7816-4.&lt;br /&gt;
&lt;br /&gt;
Un medio de pago MIFARE DESFire puede almacenar hasta 28 aplicaciones o directorios, identificados mediante un &#039;&#039;Application Identifier&#039;&#039; (AID) de tres bytes y un identificador de archivo ISO de dos bytes.&lt;br /&gt;
&lt;br /&gt;
Cada aplicación puede contener hasta 32 archivos elementales y almacenar de forma segura hasta 14 llaves criptográficas numeradas del 0 al 13, además de los estados especiales &#039;&#039;free&#039;&#039; y &#039;&#039;never&#039;&#039;. La llave número 0 corresponde a la llave maestra de la aplicación.&lt;br /&gt;
&lt;br /&gt;
Los archivos elementales pueden ser de los siguientes tipos:&lt;br /&gt;
&lt;br /&gt;
* Archivos estándar.&lt;br /&gt;
* Archivos con respaldo (&#039;&#039;backup&#039;&#039;).&lt;br /&gt;
* Archivos de valor.&lt;br /&gt;
* Archivos de registro lineal.&lt;br /&gt;
* Archivos de registro cíclico.&lt;br /&gt;
&lt;br /&gt;
Todo medio de pago MIFARE DESFire incluye además un directorio maestro que contiene una llave maestra denominada &#039;&#039;PICC Key&#039;&#039;. La autenticación mediante esta llave permite crear o eliminar aplicaciones y borrar completamente el contenido del medio de pago.&lt;br /&gt;
&lt;br /&gt;
== Interoperabilidad ==&lt;br /&gt;
El modelo de interoperabilidad está basado en el &#039;&#039;estándar ISO 24014, parte 1&#039;&#039;. Una red interoperable se define como un sistema en el que existe un conjunto mínimo de medios de pago aceptados por múltiples prestadores de servicio, independientemente del emisor de dichos medios.&lt;br /&gt;
&lt;br /&gt;
=== Actores de la red interoperable ===&lt;br /&gt;
Siguiendo el modelo definido, pueden existir los siguientes actores dentro de la red interoperable:&lt;br /&gt;
&lt;br /&gt;
; Comité rector&lt;br /&gt;
: Entidad encargada de emitir y actualizar las reglas técnicas y comerciales de la red interoperable, supervisar su cumplimiento, adherir o retirar entidades participantes y supervisar la operación de la cámara de compensación. Cumple el papel de propietario de la aplicación interoperable.&lt;br /&gt;
&lt;br /&gt;
; Comité técnico&lt;br /&gt;
: Entidad encargada de supervisar la calidad de servicio que deben cumplir los actores del entorno interoperable, definir políticas y condiciones de servicio, establecer mecanismos de sanción, instruir al fiduciario sobre la administración de los recursos del fideicomiso maestro y vigilar el cumplimiento de sus fines.&lt;br /&gt;
&lt;br /&gt;
; Cámara de compensación&lt;br /&gt;
: Entidad encargada de interconectar a todas las entidades de la red interoperable. Realiza la recolección de información transaccional y genera las órdenes de pago necesarias para la compensación y liquidación entre participantes.&lt;br /&gt;
&lt;br /&gt;
; Emisores de medios de pago&lt;br /&gt;
: Entidades autorizadas por el comité rector para fabricar, programar y emitir medios de pago que contengan la aplicación interoperable descrita en esta especificación.&lt;br /&gt;
&lt;br /&gt;
; Distribuidores de productos&lt;br /&gt;
: Entidades autorizadas por el comité rector para almacenar productos dentro de los medios de pago interoperables y efectuar operaciones de distribución y recarga de dichos productos.&lt;br /&gt;
&lt;br /&gt;
; Prestadores de servicio&lt;br /&gt;
: Entidades autorizadas por el comité rector para utilizar productos durante transacciones de validación con el fin de prestar servicios dentro de la red interoperable.&lt;br /&gt;
&lt;br /&gt;
=== Especificaciones de la red interoperable ===&lt;br /&gt;
La red interoperable debe cumplir, como mínimo, con las siguientes características:&lt;br /&gt;
&lt;br /&gt;
* Permitir la existencia de múltiples emisores de medios de pago.&lt;br /&gt;
* Permitir que los medios de pago almacenen múltiples productos destinados al acceso a servicios.&lt;br /&gt;
* Permitir la existencia de múltiples distribuidores de productos.&lt;br /&gt;
* Mantener independencia entre la emisión de un medio de pago y la distribución de los productos que este puede almacenar.&lt;br /&gt;
* Definir una estructura de datos común para los medios de pago, denominada &#039;&#039;aplicación interoperable&#039;&#039;.&lt;br /&gt;
* Definir de forma común los productos que pueden ser ofrecidos dentro de la red interoperable.&lt;br /&gt;
* Permitir que los usuarios realicen validaciones en toda la red interoperable conforme a las reglas establecidas por el comité rector.&lt;br /&gt;
* Permitir que los usuarios realicen recargas de productos mediante distribuidores autorizados.&lt;br /&gt;
&lt;br /&gt;
=== Certificaciones de operadores tecnológicos para incorporación al SIR ===&lt;br /&gt;
Para integrarse a la red interoperable es necesario cumplir los requisitos establecidos en el Manual de Procesos y aprobar las pruebas de certificación correspondientes a los niveles 0–1 y 3–4.&lt;br /&gt;
&lt;br /&gt;
=== Alcances mínimos de equipos y servicios prestados por el operador tecnológico a cada EUR ===&lt;br /&gt;
Las especificaciones técnicas de hardware y software que deben suministrar los operadores tecnológicos para cada Entidad Usuaria de Recaudo (EUR), incluyendo EUR Tren, EUR Masivo y EUR Colectivo, se encuentran definidas en el &#039;&#039;Catálogo de Especificaciones Técnicas por EUR&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Dicho catálogo se actualiza periódicamente y la versión más reciente publicada es la que debe considerarse vigente.&lt;br /&gt;
&lt;br /&gt;
== Tipos de productos ==&lt;br /&gt;
Los medios de pago deben tener la capacidad de almacenar, como mínimo, cuatro productos: un monedero, un producto de viaje a crédito, y dos productos de boletos para descuento.&lt;br /&gt;
&lt;br /&gt;
Cada producto debe ser único dentro del medio de pago, por lo que únicamente puede existir una instancia de cada uno con la excepción de los boletos para descuento, en cuyo caso solo se pueden cargar dos únicamente con los identificadores distintos asignados descritos en la [[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco#Aplicación interoperable en medios de pago MIFARE DESFire|aplicación interoperable]].&lt;br /&gt;
&lt;br /&gt;
=== Producto Monedero ===&lt;br /&gt;
El producto Monedero permite realizar validaciones para el pago de un pasaje.&lt;br /&gt;
&lt;br /&gt;
Este producto almacena un valor positivo equivalente a la cantidad de dinero recargada por el usuario en dispositivos autorizados de la red interoperable. Dicho valor se actualiza descontando los importes correspondientes a las transacciones de pago realizadas.&lt;br /&gt;
&lt;br /&gt;
La cantidad máxima que puede almacenar este producto está limitada por los parámetros definidos por la administración del sistema interoperable.&lt;br /&gt;
&lt;br /&gt;
El producto Monedero puede utilizarse conjuntamente con el producto Crédito para completar el pago de una tarifa cuando el saldo disponible sea insuficiente, siempre que dicha funcionalidad se encuentre habilitada y el producto Crédito esté presente en el medio de pago.&lt;br /&gt;
&lt;br /&gt;
Su valor mínimo es cero.&lt;br /&gt;
&lt;br /&gt;
=== Validación a crédito ===&lt;br /&gt;
El producto Crédito permite realizar una validación aun cuando el valor disponible para el pago sea inferior a la tarifa aplicable.&lt;br /&gt;
&lt;br /&gt;
Este producto almacena un valor que se vuelve negativo cuando es utilizado durante una transacción de validación. Dicho saldo negativo regresa a cero cuando es cubierto mediante una operación de recarga.&lt;br /&gt;
&lt;br /&gt;
La funcionalidad de validación a crédito opera conjuntamente con el producto Monedero y únicamente puede utilizarse cuando las reglas de operación del sistema permitan su aplicación.&lt;br /&gt;
&lt;br /&gt;
Durante una recarga del producto Monedero, el pago del saldo pendiente del producto Crédito tiene prioridad. Una vez cubierto el saldo negativo, el valor restante de la recarga se agrega al Monedero.&lt;br /&gt;
&lt;br /&gt;
=== Boletos para descuento ===&lt;br /&gt;
El producto Boletos para descuento, abreviado como BPD, almacena una cantidad de viajes disponibles en su respectivo archivo de valor.&lt;br /&gt;
&lt;br /&gt;
Las reglas del producto pueden restringir su utilización según diversos criterios, incluyendo:&lt;br /&gt;
&lt;br /&gt;
* Día de la semana.&lt;br /&gt;
* Horario de uso.&lt;br /&gt;
* Número máximo de viajes permitidos por día.&lt;br /&gt;
&lt;br /&gt;
La prioridad de este producto es superior a la del Monedero y al producto Crédito. Por lo tanto, cuando el producto esté activo, existan viajes disponibles y se cumplan las condiciones de uso establecidas, el sistema debe utilizar el producto BPD o BPD2 de forma preferente durante una validación.&lt;br /&gt;
&lt;br /&gt;
== Modelo de seguridad ==&lt;br /&gt;
El modelo de seguridad definido para la comunicación entre los medios de pago &#039;&#039;(nivel 0)&#039;&#039; y los lectores de medios de pago &#039;&#039;(nivel 1)&#039;&#039; está basado en criptografía simétrica. En este esquema, ambos dispositivos comparten un secreto denominado &#039;&#039;llave&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
La tecnología [[MIFARE DESFire|MIFARE DESFire EV1]] y [[MIFARE DESFire|MIFARE DESFire EV2]] define los mecanismos necesarios para garantizar la confidencialidad e integridad de la información intercambiada. Asimismo, incorpora un protocolo de autenticación mutua que permite verificar la autenticidad tanto del medio de pago como del lector.&lt;br /&gt;
&lt;br /&gt;
El almacenamiento y uso de las llaves por parte de los lectores debe realizarse mediante [[Módulo de acceso seguro|módulos de acceso seguro (SAM)]]. Estos dispositivos se comunican con los lectores y ejecutan funciones críticas de seguridad, entre ellas:&lt;br /&gt;
&lt;br /&gt;
* Autenticación mutua con el medio de pago.&lt;br /&gt;
* Generación y verificación de códigos de autenticación de mensajes (MAC).&lt;br /&gt;
* Cifrado y descifrado de información.&lt;br /&gt;
&lt;br /&gt;
Esta especificación exige el uso del algoritmo de cifrado por bloques AES definido por el estándar &#039;&#039;Advanced Encryption Standard&#039;&#039; (AES). En consecuencia, toda comunicación entre un módulo SAM y un medio de pago debe utilizar AES con claves de 128 bits.&lt;br /&gt;
&lt;br /&gt;
Las operaciones de seguridad derivadas del uso de AES-128 deben seguir las especificaciones definidas por MIFARE DESFire EV1. Adicionalmente, las llaves almacenadas en los medios de pago deben ser diversificadas de forma que cada una sea única dentro de toda la red interoperable.&lt;br /&gt;
&lt;br /&gt;
== Diversificación de llaves ==&lt;br /&gt;
Todas las llaves almacenadas en los medios de pago deben ser diversificadas. Esto significa que cada llave presente en una tarjeta debe derivarse a partir de una llave maestra almacenada en un [[módulo de acceso seguro]], mediante una función de diversificación criptográfica.&lt;br /&gt;
&lt;br /&gt;
La función de diversificación utilizada debe ser CMAC, de acuerdo con las recomendaciones para llaves AES-128 definidas por NXP.&lt;br /&gt;
&lt;br /&gt;
Los datos utilizados durante el proceso de diversificación están compuestos por los siguientes elementos:&lt;br /&gt;
&lt;br /&gt;
* Identificador único del medio de pago (UID).&lt;br /&gt;
* Identificador de la aplicación donde se almacena la llave (ID_App).&lt;br /&gt;
* Identificador del sistema interoperable (ID_Sistema).&lt;br /&gt;
&lt;br /&gt;
La generación de una llave diversificada se realiza mediante el cálculo de un CMAC utilizando:&lt;br /&gt;
&lt;br /&gt;
* Una llave maestra &#039;&#039;Mk&#039;&#039; almacenada en el módulo SAM.&lt;br /&gt;
* Los datos de diversificación definidos para el medio de pago.&lt;br /&gt;
&lt;br /&gt;
La llave diversificada resultante, denominada &#039;&#039;Ck&#039;&#039;, debe ser única para cada medio de pago de la red interoperable.&lt;br /&gt;
&lt;br /&gt;
Los datos de diversificación se construyen utilizando la siguiente secuencia:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0x01 || UID || ID_App || ID_Sistema&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Donde:&lt;br /&gt;
&lt;br /&gt;
; UID&lt;br /&gt;
: Identificador único del medio de pago.&lt;br /&gt;
&lt;br /&gt;
; ID_App&lt;br /&gt;
: Identificador de la aplicación en la que se encuentra la llave. Para el directorio raíz este valor es &amp;lt;code&amp;gt;0x000000&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
; ID_Sistema&lt;br /&gt;
: Valor asignado al sistema interoperable del Estado de Jalisco.&lt;br /&gt;
&lt;br /&gt;
El resultado del cálculo CMAC corresponde a la llave diversificada que será utilizada por la aplicación o archivo correspondiente dentro del medio de pago.&lt;br /&gt;
[[Archivo:Función_de_diversificación_de_llaves.svg|centro|600x600px|Función de diversificación de llaves]]&lt;br /&gt;
&lt;br /&gt;
== Aplicación interoperable en medios de pago MIFARE DESFire ==&lt;br /&gt;
La aplicación interoperable define la organización de directorios, archivos, llaves criptográficas y estructuras de datos necesarias para la prestación de servicios dentro de la red interoperable de transporte público del Estado de Jalisco. Asimismo, establece la forma en que deben almacenarse los productos tarifarios, los eventos de uso, la información del usuario y los parámetros operativos requeridos para la operación del sistema.&lt;br /&gt;
&lt;br /&gt;
Las definiciones presentadas en este capítulo se basan en las capacidades de almacenamiento y seguridad ofrecidas por la plataforma [[MIFARE DESFire|MIFARE DESFire EV1]], así como en los estándares BS EN 1545 para sistemas de recaudo en transporte público.&lt;br /&gt;
&lt;br /&gt;
=== Estructura general de archivos ===&lt;br /&gt;
La estructura interoperable de Jalisco está compuesta por dos aplicaciones:&lt;br /&gt;
&lt;br /&gt;
; Directorio raíz del medio de pago&lt;br /&gt;
: El directorio raíz está presente de forma obligatoria en todos los medios de pago MIFARE DESFire y es seleccionado automáticamente cuando la tarjeta es energizada. Contiene la llave maestra de la tarjeta y controla operaciones administrativas de alto nivel, incluyendo la creación y eliminación de aplicaciones.&lt;br /&gt;
&lt;br /&gt;
; Directorio Jalisco_DF&lt;br /&gt;
: &#039;&#039;Jalisco_DF&#039;&#039; constituye la aplicación interoperable utilizada por la red de recaudo del Estado de Jalisco. Este directorio almacena toda la información necesaria para la emisión, distribución, validación y administración de productos dentro del sistema interoperable.&lt;br /&gt;
&lt;br /&gt;
La aplicación interoperable corresponde a un directorio que contiene los archivos requeridos para la operación del sistema de recaudo.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:center;&amp;quot; |Aplicación (AID)&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; |Archivo / Llave&lt;br /&gt;
! style=&amp;quot;text-align:center;&amp;quot; |File ID&lt;br /&gt;
! style=&amp;quot;text-align:center;&amp;quot; |Tipo&lt;br /&gt;
! style=&amp;quot;text-align:center;&amp;quot; |Presencia&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Directorio raíz&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0x000000&amp;lt;/code&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Llave DESFire#Llave maestra PICC|Llave maestra]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |—&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Llave DESFire|Llave]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Llave maestra de la tarjeta. Controla la creación y eliminación de aplicaciones y permite el acceso administrativo al medio de pago.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;22&amp;quot; style=&amp;quot;text-align:center;&amp;quot; |Jalisco_DF&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0x484000&amp;lt;/code&amp;gt;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Llave DESFire#Llaves de aplicación|Llaves de aplicación]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |—&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Llave DESFire|Llave]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Conjunto de llaves criptográficas utilizadas por la aplicación interoperable para autenticación y control de acceso.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Emisión EF|Emisión_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo estándar DESFire|Estándar]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Información invariable relacionada con la emisión e identificación del medio de pago.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Entorno EF|Entorno_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo estándar DESFire|Estándar]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Parámetros generales de la aplicación interoperable y de la red en la que el medio de pago es aceptado.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Usuario EF|Usuario_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x03&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo estándar DESFire|Estándar]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Información del titular del medio de pago y del perfil tarifario asociado, cuando aplique.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Funcionario EF|Funcionario_EF]]&lt;br /&gt;
|&amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
|[[Archivo con respaldo DESFire|Backup]]&lt;br /&gt;
|Opcional&lt;br /&gt;
| style=&amp;quot;text-align: center;&amp;quot; |Información propietaria asociada a medios de pago de funcionarios.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/EstadoAplicación EF|EstadoAplicación_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x04&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo con respaldo DESFire|Backup]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Estado operativo de la aplicación interoperable y contadores asociados a su ciclo de vida.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/ListaProductos EF|ListaProductos_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x05&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo con respaldo DESFire|Backup]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Inventario de productos presentes en el medio de pago y punteros a sus archivos asociados.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Eventos EF|Eventos_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x06&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo de registro cíclico DESFire|Cíclico]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Historial cíclico de eventos registrados por operaciones como emisión, distribución, recarga, validación y devolución.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Monedero&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Contrato(Producto) EF|ContratoMonedero_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x07&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo estándar DESFire|Estándar]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Contrato asociado al producto Monedero.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Servicio(Producto) EF|ServicioMonedero_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo con respaldo DESFire|Backup]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Estado operativo e información dinámica del producto Monedero.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Valor(Producto) EF|ValorMonedero_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x09&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo de valor DESFire|Valor]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Obligatorio&lt;br /&gt;
|Saldo disponible del producto Monedero.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Crédito&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Contrato(Producto) EF|ContratoCrédito_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x0A&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo estándar DESFire|Estándar]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Opcional&lt;br /&gt;
|Contrato asociado al producto Crédito.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Servicio(Producto) EF|ServicioCrédito_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x0B&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo con respaldo DESFire|Backup]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Opcional&lt;br /&gt;
|Estado operativo e información dinámica del producto Crédito.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Valor(Producto) EF|ValorCrédito_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x0C&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo de valor DESFire|Valor]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Opcional&lt;br /&gt;
|Valor negativo o saldo pendiente utilizado por el producto Crédito.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |BPD&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Contrato(Producto) EF|ContratoBPD_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x0D&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo estándar DESFire|Estándar]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Condicional&lt;br /&gt;
|Contrato asociado al producto BPD.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Servicio(Producto) EF|ServicioBPD_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x0E&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo con respaldo DESFire|Backup]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Condicional&lt;br /&gt;
|Estado operativo e información dinámica del producto BPD.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Valor(Producto) EF|ValorBPD_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x0F&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo de valor DESFire|Valor]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Condicional&lt;br /&gt;
|Cantidad de viajes disponibles del producto BPD.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |BPD2&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Contrato(Producto) EF|ContratoBPD2_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x12&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo estándar DESFire|Estándar]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Condicional&lt;br /&gt;
|Contrato asociado al producto BPD2.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Servicio(Producto) EF|ServicioBPD2_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x13&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo con respaldo DESFire|Backup]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Condicional&lt;br /&gt;
|Estado operativo e información dinámica del producto BPD2.&lt;br /&gt;
|-&lt;br /&gt;
|[[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco/Valor(Producto) EF|ValorBPD2_EF]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |&amp;lt;code&amp;gt;0x14&amp;lt;/code&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |[[Archivo de valor DESFire|Valor]]&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; |Condicional&lt;br /&gt;
|Cantidad de viajes disponibles del producto BPD2.&lt;br /&gt;
|}&lt;br /&gt;
Los archivos del producto Monedero son requeridos en toda tarjeta operativa. El producto Crédito es opcional. Para boletos de descuento, debe existir al menos una familia de archivos BPD; normalmente se utiliza BPD como producto principal y BPD2 como variante adicional o alternativa.&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Archivo:Funci%C3%B3n_de_diversificaci%C3%B3n_de_llaves.svg&amp;diff=275</id>
		<title>Archivo:Función de diversificación de llaves.svg</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Archivo:Funci%C3%B3n_de_diversificaci%C3%B3n_de_llaves.svg&amp;diff=275"/>
		<updated>2026-06-14T02:27:37Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: Trabajo propio subido con el Asistente de subidas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{es|1=Esquema de demostración de la función de diversificación de llaves.}}&lt;br /&gt;
|date=2020-08-10&lt;br /&gt;
|source={{own}}&lt;br /&gt;
|author=[[User:Nodo Central|Nodo Central]]&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{self|cc-zero}}&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:En&amp;diff=274</id>
		<title>Plantilla:En</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:En&amp;diff=274"/>
		<updated>2026-06-14T02:24:58Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: Plantilla mínima para el asistente de subidas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{{1|}}}&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Plantilla:Es&amp;diff=273</id>
		<title>Plantilla:Es</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Plantilla:Es&amp;diff=273"/>
		<updated>2026-06-14T02:23:46Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: Plantilla mínima para el asistente de subidas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{{1|}}}&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Manual_de_especificaciones_t%C3%A9cnicas_para_el_sistema_interoperable_de_pago_electr%C3%B3nico_del_estado_de_Jalisco&amp;diff=7</id>
		<title>Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Manual_de_especificaciones_t%C3%A9cnicas_para_el_sistema_interoperable_de_pago_electr%C3%B3nico_del_estado_de_Jalisco&amp;diff=7"/>
		<updated>2026-06-14T00:33:08Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: Simplificación temporal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;El &#039;&#039;&#039;manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco&#039;&#039;&#039; define la arquitectura utilizada por la red de recaudo interoperable del transporte público estatal. Este artículo presenta una versión revisada, corregida y actualizada de la última especificación pública disponible.&lt;br /&gt;
&lt;br /&gt;
El manual establece los requisitos para la interoperabilidad entre emisores de tarjetas, distribuidores de productos tarifarios, prestadores de servicio y demás participantes de la red. Asimismo, describe la estructura de datos almacenada en los medios de pago basados en tecnología [[MIFARE DESFire|MIFARE DESFire EV1/EV2]], los mecanismos de seguridad criptográfica empleados, el uso de [[Módulo de acceso seguro|módulos de acceso seguro (SAM)]], los productos tarifarios soportados y los procedimientos operativos necesarios para la emisión, distribución, recarga, validación y administración de los medios de pago.&lt;br /&gt;
&lt;br /&gt;
Además de servir como referencia documental, esta edición incorpora correcciones de formato, aclaraciones técnicas, referencias cruzadas y observaciones derivadas del análisis de la implementación real del sistema interoperable de Jalisco.&lt;br /&gt;
&lt;br /&gt;
== Contenido ==&lt;br /&gt;
&lt;br /&gt;
* [[/Introducción|1 Introducción]]&lt;br /&gt;
* [[/Interoperabilidad|2 Interoperabilidad]]&lt;br /&gt;
* [[/Tipos de productos|3 Tipos de productos]]&lt;br /&gt;
* [[/Modelo de seguridad|4 Modelo de seguridad en nivel 0-1]]&lt;br /&gt;
* [[/Diversificación de llaves|5 Diversificación de llaves]]&lt;br /&gt;
* [[/Aplicación interoperable en medios de pago MIFARE DESFire|6 Aplicación interoperable en medios de pago MIFARE DESFire EV1]]&lt;br /&gt;
* [[/Ciclos de vida|7 Ciclos de vida]]&lt;br /&gt;
* [[/Instrucciones de uso de la aplicación interoperable en medios de pago|8 Instrucciones de uso de la aplicación interoperable en medios de pago]]&lt;br /&gt;
* [[/Modelo interoperable de flujo de datos|9 Modelo interoperable de flujo de datos]]&lt;br /&gt;
* [[/Flujo de datos de eventos|10 Flujo de datos de eventos]]&lt;br /&gt;
* [[/Casos de uso de medios de pago|11 Casos de uso de medios de pago]]&lt;br /&gt;
* [[/Seguridad en el envío de eventos|12 Seguridad en el envío de eventos]]&lt;br /&gt;
* [[/Especificación de los módulos de acceso seguro|13 Especificación de los módulos de acceso seguro (SAM)]]&lt;br /&gt;
* [[/Resumen de los datos que deben ser asignados por el Registrar|14 Resumen de los datos que deben ser asignados por el Registrar]]&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=Manual_de_especificaciones_t%C3%A9cnicas_para_el_sistema_interoperable_de_pago_electr%C3%B3nico_del_estado_de_Jalisco&amp;diff=3</id>
		<title>Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=Manual_de_especificaciones_t%C3%A9cnicas_para_el_sistema_interoperable_de_pago_electr%C3%B3nico_del_estado_de_Jalisco&amp;diff=3"/>
		<updated>2026-06-13T23:53:35Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: Versión inicial del índice del manual&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;El &#039;&#039;&#039;manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco&#039;&#039;&#039; define la arquitectura utilizada por la red de recaudo interoperable del transporte público estatal. Este artículo presenta una versión revisada, corregida y actualizada de la última especificación pública disponible.&lt;br /&gt;
&lt;br /&gt;
El manual establece los requisitos para la interoperabilidad entre emisores de tarjetas, distribuidores de productos tarifarios, prestadores de servicio y demás participantes de la red. Asimismo, describe la estructura de datos almacenada en los medios de pago basados en tecnología [[MIFARE DESFire|MIFARE DESFire EV1/EV2]], los mecanismos de seguridad criptográfica empleados, el uso de [[Módulo de acceso seguro|módulos de acceso seguro (SAM)]], los productos tarifarios soportados y los procedimientos operativos necesarios para la emisión, distribución, recarga, validación y administración de los medios de pago.&lt;br /&gt;
&lt;br /&gt;
Además de servir como referencia documental, esta edición incorpora correcciones de formato, aclaraciones técnicas, referencias cruzadas y observaciones derivadas del análisis de la implementación real del sistema interoperable de Jalisco.&lt;br /&gt;
&lt;br /&gt;
== Contenido ==&lt;br /&gt;
&lt;br /&gt;
* [[/Introducción|1 Introducción]]&lt;br /&gt;
** [[/Introducción#Glosario|1.1 Glosario]]&lt;br /&gt;
** [[/Introducción#Representación de los datos|1.2 Representación de los datos]]&lt;br /&gt;
** [[/Introducción#Especificaciones de la tarjeta MIFARE DESFire EV1 y EV2|1.3 Especificaciones de la tarjeta MIFARE DESFire EV1 y EV2]]&lt;br /&gt;
&lt;br /&gt;
* [[/Interoperabilidad|2 Interoperabilidad]]&lt;br /&gt;
** [[/Interoperabilidad#Actores de la red interoperable|2.1 Actores de la red interoperable]]&lt;br /&gt;
** [[/Interoperabilidad#Especificaciones de la red interoperable|2.2 Especificaciones de la red interoperable]]&lt;br /&gt;
** [[/Interoperabilidad#Especificación de alcances mínimos de equipos y servicios prestados por el integrador tecnológico a cada EUR|2.3 Especificación de alcances mínimos de equipos y servicios prestados por el integrador tecnológico a cada EUR]]&lt;br /&gt;
&lt;br /&gt;
* [[/Tipos de productos|3 Tipos de productos]]&lt;br /&gt;
** [[/Tipos de productos#Producto Monedero|3.1 Producto Monedero]]&lt;br /&gt;
** [[/Tipos de productos#Validación a crédito|3.2 Validación a crédito]]&lt;br /&gt;
** [[/Tipos de productos#BPD (Boletos para Descuento)|3.3 BPD (Boletos para Descuento)]]&lt;br /&gt;
&lt;br /&gt;
* [[/Modelo de seguridad en nivel 0-1|4 Modelo de seguridad en nivel 0-1]]&lt;br /&gt;
&lt;br /&gt;
* [[/Diversificación de llaves|5 Diversificación de llaves]]&lt;br /&gt;
&lt;br /&gt;
* [[/Aplicación interoperable en medios de pago MIFARE DESFire EV1|6 Aplicación interoperable en medios de pago MIFARE DESFire EV1]]&lt;br /&gt;
** [[/Aplicación interoperable en medios de pago MIFARE DESFire EV1#Introducción|6.1 Introducción]]&lt;br /&gt;
** [[/Aplicación interoperable en medios de pago MIFARE DESFire EV1#Especificaciones generales de la estructura de archivos|6.2 Especificaciones generales de la estructura de archivos]]&lt;br /&gt;
** [[/Aplicación interoperable en medios de pago MIFARE DESFire EV1#Directorio raíz del medio de pago|6.3 Directorio raíz del medio de pago]]&lt;br /&gt;
** [[/Aplicación interoperable en medios de pago MIFARE DESFire EV1#Directorio Jalisco_DF|6.4 Directorio Jalisco_DF]]&lt;br /&gt;
*** [[/Aplicación interoperable en medios de pago MIFARE DESFire EV1#Archivo Emisión_EF|6.4.1 Archivo Emisión_EF]]&lt;br /&gt;
*** [[/Aplicación interoperable en medios de pago MIFARE DESFire EV1#Archivo Entorno_EF|6.4.2 Archivo Entorno_EF]]&lt;br /&gt;
*** [[/Aplicación interoperable en medios de pago MIFARE DESFire EV1#Archivo Usuario_EF|6.4.3 Archivo Usuario_EF]]&lt;br /&gt;
*** [[/Aplicación interoperable en medios de pago MIFARE DESFire EV1#Archivo Funcionario_EF|6.4.4 Archivo Funcionario_EF]]&lt;br /&gt;
*** [[/Aplicación interoperable en medios de pago MIFARE DESFire EV1#Archivo EstadoAplicación_EF|6.4.5 Archivo EstadoAplicación_EF]]&lt;br /&gt;
*** [[/Aplicación interoperable en medios de pago MIFARE DESFire EV1#Archivo ListaProductos_EF|6.4.6 Archivo ListaProductos_EF]]&lt;br /&gt;
*** [[/Aplicación interoperable en medios de pago MIFARE DESFire EV1#Archivo Eventos_EF|6.4.7 Archivo Eventos_EF]]&lt;br /&gt;
*** [[/Aplicación interoperable en medios de pago MIFARE DESFire EV1#Archivo Contrato(Producto)_EF|6.4.8 Archivo Contrato(Producto)_EF]]&lt;br /&gt;
*** [[/Aplicación interoperable en medios de pago MIFARE DESFire EV1#Archivo Servicio(Producto)_EF|6.4.9 Archivo Servicio(Producto)_EF]]&lt;br /&gt;
*** [[/Aplicación interoperable en medios de pago MIFARE DESFire EV1#Archivo Valor(Producto)_EF|6.4.10 Archivo Valor(Producto)_EF]]&lt;br /&gt;
&lt;br /&gt;
* [[/Ciclos de vida|7 Ciclos de vida]]&lt;br /&gt;
** [[/Ciclos de vida#Ciclo de vida de la aplicación interoperable|7.1 Ciclo de vida de la aplicación interoperable]]&lt;br /&gt;
** [[/Ciclos de vida#Ciclo de vida de los productos|7.2 Ciclo de vida de los productos]]&lt;br /&gt;
&lt;br /&gt;
* [[/Instrucciones de uso de la aplicación interoperable en medios de pago|8 Instrucciones de uso de la aplicación interoperable en medios de pago]]&lt;br /&gt;
** [[/Instrucciones de uso de la aplicación interoperable en medios de pago#Inicialización de la aplicación en el medio de pago|8.1 Inicialización de la aplicación en el medio de pago]]&lt;br /&gt;
** [[/Instrucciones de uso de la aplicación interoperable en medios de pago#Emisión del medio de pago|8.2 Emisión del medio de pago]]&lt;br /&gt;
** [[/Instrucciones de uso de la aplicación interoperable en medios de pago#Modificación de datos de usuario|8.3 Modificación de datos de usuario]]&lt;br /&gt;
** [[/Instrucciones de uso de la aplicación interoperable en medios de pago#Identificación de productos|8.4 Identificación de productos]]&lt;br /&gt;
** [[/Instrucciones de uso de la aplicación interoperable en medios de pago#Distribución de productos|8.5 Distribución de productos]]&lt;br /&gt;
** [[/Instrucciones de uso de la aplicación interoperable en medios de pago#Recarga de productos|8.6 Recarga de productos]]&lt;br /&gt;
** [[/Instrucciones de uso de la aplicación interoperable en medios de pago#Uso de productos en transacciones de validación|8.7 Uso de productos en transacciones de validación]]&lt;br /&gt;
** [[/Instrucciones de uso de la aplicación interoperable en medios de pago#Reemplazo o reconstrucción del medio de pago|8.8 Reemplazo o reconstrucción del medio de pago]]&lt;br /&gt;
** [[/Instrucciones de uso de la aplicación interoperable en medios de pago#Acciones sobre medios de pago a través de la lista LAM|8.9 Acciones sobre medios de pago a través de la lista LAM]]&lt;br /&gt;
** [[/Instrucciones de uso de la aplicación interoperable en medios de pago#Suspensión de productos a través de la lista LAP_V|8.10 Suspensión de productos a través de la lista LAP_V]]&lt;br /&gt;
** [[/Instrucciones de uso de la aplicación interoperable en medios de pago#Reactivación de productos|8.11 Reactivación de productos]]&lt;br /&gt;
** [[/Instrucciones de uso de la aplicación interoperable en medios de pago#Recarga remota de productos a través de la lista LAP_R|8.12 Recarga remota de productos a través de la lista LAP_R]]&lt;br /&gt;
** [[/Instrucciones de uso de la aplicación interoperable en medios de pago#Renovación de productos|8.13 Renovación de productos]]&lt;br /&gt;
&lt;br /&gt;
* [[/Modelo interoperable de flujo de datos|9 Modelo interoperable de flujo de datos]]&lt;br /&gt;
&lt;br /&gt;
* [[/Flujo de datos de eventos|10 Flujo de datos de eventos]]&lt;br /&gt;
&lt;br /&gt;
* [[/Casos de uso de medios de pago|11 Casos de uso de medios de pago]]&lt;br /&gt;
** [[/Casos de uso de medios de pago#Emisión de medio de pago tarifa general|11.1 Emisión de medio de pago tarifa general]]&lt;br /&gt;
** [[/Casos de uso de medios de pago#Emisión de medio de pago tarifa preferencial|11.2 Emisión de medio de pago tarifa preferencial]]&lt;br /&gt;
** [[/Casos de uso de medios de pago#Personalización del medio de pago|11.3 Personalización del medio de pago]]&lt;br /&gt;
** [[/Casos de uso de medios de pago#Renovación del perfil de una tarjeta|11.4 Renovación del perfil de una tarjeta]]&lt;br /&gt;
** [[/Casos de uso de medios de pago#Recarga de un producto|11.5 Recarga de un producto]]&lt;br /&gt;
** [[/Casos de uso de medios de pago#Activación y Recarga del producto de BPD|11.6 Activación y Recarga del producto de BPD]]&lt;br /&gt;
** [[/Casos de uso de medios de pago#Validación al ingreso|11.7 Validación al ingreso]]&lt;br /&gt;
*** [[/Casos de uso de medios de pago#Validación con Monedero|11.7.1 Validación con Monedero]]&lt;br /&gt;
*** [[/Casos de uso de medios de pago#Validación con Monedero y Crédito simultáneamente|11.7.2 Validación con Monedero y Crédito simultáneamente]]&lt;br /&gt;
*** [[/Casos de uso de medios de pago#Validación con BPD|11.7.3 Validación con BPD]]&lt;br /&gt;
** [[/Casos de uso de medios de pago#Reemplazo o reconstrucción del medio de pago|11.8 Reemplazo o reconstrucción del medio de pago]]&lt;br /&gt;
** [[/Casos de uso de medios de pago#Bloqueo o desactivación del medio de pago|11.9 Bloqueo o desactivación del medio de pago]]&lt;br /&gt;
** [[/Casos de uso de medios de pago#Desbloqueo del medio de pago|11.10 Desbloqueo del medio de pago]]&lt;br /&gt;
** [[/Casos de uso de medios de pago#Suspensión de productos|11.11 Suspensión de productos]]&lt;br /&gt;
** [[/Casos de uso de medios de pago#Reactivación de productos|11.12 Reactivación de productos]]&lt;br /&gt;
** [[/Casos de uso de medios de pago#Recarga remota de productos a través de la lista LAP_R|11.13 Recarga remota de productos a través de la lista LAP_R]]&lt;br /&gt;
&lt;br /&gt;
* [[/Seguridad en el envío de eventos|12 Seguridad en el envío de eventos]]&lt;br /&gt;
** [[/Seguridad en el envío de eventos#Estructura de seguridad|12.1 Estructura de seguridad]]&lt;br /&gt;
** [[/Seguridad en el envío de eventos#Firma de archivos|12.2 Firma de archivos]]&lt;br /&gt;
&lt;br /&gt;
* [[/Especificación de los módulos de acceso seguro (SAM)|13 Especificación de los módulos de acceso seguro (SAM)]]&lt;br /&gt;
** [[/Especificación de los módulos de acceso seguro (SAM)#Introducción|13.1 Introducción]]&lt;br /&gt;
** [[/Especificación de los módulos de acceso seguro (SAM)#Tipos de SAM|13.2 Tipos de SAM]]&lt;br /&gt;
** [[/Especificación de los módulos de acceso seguro (SAM)#Estructura de los SAM|13.3 Estructura de los SAM]]&lt;br /&gt;
*** [[/Especificación de los módulos de acceso seguro (SAM)#SAM de inicialización|13.3.1 SAM de inicialización]]&lt;br /&gt;
*** [[/Especificación de los módulos de acceso seguro (SAM)#SAM de emisión|13.3.2 SAM de emisión]]&lt;br /&gt;
*** [[/Especificación de los módulos de acceso seguro (SAM)#SAM de emisión de medios de pago precargados|13.3.3 SAM de emisión de medios de pago precargados]]&lt;br /&gt;
*** [[/Especificación de los módulos de acceso seguro (SAM)#SAM de distribución y recarga de Monedero|13.3.4 SAM de distribución y recarga de Monedero]]&lt;br /&gt;
*** [[/Especificación de los módulos de acceso seguro (SAM)#SAM de distribución y recarga de Monedero y Crédito|13.3.5 SAM de distribución y recarga de Monedero y Crédito]]&lt;br /&gt;
*** [[/Especificación de los módulos de acceso seguro (SAM)#SAM de distribución y recarga de BPD|13.3.6 SAM de distribución y recarga de BPD]]&lt;br /&gt;
*** [[/Especificación de los módulos de acceso seguro (SAM)#SAM de distribución y recarga de Monedero, Crédito y BPD|13.3.7 SAM de distribución y recarga de Monedero, Crédito y BPD]]&lt;br /&gt;
*** [[/Especificación de los módulos de acceso seguro (SAM)#SAM de uso de productos|13.3.8 SAM de uso de productos]]&lt;br /&gt;
** [[/Especificación de los módulos de acceso seguro (SAM)#Uso de los SAM en eventos con medios de pago|13.4 Uso de los SAM en eventos con medios de pago]]&lt;br /&gt;
&lt;br /&gt;
* [[/Resumen de los datos que deben ser asignados por el Registrar|14 Resumen de los datos que deben ser asignados por el Registrar]]&lt;br /&gt;
** [[/Resumen de los datos que deben ser asignados por el Registrar#Datos relevantes para toda la red interoperable|14.1 Datos relevantes para toda la red interoperable]]&lt;br /&gt;
** [[/Resumen de los datos que deben ser asignados por el Registrar#Datos relevantes para la aplicación interoperable|14.2 Datos relevantes para la aplicación interoperable]]&lt;br /&gt;
** [[/Resumen de los datos que deben ser asignados por el Registrar#Datos relevantes para el producto Monedero|14.3 Datos relevantes para el producto Monedero]]&lt;br /&gt;
** [[/Resumen de los datos que deben ser asignados por el Registrar#Datos relevantes para el producto Crédito|14.4 Datos relevantes para el producto Crédito]]&lt;br /&gt;
** [[/Resumen de los datos que deben ser asignados por el Registrar#Datos relevantes para el producto BPD|14.5 Datos relevantes para el producto BPD]]&lt;br /&gt;
** [[/Resumen de los datos que deben ser asignados por el Registrar#Datos relevantes para cada emisor de medios de pago|14.6 Datos relevantes para cada emisor de medios de pago]]&lt;br /&gt;
** [[/Resumen de los datos que deben ser asignados por el Registrar#Datos relevantes para cada distribuidor de productos|14.7 Datos relevantes para cada distribuidor de productos]]&lt;br /&gt;
** [[/Resumen de los datos que deben ser asignados por el Registrar#Datos relevantes para cada prestador de servicio|14.8 Datos relevantes para cada prestador de servicio]]&lt;br /&gt;
&lt;br /&gt;
* [[/Referencias|15 Referencias]]&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
	<entry>
		<id>https://nodocentral.org/d/index.php?title=P%C3%A1gina_principal&amp;diff=2</id>
		<title>Página principal</title>
		<link rel="alternate" type="text/html" href="https://nodocentral.org/d/index.php?title=P%C3%A1gina_principal&amp;diff=2"/>
		<updated>2026-06-13T23:14:06Z</updated>

		<summary type="html">&lt;p&gt;Nodo Central: Página principal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bienvenido a la documentación oficial de Nodo Central =&lt;br /&gt;
&lt;br /&gt;
Aquí encontrarás manuales, documentación pública de proyectos, transporte, datos técnicos y notas de investigación.&lt;br /&gt;
&lt;br /&gt;
== Transporte público de Jalisco ==&lt;br /&gt;
&lt;br /&gt;
* [[Manual de especificaciones técnicas para el sistema interoperable de pago electrónico del estado de Jalisco]]&lt;br /&gt;
* [[Mi Movilidad/Manual no oficial]]&lt;br /&gt;
* [[Mi Movilidad/Tarjeta]]&lt;br /&gt;
* [[Mi Movilidad/Rutas]]&lt;br /&gt;
* [[Mi Movilidad/Errores comunes]]&lt;br /&gt;
&lt;br /&gt;
== Proyectos ==&lt;br /&gt;
&lt;br /&gt;
* [[Mi Viaje]]&lt;br /&gt;
* [[Mi Viaje/Manual de usuario]]&lt;br /&gt;
* [[Mi Viaje/Datos técnicos]]&lt;br /&gt;
* [[Nodo Central]]&lt;br /&gt;
&lt;br /&gt;
== Investigación y documentación técnica ==&lt;br /&gt;
&lt;br /&gt;
* [[GTFS]]&lt;br /&gt;
* [[GTFS/Jalisco]]&lt;br /&gt;
* [[NFC]]&lt;br /&gt;
* [[MIFARE DESFire]]&lt;br /&gt;
* [[Notas técnicas]]&lt;br /&gt;
&lt;br /&gt;
== Páginas administrativas ==&lt;br /&gt;
&lt;br /&gt;
* [[Nodo Central:Acerca de]]&lt;br /&gt;
* [[Nodo Central:Política editorial]]&lt;br /&gt;
* [[Nodo Central:Derechos de autor]]&lt;/div&gt;</summary>
		<author><name>Nodo Central</name></author>
	</entry>
</feed>