From fb27cd60c07f963d2a66d256b81b6b9df930c28f Mon Sep 17 00:00:00 2001 From: root Date: Fri, 21 Aug 2026 22:57:44 +0000 Subject: [PATCH] =?UTF-8?q?Vers=C3=A3o=20inicial=20em=20produ=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + acoes.php | 495 ++++++++++++++++++++++ assets/css/identidade-visual-cinza.css | 322 ++++++++++++++ assets/css/identidade-visual-marrom.css | 322 ++++++++++++++ assets/css/identidade-visual-verde.css | 322 ++++++++++++++ assets/img/logos/cinza/favicon.ico | Bin 0 -> 45407 bytes assets/img/logos/cinza/svg/icone-cor.svg | 13 + assets/img/logos/marrom/favicon.ico | Bin 0 -> 44182 bytes assets/img/logos/marrom/svg/icone-cor.svg | 13 + assets/img/logos/verde/favicon.ico | Bin 0 -> 43860 bytes assets/img/logos/verde/svg/icone-cor.svg | 13 + configuracoes.php | 87 ++++ contas.php | 177 ++++++++ corretoras.php | 143 +++++++ cotacoes.php | 237 +++++++++++ includes/auth.php | 105 +++++ includes/config.example.php | 76 ++++ includes/db.php | 35 ++ includes/footer.php | 6 + includes/header.php | 232 ++++++++++ includes/theme.php | 89 ++++ index.html | 89 ++++ index.php | 54 +++ login.php | 107 +++++ logout.php | 15 + minha-conta.php | 125 ++++++ operacoes.php | 62 +++ paginas_admin.php | 144 +++++++ perfis.php | 167 ++++++++ phpinfo.php | 2 + server.php | 81 ++++ usuarios.php | 313 ++++++++++++++ 32 files changed, 3848 insertions(+) create mode 100644 .gitignore create mode 100644 acoes.php create mode 100644 assets/css/identidade-visual-cinza.css create mode 100644 assets/css/identidade-visual-marrom.css create mode 100644 assets/css/identidade-visual-verde.css create mode 100644 assets/img/logos/cinza/favicon.ico create mode 100644 assets/img/logos/cinza/svg/icone-cor.svg create mode 100644 assets/img/logos/marrom/favicon.ico create mode 100644 assets/img/logos/marrom/svg/icone-cor.svg create mode 100644 assets/img/logos/verde/favicon.ico create mode 100644 assets/img/logos/verde/svg/icone-cor.svg create mode 100644 configuracoes.php create mode 100644 contas.php create mode 100644 corretoras.php create mode 100644 cotacoes.php create mode 100644 includes/auth.php create mode 100644 includes/config.example.php create mode 100644 includes/db.php create mode 100644 includes/footer.php create mode 100644 includes/header.php create mode 100644 includes/theme.php create mode 100644 index.html create mode 100644 index.php create mode 100644 login.php create mode 100644 logout.php create mode 100644 minha-conta.php create mode 100644 operacoes.php create mode 100644 paginas_admin.php create mode 100644 perfis.php create mode 100644 phpinfo.php create mode 100644 server.php create mode 100644 usuarios.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fd13edb --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +includes/config.php +includes/ambiente.json diff --git a/acoes.php b/acoes.php new file mode 100644 index 0000000..ac58ff7 --- /dev/null +++ b/acoes.php @@ -0,0 +1,495 @@ + 'Ação', + 'etf' => 'ETF', + 'bdr' => 'BDR', + 'fii' => 'FII', +]; + +/** + * Simula, em ordem cronológica, uma lista de operações (compra/venda) de um + * mesmo ativo e devolve o estado final. Regra do PM (preço médio): + * - compra: recalcula a média ponderada e aumenta a quantidade. + * - venda: só reduz a quantidade; o PM das ações que sobram não muda. + * "ok" vem false se em algum ponto a quantidade ficaria negativa (ou seja, + * uma venda maior do que o que havia disponível até aquela data). + * Cada item de $linhas precisa ter: tipo, quantidade, preco, data_operacao, _ordem. + */ +function ao_simular_transacoes(array $linhas) { + usort($linhas, function ($a, $b) { + $an = $a['data_operacao'] === null; + $bn = $b['data_operacao'] === null; + if ($an !== $bn) { + return $an <=> $bn; // datadas primeiro, sem data por último + } + if (!$an && $a['data_operacao'] !== $b['data_operacao']) { + return strcmp($a['data_operacao'], $b['data_operacao']); + } + return $a['_ordem'] <=> $b['_ordem']; + }); + + $qtd = 0; + $pm = 0.0; + $ok = true; + + foreach ($linhas as $l) { + $q = (int) $l['quantidade']; + $p = (float) $l['preco']; + if ($l['tipo'] === 'compra') { + $novoQtd = $qtd + $q; + $pm = $novoQtd > 0 ? (($qtd * $pm) + ($q * $p)) / $novoQtd : 0.0; + $qtd = $novoQtd; + } else { + $qtd -= $q; + if ($qtd < 0) { + $ok = false; + } + } + } + + return ['ok' => $ok, 'qtd' => max(0, $qtd), 'pm' => round($pm, 4)]; +} + +/** Busca as operações de um ativo (de um usuário), no formato usado por ao_simular_transacoes(). */ +function ao_buscar_transacoes_ativo(PDO $pdo, $usuario_id, $ativo, $ignorar_id = null) { + $sql = 'SELECT id, tipo, quantidade, preco, data_operacao FROM acoes WHERE usuario_id = ? AND ativo = ?'; + $params = [$usuario_id, $ativo]; + if ($ignorar_id !== null) { + $sql .= ' AND id != ?'; + $params[] = $ignorar_id; + } + $stmt = $pdo->prepare($sql); + $stmt->execute($params); + $linhas = $stmt->fetchAll(); + foreach ($linhas as &$l) { + $l['_ordem'] = (int) $l['id']; + } + return $linhas; +} + +/** + * Recalcula e salva a posição consolidada (quantidade total + PM) de um + * ativo para um usuário, simulando todo o histórico de compras/vendas dele. + * Se não sobrar quantidade nenhuma, a posição é removida. + */ +function ao_recalcular_posicao_acao(PDO $pdo, $usuario_id, $ativo) { + $linhas = ao_buscar_transacoes_ativo($pdo, $usuario_id, $ativo); + $sim = ao_simular_transacoes($linhas); + + if ($sim['qtd'] <= 0) { + $pdo->prepare('DELETE FROM acoes_posicoes WHERE usuario_id = ? AND ativo = ?')->execute([$usuario_id, $ativo]); + return; + } + + // A categoria do ativo é a mesma em todas as operações dele (garantido na + // validação do save) — pega de qualquer uma para gravar na posição. + $stmtCategoria = $pdo->prepare('SELECT categoria FROM acoes WHERE usuario_id = ? AND ativo = ? LIMIT 1'); + $stmtCategoria->execute([$usuario_id, $ativo]); + $categoria = $stmtCategoria->fetchColumn() ?: 'acao'; + + $stmt = $pdo->prepare( + 'INSERT INTO acoes_posicoes (usuario_id, ativo, categoria, quantidade, preco_medio) VALUES (?, ?, ?, ?, ?) + ON DUPLICATE KEY UPDATE categoria = VALUES(categoria), quantidade = VALUES(quantidade), preco_medio = VALUES(preco_medio)' + ); + $stmt->execute([$usuario_id, $ativo, $categoria, $sim['qtd'], $sim['pm']]); +} + +/** Converte "38,42" ou "38.42" em float. Retorna null se não for um número válido. */ +function ao_parse_decimal_br($valor) { + $valor = str_replace(',', '.', trim((string) $valor)); + return is_numeric($valor) ? (float) $valor : null; +} + +/** Badge colorido com o rótulo (Ação/ETF/BDR/FII) de uma categoria de ativo. */ +function ao_badge_categoria($categoria) { + $classes = ['acao' => 'ao-badge-neutro', 'etf' => 'ao-badge-info', 'bdr' => 'ao-badge-alerta', 'fii' => 'ao-badge-fii']; + $classe = $classes[$categoria] ?? 'ao-badge-neutro'; + $rotulo = AO_CATEGORIAS_ATIVO[$categoria] ?? $categoria; + return '' . htmlspecialchars($rotulo) . ''; +} + +$erro = null; +$sucesso = null; + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'excluir') { + $id = (int) ($_POST['id'] ?? 0); + $stmt = $pdo->prepare('SELECT ativo FROM acoes WHERE id = ? AND usuario_id = ?'); + $stmt->execute([$id, $ao_usuario_id]); + $linha = $stmt->fetch(); + + if ($linha) { + // Antes de excluir, confere se remover esta operação deixaria alguma + // venda posterior sem ações suficientes (ex: excluir uma compra cujas + // ações já foram vendidas depois). + $sim = ao_simular_transacoes(ao_buscar_transacoes_ativo($pdo, $ao_usuario_id, $linha['ativo'], $id)); + if (!$sim['ok']) { + $erro = 'Não é possível excluir: isso deixaria uma venda sem ações suficientes na carteira.'; + } else { + $pdo->prepare('DELETE FROM acoes WHERE id = ? AND usuario_id = ?')->execute([$id, $ao_usuario_id]); + ao_recalcular_posicao_acao($pdo, $ao_usuario_id, $linha['ativo']); + header('Location: acoes.php?excluido=1'); + exit; + } + } else { + header('Location: acoes.php?excluido=1'); + exit; + } +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'salvar') { + $id = (int) ($_POST['id'] ?? 0); + $conta_id = (int) ($_POST['conta_id'] ?? 0); + $ativo = strtoupper(trim($_POST['ativo'] ?? '')); + $categoria = (string) ($_POST['categoria'] ?? ''); + $tipo = ($_POST['tipo'] ?? '') === 'venda' ? 'venda' : 'compra'; + $quantidade = (int) ($_POST['quantidade'] ?? 0); + $data_operacao = trim($_POST['data_operacao'] ?? ''); + $preco_bruto = trim($_POST['preco'] ?? ''); + $preco = ao_parse_decimal_br($preco_bruto); + $ativo_antigo = null; + + if (!array_key_exists($categoria, AO_CATEGORIAS_ATIVO)) { + $categoria = 'acao'; + } + + // A conta precisa existir e pertencer ao usuário logado — impede que + // alguém forje o id de uma conta de outra pessoa no formulário. + $stmtConta = $pdo->prepare('SELECT id FROM contas WHERE id = ? AND usuario_id = ?'); + $stmtConta->execute([$conta_id, $ao_usuario_id]); + $contaValida = (bool) $stmtConta->fetch(); + + if (!$contaValida) { + $erro = 'Selecione uma conta válida.'; + } elseif ($ativo === '' || $quantidade <= 0 || $preco === null || $preco <= 0) { + $erro = 'Preencha código do ativo, quantidade (maior que zero) e preço (maior que zero) corretamente.'; + } elseif ($data_operacao !== '' && !preg_match('/^\d{4}-\d{2}-\d{2}$/', $data_operacao)) { + $erro = 'Data da operação inválida.'; + } else { + $ignorar_id = $id > 0 ? $id : null; + + if ($id > 0) { + $stmtAntigo = $pdo->prepare('SELECT ativo FROM acoes WHERE id = ? AND usuario_id = ?'); + $stmtAntigo->execute([$id, $ao_usuario_id]); + $antigo = $stmtAntigo->fetch(); + if (!$antigo) { + $erro = 'Operação não encontrada.'; + } else { + $ativo_antigo = $antigo['ativo']; + } + } + + if (!$erro) { + // A categoria é do ativo, não da operação — todas as operações de + // um mesmo código precisam concordar (evita PETR4 virar "ETF" numa + // operação e "Ação" noutra por engano). + $sqlCategoriaExistente = 'SELECT DISTINCT categoria FROM acoes WHERE usuario_id = ? AND ativo = ?'; + $paramsCategoriaExistente = [$ao_usuario_id, $ativo]; + if ($ignorar_id !== null) { + $sqlCategoriaExistente .= ' AND id != ?'; + $paramsCategoriaExistente[] = $ignorar_id; + } + $stmtCategoriaExistente = $pdo->prepare($sqlCategoriaExistente); + $stmtCategoriaExistente->execute($paramsCategoriaExistente); + $categoriaExistente = $stmtCategoriaExistente->fetchColumn(); + + if ($categoriaExistente !== false && $categoriaExistente !== $categoria) { + $erro = 'Já existe(m) operação(ões) de ' . htmlspecialchars($ativo) . ' cadastrada(s) como "' + . htmlspecialchars(AO_CATEGORIAS_ATIVO[$categoriaExistente]) . '". Selecione a mesma categoria ' + . 'para manter a carteira consistente (ou edite as operações antigas se o código estiver errado).'; + } + } + + if (!$erro) { + // Valida o ativo de destino incluindo esta operação (nova ou editada). + $linhasDestino = ao_buscar_transacoes_ativo($pdo, $ao_usuario_id, $ativo, $ignorar_id); + $linhasDestino[] = [ + 'tipo' => $tipo, 'quantidade' => $quantidade, 'preco' => $preco, + 'data_operacao' => $data_operacao !== '' ? $data_operacao : null, + '_ordem' => $id > 0 ? $id : PHP_INT_MAX, + ]; + $simDestino = ao_simular_transacoes($linhasDestino); + + if (!$simDestino['ok']) { + $erro = 'Essa venda deixaria a quantidade de ' . htmlspecialchars($ativo) . ' negativa em alguma data — ' + . 'você não pode vender mais ações do que possuía até aquele momento.'; + } elseif ($ativo_antigo !== null && $ativo_antigo !== $ativo) { + // O código do ativo mudou nesta edição: confere se o ativo antigo + // continua consistente sem esta operação (que está saindo dele). + $simAntigo = ao_simular_transacoes(ao_buscar_transacoes_ativo($pdo, $ao_usuario_id, $ativo_antigo, $id)); + if (!$simAntigo['ok']) { + $erro = 'Não é possível mover esta operação para outro ativo: sobraria uma venda de ' + . htmlspecialchars($ativo_antigo) . ' sem ações suficientes.'; + } + } + } + + if (!$erro) { + try { + if ($id > 0) { + $stmt = $pdo->prepare('UPDATE acoes SET conta_id=?, ativo=?, categoria=?, tipo=?, quantidade=?, data_operacao=?, preco=? WHERE id=? AND usuario_id=?'); + $stmt->execute([$conta_id, $ativo, $categoria, $tipo, $quantidade, $data_operacao !== '' ? $data_operacao : null, $preco, $id, $ao_usuario_id]); + } else { + $stmt = $pdo->prepare('INSERT INTO acoes (usuario_id, conta_id, ativo, categoria, tipo, quantidade, data_operacao, preco) VALUES (?,?,?,?,?,?,?,?)'); + $stmt->execute([$ao_usuario_id, $conta_id, $ativo, $categoria, $tipo, $quantidade, $data_operacao !== '' ? $data_operacao : null, $preco]); + } + + ao_recalcular_posicao_acao($pdo, $ao_usuario_id, $ativo); + if ($ativo_antigo !== null && $ativo_antigo !== $ativo) { + ao_recalcular_posicao_acao($pdo, $ao_usuario_id, $ativo_antigo); + } + + header('Location: acoes.php?salvo=1'); + exit; + } catch (PDOException $e) { + $erro = 'Erro ao salvar: ' . $e->getMessage(); + } + } + } +} + +$editando = null; +if (isset($_GET['editar'])) { + $stmt = $pdo->prepare('SELECT * FROM acoes WHERE id = ? AND usuario_id = ?'); + $stmt->execute([(int) $_GET['editar'], $ao_usuario_id]); + $editando = $stmt->fetch() ?: null; +} + +// Se deu erro no envio, mantemos o que foi digitado na tela em vez de limpar tudo. +if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'salvar' && $erro && $erro !== 'Operação não encontrada.') { + $editando = [ + 'id' => $id, + 'conta_id' => $conta_id, + 'ativo' => $ativo, + 'categoria' => $categoria, + 'tipo' => $tipo, + 'quantidade' => $quantidade, + 'data_operacao' => $data_operacao, + 'preco' => $preco_bruto, + ]; +} + +if (isset($_GET['salvo'])) $sucesso = 'Operação salva com sucesso.'; +if (isset($_GET['excluido'])) $sucesso = 'Operação excluída.'; + +$stmtContas = $pdo->prepare( + 'SELECT ct.id, ct.nome AS conta_nome, cr.nome AS corretora_nome + FROM contas ct + INNER JOIN corretoras cr ON cr.id = ct.corretora_id + WHERE ct.usuario_id = ? + ORDER BY cr.nome, ct.nome' +); +$stmtContas->execute([$ao_usuario_id]); +$contas = $stmtContas->fetchAll(); + +$stmtPosicoes = $pdo->prepare('SELECT * FROM acoes_posicoes WHERE usuario_id = ? ORDER BY ativo'); +$stmtPosicoes->execute([$ao_usuario_id]); +$posicoes = $stmtPosicoes->fetchAll(); + +$stmtOperacoes = $pdo->prepare( + 'SELECT a.*, ct.nome AS conta_nome, cr.nome AS corretora_nome + FROM acoes a + LEFT JOIN contas ct ON ct.id = a.conta_id + LEFT JOIN corretoras cr ON cr.id = ct.corretora_id + WHERE a.usuario_id = ? + ORDER BY (a.data_operacao IS NULL), a.data_operacao DESC, a.id DESC' +); +$stmtOperacoes->execute([$ao_usuario_id]); +$operacoes = $stmtOperacoes->fetchAll(); + +require __DIR__ . '/includes/header.php'; +?> + +
+

Minha carteira de ações

+ + + +
+ + +
+ + +
+ + + +
+

Antes de cadastrar uma operação, você precisa ter uma corretora e uma conta cadastradas. + Cadastre uma corretora e depois cadastre uma conta nela.

+
+ + +
+ +
+ +
+
Carteira consolidada
+ + + + + + + + + + + + + + + + + + +
AtivoCategoriaQuantidadePreço médio (PM)Valor investido
Nenhuma ação em carteira no momento.
R$ R$
+
+ +
+
Histórico de operações
+ + + + + + + + + + + + + + + + + + + + + +
DataAtivoCategoriaContaTipoQuantidadePreço
Nenhuma operação cadastrada ainda.
R$ + Editar +
+ + + +
+
+
+ + + + + + diff --git a/assets/css/identidade-visual-cinza.css b/assets/css/identidade-visual-cinza.css new file mode 100644 index 0000000..b720151 --- /dev/null +++ b/assets/css/identidade-visual-cinza.css @@ -0,0 +1,322 @@ +/* ============================================================ + AçãoOpção — Identidade Visual (variação Cinza/Grafite) + Arquivo de variáveis e componentes base para o sistema PHP. + Inclua este arquivo após o reset/normalize do projeto: + + + Fontes (Google Fonts) — adicione no antes deste arquivo: + + + ============================================================ */ + +:root { + /* ---------- Paleta cinza/grafite (marca) ---------- */ + --ao-neutral-50: #F3F1ED; /* fornecida */ + --ao-neutral-100: #E6E3DB; + --ao-neutral-200: #D7D1C6; /* fornecida */ + --ao-neutral-300: #AAA8A5; + --ao-neutral-500: #6B6F77; /* fornecida — cor primária */ + --ao-neutral-700: #3C3F45; /* fornecida */ + --ao-neutral-800: #33353A; + --ao-neutral-900: #2B2D31; /* fornecida */ + + /* ---------- Neutros de apoio (mesma escala — paleta já é neutra) ---------- */ + --ao-gray-50: var(--ao-neutral-50); + --ao-gray-100: var(--ao-neutral-100); + --ao-gray-200: var(--ao-neutral-200); + --ao-gray-300: var(--ao-neutral-300); + --ao-gray-400: #8B8D8F; + --ao-gray-600: #55575C; + --ao-gray-800: var(--ao-neutral-800); + --ao-gray-900: var(--ao-neutral-900); + --ao-white: #FFFFFF; + + /* ---------- Cores semânticas (mercado) — universais, não mudam com a marca ---------- */ + --ao-alta: #3E8C4B; /* alta / ganho / positivo — usada em preenchimentos sólidos */ + --ao-alta-bg: #E4F1E6; + --ao-alta-text: var(--ao-alta); /* usada em texto/badge — troca de tom no modo escuro */ + --ao-baixa: #C1443B; /* baixa / perda / negativo — usada em preenchimentos sólidos */ + --ao-baixa-bg: #FBEAE8; + --ao-baixa-text: var(--ao-baixa); + --ao-alerta: #C98A2E; /* atenção / pendente */ + --ao-alerta-bg: #FBF1E1; + --ao-alerta-text: var(--ao-alerta); + --ao-info: #3B7A9E; /* informativo / neutro-azulado */ + --ao-info-bg: #E7F1F5; + --ao-info-text: var(--ao-info); + + /* ---------- Papéis funcionais ---------- */ + --ao-primary: var(--ao-neutral-700); + --ao-primary-hover: var(--ao-neutral-900); + --ao-primary-soft: var(--ao-neutral-100); + --ao-on-primary: var(--ao-white); /* cor do texto sobre botões/elementos "primary" */ + --ao-accent: var(--ao-neutral-500); + --ao-bg-page: var(--ao-neutral-50); + --ao-bg-surface: var(--ao-white); + --ao-border: var(--ao-neutral-200); + --ao-text-strong: var(--ao-neutral-900); + --ao-text-body: var(--ao-neutral-800); + --ao-text-muted: var(--ao-gray-600); + --ao-text-on-dark: var(--ao-white); + --ao-focus-ring: rgba(107, 111, 119, 0.45); + + /* ---------- Tipografia ---------- */ + --ao-font-heading: 'Poppins', 'Segoe UI', Arial, sans-serif; + --ao-font-body: 'Inter', 'Segoe UI', Arial, sans-serif; + --ao-font-mono: 'IBM Plex Mono', 'Roboto Mono', Consolas, monospace; /* preços, tickers, %s */ + + --ao-fs-xs: 0.75rem; + --ao-fs-sm: 0.875rem; + --ao-fs-base: 1rem; + --ao-fs-lg: 1.125rem; + --ao-fs-xl: 1.375rem; + --ao-fs-2xl: 1.75rem; + --ao-fs-3xl: 2.25rem; + + /* ---------- Espaçamento / raio / sombra ---------- */ + --ao-space-1: 4px; + --ao-space-2: 8px; + --ao-space-3: 12px; + --ao-space-4: 16px; + --ao-space-5: 24px; + --ao-space-6: 32px; + --ao-space-8: 48px; + + --ao-radius-sm: 6px; + --ao-radius-md: 10px; + --ao-radius-lg: 16px; + --ao-radius-pill: 999px; + + --ao-shadow-sm: 0 1px 2px rgba(43, 45, 49, 0.07); + --ao-shadow-md: 0 4px 12px rgba(43, 45, 49, 0.09); + --ao-shadow-lg: 0 12px 32px rgba(43, 45, 49, 0.16); +} + +/* ============================================================ + Base + ============================================================ */ +body { + background: var(--ao-bg-page); + color: var(--ao-text-body); + font-family: var(--ao-font-body); + font-size: var(--ao-fs-base); + line-height: 1.55; +} + +h1, h2, h3, h4, .ao-heading { + font-family: var(--ao-font-heading); + color: var(--ao-text-strong); + font-weight: 600; + line-height: 1.25; +} + +a { color: var(--ao-primary); } +a:hover { color: var(--ao-primary-hover); } + +.ao-numeric, .ao-price, .ao-ticker { + font-family: var(--ao-font-mono); + font-variant-numeric: tabular-nums; +} + +/* ============================================================ + Botões + ============================================================ */ +.ao-btn { + display: inline-flex; + align-items: center; + gap: var(--ao-space-2); + font-family: var(--ao-font-body); + font-weight: 600; + font-size: var(--ao-fs-sm); + padding: 10px 18px; + border-radius: var(--ao-radius-md); + border: 1px solid transparent; + cursor: pointer; + transition: background-color .15s ease, border-color .15s ease, color .15s ease; +} +.ao-btn:focus-visible { + outline: none; + box-shadow: 0 0 0 3px var(--ao-focus-ring); +} +.ao-btn-primary { + background: var(--ao-primary); + color: var(--ao-on-primary); +} +.ao-btn-primary:hover { background: var(--ao-primary-hover); } + +.ao-btn-secondary { + background: var(--ao-neutral-100); + color: var(--ao-neutral-800); +} +.ao-btn-secondary:hover { background: var(--ao-neutral-200); } + +.ao-btn-outline { + background: transparent; + border-color: var(--ao-primary); + color: var(--ao-primary); +} +.ao-btn-outline:hover { background: var(--ao-bg-page); } + +.ao-btn-danger { + background: var(--ao-baixa); + color: var(--ao-white); +} + +/* ============================================================ + Cards / superfícies + ============================================================ */ +.ao-card { + background: var(--ao-bg-surface); + border: 1px solid var(--ao-border); + border-radius: var(--ao-radius-lg); + box-shadow: var(--ao-shadow-sm); + padding: var(--ao-space-5); +} +.ao-card-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--ao-space-4); +} + +/* ============================================================ + Badges / indicadores de mercado + ============================================================ */ +.ao-badge { + display: inline-flex; + align-items: center; + gap: 4px; + font-size: var(--ao-fs-xs); + font-weight: 700; + letter-spacing: .02em; + padding: 3px 10px; + border-radius: var(--ao-radius-pill); +} +.ao-badge-alta { background: var(--ao-alta-bg); color: var(--ao-alta-text); } +.ao-badge-baixa { background: var(--ao-baixa-bg); color: var(--ao-baixa-text); } +.ao-badge-alerta { background: var(--ao-alerta-bg); color: var(--ao-alerta-text); } +.ao-badge-info { background: var(--ao-info-bg); color: var(--ao-info-text); } +.ao-badge-neutro { background: var(--ao-gray-100); color: var(--ao-gray-600); } + +/* ============================================================ + Tabelas (cotações, posições, histórico de operações) + ============================================================ */ +.ao-table { + width: 100%; + border-collapse: collapse; + background: var(--ao-bg-surface); + border-radius: var(--ao-radius-md); + overflow: hidden; +} +.ao-table th { + text-align: left; + font-family: var(--ao-font-body); + font-size: var(--ao-fs-xs); + text-transform: uppercase; + letter-spacing: .04em; + color: var(--ao-text-muted); + background: var(--ao-bg-page); + padding: var(--ao-space-3) var(--ao-space-4); + border-bottom: 1px solid var(--ao-border); +} +.ao-table td { + padding: var(--ao-space-3) var(--ao-space-4); + border-bottom: 1px solid var(--ao-border); + font-size: var(--ao-fs-sm); +} +.ao-table tr:hover td { background: var(--ao-bg-page); } +.ao-table .ao-up { color: var(--ao-alta-text); } +.ao-table .ao-down { color: var(--ao-baixa-text); } + +/* ============================================================ + Formulários + ============================================================ */ +.ao-field label { + display: block; + font-size: var(--ao-fs-sm); + font-weight: 600; + color: var(--ao-text-strong); + margin-bottom: var(--ao-space-1); +} +.ao-field input, +.ao-field select, +.ao-field textarea { + width: 100%; + font-family: var(--ao-font-body); + font-size: var(--ao-fs-sm); + padding: 10px 12px; + border: 1px solid var(--ao-border); + border-radius: var(--ao-radius-sm); + background: var(--ao-bg-surface); + color: var(--ao-text-body); +} +.ao-field input:focus, +.ao-field select:focus, +.ao-field textarea:focus { + outline: none; + border-color: var(--ao-primary); + box-shadow: 0 0 0 3px var(--ao-focus-ring); +} + +/* ============================================================ + Topbar / navegação + ============================================================ */ +.ao-topbar { + display: flex; + align-items: center; + justify-content: space-between; + background: var(--ao-neutral-900); + color: var(--ao-white); + padding: var(--ao-space-3) var(--ao-space-5); +} +.ao-topbar a { color: var(--ao-neutral-200); } +.ao-topbar .ao-brand { + display: flex; + align-items: center; + gap: var(--ao-space-2); + font-family: var(--ao-font-heading); + font-weight: 700; + color: var(--ao-white); +} + +/* ============================================================ + Modo escuro + Ative adicionando data-ao-mode="escuro" na tag . + Como todos os componentes acima já leem cores por variável, + o modo escuro é só uma troca de tokens — nenhuma regra de + componente precisa ser duplicada. + ============================================================ */ +html[data-ao-mode="escuro"] { + --ao-bg-page: #151619; + --ao-bg-surface: #212326; + --ao-border: #323439; + --ao-text-strong: #F4F5F5; + --ao-text-body: #DBDDE1; + --ao-text-muted: #89909F; + + --ao-primary: var(--ao-neutral-300); + --ao-primary-hover: var(--ao-neutral-200); + --ao-primary-soft: #323439; + --ao-on-primary: var(--ao-neutral-900); + --ao-focus-ring: rgba(170, 168, 165, 0.5); + + --ao-shadow-sm: 0 1px 2px rgba(0, 0, 0, .4); + --ao-shadow-md: 0 6px 16px rgba(0, 0, 0, .45); + --ao-shadow-lg: 0 18px 40px rgba(0, 0, 0, .55); + + /* as cores "sólidas" (--ao-alta/--ao-baixa/...) continuam iguais — + são usadas em botões de preenchimento cheio e já têm contraste + garantido. Só as versões usadas como TEXTO sobre fundo escuro + (badges, tabela) ficam mais claras para manter legibilidade. */ + --ao-alta-text: #7ED17A; + --ao-alta-bg: rgba(126, 209, 122, .16); + --ao-baixa-text: #FF8A7D; + --ao-baixa-bg: rgba(255, 138, 125, .16); + --ao-alerta-text: #F0B35C; + --ao-alerta-bg: rgba(240, 179, 92, .16); + --ao-info-text: #6FC1EE; + --ao-info-bg: rgba(111, 193, 238, .16); +} + +html[data-ao-mode="escuro"] .ao-btn-secondary { background: var(--ao-border); color: var(--ao-text-body); } +html[data-ao-mode="escuro"] .ao-badge-neutro { background: rgba(255, 255, 255, .08); color: var(--ao-text-muted); } diff --git a/assets/css/identidade-visual-marrom.css b/assets/css/identidade-visual-marrom.css new file mode 100644 index 0000000..0e362c3 --- /dev/null +++ b/assets/css/identidade-visual-marrom.css @@ -0,0 +1,322 @@ +/* ============================================================ + AçãoOpção — Identidade Visual (variação Marrom) + Arquivo de variáveis e componentes base para o sistema PHP. + Inclua este arquivo após o reset/normalize do projeto: + + + Fontes (Google Fonts) — adicione no antes deste arquivo: + + + ============================================================ */ + +:root { + /* ---------- Paleta marrom (marca) ---------- */ + --ao-brown-50: #F3E9DC; /* fornecida */ + --ao-brown-100: #E6D6BF; + --ao-brown-200: #D8C2A4; /* fornecida */ + --ao-brown-300: #C4A17A; + --ao-brown-500: #A6754C; /* fornecida — cor primária */ + --ao-brown-700: #6B3F2A; /* fornecida */ + --ao-brown-800: #533221; + --ao-brown-900: #3B2418; /* fornecida */ + + /* ---------- Neutros (cinza com sub-tom marrom) ---------- */ + --ao-gray-50: #F8F6F3; + --ao-gray-100: #F0EBE4; + --ao-gray-200: #DED4C8; + --ao-gray-300: #C2B4A3; + --ao-gray-400: #A0917F; + --ao-gray-600: #6B5D4E; + --ao-gray-800: #392F26; + --ao-gray-900: #201A15; + --ao-white: #FFFFFF; + + /* ---------- Cores semânticas (mercado) — universais, não mudam com a marca ---------- */ + --ao-alta: #4C8C3F; /* alta / ganho / positivo — usada em preenchimentos sólidos */ + --ao-alta-bg: #E5F1DE; + --ao-alta-text: var(--ao-alta); /* usada em texto/badge — troca de tom no modo escuro */ + --ao-baixa: #C1443B; /* baixa / perda / negativo — usada em preenchimentos sólidos */ + --ao-baixa-bg: #FBEAE8; + --ao-baixa-text: var(--ao-baixa); + --ao-alerta: #C98A2E; /* atenção / pendente */ + --ao-alerta-bg: #FBF1E1; + --ao-alerta-text: var(--ao-alerta); + --ao-info: #3B7A9E; /* informativo / neutro-azulado */ + --ao-info-bg: #E7F1F5; + --ao-info-text: var(--ao-info); + + /* ---------- Papéis funcionais ---------- */ + --ao-primary: var(--ao-brown-700); + --ao-primary-hover: var(--ao-brown-800); + --ao-primary-soft: var(--ao-brown-100); + --ao-on-primary: var(--ao-white); /* cor do texto sobre botões/elementos "primary" */ + --ao-accent: var(--ao-brown-500); + --ao-bg-page: var(--ao-brown-50); + --ao-bg-surface: var(--ao-white); + --ao-border: var(--ao-gray-200); + --ao-text-strong: var(--ao-gray-900); + --ao-text-body: var(--ao-gray-800); + --ao-text-muted: var(--ao-gray-600); + --ao-text-on-dark: var(--ao-white); + --ao-focus-ring: rgba(166, 117, 76, 0.45); + + /* ---------- Tipografia ---------- */ + --ao-font-heading: 'Poppins', 'Segoe UI', Arial, sans-serif; + --ao-font-body: 'Inter', 'Segoe UI', Arial, sans-serif; + --ao-font-mono: 'IBM Plex Mono', 'Roboto Mono', Consolas, monospace; /* preços, tickers, %s */ + + --ao-fs-xs: 0.75rem; + --ao-fs-sm: 0.875rem; + --ao-fs-base: 1rem; + --ao-fs-lg: 1.125rem; + --ao-fs-xl: 1.375rem; + --ao-fs-2xl: 1.75rem; + --ao-fs-3xl: 2.25rem; + + /* ---------- Espaçamento / raio / sombra ---------- */ + --ao-space-1: 4px; + --ao-space-2: 8px; + --ao-space-3: 12px; + --ao-space-4: 16px; + --ao-space-5: 24px; + --ao-space-6: 32px; + --ao-space-8: 48px; + + --ao-radius-sm: 6px; + --ao-radius-md: 10px; + --ao-radius-lg: 16px; + --ao-radius-pill: 999px; + + --ao-shadow-sm: 0 1px 2px rgba(32, 26, 21, 0.07); + --ao-shadow-md: 0 4px 12px rgba(32, 26, 21, 0.09); + --ao-shadow-lg: 0 12px 32px rgba(32, 26, 21, 0.16); +} + +/* ============================================================ + Base + ============================================================ */ +body { + background: var(--ao-bg-page); + color: var(--ao-text-body); + font-family: var(--ao-font-body); + font-size: var(--ao-fs-base); + line-height: 1.55; +} + +h1, h2, h3, h4, .ao-heading { + font-family: var(--ao-font-heading); + color: var(--ao-text-strong); + font-weight: 600; + line-height: 1.25; +} + +a { color: var(--ao-primary); } +a:hover { color: var(--ao-primary-hover); } + +.ao-numeric, .ao-price, .ao-ticker { + font-family: var(--ao-font-mono); + font-variant-numeric: tabular-nums; +} + +/* ============================================================ + Botões + ============================================================ */ +.ao-btn { + display: inline-flex; + align-items: center; + gap: var(--ao-space-2); + font-family: var(--ao-font-body); + font-weight: 600; + font-size: var(--ao-fs-sm); + padding: 10px 18px; + border-radius: var(--ao-radius-md); + border: 1px solid transparent; + cursor: pointer; + transition: background-color .15s ease, border-color .15s ease, color .15s ease; +} +.ao-btn:focus-visible { + outline: none; + box-shadow: 0 0 0 3px var(--ao-focus-ring); +} +.ao-btn-primary { + background: var(--ao-primary); + color: var(--ao-on-primary); +} +.ao-btn-primary:hover { background: var(--ao-primary-hover); } + +.ao-btn-secondary { + background: var(--ao-brown-100); + color: var(--ao-brown-800); +} +.ao-btn-secondary:hover { background: var(--ao-brown-200); } + +.ao-btn-outline { + background: transparent; + border-color: var(--ao-primary); + color: var(--ao-primary); +} +.ao-btn-outline:hover { background: var(--ao-bg-page); } + +.ao-btn-danger { + background: var(--ao-baixa); + color: var(--ao-white); +} + +/* ============================================================ + Cards / superfícies + ============================================================ */ +.ao-card { + background: var(--ao-bg-surface); + border: 1px solid var(--ao-border); + border-radius: var(--ao-radius-lg); + box-shadow: var(--ao-shadow-sm); + padding: var(--ao-space-5); +} +.ao-card-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--ao-space-4); +} + +/* ============================================================ + Badges / indicadores de mercado + ============================================================ */ +.ao-badge { + display: inline-flex; + align-items: center; + gap: 4px; + font-size: var(--ao-fs-xs); + font-weight: 700; + letter-spacing: .02em; + padding: 3px 10px; + border-radius: var(--ao-radius-pill); +} +.ao-badge-alta { background: var(--ao-alta-bg); color: var(--ao-alta-text); } +.ao-badge-baixa { background: var(--ao-baixa-bg); color: var(--ao-baixa-text); } +.ao-badge-alerta { background: var(--ao-alerta-bg); color: var(--ao-alerta-text); } +.ao-badge-info { background: var(--ao-info-bg); color: var(--ao-info-text); } +.ao-badge-neutro { background: var(--ao-gray-100); color: var(--ao-gray-600); } + +/* ============================================================ + Tabelas (cotações, posições, histórico de operações) + ============================================================ */ +.ao-table { + width: 100%; + border-collapse: collapse; + background: var(--ao-bg-surface); + border-radius: var(--ao-radius-md); + overflow: hidden; +} +.ao-table th { + text-align: left; + font-family: var(--ao-font-body); + font-size: var(--ao-fs-xs); + text-transform: uppercase; + letter-spacing: .04em; + color: var(--ao-text-muted); + background: var(--ao-bg-page); + padding: var(--ao-space-3) var(--ao-space-4); + border-bottom: 1px solid var(--ao-border); +} +.ao-table td { + padding: var(--ao-space-3) var(--ao-space-4); + border-bottom: 1px solid var(--ao-border); + font-size: var(--ao-fs-sm); +} +.ao-table tr:hover td { background: var(--ao-bg-page); } +.ao-table .ao-up { color: var(--ao-alta-text); } +.ao-table .ao-down { color: var(--ao-baixa-text); } + +/* ============================================================ + Formulários + ============================================================ */ +.ao-field label { + display: block; + font-size: var(--ao-fs-sm); + font-weight: 600; + color: var(--ao-text-strong); + margin-bottom: var(--ao-space-1); +} +.ao-field input, +.ao-field select, +.ao-field textarea { + width: 100%; + font-family: var(--ao-font-body); + font-size: var(--ao-fs-sm); + padding: 10px 12px; + border: 1px solid var(--ao-border); + border-radius: var(--ao-radius-sm); + background: var(--ao-bg-surface); + color: var(--ao-text-body); +} +.ao-field input:focus, +.ao-field select:focus, +.ao-field textarea:focus { + outline: none; + border-color: var(--ao-primary); + box-shadow: 0 0 0 3px var(--ao-focus-ring); +} + +/* ============================================================ + Topbar / navegação + ============================================================ */ +.ao-topbar { + display: flex; + align-items: center; + justify-content: space-between; + background: var(--ao-brown-900); + color: var(--ao-white); + padding: var(--ao-space-3) var(--ao-space-5); +} +.ao-topbar a { color: var(--ao-brown-100); } +.ao-topbar .ao-brand { + display: flex; + align-items: center; + gap: var(--ao-space-2); + font-family: var(--ao-font-heading); + font-weight: 700; + color: var(--ao-white); +} + +/* ============================================================ + Modo escuro + Ative adicionando data-ao-mode="escuro" na tag . + Como todos os componentes acima já leem cores por variável, + o modo escuro é só uma troca de tokens — nenhuma regra de + componente precisa ser duplicada. + ============================================================ */ +html[data-ao-mode="escuro"] { + --ao-bg-page: #21140D; + --ao-bg-surface: #331F15; + --ao-border: #483023; + --ao-text-strong: #F6F5F4; + --ao-text-body: #E3DCD9; + --ao-text-muted: #AA8D7D; + + --ao-primary: var(--ao-brown-300); + --ao-primary-hover: var(--ao-brown-200); + --ao-primary-soft: #483023; + --ao-on-primary: var(--ao-brown-900); + --ao-focus-ring: rgba(196, 161, 122, 0.5); + + --ao-shadow-sm: 0 1px 2px rgba(0, 0, 0, .4); + --ao-shadow-md: 0 6px 16px rgba(0, 0, 0, .45); + --ao-shadow-lg: 0 18px 40px rgba(0, 0, 0, .55); + + /* as cores "sólidas" (--ao-alta/--ao-baixa/...) continuam iguais — + são usadas em botões de preenchimento cheio e já têm contraste + garantido. Só as versões usadas como TEXTO sobre fundo escuro + (badges, tabela) ficam mais claras para manter legibilidade. */ + --ao-alta-text: #7ED17A; + --ao-alta-bg: rgba(126, 209, 122, .16); + --ao-baixa-text: #FF8A7D; + --ao-baixa-bg: rgba(255, 138, 125, .16); + --ao-alerta-text: #F0B35C; + --ao-alerta-bg: rgba(240, 179, 92, .16); + --ao-info-text: #6FC1EE; + --ao-info-bg: rgba(111, 193, 238, .16); +} + +html[data-ao-mode="escuro"] .ao-btn-secondary { background: var(--ao-border); color: var(--ao-text-body); } +html[data-ao-mode="escuro"] .ao-badge-neutro { background: rgba(255, 255, 255, .08); color: var(--ao-text-muted); } diff --git a/assets/css/identidade-visual-verde.css b/assets/css/identidade-visual-verde.css new file mode 100644 index 0000000..50a85bc --- /dev/null +++ b/assets/css/identidade-visual-verde.css @@ -0,0 +1,322 @@ +/* ============================================================ + AçãoOpção — Identidade Visual + Arquivo de variáveis e componentes base para o sistema PHP. + Inclua este arquivo após o reset/normalize do projeto: + + + Fontes (Google Fonts) — adicione no antes deste arquivo: + + + ============================================================ */ + +:root { + /* ---------- Paleta verde (marca) ---------- */ + --ao-green-50: #F7F9F4; + --ao-green-100: #EBEFE6; + --ao-green-200: #CFE0BC; /* fornecida */ + --ao-green-300: #99CD85; /* fornecida */ + --ao-green-500: #7FA653; /* fornecida — cor primária */ + --ao-green-700: #63783D; /* fornecida */ + --ao-green-800: #3D4A26; + --ao-green-900: #212915; + + /* ---------- Neutros (cinza com sub-tom verde) ---------- */ + --ao-gray-50: #F7F8F6; + --ao-gray-100: #EEF0EC; + --ao-gray-200: #DDE1D8; + --ao-gray-300: #C3C9BE; + --ao-gray-400: #9CA69A; + --ao-gray-600: #5D665A; + --ao-gray-800: #33392F; + --ao-gray-900: #1B1F17; + --ao-white: #FFFFFF; + + /* ---------- Cores semânticas (mercado) ---------- */ + --ao-alta: #4C8C3F; /* alta / ganho / positivo — usada em preenchimentos sólidos */ + --ao-alta-bg: #E5F1DE; + --ao-alta-text: var(--ao-alta); /* usada em texto/badge — troca de tom no modo escuro */ + --ao-baixa: #C1443B; /* baixa / perda / negativo — usada em preenchimentos sólidos */ + --ao-baixa-bg: #FBEAE8; + --ao-baixa-text: var(--ao-baixa); + --ao-alerta: #C98A2E; /* atenção / pendente */ + --ao-alerta-bg: #FBF1E1; + --ao-alerta-text: var(--ao-alerta); + --ao-info: #3B7A9E; /* informativo / neutro-azulado */ + --ao-info-bg: #E7F1F5; + --ao-info-text: var(--ao-info); + + /* ---------- Papéis funcionais ---------- */ + --ao-primary: var(--ao-green-700); + --ao-primary-hover: var(--ao-green-800); + --ao-primary-soft: var(--ao-green-100); + --ao-on-primary: var(--ao-white); /* cor do texto sobre botões/elementos "primary" */ + --ao-accent: var(--ao-green-500); + --ao-bg-page: var(--ao-green-50); + --ao-bg-surface: var(--ao-white); + --ao-border: var(--ao-gray-200); + --ao-text-strong: var(--ao-gray-900); + --ao-text-body: var(--ao-gray-800); + --ao-text-muted: var(--ao-gray-600); + --ao-text-on-dark: var(--ao-white); + --ao-focus-ring: rgba(127, 166, 83, 0.45); + + /* ---------- Tipografia ---------- */ + --ao-font-heading: 'Poppins', 'Segoe UI', Arial, sans-serif; + --ao-font-body: 'Inter', 'Segoe UI', Arial, sans-serif; + --ao-font-mono: 'IBM Plex Mono', 'Roboto Mono', Consolas, monospace; /* preços, tickers, %s */ + + --ao-fs-xs: 0.75rem; + --ao-fs-sm: 0.875rem; + --ao-fs-base: 1rem; + --ao-fs-lg: 1.125rem; + --ao-fs-xl: 1.375rem; + --ao-fs-2xl: 1.75rem; + --ao-fs-3xl: 2.25rem; + + /* ---------- Espaçamento / raio / sombra ---------- */ + --ao-space-1: 4px; + --ao-space-2: 8px; + --ao-space-3: 12px; + --ao-space-4: 16px; + --ao-space-5: 24px; + --ao-space-6: 32px; + --ao-space-8: 48px; + + --ao-radius-sm: 6px; + --ao-radius-md: 10px; + --ao-radius-lg: 16px; + --ao-radius-pill: 999px; + + --ao-shadow-sm: 0 1px 2px rgba(33, 41, 21, 0.06); + --ao-shadow-md: 0 4px 12px rgba(33, 41, 21, 0.08); + --ao-shadow-lg: 0 12px 32px rgba(33, 41, 21, 0.14); +} + +/* ============================================================ + Base + ============================================================ */ +body { + background: var(--ao-bg-page); + color: var(--ao-text-body); + font-family: var(--ao-font-body); + font-size: var(--ao-fs-base); + line-height: 1.55; +} + +h1, h2, h3, h4, .ao-heading { + font-family: var(--ao-font-heading); + color: var(--ao-text-strong); + font-weight: 600; + line-height: 1.25; +} + +a { color: var(--ao-primary); } +a:hover { color: var(--ao-primary-hover); } + +.ao-numeric, .ao-price, .ao-ticker { + font-family: var(--ao-font-mono); + font-variant-numeric: tabular-nums; +} + +/* ============================================================ + Botões + ============================================================ */ +.ao-btn { + display: inline-flex; + align-items: center; + gap: var(--ao-space-2); + font-family: var(--ao-font-body); + font-weight: 600; + font-size: var(--ao-fs-sm); + padding: 10px 18px; + border-radius: var(--ao-radius-md); + border: 1px solid transparent; + cursor: pointer; + transition: background-color .15s ease, border-color .15s ease, color .15s ease; +} +.ao-btn:focus-visible { + outline: none; + box-shadow: 0 0 0 3px var(--ao-focus-ring); +} +.ao-btn-primary { + background: var(--ao-primary); + color: var(--ao-on-primary); +} +.ao-btn-primary:hover { background: var(--ao-primary-hover); } + +.ao-btn-secondary { + background: var(--ao-green-100); + color: var(--ao-green-800); +} +.ao-btn-secondary:hover { background: var(--ao-green-200); } + +.ao-btn-outline { + background: transparent; + border-color: var(--ao-primary); + color: var(--ao-primary); +} +.ao-btn-outline:hover { background: var(--ao-bg-page); } + +.ao-btn-danger { + background: var(--ao-baixa); + color: var(--ao-white); +} + +/* ============================================================ + Cards / superfícies + ============================================================ */ +.ao-card { + background: var(--ao-bg-surface); + border: 1px solid var(--ao-border); + border-radius: var(--ao-radius-lg); + box-shadow: var(--ao-shadow-sm); + padding: var(--ao-space-5); +} +.ao-card-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--ao-space-4); +} + +/* ============================================================ + Badges / indicadores de mercado + ============================================================ */ +.ao-badge { + display: inline-flex; + align-items: center; + gap: 4px; + font-size: var(--ao-fs-xs); + font-weight: 700; + letter-spacing: .02em; + padding: 3px 10px; + border-radius: var(--ao-radius-pill); +} +.ao-badge-alta { background: var(--ao-alta-bg); color: var(--ao-alta-text); } +.ao-badge-baixa { background: var(--ao-baixa-bg); color: var(--ao-baixa-text); } +.ao-badge-alerta { background: var(--ao-alerta-bg); color: var(--ao-alerta-text); } +.ao-badge-info { background: var(--ao-info-bg); color: var(--ao-info-text); } +.ao-badge-neutro { background: var(--ao-gray-100); color: var(--ao-gray-600); } + +/* ============================================================ + Tabelas (cotações, posições, histórico de operações) + ============================================================ */ +.ao-table { + width: 100%; + border-collapse: collapse; + background: var(--ao-bg-surface); + border-radius: var(--ao-radius-md); + overflow: hidden; +} +.ao-table th { + text-align: left; + font-family: var(--ao-font-body); + font-size: var(--ao-fs-xs); + text-transform: uppercase; + letter-spacing: .04em; + color: var(--ao-text-muted); + background: var(--ao-bg-page); + padding: var(--ao-space-3) var(--ao-space-4); + border-bottom: 1px solid var(--ao-border); +} +.ao-table td { + padding: var(--ao-space-3) var(--ao-space-4); + border-bottom: 1px solid var(--ao-border); + font-size: var(--ao-fs-sm); +} +.ao-table tr:hover td { background: var(--ao-bg-page); } +.ao-table .ao-up { color: var(--ao-alta-text); } +.ao-table .ao-down { color: var(--ao-baixa-text); } + +/* ============================================================ + Formulários + ============================================================ */ +.ao-field label { + display: block; + font-size: var(--ao-fs-sm); + font-weight: 600; + color: var(--ao-text-strong); + margin-bottom: var(--ao-space-1); +} +.ao-field input, +.ao-field select, +.ao-field textarea { + width: 100%; + font-family: var(--ao-font-body); + font-size: var(--ao-fs-sm); + padding: 10px 12px; + border: 1px solid var(--ao-border); + border-radius: var(--ao-radius-sm); + background: var(--ao-bg-surface); + color: var(--ao-text-body); +} +.ao-field input:focus, +.ao-field select:focus, +.ao-field textarea:focus { + outline: none; + border-color: var(--ao-primary); + box-shadow: 0 0 0 3px var(--ao-focus-ring); +} + +/* ============================================================ + Topbar / navegação + ============================================================ */ +.ao-topbar { + display: flex; + align-items: center; + justify-content: space-between; + background: var(--ao-green-900); + color: var(--ao-white); + padding: var(--ao-space-3) var(--ao-space-5); +} +.ao-topbar a { color: var(--ao-green-100); } +.ao-topbar .ao-brand { + display: flex; + align-items: center; + gap: var(--ao-space-2); + font-family: var(--ao-font-heading); + font-weight: 700; + color: var(--ao-white); +} + +/* ============================================================ + Modo escuro + Ative adicionando data-ao-mode="escuro" na tag . + Como todos os componentes acima já leem cores por variável, + o modo escuro é só uma troca de tokens — nenhuma regra de + componente precisa ser duplicada. + ============================================================ */ +html[data-ao-mode="escuro"] { + --ao-bg-page: #191F0F; + --ao-bg-surface: #272F18; + --ao-border: #3B4724; + --ao-text-strong: #F5F5F4; + --ao-text-body: #DFE2DA; + --ao-text-muted: #99A682; + + --ao-primary: var(--ao-green-300); + --ao-primary-hover: var(--ao-green-200); + --ao-primary-soft: #3B4724; + --ao-on-primary: var(--ao-green-900); + --ao-focus-ring: rgba(153, 205, 133, 0.5); + + --ao-shadow-sm: 0 1px 2px rgba(0, 0, 0, .4); + --ao-shadow-md: 0 6px 16px rgba(0, 0, 0, .45); + --ao-shadow-lg: 0 18px 40px rgba(0, 0, 0, .55); + + /* as cores "sólidas" (--ao-alta/--ao-baixa/...) continuam iguais — + são usadas em botões de preenchimento cheio e já têm contraste + garantido. Só as versões usadas como TEXTO sobre fundo escuro + (badges, tabela) ficam mais claras para manter legibilidade. */ + --ao-alta-text: #7ED17A; + --ao-alta-bg: rgba(126, 209, 122, .16); + --ao-baixa-text: #FF8A7D; + --ao-baixa-bg: rgba(255, 138, 125, .16); + --ao-alerta-text: #F0B35C; + --ao-alerta-bg: rgba(240, 179, 92, .16); + --ao-info-text: #6FC1EE; + --ao-info-bg: rgba(111, 193, 238, .16); +} + +html[data-ao-mode="escuro"] .ao-btn-secondary { background: var(--ao-border); color: var(--ao-text-body); } +html[data-ao-mode="escuro"] .ao-badge-neutro { background: rgba(255, 255, 255, .08); color: var(--ao-text-muted); } diff --git a/assets/img/logos/cinza/favicon.ico b/assets/img/logos/cinza/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..84bc21e384df8170fa2f18a54e9e35ac6d7365d1 GIT binary patch literal 45407 zcmag_WmFtZ*F6q5KDfJEaQEO6Gyy_zf&>i^f`%Z2yGw9)0t9z=2o51YaF;+}2A@Iy zb3ONZzrAby<^y!CUe#6Ib?Tgb_C5swNB}xOKmZ_q3_u++0NDO_#qhuO8*~65LjeGO z{{OYzu>imd69DAo{?}H)1As+h00<2HU%QzV0BD*1yZ-OT0L0k?z%La5h|<2+zx*wDnnp+iQ z&8hZYK4pqt&H^LZj3YIX;)JjC)HoO`_j1$(G7o4P4_Ys6pH5uFAJ)6U z@Ey&+;|6^e`b&`@PW9JO6wF%$gfe>h&{8(LLDF~v1yZXu-iAGCnh*z3VnX@ptp@IP z@IF?|a4-S#?b$~05`@^&LMC5hT9ja}TR~UMu5m?op|!;-)}zxjPYNFPxpiV>1YLHc zscU#>?XR^4cpJl!`9y7-K`y6{YnF}J0ON(A@-EZ{t{y`w~!no5CIz-7JPK9$3 z?vB{mzaErv$~5%!mj^RquV0jtyi$AZwm6@BX+G!_wH#Z-T~QfLz-+6m{+H%;(f1ZS z5BPUGm*k-$BOt!InrCq-fMF!EGOyDKBUeS+^uVF_>_)2vXrEmG+W|8mdsSJsHV#JqSs!dp0C-DpEkt(!P@dFQQfv zlwcVhK!GaMm=ap#!lDL{e;{69P{U&xRVfY$S$am9WBC{^)4iOEutY%Zm8MdSf<^HE zAA4m$+-CScdv*8mxdH%mlKTVtW!U@Oe;v5~Z)mIex-qZ)2Q z-I}Z#Z4;78;nUz3)GRDF=r^jWgi*2Dilq8Zo~RYbsc5<+|9hy_-TTVaz^1%hP#IO( z;6*ucGpYUdHyI>5Gh;9_0am)sLjnSS4d z?<6jSI4Csk?(V~1nR353F|!sWv#2E>PNA4><1;y|Z|}bqY;zU*2|L+4DZ8S^Th5+ z=*GO)vW3M7z|737Tc!7lg{Mo*B$+b&`yD|ranib(uGkQJSM-(=DukF$2K+Mw1D}G5 z%5r9-dr~U1u)I9tcH^FBQ^sd#>>Hc+)oF1&p{d|t6v&~ae^n4V?m+$)yyJbbhnWw) z5J0%5{jL5GoL=e4P6%C*ewBcXf7)mQ{Wq4s$--vfvZkTGGBTG*-JdHz5Ln8+f^QAt zFSj^R19mfcHg0aod63)0h`?nBJF@$yFWZ&sDUt4Z1jqp|1L*YjSDGEyy1c*T!J+Sfk?-FJgMO1eX8$ zEMu!x=U9<7^m^Tlc_)yK|B8r<|2#Tkm-PH+ab;Kh`{a4hR}5bW%W5gQj}w}PPF9X4 zmxpn8cXxDhg0eLww#gFO_Gk6x=Yj}wExNg7peK&@I|UF=s$|2bo;Jf6!`~RMnkimJ zL&$ae4Fbv0BaMAuuq%Jme%p2HWzOEEQ$e6mpv$>!?44f5!Kloc3fVS(ESQh&z^bp3 zr>Vf;Zk<}r8EBfcR-u_A>QNTMfw9l0s2ali3 zQVy}uN$kD=*21yR_&(PB{QMS;0P4mOge|mhcT~vh5D^XbBTT&Rt|%KD8)^N15P2%; z<+!Uwy7eKQ{Y+vG;7Om5brPm(&#ZQQb_WGfFsr?k-9DJ=`dBO@AJgC9j$ugsIZ{23 zWvs(?qe}{&5cSsC)(f&Z({Rx3*50M5^h!xjX;MOECEU>!{yI6-8tMHjj#PEW{x`aM zx(ILag%SUjy9|N?+Z|2loG;gs1;ZP9_$IQ_5v~NB?A2FsET|WwD&Wwn(PqCi=esQ^ zbeMBF-Odv3!m-x^S*$+6FI<=)Gn>JumwC|8yZ4KA)goCod~Zlbb4PV)=2(#>J^V>$ z@(DH*)%#qk*D6);jPXZ*Ev}lJl>Yw_O#XvY{QnnB43Oaw0D$%Kf5D{L*z^<066w=f zZf360DkD0IPV7SR1%Sm8it&Vs4|>JQ7^U0i_)CgaFW9(<-7i5`e&H}Ji;R?$GYPfO z+8zh#7ef-gwu2=~#Q-tOFgsD9Jrg03?^l0_gkMHJ;+dwkJTHHZFG+qqdpv93gip8I zsWA9PwQl%m;Njv{sFxN=KVA`=7|k(o7}px|Fb&(FV>6+oP`+A4R@6N;?N zxyN~y(F-+B^%+cp--2A%8h!}*-ky~ry6aWxA@^Z!we?RT1EB=qy`S6V!i)ifu?q_7 zu$~A8kQ^sk3oFb8i4yu6^C!B+c%T-UCJvsf99EDV2f-Zc%%#7iloa@7Smrmhp{?70 z%gkv~u;Rxu`%}DN;LEBlKe2!Ye~bcf+jn6PO+5X`q^Gm0=#|$^#b|KT70fZcAq+OoIr=9($q0Ht5nR$l?<+!OSRGMB#9aUW( z6qGCZwMduqgPR)>Js65qW8RBC&n=SEjtl$vS-vm;SM>!iamDXr+j3ELj*POXxq$c` z#5}?w_ZhMQGM;B(^t{8M%(t~m^;RwfvPKQ4@w;1nK`7$a(;OhihVcbFFgMorX2TwP z>sSd=^~ZU2&SGC+%bV`Wzbm>}WiwC*Ya*R*wB>a5e5!TR;__h1u=O)7u=S_jDx*yx zXk%kzx{sLj=gZJMk1RB&hE0{3VAlX=z8Zf|QZ{AfI>eZW4-@!-!m!+}P%I z&gA3cvjsORZyF22Km0cT@)Pw6!LUh|-{P&G$L-bDKp3{y^W!ZN;JElB$Udvh=bBS9 zPdw_Z<}<2%M2>T2@DTP#@{*OH85364AaxFpFJHFzqKIKj<@v#p(Ca1h-RmW@h%(2w zyMAuSue+o4n^Un6S%LH0)Z5rHqXbGB`L6((^c401f=l9hgo4JR5T@v`OYk# z)ae3yax|>OIira>90{29pj7~|FCf7bR)neF@|C>dnjoKhA??D;8lIRboQw>+GgN8#3tR?-#Nkq`cP9fhBjvfJoj^S7xiJ zJW&Z!PKqB^%^c!tuO5*K^sB5ED)s&}*kDJ3CenBYZ%$XWYgYj!JBN9tY;OJK#f$m5 z7sFPz;RLwaA9OwIEr+otb0x`@P$wGdY^SnbAM;nQG!=;xMuP6TwW)0pMkOAPG9UY` z9ZGyCf4<-G*)o)JzO2vOni2L8eVO)?hXv|)b#wE=s7!~`Z87owEgB=|UgQwPu*#z4 zD@U7;lotUv3n8;_rLV58EauDJ@Z+G!69iJK1*f+g!}TUul8qtA0@jXBeCYY<>ZK$l zDH*Gh8FMoo2k_w@hCqyXp)vO{62P4n-NdoBO zs(qkJkiMaCXg1#aJ(Vp->5^;QBfh^VS&A#f3<{pz$y)q_$xp^(jLI?iy~>^l1tmtV zgbB;WpfA=%YI%I+6={-gHuYBKuAC^Y69cg7S_dA+lDd7kEd1tH9KCh#k6r?~Pr`ET z#}nq7@@TS`VSDEmnT+_3vEPxeeQ4beCi{PtYJ6C7`uL#p8-i9nV2;-Gp`iQO$YJa#%>^sny}iMlHt2iJqc z?dKony>$C-lziP+M0EZz!rv#JLD!0te;Ew+P`vAMXJ4H5kqqN3k6)ataG)uQSs3Y$ zP~EOCed7!vfl3uAZbSv;+)W0GrrheOzx)0w_giM6Y7hzQA|5^~XJ(zMJ(c8YlRPfx z9&C-n>6cOP2Cu5C`US%UgU(}&c%Dwy)vNQ26tvV9FxQH(q>SPrG(AySuZH0=WtPYS zDAFlXRX~GF;1HYT=4T+8`2ZL?A=Fc=WCj$*XUX%JLH>pLVajPYPA~#4nJx>KYIyy#h2Mzyr z@Cr2QA8Dr;M1L}V9rZ&wJ}(eiwc=;P?;@ggLMO`z0|kd)_+2v{)xR9Pk7gP3Bh5$) zf4<{_)+>qyCG7D_l`vz=n0c@iMj1~9i>gsG1fnT+`8++q<@7m8oxHqYrmHRZ#$`4H zNlPu3;cG#m)E{!cu}`pLMSD9;hl(cEOTC%L-Mqv%qonq0)v5T19Qa+AlL#Q=eeZ>U zEctKVEFd!_%gqI`h+#%?iRxf{7A8)!^} zgs%%aQ7#;3ZZpy$ZphjT_r#JZw{_|#{~b9XCPVP(|2n@;rpKl5I+X`I- z4$%XK_{_lP_IMu?GZ#5up-k%9hQnm%!!ws{M|jW^>UBm(N0haYwu+XVo-jU@z3-c) zC@J`VKu$TteYyXGoR#*j8vuZZ_dm!vob41#yWlBh}1PsJAh zrce~=6BQFyv|f2#S|Ej_x#$Z)PIHHnvR@1O>aakiASRQIKO=~&azjZ~kLs=>tslz_ zLPSH{X-2*mhbaykw5)|pBM7;?a{7b)X}`?%&J*8tuDG++OrgWuuG~W@Ar*$*;rGc3 zINA@7%}Y1yis+kcR%b7)J~JM?n*1chkU?2Zo6(MI{PEp9xd0&spatwG0;44`cQear!N|XIJBnG^myKyqhhtOEK#;9xPB9*Ztg_Rsn$P7{* zMQr9ha>OZs#DN-00QJj9ilr*bosoThKmyj5mdeA!!zW{rBe!oM&%?PbP39hM(^Q-I z+7-HTuhDV(CxiQoSidj#5rK5pZYPvT#u8I)jI`DJFS~YoAkU8ze7)eJ zOakjWjSAfcQKuDav*kv+?CO85r88(2~(b9TD- z!~lyBmu>i=w=QpbbBbG>)2g%cX3yg&0+g2NavHti*;1{rUKispxP`1G@*UE9rkkKR>fPn{*a3>iLX^NSSDNjPGcANOfM4oVSmWa094P_y z%aCQEHmB`icxR0nkE2y=aNv=+)GI1yA@DyYfY}XqS6sr;p|Z>A_H4b=>MMc3Lyuo4 z#O24DbnxM6)GEj;_)Pil-Vhi}BztxfE2B;1%eSLIsp@D1$ksSH?|D)37#R@ouji)O#%nK0rOu)sIW|6i zCr)f5P{*ML%3x~~92nMDd47K0oGeF8GfFt5lpAhm3%>2VwK_?wZo5D8Eojy}xV-C$ zq(tyEw;}XfBh=1H^@c;;w;M6eHHJuE9k2*27oimbNjmDtZXv_5kdMVk;TBEk!jk!R zAjU0y&bH^L`+EOJKOoQ~jW5E))z#9Aq8%(lx&;ah#6u>*LR+hIVT=TgQ2c3$tMR_H zz@9c=JOTg&e(fM_F(v3C`WdCS!0Y`P;gyIkv5XwWg+mI;L%KBJ#Iy-@LYhFzS4+kCpB*@acxIpD&PW z(rOhzNR{|`Jbj~NfUUeWFv2u8srk|0>HVLQ)!+|BfnOhTzq-JnjIjv`it3o7uFyZb z3B{eA)bHN$a!-ux?Xl=ro5e-Y`5@j`mBSSV{XheUFwYt*R=98u(QKbgyIQXgTXTR0OFZMdA?^7Z8g}Xx)ktL^qB$|(r_~Ff^H}R{7|*O$3w7&n0PdQ^7lY+ zFx@21=575~h}mni%upL6r?A>*sSscVH=it69$`~|=j~jMW(!$XhzZRC9>0KL+Yvv> zFJ@Of02!OOCGwsYtzwbrVJ2l|W#}-uxg19rBAMCkzSS(!X79_G9?)VAoE{v-Anb2( zsMM`<;&P4II|8JH2FEYrPLSwpQ3hVU(E}KzDp#C^q;w#Q&*=yA$dP1YxDz%2?Ho84 z;NQi}4b%eWE1d}fk0O`Zkbyx59rIpZD5iLEjX3_$u!Aj@U-3G0I~sdZ)uit_ECH>c zIb3wXmvk~#eK>6K1y=aB%PN{yQ77KzVJ>1*qHGt=wPQ!(u;SyJk7=Zb#6M zgy7471XHqtb>ya?CwFl{woXW{oj7DhRo*420$*WmxP<-q;I^6=#CJOM6*-(0ChPm6 zkVOra*$VjrFU4HM|FE&OJKq>!5}mV`?vD2{`MQ)X45WfHN!SleC}f| zP%!#;253Kx{+9|H>?0g0A%<@pOzz{3U2O!&XTM1nf0)M5N_uXEBd9%#S5w}u$SMBA zW%T!^G(uV3?1Z+R+f|LRuQfmVSQa15qad_98Jbb~dTpG><_;NK!BdL5gWlKJAKAbw zXvV_#UVVj>7>H$pGCzOi;w>BBFG-%S1c)>~G6gM8d7VKg=gS7-Y{>`t5D9;R%nd~v zj|sZ%2;%R54(#DT%vt}96my#hwNg0h%SyOCY9i7M4kIgPD%M%Y3GbT!{pna@IAa=!;c~3tjGcpG5fLGTHKx}Y-^R(I&n%((=;2_FJM4Tdb8!!A(?pH z#pyFzj)RaX({Cf#OQa_L1)zZ4IZ@}uTQl{{wT&8wmSKv-znroE!t{N&-XZ@~mpq9# ztm3hCo}zM7?0k*#lS1o$iy5hDkzi7<_Y+5-O+~N3hwrLBqiiRw z2(7iBd0c7j&7hEwhV9J>^JP;mks?PG(rcxeJ!> zOCla6P=M<4kgsnfE+D4aammsJN-qB8nB@IZm@XF0n&?2NM|qu zo-WHpu6r3kvm&+F0e+i)f4bliUXPpj+X%`Z+o0xsP_kgw7u(=$T&cd-EF~$**;dJ! z37CvUe^PK~X!Nl%L1{L-2*k>pWby`gvqmuO`M-B}<6+b#YR;V`&wUSh$QEP4Frj}q!mr}4>_Jq-#3-^Di zfzo94{5B@mc!;>3Q=!Mby}8P1aRr%&ZCBvH$NWqPm_y^b!rdM8qmh7W2 zhuiPpP$Vx>{90P6$O&_^&o509F+=vBbEIPm3(a>PZ=Vsg=K!(;##YprYDLLhzb|vZ zW%map0MYsCK%o%o&@NSqHgGL31iO+XNb8cGQ7qJ!`>4}=&SZw4Qk%vY8c7#bnk6Cg znYd$&1S?Fc1ZNjyhu+)XAF;&jWR$j#(SIs-uRSNK8!39KQ=*y_7?Zy&FSJT#{HgLp{&ZAB9daMKYpox23owqQhDG#igNYYYhQme3B8; zBHZVkd&+tzTUQrc^2K=U60>kXn;-N-F}ptkdwrpT8qxkqV!W z=8EqoGldio=!58P1cbnoQi4|y1pzsZ8=u5XP)FOIA2t86az$yQbT6kv2 zIz@M!;_>&PvkWV z#oWy@RbdnVtnfqZEu$?qJibZ(A0a$p)MwW%yI`Ke=DQ>WeujqGC@kpE1Z}!zQdN!RM#eiBwpo&cKVcU2Y zz(&RrnwZ;Xjio&!B}Hc;w`ou7s9C$W(JzNQmI!g9y$B&7qS02KcTbPzYvaW$)H7pM zZByN&;+G>LBdS;IxbMsHt*4A9{TcSDtQECPPhg7~Ruf$WN zry{IJ2!P&*U0>+qG#XF)G{FavASOB_-1bw576E+m33-smsQM~VcNhXe0BCN&bOche z_ywP!;`$F>#nOULCu{7fB+n{5^YH6oDN8bg1Al>LENyU#Z&dxJo92xA7+tk~Rp-=N zd|VtnThxgtRv-&o46tzj`&#LfrDd@5pE`N=QBB$XluJcQFbz(+YSjEhsZN*xIwM+W zVxmH@szUPXf-kR&8u5rbkRpDXK|s>QAd;NCt*`j&#~8?cOcb#}Lg*tDEQG-fACY0S zk)Hh1&!?s7W0f)DM+r508Fz5*${eh-{)ApCtkcQ@^sp;v{zplBC7C9_GJLg=UaHWo)SL6G zxh+)wq1kUN2k7~QS2U`R+C5ZkitrSQVm78%8{QEC15fixC{{!ly7mil1LyFiF5~ns~p{^RVLL zazyY#UWo;~c`I>95R?H@a@loiUB4OW_;T_vHm2q``={oM9w6x%3r~M9Nauf9)5*)B zr~Wl{qVyfUmKIy|j7FI!IFDm<*|vwXH@luy4Kt84HG0V*j4$lNNe4o6mR)lqglba9 z#tlPTKf^n9O0O6K-<6k_D~@DDQ26JVX~6kO9TXhXhgiPYAMxhUZGS_`-6?8H(IW_~ z0ArVg*KRhX*6s>}k3W1uA3^fE_L1JBDNj=`&0qK0jSCQykf8j}G;?7sJb=jQX7`tg zHw%R;E&MoMjSDFjldTq#<66PODVqXO67xOk=?%sIip2I$ zY%`{nPQXQ`u=1}WRb@owOP^Skxow~E^9F;vtO)nW0>cBAa?Q=^T>1^DuEPm*f(1st z%#!6Gz3uVgxpCD_%{N8e(ot!Y}S3y6wZy#kN0M{5>({oUFR@=42OIvjrpvzuGb* zGpLs)Z#sz7c0b;%LiB^r41wd~jTTABgTzu7)gdEpc!{CqJ$wDX%-si`h#-n zy#tCh{FfMvKmD%vHK-qOnX$Uva2doMb=vGPMXZa_WOZue^vf85k)MZ6)jAd2&cfM5 z2Qr&9;z@=@+QFxqlKUq#6j0nwwF{pR=ez7r+2{)!o1gYgfU73wI#zOQZu5>1GdZ|~ zgk|hGKhA(oMbmpwd#Zpkg2Cz%IXOYre)lZax&b#w=j~ zvTQ2AC3T##VYR-j&*Syd^I=pJCZfFK*a%Hd>7Q6H9CzLCc0H!QyH+%tM{q;3C8gHP zVATV&FWl*1*g{e(CEtt)KRB@Ok3ntE-SMzpp119T-#Z*{gx^a@NYGH;iD4d8WNS9& zLE6Qkk3~|G*ZDh-Cc`i;hJ|JdcOp+s#V1W)HK%5nNH4AcyN^+Lu`9ggFwnetydWPL z9o-Mdr4|S3jx3TsAcP+cFg~Bxnh9qp1JjQ2H=~6z+GD0f5@GR5;h67Yu+K$TzBTx~ zfA9d^Ug5}Ce^s#Lj>^61z|s@3+O!0*PS@Lfp6Yf;&uTdkDEk0?fe*lCIzM}T^fICd z4~}e8uL`C=oDSbi4L&Hp=nUGdzF2rgqoW=wkI3i6?ZUO36E3ETF#5s>8gy!C3@Vyy z(B!PFtmv4TZlHtszP$l|zs{si?CXs^$p$&&{?SAVDF9E9liRLnvh9Zms4{9h3;)L! z{jSuTT(onARS$mGt+I&im-_3`lL($~hBgr*_w+L@iAn8gqK!Pq`u+R2`t;Eiq6Xo7IE&L0yT{&^ zj*FflP$2X}q(gJ~#8T~OrCycpzMOg#f&#bchh;EgQazMhr|Y z)6733JrN~T1cZw<|Ch;n^iD`1k86dh09LP+hJCVRrNErGl(_~Kx|Ir8n8?)D`)tDm zNO!9V0W?+m)xjw`&jKSZPjK?Boftm(VnU9_$cyVg=i+&gkl}RK>^I%|)%x4sW=+&} zYqHVfVrCdYY8<7Id&Qo7ZxrY+$oBY(IYR=F%s$(tI_XMQkSyL}G zO}#nwYu-}^uAvc2E!%d=%P44q5xCqd|OgTH^1sFw<|L62P5!zFRo8q7me)xuE$7> zJU!mmBTB-gZr9vlkC59U{c5Hjm)oE0z0BZ0p2eRNS^6W%+?gsXP*M;taLgQq*mmdR zRkb^FDs*!yht{y7#dL0?U@gDndG^$Cf)5~c+tFHOCgejpJT0wVz8Oh;`n%Z(!R_9s zyOXx-G?Vj3NB}*;m2!qVh^RX1`}wBUV!xb5BU}&<-2OQR8;SqnmyfxbVS6|zvx)oi zu2re@{Rj&F11i1@EC9M_;{4aI*9cWdo!h*JCLcD$mNRqC`F1YZJ^t<=x2E(y34*OQ z7K%Qe|0rDNv?@9|IcYIh^a`N@Ch8nfY)t$4tIy7*2QpYhq6|&hf7VWQP9UxJ%}dCC z{AUL%U;R8R*5fK^=6foFO9zM_ChF|O3QhOjanBcy>hv*VMOsU8O_rm%x z5R~!?anXK+L&N*@AJl zc{)NRc7!X1{)*w->D+wOJPX=Rr53eVs9gBIWG5gb856_X0U|f^`tafb1;cFcKT2Px zqQt#)Bqx7d3zC*h$>11*r0>7@M*)O`pRn~eS8Mm_9@6TG=3soQ!TR2PO5{HlS<`#Q z*JYU0fZ>kBg8qET?&MF46BpGry3}R}O`xBDT7W-O56-?_zZk75!3}CJ+kcmS_TQ9{ z4C4OBh54C}R$Ff6?3!%eks&rtMA9~4D3kEO z-^L5cfe5Eo6PT;Y=6G)=>_108?&1txS1JveR#hMa?`yE3WnwZ9%+B)nJaTC4P3UQQJ6j`B=#R0JD635m#xI^T@`_gtnK@Sw@s{U`y#g8)1gz#%Id+R(x~#0PA088 z2>}mQ#~FQkPd$G3&{O9C>QpyY&P31un^q~MGab0${u(4Jjbb?4Kr@T*4EefQHEqRZ z;6`XsAxJ?zWy0n)ZPvj0YD*!VdHc8Knf%Pm{>5sOIfv#x>CfcVolOj6f%(BX=@{Q$ zL7?&u=z#~WlU(M@2BM(^-}M~-++R$z-RAAl1T6`i&&PgwGU4)ZMaA=>ZDo(QF3|E6CqxW-A#}|8fMOmg2`F#<1IQe%uFySi3VACcBt3lD9eeuwuCJg2PZE|-h z!6`A*iTo=2+bG}%0 zUezr3mCx3-I1Lx;Pd#)$bxjhWac^-_DK!sBqeaM;dq@H|<1XHyu|Nr>dAZU9 ztXBn>|9^9Fcy3H{+8V6SKc?@7l=p7^#eFJZH^0`H0itA=Osuo9BCY=B6vJ!4A;^Cz3&da}?8efUrf~fV%6VBsB1Qd1yFetp9u#_Qp+Gbi zj6Q)P@M&)GOKFrnG9=bKPn6AQG5j7YKI}z8ogU*CqX60#b@5RsZuEto!8|!ZpO=U0 z#|=Jqelk-I?gdlb(=C(pgZ@^(BT5;X`_q5cdrN#+0kf&KF+ZVE0tL$-Ep0u?m^$7r zIw*x^X8whh{mSZbu}(~_eb~|ue%U9cT(7q`FoR>fESk$#174~T+^D`t%^$}YDeCmm zlzbF^AMj}BvJ=Gy)bW9gIy^XJE;DB=PFI@8gwPrurh{`bBV_sv;CU!uz(VYKS5{jL z>Z{{V26pWBg?aAZ)_|}5QS%FzKW#P5YYvk4K+*g(zIJ+^RJZOd_4=bPI4msFdZ27Z z_0l$ZLcct>_b1o}@*-Xr@Sz?Y`=O9oKCb1X@{Bb|fM9e5q-GSa{^k5D+vvRdrNKjw zt_Q!HU|6jee#k@6kT1Zw7dztyNjHjcTWG;in)7uc#+TCo{dbTB2Sq5@+??NXG#g`c zEaIfL`4fula7kQlJhXV}5w&1dKn>g=%()SYKWZdoD44?o%8#wTF9ma9zK*l{b2eM# z_0vo&odc%4aez!8|LE!YazN`r-4+n1rNKy6aNX*h&g`Flw_jcc4SqxVCg2wC6wNSP z^5(f_i%nzm-^cKe$g}co&~0%?^i?%D|Ggc%EQ-F$z7SASbIj^XGjB$eM*KB>%8i4s zoj=Vz&^da-XZCYl~jT1awiVu`B2wL!!ftNnJ7XS;{7A-*)f z+Pb)^e-Gi?DMN}_TR`#a{#>%eKAPtyb?Y`g0c*%*a#gaVA8CG=B@8w!Hv16os!#ch z>z<64srR&38-2Q)!W(BRSaz`dE4dNmP#vw`NGh92oLT?Z`mZIIF4EYKy%jCi_35OI zH<_*(mg7O1KGG;YSpMZj!s#URD2bj68JH;{*0quvxsfy?hrMU03Q^tvqGxUpQPQV4 z{=e9kZtgFEC=quZ6+7#DLb*p2paS-#W088S-1Hu18lfLnRY`-4-@Yn06LR0VOHE=H zKN0mPkBoiqaPMRnn774-l(A4@#RW2_R%Z>Np{AUG1x+EsB_l#vNkixwv7IK~^zw_)mStRQug9mT-ea`x>P+ILT1{vYN`5k-&iK;#ifi_#ZBr>coI(@*uCWYUxVpu@7D*#+!n~( zzCsU+z_dtKTU!i%5ycKTIaR@`7*5lGG(Ad*Tgs0r@+(nW%^zN!feAFQlvr&;cz8h1 zT{-R$&LEA*ns@(z}1zo)Jz2A9!PdaLHHKKdGB9B03{!Miv`uF_k5Pz-ttAbc=~;eCF|&GqUvZ1Qs)S(hLe< zNN+Aq>i42yxsm+8wLbE_b_YYzt=O=iL0V&=;naLyWIrZVG*QsFvxtdd&x6vZwKl^4 z(rToa2yp9q)_#Z#JyEK&h)dM( zoFdD(ZN1y!%AA~}LqG$c;Zb0G4krTVXWe3FL~T`Bl{LlKWFVhHP~kQs4T4@|Xb7l$ zC2}1l=V#N2s3ma3w`64{c8fSb#1Dl+H%rbI6PSu3JSqnGAsK>$5gRT3>;Bf>zWjE9 z#XrCR1IJru(YF_VUOlxj3>xqneU8K9^{#_~{Cgb0G-st(9>Fq-`3H64^{+sG{<}nC zAVJQ9?D`=Ttn*~nxkm4ueEoNMCz*>b#g>9qrdaZim-*$j;#m&LAvyDva)GTozAILb&>Qk zQHsH%HRnw(?t{$5;M7BH5cm5wf+~Yrbi)7OnAdIRChZKeDwnxI&81mu7xybx4K89d z<05}%wx7^eTJT<<80m`hey1hVuCB{3MvnF;&du+E;&uEu#cWQ*!?JZ2pLX?sB-vUO z*O+j6M=gc@<4`?zE=X~X;#k=*=;j{v3DnAjCYe#eg#zs7Y4~a_rx51qeoBGvlZOOS zzFHrQ_$HJqd99hOAvhxRm`4p3RCsaE@!{vcKlJ-mGOr&anH%}~52QL$5W5O9Gil9> z`_bSBs{tydnr*jXgDHj7{@`)?V-pk^+Nm!?*hfKi{qi_Y`B>=T-#>0V+Lx#tEaRyS zv^gJITPYbN$85LB8i}40*qQAl5IfskQO0Ln?DCABXP-DwzcEV0E+^<~ts%mQwvUpl z+j75dcpKJRqHTaL-~3x^ea`@fAbLTPs_={jZc=GtSEofM^l-$NNI zJCrl*J#0@-3_PRfPq*jKVNPyhJ)enmR|Qt^7|{d;p<$C9ZLUppU@tw$zhD}W+-!fn zS>^m9A(n;ILHTX+-;ek$>@BG@C;-QQSWI~i`P>=3Lg%k3T*5C>Zu%O&-n2JLJ3s#S zP0eSWHRkAG(Kvg=OdWoIPTe$sNsOxqeqWh}i`E5IBkmH(Br=xTx zt0Og;?ZGLym?F6|(wigS=fc>bENG=-V52-ZmwT(R;>!k?rYPE@4=DqSKOL(K-TFm;d~)8hFZI%W>d!$!e+PH4+LU5AuDV$0xC?K!$a{w+cz?@eA_RBOMDk!8 zuM>Mtt^HKhb{)r9@%Sevm3~>(Kd$p*pj@<(}1c6+xs znuhZs5F7Ru^-TQLBx`4Lzm7lCua6qC6;Dr`^qRdpfSRgCiCKPzSc~)&R37`~#1y7SmX!<^ZA@2pd zBr;N)nl9c&3*HZUlvyO}5lsOVc%^6L-$!<1-;^TKnY~Up`4ThT6s% zX%@WH7(gsr=CqEb0c#yLT6s@{$Xy18)B2y}G9TK3r<G3)hFg(Mw+1y)24#n?UDt~rK5h2U$`kZmcKv=QL1{JT zWR~+`R8g|-9=?9(-Ica`K6(oQA9iMBy+qx-b$5dIBpl}X;^9j-p(r*p-irkg`du1U z>z;?uKLCg`LklgFCR49XFz~vo&_dYbcm0pC| zHgW)7H=h}*!G^Vx)3y>73q!LXf4lxtW7{qHra6F6?&}aTv!C9qBEEDe;vkTP!!dy; zWCM5RGInC*9}4{l1yvk+8joqXUX?+iPQ}*6#PheFcd)L)#3&j~sJm|7!Hgl&JR{?%>s0mGxwi1Vmf<7Hg zC*Q&3J!tE1!rf3Ah!AYnR*sdI7s$3szlwsAQoh+(o+3K-xCJFSc*~dWVf%wB~5RQF!!=FZ0d@kAp*|U_#qp zUyebQNtN+e3wuY`Ypkfry@4BYhC~)sMnbH@(YGxMgbG+l5^eVnp{zmTy9`C-d0snF zQ__^PzGpQxQR1{YO-&089in3G zWO(OcyQ9~u3EUMvTop)oPmZM~390D_PWJ`T0xSu*ubYAaRIe8v6tstx;OmaOfzn9& ztrA`&V$EkfB+9l>5@`2O+Fz5;$vifHaj!?EA4fC&`oszlddM2Ff}BqVq69mT$FOc| zi~(fE4ws2krNi9Mj=%3okbU!JyMB}og>XC7z^otQ--@yCCb5f=nG>iACykrwBS1xZ z5g>!f!CF>U2HpFnrHtXIV9Q3G(n3xicjyg+&jbYdbjRygh0)@l)_u05)ZHIlXFa4V zN#y$te&zrWM+D;F2#I_>!;JC4ok>c`;&U=_GVPfY7Wsi^S%92Ko$1gR6 zs3^uSDTyu1*~eSCtgZUsQ?)Px*+5cvP`_21EOM&I8sJUY=! z5}hDKCwlJ$L4sruT||&X7lhGk^e#q=UME_Vh|zn75H&hu^fuZsc&>bZ<-PCqKI{3@ zV$HbDIeVYIKV@G8-Gaw&%?a}t-`ZlLd4fJM!`hDdfLi|vcT?5*eMK3J$_J=Ir<( zRM^3lCI8z1OgRtRRlnEH6ebn`ajdYb_cK5jf++tiVuE0XQEEh3EA_#Y)**!O_$Bb zci)i0A2*n*0MHkA^Uz<$&eh6DFXj~B5gx=L{_SM9$B_CAk+4h-q&OX(c7J1(WCXRKD5~D=y<0bd}78g z4?XyCys$TiFMj_5zcA0j7@tTn>qge??C#C;myi>-L3#)LR!0;fClYwj)53`=2f;Xi z_W+bTtLVI2tO2mmkxZu%pil??Qntg}Dr{i^)@PdDul*oWa$e>7W{NE;z&jWr>G?QvWT^&!k^CYU&70La_3^^ znWE{9>>U;AFo`(`eg2<8YJc(TyYS8n8Q@|ADA_L$jKvM+dS;}_3umq`?}(wbTykj zgggeDRRk89Fy`y$n0;w9-3b)T+9k1<<{1FW?$8e%Wx#qEXR5v!iYck zZ4dU}s)&x*L2sQ0LEJn%-2kI}d-m7m)~SBB4S{Yx3CN=zbQMW+xzZjQwNt?uMnHX; zgXmOz-b)<@3$e9SlD(gAKB8GVZ@O#`)G7Q;r`|)4cUym)P;;zJNtLsXL+uM0OyTg? zrc$g&4{Ck%#AADOIAU*q7{R3I%WOv~`6>6-?SU%33O(*&YV}EMB5k7n26L*5U{Y-M zD|{`+c9I35@!k28eE&@jb`Bb-N1iCfgC01+udGo8Ko;uaNy_%<8A#dvD=|p&19mqp z_V=wonogxz^}R5v2h?s?CvK5JH&xixp#;R3PG8n&3(Zw zUNLZ~f2RU$;WgP+P>{q#a@^-$-X>3`hHvu(giq~8DDw5-X{@-4nwvi_j#sA<@#`LWLu>pM+5=-iB|K9bgY z6xJGLsOiO?mFIHJ50Q*VE~OOFjd{Xt`+j(LSM@UuhGd&B>RsBNV8KH(Md*LyUU5(F@kke;H z+X0+!aJi@@l*?#ci4#BJoV}vBiKSYN7O6T|Z1Hf&cV}W-CmF$MbGl`V5&S^HK&n;! z|1H|W0e+1G`j2SK+`a4#2;^w|-=eLbzHRm|yo4@)wM;FRmM7y9XcW^v%NJoJ2#tw3 z&&sCntQ3{Gdv|1VQ}12Ps53;k<-i-R_A}#ZQP=&q`Z}Xy@o)YYRBWg!n=!W^H1CQ-pqf+Z%R+F=zYGwoMMnwC}m&|`jN-NV) zXL*b&NXcN+sIIZ!>N8KnO!2-Di0G<7G1`P#QxInDah~M#DdrTti8WEN*ASpm!(FL%ynBWrou`rQ@N|qPvr#h9M*l@ z+D(7Af|Lj9nd8ec{ZY!wIYdQkQPv+z0PWNkLc0QJx@yz`~&$fyT7i*~fi9LPbSN zJSps~s|lD%1X6?LhS*rpI?AfmL=@FzWj!siPO=Uw-B zT}ClL_j~=2-DzY1*_=>P19AXC@ zKDT{8q*=rlajfh5*yQlW|LOsMphVYUTAmbli8yXll=aiQ{nZj0o=>V&l1p6U$97I1 zb6kE%=CT?@V|9IV16R7)ZVtQKQ7tVk_#p57d0vFMl?_H{gqeB7#(f4Dp1PPy2 z4c72i=a4Y+u2tU%c<7mAerZb5Jq{NdiXhQGt|>FmaXQmnI}v*Mw?S}s^*mqfQUC2q z7pbth!0G$%@BhA$GGw2j`mfcu+EY4;{(So)_lJ~e=ya(gYE!>7^v0diH1~(Cm(+Kz zfV6sNH7CzApFgk(GgpXxvj&T!*N|WYKJk8=r~?~vzCEzam?&+N&(!BHRewm8FryQh zO%4biq}j@U_o*gO3`i?gI7uMOH)O^&6CV6fb;|{Da1eEHYun1@P}B)@TZ=T`??6Rw z)&ol%3FCj22`n->HSw7WhxgO%jUVApOUi4NJhG=0s<=jV zMn50dMl*@UNa2UZ^l`FZfE{?$VeRnlyWN9k!L zpb0cT)0A!-rN`QqPIQis(-04U>ey#0aHu@m7K$4952p0L>_-vrGI8!lJY!NGNo36ViNs3i)DZnqfq5HO8-xQtGM|j4Syjrs#;vHpmr{@BO z$Izb;p1dUx{z;#!Y_ZgBiO32=A^O*KRDeTdGumM>B$JK zToKn-004d~w^J)+tpzr<_yQa|bwGvx9SKksD@<=nqz=AhT7R_RC4Jfehy{xYmm`V|EkFL3#j5l{8{1bbqZ z<2DCA>iP)?*6xaXzI^Z+X+BhpZ`qB+(FqN5>J=e~H?t!iy6fX8R!}|Zp?>JV-O0?C zla#FV=>7%gB|Zav3K=2Z^ueil)8ByiUrMYXw^vKIgn@)2N=iziN;v}zK}yJ5fbU++ z%E`UN%g$Wl(Hf{zA!IKeNAHLs)6oXG=ziv}oo+?TLvGEM4XIxLg7ob58n)3`hrH8A zT}U^XOQMf`xK8QvavFYP<-IqTrWZp~<@+xV4Vqk*axMIiZsiNI5$57za@Rw>;RIkr zMjYQmk+9YfVjMx#k^|x(XPC%j%ZJr_A()I%5CuEo+)#h*-1byvfX~-P$iXGUTI0oI z)6rtj?^>2{PMOD>%6&~W@n)2*q^f&thcv`JNXbQ45*9r+FYROBI`zwH^eJf^Tx$D= z<8%XfO&tb

s~1S|{u9xX~4Ezi4V*I9bEjsTc6*qu(*8e}#aF)JUPUsz=Q}{8vb| zx;G&utc3*dALBJu*`|$U> zAbfX~G|&YYXAwBFb8Z1#A@wlh5Nh|7q0dU>2u3mdrR+^!_d8{&LYgb3RqpdoI8PaT z9*BV~@-H7(i8=9Q^f$T@BEaN3U_**Rd1ohiyXO}#ZZ)2BDW|@-MF>$2u5rzk*HhVF ze2sAThVk=8a;KYDf$;h4`7I<6_C7if`zPs{M531I#2!k#JkrOt%kcn0{DYIzcETb$ z_Z)iz)E?-7V!X-{(6ohA-c4m-qXNJke-3nhxKm45?IXm#^@=Y zq2+t2wm4(uXRHVS$212}yX(!cQ2Rxk(E_5s{@pWa zxM+!CXy#v6q{HaxODF!vNoiIR#@q~=W1E_v58lzSRg=p;tz9cp^h)=QpowAto_()+H0G+KTh81#WOYYmneZ+dbpjm@k$NrtNKiPp=|J1q_K zM{Soh*%?vh!6TZhQ&Ux_BB<^fv>t)7AONA66*q`v3+s$VoKd+Ci zXkXM@qg>Q$(5o^t1Lkn_S13I9^sf5RCZYAG9QZ*0OUPCOq2|6)Dt}IV^+wF)ygkvG&u?x?pGs-A~=oaMKa?}JQlrNFPB~) ztmc>K$Olcyy1>xG?h8T2ninb(C~Bp|in530xYE|KwWjGP?PU3!0smtFgI<1W>aZ(z z<%SpZuYgzpZ0@gSt_FO?>g!8|gaz$;^%MnBl*(XSzQ{@(m=Y?1U})QC)23*fxQV@( zz)5z|9rFCUEdpkvfqJ}kdO3UId7c^`9*zdOf_l{xEDe5rB!xhz~W+5c3W9vn^o zr}umnH?Y6fFmi-H7Rt}Dh=aBr!GG85b>*p6aS~1k`bJl%<+bzpmU*ImmIvZtuYwNn ze_zg(LGwBvQFyFPe5v`{2en{L?$>T`mI?fm`p0C=^=5NGf>kYyYt-X0x58}>kSvaX z&t!5|vVKc2`VgqDj7UHJHg2l77oktAolH;{m1(?+R;o*Fpb|tSFzWpIuT?*l=7--@ z#?7N%Ax4i5ln_=KmHrE%gXsBUN0g&?qE**E4Rb4-h&ae+@fKPbe^EWFS1)X3Zq8>p zqb-QKpU;nz);$??u7rZMeja`h`9UTS-<%GwpJhOv0l|hSJ{SO!_$SOC0`Ho#kS>SXM5yb{wdA1p{WlTJ1{!B6sm}vieOhP9{W0fzX7UbTbhEz z9$l{HcaT05M%zFdkl3983;{=6f_0q$CrAA?%Yje74N$JQc9$vJbpj0>sU4Z1u)0asAS(_}<>))!&w`|LghbjqJbQ;F_`g;PSeO9C z5)Vn6TA8;p@Lg9tx0||CKLOU2rk75^#x9c4+0aXTzNE@*%fjm|!4CxC*RL+{r#JLb7RvB^LnXxs|4NaGz=D#=_f|1qAX zikYTug0c}wqY}0v)GhOiOV)scXU`OdcHZMP{8Fl&OqI1npnNG1gb_5gi~X^lobXem zap6^z`F5GSHYrq)+w)33Fv+SEg=z6fHp3Jk=qipH_8auKWoC#+(Vy0;hKH|%d3w-T z>e#}Ukla#Y%hTasNT}~`LiPPrU0@0l0;ueF0{t6g@n(Q5!%I;Fmk|@2a8s8VbHCwX zM8Wcj5C4Gqe#ZA|{82YvX1^{cix3d9IzGAEQW+httbfh=f&wuZ_;n z+(wGEo$BAYCU{^*Eg%@=Fys$i8SA;1`t0r0o_E5|`4xW0vEJ0hr>jnGz@2%>anZ|a zxt|cfj&=6PdQ>_kEQZOXc3y8n;y{nA`NK1+ZvSevm+ z(D-r>*2+Xicrn$~9{$$_&hl}=m&ZM$aAK=VCX(HkCzQG50gc2^aV5dQ9(Yg9Ve;Dr z7lY+w6BSE1gd+jX-jT3buYflrF#1S4WzErg6m+NoXBe>JdXj$VoYSCo4N)RW)cKpF zO7s^mxZY!on7p|`(=d&Ry!r#~>}Sb&S*q}qGM10TrLc{dh}3E7EXqex_|Aw?s>i%L zX;yN&0pHc@+Ui`APqT3710srC!FNqRt)z4Pit*Us6aGPc?T9*Wt?)8o%Fq)?zn9_q z=eO3H9{jRWdV905!01bf&kCtk6rjBezc_1x$2oiN_uwgENB~jRbIWSm%hWC(-)3wV zq60V6rBFucmbSjTLX{RZ?Q6JW5Q-L)BmFxZB=@e6RoyqaNIO^11@BP9YV_iR_ipoM zd4iJW($kdnu_~XzQfgIQw_=a)@X7mIFjl=ks2}ES_oPf}@k&GPP0O*#M0B4UZRxo< ziTX3&Gul=UtfcI9yd58ZocjrT8u z(yd}iN$Ic{jsy{|9hcRq;2kE^UOb5gl6pUcuwy2$ZNC*Cbno7Xu%3Y)%NJCOvp3Muku^MeR$BM9T{4&(#}sbg z{u?v=Sn-Ifk3CDce~nhlKmJa*8&1nxFGZ($)hgnDeFF5OVCda`E+$ts@jl}=>5qVc zgI!CcuP!`}0Pmns$6@EA3p_Yj1+LT~mV4w0MSpLy@%FxlkfFB=Lw~}={89;(A9XwI zBw7Ph#&UqcC8X0j=s51AQ=5_mI~PJF&YngMd3MTngjXJ8#>B_CyTbypIZPg+IGnQQ z9`%^kmNPhbdJbU#0oN++6~Iy7^>RP25Z8;2GJj9+ReH)$* z7Z{<(2|80|RMh%1NILBG(yapIaw3mI&nU4_hqXjNzFa!6*y(On%r9lN4o7s*!uR*D zYDs+l6l<}lrRG4%A0H;EIh^9r^A=GOIyE2CB^u`@7|KPkN{vVDSh7yh(#?6>$BKpvGi7R2W`c*== z47Ay$K97;bYXBODQaJFv0GuXa`lWaVXBTZfBE}CFg)qNtJ7;s>{%MPPRK7DdC>J9Q z|1Rceyz8R|x1{rmGs(ac5gNtmiau}Ku^8>@y?^_StOZkUv``+;=}yJdEiuNf8XfY# z-7fUwPa1@Qy2v*ZOUtgo(OVhphRe+>=714V_OBu58QJzXa1RP#46pRsB&;uc3H!!# z9N%}pqW5*6!l=P|A{R;S(MhRY zZ7%^l8AXn`?lr!a_~xr)J9Rv)DBdd~m3WtLLENaz(6Y2>Vf69(LXT+SEoyC+y3Y z14eXm<)Mh~W}xfjyBB|cinL|p`RASW?US^$^{&7T=4kat6ndB8{xyN-p|YWQe@&}? zz9XD`y87M>qix*in;SaN_7(zJoJ%oKd^ZK^cQ7S9N>Qy%v%>${xQwOtR*XgS7ZmO_ zaC=#G?-PH<8|NNTXpVTXrM{Pd&ktwx`{UF}@yZ#vc)O!{a-$p+u4YZP`b=vVRD34+ zt-|%2NZn7##SN>!pq=L%YgXUXuxNQw(Bq-piyULr^1R>rzV*L>O>|Q##md7Dh?&Dx z@Jlm!2Q~TEv1%KJazDO1ZmyAE`)vZf%H#PXsY?a9wpjRL|1-Cka99eq9E~4 z(kk1$AtWE_pn1dntzNy3d+C<2k43*y*6~3TNaYeFmJF}5SaevwL8QaX4e}uofz14} zz5304?VW_an)UGoO8WMT$Bo%bXTf`CLd!2;es}eiu05sAX7}L+kfk-? zd~@&r045@Nl`89-wkGQuETx2@BX4x@JD#2&V||=gawl@OfqIEZ6=(!#Jf>36x_Imy zT-qUk=iH`o&~B;0(P&F#F^jjS{w0*H5iKkvv|3dC>L^00t-y74^Wog@$0p7I`gjNq z#DEW{XL?7zL#?EBC6w^-zRK$v*}41W5**4q3vBChi>f_S71!VnH{k=Yt~OhGt_B=l zW8;%OXm@@a`n}co@v-}F$MQUFcL+xZV<-e3sYWSB1_+KM$Hl8_jAOI0_IiQax8()_ zcYvYHAIAh?Vd6GE$sUk&m_xnsmD|0JTGQNuJH17fP7hLP0Eo(y8<>C!9>D}8@fJz+ zS&IxD0z)AAvib}bSM;S<)ID1*n&)4LiYS);XA2*~pmxUR2RuNaj4J+U-TTOlIzJcl z*_|?zKbx^@-u(L6bwW?d=8boWJ7jOb{r`V6fBRp{1U@MxVXs3_N6m|-D`&^tx!e~r z?z^u^^H6;lBT9m>O3N^HCiDBr+J1X|0IV)7mnX-Q1|hp6ARs7wbd{b~^JE=7gz>e3 zFZIvQGv}hAsMvr}c>fOG03M}$5d8Wtyf;$m#0EP&eM2B7CUzVE;&LPMzI~0v>M(@4 zbB<+(8iEYmAU$V`ki!+uBImjz=5Fq;PiR%sTgIA%B&fqw5yySwn?KKw)%9+uIz{?JYip0NYSZMsoPx4!d% zx7R+K1(Dx?Nn4(>EKf(DR!%@9`C0MMZ&w3ty-i+7yYBBvS-y#B6t+sXGie{E1-XNM ztK3tsH-=JVcF6R&CJhvI#l(IVM4|2$t2|n8EQ=~Hr!Sn?TLt`I{ebD(2su!xee-m= z3Xn`H-FD^mcXe6L^h}wRz1IajA6J)wgTFSC+`E78Fyww42=G{M#28$m<@*68P&7b( zQ=BgaDgks%$*kU!380tdh$5&rT#F(5EcNioOjYn_jqF7=w(Si_)X^A zL%qTr*@*tU0W??j2~Gr__#E=RjLW>p6q`OKD|+oz06OSjmkD$PF@E&jejD343ATy@ zL@oqVbK4Db2dN1uSkn$bE00h_y<@&?C@q-Y=`<-cX3WBSkQqzYXY$%N9=Kwl0cW!_ zZNBK4N_Z*pv{j%2pkorg`-f{drr*E(c-iT#t<}j%Bh)I*NCF(5!8BsV@ueoifRNi{ z%TDKmC8p4qFrL5A4axR>e8)dLFCsO=t{ey1BU)NR-H%RE=5%_S)2Amg)>6h5R=IO>oXW z6bG{Q%cTzx;>k!JoSy=u4y$>+2Me2!pgHAo z42gtX8e!3UO)DOOM>1GU<22t-GJ`2IX_PA<+g#Ce@uR)`$y%`#20k8=siB|cY4F@{HU>E_tO&<- z5+64}**YL=*yr}4RgCyreezHt^1 z66i9iM0^eV+x;o4@!s&T0<-UW(nXvUyk%@AGlS>abVy>_JoE=JN4~k;N&z}${fYVq z@VtDKFCi9|3b!!+X>zX2bTsMK)Mqs5{5FBL&?Etngc5?zCf(!gc^c-#KJ8 zP=Tv5jCm0_{#|vI%k9eJ-7tSO6x}q9(W<%k?9^V2Fu)`+hCa&srh}e%;RDe>2k$pP zT6>oO2QGTy48L)f2E4Pi&EHI*LqsY=puQkz=&(l{vf8D0Wz>Ho<|7u4iE~+#Tle=m-J^^OoFEqM&qgR<=^}4d*pq7 z53jAhWT<&3(xF1c66Ue!O#w(jK~?W24qA6=y20?v7w;Au7*@SJRbN(k-IbQhV5yu) z^JY}Yn44|XQ)6@4oK{Se$kG^)^*;jVhhQbLC5m_CBV_WcDCxa z!uC4!E0Th?*{>78OKR-$R^A^%&Tn(s%?E+EYV9Jkx zRbGvXkA0C;<^yZX28DehVjd**wyiN-QFNprgVvFT05Yt=pz2ecV$wOVZUN?X5n8b;9`@<%94 z0PRutp4pwd%pI=o*^+*gK~jz~O0b!tCtl46A}2!?zC=|?GYQo6#fg9Fy;N>qZ}R{N z;Jq9l!JY{q1OA1RAAq&~DCfYRXkz;x4>7&x%o9ic!xmx1G9_vG0avqgnySKo7-JtA zHw5H@H;7Jd62e&!*wXjmzpgqyz}K~SFwX+JuyoDxq4|bz^;CZJhKx01JcS_<;APf6ogBo#`Zjq1`2y8K7RiEnSYL+ zna39eUqi?p0`q_<#OlQ+D+d%F{pZ4+#=O9^*I?UjA3GOPlaT+Px2yzMyr_*?m;4d( zA^sI%YugQ9G1Et6|*h}J@VgnT4qhN z6JJ~hvjMbu^Y&0>j1+FcqVaneT1{Ga^TZv&I~LSeJ@i73h1p->Oh9=UHU~&o*#M0Q}sLFl}`=No=HDCKhuW*f@(YN%{&D+3h z*lqa1!uikD2YK_gx<4co4YQQNT~8u@wPZvaw+z7y!7717WT^X-AvOX;_X$`C2Av4| z(>Qm!+y5(#mEr8uqFh#++POQafg1c?AbL8`;-`bFgbKjxz%kkI&R7B>Bv|DGs4zYsBpWWe5$ix9)gL<`m@c>TpU7{d1**Ssrzo{uYOO2jo%x>rQ4hHBjMX);fjDN)92nx0p}|>Y>QU! zE|cswx}f2M6Yh`~isfl}9Da{Nljr}h6-*SrdE((X#>p)?9`Fby%^%3z1nuq$8kFJE zuKT*gBHqWYog!iq71Z6ZdMmyiV``Jnl;iR(#Leq8Yy&F*J9)53QYLSuQ$si9e)GTQ zFHZzDZS;)U*u#|ItfVE5hws!_syH3oo}m8W4G^z;D5PKqk%t0Fysqx zQxVn9QnEX){?0=fl1`_4dX*%ET^HGXMawRyalH9REVcYI52jQpSICsibhcoJcBqSt zlBdQ8!P;Q@eK%-ePmg9RCDL35h4Pyw9E^+6ajkT{&HT$N(CyhPg5UZZLL1{?4p ztcE$%h}N$_Ve6gpgo}mzbnnd&Y~R_os|vYWS;Zb( zu2RZn{GYSHTmJ#bpMC3N*V+hS*IJoxI5Qof)c;=~HP=)0OF1G8u*a5btjgHKv7Sgr z8F*Lq3Dr>wi1N=oA+k^=@YGSA1ay3kBeFurPJ{Oys??(pk50&(d2(I=y+UB3L*JTV zqNPZ<9bS*qN9@Gd5PKG)$zO`p)Z~sptwyU4;)n7GKkIuAW5StL0wy<=SFo+}%xaBH zw~F}{qP!SzHUFMCc`J}*NBd=z2riuDw@pE_GDJ^sfy@;CosqoN#ug6`OepvT#)1Nu zeT}bpqiEs_POXpuOLkV`w;H}#aEDmN4HjH6bzwN&FI5|fsMyIVuPA^BKfT+X<0ai5 z?ExusPXk+hovo$W(bcXh0SL;SUd#h$VyqJ-u*ZhdFP|hWGUoixZrULzb4#DdP4f1d zzw;c|w+t|{1`vdy7e5*|uyf!)tRSsL@hy87fH3|`={5D7)*^v{K_ui8vHo5|ocv2l zF7n8iTiAAZkXdZy|2|tnKStt%Py+IQcCW1VKfCv=?eW{+{_fDFK;y4T%-P@kni5J1 zJodecM_K_`gfT_!yy-E36r?;_{{#x=-VqK&sh1F!$d)bQ$Y?1Y1?cYe@>ovCFdlJzZk{@ zK!7)A>@W2`Xd%kyj+1&P1MjQuzbo;&MG|eGyC96C{*JO^8sN%jAZ7LOUpD_!w3-fFczW9GfRn=kJg3^hcR~U zeIcRyE`l;j_0$rsKmXZ|0JqyOZMJTesJnTLrpQ^;CG=Uh?+ zZT(Rh?Ieo^0EGbunkN-iIKhfAGP>n}g+AUX^StQHPXJ2(lPkQ~YydI=aF&y+>yY*@ zhmjhJS=W#HlphK!Zi~+aN zXt8*4fyfkS5A7payy-15L*SK6yLezm{Pe4cM#2^IeyWJp3Z+TrMa7FpUHapH_75osASAxD`sv5&W-c2$*%(dT{&^1xuEe`uP% z{E<3<6i*fbB-O#sb6da#^dHg?fY;YsQd<8UC%YRu8dGOKm!uYSD4m?^^Kbw2`P=OH z_oA%+jR&h?X^TuyEAOxGhVn?ho!tlz9*9)9P+#2X?4h<9ZuC#5@)j@}#zd~#>C^pJ zW-t_-N<{BWJ_YnpfO1QE_gnX2Fr`0e6d2x|RKgoI(-xN%MXa5?{BPD+;05I^&giE_ z5)-py2VDPmghD4A!KSi!)4k2D<9lf}f4&(2{nh&n2f+;e22LU6P$P|;vi(P%jI-a6 zSU*)?McKU-d5KfDVNzci3tr~yUoH@_TtM={G3o)*ur?Xw&UeA1bHD-GXCGj=Q2gxd zFZ6Fc(7y_tO=`*^G+Gz$J z{+%sTBa_oZ;ttw$`KRDA721a`kNd{U;K za9@f_RMqz~5a3E{d>Yx(B&#J*!JU;kI%VSH5}m5^2`|!j=C24E~w1 z`~4g3iu+3M$1)7Vp;75*56)OJ`c4IWp7MLN>)2Lv7b-mi1OB$FT>0?K++59MuHYm7 z=lOixcEa&0h?ENc4uudCWNAP7z2ZRP-Y16g*3%-Srw(CVH>Ye+vE#%M@z zI}|ZDLimRN95$vzDnz*tx6<5g_^qv>kq9KEvmc$(fot1Lor=-w#y6C21Rh7ySPo-C z-DKpE{K4k_Zxfn6*x6NvN>&3sA@8=ood`+6u{8H#4JV4y;9#ddR6-u@@??%MV)IVQ z#AHew+F9n$<;Xe6M1#BW9l%mZ{C5pe#fgIHG~f}^RH=dGr#Vj@ELJ^K6t@#Tp7ZlHRK;r+eZ}yOB*dLodjLpRxE*4ylTU z*y>OGZ-x#A>RU^|O54oJTf+ZTA8g|C^EO65it-1S9GdbQdY&ECs7!o{SM>s$6>XBoWaD5tVtj+uazrT>KsIZyr78xvyu%mR)`Nf4%`#GNbP)EBtU zNTY>)opUaomK;o@t_fP1r<^$YwuZ$_+I(k6k_{E|d%yied^{96=@_`&{Rr1c8<-^d zo3uNB`$)x>1p|&C&>RiAx;+(P7ID_7vz#ByGP*dkms4}My}(PZL@N@H6xVdU?~o^{Pr@~Ll-B6z*MjLyBp}+ zuOCsC#D_}AX~IGVceBC%B)c*(oEV#Dv{iG1Yx7j8VtlAG{UV96vI~0Yy-azhh;hy1 zx-bwRmACPp;D-8ikw{}1B7rw@KNv+HTLw6uJkP;AXXG`cPn>#4C30|%;5wS7rAz7G zY!hjE;5`zj_y(``%n4Bl`5hHWNplokvUUmDQfrILeKv6aibBsTr(si9MyhFr8+Cr8 zX1qV7Iw@+y1bag`6^Q%*Mh+UsAQ9D8++9SJJX0BNw020HL0bw_*Rf6l*1RN^#F$6N zWE^!;okQege%Gw}fxTPOfZ5J%OoiydsK>nfuwe7qmw#lFb#?e!*@=8FRNG41MwMoa zev~K8NluI!Wt*-%5|O{x@SWAh$k^k^iDGg+TvEBN9apzP%rN{IXE<@r&y7DjNp;f4 z_ezt=*2i>FeNW%+PeA6SVo({U?*Se-gzlFCH_jbE!FUvXhG6yhKI0a!S|$R19y0m% zi_c*`ujX?rZB{VFqhv++pZ>yt`~L9hgB4&%9qZ!dRFf?*Kt`mGUC*d(*Iu~WIS|>n zNqHG$!~YtTw}1CZ`vbn#zjQfoyf~?h!_st~<@7MWdcTVwo3H)+>y9j2 z?(v`~UiS*3TDb=bm!#s8>V5)3zJF`Nsv005Om6y~DT=TU|);bRHdIFWrW(cdTqG)u=hxtVC+U1)XpJ>gd2|+(W$22$%z@Y!umL*<%!L!`^ z`ceNKYw^jPXU9|eTpQzo#IFS5jK!6|0l_YweY}mx*xn?x|NYCklXeft7IZw@D?5s% zeE6%)SN43myi=7|GeRHF{H$$^jZtdQKZ(=+B^y}(SiXaR)UD!y9qX?m(a~w+gvdMo z^Uq$pmR~*6Zt}9R1c@pO`&dXR;@l;JD zXqwz=wlU}UtSpxI1MNKF`fFWzwUFqcE59zyZKoFwU4$>|j=>mL1?iKqr?W*EkU4t zSOHXkUmORdMWH4qgn<`JQiM#wbHOL8=j-Lyge>QVuRyEOcg9`IGuYiEo1JK%KX6r zYbwfeP5UjTZZt)i%gYzEd1z-cy5OnQRfl&~;z19O2-T`mmORJ-Wnmq{&+TTwyj}tH zq5z3)odQVfWtDhp7i9W(8@^dSvS4%qy-N->Ppd@-){|5(FLoG}Rq0n(2mrq~b{V9X~n1niJN+*%=-;!p>u z=D|qk5sdaUUSddDYX+R^%NhFTH5s4BjdEn=3f9@pB`^gWcVYU>=JK%V=Im1dmo{#; ziGZ*$=df50?LQs3P>9# zkbVBNep*o@m^(=xlR4ivu!a+96X00MpMs+tFEViHgYd`=rPY_l0gzM?*>0a(3%y z0spc4h>NQXIJagU^5O*eae+6<9`v5Ke-z$tUegB(c~9A1i;!e=w(@#Onj4L1$2Wt; zz@y5x5%O@oXU)n%v&0hkcvHEhM_@>MNBN?O`uHcBaoy95D0jTzv<(tfTjSP>#?AW^ z)+P$i>{83F^feyH(UvjMZ<(}_zB%!-+6CA=J1I9kt_{Xlb0c4G^!CH4wUL%1lee-62)HeeV!$1Mb_9B%v|HNZ^HUyhW_FAAGlv3G*Ot~C4L&)Y9#awMzSWRb zN_$9qcw=Jt53bz(R|#HBDE%T~BWFhz?jYGql*v{7(#4Iz8_!e4)X(9ut> zL735+;MIySz;`D9CtCyvoVAk)gGi5>`H}k7+iz@}>!(1?*?8}Nq-U1rvL{5Lk1zYx zY?0WfVsk<~*=62}hEFm@Kg+y>p(AmgW>g;aye;CgfvADr9mSDQSMnwp_lLg{Nwf_K zU0WF%U9W=6C)J>@;$%R=GN%vKz?d{{XTd09VZYy>kN&7pbXq6!nuwwjRC3M9^SrBSb2W$4|ZehNjm96xwJ*1*OwST z)%JV4esw+zjat2m#RULcxzmq%L1Yf*JOcq3n&AD5HK-K{^DfAMyEkO=FwH8@QlBv4 zPvp1qbaegEdgh()>eXTKS9;gsnTk%a5K4AKl@+6y6n1Be-gqSjnZWDf2%TV?ryPUI zw1p2P?op-$Jf#4K1EQN91g0^ezP7q7pXj|I9q+S7%Fky8mI$lw(w(>YJar0T=YenHly>n`wa!9LnQL6DW57BQo{NSx%e-}8M zaxPs8dE%##Kd+san@jlrRCN|^O@@ElAKeXtbO{nl3lk|tB?XiQ86naQ62eF+X(U9t zkuCv2QW^&;C0(O?B8&}qE`CoO@B0_*xOZ*$^^NoVoH0txI73JExgo}8?6$mwx=j`K zpVEB0~tL3dAW@UF+U9JXoB@JhIt4N?`%ANPW`S4 zVh~clJpFwF#UP6?xQz97QK0E!1`@>h5)RO|`wt1EXMOAf|Ac_+#WddSkVodcGuzB- zq%ps#$y;}v>r``|O!f(^m)p*PYEF4W*E zv88Zq!FhvkyG`E{M>%?_TXD_~5%Ru(Qb!FQT!tcO$8>XM(`C&|H%mrS>L zi2B_!$EnbNFUn2nEBE4?7HyY?pUHTN~gqU90@DRk^TB(6`cxf9J9@t91vETB*|Wu#j_`lf9eQ~QuR)!a@@Dee15)% z#S|449UJ)a0ILGA4QVDk;9*cUzg^{Ja>$G_p`=}8+f^#CUrxS5VLHB-Gu-szfY>w( zc8m6M3{0Vc++_X7r=toRIWpxiNzHQp<4EFu)_{f?JZ;$~=0edYuQPecrrup)6zN$f z5%gl4gD*2n#Xcl6G?7%5r{fr~39vX!&)Zy(vXqtUWs$JtG3@>WB|{SokAu0>vxQkJ z=AL^KN8<4SL+*3J;U4u$ndiPRc3EJCs#D;&)fcIezUy^qsSup-fogtp*6qUO$jItZ zxkG|b0`%M@U?<%&nAZPIVel5zkkR$h;cb>eID19jwh0;-&sNXU*qgsnDc+8zFP(`X z7{}YcuYg(j5N-Pmmqmomo(4nCDmaz*!A|b^iMm#8if*LhNE9E%&}i_NsK^3c4qj&U z4Hr^EL6O~v?=o|I`VGehXFVyf^&-syif5mliPdb@DwPUe%>6 z4PW~rLb#Zdso=LS@#J$%BTkPi0=A*~odYVPoiz0X53fTELRx2KMJF@h9aMqROwhNhmTqEGoQ+af5@ulgBKZ<>~8F zMM2Fsoh$Z5`@tmqtWF%kk(Y~4-};i*Kxe%NcN?c4{b#G1lB*|4-%)BeJ+lKyMaeV+ z+@o;)wSB`4T#>4)mUud)8^D*EfRdgzKWl|(*y3D7b))+wJp-e4S$If-y`;^aYW7qa zaG%_9&0m_d4MRxcX#b*k_`(sY@JK=oap00twPQRVtnHZMA}Yize)ePun?lBT+WqM{ zQNeT-4knn=B4$L!S9Gb5mW1+zSL?nYwdD=QC2MQFjKcuPFG5SgigGFZ640g(^{--0 z-4^023QX8PLxyPcb=(P#|ds!mk2> zBD?56fASZ=5jsD2;n=Gf61->2;O zdz;XTDv(|k8FluXwn8GbsOZ*%EA(i;I_&&8tJ`-Ppmy^387ce*l4B6@ zUnawW7^PYO<-}Q^bbIhlyC)laz^)EZ%EY@6+dNe6>ntxk(&CL$G+LiXwx1cq9;x!n z?W|T~8}}yiRrt+A6?G^3Q#{mMCIcQn7*>ueS6g+1qyO${BdSL$(DTVOV!Qw-;E8N| zGOa8~^!F>7mi=0KVwXV=+TiHH)xhGm1mO)um$Ck8AlJE;a?~V!;EnQe+W_wlx4*#4 zKp^6SbNA~e_XDsd1Ohlxb{VXZ^Q9yY-)JKb>4}G+w$7euvKBq2RJ{9-l~4fYL5Cp! z7u#d^q`e8AzITgnKixJqCf<{nczVS$yWh0r5UP|GCFVc`t zZakrmjm6*g)lAM5dU(p84Su#Pvl7Yk+556mkDJ?Z{wsrO5^&7;r9`rPXXdAop>gAm zWK8+&U8*4&r9Hp7D{k00g+>!S?oAjw@q*KOAhZn@oivX83;V85!{{x$>9+j8i*FYQ zDC^%3B^70>cqc|(AmkAAoJ*!=R?i>yJ;O+iW-4=2@_jun$fis3Gfl%lzBe)3JYW(f z`sEa4oU;(F@`c0x5pUKKiFa0qb04lVS~cIOmMC|HGOhlyP6--VL1r~MiS|vRwDYW>23YTBDFK`>OZUTD(KZ5 zUj1PYx)+HTgnIvG_w2suJa-7G_K+y9;m-2wArfMwU~W%&-AAt=zK7mGBGt+T-l_HO zh{epbw-Cu!hZIBTvir=5o)6288alYBe9%)pzsJ9e&X!K-GL!o5X)-bD6-*k18$=*P zO?}-;zi=h(Ma)nu4V)FOV#(FzHXhSb;YBHd{e?&fAO0@KMeKx=Q8YKdurnMPK zp_YV-!tdDT7A;+qgA>GEd}=kO>>*ASNp`#lx9%*phx}F@*wExW*OqG19o&zfJjG!R z%7ih7hszI2B9zMmQoP(H%fgqx8pSW&)L>v~&{wy3nP(^UhY>Sg4EEdi8D9{vRJT)c ze*MT0GOLoQ@Vb7dF=J3m>Pz<&{VHEX#bCnls(;+ON6)DBz8e*yrhH5gFuZckJum}y ztOi@3CuyAbBsbzMmV#fot1^!!M7@mn(WNMQu;-sOEKF{MSvlgeKOP%Tx z3WFo_NfXGMchb&Cbqoz`jWz%E$~Tq)JOzT_GiS=i*?0g%%$4OMYG-l#{Zxi>^i8AY z<8H?>yvUxsE(T6UgsWkY7BWAeu z&aKiVfBKY=-GpV~zWGG>Org-8-Y;V28RcDIu8s^?MW06~SzZoeCe+N4jX^sjXsJFg zwLDa*KmM4X4AY>(s^-G|cZlYnF9^UIZYZkUGAZZzSf}ihO02O|Dj9!Baa?<_ZmJ4vVLt=iiWA&@Wyw%-L*{GET%7F(m9)%<0+MK!ub-A zr(iqVqR3EqEaopoYx4Lu&UWV#)>ujGR)tseebL_^E7Xta8swYi4D4eF1e{;jn#)4X zkMBd8Zh|HBSK7hRyjnYK3QSqVQW`f3G2TTnjE>p}rQ}cd48q6vxs+Oy-U+H=H(+Ls zkbN*+CB^OZTj!;~#`qJF+5dTXheCc%Ln7LPW=bAb41HIr;@3c^g2&~_;ai2z&(&<- zbEThkx9pl*5^$1g~kefrf5;AKx`$hz|@%5=~o6sZ%1f4r8k zkI5~&tX~R4i&jpcYJn!j4|W_rf1dQg%V7~^f=>Lm=tclU?l-!aA$ zX0{qKU+wbPY*dn3AMV)sfsVR53aC)0E)|R9sZB}I^gM!gX#%wO3YGl^RR}#7A7Uny zE)zU;RBOxY22O$Pz+*mL9|si=ulkM}cD-nWG6Pa>j^o3yxdAt#1QM2M5 zmyB556SI@%U>SwMf1q(uJv!`pdpLgpXY6BI^Nnj%>tnhWuXigJWahl@)|c2|-EUis zlk%#2FbbS?FI&B>Kq;m2OLxg$ob_tUG_K5a5*b%* zWp7W)i@@bfVNf28WNXaisC5C>8yZ&#Zl)OFs}b)z(9$?5Q{M%$am51wWePq)?tIlM6=v!eJ6p(svM(-X8!;{f~C+J26Hq=6|8 zQ>Sq&x2aebgNMc87MtwRH_ZMcz#S@>VFq(hrt+^Z^%@W!ze9(+`cBZ z*XFq1Mw?PpOWpCXuvuq}&CiZ2h234nVepvnWii@2xbma3pde+O^m7bxc=d;N{KTxmr4~$wh8+)DnPApYL65f->xF|2EUO z6)Ki=fGVhST@<@IISsrj#Bu#p`=$?S(D~O~2y)p=!8($l^4P1~m=L#iqHMoM@pdE$ zTgBfeR;5R(0&&u zDrg0c#vUp3?zeic{tLXT@AQdxqRi2v^%pC}r!&JADMF*vE@;GyXL1DmF7wgXR-UYe zv)<)`xcj8wH|+YZpMQh3{V3LjbM(FD0MOLapDw%=sp?oJ-2GEeR4-9K@RG9Vp@M9l z8AVt-X$|4~_hd5r)2oNTe@K6AM65*%d|EzcHTmM$1$-%F*$?`F_a2S~{~@Ir)!K&U zFd}vzi1dOFT|2y=4Xk+o)k}m2?<}ot+~~rd|LaqJhWVI9@3q~&V=4c%JC?^|ATx@y zqPfog^=h98WCW$G{i{}GiYVANvRc=D+x+|5q?O*8B4M9Q{w*1g=#M!$i*0QUf1Mom zmW{HL#rjk_)zC#xdhJA{i%ApWp82^y=Gs=*vBJmWv?s3%3~3|`RRV`-4de$vXei9G zl<+7!`s#A=3Nr89ByPFETG2S&=)eddDoHDn3Zp-FPR(O`K}&@#HoB8|nD6>Lzr>-} z2jASzjRpZGbH(PBUB}1b3s;wc@dj-x3=Hh?E_S{*uP_*ep#D>NGlCMw1dG?N3GFh} zHa0$23hQr2(TnCZP3BLT^c}lXy_mmyf1dKjjT=Y5KyXPQ#^vhqz^a&;&(GfJ78LXK zlmr-Rfx_SOzCiJCN{*$6@(^Fc4}xbjpHS&=BVVtvh}_(Kay4c5#Gh|U*``hfMeVsX zzqjad{OsiS(@7_&8AIdA>fVVJL$q*cdMDF8hrEy5%$8K8e472Xv7Ydlf{Rvz_p^se zckPaQ4^QhDjH!0pT}t4gMgHl~W)@GOT}a6Tq`+b8*{U|gO4Dm*cFU8rfAo(REjQD? z?x9VslvzPc%n&@I~yC-!)_T}bHH zdFK|prxV$VwH;#>^}GVEUiY&?qN()|9807jzMGIIvuru5iT66OX7&#eH$#^V+^fVd zZQJ4t{OOO>jX9Zqy)h#qhOy(DaYew;MRz+LL+B6FP3Ou&p!_mcnwCKa`!kIWUCtn| z@1~Wr+HZVLcZ<;Q?0du;E-}T(5*|V6hDZ+f?9X?JTNd#{yC2uJuVeE}&p%YnjSqX2 z&K!NOqzmGSm_z0s8&&CK=16k7nQl)(A7;zSxUX)NZ`UR8dbf;!yjETrIoq1E5^;#6 z6(n?P-m-TPCO%_^)Ikz>I^0AD6n8heqwq?PHGFW!WcfJ6BzFQj5Thuu4GwYk2$o(0aV{-w!VlF>t%I{Nn-YH)cjy#{SH+o?oKStz z*uSAN92f_d?#=zwxX9;v(Q z0-BrKm7>I^LNC!pD0Ru$jtS}Pq3<%-M}PJ3C_Xhzp=mJp+>ui#dL|30yErv1!>I}U z(zw=;vmS->0t}A7oF*-`&SBkrtY;SN%?3j*pG^8;ijgZA9FT_Nn31ThxA;F`+ERUZ zyW~5)KJkU#YTVyEqI^+LT8w=5)y@wc{5U}bKetdvAH!WHinn~67g0cWgYRE4*;6zz3W&xVd zTS^ES85wN*6hpk*us3~8%O2%GoFS!}? zYQL`J81l}>)7{w&H~3a4!r0+u_Eodh)&Y+BRMpEC0!4s}QIY>w8-GFGhqW&G%|(qQ zKL?@^)wS(kiT{M9n3nX!qaUQj6BRs(aOf^eCh@EXs>k~ZiOur+TBuN0y+L*BJE2U9 zfujUvU%=!uCvP`T(GuH5iL@363*QFnO&1b)TnpSujoLx^$`mEwLStrX8U{C=hDN;W zC3t0|4_#4%c8sNVcJb(+nFNHbJjv~6e_LS+DS8qsHjOzmGqh^k0L|q8R=&f?+XY}s zhO3&r;VL>Mp3tio1YmnmNQ2F2_DkRF#pJ>=t`Hu9YUU%z64vr8zk^rx@XRWH6*zM5 zIyc_I98uNGfjC)}-}GSBRf!jNzib<2UYMmRnOJ9H)wyNl_Cx$8R~6NhUXnAetf*n>HE+VtCE6hqXRPG{$$<5Tpt;Cc-X>z^=5mh!g@%wga;_%$Px8hxi17>64^6RzXl1z>|QX_ze z0;~hNdZ@0*H?mH-GF`h#rt7T9_P-s-W0x?C{UH64wQ_0U^0VoR*h5Wn*lxH-wSi!^ zZrgf>gBytUTAto`K=hU!&g2b52H$fRG zsdud%M-j!`Ut|;T zARVRT_pmfp!bDO?x>#^9zS)5AlKXov$P~I>T5>+#qv&s*l%mU)UA=P{CEb@lbzmV1 zD&Y59Wp?4Antw&V*~y(9`G}T2hK%ClG>jNqB_N@xX=ymzo+ZU&sxOwYKkIo3cpIXY zzuH&zU|vmp9P2l;axA=jKnu|BL|Sq>Gya{f&i`h=$q8!tkY znFCeIRm>`3sK#2neGy0`Dkt~y!NM+UW`Wd8^tZlkzVldOX78gPiI19I$R|EUhI3Bs z$Yd(W(3QSh3h&{4@vmazQ$iYs=99D&Zl1rb?e`%O#EqNbLp3MGt`mibDKb9UE7q3d zVm@Rq){dAF5U@*WaWCrA^ktyuBjAXXp|J_pmmrFUx=k9+1Z{T1q z2A;|vPdpgC`ZBx6%ssTz-hi6ql;++rVAjEVVfP(L=erh4?;-(3h%BLw?Yl|tdb_sx z$1i*aTKf{DJ>-r;S!YTsE~Cycy8H+i+F(r_#eK#EXS2oS8E@9>(32WU=9NPHT%3Oc z!Uc9FIJ5zt8YFc%K{|~wdB^k4;SI!vL`ffwFU3b0Xvrvz6E@YlBXkiWT@)mIpF5W5 zvsYabJ`VSX>TK%d@susmQ&E0~Wly;iTnz4Df12~gl&7Z2=6D(uo56`9Qs?#O(Jxo^(vl^r^phwxfs!7&=yqXr=dmI4qCD!aBc;F^PTRD1fwn;WQ{VLrC-FXVcr@nj9ud`WiZ(9tg38{AGZ-o#O1ITh_?glX!dQhBzb;#Hl%m&C zDpt4EWdAB5JN;^W_-=|4kq?g-Z-2~Qd?}P{-JiUK$vyRZ?j+OrbF}i?2#!&QA7{hmCqppL z)d8ek24AS~RZi2q{{=?dbnyM9;*-_kqid9z@+-g4g@4F}V?5O)LxZ+8&71dfK8TOn z2;3v#p?D;u3+=F7aKChe2I{fPe93(A+{!>G5IBqjCx!=>s5v7C7(C#&(*C8Sv*J@{ z)=$m|4|8ntHL$sVB!6xNnFenaz_9srQLlihCmL))OKJ`q3N?NSJlH$^K}`GDhj+-z zh<_&M6uAI56OtTD@ABxeb0v=6;-a<9N6`$UR@L6B8SH(#5dPmO$K9t~?@VSrsqr6p z!asgc>@&2oxZI(To;zFuOzC%l{ZDzNo1*>XZ0k*{$lfUiI#$Cqpw+MJ z``Zg%v;@TA-D`1`*df&@h*emK!TG`^x69|Ff`b^FJnenCvK_3Fww13~1TWZoe+GexsD3jrz?M*ojVS|-`i}?J{qaQWswD8V{oPbF2 zi+8xLdckjmrn+ykGHh>_M2$5&V=?~6`2whfo+ux%lGi=0Yz$ZV6w+Uv)p6HJUUTXh zEuHurew0rlv*C%!>w809m*+LzEFSPg*p?SO+#wPrWMM@??+Oal(DR-{F|6aRt0G^7 zd-UP1NduQv#bDOk@eHhYjfc%$X6Zs590rk(Hl7(v(Pq?+9)YVtH%?8FmBTE z5J2JJwh@-uywo2=BWt$l>yX%$7o?vZ9eCW~f)z+utubF5*(tcpY|Yj_)0q$=(#1Oh=LZYbJ$A;2Z;$9j=Q==2gw)F_^RHb7;y8 zwDP#5HYijw1pLVF?R)$PDqQHN>F>yWi?#j51(3O-PQfizT#E`O=54jMaTdhjmf77^G%1CY zz2|P1u1K(TMVaQ3K1b`E`LwWFJIMrEx8nzir+wQ40n}KG1VV;q-sk`upQX5Rq?$4=CR-B_q++|2bwlk5i*MsRT#K3jGWfszS$Zu+skjB9 zrmsRmb4#}3#Wg4sSymFvi&!QJ1u)JBdp0uvQ``S;`IS=KoOg$=+6*~dfM9a)Nc)EQ zXX5hp-*pS&4Is!C40gMkorcGF9RS3H(fa*+{;FhZN0!?rruK=mXXEL={!wyEtBT77 zc$qwN_LO|F(FDsiC&iXMc*iLyu zNG{xVGXO;R1!^Syy&6Wv9M2^-_UV@#%m_4~@a#j#fl}@80A>{}u9i4=Q`E63CwIMM zmm_jvurw=e;ctiwYg{N&hj9&kP8PkOwGAK>a2Nlwtb2ND!37TU+H{`>pPMGpb&B zTP8;l&P)E+-ZF1EXCyPHiQ9}Chq56v@YeM~zoU0{`rYWHV%_%!6DxKjY|eT=%K?e) zWX6Z&65}GP$zFo%t(qnDn_Y%6cbcl;DzBBueo4RT8_i$+76jOA38eV-Vk*k!8Ht}u-&M3s7gh(9#eMAA*r-eN9W(n zYQp9X5Y@jkGI7ot9Hy#vuYV#6pk3SBK1m%NAiSv7(9*gUG^n(O+rQEkRAe5jTT=f0 zO53rUv%zeln$m8V`-o-@Z*GQ~e!r7i*9>}P4BOzRfZ^HME^cDQo;r%U^F@`)JU7Vq zA0Jw*DEI5Bz|tQDe{j;YM@}^ZD|JQcpw8@Po=&g(c1f+fLIX$Jsxk^SeK?TYA)TO` za|dv|K%r686nNdB0Cu=SQ<%ou?U6n3CPFO`9AUWE^mW?nnP=UN%p6whK0}AfS~Mqy zXXw1TT!l4h;cjGl@? zNqk%p=b?pgpCgfKT*d~D>DxZQsR2={I@@c<2f%Wot0m!u01S9Z_GEAWwl}Jm+=4)I z+YKO)1z>san84Y1^Bdvu_JV!sHV-FqDrK;sUP ziVPn|>zn=mGzPfQ?cF>rlga3B7s{MA=Cq%92T+cG5-wikFK{dZ{r+3EBIb(2yzGf$ zFEWVy(ZIhd?{7QwR!LXnW8iXO`@M4-BuM>1;b$MW4bzDUIAMgy`3;y+4PXNNRx$M! z=Zph;C03}FU_TLY;4_kou1e`SSJ@hPxxCg6I|SPdcY#1I=R4kx4hQdsDxWnzE3pC% zXyk3YuI_OIL1TmhZ*^yk@ellV`;kbv(a!4tQcbm|0e~R|iHpn(R!!zrO0{_v*(Wm#q!HNo|B^k_0+U`z-Rkg1@N2$yzrjcEQ~GV24DKJYo(IGrT`;Mxir+#YG=g`+rc zR>CD=tKIS}j}knY;@^9GgoH-f3>^mG7JqtMt1L1aLonRf!{3uuVZKt76|;n`AX?sa z=tWNy>6le@R($9`R};^z!4>Ok2P^ci0w=Xg#>01TC|9wMJMuh+b@cPgjc=WJ-^-V} zZ3efA3Dy)Ips5ocCTSiGsv`QhQ}N?!JDkPYXUyBg6nKBpuL5~a*NUWGwHszpn-3+ojRiFwS8}#l5lgyZ$o-N-c*c>=2UW=ShgWd zng1LiDY{li*?_ut^Y%8gANp5+L&5E*cUWVy?%M7Pv5Nd^-+mp5+F__W7UT2qdTo9- zL#$wo9Z|I98;2I$UAB{^&WwtL9-pXAO2^ozBo{Hg)HC~0h=Y~;+Q-xh0SzMJ1jiV6 z^X;nfBY!A!S4|Kn|go~>E#jrH}f zAZ3DxU)5bWQ7(IcO}&rRWq|F`t9y8oWMjg?ucK-PnItH3#WQDy9zCUr%eyhQS!VZv ztX@nxr&fNvFO~QAwKUWTm12 literal 0 HcmV?d00001 diff --git a/assets/img/logos/cinza/svg/icone-cor.svg b/assets/img/logos/cinza/svg/icone-cor.svg new file mode 100644 index 0000000..cf7dabf --- /dev/null +++ b/assets/img/logos/cinza/svg/icone-cor.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/logos/marrom/favicon.ico b/assets/img/logos/marrom/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7c961d56ba9b05b84c8f0fde76a73d7d071af202 GIT binary patch literal 44182 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 + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/logos/verde/favicon.ico b/assets/img/logos/verde/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b2585562fd17a9b7f16e8387cd8b3ba985a0728e GIT binary patch literal 43860 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 RsJM=B%89_u{NGbi{s&Uhb;AGv literal 0 HcmV?d00001 diff --git a/assets/img/logos/verde/svg/icone-cor.svg b/assets/img/logos/verde/svg/icone-cor.svg new file mode 100644 index 0000000..f43305e --- /dev/null +++ b/assets/img/logos/verde/svg/icone-cor.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/configuracoes.php b/configuracoes.php new file mode 100644 index 0000000..117ca4d --- /dev/null +++ b/configuracoes.php @@ -0,0 +1,87 @@ + 'Desenvolvimento', + 'producao' => 'Produção', +]; + +$ao_mensagem = null; + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ambiente'])) { + if (ao_salvar_ambiente($_POST['ambiente'])) { + // Redireciona para evitar reenvio do form ao atualizar a página. + header('Location: configuracoes.php?salvo=1'); + exit; + } else { + $ao_mensagem = ['tipo' => 'erro', 'texto' => 'Ambiente inválido — nada foi alterado.']; + } +} + +if (isset($_GET['salvo'])) { + $ao_mensagem = ['tipo' => 'sucesso', 'texto' => 'Ambiente atualizado com sucesso.']; +} + +require __DIR__ . '/includes/header.php'; +?> + +

Configurações do sistema

+ + +
+ +
+ + +
+
Ambiente
+

+ Define a URL base usada pelo sistema. Em desenvolvimento, use o XAMPP local; + em produção, use o domínio publicado. +

+ +
+ $url): ?> + + + + +
+
+ +
+
Ambiente ativo
+ + + + + + + + + +
Ambiente
URL base
HTTPS obrigatório
Banco de dados (host)
Banco de dados (nome)
Usuário do banco
+

+ A senha do banco não é exibida aqui por segurança. Para alterar usuário/senha de cada + ambiente, edite includes/config.php (bloco AO_BANCOS) diretamente no servidor. +

+
+ + diff --git a/contas.php b/contas.php new file mode 100644 index 0000000..a6145a4 --- /dev/null +++ b/contas.php @@ -0,0 +1,177 @@ +prepare('SELECT COUNT(*) FROM acoes WHERE conta_id = ? AND usuario_id = ?'); + $stmt->execute([$id, $ao_usuario_id]); + if ((int) $stmt->fetchColumn() > 0) { + $erro = 'Não é possível excluir: esta conta já tem ações registradas nela.'; + } else { + $pdo->prepare('DELETE FROM contas WHERE id = ? AND usuario_id = ?')->execute([$id, $ao_usuario_id]); + header('Location: contas.php?excluido=1'); + exit; + } +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'salvar') { + $id = (int) ($_POST['id'] ?? 0); + $corretora_id = (int) ($_POST['corretora_id'] ?? 0); + $nome = trim($_POST['nome'] ?? ''); + + // A corretora é um catálogo global — só precisa existir, não precisa + // pertencer a este usuário. + $stmtCorretora = $pdo->prepare('SELECT id FROM corretoras WHERE id = ?'); + $stmtCorretora->execute([$corretora_id]); + $corretoraValida = (bool) $stmtCorretora->fetch(); + + if ($nome === '' || !$corretoraValida) { + $erro = 'Selecione uma corretora válida e informe o nome da conta.'; + } else { + // O limite de até 3 contas é por usuário dentro de cada corretora — + // não pelo total de contas de todo mundo naquela corretora. + $stmtCount = $pdo->prepare('SELECT COUNT(*) FROM contas WHERE corretora_id = ? AND usuario_id = ? AND id != ?'); + $stmtCount->execute([$corretora_id, $ao_usuario_id, $id ?: 0]); + if ((int) $stmtCount->fetchColumn() >= AO_MAX_CONTAS_POR_CORRETORA) { + $erro = 'Esta corretora já tem o máximo de ' . AO_MAX_CONTAS_POR_CORRETORA . ' contas.'; + } else { + try { + if ($id > 0) { + $stmt = $pdo->prepare('UPDATE contas SET corretora_id = ?, nome = ? WHERE id = ? AND usuario_id = ?'); + $stmt->execute([$corretora_id, $nome, $id, $ao_usuario_id]); + } else { + $stmt = $pdo->prepare('INSERT INTO contas (corretora_id, usuario_id, nome) VALUES (?, ?, ?)'); + $stmt->execute([$corretora_id, $ao_usuario_id, $nome]); + } + header('Location: contas.php?salvo=1'); + exit; + } catch (PDOException $e) { + $erro = ($e->getCode() === '23000') ? 'Essa corretora já tem uma conta com esse nome.' : ('Erro ao salvar: ' . $e->getMessage()); + } + } + } +} + +$editando = null; +if (isset($_GET['editar'])) { + $stmt = $pdo->prepare('SELECT * FROM contas WHERE id = ? AND usuario_id = ?'); + $stmt->execute([(int) $_GET['editar'], $ao_usuario_id]); + $editando = $stmt->fetch() ?: null; +} elseif (isset($_GET['corretora'])) { + // Vindo de "Ver contas" em Corretoras: só pré-seleciona a corretora no formulário. + $editando = ['id' => 0, 'corretora_id' => (int) $_GET['corretora'], 'nome' => '']; +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'salvar' && $erro) { + $editando = ['id' => $id, 'corretora_id' => $corretora_id, 'nome' => $nome]; +} + +if (isset($_GET['salvo'])) $sucesso = 'Conta salva com sucesso.'; +if (isset($_GET['excluido'])) $sucesso = 'Conta excluída.'; + +// Corretora é global: a lista de opções é a mesma para todos os usuários. +$stmtCorretoras = $pdo->query('SELECT id, nome FROM corretoras ORDER BY nome'); +$corretoras = $stmtCorretoras->fetchAll(); + +$stmt = $pdo->prepare( + 'SELECT ct.*, cr.nome AS corretora_nome, (SELECT COUNT(*) FROM acoes a WHERE a.conta_id = ct.id) AS total_acoes + FROM contas ct + INNER JOIN corretoras cr ON cr.id = ct.corretora_id + WHERE ct.usuario_id = ? + ORDER BY cr.nome, ct.nome' +); +$stmt->execute([$ao_usuario_id]); +$contas = $stmt->fetchAll(); + +require __DIR__ . '/includes/header.php'; +?> + +

Contas

+ + +
+ + +
+ + + +
+

Nenhuma corretora cadastrada ainda no sistema. Cadastre uma corretora antes de criar contas.

+
+ +
+
+

Você pode ter até 3 contas suas em cada corretora.

+
+ + +
+ + +
+
+ + +
+ + + Cancelar + +
+
+ + +
+
Contas cadastradas
+ + + + + + + + + + + + + + + + + +
CorretoraContaAções vinculadas
Nenhuma conta cadastrada ainda.
+ Editar +
+ + + +
+
+
+ + diff --git a/corretoras.php b/corretoras.php new file mode 100644 index 0000000..1346eda --- /dev/null +++ b/corretoras.php @@ -0,0 +1,143 @@ +prepare('SELECT COUNT(*) FROM contas WHERE corretora_id = ?'); + $stmt->execute([$id]); + if ((int) $stmt->fetchColumn() > 0) { + $erro = 'Não é possível excluir: esta corretora ainda tem contas cadastradas (suas ou de outro usuário). Exclua as contas primeiro.'; + } else { + $pdo->prepare('DELETE FROM corretoras WHERE id = ?')->execute([$id]); + header('Location: corretoras.php?excluido=1'); + exit; + } +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'salvar') { + $id = (int) ($_POST['id'] ?? 0); + $nome = trim($_POST['nome'] ?? ''); + + if ($nome === '') { + $erro = 'Informe o nome da corretora.'; + } else { + try { + if ($id > 0) { + $stmt = $pdo->prepare('UPDATE corretoras SET nome = ? WHERE id = ?'); + $stmt->execute([$nome, $id]); + } else { + $stmt = $pdo->prepare('INSERT INTO corretoras (nome) VALUES (?)'); + $stmt->execute([$nome]); + } + header('Location: corretoras.php?salvo=1'); + exit; + } catch (PDOException $e) { + $erro = ($e->getCode() === '23000') ? 'Já existe uma corretora com esse nome.' : ('Erro ao salvar: ' . $e->getMessage()); + } + } +} + +$editando = null; +if (isset($_GET['editar'])) { + $stmt = $pdo->prepare('SELECT * FROM corretoras WHERE id = ?'); + $stmt->execute([(int) $_GET['editar']]); + $editando = $stmt->fetch() ?: null; +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'salvar' && $erro) { + $editando = ['id' => $id, 'nome' => $nome]; +} + +if (isset($_GET['salvo'])) $sucesso = 'Corretora salva com sucesso.'; +if (isset($_GET['excluido'])) $sucesso = 'Corretora excluída.'; + +$stmt = $pdo->prepare( + 'SELECT c.*, (SELECT COUNT(*) FROM contas ct WHERE ct.corretora_id = c.id AND ct.usuario_id = ?) AS total_contas + FROM corretoras c ORDER BY c.nome' +); +$stmt->execute([$ao_usuario_id]); +$corretoras = $stmt->fetchAll(); + +require __DIR__ . '/includes/header.php'; +?> + +

Corretoras

+

+ Lista compartilhada por todos os usuários — cadastre aqui as instituições financeiras + (ex: XP Investimentos, Rico, Clear). Cada uma pode ter até 3 contas suas — cadastre as + contas em Contas. +

+ + +
+ + +
+ + +
+
+
+ + +
+ + +
+ + + Cancelar + +
+
+ +
+
Corretoras cadastradas
+ + + + + + + + + + + + + + + + +
NomeMinhas contas
Nenhuma corretora cadastrada ainda.
/ 3 + Ver contas + Editar +
+ + + +
+
+
+ + diff --git a/cotacoes.php b/cotacoes.php new file mode 100644 index 0000000..ca87872 --- /dev/null +++ b/cotacoes.php @@ -0,0 +1,237 @@ +prepare('INSERT IGNORE INTO cotacoes (ativo) VALUES (?)')->execute([$ativo]); + $pdo->prepare('INSERT INTO cotacoes_acompanhamentos (usuario_id, ativo) VALUES (?, ?)') + ->execute([$ao_usuario_id, $ativo]); + header('Location: cotacoes.php?acompanhado=1'); + exit; + } catch (PDOException $e) { + $erro = ($e->getCode() === '23000') ? ('Você já acompanha ' . $ativo . '.') : ('Erro ao salvar: ' . $e->getMessage()); + } + } +} + +// Para de acompanhar (não mexe na cotação compartilhada, só na lista pessoal). +if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'parar') { + $id = (int) ($_POST['id'] ?? 0); + $pdo->prepare('DELETE FROM cotacoes_acompanhamentos WHERE id = ? AND usuario_id = ?')->execute([$id, $ao_usuario_id]); + header('Location: cotacoes.php?parado=1'); + exit; +} + +// Atualiza o preço de um ativo na tabela única/global — vale para todo mundo +// que acompanha esse ativo, não só para quem atualizou. Só deixamos atualizar +// o preço de um ativo que o próprio usuário acompanha (evita alguém ficar +// alterando cotação de ativo que nem apareceu pra ele na tela). +if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'atualizar_preco') { + $ativo = strtoupper(trim($_POST['ativo'] ?? '')); + $preco_bruto = trim($_POST['preco'] ?? ''); + $preco = ao_cot_parse_decimal_br($preco_bruto); + + $stmtAcompanha = $pdo->prepare('SELECT 1 FROM cotacoes_acompanhamentos WHERE usuario_id = ? AND ativo = ?'); + $stmtAcompanha->execute([$ao_usuario_id, $ativo]); + + if (!$stmtAcompanha->fetch()) { + $erro = 'Você só pode atualizar o preço de ativos que você acompanha.'; + } elseif ($preco === null || $preco <= 0) { + $erro = 'Informe um preço válido (maior que zero).'; + } else { + $stmtAtual = $pdo->prepare('SELECT preco_atual FROM cotacoes WHERE ativo = ?'); + $stmtAtual->execute([$ativo]); + $preco_atual_antigo = (float) $stmtAtual->fetchColumn(); + + // Se é a primeira vez que alguém informa um preço para este ativo, não + // dá pra calcular variação a partir de zero — começa "zerada" (0%) em + // vez de mostrar um salto absurdo de +infinito. + $preco_anterior = $preco_atual_antigo > 0 ? $preco_atual_antigo : $preco; + + $stmt = $pdo->prepare('UPDATE cotacoes SET preco_anterior = ?, preco_atual = ?, atualizado_por = ? WHERE ativo = ?'); + $stmt->execute([$preco_anterior, $preco, $ao_usuario_id, $ativo]); + header('Location: cotacoes.php?atualizado=1'); + exit; + } +} + +if (isset($_GET['acompanhado'])) $sucesso = 'Ativo adicionado à sua lista de acompanhamento.'; +if (isset($_GET['parado'])) $sucesso = 'Você parou de acompanhar esse ativo.'; +if (isset($_GET['atualizado'])) $sucesso = 'Cotação atualizada — todo mundo que acompanha esse ativo já vê o novo preço.'; + +// Mantém o que foi digitado no formulário de "acompanhar" se deu erro. +$ativo_digitado = ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'acompanhar') + ? (string) ($_POST['ativo'] ?? '') + : ''; + +// A lista de preços vem sempre da tabela "cotacoes" (única/global) — aqui só +// filtramos para os ativos que ESTE usuário decidiu acompanhar. +$stmt = $pdo->prepare( + 'SELECT ca.id AS acompanhamento_id, c.ativo, c.preco_atual, c.preco_anterior, c.atualizado_em, c.atualizado_por, + u.nome AS atualizado_por_nome + FROM cotacoes_acompanhamentos ca + INNER JOIN cotacoes c ON c.ativo = ca.ativo + LEFT JOIN usuarios u ON u.id = c.atualizado_por + WHERE ca.usuario_id = ? + ORDER BY c.ativo' +); +$stmt->execute([$ao_usuario_id]); +$acompanhados = $stmt->fetchAll(); + +// Calcula a variação percentual de cada um e separa em altas (>= 0%) e +// baixas (< 0%) para as duas grids pedidas. +foreach ($acompanhados as &$a) { + $anterior = (float) $a['preco_anterior']; + $atual = (float) $a['preco_atual']; + $a['tem_cotacao'] = $a['atualizado_por'] !== null; + $a['variacao'] = $anterior > 0 ? (($atual - $anterior) / $anterior) * 100 : 0.0; +} +unset($a); + +$altas = array_values(array_filter($acompanhados, fn($a) => $a['variacao'] >= 0)); +$baixas = array_values(array_filter($acompanhados, fn($a) => $a['variacao'] < 0)); + +usort($altas, fn($a, $b) => $b['variacao'] <=> $a['variacao']); +usort($baixas, fn($a, $b) => $a['variacao'] <=> $b['variacao']); + +require __DIR__ . '/includes/header.php'; + +/** Uma linha da grid de cotações (compartilhada entre a grid de altas e a de baixas). */ +function ao_cot_linha(array $a) { + $classe = $a['variacao'] >= 0 ? 'ao-badge-alta' : 'ao-badge-baixa'; + $seta = $a['variacao'] >= 0 ? '▲' : '▼'; + ?> + + + + + R$ + + sem cotação ainda + + + + + % + + + + + + + em + + — + + + +
+ + + + +
+
+ + + +
+ + + + +

Cotações do dia

+ + +
+ + +
+ + +
+
Acompanhar novo ativo
+

+ A cotação é compartilhada: qualquer pessoa que também acompanhe o ativo pode + atualizar o preço, e todo mundo que o acompanha vê o valor mais recente. +

+
+ +
+ + +
+ +
+
+ + +
+

Você ainda não está acompanhando nenhum ativo. Use o formulário acima para adicionar o primeiro.

+
+ + +
+
Altas do dia
+ + + + + + + + + + +
AtivoÚltimoVariaçãoÚltima atualização
Nenhum ativo em alta no momento.
+
+ +
+
Baixas do dia
+ + + + + + + + + + +
AtivoÚltimoVariaçãoÚltima atualização
Nenhum ativo em baixa no momento.
+
+ + + + diff --git a/includes/auth.php b/includes/auth.php new file mode 100644 index 0000000..add840f --- /dev/null +++ b/includes/auth.php @@ -0,0 +1,105 @@ + ['arquivo' => 'usuarios.php', 'nome' => 'Usuários'], + 'perfis' => ['arquivo' => 'perfis.php', 'nome' => 'Perfis'], + 'paginas_admin' => ['arquivo' => 'paginas_admin.php', 'nome' => 'Páginas'], +]; + +function ao_usuario_logado() { + return $_SESSION['ao_usuario'] ?? null; +} + +function ao_exigir_login() { + if (!ao_usuario_logado()) { + $_SESSION['ao_pos_login'] = $_SERVER['REQUEST_URI'] ?? 'index.php'; + header('Location: login.php'); + exit; + } +} + +/** true se o usuário logado pode acessar a página de negócio $chave (tabela `paginas`). */ +function ao_tem_permissao($chave) { + $usuario = ao_usuario_logado(); + if (!$usuario) { + return false; + } + if (!empty($usuario['acesso_total'])) { + return true; + } + return in_array($chave, $usuario['paginas'] ?? [], true); +} + +/** Carrega os dados de sessão do usuário a partir do banco (login e refresh de permissões). */ +function ao_carregar_sessao_usuario(PDO $pdo, array $usuarioDb, array $perfilDb) { + $paginas = []; + if (empty($perfilDb['acesso_total'])) { + $stmt = $pdo->prepare( + 'SELECT p.chave FROM paginas p + INNER JOIN perfil_paginas pp ON pp.pagina_id = p.id + WHERE pp.perfil_id = ? AND p.ativo = 1' + ); + $stmt->execute([$perfilDb['id']]); + $paginas = array_column($stmt->fetchAll(), 'chave'); + } + + $_SESSION['ao_usuario'] = [ + 'id' => (int) $usuarioDb['id'], + 'nome' => $usuarioDb['nome'], + 'email' => $usuarioDb['email'], + 'perfil_id' => (int) $perfilDb['id'], + 'perfil_nome' => $perfilDb['nome'], + 'acesso_total' => (bool) $perfilDb['acesso_total'], + 'paginas' => $paginas, + ]; +} + +function ao_pagina_acesso_negado($ao_tema_atual = null) { + http_response_code(403); + $cor = $ao_tema_atual['cor'] ?? '#7FA653'; + echo '' + . 'Acesso negado — AçãoOpção' + . '' + . '' + . '
' + . '
🔒
' + . '

Acesso negado

' + . '

Seu perfil não tem permissão para acessar esta página. ' + . 'Fale com um administrador se precisar desse acesso.

' + . 'Voltar' + . '
'; + exit; +} + +/** Exige login e, se $chave for informada, permissão para aquela página de negócio. */ +function ao_exigir_permissao($chave = null, $ao_tema_atual = null) { + ao_exigir_login(); + if ($chave !== null && !ao_tem_permissao($chave)) { + ao_pagina_acesso_negado($ao_tema_atual); + } +} + +/** Exige login e acesso_total (para as páginas de administração do próprio sistema). */ +function ao_exigir_acesso_total($ao_tema_atual = null) { + ao_exigir_login(); + $usuario = ao_usuario_logado(); + if (empty($usuario['acesso_total'])) { + ao_pagina_acesso_negado($ao_tema_atual); + } +} diff --git a/includes/config.example.php b/includes/config.example.php new file mode 100644 index 0000000..2e9a907 --- /dev/null +++ b/includes/config.example.php @@ -0,0 +1,76 @@ + 'http://localhost:8080/claude/AcaoOpcao/', + 'producao' => 'https://acaoeopcaoderivativos.systems/', +]; + +function ao_ler_ambiente() { + $padrao = 'desenvolvimento'; + if (!file_exists(AO_AMBIENTE_ARQUIVO)) { + return $padrao; + } + $conteudo = json_decode((string) file_get_contents(AO_AMBIENTE_ARQUIVO), true); + $ambiente = is_array($conteudo) ? ($conteudo['ambiente'] ?? $padrao) : $padrao; + return array_key_exists($ambiente, AO_URLS) ? $ambiente : $padrao; +} + +function ao_salvar_ambiente($ambiente) { + if (!array_key_exists($ambiente, AO_URLS)) { + return false; + } + $ok = file_put_contents( + AO_AMBIENTE_ARQUIVO, + json_encode(['ambiente' => $ambiente], JSON_PRETTY_PRINT) + ); + return $ok !== false; +} + +// Constantes disponíveis para o resto do sistema: +// AO_AMBIENTE 'desenvolvimento' | 'producao' +// AO_BASE_URL URL completa do ambiente ativo +// AO_IS_PRODUCAO true quando o ambiente ativo é produção (https) +define('AO_AMBIENTE', ao_ler_ambiente()); +define('AO_BASE_URL', AO_URLS[AO_AMBIENTE]); +define('AO_IS_PRODUCAO', AO_AMBIENTE === 'producao'); + +// Credenciais do banco de dados MySQL por ambiente. Troque os valores de +// "producao" diretamente aqui, editando o arquivo no servidor — por segurança, +// evite colar senha de produção em e-mail, chat ou qualquer lugar fora deste +// arquivo. O ambiente ativo é escolhido na tela Configurações do sistema. +const AO_BANCOS = [ + 'desenvolvimento' => [ + 'host' => 'localhost', + 'nome' => 'acaoopcao', + 'usuario' => 'josima70_josimar', + 'senha' => 'Josim@r230976', + ], + 'producao' => [ + 'host' => 'database', // ajuste se o banco de produção estiver em outro host + 'nome' => 'acaoopcao', + 'usuario' => 'root', + 'senha' => 'Josim@r230976', + ], +]; + +define('AO_DB_HOST', AO_BANCOS[AO_AMBIENTE]['host']); +define('AO_DB_NOME', AO_BANCOS[AO_AMBIENTE]['nome']); +define('AO_DB_USUARIO', AO_BANCOS[AO_AMBIENTE]['usuario']); +define('AO_DB_SENHA', AO_BANCOS[AO_AMBIENTE]['senha']); + +/** + * Monta uma URL absoluta a partir de um caminho relativo ao projeto, + * usando a URL base do ambiente ativo. Útil para links que precisam + * ser absolutos (ex.: compartilhamento, tag canonical, e-mails). + * Os links internos do próprio sistema continuam relativos e não + * precisam desta função para funcionar nos dois ambientes. + */ +function ao_url($caminho = '') { + return rtrim(AO_BASE_URL, '/') . '/' . ltrim($caminho, '/'); +} diff --git a/includes/db.php b/includes/db.php new file mode 100644 index 0000000..c9f1993 --- /dev/null +++ b/includes/db.php @@ -0,0 +1,35 @@ + PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ] + ); +} catch (PDOException $e) { + http_response_code(500); + die( + '
' . + '

Não foi possível conectar ao banco de dados

' . + '

Ambiente ativo: ' . htmlspecialchars(AO_AMBIENTE) . '. Verifique se o MySQL está ' . + 'ativo, se o banco ' . htmlspecialchars(AO_DB_NOME) . ' foi criado a partir de ' . + 'includes/esquema.sql, e se o usuário/senha em includes/config.php ' . + '(bloco AO_BANCOS) estão corretos para este ambiente.

' . + '

Detalhe técnico: ' . htmlspecialchars($e->getMessage()) . '

' . + '
' + ); +} diff --git a/includes/footer.php b/includes/footer.php new file mode 100644 index 0000000..ce8138f --- /dev/null +++ b/includes/footer.php @@ -0,0 +1,6 @@ + +
+ AçãoOpção — protótipo de identidade visual (tema atual: ) +
+ + diff --git a/includes/header.php b/includes/header.php new file mode 100644 index 0000000..ca9c127 --- /dev/null +++ b/includes/header.php @@ -0,0 +1,232 @@ +query('SELECT chave, nome, arquivo FROM paginas WHERE ativo = 1 ORDER BY ordem, nome')->fetchAll(); + +// "Contas" não fica mais no menu principal — mora no submenu do usuário. +// Buscamos os dados dela aqui (nome/arquivo, caso alguém renomeie em +// Páginas) para montar o link lá embaixo, já checando a permissão normal. +$ao_pagina_contas = null; +foreach ($ao_nav_paginas as $p) { + if ($p['chave'] === 'contas') { + $ao_pagina_contas = $p; + break; + } +} +?> + + + + + +AçãoOpção<?= isset($titulo_pagina) ? ' — ' . htmlspecialchars($titulo_pagina) : '' ?> + + + + + + + + + +
+
+ + AçãoOpção +
+ +
+
+ +
+ + + + Minha conta + +
+
Identidade visual
+
+ $info): ?> + + + + + +
+ +
+ Sair +
+
+
+
+ +
diff --git a/includes/theme.php b/includes/theme.php new file mode 100644 index 0000000..a615655 --- /dev/null +++ b/includes/theme.php @@ -0,0 +1,89 @@ + [ + 'nome' => 'Verde', + 'css' => 'assets/css/identidade-visual-verde.css', + 'favicon' => 'assets/img/logos/verde/favicon.ico', + 'icone' => 'assets/img/logos/verde/svg/icone-cor.svg', + 'cor' => '#7FA653', + ], + 'marrom' => [ + 'nome' => 'Marrom', + 'css' => 'assets/css/identidade-visual-marrom.css', + 'favicon' => 'assets/img/logos/marrom/favicon.ico', + 'icone' => 'assets/img/logos/marrom/svg/icone-cor.svg', + 'cor' => '#A6754C', + ], + 'cinza' => [ + 'nome' => 'Cinza', + 'css' => 'assets/css/identidade-visual-cinza.css', + 'favicon' => 'assets/img/logos/cinza/favicon.ico', + 'icone' => 'assets/img/logos/cinza/svg/icone-cor.svg', + 'cor' => '#6B6F77', + ], +]; + +$ao_modos_info = [ + 'claro' => ['nome' => 'Claro', 'icone' => '☀️'], + 'escuro' => ['nome' => 'Escuro', 'icone' => '🌙'], +]; + +// Duração do cookie de identidade: 1 ano. Guardamos a escolha do usuário +// em cookie (não em sessão) justamente para que ela sobreviva ao fechar +// o navegador — é isso que "lembra" o tema/modo na próxima visita. +const AO_COOKIE_DURACAO = 60 * 60 * 24 * 365; + +function ao_definir_cookie($nome, $valor) { + setcookie($nome, $valor, [ + 'expires' => time() + AO_COOKIE_DURACAO, + 'path' => '/', + 'secure' => AO_IS_PRODUCAO, + 'httponly' => true, + 'samesite' => 'Lax', + ]); +} + +// Troca de tema/modo via link "?tema=marrom" e/ou "?modo=escuro" — grava +// em cookie e redireciona para a mesma URL sem o parâmetro, para manter +// o endereço limpo. Os dois podem vir juntos na mesma requisição. +$ao_precisa_redirecionar = false; + +if (isset($_GET['tema']) && array_key_exists($_GET['tema'], $ao_temas_info)) { + ao_definir_cookie('ao_tema', $_GET['tema']); + $_COOKIE['ao_tema'] = $_GET['tema']; + $ao_precisa_redirecionar = true; +} + +if (isset($_GET['modo']) && array_key_exists($_GET['modo'], $ao_modos_info)) { + ao_definir_cookie('ao_modo', $_GET['modo']); + $_COOKIE['ao_modo'] = $_GET['modo']; + $ao_precisa_redirecionar = true; +} + +if ($ao_precisa_redirecionar) { + $destino = strtok($_SERVER['REQUEST_URI'], '?'); + header('Location: ' . $destino); + exit; +} + +$ao_tema = $_COOKIE['ao_tema'] ?? 'verde'; +if (!array_key_exists($ao_tema, $ao_temas_info)) { + $ao_tema = 'verde'; +} + +$ao_modo = $_COOKIE['ao_modo'] ?? 'claro'; +if (!array_key_exists($ao_modo, $ao_modos_info)) { + $ao_modo = 'claro'; +} + +$ao_tema_atual = $ao_temas_info[$ao_tema]; +$ao_modo_atual = $ao_modos_info[$ao_modo]; +$ao_proximo_modo = $ao_modo === 'claro' ? 'escuro' : 'claro'; diff --git a/index.html b/index.html new file mode 100644 index 0000000..0d032ad --- /dev/null +++ b/index.html @@ -0,0 +1,89 @@ + + + + + +Ação e Opção Derivativos + + + +
+ Em breve +

