iobroker.time-tracker 0.7.12 → 0.7.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  [![NPM](https://nodei.co/npm/iobroker.time-tracker.png?downloads=true)](https://nodei.co/npm/iobroker.time-tracker/)
10
10
 
11
- **Tests:** ![Test and Release](https://github.com/sadam6752-tech/ioBroker.time-tracker/workflows/Test%20and%20Release/badge.svg)
11
+ ![Test and Release](https://github.com/sadam6752-tech/ioBroker.time-tracker/workflows/Test%20and%20Release/badge.svg)
12
12
 
13
13
  A punch clock for ioBroker. Employees clock in and out, the adapter calculates target time and balance, absences and
14
14
  vacation are managed, and the monthly statement is downloaded as PDF or Excel. Everything runs in the browser —
@@ -265,12 +265,15 @@ adapter itself. `storage` is a **mount point**: an object of type `meta` the fil
265
265
  ioBroker writes below. Only through that object does the file manager know the folder — the instance namespace itself
266
266
  is no mount point, and a write below it is refused (the background stands in D11). The object is created on every
267
267
  start, so the folder shows up from the first start on, before the first calendar was written. The `ical` adapter points
268
- at the **path** from `calendar.feedFile`.
269
-
270
- The file server of a `web` instance is **not** a promised way to that file yet: while the file came from `fs`, the
271
- server answered with an empty archive. Whether a `web` instance hands it out now is the open acceptance case **T28** in
272
- [`docs/testplan.md`](docs/testplan.md). Until it is answered, a browser, a calendar app or a script uses
273
- `calendar.feedUrl`, the link with the instance token — the background stands in D11 of
268
+ at the **path** from `calendar.feedFile`. The file manager of the admin UI (`Objects` → `files`) shows the folder
269
+ `time-tracker.<n>` with `storage` inside and downloads the file — that is confirmed on a real installation (acceptance
270
+ case **T28** in [`docs/testplan.md`](docs/testplan.md), passed with 0.7.12).
271
+
272
+ The file server of a `web` instance delivers that file as well — below the **mount point** the link works
273
+ (`http://<host>:8081/files/time-tracker.0/storage/calendar.ics`, checked on a real installation: the download gives
274
+ the `VCALENDAR` file). The former path without `storage` (`…/files/time-tracker/calendar.ics`) answers with an empty
275
+ archive and therefore stays out of this file. So a browser, a calendar app or a script uses either `calendar.feedUrl`
276
+ (the link with the instance token) or the file server link above — the background stands in D11 of
274
277
  [`docs/entscheidungen.md`](docs/entscheidungen.md).
275
278
 
276
279
  The window is a year back and to the end of next year. The link of the **company** only exists after somebody asked
@@ -426,6 +429,14 @@ local SQLite file, access is role-based, and every correction is written to an a
426
429
 
427
430
  ### **WORK IN PROGRESS**
428
431
 
432
+ ### 0.7.13 (2026-09-27)
433
+
434
+ - (Alex) docs: the file server of a `web` instance is a documented way to the calendar file again — under the new mount
435
+ point the server hands the file out (`http://<host>:8081/files/time-tracker.0/storage/calendar.ics`, checked on a real
436
+ installation); only the former path without `storage` still answers with an empty archive. The protocol in
437
+ `docs/testplan.md` is complete now (T1–T17 were carried over afterwards, T28 stands last), the test badge at the top
438
+ of this file carries no label any more, and the background of the path sits in D11 of `docs/entscheidungen.md`
439
+
429
440
  ### 0.7.12 (2026-09-27)
430
441
 
431
442
  - (Alex) fix: the calendar file hangs on a **mount point** now (`files/time-tracker.<n>/storage/calendar.ics`). 0.7.11
@@ -456,24 +467,6 @@ local SQLite file, access is role-based, and every correction is written to an a
456
467
  - (Alex) fix: “Abbrechen” closes the form of an absence while it is being changed as well — it cleared only the flag of
457
468
  the new absence and left the dialog of the change on the screen
458
469
 
459
- ### 0.7.8 (2026-09-26)
460
-
461
- - (Alex) new: an absence can be taken back. An employee withdraws a request that is still open, and for an approved
462
- absence he asks for the cancellation and names a reason — the days keep counting until the administration answers.
463
- It accepts the request (the absence is deleted) or declines it, and the employee can take his request back as well
464
- - (Alex) new: the administration changes and deletes absences in the app. “Ändern” opens the dates of an existing
465
- absence (the employee belongs to it and stays), “Löschen” asks once and removes the row — the same button that
466
- accepts a cancellation request
467
- - (Alex) change: the rules show their newest run in their own row, so a rule that fell silent is visible at a glance.
468
- The list of the last runs below the table is gone, and a hint beside “Save rules” says that the table is saved as a
469
- whole
470
- - (Alex) fix: a rule that runs on every day no longer prints “once a day” twice in its row
471
- - (Alex) docs: the two `iobroker.live` badges are gone from the top of this file — they belong to an entry in the
472
- official repository, which does not exist yet, and showed a broken picture; a licence badge stands in their place
473
- - (Alex) docs: the calendar file is described as what it is — the **path** for the `ical` adapter
474
- (`calendar.feedFile`). The file server of a `web` instance does not deliver it (that public area answers with an
475
- empty archive), so a browser, a calendar app or a script uses the token link `calendar.feedUrl`.
476
-
477
470
  Older entries are kept in [`CHANGELOG_OLD.md`](CHANGELOG_OLD.md).
478
471
 
479
472
  ## Provenance
package/io-package.json CHANGED
@@ -1,9 +1,22 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "time-tracker",
4
- "version": "0.7.12",
4
+ "version": "0.7.13",
5
5
  "nogit": true,
6
6
  "news": {
7
+ "0.7.13": {
8
+ "en": "docs: the calendar file is reachable through the file server of a `web` instance again — `http://<host>:8081/files/time-tracker.0/storage/calendar.ics` (checked on a real installation, the `storage` folder belongs to the path); the acceptance protocol `docs/testplan.md` is complete.",
9
+ "de": "docs: Die Kalenderdatei ist über den Dateiserver einer `web`-Instanz wieder erreichbar — `http://<host>:8081/files/time-tracker.0/storage/calendar.ics` (in einer echten Installation geprüft, der Ordner `storage` gehört zum Pfad). Das Abnahmeprotokoll `docs/testplan.md` ist vollständig.",
10
+ "ru": "docs: файл календаря снова доступен через файловый сервер экземпляра `web` — `http://<host>:8081/files/time-tracker.0/storage/calendar.ics` (проверено на реальной установке, папка `storage` входит в путь). Протокол приёмки `docs/testplan.md` заполнен полностью.",
11
+ "pt": "docs: o ficheiro de calendário volta a estar acessível através do servidor de ficheiros de uma instância `web` — `http://<host>:8081/files/time-tracker.0/storage/calendar.ics` (verificado numa instalação real, a pasta `storage` faz parte do caminho). O protocolo de aceitação `docs/testplan.md` está completo.",
12
+ "nl": "docs: het kalenderbestand is weer bereikbaar via de bestandsserver van een `web`-instantie — `http://<host>:8081/files/time-tracker.0/storage/calendar.ics` (gecontroleerd op een echte installatie, de map `storage` hoort bij het pad). Het acceptatieprotocol `docs/testplan.md` is compleet.",
13
+ "fr": "docs : le fichier de calendrier est de nouveau accessible via le serveur de fichiers d'une instance `web` — `http://<host>:8081/files/time-tracker.0/storage/calendar.ics` (vérifié sur une installation réelle, le dossier `storage` fait partie du chemin). Le protocole de recette `docs/testplan.md` est complet.",
14
+ "it": "docs: il file del calendario è di nuovo raggiungibile tramite il file server di un'istanza `web` — `http://<host>:8081/files/time-tracker.0/storage/calendar.ics` (verificato su un'installazione reale, la cartella `storage` fa parte del percorso). Il protocollo di collaudo `docs/testplan.md` è completo.",
15
+ "es": "docs: el archivo de calendario vuelve a estar disponible a través del servidor de archivos de una instancia `web` — `http://<host>:8081/files/time-tracker.0/storage/calendar.ics` (comprobado en una instalación real, la carpeta `storage` forma parte de la ruta). El protocolo de aceptación `docs/testplan.md` está completo.",
16
+ "pl": "docs: plik kalendarza jest znowu dostępny przez serwer plików instancji `web` — `http://<host>:8081/files/time-tracker.0/storage/calendar.ics` (sprawdzone na prawdziwej instalacji, folder `storage` jest częścią ścieżki). Protokół odbioru `docs/testplan.md` jest kompletny.",
17
+ "uk": "docs: файл календаря знову доступний через файловий сервер екземпляра `web` — `http://<host>:8081/files/time-tracker.0/storage/calendar.ics` (перевірено на реальній інсталяції, тека `storage` входить до шляху). Протокол приймання `docs/testplan.md` заповнено повністю.",
18
+ "zh-cn": "docs:日历文件重新可以通过 `web` 实例的文件服务器访问——`http://<host>:8081/files/time-tracker.0/storage/calendar.ics`(已在真实安装中验证,`storage` 文件夹属于路径的一部分)。`docs/testplan.md` 的验收记录已完整。"
19
+ },
7
20
  "0.7.12": {
8
21
  "en": "fix: the calendar file hangs on a mount point now — `files/time-tracker.<n>/storage/calendar.ics`. 0.7.11 wrote it directly below the instance namespace; the objects database refuses that with `is not an object of type meta`, so no file was written and the folder stayed invisible in the file manager.",
9
22
  "de": "fix: Die Kalenderdatei hängt jetzt an einem Ablagepunkt — `files/time-tracker.<n>/storage/calendar.ics`. 0.7.11 schrieb sie direkt unter den Instanz-Namensraum; die Objektdatenbank weist das mit `is not an object of type meta` ab, deshalb entstand keine Datei und der Ordner blieb im Dateimanager unsichtbar.",
@@ -81,19 +94,6 @@
81
94
  "pl": "zmiana: w oknie reguły „Aktiv” pozostaje obok „Wiederholung”, a pola ważności „Gültig ab” i „Gültig bis” stoją w osobnym wierszu pod nim — dwa pola daty nie opływają już przycisku.",
82
95
  "uk": "зміна: у вікні правила «Aktiv» залишається поруч із «Wiederholung», а поля терміну дії «Gültig ab» і «Gültig bis» стоять в окремому рядку під ним — два поля дати більше не обтікають кнопку.",
83
96
  "zh-cn": "变更:规则对话框中“Aktiv”仍与“Wiederholung”同一行,而有效期字段“Gültig ab”和“Gültig bis”单独位于下一行——两个日期字段不再围绕按钮换行。"
84
- },
85
- "0.7.6": {
86
- "en": "new: an automatic rule can be limited to a period. The rule dialog knows “Valid from” and “Valid until” as dates — an empty field means “from now on” or “without an end” — and the adapter compares the period with the local calendar day of the employee, exactly like the weekdays: a holiday stand-in, a seasonal worker or a project phase therefore ends by itself. An expired period is not an error and the rule still fires at most once per period; the list of the last runs below the rules now shows the five most recent entries.",
87
- "de": "neu: Eine Automatikregel kann auf einen Zeitraum begrenzt werden. Der Regel-Dialog kennt „Gültig ab“ und „Gültig bis“ als Datum – ein leeres Feld bedeutet „ab sofort“ bzw. „unbegrenzt“ – und der Adapter vergleicht den Zeitraum mit dem lokalen Kalendertag des Mitarbeiters, genau wie die Wochentage: eine Ferienvertretung, eine Saisonkraft oder ein Projektzeitraum endet damit von selbst. Ein abgelaufener Zeitraum ist kein Fehler, und die Regel feuert weiterhin höchstens einmal pro Zeitraum; die Liste der letzten Ausführungen zeigt jetzt die fünf jüngsten Einträge.",
88
- "ru": "новинка: автоматическое правило можно ограничить периодом. В диалоге правила есть «действует с» и «действует до» в виде даты — пустое поле означает «с текущего момента» или «без ограничения» — а адаптер сравнивает период с локальным календарным днём сотрудника, так же как дни недели: замена на время отпуска, сезонный работник или фаза проекта заканчиваются сами. Истёкший период — не ошибка, и правило по-прежнему срабатывает не чаще одного раза за период; список последних запусков теперь показывает пять последних записей.",
89
- "pt": "novidade: uma regra automática pode ser limitada a um período. O diálogo da regra conhece «válido a partir de» e «válido até» como datas — um campo vazio significa «a partir de agora» ou «sem fim» — e o adaptador compara o período com o dia de calendário local do funcionário, tal como os dias da semana: uma substituição de férias, um trabalhador sazonal ou uma fase de projeto terminam sozinhos. Um período expirado não é um erro e a regra continua a disparar no máximo uma vez por período; a lista dos últimos disparos mostra agora as cinco entradas mais recentes.",
90
- "nl": "nieuw: een automatische regel kan tot een periode beperkt worden. Het regeldialoog kent ‘geldig vanaf’ en ‘geldig tot’ als datum — een leeg veld betekent ‘vanaf nu’ of ‘zonder einde’ — en de adapter vergelijkt de periode met de lokale kalenderdag van de medewerker, net als de weekdagen: een vakantievervanger, een seizoenskracht of een projectfase eindigt daardoor vanzelf. Een verlopen periode is geen fout en de regel vuurt nog steeds hoogstens één keer per periode; de lijst met de laatste uitvoeringen toont nu de vijf nieuwste regels.",
91
- "fr": "nouveauté : une règle automatique peut être limitée à une période. La boîte de dialogue connaît « valable à partir du » et « valable jusqu'au » sous forme de dates — un champ vide signifie « à partir de maintenant » ou « sans fin » — et l'adaptateur compare la période avec le jour calendaire local du collaborateur, exactement comme les jours de la semaine : un remplacement pendant les vacances, un saisonnier ou une phase de projet se terminent donc d'eux-mêmes. Une période expirée n'est pas une erreur et la règle ne se déclenche toujours qu'une fois par période ; la liste des derniers déclenchements affiche désormais les cinq entrées les plus récentes.",
92
- "it": "novità: una regola automatica può essere limitata a un periodo. La finestra della regola conosce «valido dal» e «valido fino al» come date — un campo vuoto significa «da subito» o «senza fine» — e l'adattatore confronta il periodo con il giorno di calendario locale del dipendente, esattamente come i giorni della settimana: una sostituzione per le ferie, un lavoratore stagionale o una fase di progetto terminano quindi da soli. Un periodo scaduto non è un errore e la regola scatta comunque al massimo una volta per periodo; l'elenco delle ultime esecuzioni mostra ora le cinque voci più recenti.",
93
- "es": "novedad: una regla automática puede limitarse a un periodo. El diálogo de la regla conoce «válido desde» y «válido hasta» como fechas — un campo vacío significa «desde ahora» o «sin límite» — y el adaptador compara el periodo con el día natural local del empleado, igual que los días de la semana: una sustitución de vacaciones, un trabajador de temporada o una fase de proyecto terminan solos. Un periodo caducado no es un error y la regla sigue disparándose como máximo una vez por periodo; la lista de las últimas ejecuciones muestra ahora las cinco entradas más recientes.",
94
- "pl": "nowość: regułę automatyczną można ograniczyć do okresu. Okno reguły zna „obowiązuje od” i „obowiązuje do” jako daty — puste pole oznacza „od teraz” lub „bez końca” — a adapter porównuje okres z lokalnym dniem kalendarzowym pracownika, tak samo jak dni tygodnia: zastępstwo na czas urlopu, pracownik sezonowy czy etap projektu kończą się więc same. Wygasły okres nie jest błędem, a reguła nadal uruchamia się najwyżej raz na okres; lista ostatnich uruchomień pokazuje teraz pięć najnowszych wpisów.",
95
- "uk": "новинка: автоматичне правило можна обмежити періодом. У вікні правила є «діє з» і «діє до» у вигляді дати — порожнє поле означає «з цього моменту» або «без обмеження» — а адаптер порівнює період із локальним календарним днем співробітника, так само як дні тижня: заміна на час відпустки, сезонний працівник чи етап проєкту завершуються самі. Прострочений період не є помилкою, і правило, як і раніше, спрацьовує не частіше одного разу за період; список останніх запусків тепер показує п'ять найновіших записів.",
96
- "zh-cn": "新增:自动规则可以限定到一个时间段。规则对话框中可以填写“生效日期”和“结束日期”——留空表示“立即生效”或“不设结束”——适配器会将该时间段与员工的本地日历日期比较,与星期几的处理方式完全一致:假期顶班、季节性员工或项目阶段因此会自动结束。时间段过期不是错误,规则仍然每个时间段最多执行一次;规则下方的“最近执行”列表现在只显示最近五条记录。"
97
97
  }
98
98
  },
99
99
  "titleLang": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.time-tracker",
3
- "version": "0.7.12",
3
+ "version": "0.7.13",
4
4
  "description": "Time tracking (clock-in/out) for ioBroker with web app, badge terminal and reports",
5
5
  "author": {
6
6
  "name": "Alex",
package/www/sw.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sw.js","sources":["../../../../../../tmp/c4384cf2dd0e058a507a7ab40dfde093/sw.js"],"sourcesContent":["import {clientsClaim as workbox_core_clientsClaim} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-www/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-www/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-www/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';\nimport {registerRoute as workbox_routing_registerRoute} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-www/node_modules/workbox-routing/registerRoute.mjs';\nimport {NavigationRoute as workbox_routing_NavigationRoute} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-www/node_modules/workbox-routing/NavigationRoute.mjs';\nimport {createHandlerBoundToURL as workbox_precaching_createHandlerBoundToURL} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-www/node_modules/workbox-precaching/createHandlerBoundToURL.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\nself.skipWaiting();\nworkbox_core_clientsClaim();\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"person.png\",\n \"revision\": \"771d3283ece4739e203e02aac535855e\"\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"6d2083467c5cde28f5f7b04204705994\"\n },\n {\n \"url\": \"icon-512.png\",\n \"revision\": \"d8e3715779f4cd7e67e1f82f215a2f22\"\n },\n {\n \"url\": \"icon-192.png\",\n \"revision\": \"940ef37caef09c52272ddab844b9ea9b\"\n },\n {\n \"url\": \"favicon.svg\",\n \"revision\": \"309e9efece69d60920618512ab9d57bf\"\n },\n {\n \"url\": \"assets/workbox-window.prod.es5-Bd17z0YL.js\",\n \"revision\": null\n },\n {\n \"url\": \"assets/index-D5c1Xz-S.js\",\n \"revision\": null\n },\n {\n \"url\": \"icon-192.png\",\n \"revision\": \"940ef37caef09c52272ddab844b9ea9b\"\n },\n {\n \"url\": \"icon-512.png\",\n \"revision\": \"d8e3715779f4cd7e67e1f82f215a2f22\"\n },\n {\n \"url\": \"manifest.webmanifest\",\n \"revision\": \"6f40f1ce0ce138d5af307fb0dbb1e6f9\"\n }\n], {});\nworkbox_precaching_cleanupOutdatedCaches();workbox_routing_registerRoute(new workbox_routing_NavigationRoute(workbox_precaching_createHandlerBoundToURL(\"index.html\"), {\n allowlist: [/^\\/$/], denylist: [/^\\/api\\//],}));\n\n\n"],"names":["self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","url","revision","workbox_precaching_cleanupOutdatedCaches","workbox_routing_registerRoute","workbox_routing_NavigationRoute","workbox_precaching_createHandlerBoundToURL","allowlist","denylist"],"mappings":"inBAoBAA,KAAKC,cACLC,EAAAA,eAMAC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,MAEd,CACED,IAAO,2BACPC,SAAY,MAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,qCAEb,CAAA,GACHC,EAAAA,wBAA2CC,EAAAA,cAA8B,IAAIC,EAAAA,gBAAgCC,0BAA2C,cAAe,CACrKC,UAAW,CAAC,QAAUC,SAAU,CAAC"}
1
+ {"version":3,"file":"sw.js","sources":["../../../../../../tmp/15dd5b033d40e22ced31a70c13952255/sw.js"],"sourcesContent":["import {clientsClaim as workbox_core_clientsClaim} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-www/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-www/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-www/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';\nimport {registerRoute as workbox_routing_registerRoute} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-www/node_modules/workbox-routing/registerRoute.mjs';\nimport {NavigationRoute as workbox_routing_NavigationRoute} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-www/node_modules/workbox-routing/NavigationRoute.mjs';\nimport {createHandlerBoundToURL as workbox_precaching_createHandlerBoundToURL} from '/home/runner/work/ioBroker.time-tracker/ioBroker.time-tracker/src-www/node_modules/workbox-precaching/createHandlerBoundToURL.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\nself.skipWaiting();\nworkbox_core_clientsClaim();\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"person.png\",\n \"revision\": \"771d3283ece4739e203e02aac535855e\"\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"6d2083467c5cde28f5f7b04204705994\"\n },\n {\n \"url\": \"icon-512.png\",\n \"revision\": \"d8e3715779f4cd7e67e1f82f215a2f22\"\n },\n {\n \"url\": \"icon-192.png\",\n \"revision\": \"940ef37caef09c52272ddab844b9ea9b\"\n },\n {\n \"url\": \"favicon.svg\",\n \"revision\": \"309e9efece69d60920618512ab9d57bf\"\n },\n {\n \"url\": \"assets/workbox-window.prod.es5-Bd17z0YL.js\",\n \"revision\": null\n },\n {\n \"url\": \"assets/index-D5c1Xz-S.js\",\n \"revision\": null\n },\n {\n \"url\": \"icon-192.png\",\n \"revision\": \"940ef37caef09c52272ddab844b9ea9b\"\n },\n {\n \"url\": \"icon-512.png\",\n \"revision\": \"d8e3715779f4cd7e67e1f82f215a2f22\"\n },\n {\n \"url\": \"manifest.webmanifest\",\n \"revision\": \"6f40f1ce0ce138d5af307fb0dbb1e6f9\"\n }\n], {});\nworkbox_precaching_cleanupOutdatedCaches();workbox_routing_registerRoute(new workbox_routing_NavigationRoute(workbox_precaching_createHandlerBoundToURL(\"index.html\"), {\n allowlist: [/^\\/$/], denylist: [/^\\/api\\//],}));\n\n\n"],"names":["self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","url","revision","workbox_precaching_cleanupOutdatedCaches","workbox_routing_registerRoute","workbox_routing_NavigationRoute","workbox_precaching_createHandlerBoundToURL","allowlist","denylist"],"mappings":"inBAoBAA,KAAKC,cACLC,EAAAA,eAMAC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,aACPC,SAAY,oCAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,MAEd,CACED,IAAO,2BACPC,SAAY,MAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,uBACPC,SAAY,qCAEb,CAAA,GACHC,EAAAA,wBAA2CC,EAAAA,cAA8B,IAAIC,EAAAA,gBAAgCC,0BAA2C,cAAe,CACrKC,UAAW,CAAC,QAAUC,SAAU,CAAC"}