From 1c40e5e843a91f7cc6c8d5846fde8caec316294f Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Tue, 23 May 2023 20:42:59 +0200 Subject: [PATCH 01/17] Black'd the camera plugin and writer. Also, proper fix for the multi-inheritance problem of the ffmpeg writers. --- platypush/plugins/camera/__init__.py | 361 +++++++++++++----- .../plugins/camera/model/writer/__init__.py | 18 +- .../plugins/camera/model/writer/ffmpeg.py | 99 +++-- 3 files changed, 347 insertions(+), 131 deletions(-) diff --git a/platypush/plugins/camera/__init__.py b/platypush/plugins/camera/__init__.py index 65f667ee..8019abf8 100644 --- a/platypush/plugins/camera/__init__.py +++ b/platypush/plugins/camera/__init__.py @@ -10,21 +10,39 @@ from contextlib import contextmanager from datetime import datetime from multiprocessing import Process from queue import Queue -from typing import Optional, Union, Dict, Tuple, IO +from typing import Generator, Optional, Union, Dict, Tuple, IO from platypush.config import Config -from platypush.message.event.camera import CameraRecordingStartedEvent, CameraPictureTakenEvent, \ - CameraRecordingStoppedEvent, CameraVideoRenderedEvent +from platypush.message.event.camera import ( + CameraRecordingStartedEvent, + CameraPictureTakenEvent, + CameraRecordingStoppedEvent, + CameraVideoRenderedEvent, +) from platypush.plugins import Plugin, action from platypush.plugins.camera.model.camera import CameraInfo, Camera -from platypush.plugins.camera.model.exceptions import CameraException, CaptureAlreadyRunningException +from platypush.plugins.camera.model.exceptions import ( + CameraException, + CaptureAlreadyRunningException, +) from platypush.plugins.camera.model.writer import VideoWriter, StreamWriter from platypush.plugins.camera.model.writer.ffmpeg import FFmpegFileWriter -from platypush.plugins.camera.model.writer.preview import PreviewWriter, PreviewWriterFactory +from platypush.plugins.camera.model.writer.preview import ( + PreviewWriter, + PreviewWriterFactory, +) from platypush.utils import get_plugin_name_by_class -__all__ = ['Camera', 'CameraInfo', 'CameraException', 'CameraPlugin', 'CaptureAlreadyRunningException', - 'VideoWriter', 'StreamWriter', 'PreviewWriter'] +__all__ = [ + 'Camera', + 'CameraInfo', + 'CameraException', + 'CameraPlugin', + 'CaptureAlreadyRunningException', + 'VideoWriter', + 'StreamWriter', + 'PreviewWriter', +] class CameraPlugin(Plugin, ABC): @@ -66,15 +84,32 @@ class CameraPlugin(Plugin, ABC): _camera_info_class = CameraInfo _video_writer_class = FFmpegFileWriter - def __init__(self, device: Optional[Union[int, str]] = None, resolution: Tuple[int, int] = (640, 480), - frames_dir: Optional[str] = None, warmup_frames: int = 5, warmup_seconds: Optional[float] = 0., - capture_timeout: Optional[float] = 20.0, scale_x: Optional[float] = None, - scale_y: Optional[float] = None, rotate: Optional[float] = None, grayscale: Optional[bool] = None, - color_transform: Optional[Union[int, str]] = None, fps: float = 16, horizontal_flip: bool = False, - vertical_flip: bool = False, input_format: Optional[str] = None, output_format: Optional[str] = None, - stream_format: str = 'mjpeg', listen_port: Optional[int] = 5000, bind_address: str = '0.0.0.0', - ffmpeg_bin: str = 'ffmpeg', input_codec: Optional[str] = None, output_codec: Optional[str] = None, - **kwargs): + def __init__( + self, + device: Optional[Union[int, str]] = None, + resolution: Tuple[int, int] = (640, 480), + frames_dir: Optional[str] = None, + warmup_frames: int = 5, + warmup_seconds: Optional[float] = 0.0, + capture_timeout: Optional[float] = 20.0, + scale_x: Optional[float] = None, + scale_y: Optional[float] = None, + rotate: Optional[float] = None, + grayscale: Optional[bool] = None, + color_transform: Optional[Union[int, str]] = None, + fps: float = 16, + horizontal_flip: bool = False, + vertical_flip: bool = False, + input_format: Optional[str] = None, + output_format: Optional[str] = None, + stream_format: str = 'mjpeg', + listen_port: Optional[int] = 5000, + bind_address: str = '0.0.0.0', + ffmpeg_bin: str = 'ffmpeg', + input_codec: Optional[str] = None, + output_codec: Optional[str] = None, + **kwargs, + ): """ :param device: Identifier of the default capturing device. :param resolution: Default resolution, as a tuple of two integers. @@ -117,22 +152,38 @@ class CameraPlugin(Plugin, ABC): """ super().__init__(**kwargs) - self.workdir = os.path.join(Config.get('workdir'), get_plugin_name_by_class(self)) + self.workdir = os.path.join( + Config.get('workdir'), get_plugin_name_by_class(self) + ) pathlib.Path(self.workdir).mkdir(mode=0o755, exist_ok=True, parents=True) # noinspection PyArgumentList - self.camera_info = self._camera_info_class(device, color_transform=color_transform, warmup_frames=warmup_frames, - warmup_seconds=warmup_seconds, rotate=rotate, scale_x=scale_x, - scale_y=scale_y, capture_timeout=capture_timeout, fps=fps, - input_format=input_format, output_format=output_format, - stream_format=stream_format, resolution=resolution, - grayscale=grayscale, listen_port=listen_port, - horizontal_flip=horizontal_flip, vertical_flip=vertical_flip, - ffmpeg_bin=ffmpeg_bin, input_codec=input_codec, - output_codec=output_codec, bind_address=bind_address, - frames_dir=os.path.abspath( - os.path.expanduser(frames_dir or - os.path.join(self.workdir, 'frames')))) + self.camera_info = self._camera_info_class( + device, + color_transform=color_transform, + warmup_frames=warmup_frames, + warmup_seconds=warmup_seconds, + rotate=rotate, + scale_x=scale_x, + scale_y=scale_y, + capture_timeout=capture_timeout, + fps=fps, + input_format=input_format, + output_format=output_format, + stream_format=stream_format, + resolution=resolution, + grayscale=grayscale, + listen_port=listen_port, + horizontal_flip=horizontal_flip, + vertical_flip=vertical_flip, + ffmpeg_bin=ffmpeg_bin, + input_codec=input_codec, + output_codec=output_codec, + bind_address=bind_address, + frames_dir=os.path.abspath( + os.path.expanduser(frames_dir or os.path.join(self.workdir, 'frames')) + ), + ) self._devices: Dict[Union[int, str], Camera] = {} self._streams: Dict[Union[int, str], Camera] = {} @@ -142,7 +193,9 @@ class CameraPlugin(Plugin, ABC): merged_info.set(**info) return merged_info - def open_device(self, device: Optional[Union[int, str]] = None, stream: bool = False, **params) -> Camera: + def open_device( + self, device: Optional[Union[int, str]] = None, stream: bool = False, **params + ) -> Camera: """ Initialize and open a device. @@ -160,7 +213,11 @@ class CameraPlugin(Plugin, ABC): assert device is not None, 'No device specified/configured' if device in self._devices: camera = self._devices[device] - if camera.capture_thread and camera.capture_thread.is_alive() and camera.start_event.is_set(): + if ( + camera.capture_thread + and camera.capture_thread.is_alive() + and camera.start_event.is_set() + ): raise CaptureAlreadyRunningException(device) camera.start_event.clear() @@ -177,8 +234,9 @@ class CameraPlugin(Plugin, ABC): camera.stream = writer_class(camera=camera, plugin=self) if camera.info.frames_dir: - pathlib.Path(os.path.abspath(os.path.expanduser(camera.info.frames_dir))).mkdir( - mode=0o755, exist_ok=True, parents=True) + pathlib.Path( + os.path.abspath(os.path.expanduser(camera.info.frames_dir)) + ).mkdir(mode=0o755, exist_ok=True, parents=True) self._devices[device] = camera return camera @@ -205,15 +263,20 @@ class CameraPlugin(Plugin, ABC): :param camera: Camera object. ``camera.info.capture_timeout`` is used as a capture thread termination timeout if set. """ - if camera.capture_thread and camera.capture_thread.is_alive() and \ - threading.get_ident() != camera.capture_thread.ident: + if ( + camera.capture_thread + and camera.capture_thread.is_alive() + and threading.get_ident() != camera.capture_thread.ident + ): try: camera.capture_thread.join(timeout=camera.info.capture_timeout) except Exception as e: - self.logger.warning('Error on FFmpeg capture wait: {}'.format(str(e))) + self.logger.warning('Error on FFmpeg capture wait: %s', e) @contextmanager - def open(self, device: Optional[Union[int, str]] = None, stream: bool = None, **info) -> Camera: + def open( + self, device: Optional[Union[int, str]] = None, stream: bool = None, **info + ) -> Generator[Camera, None, None]: """ Initialize and open a device using a context manager pattern. @@ -267,6 +330,7 @@ class CameraPlugin(Plugin, ABC): :param format: Output format. """ from PIL import Image + if isinstance(frame, bytes): frame = list(frame) elif not isinstance(frame, Image.Image): @@ -278,16 +342,28 @@ class CameraPlugin(Plugin, ABC): frame.save(filepath, **save_args) - def _store_frame(self, frame, frames_dir: Optional[str] = None, image_file: Optional[str] = None, - *args, **kwargs) -> str: + def _store_frame( + self, + frame, + frames_dir: Optional[str] = None, + image_file: Optional[str] = None, + *args, + **kwargs, + ) -> str: """ :meth:`.store_frame` wrapper. """ if image_file: filepath = os.path.abspath(os.path.expanduser(image_file)) else: - filepath = os.path.abspath(os.path.expanduser( - os.path.join(frames_dir or '', datetime.now().strftime('%Y-%m-%d_%H-%M-%S-%f.jpg')))) + filepath = os.path.abspath( + os.path.expanduser( + os.path.join( + frames_dir or '', + datetime.now().strftime('%Y-%m-%d_%H-%M-%S-%f.jpg'), + ) + ) + ) pathlib.Path(filepath).parent.mkdir(mode=0o755, exist_ok=True, parents=True) self.store_frame(frame, filepath, *args, **kwargs) @@ -295,7 +371,9 @@ class CameraPlugin(Plugin, ABC): def start_preview(self, camera: Camera): if camera.preview and not camera.preview.closed: - self.logger.info('A preview window is already active on device {}'.format(camera.info.device)) + self.logger.info( + 'A preview window is already active on device %s', camera.info.device + ) return camera.preview = PreviewWriterFactory.get(camera, self) @@ -315,7 +393,9 @@ class CameraPlugin(Plugin, ABC): camera.preview = None - def frame_processor(self, frame_queue: Queue, camera: Camera, image_file: Optional[str] = None): + def frame_processor( + self, frame_queue: Queue, camera: Camera, image_file: Optional[str] = None + ): while True: frame = frame_queue.get() if frame is None: @@ -326,18 +406,31 @@ class CameraPlugin(Plugin, ABC): frame = self.to_grayscale(frame) frame = self.rotate_frame(frame, camera.info.rotate) - frame = self.flip_frame(frame, camera.info.horizontal_flip, camera.info.vertical_flip) + frame = self.flip_frame( + frame, camera.info.horizontal_flip, camera.info.vertical_flip + ) frame = self.scale_frame(frame, camera.info.scale_x, camera.info.scale_y) for output in camera.get_outputs(): output.write(frame) if camera.info.frames_dir or image_file: - self._store_frame(frame=frame, frames_dir=camera.info.frames_dir, image_file=image_file) + self._store_frame( + frame=frame, + frames_dir=camera.info.frames_dir, + image_file=image_file, + ) - def capturing_thread(self, camera: Camera, duration: Optional[float] = None, video_file: Optional[str] = None, - image_file: Optional[str] = None, n_frames: Optional[int] = None, preview: bool = False, - **kwargs): + def capturing_thread( + self, + camera: Camera, + duration: Optional[float] = None, + video_file: Optional[str] = None, + image_file: Optional[str] = None, + n_frames: Optional[int] = None, + preview: bool = False, + **kwargs, + ): """ Camera capturing thread. @@ -366,25 +459,36 @@ class CameraPlugin(Plugin, ABC): if duration and camera.info.warmup_seconds: duration = duration + camera.info.warmup_seconds if video_file: - camera.file_writer = self._video_writer_class(camera=camera, plugin=self, output_file=video_file) + camera.file_writer = self._video_writer_class( + camera=camera, plugin=self, output_file=video_file + ) frame_queue = Queue() - frame_processor = threading.Thread(target=self.frame_processor, - kwargs=dict(frame_queue=frame_queue, camera=camera, image_file=image_file)) + frame_processor = threading.Thread( + target=self.frame_processor, + kwargs={ + 'frame_queue': frame_queue, + 'camera': camera, + 'image_file': image_file, + }, + ) frame_processor.start() self.fire_event(CameraRecordingStartedEvent(**evt_args)) try: while camera.start_event.is_set(): - if (duration and time.time() - recording_started_time >= duration) \ - or (n_frames and captured_frames >= n_frames): + if (duration and time.time() - recording_started_time >= duration) or ( + n_frames and captured_frames >= n_frames + ): break frame_capture_start = time.time() try: frame = self.capture_frame(camera, **kwargs) if not frame: - self.logger.warning('Invalid frame received, terminating the capture session') + self.logger.warning( + 'Invalid frame received, terminating the capture session' + ) break frame_queue.put(frame) @@ -392,12 +496,20 @@ class CameraPlugin(Plugin, ABC): self.logger.warning(str(e)) continue - if not n_frames or not camera.info.warmup_seconds or \ - (time.time() - recording_started_time >= camera.info.warmup_seconds): + if ( + not n_frames + or not camera.info.warmup_seconds + or ( + time.time() - recording_started_time + >= camera.info.warmup_seconds + ) + ): captured_frames += 1 if camera.info.fps: - wait_time = (1. / camera.info.fps) - (time.time() - frame_capture_start) + wait_time = (1.0 / camera.info.fps) - ( + time.time() - frame_capture_start + ) if wait_time > 0: time.sleep(wait_time) finally: @@ -407,7 +519,7 @@ class CameraPlugin(Plugin, ABC): try: output.close() except Exception as e: - self.logger.warning('Could not close camera output: {}'.format(str(e))) + self.logger.warning('Could not close camera output: %s', e) self.close_device(camera, wait_capture=False) frame_processor.join(timeout=5.0) @@ -426,17 +538,26 @@ class CameraPlugin(Plugin, ABC): :param camera: An initialized :class:`platypush.plugins.camera.Camera` object. :param preview: Show a preview of the camera frames. """ - assert not (camera.capture_thread and camera.capture_thread.is_alive()), \ - 'A capture session is already in progress' + assert not ( + camera.capture_thread and camera.capture_thread.is_alive() + ), 'A capture session is already in progress' - camera.capture_thread = threading.Thread(target=self.capturing_thread, args=(camera, *args), - kwargs={'preview': preview, **kwargs}) + camera.capture_thread = threading.Thread( + target=self.capturing_thread, + args=(camera, *args), + kwargs={'preview': preview, **kwargs}, + ) camera.capture_thread.start() camera.start_event.set() @action - def capture_video(self, duration: Optional[float] = None, video_file: Optional[str] = None, preview: bool = False, - **camera) -> Union[str, dict]: + def capture_video( + self, + duration: Optional[float] = None, + video_file: Optional[str] = None, + preview: bool = False, + **camera, + ) -> Union[str, dict]: """ Capture a video. @@ -448,8 +569,14 @@ class CameraPlugin(Plugin, ABC): to the recorded resource. Otherwise, it will return the status of the camera device after starting it. """ camera = self.open_device(**camera) - self.start_camera(camera, duration=duration, video_file=video_file, frames_dir=None, image_file=None, - preview=preview) + self.start_camera( + camera, + duration=duration, + video_file=video_file, + frames_dir=None, + image_file=None, + preview=preview, + ) if duration: self.wait_capture(camera) @@ -484,8 +611,12 @@ class CameraPlugin(Plugin, ABC): """ with self.open(**camera) as camera: - warmup_frames = camera.info.warmup_frames if camera.info.warmup_frames else 1 - self.start_camera(camera, image_file=image_file, n_frames=warmup_frames, preview=preview) + warmup_frames = ( + camera.info.warmup_frames if camera.info.warmup_frames else 1 + ) + self.start_camera( + camera, image_file=image_file, n_frames=warmup_frames, preview=preview + ) self.wait_capture(camera) return image_file @@ -504,8 +635,13 @@ class CameraPlugin(Plugin, ABC): return self.capture_image(image_file, **camera) @action - def capture_sequence(self, duration: Optional[float] = None, n_frames: Optional[int] = None, preview: bool = False, - **camera) -> str: + def capture_sequence( + self, + duration: Optional[float] = None, + n_frames: Optional[int] = None, + preview: bool = False, + **camera, + ) -> str: """ Capture a sequence of frames from a camera and store them to a directory. @@ -517,12 +653,16 @@ class CameraPlugin(Plugin, ABC): :return: The directory where the image files have been stored. """ with self.open(**camera) as camera: - self.start_camera(camera, duration=duration, n_frames=n_frames, preview=preview) + self.start_camera( + camera, duration=duration, n_frames=n_frames, preview=preview + ) self.wait_capture(camera) return camera.info.frames_dir @action - def capture_preview(self, duration: Optional[float] = None, n_frames: Optional[int] = None, **camera) -> dict: + def capture_preview( + self, duration: Optional[float] = None, n_frames: Optional[int] = None, **camera + ) -> dict: """ Start a camera preview session. @@ -539,10 +679,12 @@ class CameraPlugin(Plugin, ABC): def _prepare_server_socket(camera: Camera) -> socket.socket: server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - server_socket.bind(( # lgtm [py/bind-socket-all-network-interfaces] - camera.info.bind_address or '0.0.0.0', - camera.info.listen_port - )) + server_socket.bind( + ( # lgtm [py/bind-socket-all-network-interfaces] + camera.info.bind_address or '0.0.0.0', + camera.info.listen_port, + ) + ) server_socket.listen(1) server_socket.settimeout(1) return server_socket @@ -550,16 +692,18 @@ class CameraPlugin(Plugin, ABC): def _accept_client(self, server_socket: socket.socket) -> Optional[IO]: try: sock = server_socket.accept()[0] - self.logger.info('Accepted client connection from {}'.format(sock.getpeername())) + self.logger.info('Accepted client connection from %s', sock.getpeername()) return sock.makefile('wb') except socket.timeout: return - def streaming_thread(self, camera: Camera, stream_format: str, duration: Optional[float] = None): + def streaming_thread( + self, camera: Camera, stream_format: str, duration: Optional[float] = None + ): streaming_started_time = time.time() server_socket = self._prepare_server_socket(camera) sock = None - self.logger.info('Starting streaming on port {}'.format(camera.info.listen_port)) + self.logger.info('Starting streaming on port %s', camera.info.listen_port) try: while camera.stream_event.is_set(): @@ -576,7 +720,9 @@ class CameraPlugin(Plugin, ABC): camera = self.open_device(stream=True, **info) camera.stream.sock = sock - self.start_camera(camera, duration=duration, frames_dir=None, image_file=None) + self.start_camera( + camera, duration=duration, frames_dir=None, image_file=None + ) finally: self._cleanup_stream(camera, server_socket, sock) self.logger.info('Stopped camera stream') @@ -586,21 +732,23 @@ class CameraPlugin(Plugin, ABC): try: client.close() except Exception as e: - self.logger.warning('Error on client socket close: {}'.format(str(e))) + self.logger.warning('Error on client socket close: %s', e) try: server_socket.close() except Exception as e: - self.logger.warning('Error on server socket close: {}'.format(str(e))) + self.logger.warning('Error on server socket close: %s', e) if camera.stream: try: camera.stream.close() except Exception as e: - self.logger.warning('Error while closing the encoding stream: {}'.format(str(e))) + self.logger.warning('Error while closing the encoding stream: %s', e) @action - def start_streaming(self, duration: Optional[float] = None, stream_format: str = 'mkv', **camera) -> dict: + def start_streaming( + self, duration: Optional[float] = None, stream_format: str = 'mkv', **camera + ) -> dict: """ Expose the video stream of a camera over a TCP connection. @@ -612,16 +760,25 @@ class CameraPlugin(Plugin, ABC): camera = self.open_device(stream=True, stream_format=stream_format, **camera) return self._start_streaming(camera, duration, stream_format) - def _start_streaming(self, camera: Camera, duration: Optional[float], stream_format: str): + def _start_streaming( + self, camera: Camera, duration: Optional[float], stream_format: str + ): assert camera.info.listen_port, 'No listen_port specified/configured' - assert not camera.stream_event.is_set() and camera.info.device not in self._streams, \ - 'A streaming session is already running for device {}'.format(camera.info.device) + assert ( + not camera.stream_event.is_set() and camera.info.device not in self._streams + ), f'A streaming session is already running for device {camera.info.device}' self._streams[camera.info.device] = camera camera.stream_event.set() - camera.stream_thread = threading.Thread(target=self.streaming_thread, kwargs=dict( - camera=camera, duration=duration, stream_format=stream_format)) + camera.stream_thread = threading.Thread( + target=self.streaming_thread, + kwargs={ + 'camera': camera, + 'duration': duration, + 'stream_format': stream_format, + }, + ) camera.stream_thread.start() return self.status(camera.info.device) @@ -655,10 +812,17 @@ class CameraPlugin(Plugin, ABC): return { **camera.info.to_dict(), - 'active': True if camera.capture_thread and camera.capture_thread.is_alive() else False, - 'capturing': True if camera.capture_thread and camera.capture_thread.is_alive() and - camera.start_event.is_set() else False, - 'streaming': camera.stream_thread and camera.stream_thread.is_alive() and camera.stream_event.is_set(), + 'active': bool(camera.capture_thread and camera.capture_thread.is_alive()), + 'capturing': bool( + camera.capture_thread + and camera.capture_thread.is_alive() + and camera.start_event.is_set() + ), + 'streaming': ( + camera.stream_thread + and camera.stream_thread.is_alive() + and camera.stream_event.is_set() + ), } @action @@ -670,10 +834,7 @@ class CameraPlugin(Plugin, ABC): if device: return self._status(device) - return { - id: self._status(device) - for id, camera in self._devices.items() - } + return {id: self._status(device) for id, camera in self._devices.items()} @staticmethod def transform_frame(frame, color_transform): @@ -690,6 +851,7 @@ class CameraPlugin(Plugin, ABC): :param frame: Image frame (default: a ``PIL.Image`` object). """ from PIL import ImageOps + return ImageOps.grayscale(frame) @staticmethod @@ -724,7 +886,9 @@ class CameraPlugin(Plugin, ABC): return frame @staticmethod - def scale_frame(frame, scale_x: Optional[float] = None, scale_y: Optional[float] = None): + def scale_frame( + frame, scale_x: Optional[float] = None, scale_y: Optional[float] = None + ): """ Frame scaling logic. The default implementation assumes that frame is a ``PIL.Image`` object. @@ -733,6 +897,7 @@ class CameraPlugin(Plugin, ABC): :param scale_y: Y-scale factor. """ from PIL import Image + if not (scale_x and scale_y) or (scale_x == 1 and scale_y == 1): return frame diff --git a/platypush/plugins/camera/model/writer/__init__.py b/platypush/plugins/camera/model/writer/__init__.py index dbadfa03..0fb85925 100644 --- a/platypush/plugins/camera/model/writer/__init__.py +++ b/platypush/plugins/camera/model/writer/__init__.py @@ -49,7 +49,7 @@ class VideoWriter(ABC): """ return self - def __exit__(self, exc_type, exc_val, exc_tb): + def __exit__(self, *_, **__): """ Context manager-based interface. """ @@ -60,8 +60,9 @@ class FileVideoWriter(VideoWriter, ABC): """ Abstract class to handle frames-to-video file operations. """ + def __init__(self, *args, output_file: str, **kwargs): - VideoWriter.__init__(self, *args, **kwargs) + super().__init__(self, *args, **kwargs) self.output_file = os.path.abspath(os.path.expanduser(output_file)) @@ -69,8 +70,9 @@ class StreamWriter(VideoWriter, ABC): """ Abstract class for camera streaming operations. """ + def __init__(self, *args, sock: Optional[IO] = None, **kwargs): - VideoWriter.__init__(self, *args, **kwargs) + super().__init__(*args, **kwargs) self.frame: Optional[bytes] = None self.frame_time: Optional[float] = None self.buffer = io.BytesIO() @@ -117,16 +119,20 @@ class StreamWriter(VideoWriter, ABC): try: self.sock.close() except Exception as e: - self.logger.warning('Could not close camera resource: {}'.format(str(e))) + self.logger.warning('Could not close camera resource: %s', e) super().close() @staticmethod def get_class_by_name(name: str): from platypush.plugins.camera.model.writer.index import StreamHandlers + name = name.upper() - assert hasattr(StreamHandlers, name), 'No such stream handler: {}. Supported types: {}'.format( - name, [hndl.name for hndl in list(StreamHandlers)]) + assert hasattr( + StreamHandlers, name + ), f'No such stream handler: {name}. Supported types: ' + ( + ', '.join([hndl.name for hndl in list(StreamHandlers)]) + ) return getattr(StreamHandlers, name).value diff --git a/platypush/plugins/camera/model/writer/ffmpeg.py b/platypush/plugins/camera/model/writer/ffmpeg.py index fe0c7750..41011e39 100644 --- a/platypush/plugins/camera/model/writer/ffmpeg.py +++ b/platypush/plugins/camera/model/writer/ffmpeg.py @@ -8,7 +8,11 @@ from typing import Optional, Tuple from PIL.Image import Image from platypush.plugins.camera.model.camera import Camera -from platypush.plugins.camera.model.writer import VideoWriter, FileVideoWriter, StreamWriter +from platypush.plugins.camera.model.writer import ( + VideoWriter, + FileVideoWriter, + StreamWriter, +) class FFmpegWriter(VideoWriter, ABC): @@ -16,9 +20,17 @@ class FFmpegWriter(VideoWriter, ABC): Generic FFmpeg encoder for camera frames. """ - def __init__(self, *args, input_file: str = '-', input_format: str = 'rawvideo', output_file: str = '-', - output_format: Optional[str] = None, pix_fmt: Optional[str] = None, - output_opts: Optional[Tuple] = None, **kwargs): + def __init__( + self, + *args, + input_file: str = '-', + input_format: str = 'rawvideo', + output_file: str = '-', + output_format: Optional[str] = None, + pix_fmt: Optional[str] = None, + output_opts: Optional[Tuple] = None, + **kwargs, + ): super().__init__(*args, **kwargs) self.input_file = input_file @@ -29,21 +41,34 @@ class FFmpegWriter(VideoWriter, ABC): self.pix_fmt = pix_fmt self.output_opts = output_opts or () - self.logger.info('Starting FFmpeg. Command: {}'.format(' '.join(self.ffmpeg_args))) - self.ffmpeg = subprocess.Popen(self.ffmpeg_args, stdin=subprocess.PIPE, stdout=subprocess.PIPE) + self.logger.info('Starting FFmpeg. Command: ' + ' '.join(self.ffmpeg_args)) + self.ffmpeg = subprocess.Popen( + self.ffmpeg_args, stdin=subprocess.PIPE, stdout=subprocess.PIPE + ) @property def ffmpeg_args(self): - return [self.camera.info.ffmpeg_bin, '-y', - '-f', self.input_format, - *(('-pix_fmt', self.pix_fmt) if self.pix_fmt else ()), - '-s', '{}x{}'.format(self.width, self.height), - '-r', str(self.camera.info.fps), - '-i', self.input_file, - *(('-f', self.output_format) if self.output_format else ()), - *self.output_opts, - *(('-vcodec', self.camera.info.output_codec) if self.camera.info.output_codec else ()), - self.output_file] + return [ + self.camera.info.ffmpeg_bin, + '-y', + '-f', + self.input_format, + *(('-pix_fmt', self.pix_fmt) if self.pix_fmt else ()), + '-s', + f'{self.width}x{self.height}', + '-r', + str(self.camera.info.fps), + '-i', + self.input_file, + *(('-f', self.output_format) if self.output_format else ()), + *self.output_opts, + *( + ('-vcodec', self.camera.info.output_codec) + if self.camera.info.output_codec + else () + ), + self.output_file, + ] def is_closed(self): return self.closed or not self.ffmpeg or self.ffmpeg.poll() is not None @@ -55,7 +80,7 @@ class FFmpegWriter(VideoWriter, ABC): try: self.ffmpeg.stdin.write(image.convert('RGB').tobytes()) except Exception as e: - self.logger.warning('FFmpeg send error: {}'.format(str(e))) + self.logger.warning('FFmpeg send error: %s', e) self.close() def close(self): @@ -63,7 +88,7 @@ class FFmpegWriter(VideoWriter, ABC): if self.ffmpeg and self.ffmpeg.stdin: try: self.ffmpeg.stdin.close() - except (IOError, OSError): + except OSError: pass if self.ffmpeg: @@ -77,7 +102,7 @@ class FFmpegWriter(VideoWriter, ABC): if self.ffmpeg and self.ffmpeg.stdout: try: self.ffmpeg.stdout.close() - except (IOError, OSError): + except OSError: pass self.ffmpeg = None @@ -98,10 +123,26 @@ class FFmpegStreamWriter(StreamWriter, FFmpegWriter, ABC): Stream camera frames using FFmpeg. """ - def __init__(self, *args, output_format: str, output_opts: Optional[Tuple] = None, **kwargs): - super().__init__(*args, pix_fmt='rgb24', output_format=output_format, output_opts=output_opts or ( - '-tune', 'zerolatency', '-preset', 'superfast', '-trellis', '0', - '-fflags', 'nobuffer'), **kwargs) + def __init__( + self, *args, output_format: str, output_opts: Optional[Tuple] = None, **kwargs + ): + super().__init__( + *args, + pix_fmt='rgb24', + output_format=output_format, + output_opts=output_opts + or ( + '-tune', + 'zerolatency', + '-preset', + 'superfast', + '-trellis', + '0', + '-fflags', + 'nobuffer', + ), + **kwargs, + ) self._reader = threading.Thread(target=self._reader_thread) self._reader.start() @@ -115,7 +156,7 @@ class FFmpegStreamWriter(StreamWriter, FFmpegWriter, ABC): try: data = self.ffmpeg.stdout.read(1 << 15) except Exception as e: - self.logger.warning('FFmpeg reader error: {}'.format(str(e))) + self.logger.warning('FFmpeg reader error: %s', e) break if not data: @@ -123,7 +164,7 @@ class FFmpegStreamWriter(StreamWriter, FFmpegWriter, ABC): if self.frame is None: latency = time.time() - start_time - self.logger.info('FFmpeg stream latency: {} secs'.format(latency)) + self.logger.info('FFmpeg stream latency: %d secs', latency) with self.ready: self.frame = data @@ -140,12 +181,16 @@ class FFmpegStreamWriter(StreamWriter, FFmpegWriter, ABC): try: self.ffmpeg.stdin.write(data) except Exception as e: - self.logger.warning('FFmpeg send error: {}'.format(str(e))) + self.logger.warning('FFmpeg send error: %s', e) self.close() def close(self): super().close() - if self._reader and self._reader.is_alive() and threading.get_ident() != self._reader.ident: + if ( + self._reader + and self._reader.is_alive() + and threading.get_ident() != self._reader.ident + ): self._reader.join(timeout=5.0) self._reader = None From b4d714df8a6ced7eac72dce461dd183c81968add Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Sat, 27 May 2023 22:19:50 +0200 Subject: [PATCH 02/17] Removed `camera.gstreamer`. Too much of a pain in the ass to handle, too many format options to think of, too many combinations of pipelines to support, and if I don't think of those beforehand then I'll have to offload all of that complexity on the user. --- .../platypush/plugins/camera.gstreamer.rst | 5 - docs/source/plugins.rst | 1 - .../plugins/camera/gstreamer/__init__.py | 94 ------------------- .../plugins/camera/gstreamer/manifest.yaml | 16 ---- platypush/plugins/camera/gstreamer/model.py | 10 -- 5 files changed, 126 deletions(-) delete mode 100644 docs/source/platypush/plugins/camera.gstreamer.rst delete mode 100644 platypush/plugins/camera/gstreamer/__init__.py delete mode 100644 platypush/plugins/camera/gstreamer/manifest.yaml delete mode 100644 platypush/plugins/camera/gstreamer/model.py diff --git a/docs/source/platypush/plugins/camera.gstreamer.rst b/docs/source/platypush/plugins/camera.gstreamer.rst deleted file mode 100644 index 5dc5ac37..00000000 --- a/docs/source/platypush/plugins/camera.gstreamer.rst +++ /dev/null @@ -1,5 +0,0 @@ -``camera.gstreamer`` -====================================== - -.. automodule:: platypush.plugins.camera.gstreamer - :members: diff --git a/docs/source/plugins.rst b/docs/source/plugins.rst index d1713426..fcf2cfc5 100644 --- a/docs/source/plugins.rst +++ b/docs/source/plugins.rst @@ -19,7 +19,6 @@ Plugins platypush/plugins/camera.android.ipcam.rst platypush/plugins/camera.cv.rst platypush/plugins/camera.ffmpeg.rst - platypush/plugins/camera.gstreamer.rst platypush/plugins/camera.ir.mlx90640.rst platypush/plugins/camera.pi.rst platypush/plugins/chat.irc.rst diff --git a/platypush/plugins/camera/gstreamer/__init__.py b/platypush/plugins/camera/gstreamer/__init__.py deleted file mode 100644 index bb745b3c..00000000 --- a/platypush/plugins/camera/gstreamer/__init__.py +++ /dev/null @@ -1,94 +0,0 @@ -from typing import Optional - -from PIL import Image -from PIL.Image import Image as ImageType - -from platypush.plugins.camera import CameraPlugin -from platypush.plugins.camera.gstreamer.model import GStreamerCamera -from platypush.common.gstreamer import Pipeline - - -class CameraGstreamerPlugin(CameraPlugin): - """ - Plugin to interact with a camera over GStreamer. - - Requires: - - * **gst-python** - * **pygobject** - - On Debian and derived systems: - - * ``[sudo] apt-get install python3-gi python3-gst-1.0`` - - On Arch and derived systems: - - * ``[sudo] pacman -S gst-python`` - - """ - - _camera_class = GStreamerCamera - - def __init__(self, device: Optional[str] = '/dev/video0', **opts): - """ - :param device: Path to the camera device (default ``/dev/video0``). - :param opts: Camera options - see constructor of :class:`platypush.plugins.camera.CameraPlugin`. - """ - super().__init__(device=device, **opts) - - def prepare_device(self, camera: GStreamerCamera) -> Pipeline: - pipeline = Pipeline() - src = pipeline.add_source('v4l2src', device=camera.info.device) - convert = pipeline.add('videoconvert') - assert camera.info and camera.info.resolution - - video_filter = pipeline.add( - 'capsfilter', - caps='video/x-raw,format=RGB,width={width},height={height},framerate={fps}/1'.format( - width=camera.info.resolution[0], - height=camera.info.resolution[1], - fps=camera.info.fps, - ), - ) - - sink = pipeline.add_sink('appsink', name='appsink', sync=False) - pipeline.link(src, convert, video_filter, sink) - return pipeline - - def start_camera( - self, camera: GStreamerCamera, preview: bool = False, *args, **kwargs - ): - super().start_camera(*args, camera=camera, preview=preview, **kwargs) - if camera.object: - camera.object.play() - - def release_device(self, camera: GStreamerCamera): - if camera.object: - camera.object.stop() - - def capture_frame(self, camera: GStreamerCamera, *_, **__) -> Optional[ImageType]: - if not (camera.info and camera.info.fps and camera.info.resolution): - return None - - timed_out = not camera.object.data_ready.wait( - timeout=5 + (1.0 / camera.info.fps) - ) - if timed_out: - self.logger.warning('Frame capture timeout') - return None - - data = camera.object.data - if data is None: - return None - - camera.object.data_ready.clear() - if ( - not data - and len(data) != camera.info.resolution[0] * camera.info.resolution[1] * 3 - ): - return None - - return Image.frombytes('RGB', camera.info.resolution, data) - - -# vim:sw=4:ts=4:et: diff --git a/platypush/plugins/camera/gstreamer/manifest.yaml b/platypush/plugins/camera/gstreamer/manifest.yaml deleted file mode 100644 index 43e2cae4..00000000 --- a/platypush/plugins/camera/gstreamer/manifest.yaml +++ /dev/null @@ -1,16 +0,0 @@ -manifest: - events: {} - install: - pip: - - numpy - - Pillow - - pygobject - apt: - - python3-gi - - python3-gst-1.0 - pacman: - - gst-python - - python-gobject - - package: platypush.plugins.camera.gstreamer - type: plugin diff --git a/platypush/plugins/camera/gstreamer/model.py b/platypush/plugins/camera/gstreamer/model.py deleted file mode 100644 index 48082c62..00000000 --- a/platypush/plugins/camera/gstreamer/model.py +++ /dev/null @@ -1,10 +0,0 @@ -from platypush.common.gstreamer import Pipeline -from platypush.plugins.camera import CameraInfo, Camera - - -class GStreamerCamera(Camera): - info: CameraInfo - object: Pipeline - - -# vim:sw=4:ts=4:et: From 4bf9c01ac982e32c41b492e79d7749b2fc452298 Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Sat, 27 May 2023 22:24:45 +0200 Subject: [PATCH 03/17] Moved camera routes. Camera routes migrated from Flask blueprints to Tornado handlers. --- platypush/backend/http/__init__.py | 9 +- .../app/routes/plugins/camera/__init__.py | 116 --------------- .../app/routes/plugins/camera/ir/mlx90640.py | 51 ------- .../backend/http/app/streaming/__init__.py | 3 + platypush/backend/http/app/streaming/_base.py | 50 +++++++ .../ir => streaming/plugins}/__init__.py | 0 .../http/app/streaming/plugins/camera.py | 134 ++++++++++++++++++ platypush/backend/http/app/utils/__init__.py | 2 + platypush/backend/http/app/utils/streaming.py | 39 +++++ platypush/plugins/camera/__init__.py | 2 +- 10 files changed, 235 insertions(+), 171 deletions(-) delete mode 100644 platypush/backend/http/app/routes/plugins/camera/ir/mlx90640.py create mode 100644 platypush/backend/http/app/streaming/__init__.py create mode 100644 platypush/backend/http/app/streaming/_base.py rename platypush/backend/http/app/{routes/plugins/camera/ir => streaming/plugins}/__init__.py (100%) create mode 100644 platypush/backend/http/app/streaming/plugins/camera.py create mode 100644 platypush/backend/http/app/utils/streaming.py diff --git a/platypush/backend/http/__init__.py b/platypush/backend/http/__init__.py index a4879c96..051dc983 100644 --- a/platypush/backend/http/__init__.py +++ b/platypush/backend/http/__init__.py @@ -16,7 +16,7 @@ from tornado.web import Application, FallbackHandler from platypush.backend import Backend from platypush.backend.http.app import application -from platypush.backend.http.app.utils import get_ws_routes +from platypush.backend.http.app.utils import get_streaming_routes, get_ws_routes from platypush.backend.http.app.ws.events import events_redis_topic from platypush.bus.redis import RedisBus @@ -331,7 +331,10 @@ class HttpBackend(Backend): container = WSGIContainer(application) tornado_app = Application( [ - *[(route.path(), route) for route in get_ws_routes()], + *[ + (route.path(), route) + for route in [*get_ws_routes(), *get_streaming_routes()] + ], (r'.*', FallbackHandler, {'fallback': container}), ] ) @@ -352,7 +355,7 @@ class HttpBackend(Backend): ) if self.use_werkzeug_server: - application.config['redis_queue'] = self.bus.redis_queue + application.config['redis_queue'] = self.bus.redis_queue # type: ignore application.run( host=self.bind_address, port=self.port, diff --git a/platypush/backend/http/app/routes/plugins/camera/__init__.py b/platypush/backend/http/app/routes/plugins/camera/__init__.py index 94b1fbef..e69de29b 100644 --- a/platypush/backend/http/app/routes/plugins/camera/__init__.py +++ b/platypush/backend/http/app/routes/plugins/camera/__init__.py @@ -1,116 +0,0 @@ -import json -from typing import Optional - -from flask import Blueprint, request -from flask.wrappers import Response - -from platypush.backend.http.app import template_folder -from platypush.backend.http.app.utils import authenticate -from platypush.context import get_plugin -from platypush.plugins.camera import CameraPlugin, Camera, StreamWriter - -camera = Blueprint('camera', __name__, template_folder=template_folder) - -# Declare routes list -__routes__ = [ - camera, -] - - -def get_camera(plugin: str) -> CameraPlugin: - plugin_name = f'camera.{plugin}' - p = get_plugin(plugin_name) - assert p, f'No such plugin: {plugin_name}' - return p - - -def get_frame(session: Camera, timeout: Optional[float] = None) -> Optional[bytes]: - if session.stream: - with session.stream.ready: - session.stream.ready.wait(timeout=timeout) - return session.stream.frame - - -def feed(camera: CameraPlugin, **kwargs): - with camera.open(**kwargs) as session: - camera.start_camera(session) - while True: - frame = get_frame(session, timeout=5.0) - if frame: - yield frame - - -def get_args(kwargs): - kwargs = kwargs.copy() - if 't' in kwargs: - del kwargs['t'] - - for k, v in kwargs.items(): - if k == 'resolution': - v = json.loads('[{}]'.format(v)) - else: - try: - v = int(v) - except (ValueError, TypeError): - try: - v = float(v) - except (ValueError, TypeError): - pass - - kwargs[k] = v - - return kwargs - - -@camera.route('/camera//photo.', methods=['GET']) -@authenticate() -def get_photo(plugin, extension): - plugin = get_camera(plugin) - extension = 'jpeg' if extension in ('jpg', 'jpeg') else extension - - with plugin.open(stream=True, stream_format=extension, frames_dir=None, **get_args(request.args)) as session: - plugin.start_camera(session) - frame = None - for _ in range(session.info.warmup_frames): - frame = get_frame(session) - - return Response(frame, mimetype=session.stream.mimetype) - - -@camera.route('/camera//video.', methods=['GET']) -@authenticate() -def get_video(plugin, extension): - stream_class = StreamWriter.get_class_by_name(extension) - camera = get_camera(plugin) - return Response( - feed(camera, stream=True, stream_format=extension, frames_dir=None, - **get_args(request.args) - ), mimetype=stream_class.mimetype - ) - - -@camera.route('/camera//photo', methods=['GET']) -@authenticate() -def get_photo_default(plugin): - return get_photo(plugin, 'jpeg') - - -@camera.route('/camera//video', methods=['GET']) -@authenticate() -def get_video_default(plugin): - return get_video(plugin, 'mjpeg') - - -@camera.route('/camera//frame', methods=['GET']) -@authenticate() -def get_photo_deprecated(plugin): - return get_photo_default(plugin) - - -@camera.route('/camera//feed', methods=['GET']) -@authenticate() -def get_video_deprecated(plugin): - return get_video_default(plugin) - - -# vim:sw=4:ts=4:et: diff --git a/platypush/backend/http/app/routes/plugins/camera/ir/mlx90640.py b/platypush/backend/http/app/routes/plugins/camera/ir/mlx90640.py deleted file mode 100644 index eada9849..00000000 --- a/platypush/backend/http/app/routes/plugins/camera/ir/mlx90640.py +++ /dev/null @@ -1,51 +0,0 @@ -from flask import Blueprint - -from platypush.backend.http.app import template_folder -from platypush.backend.http.app.routes.plugins.camera import get_photo, get_video -from platypush.backend.http.app.utils import authenticate - -camera_ir_mlx90640 = Blueprint('camera-ir-mlx90640', __name__, template_folder=template_folder) - -# Declare routes list -__routes__ = [ - camera_ir_mlx90640, -] - - -@camera_ir_mlx90640.route('/camera/ir/mlx90640/photo.', methods=['GET']) -@authenticate() -def get_photo_route(extension): - return get_photo('ir.mlx90640', extension) - - -@camera_ir_mlx90640.route('/camera/ir/mlx90640/video.', methods=['GET']) -@authenticate() -def get_video_route(extension): - return get_video('ir.mlx90640', extension) - - -@camera_ir_mlx90640.route('/camera/ir/mlx90640/photo', methods=['GET']) -@authenticate() -def get_photo_route_default(): - return get_photo_route('jpeg') - - -@camera_ir_mlx90640.route('/camera/ir/mlx90640/video', methods=['GET']) -@authenticate() -def get_video_route_default(): - return get_video_route('mjpeg') - - -@camera_ir_mlx90640.route('/camera/ir/mlx90640/frame', methods=['GET']) -@authenticate() -def get_photo_route_deprecated(): - return get_photo_route_default() - - -@camera_ir_mlx90640.route('/camera/ir/mlx90640/feed', methods=['GET']) -@authenticate() -def get_video_route_deprecated(): - return get_video_route_default() - - -# vim:sw=4:ts=4:et: diff --git a/platypush/backend/http/app/streaming/__init__.py b/platypush/backend/http/app/streaming/__init__.py new file mode 100644 index 00000000..b174974e --- /dev/null +++ b/platypush/backend/http/app/streaming/__init__.py @@ -0,0 +1,3 @@ +from ._base import StreamingRoute, logger + +__all__ = ['StreamingRoute', 'logger'] diff --git a/platypush/backend/http/app/streaming/_base.py b/platypush/backend/http/app/streaming/_base.py new file mode 100644 index 00000000..e162eeed --- /dev/null +++ b/platypush/backend/http/app/streaming/_base.py @@ -0,0 +1,50 @@ +from abc import ABC, abstractmethod +from http.client import responses +import json +from logging import getLogger +from typing import Optional +from typing_extensions import override + +from tornado.web import RequestHandler, stream_request_body + +from platypush.backend.http.app.utils.auth import AuthStatus, get_auth_status + +logger = getLogger(__name__) + + +@stream_request_body +class StreamingRoute(RequestHandler, ABC): + """ + Base class for Tornado streaming routes. + """ + + @override + def prepare(self): + # Perform authentication + if self.auth_required: + auth_status = get_auth_status(self.request) + if auth_status != AuthStatus.OK: + self.send_error(auth_status.value.code, error=auth_status.value.message) + return + + logger.info( + 'Client %s connected to %s', self.request.remote_ip, self.request.path + ) + + @override + def write_error(self, status_code: int, error: Optional[str] = None, **_): + self.set_header("Content-Type", "application/json") + self.finish( + json.dumps( + {"status": status_code, "error": error or responses[status_code]} + ) + ) + + @classmethod + @abstractmethod + def path(cls) -> str: + raise NotImplementedError() + + @property + def auth_required(self): + return True diff --git a/platypush/backend/http/app/routes/plugins/camera/ir/__init__.py b/platypush/backend/http/app/streaming/plugins/__init__.py similarity index 100% rename from platypush/backend/http/app/routes/plugins/camera/ir/__init__.py rename to platypush/backend/http/app/streaming/plugins/__init__.py diff --git a/platypush/backend/http/app/streaming/plugins/camera.py b/platypush/backend/http/app/streaming/plugins/camera.py new file mode 100644 index 00000000..ccc978c2 --- /dev/null +++ b/platypush/backend/http/app/streaming/plugins/camera.py @@ -0,0 +1,134 @@ +from enum import Enum +import json +from logging import getLogger +from typing import Optional +from typing_extensions import override + +from tornado.web import stream_request_body +from platypush.context import get_plugin + +from platypush.plugins.camera import Camera, CameraPlugin, StreamWriter + +from .. import StreamingRoute + +logger = getLogger(__name__) + + +class RequestType(Enum): + """ + Models the camera route request type (video or photo) + """ + + UNKNOWN = '' + PHOTO = 'photo' + VIDEO = 'video' + + +@stream_request_body +class CameraRoute(StreamingRoute): + """ + Route for camera streams. + """ + + def __init__(self, *args, **kwargs): + # TODO Support multiple concurrent requests + super().__init__(*args, **kwargs) + self._camera: Optional[Camera] = None + self._request_type = RequestType.UNKNOWN + self._extension: str = '' + + @override + @classmethod + def path(cls) -> str: + return r"/camera/([a-zA-Z0-9_./]+)/([a-zA-Z0-9_]+)\.?([a-zA-Z0-9_]+)?" + + def _get_camera(self, plugin: str) -> CameraPlugin: + plugin_name = f'camera.{plugin.replace("/", ".")}' + p = get_plugin(plugin_name) + assert p, f'No such plugin: {plugin_name}' + return p + + def _get_frame( + self, camera: Camera, timeout: Optional[float] = None + ) -> Optional[bytes]: + if camera.stream: + with camera.stream.ready: + camera.stream.ready.wait(timeout=timeout) + return camera.stream.frame + + def _should_stop(self): + if self._finished: + return True + + if self.request.connection and getattr(self.request.connection, 'stream', None): + return self.request.connection.stream.closed() # type: ignore + + return True + + def send_feed(self, camera: Camera): + while not self._should_stop(): + frame = self._get_frame(camera, timeout=5.0) + if frame: + self.write(frame) + self.flush() + + def send_frame(self, camera: Camera): + frame = None + for _ in range(camera.info.warmup_frames): + frame = self._get_frame(camera) + + if frame: + self.write(frame) + self.flush() + + def _set_request_type_and_extension(self, route: str, extension: str): + if route in {'photo', 'frame'}: + self._request_type = RequestType.PHOTO + if extension == 'jpg': + extension = 'jpeg' + self._extension = extension or 'jpeg' + elif route in {'video', 'feed'}: + self._request_type = RequestType.VIDEO + self._extension = extension or 'mjpeg' + + def _get_args(self, kwargs: dict): + kwargs = {k: v[0].decode() for k, v in kwargs.items() if k != 't'} + for k, v in kwargs.items(): + if k == 'resolution': + v = json.loads(f'[{v}]') + else: + try: + v = int(v) + except (ValueError, TypeError): + try: + v = float(v) + except (ValueError, TypeError): + pass + + kwargs[k] = v + + return kwargs + + def get(self, plugin: str, route: str, extension: str = '') -> None: + self._set_request_type_and_extension(route, extension) + if not (self._request_type and self._extension): + self.write_error(404, 'Not Found') + return + + stream_class = StreamWriter.get_class_by_name(self._extension) + camera = self._get_camera(plugin) + self.set_header('Content-Type', stream_class.mimetype) + + with camera.open( + stream=True, + stream_format=self._extension, + frames_dir=None, + **self._get_args(self.request.arguments), + ) as session: + camera.start_camera(session) + if self._request_type == RequestType.PHOTO: + self.send_frame(session) + elif self._request_type == RequestType.VIDEO: + self.send_feed(session) + + self.finish() diff --git a/platypush/backend/http/app/utils/__init__.py b/platypush/backend/http/app/utils/__init__.py index 08eae344..cad44b26 100644 --- a/platypush/backend/http/app/utils/__init__.py +++ b/platypush/backend/http/app/utils/__init__.py @@ -13,6 +13,7 @@ from .routes import ( get_remote_base_url, get_routes, ) +from .streaming import get_streaming_routes from .ws import get_ws_routes __all__ = [ @@ -27,6 +28,7 @@ __all__ = [ 'get_message_response', 'get_remote_base_url', 'get_routes', + 'get_streaming_routes', 'get_ws_routes', 'logger', 'send_message', diff --git a/platypush/backend/http/app/utils/streaming.py b/platypush/backend/http/app/utils/streaming.py new file mode 100644 index 00000000..02a9dd99 --- /dev/null +++ b/platypush/backend/http/app/utils/streaming.py @@ -0,0 +1,39 @@ +import os +import importlib +import inspect +from typing import List, Type + +import pkgutil + +from ..streaming import StreamingRoute, logger + + +def get_streaming_routes() -> List[Type[StreamingRoute]]: + """ + Scans for streaming routes. + """ + from platypush.backend.http import HttpBackend + + base_pkg = '.'.join([HttpBackend.__module__, 'app', 'streaming']) + base_dir = os.path.join( + os.path.dirname(inspect.getfile(HttpBackend)), 'app', 'streaming' + ) + routes = [] + + for _, mod_name, _ in pkgutil.walk_packages([base_dir], prefix=base_pkg + '.'): + try: + module = importlib.import_module(mod_name) + except Exception as e: + logger.warning('Could not import module %s', mod_name) + logger.exception(e) + continue + + for _, obj in inspect.getmembers(module): + if ( + inspect.isclass(obj) + and not inspect.isabstract(obj) + and issubclass(obj, StreamingRoute) + ): + routes.append(obj) + + return routes diff --git a/platypush/plugins/camera/__init__.py b/platypush/plugins/camera/__init__.py index 8019abf8..cb0dff79 100644 --- a/platypush/plugins/camera/__init__.py +++ b/platypush/plugins/camera/__init__.py @@ -834,7 +834,7 @@ class CameraPlugin(Plugin, ABC): if device: return self._status(device) - return {id: self._status(device) for id, camera in self._devices.items()} + return {id: self._status(id) for id in self._devices} @staticmethod def transform_frame(frame, color_transform): From 4fffabd82a93c44b94b0db26f43cec9c96af1a43 Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Mon, 29 May 2023 22:13:24 +0200 Subject: [PATCH 04/17] Revert "Removed `camera.gstreamer`." This reverts commit b4d714df8a6ced7eac72dce461dd183c81968add. --- .../platypush/plugins/camera.gstreamer.rst | 5 + docs/source/plugins.rst | 1 + .../plugins/camera/gstreamer/__init__.py | 94 +++++++++++++++++++ .../plugins/camera/gstreamer/manifest.yaml | 16 ++++ platypush/plugins/camera/gstreamer/model.py | 10 ++ 5 files changed, 126 insertions(+) create mode 100644 docs/source/platypush/plugins/camera.gstreamer.rst create mode 100644 platypush/plugins/camera/gstreamer/__init__.py create mode 100644 platypush/plugins/camera/gstreamer/manifest.yaml create mode 100644 platypush/plugins/camera/gstreamer/model.py diff --git a/docs/source/platypush/plugins/camera.gstreamer.rst b/docs/source/platypush/plugins/camera.gstreamer.rst new file mode 100644 index 00000000..5dc5ac37 --- /dev/null +++ b/docs/source/platypush/plugins/camera.gstreamer.rst @@ -0,0 +1,5 @@ +``camera.gstreamer`` +====================================== + +.. automodule:: platypush.plugins.camera.gstreamer + :members: diff --git a/docs/source/plugins.rst b/docs/source/plugins.rst index fcf2cfc5..d1713426 100644 --- a/docs/source/plugins.rst +++ b/docs/source/plugins.rst @@ -19,6 +19,7 @@ Plugins platypush/plugins/camera.android.ipcam.rst platypush/plugins/camera.cv.rst platypush/plugins/camera.ffmpeg.rst + platypush/plugins/camera.gstreamer.rst platypush/plugins/camera.ir.mlx90640.rst platypush/plugins/camera.pi.rst platypush/plugins/chat.irc.rst diff --git a/platypush/plugins/camera/gstreamer/__init__.py b/platypush/plugins/camera/gstreamer/__init__.py new file mode 100644 index 00000000..bb745b3c --- /dev/null +++ b/platypush/plugins/camera/gstreamer/__init__.py @@ -0,0 +1,94 @@ +from typing import Optional + +from PIL import Image +from PIL.Image import Image as ImageType + +from platypush.plugins.camera import CameraPlugin +from platypush.plugins.camera.gstreamer.model import GStreamerCamera +from platypush.common.gstreamer import Pipeline + + +class CameraGstreamerPlugin(CameraPlugin): + """ + Plugin to interact with a camera over GStreamer. + + Requires: + + * **gst-python** + * **pygobject** + + On Debian and derived systems: + + * ``[sudo] apt-get install python3-gi python3-gst-1.0`` + + On Arch and derived systems: + + * ``[sudo] pacman -S gst-python`` + + """ + + _camera_class = GStreamerCamera + + def __init__(self, device: Optional[str] = '/dev/video0', **opts): + """ + :param device: Path to the camera device (default ``/dev/video0``). + :param opts: Camera options - see constructor of :class:`platypush.plugins.camera.CameraPlugin`. + """ + super().__init__(device=device, **opts) + + def prepare_device(self, camera: GStreamerCamera) -> Pipeline: + pipeline = Pipeline() + src = pipeline.add_source('v4l2src', device=camera.info.device) + convert = pipeline.add('videoconvert') + assert camera.info and camera.info.resolution + + video_filter = pipeline.add( + 'capsfilter', + caps='video/x-raw,format=RGB,width={width},height={height},framerate={fps}/1'.format( + width=camera.info.resolution[0], + height=camera.info.resolution[1], + fps=camera.info.fps, + ), + ) + + sink = pipeline.add_sink('appsink', name='appsink', sync=False) + pipeline.link(src, convert, video_filter, sink) + return pipeline + + def start_camera( + self, camera: GStreamerCamera, preview: bool = False, *args, **kwargs + ): + super().start_camera(*args, camera=camera, preview=preview, **kwargs) + if camera.object: + camera.object.play() + + def release_device(self, camera: GStreamerCamera): + if camera.object: + camera.object.stop() + + def capture_frame(self, camera: GStreamerCamera, *_, **__) -> Optional[ImageType]: + if not (camera.info and camera.info.fps and camera.info.resolution): + return None + + timed_out = not camera.object.data_ready.wait( + timeout=5 + (1.0 / camera.info.fps) + ) + if timed_out: + self.logger.warning('Frame capture timeout') + return None + + data = camera.object.data + if data is None: + return None + + camera.object.data_ready.clear() + if ( + not data + and len(data) != camera.info.resolution[0] * camera.info.resolution[1] * 3 + ): + return None + + return Image.frombytes('RGB', camera.info.resolution, data) + + +# vim:sw=4:ts=4:et: diff --git a/platypush/plugins/camera/gstreamer/manifest.yaml b/platypush/plugins/camera/gstreamer/manifest.yaml new file mode 100644 index 00000000..43e2cae4 --- /dev/null +++ b/platypush/plugins/camera/gstreamer/manifest.yaml @@ -0,0 +1,16 @@ +manifest: + events: {} + install: + pip: + - numpy + - Pillow + - pygobject + apt: + - python3-gi + - python3-gst-1.0 + pacman: + - gst-python + - python-gobject + + package: platypush.plugins.camera.gstreamer + type: plugin diff --git a/platypush/plugins/camera/gstreamer/model.py b/platypush/plugins/camera/gstreamer/model.py new file mode 100644 index 00000000..48082c62 --- /dev/null +++ b/platypush/plugins/camera/gstreamer/model.py @@ -0,0 +1,10 @@ +from platypush.common.gstreamer import Pipeline +from platypush.plugins.camera import CameraInfo, Camera + + +class GStreamerCamera(Camera): + info: CameraInfo + object: Pipeline + + +# vim:sw=4:ts=4:et: From 8b5eb82497a08531557c78595a327f867f6b39f2 Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Tue, 30 May 2023 11:06:48 +0200 Subject: [PATCH 05/17] Camera stream writer fixes. - The readiness condition should be `multiprocessing.Condition`, not `threading.Condition` - in most of the cases it will be checked in a multiprocess environment. - Fixed parameter name for `write`. --- platypush/plugins/camera/model/writer/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/platypush/plugins/camera/model/writer/__init__.py b/platypush/plugins/camera/model/writer/__init__.py index 0fb85925..1113dcf1 100644 --- a/platypush/plugins/camera/model/writer/__init__.py +++ b/platypush/plugins/camera/model/writer/__init__.py @@ -1,7 +1,7 @@ import io import logging +import multiprocessing import os -import threading import time from abc import ABC, abstractmethod @@ -26,11 +26,11 @@ class VideoWriter(ABC): self.closed = False @abstractmethod - def write(self, img: Image): + def write(self, image: Image): """ Write an image to the channel. - :param img: PIL Image instance. + :param image: PIL Image instance. """ raise NotImplementedError() @@ -76,7 +76,7 @@ class StreamWriter(VideoWriter, ABC): self.frame: Optional[bytes] = None self.frame_time: Optional[float] = None self.buffer = io.BytesIO() - self.ready = threading.Condition() + self.ready = multiprocessing.Condition() self.sock = sock def write(self, image: Image): From d7208c6bbc647da5383fa95ec4fdd9cb35863faf Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Tue, 30 May 2023 11:08:27 +0200 Subject: [PATCH 06/17] Refactored Tornado routes for native pub/sub support. The Redis pub/sub mechanism is now a native feature for Tornado routes through the `PubSubMixin`. (Plus, lint/black chore for the sound plugin) --- platypush/backend/http/__init__.py | 5 +- platypush/backend/http/app/mixins/__init__.py | 158 +++++ platypush/backend/http/app/streaming/_base.py | 23 +- .../http/app/streaming/plugins/camera.py | 2 + platypush/backend/http/app/ws/__init__.py | 4 +- platypush/backend/http/app/ws/_base.py | 82 +-- platypush/backend/http/app/ws/events.py | 22 +- platypush/plugins/camera/model/camera.py | 15 +- platypush/plugins/sound/__init__.py | 552 +++++++++++------- platypush/plugins/sound/core.py | 116 ++-- 10 files changed, 657 insertions(+), 322 deletions(-) create mode 100644 platypush/backend/http/app/mixins/__init__.py diff --git a/platypush/backend/http/__init__.py b/platypush/backend/http/__init__.py index 051dc983..4df3ce8a 100644 --- a/platypush/backend/http/__init__.py +++ b/platypush/backend/http/__init__.py @@ -17,11 +17,10 @@ from tornado.web import Application, FallbackHandler from platypush.backend import Backend from platypush.backend.http.app import application from platypush.backend.http.app.utils import get_streaming_routes, get_ws_routes -from platypush.backend.http.app.ws.events import events_redis_topic +from platypush.backend.http.app.ws.events import WSEventProxy from platypush.bus.redis import RedisBus from platypush.config import Config -from platypush.utils import get_redis class HttpBackend(Backend): @@ -286,7 +285,7 @@ class HttpBackend(Backend): def notify_web_clients(self, event): """Notify all the connected web clients (over websocket) of a new event""" - get_redis().publish(events_redis_topic, str(event)) + WSEventProxy.publish(event) # noqa: E1120 def _get_secret_key(self, _create=False): if _create: diff --git a/platypush/backend/http/app/mixins/__init__.py b/platypush/backend/http/app/mixins/__init__.py new file mode 100644 index 00000000..516b1117 --- /dev/null +++ b/platypush/backend/http/app/mixins/__init__.py @@ -0,0 +1,158 @@ +from contextlib import contextmanager +from dataclasses import dataclass +import json +import logging +from multiprocessing import RLock +from typing import Generator, Iterable, Optional, Set, Union + +from redis import ConnectionError as RedisConnectionError +from redis.client import PubSub + +from platypush.config import Config +from platypush.message import Message as AppMessage +from platypush.utils import get_redis + +logger = logging.getLogger(__name__) + +MessageType = Union[AppMessage, bytes, str, dict, list, set, tuple] +"""Types of supported messages on Redis/websocket channels.""" + + +@dataclass +class Message: + """ + A wrapper for a message received on a Redis subscription. + """ + + data: bytes + """The data received in the message.""" + channel: str + """The channel the message was received on.""" + + +class PubSubMixin: + """ + A mixin for Tornado route handlers that support pub/sub mechanisms. + """ + + def __init__(self, *_, subscriptions: Optional[Iterable[str]] = None, **__): + self._pubsub: Optional[PubSub] = None + """Pub/sub proxy.""" + self._subscriptions: Set[str] = set(subscriptions or []) + """Set of current channel subscriptions.""" + self._pubsub_lock = RLock() + """ + Subscriptions lock. It ensures that the list of subscriptions is + manipulated by one thread or process at the time. + """ + + self.subscribe(*self._subscriptions) + + @property + @contextmanager + def pubsub(self): + """ + Pub/sub proxy lazy property with context manager. + """ + with self._pubsub_lock: + # Lazy initialization for the pub/sub object. + if self._pubsub is None: + self._pubsub = get_redis().pubsub() + + # Yield the pub/sub object (context manager pattern). + yield self._pubsub + + with self._pubsub_lock: + # Close and free the pub/sub object if it has no active subscriptions. + if self._pubsub is not None and len(self._subscriptions) == 0: + self._pubsub.close() + self._pubsub = None + + @staticmethod + def _serialize(data: MessageType) -> bytes: + """ + Serialize a message as bytes before delivering it to either a Redis or websocket channel. + """ + if isinstance(data, AppMessage): + data = str(data) + if isinstance(data, (list, tuple, set)): + data = list(data) + if isinstance(data, (list, dict)): + data = json.dumps(data, cls=AppMessage.Encoder) + if isinstance(data, str): + data = data.encode('utf-8') + + return data + + @classmethod + def publish(cls, data: MessageType, *channels: str) -> None: + """ + Publish data on one or more Redis channels. + """ + for channel in channels: + get_redis().publish(channel, cls._serialize(data)) + + def subscribe(self, *channels: str) -> None: + """ + Subscribe to a set of Redis channels. + """ + with self.pubsub as pubsub: + for channel in channels: + pubsub.subscribe(channel) + self._subscriptions.add(channel) + + def unsubscribe(self, *channels: str) -> None: + """ + Unsubscribe from a set of Redis channels. + """ + with self.pubsub as pubsub: + for channel in channels: + if channel in self._subscriptions: + pubsub.unsubscribe(channel) + self._subscriptions.remove(channel) + + def listen(self) -> Generator[Message, None, None]: + """ + Listens for pub/sub messages and yields them. + """ + try: + with self.pubsub as pubsub: + for msg in pubsub.listen(): + channel = msg.get('channel', b'').decode() + if msg.get('type') != 'message' or not ( + channel and channel in self._subscriptions + ): + continue + + yield Message(data=msg.get('data', b''), channel=channel) + except (AttributeError, RedisConnectionError): + return + + def _pubsub_close(self): + """ + Closes the pub/sub object. + """ + with self._pubsub_lock: + if self._pubsub is not None: + try: + self._pubsub.close() + except Exception as e: + logger.debug('Error on pubsub close: %s', e) + finally: + self._pubsub = None + + def on_close(self): + """ + Extensible close handler that closes the pub/sub object. + """ + self._pubsub_close() + + @staticmethod + def get_channel(channel: str) -> str: + """ + Utility method that returns the prefixed Redis channel for a certain subscription name. + """ + return f'_platypush/{Config.get("device_id")}/{channel}' # type: ignore + + +# vim:sw=4:ts=4:et: diff --git a/platypush/backend/http/app/streaming/_base.py b/platypush/backend/http/app/streaming/_base.py index e162eeed..e1a861fa 100644 --- a/platypush/backend/http/app/streaming/_base.py +++ b/platypush/backend/http/app/streaming/_base.py @@ -9,18 +9,23 @@ from tornado.web import RequestHandler, stream_request_body from platypush.backend.http.app.utils.auth import AuthStatus, get_auth_status +from ..mixins import PubSubMixin + logger = getLogger(__name__) @stream_request_body -class StreamingRoute(RequestHandler, ABC): +class StreamingRoute(RequestHandler, PubSubMixin, ABC): """ Base class for Tornado streaming routes. """ @override def prepare(self): - # Perform authentication + """ + Request preparation logic. It performs user authentication if + ``auth_required`` returns True, and it can be extended/overridden. + """ if self.auth_required: auth_status = get_auth_status(self.request) if auth_status != AuthStatus.OK: @@ -33,18 +38,28 @@ class StreamingRoute(RequestHandler, ABC): @override def write_error(self, status_code: int, error: Optional[str] = None, **_): + """ + Make sure that errors are always returned in JSON format. + """ self.set_header("Content-Type", "application/json") self.finish( json.dumps( - {"status": status_code, "error": error or responses[status_code]} + {"status": status_code, "error": error or responses.get(status_code)} ) ) @classmethod @abstractmethod def path(cls) -> str: + """ + Path/URL pattern for this route. + """ raise NotImplementedError() @property - def auth_required(self): + def auth_required(self) -> bool: + """ + If set to True (default) then this route will require user + authentication and return 401 if authentication fails. + """ return True diff --git a/platypush/backend/http/app/streaming/plugins/camera.py b/platypush/backend/http/app/streaming/plugins/camera.py index ccc978c2..84767461 100644 --- a/platypush/backend/http/app/streaming/plugins/camera.py +++ b/platypush/backend/http/app/streaming/plugins/camera.py @@ -56,6 +56,8 @@ class CameraRoute(StreamingRoute): camera.stream.ready.wait(timeout=timeout) return camera.stream.frame + return None + def _should_stop(self): if self._finished: return True diff --git a/platypush/backend/http/app/ws/__init__.py b/platypush/backend/http/app/ws/__init__.py index 7d62e1fe..61a762ab 100644 --- a/platypush/backend/http/app/ws/__init__.py +++ b/platypush/backend/http/app/ws/__init__.py @@ -1,3 +1,3 @@ -from ._base import WSRoute, logger, pubsub_redis_topic +from ._base import WSRoute, logger -__all__ = ['WSRoute', 'logger', 'pubsub_redis_topic'] +__all__ = ['WSRoute', 'logger'] diff --git a/platypush/backend/http/app/ws/_base.py b/platypush/backend/http/app/ws/_base.py index 3ce53378..40274b71 100644 --- a/platypush/backend/http/app/ws/_base.py +++ b/platypush/backend/http/app/ws/_base.py @@ -1,37 +1,28 @@ -from abc import ABC, abstractclassmethod -import json +from abc import ABC, abstractmethod from logging import getLogger -from threading import RLock, Thread -from typing import Any, Generator, Iterable, Optional, Union +from threading import Thread from typing_extensions import override -from redis import ConnectionError as RedisConnectionError from tornado.ioloop import IOLoop from tornado.websocket import WebSocketHandler from platypush.backend.http.app.utils.auth import AuthStatus, get_auth_status -from platypush.config import Config -from platypush.message import Message -from platypush.utils import get_redis + +from ..mixins import MessageType, PubSubMixin logger = getLogger(__name__) -def pubsub_redis_topic(topic: str) -> str: - return f'_platypush/{Config.get("device_id")}/{topic}' # type: ignore - - -class WSRoute(WebSocketHandler, Thread, ABC): +class WSRoute(WebSocketHandler, Thread, PubSubMixin, ABC): """ Base class for Tornado websocket endpoints. """ - def __init__(self, *args, redis_topics: Optional[Iterable[str]] = None, **kwargs): - super().__init__(*args, **kwargs) - self._redis_topics = set(redis_topics or []) - self._sub = get_redis().pubsub() + def __init__(self, *args, **kwargs): + WebSocketHandler.__init__(self, *args) + PubSubMixin.__init__(self, **kwargs) + Thread.__init__(self) self._io_loop = IOLoop.current() - self._sub_lock = RLock() @override def open(self, *_, **__): @@ -51,10 +42,11 @@ class WSRoute(WebSocketHandler, Thread, ABC): pass @override - def on_message(self, message): # type: ignore - pass + def on_message(self, message): + return message - @abstractclassmethod + @classmethod + @abstractmethod def app_name(cls) -> str: raise NotImplementedError() @@ -66,55 +58,25 @@ class WSRoute(WebSocketHandler, Thread, ABC): def auth_required(self): return True - def subscribe(self, *topics: str) -> None: - with self._sub_lock: - for topic in topics: - self._sub.subscribe(topic) - self._redis_topics.add(topic) - - def unsubscribe(self, *topics: str) -> None: - with self._sub_lock: - for topic in topics: - if topic in self._redis_topics: - self._sub.unsubscribe(topic) - self._redis_topics.remove(topic) - - def listen(self) -> Generator[Any, None, None]: - try: - for msg in self._sub.listen(): - if ( - msg.get('type') != 'message' - and msg.get('channel').decode() not in self._redis_topics - ): - continue - - yield msg.get('data') - except (AttributeError, RedisConnectionError): - return - - def send(self, msg: Union[str, bytes, dict, list, tuple, set]) -> None: - if isinstance(msg, (list, tuple, set)): - msg = list(msg) - if isinstance(msg, (list, dict)): - msg = json.dumps(msg, cls=Message.Encoder) - + def send(self, msg: MessageType) -> None: self._io_loop.asyncio_loop.call_soon_threadsafe( # type: ignore - self.write_message, msg + self.write_message, self._serialize(msg) ) @override def run(self) -> None: super().run() - for topic in self._redis_topics: - self._sub.subscribe(topic) + self.subscribe(*self._subscriptions) @override def on_close(self): - topics = self._redis_topics.copy() - for topic in topics: - self.unsubscribe(topic) + super().on_close() + for channel in self._subscriptions.copy(): + self.unsubscribe(channel) + + if self._pubsub: + self._pubsub.close() - self._sub.close() logger.info( 'Client %s disconnected from %s, reason=%s, message=%s', self.request.remote_ip, diff --git a/platypush/backend/http/app/ws/events.py b/platypush/backend/http/app/ws/events.py index e96833aa..53751ebb 100644 --- a/platypush/backend/http/app/ws/events.py +++ b/platypush/backend/http/app/ws/events.py @@ -1,12 +1,11 @@ from typing_extensions import override +from platypush.backend.http.app.mixins import MessageType from platypush.message.event import Event -from . import WSRoute, logger, pubsub_redis_topic +from . import WSRoute, logger from ..utils import send_message -events_redis_topic = pubsub_redis_topic('events') - class WSEventProxy(WSRoute): """ @@ -14,14 +13,23 @@ class WSEventProxy(WSRoute): """ def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.subscribe(events_redis_topic) + super().__init__(*args, subscriptions=[self.events_channel], **kwargs) @classmethod @override def app_name(cls) -> str: return 'events' + @classmethod + @property + def events_channel(cls) -> str: + return cls.get_channel('events') + + @override + @classmethod + def publish(cls, data: MessageType, *_) -> None: + super().publish(data, cls.events_channel) + @override def on_message(self, message): try: @@ -38,9 +46,9 @@ class WSEventProxy(WSRoute): def run(self) -> None: for msg in self.listen(): try: - evt = Event.build(msg) + evt = Event.build(msg.data) except Exception as e: logger.warning('Error parsing event: %s: %s', msg, e) continue - self.send(str(evt)) + self.send(evt) diff --git a/platypush/plugins/camera/model/camera.py b/platypush/plugins/camera/model/camera.py index ce027ab4..2116d34e 100644 --- a/platypush/plugins/camera/model/camera.py +++ b/platypush/plugins/camera/model/camera.py @@ -5,7 +5,11 @@ from typing import Optional, Union, Tuple, Set import numpy as np -from platypush.plugins.camera.model.writer import StreamWriter, VideoWriter, FileVideoWriter +from platypush.plugins.camera.model.writer import ( + StreamWriter, + VideoWriter, + FileVideoWriter, +) from platypush.plugins.camera.model.writer.preview import PreviewWriter @@ -32,7 +36,7 @@ class CameraInfo: stream_format: Optional[str] = None vertical_flip: bool = False warmup_frames: int = 0 - warmup_seconds: float = 0. + warmup_seconds: float = 0.0 def set(self, **kwargs): for k, v in kwargs.items(): @@ -97,10 +101,15 @@ class Camera: return writers def effective_resolution(self) -> Tuple[int, int]: + """ + Calculates the effective resolution of the camera in pixels, taking + into account the base resolution, the scale and the rotation. + """ + assert self.info.resolution, 'No base resolution specified' rot = (self.info.rotate or 0) * math.pi / 180 sin = math.sin(rot) cos = math.cos(rot) - scale = np.array([[self.info.scale_x or 1., self.info.scale_y or 1.]]) + scale = np.array([[self.info.scale_x or 1.0, self.info.scale_y or 1.0]]) resolution = np.array([[self.info.resolution[0], self.info.resolution[1]]]) rot_matrix = np.array([[sin, cos], [cos, sin]]) resolution = (scale * abs(np.cross(rot_matrix, resolution)))[0] diff --git a/platypush/plugins/sound/__init__.py b/platypush/plugins/sound/__init__.py index 9f7e4e30..94745a84 100644 --- a/platypush/plugins/sound/__init__.py +++ b/platypush/plugins/sound/__init__.py @@ -1,7 +1,3 @@ -""" -.. moduleauthor:: Fabio Manganiello -""" - import os import queue import stat @@ -10,25 +6,28 @@ import time from enum import Enum from threading import Thread, Event, RLock - -from .core import Sound, Mix +from typing import Optional from platypush.context import get_bus -from platypush.message.event.sound import \ - SoundRecordingStartedEvent, SoundRecordingStoppedEvent +from platypush.message.event.sound import ( + SoundRecordingStartedEvent, + SoundRecordingStoppedEvent, +) from platypush.plugins import Plugin, action +from .core import Sound, Mix + class PlaybackState(Enum): - STOPPED = 'STOPPED', - PLAYING = 'PLAYING', + STOPPED = 'STOPPED' + PLAYING = 'PLAYING' PAUSED = 'PAUSED' class RecordingState(Enum): - STOPPED = 'STOPPED', - RECORDING = 'RECORDING', + STOPPED = 'STOPPED' + RECORDING = 'RECORDING' PAUSED = 'PAUSED' @@ -55,10 +54,14 @@ class SoundPlugin(Plugin): _STREAM_NAME_PREFIX = 'platypush-stream-' _default_input_stream_fifo = os.path.join(tempfile.gettempdir(), 'inputstream') - # noinspection PyProtectedMember - def __init__(self, input_device=None, output_device=None, - input_blocksize=Sound._DEFAULT_BLOCKSIZE, - output_blocksize=Sound._DEFAULT_BLOCKSIZE, **kwargs): + def __init__( + self, + input_device=None, + output_device=None, + input_blocksize=Sound._DEFAULT_BLOCKSIZE, + output_blocksize=Sound._DEFAULT_BLOCKSIZE, + **kwargs, + ): """ :param input_device: Index or name of the default input device. Use :meth:`platypush.plugins.sound.query_devices` to get the @@ -110,6 +113,7 @@ class SoundPlugin(Plugin): """ import sounddevice as sd + return sd.query_hostapis()[0].get('default_' + category.lower() + '_device') @action @@ -174,17 +178,18 @@ class SoundPlugin(Plugin): self.playback_paused_changed[stream_index].wait() if frames != blocksize: - self.logger.warning('Received {} frames, expected blocksize is {}'. - format(frames, blocksize)) + self.logger.warning( + 'Received %d frames, expected blocksize is %d', frames, blocksize + ) return if status.output_underflow: self.logger.warning('Output underflow: increase blocksize?') - outdata[:] = (b'\x00' if is_raw_stream else 0.) * len(outdata) + outdata[:] = (b'\x00' if is_raw_stream else 0.0) * len(outdata) return if status: - self.logger.warning('Audio callback failed: {}'.format(status)) + self.logger.warning('Audio callback failed: %s', status) try: data = q.get_nowait() @@ -193,18 +198,28 @@ class SoundPlugin(Plugin): raise sd.CallbackStop if len(data) < len(outdata): - outdata[:len(data)] = data - outdata[len(data):] = (b'\x00' if is_raw_stream else 0.) * \ - (len(outdata) - len(data)) + outdata[: len(data)] = data + outdata[len(data) :] = (b'\x00' if is_raw_stream else 0.0) * ( + len(outdata) - len(data) + ) else: outdata[:] = data return audio_callback @action - def play(self, file=None, sound=None, device=None, blocksize=None, - bufsize=None, samplerate=None, channels=None, stream_name=None, - stream_index=None): + def play( + self, + file=None, + sound=None, + device=None, + blocksize=None, + bufsize=None, + samplerate=None, + channels=None, + stream_name=None, + stream_index=None, + ): """ Plays a sound file (support formats: wav, raw) or a synthetic sound. @@ -258,8 +273,9 @@ class SoundPlugin(Plugin): """ if not file and not sound: - raise RuntimeError('Please specify either a file to play or a ' + - 'list of sound objects') + raise RuntimeError( + 'Please specify either a file to play or a ' + 'list of sound objects' + ) import sounddevice as sd @@ -274,7 +290,7 @@ class SoundPlugin(Plugin): q = queue.Queue(maxsize=bufsize) f = None - t = 0. + t = 0.0 if file: file = os.path.abspath(os.path.expanduser(file)) @@ -286,6 +302,7 @@ class SoundPlugin(Plugin): if file: import soundfile as sf + f = sf.SoundFile(file) if not samplerate: samplerate = f.samplerate if f else Sound._DEFAULT_SAMPLERATE @@ -295,7 +312,8 @@ class SoundPlugin(Plugin): mix = None with self.playback_state_lock: stream_index, is_new_stream = self._get_or_allocate_stream_index( - stream_index=stream_index, stream_name=stream_name) + stream_index=stream_index, stream_name=stream_name + ) if sound and stream_index in self.stream_mixes: mix = self.stream_mixes[stream_index] @@ -304,9 +322,12 @@ class SoundPlugin(Plugin): if not mix: return None, "Unable to allocate the stream" - self.logger.info(('Starting playback of {} to sound device [{}] ' + - 'on stream [{}]').format( - file or sound, device, stream_index)) + self.logger.info( + 'Starting playback of %s to sound device [%s] on stream [%s]', + file or sound, + device, + stream_index, + ) if not is_new_stream: return # Let the existing callback handle the new mix @@ -323,8 +344,11 @@ class SoundPlugin(Plugin): else: duration = mix.duration() blocktime = float(blocksize / samplerate) - next_t = min(t + blocktime, duration) \ - if duration is not None else t + blocktime + next_t = ( + min(t + blocktime, duration) + if duration is not None + else t + blocktime + ) data = mix.get_wave(t_start=t, t_end=next_t, samplerate=samplerate) t = next_t @@ -339,14 +363,20 @@ class SoundPlugin(Plugin): if stream is None: streamtype = sd.RawOutputStream if file else sd.OutputStream - stream = streamtype(samplerate=samplerate, blocksize=blocksize, - device=device, channels=channels, - dtype='float32', - callback=self._play_audio_callback( - q=q, blocksize=blocksize, - streamtype=streamtype, - stream_index=stream_index), - finished_callback=completed_callback_event.set) + stream = streamtype( + samplerate=samplerate, + blocksize=blocksize, + device=device, + channels=channels, + dtype='float32', + callback=self._play_audio_callback( + q=q, + blocksize=blocksize, + streamtype=streamtype, + stream_index=stream_index, + ), + finished_callback=completed_callback_event.set, + ) self._start_playback(stream_index=stream_index, stream=stream) @@ -356,8 +386,9 @@ class SoundPlugin(Plugin): timeout = blocksize * bufsize / samplerate while True: - while self._get_playback_state(stream_index) == \ - PlaybackState.PAUSED: + while ( + self._get_playback_state(stream_index) == PlaybackState.PAUSED + ): self.playback_paused_changed[stream_index].wait() if f: @@ -367,31 +398,38 @@ class SoundPlugin(Plugin): else: duration = mix.duration() blocktime = float(blocksize / samplerate) - next_t = min(t + blocktime, duration) \ - if duration is not None else t + blocktime + next_t = ( + min(t + blocktime, duration) + if duration is not None + else t + blocktime + ) - data = mix.get_wave(t_start=t, t_end=next_t, - samplerate=samplerate) + data = mix.get_wave( + t_start=t, t_end=next_t, samplerate=samplerate + ) t = next_t if duration is not None and t >= duration: break - if self._get_playback_state(stream_index) == \ - PlaybackState.STOPPED: + if self._get_playback_state(stream_index) == PlaybackState.STOPPED: break try: q.put(data, timeout=timeout) except queue.Full as e: - if self._get_playback_state(stream_index) != \ - PlaybackState.PAUSED: + if ( + self._get_playback_state(stream_index) + != PlaybackState.PAUSED + ): raise e completed_callback_event.wait() except queue.Full: - if stream_index is None or \ - self._get_playback_state(stream_index) != PlaybackState.STOPPED: + if ( + stream_index is None + or self._get_playback_state(stream_index) != PlaybackState.STOPPED + ): self.logger.warning('Playback timeout: audio callback failed?') finally: if f and not f.closed: @@ -400,35 +438,34 @@ class SoundPlugin(Plugin): self.stop_playback([stream_index]) @action - def stream_recording(self, device=None, fifo=None, duration=None, sample_rate=None, - dtype='float32', blocksize=None, latency=0, channels=1): + def stream_recording( + self, + device: Optional[str] = None, + fifo: Optional[str] = None, + duration: Optional[float] = None, + sample_rate: Optional[int] = None, + dtype: Optional[str] = 'float32', + blocksize: Optional[int] = None, + latency: float = 0, + channels: int = 1, + ): """ Return audio data from an audio source - :param device: Input device (default: default configured device or system default audio input if not configured) - :type device: int or str - - :param fifo: Path of the FIFO that will be used to exchange audio samples (default: /tmp/inputstream) - :type fifo: str - - :param duration: Recording duration in seconds (default: record until stop event) - :type duration: float - + :param device: Input device (default: default configured device or + system default audio input if not configured) + :param fifo: Path of the FIFO that will be used to exchange audio + samples (default: /tmp/inputstream) + :param duration: Recording duration in seconds (default: record until + stop event) :param sample_rate: Recording sample rate (default: device default rate) - :type sample_rate: int - :param dtype: Data type for the audio samples. Supported types: - 'float64', 'float32', 'int32', 'int16', 'int8', 'uint8'. Default: float32 - :type dtype: str - - :param blocksize: Audio block size (default: configured `input_blocksize` or 2048) - :type blocksize: int - + 'float64', 'float32', 'int32', 'int16', 'int8', 'uint8'. Default: + float32 + :param blocksize: Audio block size (default: configured + `input_blocksize` or 2048) :param latency: Device latency in seconds (default: 0) - :type latency: float - :param channels: Number of channels (default: 1) - :type channels: int """ import sounddevice as sd @@ -452,43 +489,55 @@ class SoundPlugin(Plugin): q = queue.Queue() - # noinspection PyUnusedLocal - def audio_callback(indata, frames, time_duration, status): + def audio_callback(indata, frames, time_duration, status): # noqa while self._get_recording_state() == RecordingState.PAUSED: self.recording_paused_changed.wait() if status: - self.logger.warning('Recording callback status: {}'.format(str(status))) + self.logger.warning('Recording callback status: %s', status) q.put(indata.copy()) def streaming_thread(): try: - with sd.InputStream(samplerate=sample_rate, device=device, - channels=channels, callback=audio_callback, - dtype=dtype, latency=latency, blocksize=blocksize): - with open(fifo, 'wb') as audio_queue: - self.start_recording() - get_bus().post(SoundRecordingStartedEvent()) - self.logger.info('Started recording from device [{}]'.format(device)) - recording_started_time = time.time() + with sd.InputStream( + samplerate=sample_rate, + device=device, + channels=channels, + callback=audio_callback, + dtype=dtype, + latency=latency, + blocksize=blocksize, + ), open(fifo, 'wb') as audio_queue: + self.start_recording() + get_bus().post(SoundRecordingStartedEvent()) + self.logger.info('Started recording from device [%s]', device) + recording_started_time = time.time() - while self._get_recording_state() != RecordingState.STOPPED \ - and (duration is None or - time.time() - recording_started_time < duration): - while self._get_recording_state() == RecordingState.PAUSED: - self.recording_paused_changed.wait() + while self._get_recording_state() != RecordingState.STOPPED and ( + duration is None + or time.time() - recording_started_time < duration + ): + while self._get_recording_state() == RecordingState.PAUSED: + self.recording_paused_changed.wait() - get_args = { + get_args = ( + { 'block': True, - 'timeout': max(0, duration - (time.time() - recording_started_time)), - } if duration is not None else {} + 'timeout': max( + 0, + duration - (time.time() - recording_started_time), + ), + } + if duration is not None + else {} + ) - data = q.get(**get_args) - if not len(data): - continue + data = q.get(**get_args) + if not len(data): + continue - audio_queue.write(data) + audio_queue.write(data) except queue.Empty: self.logger.warning('Recording timeout: audio callback failed?') finally: @@ -497,17 +546,29 @@ class SoundPlugin(Plugin): if os.path.exists(fifo): if stat.S_ISFIFO(os.stat(fifo).st_mode): - self.logger.info('Removing previous input stream FIFO {}'.format(fifo)) + self.logger.info('Removing previous input stream FIFO %s', fifo) os.unlink(fifo) else: - raise RuntimeError('{} exists and is not a FIFO. Please remove it or rename it'.format(fifo)) + raise RuntimeError( + f'{fifo} exists and is not a FIFO. Please remove it or rename it' + ) os.mkfifo(fifo, 0o644) Thread(target=streaming_thread).start() @action - def record(self, outfile=None, duration=None, device=None, sample_rate=None, - format=None, blocksize=None, latency=0, channels=1, subtype='PCM_24'): + def record( + self, + outfile=None, + duration=None, + device=None, + sample_rate=None, + format=None, + blocksize=None, + latency=0, + channels=1, + subtype='PCM_24', + ): """ Records audio to a sound file (support formats: wav, raw) @@ -535,12 +596,23 @@ class SoundPlugin(Plugin): :param channels: Number of channels (default: 1) :type channels: int - :param subtype: Recording subtype - see `Soundfile docs - Subtypes `_ for a list of the available subtypes (default: PCM_24) + :param subtype: Recording subtype - see `Soundfile docs - Subtypes + `_ + for a list of the available subtypes (default: PCM_24) :type subtype: str """ - def recording_thread(outfile, duration, device, sample_rate, format, - blocksize, latency, channels, subtype): + def recording_thread( + outfile, + duration, + device, + sample_rate, + format, + blocksize, + latency, + channels, + subtype, + ): import sounddevice as sd self.recording_paused_changed.clear() @@ -548,12 +620,15 @@ class SoundPlugin(Plugin): if outfile: outfile = os.path.abspath(os.path.expanduser(outfile)) if os.path.isfile(outfile): - self.logger.info('Removing existing audio file {}'.format(outfile)) + self.logger.info('Removing existing audio file %s', outfile) os.unlink(outfile) else: outfile = tempfile.NamedTemporaryFile( - prefix='recording_', suffix='.wav', delete=False, - dir=tempfile.gettempdir()).name + prefix='recording_', + suffix='.wav', + delete=False, + dir=tempfile.gettempdir(), + ).name if device is None: device = self.input_device @@ -574,42 +649,68 @@ class SoundPlugin(Plugin): self.recording_paused_changed.wait() if status: - self.logger.warning('Recording callback status: {}'.format( - str(status))) + self.logger.warning('Recording callback status: %s', status) - q.put({ - 'timestamp': time.time(), - 'frames': frames, - 'time': duration, - 'data': indata.copy() - }) + q.put( + { + 'timestamp': time.time(), + 'frames': frames, + 'time': duration, + 'data': indata.copy(), + } + ) try: import soundfile as sf - import numpy - with sf.SoundFile(outfile, mode='w', samplerate=sample_rate, - format=format, channels=channels, subtype=subtype) as f: - with sd.InputStream(samplerate=sample_rate, device=device, - channels=channels, callback=audio_callback, - latency=latency, blocksize=blocksize): + with sf.SoundFile( + outfile, + mode='w', + samplerate=sample_rate, + format=format, + channels=channels, + subtype=subtype, + ) as f: + with sd.InputStream( + samplerate=sample_rate, + device=device, + channels=channels, + callback=audio_callback, + latency=latency, + blocksize=blocksize, + ): self.start_recording() get_bus().post(SoundRecordingStartedEvent(filename=outfile)) - self.logger.info('Started recording from device [{}] to [{}]'. - format(device, outfile)) + self.logger.info( + 'Started recording from device [%s] to [%s]', + device, + outfile, + ) recording_started_time = time.time() - while self._get_recording_state() != RecordingState.STOPPED \ - and (duration is None or - time.time() - recording_started_time < duration): + while ( + self._get_recording_state() != RecordingState.STOPPED + and ( + duration is None + or time.time() - recording_started_time < duration + ) + ): while self._get_recording_state() == RecordingState.PAUSED: self.recording_paused_changed.wait() - get_args = { - 'block': True, - 'timeout': max(0, duration - (time.time() - recording_started_time)), - } if duration is not None else {} + get_args = ( + { + 'block': True, + 'timeout': max( + 0, + duration + - (time.time() - recording_started_time), + ), + } + if duration is not None + else {} + ) data = q.get(**get_args) if data and time.time() - data.get('timestamp') <= 1.0: @@ -624,24 +725,45 @@ class SoundPlugin(Plugin): self.stop_recording() get_bus().post(SoundRecordingStoppedEvent(filename=outfile)) - Thread(target=recording_thread, - args=( - outfile, duration, device, sample_rate, format, blocksize, latency, channels, subtype) - ).start() + Thread( + target=recording_thread, + args=( + outfile, + duration, + device, + sample_rate, + format, + blocksize, + latency, + channels, + subtype, + ), + ).start() @action - def recordplay(self, duration=None, input_device=None, output_device=None, - sample_rate=None, blocksize=None, latency=0, channels=1, dtype=None): + def recordplay( + self, + duration=None, + input_device=None, + output_device=None, + sample_rate=None, + blocksize=None, + latency=0, + channels=1, + dtype=None, + ): """ Records audio and plays it on an output sound device (audio pass-through) :param duration: Recording duration in seconds (default: record until stop event) :type duration: float - :param input_device: Input device (default: default configured device or system default audio input if not configured) + :param input_device: Input device (default: default configured device + or system default audio input if not configured) :type input_device: int or str - :param output_device: Output device (default: default configured device or system default audio output if not configured) + :param output_device: Output device (default: default configured device + or system default audio output if not configured) :type output_device: int or str :param sample_rate: Recording sample rate (default: device default rate) @@ -656,7 +778,10 @@ class SoundPlugin(Plugin): :param channels: Number of channels (default: 1) :type channels: int - :param dtype: Data type for the recording - see `Soundfile docs - Recording `_ for available types (default: input device default) + :param dtype: Data type for the recording - see `Soundfile docs - + Recording + `_ + for available types (default: input device default) :type dtype: str """ @@ -687,35 +812,37 @@ class SoundPlugin(Plugin): self.recording_paused_changed.wait() if status: - self.logger.warning('Recording callback status: {}'.format( - str(status))) + self.logger.warning('Recording callback status: %s', status) outdata[:] = indata stream_index = None try: - import soundfile as sf - import numpy - stream_index = self._allocate_stream_index() - stream = sd.Stream(samplerate=sample_rate, channels=channels, - blocksize=blocksize, latency=latency, - device=(input_device, output_device), - dtype=dtype, callback=audio_callback) + stream = sd.Stream( + samplerate=sample_rate, + channels=channels, + blocksize=blocksize, + latency=latency, + device=(input_device, output_device), + dtype=dtype, + callback=audio_callback, + ) self.start_recording() - self._start_playback(stream_index=stream_index, - stream=stream) + self._start_playback(stream_index=stream_index, stream=stream) - self.logger.info('Started recording pass-through from device ' + - '[{}] to sound device [{}]'. - format(input_device, output_device)) + self.logger.info( + 'Started recording pass-through from device [%s] to sound device [%s]', + input_device, + output_device, + ) recording_started_time = time.time() - while self._get_recording_state() != RecordingState.STOPPED \ - and (duration is None or - time.time() - recording_started_time < duration): + while self._get_recording_state() != RecordingState.STOPPED and ( + duration is None or time.time() - recording_started_time < duration + ): while self._get_recording_state() == RecordingState.PAUSED: self.recording_paused_changed.wait() @@ -736,24 +863,35 @@ class SoundPlugin(Plugin): streams = { i: { attr: getattr(stream, attr) - for attr in ['active', 'closed', 'stopped', 'blocksize', - 'channels', 'cpu_load', 'device', 'dtype', - 'latency', 'samplerate', 'samplesize'] + for attr in [ + 'active', + 'closed', + 'stopped', + 'blocksize', + 'channels', + 'cpu_load', + 'device', + 'dtype', + 'latency', + 'samplerate', + 'samplesize', + ] if hasattr(stream, attr) - } for i, stream in self.active_streams.items() + } + for i, stream in self.active_streams.items() } for i, stream in streams.items(): stream['playback_state'] = self.playback_state[i].name stream['name'] = self.stream_index_to_name.get(i) if i in self.stream_mixes: - stream['mix'] = {j: sound for j, sound in - enumerate(list(self.stream_mixes[i]))} + stream['mix'] = dict(enumerate(list(self.stream_mixes[i]))) return streams - def _get_or_allocate_stream_index(self, stream_index=None, stream_name=None, - completed_callback_event=None): + def _get_or_allocate_stream_index( + self, stream_index=None, stream_name=None, completed_callback_event=None + ): stream = None with self.playback_state_lock: @@ -762,22 +900,26 @@ class SoundPlugin(Plugin): stream_index = self.stream_name_to_index.get(stream_name) else: if stream_name is not None: - raise RuntimeError('Redundant specification of both ' + - 'stream_name and stream_index') + raise RuntimeError( + 'Redundant specification of both ' + + 'stream_name and stream_index' + ) if stream_index is not None: stream = self.active_streams.get(stream_index) if not stream: - return (self._allocate_stream_index(stream_name=stream_name, - completed_callback_event= - completed_callback_event), - True) + return ( + self._allocate_stream_index( + stream_name=stream_name, + completed_callback_event=completed_callback_event, + ), + True, + ) return stream_index, False - def _allocate_stream_index(self, stream_name=None, - completed_callback_event=None): + def _allocate_stream_index(self, stream_name=None, completed_callback_event=None): stream_index = None with self.playback_state_lock: @@ -796,8 +938,9 @@ class SoundPlugin(Plugin): self.stream_mixes[stream_index] = Mix() self.stream_index_to_name[stream_index] = stream_name self.stream_name_to_index[stream_name] = stream_index - self.completed_callback_events[stream_index] = \ + self.completed_callback_events[stream_index] = ( completed_callback_event if completed_callback_event else Event() + ) return stream_index @@ -811,8 +954,7 @@ class SoundPlugin(Plugin): else: self.playback_paused_changed[stream_index] = Event() - self.logger.info('Playback started on stream index {}'. - format(stream_index)) + self.logger.info('Playback started on stream index %d', stream_index) return stream_index @@ -835,8 +977,7 @@ class SoundPlugin(Plugin): i = self.stream_name_to_index.get(i) stream = self.active_streams.get(i) if not stream: - self.logger.info('No such stream index or name: {}'. - format(i)) + self.logger.info('No such stream index or name: %d', i) continue if self.completed_callback_events[i]: @@ -859,9 +1000,10 @@ class SoundPlugin(Plugin): if name in self.stream_name_to_index: del self.stream_name_to_index[name] - self.logger.info('Playback stopped on streams [{}]'.format( - ', '.join([str(stream) for stream in - completed_callback_events.keys()]))) + self.logger.info( + 'Playback stopped on streams [%s]', + ', '.join([str(stream) for stream in completed_callback_events]), + ) @action def pause_playback(self, streams=None): @@ -881,8 +1023,7 @@ class SoundPlugin(Plugin): i = self.stream_name_to_index.get(i) stream = self.active_streams.get(i) if not stream: - self.logger.info('No such stream index or name: {}'. - format(i)) + self.logger.info('No such stream index or name: %d', i) continue if self.playback_state[i] == PlaybackState.PAUSED: @@ -894,8 +1035,10 @@ class SoundPlugin(Plugin): self.playback_paused_changed[i].set() - self.logger.info('Playback pause toggled on streams [{}]'.format( - ', '.join([str(stream) for stream in streams]))) + self.logger.info( + 'Playback pause toggled on streams [%s]', + ', '.join([str(stream) for stream in streams]), + ) def start_recording(self): with self.recording_state_lock: @@ -921,8 +1064,14 @@ class SoundPlugin(Plugin): self.recording_paused_changed.set() @action - def release(self, stream_index=None, stream_name=None, - sound_index=None, midi_note=None, frequency=None): + def release( + self, + stream_index=None, + stream_name=None, + sound_index=None, + midi_note=None, + frequency=None, + ): """ Remove a sound from an active stream, either by sound index (use :meth:`platypush.sound.plugin.SoundPlugin.query_streams` to get @@ -949,25 +1098,26 @@ class SoundPlugin(Plugin): if stream_name: if stream_index: - raise RuntimeError('stream_index and stream name are ' + - 'mutually exclusive') + raise RuntimeError( + 'stream_index and stream name are ' + 'mutually exclusive' + ) stream_index = self.stream_name_to_index.get(stream_name) - mixes = { - i: mix for i, mix in self.stream_mixes.items() - } if stream_index is None else { - stream_index: self.stream_mixes[stream_index] - } + mixes = ( + self.stream_mixes.copy() + if stream_index is None + else {stream_index: self.stream_mixes[stream_index]} + ) streams_to_stop = [] for i, mix in mixes.items(): for j, sound in enumerate(mix): - if (sound_index is not None and j == sound_index) or \ - (midi_note is not None - and sound.get('midi_note') == midi_note) or \ - (frequency is not None - and sound.get('frequency') == frequency): + if ( + (sound_index is not None and j == sound_index) + or (midi_note is not None and sound.get('midi_note') == midi_note) + or (frequency is not None and sound.get('frequency') == frequency) + ): if len(list(mix)) == 1: # Last sound in the mix streams_to_stop.append(i) diff --git a/platypush/plugins/sound/core.py b/platypush/plugins/sound/core.py index cfc51342..fc1d3ee2 100644 --- a/platypush/plugins/sound/core.py +++ b/platypush/plugins/sound/core.py @@ -1,7 +1,3 @@ -""" -.. moduleauthor:: Fabio Manganiello -""" - import enum import logging import json @@ -15,7 +11,7 @@ class WaveShape(enum.Enum): TRIANG = 'triang' -class Sound(object): +class Sound: """ Models a basic synthetic sound that can be played through an audio device """ @@ -34,9 +30,16 @@ class Sound(object): duration = None shape = None - def __init__(self, midi_note=midi_note, frequency=None, phase=phase, - gain=gain, duration=duration, shape=WaveShape.SIN, - A_frequency=STANDARD_A_FREQUENCY): + def __init__( + self, + midi_note=midi_note, + frequency=None, + phase=phase, + gain=gain, + duration=duration, + shape=WaveShape.SIN, + A_frequency=STANDARD_A_FREQUENCY, + ): """ You can construct a sound either from a MIDI note or a base frequency @@ -67,20 +70,24 @@ class Sound(object): """ if midi_note and frequency: - raise RuntimeError('Please specify either a MIDI note or a base ' + - 'frequency') + raise RuntimeError( + 'Please specify either a MIDI note or a base ' + 'frequency' + ) if midi_note: self.midi_note = midi_note - self.frequency = self.note_to_freq(midi_note=midi_note, - A_frequency=A_frequency) + self.frequency = self.note_to_freq( + midi_note=midi_note, A_frequency=A_frequency + ) elif frequency: self.frequency = frequency - self.midi_note = self.freq_to_note(frequency=frequency, - A_frequency=A_frequency) + self.midi_note = self.freq_to_note( + frequency=frequency, A_frequency=A_frequency + ) else: - raise RuntimeError('Please specify either a MIDI note or a base ' + - 'frequency') + raise RuntimeError( + 'Please specify either a MIDI note or a base ' + 'frequency' + ) self.phase = phase self.gain = gain @@ -99,8 +106,7 @@ class Sound(object): :type A_frequency: float """ - return (2.0 ** ((midi_note - cls.STANDARD_A_MIDI_NOTE) / 12.0)) \ - * A_frequency + return (2.0 ** ((midi_note - cls.STANDARD_A_MIDI_NOTE) / 12.0)) * A_frequency @classmethod def freq_to_note(cls, frequency, A_frequency=STANDARD_A_FREQUENCY): @@ -116,10 +122,11 @@ class Sound(object): # TODO return also the offset in % between the provided frequency # and the standard MIDI note frequency - return int(12.0 * math.log(frequency / A_frequency, 2) - + cls.STANDARD_A_MIDI_NOTE) + return int( + 12.0 * math.log(frequency / A_frequency, 2) + cls.STANDARD_A_MIDI_NOTE + ) - def get_wave(self, t_start=0., t_end=0., samplerate=_DEFAULT_SAMPLERATE): + def get_wave(self, t_start=0.0, t_end=0.0, samplerate=_DEFAULT_SAMPLERATE): """ Get the wave binary data associated to this sound @@ -137,6 +144,7 @@ class Sound(object): """ import numpy as np + x = np.linspace(t_start, t_end, int((t_end - t_start) * samplerate)) x = x.reshape(len(x), 1) @@ -148,8 +156,7 @@ class Sound(object): wave[wave < 0] = -1 wave[wave >= 0] = 1 elif self.shape == WaveShape.SAWTOOTH or self.shape == WaveShape.TRIANG: - wave = 2 * (self.frequency * x - - np.floor(0.5 + self.frequency * x)) + wave = 2 * (self.frequency * x - np.floor(0.5 + self.frequency * x)) if self.shape == WaveShape.TRIANG: wave = 2 * np.abs(wave) - 1 else: @@ -157,8 +164,14 @@ class Sound(object): return self.gain * wave - def fft(self, t_start=0., t_end=0., samplerate=_DEFAULT_SAMPLERATE, - freq_range=None, freq_buckets=None): + def fft( + self, + t_start=0.0, + t_end=0.0, + samplerate=_DEFAULT_SAMPLERATE, + freq_range=None, + freq_buckets=None, + ): """ Get the real part of the Fourier transform associated to a time-bounded sample of this sound @@ -173,7 +186,8 @@ class Sound(object): :type samplerate: int :param freq_range: FFT frequency range. Default: ``(0, samplerate/2)`` - (see `Nyquist-Shannon sampling theorem `_) + (see`Nyquist-Shannon sampling theorem + `_) :type freq_range: list or tuple with 2 int elements (range) :param freq_buckets: Number of buckets to subdivide the frequency range. @@ -190,7 +204,7 @@ class Sound(object): wave = self.get_wave(t_start=t_start, t_end=t_end, samplerate=samplerate) fft = np.fft.fft(wave.reshape(len(wave))) - fft = fft.real[freq_range[0]:freq_range[1]] + fft = fft.real[freq_range[0] : freq_range[1]] if freq_buckets is not None: fft = np.histogram(fft, bins=freq_buckets) @@ -224,7 +238,7 @@ class Sound(object): raise RuntimeError('Usage: {}'.format(__doc__)) -class Mix(object): +class Mix: """ This class models a set of mixed :class:`Sound` instances that can be played through an audio stream to an audio device @@ -251,15 +265,22 @@ class Mix(object): def remove(self, sound_index): if sound_index >= len(self._sounds): - self.logger.error('No such sound index: {} in mix {}'.format( - sound_index, list(self))) + self.logger.error( + 'No such sound index: {} in mix {}'.format(sound_index, list(self)) + ) return self._sounds.pop(sound_index) # noinspection PyProtectedMember - def get_wave(self, t_start=0., t_end=0., normalize_range=(-1.0, 1.0), - on_clip='scale', samplerate=Sound._DEFAULT_SAMPLERATE): + def get_wave( + self, + t_start=0.0, + t_end=0.0, + normalize_range=(-1.0, 1.0), + on_clip='scale', + samplerate=Sound._DEFAULT_SAMPLERATE, + ): """ Get the wave binary data associated to this mix @@ -289,8 +310,9 @@ class Mix(object): wave = None for sound in self._sounds: - sound_wave = sound.get_wave(t_start=t_start, t_end=t_end, - samplerate=samplerate) + sound_wave = sound.get_wave( + t_start=t_start, t_end=t_end, samplerate=samplerate + ) if wave is None: wave = sound_wave @@ -298,8 +320,9 @@ class Mix(object): wave += sound_wave if normalize_range and len(wave): - scale_factor = (normalize_range[1] - normalize_range[0]) / \ - (wave.max() - wave.min()) + scale_factor = (normalize_range[1] - normalize_range[0]) / ( + wave.max() - wave.min() + ) if scale_factor < 1.0: # Wave clipping if on_clip == 'scale': @@ -308,14 +331,21 @@ class Mix(object): wave[wave < normalize_range[0]] = normalize_range[0] wave[wave > normalize_range[1]] = normalize_range[1] else: - raise RuntimeError('Supported values for "on_clip": ' + - '"scale" or "clip"') + raise RuntimeError( + 'Supported values for "on_clip": ' + '"scale" or "clip"' + ) return wave # noinspection PyProtectedMember - def fft(self, t_start=0., t_end=0., samplerate=Sound._DEFAULT_SAMPLERATE, - freq_range=None, freq_buckets=None): + def fft( + self, + t_start=0.0, + t_end=0.0, + samplerate=Sound._DEFAULT_SAMPLERATE, + freq_range=None, + freq_buckets=None, + ): """ Get the real part of the Fourier transform associated to a time-bounded sample of this mix @@ -330,7 +360,8 @@ class Mix(object): :type samplerate: int :param freq_range: FFT frequency range. Default: ``(0, samplerate/2)`` - (see `Nyquist-Shannon sampling theorem `_) + (see `Nyquist-Shannon sampling theorem + `_) :type freq_range: list or tuple with 2 int elements (range) :param freq_buckets: Number of buckets to subdivide the frequency range. @@ -347,7 +378,7 @@ class Mix(object): wave = self.get_wave(t_start=t_start, t_end=t_end, samplerate=samplerate) fft = np.fft.fft(wave.reshape(len(wave))) - fft = fft.real[freq_range[0]:freq_range[1]] + fft = fft.real[freq_range[0] : freq_range[1]] if freq_buckets is not None: fft = np.histogram(fft, bins=freq_buckets) @@ -370,4 +401,5 @@ class Mix(object): return duration + # vim:sw=4:ts=4:et: From 4587b262b06a1b439dffac50fe94e8f6823bdb50 Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Mon, 5 Jun 2023 20:40:12 +0200 Subject: [PATCH 07/17] Stream camera frames over HTTP using a Redis pub/sub mechanism. --- .../http/app/streaming/plugins/camera.py | 36 ++++++++++++++++--- platypush/plugins/camera/__init__.py | 22 +++++++++--- .../plugins/camera/model/writer/__init__.py | 14 +++++++- 3 files changed, 63 insertions(+), 9 deletions(-) diff --git a/platypush/backend/http/app/streaming/plugins/camera.py b/platypush/backend/http/app/streaming/plugins/camera.py index 84767461..d3b128ba 100644 --- a/platypush/backend/http/app/streaming/plugins/camera.py +++ b/platypush/backend/http/app/streaming/plugins/camera.py @@ -8,6 +8,7 @@ from tornado.web import stream_request_body from platypush.context import get_plugin from platypush.plugins.camera import Camera, CameraPlugin, StreamWriter +from platypush.utils import get_plugin_name_by_class from .. import StreamingRoute @@ -30,6 +31,8 @@ class CameraRoute(StreamingRoute): Route for camera streams. """ + _redis_queue_prefix = '_platypush/camera' + def __init__(self, *args, **kwargs): # TODO Support multiple concurrent requests super().__init__(*args, **kwargs) @@ -67,9 +70,16 @@ class CameraRoute(StreamingRoute): return True - def send_feed(self, camera: Camera): - while not self._should_stop(): - frame = self._get_frame(camera, timeout=5.0) + def send_feed(self, camera: CameraPlugin): + redis_queue = self._get_redis_queue_by_camera(camera) + for msg in self.listen(): + if self._should_stop(): + break + + if msg.channel != redis_queue: + continue + + frame = msg.data if frame: self.write(frame) self.flush() @@ -111,6 +121,21 @@ class CameraRoute(StreamingRoute): return kwargs + @classmethod + def _get_redis_queue_by_camera(cls, camera: CameraPlugin) -> str: + plugin_name = get_plugin_name_by_class(camera.__class__) + assert plugin_name, f'No such plugin: {plugin_name}' + return '/'.join( + [ + cls._redis_queue_prefix, + plugin_name, + *map( + str, + [camera.camera_info.device] if camera.camera_info.device else [], + ), + ] + ) + def get(self, plugin: str, route: str, extension: str = '') -> None: self._set_request_type_and_extension(route, extension) if not (self._request_type and self._extension): @@ -119,18 +144,21 @@ class CameraRoute(StreamingRoute): stream_class = StreamWriter.get_class_by_name(self._extension) camera = self._get_camera(plugin) + redis_queue = self._get_redis_queue_by_camera(camera) self.set_header('Content-Type', stream_class.mimetype) + self.subscribe(redis_queue) with camera.open( stream=True, stream_format=self._extension, frames_dir=None, + redis_queue=redis_queue, **self._get_args(self.request.arguments), ) as session: camera.start_camera(session) if self._request_type == RequestType.PHOTO: self.send_frame(session) elif self._request_type == RequestType.VIDEO: - self.send_feed(session) + self.send_feed(camera) self.finish() diff --git a/platypush/plugins/camera/__init__.py b/platypush/plugins/camera/__init__.py index cb0dff79..f78246c6 100644 --- a/platypush/plugins/camera/__init__.py +++ b/platypush/plugins/camera/__init__.py @@ -194,7 +194,11 @@ class CameraPlugin(Plugin, ABC): return merged_info def open_device( - self, device: Optional[Union[int, str]] = None, stream: bool = False, **params + self, + device: Optional[Union[int, str]], + stream: bool = False, + redis_queue: Optional[str] = None, + **params, ) -> Camera: """ Initialize and open a device. @@ -231,7 +235,9 @@ class CameraPlugin(Plugin, ABC): if stream: writer_class = StreamWriter.get_class_by_name(camera.info.stream_format) - camera.stream = writer_class(camera=camera, plugin=self) + camera.stream = writer_class( + camera=camera, plugin=self, redis_queue=redis_queue + ) if camera.info.frames_dir: pathlib.Path( @@ -275,19 +281,27 @@ class CameraPlugin(Plugin, ABC): @contextmanager def open( - self, device: Optional[Union[int, str]] = None, stream: bool = None, **info + self, + device: Optional[Union[int, str]] = None, + stream: bool = None, + redis_queue: Optional[str] = None, + **info, ) -> Generator[Camera, None, None]: """ Initialize and open a device using a context manager pattern. :param device: Capture device by name, path or ID. :param stream: If set, the frames will be streamed to ``camera.stream``. + :param redis_queue: If set, the frames will be streamed to + ``redis_queue``. :param info: Camera parameters override - see constructors parameters. :return: The initialized :class:`platypush.plugins.camera.Camera` object. """ camera = None try: - camera = self.open_device(device, stream=stream, **info) + camera = self.open_device( + device, stream=stream, redis_queue=redis_queue, **info + ) yield camera finally: self.close_device(camera) diff --git a/platypush/plugins/camera/model/writer/__init__.py b/platypush/plugins/camera/model/writer/__init__.py index 1113dcf1..a24d780f 100644 --- a/platypush/plugins/camera/model/writer/__init__.py +++ b/platypush/plugins/camera/model/writer/__init__.py @@ -9,6 +9,8 @@ from typing import Optional, IO from PIL.Image import Image +from platypush.utils import get_redis + class VideoWriter(ABC): """ @@ -71,12 +73,19 @@ class StreamWriter(VideoWriter, ABC): Abstract class for camera streaming operations. """ - def __init__(self, *args, sock: Optional[IO] = None, **kwargs): + def __init__( + self, + *args, + sock: Optional[IO] = None, + redis_queue: Optional[str] = None, + **kwargs, + ): super().__init__(*args, **kwargs) self.frame: Optional[bytes] = None self.frame_time: Optional[float] = None self.buffer = io.BytesIO() self.ready = multiprocessing.Condition() + self.redis_queue = redis_queue self.sock = sock def write(self, image: Image): @@ -103,6 +112,9 @@ class StreamWriter(VideoWriter, ABC): self.logger.info('Client connection closed') self.close() + if self.redis_queue: + get_redis().publish(self.redis_queue, data) + @abstractmethod def encode(self, image: Image) -> bytes: """ From e238fcb6e43401f6725f6db5540464df8220faca Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Sun, 11 Jun 2023 12:48:49 +0200 Subject: [PATCH 08/17] Refactoring the `sound` plugin to use ffmpeg as a stream converter. --- .../http/app/routes/plugins/sound/__init__.py | 74 -------- .../backend/http/app/streaming/__init__.py | 4 +- platypush/backend/http/app/streaming/_base.py | 67 +++++++- .../http/app/streaming/plugins/camera.py | 38 +--- .../http/app/streaming/plugins/sound.py | 97 +++++++++++ platypush/backend/http/app/utils/streaming.py | 5 +- platypush/plugins/sound/__init__.py | 117 +++++++------ platypush/plugins/sound/_converter.py | 162 ++++++++++++++++++ platypush/plugins/sound/manifest.yaml | 4 + 9 files changed, 401 insertions(+), 167 deletions(-) delete mode 100644 platypush/backend/http/app/routes/plugins/sound/__init__.py create mode 100644 platypush/backend/http/app/streaming/plugins/sound.py create mode 100644 platypush/plugins/sound/_converter.py diff --git a/platypush/backend/http/app/routes/plugins/sound/__init__.py b/platypush/backend/http/app/routes/plugins/sound/__init__.py deleted file mode 100644 index 8f4ae479..00000000 --- a/platypush/backend/http/app/routes/plugins/sound/__init__.py +++ /dev/null @@ -1,74 +0,0 @@ -import os -import tempfile - -from flask import Response, Blueprint, request - -from platypush.backend.http.app import template_folder -from platypush.backend.http.app.utils import authenticate, send_request - -sound = Blueprint('sound', __name__, template_folder=template_folder) - -# Declare routes list -__routes__ = [ - sound, -] - - -# Generates the .wav file header for a given set of samples and specs -# noinspection PyRedundantParentheses -def gen_header(sample_rate, sample_width, channels): - datasize = int(2000 * 1e6) # Arbitrary data size for streaming - o = bytes("RIFF", ' ascii') # (4byte) Marks file as RIFF - o += (datasize + 36).to_bytes(4, 'little') # (4byte) File size in bytes - o += bytes("WAVE", 'ascii') # (4byte) File type - o += bytes("fmt ", 'ascii') # (4byte) Format Chunk Marker - o += (16).to_bytes(4, 'little') # (4byte) Length of above format data - o += (1).to_bytes(2, 'little') # (2byte) Format type (1 - PCM) - o += channels.to_bytes(2, 'little') # (2byte) - o += sample_rate.to_bytes(4, 'little') # (4byte) - o += (sample_rate * channels * sample_width // 8).to_bytes(4, 'little') # (4byte) - o += (channels * sample_width // 8).to_bytes(2, 'little') # (2byte) - o += sample_width.to_bytes(2, 'little') # (2byte) - o += bytes("data", 'ascii') # (4byte) Data Chunk Marker - o += datasize.to_bytes(4, 'little') # (4byte) Data size in bytes - return o - - -def audio_feed(device, fifo, sample_rate, blocksize, latency, channels): - send_request(action='sound.stream_recording', device=device, sample_rate=sample_rate, - dtype='int16', fifo=fifo, blocksize=blocksize, latency=latency, - channels=channels) - - try: - with open(fifo, 'rb') as f: # lgtm [py/path-injection] - send_header = True - - while True: - audio = f.read(blocksize) - - if audio: - if send_header: - audio = gen_header(sample_rate=sample_rate, sample_width=16, channels=channels) + audio - send_header = False - - yield audio - finally: - send_request(action='sound.stop_recording') - - -@sound.route('/sound/stream', methods=['GET']) -@authenticate() -def get_sound_feed(): - device = request.args.get('device') - sample_rate = request.args.get('sample_rate', 44100) - blocksize = request.args.get('blocksize', 512) - latency = request.args.get('latency', 0) - channels = request.args.get('channels', 1) - fifo = request.args.get('fifo', os.path.join(tempfile.gettempdir(), 'inputstream')) - - return Response(audio_feed(device=device, fifo=fifo, sample_rate=sample_rate, - blocksize=blocksize, latency=latency, channels=channels), - mimetype='audio/x-wav;codec=pcm') - - -# vim:sw=4:ts=4:et: diff --git a/platypush/backend/http/app/streaming/__init__.py b/platypush/backend/http/app/streaming/__init__.py index b174974e..eb0937e9 100644 --- a/platypush/backend/http/app/streaming/__init__.py +++ b/platypush/backend/http/app/streaming/__init__.py @@ -1,3 +1,3 @@ -from ._base import StreamingRoute, logger +from ._base import StreamingRoute -__all__ = ['StreamingRoute', 'logger'] +__all__ = ['StreamingRoute'] diff --git a/platypush/backend/http/app/streaming/_base.py b/platypush/backend/http/app/streaming/_base.py index e1a861fa..0e698617 100644 --- a/platypush/backend/http/app/streaming/_base.py +++ b/platypush/backend/http/app/streaming/_base.py @@ -11,8 +11,6 @@ from platypush.backend.http.app.utils.auth import AuthStatus, get_auth_status from ..mixins import PubSubMixin -logger = getLogger(__name__) - @stream_request_body class StreamingRoute(RequestHandler, PubSubMixin, ABC): @@ -20,6 +18,10 @@ class StreamingRoute(RequestHandler, PubSubMixin, ABC): Base class for Tornado streaming routes. """ + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.logger = getLogger(__name__) + @override def prepare(self): """ @@ -32,7 +34,7 @@ class StreamingRoute(RequestHandler, PubSubMixin, ABC): self.send_error(auth_status.value.code, error=auth_status.value.message) return - logger.info( + self.logger.info( 'Client %s connected to %s', self.request.remote_ip, self.request.path ) @@ -63,3 +65,62 @@ class StreamingRoute(RequestHandler, PubSubMixin, ABC): authentication and return 401 if authentication fails. """ return True + + @classmethod + def _get_redis_queue(cls, *_, **__) -> Optional[str]: + """ + Returns the Redis channel associated with a given set of arguments. + + This is None by default, and it should be implemented by subclasses if + required. + """ + return None + + def forward_stream(self, *args, **kwargs): + """ + Utility method that does the following: + + 1. It listens for new messages on the subscribed Redis channels; + 2. It applies a filter on the channel if :meth:`._get_redis_queue` + returns a non-null result given ``args`` and ``kwargs``; + 3. It forward the frames read from the Redis channel(s) to the HTTP client; + 4. It periodically invokes :meth:`._should_stop` to cleanly + terminate when the HTTP client socket is closed. + + """ + redis_queue = self._get_redis_queue( # pylint: disable=assignment-from-none + *args, **kwargs + ) + + if redis_queue: + self.subscribe(redis_queue) + + try: + for msg in self.listen(): + if self._should_stop(): + break + + if redis_queue and msg.channel != redis_queue: + continue + + frame = msg.data + if frame: + self.write(frame) + self.flush() + finally: + if redis_queue: + self.unsubscribe(redis_queue) + + def _should_stop(self): + """ + Utility method used by :meth:`._forward_stream` to automatically + terminate when the client connection is closed (it can be overridden by + the subclasses). + """ + if self._finished: + return True + + if self.request.connection and getattr(self.request.connection, 'stream', None): + return self.request.connection.stream.closed() # type: ignore + + return True diff --git a/platypush/backend/http/app/streaming/plugins/camera.py b/platypush/backend/http/app/streaming/plugins/camera.py index d3b128ba..cde01592 100644 --- a/platypush/backend/http/app/streaming/plugins/camera.py +++ b/platypush/backend/http/app/streaming/plugins/camera.py @@ -1,19 +1,17 @@ from enum import Enum import json -from logging import getLogger from typing import Optional from typing_extensions import override from tornado.web import stream_request_body from platypush.context import get_plugin +from platypush.config import Config from platypush.plugins.camera import Camera, CameraPlugin, StreamWriter from platypush.utils import get_plugin_name_by_class from .. import StreamingRoute -logger = getLogger(__name__) - class RequestType(Enum): """ @@ -31,10 +29,9 @@ class CameraRoute(StreamingRoute): Route for camera streams. """ - _redis_queue_prefix = '_platypush/camera' + _redis_queue_prefix = f'_platypush/{Config.get("device_id") or ""}/camera' def __init__(self, *args, **kwargs): - # TODO Support multiple concurrent requests super().__init__(*args, **kwargs) self._camera: Optional[Camera] = None self._request_type = RequestType.UNKNOWN @@ -61,29 +58,6 @@ class CameraRoute(StreamingRoute): return None - def _should_stop(self): - if self._finished: - return True - - if self.request.connection and getattr(self.request.connection, 'stream', None): - return self.request.connection.stream.closed() # type: ignore - - return True - - def send_feed(self, camera: CameraPlugin): - redis_queue = self._get_redis_queue_by_camera(camera) - for msg in self.listen(): - if self._should_stop(): - break - - if msg.channel != redis_queue: - continue - - frame = msg.data - if frame: - self.write(frame) - self.flush() - def send_frame(self, camera: Camera): frame = None for _ in range(camera.info.warmup_frames): @@ -121,8 +95,9 @@ class CameraRoute(StreamingRoute): return kwargs + @override @classmethod - def _get_redis_queue_by_camera(cls, camera: CameraPlugin) -> str: + def _get_redis_queue(cls, camera: CameraPlugin, *_, **__) -> str: plugin_name = get_plugin_name_by_class(camera.__class__) assert plugin_name, f'No such plugin: {plugin_name}' return '/'.join( @@ -144,9 +119,8 @@ class CameraRoute(StreamingRoute): stream_class = StreamWriter.get_class_by_name(self._extension) camera = self._get_camera(plugin) - redis_queue = self._get_redis_queue_by_camera(camera) + redis_queue = self._get_redis_queue(camera) self.set_header('Content-Type', stream_class.mimetype) - self.subscribe(redis_queue) with camera.open( stream=True, @@ -159,6 +133,6 @@ class CameraRoute(StreamingRoute): if self._request_type == RequestType.PHOTO: self.send_frame(session) elif self._request_type == RequestType.VIDEO: - self.send_feed(camera) + self.forward_stream(camera) self.finish() diff --git a/platypush/backend/http/app/streaming/plugins/sound.py b/platypush/backend/http/app/streaming/plugins/sound.py new file mode 100644 index 00000000..69e7b45a --- /dev/null +++ b/platypush/backend/http/app/streaming/plugins/sound.py @@ -0,0 +1,97 @@ +from contextlib import contextmanager +import json +from typing import Generator, Optional +from typing_extensions import override + +from tornado.web import stream_request_body + +from platypush.backend.http.app.utils import send_request +from platypush.config import Config + +from .. import StreamingRoute + + +@stream_request_body +class SoundRoute(StreamingRoute): + """ + Route for audio streams. + """ + + _redis_queue_prefix = f'_platypush/{Config.get("device_id") or ""}/sound' + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._audio_headers_written: bool = False + """Send the audio file headers before we send the first audio frame.""" + + @override + @classmethod + def path(cls) -> str: + return r"/sound/stream\.?([a-zA-Z0-9_]+)?" + + @contextmanager + def _audio_stream(self, **kwargs) -> Generator[None, None, None]: + response = send_request( + 'sound.stream_recording', + dtype='int16', + **kwargs, + ) + + assert response and not response.is_error(), ( + 'Streaming error: ' + str(response.errors) if response else '(unknown)' + ) + + yield + send_request('sound.stop_recording') + + @override + @classmethod + def _get_redis_queue(cls, device: Optional[str] = None, *_, **__) -> str: + return '/'.join([cls._redis_queue_prefix, *([device] if device else [])]) + + def _get_args(self, **kwargs): + kwargs.update({k: v[0].decode() for k, v in self.request.arguments.items()}) + device = kwargs.get('device') + return { + 'device': device, + 'sample_rate': int(kwargs.get('sample_rate', 44100)), + 'blocksize': int(kwargs.get('blocksize', 512)), + 'latency': float(kwargs.get('latency', 0)), + 'channels': int(kwargs.get('channels', 1)), + 'format': kwargs.get('format', 'wav'), + 'redis_queue': kwargs.get('redis_queue', self._get_redis_queue(device)), + } + + @staticmethod + def _content_type_by_extension(extension: str) -> str: + if extension == 'mp3': + return 'audio/mpeg' + if extension == 'ogg': + return 'audio/ogg' + if extension == 'wav': + return 'audio/wav;codec=pcm' + if extension == 'flac': + return 'audio/flac' + if extension == 'aac': + return 'audio/aac' + return 'application/octet-stream' + + def get(self, extension: Optional[str] = None) -> None: + ext = extension or 'wav' + args = self._get_args(format=ext) + + try: + with self._audio_stream(**args): + self.set_header('Content-Type', self._content_type_by_extension(ext)) + self.forward_stream(**args) + + self.finish() + except AssertionError as e: + self.set_header("Content-Type", "application/json") + self.set_status(400, str(e)) + self.finish(json.dumps({"error": str(e)})) + except Exception as e: + self.set_header("Content-Type", "application/json") + self.logger.exception(e) + self.set_status(500, str(e)) + self.finish(json.dumps({"error": str(e)})) diff --git a/platypush/backend/http/app/utils/streaming.py b/platypush/backend/http/app/utils/streaming.py index 02a9dd99..16ec231d 100644 --- a/platypush/backend/http/app/utils/streaming.py +++ b/platypush/backend/http/app/utils/streaming.py @@ -1,3 +1,4 @@ +import logging import os import importlib import inspect @@ -5,7 +6,9 @@ from typing import List, Type import pkgutil -from ..streaming import StreamingRoute, logger +from ..streaming import StreamingRoute + +logger = logging.getLogger(__name__) def get_streaming_routes() -> List[Type[StreamingRoute]]: diff --git a/platypush/plugins/sound/__init__.py b/platypush/plugins/sound/__init__.py index 94745a84..4af83d62 100644 --- a/platypush/plugins/sound/__init__.py +++ b/platypush/plugins/sound/__init__.py @@ -6,7 +6,10 @@ import time from enum import Enum from threading import Thread, Event, RLock -from typing import Optional +from typing import Optional, Union + +import sounddevice as sd +import soundfile as sf from platypush.context import get_bus from platypush.message.event.sound import ( @@ -15,8 +18,10 @@ from platypush.message.event.sound import ( ) from platypush.plugins import Plugin, action +from platypush.utils import get_redis from .core import Sound, Mix +from ._converter import ConverterProcess class PlaybackState(Enum): @@ -49,10 +54,11 @@ class SoundPlugin(Plugin): * **sounddevice** (``pip install sounddevice``) * **soundfile** (``pip install soundfile``) * **numpy** (``pip install numpy``) + * **ffmpeg** package installed on the system (for streaming support) + """ _STREAM_NAME_PREFIX = 'platypush-stream-' - _default_input_stream_fifo = os.path.join(tempfile.gettempdir(), 'inputstream') def __init__( self, @@ -60,6 +66,7 @@ class SoundPlugin(Plugin): output_device=None, input_blocksize=Sound._DEFAULT_BLOCKSIZE, output_blocksize=Sound._DEFAULT_BLOCKSIZE, + ffmpeg_bin: str = 'ffmpeg', **kwargs, ): """ @@ -82,6 +89,9 @@ class SoundPlugin(Plugin): Try to increase this value if you get output underflow errors while playing. Default: 1024 :type output_blocksize: int + + :param ffmpeg_bin: Path of the ``ffmpeg`` binary (default: search for + the ``ffmpeg`` in the ``PATH``). """ super().__init__(**kwargs) @@ -102,6 +112,7 @@ class SoundPlugin(Plugin): self.stream_name_to_index = {} self.stream_index_to_name = {} self.completed_callback_events = {} + self.ffmpeg_bin = ffmpeg_bin @staticmethod def _get_default_device(category): @@ -111,9 +122,6 @@ class SoundPlugin(Plugin): :param category: Device category to query. Can be either input or output :type category: str """ - - import sounddevice as sd - return sd.query_hostapis()[0].get('default_' + category.lower() + '_device') @action @@ -155,8 +163,6 @@ class SoundPlugin(Plugin): """ - import sounddevice as sd - devs = sd.query_devices() if category == 'input': devs = [d for d in devs if d.get('max_input_channels') > 0] @@ -166,8 +172,6 @@ class SoundPlugin(Plugin): return devs def _play_audio_callback(self, q, blocksize, streamtype, stream_index): - import sounddevice as sd - is_raw_stream = streamtype == sd.RawOutputStream def audio_callback(outdata, frames, *, status): @@ -277,8 +281,6 @@ class SoundPlugin(Plugin): 'Please specify either a file to play or a ' + 'list of sound objects' ) - import sounddevice as sd - if blocksize is None: blocksize = self.output_blocksize @@ -301,8 +303,6 @@ class SoundPlugin(Plugin): device = self._get_default_device('output') if file: - import soundfile as sf - f = sf.SoundFile(file) if not samplerate: samplerate = f.samplerate if f else Sound._DEFAULT_SAMPLERATE @@ -444,10 +444,12 @@ class SoundPlugin(Plugin): fifo: Optional[str] = None, duration: Optional[float] = None, sample_rate: Optional[int] = None, - dtype: Optional[str] = 'float32', + dtype: str = 'float32', blocksize: Optional[int] = None, - latency: float = 0, + latency: Union[float, str] = 'high', channels: int = 1, + redis_queue: Optional[str] = None, + format: str = 'wav', ): """ Return audio data from an audio source @@ -464,12 +466,13 @@ class SoundPlugin(Plugin): float32 :param blocksize: Audio block size (default: configured `input_blocksize` or 2048) - :param latency: Device latency in seconds (default: 0) + :param latency: Device latency in seconds (default: the device's default high latency) :param channels: Number of channels (default: 1) + :param redis_queue: If set, the audio chunks will also be published to + this Redis channel, so other consumers can process them downstream. + :param format: Audio format. Supported: wav, mp3, ogg, aac. Default: wav. """ - import sounddevice as sd - self.recording_paused_changed.clear() if device is None: @@ -485,30 +488,42 @@ class SoundPlugin(Plugin): blocksize = self.input_blocksize if not fifo: - fifo = self._default_input_stream_fifo + fifo = os.devnull - q = queue.Queue() + def audio_callback(audio_converter: ConverterProcess): + # _ = frames + # __ = time + def callback(indata, _, __, status): + while self._get_recording_state() == RecordingState.PAUSED: + self.recording_paused_changed.wait() - def audio_callback(indata, frames, time_duration, status): # noqa - while self._get_recording_state() == RecordingState.PAUSED: - self.recording_paused_changed.wait() + if status: + self.logger.warning('Recording callback status: %s', status) - if status: - self.logger.warning('Recording callback status: %s', status) + audio_converter.write(indata.tobytes()) - q.put(indata.copy()) + return callback def streaming_thread(): try: - with sd.InputStream( + with ConverterProcess( + ffmpeg_bin=self.ffmpeg_bin, + sample_rate=sample_rate, + channels=channels, + dtype=dtype, + chunk_size=self.input_blocksize, + output_format=format, + ) as converter, sd.InputStream( samplerate=sample_rate, device=device, channels=channels, - callback=audio_callback, + callback=audio_callback(converter), dtype=dtype, latency=latency, blocksize=blocksize, - ), open(fifo, 'wb') as audio_queue: + ), open( + fifo, 'wb' + ) as audio_queue: self.start_recording() get_bus().post(SoundRecordingStartedEvent()) self.logger.info('Started recording from device [%s]', device) @@ -521,23 +536,23 @@ class SoundPlugin(Plugin): while self._get_recording_state() == RecordingState.PAUSED: self.recording_paused_changed.wait() - get_args = ( - { - 'block': True, - 'timeout': max( - 0, - duration - (time.time() - recording_started_time), - ), - } + timeout = ( + max( + 0, + duration - (time.time() - recording_started_time), + ) if duration is not None - else {} + else 1 ) - data = q.get(**get_args) - if not len(data): + data = converter.read(timeout=timeout) + if not data: continue audio_queue.write(data) + if redis_queue: + get_redis().publish(redis_queue, data) + except queue.Empty: self.logger.warning('Recording timeout: audio callback failed?') finally: @@ -548,12 +563,9 @@ class SoundPlugin(Plugin): if stat.S_ISFIFO(os.stat(fifo).st_mode): self.logger.info('Removing previous input stream FIFO %s', fifo) os.unlink(fifo) - else: - raise RuntimeError( - f'{fifo} exists and is not a FIFO. Please remove it or rename it' - ) + else: + os.mkfifo(fifo, 0o644) - os.mkfifo(fifo, 0o644) Thread(target=streaming_thread).start() @action @@ -565,7 +577,7 @@ class SoundPlugin(Plugin): sample_rate=None, format=None, blocksize=None, - latency=0, + latency='high', channels=1, subtype='PCM_24', ): @@ -590,7 +602,7 @@ class SoundPlugin(Plugin): :param blocksize: Audio block size (default: configured `input_blocksize` or 2048) :type blocksize: int - :param latency: Device latency in seconds (default: 0) + :param latency: Device latency in seconds (default: the device's default high latency) :type latency: float :param channels: Number of channels (default: 1) @@ -613,8 +625,6 @@ class SoundPlugin(Plugin): channels, subtype, ): - import sounddevice as sd - self.recording_paused_changed.clear() if outfile: @@ -661,8 +671,6 @@ class SoundPlugin(Plugin): ) try: - import soundfile as sf - with sf.SoundFile( outfile, mode='w', @@ -785,8 +793,6 @@ class SoundPlugin(Plugin): :type dtype: str """ - import sounddevice as sd - self.recording_paused_changed.clear() if input_device is None: @@ -806,8 +812,9 @@ class SoundPlugin(Plugin): if blocksize is None: blocksize = self.output_blocksize - # noinspection PyUnusedLocal - def audio_callback(indata, outdata, frames, time, status): + # _ = frames + # __ = time + def audio_callback(indata, outdata, _, __, status): while self._get_recording_state() == RecordingState.PAUSED: self.recording_paused_changed.wait() diff --git a/platypush/plugins/sound/_converter.py b/platypush/plugins/sound/_converter.py new file mode 100644 index 00000000..ee0f41a7 --- /dev/null +++ b/platypush/plugins/sound/_converter.py @@ -0,0 +1,162 @@ +import asyncio +from asyncio.subprocess import PIPE +from queue import Empty + +from queue import Queue +from threading import Thread +from typing import Optional, Self + +from platypush.context import get_or_create_event_loop + +_dtype_to_ffmpeg_format = { + 'int8': 's8', + 'uint8': 'u8', + 'int16': 's16le', + 'uint16': 'u16le', + 'int32': 's32le', + 'uint32': 'u32le', + 'float32': 'f32le', + 'float64': 'f64le', +} +""" +Supported input types: + 'int8', 'uint8', 'int16', 'uint16', 'int32', 'uint32', 'float32', 'float64' +""" + +_output_format_to_ffmpeg_args = { + 'wav': ('-f', 'wav'), + 'ogg': ('-f', 'ogg'), + 'mp3': ('-f', 'mp3'), + 'aac': ('-f', 'adts'), + 'flac': ('-f', 'flac'), +} + + +class ConverterProcess(Thread): + """ + Wrapper for an ffmpeg converter instance. + """ + + def __init__( + self, + ffmpeg_bin: str, + sample_rate: int, + channels: int, + dtype: str, + chunk_size: int, + output_format: str, + *args, + **kwargs, + ): + """ + :param ffmpeg_bin: Path to the ffmpeg binary. + :param sample_rate: The sample rate of the input audio. + :param channels: The number of channels of the input audio. + :param dtype: The (numpy) data type of the raw input audio. + :param chunk_size: Number of bytes that will be read at once from the + ffmpeg process. + :param output_format: Output audio format. + """ + super().__init__(*args, **kwargs) + + ffmpeg_format = _dtype_to_ffmpeg_format.get(dtype) + assert ffmpeg_format, ( + f'Unsupported data type: {dtype}. Supported data types: ' + f'{list(_dtype_to_ffmpeg_format.keys())}' + ) + + self._ffmpeg_bin = ffmpeg_bin + self._ffmpeg_format = ffmpeg_format + self._sample_rate = sample_rate + self._channels = channels + self._chunk_size = chunk_size + self._output_format = output_format + self._closed = False + self._out_queue = Queue() + self.ffmpeg = None + self._loop = None + + def __enter__(self) -> Self: + self.start() + return self + + def __exit__(self, *_, **__): + if self.ffmpeg and self._loop: + self._loop.call_soon_threadsafe(self.ffmpeg.kill) + + self.ffmpeg = None + + if self._loop: + self._loop = None + + def _check_ffmpeg(self): + assert ( + self.ffmpeg and self.ffmpeg.returncode is None + ), 'The ffmpeg process has already terminated' + + def _get_format_args(self): + ffmpeg_args = _output_format_to_ffmpeg_args.get(self._output_format) + assert ffmpeg_args, ( + f'Unsupported output format: {self._output_format}. Supported formats: ' + f'{list(_output_format_to_ffmpeg_args.keys())}' + ) + + return ffmpeg_args + + async def _audio_proxy(self, timeout: Optional[float] = None): + self.ffmpeg = await asyncio.create_subprocess_exec( + self._ffmpeg_bin, + '-f', + self._ffmpeg_format, + '-ar', + str(self._sample_rate), + '-ac', + str(self._channels), + '-i', + 'pipe:', + *self._get_format_args(), + 'pipe:', + stdin=PIPE, + stdout=PIPE, + ) + + try: + await asyncio.wait_for(self.ffmpeg.wait(), 0.1) + except asyncio.TimeoutError: + pass + + while self._loop and self.ffmpeg and self.ffmpeg.returncode is None: + self._check_ffmpeg() + assert ( + self.ffmpeg and self.ffmpeg.stdout + ), 'The stdout is closed for the ffmpeg process' + + try: + data = await asyncio.wait_for( + self.ffmpeg.stdout.read(self._chunk_size), timeout + ) + self._out_queue.put(data) + except asyncio.TimeoutError: + self._out_queue.put(b'') + + def write(self, data: bytes): + self._check_ffmpeg() + assert ( + self.ffmpeg and self._loop and self.ffmpeg.stdin + ), 'The stdin is closed for the ffmpeg process' + + self._loop.call_soon_threadsafe(self.ffmpeg.stdin.write, data) + + def read(self, timeout: Optional[float] = None) -> Optional[bytes]: + try: + return self._out_queue.get(timeout=timeout) + except Empty: + return None + + def run(self): + super().run() + self._loop = get_or_create_event_loop() + self._loop.run_until_complete(self._audio_proxy(timeout=1)) + + +# vim:sw=4:ts=4:et: diff --git a/platypush/plugins/sound/manifest.yaml b/platypush/plugins/sound/manifest.yaml index c833f0ac..a2cddcf9 100644 --- a/platypush/plugins/sound/manifest.yaml +++ b/platypush/plugins/sound/manifest.yaml @@ -11,5 +11,9 @@ manifest: - sounddevice - soundfile - numpy + apt: + - ffmpeg + pacman: + - ffmpeg package: platypush.plugins.sound type: plugin From a415c5b231a161fa4e3cbb5025e72dca9ced4ab4 Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Mon, 12 Jun 2023 12:33:14 +0200 Subject: [PATCH 09/17] Merged outfile/fifo logic in `sound.stream_recording`. --- platypush/plugins/sound/__init__.py | 34 +++++++++++++++++------------ 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/platypush/plugins/sound/__init__.py b/platypush/plugins/sound/__init__.py index 4af83d62..31dfa313 100644 --- a/platypush/plugins/sound/__init__.py +++ b/platypush/plugins/sound/__init__.py @@ -442,6 +442,7 @@ class SoundPlugin(Plugin): self, device: Optional[str] = None, fifo: Optional[str] = None, + outfile: Optional[str] = None, duration: Optional[float] = None, sample_rate: Optional[int] = None, dtype: str = 'float32', @@ -456,8 +457,10 @@ class SoundPlugin(Plugin): :param device: Input device (default: default configured device or system default audio input if not configured) - :param fifo: Path of the FIFO that will be used to exchange audio - samples (default: /tmp/inputstream) + :param fifo: Path of a FIFO that will be used to exchange audio frames + with other consumers. + :param outfile: If specified, the audio data will be persisted on the + specified audio file too. :param duration: Recording duration in seconds (default: record until stop event) :param sample_rate: Recording sample rate (default: device default rate) @@ -487,8 +490,18 @@ class SoundPlugin(Plugin): if blocksize is None: blocksize = self.input_blocksize - if not fifo: - fifo = os.devnull + if fifo: + fifo = os.path.expanduser(fifo) + if os.path.exists(fifo) and stat.S_ISFIFO(os.stat(fifo).st_mode): + self.logger.info('Removing previous input stream FIFO %s', fifo) + os.unlink(fifo) + + os.mkfifo(fifo, 0o644) + outfile = fifo + elif outfile: + outfile = os.path.expanduser(outfile) + + outfile = outfile or fifo or os.devnull def audio_callback(audio_converter: ConverterProcess): # _ = frames @@ -522,8 +535,8 @@ class SoundPlugin(Plugin): latency=latency, blocksize=blocksize, ), open( - fifo, 'wb' - ) as audio_queue: + outfile, 'wb' + ) as f: self.start_recording() get_bus().post(SoundRecordingStartedEvent()) self.logger.info('Started recording from device [%s]', device) @@ -549,7 +562,7 @@ class SoundPlugin(Plugin): if not data: continue - audio_queue.write(data) + f.write(data) if redis_queue: get_redis().publish(redis_queue, data) @@ -559,13 +572,6 @@ class SoundPlugin(Plugin): self.stop_recording() get_bus().post(SoundRecordingStoppedEvent()) - if os.path.exists(fifo): - if stat.S_ISFIFO(os.stat(fifo).st_mode): - self.logger.info('Removing previous input stream FIFO %s', fifo) - os.unlink(fifo) - else: - os.mkfifo(fifo, 0o644) - Thread(target=streaming_thread).start() @action From be794316a80d64dca979a0c34a3cca7006a135ea Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Mon, 12 Jun 2023 13:06:02 +0200 Subject: [PATCH 10/17] Merged `sound.stream_recording` and `sound.record`. --- .../http/app/streaming/plugins/sound.py | 2 +- platypush/plugins/sound/__init__.py | 202 ++---------------- 2 files changed, 20 insertions(+), 184 deletions(-) diff --git a/platypush/backend/http/app/streaming/plugins/sound.py b/platypush/backend/http/app/streaming/plugins/sound.py index 69e7b45a..b1688f3d 100644 --- a/platypush/backend/http/app/streaming/plugins/sound.py +++ b/platypush/backend/http/app/streaming/plugins/sound.py @@ -32,7 +32,7 @@ class SoundRoute(StreamingRoute): @contextmanager def _audio_stream(self, **kwargs) -> Generator[None, None, None]: response = send_request( - 'sound.stream_recording', + 'sound.record', dtype='int16', **kwargs, ) diff --git a/platypush/plugins/sound/__init__.py b/platypush/plugins/sound/__init__.py index 31dfa313..55d382da 100644 --- a/platypush/plugins/sound/__init__.py +++ b/platypush/plugins/sound/__init__.py @@ -1,8 +1,8 @@ import os import queue import stat -import tempfile import time +import warnings from enum import Enum from threading import Thread, Event, RLock @@ -438,7 +438,20 @@ class SoundPlugin(Plugin): self.stop_playback([stream_index]) @action - def stream_recording( + def stream_recording(self, *args, **kwargs): + """ + Deprecated alias for :meth:`.record`. + """ + warnings.warn( + 'sound.stream_recording is deprecated, use sound.record instead', + DeprecationWarning, + stacklevel=1, + ) + + return self.record(*args, **kwargs) + + @action + def record( self, device: Optional[str] = None, fifo: Optional[str] = None, @@ -451,6 +464,7 @@ class SoundPlugin(Plugin): channels: int = 1, redis_queue: Optional[str] = None, format: str = 'wav', + stream: bool = True, ): """ Return audio data from an audio source @@ -474,6 +488,8 @@ class SoundPlugin(Plugin): :param redis_queue: If set, the audio chunks will also be published to this Redis channel, so other consumers can process them downstream. :param format: Audio format. Supported: wav, mp3, ogg, aac. Default: wav. + :param stream: If True (default), then the audio will be streamed to an + HTTP endpoint too (default: ``/sound/stream<.format>``). """ self.recording_paused_changed.clear() @@ -563,7 +579,7 @@ class SoundPlugin(Plugin): continue f.write(data) - if redis_queue: + if redis_queue and stream: get_redis().publish(redis_queue, data) except queue.Empty: @@ -574,186 +590,6 @@ class SoundPlugin(Plugin): Thread(target=streaming_thread).start() - @action - def record( - self, - outfile=None, - duration=None, - device=None, - sample_rate=None, - format=None, - blocksize=None, - latency='high', - channels=1, - subtype='PCM_24', - ): - """ - Records audio to a sound file (support formats: wav, raw) - - :param outfile: Sound file (default: the method will create a temporary file with the recording) - :type outfile: str - - :param duration: Recording duration in seconds (default: record until stop event) - :type duration: float - - :param device: Input device (default: default configured device or system default audio input if not configured) - :type device: int or str - - :param sample_rate: Recording sample rate (default: device default rate) - :type sample_rate: int - - :param format: Audio format (default: WAV) - :type format: str - - :param blocksize: Audio block size (default: configured `input_blocksize` or 2048) - :type blocksize: int - - :param latency: Device latency in seconds (default: the device's default high latency) - :type latency: float - - :param channels: Number of channels (default: 1) - :type channels: int - - :param subtype: Recording subtype - see `Soundfile docs - Subtypes - `_ - for a list of the available subtypes (default: PCM_24) - :type subtype: str - """ - - def recording_thread( - outfile, - duration, - device, - sample_rate, - format, - blocksize, - latency, - channels, - subtype, - ): - self.recording_paused_changed.clear() - - if outfile: - outfile = os.path.abspath(os.path.expanduser(outfile)) - if os.path.isfile(outfile): - self.logger.info('Removing existing audio file %s', outfile) - os.unlink(outfile) - else: - outfile = tempfile.NamedTemporaryFile( - prefix='recording_', - suffix='.wav', - delete=False, - dir=tempfile.gettempdir(), - ).name - - if device is None: - device = self.input_device - if device is None: - device = self._get_default_device('input') - - if sample_rate is None: - dev_info = sd.query_devices(device, 'input') - sample_rate = int(dev_info['default_samplerate']) - - if blocksize is None: - blocksize = self.input_blocksize - - q = queue.Queue() - - def audio_callback(indata, frames, duration, status): - while self._get_recording_state() == RecordingState.PAUSED: - self.recording_paused_changed.wait() - - if status: - self.logger.warning('Recording callback status: %s', status) - - q.put( - { - 'timestamp': time.time(), - 'frames': frames, - 'time': duration, - 'data': indata.copy(), - } - ) - - try: - with sf.SoundFile( - outfile, - mode='w', - samplerate=sample_rate, - format=format, - channels=channels, - subtype=subtype, - ) as f: - with sd.InputStream( - samplerate=sample_rate, - device=device, - channels=channels, - callback=audio_callback, - latency=latency, - blocksize=blocksize, - ): - self.start_recording() - get_bus().post(SoundRecordingStartedEvent(filename=outfile)) - self.logger.info( - 'Started recording from device [%s] to [%s]', - device, - outfile, - ) - - recording_started_time = time.time() - - while ( - self._get_recording_state() != RecordingState.STOPPED - and ( - duration is None - or time.time() - recording_started_time < duration - ) - ): - while self._get_recording_state() == RecordingState.PAUSED: - self.recording_paused_changed.wait() - - get_args = ( - { - 'block': True, - 'timeout': max( - 0, - duration - - (time.time() - recording_started_time), - ), - } - if duration is not None - else {} - ) - - data = q.get(**get_args) - if data and time.time() - data.get('timestamp') <= 1.0: - # Only write the block if the latency is still acceptable - f.write(data['data']) - - f.flush() - - except queue.Empty: - self.logger.warning('Recording timeout: audio callback failed?') - finally: - self.stop_recording() - get_bus().post(SoundRecordingStoppedEvent(filename=outfile)) - - Thread( - target=recording_thread, - args=( - outfile, - duration, - device, - sample_rate, - format, - blocksize, - latency, - channels, - subtype, - ), - ).start() - @action def recordplay( self, From c8786b75de5c1dbd30da09bf0c758101c84adcbe Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Mon, 12 Jun 2023 22:15:02 +0200 Subject: [PATCH 11/17] `sound.recordplay` merged into `sound.record`. --- platypush/plugins/sound/__init__.py | 155 +++++++--------------------- 1 file changed, 40 insertions(+), 115 deletions(-) diff --git a/platypush/plugins/sound/__init__.py b/platypush/plugins/sound/__init__.py index 55d382da..e3afe961 100644 --- a/platypush/plugins/sound/__init__.py +++ b/platypush/plugins/sound/__init__.py @@ -122,7 +122,7 @@ class SoundPlugin(Plugin): :param category: Device category to query. Can be either input or output :type category: str """ - return sd.query_hostapis()[0].get('default_' + category.lower() + '_device') + return sd.query_hostapis()[0].get('default_' + category.lower() + '_device') # type: ignore @action def query_devices(self, category=None): @@ -165,9 +165,9 @@ class SoundPlugin(Plugin): devs = sd.query_devices() if category == 'input': - devs = [d for d in devs if d.get('max_input_channels') > 0] + devs = [d for d in devs if d.get('max_input_channels') > 0] # type: ignore elif category == 'output': - devs = [d for d in devs if d.get('max_output_channels') > 0] + devs = [d for d in devs if d.get('max_output_channels') > 0] # type: ignore return devs @@ -454,6 +454,7 @@ class SoundPlugin(Plugin): def record( self, device: Optional[str] = None, + output_device: Optional[str] = None, fifo: Optional[str] = None, outfile: Optional[str] = None, duration: Optional[float] = None, @@ -465,12 +466,16 @@ class SoundPlugin(Plugin): redis_queue: Optional[str] = None, format: str = 'wav', stream: bool = True, + play_audio: bool = False, ): """ Return audio data from an audio source :param device: Input device (default: default configured device or system default audio input if not configured) + :param output_device: Audio output device if ``play_audio=True`` (audio + pass-through) (default: default configured device or system default + audio output if not configured) :param fifo: Path of a FIFO that will be used to exchange audio frames with other consumers. :param outfile: If specified, the audio data will be persisted on the @@ -483,6 +488,8 @@ class SoundPlugin(Plugin): float32 :param blocksize: Audio block size (default: configured `input_blocksize` or 2048) + :param play_audio: If True, then the recorded audio will be played in + real-time on the selected ``output_device`` (default: False). :param latency: Device latency in seconds (default: the device's default high latency) :param channels: Number of channels (default: 1) :param redis_queue: If set, the audio chunks will also be published to @@ -499,9 +506,18 @@ class SoundPlugin(Plugin): if device is None: device = self._get_default_device('input') + if play_audio: + output_device = ( + output_device + or self.output_device + or self._get_default_device('output') + ) + + device = (device, output_device) # type: ignore + if sample_rate is None: dev_info = sd.query_devices(device, 'input') - sample_rate = int(dev_info['default_samplerate']) + sample_rate = int(dev_info['default_samplerate']) # type: ignore if blocksize is None: blocksize = self.input_blocksize @@ -522,7 +538,7 @@ class SoundPlugin(Plugin): def audio_callback(audio_converter: ConverterProcess): # _ = frames # __ = time - def callback(indata, _, __, status): + def callback(indata, outdata, _, __, status): while self._get_recording_state() == RecordingState.PAUSED: self.recording_paused_changed.wait() @@ -530,11 +546,15 @@ class SoundPlugin(Plugin): self.logger.warning('Recording callback status: %s', status) audio_converter.write(indata.tobytes()) + if play_audio: + outdata[:] = indata return callback def streaming_thread(): try: + stream_index = self._allocate_stream_index() if play_audio else None + with ConverterProcess( ffmpeg_bin=self.ffmpeg_bin, sample_rate=sample_rate, @@ -542,7 +562,7 @@ class SoundPlugin(Plugin): dtype=dtype, chunk_size=self.input_blocksize, output_format=format, - ) as converter, sd.InputStream( + ) as converter, sd.Stream( samplerate=sample_rate, device=device, channels=channels, @@ -550,10 +570,15 @@ class SoundPlugin(Plugin): dtype=dtype, latency=latency, blocksize=blocksize, - ), open( + ) as audio_stream, open( outfile, 'wb' ) as f: self.start_recording() + if stream_index: + self._start_playback( + stream_index=stream_index, stream=audio_stream + ) + get_bus().post(SoundRecordingStartedEvent()) self.logger.info('Started recording from device [%s]', device) recording_started_time = time.time() @@ -591,117 +616,17 @@ class SoundPlugin(Plugin): Thread(target=streaming_thread).start() @action - def recordplay( - self, - duration=None, - input_device=None, - output_device=None, - sample_rate=None, - blocksize=None, - latency=0, - channels=1, - dtype=None, - ): + def recordplay(self, *args, **kwargs): """ - Records audio and plays it on an output sound device (audio pass-through) - - :param duration: Recording duration in seconds (default: record until stop event) - :type duration: float - - :param input_device: Input device (default: default configured device - or system default audio input if not configured) - :type input_device: int or str - - :param output_device: Output device (default: default configured device - or system default audio output if not configured) - :type output_device: int or str - - :param sample_rate: Recording sample rate (default: device default rate) - :type sample_rate: int - - :param blocksize: Audio block size (default: configured `output_blocksize` or 2048) - :type blocksize: int - - :param latency: Device latency in seconds (default: 0) - :type latency: float - - :param channels: Number of channels (default: 1) - :type channels: int - - :param dtype: Data type for the recording - see `Soundfile docs - - Recording - `_ - for available types (default: input device default) - :type dtype: str + Deprecated alias for :meth:`.record`. """ + warnings.warn( + 'sound.recordplay is deprecated, use sound.record with `play_audio=True` instead', + DeprecationWarning, + stacklevel=1, + ) - self.recording_paused_changed.clear() - - if input_device is None: - input_device = self.input_device - if input_device is None: - input_device = self._get_default_device('input') - - if output_device is None: - output_device = self.output_device - if output_device is None: - output_device = self._get_default_device('output') - - if sample_rate is None: - dev_info = sd.query_devices(input_device, 'input') - sample_rate = int(dev_info['default_samplerate']) - - if blocksize is None: - blocksize = self.output_blocksize - - # _ = frames - # __ = time - def audio_callback(indata, outdata, _, __, status): - while self._get_recording_state() == RecordingState.PAUSED: - self.recording_paused_changed.wait() - - if status: - self.logger.warning('Recording callback status: %s', status) - - outdata[:] = indata - - stream_index = None - - try: - stream_index = self._allocate_stream_index() - stream = sd.Stream( - samplerate=sample_rate, - channels=channels, - blocksize=blocksize, - latency=latency, - device=(input_device, output_device), - dtype=dtype, - callback=audio_callback, - ) - self.start_recording() - self._start_playback(stream_index=stream_index, stream=stream) - - self.logger.info( - 'Started recording pass-through from device [%s] to sound device [%s]', - input_device, - output_device, - ) - - recording_started_time = time.time() - - while self._get_recording_state() != RecordingState.STOPPED and ( - duration is None or time.time() - recording_started_time < duration - ): - while self._get_recording_state() == RecordingState.PAUSED: - self.recording_paused_changed.wait() - - time.sleep(0.1) - - except queue.Empty: - self.logger.warning('Recording timeout: audio callback failed?') - finally: - self.stop_playback([stream_index]) - self.stop_recording() + return self.record(*args, **kwargs) @action def query_streams(self): From da93f1b3b08de78db00f440e25838eaaf338d3d0 Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Wed, 14 Jun 2023 01:44:36 +0200 Subject: [PATCH 12/17] [Chore] pylint --- platypush/backend/http/app/streaming/plugins/sound.py | 2 +- platypush/plugins/sound/__init__.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/platypush/backend/http/app/streaming/plugins/sound.py b/platypush/backend/http/app/streaming/plugins/sound.py index b1688f3d..fb7a3e8c 100644 --- a/platypush/backend/http/app/streaming/plugins/sound.py +++ b/platypush/backend/http/app/streaming/plugins/sound.py @@ -46,7 +46,7 @@ class SoundRoute(StreamingRoute): @override @classmethod - def _get_redis_queue(cls, device: Optional[str] = None, *_, **__) -> str: + def _get_redis_queue(cls, *_, device: Optional[str] = None, **__) -> str: return '/'.join([cls._redis_queue_prefix, *([device] if device else [])]) def _get_args(self, **kwargs): diff --git a/platypush/plugins/sound/__init__.py b/platypush/plugins/sound/__init__.py index e3afe961..0979d35e 100644 --- a/platypush/plugins/sound/__init__.py +++ b/platypush/plugins/sound/__init__.py @@ -451,7 +451,7 @@ class SoundPlugin(Plugin): return self.record(*args, **kwargs) @action - def record( + def record( # pylint: disable=too-many-statements self, device: Optional[str] = None, output_device: Optional[str] = None, @@ -459,12 +459,12 @@ class SoundPlugin(Plugin): outfile: Optional[str] = None, duration: Optional[float] = None, sample_rate: Optional[int] = None, - dtype: str = 'float32', + dtype: str = 'int16', blocksize: Optional[int] = None, latency: Union[float, str] = 'high', channels: int = 1, redis_queue: Optional[str] = None, - format: str = 'wav', + format: str = 'wav', # pylint: disable=redefined-builtin stream: bool = True, play_audio: bool = False, ): From a6351dddd4ce3cd86574198699389cdf67a66218 Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Fri, 16 Jun 2023 03:12:55 +0200 Subject: [PATCH 13/17] Extracted `AudioRecorder` out of `SoundPlugin`. --- platypush/plugins/sound/__init__.py | 364 +++++++++--------- .../plugins/sound/_controllers/__init__.py | 5 + platypush/plugins/sound/_controllers/_base.py | 227 +++++++++++ .../plugins/sound/_controllers/_recorder.py | 70 ++++ platypush/plugins/sound/_converter.py | 37 +- platypush/plugins/sound/_model.py | 11 + 6 files changed, 517 insertions(+), 197 deletions(-) create mode 100644 platypush/plugins/sound/_controllers/__init__.py create mode 100644 platypush/plugins/sound/_controllers/_base.py create mode 100644 platypush/plugins/sound/_controllers/_recorder.py create mode 100644 platypush/plugins/sound/_model.py diff --git a/platypush/plugins/sound/__init__.py b/platypush/plugins/sound/__init__.py index 0979d35e..c89f3465 100644 --- a/platypush/plugins/sound/__init__.py +++ b/platypush/plugins/sound/__init__.py @@ -1,42 +1,24 @@ +from collections import defaultdict import os import queue import stat -import time +from typing_extensions import override import warnings -from enum import Enum -from threading import Thread, Event, RLock -from typing import Optional, Union +from threading import Event, RLock +from typing import Dict, Optional, Union import sounddevice as sd import soundfile as sf -from platypush.context import get_bus -from platypush.message.event.sound import ( - SoundRecordingStartedEvent, - SoundRecordingStoppedEvent, -) - -from platypush.plugins import Plugin, action -from platypush.utils import get_redis +from platypush.plugins import RunnablePlugin, action from .core import Sound, Mix -from ._converter import ConverterProcess +from ._controllers import AudioRecorder +from ._model import AudioState -class PlaybackState(Enum): - STOPPED = 'STOPPED' - PLAYING = 'PLAYING' - PAUSED = 'PAUSED' - - -class RecordingState(Enum): - STOPPED = 'STOPPED' - RECORDING = 'RECORDING' - PAUSED = 'PAUSED' - - -class SoundPlugin(Plugin): +class SoundPlugin(RunnablePlugin): """ Plugin to interact with a sound device. @@ -105,24 +87,36 @@ class SoundPlugin(Plugin): self.playback_state_lock = RLock() self.playback_paused_changed = {} self.stream_mixes = {} - self.recording_state = RecordingState.STOPPED - self.recording_state_lock = RLock() - self.recording_paused_changed = Event() self.active_streams = {} self.stream_name_to_index = {} self.stream_index_to_name = {} self.completed_callback_events = {} self.ffmpeg_bin = ffmpeg_bin + self._recorders: Dict[str, AudioRecorder] = {} + self._recorder_locks: Dict[str, RLock] = defaultdict(RLock) + @staticmethod - def _get_default_device(category): + def _get_default_device(category: str) -> str: """ Query the default audio devices. :param category: Device category to query. Can be either input or output - :type category: str """ - return sd.query_hostapis()[0].get('default_' + category.lower() + '_device') # type: ignore + host_apis = sd.query_hostapis() + assert host_apis, 'No sound devices found' + available_devices = list( + filter( + lambda x: x is not None, + ( + host_api.get('default_' + category.lower() + '_device') # type: ignore + for host_api in host_apis + ), + ), + ) + + assert available_devices, f'No default "{category}" device found' + return available_devices[0] @action def query_devices(self, category=None): @@ -175,10 +169,10 @@ class SoundPlugin(Plugin): is_raw_stream = streamtype == sd.RawOutputStream def audio_callback(outdata, frames, *, status): - if self._get_playback_state(stream_index) == PlaybackState.STOPPED: + if self._get_playback_state(stream_index) == AudioState.STOPPED: raise sd.CallbackStop - while self._get_playback_state(stream_index) == PlaybackState.PAUSED: + while self._get_playback_state(stream_index) == AudioState.PAUSED: self.playback_paused_changed[stream_index].wait() if frames != blocksize: @@ -378,7 +372,7 @@ class SoundPlugin(Plugin): finished_callback=completed_callback_event.set, ) - self._start_playback(stream_index=stream_index, stream=stream) + self.start_playback(stream_index=stream_index, stream=stream) with stream: # Timeout set until we expect all the buffered blocks to @@ -386,9 +380,7 @@ class SoundPlugin(Plugin): timeout = blocksize * bufsize / samplerate while True: - while ( - self._get_playback_state(stream_index) == PlaybackState.PAUSED - ): + while self._get_playback_state(stream_index) == AudioState.PAUSED: self.playback_paused_changed[stream_index].wait() if f: @@ -412,23 +404,20 @@ class SoundPlugin(Plugin): if duration is not None and t >= duration: break - if self._get_playback_state(stream_index) == PlaybackState.STOPPED: + if self._get_playback_state(stream_index) == AudioState.STOPPED: break try: q.put(data, timeout=timeout) except queue.Full as e: - if ( - self._get_playback_state(stream_index) - != PlaybackState.PAUSED - ): + if self._get_playback_state(stream_index) != AudioState.PAUSED: raise e completed_callback_event.wait() except queue.Full: if ( stream_index is None - or self._get_playback_state(stream_index) != PlaybackState.STOPPED + or self._get_playback_state(stream_index) != AudioState.STOPPED ): self.logger.warning('Playback timeout: audio callback failed?') finally: @@ -450,6 +439,81 @@ class SoundPlugin(Plugin): return self.record(*args, **kwargs) + def create_recorder( + self, + device: str, + output_device: Optional[str] = None, + fifo: Optional[str] = None, + outfile: Optional[str] = None, + duration: Optional[float] = None, + sample_rate: Optional[int] = None, + dtype: str = 'int16', + blocksize: Optional[int] = None, + latency: Union[float, str] = 'high', + channels: int = 1, + redis_queue: Optional[str] = None, + format: str = 'wav', # pylint: disable=redefined-builtin + stream: bool = True, + play_audio: bool = False, + ) -> AudioRecorder: + with self._recorder_locks[device]: + assert self._recorders.get(device) is None, ( + f'Recording already in progress for device {device}', + ) + + if play_audio: + output_device = ( + output_device + or self.output_device + or self._get_default_device('output') + ) + + device = (device, output_device) # type: ignore + input_device = device[0] + else: + input_device = device + + if sample_rate is None: + dev_info = sd.query_devices(device, 'input') + sample_rate = int(dev_info['default_samplerate']) # type: ignore + + if blocksize is None: + blocksize = self.input_blocksize + + if fifo: + fifo = os.path.expanduser(fifo) + if os.path.exists(fifo) and stat.S_ISFIFO(os.stat(fifo).st_mode): + self.logger.info('Removing previous input stream FIFO %s', fifo) + os.unlink(fifo) + + os.mkfifo(fifo, 0o644) + outfile = fifo + elif outfile: + outfile = os.path.expanduser(outfile) + + outfile = outfile or fifo or os.devnull + self._recorders[input_device] = AudioRecorder( + plugin=self, + device=device, + outfile=outfile, + duration=duration, + sample_rate=sample_rate, + dtype=dtype, + blocksize=blocksize, + latency=latency, + output_format=format, + channels=channels, + redis_queue=redis_queue, + stream=stream, + audio_pass_through=play_audio, + should_stop=self._should_stop, + ) + + return self._recorders[input_device] + + def _get_input_device(self, device: Optional[str] = None) -> str: + return device or self.input_device or self._get_default_device('input') + @action def record( # pylint: disable=too-many-statements self, @@ -499,121 +563,23 @@ class SoundPlugin(Plugin): HTTP endpoint too (default: ``/sound/stream<.format>``). """ - self.recording_paused_changed.clear() - - if device is None: - device = self.input_device - if device is None: - device = self._get_default_device('input') - - if play_audio: - output_device = ( - output_device - or self.output_device - or self._get_default_device('output') - ) - - device = (device, output_device) # type: ignore - - if sample_rate is None: - dev_info = sd.query_devices(device, 'input') - sample_rate = int(dev_info['default_samplerate']) # type: ignore - - if blocksize is None: - blocksize = self.input_blocksize - - if fifo: - fifo = os.path.expanduser(fifo) - if os.path.exists(fifo) and stat.S_ISFIFO(os.stat(fifo).st_mode): - self.logger.info('Removing previous input stream FIFO %s', fifo) - os.unlink(fifo) - - os.mkfifo(fifo, 0o644) - outfile = fifo - elif outfile: - outfile = os.path.expanduser(outfile) - - outfile = outfile or fifo or os.devnull - - def audio_callback(audio_converter: ConverterProcess): - # _ = frames - # __ = time - def callback(indata, outdata, _, __, status): - while self._get_recording_state() == RecordingState.PAUSED: - self.recording_paused_changed.wait() - - if status: - self.logger.warning('Recording callback status: %s', status) - - audio_converter.write(indata.tobytes()) - if play_audio: - outdata[:] = indata - - return callback - - def streaming_thread(): - try: - stream_index = self._allocate_stream_index() if play_audio else None - - with ConverterProcess( - ffmpeg_bin=self.ffmpeg_bin, - sample_rate=sample_rate, - channels=channels, - dtype=dtype, - chunk_size=self.input_blocksize, - output_format=format, - ) as converter, sd.Stream( - samplerate=sample_rate, - device=device, - channels=channels, - callback=audio_callback(converter), - dtype=dtype, - latency=latency, - blocksize=blocksize, - ) as audio_stream, open( - outfile, 'wb' - ) as f: - self.start_recording() - if stream_index: - self._start_playback( - stream_index=stream_index, stream=audio_stream - ) - - get_bus().post(SoundRecordingStartedEvent()) - self.logger.info('Started recording from device [%s]', device) - recording_started_time = time.time() - - while self._get_recording_state() != RecordingState.STOPPED and ( - duration is None - or time.time() - recording_started_time < duration - ): - while self._get_recording_state() == RecordingState.PAUSED: - self.recording_paused_changed.wait() - - timeout = ( - max( - 0, - duration - (time.time() - recording_started_time), - ) - if duration is not None - else 1 - ) - - data = converter.read(timeout=timeout) - if not data: - continue - - f.write(data) - if redis_queue and stream: - get_redis().publish(redis_queue, data) - - except queue.Empty: - self.logger.warning('Recording timeout: audio callback failed?') - finally: - self.stop_recording() - get_bus().post(SoundRecordingStoppedEvent()) - - Thread(target=streaming_thread).start() + device = self._get_input_device(device) + self.create_recorder( + device, + output_device=output_device, + fifo=fifo, + outfile=outfile, + duration=duration, + sample_rate=sample_rate, + dtype=dtype, + blocksize=blocksize, + latency=latency, + channels=channels, + redis_queue=redis_queue, + format=format, + stream=stream, + play_audio=play_audio, + ).start() @action def recordplay(self, *args, **kwargs): @@ -626,6 +592,7 @@ class SoundPlugin(Plugin): stacklevel=1, ) + kwargs['play_audio'] = True return self.record(*args, **kwargs) @action @@ -718,9 +685,9 @@ class SoundPlugin(Plugin): return stream_index - def _start_playback(self, stream_index, stream): + def start_playback(self, stream_index, stream): with self.playback_state_lock: - self.playback_state[stream_index] = PlaybackState.PLAYING + self.playback_state[stream_index] = AudioState.RUNNING self.active_streams[stream_index] = stream if isinstance(self.playback_paused_changed.get(stream_index), Event): @@ -756,7 +723,7 @@ class SoundPlugin(Plugin): if self.completed_callback_events[i]: completed_callback_events[i] = self.completed_callback_events[i] - self.playback_state[i] = PlaybackState.STOPPED + self.playback_state[i] = AudioState.STOPPED for i, event in completed_callback_events.items(): event.wait() @@ -800,10 +767,10 @@ class SoundPlugin(Plugin): self.logger.info('No such stream index or name: %d', i) continue - if self.playback_state[i] == PlaybackState.PAUSED: - self.playback_state[i] = PlaybackState.PLAYING - elif self.playback_state[i] == PlaybackState.PLAYING: - self.playback_state[i] = PlaybackState.PAUSED + if self.playback_state[i] == AudioState.PAUSED: + self.playback_state[i] = AudioState.RUNNING + elif self.playback_state[i] == AudioState.RUNNING: + self.playback_state[i] = AudioState.PAUSED else: continue @@ -814,28 +781,41 @@ class SoundPlugin(Plugin): ', '.join([str(stream) for stream in streams]), ) - def start_recording(self): - with self.recording_state_lock: - self.recording_state = RecordingState.RECORDING - @action - def stop_recording(self): - with self.recording_state_lock: - self.recording_state = RecordingState.STOPPED - self.logger.info('Recording stopped') - - @action - def pause_recording(self): - with self.recording_state_lock: - if self.recording_state == RecordingState.PAUSED: - self.recording_state = RecordingState.RECORDING - elif self.recording_state == RecordingState.RECORDING: - self.recording_state = RecordingState.PAUSED - else: + def stop_recording( + self, device: Optional[str] = None, timeout: Optional[float] = 2 + ): + """ + Stop the current recording process on the selected device (default: + default input device), if it is running. + """ + device = self._get_input_device(device) + with self._recorder_locks[device]: + recorder = self._recorders.pop(device, None) + if not recorder: + self.logger.warning('No active recording session for device %s', device) return - self.logger.info('Recording paused state toggled') - self.recording_paused_changed.set() + recorder.notify_stop() + recorder.join(timeout=timeout) + + @action + def pause_recording(self, device: Optional[str] = None): + """ + Toggle the recording pause state on the selected device (default: + default input device), if it is running. + + If paused, the recording will be resumed. If running, it will be + paused. Otherwise, no action will be taken. + """ + device = self._get_input_device(device) + with self._recorder_locks[device]: + recorder = self._recorders.get(device) + if not recorder: + self.logger.warning('No active recording session for device %s', device) + return + + recorder.notify_pause() @action def release( @@ -905,9 +885,17 @@ class SoundPlugin(Plugin): with self.playback_state_lock: return self.playback_state[stream_index] - def _get_recording_state(self): - with self.recording_state_lock: - return self.recording_state + @override + def main(self): + self.wait_stop() + + @override + def stop(self): + super().stop() + devices = list(self._recorders.keys()) + + for device in devices: + self.stop_recording(device, timeout=0) # vim:sw=4:ts=4:et: diff --git a/platypush/plugins/sound/_controllers/__init__.py b/platypush/plugins/sound/_controllers/__init__.py new file mode 100644 index 00000000..01ce5728 --- /dev/null +++ b/platypush/plugins/sound/_controllers/__init__.py @@ -0,0 +1,5 @@ +from ._base import AudioThread +from ._recorder import AudioRecorder + + +__all__ = ['AudioRecorder', 'AudioThread'] diff --git a/platypush/plugins/sound/_controllers/_base.py b/platypush/plugins/sound/_controllers/_base.py new file mode 100644 index 00000000..e7060cd9 --- /dev/null +++ b/platypush/plugins/sound/_controllers/_base.py @@ -0,0 +1,227 @@ +from contextlib import contextmanager +import queue +import time + +from abc import ABC, abstractmethod +from logging import getLogger +from threading import Event, RLock, Thread +from typing import IO, Generator, Optional, Tuple, Union +from typing_extensions import override + +import sounddevice as sd + +from .._converter import ConverterProcess +from .._model import AudioState + + +class AudioThread(Thread, ABC): + """ + Base class for audio play/record threads. + """ + + _STREAM_NAME_PREFIX = 'platypush-stream-' + + def __init__( + self, + plugin, + device: Union[str, Tuple[str, str]], + outfile: str, + output_format: str, + channels: int, + sample_rate: int, + dtype: str, + stream: bool, + audio_pass_through: bool, + duration: Optional[float] = None, + blocksize: Optional[int] = None, + latency: Union[float, str] = 'high', + redis_queue: Optional[str] = None, + should_stop: Optional[Event] = None, + **kwargs, + ): + from .. import SoundPlugin + + super().__init__(**kwargs) + + self.plugin: SoundPlugin = plugin + self.device = device + self.outfile = outfile + self.output_format = output_format + self.channels = channels + self.sample_rate = sample_rate + self.dtype = dtype + self.stream = stream + self.duration = duration + self.blocksize = blocksize + self.latency = latency + self.redis_queue = redis_queue + self.audio_pass_through = audio_pass_through + self.logger = getLogger(__name__) + + self._state = AudioState.STOPPED + self._state_lock = RLock() + self._started_time: Optional[float] = None + self._converter: Optional[ConverterProcess] = None + self._should_stop = should_stop or Event() + self.paused_changed = Event() + + @property + def should_stop(self) -> bool: + """ + Proxy for `._should_stop.is_set()`. + """ + return self._should_stop.is_set() + + @abstractmethod + def _audio_callback(self, audio_converter: ConverterProcess): + """ + Returns a callback to handle the raw frames captures from the audio device. + """ + raise NotImplementedError() + + @abstractmethod + def _on_audio_converted(self, data: bytes, out_f: IO): + """ + This callback will be called when the audio data has been converted. + """ + raise NotImplementedError() + + def main( + self, + converter: ConverterProcess, + audio_stream: sd.Stream, + out_stream_index: Optional[int], + out_f: IO, + ): + """ + Main loop. + """ + self.notify_start() + if out_stream_index: + self.plugin.start_playback( + stream_index=out_stream_index, stream=audio_stream + ) + + self.logger.info( + 'Started %s on device [%s]', self.__class__.__name__, self.device + ) + self._started_time = time.time() + + while ( + self.state != AudioState.STOPPED + and not self.should_stop + and ( + self.duration is None + or time.time() - self._started_time < self.duration + ) + ): + while self.state == AudioState.PAUSED: + self.paused_changed.wait() + + if self.should_stop: + break + + timeout = ( + max( + 0, + self.duration - (time.time() - self._started_time), + ) + if self.duration is not None + else 1 + ) + + data = converter.read(timeout=timeout) + if not data: + continue + + self._on_audio_converted(data, out_f) + + @override + def run(self): + super().run() + self.paused_changed.clear() + + try: + stream_index = ( + self.plugin._allocate_stream_index() # pylint: disable=protected-access + if self.audio_pass_through + else None + ) + + with self.open_converter() as converter, sd.Stream( + samplerate=self.sample_rate, + device=self.device, + channels=self.channels, + callback=self._audio_callback(converter), + dtype=self.dtype, + latency=self.latency, + blocksize=self.blocksize, + ) as audio_stream, open(self.outfile, 'wb') as f: + self.main( + out_stream_index=stream_index, + converter=converter, + audio_stream=audio_stream, + out_f=f, + ) + except queue.Empty: + self.logger.warning( + 'Audio callback timeout for %s', self.__class__.__name__ + ) + finally: + self.notify_stop() + + @contextmanager + def open_converter(self) -> Generator[ConverterProcess, None, None]: + assert not self._converter, 'A converter process is already running' + self._converter = ConverterProcess( + ffmpeg_bin=self.plugin.ffmpeg_bin, + sample_rate=self.sample_rate, + channels=self.channels, + dtype=self.dtype, + chunk_size=self.plugin.input_blocksize, + output_format=self.output_format, + ) + + self._converter.start() + yield self._converter + + self._converter.stop() + self._converter.join(timeout=2) + self._converter = None + + def notify_start(self): + self.state = AudioState.RUNNING + + def notify_stop(self): + self.state = AudioState.STOPPED + if self._converter: + self._converter.stop() + + def notify_pause(self): + states = { + AudioState.PAUSED: AudioState.RUNNING, + AudioState.RUNNING: AudioState.PAUSED, + } + + with self._state_lock: + new_state = states.get(self.state) + if new_state: + self.state = new_state + else: + return + + self.logger.info('Paused state toggled for %s', self.__class__.__name__) + self.paused_changed.set() + + @property + def state(self): + with self._state_lock: + return self._state + + @state.setter + def state(self, value: AudioState): + with self._state_lock: + self._state = value + + +# vim:sw=4:ts=4:et: diff --git a/platypush/plugins/sound/_controllers/_recorder.py b/platypush/plugins/sound/_controllers/_recorder.py new file mode 100644 index 00000000..ef6adf26 --- /dev/null +++ b/platypush/plugins/sound/_controllers/_recorder.py @@ -0,0 +1,70 @@ +from dataclasses import dataclass + +from typing import IO +from typing_extensions import override + +from platypush.context import get_bus +from platypush.message.event.sound import ( + SoundRecordingStartedEvent, + SoundRecordingStoppedEvent, +) + +from platypush.utils import get_redis + +from .._converter import ConverterProcess +from .._model import AudioState +from ._base import AudioThread + + +@dataclass +class AudioRecorder(AudioThread): + """ + The ``AudioRecorder`` thread is responsible for recording audio from the + input device, writing it to the converter process and dispatch the + converted audio to the registered consumers. + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + @override + def _audio_callback(self, audio_converter: ConverterProcess): + # _ = frames + # __ = time + def callback(indata, outdata, _, __, status): + if self.state == AudioState.PAUSED: + return + + if status: + self.logger.warning('Recording callback status: %s', status) + + try: + audio_converter.write(indata.tobytes()) + except AssertionError as e: + self.logger.warning('Audio recorder callback error: %s', e) + self.state = AudioState.STOPPED + return + + if self.audio_pass_through: + outdata[:] = indata + + return callback + + @override + def _on_audio_converted(self, data: bytes, out_f: IO): + out_f.write(data) + if self.redis_queue and self.stream: + get_redis().publish(self.redis_queue, data) + + @override + def notify_start(self): + super().notify_start() + get_bus().post(SoundRecordingStartedEvent()) + + @override + def notify_stop(self): + super().notify_stop() + get_bus().post(SoundRecordingStoppedEvent()) + + +# vim:sw=4:ts=4:et: diff --git a/platypush/plugins/sound/_converter.py b/platypush/plugins/sound/_converter.py index ee0f41a7..3aa307f2 100644 --- a/platypush/plugins/sound/_converter.py +++ b/platypush/plugins/sound/_converter.py @@ -3,7 +3,7 @@ from asyncio.subprocess import PIPE from queue import Empty from queue import Queue -from threading import Thread +from threading import Event, RLock, Thread from typing import Optional, Self from platypush.context import get_or_create_event_loop @@ -75,19 +75,15 @@ class ConverterProcess(Thread): self._out_queue = Queue() self.ffmpeg = None self._loop = None + self._should_stop = Event() + self._stop_lock = RLock() def __enter__(self) -> Self: self.start() return self def __exit__(self, *_, **__): - if self.ffmpeg and self._loop: - self._loop.call_soon_threadsafe(self.ffmpeg.kill) - - self.ffmpeg = None - - if self._loop: - self._loop = None + self.stop() def _check_ffmpeg(self): assert ( @@ -125,7 +121,12 @@ class ConverterProcess(Thread): except asyncio.TimeoutError: pass - while self._loop and self.ffmpeg and self.ffmpeg.returncode is None: + while ( + self._loop + and self.ffmpeg + and self.ffmpeg.returncode is None + and not self.should_stop + ): self._check_ffmpeg() assert ( self.ffmpeg and self.ffmpeg.stdout @@ -158,5 +159,23 @@ class ConverterProcess(Thread): self._loop = get_or_create_event_loop() self._loop.run_until_complete(self._audio_proxy(timeout=1)) + def stop(self): + with self._stop_lock: + self._should_stop.set() + if self.ffmpeg: + try: + self.ffmpeg.kill() + except ProcessLookupError: + pass + + self.ffmpeg = None + + if self._loop: + self._loop = None + + @property + def should_stop(self) -> bool: + return self._should_stop.is_set() + # vim:sw=4:ts=4:et: diff --git a/platypush/plugins/sound/_model.py b/platypush/plugins/sound/_model.py new file mode 100644 index 00000000..2f121513 --- /dev/null +++ b/platypush/plugins/sound/_model.py @@ -0,0 +1,11 @@ +from enum import Enum + + +class AudioState(Enum): + """ + Audio states. + """ + + STOPPED = 'STOPPED' + RUNNING = 'RUNNING' + PAUSED = 'PAUSED' From 9aa8e4538af55399e07a86b42ed36feef01e1966 Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Fri, 16 Jun 2023 11:47:37 +0200 Subject: [PATCH 14/17] Better termination logic for the ffmpeg audio converter. --- .../src/components/panels/Camera/Index.vue | 3 +-- .../src/components/panels/Sound/Index.vue | 3 +-- .../plugins/sound/_controllers/_recorder.py | 11 +++++------ platypush/plugins/sound/_converter.py | 18 ++++++++++-------- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/platypush/backend/http/webapp/src/components/panels/Camera/Index.vue b/platypush/backend/http/webapp/src/components/panels/Camera/Index.vue index 3c93b9b7..1aec37fd 100644 --- a/platypush/backend/http/webapp/src/components/panels/Camera/Index.vue +++ b/platypush/backend/http/webapp/src/components/panels/Camera/Index.vue @@ -40,8 +40,7 @@
diff --git a/platypush/backend/http/webapp/src/components/panels/Sound/Index.vue b/platypush/backend/http/webapp/src/components/panels/Sound/Index.vue index 92c547ee..db46eea8 100644 --- a/platypush/backend/http/webapp/src/components/panels/Sound/Index.vue +++ b/platypush/backend/http/webapp/src/components/panels/Sound/Index.vue @@ -2,8 +2,7 @@
diff --git a/platypush/plugins/sound/_controllers/_recorder.py b/platypush/plugins/sound/_controllers/_recorder.py index ef6adf26..4c139311 100644 --- a/platypush/plugins/sound/_controllers/_recorder.py +++ b/platypush/plugins/sound/_controllers/_recorder.py @@ -1,5 +1,3 @@ -from dataclasses import dataclass - from typing import IO from typing_extensions import override @@ -16,7 +14,6 @@ from .._model import AudioState from ._base import AudioThread -@dataclass class AudioRecorder(AudioThread): """ The ``AudioRecorder`` thread is responsible for recording audio from the @@ -32,7 +29,7 @@ class AudioRecorder(AudioThread): # _ = frames # __ = time def callback(indata, outdata, _, __, status): - if self.state == AudioState.PAUSED: + if self.state != AudioState.RUNNING: return if status: @@ -41,7 +38,7 @@ class AudioRecorder(AudioThread): try: audio_converter.write(indata.tobytes()) except AssertionError as e: - self.logger.warning('Audio recorder callback error: %s', e) + self.logger.warning('Audio converter callback error: %s', e) self.state = AudioState.STOPPED return @@ -63,8 +60,10 @@ class AudioRecorder(AudioThread): @override def notify_stop(self): + prev_state = self.state super().notify_stop() - get_bus().post(SoundRecordingStoppedEvent()) + if prev_state != AudioState.STOPPED: + get_bus().post(SoundRecordingStoppedEvent()) # vim:sw=4:ts=4:et: diff --git a/platypush/plugins/sound/_converter.py b/platypush/plugins/sound/_converter.py index 3aa307f2..bdab2d03 100644 --- a/platypush/plugins/sound/_converter.py +++ b/platypush/plugins/sound/_converter.py @@ -1,5 +1,6 @@ import asyncio from asyncio.subprocess import PIPE +from logging import getLogger from queue import Empty from queue import Queue @@ -74,6 +75,7 @@ class ConverterProcess(Thread): self._closed = False self._out_queue = Queue() self.ffmpeg = None + self.logger = getLogger(__name__) self._loop = None self._should_stop = Event() self._stop_lock = RLock() @@ -157,21 +159,21 @@ class ConverterProcess(Thread): def run(self): super().run() self._loop = get_or_create_event_loop() - self._loop.run_until_complete(self._audio_proxy(timeout=1)) + try: + self._loop.run_until_complete(self._audio_proxy(timeout=1)) + except RuntimeError as e: + self.logger.warning(e) + finally: + self.stop() def stop(self): with self._stop_lock: self._should_stop.set() if self.ffmpeg: - try: - self.ffmpeg.kill() - except ProcessLookupError: - pass + self.ffmpeg.kill() self.ffmpeg = None - - if self._loop: - self._loop = None + self._loop = None @property def should_stop(self) -> bool: From 2f4229d7b1383a8ecf5dfab39a98c65574406d7a Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Fri, 16 Jun 2023 15:40:05 +0200 Subject: [PATCH 15/17] pylint fixes for the camera plugin. --- platypush/plugins/camera/__init__.py | 61 +++++++++++++----------- platypush/plugins/camera/model/camera.py | 37 ++------------ 2 files changed, 37 insertions(+), 61 deletions(-) diff --git a/platypush/plugins/camera/__init__.py b/platypush/plugins/camera/__init__.py index f78246c6..632a0978 100644 --- a/platypush/plugins/camera/__init__.py +++ b/platypush/plugins/camera/__init__.py @@ -7,6 +7,7 @@ import time from abc import ABC, abstractmethod from contextlib import contextmanager +from dataclasses import asdict from datetime import datetime from multiprocessing import Process from queue import Queue @@ -152,21 +153,21 @@ class CameraPlugin(Plugin, ABC): """ super().__init__(**kwargs) - self.workdir = os.path.join( - Config.get('workdir'), get_plugin_name_by_class(self) - ) + workdir = Config.get('workdir') + plugin_name = get_plugin_name_by_class(self) + assert isinstance(workdir, str) and plugin_name + self.workdir = os.path.join(workdir, plugin_name) pathlib.Path(self.workdir).mkdir(mode=0o755, exist_ok=True, parents=True) - # noinspection PyArgumentList self.camera_info = self._camera_info_class( device, color_transform=color_transform, warmup_frames=warmup_frames, - warmup_seconds=warmup_seconds, + warmup_seconds=warmup_seconds or 0, rotate=rotate, scale_x=scale_x, scale_y=scale_y, - capture_timeout=capture_timeout, + capture_timeout=capture_timeout or 20, fps=fps, input_format=input_format, output_format=output_format, @@ -227,13 +228,12 @@ class CameraPlugin(Plugin, ABC): camera.start_event.clear() camera.capture_thread = None else: - # noinspection PyArgumentList camera = self._camera_class(info=info) camera.info.set(**params) camera.object = self.prepare_device(camera) - if stream: + if stream and camera.info.stream_format: writer_class = StreamWriter.get_class_by_name(camera.info.stream_format) camera.stream = writer_class( camera=camera, plugin=self, redis_queue=redis_queue @@ -283,7 +283,7 @@ class CameraPlugin(Plugin, ABC): def open( self, device: Optional[Union[int, str]] = None, - stream: bool = None, + stream: bool = False, redis_queue: Optional[str] = None, **info, ) -> Generator[Camera, None, None]: @@ -304,7 +304,8 @@ class CameraPlugin(Plugin, ABC): ) yield camera finally: - self.close_device(camera) + if camera: + self.close_device(camera) @abstractmethod def prepare_device(self, device: Camera): @@ -333,7 +334,6 @@ class CameraPlugin(Plugin, ABC): """ raise NotImplementedError() - # noinspection PyShadowingBuiltins @staticmethod def store_frame(frame, filepath: str, format: Optional[str] = None): """ @@ -347,7 +347,7 @@ class CameraPlugin(Plugin, ABC): if isinstance(frame, bytes): frame = list(frame) - elif not isinstance(frame, Image.Image): + if not isinstance(frame, Image.Image): frame = Image.fromarray(frame) save_args = {} @@ -571,7 +571,7 @@ class CameraPlugin(Plugin, ABC): video_file: Optional[str] = None, preview: bool = False, **camera, - ) -> Union[str, dict]: + ) -> Optional[Union[str, dict]]: """ Capture a video. @@ -596,7 +596,7 @@ class CameraPlugin(Plugin, ABC): self.wait_capture(camera) return video_file - return self.status(camera.info.device) + return self.status(camera.info.device).output @action def stop_capture(self, device: Optional[Union[int, str]] = None): @@ -606,12 +606,12 @@ class CameraPlugin(Plugin, ABC): :param device: Name/path/ID of the device to stop (default: all the active devices). """ devices = self._devices.copy() - stop_devices = list(devices.values())[:] + stop_devices = list(devices.values()) if device: stop_devices = [self._devices[device]] if device in self._devices else [] - for device in stop_devices: - self.close_device(device) + for dev in stop_devices: + self.close_device(dev) @action def capture_image(self, image_file: str, preview: bool = False, **camera) -> str: @@ -635,9 +635,8 @@ class CameraPlugin(Plugin, ABC): return image_file - # noinspection PyUnusedLocal @action - def take_picture(self, image_file: str, preview: bool = False, **camera) -> str: + def take_picture(self, image_file: str, **camera) -> str: """ Alias for :meth:`.capture_image`. @@ -646,7 +645,7 @@ class CameraPlugin(Plugin, ABC): :param preview: Show a preview of the camera frames. :return: The local path to the saved image. """ - return self.capture_image(image_file, **camera) + return str(self.capture_image(image_file, **camera).output) @action def capture_sequence( @@ -655,7 +654,7 @@ class CameraPlugin(Plugin, ABC): n_frames: Optional[int] = None, preview: bool = False, **camera, - ) -> str: + ) -> Optional[str]: """ Capture a sequence of frames from a camera and store them to a directory. @@ -687,7 +686,7 @@ class CameraPlugin(Plugin, ABC): """ camera = self.open_device(frames_dir=None, **camera) self.start_camera(camera, duration=duration, n_frames=n_frames, preview=True) - return self.status(camera.info.device) + return self.status(camera.info.device) # type: ignore @staticmethod def _prepare_server_socket(camera: Camera) -> socket.socket: @@ -729,10 +728,11 @@ class CameraPlugin(Plugin, ABC): continue if camera.info.device not in self._devices: - info = camera.info.to_dict() + info = asdict(camera.info) info['stream_format'] = stream_format camera = self.open_device(stream=True, **info) + assert camera.stream, 'No camera stream available' camera.stream.sock = sock self.start_camera( camera, duration=duration, frames_dir=None, image_file=None @@ -741,7 +741,9 @@ class CameraPlugin(Plugin, ABC): self._cleanup_stream(camera, server_socket, sock) self.logger.info('Stopped camera stream') - def _cleanup_stream(self, camera: Camera, server_socket: socket.socket, client: IO): + def _cleanup_stream( + self, camera: Camera, server_socket: socket.socket, client: Optional[IO] + ): if client: try: client.close() @@ -772,7 +774,7 @@ class CameraPlugin(Plugin, ABC): :return: The status of the device. """ camera = self.open_device(stream=True, stream_format=stream_format, **camera) - return self._start_streaming(camera, duration, stream_format) + return self._start_streaming(camera, duration, stream_format) # type: ignore def _start_streaming( self, camera: Camera, duration: Optional[float], stream_format: str @@ -781,6 +783,7 @@ class CameraPlugin(Plugin, ABC): assert ( not camera.stream_event.is_set() and camera.info.device not in self._streams ), f'A streaming session is already running for device {camera.info.device}' + assert camera.info.device, 'No device name available' self._streams[camera.info.device] = camera camera.stream_event.set() @@ -804,12 +807,12 @@ class CameraPlugin(Plugin, ABC): :param device: Name/path/ID of the device to stop (default: all the active devices). """ streams = self._streams.copy() - stop_devices = list(streams.values())[:] + stop_devices = list(streams.values()) if device: stop_devices = [self._streams[device]] if device in self._streams else [] - for device in stop_devices: - self._stop_streaming(device) + for dev in stop_devices: + self._stop_streaming(dev) def _stop_streaming(self, camera: Camera): camera.stream_event.clear() @@ -825,7 +828,7 @@ class CameraPlugin(Plugin, ABC): return {} return { - **camera.info.to_dict(), + **asdict(camera.info), 'active': bool(camera.capture_thread and camera.capture_thread.is_alive()), 'capturing': bool( camera.capture_thread diff --git a/platypush/plugins/camera/model/camera.py b/platypush/plugins/camera/model/camera.py index 2116d34e..3791f201 100644 --- a/platypush/plugins/camera/model/camera.py +++ b/platypush/plugins/camera/model/camera.py @@ -1,6 +1,6 @@ import math import threading -from dataclasses import dataclass +from dataclasses import asdict, dataclass from typing import Optional, Union, Tuple, Set import numpy as np @@ -17,8 +17,8 @@ from platypush.plugins.camera.model.writer.preview import PreviewWriter class CameraInfo: device: Optional[Union[int, str]] bind_address: Optional[str] = None - capture_timeout: float = 20.0 - color_transform: Optional[str] = None + capture_timeout: float = 0 + color_transform: Optional[Union[int, str]] = None ffmpeg_bin: Optional[str] = None fps: Optional[float] = None frames_dir: Optional[str] = None @@ -36,42 +36,15 @@ class CameraInfo: stream_format: Optional[str] = None vertical_flip: bool = False warmup_frames: int = 0 - warmup_seconds: float = 0.0 + warmup_seconds: float = 0 def set(self, **kwargs): for k, v in kwargs.items(): if hasattr(self, k): setattr(self, k, v) - def to_dict(self) -> dict: - return { - 'bind_address': self.bind_address, - 'capture_timeout': self.capture_timeout, - 'color_transform': self.color_transform, - 'device': self.device, - 'ffmpeg_bin': self.ffmpeg_bin, - 'fps': self.fps, - 'frames_dir': self.frames_dir, - 'grayscale': self.grayscale, - 'horizontal_flip': self.horizontal_flip, - 'input_codec': self.input_codec, - 'input_format': self.input_format, - 'listen_port': self.listen_port, - 'output_codec': self.output_codec, - 'output_format': self.output_format, - 'resolution': list(self.resolution or ()), - 'rotate': self.rotate, - 'scale_x': self.scale_x, - 'scale_y': self.scale_y, - 'stream_format': self.stream_format, - 'vertical_flip': self.vertical_flip, - 'warmup_frames': self.warmup_frames, - 'warmup_seconds': self.warmup_seconds, - } - def clone(self): - # noinspection PyArgumentList - return self.__class__(**self.to_dict()) + return self.__class__(**asdict(self)) @dataclass From 2fb6e4d7d022224c3876f342c8b1ec446a774093 Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Fri, 16 Jun 2023 15:48:23 +0200 Subject: [PATCH 16/17] Updated webapp dist files --- platypush/backend/http/webapp/dist/index.html | 2 +- platypush/backend/http/webapp/dist/service-worker.js | 2 +- platypush/backend/http/webapp/dist/service-worker.js.map | 2 +- .../backend/http/webapp/dist/static/css/4118.25e7d5ff.css | 1 + .../backend/http/webapp/dist/static/css/5193.47f020c5.css | 1 - .../dist/static/css/{2989.22b025de.css => 5465.22b025de.css} | 0 .../dist/static/css/{5528.22b025de.css => 8200.22b025de.css} | 0 .../http/webapp/dist/static/js/4118-legacy.fdfd71bc.js | 2 ++ .../http/webapp/dist/static/js/4118-legacy.fdfd71bc.js.map | 1 + platypush/backend/http/webapp/dist/static/js/4118.eb9d25ca.js | 2 ++ .../backend/http/webapp/dist/static/js/4118.eb9d25ca.js.map | 1 + .../js/{4548-legacy.e2883bdd.js => 4548-legacy.7f4c9c3f.js} | 4 ++-- ...548-legacy.e2883bdd.js.map => 4548-legacy.7f4c9c3f.js.map} | 2 +- platypush/backend/http/webapp/dist/static/js/4548.75a2e6f8.js | 2 ++ .../backend/http/webapp/dist/static/js/4548.75a2e6f8.js.map | 1 + platypush/backend/http/webapp/dist/static/js/4548.c7642733.js | 2 -- .../backend/http/webapp/dist/static/js/4548.c7642733.js.map | 1 - .../js/{5111-legacy.262ea3c5.js => 5111-legacy.d4568c17.js} | 4 ++-- ...111-legacy.262ea3c5.js.map => 5111-legacy.d4568c17.js.map} | 2 +- platypush/backend/http/webapp/dist/static/js/5111.f606018d.js | 2 -- .../backend/http/webapp/dist/static/js/5111.f606018d.js.map | 1 - platypush/backend/http/webapp/dist/static/js/5111.fbd25a85.js | 2 ++ .../backend/http/webapp/dist/static/js/5111.fbd25a85.js.map | 1 + .../http/webapp/dist/static/js/5193-legacy.d8c2e027.js | 2 -- .../http/webapp/dist/static/js/5193-legacy.d8c2e027.js.map | 1 - platypush/backend/http/webapp/dist/static/js/5193.1de6bb98.js | 2 -- .../backend/http/webapp/dist/static/js/5193.1de6bb98.js.map | 1 - .../http/webapp/dist/static/js/5465-legacy.f819fef2.js | 2 ++ .../http/webapp/dist/static/js/5465-legacy.f819fef2.js.map | 1 + platypush/backend/http/webapp/dist/static/js/5465.e48f0738.js | 2 ++ .../backend/http/webapp/dist/static/js/5465.e48f0738.js.map | 1 + .../http/webapp/dist/static/js/5528-legacy.c6626d00.js | 2 -- .../http/webapp/dist/static/js/5528-legacy.c6626d00.js.map | 1 - platypush/backend/http/webapp/dist/static/js/5528.10b051ba.js | 2 -- .../backend/http/webapp/dist/static/js/5528.10b051ba.js.map | 1 - .../js/{699-legacy.cb1ccfbb.js => 699-legacy.e258b653.js} | 4 ++-- ...{699-legacy.cb1ccfbb.js.map => 699-legacy.e258b653.js.map} | 2 +- platypush/backend/http/webapp/dist/static/js/699.85a689b1.js | 2 ++ .../backend/http/webapp/dist/static/js/699.85a689b1.js.map | 1 + platypush/backend/http/webapp/dist/static/js/699.b7975861.js | 2 -- .../backend/http/webapp/dist/static/js/699.b7975861.js.map | 1 - .../js/{8184-legacy.702db0b7.js => 8184-legacy.73f24c6e.js} | 4 ++-- ...184-legacy.702db0b7.js.map => 8184-legacy.73f24c6e.js.map} | 2 +- platypush/backend/http/webapp/dist/static/js/8184.3768abaf.js | 2 ++ .../backend/http/webapp/dist/static/js/8184.3768abaf.js.map | 1 + platypush/backend/http/webapp/dist/static/js/8184.c4135de2.js | 2 -- .../backend/http/webapp/dist/static/js/8184.c4135de2.js.map | 1 - .../js/{9895-legacy.acee9428.js => 9895-legacy.1fd296a4.js} | 4 ++-- ...895-legacy.acee9428.js.map => 9895-legacy.1fd296a4.js.map} | 2 +- platypush/backend/http/webapp/dist/static/js/9895.16e6387b.js | 2 -- .../backend/http/webapp/dist/static/js/9895.16e6387b.js.map | 1 - platypush/backend/http/webapp/dist/static/js/9895.a39079d5.js | 2 ++ .../backend/http/webapp/dist/static/js/9895.a39079d5.js.map | 1 + .../js/{app-legacy.523328cf.js => app-legacy.83532d44.js} | 4 ++-- ...{app-legacy.523328cf.js.map => app-legacy.83532d44.js.map} | 2 +- .../dist/static/js/{app.8e3d4fb1.js => app.a0889d9d.js} | 4 ++-- .../static/js/{app.8e3d4fb1.js.map => app.a0889d9d.js.map} | 2 +- 57 files changed, 52 insertions(+), 52 deletions(-) create mode 100644 platypush/backend/http/webapp/dist/static/css/4118.25e7d5ff.css delete mode 100644 platypush/backend/http/webapp/dist/static/css/5193.47f020c5.css rename platypush/backend/http/webapp/dist/static/css/{2989.22b025de.css => 5465.22b025de.css} (100%) rename platypush/backend/http/webapp/dist/static/css/{5528.22b025de.css => 8200.22b025de.css} (100%) create mode 100644 platypush/backend/http/webapp/dist/static/js/4118-legacy.fdfd71bc.js create mode 100644 platypush/backend/http/webapp/dist/static/js/4118-legacy.fdfd71bc.js.map create mode 100644 platypush/backend/http/webapp/dist/static/js/4118.eb9d25ca.js create mode 100644 platypush/backend/http/webapp/dist/static/js/4118.eb9d25ca.js.map rename platypush/backend/http/webapp/dist/static/js/{4548-legacy.e2883bdd.js => 4548-legacy.7f4c9c3f.js} (74%) rename platypush/backend/http/webapp/dist/static/js/{4548-legacy.e2883bdd.js.map => 4548-legacy.7f4c9c3f.js.map} (94%) create mode 100644 platypush/backend/http/webapp/dist/static/js/4548.75a2e6f8.js create mode 100644 platypush/backend/http/webapp/dist/static/js/4548.75a2e6f8.js.map delete mode 100644 platypush/backend/http/webapp/dist/static/js/4548.c7642733.js delete mode 100644 platypush/backend/http/webapp/dist/static/js/4548.c7642733.js.map rename platypush/backend/http/webapp/dist/static/js/{5111-legacy.262ea3c5.js => 5111-legacy.d4568c17.js} (75%) rename platypush/backend/http/webapp/dist/static/js/{5111-legacy.262ea3c5.js.map => 5111-legacy.d4568c17.js.map} (94%) delete mode 100644 platypush/backend/http/webapp/dist/static/js/5111.f606018d.js delete mode 100644 platypush/backend/http/webapp/dist/static/js/5111.f606018d.js.map create mode 100644 platypush/backend/http/webapp/dist/static/js/5111.fbd25a85.js create mode 100644 platypush/backend/http/webapp/dist/static/js/5111.fbd25a85.js.map delete mode 100644 platypush/backend/http/webapp/dist/static/js/5193-legacy.d8c2e027.js delete mode 100644 platypush/backend/http/webapp/dist/static/js/5193-legacy.d8c2e027.js.map delete mode 100644 platypush/backend/http/webapp/dist/static/js/5193.1de6bb98.js delete mode 100644 platypush/backend/http/webapp/dist/static/js/5193.1de6bb98.js.map create mode 100644 platypush/backend/http/webapp/dist/static/js/5465-legacy.f819fef2.js create mode 100644 platypush/backend/http/webapp/dist/static/js/5465-legacy.f819fef2.js.map create mode 100644 platypush/backend/http/webapp/dist/static/js/5465.e48f0738.js create mode 100644 platypush/backend/http/webapp/dist/static/js/5465.e48f0738.js.map delete mode 100644 platypush/backend/http/webapp/dist/static/js/5528-legacy.c6626d00.js delete mode 100644 platypush/backend/http/webapp/dist/static/js/5528-legacy.c6626d00.js.map delete mode 100644 platypush/backend/http/webapp/dist/static/js/5528.10b051ba.js delete mode 100644 platypush/backend/http/webapp/dist/static/js/5528.10b051ba.js.map rename platypush/backend/http/webapp/dist/static/js/{699-legacy.cb1ccfbb.js => 699-legacy.e258b653.js} (75%) rename platypush/backend/http/webapp/dist/static/js/{699-legacy.cb1ccfbb.js.map => 699-legacy.e258b653.js.map} (94%) create mode 100644 platypush/backend/http/webapp/dist/static/js/699.85a689b1.js create mode 100644 platypush/backend/http/webapp/dist/static/js/699.85a689b1.js.map delete mode 100644 platypush/backend/http/webapp/dist/static/js/699.b7975861.js delete mode 100644 platypush/backend/http/webapp/dist/static/js/699.b7975861.js.map rename platypush/backend/http/webapp/dist/static/js/{8184-legacy.702db0b7.js => 8184-legacy.73f24c6e.js} (74%) rename platypush/backend/http/webapp/dist/static/js/{8184-legacy.702db0b7.js.map => 8184-legacy.73f24c6e.js.map} (94%) create mode 100644 platypush/backend/http/webapp/dist/static/js/8184.3768abaf.js create mode 100644 platypush/backend/http/webapp/dist/static/js/8184.3768abaf.js.map delete mode 100644 platypush/backend/http/webapp/dist/static/js/8184.c4135de2.js delete mode 100644 platypush/backend/http/webapp/dist/static/js/8184.c4135de2.js.map rename platypush/backend/http/webapp/dist/static/js/{9895-legacy.acee9428.js => 9895-legacy.1fd296a4.js} (84%) rename platypush/backend/http/webapp/dist/static/js/{9895-legacy.acee9428.js.map => 9895-legacy.1fd296a4.js.map} (96%) delete mode 100644 platypush/backend/http/webapp/dist/static/js/9895.16e6387b.js delete mode 100644 platypush/backend/http/webapp/dist/static/js/9895.16e6387b.js.map create mode 100644 platypush/backend/http/webapp/dist/static/js/9895.a39079d5.js create mode 100644 platypush/backend/http/webapp/dist/static/js/9895.a39079d5.js.map rename platypush/backend/http/webapp/dist/static/js/{app-legacy.523328cf.js => app-legacy.83532d44.js} (98%) rename platypush/backend/http/webapp/dist/static/js/{app-legacy.523328cf.js.map => app-legacy.83532d44.js.map} (99%) rename platypush/backend/http/webapp/dist/static/js/{app.8e3d4fb1.js => app.a0889d9d.js} (96%) rename platypush/backend/http/webapp/dist/static/js/{app.8e3d4fb1.js.map => app.a0889d9d.js.map} (98%) diff --git a/platypush/backend/http/webapp/dist/index.html b/platypush/backend/http/webapp/dist/index.html index 7536b348..15fb212e 100644 --- a/platypush/backend/http/webapp/dist/index.html +++ b/platypush/backend/http/webapp/dist/index.html @@ -1 +1 @@ -platypush
\ No newline at end of file +platypush
\ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/service-worker.js b/platypush/backend/http/webapp/dist/service-worker.js index 85a6bf04..499b76f4 100644 --- a/platypush/backend/http/webapp/dist/service-worker.js +++ b/platypush/backend/http/webapp/dist/service-worker.js @@ -1,2 +1,2 @@ -if(!self.define){let i,s={};const l=(l,n)=>(l=new URL(l+".js",n).href,s[l]||new Promise((s=>{if("document"in self){const i=document.createElement("script");i.src=l,i.onload=s,document.head.appendChild(i)}else i=l,importScripts(l),s()})).then((()=>{let i=s[l];if(!i)throw new Error(`Module ${l} didn’t register its module`);return i})));self.define=(n,r)=>{const e=i||("document"in self?document.currentScript.src:"")||location.href;if(s[e])return;let t={};const u=i=>l(i,e),c={module:{uri:e},exports:t,require:u};s[e]=Promise.all(n.map((i=>c[i]||u(i)))).then((i=>(r(...i),t)))}}define(["./workbox-79ffe3e0"],(function(i){"use strict";i.setCacheNameDetails({prefix:"platypush"}),self.addEventListener("message",(i=>{i.data&&"SKIP_WAITING"===i.data.type&&self.skipWaiting()})),i.precacheAndRoute([{url:"/fonts/Poppins.ttf",revision:"d10d3ed96303653f936a08b38534f12e"},{url:"/fonts/poppins.css",revision:"413ee9a4d1879f6ae3d62a796644daad"},{url:"/icons/jellyfin.svg",revision:"1ec11e72ffc381f8797ddbebed2652c0"},{url:"/icons/kodi.svg",revision:"81ea5504989d4a0ed19ba6528c39e80f"},{url:"/icons/openweathermap/black/01d.png",revision:"4cf2907a1083c067828830bb007e2f34"},{url:"/icons/openweathermap/black/01n.png",revision:"df30375c6371005e2d238c36255afc8a"},{url:"/icons/openweathermap/black/02d.png",revision:"79a0adce79d78da203beeb7a6f4f510b"},{url:"/icons/openweathermap/black/02n.png",revision:"68d34b41357c2a3ea9479dae653b3617"},{url:"/icons/openweathermap/black/03d.png",revision:"5f13dba4164c437e2fbdc1d1ecaada4c"},{url:"/icons/openweathermap/black/03n.png",revision:"65c125cd51934e24f9e3321cc5448d0e"},{url:"/icons/openweathermap/black/04d.png",revision:"e75cd73c232806d7364ad7feae354074"},{url:"/icons/openweathermap/black/04n.png",revision:"e75cd73c232806d7364ad7feae354074"},{url:"/icons/openweathermap/black/09d.png",revision:"328b726310fb5762861859e33ac9066a"},{url:"/icons/openweathermap/black/09n.png",revision:"328b726310fb5762861859e33ac9066a"},{url:"/icons/openweathermap/black/10d.png",revision:"7dde329628506567faef30b9eb5c5f69"},{url:"/icons/openweathermap/black/10n.png",revision:"7dde329628506567faef30b9eb5c5f69"},{url:"/icons/openweathermap/black/11d.png",revision:"8f6a4b2446b42e8215195e195133e546"},{url:"/icons/openweathermap/black/11n.png",revision:"8f6a4b2446b42e8215195e195133e546"},{url:"/icons/openweathermap/black/13d.png",revision:"45bfce1d2ea7d16415848650eb5d2cb3"},{url:"/icons/openweathermap/black/13n.png",revision:"45bfce1d2ea7d16415848650eb5d2cb3"},{url:"/icons/openweathermap/black/50d.png",revision:"7a304f2b15fe4d9de351dabc44ff900d"},{url:"/icons/openweathermap/black/50n.png",revision:"7a304f2b15fe4d9de351dabc44ff900d"},{url:"/icons/openweathermap/black/unknown.png",revision:"c219891f5796e43d0f75f6525a8d6f33"},{url:"/icons/openweathermap/dark/01d.png",revision:"4cf2907a1083c067828830bb007e2f34"},{url:"/icons/openweathermap/dark/01n.png",revision:"df30375c6371005e2d238c36255afc8a"},{url:"/icons/openweathermap/dark/02d.png",revision:"79a0adce79d78da203beeb7a6f4f510b"},{url:"/icons/openweathermap/dark/02n.png",revision:"68d34b41357c2a3ea9479dae653b3617"},{url:"/icons/openweathermap/dark/03d.png",revision:"5f13dba4164c437e2fbdc1d1ecaada4c"},{url:"/icons/openweathermap/dark/03n.png",revision:"65c125cd51934e24f9e3321cc5448d0e"},{url:"/icons/openweathermap/dark/04d.png",revision:"e75cd73c232806d7364ad7feae354074"},{url:"/icons/openweathermap/dark/04n.png",revision:"e75cd73c232806d7364ad7feae354074"},{url:"/icons/openweathermap/dark/09d.png",revision:"328b726310fb5762861859e33ac9066a"},{url:"/icons/openweathermap/dark/09n.png",revision:"328b726310fb5762861859e33ac9066a"},{url:"/icons/openweathermap/dark/10d.png",revision:"7dde329628506567faef30b9eb5c5f69"},{url:"/icons/openweathermap/dark/10n.png",revision:"7dde329628506567faef30b9eb5c5f69"},{url:"/icons/openweathermap/dark/11d.png",revision:"8f6a4b2446b42e8215195e195133e546"},{url:"/icons/openweathermap/dark/11n.png",revision:"8f6a4b2446b42e8215195e195133e546"},{url:"/icons/openweathermap/dark/13d.png",revision:"45bfce1d2ea7d16415848650eb5d2cb3"},{url:"/icons/openweathermap/dark/13n.png",revision:"45bfce1d2ea7d16415848650eb5d2cb3"},{url:"/icons/openweathermap/dark/50d.png",revision:"7a304f2b15fe4d9de351dabc44ff900d"},{url:"/icons/openweathermap/dark/50n.png",revision:"7a304f2b15fe4d9de351dabc44ff900d"},{url:"/icons/openweathermap/dark/unknown.png",revision:"c219891f5796e43d0f75f6525a8d6f33"},{url:"/icons/openweathermap/light/01d.png",revision:"00c2d0a72a69bf279bf8703cea9ce8d2"},{url:"/icons/openweathermap/light/01n.png",revision:"3a65e9f7ed5c54c6acd638a7bd26de25"},{url:"/icons/openweathermap/light/02d.png",revision:"63dab156e991be7e4174d1d6cd8c2321"},{url:"/icons/openweathermap/light/02n.png",revision:"7c64d1a1c5efdbe38e6b7e3b4f50f2c5"},{url:"/icons/openweathermap/light/03d.png",revision:"f609003793e658a60870587cd450fc6f"},{url:"/icons/openweathermap/light/03n.png",revision:"7e694b4317b3e9f2533db93969fcc3e8"},{url:"/icons/openweathermap/light/04d.png",revision:"098f9d40b1d5747996df9a720f160c81"},{url:"/icons/openweathermap/light/04n.png",revision:"098f9d40b1d5747996df9a720f160c81"},{url:"/icons/openweathermap/light/09d.png",revision:"c48a99b60e45690cdc702a2dc6694002"},{url:"/icons/openweathermap/light/09n.png",revision:"c48a99b60e45690cdc702a2dc6694002"},{url:"/icons/openweathermap/light/10d.png",revision:"2750daf3f0d811230591a415e42bddb2"},{url:"/icons/openweathermap/light/10n.png",revision:"2750daf3f0d811230591a415e42bddb2"},{url:"/icons/openweathermap/light/11d.png",revision:"7bd0501a7bfcf2675467df0c0788ffad"},{url:"/icons/openweathermap/light/11n.png",revision:"7bd0501a7bfcf2675467df0c0788ffad"},{url:"/icons/openweathermap/light/13d.png",revision:"4e11e697c6bafc8dd83c4dfc8ce47919"},{url:"/icons/openweathermap/light/13n.png",revision:"4e11e697c6bafc8dd83c4dfc8ce47919"},{url:"/icons/openweathermap/light/50d.png",revision:"9a0770f3adc7c4a27e131c04a739f735"},{url:"/icons/openweathermap/light/50n.png",revision:"9a0770f3adc7c4a27e131c04a739f735"},{url:"/icons/openweathermap/light/unknown.png",revision:"f14a44a1ecde49a5c6a396f8c1753263"},{url:"/icons/openweathermap/white/01d.png",revision:"00c2d0a72a69bf279bf8703cea9ce8d2"},{url:"/icons/openweathermap/white/01n.png",revision:"3a65e9f7ed5c54c6acd638a7bd26de25"},{url:"/icons/openweathermap/white/02d.png",revision:"63dab156e991be7e4174d1d6cd8c2321"},{url:"/icons/openweathermap/white/02n.png",revision:"7c64d1a1c5efdbe38e6b7e3b4f50f2c5"},{url:"/icons/openweathermap/white/03d.png",revision:"f609003793e658a60870587cd450fc6f"},{url:"/icons/openweathermap/white/03n.png",revision:"7e694b4317b3e9f2533db93969fcc3e8"},{url:"/icons/openweathermap/white/04d.png",revision:"098f9d40b1d5747996df9a720f160c81"},{url:"/icons/openweathermap/white/04n.png",revision:"098f9d40b1d5747996df9a720f160c81"},{url:"/icons/openweathermap/white/09d.png",revision:"c48a99b60e45690cdc702a2dc6694002"},{url:"/icons/openweathermap/white/09n.png",revision:"c48a99b60e45690cdc702a2dc6694002"},{url:"/icons/openweathermap/white/10d.png",revision:"2750daf3f0d811230591a415e42bddb2"},{url:"/icons/openweathermap/white/10n.png",revision:"2750daf3f0d811230591a415e42bddb2"},{url:"/icons/openweathermap/white/11d.png",revision:"7bd0501a7bfcf2675467df0c0788ffad"},{url:"/icons/openweathermap/white/11n.png",revision:"7bd0501a7bfcf2675467df0c0788ffad"},{url:"/icons/openweathermap/white/13d.png",revision:"4e11e697c6bafc8dd83c4dfc8ce47919"},{url:"/icons/openweathermap/white/13n.png",revision:"4e11e697c6bafc8dd83c4dfc8ce47919"},{url:"/icons/openweathermap/white/50d.png",revision:"9a0770f3adc7c4a27e131c04a739f735"},{url:"/icons/openweathermap/white/50n.png",revision:"9a0770f3adc7c4a27e131c04a739f735"},{url:"/icons/openweathermap/white/unknown.png",revision:"f14a44a1ecde49a5c6a396f8c1753263"},{url:"/icons/plex.svg",revision:"9923c5c80858a7da9d48c3ee77974e77"},{url:"/icons/smartthings.png",revision:"9306b6ca82efa85d58823615ff14b00f"},{url:"/icons/z-wave.png",revision:"3045e92627da521267db845b16da6028"},{url:"/icons/zigbee.svg",revision:"3e5f749af9e83ace5c12ff3aac6d4b88"},{url:"/img/dashboard-bg-light.jpg",revision:"f9ab2a6552509997ec0cbaeb47199eba"},{url:"/img/logo.png",revision:"98702e78dde598404826f6e9279e4ab3"},{url:"/img/spinner.gif",revision:"5572838d351b66bf6a3350b6d8d23cb8"},{url:"/index.html",revision:"950b41145f8fea3627c6c8e2e0d0cdb5"},{url:"/manifest.json",revision:"8a45dcffc3380b17da6ea17291b43e00"},{url:"/static/css/1196.78925ff5.css",revision:null},{url:"/static/css/1300.180d2070.css",revision:null},{url:"/static/css/1767.f9545a14.css",revision:null},{url:"/static/css/1798.3a165bb4.css",revision:null},{url:"/static/css/1818.8db287b9.css",revision:null},{url:"/static/css/201.3ba92d09.css",revision:null},{url:"/static/css/2346.ed463bd2.css",revision:null},{url:"/static/css/2790.a0725ecc.css",revision:null},{url:"/static/css/2806.9c9d5a57.css",revision:null},{url:"/static/css/2989.22b025de.css",revision:null},{url:"/static/css/3194.a07dd4e2.css",revision:null},{url:"/static/css/3303.bfeafcb0.css",revision:null},{url:"/static/css/345.25d1c562.css",revision:null},{url:"/static/css/346.bec1b050.css",revision:null},{url:"/static/css/3490.fcf11255.css",revision:null},{url:"/static/css/3710.1112d8b7.css",revision:null},{url:"/static/css/3724.234438b4.css",revision:null},{url:"/static/css/4021.58663e3e.css",revision:null},{url:"/static/css/4196.539db457.css",revision:null},{url:"/static/css/4848.72a7d113.css",revision:null},{url:"/static/css/4981.c5c2f5dd.css",revision:null},{url:"/static/css/5193.47f020c5.css",revision:null},{url:"/static/css/5199.6ad0f775.css",revision:null},{url:"/static/css/5207.950597e1.css",revision:null},{url:"/static/css/5498.ef565a73.css",revision:null},{url:"/static/css/5824.8f1b2b15.css",revision:null},{url:"/static/css/5924.f0111959.css",revision:null},{url:"/static/css/6003.fbbaf2b7.css",revision:null},{url:"/static/css/6013.504d6c0b.css",revision:null},{url:"/static/css/615.6d3a8446.css",revision:null},{url:"/static/css/6164.ea3fa7cb.css",revision:null},{url:"/static/css/6358.1f06089f.css",revision:null},{url:"/static/css/65.ae3723d7.css",revision:null},{url:"/static/css/6739.49b1f262.css",revision:null},{url:"/static/css/675.10cdb721.css",revision:null},{url:"/static/css/6815.f1dc7909.css",revision:null},{url:"/static/css/6833.28cb5e3d.css",revision:null},{url:"/static/css/6899.c92d9d38.css",revision:null},{url:"/static/css/7141.4b3e6b00.css",revision:null},{url:"/static/css/7420.4bf56b11.css",revision:null},{url:"/static/css/7503.34698020.css",revision:null},{url:"/static/css/7782.a6a32303.css",revision:null},{url:"/static/css/8135.1460504e.css",revision:null},{url:"/static/css/8444.95911650.css",revision:null},{url:"/static/css/8589.2e68c420.css",revision:null},{url:"/static/css/906.a114eea0.css",revision:null},{url:"/static/css/9276.518b169b.css",revision:null},{url:"/static/css/9387.74d3b3a3.css",revision:null},{url:"/static/css/9418.9f2b9c3a.css",revision:null},{url:"/static/css/9450.fd9ed6f2.css",revision:null},{url:"/static/css/9575.1b22f65c.css",revision:null},{url:"/static/css/9978.b6585c35.css",revision:null},{url:"/static/css/app.0a781c41.css",revision:null},{url:"/static/css/chunk-vendors.0fcd36f0.css",revision:null},{url:"/static/fonts/fa-brands-400.7fa789ab.ttf",revision:null},{url:"/static/fonts/fa-brands-400.859fc388.woff2",revision:null},{url:"/static/fonts/fa-regular-400.2ffd018f.woff2",revision:null},{url:"/static/fonts/fa-regular-400.da02cb7e.ttf",revision:null},{url:"/static/fonts/fa-solid-900.3a463ec3.ttf",revision:null},{url:"/static/fonts/fa-solid-900.40ddefd7.woff2",revision:null},{url:"/static/fonts/lato-medium-italic.1996cc15.woff",revision:null},{url:"/static/fonts/lato-medium-italic.1e312dd9.woff2",revision:null},{url:"/static/fonts/lato-medium.13fcde4c.woff2",revision:null},{url:"/static/fonts/lato-medium.b41c3821.woff",revision:null},{url:"/static/img/ad.cb33f69a.svg",revision:null},{url:"/static/img/ad.fa8477e6.svg",revision:null},{url:"/static/img/ae.a3f5e295.svg",revision:null},{url:"/static/img/ae.f06e0095.svg",revision:null},{url:"/static/img/af.89591ab0.svg",revision:null},{url:"/static/img/af.8ca96393.svg",revision:null},{url:"/static/img/ag.4c37bc2e.svg",revision:null},{url:"/static/img/ag.56074d55.svg",revision:null},{url:"/static/img/ai.70eefdc0.svg",revision:null},{url:"/static/img/ai.893d1179.svg",revision:null},{url:"/static/img/al.b16acdb2.svg",revision:null},{url:"/static/img/al.e0864b5d.svg",revision:null},{url:"/static/img/am.00f0fec4.svg",revision:null},{url:"/static/img/am.a566904f.svg",revision:null},{url:"/static/img/ao.3df23f21.svg",revision:null},{url:"/static/img/ao.c0c32201.svg",revision:null},{url:"/static/img/aq.1b8c45a6.svg",revision:null},{url:"/static/img/aq.aa242c4a.svg",revision:null},{url:"/static/img/ar.22a3116e.svg",revision:null},{url:"/static/img/ar.d3238270.svg",revision:null},{url:"/static/img/as.10ed1a23.svg",revision:null},{url:"/static/img/as.4a330654.svg",revision:null},{url:"/static/img/at.02a64279.svg",revision:null},{url:"/static/img/at.94cde74c.svg",revision:null},{url:"/static/img/au.cc65fc07.svg",revision:null},{url:"/static/img/au.dbcdef2c.svg",revision:null},{url:"/static/img/aw.abbad4ac.svg",revision:null},{url:"/static/img/aw.be4540eb.svg",revision:null},{url:"/static/img/ax.371c7af2.svg",revision:null},{url:"/static/img/ax.91eea523.svg",revision:null},{url:"/static/img/az.0e2f1d1a.svg",revision:null},{url:"/static/img/az.f399f1c8.svg",revision:null},{url:"/static/img/ba.032070d4.svg",revision:null},{url:"/static/img/ba.e167b08f.svg",revision:null},{url:"/static/img/bb.23a15e67.svg",revision:null},{url:"/static/img/bb.b800513b.svg",revision:null},{url:"/static/img/bd.c1abcb00.svg",revision:null},{url:"/static/img/bd.c4a5f0e2.svg",revision:null},{url:"/static/img/be.29774a37.svg",revision:null},{url:"/static/img/be.3eb14701.svg",revision:null},{url:"/static/img/bf.2334e919.svg",revision:null},{url:"/static/img/bf.4ffd5dc6.svg",revision:null},{url:"/static/img/bg.700f100c.svg",revision:null},{url:"/static/img/bg.d0a49130.svg",revision:null},{url:"/static/img/bh.2a884f6c.svg",revision:null},{url:"/static/img/bh.3968dfe0.svg",revision:null},{url:"/static/img/bi.211d0f9e.svg",revision:null},{url:"/static/img/bi.ae3bb248.svg",revision:null},{url:"/static/img/bj.2cdc8a62.svg",revision:null},{url:"/static/img/bj.aba95ad2.svg",revision:null},{url:"/static/img/bl.04966866.svg",revision:null},{url:"/static/img/bl.3e69e968.svg",revision:null},{url:"/static/img/bm.e6903c8e.svg",revision:null},{url:"/static/img/bm.e69e40c4.svg",revision:null},{url:"/static/img/bn.07911e0c.svg",revision:null},{url:"/static/img/bn.4d91734a.svg",revision:null},{url:"/static/img/bo.03595499.svg",revision:null},{url:"/static/img/bo.9c1d9ef8.svg",revision:null},{url:"/static/img/bq.747d8177.svg",revision:null},{url:"/static/img/bq.b9355bec.svg",revision:null},{url:"/static/img/br.058a5086.svg",revision:null},{url:"/static/img/br.fe030c1c.svg",revision:null},{url:"/static/img/bs.d228cbb2.svg",revision:null},{url:"/static/img/bs.ef0a29ed.svg",revision:null},{url:"/static/img/bt.3f8ecb9b.svg",revision:null},{url:"/static/img/bt.fc241981.svg",revision:null},{url:"/static/img/bv.5503f03a.svg",revision:null},{url:"/static/img/bv.7f7cd26f.svg",revision:null},{url:"/static/img/bw.494aae64.svg",revision:null},{url:"/static/img/bw.b767df8c.svg",revision:null},{url:"/static/img/by.78d2c3c9.svg",revision:null},{url:"/static/img/by.fba98c48.svg",revision:null},{url:"/static/img/bz.14c3376a.svg",revision:null},{url:"/static/img/bz.5e0ef548.svg",revision:null},{url:"/static/img/ca.163ac200.svg",revision:null},{url:"/static/img/ca.a2ab234d.svg",revision:null},{url:"/static/img/cc.51960f85.svg",revision:null},{url:"/static/img/cc.813adff8.svg",revision:null},{url:"/static/img/cd.39186ec2.svg",revision:null},{url:"/static/img/cd.b4bd46ee.svg",revision:null},{url:"/static/img/cf.b5702729.svg",revision:null},{url:"/static/img/cf.fe1120e9.svg",revision:null},{url:"/static/img/cg.00603842.svg",revision:null},{url:"/static/img/cg.12414c99.svg",revision:null},{url:"/static/img/ch.7376c9c3.svg",revision:null},{url:"/static/img/ch.a558d859.svg",revision:null},{url:"/static/img/ci.1251a8e3.svg",revision:null},{url:"/static/img/ci.425a24c2.svg",revision:null},{url:"/static/img/ck.4e83dd3e.svg",revision:null},{url:"/static/img/ck.6303aa5b.svg",revision:null},{url:"/static/img/cl.0917a91e.svg",revision:null},{url:"/static/img/cl.b5974a35.svg",revision:null},{url:"/static/img/cm.253adb39.svg",revision:null},{url:"/static/img/cm.853e2843.svg",revision:null},{url:"/static/img/cn.38f63e1e.svg",revision:null},{url:"/static/img/cn.e1b166eb.svg",revision:null},{url:"/static/img/co.33e249d8.svg",revision:null},{url:"/static/img/co.b5cbc817.svg",revision:null},{url:"/static/img/cr.2e572846.svg",revision:null},{url:"/static/img/cr.336eb7d3.svg",revision:null},{url:"/static/img/cu.c2a6f0ed.svg",revision:null},{url:"/static/img/cu.d6e33f19.svg",revision:null},{url:"/static/img/cv.5ea64968.svg",revision:null},{url:"/static/img/cv.b3ab83f5.svg",revision:null},{url:"/static/img/cw.0e14b0b7.svg",revision:null},{url:"/static/img/cw.9b9b7ed5.svg",revision:null},{url:"/static/img/cx.da5de6d2.svg",revision:null},{url:"/static/img/cx.e04e07e8.svg",revision:null},{url:"/static/img/cy.834e6240.svg",revision:null},{url:"/static/img/cy.bfcfd736.svg",revision:null},{url:"/static/img/cz.aa114964.svg",revision:null},{url:"/static/img/cz.b5f98a6b.svg",revision:null},{url:"/static/img/dashboard-bg-light.06da6eab.jpg",revision:null},{url:"/static/img/de.8e159e6e.svg",revision:null},{url:"/static/img/de.b827ac51.svg",revision:null},{url:"/static/img/dj.4197a18a.svg",revision:null},{url:"/static/img/dj.925748d5.svg",revision:null},{url:"/static/img/dk.3ca1caed.svg",revision:null},{url:"/static/img/dk.a867eeef.svg",revision:null},{url:"/static/img/dm.7ddb00ac.svg",revision:null},{url:"/static/img/dm.bca6d70c.svg",revision:null},{url:"/static/img/do.81097daa.svg",revision:null},{url:"/static/img/do.954f0f3e.svg",revision:null},{url:"/static/img/dz.76d47b01.svg",revision:null},{url:"/static/img/dz.b7e2fbce.svg",revision:null},{url:"/static/img/ec.0029f514.svg",revision:null},{url:"/static/img/ec.5f387e2f.svg",revision:null},{url:"/static/img/ee.1b4839e0.svg",revision:null},{url:"/static/img/ee.828384a8.svg",revision:null},{url:"/static/img/eg.38443fa6.svg",revision:null},{url:"/static/img/eg.5756a758.svg",revision:null},{url:"/static/img/eh.82bd1c7b.svg",revision:null},{url:"/static/img/eh.f8d7b64f.svg",revision:null},{url:"/static/img/er.bf5b134b.svg",revision:null},{url:"/static/img/er.e932abe1.svg",revision:null},{url:"/static/img/es-ct.64a68954.svg",revision:null},{url:"/static/img/es-ct.69469f50.svg",revision:null},{url:"/static/img/es.7dd46df0.svg",revision:null},{url:"/static/img/es.de5915e5.svg",revision:null},{url:"/static/img/et.82e8eb21.svg",revision:null},{url:"/static/img/et.a998a1b2.svg",revision:null},{url:"/static/img/eu.4c6e130f.svg",revision:null},{url:"/static/img/eu.aba724b1.svg",revision:null},{url:"/static/img/fi.0cd85b78.svg",revision:null},{url:"/static/img/fi.3be6b378.svg",revision:null},{url:"/static/img/fj.ac9c916f.svg",revision:null},{url:"/static/img/fj.e8d3e00b.svg",revision:null},{url:"/static/img/fk.af0350f8.svg",revision:null},{url:"/static/img/fk.db55fa14.svg",revision:null},{url:"/static/img/fm.3491efc7.svg",revision:null},{url:"/static/img/fm.78d44caa.svg",revision:null},{url:"/static/img/fo.1da81e3a.svg",revision:null},{url:"/static/img/fo.72949ad1.svg",revision:null},{url:"/static/img/fr.3565b8f4.svg",revision:null},{url:"/static/img/fr.9cb70285.svg",revision:null},{url:"/static/img/ga.3e474381.svg",revision:null},{url:"/static/img/ga.59f7d865.svg",revision:null},{url:"/static/img/gb-eng.0fac6e79.svg",revision:null},{url:"/static/img/gb-eng.513dcf1b.svg",revision:null},{url:"/static/img/gb-nir.2b7d2c3a.svg",revision:null},{url:"/static/img/gb-nir.f59817d6.svg",revision:null},{url:"/static/img/gb-sct.f5001e5d.svg",revision:null},{url:"/static/img/gb-sct.fee55173.svg",revision:null},{url:"/static/img/gb-wls.13481560.svg",revision:null},{url:"/static/img/gb-wls.95b2cfab.svg",revision:null},{url:"/static/img/gb.2aafb374.svg",revision:null},{url:"/static/img/gb.7a456bb2.svg",revision:null},{url:"/static/img/gd.04ea09b7.svg",revision:null},{url:"/static/img/gd.60b96978.svg",revision:null},{url:"/static/img/ge.b7b65b55.svg",revision:null},{url:"/static/img/ge.c7190912.svg",revision:null},{url:"/static/img/gf.531f9e07.svg",revision:null},{url:"/static/img/gf.90f438a3.svg",revision:null},{url:"/static/img/gg.3aebc3ce.svg",revision:null},{url:"/static/img/gg.65174039.svg",revision:null},{url:"/static/img/gh.af443995.svg",revision:null},{url:"/static/img/gh.f2b6baac.svg",revision:null},{url:"/static/img/gi.302c2506.svg",revision:null},{url:"/static/img/gi.7beea6ed.svg",revision:null},{url:"/static/img/gl.551d0783.svg",revision:null},{url:"/static/img/gl.6a5c17b0.svg",revision:null},{url:"/static/img/gm.0e00e9d4.svg",revision:null},{url:"/static/img/gm.1724dc37.svg",revision:null},{url:"/static/img/gn.54a75b28.svg",revision:null},{url:"/static/img/gn.7c96520b.svg",revision:null},{url:"/static/img/gp.4327060f.svg",revision:null},{url:"/static/img/gp.f8adbf5c.svg",revision:null},{url:"/static/img/gq.b1679302.svg",revision:null},{url:"/static/img/gq.bd7daf33.svg",revision:null},{url:"/static/img/gr.07bedadf.svg",revision:null},{url:"/static/img/gr.25dd3287.svg",revision:null},{url:"/static/img/gs.60368968.svg",revision:null},{url:"/static/img/gs.b2836676.svg",revision:null},{url:"/static/img/gt.1a24ed67.svg",revision:null},{url:"/static/img/gt.825f7286.svg",revision:null},{url:"/static/img/gu.05f0ab85.svg",revision:null},{url:"/static/img/gu.19b114eb.svg",revision:null},{url:"/static/img/gw.bcd1eddb.svg",revision:null},{url:"/static/img/gw.c97f3f94.svg",revision:null},{url:"/static/img/gy.6327f72a.svg",revision:null},{url:"/static/img/gy.e11d0234.svg",revision:null},{url:"/static/img/hk.b199a9ee.svg",revision:null},{url:"/static/img/hk.c72bba0e.svg",revision:null},{url:"/static/img/hm.4aa61657.svg",revision:null},{url:"/static/img/hm.d4b3d393.svg",revision:null},{url:"/static/img/hn.08ad78b2.svg",revision:null},{url:"/static/img/hn.44cee191.svg",revision:null},{url:"/static/img/hr.078b1bf9.svg",revision:null},{url:"/static/img/hr.1f4e28b8.svg",revision:null},{url:"/static/img/ht.6943447c.svg",revision:null},{url:"/static/img/ht.7ca68737.svg",revision:null},{url:"/static/img/hu.692e97ca.svg",revision:null},{url:"/static/img/hu.b10d3f8e.svg",revision:null},{url:"/static/img/id.94464e47.svg",revision:null},{url:"/static/img/id.a05dc04c.svg",revision:null},{url:"/static/img/ie.5154112a.svg",revision:null},{url:"/static/img/ie.e23b25d1.svg",revision:null},{url:"/static/img/il.150f4c5f.svg",revision:null},{url:"/static/img/il.e02a66d3.svg",revision:null},{url:"/static/img/im.25166c91.svg",revision:null},{url:"/static/img/im.942419c5.svg",revision:null},{url:"/static/img/in.954929a0.svg",revision:null},{url:"/static/img/in.bd0d4f19.svg",revision:null},{url:"/static/img/io.a59923ab.svg",revision:null},{url:"/static/img/io.fa003484.svg",revision:null},{url:"/static/img/iq.1232a5c2.svg",revision:null},{url:"/static/img/iq.9a48d678.svg",revision:null},{url:"/static/img/ir.1ed24953.svg",revision:null},{url:"/static/img/ir.bc7ae9e1.svg",revision:null},{url:"/static/img/is.cad57f19.svg",revision:null},{url:"/static/img/is.eea59326.svg",revision:null},{url:"/static/img/it.039b4527.svg",revision:null},{url:"/static/img/it.e8516fc7.svg",revision:null},{url:"/static/img/je.1684dacc.svg",revision:null},{url:"/static/img/je.3ed72a25.svg",revision:null},{url:"/static/img/jellyfin.7b53a541.svg",revision:null},{url:"/static/img/jm.2357530e.svg",revision:null},{url:"/static/img/jm.479f30fe.svg",revision:null},{url:"/static/img/jo.06fbaa2c.svg",revision:null},{url:"/static/img/jo.7ac45a65.svg",revision:null},{url:"/static/img/jp.1795778c.svg",revision:null},{url:"/static/img/jp.b6063838.svg",revision:null},{url:"/static/img/ke.6dbfffd5.svg",revision:null},{url:"/static/img/ke.769bb975.svg",revision:null},{url:"/static/img/kg.96c12490.svg",revision:null},{url:"/static/img/kg.daded53c.svg",revision:null},{url:"/static/img/kh.8eeb1634.svg",revision:null},{url:"/static/img/kh.b10339d6.svg",revision:null},{url:"/static/img/ki.033ff9ce.svg",revision:null},{url:"/static/img/ki.89e43a21.svg",revision:null},{url:"/static/img/km.1e3bd5fe.svg",revision:null},{url:"/static/img/km.3ffb0228.svg",revision:null},{url:"/static/img/kn.0c16fe68.svg",revision:null},{url:"/static/img/kn.8f2e7b29.svg",revision:null},{url:"/static/img/kodi.d18f8d23.svg",revision:null},{url:"/static/img/kp.0f5253d8.svg",revision:null},{url:"/static/img/kp.f4ff9e76.svg",revision:null},{url:"/static/img/kr.0dc8b972.svg",revision:null},{url:"/static/img/kr.0f5e1116.svg",revision:null},{url:"/static/img/kw.3b4f3ea3.svg",revision:null},{url:"/static/img/kw.830d3755.svg",revision:null},{url:"/static/img/ky.be81d90b.svg",revision:null},{url:"/static/img/ky.e3b76b32.svg",revision:null},{url:"/static/img/kz.32ac1036.svg",revision:null},{url:"/static/img/kz.579ac0f9.svg",revision:null},{url:"/static/img/la.e583f8ec.svg",revision:null},{url:"/static/img/la.f71017ef.svg",revision:null},{url:"/static/img/lb.8eea508a.svg",revision:null},{url:"/static/img/lb.bdbeb8f1.svg",revision:null},{url:"/static/img/lc.25f644a6.svg",revision:null},{url:"/static/img/lc.68bd77ae.svg",revision:null},{url:"/static/img/li.8dc1ed79.svg",revision:null},{url:"/static/img/li.d7e2a871.svg",revision:null},{url:"/static/img/lk.42c41c61.svg",revision:null},{url:"/static/img/lk.e52240d6.svg",revision:null},{url:"/static/img/lr.5b84ff00.svg",revision:null},{url:"/static/img/lr.9a67cd3d.svg",revision:null},{url:"/static/img/ls.6d444cae.svg",revision:null},{url:"/static/img/ls.fe1da403.svg",revision:null},{url:"/static/img/lt.03a2e8c1.svg",revision:null},{url:"/static/img/lt.b57ea2a8.svg",revision:null},{url:"/static/img/lu.93878a1b.svg",revision:null},{url:"/static/img/lu.e3bdc6d3.svg",revision:null},{url:"/static/img/lv.1853e3a0.svg",revision:null},{url:"/static/img/lv.679c099e.svg",revision:null},{url:"/static/img/ly.05f8732e.svg",revision:null},{url:"/static/img/ly.b9e750ff.svg",revision:null},{url:"/static/img/ma.65053fc4.svg",revision:null},{url:"/static/img/ma.88ada30c.svg",revision:null},{url:"/static/img/mc.2c03ea5c.svg",revision:null},{url:"/static/img/mc.89b532e8.svg",revision:null},{url:"/static/img/md.646818c3.svg",revision:null},{url:"/static/img/md.a56562ee.svg",revision:null},{url:"/static/img/me.2e71b778.svg",revision:null},{url:"/static/img/me.f05548f2.svg",revision:null},{url:"/static/img/mf.70d09a4a.svg",revision:null},{url:"/static/img/mf.7da6b3d2.svg",revision:null},{url:"/static/img/mg.09ca17b2.svg",revision:null},{url:"/static/img/mg.b3fff4a6.svg",revision:null},{url:"/static/img/mh.3fd69bb2.svg",revision:null},{url:"/static/img/mh.f6cbc774.svg",revision:null},{url:"/static/img/mk.4234a248.svg",revision:null},{url:"/static/img/mk.e5412079.svg",revision:null},{url:"/static/img/ml.3fad079e.svg",revision:null},{url:"/static/img/ml.4f0dba9e.svg",revision:null},{url:"/static/img/mm.8ac1f094.svg",revision:null},{url:"/static/img/mm.adaa2111.svg",revision:null},{url:"/static/img/mn.78547af0.svg",revision:null},{url:"/static/img/mn.a4bcb0e6.svg",revision:null},{url:"/static/img/mo.2f0d2c15.svg",revision:null},{url:"/static/img/mo.c8198565.svg",revision:null},{url:"/static/img/mp.2acb5506.svg",revision:null},{url:"/static/img/mp.eeeefff6.svg",revision:null},{url:"/static/img/mq.145a7657.svg",revision:null},{url:"/static/img/mq.bb36a8fc.svg",revision:null},{url:"/static/img/mr.dd34eae8.svg",revision:null},{url:"/static/img/mr.e91e06ea.svg",revision:null},{url:"/static/img/ms.2025cd7d.svg",revision:null},{url:"/static/img/ms.b13001dc.svg",revision:null},{url:"/static/img/mt.b6f71c85.svg",revision:null},{url:"/static/img/mt.cff39ee0.svg",revision:null},{url:"/static/img/mu.51f71163.svg",revision:null},{url:"/static/img/mu.a926c232.svg",revision:null},{url:"/static/img/mv.2c8b92b5.svg",revision:null},{url:"/static/img/mv.ba4de4fd.svg",revision:null},{url:"/static/img/mw.0b005148.svg",revision:null},{url:"/static/img/mw.f704f4bb.svg",revision:null},{url:"/static/img/mx.1b615ec2.svg",revision:null},{url:"/static/img/mx.8a36b075.svg",revision:null},{url:"/static/img/my.4109ae71.svg",revision:null},{url:"/static/img/my.69c87fc5.svg",revision:null},{url:"/static/img/mz.1377650b.svg",revision:null},{url:"/static/img/mz.2c96acb1.svg",revision:null},{url:"/static/img/na.7adf4344.svg",revision:null},{url:"/static/img/na.e0503926.svg",revision:null},{url:"/static/img/nc.96fa6a4b.svg",revision:null},{url:"/static/img/nc.b5a5d41b.svg",revision:null},{url:"/static/img/ne.d11b82c6.svg",revision:null},{url:"/static/img/ne.d4fe4faa.svg",revision:null},{url:"/static/img/nf.1e8c700b.svg",revision:null},{url:"/static/img/nf.a7166b00.svg",revision:null},{url:"/static/img/ng.51059407.svg",revision:null},{url:"/static/img/ng.c3b42ad2.svg",revision:null},{url:"/static/img/ni.5b80bac0.svg",revision:null},{url:"/static/img/ni.cc7eb514.svg",revision:null},{url:"/static/img/nl.dd138444.svg",revision:null},{url:"/static/img/nl.e415f0e7.svg",revision:null},{url:"/static/img/no.26996afa.svg",revision:null},{url:"/static/img/no.70157234.svg",revision:null},{url:"/static/img/np.954177a0.svg",revision:null},{url:"/static/img/np.f7b8a5c3.svg",revision:null},{url:"/static/img/nr.2c66d218.svg",revision:null},{url:"/static/img/nr.a4f0e762.svg",revision:null},{url:"/static/img/nu.26551dc2.svg",revision:null},{url:"/static/img/nu.860bbe8a.svg",revision:null},{url:"/static/img/nz.38d0d690.svg",revision:null},{url:"/static/img/nz.c77ae58d.svg",revision:null},{url:"/static/img/om.3f5691ca.svg",revision:null},{url:"/static/img/om.ff034f9e.svg",revision:null},{url:"/static/img/pa.6dc8212a.svg",revision:null},{url:"/static/img/pa.acde3214.svg",revision:null},{url:"/static/img/pe.5a3b0bc5.svg",revision:null},{url:"/static/img/pe.5c2ced95.svg",revision:null},{url:"/static/img/pf.9f06082b.svg",revision:null},{url:"/static/img/pf.f6ae1bc8.svg",revision:null},{url:"/static/img/pg.26847b33.svg",revision:null},{url:"/static/img/pg.66c8dc3b.svg",revision:null},{url:"/static/img/ph.12e2b123.svg",revision:null},{url:"/static/img/ph.f215833e.svg",revision:null},{url:"/static/img/pk.0bbf58be.svg",revision:null},{url:"/static/img/pk.32b55f6f.svg",revision:null},{url:"/static/img/pl.03886843.svg",revision:null},{url:"/static/img/pl.a1350f0c.svg",revision:null},{url:"/static/img/plex.7a4e22a6.svg",revision:null},{url:"/static/img/pm.7a6beab5.svg",revision:null},{url:"/static/img/pm.a5590fa3.svg",revision:null},{url:"/static/img/pn.00a9342b.svg",revision:null},{url:"/static/img/pn.715fd11d.svg",revision:null},{url:"/static/img/pr.391a48e2.svg",revision:null},{url:"/static/img/pr.b37cbdc4.svg",revision:null},{url:"/static/img/ps.1af72ed4.svg",revision:null},{url:"/static/img/ps.96bcac74.svg",revision:null},{url:"/static/img/pt.0703cc3a.svg",revision:null},{url:"/static/img/pt.351b87cb.svg",revision:null},{url:"/static/img/pw.17220ffb.svg",revision:null},{url:"/static/img/pw.6d8e7ce0.svg",revision:null},{url:"/static/img/py.25cc39e3.svg",revision:null},{url:"/static/img/py.c20318c9.svg",revision:null},{url:"/static/img/qa.7e695788.svg",revision:null},{url:"/static/img/qa.86452d7a.svg",revision:null},{url:"/static/img/re.b8140129.svg",revision:null},{url:"/static/img/re.cf143c2f.svg",revision:null},{url:"/static/img/ro.67f8501e.svg",revision:null},{url:"/static/img/ro.cab93784.svg",revision:null},{url:"/static/img/rs.23638d75.svg",revision:null},{url:"/static/img/rs.ae2e3422.svg",revision:null},{url:"/static/img/ru.ccd50623.svg",revision:null},{url:"/static/img/ru.edd8b008.svg",revision:null},{url:"/static/img/rw.87d5d899.svg",revision:null},{url:"/static/img/rw.d118aacd.svg",revision:null},{url:"/static/img/sa.5bfbe72b.svg",revision:null},{url:"/static/img/sa.f0a8997b.svg",revision:null},{url:"/static/img/sb.1c406073.svg",revision:null},{url:"/static/img/sb.b0db5b0a.svg",revision:null},{url:"/static/img/sc.0452f14c.svg",revision:null},{url:"/static/img/sc.cdc20672.svg",revision:null},{url:"/static/img/sd.0e619868.svg",revision:null},{url:"/static/img/sd.da3b68ee.svg",revision:null},{url:"/static/img/se.7e499d82.svg",revision:null},{url:"/static/img/se.7ec71700.svg",revision:null},{url:"/static/img/sg.4f0e8eff.svg",revision:null},{url:"/static/img/sg.8a63b009.svg",revision:null},{url:"/static/img/sh.46e2588d.svg",revision:null},{url:"/static/img/sh.681f8fff.svg",revision:null},{url:"/static/img/si.2a428364.svg",revision:null},{url:"/static/img/si.d9d425c0.svg",revision:null},{url:"/static/img/sj.638e6522.svg",revision:null},{url:"/static/img/sj.92c583b8.svg",revision:null},{url:"/static/img/sk.7998d1f5.svg",revision:null},{url:"/static/img/sk.93c91c0b.svg",revision:null},{url:"/static/img/sl.d8378c47.svg",revision:null},{url:"/static/img/sl.eb9dda3f.svg",revision:null},{url:"/static/img/sm.0ba901f4.svg",revision:null},{url:"/static/img/sm.5e2fc188.svg",revision:null},{url:"/static/img/sn.4247b831.svg",revision:null},{url:"/static/img/sn.98923b55.svg",revision:null},{url:"/static/img/so.2d18a203.svg",revision:null},{url:"/static/img/so.45f08b28.svg",revision:null},{url:"/static/img/sr.cb178d98.svg",revision:null},{url:"/static/img/sr.d66c1240.svg",revision:null},{url:"/static/img/ss.caedfdf2.svg",revision:null},{url:"/static/img/ss.db181f81.svg",revision:null},{url:"/static/img/st.a70042c6.svg",revision:null},{url:"/static/img/st.ecc4827f.svg",revision:null},{url:"/static/img/sv.9501935a.svg",revision:null},{url:"/static/img/sv.f67839a6.svg",revision:null},{url:"/static/img/sx.77e864f0.svg",revision:null},{url:"/static/img/sx.c0e6297a.svg",revision:null},{url:"/static/img/sy.2b3eac89.svg",revision:null},{url:"/static/img/sy.7fe894df.svg",revision:null},{url:"/static/img/sz.70b6fc50.svg",revision:null},{url:"/static/img/sz.eb01cd9f.svg",revision:null},{url:"/static/img/tc.30ccd48e.svg",revision:null},{url:"/static/img/tc.651466dd.svg",revision:null},{url:"/static/img/td.5d622e26.svg",revision:null},{url:"/static/img/td.f1319408.svg",revision:null},{url:"/static/img/tf.27cbe00b.svg",revision:null},{url:"/static/img/tf.a1757237.svg",revision:null},{url:"/static/img/tg.b492a751.svg",revision:null},{url:"/static/img/tg.d04f874c.svg",revision:null},{url:"/static/img/th.79b63a8a.svg",revision:null},{url:"/static/img/th.b8e24edb.svg",revision:null},{url:"/static/img/tj.b7dafe8d.svg",revision:null},{url:"/static/img/tj.d3a42312.svg",revision:null},{url:"/static/img/tk.6c1f520c.svg",revision:null},{url:"/static/img/tk.f87f794b.svg",revision:null},{url:"/static/img/tl.85904d79.svg",revision:null},{url:"/static/img/tl.ca9af3c0.svg",revision:null},{url:"/static/img/tm.762df128.svg",revision:null},{url:"/static/img/tm.e467552c.svg",revision:null},{url:"/static/img/tn.cc3ab493.svg",revision:null},{url:"/static/img/tn.ff4c5190.svg",revision:null},{url:"/static/img/to.8dd22284.svg",revision:null},{url:"/static/img/to.9748a967.svg",revision:null},{url:"/static/img/tr.87e40d5c.svg",revision:null},{url:"/static/img/tr.fc8c91dd.svg",revision:null},{url:"/static/img/tt.4acf6cc2.svg",revision:null},{url:"/static/img/tt.5a459e81.svg",revision:null},{url:"/static/img/tv.9717b553.svg",revision:null},{url:"/static/img/tv.a8ff4939.svg",revision:null},{url:"/static/img/tw.45c8a106.svg",revision:null},{url:"/static/img/tw.c0cf9ea7.svg",revision:null},{url:"/static/img/tz.1abfbb38.svg",revision:null},{url:"/static/img/tz.c27fd405.svg",revision:null},{url:"/static/img/ua.04fa0e67.svg",revision:null},{url:"/static/img/ua.63d75c84.svg",revision:null},{url:"/static/img/ug.5ac71e98.svg",revision:null},{url:"/static/img/ug.5ae165a2.svg",revision:null},{url:"/static/img/um.582dd57b.svg",revision:null},{url:"/static/img/um.b38f913c.svg",revision:null},{url:"/static/img/un.2df110d6.svg",revision:null},{url:"/static/img/un.58a4a02a.svg",revision:null},{url:"/static/img/us.6c459052.svg",revision:null},{url:"/static/img/us.99e04236.svg",revision:null},{url:"/static/img/uy.69cf8938.svg",revision:null},{url:"/static/img/uy.b70ac310.svg",revision:null},{url:"/static/img/uz.7f8823a2.svg",revision:null},{url:"/static/img/uz.d53abc35.svg",revision:null},{url:"/static/img/va.7efb8ba6.svg",revision:null},{url:"/static/img/va.abcb42e8.svg",revision:null},{url:"/static/img/vc.37cf5ba1.svg",revision:null},{url:"/static/img/vc.3e4ac6d4.svg",revision:null},{url:"/static/img/ve.4cd0e3ed.svg",revision:null},{url:"/static/img/ve.9cd63506.svg",revision:null},{url:"/static/img/vg.025b8b6a.svg",revision:null},{url:"/static/img/vg.ae3b6f7e.svg",revision:null},{url:"/static/img/vi.293e6f1c.svg",revision:null},{url:"/static/img/vi.f920eec7.svg",revision:null},{url:"/static/img/vn.11dd1cf6.svg",revision:null},{url:"/static/img/vn.9ec4ca4d.svg",revision:null},{url:"/static/img/vu.5d2d7643.svg",revision:null},{url:"/static/img/vu.b7a8d91a.svg",revision:null},{url:"/static/img/wf.69c77016.svg",revision:null},{url:"/static/img/wf.9ca6f4bc.svg",revision:null},{url:"/static/img/ws.15c7a17c.svg",revision:null},{url:"/static/img/ws.d2e19e5a.svg",revision:null},{url:"/static/img/xk.16b6bb85.svg",revision:null},{url:"/static/img/xk.ca7843be.svg",revision:null},{url:"/static/img/ye.0b3f3c76.svg",revision:null},{url:"/static/img/ye.bb567731.svg",revision:null},{url:"/static/img/yt.332bd5d3.svg",revision:null},{url:"/static/img/yt.c33641ca.svg",revision:null},{url:"/static/img/za.2fa94205.svg",revision:null},{url:"/static/img/za.42e033a9.svg",revision:null},{url:"/static/img/zm.92477cab.svg",revision:null},{url:"/static/img/zm.ce5363b7.svg",revision:null},{url:"/static/img/zw.6a535c1e.svg",revision:null},{url:"/static/img/zw.f488cb8a.svg",revision:null},{url:"/static/js/1196.f4c25ec1.js",revision:null},{url:"/static/js/1595.cf573de8.js",revision:null},{url:"/static/js/1767.25bd60ff.js",revision:null},{url:"/static/js/1798.2ea76630.js",revision:null},{url:"/static/js/1818.d8f79120.js",revision:null},{url:"/static/js/1938.1dc95872.js",revision:null},{url:"/static/js/201.7a3e40e3.js",revision:null},{url:"/static/js/2346.9a487752.js",revision:null},{url:"/static/js/2362.620095dd.js",revision:null},{url:"/static/js/2466.633bb83f.js",revision:null},{url:"/static/js/2790.4b108fb8.js",revision:null},{url:"/static/js/2806.e32037e8.js",revision:null},{url:"/static/js/2820.07ee3664.js",revision:null},{url:"/static/js/3194.256c2da8.js",revision:null},{url:"/static/js/3249.a2010c2d.js",revision:null},{url:"/static/js/3303.028580a6.js",revision:null},{url:"/static/js/345.8d14f37b.js",revision:null},{url:"/static/js/346.647c3d99.js",revision:null},{url:"/static/js/3710.05c41d28.js",revision:null},{url:"/static/js/3724.a557791e.js",revision:null},{url:"/static/js/4196.f85ff63e.js",revision:null},{url:"/static/js/4548.c7642733.js",revision:null},{url:"/static/js/4848.ca77e67b.js",revision:null},{url:"/static/js/5111.f606018d.js",revision:null},{url:"/static/js/5157.f2273a80.js",revision:null},{url:"/static/js/5193.1de6bb98.js",revision:null},{url:"/static/js/5199.03545ba6.js",revision:null},{url:"/static/js/5207.b6625280.js",revision:null},{url:"/static/js/5498.ddfaadb5.js",revision:null},{url:"/static/js/5528.10b051ba.js",revision:null},{url:"/static/js/5824.d14935bb.js",revision:null},{url:"/static/js/5895.bc039cca.js",revision:null},{url:"/static/js/5924.a2919fe4.js",revision:null},{url:"/static/js/6003.c76e25e0.js",revision:null},{url:"/static/js/6013.5c85c65a.js",revision:null},{url:"/static/js/6027.e3b113ee.js",revision:null},{url:"/static/js/615.25a0ebcb.js",revision:null},{url:"/static/js/6164.2c2c3fba.js",revision:null},{url:"/static/js/6358.46615b4c.js",revision:null},{url:"/static/js/65.a4e6662a.js",revision:null},{url:"/static/js/6509.9ca36429.js",revision:null},{url:"/static/js/6739.14f222c1.js",revision:null},{url:"/static/js/675.496d097f.js",revision:null},{url:"/static/js/6815.a11912ee.js",revision:null},{url:"/static/js/6833.65afb884.js",revision:null},{url:"/static/js/6899.8c784f84.js",revision:null},{url:"/static/js/699.b7975861.js",revision:null},{url:"/static/js/7141.e4e94ba3.js",revision:null},{url:"/static/js/7420.e53d9d48.js",revision:null},{url:"/static/js/7503.2c161f6d.js",revision:null},{url:"/static/js/767.32c26b46.js",revision:null},{url:"/static/js/8135.bb2ac7e3.js",revision:null},{url:"/static/js/8184.c4135de2.js",revision:null},{url:"/static/js/8444.d0d1fdb2.js",revision:null},{url:"/static/js/906.12e72134.js",revision:null},{url:"/static/js/9276.74343d50.js",revision:null},{url:"/static/js/9299.710819a1.js",revision:null},{url:"/static/js/9369.f7907b71.js",revision:null},{url:"/static/js/9387.194bcb15.js",revision:null},{url:"/static/js/9418.dfb3427c.js",revision:null},{url:"/static/js/9450.0b6d3902.js",revision:null},{url:"/static/js/9633.23b95cb0.js",revision:null},{url:"/static/js/9895.16e6387b.js",revision:null},{url:"/static/js/9978.f8ee0318.js",revision:null},{url:"/static/js/app.8e3d4fb1.js",revision:null},{url:"/static/js/chunk-vendors.0f6060b6.js",revision:null}],{})})); +if(!self.define){let i,s={};const l=(l,n)=>(l=new URL(l+".js",n).href,s[l]||new Promise((s=>{if("document"in self){const i=document.createElement("script");i.src=l,i.onload=s,document.head.appendChild(i)}else i=l,importScripts(l),s()})).then((()=>{let i=s[l];if(!i)throw new Error(`Module ${l} didn’t register its module`);return i})));self.define=(n,r)=>{const e=i||("document"in self?document.currentScript.src:"")||location.href;if(s[e])return;let t={};const u=i=>l(i,e),a={module:{uri:e},exports:t,require:u};s[e]=Promise.all(n.map((i=>a[i]||u(i)))).then((i=>(r(...i),t)))}}define(["./workbox-79ffe3e0"],(function(i){"use strict";i.setCacheNameDetails({prefix:"platypush"}),self.addEventListener("message",(i=>{i.data&&"SKIP_WAITING"===i.data.type&&self.skipWaiting()})),i.precacheAndRoute([{url:"/fonts/Poppins.ttf",revision:"d10d3ed96303653f936a08b38534f12e"},{url:"/fonts/poppins.css",revision:"413ee9a4d1879f6ae3d62a796644daad"},{url:"/icons/jellyfin.svg",revision:"1ec11e72ffc381f8797ddbebed2652c0"},{url:"/icons/kodi.svg",revision:"81ea5504989d4a0ed19ba6528c39e80f"},{url:"/icons/openweathermap/black/01d.png",revision:"4cf2907a1083c067828830bb007e2f34"},{url:"/icons/openweathermap/black/01n.png",revision:"df30375c6371005e2d238c36255afc8a"},{url:"/icons/openweathermap/black/02d.png",revision:"79a0adce79d78da203beeb7a6f4f510b"},{url:"/icons/openweathermap/black/02n.png",revision:"68d34b41357c2a3ea9479dae653b3617"},{url:"/icons/openweathermap/black/03d.png",revision:"5f13dba4164c437e2fbdc1d1ecaada4c"},{url:"/icons/openweathermap/black/03n.png",revision:"65c125cd51934e24f9e3321cc5448d0e"},{url:"/icons/openweathermap/black/04d.png",revision:"e75cd73c232806d7364ad7feae354074"},{url:"/icons/openweathermap/black/04n.png",revision:"e75cd73c232806d7364ad7feae354074"},{url:"/icons/openweathermap/black/09d.png",revision:"328b726310fb5762861859e33ac9066a"},{url:"/icons/openweathermap/black/09n.png",revision:"328b726310fb5762861859e33ac9066a"},{url:"/icons/openweathermap/black/10d.png",revision:"7dde329628506567faef30b9eb5c5f69"},{url:"/icons/openweathermap/black/10n.png",revision:"7dde329628506567faef30b9eb5c5f69"},{url:"/icons/openweathermap/black/11d.png",revision:"8f6a4b2446b42e8215195e195133e546"},{url:"/icons/openweathermap/black/11n.png",revision:"8f6a4b2446b42e8215195e195133e546"},{url:"/icons/openweathermap/black/13d.png",revision:"45bfce1d2ea7d16415848650eb5d2cb3"},{url:"/icons/openweathermap/black/13n.png",revision:"45bfce1d2ea7d16415848650eb5d2cb3"},{url:"/icons/openweathermap/black/50d.png",revision:"7a304f2b15fe4d9de351dabc44ff900d"},{url:"/icons/openweathermap/black/50n.png",revision:"7a304f2b15fe4d9de351dabc44ff900d"},{url:"/icons/openweathermap/black/unknown.png",revision:"c219891f5796e43d0f75f6525a8d6f33"},{url:"/icons/openweathermap/dark/01d.png",revision:"4cf2907a1083c067828830bb007e2f34"},{url:"/icons/openweathermap/dark/01n.png",revision:"df30375c6371005e2d238c36255afc8a"},{url:"/icons/openweathermap/dark/02d.png",revision:"79a0adce79d78da203beeb7a6f4f510b"},{url:"/icons/openweathermap/dark/02n.png",revision:"68d34b41357c2a3ea9479dae653b3617"},{url:"/icons/openweathermap/dark/03d.png",revision:"5f13dba4164c437e2fbdc1d1ecaada4c"},{url:"/icons/openweathermap/dark/03n.png",revision:"65c125cd51934e24f9e3321cc5448d0e"},{url:"/icons/openweathermap/dark/04d.png",revision:"e75cd73c232806d7364ad7feae354074"},{url:"/icons/openweathermap/dark/04n.png",revision:"e75cd73c232806d7364ad7feae354074"},{url:"/icons/openweathermap/dark/09d.png",revision:"328b726310fb5762861859e33ac9066a"},{url:"/icons/openweathermap/dark/09n.png",revision:"328b726310fb5762861859e33ac9066a"},{url:"/icons/openweathermap/dark/10d.png",revision:"7dde329628506567faef30b9eb5c5f69"},{url:"/icons/openweathermap/dark/10n.png",revision:"7dde329628506567faef30b9eb5c5f69"},{url:"/icons/openweathermap/dark/11d.png",revision:"8f6a4b2446b42e8215195e195133e546"},{url:"/icons/openweathermap/dark/11n.png",revision:"8f6a4b2446b42e8215195e195133e546"},{url:"/icons/openweathermap/dark/13d.png",revision:"45bfce1d2ea7d16415848650eb5d2cb3"},{url:"/icons/openweathermap/dark/13n.png",revision:"45bfce1d2ea7d16415848650eb5d2cb3"},{url:"/icons/openweathermap/dark/50d.png",revision:"7a304f2b15fe4d9de351dabc44ff900d"},{url:"/icons/openweathermap/dark/50n.png",revision:"7a304f2b15fe4d9de351dabc44ff900d"},{url:"/icons/openweathermap/dark/unknown.png",revision:"c219891f5796e43d0f75f6525a8d6f33"},{url:"/icons/openweathermap/light/01d.png",revision:"00c2d0a72a69bf279bf8703cea9ce8d2"},{url:"/icons/openweathermap/light/01n.png",revision:"3a65e9f7ed5c54c6acd638a7bd26de25"},{url:"/icons/openweathermap/light/02d.png",revision:"63dab156e991be7e4174d1d6cd8c2321"},{url:"/icons/openweathermap/light/02n.png",revision:"7c64d1a1c5efdbe38e6b7e3b4f50f2c5"},{url:"/icons/openweathermap/light/03d.png",revision:"f609003793e658a60870587cd450fc6f"},{url:"/icons/openweathermap/light/03n.png",revision:"7e694b4317b3e9f2533db93969fcc3e8"},{url:"/icons/openweathermap/light/04d.png",revision:"098f9d40b1d5747996df9a720f160c81"},{url:"/icons/openweathermap/light/04n.png",revision:"098f9d40b1d5747996df9a720f160c81"},{url:"/icons/openweathermap/light/09d.png",revision:"c48a99b60e45690cdc702a2dc6694002"},{url:"/icons/openweathermap/light/09n.png",revision:"c48a99b60e45690cdc702a2dc6694002"},{url:"/icons/openweathermap/light/10d.png",revision:"2750daf3f0d811230591a415e42bddb2"},{url:"/icons/openweathermap/light/10n.png",revision:"2750daf3f0d811230591a415e42bddb2"},{url:"/icons/openweathermap/light/11d.png",revision:"7bd0501a7bfcf2675467df0c0788ffad"},{url:"/icons/openweathermap/light/11n.png",revision:"7bd0501a7bfcf2675467df0c0788ffad"},{url:"/icons/openweathermap/light/13d.png",revision:"4e11e697c6bafc8dd83c4dfc8ce47919"},{url:"/icons/openweathermap/light/13n.png",revision:"4e11e697c6bafc8dd83c4dfc8ce47919"},{url:"/icons/openweathermap/light/50d.png",revision:"9a0770f3adc7c4a27e131c04a739f735"},{url:"/icons/openweathermap/light/50n.png",revision:"9a0770f3adc7c4a27e131c04a739f735"},{url:"/icons/openweathermap/light/unknown.png",revision:"f14a44a1ecde49a5c6a396f8c1753263"},{url:"/icons/openweathermap/white/01d.png",revision:"00c2d0a72a69bf279bf8703cea9ce8d2"},{url:"/icons/openweathermap/white/01n.png",revision:"3a65e9f7ed5c54c6acd638a7bd26de25"},{url:"/icons/openweathermap/white/02d.png",revision:"63dab156e991be7e4174d1d6cd8c2321"},{url:"/icons/openweathermap/white/02n.png",revision:"7c64d1a1c5efdbe38e6b7e3b4f50f2c5"},{url:"/icons/openweathermap/white/03d.png",revision:"f609003793e658a60870587cd450fc6f"},{url:"/icons/openweathermap/white/03n.png",revision:"7e694b4317b3e9f2533db93969fcc3e8"},{url:"/icons/openweathermap/white/04d.png",revision:"098f9d40b1d5747996df9a720f160c81"},{url:"/icons/openweathermap/white/04n.png",revision:"098f9d40b1d5747996df9a720f160c81"},{url:"/icons/openweathermap/white/09d.png",revision:"c48a99b60e45690cdc702a2dc6694002"},{url:"/icons/openweathermap/white/09n.png",revision:"c48a99b60e45690cdc702a2dc6694002"},{url:"/icons/openweathermap/white/10d.png",revision:"2750daf3f0d811230591a415e42bddb2"},{url:"/icons/openweathermap/white/10n.png",revision:"2750daf3f0d811230591a415e42bddb2"},{url:"/icons/openweathermap/white/11d.png",revision:"7bd0501a7bfcf2675467df0c0788ffad"},{url:"/icons/openweathermap/white/11n.png",revision:"7bd0501a7bfcf2675467df0c0788ffad"},{url:"/icons/openweathermap/white/13d.png",revision:"4e11e697c6bafc8dd83c4dfc8ce47919"},{url:"/icons/openweathermap/white/13n.png",revision:"4e11e697c6bafc8dd83c4dfc8ce47919"},{url:"/icons/openweathermap/white/50d.png",revision:"9a0770f3adc7c4a27e131c04a739f735"},{url:"/icons/openweathermap/white/50n.png",revision:"9a0770f3adc7c4a27e131c04a739f735"},{url:"/icons/openweathermap/white/unknown.png",revision:"f14a44a1ecde49a5c6a396f8c1753263"},{url:"/icons/plex.svg",revision:"9923c5c80858a7da9d48c3ee77974e77"},{url:"/icons/smartthings.png",revision:"9306b6ca82efa85d58823615ff14b00f"},{url:"/icons/z-wave.png",revision:"3045e92627da521267db845b16da6028"},{url:"/icons/zigbee.svg",revision:"3e5f749af9e83ace5c12ff3aac6d4b88"},{url:"/img/dashboard-bg-light.jpg",revision:"f9ab2a6552509997ec0cbaeb47199eba"},{url:"/img/logo.png",revision:"98702e78dde598404826f6e9279e4ab3"},{url:"/img/spinner.gif",revision:"5572838d351b66bf6a3350b6d8d23cb8"},{url:"/index.html",revision:"750b83bcf7705a1511e320e14e749ddb"},{url:"/manifest.json",revision:"8a45dcffc3380b17da6ea17291b43e00"},{url:"/static/css/1196.78925ff5.css",revision:null},{url:"/static/css/1300.180d2070.css",revision:null},{url:"/static/css/1767.f9545a14.css",revision:null},{url:"/static/css/1798.3a165bb4.css",revision:null},{url:"/static/css/1818.8db287b9.css",revision:null},{url:"/static/css/201.3ba92d09.css",revision:null},{url:"/static/css/2346.ed463bd2.css",revision:null},{url:"/static/css/2790.a0725ecc.css",revision:null},{url:"/static/css/2806.9c9d5a57.css",revision:null},{url:"/static/css/3194.a07dd4e2.css",revision:null},{url:"/static/css/3303.bfeafcb0.css",revision:null},{url:"/static/css/345.25d1c562.css",revision:null},{url:"/static/css/346.bec1b050.css",revision:null},{url:"/static/css/3490.fcf11255.css",revision:null},{url:"/static/css/3710.1112d8b7.css",revision:null},{url:"/static/css/3724.234438b4.css",revision:null},{url:"/static/css/4021.58663e3e.css",revision:null},{url:"/static/css/4118.25e7d5ff.css",revision:null},{url:"/static/css/4196.539db457.css",revision:null},{url:"/static/css/4848.72a7d113.css",revision:null},{url:"/static/css/4981.c5c2f5dd.css",revision:null},{url:"/static/css/5199.6ad0f775.css",revision:null},{url:"/static/css/5207.950597e1.css",revision:null},{url:"/static/css/5498.ef565a73.css",revision:null},{url:"/static/css/5824.8f1b2b15.css",revision:null},{url:"/static/css/5924.f0111959.css",revision:null},{url:"/static/css/6003.fbbaf2b7.css",revision:null},{url:"/static/css/6013.504d6c0b.css",revision:null},{url:"/static/css/615.6d3a8446.css",revision:null},{url:"/static/css/6164.ea3fa7cb.css",revision:null},{url:"/static/css/6358.1f06089f.css",revision:null},{url:"/static/css/65.ae3723d7.css",revision:null},{url:"/static/css/6739.49b1f262.css",revision:null},{url:"/static/css/675.10cdb721.css",revision:null},{url:"/static/css/6815.f1dc7909.css",revision:null},{url:"/static/css/6833.28cb5e3d.css",revision:null},{url:"/static/css/6899.c92d9d38.css",revision:null},{url:"/static/css/7141.4b3e6b00.css",revision:null},{url:"/static/css/7420.4bf56b11.css",revision:null},{url:"/static/css/7503.34698020.css",revision:null},{url:"/static/css/7782.a6a32303.css",revision:null},{url:"/static/css/8135.1460504e.css",revision:null},{url:"/static/css/8200.22b025de.css",revision:null},{url:"/static/css/8444.95911650.css",revision:null},{url:"/static/css/8589.2e68c420.css",revision:null},{url:"/static/css/906.a114eea0.css",revision:null},{url:"/static/css/9276.518b169b.css",revision:null},{url:"/static/css/9387.74d3b3a3.css",revision:null},{url:"/static/css/9418.9f2b9c3a.css",revision:null},{url:"/static/css/9450.fd9ed6f2.css",revision:null},{url:"/static/css/9575.1b22f65c.css",revision:null},{url:"/static/css/9978.b6585c35.css",revision:null},{url:"/static/css/app.0a781c41.css",revision:null},{url:"/static/css/chunk-vendors.0fcd36f0.css",revision:null},{url:"/static/fonts/fa-brands-400.7fa789ab.ttf",revision:null},{url:"/static/fonts/fa-brands-400.859fc388.woff2",revision:null},{url:"/static/fonts/fa-regular-400.2ffd018f.woff2",revision:null},{url:"/static/fonts/fa-regular-400.da02cb7e.ttf",revision:null},{url:"/static/fonts/fa-solid-900.3a463ec3.ttf",revision:null},{url:"/static/fonts/fa-solid-900.40ddefd7.woff2",revision:null},{url:"/static/fonts/lato-medium-italic.1996cc15.woff",revision:null},{url:"/static/fonts/lato-medium-italic.1e312dd9.woff2",revision:null},{url:"/static/fonts/lato-medium.13fcde4c.woff2",revision:null},{url:"/static/fonts/lato-medium.b41c3821.woff",revision:null},{url:"/static/img/ad.cb33f69a.svg",revision:null},{url:"/static/img/ad.fa8477e6.svg",revision:null},{url:"/static/img/ae.a3f5e295.svg",revision:null},{url:"/static/img/ae.f06e0095.svg",revision:null},{url:"/static/img/af.89591ab0.svg",revision:null},{url:"/static/img/af.8ca96393.svg",revision:null},{url:"/static/img/ag.4c37bc2e.svg",revision:null},{url:"/static/img/ag.56074d55.svg",revision:null},{url:"/static/img/ai.70eefdc0.svg",revision:null},{url:"/static/img/ai.893d1179.svg",revision:null},{url:"/static/img/al.b16acdb2.svg",revision:null},{url:"/static/img/al.e0864b5d.svg",revision:null},{url:"/static/img/am.00f0fec4.svg",revision:null},{url:"/static/img/am.a566904f.svg",revision:null},{url:"/static/img/ao.3df23f21.svg",revision:null},{url:"/static/img/ao.c0c32201.svg",revision:null},{url:"/static/img/aq.1b8c45a6.svg",revision:null},{url:"/static/img/aq.aa242c4a.svg",revision:null},{url:"/static/img/ar.22a3116e.svg",revision:null},{url:"/static/img/ar.d3238270.svg",revision:null},{url:"/static/img/as.10ed1a23.svg",revision:null},{url:"/static/img/as.4a330654.svg",revision:null},{url:"/static/img/at.02a64279.svg",revision:null},{url:"/static/img/at.94cde74c.svg",revision:null},{url:"/static/img/au.cc65fc07.svg",revision:null},{url:"/static/img/au.dbcdef2c.svg",revision:null},{url:"/static/img/aw.abbad4ac.svg",revision:null},{url:"/static/img/aw.be4540eb.svg",revision:null},{url:"/static/img/ax.371c7af2.svg",revision:null},{url:"/static/img/ax.91eea523.svg",revision:null},{url:"/static/img/az.0e2f1d1a.svg",revision:null},{url:"/static/img/az.f399f1c8.svg",revision:null},{url:"/static/img/ba.032070d4.svg",revision:null},{url:"/static/img/ba.e167b08f.svg",revision:null},{url:"/static/img/bb.23a15e67.svg",revision:null},{url:"/static/img/bb.b800513b.svg",revision:null},{url:"/static/img/bd.c1abcb00.svg",revision:null},{url:"/static/img/bd.c4a5f0e2.svg",revision:null},{url:"/static/img/be.29774a37.svg",revision:null},{url:"/static/img/be.3eb14701.svg",revision:null},{url:"/static/img/bf.2334e919.svg",revision:null},{url:"/static/img/bf.4ffd5dc6.svg",revision:null},{url:"/static/img/bg.700f100c.svg",revision:null},{url:"/static/img/bg.d0a49130.svg",revision:null},{url:"/static/img/bh.2a884f6c.svg",revision:null},{url:"/static/img/bh.3968dfe0.svg",revision:null},{url:"/static/img/bi.211d0f9e.svg",revision:null},{url:"/static/img/bi.ae3bb248.svg",revision:null},{url:"/static/img/bj.2cdc8a62.svg",revision:null},{url:"/static/img/bj.aba95ad2.svg",revision:null},{url:"/static/img/bl.04966866.svg",revision:null},{url:"/static/img/bl.3e69e968.svg",revision:null},{url:"/static/img/bm.e6903c8e.svg",revision:null},{url:"/static/img/bm.e69e40c4.svg",revision:null},{url:"/static/img/bn.07911e0c.svg",revision:null},{url:"/static/img/bn.4d91734a.svg",revision:null},{url:"/static/img/bo.03595499.svg",revision:null},{url:"/static/img/bo.9c1d9ef8.svg",revision:null},{url:"/static/img/bq.747d8177.svg",revision:null},{url:"/static/img/bq.b9355bec.svg",revision:null},{url:"/static/img/br.058a5086.svg",revision:null},{url:"/static/img/br.fe030c1c.svg",revision:null},{url:"/static/img/bs.d228cbb2.svg",revision:null},{url:"/static/img/bs.ef0a29ed.svg",revision:null},{url:"/static/img/bt.3f8ecb9b.svg",revision:null},{url:"/static/img/bt.fc241981.svg",revision:null},{url:"/static/img/bv.5503f03a.svg",revision:null},{url:"/static/img/bv.7f7cd26f.svg",revision:null},{url:"/static/img/bw.494aae64.svg",revision:null},{url:"/static/img/bw.b767df8c.svg",revision:null},{url:"/static/img/by.78d2c3c9.svg",revision:null},{url:"/static/img/by.fba98c48.svg",revision:null},{url:"/static/img/bz.14c3376a.svg",revision:null},{url:"/static/img/bz.5e0ef548.svg",revision:null},{url:"/static/img/ca.163ac200.svg",revision:null},{url:"/static/img/ca.a2ab234d.svg",revision:null},{url:"/static/img/cc.51960f85.svg",revision:null},{url:"/static/img/cc.813adff8.svg",revision:null},{url:"/static/img/cd.39186ec2.svg",revision:null},{url:"/static/img/cd.b4bd46ee.svg",revision:null},{url:"/static/img/cf.b5702729.svg",revision:null},{url:"/static/img/cf.fe1120e9.svg",revision:null},{url:"/static/img/cg.00603842.svg",revision:null},{url:"/static/img/cg.12414c99.svg",revision:null},{url:"/static/img/ch.7376c9c3.svg",revision:null},{url:"/static/img/ch.a558d859.svg",revision:null},{url:"/static/img/ci.1251a8e3.svg",revision:null},{url:"/static/img/ci.425a24c2.svg",revision:null},{url:"/static/img/ck.4e83dd3e.svg",revision:null},{url:"/static/img/ck.6303aa5b.svg",revision:null},{url:"/static/img/cl.0917a91e.svg",revision:null},{url:"/static/img/cl.b5974a35.svg",revision:null},{url:"/static/img/cm.253adb39.svg",revision:null},{url:"/static/img/cm.853e2843.svg",revision:null},{url:"/static/img/cn.38f63e1e.svg",revision:null},{url:"/static/img/cn.e1b166eb.svg",revision:null},{url:"/static/img/co.33e249d8.svg",revision:null},{url:"/static/img/co.b5cbc817.svg",revision:null},{url:"/static/img/cr.2e572846.svg",revision:null},{url:"/static/img/cr.336eb7d3.svg",revision:null},{url:"/static/img/cu.c2a6f0ed.svg",revision:null},{url:"/static/img/cu.d6e33f19.svg",revision:null},{url:"/static/img/cv.5ea64968.svg",revision:null},{url:"/static/img/cv.b3ab83f5.svg",revision:null},{url:"/static/img/cw.0e14b0b7.svg",revision:null},{url:"/static/img/cw.9b9b7ed5.svg",revision:null},{url:"/static/img/cx.da5de6d2.svg",revision:null},{url:"/static/img/cx.e04e07e8.svg",revision:null},{url:"/static/img/cy.834e6240.svg",revision:null},{url:"/static/img/cy.bfcfd736.svg",revision:null},{url:"/static/img/cz.aa114964.svg",revision:null},{url:"/static/img/cz.b5f98a6b.svg",revision:null},{url:"/static/img/dashboard-bg-light.06da6eab.jpg",revision:null},{url:"/static/img/de.8e159e6e.svg",revision:null},{url:"/static/img/de.b827ac51.svg",revision:null},{url:"/static/img/dj.4197a18a.svg",revision:null},{url:"/static/img/dj.925748d5.svg",revision:null},{url:"/static/img/dk.3ca1caed.svg",revision:null},{url:"/static/img/dk.a867eeef.svg",revision:null},{url:"/static/img/dm.7ddb00ac.svg",revision:null},{url:"/static/img/dm.bca6d70c.svg",revision:null},{url:"/static/img/do.81097daa.svg",revision:null},{url:"/static/img/do.954f0f3e.svg",revision:null},{url:"/static/img/dz.76d47b01.svg",revision:null},{url:"/static/img/dz.b7e2fbce.svg",revision:null},{url:"/static/img/ec.0029f514.svg",revision:null},{url:"/static/img/ec.5f387e2f.svg",revision:null},{url:"/static/img/ee.1b4839e0.svg",revision:null},{url:"/static/img/ee.828384a8.svg",revision:null},{url:"/static/img/eg.38443fa6.svg",revision:null},{url:"/static/img/eg.5756a758.svg",revision:null},{url:"/static/img/eh.82bd1c7b.svg",revision:null},{url:"/static/img/eh.f8d7b64f.svg",revision:null},{url:"/static/img/er.bf5b134b.svg",revision:null},{url:"/static/img/er.e932abe1.svg",revision:null},{url:"/static/img/es-ct.64a68954.svg",revision:null},{url:"/static/img/es-ct.69469f50.svg",revision:null},{url:"/static/img/es.7dd46df0.svg",revision:null},{url:"/static/img/es.de5915e5.svg",revision:null},{url:"/static/img/et.82e8eb21.svg",revision:null},{url:"/static/img/et.a998a1b2.svg",revision:null},{url:"/static/img/eu.4c6e130f.svg",revision:null},{url:"/static/img/eu.aba724b1.svg",revision:null},{url:"/static/img/fi.0cd85b78.svg",revision:null},{url:"/static/img/fi.3be6b378.svg",revision:null},{url:"/static/img/fj.ac9c916f.svg",revision:null},{url:"/static/img/fj.e8d3e00b.svg",revision:null},{url:"/static/img/fk.af0350f8.svg",revision:null},{url:"/static/img/fk.db55fa14.svg",revision:null},{url:"/static/img/fm.3491efc7.svg",revision:null},{url:"/static/img/fm.78d44caa.svg",revision:null},{url:"/static/img/fo.1da81e3a.svg",revision:null},{url:"/static/img/fo.72949ad1.svg",revision:null},{url:"/static/img/fr.3565b8f4.svg",revision:null},{url:"/static/img/fr.9cb70285.svg",revision:null},{url:"/static/img/ga.3e474381.svg",revision:null},{url:"/static/img/ga.59f7d865.svg",revision:null},{url:"/static/img/gb-eng.0fac6e79.svg",revision:null},{url:"/static/img/gb-eng.513dcf1b.svg",revision:null},{url:"/static/img/gb-nir.2b7d2c3a.svg",revision:null},{url:"/static/img/gb-nir.f59817d6.svg",revision:null},{url:"/static/img/gb-sct.f5001e5d.svg",revision:null},{url:"/static/img/gb-sct.fee55173.svg",revision:null},{url:"/static/img/gb-wls.13481560.svg",revision:null},{url:"/static/img/gb-wls.95b2cfab.svg",revision:null},{url:"/static/img/gb.2aafb374.svg",revision:null},{url:"/static/img/gb.7a456bb2.svg",revision:null},{url:"/static/img/gd.04ea09b7.svg",revision:null},{url:"/static/img/gd.60b96978.svg",revision:null},{url:"/static/img/ge.b7b65b55.svg",revision:null},{url:"/static/img/ge.c7190912.svg",revision:null},{url:"/static/img/gf.531f9e07.svg",revision:null},{url:"/static/img/gf.90f438a3.svg",revision:null},{url:"/static/img/gg.3aebc3ce.svg",revision:null},{url:"/static/img/gg.65174039.svg",revision:null},{url:"/static/img/gh.af443995.svg",revision:null},{url:"/static/img/gh.f2b6baac.svg",revision:null},{url:"/static/img/gi.302c2506.svg",revision:null},{url:"/static/img/gi.7beea6ed.svg",revision:null},{url:"/static/img/gl.551d0783.svg",revision:null},{url:"/static/img/gl.6a5c17b0.svg",revision:null},{url:"/static/img/gm.0e00e9d4.svg",revision:null},{url:"/static/img/gm.1724dc37.svg",revision:null},{url:"/static/img/gn.54a75b28.svg",revision:null},{url:"/static/img/gn.7c96520b.svg",revision:null},{url:"/static/img/gp.4327060f.svg",revision:null},{url:"/static/img/gp.f8adbf5c.svg",revision:null},{url:"/static/img/gq.b1679302.svg",revision:null},{url:"/static/img/gq.bd7daf33.svg",revision:null},{url:"/static/img/gr.07bedadf.svg",revision:null},{url:"/static/img/gr.25dd3287.svg",revision:null},{url:"/static/img/gs.60368968.svg",revision:null},{url:"/static/img/gs.b2836676.svg",revision:null},{url:"/static/img/gt.1a24ed67.svg",revision:null},{url:"/static/img/gt.825f7286.svg",revision:null},{url:"/static/img/gu.05f0ab85.svg",revision:null},{url:"/static/img/gu.19b114eb.svg",revision:null},{url:"/static/img/gw.bcd1eddb.svg",revision:null},{url:"/static/img/gw.c97f3f94.svg",revision:null},{url:"/static/img/gy.6327f72a.svg",revision:null},{url:"/static/img/gy.e11d0234.svg",revision:null},{url:"/static/img/hk.b199a9ee.svg",revision:null},{url:"/static/img/hk.c72bba0e.svg",revision:null},{url:"/static/img/hm.4aa61657.svg",revision:null},{url:"/static/img/hm.d4b3d393.svg",revision:null},{url:"/static/img/hn.08ad78b2.svg",revision:null},{url:"/static/img/hn.44cee191.svg",revision:null},{url:"/static/img/hr.078b1bf9.svg",revision:null},{url:"/static/img/hr.1f4e28b8.svg",revision:null},{url:"/static/img/ht.6943447c.svg",revision:null},{url:"/static/img/ht.7ca68737.svg",revision:null},{url:"/static/img/hu.692e97ca.svg",revision:null},{url:"/static/img/hu.b10d3f8e.svg",revision:null},{url:"/static/img/id.94464e47.svg",revision:null},{url:"/static/img/id.a05dc04c.svg",revision:null},{url:"/static/img/ie.5154112a.svg",revision:null},{url:"/static/img/ie.e23b25d1.svg",revision:null},{url:"/static/img/il.150f4c5f.svg",revision:null},{url:"/static/img/il.e02a66d3.svg",revision:null},{url:"/static/img/im.25166c91.svg",revision:null},{url:"/static/img/im.942419c5.svg",revision:null},{url:"/static/img/in.954929a0.svg",revision:null},{url:"/static/img/in.bd0d4f19.svg",revision:null},{url:"/static/img/io.a59923ab.svg",revision:null},{url:"/static/img/io.fa003484.svg",revision:null},{url:"/static/img/iq.1232a5c2.svg",revision:null},{url:"/static/img/iq.9a48d678.svg",revision:null},{url:"/static/img/ir.1ed24953.svg",revision:null},{url:"/static/img/ir.bc7ae9e1.svg",revision:null},{url:"/static/img/is.cad57f19.svg",revision:null},{url:"/static/img/is.eea59326.svg",revision:null},{url:"/static/img/it.039b4527.svg",revision:null},{url:"/static/img/it.e8516fc7.svg",revision:null},{url:"/static/img/je.1684dacc.svg",revision:null},{url:"/static/img/je.3ed72a25.svg",revision:null},{url:"/static/img/jellyfin.7b53a541.svg",revision:null},{url:"/static/img/jm.2357530e.svg",revision:null},{url:"/static/img/jm.479f30fe.svg",revision:null},{url:"/static/img/jo.06fbaa2c.svg",revision:null},{url:"/static/img/jo.7ac45a65.svg",revision:null},{url:"/static/img/jp.1795778c.svg",revision:null},{url:"/static/img/jp.b6063838.svg",revision:null},{url:"/static/img/ke.6dbfffd5.svg",revision:null},{url:"/static/img/ke.769bb975.svg",revision:null},{url:"/static/img/kg.96c12490.svg",revision:null},{url:"/static/img/kg.daded53c.svg",revision:null},{url:"/static/img/kh.8eeb1634.svg",revision:null},{url:"/static/img/kh.b10339d6.svg",revision:null},{url:"/static/img/ki.033ff9ce.svg",revision:null},{url:"/static/img/ki.89e43a21.svg",revision:null},{url:"/static/img/km.1e3bd5fe.svg",revision:null},{url:"/static/img/km.3ffb0228.svg",revision:null},{url:"/static/img/kn.0c16fe68.svg",revision:null},{url:"/static/img/kn.8f2e7b29.svg",revision:null},{url:"/static/img/kodi.d18f8d23.svg",revision:null},{url:"/static/img/kp.0f5253d8.svg",revision:null},{url:"/static/img/kp.f4ff9e76.svg",revision:null},{url:"/static/img/kr.0dc8b972.svg",revision:null},{url:"/static/img/kr.0f5e1116.svg",revision:null},{url:"/static/img/kw.3b4f3ea3.svg",revision:null},{url:"/static/img/kw.830d3755.svg",revision:null},{url:"/static/img/ky.be81d90b.svg",revision:null},{url:"/static/img/ky.e3b76b32.svg",revision:null},{url:"/static/img/kz.32ac1036.svg",revision:null},{url:"/static/img/kz.579ac0f9.svg",revision:null},{url:"/static/img/la.e583f8ec.svg",revision:null},{url:"/static/img/la.f71017ef.svg",revision:null},{url:"/static/img/lb.8eea508a.svg",revision:null},{url:"/static/img/lb.bdbeb8f1.svg",revision:null},{url:"/static/img/lc.25f644a6.svg",revision:null},{url:"/static/img/lc.68bd77ae.svg",revision:null},{url:"/static/img/li.8dc1ed79.svg",revision:null},{url:"/static/img/li.d7e2a871.svg",revision:null},{url:"/static/img/lk.42c41c61.svg",revision:null},{url:"/static/img/lk.e52240d6.svg",revision:null},{url:"/static/img/lr.5b84ff00.svg",revision:null},{url:"/static/img/lr.9a67cd3d.svg",revision:null},{url:"/static/img/ls.6d444cae.svg",revision:null},{url:"/static/img/ls.fe1da403.svg",revision:null},{url:"/static/img/lt.03a2e8c1.svg",revision:null},{url:"/static/img/lt.b57ea2a8.svg",revision:null},{url:"/static/img/lu.93878a1b.svg",revision:null},{url:"/static/img/lu.e3bdc6d3.svg",revision:null},{url:"/static/img/lv.1853e3a0.svg",revision:null},{url:"/static/img/lv.679c099e.svg",revision:null},{url:"/static/img/ly.05f8732e.svg",revision:null},{url:"/static/img/ly.b9e750ff.svg",revision:null},{url:"/static/img/ma.65053fc4.svg",revision:null},{url:"/static/img/ma.88ada30c.svg",revision:null},{url:"/static/img/mc.2c03ea5c.svg",revision:null},{url:"/static/img/mc.89b532e8.svg",revision:null},{url:"/static/img/md.646818c3.svg",revision:null},{url:"/static/img/md.a56562ee.svg",revision:null},{url:"/static/img/me.2e71b778.svg",revision:null},{url:"/static/img/me.f05548f2.svg",revision:null},{url:"/static/img/mf.70d09a4a.svg",revision:null},{url:"/static/img/mf.7da6b3d2.svg",revision:null},{url:"/static/img/mg.09ca17b2.svg",revision:null},{url:"/static/img/mg.b3fff4a6.svg",revision:null},{url:"/static/img/mh.3fd69bb2.svg",revision:null},{url:"/static/img/mh.f6cbc774.svg",revision:null},{url:"/static/img/mk.4234a248.svg",revision:null},{url:"/static/img/mk.e5412079.svg",revision:null},{url:"/static/img/ml.3fad079e.svg",revision:null},{url:"/static/img/ml.4f0dba9e.svg",revision:null},{url:"/static/img/mm.8ac1f094.svg",revision:null},{url:"/static/img/mm.adaa2111.svg",revision:null},{url:"/static/img/mn.78547af0.svg",revision:null},{url:"/static/img/mn.a4bcb0e6.svg",revision:null},{url:"/static/img/mo.2f0d2c15.svg",revision:null},{url:"/static/img/mo.c8198565.svg",revision:null},{url:"/static/img/mp.2acb5506.svg",revision:null},{url:"/static/img/mp.eeeefff6.svg",revision:null},{url:"/static/img/mq.145a7657.svg",revision:null},{url:"/static/img/mq.bb36a8fc.svg",revision:null},{url:"/static/img/mr.dd34eae8.svg",revision:null},{url:"/static/img/mr.e91e06ea.svg",revision:null},{url:"/static/img/ms.2025cd7d.svg",revision:null},{url:"/static/img/ms.b13001dc.svg",revision:null},{url:"/static/img/mt.b6f71c85.svg",revision:null},{url:"/static/img/mt.cff39ee0.svg",revision:null},{url:"/static/img/mu.51f71163.svg",revision:null},{url:"/static/img/mu.a926c232.svg",revision:null},{url:"/static/img/mv.2c8b92b5.svg",revision:null},{url:"/static/img/mv.ba4de4fd.svg",revision:null},{url:"/static/img/mw.0b005148.svg",revision:null},{url:"/static/img/mw.f704f4bb.svg",revision:null},{url:"/static/img/mx.1b615ec2.svg",revision:null},{url:"/static/img/mx.8a36b075.svg",revision:null},{url:"/static/img/my.4109ae71.svg",revision:null},{url:"/static/img/my.69c87fc5.svg",revision:null},{url:"/static/img/mz.1377650b.svg",revision:null},{url:"/static/img/mz.2c96acb1.svg",revision:null},{url:"/static/img/na.7adf4344.svg",revision:null},{url:"/static/img/na.e0503926.svg",revision:null},{url:"/static/img/nc.96fa6a4b.svg",revision:null},{url:"/static/img/nc.b5a5d41b.svg",revision:null},{url:"/static/img/ne.d11b82c6.svg",revision:null},{url:"/static/img/ne.d4fe4faa.svg",revision:null},{url:"/static/img/nf.1e8c700b.svg",revision:null},{url:"/static/img/nf.a7166b00.svg",revision:null},{url:"/static/img/ng.51059407.svg",revision:null},{url:"/static/img/ng.c3b42ad2.svg",revision:null},{url:"/static/img/ni.5b80bac0.svg",revision:null},{url:"/static/img/ni.cc7eb514.svg",revision:null},{url:"/static/img/nl.dd138444.svg",revision:null},{url:"/static/img/nl.e415f0e7.svg",revision:null},{url:"/static/img/no.26996afa.svg",revision:null},{url:"/static/img/no.70157234.svg",revision:null},{url:"/static/img/np.954177a0.svg",revision:null},{url:"/static/img/np.f7b8a5c3.svg",revision:null},{url:"/static/img/nr.2c66d218.svg",revision:null},{url:"/static/img/nr.a4f0e762.svg",revision:null},{url:"/static/img/nu.26551dc2.svg",revision:null},{url:"/static/img/nu.860bbe8a.svg",revision:null},{url:"/static/img/nz.38d0d690.svg",revision:null},{url:"/static/img/nz.c77ae58d.svg",revision:null},{url:"/static/img/om.3f5691ca.svg",revision:null},{url:"/static/img/om.ff034f9e.svg",revision:null},{url:"/static/img/pa.6dc8212a.svg",revision:null},{url:"/static/img/pa.acde3214.svg",revision:null},{url:"/static/img/pe.5a3b0bc5.svg",revision:null},{url:"/static/img/pe.5c2ced95.svg",revision:null},{url:"/static/img/pf.9f06082b.svg",revision:null},{url:"/static/img/pf.f6ae1bc8.svg",revision:null},{url:"/static/img/pg.26847b33.svg",revision:null},{url:"/static/img/pg.66c8dc3b.svg",revision:null},{url:"/static/img/ph.12e2b123.svg",revision:null},{url:"/static/img/ph.f215833e.svg",revision:null},{url:"/static/img/pk.0bbf58be.svg",revision:null},{url:"/static/img/pk.32b55f6f.svg",revision:null},{url:"/static/img/pl.03886843.svg",revision:null},{url:"/static/img/pl.a1350f0c.svg",revision:null},{url:"/static/img/plex.7a4e22a6.svg",revision:null},{url:"/static/img/pm.7a6beab5.svg",revision:null},{url:"/static/img/pm.a5590fa3.svg",revision:null},{url:"/static/img/pn.00a9342b.svg",revision:null},{url:"/static/img/pn.715fd11d.svg",revision:null},{url:"/static/img/pr.391a48e2.svg",revision:null},{url:"/static/img/pr.b37cbdc4.svg",revision:null},{url:"/static/img/ps.1af72ed4.svg",revision:null},{url:"/static/img/ps.96bcac74.svg",revision:null},{url:"/static/img/pt.0703cc3a.svg",revision:null},{url:"/static/img/pt.351b87cb.svg",revision:null},{url:"/static/img/pw.17220ffb.svg",revision:null},{url:"/static/img/pw.6d8e7ce0.svg",revision:null},{url:"/static/img/py.25cc39e3.svg",revision:null},{url:"/static/img/py.c20318c9.svg",revision:null},{url:"/static/img/qa.7e695788.svg",revision:null},{url:"/static/img/qa.86452d7a.svg",revision:null},{url:"/static/img/re.b8140129.svg",revision:null},{url:"/static/img/re.cf143c2f.svg",revision:null},{url:"/static/img/ro.67f8501e.svg",revision:null},{url:"/static/img/ro.cab93784.svg",revision:null},{url:"/static/img/rs.23638d75.svg",revision:null},{url:"/static/img/rs.ae2e3422.svg",revision:null},{url:"/static/img/ru.ccd50623.svg",revision:null},{url:"/static/img/ru.edd8b008.svg",revision:null},{url:"/static/img/rw.87d5d899.svg",revision:null},{url:"/static/img/rw.d118aacd.svg",revision:null},{url:"/static/img/sa.5bfbe72b.svg",revision:null},{url:"/static/img/sa.f0a8997b.svg",revision:null},{url:"/static/img/sb.1c406073.svg",revision:null},{url:"/static/img/sb.b0db5b0a.svg",revision:null},{url:"/static/img/sc.0452f14c.svg",revision:null},{url:"/static/img/sc.cdc20672.svg",revision:null},{url:"/static/img/sd.0e619868.svg",revision:null},{url:"/static/img/sd.da3b68ee.svg",revision:null},{url:"/static/img/se.7e499d82.svg",revision:null},{url:"/static/img/se.7ec71700.svg",revision:null},{url:"/static/img/sg.4f0e8eff.svg",revision:null},{url:"/static/img/sg.8a63b009.svg",revision:null},{url:"/static/img/sh.46e2588d.svg",revision:null},{url:"/static/img/sh.681f8fff.svg",revision:null},{url:"/static/img/si.2a428364.svg",revision:null},{url:"/static/img/si.d9d425c0.svg",revision:null},{url:"/static/img/sj.638e6522.svg",revision:null},{url:"/static/img/sj.92c583b8.svg",revision:null},{url:"/static/img/sk.7998d1f5.svg",revision:null},{url:"/static/img/sk.93c91c0b.svg",revision:null},{url:"/static/img/sl.d8378c47.svg",revision:null},{url:"/static/img/sl.eb9dda3f.svg",revision:null},{url:"/static/img/sm.0ba901f4.svg",revision:null},{url:"/static/img/sm.5e2fc188.svg",revision:null},{url:"/static/img/sn.4247b831.svg",revision:null},{url:"/static/img/sn.98923b55.svg",revision:null},{url:"/static/img/so.2d18a203.svg",revision:null},{url:"/static/img/so.45f08b28.svg",revision:null},{url:"/static/img/sr.cb178d98.svg",revision:null},{url:"/static/img/sr.d66c1240.svg",revision:null},{url:"/static/img/ss.caedfdf2.svg",revision:null},{url:"/static/img/ss.db181f81.svg",revision:null},{url:"/static/img/st.a70042c6.svg",revision:null},{url:"/static/img/st.ecc4827f.svg",revision:null},{url:"/static/img/sv.9501935a.svg",revision:null},{url:"/static/img/sv.f67839a6.svg",revision:null},{url:"/static/img/sx.77e864f0.svg",revision:null},{url:"/static/img/sx.c0e6297a.svg",revision:null},{url:"/static/img/sy.2b3eac89.svg",revision:null},{url:"/static/img/sy.7fe894df.svg",revision:null},{url:"/static/img/sz.70b6fc50.svg",revision:null},{url:"/static/img/sz.eb01cd9f.svg",revision:null},{url:"/static/img/tc.30ccd48e.svg",revision:null},{url:"/static/img/tc.651466dd.svg",revision:null},{url:"/static/img/td.5d622e26.svg",revision:null},{url:"/static/img/td.f1319408.svg",revision:null},{url:"/static/img/tf.27cbe00b.svg",revision:null},{url:"/static/img/tf.a1757237.svg",revision:null},{url:"/static/img/tg.b492a751.svg",revision:null},{url:"/static/img/tg.d04f874c.svg",revision:null},{url:"/static/img/th.79b63a8a.svg",revision:null},{url:"/static/img/th.b8e24edb.svg",revision:null},{url:"/static/img/tj.b7dafe8d.svg",revision:null},{url:"/static/img/tj.d3a42312.svg",revision:null},{url:"/static/img/tk.6c1f520c.svg",revision:null},{url:"/static/img/tk.f87f794b.svg",revision:null},{url:"/static/img/tl.85904d79.svg",revision:null},{url:"/static/img/tl.ca9af3c0.svg",revision:null},{url:"/static/img/tm.762df128.svg",revision:null},{url:"/static/img/tm.e467552c.svg",revision:null},{url:"/static/img/tn.cc3ab493.svg",revision:null},{url:"/static/img/tn.ff4c5190.svg",revision:null},{url:"/static/img/to.8dd22284.svg",revision:null},{url:"/static/img/to.9748a967.svg",revision:null},{url:"/static/img/tr.87e40d5c.svg",revision:null},{url:"/static/img/tr.fc8c91dd.svg",revision:null},{url:"/static/img/tt.4acf6cc2.svg",revision:null},{url:"/static/img/tt.5a459e81.svg",revision:null},{url:"/static/img/tv.9717b553.svg",revision:null},{url:"/static/img/tv.a8ff4939.svg",revision:null},{url:"/static/img/tw.45c8a106.svg",revision:null},{url:"/static/img/tw.c0cf9ea7.svg",revision:null},{url:"/static/img/tz.1abfbb38.svg",revision:null},{url:"/static/img/tz.c27fd405.svg",revision:null},{url:"/static/img/ua.04fa0e67.svg",revision:null},{url:"/static/img/ua.63d75c84.svg",revision:null},{url:"/static/img/ug.5ac71e98.svg",revision:null},{url:"/static/img/ug.5ae165a2.svg",revision:null},{url:"/static/img/um.582dd57b.svg",revision:null},{url:"/static/img/um.b38f913c.svg",revision:null},{url:"/static/img/un.2df110d6.svg",revision:null},{url:"/static/img/un.58a4a02a.svg",revision:null},{url:"/static/img/us.6c459052.svg",revision:null},{url:"/static/img/us.99e04236.svg",revision:null},{url:"/static/img/uy.69cf8938.svg",revision:null},{url:"/static/img/uy.b70ac310.svg",revision:null},{url:"/static/img/uz.7f8823a2.svg",revision:null},{url:"/static/img/uz.d53abc35.svg",revision:null},{url:"/static/img/va.7efb8ba6.svg",revision:null},{url:"/static/img/va.abcb42e8.svg",revision:null},{url:"/static/img/vc.37cf5ba1.svg",revision:null},{url:"/static/img/vc.3e4ac6d4.svg",revision:null},{url:"/static/img/ve.4cd0e3ed.svg",revision:null},{url:"/static/img/ve.9cd63506.svg",revision:null},{url:"/static/img/vg.025b8b6a.svg",revision:null},{url:"/static/img/vg.ae3b6f7e.svg",revision:null},{url:"/static/img/vi.293e6f1c.svg",revision:null},{url:"/static/img/vi.f920eec7.svg",revision:null},{url:"/static/img/vn.11dd1cf6.svg",revision:null},{url:"/static/img/vn.9ec4ca4d.svg",revision:null},{url:"/static/img/vu.5d2d7643.svg",revision:null},{url:"/static/img/vu.b7a8d91a.svg",revision:null},{url:"/static/img/wf.69c77016.svg",revision:null},{url:"/static/img/wf.9ca6f4bc.svg",revision:null},{url:"/static/img/ws.15c7a17c.svg",revision:null},{url:"/static/img/ws.d2e19e5a.svg",revision:null},{url:"/static/img/xk.16b6bb85.svg",revision:null},{url:"/static/img/xk.ca7843be.svg",revision:null},{url:"/static/img/ye.0b3f3c76.svg",revision:null},{url:"/static/img/ye.bb567731.svg",revision:null},{url:"/static/img/yt.332bd5d3.svg",revision:null},{url:"/static/img/yt.c33641ca.svg",revision:null},{url:"/static/img/za.2fa94205.svg",revision:null},{url:"/static/img/za.42e033a9.svg",revision:null},{url:"/static/img/zm.92477cab.svg",revision:null},{url:"/static/img/zm.ce5363b7.svg",revision:null},{url:"/static/img/zw.6a535c1e.svg",revision:null},{url:"/static/img/zw.f488cb8a.svg",revision:null},{url:"/static/js/1196.f4c25ec1.js",revision:null},{url:"/static/js/1595.cf573de8.js",revision:null},{url:"/static/js/1767.25bd60ff.js",revision:null},{url:"/static/js/1798.2ea76630.js",revision:null},{url:"/static/js/1818.d8f79120.js",revision:null},{url:"/static/js/1938.1dc95872.js",revision:null},{url:"/static/js/201.7a3e40e3.js",revision:null},{url:"/static/js/2346.9a487752.js",revision:null},{url:"/static/js/2362.620095dd.js",revision:null},{url:"/static/js/2466.633bb83f.js",revision:null},{url:"/static/js/2790.4b108fb8.js",revision:null},{url:"/static/js/2806.e32037e8.js",revision:null},{url:"/static/js/2820.07ee3664.js",revision:null},{url:"/static/js/3194.256c2da8.js",revision:null},{url:"/static/js/3249.a2010c2d.js",revision:null},{url:"/static/js/3303.028580a6.js",revision:null},{url:"/static/js/345.8d14f37b.js",revision:null},{url:"/static/js/346.647c3d99.js",revision:null},{url:"/static/js/3710.05c41d28.js",revision:null},{url:"/static/js/3724.a557791e.js",revision:null},{url:"/static/js/4118.eb9d25ca.js",revision:null},{url:"/static/js/4196.f85ff63e.js",revision:null},{url:"/static/js/4548.75a2e6f8.js",revision:null},{url:"/static/js/4848.ca77e67b.js",revision:null},{url:"/static/js/5111.fbd25a85.js",revision:null},{url:"/static/js/5157.f2273a80.js",revision:null},{url:"/static/js/5199.03545ba6.js",revision:null},{url:"/static/js/5207.b6625280.js",revision:null},{url:"/static/js/5465.e48f0738.js",revision:null},{url:"/static/js/5498.ddfaadb5.js",revision:null},{url:"/static/js/5824.d14935bb.js",revision:null},{url:"/static/js/5895.bc039cca.js",revision:null},{url:"/static/js/5924.a2919fe4.js",revision:null},{url:"/static/js/6003.c76e25e0.js",revision:null},{url:"/static/js/6013.5c85c65a.js",revision:null},{url:"/static/js/6027.e3b113ee.js",revision:null},{url:"/static/js/615.25a0ebcb.js",revision:null},{url:"/static/js/6164.2c2c3fba.js",revision:null},{url:"/static/js/6358.46615b4c.js",revision:null},{url:"/static/js/65.a4e6662a.js",revision:null},{url:"/static/js/6509.9ca36429.js",revision:null},{url:"/static/js/6739.14f222c1.js",revision:null},{url:"/static/js/675.496d097f.js",revision:null},{url:"/static/js/6815.a11912ee.js",revision:null},{url:"/static/js/6833.65afb884.js",revision:null},{url:"/static/js/6899.8c784f84.js",revision:null},{url:"/static/js/699.85a689b1.js",revision:null},{url:"/static/js/7141.e4e94ba3.js",revision:null},{url:"/static/js/7420.e53d9d48.js",revision:null},{url:"/static/js/7503.2c161f6d.js",revision:null},{url:"/static/js/767.32c26b46.js",revision:null},{url:"/static/js/8135.bb2ac7e3.js",revision:null},{url:"/static/js/8184.3768abaf.js",revision:null},{url:"/static/js/8444.d0d1fdb2.js",revision:null},{url:"/static/js/906.12e72134.js",revision:null},{url:"/static/js/9276.74343d50.js",revision:null},{url:"/static/js/9299.710819a1.js",revision:null},{url:"/static/js/9369.f7907b71.js",revision:null},{url:"/static/js/9387.194bcb15.js",revision:null},{url:"/static/js/9418.dfb3427c.js",revision:null},{url:"/static/js/9450.0b6d3902.js",revision:null},{url:"/static/js/9633.23b95cb0.js",revision:null},{url:"/static/js/9895.a39079d5.js",revision:null},{url:"/static/js/9978.f8ee0318.js",revision:null},{url:"/static/js/app.a0889d9d.js",revision:null},{url:"/static/js/chunk-vendors.0f6060b6.js",revision:null}],{})})); //# sourceMappingURL=service-worker.js.map diff --git a/platypush/backend/http/webapp/dist/service-worker.js.map b/platypush/backend/http/webapp/dist/service-worker.js.map index bfc2555c..cf9d7071 100644 --- a/platypush/backend/http/webapp/dist/service-worker.js.map +++ b/platypush/backend/http/webapp/dist/service-worker.js.map @@ -1 +1 @@ -{"version":3,"file":"service-worker.js","sources":["../../../../../../../../tmp/ff2082147addf97e99ca9c1132a3c9ee/service-worker.js"],"sourcesContent":["import {setCacheNameDetails as workbox_core_setCacheNameDetails} from '/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/workbox-core/setCacheNameDetails.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\nworkbox_core_setCacheNameDetails({prefix: \"platypush\"});\n\n\nself.addEventListener('message', (event) => {\n if (event.data && event.data.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\n\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"/fonts/Poppins.ttf\",\n \"revision\": \"d10d3ed96303653f936a08b38534f12e\"\n },\n {\n \"url\": \"/fonts/poppins.css\",\n \"revision\": \"413ee9a4d1879f6ae3d62a796644daad\"\n },\n {\n \"url\": \"/icons/jellyfin.svg\",\n \"revision\": \"1ec11e72ffc381f8797ddbebed2652c0\"\n },\n {\n \"url\": \"/icons/kodi.svg\",\n \"revision\": \"81ea5504989d4a0ed19ba6528c39e80f\"\n },\n {\n \"url\": \"/icons/openweathermap/black/01d.png\",\n \"revision\": \"4cf2907a1083c067828830bb007e2f34\"\n },\n {\n \"url\": \"/icons/openweathermap/black/01n.png\",\n \"revision\": \"df30375c6371005e2d238c36255afc8a\"\n },\n {\n \"url\": \"/icons/openweathermap/black/02d.png\",\n \"revision\": \"79a0adce79d78da203beeb7a6f4f510b\"\n },\n {\n \"url\": \"/icons/openweathermap/black/02n.png\",\n \"revision\": \"68d34b41357c2a3ea9479dae653b3617\"\n },\n {\n \"url\": \"/icons/openweathermap/black/03d.png\",\n \"revision\": \"5f13dba4164c437e2fbdc1d1ecaada4c\"\n },\n {\n \"url\": \"/icons/openweathermap/black/03n.png\",\n \"revision\": \"65c125cd51934e24f9e3321cc5448d0e\"\n },\n {\n \"url\": \"/icons/openweathermap/black/04d.png\",\n \"revision\": \"e75cd73c232806d7364ad7feae354074\"\n },\n {\n \"url\": \"/icons/openweathermap/black/04n.png\",\n \"revision\": \"e75cd73c232806d7364ad7feae354074\"\n },\n {\n \"url\": \"/icons/openweathermap/black/09d.png\",\n \"revision\": \"328b726310fb5762861859e33ac9066a\"\n },\n {\n \"url\": \"/icons/openweathermap/black/09n.png\",\n \"revision\": \"328b726310fb5762861859e33ac9066a\"\n },\n {\n \"url\": \"/icons/openweathermap/black/10d.png\",\n \"revision\": \"7dde329628506567faef30b9eb5c5f69\"\n },\n {\n \"url\": \"/icons/openweathermap/black/10n.png\",\n \"revision\": \"7dde329628506567faef30b9eb5c5f69\"\n },\n {\n \"url\": \"/icons/openweathermap/black/11d.png\",\n \"revision\": \"8f6a4b2446b42e8215195e195133e546\"\n },\n {\n \"url\": \"/icons/openweathermap/black/11n.png\",\n \"revision\": \"8f6a4b2446b42e8215195e195133e546\"\n },\n {\n \"url\": \"/icons/openweathermap/black/13d.png\",\n \"revision\": \"45bfce1d2ea7d16415848650eb5d2cb3\"\n },\n {\n \"url\": \"/icons/openweathermap/black/13n.png\",\n \"revision\": \"45bfce1d2ea7d16415848650eb5d2cb3\"\n },\n {\n \"url\": \"/icons/openweathermap/black/50d.png\",\n \"revision\": \"7a304f2b15fe4d9de351dabc44ff900d\"\n },\n {\n \"url\": \"/icons/openweathermap/black/50n.png\",\n \"revision\": \"7a304f2b15fe4d9de351dabc44ff900d\"\n },\n {\n \"url\": \"/icons/openweathermap/black/unknown.png\",\n \"revision\": \"c219891f5796e43d0f75f6525a8d6f33\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/01d.png\",\n \"revision\": \"4cf2907a1083c067828830bb007e2f34\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/01n.png\",\n \"revision\": \"df30375c6371005e2d238c36255afc8a\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/02d.png\",\n \"revision\": \"79a0adce79d78da203beeb7a6f4f510b\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/02n.png\",\n \"revision\": \"68d34b41357c2a3ea9479dae653b3617\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/03d.png\",\n \"revision\": \"5f13dba4164c437e2fbdc1d1ecaada4c\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/03n.png\",\n \"revision\": \"65c125cd51934e24f9e3321cc5448d0e\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/04d.png\",\n \"revision\": \"e75cd73c232806d7364ad7feae354074\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/04n.png\",\n \"revision\": \"e75cd73c232806d7364ad7feae354074\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/09d.png\",\n \"revision\": \"328b726310fb5762861859e33ac9066a\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/09n.png\",\n \"revision\": \"328b726310fb5762861859e33ac9066a\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/10d.png\",\n \"revision\": \"7dde329628506567faef30b9eb5c5f69\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/10n.png\",\n \"revision\": \"7dde329628506567faef30b9eb5c5f69\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/11d.png\",\n \"revision\": \"8f6a4b2446b42e8215195e195133e546\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/11n.png\",\n \"revision\": \"8f6a4b2446b42e8215195e195133e546\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/13d.png\",\n \"revision\": \"45bfce1d2ea7d16415848650eb5d2cb3\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/13n.png\",\n \"revision\": \"45bfce1d2ea7d16415848650eb5d2cb3\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/50d.png\",\n \"revision\": \"7a304f2b15fe4d9de351dabc44ff900d\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/50n.png\",\n \"revision\": \"7a304f2b15fe4d9de351dabc44ff900d\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/unknown.png\",\n \"revision\": \"c219891f5796e43d0f75f6525a8d6f33\"\n },\n {\n \"url\": \"/icons/openweathermap/light/01d.png\",\n \"revision\": \"00c2d0a72a69bf279bf8703cea9ce8d2\"\n },\n {\n \"url\": \"/icons/openweathermap/light/01n.png\",\n \"revision\": \"3a65e9f7ed5c54c6acd638a7bd26de25\"\n },\n {\n \"url\": \"/icons/openweathermap/light/02d.png\",\n \"revision\": \"63dab156e991be7e4174d1d6cd8c2321\"\n },\n {\n \"url\": \"/icons/openweathermap/light/02n.png\",\n \"revision\": \"7c64d1a1c5efdbe38e6b7e3b4f50f2c5\"\n },\n {\n \"url\": \"/icons/openweathermap/light/03d.png\",\n \"revision\": \"f609003793e658a60870587cd450fc6f\"\n },\n {\n \"url\": \"/icons/openweathermap/light/03n.png\",\n \"revision\": \"7e694b4317b3e9f2533db93969fcc3e8\"\n },\n {\n \"url\": \"/icons/openweathermap/light/04d.png\",\n \"revision\": \"098f9d40b1d5747996df9a720f160c81\"\n },\n {\n \"url\": \"/icons/openweathermap/light/04n.png\",\n \"revision\": \"098f9d40b1d5747996df9a720f160c81\"\n },\n {\n \"url\": \"/icons/openweathermap/light/09d.png\",\n \"revision\": \"c48a99b60e45690cdc702a2dc6694002\"\n },\n {\n \"url\": \"/icons/openweathermap/light/09n.png\",\n \"revision\": \"c48a99b60e45690cdc702a2dc6694002\"\n },\n {\n \"url\": \"/icons/openweathermap/light/10d.png\",\n \"revision\": \"2750daf3f0d811230591a415e42bddb2\"\n },\n {\n \"url\": \"/icons/openweathermap/light/10n.png\",\n \"revision\": \"2750daf3f0d811230591a415e42bddb2\"\n },\n {\n \"url\": \"/icons/openweathermap/light/11d.png\",\n \"revision\": \"7bd0501a7bfcf2675467df0c0788ffad\"\n },\n {\n \"url\": \"/icons/openweathermap/light/11n.png\",\n \"revision\": \"7bd0501a7bfcf2675467df0c0788ffad\"\n },\n {\n \"url\": \"/icons/openweathermap/light/13d.png\",\n \"revision\": \"4e11e697c6bafc8dd83c4dfc8ce47919\"\n },\n {\n \"url\": \"/icons/openweathermap/light/13n.png\",\n \"revision\": \"4e11e697c6bafc8dd83c4dfc8ce47919\"\n },\n {\n \"url\": \"/icons/openweathermap/light/50d.png\",\n \"revision\": \"9a0770f3adc7c4a27e131c04a739f735\"\n },\n {\n \"url\": \"/icons/openweathermap/light/50n.png\",\n \"revision\": \"9a0770f3adc7c4a27e131c04a739f735\"\n },\n {\n \"url\": \"/icons/openweathermap/light/unknown.png\",\n \"revision\": \"f14a44a1ecde49a5c6a396f8c1753263\"\n },\n {\n \"url\": \"/icons/openweathermap/white/01d.png\",\n \"revision\": \"00c2d0a72a69bf279bf8703cea9ce8d2\"\n },\n {\n \"url\": \"/icons/openweathermap/white/01n.png\",\n \"revision\": \"3a65e9f7ed5c54c6acd638a7bd26de25\"\n },\n {\n \"url\": \"/icons/openweathermap/white/02d.png\",\n \"revision\": \"63dab156e991be7e4174d1d6cd8c2321\"\n },\n {\n \"url\": \"/icons/openweathermap/white/02n.png\",\n \"revision\": \"7c64d1a1c5efdbe38e6b7e3b4f50f2c5\"\n },\n {\n \"url\": \"/icons/openweathermap/white/03d.png\",\n \"revision\": \"f609003793e658a60870587cd450fc6f\"\n },\n {\n \"url\": \"/icons/openweathermap/white/03n.png\",\n \"revision\": \"7e694b4317b3e9f2533db93969fcc3e8\"\n },\n {\n \"url\": \"/icons/openweathermap/white/04d.png\",\n \"revision\": \"098f9d40b1d5747996df9a720f160c81\"\n },\n {\n \"url\": \"/icons/openweathermap/white/04n.png\",\n \"revision\": \"098f9d40b1d5747996df9a720f160c81\"\n },\n {\n \"url\": \"/icons/openweathermap/white/09d.png\",\n \"revision\": \"c48a99b60e45690cdc702a2dc6694002\"\n },\n {\n \"url\": \"/icons/openweathermap/white/09n.png\",\n \"revision\": \"c48a99b60e45690cdc702a2dc6694002\"\n },\n {\n \"url\": \"/icons/openweathermap/white/10d.png\",\n \"revision\": \"2750daf3f0d811230591a415e42bddb2\"\n },\n {\n \"url\": \"/icons/openweathermap/white/10n.png\",\n \"revision\": \"2750daf3f0d811230591a415e42bddb2\"\n },\n {\n \"url\": \"/icons/openweathermap/white/11d.png\",\n \"revision\": \"7bd0501a7bfcf2675467df0c0788ffad\"\n },\n {\n \"url\": \"/icons/openweathermap/white/11n.png\",\n \"revision\": \"7bd0501a7bfcf2675467df0c0788ffad\"\n },\n {\n \"url\": \"/icons/openweathermap/white/13d.png\",\n \"revision\": \"4e11e697c6bafc8dd83c4dfc8ce47919\"\n },\n {\n \"url\": \"/icons/openweathermap/white/13n.png\",\n \"revision\": \"4e11e697c6bafc8dd83c4dfc8ce47919\"\n },\n {\n \"url\": \"/icons/openweathermap/white/50d.png\",\n \"revision\": \"9a0770f3adc7c4a27e131c04a739f735\"\n },\n {\n \"url\": \"/icons/openweathermap/white/50n.png\",\n \"revision\": \"9a0770f3adc7c4a27e131c04a739f735\"\n },\n {\n \"url\": \"/icons/openweathermap/white/unknown.png\",\n \"revision\": \"f14a44a1ecde49a5c6a396f8c1753263\"\n },\n {\n \"url\": \"/icons/plex.svg\",\n \"revision\": \"9923c5c80858a7da9d48c3ee77974e77\"\n },\n {\n \"url\": \"/icons/smartthings.png\",\n \"revision\": \"9306b6ca82efa85d58823615ff14b00f\"\n },\n {\n \"url\": \"/icons/z-wave.png\",\n \"revision\": \"3045e92627da521267db845b16da6028\"\n },\n {\n \"url\": \"/icons/zigbee.svg\",\n \"revision\": \"3e5f749af9e83ace5c12ff3aac6d4b88\"\n },\n {\n \"url\": \"/img/dashboard-bg-light.jpg\",\n \"revision\": \"f9ab2a6552509997ec0cbaeb47199eba\"\n },\n {\n \"url\": \"/img/logo.png\",\n \"revision\": \"98702e78dde598404826f6e9279e4ab3\"\n },\n {\n \"url\": \"/img/spinner.gif\",\n \"revision\": \"5572838d351b66bf6a3350b6d8d23cb8\"\n },\n {\n \"url\": \"/index.html\",\n \"revision\": \"950b41145f8fea3627c6c8e2e0d0cdb5\"\n },\n {\n \"url\": \"/manifest.json\",\n \"revision\": \"8a45dcffc3380b17da6ea17291b43e00\"\n },\n {\n \"url\": \"/static/css/1196.78925ff5.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/1300.180d2070.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/1767.f9545a14.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/1798.3a165bb4.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/1818.8db287b9.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/201.3ba92d09.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/2346.ed463bd2.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/2790.a0725ecc.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/2806.9c9d5a57.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/2989.22b025de.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/3194.a07dd4e2.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/3303.bfeafcb0.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/345.25d1c562.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/346.bec1b050.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/3490.fcf11255.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/3710.1112d8b7.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/3724.234438b4.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/4021.58663e3e.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/4196.539db457.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/4848.72a7d113.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/4981.c5c2f5dd.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/5193.47f020c5.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/5199.6ad0f775.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/5207.950597e1.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/5498.ef565a73.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/5824.8f1b2b15.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/5924.f0111959.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6003.fbbaf2b7.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6013.504d6c0b.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/615.6d3a8446.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6164.ea3fa7cb.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6358.1f06089f.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/65.ae3723d7.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6739.49b1f262.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/675.10cdb721.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6815.f1dc7909.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6833.28cb5e3d.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6899.c92d9d38.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/7141.4b3e6b00.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/7420.4bf56b11.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/7503.34698020.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/7782.a6a32303.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/8135.1460504e.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/8444.95911650.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/8589.2e68c420.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/906.a114eea0.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/9276.518b169b.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/9387.74d3b3a3.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/9418.9f2b9c3a.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/9450.fd9ed6f2.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/9575.1b22f65c.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/9978.b6585c35.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/app.0a781c41.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/chunk-vendors.0fcd36f0.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/fa-brands-400.7fa789ab.ttf\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/fa-brands-400.859fc388.woff2\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/fa-regular-400.2ffd018f.woff2\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/fa-regular-400.da02cb7e.ttf\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/fa-solid-900.3a463ec3.ttf\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/fa-solid-900.40ddefd7.woff2\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/lato-medium-italic.1996cc15.woff\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/lato-medium-italic.1e312dd9.woff2\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/lato-medium.13fcde4c.woff2\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/lato-medium.b41c3821.woff\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ad.cb33f69a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ad.fa8477e6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ae.a3f5e295.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ae.f06e0095.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/af.89591ab0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/af.8ca96393.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ag.4c37bc2e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ag.56074d55.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ai.70eefdc0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ai.893d1179.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/al.b16acdb2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/al.e0864b5d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/am.00f0fec4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/am.a566904f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ao.3df23f21.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ao.c0c32201.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/aq.1b8c45a6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/aq.aa242c4a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ar.22a3116e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ar.d3238270.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/as.10ed1a23.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/as.4a330654.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/at.02a64279.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/at.94cde74c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/au.cc65fc07.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/au.dbcdef2c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/aw.abbad4ac.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/aw.be4540eb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ax.371c7af2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ax.91eea523.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/az.0e2f1d1a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/az.f399f1c8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ba.032070d4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ba.e167b08f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bb.23a15e67.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bb.b800513b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bd.c1abcb00.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bd.c4a5f0e2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/be.29774a37.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/be.3eb14701.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bf.2334e919.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bf.4ffd5dc6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bg.700f100c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bg.d0a49130.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bh.2a884f6c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bh.3968dfe0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bi.211d0f9e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bi.ae3bb248.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bj.2cdc8a62.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bj.aba95ad2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bl.04966866.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bl.3e69e968.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bm.e6903c8e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bm.e69e40c4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bn.07911e0c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bn.4d91734a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bo.03595499.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bo.9c1d9ef8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bq.747d8177.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bq.b9355bec.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/br.058a5086.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/br.fe030c1c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bs.d228cbb2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bs.ef0a29ed.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bt.3f8ecb9b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bt.fc241981.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bv.5503f03a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bv.7f7cd26f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bw.494aae64.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bw.b767df8c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/by.78d2c3c9.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/by.fba98c48.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bz.14c3376a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bz.5e0ef548.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ca.163ac200.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ca.a2ab234d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cc.51960f85.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cc.813adff8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cd.39186ec2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cd.b4bd46ee.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cf.b5702729.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cf.fe1120e9.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cg.00603842.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cg.12414c99.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ch.7376c9c3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ch.a558d859.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ci.1251a8e3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ci.425a24c2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ck.4e83dd3e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ck.6303aa5b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cl.0917a91e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cl.b5974a35.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cm.253adb39.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cm.853e2843.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cn.38f63e1e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cn.e1b166eb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/co.33e249d8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/co.b5cbc817.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cr.2e572846.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cr.336eb7d3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cu.c2a6f0ed.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cu.d6e33f19.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cv.5ea64968.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cv.b3ab83f5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cw.0e14b0b7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cw.9b9b7ed5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cx.da5de6d2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cx.e04e07e8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cy.834e6240.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cy.bfcfd736.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cz.aa114964.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cz.b5f98a6b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dashboard-bg-light.06da6eab.jpg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/de.8e159e6e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/de.b827ac51.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dj.4197a18a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dj.925748d5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dk.3ca1caed.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dk.a867eeef.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dm.7ddb00ac.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dm.bca6d70c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/do.81097daa.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/do.954f0f3e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dz.76d47b01.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dz.b7e2fbce.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ec.0029f514.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ec.5f387e2f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ee.1b4839e0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ee.828384a8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/eg.38443fa6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/eg.5756a758.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/eh.82bd1c7b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/eh.f8d7b64f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/er.bf5b134b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/er.e932abe1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/es-ct.64a68954.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/es-ct.69469f50.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/es.7dd46df0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/es.de5915e5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/et.82e8eb21.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/et.a998a1b2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/eu.4c6e130f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/eu.aba724b1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fi.0cd85b78.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fi.3be6b378.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fj.ac9c916f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fj.e8d3e00b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fk.af0350f8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fk.db55fa14.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fm.3491efc7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fm.78d44caa.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fo.1da81e3a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fo.72949ad1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fr.3565b8f4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fr.9cb70285.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ga.3e474381.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ga.59f7d865.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-eng.0fac6e79.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-eng.513dcf1b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-nir.2b7d2c3a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-nir.f59817d6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-sct.f5001e5d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-sct.fee55173.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-wls.13481560.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-wls.95b2cfab.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb.2aafb374.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb.7a456bb2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gd.04ea09b7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gd.60b96978.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ge.b7b65b55.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ge.c7190912.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gf.531f9e07.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gf.90f438a3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gg.3aebc3ce.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gg.65174039.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gh.af443995.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gh.f2b6baac.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gi.302c2506.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gi.7beea6ed.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gl.551d0783.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gl.6a5c17b0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gm.0e00e9d4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gm.1724dc37.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gn.54a75b28.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gn.7c96520b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gp.4327060f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gp.f8adbf5c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gq.b1679302.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gq.bd7daf33.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gr.07bedadf.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gr.25dd3287.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gs.60368968.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gs.b2836676.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gt.1a24ed67.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gt.825f7286.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gu.05f0ab85.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gu.19b114eb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gw.bcd1eddb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gw.c97f3f94.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gy.6327f72a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gy.e11d0234.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hk.b199a9ee.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hk.c72bba0e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hm.4aa61657.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hm.d4b3d393.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hn.08ad78b2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hn.44cee191.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hr.078b1bf9.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hr.1f4e28b8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ht.6943447c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ht.7ca68737.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hu.692e97ca.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hu.b10d3f8e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/id.94464e47.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/id.a05dc04c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ie.5154112a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ie.e23b25d1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/il.150f4c5f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/il.e02a66d3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/im.25166c91.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/im.942419c5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/in.954929a0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/in.bd0d4f19.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/io.a59923ab.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/io.fa003484.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/iq.1232a5c2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/iq.9a48d678.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ir.1ed24953.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ir.bc7ae9e1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/is.cad57f19.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/is.eea59326.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/it.039b4527.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/it.e8516fc7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/je.1684dacc.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/je.3ed72a25.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/jellyfin.7b53a541.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/jm.2357530e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/jm.479f30fe.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/jo.06fbaa2c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/jo.7ac45a65.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/jp.1795778c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/jp.b6063838.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ke.6dbfffd5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ke.769bb975.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kg.96c12490.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kg.daded53c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kh.8eeb1634.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kh.b10339d6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ki.033ff9ce.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ki.89e43a21.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/km.1e3bd5fe.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/km.3ffb0228.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kn.0c16fe68.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kn.8f2e7b29.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kodi.d18f8d23.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kp.0f5253d8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kp.f4ff9e76.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kr.0dc8b972.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kr.0f5e1116.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kw.3b4f3ea3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kw.830d3755.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ky.be81d90b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ky.e3b76b32.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kz.32ac1036.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kz.579ac0f9.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/la.e583f8ec.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/la.f71017ef.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lb.8eea508a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lb.bdbeb8f1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lc.25f644a6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lc.68bd77ae.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/li.8dc1ed79.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/li.d7e2a871.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lk.42c41c61.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lk.e52240d6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lr.5b84ff00.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lr.9a67cd3d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ls.6d444cae.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ls.fe1da403.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lt.03a2e8c1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lt.b57ea2a8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lu.93878a1b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lu.e3bdc6d3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lv.1853e3a0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lv.679c099e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ly.05f8732e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ly.b9e750ff.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ma.65053fc4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ma.88ada30c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mc.2c03ea5c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mc.89b532e8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/md.646818c3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/md.a56562ee.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/me.2e71b778.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/me.f05548f2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mf.70d09a4a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mf.7da6b3d2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mg.09ca17b2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mg.b3fff4a6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mh.3fd69bb2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mh.f6cbc774.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mk.4234a248.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mk.e5412079.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ml.3fad079e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ml.4f0dba9e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mm.8ac1f094.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mm.adaa2111.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mn.78547af0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mn.a4bcb0e6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mo.2f0d2c15.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mo.c8198565.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mp.2acb5506.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mp.eeeefff6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mq.145a7657.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mq.bb36a8fc.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mr.dd34eae8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mr.e91e06ea.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ms.2025cd7d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ms.b13001dc.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mt.b6f71c85.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mt.cff39ee0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mu.51f71163.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mu.a926c232.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mv.2c8b92b5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mv.ba4de4fd.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mw.0b005148.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mw.f704f4bb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mx.1b615ec2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mx.8a36b075.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/my.4109ae71.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/my.69c87fc5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mz.1377650b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mz.2c96acb1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/na.7adf4344.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/na.e0503926.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nc.96fa6a4b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nc.b5a5d41b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ne.d11b82c6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ne.d4fe4faa.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nf.1e8c700b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nf.a7166b00.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ng.51059407.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ng.c3b42ad2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ni.5b80bac0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ni.cc7eb514.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nl.dd138444.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nl.e415f0e7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/no.26996afa.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/no.70157234.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/np.954177a0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/np.f7b8a5c3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nr.2c66d218.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nr.a4f0e762.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nu.26551dc2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nu.860bbe8a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nz.38d0d690.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nz.c77ae58d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/om.3f5691ca.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/om.ff034f9e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pa.6dc8212a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pa.acde3214.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pe.5a3b0bc5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pe.5c2ced95.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pf.9f06082b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pf.f6ae1bc8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pg.26847b33.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pg.66c8dc3b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ph.12e2b123.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ph.f215833e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pk.0bbf58be.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pk.32b55f6f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pl.03886843.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pl.a1350f0c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/plex.7a4e22a6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pm.7a6beab5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pm.a5590fa3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pn.00a9342b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pn.715fd11d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pr.391a48e2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pr.b37cbdc4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ps.1af72ed4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ps.96bcac74.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pt.0703cc3a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pt.351b87cb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pw.17220ffb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pw.6d8e7ce0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/py.25cc39e3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/py.c20318c9.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/qa.7e695788.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/qa.86452d7a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/re.b8140129.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/re.cf143c2f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ro.67f8501e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ro.cab93784.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/rs.23638d75.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/rs.ae2e3422.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ru.ccd50623.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ru.edd8b008.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/rw.87d5d899.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/rw.d118aacd.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sa.5bfbe72b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sa.f0a8997b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sb.1c406073.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sb.b0db5b0a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sc.0452f14c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sc.cdc20672.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sd.0e619868.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sd.da3b68ee.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/se.7e499d82.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/se.7ec71700.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sg.4f0e8eff.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sg.8a63b009.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sh.46e2588d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sh.681f8fff.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/si.2a428364.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/si.d9d425c0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sj.638e6522.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sj.92c583b8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sk.7998d1f5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sk.93c91c0b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sl.d8378c47.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sl.eb9dda3f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sm.0ba901f4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sm.5e2fc188.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sn.4247b831.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sn.98923b55.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/so.2d18a203.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/so.45f08b28.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sr.cb178d98.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sr.d66c1240.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ss.caedfdf2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ss.db181f81.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/st.a70042c6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/st.ecc4827f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sv.9501935a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sv.f67839a6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sx.77e864f0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sx.c0e6297a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sy.2b3eac89.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sy.7fe894df.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sz.70b6fc50.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sz.eb01cd9f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tc.30ccd48e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tc.651466dd.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/td.5d622e26.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/td.f1319408.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tf.27cbe00b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tf.a1757237.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tg.b492a751.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tg.d04f874c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/th.79b63a8a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/th.b8e24edb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tj.b7dafe8d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tj.d3a42312.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tk.6c1f520c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tk.f87f794b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tl.85904d79.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tl.ca9af3c0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tm.762df128.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tm.e467552c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tn.cc3ab493.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tn.ff4c5190.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/to.8dd22284.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/to.9748a967.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tr.87e40d5c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tr.fc8c91dd.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tt.4acf6cc2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tt.5a459e81.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tv.9717b553.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tv.a8ff4939.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tw.45c8a106.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tw.c0cf9ea7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tz.1abfbb38.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tz.c27fd405.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ua.04fa0e67.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ua.63d75c84.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ug.5ac71e98.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ug.5ae165a2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/um.582dd57b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/um.b38f913c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/un.2df110d6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/un.58a4a02a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/us.6c459052.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/us.99e04236.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/uy.69cf8938.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/uy.b70ac310.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/uz.7f8823a2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/uz.d53abc35.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/va.7efb8ba6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/va.abcb42e8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vc.37cf5ba1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vc.3e4ac6d4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ve.4cd0e3ed.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ve.9cd63506.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vg.025b8b6a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vg.ae3b6f7e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vi.293e6f1c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vi.f920eec7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vn.11dd1cf6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vn.9ec4ca4d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vu.5d2d7643.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vu.b7a8d91a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/wf.69c77016.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/wf.9ca6f4bc.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ws.15c7a17c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ws.d2e19e5a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/xk.16b6bb85.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/xk.ca7843be.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ye.0b3f3c76.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ye.bb567731.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/yt.332bd5d3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/yt.c33641ca.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/za.2fa94205.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/za.42e033a9.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/zm.92477cab.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/zm.ce5363b7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/zw.6a535c1e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/zw.f488cb8a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/1196.f4c25ec1.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/1595.cf573de8.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/1767.25bd60ff.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/1798.2ea76630.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/1818.d8f79120.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/1938.1dc95872.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/201.7a3e40e3.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/2346.9a487752.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/2362.620095dd.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/2466.633bb83f.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/2790.4b108fb8.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/2806.e32037e8.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/2820.07ee3664.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/3194.256c2da8.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/3249.a2010c2d.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/3303.028580a6.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/345.8d14f37b.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/346.647c3d99.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/3710.05c41d28.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/3724.a557791e.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/4196.f85ff63e.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/4548.c7642733.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/4848.ca77e67b.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5111.f606018d.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5157.f2273a80.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5193.1de6bb98.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5199.03545ba6.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5207.b6625280.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5498.ddfaadb5.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5528.10b051ba.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5824.d14935bb.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5895.bc039cca.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5924.a2919fe4.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6003.c76e25e0.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6013.5c85c65a.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6027.e3b113ee.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/615.25a0ebcb.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6164.2c2c3fba.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6358.46615b4c.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/65.a4e6662a.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6509.9ca36429.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6739.14f222c1.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/675.496d097f.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6815.a11912ee.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6833.65afb884.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6899.8c784f84.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/699.b7975861.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/7141.e4e94ba3.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/7420.e53d9d48.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/7503.2c161f6d.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/767.32c26b46.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/8135.bb2ac7e3.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/8184.c4135de2.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/8444.d0d1fdb2.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/906.12e72134.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9276.74343d50.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9299.710819a1.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9369.f7907b71.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9387.194bcb15.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9418.dfb3427c.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9450.0b6d3902.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9633.23b95cb0.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9895.16e6387b.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9978.f8ee0318.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/app.8e3d4fb1.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/chunk-vendors.0f6060b6.js\",\n \"revision\": null\n }\n], {});\n\n\n\n\n\n\n\n\n"],"names":["workbox_core_setCacheNameDetails","prefix","self","addEventListener","event","data","type","skipWaiting","workbox_precaching_precacheAndRoute","url","revision"],"mappings":"0nBAiBAA,EAAAA,oBAAiC,CAACC,OAAQ,cAG1CC,KAAKC,iBAAiB,WAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,aACN,IAWHC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,qBACKC,SAAA,oCAEd,CACED,IAAO,qBACKC,SAAA,oCAEd,CACED,IAAO,sBACKC,SAAA,oCAEd,CACED,IAAO,kBACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,0CACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,yCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,0CACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,0CACKC,SAAA,oCAEd,CACED,IAAO,kBACKC,SAAA,oCAEd,CACED,IAAO,yBACKC,SAAA,oCAEd,CACED,IAAO,oBACKC,SAAA,oCAEd,CACED,IAAO,oBACKC,SAAA,oCAEd,CACED,IAAO,8BACKC,SAAA,oCAEd,CACED,IAAO,gBACKC,SAAA,oCAEd,CACED,IAAO,mBACKC,SAAA,oCAEd,CACED,IAAO,cACKC,SAAA,oCAEd,CACED,IAAO,iBACKC,SAAA,oCAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,+BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,+BACKC,SAAA,MAEd,CACED,IAAO,+BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,+BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,+BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,+BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,+BACKC,SAAA,MAEd,CACED,IAAO,yCACKC,SAAA,MAEd,CACED,IAAO,2CACKC,SAAA,MAEd,CACED,IAAO,6CACKC,SAAA,MAEd,CACED,IAAO,8CACKC,SAAA,MAEd,CACED,IAAO,4CACKC,SAAA,MAEd,CACED,IAAO,0CACKC,SAAA,MAEd,CACED,IAAO,4CACKC,SAAA,MAEd,CACED,IAAO,iDACKC,SAAA,MAEd,CACED,IAAO,kDACKC,SAAA,MAEd,CACED,IAAO,2CACKC,SAAA,MAEd,CACED,IAAO,0CACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8CACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,iCACKC,SAAA,MAEd,CACED,IAAO,iCACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,oCACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,4BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,uCACKC,SAAA,OAEb,CAAA"} \ No newline at end of file +{"version":3,"file":"service-worker.js","sources":["../../../../../../../../tmp/dc3267589493c7e29bfc7e6b473acb7b/service-worker.js"],"sourcesContent":["import {setCacheNameDetails as workbox_core_setCacheNameDetails} from '/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/workbox-core/setCacheNameDetails.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\nworkbox_core_setCacheNameDetails({prefix: \"platypush\"});\n\n\nself.addEventListener('message', (event) => {\n if (event.data && event.data.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\n\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"/fonts/Poppins.ttf\",\n \"revision\": \"d10d3ed96303653f936a08b38534f12e\"\n },\n {\n \"url\": \"/fonts/poppins.css\",\n \"revision\": \"413ee9a4d1879f6ae3d62a796644daad\"\n },\n {\n \"url\": \"/icons/jellyfin.svg\",\n \"revision\": \"1ec11e72ffc381f8797ddbebed2652c0\"\n },\n {\n \"url\": \"/icons/kodi.svg\",\n \"revision\": \"81ea5504989d4a0ed19ba6528c39e80f\"\n },\n {\n \"url\": \"/icons/openweathermap/black/01d.png\",\n \"revision\": \"4cf2907a1083c067828830bb007e2f34\"\n },\n {\n \"url\": \"/icons/openweathermap/black/01n.png\",\n \"revision\": \"df30375c6371005e2d238c36255afc8a\"\n },\n {\n \"url\": \"/icons/openweathermap/black/02d.png\",\n \"revision\": \"79a0adce79d78da203beeb7a6f4f510b\"\n },\n {\n \"url\": \"/icons/openweathermap/black/02n.png\",\n \"revision\": \"68d34b41357c2a3ea9479dae653b3617\"\n },\n {\n \"url\": \"/icons/openweathermap/black/03d.png\",\n \"revision\": \"5f13dba4164c437e2fbdc1d1ecaada4c\"\n },\n {\n \"url\": \"/icons/openweathermap/black/03n.png\",\n \"revision\": \"65c125cd51934e24f9e3321cc5448d0e\"\n },\n {\n \"url\": \"/icons/openweathermap/black/04d.png\",\n \"revision\": \"e75cd73c232806d7364ad7feae354074\"\n },\n {\n \"url\": \"/icons/openweathermap/black/04n.png\",\n \"revision\": \"e75cd73c232806d7364ad7feae354074\"\n },\n {\n \"url\": \"/icons/openweathermap/black/09d.png\",\n \"revision\": \"328b726310fb5762861859e33ac9066a\"\n },\n {\n \"url\": \"/icons/openweathermap/black/09n.png\",\n \"revision\": \"328b726310fb5762861859e33ac9066a\"\n },\n {\n \"url\": \"/icons/openweathermap/black/10d.png\",\n \"revision\": \"7dde329628506567faef30b9eb5c5f69\"\n },\n {\n \"url\": \"/icons/openweathermap/black/10n.png\",\n \"revision\": \"7dde329628506567faef30b9eb5c5f69\"\n },\n {\n \"url\": \"/icons/openweathermap/black/11d.png\",\n \"revision\": \"8f6a4b2446b42e8215195e195133e546\"\n },\n {\n \"url\": \"/icons/openweathermap/black/11n.png\",\n \"revision\": \"8f6a4b2446b42e8215195e195133e546\"\n },\n {\n \"url\": \"/icons/openweathermap/black/13d.png\",\n \"revision\": \"45bfce1d2ea7d16415848650eb5d2cb3\"\n },\n {\n \"url\": \"/icons/openweathermap/black/13n.png\",\n \"revision\": \"45bfce1d2ea7d16415848650eb5d2cb3\"\n },\n {\n \"url\": \"/icons/openweathermap/black/50d.png\",\n \"revision\": \"7a304f2b15fe4d9de351dabc44ff900d\"\n },\n {\n \"url\": \"/icons/openweathermap/black/50n.png\",\n \"revision\": \"7a304f2b15fe4d9de351dabc44ff900d\"\n },\n {\n \"url\": \"/icons/openweathermap/black/unknown.png\",\n \"revision\": \"c219891f5796e43d0f75f6525a8d6f33\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/01d.png\",\n \"revision\": \"4cf2907a1083c067828830bb007e2f34\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/01n.png\",\n \"revision\": \"df30375c6371005e2d238c36255afc8a\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/02d.png\",\n \"revision\": \"79a0adce79d78da203beeb7a6f4f510b\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/02n.png\",\n \"revision\": \"68d34b41357c2a3ea9479dae653b3617\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/03d.png\",\n \"revision\": \"5f13dba4164c437e2fbdc1d1ecaada4c\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/03n.png\",\n \"revision\": \"65c125cd51934e24f9e3321cc5448d0e\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/04d.png\",\n \"revision\": \"e75cd73c232806d7364ad7feae354074\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/04n.png\",\n \"revision\": \"e75cd73c232806d7364ad7feae354074\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/09d.png\",\n \"revision\": \"328b726310fb5762861859e33ac9066a\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/09n.png\",\n \"revision\": \"328b726310fb5762861859e33ac9066a\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/10d.png\",\n \"revision\": \"7dde329628506567faef30b9eb5c5f69\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/10n.png\",\n \"revision\": \"7dde329628506567faef30b9eb5c5f69\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/11d.png\",\n \"revision\": \"8f6a4b2446b42e8215195e195133e546\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/11n.png\",\n \"revision\": \"8f6a4b2446b42e8215195e195133e546\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/13d.png\",\n \"revision\": \"45bfce1d2ea7d16415848650eb5d2cb3\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/13n.png\",\n \"revision\": \"45bfce1d2ea7d16415848650eb5d2cb3\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/50d.png\",\n \"revision\": \"7a304f2b15fe4d9de351dabc44ff900d\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/50n.png\",\n \"revision\": \"7a304f2b15fe4d9de351dabc44ff900d\"\n },\n {\n \"url\": \"/icons/openweathermap/dark/unknown.png\",\n \"revision\": \"c219891f5796e43d0f75f6525a8d6f33\"\n },\n {\n \"url\": \"/icons/openweathermap/light/01d.png\",\n \"revision\": \"00c2d0a72a69bf279bf8703cea9ce8d2\"\n },\n {\n \"url\": \"/icons/openweathermap/light/01n.png\",\n \"revision\": \"3a65e9f7ed5c54c6acd638a7bd26de25\"\n },\n {\n \"url\": \"/icons/openweathermap/light/02d.png\",\n \"revision\": \"63dab156e991be7e4174d1d6cd8c2321\"\n },\n {\n \"url\": \"/icons/openweathermap/light/02n.png\",\n \"revision\": \"7c64d1a1c5efdbe38e6b7e3b4f50f2c5\"\n },\n {\n \"url\": \"/icons/openweathermap/light/03d.png\",\n \"revision\": \"f609003793e658a60870587cd450fc6f\"\n },\n {\n \"url\": \"/icons/openweathermap/light/03n.png\",\n \"revision\": \"7e694b4317b3e9f2533db93969fcc3e8\"\n },\n {\n \"url\": \"/icons/openweathermap/light/04d.png\",\n \"revision\": \"098f9d40b1d5747996df9a720f160c81\"\n },\n {\n \"url\": \"/icons/openweathermap/light/04n.png\",\n \"revision\": \"098f9d40b1d5747996df9a720f160c81\"\n },\n {\n \"url\": \"/icons/openweathermap/light/09d.png\",\n \"revision\": \"c48a99b60e45690cdc702a2dc6694002\"\n },\n {\n \"url\": \"/icons/openweathermap/light/09n.png\",\n \"revision\": \"c48a99b60e45690cdc702a2dc6694002\"\n },\n {\n \"url\": \"/icons/openweathermap/light/10d.png\",\n \"revision\": \"2750daf3f0d811230591a415e42bddb2\"\n },\n {\n \"url\": \"/icons/openweathermap/light/10n.png\",\n \"revision\": \"2750daf3f0d811230591a415e42bddb2\"\n },\n {\n \"url\": \"/icons/openweathermap/light/11d.png\",\n \"revision\": \"7bd0501a7bfcf2675467df0c0788ffad\"\n },\n {\n \"url\": \"/icons/openweathermap/light/11n.png\",\n \"revision\": \"7bd0501a7bfcf2675467df0c0788ffad\"\n },\n {\n \"url\": \"/icons/openweathermap/light/13d.png\",\n \"revision\": \"4e11e697c6bafc8dd83c4dfc8ce47919\"\n },\n {\n \"url\": \"/icons/openweathermap/light/13n.png\",\n \"revision\": \"4e11e697c6bafc8dd83c4dfc8ce47919\"\n },\n {\n \"url\": \"/icons/openweathermap/light/50d.png\",\n \"revision\": \"9a0770f3adc7c4a27e131c04a739f735\"\n },\n {\n \"url\": \"/icons/openweathermap/light/50n.png\",\n \"revision\": \"9a0770f3adc7c4a27e131c04a739f735\"\n },\n {\n \"url\": \"/icons/openweathermap/light/unknown.png\",\n \"revision\": \"f14a44a1ecde49a5c6a396f8c1753263\"\n },\n {\n \"url\": \"/icons/openweathermap/white/01d.png\",\n \"revision\": \"00c2d0a72a69bf279bf8703cea9ce8d2\"\n },\n {\n \"url\": \"/icons/openweathermap/white/01n.png\",\n \"revision\": \"3a65e9f7ed5c54c6acd638a7bd26de25\"\n },\n {\n \"url\": \"/icons/openweathermap/white/02d.png\",\n \"revision\": \"63dab156e991be7e4174d1d6cd8c2321\"\n },\n {\n \"url\": \"/icons/openweathermap/white/02n.png\",\n \"revision\": \"7c64d1a1c5efdbe38e6b7e3b4f50f2c5\"\n },\n {\n \"url\": \"/icons/openweathermap/white/03d.png\",\n \"revision\": \"f609003793e658a60870587cd450fc6f\"\n },\n {\n \"url\": \"/icons/openweathermap/white/03n.png\",\n \"revision\": \"7e694b4317b3e9f2533db93969fcc3e8\"\n },\n {\n \"url\": \"/icons/openweathermap/white/04d.png\",\n \"revision\": \"098f9d40b1d5747996df9a720f160c81\"\n },\n {\n \"url\": \"/icons/openweathermap/white/04n.png\",\n \"revision\": \"098f9d40b1d5747996df9a720f160c81\"\n },\n {\n \"url\": \"/icons/openweathermap/white/09d.png\",\n \"revision\": \"c48a99b60e45690cdc702a2dc6694002\"\n },\n {\n \"url\": \"/icons/openweathermap/white/09n.png\",\n \"revision\": \"c48a99b60e45690cdc702a2dc6694002\"\n },\n {\n \"url\": \"/icons/openweathermap/white/10d.png\",\n \"revision\": \"2750daf3f0d811230591a415e42bddb2\"\n },\n {\n \"url\": \"/icons/openweathermap/white/10n.png\",\n \"revision\": \"2750daf3f0d811230591a415e42bddb2\"\n },\n {\n \"url\": \"/icons/openweathermap/white/11d.png\",\n \"revision\": \"7bd0501a7bfcf2675467df0c0788ffad\"\n },\n {\n \"url\": \"/icons/openweathermap/white/11n.png\",\n \"revision\": \"7bd0501a7bfcf2675467df0c0788ffad\"\n },\n {\n \"url\": \"/icons/openweathermap/white/13d.png\",\n \"revision\": \"4e11e697c6bafc8dd83c4dfc8ce47919\"\n },\n {\n \"url\": \"/icons/openweathermap/white/13n.png\",\n \"revision\": \"4e11e697c6bafc8dd83c4dfc8ce47919\"\n },\n {\n \"url\": \"/icons/openweathermap/white/50d.png\",\n \"revision\": \"9a0770f3adc7c4a27e131c04a739f735\"\n },\n {\n \"url\": \"/icons/openweathermap/white/50n.png\",\n \"revision\": \"9a0770f3adc7c4a27e131c04a739f735\"\n },\n {\n \"url\": \"/icons/openweathermap/white/unknown.png\",\n \"revision\": \"f14a44a1ecde49a5c6a396f8c1753263\"\n },\n {\n \"url\": \"/icons/plex.svg\",\n \"revision\": \"9923c5c80858a7da9d48c3ee77974e77\"\n },\n {\n \"url\": \"/icons/smartthings.png\",\n \"revision\": \"9306b6ca82efa85d58823615ff14b00f\"\n },\n {\n \"url\": \"/icons/z-wave.png\",\n \"revision\": \"3045e92627da521267db845b16da6028\"\n },\n {\n \"url\": \"/icons/zigbee.svg\",\n \"revision\": \"3e5f749af9e83ace5c12ff3aac6d4b88\"\n },\n {\n \"url\": \"/img/dashboard-bg-light.jpg\",\n \"revision\": \"f9ab2a6552509997ec0cbaeb47199eba\"\n },\n {\n \"url\": \"/img/logo.png\",\n \"revision\": \"98702e78dde598404826f6e9279e4ab3\"\n },\n {\n \"url\": \"/img/spinner.gif\",\n \"revision\": \"5572838d351b66bf6a3350b6d8d23cb8\"\n },\n {\n \"url\": \"/index.html\",\n \"revision\": \"750b83bcf7705a1511e320e14e749ddb\"\n },\n {\n \"url\": \"/manifest.json\",\n \"revision\": \"8a45dcffc3380b17da6ea17291b43e00\"\n },\n {\n \"url\": \"/static/css/1196.78925ff5.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/1300.180d2070.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/1767.f9545a14.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/1798.3a165bb4.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/1818.8db287b9.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/201.3ba92d09.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/2346.ed463bd2.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/2790.a0725ecc.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/2806.9c9d5a57.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/3194.a07dd4e2.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/3303.bfeafcb0.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/345.25d1c562.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/346.bec1b050.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/3490.fcf11255.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/3710.1112d8b7.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/3724.234438b4.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/4021.58663e3e.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/4118.25e7d5ff.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/4196.539db457.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/4848.72a7d113.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/4981.c5c2f5dd.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/5199.6ad0f775.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/5207.950597e1.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/5498.ef565a73.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/5824.8f1b2b15.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/5924.f0111959.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6003.fbbaf2b7.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6013.504d6c0b.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/615.6d3a8446.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6164.ea3fa7cb.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6358.1f06089f.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/65.ae3723d7.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6739.49b1f262.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/675.10cdb721.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6815.f1dc7909.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6833.28cb5e3d.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/6899.c92d9d38.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/7141.4b3e6b00.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/7420.4bf56b11.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/7503.34698020.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/7782.a6a32303.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/8135.1460504e.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/8200.22b025de.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/8444.95911650.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/8589.2e68c420.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/906.a114eea0.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/9276.518b169b.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/9387.74d3b3a3.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/9418.9f2b9c3a.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/9450.fd9ed6f2.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/9575.1b22f65c.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/9978.b6585c35.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/app.0a781c41.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/css/chunk-vendors.0fcd36f0.css\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/fa-brands-400.7fa789ab.ttf\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/fa-brands-400.859fc388.woff2\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/fa-regular-400.2ffd018f.woff2\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/fa-regular-400.da02cb7e.ttf\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/fa-solid-900.3a463ec3.ttf\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/fa-solid-900.40ddefd7.woff2\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/lato-medium-italic.1996cc15.woff\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/lato-medium-italic.1e312dd9.woff2\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/lato-medium.13fcde4c.woff2\",\n \"revision\": null\n },\n {\n \"url\": \"/static/fonts/lato-medium.b41c3821.woff\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ad.cb33f69a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ad.fa8477e6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ae.a3f5e295.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ae.f06e0095.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/af.89591ab0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/af.8ca96393.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ag.4c37bc2e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ag.56074d55.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ai.70eefdc0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ai.893d1179.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/al.b16acdb2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/al.e0864b5d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/am.00f0fec4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/am.a566904f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ao.3df23f21.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ao.c0c32201.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/aq.1b8c45a6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/aq.aa242c4a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ar.22a3116e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ar.d3238270.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/as.10ed1a23.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/as.4a330654.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/at.02a64279.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/at.94cde74c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/au.cc65fc07.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/au.dbcdef2c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/aw.abbad4ac.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/aw.be4540eb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ax.371c7af2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ax.91eea523.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/az.0e2f1d1a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/az.f399f1c8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ba.032070d4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ba.e167b08f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bb.23a15e67.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bb.b800513b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bd.c1abcb00.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bd.c4a5f0e2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/be.29774a37.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/be.3eb14701.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bf.2334e919.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bf.4ffd5dc6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bg.700f100c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bg.d0a49130.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bh.2a884f6c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bh.3968dfe0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bi.211d0f9e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bi.ae3bb248.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bj.2cdc8a62.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bj.aba95ad2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bl.04966866.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bl.3e69e968.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bm.e6903c8e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bm.e69e40c4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bn.07911e0c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bn.4d91734a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bo.03595499.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bo.9c1d9ef8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bq.747d8177.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bq.b9355bec.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/br.058a5086.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/br.fe030c1c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bs.d228cbb2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bs.ef0a29ed.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bt.3f8ecb9b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bt.fc241981.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bv.5503f03a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bv.7f7cd26f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bw.494aae64.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bw.b767df8c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/by.78d2c3c9.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/by.fba98c48.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bz.14c3376a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/bz.5e0ef548.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ca.163ac200.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ca.a2ab234d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cc.51960f85.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cc.813adff8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cd.39186ec2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cd.b4bd46ee.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cf.b5702729.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cf.fe1120e9.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cg.00603842.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cg.12414c99.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ch.7376c9c3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ch.a558d859.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ci.1251a8e3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ci.425a24c2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ck.4e83dd3e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ck.6303aa5b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cl.0917a91e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cl.b5974a35.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cm.253adb39.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cm.853e2843.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cn.38f63e1e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cn.e1b166eb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/co.33e249d8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/co.b5cbc817.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cr.2e572846.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cr.336eb7d3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cu.c2a6f0ed.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cu.d6e33f19.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cv.5ea64968.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cv.b3ab83f5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cw.0e14b0b7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cw.9b9b7ed5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cx.da5de6d2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cx.e04e07e8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cy.834e6240.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cy.bfcfd736.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cz.aa114964.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/cz.b5f98a6b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dashboard-bg-light.06da6eab.jpg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/de.8e159e6e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/de.b827ac51.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dj.4197a18a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dj.925748d5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dk.3ca1caed.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dk.a867eeef.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dm.7ddb00ac.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dm.bca6d70c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/do.81097daa.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/do.954f0f3e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dz.76d47b01.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/dz.b7e2fbce.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ec.0029f514.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ec.5f387e2f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ee.1b4839e0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ee.828384a8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/eg.38443fa6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/eg.5756a758.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/eh.82bd1c7b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/eh.f8d7b64f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/er.bf5b134b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/er.e932abe1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/es-ct.64a68954.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/es-ct.69469f50.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/es.7dd46df0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/es.de5915e5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/et.82e8eb21.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/et.a998a1b2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/eu.4c6e130f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/eu.aba724b1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fi.0cd85b78.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fi.3be6b378.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fj.ac9c916f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fj.e8d3e00b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fk.af0350f8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fk.db55fa14.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fm.3491efc7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fm.78d44caa.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fo.1da81e3a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fo.72949ad1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fr.3565b8f4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/fr.9cb70285.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ga.3e474381.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ga.59f7d865.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-eng.0fac6e79.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-eng.513dcf1b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-nir.2b7d2c3a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-nir.f59817d6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-sct.f5001e5d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-sct.fee55173.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-wls.13481560.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb-wls.95b2cfab.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb.2aafb374.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gb.7a456bb2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gd.04ea09b7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gd.60b96978.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ge.b7b65b55.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ge.c7190912.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gf.531f9e07.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gf.90f438a3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gg.3aebc3ce.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gg.65174039.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gh.af443995.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gh.f2b6baac.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gi.302c2506.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gi.7beea6ed.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gl.551d0783.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gl.6a5c17b0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gm.0e00e9d4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gm.1724dc37.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gn.54a75b28.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gn.7c96520b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gp.4327060f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gp.f8adbf5c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gq.b1679302.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gq.bd7daf33.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gr.07bedadf.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gr.25dd3287.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gs.60368968.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gs.b2836676.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gt.1a24ed67.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gt.825f7286.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gu.05f0ab85.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gu.19b114eb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gw.bcd1eddb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gw.c97f3f94.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gy.6327f72a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/gy.e11d0234.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hk.b199a9ee.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hk.c72bba0e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hm.4aa61657.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hm.d4b3d393.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hn.08ad78b2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hn.44cee191.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hr.078b1bf9.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hr.1f4e28b8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ht.6943447c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ht.7ca68737.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hu.692e97ca.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/hu.b10d3f8e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/id.94464e47.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/id.a05dc04c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ie.5154112a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ie.e23b25d1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/il.150f4c5f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/il.e02a66d3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/im.25166c91.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/im.942419c5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/in.954929a0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/in.bd0d4f19.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/io.a59923ab.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/io.fa003484.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/iq.1232a5c2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/iq.9a48d678.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ir.1ed24953.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ir.bc7ae9e1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/is.cad57f19.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/is.eea59326.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/it.039b4527.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/it.e8516fc7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/je.1684dacc.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/je.3ed72a25.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/jellyfin.7b53a541.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/jm.2357530e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/jm.479f30fe.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/jo.06fbaa2c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/jo.7ac45a65.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/jp.1795778c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/jp.b6063838.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ke.6dbfffd5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ke.769bb975.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kg.96c12490.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kg.daded53c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kh.8eeb1634.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kh.b10339d6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ki.033ff9ce.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ki.89e43a21.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/km.1e3bd5fe.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/km.3ffb0228.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kn.0c16fe68.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kn.8f2e7b29.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kodi.d18f8d23.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kp.0f5253d8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kp.f4ff9e76.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kr.0dc8b972.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kr.0f5e1116.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kw.3b4f3ea3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kw.830d3755.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ky.be81d90b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ky.e3b76b32.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kz.32ac1036.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/kz.579ac0f9.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/la.e583f8ec.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/la.f71017ef.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lb.8eea508a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lb.bdbeb8f1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lc.25f644a6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lc.68bd77ae.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/li.8dc1ed79.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/li.d7e2a871.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lk.42c41c61.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lk.e52240d6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lr.5b84ff00.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lr.9a67cd3d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ls.6d444cae.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ls.fe1da403.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lt.03a2e8c1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lt.b57ea2a8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lu.93878a1b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lu.e3bdc6d3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lv.1853e3a0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/lv.679c099e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ly.05f8732e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ly.b9e750ff.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ma.65053fc4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ma.88ada30c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mc.2c03ea5c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mc.89b532e8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/md.646818c3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/md.a56562ee.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/me.2e71b778.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/me.f05548f2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mf.70d09a4a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mf.7da6b3d2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mg.09ca17b2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mg.b3fff4a6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mh.3fd69bb2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mh.f6cbc774.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mk.4234a248.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mk.e5412079.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ml.3fad079e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ml.4f0dba9e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mm.8ac1f094.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mm.adaa2111.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mn.78547af0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mn.a4bcb0e6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mo.2f0d2c15.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mo.c8198565.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mp.2acb5506.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mp.eeeefff6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mq.145a7657.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mq.bb36a8fc.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mr.dd34eae8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mr.e91e06ea.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ms.2025cd7d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ms.b13001dc.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mt.b6f71c85.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mt.cff39ee0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mu.51f71163.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mu.a926c232.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mv.2c8b92b5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mv.ba4de4fd.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mw.0b005148.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mw.f704f4bb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mx.1b615ec2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mx.8a36b075.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/my.4109ae71.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/my.69c87fc5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mz.1377650b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/mz.2c96acb1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/na.7adf4344.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/na.e0503926.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nc.96fa6a4b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nc.b5a5d41b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ne.d11b82c6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ne.d4fe4faa.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nf.1e8c700b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nf.a7166b00.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ng.51059407.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ng.c3b42ad2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ni.5b80bac0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ni.cc7eb514.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nl.dd138444.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nl.e415f0e7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/no.26996afa.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/no.70157234.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/np.954177a0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/np.f7b8a5c3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nr.2c66d218.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nr.a4f0e762.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nu.26551dc2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nu.860bbe8a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nz.38d0d690.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/nz.c77ae58d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/om.3f5691ca.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/om.ff034f9e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pa.6dc8212a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pa.acde3214.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pe.5a3b0bc5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pe.5c2ced95.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pf.9f06082b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pf.f6ae1bc8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pg.26847b33.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pg.66c8dc3b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ph.12e2b123.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ph.f215833e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pk.0bbf58be.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pk.32b55f6f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pl.03886843.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pl.a1350f0c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/plex.7a4e22a6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pm.7a6beab5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pm.a5590fa3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pn.00a9342b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pn.715fd11d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pr.391a48e2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pr.b37cbdc4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ps.1af72ed4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ps.96bcac74.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pt.0703cc3a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pt.351b87cb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pw.17220ffb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/pw.6d8e7ce0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/py.25cc39e3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/py.c20318c9.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/qa.7e695788.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/qa.86452d7a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/re.b8140129.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/re.cf143c2f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ro.67f8501e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ro.cab93784.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/rs.23638d75.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/rs.ae2e3422.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ru.ccd50623.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ru.edd8b008.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/rw.87d5d899.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/rw.d118aacd.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sa.5bfbe72b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sa.f0a8997b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sb.1c406073.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sb.b0db5b0a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sc.0452f14c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sc.cdc20672.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sd.0e619868.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sd.da3b68ee.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/se.7e499d82.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/se.7ec71700.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sg.4f0e8eff.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sg.8a63b009.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sh.46e2588d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sh.681f8fff.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/si.2a428364.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/si.d9d425c0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sj.638e6522.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sj.92c583b8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sk.7998d1f5.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sk.93c91c0b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sl.d8378c47.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sl.eb9dda3f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sm.0ba901f4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sm.5e2fc188.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sn.4247b831.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sn.98923b55.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/so.2d18a203.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/so.45f08b28.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sr.cb178d98.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sr.d66c1240.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ss.caedfdf2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ss.db181f81.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/st.a70042c6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/st.ecc4827f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sv.9501935a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sv.f67839a6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sx.77e864f0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sx.c0e6297a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sy.2b3eac89.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sy.7fe894df.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sz.70b6fc50.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/sz.eb01cd9f.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tc.30ccd48e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tc.651466dd.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/td.5d622e26.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/td.f1319408.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tf.27cbe00b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tf.a1757237.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tg.b492a751.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tg.d04f874c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/th.79b63a8a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/th.b8e24edb.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tj.b7dafe8d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tj.d3a42312.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tk.6c1f520c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tk.f87f794b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tl.85904d79.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tl.ca9af3c0.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tm.762df128.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tm.e467552c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tn.cc3ab493.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tn.ff4c5190.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/to.8dd22284.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/to.9748a967.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tr.87e40d5c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tr.fc8c91dd.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tt.4acf6cc2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tt.5a459e81.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tv.9717b553.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tv.a8ff4939.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tw.45c8a106.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tw.c0cf9ea7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tz.1abfbb38.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/tz.c27fd405.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ua.04fa0e67.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ua.63d75c84.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ug.5ac71e98.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ug.5ae165a2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/um.582dd57b.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/um.b38f913c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/un.2df110d6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/un.58a4a02a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/us.6c459052.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/us.99e04236.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/uy.69cf8938.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/uy.b70ac310.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/uz.7f8823a2.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/uz.d53abc35.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/va.7efb8ba6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/va.abcb42e8.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vc.37cf5ba1.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vc.3e4ac6d4.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ve.4cd0e3ed.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ve.9cd63506.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vg.025b8b6a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vg.ae3b6f7e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vi.293e6f1c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vi.f920eec7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vn.11dd1cf6.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vn.9ec4ca4d.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vu.5d2d7643.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/vu.b7a8d91a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/wf.69c77016.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/wf.9ca6f4bc.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ws.15c7a17c.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ws.d2e19e5a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/xk.16b6bb85.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/xk.ca7843be.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ye.0b3f3c76.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/ye.bb567731.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/yt.332bd5d3.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/yt.c33641ca.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/za.2fa94205.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/za.42e033a9.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/zm.92477cab.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/zm.ce5363b7.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/zw.6a535c1e.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/img/zw.f488cb8a.svg\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/1196.f4c25ec1.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/1595.cf573de8.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/1767.25bd60ff.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/1798.2ea76630.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/1818.d8f79120.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/1938.1dc95872.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/201.7a3e40e3.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/2346.9a487752.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/2362.620095dd.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/2466.633bb83f.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/2790.4b108fb8.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/2806.e32037e8.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/2820.07ee3664.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/3194.256c2da8.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/3249.a2010c2d.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/3303.028580a6.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/345.8d14f37b.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/346.647c3d99.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/3710.05c41d28.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/3724.a557791e.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/4118.eb9d25ca.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/4196.f85ff63e.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/4548.75a2e6f8.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/4848.ca77e67b.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5111.fbd25a85.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5157.f2273a80.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5199.03545ba6.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5207.b6625280.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5465.e48f0738.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5498.ddfaadb5.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5824.d14935bb.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5895.bc039cca.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/5924.a2919fe4.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6003.c76e25e0.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6013.5c85c65a.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6027.e3b113ee.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/615.25a0ebcb.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6164.2c2c3fba.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6358.46615b4c.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/65.a4e6662a.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6509.9ca36429.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6739.14f222c1.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/675.496d097f.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6815.a11912ee.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6833.65afb884.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/6899.8c784f84.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/699.85a689b1.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/7141.e4e94ba3.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/7420.e53d9d48.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/7503.2c161f6d.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/767.32c26b46.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/8135.bb2ac7e3.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/8184.3768abaf.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/8444.d0d1fdb2.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/906.12e72134.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9276.74343d50.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9299.710819a1.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9369.f7907b71.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9387.194bcb15.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9418.dfb3427c.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9450.0b6d3902.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9633.23b95cb0.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9895.a39079d5.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/9978.f8ee0318.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/app.a0889d9d.js\",\n \"revision\": null\n },\n {\n \"url\": \"/static/js/chunk-vendors.0f6060b6.js\",\n \"revision\": null\n }\n], {});\n\n\n\n\n\n\n\n\n"],"names":["workbox_core_setCacheNameDetails","prefix","self","addEventListener","event","data","type","skipWaiting","workbox_precaching_precacheAndRoute","url","revision"],"mappings":"0nBAiBAA,EAAAA,oBAAiC,CAACC,OAAQ,cAG1CC,KAAKC,iBAAiB,WAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,aACN,IAWHC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,qBACKC,SAAA,oCAEd,CACED,IAAO,qBACKC,SAAA,oCAEd,CACED,IAAO,sBACKC,SAAA,oCAEd,CACED,IAAO,kBACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,0CACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,qCACKC,SAAA,oCAEd,CACED,IAAO,yCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,0CACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,sCACKC,SAAA,oCAEd,CACED,IAAO,0CACKC,SAAA,oCAEd,CACED,IAAO,kBACKC,SAAA,oCAEd,CACED,IAAO,yBACKC,SAAA,oCAEd,CACED,IAAO,oBACKC,SAAA,oCAEd,CACED,IAAO,oBACKC,SAAA,oCAEd,CACED,IAAO,8BACKC,SAAA,oCAEd,CACED,IAAO,gBACKC,SAAA,oCAEd,CACED,IAAO,mBACKC,SAAA,oCAEd,CACED,IAAO,cACKC,SAAA,oCAEd,CACED,IAAO,iBACKC,SAAA,oCAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,+BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,+BACKC,SAAA,MAEd,CACED,IAAO,+BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,+BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,+BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,+BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,+BACKC,SAAA,MAEd,CACED,IAAO,yCACKC,SAAA,MAEd,CACED,IAAO,2CACKC,SAAA,MAEd,CACED,IAAO,6CACKC,SAAA,MAEd,CACED,IAAO,8CACKC,SAAA,MAEd,CACED,IAAO,4CACKC,SAAA,MAEd,CACED,IAAO,0CACKC,SAAA,MAEd,CACED,IAAO,4CACKC,SAAA,MAEd,CACED,IAAO,iDACKC,SAAA,MAEd,CACED,IAAO,kDACKC,SAAA,MAEd,CACED,IAAO,2CACKC,SAAA,MAEd,CACED,IAAO,0CACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8CACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,iCACKC,SAAA,MAEd,CACED,IAAO,iCACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,kCACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,oCACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,gCACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,4BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,8BACKC,SAAA,MAEd,CACED,IAAO,6BACKC,SAAA,MAEd,CACED,IAAO,uCACKC,SAAA,OAEb,CAAA"} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/css/4118.25e7d5ff.css b/platypush/backend/http/webapp/dist/static/css/4118.25e7d5ff.css new file mode 100644 index 00000000..4772d40d --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/css/4118.25e7d5ff.css @@ -0,0 +1 @@ +.col-1[data-v-911495ca]{float:left;box-sizing:border-box;width:4.6666666667%;margin-left:4%}.col-1[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-1[data-v-911495ca]{float:left;box-sizing:border-box;width:8.3333333333%;margin:0}.col-offset-1[data-v-911495ca]:first-child{margin-left:8.6666666667%!important}.col-offset-1[data-v-911495ca]:not(first-child){margin-left:12.6666666667%!important}.col-2[data-v-911495ca]{float:left;box-sizing:border-box;width:13.3333333333%;margin-left:4%}.col-2[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-2[data-v-911495ca]{float:left;box-sizing:border-box;width:16.6666666667%;margin:0}.col-offset-2[data-v-911495ca]:first-child{margin-left:17.3333333333%!important}.col-offset-2[data-v-911495ca]:not(first-child){margin-left:21.3333333333%!important}.col-3[data-v-911495ca]{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-3[data-v-911495ca]{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3[data-v-911495ca]:first-child{margin-left:26%!important}.col-offset-3[data-v-911495ca]:not(first-child){margin-left:30%!important}.col-4[data-v-911495ca]{float:left;box-sizing:border-box;width:30.6666666667%;margin-left:4%}.col-4[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-4[data-v-911495ca]{float:left;box-sizing:border-box;width:33.3333333333%;margin:0}.col-offset-4[data-v-911495ca]:first-child{margin-left:34.6666666667%!important}.col-offset-4[data-v-911495ca]:not(first-child){margin-left:38.6666666667%!important}.col-5[data-v-911495ca]{float:left;box-sizing:border-box;width:39.3333333334%;margin-left:4%}.col-5[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-5[data-v-911495ca]{float:left;box-sizing:border-box;width:41.6666666667%;margin:0}.col-offset-5[data-v-911495ca]:first-child{margin-left:43.3333333334%!important}.col-offset-5[data-v-911495ca]:not(first-child){margin-left:47.3333333334%!important}.col-6[data-v-911495ca]{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-6[data-v-911495ca]{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6[data-v-911495ca]:first-child{margin-left:52%!important}.col-offset-6[data-v-911495ca]:not(first-child){margin-left:56%!important}.col-7[data-v-911495ca]{float:left;box-sizing:border-box;width:56.6666666667%;margin-left:4%}.col-7[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-7[data-v-911495ca]{float:left;box-sizing:border-box;width:58.3333333333%;margin:0}.col-offset-7[data-v-911495ca]:first-child{margin-left:60.6666666667%!important}.col-offset-7[data-v-911495ca]:not(first-child){margin-left:64.6666666667%!important}.col-8[data-v-911495ca]{float:left;box-sizing:border-box;width:65.3333333334%;margin-left:4%}.col-8[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-8[data-v-911495ca]{float:left;box-sizing:border-box;width:66.6666666667%;margin:0}.col-offset-8[data-v-911495ca]:first-child{margin-left:69.3333333334%!important}.col-offset-8[data-v-911495ca]:not(first-child){margin-left:73.3333333334%!important}.col-9[data-v-911495ca]{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-9[data-v-911495ca]{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9[data-v-911495ca]:first-child{margin-left:78%!important}.col-offset-9[data-v-911495ca]:not(first-child){margin-left:82%!important}.col-10[data-v-911495ca]{float:left;box-sizing:border-box;width:82.6666666667%;margin-left:4%}.col-10[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-10[data-v-911495ca]{float:left;box-sizing:border-box;width:83.3333333333%;margin:0}.col-offset-10[data-v-911495ca]:first-child{margin-left:86.6666666667%!important}.col-offset-10[data-v-911495ca]:not(first-child){margin-left:90.6666666667%!important}.col-11[data-v-911495ca]{float:left;box-sizing:border-box;width:91.3333333334%;margin-left:4%}.col-11[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-11[data-v-911495ca]{float:left;box-sizing:border-box;width:91.6666666667%;margin:0}.col-offset-11[data-v-911495ca]:first-child{margin-left:95.3333333334%!important}.col-offset-11[data-v-911495ca]:not(first-child){margin-left:99.3333333334%!important}.col-12[data-v-911495ca]{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-12[data-v-911495ca]{float:left;box-sizing:border-box;width:100%;margin:0}@media screen and (max-width:calc(769px - 1px)){.col-s-1[data-v-911495ca]{float:left;box-sizing:border-box;width:4.6666666667%;margin-left:4%}.col-s-1[data-v-911495ca]:first-child{margin-left:0}.col-offset-s-1[data-v-911495ca]{margin-left:8.6666666667%}.col-no-margin-s-1[data-v-911495ca]{float:left;box-sizing:border-box;width:8.3333333333%}.col-s-2[data-v-911495ca]{float:left;box-sizing:border-box;width:13.3333333333%;margin-left:4%}.col-s-2[data-v-911495ca]:first-child{margin-left:0}.col-offset-s-2[data-v-911495ca]{margin-left:17.3333333333%}.col-no-margin-s-2[data-v-911495ca]{float:left;box-sizing:border-box;width:16.6666666667%}.col-s-3[data-v-911495ca]{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3[data-v-911495ca]:first-child{margin-left:0}.col-offset-s-3[data-v-911495ca]{margin-left:26%}.col-no-margin-s-3[data-v-911495ca]{float:left;box-sizing:border-box;width:25%}.col-s-4[data-v-911495ca]{float:left;box-sizing:border-box;width:30.6666666667%;margin-left:4%}.col-s-4[data-v-911495ca]:first-child{margin-left:0}.col-offset-s-4[data-v-911495ca]{margin-left:34.6666666667%}.col-no-margin-s-4[data-v-911495ca]{float:left;box-sizing:border-box;width:33.3333333333%}.col-s-5[data-v-911495ca]{float:left;box-sizing:border-box;width:39.3333333334%;margin-left:4%}.col-s-5[data-v-911495ca]:first-child{margin-left:0}.col-offset-s-5[data-v-911495ca]{margin-left:43.3333333334%}.col-no-margin-s-5[data-v-911495ca]{float:left;box-sizing:border-box;width:41.6666666667%}.col-s-6[data-v-911495ca]{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6[data-v-911495ca]:first-child{margin-left:0}.col-offset-s-6[data-v-911495ca]{margin-left:52%}.col-no-margin-s-6[data-v-911495ca]{float:left;box-sizing:border-box;width:50%}.col-s-7[data-v-911495ca]{float:left;box-sizing:border-box;width:56.6666666667%;margin-left:4%}.col-s-7[data-v-911495ca]:first-child{margin-left:0}.col-offset-s-7[data-v-911495ca]{margin-left:60.6666666667%}.col-no-margin-s-7[data-v-911495ca]{float:left;box-sizing:border-box;width:58.3333333333%}.col-s-8[data-v-911495ca]{float:left;box-sizing:border-box;width:65.3333333334%;margin-left:4%}.col-s-8[data-v-911495ca]:first-child{margin-left:0}.col-offset-s-8[data-v-911495ca]{margin-left:69.3333333334%}.col-no-margin-s-8[data-v-911495ca]{float:left;box-sizing:border-box;width:66.6666666667%}.col-s-9[data-v-911495ca]{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9[data-v-911495ca]:first-child{margin-left:0}.col-offset-s-9[data-v-911495ca]{margin-left:78%}.col-no-margin-s-9[data-v-911495ca]{float:left;box-sizing:border-box;width:75%}.col-s-10[data-v-911495ca]{float:left;box-sizing:border-box;width:82.6666666667%;margin-left:4%}.col-s-10[data-v-911495ca]:first-child{margin-left:0}.col-offset-s-10[data-v-911495ca]{margin-left:86.6666666667%}.col-no-margin-s-10[data-v-911495ca]{float:left;box-sizing:border-box;width:83.3333333333%}.col-s-11[data-v-911495ca]{float:left;box-sizing:border-box;width:91.3333333334%;margin-left:4%}.col-s-11[data-v-911495ca]:first-child{margin-left:0}.col-offset-s-11[data-v-911495ca]{margin-left:95.3333333334%}.col-no-margin-s-11[data-v-911495ca]{float:left;box-sizing:border-box;width:91.6666666667%}.col-s-12[data-v-911495ca]{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-s-12[data-v-911495ca]{float:left;box-sizing:border-box;width:100%}.s-hidden[data-v-911495ca]{display:none!important}.s-visible[data-v-911495ca]{display:block!important}}@media screen and (min-width:769px){.col-m-1[data-v-911495ca]{float:left;box-sizing:border-box;width:4.6666666667%;margin-left:4%}.col-m-1[data-v-911495ca]:first-child{margin-left:0}.col-offset-m-1[data-v-911495ca]{margin-left:8.6666666667%}.col-no-margin-m-1[data-v-911495ca]{float:left;box-sizing:border-box;width:8.3333333333%}.col-m-2[data-v-911495ca]{float:left;box-sizing:border-box;width:13.3333333333%;margin-left:4%}.col-m-2[data-v-911495ca]:first-child{margin-left:0}.col-offset-m-2[data-v-911495ca]{margin-left:17.3333333333%}.col-no-margin-m-2[data-v-911495ca]{float:left;box-sizing:border-box;width:16.6666666667%}.col-m-3[data-v-911495ca]{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3[data-v-911495ca]:first-child{margin-left:0}.col-offset-m-3[data-v-911495ca]{margin-left:26%}.col-no-margin-m-3[data-v-911495ca]{float:left;box-sizing:border-box;width:25%}.col-m-4[data-v-911495ca]{float:left;box-sizing:border-box;width:30.6666666667%;margin-left:4%}.col-m-4[data-v-911495ca]:first-child{margin-left:0}.col-offset-m-4[data-v-911495ca]{margin-left:34.6666666667%}.col-no-margin-m-4[data-v-911495ca]{float:left;box-sizing:border-box;width:33.3333333333%}.col-m-5[data-v-911495ca]{float:left;box-sizing:border-box;width:39.3333333334%;margin-left:4%}.col-m-5[data-v-911495ca]:first-child{margin-left:0}.col-offset-m-5[data-v-911495ca]{margin-left:43.3333333334%}.col-no-margin-m-5[data-v-911495ca]{float:left;box-sizing:border-box;width:41.6666666667%}.col-m-6[data-v-911495ca]{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6[data-v-911495ca]:first-child{margin-left:0}.col-offset-m-6[data-v-911495ca]{margin-left:52%}.col-no-margin-m-6[data-v-911495ca]{float:left;box-sizing:border-box;width:50%}.col-m-7[data-v-911495ca]{float:left;box-sizing:border-box;width:56.6666666667%;margin-left:4%}.col-m-7[data-v-911495ca]:first-child{margin-left:0}.col-offset-m-7[data-v-911495ca]{margin-left:60.6666666667%}.col-no-margin-m-7[data-v-911495ca]{float:left;box-sizing:border-box;width:58.3333333333%}.col-m-8[data-v-911495ca]{float:left;box-sizing:border-box;width:65.3333333334%;margin-left:4%}.col-m-8[data-v-911495ca]:first-child{margin-left:0}.col-offset-m-8[data-v-911495ca]{margin-left:69.3333333334%}.col-no-margin-m-8[data-v-911495ca]{float:left;box-sizing:border-box;width:66.6666666667%}.col-m-9[data-v-911495ca]{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9[data-v-911495ca]:first-child{margin-left:0}.col-offset-m-9[data-v-911495ca]{margin-left:78%}.col-no-margin-m-9[data-v-911495ca]{float:left;box-sizing:border-box;width:75%}.col-m-10[data-v-911495ca]{float:left;box-sizing:border-box;width:82.6666666667%;margin-left:4%}.col-m-10[data-v-911495ca]:first-child{margin-left:0}.col-offset-m-10[data-v-911495ca]{margin-left:86.6666666667%}.col-no-margin-m-10[data-v-911495ca]{float:left;box-sizing:border-box;width:83.3333333333%}.col-m-11[data-v-911495ca]{float:left;box-sizing:border-box;width:91.3333333334%;margin-left:4%}.col-m-11[data-v-911495ca]:first-child{margin-left:0}.col-offset-m-11[data-v-911495ca]{margin-left:95.3333333334%}.col-no-margin-m-11[data-v-911495ca]{float:left;box-sizing:border-box;width:91.6666666667%}.col-m-12[data-v-911495ca]{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-m-12[data-v-911495ca]{float:left;box-sizing:border-box;width:100%}.m-hidden[data-v-911495ca]{display:none!important}.m-visible[data-v-911495ca]{display:block!important}}@media screen and (min-width:1024px){.col-l-1[data-v-911495ca]{float:left;box-sizing:border-box;width:4.6666666667%;margin-left:4%}.col-l-1[data-v-911495ca]:first-child{margin-left:0}.col-offset-l-1[data-v-911495ca]{margin-left:8.6666666667%}.col-no-margin-l-1[data-v-911495ca]{float:left;box-sizing:border-box;width:8.3333333333%}.col-l-2[data-v-911495ca]{float:left;box-sizing:border-box;width:13.3333333333%;margin-left:4%}.col-l-2[data-v-911495ca]:first-child{margin-left:0}.col-offset-l-2[data-v-911495ca]{margin-left:17.3333333333%}.col-no-margin-l-2[data-v-911495ca]{float:left;box-sizing:border-box;width:16.6666666667%}.col-l-3[data-v-911495ca]{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3[data-v-911495ca]:first-child{margin-left:0}.col-offset-l-3[data-v-911495ca]{margin-left:26%}.col-no-margin-l-3[data-v-911495ca]{float:left;box-sizing:border-box;width:25%}.col-l-4[data-v-911495ca]{float:left;box-sizing:border-box;width:30.6666666667%;margin-left:4%}.col-l-4[data-v-911495ca]:first-child{margin-left:0}.col-offset-l-4[data-v-911495ca]{margin-left:34.6666666667%}.col-no-margin-l-4[data-v-911495ca]{float:left;box-sizing:border-box;width:33.3333333333%}.col-l-5[data-v-911495ca]{float:left;box-sizing:border-box;width:39.3333333334%;margin-left:4%}.col-l-5[data-v-911495ca]:first-child{margin-left:0}.col-offset-l-5[data-v-911495ca]{margin-left:43.3333333334%}.col-no-margin-l-5[data-v-911495ca]{float:left;box-sizing:border-box;width:41.6666666667%}.col-l-6[data-v-911495ca]{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6[data-v-911495ca]:first-child{margin-left:0}.col-offset-l-6[data-v-911495ca]{margin-left:52%}.col-no-margin-l-6[data-v-911495ca]{float:left;box-sizing:border-box;width:50%}.col-l-7[data-v-911495ca]{float:left;box-sizing:border-box;width:56.6666666667%;margin-left:4%}.col-l-7[data-v-911495ca]:first-child{margin-left:0}.col-offset-l-7[data-v-911495ca]{margin-left:60.6666666667%}.col-no-margin-l-7[data-v-911495ca]{float:left;box-sizing:border-box;width:58.3333333333%}.col-l-8[data-v-911495ca]{float:left;box-sizing:border-box;width:65.3333333334%;margin-left:4%}.col-l-8[data-v-911495ca]:first-child{margin-left:0}.col-offset-l-8[data-v-911495ca]{margin-left:69.3333333334%}.col-no-margin-l-8[data-v-911495ca]{float:left;box-sizing:border-box;width:66.6666666667%}.col-l-9[data-v-911495ca]{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9[data-v-911495ca]:first-child{margin-left:0}.col-offset-l-9[data-v-911495ca]{margin-left:78%}.col-no-margin-l-9[data-v-911495ca]{float:left;box-sizing:border-box;width:75%}.col-l-10[data-v-911495ca]{float:left;box-sizing:border-box;width:82.6666666667%;margin-left:4%}.col-l-10[data-v-911495ca]:first-child{margin-left:0}.col-offset-l-10[data-v-911495ca]{margin-left:86.6666666667%}.col-no-margin-l-10[data-v-911495ca]{float:left;box-sizing:border-box;width:83.3333333333%}.col-l-11[data-v-911495ca]{float:left;box-sizing:border-box;width:91.3333333334%;margin-left:4%}.col-l-11[data-v-911495ca]:first-child{margin-left:0}.col-offset-l-11[data-v-911495ca]{margin-left:95.3333333334%}.col-no-margin-l-11[data-v-911495ca]{float:left;box-sizing:border-box;width:91.6666666667%}.col-l-12[data-v-911495ca]{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-l-12[data-v-911495ca]{float:left;box-sizing:border-box;width:100%}.l-hidden[data-v-911495ca]{display:none!important}.l-visible[data-v-911495ca]{display:block!important}}@media screen and (min-width:1216px){.col-xl-1[data-v-911495ca]{float:left;box-sizing:border-box;width:4.6666666667%;margin-left:4%}.col-xl-1[data-v-911495ca]:first-child{margin-left:0}.col-offset-xl-1[data-v-911495ca]{margin-left:8.6666666667%}.col-no-margin-xl-1[data-v-911495ca]{float:left;box-sizing:border-box;width:8.3333333333%}.col-xl-2[data-v-911495ca]{float:left;box-sizing:border-box;width:13.3333333333%;margin-left:4%}.col-xl-2[data-v-911495ca]:first-child{margin-left:0}.col-offset-xl-2[data-v-911495ca]{margin-left:17.3333333333%}.col-no-margin-xl-2[data-v-911495ca]{float:left;box-sizing:border-box;width:16.6666666667%}.col-xl-3[data-v-911495ca]{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-xl-3[data-v-911495ca]:first-child{margin-left:0}.col-offset-xl-3[data-v-911495ca]{margin-left:26%}.col-no-margin-xl-3[data-v-911495ca]{float:left;box-sizing:border-box;width:25%}.col-xl-4[data-v-911495ca]{float:left;box-sizing:border-box;width:30.6666666667%;margin-left:4%}.col-xl-4[data-v-911495ca]:first-child{margin-left:0}.col-offset-xl-4[data-v-911495ca]{margin-left:34.6666666667%}.col-no-margin-xl-4[data-v-911495ca]{float:left;box-sizing:border-box;width:33.3333333333%}.col-xl-5[data-v-911495ca]{float:left;box-sizing:border-box;width:39.3333333334%;margin-left:4%}.col-xl-5[data-v-911495ca]:first-child{margin-left:0}.col-offset-xl-5[data-v-911495ca]{margin-left:43.3333333334%}.col-no-margin-xl-5[data-v-911495ca]{float:left;box-sizing:border-box;width:41.6666666667%}.col-xl-6[data-v-911495ca]{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-xl-6[data-v-911495ca]:first-child{margin-left:0}.col-offset-xl-6[data-v-911495ca]{margin-left:52%}.col-no-margin-xl-6[data-v-911495ca]{float:left;box-sizing:border-box;width:50%}.col-xl-7[data-v-911495ca]{float:left;box-sizing:border-box;width:56.6666666667%;margin-left:4%}.col-xl-7[data-v-911495ca]:first-child{margin-left:0}.col-offset-xl-7[data-v-911495ca]{margin-left:60.6666666667%}.col-no-margin-xl-7[data-v-911495ca]{float:left;box-sizing:border-box;width:58.3333333333%}.col-xl-8[data-v-911495ca]{float:left;box-sizing:border-box;width:65.3333333334%;margin-left:4%}.col-xl-8[data-v-911495ca]:first-child{margin-left:0}.col-offset-xl-8[data-v-911495ca]{margin-left:69.3333333334%}.col-no-margin-xl-8[data-v-911495ca]{float:left;box-sizing:border-box;width:66.6666666667%}.col-xl-9[data-v-911495ca]{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-xl-9[data-v-911495ca]:first-child{margin-left:0}.col-offset-xl-9[data-v-911495ca]{margin-left:78%}.col-no-margin-xl-9[data-v-911495ca]{float:left;box-sizing:border-box;width:75%}.col-xl-10[data-v-911495ca]{float:left;box-sizing:border-box;width:82.6666666667%;margin-left:4%}.col-xl-10[data-v-911495ca]:first-child{margin-left:0}.col-offset-xl-10[data-v-911495ca]{margin-left:86.6666666667%}.col-no-margin-xl-10[data-v-911495ca]{float:left;box-sizing:border-box;width:83.3333333333%}.col-xl-11[data-v-911495ca]{float:left;box-sizing:border-box;width:91.3333333334%;margin-left:4%}.col-xl-11[data-v-911495ca]:first-child{margin-left:0}.col-offset-xl-11[data-v-911495ca]{margin-left:95.3333333334%}.col-no-margin-xl-11[data-v-911495ca]{float:left;box-sizing:border-box;width:91.6666666667%}.col-xl-12[data-v-911495ca]{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-xl-12[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-xl-12[data-v-911495ca]{float:left;box-sizing:border-box;width:100%}.xl-hidden[data-v-911495ca]{display:none!important}.xl-visible[data-v-911495ca]{display:block!important}}@media screen and (min-width:1408px){.col-xxl-1[data-v-911495ca]{float:left;box-sizing:border-box;width:4.6666666667%;margin-left:4%}.col-xxl-1[data-v-911495ca]:first-child{margin-left:0}.col-offset-xxl-1[data-v-911495ca]{margin-left:8.6666666667%}.col-no-margin-xxl-1[data-v-911495ca]{float:left;box-sizing:border-box;width:8.3333333333%}.col-xxl-2[data-v-911495ca]{float:left;box-sizing:border-box;width:13.3333333333%;margin-left:4%}.col-xxl-2[data-v-911495ca]:first-child{margin-left:0}.col-offset-xxl-2[data-v-911495ca]{margin-left:17.3333333333%}.col-no-margin-xxl-2[data-v-911495ca]{float:left;box-sizing:border-box;width:16.6666666667%}.col-xxl-3[data-v-911495ca]{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-xxl-3[data-v-911495ca]:first-child{margin-left:0}.col-offset-xxl-3[data-v-911495ca]{margin-left:26%}.col-no-margin-xxl-3[data-v-911495ca]{float:left;box-sizing:border-box;width:25%}.col-xxl-4[data-v-911495ca]{float:left;box-sizing:border-box;width:30.6666666667%;margin-left:4%}.col-xxl-4[data-v-911495ca]:first-child{margin-left:0}.col-offset-xxl-4[data-v-911495ca]{margin-left:34.6666666667%}.col-no-margin-xxl-4[data-v-911495ca]{float:left;box-sizing:border-box;width:33.3333333333%}.col-xxl-5[data-v-911495ca]{float:left;box-sizing:border-box;width:39.3333333334%;margin-left:4%}.col-xxl-5[data-v-911495ca]:first-child{margin-left:0}.col-offset-xxl-5[data-v-911495ca]{margin-left:43.3333333334%}.col-no-margin-xxl-5[data-v-911495ca]{float:left;box-sizing:border-box;width:41.6666666667%}.col-xxl-6[data-v-911495ca]{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-xxl-6[data-v-911495ca]:first-child{margin-left:0}.col-offset-xxl-6[data-v-911495ca]{margin-left:52%}.col-no-margin-xxl-6[data-v-911495ca]{float:left;box-sizing:border-box;width:50%}.col-xxl-7[data-v-911495ca]{float:left;box-sizing:border-box;width:56.6666666667%;margin-left:4%}.col-xxl-7[data-v-911495ca]:first-child{margin-left:0}.col-offset-xxl-7[data-v-911495ca]{margin-left:60.6666666667%}.col-no-margin-xxl-7[data-v-911495ca]{float:left;box-sizing:border-box;width:58.3333333333%}.col-xxl-8[data-v-911495ca]{float:left;box-sizing:border-box;width:65.3333333334%;margin-left:4%}.col-xxl-8[data-v-911495ca]:first-child{margin-left:0}.col-offset-xxl-8[data-v-911495ca]{margin-left:69.3333333334%}.col-no-margin-xxl-8[data-v-911495ca]{float:left;box-sizing:border-box;width:66.6666666667%}.col-xxl-9[data-v-911495ca]{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-xxl-9[data-v-911495ca]:first-child{margin-left:0}.col-offset-xxl-9[data-v-911495ca]{margin-left:78%}.col-no-margin-xxl-9[data-v-911495ca]{float:left;box-sizing:border-box;width:75%}.col-xxl-10[data-v-911495ca]{float:left;box-sizing:border-box;width:82.6666666667%;margin-left:4%}.col-xxl-10[data-v-911495ca]:first-child{margin-left:0}.col-offset-xxl-10[data-v-911495ca]{margin-left:86.6666666667%}.col-no-margin-xxl-10[data-v-911495ca]{float:left;box-sizing:border-box;width:83.3333333333%}.col-xxl-11[data-v-911495ca]{float:left;box-sizing:border-box;width:91.3333333334%;margin-left:4%}.col-xxl-11[data-v-911495ca]:first-child{margin-left:0}.col-offset-xxl-11[data-v-911495ca]{margin-left:95.3333333334%}.col-no-margin-xxl-11[data-v-911495ca]{float:left;box-sizing:border-box;width:91.6666666667%}.col-xxl-12[data-v-911495ca]{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-xxl-12[data-v-911495ca]:first-child{margin-left:0}.col-no-margin-xxl-12[data-v-911495ca]{float:left;box-sizing:border-box;width:100%}.xxl-hidden[data-v-911495ca]{display:none!important}.xxl-visible[data-v-911495ca]{display:block!important}}.vertical-center[data-v-911495ca]{display:flex;align-items:center}.horizontal-center[data-v-911495ca]{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.pull-right[data-v-911495ca]{display:inline-flex;text-align:right;justify-content:right;flex-grow:1}.hidden[data-v-911495ca]{display:none!important}.no-content[data-v-911495ca]{display:flex;font-size:1.5em;align-items:center;justify-content:center}.btn-default[data-v-911495ca],.btn[data-v-911495ca],button[data-v-911495ca]{border:1px solid #ccc;cursor:pointer;padding:.5em 1em;letter-spacing:.05em}.btn-default.btn-primary[data-v-911495ca],.btn-default[type=submit][data-v-911495ca],.btn.btn-primary[data-v-911495ca],.btn[type=submit][data-v-911495ca],button.btn-primary[data-v-911495ca],button[type=submit][data-v-911495ca]{background:linear-gradient(90deg,#c8ffd0,#d8efe8);color:#32b646;border:1px solid #98cfa0}.btn .icon[data-v-911495ca],.btn-default .icon[data-v-911495ca],button .icon[data-v-911495ca]{margin-right:.5em}input[type=password][data-v-911495ca],input[type=text][data-v-911495ca]{border:1px solid #ccc;border-radius:1em;padding:.5em}input[type=password][data-v-911495ca]:focus,input[type=text][data-v-911495ca]:focus{border:1px solid #35b870}button[data-v-911495ca],input[data-v-911495ca]{outline:none}input[type=text][data-v-911495ca]:hover,textarea[data-v-911495ca]:hover{border:1px solid #9cdfb0}ul[data-v-911495ca]{margin:0;padding:0;list-style:none}a[data-v-911495ca]{color:#5f7869;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:pointer}a[data-v-911495ca]:hover{color:#35b870}[data-v-911495ca]::-webkit-scrollbar{width:.75em}[data-v-911495ca]::-webkit-scrollbar-track{background:#e4e4e4;box-shadow:inset 1px 0 3px 0 #a5a2a2}[data-v-911495ca]::-webkit-scrollbar-thumb{background:#a5a2a2;border-radius:1em;cursor:pointer}body[data-v-911495ca]{scrollbar-width:thin;scrollbar-color:#a5a2a2 #e4e4e4}.input-icon[data-v-911495ca]{position:absolute;min-width:.3em;padding:.1em;color:#888}input[type=number][data-v-911495ca],input[type=password][data-v-911495ca],input[type=search][data-v-911495ca],input[type=text][data-v-911495ca]{border:1px solid #ddd;border-radius:.5em;padding:.25em}input[type=number][data-v-911495ca]:hover,input[type=password][data-v-911495ca]:hover,input[type=search][data-v-911495ca]:hover,input[type=text][data-v-911495ca]:hover{border:1px solid rgba(159,180,152,.83)}input[type=number][data-v-911495ca]:focus,input[type=password][data-v-911495ca]:focus,input[type=search][data-v-911495ca]:focus,input[type=text][data-v-911495ca]:focus{border:1px solid rgba(127,216,95,.83)}input[type=number].with-icon[data-v-911495ca],input[type=password].with-icon[data-v-911495ca],input[type=search].with-icon[data-v-911495ca],input[type=text].with-icon[data-v-911495ca]{padding-left:.3em}input[type=search][data-v-911495ca],input[type=text][data-v-911495ca]{border-radius:1em;padding:.25em .5em}.fade-in[data-v-911495ca]{animation-fill-mode:both;animation-name:fadeIn-911495ca;-webkit-animation-name:fadeIn-911495ca}.fade-in[data-v-911495ca],.fade-out[data-v-911495ca]{animation-duration:.5s;-webkit-animation-duration:.5s}.fade-out[data-v-911495ca]{animation-fill-mode:both;animation-name:fadeOut-911495ca;-webkit-animation-name:fadeOut-911495ca}@keyframes fadeIn-911495ca{0%{opacity:0}to{opacity:1}}@keyframes fadeOut-911495ca{0%{opacity:1}to{opacity:0;display:none}}.fa.fa-kodi[data-v-911495ca]:before{content:" ";background-size:1em 1em;width:1em;height:1em;display:inline-block;background:url(/static/img/kodi.d18f8d23.svg)}.fa.fa-plex[data-v-911495ca]:before{content:" ";background-size:1em 1em;width:1em;height:1em;display:inline-block;background:url(/static/img/plex.7a4e22a6.svg)}.fa.fa-jellyfin[data-v-911495ca]:before{content:" ";background-size:1em 1em;width:1em;height:1em;display:inline-block;background:url(/static/img/jellyfin.7b53a541.svg)}.sound[data-v-911495ca]{width:100%;height:90%;margin-top:7%;overflow:hidden;display:flex;flex-direction:column;align-items:center}.sound .sound-container[data-v-911495ca]{margin-bottom:1em} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/css/5193.47f020c5.css b/platypush/backend/http/webapp/dist/static/css/5193.47f020c5.css deleted file mode 100644 index 38b747e0..00000000 --- a/platypush/backend/http/webapp/dist/static/css/5193.47f020c5.css +++ /dev/null @@ -1 +0,0 @@ -.col-1[data-v-30d09191]{float:left;box-sizing:border-box;width:4.6666666667%;margin-left:4%}.col-1[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-1[data-v-30d09191]{float:left;box-sizing:border-box;width:8.3333333333%;margin:0}.col-offset-1[data-v-30d09191]:first-child{margin-left:8.6666666667%!important}.col-offset-1[data-v-30d09191]:not(first-child){margin-left:12.6666666667%!important}.col-2[data-v-30d09191]{float:left;box-sizing:border-box;width:13.3333333333%;margin-left:4%}.col-2[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-2[data-v-30d09191]{float:left;box-sizing:border-box;width:16.6666666667%;margin:0}.col-offset-2[data-v-30d09191]:first-child{margin-left:17.3333333333%!important}.col-offset-2[data-v-30d09191]:not(first-child){margin-left:21.3333333333%!important}.col-3[data-v-30d09191]{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-3[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-3[data-v-30d09191]{float:left;box-sizing:border-box;width:25%;margin:0}.col-offset-3[data-v-30d09191]:first-child{margin-left:26%!important}.col-offset-3[data-v-30d09191]:not(first-child){margin-left:30%!important}.col-4[data-v-30d09191]{float:left;box-sizing:border-box;width:30.6666666667%;margin-left:4%}.col-4[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-4[data-v-30d09191]{float:left;box-sizing:border-box;width:33.3333333333%;margin:0}.col-offset-4[data-v-30d09191]:first-child{margin-left:34.6666666667%!important}.col-offset-4[data-v-30d09191]:not(first-child){margin-left:38.6666666667%!important}.col-5[data-v-30d09191]{float:left;box-sizing:border-box;width:39.3333333334%;margin-left:4%}.col-5[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-5[data-v-30d09191]{float:left;box-sizing:border-box;width:41.6666666667%;margin:0}.col-offset-5[data-v-30d09191]:first-child{margin-left:43.3333333334%!important}.col-offset-5[data-v-30d09191]:not(first-child){margin-left:47.3333333334%!important}.col-6[data-v-30d09191]{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-6[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-6[data-v-30d09191]{float:left;box-sizing:border-box;width:50%;margin:0}.col-offset-6[data-v-30d09191]:first-child{margin-left:52%!important}.col-offset-6[data-v-30d09191]:not(first-child){margin-left:56%!important}.col-7[data-v-30d09191]{float:left;box-sizing:border-box;width:56.6666666667%;margin-left:4%}.col-7[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-7[data-v-30d09191]{float:left;box-sizing:border-box;width:58.3333333333%;margin:0}.col-offset-7[data-v-30d09191]:first-child{margin-left:60.6666666667%!important}.col-offset-7[data-v-30d09191]:not(first-child){margin-left:64.6666666667%!important}.col-8[data-v-30d09191]{float:left;box-sizing:border-box;width:65.3333333334%;margin-left:4%}.col-8[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-8[data-v-30d09191]{float:left;box-sizing:border-box;width:66.6666666667%;margin:0}.col-offset-8[data-v-30d09191]:first-child{margin-left:69.3333333334%!important}.col-offset-8[data-v-30d09191]:not(first-child){margin-left:73.3333333334%!important}.col-9[data-v-30d09191]{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-9[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-9[data-v-30d09191]{float:left;box-sizing:border-box;width:75%;margin:0}.col-offset-9[data-v-30d09191]:first-child{margin-left:78%!important}.col-offset-9[data-v-30d09191]:not(first-child){margin-left:82%!important}.col-10[data-v-30d09191]{float:left;box-sizing:border-box;width:82.6666666667%;margin-left:4%}.col-10[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-10[data-v-30d09191]{float:left;box-sizing:border-box;width:83.3333333333%;margin:0}.col-offset-10[data-v-30d09191]:first-child{margin-left:86.6666666667%!important}.col-offset-10[data-v-30d09191]:not(first-child){margin-left:90.6666666667%!important}.col-11[data-v-30d09191]{float:left;box-sizing:border-box;width:91.3333333334%;margin-left:4%}.col-11[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-11[data-v-30d09191]{float:left;box-sizing:border-box;width:91.6666666667%;margin:0}.col-offset-11[data-v-30d09191]:first-child{margin-left:95.3333333334%!important}.col-offset-11[data-v-30d09191]:not(first-child){margin-left:99.3333333334%!important}.col-12[data-v-30d09191]{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-12[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-12[data-v-30d09191]{float:left;box-sizing:border-box;width:100%;margin:0}@media screen and (max-width:calc(769px - 1px)){.col-s-1[data-v-30d09191]{float:left;box-sizing:border-box;width:4.6666666667%;margin-left:4%}.col-s-1[data-v-30d09191]:first-child{margin-left:0}.col-offset-s-1[data-v-30d09191]{margin-left:8.6666666667%}.col-no-margin-s-1[data-v-30d09191]{float:left;box-sizing:border-box;width:8.3333333333%}.col-s-2[data-v-30d09191]{float:left;box-sizing:border-box;width:13.3333333333%;margin-left:4%}.col-s-2[data-v-30d09191]:first-child{margin-left:0}.col-offset-s-2[data-v-30d09191]{margin-left:17.3333333333%}.col-no-margin-s-2[data-v-30d09191]{float:left;box-sizing:border-box;width:16.6666666667%}.col-s-3[data-v-30d09191]{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-s-3[data-v-30d09191]:first-child{margin-left:0}.col-offset-s-3[data-v-30d09191]{margin-left:26%}.col-no-margin-s-3[data-v-30d09191]{float:left;box-sizing:border-box;width:25%}.col-s-4[data-v-30d09191]{float:left;box-sizing:border-box;width:30.6666666667%;margin-left:4%}.col-s-4[data-v-30d09191]:first-child{margin-left:0}.col-offset-s-4[data-v-30d09191]{margin-left:34.6666666667%}.col-no-margin-s-4[data-v-30d09191]{float:left;box-sizing:border-box;width:33.3333333333%}.col-s-5[data-v-30d09191]{float:left;box-sizing:border-box;width:39.3333333334%;margin-left:4%}.col-s-5[data-v-30d09191]:first-child{margin-left:0}.col-offset-s-5[data-v-30d09191]{margin-left:43.3333333334%}.col-no-margin-s-5[data-v-30d09191]{float:left;box-sizing:border-box;width:41.6666666667%}.col-s-6[data-v-30d09191]{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-s-6[data-v-30d09191]:first-child{margin-left:0}.col-offset-s-6[data-v-30d09191]{margin-left:52%}.col-no-margin-s-6[data-v-30d09191]{float:left;box-sizing:border-box;width:50%}.col-s-7[data-v-30d09191]{float:left;box-sizing:border-box;width:56.6666666667%;margin-left:4%}.col-s-7[data-v-30d09191]:first-child{margin-left:0}.col-offset-s-7[data-v-30d09191]{margin-left:60.6666666667%}.col-no-margin-s-7[data-v-30d09191]{float:left;box-sizing:border-box;width:58.3333333333%}.col-s-8[data-v-30d09191]{float:left;box-sizing:border-box;width:65.3333333334%;margin-left:4%}.col-s-8[data-v-30d09191]:first-child{margin-left:0}.col-offset-s-8[data-v-30d09191]{margin-left:69.3333333334%}.col-no-margin-s-8[data-v-30d09191]{float:left;box-sizing:border-box;width:66.6666666667%}.col-s-9[data-v-30d09191]{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-s-9[data-v-30d09191]:first-child{margin-left:0}.col-offset-s-9[data-v-30d09191]{margin-left:78%}.col-no-margin-s-9[data-v-30d09191]{float:left;box-sizing:border-box;width:75%}.col-s-10[data-v-30d09191]{float:left;box-sizing:border-box;width:82.6666666667%;margin-left:4%}.col-s-10[data-v-30d09191]:first-child{margin-left:0}.col-offset-s-10[data-v-30d09191]{margin-left:86.6666666667%}.col-no-margin-s-10[data-v-30d09191]{float:left;box-sizing:border-box;width:83.3333333333%}.col-s-11[data-v-30d09191]{float:left;box-sizing:border-box;width:91.3333333334%;margin-left:4%}.col-s-11[data-v-30d09191]:first-child{margin-left:0}.col-offset-s-11[data-v-30d09191]{margin-left:95.3333333334%}.col-no-margin-s-11[data-v-30d09191]{float:left;box-sizing:border-box;width:91.6666666667%}.col-s-12[data-v-30d09191]{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-s-12[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-s-12[data-v-30d09191]{float:left;box-sizing:border-box;width:100%}.s-hidden[data-v-30d09191]{display:none!important}.s-visible[data-v-30d09191]{display:block!important}}@media screen and (min-width:769px){.col-m-1[data-v-30d09191]{float:left;box-sizing:border-box;width:4.6666666667%;margin-left:4%}.col-m-1[data-v-30d09191]:first-child{margin-left:0}.col-offset-m-1[data-v-30d09191]{margin-left:8.6666666667%}.col-no-margin-m-1[data-v-30d09191]{float:left;box-sizing:border-box;width:8.3333333333%}.col-m-2[data-v-30d09191]{float:left;box-sizing:border-box;width:13.3333333333%;margin-left:4%}.col-m-2[data-v-30d09191]:first-child{margin-left:0}.col-offset-m-2[data-v-30d09191]{margin-left:17.3333333333%}.col-no-margin-m-2[data-v-30d09191]{float:left;box-sizing:border-box;width:16.6666666667%}.col-m-3[data-v-30d09191]{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-m-3[data-v-30d09191]:first-child{margin-left:0}.col-offset-m-3[data-v-30d09191]{margin-left:26%}.col-no-margin-m-3[data-v-30d09191]{float:left;box-sizing:border-box;width:25%}.col-m-4[data-v-30d09191]{float:left;box-sizing:border-box;width:30.6666666667%;margin-left:4%}.col-m-4[data-v-30d09191]:first-child{margin-left:0}.col-offset-m-4[data-v-30d09191]{margin-left:34.6666666667%}.col-no-margin-m-4[data-v-30d09191]{float:left;box-sizing:border-box;width:33.3333333333%}.col-m-5[data-v-30d09191]{float:left;box-sizing:border-box;width:39.3333333334%;margin-left:4%}.col-m-5[data-v-30d09191]:first-child{margin-left:0}.col-offset-m-5[data-v-30d09191]{margin-left:43.3333333334%}.col-no-margin-m-5[data-v-30d09191]{float:left;box-sizing:border-box;width:41.6666666667%}.col-m-6[data-v-30d09191]{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-m-6[data-v-30d09191]:first-child{margin-left:0}.col-offset-m-6[data-v-30d09191]{margin-left:52%}.col-no-margin-m-6[data-v-30d09191]{float:left;box-sizing:border-box;width:50%}.col-m-7[data-v-30d09191]{float:left;box-sizing:border-box;width:56.6666666667%;margin-left:4%}.col-m-7[data-v-30d09191]:first-child{margin-left:0}.col-offset-m-7[data-v-30d09191]{margin-left:60.6666666667%}.col-no-margin-m-7[data-v-30d09191]{float:left;box-sizing:border-box;width:58.3333333333%}.col-m-8[data-v-30d09191]{float:left;box-sizing:border-box;width:65.3333333334%;margin-left:4%}.col-m-8[data-v-30d09191]:first-child{margin-left:0}.col-offset-m-8[data-v-30d09191]{margin-left:69.3333333334%}.col-no-margin-m-8[data-v-30d09191]{float:left;box-sizing:border-box;width:66.6666666667%}.col-m-9[data-v-30d09191]{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-m-9[data-v-30d09191]:first-child{margin-left:0}.col-offset-m-9[data-v-30d09191]{margin-left:78%}.col-no-margin-m-9[data-v-30d09191]{float:left;box-sizing:border-box;width:75%}.col-m-10[data-v-30d09191]{float:left;box-sizing:border-box;width:82.6666666667%;margin-left:4%}.col-m-10[data-v-30d09191]:first-child{margin-left:0}.col-offset-m-10[data-v-30d09191]{margin-left:86.6666666667%}.col-no-margin-m-10[data-v-30d09191]{float:left;box-sizing:border-box;width:83.3333333333%}.col-m-11[data-v-30d09191]{float:left;box-sizing:border-box;width:91.3333333334%;margin-left:4%}.col-m-11[data-v-30d09191]:first-child{margin-left:0}.col-offset-m-11[data-v-30d09191]{margin-left:95.3333333334%}.col-no-margin-m-11[data-v-30d09191]{float:left;box-sizing:border-box;width:91.6666666667%}.col-m-12[data-v-30d09191]{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-m-12[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-m-12[data-v-30d09191]{float:left;box-sizing:border-box;width:100%}.m-hidden[data-v-30d09191]{display:none!important}.m-visible[data-v-30d09191]{display:block!important}}@media screen and (min-width:1024px){.col-l-1[data-v-30d09191]{float:left;box-sizing:border-box;width:4.6666666667%;margin-left:4%}.col-l-1[data-v-30d09191]:first-child{margin-left:0}.col-offset-l-1[data-v-30d09191]{margin-left:8.6666666667%}.col-no-margin-l-1[data-v-30d09191]{float:left;box-sizing:border-box;width:8.3333333333%}.col-l-2[data-v-30d09191]{float:left;box-sizing:border-box;width:13.3333333333%;margin-left:4%}.col-l-2[data-v-30d09191]:first-child{margin-left:0}.col-offset-l-2[data-v-30d09191]{margin-left:17.3333333333%}.col-no-margin-l-2[data-v-30d09191]{float:left;box-sizing:border-box;width:16.6666666667%}.col-l-3[data-v-30d09191]{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-l-3[data-v-30d09191]:first-child{margin-left:0}.col-offset-l-3[data-v-30d09191]{margin-left:26%}.col-no-margin-l-3[data-v-30d09191]{float:left;box-sizing:border-box;width:25%}.col-l-4[data-v-30d09191]{float:left;box-sizing:border-box;width:30.6666666667%;margin-left:4%}.col-l-4[data-v-30d09191]:first-child{margin-left:0}.col-offset-l-4[data-v-30d09191]{margin-left:34.6666666667%}.col-no-margin-l-4[data-v-30d09191]{float:left;box-sizing:border-box;width:33.3333333333%}.col-l-5[data-v-30d09191]{float:left;box-sizing:border-box;width:39.3333333334%;margin-left:4%}.col-l-5[data-v-30d09191]:first-child{margin-left:0}.col-offset-l-5[data-v-30d09191]{margin-left:43.3333333334%}.col-no-margin-l-5[data-v-30d09191]{float:left;box-sizing:border-box;width:41.6666666667%}.col-l-6[data-v-30d09191]{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-l-6[data-v-30d09191]:first-child{margin-left:0}.col-offset-l-6[data-v-30d09191]{margin-left:52%}.col-no-margin-l-6[data-v-30d09191]{float:left;box-sizing:border-box;width:50%}.col-l-7[data-v-30d09191]{float:left;box-sizing:border-box;width:56.6666666667%;margin-left:4%}.col-l-7[data-v-30d09191]:first-child{margin-left:0}.col-offset-l-7[data-v-30d09191]{margin-left:60.6666666667%}.col-no-margin-l-7[data-v-30d09191]{float:left;box-sizing:border-box;width:58.3333333333%}.col-l-8[data-v-30d09191]{float:left;box-sizing:border-box;width:65.3333333334%;margin-left:4%}.col-l-8[data-v-30d09191]:first-child{margin-left:0}.col-offset-l-8[data-v-30d09191]{margin-left:69.3333333334%}.col-no-margin-l-8[data-v-30d09191]{float:left;box-sizing:border-box;width:66.6666666667%}.col-l-9[data-v-30d09191]{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-l-9[data-v-30d09191]:first-child{margin-left:0}.col-offset-l-9[data-v-30d09191]{margin-left:78%}.col-no-margin-l-9[data-v-30d09191]{float:left;box-sizing:border-box;width:75%}.col-l-10[data-v-30d09191]{float:left;box-sizing:border-box;width:82.6666666667%;margin-left:4%}.col-l-10[data-v-30d09191]:first-child{margin-left:0}.col-offset-l-10[data-v-30d09191]{margin-left:86.6666666667%}.col-no-margin-l-10[data-v-30d09191]{float:left;box-sizing:border-box;width:83.3333333333%}.col-l-11[data-v-30d09191]{float:left;box-sizing:border-box;width:91.3333333334%;margin-left:4%}.col-l-11[data-v-30d09191]:first-child{margin-left:0}.col-offset-l-11[data-v-30d09191]{margin-left:95.3333333334%}.col-no-margin-l-11[data-v-30d09191]{float:left;box-sizing:border-box;width:91.6666666667%}.col-l-12[data-v-30d09191]{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-l-12[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-l-12[data-v-30d09191]{float:left;box-sizing:border-box;width:100%}.l-hidden[data-v-30d09191]{display:none!important}.l-visible[data-v-30d09191]{display:block!important}}@media screen and (min-width:1216px){.col-xl-1[data-v-30d09191]{float:left;box-sizing:border-box;width:4.6666666667%;margin-left:4%}.col-xl-1[data-v-30d09191]:first-child{margin-left:0}.col-offset-xl-1[data-v-30d09191]{margin-left:8.6666666667%}.col-no-margin-xl-1[data-v-30d09191]{float:left;box-sizing:border-box;width:8.3333333333%}.col-xl-2[data-v-30d09191]{float:left;box-sizing:border-box;width:13.3333333333%;margin-left:4%}.col-xl-2[data-v-30d09191]:first-child{margin-left:0}.col-offset-xl-2[data-v-30d09191]{margin-left:17.3333333333%}.col-no-margin-xl-2[data-v-30d09191]{float:left;box-sizing:border-box;width:16.6666666667%}.col-xl-3[data-v-30d09191]{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-xl-3[data-v-30d09191]:first-child{margin-left:0}.col-offset-xl-3[data-v-30d09191]{margin-left:26%}.col-no-margin-xl-3[data-v-30d09191]{float:left;box-sizing:border-box;width:25%}.col-xl-4[data-v-30d09191]{float:left;box-sizing:border-box;width:30.6666666667%;margin-left:4%}.col-xl-4[data-v-30d09191]:first-child{margin-left:0}.col-offset-xl-4[data-v-30d09191]{margin-left:34.6666666667%}.col-no-margin-xl-4[data-v-30d09191]{float:left;box-sizing:border-box;width:33.3333333333%}.col-xl-5[data-v-30d09191]{float:left;box-sizing:border-box;width:39.3333333334%;margin-left:4%}.col-xl-5[data-v-30d09191]:first-child{margin-left:0}.col-offset-xl-5[data-v-30d09191]{margin-left:43.3333333334%}.col-no-margin-xl-5[data-v-30d09191]{float:left;box-sizing:border-box;width:41.6666666667%}.col-xl-6[data-v-30d09191]{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-xl-6[data-v-30d09191]:first-child{margin-left:0}.col-offset-xl-6[data-v-30d09191]{margin-left:52%}.col-no-margin-xl-6[data-v-30d09191]{float:left;box-sizing:border-box;width:50%}.col-xl-7[data-v-30d09191]{float:left;box-sizing:border-box;width:56.6666666667%;margin-left:4%}.col-xl-7[data-v-30d09191]:first-child{margin-left:0}.col-offset-xl-7[data-v-30d09191]{margin-left:60.6666666667%}.col-no-margin-xl-7[data-v-30d09191]{float:left;box-sizing:border-box;width:58.3333333333%}.col-xl-8[data-v-30d09191]{float:left;box-sizing:border-box;width:65.3333333334%;margin-left:4%}.col-xl-8[data-v-30d09191]:first-child{margin-left:0}.col-offset-xl-8[data-v-30d09191]{margin-left:69.3333333334%}.col-no-margin-xl-8[data-v-30d09191]{float:left;box-sizing:border-box;width:66.6666666667%}.col-xl-9[data-v-30d09191]{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-xl-9[data-v-30d09191]:first-child{margin-left:0}.col-offset-xl-9[data-v-30d09191]{margin-left:78%}.col-no-margin-xl-9[data-v-30d09191]{float:left;box-sizing:border-box;width:75%}.col-xl-10[data-v-30d09191]{float:left;box-sizing:border-box;width:82.6666666667%;margin-left:4%}.col-xl-10[data-v-30d09191]:first-child{margin-left:0}.col-offset-xl-10[data-v-30d09191]{margin-left:86.6666666667%}.col-no-margin-xl-10[data-v-30d09191]{float:left;box-sizing:border-box;width:83.3333333333%}.col-xl-11[data-v-30d09191]{float:left;box-sizing:border-box;width:91.3333333334%;margin-left:4%}.col-xl-11[data-v-30d09191]:first-child{margin-left:0}.col-offset-xl-11[data-v-30d09191]{margin-left:95.3333333334%}.col-no-margin-xl-11[data-v-30d09191]{float:left;box-sizing:border-box;width:91.6666666667%}.col-xl-12[data-v-30d09191]{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-xl-12[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-xl-12[data-v-30d09191]{float:left;box-sizing:border-box;width:100%}.xl-hidden[data-v-30d09191]{display:none!important}.xl-visible[data-v-30d09191]{display:block!important}}@media screen and (min-width:1408px){.col-xxl-1[data-v-30d09191]{float:left;box-sizing:border-box;width:4.6666666667%;margin-left:4%}.col-xxl-1[data-v-30d09191]:first-child{margin-left:0}.col-offset-xxl-1[data-v-30d09191]{margin-left:8.6666666667%}.col-no-margin-xxl-1[data-v-30d09191]{float:left;box-sizing:border-box;width:8.3333333333%}.col-xxl-2[data-v-30d09191]{float:left;box-sizing:border-box;width:13.3333333333%;margin-left:4%}.col-xxl-2[data-v-30d09191]:first-child{margin-left:0}.col-offset-xxl-2[data-v-30d09191]{margin-left:17.3333333333%}.col-no-margin-xxl-2[data-v-30d09191]{float:left;box-sizing:border-box;width:16.6666666667%}.col-xxl-3[data-v-30d09191]{float:left;box-sizing:border-box;width:22%;margin-left:4%}.col-xxl-3[data-v-30d09191]:first-child{margin-left:0}.col-offset-xxl-3[data-v-30d09191]{margin-left:26%}.col-no-margin-xxl-3[data-v-30d09191]{float:left;box-sizing:border-box;width:25%}.col-xxl-4[data-v-30d09191]{float:left;box-sizing:border-box;width:30.6666666667%;margin-left:4%}.col-xxl-4[data-v-30d09191]:first-child{margin-left:0}.col-offset-xxl-4[data-v-30d09191]{margin-left:34.6666666667%}.col-no-margin-xxl-4[data-v-30d09191]{float:left;box-sizing:border-box;width:33.3333333333%}.col-xxl-5[data-v-30d09191]{float:left;box-sizing:border-box;width:39.3333333334%;margin-left:4%}.col-xxl-5[data-v-30d09191]:first-child{margin-left:0}.col-offset-xxl-5[data-v-30d09191]{margin-left:43.3333333334%}.col-no-margin-xxl-5[data-v-30d09191]{float:left;box-sizing:border-box;width:41.6666666667%}.col-xxl-6[data-v-30d09191]{float:left;box-sizing:border-box;width:48%;margin-left:4%}.col-xxl-6[data-v-30d09191]:first-child{margin-left:0}.col-offset-xxl-6[data-v-30d09191]{margin-left:52%}.col-no-margin-xxl-6[data-v-30d09191]{float:left;box-sizing:border-box;width:50%}.col-xxl-7[data-v-30d09191]{float:left;box-sizing:border-box;width:56.6666666667%;margin-left:4%}.col-xxl-7[data-v-30d09191]:first-child{margin-left:0}.col-offset-xxl-7[data-v-30d09191]{margin-left:60.6666666667%}.col-no-margin-xxl-7[data-v-30d09191]{float:left;box-sizing:border-box;width:58.3333333333%}.col-xxl-8[data-v-30d09191]{float:left;box-sizing:border-box;width:65.3333333334%;margin-left:4%}.col-xxl-8[data-v-30d09191]:first-child{margin-left:0}.col-offset-xxl-8[data-v-30d09191]{margin-left:69.3333333334%}.col-no-margin-xxl-8[data-v-30d09191]{float:left;box-sizing:border-box;width:66.6666666667%}.col-xxl-9[data-v-30d09191]{float:left;box-sizing:border-box;width:74%;margin-left:4%}.col-xxl-9[data-v-30d09191]:first-child{margin-left:0}.col-offset-xxl-9[data-v-30d09191]{margin-left:78%}.col-no-margin-xxl-9[data-v-30d09191]{float:left;box-sizing:border-box;width:75%}.col-xxl-10[data-v-30d09191]{float:left;box-sizing:border-box;width:82.6666666667%;margin-left:4%}.col-xxl-10[data-v-30d09191]:first-child{margin-left:0}.col-offset-xxl-10[data-v-30d09191]{margin-left:86.6666666667%}.col-no-margin-xxl-10[data-v-30d09191]{float:left;box-sizing:border-box;width:83.3333333333%}.col-xxl-11[data-v-30d09191]{float:left;box-sizing:border-box;width:91.3333333334%;margin-left:4%}.col-xxl-11[data-v-30d09191]:first-child{margin-left:0}.col-offset-xxl-11[data-v-30d09191]{margin-left:95.3333333334%}.col-no-margin-xxl-11[data-v-30d09191]{float:left;box-sizing:border-box;width:91.6666666667%}.col-xxl-12[data-v-30d09191]{float:left;box-sizing:border-box;width:100%;margin-left:0}.col-xxl-12[data-v-30d09191]:first-child{margin-left:0}.col-no-margin-xxl-12[data-v-30d09191]{float:left;box-sizing:border-box;width:100%}.xxl-hidden[data-v-30d09191]{display:none!important}.xxl-visible[data-v-30d09191]{display:block!important}}.vertical-center[data-v-30d09191]{display:flex;align-items:center}.horizontal-center[data-v-30d09191]{display:flex;justify-content:center;margin-left:auto;margin-right:auto}.pull-right[data-v-30d09191]{display:inline-flex;text-align:right;justify-content:right;flex-grow:1}.hidden[data-v-30d09191]{display:none!important}.no-content[data-v-30d09191]{display:flex;font-size:1.5em;align-items:center;justify-content:center}.btn-default[data-v-30d09191],.btn[data-v-30d09191],button[data-v-30d09191]{border:1px solid #ccc;cursor:pointer;padding:.5em 1em;letter-spacing:.05em}.btn-default.btn-primary[data-v-30d09191],.btn-default[type=submit][data-v-30d09191],.btn.btn-primary[data-v-30d09191],.btn[type=submit][data-v-30d09191],button.btn-primary[data-v-30d09191],button[type=submit][data-v-30d09191]{background:linear-gradient(90deg,#c8ffd0,#d8efe8);color:#32b646;border:1px solid #98cfa0}.btn .icon[data-v-30d09191],.btn-default .icon[data-v-30d09191],button .icon[data-v-30d09191]{margin-right:.5em}input[type=password][data-v-30d09191],input[type=text][data-v-30d09191]{border:1px solid #ccc;border-radius:1em;padding:.5em}input[type=password][data-v-30d09191]:focus,input[type=text][data-v-30d09191]:focus{border:1px solid #35b870}button[data-v-30d09191],input[data-v-30d09191]{outline:none}input[type=text][data-v-30d09191]:hover,textarea[data-v-30d09191]:hover{border:1px solid #9cdfb0}ul[data-v-30d09191]{margin:0;padding:0;list-style:none}a[data-v-30d09191]{color:#5f7869;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:pointer}a[data-v-30d09191]:hover{color:#35b870}[data-v-30d09191]::-webkit-scrollbar{width:.75em}[data-v-30d09191]::-webkit-scrollbar-track{background:#e4e4e4;box-shadow:inset 1px 0 3px 0 #a5a2a2}[data-v-30d09191]::-webkit-scrollbar-thumb{background:#a5a2a2;border-radius:1em;cursor:pointer}body[data-v-30d09191]{scrollbar-width:thin;scrollbar-color:#a5a2a2 #e4e4e4}.input-icon[data-v-30d09191]{position:absolute;min-width:.3em;padding:.1em;color:#888}input[type=number][data-v-30d09191],input[type=password][data-v-30d09191],input[type=search][data-v-30d09191],input[type=text][data-v-30d09191]{border:1px solid #ddd;border-radius:.5em;padding:.25em}input[type=number][data-v-30d09191]:hover,input[type=password][data-v-30d09191]:hover,input[type=search][data-v-30d09191]:hover,input[type=text][data-v-30d09191]:hover{border:1px solid rgba(159,180,152,.83)}input[type=number][data-v-30d09191]:focus,input[type=password][data-v-30d09191]:focus,input[type=search][data-v-30d09191]:focus,input[type=text][data-v-30d09191]:focus{border:1px solid rgba(127,216,95,.83)}input[type=number].with-icon[data-v-30d09191],input[type=password].with-icon[data-v-30d09191],input[type=search].with-icon[data-v-30d09191],input[type=text].with-icon[data-v-30d09191]{padding-left:.3em}input[type=search][data-v-30d09191],input[type=text][data-v-30d09191]{border-radius:1em;padding:.25em .5em}.fade-in[data-v-30d09191]{animation-fill-mode:both;animation-name:fadeIn-30d09191;-webkit-animation-name:fadeIn-30d09191}.fade-in[data-v-30d09191],.fade-out[data-v-30d09191]{animation-duration:.5s;-webkit-animation-duration:.5s}.fade-out[data-v-30d09191]{animation-fill-mode:both;animation-name:fadeOut-30d09191;-webkit-animation-name:fadeOut-30d09191}@keyframes fadeIn-30d09191{0%{opacity:0}to{opacity:1}}@keyframes fadeOut-30d09191{0%{opacity:1}to{opacity:0;display:none}}.fa.fa-kodi[data-v-30d09191]:before{content:" ";background-size:1em 1em;width:1em;height:1em;display:inline-block;background:url(/static/img/kodi.d18f8d23.svg)}.fa.fa-plex[data-v-30d09191]:before{content:" ";background-size:1em 1em;width:1em;height:1em;display:inline-block;background:url(/static/img/plex.7a4e22a6.svg)}.fa.fa-jellyfin[data-v-30d09191]:before{content:" ";background-size:1em 1em;width:1em;height:1em;display:inline-block;background:url(/static/img/jellyfin.7b53a541.svg)}.sound[data-v-30d09191]{width:100%;height:90%;margin-top:7%;overflow:hidden;display:flex;flex-direction:column;align-items:center}.sound .sound-container[data-v-30d09191]{margin-bottom:1em} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/css/2989.22b025de.css b/platypush/backend/http/webapp/dist/static/css/5465.22b025de.css similarity index 100% rename from platypush/backend/http/webapp/dist/static/css/2989.22b025de.css rename to platypush/backend/http/webapp/dist/static/css/5465.22b025de.css diff --git a/platypush/backend/http/webapp/dist/static/css/5528.22b025de.css b/platypush/backend/http/webapp/dist/static/css/8200.22b025de.css similarity index 100% rename from platypush/backend/http/webapp/dist/static/css/5528.22b025de.css rename to platypush/backend/http/webapp/dist/static/css/8200.22b025de.css diff --git a/platypush/backend/http/webapp/dist/static/js/4118-legacy.fdfd71bc.js b/platypush/backend/http/webapp/dist/static/js/4118-legacy.fdfd71bc.js new file mode 100644 index 00000000..acae2abe --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/4118-legacy.fdfd71bc.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[4118],{4118:function(n,t,r){r.r(t),r.d(t,{default:function(){return b}});var e=r(6252),o=function(n){return(0,e.dD)("data-v-911495ca"),n=n(),(0,e.Cn)(),n},a={class:"sound"},u={class:"sound-container"},i={key:0,autoplay:"",preload:"none",ref:"player"},s=["src"],c=(0,e.Uk)(" Your browser does not support audio elements "),d={class:"controls"},p=o((function(){return(0,e._)("i",{class:"fa fa-play"},null,-1)})),l=(0,e.Uk)("  Start streaming audio "),f=[p,l],g=o((function(){return(0,e._)("i",{class:"fa fa-stop"},null,-1)})),k=(0,e.Uk)("  Stop streaming audio "),y=[g,k];function m(n,t,r,o,p,l){return(0,e.wg)(),(0,e.iD)("div",a,[(0,e._)("div",u,[p.recording?((0,e.wg)(),(0,e.iD)("audio",i,[(0,e._)("source",{src:"/sound/stream.aac?t=".concat((new Date).getTime())},null,8,s),c],512)):(0,e.kq)("",!0)]),(0,e._)("div",d,[p.recording?((0,e.wg)(),(0,e.iD)("button",{key:1,type:"button",onClick:t[1]||(t[1]=function(){return l.stopRecording&&l.stopRecording.apply(l,arguments)})},y)):((0,e.wg)(),(0,e.iD)("button",{key:0,type:"button",onClick:t[0]||(t[0]=function(){return l.startRecording&&l.startRecording.apply(l,arguments)})},f))])])}var w=r(8534),h=(r(5666),r(6813)),v={name:"Sound",mixins:[h.Z],data:function(){return{recording:!1}},methods:{startRecording:function(){this.recording=!0},stopRecording:function(){var n=this;return(0,w.Z)(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return n.recording=!1,t.next=3,n.request("sound.stop_recording");case 3:case"end":return t.stop()}}),t)})))()}}},R=r(3744);const _=(0,R.Z)(v,[["render",m],["__scopeId","data-v-911495ca"]]);var b=_}}]); +//# sourceMappingURL=4118-legacy.fdfd71bc.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/4118-legacy.fdfd71bc.js.map b/platypush/backend/http/webapp/dist/static/js/4118-legacy.fdfd71bc.js.map new file mode 100644 index 00000000..90778896 --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/4118-legacy.fdfd71bc.js.map @@ -0,0 +1 @@ +{"version":3,"file":"static/js/4118-legacy.fdfd71bc.js","mappings":"oPACOA,MAAM,S,GACJA,MAAM,mB,SACFC,SAAA,GAASC,QAAQ,OAAOC,IAAI,U,qBAC8B,kD,GAK9DH,MAAM,Y,uBAEP,OAA0B,KAAvBA,MAAM,cAAY,Q,eAAK,4B,GAA1B,K,uBAIA,OAA0B,KAAvBA,MAAM,cAAY,Q,eAAK,2B,GAA1B,K,0CAdN,QAiBM,MAjBN,EAiBM,EAhBJ,OAKM,MALN,EAKM,CAJ8C,EAAAI,YAAA,WAAlD,QAGQ,QAHR,EAGQ,EAFN,OAA+D,UAAtDC,IAAG,mCAA8BC,MAAQC,YAAlD,UAEM,GAHR,yBAMF,OAQM,MARN,EAQM,CAPiD,EAAAH,YAArD,WAIA,QAES,U,MAFDI,KAAK,SAAU,QAAK,8BAAE,EAAAC,eAAA,EAAAA,cAAA,kBAAF,IAA5B,MAJqD,WAArD,QAES,U,MAFDD,KAAK,SAAU,QAAK,8BAAE,EAAAE,gBAAA,EAAAA,eAAA,kBAAF,IAA5B,O,mCAcN,GACEC,KAAM,QACNC,OAAQ,CAACC,EAAA,GAETC,KAJa,WAKX,MAAO,CACLV,WAAW,EAEd,EAEDW,QAAS,CACPL,eADO,WAELM,KAAKZ,WAAY,CAClB,EAEKK,cALC,WAKe,uJACpB,EAAKL,WAAY,EADG,SAEd,EAAKa,QAAQ,wBAFC,4CAGrB,I,UCnCL,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,GAAQ,CAAC,YAAY,qBAEzF,O","sources":["webpack://platypush/./src/components/panels/Sound/Index.vue","webpack://platypush/./src/components/panels/Sound/Index.vue?0677"],"sourcesContent":["\n\n\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=911495ca&scoped=true\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=911495ca&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-911495ca\"]])\n\nexport default __exports__"],"names":["class","autoplay","preload","ref","recording","src","Date","getTime","type","stopRecording","startRecording","name","mixins","Utils","data","methods","this","request","__exports__","render"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/4118.eb9d25ca.js b/platypush/backend/http/webapp/dist/static/js/4118.eb9d25ca.js new file mode 100644 index 00000000..3c69d682 --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/4118.eb9d25ca.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[4118],{4118:function(t,n,o){o.r(n),o.d(n,{default:function(){return b}});var e=o(6252);const r=t=>((0,e.dD)("data-v-911495ca"),t=t(),(0,e.Cn)(),t),s={class:"sound"},a={class:"sound-container"},i={key:0,autoplay:"",preload:"none",ref:"player"},c=["src"],d=(0,e.Uk)(" Your browser does not support audio elements "),u={class:"controls"},l=r((()=>(0,e._)("i",{class:"fa fa-play"},null,-1))),p=(0,e.Uk)("  Start streaming audio "),g=[l,p],k=r((()=>(0,e._)("i",{class:"fa fa-stop"},null,-1))),f=(0,e.Uk)("  Stop streaming audio "),y=[k,f];function h(t,n,o,r,l,p){return(0,e.wg)(),(0,e.iD)("div",s,[(0,e._)("div",a,[l.recording?((0,e.wg)(),(0,e.iD)("audio",i,[(0,e._)("source",{src:`/sound/stream.aac?t=${(new Date).getTime()}`},null,8,c),d],512)):(0,e.kq)("",!0)]),(0,e._)("div",u,[l.recording?((0,e.wg)(),(0,e.iD)("button",{key:1,type:"button",onClick:n[1]||(n[1]=(...t)=>p.stopRecording&&p.stopRecording(...t))},y)):((0,e.wg)(),(0,e.iD)("button",{key:0,type:"button",onClick:n[0]||(n[0]=(...t)=>p.startRecording&&p.startRecording(...t))},g))])])}var w=o(6813),m={name:"Sound",mixins:[w.Z],data(){return{recording:!1}},methods:{startRecording(){this.recording=!0},async stopRecording(){this.recording=!1,await this.request("sound.stop_recording")}}},v=o(3744);const _=(0,v.Z)(m,[["render",h],["__scopeId","data-v-911495ca"]]);var b=_}}]); +//# sourceMappingURL=4118.eb9d25ca.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/4118.eb9d25ca.js.map b/platypush/backend/http/webapp/dist/static/js/4118.eb9d25ca.js.map new file mode 100644 index 00000000..765db9ae --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/4118.eb9d25ca.js.map @@ -0,0 +1 @@ +{"version":3,"file":"static/js/4118.eb9d25ca.js","mappings":"4OACOA,MAAM,S,GACJA,MAAM,mB,SACFC,SAAA,GAASC,QAAQ,OAAOC,IAAI,U,qBAC8B,kD,GAK9DH,MAAM,Y,UAEP,OAA0B,KAAvBA,MAAM,cAAY,W,WAAK,4B,GAA1B,K,UAIA,OAA0B,KAAvBA,MAAM,cAAY,W,WAAK,2B,GAA1B,K,0CAdN,QAiBM,MAjBN,EAiBM,EAhBJ,OAKM,MALN,EAKM,CAJ8C,EAAAI,YAAA,WAAlD,QAGQ,QAHR,EAGQ,EAFN,OAA+D,UAAtDC,IAAG,4BAA8BC,MAAQC,aAAlD,UAEM,GAHR,yBAMF,OAQM,MARN,EAQM,CAPiD,EAAAH,YAArD,WAIA,QAES,U,MAFDI,KAAK,SAAU,QAAK,oBAAE,EAAAC,eAAA,EAAAA,iBAAA,KAA9B,MAJqD,WAArD,QAES,U,MAFDD,KAAK,SAAU,QAAK,oBAAE,EAAAE,gBAAA,EAAAA,kBAAA,KAA9B,O,eAcN,GACEC,KAAM,QACNC,OAAQ,CAACC,EAAA,GAETC,OACE,MAAO,CACLV,WAAW,EAEd,EAEDW,QAAS,CACPL,iBACEM,KAAKZ,WAAY,CAClB,EAEDa,sBACED,KAAKZ,WAAY,QACXY,KAAKE,QAAQ,uBACpB,I,UCnCL,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,GAAQ,CAAC,YAAY,qBAEzF,O","sources":["webpack://platypush/./src/components/panels/Sound/Index.vue","webpack://platypush/./src/components/panels/Sound/Index.vue?0677"],"sourcesContent":["\n\n\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=911495ca&scoped=true\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=911495ca&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-911495ca\"]])\n\nexport default __exports__"],"names":["class","autoplay","preload","ref","recording","src","Date","getTime","type","stopRecording","startRecording","name","mixins","Utils","data","methods","this","async","request","__exports__","render"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/4548-legacy.e2883bdd.js b/platypush/backend/http/webapp/dist/static/js/4548-legacy.7f4c9c3f.js similarity index 74% rename from platypush/backend/http/webapp/dist/static/js/4548-legacy.e2883bdd.js rename to platypush/backend/http/webapp/dist/static/js/4548-legacy.7f4c9c3f.js index d5a1b6a6..2cdab8bb 100644 --- a/platypush/backend/http/webapp/dist/static/js/4548-legacy.e2883bdd.js +++ b/platypush/backend/http/webapp/dist/static/js/4548-legacy.7f4c9c3f.js @@ -1,2 +1,2 @@ -"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[4548],{4548:function(a,e,n){n.r(e),n.d(e,{default:function(){return f}});var r=n(6252);function u(a,e,n,u,t,p){var c=(0,r.up)("Camera");return(0,r.wg)(),(0,r.j4)(c,{"camera-plugin":"pi"})}var t=n(5528),p={name:"CameraPi",components:{Camera:t["default"]}},c=n(3744);const s=(0,c.Z)(p,[["render",u]]);var f=s}}]); -//# sourceMappingURL=4548-legacy.e2883bdd.js.map \ No newline at end of file +"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[4548],{4548:function(a,e,n){n.r(e),n.d(e,{default:function(){return f}});var r=n(6252);function u(a,e,n,u,t,p){var c=(0,r.up)("Camera");return(0,r.wg)(),(0,r.j4)(c,{"camera-plugin":"pi"})}var t=n(9021),p={name:"CameraPi",components:{Camera:t["default"]}},c=n(3744);const s=(0,c.Z)(p,[["render",u]]);var f=s}}]); +//# sourceMappingURL=4548-legacy.7f4c9c3f.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/4548-legacy.e2883bdd.js.map b/platypush/backend/http/webapp/dist/static/js/4548-legacy.7f4c9c3f.js.map similarity index 94% rename from platypush/backend/http/webapp/dist/static/js/4548-legacy.e2883bdd.js.map rename to platypush/backend/http/webapp/dist/static/js/4548-legacy.7f4c9c3f.js.map index d9a8427f..45c4269f 100644 --- a/platypush/backend/http/webapp/dist/static/js/4548-legacy.e2883bdd.js.map +++ b/platypush/backend/http/webapp/dist/static/js/4548-legacy.7f4c9c3f.js.map @@ -1 +1 @@ -{"version":3,"file":"static/js/4548-legacy.e2883bdd.js","mappings":"gPACE,QAA6B,GAArB,gBAAc,M,eAMxB,GACEA,KAAM,WACNC,WAAY,CAACC,OAAA,e,UCJf,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,KAEpE,O","sources":["webpack://platypush/./src/components/panels/CameraPi/Index.vue","webpack://platypush/./src/components/panels/CameraPi/Index.vue?7074"],"sourcesContent":["\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=6f4a0590\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["name","components","Camera","__exports__","render"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"static/js/4548-legacy.7f4c9c3f.js","mappings":"gPACE,QAA6B,GAArB,gBAAc,M,eAMxB,GACEA,KAAM,WACNC,WAAY,CAACC,OAAA,e,UCJf,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,KAEpE,O","sources":["webpack://platypush/./src/components/panels/CameraPi/Index.vue","webpack://platypush/./src/components/panels/CameraPi/Index.vue?7074"],"sourcesContent":["\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=6f4a0590\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["name","components","Camera","__exports__","render"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/4548.75a2e6f8.js b/platypush/backend/http/webapp/dist/static/js/4548.75a2e6f8.js new file mode 100644 index 00000000..b2055ba2 --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/4548.75a2e6f8.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[4548,5465],{9021:function(a,t,e){e.r(t),e.d(t,{default:function(){return ha}});var s=e(6252),n=e(9963);const i={class:"camera"},r={class:"camera-container"},l={class:"frame-container",ref:"frameContainer"},o={key:0,class:"no-frame"},c=["src"],u={class:"controls"},p={class:"left"},h=["disabled"],d=(0,s._)("i",{class:"fa fa-play"},null,-1),m=[d],g=["disabled"],_=(0,s._)("i",{class:"fa fa-stop"},null,-1),f=[_],y=["disabled"],C=(0,s._)("i",{class:"fas fa-camera"},null,-1),w=[C],v={class:"right"},b=(0,s._)("i",{class:"fas fa-volume-mute"},null,-1),S=[b],k=(0,s._)("i",{class:"fas fa-volume-up"},null,-1),z=[k],x=(0,s._)("i",{class:"fas fa-cog"},null,-1),F=[x],U={class:"audio-container"},$={key:0,autoplay:"",preload:"none",ref:"player"},D=["src"],M=(0,s.Uk)(" Your browser does not support audio elements "),V={key:0,class:"url"},P={class:"row"},q=(0,s._)("span",{class:"name"},"Stream URL",-1),A=["value"],L={class:"params"},O={class:"row"},j=(0,s._)("span",{class:"name"},"Device",-1),G={class:"row"},I=(0,s._)("span",{class:"name"},"Width",-1),R={class:"row"},T=(0,s._)("span",{class:"name"},"Height",-1),Z={class:"row"},W=(0,s._)("span",{class:"name"},"Horizontal Flip",-1),H={class:"row"},Y=(0,s._)("span",{class:"name"},"Vertical Flip",-1),E={class:"row"},X=(0,s._)("span",{class:"name"},"Rotate",-1),B={class:"row"},J=(0,s._)("span",{class:"name"},"Scale-X",-1),K={class:"row"},N=(0,s._)("span",{class:"name"},"Scale-Y",-1),Q={class:"row"},aa=(0,s._)("span",{class:"name"},"Frames per second",-1),ta={class:"row"},ea=(0,s._)("span",{class:"name"},"Grayscale",-1);function sa(a,t,e,d,_,C){const b=(0,s.up)("Slot"),k=(0,s.up)("Modal");return(0,s.wg)(),(0,s.iD)("div",i,[(0,s._)("div",r,[(0,s._)("div",l,[a.streaming||a.capturing||a.captured?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("div",o,"The camera is not active")),(0,s._)("img",{class:"frame",src:a.url,ref:"frame",alt:""},null,8,c)],512),(0,s._)("div",u,[(0,s._)("div",p,[a.streaming?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[1]||(t[1]=(...t)=>a.stopStreaming&&a.stopStreaming(...t)),disabled:a.capturing,title:"Stop video"},f,8,g)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[0]||(t[0]=(...a)=>C.startStreaming&&C.startStreaming(...a)),disabled:a.capturing,title:"Start video"},m,8,h)),a.streaming?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("button",{key:2,type:"button",onClick:t[2]||(t[2]=(...a)=>C.capture&&C.capture(...a)),disabled:a.streaming||a.capturing,title:"Take a picture"},w,8,y))]),(0,s._)("div",v,[a.audioOn?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[4]||(t[4]=(...t)=>a.stopAudio&&a.stopAudio(...t)),title:"Stop audio"},z)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[3]||(t[3]=(...t)=>a.startAudio&&a.startAudio(...t)),title:"Start audio"},S)),(0,s._)("button",{type:"button",onClick:t[5]||(t[5]=t=>a.$refs.paramsModal.show()),title:"Settings"},F)])])]),(0,s._)("div",U,[a.audioOn?((0,s.wg)(),(0,s.iD)("audio",$,[(0,s._)("source",{src:`/sound/stream.aac?t=${(new Date).getTime()}`},null,8,D),M],512)):(0,s.kq)("",!0)]),a.url?.length?((0,s.wg)(),(0,s.iD)("div",V,[(0,s._)("label",P,[q,(0,s._)("input",{name:"url",type:"text",value:C.fullURL,disabled:"disabled"},null,8,A)])])):(0,s.kq)("",!0),(0,s.Wm)(k,{ref:"paramsModal",title:"Camera Parameters"},{default:(0,s.w5)((()=>[(0,s._)("div",L,[(0,s._)("label",O,[j,(0,s.wy)((0,s._)("input",{name:"device",type:"text","onUpdate:modelValue":t[6]||(t[6]=t=>a.attrs.device=t),onChange:t[7]||(t[7]=(...t)=>a.onDeviceChanged&&a.onDeviceChanged(...t))},null,544),[[n.nr,a.attrs.device]])]),(0,s._)("label",G,[I,(0,s.wy)((0,s._)("input",{name:"width",type:"text","onUpdate:modelValue":t[8]||(t[8]=t=>a.attrs.resolution[0]=t),onChange:t[9]||(t[9]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[0]]])]),(0,s._)("label",R,[T,(0,s.wy)((0,s._)("input",{name:"height",type:"text","onUpdate:modelValue":t[10]||(t[10]=t=>a.attrs.resolution[1]=t),onChange:t[11]||(t[11]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[1]]])]),(0,s._)("label",Z,[W,(0,s.wy)((0,s._)("input",{name:"horizontal_flip",type:"checkbox","onUpdate:modelValue":t[12]||(t[12]=t=>a.attrs.horizontal_flip=t),onChange:t[13]||(t[13]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.horizontal_flip]])]),(0,s._)("label",H,[Y,(0,s.wy)((0,s._)("input",{name:"vertical_flip",type:"checkbox","onUpdate:modelValue":t[14]||(t[14]=t=>a.attrs.vertical_flip=t),onChange:t[15]||(t[15]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.vertical_flip]])]),(0,s._)("label",E,[X,(0,s.wy)((0,s._)("input",{name:"rotate",type:"text","onUpdate:modelValue":t[16]||(t[16]=t=>a.attrs.rotate=t),onChange:t[17]||(t[17]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.rotate]])]),(0,s._)("label",B,[J,(0,s.wy)((0,s._)("input",{name:"scale_x",type:"text","onUpdate:modelValue":t[18]||(t[18]=t=>a.attrs.scale_x=t),onChange:t[19]||(t[19]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_x]])]),(0,s._)("label",K,[N,(0,s.wy)((0,s._)("input",{name:"scale_y",type:"text","onUpdate:modelValue":t[20]||(t[20]=t=>a.attrs.scale_y=t),onChange:t[21]||(t[21]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_y]])]),(0,s._)("label",Q,[aa,(0,s.wy)((0,s._)("input",{name:"fps",type:"text","onUpdate:modelValue":t[22]||(t[22]=t=>a.attrs.fps=t),onChange:t[23]||(t[23]=(...t)=>a.onFpsChanged&&a.onFpsChanged(...t))},null,544),[[n.nr,a.attrs.fps]])]),(0,s._)("label",ta,[ea,(0,s.wy)((0,s._)("input",{name:"grayscale",type:"checkbox","onUpdate:modelValue":t[24]||(t[24]=t=>a.attrs.grayscale=t),onChange:t[25]||(t[25]=(...t)=>a.onGrayscaleChanged&&a.onGrayscaleChanged(...t))},null,544),[[n.e8,a.attrs.grayscale]])]),(0,s.Wm)(b)])])),_:1},512)])}var na=e(6813),ia={name:"CameraMixin",mixins:[na.Z],props:{cameraPlugin:{type:String,required:!0}},data(){return{streaming:!1,capturing:!1,captured:!1,audioOn:!1,url:null,attrs:{}}},computed:{params(){return{resolution:this.attrs.resolution,device:this.attrs.device?.length?this.attrs.device:null,horizontal_flip:parseInt(0+this.attrs.horizontal_flip),vertical_flip:parseInt(0+this.attrs.vertical_flip),rotate:parseFloat(this.attrs.rotate),scale_x:parseFloat(this.attrs.scale_x),scale_y:parseFloat(this.attrs.scale_y),fps:parseFloat(this.attrs.fps),grayscale:parseInt(0+this.attrs.grayscale)}}},methods:{getUrl(a,t){return"/camera/"+a+"/"+t+"?"+Object.entries(this.params).filter((a=>null!=a[1]&&(""+a[1]).length>0)).map((([a,t])=>a+"="+t)).join("&")},_startStreaming(a){this.streaming||(this.streaming=!0,this.capturing=!1,this.captured=!1,this.url=this.getUrl(a,"video."+this.attrs.stream_format))},stopStreaming(){this.streaming&&(this.streaming=!1,this.capturing=!1,this.url=null)},_capture(a){this.capturing||(this.streaming=!1,this.capturing=!0,this.captured=!0,this.url=this.getUrl(a,"photo.jpg")+"&t="+(new Date).getTime())},onFrameLoaded(){this.capturing&&(this.capturing=!1)},onDeviceChanged(){},onFlipChanged(){},onSizeChanged(){const a=a=>a*Math.PI/180,t=a(this.params.rotate);this.$refs.frameContainer.style.width=Math.round(this.params.scale_x*Math.abs(this.params.resolution[0]*Math.cos(t)+this.params.resolution[1]*Math.sin(t)))+"px",this.$refs.frameContainer.style.height=Math.round(this.params.scale_y*Math.abs(this.params.resolution[0]*Math.sin(t)+this.params.resolution[1]*Math.cos(t)))+"px"},onFpsChanged(){},onGrayscaleChanged(){},startAudio(){this.audioOn=!0},async stopAudio(){this.audioOn=!1,await this.request("sound.stop_recording")}},created(){const a=this.$root.config[`camera.${this.cameraPlugin}`]||{};this.attrs={resolution:a.resolution||[640,480],device:a.device,horizontal_flip:a.horizontal_flip||0,vertical_flip:a.vertical_flip||0,rotate:a.rotate||0,scale_x:a.scale_x||1,scale_y:a.scale_y||1,fps:a.fps||16,grayscale:a.grayscale||0,stream_format:a.stream_format||"mjpeg"}},mounted(){this.$refs.frame.addEventListener("load",this.onFrameLoaded),this.onSizeChanged(),this.$watch((()=>this.attrs.resolution),this.onSizeChanged),this.$watch((()=>this.attrs.horizontal_flip),this.onSizeChanged),this.$watch((()=>this.attrs.vertical_flip),this.onSizeChanged),this.$watch((()=>this.attrs.rotate),this.onSizeChanged),this.$watch((()=>this.attrs.scale_x),this.onSizeChanged),this.$watch((()=>this.attrs.scale_y),this.onSizeChanged)}};const ra=ia;var la=ra,oa=e(1794),ca={name:"Camera",components:{Modal:oa.Z},mixins:[la],props:{cameraPlugin:{type:String,required:!0}},computed:{fullURL(){return`${window.location.protocol}//${window.location.host}${this.url}`}},methods:{startStreaming(){this._startStreaming(this.cameraPlugin)},capture(){this._capture(this.cameraPlugin)}}},ua=e(3744);const pa=(0,ua.Z)(ca,[["render",sa]]);var ha=pa},4548:function(a,t,e){e.r(t),e.d(t,{default:function(){return c}});var s=e(6252);function n(a,t,e,n,i,r){const l=(0,s.up)("Camera");return(0,s.wg)(),(0,s.j4)(l,{"camera-plugin":"pi"})}var i=e(9021),r={name:"CameraPi",components:{Camera:i["default"]}},l=e(3744);const o=(0,l.Z)(r,[["render",n]]);var c=o}}]); +//# sourceMappingURL=4548.75a2e6f8.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/4548.75a2e6f8.js.map b/platypush/backend/http/webapp/dist/static/js/4548.75a2e6f8.js.map new file mode 100644 index 00000000..43c79bbc --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/4548.75a2e6f8.js.map @@ -0,0 +1 @@ +{"version":3,"file":"static/js/4548.75a2e6f8.js","mappings":"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","sources":["webpack://platypush/./src/components/panels/Camera/Index.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue?be5e","webpack://platypush/./src/components/panels/Camera/Index.vue?8810","webpack://platypush/./src/components/panels/CameraPi/Index.vue","webpack://platypush/./src/components/panels/CameraPi/Index.vue?7074"],"sourcesContent":["\n\n\n\n\n","\n","import script from \"./Mixin.vue?vue&type=script&lang=js\"\nexport * from \"./Mixin.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=a4970096\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=a4970096&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=6f4a0590\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["class","ref","autoplay","preload","streaming","capturing","captured","src","url","alt","type","stopStreaming","disabled","title","startStreaming","capture","audioOn","stopAudio","startAudio","$refs","paramsModal","show","Date","getTime","length","name","value","fullURL","attrs","device","onDeviceChanged","resolution","onSizeChanged","horizontal_flip","onFlipChanged","vertical_flip","rotate","scale_x","scale_y","fps","onFpsChanged","grayscale","onGrayscaleChanged","mixins","Utils","props","cameraPlugin","String","required","data","computed","params","this","parseInt","parseFloat","methods","getUrl","plugin","action","Object","entries","filter","entry","map","k","v","join","_startStreaming","stream_format","_capture","onFrameLoaded","degToRad","deg","Math","PI","rot","frameContainer","style","width","round","abs","cos","sin","height","async","request","created","config","$root","mounted","frame","addEventListener","$watch","__exports__","components","Modal","window","location","protocol","host","render","Camera"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/4548.c7642733.js b/platypush/backend/http/webapp/dist/static/js/4548.c7642733.js deleted file mode 100644 index 76001354..00000000 --- a/platypush/backend/http/webapp/dist/static/js/4548.c7642733.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[4548,5528],{5528:function(a,t,e){e.r(t),e.d(t,{default:function(){return ha}});var s=e(6252),n=e(9963);const i={class:"camera"},r={class:"camera-container"},l={class:"frame-container",ref:"frameContainer"},o={key:0,class:"no-frame"},c=["src"],p={class:"controls"},u={class:"left"},h=["disabled"],d=(0,s._)("i",{class:"fa fa-play"},null,-1),m=[d],g=["disabled"],_=(0,s._)("i",{class:"fa fa-stop"},null,-1),f=[_],y=["disabled"],C=(0,s._)("i",{class:"fas fa-camera"},null,-1),w=[C],v={class:"right"},b=(0,s._)("i",{class:"fas fa-volume-mute"},null,-1),S=[b],k=(0,s._)("i",{class:"fas fa-volume-up"},null,-1),z=[k],x=(0,s._)("i",{class:"fas fa-cog"},null,-1),F=[x],U={class:"audio-container"},$={key:0,autoplay:"",preload:"none",ref:"player"},D=["src"],M=(0,s.Uk)(" Your browser does not support audio elements "),V={key:0,class:"url"},P={class:"row"},q=(0,s._)("span",{class:"name"},"Stream URL",-1),A=["value"],L={class:"params"},O={class:"row"},j=(0,s._)("span",{class:"name"},"Device",-1),G={class:"row"},I=(0,s._)("span",{class:"name"},"Width",-1),R={class:"row"},T=(0,s._)("span",{class:"name"},"Height",-1),Z={class:"row"},W=(0,s._)("span",{class:"name"},"Horizontal Flip",-1),H={class:"row"},Y=(0,s._)("span",{class:"name"},"Vertical Flip",-1),E={class:"row"},X=(0,s._)("span",{class:"name"},"Rotate",-1),B={class:"row"},J=(0,s._)("span",{class:"name"},"Scale-X",-1),K={class:"row"},N=(0,s._)("span",{class:"name"},"Scale-Y",-1),Q={class:"row"},aa=(0,s._)("span",{class:"name"},"Frames per second",-1),ta={class:"row"},ea=(0,s._)("span",{class:"name"},"Grayscale",-1);function sa(a,t,e,d,_,C){const b=(0,s.up)("Slot"),k=(0,s.up)("Modal");return(0,s.wg)(),(0,s.iD)("div",i,[(0,s._)("div",r,[(0,s._)("div",l,[a.streaming||a.capturing||a.captured?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("div",o,"The camera is not active")),(0,s._)("img",{class:"frame",src:a.url,ref:"frame",alt:""},null,8,c)],512),(0,s._)("div",p,[(0,s._)("div",u,[a.streaming?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[1]||(t[1]=(...t)=>a.stopStreaming&&a.stopStreaming(...t)),disabled:a.capturing,title:"Stop video"},f,8,g)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[0]||(t[0]=(...a)=>C.startStreaming&&C.startStreaming(...a)),disabled:a.capturing,title:"Start video"},m,8,h)),a.streaming?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("button",{key:2,type:"button",onClick:t[2]||(t[2]=(...a)=>C.capture&&C.capture(...a)),disabled:a.streaming||a.capturing,title:"Take a picture"},w,8,y))]),(0,s._)("div",v,[a.audioOn?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[4]||(t[4]=(...t)=>a.stopAudio&&a.stopAudio(...t)),title:"Stop audio"},z)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[3]||(t[3]=(...t)=>a.startAudio&&a.startAudio(...t)),title:"Start audio"},S)),(0,s._)("button",{type:"button",onClick:t[5]||(t[5]=t=>a.$refs.paramsModal.show()),title:"Settings"},F)])])]),(0,s._)("div",U,[a.audioOn?((0,s.wg)(),(0,s.iD)("audio",$,[(0,s._)("source",{src:`/sound/stream?t=${(new Date).getTime()}`,type:"audio/x-wav;codec=pcm"},null,8,D),M],512)):(0,s.kq)("",!0)]),a.url?.length?((0,s.wg)(),(0,s.iD)("div",V,[(0,s._)("label",P,[q,(0,s._)("input",{name:"url",type:"text",value:C.fullURL,disabled:"disabled"},null,8,A)])])):(0,s.kq)("",!0),(0,s.Wm)(k,{ref:"paramsModal",title:"Camera Parameters"},{default:(0,s.w5)((()=>[(0,s._)("div",L,[(0,s._)("label",O,[j,(0,s.wy)((0,s._)("input",{name:"device",type:"text","onUpdate:modelValue":t[6]||(t[6]=t=>a.attrs.device=t),onChange:t[7]||(t[7]=(...t)=>a.onDeviceChanged&&a.onDeviceChanged(...t))},null,544),[[n.nr,a.attrs.device]])]),(0,s._)("label",G,[I,(0,s.wy)((0,s._)("input",{name:"width",type:"text","onUpdate:modelValue":t[8]||(t[8]=t=>a.attrs.resolution[0]=t),onChange:t[9]||(t[9]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[0]]])]),(0,s._)("label",R,[T,(0,s.wy)((0,s._)("input",{name:"height",type:"text","onUpdate:modelValue":t[10]||(t[10]=t=>a.attrs.resolution[1]=t),onChange:t[11]||(t[11]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[1]]])]),(0,s._)("label",Z,[W,(0,s.wy)((0,s._)("input",{name:"horizontal_flip",type:"checkbox","onUpdate:modelValue":t[12]||(t[12]=t=>a.attrs.horizontal_flip=t),onChange:t[13]||(t[13]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.horizontal_flip]])]),(0,s._)("label",H,[Y,(0,s.wy)((0,s._)("input",{name:"vertical_flip",type:"checkbox","onUpdate:modelValue":t[14]||(t[14]=t=>a.attrs.vertical_flip=t),onChange:t[15]||(t[15]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.vertical_flip]])]),(0,s._)("label",E,[X,(0,s.wy)((0,s._)("input",{name:"rotate",type:"text","onUpdate:modelValue":t[16]||(t[16]=t=>a.attrs.rotate=t),onChange:t[17]||(t[17]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.rotate]])]),(0,s._)("label",B,[J,(0,s.wy)((0,s._)("input",{name:"scale_x",type:"text","onUpdate:modelValue":t[18]||(t[18]=t=>a.attrs.scale_x=t),onChange:t[19]||(t[19]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_x]])]),(0,s._)("label",K,[N,(0,s.wy)((0,s._)("input",{name:"scale_y",type:"text","onUpdate:modelValue":t[20]||(t[20]=t=>a.attrs.scale_y=t),onChange:t[21]||(t[21]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_y]])]),(0,s._)("label",Q,[aa,(0,s.wy)((0,s._)("input",{name:"fps",type:"text","onUpdate:modelValue":t[22]||(t[22]=t=>a.attrs.fps=t),onChange:t[23]||(t[23]=(...t)=>a.onFpsChanged&&a.onFpsChanged(...t))},null,544),[[n.nr,a.attrs.fps]])]),(0,s._)("label",ta,[ea,(0,s.wy)((0,s._)("input",{name:"grayscale",type:"checkbox","onUpdate:modelValue":t[24]||(t[24]=t=>a.attrs.grayscale=t),onChange:t[25]||(t[25]=(...t)=>a.onGrayscaleChanged&&a.onGrayscaleChanged(...t))},null,544),[[n.e8,a.attrs.grayscale]])]),(0,s.Wm)(b)])])),_:1},512)])}var na=e(6813),ia={name:"CameraMixin",mixins:[na.Z],props:{cameraPlugin:{type:String,required:!0}},data(){return{streaming:!1,capturing:!1,captured:!1,audioOn:!1,url:null,attrs:{}}},computed:{params(){return{resolution:this.attrs.resolution,device:this.attrs.device?.length?this.attrs.device:null,horizontal_flip:parseInt(0+this.attrs.horizontal_flip),vertical_flip:parseInt(0+this.attrs.vertical_flip),rotate:parseFloat(this.attrs.rotate),scale_x:parseFloat(this.attrs.scale_x),scale_y:parseFloat(this.attrs.scale_y),fps:parseFloat(this.attrs.fps),grayscale:parseInt(0+this.attrs.grayscale)}}},methods:{getUrl(a,t){return"/camera/"+a+"/"+t+"?"+Object.entries(this.params).filter((a=>null!=a[1]&&(""+a[1]).length>0)).map((([a,t])=>a+"="+t)).join("&")},_startStreaming(a){this.streaming||(this.streaming=!0,this.capturing=!1,this.captured=!1,this.url=this.getUrl(a,"video."+this.attrs.stream_format))},stopStreaming(){this.streaming&&(this.streaming=!1,this.capturing=!1,this.url=null)},_capture(a){this.capturing||(this.streaming=!1,this.capturing=!0,this.captured=!0,this.url=this.getUrl(a,"photo.jpg")+"&t="+(new Date).getTime())},onFrameLoaded(){this.capturing&&(this.capturing=!1)},onDeviceChanged(){},onFlipChanged(){},onSizeChanged(){const a=a=>a*Math.PI/180,t=a(this.params.rotate);this.$refs.frameContainer.style.width=Math.round(this.params.scale_x*Math.abs(this.params.resolution[0]*Math.cos(t)+this.params.resolution[1]*Math.sin(t)))+"px",this.$refs.frameContainer.style.height=Math.round(this.params.scale_y*Math.abs(this.params.resolution[0]*Math.sin(t)+this.params.resolution[1]*Math.cos(t)))+"px"},onFpsChanged(){},onGrayscaleChanged(){},startAudio(){this.audioOn=!0},async stopAudio(){this.audioOn=!1,await this.request("sound.stop_recording")}},created(){const a=this.$root.config[`camera.${this.cameraPlugin}`]||{};this.attrs={resolution:a.resolution||[640,480],device:a.device,horizontal_flip:a.horizontal_flip||0,vertical_flip:a.vertical_flip||0,rotate:a.rotate||0,scale_x:a.scale_x||1,scale_y:a.scale_y||1,fps:a.fps||16,grayscale:a.grayscale||0,stream_format:a.stream_format||"mjpeg"}},mounted(){this.$refs.frame.addEventListener("load",this.onFrameLoaded),this.onSizeChanged(),this.$watch((()=>this.attrs.resolution),this.onSizeChanged),this.$watch((()=>this.attrs.horizontal_flip),this.onSizeChanged),this.$watch((()=>this.attrs.vertical_flip),this.onSizeChanged),this.$watch((()=>this.attrs.rotate),this.onSizeChanged),this.$watch((()=>this.attrs.scale_x),this.onSizeChanged),this.$watch((()=>this.attrs.scale_y),this.onSizeChanged)}};const ra=ia;var la=ra,oa=e(1794),ca={name:"Camera",components:{Modal:oa.Z},mixins:[la],props:{cameraPlugin:{type:String,required:!0}},computed:{fullURL(){return`${window.location.protocol}//${window.location.host}${this.url}`}},methods:{startStreaming(){this._startStreaming(this.cameraPlugin)},capture(){this._capture(this.cameraPlugin)}}},pa=e(3744);const ua=(0,pa.Z)(ca,[["render",sa]]);var ha=ua},4548:function(a,t,e){e.r(t),e.d(t,{default:function(){return c}});var s=e(6252);function n(a,t,e,n,i,r){const l=(0,s.up)("Camera");return(0,s.wg)(),(0,s.j4)(l,{"camera-plugin":"pi"})}var i=e(5528),r={name:"CameraPi",components:{Camera:i["default"]}},l=e(3744);const o=(0,l.Z)(r,[["render",n]]);var c=o}}]); -//# sourceMappingURL=4548.c7642733.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/4548.c7642733.js.map b/platypush/backend/http/webapp/dist/static/js/4548.c7642733.js.map deleted file mode 100644 index f68ef461..00000000 --- a/platypush/backend/http/webapp/dist/static/js/4548.c7642733.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/4548.c7642733.js","mappings":"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","sources":["webpack://platypush/./src/components/panels/Camera/Index.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue?be5e","webpack://platypush/./src/components/panels/Camera/Index.vue?8810","webpack://platypush/./src/components/panels/CameraPi/Index.vue","webpack://platypush/./src/components/panels/CameraPi/Index.vue?7074"],"sourcesContent":["\n\n\n\n\n","\n","import script from \"./Mixin.vue?vue&type=script&lang=js\"\nexport * from \"./Mixin.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=bfa8f2aa\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=bfa8f2aa&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=6f4a0590\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["class","ref","autoplay","preload","streaming","capturing","captured","src","url","alt","type","stopStreaming","disabled","title","startStreaming","capture","audioOn","stopAudio","startAudio","$refs","paramsModal","show","Date","getTime","length","name","value","fullURL","attrs","device","onDeviceChanged","resolution","onSizeChanged","horizontal_flip","onFlipChanged","vertical_flip","rotate","scale_x","scale_y","fps","onFpsChanged","grayscale","onGrayscaleChanged","mixins","Utils","props","cameraPlugin","String","required","data","computed","params","this","parseInt","parseFloat","methods","getUrl","plugin","action","Object","entries","filter","entry","map","k","v","join","_startStreaming","stream_format","_capture","onFrameLoaded","degToRad","deg","Math","PI","rot","frameContainer","style","width","round","abs","cos","sin","height","async","request","created","config","$root","mounted","frame","addEventListener","$watch","__exports__","components","Modal","window","location","protocol","host","render","Camera"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5111-legacy.262ea3c5.js b/platypush/backend/http/webapp/dist/static/js/5111-legacy.d4568c17.js similarity index 75% rename from platypush/backend/http/webapp/dist/static/js/5111-legacy.262ea3c5.js rename to platypush/backend/http/webapp/dist/static/js/5111-legacy.d4568c17.js index d191a05e..bef84857 100644 --- a/platypush/backend/http/webapp/dist/static/js/5111-legacy.262ea3c5.js +++ b/platypush/backend/http/webapp/dist/static/js/5111-legacy.d4568c17.js @@ -1,2 +1,2 @@ -"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[5111],{5111:function(a,e,n){n.r(e),n.d(e,{default:function(){return s}});var r=n(6252);function u(a,e,n,u,t,p){var f=(0,r.up)("Camera");return(0,r.wg)(),(0,r.j4)(f,{"camera-plugin":"ffmpeg"})}var t=n(5528),p={name:"CameraFfmpeg",components:{Camera:t["default"]}},f=n(3744);const c=(0,f.Z)(p,[["render",u]]);var s=c}}]); -//# sourceMappingURL=5111-legacy.262ea3c5.js.map \ No newline at end of file +"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[5111],{5111:function(a,e,n){n.r(e),n.d(e,{default:function(){return s}});var r=n(6252);function u(a,e,n,u,t,p){var f=(0,r.up)("Camera");return(0,r.wg)(),(0,r.j4)(f,{"camera-plugin":"ffmpeg"})}var t=n(9021),p={name:"CameraFfmpeg",components:{Camera:t["default"]}},f=n(3744);const c=(0,f.Z)(p,[["render",u]]);var s=c}}]); +//# sourceMappingURL=5111-legacy.d4568c17.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5111-legacy.262ea3c5.js.map b/platypush/backend/http/webapp/dist/static/js/5111-legacy.d4568c17.js.map similarity index 94% rename from platypush/backend/http/webapp/dist/static/js/5111-legacy.262ea3c5.js.map rename to platypush/backend/http/webapp/dist/static/js/5111-legacy.d4568c17.js.map index 3ce9c43d..754c1359 100644 --- a/platypush/backend/http/webapp/dist/static/js/5111-legacy.262ea3c5.js.map +++ b/platypush/backend/http/webapp/dist/static/js/5111-legacy.d4568c17.js.map @@ -1 +1 @@ -{"version":3,"file":"static/js/5111-legacy.262ea3c5.js","mappings":"gPACE,QAAiC,GAAzB,gBAAc,U,eAMxB,GACEA,KAAM,eACNC,WAAY,CAACC,OAAA,e,UCJf,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,KAEpE,O","sources":["webpack://platypush/./src/components/panels/CameraFfmpeg/Index.vue","webpack://platypush/./src/components/panels/CameraFfmpeg/Index.vue?3548"],"sourcesContent":["\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=dd632828\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["name","components","Camera","__exports__","render"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"static/js/5111-legacy.d4568c17.js","mappings":"gPACE,QAAiC,GAAzB,gBAAc,U,eAMxB,GACEA,KAAM,eACNC,WAAY,CAACC,OAAA,e,UCJf,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,KAEpE,O","sources":["webpack://platypush/./src/components/panels/CameraFfmpeg/Index.vue","webpack://platypush/./src/components/panels/CameraFfmpeg/Index.vue?3548"],"sourcesContent":["\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=dd632828\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["name","components","Camera","__exports__","render"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5111.f606018d.js b/platypush/backend/http/webapp/dist/static/js/5111.f606018d.js deleted file mode 100644 index 3af328ed..00000000 --- a/platypush/backend/http/webapp/dist/static/js/5111.f606018d.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[5111,5528],{5528:function(a,t,e){e.r(t),e.d(t,{default:function(){return ha}});var s=e(6252),n=e(9963);const i={class:"camera"},r={class:"camera-container"},l={class:"frame-container",ref:"frameContainer"},o={key:0,class:"no-frame"},c=["src"],p={class:"controls"},u={class:"left"},h=["disabled"],d=(0,s._)("i",{class:"fa fa-play"},null,-1),m=[d],g=["disabled"],_=(0,s._)("i",{class:"fa fa-stop"},null,-1),f=[_],y=["disabled"],C=(0,s._)("i",{class:"fas fa-camera"},null,-1),w=[C],v={class:"right"},b=(0,s._)("i",{class:"fas fa-volume-mute"},null,-1),S=[b],k=(0,s._)("i",{class:"fas fa-volume-up"},null,-1),z=[k],x=(0,s._)("i",{class:"fas fa-cog"},null,-1),F=[x],U={class:"audio-container"},$={key:0,autoplay:"",preload:"none",ref:"player"},D=["src"],M=(0,s.Uk)(" Your browser does not support audio elements "),V={key:0,class:"url"},q={class:"row"},P=(0,s._)("span",{class:"name"},"Stream URL",-1),A=["value"],L={class:"params"},O={class:"row"},j=(0,s._)("span",{class:"name"},"Device",-1),G={class:"row"},I=(0,s._)("span",{class:"name"},"Width",-1),R={class:"row"},T=(0,s._)("span",{class:"name"},"Height",-1),Z={class:"row"},W=(0,s._)("span",{class:"name"},"Horizontal Flip",-1),H={class:"row"},Y=(0,s._)("span",{class:"name"},"Vertical Flip",-1),E={class:"row"},X=(0,s._)("span",{class:"name"},"Rotate",-1),B={class:"row"},J=(0,s._)("span",{class:"name"},"Scale-X",-1),K={class:"row"},N=(0,s._)("span",{class:"name"},"Scale-Y",-1),Q={class:"row"},aa=(0,s._)("span",{class:"name"},"Frames per second",-1),ta={class:"row"},ea=(0,s._)("span",{class:"name"},"Grayscale",-1);function sa(a,t,e,d,_,C){const b=(0,s.up)("Slot"),k=(0,s.up)("Modal");return(0,s.wg)(),(0,s.iD)("div",i,[(0,s._)("div",r,[(0,s._)("div",l,[a.streaming||a.capturing||a.captured?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("div",o,"The camera is not active")),(0,s._)("img",{class:"frame",src:a.url,ref:"frame",alt:""},null,8,c)],512),(0,s._)("div",p,[(0,s._)("div",u,[a.streaming?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[1]||(t[1]=(...t)=>a.stopStreaming&&a.stopStreaming(...t)),disabled:a.capturing,title:"Stop video"},f,8,g)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[0]||(t[0]=(...a)=>C.startStreaming&&C.startStreaming(...a)),disabled:a.capturing,title:"Start video"},m,8,h)),a.streaming?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("button",{key:2,type:"button",onClick:t[2]||(t[2]=(...a)=>C.capture&&C.capture(...a)),disabled:a.streaming||a.capturing,title:"Take a picture"},w,8,y))]),(0,s._)("div",v,[a.audioOn?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[4]||(t[4]=(...t)=>a.stopAudio&&a.stopAudio(...t)),title:"Stop audio"},z)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[3]||(t[3]=(...t)=>a.startAudio&&a.startAudio(...t)),title:"Start audio"},S)),(0,s._)("button",{type:"button",onClick:t[5]||(t[5]=t=>a.$refs.paramsModal.show()),title:"Settings"},F)])])]),(0,s._)("div",U,[a.audioOn?((0,s.wg)(),(0,s.iD)("audio",$,[(0,s._)("source",{src:`/sound/stream?t=${(new Date).getTime()}`,type:"audio/x-wav;codec=pcm"},null,8,D),M],512)):(0,s.kq)("",!0)]),a.url?.length?((0,s.wg)(),(0,s.iD)("div",V,[(0,s._)("label",q,[P,(0,s._)("input",{name:"url",type:"text",value:C.fullURL,disabled:"disabled"},null,8,A)])])):(0,s.kq)("",!0),(0,s.Wm)(k,{ref:"paramsModal",title:"Camera Parameters"},{default:(0,s.w5)((()=>[(0,s._)("div",L,[(0,s._)("label",O,[j,(0,s.wy)((0,s._)("input",{name:"device",type:"text","onUpdate:modelValue":t[6]||(t[6]=t=>a.attrs.device=t),onChange:t[7]||(t[7]=(...t)=>a.onDeviceChanged&&a.onDeviceChanged(...t))},null,544),[[n.nr,a.attrs.device]])]),(0,s._)("label",G,[I,(0,s.wy)((0,s._)("input",{name:"width",type:"text","onUpdate:modelValue":t[8]||(t[8]=t=>a.attrs.resolution[0]=t),onChange:t[9]||(t[9]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[0]]])]),(0,s._)("label",R,[T,(0,s.wy)((0,s._)("input",{name:"height",type:"text","onUpdate:modelValue":t[10]||(t[10]=t=>a.attrs.resolution[1]=t),onChange:t[11]||(t[11]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[1]]])]),(0,s._)("label",Z,[W,(0,s.wy)((0,s._)("input",{name:"horizontal_flip",type:"checkbox","onUpdate:modelValue":t[12]||(t[12]=t=>a.attrs.horizontal_flip=t),onChange:t[13]||(t[13]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.horizontal_flip]])]),(0,s._)("label",H,[Y,(0,s.wy)((0,s._)("input",{name:"vertical_flip",type:"checkbox","onUpdate:modelValue":t[14]||(t[14]=t=>a.attrs.vertical_flip=t),onChange:t[15]||(t[15]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.vertical_flip]])]),(0,s._)("label",E,[X,(0,s.wy)((0,s._)("input",{name:"rotate",type:"text","onUpdate:modelValue":t[16]||(t[16]=t=>a.attrs.rotate=t),onChange:t[17]||(t[17]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.rotate]])]),(0,s._)("label",B,[J,(0,s.wy)((0,s._)("input",{name:"scale_x",type:"text","onUpdate:modelValue":t[18]||(t[18]=t=>a.attrs.scale_x=t),onChange:t[19]||(t[19]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_x]])]),(0,s._)("label",K,[N,(0,s.wy)((0,s._)("input",{name:"scale_y",type:"text","onUpdate:modelValue":t[20]||(t[20]=t=>a.attrs.scale_y=t),onChange:t[21]||(t[21]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_y]])]),(0,s._)("label",Q,[aa,(0,s.wy)((0,s._)("input",{name:"fps",type:"text","onUpdate:modelValue":t[22]||(t[22]=t=>a.attrs.fps=t),onChange:t[23]||(t[23]=(...t)=>a.onFpsChanged&&a.onFpsChanged(...t))},null,544),[[n.nr,a.attrs.fps]])]),(0,s._)("label",ta,[ea,(0,s.wy)((0,s._)("input",{name:"grayscale",type:"checkbox","onUpdate:modelValue":t[24]||(t[24]=t=>a.attrs.grayscale=t),onChange:t[25]||(t[25]=(...t)=>a.onGrayscaleChanged&&a.onGrayscaleChanged(...t))},null,544),[[n.e8,a.attrs.grayscale]])]),(0,s.Wm)(b)])])),_:1},512)])}var na=e(6813),ia={name:"CameraMixin",mixins:[na.Z],props:{cameraPlugin:{type:String,required:!0}},data(){return{streaming:!1,capturing:!1,captured:!1,audioOn:!1,url:null,attrs:{}}},computed:{params(){return{resolution:this.attrs.resolution,device:this.attrs.device?.length?this.attrs.device:null,horizontal_flip:parseInt(0+this.attrs.horizontal_flip),vertical_flip:parseInt(0+this.attrs.vertical_flip),rotate:parseFloat(this.attrs.rotate),scale_x:parseFloat(this.attrs.scale_x),scale_y:parseFloat(this.attrs.scale_y),fps:parseFloat(this.attrs.fps),grayscale:parseInt(0+this.attrs.grayscale)}}},methods:{getUrl(a,t){return"/camera/"+a+"/"+t+"?"+Object.entries(this.params).filter((a=>null!=a[1]&&(""+a[1]).length>0)).map((([a,t])=>a+"="+t)).join("&")},_startStreaming(a){this.streaming||(this.streaming=!0,this.capturing=!1,this.captured=!1,this.url=this.getUrl(a,"video."+this.attrs.stream_format))},stopStreaming(){this.streaming&&(this.streaming=!1,this.capturing=!1,this.url=null)},_capture(a){this.capturing||(this.streaming=!1,this.capturing=!0,this.captured=!0,this.url=this.getUrl(a,"photo.jpg")+"&t="+(new Date).getTime())},onFrameLoaded(){this.capturing&&(this.capturing=!1)},onDeviceChanged(){},onFlipChanged(){},onSizeChanged(){const a=a=>a*Math.PI/180,t=a(this.params.rotate);this.$refs.frameContainer.style.width=Math.round(this.params.scale_x*Math.abs(this.params.resolution[0]*Math.cos(t)+this.params.resolution[1]*Math.sin(t)))+"px",this.$refs.frameContainer.style.height=Math.round(this.params.scale_y*Math.abs(this.params.resolution[0]*Math.sin(t)+this.params.resolution[1]*Math.cos(t)))+"px"},onFpsChanged(){},onGrayscaleChanged(){},startAudio(){this.audioOn=!0},async stopAudio(){this.audioOn=!1,await this.request("sound.stop_recording")}},created(){const a=this.$root.config[`camera.${this.cameraPlugin}`]||{};this.attrs={resolution:a.resolution||[640,480],device:a.device,horizontal_flip:a.horizontal_flip||0,vertical_flip:a.vertical_flip||0,rotate:a.rotate||0,scale_x:a.scale_x||1,scale_y:a.scale_y||1,fps:a.fps||16,grayscale:a.grayscale||0,stream_format:a.stream_format||"mjpeg"}},mounted(){this.$refs.frame.addEventListener("load",this.onFrameLoaded),this.onSizeChanged(),this.$watch((()=>this.attrs.resolution),this.onSizeChanged),this.$watch((()=>this.attrs.horizontal_flip),this.onSizeChanged),this.$watch((()=>this.attrs.vertical_flip),this.onSizeChanged),this.$watch((()=>this.attrs.rotate),this.onSizeChanged),this.$watch((()=>this.attrs.scale_x),this.onSizeChanged),this.$watch((()=>this.attrs.scale_y),this.onSizeChanged)}};const ra=ia;var la=ra,oa=e(1794),ca={name:"Camera",components:{Modal:oa.Z},mixins:[la],props:{cameraPlugin:{type:String,required:!0}},computed:{fullURL(){return`${window.location.protocol}//${window.location.host}${this.url}`}},methods:{startStreaming(){this._startStreaming(this.cameraPlugin)},capture(){this._capture(this.cameraPlugin)}}},pa=e(3744);const ua=(0,pa.Z)(ca,[["render",sa]]);var ha=ua},5111:function(a,t,e){e.r(t),e.d(t,{default:function(){return c}});var s=e(6252);function n(a,t,e,n,i,r){const l=(0,s.up)("Camera");return(0,s.wg)(),(0,s.j4)(l,{"camera-plugin":"ffmpeg"})}var i=e(5528),r={name:"CameraFfmpeg",components:{Camera:i["default"]}},l=e(3744);const o=(0,l.Z)(r,[["render",n]]);var c=o}}]); -//# sourceMappingURL=5111.f606018d.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5111.f606018d.js.map b/platypush/backend/http/webapp/dist/static/js/5111.f606018d.js.map deleted file mode 100644 index aa39ab9e..00000000 --- a/platypush/backend/http/webapp/dist/static/js/5111.f606018d.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/5111.f606018d.js","mappings":"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","sources":["webpack://platypush/./src/components/panels/Camera/Index.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue?be5e","webpack://platypush/./src/components/panels/Camera/Index.vue?8810","webpack://platypush/./src/components/panels/CameraFfmpeg/Index.vue","webpack://platypush/./src/components/panels/CameraFfmpeg/Index.vue?3548"],"sourcesContent":["\n\n\n\n\n","\n","import script from \"./Mixin.vue?vue&type=script&lang=js\"\nexport * from \"./Mixin.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=bfa8f2aa\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=bfa8f2aa&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=dd632828\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["class","ref","autoplay","preload","streaming","capturing","captured","src","url","alt","type","stopStreaming","disabled","title","startStreaming","capture","audioOn","stopAudio","startAudio","$refs","paramsModal","show","Date","getTime","length","name","value","fullURL","attrs","device","onDeviceChanged","resolution","onSizeChanged","horizontal_flip","onFlipChanged","vertical_flip","rotate","scale_x","scale_y","fps","onFpsChanged","grayscale","onGrayscaleChanged","mixins","Utils","props","cameraPlugin","String","required","data","computed","params","this","parseInt","parseFloat","methods","getUrl","plugin","action","Object","entries","filter","entry","map","k","v","join","_startStreaming","stream_format","_capture","onFrameLoaded","degToRad","deg","Math","PI","rot","frameContainer","style","width","round","abs","cos","sin","height","async","request","created","config","$root","mounted","frame","addEventListener","$watch","__exports__","components","Modal","window","location","protocol","host","render","Camera"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5111.fbd25a85.js b/platypush/backend/http/webapp/dist/static/js/5111.fbd25a85.js new file mode 100644 index 00000000..38d4fbd2 --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/5111.fbd25a85.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[5111,5465],{9021:function(a,t,e){e.r(t),e.d(t,{default:function(){return ha}});var s=e(6252),n=e(9963);const i={class:"camera"},r={class:"camera-container"},l={class:"frame-container",ref:"frameContainer"},o={key:0,class:"no-frame"},c=["src"],p={class:"controls"},u={class:"left"},h=["disabled"],d=(0,s._)("i",{class:"fa fa-play"},null,-1),m=[d],g=["disabled"],_=(0,s._)("i",{class:"fa fa-stop"},null,-1),f=[_],y=["disabled"],C=(0,s._)("i",{class:"fas fa-camera"},null,-1),w=[C],v={class:"right"},b=(0,s._)("i",{class:"fas fa-volume-mute"},null,-1),S=[b],k=(0,s._)("i",{class:"fas fa-volume-up"},null,-1),z=[k],x=(0,s._)("i",{class:"fas fa-cog"},null,-1),F=[x],U={class:"audio-container"},$={key:0,autoplay:"",preload:"none",ref:"player"},D=["src"],M=(0,s.Uk)(" Your browser does not support audio elements "),V={key:0,class:"url"},q={class:"row"},P=(0,s._)("span",{class:"name"},"Stream URL",-1),A=["value"],L={class:"params"},O={class:"row"},j=(0,s._)("span",{class:"name"},"Device",-1),G={class:"row"},I=(0,s._)("span",{class:"name"},"Width",-1),R={class:"row"},T=(0,s._)("span",{class:"name"},"Height",-1),Z={class:"row"},W=(0,s._)("span",{class:"name"},"Horizontal Flip",-1),H={class:"row"},Y=(0,s._)("span",{class:"name"},"Vertical Flip",-1),E={class:"row"},X=(0,s._)("span",{class:"name"},"Rotate",-1),B={class:"row"},J=(0,s._)("span",{class:"name"},"Scale-X",-1),K={class:"row"},N=(0,s._)("span",{class:"name"},"Scale-Y",-1),Q={class:"row"},aa=(0,s._)("span",{class:"name"},"Frames per second",-1),ta={class:"row"},ea=(0,s._)("span",{class:"name"},"Grayscale",-1);function sa(a,t,e,d,_,C){const b=(0,s.up)("Slot"),k=(0,s.up)("Modal");return(0,s.wg)(),(0,s.iD)("div",i,[(0,s._)("div",r,[(0,s._)("div",l,[a.streaming||a.capturing||a.captured?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("div",o,"The camera is not active")),(0,s._)("img",{class:"frame",src:a.url,ref:"frame",alt:""},null,8,c)],512),(0,s._)("div",p,[(0,s._)("div",u,[a.streaming?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[1]||(t[1]=(...t)=>a.stopStreaming&&a.stopStreaming(...t)),disabled:a.capturing,title:"Stop video"},f,8,g)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[0]||(t[0]=(...a)=>C.startStreaming&&C.startStreaming(...a)),disabled:a.capturing,title:"Start video"},m,8,h)),a.streaming?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("button",{key:2,type:"button",onClick:t[2]||(t[2]=(...a)=>C.capture&&C.capture(...a)),disabled:a.streaming||a.capturing,title:"Take a picture"},w,8,y))]),(0,s._)("div",v,[a.audioOn?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[4]||(t[4]=(...t)=>a.stopAudio&&a.stopAudio(...t)),title:"Stop audio"},z)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[3]||(t[3]=(...t)=>a.startAudio&&a.startAudio(...t)),title:"Start audio"},S)),(0,s._)("button",{type:"button",onClick:t[5]||(t[5]=t=>a.$refs.paramsModal.show()),title:"Settings"},F)])])]),(0,s._)("div",U,[a.audioOn?((0,s.wg)(),(0,s.iD)("audio",$,[(0,s._)("source",{src:`/sound/stream.aac?t=${(new Date).getTime()}`},null,8,D),M],512)):(0,s.kq)("",!0)]),a.url?.length?((0,s.wg)(),(0,s.iD)("div",V,[(0,s._)("label",q,[P,(0,s._)("input",{name:"url",type:"text",value:C.fullURL,disabled:"disabled"},null,8,A)])])):(0,s.kq)("",!0),(0,s.Wm)(k,{ref:"paramsModal",title:"Camera Parameters"},{default:(0,s.w5)((()=>[(0,s._)("div",L,[(0,s._)("label",O,[j,(0,s.wy)((0,s._)("input",{name:"device",type:"text","onUpdate:modelValue":t[6]||(t[6]=t=>a.attrs.device=t),onChange:t[7]||(t[7]=(...t)=>a.onDeviceChanged&&a.onDeviceChanged(...t))},null,544),[[n.nr,a.attrs.device]])]),(0,s._)("label",G,[I,(0,s.wy)((0,s._)("input",{name:"width",type:"text","onUpdate:modelValue":t[8]||(t[8]=t=>a.attrs.resolution[0]=t),onChange:t[9]||(t[9]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[0]]])]),(0,s._)("label",R,[T,(0,s.wy)((0,s._)("input",{name:"height",type:"text","onUpdate:modelValue":t[10]||(t[10]=t=>a.attrs.resolution[1]=t),onChange:t[11]||(t[11]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[1]]])]),(0,s._)("label",Z,[W,(0,s.wy)((0,s._)("input",{name:"horizontal_flip",type:"checkbox","onUpdate:modelValue":t[12]||(t[12]=t=>a.attrs.horizontal_flip=t),onChange:t[13]||(t[13]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.horizontal_flip]])]),(0,s._)("label",H,[Y,(0,s.wy)((0,s._)("input",{name:"vertical_flip",type:"checkbox","onUpdate:modelValue":t[14]||(t[14]=t=>a.attrs.vertical_flip=t),onChange:t[15]||(t[15]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.vertical_flip]])]),(0,s._)("label",E,[X,(0,s.wy)((0,s._)("input",{name:"rotate",type:"text","onUpdate:modelValue":t[16]||(t[16]=t=>a.attrs.rotate=t),onChange:t[17]||(t[17]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.rotate]])]),(0,s._)("label",B,[J,(0,s.wy)((0,s._)("input",{name:"scale_x",type:"text","onUpdate:modelValue":t[18]||(t[18]=t=>a.attrs.scale_x=t),onChange:t[19]||(t[19]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_x]])]),(0,s._)("label",K,[N,(0,s.wy)((0,s._)("input",{name:"scale_y",type:"text","onUpdate:modelValue":t[20]||(t[20]=t=>a.attrs.scale_y=t),onChange:t[21]||(t[21]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_y]])]),(0,s._)("label",Q,[aa,(0,s.wy)((0,s._)("input",{name:"fps",type:"text","onUpdate:modelValue":t[22]||(t[22]=t=>a.attrs.fps=t),onChange:t[23]||(t[23]=(...t)=>a.onFpsChanged&&a.onFpsChanged(...t))},null,544),[[n.nr,a.attrs.fps]])]),(0,s._)("label",ta,[ea,(0,s.wy)((0,s._)("input",{name:"grayscale",type:"checkbox","onUpdate:modelValue":t[24]||(t[24]=t=>a.attrs.grayscale=t),onChange:t[25]||(t[25]=(...t)=>a.onGrayscaleChanged&&a.onGrayscaleChanged(...t))},null,544),[[n.e8,a.attrs.grayscale]])]),(0,s.Wm)(b)])])),_:1},512)])}var na=e(6813),ia={name:"CameraMixin",mixins:[na.Z],props:{cameraPlugin:{type:String,required:!0}},data(){return{streaming:!1,capturing:!1,captured:!1,audioOn:!1,url:null,attrs:{}}},computed:{params(){return{resolution:this.attrs.resolution,device:this.attrs.device?.length?this.attrs.device:null,horizontal_flip:parseInt(0+this.attrs.horizontal_flip),vertical_flip:parseInt(0+this.attrs.vertical_flip),rotate:parseFloat(this.attrs.rotate),scale_x:parseFloat(this.attrs.scale_x),scale_y:parseFloat(this.attrs.scale_y),fps:parseFloat(this.attrs.fps),grayscale:parseInt(0+this.attrs.grayscale)}}},methods:{getUrl(a,t){return"/camera/"+a+"/"+t+"?"+Object.entries(this.params).filter((a=>null!=a[1]&&(""+a[1]).length>0)).map((([a,t])=>a+"="+t)).join("&")},_startStreaming(a){this.streaming||(this.streaming=!0,this.capturing=!1,this.captured=!1,this.url=this.getUrl(a,"video."+this.attrs.stream_format))},stopStreaming(){this.streaming&&(this.streaming=!1,this.capturing=!1,this.url=null)},_capture(a){this.capturing||(this.streaming=!1,this.capturing=!0,this.captured=!0,this.url=this.getUrl(a,"photo.jpg")+"&t="+(new Date).getTime())},onFrameLoaded(){this.capturing&&(this.capturing=!1)},onDeviceChanged(){},onFlipChanged(){},onSizeChanged(){const a=a=>a*Math.PI/180,t=a(this.params.rotate);this.$refs.frameContainer.style.width=Math.round(this.params.scale_x*Math.abs(this.params.resolution[0]*Math.cos(t)+this.params.resolution[1]*Math.sin(t)))+"px",this.$refs.frameContainer.style.height=Math.round(this.params.scale_y*Math.abs(this.params.resolution[0]*Math.sin(t)+this.params.resolution[1]*Math.cos(t)))+"px"},onFpsChanged(){},onGrayscaleChanged(){},startAudio(){this.audioOn=!0},async stopAudio(){this.audioOn=!1,await this.request("sound.stop_recording")}},created(){const a=this.$root.config[`camera.${this.cameraPlugin}`]||{};this.attrs={resolution:a.resolution||[640,480],device:a.device,horizontal_flip:a.horizontal_flip||0,vertical_flip:a.vertical_flip||0,rotate:a.rotate||0,scale_x:a.scale_x||1,scale_y:a.scale_y||1,fps:a.fps||16,grayscale:a.grayscale||0,stream_format:a.stream_format||"mjpeg"}},mounted(){this.$refs.frame.addEventListener("load",this.onFrameLoaded),this.onSizeChanged(),this.$watch((()=>this.attrs.resolution),this.onSizeChanged),this.$watch((()=>this.attrs.horizontal_flip),this.onSizeChanged),this.$watch((()=>this.attrs.vertical_flip),this.onSizeChanged),this.$watch((()=>this.attrs.rotate),this.onSizeChanged),this.$watch((()=>this.attrs.scale_x),this.onSizeChanged),this.$watch((()=>this.attrs.scale_y),this.onSizeChanged)}};const ra=ia;var la=ra,oa=e(1794),ca={name:"Camera",components:{Modal:oa.Z},mixins:[la],props:{cameraPlugin:{type:String,required:!0}},computed:{fullURL(){return`${window.location.protocol}//${window.location.host}${this.url}`}},methods:{startStreaming(){this._startStreaming(this.cameraPlugin)},capture(){this._capture(this.cameraPlugin)}}},pa=e(3744);const ua=(0,pa.Z)(ca,[["render",sa]]);var ha=ua},5111:function(a,t,e){e.r(t),e.d(t,{default:function(){return c}});var s=e(6252);function n(a,t,e,n,i,r){const l=(0,s.up)("Camera");return(0,s.wg)(),(0,s.j4)(l,{"camera-plugin":"ffmpeg"})}var i=e(9021),r={name:"CameraFfmpeg",components:{Camera:i["default"]}},l=e(3744);const o=(0,l.Z)(r,[["render",n]]);var c=o}}]); +//# sourceMappingURL=5111.fbd25a85.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5111.fbd25a85.js.map b/platypush/backend/http/webapp/dist/static/js/5111.fbd25a85.js.map new file mode 100644 index 00000000..f49867d7 --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/5111.fbd25a85.js.map @@ -0,0 +1 @@ +{"version":3,"file":"static/js/5111.fbd25a85.js","mappings":"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","sources":["webpack://platypush/./src/components/panels/Camera/Index.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue?be5e","webpack://platypush/./src/components/panels/Camera/Index.vue?8810","webpack://platypush/./src/components/panels/CameraFfmpeg/Index.vue","webpack://platypush/./src/components/panels/CameraFfmpeg/Index.vue?3548"],"sourcesContent":["\n\n\n\n\n","\n","import script from \"./Mixin.vue?vue&type=script&lang=js\"\nexport * from \"./Mixin.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=a4970096\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=a4970096&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=dd632828\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["class","ref","autoplay","preload","streaming","capturing","captured","src","url","alt","type","stopStreaming","disabled","title","startStreaming","capture","audioOn","stopAudio","startAudio","$refs","paramsModal","show","Date","getTime","length","name","value","fullURL","attrs","device","onDeviceChanged","resolution","onSizeChanged","horizontal_flip","onFlipChanged","vertical_flip","rotate","scale_x","scale_y","fps","onFpsChanged","grayscale","onGrayscaleChanged","mixins","Utils","props","cameraPlugin","String","required","data","computed","params","this","parseInt","parseFloat","methods","getUrl","plugin","action","Object","entries","filter","entry","map","k","v","join","_startStreaming","stream_format","_capture","onFrameLoaded","degToRad","deg","Math","PI","rot","frameContainer","style","width","round","abs","cos","sin","height","async","request","created","config","$root","mounted","frame","addEventListener","$watch","__exports__","components","Modal","window","location","protocol","host","render","Camera"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5193-legacy.d8c2e027.js b/platypush/backend/http/webapp/dist/static/js/5193-legacy.d8c2e027.js deleted file mode 100644 index c5c51f96..00000000 --- a/platypush/backend/http/webapp/dist/static/js/5193-legacy.d8c2e027.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[5193],{5193:function(n,t,r){r.r(t),r.d(t,{default:function(){return b}});var e=r(6252),o=function(n){return(0,e.dD)("data-v-30d09191"),n=n(),(0,e.Cn)(),n},u={class:"sound"},a={class:"sound-container"},i={key:0,autoplay:"",preload:"none",ref:"player"},s=["src"],c=(0,e.Uk)(" Your browser does not support audio elements "),d={class:"controls"},p=o((function(){return(0,e._)("i",{class:"fa fa-play"},null,-1)})),l=(0,e.Uk)("  Start streaming audio "),f=[p,l],g=o((function(){return(0,e._)("i",{class:"fa fa-stop"},null,-1)})),k=(0,e.Uk)("  Stop streaming audio "),y=[g,k];function m(n,t,r,o,p,l){return(0,e.wg)(),(0,e.iD)("div",u,[(0,e._)("div",a,[p.recording?((0,e.wg)(),(0,e.iD)("audio",i,[(0,e._)("source",{src:"/sound/stream?t=".concat((new Date).getTime()),type:"audio/x-wav;codec=pcm"},null,8,s),c],512)):(0,e.kq)("",!0)]),(0,e._)("div",d,[p.recording?((0,e.wg)(),(0,e.iD)("button",{key:1,type:"button",onClick:t[1]||(t[1]=function(){return l.stopRecording&&l.stopRecording.apply(l,arguments)})},y)):((0,e.wg)(),(0,e.iD)("button",{key:0,type:"button",onClick:t[0]||(t[0]=function(){return l.startRecording&&l.startRecording.apply(l,arguments)})},f))])])}var w=r(8534),v=(r(5666),r(6813)),h={name:"Sound",mixins:[v.Z],data:function(){return{recording:!1}},methods:{startRecording:function(){this.recording=!0},stopRecording:function(){var n=this;return(0,w.Z)(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return n.recording=!1,t.next=3,n.request("sound.stop_recording");case 3:case"end":return t.stop()}}),t)})))()}}},R=r(3744);const _=(0,R.Z)(h,[["render",m],["__scopeId","data-v-30d09191"]]);var b=_}}]); -//# sourceMappingURL=5193-legacy.d8c2e027.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5193-legacy.d8c2e027.js.map b/platypush/backend/http/webapp/dist/static/js/5193-legacy.d8c2e027.js.map deleted file mode 100644 index c903012b..00000000 --- a/platypush/backend/http/webapp/dist/static/js/5193-legacy.d8c2e027.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/5193-legacy.d8c2e027.js","mappings":"oPACOA,MAAM,S,GACJA,MAAM,mB,SACFC,SAAA,GAASC,QAAQ,OAAOC,IAAI,U,qBAEuD,kD,GAKvFH,MAAM,Y,uBAEP,OAA0B,KAAvBA,MAAM,cAAY,Q,eAAK,4B,GAA1B,K,uBAIA,OAA0B,KAAvBA,MAAM,cAAY,Q,eAAK,2B,GAA1B,K,0CAfN,QAkBM,MAlBN,EAkBM,EAjBJ,OAMM,MANN,EAMM,CAL8C,EAAAI,YAAA,WAAlD,QAIQ,QAJR,EAIQ,EAFN,OAAwF,UAA/EC,IAAG,+BAA0BC,MAAQC,WAAaC,KAAK,yBAAhE,UAEM,GAJR,yBAOF,OAQM,MARN,EAQM,CAPiD,EAAAJ,YAArD,WAIA,QAES,U,MAFDI,KAAK,SAAU,QAAK,8BAAE,EAAAC,eAAA,EAAAA,cAAA,kBAAF,IAA5B,MAJqD,WAArD,QAES,U,MAFDD,KAAK,SAAU,QAAK,8BAAE,EAAAE,gBAAA,EAAAA,eAAA,kBAAF,IAA5B,O,mCAcN,GACEC,KAAM,QACNC,OAAQ,CAACC,EAAA,GAETC,KAJa,WAKX,MAAO,CACLV,WAAW,EAEd,EAEDW,QAAS,CACPL,eADO,WAELM,KAAKZ,WAAY,CAClB,EAEKK,cALC,WAKe,uJACpB,EAAKL,WAAY,EADG,SAEd,EAAKa,QAAQ,wBAFC,4CAGrB,I,UCpCL,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,GAAQ,CAAC,YAAY,qBAEzF,O","sources":["webpack://platypush/./src/components/panels/Sound/Index.vue","webpack://platypush/./src/components/panels/Sound/Index.vue?0677"],"sourcesContent":["\n\n\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=30d09191&scoped=true\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=30d09191&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-30d09191\"]])\n\nexport default __exports__"],"names":["class","autoplay","preload","ref","recording","src","Date","getTime","type","stopRecording","startRecording","name","mixins","Utils","data","methods","this","request","__exports__","render"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5193.1de6bb98.js b/platypush/backend/http/webapp/dist/static/js/5193.1de6bb98.js deleted file mode 100644 index b04217cd..00000000 --- a/platypush/backend/http/webapp/dist/static/js/5193.1de6bb98.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[5193],{5193:function(t,n,o){o.r(n),o.d(n,{default:function(){return b}});var e=o(6252);const r=t=>((0,e.dD)("data-v-30d09191"),t=t(),(0,e.Cn)(),t),s={class:"sound"},a={class:"sound-container"},i={key:0,autoplay:"",preload:"none",ref:"player"},d=["src"],c=(0,e.Uk)(" Your browser does not support audio elements "),u={class:"controls"},l=r((()=>(0,e._)("i",{class:"fa fa-play"},null,-1))),p=(0,e.Uk)("  Start streaming audio "),g=[l,p],k=r((()=>(0,e._)("i",{class:"fa fa-stop"},null,-1))),y=(0,e.Uk)("  Stop streaming audio "),f=[k,y];function w(t,n,o,r,l,p){return(0,e.wg)(),(0,e.iD)("div",s,[(0,e._)("div",a,[l.recording?((0,e.wg)(),(0,e.iD)("audio",i,[(0,e._)("source",{src:`/sound/stream?t=${(new Date).getTime()}`,type:"audio/x-wav;codec=pcm"},null,8,d),c],512)):(0,e.kq)("",!0)]),(0,e._)("div",u,[l.recording?((0,e.wg)(),(0,e.iD)("button",{key:1,type:"button",onClick:n[1]||(n[1]=(...t)=>p.stopRecording&&p.stopRecording(...t))},f)):((0,e.wg)(),(0,e.iD)("button",{key:0,type:"button",onClick:n[0]||(n[0]=(...t)=>p.startRecording&&p.startRecording(...t))},g))])])}var h=o(6813),m={name:"Sound",mixins:[h.Z],data(){return{recording:!1}},methods:{startRecording(){this.recording=!0},async stopRecording(){this.recording=!1,await this.request("sound.stop_recording")}}},v=o(3744);const _=(0,v.Z)(m,[["render",w],["__scopeId","data-v-30d09191"]]);var b=_}}]); -//# sourceMappingURL=5193.1de6bb98.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5193.1de6bb98.js.map b/platypush/backend/http/webapp/dist/static/js/5193.1de6bb98.js.map deleted file mode 100644 index 27fbfa2e..00000000 --- a/platypush/backend/http/webapp/dist/static/js/5193.1de6bb98.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/5193.1de6bb98.js","mappings":"4OACOA,MAAM,S,GACJA,MAAM,mB,SACFC,SAAA,GAASC,QAAQ,OAAOC,IAAI,U,qBAEuD,kD,GAKvFH,MAAM,Y,UAEP,OAA0B,KAAvBA,MAAM,cAAY,W,WAAK,4B,GAA1B,K,UAIA,OAA0B,KAAvBA,MAAM,cAAY,W,WAAK,2B,GAA1B,K,0CAfN,QAkBM,MAlBN,EAkBM,EAjBJ,OAMM,MANN,EAMM,CAL8C,EAAAI,YAAA,WAAlD,QAIQ,QAJR,EAIQ,EAFN,OAAwF,UAA/EC,IAAG,wBAA0BC,MAAQC,YAAaC,KAAK,yBAAhE,UAEM,GAJR,yBAOF,OAQM,MARN,EAQM,CAPiD,EAAAJ,YAArD,WAIA,QAES,U,MAFDI,KAAK,SAAU,QAAK,oBAAE,EAAAC,eAAA,EAAAA,iBAAA,KAA9B,MAJqD,WAArD,QAES,U,MAFDD,KAAK,SAAU,QAAK,oBAAE,EAAAE,gBAAA,EAAAA,kBAAA,KAA9B,O,eAcN,GACEC,KAAM,QACNC,OAAQ,CAACC,EAAA,GAETC,OACE,MAAO,CACLV,WAAW,EAEd,EAEDW,QAAS,CACPL,iBACEM,KAAKZ,WAAY,CAClB,EAEDa,sBACED,KAAKZ,WAAY,QACXY,KAAKE,QAAQ,uBACpB,I,UCpCL,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,GAAQ,CAAC,YAAY,qBAEzF,O","sources":["webpack://platypush/./src/components/panels/Sound/Index.vue","webpack://platypush/./src/components/panels/Sound/Index.vue?0677"],"sourcesContent":["\n\n\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=30d09191&scoped=true\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=30d09191&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-30d09191\"]])\n\nexport default __exports__"],"names":["class","autoplay","preload","ref","recording","src","Date","getTime","type","stopRecording","startRecording","name","mixins","Utils","data","methods","this","async","request","__exports__","render"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5465-legacy.f819fef2.js b/platypush/backend/http/webapp/dist/static/js/5465-legacy.f819fef2.js new file mode 100644 index 00000000..e8d0c630 --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/5465-legacy.f819fef2.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[5465],{9021:function(t,a,n){n.r(a),n.d(a,{default:function(){return ft}});var e=n(6252),r=n(9963),i={class:"camera"},s={class:"camera-container"},o={class:"frame-container",ref:"frameContainer"},l={key:0,class:"no-frame"},u=["src"],c={class:"controls"},p={class:"left"},h=["disabled"],d=(0,e._)("i",{class:"fa fa-play"},null,-1),f=[d],m=["disabled"],g=(0,e._)("i",{class:"fa fa-stop"},null,-1),_=[g],y=["disabled"],C=(0,e._)("i",{class:"fas fa-camera"},null,-1),v=[C],w={class:"right"},b=(0,e._)("i",{class:"fas fa-volume-mute"},null,-1),S=[b],k=(0,e._)("i",{class:"fas fa-volume-up"},null,-1),x=[k],z=(0,e._)("i",{class:"fas fa-cog"},null,-1),F=[z],U={class:"audio-container"},D={key:0,autoplay:"",preload:"none",ref:"player"},M=["src"],V=(0,e.Uk)(" Your browser does not support audio elements "),$={key:0,class:"url"},q={class:"row"},P=(0,e._)("span",{class:"name"},"Stream URL",-1),A=["value"],L={class:"params"},O={class:"row"},R=(0,e._)("span",{class:"name"},"Device",-1),Z={class:"row"},j=(0,e._)("span",{class:"name"},"Width",-1),G={class:"row"},I=(0,e._)("span",{class:"name"},"Height",-1),T={class:"row"},W=(0,e._)("span",{class:"name"},"Horizontal Flip",-1),H={class:"row"},Y=(0,e._)("span",{class:"name"},"Vertical Flip",-1),E={class:"row"},X=(0,e._)("span",{class:"name"},"Rotate",-1),B={class:"row"},J=(0,e._)("span",{class:"name"},"Scale-X",-1),K={class:"row"},N=(0,e._)("span",{class:"name"},"Scale-Y",-1),Q={class:"row"},tt=(0,e._)("span",{class:"name"},"Frames per second",-1),at={class:"row"},nt=(0,e._)("span",{class:"name"},"Grayscale",-1);function et(t,a,n,d,g,C){var b,k=(0,e.up)("Slot"),z=(0,e.up)("Modal");return(0,e.wg)(),(0,e.iD)("div",i,[(0,e._)("div",s,[(0,e._)("div",o,[t.streaming||t.capturing||t.captured?(0,e.kq)("",!0):((0,e.wg)(),(0,e.iD)("div",l,"The camera is not active")),(0,e._)("img",{class:"frame",src:t.url,ref:"frame",alt:""},null,8,u)],512),(0,e._)("div",c,[(0,e._)("div",p,[t.streaming?((0,e.wg)(),(0,e.iD)("button",{key:1,type:"button",onClick:a[1]||(a[1]=function(){return t.stopStreaming&&t.stopStreaming.apply(t,arguments)}),disabled:t.capturing,title:"Stop video"},_,8,m)):((0,e.wg)(),(0,e.iD)("button",{key:0,type:"button",onClick:a[0]||(a[0]=function(){return C.startStreaming&&C.startStreaming.apply(C,arguments)}),disabled:t.capturing,title:"Start video"},f,8,h)),t.streaming?(0,e.kq)("",!0):((0,e.wg)(),(0,e.iD)("button",{key:2,type:"button",onClick:a[2]||(a[2]=function(){return C.capture&&C.capture.apply(C,arguments)}),disabled:t.streaming||t.capturing,title:"Take a picture"},v,8,y))]),(0,e._)("div",w,[t.audioOn?((0,e.wg)(),(0,e.iD)("button",{key:1,type:"button",onClick:a[4]||(a[4]=function(){return t.stopAudio&&t.stopAudio.apply(t,arguments)}),title:"Stop audio"},x)):((0,e.wg)(),(0,e.iD)("button",{key:0,type:"button",onClick:a[3]||(a[3]=function(){return t.startAudio&&t.startAudio.apply(t,arguments)}),title:"Start audio"},S)),(0,e._)("button",{type:"button",onClick:a[5]||(a[5]=function(a){return t.$refs.paramsModal.show()}),title:"Settings"},F)])])]),(0,e._)("div",U,[t.audioOn?((0,e.wg)(),(0,e.iD)("audio",D,[(0,e._)("source",{src:"/sound/stream.aac?t=".concat((new Date).getTime())},null,8,M),V],512)):(0,e.kq)("",!0)]),null!==(b=t.url)&&void 0!==b&&b.length?((0,e.wg)(),(0,e.iD)("div",$,[(0,e._)("label",q,[P,(0,e._)("input",{name:"url",type:"text",value:C.fullURL,disabled:"disabled"},null,8,A)])])):(0,e.kq)("",!0),(0,e.Wm)(z,{ref:"paramsModal",title:"Camera Parameters"},{default:(0,e.w5)((function(){return[(0,e._)("div",L,[(0,e._)("label",O,[R,(0,e.wy)((0,e._)("input",{name:"device",type:"text","onUpdate:modelValue":a[6]||(a[6]=function(a){return t.attrs.device=a}),onChange:a[7]||(a[7]=function(){return t.onDeviceChanged&&t.onDeviceChanged.apply(t,arguments)})},null,544),[[r.nr,t.attrs.device]])]),(0,e._)("label",Z,[j,(0,e.wy)((0,e._)("input",{name:"width",type:"text","onUpdate:modelValue":a[8]||(a[8]=function(a){return t.attrs.resolution[0]=a}),onChange:a[9]||(a[9]=function(){return t.onSizeChanged&&t.onSizeChanged.apply(t,arguments)})},null,544),[[r.nr,t.attrs.resolution[0]]])]),(0,e._)("label",G,[I,(0,e.wy)((0,e._)("input",{name:"height",type:"text","onUpdate:modelValue":a[10]||(a[10]=function(a){return t.attrs.resolution[1]=a}),onChange:a[11]||(a[11]=function(){return t.onSizeChanged&&t.onSizeChanged.apply(t,arguments)})},null,544),[[r.nr,t.attrs.resolution[1]]])]),(0,e._)("label",T,[W,(0,e.wy)((0,e._)("input",{name:"horizontal_flip",type:"checkbox","onUpdate:modelValue":a[12]||(a[12]=function(a){return t.attrs.horizontal_flip=a}),onChange:a[13]||(a[13]=function(){return t.onFlipChanged&&t.onFlipChanged.apply(t,arguments)})},null,544),[[r.e8,t.attrs.horizontal_flip]])]),(0,e._)("label",H,[Y,(0,e.wy)((0,e._)("input",{name:"vertical_flip",type:"checkbox","onUpdate:modelValue":a[14]||(a[14]=function(a){return t.attrs.vertical_flip=a}),onChange:a[15]||(a[15]=function(){return t.onFlipChanged&&t.onFlipChanged.apply(t,arguments)})},null,544),[[r.e8,t.attrs.vertical_flip]])]),(0,e._)("label",E,[X,(0,e.wy)((0,e._)("input",{name:"rotate",type:"text","onUpdate:modelValue":a[16]||(a[16]=function(a){return t.attrs.rotate=a}),onChange:a[17]||(a[17]=function(){return t.onSizeChanged&&t.onSizeChanged.apply(t,arguments)})},null,544),[[r.nr,t.attrs.rotate]])]),(0,e._)("label",B,[J,(0,e.wy)((0,e._)("input",{name:"scale_x",type:"text","onUpdate:modelValue":a[18]||(a[18]=function(a){return t.attrs.scale_x=a}),onChange:a[19]||(a[19]=function(){return t.onSizeChanged&&t.onSizeChanged.apply(t,arguments)})},null,544),[[r.nr,t.attrs.scale_x]])]),(0,e._)("label",K,[N,(0,e.wy)((0,e._)("input",{name:"scale_y",type:"text","onUpdate:modelValue":a[20]||(a[20]=function(a){return t.attrs.scale_y=a}),onChange:a[21]||(a[21]=function(){return t.onSizeChanged&&t.onSizeChanged.apply(t,arguments)})},null,544),[[r.nr,t.attrs.scale_y]])]),(0,e._)("label",Q,[tt,(0,e.wy)((0,e._)("input",{name:"fps",type:"text","onUpdate:modelValue":a[22]||(a[22]=function(a){return t.attrs.fps=a}),onChange:a[23]||(a[23]=function(){return t.onFpsChanged&&t.onFpsChanged.apply(t,arguments)})},null,544),[[r.nr,t.attrs.fps]])]),(0,e._)("label",at,[nt,(0,e.wy)((0,e._)("input",{name:"grayscale",type:"checkbox","onUpdate:modelValue":a[24]||(a[24]=function(a){return t.attrs.grayscale=a}),onChange:a[25]||(a[25]=function(){return t.onGrayscaleChanged&&t.onGrayscaleChanged.apply(t,arguments)})},null,544),[[r.e8,t.attrs.grayscale]])]),(0,e.Wm)(k)])]})),_:1},512)])}n(2222);var rt=n(8534),it=n(6084),st=(n(5666),n(9600),n(1249),n(7327),n(1539),n(9720),n(6813)),ot={name:"CameraMixin",mixins:[st.Z],props:{cameraPlugin:{type:String,required:!0}},data:function(){return{streaming:!1,capturing:!1,captured:!1,audioOn:!1,url:null,attrs:{}}},computed:{params:function(){var t;return{resolution:this.attrs.resolution,device:null!==(t=this.attrs.device)&&void 0!==t&&t.length?this.attrs.device:null,horizontal_flip:parseInt(0+this.attrs.horizontal_flip),vertical_flip:parseInt(0+this.attrs.vertical_flip),rotate:parseFloat(this.attrs.rotate),scale_x:parseFloat(this.attrs.scale_x),scale_y:parseFloat(this.attrs.scale_y),fps:parseFloat(this.attrs.fps),grayscale:parseInt(0+this.attrs.grayscale)}}},methods:{getUrl:function(t,a){return"/camera/"+t+"/"+a+"?"+Object.entries(this.params).filter((function(t){return null!=t[1]&&(""+t[1]).length>0})).map((function(t){var a=(0,it.Z)(t,2),n=a[0],e=a[1];return n+"="+e})).join("&")},_startStreaming:function(t){this.streaming||(this.streaming=!0,this.capturing=!1,this.captured=!1,this.url=this.getUrl(t,"video."+this.attrs.stream_format))},stopStreaming:function(){this.streaming&&(this.streaming=!1,this.capturing=!1,this.url=null)},_capture:function(t){this.capturing||(this.streaming=!1,this.capturing=!0,this.captured=!0,this.url=this.getUrl(t,"photo.jpg")+"&t="+(new Date).getTime())},onFrameLoaded:function(){this.capturing&&(this.capturing=!1)},onDeviceChanged:function(){},onFlipChanged:function(){},onSizeChanged:function(){var t=function(t){return t*Math.PI/180},a=t(this.params.rotate);this.$refs.frameContainer.style.width=Math.round(this.params.scale_x*Math.abs(this.params.resolution[0]*Math.cos(a)+this.params.resolution[1]*Math.sin(a)))+"px",this.$refs.frameContainer.style.height=Math.round(this.params.scale_y*Math.abs(this.params.resolution[0]*Math.sin(a)+this.params.resolution[1]*Math.cos(a)))+"px"},onFpsChanged:function(){},onGrayscaleChanged:function(){},startAudio:function(){this.audioOn=!0},stopAudio:function(){var t=this;return(0,rt.Z)(regeneratorRuntime.mark((function a(){return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return t.audioOn=!1,a.next=3,t.request("sound.stop_recording");case 3:case"end":return a.stop()}}),a)})))()}},created:function(){var t=this.$root.config["camera.".concat(this.cameraPlugin)]||{};this.attrs={resolution:t.resolution||[640,480],device:t.device,horizontal_flip:t.horizontal_flip||0,vertical_flip:t.vertical_flip||0,rotate:t.rotate||0,scale_x:t.scale_x||1,scale_y:t.scale_y||1,fps:t.fps||16,grayscale:t.grayscale||0,stream_format:t.stream_format||"mjpeg"}},mounted:function(){var t=this;this.$refs.frame.addEventListener("load",this.onFrameLoaded),this.onSizeChanged(),this.$watch((function(){return t.attrs.resolution}),this.onSizeChanged),this.$watch((function(){return t.attrs.horizontal_flip}),this.onSizeChanged),this.$watch((function(){return t.attrs.vertical_flip}),this.onSizeChanged),this.$watch((function(){return t.attrs.rotate}),this.onSizeChanged),this.$watch((function(){return t.attrs.scale_x}),this.onSizeChanged),this.$watch((function(){return t.attrs.scale_y}),this.onSizeChanged)}};const lt=ot;var ut=lt,ct=n(1794),pt={name:"Camera",components:{Modal:ct.Z},mixins:[ut],props:{cameraPlugin:{type:String,required:!0}},computed:{fullURL:function(){return"".concat(window.location.protocol,"//").concat(window.location.host).concat(this.url)}},methods:{startStreaming:function(){this._startStreaming(this.cameraPlugin)},capture:function(){this._capture(this.cameraPlugin)}}},ht=n(3744);const dt=(0,ht.Z)(pt,[["render",et]]);var ft=dt}}]); +//# sourceMappingURL=5465-legacy.f819fef2.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5465-legacy.f819fef2.js.map b/platypush/backend/http/webapp/dist/static/js/5465-legacy.f819fef2.js.map new file mode 100644 index 00000000..1554bff5 --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/5465-legacy.f819fef2.js.map @@ -0,0 +1 @@ +{"version":3,"file":"static/js/5465-legacy.f819fef2.js","mappings":"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","sources":["webpack://platypush/./src/components/panels/Camera/Index.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue?be5e","webpack://platypush/./src/components/panels/Camera/Index.vue?8810"],"sourcesContent":["\n\n\n\n\n","\n","import script from \"./Mixin.vue?vue&type=script&lang=js\"\nexport * from \"./Mixin.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=a4970096\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=a4970096&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["class","ref","autoplay","preload","streaming","capturing","captured","src","url","alt","type","stopStreaming","disabled","title","startStreaming","capture","audioOn","stopAudio","startAudio","$refs","paramsModal","show","Date","getTime","length","name","value","fullURL","attrs","device","onDeviceChanged","resolution","onSizeChanged","horizontal_flip","onFlipChanged","vertical_flip","rotate","scale_x","scale_y","fps","onFpsChanged","grayscale","onGrayscaleChanged","mixins","Utils","props","cameraPlugin","String","required","data","computed","params","this","parseInt","parseFloat","methods","getUrl","plugin","action","Object","entries","filter","entry","map","k","v","join","_startStreaming","stream_format","_capture","onFrameLoaded","degToRad","deg","Math","PI","rot","frameContainer","style","width","round","abs","cos","sin","height","request","created","config","$root","mounted","frame","addEventListener","$watch","__exports__","components","Modal","window","location","protocol","host","render"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5465.e48f0738.js b/platypush/backend/http/webapp/dist/static/js/5465.e48f0738.js new file mode 100644 index 00000000..8efca5ff --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/5465.e48f0738.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[5465],{9021:function(a,t,e){e.r(t),e.d(t,{default:function(){return ua}});var s=e(6252),n=e(9963);const i={class:"camera"},l={class:"camera-container"},r={class:"frame-container",ref:"frameContainer"},o={key:0,class:"no-frame"},c=["src"],p={class:"controls"},h={class:"left"},u=["disabled"],d=(0,s._)("i",{class:"fa fa-play"},null,-1),m=[d],g=["disabled"],_=(0,s._)("i",{class:"fa fa-stop"},null,-1),f=[_],y=["disabled"],C=(0,s._)("i",{class:"fas fa-camera"},null,-1),w=[C],v={class:"right"},b=(0,s._)("i",{class:"fas fa-volume-mute"},null,-1),S=[b],k=(0,s._)("i",{class:"fas fa-volume-up"},null,-1),z=[k],x=(0,s._)("i",{class:"fas fa-cog"},null,-1),F=[x],U={class:"audio-container"},$={key:0,autoplay:"",preload:"none",ref:"player"},D=["src"],M=(0,s.Uk)(" Your browser does not support audio elements "),V={key:0,class:"url"},q={class:"row"},P=(0,s._)("span",{class:"name"},"Stream URL",-1),A=["value"],L={class:"params"},O={class:"row"},j=(0,s._)("span",{class:"name"},"Device",-1),G={class:"row"},I=(0,s._)("span",{class:"name"},"Width",-1),R={class:"row"},T=(0,s._)("span",{class:"name"},"Height",-1),W={class:"row"},Z=(0,s._)("span",{class:"name"},"Horizontal Flip",-1),H={class:"row"},Y=(0,s._)("span",{class:"name"},"Vertical Flip",-1),E={class:"row"},X=(0,s._)("span",{class:"name"},"Rotate",-1),B={class:"row"},J=(0,s._)("span",{class:"name"},"Scale-X",-1),K={class:"row"},N=(0,s._)("span",{class:"name"},"Scale-Y",-1),Q={class:"row"},aa=(0,s._)("span",{class:"name"},"Frames per second",-1),ta={class:"row"},ea=(0,s._)("span",{class:"name"},"Grayscale",-1);function sa(a,t,e,d,_,C){const b=(0,s.up)("Slot"),k=(0,s.up)("Modal");return(0,s.wg)(),(0,s.iD)("div",i,[(0,s._)("div",l,[(0,s._)("div",r,[a.streaming||a.capturing||a.captured?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("div",o,"The camera is not active")),(0,s._)("img",{class:"frame",src:a.url,ref:"frame",alt:""},null,8,c)],512),(0,s._)("div",p,[(0,s._)("div",h,[a.streaming?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[1]||(t[1]=(...t)=>a.stopStreaming&&a.stopStreaming(...t)),disabled:a.capturing,title:"Stop video"},f,8,g)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[0]||(t[0]=(...a)=>C.startStreaming&&C.startStreaming(...a)),disabled:a.capturing,title:"Start video"},m,8,u)),a.streaming?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("button",{key:2,type:"button",onClick:t[2]||(t[2]=(...a)=>C.capture&&C.capture(...a)),disabled:a.streaming||a.capturing,title:"Take a picture"},w,8,y))]),(0,s._)("div",v,[a.audioOn?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[4]||(t[4]=(...t)=>a.stopAudio&&a.stopAudio(...t)),title:"Stop audio"},z)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[3]||(t[3]=(...t)=>a.startAudio&&a.startAudio(...t)),title:"Start audio"},S)),(0,s._)("button",{type:"button",onClick:t[5]||(t[5]=t=>a.$refs.paramsModal.show()),title:"Settings"},F)])])]),(0,s._)("div",U,[a.audioOn?((0,s.wg)(),(0,s.iD)("audio",$,[(0,s._)("source",{src:`/sound/stream.aac?t=${(new Date).getTime()}`},null,8,D),M],512)):(0,s.kq)("",!0)]),a.url?.length?((0,s.wg)(),(0,s.iD)("div",V,[(0,s._)("label",q,[P,(0,s._)("input",{name:"url",type:"text",value:C.fullURL,disabled:"disabled"},null,8,A)])])):(0,s.kq)("",!0),(0,s.Wm)(k,{ref:"paramsModal",title:"Camera Parameters"},{default:(0,s.w5)((()=>[(0,s._)("div",L,[(0,s._)("label",O,[j,(0,s.wy)((0,s._)("input",{name:"device",type:"text","onUpdate:modelValue":t[6]||(t[6]=t=>a.attrs.device=t),onChange:t[7]||(t[7]=(...t)=>a.onDeviceChanged&&a.onDeviceChanged(...t))},null,544),[[n.nr,a.attrs.device]])]),(0,s._)("label",G,[I,(0,s.wy)((0,s._)("input",{name:"width",type:"text","onUpdate:modelValue":t[8]||(t[8]=t=>a.attrs.resolution[0]=t),onChange:t[9]||(t[9]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[0]]])]),(0,s._)("label",R,[T,(0,s.wy)((0,s._)("input",{name:"height",type:"text","onUpdate:modelValue":t[10]||(t[10]=t=>a.attrs.resolution[1]=t),onChange:t[11]||(t[11]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[1]]])]),(0,s._)("label",W,[Z,(0,s.wy)((0,s._)("input",{name:"horizontal_flip",type:"checkbox","onUpdate:modelValue":t[12]||(t[12]=t=>a.attrs.horizontal_flip=t),onChange:t[13]||(t[13]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.horizontal_flip]])]),(0,s._)("label",H,[Y,(0,s.wy)((0,s._)("input",{name:"vertical_flip",type:"checkbox","onUpdate:modelValue":t[14]||(t[14]=t=>a.attrs.vertical_flip=t),onChange:t[15]||(t[15]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.vertical_flip]])]),(0,s._)("label",E,[X,(0,s.wy)((0,s._)("input",{name:"rotate",type:"text","onUpdate:modelValue":t[16]||(t[16]=t=>a.attrs.rotate=t),onChange:t[17]||(t[17]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.rotate]])]),(0,s._)("label",B,[J,(0,s.wy)((0,s._)("input",{name:"scale_x",type:"text","onUpdate:modelValue":t[18]||(t[18]=t=>a.attrs.scale_x=t),onChange:t[19]||(t[19]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_x]])]),(0,s._)("label",K,[N,(0,s.wy)((0,s._)("input",{name:"scale_y",type:"text","onUpdate:modelValue":t[20]||(t[20]=t=>a.attrs.scale_y=t),onChange:t[21]||(t[21]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_y]])]),(0,s._)("label",Q,[aa,(0,s.wy)((0,s._)("input",{name:"fps",type:"text","onUpdate:modelValue":t[22]||(t[22]=t=>a.attrs.fps=t),onChange:t[23]||(t[23]=(...t)=>a.onFpsChanged&&a.onFpsChanged(...t))},null,544),[[n.nr,a.attrs.fps]])]),(0,s._)("label",ta,[ea,(0,s.wy)((0,s._)("input",{name:"grayscale",type:"checkbox","onUpdate:modelValue":t[24]||(t[24]=t=>a.attrs.grayscale=t),onChange:t[25]||(t[25]=(...t)=>a.onGrayscaleChanged&&a.onGrayscaleChanged(...t))},null,544),[[n.e8,a.attrs.grayscale]])]),(0,s.Wm)(b)])])),_:1},512)])}var na=e(6813),ia={name:"CameraMixin",mixins:[na.Z],props:{cameraPlugin:{type:String,required:!0}},data(){return{streaming:!1,capturing:!1,captured:!1,audioOn:!1,url:null,attrs:{}}},computed:{params(){return{resolution:this.attrs.resolution,device:this.attrs.device?.length?this.attrs.device:null,horizontal_flip:parseInt(0+this.attrs.horizontal_flip),vertical_flip:parseInt(0+this.attrs.vertical_flip),rotate:parseFloat(this.attrs.rotate),scale_x:parseFloat(this.attrs.scale_x),scale_y:parseFloat(this.attrs.scale_y),fps:parseFloat(this.attrs.fps),grayscale:parseInt(0+this.attrs.grayscale)}}},methods:{getUrl(a,t){return"/camera/"+a+"/"+t+"?"+Object.entries(this.params).filter((a=>null!=a[1]&&(""+a[1]).length>0)).map((([a,t])=>a+"="+t)).join("&")},_startStreaming(a){this.streaming||(this.streaming=!0,this.capturing=!1,this.captured=!1,this.url=this.getUrl(a,"video."+this.attrs.stream_format))},stopStreaming(){this.streaming&&(this.streaming=!1,this.capturing=!1,this.url=null)},_capture(a){this.capturing||(this.streaming=!1,this.capturing=!0,this.captured=!0,this.url=this.getUrl(a,"photo.jpg")+"&t="+(new Date).getTime())},onFrameLoaded(){this.capturing&&(this.capturing=!1)},onDeviceChanged(){},onFlipChanged(){},onSizeChanged(){const a=a=>a*Math.PI/180,t=a(this.params.rotate);this.$refs.frameContainer.style.width=Math.round(this.params.scale_x*Math.abs(this.params.resolution[0]*Math.cos(t)+this.params.resolution[1]*Math.sin(t)))+"px",this.$refs.frameContainer.style.height=Math.round(this.params.scale_y*Math.abs(this.params.resolution[0]*Math.sin(t)+this.params.resolution[1]*Math.cos(t)))+"px"},onFpsChanged(){},onGrayscaleChanged(){},startAudio(){this.audioOn=!0},async stopAudio(){this.audioOn=!1,await this.request("sound.stop_recording")}},created(){const a=this.$root.config[`camera.${this.cameraPlugin}`]||{};this.attrs={resolution:a.resolution||[640,480],device:a.device,horizontal_flip:a.horizontal_flip||0,vertical_flip:a.vertical_flip||0,rotate:a.rotate||0,scale_x:a.scale_x||1,scale_y:a.scale_y||1,fps:a.fps||16,grayscale:a.grayscale||0,stream_format:a.stream_format||"mjpeg"}},mounted(){this.$refs.frame.addEventListener("load",this.onFrameLoaded),this.onSizeChanged(),this.$watch((()=>this.attrs.resolution),this.onSizeChanged),this.$watch((()=>this.attrs.horizontal_flip),this.onSizeChanged),this.$watch((()=>this.attrs.vertical_flip),this.onSizeChanged),this.$watch((()=>this.attrs.rotate),this.onSizeChanged),this.$watch((()=>this.attrs.scale_x),this.onSizeChanged),this.$watch((()=>this.attrs.scale_y),this.onSizeChanged)}};const la=ia;var ra=la,oa=e(1794),ca={name:"Camera",components:{Modal:oa.Z},mixins:[ra],props:{cameraPlugin:{type:String,required:!0}},computed:{fullURL(){return`${window.location.protocol}//${window.location.host}${this.url}`}},methods:{startStreaming(){this._startStreaming(this.cameraPlugin)},capture(){this._capture(this.cameraPlugin)}}},pa=e(3744);const ha=(0,pa.Z)(ca,[["render",sa]]);var ua=ha}}]); +//# sourceMappingURL=5465.e48f0738.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5465.e48f0738.js.map b/platypush/backend/http/webapp/dist/static/js/5465.e48f0738.js.map new file mode 100644 index 00000000..cab06fd3 --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/5465.e48f0738.js.map @@ -0,0 +1 @@ +{"version":3,"file":"static/js/5465.e48f0738.js","mappings":"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","sources":["webpack://platypush/./src/components/panels/Camera/Index.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue?be5e","webpack://platypush/./src/components/panels/Camera/Index.vue?8810"],"sourcesContent":["\n\n\n\n\n","\n","import script from \"./Mixin.vue?vue&type=script&lang=js\"\nexport * from \"./Mixin.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=a4970096\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=a4970096&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["class","ref","autoplay","preload","streaming","capturing","captured","src","url","alt","type","stopStreaming","disabled","title","startStreaming","capture","audioOn","stopAudio","startAudio","$refs","paramsModal","show","Date","getTime","length","name","value","fullURL","attrs","device","onDeviceChanged","resolution","onSizeChanged","horizontal_flip","onFlipChanged","vertical_flip","rotate","scale_x","scale_y","fps","onFpsChanged","grayscale","onGrayscaleChanged","mixins","Utils","props","cameraPlugin","String","required","data","computed","params","this","parseInt","parseFloat","methods","getUrl","plugin","action","Object","entries","filter","entry","map","k","v","join","_startStreaming","stream_format","_capture","onFrameLoaded","degToRad","deg","Math","PI","rot","frameContainer","style","width","round","abs","cos","sin","height","async","request","created","config","$root","mounted","frame","addEventListener","$watch","__exports__","components","Modal","window","location","protocol","host","render"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5528-legacy.c6626d00.js b/platypush/backend/http/webapp/dist/static/js/5528-legacy.c6626d00.js deleted file mode 100644 index 969bce59..00000000 --- a/platypush/backend/http/webapp/dist/static/js/5528-legacy.c6626d00.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[5528],{5528:function(t,a,e){e.r(a),e.d(a,{default:function(){return ft}});var n=e(6252),r=e(9963),i={class:"camera"},s={class:"camera-container"},o={class:"frame-container",ref:"frameContainer"},l={key:0,class:"no-frame"},u=["src"],c={class:"controls"},p={class:"left"},h=["disabled"],d=(0,n._)("i",{class:"fa fa-play"},null,-1),f=[d],m=["disabled"],g=(0,n._)("i",{class:"fa fa-stop"},null,-1),_=[g],y=["disabled"],C=(0,n._)("i",{class:"fas fa-camera"},null,-1),v=[C],w={class:"right"},b=(0,n._)("i",{class:"fas fa-volume-mute"},null,-1),S=[b],k=(0,n._)("i",{class:"fas fa-volume-up"},null,-1),x=[k],z=(0,n._)("i",{class:"fas fa-cog"},null,-1),F=[z],U={class:"audio-container"},D={key:0,autoplay:"",preload:"none",ref:"player"},M=["src"],V=(0,n.Uk)(" Your browser does not support audio elements "),$={key:0,class:"url"},q={class:"row"},P=(0,n._)("span",{class:"name"},"Stream URL",-1),A=["value"],L={class:"params"},O={class:"row"},R=(0,n._)("span",{class:"name"},"Device",-1),Z={class:"row"},j=(0,n._)("span",{class:"name"},"Width",-1),G={class:"row"},I=(0,n._)("span",{class:"name"},"Height",-1),T={class:"row"},W=(0,n._)("span",{class:"name"},"Horizontal Flip",-1),H={class:"row"},Y=(0,n._)("span",{class:"name"},"Vertical Flip",-1),E={class:"row"},X=(0,n._)("span",{class:"name"},"Rotate",-1),B={class:"row"},J=(0,n._)("span",{class:"name"},"Scale-X",-1),K={class:"row"},N=(0,n._)("span",{class:"name"},"Scale-Y",-1),Q={class:"row"},tt=(0,n._)("span",{class:"name"},"Frames per second",-1),at={class:"row"},et=(0,n._)("span",{class:"name"},"Grayscale",-1);function nt(t,a,e,d,g,C){var b,k=(0,n.up)("Slot"),z=(0,n.up)("Modal");return(0,n.wg)(),(0,n.iD)("div",i,[(0,n._)("div",s,[(0,n._)("div",o,[t.streaming||t.capturing||t.captured?(0,n.kq)("",!0):((0,n.wg)(),(0,n.iD)("div",l,"The camera is not active")),(0,n._)("img",{class:"frame",src:t.url,ref:"frame",alt:""},null,8,u)],512),(0,n._)("div",c,[(0,n._)("div",p,[t.streaming?((0,n.wg)(),(0,n.iD)("button",{key:1,type:"button",onClick:a[1]||(a[1]=function(){return t.stopStreaming&&t.stopStreaming.apply(t,arguments)}),disabled:t.capturing,title:"Stop video"},_,8,m)):((0,n.wg)(),(0,n.iD)("button",{key:0,type:"button",onClick:a[0]||(a[0]=function(){return C.startStreaming&&C.startStreaming.apply(C,arguments)}),disabled:t.capturing,title:"Start video"},f,8,h)),t.streaming?(0,n.kq)("",!0):((0,n.wg)(),(0,n.iD)("button",{key:2,type:"button",onClick:a[2]||(a[2]=function(){return C.capture&&C.capture.apply(C,arguments)}),disabled:t.streaming||t.capturing,title:"Take a picture"},v,8,y))]),(0,n._)("div",w,[t.audioOn?((0,n.wg)(),(0,n.iD)("button",{key:1,type:"button",onClick:a[4]||(a[4]=function(){return t.stopAudio&&t.stopAudio.apply(t,arguments)}),title:"Stop audio"},x)):((0,n.wg)(),(0,n.iD)("button",{key:0,type:"button",onClick:a[3]||(a[3]=function(){return t.startAudio&&t.startAudio.apply(t,arguments)}),title:"Start audio"},S)),(0,n._)("button",{type:"button",onClick:a[5]||(a[5]=function(a){return t.$refs.paramsModal.show()}),title:"Settings"},F)])])]),(0,n._)("div",U,[t.audioOn?((0,n.wg)(),(0,n.iD)("audio",D,[(0,n._)("source",{src:"/sound/stream?t=".concat((new Date).getTime()),type:"audio/x-wav;codec=pcm"},null,8,M),V],512)):(0,n.kq)("",!0)]),null!==(b=t.url)&&void 0!==b&&b.length?((0,n.wg)(),(0,n.iD)("div",$,[(0,n._)("label",q,[P,(0,n._)("input",{name:"url",type:"text",value:C.fullURL,disabled:"disabled"},null,8,A)])])):(0,n.kq)("",!0),(0,n.Wm)(z,{ref:"paramsModal",title:"Camera Parameters"},{default:(0,n.w5)((function(){return[(0,n._)("div",L,[(0,n._)("label",O,[R,(0,n.wy)((0,n._)("input",{name:"device",type:"text","onUpdate:modelValue":a[6]||(a[6]=function(a){return t.attrs.device=a}),onChange:a[7]||(a[7]=function(){return t.onDeviceChanged&&t.onDeviceChanged.apply(t,arguments)})},null,544),[[r.nr,t.attrs.device]])]),(0,n._)("label",Z,[j,(0,n.wy)((0,n._)("input",{name:"width",type:"text","onUpdate:modelValue":a[8]||(a[8]=function(a){return t.attrs.resolution[0]=a}),onChange:a[9]||(a[9]=function(){return t.onSizeChanged&&t.onSizeChanged.apply(t,arguments)})},null,544),[[r.nr,t.attrs.resolution[0]]])]),(0,n._)("label",G,[I,(0,n.wy)((0,n._)("input",{name:"height",type:"text","onUpdate:modelValue":a[10]||(a[10]=function(a){return t.attrs.resolution[1]=a}),onChange:a[11]||(a[11]=function(){return t.onSizeChanged&&t.onSizeChanged.apply(t,arguments)})},null,544),[[r.nr,t.attrs.resolution[1]]])]),(0,n._)("label",T,[W,(0,n.wy)((0,n._)("input",{name:"horizontal_flip",type:"checkbox","onUpdate:modelValue":a[12]||(a[12]=function(a){return t.attrs.horizontal_flip=a}),onChange:a[13]||(a[13]=function(){return t.onFlipChanged&&t.onFlipChanged.apply(t,arguments)})},null,544),[[r.e8,t.attrs.horizontal_flip]])]),(0,n._)("label",H,[Y,(0,n.wy)((0,n._)("input",{name:"vertical_flip",type:"checkbox","onUpdate:modelValue":a[14]||(a[14]=function(a){return t.attrs.vertical_flip=a}),onChange:a[15]||(a[15]=function(){return t.onFlipChanged&&t.onFlipChanged.apply(t,arguments)})},null,544),[[r.e8,t.attrs.vertical_flip]])]),(0,n._)("label",E,[X,(0,n.wy)((0,n._)("input",{name:"rotate",type:"text","onUpdate:modelValue":a[16]||(a[16]=function(a){return t.attrs.rotate=a}),onChange:a[17]||(a[17]=function(){return t.onSizeChanged&&t.onSizeChanged.apply(t,arguments)})},null,544),[[r.nr,t.attrs.rotate]])]),(0,n._)("label",B,[J,(0,n.wy)((0,n._)("input",{name:"scale_x",type:"text","onUpdate:modelValue":a[18]||(a[18]=function(a){return t.attrs.scale_x=a}),onChange:a[19]||(a[19]=function(){return t.onSizeChanged&&t.onSizeChanged.apply(t,arguments)})},null,544),[[r.nr,t.attrs.scale_x]])]),(0,n._)("label",K,[N,(0,n.wy)((0,n._)("input",{name:"scale_y",type:"text","onUpdate:modelValue":a[20]||(a[20]=function(a){return t.attrs.scale_y=a}),onChange:a[21]||(a[21]=function(){return t.onSizeChanged&&t.onSizeChanged.apply(t,arguments)})},null,544),[[r.nr,t.attrs.scale_y]])]),(0,n._)("label",Q,[tt,(0,n.wy)((0,n._)("input",{name:"fps",type:"text","onUpdate:modelValue":a[22]||(a[22]=function(a){return t.attrs.fps=a}),onChange:a[23]||(a[23]=function(){return t.onFpsChanged&&t.onFpsChanged.apply(t,arguments)})},null,544),[[r.nr,t.attrs.fps]])]),(0,n._)("label",at,[et,(0,n.wy)((0,n._)("input",{name:"grayscale",type:"checkbox","onUpdate:modelValue":a[24]||(a[24]=function(a){return t.attrs.grayscale=a}),onChange:a[25]||(a[25]=function(){return t.onGrayscaleChanged&&t.onGrayscaleChanged.apply(t,arguments)})},null,544),[[r.e8,t.attrs.grayscale]])]),(0,n.Wm)(k)])]})),_:1},512)])}e(2222);var rt=e(8534),it=e(6084),st=(e(5666),e(9600),e(1249),e(7327),e(1539),e(9720),e(6813)),ot={name:"CameraMixin",mixins:[st.Z],props:{cameraPlugin:{type:String,required:!0}},data:function(){return{streaming:!1,capturing:!1,captured:!1,audioOn:!1,url:null,attrs:{}}},computed:{params:function(){var t;return{resolution:this.attrs.resolution,device:null!==(t=this.attrs.device)&&void 0!==t&&t.length?this.attrs.device:null,horizontal_flip:parseInt(0+this.attrs.horizontal_flip),vertical_flip:parseInt(0+this.attrs.vertical_flip),rotate:parseFloat(this.attrs.rotate),scale_x:parseFloat(this.attrs.scale_x),scale_y:parseFloat(this.attrs.scale_y),fps:parseFloat(this.attrs.fps),grayscale:parseInt(0+this.attrs.grayscale)}}},methods:{getUrl:function(t,a){return"/camera/"+t+"/"+a+"?"+Object.entries(this.params).filter((function(t){return null!=t[1]&&(""+t[1]).length>0})).map((function(t){var a=(0,it.Z)(t,2),e=a[0],n=a[1];return e+"="+n})).join("&")},_startStreaming:function(t){this.streaming||(this.streaming=!0,this.capturing=!1,this.captured=!1,this.url=this.getUrl(t,"video."+this.attrs.stream_format))},stopStreaming:function(){this.streaming&&(this.streaming=!1,this.capturing=!1,this.url=null)},_capture:function(t){this.capturing||(this.streaming=!1,this.capturing=!0,this.captured=!0,this.url=this.getUrl(t,"photo.jpg")+"&t="+(new Date).getTime())},onFrameLoaded:function(){this.capturing&&(this.capturing=!1)},onDeviceChanged:function(){},onFlipChanged:function(){},onSizeChanged:function(){var t=function(t){return t*Math.PI/180},a=t(this.params.rotate);this.$refs.frameContainer.style.width=Math.round(this.params.scale_x*Math.abs(this.params.resolution[0]*Math.cos(a)+this.params.resolution[1]*Math.sin(a)))+"px",this.$refs.frameContainer.style.height=Math.round(this.params.scale_y*Math.abs(this.params.resolution[0]*Math.sin(a)+this.params.resolution[1]*Math.cos(a)))+"px"},onFpsChanged:function(){},onGrayscaleChanged:function(){},startAudio:function(){this.audioOn=!0},stopAudio:function(){var t=this;return(0,rt.Z)(regeneratorRuntime.mark((function a(){return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return t.audioOn=!1,a.next=3,t.request("sound.stop_recording");case 3:case"end":return a.stop()}}),a)})))()}},created:function(){var t=this.$root.config["camera.".concat(this.cameraPlugin)]||{};this.attrs={resolution:t.resolution||[640,480],device:t.device,horizontal_flip:t.horizontal_flip||0,vertical_flip:t.vertical_flip||0,rotate:t.rotate||0,scale_x:t.scale_x||1,scale_y:t.scale_y||1,fps:t.fps||16,grayscale:t.grayscale||0,stream_format:t.stream_format||"mjpeg"}},mounted:function(){var t=this;this.$refs.frame.addEventListener("load",this.onFrameLoaded),this.onSizeChanged(),this.$watch((function(){return t.attrs.resolution}),this.onSizeChanged),this.$watch((function(){return t.attrs.horizontal_flip}),this.onSizeChanged),this.$watch((function(){return t.attrs.vertical_flip}),this.onSizeChanged),this.$watch((function(){return t.attrs.rotate}),this.onSizeChanged),this.$watch((function(){return t.attrs.scale_x}),this.onSizeChanged),this.$watch((function(){return t.attrs.scale_y}),this.onSizeChanged)}};const lt=ot;var ut=lt,ct=e(1794),pt={name:"Camera",components:{Modal:ct.Z},mixins:[ut],props:{cameraPlugin:{type:String,required:!0}},computed:{fullURL:function(){return"".concat(window.location.protocol,"//").concat(window.location.host).concat(this.url)}},methods:{startStreaming:function(){this._startStreaming(this.cameraPlugin)},capture:function(){this._capture(this.cameraPlugin)}}},ht=e(3744);const dt=(0,ht.Z)(pt,[["render",nt]]);var ft=dt}}]); -//# sourceMappingURL=5528-legacy.c6626d00.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5528-legacy.c6626d00.js.map b/platypush/backend/http/webapp/dist/static/js/5528-legacy.c6626d00.js.map deleted file mode 100644 index f22f22e4..00000000 --- a/platypush/backend/http/webapp/dist/static/js/5528-legacy.c6626d00.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/5528-legacy.c6626d00.js","mappings":"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","sources":["webpack://platypush/./src/components/panels/Camera/Index.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue?be5e","webpack://platypush/./src/components/panels/Camera/Index.vue?8810"],"sourcesContent":["\n\n\n\n\n","\n","import script from \"./Mixin.vue?vue&type=script&lang=js\"\nexport * from \"./Mixin.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=bfa8f2aa\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=bfa8f2aa&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["class","ref","autoplay","preload","streaming","capturing","captured","src","url","alt","type","stopStreaming","disabled","title","startStreaming","capture","audioOn","stopAudio","startAudio","$refs","paramsModal","show","Date","getTime","length","name","value","fullURL","attrs","device","onDeviceChanged","resolution","onSizeChanged","horizontal_flip","onFlipChanged","vertical_flip","rotate","scale_x","scale_y","fps","onFpsChanged","grayscale","onGrayscaleChanged","mixins","Utils","props","cameraPlugin","String","required","data","computed","params","this","parseInt","parseFloat","methods","getUrl","plugin","action","Object","entries","filter","entry","map","k","v","join","_startStreaming","stream_format","_capture","onFrameLoaded","degToRad","deg","Math","PI","rot","frameContainer","style","width","round","abs","cos","sin","height","request","created","config","$root","mounted","frame","addEventListener","$watch","__exports__","components","Modal","window","location","protocol","host","render"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5528.10b051ba.js b/platypush/backend/http/webapp/dist/static/js/5528.10b051ba.js deleted file mode 100644 index 264e4c3d..00000000 --- a/platypush/backend/http/webapp/dist/static/js/5528.10b051ba.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[5528],{5528:function(a,t,e){e.r(t),e.d(t,{default:function(){return ua}});var s=e(6252),n=e(9963);const i={class:"camera"},l={class:"camera-container"},r={class:"frame-container",ref:"frameContainer"},o={key:0,class:"no-frame"},c=["src"],p={class:"controls"},h={class:"left"},u=["disabled"],d=(0,s._)("i",{class:"fa fa-play"},null,-1),m=[d],g=["disabled"],_=(0,s._)("i",{class:"fa fa-stop"},null,-1),f=[_],y=["disabled"],C=(0,s._)("i",{class:"fas fa-camera"},null,-1),w=[C],v={class:"right"},b=(0,s._)("i",{class:"fas fa-volume-mute"},null,-1),S=[b],k=(0,s._)("i",{class:"fas fa-volume-up"},null,-1),z=[k],x=(0,s._)("i",{class:"fas fa-cog"},null,-1),F=[x],U={class:"audio-container"},$={key:0,autoplay:"",preload:"none",ref:"player"},D=["src"],M=(0,s.Uk)(" Your browser does not support audio elements "),V={key:0,class:"url"},q={class:"row"},P=(0,s._)("span",{class:"name"},"Stream URL",-1),A=["value"],L={class:"params"},O={class:"row"},j=(0,s._)("span",{class:"name"},"Device",-1),G={class:"row"},I=(0,s._)("span",{class:"name"},"Width",-1),R={class:"row"},T=(0,s._)("span",{class:"name"},"Height",-1),W={class:"row"},Z=(0,s._)("span",{class:"name"},"Horizontal Flip",-1),H={class:"row"},Y=(0,s._)("span",{class:"name"},"Vertical Flip",-1),E={class:"row"},X=(0,s._)("span",{class:"name"},"Rotate",-1),B={class:"row"},J=(0,s._)("span",{class:"name"},"Scale-X",-1),K={class:"row"},N=(0,s._)("span",{class:"name"},"Scale-Y",-1),Q={class:"row"},aa=(0,s._)("span",{class:"name"},"Frames per second",-1),ta={class:"row"},ea=(0,s._)("span",{class:"name"},"Grayscale",-1);function sa(a,t,e,d,_,C){const b=(0,s.up)("Slot"),k=(0,s.up)("Modal");return(0,s.wg)(),(0,s.iD)("div",i,[(0,s._)("div",l,[(0,s._)("div",r,[a.streaming||a.capturing||a.captured?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("div",o,"The camera is not active")),(0,s._)("img",{class:"frame",src:a.url,ref:"frame",alt:""},null,8,c)],512),(0,s._)("div",p,[(0,s._)("div",h,[a.streaming?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[1]||(t[1]=(...t)=>a.stopStreaming&&a.stopStreaming(...t)),disabled:a.capturing,title:"Stop video"},f,8,g)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[0]||(t[0]=(...a)=>C.startStreaming&&C.startStreaming(...a)),disabled:a.capturing,title:"Start video"},m,8,u)),a.streaming?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("button",{key:2,type:"button",onClick:t[2]||(t[2]=(...a)=>C.capture&&C.capture(...a)),disabled:a.streaming||a.capturing,title:"Take a picture"},w,8,y))]),(0,s._)("div",v,[a.audioOn?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[4]||(t[4]=(...t)=>a.stopAudio&&a.stopAudio(...t)),title:"Stop audio"},z)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[3]||(t[3]=(...t)=>a.startAudio&&a.startAudio(...t)),title:"Start audio"},S)),(0,s._)("button",{type:"button",onClick:t[5]||(t[5]=t=>a.$refs.paramsModal.show()),title:"Settings"},F)])])]),(0,s._)("div",U,[a.audioOn?((0,s.wg)(),(0,s.iD)("audio",$,[(0,s._)("source",{src:`/sound/stream?t=${(new Date).getTime()}`,type:"audio/x-wav;codec=pcm"},null,8,D),M],512)):(0,s.kq)("",!0)]),a.url?.length?((0,s.wg)(),(0,s.iD)("div",V,[(0,s._)("label",q,[P,(0,s._)("input",{name:"url",type:"text",value:C.fullURL,disabled:"disabled"},null,8,A)])])):(0,s.kq)("",!0),(0,s.Wm)(k,{ref:"paramsModal",title:"Camera Parameters"},{default:(0,s.w5)((()=>[(0,s._)("div",L,[(0,s._)("label",O,[j,(0,s.wy)((0,s._)("input",{name:"device",type:"text","onUpdate:modelValue":t[6]||(t[6]=t=>a.attrs.device=t),onChange:t[7]||(t[7]=(...t)=>a.onDeviceChanged&&a.onDeviceChanged(...t))},null,544),[[n.nr,a.attrs.device]])]),(0,s._)("label",G,[I,(0,s.wy)((0,s._)("input",{name:"width",type:"text","onUpdate:modelValue":t[8]||(t[8]=t=>a.attrs.resolution[0]=t),onChange:t[9]||(t[9]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[0]]])]),(0,s._)("label",R,[T,(0,s.wy)((0,s._)("input",{name:"height",type:"text","onUpdate:modelValue":t[10]||(t[10]=t=>a.attrs.resolution[1]=t),onChange:t[11]||(t[11]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[1]]])]),(0,s._)("label",W,[Z,(0,s.wy)((0,s._)("input",{name:"horizontal_flip",type:"checkbox","onUpdate:modelValue":t[12]||(t[12]=t=>a.attrs.horizontal_flip=t),onChange:t[13]||(t[13]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.horizontal_flip]])]),(0,s._)("label",H,[Y,(0,s.wy)((0,s._)("input",{name:"vertical_flip",type:"checkbox","onUpdate:modelValue":t[14]||(t[14]=t=>a.attrs.vertical_flip=t),onChange:t[15]||(t[15]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.vertical_flip]])]),(0,s._)("label",E,[X,(0,s.wy)((0,s._)("input",{name:"rotate",type:"text","onUpdate:modelValue":t[16]||(t[16]=t=>a.attrs.rotate=t),onChange:t[17]||(t[17]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.rotate]])]),(0,s._)("label",B,[J,(0,s.wy)((0,s._)("input",{name:"scale_x",type:"text","onUpdate:modelValue":t[18]||(t[18]=t=>a.attrs.scale_x=t),onChange:t[19]||(t[19]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_x]])]),(0,s._)("label",K,[N,(0,s.wy)((0,s._)("input",{name:"scale_y",type:"text","onUpdate:modelValue":t[20]||(t[20]=t=>a.attrs.scale_y=t),onChange:t[21]||(t[21]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_y]])]),(0,s._)("label",Q,[aa,(0,s.wy)((0,s._)("input",{name:"fps",type:"text","onUpdate:modelValue":t[22]||(t[22]=t=>a.attrs.fps=t),onChange:t[23]||(t[23]=(...t)=>a.onFpsChanged&&a.onFpsChanged(...t))},null,544),[[n.nr,a.attrs.fps]])]),(0,s._)("label",ta,[ea,(0,s.wy)((0,s._)("input",{name:"grayscale",type:"checkbox","onUpdate:modelValue":t[24]||(t[24]=t=>a.attrs.grayscale=t),onChange:t[25]||(t[25]=(...t)=>a.onGrayscaleChanged&&a.onGrayscaleChanged(...t))},null,544),[[n.e8,a.attrs.grayscale]])]),(0,s.Wm)(b)])])),_:1},512)])}var na=e(6813),ia={name:"CameraMixin",mixins:[na.Z],props:{cameraPlugin:{type:String,required:!0}},data(){return{streaming:!1,capturing:!1,captured:!1,audioOn:!1,url:null,attrs:{}}},computed:{params(){return{resolution:this.attrs.resolution,device:this.attrs.device?.length?this.attrs.device:null,horizontal_flip:parseInt(0+this.attrs.horizontal_flip),vertical_flip:parseInt(0+this.attrs.vertical_flip),rotate:parseFloat(this.attrs.rotate),scale_x:parseFloat(this.attrs.scale_x),scale_y:parseFloat(this.attrs.scale_y),fps:parseFloat(this.attrs.fps),grayscale:parseInt(0+this.attrs.grayscale)}}},methods:{getUrl(a,t){return"/camera/"+a+"/"+t+"?"+Object.entries(this.params).filter((a=>null!=a[1]&&(""+a[1]).length>0)).map((([a,t])=>a+"="+t)).join("&")},_startStreaming(a){this.streaming||(this.streaming=!0,this.capturing=!1,this.captured=!1,this.url=this.getUrl(a,"video."+this.attrs.stream_format))},stopStreaming(){this.streaming&&(this.streaming=!1,this.capturing=!1,this.url=null)},_capture(a){this.capturing||(this.streaming=!1,this.capturing=!0,this.captured=!0,this.url=this.getUrl(a,"photo.jpg")+"&t="+(new Date).getTime())},onFrameLoaded(){this.capturing&&(this.capturing=!1)},onDeviceChanged(){},onFlipChanged(){},onSizeChanged(){const a=a=>a*Math.PI/180,t=a(this.params.rotate);this.$refs.frameContainer.style.width=Math.round(this.params.scale_x*Math.abs(this.params.resolution[0]*Math.cos(t)+this.params.resolution[1]*Math.sin(t)))+"px",this.$refs.frameContainer.style.height=Math.round(this.params.scale_y*Math.abs(this.params.resolution[0]*Math.sin(t)+this.params.resolution[1]*Math.cos(t)))+"px"},onFpsChanged(){},onGrayscaleChanged(){},startAudio(){this.audioOn=!0},async stopAudio(){this.audioOn=!1,await this.request("sound.stop_recording")}},created(){const a=this.$root.config[`camera.${this.cameraPlugin}`]||{};this.attrs={resolution:a.resolution||[640,480],device:a.device,horizontal_flip:a.horizontal_flip||0,vertical_flip:a.vertical_flip||0,rotate:a.rotate||0,scale_x:a.scale_x||1,scale_y:a.scale_y||1,fps:a.fps||16,grayscale:a.grayscale||0,stream_format:a.stream_format||"mjpeg"}},mounted(){this.$refs.frame.addEventListener("load",this.onFrameLoaded),this.onSizeChanged(),this.$watch((()=>this.attrs.resolution),this.onSizeChanged),this.$watch((()=>this.attrs.horizontal_flip),this.onSizeChanged),this.$watch((()=>this.attrs.vertical_flip),this.onSizeChanged),this.$watch((()=>this.attrs.rotate),this.onSizeChanged),this.$watch((()=>this.attrs.scale_x),this.onSizeChanged),this.$watch((()=>this.attrs.scale_y),this.onSizeChanged)}};const la=ia;var ra=la,oa=e(1794),ca={name:"Camera",components:{Modal:oa.Z},mixins:[ra],props:{cameraPlugin:{type:String,required:!0}},computed:{fullURL(){return`${window.location.protocol}//${window.location.host}${this.url}`}},methods:{startStreaming(){this._startStreaming(this.cameraPlugin)},capture(){this._capture(this.cameraPlugin)}}},pa=e(3744);const ha=(0,pa.Z)(ca,[["render",sa]]);var ua=ha}}]); -//# sourceMappingURL=5528.10b051ba.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/5528.10b051ba.js.map b/platypush/backend/http/webapp/dist/static/js/5528.10b051ba.js.map deleted file mode 100644 index e1face54..00000000 --- a/platypush/backend/http/webapp/dist/static/js/5528.10b051ba.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/5528.10b051ba.js","mappings":"iMACOA,MAAM,U,GACJA,MAAM,oB,GACJA,MAAM,kBAAkBC,IAAI,kB,SAC1BD,MAAM,Y,aAIRA,MAAM,Y,GACJA,MAAM,Q,kBAEP,OAAwB,KAArBA,MAAM,cAAY,S,GAArB,G,kBAIA,OAAwB,KAArBA,MAAM,cAAY,S,GAArB,G,kBAKA,OAA2B,KAAxBA,MAAM,iBAAe,S,GAAxB,G,GAICA,MAAM,S,GAEP,OAAgC,KAA7BA,MAAM,sBAAoB,S,GAA7B,G,GAIA,OAA8B,KAA3BA,MAAM,oBAAkB,S,GAA3B,G,GAIA,OAAwB,KAArBA,MAAM,cAAY,S,GAArB,G,GAMHA,MAAM,mB,SACFE,SAAA,GAASC,QAAQ,OAAOF,IAAI,U,qBAEuD,kD,SAKvFD,MAAM,O,GACFA,MAAM,O,GACX,OAAoC,QAA9BA,MAAM,QAAO,cAAU,G,eAM1BA,MAAM,U,GACFA,MAAM,O,GACX,OAAgC,QAA1BA,MAAM,QAAO,UAAM,G,GAIpBA,MAAM,O,GACX,OAA+B,QAAzBA,MAAM,QAAO,SAAK,G,GAInBA,MAAM,O,GACX,OAAgC,QAA1BA,MAAM,QAAO,UAAM,G,GAIpBA,MAAM,O,GACX,OAAyC,QAAnCA,MAAM,QAAO,mBAAe,G,GAI7BA,MAAM,O,GACX,OAAuC,QAAjCA,MAAM,QAAO,iBAAa,G,GAI3BA,MAAM,O,GACX,OAAgC,QAA1BA,MAAM,QAAO,UAAM,G,GAIpBA,MAAM,O,GACX,OAAiC,QAA3BA,MAAM,QAAO,WAAO,G,GAIrBA,MAAM,O,GACX,OAAiC,QAA3BA,MAAM,QAAO,WAAO,G,GAIrBA,MAAM,O,IACX,OAA2C,QAArCA,MAAM,QAAO,qBAAiB,G,IAI/BA,MAAM,O,IACX,OAAmC,QAA7BA,MAAM,QAAO,aAAS,G,wFAtGpC,QA6GM,MA7GN,EA6GM,EA5GJ,OAoCM,MApCN,EAoCM,EAnCJ,OAGM,MAHN,EAGM,CAFyB,EAAAI,WAAc,EAAAC,WAAc,EAAAC,UAAzD,iBAAyD,WAAzD,QAAiG,MAAjG,EAAmE,8BACnE,OAAiD,OAA5CN,MAAM,QAASO,IAAK,EAAAC,IAAKP,IAAI,QAAQQ,IAAI,IAA9C,WAFF,MAKA,OA6BM,MA7BN,EA6BM,EA5BJ,OAaM,MAbN,EAaM,CAZ2F,EAAAL,YAA/F,WAIA,QAES,U,MAFDM,KAAK,SAAU,QAAK,oBAAE,EAAAC,eAAA,EAAAA,iBAAA,IAAgBC,SAAU,EAAAP,UAAWQ,MAAM,cAAzE,UAJ+F,WAA/F,QAES,U,MAFDH,KAAK,SAAU,QAAK,oBAAE,EAAAI,gBAAA,EAAAA,kBAAA,IAAiBF,SAAU,EAAAP,UAAWQ,MAAM,eAA1E,QAQiF,EAAAT,WAAjF,iBAAiF,WAAjF,QAGS,U,MAHDM,KAAK,SAAU,QAAK,oBAAE,EAAAK,SAAA,EAAAA,WAAA,IAAUH,SAAU,EAAAR,WAAa,EAAAC,UACvDQ,MAAM,kBADd,WAMF,OAYM,MAZN,EAYM,CAXiE,EAAAG,UAArE,WAIA,QAES,U,MAFDN,KAAK,SAAU,QAAK,oBAAE,EAAAO,WAAA,EAAAA,aAAA,IAAWJ,MAAM,cAA/C,MAJqE,WAArE,QAES,U,MAFDH,KAAK,SAAU,QAAK,oBAAE,EAAAQ,YAAA,EAAAA,cAAA,IAAYL,MAAM,eAAhD,KAQA,OAES,UAFDH,KAAK,SAAU,QAAK,eAAE,EAAAS,MAAMC,YAAYC,QAAQR,MAAM,YAA9D,UAON,OAMM,MANN,EAMM,CAL8C,EAAAG,UAAA,WAAlD,QAIQ,QAJR,EAIQ,EAFN,OAAwF,UAA/ET,IAAG,wBAA0Be,MAAQC,YAAab,KAAK,yBAAhE,UAEM,GAJR,wBAOqB,EAAAF,KAAKgB,SAAA,WAA5B,QAKM,MALN,EAKM,EAJJ,OAGQ,QAHR,EAGQ,CAFN,GACA,OAAoE,SAA7DC,KAAK,MAAMf,KAAK,OAAQgB,MAAO,EAAAC,QAASf,SAAS,YAAxD,gBAHJ,gBAOA,QAsDQ,GAtDDX,IAAI,cAAcY,MAAM,qBAA/B,C,kBACE,IAoDM,EApDN,OAoDM,MApDN,EAoDM,EAnDJ,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAmF,SAA5EY,KAAK,SAASf,KAAK,O,qCAAgB,EAAAkB,MAAMC,OAAM,GAAG,SAAM,oBAAE,EAAAC,iBAAA,EAAAA,mBAAA,KAAjE,iBAA0C,EAAAF,MAAMC,aAGlD,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAuF,SAAhFJ,KAAK,QAAQf,KAAK,O,qCAAgB,EAAAkB,MAAMG,WAAU,MAAM,SAAM,oBAAE,EAAAC,eAAA,EAAAA,iBAAA,KAAvE,iBAAyC,EAAAJ,MAAMG,WAAU,SAG3D,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAwF,SAAjFN,KAAK,SAASf,KAAK,O,uCAAgB,EAAAkB,MAAMG,WAAU,MAAM,SAAM,sBAAE,EAAAC,eAAA,EAAAA,iBAAA,KAAxE,iBAA0C,EAAAJ,MAAMG,WAAU,SAG5D,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAuG,SAAhGN,KAAK,kBAAkBf,KAAK,W,uCAAoB,EAAAkB,MAAMK,gBAAe,GAAG,SAAM,sBAAE,EAAAC,eAAA,EAAAA,iBAAA,KAAvF,iBAAuD,EAAAN,MAAMK,sBAG/D,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAmG,SAA5FR,KAAK,gBAAgBf,KAAK,W,uCAAoB,EAAAkB,MAAMO,cAAa,GAAG,SAAM,sBAAE,EAAAD,eAAA,EAAAA,iBAAA,KAAnF,iBAAqD,EAAAN,MAAMO,oBAG7D,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAiF,SAA1EV,KAAK,SAASf,KAAK,O,uCAAgB,EAAAkB,MAAMQ,OAAM,GAAG,SAAM,sBAAE,EAAAJ,eAAA,EAAAA,iBAAA,KAAjE,iBAA0C,EAAAJ,MAAMQ,aAGlD,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAmF,SAA5EX,KAAK,UAAUf,KAAK,O,uCAAgB,EAAAkB,MAAMS,QAAO,GAAG,SAAM,sBAAE,EAAAL,eAAA,EAAAA,iBAAA,KAAnE,iBAA2C,EAAAJ,MAAMS,cAGnD,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAmF,SAA5EZ,KAAK,UAAUf,KAAK,O,uCAAgB,EAAAkB,MAAMU,QAAO,GAAG,SAAM,sBAAE,EAAAN,eAAA,EAAAA,iBAAA,KAAnE,iBAA2C,EAAAJ,MAAMU,cAGnD,OAGQ,QAHR,EAGQ,CAFN,IAEM,SADN,OAA0E,SAAnEb,KAAK,MAAMf,KAAK,O,uCAAgB,EAAAkB,MAAMW,IAAG,GAAG,SAAM,sBAAE,EAAAC,cAAA,EAAAA,gBAAA,KAA3D,iBAAuC,EAAAZ,MAAMW,UAG/C,OAGQ,QAHR,GAGQ,CAFN,IAEM,SADN,OAAgG,SAAzFd,KAAK,YAAYf,KAAK,W,uCAAoB,EAAAkB,MAAMa,UAAS,GAAG,SAAM,sBAAE,EAAAC,oBAAA,EAAAA,sBAAA,KAA3E,iBAAiD,EAAAd,MAAMa,gBAGzD,QAAQ,Q,KApDZ,M,gBCpDJ,IACEhB,KAAM,cACNkB,OAAQ,CAACC,GAAA,GAETC,MAAO,CACLC,aAAc,CACZpC,KAAMqC,OACNC,UAAU,IAIdC,OACE,MAAO,CACL7C,WAAW,EACXC,WAAW,EACXC,UAAU,EACVU,SAAS,EACTR,IAAK,KACLoB,MAAO,CAAC,EAEX,EAEDsB,SAAU,CACRC,SACE,MAAO,CACLpB,WAAYqB,KAAKxB,MAAMG,WACvBF,OAAQuB,KAAKxB,MAAMC,QAAQL,OAAS4B,KAAKxB,MAAMC,OAAS,KACxDI,gBAAiBoB,SAAS,EAAID,KAAKxB,MAAMK,iBACzCE,cAAekB,SAAS,EAAID,KAAKxB,MAAMO,eACvCC,OAAQkB,WAAWF,KAAKxB,MAAMQ,QAC9BC,QAASiB,WAAWF,KAAKxB,MAAMS,SAC/BC,QAASgB,WAAWF,KAAKxB,MAAMU,SAC/BC,IAAKe,WAAWF,KAAKxB,MAAMW,KAC3BE,UAAWY,SAAS,EAAID,KAAKxB,MAAMa,WAEtC,GAGHc,QAAS,CACPC,OAAOC,EAAQC,GACb,MAAO,WAAaD,EAAS,IAAMC,EAAS,IACxCC,OAAOC,QAAQR,KAAKD,QAAQU,QAAQC,GAAsB,MAAZA,EAAM,KAAe,GAAKA,EAAM,IAAItC,OAAS,IACtFuC,KAAI,EAAEC,EAAGC,KAAOD,EAAI,IAAMC,IAAGC,KAAK,IAC5C,EAEDC,gBAAgBV,GACVL,KAAKhD,YAGTgD,KAAKhD,WAAY,EACjBgD,KAAK/C,WAAY,EACjB+C,KAAK9C,UAAW,EAChB8C,KAAK5C,IAAM4C,KAAKI,OAAOC,EAAQ,SAAWL,KAAKxB,MAAMwC,eACtD,EAEDzD,gBACOyC,KAAKhD,YAGVgD,KAAKhD,WAAY,EACjBgD,KAAK/C,WAAY,EACjB+C,KAAK5C,IAAM,KACZ,EAED6D,SAASZ,GACHL,KAAK/C,YAGT+C,KAAKhD,WAAY,EACjBgD,KAAK/C,WAAY,EACjB+C,KAAK9C,UAAW,EAChB8C,KAAK5C,IAAM4C,KAAKI,OAAOC,EAAQ,aAAe,OAAS,IAAInC,MAAQC,UACpE,EAED+C,gBACMlB,KAAK/C,YACP+C,KAAK/C,WAAY,EAEpB,EAEDyB,kBAAoB,EACpBI,gBAAkB,EAClBF,gBACE,MAAMuC,EAAYC,GAASA,EAAMC,KAAKC,GAAI,IACpCC,EAAMJ,EAASnB,KAAKD,OAAOf,QACjCgB,KAAKjC,MAAMyD,eAAeC,MAAMC,MAAQL,KAAKM,MAAM3B,KAAKD,OAAOd,QAAUoC,KAAKO,IAAI5B,KAAKD,OAAOpB,WAAW,GAAK0C,KAAKQ,IAAIN,GAAOvB,KAAKD,OAAOpB,WAAW,GAAK0C,KAAKS,IAAIP,KAAS,KAC5KvB,KAAKjC,MAAMyD,eAAeC,MAAMM,OAASV,KAAKM,MAAM3B,KAAKD,OAAOb,QAAUmC,KAAKO,IAAI5B,KAAKD,OAAOpB,WAAW,GAAK0C,KAAKS,IAAIP,GAAOvB,KAAKD,OAAOpB,WAAW,GAAK0C,KAAKQ,IAAIN,KAAS,IAC9K,EAEDnC,eAAiB,EACjBE,qBAAuB,EAEvBxB,aACEkC,KAAKpC,SAAU,CAChB,EAEDoE,kBACEhC,KAAKpC,SAAU,QACToC,KAAKiC,QAAQ,uBACpB,GAGHC,UACE,MAAMC,EAASnC,KAAKoC,MAAMD,OAAQ,UAASnC,KAAKN,iBAAmB,CAAC,EACpEM,KAAKxB,MAAQ,CACXG,WAAYwD,EAAOxD,YAAc,CAAC,IAAK,KACvCF,OAAQ0D,EAAO1D,OACfI,gBAAiBsD,EAAOtD,iBAAmB,EAC3CE,cAAeoD,EAAOpD,eAAiB,EACvCC,OAAQmD,EAAOnD,QAAU,EACzBC,QAASkD,EAAOlD,SAAW,EAC3BC,QAASiD,EAAOjD,SAAW,EAC3BC,IAAKgD,EAAOhD,KAAO,GACnBE,UAAW8C,EAAO9C,WAAa,EAC/B2B,cAAemB,EAAOnB,eAAiB,QAE1C,EAEDqB,UACErC,KAAKjC,MAAMuE,MAAMC,iBAAiB,OAAQvC,KAAKkB,eAC/ClB,KAAKpB,gBACLoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMG,YAAYqB,KAAKpB,eAC9CoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMK,iBAAiBmB,KAAKpB,eACnDoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMO,eAAeiB,KAAKpB,eACjDoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMQ,QAAQgB,KAAKpB,eAC1CoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMS,SAASe,KAAKpB,eAC3CoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMU,SAASc,KAAKpB,cAC5C,GC/HH,MAAM6D,GAAc,GAEpB,U,WFgHA,IACEpE,KAAM,SACNqE,WAAY,CAACC,MAAK,MAClBpD,OAAQ,CAAC,IACTE,MAAO,CACLC,aAAc,CACZpC,KAAMqC,OACNC,UAAU,IAIdE,SAAU,CACRvB,UACE,MAAQ,GAAEqE,OAAOC,SAASC,aAAaF,OAAOC,SAASE,OAAO/C,KAAK5C,KACpE,GAGH+C,QAAS,CACPzC,iBACEsC,KAAKe,gBAAgBf,KAAKN,aAC3B,EAED/B,UACEqC,KAAKiB,SAASjB,KAAKN,aACpB,I,WGtIL,MAAM,IAA2B,QAAgB,GAAQ,CAAC,CAAC,SAASsD,MAEpE,S","sources":["webpack://platypush/./src/components/panels/Camera/Index.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue?be5e","webpack://platypush/./src/components/panels/Camera/Index.vue?8810"],"sourcesContent":["\n\n\n\n\n","\n","import script from \"./Mixin.vue?vue&type=script&lang=js\"\nexport * from \"./Mixin.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=bfa8f2aa\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=bfa8f2aa&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["class","ref","autoplay","preload","streaming","capturing","captured","src","url","alt","type","stopStreaming","disabled","title","startStreaming","capture","audioOn","stopAudio","startAudio","$refs","paramsModal","show","Date","getTime","length","name","value","fullURL","attrs","device","onDeviceChanged","resolution","onSizeChanged","horizontal_flip","onFlipChanged","vertical_flip","rotate","scale_x","scale_y","fps","onFpsChanged","grayscale","onGrayscaleChanged","mixins","Utils","props","cameraPlugin","String","required","data","computed","params","this","parseInt","parseFloat","methods","getUrl","plugin","action","Object","entries","filter","entry","map","k","v","join","_startStreaming","stream_format","_capture","onFrameLoaded","degToRad","deg","Math","PI","rot","frameContainer","style","width","round","abs","cos","sin","height","async","request","created","config","$root","mounted","frame","addEventListener","$watch","__exports__","components","Modal","window","location","protocol","host","render"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/699-legacy.cb1ccfbb.js b/platypush/backend/http/webapp/dist/static/js/699-legacy.e258b653.js similarity index 75% rename from platypush/backend/http/webapp/dist/static/js/699-legacy.cb1ccfbb.js rename to platypush/backend/http/webapp/dist/static/js/699-legacy.e258b653.js index 14c9f346..5544cf15 100644 --- a/platypush/backend/http/webapp/dist/static/js/699-legacy.cb1ccfbb.js +++ b/platypush/backend/http/webapp/dist/static/js/699-legacy.e258b653.js @@ -1,2 +1,2 @@ -"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[699],{699:function(a,e,r){r.r(e),r.d(e,{default:function(){return m}});var n=r(6252);function t(a,e,r,t,u,s){var p=(0,n.up)("Camera");return(0,n.wg)(),(0,n.j4)(p,{"camera-plugin":"gstreamer"})}var u=r(5528),s={name:"CameraGstreamer",components:{Camera:u["default"]}},p=r(3744);const c=(0,p.Z)(s,[["render",t]]);var m=c}}]); -//# sourceMappingURL=699-legacy.cb1ccfbb.js.map \ No newline at end of file +"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[699],{699:function(a,e,r){r.r(e),r.d(e,{default:function(){return m}});var n=r(6252);function t(a,e,r,t,u,s){var p=(0,n.up)("Camera");return(0,n.wg)(),(0,n.j4)(p,{"camera-plugin":"gstreamer"})}var u=r(9021),s={name:"CameraGstreamer",components:{Camera:u["default"]}},p=r(3744);const c=(0,p.Z)(s,[["render",t]]);var m=c}}]); +//# sourceMappingURL=699-legacy.e258b653.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/699-legacy.cb1ccfbb.js.map b/platypush/backend/http/webapp/dist/static/js/699-legacy.e258b653.js.map similarity index 94% rename from platypush/backend/http/webapp/dist/static/js/699-legacy.cb1ccfbb.js.map rename to platypush/backend/http/webapp/dist/static/js/699-legacy.e258b653.js.map index c05c1df3..db85b5c7 100644 --- a/platypush/backend/http/webapp/dist/static/js/699-legacy.cb1ccfbb.js.map +++ b/platypush/backend/http/webapp/dist/static/js/699-legacy.e258b653.js.map @@ -1 +1 @@ -{"version":3,"file":"static/js/699-legacy.cb1ccfbb.js","mappings":"8OACE,QAAoC,GAA5B,gBAAc,a,eAMxB,GACEA,KAAM,kBACNC,WAAY,CAACC,OAAA,e,UCJf,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,KAEpE,O","sources":["webpack://platypush/./src/components/panels/CameraGstreamer/Index.vue","webpack://platypush/./src/components/panels/CameraGstreamer/Index.vue?5a11"],"sourcesContent":["\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=6c669f2b\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["name","components","Camera","__exports__","render"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"static/js/699-legacy.e258b653.js","mappings":"8OACE,QAAoC,GAA5B,gBAAc,a,eAMxB,GACEA,KAAM,kBACNC,WAAY,CAACC,OAAA,e,UCJf,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,KAEpE,O","sources":["webpack://platypush/./src/components/panels/CameraGstreamer/Index.vue","webpack://platypush/./src/components/panels/CameraGstreamer/Index.vue?5a11"],"sourcesContent":["\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=6c669f2b\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["name","components","Camera","__exports__","render"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/699.85a689b1.js b/platypush/backend/http/webapp/dist/static/js/699.85a689b1.js new file mode 100644 index 00000000..8d88c97c --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/699.85a689b1.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[699,5465],{9021:function(a,t,e){e.r(t),e.d(t,{default:function(){return ha}});var s=e(6252),n=e(9963);const i={class:"camera"},r={class:"camera-container"},l={class:"frame-container",ref:"frameContainer"},o={key:0,class:"no-frame"},c=["src"],u={class:"controls"},p={class:"left"},h=["disabled"],d=(0,s._)("i",{class:"fa fa-play"},null,-1),m=[d],g=["disabled"],_=(0,s._)("i",{class:"fa fa-stop"},null,-1),f=[_],y=["disabled"],C=(0,s._)("i",{class:"fas fa-camera"},null,-1),w=[C],v={class:"right"},b=(0,s._)("i",{class:"fas fa-volume-mute"},null,-1),S=[b],k=(0,s._)("i",{class:"fas fa-volume-up"},null,-1),z=[k],x=(0,s._)("i",{class:"fas fa-cog"},null,-1),F=[x],U={class:"audio-container"},$={key:0,autoplay:"",preload:"none",ref:"player"},D=["src"],M=(0,s.Uk)(" Your browser does not support audio elements "),V={key:0,class:"url"},q={class:"row"},P=(0,s._)("span",{class:"name"},"Stream URL",-1),A=["value"],L={class:"params"},O={class:"row"},j=(0,s._)("span",{class:"name"},"Device",-1),G={class:"row"},I=(0,s._)("span",{class:"name"},"Width",-1),R={class:"row"},T=(0,s._)("span",{class:"name"},"Height",-1),Z={class:"row"},W=(0,s._)("span",{class:"name"},"Horizontal Flip",-1),H={class:"row"},Y=(0,s._)("span",{class:"name"},"Vertical Flip",-1),E={class:"row"},X=(0,s._)("span",{class:"name"},"Rotate",-1),B={class:"row"},J=(0,s._)("span",{class:"name"},"Scale-X",-1),K={class:"row"},N=(0,s._)("span",{class:"name"},"Scale-Y",-1),Q={class:"row"},aa=(0,s._)("span",{class:"name"},"Frames per second",-1),ta={class:"row"},ea=(0,s._)("span",{class:"name"},"Grayscale",-1);function sa(a,t,e,d,_,C){const b=(0,s.up)("Slot"),k=(0,s.up)("Modal");return(0,s.wg)(),(0,s.iD)("div",i,[(0,s._)("div",r,[(0,s._)("div",l,[a.streaming||a.capturing||a.captured?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("div",o,"The camera is not active")),(0,s._)("img",{class:"frame",src:a.url,ref:"frame",alt:""},null,8,c)],512),(0,s._)("div",u,[(0,s._)("div",p,[a.streaming?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[1]||(t[1]=(...t)=>a.stopStreaming&&a.stopStreaming(...t)),disabled:a.capturing,title:"Stop video"},f,8,g)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[0]||(t[0]=(...a)=>C.startStreaming&&C.startStreaming(...a)),disabled:a.capturing,title:"Start video"},m,8,h)),a.streaming?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("button",{key:2,type:"button",onClick:t[2]||(t[2]=(...a)=>C.capture&&C.capture(...a)),disabled:a.streaming||a.capturing,title:"Take a picture"},w,8,y))]),(0,s._)("div",v,[a.audioOn?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[4]||(t[4]=(...t)=>a.stopAudio&&a.stopAudio(...t)),title:"Stop audio"},z)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[3]||(t[3]=(...t)=>a.startAudio&&a.startAudio(...t)),title:"Start audio"},S)),(0,s._)("button",{type:"button",onClick:t[5]||(t[5]=t=>a.$refs.paramsModal.show()),title:"Settings"},F)])])]),(0,s._)("div",U,[a.audioOn?((0,s.wg)(),(0,s.iD)("audio",$,[(0,s._)("source",{src:`/sound/stream.aac?t=${(new Date).getTime()}`},null,8,D),M],512)):(0,s.kq)("",!0)]),a.url?.length?((0,s.wg)(),(0,s.iD)("div",V,[(0,s._)("label",q,[P,(0,s._)("input",{name:"url",type:"text",value:C.fullURL,disabled:"disabled"},null,8,A)])])):(0,s.kq)("",!0),(0,s.Wm)(k,{ref:"paramsModal",title:"Camera Parameters"},{default:(0,s.w5)((()=>[(0,s._)("div",L,[(0,s._)("label",O,[j,(0,s.wy)((0,s._)("input",{name:"device",type:"text","onUpdate:modelValue":t[6]||(t[6]=t=>a.attrs.device=t),onChange:t[7]||(t[7]=(...t)=>a.onDeviceChanged&&a.onDeviceChanged(...t))},null,544),[[n.nr,a.attrs.device]])]),(0,s._)("label",G,[I,(0,s.wy)((0,s._)("input",{name:"width",type:"text","onUpdate:modelValue":t[8]||(t[8]=t=>a.attrs.resolution[0]=t),onChange:t[9]||(t[9]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[0]]])]),(0,s._)("label",R,[T,(0,s.wy)((0,s._)("input",{name:"height",type:"text","onUpdate:modelValue":t[10]||(t[10]=t=>a.attrs.resolution[1]=t),onChange:t[11]||(t[11]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[1]]])]),(0,s._)("label",Z,[W,(0,s.wy)((0,s._)("input",{name:"horizontal_flip",type:"checkbox","onUpdate:modelValue":t[12]||(t[12]=t=>a.attrs.horizontal_flip=t),onChange:t[13]||(t[13]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.horizontal_flip]])]),(0,s._)("label",H,[Y,(0,s.wy)((0,s._)("input",{name:"vertical_flip",type:"checkbox","onUpdate:modelValue":t[14]||(t[14]=t=>a.attrs.vertical_flip=t),onChange:t[15]||(t[15]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.vertical_flip]])]),(0,s._)("label",E,[X,(0,s.wy)((0,s._)("input",{name:"rotate",type:"text","onUpdate:modelValue":t[16]||(t[16]=t=>a.attrs.rotate=t),onChange:t[17]||(t[17]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.rotate]])]),(0,s._)("label",B,[J,(0,s.wy)((0,s._)("input",{name:"scale_x",type:"text","onUpdate:modelValue":t[18]||(t[18]=t=>a.attrs.scale_x=t),onChange:t[19]||(t[19]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_x]])]),(0,s._)("label",K,[N,(0,s.wy)((0,s._)("input",{name:"scale_y",type:"text","onUpdate:modelValue":t[20]||(t[20]=t=>a.attrs.scale_y=t),onChange:t[21]||(t[21]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_y]])]),(0,s._)("label",Q,[aa,(0,s.wy)((0,s._)("input",{name:"fps",type:"text","onUpdate:modelValue":t[22]||(t[22]=t=>a.attrs.fps=t),onChange:t[23]||(t[23]=(...t)=>a.onFpsChanged&&a.onFpsChanged(...t))},null,544),[[n.nr,a.attrs.fps]])]),(0,s._)("label",ta,[ea,(0,s.wy)((0,s._)("input",{name:"grayscale",type:"checkbox","onUpdate:modelValue":t[24]||(t[24]=t=>a.attrs.grayscale=t),onChange:t[25]||(t[25]=(...t)=>a.onGrayscaleChanged&&a.onGrayscaleChanged(...t))},null,544),[[n.e8,a.attrs.grayscale]])]),(0,s.Wm)(b)])])),_:1},512)])}var na=e(6813),ia={name:"CameraMixin",mixins:[na.Z],props:{cameraPlugin:{type:String,required:!0}},data(){return{streaming:!1,capturing:!1,captured:!1,audioOn:!1,url:null,attrs:{}}},computed:{params(){return{resolution:this.attrs.resolution,device:this.attrs.device?.length?this.attrs.device:null,horizontal_flip:parseInt(0+this.attrs.horizontal_flip),vertical_flip:parseInt(0+this.attrs.vertical_flip),rotate:parseFloat(this.attrs.rotate),scale_x:parseFloat(this.attrs.scale_x),scale_y:parseFloat(this.attrs.scale_y),fps:parseFloat(this.attrs.fps),grayscale:parseInt(0+this.attrs.grayscale)}}},methods:{getUrl(a,t){return"/camera/"+a+"/"+t+"?"+Object.entries(this.params).filter((a=>null!=a[1]&&(""+a[1]).length>0)).map((([a,t])=>a+"="+t)).join("&")},_startStreaming(a){this.streaming||(this.streaming=!0,this.capturing=!1,this.captured=!1,this.url=this.getUrl(a,"video."+this.attrs.stream_format))},stopStreaming(){this.streaming&&(this.streaming=!1,this.capturing=!1,this.url=null)},_capture(a){this.capturing||(this.streaming=!1,this.capturing=!0,this.captured=!0,this.url=this.getUrl(a,"photo.jpg")+"&t="+(new Date).getTime())},onFrameLoaded(){this.capturing&&(this.capturing=!1)},onDeviceChanged(){},onFlipChanged(){},onSizeChanged(){const a=a=>a*Math.PI/180,t=a(this.params.rotate);this.$refs.frameContainer.style.width=Math.round(this.params.scale_x*Math.abs(this.params.resolution[0]*Math.cos(t)+this.params.resolution[1]*Math.sin(t)))+"px",this.$refs.frameContainer.style.height=Math.round(this.params.scale_y*Math.abs(this.params.resolution[0]*Math.sin(t)+this.params.resolution[1]*Math.cos(t)))+"px"},onFpsChanged(){},onGrayscaleChanged(){},startAudio(){this.audioOn=!0},async stopAudio(){this.audioOn=!1,await this.request("sound.stop_recording")}},created(){const a=this.$root.config[`camera.${this.cameraPlugin}`]||{};this.attrs={resolution:a.resolution||[640,480],device:a.device,horizontal_flip:a.horizontal_flip||0,vertical_flip:a.vertical_flip||0,rotate:a.rotate||0,scale_x:a.scale_x||1,scale_y:a.scale_y||1,fps:a.fps||16,grayscale:a.grayscale||0,stream_format:a.stream_format||"mjpeg"}},mounted(){this.$refs.frame.addEventListener("load",this.onFrameLoaded),this.onSizeChanged(),this.$watch((()=>this.attrs.resolution),this.onSizeChanged),this.$watch((()=>this.attrs.horizontal_flip),this.onSizeChanged),this.$watch((()=>this.attrs.vertical_flip),this.onSizeChanged),this.$watch((()=>this.attrs.rotate),this.onSizeChanged),this.$watch((()=>this.attrs.scale_x),this.onSizeChanged),this.$watch((()=>this.attrs.scale_y),this.onSizeChanged)}};const ra=ia;var la=ra,oa=e(1794),ca={name:"Camera",components:{Modal:oa.Z},mixins:[la],props:{cameraPlugin:{type:String,required:!0}},computed:{fullURL(){return`${window.location.protocol}//${window.location.host}${this.url}`}},methods:{startStreaming(){this._startStreaming(this.cameraPlugin)},capture(){this._capture(this.cameraPlugin)}}},ua=e(3744);const pa=(0,ua.Z)(ca,[["render",sa]]);var ha=pa},699:function(a,t,e){e.r(t),e.d(t,{default:function(){return c}});var s=e(6252);function n(a,t,e,n,i,r){const l=(0,s.up)("Camera");return(0,s.wg)(),(0,s.j4)(l,{"camera-plugin":"gstreamer"})}var i=e(9021),r={name:"CameraGstreamer",components:{Camera:i["default"]}},l=e(3744);const o=(0,l.Z)(r,[["render",n]]);var c=o}}]); +//# sourceMappingURL=699.85a689b1.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/699.85a689b1.js.map b/platypush/backend/http/webapp/dist/static/js/699.85a689b1.js.map new file mode 100644 index 00000000..cc83bca6 --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/699.85a689b1.js.map @@ -0,0 +1 @@ +{"version":3,"file":"static/js/699.85a689b1.js","mappings":"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","sources":["webpack://platypush/./src/components/panels/Camera/Index.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue?be5e","webpack://platypush/./src/components/panels/Camera/Index.vue?8810","webpack://platypush/./src/components/panels/CameraGstreamer/Index.vue","webpack://platypush/./src/components/panels/CameraGstreamer/Index.vue?5a11"],"sourcesContent":["\n\n\n\n\n","\n","import script from \"./Mixin.vue?vue&type=script&lang=js\"\nexport * from \"./Mixin.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=a4970096\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=a4970096&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=6c669f2b\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["class","ref","autoplay","preload","streaming","capturing","captured","src","url","alt","type","stopStreaming","disabled","title","startStreaming","capture","audioOn","stopAudio","startAudio","$refs","paramsModal","show","Date","getTime","length","name","value","fullURL","attrs","device","onDeviceChanged","resolution","onSizeChanged","horizontal_flip","onFlipChanged","vertical_flip","rotate","scale_x","scale_y","fps","onFpsChanged","grayscale","onGrayscaleChanged","mixins","Utils","props","cameraPlugin","String","required","data","computed","params","this","parseInt","parseFloat","methods","getUrl","plugin","action","Object","entries","filter","entry","map","k","v","join","_startStreaming","stream_format","_capture","onFrameLoaded","degToRad","deg","Math","PI","rot","frameContainer","style","width","round","abs","cos","sin","height","async","request","created","config","$root","mounted","frame","addEventListener","$watch","__exports__","components","Modal","window","location","protocol","host","render","Camera"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/699.b7975861.js b/platypush/backend/http/webapp/dist/static/js/699.b7975861.js deleted file mode 100644 index d6b8bf27..00000000 --- a/platypush/backend/http/webapp/dist/static/js/699.b7975861.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[699,5528],{5528:function(a,t,e){e.r(t),e.d(t,{default:function(){return ha}});var s=e(6252),n=e(9963);const i={class:"camera"},r={class:"camera-container"},l={class:"frame-container",ref:"frameContainer"},o={key:0,class:"no-frame"},c=["src"],u={class:"controls"},p={class:"left"},h=["disabled"],d=(0,s._)("i",{class:"fa fa-play"},null,-1),m=[d],g=["disabled"],_=(0,s._)("i",{class:"fa fa-stop"},null,-1),f=[_],y=["disabled"],C=(0,s._)("i",{class:"fas fa-camera"},null,-1),w=[C],v={class:"right"},b=(0,s._)("i",{class:"fas fa-volume-mute"},null,-1),S=[b],k=(0,s._)("i",{class:"fas fa-volume-up"},null,-1),z=[k],x=(0,s._)("i",{class:"fas fa-cog"},null,-1),F=[x],U={class:"audio-container"},$={key:0,autoplay:"",preload:"none",ref:"player"},D=["src"],M=(0,s.Uk)(" Your browser does not support audio elements "),V={key:0,class:"url"},q={class:"row"},P=(0,s._)("span",{class:"name"},"Stream URL",-1),A=["value"],L={class:"params"},O={class:"row"},j=(0,s._)("span",{class:"name"},"Device",-1),G={class:"row"},I=(0,s._)("span",{class:"name"},"Width",-1),R={class:"row"},T=(0,s._)("span",{class:"name"},"Height",-1),Z={class:"row"},W=(0,s._)("span",{class:"name"},"Horizontal Flip",-1),H={class:"row"},Y=(0,s._)("span",{class:"name"},"Vertical Flip",-1),E={class:"row"},X=(0,s._)("span",{class:"name"},"Rotate",-1),B={class:"row"},J=(0,s._)("span",{class:"name"},"Scale-X",-1),K={class:"row"},N=(0,s._)("span",{class:"name"},"Scale-Y",-1),Q={class:"row"},aa=(0,s._)("span",{class:"name"},"Frames per second",-1),ta={class:"row"},ea=(0,s._)("span",{class:"name"},"Grayscale",-1);function sa(a,t,e,d,_,C){const b=(0,s.up)("Slot"),k=(0,s.up)("Modal");return(0,s.wg)(),(0,s.iD)("div",i,[(0,s._)("div",r,[(0,s._)("div",l,[a.streaming||a.capturing||a.captured?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("div",o,"The camera is not active")),(0,s._)("img",{class:"frame",src:a.url,ref:"frame",alt:""},null,8,c)],512),(0,s._)("div",u,[(0,s._)("div",p,[a.streaming?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[1]||(t[1]=(...t)=>a.stopStreaming&&a.stopStreaming(...t)),disabled:a.capturing,title:"Stop video"},f,8,g)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[0]||(t[0]=(...a)=>C.startStreaming&&C.startStreaming(...a)),disabled:a.capturing,title:"Start video"},m,8,h)),a.streaming?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("button",{key:2,type:"button",onClick:t[2]||(t[2]=(...a)=>C.capture&&C.capture(...a)),disabled:a.streaming||a.capturing,title:"Take a picture"},w,8,y))]),(0,s._)("div",v,[a.audioOn?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[4]||(t[4]=(...t)=>a.stopAudio&&a.stopAudio(...t)),title:"Stop audio"},z)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[3]||(t[3]=(...t)=>a.startAudio&&a.startAudio(...t)),title:"Start audio"},S)),(0,s._)("button",{type:"button",onClick:t[5]||(t[5]=t=>a.$refs.paramsModal.show()),title:"Settings"},F)])])]),(0,s._)("div",U,[a.audioOn?((0,s.wg)(),(0,s.iD)("audio",$,[(0,s._)("source",{src:`/sound/stream?t=${(new Date).getTime()}`,type:"audio/x-wav;codec=pcm"},null,8,D),M],512)):(0,s.kq)("",!0)]),a.url?.length?((0,s.wg)(),(0,s.iD)("div",V,[(0,s._)("label",q,[P,(0,s._)("input",{name:"url",type:"text",value:C.fullURL,disabled:"disabled"},null,8,A)])])):(0,s.kq)("",!0),(0,s.Wm)(k,{ref:"paramsModal",title:"Camera Parameters"},{default:(0,s.w5)((()=>[(0,s._)("div",L,[(0,s._)("label",O,[j,(0,s.wy)((0,s._)("input",{name:"device",type:"text","onUpdate:modelValue":t[6]||(t[6]=t=>a.attrs.device=t),onChange:t[7]||(t[7]=(...t)=>a.onDeviceChanged&&a.onDeviceChanged(...t))},null,544),[[n.nr,a.attrs.device]])]),(0,s._)("label",G,[I,(0,s.wy)((0,s._)("input",{name:"width",type:"text","onUpdate:modelValue":t[8]||(t[8]=t=>a.attrs.resolution[0]=t),onChange:t[9]||(t[9]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[0]]])]),(0,s._)("label",R,[T,(0,s.wy)((0,s._)("input",{name:"height",type:"text","onUpdate:modelValue":t[10]||(t[10]=t=>a.attrs.resolution[1]=t),onChange:t[11]||(t[11]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[1]]])]),(0,s._)("label",Z,[W,(0,s.wy)((0,s._)("input",{name:"horizontal_flip",type:"checkbox","onUpdate:modelValue":t[12]||(t[12]=t=>a.attrs.horizontal_flip=t),onChange:t[13]||(t[13]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.horizontal_flip]])]),(0,s._)("label",H,[Y,(0,s.wy)((0,s._)("input",{name:"vertical_flip",type:"checkbox","onUpdate:modelValue":t[14]||(t[14]=t=>a.attrs.vertical_flip=t),onChange:t[15]||(t[15]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.vertical_flip]])]),(0,s._)("label",E,[X,(0,s.wy)((0,s._)("input",{name:"rotate",type:"text","onUpdate:modelValue":t[16]||(t[16]=t=>a.attrs.rotate=t),onChange:t[17]||(t[17]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.rotate]])]),(0,s._)("label",B,[J,(0,s.wy)((0,s._)("input",{name:"scale_x",type:"text","onUpdate:modelValue":t[18]||(t[18]=t=>a.attrs.scale_x=t),onChange:t[19]||(t[19]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_x]])]),(0,s._)("label",K,[N,(0,s.wy)((0,s._)("input",{name:"scale_y",type:"text","onUpdate:modelValue":t[20]||(t[20]=t=>a.attrs.scale_y=t),onChange:t[21]||(t[21]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_y]])]),(0,s._)("label",Q,[aa,(0,s.wy)((0,s._)("input",{name:"fps",type:"text","onUpdate:modelValue":t[22]||(t[22]=t=>a.attrs.fps=t),onChange:t[23]||(t[23]=(...t)=>a.onFpsChanged&&a.onFpsChanged(...t))},null,544),[[n.nr,a.attrs.fps]])]),(0,s._)("label",ta,[ea,(0,s.wy)((0,s._)("input",{name:"grayscale",type:"checkbox","onUpdate:modelValue":t[24]||(t[24]=t=>a.attrs.grayscale=t),onChange:t[25]||(t[25]=(...t)=>a.onGrayscaleChanged&&a.onGrayscaleChanged(...t))},null,544),[[n.e8,a.attrs.grayscale]])]),(0,s.Wm)(b)])])),_:1},512)])}var na=e(6813),ia={name:"CameraMixin",mixins:[na.Z],props:{cameraPlugin:{type:String,required:!0}},data(){return{streaming:!1,capturing:!1,captured:!1,audioOn:!1,url:null,attrs:{}}},computed:{params(){return{resolution:this.attrs.resolution,device:this.attrs.device?.length?this.attrs.device:null,horizontal_flip:parseInt(0+this.attrs.horizontal_flip),vertical_flip:parseInt(0+this.attrs.vertical_flip),rotate:parseFloat(this.attrs.rotate),scale_x:parseFloat(this.attrs.scale_x),scale_y:parseFloat(this.attrs.scale_y),fps:parseFloat(this.attrs.fps),grayscale:parseInt(0+this.attrs.grayscale)}}},methods:{getUrl(a,t){return"/camera/"+a+"/"+t+"?"+Object.entries(this.params).filter((a=>null!=a[1]&&(""+a[1]).length>0)).map((([a,t])=>a+"="+t)).join("&")},_startStreaming(a){this.streaming||(this.streaming=!0,this.capturing=!1,this.captured=!1,this.url=this.getUrl(a,"video."+this.attrs.stream_format))},stopStreaming(){this.streaming&&(this.streaming=!1,this.capturing=!1,this.url=null)},_capture(a){this.capturing||(this.streaming=!1,this.capturing=!0,this.captured=!0,this.url=this.getUrl(a,"photo.jpg")+"&t="+(new Date).getTime())},onFrameLoaded(){this.capturing&&(this.capturing=!1)},onDeviceChanged(){},onFlipChanged(){},onSizeChanged(){const a=a=>a*Math.PI/180,t=a(this.params.rotate);this.$refs.frameContainer.style.width=Math.round(this.params.scale_x*Math.abs(this.params.resolution[0]*Math.cos(t)+this.params.resolution[1]*Math.sin(t)))+"px",this.$refs.frameContainer.style.height=Math.round(this.params.scale_y*Math.abs(this.params.resolution[0]*Math.sin(t)+this.params.resolution[1]*Math.cos(t)))+"px"},onFpsChanged(){},onGrayscaleChanged(){},startAudio(){this.audioOn=!0},async stopAudio(){this.audioOn=!1,await this.request("sound.stop_recording")}},created(){const a=this.$root.config[`camera.${this.cameraPlugin}`]||{};this.attrs={resolution:a.resolution||[640,480],device:a.device,horizontal_flip:a.horizontal_flip||0,vertical_flip:a.vertical_flip||0,rotate:a.rotate||0,scale_x:a.scale_x||1,scale_y:a.scale_y||1,fps:a.fps||16,grayscale:a.grayscale||0,stream_format:a.stream_format||"mjpeg"}},mounted(){this.$refs.frame.addEventListener("load",this.onFrameLoaded),this.onSizeChanged(),this.$watch((()=>this.attrs.resolution),this.onSizeChanged),this.$watch((()=>this.attrs.horizontal_flip),this.onSizeChanged),this.$watch((()=>this.attrs.vertical_flip),this.onSizeChanged),this.$watch((()=>this.attrs.rotate),this.onSizeChanged),this.$watch((()=>this.attrs.scale_x),this.onSizeChanged),this.$watch((()=>this.attrs.scale_y),this.onSizeChanged)}};const ra=ia;var la=ra,oa=e(1794),ca={name:"Camera",components:{Modal:oa.Z},mixins:[la],props:{cameraPlugin:{type:String,required:!0}},computed:{fullURL(){return`${window.location.protocol}//${window.location.host}${this.url}`}},methods:{startStreaming(){this._startStreaming(this.cameraPlugin)},capture(){this._capture(this.cameraPlugin)}}},ua=e(3744);const pa=(0,ua.Z)(ca,[["render",sa]]);var ha=pa},699:function(a,t,e){e.r(t),e.d(t,{default:function(){return c}});var s=e(6252);function n(a,t,e,n,i,r){const l=(0,s.up)("Camera");return(0,s.wg)(),(0,s.j4)(l,{"camera-plugin":"gstreamer"})}var i=e(5528),r={name:"CameraGstreamer",components:{Camera:i["default"]}},l=e(3744);const o=(0,l.Z)(r,[["render",n]]);var c=o}}]); -//# sourceMappingURL=699.b7975861.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/699.b7975861.js.map b/platypush/backend/http/webapp/dist/static/js/699.b7975861.js.map deleted file mode 100644 index f49929e8..00000000 --- a/platypush/backend/http/webapp/dist/static/js/699.b7975861.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/699.b7975861.js","mappings":"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","sources":["webpack://platypush/./src/components/panels/Camera/Index.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue?be5e","webpack://platypush/./src/components/panels/Camera/Index.vue?8810","webpack://platypush/./src/components/panels/CameraGstreamer/Index.vue","webpack://platypush/./src/components/panels/CameraGstreamer/Index.vue?5a11"],"sourcesContent":["\n\n\n\n\n","\n","import script from \"./Mixin.vue?vue&type=script&lang=js\"\nexport * from \"./Mixin.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=bfa8f2aa\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=bfa8f2aa&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=6c669f2b\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["class","ref","autoplay","preload","streaming","capturing","captured","src","url","alt","type","stopStreaming","disabled","title","startStreaming","capture","audioOn","stopAudio","startAudio","$refs","paramsModal","show","Date","getTime","length","name","value","fullURL","attrs","device","onDeviceChanged","resolution","onSizeChanged","horizontal_flip","onFlipChanged","vertical_flip","rotate","scale_x","scale_y","fps","onFpsChanged","grayscale","onGrayscaleChanged","mixins","Utils","props","cameraPlugin","String","required","data","computed","params","this","parseInt","parseFloat","methods","getUrl","plugin","action","Object","entries","filter","entry","map","k","v","join","_startStreaming","stream_format","_capture","onFrameLoaded","degToRad","deg","Math","PI","rot","frameContainer","style","width","round","abs","cos","sin","height","async","request","created","config","$root","mounted","frame","addEventListener","$watch","__exports__","components","Modal","window","location","protocol","host","render","Camera"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/8184-legacy.702db0b7.js b/platypush/backend/http/webapp/dist/static/js/8184-legacy.73f24c6e.js similarity index 74% rename from platypush/backend/http/webapp/dist/static/js/8184-legacy.702db0b7.js rename to platypush/backend/http/webapp/dist/static/js/8184-legacy.73f24c6e.js index 36409b67..1fd63bdf 100644 --- a/platypush/backend/http/webapp/dist/static/js/8184-legacy.702db0b7.js +++ b/platypush/backend/http/webapp/dist/static/js/8184-legacy.73f24c6e.js @@ -1,2 +1,2 @@ -"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[8184],{8184:function(a,e,n){n.r(e),n.d(e,{default:function(){return f}});var r=n(6252);function u(a,e,n,u,t,c){var p=(0,r.up)("Camera");return(0,r.wg)(),(0,r.j4)(p,{"camera-plugin":"cv"})}var t=n(5528),c={name:"CameraCv",components:{Camera:t["default"]}},p=n(3744);const s=(0,p.Z)(c,[["render",u]]);var f=s}}]); -//# sourceMappingURL=8184-legacy.702db0b7.js.map \ No newline at end of file +"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[8184],{8184:function(a,e,n){n.r(e),n.d(e,{default:function(){return f}});var r=n(6252);function u(a,e,n,u,t,c){var p=(0,r.up)("Camera");return(0,r.wg)(),(0,r.j4)(p,{"camera-plugin":"cv"})}var t=n(9021),c={name:"CameraCv",components:{Camera:t["default"]}},p=n(3744);const s=(0,p.Z)(c,[["render",u]]);var f=s}}]); +//# sourceMappingURL=8184-legacy.73f24c6e.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/8184-legacy.702db0b7.js.map b/platypush/backend/http/webapp/dist/static/js/8184-legacy.73f24c6e.js.map similarity index 94% rename from platypush/backend/http/webapp/dist/static/js/8184-legacy.702db0b7.js.map rename to platypush/backend/http/webapp/dist/static/js/8184-legacy.73f24c6e.js.map index 505b3ea1..b0c4770e 100644 --- a/platypush/backend/http/webapp/dist/static/js/8184-legacy.702db0b7.js.map +++ b/platypush/backend/http/webapp/dist/static/js/8184-legacy.73f24c6e.js.map @@ -1 +1 @@ -{"version":3,"file":"static/js/8184-legacy.702db0b7.js","mappings":"gPACE,QAA6B,GAArB,gBAAc,M,eAMxB,GACEA,KAAM,WACNC,WAAY,CAACC,OAAA,e,UCJf,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,KAEpE,O","sources":["webpack://platypush/./src/components/panels/CameraCv/Index.vue","webpack://platypush/./src/components/panels/CameraCv/Index.vue?6f97"],"sourcesContent":["\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=351194be\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["name","components","Camera","__exports__","render"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"static/js/8184-legacy.73f24c6e.js","mappings":"gPACE,QAA6B,GAArB,gBAAc,M,eAMxB,GACEA,KAAM,WACNC,WAAY,CAACC,OAAA,e,UCJf,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,KAEpE,O","sources":["webpack://platypush/./src/components/panels/CameraCv/Index.vue","webpack://platypush/./src/components/panels/CameraCv/Index.vue?6f97"],"sourcesContent":["\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=351194be\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["name","components","Camera","__exports__","render"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/8184.3768abaf.js b/platypush/backend/http/webapp/dist/static/js/8184.3768abaf.js new file mode 100644 index 00000000..4d6d8f15 --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/8184.3768abaf.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[8184,5465],{9021:function(a,t,e){e.r(t),e.d(t,{default:function(){return ha}});var s=e(6252),n=e(9963);const i={class:"camera"},r={class:"camera-container"},l={class:"frame-container",ref:"frameContainer"},o={key:0,class:"no-frame"},c=["src"],u={class:"controls"},p={class:"left"},h=["disabled"],d=(0,s._)("i",{class:"fa fa-play"},null,-1),m=[d],g=["disabled"],_=(0,s._)("i",{class:"fa fa-stop"},null,-1),f=[_],y=["disabled"],C=(0,s._)("i",{class:"fas fa-camera"},null,-1),w=[C],v={class:"right"},b=(0,s._)("i",{class:"fas fa-volume-mute"},null,-1),S=[b],k=(0,s._)("i",{class:"fas fa-volume-up"},null,-1),z=[k],x=(0,s._)("i",{class:"fas fa-cog"},null,-1),F=[x],U={class:"audio-container"},$={key:0,autoplay:"",preload:"none",ref:"player"},D=["src"],M=(0,s.Uk)(" Your browser does not support audio elements "),V={key:0,class:"url"},q={class:"row"},P=(0,s._)("span",{class:"name"},"Stream URL",-1),A=["value"],L={class:"params"},O={class:"row"},j=(0,s._)("span",{class:"name"},"Device",-1),G={class:"row"},I=(0,s._)("span",{class:"name"},"Width",-1),R={class:"row"},T=(0,s._)("span",{class:"name"},"Height",-1),Z={class:"row"},W=(0,s._)("span",{class:"name"},"Horizontal Flip",-1),H={class:"row"},Y=(0,s._)("span",{class:"name"},"Vertical Flip",-1),E={class:"row"},X=(0,s._)("span",{class:"name"},"Rotate",-1),B={class:"row"},J=(0,s._)("span",{class:"name"},"Scale-X",-1),K={class:"row"},N=(0,s._)("span",{class:"name"},"Scale-Y",-1),Q={class:"row"},aa=(0,s._)("span",{class:"name"},"Frames per second",-1),ta={class:"row"},ea=(0,s._)("span",{class:"name"},"Grayscale",-1);function sa(a,t,e,d,_,C){const b=(0,s.up)("Slot"),k=(0,s.up)("Modal");return(0,s.wg)(),(0,s.iD)("div",i,[(0,s._)("div",r,[(0,s._)("div",l,[a.streaming||a.capturing||a.captured?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("div",o,"The camera is not active")),(0,s._)("img",{class:"frame",src:a.url,ref:"frame",alt:""},null,8,c)],512),(0,s._)("div",u,[(0,s._)("div",p,[a.streaming?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[1]||(t[1]=(...t)=>a.stopStreaming&&a.stopStreaming(...t)),disabled:a.capturing,title:"Stop video"},f,8,g)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[0]||(t[0]=(...a)=>C.startStreaming&&C.startStreaming(...a)),disabled:a.capturing,title:"Start video"},m,8,h)),a.streaming?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("button",{key:2,type:"button",onClick:t[2]||(t[2]=(...a)=>C.capture&&C.capture(...a)),disabled:a.streaming||a.capturing,title:"Take a picture"},w,8,y))]),(0,s._)("div",v,[a.audioOn?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[4]||(t[4]=(...t)=>a.stopAudio&&a.stopAudio(...t)),title:"Stop audio"},z)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[3]||(t[3]=(...t)=>a.startAudio&&a.startAudio(...t)),title:"Start audio"},S)),(0,s._)("button",{type:"button",onClick:t[5]||(t[5]=t=>a.$refs.paramsModal.show()),title:"Settings"},F)])])]),(0,s._)("div",U,[a.audioOn?((0,s.wg)(),(0,s.iD)("audio",$,[(0,s._)("source",{src:`/sound/stream.aac?t=${(new Date).getTime()}`},null,8,D),M],512)):(0,s.kq)("",!0)]),a.url?.length?((0,s.wg)(),(0,s.iD)("div",V,[(0,s._)("label",q,[P,(0,s._)("input",{name:"url",type:"text",value:C.fullURL,disabled:"disabled"},null,8,A)])])):(0,s.kq)("",!0),(0,s.Wm)(k,{ref:"paramsModal",title:"Camera Parameters"},{default:(0,s.w5)((()=>[(0,s._)("div",L,[(0,s._)("label",O,[j,(0,s.wy)((0,s._)("input",{name:"device",type:"text","onUpdate:modelValue":t[6]||(t[6]=t=>a.attrs.device=t),onChange:t[7]||(t[7]=(...t)=>a.onDeviceChanged&&a.onDeviceChanged(...t))},null,544),[[n.nr,a.attrs.device]])]),(0,s._)("label",G,[I,(0,s.wy)((0,s._)("input",{name:"width",type:"text","onUpdate:modelValue":t[8]||(t[8]=t=>a.attrs.resolution[0]=t),onChange:t[9]||(t[9]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[0]]])]),(0,s._)("label",R,[T,(0,s.wy)((0,s._)("input",{name:"height",type:"text","onUpdate:modelValue":t[10]||(t[10]=t=>a.attrs.resolution[1]=t),onChange:t[11]||(t[11]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[1]]])]),(0,s._)("label",Z,[W,(0,s.wy)((0,s._)("input",{name:"horizontal_flip",type:"checkbox","onUpdate:modelValue":t[12]||(t[12]=t=>a.attrs.horizontal_flip=t),onChange:t[13]||(t[13]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.horizontal_flip]])]),(0,s._)("label",H,[Y,(0,s.wy)((0,s._)("input",{name:"vertical_flip",type:"checkbox","onUpdate:modelValue":t[14]||(t[14]=t=>a.attrs.vertical_flip=t),onChange:t[15]||(t[15]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.vertical_flip]])]),(0,s._)("label",E,[X,(0,s.wy)((0,s._)("input",{name:"rotate",type:"text","onUpdate:modelValue":t[16]||(t[16]=t=>a.attrs.rotate=t),onChange:t[17]||(t[17]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.rotate]])]),(0,s._)("label",B,[J,(0,s.wy)((0,s._)("input",{name:"scale_x",type:"text","onUpdate:modelValue":t[18]||(t[18]=t=>a.attrs.scale_x=t),onChange:t[19]||(t[19]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_x]])]),(0,s._)("label",K,[N,(0,s.wy)((0,s._)("input",{name:"scale_y",type:"text","onUpdate:modelValue":t[20]||(t[20]=t=>a.attrs.scale_y=t),onChange:t[21]||(t[21]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_y]])]),(0,s._)("label",Q,[aa,(0,s.wy)((0,s._)("input",{name:"fps",type:"text","onUpdate:modelValue":t[22]||(t[22]=t=>a.attrs.fps=t),onChange:t[23]||(t[23]=(...t)=>a.onFpsChanged&&a.onFpsChanged(...t))},null,544),[[n.nr,a.attrs.fps]])]),(0,s._)("label",ta,[ea,(0,s.wy)((0,s._)("input",{name:"grayscale",type:"checkbox","onUpdate:modelValue":t[24]||(t[24]=t=>a.attrs.grayscale=t),onChange:t[25]||(t[25]=(...t)=>a.onGrayscaleChanged&&a.onGrayscaleChanged(...t))},null,544),[[n.e8,a.attrs.grayscale]])]),(0,s.Wm)(b)])])),_:1},512)])}var na=e(6813),ia={name:"CameraMixin",mixins:[na.Z],props:{cameraPlugin:{type:String,required:!0}},data(){return{streaming:!1,capturing:!1,captured:!1,audioOn:!1,url:null,attrs:{}}},computed:{params(){return{resolution:this.attrs.resolution,device:this.attrs.device?.length?this.attrs.device:null,horizontal_flip:parseInt(0+this.attrs.horizontal_flip),vertical_flip:parseInt(0+this.attrs.vertical_flip),rotate:parseFloat(this.attrs.rotate),scale_x:parseFloat(this.attrs.scale_x),scale_y:parseFloat(this.attrs.scale_y),fps:parseFloat(this.attrs.fps),grayscale:parseInt(0+this.attrs.grayscale)}}},methods:{getUrl(a,t){return"/camera/"+a+"/"+t+"?"+Object.entries(this.params).filter((a=>null!=a[1]&&(""+a[1]).length>0)).map((([a,t])=>a+"="+t)).join("&")},_startStreaming(a){this.streaming||(this.streaming=!0,this.capturing=!1,this.captured=!1,this.url=this.getUrl(a,"video."+this.attrs.stream_format))},stopStreaming(){this.streaming&&(this.streaming=!1,this.capturing=!1,this.url=null)},_capture(a){this.capturing||(this.streaming=!1,this.capturing=!0,this.captured=!0,this.url=this.getUrl(a,"photo.jpg")+"&t="+(new Date).getTime())},onFrameLoaded(){this.capturing&&(this.capturing=!1)},onDeviceChanged(){},onFlipChanged(){},onSizeChanged(){const a=a=>a*Math.PI/180,t=a(this.params.rotate);this.$refs.frameContainer.style.width=Math.round(this.params.scale_x*Math.abs(this.params.resolution[0]*Math.cos(t)+this.params.resolution[1]*Math.sin(t)))+"px",this.$refs.frameContainer.style.height=Math.round(this.params.scale_y*Math.abs(this.params.resolution[0]*Math.sin(t)+this.params.resolution[1]*Math.cos(t)))+"px"},onFpsChanged(){},onGrayscaleChanged(){},startAudio(){this.audioOn=!0},async stopAudio(){this.audioOn=!1,await this.request("sound.stop_recording")}},created(){const a=this.$root.config[`camera.${this.cameraPlugin}`]||{};this.attrs={resolution:a.resolution||[640,480],device:a.device,horizontal_flip:a.horizontal_flip||0,vertical_flip:a.vertical_flip||0,rotate:a.rotate||0,scale_x:a.scale_x||1,scale_y:a.scale_y||1,fps:a.fps||16,grayscale:a.grayscale||0,stream_format:a.stream_format||"mjpeg"}},mounted(){this.$refs.frame.addEventListener("load",this.onFrameLoaded),this.onSizeChanged(),this.$watch((()=>this.attrs.resolution),this.onSizeChanged),this.$watch((()=>this.attrs.horizontal_flip),this.onSizeChanged),this.$watch((()=>this.attrs.vertical_flip),this.onSizeChanged),this.$watch((()=>this.attrs.rotate),this.onSizeChanged),this.$watch((()=>this.attrs.scale_x),this.onSizeChanged),this.$watch((()=>this.attrs.scale_y),this.onSizeChanged)}};const ra=ia;var la=ra,oa=e(1794),ca={name:"Camera",components:{Modal:oa.Z},mixins:[la],props:{cameraPlugin:{type:String,required:!0}},computed:{fullURL(){return`${window.location.protocol}//${window.location.host}${this.url}`}},methods:{startStreaming(){this._startStreaming(this.cameraPlugin)},capture(){this._capture(this.cameraPlugin)}}},ua=e(3744);const pa=(0,ua.Z)(ca,[["render",sa]]);var ha=pa},8184:function(a,t,e){e.r(t),e.d(t,{default:function(){return c}});var s=e(6252);function n(a,t,e,n,i,r){const l=(0,s.up)("Camera");return(0,s.wg)(),(0,s.j4)(l,{"camera-plugin":"cv"})}var i=e(9021),r={name:"CameraCv",components:{Camera:i["default"]}},l=e(3744);const o=(0,l.Z)(r,[["render",n]]);var c=o}}]); +//# sourceMappingURL=8184.3768abaf.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/8184.3768abaf.js.map b/platypush/backend/http/webapp/dist/static/js/8184.3768abaf.js.map new file mode 100644 index 00000000..fd7a45a3 --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/8184.3768abaf.js.map @@ -0,0 +1 @@ +{"version":3,"file":"static/js/8184.3768abaf.js","mappings":"sMACOA,MAAM,U,GACJA,MAAM,oB,GACJA,MAAM,kBAAkBC,IAAI,kB,SAC1BD,MAAM,Y,aAIRA,MAAM,Y,GACJA,MAAM,Q,kBAEP,OAAwB,KAArBA,MAAM,cAAY,S,GAArB,G,kBAIA,OAAwB,KAArBA,MAAM,cAAY,S,GAArB,G,kBAKA,OAA2B,KAAxBA,MAAM,iBAAe,S,GAAxB,G,GAICA,MAAM,S,GAEP,OAAgC,KAA7BA,MAAM,sBAAoB,S,GAA7B,G,GAIA,OAA8B,KAA3BA,MAAM,oBAAkB,S,GAA3B,G,GAIA,OAAwB,KAArBA,MAAM,cAAY,S,GAArB,G,GAMHA,MAAM,mB,SACFE,SAAA,GAASC,QAAQ,OAAOF,IAAI,U,qBAC8B,kD,SAK9DD,MAAM,O,GACFA,MAAM,O,GACX,OAAoC,QAA9BA,MAAM,QAAO,cAAU,G,eAM1BA,MAAM,U,GACFA,MAAM,O,GACX,OAAgC,QAA1BA,MAAM,QAAO,UAAM,G,GAIpBA,MAAM,O,GACX,OAA+B,QAAzBA,MAAM,QAAO,SAAK,G,GAInBA,MAAM,O,GACX,OAAgC,QAA1BA,MAAM,QAAO,UAAM,G,GAIpBA,MAAM,O,GACX,OAAyC,QAAnCA,MAAM,QAAO,mBAAe,G,GAI7BA,MAAM,O,GACX,OAAuC,QAAjCA,MAAM,QAAO,iBAAa,G,GAI3BA,MAAM,O,GACX,OAAgC,QAA1BA,MAAM,QAAO,UAAM,G,GAIpBA,MAAM,O,GACX,OAAiC,QAA3BA,MAAM,QAAO,WAAO,G,GAIrBA,MAAM,O,GACX,OAAiC,QAA3BA,MAAM,QAAO,WAAO,G,GAIrBA,MAAM,O,IACX,OAA2C,QAArCA,MAAM,QAAO,qBAAiB,G,IAI/BA,MAAM,O,IACX,OAAmC,QAA7BA,MAAM,QAAO,aAAS,G,wFArGpC,QA4GM,MA5GN,EA4GM,EA3GJ,OAoCM,MApCN,EAoCM,EAnCJ,OAGM,MAHN,EAGM,CAFyB,EAAAI,WAAc,EAAAC,WAAc,EAAAC,UAAzD,iBAAyD,WAAzD,QAAiG,MAAjG,EAAmE,8BACnE,OAAiD,OAA5CN,MAAM,QAASO,IAAK,EAAAC,IAAKP,IAAI,QAAQQ,IAAI,IAA9C,WAFF,MAKA,OA6BM,MA7BN,EA6BM,EA5BJ,OAaM,MAbN,EAaM,CAZ2F,EAAAL,YAA/F,WAIA,QAES,U,MAFDM,KAAK,SAAU,QAAK,oBAAE,EAAAC,eAAA,EAAAA,iBAAA,IAAgBC,SAAU,EAAAP,UAAWQ,MAAM,cAAzE,UAJ+F,WAA/F,QAES,U,MAFDH,KAAK,SAAU,QAAK,oBAAE,EAAAI,gBAAA,EAAAA,kBAAA,IAAiBF,SAAU,EAAAP,UAAWQ,MAAM,eAA1E,QAQiF,EAAAT,WAAjF,iBAAiF,WAAjF,QAGS,U,MAHDM,KAAK,SAAU,QAAK,oBAAE,EAAAK,SAAA,EAAAA,WAAA,IAAUH,SAAU,EAAAR,WAAa,EAAAC,UACvDQ,MAAM,kBADd,WAMF,OAYM,MAZN,EAYM,CAXiE,EAAAG,UAArE,WAIA,QAES,U,MAFDN,KAAK,SAAU,QAAK,oBAAE,EAAAO,WAAA,EAAAA,aAAA,IAAWJ,MAAM,cAA/C,MAJqE,WAArE,QAES,U,MAFDH,KAAK,SAAU,QAAK,oBAAE,EAAAQ,YAAA,EAAAA,cAAA,IAAYL,MAAM,eAAhD,KAQA,OAES,UAFDH,KAAK,SAAU,QAAK,eAAE,EAAAS,MAAMC,YAAYC,QAAQR,MAAM,YAA9D,UAON,OAKM,MALN,EAKM,CAJ8C,EAAAG,UAAA,WAAlD,QAGQ,QAHR,EAGQ,EAFN,OAA+D,UAAtDT,IAAG,4BAA8Be,MAAQC,aAAlD,UAEM,GAHR,wBAMqB,EAAAf,KAAKgB,SAAA,WAA5B,QAKM,MALN,EAKM,EAJJ,OAGQ,QAHR,EAGQ,CAFN,GACA,OAAoE,SAA7DC,KAAK,MAAMf,KAAK,OAAQgB,MAAO,EAAAC,QAASf,SAAS,YAAxD,gBAHJ,gBAOA,QAsDQ,GAtDDX,IAAI,cAAcY,MAAM,qBAA/B,C,kBACE,IAoDM,EApDN,OAoDM,MApDN,EAoDM,EAnDJ,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAmF,SAA5EY,KAAK,SAASf,KAAK,O,qCAAgB,EAAAkB,MAAMC,OAAM,GAAG,SAAM,oBAAE,EAAAC,iBAAA,EAAAA,mBAAA,KAAjE,iBAA0C,EAAAF,MAAMC,aAGlD,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAuF,SAAhFJ,KAAK,QAAQf,KAAK,O,qCAAgB,EAAAkB,MAAMG,WAAU,MAAM,SAAM,oBAAE,EAAAC,eAAA,EAAAA,iBAAA,KAAvE,iBAAyC,EAAAJ,MAAMG,WAAU,SAG3D,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAwF,SAAjFN,KAAK,SAASf,KAAK,O,uCAAgB,EAAAkB,MAAMG,WAAU,MAAM,SAAM,sBAAE,EAAAC,eAAA,EAAAA,iBAAA,KAAxE,iBAA0C,EAAAJ,MAAMG,WAAU,SAG5D,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAuG,SAAhGN,KAAK,kBAAkBf,KAAK,W,uCAAoB,EAAAkB,MAAMK,gBAAe,GAAG,SAAM,sBAAE,EAAAC,eAAA,EAAAA,iBAAA,KAAvF,iBAAuD,EAAAN,MAAMK,sBAG/D,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAmG,SAA5FR,KAAK,gBAAgBf,KAAK,W,uCAAoB,EAAAkB,MAAMO,cAAa,GAAG,SAAM,sBAAE,EAAAD,eAAA,EAAAA,iBAAA,KAAnF,iBAAqD,EAAAN,MAAMO,oBAG7D,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAiF,SAA1EV,KAAK,SAASf,KAAK,O,uCAAgB,EAAAkB,MAAMQ,OAAM,GAAG,SAAM,sBAAE,EAAAJ,eAAA,EAAAA,iBAAA,KAAjE,iBAA0C,EAAAJ,MAAMQ,aAGlD,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAmF,SAA5EX,KAAK,UAAUf,KAAK,O,uCAAgB,EAAAkB,MAAMS,QAAO,GAAG,SAAM,sBAAE,EAAAL,eAAA,EAAAA,iBAAA,KAAnE,iBAA2C,EAAAJ,MAAMS,cAGnD,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAmF,SAA5EZ,KAAK,UAAUf,KAAK,O,uCAAgB,EAAAkB,MAAMU,QAAO,GAAG,SAAM,sBAAE,EAAAN,eAAA,EAAAA,iBAAA,KAAnE,iBAA2C,EAAAJ,MAAMU,cAGnD,OAGQ,QAHR,EAGQ,CAFN,IAEM,SADN,OAA0E,SAAnEb,KAAK,MAAMf,KAAK,O,uCAAgB,EAAAkB,MAAMW,IAAG,GAAG,SAAM,sBAAE,EAAAC,cAAA,EAAAA,gBAAA,KAA3D,iBAAuC,EAAAZ,MAAMW,UAG/C,OAGQ,QAHR,GAGQ,CAFN,IAEM,SADN,OAAgG,SAAzFd,KAAK,YAAYf,KAAK,W,uCAAoB,EAAAkB,MAAMa,UAAS,GAAG,SAAM,sBAAE,EAAAC,oBAAA,EAAAA,sBAAA,KAA3E,iBAAiD,EAAAd,MAAMa,gBAGzD,QAAQ,Q,KApDZ,M,gBCnDJ,IACEhB,KAAM,cACNkB,OAAQ,CAACC,GAAA,GAETC,MAAO,CACLC,aAAc,CACZpC,KAAMqC,OACNC,UAAU,IAIdC,OACE,MAAO,CACL7C,WAAW,EACXC,WAAW,EACXC,UAAU,EACVU,SAAS,EACTR,IAAK,KACLoB,MAAO,CAAC,EAEX,EAEDsB,SAAU,CACRC,SACE,MAAO,CACLpB,WAAYqB,KAAKxB,MAAMG,WACvBF,OAAQuB,KAAKxB,MAAMC,QAAQL,OAAS4B,KAAKxB,MAAMC,OAAS,KACxDI,gBAAiBoB,SAAS,EAAID,KAAKxB,MAAMK,iBACzCE,cAAekB,SAAS,EAAID,KAAKxB,MAAMO,eACvCC,OAAQkB,WAAWF,KAAKxB,MAAMQ,QAC9BC,QAASiB,WAAWF,KAAKxB,MAAMS,SAC/BC,QAASgB,WAAWF,KAAKxB,MAAMU,SAC/BC,IAAKe,WAAWF,KAAKxB,MAAMW,KAC3BE,UAAWY,SAAS,EAAID,KAAKxB,MAAMa,WAEtC,GAGHc,QAAS,CACPC,OAAOC,EAAQC,GACb,MAAO,WAAaD,EAAS,IAAMC,EAAS,IACxCC,OAAOC,QAAQR,KAAKD,QAAQU,QAAQC,GAAsB,MAAZA,EAAM,KAAe,GAAKA,EAAM,IAAItC,OAAS,IACtFuC,KAAI,EAAEC,EAAGC,KAAOD,EAAI,IAAMC,IAAGC,KAAK,IAC5C,EAEDC,gBAAgBV,GACVL,KAAKhD,YAGTgD,KAAKhD,WAAY,EACjBgD,KAAK/C,WAAY,EACjB+C,KAAK9C,UAAW,EAChB8C,KAAK5C,IAAM4C,KAAKI,OAAOC,EAAQ,SAAWL,KAAKxB,MAAMwC,eACtD,EAEDzD,gBACOyC,KAAKhD,YAGVgD,KAAKhD,WAAY,EACjBgD,KAAK/C,WAAY,EACjB+C,KAAK5C,IAAM,KACZ,EAED6D,SAASZ,GACHL,KAAK/C,YAGT+C,KAAKhD,WAAY,EACjBgD,KAAK/C,WAAY,EACjB+C,KAAK9C,UAAW,EAChB8C,KAAK5C,IAAM4C,KAAKI,OAAOC,EAAQ,aAAe,OAAS,IAAInC,MAAQC,UACpE,EAED+C,gBACMlB,KAAK/C,YACP+C,KAAK/C,WAAY,EAEpB,EAEDyB,kBAAoB,EACpBI,gBAAkB,EAClBF,gBACE,MAAMuC,EAAYC,GAASA,EAAMC,KAAKC,GAAI,IACpCC,EAAMJ,EAASnB,KAAKD,OAAOf,QACjCgB,KAAKjC,MAAMyD,eAAeC,MAAMC,MAAQL,KAAKM,MAAM3B,KAAKD,OAAOd,QAAUoC,KAAKO,IAAI5B,KAAKD,OAAOpB,WAAW,GAAK0C,KAAKQ,IAAIN,GAAOvB,KAAKD,OAAOpB,WAAW,GAAK0C,KAAKS,IAAIP,KAAS,KAC5KvB,KAAKjC,MAAMyD,eAAeC,MAAMM,OAASV,KAAKM,MAAM3B,KAAKD,OAAOb,QAAUmC,KAAKO,IAAI5B,KAAKD,OAAOpB,WAAW,GAAK0C,KAAKS,IAAIP,GAAOvB,KAAKD,OAAOpB,WAAW,GAAK0C,KAAKQ,IAAIN,KAAS,IAC9K,EAEDnC,eAAiB,EACjBE,qBAAuB,EAEvBxB,aACEkC,KAAKpC,SAAU,CAChB,EAEDoE,kBACEhC,KAAKpC,SAAU,QACToC,KAAKiC,QAAQ,uBACpB,GAGHC,UACE,MAAMC,EAASnC,KAAKoC,MAAMD,OAAQ,UAASnC,KAAKN,iBAAmB,CAAC,EACpEM,KAAKxB,MAAQ,CACXG,WAAYwD,EAAOxD,YAAc,CAAC,IAAK,KACvCF,OAAQ0D,EAAO1D,OACfI,gBAAiBsD,EAAOtD,iBAAmB,EAC3CE,cAAeoD,EAAOpD,eAAiB,EACvCC,OAAQmD,EAAOnD,QAAU,EACzBC,QAASkD,EAAOlD,SAAW,EAC3BC,QAASiD,EAAOjD,SAAW,EAC3BC,IAAKgD,EAAOhD,KAAO,GACnBE,UAAW8C,EAAO9C,WAAa,EAC/B2B,cAAemB,EAAOnB,eAAiB,QAE1C,EAEDqB,UACErC,KAAKjC,MAAMuE,MAAMC,iBAAiB,OAAQvC,KAAKkB,eAC/ClB,KAAKpB,gBACLoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMG,YAAYqB,KAAKpB,eAC9CoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMK,iBAAiBmB,KAAKpB,eACnDoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMO,eAAeiB,KAAKpB,eACjDoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMQ,QAAQgB,KAAKpB,eAC1CoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMS,SAASe,KAAKpB,eAC3CoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMU,SAASc,KAAKpB,cAC5C,GC/HH,MAAM6D,GAAc,GAEpB,U,WF+GA,IACEpE,KAAM,SACNqE,WAAY,CAACC,MAAK,MAClBpD,OAAQ,CAAC,IACTE,MAAO,CACLC,aAAc,CACZpC,KAAMqC,OACNC,UAAU,IAIdE,SAAU,CACRvB,UACE,MAAQ,GAAEqE,OAAOC,SAASC,aAAaF,OAAOC,SAASE,OAAO/C,KAAK5C,KACpE,GAGH+C,QAAS,CACPzC,iBACEsC,KAAKe,gBAAgBf,KAAKN,aAC3B,EAED/B,UACEqC,KAAKiB,SAASjB,KAAKN,aACpB,I,WGrIL,MAAM,IAA2B,QAAgB,GAAQ,CAAC,CAAC,SAASsD,MAEpE,S,uJCRE,QAA6B,GAArB,gBAAc,M,eAMxB,GACE3E,KAAM,WACNqE,WAAY,CAACO,OAAM,e,UCJrB,MAAMR,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASO,KAEpE,O","sources":["webpack://platypush/./src/components/panels/Camera/Index.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue?be5e","webpack://platypush/./src/components/panels/Camera/Index.vue?8810","webpack://platypush/./src/components/panels/CameraCv/Index.vue","webpack://platypush/./src/components/panels/CameraCv/Index.vue?6f97"],"sourcesContent":["\n\n\n\n\n","\n","import script from \"./Mixin.vue?vue&type=script&lang=js\"\nexport * from \"./Mixin.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=a4970096\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=a4970096&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=351194be\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["class","ref","autoplay","preload","streaming","capturing","captured","src","url","alt","type","stopStreaming","disabled","title","startStreaming","capture","audioOn","stopAudio","startAudio","$refs","paramsModal","show","Date","getTime","length","name","value","fullURL","attrs","device","onDeviceChanged","resolution","onSizeChanged","horizontal_flip","onFlipChanged","vertical_flip","rotate","scale_x","scale_y","fps","onFpsChanged","grayscale","onGrayscaleChanged","mixins","Utils","props","cameraPlugin","String","required","data","computed","params","this","parseInt","parseFloat","methods","getUrl","plugin","action","Object","entries","filter","entry","map","k","v","join","_startStreaming","stream_format","_capture","onFrameLoaded","degToRad","deg","Math","PI","rot","frameContainer","style","width","round","abs","cos","sin","height","async","request","created","config","$root","mounted","frame","addEventListener","$watch","__exports__","components","Modal","window","location","protocol","host","render","Camera"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/8184.c4135de2.js b/platypush/backend/http/webapp/dist/static/js/8184.c4135de2.js deleted file mode 100644 index 34fd2fdd..00000000 --- a/platypush/backend/http/webapp/dist/static/js/8184.c4135de2.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[8184,5528],{5528:function(a,t,e){e.r(t),e.d(t,{default:function(){return ha}});var s=e(6252),n=e(9963);const i={class:"camera"},r={class:"camera-container"},l={class:"frame-container",ref:"frameContainer"},o={key:0,class:"no-frame"},c=["src"],u={class:"controls"},p={class:"left"},h=["disabled"],d=(0,s._)("i",{class:"fa fa-play"},null,-1),m=[d],g=["disabled"],_=(0,s._)("i",{class:"fa fa-stop"},null,-1),f=[_],y=["disabled"],C=(0,s._)("i",{class:"fas fa-camera"},null,-1),w=[C],v={class:"right"},b=(0,s._)("i",{class:"fas fa-volume-mute"},null,-1),S=[b],k=(0,s._)("i",{class:"fas fa-volume-up"},null,-1),z=[k],x=(0,s._)("i",{class:"fas fa-cog"},null,-1),F=[x],U={class:"audio-container"},$={key:0,autoplay:"",preload:"none",ref:"player"},D=["src"],M=(0,s.Uk)(" Your browser does not support audio elements "),V={key:0,class:"url"},q={class:"row"},P=(0,s._)("span",{class:"name"},"Stream URL",-1),A=["value"],L={class:"params"},O={class:"row"},j=(0,s._)("span",{class:"name"},"Device",-1),G={class:"row"},I=(0,s._)("span",{class:"name"},"Width",-1),R={class:"row"},T=(0,s._)("span",{class:"name"},"Height",-1),Z={class:"row"},W=(0,s._)("span",{class:"name"},"Horizontal Flip",-1),H={class:"row"},Y=(0,s._)("span",{class:"name"},"Vertical Flip",-1),E={class:"row"},X=(0,s._)("span",{class:"name"},"Rotate",-1),B={class:"row"},J=(0,s._)("span",{class:"name"},"Scale-X",-1),K={class:"row"},N=(0,s._)("span",{class:"name"},"Scale-Y",-1),Q={class:"row"},aa=(0,s._)("span",{class:"name"},"Frames per second",-1),ta={class:"row"},ea=(0,s._)("span",{class:"name"},"Grayscale",-1);function sa(a,t,e,d,_,C){const b=(0,s.up)("Slot"),k=(0,s.up)("Modal");return(0,s.wg)(),(0,s.iD)("div",i,[(0,s._)("div",r,[(0,s._)("div",l,[a.streaming||a.capturing||a.captured?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("div",o,"The camera is not active")),(0,s._)("img",{class:"frame",src:a.url,ref:"frame",alt:""},null,8,c)],512),(0,s._)("div",u,[(0,s._)("div",p,[a.streaming?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[1]||(t[1]=(...t)=>a.stopStreaming&&a.stopStreaming(...t)),disabled:a.capturing,title:"Stop video"},f,8,g)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[0]||(t[0]=(...a)=>C.startStreaming&&C.startStreaming(...a)),disabled:a.capturing,title:"Start video"},m,8,h)),a.streaming?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("button",{key:2,type:"button",onClick:t[2]||(t[2]=(...a)=>C.capture&&C.capture(...a)),disabled:a.streaming||a.capturing,title:"Take a picture"},w,8,y))]),(0,s._)("div",v,[a.audioOn?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[4]||(t[4]=(...t)=>a.stopAudio&&a.stopAudio(...t)),title:"Stop audio"},z)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[3]||(t[3]=(...t)=>a.startAudio&&a.startAudio(...t)),title:"Start audio"},S)),(0,s._)("button",{type:"button",onClick:t[5]||(t[5]=t=>a.$refs.paramsModal.show()),title:"Settings"},F)])])]),(0,s._)("div",U,[a.audioOn?((0,s.wg)(),(0,s.iD)("audio",$,[(0,s._)("source",{src:`/sound/stream?t=${(new Date).getTime()}`,type:"audio/x-wav;codec=pcm"},null,8,D),M],512)):(0,s.kq)("",!0)]),a.url?.length?((0,s.wg)(),(0,s.iD)("div",V,[(0,s._)("label",q,[P,(0,s._)("input",{name:"url",type:"text",value:C.fullURL,disabled:"disabled"},null,8,A)])])):(0,s.kq)("",!0),(0,s.Wm)(k,{ref:"paramsModal",title:"Camera Parameters"},{default:(0,s.w5)((()=>[(0,s._)("div",L,[(0,s._)("label",O,[j,(0,s.wy)((0,s._)("input",{name:"device",type:"text","onUpdate:modelValue":t[6]||(t[6]=t=>a.attrs.device=t),onChange:t[7]||(t[7]=(...t)=>a.onDeviceChanged&&a.onDeviceChanged(...t))},null,544),[[n.nr,a.attrs.device]])]),(0,s._)("label",G,[I,(0,s.wy)((0,s._)("input",{name:"width",type:"text","onUpdate:modelValue":t[8]||(t[8]=t=>a.attrs.resolution[0]=t),onChange:t[9]||(t[9]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[0]]])]),(0,s._)("label",R,[T,(0,s.wy)((0,s._)("input",{name:"height",type:"text","onUpdate:modelValue":t[10]||(t[10]=t=>a.attrs.resolution[1]=t),onChange:t[11]||(t[11]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[1]]])]),(0,s._)("label",Z,[W,(0,s.wy)((0,s._)("input",{name:"horizontal_flip",type:"checkbox","onUpdate:modelValue":t[12]||(t[12]=t=>a.attrs.horizontal_flip=t),onChange:t[13]||(t[13]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.horizontal_flip]])]),(0,s._)("label",H,[Y,(0,s.wy)((0,s._)("input",{name:"vertical_flip",type:"checkbox","onUpdate:modelValue":t[14]||(t[14]=t=>a.attrs.vertical_flip=t),onChange:t[15]||(t[15]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.vertical_flip]])]),(0,s._)("label",E,[X,(0,s.wy)((0,s._)("input",{name:"rotate",type:"text","onUpdate:modelValue":t[16]||(t[16]=t=>a.attrs.rotate=t),onChange:t[17]||(t[17]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.rotate]])]),(0,s._)("label",B,[J,(0,s.wy)((0,s._)("input",{name:"scale_x",type:"text","onUpdate:modelValue":t[18]||(t[18]=t=>a.attrs.scale_x=t),onChange:t[19]||(t[19]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_x]])]),(0,s._)("label",K,[N,(0,s.wy)((0,s._)("input",{name:"scale_y",type:"text","onUpdate:modelValue":t[20]||(t[20]=t=>a.attrs.scale_y=t),onChange:t[21]||(t[21]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_y]])]),(0,s._)("label",Q,[aa,(0,s.wy)((0,s._)("input",{name:"fps",type:"text","onUpdate:modelValue":t[22]||(t[22]=t=>a.attrs.fps=t),onChange:t[23]||(t[23]=(...t)=>a.onFpsChanged&&a.onFpsChanged(...t))},null,544),[[n.nr,a.attrs.fps]])]),(0,s._)("label",ta,[ea,(0,s.wy)((0,s._)("input",{name:"grayscale",type:"checkbox","onUpdate:modelValue":t[24]||(t[24]=t=>a.attrs.grayscale=t),onChange:t[25]||(t[25]=(...t)=>a.onGrayscaleChanged&&a.onGrayscaleChanged(...t))},null,544),[[n.e8,a.attrs.grayscale]])]),(0,s.Wm)(b)])])),_:1},512)])}var na=e(6813),ia={name:"CameraMixin",mixins:[na.Z],props:{cameraPlugin:{type:String,required:!0}},data(){return{streaming:!1,capturing:!1,captured:!1,audioOn:!1,url:null,attrs:{}}},computed:{params(){return{resolution:this.attrs.resolution,device:this.attrs.device?.length?this.attrs.device:null,horizontal_flip:parseInt(0+this.attrs.horizontal_flip),vertical_flip:parseInt(0+this.attrs.vertical_flip),rotate:parseFloat(this.attrs.rotate),scale_x:parseFloat(this.attrs.scale_x),scale_y:parseFloat(this.attrs.scale_y),fps:parseFloat(this.attrs.fps),grayscale:parseInt(0+this.attrs.grayscale)}}},methods:{getUrl(a,t){return"/camera/"+a+"/"+t+"?"+Object.entries(this.params).filter((a=>null!=a[1]&&(""+a[1]).length>0)).map((([a,t])=>a+"="+t)).join("&")},_startStreaming(a){this.streaming||(this.streaming=!0,this.capturing=!1,this.captured=!1,this.url=this.getUrl(a,"video."+this.attrs.stream_format))},stopStreaming(){this.streaming&&(this.streaming=!1,this.capturing=!1,this.url=null)},_capture(a){this.capturing||(this.streaming=!1,this.capturing=!0,this.captured=!0,this.url=this.getUrl(a,"photo.jpg")+"&t="+(new Date).getTime())},onFrameLoaded(){this.capturing&&(this.capturing=!1)},onDeviceChanged(){},onFlipChanged(){},onSizeChanged(){const a=a=>a*Math.PI/180,t=a(this.params.rotate);this.$refs.frameContainer.style.width=Math.round(this.params.scale_x*Math.abs(this.params.resolution[0]*Math.cos(t)+this.params.resolution[1]*Math.sin(t)))+"px",this.$refs.frameContainer.style.height=Math.round(this.params.scale_y*Math.abs(this.params.resolution[0]*Math.sin(t)+this.params.resolution[1]*Math.cos(t)))+"px"},onFpsChanged(){},onGrayscaleChanged(){},startAudio(){this.audioOn=!0},async stopAudio(){this.audioOn=!1,await this.request("sound.stop_recording")}},created(){const a=this.$root.config[`camera.${this.cameraPlugin}`]||{};this.attrs={resolution:a.resolution||[640,480],device:a.device,horizontal_flip:a.horizontal_flip||0,vertical_flip:a.vertical_flip||0,rotate:a.rotate||0,scale_x:a.scale_x||1,scale_y:a.scale_y||1,fps:a.fps||16,grayscale:a.grayscale||0,stream_format:a.stream_format||"mjpeg"}},mounted(){this.$refs.frame.addEventListener("load",this.onFrameLoaded),this.onSizeChanged(),this.$watch((()=>this.attrs.resolution),this.onSizeChanged),this.$watch((()=>this.attrs.horizontal_flip),this.onSizeChanged),this.$watch((()=>this.attrs.vertical_flip),this.onSizeChanged),this.$watch((()=>this.attrs.rotate),this.onSizeChanged),this.$watch((()=>this.attrs.scale_x),this.onSizeChanged),this.$watch((()=>this.attrs.scale_y),this.onSizeChanged)}};const ra=ia;var la=ra,oa=e(1794),ca={name:"Camera",components:{Modal:oa.Z},mixins:[la],props:{cameraPlugin:{type:String,required:!0}},computed:{fullURL(){return`${window.location.protocol}//${window.location.host}${this.url}`}},methods:{startStreaming(){this._startStreaming(this.cameraPlugin)},capture(){this._capture(this.cameraPlugin)}}},ua=e(3744);const pa=(0,ua.Z)(ca,[["render",sa]]);var ha=pa},8184:function(a,t,e){e.r(t),e.d(t,{default:function(){return c}});var s=e(6252);function n(a,t,e,n,i,r){const l=(0,s.up)("Camera");return(0,s.wg)(),(0,s.j4)(l,{"camera-plugin":"cv"})}var i=e(5528),r={name:"CameraCv",components:{Camera:i["default"]}},l=e(3744);const o=(0,l.Z)(r,[["render",n]]);var c=o}}]); -//# sourceMappingURL=8184.c4135de2.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/8184.c4135de2.js.map b/platypush/backend/http/webapp/dist/static/js/8184.c4135de2.js.map deleted file mode 100644 index e6e524c9..00000000 --- a/platypush/backend/http/webapp/dist/static/js/8184.c4135de2.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/8184.c4135de2.js","mappings":"sMACOA,MAAM,U,GACJA,MAAM,oB,GACJA,MAAM,kBAAkBC,IAAI,kB,SAC1BD,MAAM,Y,aAIRA,MAAM,Y,GACJA,MAAM,Q,kBAEP,OAAwB,KAArBA,MAAM,cAAY,S,GAArB,G,kBAIA,OAAwB,KAArBA,MAAM,cAAY,S,GAArB,G,kBAKA,OAA2B,KAAxBA,MAAM,iBAAe,S,GAAxB,G,GAICA,MAAM,S,GAEP,OAAgC,KAA7BA,MAAM,sBAAoB,S,GAA7B,G,GAIA,OAA8B,KAA3BA,MAAM,oBAAkB,S,GAA3B,G,GAIA,OAAwB,KAArBA,MAAM,cAAY,S,GAArB,G,GAMHA,MAAM,mB,SACFE,SAAA,GAASC,QAAQ,OAAOF,IAAI,U,qBAEuD,kD,SAKvFD,MAAM,O,GACFA,MAAM,O,GACX,OAAoC,QAA9BA,MAAM,QAAO,cAAU,G,eAM1BA,MAAM,U,GACFA,MAAM,O,GACX,OAAgC,QAA1BA,MAAM,QAAO,UAAM,G,GAIpBA,MAAM,O,GACX,OAA+B,QAAzBA,MAAM,QAAO,SAAK,G,GAInBA,MAAM,O,GACX,OAAgC,QAA1BA,MAAM,QAAO,UAAM,G,GAIpBA,MAAM,O,GACX,OAAyC,QAAnCA,MAAM,QAAO,mBAAe,G,GAI7BA,MAAM,O,GACX,OAAuC,QAAjCA,MAAM,QAAO,iBAAa,G,GAI3BA,MAAM,O,GACX,OAAgC,QAA1BA,MAAM,QAAO,UAAM,G,GAIpBA,MAAM,O,GACX,OAAiC,QAA3BA,MAAM,QAAO,WAAO,G,GAIrBA,MAAM,O,GACX,OAAiC,QAA3BA,MAAM,QAAO,WAAO,G,GAIrBA,MAAM,O,IACX,OAA2C,QAArCA,MAAM,QAAO,qBAAiB,G,IAI/BA,MAAM,O,IACX,OAAmC,QAA7BA,MAAM,QAAO,aAAS,G,wFAtGpC,QA6GM,MA7GN,EA6GM,EA5GJ,OAoCM,MApCN,EAoCM,EAnCJ,OAGM,MAHN,EAGM,CAFyB,EAAAI,WAAc,EAAAC,WAAc,EAAAC,UAAzD,iBAAyD,WAAzD,QAAiG,MAAjG,EAAmE,8BACnE,OAAiD,OAA5CN,MAAM,QAASO,IAAK,EAAAC,IAAKP,IAAI,QAAQQ,IAAI,IAA9C,WAFF,MAKA,OA6BM,MA7BN,EA6BM,EA5BJ,OAaM,MAbN,EAaM,CAZ2F,EAAAL,YAA/F,WAIA,QAES,U,MAFDM,KAAK,SAAU,QAAK,oBAAE,EAAAC,eAAA,EAAAA,iBAAA,IAAgBC,SAAU,EAAAP,UAAWQ,MAAM,cAAzE,UAJ+F,WAA/F,QAES,U,MAFDH,KAAK,SAAU,QAAK,oBAAE,EAAAI,gBAAA,EAAAA,kBAAA,IAAiBF,SAAU,EAAAP,UAAWQ,MAAM,eAA1E,QAQiF,EAAAT,WAAjF,iBAAiF,WAAjF,QAGS,U,MAHDM,KAAK,SAAU,QAAK,oBAAE,EAAAK,SAAA,EAAAA,WAAA,IAAUH,SAAU,EAAAR,WAAa,EAAAC,UACvDQ,MAAM,kBADd,WAMF,OAYM,MAZN,EAYM,CAXiE,EAAAG,UAArE,WAIA,QAES,U,MAFDN,KAAK,SAAU,QAAK,oBAAE,EAAAO,WAAA,EAAAA,aAAA,IAAWJ,MAAM,cAA/C,MAJqE,WAArE,QAES,U,MAFDH,KAAK,SAAU,QAAK,oBAAE,EAAAQ,YAAA,EAAAA,cAAA,IAAYL,MAAM,eAAhD,KAQA,OAES,UAFDH,KAAK,SAAU,QAAK,eAAE,EAAAS,MAAMC,YAAYC,QAAQR,MAAM,YAA9D,UAON,OAMM,MANN,EAMM,CAL8C,EAAAG,UAAA,WAAlD,QAIQ,QAJR,EAIQ,EAFN,OAAwF,UAA/ET,IAAG,wBAA0Be,MAAQC,YAAab,KAAK,yBAAhE,UAEM,GAJR,wBAOqB,EAAAF,KAAKgB,SAAA,WAA5B,QAKM,MALN,EAKM,EAJJ,OAGQ,QAHR,EAGQ,CAFN,GACA,OAAoE,SAA7DC,KAAK,MAAMf,KAAK,OAAQgB,MAAO,EAAAC,QAASf,SAAS,YAAxD,gBAHJ,gBAOA,QAsDQ,GAtDDX,IAAI,cAAcY,MAAM,qBAA/B,C,kBACE,IAoDM,EApDN,OAoDM,MApDN,EAoDM,EAnDJ,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAmF,SAA5EY,KAAK,SAASf,KAAK,O,qCAAgB,EAAAkB,MAAMC,OAAM,GAAG,SAAM,oBAAE,EAAAC,iBAAA,EAAAA,mBAAA,KAAjE,iBAA0C,EAAAF,MAAMC,aAGlD,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAuF,SAAhFJ,KAAK,QAAQf,KAAK,O,qCAAgB,EAAAkB,MAAMG,WAAU,MAAM,SAAM,oBAAE,EAAAC,eAAA,EAAAA,iBAAA,KAAvE,iBAAyC,EAAAJ,MAAMG,WAAU,SAG3D,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAwF,SAAjFN,KAAK,SAASf,KAAK,O,uCAAgB,EAAAkB,MAAMG,WAAU,MAAM,SAAM,sBAAE,EAAAC,eAAA,EAAAA,iBAAA,KAAxE,iBAA0C,EAAAJ,MAAMG,WAAU,SAG5D,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAuG,SAAhGN,KAAK,kBAAkBf,KAAK,W,uCAAoB,EAAAkB,MAAMK,gBAAe,GAAG,SAAM,sBAAE,EAAAC,eAAA,EAAAA,iBAAA,KAAvF,iBAAuD,EAAAN,MAAMK,sBAG/D,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAmG,SAA5FR,KAAK,gBAAgBf,KAAK,W,uCAAoB,EAAAkB,MAAMO,cAAa,GAAG,SAAM,sBAAE,EAAAD,eAAA,EAAAA,iBAAA,KAAnF,iBAAqD,EAAAN,MAAMO,oBAG7D,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAiF,SAA1EV,KAAK,SAASf,KAAK,O,uCAAgB,EAAAkB,MAAMQ,OAAM,GAAG,SAAM,sBAAE,EAAAJ,eAAA,EAAAA,iBAAA,KAAjE,iBAA0C,EAAAJ,MAAMQ,aAGlD,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAmF,SAA5EX,KAAK,UAAUf,KAAK,O,uCAAgB,EAAAkB,MAAMS,QAAO,GAAG,SAAM,sBAAE,EAAAL,eAAA,EAAAA,iBAAA,KAAnE,iBAA2C,EAAAJ,MAAMS,cAGnD,OAGQ,QAHR,EAGQ,CAFN,GAEM,SADN,OAAmF,SAA5EZ,KAAK,UAAUf,KAAK,O,uCAAgB,EAAAkB,MAAMU,QAAO,GAAG,SAAM,sBAAE,EAAAN,eAAA,EAAAA,iBAAA,KAAnE,iBAA2C,EAAAJ,MAAMU,cAGnD,OAGQ,QAHR,EAGQ,CAFN,IAEM,SADN,OAA0E,SAAnEb,KAAK,MAAMf,KAAK,O,uCAAgB,EAAAkB,MAAMW,IAAG,GAAG,SAAM,sBAAE,EAAAC,cAAA,EAAAA,gBAAA,KAA3D,iBAAuC,EAAAZ,MAAMW,UAG/C,OAGQ,QAHR,GAGQ,CAFN,IAEM,SADN,OAAgG,SAAzFd,KAAK,YAAYf,KAAK,W,uCAAoB,EAAAkB,MAAMa,UAAS,GAAG,SAAM,sBAAE,EAAAC,oBAAA,EAAAA,sBAAA,KAA3E,iBAAiD,EAAAd,MAAMa,gBAGzD,QAAQ,Q,KApDZ,M,gBCpDJ,IACEhB,KAAM,cACNkB,OAAQ,CAACC,GAAA,GAETC,MAAO,CACLC,aAAc,CACZpC,KAAMqC,OACNC,UAAU,IAIdC,OACE,MAAO,CACL7C,WAAW,EACXC,WAAW,EACXC,UAAU,EACVU,SAAS,EACTR,IAAK,KACLoB,MAAO,CAAC,EAEX,EAEDsB,SAAU,CACRC,SACE,MAAO,CACLpB,WAAYqB,KAAKxB,MAAMG,WACvBF,OAAQuB,KAAKxB,MAAMC,QAAQL,OAAS4B,KAAKxB,MAAMC,OAAS,KACxDI,gBAAiBoB,SAAS,EAAID,KAAKxB,MAAMK,iBACzCE,cAAekB,SAAS,EAAID,KAAKxB,MAAMO,eACvCC,OAAQkB,WAAWF,KAAKxB,MAAMQ,QAC9BC,QAASiB,WAAWF,KAAKxB,MAAMS,SAC/BC,QAASgB,WAAWF,KAAKxB,MAAMU,SAC/BC,IAAKe,WAAWF,KAAKxB,MAAMW,KAC3BE,UAAWY,SAAS,EAAID,KAAKxB,MAAMa,WAEtC,GAGHc,QAAS,CACPC,OAAOC,EAAQC,GACb,MAAO,WAAaD,EAAS,IAAMC,EAAS,IACxCC,OAAOC,QAAQR,KAAKD,QAAQU,QAAQC,GAAsB,MAAZA,EAAM,KAAe,GAAKA,EAAM,IAAItC,OAAS,IACtFuC,KAAI,EAAEC,EAAGC,KAAOD,EAAI,IAAMC,IAAGC,KAAK,IAC5C,EAEDC,gBAAgBV,GACVL,KAAKhD,YAGTgD,KAAKhD,WAAY,EACjBgD,KAAK/C,WAAY,EACjB+C,KAAK9C,UAAW,EAChB8C,KAAK5C,IAAM4C,KAAKI,OAAOC,EAAQ,SAAWL,KAAKxB,MAAMwC,eACtD,EAEDzD,gBACOyC,KAAKhD,YAGVgD,KAAKhD,WAAY,EACjBgD,KAAK/C,WAAY,EACjB+C,KAAK5C,IAAM,KACZ,EAED6D,SAASZ,GACHL,KAAK/C,YAGT+C,KAAKhD,WAAY,EACjBgD,KAAK/C,WAAY,EACjB+C,KAAK9C,UAAW,EAChB8C,KAAK5C,IAAM4C,KAAKI,OAAOC,EAAQ,aAAe,OAAS,IAAInC,MAAQC,UACpE,EAED+C,gBACMlB,KAAK/C,YACP+C,KAAK/C,WAAY,EAEpB,EAEDyB,kBAAoB,EACpBI,gBAAkB,EAClBF,gBACE,MAAMuC,EAAYC,GAASA,EAAMC,KAAKC,GAAI,IACpCC,EAAMJ,EAASnB,KAAKD,OAAOf,QACjCgB,KAAKjC,MAAMyD,eAAeC,MAAMC,MAAQL,KAAKM,MAAM3B,KAAKD,OAAOd,QAAUoC,KAAKO,IAAI5B,KAAKD,OAAOpB,WAAW,GAAK0C,KAAKQ,IAAIN,GAAOvB,KAAKD,OAAOpB,WAAW,GAAK0C,KAAKS,IAAIP,KAAS,KAC5KvB,KAAKjC,MAAMyD,eAAeC,MAAMM,OAASV,KAAKM,MAAM3B,KAAKD,OAAOb,QAAUmC,KAAKO,IAAI5B,KAAKD,OAAOpB,WAAW,GAAK0C,KAAKS,IAAIP,GAAOvB,KAAKD,OAAOpB,WAAW,GAAK0C,KAAKQ,IAAIN,KAAS,IAC9K,EAEDnC,eAAiB,EACjBE,qBAAuB,EAEvBxB,aACEkC,KAAKpC,SAAU,CAChB,EAEDoE,kBACEhC,KAAKpC,SAAU,QACToC,KAAKiC,QAAQ,uBACpB,GAGHC,UACE,MAAMC,EAASnC,KAAKoC,MAAMD,OAAQ,UAASnC,KAAKN,iBAAmB,CAAC,EACpEM,KAAKxB,MAAQ,CACXG,WAAYwD,EAAOxD,YAAc,CAAC,IAAK,KACvCF,OAAQ0D,EAAO1D,OACfI,gBAAiBsD,EAAOtD,iBAAmB,EAC3CE,cAAeoD,EAAOpD,eAAiB,EACvCC,OAAQmD,EAAOnD,QAAU,EACzBC,QAASkD,EAAOlD,SAAW,EAC3BC,QAASiD,EAAOjD,SAAW,EAC3BC,IAAKgD,EAAOhD,KAAO,GACnBE,UAAW8C,EAAO9C,WAAa,EAC/B2B,cAAemB,EAAOnB,eAAiB,QAE1C,EAEDqB,UACErC,KAAKjC,MAAMuE,MAAMC,iBAAiB,OAAQvC,KAAKkB,eAC/ClB,KAAKpB,gBACLoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMG,YAAYqB,KAAKpB,eAC9CoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMK,iBAAiBmB,KAAKpB,eACnDoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMO,eAAeiB,KAAKpB,eACjDoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMQ,QAAQgB,KAAKpB,eAC1CoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMS,SAASe,KAAKpB,eAC3CoB,KAAKwC,QAAO,IAAMxC,KAAKxB,MAAMU,SAASc,KAAKpB,cAC5C,GC/HH,MAAM6D,GAAc,GAEpB,U,WFgHA,IACEpE,KAAM,SACNqE,WAAY,CAACC,MAAK,MAClBpD,OAAQ,CAAC,IACTE,MAAO,CACLC,aAAc,CACZpC,KAAMqC,OACNC,UAAU,IAIdE,SAAU,CACRvB,UACE,MAAQ,GAAEqE,OAAOC,SAASC,aAAaF,OAAOC,SAASE,OAAO/C,KAAK5C,KACpE,GAGH+C,QAAS,CACPzC,iBACEsC,KAAKe,gBAAgBf,KAAKN,aAC3B,EAED/B,UACEqC,KAAKiB,SAASjB,KAAKN,aACpB,I,WGtIL,MAAM,IAA2B,QAAgB,GAAQ,CAAC,CAAC,SAASsD,MAEpE,S,uJCRE,QAA6B,GAArB,gBAAc,M,eAMxB,GACE3E,KAAM,WACNqE,WAAY,CAACO,OAAM,e,UCJrB,MAAMR,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASO,KAEpE,O","sources":["webpack://platypush/./src/components/panels/Camera/Index.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue?be5e","webpack://platypush/./src/components/panels/Camera/Index.vue?8810","webpack://platypush/./src/components/panels/CameraCv/Index.vue","webpack://platypush/./src/components/panels/CameraCv/Index.vue?6f97"],"sourcesContent":["\n\n\n\n\n","\n","import script from \"./Mixin.vue?vue&type=script&lang=js\"\nexport * from \"./Mixin.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=bfa8f2aa\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=bfa8f2aa&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=351194be\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["class","ref","autoplay","preload","streaming","capturing","captured","src","url","alt","type","stopStreaming","disabled","title","startStreaming","capture","audioOn","stopAudio","startAudio","$refs","paramsModal","show","Date","getTime","length","name","value","fullURL","attrs","device","onDeviceChanged","resolution","onSizeChanged","horizontal_flip","onFlipChanged","vertical_flip","rotate","scale_x","scale_y","fps","onFpsChanged","grayscale","onGrayscaleChanged","mixins","Utils","props","cameraPlugin","String","required","data","computed","params","this","parseInt","parseFloat","methods","getUrl","plugin","action","Object","entries","filter","entry","map","k","v","join","_startStreaming","stream_format","_capture","onFrameLoaded","degToRad","deg","Math","PI","rot","frameContainer","style","width","round","abs","cos","sin","height","async","request","created","config","$root","mounted","frame","addEventListener","$watch","__exports__","components","Modal","window","location","protocol","host","render","Camera"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/9895-legacy.acee9428.js b/platypush/backend/http/webapp/dist/static/js/9895-legacy.1fd296a4.js similarity index 84% rename from platypush/backend/http/webapp/dist/static/js/9895-legacy.acee9428.js rename to platypush/backend/http/webapp/dist/static/js/9895-legacy.1fd296a4.js index f38c5307..1a84caff 100644 --- a/platypush/backend/http/webapp/dist/static/js/9895-legacy.acee9428.js +++ b/platypush/backend/http/webapp/dist/static/js/9895-legacy.1fd296a4.js @@ -1,2 +1,2 @@ -"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[9895],{9895:function(a,r,e){e.r(r),e.d(r,{default:function(){return i}});var t=e(6252);function s(a,r,e,s,n,c){var u=(0,t.up)("Camera");return(0,t.wg)(),(0,t.j4)(u,{"camera-plugin":"ir.mlx90640",ref:"camera"},null,512)}var n=e(5528),c={name:"CameraIrMlx90640",components:{Camera:n["default"]},mounted:function(){var a=this.$root.config["camera.".concat(this.cameraPlugin)]||{};a.resolution||(this.$refs.camera.attrs.resolution=[32,24]),a.scale_x||(this.$refs.camera.attrs.scale_x=15),a.scale_y||(this.$refs.camera.attrs.scale_y=15)}},u=e(3744);const l=(0,u.Z)(c,[["render",s]]);var i=l}}]); -//# sourceMappingURL=9895-legacy.acee9428.js.map \ No newline at end of file +"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[9895],{9895:function(a,r,e){e.r(r),e.d(r,{default:function(){return i}});var t=e(6252);function s(a,r,e,s,n,c){var u=(0,t.up)("Camera");return(0,t.wg)(),(0,t.j4)(u,{"camera-plugin":"ir.mlx90640",ref:"camera"},null,512)}var n=e(9021),c={name:"CameraIrMlx90640",components:{Camera:n["default"]},mounted:function(){var a=this.$root.config["camera.".concat(this.cameraPlugin)]||{};a.resolution||(this.$refs.camera.attrs.resolution=[32,24]),a.scale_x||(this.$refs.camera.attrs.scale_x=15),a.scale_y||(this.$refs.camera.attrs.scale_y=15)}},u=e(3744);const l=(0,u.Z)(c,[["render",s]]);var i=l}}]); +//# sourceMappingURL=9895-legacy.1fd296a4.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/9895-legacy.acee9428.js.map b/platypush/backend/http/webapp/dist/static/js/9895-legacy.1fd296a4.js.map similarity index 96% rename from platypush/backend/http/webapp/dist/static/js/9895-legacy.acee9428.js.map rename to platypush/backend/http/webapp/dist/static/js/9895-legacy.1fd296a4.js.map index 75062b73..126d6a08 100644 --- a/platypush/backend/http/webapp/dist/static/js/9895-legacy.acee9428.js.map +++ b/platypush/backend/http/webapp/dist/static/js/9895-legacy.1fd296a4.js.map @@ -1 +1 @@ -{"version":3,"file":"static/js/9895-legacy.acee9428.js","mappings":"gPACE,QAAmD,GAA3C,gBAAc,cAAcA,IAAI,UAAxC,S,eAMF,GACEC,KAAM,mBACNC,WAAY,CAACC,OAAA,cAEbC,QAJa,WAKX,IAAMC,EAASC,KAAKC,MAAMF,OAAX,iBAA4BC,KAAKE,gBAAmB,CAAC,EAC/DH,EAAOI,aACVH,KAAKI,MAAMC,OAAOC,MAAMH,WAAa,CAAC,GAAI,KACvCJ,EAAOQ,UACVP,KAAKI,MAAMC,OAAOC,MAAMC,QAAU,IAC/BR,EAAOS,UACVR,KAAKI,MAAMC,OAAOC,MAAME,QAAU,GACrC,G,UCdH,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,KAEpE,O","sources":["webpack://platypush/./src/components/panels/CameraIrMlx90640/Index.vue","webpack://platypush/./src/components/panels/CameraIrMlx90640/Index.vue?0a62"],"sourcesContent":["\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=5585d4f1\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["ref","name","components","Camera","mounted","config","this","$root","cameraPlugin","resolution","$refs","camera","attrs","scale_x","scale_y","__exports__","render"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"static/js/9895-legacy.1fd296a4.js","mappings":"gPACE,QAAmD,GAA3C,gBAAc,cAAcA,IAAI,UAAxC,S,eAMF,GACEC,KAAM,mBACNC,WAAY,CAACC,OAAA,cAEbC,QAJa,WAKX,IAAMC,EAASC,KAAKC,MAAMF,OAAX,iBAA4BC,KAAKE,gBAAmB,CAAC,EAC/DH,EAAOI,aACVH,KAAKI,MAAMC,OAAOC,MAAMH,WAAa,CAAC,GAAI,KACvCJ,EAAOQ,UACVP,KAAKI,MAAMC,OAAOC,MAAMC,QAAU,IAC/BR,EAAOS,UACVR,KAAKI,MAAMC,OAAOC,MAAME,QAAU,GACrC,G,UCdH,MAAMC,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,KAEpE,O","sources":["webpack://platypush/./src/components/panels/CameraIrMlx90640/Index.vue","webpack://platypush/./src/components/panels/CameraIrMlx90640/Index.vue?0a62"],"sourcesContent":["\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=5585d4f1\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["ref","name","components","Camera","mounted","config","this","$root","cameraPlugin","resolution","$refs","camera","attrs","scale_x","scale_y","__exports__","render"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/9895.16e6387b.js b/platypush/backend/http/webapp/dist/static/js/9895.16e6387b.js deleted file mode 100644 index 35755ed9..00000000 --- a/platypush/backend/http/webapp/dist/static/js/9895.16e6387b.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[9895,5528],{5528:function(a,t,e){e.r(t),e.d(t,{default:function(){return ha}});var s=e(6252),n=e(9963);const i={class:"camera"},r={class:"camera-container"},l={class:"frame-container",ref:"frameContainer"},o={key:0,class:"no-frame"},c=["src"],u={class:"controls"},p={class:"left"},h=["disabled"],d=(0,s._)("i",{class:"fa fa-play"},null,-1),m=[d],g=["disabled"],_=(0,s._)("i",{class:"fa fa-stop"},null,-1),f=[_],y=["disabled"],C=(0,s._)("i",{class:"fas fa-camera"},null,-1),w=[C],v={class:"right"},b=(0,s._)("i",{class:"fas fa-volume-mute"},null,-1),S=[b],x=(0,s._)("i",{class:"fas fa-volume-up"},null,-1),k=[x],z=(0,s._)("i",{class:"fas fa-cog"},null,-1),$=[z],F={class:"audio-container"},U={key:0,autoplay:"",preload:"none",ref:"player"},D=["src"],M=(0,s.Uk)(" Your browser does not support audio elements "),V={key:0,class:"url"},P={class:"row"},q=(0,s._)("span",{class:"name"},"Stream URL",-1),A=["value"],L={class:"params"},O={class:"row"},j=(0,s._)("span",{class:"name"},"Device",-1),I={class:"row"},G=(0,s._)("span",{class:"name"},"Width",-1),R={class:"row"},T=(0,s._)("span",{class:"name"},"Height",-1),Z={class:"row"},W=(0,s._)("span",{class:"name"},"Horizontal Flip",-1),H={class:"row"},Y=(0,s._)("span",{class:"name"},"Vertical Flip",-1),E={class:"row"},X=(0,s._)("span",{class:"name"},"Rotate",-1),B={class:"row"},J=(0,s._)("span",{class:"name"},"Scale-X",-1),K={class:"row"},N=(0,s._)("span",{class:"name"},"Scale-Y",-1),Q={class:"row"},aa=(0,s._)("span",{class:"name"},"Frames per second",-1),ta={class:"row"},ea=(0,s._)("span",{class:"name"},"Grayscale",-1);function sa(a,t,e,d,_,C){const b=(0,s.up)("Slot"),x=(0,s.up)("Modal");return(0,s.wg)(),(0,s.iD)("div",i,[(0,s._)("div",r,[(0,s._)("div",l,[a.streaming||a.capturing||a.captured?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("div",o,"The camera is not active")),(0,s._)("img",{class:"frame",src:a.url,ref:"frame",alt:""},null,8,c)],512),(0,s._)("div",u,[(0,s._)("div",p,[a.streaming?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[1]||(t[1]=(...t)=>a.stopStreaming&&a.stopStreaming(...t)),disabled:a.capturing,title:"Stop video"},f,8,g)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[0]||(t[0]=(...a)=>C.startStreaming&&C.startStreaming(...a)),disabled:a.capturing,title:"Start video"},m,8,h)),a.streaming?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("button",{key:2,type:"button",onClick:t[2]||(t[2]=(...a)=>C.capture&&C.capture(...a)),disabled:a.streaming||a.capturing,title:"Take a picture"},w,8,y))]),(0,s._)("div",v,[a.audioOn?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[4]||(t[4]=(...t)=>a.stopAudio&&a.stopAudio(...t)),title:"Stop audio"},k)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[3]||(t[3]=(...t)=>a.startAudio&&a.startAudio(...t)),title:"Start audio"},S)),(0,s._)("button",{type:"button",onClick:t[5]||(t[5]=t=>a.$refs.paramsModal.show()),title:"Settings"},$)])])]),(0,s._)("div",F,[a.audioOn?((0,s.wg)(),(0,s.iD)("audio",U,[(0,s._)("source",{src:`/sound/stream?t=${(new Date).getTime()}`,type:"audio/x-wav;codec=pcm"},null,8,D),M],512)):(0,s.kq)("",!0)]),a.url?.length?((0,s.wg)(),(0,s.iD)("div",V,[(0,s._)("label",P,[q,(0,s._)("input",{name:"url",type:"text",value:C.fullURL,disabled:"disabled"},null,8,A)])])):(0,s.kq)("",!0),(0,s.Wm)(x,{ref:"paramsModal",title:"Camera Parameters"},{default:(0,s.w5)((()=>[(0,s._)("div",L,[(0,s._)("label",O,[j,(0,s.wy)((0,s._)("input",{name:"device",type:"text","onUpdate:modelValue":t[6]||(t[6]=t=>a.attrs.device=t),onChange:t[7]||(t[7]=(...t)=>a.onDeviceChanged&&a.onDeviceChanged(...t))},null,544),[[n.nr,a.attrs.device]])]),(0,s._)("label",I,[G,(0,s.wy)((0,s._)("input",{name:"width",type:"text","onUpdate:modelValue":t[8]||(t[8]=t=>a.attrs.resolution[0]=t),onChange:t[9]||(t[9]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[0]]])]),(0,s._)("label",R,[T,(0,s.wy)((0,s._)("input",{name:"height",type:"text","onUpdate:modelValue":t[10]||(t[10]=t=>a.attrs.resolution[1]=t),onChange:t[11]||(t[11]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[1]]])]),(0,s._)("label",Z,[W,(0,s.wy)((0,s._)("input",{name:"horizontal_flip",type:"checkbox","onUpdate:modelValue":t[12]||(t[12]=t=>a.attrs.horizontal_flip=t),onChange:t[13]||(t[13]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.horizontal_flip]])]),(0,s._)("label",H,[Y,(0,s.wy)((0,s._)("input",{name:"vertical_flip",type:"checkbox","onUpdate:modelValue":t[14]||(t[14]=t=>a.attrs.vertical_flip=t),onChange:t[15]||(t[15]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.vertical_flip]])]),(0,s._)("label",E,[X,(0,s.wy)((0,s._)("input",{name:"rotate",type:"text","onUpdate:modelValue":t[16]||(t[16]=t=>a.attrs.rotate=t),onChange:t[17]||(t[17]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.rotate]])]),(0,s._)("label",B,[J,(0,s.wy)((0,s._)("input",{name:"scale_x",type:"text","onUpdate:modelValue":t[18]||(t[18]=t=>a.attrs.scale_x=t),onChange:t[19]||(t[19]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_x]])]),(0,s._)("label",K,[N,(0,s.wy)((0,s._)("input",{name:"scale_y",type:"text","onUpdate:modelValue":t[20]||(t[20]=t=>a.attrs.scale_y=t),onChange:t[21]||(t[21]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_y]])]),(0,s._)("label",Q,[aa,(0,s.wy)((0,s._)("input",{name:"fps",type:"text","onUpdate:modelValue":t[22]||(t[22]=t=>a.attrs.fps=t),onChange:t[23]||(t[23]=(...t)=>a.onFpsChanged&&a.onFpsChanged(...t))},null,544),[[n.nr,a.attrs.fps]])]),(0,s._)("label",ta,[ea,(0,s.wy)((0,s._)("input",{name:"grayscale",type:"checkbox","onUpdate:modelValue":t[24]||(t[24]=t=>a.attrs.grayscale=t),onChange:t[25]||(t[25]=(...t)=>a.onGrayscaleChanged&&a.onGrayscaleChanged(...t))},null,544),[[n.e8,a.attrs.grayscale]])]),(0,s.Wm)(b)])])),_:1},512)])}var na=e(6813),ia={name:"CameraMixin",mixins:[na.Z],props:{cameraPlugin:{type:String,required:!0}},data(){return{streaming:!1,capturing:!1,captured:!1,audioOn:!1,url:null,attrs:{}}},computed:{params(){return{resolution:this.attrs.resolution,device:this.attrs.device?.length?this.attrs.device:null,horizontal_flip:parseInt(0+this.attrs.horizontal_flip),vertical_flip:parseInt(0+this.attrs.vertical_flip),rotate:parseFloat(this.attrs.rotate),scale_x:parseFloat(this.attrs.scale_x),scale_y:parseFloat(this.attrs.scale_y),fps:parseFloat(this.attrs.fps),grayscale:parseInt(0+this.attrs.grayscale)}}},methods:{getUrl(a,t){return"/camera/"+a+"/"+t+"?"+Object.entries(this.params).filter((a=>null!=a[1]&&(""+a[1]).length>0)).map((([a,t])=>a+"="+t)).join("&")},_startStreaming(a){this.streaming||(this.streaming=!0,this.capturing=!1,this.captured=!1,this.url=this.getUrl(a,"video."+this.attrs.stream_format))},stopStreaming(){this.streaming&&(this.streaming=!1,this.capturing=!1,this.url=null)},_capture(a){this.capturing||(this.streaming=!1,this.capturing=!0,this.captured=!0,this.url=this.getUrl(a,"photo.jpg")+"&t="+(new Date).getTime())},onFrameLoaded(){this.capturing&&(this.capturing=!1)},onDeviceChanged(){},onFlipChanged(){},onSizeChanged(){const a=a=>a*Math.PI/180,t=a(this.params.rotate);this.$refs.frameContainer.style.width=Math.round(this.params.scale_x*Math.abs(this.params.resolution[0]*Math.cos(t)+this.params.resolution[1]*Math.sin(t)))+"px",this.$refs.frameContainer.style.height=Math.round(this.params.scale_y*Math.abs(this.params.resolution[0]*Math.sin(t)+this.params.resolution[1]*Math.cos(t)))+"px"},onFpsChanged(){},onGrayscaleChanged(){},startAudio(){this.audioOn=!0},async stopAudio(){this.audioOn=!1,await this.request("sound.stop_recording")}},created(){const a=this.$root.config[`camera.${this.cameraPlugin}`]||{};this.attrs={resolution:a.resolution||[640,480],device:a.device,horizontal_flip:a.horizontal_flip||0,vertical_flip:a.vertical_flip||0,rotate:a.rotate||0,scale_x:a.scale_x||1,scale_y:a.scale_y||1,fps:a.fps||16,grayscale:a.grayscale||0,stream_format:a.stream_format||"mjpeg"}},mounted(){this.$refs.frame.addEventListener("load",this.onFrameLoaded),this.onSizeChanged(),this.$watch((()=>this.attrs.resolution),this.onSizeChanged),this.$watch((()=>this.attrs.horizontal_flip),this.onSizeChanged),this.$watch((()=>this.attrs.vertical_flip),this.onSizeChanged),this.$watch((()=>this.attrs.rotate),this.onSizeChanged),this.$watch((()=>this.attrs.scale_x),this.onSizeChanged),this.$watch((()=>this.attrs.scale_y),this.onSizeChanged)}};const ra=ia;var la=ra,oa=e(1794),ca={name:"Camera",components:{Modal:oa.Z},mixins:[la],props:{cameraPlugin:{type:String,required:!0}},computed:{fullURL(){return`${window.location.protocol}//${window.location.host}${this.url}`}},methods:{startStreaming(){this._startStreaming(this.cameraPlugin)},capture(){this._capture(this.cameraPlugin)}}},ua=e(3744);const pa=(0,ua.Z)(ca,[["render",sa]]);var ha=pa},9895:function(a,t,e){e.r(t),e.d(t,{default:function(){return c}});var s=e(6252);function n(a,t,e,n,i,r){const l=(0,s.up)("Camera");return(0,s.wg)(),(0,s.j4)(l,{"camera-plugin":"ir.mlx90640",ref:"camera"},null,512)}var i=e(5528),r={name:"CameraIrMlx90640",components:{Camera:i["default"]},mounted(){const a=this.$root.config[`camera.${this.cameraPlugin}`]||{};a.resolution||(this.$refs.camera.attrs.resolution=[32,24]),a.scale_x||(this.$refs.camera.attrs.scale_x=15),a.scale_y||(this.$refs.camera.attrs.scale_y=15)}},l=e(3744);const o=(0,l.Z)(r,[["render",n]]);var c=o}}]); -//# sourceMappingURL=9895.16e6387b.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/9895.16e6387b.js.map b/platypush/backend/http/webapp/dist/static/js/9895.16e6387b.js.map deleted file mode 100644 index 6a90f75b..00000000 --- a/platypush/backend/http/webapp/dist/static/js/9895.16e6387b.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/9895.16e6387b.js","mappings":"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","sources":["webpack://platypush/./src/components/panels/Camera/Index.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue?be5e","webpack://platypush/./src/components/panels/Camera/Index.vue?8810","webpack://platypush/./src/components/panels/CameraIrMlx90640/Index.vue","webpack://platypush/./src/components/panels/CameraIrMlx90640/Index.vue?0a62"],"sourcesContent":["\n\n\n\n\n","\n","import script from \"./Mixin.vue?vue&type=script&lang=js\"\nexport * from \"./Mixin.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=bfa8f2aa\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=bfa8f2aa&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=5585d4f1\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["class","ref","autoplay","preload","streaming","capturing","captured","src","url","alt","type","stopStreaming","disabled","title","startStreaming","capture","audioOn","stopAudio","startAudio","$refs","paramsModal","show","Date","getTime","length","name","value","fullURL","attrs","device","onDeviceChanged","resolution","onSizeChanged","horizontal_flip","onFlipChanged","vertical_flip","rotate","scale_x","scale_y","fps","onFpsChanged","grayscale","onGrayscaleChanged","mixins","Utils","props","cameraPlugin","String","required","data","computed","params","this","parseInt","parseFloat","methods","getUrl","plugin","action","Object","entries","filter","entry","map","k","v","join","_startStreaming","stream_format","_capture","onFrameLoaded","degToRad","deg","Math","PI","rot","frameContainer","style","width","round","abs","cos","sin","height","async","request","created","config","$root","mounted","frame","addEventListener","$watch","__exports__","components","Modal","window","location","protocol","host","render","Camera","camera"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/9895.a39079d5.js b/platypush/backend/http/webapp/dist/static/js/9895.a39079d5.js new file mode 100644 index 00000000..eb1d13a1 --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/9895.a39079d5.js @@ -0,0 +1,2 @@ +"use strict";(self["webpackChunkplatypush"]=self["webpackChunkplatypush"]||[]).push([[9895,5465],{9021:function(a,t,e){e.r(t),e.d(t,{default:function(){return ha}});var s=e(6252),n=e(9963);const i={class:"camera"},r={class:"camera-container"},l={class:"frame-container",ref:"frameContainer"},o={key:0,class:"no-frame"},c=["src"],u={class:"controls"},p={class:"left"},h=["disabled"],d=(0,s._)("i",{class:"fa fa-play"},null,-1),m=[d],g=["disabled"],_=(0,s._)("i",{class:"fa fa-stop"},null,-1),f=[_],y=["disabled"],C=(0,s._)("i",{class:"fas fa-camera"},null,-1),w=[C],v={class:"right"},b=(0,s._)("i",{class:"fas fa-volume-mute"},null,-1),S=[b],x=(0,s._)("i",{class:"fas fa-volume-up"},null,-1),k=[x],z=(0,s._)("i",{class:"fas fa-cog"},null,-1),$=[z],F={class:"audio-container"},U={key:0,autoplay:"",preload:"none",ref:"player"},D=["src"],M=(0,s.Uk)(" Your browser does not support audio elements "),V={key:0,class:"url"},P={class:"row"},q=(0,s._)("span",{class:"name"},"Stream URL",-1),A=["value"],L={class:"params"},O={class:"row"},j=(0,s._)("span",{class:"name"},"Device",-1),I={class:"row"},G=(0,s._)("span",{class:"name"},"Width",-1),R={class:"row"},T=(0,s._)("span",{class:"name"},"Height",-1),Z={class:"row"},W=(0,s._)("span",{class:"name"},"Horizontal Flip",-1),H={class:"row"},Y=(0,s._)("span",{class:"name"},"Vertical Flip",-1),E={class:"row"},X=(0,s._)("span",{class:"name"},"Rotate",-1),B={class:"row"},J=(0,s._)("span",{class:"name"},"Scale-X",-1),K={class:"row"},N=(0,s._)("span",{class:"name"},"Scale-Y",-1),Q={class:"row"},aa=(0,s._)("span",{class:"name"},"Frames per second",-1),ta={class:"row"},ea=(0,s._)("span",{class:"name"},"Grayscale",-1);function sa(a,t,e,d,_,C){const b=(0,s.up)("Slot"),x=(0,s.up)("Modal");return(0,s.wg)(),(0,s.iD)("div",i,[(0,s._)("div",r,[(0,s._)("div",l,[a.streaming||a.capturing||a.captured?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("div",o,"The camera is not active")),(0,s._)("img",{class:"frame",src:a.url,ref:"frame",alt:""},null,8,c)],512),(0,s._)("div",u,[(0,s._)("div",p,[a.streaming?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[1]||(t[1]=(...t)=>a.stopStreaming&&a.stopStreaming(...t)),disabled:a.capturing,title:"Stop video"},f,8,g)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[0]||(t[0]=(...a)=>C.startStreaming&&C.startStreaming(...a)),disabled:a.capturing,title:"Start video"},m,8,h)),a.streaming?(0,s.kq)("",!0):((0,s.wg)(),(0,s.iD)("button",{key:2,type:"button",onClick:t[2]||(t[2]=(...a)=>C.capture&&C.capture(...a)),disabled:a.streaming||a.capturing,title:"Take a picture"},w,8,y))]),(0,s._)("div",v,[a.audioOn?((0,s.wg)(),(0,s.iD)("button",{key:1,type:"button",onClick:t[4]||(t[4]=(...t)=>a.stopAudio&&a.stopAudio(...t)),title:"Stop audio"},k)):((0,s.wg)(),(0,s.iD)("button",{key:0,type:"button",onClick:t[3]||(t[3]=(...t)=>a.startAudio&&a.startAudio(...t)),title:"Start audio"},S)),(0,s._)("button",{type:"button",onClick:t[5]||(t[5]=t=>a.$refs.paramsModal.show()),title:"Settings"},$)])])]),(0,s._)("div",F,[a.audioOn?((0,s.wg)(),(0,s.iD)("audio",U,[(0,s._)("source",{src:`/sound/stream.aac?t=${(new Date).getTime()}`},null,8,D),M],512)):(0,s.kq)("",!0)]),a.url?.length?((0,s.wg)(),(0,s.iD)("div",V,[(0,s._)("label",P,[q,(0,s._)("input",{name:"url",type:"text",value:C.fullURL,disabled:"disabled"},null,8,A)])])):(0,s.kq)("",!0),(0,s.Wm)(x,{ref:"paramsModal",title:"Camera Parameters"},{default:(0,s.w5)((()=>[(0,s._)("div",L,[(0,s._)("label",O,[j,(0,s.wy)((0,s._)("input",{name:"device",type:"text","onUpdate:modelValue":t[6]||(t[6]=t=>a.attrs.device=t),onChange:t[7]||(t[7]=(...t)=>a.onDeviceChanged&&a.onDeviceChanged(...t))},null,544),[[n.nr,a.attrs.device]])]),(0,s._)("label",I,[G,(0,s.wy)((0,s._)("input",{name:"width",type:"text","onUpdate:modelValue":t[8]||(t[8]=t=>a.attrs.resolution[0]=t),onChange:t[9]||(t[9]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[0]]])]),(0,s._)("label",R,[T,(0,s.wy)((0,s._)("input",{name:"height",type:"text","onUpdate:modelValue":t[10]||(t[10]=t=>a.attrs.resolution[1]=t),onChange:t[11]||(t[11]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.resolution[1]]])]),(0,s._)("label",Z,[W,(0,s.wy)((0,s._)("input",{name:"horizontal_flip",type:"checkbox","onUpdate:modelValue":t[12]||(t[12]=t=>a.attrs.horizontal_flip=t),onChange:t[13]||(t[13]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.horizontal_flip]])]),(0,s._)("label",H,[Y,(0,s.wy)((0,s._)("input",{name:"vertical_flip",type:"checkbox","onUpdate:modelValue":t[14]||(t[14]=t=>a.attrs.vertical_flip=t),onChange:t[15]||(t[15]=(...t)=>a.onFlipChanged&&a.onFlipChanged(...t))},null,544),[[n.e8,a.attrs.vertical_flip]])]),(0,s._)("label",E,[X,(0,s.wy)((0,s._)("input",{name:"rotate",type:"text","onUpdate:modelValue":t[16]||(t[16]=t=>a.attrs.rotate=t),onChange:t[17]||(t[17]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.rotate]])]),(0,s._)("label",B,[J,(0,s.wy)((0,s._)("input",{name:"scale_x",type:"text","onUpdate:modelValue":t[18]||(t[18]=t=>a.attrs.scale_x=t),onChange:t[19]||(t[19]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_x]])]),(0,s._)("label",K,[N,(0,s.wy)((0,s._)("input",{name:"scale_y",type:"text","onUpdate:modelValue":t[20]||(t[20]=t=>a.attrs.scale_y=t),onChange:t[21]||(t[21]=(...t)=>a.onSizeChanged&&a.onSizeChanged(...t))},null,544),[[n.nr,a.attrs.scale_y]])]),(0,s._)("label",Q,[aa,(0,s.wy)((0,s._)("input",{name:"fps",type:"text","onUpdate:modelValue":t[22]||(t[22]=t=>a.attrs.fps=t),onChange:t[23]||(t[23]=(...t)=>a.onFpsChanged&&a.onFpsChanged(...t))},null,544),[[n.nr,a.attrs.fps]])]),(0,s._)("label",ta,[ea,(0,s.wy)((0,s._)("input",{name:"grayscale",type:"checkbox","onUpdate:modelValue":t[24]||(t[24]=t=>a.attrs.grayscale=t),onChange:t[25]||(t[25]=(...t)=>a.onGrayscaleChanged&&a.onGrayscaleChanged(...t))},null,544),[[n.e8,a.attrs.grayscale]])]),(0,s.Wm)(b)])])),_:1},512)])}var na=e(6813),ia={name:"CameraMixin",mixins:[na.Z],props:{cameraPlugin:{type:String,required:!0}},data(){return{streaming:!1,capturing:!1,captured:!1,audioOn:!1,url:null,attrs:{}}},computed:{params(){return{resolution:this.attrs.resolution,device:this.attrs.device?.length?this.attrs.device:null,horizontal_flip:parseInt(0+this.attrs.horizontal_flip),vertical_flip:parseInt(0+this.attrs.vertical_flip),rotate:parseFloat(this.attrs.rotate),scale_x:parseFloat(this.attrs.scale_x),scale_y:parseFloat(this.attrs.scale_y),fps:parseFloat(this.attrs.fps),grayscale:parseInt(0+this.attrs.grayscale)}}},methods:{getUrl(a,t){return"/camera/"+a+"/"+t+"?"+Object.entries(this.params).filter((a=>null!=a[1]&&(""+a[1]).length>0)).map((([a,t])=>a+"="+t)).join("&")},_startStreaming(a){this.streaming||(this.streaming=!0,this.capturing=!1,this.captured=!1,this.url=this.getUrl(a,"video."+this.attrs.stream_format))},stopStreaming(){this.streaming&&(this.streaming=!1,this.capturing=!1,this.url=null)},_capture(a){this.capturing||(this.streaming=!1,this.capturing=!0,this.captured=!0,this.url=this.getUrl(a,"photo.jpg")+"&t="+(new Date).getTime())},onFrameLoaded(){this.capturing&&(this.capturing=!1)},onDeviceChanged(){},onFlipChanged(){},onSizeChanged(){const a=a=>a*Math.PI/180,t=a(this.params.rotate);this.$refs.frameContainer.style.width=Math.round(this.params.scale_x*Math.abs(this.params.resolution[0]*Math.cos(t)+this.params.resolution[1]*Math.sin(t)))+"px",this.$refs.frameContainer.style.height=Math.round(this.params.scale_y*Math.abs(this.params.resolution[0]*Math.sin(t)+this.params.resolution[1]*Math.cos(t)))+"px"},onFpsChanged(){},onGrayscaleChanged(){},startAudio(){this.audioOn=!0},async stopAudio(){this.audioOn=!1,await this.request("sound.stop_recording")}},created(){const a=this.$root.config[`camera.${this.cameraPlugin}`]||{};this.attrs={resolution:a.resolution||[640,480],device:a.device,horizontal_flip:a.horizontal_flip||0,vertical_flip:a.vertical_flip||0,rotate:a.rotate||0,scale_x:a.scale_x||1,scale_y:a.scale_y||1,fps:a.fps||16,grayscale:a.grayscale||0,stream_format:a.stream_format||"mjpeg"}},mounted(){this.$refs.frame.addEventListener("load",this.onFrameLoaded),this.onSizeChanged(),this.$watch((()=>this.attrs.resolution),this.onSizeChanged),this.$watch((()=>this.attrs.horizontal_flip),this.onSizeChanged),this.$watch((()=>this.attrs.vertical_flip),this.onSizeChanged),this.$watch((()=>this.attrs.rotate),this.onSizeChanged),this.$watch((()=>this.attrs.scale_x),this.onSizeChanged),this.$watch((()=>this.attrs.scale_y),this.onSizeChanged)}};const ra=ia;var la=ra,oa=e(1794),ca={name:"Camera",components:{Modal:oa.Z},mixins:[la],props:{cameraPlugin:{type:String,required:!0}},computed:{fullURL(){return`${window.location.protocol}//${window.location.host}${this.url}`}},methods:{startStreaming(){this._startStreaming(this.cameraPlugin)},capture(){this._capture(this.cameraPlugin)}}},ua=e(3744);const pa=(0,ua.Z)(ca,[["render",sa]]);var ha=pa},9895:function(a,t,e){e.r(t),e.d(t,{default:function(){return c}});var s=e(6252);function n(a,t,e,n,i,r){const l=(0,s.up)("Camera");return(0,s.wg)(),(0,s.j4)(l,{"camera-plugin":"ir.mlx90640",ref:"camera"},null,512)}var i=e(9021),r={name:"CameraIrMlx90640",components:{Camera:i["default"]},mounted(){const a=this.$root.config[`camera.${this.cameraPlugin}`]||{};a.resolution||(this.$refs.camera.attrs.resolution=[32,24]),a.scale_x||(this.$refs.camera.attrs.scale_x=15),a.scale_y||(this.$refs.camera.attrs.scale_y=15)}},l=e(3744);const o=(0,l.Z)(r,[["render",n]]);var c=o}}]); +//# sourceMappingURL=9895.a39079d5.js.map \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/9895.a39079d5.js.map b/platypush/backend/http/webapp/dist/static/js/9895.a39079d5.js.map new file mode 100644 index 00000000..c93a8a30 --- /dev/null +++ b/platypush/backend/http/webapp/dist/static/js/9895.a39079d5.js.map @@ -0,0 +1 @@ +{"version":3,"file":"static/js/9895.a39079d5.js","mappings":"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","sources":["webpack://platypush/./src/components/panels/Camera/Index.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue","webpack://platypush/./src/components/panels/Camera/Mixin.vue?be5e","webpack://platypush/./src/components/panels/Camera/Index.vue?8810","webpack://platypush/./src/components/panels/CameraIrMlx90640/Index.vue","webpack://platypush/./src/components/panels/CameraIrMlx90640/Index.vue?0a62"],"sourcesContent":["\n\n\n\n\n","\n","import script from \"./Mixin.vue?vue&type=script&lang=js\"\nexport * from \"./Mixin.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=a4970096\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=a4970096&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n","import { render } from \"./Index.vue?vue&type=template&id=5585d4f1\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["class","ref","autoplay","preload","streaming","capturing","captured","src","url","alt","type","stopStreaming","disabled","title","startStreaming","capture","audioOn","stopAudio","startAudio","$refs","paramsModal","show","Date","getTime","length","name","value","fullURL","attrs","device","onDeviceChanged","resolution","onSizeChanged","horizontal_flip","onFlipChanged","vertical_flip","rotate","scale_x","scale_y","fps","onFpsChanged","grayscale","onGrayscaleChanged","mixins","Utils","props","cameraPlugin","String","required","data","computed","params","this","parseInt","parseFloat","methods","getUrl","plugin","action","Object","entries","filter","entry","map","k","v","join","_startStreaming","stream_format","_capture","onFrameLoaded","degToRad","deg","Math","PI","rot","frameContainer","style","width","round","abs","cos","sin","height","async","request","created","config","$root","mounted","frame","addEventListener","$watch","__exports__","components","Modal","window","location","protocol","host","render","Camera","camera"],"sourceRoot":""} \ No newline at end of file diff --git a/platypush/backend/http/webapp/dist/static/js/app-legacy.523328cf.js b/platypush/backend/http/webapp/dist/static/js/app-legacy.83532d44.js similarity index 98% rename from platypush/backend/http/webapp/dist/static/js/app-legacy.523328cf.js rename to platypush/backend/http/webapp/dist/static/js/app-legacy.83532d44.js index 5d54224f..6a63a149 100644 --- a/platypush/backend/http/webapp/dist/static/js/app-legacy.523328cf.js +++ b/platypush/backend/http/webapp/dist/static/js/app-legacy.83532d44.js @@ -1,2 +1,2 @@ -(function(){var e={5250:function(e,t,n){"use strict";n.d(t,{$:function(){return i}});var s=n(9652),i=(0,s.Z)();i.publishEntity=function(e){i.emit("entity-update",e)},i.onEntity=function(e){i.on("entity-update",e)},i.publishNotification=function(e){i.emit("notification-create",e)},i.onNotification=function(e){i.on("notification-create",e)}},9631:function(e,t,n){"use strict";n(6992),n(8674),n(9601),n(7727);var s=n(9963),i=n(6252),r=(0,i.Uk)(" Would you like to install this application locally? ");function a(e,t,n,s,a,o){var l=(0,i.up)("Events"),c=(0,i.up)("Notifications"),u=(0,i.up)("VoiceAssistant"),d=(0,i.up)("Pushbullet"),f=(0,i.up)("Ntfy"),p=(0,i.up)("ConfirmDialog"),m=(0,i.up)("router-view");return(0,i.wg)(),(0,i.iD)(i.HY,null,[o.hasWebsocket?((0,i.wg)(),(0,i.j4)(l,{key:0,ref:"events"},null,512)):(0,i.kq)("",!0),(0,i.Wm)(c,{ref:"notifications"},null,512),o.hasAssistant?((0,i.wg)(),(0,i.j4)(u,{key:1,ref:"voice-assistant"},null,512)):(0,i.kq)("",!0),o.hasPushbullet?((0,i.wg)(),(0,i.j4)(d,{key:2,ref:"pushbullet"},null,512)):(0,i.kq)("",!0),o.hasNtfy?((0,i.wg)(),(0,i.j4)(f,{key:3,ref:"ntfy"},null,512)):(0,i.kq)("",!0),(0,i.Wm)(p,{ref:"pwaDialog",onInput:o.installPWA},{default:(0,i.w5)((function(){return[r]})),_:1},8,["onInput"]),(0,i.Wm)(m)],64)}var o=n(8534),l=(n(5666),n(6714)),c=(n(9254),{class:"notifications"});function u(e,t,n,s,r,a){var o=(0,i.up)("Notification");return(0,i.wg)(),(0,i.iD)("div",c,[((0,i.wg)(!0),(0,i.iD)(i.HY,null,(0,i.Ko)(e.notifications,(function(e,t,n){return(0,i.wg)(),(0,i.j4)(o,{key:n,id:t,text:e.text,html:e.html,title:e.title,link:e.link,image:e.image,warning:e.warning,error:e.error,onClicked:a.destroy},null,8,["id","text","html","title","link","image","warning","error","onClicked"])})),128))])}n(9653);var d=n(3577),f=["textContent"],p={class:"body"},m={key:0,class:"image col-3"},h={class:"row"},g=["src"],v={key:3,class:"fa fa-exclamation"},b={key:4,class:"fa fa-times"},w=["textContent"],y=["innerHTML"],k=["textContent"],x=["innerHTML"];function _(e,t,n,s,r,a){return(0,i.wg)(),(0,i.iD)("div",{class:(0,d.C_)(["notification fade-in",{warning:n.warning,error:n.error}]),onClick:t[0]||(t[0]=function(){return a.clicked&&a.clicked.apply(a,arguments)})},[n.title?((0,i.wg)(),(0,i.iD)("div",{key:0,class:"title",textContent:(0,d.zw)(n.title)},null,8,f)):(0,i.kq)("",!0),(0,i._)("div",p,[n.image||n.warning||n.error?((0,i.wg)(),(0,i.iD)("div",m,[(0,i._)("div",h,[n.image&&n.image.src?((0,i.wg)(),(0,i.iD)("img",{key:0,src:n.image.src,alt:""},null,8,g)):n.image&&n.image.icon?((0,i.wg)(),(0,i.iD)("i",{key:1,class:(0,d.C_)(["fa","fa-"+n.image.icon]),style:(0,d.j5)(n.image.color?"--color: "+n.image.color:"")},null,6)):n.image&&n.image.iconClass?((0,i.wg)(),(0,i.iD)("i",{key:2,class:(0,d.C_)(n.image.iconClass),style:(0,d.j5)(n.image.color?"--color: "+n.image.color:"")},null,6)):n.warning?((0,i.wg)(),(0,i.iD)("i",v)):n.error?((0,i.wg)(),(0,i.iD)("i",b)):(0,i.kq)("",!0)])])):(0,i.kq)("",!0),n.text&&n.image?((0,i.wg)(),(0,i.iD)("div",{key:1,class:"text col-9",textContent:(0,d.zw)(n.text)},null,8,w)):(0,i.kq)("",!0),n.html&&n.image?((0,i.wg)(),(0,i.iD)("div",{key:2,class:"text col-9",innerHTML:n.html},null,8,y)):(0,i.kq)("",!0),n.text&&!n.image?((0,i.wg)(),(0,i.iD)("div",{key:3,class:"text row horizontal-center",textContent:(0,d.zw)(n.text)},null,8,k)):(0,i.kq)("",!0),n.html&&!n.image?((0,i.wg)(),(0,i.iD)("div",{key:4,class:"text row horizontal-center",innerHTML:n.html},null,8,x)):(0,i.kq)("",!0)])],2)}var C={name:"Notification",props:["id","text","html","title","image","link","error","warning"],methods:{clicked:function(){this.link&&window.open(this.link,"_blank"),this.$emit("clicked",this.id)}}},D=n(3744);const I=(0,D.Z)(C,[["render",_],["__scopeId","data-v-7646705e"]]);var T=I,Z={name:"Notifications",components:{Notification:T},props:{duration:{type:Number,default:1e4}},data:function(){return{index:0,notifications:{},timeouts:{}}},methods:{create:function(e){var t=this.index++;this.notifications[t]=e,null==e.duration&&(e.duration=this.duration);var n=e.duration?parseInt(e.duration):0;n&&(this.timeouts[t]=setTimeout(this.destroy.bind(null,t),n))},destroy:function(e){delete this.notifications[e],delete this.timeouts[e]}}};const S=(0,D.Z)(Z,[["render",u],["__scopeId","data-v-6dc8bebc"]]);var U=S,M=n(6813);function R(e,t,n,s,r,a){return(0,i.wg)(),(0,i.iD)("div")}var N=n(6347),P=n(9584),j=(n(2479),n(2222),n(7941),n(5250)),q={name:"Events",data:function(){return{ws:null,initialized:!1,pending:!1,opened:!1,timeout:null,reconnectMsecs:1e3,minReconnectMsecs:1e3,maxReconnectMsecs:3e4,handlers:{},handlerNameToEventTypes:{}}},methods:{onWebsocketTimeout:function(){console.log("Websocket reconnection timed out, retrying"),this.reconnectMsecs=Math.min(2*this.reconnectMsecs,this.maxReconnectMsecs),this.pending=!1,this.ws&&this.ws.close(),this.onClose()},onMessage:function(e){var t=[];if(e=e.data,"string"===typeof e)try{e=JSON.parse(e)}catch(r){console.warn("Received invalid non-JSON event"),console.warn(e)}if(console.debug(e),"event"===e.type){null in this.handlers&&t.push(this.handlers[null]),e.args.type in this.handlers&&t.push.apply(t,(0,P.Z)(Object.values(this.handlers[e.args.type])));for(var n=0,s=t;nPlatypush
',3),$e={key:0,class:"row"},We=je((function(){return(0,i._)("label",null,[(0,i._)("input",{type:"password",name:"confirm_password",placeholder:"Confirm password"})],-1)})),ze=[We],Le={class:"row buttons"},Ae=["value"],Ve=je((function(){return(0,i._)("div",{class:"row pull-right"},[(0,i._)("label",{class:"checkbox"},[(0,i._)("input",{type:"checkbox",name:"remember"}),(0,i.Uk)("  Keep me logged in on this device   ")])],-1)}));function Fe(e,t,n,s,r,a){return(0,i.wg)(),(0,i.iD)("div",qe,[(0,i._)("form",Oe,[Ee,a._register?((0,i.wg)(),(0,i.iD)("div",$e,ze)):(0,i.kq)("",!0),(0,i._)("div",Le,[(0,i._)("input",{type:"submit",class:"btn btn-primary",value:a._register?"Register":"Login"},null,8,Ae)]),Ve])])}var He={name:"Login",mixins:[M.Z],props:{register:{type:Boolean,required:!1,default:!1}},computed:{_register:function(){return this.parseBoolean(this.register)}}};const Be=(0,D.Z)(He,[["render",Fe],["__scopeId","data-v-af0b14d0"]]);var Ke=Be;function Ye(e,t,n,s,r,a){var o=(0,i.up)("Login");return(0,i.wg)(),(0,i.j4)(o,{register:!0})}var Ge={name:"Register",mixins:[Ke],components:{Login:Ke},props:{register:{type:Boolean,required:!1,default:!0}}};const Je=(0,D.Z)(Ge,[["render",Ye]]);var Xe=Je,Qe={key:2,class:"canvas"},et={class:"panel"},tt={key:3,class:"canvas"};function nt(e,t,n,s,r,a){var o=(0,i.up)("Loading"),l=(0,i.up)("Nav"),c=(0,i.up)("Settings");return(0,i.wg)(),(0,i.iD)("main",null,[r.loading?((0,i.wg)(),(0,i.j4)(o,{key:0})):((0,i.wg)(),(0,i.j4)(l,{key:1,panels:r.components,"selected-panel":r.selectedPanel,hostname:r.hostname,onSelect:t[0]||(t[0]=function(e){return r.selectedPanel=e})},null,8,["panels","selected-panel","hostname"])),"settings"===r.selectedPanel?((0,i.wg)(),(0,i.iD)("div",Qe,[(0,i._)("div",et,[(0,i.Wm)(c)])])):((0,i.wg)(),(0,i.iD)("div",tt,[((0,i.wg)(!0),(0,i.iD)(i.HY,null,(0,i.Ko)(r.components,(function(e,t){return(0,i.wg)(),(0,i.iD)("div",{class:(0,d.C_)(["panel",{hidden:t!==r.selectedPanel}]),key:t},[t===r.selectedPanel?((0,i.wg)(),(0,i.j4)((0,i.LL)(e.component),{key:0,config:e.config,"plugin-name":t},null,8,["config","plugin-name"])):(0,i.kq)("",!0)],2)})),128))]))])}var st=n(6084),it=(n(4723),n(4747),n(9720),n(9600),n(7042),function(e){return(0,i.dD)("data-v-6d8984d5"),e=e(),(0,i.Cn)(),e}),rt=it((function(){return(0,i._)("i",{class:"fas fa-bars"},null,-1)})),at=["textContent"],ot={class:"plugins"},lt=["title","onClick"],ct=["href"],ut={class:"icon"},dt=["src"],ft={key:2,class:"fas fa-puzzle-piece"},pt=["textContent"],mt={class:"footer"},ht={href:"/#settings"},gt=it((function(){return(0,i._)("span",{class:"icon"},[(0,i._)("i",{class:"fa fa-cog"})],-1)})),vt={key:0,class:"name"},bt={href:"/logout"},wt=it((function(){return(0,i._)("span",{class:"icon"},[(0,i._)("i",{class:"fas fa-sign-out-alt"})],-1)})),yt={key:0,class:"name"};function kt(e,t,n,s,r,a){return(0,i.wg)(),(0,i.iD)("nav",{class:(0,d.C_)({collapsed:r.collapsed})},[(0,i._)("div",{class:"toggler",onClick:t[0]||(t[0]=function(e){return r.collapsed=!r.collapsed})},[rt,n.hostname?((0,i.wg)(),(0,i.iD)("span",{key:0,class:"hostname",textContent:(0,d.zw)(n.hostname)},null,8,at)):(0,i.kq)("",!0)]),(0,i._)("ul",ot,[((0,i.wg)(!0),(0,i.iD)(i.HY,null,(0,i.Ko)(a.panelNames,(function(e){var t,s;return(0,i.wg)(),(0,i.iD)("li",{key:e,class:(0,d.C_)(["entry",{selected:e===n.selectedPanel}]),title:e,onClick:function(t){return a.onItemClick(e)}},[(0,i._)("a",{href:"/#".concat(e)},[(0,i._)("span",ut,[null!==(t=r.icons[e])&&void 0!==t&&t.class?((0,i.wg)(),(0,i.iD)("i",{key:0,class:(0,d.C_)(r.icons[e].class)},null,2)):null!==(s=r.icons[e])&&void 0!==s&&s.imgUrl?((0,i.wg)(),(0,i.iD)("img",{key:1,src:r.icons[e].imgUrl,alt:"name"},null,8,dt)):((0,i.wg)(),(0,i.iD)("i",ft))]),r.collapsed?(0,i.kq)("",!0):((0,i.wg)(),(0,i.iD)("span",{key:0,class:"name",textContent:(0,d.zw)("entities"==e?"Home":e)},null,8,pt))],8,ct)],10,lt)})),128))]),(0,i._)("ul",mt,[(0,i._)("li",{class:(0,d.C_)({selected:"settings"===n.selectedPanel}),title:"Settings",onClick:t[1]||(t[1]=function(e){return a.onItemClick("settings")})},[(0,i._)("a",ht,[gt,r.collapsed?(0,i.kq)("",!0):((0,i.wg)(),(0,i.iD)("span",vt,"Settings"))])],2),(0,i._)("li",{title:"Logout",onClick:t[2]||(t[2]=function(e){return a.onItemClick("logout")})},[(0,i._)("a",bt,[wt,r.collapsed?(0,i.kq)("",!0):((0,i.wg)(),(0,i.iD)("span",yt,"Logout"))])])])],2)}n(2707);var xt=n(1359),_t={name:"Nav",emits:["select"],mixins:[M.Z],props:{panels:{type:Object,required:!0},selectedPanel:{type:String},hostname:{type:String}},computed:{panelNames:function(){var e=Object.keys(this.panels),t=e.indexOf("entities");return t>=0?["entities"].concat(e.slice(0,t).concat(e.slice(t+1)).sort()):e.sort()},collapsedDefault:function(){return!(!this.isMobile()&&!this.isTablet())}},methods:{onItemClick:function(e){this.$emit("select",e),this.collapsed=!!this.isMobile()||this.collapsedDefault}},data:function(){return{collapsed:!0,icons:xt,host:null}},mounted:function(){this.collapsed=this.collapsedDefault}};const Ct=(0,D.Z)(_t,[["render",kt],["__scopeId","data-v-6d8984d5"]]);var Dt=Ct,It=n(2715),Tt={name:"Panel",mixins:[M.Z],components:{Settings:It["default"],Nav:Dt,Loading:we.Z},data:function(){return{loading:!1,plugins:{},backends:{},procedures:{},components:{},hostname:void 0,selectedPanel:void 0}},methods:{initSelectedPanel:function(){var e=this.$route.hash.match("#?([a-zA-Z0-9.]+)[?]?(.*)"),t=e?e[1]:"entities";null!==t&&void 0!==t&&t.length&&(this.selectedPanel=t)},initPanels:function(){var e=this;this.components={},Object.entries(this.plugins).forEach(function(){var t=(0,o.Z)(regeneratorRuntime.mark((function t(s){var r,a,l,c,u,d;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return r=(0,st.Z)(s,2),a=r[0],l=r[1],c=a.split(".").map((function(e){return e[0].toUpperCase()+e.slice(1)})).join(""),u=null,t.prev=3,t.next=6,n(3379)("./".concat(c,"/Index"));case 6:u=t.sent,t.next=12;break;case 9:return t.prev=9,t.t0=t["catch"](3),t.abrupt("return");case 12:d=(0,be.XI)((0,i.RC)((0,o.Z)(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.abrupt("return",u);case 1:case"end":return e.stop()}}),e)}))))),e.$options.components[a]=d,e.components[a]={component:d,pluginName:a,config:l};case 15:case"end":return t.stop()}}),t,null,[[3,9]])})));return function(e){return t.apply(this,arguments)}}())},parseConfig:function(){var e=this;return(0,o.Z)(regeneratorRuntime.mark((function t(){var n,s;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.next=2,Promise.all([e.request("config.get_plugins"),e.request("config.get_backends"),e.request("config.get_procedures"),e.request("config.get_device_id")]);case 2:n=t.sent,s=(0,st.Z)(n,4),e.plugins=s[0],e.backends=s[1],e.procedures=s[2],e.hostname=s[3],e.initializeDefaultViews();case 9:case"end":return t.stop()}}),t)})))()},initializeDefaultViews:function(){this.plugins.execute={},this.plugins.entities={}}},mounted:function(){var e=this;return(0,o.Z)(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return e.loading=!0,t.prev=1,t.next=4,e.parseConfig();case 4:e.initPanels(),e.initSelectedPanel();case 6:return t.prev=6,e.loading=!1,t.finish(6);case 9:case"end":return t.stop()}}),t,null,[[1,,6,9]])})))()}};const Zt=(0,D.Z)(Tt,[["render",nt],["__scopeId","data-v-fbc09254"]]);var St=Zt,Ut={key:1,class:"canvas"};function Mt(e,t,n,s,r,a){var o=(0,i.up)("Loading");return(0,i.wg)(),(0,i.iD)("main",null,[r.loading?((0,i.wg)(),(0,i.j4)(o,{key:0})):((0,i.wg)(),(0,i.iD)("div",Ut,[((0,i.wg)(),(0,i.j4)((0,i.LL)(r.component),{config:r.config,"plugin-name":a.pluginName},null,8,["config","plugin-name"]))]))])}n(9714);var Rt={name:"Panel",mixins:[M.Z],components:{Settings:It["default"],Nav:Dt,Loading:we.Z},data:function(){return{loading:!1,config:{},plugins:{},backends:{},procedures:{},component:void 0,hostname:void 0,selectedPanel:void 0}},computed:{pluginName:function(){return this.$route.params.plugin}},methods:{initPanel:function(){var e=this;return(0,o.Z)(regeneratorRuntime.mark((function t(){var s,r;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return s=e.pluginName.split(".").map((function(e){return e[0].toUpperCase()+e.slice(1)})).join(""),r=null,t.prev=2,t.next=5,n(3379)("./".concat(s,"/Index"));case 5:r=t.sent,t.next=13;break;case 8:return t.prev=8,t.t0=t["catch"](2),console.error(t.t0),e.notify({error:!0,title:"Cannot load plugin ".concat(e.pluginName),text:t.t0.toString()}),t.abrupt("return");case 13:e.component=(0,be.XI)((0,i.RC)((0,o.Z)(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.abrupt("return",r);case 1:case"end":return e.stop()}}),e)}))))),e.$options.components[s]=e.component;case 15:case"end":return t.stop()}}),t,null,[[2,8]])})))()},initConfig:function(){var e=this;return(0,o.Z)(regeneratorRuntime.mark((function t(){var n;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.next=2,e.request("config.get");case 2:return n=t.sent,e.config=n[e.pluginName]||{},t.next=6,e.request("config.get_device_id");case 6:e.hostname=t.sent;case 7:case"end":return t.stop()}}),t)})))()}},mounted:function(){var e=this;return(0,o.Z)(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return e.loading=!0,t.prev=1,t.next=4,e.initConfig();case 4:return t.next=6,e.initPanel();case 6:return t.prev=6,e.loading=!1,t.finish(6);case 9:case"end":return t.stop()}}),t,null,[[1,,6,9]])})))()}};const Nt=(0,D.Z)(Rt,[["render",Mt],["__scopeId","data-v-e339182c"]]);var Pt=Nt,jt=[{path:"/",name:"Panel",component:St},{path:"/dashboard/:name",name:"Dashboard",component:Ue},{path:"/plugin/:plugin",name:"Plugin",component:Pt},{path:"/login",name:"Login",component:Ke},{path:"/register",name:"Register",component:Xe},{path:"/:catchAll(.*)",component:Pe}],qt=(0,he.p7)({history:(0,he.PO)(),routes:jt}),Ot=qt,Et=n(5205);(0,Et.z)("".concat("/","service-worker.js"),{ready:function(){console.log("App is being served from cache by a service worker.\nFor more details, visit https://goo.gl/AFskqB")},registered:function(){console.log("Service worker has been registered.")},cached:function(){console.log("Content has been cached for offline use.")},updatefound:function(){console.log("New content is downloading.")},updated:function(){console.log("New content is available; please refresh.")},offline:function(){console.log("No internet connection found. App is running in offline mode.")},error:function(e){console.error("Error during service worker registration:",e)}});var $t=(0,s.ri)(me);$t.config.globalProperties._config=window.config,$t.use(Ot).mount("#app")},6813:function(e,t,n){"use strict";n.d(t,{Z:function(){return j}});n(1539);var s=n(9669),i=n.n(s),r={name:"Api",methods:{execute:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:6e4,s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r={};return"target"in e&&e["target"]||(e["target"]="localhost"),"type"in e&&e["type"]||(e["type"]="request"),n&&(r.timeout=n),new Promise((function(n,a){i().post("/execute",e,r).then((function(e){var s;if(e=e.data.response,null!==(s=e.errors)&&void 0!==s&&s.length){var i,r=(null===(i=e.errors)||void 0===i?void 0:i[0])||e;t.notify({text:r,error:!0}),a(r)}else n(e.output)})).catch((function(e){var n,i,r,o;412===(null===e||void 0===e||null===(n=e.response)||void 0===n||null===(i=n.data)||void 0===i?void 0:i.code)&&window.location.href.indexOf("/register")<0?window.location.href="/register?redirect="+window.location.href:401===(null===e||void 0===e||null===(r=e.response)||void 0===r||null===(o=r.data)||void 0===o?void 0:o.code)&&window.location.href.indexOf("/login")<0?window.location.href="/login?redirect="+window.location.href:(console.log(e),s&&t.notify({text:e,error:!0}),a(e))}))}))},request:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:6e4,s=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];return this.execute({type:"request",action:e,args:t},n,s)}}};const a=r;var o=a,l=n(6084),c=(n(4916),n(3123),{name:"Cookies",methods:{getCookies:function(){return document.cookie.split(/;\s*/).reduce((function(e,t){var n=t.split("="),s=(0,l.Z)(n,2),i=s[0],r=s[1];return e[i]=r,e}),{})}}});const u=c;var d=u,f=(n(2222),{name:"DateTime",methods:{formatDate:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return"string"===typeof e&&(e=new Date(Date.parse(e))),e.toDateString().substring(0,t?15:10)},formatTime:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return"string"===typeof e&&(e=new Date(Date.parse(e))),e.toTimeString().substring(0,t?8:5)},formatDateTime:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];return"string"===typeof e&&(e=new Date(Date.parse(e))),"".concat(this.formatDate(e,t),", ").concat(this.formatTime(e,n))}}});const p=f;var m=p,h=n(9584),g=(n(7714),n(2801),n(1174),n(1249),n(3948),n(5250)),v={name:"Events",computed:{_eventsReady:function(){var e;return null===(e=this.$root.$refs.events)||void 0===e?void 0:e.initialized}},methods:{subscribe:function(e,t){for(var n=this,s=arguments.length,i=new Array(s>2?s-2:0),r=2;r1024&&(i===n.length-1?t=s:e/=1024)})),"".concat(e.toFixed(2)," ").concat(t)},convertTime:function(e){var t={},n=[];if(e=parseFloat(e),t.d=Math.round(e/86400),t.h=Math.round(e/3600-24*t.d),t.m=Math.round(e/60-(24*t.d+60*t.h)),t.s=Math.round(e-(24*t.d+3600*t.h+60*t.m),1),parseInt(t.d)){var s=t.d+" day";t.d>1&&(s+="s"),n.push(s)}if(parseInt(t.h)){var i=t.h+" hour";t.h>1&&(i+="s"),n.push(i)}if(parseInt(t.m)){var r=t.m+" minute";t.m>1&&(r+="s"),n.push(r)}var a=t.s+" second";return t.s>1&&(a+="s"),n.push(a),n.join(" ")},objectsEqual:function(e,t){var n;if("object"!==(0,S.Z)(e)||"object"!==(0,S.Z)(t))return!1;if(null==e||null==t)return null==e&&null==t;for(var s=0,i=Object.keys(e||{});st?(t=r,n=[i]):r===t&&n.push(i)}}catch(o){s.e(o)}finally{s.f()}(n.indexOf(this.$el)<0||n.length>1)&&(this.$el.style.zIndex=t+1)}if(this.isVisible&&this.timeout&&!this.timeoutId){var a=function(e){return function(){e.close(),e.timeoutId=void 0}};this.timeoutId=setTimeout(a(this),0+this.timeout)}}}),h=n(3744);const g=(0,h.Z)(m,[["render",f],["__scopeId","data-v-18f9fdba"]]);var v=g},6714:function(e,t,n){"use strict";n.d(t,{Z:function(){return h}});var s=n(6252),i=n(9963),r=n(3577),a=function(e){return(0,s.dD)("data-v-dda41b94"),e=e(),(0,s.Cn)(),e},o={class:"dialog-content"},l=a((function(){return(0,s._)("i",{class:"fas fa-check"},null,-1)})),c=a((function(){return(0,s._)("i",{class:"fas fa-xmark"},null,-1)}));function u(e,t,n,a,u,d){var f=(0,s.up)("Modal");return(0,s.wg)(),(0,s.j4)(f,{ref:"modal",title:n.title},{default:(0,s.w5)((function(){return[(0,s._)("div",o,[(0,s.WI)(e.$slots,"default",{},void 0,!0)]),(0,s._)("form",{class:"buttons",onSubmit:t[4]||(t[4]=(0,i.iM)((function(){return d.onConfirm&&d.onConfirm.apply(d,arguments)}),["prevent"]))},[(0,s._)("button",{type:"submit",class:"ok-btn",onClick:t[0]||(t[0]=function(){return d.onConfirm&&d.onConfirm.apply(d,arguments)}),onTouch:t[1]||(t[1]=function(){return d.onConfirm&&d.onConfirm.apply(d,arguments)})},[l,(0,s.Uk)("   "+(0,r.zw)(n.confirmText),1)],32),(0,s._)("button",{type:"button",class:"cancel-btn",onClick:t[2]||(t[2]=function(){return d.close&&d.close.apply(d,arguments)}),onTouch:t[3]||(t[3]=function(){return d.close&&d.close.apply(d,arguments)})},[c,(0,s.Uk)("   "+(0,r.zw)(n.cancelText),1)],32)],32)]})),_:3},8,["title"])}var d=n(1794),f={emits:["input","click","touch"],components:{Modal:d.Z},props:{title:{type:String},confirmText:{type:String,default:"OK"},cancelText:{type:String,default:"Cancel"}},methods:{onConfirm:function(){this.$emit("input"),this.close()},show:function(){this.$refs.modal.show()},close:function(){this.$refs.modal.hide()}}},p=n(3744);const m=(0,p.Z)(f,[["render",u],["__scopeId","data-v-dda41b94"]]);var h=m},2856:function(e,t,n){"use strict";n.d(t,{Z:function(){return m}});var s=n(6252),i=n(9963),r=n(3577),a={class:"dropdown-container",ref:"container"},o=["title"],l=["textContent"],c=["id"];function u(e,t,n,u,d,f){return(0,s.wg)(),(0,s.iD)("div",a,[(0,s._)("button",{title:n.title,ref:"button",onClick:t[0]||(t[0]=(0,i.iM)((function(e){return f.toggle(e)}),["stop"]))},[n.iconClass?((0,s.wg)(),(0,s.iD)("i",{key:0,class:(0,r.C_)(["icon",n.iconClass])},null,2)):(0,s.kq)("",!0),n.text?((0,s.wg)(),(0,s.iD)("span",{key:1,class:"text",textContent:(0,r.zw)(n.text)},null,8,l)):(0,s.kq)("",!0)],8,o),(0,s._)("div",{class:(0,r.C_)(["dropdown fade-in",{hidden:!d.visible}]),id:n.id,ref:"dropdown"},[(0,s.WI)(e.$slots,"default",{},void 0,!0)],10,c)],512)}var d={name:"Dropdown",emits:["click"],props:{id:{type:String},items:{type:Array,default:function(){return[]}},iconClass:{default:"fa fa-ellipsis-h"},text:{type:String},title:{type:String},keepOpenOnItemClick:{type:Boolean,default:!1}},data:function(){return{visible:!1}},methods:{documentClickHndl:function(e){if(this.visible){var t=e.target;while(t){if(!this.$refs.dropdown)break;if(t===this.$refs.dropdown.element)return;t=t.parentElement}this.close()}},close:function(){this.visible=!1,document.removeEventListener("click",this.documentClickHndl)},open:function(){var e=this;document.addEventListener("click",this.documentClickHndl),this.visible=!0,setTimeout((function(){var t=e.$refs.dropdown;t.style.left=0,t.style.top=parseFloat(getComputedStyle(e.$refs.button).height)+"px",t.getBoundingClientRect().left>window.innerWidth/2&&(t.style.left=-t.clientWidth+parseFloat(getComputedStyle(e.$refs.button).width)+"px"),t.getBoundingClientRect().top>window.innerHeight/2&&(t.style.top=-t.clientHeight+parseFloat(getComputedStyle(e.$refs.button).height)+"px")}),10)},toggle:function(e){e.stopPropagation(),this.$emit("click"),this.visible?this.close():this.open()},onKeyUp:function(e){e.stopPropagation(),"Escape"===e.key&&this.close()}},mounted:function(){document.body.addEventListener("keyup",this.onKeyUp)},unmounted:function(){document.body.removeEventListener("keyup",this.onKeyUp)}},f=n(3744);const p=(0,f.Z)(d,[["render",u],["__scopeId","data-v-5b964c03"]]);var m=p},2588:function(e,t,n){"use strict";n.d(t,{Z:function(){return f}});var s=n(6252),i=n(3577),r={key:0,class:"col-2 icon"},a=["textContent"];function o(e,t,n,o,l,c){var u,d,f=(0,s.up)("Icon");return(0,s.wg)(),(0,s.iD)("div",{class:(0,i.C_)(["row item",n.itemClass]),onClick:t[0]||(t[0]=function(){return c.clicked&&c.clicked.apply(c,arguments)})},[null!==(u=n.iconClass)&&void 0!==u&&u.length||null!==(d=n.iconUrl)&&void 0!==d&&d.length?((0,s.wg)(),(0,s.iD)("div",r,[(0,s.Wm)(f,{class:(0,i.C_)(n.iconClass),url:n.iconUrl},null,8,["class","url"])])):(0,s.kq)("",!0),(0,s._)("div",{class:(0,i.C_)(["text",{"col-10":null!=n.iconClass}]),textContent:(0,i.zw)(n.text)},null,10,a)],2)}var l=n(1478),c={name:"DropdownItem",components:{Icon:l.Z},props:{iconClass:{type:String},iconUrl:{type:String},text:{type:String},disabled:{type:Boolean,default:!1},itemClass:{}},methods:{clicked:function(e){if(this.disabled)return!1;this.$parent.$emit("click",e),this.$parent.keepOpenOnItemClick||(this.$parent.visible=!1)}}},u=n(3744);const d=(0,u.Z)(c,[["render",o],["__scopeId","data-v-282d16b4"]]);var f=d},1478:function(e,t,n){"use strict";n.d(t,{Z:function(){return d}});var s=n(6252),i=n(3577),r={class:"icon-container"},a=["src","alt"];function o(e,t,n,o,l,c){var u,d;return(0,s.wg)(),(0,s.iD)("div",r,[null!==(u=n.url)&&void 0!==u&&u.length?((0,s.wg)(),(0,s.iD)("img",{key:0,class:"icon",src:n.url,alt:n.alt},null,8,a)):null!==(d=c.className)&&void 0!==d&&d.length?((0,s.wg)(),(0,s.iD)("i",{key:1,class:(0,i.C_)(["icon",c.className]),style:(0,i.j5)({color:n.color})},null,6)):(0,s.kq)("",!0)])}var l={props:{class:{type:String},url:{type:String},color:{type:String,default:""},alt:{type:String,default:""}},computed:{className:function(){return this.class}}},c=n(3744);const u=(0,c.Z)(l,[["render",o],["__scopeId","data-v-706a3bd1"]]);var d=u},2715:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return Ce}});var s=n(6252),i={class:"settings-container"},r={class:"col-8"},a={class:"col-4 pull-right"},o=(0,s._)("i",{class:"fa fa-plus"},null,-1),l=[o];function c(e,t,n,o,c,u){var d=(0,s.up)("DropdownItem"),f=(0,s.up)("Dropdown"),p=(0,s.up)("Users"),m=(0,s.up)("Token");return(0,s.wg)(),(0,s.iD)("div",i,[(0,s._)("header",null,[(0,s._)("div",r,[(0,s.Wm)(f,{title:"Select a category","icon-class":"fa fa-ellipsis-h"},{default:(0,s.w5)((function(){return[(0,s.Wm)(d,{text:"Users","icon-class":"fa fa-user","item-class":{selected:"users"===c.selectedView},onClick:t[0]||(t[0]=function(e){return c.selectedView="users"})},null,8,["item-class"]),(0,s.Wm)(d,{text:"Generate a token","icon-class":"fa fa-key","item-class":{selected:"token"===c.selectedView},onClick:t[1]||(t[1]=function(e){return c.selectedView="token"})},null,8,["item-class"])]})),_:1})]),(0,s._)("div",a,["users"===c.selectedView?((0,s.wg)(),(0,s.iD)("button",{key:0,title:"Add User",onClick:t[2]||(t[2]=function(t){return e.$refs.usersView.$refs.addUserModal.show()})},l)):(0,s.kq)("",!0)])]),(0,s._)("main",null,["users"===c.selectedView?((0,s.wg)(),(0,s.j4)(p,{key:0,"session-token":c.sessionToken,"current-user":c.currentUser,ref:"usersView"},null,8,["session-token","current-user"])):"token"===c.selectedView?((0,s.wg)(),(0,s.j4)(m,{key:1,"session-token":c.sessionToken,"current-user":c.currentUser,ref:"tokenView"},null,8,["session-token","current-user"])):(0,s.kq)("",!0)])])}var u=n(8534),d=(n(5666),n(2856)),f=n(2588),p=n(3577),m=n(9963),h={class:"token-container"},g={class:"token-container"},v=(0,s.Uk)(" This is your generated token. Treat it carefully and do not share it with untrusted parties."),b=(0,s._)("br",null,null,-1),w=(0,s.Uk)(" Also, make sure to save it - it WILL NOT be displayed again. "),y=["textContent"],k={class:"body"},x={class:"description"},_=(0,s.Uk)("Generate a JWT authentication token that can be used for API calls to the "),C=(0,s.Uk)("/execute"),D=(0,s.Uk)(" endpoint."),I=(0,s._)("br",null,null,-1),T=(0,s._)("p",null,"You can include the token in your requests in any of the following ways:",-1),Z=(0,s.Uk)("Specify it on the "),S=(0,s.Uk)("Authorization: Bearer"),U=(0,s.Uk)(" header;"),M=(0,s.Uk)("Specify it on the "),R=(0,s.Uk)("X-Token"),N=(0,s.Uk)(" header;"),P=(0,s.Uk)("Specify it as a URL parameter: "),j=(0,s.Uk)("http://site:8008/execute?token=..."),q=(0,s.Uk)(";"),O=(0,s.Uk)("Specify it on the body of your JSON request: "),E=(0,s.Uk)('{"type":"request", "action", "...", "token":"..."}'),$=(0,s.Uk)("."),W=(0,s.Uk)(" Confirm your credentials in order to generate a new token. "),z={class:"form-container"},L=(0,s._)("span",null,"Username",-1),A=["value"],V=(0,s._)("label",null,[(0,s._)("span",null,"Confirm password"),(0,s._)("span",null,[(0,s._)("input",{type:"password",name:"password"})])],-1),F=(0,s._)("label",null,[(0,s._)("span",null,"Token validity in days"),(0,s._)("span",null,[(0,s._)("input",{type:"text",name:"validityDays"})]),(0,s._)("span",{class:"note"},[(0,s.Uk)(" Decimal values are also supported (e.g. "),(0,s._)("i",null,"0.5"),(0,s.Uk)(" to identify 6 hours). An empty or zero value means that the token has no expiry date. ")])],-1),H=(0,s._)("label",null,[(0,s._)("input",{type:"submit",class:"btn btn-primary",value:"Generate token"})],-1);function B(e,t,n,i,r,a){var o=(0,s.up)("Loading"),l=(0,s.up)("Modal"),c=(0,s.up)("tt");return(0,s.wg)(),(0,s.iD)("div",h,[r.loading?((0,s.wg)(),(0,s.j4)(o,{key:0})):(0,s.kq)("",!0),(0,s.Wm)(l,{ref:"tokenModal"},{default:(0,s.w5)((function(){return[(0,s._)("div",g,[(0,s._)("label",null,[v,b,w,(0,s._)("textarea",{class:"token",textContent:(0,p.zw)(r.token),onFocus:t[0]||(t[0]=function(){return a.onTokenSelect&&a.onTokenSelect.apply(a,arguments)})},null,40,y)])])]})),_:1},512),(0,s._)("div",k,[(0,s._)("div",x,[(0,s._)("p",null,[_,(0,s.Wm)(c,null,{default:(0,s.w5)((function(){return[C]})),_:1}),D]),I,T,(0,s._)("ul",null,[(0,s._)("li",null,[Z,(0,s.Wm)(c,null,{default:(0,s.w5)((function(){return[S]})),_:1}),U]),(0,s._)("li",null,[M,(0,s.Wm)(c,null,{default:(0,s.w5)((function(){return[R]})),_:1}),N]),(0,s._)("li",null,[P,(0,s.Wm)(c,null,{default:(0,s.w5)((function(){return[j]})),_:1}),q]),(0,s._)("li",null,[O,(0,s.Wm)(c,null,{default:(0,s.w5)((function(){return[E]})),_:1}),$])]),W]),(0,s._)("div",z,[(0,s._)("form",{onSubmit:t[1]||(t[1]=(0,m.iM)((function(){return a.generateToken&&a.generateToken.apply(a,arguments)}),["prevent"])),ref:"generateTokenForm"},[(0,s._)("label",null,[L,(0,s._)("span",null,[(0,s._)("input",{type:"text",name:"username",value:n.currentUser.username,disabled:""},null,8,A)])]),V,F,H],544)])])])}n(1539),n(9714);var K=n(9669),Y=n.n(K),G=n(1232),J=n(6813),X=n(1794),Q={name:"Token",components:{Modal:X.Z,Loading:G.Z},mixins:[J.Z],props:{currentUser:{type:Object,required:!0}},data:function(){return{loading:!1,token:null}},methods:{generateToken:function(e){var t=this;return(0,u.Z)(regeneratorRuntime.mark((function n(){var s,i,r,a,o;return regeneratorRuntime.wrap((function(n){while(1)switch(n.prev=n.next){case 0:return i=t.currentUser.username,r=e.target.password.value,a=null!==(s=e.target.validityDays)&&void 0!==s&&s.length?parseInt(e.target.validityDays.value):0,a||(a=null),t.loading=!0,n.prev=5,n.next=8,Y().post("/auth",{username:i,password:r,expiry_days:a});case 8:t.token=n.sent.data.token,null!==(o=t.token)&&void 0!==o&&o.length&&t.$refs.tokenModal.show(),n.next=16;break;case 12:n.prev=12,n.t0=n["catch"](5),console.error(n.t0.toString()),t.notify({text:n.t0.toString(),error:!0});case 16:return n.prev=16,t.loading=!1,n.finish(16);case 19:case"end":return n.stop()}}),n,null,[[5,12,16,19]])})))()},onTokenSelect:function(e){e.target.select(),document.execCommand("copy"),this.notify({text:"Token copied to clipboard",image:{iconClass:"fa fa-check"}})}}},ee=n(3744);const te=(0,ee.Z)(Q,[["render",B]]);var ne=te,se=["disabled"],ie=["disabled"],re=["disabled"],ae=["disabled"],oe=["value"],le=["disabled"],ce=["disabled"],ue=["disabled"],de=["disabled"],fe={class:"body"},pe={class:"users-list"},me=["onClick"],he=["textContent"],ge={class:"actions pull-right col-4"};function ve(e,t,n,i,r,a){var o=(0,s.up)("Loading"),l=(0,s.up)("Modal"),c=(0,s.up)("DropdownItem"),u=(0,s.up)("Dropdown");return(0,s.wg)(),(0,s.iD)(s.HY,null,[r.loading?((0,s.wg)(),(0,s.j4)(o,{key:0})):(0,s.kq)("",!0),(0,s.Wm)(l,{ref:"addUserModal",title:"Add User"},{default:(0,s.w5)((function(){return[(0,s._)("form",{action:"#",method:"POST",ref:"addUserForm",onSubmit:t[0]||(t[0]=function(){return a.createUser&&a.createUser.apply(a,arguments)})},[(0,s._)("label",null,[(0,s._)("input",{type:"text",name:"username",placeholder:"Username",disabled:r.commandRunning},null,8,se)]),(0,s._)("label",null,[(0,s._)("input",{type:"password",name:"password",placeholder:"Password",disabled:r.commandRunning},null,8,ie)]),(0,s._)("label",null,[(0,s._)("input",{type:"password",name:"confirm_password",placeholder:"Confirm password",disabled:r.commandRunning},null,8,re)]),(0,s._)("label",null,[(0,s._)("input",{type:"submit",class:"btn btn-primary",value:"Create User",disabled:r.commandRunning},null,8,ae)])],544)]})),_:1},512),(0,s.Wm)(l,{ref:"changePasswordModal",title:"Change Password"},{default:(0,s.w5)((function(){return[(0,s._)("form",{action:"#",method:"POST",ref:"changePasswordForm",onSubmit:t[1]||(t[1]=function(){return a.changePassword&&a.changePassword.apply(a,arguments)})},[(0,s._)("label",null,[(0,s._)("input",{type:"text",name:"username",placeholder:"Username",value:r.selectedUser,disabled:"disabled"},null,8,oe)]),(0,s._)("label",null,[(0,s._)("input",{type:"password",name:"password",placeholder:"Current password",disabled:r.commandRunning},null,8,le)]),(0,s._)("label",null,[(0,s._)("input",{type:"password",name:"new_password",placeholder:"New password",disabled:r.commandRunning},null,8,ce)]),(0,s._)("label",null,[(0,s._)("input",{type:"password",name:"confirm_new_password",placeholder:"Confirm new password",disabled:r.commandRunning},null,8,ue)]),(0,s._)("label",null,[(0,s._)("input",{type:"submit",class:"btn btn-primary",value:"Change Password",disabled:r.commandRunning},null,8,de)])],544)]})),_:1},512),(0,s._)("div",fe,[(0,s._)("ul",pe,[((0,s.wg)(!0),(0,s.iD)(s.HY,null,(0,s.Ko)(r.users,(function(t){return(0,s.wg)(),(0,s.iD)("li",{key:t.user_id,class:"item user",onClick:function(e){return r.selectedUser=t.username}},[(0,s._)("div",{class:"name col-8",textContent:(0,p.zw)(t.username)},null,8,he),(0,s._)("div",ge,[(0,s.Wm)(u,{title:"User Actions","icon-class":"fa fa-cog"},{default:(0,s.w5)((function(){return[(0,s.Wm)(c,{text:"Change Password",disabled:r.commandRunning,"icon-class":"fa fa-key",onClick:function(n){r.selectedUser=t.username,e.$refs.changePasswordModal.show()}},null,8,["disabled","onClick"]),(0,s.Wm)(c,{text:"Delete User",disabled:r.commandRunning,"icon-class":"fa fa-trash",onClick:function(e){return a.deleteUser(t)}},null,8,["disabled","onClick"])]})),_:2},1024)])],8,me)})),128))])])],64)}var be=n(9584),we=(n(8309),{name:"Users",components:{DropdownItem:f.Z,Loading:G.Z,Modal:X.Z,Dropdown:d.Z},mixins:[J.Z],props:{sessionToken:{type:String,required:!0},currentUser:{type:Object,required:!0}},data:function(){return{users:[],commandRunning:!1,loading:!1,selectedUser:null}},methods:{refresh:function(){var e=this;return(0,u.Z)(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return e.loading=!0,t.prev=1,t.next=4,e.request("user.get_users");case 4:e.users=t.sent;case 5:return t.prev=5,e.loading=!1,t.finish(5);case 8:case"end":return t.stop()}}),t,null,[[1,,5,8]])})))()},createUser:function(e){var t=this;return(0,u.Z)(regeneratorRuntime.mark((function n(){var s;return regeneratorRuntime.wrap((function(n){while(1)switch(n.prev=n.next){case 0:if(e.preventDefault(),s=(0,be.Z)(t.$refs.addUserForm.querySelectorAll("input[name]")).reduce((function(e,t){return e[t.name]=t.value,e}),{}),s.password===s.confirm_password){n.next=5;break}return t.notify({title:"Unable to create user",text:"Please check that the passwords match",error:!0,image:{iconClass:"fas fa-times"}}),n.abrupt("return");case 5:return t.commandRunning=!0,n.prev=6,n.next=9,t.request("user.create_user",{username:s.username,password:s.password,session_token:t.sessionToken});case 9:return n.prev=9,t.commandRunning=!1,n.finish(9);case 12:return t.notify({text:"User "+s.username+" created",image:{iconClass:"fas fa-check"}}),t.$refs.addUserModal.close(),n.next=16,t.refresh();case 16:case"end":return n.stop()}}),n,null,[[6,,9,12]])})))()},changePassword:function(e){var t=this;return(0,u.Z)(regeneratorRuntime.mark((function n(){var s,i;return regeneratorRuntime.wrap((function(n){while(1)switch(n.prev=n.next){case 0:if(e.preventDefault(),s=(0,be.Z)(t.$refs.changePasswordForm.querySelectorAll("input[name]")).reduce((function(e,t){return e[t.name]=t.value,e}),{}),s.new_password===s.confirm_new_password){n.next=5;break}return t.notify({title:"Unable to update password",text:"Please check that the passwords match",error:!0,image:{iconClass:"fas fa-times"}}),n.abrupt("return");case 5:return t.commandRunning=!0,i=!1,n.prev=7,n.next=10,t.request("user.update_password",{username:s.username,old_password:s.password,new_password:s.new_password});case 10:i=n.sent;case 11:return n.prev=11,t.commandRunning=!1,n.finish(11);case 14:i?(t.$refs.changePasswordModal.close(),t.notify({text:"Password successfully updated",image:{iconClass:"fas fa-check"}})):t.notify({title:"Unable to update password",text:"The current password is incorrect",error:!0,image:{iconClass:"fas fa-times"}});case 15:case"end":return n.stop()}}),n,null,[[7,,11,14]])})))()},deleteUser:function(e){var t=this;return(0,u.Z)(regeneratorRuntime.mark((function n(){return regeneratorRuntime.wrap((function(n){while(1)switch(n.prev=n.next){case 0:if(confirm("Are you sure that you want to remove the user "+e.username+"?")){n.next=2;break}return n.abrupt("return");case 2:return t.commandRunning=!0,n.prev=3,n.next=6,t.request("user.delete_user",{username:e.username,session_token:t.sessionToken});case 6:return n.prev=6,t.commandRunning=!1,n.finish(6);case 9:return t.notify({text:"User "+e.username+" removed",image:{iconClass:"fas fa-check"}}),n.next=12,t.refresh();case 12:case"end":return n.stop()}}),n,null,[[3,,6,9]])})))()}},mounted:function(){this.refresh()}});const ye=(0,ee.Z)(we,[["render",ve]]);var ke=ye,xe={name:"Settings",components:{Dropdown:d.Z,DropdownItem:f.Z,Users:ke,Token:ne},mixins:[J.Z],data:function(){return{selectedView:"users",currentUser:null,sessionToken:null}},methods:{refresh:function(){var e=this;return(0,u.Z)(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return e.sessionToken=e.getCookies()["session_token"],t.next=3,e.request("user.get_user_by_session",{session_token:e.sessionToken});case 3:e.currentUser=t.sent;case 4:case"end":return t.stop()}}),t)})))()}},mounted:function(){this.refresh()}};const _e=(0,ee.Z)(xe,[["render",c]]);var Ce=_e},3379:function(e,t,n){var s={"./Camera/Index":[5528,5528],"./CameraAndroidIpcam/Index":[6739,6739],"./CameraCv/Index":[8184,5528,8184],"./CameraFfmpeg/Index":[5111,5528,5111],"./CameraGstreamer/Index":[699,5528,699],"./CameraIrMlx90640/Index":[9895,5528,9895],"./CameraPi/Index":[4548,5528,4548],"./Entities/Index":[8725,201],"./Execute/Index":[3710,3710],"./Light/Index":[8448,7782,3490,8448],"./LightHue/Index":[3724,7782,3490,8448,3724],"./Media/Index":[4196,7782,8337,7029,779,4196],"./MediaMplayer/Index":[6509,7782,8337,7029,779,4196,6509],"./MediaMpv/Index":[5895,7782,8337,7029,779,4196,5895],"./MediaOmxplayer/Index":[9633,7782,8337,7029,779,4196,9633],"./MediaVlc/Index":[767,7782,8337,7029,779,4196,767],"./Music/Index":[5781,7782,8337,7029,6833],"./MusicMpd/Index":[2957,7782,8337,7029,6833,2957],"./MusicSnapcast/Index":[2790,7782,3490,2790],"./MusicSpotify/Index":[7196,7782,8337,7029,6833,7196],"./Rtorrent/Index":[2820,8337,779,6162,2820],"./Settings/Index":[2715],"./Sound/Index":[5193,5193],"./Torrent/Index":[9299,8337,779,6162,9299],"./Tts/Index":[2466,4021,2466],"./TtsGoogle/Index":[1938,4021,1938],"./TvSamsungWs/Index":[615,615],"./ZigbeeMqtt/Index":[4848,7782,3490,4848],"./Zwave/Index":[8586,7782,3490,906,6027],"./ZwaveMqtt/Index":[2362,7782,3490,906,2362]};function i(e){if(!n.o(s,e))return Promise.resolve().then((function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}));var t=s[e],i=t[0];return Promise.all(t.slice(1).map(n.e)).then((function(){return n(i)}))}i.keys=function(){return Object.keys(s)},i.id=3379,e.exports=i},6725:function(e,t,n){var s={"./Calendar/Index":[345,345],"./Camera/Index":[2346,2346],"./Component/Index":[5824,7782,3490,5824],"./DateTime/Index":[1595,9575,1595],"./DateTimeWeather/Index":[346,1798,9575,346],"./ImageCarousel/Index":[6003,1798,9575,6003],"./Music/Index":[6013,6013],"./Plugin/Index":[1818,1818],"./RssNews/Index":[7420,7420],"./Weather/Index":[1798,1798]};function i(e){if(!n.o(s,e))return Promise.resolve().then((function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}));var t=s[e],i=t[0];return Promise.all(t.slice(1).map(n.e)).then((function(){return n(i)}))}i.keys=function(){return Object.keys(s)},i.id=6725,e.exports=i},1359:function(e){"use strict";e.exports=JSON.parse('{"arduino":{"class":"fas fa-microchip"},"bluetooth":{"class":"fab fa-bluetooth"},"camera.android.ipcam":{"class":"fab fa-android"},"camera.cv":{"class":"fas fa-camera"},"camera.ffmpeg":{"class":"fas fa-camera"},"camera.gstreamer":{"class":"fas fa-camera"},"camera.ir.mlx90640":{"class":"fas fa-sun"},"camera.pi":{"class":"fas fa-camera"},"entities":{"class":"fa fa-home"},"execute":{"class":"fa fa-play"},"light.hue":{"class":"fas fa-lightbulb"},"linode":{"class":"fas fa-cloud"},"media.jellyfin":{"imgUrl":"/icons/jellyfin.svg"},"media.kodi":{"imgUrl":"/icons/kodi.svg"},"media.omxplayer":{"class":"fa fa-film"},"media.mplayer":{"class":"fa fa-film"},"media.mpv":{"class":"fa fa-film"},"media.plex":{"imgUrl":"/icons/plex.svg"},"media.vlc":{"class":"fa fa-film"},"music.mpd":{"class":"fas fa-music"},"music.snapcast":{"class":"fa fa-volume-up"},"music.spotify":{"class":"fab fa-spotify"},"torrent":{"class":"fa fa-magnet"},"rtorrent":{"class":"fa fa-magnet"},"sensor.bme280":{"class":"fas fa-microchip"},"sensor.dht":{"class":"fas fa-microchip"},"sensor.envirophat":{"class":"fas fa-microchip"},"sensor.ltr559":{"class":"fas fa-microchip"},"sensor.mcp3008":{"class":"fas fa-microchip"},"sensor.pmw3901":{"class":"fas fa-microchip"},"sensor.vl53l1x":{"class":"fas fa-microchip"},"serial":{"class":"fab fa-usb"},"smartthings":{"imgUrl":"/icons/smartthings.png"},"switches":{"class":"fas fa-toggle-on"},"switch.switchbot":{"class":"fas fa-toggle-on"},"switch.tplink":{"class":"fas fa-toggle-on"},"switchbot":{"class":"fas fa-toggle-on"},"sound":{"class":"fa fa-microphone"},"system":{"class":"fas fa-microchip"},"tts":{"class":"far fa-comment"},"tts.google":{"class":"fas fa-comment"},"tv.samsung.ws":{"class":"fas fa-tv"},"variable":{"class":"fas fa-square-root-variable"},"zigbee.mqtt":{"imgUrl":"/icons/zigbee.svg"},"zwave":{"imgUrl":"/icons/z-wave.png"},"zwave.mqtt":{"imgUrl":"/icons/z-wave.png"}}')}},t={};function n(s){var i=t[s];if(void 0!==i)return i.exports;var r=t[s]={exports:{}};return e[s](r,r.exports,n),r.exports}n.m=e,function(){var e=[];n.O=function(t,s,i,r){if(!s){var a=1/0;for(u=0;u=r)&&Object.keys(n.O).every((function(e){return n.O[e](s[l])}))?s.splice(l--,1):(o=!1,r0&&e[u-1][2]>r;u--)e[u]=e[u-1];e[u]=[s,i,r]}}(),function(){n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,{a:t}),t}}(),function(){var e,t=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__};n.t=function(s,i){if(1&i&&(s=this(s)),8&i)return s;if("object"===typeof s&&s){if(4&i&&s.__esModule)return s;if(16&i&&"function"===typeof s.then)return s}var r=Object.create(null);n.r(r);var a={};e=e||[null,t({}),t([]),t(t)];for(var o=2&i&&s;"object"==typeof o&&!~e.indexOf(o);o=t(o))Object.getOwnPropertyNames(o).forEach((function(e){a[e]=function(){return s[e]}}));return a["default"]=function(){return s},n.d(r,a),r}}(),function(){n.d=function(e,t){for(var s in t)n.o(t,s)&&!n.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})}}(),function(){n.f={},n.e=function(e){return Promise.all(Object.keys(n.f).reduce((function(t,s){return n.f[s](e,t),t}),[]))}}(),function(){n.u=function(e){return"static/js/"+e+"-legacy."+{65:"a4e6662a",201:"9dc75ca4",345:"dcb6e74e",346:"f3cfa402",615:"fba0e1b5",675:"6f3d0433",699:"cb1ccfbb",767:"f33d812b",779:"4b8d600b",906:"23975966",1196:"9aa73c4d",1300:"526f4cf3",1595:"69aea4ae",1767:"0d72ab23",1798:"b42f39d9",1818:"03a52113",1938:"e350f72d",2346:"4845c2ae",2362:"034c153c",2466:"b6981a49",2790:"4cad67a6",2806:"a4faf9ad",2820:"869be689",2957:"a0d5f651",3194:"8b9635f4",3303:"337cf4d7",3490:"d482e29b",3710:"c79204f1",3724:"b00820ce",4021:"a3380d38",4196:"7ab38e3c",4548:"e2883bdd",4848:"0b09aeb3",4981:"c4835180",5111:"262ea3c5",5157:"090db2a1",5193:"d8c2e027",5207:"b6625280",5498:"8c82ec84",5528:"c6626d00",5824:"6527ca08",5895:"e1ce8e90",5924:"7c59be4f",6003:"f3446996",6013:"b02eb716",6027:"15704eec",6162:"bf13f6e2",6164:"73de3e0f",6358:"e74bed57",6509:"ab6d64c3",6739:"c665b953",6815:"7ba5187b",6833:"78ead800",7029:"85f01cbd",7141:"d485cb27",7196:"a47a2493",7420:"a57de4be",7503:"ad9a73d9",7782:"724314a6",8135:"e2055fdf",8184:"702db0b7",8337:"fcf13df8",8444:"b113ba12",8448:"fd3bc403",9276:"c3089257",9299:"adb4a75b",9387:"a7ab196d",9418:"06c89318",9450:"ba028d4c",9575:"fb8eab70",9633:"8a00fadb",9895:"acee9428"}[e]+".js"}}(),function(){n.miniCssF=function(e){return"static/css/"+e+"."+{65:"ae3723d7",201:"3ba92d09",345:"25d1c562",346:"bec1b050",615:"6d3a8446",675:"10cdb721",779:"2e68c420",906:"a114eea0",1196:"78925ff5",1300:"180d2070",1767:"f9545a14",1798:"3a165bb4",1818:"8db287b9",2346:"ed463bd2",2790:"a0725ecc",2806:"9c9d5a57",3194:"a07dd4e2",3303:"bfeafcb0",3490:"fcf11255",3710:"1112d8b7",3724:"234438b4",4021:"58663e3e",4196:"539db457",4848:"72a7d113",4981:"c5c2f5dd",5193:"47f020c5",5207:"950597e1",5498:"ef565a73",5528:"22b025de",5824:"8f1b2b15",5924:"f0111959",6003:"fbbaf2b7",6013:"504d6c0b",6162:"c92d9d38",6164:"ea3fa7cb",6358:"1f06089f",6739:"49b1f262",6815:"f1dc7909",6833:"28cb5e3d",7029:"b6585c35",7141:"4b3e6b00",7420:"4bf56b11",7503:"34698020",7782:"a6a32303",8135:"1460504e",8444:"95911650",8448:"6ad0f775",9276:"518b169b",9387:"74d3b3a3",9418:"9f2b9c3a",9450:"fd9ed6f2",9575:"1b22f65c"}[e]+".css"}}(),function(){n.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={},t="platypush:";n.l=function(s,i,r,a){if(e[s])e[s].push(i);else{var o,l;if(void 0!==r)for(var c=document.getElementsByTagName("script"),u=0;uPlatypush
',3),$e={key:0,class:"row"},We=je((function(){return(0,i._)("label",null,[(0,i._)("input",{type:"password",name:"confirm_password",placeholder:"Confirm password"})],-1)})),ze=[We],Le={class:"row buttons"},Ae=["value"],Ve=je((function(){return(0,i._)("div",{class:"row pull-right"},[(0,i._)("label",{class:"checkbox"},[(0,i._)("input",{type:"checkbox",name:"remember"}),(0,i.Uk)("  Keep me logged in on this device   ")])],-1)}));function Fe(e,t,n,s,r,a){return(0,i.wg)(),(0,i.iD)("div",qe,[(0,i._)("form",Oe,[Ee,a._register?((0,i.wg)(),(0,i.iD)("div",$e,ze)):(0,i.kq)("",!0),(0,i._)("div",Le,[(0,i._)("input",{type:"submit",class:"btn btn-primary",value:a._register?"Register":"Login"},null,8,Ae)]),Ve])])}var He={name:"Login",mixins:[M.Z],props:{register:{type:Boolean,required:!1,default:!1}},computed:{_register:function(){return this.parseBoolean(this.register)}}};const Be=(0,D.Z)(He,[["render",Fe],["__scopeId","data-v-af0b14d0"]]);var Ke=Be;function Ye(e,t,n,s,r,a){var o=(0,i.up)("Login");return(0,i.wg)(),(0,i.j4)(o,{register:!0})}var Ge={name:"Register",mixins:[Ke],components:{Login:Ke},props:{register:{type:Boolean,required:!1,default:!0}}};const Je=(0,D.Z)(Ge,[["render",Ye]]);var Xe=Je,Qe={key:2,class:"canvas"},et={class:"panel"},tt={key:3,class:"canvas"};function nt(e,t,n,s,r,a){var o=(0,i.up)("Loading"),l=(0,i.up)("Nav"),c=(0,i.up)("Settings");return(0,i.wg)(),(0,i.iD)("main",null,[r.loading?((0,i.wg)(),(0,i.j4)(o,{key:0})):((0,i.wg)(),(0,i.j4)(l,{key:1,panels:r.components,"selected-panel":r.selectedPanel,hostname:r.hostname,onSelect:t[0]||(t[0]=function(e){return r.selectedPanel=e})},null,8,["panels","selected-panel","hostname"])),"settings"===r.selectedPanel?((0,i.wg)(),(0,i.iD)("div",Qe,[(0,i._)("div",et,[(0,i.Wm)(c)])])):((0,i.wg)(),(0,i.iD)("div",tt,[((0,i.wg)(!0),(0,i.iD)(i.HY,null,(0,i.Ko)(r.components,(function(e,t){return(0,i.wg)(),(0,i.iD)("div",{class:(0,d.C_)(["panel",{hidden:t!==r.selectedPanel}]),key:t},[t===r.selectedPanel?((0,i.wg)(),(0,i.j4)((0,i.LL)(e.component),{key:0,config:e.config,"plugin-name":t},null,8,["config","plugin-name"])):(0,i.kq)("",!0)],2)})),128))]))])}var st=n(6084),it=(n(4723),n(4747),n(9720),n(9600),n(7042),function(e){return(0,i.dD)("data-v-6d8984d5"),e=e(),(0,i.Cn)(),e}),rt=it((function(){return(0,i._)("i",{class:"fas fa-bars"},null,-1)})),at=["textContent"],ot={class:"plugins"},lt=["title","onClick"],ct=["href"],ut={class:"icon"},dt=["src"],ft={key:2,class:"fas fa-puzzle-piece"},pt=["textContent"],mt={class:"footer"},ht={href:"/#settings"},gt=it((function(){return(0,i._)("span",{class:"icon"},[(0,i._)("i",{class:"fa fa-cog"})],-1)})),vt={key:0,class:"name"},bt={href:"/logout"},wt=it((function(){return(0,i._)("span",{class:"icon"},[(0,i._)("i",{class:"fas fa-sign-out-alt"})],-1)})),yt={key:0,class:"name"};function kt(e,t,n,s,r,a){return(0,i.wg)(),(0,i.iD)("nav",{class:(0,d.C_)({collapsed:r.collapsed})},[(0,i._)("div",{class:"toggler",onClick:t[0]||(t[0]=function(e){return r.collapsed=!r.collapsed})},[rt,n.hostname?((0,i.wg)(),(0,i.iD)("span",{key:0,class:"hostname",textContent:(0,d.zw)(n.hostname)},null,8,at)):(0,i.kq)("",!0)]),(0,i._)("ul",ot,[((0,i.wg)(!0),(0,i.iD)(i.HY,null,(0,i.Ko)(a.panelNames,(function(e){var t,s;return(0,i.wg)(),(0,i.iD)("li",{key:e,class:(0,d.C_)(["entry",{selected:e===n.selectedPanel}]),title:e,onClick:function(t){return a.onItemClick(e)}},[(0,i._)("a",{href:"/#".concat(e)},[(0,i._)("span",ut,[null!==(t=r.icons[e])&&void 0!==t&&t.class?((0,i.wg)(),(0,i.iD)("i",{key:0,class:(0,d.C_)(r.icons[e].class)},null,2)):null!==(s=r.icons[e])&&void 0!==s&&s.imgUrl?((0,i.wg)(),(0,i.iD)("img",{key:1,src:r.icons[e].imgUrl,alt:"name"},null,8,dt)):((0,i.wg)(),(0,i.iD)("i",ft))]),r.collapsed?(0,i.kq)("",!0):((0,i.wg)(),(0,i.iD)("span",{key:0,class:"name",textContent:(0,d.zw)("entities"==e?"Home":e)},null,8,pt))],8,ct)],10,lt)})),128))]),(0,i._)("ul",mt,[(0,i._)("li",{class:(0,d.C_)({selected:"settings"===n.selectedPanel}),title:"Settings",onClick:t[1]||(t[1]=function(e){return a.onItemClick("settings")})},[(0,i._)("a",ht,[gt,r.collapsed?(0,i.kq)("",!0):((0,i.wg)(),(0,i.iD)("span",vt,"Settings"))])],2),(0,i._)("li",{title:"Logout",onClick:t[2]||(t[2]=function(e){return a.onItemClick("logout")})},[(0,i._)("a",bt,[wt,r.collapsed?(0,i.kq)("",!0):((0,i.wg)(),(0,i.iD)("span",yt,"Logout"))])])])],2)}n(2707);var xt=n(1359),_t={name:"Nav",emits:["select"],mixins:[M.Z],props:{panels:{type:Object,required:!0},selectedPanel:{type:String},hostname:{type:String}},computed:{panelNames:function(){var e=Object.keys(this.panels),t=e.indexOf("entities");return t>=0?["entities"].concat(e.slice(0,t).concat(e.slice(t+1)).sort()):e.sort()},collapsedDefault:function(){return!(!this.isMobile()&&!this.isTablet())}},methods:{onItemClick:function(e){this.$emit("select",e),this.collapsed=!!this.isMobile()||this.collapsedDefault}},data:function(){return{collapsed:!0,icons:xt,host:null}},mounted:function(){this.collapsed=this.collapsedDefault}};const Ct=(0,D.Z)(_t,[["render",kt],["__scopeId","data-v-6d8984d5"]]);var Dt=Ct,It=n(2715),Tt={name:"Panel",mixins:[M.Z],components:{Settings:It["default"],Nav:Dt,Loading:we.Z},data:function(){return{loading:!1,plugins:{},backends:{},procedures:{},components:{},hostname:void 0,selectedPanel:void 0}},methods:{initSelectedPanel:function(){var e=this.$route.hash.match("#?([a-zA-Z0-9.]+)[?]?(.*)"),t=e?e[1]:"entities";null!==t&&void 0!==t&&t.length&&(this.selectedPanel=t)},initPanels:function(){var e=this;this.components={},Object.entries(this.plugins).forEach(function(){var t=(0,o.Z)(regeneratorRuntime.mark((function t(s){var r,a,l,c,u,d;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return r=(0,st.Z)(s,2),a=r[0],l=r[1],c=a.split(".").map((function(e){return e[0].toUpperCase()+e.slice(1)})).join(""),u=null,t.prev=3,t.next=6,n(3379)("./".concat(c,"/Index"));case 6:u=t.sent,t.next=12;break;case 9:return t.prev=9,t.t0=t["catch"](3),t.abrupt("return");case 12:d=(0,be.XI)((0,i.RC)((0,o.Z)(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.abrupt("return",u);case 1:case"end":return e.stop()}}),e)}))))),e.$options.components[a]=d,e.components[a]={component:d,pluginName:a,config:l};case 15:case"end":return t.stop()}}),t,null,[[3,9]])})));return function(e){return t.apply(this,arguments)}}())},parseConfig:function(){var e=this;return(0,o.Z)(regeneratorRuntime.mark((function t(){var n,s;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.next=2,Promise.all([e.request("config.get_plugins"),e.request("config.get_backends"),e.request("config.get_procedures"),e.request("config.get_device_id")]);case 2:n=t.sent,s=(0,st.Z)(n,4),e.plugins=s[0],e.backends=s[1],e.procedures=s[2],e.hostname=s[3],e.initializeDefaultViews();case 9:case"end":return t.stop()}}),t)})))()},initializeDefaultViews:function(){this.plugins.execute={},this.plugins.entities={}}},mounted:function(){var e=this;return(0,o.Z)(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return e.loading=!0,t.prev=1,t.next=4,e.parseConfig();case 4:e.initPanels(),e.initSelectedPanel();case 6:return t.prev=6,e.loading=!1,t.finish(6);case 9:case"end":return t.stop()}}),t,null,[[1,,6,9]])})))()}};const Zt=(0,D.Z)(Tt,[["render",nt],["__scopeId","data-v-fbc09254"]]);var St=Zt,Ut={key:1,class:"canvas"};function Mt(e,t,n,s,r,a){var o=(0,i.up)("Loading");return(0,i.wg)(),(0,i.iD)("main",null,[r.loading?((0,i.wg)(),(0,i.j4)(o,{key:0})):((0,i.wg)(),(0,i.iD)("div",Ut,[((0,i.wg)(),(0,i.j4)((0,i.LL)(r.component),{config:r.config,"plugin-name":a.pluginName},null,8,["config","plugin-name"]))]))])}n(9714);var Rt={name:"Panel",mixins:[M.Z],components:{Settings:It["default"],Nav:Dt,Loading:we.Z},data:function(){return{loading:!1,config:{},plugins:{},backends:{},procedures:{},component:void 0,hostname:void 0,selectedPanel:void 0}},computed:{pluginName:function(){return this.$route.params.plugin}},methods:{initPanel:function(){var e=this;return(0,o.Z)(regeneratorRuntime.mark((function t(){var s,r;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return s=e.pluginName.split(".").map((function(e){return e[0].toUpperCase()+e.slice(1)})).join(""),r=null,t.prev=2,t.next=5,n(3379)("./".concat(s,"/Index"));case 5:r=t.sent,t.next=13;break;case 8:return t.prev=8,t.t0=t["catch"](2),console.error(t.t0),e.notify({error:!0,title:"Cannot load plugin ".concat(e.pluginName),text:t.t0.toString()}),t.abrupt("return");case 13:e.component=(0,be.XI)((0,i.RC)((0,o.Z)(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.abrupt("return",r);case 1:case"end":return e.stop()}}),e)}))))),e.$options.components[s]=e.component;case 15:case"end":return t.stop()}}),t,null,[[2,8]])})))()},initConfig:function(){var e=this;return(0,o.Z)(regeneratorRuntime.mark((function t(){var n;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.next=2,e.request("config.get");case 2:return n=t.sent,e.config=n[e.pluginName]||{},t.next=6,e.request("config.get_device_id");case 6:e.hostname=t.sent;case 7:case"end":return t.stop()}}),t)})))()}},mounted:function(){var e=this;return(0,o.Z)(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return e.loading=!0,t.prev=1,t.next=4,e.initConfig();case 4:return t.next=6,e.initPanel();case 6:return t.prev=6,e.loading=!1,t.finish(6);case 9:case"end":return t.stop()}}),t,null,[[1,,6,9]])})))()}};const Nt=(0,D.Z)(Rt,[["render",Mt],["__scopeId","data-v-e339182c"]]);var Pt=Nt,jt=[{path:"/",name:"Panel",component:St},{path:"/dashboard/:name",name:"Dashboard",component:Ue},{path:"/plugin/:plugin",name:"Plugin",component:Pt},{path:"/login",name:"Login",component:Ke},{path:"/register",name:"Register",component:Xe},{path:"/:catchAll(.*)",component:Pe}],qt=(0,he.p7)({history:(0,he.PO)(),routes:jt}),Ot=qt,Et=n(5205);(0,Et.z)("".concat("/","service-worker.js"),{ready:function(){console.log("App is being served from cache by a service worker.\nFor more details, visit https://goo.gl/AFskqB")},registered:function(){console.log("Service worker has been registered.")},cached:function(){console.log("Content has been cached for offline use.")},updatefound:function(){console.log("New content is downloading.")},updated:function(){console.log("New content is available; please refresh.")},offline:function(){console.log("No internet connection found. App is running in offline mode.")},error:function(e){console.error("Error during service worker registration:",e)}});var $t=(0,s.ri)(me);$t.config.globalProperties._config=window.config,$t.use(Ot).mount("#app")},6813:function(e,t,n){"use strict";n.d(t,{Z:function(){return j}});n(1539);var s=n(9669),i=n.n(s),r={name:"Api",methods:{execute:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:6e4,s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r={};return"target"in e&&e["target"]||(e["target"]="localhost"),"type"in e&&e["type"]||(e["type"]="request"),n&&(r.timeout=n),new Promise((function(n,a){i().post("/execute",e,r).then((function(e){var s;if(e=e.data.response,null!==(s=e.errors)&&void 0!==s&&s.length){var i,r=(null===(i=e.errors)||void 0===i?void 0:i[0])||e;t.notify({text:r,error:!0}),a(r)}else n(e.output)})).catch((function(e){var n,i,r,o;412===(null===e||void 0===e||null===(n=e.response)||void 0===n||null===(i=n.data)||void 0===i?void 0:i.code)&&window.location.href.indexOf("/register")<0?window.location.href="/register?redirect="+window.location.href:401===(null===e||void 0===e||null===(r=e.response)||void 0===r||null===(o=r.data)||void 0===o?void 0:o.code)&&window.location.href.indexOf("/login")<0?window.location.href="/login?redirect="+window.location.href:(console.log(e),s&&t.notify({text:e,error:!0}),a(e))}))}))},request:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:6e4,s=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];return this.execute({type:"request",action:e,args:t},n,s)}}};const a=r;var o=a,l=n(6084),c=(n(4916),n(3123),{name:"Cookies",methods:{getCookies:function(){return document.cookie.split(/;\s*/).reduce((function(e,t){var n=t.split("="),s=(0,l.Z)(n,2),i=s[0],r=s[1];return e[i]=r,e}),{})}}});const u=c;var d=u,f=(n(2222),{name:"DateTime",methods:{formatDate:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return"string"===typeof e&&(e=new Date(Date.parse(e))),e.toDateString().substring(0,t?15:10)},formatTime:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return"string"===typeof e&&(e=new Date(Date.parse(e))),e.toTimeString().substring(0,t?8:5)},formatDateTime:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];return"string"===typeof e&&(e=new Date(Date.parse(e))),"".concat(this.formatDate(e,t),", ").concat(this.formatTime(e,n))}}});const p=f;var m=p,h=n(9584),g=(n(7714),n(2801),n(1174),n(1249),n(3948),n(5250)),v={name:"Events",computed:{_eventsReady:function(){var e;return null===(e=this.$root.$refs.events)||void 0===e?void 0:e.initialized}},methods:{subscribe:function(e,t){for(var n=this,s=arguments.length,i=new Array(s>2?s-2:0),r=2;r1024&&(i===n.length-1?t=s:e/=1024)})),"".concat(e.toFixed(2)," ").concat(t)},convertTime:function(e){var t={},n=[];if(e=parseFloat(e),t.d=Math.round(e/86400),t.h=Math.round(e/3600-24*t.d),t.m=Math.round(e/60-(24*t.d+60*t.h)),t.s=Math.round(e-(24*t.d+3600*t.h+60*t.m),1),parseInt(t.d)){var s=t.d+" day";t.d>1&&(s+="s"),n.push(s)}if(parseInt(t.h)){var i=t.h+" hour";t.h>1&&(i+="s"),n.push(i)}if(parseInt(t.m)){var r=t.m+" minute";t.m>1&&(r+="s"),n.push(r)}var a=t.s+" second";return t.s>1&&(a+="s"),n.push(a),n.join(" ")},objectsEqual:function(e,t){var n;if("object"!==(0,S.Z)(e)||"object"!==(0,S.Z)(t))return!1;if(null==e||null==t)return null==e&&null==t;for(var s=0,i=Object.keys(e||{});st?(t=r,n=[i]):r===t&&n.push(i)}}catch(o){s.e(o)}finally{s.f()}(n.indexOf(this.$el)<0||n.length>1)&&(this.$el.style.zIndex=t+1)}if(this.isVisible&&this.timeout&&!this.timeoutId){var a=function(e){return function(){e.close(),e.timeoutId=void 0}};this.timeoutId=setTimeout(a(this),0+this.timeout)}}}),h=n(3744);const g=(0,h.Z)(m,[["render",f],["__scopeId","data-v-18f9fdba"]]);var v=g},6714:function(e,t,n){"use strict";n.d(t,{Z:function(){return h}});var s=n(6252),i=n(9963),r=n(3577),a=function(e){return(0,s.dD)("data-v-dda41b94"),e=e(),(0,s.Cn)(),e},o={class:"dialog-content"},l=a((function(){return(0,s._)("i",{class:"fas fa-check"},null,-1)})),c=a((function(){return(0,s._)("i",{class:"fas fa-xmark"},null,-1)}));function u(e,t,n,a,u,d){var f=(0,s.up)("Modal");return(0,s.wg)(),(0,s.j4)(f,{ref:"modal",title:n.title},{default:(0,s.w5)((function(){return[(0,s._)("div",o,[(0,s.WI)(e.$slots,"default",{},void 0,!0)]),(0,s._)("form",{class:"buttons",onSubmit:t[4]||(t[4]=(0,i.iM)((function(){return d.onConfirm&&d.onConfirm.apply(d,arguments)}),["prevent"]))},[(0,s._)("button",{type:"submit",class:"ok-btn",onClick:t[0]||(t[0]=function(){return d.onConfirm&&d.onConfirm.apply(d,arguments)}),onTouch:t[1]||(t[1]=function(){return d.onConfirm&&d.onConfirm.apply(d,arguments)})},[l,(0,s.Uk)("   "+(0,r.zw)(n.confirmText),1)],32),(0,s._)("button",{type:"button",class:"cancel-btn",onClick:t[2]||(t[2]=function(){return d.close&&d.close.apply(d,arguments)}),onTouch:t[3]||(t[3]=function(){return d.close&&d.close.apply(d,arguments)})},[c,(0,s.Uk)("   "+(0,r.zw)(n.cancelText),1)],32)],32)]})),_:3},8,["title"])}var d=n(1794),f={emits:["input","click","touch"],components:{Modal:d.Z},props:{title:{type:String},confirmText:{type:String,default:"OK"},cancelText:{type:String,default:"Cancel"}},methods:{onConfirm:function(){this.$emit("input"),this.close()},show:function(){this.$refs.modal.show()},close:function(){this.$refs.modal.hide()}}},p=n(3744);const m=(0,p.Z)(f,[["render",u],["__scopeId","data-v-dda41b94"]]);var h=m},2856:function(e,t,n){"use strict";n.d(t,{Z:function(){return m}});var s=n(6252),i=n(9963),r=n(3577),a={class:"dropdown-container",ref:"container"},o=["title"],l=["textContent"],c=["id"];function u(e,t,n,u,d,f){return(0,s.wg)(),(0,s.iD)("div",a,[(0,s._)("button",{title:n.title,ref:"button",onClick:t[0]||(t[0]=(0,i.iM)((function(e){return f.toggle(e)}),["stop"]))},[n.iconClass?((0,s.wg)(),(0,s.iD)("i",{key:0,class:(0,r.C_)(["icon",n.iconClass])},null,2)):(0,s.kq)("",!0),n.text?((0,s.wg)(),(0,s.iD)("span",{key:1,class:"text",textContent:(0,r.zw)(n.text)},null,8,l)):(0,s.kq)("",!0)],8,o),(0,s._)("div",{class:(0,r.C_)(["dropdown fade-in",{hidden:!d.visible}]),id:n.id,ref:"dropdown"},[(0,s.WI)(e.$slots,"default",{},void 0,!0)],10,c)],512)}var d={name:"Dropdown",emits:["click"],props:{id:{type:String},items:{type:Array,default:function(){return[]}},iconClass:{default:"fa fa-ellipsis-h"},text:{type:String},title:{type:String},keepOpenOnItemClick:{type:Boolean,default:!1}},data:function(){return{visible:!1}},methods:{documentClickHndl:function(e){if(this.visible){var t=e.target;while(t){if(!this.$refs.dropdown)break;if(t===this.$refs.dropdown.element)return;t=t.parentElement}this.close()}},close:function(){this.visible=!1,document.removeEventListener("click",this.documentClickHndl)},open:function(){var e=this;document.addEventListener("click",this.documentClickHndl),this.visible=!0,setTimeout((function(){var t=e.$refs.dropdown;t.style.left=0,t.style.top=parseFloat(getComputedStyle(e.$refs.button).height)+"px",t.getBoundingClientRect().left>window.innerWidth/2&&(t.style.left=-t.clientWidth+parseFloat(getComputedStyle(e.$refs.button).width)+"px"),t.getBoundingClientRect().top>window.innerHeight/2&&(t.style.top=-t.clientHeight+parseFloat(getComputedStyle(e.$refs.button).height)+"px")}),10)},toggle:function(e){e.stopPropagation(),this.$emit("click"),this.visible?this.close():this.open()},onKeyUp:function(e){e.stopPropagation(),"Escape"===e.key&&this.close()}},mounted:function(){document.body.addEventListener("keyup",this.onKeyUp)},unmounted:function(){document.body.removeEventListener("keyup",this.onKeyUp)}},f=n(3744);const p=(0,f.Z)(d,[["render",u],["__scopeId","data-v-5b964c03"]]);var m=p},2588:function(e,t,n){"use strict";n.d(t,{Z:function(){return f}});var s=n(6252),i=n(3577),r={key:0,class:"col-2 icon"},a=["textContent"];function o(e,t,n,o,l,c){var u,d,f=(0,s.up)("Icon");return(0,s.wg)(),(0,s.iD)("div",{class:(0,i.C_)(["row item",n.itemClass]),onClick:t[0]||(t[0]=function(){return c.clicked&&c.clicked.apply(c,arguments)})},[null!==(u=n.iconClass)&&void 0!==u&&u.length||null!==(d=n.iconUrl)&&void 0!==d&&d.length?((0,s.wg)(),(0,s.iD)("div",r,[(0,s.Wm)(f,{class:(0,i.C_)(n.iconClass),url:n.iconUrl},null,8,["class","url"])])):(0,s.kq)("",!0),(0,s._)("div",{class:(0,i.C_)(["text",{"col-10":null!=n.iconClass}]),textContent:(0,i.zw)(n.text)},null,10,a)],2)}var l=n(1478),c={name:"DropdownItem",components:{Icon:l.Z},props:{iconClass:{type:String},iconUrl:{type:String},text:{type:String},disabled:{type:Boolean,default:!1},itemClass:{}},methods:{clicked:function(e){if(this.disabled)return!1;this.$parent.$emit("click",e),this.$parent.keepOpenOnItemClick||(this.$parent.visible=!1)}}},u=n(3744);const d=(0,u.Z)(c,[["render",o],["__scopeId","data-v-282d16b4"]]);var f=d},1478:function(e,t,n){"use strict";n.d(t,{Z:function(){return d}});var s=n(6252),i=n(3577),r={class:"icon-container"},a=["src","alt"];function o(e,t,n,o,l,c){var u,d;return(0,s.wg)(),(0,s.iD)("div",r,[null!==(u=n.url)&&void 0!==u&&u.length?((0,s.wg)(),(0,s.iD)("img",{key:0,class:"icon",src:n.url,alt:n.alt},null,8,a)):null!==(d=c.className)&&void 0!==d&&d.length?((0,s.wg)(),(0,s.iD)("i",{key:1,class:(0,i.C_)(["icon",c.className]),style:(0,i.j5)({color:n.color})},null,6)):(0,s.kq)("",!0)])}var l={props:{class:{type:String},url:{type:String},color:{type:String,default:""},alt:{type:String,default:""}},computed:{className:function(){return this.class}}},c=n(3744);const u=(0,c.Z)(l,[["render",o],["__scopeId","data-v-706a3bd1"]]);var d=u},2715:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return Ce}});var s=n(6252),i={class:"settings-container"},r={class:"col-8"},a={class:"col-4 pull-right"},o=(0,s._)("i",{class:"fa fa-plus"},null,-1),l=[o];function c(e,t,n,o,c,u){var d=(0,s.up)("DropdownItem"),f=(0,s.up)("Dropdown"),p=(0,s.up)("Users"),m=(0,s.up)("Token");return(0,s.wg)(),(0,s.iD)("div",i,[(0,s._)("header",null,[(0,s._)("div",r,[(0,s.Wm)(f,{title:"Select a category","icon-class":"fa fa-ellipsis-h"},{default:(0,s.w5)((function(){return[(0,s.Wm)(d,{text:"Users","icon-class":"fa fa-user","item-class":{selected:"users"===c.selectedView},onClick:t[0]||(t[0]=function(e){return c.selectedView="users"})},null,8,["item-class"]),(0,s.Wm)(d,{text:"Generate a token","icon-class":"fa fa-key","item-class":{selected:"token"===c.selectedView},onClick:t[1]||(t[1]=function(e){return c.selectedView="token"})},null,8,["item-class"])]})),_:1})]),(0,s._)("div",a,["users"===c.selectedView?((0,s.wg)(),(0,s.iD)("button",{key:0,title:"Add User",onClick:t[2]||(t[2]=function(t){return e.$refs.usersView.$refs.addUserModal.show()})},l)):(0,s.kq)("",!0)])]),(0,s._)("main",null,["users"===c.selectedView?((0,s.wg)(),(0,s.j4)(p,{key:0,"session-token":c.sessionToken,"current-user":c.currentUser,ref:"usersView"},null,8,["session-token","current-user"])):"token"===c.selectedView?((0,s.wg)(),(0,s.j4)(m,{key:1,"session-token":c.sessionToken,"current-user":c.currentUser,ref:"tokenView"},null,8,["session-token","current-user"])):(0,s.kq)("",!0)])])}var u=n(8534),d=(n(5666),n(2856)),f=n(2588),p=n(3577),m=n(9963),h={class:"token-container"},g={class:"token-container"},v=(0,s.Uk)(" This is your generated token. Treat it carefully and do not share it with untrusted parties."),b=(0,s._)("br",null,null,-1),w=(0,s.Uk)(" Also, make sure to save it - it WILL NOT be displayed again. "),y=["textContent"],k={class:"body"},x={class:"description"},_=(0,s.Uk)("Generate a JWT authentication token that can be used for API calls to the "),C=(0,s.Uk)("/execute"),D=(0,s.Uk)(" endpoint."),I=(0,s._)("br",null,null,-1),T=(0,s._)("p",null,"You can include the token in your requests in any of the following ways:",-1),Z=(0,s.Uk)("Specify it on the "),S=(0,s.Uk)("Authorization: Bearer"),U=(0,s.Uk)(" header;"),M=(0,s.Uk)("Specify it on the "),R=(0,s.Uk)("X-Token"),N=(0,s.Uk)(" header;"),P=(0,s.Uk)("Specify it as a URL parameter: "),j=(0,s.Uk)("http://site:8008/execute?token=..."),q=(0,s.Uk)(";"),O=(0,s.Uk)("Specify it on the body of your JSON request: "),E=(0,s.Uk)('{"type":"request", "action", "...", "token":"..."}'),$=(0,s.Uk)("."),W=(0,s.Uk)(" Confirm your credentials in order to generate a new token. "),z={class:"form-container"},L=(0,s._)("span",null,"Username",-1),A=["value"],V=(0,s._)("label",null,[(0,s._)("span",null,"Confirm password"),(0,s._)("span",null,[(0,s._)("input",{type:"password",name:"password"})])],-1),F=(0,s._)("label",null,[(0,s._)("span",null,"Token validity in days"),(0,s._)("span",null,[(0,s._)("input",{type:"text",name:"validityDays"})]),(0,s._)("span",{class:"note"},[(0,s.Uk)(" Decimal values are also supported (e.g. "),(0,s._)("i",null,"0.5"),(0,s.Uk)(" to identify 6 hours). An empty or zero value means that the token has no expiry date. ")])],-1),H=(0,s._)("label",null,[(0,s._)("input",{type:"submit",class:"btn btn-primary",value:"Generate token"})],-1);function B(e,t,n,i,r,a){var o=(0,s.up)("Loading"),l=(0,s.up)("Modal"),c=(0,s.up)("tt");return(0,s.wg)(),(0,s.iD)("div",h,[r.loading?((0,s.wg)(),(0,s.j4)(o,{key:0})):(0,s.kq)("",!0),(0,s.Wm)(l,{ref:"tokenModal"},{default:(0,s.w5)((function(){return[(0,s._)("div",g,[(0,s._)("label",null,[v,b,w,(0,s._)("textarea",{class:"token",textContent:(0,p.zw)(r.token),onFocus:t[0]||(t[0]=function(){return a.onTokenSelect&&a.onTokenSelect.apply(a,arguments)})},null,40,y)])])]})),_:1},512),(0,s._)("div",k,[(0,s._)("div",x,[(0,s._)("p",null,[_,(0,s.Wm)(c,null,{default:(0,s.w5)((function(){return[C]})),_:1}),D]),I,T,(0,s._)("ul",null,[(0,s._)("li",null,[Z,(0,s.Wm)(c,null,{default:(0,s.w5)((function(){return[S]})),_:1}),U]),(0,s._)("li",null,[M,(0,s.Wm)(c,null,{default:(0,s.w5)((function(){return[R]})),_:1}),N]),(0,s._)("li",null,[P,(0,s.Wm)(c,null,{default:(0,s.w5)((function(){return[j]})),_:1}),q]),(0,s._)("li",null,[O,(0,s.Wm)(c,null,{default:(0,s.w5)((function(){return[E]})),_:1}),$])]),W]),(0,s._)("div",z,[(0,s._)("form",{onSubmit:t[1]||(t[1]=(0,m.iM)((function(){return a.generateToken&&a.generateToken.apply(a,arguments)}),["prevent"])),ref:"generateTokenForm"},[(0,s._)("label",null,[L,(0,s._)("span",null,[(0,s._)("input",{type:"text",name:"username",value:n.currentUser.username,disabled:""},null,8,A)])]),V,F,H],544)])])])}n(1539),n(9714);var K=n(9669),Y=n.n(K),G=n(1232),J=n(6813),X=n(1794),Q={name:"Token",components:{Modal:X.Z,Loading:G.Z},mixins:[J.Z],props:{currentUser:{type:Object,required:!0}},data:function(){return{loading:!1,token:null}},methods:{generateToken:function(e){var t=this;return(0,u.Z)(regeneratorRuntime.mark((function n(){var s,i,r,a,o;return regeneratorRuntime.wrap((function(n){while(1)switch(n.prev=n.next){case 0:return i=t.currentUser.username,r=e.target.password.value,a=null!==(s=e.target.validityDays)&&void 0!==s&&s.length?parseInt(e.target.validityDays.value):0,a||(a=null),t.loading=!0,n.prev=5,n.next=8,Y().post("/auth",{username:i,password:r,expiry_days:a});case 8:t.token=n.sent.data.token,null!==(o=t.token)&&void 0!==o&&o.length&&t.$refs.tokenModal.show(),n.next=16;break;case 12:n.prev=12,n.t0=n["catch"](5),console.error(n.t0.toString()),t.notify({text:n.t0.toString(),error:!0});case 16:return n.prev=16,t.loading=!1,n.finish(16);case 19:case"end":return n.stop()}}),n,null,[[5,12,16,19]])})))()},onTokenSelect:function(e){e.target.select(),document.execCommand("copy"),this.notify({text:"Token copied to clipboard",image:{iconClass:"fa fa-check"}})}}},ee=n(3744);const te=(0,ee.Z)(Q,[["render",B]]);var ne=te,se=["disabled"],ie=["disabled"],re=["disabled"],ae=["disabled"],oe=["value"],le=["disabled"],ce=["disabled"],ue=["disabled"],de=["disabled"],fe={class:"body"},pe={class:"users-list"},me=["onClick"],he=["textContent"],ge={class:"actions pull-right col-4"};function ve(e,t,n,i,r,a){var o=(0,s.up)("Loading"),l=(0,s.up)("Modal"),c=(0,s.up)("DropdownItem"),u=(0,s.up)("Dropdown");return(0,s.wg)(),(0,s.iD)(s.HY,null,[r.loading?((0,s.wg)(),(0,s.j4)(o,{key:0})):(0,s.kq)("",!0),(0,s.Wm)(l,{ref:"addUserModal",title:"Add User"},{default:(0,s.w5)((function(){return[(0,s._)("form",{action:"#",method:"POST",ref:"addUserForm",onSubmit:t[0]||(t[0]=function(){return a.createUser&&a.createUser.apply(a,arguments)})},[(0,s._)("label",null,[(0,s._)("input",{type:"text",name:"username",placeholder:"Username",disabled:r.commandRunning},null,8,se)]),(0,s._)("label",null,[(0,s._)("input",{type:"password",name:"password",placeholder:"Password",disabled:r.commandRunning},null,8,ie)]),(0,s._)("label",null,[(0,s._)("input",{type:"password",name:"confirm_password",placeholder:"Confirm password",disabled:r.commandRunning},null,8,re)]),(0,s._)("label",null,[(0,s._)("input",{type:"submit",class:"btn btn-primary",value:"Create User",disabled:r.commandRunning},null,8,ae)])],544)]})),_:1},512),(0,s.Wm)(l,{ref:"changePasswordModal",title:"Change Password"},{default:(0,s.w5)((function(){return[(0,s._)("form",{action:"#",method:"POST",ref:"changePasswordForm",onSubmit:t[1]||(t[1]=function(){return a.changePassword&&a.changePassword.apply(a,arguments)})},[(0,s._)("label",null,[(0,s._)("input",{type:"text",name:"username",placeholder:"Username",value:r.selectedUser,disabled:"disabled"},null,8,oe)]),(0,s._)("label",null,[(0,s._)("input",{type:"password",name:"password",placeholder:"Current password",disabled:r.commandRunning},null,8,le)]),(0,s._)("label",null,[(0,s._)("input",{type:"password",name:"new_password",placeholder:"New password",disabled:r.commandRunning},null,8,ce)]),(0,s._)("label",null,[(0,s._)("input",{type:"password",name:"confirm_new_password",placeholder:"Confirm new password",disabled:r.commandRunning},null,8,ue)]),(0,s._)("label",null,[(0,s._)("input",{type:"submit",class:"btn btn-primary",value:"Change Password",disabled:r.commandRunning},null,8,de)])],544)]})),_:1},512),(0,s._)("div",fe,[(0,s._)("ul",pe,[((0,s.wg)(!0),(0,s.iD)(s.HY,null,(0,s.Ko)(r.users,(function(t){return(0,s.wg)(),(0,s.iD)("li",{key:t.user_id,class:"item user",onClick:function(e){return r.selectedUser=t.username}},[(0,s._)("div",{class:"name col-8",textContent:(0,p.zw)(t.username)},null,8,he),(0,s._)("div",ge,[(0,s.Wm)(u,{title:"User Actions","icon-class":"fa fa-cog"},{default:(0,s.w5)((function(){return[(0,s.Wm)(c,{text:"Change Password",disabled:r.commandRunning,"icon-class":"fa fa-key",onClick:function(n){r.selectedUser=t.username,e.$refs.changePasswordModal.show()}},null,8,["disabled","onClick"]),(0,s.Wm)(c,{text:"Delete User",disabled:r.commandRunning,"icon-class":"fa fa-trash",onClick:function(e){return a.deleteUser(t)}},null,8,["disabled","onClick"])]})),_:2},1024)])],8,me)})),128))])])],64)}var be=n(9584),we=(n(8309),{name:"Users",components:{DropdownItem:f.Z,Loading:G.Z,Modal:X.Z,Dropdown:d.Z},mixins:[J.Z],props:{sessionToken:{type:String,required:!0},currentUser:{type:Object,required:!0}},data:function(){return{users:[],commandRunning:!1,loading:!1,selectedUser:null}},methods:{refresh:function(){var e=this;return(0,u.Z)(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return e.loading=!0,t.prev=1,t.next=4,e.request("user.get_users");case 4:e.users=t.sent;case 5:return t.prev=5,e.loading=!1,t.finish(5);case 8:case"end":return t.stop()}}),t,null,[[1,,5,8]])})))()},createUser:function(e){var t=this;return(0,u.Z)(regeneratorRuntime.mark((function n(){var s;return regeneratorRuntime.wrap((function(n){while(1)switch(n.prev=n.next){case 0:if(e.preventDefault(),s=(0,be.Z)(t.$refs.addUserForm.querySelectorAll("input[name]")).reduce((function(e,t){return e[t.name]=t.value,e}),{}),s.password===s.confirm_password){n.next=5;break}return t.notify({title:"Unable to create user",text:"Please check that the passwords match",error:!0,image:{iconClass:"fas fa-times"}}),n.abrupt("return");case 5:return t.commandRunning=!0,n.prev=6,n.next=9,t.request("user.create_user",{username:s.username,password:s.password,session_token:t.sessionToken});case 9:return n.prev=9,t.commandRunning=!1,n.finish(9);case 12:return t.notify({text:"User "+s.username+" created",image:{iconClass:"fas fa-check"}}),t.$refs.addUserModal.close(),n.next=16,t.refresh();case 16:case"end":return n.stop()}}),n,null,[[6,,9,12]])})))()},changePassword:function(e){var t=this;return(0,u.Z)(regeneratorRuntime.mark((function n(){var s,i;return regeneratorRuntime.wrap((function(n){while(1)switch(n.prev=n.next){case 0:if(e.preventDefault(),s=(0,be.Z)(t.$refs.changePasswordForm.querySelectorAll("input[name]")).reduce((function(e,t){return e[t.name]=t.value,e}),{}),s.new_password===s.confirm_new_password){n.next=5;break}return t.notify({title:"Unable to update password",text:"Please check that the passwords match",error:!0,image:{iconClass:"fas fa-times"}}),n.abrupt("return");case 5:return t.commandRunning=!0,i=!1,n.prev=7,n.next=10,t.request("user.update_password",{username:s.username,old_password:s.password,new_password:s.new_password});case 10:i=n.sent;case 11:return n.prev=11,t.commandRunning=!1,n.finish(11);case 14:i?(t.$refs.changePasswordModal.close(),t.notify({text:"Password successfully updated",image:{iconClass:"fas fa-check"}})):t.notify({title:"Unable to update password",text:"The current password is incorrect",error:!0,image:{iconClass:"fas fa-times"}});case 15:case"end":return n.stop()}}),n,null,[[7,,11,14]])})))()},deleteUser:function(e){var t=this;return(0,u.Z)(regeneratorRuntime.mark((function n(){return regeneratorRuntime.wrap((function(n){while(1)switch(n.prev=n.next){case 0:if(confirm("Are you sure that you want to remove the user "+e.username+"?")){n.next=2;break}return n.abrupt("return");case 2:return t.commandRunning=!0,n.prev=3,n.next=6,t.request("user.delete_user",{username:e.username,session_token:t.sessionToken});case 6:return n.prev=6,t.commandRunning=!1,n.finish(6);case 9:return t.notify({text:"User "+e.username+" removed",image:{iconClass:"fas fa-check"}}),n.next=12,t.refresh();case 12:case"end":return n.stop()}}),n,null,[[3,,6,9]])})))()}},mounted:function(){this.refresh()}});const ye=(0,ee.Z)(we,[["render",ve]]);var ke=ye,xe={name:"Settings",components:{Dropdown:d.Z,DropdownItem:f.Z,Users:ke,Token:ne},mixins:[J.Z],data:function(){return{selectedView:"users",currentUser:null,sessionToken:null}},methods:{refresh:function(){var e=this;return(0,u.Z)(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return e.sessionToken=e.getCookies()["session_token"],t.next=3,e.request("user.get_user_by_session",{session_token:e.sessionToken});case 3:e.currentUser=t.sent;case 4:case"end":return t.stop()}}),t)})))()}},mounted:function(){this.refresh()}};const _e=(0,ee.Z)(xe,[["render",c]]);var Ce=_e},3379:function(e,t,n){var s={"./Camera/Index":[9021,5465],"./CameraAndroidIpcam/Index":[6739,6739],"./CameraCv/Index":[8184,5465,8184],"./CameraFfmpeg/Index":[5111,5465,5111],"./CameraGstreamer/Index":[699,5465,699],"./CameraIrMlx90640/Index":[9895,5465,9895],"./CameraPi/Index":[4548,5465,4548],"./Entities/Index":[8725,201],"./Execute/Index":[3710,3710],"./Light/Index":[8448,7782,3490,8448],"./LightHue/Index":[3724,7782,3490,8448,3724],"./Media/Index":[4196,7782,8337,7029,779,4196],"./MediaMplayer/Index":[6509,7782,8337,7029,779,4196,6509],"./MediaMpv/Index":[5895,7782,8337,7029,779,4196,5895],"./MediaOmxplayer/Index":[9633,7782,8337,7029,779,4196,9633],"./MediaVlc/Index":[767,7782,8337,7029,779,4196,767],"./Music/Index":[5781,7782,8337,7029,6833],"./MusicMpd/Index":[2957,7782,8337,7029,6833,2957],"./MusicSnapcast/Index":[2790,7782,3490,2790],"./MusicSpotify/Index":[7196,7782,8337,7029,6833,7196],"./Rtorrent/Index":[2820,8337,779,6162,2820],"./Settings/Index":[2715],"./Sound/Index":[4118,4118],"./Torrent/Index":[9299,8337,779,6162,9299],"./Tts/Index":[2466,4021,2466],"./TtsGoogle/Index":[1938,4021,1938],"./TvSamsungWs/Index":[615,615],"./ZigbeeMqtt/Index":[4848,7782,3490,4848],"./Zwave/Index":[8586,7782,3490,906,6027],"./ZwaveMqtt/Index":[2362,7782,3490,906,2362]};function i(e){if(!n.o(s,e))return Promise.resolve().then((function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}));var t=s[e],i=t[0];return Promise.all(t.slice(1).map(n.e)).then((function(){return n(i)}))}i.keys=function(){return Object.keys(s)},i.id=3379,e.exports=i},6725:function(e,t,n){var s={"./Calendar/Index":[345,345],"./Camera/Index":[2346,2346],"./Component/Index":[5824,7782,3490,5824],"./DateTime/Index":[1595,9575,1595],"./DateTimeWeather/Index":[346,1798,9575,346],"./ImageCarousel/Index":[6003,1798,9575,6003],"./Music/Index":[6013,6013],"./Plugin/Index":[1818,1818],"./RssNews/Index":[7420,7420],"./Weather/Index":[1798,1798]};function i(e){if(!n.o(s,e))return Promise.resolve().then((function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}));var t=s[e],i=t[0];return Promise.all(t.slice(1).map(n.e)).then((function(){return n(i)}))}i.keys=function(){return Object.keys(s)},i.id=6725,e.exports=i},1359:function(e){"use strict";e.exports=JSON.parse('{"arduino":{"class":"fas fa-microchip"},"bluetooth":{"class":"fab fa-bluetooth"},"camera.android.ipcam":{"class":"fab fa-android"},"camera.cv":{"class":"fas fa-camera"},"camera.ffmpeg":{"class":"fas fa-camera"},"camera.gstreamer":{"class":"fas fa-camera"},"camera.ir.mlx90640":{"class":"fas fa-sun"},"camera.pi":{"class":"fas fa-camera"},"entities":{"class":"fa fa-home"},"execute":{"class":"fa fa-play"},"light.hue":{"class":"fas fa-lightbulb"},"linode":{"class":"fas fa-cloud"},"media.jellyfin":{"imgUrl":"/icons/jellyfin.svg"},"media.kodi":{"imgUrl":"/icons/kodi.svg"},"media.omxplayer":{"class":"fa fa-film"},"media.mplayer":{"class":"fa fa-film"},"media.mpv":{"class":"fa fa-film"},"media.plex":{"imgUrl":"/icons/plex.svg"},"media.vlc":{"class":"fa fa-film"},"music.mpd":{"class":"fas fa-music"},"music.snapcast":{"class":"fa fa-volume-up"},"music.spotify":{"class":"fab fa-spotify"},"torrent":{"class":"fa fa-magnet"},"rtorrent":{"class":"fa fa-magnet"},"sensor.bme280":{"class":"fas fa-microchip"},"sensor.dht":{"class":"fas fa-microchip"},"sensor.envirophat":{"class":"fas fa-microchip"},"sensor.ltr559":{"class":"fas fa-microchip"},"sensor.mcp3008":{"class":"fas fa-microchip"},"sensor.pmw3901":{"class":"fas fa-microchip"},"sensor.vl53l1x":{"class":"fas fa-microchip"},"serial":{"class":"fab fa-usb"},"smartthings":{"imgUrl":"/icons/smartthings.png"},"switches":{"class":"fas fa-toggle-on"},"switch.switchbot":{"class":"fas fa-toggle-on"},"switch.tplink":{"class":"fas fa-toggle-on"},"switchbot":{"class":"fas fa-toggle-on"},"sound":{"class":"fa fa-microphone"},"system":{"class":"fas fa-microchip"},"tts":{"class":"far fa-comment"},"tts.google":{"class":"fas fa-comment"},"tv.samsung.ws":{"class":"fas fa-tv"},"variable":{"class":"fas fa-square-root-variable"},"zigbee.mqtt":{"imgUrl":"/icons/zigbee.svg"},"zwave":{"imgUrl":"/icons/z-wave.png"},"zwave.mqtt":{"imgUrl":"/icons/z-wave.png"}}')}},t={};function n(s){var i=t[s];if(void 0!==i)return i.exports;var r=t[s]={exports:{}};return e[s](r,r.exports,n),r.exports}n.m=e,function(){var e=[];n.O=function(t,s,i,r){if(!s){var a=1/0;for(u=0;u=r)&&Object.keys(n.O).every((function(e){return n.O[e](s[l])}))?s.splice(l--,1):(o=!1,r0&&e[u-1][2]>r;u--)e[u]=e[u-1];e[u]=[s,i,r]}}(),function(){n.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return n.d(t,{a:t}),t}}(),function(){var e,t=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__};n.t=function(s,i){if(1&i&&(s=this(s)),8&i)return s;if("object"===typeof s&&s){if(4&i&&s.__esModule)return s;if(16&i&&"function"===typeof s.then)return s}var r=Object.create(null);n.r(r);var a={};e=e||[null,t({}),t([]),t(t)];for(var o=2&i&&s;"object"==typeof o&&!~e.indexOf(o);o=t(o))Object.getOwnPropertyNames(o).forEach((function(e){a[e]=function(){return s[e]}}));return a["default"]=function(){return s},n.d(r,a),r}}(),function(){n.d=function(e,t){for(var s in t)n.o(t,s)&&!n.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})}}(),function(){n.f={},n.e=function(e){return Promise.all(Object.keys(n.f).reduce((function(t,s){return n.f[s](e,t),t}),[]))}}(),function(){n.u=function(e){return"static/js/"+e+"-legacy."+{65:"a4e6662a",201:"9dc75ca4",345:"dcb6e74e",346:"f3cfa402",615:"fba0e1b5",675:"6f3d0433",699:"e258b653",767:"f33d812b",779:"4b8d600b",906:"23975966",1196:"9aa73c4d",1300:"526f4cf3",1595:"69aea4ae",1767:"0d72ab23",1798:"b42f39d9",1818:"03a52113",1938:"e350f72d",2346:"4845c2ae",2362:"034c153c",2466:"b6981a49",2790:"4cad67a6",2806:"a4faf9ad",2820:"869be689",2957:"a0d5f651",3194:"8b9635f4",3303:"337cf4d7",3490:"d482e29b",3710:"c79204f1",3724:"b00820ce",4021:"a3380d38",4118:"fdfd71bc",4196:"7ab38e3c",4548:"7f4c9c3f",4848:"0b09aeb3",4981:"c4835180",5111:"d4568c17",5157:"090db2a1",5207:"b6625280",5465:"f819fef2",5498:"8c82ec84",5824:"6527ca08",5895:"e1ce8e90",5924:"7c59be4f",6003:"f3446996",6013:"b02eb716",6027:"15704eec",6162:"bf13f6e2",6164:"73de3e0f",6358:"e74bed57",6509:"ab6d64c3",6739:"c665b953",6815:"7ba5187b",6833:"78ead800",7029:"85f01cbd",7141:"d485cb27",7196:"a47a2493",7420:"a57de4be",7503:"ad9a73d9",7782:"724314a6",8135:"e2055fdf",8184:"73f24c6e",8337:"fcf13df8",8444:"b113ba12",8448:"fd3bc403",9276:"c3089257",9299:"adb4a75b",9387:"a7ab196d",9418:"06c89318",9450:"ba028d4c",9575:"fb8eab70",9633:"8a00fadb",9895:"1fd296a4"}[e]+".js"}}(),function(){n.miniCssF=function(e){return"static/css/"+e+"."+{65:"ae3723d7",201:"3ba92d09",345:"25d1c562",346:"bec1b050",615:"6d3a8446",675:"10cdb721",779:"2e68c420",906:"a114eea0",1196:"78925ff5",1300:"180d2070",1767:"f9545a14",1798:"3a165bb4",1818:"8db287b9",2346:"ed463bd2",2790:"a0725ecc",2806:"9c9d5a57",3194:"a07dd4e2",3303:"bfeafcb0",3490:"fcf11255",3710:"1112d8b7",3724:"234438b4",4021:"58663e3e",4118:"25e7d5ff",4196:"539db457",4848:"72a7d113",4981:"c5c2f5dd",5207:"950597e1",5465:"22b025de",5498:"ef565a73",5824:"8f1b2b15",5924:"f0111959",6003:"fbbaf2b7",6013:"504d6c0b",6162:"c92d9d38",6164:"ea3fa7cb",6358:"1f06089f",6739:"49b1f262",6815:"f1dc7909",6833:"28cb5e3d",7029:"b6585c35",7141:"4b3e6b00",7420:"4bf56b11",7503:"34698020",7782:"a6a32303",8135:"1460504e",8444:"95911650",8448:"6ad0f775",9276:"518b169b",9387:"74d3b3a3",9418:"9f2b9c3a",9450:"fd9ed6f2",9575:"1b22f65c"}[e]+".css"}}(),function(){n.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={},t="platypush:";n.l=function(s,i,r,a){if(e[s])e[s].push(i);else{var o,l;if(void 0!==r)for(var c=document.getElementsByTagName("script"),u=0;u {\n bus.emit('entity-update', entity)\n}\n\nbus.onEntity = (callback) => {\n bus.on('entity-update', callback)\n}\n\nbus.publishNotification = (notification) => {\n bus.emit('notification-create', notification)\n}\n\nbus.onNotification = (callback) => {\n bus.on('notification-create', callback)\n}\n\nexport { bus }\n","\n\n\n\n\n\n","\n\n\n\n","\n\n\n\n","import { render } from \"./Notification.vue?vue&type=template&id=7646705e&scoped=true\"\nimport script from \"./Notification.vue?vue&type=script&lang=js\"\nexport * from \"./Notification.vue?vue&type=script&lang=js\"\n\nimport \"./Notification.vue?vue&type=style&index=0&id=7646705e&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7646705e\"]])\n\nexport default __exports__","import { render } from \"./Notifications.vue?vue&type=template&id=6dc8bebc&scoped=true\"\nimport script from \"./Notifications.vue?vue&type=script&lang=js\"\nexport * from \"./Notifications.vue?vue&type=script&lang=js\"\n\nimport \"./Notifications.vue?vue&type=style&index=0&id=6dc8bebc&scoped=true&lang=css\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6dc8bebc\"]])\n\nexport default __exports__","\n\n\n","import { render } from \"./Events.vue?vue&type=template&id=6a0e6afd\"\nimport script from \"./Events.vue?vue&type=script&lang=js\"\nexport * from \"./Events.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n\n\n","import { render } from \"./VoiceAssistant.vue?vue&type=template&id=3f009270\"\nimport script from \"./VoiceAssistant.vue?vue&type=script&lang=js\"\nexport * from \"./VoiceAssistant.vue?vue&type=script&lang=js\"\n\nimport \"./VoiceAssistant.vue?vue&type=style&index=0&id=3f009270&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n","import { render } from \"./Ntfy.vue?vue&type=template&id=1c4a4708\"\nimport script from \"./Ntfy.vue?vue&type=script&lang=js\"\nexport * from \"./Ntfy.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n","import { render } from \"./Pushbullet.vue?vue&type=template&id=bf9869d4\"\nimport script from \"./Pushbullet.vue?vue&type=script&lang=js\"\nexport * from \"./Pushbullet.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./App.vue?vue&type=template&id=b2717a78\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=b2717a78&lang=scss\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n\n\n\n\n","\n\n\n\n\n","import { render } from \"./Row.vue?vue&type=template&id=1b4663f2&scoped=true\"\nimport script from \"./Row.vue?vue&type=script&lang=js\"\nexport * from \"./Row.vue?vue&type=script&lang=js\"\n\nimport \"./Row.vue?vue&type=style&index=0&id=1b4663f2&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1b4663f2\"]])\n\nexport default __exports__","\n\n\n\n\n","import { render } from \"./Widget.vue?vue&type=template&id=5df52982&scoped=true\"\nimport script from \"./Widget.vue?vue&type=script&lang=js\"\nexport * from \"./Widget.vue?vue&type=script&lang=js\"\n\nimport \"./Widget.vue?vue&type=style&index=0&id=5df52982&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5df52982\"]])\n\nexport default __exports__","import { render } from \"./Dashboard.vue?vue&type=template&id=54e0248a&scoped=true\"\nimport script from \"./Dashboard.vue?vue&type=script&lang=js\"\nexport * from \"./Dashboard.vue?vue&type=script&lang=js\"\n\nimport \"./Dashboard.vue?vue&type=style&index=0&id=54e0248a&lang=scss&scoped=true\"\nimport \"./Dashboard.vue?vue&type=style&index=1&id=54e0248a&lang=css\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-54e0248a\"]])\n\nexport default __exports__","\n\n\n\n","import { render } from \"./NotFound.vue?vue&type=template&id=49501f4d\"\nimport script from \"./NotFound.vue?vue&type=script&lang=js\"\nexport * from \"./NotFound.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n\n\n","import { render } from \"./Login.vue?vue&type=template&id=af0b14d0&scoped=true\"\nimport script from \"./Login.vue?vue&type=script&lang=js\"\nexport * from \"./Login.vue?vue&type=script&lang=js\"\n\nimport \"./Login.vue?vue&type=style&index=0&id=af0b14d0&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-af0b14d0\"]])\n\nexport default __exports__","\n\n\n","import { render } from \"./Register.vue?vue&type=template&id=1244b238\"\nimport script from \"./Register.vue?vue&type=script&lang=js\"\nexport * from \"./Register.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\n\n\n\n\n\n\n","\n\n\n\n\n\n","import { render } from \"./Nav.vue?vue&type=template&id=6d8984d5&scoped=true\"\nimport script from \"./Nav.vue?vue&type=script&lang=js\"\nexport * from \"./Nav.vue?vue&type=script&lang=js\"\n\nimport \"./Nav.vue?vue&type=style&index=0&id=6d8984d5&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6d8984d5\"]])\n\nexport default __exports__","import { render } from \"./Panel.vue?vue&type=template&id=fbc09254&scoped=true\"\nimport script from \"./Panel.vue?vue&type=script&lang=js\"\nexport * from \"./Panel.vue?vue&type=script&lang=js\"\n\nimport \"./Panel.vue?vue&type=style&index=0&id=fbc09254&lang=scss&scoped=true\"\nimport \"./Panel.vue?vue&type=style&index=1&id=fbc09254&lang=css\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-fbc09254\"]])\n\nexport default __exports__","\n\n\n\n\n\n\n","import { render } from \"./Plugin.vue?vue&type=template&id=e339182c&scoped=true\"\nimport script from \"./Plugin.vue?vue&type=script&lang=js\"\nexport * from \"./Plugin.vue?vue&type=script&lang=js\"\n\nimport \"./Plugin.vue?vue&type=style&index=0&id=e339182c&lang=scss&scoped=true\"\nimport \"./Plugin.vue?vue&type=style&index=1&id=e339182c&lang=css\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-e339182c\"]])\n\nexport default __exports__","import { createWebHistory, createRouter } from \"vue-router\";\nimport Dashboard from \"@/views/Dashboard.vue\";\nimport NotFound from \"@/views/NotFound\";\nimport Login from \"@/views/Login\";\nimport Register from \"@/views/Register\";\nimport Panel from \"@/views/Panel\";\nimport Plugin from \"@/views/Plugin\";\n\nconst routes = [\n {\n path: \"/\",\n name: \"Panel\",\n component: Panel,\n },\n\n {\n path: \"/dashboard/:name\",\n name: \"Dashboard\",\n component: Dashboard,\n },\n\n {\n path: \"/plugin/:plugin\",\n name: \"Plugin\",\n component: Plugin,\n },\n\n {\n path: \"/login\",\n name: \"Login\",\n component: Login,\n },\n\n {\n path: \"/register\",\n name: \"Register\",\n component: Register,\n },\n\n {\n path: \"/:catchAll(.*)\",\n component: NotFound,\n },\n];\n\nconst router = createRouter({\n history: createWebHistory(),\n routes,\n});\n\nexport default router;\n","/* eslint-disable no-console */\n\nimport { register } from 'register-service-worker'\n\nif (process.env.NODE_ENV === 'production') {\n register(`${process.env.BASE_URL}service-worker.js`, {\n ready () {\n console.log(\n 'App is being served from cache by a service worker.\\n' +\n 'For more details, visit https://goo.gl/AFskqB'\n )\n },\n registered () {\n console.log('Service worker has been registered.')\n },\n cached () {\n console.log('Content has been cached for offline use.')\n },\n updatefound () {\n console.log('New content is downloading.')\n },\n updated () {\n console.log('New content is available; please refresh.')\n },\n offline () {\n console.log('No internet connection found. App is running in offline mode.')\n },\n error (error) {\n console.error('Error during service worker registration:', error)\n }\n })\n}\n","import { createApp } from 'vue'\nimport App from '@/App.vue'\nimport router from '@/router'\nimport './registerServiceWorker'\n\nconst app = createApp(App)\napp.config.globalProperties._config = window.config\napp.use(router).mount('#app')\n","\n\n","import script from \"./Api.vue?vue&type=script&lang=js\"\nexport * from \"./Api.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n","import script from \"./Cookies.vue?vue&type=script&lang=js\"\nexport * from \"./Cookies.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n","import script from \"./DateTime.vue?vue&type=script&lang=js\"\nexport * from \"./DateTime.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n","import script from \"./Events.vue?vue&type=script&lang=js\"\nexport * from \"./Events.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n","import script from \"./Notification.vue?vue&type=script&lang=js\"\nexport * from \"./Notification.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n","import script from \"./Screen.vue?vue&type=script&lang=js\"\nexport * from \"./Screen.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n","import script from \"./Text.vue?vue&type=script&lang=js\"\nexport * from \"./Text.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n","import script from \"./Types.vue?vue&type=script&lang=js\"\nexport * from \"./Types.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n","import script from \"./Utils.vue?vue&type=script&lang=js\"\nexport * from \"./Utils.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n\n","import { render } from \"./Loading.vue?vue&type=template&id=4d9c871b&scoped=true\"\nconst script = {}\n\nimport \"./Loading.vue?vue&type=style&index=0&id=4d9c871b&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4d9c871b\"]])\n\nexport default __exports__","\n\n\n\n\n","import { render } from \"./Modal.vue?vue&type=template&id=18f9fdba&scoped=true\"\nimport script from \"./Modal.vue?vue&type=script&lang=js\"\nexport * from \"./Modal.vue?vue&type=script&lang=js\"\n\nimport \"./Modal.vue?vue&type=style&index=0&id=18f9fdba&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-18f9fdba\"]])\n\nexport default __exports__","\n\n\n\n\n","import { render } from \"./ConfirmDialog.vue?vue&type=template&id=dda41b94&scoped=true\"\nimport script from \"./ConfirmDialog.vue?vue&type=script&lang=js\"\nexport * from \"./ConfirmDialog.vue?vue&type=script&lang=js\"\n\nimport \"./ConfirmDialog.vue?vue&type=style&index=0&id=dda41b94&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-dda41b94\"]])\n\nexport default __exports__","\n\n\n\n\n","import { render } from \"./Dropdown.vue?vue&type=template&id=5b964c03&scoped=true\"\nimport script from \"./Dropdown.vue?vue&type=script&lang=js\"\nexport * from \"./Dropdown.vue?vue&type=script&lang=js\"\n\nimport \"./Dropdown.vue?vue&type=style&index=0&id=5b964c03&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5b964c03\"]])\n\nexport default __exports__","\n\n\n\n\n","import { render } from \"./DropdownItem.vue?vue&type=template&id=282d16b4&scoped=true\"\nimport script from \"./DropdownItem.vue?vue&type=script&lang=js\"\nexport * from \"./DropdownItem.vue?vue&type=script&lang=js\"\n\nimport \"./DropdownItem.vue?vue&type=style&index=0&id=282d16b4&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-282d16b4\"]])\n\nexport default __exports__","\n\n\n\n\n","import { render } from \"./Icon.vue?vue&type=template&id=706a3bd1&scoped=true\"\nimport script from \"./Icon.vue?vue&type=script&lang=js\"\nexport * from \"./Icon.vue?vue&type=script&lang=js\"\n\nimport \"./Icon.vue?vue&type=style&index=0&id=706a3bd1&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-706a3bd1\"]])\n\nexport default __exports__","\n\n\n\n\n","