Ação e Opção Derivativos

+

Nosso site está em fase final de preparação.

+

Volte em breve para conferir as novidades.

+
+

Dúvidas ou contato: contato@acaoeopcaoderivativos.systems

+
+ + diff --git a/index.php b/index.php new file mode 100644 index 0000000..6b354fc --- /dev/null +++ b/index.php @@ -0,0 +1,54 @@ + 'PETR4', 'qtd' => 300, 'preco_medio' => 36.10, 'atual' => 38.42, 'variacao' => 6.42], + ['ativo' => 'VALE3', 'qtd' => 150, 'preco_medio' => 63.80, 'atual' => 61.07, 'variacao' => -4.28], + ['ativo' => 'PETR4C40', 'qtd' => 1000, 'preco_medio' => 1.30, 'atual' => 1.12, 'variacao' => -13.85], +]; +?> + +

Minha carteira

+ +
+
+
+ Saldo consolidado + +3,2% no mês +
+

R$ 48.920,17

+
+
+
Em ações
+

R$ 36.150,00

+
+
+
Em opções
+

R$ 12.770,17

+
+
+ +
+
Posições abertas
+ + + + + + + = 0 ? 'ao-up' : 'ao-down'; ?> + + + + + + + + + +
AtivoQtd.Preço médioAtualResultado
R$ R$ = 0 ? '+' : '' ?>%
+
+ + diff --git a/login.php b/login.php new file mode 100644 index 0000000..3a61330 --- /dev/null +++ b/login.php @@ -0,0 +1,107 @@ +prepare('SELECT * FROM usuarios WHERE email = ? AND ativo = 1'); + $stmt->execute([$email]); + $usuarioDb = $stmt->fetch(); + + if ($usuarioDb && password_verify($senha, $usuarioDb['senha_hash'])) { + $stmtPerfil = $pdo->prepare('SELECT * FROM perfis WHERE id = ? AND ativo = 1'); + $stmtPerfil->execute([$usuarioDb['perfil_id']]); + $perfilDb = $stmtPerfil->fetch(); + + if (!$perfilDb) { + $erro = 'Seu perfil de acesso está inativo. Fale com um administrador.'; + } else { + ao_carregar_sessao_usuario($pdo, $usuarioDb, $perfilDb); + session_regenerate_id(true); + + $pdo->prepare('UPDATE usuarios SET ultimo_login = NOW() WHERE id = ?')->execute([$usuarioDb['id']]); + + $destino = $_SESSION['ao_pos_login'] ?? 'index.php'; + unset($_SESSION['ao_pos_login']); + header('Location: ' . $destino); + exit; + } + } else { + $erro = 'E-mail ou senha inválidos.'; + } +} +?> + + + + + +Entrar — AçãoOpção + + + + + + + + + + + diff --git a/logout.php b/logout.php new file mode 100644 index 0000000..e06dcc7 --- /dev/null +++ b/logout.php @@ -0,0 +1,15 @@ +prepare('SELECT senha_hash FROM usuarios WHERE id = ?'); + $stmt->execute([$ao_usuario_id]); + $linha = $stmt->fetch(); + if (!$linha || !password_verify($senha_atual, $linha['senha_hash'])) { + $erro = 'Senha atual incorreta.'; + } + } + + if (!$erro) { + try { + if ($quer_trocar_senha) { + $stmt = $pdo->prepare('UPDATE usuarios SET nome = ?, senha_hash = ? WHERE id = ?'); + $stmt->execute([$nome, password_hash($nova_senha, PASSWORD_DEFAULT), $ao_usuario_id]); + } else { + $stmt = $pdo->prepare('UPDATE usuarios SET nome = ? WHERE id = ?'); + $stmt->execute([$nome, $ao_usuario_id]); + } + + // Atualiza a sessão para o nome novo aparecer no cabeçalho na hora. + $_SESSION['ao_usuario']['nome'] = $nome; + + header('Location: minha-conta.php?salvo=1'); + exit; + } catch (PDOException $e) { + $erro = 'Erro ao salvar: ' . $e->getMessage(); + } + } + } +} + +if (isset($_GET['salvo'])) { + $sucesso = 'Dados salvos com sucesso.'; +} +// Nome exibido no formulário: o que acabou de ser digitado (se deu erro) ou o +// nome atual da sessão. +$ao_nome_form = $_SERVER['REQUEST_METHOD'] === 'POST' ? ($nome ?? $ao_usuario_atual['nome']) : $ao_usuario_atual['nome']; + +require __DIR__ . '/includes/header.php'; +?> + +

Minha conta

+ + +
+ + +
+ + +
+
Meus dados
+

+ E-mail: +

+
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + + + diff --git a/operacoes.php b/operacoes.php new file mode 100644 index 0000000..d6e4ea5 --- /dev/null +++ b/operacoes.php @@ -0,0 +1,62 @@ + '20/08/2026', 'ativo' => 'PETR4', 'operacao' => 'Compra', 'qtd' => 100, 'preco' => 37.90], + ['data' => '18/08/2026', 'ativo' => 'PETR4C40', 'operacao' => 'Venda', 'qtd' => 500, 'preco' => 1.24], + ['data' => '12/08/2026', 'ativo' => 'VALE3', 'operacao' => 'Compra', 'qtd' => 150, 'preco' => 63.80], +]; +?> + +

