From 960cca3dae91b591e8fb7428b65647d6af07af50 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Sun, 4 Oct 2026 18:21:43 +0200 Subject: [PATCH] Der Abschnitt verschwand alle drei Sekunden und kam wieder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `laden()` setzte `innerHTML = ''` und baute die Mediathekenliste neu — während eines Scans alle drei Sekunden. Der ganze Abschnitt flackerte sichtbar, und wer gerade auf einen Knopf zielte, klickte ins Leere. Schlimmer: jeder Neuaufbau startete über `verfolgen(false)` einen weiteren Takt. Nach einer Minute liefen zwanzig davon nebeneinander. Jetzt wird fortgeschrieben statt neu gezeichnet: eine Zeile je Mediathek, die bleibt, und nur Kopfzeile, Prüfungsknopf und Freigabeknopf ändern sich. Belegt im Browser — nach einem Auffrischen sind es dieselben Knoten, nur die Beschriftung ist eine andere. Dieselbe Behandlung für die Seitenleiste. Und weil Seitenleiste und Verwaltung getrennt nachfragten, zeigten sie zwei Momente — 95 hier, 84 dort, während im Hintergrund Doppelte zusammengelegt wurden. Die Verwaltung reicht ihren Stand jetzt weiter: ein Abruf, zwei Anzeigen. Dazu zwei Dinge, die beim Prüfen auffielen. Zurücksetzen und Entfernen prallen jetzt serverseitig mit 409 ab, solange ein Lauf läuft — die Oberfläche sperrt die Knöpfe, aber darauf darf sich der Server nicht verlassen; ein Aufruf von Hand während eines Scans liess den Lauf an einer DbUpdateConcurrencyException sterben. Und in der Fortschrittszeile steht beim Holen der Folgenmetadaten jetzt der Serienname: „Folge 2×13" allein sagt bei 3815 Folgen nichts. Co-Authored-By: Claude Opus 5 --- Flaro/AppIcon.icon/Assets/flare (1).svg | 1 + Flaro/AppIcon.icon/Assets/play.svg | 1 - Flaro/AppIcon.icon/icon.json | 14 +- .../Endpoints/ManagementEndpoints.cs | 31 ++- server/src/Flaro.Api/Fehlertext.cs | 5 + server/src/Flaro.Data/MetadataEnricher.cs | 18 +- server/tests/Flaro.Api.Tests/ScanTests.cs | 26 +++ web/app/index.html | 13 ++ web/app/public/favicon.svg | 28 +++ web/app/public/icon-180.png | Bin 0 -> 21421 bytes web/app/public/icon-192.png | Bin 0 -> 22412 bytes web/app/public/icon-32.png | Bin 0 -> 1659 bytes web/app/public/icon-512.png | Bin 0 -> 63841 bytes web/app/public/manifest.webmanifest | 13 ++ web/app/src/main.ts | 37 +++- web/app/src/views/admin.ts | 209 ++++++++++++------ 16 files changed, 311 insertions(+), 85 deletions(-) create mode 100644 Flaro/AppIcon.icon/Assets/flare (1).svg delete mode 100644 Flaro/AppIcon.icon/Assets/play.svg create mode 100644 web/app/public/favicon.svg create mode 100644 web/app/public/icon-180.png create mode 100644 web/app/public/icon-192.png create mode 100644 web/app/public/icon-32.png create mode 100644 web/app/public/icon-512.png create mode 100644 web/app/public/manifest.webmanifest diff --git a/Flaro/AppIcon.icon/Assets/flare (1).svg b/Flaro/AppIcon.icon/Assets/flare (1).svg new file mode 100644 index 0000000..ae42cbc --- /dev/null +++ b/Flaro/AppIcon.icon/Assets/flare (1).svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Flaro/AppIcon.icon/Assets/play.svg b/Flaro/AppIcon.icon/Assets/play.svg deleted file mode 100644 index e2aaae1..0000000 --- a/Flaro/AppIcon.icon/Assets/play.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/Flaro/AppIcon.icon/icon.json b/Flaro/AppIcon.icon/icon.json index 6d8fa01..2208296 100644 --- a/Flaro/AppIcon.icon/icon.json +++ b/Flaro/AppIcon.icon/icon.json @@ -2,7 +2,7 @@ "fill-specializations" : [ { "value" : { - "automatic-gradient" : "display-p3:0.44346,0.27892,0.96783,1.00000" + "automatic-gradient" : "display-p3:0.56409,0.38672,0.96783,1.00000" } }, { @@ -17,15 +17,15 @@ "layers" : [ { "fill" : { - "automatic-gradient" : "display-p3:0.73918,0.46760,0.96783,1.00000" + "automatic-gradient" : "display-p3:0.51566,0.11264,0.96783,1.00000" }, - "image-name" : "play.svg", - "name" : "play", + "image-name" : "flare (1).svg", + "name" : "flare (1)", "position" : { - "scale" : 1.18, + "scale" : 100, "translation-in-points" : [ - 49.7265625, - 1.468530916781674e-05 + 0, + 0 ] } } diff --git a/server/src/Flaro.Api/Endpoints/ManagementEndpoints.cs b/server/src/Flaro.Api/Endpoints/ManagementEndpoints.cs index 4210b8b..f113f9c 100644 --- a/server/src/Flaro.Api/Endpoints/ManagementEndpoints.cs +++ b/server/src/Flaro.Api/Endpoints/ManagementEndpoints.cs @@ -282,11 +282,22 @@ public static class ManagementEndpoints // sie weiss: Titel, Zuordnungen, Fortschritt. Ein Server, der beim // Aufräumen in der Oberfläche fremde Filme löscht, ist ein Server, // den man nicht noch einmal benutzt. - bibliotheken.MapDelete("/{id:guid}", async (Guid id, FlaroContext db) => + bibliotheken.MapDelete("/{id:guid}", async ( + Guid id, FlaroContext db, ScanCoordinator koordinator) => { var vorhanden = await db.Libraries.FindAsync(id); if (vorhanden is null) return Results.NotFound(); + // Aus demselben Grund wie beim Zurücksetzen — nur dass hier die + // ganze Mediathek unter dem laufenden Scan verschwände. + if (koordinator.IsRunning(id)) + { + return Results.Problem( + "Für diese Mediathek läuft gerade ein Scan. " + + "Entfernen geht erst, wenn er durch ist.", + statusCode: StatusCodes.Status409Conflict); + } + db.Libraries.Remove(vorhanden); await db.SaveChangesAsync(); return Results.NoContent(); @@ -302,11 +313,27 @@ public static class ManagementEndpoints // // Nicht gelöscht wird eine einzige Mediendatei. Entfernt wird allein, // was Flaro über sie weiss. - bibliotheken.MapPost("/{id:guid}/reset", async (Guid id, FlaroContext db) => + bibliotheken.MapPost("/{id:guid}/reset", async ( + Guid id, FlaroContext db, ScanCoordinator koordinator) => { var vorhanden = await db.Libraries.FindAsync(id); if (vorhanden is null) return Results.NotFound(); + // **Nicht während eines Laufs.** + // + // Die Oberfläche sperrt den Knopf, aber darauf darf sich der + // Server nicht verlassen: ein zweiter Administrator oder ein + // Aufruf von Hand genügt. Wer Zeilen löscht, während der Scan + // welche schreibt, bekommt einen Lauf, der mitten im Schreiben + // abbricht — und einen Bestand, den niemand mehr erklären kann. + if (koordinator.IsRunning(id)) + { + return Results.Problem( + "Für diese Mediathek läuft gerade ein Scan. " + + "Zurücksetzen geht erst, wenn er durch ist.", + statusCode: StatusCodes.Status409Conflict); + } + // In dieser Reihenfolge: erst die Dateien, dann die Titel. Die // Fremdschlüssel zeigen von den Dateien auf Film und Folge. await db.MediaFiles.Where(f => f.LibraryId == id).ExecuteDeleteAsync(); diff --git a/server/src/Flaro.Api/Fehlertext.cs b/server/src/Flaro.Api/Fehlertext.cs index cc308f3..461af10 100644 --- a/server/src/Flaro.Api/Fehlertext.cs +++ b/server/src/Flaro.Api/Fehlertext.cs @@ -57,6 +57,11 @@ public static partial class Fehlertext + "Oft ist das ein volles Volume oder ein schlafendes Laufwerk.", TaskCanceledException or OperationCanceledException => "Der Vorgang wurde abgebrochen.", + // Tritt auf, wenn jemand dieselben Zeilen gleichzeitig entfernt — + // etwa ein „Zurücksetzen" während eines laufenden Scans. + Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException => + "Jemand hat dieselben Einträge gleichzeitig geändert. " + + "Der Lauf wurde abgebrochen; starte ihn noch einmal.", HttpRequestException => "Die Metadatenquelle war nicht erreichbar. " + "Beim nächsten Lauf wird es erneut versucht.", diff --git a/server/src/Flaro.Data/MetadataEnricher.cs b/server/src/Flaro.Data/MetadataEnricher.cs index 936678e..4054a8e 100644 --- a/server/src/Flaro.Data/MetadataEnricher.cs +++ b/server/src/Flaro.Data/MetadataEnricher.cs @@ -325,9 +325,12 @@ public sealed class MetadataEnricher( private async Task FolgenZuordnen( Guid libraryId, bool erneut, IProgress? fortschritt, CancellationToken ct) { + // **Mit Titel, nicht nur mit Kennung.** In der Fortschrittszeile stand + // „Hole Metadaten zu Folge 2×13" — und bei 3815 Folgen aus achtzig + // Serien sagt eine Folgennummer ohne Serie überhaupt nichts. var serien = await db.Series .Where(s => s.LibraryId == libraryId && s.TmdbId != null) - .Select(s => new { s.Id, TmdbId = s.TmdbId!.Value }) + .Select(s => new { s.Id, TmdbId = s.TmdbId!.Value, s.Title }) .ToListAsync(ct); if (serien.Count == 0) return 0; @@ -336,16 +339,21 @@ public sealed class MetadataEnricher( .Where(f => kennungen.Contains(f.SeriesId) && (erneut || f.Overview == null)) .ToListAsync(ct); + // Einmal nachschlagbar machen: `First` je Folge wäre bei 3815 Folgen + // und achtzig Serien eine Viertelmillion Vergleiche. + var nachKennung = serien.ToDictionary(s => s.Id); + var zugeordnet = 0; var durch = 0; foreach (var folge in offen) { + ct.ThrowIfCancellationRequested(); + if (!nachKennung.TryGetValue(folge.SeriesId, out var serie)) continue; + fortschritt?.Report(new Scanschritt( Scanphase.Holen, - $"Folge {folge.SeasonNumber}x{folge.EpisodeNumber:00}", ++durch, offen.Count)); - - ct.ThrowIfCancellationRequested(); - var serie = serien.First(s => s.Id == folge.SeriesId); + $"{serie.Title} {folge.SeasonNumber}x{folge.EpisodeNumber:00}", + ++durch, offen.Count)); var gefunden = await anbieter.FindEpisodeAsync(serie.TmdbId, folge.SeasonNumber, folge.EpisodeNumber, ct); if (gefunden is null) continue; diff --git a/server/tests/Flaro.Api.Tests/ScanTests.cs b/server/tests/Flaro.Api.Tests/ScanTests.cs index 85d7290..55bce13 100644 --- a/server/tests/Flaro.Api.Tests/ScanTests.cs +++ b/server/tests/Flaro.Api.Tests/ScanTests.cs @@ -500,6 +500,32 @@ public class ScanTests Assert.That(offen.Dateien[0].Grund, Does.Contain("keine Folgennummer")); } +/// Zurücksetzen und Entfernen prallen ab, solange ein Lauf läuft. +/// +/// +/// Die Oberfläche sperrt die Knöpfe, aber darauf darf sich der Server nicht +/// verlassen. Beim Prüfen von Hand ist genau das passiert: ein +/// „Zurücksetzen" per curl während eines Scans, und der Lauf starb an einer +/// DbUpdateConcurrencyException. Ein zweiter Administrator genügt dafür auch. +/// +[Test] +public async Task Zuruecksetzen_waehrend_eines_Scans_wird_abgelehnt() +{ + for (var i = 1; i <= 400; i++) Datei($"Dark/Staffel 1/Dark - S01E{i:D3}.mkv"); + + using var server = new FlaroServer(); + var (client, bibliothek) = await MitBibliothek(server, "Shows"); + + var gestartet = await client.PostAsync($"/api/v1/libraries/{bibliothek}/scan", null); + Assert.That(gestartet.StatusCode, Is.EqualTo(HttpStatusCode.Accepted)); + + var zurueck = await client.PostAsync($"/api/v1/libraries/{bibliothek}/reset", null); + var weg = await client.DeleteAsync($"/api/v1/libraries/{bibliothek}"); + + Assert.That(zurueck.StatusCode, Is.EqualTo(HttpStatusCode.Conflict)); + Assert.That(weg.StatusCode, Is.EqualTo(HttpStatusCode.Conflict)); +} + [Test] public async Task Die_Suche_grenzt_ein() { diff --git a/web/app/index.html b/web/app/index.html index 5f2c4d2..b1ee8aa 100644 --- a/web/app/index.html +++ b/web/app/index.html @@ -5,6 +5,19 @@ Flaro + + + + + + diff --git a/web/app/public/favicon.svg b/web/app/public/favicon.svg new file mode 100644 index 0000000..8736a89 --- /dev/null +++ b/web/app/public/favicon.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + diff --git a/web/app/public/icon-180.png b/web/app/public/icon-180.png new file mode 100644 index 0000000000000000000000000000000000000000..4de66005fecb665b3fa79b48e406c38d271fc5ac GIT binary patch literal 21421 zcmZ^}1yozjw>J#Mixp^b2rW=rio1sPp@mYcK!G5|-GXa^ySBJfO0nYZ!4n)>Ah-ti zpuu0B|Gn?M?^@sb&RTP3pRH$RC39x~W=DKhktcmj{}>Aki&Wv`d-aFD_TNT`|8SQc z#us?#a4p{{zr(_+iX*-;#(Q{XG5x5njD_X>5(~>e7z^v_f#tu2h2_SFg|%aZg(Z=S zg+=3-*{mk@Ab4*MQm{}~#^QXS39+!ltg&z(DC~zu|Io0oaDHH8;XL%%|MGr3`X6cS z51jv{|5enQO!j(E%d!3fas??XNtlA|d5q1#Cgwbz_KyE5U`csOJdpP0uEs2$_I3^~ z5}wj8{-YuBK>y3;eZle{6<1s77a--&EV5u{a~2UEJ|4aoz{e~sEK<&9782_3<^J3J z;Ys?1m8+|x1TU|LhX;>`AP?Btl9yjxT%4CrfLB0(`$2=-#mm9f*pu7Ah4sIj{9ixs z&0S2LtsPyh!453{`ZYEIySYlgc=2zb|GEC_J|2L9@%YP5+VSv2 zKSTPj`T7s{VZwlqrFj2m@_~;v15H6#SZ}cu-oN|eiM`)uTVp@v#8f}hM1a*v!<D)PP#qy2i?IX5uf_IeQc+UkN6>ryzRF~34m;JW$rcHf+p_h(Y7kkXo z&71lz6>aCbwue5BCidQRbG2!d(|L_?TtnNU;~!@RK=T}l z5n`Y0yd|}hfc+q1ZRPR0Db;aOQPpvVB?0BBR^N1klhAMS+Bud^EluR*r-8m`g7MQK z(|RjFdO@K*`fgc4uWu=*K=C2YTKqFRDtAw-uC<8UnfrpZx2*{hLly*NW!sYOgpG{q zje+L9BA0r=;j)#ET%BxaCB@S@WBmr$W2yRC%_r7jorwQ1d{kZEm)A*@r zgYvlM)FU_8zCO)q%~D!H*kO7Bc!8ntNh+bt)$9x3y4$T$f8Ha=RPXBny@SkxhTBu2 zwiU!EcyF`%hZ86IY_x~sa`mJ>Jnr~aCTdv?(IREW9qmLhC^q2ECHOO6wx5z(!NwNk z6m7R!&~zDeU1oZ8Ws0ffINt62`1om^Oj?2bK|Q%EZ_hstQEy80(*{~30}pOiX{}X34J4{VpeH_s+vhnA zi9#?!FMC58H%% zFNB!5uR1E7kYD~5icNEpJAF&{pdrIhSdfO9bOdQN)jD8=ENGBK1R3^>k1Y?<2~vd_ zBcFrUO~^33UVBt-f*k`&RJNmphmZS+y`JC$*}Q87+F z*{wV^dnd>fNAN0>2>nWTWv-~{!+SGgKK6|_TqBkliO|{7IWU z^moU>Ka2KLuXE!XTd34zMb#LcXmvsmEHWR;5PKF~xyBl*URCF7!t&?0Oeyrare6$e zw*GA42<^F!=rv~@a8*vECwk8Y$HG8HlN3yrl zHb%-mriaUONxPDX*?;dg3cNc({rFbZb$l0hk4=qs>z|%5aSk;tYL|~mpFJm z_0M);5WUs8bYn8ia}{~KQe(1oAqgV}xt9}PFk*;R3J7s#(gz^9C5t)vc6u~#*x2T( z5@Jfj23Y=Zm*3R(3$xa$l8*2ZjYFS zP-#B^StiKE@ap!g$+Oqfwnuv(XBo$RlicIRz}hys1q+d!k53XOJ?9wC;U2O3Y3|+> z064IgI-=9Z7EfI?pDOXF%Oa*v*?=7rps}BrNpwyaZ~mjku$Kq##mm_#>=b})?)bjuP1tW^Deg3|&gBs<>-Q^_<+Ck0;Gx*Ls?F-%Mc zyJj*-lHF1B!q~Z9)zvYsQIPd|G1D${xZ~4KRRt*D0cO$b80Z$UOMq~AUAS;l88?p= z2S&Oj$$r!lCIk?D1YJ9*vbrbN z>!f61Czn$zD$!3=NZ4l0aD_rYja7=&H8C+*?|{8I*H~IFjg2h*^P`-4{;CuU#Xbuw zA_4zJJsqPwtF}@Hjca)2$B+x7KHfgl%Me{~;)8qwdj`WUG~9oqm9lLd*D40IEtjA1 z;Ygh|jv}{;>=|>>j(4)|9G`jrJfCnls7-0ONFoIaxmeK?S!>f$)}voD-H5&T7Af|z zej`u)nAAz<8xk)w7J=$`4Jx3$oVQ>gnkmwQcErI6T9Cc872H`nVMJwD1ktnRh?)h`ekk7kz@@ZqyQV zTb_}@^p7Q%eIjW_=)><7Zp?zr^WBNT5ffak5P^?ZK#ek(n%$3S+7-$A2`E zDg{dCh?lfGrL9UuIAy7<_S;;RV#e|a#GKtQ)G@(3%fYTrLV=m z%pxWq)}wHbL<@iBtxR9m8Q}j7ero8nR_gvBNX)p?h$go^{o_+WWUDo2_s$PR%rPD{ zI%iJt(&%{_EqP+2qT$~Nw005dQ7b+1r}YnR{o6KUABJl+MC_y{_nd~QpU1p0J!;&w zhEI74^p{#7$DKhAThq(;E=+(CZh@RlU1q~Fc~ttrr(zwV%Z6xY7wSiNqOKQZ1sphuz?JJ_?WkqeCgdqwxJ?L^#$Nrr=JKrMFm@BB9J61J~Zm%jsD zE*1F<=|E<_!Tqq^j!JUQ@yn^3j`vkh)M^z(E-pWIZPGH7Djw;as0mZs1dwO;2vi)%n5d^8)tf>|~3p7-`t~ zZfwQKpN5@9SU0T{RN=`*hna3RQ>sid=->@84$`&paP7 z)7X~fiYc&l>6=9p0mRPfmm&c9X|pnSE1ONQYnB}G-rROJN7t&VL0hHNX^afKujyo( zk@kjqGq=Zr-5U@r z*N$2mj@OtPvr3lQKP(5;2zimpya4{i-+4t|BOSQqyT$C9B@{u`BRgoiu_^@`iF#!G zpnRN^gUYELAhqmL`U!)z01zwhJ^6FOLZ-O6*i5e)-yMn;RR=@Y-mG^^IB+m<%gOy1%sp^@TtpjUF-^Em3 zQ_#2L?trB&@^CZFzdwTR{K|^~;i8{?Tp}dSP9L;Se$JNHZ02x`Ovuv|PQ2!Qna$npTGvjtN}PFmHQ7$e~B+qfbq? zY(Z;+?WP(QM9&3~l2|$}TxRDBRvA!)Jadmmp{vSnrRp|l*HMb64%}>FDYfmwAWEmm z$cE%YRs(XK)S&@|jC8@cwz}Q#(uO^s7BjLwd}1QQ4kV2N8sJtr66{_xg}YW0dld#WD<4i_~B?sKJ>Q8=q0TyfM2g5D@&6Fj7+lG*?8*u}G=pSu-CtE{}YGtepXwHB+ zf|9DSDLAM5>rKk3K4A6aY^n>uZXLuhsGpeE_&o-rw#eRU5}*?_mn?r-6enh_H=rOR z{z~3`Ubd4oIqz`&gy9a^L72ec@nwI%FCvi?thS|{wqen5x3{lkLZ9VW+wfXq8;6|! zYNpm9Y&=DLUXB?*?IxEQfJiW1NUaD#8)GC4CE{vs2^l+P#VRU0BVhfZgTTFEIrCt= zIN>tH%31(bb6pk+r?1kJdOMu_q+7(6D-=E(mQ~Lw&)*XbX=!xtjo0w{U7q^AV&gLj zG;!@OY=>U2sz=SCTR_V^!gis6%~Si{`Pd<<%&Wn;W+H9Ob6l_CbwoK-(3BgXf*Fqa zd#b6SZ#l*E6xVrJd0`z(wH;n;Upy_Gnm;{x{;o~8@Hle{L;Y!NqHv0)Pu|6+7j7xc zl*^;vTzpo=2PN3byC_;zE;GrKfqRFunU^Y7)sTtiGtt(vbK%QAK9+mG6z{PoFI01y z8X0p(yQ{|aVkX?|U?lVGWp-MYp%|@v1V)!i{2A-hZ437IVT>*@Rm{(OqVw$}-wOQ2 zCrLLA2@=*2iO$<(=>7Hxa_96d6h`7*DWx(ILp%Kr^~hy19V=D)JkxPiaU zSYVvchGcx3v!n9&=O+43%Q0%a%lpHacU}6i)3`$dVqr1hI49 zdYLPBDG0J3e8R4~q_tR!+BD3XaIQpXuVC{k3#p(w#rihg*WQuU59?b>17kgaFfM`K zV+foEA}0k9Fi1{7U=T zB2VPFI8CFxP73#L(xyeyKUb!X(aW0(M#-w{hNbcpD+tKqaX^&h{6@!FH{G!4V9^&z zcC-l&1X6Q$2>v9%0!f;Dc@3lCM97t{K=NNR#Mo0165H0OQh3P-!oV15UA);E-LLI? z{36W@D}??ZHtrQ8FcA2%l=exWj{(8w&Y-f(@LVDAC{C^LmC}{%wCscabEJy+3lX!I zpEPK2V=A-rWy9!ECAg^~_y;>w2whWu7y9Yy?_>$x5x>9+-XxcTBUFTkT=nb~3Gz*zJOBn;W@ITxlgVg%u05PWiR(2BK(&a;tI5&yp?Vt# zovm@08X11@->Z^e7v7x{EN`fjD+43i#Js~e_L?)} zynRr0m^qMUNCwfWkCGKG4R*mEY~26?wU*3#|H>j$aYi;RM6M_hsmmR(R6Xws+a9?X zxBE`Ls!Ci5lNp?H(_6x_%JZ(6BHtoQ8TJo8Z~UJl{%*J6Uyu+73BOSBd?BxxMzbna zWZWjoV1bG8pnlT$y#o2A+u}}p0At5eHX@*E*>Z2T_^oCmUSh=co``qqOG%H-7*w*P zANj#6QZ_CA=dgZW=9?XDXl&%-Se#C^7PJmfH0^K_(^%ho&|OEa7Nm(p-{s2xT7qClLQofSaFExP6B$n30Y7S$Iu2o~M}E zoQ?jngRlaLOZ~J`J?Zr)rW}&N%^WB)L-wSpeID(!nA+Vm*qY~)e68wIcbg=xw?zE? zER22+j7rR#kkE}w2X9nV2`W>9HPR9@AZV%+l(YnEklQ&_n&2cpd9BREAFlS#xh}EG zQQb1^F$AONC}7`7;B7PcT_?j$s#Ikm6QFU-M#}zRXjmsMPCU&PPHtJBVheE!-XPK8 zH%R!xEj(iRjX&b-!v_ZZ`~YihjaZ*--X@{e-qh6;D_T%~kIfAsQY%oLK_=*PiE}=% zn}Rq(3t?#lQ9Vh%U{>;gtQs}nabtV#=y8lgbAV~gFv+@;r*JkuZ@4H zG(FYWpS9%5zbXQsVAl+)X4`|DKRa~Ct5#Wbf4^L4cjUVrGL(##?1*SNm$(jNJ(NlX z-t)%Y0$?*3^3}cC3r@!7o8~xb<`EZS;4Gpr@hJHMrb`3(n?e7Ft`<~81 z?_MOWiFM%@=2@hXypv5HtcR#wWLQDceovMYa9i6M$9i)1fTI)m*~3y-WV^ji3H)xy z_)|y*LF zv3i!X;t^2Nj&>I9?5j)U@v|mA%`afSaTXuT>$Pqou}zo$ zEuJ76a>A+uwena5N6NC`KebQ)yz{WrE=8~=2F1_vw7CkjopF#COf9^Hn_tc{kTFK3 z(r&(VcY>&k4u)@CVsJMO>QFeILa@H?K!B)-Ugh?jG;G;QEXs7w5)$5t$CmS%GWaP& z|JU@ax7yRY;EX$`6i@{|Y})$Z#Pc}Z4iYa}#mzqc$EcdTacaySyYzM@)iSe`peHY?P{qbu{m^oFBL2)q}L zEX{Fo&DT;im#Mr*C*BhG^9Q&(K8TJTVa1gUr=gVTAIJ7E(N9A7mHiz;IO4o7)xX67 zKlSgKQx%?nCu6Kij1<%>(YYNvBj7d&u1JH(7pN*~x~LzFyj1EkhIc*f^&-_@>8W>>ib^zjeuPq2C$7Un{E# zyi5Q~XYfZHX{AK&{85|FJWc0&;2CD4AxB>1)IGUOwdr|FRqs2pGf5SJ18=Q(r<>WY zI{VY(_SF~401~N30bu)XbIG1%g3a3{&5Mq7%VCTV$_i3SDTZ;o4=Edc)+7dt{F9lYQk=&+F&8^-nACLzLpCid1 z){gs@pzT#+xxcZ5L$#xrjb}Ae2zf>1{Nr5cAjSeTQCl@<5xx^c!btUFVlzGoccxWz z12^H|BFGamaRH5LU{el@{Dm|cmk~8d@b$1PT`iJi2GO!870l*iLK@c3#NtM#S&m$! z*VUP%w#MPUdGAzgdp?Iw)^B@+J5pFuimE$yubs&t1GU~%-1A>MdKNmhCO%*O;6j%b zgLdLONKTjHyDkrUxl5pR|F_)&qC_)Y)Zbk!5}}Vo`)=SpfikNxB*&hT?su$tZdn3& zY-`Xue!d@zBWA#6BNPl50e_xO;t6Olv4SLwfU1f%K_HYoHx#xH{`+r98f$Ds8?C@0OFb4_`> z{Wk!pCTGD;kJj}p5cQfaY@8HQDXH5i815%?nA>8?f3oz~l#AV@6TNvq>nlA@h8$93 zM{`D~%>lh*DxmAXf%_$~sj~p|6WLEpezg38y?D!_gwSaluub&%Z8kq zdGD2=_XL@D?(4TzfnB8;lS|q9Lv<11x2VhEVz(zHdlT}Fp&YMB9}Ws_9jUrg*`=y} znavYcOjGcRKT*sQ>$_ZJF-a_*^=Dd<7wL)JW7Qk3DUn&Fok_L~MC|n;HXqugHgMlk&q){(5Nk?4-4y*Lh#PqH`IclphmqA7tk8-aX!iPu&R-n{$`` zS)016_4^#G!ypD0aDb?F=taJ1jsu;1te)Npf_{0kA6Xcq4o%5pSb|f~YgX~BNuIz1 z-|#1>|24d>98acf2(>nuuAV1o=?|2`Y@F`{>Uvu%vvcZsyMf+d2(2B7&hko#^;Pnv zKb;7w_15$}xU1?lQBypM0r^WV2TSd_=B|0>OPO?2sl&*CF; zireWjjNHXC$iJ&p`lu=4p)4V<5=b^>Tz$%$4xS6^ZlDu&UN&?)9`u~Eu^{`1k~zcl zp&0wuGq3mB1KDY86|GnIE^^lYsfl}yYz>MTu5Xy${-fO@&Q#)y`$Tq|EpQkX)gz`F z`cEQE?)`|v^IE+hxdlz;O@(KyeOGoPe{K=(Lcscl`w~Obsfc|`B8P@e9*4_q*><9? zCrLE+6u=|#Yd$M^6R=J~>|qCl9CGLBy;Q+ScF1P{-50tY@beLpK21T4-}+If+&PBe z0ywWt3(}u8$L3ARG;j=UenL;YPGDGw@luYy?t8$_Tj@#y>l5vHp4NP~+~CSWV>%d! zy+!C=jbs}i=UigP;rYl4kG-}IOK84&!0;p(s*ZB20Bx7br`|^@BZ;PJPzuM02znoG)pf?DJ{PQ^-hxQ7n!PM`pdMu ztBCwBnf${@Mreq_#q88XVCaTb8Z^U0P)lh}sLA2RgbaaT1;hvBH1{S_)cbEhaqq3L5n!>}R1XA*x zLwFs}Et<-kN}8108`hCSI1r^FYNZi>ZK_#ifMPHdP7jx2>$jteyLN9e>EnFVc8UAM zU2>bF0VV*Ni$$yl6JM0u4LZ0q;SssWiIaT!(So4v*Pr}hE0`y8Pln@B(0w(Dml$v_ zYq2Xsk7jz!H}*q*N)KfkexZfaR9=bJwlbQh{uv>dyzAD#X~HR`aurGuEZ zB!yAQ1j_8CoRg)1vv4>`c}wSj5G%g~zzP7fhdw0qTX@-+feGwhBsl zkD^a+YTUE!H@AGra^%Hw4AWMf9`6y@+PA+KwX0Y508Pd4y6*x(rWX?V$vOsRs=$V* z@u?W5iu(q?)1U49SdYt#qzq&ilSnt&98dWF%8T)DDe8K}Rd#%l?5I_f2(as7J|q*4 z>(K8_bt0t`6?1^h1u#YITivV#ZO4EYpXsD+KpCIQ+*df(*7n-TZ|c6ePK=fVZ0?Bd z+zo-JD_&=p#P0bY-W0V5T&-l27xab+*RX|NM z8QKTSPhe*Y=eu$~klZ?TR6IR!VnvFUvYo3rt73xdZ1rQz$$5s~z{p&gNMDJ{rAmNA z=f#%xp8lLo_v?X!=y?mrxl+XK&UOx?sw!lBWFf_%N9p9# zjGwKC`Uqf!;J$==OM-e|LmmsRyE;d#2z@plpD&Ou2)6=uM3lKZ3xM~#V_8pp{Lqe9 zM}{qxm?spddIfzP-)WfJ@#MX~q`#L?{mB=7RV18V$K`BNcZEaCRQ33Vnf#{xY(!S3 z9if>5Ew8t7*z#oAak)Q^hjvRbr~WiN`NuM*G)nAa@9!)i{CAvGv?kz`UgJ8lLZ7wN z4=?I1dHv8`6U!S%0QQceNHZu?k$&)%)wvYisPusLBnhfxx-m;-U6^4w)9KX740eV? zFpjuG;I)z{E^x|0uY@>v-tpl}WnIMZ zuKGkF?#O~RE0)X-#jZu9ltP-0SkGx3lh}90(~Ga~8-pk(L2`|596t$#{?sEOV?4?yc;yIhvKwaNms*L za>Sh@Y$><<(OhORnvr|*b=_;TBI4vi!coYk*;UtJ=0g&5joRiuKlmXzZLJ9 z=W81`+|ZK4EjzjQElXl)2bbNb?Fz!i)aK#szqEdI z5lNBGOEi%GXG_tKNRdR$rhKOax{=R>9@C^Wr6gWH@bl?ExMSLP;|#%b4*R;=4e)(W zu`~uaO6EAN2BZ@Vg~IHw4D>Au!YAS)%0hG*=({B}Em%?$D$m&ARl zR#LxwJ-F2VG=<))8JlzB)2E$pbrd*0XWEAQ2~qCDIC|?izQOF|?50#cM|$^0zD()9 z>p{Q)c@o>XP}YZII>=DU8Oi>`X;o)^6CU8;G3+pftT66oGsSO)EY5jVmnXZRTRG9) zM@QX-M99hDm9gc5#DUF2@_lptrg3JqVST?hgxo*HXXc>hel?zZYk1H-?@A0mNmmdd zP~BO0E&;qsY=Qq6ZKjp!8kgJa1m8mS#`-D?_#@R#f5$*S^=d&$3*e>O47}858H+$= z58s=>1ruNp!y9+ShpL~~rp0ASxL4geYs0}WdE z*`66X=-SBcS8>Zo$0J)`BHUu7Be-7wB0P6KRNC?(!%8;Gi9GMD$KCv~SB@j|>YxF( zpQG8b4m}4G%(C-Jh4(0$6uy4k0CTFrleeEYfR945lF197HAWoQUx4i0h2X3uic2pI zHQr#Ds|b>g#FsPNKddzs${)UJ*|b+KA4KeFARO#;#$NF<_jPB4!ouah)T+t3l2BAl zF507u0N;ee9tt+2@nUaEQ|;D*0cB_VuflnAR$W)%daGWRj6`VDsFZO>$(x${sr+qU zNgI@cB=pOtG|`=^Ul>uXMQdTmT7_ZbULOC*i5iY??lwBi&UY^)nwNh0SbsPMeSVoB zJ`ge1ELw$vs=MIc(@Jh;$_sdaZga=9-ux!J_JlIu@cNCy*upLpoke=>TrAQ88PAkx z15W%21K8O5N#<{()A|G5B#tvwU#G!O9=2XmT9+@Dr+aQFYjGlChBb>-26+_aEcOys#5CigNa@3>Yg@$5wqr!rbon4jJWw9d`heT%14ll{ZW!2 zcZI*T%!?7&-|{X!k5EuBK+IaWS4_l6H@elpN$sXlvI_yyD5K4u^Dp!cPAJGTc}0DN z>5E*JBj_pE;K-1^4f8XGP!dEVyz6W&Pgg=*NEiNY4@P?UxbaaCs{r$}-lx4WEd3cx zCV*Vohgu1UuYlxc)4mMHkD4B0g!!S2vkp)-0!V*#8j>IPe4gSPZ8u!IQi@p#Z9&Am z1Q<~xde_;2-4lE;7JWgO!RYs=i(&$p#YI?PRWNf8!g3fCyXZ7ZDTQRmObiZjd*7Y$ z$5D~Rk(;3o&60zrk6wW1No&Er(=RTEz=r7uSAP4>InrGbCo_8Ijm?f(w{SriX>17G z&vV>zLLG@-*@Dc4?YVN?GaVIKTvJc=c-7&_Xa#|jQEB9@EPPWy4hdk6jM$GKArrSW zH6xeDHqcO02MS~U5gd1s25(Di$a{%yu52#qwChN5NUZBU1JOA&nlxGsu;Y|*63;7e z6_a$gz{~QpcgpaGpufN^aNsvVDA%h3;c-)X|IQqVJV&Ejk_nvgQEjUz@(D%;NU8Yo z3)sfCc*K6H*pyWBm01@B_0l|?^(W@}aZV+{krS)wu6Gta~R_lePz zkbYK&sQS&oW8cy4yUjmh9!{-WX%ipkFp#@%crF3d&zuyhXgJ&|P}}C7e+h_+ zqV-Ge9!%8b=W>@nS@*?qy`l5h=KRXZ`W4p`61r(Sw)jseCYoJjEJ&ARS2?_>S=yFv zl3)&>8sGY0boKJ{lX6SbfEA|^fZt~4DZ~A(rY}miOTX8H(&?7AkSF{DF$@TF#I8BT zek$s4cXogD_jLc7`>)ulRp!aEStkQ3=(!%U^jp1PIRCcqK_&}P#Y`i4-#a?2)2o|5 zo6eQ@Pj>@`bj}TBnk9c9I;zr$3uk*xQa3Zb|AB?2e($0>YsK-Bou$W{>w4=gIe$V= zXRp&cgzZ>huq_RG>r&hL)zC{tDhRZ5*`Pu#04lZ98GRO=Xy$i7M7h)UHQ*ZXB^;LN4`wm zC7TI2>1V@_mngEy5$RJKpT?6Z-@TG~RO{cH@)ey+DJo_YL@Me=UGbB4vn>ZEBYn^P9#Wl{R> zDAHcNNp>Ij>buG^WkMxUQg!?-s`{$otXK5Lav?E6BEQEQYE!5p-sNzDt?Kui!R5#K zxRG$!&Kmus5(9tZKLIED^XCROo~eW>Ye(4Mynb}!FR9~jG|tdQ0e63t($;B1pOTa8 z7uW03RjBjZR7mY5=v588YoB#D?pM}dw`wOZ1KTP$6v@2}eX)=uvO{0t(`g)Ge_q;W zstjfvBLGc54T_yhuCxa0hfFm^mQCV2oK&eY>5B!fdJC45#?fa-cgw)H3z?RyWFWM` z_S?lxH2YDdzNB-FP<@t>X|49N8KV;ilb=*g`h@@?EV4VJKxm)l(PBO~ibZNM>0{@e zoXXqpil$?uG9HbBeHNhU@xs<%sur&zmKS0{zh<|BzU1sg<^qq$@%v?#tu0GuAGWO| zXY7V`d4~3D{$Fyo8Uq6qT`+em>fP)>E`tNU8vz+RMN-52N0!$%iEA0X9V!5J>^$E( z3gUmyie$guPH6r!1w_3niGyCfZa`0@24>weydm1K;iy;8xS2GLc&#QII?N^xV$Fwp zl{$(9;!;Tt8bZ_NPXY#S?oygJtRRuB%#`l9h0MA~P28mZPp*?xxp}ulXUMr$y(}2> zom_pRwPv7J;*M2wLMQ8R6-;{FfW*bLnq=^Mn?0P$NWY{nmrl%X}cR%L1FzjX{ z?7H_?E+8d=Y!ie^ESDFypBeM|9oaMTq*~#`Y}xhjQB*omZIA6yX``kIko<{j{k|o= z0clad?~c623j_^LK0&2^uIzBzPtk}p6{1%>#nN`|_{|vAx|yc)tehbNVXpIq9MB#0 z18OXGH^ypP`gd^9yNC(}ovQ^paZ_z@#Q?fS#7uYvK@iyQ|)w%-zUG2?A3CF^G7hoI0o~KV6`oMJnB}8h47t_oJ4xBgK_e_=dGDyzN z;b-guYWIvsQ(|-m?Q&gI2$GWMWPq}A+3j+MZ*`EpNc|GeWrFAO1@#k<+p(|f7rj{? zDe1ST@KS@xHe+PwWav9|*u(CFRZiSi^a-cH&c2ringAv^fnJ##SCuj=BtGANb|Z99 z)HdonpWmiQhDAPOJxE2~o0O2wyR2;i;irK**c2P+QPY|bAPL=vd7V!;)p-2wXUrvw zpKuxkLjD=N+Wug$`>WGwYcr?OyVT@^WjNx6HhxAbyNge{I)PbUXV`|Dtak;Nc5ZDO zPGC^z;F5q(g*Y$SzPR~wY)#<%Vg&)#ThzI@`3|L;gW2)f2{p9heCbXd-F)tnmcqo*WlUby#}{UMVI;?7_dI8m~`<=sq;zY z*UX0QMeM(tNz0r#5aQ;*7a5iRxz`;lmovDPxACgI2h5MMdYy1&b!Y4#0T za=qL5dOnZu%L|^uh`mRwWB62X)xCGNG~9BODPx17WWVHsM7a{1?;HKMSQmpT(+*`u zT3VhFXI(Fy6-l$yld`ilM|_n8_RM8fzpWCP@~BASZM zpMWv|Kfe&!mL`|)NYA6RE9O@m(m1pS0Gv?h5Dy{X25CQ|xNi>YmX_W@d+J4zrdnSm z^qxD8{AO^MYKWi4t8h$$dIjff;3%?2{bsb}?aPKH*Js$Z<}-_7r08$wVH<0lxdiy- zp@NearKsUtsjYZ|=OZ!AEB?8g(anhS*hw@+#^1|_PvxeNri;#KRA*SX&;F<0tpGLz ziAcxd1>!vQb@|?NJOpK8eHqG>NzErZq>A#;rOF+WHslOuFkFkgNpIMeqvA%!CiDZb z51iqmQHJz6&%WiDaOu^HQRad}hIJ7`L$Nqo=();MwU-$lE&}tout2AlnR$|8-$@-} zI~)19)*i8K{8%LIlmi#_I*NQ&m43S7vckT@cgi=*`mRP_t0IM@xUOV`#D=&H>@lU3 zd!a#v{b1JS!@VGr`6mlR)1W*Nz4`wOr^cp#KKs4*xUpBagtREEy@-h7SwUQ;}f>%uS|d(*Ezx18Q+sOotZj#@-6 zF3n{tR#-<%r<(yvRu1WpF#0w}u;p!|rbp88{Htc_?#gd}|GKg!%WxgU=b4;g1!A(^ z=RMDI+!?~wwrs52AoPdc>B2FAklpNQ*; zR&w`btDF%cU$_y(;+N&CBD`B2WouK3-er})_*x{aT$f+z{h>!1fQ4L}iVZH@=~*^6 zm$J^+7GGRg1w-mq^sff}9Idam4Vx=5VCGf5b;G;+)$Si7GUAEah{CfWzCN&@#0Z7f zZMgQ(Ec&@hmD0e?NLoZ{#ibRNLVXP*;MFambRWvCO9fz#TnY5O`aMseXF5Yb;MR9l zC?38Lq7$XT3@-{Ek>jF1^?>;bK(Fo_r&UP_1tOR*+kU=IS0gyLdMn`{Si=U6dbIX` z3%b*2-9|qrzvg_V%E(4pS_ZuN4<9R)&{%k;Hy`RtfwiQAvB-61iP6YX=f5L0>ZR{PHn zT#cOMmzqe43GFlXy*>l`t(wW^t-P$N#ONS4Y6C!0l zQ^@J$%5Sf{Fj^;cA8 z{RfWogl>T=5(c+Bd3{jo+RtH=W4)0kZmpyPox7UUE~=G;#pi}UyHbbQR6z5~VY5r2 zUw2s@00)9S*|+ABWLuh-J0z_nf_&GO3sN$R)%9&A$&o{1j4?O+c0?TKlhaTefzs|2 zcqMtt1pP0#J-VU@J&B%x#TtkB8lX<9lg}fN<{fnPv4!Wt$kSogT8^&?O?>8kvsp1) zlhc~(mHtevWO^UO04&=Vgl#WSC1;-P^qaCXNWHHoj`!Sa!Y2-k(Ph)0wr_3rSa;ep zg(SI9=6qHIvRTz#DSOYt?s&LvTKGJ_Qi*0tvtyn!0X9E{Jz|(0sz+d6c)JWX%^#V) z7@j)i_F}LI;v=Oap4Z*;=Y$2Wgh~bY7A%!l%y!9<`(NP-y?|C&CeKQ)*S`jk(p#uF= zNhG5!eADYOHQHWXnQmVu2T+XTS>`2Y%v7O#q-JXgcVe}BiAPX3lh1WPRbh%lB`io? zx2;dBKYNVXtNxmI#Ye`cebB};1rFHy{Df7c=i#-znD|E>RqLS&NcKn@u zLj=|%JCq*OQ$32IZ1IMql_U@DsaTFk(46h>Wj^fZ&X{%?Cf|1Nl1k`)ghh6(YPO{K zP9UaT8ws-++ms$%p6(N1W3+-SYg=eb^GvG_ee45-^(8GWz7EY&8Em6J4Wa$D2ocr&zuTcz$n{!=9 ztD0sB|DOOq62R>@J{}}7#mAZX6a#(l@nxNvw-ZR7;rO_oB;ISp#{OU0f0sEv?6-Wt z-?Fe#rKEi%D~5f_K7*Ul#5CFVgkfpSu+p^|NerdXS1et$S4sa!5=$TZl&rJ$2{c)4 zteH}vi&(BsVk;-@kn~lln5q*?JNuN?&OYP@X2t$vOq+wU|LE5|)ak2|ewPP>>(J(C z@8AL^kC=ukaBHxexQvqIR3Yb_V=SzUL2>gKSfVMW*{JN0o?{0F?oC`)Bgt9c+VMFr zgE9wfwY3y0up6;vkg)1*ePHIe?6u_Gf91xP5BRq#MQL@(i)cOo0aM)vn{MbTzW@Lc zF-b&0R53$NF}6C)CT3=w8x!C{^^R^@SF!Xh$x&Y6X<>>} zzv=|jhCX#j>ckcQ;`kURvSF2Lq>u6nPYY3;`c)^GHuR}OQYWtXTg?^6zQ~3ZF4(Y^ zkFLAvV0!F6>)C_onzRPVyOGeO%4GDgPnmXJIGJ%LMlS-uk9=rDY`B_#14~ZC3syTb zUc_H!s$%ZE4P7v@*|l!VL`=X!4mjwK%2s~jaE z&n_(eBaUj@2U}y=XI<>8B!88Pp-!G%So#^aP40tT;$dAQKl!U%!YUVIDt5_Uap>ds zO|X`aZn_;`p|BN==&gsTLQ}8|FQ{SnOt8#PIm}dy=Y=h4UL9Ybkj1&+zM$+O%i0z! z-jT4Dk6wSH-CwcO4J78_Q{$kcx!+{-rJ?m5)p6OK339Z!o^*V__xVEY}JQA(|gH=Skyee2i<@G%Sq|ZsurX_z@Z(hJx>IVl5xx z7k==|^Z2a@zv5vd_KC^8!-?RGv_2;>ac$B7;H*&&ux=8pUu!p`^V6PjGhx1ZUEX5= zV$FyIjiLZUw zX`|c+yH5;xDJ2$X%&-0N13y9^;@{D`(f(~}e7zpk0f!Y&JY{&p9+<>>6udo#y5rKW zJn*v-!~RGTqa0lijWsV~9ro(@+Wgpr#mx2n#y<8z!-=l@hFIc8KH7+34D4MG?Q-@X z{`CX=+v!-#{w&8^?l_$8vwyVaMBl$mXHrTQ7}DM!#6gvEj*Z@FeafXAq4WLGP<-FZ zfDP=A5X>Gg5hYy6eyeAfPJ3_zVO$XEWp0M9rJ0t;$gkB{I!z(7ATPB83 z_FV$YW<36wYOuy!FqcXDpPBreNAJnQ(OU2ji)w& z*z|@s9Zomh5w-Y&zV;0VzQXVR_m`#v|F`x~K>$Ls4~Z5&_R!~@zFs}O^3n$hkWI2nQ(FTk8Zo9iA9e^@#JQSd3GVQQo*@omPR6QaF0(P* zRd(Pv{Y=J}TvBt)J90%Gk+t_}UmTwYSZoB!AezB!*@(67e4m)3j4yV{+WiN9kncY} z{M;JOFtCQv;y7)}ogcU3w%bq~T-dmRPPPb&g+yE6HW!uo-L=WnCj%Uk!&MF{_#N9I zO$nz?09};Io9H$s$6!M+P65XF zS`PKLFnU9VIZyA1@uML+#K0fBKHieePHfB3m&RkoTO6sJqE#CIF9;A8~( z!$NzP^he3e8Fl53E;W)lu)h0z454+t&H5q-x6DNuIk&|}=D-K8$Ha(wZQHRCw`P2- zHV-t`9p~>jY8)5wuv4d;+qT!t5k^eKf|2~x*N+bob^l$o(+#XytX;OYpka9bFCW=Y zzuIeo|B#ch_^CwXXEpxr>*q+Yi*E_rW{FuDXVSxkqnDlBiY2b4wOVNt97vnpI}rez zPqV}<)x6jEFfMXZM<4l8!W@`B`QE3WSO=1>jE@{MEIN_rhjx5cf6PtF!T8!3T`{<= zQT$9X)~vSKg2q4Ld&kco`cb+iAR0-RTJ_aF<6y5o_M0>XI{S>Jq|ar7c3~L{Nh~FO zwNJao&{nbRLsBP}lJ;12+i~RaSA%epLpet__?PUARk;gGKO}XHhfe!x#z!u4Xn$lg zKh7lX{P_zL)~vSKf`;Q`f8)sSxUeqR$k}8n5VQe@=KH{mjBhgB4db!EF(xJYY#vJt zjUtI9hfDE8C5C2Vmwax|Amt;^nT`+j8L{SJom!v!1&2PH>aY<@ze-|#42h+G=Ce+# z3wp)UCK5c1QBK;xQ5$WLilZHP)!DZzb-qSFYHPK&jRlQI@ZR@}N7GBs2OAQBbtYj- zJAGadZ19EXN@5k$K#XCK$r+A>VsHMm&A19~qdxOHCFBBD{lqjGVSrrz__7volb>UQ zq|N=zCw9d!j#&0pHa<`<@GuP|xm+5aTpK<>!H1?ev8lcBB(~;Jtm>@!;tP|nQGfI~ zvbOEUf`;eg|HaYtMtj&Jp6_VbSGK~*TT|se*fo4t0<%xe`(Up`?Q3$ZtQl((Pt{?K zj@ocRU-#yN=@WnF$iD@kuO@#bSz^9Y*jGtBG3-|i`t&*0s$&eX>Yw>I66MJF84i<_ zf8_GKh!@+K^?5+X zs7@T?>GM9E)`-b&7<1cvruan7yuH(KW};3n`e?L|NK7CDhK<3D~5ggDVOYwg}*k&5<^KGYDQDs1|}f=g^+y;;wuOHFWFkW4q_YDxI8{N-40y_N*heAsUJo< z)9zhjC;_9Nwvo&v+pzRG)Hr5+7|9D2IvaKIvv#^1s(u*QPwCiVV+vqfJr(1Dfh2}f zb2MA#X1|4#7o{~LI>Ftz7%whINW4RA?ctd@tVOKJZEfpfmd*I1VhQ;8-#+qZJpSyr zUz)CZ&6ZaPTvA}6iEhP|{?_m%Yzgvi!M0lbkO615B^>=K*I+BA^h>GA-XBp(Yr{50 z;N+#G>%7OuJd`E>s8mAhVi`@TR*e-?``e0MiFMc_7JES25H~cwGRL=3>N$^3rq0!k{1qVml~{+_ z25Sv#?w5b_>e&+!!nmQXIzl7rf+2tXzcXTMU-;dNcBHn9csSe}9x}mm2Wm5iS7sQ% zTn8A6q0QDzZn1td1O{ktOoNVr4)CCPI}(ktL6ttiMy&Dp&p4q7!}vHV)-y-#R_VUu z^Ju9Xs+Zx8%#|s8eyAI0pYgT2a+0@>4{5#i!eT#|gHO2mTqMl#hV|mpmiup3v$@W6 ze3tjc7fz-R+G56;awtwQ^dnv|=Q>j@#v2*90UBSYoB&< zE%6{m8*#L;HuBI8S$(5e*1@>S!x(Y_r!lIlk9P7c@h~qX^Vpr~i}vnhC&9P~@rl2) z?wpw{lzShc83=jLr!Gyu`%hn-p82-@(DXHU^Rs4esEHS+Bd{= zTa$AWbJ+_Tlql+R|M$h|kN)?U{PNxrK9u763HL`G2kW5U`w5Dd@_g+Ar{mNQFnBv) z40$1$Q*BkBaaL#P6FaLpG0a5_Luc3ou~v<_QsZMz)~AxS&uSiwkF{>#_86b-oD+Kn z6wfr{?%#j%UtKkQ_&1KW-T~B7x9MlHpqbz)`#G^s*}3&yzkhLh;Rp6BHn=EaXEM;Pk;JfN6_nttwY9@+0X zue%MhcG`hEmj%rN9=rc|`r_|hoWA^rm!>Bl#c?sNXZyFx33^rj$j$(+fZ-Ax&a!T> zZ)gA1FI?~&B{#kE>=!a8@mv=)lRWp#$#nl`kEbtx>f-d^UB}b2-?eLv_CWv(8%J)O zZ~Kut-+59n+~w#1r8d__f7wyPw^)Aye|vD=(B5w^(j(>E7#k!##c*LmR{Pyqa}6F0&TzYR-Y#g6(F zOAICbl(df|Fl;+&cRG%Bgk?T*DyG_qWp0(~GY)*O5Bm$}#JKr^U;ccZ{Vem1w;WDy z`^iIF$cNL-_9LM9spc!$uK0qkgL~lzCw|1n58U9${ph{N(>L!v_EVG>&BtrnHSX2^ z%QFKweYpCy2Yw21%X@9n-g)R>iNe(id^PGC^Szwy{|8t}&&>Q`Amso6002ovPDHLk FV1jk;5ETFb literal 0 HcmV?d00001 diff --git a/web/app/public/icon-192.png b/web/app/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..3b39a544458cacfe57524f4da88a9e1f56ac5702 GIT binary patch literal 22412 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ℜR;UmcS?XTrAKl*(dAdq#-k8*=^LxC|&}!8` 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 YmOeeu8BYe*0}$wjvE{XztFF)fFFB*Ve*gdg literal 0 HcmV?d00001 diff --git a/web/app/public/manifest.webmanifest b/web/app/public/manifest.webmanifest new file mode 100644 index 0000000..81cfc6d --- /dev/null +++ b/web/app/public/manifest.webmanifest @@ -0,0 +1,13 @@ +{ + "name": "Flaro", + "short_name": "Flaro", + "start_url": "/", + "display": "standalone", + "background_color": "#0B0B0D", + "theme_color": "#0B0B0D", + "icons": [ + { "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" }, + { "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" }, + { "src": "/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" } + ] +} diff --git a/web/app/src/main.ts b/web/app/src/main.ts index 5326499..c899c5c 100644 --- a/web/app/src/main.ts +++ b/web/app/src/main.ts @@ -86,9 +86,33 @@ export async function mediathekenNeuLaden(): Promise { * Endlosschleife mit zwei Abrufen je Runde, die sich als vier dauernd * drehende Spinner zeigte. Ein neuer Zählwert in der Seitenleiste braucht * keinen Neuaufbau der Seite. */ -export async function zaehlerAuffrischen(): Promise { - mediatheken = await bibliotheken(); - leisteBauen(); +export async function zaehlerAuffrischen(bekannt?: Bibliothek[]): Promise { + // **Denselben Stand zeigen, nicht denselben Takt haben.** + // + // Beide Anzeigen fragten getrennt nach — und zeigten damit zwei Momente: + // in der Seitenleiste stand 95, in der Verwaltung 84. Während die + // Metadaten laufen, legt der Server Doppelte zusammen, die Zahl fällt also + // laufend. Wer hier eine Liste mitgibt, hat sie gerade selbst geholt; dann + // wird sie benutzt statt eine zweite zu ziehen. + const frisch = bekannt ?? await bibliotheken(); + + // **Nur die Zahlen, solange die Liste dieselbe ist.** + // + // `leisteBauen()` ersetzt die ganze Seitenleiste. Im Dreisekundentakt eines + // laufenden Scans heisst das: sie verschwindet sichtbar und kommt wieder, + // der Mauszeiger steht plötzlich über einem anderen Eintrag, und ein + // gerade gezogener Eintrag wird mitten in der Bewegung weggerissen. + const gleich = frisch.length === mediatheken.length + && frisch.every((b, i) => b.id === mediatheken[i]!.id && b.name === mediatheken[i]!.name); + + mediatheken = frisch; + + if (!gleich) { leisteBauen(); return; } + + frisch.forEach(b => { + const zeile = leiste.querySelector(`[data-ziel="#/m/${b.id}"] .zahl`); + if (zeile) zeile.textContent = String(b.itemCount ?? ''); + }); } /* ---------- Kopfleiste ---------- */ @@ -373,11 +397,14 @@ function zeichnen(): void { } else if (teile[0] === 'verwaltung' && istAdmin()) { // **Die Verwaltung auch nicht** — sie zeigt Laufendes. Ihr Takt hängt am // Signal und hört auf, sobald man weggeht. - einhaengen(weg, inhalt, signal => verwaltung(() => { + einhaengen(weg, inhalt, signal => verwaltung(bekannt => { // Gemerkte Ansichten wegwerfen: der Bestand hat sich geändert. // Die Seitenleiste bekommt neue Zahlen — die Seite selbst bleibt. vergessen(); - void zaehlerAuffrischen(); + // `bekannt` ist der Stand, den die Verwaltung gerade geholt hat. Ihn + // weiterzureichen heisst: beide zeigen dieselbe Zahl, nicht nur + // ähnliche. + void zaehlerAuffrischen(bekannt); }, signal)); } else { einhaengen(weg, inhalt, () => startseite(mediatheken, oeffnen, alleZeigen), diff --git a/web/app/src/views/admin.ts b/web/app/src/views/admin.ts index dae8a11..37a7612 100644 --- a/web/app/src/views/admin.ts +++ b/web/app/src/views/admin.ts @@ -26,7 +26,7 @@ import { icon } from '../icons'; * `geaendert` wird gerufen, wenn sich die Mediathekenliste geändert hat; die * Seitenleiste steht auf ihr und muss dann neu gezeichnet werden. */ export function verwaltung( - geaendert: () => void = () => {}, + geaendert: (bekannt?: Bibliothek[]) => void = () => {}, signal: AbortSignal = new AbortController().signal, ): HTMLElement { const wurzel = document.createElement('div'); @@ -655,7 +655,15 @@ function vermisstenbereich(geaendert: () => void): HTMLElement { /* ---------- Bibliotheken ---------- */ -function bibliotheksbereich(geaendert: () => void, signal: AbortSignal): HTMLElement { +/** Eine gezeichnete Mediathekszeile und der Weg, sie fortzuschreiben. */ +type Mediathekzeile = { + wurzel: HTMLElement; + aktualisieren: (b: Bibliothek) => void; +}; + +function bibliotheksbereich( + geaendert: (bekannt?: Bibliothek[]) => void, signal: AbortSignal, +): HTMLElement { const bereich = document.createElement('section'); @@ -695,57 +703,108 @@ function bibliotheksbereich(geaendert: () => void, signal: AbortSignal): HTMLEle const liste = document.createElement('div'); liste.className = 'einstellungen'; bereich.appendChild(liste); + + /** Die gezeichneten Zeilen, je Mediathek. + * + * **Vor dem ersten `laden()`.** Stand die Map darunter, lief der erste + * Aufruf in die temporale Totzone von `const` — „Cannot access 'zeilen' + * before initialization", und der ganze Abschnitt blieb leer. + */ + const zeilen = new Map(); + void laden(); - async function laden(): Promise { - // **Der Spinner gehört an den ersten Aufbau, nicht an jedes Auffrischen.** - // Sonst leert sich die Liste sichtbar, bevor dasselbe wieder erscheint — - // und bei einem Takt im Hintergrund blinkt sie dauernd. - if (liste.childElementCount === 0) liste.innerHTML = '
'; - try { - const alle = await bibliotheken(); - liste.innerHTML = ''; - if (alle.length === 0) { - liste.appendChild(leer('Noch keine Mediathek. Lege oben eine an.')); - return; - } - alle.forEach(b => liste.appendChild(block(b))); - } catch (fehler) { - liste.innerHTML = ''; - liste.appendChild(fehlerzeile(meldung(fehler))); + /** **Auffrischen heisst fortschreiben, nicht neu zeichnen.** + * + * Hier stand `liste.innerHTML = ''` und danach ein Neuaufbau — alle drei + * Sekunden, während ein Scan läuft. Der ganze Abschnitt verschwand dabei + * sichtbar und kam wieder; wer gerade zielte, klickte ins Leere. + * + * Schlimmer noch: jeder Neuaufbau startete über `verfolgen(false)` einen + * weiteren Takt. Nach einer Minute liefen zwanzig davon nebeneinander und + * fragten im Sekundentakt denselben Scanstand ab. + */ + async function laden(): Promise { + if (zeilen.size === 0 && liste.childElementCount === 0) { + liste.innerHTML = '
'; } + + let alle: Bibliothek[]; + try { alle = await bibliotheken(); } + catch (fehler) { + // Beim Auffrischen bleibt stehen, was da ist: ein Aussetzer darf keine + // Liste wegräumen, die noch stimmt. + if (zeilen.size === 0) { liste.innerHTML = ''; liste.appendChild(fehlerzeile(meldung(fehler))); } + return undefined; + } + + if (alle.length === 0) { + zeilen.clear(); + liste.innerHTML = ''; + liste.appendChild(leer('Noch keine Mediathek. Lege oben eine an.')); + return alle; + } + + // Spinner oder Hinweis weg — aber nur beim allerersten Mal. + if (zeilen.size === 0) liste.innerHTML = ''; + + // Was es nicht mehr gibt, verschwindet. + [...zeilen.keys()] + .filter(id => !alle.some(b => b.id === id)) + .forEach(id => { zeilen.get(id)!.wurzel.remove(); zeilen.delete(id); }); + + alle.forEach((b, i) => { + let zeile = zeilen.get(b.id); + if (zeile) zeile.aktualisieren(b); + else { zeile = block(b); zeilen.set(b.id, zeile); } + + // Reihenfolge angleichen, ohne alles anzufassen: `insertBefore` mit + // einem Knoten, der schon dort steht, tut nichts. + if (liste.children[i] !== zeile.wurzel) { + liste.insertBefore(zeile.wurzel, liste.children[i] ?? null); + } + }); + + return alle; } - function block(b: Bibliothek): HTMLElement { + function block(b: Bibliothek): Mediathekzeile { + // Die Knöpfe lesen den Stand über diese Grösse, nicht über `b` — sonst + // arbeiteten sie nach dem ersten Auffrischen mit veralteten Werten. + let aktuell = b; const d = document.createElement('div'); d.className = 'einstellung'; - const serie = b.kind === 'Shows'; - // „1 Filme" ist der Satz, an dem man sieht, dass niemand hingeschaut hat. - const anzahl = b.itemCount == null ? '' - : ` · ${b.itemCount} ` + (b.itemCount === 1 - ? (serie ? 'Serie' : 'Film') - : (serie ? 'Serien' : 'Filme')); - - // Was wartet, gehört in dieselbe Zeile — sonst erfährt man es nur, wenn - // man bis zur Prüfliste weiterscrollt. - const wartet = b.pendingCount > 0 - ? ` · ${b.pendingCount} wartet${b.pendingCount === 1 ? '' : 'en'} auf Freigabe` - : ''; - const kopf = document.createElement('div'); kopf.className = 'zeile'; - kopf.innerHTML = `${esc(b.name)}` - + `${esc(b.path)}${esc(anzahl)}${esc(wartet)}`; d.appendChild(kopf); + function kopfSchreiben(): void { + const serie = aktuell.kind === 'Shows'; + // „1 Filme" ist der Satz, an dem man sieht, dass niemand hingeschaut hat. + const anzahl = aktuell.itemCount == null ? '' + : ` · ${aktuell.itemCount} ` + (aktuell.itemCount === 1 + ? (serie ? 'Serie' : 'Film') + : (serie ? 'Serien' : 'Filme')); + + // Was wartet, gehört in dieselbe Zeile — sonst erfährt man es nur, wenn + // man bis zur Prüfliste weiterscrollt. + const wartet = aktuell.pendingCount > 0 + ? ` · ${aktuell.pendingCount} wartet${aktuell.pendingCount === 1 ? '' : 'en'} auf Freigabe` + : ''; + + kopf.innerHTML = `${esc(aktuell.name)}` + + `${esc(aktuell.path)}${esc(anzahl)}${esc(wartet)}`; + } + kopfSchreiben(); + const stand = document.createElement('div'); stand.className = 'hinweis'; const los = knopf('Scannen', 'btn'); los.onclick = async () => { laufendSetzen(true); - try { await scanStarten(b.id); await verfolgen(true); } + try { await scanStarten(aktuell.id); await verfolgen(true); } catch (fehler) { stand.textContent = meldung(fehler); laufendSetzen(false); } }; @@ -777,14 +836,14 @@ function bibliotheksbereich(geaendert: () => void, signal: AbortSignal): HTMLEle auffrischen.title = 'Holt Titel, Bilder und Besetzung erneut — ' + 'nötig nach einer Sprachänderung.'; auffrischen.onclick = () => nachfragen({ - titel: `Metadaten von „${b.name}" auffrischen?`, + titel: `Metadaten von „${aktuell.name}" auffrischen?`, text: 'Alle Titel werden erneut bei TMDB geholt — über die bekannte Kennung, ' + 'nicht über eine neue Suche. Zuordnungen von Hand bleiben damit stehen. ' + 'Bei vielen Titeln dauert es.', bestaetigen: 'Auffrischen', tun: async () => { laufendSetzen(true); - await metadatenAuffrischen(b.id); + await metadatenAuffrischen(aktuell.id); void verfolgen(true); }, }); @@ -792,10 +851,10 @@ function bibliotheksbereich(geaendert: () => void, signal: AbortSignal): HTMLEle const umbenennen = knopf('Umbenennen', 'btn'); umbenennen.onclick = () => dialog({ titel: 'Mediathek umbenennen', - felder: [{ name: 'name', beschriftung: 'Name', wert: b.name }], + felder: [{ name: 'name', beschriftung: 'Name', wert: aktuell.name }], bestaetigen: 'Speichern', tun: async wert => { - await bibliothekUmbenennen(b.id, wert('name')); + await bibliothekUmbenennen(aktuell.id, wert('name')); await laden(); geaendert(); }, @@ -807,14 +866,14 @@ function bibliotheksbereich(geaendert: () => void, signal: AbortSignal): HTMLEle // einmal; genau das war bisher der einzige Weg. const zuruecksetzen = knopf('Zurücksetzen', 'btn'); zuruecksetzen.onclick = () => nachfragen({ - titel: `„${b.name}" zurücksetzen?`, + titel: `„${aktuell.name}" zurücksetzen?`, text: 'Alle erfassten Titel, Zuordnungen und der Sehfortschritt dieser ' + 'Mediathek werden verworfen; Name, Pfad und Einstellungen bleiben. ' + 'Die Mediendateien auf der Platte bleiben unangetastet. Danach einmal ' + 'scannen, und der Bestand entsteht neu.', bestaetigen: 'Zurücksetzen', tun: async () => { - await mediathekZuruecksetzen(b.id); + await mediathekZuruecksetzen(aktuell.id); await laden(); geaendert(); }, @@ -822,11 +881,11 @@ function bibliotheksbereich(geaendert: () => void, signal: AbortSignal): HTMLEle const entfernen = knopf('Entfernen', 'btn'); entfernen.onclick = () => nachfragen({ - titel: `„${b.name}" entfernen?`, + titel: `„${aktuell.name}" entfernen?`, text: 'Die Mediendateien auf der Platte bleiben unangetastet. Weg sind die ' + 'Einträge, die Zuordnungen und der Sehfortschritt aller Benutzer dazu.', bestaetigen: 'Entfernen', - tun: async () => { await bibliothekLoeschen(b.id); await laden(); geaendert(); }, + tun: async () => { await bibliothekLoeschen(aktuell.id); await laden(); geaendert(); }, }); /** Fragt nach, bis der Lauf durch ist — er läuft im Hintergrund. */ @@ -840,7 +899,7 @@ function bibliotheksbereich(geaendert: () => void, signal: AbortSignal): HTMLEle async function verfolgen(melden: boolean): Promise { for (let i = 0; i < 900; i++) { if (signal.aborted) return; - const s = await scanstand(b.id); + const s = await scanstand(aktuell.id); // **Was der Server sagt, nicht was wir raten.** Vorher stand hier // minutenlang „Wird durchsucht…", ohne Hinweis, ob etwas passiert. // **Die Sperre richtet sich nach dem Server, nicht nach dem Klick.** @@ -869,7 +928,7 @@ function bibliotheksbereich(geaendert: () => void, signal: AbortSignal): HTMLEle // // Alle drei Runden statt alle fünf: nah genug am Zähler in der // Mediathek, ohne je Sekunde zwei Abrufe zu kosten. - if (melden && i > 0 && i % 3 === 0) { await laden(); geaendert(); } + if (melden && i > 0 && i % 3 === 0) geaendert(await laden()); if (s.state === 'finished') { const teile = [`${s.filesFound} Dateien`, `${s.added} neu`, `${s.removed} entfernt`]; @@ -895,11 +954,11 @@ function bibliotheksbereich(geaendert: () => void, signal: AbortSignal): HTMLEle // Die Prüfung lässt sich je Mediathek umstellen — was beim Anlegen // entschieden wurde, soll kein Urteil fürs Leben sein. - const pruefung = knopf(b.reviewNewItems ? 'Prüfung an' : 'Prüfung aus', 'btn'); + const pruefung = knopf(aktuell.reviewNewItems ? 'Prüfung an' : 'Prüfung aus', 'btn'); pruefung.onclick = async () => { pruefung.disabled = true; try { - await pruefungSetzen(b.id, !b.reviewNewItems); + await pruefungSetzen(aktuell.id, !aktuell.reviewNewItems); await laden(); } catch (fehler) { d.appendChild(fehlerzeile(meldung(fehler))); @@ -919,27 +978,47 @@ function bibliotheksbereich(geaendert: () => void, signal: AbortSignal): HTMLEle // **Nur wenn hier wirklich etwas liegt.** Ein Knopf, der nichts zu tun // hat, ist schlechter als keiner — und die Zahl daneben sagt, worum es // geht, ohne dass man erst weiterscrollen muss. - if (b.pendingCount > 0) { - const freigeben = knopf( - `${b.pendingCount} ${b.pendingCount === 1 ? 'Titel' : 'Titel'} freigeben`, - 'btn btn-primary'); - freigeben.onclick = async () => { - freigeben.disabled = true; - try { - const bericht = await mediathekFreigeben(b.id); - stand.textContent = `${bericht.published} freigegeben.`; - await laden(); - geaendert(); - } catch (fehler) { - d.appendChild(fehlerzeile(meldung(fehler))); - freigeben.disabled = false; - } - }; - knoepfe.appendChild(freigeben); + // + // Angelegt wird er trotzdem immer und nur versteckt: ihn beim Auffrischen + // anzulegen und wieder wegzuwerfen wäre genau das Flackern, das hier + // gerade abgestellt wird. + const freigeben = knopf('', 'btn btn-primary'); + freigeben.onclick = async () => { + freigeben.disabled = true; + try { + const bericht = await mediathekFreigeben(aktuell.id); + stand.textContent = `${bericht.published} freigegeben.`; + await laden(); + geaendert(); + } catch (fehler) { + d.appendChild(fehlerzeile(meldung(fehler))); + } finally { + freigeben.disabled = false; + } + }; + knoepfe.appendChild(freigeben); + + function freigabeSchreiben(): void { + freigeben.hidden = aktuell.pendingCount === 0; + freigeben.textContent = `${aktuell.pendingCount} Titel freigeben`; } + freigabeSchreiben(); + d.append(knoepfe, stand); + + // **Genau ein Takt je Mediathek.** Er entsteht hier, beim Anlegen der + // Zeile — und weil die Zeile nicht mehr neu gebaut wird, bleibt es dabei. void verfolgen(false); - return d; + + return { + wurzel: d, + aktualisieren: (neu: Bibliothek) => { + aktuell = neu; + kopfSchreiben(); + pruefung.textContent = aktuell.reviewNewItems ? 'Prüfung an' : 'Prüfung aus'; + freigabeSchreiben(); + }, + }; } return bereich;