xonecode 0.31.0 → 0.34.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/web/dist/assets/{EditorDeFichero-ChyJtiiz.js → EditorDeFichero-Cj0knNmP.js} +1 -1
- package/apps/web/dist/assets/index-Ga8fTlWp.js +499 -0
- package/apps/web/dist/assets/{index-IptObD2z.css → index-R3kXj69E.css} +1 -1
- package/apps/web/dist/assets/{php-B91ZcS-9.js → php-MVUx_K96.js} +1 -1
- package/apps/web/dist/assets/{ruby-DrxrTSz0.js → ruby-n-r-AXdi.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/dist/agent/config/fuentesEnRed.js +80 -0
- package/dist/agent/config/fuentesEnRed.js.map +1 -0
- package/dist/agent/config/modelosDeMotor.js +4 -2
- package/dist/agent/config/modelosDeMotor.js.map +1 -1
- package/dist/agent/config/settingsEnDisco.js +26 -0
- package/dist/agent/config/settingsEnDisco.js.map +1 -1
- package/dist/agent/dispositivos/cajasDeMaqueta.js +218 -0
- package/dist/agent/dispositivos/cajasDeMaqueta.js.map +1 -0
- package/dist/agent/dispositivos/geometriaEnDisco.js +107 -0
- package/dist/agent/dispositivos/geometriaEnDisco.js.map +1 -0
- package/dist/agent/dispositivos/juezVisual.js +84 -3
- package/dist/agent/dispositivos/juezVisual.js.map +1 -1
- package/dist/agent/grafo/criticaVisual.js +246 -11
- package/dist/agent/grafo/criticaVisual.js.map +1 -1
- package/dist/agent/grafo/fuentesDeGoogle.js +133 -0
- package/dist/agent/grafo/fuentesDeGoogle.js.map +1 -0
- package/dist/agent/grafo/incorporarAdjunto.js +52 -42
- package/dist/agent/grafo/incorporarAdjunto.js.map +1 -1
- package/dist/agent/grafo/lectorDeReferencias.js +21 -0
- package/dist/agent/grafo/lectorDeReferencias.js.map +1 -1
- package/dist/agent/grafo/perfiles.js +2 -0
- package/dist/agent/grafo/perfiles.js.map +1 -1
- package/dist/agent/motores/motoresLocales.js +429 -0
- package/dist/agent/motores/motoresLocales.js.map +1 -0
- package/dist/agent/motores/trueforge/capacidades.js +9 -6
- package/dist/agent/motores/trueforge/capacidades.js.map +1 -1
- package/dist/agent/motores/trueforge/informesDeHijos.js +39 -7
- package/dist/agent/motores/trueforge/informesDeHijos.js.map +1 -1
- package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js +75 -37
- package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js.map +1 -1
- package/dist/agent/motores/trueforge/memoriaTrueforge.js +24 -4
- package/dist/agent/motores/trueforge/memoriaTrueforge.js.map +1 -1
- package/dist/agent/motores/trueforge/modeloLangchain.js +28 -4
- package/dist/agent/motores/trueforge/modeloLangchain.js.map +1 -1
- package/dist/agent/motores/trueforge/proponerTareas.js +67 -0
- package/dist/agent/motores/trueforge/proponerTareas.js.map +1 -0
- package/dist/agent/motores/trueforge/sesionTrueforge.js +133 -13
- package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
- package/dist/agent/motores/trueforge/toolsDeFichero.js +24 -6
- package/dist/agent/motores/trueforge/toolsDeFichero.js.map +1 -1
- package/dist/agent/sesiones/adjuntosDeSesion.js +192 -5
- package/dist/agent/sesiones/adjuntosDeSesion.js.map +1 -1
- package/dist/agent/subagentes/agentesEnDisco.js +12 -4
- package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
- package/dist/agent/subagentes/ejecutableEnWindows.js +139 -0
- package/dist/agent/subagentes/ejecutableEnWindows.js.map +1 -0
- package/dist/agent/subagentes/subagenteCodex.js +7 -2
- package/dist/agent/subagentes/subagenteCodex.js.map +1 -1
- package/dist/agent/subagentes/subagenteOpencode.js +12 -5
- package/dist/agent/subagentes/subagenteOpencode.js.map +1 -1
- package/dist/agent/tareas/aumentador.js +4 -3
- package/dist/agent/tareas/aumentador.js.map +1 -1
- package/dist/agent/turno/informeDeTraza.js +2 -1
- package/dist/agent/turno/informeDeTraza.js.map +1 -1
- package/dist/agent/turno/interrupts.js +12 -0
- package/dist/agent/turno/interrupts.js.map +1 -1
- package/dist/agent/turno/resumenDeTool.js +4 -0
- package/dist/agent/turno/resumenDeTool.js.map +1 -1
- package/dist/agent/turno/turnoReal.js +3 -0
- package/dist/agent/turno/turnoReal.js.map +1 -1
- package/dist/cli/consola.js.map +1 -1
- package/dist/cli/main.js +2 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/tui/transcript.js +5 -0
- package/dist/cli/tui/transcript.js.map +1 -1
- package/dist/core/actos.js.map +1 -1
- package/dist/core/adjuntos.js +10 -2
- package/dist/core/adjuntos.js.map +1 -1
- package/dist/core/agentes.js +10 -0
- package/dist/core/agentes.js.map +1 -1
- package/dist/core/analisisDeSesion.js +1 -1
- package/dist/core/analisisDeSesion.js.map +1 -1
- package/dist/core/descripcionDePantalla.js +367 -0
- package/dist/core/descripcionDePantalla.js.map +1 -0
- package/dist/core/estiloMedido.js +352 -0
- package/dist/core/estiloMedido.js.map +1 -0
- package/dist/core/fuentes.js +174 -0
- package/dist/core/fuentes.js.map +1 -0
- package/dist/core/geometriaDePantalla.js +537 -0
- package/dist/core/geometriaDePantalla.js.map +1 -0
- package/dist/core/motoresLocales.js +128 -0
- package/dist/core/motoresLocales.js.map +1 -0
- package/dist/core/notify.js +4 -0
- package/dist/core/notify.js.map +1 -1
- package/dist/core/nucleoXone.js +6 -6
- package/dist/core/nucleoXone.js.map +1 -1
- package/dist/core/ports.js +35 -0
- package/dist/core/ports.js.map +1 -1
- package/dist/core/repartoDeEncargo.js +87 -0
- package/dist/core/repartoDeEncargo.js.map +1 -0
- package/dist/core/settings.js +5 -0
- package/dist/core/settings.js.map +1 -1
- package/dist/core/shellDeAgente.js +36 -0
- package/dist/core/shellDeAgente.js.map +1 -1
- package/dist/core/tareas.js +7 -0
- package/dist/core/tareas.js.map +1 -1
- package/dist/core/turno.js +15 -0
- package/dist/core/turno.js.map +1 -1
- package/dist/core/zipDeAdjunto.js +79 -0
- package/dist/core/zipDeAdjunto.js.map +1 -0
- package/dist/web/servidor/arranque.js +201 -13
- package/dist/web/servidor/arranque.js.map +1 -1
- package/dist/web/servidor/consolaWeb.js +5 -0
- package/dist/web/servidor/consolaWeb.js.map +1 -1
- package/dist/web/servidor/interrupcion.js +52 -0
- package/dist/web/servidor/interrupcion.js.map +1 -0
- package/dist/web/servidor/pielWeb.js +36 -0
- package/dist/web/servidor/pielWeb.js.map +1 -1
- package/dist/web/servidor/transporte.js +1 -0
- package/dist/web/servidor/transporte.js.map +1 -1
- package/dist/web/servidor/vestibulo.js +30 -2
- package/dist/web/servidor/vestibulo.js.map +1 -1
- package/package.json +1 -1
- package/skills/xone-development/SKILL.md +2 -1
- package/skills/xone-development/references/css/buenas-practicas-y-parser.md +2 -1
- package/skills/xone-development/references/css/de-una-maqueta-a-xone.md +83 -0
- package/skills/xone-development/references/css/patrones-material-y-temas.md +15 -13
- package/skills/xone-development/references/css/propiedades-y-herencia.md +2 -2
- package/skills/xone-development/references/css/selectores-unidades-colores.md +8 -3
- package/skills/xone-development/references/indice-completo.md +1 -0
- package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +4 -4
- package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +4 -4
- package/skills/xone-hotswap/lib/geometria.mjs +147 -0
- package/skills/xone-hotswap/scripts/xone-captura-android +6 -0
- package/skills/xone-hotswap/scripts/xone-hotswap +8 -0
- package/skills/xone-hotswap/scripts/xone-recargar-android +15 -0
- package/apps/web/dist/assets/index-CFIrUOmW.js +0 -499
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* La GEOMETRÍA de una pantalla: comparar CAJAS, no píxeles. Pura.
|
|
3
|
+
*
|
|
4
|
+
* Existe por una sesión de MyAllXOne (crear una calculadora de Stitch): diez rondas de «cambio el CSS →
|
|
5
|
+
* despliega y captura → compara» porque nada le decía al agente QUÉ estaba mal. El comparador de franjas
|
|
6
|
+
* (`compararCapturas.ts`) da dónde hay contenido, no qué tecla; el SSIM se quedó en 0,44–0,48 en todas
|
|
7
|
+
* las rondas; y el crítico con visión no vio la «=» tapada por la barra de navegación y se inventó
|
|
8
|
+
* diferencias de color. Pero los dos lados se pueden tener como DATOS:
|
|
9
|
+
*
|
|
10
|
+
* - **El aparato** da su árbol de controles (`getAllElements`): cada control con su texto, su nombre y
|
|
11
|
+
* su caja en píxeles. Lo guarda con la captura, en el mismo momento, `xone-captura-android`.
|
|
12
|
+
* - **Una maqueta de Stitch** trae `code.html`: renderizado, da la caja de cada botón con su texto.
|
|
13
|
+
*
|
|
14
|
+
* Dos niveles:
|
|
15
|
+
* 1. **Solo con el aparato** (`hallazgosDelAparato`), haya maqueta o no: lo TAPADO por las barras del
|
|
16
|
+
* sistema (Android dibuja de borde a borde, así que un control puede quedar debajo de la de
|
|
17
|
+
* navegación), lo que se SALE de la pantalla y lo que se SOLAPA.
|
|
18
|
+
* 2. **Con la maqueta** (`compararConMaqueta`): se EMPAREJAN por texto Y posición —por texto solo, el
|
|
19
|
+
* «0» del visor se emparejó con la tecla «0»— y se dice qué FALTA, qué cambia de FILA o de ORDEN, y
|
|
20
|
+
* qué TAMAÑO RELATIVO a sus vecinas cambia. Nada de coordenadas absolutas: las proporciones de la
|
|
21
|
+
* maqueta (390×746) y del aparato (1080×2400) no coinciden, y cada «está 30 px más abajo» sería ruido.
|
|
22
|
+
*
|
|
23
|
+
* Lo que es BLOQUEANTE (tapado, fuera, falta) decide el veredicto; el resto son diferencias.
|
|
24
|
+
*/
|
|
25
|
+
/** Cuántos hallazgos de cada clase como mucho: más es ruido que nadie lee. */
|
|
26
|
+
export const TOPE_DE_HALLAZGOS = 10;
|
|
27
|
+
/** Cuánto (en fracción del alto del control) tiene que meterse bajo una barra para contar como tapado. */
|
|
28
|
+
const FRACCION_TAPADA = 0.1;
|
|
29
|
+
/** Cuánto cambia el tamaño relativo a sus vecinas para decirlo: un 40 %. */
|
|
30
|
+
const CAMBIO_DE_TAMAÑO = 0.4;
|
|
31
|
+
/** Distancia máxima (en fracción de la pantalla) para emparejar un icono sin texto por su posición. */
|
|
32
|
+
const DISTANCIA_PARA_ICONOS = 0.08;
|
|
33
|
+
/**
|
|
34
|
+
* Cuánto puede moverse el borde de una fila (en fracción del ancho de la pantalla) sin que sea noticia. Medido en la
|
|
35
|
+
* calculadora: un teclado cuya cuarta columna acababa en el 87 % del ancho, con la maqueta llegando al 94 %, dejaba
|
|
36
|
+
* una franja vacía a la derecha que ni las filas ni los anchos relativos veían.
|
|
37
|
+
*/
|
|
38
|
+
const ENCAJE = 0.04;
|
|
39
|
+
// ---------------------------------------------------------------- el árbol del aparato
|
|
40
|
+
/** Los controles del árbol de `getAllElements` (lista anidada de nodos con `bounds`), aplanados. */
|
|
41
|
+
export function controlesDelArbol(arbol) {
|
|
42
|
+
const salida = [];
|
|
43
|
+
let contenedores = 0;
|
|
44
|
+
const visitar = (n, padre) => {
|
|
45
|
+
if (Array.isArray(n)) {
|
|
46
|
+
for (const x of n)
|
|
47
|
+
visitar(x, padre);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (n === null || typeof n !== "object")
|
|
51
|
+
return;
|
|
52
|
+
const nodo = n;
|
|
53
|
+
const b = nodo["bounds"];
|
|
54
|
+
if (b !== undefined &&
|
|
55
|
+
nodo["visible"] !== false &&
|
|
56
|
+
typeof b["left"] === "number" &&
|
|
57
|
+
typeof b["top"] === "number" &&
|
|
58
|
+
typeof b["width"] === "number" &&
|
|
59
|
+
typeof b["height"] === "number" &&
|
|
60
|
+
b["width"] > 0 &&
|
|
61
|
+
b["height"] > 0) {
|
|
62
|
+
const texto = typeof nodo["text"] === "string" ? nodo["text"].trim() : "";
|
|
63
|
+
contenedores += 1;
|
|
64
|
+
const yo = contenedores;
|
|
65
|
+
salida.push({
|
|
66
|
+
...(padre === undefined ? {} : { padre }),
|
|
67
|
+
...("visibleBounds" in nodo && nodo["visibleBounds"] === null ? { fueraDeVista: true } : {}),
|
|
68
|
+
...(typeof nodo["name"] === "string" ? { nombre: nodo["name"] } : {}),
|
|
69
|
+
...(texto === "" ? {} : { texto }),
|
|
70
|
+
...(typeof nodo["type"] === "string" ? { tipo: nodo["type"] } : {}),
|
|
71
|
+
...(typeof nodo["propType"] === "string" ? { clase: nodo["propType"] } : {}),
|
|
72
|
+
caja: { x: b["left"], y: b["top"], ancho: b["width"], alto: b["height"] },
|
|
73
|
+
});
|
|
74
|
+
for (const v of Object.values(nodo))
|
|
75
|
+
if (v !== null && typeof v === "object")
|
|
76
|
+
visitar(v, yo);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
for (const v of Object.values(nodo))
|
|
80
|
+
if (v !== null && typeof v === "object")
|
|
81
|
+
visitar(v, padre);
|
|
82
|
+
};
|
|
83
|
+
visitar(arbol);
|
|
84
|
+
return salida;
|
|
85
|
+
}
|
|
86
|
+
/** Un control «de verdad» (con texto, o que no es un contenedor): los marcos llegan de borde a borde y solo meten ruido. */
|
|
87
|
+
/** Un control que se juzga: con texto o que no es un marco, y que se VE (no está fuera por el scroll de su lista). */
|
|
88
|
+
const esHoja = (c) => c.fueraDeVista !== true && (c.texto !== undefined || (c.tipo !== undefined && c.tipo !== "frame" && c.tipo !== "group"));
|
|
89
|
+
/** Cómo se nombra un control en un hallazgo: su texto entre comillas, y su nombre si lo tiene. */
|
|
90
|
+
function nombrar(c) {
|
|
91
|
+
if (c.texto !== undefined && c.nombre !== undefined)
|
|
92
|
+
return `«${c.texto}» (${c.nombre})`;
|
|
93
|
+
return c.texto !== undefined ? `«${c.texto}»` : (c.nombre ?? "un control sin nombre");
|
|
94
|
+
}
|
|
95
|
+
// ---------------------------------------------------------------- nivel 1: solo el aparato
|
|
96
|
+
export function hallazgosDelAparato(g) {
|
|
97
|
+
const bloqueantes = [];
|
|
98
|
+
const diferencias = [];
|
|
99
|
+
const notas = [];
|
|
100
|
+
const hojas = g.controles.filter(esHoja);
|
|
101
|
+
const nav = g.barras?.navegacion;
|
|
102
|
+
const estado = g.barras?.estado;
|
|
103
|
+
if (g.barras === undefined)
|
|
104
|
+
notas.push("sin las barras del sistema: no puedo decir qué queda tapado por ellas");
|
|
105
|
+
for (const c of hojas) {
|
|
106
|
+
const abajo = c.caja.y + c.caja.alto;
|
|
107
|
+
const derecha = c.caja.x + c.caja.ancho;
|
|
108
|
+
if (nav !== undefined && abajo - nav.arriba > c.caja.alto * FRACCION_TAPADA && c.caja.y < nav.abajo) {
|
|
109
|
+
bloqueantes.push(`${nombrar(c)} queda TAPADO por la barra de navegación: acaba en y=${abajo} y la barra empieza en y=${nav.arriba} (${abajo - nav.arriba} px debajo).`);
|
|
110
|
+
}
|
|
111
|
+
else if (estado !== undefined && estado.abajo - c.caja.y > c.caja.alto * FRACCION_TAPADA && abajo > estado.arriba && c.caja.y < estado.abajo) {
|
|
112
|
+
bloqueantes.push(`${nombrar(c)} queda TAPADO por la barra de estado: empieza en y=${c.caja.y} y la barra acaba en y=${estado.abajo}.`);
|
|
113
|
+
}
|
|
114
|
+
else if (c.caja.x < -2 || c.caja.y < -2 || derecha > g.pantalla.ancho + 2 || abajo > g.pantalla.alto + 2) {
|
|
115
|
+
bloqueantes.push(`${nombrar(c)} se SALE de la pantalla (${c.caja.x},${c.caja.y} → ${derecha},${abajo} en una de ${g.pantalla.ancho}×${g.pantalla.alto}).`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Solapes entre controles con texto: dos teclas montadas una encima de otra se ven, pero no se pulsan. Solo entre
|
|
119
|
+
// HERMANOS: un panel que se abre encima del teclado (medido: la cinta de la calculadora) no es un error de maqueta. El
|
|
120
|
+
// árbol de `getAllElements` viene PLANO pero en el orden de la jerarquía (cada marco antes que lo suyo), así que el
|
|
121
|
+
// contenedor es el último marco ANTERIOR en la lista que lo contiene. Por geometría sola, un panel que tapa una tecla
|
|
122
|
+
// entera pasaba por su contenedor.
|
|
123
|
+
const contiene = (m, c) => c.x >= m.x - 1 && c.y >= m.y - 1 && c.x + c.ancho <= m.x + m.ancho + 1 && c.y + c.alto <= m.y + m.alto + 1;
|
|
124
|
+
const contenedor = (c) => {
|
|
125
|
+
if (c.padre !== undefined)
|
|
126
|
+
return c.padre;
|
|
127
|
+
const i = g.controles.indexOf(c);
|
|
128
|
+
for (let k = i - 1; k >= 0; k--) {
|
|
129
|
+
const m = g.controles[k];
|
|
130
|
+
if ((m.tipo === "frame" || m.tipo === "group") && contiene(m.caja, c.caja))
|
|
131
|
+
return m;
|
|
132
|
+
}
|
|
133
|
+
return undefined;
|
|
134
|
+
};
|
|
135
|
+
const conTexto = hojas.filter((c) => c.texto !== undefined);
|
|
136
|
+
for (let i = 0; i < conTexto.length; i++) {
|
|
137
|
+
for (let j = i + 1; j < conTexto.length; j++) {
|
|
138
|
+
if (contenedor(conTexto[i]) !== contenedor(conTexto[j]))
|
|
139
|
+
continue;
|
|
140
|
+
const a = conTexto[i].caja;
|
|
141
|
+
const b = conTexto[j].caja;
|
|
142
|
+
const ancho = Math.min(a.x + a.ancho, b.x + b.ancho) - Math.max(a.x, b.x);
|
|
143
|
+
const alto = Math.min(a.y + a.alto, b.y + b.alto) - Math.max(a.y, b.y);
|
|
144
|
+
if (ancho <= 0 || alto <= 0)
|
|
145
|
+
continue;
|
|
146
|
+
const menor = Math.min(a.ancho * a.alto, b.ancho * b.alto);
|
|
147
|
+
// Uno DENTRO de otro (un texto dentro de su tarjeta) no es un solape: es anidar.
|
|
148
|
+
if (ancho * alto >= menor * 0.95)
|
|
149
|
+
continue;
|
|
150
|
+
if (ancho * alto > menor * 0.2)
|
|
151
|
+
diferencias.push(`${nombrar(conTexto[i])} y ${nombrar(conTexto[j])} se SOLAPAN.`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return { bloqueantes, diferencias, notas };
|
|
155
|
+
}
|
|
156
|
+
// ---------------------------------------------------------------- nivel 2: contra la maqueta
|
|
157
|
+
/** Los signos que se escriben de varias formas. */
|
|
158
|
+
const ALIAS = { "−": "-", "–": "-", "×": "x", "*": "x", "÷": "/" };
|
|
159
|
+
/** Adornos que el aparato pinta delante de un texto («• DEG») y no forman parte de él. */
|
|
160
|
+
const ADORNOS = /[•◦▪●]/g;
|
|
161
|
+
/**
|
|
162
|
+
* El texto con el que se empareja, o `""` si es un ICONO. Los botones de Stitch llevan iconos de Material
|
|
163
|
+
* como ligaduras (`backspace`, `content_copy COPY`): una palabra en minúsculas y con `_` es el nombre de un
|
|
164
|
+
* icono, no texto que se vea.
|
|
165
|
+
*/
|
|
166
|
+
export function textoParaEmparejar(texto) {
|
|
167
|
+
// `[borrar]`: así nombra un icono quien DESCRIBE una maqueta (`maquetaDescrita.ts`).
|
|
168
|
+
if (/^\[[^\]]*\]$/.test(texto.trim()))
|
|
169
|
+
return "";
|
|
170
|
+
const palabras = texto.replace(ADORNOS, " ").trim().split(/\s+/).filter((p) => p !== "");
|
|
171
|
+
const visibles = palabras.filter((p) => !/^[a-z][a-z0-9]*(_[a-z0-9]+)+$/.test(p) && !(palabras.length === 1 && /^[a-z]{4,}$/.test(p)));
|
|
172
|
+
const unido = visibles.join(" ");
|
|
173
|
+
return unido
|
|
174
|
+
.split("")
|
|
175
|
+
.map((c) => ALIAS[c] ?? c)
|
|
176
|
+
.join("")
|
|
177
|
+
.toLowerCase();
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* ¿Lleva LETRAS el texto (ya pasado por `textoParaEmparejar`)? Una cifra o un signo no se empareja por sitio con una
|
|
181
|
+
* palabra: medido en la calculadora, el «19» del visor salía como pareja de «COPY».
|
|
182
|
+
*/
|
|
183
|
+
export function tieneLetras(texto) {
|
|
184
|
+
return /[a-záéíóúüñ]/i.test(texto);
|
|
185
|
+
}
|
|
186
|
+
/** Lo que se VE de un texto: sin el nombre de la ligadura de un icono (`content_copy COPY` → `COPY`). */
|
|
187
|
+
export function textoVisible(texto) {
|
|
188
|
+
const palabras = texto.replace(ADORNOS, " ").trim().split(/\s+/).filter((p) => p !== "");
|
|
189
|
+
const visibles = palabras.filter((p) => !/^[a-z][a-z0-9]*(_[a-z0-9]+)+$/.test(p));
|
|
190
|
+
return (visibles.length > 0 ? visibles : palabras).join(" ");
|
|
191
|
+
}
|
|
192
|
+
/** El centro de una caja en fracción de su pantalla. */
|
|
193
|
+
const centro = (c, ancho, alto) => [(c.x + c.ancho / 2) / ancho, (c.y + c.alto / 2) / alto];
|
|
194
|
+
/**
|
|
195
|
+
* Empareja uno a uno: primero por TEXTO igual, eligiendo entre los iguales el más cercano (así el «0» de
|
|
196
|
+
* la tecla no se empareja con el «0» del visor); después los ICONOS por posición, solo si el más cercano
|
|
197
|
+
* está cerca y libre. Lo que no se empareja se devuelve aparte.
|
|
198
|
+
*/
|
|
199
|
+
export function emparejar(m, g,
|
|
200
|
+
/** Solo por texto: con una maqueta DESCRITA las posiciones son de una rejilla, y un icono «cerca» no significa nada. */
|
|
201
|
+
soloTexto = false) {
|
|
202
|
+
const hojas = g.controles.filter(esHoja);
|
|
203
|
+
const usadosM = new Set();
|
|
204
|
+
const usadosA = new Set();
|
|
205
|
+
const parejas = [];
|
|
206
|
+
const distancia = (e, c) => {
|
|
207
|
+
const [mx, my] = centro(e.caja, m.ancho, m.alto);
|
|
208
|
+
const [ax, ay] = centro(c.caja, g.pantalla.ancho, g.pantalla.alto);
|
|
209
|
+
return Math.abs(mx - ax) + Math.abs(my - ay);
|
|
210
|
+
};
|
|
211
|
+
const candidatas = [];
|
|
212
|
+
m.elementos.forEach((e, i) => {
|
|
213
|
+
const t = textoParaEmparejar(e.texto);
|
|
214
|
+
if (t === "")
|
|
215
|
+
return;
|
|
216
|
+
hojas.forEach((c, j) => {
|
|
217
|
+
if (c.texto !== undefined && textoParaEmparejar(c.texto) === t)
|
|
218
|
+
candidatas.push({ i, j, d: distancia(e, c) });
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
for (const { i, j } of candidatas.sort((a, b) => a.d - b.d)) {
|
|
222
|
+
if (usadosM.has(i) || usadosA.has(j))
|
|
223
|
+
continue;
|
|
224
|
+
usadosM.add(i);
|
|
225
|
+
usadosA.add(j);
|
|
226
|
+
parejas.push({ maqueta: m.elementos[i], aparato: hojas[j] });
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Palabras que dicen OTRA cosa en el mismo sitio: la maqueta de Stitch viene en inglés y el agente escribe en el
|
|
230
|
+
* idioma de la app («COPY» → «COPIAR», «Tape» → «HISTORIAL»). Medido en la calculadora: sin este paso, cada texto
|
|
231
|
+
* traducido salía como BLOQUEANTE («NO está en el aparato») y la pantalla no daba verde nunca; y el paso de iconos
|
|
232
|
+
* de abajo emparejaba «Tape» con la imagen de al lado. Va ANTES que los iconos y solo entre controles con letras.
|
|
233
|
+
*/
|
|
234
|
+
if (!soloTexto) {
|
|
235
|
+
const porSitio = [];
|
|
236
|
+
m.elementos.forEach((e, i) => {
|
|
237
|
+
const t = textoParaEmparejar(e.texto);
|
|
238
|
+
if (usadosM.has(i) || !tieneLetras(t))
|
|
239
|
+
return;
|
|
240
|
+
hojas.forEach((c, j) => {
|
|
241
|
+
if (usadosA.has(j) || c.texto === undefined || !tieneLetras(textoParaEmparejar(c.texto)))
|
|
242
|
+
return;
|
|
243
|
+
const d = distancia(e, c);
|
|
244
|
+
if (d <= DISTANCIA_PARA_ICONOS)
|
|
245
|
+
porSitio.push({ i, j, d });
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
for (const { i, j } of porSitio.sort((a, b) => a.d - b.d)) {
|
|
249
|
+
if (usadosM.has(i) || usadosA.has(j))
|
|
250
|
+
continue;
|
|
251
|
+
usadosM.add(i);
|
|
252
|
+
usadosA.add(j);
|
|
253
|
+
parejas.push({ maqueta: m.elementos[i], aparato: hojas[j], otroTexto: true });
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Iconos —y lo que en la maqueta es texto y en el aparato una IMAGEN («√»)—: por posición, contra
|
|
257
|
+
// controles SIN texto que nadie ha cogido.
|
|
258
|
+
m.elementos.forEach((e, i) => {
|
|
259
|
+
if (soloTexto || usadosM.has(i))
|
|
260
|
+
return;
|
|
261
|
+
// Un DATO de ejemplo (sin letras y que no es botón: «0», «12») no es una imagen en su sitio: medido en Maset, el «0»
|
|
262
|
+
// del contador se emparejaba con el chevron de al lado.
|
|
263
|
+
const t = textoParaEmparejar(e.texto);
|
|
264
|
+
if (e.boton !== true && t !== "" && !tieneLetras(t))
|
|
265
|
+
return;
|
|
266
|
+
let mejor;
|
|
267
|
+
hojas.forEach((c, j) => {
|
|
268
|
+
if (usadosA.has(j) || c.texto !== undefined)
|
|
269
|
+
return;
|
|
270
|
+
const d = distancia(e, c);
|
|
271
|
+
if (mejor === undefined || d < mejor.d)
|
|
272
|
+
mejor = { j, d };
|
|
273
|
+
});
|
|
274
|
+
if (mejor !== undefined && mejor.d <= DISTANCIA_PARA_ICONOS) {
|
|
275
|
+
usadosM.add(i);
|
|
276
|
+
usadosA.add(mejor.j);
|
|
277
|
+
parejas.push({ maqueta: e, aparato: hojas[mejor.j], ...(textoParaEmparejar(e.texto) === "" ? {} : { porPosicion: true }) });
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
return { parejas, sinPareja: m.elementos.filter((_, i) => !usadosM.has(i)) };
|
|
281
|
+
}
|
|
282
|
+
/** Agrupa en FILAS: dos van en la misma si sus centros verticales están a menos de medio alto. Devuelve el índice de fila de cada uno. */
|
|
283
|
+
export function filas(cajas) {
|
|
284
|
+
const orden = cajas.map((c, i) => ({ i, cy: c.y + c.alto / 2, alto: c.alto })).sort((a, b) => a.cy - b.cy);
|
|
285
|
+
const fila = new Array(cajas.length).fill(0);
|
|
286
|
+
let actual = -1;
|
|
287
|
+
let referencia;
|
|
288
|
+
for (const o of orden) {
|
|
289
|
+
if (referencia === undefined || Math.abs(o.cy - referencia.cy) >= Math.min(o.alto, referencia.alto) / 2) {
|
|
290
|
+
actual += 1;
|
|
291
|
+
referencia = { cy: o.cy, alto: o.alto };
|
|
292
|
+
}
|
|
293
|
+
fila[o.i] = actual;
|
|
294
|
+
}
|
|
295
|
+
return fila;
|
|
296
|
+
}
|
|
297
|
+
const mediana = (xs) => {
|
|
298
|
+
const o = [...xs].sort((a, b) => a - b);
|
|
299
|
+
return o.length === 0 ? 0 : o.length % 2 === 1 ? o[(o.length - 1) / 2] : (o[o.length / 2 - 1] + o[o.length / 2]) / 2;
|
|
300
|
+
};
|
|
301
|
+
const etiqueta = (e) => {
|
|
302
|
+
const t = e.texto.trim();
|
|
303
|
+
return /^[a-z][a-z0-9_]*$/.test(t) ? `el icono «${t}»` : `«${t.replace(/^[a-z_]+\s+/, "")}»`;
|
|
304
|
+
};
|
|
305
|
+
const veces = (x) => x.toFixed(1).replace(".", ",");
|
|
306
|
+
const mayuscula = (t) => t.charAt(0).toUpperCase() + t.slice(1);
|
|
307
|
+
export function compararConMaqueta(m, g, modo = {}) {
|
|
308
|
+
const bloqueantes = [];
|
|
309
|
+
const diferencias = [];
|
|
310
|
+
const notas = [];
|
|
311
|
+
const aproximada = modo.aproximada === true;
|
|
312
|
+
const { maqueta: laMaqueta, aparato: elAparato } = modo.nombres ?? { maqueta: "la maqueta", aparato: "el aparato" };
|
|
313
|
+
const { parejas, sinPareja } = emparejar(m, g, aproximada);
|
|
314
|
+
for (const p of parejas) {
|
|
315
|
+
if (p.otroTexto === true) {
|
|
316
|
+
notas.push(`${etiqueta(p.maqueta)} de ${laMaqueta} dice «${textoVisible(p.aparato.texto ?? "")}» en ${elAparato}: otro texto en su sitio (traducido o cambiado), no falta. Comparo su caja igual.`);
|
|
317
|
+
}
|
|
318
|
+
if (p.porPosicion === true)
|
|
319
|
+
notas.push(`${etiqueta(p.maqueta)} de ${laMaqueta} es en ${elAparato} un control SIN texto (${p.aparato.nombre ?? "sin nombre"}): una imagen en su sitio. Comparo su caja igual.`);
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* En una maqueta DESCRITA, un texto sin pareja solo es noticia si su FILA existe en el otro lado (algún
|
|
323
|
+
* vecino suyo sí se emparejó): medido sobre la calculadora, los textos de ejemplo del visor
|
|
324
|
+
* («1,240 × 15% + 450 = 636») no están en el aparato, y no tienen por qué.
|
|
325
|
+
*/
|
|
326
|
+
const filasConPareja = new Set(parejas.map((p) => p.maqueta.caja.y));
|
|
327
|
+
const sinFila = [];
|
|
328
|
+
const datos = [];
|
|
329
|
+
const enImagen = [];
|
|
330
|
+
/**
|
|
331
|
+
* ¿Cae el centro de este texto de la maqueta DENTRO de una imagen del aparato? Entonces está dibujado en ella (un
|
|
332
|
+
* logo SVG con su lema): medido en Maset, «VINS & CAVES • 1777» salía como BLOQUEANTE y está dentro del logo.
|
|
333
|
+
*/
|
|
334
|
+
const dentroDeUnaImagen = (e) => {
|
|
335
|
+
const [cx, cy] = centro(e.caja, m.ancho, m.alto);
|
|
336
|
+
return g.controles.some((c) => {
|
|
337
|
+
if (c.clase !== "IMG" && c.tipo !== "img")
|
|
338
|
+
return false;
|
|
339
|
+
const [x0, y0] = [c.caja.x / g.pantalla.ancho, c.caja.y / g.pantalla.alto];
|
|
340
|
+
const [x1, y1] = [(c.caja.x + c.caja.ancho) / g.pantalla.ancho, (c.caja.y + c.caja.alto) / g.pantalla.alto];
|
|
341
|
+
return cx >= x0 && cx <= x1 && cy >= y0 && cy <= y1;
|
|
342
|
+
});
|
|
343
|
+
};
|
|
344
|
+
for (const e of sinPareja) {
|
|
345
|
+
if (!aproximada && e.boton !== true && textoParaEmparejar(e.texto) !== "" && !tieneLetras(textoParaEmparejar(e.texto))) {
|
|
346
|
+
datos.push(etiqueta(e));
|
|
347
|
+
}
|
|
348
|
+
else if (!aproximada && textoParaEmparejar(e.texto) !== "" && dentroDeUnaImagen(e)) {
|
|
349
|
+
enImagen.push(etiqueta(e));
|
|
350
|
+
}
|
|
351
|
+
else if (textoParaEmparejar(e.texto) === "") {
|
|
352
|
+
if (!aproximada)
|
|
353
|
+
notas.push(`${etiqueta(e)} de ${laMaqueta} no lo puedo emparejar: no tiene texto y nada de ${elAparato} cae cerca de su sitio.`);
|
|
354
|
+
}
|
|
355
|
+
else if (aproximada) {
|
|
356
|
+
if (filasConPareja.has(e.caja.y))
|
|
357
|
+
diferencias.push(`${etiqueta(e)} de ${laMaqueta} no lo encuentro en ${elAparato} con ese texto (puede ser una imagen en su sitio: míralo).`);
|
|
358
|
+
else
|
|
359
|
+
sinFila.push(etiqueta(e));
|
|
360
|
+
}
|
|
361
|
+
else
|
|
362
|
+
bloqueantes.push(`${etiqueta(e)} de ${laMaqueta} NO está en ${elAparato} (ningún control con ese texto).`);
|
|
363
|
+
}
|
|
364
|
+
if (enImagen.length > 0) {
|
|
365
|
+
notas.push(`dibujado dentro de una imagen (no falta): ${enImagen.slice(0, 5).join(", ")}${enImagen.length > 5 ? "…" : ""}.`);
|
|
366
|
+
}
|
|
367
|
+
if (datos.length > 0) {
|
|
368
|
+
notas.push(`datos de ejemplo de ${laMaqueta} que no están en ${elAparato}: ${datos.slice(0, 5).join(", ")}${datos.length > 5 ? "…" : ""} (cifras de muestra, no controles: no faltan).`);
|
|
369
|
+
}
|
|
370
|
+
if (sinFila.length > 0) {
|
|
371
|
+
notas.push(`sin el mismo texto en ${elAparato}, ni en su fila: ${sinFila.slice(0, 5).join(", ")}${sinFila.length > 5 ? "…" : ""} (si son datos de ejemplo de un visor, es normal).`);
|
|
372
|
+
}
|
|
373
|
+
if (parejas.length < 2) {
|
|
374
|
+
notas.push("con menos de dos controles emparejados no hay filas ni tamaños que comparar.");
|
|
375
|
+
return { bloqueantes, diferencias, notas };
|
|
376
|
+
}
|
|
377
|
+
const filaM = filas(parejas.map((p) => p.maqueta.caja));
|
|
378
|
+
const filaA = filas(parejas.map((p) => p.aparato.caja));
|
|
379
|
+
// FILAS: lo que en la maqueta va junto y en el aparato no (o al revés), dicho por fila de la maqueta.
|
|
380
|
+
const porFilaM = new Map();
|
|
381
|
+
filaM.forEach((f, i) => porFilaM.set(f, [...(porFilaM.get(f) ?? []), i]));
|
|
382
|
+
for (const indices of porFilaM.values()) {
|
|
383
|
+
if (indices.length < 2)
|
|
384
|
+
continue;
|
|
385
|
+
const enAparato = new Map();
|
|
386
|
+
for (const i of indices)
|
|
387
|
+
enAparato.set(filaA[i], [...(enAparato.get(filaA[i]) ?? []), i]);
|
|
388
|
+
const nombres = indices
|
|
389
|
+
.slice()
|
|
390
|
+
.sort((a, b) => parejas[a].maqueta.caja.x - parejas[b].maqueta.caja.x)
|
|
391
|
+
.map((i) => etiqueta(parejas[i].maqueta));
|
|
392
|
+
if (enAparato.size > 1) {
|
|
393
|
+
// La parte más grande es «la fila»; lo demás, lo que se ha ido a otra.
|
|
394
|
+
const grupos = [...enAparato.values()].sort((a, b) => b.length - a.length);
|
|
395
|
+
const fuera = grupos.slice(1).flat().map((i) => etiqueta(parejas[i].maqueta));
|
|
396
|
+
diferencias.push(`${mayuscula(`en ${laMaqueta}`)} ${nombres.join(", ")} van en la MISMA fila; en ${elAparato} ${fuera.join(", ")} va${fuera.length > 1 ? "n" : ""} en otra.`);
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
// Misma fila en los dos: el ORDEN de izquierda a derecha.
|
|
400
|
+
const ordenA = indices.slice().sort((a, b) => parejas[a].aparato.caja.x - parejas[b].aparato.caja.x).map((i) => etiqueta(parejas[i].maqueta));
|
|
401
|
+
if (ordenA.join("|") !== nombres.join("|"))
|
|
402
|
+
diferencias.push(`En la fila ${nombres.join(", ")} el ORDEN cambia: en ${elAparato} va ${ordenA.join(", ")}.`);
|
|
403
|
+
}
|
|
404
|
+
// ENCAJE: dónde empieza y acaba cada fila, en fracción del ancho de su pantalla. Solo con las dos medidas (una
|
|
405
|
+
// maqueta descrita es una rejilla y su ancho no es el de nada). Las filas con el mismo desajuste van juntas.
|
|
406
|
+
if (!aproximada) {
|
|
407
|
+
const porcentaje = (x) => `${Math.round(x * 100)} %`;
|
|
408
|
+
const encajes = new Map();
|
|
409
|
+
for (const indices of porFilaM.values()) {
|
|
410
|
+
if (indices.length < 2)
|
|
411
|
+
continue;
|
|
412
|
+
const borde = (lado, ancho) => ({
|
|
413
|
+
izq: Math.min(...indices.map((i) => parejas[i][lado].caja.x)) / ancho,
|
|
414
|
+
der: Math.max(...indices.map((i) => parejas[i][lado].caja.x + parejas[i][lado].caja.ancho)) / ancho,
|
|
415
|
+
});
|
|
416
|
+
const bm = borde("maqueta", m.ancho);
|
|
417
|
+
const ba = borde("aparato", g.pantalla.ancho);
|
|
418
|
+
const primera = etiqueta(parejas[indices.slice().sort((a, b) => parejas[a].maqueta.caja.x - parejas[b].maqueta.caja.x)[0]].maqueta);
|
|
419
|
+
const partes = [];
|
|
420
|
+
if (Math.abs(ba.izq - bm.izq) > ENCAJE)
|
|
421
|
+
partes.push(`empieza{n} en el ${porcentaje(ba.izq)} del ancho (en ${laMaqueta}, en el ${porcentaje(bm.izq)})`);
|
|
422
|
+
if (Math.abs(ba.der - bm.der) > ENCAJE)
|
|
423
|
+
partes.push(`acaba{n} en el ${porcentaje(ba.der)} del ancho (en ${laMaqueta}, en el ${porcentaje(bm.der)})`);
|
|
424
|
+
if (partes.length > 0)
|
|
425
|
+
encajes.set(partes.join(" y "), [...(encajes.get(partes.join(" y ")) ?? []), primera]);
|
|
426
|
+
}
|
|
427
|
+
for (const [como, filas] of encajes) {
|
|
428
|
+
const n = filas.length > 1 ? "n" : "";
|
|
429
|
+
diferencias.push(`${filas.length > 1 ? `Las filas de ${filas.join(", ")}` : `La fila de ${filas[0]}`} ${como.replaceAll("{n}", n)}: no ocupa${n} el mismo ANCHO.`);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
// TAMAÑO relativo a sus vecinas de fila (en la maqueta y en el aparato, cada uno con las suyas). Solo
|
|
433
|
+
// entre BOTONES e imágenes: la caja de una etiqueta es el hueco que le da el layout, no lo que se pinta,
|
|
434
|
+
// y medido sobre la calculadora, «• DEG» salía «2,7 veces el ancho» sin verse distinto.
|
|
435
|
+
const comparable = (i) => {
|
|
436
|
+
const clase = parejas[i].aparato.clase;
|
|
437
|
+
return clase === undefined || clase === "B" || clase === "IMG";
|
|
438
|
+
};
|
|
439
|
+
for (const todos of porFilaM.values()) {
|
|
440
|
+
const indices = todos.filter((i) => comparable(i) && parejas[i].maqueta.sinAncho !== true);
|
|
441
|
+
if (indices.length < 2)
|
|
442
|
+
continue;
|
|
443
|
+
const anchosM = indices.map((i) => parejas[i].maqueta.caja.ancho);
|
|
444
|
+
const anchosA = indices.map((i) => parejas[i].aparato.caja.ancho);
|
|
445
|
+
const medM = mediana(anchosM);
|
|
446
|
+
const medA = mediana(anchosA);
|
|
447
|
+
if (medM <= 0 || medA <= 0)
|
|
448
|
+
continue;
|
|
449
|
+
indices.forEach((i, k) => {
|
|
450
|
+
const rm = anchosM[k] / medM;
|
|
451
|
+
const ra = anchosA[k] / medA;
|
|
452
|
+
if (Math.abs(ra / rm - 1) > CAMBIO_DE_TAMAÑO) {
|
|
453
|
+
diferencias.push(`${etiqueta(parejas[i].maqueta)} mide ${veces(ra)} veces el ancho de las de su fila; en ${laMaqueta}, ${veces(rm)}.`);
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
// PROPORCIÓN de cada control (alto entre ancho): una tecla aplastada o estirada. Si su ANCHO ya se ha
|
|
458
|
+
// dicho, la proporción es la misma noticia contada otra vez.
|
|
459
|
+
if (aproximada)
|
|
460
|
+
return { bloqueantes, diferencias, notas };
|
|
461
|
+
const yaDichos = new Set(diferencias.filter((d) => d.includes("veces el ancho")).map((d) => d.split(" mide ")[0]));
|
|
462
|
+
parejas.forEach((p, i) => {
|
|
463
|
+
if (!comparable(i) || yaDichos.has(etiqueta(p.maqueta)))
|
|
464
|
+
return;
|
|
465
|
+
const pm = p.maqueta.caja.alto / p.maqueta.caja.ancho;
|
|
466
|
+
const pa = p.aparato.caja.alto / p.aparato.caja.ancho;
|
|
467
|
+
if (pm > 0 && Math.abs(pa / pm - 1) > CAMBIO_DE_TAMAÑO && (pa < pm ? pm / pa : pa / pm) > 1.4) {
|
|
468
|
+
diferencias.push(`${etiqueta(p.maqueta)} tiene otra PROPORCIÓN: alto/ancho ${veces(pa)} en el aparato y ${veces(pm)} en la maqueta (${pa < pm ? "más aplastado" : "más estirado"}).`);
|
|
469
|
+
}
|
|
470
|
+
});
|
|
471
|
+
return { bloqueantes, diferencias, notas };
|
|
472
|
+
}
|
|
473
|
+
/** Los dos niveles juntos, recortados al tope, y sin repetir. */
|
|
474
|
+
export function hallazgosDeGeometria(g, m) {
|
|
475
|
+
const aparato = hallazgosDelAparato(g);
|
|
476
|
+
const maqueta = m === undefined ? { bloqueantes: [], diferencias: [], notas: [] } : compararConMaqueta(m, g);
|
|
477
|
+
const unico = (xs) => [...new Set(xs)];
|
|
478
|
+
const recorte = (xs) => xs.length <= TOPE_DE_HALLAZGOS ? xs : [...xs.slice(0, TOPE_DE_HALLAZGOS), `… y ${xs.length - TOPE_DE_HALLAZGOS} más del mismo tipo.`];
|
|
479
|
+
return {
|
|
480
|
+
bloqueantes: recorte(unico([...aparato.bloqueantes, ...maqueta.bloqueantes])),
|
|
481
|
+
diferencias: recorte(unico([...aparato.diferencias, ...maqueta.diferencias])),
|
|
482
|
+
notas: unico([...aparato.notas, ...maqueta.notas]),
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
/** El bloque de texto que ve el agente (y que se le da al crítico como HECHOS). */
|
|
486
|
+
export function informeDeGeometria(h, conMaqueta) {
|
|
487
|
+
const lineas = [
|
|
488
|
+
conMaqueta
|
|
489
|
+
? "GEOMETRÍA, MEDIDA (árbol de controles del aparato contra las cajas de la maqueta: exacta, no es una opinión):"
|
|
490
|
+
: "GEOMETRÍA, MEDIDA (árbol de controles del aparato; sin cajas de la maqueta, solo lo que se ve en el propio aparato):",
|
|
491
|
+
];
|
|
492
|
+
if (h.bloqueantes.length === 0 && h.diferencias.length === 0)
|
|
493
|
+
lineas.push("- Nada: ningún control tapado, fuera de la pantalla o solapado" + (conMaqueta ? ", y la estructura cuadra con la maqueta." : "."));
|
|
494
|
+
for (const b of h.bloqueantes)
|
|
495
|
+
lineas.push(`- ${b}`);
|
|
496
|
+
for (const d of h.diferencias)
|
|
497
|
+
lineas.push(`- ${d}`);
|
|
498
|
+
for (const n of h.notas)
|
|
499
|
+
lineas.push(`- (nota) ${n}`);
|
|
500
|
+
return lineas;
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Los controles que SE VEN en el aparato, en filas de arriba abajo y cada fila de izquierda a derecha: los que
|
|
504
|
+
* tienen texto, y los botones e imágenes sin él. Es la ESTRUCTURA que se le da a quien describe la captura
|
|
505
|
+
* (`descripcionDePantalla.ts`), para que describa estos controles y no se invente otros.
|
|
506
|
+
*/
|
|
507
|
+
/**
|
|
508
|
+
* La caja con la que se mide el ESTILO de un texto del aparato: la suya o la de su ENVOLTORIO. En XOne un botón o una
|
|
509
|
+
* píldora se hace a menudo con un `<frame>` (fondo, borde, radio) y una etiqueta dentro; la maqueta lo tiene como un
|
|
510
|
+
* botón o un `<span>` con su borde. Medida la etiqueta, salía «le falta el borde» y otro color de fondo (Maset: SALIR y
|
|
511
|
+
* el chip «ID»). El envoltorio es el frame MÁS PEQUEÑO que contiene la etiqueta, sin otro texto dentro y con un control
|
|
512
|
+
* más como mucho (el icono del botón). Una tarjeta, con varios textos, no lo es. El árbol del canal es PLANO: la
|
|
513
|
+
* contención se deduce de las cajas. Pura.
|
|
514
|
+
*/
|
|
515
|
+
export function cajaParaElEstilo(c, g) {
|
|
516
|
+
if (c.texto === undefined || c.tipo === "frame")
|
|
517
|
+
return c.caja;
|
|
518
|
+
const contiene = (a, b) => a.x <= b.x + 1 && a.y <= b.y + 1 && a.x + a.ancho >= b.x + b.ancho - 1 && a.y + a.alto >= b.y + b.alto - 1;
|
|
519
|
+
const area = (a) => a.ancho * a.alto;
|
|
520
|
+
const marco = g.controles
|
|
521
|
+
.filter((f) => f.tipo === "frame" && f !== c && contiene(f.caja, c.caja) && area(f.caja) > area(c.caja))
|
|
522
|
+
.sort((a, b) => area(a.caja) - area(b.caja))[0];
|
|
523
|
+
if (marco === undefined)
|
|
524
|
+
return c.caja;
|
|
525
|
+
const dentro = g.controles.filter((o) => o !== marco && o !== c && o.tipo !== "frame" && contiene(marco.caja, o.caja));
|
|
526
|
+
if (dentro.length > 1 || dentro.some((o) => o.texto !== undefined))
|
|
527
|
+
return c.caja;
|
|
528
|
+
return marco.caja;
|
|
529
|
+
}
|
|
530
|
+
export function filasDelAparato(g) {
|
|
531
|
+
const visibles = g.controles.filter((c) => c.texto !== undefined || c.clase === "B" || c.clase === "IMG");
|
|
532
|
+
const indice = filas(visibles.map((c) => c.caja));
|
|
533
|
+
const porFila = new Map();
|
|
534
|
+
visibles.forEach((c, i) => porFila.set(indice[i], [...(porFila.get(indice[i]) ?? []), c]));
|
|
535
|
+
return [...porFila.entries()].sort((a, b) => a[0] - b[0]).map(([, fila]) => fila.sort((a, b) => a.caja.x - b.caja.x));
|
|
536
|
+
}
|
|
537
|
+
//# sourceMappingURL=geometriaDePantalla.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometriaDePantalla.js","sourceRoot":"","sources":["../../src/core/geometriaDePantalla.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAsEH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,0GAA0G;AAC1G,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,4EAA4E;AAC5E,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,uGAAuG;AACvG,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC;;;;GAIG;AACH,MAAM,MAAM,GAAG,IAAI,CAAC;AAEpB,wFAAwF;AAExF,oGAAoG;AACpG,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,OAAO,GAAG,CAAC,CAAU,EAAE,KAAc,EAAQ,EAAE;QACnD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,KAAK,MAAM,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO;QAChD,MAAM,IAAI,GAAG,CAA4B,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAwC,CAAC;QAChE,IACE,CAAC,KAAK,SAAS;YACf,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK;YACzB,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,QAAQ;YAC7B,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ;YAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ;YAC9B,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ;YAC/B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;YACd,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EACf,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,YAAY,IAAI,CAAC,CAAC;YAClB,MAAM,EAAE,GAAG,YAAY,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;gBACzC,GAAG,CAAC,eAAe,IAAI,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrG,GAAG,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrE,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;gBAClC,GAAG,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,GAAG,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5E,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAW,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAW,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAW,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAW,EAAE;aAClH,CAAC,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClG,CAAC,CAAC;IACF,OAAO,CAAC,KAAK,CAAC,CAAC;IACf,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,4HAA4H;AAC5H,sHAAsH;AACtH,MAAM,MAAM,GAAG,CAAC,CAAoB,EAAW,EAAE,CAC/C,CAAC,CAAC,YAAY,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC;AAE3H,kGAAkG;AAClG,SAAS,OAAO,CAAC,CAAoB;IACnC,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;IACzF,OAAO,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,uBAAuB,CAAC,CAAC;AACxF,CAAC;AAED,4FAA4F;AAE5F,MAAM,UAAU,mBAAmB,CAAC,CAAsB;IACxD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC;IACjC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC;IAChC,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IAEhH,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACrC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACxC,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,eAAe,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;YACpG,WAAW,CAAC,IAAI,CACd,GAAG,OAAO,CAAC,CAAC,CAAC,wDAAwD,KAAK,4BAA4B,GAAG,CAAC,MAAM,KAAK,KAAK,GAAG,GAAG,CAAC,MAAM,cAAc,CACtJ,CAAC;QACJ,CAAC;aAAM,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,eAAe,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;YAC/I,WAAW,CAAC,IAAI,CACd,GAAG,OAAO,CAAC,CAAC,CAAC,sDAAsD,CAAC,CAAC,IAAI,CAAC,CAAC,0BAA0B,MAAM,CAAC,KAAK,GAAG,CACrH,CAAC;QACJ,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC3G,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,OAAO,IAAI,KAAK,cAAc,CAAC,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;QAC7J,CAAC;IACH,CAAC;IAED,kHAAkH;IAClH,uHAAuH;IACvH,oHAAoH;IACpH,sHAAsH;IACtH,mCAAmC;IACnC,MAAM,QAAQ,GAAG,CAAC,CAAO,EAAE,CAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IAClJ,MAAM,UAAU,GAAG,CAAC,CAAoB,EAA0C,EAAE;QAClF,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC,KAAK,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC;YAC1B,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC;gBAAE,SAAS;YACpE,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;YAC5B,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACvE,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;gBAAE,SAAS;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3D,iFAAiF;YACjF,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI;gBAAE,SAAS;YAC3C,IAAI,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG;gBAAE,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,cAAc,CAAC,CAAC;QACtH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAC7C,CAAC;AAED,8FAA8F;AAE9F,mDAAmD;AACnD,MAAM,KAAK,GAA2B,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC3F,0FAA0F;AAC1F,MAAM,OAAO,GAAG,SAAS,CAAC;AAE1B;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,qFAAqF;IACrF,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAAE,OAAO,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACzF,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,+BAA+B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvI,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,KAAK;SACT,KAAK,CAAC,EAAE,CAAC;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACzB,IAAI,CAAC,EAAE,CAAC;SACR,WAAW,EAAE,CAAC;AACnB,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACzF,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,+BAA+B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,wDAAwD;AACxD,MAAM,MAAM,GAAG,CAAC,CAAO,EAAE,KAAa,EAAE,IAAY,EAAoB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAEpI;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,CAAgB,EAChB,CAAsB;AACtB,wHAAwH;AACxH,SAAS,GAAG,KAAK;IAEjB,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,CAAC,CAAoB,EAAE,CAAoB,EAAU,EAAE;QACvE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,MAAM,UAAU,GAA0C,EAAE,CAAC;IAC7D,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,EAAE;YAAE,OAAO;QACrB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrB,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAChH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS;QAC/C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,QAAQ,GAA0C,EAAE,CAAC;QAC3D,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3B,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;gBAAE,OAAO;YAC9C,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACrB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBAAE,OAAO;gBACjG,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,IAAI,qBAAqB;oBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,SAAS;YAC/C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,kGAAkG;IAClG,2CAA2C;IAC3C,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3B,IAAI,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO;QACxC,qHAAqH;QACrH,wDAAwD;QACxD,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YAAE,OAAO;QAC5D,IAAI,KAA2C,CAAC;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO;YACpD,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1B,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;gBAAE,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QACH,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,CAAC,IAAI,qBAAqB,EAAE,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAa,EAAE,CAAC,EAAE,CAAC,CAAC;QACxI,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,0IAA0I;AAC1I,MAAM,UAAU,KAAK,CAAC,KAAsB;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3G,MAAM,IAAI,GAAG,IAAI,KAAK,CAAS,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;IAChB,IAAI,UAAoD,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACxG,MAAM,IAAI,CAAC,CAAC;YACZ,UAAU,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,EAAqB,EAAU,EAAE;IAChD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC;AAC1H,CAAC,CAAC;AACF,MAAM,QAAQ,GAAG,CAAC,CAAoB,EAAU,EAAE;IAChD,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACzB,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,CAAC;AAC/F,CAAC,CAAC;AACF,MAAM,KAAK,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACpE,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAahF,MAAM,UAAU,kBAAkB,CAAC,CAAgB,EAAE,CAAsB,EAAE,OAA0B,EAAE;IACvG,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC;IAC5C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IACpH,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;IAC3D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,SAAS,UAAU,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,QAAQ,SAAS,mFAAmF,CAAC,CAAC;QACtM,CAAC;QACD,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,SAAS,UAAU,SAAS,0BAA0B,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,YAAY,mDAAmD,CAAC,CAAC;IACjN,CAAC;IAED;;;;OAIG;IACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B;;;OAGG;IACH,MAAM,iBAAiB,GAAG,CAAC,CAAoB,EAAW,EAAE;QAC1D,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5B,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3E,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5G,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACvH,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;aAAM,IAAI,CAAC,UAAU,IAAI,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YAC9C,IAAI,CAAC,UAAU;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,SAAS,oDAAoD,SAAS,yBAAyB,CAAC,CAAC;QACpJ,CAAC;aAAM,IAAI,UAAU,EAAE,CAAC;YACtB,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,SAAS,uBAAuB,SAAS,4DAA4D,CAAC,CAAC;;gBAC1K,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;;YAAM,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,SAAS,eAAe,SAAS,kCAAkC,CAAC,CAAC;IACpH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,6CAA6C,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/H,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,uBAAuB,SAAS,oBAAoB,SAAS,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,gDAAgD,CAAC,CAAC;IAC3L,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,yBAAyB,SAAS,oBAAoB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,oDAAoD,CAAC,CAAC;IACvL,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;QAC3F,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAExD,sGAAsG;IACtG,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QACjC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC9C,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,OAAO,GAAG,OAAO;aACpB,KAAK,EAAE;aACP,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;aACvE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7C,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACvB,uEAAuE;YACvE,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;YAC3E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/E,WAAW,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,SAAS,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAC9K,SAAS;QACX,CAAC;QACD,0DAA0D;QAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACjJ,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,WAAW,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,SAAS,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7J,CAAC;IAED,+GAA+G;IAC/G,6GAA6G;IAC7G,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC5C,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS;YACjC,MAAM,KAAK,GAAG,CAAC,IAA2B,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC;gBAC7D,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;gBACtE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK;aACtG,CAAC,CAAC;YACH,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAE,CAAC,OAAO,CAAC,CAAC;YACxI,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,oBAAoB,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,kBAAkB,SAAS,WAAW,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACvJ,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,kBAAkB,SAAS,WAAW,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrJ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAChH,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACtC,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;QACrK,CAAC;IACH,CAAC;IAED,sGAAsG;IACtG,yGAAyG;IACzG,wFAAwF;IACxF,MAAM,UAAU,GAAG,CAAC,CAAS,EAAW,EAAE;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,KAAK,CAAC;IACjE,CAAC,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;QAC5F,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;YAAE,SAAS;QACrC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACvB,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC;YAC9B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC;YAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,gBAAgB,EAAE,CAAC;gBAC7C,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC,yCAAyC,SAAS,KAAK,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YAC1I,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IACD,sGAAsG;IACtG,6DAA6D;IAC7D,IAAI,UAAU;QAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnH,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAAE,OAAO;QAChE,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QACtD,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QACtD,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,gBAAgB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC;YAC9F,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,sCAAsC,KAAK,CAAC,EAAE,CAAC,oBAAoB,KAAK,CAAC,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC;QACxL,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAC7C,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,oBAAoB,CAAC,CAAsB,EAAE,CAAiB;IAC5E,MAAM,OAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7G,MAAM,KAAK,GAAG,CAAC,EAAY,EAAY,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,CAAC,EAAY,EAAY,EAAE,CACzC,EAAE,CAAC,MAAM,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,GAAG,iBAAiB,sBAAsB,CAAC,CAAC;IACxI,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7E,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAC7E,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,kBAAkB,CAAC,CAAuB,EAAE,UAAmB;IAC7E,MAAM,MAAM,GAAG;QACb,UAAU;YACR,CAAC,CAAC,+GAA+G;YACjH,CAAC,CAAC,sHAAsH;KAC3H,CAAC;IACF,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,gEAAgE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9M,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACtD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAoB,EAAE,CAAsB;IAC3E,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IAC/D,MAAM,QAAQ,GAAG,CAAC,CAAO,EAAE,CAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IAClJ,MAAM,IAAI,GAAG,CAAC,CAAO,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IAC3C,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS;SACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACvG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IACvC,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvH,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IAClF,OAAO,KAAK,CAAC,IAAI,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAsB;IACpD,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IAC1G,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,GAAG,EAA+B,CAAC;IACvD,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACxH,CAAC"}
|