Registrar operação

+ +
+
+
+ + +
+
+
+ + +
+
+ + +
+
+
+ + +
+ +
+
+ +
+
Histórico recente
+ + + + + + + + + + + + + + + +
DataAtivoOperaçãoQtd.Preço
R$
+
+ + diff --git a/paginas_admin.php b/paginas_admin.php new file mode 100644 index 0000000..5295925 --- /dev/null +++ b/paginas_admin.php @@ -0,0 +1,144 @@ +prepare('DELETE FROM paginas WHERE id = ?')->execute([$id]); + header('Location: paginas_admin.php?excluido=1'); + exit; +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'salvar') { + $id = (int) ($_POST['id'] ?? 0); + $chave = strtolower(trim($_POST['chave'] ?? '')); + $nome = trim($_POST['nome'] ?? ''); + $arquivo = trim($_POST['arquivo'] ?? ''); + $ordem = (int) ($_POST['ordem'] ?? 0); + $ativo = isset($_POST['ativo']) ? 1 : 0; + + if ($chave === '' || $nome === '' || $arquivo === '') { + $erro = 'Preencha chave, nome e arquivo.'; + } elseif (!preg_match('/^[a-z0-9_]+$/', $chave)) { + $erro = 'A chave só pode ter letras minúsculas, números e sublinhado (ex: relatorios_mensais).'; + } elseif (array_key_exists($chave, AO_PAGINAS_ADMIN)) { + $erro = 'Essa chave é reservada para as páginas de administração do próprio sistema.'; + } else { + try { + if ($id > 0) { + $stmt = $pdo->prepare('UPDATE paginas SET chave=?, nome=?, arquivo=?, ordem=?, ativo=? WHERE id=?'); + $stmt->execute([$chave, $nome, $arquivo, $ordem, $ativo, $id]); + } else { + $stmt = $pdo->prepare('INSERT INTO paginas (chave, nome, arquivo, ordem, ativo) VALUES (?,?,?,?,?)'); + $stmt->execute([$chave, $nome, $arquivo, $ordem, $ativo]); + } + header('Location: paginas_admin.php?salvo=1'); + exit; + } catch (PDOException $e) { + $erro = ($e->getCode() === '23000') ? 'Já existe uma página com esta chave.' : ('Erro ao salvar: ' . $e->getMessage()); + } + } +} + +$editando = null; +if (isset($_GET['editar'])) { + $stmt = $pdo->prepare('SELECT * FROM paginas WHERE id = ?'); + $stmt->execute([(int) $_GET['editar']]); + $editando = $stmt->fetch() ?: null; +} + +if (isset($_GET['salvo'])) $sucesso = 'Página salva com sucesso.'; +if (isset($_GET['excluido'])) $sucesso = 'Página excluída.'; + +$paginas = $pdo->query('SELECT * FROM paginas ORDER BY ordem, nome')->fetchAll(); + +require __DIR__ . '/includes/header.php'; +?> + +

