django-cfg 1.4.87__py3-none-any.whl → 1.4.88__py3-none-any.whl

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.

Potentially problematic release.


This version of django-cfg might be problematic. Click here for more details.

Files changed (59) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/dashboard/permissions.py +48 -0
  3. django_cfg/apps/dashboard/serializers/__init__.py +8 -1
  4. django_cfg/apps/dashboard/serializers/commands.py +29 -0
  5. django_cfg/apps/dashboard/services/commands_security.py +228 -0
  6. django_cfg/apps/dashboard/services/commands_service.py +208 -9
  7. django_cfg/apps/dashboard/views/commands_views.py +92 -4
  8. django_cfg/apps/frontend/views.py +4 -0
  9. django_cfg/pyproject.toml +1 -1
  10. django_cfg/static/frontend/admin/404/index.html +1 -1
  11. django_cfg/static/frontend/admin/404.html +1 -1
  12. django_cfg/static/frontend/admin/500/index.html +1 -1
  13. django_cfg/static/frontend/admin/_next/static/{ZJZBgOL9mO1koHrgaaLEV → D_d9HRw5Yn7BRHAX5q89_}/_buildManifest.js +1 -1
  14. django_cfg/static/frontend/admin/_next/static/chunks/{19430.fe7bff7372f8a256.js → 19430.c4c95603c23c17fe.js} +1 -1
  15. django_cfg/static/frontend/admin/_next/static/chunks/50314-5ec79b293c2283dd.js +1 -0
  16. django_cfg/static/frontend/admin/_next/static/chunks/94141-bc6d47f419b26b21.js +1 -0
  17. django_cfg/static/frontend/admin/_next/static/chunks/pages/{_app-c336f254967dd101.js → _app-1c0fff0f59a6d683.js} +6 -6
  18. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{cookies-b39c7f22c066e2c6.js → cookies-97d279800f12aab4.js} +1 -1
  19. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{privacy-5aedad0cf3a4f80f.js → privacy-1d5e6cd94689247e.js} +1 -1
  20. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{security-dbd854d0d5d483e2.js → security-55e49700e7a01f5a.js} +1 -1
  21. django_cfg/static/frontend/admin/_next/static/chunks/pages/legal/{terms-f3e1d2b9e5edf12f.js → terms-14c02bb2d3198352.js} +1 -1
  22. django_cfg/static/frontend/admin/_next/static/chunks/pages/private/{centrifugo-22532c65971225eb.js → centrifugo-44a8313fa040e9ad.js} +1 -1
  23. django_cfg/static/frontend/admin/_next/static/chunks/pages/private-d4ccbe1265cbd853.js +1 -0
  24. django_cfg/static/frontend/admin/_next/static/chunks/{webpack-da114020a6b940f5.js → webpack-5a92f81363b62aa7.js} +1 -1
  25. django_cfg/static/frontend/admin/_next/static/css/3063068f0d5a8a00.css +3 -0
  26. django_cfg/static/frontend/admin/_next/static/media/19cfc7226ec3afaa-s.woff2 +0 -0
  27. django_cfg/static/frontend/admin/_next/static/media/21350d82a1f187e9-s.p.woff2 +0 -0
  28. django_cfg/static/frontend/admin/_next/static/media/8e9860b6e62d6359-s.woff2 +0 -0
  29. django_cfg/static/frontend/admin/_next/static/media/ba9851c3c22cd980-s.woff2 +0 -0
  30. django_cfg/static/frontend/admin/_next/static/media/c5fe6dc8356a8c31-s.woff2 +0 -0
  31. django_cfg/static/frontend/admin/_next/static/media/df0a9ae256c0569c-s.woff2 +0 -0
  32. django_cfg/static/frontend/admin/_next/static/media/e4af272ccee01ff0-s.p.woff2 +0 -0
  33. django_cfg/static/frontend/admin/auth/index.html +1 -1
  34. django_cfg/static/frontend/admin/index.html +1 -1
  35. django_cfg/static/frontend/admin/legal/cookies/index.html +1 -1
  36. django_cfg/static/frontend/admin/legal/privacy/index.html +1 -1
  37. django_cfg/static/frontend/admin/legal/security/index.html +1 -1
  38. django_cfg/static/frontend/admin/legal/terms/index.html +1 -1
  39. django_cfg/static/frontend/admin/private/centrifugo/index.html +1 -1
  40. django_cfg/static/frontend/admin/private/index.html +1 -1
  41. django_cfg/static/frontend/admin/private/profile/index.html +1 -1
  42. django_cfg/static/frontend/admin/private/ui/index.html +2 -2
  43. django_cfg/templates/admin/index.html +1 -1
  44. {django_cfg-1.4.87.dist-info → django_cfg-1.4.88.dist-info}/METADATA +1 -1
  45. {django_cfg-1.4.87.dist-info → django_cfg-1.4.88.dist-info}/RECORD +49 -46
  46. django_cfg/static/frontend/admin/_next/static/chunks/23004-faae121bbfecc163.js +0 -1
  47. django_cfg/static/frontend/admin/_next/static/chunks/50314-48bd5701f62faf27.js +0 -1
  48. django_cfg/static/frontend/admin/_next/static/chunks/pages/private-fe9faa86ecdb0ce6.js +0 -1
  49. django_cfg/static/frontend/admin/_next/static/css/5f9a37b6e6a72303.css +0 -3
  50. django_cfg/static/frontend/admin/_next/static/media/438aa629764e75f3-s.woff2 +0 -0
  51. django_cfg/static/frontend/admin/_next/static/media/4c9affa5bc8f420e-s.p.woff2 +0 -0
  52. django_cfg/static/frontend/admin/_next/static/media/51251f8b9793cdb3-s.woff2 +0 -0
  53. django_cfg/static/frontend/admin/_next/static/media/875ae681bfde4580-s.p.woff2 +0 -0
  54. django_cfg/static/frontend/admin/_next/static/media/cc978ac5ee68c2b6-s.woff2 +0 -0
  55. django_cfg/static/frontend/admin/_next/static/media/e857b654a2caa584-s.woff2 +0 -0
  56. /django_cfg/static/frontend/admin/_next/static/{ZJZBgOL9mO1koHrgaaLEV → D_d9HRw5Yn7BRHAX5q89_}/_ssgManifest.js +0 -0
  57. {django_cfg-1.4.87.dist-info → django_cfg-1.4.88.dist-info}/WHEEL +0 -0
  58. {django_cfg-1.4.87.dist-info → django_cfg-1.4.88.dist-info}/entry_points.txt +0 -0
  59. {django_cfg-1.4.87.dist-info → django_cfg-1.4.88.dist-info}/licenses/LICENSE +0 -0
@@ -4,19 +4,29 @@ Commands ViewSet
4
4
  Endpoints for Django management commands:
5
5
  - GET /commands/ - All available commands
6
6
  - GET /commands/summary/ - Commands summary with statistics
7
+ - POST /commands/execute/ - Execute a command with streaming output
8
+ - GET /commands/{name}/help/ - Get help for a specific command
7
9
  """
8
10
 
11
+ import json
9
12
  import logging
10
13
 
14
+ from django.http import StreamingHttpResponse
11
15
  from drf_spectacular.utils import extend_schema
12
16
  from rest_framework import status, viewsets
13
17
  from rest_framework.authentication import BasicAuthentication, SessionAuthentication
14
18
  from rest_framework.decorators import action
15
- from rest_framework.permissions import IsAdminUser
16
19
  from rest_framework.response import Response
20
+ from rest_framework_simplejwt.authentication import JWTAuthentication
17
21
 
22
+ from ..permissions import IsSuperAdmin
18
23
  from ..services import CommandsService
19
- from ..serializers import CommandSerializer, CommandsSummarySerializer
24
+ from ..serializers import (
25
+ CommandSerializer,
26
+ CommandsSummarySerializer,
27
+ CommandExecuteRequestSerializer,
28
+ CommandHelpResponseSerializer,
29
+ )
20
30
 
21
31
  logger = logging.getLogger(__name__)
22
32
 
@@ -28,8 +38,8 @@ class CommandsViewSet(viewsets.GenericViewSet):
28
38
  Provides endpoints for Django management commands discovery.
29
39
  """
