From 5987502664e7a70165b737ad44cdd6c2e3c97466 Mon Sep 17 00:00:00 2001 From: markosbenitez Date: Mon, 22 Jun 2026 21:05:11 -0300 Subject: [PATCH] feat(schema): esquema declarativo + seed v3 del formulario [4B] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extiende questions con instance_generator/instance_of/hint. Instrumento v3 completo (10 secciones, 50 preguntas) como datos declarativos. Operadores de flujo para multiple_choice: contains, eq_sole. Flujo del formulario en el esquema, no en presentación (ADR-005). Seed solo reemplaza catálogo; no toca evidencia de consentimiento (ADR-003). --- sprints/sprint-4/BRIEF.md | 96 ++++ sprints/sprint-4/ETAPA_4A_PROMPT.md | 104 ++++ sprints/sprint-4/ETAPA_4B_PROMPT.md | 111 ++++ sprints/sprint-4/PASO_0_PRESERVACION.md | 95 ++++ .../Formulario_Mapeo_Corregido.xlsx | Bin 0 -> 60024 bytes .../wizard_formulario_mapeo_v3.html | 481 ++++++++++++++++++ 6 files changed, 887 insertions(+) create mode 100644 sprints/sprint-4/BRIEF.md create mode 100644 sprints/sprint-4/ETAPA_4A_PROMPT.md create mode 100644 sprints/sprint-4/ETAPA_4B_PROMPT.md create mode 100644 sprints/sprint-4/PASO_0_PRESERVACION.md create mode 100644 sprints/sprint-4/referencias/Formulario_Mapeo_Corregido.xlsx create mode 100644 sprints/sprint-4/referencias/wizard_formulario_mapeo_v3.html diff --git a/sprints/sprint-4/BRIEF.md b/sprints/sprint-4/BRIEF.md new file mode 100644 index 0000000..1f7e524 --- /dev/null +++ b/sprints/sprint-4/BRIEF.md @@ -0,0 +1,96 @@ +# BRIEF — Sprint 4: Formulario Wizard v3 + +> Versión objetivo: **3.0.0** · Rama de trabajo: `main` · Preservación: `v2.1.0-stable` + +--- + +## Objetivo en una frase +Reescribir el formulario de encuesta como un wizard pregunta-por-pantalla con +mini-wizard anidado para vínculos familiares, sobre un nuevo instrumento de 10 +secciones, habilitando análisis de datos multi-instancia. + +--- + +## Alcance (qué entra) +- Nuevo modelo de datos: columna `instance_id` en `answers`, nueva constraint única +- Nuevo instrumento v3 (10 secciones, ~38 preguntas base + preguntas por instancia) +- Motor de wizard: grafo de pantallas, navegación, estado, instancias dinámicas +- Componente de pantalla única (una pregunta por pantalla) +- Mini-wizard anidado para vínculos familiares (pregunta 4.1 → instancias) +- Autocomplete de barrios desde dataset INE/DGEEC (`geo_paraguay.json`) +- Subtítulos del "porqué" por sección +- Submit actualizado para enviar `instance_id` por answer +- Barra de progreso dinámica +- RPCs nuevas para preguntas de vínculo con instancias +- Seed v3 limpio (sin migración de datos v2) + +--- + +## Fuera de alcance (explícito) +- ❌ Migración de datos v2.1 → v3 (se decide más adelante, cuando v3 esté estable) +- ❌ Tocar la rama `v2.1.0-stable` +- ❌ RE Index (sprint posterior) +- ❌ Informe descargable (sprint posterior) +- ❌ Autenticación de `/admin/responses` (TECH-DEBT-008) +- ❌ Backup remoto S3 (TECH-DEBT-006) + +--- + +## Decisiones ya tomadas (no renegociar) +1. v3 se desarrolla en `main`. v2 queda preservado en `v2.1.0-stable` + tag `v2.1.0`. +2. v3 arranca con seed limpio — sin datos migrados. +3. `instance_id text DEFAULT 'default'` en `answers`. Constraint: + `UNIQUE (response_id, question_id, instance_id)`. +4. Wizard pregunta-por-pantalla para TODO el formulario tras el consentimiento. +5. Mini-wizard de familiares: una pregunta por pantalla, con badge de contexto + "Familiar X de N". +6. Numeración desde Sección 1 (no "Sección A"). +7. Barrio: autocomplete para ciudades con datos INE, texto libre para el resto. +8. Texto de consentimiento: el del Excel del instrumento v3 (Sección 1). +9. Versionado SemVer + CHANGELOG + tags de Git en cada versión estable. +10. 2-3 familiares es el caso típico; soportar N sin límite duro. + +--- + +## Criterios de éxito (checklist) +- [ ] El formulario funciona end-to-end como wizard, una pregunta por pantalla +- [ ] El mini-wizard de familiares genera instancias correctamente (verificable en DB) +- [ ] Los datos se guardan con `instance_id` correcto por familiar +- [ ] El dashboard sigue funcionando (las preguntas no-instancia usan `instance_id='default'`) +- [ ] Las nuevas RPCs agregan datos de vínculo por instancia +- [ ] El autocomplete de barrios funciona para las ciudades principales +- [ ] La validación visual del wizard coincide con el mockup aprobado +- [ ] `v2.1.0-stable` permanece intacta y restaurable + +--- + +## Etapas del Sprint 4 + +| Etapa | Nombre | Entregable | Dependencia | +|---|---|---|---| +| **4.0** | Preservación v2 | Tag v2.1.0, rama stable, dump, CHANGELOG | — | +| **4A** | Modelo de datos | Migración `instance_id` + constraint | 4.0 | +| **4B** | Seed v3 | Instrumento v3 completo en seed.sql + geo JSON | 4A | +| **4C** | Motor del wizard | Grafo de pantallas, estado, navegación (lógica) | 4B | +| **4D** | Componente de pantalla | UI una-pregunta-por-pantalla + secciones | 4C | +| **4E** | Mini-wizard instancias | Vínculos 4.1 + pantallas por familiar | 4D | +| **4F** | Autocomplete barrios | Campo barrio con dataset INE | 4D | +| **4G** | Submit con instance_id | Guardado correcto multi-instancia | 4E | +| **4H** | RPCs de vínculo | Agregados de datos por instancia en dashboard | 4G | +| **4I** | Validación e2e + tag v3.0.0 | QA visual completo + release | todas | + +--- + +## Orden de ejecución +4.0 → 4A → 4B → 4C → 4D → (4E ∥ 4F) → 4G → 4H → 4I + +Las etapas 4E y 4F pueden ir en paralelo si hay capacidad; si no, 4E primero +(es la más crítica), 4F después. + +--- + +## Notas de versionado por etapa +- Cada etapa cierra con un commit versionado descriptivo. +- Las versiones `3.0.0-alpha.N` se pueden usar para hitos intermedios si se + despliega a un entorno de prueba. +- El tag `v3.0.0` se crea solo en la etapa 4I, cuando todo está validado. \ No newline at end of file diff --git a/sprints/sprint-4/ETAPA_4A_PROMPT.md b/sprints/sprint-4/ETAPA_4A_PROMPT.md new file mode 100644 index 0000000..5318583 --- /dev/null +++ b/sprints/sprint-4/ETAPA_4A_PROMPT.md @@ -0,0 +1,104 @@ +# ETAPA 4A — Modelo de datos: instance_id en answers + +## 1. Objetivo +Agregar la columna `instance_id` a la tabla `answers` y cambiar la constraint +única para soportar múltiples respuestas a la misma pregunta (una por instancia +de vínculo familiar). Es el cambio de base que habilita todo el wizard v3. + +## 2. Contexto previo +- v3 se desarrolla en `main`. v2 está preservado en `v2.1.0-stable`. +- La tabla `answers` actual tiene constraint `UNIQUE (response_id, question_id)`. +- El wizard v3 genera múltiples respuestas para las preguntas 4.2 y 4.3 (una por + cada familiar declarado en 4.1). Sin `instance_id`, esas respuestas colisionan. +- Las preguntas no-vinculadas (la gran mayoría) usan `instance_id = 'default'`. + +## 3. DECISIONES YA TOMADAS — no consultar de nuevo +- Nombre de la columna: `instance_id`, tipo `text`, `DEFAULT 'default'`, NOT NULL. +- Nueva constraint: `UNIQUE (response_id, question_id, instance_id)`. +- Para preguntas normales: `instance_id = 'default'`. +- Para instancias de vínculo: `instance_id = 'familiar_1'`, `'familiar_2'`, etc. +- Esto es una migración nueva, NO modifica migraciones existentes. +- NO se migran datos v2 — el seed v3 arranca limpio (etapa posterior). + +## 4. Tareas + +### 4.1 Nueva migración +Crear `supabase/migrations/20260620000001_add_instance_id.sql`: + +```sql +-- Sprint 4 (v3.0.0) — instance_id para respuestas multi-instancia +-- Habilita el mini-wizard de vínculos familiares (una respuesta por familiar) + +-- 1. Agregar la columna con default para filas existentes +ALTER TABLE public.answers + ADD COLUMN IF NOT EXISTS instance_id text NOT NULL DEFAULT 'default'; + +-- 2. Eliminar la constraint única vieja (nombre real verificado en DB) +ALTER TABLE public.answers + DROP CONSTRAINT IF EXISTS answers_response_id_question_id_key; + +-- 3. Crear la nueva constraint que incluye instance_id +ALTER TABLE public.answers + ADD CONSTRAINT answers_response_question_instance_key + UNIQUE (response_id, question_id, instance_id); + +-- 4. Índice para consultas por instancia (análisis de vínculos) +CREATE INDEX IF NOT EXISTS idx_answers_instance + ON public.answers (question_id, instance_id) + WHERE instance_id != 'default'; +``` + +### 4.2 Verificar el nombre real de la constraint actual +ANTES de escribir el DROP, verificar el nombre exacto de la constraint única +actual de `answers`. El nombre asumido es `answers_response_id_question_id_key` +(convención Postgres), pero confirmar con: + +```sql +SELECT conname FROM pg_constraint +WHERE conrelid = 'public.answers'::regclass AND contype = 'u'; +``` + +Si el nombre difiere, ajustar el `DROP CONSTRAINT` en la migración. +NO ejecutar la migración en producción — solo crear el archivo. + +### 4.3 Actualizar DATA_MODEL.md +Documentar el cambio en `DATA_MODEL.md`: la tabla `answers` ahora tiene +`instance_id` y la nueva constraint. Explicar el patrón 'default' vs 'familiar_N'. + +## 5. Entregables (DoD) +- [ ] Migración `20260620000001_add_instance_id.sql` creada. +- [ ] Nombre real de la constraint actual verificado y usado en el DROP. +- [ ] `DATA_MODEL.md` actualizado con el nuevo esquema de `answers`. +- [ ] La migración es idempotente (`IF EXISTS` / `IF NOT EXISTS`). +- [ ] NO ejecutada en producción. + +## 6. Qué reportar +``` +Verificado: +- Migración creada ✓ +- Nombre real de constraint actual: [nombre] +- DATA_MODEL.md actualizado ✓ +- Idempotencia confirmada ✓ + +Asumido: +- [supuestos sobre el esquema] + +NO ejecutado en producción (pendiente aprobación del director). +``` + +## 7. Qué NO hacer +- ❌ No ejecutar la migración en la DB de producción. +- ❌ No modificar migraciones existentes. +- ❌ No tocar el seed todavía (es la etapa 4B). +- ❌ No migrar datos de v2. +- ❌ No tocar la rama v2.1.0-stable. + +## 8. Versionado +Commit sugerido al cerrar: +``` +feat(data): agregar instance_id a answers para multi-instancia [4A] + +Habilita respuestas múltiples por pregunta (mini-wizard de vínculos). +Nueva constraint UNIQUE(response_id, question_id, instance_id). +Parte del Sprint 4 hacia v3.0.0. +``` \ No newline at end of file diff --git a/sprints/sprint-4/ETAPA_4B_PROMPT.md b/sprints/sprint-4/ETAPA_4B_PROMPT.md new file mode 100644 index 0000000..9fcff30 --- /dev/null +++ b/sprints/sprint-4/ETAPA_4B_PROMPT.md @@ -0,0 +1,111 @@ +# ETAPA 4B — Esquema declarativo del formulario v3 + seed + +## 1. Objetivo +Definir el formulario de cuidadores v3 como un esquema declarativo persistido: +extender el modelo de `questions` para soportar instanciación y nuevos operadores +de flujo, y cargar el instrumento completo (10 secciones) en el seed. La lógica del +flujo vive en estos datos, no en el frontend (ver ADR-005). + +## 2. Contexto previo +- ADR-005 define la arquitectura: esquema declarativo, frontend renderer sin reglas. +- `instance_id` ya existe en `answers` (Etapa 4A). +- El esquema actual de `questions` ya tiene `conditional_rules` JSONB con operadores + `eq` / `eq_any` y acción `show`, auto-target implícito. +- El contenido exacto del instrumento v3 está validado en el mockup aprobado + (`wizard_formulario_mapeo_v3.html`) y en el Excel `Formulario_Mapeo_Corregido.xlsx`. +- El dataset de barrios está en `geo_paraguay_full.json` (va a `public/data/`). + +## 3. DECISIONES YA TOMADAS — no consultar de nuevo +- Se EXTIENDE el modelo existente, no se crea tabla de definición separada (ADR-005). +- Nuevos campos declarativos en `questions`: + - `instance_generator boolean DEFAULT false` — marca la pregunta que genera instancias (4.1) + - `instance_of text DEFAULT NULL` — código del generador del que depende (4.2/4.3 → '4.1') +- Nuevos operadores en `conditional_rules`: agregar acción `hide` y operador para + expresar el salto "Ninguna de las anteriores → salta a sección final". +- Secciones con nombre y descripción (el "porqué"): representación a definir por Claude Code + según lo más limpio (tabla `sections` o registros con metadata) — proponer antes de ejecutar. +- v3 arranca con seed LIMPIO, sin datos migrados. +- El contenido de preguntas es EXACTAMENTE el del mockup validado. + +## 4. Tareas + +### 4.1 Migración de esquema declarativo +Crear `supabase/migrations/20260620000002_form_schema_v3.sql`: +- Agregar `instance_generator boolean NOT NULL DEFAULT false` a `questions`. +- Agregar `instance_of text` a `questions` (nullable). +- Documentar (comentario SQL) el vocabulario extendido de `conditional_rules`: + operadores `eq`, `eq_any`, `not_in`; acciones `show`, `hide`. +- Idempotente (`IF NOT EXISTS`). + +### 4.2 Representación de secciones +Proponer e implementar cómo persistir las 10 secciones con su nombre y descripción +("Texto de ayuda" del Excel). Reportar la propuesta antes de ejecutar si implica +cambio de esquema. Las descripciones de sección están en el BRIEF y el mockup. + +### 4.3 Seed v3 del instrumento +Reescribir el seed del survey (o crear seed v3 separado) con las 10 secciones y todas +las preguntas EXACTAMENTE como el mockup validado: +- Sección 1: Consentimiento (2 checkboxes: requerido + opcional) +- Sección 2: Datos generales (2.1-2.7) +- Sección 3: Prevalencia discapacidad propia (3.1-3.5; 3.1='No' oculta 3.2-3.5) +- Sección 4: Vinculación familiar (4.1 generador de instancias; 4.2 y 4.3 instance_of='4.1') +- Sección 5: Responsabilidad (5.1-5.4; ocultas si "solo niño sin discapacidad") +- Sección 6: Intensidad (6.1-6.4; idem) +- Sección 7: Impacto laboral (7.1-7.6; idem) +- Sección 8: Impacto económico (8.1-8.4) +- Sección 9: Conciencia organizacional (9.1-9.4) +- Sección 10: Comentarios (10.1) +- Flujo "Ninguna de las anteriores" en 4.1 → salta a Sección 10. +- Todas las opciones, hints ("Podés marcar más de una opción"), y flags is_sensitive + exactamente como el mockup. + +### 4.4 Dataset geográfico +Copiar `geo_paraguay_full.json` a `public/data/geo_paraguay.json` del repo. + +### 4.5 Actualizar SEED_SPEC.md +Documentar el instrumento v3 completo como contrato (Principio 4 / AP.11). + +## 5. Entregables (DoD) +- [ ] Migración de esquema declarativo creada (campos de instanciación). +- [ ] Propuesta de representación de secciones reportada (y aplicada si se aprueba). +- [ ] Seed v3 con las 10 secciones, contenido exacto del mockup. +- [ ] `instance_generator` y `instance_of` correctamente seteados en 4.1/4.2/4.3. +- [ ] Flujo declarativo: 3.1='No' oculta 3.2-3.5; "Ninguno" en 4.1 salta a S10; + "solo niño" oculta S5-S7. +- [ ] `geo_paraguay.json` en `public/data/`. +- [ ] `SEED_SPEC.md` actualizado. +- [ ] NO ejecutado en producción (solo archivos). + +## 6. Qué reportar +``` +Verificado: +- Migración de esquema creada ✓ +- Representación de secciones: [propuesta] +- Seed v3: N preguntas, 10 secciones ✓ +- instance_generator/instance_of correctos ✓ +- Reglas de flujo declarativas: [listar las 3 reglas principales] +- geo JSON en public/data ✓ +- SEED_SPEC.md actualizado ✓ + +Asumido: +- [supuestos sobre representación de secciones y operadores] + +NO ejecutado en producción. +``` + +## 7. Qué NO hacer +- ❌ No ejecutar en producción (lo aplica el director vía CLI del VPS). +- ❌ No poner lógica de flujo en el frontend (es la etapa 4D y será renderer). +- ❌ No migrar datos v2. +- ❌ No tocar v2.1.0-stable. +- ❌ No construir el motor genérico (Fase 2). + +## 8. Versionado +Commit sugerido: +``` +feat(schema): esquema declarativo + seed v3 del formulario [4B] + +Extiende questions con instance_generator/instance_of. +Instrumento v3 completo (10 secciones) como datos declarativos. +Flujo del formulario en el esquema, no en presentación (ADR-005). +``` \ No newline at end of file diff --git a/sprints/sprint-4/PASO_0_PRESERVACION.md b/sprints/sprint-4/PASO_0_PRESERVACION.md new file mode 100644 index 0000000..528c698 --- /dev/null +++ b/sprints/sprint-4/PASO_0_PRESERVACION.md @@ -0,0 +1,95 @@ +# PASO 0 — Preservación de v2.1.0 antes de arrancar Sprint 4 + +> Ejecutar ANTES de tocar nada de v3. Estos pasos preservan el estado actual +> estable como punto de retorno seguro. + +--- + +## Objetivo +1. Crear tag `v2.1.0` sobre el commit actual de `main`. +2. Crear rama `v2.1.0-stable` que preserva el código de v2. +3. Generar un dump de la base de datos de producción y versionarlo en esa rama. +4. Crear `CHANGELOG.md` en `main`. +5. Dejar `main` listo para desarrollo de v3. + +--- + +## Secuencia de comandos + +### 1. Asegurarse de estar en main actualizado +```bash +git checkout main +git pull origin main +git status # debe estar limpio +``` + +### 2. Crear el tag de la versión estable actual +```bash +git tag -a v2.1.0 -m "Versión 2.1.0 — formulario lineal, dashboard multitenante, instrumento v2.1" +git push origin v2.1.0 +``` + +### 3. Crear la rama de preservación +```bash +git checkout -b v2.1.0-stable +git push -u origin v2.1.0-stable +``` + +### 4. Generar el dump de la base de datos (en el VPS) +```bash +# En el VPS inq-mart-2: +docker exec supabase-db pg_dump -U postgres --clean --if-exists postgres \ + | gzip > ~/dump_v2.1.0_$(date +%Y%m%d).sql.gz + +# Verificar tamaño +ls -lh ~/dump_v2.1.0_*.sql.gz +``` + +### 5. Traer el dump a la máquina local y agregarlo a la rama +```bash +# En tu Mac, desde el repo, estando en la rama v2.1.0-stable: +mkdir -p db-snapshots +scp administrator@172.20.5.11:~/dump_v2.1.0_*.sql.gz db-snapshots/ + +git add db-snapshots/ +git commit -m "chore(v2.1.0): snapshot de base de datos de producción + +Dump completo de la DB de producción al momento del corte v2.1.0. +Incluye: 3 organizaciones, 3 surveys, 132 questions, 15 responses, ~500 answers. +Preservado antes de iniciar el desarrollo de v3 (wizard)." +git push origin v2.1.0-stable +``` + +### 6. Volver a main y crear el CHANGELOG +```bash +git checkout main +# Crear CHANGELOG.md (contenido en el archivo adjunto) +git add CHANGELOG.md +git commit -m "docs: agregar CHANGELOG con versionado semántico + +Establece la convención SemVer para el proyecto. +v2.1.0 documentada como versión estable actual. +v3.0.0 (wizard) marcada como en desarrollo." +git push origin main +``` + +--- + +## Verificación final +```bash +git tag -l # debe mostrar v2.1.0 +git branch -a # debe mostrar main y v2.1.0-stable +git log --oneline -3 # en main, último commit es el CHANGELOG +``` + +A partir de acá, todo el trabajo de v3 va en `main`. La rama `v2.1.0-stable` +queda congelada como referencia y punto de retorno. + +--- + +## Nota sobre el dump +El dump en `db-snapshots/` permite recrear la DB de v2.1.0 si fuera necesario +volver atrás. Para restaurarlo: +```bash +gunzip -c dump_v2.1.0_YYYYMMDD.sql.gz | docker exec -i supabase-db psql -U postgres -d postgres +``` \ No newline at end of file diff --git a/sprints/sprint-4/referencias/Formulario_Mapeo_Corregido.xlsx b/sprints/sprint-4/referencias/Formulario_Mapeo_Corregido.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..44ea26ca40732510c2bdefce60d06300fe048a19 GIT binary patch literal 60024 zcmeEv1yq$=w>An$cZqa&cWxR4r3F+%8U!SzVJj^vol*vfgmj9q36)Y1Q0eaOX7ByK z=y$xHdp+M_kN>Zc#)>w&6Y- z^6yd=w)Htf?a&U|U;S{)tzu8XjL4T^p@b0Co1|>rhyi!iu{54lG@$oJV6&28)Z1H! zW#mFHJ6~thFZ&p0mk{_pXu77VCnY|{k3H8@hBHO`JVrbRqvN8xUPs=7;)V?RBcC@_ z8O#$44akp>CpTf2dxI*3Fn49sC=W#Gf=JB{PKvGK^u_oeieCYow!=xAoPfv9JYkkF8kkTm}eN)JaDJ69V^OE*`Z zuYY}oGIh8=hH=)5d5$B==kfY$#VPIT7RGWMUz5gNDE8&MgfA}!Aj_zAe#X-bl6eF7 z48P?{uZ;)V4a@gz=a_)<)5FHWuvr@TS{@jFFu3Xu|BwM&@5KY}zAXfAZ)f-)egMH? z8t{!sNP6}b_%-xEf7B2DIRmzz2lCy_E`+c5!es%_L-&}JzDXAz?Xa1MIg{hkUung748z_ z2!S=}kHVdHA&0%A@ckON_#h2Dwg$N{1jA@RsT-Z3q5JUdL(mcI5WczZ5A}TnhBuqQ2P?q`hZ!B~ zApbfF5cTFRXb3h6KLo%tX@c*s`7Zl!hVH{sc58g#8F(2mc-s8<{ZUCtlx%NU8|eO` z$70?n%=bCSSmHxxWQzvDel~c|w{2w*d=Lr(Z}XT$nt(y@>cbro_!b^yzaIoooZdBo zH+w+#Rv`x~CXoHerNL3SEA$ZL2bEU=tL#QLKutz{HzDAojQe0%w7=wRMjh-koE(1C zWWE~-@jqH$t=}Czs)ikSj4GSJ$MN8Mi}1twUdX{hIj>h9oGOI*?@++9U=Qo9vSde4VJ^gN#Os1U@#5verF+Ua}x|})_}LS zccP`!Z0z;WMS`WK#vLg)wtDC^Kr|aiZ%0L^_Os>F;ocmM;K?Wr5Y@(fVW{r`Md<4z zx0d#8iJgNUxWHl(iGD{S7lpMmEMzutUw zv)wht6|wnCU`IXDMjT12hML_mIKYQo!)_GSFq;{lt6CogQn-VRB*eDsn3FEpjdL zta7aKFJNaiK=M#BPZ;?vIzhTJIybs4I&8WJbeHJf({a+})7jH4(NRL~j2^8;!H=py zuxV$o_kknLZgZzH_~7j%3}13ZU2;T2L0xiKH$jFvRd znhe%dPe=x<2JB4$g#B}?%3Ag{PzX8B6O1P~Pq3cgnWCFwn_`;cnqrvZm|~gYje8!^ zKGOhMZr!ITgwj}T&2M(`K#nG{>G!5vRiYZ^EEv&EefbG9dH35}7I~Bd&Oc{iki{*H zrN9hG%6Ncsk@NMFX4-pM)?U~#2GHJ?&cx1a-ba7^avC%WoBKRnzFzyQG5bq2j!Exh zqj{5A7)<#!lo~D49|W~Zl4HcqqqjYJN`#1FU$=iQ0Ucv^BOSPybM^( z=iOcSPR4--SRy|{5*1I?jh`@;304@Lk%5*@NpwV|qM;N3K~82+*qq{QFo~V8VBE9Q zPCt?j?!pGYInX)(2LBQM0RAid1N;#DclgioXYdp7zu;Hk@8Cyh(4eeOYvY^1-0`U} zXtDrgs*>LFnBr?hU<7&s2ywaw(Wa*|9rX@I&#sxQ#)4k(hOt;cakO`1ffa z6@nBu$5&w~7Im;?3vohe`>s|M&wIW&v0g5h0DvUOV2ge(31jS!B;@!tItUFF+t*ysBX2B{1WW?@YXjz*+0jGGgtJwWMw zzsL0;t=UOdQq1AJgmM*a`jF=N8bFgB+95zF$2!_z`snI3aKMFahJG2{0o@4Q4_zMJ z99;+96}}L& z*oMGtXUK9CE@Uc-XDXkwP++!DBDGKywor~RY4cN}DX`ocms3i^psAj-XZ9W6*nDpy zu%KnNHT8bnE-{u|z}w}z#a2UEFbN(=G58Z6x82Z}ssd+|$;NjNA97H52y;6O4OCS) zJ5El#`|v?IFD0~@V|udb8Q!kXc@=Bp#zYQl0X$P$4Xc1P78U`)C~JZ7($-jV25%Q? zdT*DEjK;9^R2JWRP~g|fx9^;@jUt_oq9%_bNRA@E8b#6{MI}ZpJuodPX;kyzRSa)= z$7{*Z9I51e;^)Fc4vZ|yUgT0@u2nZBllh*p%zEJnEa1*E`F6Rwr|;%C4rp{FQeXl_zgOADQ~Bfq_QLn+N`y3L!vDSkWoK|1C3d8;jp8MgOx z!A2eZUg=E_(%-MSeIge)xb(%uE1*pd?We=Lwkl~jxGGsy2@EeN($Y=1iAdL7(pous zAeKD+v9ZBs>ia#E?WqdSfQ1J+mY+B43x4(-f3{un+KK}&Clk|e+OU}6T1xUy-?vlZ zSpowp{&I;$z-p@za}H4O^LdMR4?;k;(E9GbdX`^pg4QmL)u-gO==&X3tj`Qk(kQ2I z18R-a>PYIsYJZ$z<-cFJLjgbVp%!QhnY&9u&`rzLO((@q%fL@3P(sU5LMP#Jq`e|= z;69%Psfk&W-QTch9(t1TVNC*s%Hmxjj78w}7NqE+xCGvl+s8l7j%R_ZoN{Rl zSm=I=e0x@?-C!0P8OQS-ixBWpnisI_icJm$p!3X;66-Wi8o;v4F5Q$22DI#jtF!nZ zalnJSf3+dQ6A$(JZt^jLV;&_Hb{xZc3HmM zZn=i_voV6M*-04#pY(iiqw;in&y%7SaVktO(}Ejo6($Rdyd*>_1tViLefWG=ZP9>u z^7#I8zgOdIWn_K@wV!#+>ZOgB7wbe?MOgM%7)R5m4r6@-V^%dcxK!(uTSeIRxw9hm zu1EF)9~L#bSRY|x*tyU1AAOPxE3UJIdfk%}yS;a=V#z)%ReaJlu$00FJHe^ISp1ONhVq&l#XTS*+U4jhqkEy{N)F10R`DgrP~KyT4>eW>r>2@ALqfA z3~5iFn&OQG9ygNeYg%~Q`{|ngIrY%SQF2jo{v2x-Ot8;Ev?bZkt+MIRW%>hSB+GUB zQXhWey89yHR1+j*iv>MR=&SwsiTzkug*`Nh?MwYHos)03td(qdTTBNFs@!)|iNtOR zyVUZ4vnAZVC4v$XcbIAHJ=inZTEOZHUQdkV4xnx%lkJ+vPy5pUA($gLmd?b*$W!f8 z|3iY|*v++=MT_RQY6Y>I_(P>2x`J2v?|x=Mi7pw_m1jHG$lLOse8ylW9_;i(bQ z7|Jb9_4IJU!64h?PG)*q%Hm3JR$u=E4f2j#4`*vwRt*_)UMnv~GoAklbdvsMC_b+$ zP<+I%(hz(GMpS$sfV^bUBFt~46}#|r$1P4@WDj@YH?u(4iW=^@j&)cVO9#qiF+~2N zVc+<(mz{rhxv!@wK5wa~)um-F9XlA$$W5I1i-|^lqxve+MJWl7J>N0=uuS9r;Ixrz zdyPvLEtw@)K4xS;dshvb<;HYw;G@2yIDQC&NK#=g7WO<@+pnM3tiqBYp9t>n$IiIx zZc66vPA!eP+{nGOB#Dw})JIgq`!iEMup!&oa+@dg*|GIO*|iU|MzfZel(<3S?w*v` zSBiHu*;*fuwwHfNFlB7R{Wo>78t1V`F-<`GeE$9s88lO~Ec^Rf{{9IWG&8f= z`}@xR{^=PsbF(Z5`_caX&qtLHi?e6d#-;jE$wvTXcRe_^;WJ<}Dd2aEAHV(eF>Cpt z-8TQFtuKvrV-_uI>1nLK6n#V-0zV(I<<8c;wx>pgc*w3r7#_PQ6=uy)MkwsUNNf}K zYJYW8Wk4DZ!AL18-MCau`I-l@MhNz5>%GR^o?eao_dnB6q6^JPqTS2JR{xf*WBpjW z3BPH+kc!>UE^40V}2OFhqc}LSn`!@cdTGqF^sF&xV+K%oe0+>9$Ch54rYGXZg#tmsW z!J|&j{1%Sx{PK?Orp15(d6&j|#H=$;G+tZ2S3W>wC-ifLyxci@8=tqb+1eO320X5C z1kiBfu9zVQlXa-`XFqALJiR>vy8iy;J@&h$60M0CsW|Jm&ypqBSbInueF{5BuD$Rx zR|J>o`_%2=md?g9#mq}lV4BndL!@aU$iQC5-m?g?uFn=Bt@D~ROeW1|nh zMQVSURH?1}PnL7Dk-`q0k-a58B@z5J))E|b9n&#MG9(_XTiY)SF+!P)!NmD&49U*#kpE)~+-(_VIC&G*f?T9HOI6B`oy^2(kp zeg8ZadaSo)zq>bmx}c#!McVN4S`YJrb%Mjs6m!&7vb;Z_ZgsB>QqRn*|6-!Q})0iofkk!1sXn;PCv^nD(-ULU#wQE$>@&nR{vo zD}9|>*Bc*bSV)S!2WG1rFLHO&dw}z3ciwuKXbPCnQPH*l#ZLnT%*K4jciHZBIuI$C zw=JZIrQLyPrm)E%IgQdvyHou`dl42zX(>4{!`i*Zt|{W141Jk#HS%ZcvQ6d1;#oD| zQ(E3ZW~%vZj*%jgTJG1}qi&sbdKi~Z^^PMywvYh}vc6_9!}!AAYQlWamSK7xkMLal z?LL9UpGIGp4b{$kxA;;|za9(r!o235BmClx3Gcip!YufZ0`3xu-V+6&;HQclnsZ~lsEakNmL1XqY{v*5;CQ7H%=w^ zQ_Ii7jI>`F=wQo}>kN2)ZFB|J5e(^t-D5)giRA;opmlwIet^cQPZE4jLFECXO1One z1hL9JU6qGJKMSut$|(UFoxOzkdQ~R$1cVG2G4$jy45-@lB-#ujKZz)NTUyhw`JQr= zpwDwB8axnkF+8gi?i86E5#EbBe=&-W{-dSKSSUuTXFalaY87=$|5~r!F(!=ymuj#x)e6cuAB`5A;wXRB*?!|Jq*b6!F z;yH=uY~z@16G(02g>4ffBrqGDU-BGDl7$4m(+tm2P|dp3mLNt@kLo0~+N?TR+naHi7DEcJyf*$Y`0 zA7v?C%ep*}H5n1$WN1eY>I@!#Y#nFD7Ol+|>yi_tniF$#o>@qnbW8iR46I%Zc^2jZ(6Wv9gWUvyFA1 zuX;vH+54)s)74beh9%2DHB+}O(~vz=J2&&%tBVgmsiu8W3lvn16;!)lrkYZw)=Y&u zUZr>4KOL({)|u_CHhq>h^RzZyyf)M4?#nkb^%gRXFJx*x%Dj3l^U6S`k@yNLdULtb z=BD9!T=C0n350C%{A`JsIdSYc3AeNv%C%XxyJ;VGGk)l%f7#8v-0iF^D_RhrmNDDt zr0Jo0Lg>+;$IvtDo&fqTKT&FK;Y>W?Oijj<4gPJ&RznDJc;?BF>5G!?i;{~z8SG>f z-DnirtT89kshRx24S7t(6B>-Y3XQ$W6O|J{0$AgHocTZ;wv(EAF`Zu#T`>L0l=;iR z9uA#c2OzOQ2oeWGAbExmBxQ&|5{Z!gbs=Pb1Blq4GD7zEOTY$PG99oI4TK@Nc$myAWo{z?$Bzh473;F9}*OWGp@2|_MeiV!3fh(OYbkp1-|WPgK* z*q=2*_V-J`23%6w$X*46kl!F?QwSM16d^A=9rh2)uQ_Q-9$=k8hLBO2A>zR%2nDtK z2zhWZA|A|xkO#j-#DnV)TGag-uvePay@91yIU!{t%i$ z@({AWUjjDZl8%5&iXa4u6(W#~BIJ@O2tiVci2XStWPcwJvOk0-r(Xj$;FA7;OI9KR z$tpsS3?l>yLhB3CmIc~~G6GJ-{Q0H){{7LuvU!uOUAoA=d zBNEC(wvJhl3)&~!I2QafsD>6)AFa3C_qgA<7lnjanIVmsJc_8<;V0e5T*Wc zv=-o!m4Hj0GA;kzCI4}>7T}T)z$H(amjC9G-)Sv44a3euN+m)h*)=ugv$PmKZ}Yz# z!11clJq70TQ@X6KGob>ND?cejiBg}Bxix=}Rjj#P?!bXA_*T#_QaVAjx^FNDuQKmW6W3U@w^dp;pOEXMUUM<%Fdi;`ITYmw03DjyNZ_b4I8q}?W@ z+N@v8r~Vd|Q{ghT|FV()2sGBk{2`o~5UxzkZ#8FsYfY!Zi9h((e*zj4uD-81Giea< zLOd+CZ}pdd8&i3(=0k&tztu1PZD2|a-fEJ={8oDTw*eKHl1veql8O+Sk_=8ZB>}U* zRTU5?0>=MKVBVw50C3Jm1m_+^aJEGR=Q2cazJ>_Shy!=B_hWED_|y0o7{wW02~8ZhWrT^{>Re)5sbts3G`zd-5(p(3D+aE;Yzdl8AqBKcJK#~tGDN5eM) z0yv=wBAcR9;qO`Q{|M;zDB(c*5{$?u_*D3Nb-;fFbn9YuCZyf}ENbG{6{q|Y86dZa zLipE06JOkK=hysg0mlE1vXp-;2?XpA7l9-cLiw#z;UAMwza0%A3AGC(p%CI_PlbO> zLj8U;q??cHB~Ob}{-~?`$1y-a9Nh<)w$tL2AIg9KSqu=swAFHEnjo^j`2V;#<)6p^ z?NNe(Z4L+#4W0`BxI_H?XsnCD0J4d- zG=R*n|5cUK;*=k^d5EOJPuiaJ>lmOeG1$@Waf{D{tI7$xs{Wx3LH~n!fp&)ZF@#1S z%MicrUXZxRM^c zUmK%#CI4suQ^ovk5AXhSOGZvi0CCn|wb4mDX%+)kN_c;yLv%07hW}+7UE0UVKPBY< z77`#=_Pr(Jigwh~zieA$*%JNJu9uxnMe8ry?TEa;b_srO$%rS;Wc|yYH4Le*U4q~1 z9{yG@Kel8rp|Yv|RkxytT%_xdoiG0nVb=7HI8GFQ-&34KDW}3z$1~@@O!T*-0jO{k zP@y9teswDRqY8gJ8h{ExfC_04QQ@iZk1G7_XaFkwQ?magf%JQ_|5O;T{@;!Uph7S( z4iF+Gin&_PrJ8B+z}&o1O%^?;Tesf$lroauVpi9|m(0 z3q{1aM-j15gqE%+gc&$SXBPbJjG53sZm;^At@^R_iq{{BlmAPvEwsxrT#bz`1Ik&t*OTqA-@h5fc^f{(HSS;7D3-n zK|CdO=%By7QfFSwA1LTYC?#~?%6`@gE3em@$33V}iVS0U;N{OVNrPbx$t-SJDH zn-_xt1#@6TLgT6Mk1G8AXaFkwQ&YwXybz3t-JJ^mN#DN$IzWZMTnIsk5|UF=$2MNr_S<1@>a0?KKC%68_k5?M&L7ZyVLjP*W`0bTCQ3+rxf4+wgzc7X%kEW07#l3?)%A$?C$paZiyHO}3kP#*5mctmYFv zr^vmVm}if+=s$-ngVedq5}o#Z_F`bNmr0!CUdc#Nn9+s+qdqPSyU4 zo7Ds!w~O8)?bZhf=$Jp<4F9tW-a77ZPgY%3F#!q|Rl>6rRI|Qa#P$~#r6Iq1Flj~S z2h>f{vn3F+#echn?f=c7ohb1{u;v31c||lVHsXuLaVj}~RMY*m(aTyU(Rqk76AuwQ zXn?gf<6CX|tUuz)&zsZE7`<~YjgkgB(@qW^VB68eYWLz)zjbo{#XWH6+{l|h$Q|53 z1nCAjOhs)@CT;d_7byM3U3%mnEh&E$(Bq=Uqnw$Az@F#C;MD=ep(n><0FhU;L&Q8z z2VJI`a(uhoIpT=P4}j^tLj-CHM4)y=#JTE<5wVZcLFbiStZ`GZmKhhNb|mdqMno@> z2t`OloLm~{*f@EF1j+_Z9uaI1iI820*z_|*rlMa0bffd@+N&y~2!UsZ2p%sHdBsXZ z%;R*>|KbX;St*-qfVEp1B2arE1T{iyH)}-f<8;t^wz2N>Q5|;xSA+nr2yA&z9>*LJ zfw~qE``AUuK28VyjkY^>#ZbT%5!z!Qv~2((vJ-$Jw75SV^dGJm;Qaaky1L5LJt}>^ zV-oeganT;CnsLzY{NG43)yTXdN}hxM&~sx^dAq z>Y#BE6jj2wNT6)geY3^{ez3JA1l!x5%z*EiXmo-=iW=aElIzF)oe#_JP5Y7zu(itV*>JrKr{T0Hum=yH=8v~AQ@{t zo6TU~gXvkCboknQHVC?Bc(hf>vt0xB^@nwWp^RV{i>4YHx>U%07wI}Aq#9#%BuzDB z6k;TFbabQx=PpB}AHEoX?>+5#JRDu@Tx~2Z-CTK0TrBNfdA|O@$L;B0&wc#!!%j8K zMqd1LV?>^zygspCg2M!tm4a?%QQuH`j%QEJxZX9G^6=?c@(Ymt=G8d%3h&-;Yx=U8;xp&}5V zZNSWj9mnVd8>nrHu_je8x>p#!O>~UG%NL86OMy3JKZEpdFdzUVEF8@>T^yZUdCVPM zERSE?A^L;*8(LzejCv27zREcDrSskHq>rxJnwdR(M|IaO)WH9&&0uAsyH##i|C!P1 z(Dtl>hq)Sc^%%d&^Q%;5)Qo%iuadh1JyLDl3jNsQ&ZC~i*H^Q%iD0asg$=ok032B zpiuR2{y>pdG=!RXZj7%L9cGFwI?Y4M*~+8c%6qjcEWIh7y4JA4^n8hF>EmK>fCk zw*vgc&BoHf^4p(Zo#TVPk>emOF%FKqWSO>wN~O>Lq1r&9Kh%IpUOiiJD6AaGZg3&1!S}!b^*A0qi&lB95|Rzs~AqBTHWOA@CwOX*mx5z>aA%i zaI?BXs*+#fd_Htv?Pyb!nXazANhc&ZKfviywC*QGRm?MInOMqYG`G5q{;-M$-^G8R4>q)+JQ7jrQ_G`DdgTloLA#dCo$#uRJpD&+4s*R2fU+ z$e6y+<4YYJr*<$FatjFN)0qg(5rFy91q z2l{62-T(MTLH%NxzS3})`ol5B+(+APRECYww~*7@O%$Go5|iA#pxhZ1ChkTr6O9!w zB1(Q;&9$v=M$7Vc>L$4^u1babZSD?trp)~OO+}v@DQmA1(PQrv2G*qp@m)=PV;}U! zY=@sP!jFx#0sVf~CNWlfOSrfoQas64Iq?oKc`d3;u&aRpz zuSD@yTu%%t#?c`juiI~|#tm54t$8L$+FsdGF7%p$b#bRYP~26(Bp5@hIHdU1CtU#! zUC9PQbo|Socwd%a{Rfdek71NNx{y318#f%QqZq@ScnB!AG?3xpMvKk&#}*@o4p zaixHdJq>f_h7cPv5>hqpzwIKtdwpmS;;cxy(}h^=rF5wCyk;rr!~Lp zj`9L_5gr2_x!;mUe_xwIB9I)1BT{r^y>_+MbAN2G@+x~mZqdM$wM5T)LxiT6Jz-jB zr#tLuVI!qRqA`JA!{VmP?TS)u_u0Wv_(uJJ_Som4^yQ(r=?R#H*(62$MG0Z7_{olP zHvX#<)_fU#icc)e9OKwa-CR7KoWxr*J3JKZb6-miiq*N6G2|M;b#t&hrk%X4XUCEA zXrx(bjLkCHxa%Pl+-kFGiU7_UhW9@V~3Fo30UUQXPJ|7 zvp9>A31cK1+n%G*_jsYwJ$ww^Kj?i8d0br8O|M_vn6=IGr8>A2#j}h4O5d$;Deg-p z{&+&U3X{8{2S@X$Qky#E{*hhbSqFMc`_>kUdNAB}BzzUEt4#xy;Yyd^`)@t;%$%m2 zD2*y~PHDS32=+?lvH^o@Bd-h;IC&b0E#v39;5~dpVbfG(G`3)g+UF)$$IljbJt{ys zK=*nK0WrOfV-db2)}2fJLA(HKy4}VBpAg9{-NDNi-?n~In?**^vUR;r;BkVa^NK~DT@@$WYnF}R z(kpwnvY2`YrIYV*_{|VL z%$NdIAxU-qAtAN%cu2KbIRe)>_mNgXd=0MM3xZ7eNoIofck{0uN%$vo(M?st5Ace2 zyFoXHzEH4o?7U?lVR%hJ+I%}}Fo%T-MG4)Y9#nom_(2EGr9w$fIo(_9p7cFNUa?jd z`J`F%?}yl{k)Pq-j^$}+5S=jktmSHwD)GR%W=;b)p4W4OLlHr%!42tL&4LK$vy zc6)nHSl`U!hFHy!=n{mLQqwyg^~)}&p`t+Zu^Tdk+^v2(cTNO*k34k4yGl+=A@^Z^ zL_0b9y8|*82|nbC3Apn1owSw;i^n$_SMa@;ZhHJ zebDK?>^vAWE9NRV7W}*+ky!mPv4Logc8qu2<9lXeI;)a}IjF=->rRxM;{=N8XqWDe zP&cgT$jl(+97fN*Na31)fY16~O?jlExykv)IkF1`V%3)2Ni>=jGgPfygH=v^sZVkF zBkK!so0Ti=he{=l#SU+IJeR4@07-RFIVQITbf;z+pGB*qdQTkE3PyhwIyvc-e*Y#E z>j{qX+2l^D1UcpgLk*H*i6JRT0v9NrIm3ZGCDoyc^44M%?Di#y`hp1yj3nv&dYqFb zOQ5(*4|Hd9G}4bzD~vBbm^?7kRv%#=qPNwby&VK67(S4Q#G#&WAI{+1o{gs!YIqaUXt z1=nxZ3U+zW_PojHnM1qH)t(#GA%D$~Pj{|*YeAbSyY2;xml3cGr z*g#~R2{?&BtnUKKSw}4H8{teJGnh^9%uiXGHm;y65D~Ffu+hg6JDI<&uYRLZ z&7AMdLQ!KLs1ud`grKeUS zbLHO8Mji$gXYs3`%52EqB+xlBIfrY5N&wZa_)KeN*k|UJ&XwDZhjBitG7wDxmxIXK zOta$dgt4?gbZX&f+ON3XF4ZkjG)KQ`kuck+yPi8+B3zqkf*yTa+H~atWtK#ld$EV) z^G{}+>a>r0{3-(FI2Hr+%~*%D&*nvO6TEB1%^k+I0#~FeX1_;$oSEN2CEDsfMVZ%z z9dOBLzUjR^T%H5_H|+Ddb-_3UH8qP1Q(xH zba9Z(w$RTi9LYks1_`ilLdP$}UdOzYD*GC1Y{Q0kPF}Q3i;%zQr8@WB+DF(cFAN4+gwk0Wm7X0t87+`I}- z6O(qJ_@qt30?rei-CImAfj&@O@t{8CQ$K2KuWHFCbS1(aZ zhn+#9t=sJH@0gxG0}tgM^jK;2F^7qb6YMe0)CJ3Y>c@>|(Jj`Mz{{SXSg*C}Y0q&l zqwAh40)usmy0rYj_otqjOFGSGl{iGjjtJyuj3w(xZptwSKeE{30euX(^&}=dJ@CpU zJY3kzypcKF5o}wBDHJ2$i|b7>YS;Bbl-^)|izE-~EeX;w~PD-#} zG&L1G_ThARTSASFa;f?|a+*y${y}-(`(vCF6uVD9iLnu--BxmbY!@% znz{3AL8T>9sgZbIRAeqt7V!++pY7z%cbltJXw3wKLB&g+L4uA4lb<2n$ zl(Y2;9?i{ryCa@$@b1xG@lor_=aXF1pWn_oVY;|jBi-`HBf1jDx65jHF+L@=eVb~} zmR2x`mi=9WXMIwAt|39;vv*EjXOewziaH)*DUEg2kJ?N2CKQ+G}U2A6D%@HxC%kxXht|Vb+ z%Rpn~lKjg^-Y?)}!B^QC#ymB7vR zR`$J{1FyISe_9heW)F?;m0qWz+W~5gc8d|LIpP-2usnv4HP;-@QgvHTv{ftA$cR@J zPn_$2%9PM6*~K3!))FIsM^5Z)qcU1*gr`=>%?o!Py*eMCEM9r0lMan_xJ;piw>U$c zH1?J875m)Si2R#W{9v?49r8;49dB|N0>W~il8`WZljSvb9qQ@&tZhEO}do7#wA3wp4It&fPa<9z)WE86Yo{QgvOIrpmf& zj4dFu`o`Qx9Qsvx54jIq>q5h3LOCgEW^_2|o2%~Ib7hkad67}!Uo{oCKO1>z4u$uN zSZ#gaYEA-Lu%L;Kjp(yI<-2Qm3T4;rCFrU=G${RD(d?}TLJr5H-(028WaDMHpqp9S7R%WNphmLcaM$;j?u+f28h8TGpo87NA`U?)^_Xzq;4;X$%=s4zZX zbwS6McIXwdPk&wpj@?f7VB@8ZHJpznF!a>aTK8-7sRgSkhL=OJdd}FLslPKBWX*PK z8+J8OP^WK<8OxDR5zmPtfzY6Rt1<)bf1awVRnaW~tno}ghDPgbjnC*QEteqI>DHifS8V7EC5@28 z`Cg*v-f=(s7P}xDu&6`zx zcojnlM@NrLwKxhSD>f#WyDQu;()wQ};-9N1)f)ZOh(Fm(Iz1%#lFy-`j7pH$)$={! zSs$9$Z;UAtnFmd&t7M8=nlD%gDo3Scb+GLjP(=>DZcM#y848wZj8H6w z?IrLzdG`g-BGU>zZPc|&t=kh|wGUkk)Wrpp)!_G{hRD_BY4}x6AhEroPF$-mgLLG$ zbsc%Db~VBKD5qC$NO#*qcwvvl@MVZN8VPQucM<2-sqjD6r+U2|&*oiJQd2oa{iav2 z3D5R!?!`;S^9q{%{=;@YM4#P!ot$Lg_a8w}Wb`P7dKV$jeW7L5{sT4sh1LFr9)8|^ z>P~$S*Y2U5WOJYS#f=ylBM-Csq zZ^0~sBSr#W_WYv4Nu{m5Y|QqxO!n&#jTRU)Z6flOnY`yVDtF2aAcZdu7TBK!zcNL6 zIVg~>9W!%C|BR*jrHcCPuqSi&^PB_*4b|)-X|7zZ8H=EuowFZ@pXh#Aw^nnY7!v!G z^Qb^r)_7ag)!^mqjE8t#&!>@$+*fqi63OPQlTCMJwcn)OUXqp88jnQv6~BYjkoILc z+Mg>x7!!15TjczwTf=PA6(X;eJwENU(xnG^E=zxSoOhTuYsB?IoRF7=i)V2u-k>)B zXqR#fUx3%h7*r+K8Yo_wlZUFVAS(lr(EaQ^gm01ziPlwSmR7nXm~BPhX7C~fa%*Ca z7P66M54#>NLpQ4S>M(6MT#!pLb*o_1p6Z;!mn@!z`j0HTeVK<*^MsRtALF{N3(+g01 zsziwA3vNv6%1p1?DiWTDaLnpUM+t3|fr)NE_@u+;8q4LE z$4EE$i#+WiV%RIbXyymhmPHJh=K z8`uN%=MJXw_a(!*O$}l8Vcy-AA532z40Ow!j}t~d=$~IiCrF63wZe!QK%t_*yvg>d z_vz)$avLbF!r-UEmTNiidOryjs8#R4cB)yuA2{h!wi#;nA}!{plBl5d8{WJq&kJA7 zEn3dIeq>+G5BANvswU44S@ta^7cK3`f!veczq$ zbMqb(_})y4C!bc2Aae852i#x2h&b&c~c>e|iA-tsGF{Z{XT_8>35e?VQJvWI3Wit716Y}BFoEUBoDt=vABeAxua z7&)r+I*xXAO0$5wZY^{PJF|n19$DpqdAVaF3|AgqB%p`81xd0KCi53#cddH)y4;m? z2vfmG3<$BgEc7b84rL%;thSR)h?*9i>giC@2BCS{R2l7oZi4O|=Ga`?a}_u5-OgdX zSbm#blsZyrwu<%=ZK%`LeVv%4abiv_?e_Pn%q8{w?FMqY(N>-z7rW_64tb^AFrQNE zO=Hw2yeUGRe4lTp$BN0%_F#vwnvhw+ghG~hj%794=|wCTaYTTEOO7Nm-DAPJcyw(| zYgc*E>#SD6LidymdFkRw%+TgxWL3!0D*<`a^a{?BxnLfpxjW;en_MtQbJ0WmhRN}w zXHK~^7kJ5MQ_?k}h!oCH;>yQ|nNA8V?!OB1$Ew1|eO}@7_ED+jtvZep>XoNV);ZI~ zujj3V>guY}FLS-0U_xEFaqH=4ycSowE0|<;AGWZ|>4&(V-syQy&B)Mx%?5i&O2+2% z@}^L2$wj>S;_=tsnL#a6yoBjO8}9Bt9wIpcrO$EJWFiMDW_UlI;k;ggES2iaQfzhR zvpVbSF6op;1zRV)9`Q!QlGe<|eubJLhEyn>~{AN%?o%~cUMk?wkn~$V zLBlop_zMaku!KS~QM0!&xq)w|>hq zasF8N4`u=dsazT2ELr4M3QWhWo-uN237@kUm8G;HP^lfw9Wb$Z?iVPaD!x^P;dgK5 z5@-qu2NrQ$pbnoNAu05R@>J*kxVujCdvfzV61u(*5MFMGHz-7je)iguMl z3%=d9yz+Ai2BtP%Y960##)+Bno}SC(mR_mj$Z5Sg;i5?7p^rEKaxbV#qzLk&sXb)ctNM6QV zR&N5*{~GmFoU0Tp)5_?d=g-mI#+pWYmoBPhreUFRcZgbE@zGOOv#$8>pP;p(h524Lc1VAs6K7>MycL~=Ps3Dr z?*NVNX+c9yk}00_us@&^ zPO#l@H#-?q)|OQJF(#?X291~Cea>KKzRsdLM)}MqYL23El-t_SZN)`9lKR)0Dp={- zmzJ55Qq&rKZ`hdQ$go6p9VlIHo-n%wub-1=bc3jncDYB{x(Sp!hP_1AR*Duck5p$T zwl;ZvboLlfxI%3e1^_5KkPQ9nk^{i+kiMb$F9e5GQTVWr3sP9CN9UI?=}XdT2~1ZN z-l2s#%!DQjXMI>$8N5!afJREP#owCPgke!5ad5R(yNv-2c`^5#VnYdqyyIB4pTTfI zTR_A3`@7hwtW5>g1JYd&wB0v&-{oU6S|A6iyzUVnyel~q&JfH$FX|Pi{oGi&jA$oQ z=7$CY`>8K5 z$+s+@d{_;xT2xZowZ}^jFx)5!ei~pac?+f1b&wpv^qsz}NUYq+}=KlQU;UaPW z3wyu|GFr?P9)T8P_y7wZ{GkI}kdd2Ol9-ZMlK42u?27ROp@&H(B9Dwr%*+kUj0}yo zgj5_{r}#AV#L-z%GVi4oRo={)9W`a_iT;J|}}0tW;RPB?P# zpuz#2g9{GKIePA(%7_2|>%VD<@uhJdlkDLEI-H$@FMp=j1fWOyfEc$&Kr2h4o%8cb zQu9jULn;eWi(^5h=+=7U{!QByq`0ViL}4;D;99~h&nFGuvsf680t}rD;F27;Nnq>5??m8s%D4WoK;N{O|52ZYpw`+ z&h6)S<3HUJa^j)G)T|koXI@K@`r?r4Bf+vV`P+d_XM*P*IFr!ztHQ$Oq8i(=1I+JC zu2htCnx2W)(+m4Ow`8fp(rc0lo!;FuwAP6+tvmGQT2*_o|G_*K%0sNjLpKF^jT>k+9|D};k8TR2I6;^NE?CeFL|*0vS{jD{mk(fBD2J{c zc|8>n@M64W?C0R9K?=zukq&^04h450cH0VE%RHRGsV(ak|FLP6CC z0%Sc#sZ`K4A{SYx8atkV9RMqD(KRCH7Su=!1eWDk%C`V-RyL5cc!4k&n2q?KgLnWo C@Tk!M literal 0 HcmV?d00001 diff --git a/sprints/sprint-4/referencias/wizard_formulario_mapeo_v3.html b/sprints/sprint-4/referencias/wizard_formulario_mapeo_v3.html new file mode 100644 index 0000000..9be940b --- /dev/null +++ b/sprints/sprint-4/referencias/wizard_formulario_mapeo_v3.html @@ -0,0 +1,481 @@ + + + + + +Wizard Mapeo de Cuidadores v3 — Mockup + + + + +
+
+
+ +
+
Mapeo de Cuidadores 2026
+
InQuality · Mockup v3
+
+
+
+
+
Pantalla 1
+
+
+
+
+
+ + + +