gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] 01/02: challenger ui


From: gnunet
Subject: [taler-wallet-core] 01/02: challenger ui
Date: Tue, 14 Nov 2023 11:12:11 +0100

This is an automated email from the git hooks/post-receive script.

sebasjm pushed a commit to branch master
in repository wallet-core.

commit cd87d4c0b78525d428b10011446b6f510f9f6736
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Tue Nov 14 00:00:40 2023 -0300

    challenger ui
---
 packages/challenger-ui/.gitignore                  |   4 +
 packages/challenger-ui/Makefile                    |  36 ++++++
 packages/challenger-ui/README.md                   |   4 +
 packages/challenger-ui/copyleft-header.js          |  15 +++
 packages/challenger-ui/dev.mjs                     |  49 ++++++++
 packages/challenger-ui/package.json                |  48 ++++++++
 packages/challenger-ui/postcss.config.js           |   6 +
 packages/challenger-ui/src/assets/home.svg         |   3 +
 packages/challenger-ui/src/assets/logo-2021.svg    |   9 ++
 packages/challenger-ui/src/assets/people.svg       |   3 +
 packages/challenger-ui/src/attempts-exhausted.html |  90 +++++++++++++++
 packages/challenger-ui/src/enter-address-form.html | 125 +++++++++++++++++++++
 packages/challenger-ui/src/enter-tan-form.html     | 119 ++++++++++++++++++++
 packages/challenger-ui/src/internal-error.html     |  91 +++++++++++++++
 packages/challenger-ui/src/invalid-pin.html        |  89 +++++++++++++++
 packages/challenger-ui/src/invalid-request.html    |  90 +++++++++++++++
 packages/challenger-ui/src/main.js                 |   2 +
 packages/challenger-ui/src/scss/main.css           |   3 +
 packages/challenger-ui/src/validation-unknown.html |  91 +++++++++++++++
 packages/challenger-ui/tailwind.config.js          |  14 +++
 packages/web-util/src/index.build.ts               |   6 +-
 pnpm-lock.yaml                                     |  95 ++++++++--------
 22 files changed, 945 insertions(+), 47 deletions(-)