30
40
 
31
- authentication_classes = [SessionAuthentication, BasicAuthentication]
32
- permission_classes = [IsAdminUser]
41
+ authentication_classes = [JWTAuthentication, SessionAuthentication, BasicAuthentication]
42
+ permission_classes = [IsSuperAdmin] # Only superusers can access commands
33
43
  serializer_class = CommandSerializer
34
44
  pagination_class = None # Disable pagination for commands list
35
45
 
@@ -71,3 +81,81 @@ class CommandsViewSet(viewsets.GenericViewSet):
71
81
  return Response({
72
82
  'error': str(e)
73
83
  }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
84
+
85
+ @extend_schema(
86
+ summary="Execute command",
87
+ description="Execute a Django management command and stream output in Server-Sent Events format",
88
+ request=CommandExecuteRequestSerializer,
89
+ responses={
90
+ 200: {"description": "Command execution started (SSE stream)"},
91
+ 400: {"description": "Invalid request"},
92
+ 403: {"description": "Command not allowed"},
93
+ },
94
+ tags=["Dashboard - Commands"]
95
+ )
96
+ @action(detail=False, methods=['post'], url_path='execute', serializer_class=CommandExecuteRequestSerializer)
97
+ def execute(self, request):
98
+ """Execute a Django management command with streaming output."""
99
+ try:
100
+ # Validate request data
101
+ serializer = CommandExecuteRequestSerializer(data=request.data)
102
+ if not serializer.is_valid():
103
+ return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
104
+
105
+ command_name = serializer.validated_data['command']
106
+ args = serializer.validated_data.get('args', [])
107
+ options = serializer.validated_data.get('options', {})
108
+
109
+ # Create streaming response
110
+ def stream_execution():
111
+ """Generator that streams command output as Server-Sent Events."""
112
+ commands_service = CommandsService()
113
+
114
+ for event in commands_service.execute_command(
115
+ command_name=command_name,
116
+ args=args,
117
+ options=options,
118
+ user=request.user
119
+ ):
120
+ # Format as Server-Sent Event
121
+ yield f"data: {json.dumps(event)}\n\n"
122
+
123
+ response = StreamingHttpResponse(
124
+ stream_execution(),
125
+ content_type='text/event-stream'
126
+ )
127
+ response['Cache-Control'] = 'no-cache'
128
+ response['X-Accel-Buffering'] = 'no' # Disable nginx buffering
129
+
130
+ return response
131
+
132
+ except Exception as e:
133
+ logger.error(f"Command execution API error: {e}")
134
+ return Response({
135
+ 'error': str(e)
136
+ }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
137
+
138
+ @extend_schema(
139
+ summary="Get command help",
140
+ description="Get detailed help text for a specific Django management command",
141
+ responses={200: CommandHelpResponseSerializer},
142
+ tags=["Dashboard - Commands"]
143
+ )
144
+ @action(detail=True, methods=['get'], url_path='help', serializer_class=CommandHelpResponseSerializer)
145
+ def help(self, request, pk=None):
146
+ """Get help text for a specific command."""
147
+ try:
148
+ commands_service = CommandsService()
149
+ help_data = commands_service.get_command_help(pk)
150
+
151
+ if help_data.get('status') == 'error':
152
+ return Response(help_data, status=status.HTTP_404_NOT_FOUND)
153
+
154
+ return Response(help_data)
155
+
156
+ except Exception as e:
157
+ logger.error(f"Command help API error: {e}")
158
+ return Response({
159
+ 'status': 'error',
160
+ 'error': str(e)
161
+ }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@@ -9,11 +9,14 @@ from pathlib import Path
9
9
  from django.http import Http404, HttpResponse, FileResponse
10
10
  from django.views.static import serve
11
11
  from django.views import View
12
+ from django.views.decorators.clickjacking import xframe_options_exempt
13
+ from django.utils.decorators import method_decorator
12
14
  from rest_framework_simplejwt.tokens import RefreshToken
13
15
 
14
16
  logger = logging.getLogger(__name__)
15
17
 
16
18
 
19
+ @method_decorator(xframe_options_exempt, name='dispatch')
17
20
  class NextJSStaticView(View):
18
21
  """
19
22
  Serve Next.js static build files with automatic JWT token injection.
@@ -24,6 +27,7 @@ class NextJSStaticView(View):
24
27
  - Tokens injected into HTML responses only
25
28
  - Handles Next.js client-side routing (.html fallback)
26
29
  - Automatically serves index.html for directory paths
30
+ - X-Frame-Options exempt to allow embedding in iframes
27
31
 
28
32
  Path resolution examples:
29
33
  - /cfg/admin/ → /cfg/admin/index.html
django_cfg/pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "django-cfg"
7
- version = "1.4.87"
7
+ version = "1.4.88"
8
8
  description = "Django AI framework with built-in agents, type-safe Pydantic v2 configuration, and 8 enterprise apps. Replace settings.py, validate at startup, 90% less code. Production-ready AI workflows for Django."
9
9
  readme = "README.md"
10
10
  keywords = [ "django", "configuration", "pydantic", "settings", "type-safety", "pydantic-settings", "django-environ", "startup-validation", "ide-autocomplete", "ai-agents", "enterprise-django", "django-settings", "type-safe-config",]
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">Django CFG</title><meta name="description" content="Django CFG Admin Panel" data-next-head=""/><link rel="icon" type="image/png" href="/cfg/admin/static/logos/192x192.png" data-next-head=""/><meta property="og:title" content="Django CFG" data-next-head=""/><meta property="og:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:type" content="website" data-next-head=""/><meta name="twitter:card" content="summary_large_image" data-next-head=""/><meta name="twitter:title" content="Django CFG" data-next-head=""/><meta name="twitter:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><meta property="og:image:width" content="1200" data-next-head=""/><meta property="og:image:height" content="630" data-next-head=""/><meta property="og:image:type" content="image/png" data-next-head=""/><meta name="twitter:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><link rel="preload" href="/cfg/admin/_next/static/media/875ae681bfde4580-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/media/4c9affa5bc8f420e-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/css/5f9a37b6e6a72303.css" as="style"/><link rel="stylesheet" href="/cfg/admin/_next/static/css/5f9a37b6e6a72303.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/cfg/admin/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/cfg/admin/_next/static/chunks/webpack-da114020a6b940f5.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/framework-46f25b115ad0e595.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/main-d4b1d5245e3e8c42.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/_app-c336f254967dd101.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/404-9c41b6ebfe67f15e.js" defer=""></script><script src="/cfg/admin/_next/static/ZJZBgOL9mO1koHrgaaLEV/_buildManifest.js" defer=""></script><script src="/cfg/admin/_next/static/ZJZBgOL9mO1koHrgaaLEV/_ssgManifest.js" defer=""></script></head><body><div id="__next"><style>html { font-family: 'Manrope', 'Manrope Fallback'; }</style><div class="min-h-screen flex items-center justify-center px-4"><div class="max-w-2xl w-full text-center space-y-8"><div class="relative"><h1 class="text-[12rem] font-bold leading-none text-muted/20 select-none" aria-hidden="true">404</h1></div><div class="flex justify-center py-8"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-question w-24 h-24 text-muted-foreground/50"><path d="M12 17h.01"></path><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z"></path><path d="M9.1 9a3 3 0 0 1 5.82 1c0 2-3 3-3 3"></path></svg></div><div class="space-y-4"><h2 class="text-4xl font-bold text-foreground">Page Not Found</h2><p class="text-lg text-muted-foreground max-w-md mx-auto">The page you&#x27;re looking for doesn&#x27;t exist or has been moved.</p></div><div class="flex flex-col sm:flex-row items-center justify-center gap-4 pt-4"><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground h-11 rounded-md px-8 min-w-[140px]">Go Back</button><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 bg-primary text-primary-foreground shadow hover:bg-primary/90 h-11 rounded-md px-8 min-w-[140px]">Go Home</button></div><div class="pt-8 text-sm text-muted-foreground"><p>Need help? Contact<!-- --> <a href="mailto:support@djangocfg.com" class="text-primary hover:underline">support</a></p></div></div></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[9999] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"ZJZBgOL9mO1koHrgaaLEV","assetPrefix":"/cfg/admin","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">Django CFG</title><meta name="description" content="Django CFG Admin Panel" data-next-head=""/><link rel="icon" type="image/png" href="/cfg/admin/static/logos/192x192.png" data-next-head=""/><meta property="og:title" content="Django CFG" data-next-head=""/><meta property="og:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:type" content="website" data-next-head=""/><meta name="twitter:card" content="summary_large_image" data-next-head=""/><meta name="twitter:title" content="Django CFG" data-next-head=""/><meta name="twitter:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><meta property="og:image:width" content="1200" data-next-head=""/><meta property="og:image:height" content="630" data-next-head=""/><meta property="og:image:type" content="image/png" data-next-head=""/><meta name="twitter:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><link rel="preload" href="/cfg/admin/_next/static/media/21350d82a1f187e9-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/media/e4af272ccee01ff0-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/css/3063068f0d5a8a00.css" as="style"/><link rel="stylesheet" href="/cfg/admin/_next/static/css/3063068f0d5a8a00.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/cfg/admin/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/cfg/admin/_next/static/chunks/webpack-5a92f81363b62aa7.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/framework-46f25b115ad0e595.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/main-d4b1d5245e3e8c42.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/_app-1c0fff0f59a6d683.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/404-9c41b6ebfe67f15e.js" defer=""></script><script src="/cfg/admin/_next/static/D_d9HRw5Yn7BRHAX5q89_/_buildManifest.js" defer=""></script><script src="/cfg/admin/_next/static/D_d9HRw5Yn7BRHAX5q89_/_ssgManifest.js" defer=""></script></head><body><div id="__next"><style>html { font-family: 'Inter', 'Inter Fallback'; }</style><div class="p-6"><div class="min-h-screen flex items-center justify-center px-4"><div class="max-w-2xl w-full text-center space-y-8"><div class="relative"><h1 class="text-[12rem] font-bold leading-none text-muted/20 select-none" aria-hidden="true">404</h1></div><div class="flex justify-center py-8"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-question w-24 h-24 text-muted-foreground/50"><path d="M12 17h.01"></path><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z"></path><path d="M9.1 9a3 3 0 0 1 5.82 1c0 2-3 3-3 3"></path></svg></div><div class="space-y-4"><h2 class="text-4xl font-bold text-foreground">Page Not Found</h2><p class="text-lg text-muted-foreground max-w-md mx-auto">The page you&#x27;re looking for doesn&#x27;t exist or has been moved.</p></div><div class="flex flex-col sm:flex-row items-center justify-center gap-4 pt-4"><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground h-11 rounded-md px-8 min-w-[140px]">Go Back</button><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 bg-primary text-primary-foreground shadow hover:bg-primary/90 h-11 rounded-md px-8 min-w-[140px]">Go Home</button></div><div class="pt-8 text-sm text-muted-foreground"><p>Need help? Contact<!-- --> <a href="mailto:support@djangocfg.com" class="text-primary hover:underline">support</a></p></div></div></div></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[9999] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"D_d9HRw5Yn7BRHAX5q89_","assetPrefix":"/cfg/admin","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">Django CFG</title><meta name="description" content="Django CFG Admin Panel" data-next-head=""/><link rel="icon" type="image/png" href="/cfg/admin/static/logos/192x192.png" data-next-head=""/><meta property="og:title" content="Django CFG" data-next-head=""/><meta property="og:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:type" content="website" data-next-head=""/><meta name="twitter:card" content="summary_large_image" data-next-head=""/><meta name="twitter:title" content="Django CFG" data-next-head=""/><meta name="twitter:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><meta property="og:image:width" content="1200" data-next-head=""/><meta property="og:image:height" content="630" data-next-head=""/><meta property="og:image:type" content="image/png" data-next-head=""/><meta name="twitter:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><link rel="preload" href="/cfg/admin/_next/static/media/875ae681bfde4580-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/media/4c9affa5bc8f420e-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/css/5f9a37b6e6a72303.css" as="style"/><link rel="stylesheet" href="/cfg/admin/_next/static/css/5f9a37b6e6a72303.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/cfg/admin/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/cfg/admin/_next/static/chunks/webpack-da114020a6b940f5.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/framework-46f25b115ad0e595.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/main-d4b1d5245e3e8c42.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/_app-c336f254967dd101.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/404-9c41b6ebfe67f15e.js" defer=""></script><script src="/cfg/admin/_next/static/ZJZBgOL9mO1koHrgaaLEV/_buildManifest.js" defer=""></script><script src="/cfg/admin/_next/static/ZJZBgOL9mO1koHrgaaLEV/_ssgManifest.js" defer=""></script></head><body><div id="__next"><style>html { font-family: 'Manrope', 'Manrope Fallback'; }</style><div class="min-h-screen flex items-center justify-center px-4"><div class="max-w-2xl w-full text-center space-y-8"><div class="relative"><h1 class="text-[12rem] font-bold leading-none text-muted/20 select-none" aria-hidden="true">404</h1></div><div class="flex justify-center py-8"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-question w-24 h-24 text-muted-foreground/50"><path d="M12 17h.01"></path><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z"></path><path d="M9.1 9a3 3 0 0 1 5.82 1c0 2-3 3-3 3"></path></svg></div><div class="space-y-4"><h2 class="text-4xl font-bold text-foreground">Page Not Found</h2><p class="text-lg text-muted-foreground max-w-md mx-auto">The page you&#x27;re looking for doesn&#x27;t exist or has been moved.</p></div><div class="flex flex-col sm:flex-row items-center justify-center gap-4 pt-4"><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground h-11 rounded-md px-8 min-w-[140px]">Go Back</button><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 bg-primary text-primary-foreground shadow hover:bg-primary/90 h-11 rounded-md px-8 min-w-[140px]">Go Home</button></div><div class="pt-8 text-sm text-muted-foreground"><p>Need help? Contact<!-- --> <a href="mailto:support@djangocfg.com" class="text-primary hover:underline">support</a></p></div></div></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[9999] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"ZJZBgOL9mO1koHrgaaLEV","assetPrefix":"/cfg/admin","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">Django CFG</title><meta name="description" content="Django CFG Admin Panel" data-next-head=""/><link rel="icon" type="image/png" href="/cfg/admin/static/logos/192x192.png" data-next-head=""/><meta property="og:title" content="Django CFG" data-next-head=""/><meta property="og:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:type" content="website" data-next-head=""/><meta name="twitter:card" content="summary_large_image" data-next-head=""/><meta name="twitter:title" content="Django CFG" data-next-head=""/><meta name="twitter:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><meta property="og:image:width" content="1200" data-next-head=""/><meta property="og:image:height" content="630" data-next-head=""/><meta property="og:image:type" content="image/png" data-next-head=""/><meta name="twitter:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><link rel="preload" href="/cfg/admin/_next/static/media/21350d82a1f187e9-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/media/e4af272ccee01ff0-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/css/3063068f0d5a8a00.css" as="style"/><link rel="stylesheet" href="/cfg/admin/_next/static/css/3063068f0d5a8a00.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/cfg/admin/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/cfg/admin/_next/static/chunks/webpack-5a92f81363b62aa7.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/framework-46f25b115ad0e595.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/main-d4b1d5245e3e8c42.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/_app-1c0fff0f59a6d683.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/404-9c41b6ebfe67f15e.js" defer=""></script><script src="/cfg/admin/_next/static/D_d9HRw5Yn7BRHAX5q89_/_buildManifest.js" defer=""></script><script src="/cfg/admin/_next/static/D_d9HRw5Yn7BRHAX5q89_/_ssgManifest.js" defer=""></script></head><body><div id="__next"><style>html { font-family: 'Inter', 'Inter Fallback'; }</style><div class="p-6"><div class="min-h-screen flex items-center justify-center px-4"><div class="max-w-2xl w-full text-center space-y-8"><div class="relative"><h1 class="text-[12rem] font-bold leading-none text-muted/20 select-none" aria-hidden="true">404</h1></div><div class="flex justify-center py-8"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-file-question w-24 h-24 text-muted-foreground/50"><path d="M12 17h.01"></path><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z"></path><path d="M9.1 9a3 3 0 0 1 5.82 1c0 2-3 3-3 3"></path></svg></div><div class="space-y-4"><h2 class="text-4xl font-bold text-foreground">Page Not Found</h2><p class="text-lg text-muted-foreground max-w-md mx-auto">The page you&#x27;re looking for doesn&#x27;t exist or has been moved.</p></div><div class="flex flex-col sm:flex-row items-center justify-center gap-4 pt-4"><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground h-11 rounded-md px-8 min-w-[140px]">Go Back</button><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 bg-primary text-primary-foreground shadow hover:bg-primary/90 h-11 rounded-md px-8 min-w-[140px]">Go Home</button></div><div class="pt-8 text-sm text-muted-foreground"><p>Need help? Contact<!-- --> <a href="mailto:support@djangocfg.com" class="text-primary hover:underline">support</a></p></div></div></div></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[9999] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"D_d9HRw5Yn7BRHAX5q89_","assetPrefix":"/cfg/admin","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">Django CFG</title><meta name="description" content="Django CFG Admin Panel" data-next-head=""/><link rel="icon" type="image/png" href="/cfg/admin/static/logos/192x192.png" data-next-head=""/><meta property="og:title" content="Django CFG" data-next-head=""/><meta property="og:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:type" content="website" data-next-head=""/><meta name="twitter:card" content="summary_large_image" data-next-head=""/><meta name="twitter:title" content="Django CFG" data-next-head=""/><meta name="twitter:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><meta property="og:image:width" content="1200" data-next-head=""/><meta property="og:image:height" content="630" data-next-head=""/><meta property="og:image:type" content="image/png" data-next-head=""/><meta name="twitter:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><link rel="preload" href="/cfg/admin/_next/static/media/875ae681bfde4580-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/media/4c9affa5bc8f420e-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/css/5f9a37b6e6a72303.css" as="style"/><link rel="stylesheet" href="/cfg/admin/_next/static/css/5f9a37b6e6a72303.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/cfg/admin/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/cfg/admin/_next/static/chunks/webpack-da114020a6b940f5.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/framework-46f25b115ad0e595.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/main-d4b1d5245e3e8c42.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/_app-c336f254967dd101.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/500-906d92e10e7e65fb.js" defer=""></script><script src="/cfg/admin/_next/static/ZJZBgOL9mO1koHrgaaLEV/_buildManifest.js" defer=""></script><script src="/cfg/admin/_next/static/ZJZBgOL9mO1koHrgaaLEV/_ssgManifest.js" defer=""></script></head><body><div id="__next"><style>html { font-family: 'Manrope', 'Manrope Fallback'; }</style><div class="min-h-screen flex items-center justify-center px-4"><div class="max-w-2xl w-full text-center space-y-8"><div class="relative"><h1 class="text-[12rem] font-bold leading-none text-muted/20 select-none" aria-hidden="true">500</h1></div><div class="flex justify-center py-8"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-server-crash w-24 h-24 text-destructive/50"><path d="M6 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-2"></path><path d="M6 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-2"></path><path d="M6 6h.01"></path><path d="M6 18h.01"></path><path d="m13 6-4 6h6l-4 6"></path></svg></div><div class="space-y-4"><h2 class="text-4xl font-bold text-foreground">Server Error</h2><p class="text-lg text-muted-foreground max-w-md mx-auto">Something went wrong on our end. We&#x27;re working to fix it.</p></div><div class="flex flex-col sm:flex-row items-center justify-center gap-4 pt-4"><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground h-11 rounded-md px-8 min-w-[140px]">Go Back</button><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 bg-primary text-primary-foreground shadow hover:bg-primary/90 h-11 rounded-md px-8 min-w-[140px]">Go Home</button></div><div class="pt-8 text-sm text-muted-foreground"><p>Need help? Contact<!-- --> <a href="mailto:support@djangocfg.com" class="text-primary hover:underline">support</a></p></div></div></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[9999] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/500","query":{},"buildId":"ZJZBgOL9mO1koHrgaaLEV","assetPrefix":"/cfg/admin","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">Django CFG</title><meta name="description" content="Django CFG Admin Panel" data-next-head=""/><link rel="icon" type="image/png" href="/cfg/admin/static/logos/192x192.png" data-next-head=""/><meta property="og:title" content="Django CFG" data-next-head=""/><meta property="og:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:type" content="website" data-next-head=""/><meta name="twitter:card" content="summary_large_image" data-next-head=""/><meta name="twitter:title" content="Django CFG" data-next-head=""/><meta name="twitter:description" content="Django CFG Admin Panel" data-next-head=""/><meta property="og:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><meta property="og:image:width" content="1200" data-next-head=""/><meta property="og:image:height" content="630" data-next-head=""/><meta property="og:image:type" content="image/png" data-next-head=""/><meta name="twitter:image" content="/cfg/admin//api/og?data=eyJ0aXRsZSI6IkRqYW5nbyBDRkciLCJzdWJ0aXRsZSI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwiLCJkZXNjcmlwdGlvbiI6IkRqYW5nbyBDRkcgQWRtaW4gUGFuZWwifQ==" data-next-head=""/><link rel="preload" href="/cfg/admin/_next/static/media/21350d82a1f187e9-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/media/e4af272ccee01ff0-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/cfg/admin/_next/static/css/3063068f0d5a8a00.css" as="style"/><link rel="stylesheet" href="/cfg/admin/_next/static/css/3063068f0d5a8a00.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/cfg/admin/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/cfg/admin/_next/static/chunks/webpack-5a92f81363b62aa7.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/framework-46f25b115ad0e595.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/main-d4b1d5245e3e8c42.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/_app-1c0fff0f59a6d683.js" defer=""></script><script src="/cfg/admin/_next/static/chunks/pages/500-906d92e10e7e65fb.js" defer=""></script><script src="/cfg/admin/_next/static/D_d9HRw5Yn7BRHAX5q89_/_buildManifest.js" defer=""></script><script src="/cfg/admin/_next/static/D_d9HRw5Yn7BRHAX5q89_/_ssgManifest.js" defer=""></script></head><body><div id="__next"><style>html { font-family: 'Inter', 'Inter Fallback'; }</style><div class="p-6"><div class="min-h-screen flex items-center justify-center px-4"><div class="max-w-2xl w-full text-center space-y-8"><div class="relative"><h1 class="text-[12rem] font-bold leading-none text-muted/20 select-none" aria-hidden="true">500</h1></div><div class="flex justify-center py-8"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-server-crash w-24 h-24 text-destructive/50"><path d="M6 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-2"></path><path d="M6 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-2"></path><path d="M6 6h.01"></path><path d="M6 18h.01"></path><path d="m13 6-4 6h6l-4 6"></path></svg></div><div class="space-y-4"><h2 class="text-4xl font-bold text-foreground">Server Error</h2><p class="text-lg text-muted-foreground max-w-md mx-auto">Something went wrong on our end. We&#x27;re working to fix it.</p></div><div class="flex flex-col sm:flex-row items-center justify-center gap-4 pt-4"><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground h-11 rounded-md px-8 min-w-[140px]">Go Back</button><button class="inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 bg-primary text-primary-foreground shadow hover:bg-primary/90 h-11 rounded-md px-8 min-w-[140px]">Go Home</button></div><div class="pt-8 text-sm text-muted-foreground"><p>Need help? Contact<!-- --> <a href="mailto:support@djangocfg.com" class="text-primary hover:underline">support</a></p></div></div></div></div><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[9999] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/500","query":{},"buildId":"D_d9HRw5Yn7BRHAX5q89_","assetPrefix":"/cfg/admin","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +1 @@
1
- self.__BUILD_MANIFEST=function(e,a,s,t){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:0,errorRate:1e-4,numBits:0,numHashes:s,bitArray:[]},__routerFilterDynamic:{numItems:e,errorRate:1e-4,numBits:e,numHashes:s,bitArray:[]},"/":["static/chunks/pages/index-fe4802f9df0ac052.js"],"/404":["static/chunks/pages/404-9c41b6ebfe67f15e.js"],"/500":["static/chunks/pages/500-906d92e10e7e65fb.js"],"/_error":["static/chunks/pages/_error-2550e721b11b7946.js"],"/auth":["static/chunks/pages/auth-a872607f98742e5a.js"],"/legal/cookies":["static/chunks/pages/legal/cookies-b39c7f22c066e2c6.js"],"/legal/privacy":["static/chunks/pages/legal/privacy-5aedad0cf3a4f80f.js"],"/legal/security":["static/chunks/pages/legal/security-dbd854d0d5d483e2.js"],"/legal/terms":["static/chunks/pages/legal/terms-f3e1d2b9e5edf12f.js"],"/private":["static/chunks/23004-faae121bbfecc163.js",t,"static/chunks/pages/private-fe9faa86ecdb0ce6.js"],"/private/centrifugo":["static/chunks/43076-4be6a9794e9c3e8b.js",t,"static/chunks/pages/private/centrifugo-22532c65971225eb.js"],"/private/profile":["static/chunks/pages/private/profile-5cd57aac826857fd.js"],"/private/ui":["static/chunks/pages/private/ui-383e7f474cf22a18.js"],sortedPages:["/","/404","/500","/_app","/_error","/auth","/legal/cookies","/legal/privacy","/legal/security","/legal/terms","/private","/private/centrifugo","/private/profile","/private/ui"]}}(0,1e-4,NaN,"static/chunks/50314-48bd5701f62faf27.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
1
+ self.__BUILD_MANIFEST=function(e,a,s,t){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:0,errorRate:1e-4,numBits:0,numHashes:s,bitArray:[]},__routerFilterDynamic:{numItems:e,errorRate:1e-4,numBits:e,numHashes:s,bitArray:[]},"/":["static/chunks/pages/index-fe4802f9df0ac052.js"],"/404":["static/chunks/pages/404-9c41b6ebfe67f15e.js"],"/500":["static/chunks/pages/500-906d92e10e7e65fb.js"],"/_error":["static/chunks/pages/_error-2550e721b11b7946.js"],"/auth":["static/chunks/pages/auth-a872607f98742e5a.js"],"/legal/cookies":["static/chunks/pages/legal/cookies-97d279800f12aab4.js"],"/legal/privacy":["static/chunks/pages/legal/privacy-1d5e6cd94689247e.js"],"/legal/security":["static/chunks/pages/legal/security-55e49700e7a01f5a.js"],"/legal/terms":["static/chunks/pages/legal/terms-14c02bb2d3198352.js"],"/private":["static/chunks/94141-bc6d47f419b26b21.js",t,"static/chunks/pages/private-d4ccbe1265cbd853.js"],"/private/centrifugo":["static/chunks/43076-4be6a9794e9c3e8b.js",t,"static/chunks/pages/private/centrifugo-44a8313fa040e9ad.js"],"/private/profile":["static/chunks/pages/private/profile-5cd57aac826857fd.js"],"/private/ui":["static/chunks/pages/private/ui-383e7f474cf22a18.js"],sortedPages:["/","/404","/500","/_app","/_error","/auth","/legal/cookies","/legal/privacy","/legal/security","/legal/terms","/private","/private/centrifugo","/private/profile","/private/ui"]}}(0,1e-4,NaN,"static/chunks/50314-5ec79b293c2283dd.js"),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
@@ -1 +1 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[19430],{19430:(t,i,e)=>{e.r(i),e.d(i,{AudioProvider:()=>s});var h=e(83298);class s extends h.H{$$PROVIDER_TYPE="AUDIO";get type(){return"audio"}setup(t){super.setup(t),"audio"===this.type&&t.delegate.p("provider-setup",{detail:this})}get audio(){return this.j}}},83298:(t,i,e)=>{e.d(i,{H:()=>c});var h=e(60140),s=e(52598),a=e(56708),r=e(8334),n=e(88972),d=e(88347),l=e(95713),u=e(47707);class o{constructor(t,i){this.q=t,this.ph=i,this.Uh(),(0,s.QZ)(this.Vh.bind(this)),(0,r.zp)(this.Eh.bind(this))}ih=(0,n.EH)();Nh=!1;Qh=!1;Rh=!1;Oh=new d.R(this.Wh.bind(this));get j(){return this.q.media}get jg(){return this.ph.delegate}Eh(){this.Oh.P(),this.ih.empty()}Wh(){let t=this.q.currentTime;this.ph.$store.currentTime()!==t&&this.Mh(t)}Uh(){this.Lh("loadstart",this.ge),this.Lh("abort",this.Sh),this.Lh("emptied",this.Xh),this.Lh("error",this.Wb)}Yh(){this.Qh||(this.ih.add(this.Lh("loadeddata",this.Zh),this.Lh("loadedmetadata",this._h),this.Lh("canplay",this.Rb),this.Lh("canplaythrough",this.$h),this.Lh("durationchange",this.ai),this.Lh("play",this.bi),this.Lh("progress",this.ci),this.Lh("stalled",this.di),this.Lh("suspend",this.ei)),this.Qh=!0)}fi(){this.Rh||(this.ih.add(this.Lh("pause",this.gi),this.Lh("playing",this.hi),this.Lh("ratechange",this.ii),this.Lh("seeked",this.ji),this.Lh("seeking",this.ki),this.Lh("ended",this.li),this.Lh("volumechange",this.ac),this.Lh("waiting",this.mi)),this.Rh=!0)}ni=void 0;pi=void 0;Lh(t,i){return(0,h.k6)(this.j,t,i.bind(this))}qi(t){}Mh(t,i){this.jg.p("time-update",{detail:{currentTime:Math.min(t,this.ph.$store.seekableEnd()),played:this.j.played},trigger:i})}ge(t){if(3===this.j.networkState)return void this.Sh(t);this.Yh(),this.jg.p("load-start",{trigger:t})}Sh(t){this.jg.p("abort",{trigger:t})}Xh(){this.jg.p("emptied",{trigger:event})}Zh(t){this.jg.p("loaded-data",{trigger:t})}_h(t){this.Th(),this.fi(),this.jg.p("volume-change",{detail:{volume:this.j.volume,muted:this.j.muted}}),this.jg.p("loaded-metadata",{trigger:t}),u.I&&(0,a.i)(this.ph.$store.source())&&this.jg.lf(this.Ph(),t)}Ph(){return{duration:this.j.duration,buffered:this.j.buffered,seekable:this.j.seekable}}Th(){let t=!Number.isFinite(this.j.duration);this.jg.p("stream-type-change",{detail:t?"live":"on-demand"})}bi(t){this.ph.$store.canPlay&&this.jg.p("play",{trigger:t})}gi(t){(1!==this.j.readyState||this.Nh)&&(this.Nh=!1,this.Oh.P(),this.jg.p("pause",{trigger:t}))}Rb(t){this.jg.lf(this.Ph(),t)}$h(t){this.ph.$store.started()||this.jg.p("can-play-through",{trigger:t,detail:this.Ph()})}hi(t){this.Nh=!1,this.jg.p("playing",{trigger:t}),this.Oh.O()}di(t){this.jg.p("stalled",{trigger:t}),this.j.readyState<3&&(this.Nh=!0,this.jg.p("waiting",{trigger:t}))}mi(t){this.j.readyState<3&&(this.Nh=!0,this.jg.p("waiting",{trigger:t}))}li(t){this.Oh.P(),this.Mh(this.j.duration,t),this.jg.p("end",{trigger:t}),this.ph.$store.loop()?this.oi():this.jg.p("ended",{trigger:t})}Vh(){this.ph.$store.paused()&&(0,h.k6)(this.j,"timeupdate",this.Vb.bind(this))}Vb(t){this.Mh(this.j.currentTime,t)}ai(t){this.Th(),this.ph.$store.ended()&&this.Mh(this.j.duration,t),this.jg.p("duration-change",{detail:this.j.duration,trigger:t})}ac(t){this.jg.p("volume-change",{detail:{volume:this.j.volume,muted:this.j.muted},trigger:t})}ji(t){this.Mh(this.j.currentTime,t),this.jg.p("seeked",{detail:this.j.currentTime,trigger:t}),Math.trunc(this.j.currentTime)===Math.trunc(this.j.duration)&&(0,l.y)(this.j.duration)>(0,l.y)(this.j.currentTime)&&(this.Mh(this.j.duration,t),this.j.ended||this.ph.player.dispatchEvent(new h.vP("media-play-request",{trigger:t})))}ki(t){this.jg.p("seeking",{detail:this.j.currentTime,trigger:t})}ci(t){this.jg.p("progress",{detail:{buffered:this.j.buffered,seekable:this.j.seekable},trigger:t})}oi(){(0,s.gD)(this.j.controls)&&(this.j.controls=!1),this.ph.player.dispatchEvent(new h.vP("media-loop-request"))}ei(t){this.jg.p("suspend",{trigger:t})}ii(t){this.jg.p("rate-change",{detail:this.j.playbackRate,trigger:t})}Wb(t){let i=this.j.error;i&&this.jg.p("error",{detail:{message:i.message,code:i.code,mediaError:i},trigger:t})}}class g{constructor(t,i){this.q=t,this.ph=i,this.ri.onaddtrack=this.ti.bind(this),this.ri.onremovetrack=this.ui.bind(this),this.ri.onchange=this.vi.bind(this),(0,h.k6)(this.ph.audioTracks,"change",this.wi.bind(this))}get ri(){return this.q.media.audioTracks}ti(t){let i=t.track;if(""===i.label)return;let e={id:i.id+"",label:i.label,language:i.language,kind:i.kind,selected:!1};this.ph.audioTracks[u.N](e,t),i.enabled&&(e.selected=!0)}ui(t){let i=this.ph.audioTracks.getById(t.track.id);i&&this.ph.audioTracks[u.W](i,t)}vi(t){let i=this.si();if(!i)return;let e=this.ph.audioTracks.getById(i.id);e&&this.ph.audioTracks[u.L](e,!0,t)}si(){return Array.from(this.ri).find(t=>t.enabled)}wi(t){let{current:i}=t.detail;if(!i)return;let e=this.ri.getTrackById(i.id);if(e){let t=this.si();t&&(t.enabled=!1),e.enabled=!0}}}class c{constructor(t){this.j=t}setup(t){new o(this,t),"audioTracks"in this.media&&new g(this,t)}get type(){return""}get media(){return this.j}get paused(){return this.j.paused}get muted(){return this.j.muted}set muted(t){this.j.muted=t}get volume(){return this.j.volume}set volume(t){this.j.volume=t}get currentTime(){return this.j.currentTime}set currentTime(t){this.j.currentTime=t}get playsinline(){return this.j.hasAttribute("playsinline")}set playsinline(t){(0,h.Bq)(this.j,"playsinline",t)}get playbackRate(){return this.j.playbackRate}set playbackRate(t){this.j.playbackRate=t}async play(){return this.j.play()}async pause(){return this.j.pause()}async loadSource({src:t},i){this.j.preload=i,(0,a.b)(t)?this.j.srcObject=t:(this.j.srcObject=null,this.j.src=(0,s.Kg)(t)?t:window.URL.createObjectURL(t)),this.j.load()}}},88347:(t,i,e)=>{e.d(i,{H:()=>d,R:()=>n});var h=e(8334),s=e(52598),a=e(60140),r=e(47707);class n{constructor(t){this.jf=t}xi;O(){(0,s.b0)(this.xi)&&this.yi()}P(){(0,s.Et)(this.xi)&&window.cancelAnimationFrame(this.xi),this.xi=void 0}yi(){this.xi=window.requestAnimationFrame(()=>{(0,s.b0)(this.xi)||(this.jf(),this.yi())})}}class d{constructor(t){this.qa=t}ph;za=null;qh=null;nh={};oh=new Set;get instance(){return this.za}setup(t,i){this.ph=i;let e=(0,h.se)(i.$store.streamType).includes("live"),n=(0,h.se)(i.$store.streamType).includes("ll-");this.za=new t({lowLatencyMode:n,backBufferLength:n?4:e?8:void 0,renderTextTracksNatively:!1,...this.nh});let d=this.rh.bind(this);for(let i of Object.values(t.Events))this.za.on(i,d);for(let i of(this.za.on(t.Events.ERROR,this.Wb.bind(this)),this.oh))i(this.za);i.player.dispatchEvent(new a.vP("hls-instance",{detail:this.za})),this.za.attachMedia(this.qa),this.za.on(t.Events.AUDIO_TRACK_SWITCHED,this.sh.bind(this)),this.za.on(t.Events.LEVEL_SWITCHED,this.th.bind(this)),this.za.on(t.Events.LEVEL_LOADED,this.uh.bind(this)),this.za.on(t.Events.NON_NATIVE_TEXT_TRACKS_FOUND,this.vh.bind(this)),this.za.on(t.Events.CUES_PARSED,this.wh.bind(this)),i.qualities[r.F]=this.xh.bind(this),(0,a.k6)(i.qualities,"change",this.Pf.bind(this)),(0,a.k6)(i.audioTracks,"change",this.yh.bind(this)),this.qh=(0,s.QZ)(this.zh.bind(this))}zh(){if(!this.ph.$store.live())return;let t=new n(this.Ah.bind(this));return t.O(),t.P.bind(t)}Ah(){this.ph.$store.liveSyncPosition.set(this.za?.liveSyncPosition??1/0)}rh(t,i){this.ph.player.dispatchEvent(new a.vP((0,a.BW)(t),{detail:i}))}vh(t,i){let e=new a.vP(t,{detail:i}),h=-1;for(let t=0;t<i.tracks.length;t++){let s=i.tracks[t],a=s.subtitleTrack??s.closedCaptions,n=new r.G({id:`hls-${s.kind}${t}`,src:a?.url,label:s.label,language:a?.lang,kind:s.kind});n[r.H]=2,n[r.J]=()=>{"showing"===n.mode?(this.za.subtitleTrack=t,h=t):h===t&&(this.za.subtitleTrack=-1,h=-1)},s.default&&n.setMode("showing",e),this.ph.textTracks.add(n,e)}}wh(t,i){let e=this.ph.textTracks.getById(`hls-${i.track}`);if(!e)return;let h=new a.vP(t,{detail:i});for(let t of i.cues)t.positionAlign="auto",e.addCue(t,h)}sh(t,i){let e=this.ph.audioTracks[i.id];e&&this.ph.audioTracks[r.L](e,!0,new a.vP(t,{detail:i}))}th(t,i){let e=this.ph.qualities[i.level];e&&this.ph.qualities[r.L](e,!0,new a.vP(t,{detail:i}))}uh(t,i){if(this.ph.$store.canPlay())return;let{type:e,live:h,totalduration:s}=i.details,n=new a.vP(t,{detail:i});this.ph.delegate.p("stream-type-change",{detail:h?"EVENT"===e&&Number.isFinite(s)?"live:dvr":"live":"on-demand",trigger:n}),this.ph.delegate.p("duration-change",{detail:s,trigger:n});let d=this.za.media;for(let t of(-1===this.za.currentLevel&&this.ph.qualities[r.K](!0,n),this.za.audioTracks))this.ph.audioTracks[r.N]({id:t.id+"",label:t.name,language:t.lang||"",kind:"main"},n);for(let t of this.za.levels)this.ph.qualities[r.N]({width:t.width,height:t.height,codec:t.codecSet,bitrate:t.bitrate},n);d.dispatchEvent(new a.vP("canplay",{trigger:n}))}Wb(t,i){if(i.fatal)switch(i.type){case"networkError":this.za?.startLoad();break;case"mediaError":this.za?.recoverMediaError();break;default:this.za?.destroy(),this.za=null}}xh(){this.za&&(this.za.currentLevel=-1)}Pf(){let{qualities:t}=this.ph;this.za&&!t.auto&&(this.za[t.switch+"Level"]=t.selectedIndex,r.P&&(this.qa.currentTime=this.qa.currentTime))}yh(){let{audioTracks:t}=this.ph;this.za&&this.za.audioTrack!==t.selectedIndex&&(this.za.audioTrack=t.selectedIndex)}Jg(){this.ph&&(this.ph.qualities[r.F]=void 0),this.za?.destroy(),this.za=null,this.qh?.(),this.qh=null}}}}]);
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[19430],{64192:(t,i,e)=>{e.r(i),e.d(i,{AudioProvider:()=>s});var h=e(83298);class s extends h.H{$$PROVIDER_TYPE="AUDIO";get type(){return"audio"}setup(t){super.setup(t),"audio"===this.type&&t.delegate.p("provider-setup",{detail:this})}get audio(){return this.j}}},83298:(t,i,e)=>{e.d(i,{H:()=>c});var h=e(60140),s=e(52598),a=e(56708),r=e(8334),n=e(88972),d=e(88347),l=e(95713),u=e(47707);class o{constructor(t,i){this.q=t,this.ph=i,this.Uh(),(0,s.QZ)(this.Vh.bind(this)),(0,r.zp)(this.Eh.bind(this))}ih=(0,n.EH)();Nh=!1;Qh=!1;Rh=!1;Oh=new d.R(this.Wh.bind(this));get j(){return this.q.media}get jg(){return this.ph.delegate}Eh(){this.Oh.P(),this.ih.empty()}Wh(){let t=this.q.currentTime;this.ph.$store.currentTime()!==t&&this.Mh(t)}Uh(){this.Lh("loadstart",this.ge),this.Lh("abort",this.Sh),this.Lh("emptied",this.Xh),this.Lh("error",this.Wb)}Yh(){this.Qh||(this.ih.add(this.Lh("loadeddata",this.Zh),this.Lh("loadedmetadata",this._h),this.Lh("canplay",this.Rb),this.Lh("canplaythrough",this.$h),this.Lh("durationchange",this.ai),this.Lh("play",this.bi),this.Lh("progress",this.ci),this.Lh("stalled",this.di),this.Lh("suspend",this.ei)),this.Qh=!0)}fi(){this.Rh||(this.ih.add(this.Lh("pause",this.gi),this.Lh("playing",this.hi),this.Lh("ratechange",this.ii),this.Lh("seeked",this.ji),this.Lh("seeking",this.ki),this.Lh("ended",this.li),this.Lh("volumechange",this.ac),this.Lh("waiting",this.mi)),this.Rh=!0)}ni=void 0;pi=void 0;Lh(t,i){return(0,h.k6)(this.j,t,i.bind(this))}qi(t){}Mh(t,i){this.jg.p("time-update",{detail:{currentTime:Math.min(t,this.ph.$store.seekableEnd()),played:this.j.played},trigger:i})}ge(t){if(3===this.j.networkState)return void this.Sh(t);this.Yh(),this.jg.p("load-start",{trigger:t})}Sh(t){this.jg.p("abort",{trigger:t})}Xh(){this.jg.p("emptied",{trigger:event})}Zh(t){this.jg.p("loaded-data",{trigger:t})}_h(t){this.Th(),this.fi(),this.jg.p("volume-change",{detail:{volume:this.j.volume,muted:this.j.muted}}),this.jg.p("loaded-metadata",{trigger:t}),u.I&&(0,a.i)(this.ph.$store.source())&&this.jg.lf(this.Ph(),t)}Ph(){return{duration:this.j.duration,buffered:this.j.buffered,seekable:this.j.seekable}}Th(){let t=!Number.isFinite(this.j.duration);this.jg.p("stream-type-change",{detail:t?"live":"on-demand"})}bi(t){this.ph.$store.canPlay&&this.jg.p("play",{trigger:t})}gi(t){(1!==this.j.readyState||this.Nh)&&(this.Nh=!1,this.Oh.P(),this.jg.p("pause",{trigger:t}))}Rb(t){this.jg.lf(this.Ph(),t)}$h(t){this.ph.$store.started()||this.jg.p("can-play-through",{trigger:t,detail:this.Ph()})}hi(t){this.Nh=!1,this.jg.p("playing",{trigger:t}),this.Oh.O()}di(t){this.jg.p("stalled",{trigger:t}),this.j.readyState<3&&(this.Nh=!0,this.jg.p("waiting",{trigger:t}))}mi(t){this.j.readyState<3&&(this.Nh=!0,this.jg.p("waiting",{trigger:t}))}li(t){this.Oh.P(),this.Mh(this.j.duration,t),this.jg.p("end",{trigger:t}),this.ph.$store.loop()?this.oi():this.jg.p("ended",{trigger:t})}Vh(){this.ph.$store.paused()&&(0,h.k6)(this.j,"timeupdate",this.Vb.bind(this))}Vb(t){this.Mh(this.j.currentTime,t)}ai(t){this.Th(),this.ph.$store.ended()&&this.Mh(this.j.duration,t),this.jg.p("duration-change",{detail:this.j.duration,trigger:t})}ac(t){this.jg.p("volume-change",{detail:{volume:this.j.volume,muted:this.j.muted},trigger:t})}ji(t){this.Mh(this.j.currentTime,t),this.jg.p("seeked",{detail:this.j.currentTime,trigger:t}),Math.trunc(this.j.currentTime)===Math.trunc(this.j.duration)&&(0,l.y)(this.j.duration)>(0,l.y)(this.j.currentTime)&&(this.Mh(this.j.duration,t),this.j.ended||this.ph.player.dispatchEvent(new h.vP("media-play-request",{trigger:t})))}ki(t){this.jg.p("seeking",{detail:this.j.currentTime,trigger:t})}ci(t){this.jg.p("progress",{detail:{buffered:this.j.buffered,seekable:this.j.seekable},trigger:t})}oi(){(0,s.gD)(this.j.controls)&&(this.j.controls=!1),this.ph.player.dispatchEvent(new h.vP("media-loop-request"))}ei(t){this.jg.p("suspend",{trigger:t})}ii(t){this.jg.p("rate-change",{detail:this.j.playbackRate,trigger:t})}Wb(t){let i=this.j.error;i&&this.jg.p("error",{detail:{message:i.message,code:i.code,mediaError:i},trigger:t})}}class g{constructor(t,i){this.q=t,this.ph=i,this.ri.onaddtrack=this.ti.bind(this),this.ri.onremovetrack=this.ui.bind(this),this.ri.onchange=this.vi.bind(this),(0,h.k6)(this.ph.audioTracks,"change",this.wi.bind(this))}get ri(){return this.q.media.audioTracks}ti(t){let i=t.track;if(""===i.label)return;let e={id:i.id+"",label:i.label,language:i.language,kind:i.kind,selected:!1};this.ph.audioTracks[u.N](e,t),i.enabled&&(e.selected=!0)}ui(t){let i=this.ph.audioTracks.getById(t.track.id);i&&this.ph.audioTracks[u.W](i,t)}vi(t){let i=this.si();if(!i)return;let e=this.ph.audioTracks.getById(i.id);e&&this.ph.audioTracks[u.L](e,!0,t)}si(){return Array.from(this.ri).find(t=>t.enabled)}wi(t){let{current:i}=t.detail;if(!i)return;let e=this.ri.getTrackById(i.id);if(e){let t=this.si();t&&(t.enabled=!1),e.enabled=!0}}}class c{constructor(t){this.j=t}setup(t){new o(this,t),"audioTracks"in this.media&&new g(this,t)}get type(){return""}get media(){return this.j}get paused(){return this.j.paused}get muted(){return this.j.muted}set muted(t){this.j.muted=t}get volume(){return this.j.volume}set volume(t){this.j.volume=t}get currentTime(){return this.j.currentTime}set currentTime(t){this.j.currentTime=t}get playsinline(){return this.j.hasAttribute("playsinline")}set playsinline(t){(0,h.Bq)(this.j,"playsinline",t)}get playbackRate(){return this.j.playbackRate}set playbackRate(t){this.j.playbackRate=t}async play(){return this.j.play()}async pause(){return this.j.pause()}async loadSource({src:t},i){this.j.preload=i,(0,a.b)(t)?this.j.srcObject=t:(this.j.srcObject=null,this.j.src=(0,s.Kg)(t)?t:window.URL.createObjectURL(t)),this.j.load()}}},88347:(t,i,e)=>{e.d(i,{H:()=>d,R:()=>n});var h=e(8334),s=e(52598),a=e(60140),r=e(47707);class n{constructor(t){this.jf=t}xi;O(){(0,s.b0)(this.xi)&&this.yi()}P(){(0,s.Et)(this.xi)&&window.cancelAnimationFrame(this.xi),this.xi=void 0}yi(){this.xi=window.requestAnimationFrame(()=>{(0,s.b0)(this.xi)||(this.jf(),this.yi())})}}class d{constructor(t){this.qa=t}ph;za=null;qh=null;nh={};oh=new Set;get instance(){return this.za}setup(t,i){this.ph=i;let e=(0,h.se)(i.$store.streamType).includes("live"),n=(0,h.se)(i.$store.streamType).includes("ll-");this.za=new t({lowLatencyMode:n,backBufferLength:n?4:e?8:void 0,renderTextTracksNatively:!1,...this.nh});let d=this.rh.bind(this);for(let i of Object.values(t.Events))this.za.on(i,d);for(let i of(this.za.on(t.Events.ERROR,this.Wb.bind(this)),this.oh))i(this.za);i.player.dispatchEvent(new a.vP("hls-instance",{detail:this.za})),this.za.attachMedia(this.qa),this.za.on(t.Events.AUDIO_TRACK_SWITCHED,this.sh.bind(this)),this.za.on(t.Events.LEVEL_SWITCHED,this.th.bind(this)),this.za.on(t.Events.LEVEL_LOADED,this.uh.bind(this)),this.za.on(t.Events.NON_NATIVE_TEXT_TRACKS_FOUND,this.vh.bind(this)),this.za.on(t.Events.CUES_PARSED,this.wh.bind(this)),i.qualities[r.F]=this.xh.bind(this),(0,a.k6)(i.qualities,"change",this.Pf.bind(this)),(0,a.k6)(i.audioTracks,"change",this.yh.bind(this)),this.qh=(0,s.QZ)(this.zh.bind(this))}zh(){if(!this.ph.$store.live())return;let t=new n(this.Ah.bind(this));return t.O(),t.P.bind(t)}Ah(){this.ph.$store.liveSyncPosition.set(this.za?.liveSyncPosition??1/0)}rh(t,i){this.ph.player.dispatchEvent(new a.vP((0,a.BW)(t),{detail:i}))}vh(t,i){let e=new a.vP(t,{detail:i}),h=-1;for(let t=0;t<i.tracks.length;t++){let s=i.tracks[t],a=s.subtitleTrack??s.closedCaptions,n=new r.G({id:`hls-${s.kind}${t}`,src:a?.url,label:s.label,language:a?.lang,kind:s.kind});n[r.H]=2,n[r.J]=()=>{"showing"===n.mode?(this.za.subtitleTrack=t,h=t):h===t&&(this.za.subtitleTrack=-1,h=-1)},s.default&&n.setMode("showing",e),this.ph.textTracks.add(n,e)}}wh(t,i){let e=this.ph.textTracks.getById(`hls-${i.track}`);if(!e)return;let h=new a.vP(t,{detail:i});for(let t of i.cues)t.positionAlign="auto",e.addCue(t,h)}sh(t,i){let e=this.ph.audioTracks[i.id];e&&this.ph.audioTracks[r.L](e,!0,new a.vP(t,{detail:i}))}th(t,i){let e=this.ph.qualities[i.level];e&&this.ph.qualities[r.L](e,!0,new a.vP(t,{detail:i}))}uh(t,i){if(this.ph.$store.canPlay())return;let{type:e,live:h,totalduration:s}=i.details,n=new a.vP(t,{detail:i});this.ph.delegate.p("stream-type-change",{detail:h?"EVENT"===e&&Number.isFinite(s)?"live:dvr":"live":"on-demand",trigger:n}),this.ph.delegate.p("duration-change",{detail:s,trigger:n});let d=this.za.media;for(let t of(-1===this.za.currentLevel&&this.ph.qualities[r.K](!0,n),this.za.audioTracks))this.ph.audioTracks[r.N]({id:t.id+"",label:t.name,language:t.lang||"",kind:"main"},n);for(let t of this.za.levels)this.ph.qualities[r.N]({width:t.width,height:t.height,codec:t.codecSet,bitrate:t.bitrate},n);d.dispatchEvent(new a.vP("canplay",{trigger:n}))}Wb(t,i){if(i.fatal)switch(i.type){case"networkError":this.za?.startLoad();break;case"mediaError":this.za?.recoverMediaError();break;default:this.za?.destroy(),this.za=null}}xh(){this.za&&(this.za.currentLevel=-1)}Pf(){let{qualities:t}=this.ph;this.za&&!t.auto&&(this.za[t.switch+"Level"]=t.selectedIndex,r.P&&(this.qa.currentTime=this.qa.currentTime))}yh(){let{audioTracks:t}=this.ph;this.za&&this.za.audioTrack!==t.selectedIndex&&(this.za.audioTrack=t.selectedIndex)}Jg(){this.ph&&(this.ph.qualities[r.F]=void 0),this.za?.destroy(),this.za=null,this.qh?.(),this.qh=null}}}}]);