Páginas do sistema

+

+ Esta é a lista de páginas de negócio que podem ser liberadas por perfil, em Perfis. + Ao cadastrar uma página nova aqui, crie também o arquivo .php correspondente no projeto, + usando a mesma chave na variável $pagina_ativa. +

+ + +
+ + +
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+ +
+ + + Cancelar + +
+
+ +
+
Páginas cadastradas
+ + + + + + + + + + + + + + + + +
OrdemNomeChaveArquivoStatus
+ Editar +
+ + + +
+
+
+ + diff --git a/perfis.php b/perfis.php new file mode 100644 index 0000000..13b67d2 --- /dev/null +++ b/perfis.php @@ -0,0 +1,167 @@ +prepare('SELECT COUNT(*) FROM usuarios WHERE perfil_id = ?'); + $stmt->execute([$id]); + if ((int) $stmt->fetchColumn() > 0) { + $erro = 'Não é possível excluir: existem usuários com este perfil.'; + } else { + $pdo->prepare('DELETE FROM perfis WHERE id = ?')->execute([$id]); + header('Location: perfis.php?excluido=1'); + exit; + } +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'salvar') { + $id = (int) ($_POST['id'] ?? 0); + $nome = trim($_POST['nome'] ?? ''); + $acesso_total = isset($_POST['acesso_total']) ? 1 : 0; + $ativo = isset($_POST['ativo']) ? 1 : 0; + $paginas_sel = array_map('intval', $_POST['paginas'] ?? []); + + if ($nome === '') { + $erro = 'Informe o nome do perfil.'; + } else { + try { + $pdo->beginTransaction(); + if ($id > 0) { + $stmt = $pdo->prepare('UPDATE perfis SET nome=?, acesso_total=?, ativo=? WHERE id=?'); + $stmt->execute([$nome, $acesso_total, $ativo, $id]); + } else { + $stmt = $pdo->prepare('INSERT INTO perfis (nome, acesso_total, ativo) VALUES (?,?,?)'); + $stmt->execute([$nome, $acesso_total, $ativo]); + $id = (int) $pdo->lastInsertId(); + } + + $pdo->prepare('DELETE FROM perfil_paginas WHERE perfil_id = ?')->execute([$id]); + if (!$acesso_total && $paginas_sel) { + $stmtIns = $pdo->prepare('INSERT INTO perfil_paginas (perfil_id, pagina_id) VALUES (?, ?)'); + foreach ($paginas_sel as $pid) { + $stmtIns->execute([$id, $pid]); + } + } + $pdo->commit(); + header('Location: perfis.php?salvo=1'); + exit; + } catch (PDOException $e) { + $pdo->rollBack(); + $erro = ($e->getCode() === '23000') ? 'Já existe um perfil com este nome.' : ('Erro ao salvar: ' . $e->getMessage()); + } + } +} + +$editando = null; +$paginas_do_perfil = []; +if (isset($_GET['editar'])) { + $stmt = $pdo->prepare('SELECT * FROM perfis WHERE id = ?'); + $stmt->execute([(int) $_GET['editar']]); + $editando = $stmt->fetch() ?: null; + if ($editando) { + $stmt2 = $pdo->prepare('SELECT pagina_id FROM perfil_paginas WHERE perfil_id = ?'); + $stmt2->execute([$editando['id']]); + $paginas_do_perfil = array_map('intval', array_column($stmt2->fetchAll(), 'pagina_id')); + } +} + +if (isset($_GET['salvo'])) $sucesso = 'Perfil salvo com sucesso.'; +if (isset($_GET['excluido'])) $sucesso = 'Perfil excluído.'; + +$todas_paginas = $pdo->query('SELECT id, chave, nome FROM paginas WHERE ativo = 1 ORDER BY ordem, nome')->fetchAll(); +$perfis = $pdo->query( + 'SELECT pf.*, (SELECT COUNT(*) FROM usuarios u WHERE u.perfil_id = pf.id) AS total_usuarios FROM perfis pf ORDER BY pf.nome' +)->fetchAll(); + +require __DIR__ . '/includes/header.php'; +?> + +