diff --git a/packages/challenger-ui/.gitignore 
b/packages/challenger-ui/.gitignore
new file mode 100644
index 000000000..30cb2774c
--- /dev/null
+++ b/packages/challenger-ui/.gitignore
@@ -0,0 +1,4 @@
+node_modules
+/build
+/*.log
+/demobank-ui-settings.js
diff --git a/packages/challenger-ui/Makefile b/packages/challenger-ui/Makefile
new file mode 100644
index 000000000..64f9f83d1
--- /dev/null
+++ b/packages/challenger-ui/Makefile
@@ -0,0 +1,36 @@
+# This Makefile has been placed in the public domain
+
+ifeq ($(TOPLEVEL), yes)
+  $(info top-level build)
+  -include ../../.config.mk
+  override DESTDIR := $(TOP_DESTDIR)
+else
+  $(info package-level build)
+  -include ../../.config.mk
+  -include .config.mk
+endif
+
+$(info prefix is $(prefix))
+
+.PHONY: all
+all:
+       @echo run \'make install\' to install
+
+spa_dir=$(DESTDIR)$(prefix)/share/taler/aml-backoffice-ui
+
+.PHONY: install-nodeps
+install-nodeps:
+       install -d $(spa_dir)
+       install ./dist/prod/* $(spa_dir)
+
+.PHONY: deps
+deps:
+       pnpm install --frozen-lockfile --filter @gnu-taler/aml-backoffice-ui...
+       pnpm run check
+       pnpm run build
+
+.PHONY: install
+install:
+       $(MAKE) deps
+       $(MAKE) install-nodeps
+
diff --git a/packages/challenger-ui/README.md b/packages/challenger-ui/README.md
new file mode 100644
index 000000000..855addd74
--- /dev/null
+++ b/packages/challenger-ui/README.md
@@ -0,0 +1,4 @@
+# Taler Exchange Backoffice UI
+
+Web-based user interface for the GNU Taler exchange.
+
diff --git a/packages/challenger-ui/copyleft-header.js 
b/packages/challenger-ui/copyleft-header.js
new file mode 100644
index 000000000..2635717c5
--- /dev/null
+++ b/packages/challenger-ui/copyleft-header.js
@@ -0,0 +1,15 @@
+/*
+ This file is part of GNU Taler
+ (C) 2022 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
diff --git a/packages/challenger-ui/dev.mjs b/packages/challenger-ui/dev.mjs
new file mode 100755
index 000000000..3aca99c4d
--- /dev/null
+++ b/packages/challenger-ui/dev.mjs
@@ -0,0 +1,49 @@
+#!/usr/bin/env node
+/*
+ This file is part of GNU Taler
+ (C) 2022 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+import { serve } from "@gnu-taler/web-util/node";
+import { initializeDev } from "@gnu-taler/web-util/build";
+
+const build = initializeDev({
+  type: "development",
+  source: {
+    js: ["src/main.js"],
+    assets: [{
+      base: "src",
+      files: [
+        "src/attempts-exhausted.html",
+        "src/enter-address-form.html",
+        "src/enter-tan-form.html",
+        "src/internal-error.html",
+        "src/invalid-pin.html",
+        "src/invalid-request.html",
+        "src/validation-unknown.html",
+      ]
+    }],
+  },
+  destination: "./dist/dev",
+  css: "postcss",
+});
+
+await build();
+
+serve({
+  folder: "./dist/dev",
+  port: 8080,
+  source: "./src",
+  onSourceUpdate: build,
+});
diff --git a/packages/challenger-ui/package.json 
b/packages/challenger-ui/package.json
new file mode 100644
index 000000000..bfac108a7
--- /dev/null
+++ b/packages/challenger-ui/package.json
@@ -0,0 +1,48 @@
+{
+  "private": true,
+  "name": "@gnu-taler/challenger-ui",
+  "version": "0.1.0",
+  "author": "sebasjm",
+  "license": "AGPL-3.0-OR-LATER",
+  "description": "UI for GNU Challenger.",
+  "type": "module",
+  "scripts": {
+    "build": "./build.mjs",
+    "check": "tsc",
+    "clean": "rm -rf dist lib",
+    "i18n:extract": "pogen extract",
+    "i18n:merge": "pogen merge",
+    "i18n:emit": "pogen emit",
+    "i18n": "pnpm i18n:extract && pnpm i18n:merge && pnpm i18n:emit",
+    "pretty": "prettier --write src"
+  },
+  "eslintConfig": {
+    "plugins": [
+      "header"
+    ],
+    "rules": {
+      "header/header": [
+        2,
+        "copyleft-header.js"
+      ]
+    },
+    "extends": [
+      "prettier"
+    ]
+  },
+  "devDependencies": {
+    "@gnu-taler/pogen": "^0.0.5",
+    "@gnu-taler/web-util": "workspace:*",
+    "@tailwindcss/forms": "^0.5.3",
+    "@tailwindcss/typography": "^0.5.9",
+    "autoprefixer": "^10.4.14",
+    "esbuild": "^0.17.7",
+    "po2json": "^0.4.5",
+    "postcss": "^8.4.23",
+    "postcss-cli": "^10.1.0",
+    "tailwindcss": "^3.3.2"
+  },
+  "pogen": {
+    "domain": "aml-backoffice"
+  }
+}
\ No newline at end of file
diff --git a/packages/challenger-ui/postcss.config.js 
b/packages/challenger-ui/postcss.config.js
new file mode 100644
index 000000000..2e7af2b7f
--- /dev/null
+++ b/packages/challenger-ui/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+  plugins: {
+    tailwindcss: {},
+    autoprefixer: {},
+  },
+}
diff --git a/packages/challenger-ui/src/assets/home.svg 
b/packages/challenger-ui/src/assets/home.svg
new file mode 100644
index 000000000..35f340162
--- /dev/null
+++ b/packages/challenger-ui/src/assets/home.svg
@@ -0,0 +1,3 @@
+<svg class="h-6 w-6 shrink-0 text-white" fill="none" viewBox="0 0 24 24" 
stroke-width="1.5" stroke="currentColor" aria-hidden="true">
+  <path stroke-linecap="round" stroke-linejoin="round" d="M2.25 
12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 
1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 
1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25" 
/>
+</svg>
\ No newline at end of file
diff --git a/packages/challenger-ui/src/assets/logo-2021.svg 
b/packages/challenger-ui/src/assets/logo-2021.svg
new file mode 100644
index 000000000..8c5ff3e5b
--- /dev/null
+++ b/packages/challenger-ui/src/assets/logo-2021.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"; viewBox="0 0 201 90">
+  <g fill="#0042b3" fill-rule="evenodd" stroke-width=".3">
+    <path d="M86.7 1.1c15.6 0 29 9.4 36 23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 
6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 
0146 44.7c0-24 18.2-43.6 40.7-43.6zm35.8 64.3a40.4 40.4 0 01-39 22.8c3-1.5 
6-3.5 8.6-5.7a35.6 35.6 0 0024.6-17.1z" />
+    <path d="M64.2 1.1l3.1.1c-3 1.6-5.9 3.5-8.5 5.8a37.5 37.5 0 00-30.2 37.7c0 
14.3 7.3 26.7 18 33.3a29.6 29.6 0 01-8.5.2c-9-8-14.6-20-14.6-33.5 0-24 
18.2-43.6 40.7-43.6zm5.4 81.4a35.6 35.6 0 0024.6-17.1h5.9a40.4 40.4 0 01-39 
22.8c3-1.5 5.9-3.5 8.5-5.7zm24.8-58.2a37 37 0 00-12.6-12.8 29.6 29.6 0 
018.5-.2c4 3.6 7.4 8 9.9 13z" />
+    <path d="M41.8 1.1c1 0 2 0 3.1.2-3 1.5-5.9 3.4-8.5 5.6A37.5 37.5 0 006.1 
44.7c0 21.1 16 38.3 35.7 38.3 12.6 0 23.6-7 30-17.6h5.8a40.4 40.4 0 01-35.8 
23C19.3 88.4 1 68.8 1 44.7c0-24 18.2-43.6 40.7-43.6zm30.1 23.2a38.1 38.1 0 
00-4.5-6.1c1.3-1.2 2.7-2.2 4.3-3 2.3 2.7 4.4 5.8 6 9.1z" />
+  </g>
+  <path d="M76.1 34.4h9.2v-5H61.9v5H71v26h5.1zM92.6 52.9h13.7l3 
7.4h5.3l-12.7-31.2h-4.7L84.5 60.3h5.2zm11.8-4.9h-9.9l5-12.4zM123.8 
29.4h-4.6v31h20.6v-5h-16zM166.5 
29.4H145v31h21.6v-5H150v-8.3h14.5v-4.9h-14.5v-8h16.4zM191.2 39.5c0 1.6-.5 
2.8-1.6 3.8s-2.6 1.4-4.4 1.4h-7.4V34.3h7.4c1.9 0 3.4.4 4.4 1.3 1 .9 1.6 2.2 1.6 
3.9zm6 20.8l-7.7-11.7c1-.3 1.9-.7 2.7-1.3a8.8 8.8 0 003.6-4.6c.4-1 .5-2.2.5-3.5 
0-1.5-.2-2.9-.7-4.1a8.4 8.4 0 
00-2.1-3.1c-1-.8-2-1.5-3.4-2-1.3-.4-2.8-.6-4.5-.6h-12.9v31h5V49.4 [...]
+</svg>
\ No newline at end of file
diff --git a/packages/challenger-ui/src/assets/people.svg 
b/packages/challenger-ui/src/assets/people.svg
new file mode 100644
index 000000000..1dc878b81
--- /dev/null
+++ b/packages/challenger-ui/src/assets/people.svg
@@ -0,0 +1,3 @@
+<svg class="h-6 w-6 shrink-0 text-indigo-200 group-hover:text-white" 
fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" 
aria-hidden="true">
+  <path stroke-linecap="round" stroke-linejoin="round" d="M15 19.128a9.38 9.38 
0 002.625.372 9.337 9.337 0 004.121-.952 4.125 4.125 0 00-7.533-2.493M15 
19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 018.624 
21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0111.964-3.07M12 
6.375a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zm8.25 2.25a2.625 2.625 0 
11-5.25 0 2.625 2.625 0 015.25 0z" />
+</svg>
\ No newline at end of file
diff --git a/packages/challenger-ui/src/attempts-exhausted.html 
b/packages/challenger-ui/src/attempts-exhausted.html
new file mode 100644
index 000000000..10559e429
--- /dev/null
+++ b/packages/challenger-ui/src/attempts-exhausted.html
@@ -0,0 +1,90 @@
+<!--
+ This file is part of GNU Taler
+ (C) 2021--2022 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+
+ @author Sebastian Javier Marchano
+-->
+<!DOCTYPE html>
+<html lang="en" class="h-full">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <meta charset="utf-8" />
+  <meta name="viewport" content="width=device-width,initial-scale=1" />
+  <meta name="taler-support" content="uri">
+  <meta name="mobile-web-app-capable" content="yes" />
+  <meta name="apple-mobile-web-app-capable" content="yes" />
+  <link rel="icon"
+    
href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn
 [...]
+  <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" />
+  <link rel="stylesheet" href="main.css" />
+  <script type="module" src="main.js"></script>
+  <title>Attempts exhausted (#{{ec}})</title>
+</head>
+
+<body class="min-h-full flex flex-col">
+  <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 
border-indigo-400">
+    <div class="flex flex-row h-16 items-center ">
+      <div class="flex px-2 justify-start">
+        <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img 
class="h-8 w-auto"
+              src="data:image/svg+xml,<?xml version=&quot;1.0&quot; 
encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?>%0A<svg 
xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 201 90&quot;>%0A 
 <g fill=&quot;%230042b3&quot; fill-rule=&quot;evenodd&quot; 
stroke-width=&quot;.3&quot;>%0A    <path d=&quot;M86.7 1.1c15.6 0 29 9.4 36 
23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 
26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43 [...]
+              alt="GNU Taler" style="height: 1.5rem; margin: 
0.5rem;"></a></div><span
+          class="flex items-center text-white text-lg font-bold 
ml-4">Challenger</span>
+      </div>
+      <div class="block flex-1 ml-6 "></div>
+      <div class="flex justify-end">
+      </div>
+    </div>
+  </header>
+
+  <main class="flex-1">
+    <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 items-center mt-4">
+      <div class="rounded-md bg-red-50 p-4 shadow-xl">
+        <div class="flex">
+          <div class="flex-shrink-0">
+            <svg xmlns="http://www.w3.org/2000/svg"; stroke="none" viewBox="0 0 
24 24" fill="currentColor"
+              class="w-8 h-8 text-red-400">
+              <path fill-rule="evenodd"
+                d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 
9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zM12 8.25a.75.75 0 
01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 
100-1.5.75.75 0 000 1.5z" />
+            </svg>
+          </div>
+          <div class="ml-3">
+            <h3 class="text-sm font-medium text-red-800">
+              You have tried too many times
+            </h3>
+            <div class="mt-2 text-sm text-red-700">
+              <p>More attempts are not allowed</p>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </main>
+
+  <footer class="bottom-4 mb-4">
+    <div class="mt-8 mx-8 md:order-1 md:mt-0">
+      <div>
+        <p class="text-xs leading-5 text-gray-400">Learn more about <a 
target="_blank" rel="noreferrer noopener"
+            class="font-semibold text-gray-500 hover:text-gray-400" 
href="https://taler.net";>GNU Taler</a></p>
+      </div>
+      <div style="flex-grow: 1;"></div>
+      <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler 
Systems SA. <a
+          
href="https://git.taler.net/wallet-core.git/tree/?id=c64ab8c9b57d3bbe58ea2aa8e4d57c8baef7042e";
 target="_blank"
+          rel="noreferrer noopener">Version 0.9.3-dev.29 (---)</a> </p>
+    </div>
+  </footer>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/packages/challenger-ui/src/enter-address-form.html 
b/packages/challenger-ui/src/enter-address-form.html
new file mode 100644
index 000000000..9063acc73
--- /dev/null
+++ b/packages/challenger-ui/src/enter-address-form.html
@@ -0,0 +1,125 @@
+<!--
+ This file is part of GNU Taler
+ (C) 2021--2022 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+
+ @author Sebastian Javier Marchano
+-->
+<!DOCTYPE html>
+<html lang="en" class="h-full">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <meta charset="utf-8" />
+  <meta name="viewport" content="width=device-width,initial-scale=1" />
+  <meta name="taler-support" content="uri">
+  <meta name="mobile-web-app-capable" content="yes" />
+  <meta name="apple-mobile-web-app-capable" content="yes" />
+  <link rel="icon"
+    
href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn
 [...]
+  <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" />
+  <link rel="stylesheet" href="main.css" />
+  <script type="module" src="main.js"></script>
+  <title>Enter contact details</title>
+</head>
+
+<body class="min-h-full flex flex-col">
+  <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 
border-indigo-400">
+    <div class="flex flex-row h-16 items-center ">
+      <div class="flex px-2 justify-start">
+        <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img 
class="h-8 w-auto"
+              src="data:image/svg+xml,<?xml version=&quot;1.0&quot; 
encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?>%0A<svg 
xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 201 90&quot;>%0A 
 <g fill=&quot;%230042b3&quot; fill-rule=&quot;evenodd&quot; 
stroke-width=&quot;.3&quot;>%0A    <path d=&quot;M86.7 1.1c15.6 0 29 9.4 36 
23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 
26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43 [...]
+              alt="GNU Taler" style="height: 1.5rem; margin: 
0.5rem;"></a></div><span
+          class="flex items-center text-white text-lg font-bold 
ml-4">Challenger</span>
+      </div>
+      <div class="block flex-1 ml-6 "></div>
+      <div class="flex justify-end">
+      </div>
+    </div>
+  </header>
+
+  <main class="flex-1">
+
+    <div class="isolate bg-white px-6 py-12">
+      <div class="mx-auto max-w-2xl text-center">
+        <h2 class="text-3xl font-bold tracking-tight text-gray-900 
sm:text-4xl">
+          Enter contact details
+        </h2>
+        <p class="mt-2 text-lg leading-8 text-gray-600">
+          You will receive an email with a code which need to be entered in 
the next page.
+        </p>
+      </div>
+      <form action="/challenge/{{nonce}}" method="POST" class="mx-auto mt-16 
max-w-xl sm:mt-20">
+        <div class="grid grid-cols-1 gap-x-8 gap-y-6">
+          <div class="sm:col-span-2">
+            <label for="email" class="block text-sm font-semibold leading-6 
text-gray-900">Email</label>
+            <div class="mt-2.5">
+              <input type="email" name="email" id="email" maxlength="512" 
autocomplete="email" value="{{last_address}}"
+                {{#fixed_address}}readonly{{/fixed_address}}
+                class="block w-full rounded-md border-0 px-3.5 py-2 
text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 
placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 
sm:text-sm sm:leading-6">
+            </div>
+          </div>
+
+          <script>
+            function check() {
+              var email = document.getElementById('email');
+              var emailRepeat = document.getElementById('repeat-email');
+
+              if (email.value != emailRepeat.value) {
+                emailRepeat.setCustomValidity('The two email addresses must 
match.');
+              } else {
+                // input is valid -- reset the error message 
+                emailRepeat.setCustomValidity('');
+              }
+            }
+          </script>
+
+          <div class="sm:col-span-2">
+            <label for="repeat-email" class="block text-sm font-semibold 
leading-6 text-gray-900">Repeat email</label>
+            <div class="mt-2.5">
+              <input oninput="check(this)" type="email" name="email" 
id="repeat-email" autocomplete="email"
+                class="block w-full rounded-md border-0 px-3.5 py-2 
text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 
placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 
sm:text-sm sm:leading-6">
+            </div>
+          </div>
+
+          <p class="mt-3 text-sm leading-6 text-gray-400">
+            You can change address another {{changes_left}} times.
+          </p>
+        </div>
+
+        <div class="mt-10">
+          <button type="submit"
+            class="block w-full rounded-md bg-indigo-600 px-3.5 py-2.5 
text-center text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 
focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 
focus-visible:outline-indigo-600">
+            Send email
+          </button>
+        </div>
+      </form>
+    </div>
+  </main>
+
+
+  <footer class="bottom-4 mb-4">
+    <div class="mt-8 mx-8 md:order-1 md:mt-0">
+      <div>
+        <p class="text-xs leading-5 text-gray-400">Learn more about <a 
target="_blank" rel="noreferrer noopener"
+            class="font-semibold text-gray-500 hover:text-gray-400" 
href="https://taler.net";>GNU Taler</a></p>
+      </div>
+      <div style="flex-grow: 1;"></div>
+      <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler 
Systems SA. <a
+          
href="https://git.taler.net/wallet-core.git/tree/?id=c64ab8c9b57d3bbe58ea2aa8e4d57c8baef7042e";
 target="_blank"
+          rel="noreferrer noopener">Version 0.9.3-dev.29 (---)</a> </p>
+    </div>
+  </footer>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/packages/challenger-ui/src/enter-tan-form.html 
b/packages/challenger-ui/src/enter-tan-form.html
new file mode 100644
index 000000000..4e1f8c0a3
--- /dev/null
+++ b/packages/challenger-ui/src/enter-tan-form.html
@@ -0,0 +1,119 @@
+<!--
+ This file is part of GNU Taler
+ (C) 2021--2022 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+
+ @author Sebastian Javier Marchano
+-->
+<!DOCTYPE html>
+<html lang="en" class="h-full">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <meta charset="utf-8" />
+  <meta name="viewport" content="width=device-width,initial-scale=1" />
+  <meta name="taler-support" content="uri">
+  <meta name="mobile-web-app-capable" content="yes" />
+  <meta name="apple-mobile-web-app-capable" content="yes" />
+  <link rel="icon"
+    
href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn
 [...]
+  <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" />
+  <link rel="stylesheet" href="main.css" />
+  <script type="module" src="main.js"></script>
+  <title>Enter your TAN</title>
+</head>
+
+<body class="min-h-full flex flex-col">
+  <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 
border-indigo-400">
+    <div class="flex flex-row h-16 items-center ">
+      <div class="flex px-2 justify-start">
+        <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img 
class="h-8 w-auto"
+              src="data:image/svg+xml,<?xml version=&quot;1.0&quot; 
encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?>%0A<svg 
xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 201 90&quot;>%0A 
 <g fill=&quot;%230042b3&quot; fill-rule=&quot;evenodd&quot; 
stroke-width=&quot;.3&quot;>%0A    <path d=&quot;M86.7 1.1c15.6 0 29 9.4 36 
23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 
26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43 [...]
+              alt="GNU Taler" style="height: 1.5rem; margin: 
0.5rem;"></a></div><span
+          class="flex items-center text-white text-lg font-bold 
ml-4">Challenger</span>
+      </div>
+      <div class="block flex-1 ml-6 "></div>
+      <div class="flex justify-end">
+      </div>
+    </div>
+  </header>
+
+  <main class="flex-1">
+
+    <div class="isolate bg-white px-6 py-12">
+      <div class="mx-auto max-w-2xl text-center">
+        <h2 class="text-3xl font-bold tracking-tight text-gray-900 
sm:text-4xl">
+          Please enter the TAN you received to authenticate.
+        </h2>
+        <p class="mt-2 text-lg leading-8 text-gray-600">
+          <!-- {{#transmitted}}
+          A TAN was sent to your address &quot;{{address}}&quot;.
+          {{/transmitted}} -->
+          <!-- {{^transmitted}} -->
+          We recently already sent a TAN to your address 
&quot;{{address}}&quot;.
+          A new TAN will not be transmitted again before {{next_tx_time}}.
+          <!-- {{/transmitted}} -->
+        </p>
+      </div>
+
+
+      <form action="/solve/{{nonce}}" method="POST" class="mx-auto mt-16 
max-w-xl sm:mt-20">
+        <div class="grid grid-cols-1 gap-x-8 gap-y-6">
+          <div class="sm:col-span-2">
+            <label for="pin" class="block text-sm font-semibold leading-6 
text-gray-900">
+              TAN code
+            </label>
+            <div class="mt-2.5">
+              <div
+                class="flex rounded-md shadow-sm ring-1 ring-inset 
ring-gray-300 focus-within:ring-2 focus-within:ring-inset 
focus-within:ring-indigo-600">
+                <span class="flex select-none items-center pl-3 text-gray-500 
sm:text-sm">PIN:</span>
+                <input type="number" name="pin" id="pin" maxlength="64"
+                  class="block flex-1 border-0 bg-transparent py-1.5 pl-1 
text-gray-900 placeholder:text-gray-400 focus:ring-0 sm:text-sm sm:leading-6"
+                  placeholder="12345678">
+              </div>
+
+            </div>
+          </div>
+
+          <p class="mt-3 text-sm leading-6 text-gray-400">
+            You have {{attempts_left}} attempts left.
+          </p>
+        </div>
+
+        <div class="mt-10">
+          <button type="submit"
+            class="block w-full rounded-md bg-indigo-600 px-3.5 py-2.5 
text-center text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 
focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 
focus-visible:outline-indigo-600">
+            Check
+          </button>
+        </div>
+      </form>
+
+    </div>
+  </main>
+
+  <footer class="bottom-4 mb-4">
+    <div class="mt-8 mx-8 md:order-1 md:mt-0">
+      <div>
+        <p class="text-xs leading-5 text-gray-400">Learn more about <a 
target="_blank" rel="noreferrer noopener"
+            class="font-semibold text-gray-500 hover:text-gray-400" 
href="https://taler.net";>GNU Taler</a></p>
+      </div>
+      <div style="flex-grow: 1;"></div>
+      <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler 
Systems SA. <a
+          
href="https://git.taler.net/wallet-core.git/tree/?id=c64ab8c9b57d3bbe58ea2aa8e4d57c8baef7042e";
 target="_blank"
+          rel="noreferrer noopener">Version 0.9.3-dev.29 (---)</a> </p>
+    </div>
+  </footer>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/packages/challenger-ui/src/internal-error.html 
b/packages/challenger-ui/src/internal-error.html
new file mode 100644
index 000000000..1c269722b
--- /dev/null
+++ b/packages/challenger-ui/src/internal-error.html
@@ -0,0 +1,91 @@
+<!--
+ This file is part of GNU Taler
+ (C) 2021--2022 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+
+ @author Sebastian Javier Marchano
+-->
+<!DOCTYPE html>
+<html lang="en" class="h-full">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <meta charset="utf-8" />
+  <meta name="viewport" content="width=device-width,initial-scale=1" />
+  <meta name="taler-support" content="uri">
+  <meta name="mobile-web-app-capable" content="yes" />
+  <meta name="apple-mobile-web-app-capable" content="yes" />
+  <link rel="icon"
+    
href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn
 [...]
+  <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" />
+  <link rel="stylesheet" href="main.css" />
+  <script type="module" src="main.js"></script>
+  <title>Internal server error (#{{ec}})</title>
+</head>
+
+<body class="min-h-full flex flex-col">
+  <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 
border-indigo-400">
+    <div class="flex flex-row h-16 items-center ">
+      <div class="flex px-2 justify-start">
+        <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img 
class="h-8 w-auto"
+              src="data:image/svg+xml,<?xml version=&quot;1.0&quot; 
encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?>%0A<svg 
xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 201 90&quot;>%0A 
 <g fill=&quot;%230042b3&quot; fill-rule=&quot;evenodd&quot; 
stroke-width=&quot;.3&quot;>%0A    <path d=&quot;M86.7 1.1c15.6 0 29 9.4 36 
23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 
26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43 [...]
+              alt="GNU Taler" style="height: 1.5rem; margin: 
0.5rem;"></a></div><span
+          class="flex items-center text-white text-lg font-bold 
ml-4">Challenger</span>
+      </div>
+      <div class="block flex-1 ml-6 "></div>
+      <div class="flex justify-end">
+      </div>
+    </div>
+  </header>
+
+  <main class="flex-1">
+    <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 items-center mt-4">
+      <div class="rounded-md bg-red-50 p-4 shadow-xl">
+        <div class="flex">
+          <div class="flex-shrink-0">
+            <svg xmlns="http://www.w3.org/2000/svg"; stroke="none" viewBox="0 0 
24 24" fill="currentColor"
+              class="w-8 h-8 text-red-400">
+              <path fill-rule="evenodd"
+                d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 
9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zM12 8.25a.75.75 0 
01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 
100-1.5.75.75 0 000 1.5z" />
+            </svg>
+          </div>
+          <div class="ml-3">
+            <h3 class="text-sm font-medium text-red-800">
+              Internal error
+            </h3>
+            <div class="mt-2 text-sm text-red-700">
+              <p>{{hint}} ({{detail}})</p>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+  </main>
+
+  <footer class="bottom-4 mb-4">
+    <div class="mt-8 mx-8 md:order-1 md:mt-0">
+      <div>
+        <p class="text-xs leading-5 text-gray-400">Learn more about <a 
target="_blank" rel="noreferrer noopener"
+            class="font-semibold text-gray-500 hover:text-gray-400" 
href="https://taler.net";>GNU Taler</a></p>
+      </div>
+      <div style="flex-grow: 1;"></div>
+      <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler 
Systems SA. <a
+          
href="https://git.taler.net/wallet-core.git/tree/?id=c64ab8c9b57d3bbe58ea2aa8e4d57c8baef7042e";
 target="_blank"
+          rel="noreferrer noopener">Version 0.9.3-dev.29 (---)</a> </p>
+    </div>
+  </footer>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/packages/challenger-ui/src/invalid-pin.html 
b/packages/challenger-ui/src/invalid-pin.html
new file mode 100644
index 000000000..f748f0425
--- /dev/null
+++ b/packages/challenger-ui/src/invalid-pin.html
@@ -0,0 +1,89 @@
+<!--
+ This file is part of GNU Taler
+ (C) 2021--2022 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+
+ @author Sebastian Javier Marchano
+-->
+<!DOCTYPE html>
+<html lang="en" class="h-full">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <meta charset="utf-8" />
+  <meta name="viewport" content="width=device-width,initial-scale=1" />
+  <meta name="taler-support" content="uri">
+  <meta name="mobile-web-app-capable" content="yes" />
+  <meta name="apple-mobile-web-app-capable" content="yes" />
+  <link rel="icon"
+    
href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn
 [...]
+  <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" />
+  <link rel="stylesheet" href="main.css" />
+  <script type="module" src="main.js"></script>
+  <title>Invalid solution (#{{ec}})</title>
+</head>
+
+<body class="min-h-full flex flex-col">
+  <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 
border-indigo-400">
+    <div class="flex flex-row h-16 items-center ">
+      <div class="flex px-2 justify-start">
+        <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img 
class="h-8 w-auto"
+              src="data:image/svg+xml,<?xml version=&quot;1.0&quot; 
encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?>%0A<svg 
xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 201 90&quot;>%0A 
 <g fill=&quot;%230042b3&quot; fill-rule=&quot;evenodd&quot; 
stroke-width=&quot;.3&quot;>%0A    <path d=&quot;M86.7 1.1c15.6 0 29 9.4 36 
23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 
26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43 [...]
+              alt="GNU Taler" style="height: 1.5rem; margin: 
0.5rem;"></a></div><span
+          class="flex items-center text-white text-lg font-bold 
ml-4">Challenger</span>
+      </div>
+      <div class="block flex-1 ml-6 "></div>
+      <div class="flex justify-end">
+      </div>
+    </div>
+  </header>
+
+  <main class="flex-1">
+    <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 items-center mt-4">
+      <div class="rounded-md bg-red-50 p-4 shadow-xl">
+        <div class="flex">
+          <div class="flex-shrink-0">
+            <svg xmlns="http://www.w3.org/2000/svg"; stroke="none" viewBox="0 0 
24 24" fill="currentColor"
+              class="w-8 h-8 text-red-400">
+              <path fill-rule="evenodd"
+                d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 
9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zM12 8.25a.75.75 0 
01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 
100-1.5.75.75 0 000 1.5z" />
+            </svg>
+          </div>
+          <div class="ml-3">
+            <h3 class="text-sm font-medium text-red-800">
+              Invalid PIN
+            </h3>
+            <div class="mt-2 text-sm text-red-700">
+              <p>{{hint}}</p>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </main>
+
+  <footer class="bottom-4 mb-4">
+    <div class="mt-8 mx-8 md:order-1 md:mt-0">
+      <div>
+        <p class="text-xs leading-5 text-gray-400">Learn more about <a 
target="_blank" rel="noreferrer noopener"
+            class="font-semibold text-gray-500 hover:text-gray-400" 
href="https://taler.net";>GNU Taler</a></p>
+      </div>
+      <div style="flex-grow: 1;"></div>
+      <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler 
Systems SA. <a
+          
href="https://git.taler.net/wallet-core.git/tree/?id=c64ab8c9b57d3bbe58ea2aa8e4d57c8baef7042e";
 target="_blank"
+          rel="noreferrer noopener">Version 0.9.3-dev.29 (---)</a> </p>
+    </div>
+  </footer>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/packages/challenger-ui/src/invalid-request.html 
b/packages/challenger-ui/src/invalid-request.html
new file mode 100644
index 000000000..6f3d3081a
--- /dev/null
+++ b/packages/challenger-ui/src/invalid-request.html
@@ -0,0 +1,90 @@
+<!--
+ This file is part of GNU Taler
+ (C) 2021--2022 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+
+ @author Sebastian Javier Marchano
+-->
+<!DOCTYPE html>
+<html lang="en" class="h-full">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <meta charset="utf-8" />
+  <meta name="viewport" content="width=device-width,initial-scale=1" />
+  <meta name="taler-support" content="uri">
+  <meta name="mobile-web-app-capable" content="yes" />
+  <meta name="apple-mobile-web-app-capable" content="yes" />
+  <link rel="icon"
+    
href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn
 [...]
+  <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" />
+  <link rel="stylesheet" href="main.css" />
+  <script type="module" src="main.js"></script>
+  <title>Invalid request (#{{ec}})</title>
+</head>
+
+<body class="min-h-full flex flex-col">
+  <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 
border-indigo-400">
+    <div class="flex flex-row h-16 items-center ">
+      <div class="flex px-2 justify-start">
+        <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img 
class="h-8 w-auto"
+              src="data:image/svg+xml,<?xml version=&quot;1.0&quot; 
encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?>%0A<svg 
xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 201 90&quot;>%0A 
 <g fill=&quot;%230042b3&quot; fill-rule=&quot;evenodd&quot; 
stroke-width=&quot;.3&quot;>%0A    <path d=&quot;M86.7 1.1c15.6 0 29 9.4 36 
23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 
26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43 [...]
+              alt="GNU Taler" style="height: 1.5rem; margin: 
0.5rem;"></a></div><span
+          class="flex items-center text-white text-lg font-bold 
ml-4">Challenger</span>
+      </div>
+      <div class="block flex-1 ml-6 "></div>
+      <div class="flex justify-end">
+      </div>
+    </div>
+  </header>
+
+  <main class="flex-1">
+
+    <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 items-center mt-4">
+      <div class="rounded-md bg-red-50 p-4 shadow-xl">
+        <div class="flex">
+          <div class="flex-shrink-0">
+            <svg xmlns="http://www.w3.org/2000/svg"; stroke="none" viewBox="0 0 
24 24" fill="currentColor"
+              class="w-8 h-8 text-red-400">
+              <path fill-rule="evenodd"
+                d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 
9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zM12 8.25a.75.75 0 
01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 
100-1.5.75.75 0 000 1.5z" />
+            </svg>
+          </div>
+          <div class="ml-3">
+            <h3 class="text-sm font-medium text-red-800">
+              Request error
+            </h3>
+            <div class="mt-2 text-sm text-red-700">
+              <p>{{hint}}</p>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </main>
+
+  <footer class="bottom-4 mb-4">
+    <div class="mt-8 mx-8 md:order-1 md:mt-0">
+      <div>
+        <p class="text-xs leading-5 text-gray-400">Learn more about <a 
target="_blank" rel="noreferrer noopener"
+            class="font-semibold text-gray-500 hover:text-gray-400" 
href="https://taler.net";>GNU Taler</a></p>
+      </div>
+      <div style="flex-grow: 1;"></div>
+      <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler 
Systems SA. <a
+          
href="https://git.taler.net/wallet-core.git/tree/?id=c64ab8c9b57d3bbe58ea2aa8e4d57c8baef7042e";
 target="_blank"
+          rel="noreferrer noopener">Version 0.9.3-dev.29 (---)</a> </p>
+    </div>
+  </footer>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/packages/challenger-ui/src/main.js 
b/packages/challenger-ui/src/main.js
new file mode 100644
index 000000000..3272bd0bb
--- /dev/null
+++ b/packages/challenger-ui/src/main.js
@@ -0,0 +1,2 @@
+// intentionally empty
+import "./scss/main.css";
\ No newline at end of file
diff --git a/packages/challenger-ui/src/scss/main.css 
b/packages/challenger-ui/src/scss/main.css
new file mode 100644
index 000000000..b5c61c956
--- /dev/null
+++ b/packages/challenger-ui/src/scss/main.css
@@ -0,0 +1,3 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
diff --git a/packages/challenger-ui/src/validation-unknown.html 
b/packages/challenger-ui/src/validation-unknown.html
new file mode 100644
index 000000000..88e24f4ab
--- /dev/null
+++ b/packages/challenger-ui/src/validation-unknown.html
@@ -0,0 +1,91 @@
+<!--
+ This file is part of GNU Taler
+ (C) 2021--2022 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+
+ @author Sebastian Javier Marchano
+-->
+<!DOCTYPE html>
+<html lang="en" class="h-full">
+
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <meta charset="utf-8" />
+  <meta name="viewport" content="width=device-width,initial-scale=1" />
+  <meta name="taler-support" content="uri">
+  <meta name="mobile-web-app-capable" content="yes" />
+  <meta name="apple-mobile-web-app-capable" content="yes" />
+  <link rel="icon"
+    
href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn
 [...]
+  <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" />
+  <link rel="stylesheet" href="main.css" />
+  <script type="module" src="main.js"></script>
+  <title>Validation process unknown (#{{ec}})</title>
+</head>
+
+<body class="min-h-full flex flex-col">
+  <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 
border-indigo-400">
+    <div class="flex flex-row h-16 items-center ">
+      <div class="flex px-2 justify-start">
+        <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img 
class="h-8 w-auto"
+              src="data:image/svg+xml,<?xml version=&quot;1.0&quot; 
encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?>%0A<svg 
xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 201 90&quot;>%0A 
 <g fill=&quot;%230042b3&quot; fill-rule=&quot;evenodd&quot; 
stroke-width=&quot;.3&quot;>%0A    <path d=&quot;M86.7 1.1c15.6 0 29 9.4 36 
23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 
26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43 [...]
+              alt="GNU Taler" style="height: 1.5rem; margin: 
0.5rem;"></a></div><span
+          class="flex items-center text-white text-lg font-bold 
ml-4">Challenger</span>
+      </div>
+      <div class="block flex-1 ml-6 "></div>
+      <div class="flex justify-end">
+      </div>
+    </div>
+  </header>
+
+  <main class="flex-1">
+
+    <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 items-center mt-4">
+      <div class="rounded-md bg-red-50 p-4 shadow-xl">
+        <div class="flex">
+          <div class="flex-shrink-0">
+            <svg xmlns="http://www.w3.org/2000/svg"; stroke="none" viewBox="0 0 
24 24" fill="currentColor"
+              class="w-8 h-8 text-red-400">
+              <path fill-rule="evenodd"
+                d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 
9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zM12 8.25a.75.75 0 
01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 
100-1.5.75.75 0 000 1.5z" />
+            </svg>
+          </div>
+          <div class="ml-3">
+            <h3 class="text-sm font-medium text-red-800">
+              Validation error
+            </h3>
+            <div class="mt-2 text-sm text-red-700">
+              <p>{{hint}}</p>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+  </main>
+
+  <footer class="bottom-4 mb-4">
+    <div class="mt-8 mx-8 md:order-1 md:mt-0">
+      <div>
+        <p class="text-xs leading-5 text-gray-400">Learn more about <a 
target="_blank" rel="noreferrer noopener"
+            class="font-semibold text-gray-500 hover:text-gray-400" 
href="https://taler.net";>GNU Taler</a></p>
+      </div>
+      <div style="flex-grow: 1;"></div>
+      <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler 
Systems SA. <a
+          
href="https://git.taler.net/wallet-core.git/tree/?id=c64ab8c9b57d3bbe58ea2aa8e4d57c8baef7042e";
 target="_blank"
+          rel="noreferrer noopener">Version 0.9.3-dev.29 (---)</a> </p>
+    </div>
+  </footer>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/packages/challenger-ui/tailwind.config.js 
b/packages/challenger-ui/tailwind.config.js
new file mode 100644
index 000000000..ec51dfbb8
--- /dev/null
+++ b/packages/challenger-ui/tailwind.config.js
@@ -0,0 +1,14 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+  content: {
+    relative: true,
+    files: [
+      "./src/**/*.{html,tsx}",
+      "./node_modules/@gnu-taler/web-util/src/**/*.{html,tsx}"
+    ],
+  },
+  theme: {
+    extend: {},
+  },
+  plugins: [require("@tailwindcss/typography"), require("@tailwindcss/forms")],
+};
diff --git a/packages/web-util/src/index.build.ts 
b/packages/web-util/src/index.build.ts
index 0e8e7cec3..e2851dc3a 100644
--- a/packages/web-util/src/index.build.ts
+++ b/packages/web-util/src/index.build.ts
@@ -235,9 +235,9 @@ export function computeConfig(params: BuildParams): 
esbuild.BuildOptions {
     );
   }
 
-  if (!params.source.js) {
-    throw Error(`no javascript entry points, nothing to compile?`);
-  }
+  // if (!params.source.js) {
+  //   throw Error(`no javascript entry points, nothing to compile?`);
+  // }
   if (!params.destination) {
     throw Error(`missing destination folder`);
   }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 392f34981..987d02733 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,4 +1,4 @@
-lockfileVersion: '6.0'
+lockfileVersion: '6.1'
 
 settings:
   autoInstallPeers: true
@@ -223,6 +223,39 @@ importers:
         specifier: ^5.2.2
         version: 5.2.2
 
+  packages/challenger-ui:
+    devDependencies:
+      '@gnu-taler/pogen':
+        specifier: ^0.0.5
+        version: link:../pogen
+      '@gnu-taler/web-util':
+        specifier: workspace:*
+        version: link:../web-util
+      '@tailwindcss/forms':
+        specifier: ^0.5.3
+        version: 0.5.3(tailwindcss@3.3.2)
+      '@tailwindcss/typography':
+        specifier: ^0.5.9
+        version: 0.5.9(tailwindcss@3.3.2)
+      autoprefixer:
+        specifier: ^10.4.14
+        version: 10.4.14(postcss@8.4.23)
+      esbuild:
+        specifier: ^0.17.7
+        version: 0.17.19
+      po2json:
+        specifier: ^0.4.5
+        version: 0.4.5
+      postcss:
+        specifier: ^8.4.23
+        version: 8.4.23
+      postcss-cli:
+        specifier: ^10.1.0
+        version: 10.1.0(postcss@8.4.23)
+      tailwindcss:
+        specifier: ^3.3.2
+        version: 3.3.2
+
   packages/demobank-ui:
     dependencies:
       '@gnu-taler/taler-util':