Perfis de acesso

+ + +
+ + +
+ + +
+
+
+ + +
+ + +
+ + + +
+ + +

Nenhuma página cadastrada ainda — cadastre em Páginas.

+ + + + +
+ + + + + + Cancelar + +
+
+ +
+
Perfis cadastrados
+ + + + + + + + + + + + + + + +
NomeAcessoUsuáriosStatus
Total' : 'Configurado' ?> + Editar + +
+ + + +
+ +
+
+ + diff --git a/phpinfo.php b/phpinfo.php new file mode 100644 index 0000000..61ace19 --- /dev/null +++ b/phpinfo.php @@ -0,0 +1,2 @@ + + + + + +Diagnóstico do servidor + + + + +
+

1. Teste de conexão com o banco de dados

+ setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + echo "

✔ Conexão bem-sucedida com o host '$host'.

"; + + $version = $pdo->query("SELECT VERSION() AS v")->fetch(PDO::FETCH_ASSOC); + echo "

Versão do servidor de banco: " . htmlspecialchars($version['v']) . "

"; + + $dbs = $pdo->query("SHOW DATABASES")->fetchAll(PDO::FETCH_COLUMN); + echo "

Bancos de dados disponíveis:

    "; + foreach ($dbs as $db) { + echo "
  • " . htmlspecialchars($db) . "
  • "; + } + echo "