@@ -1197,32 +1230,6 @@ packages:
       semver: 6.3.0
     dev: true
 
-  /@babel/helper-compilation-targets@7.19.3(@babel/core@7.18.9):
-    resolution: {integrity: 
sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/compat-data': 7.19.4
-      '@babel/core': 7.18.9
-      '@babel/helper-validator-option': 7.21.0
-      browserslist: 4.21.5
-      semver: 6.3.0
-    dev: true
-
-  /@babel/helper-compilation-targets@7.19.3(@babel/core@7.22.1):
-    resolution: {integrity: 
sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/compat-data': 7.19.4
-      '@babel/core': 7.22.1
-      '@babel/helper-validator-option': 7.21.0
-      browserslist: 4.21.5
-      semver: 6.3.0
-    dev: true
-
   /@babel/helper-compilation-targets@7.21.5(@babel/core@7.18.9):
     resolution: {integrity: 
sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==}
     engines: {node: '>=6.9.0'}
@@ -2067,7 +2074,7 @@ packages:
     dependencies:
       '@babel/compat-data': 7.19.4
       '@babel/core': 7.18.9
-      '@babel/helper-compilation-targets': 7.19.3(@babel/core@7.18.9)
+      '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.18.9)
       '@babel/helper-plugin-utils': 7.21.5
       '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.18.9)
       '@babel/plugin-transform-parameters': 7.18.8(@babel/core@7.18.9)
@@ -2081,7 +2088,7 @@ packages:
     dependencies:
       '@babel/compat-data': 7.19.4
       '@babel/core': 7.22.1
-      '@babel/helper-compilation-targets': 7.19.3(@babel/core@7.22.1)
+      '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1)
       '@babel/helper-plugin-utils': 7.21.5
       '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.1)
       '@babel/plugin-transform-parameters': 7.18.8(@babel/core@7.22.1)
@@ -3887,7 +3894,7 @@ packages:
     dependencies:
       '@babel/compat-data': 7.19.4
       '@babel/core': 7.18.9
-      '@babel/helper-compilation-targets': 7.21.5(@babel/core@7.18.9)
+      '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.18.9)
       '@babel/helper-plugin-utils': 7.21.5
       '@babel/helper-validator-option': 7.21.0
       
'@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression':
 7.18.6(@babel/core@7.18.9)
@@ -9277,6 +9284,7 @@ packages:
   /esbuild@0.17.19:
     resolution: {integrity: 
sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==}
     engines: {node: '>=12'}
+    hasBin: true
     requiresBuild: true
     optionalDependencies:
       '@esbuild/android-arm': 0.17.19
@@ -10263,6 +10271,7 @@ packages:
       glob-parent: 5.1.2
       merge2: 1.4.1
       micromatch: 4.0.5
+    dev: true
 
   /fast-glob@3.2.7:
     resolution: {integrity: 
sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==}
@@ -10284,7 +10293,6 @@ packages:
       glob-parent: 5.1.2
       merge2: 1.4.1
       micromatch: 4.0.5
-    dev: true
 
   /fast-json-stable-stringify@2.1.0:
     resolution: {integrity: 
sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
@@ -10527,12 +10535,12 @@ packages:
       vue-template-compiler:
         optional: true
     dependencies:
-      '@babel/code-frame': 7.18.6
+      '@babel/code-frame': 7.21.4
       chalk: 2.4.2
       eslint: 8.29.0
       micromatch: 3.1.10
       minimatch: 3.1.2
-      semver: 5.7.1
+      semver: 5.7.2
       tapable: 1.1.3
       typescript: 4.6.4
       webpack: 4.46.0
@@ -10607,7 +10615,7 @@ packages:
     resolution: {integrity: 
sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==}
     engines: {node: '>=14.14'}
     dependencies:
-      graceful-fs: 4.2.10
+      graceful-fs: 4.2.11
       jsonfile: 6.1.0
       universalify: 2.0.0
     dev: true
@@ -12090,6 +12098,7 @@ packages:
 
   /json5@0.5.1:
     resolution: {integrity: 
sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==}
+    hasBin: true
     dev: true
 
   /json5@1.0.1:
@@ -12813,6 +12822,7 @@ packages:
   /mocha@9.2.2:
     resolution: {integrity: 
sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==}
     engines: {node: '>= 12.0.0'}
+    hasBin: true
     dependencies:
       '@ungap/promise-all-settled': 1.1.2
       ansi-colors: 4.1.1
@@ -13778,6 +13788,7 @@ packages:
   /po2json@0.4.5:
     resolution: {integrity: 
sha512-JH0hgi1fC0t9UvdiyS7kcVly0N1WNey4R2YZ/jPaxQKYm6Cfej7ZTgiEy8LP2JwoEhONceiNS8JH5mWPQkiXeA==}
     engines: {node: '>= 0.8.0'}
+    hasBin: true
     dependencies:
       gettext-parser: 1.1.0
       nomnom: 1.8.1
@@ -13824,7 +13835,7 @@ packages:
       dependency-graph: 0.11.0
       fs-extra: 11.1.1
       get-stdin: 9.0.0
-      globby: 13.1.2
+      globby: 13.2.2
       picocolors: 1.0.0
       postcss: 8.4.23
       postcss-load-config: 4.0.1(postcss@8.4.23)
@@ -13832,7 +13843,7 @@ packages:
       pretty-hrtime: 1.0.3
       read-cache: 1.0.0
       slash: 5.0.1
-      yargs: 17.6.0
+      yargs: 17.7.2
     transitivePeerDependencies:
       - ts-node
     dev: true
@@ -15545,11 +15556,6 @@ packages:
       semver: 6.3.0
     dev: true
 
-  /semver@5.7.1:
-    resolution: {integrity: 
sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
-    hasBin: true
-    dev: true
-
   /semver@5.7.2:
     resolution: {integrity: 
sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
     hasBin: true
@@ -16269,7 +16275,7 @@ packages:
     engines: {node: '>=8'}
     hasBin: true
     dependencies:
-      '@jridgewell/gen-mapping': 0.3.2
+      '@jridgewell/gen-mapping': 0.3.3
       commander: 4.1.1
       glob: 7.1.6
       lines-and-columns: 1.2.4
@@ -16387,7 +16393,7 @@ packages:
       chokidar: 3.5.3
       didyoumean: 1.2.2
       dlv: 1.1.3
-      fast-glob: 3.2.12
+      fast-glob: 3.3.1
       glob-parent: 6.0.2
       is-glob: 4.0.3
       jiti: 1.18.2
@@ -17343,7 +17349,7 @@ packages:
       connect-history-api-fallback: 2.0.0
       default-gateway: 6.0.3
       express: 4.18.2
-      graceful-fs: 4.2.10
+      graceful-fs: 4.2.11
       html-entities: 2.3.3
       http-proxy-middleware: 2.0.6(@types/express@4.17.14)
       ipaddr.js: 2.0.1
@@ -17516,6 +17522,7 @@ packages:
 
   /which@1.3.1:
     resolution: {integrity: 
sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+    hasBin: true
     dependencies:
       isexe: 2.0.0
     dev: true

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]