"; + } catch (PDOException $e) { + echo "

✘ Falha na conexão: " . htmlspecialchars($e->getMessage()) . "

"; + } + ?> +
+ +
+

2. Informações resumidas do PHP

+ + phpversion(), + 'Servidor (SAPI)' => php_sapi_name(), + 'Sistema operacional' => php_uname(), + 'Document root' => $_SERVER['DOCUMENT_ROOT'] ?? '-', + 'Extensão pdo_mysql ativa' => extension_loaded('pdo_mysql') ? 'sim' : 'não', + 'Extensão mysqli ativa' => extension_loaded('mysqli') ? 'sim' : 'não', + 'Limite de memória' => ini_get('memory_limit'), + 'Upload máximo' => ini_get('upload_max_filesize'), + 'Post máximo' => ini_get('post_max_size'), + 'Timezone' => date_default_timezone_get(), + ]; + foreach ($rows as $k => $v) { + echo ""; + } + ?> +
" . htmlspecialchars($k) . "" . htmlspecialchars((string)$v) . "
+
+ +
+

3. Configurações completas do PHP

+

O phpinfo() tem estilo próprio que bagunça o layout desta página, então ele fica isolado em outra página:

+ Abrir phpinfo() completo +
+ + + diff --git a/usuarios.php b/usuarios.php new file mode 100644 index 0000000..f4b5b3c --- /dev/null +++ b/usuarios.php @@ -0,0 +1,313 @@ + 'u.nome', + 'email' => 'u.email', + 'perfil' => 'p.nome', + 'status' => 'u.ativo', + 'ultimo_login' => 'u.ultimo_login', +]; +const AO_USUARIOS_POR_PAGINA = 10; + +$erro = null; +$sucesso = null; + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'excluir') { + $id = (int) ($_POST['id'] ?? 0); + if ($id === (int) $ao_usuario_atual['id']) { + $erro = 'Você não pode excluir o próprio usuário enquanto estiver logado com ele.'; + } else { + $pdo->prepare('DELETE FROM usuarios WHERE id = ?')->execute([$id]); + header('Location: usuarios.php?excluido=1'); + exit; + } +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'salvar') { + $id = (int) ($_POST['id'] ?? 0); + $nome = trim($_POST['nome'] ?? ''); + $email = trim($_POST['email'] ?? ''); + $senha = (string) ($_POST['senha'] ?? ''); + $confirmar_senha = (string) ($_POST['confirmar_senha'] ?? ''); + $perfil_id = (int) ($_POST['perfil_id'] ?? 0); + $ativo = isset($_POST['ativo']) ? 1 : 0; + + if ($nome === '' || $email === '' || $perfil_id === 0) { + $erro = 'Preencha nome, e-mail e perfil.'; + } elseif ($id === 0 && $senha === '') { + $erro = 'Informe uma senha para o novo usuário.'; + } elseif ($senha !== '' && $senha !== $confirmar_senha) { + $erro = 'A senha e a confirmação de senha não são iguais.'; + } else { + try { + if ($id > 0) { + if ($senha !== '') { + $stmt = $pdo->prepare('UPDATE usuarios SET nome=?, email=?, senha_hash=?, perfil_id=?, ativo=? WHERE id=?'); + $stmt->execute([$nome, $email, password_hash($senha, PASSWORD_DEFAULT), $perfil_id, $ativo, $id]); + } else { + $stmt = $pdo->prepare('UPDATE usuarios SET nome=?, email=?, perfil_id=?, ativo=? WHERE id=?'); + $stmt->execute([$nome, $email, $perfil_id, $ativo, $id]); + } + } else { + $stmt = $pdo->prepare('INSERT INTO usuarios (nome, email, senha_hash, perfil_id, ativo) VALUES (?,?,?,?,?)'); + $stmt->execute([$nome, $email, password_hash($senha, PASSWORD_DEFAULT), $perfil_id, $ativo]); + } + header('Location: usuarios.php?salvo=1'); + exit; + } catch (PDOException $e) { + $erro = ($e->getCode() === '23000') ? 'Já existe um usuário com este e-mail.' : ('Erro ao salvar: ' . $e->getMessage()); + } + } +} + +$editando = null; +if (isset($_GET['editar'])) { + $stmt = $pdo->prepare('SELECT * FROM usuarios WHERE id = ?'); + $stmt->execute([(int) $_GET['editar']]); + $editando = $stmt->fetch() ?: null; +} + +// Se o formulário foi enviado e deu erro, mantemos os dados digitados na +// tela (menos as senhas, por segurança) em vez de limpar tudo. +if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'salvar' && $erro) { + $editando = [ + 'id' => $id, + 'nome' => $nome, + 'email' => $email, + 'perfil_id' => $perfil_id, + 'ativo' => $ativo, + ]; +} + +if (isset($_GET['salvo'])) $sucesso = 'Usuário salvo com sucesso.'; +if (isset($_GET['excluido'])) $sucesso = 'Usuário excluído.'; + +$perfis = $pdo->query('SELECT id, nome FROM perfis WHERE ativo = 1 ORDER BY nome')->fetchAll(); + +// Ordenação do grid: valida contra a lista fixa acima antes de montar o SQL. +$ao_ordenar = (string) ($_GET['ordenar'] ?? 'nome'); +if (!array_key_exists($ao_ordenar, AO_USUARIOS_COLUNAS_ORDENAVEIS)) { + $ao_ordenar = 'nome'; +} +$ao_direcao = strtolower((string) ($_GET['direcao'] ?? 'asc')) === 'desc' ? 'desc' : 'asc'; +$ao_ordenar_sql = AO_USUARIOS_COLUNAS_ORDENAVEIS[$ao_ordenar] . ' ' . strtoupper($ao_direcao); + +// Paginação do grid. +$ao_total_usuarios = (int) $pdo->query('SELECT COUNT(*) FROM usuarios')->fetchColumn(); +$ao_total_paginas = max(1, (int) ceil($ao_total_usuarios / AO_USUARIOS_POR_PAGINA)); +$ao_pagina_atual = (int) ($_GET['pagina'] ?? 1); +if ($ao_pagina_atual < 1) $ao_pagina_atual = 1; +if ($ao_pagina_atual > $ao_total_paginas) $ao_pagina_atual = $ao_total_paginas; +$ao_offset = ($ao_pagina_atual - 1) * AO_USUARIOS_POR_PAGINA; + +$usuarios = $pdo->query( + "SELECT u.*, p.nome AS perfil_nome FROM usuarios u INNER JOIN perfis p ON p.id = u.perfil_id + ORDER BY {$ao_ordenar_sql} + LIMIT " . AO_USUARIOS_POR_PAGINA . " OFFSET {$ao_offset}" +)->fetchAll(); + +/** Monta a URL do grid preservando ordenação/página, trocando só o que for passado em $sobrescrever. */ +function ao_usuarios_url(array $sobrescrever, $ordenar, $direcao, $pagina) { + $params = array_merge(['ordenar' => $ordenar, 'direcao' => $direcao, 'pagina' => $pagina], $sobrescrever); + return 'usuarios.php?' . http_build_query($params); +} + +require __DIR__ . '/includes/header.php'; +?> + +
+

Usuários

+ +
+ + +
+ + +
+ + +
+ +
+ +
+
Usuários cadastrados
+ + + + 'Nome', + 'email' => 'E-mail', + 'perfil' => 'Perfil', + 'status' => 'Status', + 'ultimo_login' => 'Último login', + ]; + ?> + $ao_col_rotulo): ?> + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + Nunca + + + Editar + +
+ + + +
+ +
+ + 1): ?> +
+ + Página de ( usuários) + + +
+ +
+ + + + + +